{"version":3,"sources":["../src/plugins/prism-languages/tsx.ts","../src/plugins/prism-languages/json5.ts","../src/plugins/prism-languages/scala.ts","../src/plugins/prism-languages/cpp.ts","../src/plugins/prism-languages/php.ts","../src/index.ts","../src/detect.ts","../src/dom.ts","../src/messages.ts","../src/sandbox-compat.ts","../src/plugins/fallback.ts","../src/viewer.ts","../src/support.ts","../src/plugins/utils.ts","../src/plugins/image.ts","../src/plugins/video.ts","../src/plugins/audio.ts","../src/plugins/lrc.ts","../src/plugins/text.ts","../src/plugins/encrypted.ts","../src/plugins/pdf.ts","../src/plugins/epub.ts","../src/plugins/xps.ts","../src/plugins/office.ts","../src/plugins/msdoc.ts","../src/plugins/msppt.ts","../src/plugins/ofd.ts","../src/plugins/archive.ts","../src/plugins/email.ts","../src/plugins/drawing.ts","../src/plugins/xmind.ts","../src/plugins/cad.ts","../src/plugins/cad-dwg.ts","../src/plugins/cad-webgl.ts","../src/plugins/oasis-binary.ts","../src/plugins/model3d.ts","../src/plugins/gis.ts","../src/plugins/asset.ts"],"sourcesContent":["import \"prismjs/components/prism-jsx\";\nimport \"prismjs/components/prism-typescript\";\nimport \"prismjs/components/prism-tsx\";\n","import \"prismjs/components/prism-json\";\nimport \"prismjs/components/prism-json5\";\n","import \"prismjs/components/prism-java\";\nimport \"prismjs/components/prism-scala\";\n","import \"prismjs/components/prism-c\";\nimport \"prismjs/components/prism-cpp\";\n","import \"prismjs/components/prism-markup-templating\";\nimport \"prismjs/components/prism-php\";\n","export { createViewer } from \"./viewer\";\nexport { isPreviewSupported } from \"./support\";\nexport type { PreviewSupportOptions } from \"./support\";\nexport { imagePlugin } from \"./plugins/image\";\nexport { videoPlugin } from \"./plugins/video\";\nexport type { VideoPluginOptions } from \"./plugins/video\";\nexport { audioPlugin } from \"./plugins/audio\";\nexport { textPlugin } from \"./plugins/text\";\nexport { pdfPlugin } from \"./plugins/pdf\";\nexport type { PdfPluginOptions, PdfWebFallbackScripts } from \"./plugins/pdf\";\nexport { epubPlugin } from \"./plugins/epub\";\nexport { xpsPlugin } from \"./plugins/xps\";\nexport { officePlugin } from \"./plugins/office\";\nexport type { OfficeConversionContext, OfficeConversionResult, OfficePluginOptions } from \"./plugins/office\";\nexport { ofdPlugin } from \"./plugins/ofd\";\nexport { archivePlugin } from \"./plugins/archive\";\nexport { emailPlugin } from \"./plugins/email\";\nexport { drawingPlugin } from \"./plugins/drawing\";\nexport { xmindPlugin } from \"./plugins/xmind\";\nexport { cadPlugin } from \"./plugins/cad\";\nexport type { CadBinaryPreviewContext, CadPluginOptions } from \"./plugins/cad\";\nexport type { LibreDwgPreviewOptions } from \"./plugins/cad-dwg\";\nexport type { WebglDwgEngineLoader, WebglDwgPreviewOptions } from \"./plugins/cad-webgl\";\nexport { model3dPlugin } from \"./plugins/model3d\";\nexport { gisPlugin } from \"./plugins/gis\";\nexport { assetPlugin } from \"./plugins/asset\";\nexport { fallbackPlugin } from \"./plugins/fallback\";\nexport type {\n  FileViewer,\n  PreviewCommand,\n  PreviewContext,\n  PreviewFallback,\n  PreviewFile,\n  PreviewFit,\n  PreviewInstance,\n  PreviewItem,\n  PreviewLocale,\n  PreviewMessages,\n  PreviewOptions,\n  PreviewPlugin,\n  PreviewSize,\n  PreviewSource,\n  PreviewTheme,\n  PreviewToolbarActionId,\n  PreviewToolbarBuiltInAction,\n  PreviewToolbarCustomAction,\n  PreviewToolbarOptions,\n  PreviewToolbarRenderContext\n} from \"./types\";\n","import type { PreviewFile, PreviewSource } from \"./types\";\n\nconst extensionMimeMap: Record<string, string> = {\n  jpg: \"image/jpeg\",\n  jpeg: \"image/jpeg\",\n  jfif: \"image/jpeg\",\n  pjpe: \"image/pjpeg\",\n  pjpeg: \"image/pjpeg\",\n  png: \"image/png\",\n  gif: \"image/gif\",\n  webp: \"image/webp\",\n  avif: \"image/avif\",\n  jxl: \"image/jxl\",\n  svg: \"image/svg+xml\",\n  bmp: \"image/bmp\",\n  ico: \"image/x-icon\",\n  cur: \"image/x-icon\",\n  tif: \"image/tiff\",\n  tiff: \"image/tiff\",\n  apng: \"image/apng\",\n  heic: \"image/heic\",\n  heif: \"image/heif\",\n  mp4: \"video/mp4\",\n  mpg: \"video/mpeg\",\n  mpeg: \"video/mpeg\",\n  mpe: \"video/mpeg\",\n  mpv: \"video/mpv\",\n  webm: \"video/webm\",\n  ogg: \"audio/ogg\",\n  ogv: \"video/ogg\",\n  mov: \"video/quicktime\",\n  m4v: \"video/x-m4v\",\n  avi: \"video/x-msvideo\",\n  mkv: \"video/x-matroska\",\n  flv: \"video/x-flv\",\n  wmv: \"video/x-ms-wmv\",\n  \"3gp\": \"video/3gpp\",\n  \"3g2\": \"video/3gpp2\",\n  m2ts: \"video/mp2t\",\n  m3u8: \"application/vnd.apple.mpegurl\",\n  mp3: \"audio/mpeg\",\n  wav: \"audio/wav\",\n  aif: \"audio/aiff\",\n  aiff: \"audio/aiff\",\n  aifc: \"audio/aiff\",\n  aac: \"audio/aac\",\n  m4a: \"audio/mp4\",\n  flac: \"audio/flac\",\n  opus: \"audio/opus\",\n  oga: \"audio/ogg\",\n  weba: \"audio/webm\",\n  amr: \"audio/amr\",\n  mid: \"audio/midi\",\n  midi: \"audio/midi\",\n  caf: \"audio/x-caf\",\n  au: \"audio/basic\",\n  snd: \"audio/basic\",\n  wma: \"audio/x-ms-wma\",\n  pdf: \"application/pdf\",\n  epub: \"application/epub+zip\",\n  xps: \"application/vnd.ms-xpsdocument\",\n  oxps: \"application/oxps\",\n  txt: \"text/plain\",\n  lrc: \"text/plain\",\n  log: \"text/plain\",\n  env: \"text/plain\",\n  gitignore: \"text/plain\",\n  dockerignore: \"text/plain\",\n  npmrc: \"text/plain\",\n  yarnrc: \"text/plain\",\n  pnpmrc: \"text/plain\",\n  editorconfig: \"text/plain\",\n  browserslistrc: \"text/plain\",\n  prettierrc: \"application/json\",\n  eslintrc: \"application/json\",\n  stylelintrc: \"application/json\",\n  conf: \"text/plain\",\n  config: \"text/plain\",\n  properties: \"text/plain\",\n  lock: \"text/plain\",\n  json: \"application/json\",\n  jsonc: \"application/json\",\n  json5: \"application/json5\",\n  ipynb: \"application/x-ipynb+json\",\n  jsonl: \"application/x-ndjson\",\n  ndjson: \"application/x-ndjson\",\n  xml: \"application/xml\",\n  yaml: \"text/yaml\",\n  yml: \"text/yaml\",\n  csv: \"text/csv\",\n  tsv: \"text/tab-separated-values\",\n  md: \"text/markdown\",\n  markdown: \"text/markdown\",\n  mmd: \"text/vnd.mermaid\",\n  mermaid: \"text/vnd.mermaid\",\n  toml: \"application/toml\",\n  ini: \"text/plain\",\n  proto: \"text/x-protobuf\",\n  tf: \"text/x-hcl\",\n  tfvars: \"text/x-hcl\",\n  hcl: \"text/x-hcl\",\n  tex: \"application/x-tex\",\n  latex: \"application/x-tex\",\n  bib: \"text/x-bibtex\",\n  gv: \"text/vnd.graphviz\",\n  http: \"message/http\",\n  css: \"text/css\",\n  scss: \"text/css\",\n  less: \"text/css\",\n  js: \"text/javascript\",\n  mjs: \"text/javascript\",\n  cjs: \"text/javascript\",\n  ts: \"text/typescript\",\n  tsx: \"text/typescript\",\n  jsx: \"text/javascript\",\n  htm: \"text/html\",\n  html: \"text/html\",\n  vue: \"text/plain\",\n  py: \"text/x-python\",\n  java: \"text/x-java-source\",\n  go: \"text/x-go\",\n  rs: \"text/rust\",\n  rb: \"text/x-ruby\",\n  swift: \"text/x-swift\",\n  kt: \"text/x-kotlin\",\n  kts: \"text/x-kotlin\",\n  scala: \"text/x-scala\",\n  lua: \"text/x-lua\",\n  r: \"text/x-r\",\n  dart: \"text/x-dart\",\n  svelte: \"text/plain\",\n  astro: \"text/plain\",\n  elm: \"text/x-elm\",\n  ex: \"text/x-elixir\",\n  exs: \"text/x-elixir\",\n  clj: \"text/x-clojure\",\n  cljs: \"text/x-clojure\",\n  erl: \"text/x-erlang\",\n  hrl: \"text/x-erlang\",\n  fs: \"text/x-fsharp\",\n  fsx: \"text/x-fsharp\",\n  hs: \"text/x-haskell\",\n  lhs: \"text/x-haskell\",\n  php: \"application/x-httpd-php\",\n  c: \"text/x-c\",\n  cpp: \"text/x-c++src\",\n  h: \"text/x-c\",\n  hpp: \"text/x-c++hdr\",\n  cs: \"text/x-csharp\",\n  sql: \"application/sql\",\n  sh: \"application/x-sh\",\n  bash: \"application/x-sh\",\n  zsh: \"application/x-sh\",\n  fish: \"application/x-sh\",\n  ps1: \"text/plain\",\n  bat: \"text/plain\",\n  cmd: \"text/plain\",\n  dockerfile: \"text/plain\",\n  nginxconf: \"text/plain\",\n  gradle: \"text/plain\",\n  graphql: \"application/graphql\",\n  gql: \"application/graphql\",\n  pem: \"application/x-pem-file\",\n  crt: \"application/x-x509-ca-cert\",\n  cer: \"application/pkix-cert\",\n  ics: \"text/calendar\",\n  vcf: \"text/vcard\",\n  diff: \"text/x-diff\",\n  patch: \"text/x-diff\",\n  geojson: \"application/geo+json\",\n  topojson: \"application/topo+json\",\n  kml: \"application/vnd.google-earth.kml+xml\",\n  kmz: \"application/vnd.google-earth.kmz\",\n  gpx: \"application/gpx+xml\",\n  shp: \"application/octet-stream\",\n  drawio: \"application/vnd.jgraph.mxfile\",\n  dio: \"application/vnd.jgraph.mxfile\",\n  xmind: \"application/vnd.xmind.workbook\",\n  excalidraw: \"application/vnd.excalidraw+json\",\n  tldraw: \"application/json\",\n  zip: \"application/zip\",\n  rar: \"application/vnd.rar\",\n  \"7z\": \"application/x-7z-compressed\",\n  tar: \"application/x-tar\",\n  gz: \"application/gzip\",\n  tgz: \"application/gzip\",\n  bz2: \"application/x-bzip2\",\n  xz: \"application/x-xz\",\n  docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n  docm: \"application/vnd.ms-word.document.macroenabled.12\",\n  dotx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\",\n  dotm: \"application/vnd.ms-word.template.macroenabled.12\",\n  dot: \"application/msword\",\n  doc: \"application/msword\",\n  rtf: \"application/rtf\",\n  odt: \"application/vnd.oasis.opendocument.text\",\n  fodt: \"application/vnd.oasis.opendocument.text-flat-xml\",\n  wps: \"application/vnd.ms-works\",\n  xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n  xltx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\",\n  xls: \"application/vnd.ms-excel\",\n  xlt: \"application/vnd.ms-excel\",\n  xlsm: \"application/vnd.ms-excel.sheet.macroenabled.12\",\n  xltm: \"application/vnd.ms-excel.template.macroenabled.12\",\n  xlsb: \"application/vnd.ms-excel.sheet.binary.macroenabled.12\",\n  ods: \"application/vnd.oasis.opendocument.spreadsheet\",\n  fods: \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\",\n  numbers: \"application/vnd.apple.numbers\",\n  et: \"application/vnd.ms-excel\",\n  pptx: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n  pptm: \"application/vnd.ms-powerpoint.presentation.macroenabled.12\",\n  ppsx: \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\",\n  ppsm: \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\",\n  potx: \"application/vnd.openxmlformats-officedocument.presentationml.template\",\n  potm: \"application/vnd.ms-powerpoint.template.macroenabled.12\",\n  ppt: \"application/vnd.ms-powerpoint\",\n  pps: \"application/vnd.ms-powerpoint\",\n  odp: \"application/vnd.oasis.opendocument.presentation\",\n  fodp: \"application/vnd.oasis.opendocument.presentation-flat-xml\",\n  key: \"application/vnd.apple.keynote\",\n  dps: \"application/vnd.ms-powerpoint\",\n  eml: \"message/rfc822\",\n  msg: \"application/vnd.ms-outlook\",\n  mbox: \"application/mbox\",\n  ofd: \"application/ofd\",\n  gltf: \"model/gltf+json\",\n  glb: \"model/gltf-binary\",\n  stl: \"model/stl\",\n  obj: \"model/obj\",\n  \"3ds\": \"model/3ds\",\n  fbx: \"application/vnd.autodesk.fbx\",\n  dae: \"model/vnd.collada+xml\",\n  ply: \"application/ply\",\n  \"3mf\": \"model/3mf\",\n  usdz: \"model/vnd.usdz+zip\",\n  usdc: \"model/vnd.usd\",\n  usda: \"model/vnd.usd\",\n  usd: \"model/vnd.usd\",\n  wrl: \"model/vrml\",\n  vrml: \"model/vrml\",\n  dxf: \"image/vnd.dxf\",\n  dwg: \"application/acad\",\n  dwf: \"model/vnd.dwf\",\n  step: \"model/step\",\n  stp: \"model/step\",\n  iges: \"application/iges\",\n  igs: \"application/iges\",\n  ifc: \"application/x-step\",\n  sat: \"application/sat\",\n  sab: \"application/sab\",\n  \"x_t\": \"application/x-parasolid\",\n  \"x_b\": \"application/x-parasolid\",\n  \"3dm\": \"model/vnd.3dm\",\n  skp: \"application/vnd.sketchup.skp\",\n  sldprt: \"application/sldworks\",\n  sldasm: \"application/sldworks\",\n  gds: \"application/vnd.gds\",\n  gdsii: \"application/x-gdsii\",\n  oas: \"application/vnd.oasis.layout\",\n  oasis: \"application/vnd.oasis.layout\",\n  ttf: \"font/ttf\",\n  otf: \"font/otf\",\n  woff: \"font/woff\",\n  woff2: \"font/woff2\",\n  eot: \"application/vnd.ms-fontobject\",\n  psd: \"image/vnd.adobe.photoshop\",\n  psb: \"image/vnd.adobe.photoshop\",\n  ai: \"application/postscript\",\n  eps: \"application/postscript\",\n  ps: \"application/postscript\",\n  webarchive: \"application/x-webarchive\",\n  sqlite: \"application/vnd.sqlite3\",\n  sqlite3: \"application/vnd.sqlite3\",\n  db: \"application/vnd.sqlite3\",\n  wasm: \"application/wasm\",\n  parquet: \"application/vnd.apache.parquet\",\n  avro: \"application/avro\"\n};\n\nexport async function normalizeFile(\n  source: PreviewSource,\n  fileName?: string,\n  mimeType?: string\n): Promise<PreviewFile> {\n  if (typeof source === \"string\") {\n    const name = fileName || getFileNameFromUrl(source) || \"remote-file\";\n    const extension = getExtension(name);\n    return {\n      source,\n      name,\n      extension,\n      mimeType: mimeType || extensionMimeMap[extension] || \"\",\n      url: source\n    };\n  }\n\n  if (source instanceof File) {\n    const extension = getExtension(fileName || source.name);\n    return {\n      source,\n      name: fileName || source.name,\n      extension,\n      mimeType: mimeType || source.type || extensionMimeMap[extension] || \"\",\n      size: source.size,\n      blob: source\n    };\n  }\n\n  if (source instanceof Blob) {\n    const name = fileName || \"blob\";\n    const extension = getExtension(name);\n    return {\n      source,\n      name,\n      extension,\n      mimeType: mimeType || source.type || extensionMimeMap[extension] || \"\",\n      size: source.size,\n      blob: source\n    };\n  }\n\n  const name = fileName || \"buffer\";\n  const extension = getExtension(name);\n  const blob = new Blob([source], { type: mimeType || extensionMimeMap[extension] || \"\" });\n  return {\n    source,\n    name,\n    extension,\n    mimeType: blob.type,\n    size: blob.size,\n    blob\n  };\n}\n\nfunction getFileNameFromUrl(source: string): string {\n  const rawName = source.split(/[?#]/, 1)[0]?.split(\"/\").filter(Boolean).pop() || \"\";\n  if (!rawName) {\n    return \"\";\n  }\n\n  try {\n    return decodeURIComponent(rawName);\n  } catch {\n    return rawName;\n  }\n}\n\nexport function getExtension(name: string): string {\n  const clean = name.split(\"?\")[0]?.split(\"#\")[0] || \"\";\n  const index = clean.lastIndexOf(\".\");\n  return index >= 0 ? clean.slice(index + 1).split(\"!\", 1)[0].toLowerCase() : \"\";\n}\n\nexport function isTextLike(file: PreviewFile): boolean {\n  const textFileName = normalizeFileName(file.name);\n  const textFileStem = textFileName.split(\".\")[0];\n  return (\n    file.mimeType.startsWith(\"text/\") ||\n    [\n      \"application/json\",\n      \"application/json5\",\n      \"application/x-ipynb+json\",\n      \"application/xml\",\n      \"application/yaml\",\n      \"application/x-yaml\",\n      \"application/sql\",\n      \"application/x-sh\",\n      \"application/x-httpd-php\",\n      \"application/javascript\",\n      \"application/x-javascript\",\n      \"application/typescript\",\n      \"application/x-typescript\",\n      \"application/toml\",\n      \"application/x-toml\",\n      \"application/x-ndjson\",\n      \"application/graphql\",\n      \"application/x-pem-file\",\n      \"application/x-x509-ca-cert\",\n      \"application/pkix-cert\",\n      \"application/x-tex\",\n      \"application/lrc\",\n      \"application/x-lrc\",\n      \"message/http\",\n      \"text/calendar\",\n      \"text/vcard\",\n      \"text/x-bibtex\",\n      \"text/x-hcl\",\n      \"text/x-protobuf\",\n      \"text/vnd.graphviz\"\n    ].includes(file.mimeType) ||\n    [\n      \"txt\",\n      \"lrc\",\n      \"json\",\n      \"jsonc\",\n      \"json5\",\n      \"ipynb\",\n      \"jsonl\",\n      \"ndjson\",\n      \"xml\",\n      \"yaml\",\n      \"yml\",\n      \"csv\",\n      \"log\",\n      \"env\",\n      \"gitignore\",\n      \"dockerignore\",\n      \"npmrc\",\n      \"yarnrc\",\n      \"pnpmrc\",\n      \"editorconfig\",\n      \"browserslistrc\",\n      \"prettierrc\",\n      \"eslintrc\",\n      \"stylelintrc\",\n      \"conf\",\n      \"config\",\n      \"properties\",\n      \"lock\",\n      \"md\",\n      \"markdown\",\n      \"mmd\",\n      \"mermaid\",\n      \"js\",\n      \"mjs\",\n      \"cjs\",\n      \"ts\",\n      \"tsx\",\n      \"jsx\",\n      \"vue\",\n      \"css\",\n      \"scss\",\n      \"less\",\n      \"html\",\n      \"htm\",\n      \"toml\",\n      \"ini\",\n      \"proto\",\n      \"tf\",\n      \"tfvars\",\n      \"hcl\",\n      \"tex\",\n      \"latex\",\n      \"bib\",\n      \"gv\",\n      \"http\",\n      \"java\",\n      \"py\",\n      \"go\",\n      \"rs\",\n      \"rb\",\n      \"swift\",\n      \"kt\",\n      \"kts\",\n      \"scala\",\n      \"lua\",\n      \"r\",\n      \"dart\",\n      \"svelte\",\n      \"astro\",\n      \"elm\",\n      \"ex\",\n      \"exs\",\n      \"clj\",\n      \"cljs\",\n      \"erl\",\n      \"hrl\",\n      \"fs\",\n      \"fsx\",\n      \"hs\",\n      \"lhs\",\n      \"php\",\n      \"c\",\n      \"cpp\",\n      \"h\",\n      \"hpp\",\n      \"cs\",\n      \"sql\",\n      \"sh\",\n      \"bash\",\n      \"zsh\",\n      \"fish\",\n      \"ps1\",\n      \"bat\",\n      \"cmd\",\n      \"dockerfile\",\n      \"nginxconf\",\n      \"gradle\",\n      \"graphql\",\n      \"gql\",\n      \"pem\",\n      \"crt\",\n      \"cer\",\n      \"ics\",\n      \"vcf\",\n      \"diff\",\n      \"patch\"\n    ].includes(file.extension) ||\n    [\n      \"dockerfile\",\n      \"makefile\",\n      \"rakefile\",\n      \"gemfile\",\n      \"procfile\",\n      \"jenkinsfile\",\n      \"vagrantfile\",\n      \"brewfile\",\n      \"podfile\",\n      \"go.mod\",\n      \"go.sum\",\n      \"cargo.toml\",\n      \"cargo.lock\",\n      \".gitignore\",\n      \".dockerignore\",\n      \".npmrc\",\n      \".yarnrc\",\n      \".pnpmrc\",\n      \".editorconfig\",\n      \".browserslistrc\",\n      \".prettierrc\",\n      \".eslintrc\",\n      \".stylelintrc\"\n    ].includes(textFileName) ||\n    [\n      \"readme\",\n      \"changelog\",\n      \"changes\",\n      \"history\",\n      \"license\",\n      \"licence\",\n      \"copying\",\n      \"notice\",\n      \"authors\",\n      \"contributors\",\n      \"codeowners\"\n    ].includes(textFileStem)\n  );\n}\n\nfunction normalizeFileName(name: string): string {\n  const baseName = name.split(/[\\\\/]/).pop() || name;\n  return baseName.toLowerCase();\n}\n","import type { PreviewSize } from \"./types\";\n\nexport function resolveContainer(container: HTMLElement | string): HTMLElement {\n  if (typeof container !== \"string\") {\n    return container;\n  }\n\n  const element = document.querySelector<HTMLElement>(container);\n  if (!element) {\n    throw new Error(`File viewer container not found: ${container}`);\n  }\n  return element;\n}\n\nexport function applyBoxSize(\n  element: HTMLElement,\n  width?: number | string,\n  height?: number | string\n): void {\n  if (width !== undefined) {\n    element.style.width = typeof width === \"number\" ? `${width}px` : width;\n  }\n  if (height !== undefined) {\n    element.style.height = typeof height === \"number\" ? `${height}px` : height;\n  }\n}\n\nexport function getElementSize(element: HTMLElement): PreviewSize {\n  const rect = element.getBoundingClientRect();\n  return {\n    width: Math.max(0, Math.round(rect.width)),\n    height: Math.max(0, Math.round(rect.height))\n  };\n}\n\nexport function createObjectUrl(file: { url?: string; blob?: Blob }): string {\n  if (file.url) {\n    return file.url;\n  }\n  if (!file.blob) {\n    throw new Error(\"File source cannot be converted to an object URL.\");\n  }\n  return URL.createObjectURL(file.blob);\n}\n\nexport function revokeObjectUrl(url: string, isExternal: boolean): void {\n  if (!isExternal) {\n    URL.revokeObjectURL(url);\n  }\n}\n","import type { PreviewLocale, PreviewMessages, PreviewOptions } from \"./types\";\n\nexport const defaultMessages: Record<PreviewLocale, PreviewMessages> = {\n  \"zh-CN\": {\n    loading: \"正在加载预览...\",\n    unsupportedTitle: \"当前文件暂不支持在线预览\",\n    downloadTitle: \"当前文件可下载后查看\",\n    downloadFile: \"下载文件\",\n    file: \"文件\",\n    unnamedFile: \"未命名文件\",\n    format: \"格式\",\n    unknown: \"未知\",\n    mime: \"MIME\",\n    undeclared: \"未声明\",\n    size: \"大小\",\n    source: \"来源\",\n    remoteUrl: \"远程 URL\",\n    localFile: \"本地/内存文件\",\n    textPlainLanguage: \"纯文本\",\n    textLineCount: \"{count} 行\",\n    textWrap: \"换行\",\n    textCopy: \"复制\",\n    textCopied: \"已复制\",\n    textCopyFailed: \"复制失败\",\n    textDownload: \"下载\",\n    textDownloadReady: \"下载已准备\",\n    textLargeFileNotice: \"文件较大，当前展示前 {size}，复制和下载仍会使用完整内容。\",\n    textHighlightSkipped: \"内容较大，已跳过语法高亮以保持滚动流畅。\",\n    textPreviewFailedTitle: \"文本预览失败\",\n    textPreviewFailedMessage: \"无法读取该文本内容，可能是远程文件不可访问或响应状态异常。\",\n    textOpenOriginal: \"打开原文件\",\n    lrcPreviewMode: \"LRC 预览模式\",\n    lrcDisplayMode: \"展示模式\",\n    lrcAnnotatedMode: \"美观模式\",\n    lrcSourceMode: \"源码模式\",\n    lrcWordTimestamp: \"逐字时间\",\n    lrcMale: \"男声\",\n    lrcFemale: \"女声\",\n    lrcDuet: \"合唱\",\n    lrcAuthor: \"词曲\",\n    lrcLyricist: \"作词\",\n    lrcLrcBy: \"歌词制作\",\n    lrcAlbum: \"专辑\",\n    lrcLength: \"时长\",\n    lrcOffset: \"时间偏移\",\n    lrcTool: \"制作工具\",\n    lrcVersion: \"版本\",\n    lrcTrackInformation: \"音乐作品信息\",\n    lrcEmpty: \"没有可展示的歌词内容。\",\n    officeLegacyConversionTitle: \"Office 转换提示\",\n    officeLegacyBinaryNotice:\n      \"属于旧版 Microsoft Office 二进制格式，浏览器内无法高保真解析；当前仅展示可信文本片段和结构指纹，完整排版建议接入 LibreOffice/OnlyOffice 服务端转换为 PDF/HTML。\",\n    officeLegacyMetaFormatType: \"格式类型\",\n    officeLegacyMetaFileStructure: \"文件结构\",\n    officeLegacyOleDetected: \"检测到 OLE Compound File 签名\",\n    officeLegacyOleMissing: \"未检测到标准 OLE 签名，按原始二进制尝试提取\",\n    officeLegacyMetaTextFragments: \"文本片段\",\n    officeLegacyTextFragmentCount: \"{count} 段\",\n    officeLegacyMetaParseStatus: \"解析状态\",\n    officeLegacyReadableFragments: \"可读文本片段\",\n    officeLegacyNoText: \"未提取到稳定可读文本。该文件可能经过压缩、加密，或文本编码无法在浏览器端可靠识别；请使用服务端 LibreOffice/OnlyOffice 转换后预览。\",\n    officeLegacyWordParseFailed: \"Word 二进制解析失败：{message}\",\n    officeSheetParseFailed: \"表格解析失败：{message}\",\n    officeUnsupportedTitle: \"Office 基础预览\",\n    officeUnsupportedLegacyMessage:\n      \"该格式属于老二进制或专有格式，浏览器内无法可靠解析；建议接入 LibreOffice/OnlyOffice 服务端转换为 PDF/HTML 后预览。\",\n    officeUnsupportedGenericMessage: \"该格式通常需要服务端转换或专用解析器才能高保真预览。\",\n    officeUnsupportedIntro: \"已进入 Office 插件。{message}\",\n    officeUnsupportedSupportedFormats:\n      \"当前版本优先支持 docx、rtf、odt/fodt、xlsx/xls/csv/ods、pptx/ppsx、odp/fodp 的基础内容预览。\",\n    officeErrorWithMessage: \"解析器返回：{message}\",\n    officeErrorWithoutMessage: \"解析器未返回具体错误信息。\",\n    officeConvertedTitle: \"Office 高保真转换预览\",\n    officeConvertedPdfFailed: \"Office 转换后的 PDF 无法预览\",\n    pdfEncryptedTitle: \"PDF 已加密，无法在线预览\",\n    pdfEncryptedMessage: \"请下载后使用密码打开，或上传解密后的 PDF 文件。\",\n    pdfPreviewFailedTitle: \"PDF 预览失败\",\n    pdfCorruptedMessage: \"该 PDF 文件可能已损坏或格式无效。\",\n    pdfCannotLoadMessage: \"当前浏览器无法加载该 PDF。\",\n    pdfDownload: \"下载 PDF\",\n    pdfPageLoading: \"页面 {page} 加载中...\",\n    pdfPageEmpty: \"该页没有检测到可显示的 PDF 兼容内容。若这是 Illustrator/AI 文件，可能只包含私有编辑数据，建议导出为 PDF/SVG/PNG 后预览。\",\n    pdfPageRenderFailed: \"无法渲染该页面。该页可能包含浏览器 PDF 引擎暂不支持的图形、字体或压缩特性。\",\n    pdfPreviousPage: \"上一页\",\n    pdfNextPage: \"下一页\",\n    pdfPageInput: \"当前页码\",\n    pdfPagePosition: \"/ {total}\",\n    pdfPageLabel: \"第 {page} 页\",\n    pdfSummaryPages: \"页数\",\n    pdfSummaryPageSizes: \"页面尺寸\",\n    pdfSummaryFit: \"适配\",\n    pdfSummaryActualSize: \"原始大小\",\n    pdfSummaryFitWidth: \"适合宽度\",\n    pdfSummaryZoom: \"缩放\",\n    imagePreviewFailedTitle: \"图片预览失败\",\n    imagePreviewFailedMessage: \"当前浏览器无法直接显示该图片，文件可能已损坏或编码暂不受支持。\",\n    imageDownload: \"下载图片\",\n    imageZoomOut: \"缩小\",\n    imageZoomIn: \"放大\",\n    imageRotate: \"旋转图片\",\n    imageReset: \"重置图片视图\"\n  },\n  \"en-US\": {\n    loading: \"Loading preview...\",\n    unsupportedTitle: \"Preview is not available for this file\",\n    downloadTitle: \"This file can be downloaded and opened locally\",\n    downloadFile: \"Download file\",\n    file: \"File\",\n    unnamedFile: \"Untitled file\",\n    format: \"Format\",\n    unknown: \"Unknown\",\n    mime: \"MIME\",\n    undeclared: \"Not declared\",\n    size: \"Size\",\n    source: \"Source\",\n    remoteUrl: \"Remote URL\",\n    localFile: \"Local or in-memory file\",\n    textPlainLanguage: \"plain text\",\n    textLineCount: \"{count} lines\",\n    textWrap: \"Wrap\",\n    textCopy: \"Copy\",\n    textCopied: \"Copied\",\n    textCopyFailed: \"Copy failed\",\n    textDownload: \"Download\",\n    textDownloadReady: \"Download ready\",\n    textLargeFileNotice: \"Large file, showing the first {size}. Copy and download still use the full content.\",\n    textHighlightSkipped: \"Large content, syntax highlighting was skipped to keep scrolling smooth.\",\n    textPreviewFailedTitle: \"Text preview failed\",\n    textPreviewFailedMessage: \"Unable to read this text content. The remote file may be unreachable or returned an invalid response.\",\n    textOpenOriginal: \"Open original file\",\n    lrcPreviewMode: \"LRC preview mode\",\n    lrcDisplayMode: \"Lyrics mode\",\n    lrcAnnotatedMode: \"Annotated mode\",\n    lrcSourceMode: \"Source mode\",\n    lrcWordTimestamp: \"Word timestamp\",\n    lrcMale: \"Male vocal\",\n    lrcFemale: \"Female vocal\",\n    lrcDuet: \"Duet\",\n    lrcAuthor: \"Written by\",\n    lrcLyricist: \"Lyrics by\",\n    lrcLrcBy: \"LRC by\",\n    lrcAlbum: \"Album\",\n    lrcLength: \"Length\",\n    lrcOffset: \"Timing offset\",\n    lrcTool: \"Created with\",\n    lrcVersion: \"Version\",\n    lrcTrackInformation: \"Music information\",\n    lrcEmpty: \"No lyrics to display.\",\n    officeLegacyConversionTitle: \"Office conversion guidance\",\n    officeLegacyBinaryNotice:\n      \"belongs to a legacy Microsoft Office binary format that cannot be rendered with high fidelity in the browser. The preview shows trusted text fragments and structural fingerprints; use a LibreOffice/OnlyOffice server conversion to PDF/HTML for complete layout fidelity.\",\n    officeLegacyMetaFormatType: \"Format type\",\n    officeLegacyMetaFileStructure: \"File structure\",\n    officeLegacyOleDetected: \"OLE Compound File signature detected\",\n    officeLegacyOleMissing: \"No standard OLE signature detected; extracting from raw binary data\",\n    officeLegacyMetaTextFragments: \"Text fragments\",\n    officeLegacyTextFragmentCount: \"{count} fragments\",\n    officeLegacyMetaParseStatus: \"Parse status\",\n    officeLegacyReadableFragments: \"Readable text fragments\",\n    officeLegacyNoText: \"No stable readable text was extracted. The file may be compressed, encrypted, or use text encoding that cannot be reliably recognized in the browser; use LibreOffice/OnlyOffice server conversion before previewing.\",\n    officeLegacyWordParseFailed: \"Word binary parse failed: {message}\",\n    officeSheetParseFailed: \"Spreadsheet parse failed: {message}\",\n    officeUnsupportedTitle: \"Office basic preview\",\n    officeUnsupportedLegacyMessage:\n      \"This is a legacy binary or proprietary format that cannot be reliably parsed in the browser; convert it to PDF/HTML through LibreOffice/OnlyOffice on the server before previewing.\",\n    officeUnsupportedGenericMessage: \"This format usually needs server-side conversion or a dedicated parser for high-fidelity preview.\",\n    officeUnsupportedIntro: \"is handled by the Office plugin. {message}\",\n    officeUnsupportedSupportedFormats:\n      \"This version prioritizes basic previews for docx, rtf, odt/fodt, xlsx/xls/csv/ods, pptx/ppsx, and odp/fodp files.\",\n    officeErrorWithMessage: \"Parser returned: {message}\",\n    officeErrorWithoutMessage: \"Parser did not return a specific error.\",\n    officeConvertedTitle: \"High-fidelity Office conversion preview\",\n    officeConvertedPdfFailed: \"The converted Office PDF could not be previewed\",\n    pdfEncryptedTitle: \"This PDF is encrypted and cannot be previewed online\",\n    pdfEncryptedMessage: \"Download and open it with the password, or upload a decrypted PDF file.\",\n    pdfPreviewFailedTitle: \"PDF preview failed\",\n    pdfCorruptedMessage: \"The PDF may be corrupted or use an invalid format.\",\n    pdfCannotLoadMessage: \"This browser could not load the PDF.\",\n    pdfDownload: \"Download PDF\",\n    pdfPageLoading: \"Loading page {page}...\",\n    pdfPageEmpty: \"No displayable PDF-compatible content was detected on this page. If this is an Illustrator/AI file, export it as PDF, SVG, or PNG before previewing.\",\n    pdfPageRenderFailed: \"This page could not be rendered. It may contain graphics, fonts, or compression features that the browser PDF engine does not support.\",\n    pdfPreviousPage: \"Previous page\",\n    pdfNextPage: \"Next page\",\n    pdfPageInput: \"Current page\",\n    pdfPagePosition: \"/ {total}\",\n    pdfPageLabel: \"Page {page}\",\n    pdfSummaryPages: \"Pages\",\n    pdfSummaryPageSizes: \"Page sizes\",\n    pdfSummaryFit: \"Fit\",\n    pdfSummaryActualSize: \"Actual size\",\n    pdfSummaryFitWidth: \"Fit width\",\n    pdfSummaryZoom: \"Zoom\",\n    imagePreviewFailedTitle: \"Image preview failed\",\n    imagePreviewFailedMessage: \"This browser cannot display the image. The file may be corrupted or use an unsupported encoding.\",\n    imageDownload: \"Download image\",\n    imageZoomOut: \"Zoom out\",\n    imageZoomIn: \"Zoom in\",\n    imageRotate: \"Rotate image\",\n    imageReset: \"Reset image view\"\n  }\n};\n\nexport function resolveMessages(options: Pick<PreviewOptions, \"locale\" | \"messages\">): PreviewMessages {\n  return {\n    ...defaultMessages[options.locale || \"en-US\"],\n    ...options.messages\n  };\n}\n\nexport function formatPreviewMessage(template: string, values: Record<string, string | number>): string {\n  return template.replace(/\\{(\\w+)\\}/g, (match, key: string) => String(values[key] ?? match));\n}\n","const SAFE_SET_IMMEDIATE_FLAG = \"__ofvSafeSetImmediate__\";\n\ntype ImmediateCallback = (...args: unknown[]) => void;\n\ntype ImmediateWindow = Window & {\n  setImmediate?: ((callback: ImmediateCallback, ...args: unknown[]) => number) & { [SAFE_SET_IMMEDIATE_FLAG]?: boolean };\n  clearImmediate?: (handle: number) => void;\n};\n\nfunction isMicroFrontendSandbox(win: Window): boolean {\n  const flags = win as unknown as Record<string, unknown>;\n  return Boolean(\n    flags.__POWERED_BY_QIANKUN__ ||\n      flags.__MICRO_APP_ENVIRONMENT__ ||\n      flags.__POWERED_BY_WUJIE__ ||\n      flags.__GARFISH__\n  );\n}\n\nfunction createScheduler(win: Window): { schedule: (callback: ImmediateCallback, args: unknown[]) => number; cancel: (handle: number) => void } {\n  let nextHandle = 1;\n  const pending = new Map<number, () => void>();\n\n  // MessageChannel ports are private to this module, so micro-frontend sandboxes\n  // that tear down window \"message\" listeners on unmount cannot break them.\n  const MessageChannelCtor = (win as Window & { MessageChannel?: typeof MessageChannel }).MessageChannel;\n  if (typeof MessageChannelCtor === \"function\") {\n    const channel = new MessageChannelCtor();\n    channel.port1.onmessage = (event: MessageEvent) => {\n      const task = pending.get(event.data as number);\n      if (task) {\n        pending.delete(event.data as number);\n        task();\n      }\n    };\n    return {\n      schedule(callback, args) {\n        const handle = nextHandle++;\n        pending.set(handle, () => callback(...args));\n        channel.port2.postMessage(handle);\n        return handle;\n      },\n      cancel(handle) {\n        pending.delete(handle);\n      }\n    };\n  }\n\n  const timers = new Map<number, ReturnType<typeof setTimeout>>();\n  return {\n    schedule(callback, args) {\n      const handle = nextHandle++;\n      timers.set(\n        handle,\n        setTimeout(() => {\n          timers.delete(handle);\n          callback(...args);\n        }, 0)\n      );\n      return handle;\n    },\n    cancel(handle) {\n      const timer = timers.get(handle);\n      if (timer !== undefined) {\n        clearTimeout(timer);\n        timers.delete(handle);\n      }\n    }\n  };\n}\n\n/**\n * Micro-frontend sandboxes (qiankun, micro-app, ...) tear down the window\n * \"message\" listener that the `setimmediate` polyfill bundled with JSZip relies\n * on, so every `setImmediate` callback silently stops firing and zip-backed\n * previews (docx/xlsx/pptx/epub/ofd...) hang on the loading state forever.\n * Installing a scheduler that does not depend on window listeners restores them.\n */\nexport function ensureSafeAsyncScheduling(win: Window | undefined = typeof window === \"undefined\" ? undefined : window): void {\n  if (!win || !isMicroFrontendSandbox(win)) {\n    return;\n  }\n  const target = win as ImmediateWindow;\n  if (target.setImmediate?.[SAFE_SET_IMMEDIATE_FLAG]) {\n    return;\n  }\n  const scheduler = createScheduler(win);\n  const safeSetImmediate = ((callback: ImmediateCallback, ...args: unknown[]) => scheduler.schedule(callback, args)) as NonNullable<\n    ImmediateWindow[\"setImmediate\"]\n  >;\n  safeSetImmediate[SAFE_SET_IMMEDIATE_FLAG] = true;\n  target.setImmediate = safeSetImmediate;\n  target.clearImmediate = (handle: number) => scheduler.cancel(handle);\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin } from \"../types\";\n\nexport function fallbackPlugin(): PreviewPlugin {\n  return {\n    name: \"fallback\",\n    match() {\n      return true;\n    },\n    render(ctx) {\n      ctx.options.onUnsupported?.(ctx.file);\n      if (ctx.options.fallback === \"custom\" && ctx.options.renderFallback) {\n        return ctx.options.renderFallback(ctx);\n      }\n\n      const url = createObjectUrl(ctx.file);\n      const isExternal = Boolean(ctx.file.url);\n      const panel = document.createElement(\"div\");\n      panel.className = \"ofv-fallback\";\n\n      const title = document.createElement(\"strong\");\n      title.textContent =\n        ctx.options.fallback === \"download\"\n          ? ctx.options.messages.downloadTitle\n          : ctx.options.messages.unsupportedTitle;\n\n      const meta = createFallbackMeta(ctx.file, ctx.options.messages);\n\n      const download = document.createElement(\"a\");\n      download.href = url;\n      download.download = ctx.file.name;\n      download.textContent = ctx.options.messages.downloadFile;\n\n      panel.append(title, meta, download);\n      ctx.viewport.classList.add(\"ofv-center\");\n      ctx.viewport.append(panel);\n\n      if (ctx.options.fallback === \"download\") {\n        download.focus();\n      }\n\n      return {\n        destroy() {\n          ctx.viewport.classList.remove(\"ofv-center\");\n          revokeObjectUrl(url, isExternal);\n        }\n      };\n    }\n  };\n}\n\nfunction createFallbackMeta(\n  file: { name: string; extension: string; mimeType: string; size?: number; url?: string },\n  messages: {\n    file: string;\n    unnamedFile: string;\n    format: string;\n    unknown: string;\n    mime: string;\n    undeclared: string;\n    size: string;\n    source: string;\n    remoteUrl: string;\n    localFile: string;\n  }\n): HTMLElement {\n  const meta = document.createElement(\"dl\");\n  meta.className = \"ofv-fallback-meta\";\n  appendFallbackMeta(meta, messages.file, file.name || messages.unnamedFile);\n  appendFallbackMeta(meta, messages.format, file.extension ? `.${file.extension}` : messages.unknown);\n  appendFallbackMeta(meta, messages.mime, file.mimeType || messages.undeclared);\n  appendFallbackMeta(meta, messages.size, file.size === undefined ? messages.unknown : formatFallbackBytes(file.size));\n  appendFallbackMeta(meta, messages.source, file.url ? messages.remoteUrl : messages.localFile);\n  return meta;\n}\n\nfunction appendFallbackMeta(parent: HTMLElement, label: string, value: string): void {\n  const key = document.createElement(\"dt\");\n  key.textContent = label;\n  const content = document.createElement(\"dd\");\n  content.textContent = value;\n  parent.append(key, content);\n}\n\nfunction formatFallbackBytes(bytes: number): string {\n  if (bytes < 1024) {\n    return `${bytes} B`;\n  }\n  if (bytes < 1024 * 1024) {\n    return `${(bytes / 1024).toFixed(1)} KB`;\n  }\n  return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n","import { normalizeFile } from \"./detect\";\nimport { applyBoxSize, createObjectUrl, getElementSize, resolveContainer, revokeObjectUrl } from \"./dom\";\nimport { resolveMessages } from \"./messages\";\nimport { ensureSafeAsyncScheduling } from \"./sandbox-compat\";\nimport { fallbackPlugin } from \"./plugins/fallback\";\nimport type {\n  FileViewer,\n  PreviewFile,\n  PreviewCommand,\n  PreviewInstance,\n  PreviewItem,\n  PreviewLocale,\n  PreviewOptions,\n  PreviewPlugin,\n  PreviewSource,\n  PreviewToolbarActionId,\n  PreviewToolbarBuiltInAction,\n  PreviewToolbarCustomAction,\n  PreviewToolbarOptions\n} from \"./types\";\n\nexport function createViewer(options: PreviewOptions): FileViewer {\n  ensureSafeAsyncScheduling();\n  const container = resolveContainer(options.container);\n  applyBoxSize(container, options.width, options.height);\n\n  const customClassNames = parseClassNameTokens(options.className);\n  container.classList.add(\"ofv-root\");\n  if (customClassNames.length > 0) {\n    container.classList.add(...customClassNames);\n  }\n  const theme = applyTheme(container, options.theme || \"light\");\n\n  const host = document.createElement(\"div\");\n  host.className = \"ofv-host\";\n\n  const status = document.createElement(\"div\");\n  status.className = \"ofv-status\";\n  status.setAttribute(\"role\", \"status\");\n  status.hidden = true;\n  const statusChip = document.createElement(\"div\");\n  statusChip.className = \"ofv-status-chip\";\n  const statusSpinner = document.createElement(\"span\");\n  statusSpinner.className = \"ofv-status-spinner\";\n  statusSpinner.setAttribute(\"aria-hidden\", \"true\");\n  const statusText = document.createElement(\"span\");\n  statusText.className = \"ofv-status-text\";\n  statusChip.append(statusSpinner, statusText);\n  status.append(statusChip);\n\n  const viewport = document.createElement(\"div\");\n  viewport.className = \"ofv-viewport\";\n\n  const queue = normalizeQueue(options);\n  let currentIndex = clampIndex(options.initialIndex || 0, queue.length);\n  let currentInstance: PreviewInstance | undefined;\n  let printPreparationPending = false;\n\n  const goTo = async (index: number) => {\n    if (destroyed || queue.length === 0) {\n      return;\n    }\n    currentIndex = clampIndex(index, queue.length);\n    await renderQueueItem(currentIndex);\n  };\n\n  const toolbar = createToolbar(\n    options.toolbar,\n    viewport,\n    {\n      getLength: () => queue.length,\n      next: () => goTo(currentIndex + 1),\n      previous: () => goTo(currentIndex - 1),\n      goToPage: (page) => currentInstance?.goToPage?.(page) ?? false,\n      command: (command) => currentInstance?.command?.(command),\n      print: async () => {\n        if (printPreparationPending) {\n          return;\n        }\n        printPreparationPending = true;\n        const instance = currentInstance;\n        try {\n          await instance?.preparePrint?.();\n        } catch (error) {\n          console.error(\"Failed to prepare file preview for printing:\", error);\n          printPreparationPending = false;\n          return;\n        }\n        printPreparationPending = false;\n        if (destroyed || instance !== currentInstance) {\n          return;\n        }\n        printPreview(viewport);\n      }\n    },\n    options.locale || \"en-US\"\n  );\n  if (toolbar) {\n    host.append(toolbar.element);\n  }\n\n  host.append(status, viewport);\n  container.replaceChildren(host);\n\n  const normalizedOptions = {\n    ...options,\n    fit: options.fit || \"contain\",\n    fitWasProvided: options.fit !== undefined,\n    fallback: options.fallback || \"inline\",\n    zoom: normalizeInitialZoom(options.zoom),\n    messages: resolveMessages(options)\n  };\n\n  let destroyed = false;\n  let renderToken = 0;\n  let renderAbortController: AbortController | undefined;\n\n  const setLoading = (loading: boolean) => {\n    status.hidden = !loading;\n    status.classList.remove(\"ofv-status-error\");\n    statusText.textContent = loading ? normalizedOptions.messages.loading : \"\";\n  };\n\n  const setError = (error: Error | string) => {\n    status.hidden = false;\n    status.classList.add(\"ofv-status-error\");\n    statusText.textContent = typeof error === \"string\" ? error : error.message;\n  };\n\n  const resize = () => {\n    if (destroyed) {\n      return;\n    }\n    const size = getElementSize(viewport);\n    currentInstance?.resize?.(size);\n  };\n\n  const resizeObserver = observeResize(container, resize);\n\n  const renderFile = async (file: PreviewFile, token = ++renderToken) => {\n    if (destroyed || token !== renderToken) {\n      return;\n    }\n    destroyPreviewInstance(currentInstance);\n    currentInstance = undefined;\n    renderAbortController?.abort();\n    const abortController = new AbortController();\n    renderAbortController = abortController;\n    viewport.replaceChildren();\n    setLoading(true);\n    toolbar?.update(file, currentIndex, queue.length);\n\n    const plugins = [...(options.plugins || []), fallbackPlugin()];\n    const plugin = await findPlugin(plugins, file);\n    if (destroyed || token !== renderToken) {\n      return;\n    }\n\n    try {\n      const nextInstance = await plugin.render({\n        host,\n        viewport,\n        file,\n        size: getElementSize(viewport),\n        options: normalizedOptions,\n        toolbar: toolbar?.getContext(),\n        signal: abortController.signal,\n        setLoading,\n        setError\n      });\n      if (destroyed || token !== renderToken) {\n        destroyPreviewInstance(nextInstance);\n        return;\n      }\n      if (renderAbortController === abortController) {\n        renderAbortController = undefined;\n      }\n      currentInstance = nextInstance;\n      if (normalizedOptions.initialPage !== undefined) {\n        nextInstance.goToPage?.(normalizedOptions.initialPage);\n      }\n      setLoading(false);\n      toolbar?.setCommandSupport((command) =>\n        Boolean(nextInstance.command) && (nextInstance.canCommand ? nextInstance.canCommand(command) : true)\n      );\n      options.onLoad?.(file);\n      resize();\n    } catch (error) {\n      if (renderAbortController === abortController) {\n        renderAbortController = undefined;\n      }\n      if (destroyed || token !== renderToken) {\n        return;\n      }\n      const normalizedError = error instanceof Error ? error : new Error(String(error));\n      viewport.replaceChildren();\n      setLoading(false);\n      setError(normalizedError);\n      options.onError?.(normalizedError, file);\n    }\n  };\n\n  async function renderQueueItem(index: number) {\n    const token = ++renderToken;\n    renderAbortController?.abort();\n    renderAbortController = undefined;\n    const item = queue[index];\n    const file = await normalizeFile(item.file, item.fileName, item.mimeType);\n    if (destroyed || token !== renderToken) {\n      return;\n    }\n    await renderFile(file, token);\n  }\n\n  void goTo(currentIndex);\n\n  return {\n    async reload(file) {\n      if (destroyed) {\n        return;\n      }\n      if (file !== undefined) {\n        const currentItem = queue[currentIndex];\n        queue.splice(currentIndex, 1, createReloadItem(file, currentItem, options));\n      }\n      await renderQueueItem(currentIndex);\n    },\n    async next() {\n      await goTo(currentIndex + 1);\n    },\n    async previous() {\n      await goTo(currentIndex - 1);\n    },\n    goTo,\n    goToPage(page) {\n      return destroyed ? false : currentInstance?.goToPage?.(page) ?? false;\n    },\n    getCurrentIndex() {\n      return currentIndex;\n    },\n    resize,\n    destroy() {\n      destroyed = true;\n      renderToken += 1;\n      renderAbortController?.abort();\n      renderAbortController = undefined;\n      resizeObserver.destroy();\n      destroyPreviewInstance(currentInstance);\n      toolbar?.destroy();\n      theme.destroy();\n      container.replaceChildren();\n      container.classList.remove(\"ofv-root\");\n      if (customClassNames.length > 0) {\n        container.classList.remove(...customClassNames);\n      }\n    }\n  };\n}\n\nfunction parseClassNameTokens(className: string | undefined): string[] {\n  return className?.trim().split(/\\s+/).filter(Boolean) ?? [];\n}\n\nfunction destroyPreviewInstance(instance: PreviewInstance | undefined): void {\n  if (!instance) {\n    return;\n  }\n  try {\n    instance.destroy();\n  } catch (error) {\n    console.error(\"Failed to destroy file preview instance:\", error);\n  }\n}\n\nfunction normalizeQueue(options: PreviewOptions): PreviewItem[] {\n  if (options.files && options.files.length > 0) {\n    return options.files.map((item) =>\n      isPreviewItem(item)\n        ? item\n        : {\n            file: item\n          }\n    );\n  }\n  if (options.file === undefined) {\n    throw new Error(\"File viewer requires either file or files.\");\n  }\n  return [\n    {\n      file: options.file,\n      fileName: options.fileName,\n      mimeType: options.mimeType\n    }\n  ];\n}\n\nfunction isPreviewItem(item: PreviewSource | PreviewItem): item is PreviewItem {\n  return typeof item === \"object\" && item !== null && \"file\" in item;\n}\n\nfunction createReloadItem(\n  file: PreviewSource,\n  currentItem: PreviewItem | undefined,\n  options: PreviewOptions\n): PreviewItem {\n  if (typeof File !== \"undefined\" && file instanceof File) {\n    return { file };\n  }\n  return {\n    file,\n    fileName: currentItem?.fileName || options.fileName,\n    mimeType: currentItem?.mimeType || options.mimeType\n  };\n}\n\nfunction clampIndex(index: number, length: number): number {\n  if (length <= 0) {\n    return 0;\n  }\n  return Math.min(Math.max(index, 0), length - 1);\n}\n\nfunction normalizeInitialZoom(zoom: PreviewOptions[\"zoom\"]): number {\n  return typeof zoom === \"number\" && Number.isFinite(zoom) && zoom > 0 ? zoom : 1;\n}\n\nfunction applyTheme(\n  container: HTMLElement,\n  theme: NonNullable<PreviewOptions[\"theme\"]>\n): { destroy: () => void } {\n  const media = window.matchMedia?.(\"(prefers-color-scheme: dark)\");\n  const classes = [\"ofv-theme-light\", \"ofv-theme-dark\"];\n\n  const setThemeClass = () => {\n    container.classList.remove(...classes);\n    const resolvedTheme = theme === \"auto\" && media?.matches ? \"dark\" : theme === \"auto\" ? \"light\" : theme;\n    container.classList.add(`ofv-theme-${resolvedTheme}`);\n  };\n\n  setThemeClass();\n  if (theme === \"auto\") {\n    addMediaListener(media, setThemeClass);\n  }\n\n  return {\n    destroy() {\n      if (theme === \"auto\") {\n        removeMediaListener(media, setThemeClass);\n      }\n      container.classList.remove(...classes);\n    }\n  };\n}\n\nfunction observeResize(element: HTMLElement, callback: () => void): { destroy: () => void } {\n  if (typeof ResizeObserver !== \"undefined\") {\n    const observer = new ResizeObserver(callback);\n    observer.observe(element);\n    return {\n      destroy() {\n        observer.disconnect();\n      }\n    };\n  }\n\n  window.addEventListener(\"resize\", callback);\n  return {\n    destroy() {\n      window.removeEventListener(\"resize\", callback);\n    }\n  };\n}\n\ntype CompatibleMediaQueryList = MediaQueryList & {\n  addListener?: (listener: () => void) => void;\n  removeListener?: (listener: () => void) => void;\n};\n\nfunction addMediaListener(media: CompatibleMediaQueryList | undefined, listener: () => void): void {\n  if (!media) {\n    return;\n  }\n  if (typeof media.addEventListener === \"function\") {\n    media.addEventListener(\"change\", listener);\n    return;\n  }\n  media.addListener?.(listener);\n}\n\nfunction removeMediaListener(media: CompatibleMediaQueryList | undefined, listener: () => void): void {\n  if (!media) {\n    return;\n  }\n  if (typeof media.removeEventListener === \"function\") {\n    media.removeEventListener(\"change\", listener);\n    return;\n  }\n  media.removeListener?.(listener);\n}\n\nfunction createToolbar(\n  toolbar: PreviewOptions[\"toolbar\"],\n  viewport: HTMLElement,\n  queue: {\n    getLength: () => number;\n    next: () => void | Promise<void>;\n    previous: () => void | Promise<void>;\n    goToPage: (page: number) => boolean;\n    command: (command: PreviewCommand) => void | boolean | undefined;\n    print: () => void | Promise<void>;\n  },\n  locale: PreviewLocale\n):\n  | {\n      element: HTMLElement;\n      update: (file: PreviewFile, index: number, length: number) => void;\n      setCommandSupport: (isSupported: (command: PreviewCommand) => boolean) => void;\n      getContext: () => ReturnType<typeof createToolbarContext>;\n      setZoom: (zoom?: number) => void;\n      destroy: () => void;\n    }\n  | undefined {\n  if (!toolbar) {\n    return undefined;\n  }\n\n  const options: PreviewToolbarOptions =\n    typeof toolbar === \"boolean\"\n      ? { zoom: true, rotate: true, download: true, fullscreen: true, print: true, search: true }\n      : toolbar;\n\n  const element = document.createElement(\"div\");\n  element.className = \"ofv-toolbar\";\n  element.setAttribute(\"role\", \"toolbar\");\n  element.setAttribute(\"aria-label\", defaultToolbarText[locale].ariaLabel);\n\n  let file: PreviewFile | undefined;\n  let currentIndex = 0;\n  let currentLength = queue.getLength();\n  let queueLabel: HTMLSpanElement | undefined;\n  let previousButton: HTMLButtonElement | undefined;\n  let nextButton: HTMLButtonElement | undefined;\n  let zoomResetButton: HTMLButtonElement | undefined;\n  let fullscreenButton: HTMLButtonElement | undefined;\n  let currentZoom: number | undefined;\n  const commandButtons: Array<{ button: HTMLButtonElement; command: PreviewCommand }> = [];\n  const customButtons: Array<{ button: HTMLButtonElement; action: PreviewToolbarCustomAction }> = [];\n  const disposers: Array<() => void> = [];\n  const search = createSearchController(viewport);\n  let searchInput: HTMLInputElement | undefined;\n  let searchCount: HTMLSpanElement | undefined;\n  let canRunCommand = (_command: PreviewCommand) => false;\n\n  const getContext = () =>\n    createToolbarContext({\n      file,\n      index: currentIndex,\n      length: currentLength,\n      viewport,\n      queue,\n      element,\n      search,\n      canCommand: canRunCommand,\n      refreshCommandSupport,\n      zoom: currentZoom,\n      setZoom\n    });\n\n  const addButton = (\n    label: string,\n    title: string,\n    action: () => void,\n    className?: string,\n    icon?: string | HTMLElement | SVGElement,\n    iconOnly = false\n  ) => {\n    const button = document.createElement(\"button\");\n    button.type = \"button\";\n    setToolbarButtonContent(button, label, icon, iconOnly);\n    button.title = title;\n    button.setAttribute(\"aria-label\", title);\n    if (className) {\n      button.className = className;\n    }\n    button.addEventListener(\"click\", action);\n    element.append(button);\n    disposers.push(() => button.removeEventListener(\"click\", action));\n    return button;\n  };\n\n  const addCommandButton = (\n    id: PreviewToolbarBuiltInAction,\n    label: string,\n    title: string,\n    command: PreviewCommand\n  ) => {\n    const button = addButton(label, title, () => {\n      queue.command(command);\n    }, undefined, getToolbarIcon(options, id), id !== \"zoom-reset\");\n    button.disabled = true;\n    commandButtons.push({ button, command });\n  };\n\n  const renderDefaultAction = (id: PreviewToolbarActionId) => {\n    if (!isBuiltInToolbarAction(id)) {\n      const customAction = options.actions?.find((action) => action.id === id);\n      if (customAction) {\n        renderCustomAction(customAction);\n      }\n      return;\n    }\n\n    if (id === \"previous\" && queue.getLength() > 1) {\n      previousButton = addButton(\n        getToolbarLabel(options, locale, \"previous\"),\n        getToolbarTitle(options, locale, \"previous\"),\n        () => void queue.previous(),\n        undefined,\n        getToolbarIcon(options, \"previous\"),\n        true\n      );\n      return;\n    }\n    if (id === \"next\" && queue.getLength() > 1) {\n      nextButton = addButton(\n        getToolbarLabel(options, locale, \"next\"),\n        getToolbarTitle(options, locale, \"next\"),\n        () => void queue.next(),\n        undefined,\n        getToolbarIcon(options, \"next\"),\n        true\n      );\n      return;\n    }\n    if (id === \"queue\" && queue.getLength() > 1) {\n      queueLabel = document.createElement(\"span\");\n      queueLabel.className = \"ofv-toolbar-queue\";\n      element.append(queueLabel);\n      return;\n    }\n    if (id === \"zoom-out\" && options.zoom) {\n      addCommandButton(id, getToolbarLabel(options, locale, id), getToolbarTitle(options, locale, id), \"zoom-out\");\n      return;\n    }\n    if (id === \"zoom-in\" && options.zoom) {\n      addCommandButton(id, getToolbarLabel(options, locale, id), getToolbarTitle(options, locale, id), \"zoom-in\");\n      return;\n    }\n    if (id === \"zoom-reset\" && options.zoom) {\n      addCommandButton(id, getToolbarLabel(options, locale, id), getToolbarTitle(options, locale, id), \"zoom-reset\");\n      zoomResetButton = commandButtons[commandButtons.length - 1]?.button;\n      updateZoomLabel();\n      return;\n    }\n    if (id === \"rotate-left\" && options.rotate) {\n      addCommandButton(id, getToolbarLabel(options, locale, id), getToolbarTitle(options, locale, id), \"rotate-left\");\n      return;\n    }\n    if (id === \"rotate-right\" && options.rotate) {\n      addCommandButton(id, getToolbarLabel(options, locale, id), getToolbarTitle(options, locale, id), \"rotate-right\");\n      return;\n    }\n    if (id === \"download\" && options.download !== false) {\n      addButton(\n        getToolbarLabel(options, locale, id),\n        getToolbarTitle(options, locale, id),\n        () => getContext().download(),\n        undefined,\n        getToolbarIcon(options, \"download\"),\n        true\n      );\n      return;\n    }\n    if (id === \"fullscreen\" && options.fullscreen !== false) {\n      fullscreenButton = addButton(\n        getToolbarLabel(options, locale, id),\n        getToolbarTitle(options, locale, id),\n        () => getContext().fullscreen(),\n        undefined,\n        getToolbarIcon(options, \"fullscreen\"),\n        true\n      );\n      updateFullscreenButton();\n      return;\n    }\n    if (id === \"print\" && options.print) {\n      addButton(\n        getToolbarLabel(options, locale, id),\n        getToolbarTitle(options, locale, id),\n        () => getContext().print(),\n        undefined,\n        getToolbarIcon(options, \"print\"),\n        true\n      );\n      return;\n    }\n    if (id === \"search\" && options.search !== false) {\n      renderSearchControl();\n      return;\n    }\n\n  };\n\n  const renderCustomAction = (action: PreviewToolbarCustomAction) => {\n    const button = addButton(\n      action.label,\n      action.title || action.label,\n      () => void action.onClick(getContext()),\n      action.className,\n      action.icon\n    );\n    button.dataset.ofvToolbarAction = action.id;\n    customButtons.push({ button, action });\n  };\n\n  const renderSearchControl = () => {\n    const searchGroup = document.createElement(\"div\");\n    searchGroup.className = \"ofv-toolbar-search\";\n    searchGroup.title = getToolbarTitle(options, locale, \"search\");\n    const searchIcon = document.createElement(\"span\");\n    searchIcon.className = \"ofv-toolbar-search-icon\";\n    searchIcon.setAttribute(\"aria-hidden\", \"true\");\n    searchIcon.append(sanitizeToolbarIcon(defaultToolbarIcons.search ?? \"\"));\n    searchGroup.append(searchIcon);\n    const nextSearchInput = document.createElement(\"input\");\n    nextSearchInput.type = \"search\";\n    nextSearchInput.placeholder = getToolbarLabel(options, locale, \"search\");\n    nextSearchInput.setAttribute(\"aria-label\", getToolbarTitle(options, locale, \"search\"));\n    const nextSearchCount = document.createElement(\"span\");\n    nextSearchCount.className = \"ofv-toolbar-search-count\";\n    searchInput = nextSearchInput;\n    searchCount = nextSearchCount;\n\n    const runSearch = () => {\n      const count = search.search(nextSearchInput.value);\n      nextSearchCount.textContent = nextSearchInput.value ? String(count) : \"\";\n    };\n\n    nextSearchInput.addEventListener(\"input\", runSearch);\n    searchGroup.append(nextSearchInput, nextSearchCount);\n    element.append(searchGroup);\n    disposers.push(() => nextSearchInput.removeEventListener(\"input\", runSearch));\n  };\n\n  const renderToolbar = () => {\n    if (options.render) {\n      element.replaceChildren();\n      const customElement = options.render(getContext());\n      if (customElement) {\n        element.append(customElement);\n      }\n      return;\n    }\n    const order = getToolbarOrder(options, queue.getLength());\n    if (options.order) {\n      order.forEach(renderDefaultAction);\n    } else {\n      const rendered = new Set<PreviewToolbarActionId>();\n      for (const group of defaultToolbarGroups) {\n        const ids = group.filter((id) => order.includes(id));\n        if (ids.length === 0) {\n          continue;\n        }\n        const before = element.childElementCount;\n        for (const id of ids) {\n          rendered.add(id);\n          renderDefaultAction(id);\n        }\n        if (before > 0 && element.childElementCount > before) {\n          const separator = document.createElement(\"span\");\n          separator.className = \"ofv-toolbar-sep\";\n          separator.setAttribute(\"aria-hidden\", \"true\");\n          element.insertBefore(separator, element.children[before]);\n        }\n      }\n      order.filter((id) => !rendered.has(id)).forEach(renderDefaultAction);\n    }\n    getImplicitCustomActions(options).forEach(renderCustomAction);\n  };\n\n  renderToolbar();\n\n  const updateCustomButtons = () => {\n    const context = getContext();\n    for (const { button, action } of customButtons) {\n      button.disabled = evaluateToolbarFlag(action.disabled, context);\n      button.hidden = evaluateToolbarFlag(action.hidden, context);\n    }\n  };\n\n  const resetSearch = () => {\n    search.clear();\n    if (searchInput) {\n      searchInput.value = \"\";\n    }\n    if (searchCount) {\n      searchCount.textContent = \"\";\n    }\n  };\n\n  function setZoom(zoom?: number) {\n    currentZoom = typeof zoom === \"number\" && Number.isFinite(zoom) && zoom > 0 ? zoom : undefined;\n    updateZoomLabel();\n    updateCustomButtons();\n    refreshCustomRender();\n  }\n\n  function updateZoomLabel() {\n    if (!zoomResetButton) {\n      return;\n    }\n    setToolbarButtonContent(\n      zoomResetButton,\n      currentZoom === undefined ? getToolbarLabel(options, locale, \"zoom-reset\") : formatToolbarZoom(currentZoom),\n      options.icons?.[\"zoom-reset\"]\n    );\n    zoomResetButton.classList.add(\"ofv-toolbar-zoom-reset\");\n  }\n\n  function refreshCommandSupport() {\n    commandButtons.forEach(({ button, command }) => {\n      button.disabled = !canRunCommand(command);\n    });\n    updateCustomButtons();\n    refreshCustomRender();\n  }\n\n  function isFullscreenActive(): boolean {\n    return Boolean(\n      typeof document !== \"undefined\" && element.parentElement && document.fullscreenElement === element.parentElement\n    );\n  }\n\n  function updateFullscreenButton() {\n    if (!fullscreenButton) {\n      return;\n    }\n    const active = isFullscreenActive();\n    const id: PreviewToolbarBuiltInAction = active ? \"exit-fullscreen\" : \"fullscreen\";\n    const icon = active\n      ? options.icons?.[\"exit-fullscreen\"] ?? options.icons?.fullscreen ?? defaultToolbarIcons[\"exit-fullscreen\"]\n      : getToolbarIcon(options, \"fullscreen\");\n    setToolbarButtonContent(fullscreenButton, getToolbarLabel(options, locale, id), icon, true);\n    const title = getToolbarTitle(options, locale, id);\n    fullscreenButton.title = title;\n    fullscreenButton.setAttribute(\"aria-label\", title);\n    fullscreenButton.setAttribute(\"aria-pressed\", String(active));\n  }\n\n  const handleFullscreenChange = () => {\n    updateFullscreenButton();\n    refreshCustomRender();\n  };\n  if (typeof document !== \"undefined\") {\n    document.addEventListener(\"fullscreenchange\", handleFullscreenChange);\n    disposers.push(() => document.removeEventListener(\"fullscreenchange\", handleFullscreenChange));\n  }\n\n  const refreshCustomRender = () => {\n    if (!options.render) {\n      return;\n    }\n    element.replaceChildren();\n    const customElement = options.render(getContext());\n    if (customElement) {\n      element.append(customElement);\n    }\n  };\n\n  return {\n    element,\n    update(nextFile, index, length) {\n      file = nextFile;\n      currentIndex = index;\n      currentLength = length;\n      currentZoom = undefined;\n      updateZoomLabel();\n      resetSearch();\n      commandButtons.forEach(({ button }) => {\n        button.disabled = true;\n      });\n      if (queueLabel) {\n        queueLabel.textContent = `${index + 1} / ${length}`;\n      }\n      if (previousButton) {\n        previousButton.disabled = index <= 0;\n      }\n      if (nextButton) {\n        nextButton.disabled = index >= length - 1;\n      }\n      updateCustomButtons();\n      refreshCustomRender();\n    },\n    setCommandSupport(isSupported) {\n      canRunCommand = isSupported;\n      if (!canRunCommand(\"zoom-in\") && !canRunCommand(\"zoom-out\") && !canRunCommand(\"zoom-reset\")) {\n        currentZoom = undefined;\n        updateZoomLabel();\n      }\n      refreshCommandSupport();\n    },\n    getContext,\n    setZoom,\n    destroy() {\n      search.clear();\n      for (const dispose of disposers) {\n        dispose();\n      }\n      element.replaceChildren();\n    }\n  };\n}\n\nfunction createToolbarContext({\n  file,\n  index,\n  length,\n  viewport,\n  queue,\n  element,\n  search,\n  canCommand,\n  refreshCommandSupport,\n  zoom,\n  setZoom\n}: {\n  file?: PreviewFile;\n  index: number;\n  length: number;\n  viewport: HTMLElement;\n  queue: {\n    next: () => void | Promise<void>;\n    previous: () => void | Promise<void>;\n    goToPage: (page: number) => boolean;\n    command: (command: PreviewCommand) => void | boolean | undefined;\n    print: () => void | Promise<void>;\n  };\n  element: HTMLElement;\n  search: ReturnType<typeof createSearchController>;\n  canCommand: (command: PreviewCommand) => boolean;\n  refreshCommandSupport: () => void;\n  zoom?: number;\n  setZoom: (zoom?: number) => void;\n}) {\n  return {\n    file,\n    index,\n    length,\n    viewport,\n    canPrevious: index > 0,\n    canNext: index < length - 1,\n    isFullscreen: Boolean(\n      typeof document !== \"undefined\" && element.parentElement && document.fullscreenElement === element.parentElement\n    ),\n    zoom,\n    zoomLabel: zoom === undefined ? undefined : formatToolbarZoom(zoom),\n    async previous() {\n      await queue.previous();\n    },\n    async next() {\n      await queue.next();\n    },\n    goToPage: queue.goToPage,\n    command: queue.command,\n    canCommand,\n    refreshCommandSupport,\n    setZoom,\n    download() {\n      if (file) {\n        downloadFile(file);\n      }\n    },\n    fullscreen() {\n      const target = element.parentElement;\n      if (!target) {\n        return;\n      }\n      if (typeof document !== \"undefined\" && document.fullscreenElement === target) {\n        void document.exitFullscreen?.();\n      } else {\n        void target.requestFullscreen?.();\n      }\n    },\n    print() {\n      void queue.print();\n    },\n    search: search.search,\n    clearSearch: search.clear\n  };\n}\n\nconst toolbarIcon = (content: string): string =>\n  `<svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">${content}</svg>`;\n\nconst defaultToolbarIcons: Partial<Record<PreviewToolbarBuiltInAction, string>> = {\n  previous: toolbarIcon('<path d=\"M9.8 3.8 5.6 8l4.2 4.2\"/>'),\n  next: toolbarIcon('<path d=\"M6.2 3.8 10.4 8l-4.2 4.2\"/>'),\n  \"zoom-out\": toolbarIcon(\n    '<circle cx=\"7.2\" cy=\"7.2\" r=\"4.4\"/><path d=\"M13.5 13.5l-3.2-3.2\"/><path d=\"M5.4 7.2h3.6\"/>'\n  ),\n  \"zoom-in\": toolbarIcon(\n    '<circle cx=\"7.2\" cy=\"7.2\" r=\"4.4\"/><path d=\"M13.5 13.5l-3.2-3.2\"/><path d=\"M5.4 7.2h3.6\"/><path d=\"M7.2 5.4v3.6\"/>'\n  ),\n  \"rotate-left\": toolbarIcon(\n    '<path d=\"M2.2 8a5.8 5.8 0 1 0 1.7-4.1L2.2 5.6\"/><path d=\"M2.2 2.2v3.4h3.4\"/>'\n  ),\n  \"rotate-right\": toolbarIcon(\n    '<path d=\"M13.8 8a5.8 5.8 0 1 1-1.7-4.1l1.7 1.7\"/><path d=\"M13.8 2.2v3.4h-3.4\"/>'\n  ),\n  download: toolbarIcon(\n    '<path d=\"M8 2.6v6.9\"/><path d=\"m4.9 6.6 3.1 3.1 3.1-3.1\"/><path d=\"M2.9 11.2v1a1.3 1.3 0 0 0 1.3 1.3h7.6a1.3 1.3 0 0 0 1.3-1.3v-1\"/>'\n  ),\n  fullscreen: toolbarIcon(\n    '<path d=\"M6 2.9H4.2A1.3 1.3 0 0 0 2.9 4.2V6\"/><path d=\"M10 2.9h1.8a1.3 1.3 0 0 1 1.3 1.3V6\"/><path d=\"M6 13.1H4.2a1.3 1.3 0 0 1-1.3-1.3V10\"/><path d=\"M10 13.1h1.8a1.3 1.3 0 0 0 1.3-1.3V10\"/>'\n  ),\n  \"exit-fullscreen\": toolbarIcon(\n    '<path d=\"M2.9 6h1.8A1.3 1.3 0 0 0 6 4.7V2.9\"/><path d=\"M13.1 6h-1.8A1.3 1.3 0 0 1 10 4.7V2.9\"/><path d=\"M2.9 10h1.8A1.3 1.3 0 0 1 6 11.3v1.8\"/><path d=\"M13.1 10h-1.8a1.3 1.3 0 0 0-1.3 1.3v1.8\"/>'\n  ),\n  print: toolbarIcon(\n    '<path d=\"M4.7 5.8V2.9h6.6v2.9\"/><path d=\"M4.7 11.4H3.5a1.3 1.3 0 0 1-1.3-1.3V7.2a1.4 1.4 0 0 1 1.4-1.4h8.8a1.4 1.4 0 0 1 1.4 1.4v2.9a1.3 1.3 0 0 1-1.3 1.3h-1.2\"/><path d=\"M4.7 9.5h6.6v3.6H4.7z\"/>'\n  ),\n  search: toolbarIcon('<circle cx=\"7.2\" cy=\"7.2\" r=\"4.4\"/><path d=\"M13.5 13.5l-3.2-3.2\"/>')\n};\n\nfunction getToolbarIcon(\n  options: PreviewToolbarOptions,\n  id: PreviewToolbarBuiltInAction\n): string | HTMLElement | SVGElement | undefined {\n  return options.icons?.[id] ?? defaultToolbarIcons[id];\n}\n\nconst defaultToolbarGroups: PreviewToolbarActionId[][] = [\n  [\"previous\", \"next\", \"queue\"],\n  [\"zoom-out\", \"zoom-in\", \"zoom-reset\", \"rotate-left\", \"rotate-right\"],\n  [\"download\", \"fullscreen\", \"print\"]\n];\n\nconst defaultToolbarText: Record<\n  PreviewLocale,\n  {\n    ariaLabel: string;\n    labels: Record<PreviewToolbarBuiltInAction, string>;\n    titles: Record<PreviewToolbarBuiltInAction, string>;\n  }\n> = {\n  \"zh-CN\": {\n    ariaLabel: \"文件预览工具栏\",\n    labels: {\n      previous: \"上一个\",\n      next: \"下一个\",\n      queue: \"\",\n      \"zoom-out\": \"-\",\n      \"zoom-in\": \"+\",\n      \"zoom-reset\": \"100%\",\n      \"rotate-left\": \"左旋\",\n      \"rotate-right\": \"旋转\",\n      download: \"下载\",\n      fullscreen: \"全屏\",\n      \"exit-fullscreen\": \"退出全屏\",\n      print: \"打印\",\n      search: \"搜索\"\n    },\n    titles: {\n      previous: \"上一个文件\",\n      next: \"下一个文件\",\n      queue: \"当前文件位置\",\n      \"zoom-out\": \"缩小\",\n      \"zoom-in\": \"放大\",\n      \"zoom-reset\": \"重置缩放\",\n      \"rotate-left\": \"向左旋转\",\n      \"rotate-right\": \"向右旋转\",\n      download: \"下载文件\",\n      fullscreen: \"全屏查看预览\",\n      \"exit-fullscreen\": \"退出全屏\",\n      print: \"打印预览\",\n      search: \"搜索预览文本\"\n    }\n  },\n  \"en-US\": {\n    ariaLabel: \"File preview toolbar\",\n    labels: {\n      previous: \"Prev\",\n      next: \"Next\",\n      queue: \"\",\n      \"zoom-out\": \"-\",\n      \"zoom-in\": \"+\",\n      \"zoom-reset\": \"100%\",\n      \"rotate-left\": \"Rotate left\",\n      \"rotate-right\": \"Rotate\",\n      download: \"Download\",\n      fullscreen: \"Fullscreen\",\n      \"exit-fullscreen\": \"Exit fullscreen\",\n      print: \"Print\",\n      search: \"Search\"\n    },\n    titles: {\n      previous: \"Previous file\",\n      next: \"Next file\",\n      queue: \"Current file position\",\n      \"zoom-out\": \"Zoom out\",\n      \"zoom-in\": \"Zoom in\",\n      \"zoom-reset\": \"Reset zoom\",\n      \"rotate-left\": \"Rotate left\",\n      \"rotate-right\": \"Rotate right\",\n      download: \"Download file\",\n      fullscreen: \"Open preview fullscreen\",\n      \"exit-fullscreen\": \"Exit fullscreen\",\n      print: \"Print preview\",\n      search: \"Search preview text\"\n    }\n  }\n};\n\nfunction getToolbarLabel(\n  options: PreviewToolbarOptions,\n  locale: PreviewLocale,\n  id: PreviewToolbarBuiltInAction\n): string {\n  return options.labels?.[id] ?? defaultToolbarText[locale].labels[id];\n}\n\nfunction getToolbarTitle(\n  options: PreviewToolbarOptions,\n  locale: PreviewLocale,\n  id: PreviewToolbarBuiltInAction\n): string {\n  return options.titles?.[id] ?? options.labels?.[id] ?? defaultToolbarText[locale].titles[id];\n}\n\nfunction formatToolbarZoom(zoom: number): string {\n  return `${Math.round(zoom * 100)}%`;\n}\n\nfunction getToolbarOrder(options: PreviewToolbarOptions, queueLength: number): PreviewToolbarActionId[] {\n  if (options.order) {\n    return options.order;\n  }\n\n  const actions: PreviewToolbarActionId[] = [];\n  if (queueLength > 1) {\n    actions.push(\"previous\", \"next\", \"queue\");\n  }\n  if (options.zoom) {\n    actions.push(\"zoom-out\", \"zoom-in\", \"zoom-reset\");\n  }\n  if (options.rotate) {\n    actions.push(\"rotate-left\", \"rotate-right\");\n  }\n  if (options.download !== false) {\n    actions.push(\"download\");\n  }\n  if (options.fullscreen !== false) {\n    actions.push(\"fullscreen\");\n  }\n  if (options.print) {\n    actions.push(\"print\");\n  }\n  if (options.search !== false) {\n    actions.push(\"search\");\n  }\n  return actions;\n}\n\nfunction getImplicitCustomActions(options: PreviewToolbarOptions): PreviewToolbarCustomAction[] {\n  if (options.order || !options.actions) {\n    return [];\n  }\n  return [...options.actions].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n}\n\nfunction evaluateToolbarFlag(\n  value: boolean | ((ctx: ReturnType<typeof createToolbarContext>) => boolean) | undefined,\n  context: ReturnType<typeof createToolbarContext>\n): boolean {\n  return typeof value === \"function\" ? value(context) : Boolean(value);\n}\n\nfunction setToolbarButtonContent(\n  button: HTMLButtonElement,\n  label: string,\n  icon?: string | HTMLElement | SVGElement,\n  iconOnly = false\n): void {\n  button.replaceChildren();\n  button.classList.toggle(\"ofv-toolbar-icon-button\", Boolean(icon) && iconOnly);\n  if (!icon) {\n    button.textContent = label;\n    return;\n  }\n\n  const iconElement = document.createElement(\"span\");\n  iconElement.className = \"ofv-toolbar-icon\";\n  iconElement.setAttribute(\"aria-hidden\", \"true\");\n  if (typeof icon === \"string\") {\n    iconElement.append(sanitizeToolbarIcon(icon));\n  } else {\n    iconElement.append(icon.cloneNode(true));\n  }\n\n  const labelElement = document.createElement(\"span\");\n  labelElement.className = \"ofv-toolbar-label\";\n  labelElement.textContent = label;\n  button.append(iconElement, labelElement);\n}\n\nconst allowedToolbarIconTags = new Set([\n  \"svg\",\n  \"g\",\n  \"path\",\n  \"circle\",\n  \"rect\",\n  \"line\",\n  \"polyline\",\n  \"polygon\",\n  \"ellipse\",\n  \"defs\",\n  \"title\",\n  \"desc\"\n]);\n\nconst allowedToolbarIconAttrs = new Set([\n  \"aria-hidden\",\n  \"class\",\n  \"cx\",\n  \"cy\",\n  \"d\",\n  \"fill\",\n  \"focusable\",\n  \"height\",\n  \"id\",\n  \"points\",\n  \"r\",\n  \"rx\",\n  \"ry\",\n  \"stroke\",\n  \"stroke-linecap\",\n  \"stroke-linejoin\",\n  \"stroke-width\",\n  \"transform\",\n  \"viewBox\",\n  \"width\",\n  \"x\",\n  \"x1\",\n  \"x2\",\n  \"y\",\n  \"y1\",\n  \"y2\"\n]);\n\nfunction sanitizeToolbarIcon(icon: string): Node {\n  const template = document.createElement(\"template\");\n  template.innerHTML = icon.trim();\n  const fragment = document.createDocumentFragment();\n  for (const child of Array.from(template.content.childNodes)) {\n    const sanitized = sanitizeToolbarIconNode(child);\n    if (sanitized) {\n      fragment.append(sanitized);\n    }\n  }\n  return fragment;\n}\n\nfunction sanitizeToolbarIconNode(node: Node): Node | null {\n  if (node.nodeType === Node.TEXT_NODE) {\n    const text = node.textContent || \"\";\n    return text.trim() ? document.createTextNode(text) : null;\n  }\n\n  if (!(node instanceof Element)) {\n    return null;\n  }\n\n  const tagName = node.tagName.toLowerCase();\n  if (!allowedToolbarIconTags.has(tagName)) {\n    return null;\n  }\n\n  const sanitized = document.createElementNS(\"http://www.w3.org/2000/svg\", tagName);\n  for (const attr of Array.from(node.attributes)) {\n    if (isSafeToolbarIconAttribute(attr.name, attr.value)) {\n      sanitized.setAttribute(attr.name, attr.value);\n    }\n  }\n\n  for (const child of Array.from(node.childNodes)) {\n    const sanitizedChild = sanitizeToolbarIconNode(child);\n    if (sanitizedChild) {\n      sanitized.append(sanitizedChild);\n    }\n  }\n\n  return sanitized;\n}\n\nfunction isSafeToolbarIconAttribute(name: string, value: string): boolean {\n  const attrName = name.toLowerCase();\n  if (attrName.startsWith(\"on\") || attrName.includes(\":\")) {\n    return false;\n  }\n  if (!allowedToolbarIconAttrs.has(name) && !allowedToolbarIconAttrs.has(attrName) && !attrName.startsWith(\"data-\")) {\n    return false;\n  }\n  return !/^\\s*(?:javascript|data:text\\/html|vbscript):/i.test(value);\n}\n\nfunction isBuiltInToolbarAction(id: PreviewToolbarActionId): id is PreviewToolbarBuiltInAction {\n  return id in defaultToolbarText[\"en-US\"].labels;\n}\n\nfunction createSearchController(root: HTMLElement): {\n  search: (query: string) => number;\n  clear: () => void;\n} {\n  const markerClass = \"ofv-search-match\";\n\n  const clear = () => {\n    const markers = collectSearchRoots(root).flatMap((searchRoot) => [\n      ...searchRoot.querySelectorAll(`mark.${markerClass}`)\n    ]);\n    for (const marker of markers) {\n      marker.replaceWith(document.createTextNode(marker.textContent || \"\"));\n    }\n    collectSearchRoots(root).forEach((searchRoot) => searchRoot.normalize());\n  };\n\n  const search = (query: string): number => {\n    clear();\n    const normalizedQuery = query.trim();\n    if (!normalizedQuery) {\n      return 0;\n    }\n\n    const textNodes = collectSearchRoots(root).flatMap((searchRoot) => collectSearchableTextNodes(searchRoot));\n    let count = 0;\n    let firstMatch: HTMLElement | undefined;\n\n    for (const node of textNodes) {\n      const text = node.nodeValue || \"\";\n      const lowerText = text.toLowerCase();\n      const lowerQuery = normalizedQuery.toLowerCase();\n      let start = 0;\n      let index = lowerText.indexOf(lowerQuery, start);\n      if (index < 0) {\n        continue;\n      }\n\n      const fragment = document.createDocumentFragment();\n      while (index >= 0) {\n        if (index > start) {\n          fragment.append(document.createTextNode(text.slice(start, index)));\n        }\n        const marker = document.createElement(\"mark\");\n        marker.className = markerClass;\n        marker.textContent = text.slice(index, index + normalizedQuery.length);\n        fragment.append(marker);\n        firstMatch ||= marker;\n        count += 1;\n        start = index + normalizedQuery.length;\n        index = lowerText.indexOf(lowerQuery, start);\n      }\n      if (start < text.length) {\n        fragment.append(document.createTextNode(text.slice(start)));\n      }\n      node.replaceWith(fragment);\n    }\n\n    firstMatch?.scrollIntoView?.({ block: \"center\", inline: \"nearest\" });\n    return count;\n  };\n\n  return { search, clear };\n}\n\nfunction collectSearchRoots(root: HTMLElement): HTMLElement[] {\n  const roots = [root];\n  for (const iframe of root.querySelectorAll<HTMLIFrameElement>(\"iframe\")) {\n    try {\n      const body = iframe.contentDocument?.body;\n      if (body) {\n        roots.push(body);\n      }\n    } catch {\n      // Cross-origin or sandboxed frames without DOM access are skipped.\n    }\n  }\n  return roots;\n}\n\nfunction collectSearchableTextNodes(root: HTMLElement): Text[] {\n  const nodes: Text[] = [];\n  const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {\n    acceptNode(node) {\n      const parent = node.parentElement;\n      if (!parent || !node.nodeValue?.trim()) {\n        return NodeFilter.FILTER_REJECT;\n      }\n      if ([\"SCRIPT\", \"STYLE\", \"TEXTAREA\", \"INPUT\", \"BUTTON\"].includes(parent.tagName)) {\n        return NodeFilter.FILTER_REJECT;\n      }\n      if (hasHiddenSearchAncestor(parent, root)) {\n        return NodeFilter.FILTER_REJECT;\n      }\n      return NodeFilter.FILTER_ACCEPT;\n    }\n  });\n\n  let current = walker.nextNode();\n  while (current) {\n    nodes.push(current as Text);\n    current = walker.nextNode();\n  }\n  return nodes;\n}\n\nfunction hasHiddenSearchAncestor(element: HTMLElement, root: HTMLElement): boolean {\n  let current: HTMLElement | null = element;\n  while (current) {\n    if (\n      current.hidden ||\n      current.getAttribute(\"aria-hidden\") === \"true\" ||\n      current.style.display === \"none\" ||\n      current.style.visibility === \"hidden\"\n    ) {\n      return true;\n    }\n    if (current === root) {\n      break;\n    }\n    current = current.parentElement;\n  }\n  return false;\n}\n\nconst PRINT_RESOURCE_WAIT_TIMEOUT_MS = 15_000;\nconst PRINT_FRAME_CLEANUP_TIMEOUT_MS = 5 * 60_000;\n\nfunction printPreview(viewport: HTMLElement): void {\n  const frame = document.createElement(\"iframe\");\n  frame.className = \"ofv-print-frame\";\n  frame.setAttribute(\"aria-hidden\", \"true\");\n  document.body.append(frame);\n\n  const clone = viewport.cloneNode(true) as HTMLElement;\n  copyCanvasContent(viewport, clone);\n  clone.classList.add(\"ofv-print-root\", \"ofv-root\"); // Add ofv-root class so CSS variables can resolve\n\n  // Handle PPTX printing layout adaptation\n  const pptxViewer = clone.querySelector(\".ofv-pptx-viewer\") || (clone.classList.contains(\"ofv-pptx-viewer\") ? clone : null);\n  let intrinsicWidth = 960;\n  let intrinsicHeight = 540;\n  let hasSlides = false;\n\n  if (pptxViewer) {\n    const slides = pptxViewer.querySelectorAll(\"[data-slide-index]\");\n    if (slides.length > 0) {\n      hasSlides = true;\n      const firstWrapper = slides[0].firstElementChild as HTMLElement | null;\n      const firstSlide = firstWrapper?.firstElementChild as HTMLElement | null;\n      if (firstSlide) {\n        intrinsicWidth = parseInt(firstSlide.style.width) || 960;\n        intrinsicHeight = parseInt(firstSlide.style.height) || 540;\n      }\n\n      slides.forEach((slideEl) => {\n        const item = slideEl as HTMLElement;\n        item.style.width = \"100%\";\n        item.style.margin = \"0 0 20px 0\";\n\n        const wrapper = item.firstElementChild as HTMLElement | null;\n        if (wrapper) {\n          wrapper.style.width = `${intrinsicWidth}px`;\n          wrapper.style.height = `${intrinsicHeight}px`;\n          wrapper.style.boxShadow = \"none\";\n          wrapper.style.margin = \"0 auto\";\n\n          const slideContent = wrapper.firstElementChild as HTMLElement | null;\n          if (slideContent) {\n            slideContent.style.transform = \"none\";\n            slideContent.style.width = `${intrinsicWidth}px`;\n            slideContent.style.height = `${intrinsicHeight}px`;\n          }\n        }\n      });\n    }\n  }\n\n  const doc = frame.contentDocument;\n  if (!doc) {\n    frame.remove();\n    return;\n  }\n\n  // 1. Write the basic HTML skeleton\n  doc.open();\n  doc.write(`<!doctype html>\n    <html>\n      <head>\n        <meta charset=\"utf-8\" />\n        <title>Print preview</title>\n      </head>\n      <body></body>\n    </html>`);\n  doc.close();\n\n  // 2. Copy all stylesheets from parent document to print iframe\n  Array.from(document.querySelectorAll(\"style, link[rel='stylesheet']\")).forEach((el) => {\n    doc.head.appendChild(el.cloneNode(true));\n  });\n\n  // 3. Inject our base print style override element AFTER parent stylesheets\n  const baseStyle = doc.createElement(\"style\");\n  baseStyle.textContent = `\n    * { box-sizing: border-box; }\n    html, body {\n      margin: 0;\n      padding: 0;\n      background: #fff;\n      color: #111827;\n      font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n    }\n    body { padding: 16px; }\n    img, video, canvas, svg { max-width: 100%; }\n    pre {\n      white-space: pre-wrap;\n      word-break: break-word;\n      font: 12px/1.5 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n    }\n    .ofv-viewport, .ofv-print-root {\n      width: 100% !important;\n      height: auto !important;\n      overflow: visible !important;\n      background: #fff !important;\n      color: #111827 !important;\n      border: none !important;\n      box-shadow: none !important;\n    }\n    .ofv-pdf {\n      padding: 0;\n      overflow: visible;\n      background: #fff;\n    }\n    .ofv-pdf-page {\n      display: block;\n      max-width: 100%;\n      height: auto;\n      margin: 0 auto 16px;\n      box-shadow: none;\n    }\n    .ofv-panel,\n    .ofv-text,\n    .ofv-text-block,\n    .ofv-file-list {\n      max-height: none;\n      min-height: 0;\n      overflow: visible;\n    }\n    .ofv-section {\n      break-inside: avoid;\n      page-break-inside: avoid;\n    }\n  `;\n  doc.head.appendChild(baseStyle);\n\n  // 4. Inject PPTX-specific style overrides if slides are present\n  if (hasSlides) {\n    const pptxStyle = doc.createElement(\"style\");\n    pptxStyle.textContent = `\n      @media print {\n        @page {\n          size: ${intrinsicWidth > intrinsicHeight ? \"landscape\" : \"portrait\"};\n          margin: 0;\n        }\n        html, body {\n          background: #fff;\n        }\n        body {\n          width: ${intrinsicWidth}px !important;\n          margin: 0 !important;\n          padding: 0 !important;\n        }\n        .ofv-print-root {\n          width: ${intrinsicWidth}px !important;\n          padding: 0 !important;\n        }\n        .ofv-pptx-viewer {\n          width: ${intrinsicWidth}px !important;\n          padding: 0 !important;\n          background: #fff !important;\n          overflow: visible !important;\n        }\n        .ofv-pptx-viewer > div[data-slide-index] {\n          page-break-after: always;\n          break-after: page;\n          break-inside: avoid;\n          page-break-inside: avoid;\n          margin: 0 !important;\n          padding: 0 !important;\n          overflow: visible !important;\n        }\n        .ofv-pptx-viewer > div[data-slide-index]:last-child {\n          page-break-after: avoid;\n          break-after: avoid;\n        }\n      }\n    `;\n    doc.head.appendChild(pptxStyle);\n  }\n\n  doc.body.append(clone);\n\n  const printWindow = frame.contentWindow;\n  if (!printWindow) {\n    frame.remove();\n    return;\n  }\n\n  let cleanedUp = false;\n  let cleanupTimer: number | undefined;\n  const cleanup = () => {\n    if (cleanedUp) {\n      return;\n    }\n    cleanedUp = true;\n    window.clearTimeout(cleanupTimer);\n    printWindow.removeEventListener?.(\"afterprint\", cleanup);\n    frame.remove();\n  };\n  printWindow.addEventListener?.(\"afterprint\", cleanup, { once: true });\n\n  void waitForPrintResources(doc).then(() => {\n    if (cleanedUp || !frame.isConnected) {\n      return;\n    }\n    cleanupTimer = window.setTimeout(cleanup, PRINT_FRAME_CLEANUP_TIMEOUT_MS);\n    try {\n      printWindow.focus();\n      printWindow.print();\n    } catch {\n      cleanup();\n    }\n  });\n}\n\nasync function waitForPrintResources(doc: Document): Promise<void> {\n  const pending: Array<Promise<void>> = [];\n  for (const image of Array.from(doc.images)) {\n    pending.push(waitForPrintImage(image));\n  }\n  for (const stylesheet of Array.from(doc.querySelectorAll<HTMLLinkElement>(\"link[rel='stylesheet']\"))) {\n    pending.push(waitForPrintStylesheet(stylesheet));\n  }\n  if (doc.fonts?.ready) {\n    pending.push(Promise.resolve(doc.fonts.ready).then(() => undefined, () => undefined));\n  }\n\n  await settlePrintResources(pending);\n  void doc.body.offsetHeight;\n  await new Promise<void>((resolve) => window.setTimeout(resolve, 0));\n}\n\nfunction waitForPrintImage(image: HTMLImageElement): Promise<void> {\n  if (typeof image.decode === \"function\") {\n    return image.decode().then(() => undefined, () => undefined);\n  }\n  if (image.complete) {\n    return Promise.resolve();\n  }\n  return waitForPrintElement(image);\n}\n\nfunction waitForPrintStylesheet(stylesheet: HTMLLinkElement): Promise<void> {\n  try {\n    if (stylesheet.sheet) {\n      return Promise.resolve();\n    }\n  } catch {\n    // Cross-origin stylesheets can deny CSSOM access while still loading normally.\n  }\n  return waitForPrintElement(stylesheet);\n}\n\nfunction waitForPrintElement(element: HTMLElement): Promise<void> {\n  return new Promise((resolve) => {\n    const done = () => {\n      element.removeEventListener(\"load\", done);\n      element.removeEventListener(\"error\", done);\n      resolve();\n    };\n    element.addEventListener(\"load\", done, { once: true });\n    element.addEventListener(\"error\", done, { once: true });\n  });\n}\n\nfunction settlePrintResources(pending: Array<Promise<void>>): Promise<void> {\n  if (pending.length === 0) {\n    return Promise.resolve();\n  }\n  return new Promise((resolve) => {\n    let settled = false;\n    const finish = () => {\n      if (settled) {\n        return;\n      }\n      settled = true;\n      window.clearTimeout(timeout);\n      resolve();\n    };\n    const timeout = window.setTimeout(finish, PRINT_RESOURCE_WAIT_TIMEOUT_MS);\n    void Promise.all(pending).then(finish, finish);\n  });\n}\n\nfunction copyCanvasContent(sourceRoot: HTMLElement, targetRoot: HTMLElement): void {\n  const sourceCanvases = [...sourceRoot.querySelectorAll(\"canvas\")];\n  const targetCanvases = [...targetRoot.querySelectorAll(\"canvas\")];\n\n  sourceCanvases.forEach((sourceCanvas, index) => {\n    const targetCanvas = targetCanvases[index];\n    if (!targetCanvas) {\n      return;\n    }\n    const image = document.createElement(\"img\");\n    image.className = targetCanvas.className;\n    image.alt = \"Canvas preview page\";\n    try {\n      image.src = sourceCanvas.toDataURL(\"image/png\");\n    } catch {\n      return;\n    }\n    image.width = sourceCanvas.width;\n    image.height = sourceCanvas.height;\n    targetCanvas.replaceWith(image);\n  });\n}\n\nfunction downloadFile(file: PreviewFile): void {\n  const url = createObjectUrl(file);\n  const isExternal = Boolean(file.url);\n  const link = document.createElement(\"a\");\n  link.href = url;\n  link.download = file.name;\n  link.rel = \"noopener\";\n  link.hidden = true;\n  document.body.append(link);\n  link.click();\n  window.setTimeout(() => {\n    link.remove();\n    revokeObjectUrl(url, isExternal);\n  }, 0);\n}\n\nasync function findPlugin(plugins: PreviewPlugin[], file: PreviewFile): Promise<PreviewPlugin> {\n  for (const plugin of plugins) {\n    if (await plugin.match(file)) {\n      return plugin;\n    }\n  }\n  return fallbackPlugin();\n}\n","import { normalizeFile } from \"./detect\";\nimport type { PreviewPlugin, PreviewSource } from \"./types\";\n\nexport interface PreviewSupportOptions {\n  fileName?: string;\n  mimeType?: string;\n}\n\n/** 在挂载预览器前，按实际插件顺序判断文件是否有可用的预览路径。 */\nexport async function isPreviewSupported(\n  source: PreviewSource,\n  plugins: PreviewPlugin[],\n  options: PreviewSupportOptions = {}\n): Promise<boolean> {\n  const file = await normalizeFile(source, options.fileName, options.mimeType);\n  for (const plugin of plugins) {\n    if (await plugin.match(file)) {\n      // fallback 是终止性的降级路径，命中后不应继续寻找后面的原生插件。\n      return plugin.name !== \"fallback\";\n    }\n  }\n  return false;\n}\n","import type { PreviewFile } from \"../types\";\n\nexport async function readArrayBuffer(file: PreviewFile): Promise<ArrayBuffer> {\n  if (file.source instanceof ArrayBuffer) {\n    return file.source;\n  }\n  if (file.blob) {\n    return file.blob.arrayBuffer();\n  }\n  if (typeof file.source === \"string\") {\n    const response = await fetch(file.source);\n    if (!response.ok) {\n      throw new Error(`Failed to fetch file: ${response.status}`);\n    }\n    return response.arrayBuffer();\n  }\n  throw new Error(\"Unsupported file source.\");\n}\n\nexport async function readTextFile(file: PreviewFile): Promise<string> {\n  const decode = (buffer: ArrayBuffer) => decodeTextBuffer(buffer);\n  if (typeof file.source === \"string\") {\n    const response = await fetch(file.source);\n    if (!response.ok) {\n      throw new Error(`Failed to fetch text file: ${response.status}`);\n    }\n    return decode(await response.arrayBuffer());\n  }\n  if (file.blob) {\n    return decode(await file.blob.arrayBuffer());\n  }\n  if (file.source instanceof ArrayBuffer) {\n    return decode(file.source);\n  }\n  return String(file.source);\n}\n\nexport function createPanel(className = \"\"): HTMLElement {\n  const panel = document.createElement(\"div\");\n  panel.className = `ofv-panel ${className}`.trim();\n  return panel;\n}\n\n/** Scroll a rendered, paginated preview to a 1-based page. */\nexport function goToRenderedPage(\n  root: ParentNode,\n  selector: string,\n  page: number,\n  scroller: HTMLElement\n): boolean {\n  const pages = Array.from(root.querySelectorAll<HTMLElement>(selector));\n  if (pages.length === 0) {\n    return false;\n  }\n  const rounded = Math.round(page);\n  const pageNumber = Math.min(pages.length, Math.max(1, Number.isFinite(rounded) ? rounded : 1));\n  const target = pages[pageNumber - 1];\n  const targetTop = scroller.scrollTop + target.getBoundingClientRect().top - scroller.getBoundingClientRect().top;\n  const top = Math.max(0, targetTop - 16);\n  if (typeof scroller.scrollTo === \"function\") {\n    scroller.scrollTo({ top, behavior: \"smooth\" });\n  } else {\n    scroller.scrollTop = top;\n  }\n  return true;\n}\n\nexport function getInitialZoom(ctx: { options: { zoom: number } }, min = 0.1, max = 8): number {\n  return Math.min(max, Math.max(min, ctx.options.zoom));\n}\n\nexport function createSection(title: string): HTMLElement {\n  const section = document.createElement(\"section\");\n  section.className = \"ofv-section\";\n  const heading = document.createElement(\"h3\");\n  heading.textContent = title;\n  section.append(heading);\n  return section;\n}\n\nexport function appendMeta(parent: HTMLElement, label: string, value: string | number): void {\n  const row = document.createElement(\"div\");\n  row.className = \"ofv-meta-row\";\n  const key = document.createElement(\"span\");\n  key.textContent = label;\n  const content = document.createElement(\"strong\");\n  content.textContent = String(value);\n  row.append(key, content);\n  parent.append(row);\n}\n\nexport function escapeHtml(value: string): string {\n  return value\n    .replaceAll(\"&\", \"&amp;\")\n    .replaceAll(\"<\", \"&lt;\")\n    .replaceAll(\">\", \"&gt;\")\n    .replaceAll('\"', \"&quot;\")\n    .replaceAll(\"'\", \"&#039;\");\n}\n\nexport function bytesToText(bytes: Uint8Array): string {\n  return decodeTextBytes(bytes);\n}\n\nexport function decodeTextBuffer(buffer: ArrayBuffer): string {\n  return decodeTextBytes(new Uint8Array(buffer));\n}\n\nexport function decodeTextBytes(bytes: Uint8Array): string {\n  if (bytes.length >= 3 && bytes[0] === 0xef && bytes[1] === 0xbb && bytes[2] === 0xbf) {\n    return new TextDecoder(\"utf-8\").decode(bytes.subarray(3));\n  }\n  if (bytes.length >= 2) {\n    if (bytes[0] === 0xff && bytes[1] === 0xfe) {\n      return new TextDecoder(\"utf-16le\").decode(bytes.subarray(2));\n    }\n    if (bytes[0] === 0xfe && bytes[1] === 0xff) {\n      return new TextDecoder(\"utf-16be\").decode(bytes.subarray(2));\n    }\n  }\n  try {\n    return new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes);\n  } catch {\n    return decodeWithFallback(bytes, \"gb18030\") || decodeWithFallback(bytes, \"gbk\") || new TextDecoder(\"utf-8\").decode(bytes);\n  }\n}\n\nfunction decodeWithFallback(bytes: Uint8Array, encoding: string): string | undefined {\n  try {\n    return new TextDecoder(encoding).decode(bytes);\n  } catch {\n    return undefined;\n  }\n}\n\nexport function resolveFormat(\n  file: Pick<PreviewFile, \"extension\" | \"mimeType\">,\n  mimeMap: Record<string, string>\n): string {\n  return file.extension || mimeMap[file.mimeType] || \"\";\n}\n","/// <reference path=\"../shims-heic.d.ts\" />\nimport { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewContext, PreviewPlugin, PreviewSize } from \"../types\";\nimport { getInitialZoom, goToRenderedPage } from \"./utils\";\n\nconst imageExtensions = new Set([\n  \"jpg\",\n  \"jpeg\",\n  \"jfif\",\n  \"pjpe\",\n  \"pjpeg\",\n  \"png\",\n  \"gif\",\n  \"webp\",\n  \"avif\",\n  \"jxl\",\n  \"svg\",\n  \"bmp\",\n  \"ico\",\n  \"cur\",\n  \"tif\",\n  \"tiff\",\n  \"apng\",\n  \"heic\",\n  \"heif\"\n]);\nconst nonRasterImageExtensions = new Set([\"dxf\"]);\nconst nonRasterImageMimeTypes = new Set([\"image/vnd.dxf\", \"image/vnd.adobe.photoshop\"]);\nconst heicMimeTypes = new Set([\"image/heic\", \"image/heif\", \"image/heic-sequence\", \"image/heif-sequence\"]);\n\nexport function imagePlugin(): PreviewPlugin {\n  return {\n    name: \"image\",\n    match(file) {\n      if (nonRasterImageExtensions.has(file.extension) || nonRasterImageMimeTypes.has(file.mimeType)) {\n        return false;\n      }\n      return file.mimeType.startsWith(\"image/\") || imageExtensions.has(file.extension);\n    },\n    async render(ctx) {\n      const ext = ctx.file.extension.toLowerCase();\n      const isHeic = ext === \"heic\" || ext === \"heif\" || heicMimeTypes.has(ctx.file.mimeType.toLowerCase());\n      const isTiff = ext === \"tif\" || ext === \"tiff\" || ctx.file.mimeType.toLowerCase() === \"image/tiff\";\n      const sourceBytesPromise = readImageBytes(ctx.file);\n\n      let url = \"\";\n      let convertedBlob: Blob | null = null;\n      let isExternal = Boolean(ctx.file.url);\n      let tiffSource: HTMLElement | null = null;\n\n      if (isTiff) {\n        ctx.setLoading(true);\n        try {\n          const bytes = await sourceBytesPromise;\n          tiffSource = await createTiffPreview(bytes, ctx.file.name);\n        } catch (err: any) {\n          console.error(\"TIFF image conversion failed:\", err);\n          url = createObjectUrl(ctx.file);\n        } finally {\n          ctx.setLoading(false);\n        }\n      } else if (isHeic) {\n        ctx.setLoading(true);\n        try {\n          let blob = ctx.file.blob;\n          if (!blob && typeof ctx.file.source === \"string\") {\n            const res = await fetch(ctx.file.source);\n            if (!res.ok) {\n              throw new Error(`Failed to fetch HEIC file: ${res.status}`);\n            }\n            blob = await res.blob();\n          }\n          if (!blob) {\n            throw new Error(\"HEIC file source cannot be resolved to a Blob.\");\n          }\n\n          const heic2anyModule = await import(\"heic2any\");\n          const heic2any = heic2anyModule.default || heic2anyModule;\n          const converted = await heic2any({\n            blob,\n            toType: \"image/jpeg\",\n            quality: 0.8\n          });\n\n          convertedBlob = Array.isArray(converted) ? converted[0] : converted;\n          url = URL.createObjectURL(convertedBlob);\n          isExternal = false;\n        } catch (err: any) {\n          console.error(\"HEIC image conversion failed:\", err);\n          // Fallback to raw object URL\n          url = createObjectUrl(ctx.file);\n          isExternal = Boolean(ctx.file.url);\n        } finally {\n          ctx.setLoading(false);\n        }\n      } else {\n        url = createObjectUrl(ctx.file);\n      }\n\n      const wrapper = document.createElement(\"div\");\n      wrapper.className = \"ofv-image-viewer\";\n\n      const showInlineControls = !ctx.options.toolbar;\n      const controls = document.createElement(\"div\");\n      controls.className = \"ofv-image-controls\";\n\n      const stage = document.createElement(\"div\");\n      stage.className = \"ofv-image-stage\";\n      const infoBar = createImageInfoBar(await sourceBytesPromise, ext, ctx.file.mimeType, ctx.file.name);\n      infoBar.hidden = true;\n      infoBar.setAttribute(\"aria-hidden\", \"true\");\n      infoBar.style.display = \"none\";\n\n      const image = document.createElement(\"img\");\n      image.className = \"ofv-media ofv-image-content\";\n      image.alt = ctx.file.name;\n      image.draggable = false;\n      image.style.objectFit = objectFit(ctx.options.fit);\n      if (url) {\n        image.src = url;\n      }\n\n      const visual: HTMLElement = tiffSource || image;\n      if (tiffSource) {\n        tiffSource.classList.add(\"ofv-image-content\");\n        if (tiffSource.classList.contains(\"ofv-tiff-pages\")) {\n          stage.classList.add(\"ofv-image-stage-pages\");\n        }\n      }\n      const visualBox = document.createElement(\"div\");\n      visualBox.className = \"ofv-image-scrollbox\";\n\n      let scale = getInitialZoom(ctx);\n      let rotation = 0;\n      let offsetX = 0;\n      let offsetY = 0;\n      let dragging = false;\n      let dragStartX = 0;\n      let dragStartY = 0;\n      let startOffsetX = 0;\n      let startOffsetY = 0;\n      let activePointerId: number | null = null;\n      let previewAvailable = true;\n\n      const zoomLabel = document.createElement(\"span\");\n      zoomLabel.className = \"ofv-image-zoom\";\n\n      // The scrollbox width/height is derived from the visual's layout size, but a\n      // sized scrollbox feeds back into the layout of visuals without an intrinsic\n      // size (e.g. SVG without width/height). Measure once with the inline sizes\n      // cleared, then pin the visual's layout so later box changes cannot feed back;\n      // invalidate only when the available space changes.\n      let measuredBase: { width: number; height: number } | null = null;\n\n      const invalidateBaseSize = () => {\n        measuredBase = null;\n        visual.style.removeProperty(\"width\");\n        visual.style.removeProperty(\"height\");\n        visualBox.style.removeProperty(\"width\");\n        visualBox.style.removeProperty(\"height\");\n      };\n\n      const updateScrollBox = () => {\n        if (visual.classList.contains(\"ofv-tiff-pages\")) {\n          visualBox.style.removeProperty(\"width\");\n          visualBox.style.removeProperty(\"height\");\n          return;\n        }\n        if (!measuredBase) {\n          visual.style.removeProperty(\"width\");\n          visual.style.removeProperty(\"height\");\n          visualBox.style.removeProperty(\"width\");\n          visualBox.style.removeProperty(\"height\");\n          const width = visual.offsetWidth || visual.getBoundingClientRect().width || (visual as HTMLImageElement).naturalWidth || 0;\n          const height = visual.offsetHeight || visual.getBoundingClientRect().height || (visual as HTMLImageElement).naturalHeight || 0;\n          if (width <= 0 || height <= 0) {\n            return;\n          }\n          measuredBase = { width, height };\n          visual.style.width = `${width}px`;\n          visual.style.height = `${height}px`;\n        }\n        // Rotation happens around the visual center, so a sideways rotation swaps\n        // the footprint the scrollbox has to reserve.\n        const sideways = Math.abs(rotation % 180) === 90;\n        const boxWidth = sideways ? measuredBase.height : measuredBase.width;\n        const boxHeight = sideways ? measuredBase.width : measuredBase.height;\n        visualBox.style.width = `${Math.ceil(boxWidth * scale)}px`;\n        visualBox.style.height = `${Math.ceil(boxHeight * scale)}px`;\n      };\n\n      const updateTransform = () => {\n        updateScrollBox();\n        visual.style.transform = `translate(${offsetX}px, ${offsetY}px) scale(${scale}) rotate(${rotation}deg)`;\n        zoomLabel.textContent = `${Math.round(scale * 100)}%`;\n        ctx.toolbar?.setZoom(previewAvailable ? scale : undefined);\n      };\n\n      const showImageFallback = () => {\n        previewAvailable = false;\n        ctx.toolbar?.setZoom(undefined);\n        infoBar.hidden = false;\n        infoBar.removeAttribute(\"aria-hidden\");\n        infoBar.style.removeProperty(\"display\");\n        stage.replaceChildren(createImageFallback(ctx.file.name, url, ctx.options.messages));\n        ctx.toolbar?.refreshCommandSupport();\n      };\n\n      const setScale = (nextScale: number) => {\n        scale = Math.min(8, Math.max(0.1, nextScale));\n        updateTransform();\n      };\n\n      const reset = () => {\n        scale = 1;\n        rotation = 0;\n        offsetX = 0;\n        offsetY = 0;\n        updateTransform();\n      };\n\n      const addButton = (label: string, title: string, action: () => void) => {\n        const button = document.createElement(\"button\");\n        button.type = \"button\";\n        button.textContent = label;\n        button.title = title;\n        button.setAttribute(\"aria-label\", title);\n        button.addEventListener(\"click\", action);\n        controls.append(button);\n        return () => button.removeEventListener(\"click\", action);\n      };\n\n      const disposers = showInlineControls\n        ? [\n            addButton(\"-\", ctx.options.messages.imageZoomOut, () => setScale(scale - 0.25)),\n            addButton(\"+\", ctx.options.messages.imageZoomIn, () => setScale(scale + 0.25)),\n            addButton(ctx.options.messages.imageRotate, ctx.options.messages.imageRotate, () => {\n              rotation += 90;\n              updateTransform();\n            }),\n            addButton(ctx.options.messages.imageReset, ctx.options.messages.imageReset, reset)\n          ]\n        : [];\n      if (showInlineControls) {\n        controls.append(zoomLabel);\n      }\n\n      const onPointerDown = (event: PointerEvent) => {\n        if (event.button !== 0) {\n          return;\n        }\n        if (activePointerId !== null && activePointerId !== event.pointerId) {\n          finishDrag(activePointerId);\n        }\n        dragging = true;\n        activePointerId = event.pointerId;\n        dragStartX = event.clientX;\n        dragStartY = event.clientY;\n        startOffsetX = offsetX;\n        startOffsetY = offsetY;\n        stage.classList.add(\"is-dragging\");\n        try {\n          stage.setPointerCapture(event.pointerId);\n        } catch {\n          // Pointer capture can fail if the pointer was already released by the browser.\n        }\n      };\n\n      const onPointerMove = (event: PointerEvent) => {\n        if (!dragging || event.pointerId !== activePointerId) {\n          return;\n        }\n        offsetX = startOffsetX + event.clientX - dragStartX;\n        offsetY = startOffsetY + event.clientY - dragStartY;\n        updateTransform();\n      };\n\n      const finishDrag = (pointerId?: number | null) => {\n        const captureId = pointerId ?? activePointerId;\n        dragging = false;\n        activePointerId = null;\n        stage.classList.remove(\"is-dragging\");\n        if (captureId !== null && captureId !== undefined) {\n          try {\n            if (stage.hasPointerCapture(captureId)) {\n              stage.releasePointerCapture(captureId);\n            }\n          } catch {\n            // Ignore stale pointer ids.\n          }\n        }\n      };\n\n      const onPointerUp = (event: PointerEvent) => {\n        if (event.pointerId === activePointerId) {\n          finishDrag(event.pointerId);\n        }\n      };\n\n      const onLostPointerCapture = (event: PointerEvent) => {\n        if (event.pointerId === activePointerId) {\n          finishDrag(null);\n        }\n      };\n\n      const onPointerLeave = (event: PointerEvent) => {\n        if (event.pointerId === activePointerId && event.buttons === 0) {\n          finishDrag(event.pointerId);\n        }\n      };\n\n      const onWindowBlur = () => {\n        finishDrag();\n      };\n\n      const onWheel = (event: WheelEvent) => {\n        if (!event.ctrlKey && !event.metaKey) {\n          return;\n        }\n        event.preventDefault();\n        setScale(scale + (event.deltaY > 0 ? -0.1 : 0.1));\n      };\n\n      stage.addEventListener(\"pointerdown\", onPointerDown);\n      stage.addEventListener(\"pointermove\", onPointerMove);\n      stage.addEventListener(\"pointerup\", onPointerUp);\n      stage.addEventListener(\"pointercancel\", onPointerUp);\n      stage.addEventListener(\"lostpointercapture\", onLostPointerCapture);\n      stage.addEventListener(\"pointerleave\", onPointerLeave);\n      stage.addEventListener(\"wheel\", onWheel, { passive: false });\n      const onImageLoad = () => {\n        invalidateBaseSize();\n        updateScrollBox();\n      };\n\n      if (!tiffSource) {\n        image.addEventListener(\"error\", showImageFallback);\n        image.addEventListener(\"load\", onImageLoad);\n      }\n      window.addEventListener(\"blur\", onWindowBlur);\n\n      visualBox.append(visual);\n      stage.append(visualBox);\n      wrapper.append(...(showInlineControls ? [controls, stage, infoBar] : [stage, infoBar]));\n      ctx.viewport.append(wrapper);\n      updateTransform();\n\n      return {\n        goToPage(page) {\n          return goToRenderedPage(stage, \".ofv-tiff-page\", page, stage);\n        },\n        canCommand(command) {\n          return (\n            previewAvailable &&\n            (command === \"zoom-in\" ||\n              command === \"zoom-out\" ||\n              command === \"zoom-reset\" ||\n              command === \"rotate-right\" ||\n              command === \"rotate-left\")\n          );\n        },\n        command(command) {\n          if (!previewAvailable) {\n            return false;\n          }\n          if (command === \"zoom-in\") {\n            setScale(scale + 0.25);\n            return true;\n          }\n          if (command === \"zoom-out\") {\n            setScale(scale - 0.25);\n            return true;\n          }\n          if (command === \"zoom-reset\") {\n            reset();\n            return true;\n          }\n          if (command === \"rotate-right\") {\n            rotation += 90;\n            updateTransform();\n            return true;\n          }\n          if (command === \"rotate-left\") {\n            rotation -= 90;\n            updateTransform();\n            return true;\n          }\n          return false;\n        },\n        resize(size: PreviewSize) {\n          visual.style.maxWidth = `${size.width}px`;\n          if (visual.classList.contains(\"ofv-tiff-pages\")) {\n            visual.style.removeProperty(\"max-height\");\n          } else {\n            visual.style.maxHeight = `${Math.max(0, size.height - controls.offsetHeight)}px`;\n          }\n          invalidateBaseSize();\n          updateScrollBox();\n        },\n        destroy() {\n          ctx.toolbar?.setZoom(undefined);\n          for (const dispose of disposers) {\n            dispose();\n          }\n          stage.removeEventListener(\"pointerdown\", onPointerDown);\n          stage.removeEventListener(\"pointermove\", onPointerMove);\n          stage.removeEventListener(\"pointerup\", onPointerUp);\n          stage.removeEventListener(\"pointercancel\", onPointerUp);\n          stage.removeEventListener(\"lostpointercapture\", onLostPointerCapture);\n          stage.removeEventListener(\"pointerleave\", onPointerLeave);\n          stage.removeEventListener(\"wheel\", onWheel);\n          image.removeEventListener(\"error\", showImageFallback);\n          image.removeEventListener(\"load\", onImageLoad);\n          window.removeEventListener(\"blur\", onWindowBlur);\n          finishDrag();\n          wrapper.remove();\n          if (convertedBlob) {\n            URL.revokeObjectURL(url);\n          } else if (url) {\n            revokeObjectUrl(url, isExternal);\n          }\n        }\n      };\n    }\n  };\n}\n\nasync function createTiffPreview(bytes: Uint8Array, fileName: string): Promise<HTMLElement> {\n  if (bytes.byteLength === 0) {\n    throw new Error(\"无法读取 TIFF 文件内容。\");\n  }\n  const UTIF = await import(\"utif\");\n  const buffer = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;\n  const ifds = UTIF.decode(buffer);\n  const imageIfds = ifds.filter((item) => hasTiffDimensions(item));\n  if (imageIfds.length === 0) {\n    throw new Error(\"TIFF 文件没有可解码的图像目录。\");\n  }\n\n  const pages = imageIfds.map((ifd, index) => createTiffPage(UTIF, buffer, ifd, index, imageIfds.length, fileName));\n  if (pages.length === 1) {\n    return pages[0].canvas;\n  }\n\n  const container = document.createElement(\"div\");\n  container.className = \"ofv-tiff-pages\";\n  container.setAttribute(\"role\", \"group\");\n  container.setAttribute(\"aria-label\", `${fileName}，共 ${pages.length} 页`);\n\n  for (const page of pages) {\n    const figure = document.createElement(\"figure\");\n    figure.className = \"ofv-tiff-page\";\n    const caption = document.createElement(\"figcaption\");\n    caption.textContent = `第 ${page.index + 1} / ${pages.length} 页 · ${page.width} x ${page.height}px`;\n    figure.append(page.canvas, caption);\n    container.append(figure);\n  }\n\n  return container;\n}\n\nfunction createTiffPage(\n  UTIF: { decodeImage(buffer: ArrayBuffer, ifd: Record<string, unknown>): void; toRGBA8(ifd: Record<string, unknown>): Uint8Array },\n  buffer: ArrayBuffer,\n  ifd: Record<string, unknown>,\n  index: number,\n  total: number,\n  fileName: string\n): { canvas: HTMLCanvasElement; width: number; height: number; index: number } {\n  UTIF.decodeImage(buffer, ifd);\n  const rgba = UTIF.toRGBA8(ifd);\n  const { width, height } = getTiffDimensions(ifd);\n  if (!width || !height || rgba.length < width * height * 4) {\n    throw new Error(\"TIFF 图像像素数据不完整。\");\n  }\n\n  const canvas = document.createElement(\"canvas\");\n  canvas.className = \"ofv-tiff-canvas\";\n  canvas.width = width;\n  canvas.height = height;\n  canvas.setAttribute(\"role\", \"img\");\n  canvas.setAttribute(\"aria-label\", total > 1 ? `${fileName} 第 ${index + 1} 页` : fileName);\n  const context = canvas.getContext(\"2d\");\n  if (!context) {\n    throw new Error(\"当前环境不支持 Canvas 2D，无法展示 TIFF。\");\n  }\n  context.putImageData(new ImageData(new Uint8ClampedArray(rgba), width, height), 0, 0);\n  return { canvas, width, height, index };\n}\n\nfunction hasTiffDimensions(ifd: Record<string, unknown>): boolean {\n  const { width, height } = getTiffDimensions(ifd);\n  return width > 0 && height > 0;\n}\n\nfunction getTiffDimensions(ifd: Record<string, unknown>): { width: number; height: number } {\n  return {\n    width: Number(ifd.width || ifd.t256 || 0),\n    height: Number(ifd.height || ifd.t257 || 0)\n  };\n}\n\nfunction createImageFallback(fileName: string, url: string, messages: PreviewContext[\"options\"][\"messages\"]): HTMLElement {\n  const fallback = document.createElement(\"div\");\n  fallback.className = \"ofv-fallback\";\n\n  const title = document.createElement(\"strong\");\n  title.textContent = messages.imagePreviewFailedTitle;\n\n  const meta = document.createElement(\"span\");\n  meta.textContent = messages.imagePreviewFailedMessage;\n\n  const download = document.createElement(\"a\");\n  download.href = url;\n  download.download = fileName;\n  download.textContent = messages.imageDownload;\n\n  fallback.append(title, meta, download);\n  return fallback;\n}\n\ntype ImageInfo = {\n  format: string;\n  width?: number;\n  height?: number;\n  bitDepth?: string;\n  color?: string;\n  frames?: number;\n  count?: number;\n  note?: string;\n};\n\nasync function readImageBytes(file: { blob?: Blob; url?: string; source?: unknown }): Promise<Uint8Array> {\n  if (file.blob) {\n    return new Uint8Array(await file.blob.arrayBuffer().catch(() => new ArrayBuffer(0)));\n  }\n  const url = file.url || (typeof file.source === \"string\" ? file.source : \"\");\n  if (!url) {\n    return new Uint8Array();\n  }\n  try {\n    const response = await fetch(url);\n    if (!response.ok) {\n      return new Uint8Array();\n    }\n    return new Uint8Array(await response.arrayBuffer());\n  } catch {\n    return new Uint8Array();\n  }\n}\n\nfunction createImageInfoBar(bytes: Uint8Array, extension: string, mimeType: string, fileName: string): HTMLElement {\n  const info = parseImageInfo(bytes, extension, mimeType, fileName);\n  const bar = document.createElement(\"div\");\n  bar.className = \"ofv-image-info\";\n  appendImageInfo(bar, \"格式\", info.format);\n  if (info.width && info.height) {\n    appendImageInfo(bar, \"尺寸\", `${info.width} x ${info.height}px`);\n  }\n  if (info.bitDepth) {\n    appendImageInfo(bar, \"位深\", info.bitDepth);\n  }\n  if (info.color) {\n    appendImageInfo(bar, \"颜色\", info.color);\n  }\n  if (info.frames !== undefined) {\n    appendImageInfo(bar, \"帧\", String(info.frames));\n  }\n  if (info.count !== undefined) {\n    appendImageInfo(bar, \"图像\", String(info.count));\n  }\n  if (info.note) {\n    appendImageInfo(bar, \"说明\", info.note);\n  }\n  return bar;\n}\n\nfunction appendImageInfo(parent: HTMLElement, label: string, value: string): void {\n  const row = document.createElement(\"span\");\n  row.className = \"ofv-image-info-item\";\n  const key = document.createElement(\"span\");\n  key.textContent = label;\n  const content = document.createElement(\"strong\");\n  content.textContent = value;\n  row.append(key, content);\n  parent.append(row);\n}\n\nfunction parseImageInfo(bytes: Uint8Array, extension: string, mimeType: string, fileName: string): ImageInfo {\n  const fallbackFormat = (extension || mimeType || fileName.split(\".\").pop() || \"image\").toUpperCase();\n  if (bytes.length === 0) {\n    return { format: fallbackFormat, note: \"无法读取本地头信息\" };\n  }\n  return (\n    parsePngInfo(bytes) ||\n    parseJpegInfo(bytes) ||\n    parseGifInfo(bytes) ||\n    parseWebpInfo(bytes) ||\n    parseAvifInfo(bytes) ||\n    parseBmpInfo(bytes) ||\n    parseIcoInfo(bytes) ||\n    parseTiffInfo(bytes) ||\n    parseSvgInfo(bytes) ||\n    { format: fallbackFormat, note: \"暂未识别图片头结构\" }\n  );\n}\n\nfunction parsePngInfo(bytes: Uint8Array): ImageInfo | null {\n  if (bytes.length < 33 || !bytesMatch(bytes, 0, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])) {\n    return null;\n  }\n  const view = dataView(bytes);\n  const frames = countPngChunks(bytes, \"fcTL\");\n  return {\n    format: frames > 0 ? \"APNG\" : \"PNG\",\n    width: view.getUint32(16, false),\n    height: view.getUint32(20, false),\n    bitDepth: `${bytes[24]} bit`,\n    color: pngColorType(bytes[25]),\n    frames: frames > 0 ? frames : undefined\n  };\n}\n\nfunction parseJpegInfo(bytes: Uint8Array): ImageInfo | null {\n  if (bytes.length < 4 || bytes[0] !== 0xff || bytes[1] !== 0xd8) {\n    return null;\n  }\n  let offset = 2;\n  while (offset + 9 < bytes.length) {\n    if (bytes[offset] !== 0xff) {\n      offset++;\n      continue;\n    }\n    const marker = bytes[offset + 1];\n    offset += 2;\n    while (bytes[offset] === 0xff) {\n      offset++;\n    }\n    if (marker === 0xd9 || marker === 0xda) {\n      break;\n    }\n    if (offset + 2 > bytes.length) {\n      break;\n    }\n    const length = (bytes[offset] << 8) | bytes[offset + 1];\n    if (length < 2 || offset + length > bytes.length) {\n      break;\n    }\n    if ((marker >= 0xc0 && marker <= 0xc3) || (marker >= 0xc5 && marker <= 0xc7) || (marker >= 0xc9 && marker <= 0xcb) || (marker >= 0xcd && marker <= 0xcf)) {\n      return {\n        format: \"JPEG\",\n        width: (bytes[offset + 5] << 8) | bytes[offset + 6],\n        height: (bytes[offset + 3] << 8) | bytes[offset + 4],\n        bitDepth: `${bytes[offset + 2]} bit`,\n        color: `${bytes[offset + 7]} component`\n      };\n    }\n    offset += length;\n  }\n  return { format: \"JPEG\", note: \"未在头部扫描到 SOF 尺寸段\" };\n}\n\nfunction parseGifInfo(bytes: Uint8Array): ImageInfo | null {\n  const header = asciiAt(bytes, 0, 6);\n  if (header !== \"GIF87a\" && header !== \"GIF89a\") {\n    return null;\n  }\n  const packed = bytes[10] || 0;\n  return {\n    format: header,\n    width: readUint16Le(bytes, 6),\n    height: readUint16Le(bytes, 8),\n    bitDepth: `${(packed & 0x07) + 1} bit`,\n    color: (packed & 0x80) ? \"Global color table\" : \"No global color table\",\n    frames: countGifFrames(bytes)\n  };\n}\n\nfunction parseWebpInfo(bytes: Uint8Array): ImageInfo | null {\n  if (bytes.length < 16 || asciiAt(bytes, 0, 4) !== \"RIFF\" || asciiAt(bytes, 8, 4) !== \"WEBP\") {\n    return null;\n  }\n  const chunk = asciiAt(bytes, 12, 4);\n  if (chunk === \"VP8X\" && bytes.length >= 30) {\n    const flags = bytes[20];\n    return {\n      format: \"WebP\",\n      width: 1 + readUint24Le(bytes, 24),\n      height: 1 + readUint24Le(bytes, 27),\n      frames: (flags & 0x02) !== 0 ? countWebpAnimationFrames(bytes) : undefined,\n      color: (flags & 0x10) !== 0 ? \"Alpha\" : undefined\n    };\n  }\n  if (chunk === \"VP8 \" && bytes.length >= 30) {\n    const start = 20;\n    if (bytes[start + 3] === 0x9d && bytes[start + 4] === 0x01 && bytes[start + 5] === 0x2a) {\n      return {\n        format: \"WebP\",\n        width: readUint16Le(bytes, start + 6) & 0x3fff,\n        height: readUint16Le(bytes, start + 8) & 0x3fff\n      };\n    }\n  }\n  if (chunk === \"VP8L\" && bytes.length >= 25) {\n    const b0 = bytes[21];\n    const b1 = bytes[22];\n    const b2 = bytes[23];\n    const b3 = bytes[24];\n    return {\n      format: \"WebP\",\n      width: 1 + (((b1 & 0x3f) << 8) | b0),\n      height: 1 + (((b3 & 0x0f) << 10) | (b2 << 2) | ((b1 & 0xc0) >> 6)),\n      color: \"Lossless\"\n    };\n  }\n  return { format: \"WebP\", note: `未知 ${chunk || \"chunk\"} 头` };\n}\n\nfunction parseAvifInfo(bytes: Uint8Array): ImageInfo | null {\n  const boxes = collectBmffBoxes(bytes, 0, bytes.length);\n  const ftyp = boxes.find((box) => box.type === \"ftyp\");\n  if (!ftyp) {\n    return null;\n  }\n  const majorBrand = asciiAt(bytes, ftyp.dataStart, 4);\n  const compatibleBrands = asciiAt(bytes, ftyp.dataStart + 8, Math.max(0, ftyp.dataEnd - ftyp.dataStart - 8));\n  if (!/\\b(avif|avis|mif1|msf1|heic|heix|hevc|hevx)\\b/.test(`${majorBrand} ${compatibleBrands}`)) {\n    return null;\n  }\n  const ispe = findBmffBox(bytes, boxes, \"ispe\");\n  return {\n    format: majorBrand === \"avis\" || compatibleBrands.includes(\"avis\") ? \"AVIF Sequence\" : majorBrand.startsWith(\"hei\") ? \"HEIF\" : \"AVIF\",\n    width: ispe && ispe.dataStart + 12 <= ispe.dataEnd ? readUint32Be(bytes, ispe.dataStart + 4) : undefined,\n    height: ispe && ispe.dataStart + 12 <= ispe.dataEnd ? readUint32Be(bytes, ispe.dataStart + 8) : undefined,\n    note: `brand ${majorBrand}${compatibleBrands.trim() ? ` · ${formatBmffBrands(compatibleBrands)}` : \"\"}`\n  };\n}\n\ntype BmffBox = {\n  type: string;\n  start: number;\n  dataStart: number;\n  dataEnd: number;\n  end: number;\n};\n\nfunction collectBmffBoxes(bytes: Uint8Array, start: number, end: number): BmffBox[] {\n  const boxes: BmffBox[] = [];\n  let offset = start;\n  while (offset + 8 <= end && boxes.length < 512) {\n    let size = readUint32Be(bytes, offset);\n    const type = asciiAt(bytes, offset + 4, 4);\n    let headerSize = 8;\n    if (!/^[A-Za-z0-9 _-]{4}$/.test(type)) {\n      break;\n    }\n    if (size === 1 && offset + 16 <= end) {\n      const high = readUint32Be(bytes, offset + 8);\n      const low = readUint32Be(bytes, offset + 12);\n      size = high > 0 ? end - offset : low;\n      headerSize = 16;\n    } else if (size === 0) {\n      size = end - offset;\n    }\n    if (size < headerSize || offset + size > end) {\n      break;\n    }\n    boxes.push({\n      type,\n      start: offset,\n      dataStart: offset + headerSize,\n      dataEnd: offset + size,\n      end: offset + size\n    });\n    offset += size;\n  }\n  return boxes;\n}\n\nfunction findBmffBox(bytes: Uint8Array, boxes: BmffBox[], type: string): BmffBox | undefined {\n  for (const box of boxes) {\n    if (box.type === type) {\n      return box;\n    }\n    if ([\"meta\", \"iprp\", \"ipco\", \"moov\", \"trak\", \"mdia\", \"minf\", \"stbl\"].includes(box.type)) {\n      const childStart = box.type === \"meta\" ? box.dataStart + 4 : box.dataStart;\n      const found = findBmffBox(bytes, collectBmffBoxes(bytes, childStart, box.dataEnd), type);\n      if (found) {\n        return found;\n      }\n    }\n  }\n  return undefined;\n}\n\nfunction formatBmffBrands(value: string): string {\n  const brands = value.match(/.{1,4}/g)?.map((brand) => brand.trim()).filter(Boolean) || [];\n  return brands.slice(0, 6).join(\", \");\n}\n\nfunction parseBmpInfo(bytes: Uint8Array): ImageInfo | null {\n  if (bytes.length < 30 || asciiAt(bytes, 0, 2) !== \"BM\") {\n    return null;\n  }\n  const dibSize = readUint32Le(bytes, 14);\n  if (dibSize < 12) {\n    return { format: \"BMP\", note: \"DIB header 太短\" };\n  }\n  if (dibSize === 12 && bytes.length >= 26) {\n    return {\n      format: \"BMP\",\n      width: readUint16Le(bytes, 18),\n      height: readUint16Le(bytes, 20),\n      bitDepth: `${readUint16Le(bytes, 24)} bit`\n    };\n  }\n  return {\n    format: \"BMP\",\n    width: readInt32Le(bytes, 18),\n    height: Math.abs(readInt32Le(bytes, 22)),\n    bitDepth: `${readUint16Le(bytes, 28)} bit`\n  };\n}\n\nfunction parseIcoInfo(bytes: Uint8Array): ImageInfo | null {\n  if (bytes.length < 6 || readUint16Le(bytes, 0) !== 0 || ![1, 2].includes(readUint16Le(bytes, 2))) {\n    return null;\n  }\n  const count = readUint16Le(bytes, 4);\n  if (count < 1 || bytes.length < 6 + count * 16) {\n    return { format: \"ICO/CUR\", count };\n  }\n  const width = bytes[6] || 256;\n  const height = bytes[7] || 256;\n  return {\n    format: readUint16Le(bytes, 2) === 1 ? \"ICO\" : \"CUR\",\n    width,\n    height,\n    bitDepth: `${readUint16Le(bytes, 12)} bit`,\n    count\n  };\n}\n\nfunction parseSvgInfo(bytes: Uint8Array): ImageInfo | null {\n  const text = new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes.slice(0, Math.min(bytes.length, 8192)));\n  if (!/<svg[\\s>]/i.test(text)) {\n    return null;\n  }\n  const tag = text.match(/<svg\\b[^>]*>/i)?.[0] || \"\";\n  const width = numberAttribute(tag, \"width\");\n  const height = numberAttribute(tag, \"height\");\n  const viewBox = tag.match(/\\bviewBox=[\"']([^\"']+)[\"']/i)?.[1]?.trim();\n  const viewBoxParts = viewBox?.split(/[\\s,]+/).map(Number).filter(Number.isFinite);\n  return {\n    format: \"SVG\",\n    width: width || (viewBoxParts?.length === 4 ? viewBoxParts[2] : undefined),\n    height: height || (viewBoxParts?.length === 4 ? viewBoxParts[3] : undefined),\n    note: viewBox ? `viewBox ${viewBox}` : undefined\n  };\n}\n\nfunction parseTiffInfo(bytes: Uint8Array): ImageInfo | null {\n  if (bytes.length < 8) {\n    return null;\n  }\n  const littleEndian = asciiAt(bytes, 0, 2) === \"II\";\n  const bigEndian = asciiAt(bytes, 0, 2) === \"MM\";\n  if (!littleEndian && !bigEndian) {\n    return null;\n  }\n  const magic = readTiffUint16(bytes, 2, littleEndian);\n  if (magic !== 42 && magic !== 43) {\n    return null;\n  }\n  const ifdOffset = magic === 43 ? readTiffUint64AsNumber(bytes, 8, littleEndian) : readTiffUint32(bytes, 4, littleEndian);\n  if (!Number.isFinite(ifdOffset) || ifdOffset + 2 > bytes.length) {\n    return { format: magic === 43 ? \"BigTIFF\" : \"TIFF\", note: \"IFD 偏移超出文件范围\" };\n  }\n  const count = magic === 43 ? readTiffUint64AsNumber(bytes, ifdOffset, littleEndian) : readTiffUint16(bytes, ifdOffset, littleEndian);\n  const imageCount = countTiffIfds(bytes, ifdOffset, magic === 43, littleEndian);\n  const entrySize = magic === 43 ? 20 : 12;\n  const entriesStart = ifdOffset + (magic === 43 ? 8 : 2);\n  let width: number | undefined;\n  let height: number | undefined;\n  let bitDepth: number | undefined;\n  let compression: number | undefined;\n  for (let index = 0; index < Math.min(count, 256); index++) {\n    const offset = entriesStart + index * entrySize;\n    if (offset + entrySize > bytes.length) {\n      break;\n    }\n    const tag = readTiffUint16(bytes, offset, littleEndian);\n    const type = readTiffUint16(bytes, offset + 2, littleEndian);\n    const valueOffset = magic === 43 ? offset + 12 : offset + 8;\n    const value = readTiffInlineValue(bytes, valueOffset, type, littleEndian);\n    if (tag === 256) width = value;\n    if (tag === 257) height = value;\n    if (tag === 258) bitDepth = value;\n    if (tag === 259) compression = value;\n  }\n  return {\n    format: magic === 43 ? \"BigTIFF\" : \"TIFF\",\n    width,\n    height,\n    bitDepth: bitDepth ? `${bitDepth} bit` : undefined,\n    color: compression ? tiffCompressionName(compression) : undefined,\n    count: imageCount || undefined\n  };\n}\n\nfunction countTiffIfds(bytes: Uint8Array, firstOffset: number, bigTiff: boolean, littleEndian: boolean): number {\n  const seen = new Set<number>();\n  let offset = firstOffset;\n  let count = 0;\n  while (Number.isFinite(offset) && offset > 0 && offset < bytes.length && !seen.has(offset) && count < 512) {\n    seen.add(offset);\n    const entryCount = bigTiff ? readTiffUint64AsNumber(bytes, offset, littleEndian) : readTiffUint16(bytes, offset, littleEndian);\n    const entrySize = bigTiff ? 20 : 12;\n    const nextOffsetPosition = offset + (bigTiff ? 8 : 2) + entryCount * entrySize;\n    if (!Number.isFinite(entryCount) || nextOffsetPosition + (bigTiff ? 8 : 4) > bytes.length) {\n      break;\n    }\n    count++;\n    offset = bigTiff\n      ? readTiffUint64AsNumber(bytes, nextOffsetPosition, littleEndian)\n      : readTiffUint32(bytes, nextOffsetPosition, littleEndian);\n  }\n  return count;\n}\n\nfunction readTiffInlineValue(bytes: Uint8Array, offset: number, type: number, littleEndian: boolean): number | undefined {\n  if (offset + 4 > bytes.length) {\n    return undefined;\n  }\n  if (type === 3) {\n    return readTiffUint16(bytes, offset, littleEndian);\n  }\n  if (type === 4 || type === 13) {\n    return readTiffUint32(bytes, offset, littleEndian);\n  }\n  return readTiffUint16(bytes, offset, littleEndian);\n}\n\nfunction tiffCompressionName(value: number): string {\n  const names: Record<number, string> = {\n    1: \"Uncompressed\",\n    3: \"CCITT Group 3\",\n    4: \"CCITT Group 4\",\n    5: \"LZW\",\n    6: \"Old JPEG\",\n    7: \"JPEG\",\n    8: \"Deflate\",\n    32773: \"PackBits\"\n  };\n  return names[value] || `Compression ${value}`;\n}\n\nfunction countPngChunks(bytes: Uint8Array, chunkType: string): number {\n  let offset = 8;\n  let count = 0;\n  while (offset + 12 <= bytes.length) {\n    const length = readUint32Be(bytes, offset);\n    const type = asciiAt(bytes, offset + 4, 4);\n    if (type === chunkType) {\n      count++;\n    }\n    offset += 12 + length;\n  }\n  return count;\n}\n\nfunction countGifFrames(bytes: Uint8Array): number {\n  let count = 0;\n  for (let index = 13; index < bytes.length; index++) {\n    if (bytes[index] === 0x2c) {\n      count++;\n    }\n  }\n  return count || 1;\n}\n\nfunction countWebpAnimationFrames(bytes: Uint8Array): number {\n  let count = 0;\n  for (let offset = 12; offset + 8 <= bytes.length; ) {\n    const type = asciiAt(bytes, offset, 4);\n    const size = readUint32Le(bytes, offset + 4);\n    if (type === \"ANMF\") {\n      count++;\n    }\n    offset += 8 + size + (size % 2);\n  }\n  return count || 1;\n}\n\nfunction pngColorType(value: number): string {\n  const colors: Record<number, string> = {\n    0: \"Grayscale\",\n    2: \"Truecolor\",\n    3: \"Indexed color\",\n    4: \"Grayscale + alpha\",\n    6: \"Truecolor + alpha\"\n  };\n  return colors[value] || `Unknown (${value})`;\n}\n\nfunction numberAttribute(tag: string, name: string): number | undefined {\n  const value = tag.match(new RegExp(`\\\\b${name}=[\"']([0-9.]+)`, \"i\"))?.[1];\n  const parsed = Number(value);\n  return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction bytesMatch(bytes: Uint8Array, offset: number, expected: number[]): boolean {\n  return expected.every((byte, index) => bytes[offset + index] === byte);\n}\n\nfunction dataView(bytes: Uint8Array): DataView {\n  return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n}\n\nfunction asciiAt(bytes: Uint8Array, offset: number, length: number): string {\n  if (offset < 0 || offset + length > bytes.length) {\n    return \"\";\n  }\n  return new TextDecoder(\"ascii\").decode(bytes.slice(offset, offset + length));\n}\n\nfunction readUint16Le(bytes: Uint8Array, offset: number): number {\n  return dataView(bytes).getUint16(offset, true);\n}\n\nfunction readUint24Le(bytes: Uint8Array, offset: number): number {\n  return bytes[offset] | (bytes[offset + 1] << 8) | (bytes[offset + 2] << 16);\n}\n\nfunction readUint32Le(bytes: Uint8Array, offset: number): number {\n  return dataView(bytes).getUint32(offset, true);\n}\n\nfunction readUint32Be(bytes: Uint8Array, offset: number): number {\n  return dataView(bytes).getUint32(offset, false);\n}\n\nfunction readInt32Le(bytes: Uint8Array, offset: number): number {\n  return dataView(bytes).getInt32(offset, true);\n}\n\nfunction readTiffUint16(bytes: Uint8Array, offset: number, littleEndian: boolean): number {\n  return dataView(bytes).getUint16(offset, littleEndian);\n}\n\nfunction readTiffUint32(bytes: Uint8Array, offset: number, littleEndian: boolean): number {\n  return dataView(bytes).getUint32(offset, littleEndian);\n}\n\nfunction readTiffUint64AsNumber(bytes: Uint8Array, offset: number, littleEndian: boolean): number {\n  if (offset + 8 > bytes.length) {\n    return Number.NaN;\n  }\n  const view = dataView(bytes);\n  const low = view.getUint32(offset + (littleEndian ? 0 : 4), littleEndian);\n  const high = view.getUint32(offset + (littleEndian ? 4 : 0), littleEndian);\n  return high * 2 ** 32 + low;\n}\n\nfunction objectFit(fit: string): string {\n  if (fit === \"cover\") {\n    return \"cover\";\n  }\n  if (fit === \"actual\") {\n    return \"none\";\n  }\n  if (fit === \"scale-down\") {\n    return \"scale-down\";\n  }\n  return \"contain\";\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewCommand, PreviewContext, PreviewPlugin } from \"../types\";\n\ntype MpegtsModule = {\n  default?: MpegtsApi;\n} & Partial<MpegtsApi>;\n\ntype MpegtsApi = {\n  Events: { ERROR: string };\n  isSupported(): boolean;\n  createPlayer(options: { type: \"flv\" | \"mpegts\"; url: string }): {\n    attachMediaElement(video: HTMLVideoElement): void;\n    load(): void;\n    on(event: string, callback: (...args: unknown[]) => void): void;\n    unload(): void;\n    destroy(): void;\n  };\n};\n\ntype MpegtsLoader = () => Promise<MpegtsModule>;\n\nconst mpegtsPackageName = \"mpegts.js\";\n\nlet loadMpegts: MpegtsLoader = () => importOptionalModule<MpegtsModule>(mpegtsPackageName);\n\nconst videoExtensions = new Set([\n  \"mp4\",\n  \"mpg\",\n  \"mpeg\",\n  \"mpe\",\n  \"mpv\",\n  \"webm\",\n  \"ogv\",\n  \"mov\",\n  \"m4v\",\n  \"avi\",\n  \"mkv\",\n  \"flv\",\n  \"wmv\",\n  \"3gp\",\n  \"3g2\",\n  \"m2ts\",\n  \"m3u8\"\n]);\nconst videoMimeTypes = new Set([\n  \"application/vnd.apple.mpegurl\",\n  \"application/x-mpegurl\",\n  \"application/mpegurl\",\n  \"application/dash+xml\"\n]);\nconst hlsMimeTypes = new Set([\"application/vnd.apple.mpegurl\", \"application/x-mpegurl\", \"application/mpegurl\"]);\n\nexport interface VideoPluginOptions {\n  /** Space-separated restrictions for the browser's native video controls, such as \"nodownload\". */\n  controlsList?: string;\n}\n\nexport function videoPlugin(options: VideoPluginOptions = {}): PreviewPlugin {\n  return {\n    name: \"video\",\n    match(file) {\n      return file.mimeType.startsWith(\"video/\") || videoMimeTypes.has(file.mimeType) || videoExtensions.has(file.extension);\n    },\n    async render(ctx) {\n      const url = createObjectUrl(ctx.file);\n      const isExternal = Boolean(ctx.file.url);\n      const mimeType = ctx.file.mimeType.toLowerCase();\n      const bytes = await readVideoBytes(ctx.file.blob);\n      \n      const container = document.createElement(\"div\");\n      container.className = \"ofv-video-container\";\n      const stage = document.createElement(\"div\");\n      stage.className = \"ofv-video-stage\";\n\n      const video = document.createElement(\"video\");\n      video.className = \"ofv-media\";\n      video.controls = true;\n      video.playsInline = true;\n      video.preload = \"metadata\";\n      if (options.controlsList !== undefined) {\n        video.setAttribute(\"controlslist\", options.controlsList);\n      }\n      video.style.objectFit = ctx.options.fit === \"cover\" ? \"cover\" : \"contain\";\n      \n      const ext = ctx.file.extension.toLowerCase();\n      const infoBar = createVideoInfo(parseVideoInfo(bytes, ext, mimeType, ctx.file.name));\n      infoBar.hidden = true;\n      infoBar.setAttribute(\"aria-hidden\", \"true\");\n      infoBar.style.display = \"none\";\n      stage.append(video);\n      container.append(stage, infoBar);\n      ctx.viewport.classList.add(\"ofv-center\");\n      ctx.viewport.append(container);\n\n      let hlsInstance: any = null;\n      let mpegtsPlayer: any = null;\n      const isHls = ext === \"m3u8\" || hlsMimeTypes.has(mimeType);\n      const isMpegTs = ext === \"m2ts\" || mimeType === \"video/mp2t\";\n      const isDash = mimeType === \"application/dash+xml\";\n      const isFlv = ext === \"flv\" || mimeType === \"video/x-flv\";\n      const formatLabel = (ctx.file.extension || ctx.file.mimeType || \"video\").toUpperCase();\n      const controller = createVideoTransformController(video, ctx);\n\n      const showTranscodeFallback = () => {\n        video.pause();\n        video.remove();\n        controller.setAvailable(false);\n        ctx.toolbar?.refreshCommandSupport();\n        infoBar.hidden = false;\n        infoBar.removeAttribute(\"aria-hidden\");\n        infoBar.style.removeProperty(\"display\");\n        \n        // Remove any existing fallback UI first\n        const oldFallback = stage.querySelector(\".ofv-fallback\");\n        if (oldFallback) {\n          oldFallback.remove();\n        }\n\n        const fallback = document.createElement(\"div\");\n        fallback.className = \"ofv-fallback\";\n        \n        const title = document.createElement(\"strong\");\n        title.textContent = `当前浏览器不支持直接播放该视频格式 (${formatLabel})`;\n        \n        const meta = document.createElement(\"span\");\n        meta.textContent = \"建议转换为 MP4 格式播放，或直接下载在本地播放。\";\n        \n        const download = document.createElement(\"a\");\n        download.href = url;\n        download.download = ctx.file.name;\n        download.textContent = \"下载视频\";\n        \n        fallback.append(title, meta, download);\n        stage.append(fallback);\n      };\n\n      const onVideoError = () => {\n        showTranscodeFallback();\n      };\n\n      video.addEventListener(\"error\", onVideoError);\n      ctx.toolbar?.refreshCommandSupport();\n\n      try {\n        if (isDash) {\n          showTranscodeFallback();\n        } else if (isHls) {\n          const Hls = (await import(\"hls.js\")).default;\n          if (Hls.isSupported()) {\n            hlsInstance = new Hls();\n            hlsInstance.loadSource(url);\n            hlsInstance.attachMedia(video);\n            hlsInstance.on(Hls.Events.ERROR, (_event: any, data: any) => {\n              if (data.fatal) {\n                showTranscodeFallback();\n              }\n            });\n          } else if (video.canPlayType(\"application/vnd.apple.mpegurl\")) {\n            video.src = url;\n          } else {\n            showTranscodeFallback();\n          }\n        } else if (isFlv || isMpegTs) {\n          const mpegtsModule = await loadMpegts();\n          const mpegts = resolveMpegtsApi(mpegtsModule);\n          if (mpegts.isSupported()) {\n            mpegtsPlayer = mpegts.createPlayer({\n              type: isFlv ? \"flv\" : \"mpegts\",\n              url: url\n            });\n            mpegtsPlayer.attachMediaElement(video);\n            mpegtsPlayer.load();\n            mpegtsPlayer.on(mpegts.Events.ERROR, () => {\n              showTranscodeFallback();\n            });\n          } else {\n            showTranscodeFallback();\n          }\n        } else {\n          // Native playback for mp4, webm, mov, ogg, etc.\n          video.src = url;\n        }\n      } catch (err) {\n        showTranscodeFallback();\n      }\n\n      return {\n        canCommand(command) {\n          return controller.canCommand(command);\n        },\n        command(command) {\n          return controller.command(command);\n        },\n        resize() {\n          video.style.width = \"100%\";\n          video.style.height = \"100%\";\n        },\n        destroy() {\n          video.removeEventListener(\"error\", onVideoError);\n          if (video.isConnected) {\n            video.pause();\n          }\n          controller.destroy();\n          \n          if (hlsInstance) {\n            hlsInstance.destroy();\n          }\n          if (mpegtsPlayer) {\n            mpegtsPlayer.unload();\n            mpegtsPlayer.destroy();\n          }\n\n          ctx.viewport.classList.remove(\"ofv-center\");\n          revokeObjectUrl(url, isExternal);\n          container.remove();\n        }\n      };\n    }\n  };\n}\n\nexport function __setMpegtsLoaderForTests(loader: MpegtsLoader | null): void {\n  loadMpegts = loader || (() => importOptionalModule<MpegtsModule>(mpegtsPackageName));\n}\n\nfunction importOptionalModule<T>(packageName: string): Promise<T> {\n  return new Function(\"packageName\", \"return import(packageName)\")(packageName) as Promise<T>;\n}\n\nfunction resolveMpegtsApi(module: MpegtsModule): MpegtsApi {\n  const api = module.default || module;\n  if (!api.Events || !api.isSupported || !api.createPlayer) {\n    throw new Error(\"mpegts.js is not available.\");\n  }\n  return api as MpegtsApi;\n}\n\nfunction createVideoTransformController(video: HTMLVideoElement, ctx: Pick<PreviewContext, \"toolbar\">) {\n  let scale = 1;\n  let rotation = 0;\n  let available = true;\n  const apply = () => {\n    video.style.transform = `scale(${scale}) rotate(${rotation}deg)`;\n    video.style.transformOrigin = \"center\";\n    ctx.toolbar?.setZoom(available ? scale : undefined);\n  };\n  apply();\n\n  const canTransform = (command: PreviewCommand) =>\n    available &&\n    (command === \"zoom-in\" ||\n      command === \"zoom-out\" ||\n      command === \"zoom-reset\" ||\n      command === \"rotate-right\" ||\n      command === \"rotate-left\");\n\n  return {\n    setAvailable(nextAvailable: boolean) {\n      available = nextAvailable;\n      if (available) {\n        apply();\n      } else {\n        ctx.toolbar?.setZoom(undefined);\n      }\n    },\n    canCommand(command: PreviewCommand) {\n      return canTransform(command);\n    },\n    command(command: PreviewCommand) {\n      if (!canTransform(command)) {\n        return false;\n      }\n      if (command === \"zoom-in\") {\n        scale = Math.min(4, Number((scale + 0.25).toFixed(2)));\n        apply();\n        return true;\n      }\n      if (command === \"zoom-out\") {\n        scale = Math.max(0.25, Number((scale - 0.25).toFixed(2)));\n        apply();\n        return true;\n      }\n      if (command === \"zoom-reset\") {\n        scale = 1;\n        rotation = 0;\n        apply();\n        return true;\n      }\n      if (command === \"rotate-right\") {\n        rotation += 90;\n        apply();\n        return true;\n      }\n      if (command === \"rotate-left\") {\n        rotation -= 90;\n        apply();\n        return true;\n      }\n      return false;\n    },\n    destroy() {\n      ctx.toolbar?.setZoom(undefined);\n    }\n  };\n}\n\ntype VideoInfo = {\n  format: string;\n  codec?: string;\n  width?: number;\n  height?: number;\n  duration?: string;\n  bitrate?: string;\n  tracks?: number;\n  variants?: number;\n  segments?: number;\n  note?: string;\n};\n\nasync function readVideoBytes(blob?: Blob): Promise<Uint8Array> {\n  if (!blob) {\n    return new Uint8Array();\n  }\n  return new Uint8Array(await blob.arrayBuffer().catch(() => new ArrayBuffer(0)));\n}\n\nfunction createVideoInfo(info: VideoInfo): HTMLElement {\n  const bar = document.createElement(\"div\");\n  bar.className = \"ofv-media-info\";\n  appendMediaInfo(bar, \"格式\", info.format);\n  if (info.codec) {\n    appendMediaInfo(bar, \"编码\", info.codec);\n  }\n  if (info.width && info.height) {\n    appendMediaInfo(bar, \"尺寸\", `${info.width} x ${info.height}px`);\n  }\n  if (info.duration) {\n    appendMediaInfo(bar, \"时长\", info.duration);\n  }\n  if (info.bitrate) {\n    appendMediaInfo(bar, \"码率\", info.bitrate);\n  }\n  if (info.tracks !== undefined) {\n    appendMediaInfo(bar, \"轨道\", String(info.tracks));\n  }\n  if (info.variants !== undefined) {\n    appendMediaInfo(bar, \"变体\", String(info.variants));\n  }\n  if (info.segments !== undefined) {\n    appendMediaInfo(bar, \"片段\", String(info.segments));\n  }\n  if (info.note) {\n    appendMediaInfo(bar, \"说明\", info.note);\n  }\n  return bar;\n}\n\nfunction appendMediaInfo(parent: HTMLElement, label: string, value: string): void {\n  const item = document.createElement(\"span\");\n  item.className = \"ofv-media-info-item\";\n  const key = document.createElement(\"span\");\n  key.textContent = label;\n  const content = document.createElement(\"strong\");\n  content.textContent = value;\n  item.append(key, content);\n  parent.append(item);\n}\n\nfunction parseVideoInfo(bytes: Uint8Array, extension: string, mimeType: string, fileName: string): VideoInfo {\n  const fallback = (extension || mimeType || fileName.split(\".\").pop() || \"video\").toUpperCase();\n  if (bytes.length === 0) {\n    return { format: fallback, note: \"无法读取本地头信息\" };\n  }\n  return parseHlsInfo(bytes) || parseDashInfo(bytes) || parseMp4Info(bytes) || parseAviInfo(bytes) || parseEbmlInfo(bytes) || {\n    format: fallback,\n    note: \"暂未识别视频头结构\"\n  };\n}\n\nfunction parseMp4Info(bytes: Uint8Array): VideoInfo | null {\n  if (bytes.length < 12 || asciiAt(bytes, 4, 4) !== \"ftyp\") {\n    return null;\n  }\n  const majorBrand = asciiAt(bytes, 8, 4);\n  const info: VideoInfo = { format: [\"qt  \"].includes(majorBrand) ? \"MOV\" : \"MP4\", codec: majorBrand };\n  const atoms = collectMp4Atoms(bytes, 0, bytes.length);\n  const moov = atoms.find((atom) => atom.type === \"moov\");\n  if (moov) {\n    const children = collectMp4Atoms(bytes, moov.start + moov.headerSize, moov.end);\n    const mvhd = children.find((atom) => atom.type === \"mvhd\");\n    if (mvhd) {\n      const duration = readMp4MvhdDuration(bytes, mvhd.start + mvhd.headerSize);\n      if (duration !== undefined) {\n        info.duration = formatDuration(duration);\n      }\n    }\n    const tracks = children.filter((atom) => atom.type === \"trak\");\n    info.tracks = tracks.length;\n    for (const track of tracks) {\n      const tkhd = collectMp4Atoms(bytes, track.start + track.headerSize, track.end).find((atom) => atom.type === \"tkhd\");\n      if (tkhd) {\n        const size = readMp4TkhdSize(bytes, tkhd.start + tkhd.headerSize);\n        if (size.width && size.height) {\n          info.width = size.width;\n          info.height = size.height;\n          break;\n        }\n      }\n    }\n  }\n  return info;\n}\n\ntype Mp4Atom = {\n  type: string;\n  start: number;\n  end: number;\n  headerSize: number;\n};\n\nfunction collectMp4Atoms(bytes: Uint8Array, start: number, end: number): Mp4Atom[] {\n  const atoms: Mp4Atom[] = [];\n  let offset = start;\n  while (offset + 8 <= end) {\n    let size = readUint32Be(bytes, offset);\n    const type = asciiAt(bytes, offset + 4, 4);\n    let headerSize = 8;\n    if (size === 1 && offset + 16 <= end) {\n      size = Number(readUint64Be(bytes, offset + 8));\n      headerSize = 16;\n    }\n    if (size < headerSize || offset + size > end || !/^[\\w ]{4}$/.test(type)) {\n      break;\n    }\n    atoms.push({ type, start: offset, end: offset + size, headerSize });\n    offset += size;\n  }\n  return atoms;\n}\n\nfunction readMp4MvhdDuration(bytes: Uint8Array, offset: number): number | undefined {\n  if (offset + 20 > bytes.length) {\n    return undefined;\n  }\n  const version = bytes[offset];\n  if (version === 1 && offset + 32 <= bytes.length) {\n    const timescale = readUint32Be(bytes, offset + 20);\n    const duration = readUint64Be(bytes, offset + 24);\n    return timescale ? Number(duration) / timescale : undefined;\n  }\n  const timescale = readUint32Be(bytes, offset + 12);\n  const duration = readUint32Be(bytes, offset + 16);\n  return timescale ? duration / timescale : undefined;\n}\n\nfunction readMp4TkhdSize(bytes: Uint8Array, offset: number): { width?: number; height?: number } {\n  const version = bytes[offset];\n  const sizeOffset = version === 1 ? offset + 84 : offset + 72;\n  if (sizeOffset + 8 > bytes.length) {\n    return {};\n  }\n  return {\n    width: readUint32Be(bytes, sizeOffset) / 65536,\n    height: readUint32Be(bytes, sizeOffset + 4) / 65536\n  };\n}\n\nfunction parseAviInfo(bytes: Uint8Array): VideoInfo | null {\n  if (bytes.length < 64 || asciiAt(bytes, 0, 4) !== \"RIFF\" || asciiAt(bytes, 8, 4) !== \"AVI \") {\n    return null;\n  }\n  const avihOffset = findAscii(bytes, \"avih\", 12);\n  if (avihOffset < 0 || avihOffset + 56 > bytes.length) {\n    return { format: \"AVI\", note: \"未找到 avih header\" };\n  }\n  const microSecPerFrame = readUint32Le(bytes, avihOffset + 8);\n  const maxBytesPerSec = readUint32Le(bytes, avihOffset + 16);\n  const totalFrames = readUint32Le(bytes, avihOffset + 24);\n  const streams = readUint32Le(bytes, avihOffset + 32);\n  const width = readUint32Le(bytes, avihOffset + 40);\n  const height = readUint32Le(bytes, avihOffset + 44);\n  return {\n    format: \"AVI\",\n    width,\n    height,\n    tracks: streams,\n    bitrate: maxBytesPerSec ? `${Math.round((maxBytesPerSec * 8) / 1000)} kbps` : undefined,\n    duration: microSecPerFrame && totalFrames ? formatDuration((microSecPerFrame * totalFrames) / 1_000_000) : undefined\n  };\n}\n\nfunction parseEbmlInfo(bytes: Uint8Array): VideoInfo | null {\n  if (bytes.length < 8 || bytes[0] !== 0x1a || bytes[1] !== 0x45 || bytes[2] !== 0xdf || bytes[3] !== 0xa3) {\n    return null;\n  }\n  const root = collectEbmlElements(bytes, 0, bytes.length);\n  const header = root.find((element) => element.id === 0x1a45dfa3);\n  const headerChildren = header ? collectEbmlElements(bytes, header.dataStart, header.dataEnd) : [];\n  const docTypeValue = readEbmlString(bytes, headerChildren.find((element) => element.id === 0x4282));\n  const segment = root.find((element) => element.id === 0x18538067);\n  const segmentChildren = segment ? collectEbmlElements(bytes, segment.dataStart, segment.dataEnd) : [];\n  const info = parseEbmlSegmentInfo(bytes, segmentChildren.find((element) => element.id === 0x1549a966));\n  const tracks = parseEbmlTracks(bytes, segmentChildren.find((element) => element.id === 0x1654ae6b));\n  const docType = docTypeValue?.toLowerCase().includes(\"webm\")\n    ? \"WebM\"\n    : docTypeValue?.toLowerCase().includes(\"matroska\")\n      ? \"Matroska\"\n      : \"EBML\";\n  return {\n    format: docType,\n    codec: tracks.codecs.length > 0 ? tracks.codecs.slice(0, 4).join(\", \") : undefined,\n    width: tracks.width,\n    height: tracks.height,\n    duration: info.duration === undefined ? undefined : formatDuration(info.duration),\n    tracks: tracks.count || undefined,\n    note: docTypeValue ? `EBML DocType ${docTypeValue}` : \"已识别 EBML 容器\"\n  };\n}\n\ntype EbmlElement = {\n  id: number;\n  start: number;\n  dataStart: number;\n  dataEnd: number;\n  end: number;\n};\n\nfunction collectEbmlElements(bytes: Uint8Array, start: number, end: number, limit = 256): EbmlElement[] {\n  const elements: EbmlElement[] = [];\n  let offset = start;\n  while (offset < end && elements.length < limit) {\n    const id = readEbmlId(bytes, offset, end);\n    if (!id) {\n      break;\n    }\n    const size = readEbmlSize(bytes, id.offset, end);\n    if (!size) {\n      break;\n    }\n    const dataStart = size.offset;\n    const dataEnd = size.unknown ? end : dataStart + size.value;\n    if (dataEnd < dataStart || dataEnd > end) {\n      break;\n    }\n    elements.push({\n      id: id.value,\n      start: offset,\n      dataStart,\n      dataEnd,\n      end: dataEnd\n    });\n    offset = dataEnd;\n  }\n  return elements;\n}\n\nfunction readEbmlId(bytes: Uint8Array, offset: number, end: number): { value: number; offset: number } | undefined {\n  const length = ebmlVintLength(bytes[offset]);\n  if (!length || length > 4 || offset + length > end) {\n    return undefined;\n  }\n  let value = 0;\n  for (let index = 0; index < length; index++) {\n    value = value * 256 + bytes[offset + index];\n  }\n  return { value, offset: offset + length };\n}\n\nfunction readEbmlSize(bytes: Uint8Array, offset: number, end: number): { value: number; offset: number; unknown: boolean } | undefined {\n  const length = ebmlVintLength(bytes[offset]);\n  if (!length || length > 8 || offset + length > end) {\n    return undefined;\n  }\n  const firstMask = 0xff >> length;\n  let value = bytes[offset] & firstMask;\n  let max = firstMask;\n  for (let index = 1; index < length; index++) {\n    value = value * 256 + bytes[offset + index];\n    max = max * 256 + 0xff;\n  }\n  return { value, offset: offset + length, unknown: value === max };\n}\n\nfunction ebmlVintLength(firstByte: number | undefined): number {\n  if (!firstByte) {\n    return 0;\n  }\n  for (let length = 1; length <= 8; length++) {\n    if (firstByte & (0x80 >> (length - 1))) {\n      return length;\n    }\n  }\n  return 0;\n}\n\nfunction parseEbmlSegmentInfo(bytes: Uint8Array, element?: EbmlElement): { duration?: number } {\n  if (!element) {\n    return {};\n  }\n  const children = collectEbmlElements(bytes, element.dataStart, element.dataEnd);\n  const timecodeScale = readEbmlUInt(bytes, children.find((child) => child.id === 0x2ad7b1)) || 1_000_000;\n  const duration = readEbmlFloat(bytes, children.find((child) => child.id === 0x4489));\n  return {\n    duration: duration === undefined ? undefined : (duration * timecodeScale) / 1_000_000_000\n  };\n}\n\nfunction parseEbmlTracks(bytes: Uint8Array, element?: EbmlElement): { count: number; codecs: string[]; width?: number; height?: number } {\n  if (!element) {\n    return { count: 0, codecs: [] };\n  }\n  const trackEntries = collectEbmlElements(bytes, element.dataStart, element.dataEnd).filter((child) => child.id === 0xae);\n  const codecs: string[] = [];\n  let width: number | undefined;\n  let height: number | undefined;\n  for (const track of trackEntries) {\n    const children = collectEbmlElements(bytes, track.dataStart, track.dataEnd);\n    const codec = readEbmlString(bytes, children.find((child) => child.id === 0x86));\n    if (codec && !codecs.includes(codec)) {\n      codecs.push(codec);\n    }\n    const type = readEbmlUInt(bytes, children.find((child) => child.id === 0x83));\n    const video = children.find((child) => child.id === 0xe0);\n    if (type === 1 && video) {\n      const videoChildren = collectEbmlElements(bytes, video.dataStart, video.dataEnd);\n      width = readEbmlUInt(bytes, videoChildren.find((child) => child.id === 0xb0)) || width;\n      height = readEbmlUInt(bytes, videoChildren.find((child) => child.id === 0xba)) || height;\n    }\n  }\n  return { count: trackEntries.length, codecs, width, height };\n}\n\nfunction readEbmlString(bytes: Uint8Array, element?: EbmlElement): string | undefined {\n  if (!element || element.dataEnd <= element.dataStart || element.dataEnd - element.dataStart > 4096) {\n    return undefined;\n  }\n  return new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes.slice(element.dataStart, element.dataEnd)).replace(/\\0+$/g, \"\").trim();\n}\n\nfunction readEbmlUInt(bytes: Uint8Array, element?: EbmlElement): number | undefined {\n  if (!element || element.dataEnd <= element.dataStart || element.dataEnd - element.dataStart > 6) {\n    return undefined;\n  }\n  let value = 0;\n  for (let offset = element.dataStart; offset < element.dataEnd; offset++) {\n    value = value * 256 + bytes[offset];\n  }\n  return value;\n}\n\nfunction readEbmlFloat(bytes: Uint8Array, element?: EbmlElement): number | undefined {\n  if (!element) {\n    return undefined;\n  }\n  const data = view(bytes);\n  if (element.dataEnd - element.dataStart === 4) {\n    return data.getFloat32(element.dataStart, false);\n  }\n  if (element.dataEnd - element.dataStart === 8) {\n    return data.getFloat64(element.dataStart, false);\n  }\n  return undefined;\n}\n\nfunction parseHlsInfo(bytes: Uint8Array): VideoInfo | null {\n  const text = decodeTextHead(bytes);\n  if (!text.startsWith(\"#EXTM3U\")) {\n    return null;\n  }\n  const segments = countMatches(text, /^#EXTINF:/gm);\n  const variants = countMatches(text, /^#EXT-X-STREAM-INF:/gm);\n  const durations = [...text.matchAll(/^#EXTINF:([0-9.]+)/gm)].map((match) => Number(match[1])).filter(Number.isFinite);\n  const bandwidth = text.match(/BANDWIDTH=(\\d+)/i)?.[1];\n  return {\n    format: \"HLS\",\n    variants,\n    segments,\n    duration: durations.length > 0 ? formatDuration(durations.reduce((sum, value) => sum + value, 0)) : undefined,\n    bitrate: bandwidth ? `${Math.round(Number(bandwidth) / 1000)} kbps` : undefined\n  };\n}\n\nfunction parseDashInfo(bytes: Uint8Array): VideoInfo | null {\n  const text = decodeTextHead(bytes);\n  if (!/<MPD[\\s>]/i.test(text)) {\n    return null;\n  }\n  return {\n    format: \"DASH\",\n    duration: isoDurationToClock(text.match(/mediaPresentationDuration=[\"']([^\"']+)[\"']/i)?.[1]),\n    variants: countMatches(text, /<Representation\\b/gi),\n    segments: countMatches(text, /<SegmentURL\\b|<S\\b/gi)\n  };\n}\n\nfunction decodeTextHead(bytes: Uint8Array): string {\n  return new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes.slice(0, Math.min(bytes.length, 65536))).trim();\n}\n\nfunction countMatches(value: string, pattern: RegExp): number {\n  return [...value.matchAll(pattern)].length;\n}\n\nfunction isoDurationToClock(value?: string): string | undefined {\n  if (!value) {\n    return undefined;\n  }\n  const match = value.match(/^PT(?:(\\d+(?:\\.\\d+)?)H)?(?:(\\d+(?:\\.\\d+)?)M)?(?:(\\d+(?:\\.\\d+)?)S)?$/i);\n  if (!match) {\n    return value;\n  }\n  const seconds = Number(match[1] || 0) * 3600 + Number(match[2] || 0) * 60 + Number(match[3] || 0);\n  return formatDuration(seconds);\n}\n\nfunction formatDuration(seconds: number): string {\n  if (!Number.isFinite(seconds) || seconds <= 0) {\n    return \"\";\n  }\n  const total = Math.round(seconds);\n  const hours = Math.floor(total / 3600);\n  const minutes = Math.floor((total % 3600) / 60);\n  const rest = total % 60;\n  return hours > 0 ? `${hours}:${String(minutes).padStart(2, \"0\")}:${String(rest).padStart(2, \"0\")}` : `${minutes}:${String(rest).padStart(2, \"0\")}`;\n}\n\nfunction asciiAt(bytes: Uint8Array, offset: number, length: number): string {\n  if (offset < 0 || offset + length > bytes.length) {\n    return \"\";\n  }\n  return new TextDecoder(\"latin1\").decode(bytes.slice(offset, offset + length));\n}\n\nfunction findAscii(bytes: Uint8Array, value: string, start = 0): number {\n  const encoded = new TextEncoder().encode(value);\n  for (let offset = start; offset + encoded.length <= bytes.length; offset++) {\n    if (encoded.every((byte, index) => bytes[offset + index] === byte)) {\n      return offset;\n    }\n  }\n  return -1;\n}\n\nfunction view(bytes: Uint8Array): DataView {\n  return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n}\n\nfunction readUint32Le(bytes: Uint8Array, offset: number): number {\n  return view(bytes).getUint32(offset, true);\n}\n\nfunction readUint32Be(bytes: Uint8Array, offset: number): number {\n  return view(bytes).getUint32(offset, false);\n}\n\nfunction readUint64Be(bytes: Uint8Array, offset: number): bigint {\n  return (BigInt(readUint32Be(bytes, offset)) << 32n) | BigInt(readUint32Be(bytes, offset + 4));\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin } from \"../types\";\n\nconst audioExtensions = new Set([\n  \"mp3\",\n  \"wav\",\n  \"aif\",\n  \"aiff\",\n  \"aifc\",\n  \"ogg\",\n  \"oga\",\n  \"aac\",\n  \"m4a\",\n  \"flac\",\n  \"opus\",\n  \"weba\",\n  \"amr\",\n  \"mid\",\n  \"midi\",\n  \"caf\",\n  \"au\",\n  \"snd\",\n  \"wma\"\n]);\n\nexport function audioPlugin(): PreviewPlugin {\n  return {\n    name: \"audio\",\n    match(file) {\n      return file.mimeType.startsWith(\"audio/\") || audioExtensions.has(file.extension);\n    },\n    async render(ctx) {\n      const url = createObjectUrl(ctx.file);\n      const isExternal = Boolean(ctx.file.url);\n      const wrapper = document.createElement(\"div\");\n      wrapper.className = \"ofv-audio\";\n      const bytes = await readAudioBytes(ctx.file.blob);\n\n      const title = document.createElement(\"div\");\n      title.className = \"ofv-audio-title\";\n      title.textContent = ctx.file.name;\n\n      const audio = document.createElement(\"audio\");\n      audio.src = url;\n      audio.controls = true;\n      audio.preload = \"metadata\";\n\n      const infoBar = createAudioInfo(parseAudioInfo(bytes, ctx.file.extension, ctx.file.mimeType));\n      infoBar.hidden = true;\n      infoBar.setAttribute(\"aria-hidden\", \"true\");\n      infoBar.style.display = \"none\";\n      wrapper.append(title, audio, infoBar);\n      ctx.viewport.classList.add(\"ofv-center\");\n      ctx.viewport.append(wrapper);\n\n      const formatLabel = (ctx.file.extension || ctx.file.mimeType || \"audio\").toUpperCase();\n      const showPlaybackFallback = () => {\n        audio.pause();\n        audio.remove();\n        infoBar.hidden = false;\n        infoBar.removeAttribute(\"aria-hidden\");\n        infoBar.style.removeProperty(\"display\");\n\n        if (wrapper.querySelector(\".ofv-fallback\")) {\n          return;\n        }\n\n        const fallback = document.createElement(\"div\");\n        fallback.className = \"ofv-fallback\";\n\n        const fallbackTitle = document.createElement(\"strong\");\n        fallbackTitle.textContent = `当前浏览器不支持直接播放该音频格式 (${formatLabel})`;\n\n        const meta = document.createElement(\"span\");\n        meta.textContent = \"建议转换为 MP3/AAC/OGG 等浏览器兼容格式，或直接下载在本地播放。\";\n\n        const download = document.createElement(\"a\");\n        download.href = url;\n        download.download = ctx.file.name;\n        download.textContent = \"下载音频\";\n\n        fallback.append(fallbackTitle, meta, download);\n        wrapper.append(fallback);\n      };\n\n      audio.addEventListener(\"error\", showPlaybackFallback);\n\n      return {\n        destroy() {\n          audio.removeEventListener(\"error\", showPlaybackFallback);\n          audio.pause();\n          ctx.viewport.classList.remove(\"ofv-center\");\n          revokeObjectUrl(url, isExternal);\n        }\n      };\n    }\n  };\n}\n\ntype AudioInfo = {\n  format: string;\n  codec?: string;\n  sampleRate?: number;\n  channels?: number;\n  bitDepth?: number;\n  bitrate?: string;\n  duration?: string;\n  tags?: string;\n  note?: string;\n};\n\nasync function readAudioBytes(blob?: Blob): Promise<Uint8Array> {\n  if (!blob) {\n    return new Uint8Array();\n  }\n  return new Uint8Array(await blob.arrayBuffer().catch(() => new ArrayBuffer(0)));\n}\n\nfunction createAudioInfo(info: AudioInfo): HTMLElement {\n  const bar = document.createElement(\"div\");\n  bar.className = \"ofv-media-info\";\n  appendMediaInfo(bar, \"格式\", info.format);\n  if (info.codec) {\n    appendMediaInfo(bar, \"编码\", info.codec);\n  }\n  if (info.sampleRate) {\n    appendMediaInfo(bar, \"采样率\", `${info.sampleRate} Hz`);\n  }\n  if (info.channels) {\n    appendMediaInfo(bar, \"声道\", String(info.channels));\n  }\n  if (info.bitDepth) {\n    appendMediaInfo(bar, \"位深\", `${info.bitDepth} bit`);\n  }\n  if (info.bitrate) {\n    appendMediaInfo(bar, \"码率\", info.bitrate);\n  }\n  if (info.duration) {\n    appendMediaInfo(bar, \"时长\", info.duration);\n  }\n  if (info.tags) {\n    appendMediaInfo(bar, \"标签\", info.tags);\n  }\n  if (info.note) {\n    appendMediaInfo(bar, \"说明\", info.note);\n  }\n  return bar;\n}\n\nfunction appendMediaInfo(parent: HTMLElement, label: string, value: string): void {\n  const item = document.createElement(\"span\");\n  item.className = \"ofv-media-info-item\";\n  const key = document.createElement(\"span\");\n  key.textContent = label;\n  const content = document.createElement(\"strong\");\n  content.textContent = value;\n  item.append(key, content);\n  parent.append(item);\n}\n\nfunction parseAudioInfo(bytes: Uint8Array, extension: string, mimeType: string): AudioInfo {\n  const fallback = (extension || mimeType || \"audio\").toUpperCase();\n  if (bytes.length === 0) {\n    return { format: fallback, note: \"无法读取本地头信息\" };\n  }\n  return parseWaveInfo(bytes) || parseFlacInfo(bytes) || parseOggInfo(bytes) || parseAiffInfo(bytes) || parseAuInfo(bytes) || parseMidiInfo(bytes) || parseAdtsAacInfo(bytes) || parseId3Mp3Info(bytes) || {\n    format: fallback,\n    note: \"暂未识别音频头结构\"\n  };\n}\n\nfunction parseWaveInfo(bytes: Uint8Array): AudioInfo | null {\n  if (bytes.length < 44 || asciiAt(bytes, 0, 4) !== \"RIFF\" || asciiAt(bytes, 8, 4) !== \"WAVE\") {\n    return null;\n  }\n  let offset = 12;\n  let channels = 0;\n  let sampleRate = 0;\n  let bitDepth = 0;\n  let byteRate = 0;\n  let dataBytes = 0;\n  while (offset + 8 <= bytes.length) {\n    const chunk = asciiAt(bytes, offset, 4);\n    const size = readUint32Le(bytes, offset + 4);\n    const dataOffset = offset + 8;\n    if (chunk === \"fmt \" && dataOffset + 16 <= bytes.length) {\n      channels = readUint16Le(bytes, dataOffset + 2);\n      sampleRate = readUint32Le(bytes, dataOffset + 4);\n      byteRate = readUint32Le(bytes, dataOffset + 8);\n      bitDepth = readUint16Le(bytes, dataOffset + 14);\n    }\n    if (chunk === \"data\") {\n      dataBytes = size;\n    }\n    offset += 8 + size + (size % 2);\n  }\n  return {\n    format: \"WAV\",\n    codec: \"PCM\",\n    sampleRate,\n    channels,\n    bitDepth,\n    bitrate: byteRate ? `${Math.round((byteRate * 8) / 1000)} kbps` : undefined,\n    duration: byteRate && dataBytes ? formatDuration(dataBytes / byteRate) : undefined\n  };\n}\n\nfunction parseFlacInfo(bytes: Uint8Array): AudioInfo | null {\n  if (bytes.length < 42 || asciiAt(bytes, 0, 4) !== \"fLaC\") {\n    return null;\n  }\n  let offset = 4;\n  while (offset + 4 <= bytes.length) {\n    const type = bytes[offset] & 0x7f;\n    const length = (bytes[offset + 1] << 16) | (bytes[offset + 2] << 8) | bytes[offset + 3];\n    const dataOffset = offset + 4;\n    if (type === 0 && dataOffset + 34 <= bytes.length) {\n      const b10 = bytes[dataOffset + 10];\n      const b11 = bytes[dataOffset + 11];\n      const b12 = bytes[dataOffset + 12];\n      const b13 = bytes[dataOffset + 13];\n      const b14 = bytes[dataOffset + 14];\n      const b15 = bytes[dataOffset + 15];\n      const b16 = bytes[dataOffset + 16];\n      const b17 = bytes[dataOffset + 17];\n      const sampleRate = (b10 << 12) | (b11 << 4) | ((b12 & 0xf0) >> 4);\n      const channels = ((b12 & 0x0e) >> 1) + 1;\n      const bitDepth = (((b12 & 0x01) << 4) | ((b13 & 0xf0) >> 4)) + 1;\n      const totalSamples = ((BigInt(b13 & 0x0f) << 32n) | (BigInt(b14) << 24n) | (BigInt(b15) << 16n) | (BigInt(b16) << 8n) | BigInt(b17));\n      return {\n        format: \"FLAC\",\n        codec: \"FLAC\",\n        sampleRate,\n        channels,\n        bitDepth,\n        duration: sampleRate && totalSamples > 0n ? formatDuration(Number(totalSamples) / sampleRate) : undefined\n      };\n    }\n    offset += 4 + length;\n  }\n  return { format: \"FLAC\", codec: \"FLAC\", note: \"未找到 STREAMINFO metadata block\" };\n}\n\nfunction parseId3Mp3Info(bytes: Uint8Array): AudioInfo | null {\n  let offset = 0;\n  let tags: string | undefined;\n  if (bytes.length >= 10 && asciiAt(bytes, 0, 3) === \"ID3\") {\n    tags = `ID3v2.${bytes[3]}.${bytes[4]}`;\n    offset = 10 + readSynchsafe(bytes, 6);\n  }\n  for (let index = offset; index + 3 < Math.min(bytes.length, offset + 4096); index++) {\n    if (bytes[index] === 0xff && (bytes[index + 1] & 0xe0) === 0xe0) {\n      const versionBits = (bytes[index + 1] >> 3) & 0x03;\n      const layerBits = (bytes[index + 1] >> 1) & 0x03;\n      const bitrateIndex = (bytes[index + 2] >> 4) & 0x0f;\n      const sampleIndex = (bytes[index + 2] >> 2) & 0x03;\n      const channelMode = (bytes[index + 3] >> 6) & 0x03;\n      return {\n        format: \"MP3\",\n        codec: `${mpegVersion(versionBits)} Layer ${mpegLayer(layerBits)}`,\n        sampleRate: mp3SampleRate(versionBits, sampleIndex),\n        channels: channelMode === 3 ? 1 : 2,\n        bitrate: mp3Bitrate(versionBits, layerBits, bitrateIndex),\n        tags\n      };\n    }\n  }\n  return tags ? { format: \"MP3\", tags, note: \"未在头部扫描到 MPEG frame\" } : null;\n}\n\nfunction parseOggInfo(bytes: Uint8Array): AudioInfo | null {\n  if (bytes.length < 36 || asciiAt(bytes, 0, 4) !== \"OggS\") {\n    return null;\n  }\n  const pages = collectOggPages(bytes);\n  const firstPacket = pages[0]?.packets[0];\n  const lastGranule = [...pages].reverse().find((page) => page.granule > 0n)?.granule;\n  if (firstPacket && asciiAt(firstPacket, 0, 8) === \"OpusHead\") {\n    const preSkip = firstPacket.length >= 12 ? readUint16Le(firstPacket, 10) : 0;\n    const sampleRate = firstPacket.length >= 16 ? readUint32Le(firstPacket, 12) : 48000;\n    const totalSamples = lastGranule === undefined ? undefined : lastGranule - BigInt(preSkip);\n    return {\n      format: \"Ogg\",\n      codec: \"Opus\",\n      channels: firstPacket[9],\n      sampleRate,\n      duration: totalSamples !== undefined && totalSamples > 0n ? formatDuration(Number(totalSamples) / 48000) : undefined,\n      note: `${pages.length} 页`\n    };\n  }\n  if (firstPacket && firstPacket[0] === 0x01 && asciiAt(firstPacket, 1, 6) === \"vorbis\") {\n    const sampleRate = firstPacket.length >= 16 ? readUint32Le(firstPacket, 12) : undefined;\n    return {\n      format: \"Ogg\",\n      codec: \"Vorbis\",\n      channels: firstPacket[11],\n      sampleRate,\n      bitrate: firstPacket.length >= 28 ? oggVorbisBitrate(firstPacket) : undefined,\n      duration: sampleRate && lastGranule !== undefined && lastGranule > 0n ? formatDuration(Number(lastGranule) / sampleRate) : undefined,\n      note: `${pages.length} 页`\n    };\n  }\n  return { format: \"Ogg\", note: pages.length > 0 ? `未识别 Ogg codec header，${pages.length} 页` : \"未识别 Ogg codec header\" };\n}\n\ntype OggPage = {\n  granule: bigint;\n  packets: Uint8Array[];\n};\n\nfunction collectOggPages(bytes: Uint8Array): OggPage[] {\n  const pages: OggPage[] = [];\n  let offset = 0;\n  let continuedPacket: number[] = [];\n  while (offset + 27 <= bytes.length && asciiAt(bytes, offset, 4) === \"OggS\") {\n    const segmentCount = bytes[offset + 26];\n    const segmentTableOffset = offset + 27;\n    const dataOffset = segmentTableOffset + segmentCount;\n    if (dataOffset > bytes.length) {\n      break;\n    }\n    const sizes = Array.from(bytes.slice(segmentTableOffset, dataOffset));\n    const payloadLength = sizes.reduce((sum, value) => sum + value, 0);\n    const payloadEnd = dataOffset + payloadLength;\n    if (payloadEnd > bytes.length) {\n      break;\n    }\n    const pagePackets: Uint8Array[] = [];\n    let packetOffset = dataOffset;\n    for (const size of sizes) {\n      continuedPacket.push(...bytes.slice(packetOffset, packetOffset + size));\n      packetOffset += size;\n      if (size < 255) {\n        pagePackets.push(new Uint8Array(continuedPacket));\n        continuedPacket = [];\n      }\n    }\n    pages.push({\n      granule: readUint64Le(bytes, offset + 6),\n      packets: pagePackets\n    });\n    offset = payloadEnd;\n  }\n  return pages;\n}\n\nfunction oggVorbisBitrate(packet: Uint8Array): string | undefined {\n  const nominal = readUint32Le(packet, 20);\n  if (nominal > 0) {\n    return `${Math.round(nominal / 1000)} kbps`;\n  }\n  const upper = readUint32Le(packet, 16);\n  const lower = readUint32Le(packet, 24);\n  if (upper > 0 && lower > 0) {\n    return `${Math.round(((upper + lower) / 2) / 1000)} kbps`;\n  }\n  return undefined;\n}\n\nfunction parseAiffInfo(bytes: Uint8Array): AudioInfo | null {\n  if (bytes.length < 12 || asciiAt(bytes, 0, 4) !== \"FORM\" || ![\"AIFF\", \"AIFC\"].includes(asciiAt(bytes, 8, 4))) {\n    return null;\n  }\n  const format = asciiAt(bytes, 8, 4);\n  let offset = 12;\n  while (offset + 26 <= bytes.length) {\n    const chunk = asciiAt(bytes, offset, 4);\n    const size = readUint32Be(bytes, offset + 4);\n    if (chunk === \"COMM\") {\n      return {\n        format,\n        channels: readUint16Be(bytes, offset + 8),\n        bitDepth: readUint16Be(bytes, offset + 14),\n        sampleRate: Math.round(readAiffExtended(bytes, offset + 16))\n      };\n    }\n    offset += 8 + size + (size % 2);\n  }\n  return { format, note: \"未找到 COMM chunk\" };\n}\n\nfunction parseAuInfo(bytes: Uint8Array): AudioInfo | null {\n  if (bytes.length < 24 || asciiAt(bytes, 0, 4) !== \".snd\") {\n    return null;\n  }\n  const dataOffset = readUint32Be(bytes, 4);\n  const dataSize = readUint32Be(bytes, 8);\n  const encoding = readUint32Be(bytes, 12);\n  const sampleRate = readUint32Be(bytes, 16);\n  const channels = readUint32Be(bytes, 20);\n  const bitDepth = auBitDepth(encoding);\n  const bytesPerSample = bitDepth ? bitDepth / 8 : 0;\n  const resolvedDataSize = dataSize === 0xffffffff ? Math.max(0, bytes.length - dataOffset) : dataSize;\n  return {\n    format: \"AU/SND\",\n    codec: auEncodingName(encoding),\n    sampleRate,\n    channels,\n    bitDepth,\n    duration: sampleRate && channels && bytesPerSample && resolvedDataSize ? formatDuration(resolvedDataSize / (sampleRate * channels * bytesPerSample)) : undefined,\n    note: `data @ ${dataOffset} B`\n  };\n}\n\nfunction auEncodingName(value: number): string {\n  const names: Record<number, string> = {\n    1: \"8-bit μ-law\",\n    2: \"8-bit linear PCM\",\n    3: \"16-bit linear PCM\",\n    4: \"24-bit linear PCM\",\n    5: \"32-bit linear PCM\",\n    6: \"32-bit float\",\n    7: \"64-bit float\",\n    23: \"G.721 ADPCM\",\n    24: \"G.722 ADPCM\",\n    25: \"G.723 3-bit ADPCM\",\n    26: \"G.723 5-bit ADPCM\",\n    27: \"8-bit A-law\"\n  };\n  return names[value] || `encoding ${value}`;\n}\n\nfunction auBitDepth(value: number): number | undefined {\n  const depths: Record<number, number> = {\n    1: 8,\n    2: 8,\n    3: 16,\n    4: 24,\n    5: 32,\n    6: 32,\n    7: 64,\n    27: 8\n  };\n  return depths[value];\n}\n\nfunction parseMidiInfo(bytes: Uint8Array): AudioInfo | null {\n  if (bytes.length < 14 || asciiAt(bytes, 0, 4) !== \"MThd\") {\n    return null;\n  }\n  return {\n    format: \"MIDI\",\n    codec: `SMF ${readUint16Be(bytes, 8)}`,\n    channels: readUint16Be(bytes, 10),\n    note: `${readUint16Be(bytes, 12)} ticks/quarter`\n  };\n}\n\nfunction parseAdtsAacInfo(bytes: Uint8Array): AudioInfo | null {\n  if (bytes.length < 7 || bytes[0] !== 0xff || (bytes[1] & 0xf0) !== 0xf0) {\n    return null;\n  }\n  const profile = ((bytes[2] >> 6) & 0x03) + 1;\n  const sampleIndex = (bytes[2] >> 2) & 0x0f;\n  const channels = ((bytes[2] & 0x01) << 2) | ((bytes[3] >> 6) & 0x03);\n  return {\n    format: \"AAC\",\n    codec: `AAC ADTS profile ${profile}`,\n    sampleRate: aacSampleRate(sampleIndex),\n    channels: channels || undefined,\n    note: \"ADTS stream\"\n  };\n}\n\nfunction aacSampleRate(index: number): number | undefined {\n  return [96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350][index];\n}\n\nfunction formatDuration(seconds: number): string {\n  if (!Number.isFinite(seconds) || seconds <= 0) {\n    return \"\";\n  }\n  const total = Math.round(seconds);\n  const minutes = Math.floor(total / 60);\n  const rest = total % 60;\n  return `${minutes}:${String(rest).padStart(2, \"0\")}`;\n}\n\nfunction asciiAt(bytes: Uint8Array, offset: number, length: number): string {\n  if (offset < 0 || offset + length > bytes.length) {\n    return \"\";\n  }\n  return new TextDecoder(\"ascii\").decode(bytes.slice(offset, offset + length));\n}\n\nfunction view(bytes: Uint8Array): DataView {\n  return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n}\n\nfunction readUint16Le(bytes: Uint8Array, offset: number): number {\n  return view(bytes).getUint16(offset, true);\n}\n\nfunction readUint16Be(bytes: Uint8Array, offset: number): number {\n  return view(bytes).getUint16(offset, false);\n}\n\nfunction readUint32Le(bytes: Uint8Array, offset: number): number {\n  return view(bytes).getUint32(offset, true);\n}\n\nfunction readUint32Be(bytes: Uint8Array, offset: number): number {\n  return view(bytes).getUint32(offset, false);\n}\n\nfunction readUint64Le(bytes: Uint8Array, offset: number): bigint {\n  return (BigInt(readUint32Le(bytes, offset + 4)) << 32n) | BigInt(readUint32Le(bytes, offset));\n}\n\nfunction readSynchsafe(bytes: Uint8Array, offset: number): number {\n  return ((bytes[offset] & 0x7f) << 21) | ((bytes[offset + 1] & 0x7f) << 14) | ((bytes[offset + 2] & 0x7f) << 7) | (bytes[offset + 3] & 0x7f);\n}\n\nfunction mpegVersion(bits: number): string {\n  return bits === 3 ? \"MPEG-1\" : bits === 2 ? \"MPEG-2\" : bits === 0 ? \"MPEG-2.5\" : \"MPEG\";\n}\n\nfunction mpegLayer(bits: number): string {\n  return bits === 3 ? \"I\" : bits === 2 ? \"II\" : bits === 1 ? \"III\" : \"?\";\n}\n\nfunction mp3SampleRate(versionBits: number, index: number): number | undefined {\n  const rates = versionBits === 3 ? [44100, 48000, 32000] : versionBits === 2 ? [22050, 24000, 16000] : [11025, 12000, 8000];\n  return rates[index];\n}\n\nfunction mp3Bitrate(versionBits: number, layerBits: number, index: number): string | undefined {\n  const mpeg1Layer3 = [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320];\n  const mpeg2Layer3 = [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160];\n  if (index <= 0 || index >= 15 || layerBits !== 1) {\n    return undefined;\n  }\n  return `${(versionBits === 3 ? mpeg1Layer3 : mpeg2Layer3)[index]} kbps`;\n}\n\nfunction readAiffExtended(bytes: Uint8Array, offset: number): number {\n  const exponent = readUint16Be(bytes, offset) & 0x7fff;\n  let mantissa = 0;\n  for (let index = 0; index < 8; index++) {\n    mantissa = mantissa * 256 + bytes[offset + 2 + index];\n  }\n  return mantissa * Math.pow(2, exponent - 16383 - 63);\n}\n","import type { PreviewMessages } from \"../types\";\n\nexport type LrcRole = \"M\" | \"F\" | \"D\";\n\nexport interface LrcMetadata {\n  key: string;\n  value: string;\n  line: number;\n}\n\nexport interface LrcWord {\n  timestamp?: string;\n  text: string;\n}\n\nexport interface LrcLyricLine {\n  timestamps: string[];\n  text: string;\n  words: LrcWord[];\n  role?: LrcRole;\n  explicitRole?: LrcRole;\n  line: number;\n}\n\nexport interface ParsedLrc {\n  metadata: LrcMetadata[];\n  lyrics: LrcLyricLine[];\n}\n\nexport type LrcPreviewMode = \"display\" | \"annotated\" | \"source\";\n\nconst lrcModeIconPaths: Record<LrcPreviewMode, string> = {\n  display:\n    \"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,160H40V56H216V200ZM184,96a8,8,0,0,1-8,8H80a8,8,0,0,1,0-16h96A8,8,0,0,1,184,96Zm0,32a8,8,0,0,1-8,8H80a8,8,0,0,1,0-16h96A8,8,0,0,1,184,128Zm0,32a8,8,0,0,1-8,8H80a8,8,0,0,1,0-16h96A8,8,0,0,1,184,160Z\",\n  annotated:\n    \"M224,48H32a8,8,0,0,0-8,8V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A8,8,0,0,0,224,48ZM40,112H80v32H40Zm56,0H216v32H96ZM216,64V96H40V64ZM40,160H80v32H40Zm176,32H96V160H216v32Z\",\n  source:\n    \"M69.12,94.15,28.5,128l40.62,33.85a8,8,0,1,1-10.24,12.29l-48-40a8,8,0,0,1,0-12.29l48-40a8,8,0,0,1,10.24,12.3Zm176,27.7-48-40a8,8,0,1,0-10.24,12.3L227.5,128l-40.62,33.85a8,8,0,1,0,10.24,12.29l48-40a8,8,0,0,0,0-12.29ZM162.73,32.48a8,8,0,0,0-10.25,4.79l-64,176a8,8,0,0,0,4.79,10.26A8.14,8.14,0,0,0,96,224a8,8,0,0,0,7.52-5.27l64-176A8,8,0,0,0,162.73,32.48Z\"\n};\n\nconst TIME_TAG = String.raw`\\d{1,3}:\\d{2}(?:[.:]\\d{1,3})?`;\nconst lineTimePattern = new RegExp(`^\\\\s*((?:\\\\[${TIME_TAG}\\\\])+)(.*)$`);\nconst timeTagPattern = new RegExp(`\\\\[(${TIME_TAG})\\\\]`, \"g\");\nconst wordTimePattern = new RegExp(`<(${TIME_TAG})>`, \"g\");\nconst metadataTagPattern = /\\[([a-zA-Z][\\w-]*|#):([^\\]]*)\\]/g;\nconst trackInformationKeys = [\"al\", \"au\", \"lr\", \"length\"];\nconst fileInformationKeys = [\"by\", \"offset\", \"re\", \"tool\", \"ve\"];\nlet lrcPreviewSequence = 0;\n\nexport function parseLrc(source: string): ParsedLrc {\n  const metadata: LrcMetadata[] = [];\n  const lyrics: LrcLyricLine[] = [];\n  let activeRole: LrcRole | undefined;\n\n  source.split(/\\r?\\n/).forEach((rawLine, index) => {\n    const line = index + 1;\n    const trimmed = rawLine.trim();\n    if (!trimmed) {\n      return;\n    }\n\n    const metadataEntries = parseMetadataLine(trimmed, line);\n    if (metadataEntries) {\n      metadata.push(...metadataEntries);\n      return;\n    }\n\n    const timed = rawLine.match(lineTimePattern);\n    const timestamps: string[] = [];\n    let content = rawLine;\n    if (timed) {\n      for (const match of timed[1].matchAll(timeTagPattern)) {\n        timestamps.push(match[1]);\n      }\n      content = timed[2];\n    }\n\n    const roleMatch = content.match(/^\\s*([MFD]):\\s*/i);\n    const explicitRole = roleMatch?.[1].toUpperCase() as LrcRole | undefined;\n    if (explicitRole) {\n      activeRole = explicitRole;\n      content = content.slice(roleMatch![0].length);\n    }\n\n    const words = parseTimedWords(content);\n    const text = words.map((word) => word.text).join(\"\");\n    if (timestamps.length > 0 || text.trim() || explicitRole) {\n      lyrics.push({\n        timestamps,\n        text,\n        words,\n        role: activeRole,\n        explicitRole,\n        line\n      });\n    }\n  });\n\n  return { metadata, lyrics };\n}\n\nfunction parseMetadataLine(source: string, line: number): LrcMetadata[] | undefined {\n  const entries: LrcMetadata[] = [];\n  let consumed = \"\";\n  metadataTagPattern.lastIndex = 0;\n  for (const match of source.matchAll(metadataTagPattern)) {\n    entries.push({ key: match[1].toLowerCase(), value: match[2].trim(), line });\n    consumed += match[0];\n  }\n  return entries.length > 0 && consumed === source ? entries : undefined;\n}\n\nfunction parseTimedWords(source: string): LrcWord[] {\n  const words: LrcWord[] = [];\n  let cursor = 0;\n  let activeTimestamp: string | undefined;\n  wordTimePattern.lastIndex = 0;\n  for (const match of source.matchAll(wordTimePattern)) {\n    if (match.index > cursor) {\n      words.push({ timestamp: activeTimestamp, text: source.slice(cursor, match.index) });\n    }\n    activeTimestamp = match[1];\n    cursor = match.index + match[0].length;\n  }\n  if (cursor < source.length) {\n    words.push({ timestamp: activeTimestamp, text: source.slice(cursor) });\n  }\n  if (words.length === 0) {\n    words.push({ text: source });\n  }\n  return words;\n}\n\nexport interface LrcPreviewViews {\n  modeBar: HTMLElement;\n  annotatedView: HTMLElement;\n  displayView: HTMLElement;\n  setMode(mode: LrcPreviewMode): void;\n}\n\nexport function createLrcPreviewViews(\n  parsed: ParsedLrc,\n  fileName: string,\n  messages: PreviewMessages,\n  sourceView: HTMLElement,\n  wrapButton: HTMLButtonElement\n): LrcPreviewViews {\n  const modeBar = document.createElement(\"div\");\n  modeBar.className = \"ofv-lrc-modebar\";\n\n  const group = document.createElement(\"div\");\n  group.className = \"ofv-lrc-mode-switch\";\n  group.setAttribute(\"role\", \"tablist\");\n  group.setAttribute(\"aria-label\", messages.lrcPreviewMode);\n  group.setAttribute(\"aria-orientation\", \"horizontal\");\n\n  const annotatedView = createAnnotatedView(parsed, messages);\n  const displayView = createDisplayView(parsed, fileName, messages);\n  const instanceId = ++lrcPreviewSequence;\n  const panels: Record<LrcPreviewMode, HTMLElement> = {\n    display: displayView,\n    annotated: annotatedView,\n    source: sourceView\n  };\n\n  const modes: Array<[LrcPreviewMode, string]> = [\n    [\"display\", messages.lrcDisplayMode],\n    [\"annotated\", messages.lrcAnnotatedMode],\n    [\"source\", messages.lrcSourceMode]\n  ];\n  const buttons = new Map<LrcPreviewMode, HTMLButtonElement>();\n  modes.forEach(([mode, text]) => {\n    const button = document.createElement(\"button\");\n    button.type = \"button\";\n    button.className = \"ofv-lrc-mode-button\";\n    button.dataset.mode = mode;\n    button.id = `ofv-lrc-${instanceId}-tab-${mode}`;\n    button.setAttribute(\"role\", \"tab\");\n    button.setAttribute(\"aria-controls\", `ofv-lrc-${instanceId}-panel-${mode}`);\n    button.setAttribute(\"aria-selected\", \"false\");\n    button.setAttribute(\"aria-label\", text);\n    button.title = text;\n    button.tabIndex = -1;\n    button.append(createLrcModeIcon(mode));\n    const panel = panels[mode];\n    panel.id = `ofv-lrc-${instanceId}-panel-${mode}`;\n    panel.setAttribute(\"role\", \"tabpanel\");\n    panel.setAttribute(\"aria-labelledby\", button.id);\n    buttons.set(mode, button);\n    group.append(button);\n  });\n  modeBar.append(group);\n\n  const setMode = (mode: LrcPreviewMode) => {\n    sourceView.hidden = mode !== \"source\";\n    annotatedView.hidden = mode !== \"annotated\";\n    displayView.hidden = mode !== \"display\";\n    wrapButton.hidden = mode !== \"source\";\n    buttons.forEach((button, buttonMode) => {\n      const active = buttonMode === mode;\n      button.setAttribute(\"aria-selected\", String(active));\n      button.tabIndex = active ? 0 : -1;\n    });\n    modeBar.dataset.activeMode = mode;\n  };\n\n  buttons.forEach((button, mode) => button.addEventListener(\"click\", () => setMode(mode)));\n  group.addEventListener(\"keydown\", (event) => {\n    const currentIndex = modes.findIndex(([mode]) => buttons.get(mode) === document.activeElement);\n    if (currentIndex < 0) {\n      return;\n    }\n    let nextIndex = currentIndex;\n    if (event.key === \"ArrowRight\") {\n      nextIndex = (currentIndex + 1) % modes.length;\n    } else if (event.key === \"ArrowLeft\") {\n      nextIndex = (currentIndex - 1 + modes.length) % modes.length;\n    } else if (event.key === \"Home\") {\n      nextIndex = 0;\n    } else if (event.key === \"End\") {\n      nextIndex = modes.length - 1;\n    } else {\n      return;\n    }\n    event.preventDefault();\n    const nextMode = modes[nextIndex][0];\n    setMode(nextMode);\n    buttons.get(nextMode)?.focus();\n  });\n  setMode(\"display\");\n\n  return { modeBar, annotatedView, displayView, setMode };\n}\n\nfunction createLrcModeIcon(mode: LrcPreviewMode): SVGSVGElement {\n  const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n  svg.classList.add(\"ofv-lrc-mode-icon\");\n  svg.setAttribute(\"viewBox\", \"0 0 256 256\");\n  svg.setAttribute(\"aria-hidden\", \"true\");\n  svg.setAttribute(\"focusable\", \"false\");\n  const path = document.createElementNS(svg.namespaceURI, \"path\");\n  path.setAttribute(\"d\", lrcModeIconPaths[mode]);\n  path.setAttribute(\"fill\", \"currentColor\");\n  svg.append(path);\n  return svg;\n}\n\nfunction createAnnotatedView(parsed: ParsedLrc, messages: PreviewMessages): HTMLElement {\n  const view = document.createElement(\"div\");\n  view.className = \"ofv-lrc-annotated\";\n\n  const table = document.createElement(\"div\");\n  table.className = \"ofv-lrc-annotated-table\";\n\n  parsed.metadata.forEach((entry) => {\n    const row = document.createElement(\"div\");\n    row.className = \"ofv-lrc-annotated-row is-metadata\";\n    row.classList.add(entry.key === \"ti\" ? \"is-title\" : \"is-secondary\");\n    row.dataset.tag = entry.key;\n\n    const gutter = document.createElement(\"div\");\n    gutter.className = \"ofv-lrc-annotated-gutter\";\n    const label = document.createElement(\"span\");\n    label.className = \"ofv-lrc-meta-label\";\n    label.textContent = entry.key;\n    gutter.append(label);\n\n    const value = document.createElement(\"div\");\n    value.className = \"ofv-lrc-meta-value\";\n    value.textContent = entry.value;\n    row.append(gutter, value);\n    table.append(row);\n  });\n\n  parsed.lyrics.forEach((entry) => {\n    const row = document.createElement(\"div\");\n    row.className = \"ofv-lrc-annotated-row is-lyric\";\n    if (entry.role) {\n      row.dataset.role = entry.role;\n    }\n\n    const gutter = document.createElement(\"div\");\n    gutter.className = \"ofv-lrc-annotated-gutter\";\n    const times = document.createElement(\"span\");\n    times.className = \"ofv-lrc-times\";\n    if (entry.timestamps.length === 0) {\n      times.textContent = \"·\";\n    } else {\n      entry.timestamps.forEach((timestamp) => {\n        const time = document.createElement(\"span\");\n        time.className = \"ofv-lrc-time\";\n        time.textContent = timestamp;\n        times.append(time);\n      });\n    }\n    gutter.append(times);\n\n    const lyric = document.createElement(\"div\");\n    lyric.className = \"ofv-lrc-annotated-text\";\n    if (entry.explicitRole) {\n      lyric.append(createRoleBadge(entry.explicitRole, messages));\n    }\n    const lyricContent = document.createElement(\"span\");\n    lyricContent.className = \"ofv-lrc-annotated-content\";\n    appendTimedWords(lyricContent, entry.words, messages);\n    lyric.append(lyricContent);\n    row.append(gutter, lyric);\n    table.append(row);\n  });\n\n  if (!table.hasChildNodes()) {\n    const empty = document.createElement(\"p\");\n    empty.className = \"ofv-lrc-empty\";\n    empty.textContent = messages.lrcEmpty;\n    table.append(empty);\n  }\n  view.append(table);\n  return view;\n}\n\nfunction appendTimedWords(container: HTMLElement, words: LrcWord[], messages: PreviewMessages): void {\n  const visibleWords = words\n    .map((word) => ({ ...word, text: word.text.trim() }))\n    .filter((word) => word.text.length > 0);\n\n  visibleWords.forEach((word, index) => {\n    if (index > 0) {\n      const separator = document.createElement(\"span\");\n      separator.className = \"ofv-lrc-word-separator\";\n      separator.textContent = \" \";\n      separator.setAttribute(\"aria-hidden\", \"true\");\n      container.append(separator);\n    }\n    if (!word.timestamp) {\n      container.append(document.createTextNode(word.text));\n      return;\n    }\n    const ruby = document.createElement(\"ruby\");\n    ruby.className = \"ofv-lrc-timed-word\";\n    ruby.tabIndex = 0;\n    ruby.setAttribute(\"aria-label\", `${word.text}, ${messages.lrcWordTimestamp}: ${word.timestamp}`);\n    const text = document.createElement(\"span\");\n    text.className = \"ofv-lrc-word-text\";\n    text.textContent = word.text;\n    const timestamp = document.createElement(\"rt\");\n    timestamp.textContent = word.timestamp;\n    ruby.append(text, timestamp);\n    container.append(ruby);\n  });\n}\n\nfunction createDisplayView(parsed: ParsedLrc, fileName: string, messages: PreviewMessages): HTMLElement {\n  const view = document.createElement(\"div\");\n  view.className = \"ofv-lrc-display\";\n\n  const page = document.createElement(\"article\");\n  page.className = \"ofv-lrc-display-page\";\n  const header = document.createElement(\"div\");\n  header.className = \"ofv-lrc-display-header\";\n\n  const title = metadataValue(parsed, \"ti\") || fileName.replace(/\\.lrc$/i, \"\");\n  const heading = document.createElement(\"h2\");\n  heading.textContent = title;\n  header.append(heading);\n\n  const artist = metadataValue(parsed, \"ar\");\n  if (artist) {\n    const artistName = document.createElement(\"p\");\n    artistName.className = \"ofv-lrc-display-artist\";\n    artistName.textContent = artist;\n    header.append(artistName);\n  }\n  const trackInformation = createCredits(parsed, messages, trackInformationKeys);\n  if (trackInformation) {\n    trackInformation.classList.add(\"ofv-lrc-display-track-info\");\n    trackInformation.setAttribute(\"aria-label\", messages.lrcTrackInformation);\n    header.append(trackInformation);\n  }\n  page.append(header);\n\n  const lyrics = document.createElement(\"div\");\n  lyrics.className = \"ofv-lrc-display-lyrics\";\n  parsed.lyrics.forEach((entry) => {\n    if (!entry.text.trim()) {\n      return;\n    }\n    const line = document.createElement(\"p\");\n    line.className = \"ofv-lrc-display-line\";\n    if (entry.role) {\n      line.dataset.role = entry.role;\n    }\n    if (entry.explicitRole) {\n      line.append(createRoleBadge(entry.explicitRole, messages));\n    }\n    const lyricContent = document.createElement(\"span\");\n    lyricContent.className = \"ofv-lrc-display-content\";\n    lyricContent.textContent = entry.text;\n    line.append(lyricContent);\n    lyrics.append(line);\n  });\n  if (!lyrics.hasChildNodes()) {\n    const empty = document.createElement(\"p\");\n    empty.className = \"ofv-lrc-empty\";\n    empty.textContent = messages.lrcEmpty;\n    lyrics.append(empty);\n  }\n  page.append(lyrics);\n  const fileInformation = createCredits(parsed, messages, fileInformationKeys);\n  if (fileInformation) {\n    const footer = document.createElement(\"div\");\n    footer.className = \"ofv-lrc-display-file-info\";\n    footer.append(fileInformation);\n    page.append(footer);\n  }\n  view.append(page);\n  return view;\n}\n\nfunction createCredits(parsed: ParsedLrc, messages: PreviewMessages, keys: string[]): HTMLElement | undefined {\n  const labels: Record<string, string> = {\n    al: messages.lrcAlbum,\n    au: messages.lrcAuthor,\n    lr: messages.lrcLyricist,\n    by: messages.lrcLrcBy,\n    length: messages.lrcLength,\n    offset: messages.lrcOffset,\n    re: messages.lrcTool,\n    tool: messages.lrcTool,\n    ve: messages.lrcVersion\n  };\n  const entries = parsed.metadata.filter((entry) => keys.includes(entry.key) && labels[entry.key] && entry.value);\n  if (entries.length === 0) {\n    return undefined;\n  }\n  const credits = document.createElement(\"dl\");\n  credits.className = \"ofv-lrc-display-credits\";\n  entries.forEach((entry) => {\n    const term = document.createElement(\"dt\");\n    term.textContent = labels[entry.key];\n    const value = document.createElement(\"dd\");\n    value.textContent = entry.value;\n    credits.append(term, value);\n  });\n  return credits;\n}\n\nfunction metadataValue(parsed: ParsedLrc, key: string): string | undefined {\n  return parsed.metadata.find((entry) => entry.key === key && entry.value)?.value;\n}\n\nfunction createRoleBadge(role: LrcRole, messages: PreviewMessages): HTMLElement {\n  const labels: Record<LrcRole, string> = {\n    M: messages.lrcMale,\n    F: messages.lrcFemale,\n    D: messages.lrcDuet\n  };\n  const badge = document.createElement(\"sup\");\n  badge.className = \"ofv-lrc-role\";\n  badge.dataset.role = role;\n  badge.textContent = role;\n  badge.title = labels[role];\n  badge.setAttribute(\"aria-label\", labels[role]);\n  return badge;\n}\n","/// <reference path=\"../shims-text.d.ts\" />\nimport { isTextLike } from \"../detect\";\nimport { formatPreviewMessage } from \"../messages\";\nimport type { PreviewCommand, PreviewContext, PreviewInstance, PreviewMessages, PreviewPlugin } from \"../types\";\nimport { createLrcPreviewViews, parseLrc } from \"./lrc\";\nimport { decodeTextBuffer, getInitialZoom } from \"./utils\";\n\nconst langMap: Record<string, string> = {\n  lrc: \"none\",\n  js: \"javascript\",\n  mjs: \"javascript\",\n  cjs: \"javascript\",\n  ts: \"typescript\",\n  tsx: \"tsx\",\n  jsx: \"jsx\",\n  html: \"markup\",\n  htm: \"markup\",\n  vue: \"markup\",\n  xml: \"markup\",\n  css: \"css\",\n  scss: \"scss\",\n  less: \"less\",\n  json: \"json\",\n  jsonc: \"json\",\n  json5: \"json5\",\n  ipynb: \"json\",\n  jsonl: \"json\",\n  ndjson: \"json\",\n  toml: \"toml\",\n  ini: \"ini\",\n  properties: \"properties\",\n  proto: \"protobuf\",\n  tf: \"hcl\",\n  tfvars: \"hcl\",\n  hcl: \"hcl\",\n  tex: \"latex\",\n  latex: \"latex\",\n  bib: \"latex\",\n  gv: \"dot\",\n  http: \"http\",\n  py: \"python\",\n  java: \"java\",\n  cpp: \"cpp\",\n  c: \"c\",\n  h: \"c\",\n  hpp: \"cpp\",\n  cs: \"csharp\",\n  go: \"go\",\n  rs: \"rust\",\n  rb: \"ruby\",\n  swift: \"swift\",\n  kt: \"kotlin\",\n  kts: \"kotlin\",\n  scala: \"scala\",\n  lua: \"lua\",\n  r: \"r\",\n  dart: \"dart\",\n  svelte: \"markup\",\n  astro: \"markup\",\n  elm: \"elm\",\n  ex: \"elixir\",\n  exs: \"elixir\",\n  clj: \"clojure\",\n  cljs: \"clojure\",\n  erl: \"erlang\",\n  hrl: \"erlang\",\n  fs: \"fsharp\",\n  fsx: \"fsharp\",\n  hs: \"haskell\",\n  lhs: \"haskell\",\n  sql: \"sql\",\n  sh: \"bash\",\n  bash: \"bash\",\n  zsh: \"bash\",\n  fish: \"bash\",\n  ps1: \"powershell\",\n  bat: \"batch\",\n  cmd: \"batch\",\n  dockerfile: \"docker\",\n  nginxconf: \"nginx\",\n  gradle: \"groovy\",\n  graphql: \"graphql\",\n  gql: \"graphql\",\n  yaml: \"yaml\",\n  yml: \"yaml\",\n  diff: \"diff\",\n  patch: \"diff\",\n  php: \"php\",\n  md: \"markdown\",\n  markdown: \"markdown\",\n  mmd: \"mermaid\",\n  mermaid: \"mermaid\"\n};\nconst filenameLangMap: Record<string, string> = {\n  dockerfile: \"docker\",\n  makefile: \"makefile\",\n  gemfile: \"ruby\",\n  rakefile: \"ruby\",\n  procfile: \"bash\",\n  jenkinsfile: \"groovy\",\n  vagrantfile: \"ruby\",\n  brewfile: \"ruby\",\n  podfile: \"ruby\",\n  \"go.mod\": \"go\",\n  \"go.sum\": \"go\",\n  \"cargo.toml\": \"toml\",\n  \"cargo.lock\": \"toml\",\n  \".gitignore\": \"none\",\n  \".dockerignore\": \"ignore\",\n  \".npmrc\": \"none\",\n  \".yarnrc\": \"none\",\n  \".pnpmrc\": \"none\",\n  \".editorconfig\": \"editorconfig\",\n  \".browserslistrc\": \"none\",\n  \".prettierrc\": \"json\",\n  \".eslintrc\": \"json\",\n  \".stylelintrc\": \"json\",\n  readme: \"markdown\",\n  changelog: \"markdown\",\n  changes: \"markdown\",\n  history: \"markdown\",\n  license: \"none\",\n  licence: \"none\",\n  copying: \"none\",\n  notice: \"none\",\n  authors: \"none\",\n  contributors: \"none\",\n  codeowners: \"none\"\n};\nconst mimeLangMap: Record<string, string> = {\n  \"application/lrc\": \"none\",\n  \"application/x-lrc\": \"none\",\n  \"text/lrc\": \"none\",\n  \"text/x-lrc\": \"none\",\n  \"text/markdown\": \"markdown\",\n  \"text/vnd.mermaid\": \"mermaid\",\n  \"text/html\": \"markup\",\n  \"application/xml\": \"markup\",\n  \"text/xml\": \"markup\",\n  \"application/json\": \"json\",\n  \"application/json5\": \"json5\",\n  \"application/x-ipynb+json\": \"json\",\n  \"application/x-ndjson\": \"json\",\n  \"application/yaml\": \"yaml\",\n  \"application/x-yaml\": \"yaml\",\n  \"text/yaml\": \"yaml\",\n  \"application/javascript\": \"javascript\",\n  \"application/x-javascript\": \"javascript\",\n  \"text/javascript\": \"javascript\",\n  \"application/typescript\": \"typescript\",\n  \"application/x-typescript\": \"typescript\",\n  \"text/typescript\": \"typescript\",\n  \"application/sql\": \"sql\",\n  \"application/x-sh\": \"bash\",\n  \"application/graphql\": \"graphql\",\n  \"text/calendar\": \"none\",\n  \"text/vcard\": \"none\",\n  \"application/x-pem-file\": \"none\",\n  \"application/x-x509-ca-cert\": \"none\",\n  \"application/pkix-cert\": \"none\",\n  \"application/x-httpd-php\": \"php\",\n  \"application/x-tex\": \"latex\",\n  \"message/http\": \"http\",\n  \"text/x-bibtex\": \"latex\",\n  \"text/x-hcl\": \"hcl\",\n  \"text/x-protobuf\": \"protobuf\",\n  \"text/vnd.graphviz\": \"dot\",\n  \"text/css\": \"css\"\n};\n\nconst MAX_HIGHLIGHT_CHARS = 180_000;\nconst MAX_RENDER_CHARS = 600_000;\nconst prismLanguageLoads = new Map<string, Promise<void>>();\n\nexport function textPlugin(): PreviewPlugin {\n  return {\n    name: \"text\",\n    match(file) {\n      return isTextLike(file);\n    },\n    async render(ctx) {\n      const ext = ctx.file.extension.toLowerCase();\n      const lang = getTextLanguage(ctx.file.name, ext, ctx.file.mimeType);\n      const isLrc =\n        ext === \"lrc\" || [\"application/lrc\", \"application/x-lrc\", \"text/lrc\", \"text/x-lrc\"].includes(ctx.file.mimeType);\n      const defaultWrapped = lang === \"none\";\n      const isMarkdown = lang === \"markdown\";\n      const text = await readText(ctx.file.source).catch((error: unknown) => undefined);\n      if (text === undefined) {\n        const fallback = createTextFallback(ctx.file.name, ctx.options.messages, ctx.file.url);\n        ctx.viewport.classList.add(\"ofv-center\");\n        ctx.viewport.append(fallback);\n        return {\n          destroy() {\n            ctx.viewport.classList.remove(\"ofv-center\");\n            fallback.remove();\n          }\n        };\n      }\n\n      // 1. Standalone mermaid diagram path (.mmd / .mermaid)\n      if (lang === \"mermaid\") {\n        const diagram = await renderMermaidFile(ctx, text);\n        if (diagram) {\n          return diagram;\n        }\n        // Fall back to the plain source view below when the diagram cannot render.\n      }\n\n      // 2. Markdown path\n      if (isMarkdown) {\n        const [markedModule, PrismModule, DOMPurifyModule] = await Promise.all([\n          import(\"marked\"),\n          import(\"prismjs\"),\n          import(\"dompurify\")\n        ]);\n\n        const parseMarkdown =\n          markedModule.marked?.parse || markedModule.parse || (markedModule as any).default?.parse;\n        const Prism = PrismModule.default || PrismModule;\n        const DOMPurify = DOMPurifyModule.default || DOMPurifyModule;\n\n        const container = document.createElement(\"div\");\n        container.className = \"ofv-markdown-body\";\n        const markdownContent = document.createElement(\"div\");\n        markdownContent.className = \"ofv-markdown-content\";\n        markdownContent.innerHTML = DOMPurify.sanitize(parseMarkdown(text), {\n          USE_PROFILES: { html: true },\n          ADD_ATTR: [\"target\"]\n        });\n        container.append(markdownContent);\n        secureMarkdownLinks(container);\n        assignMarkdownHeadingAnchors(markdownContent);\n        const destroyMarkdownAnchorNavigation = enableMarkdownAnchorNavigation(container);\n        ctx.viewport.appendChild(container);\n\n        // Render mermaid code fences as diagrams\n        try {\n          await renderMermaidBlocks(container, DOMPurify);\n        } catch (e) {\n          console.warn(\"Mermaid render for markdown failed:\", e);\n        }\n\n        // Highlight code blocks inside markdown\n        try {\n          const codeBlocks = container.querySelectorAll(\"pre code\");\n          if (codeBlocks.length > 0) {\n            const languages = new Set<string>();\n            codeBlocks.forEach((block) => {\n              const language = getPrismLanguageFromElement(block) || getPrismLanguageFromElement(block.parentElement);\n              if (language) {\n                languages.add(language);\n              }\n            });\n            await Promise.all([...languages].map((language) => loadPrismLanguage(language)));\n            codeBlocks.forEach((block) => {\n              const parent = block.parentElement;\n              if (parent && !parent.className.includes(\"language-\")) {\n                parent.className = \"language-none\";\n              }\n              Prism.highlightElement(block);\n            });\n          }\n        } catch (e) {\n          console.warn(\"Prism highlight for markdown failed:\", e);\n        }\n\n        const markdownZoom = createTextZoomController(container, \"--ofv-markdown-zoom\", ctx, markdownContent);\n\n        return {\n          canCommand(command) {\n            return markdownZoom.canCommand(command);\n          },\n          command(command) {\n            return markdownZoom.command(command);\n          },\n          destroy() {\n            destroyMarkdownAnchorNavigation();\n            container.remove();\n          }\n        };\n      }\n\n      // 3. Syntax-highlighted code path\n      const [PrismModule] = await Promise.all([import(\"prismjs\")]);\n      const Prism = PrismModule.default || PrismModule;\n\n      // Load specific language component dynamically if needed\n      if (lang !== \"none\") {\n        try {\n          await loadPrismLanguage(lang);\n        } catch (e) {\n          console.warn(`Prism failed to load language component for: ${lang}`, e);\n        }\n      }\n\n      const codeText = text.length > MAX_RENDER_CHARS ? text.slice(0, MAX_RENDER_CHARS) : text;\n      const totalLines = countLines(text);\n      const shownLines = countLines(codeText);\n      const truncated = codeText.length < text.length;\n      const shouldHighlight = codeText.length <= MAX_HIGHLIGHT_CHARS;\n      const wrapper = document.createElement(\"div\");\n      wrapper.className = \"ofv-code-container\";\n      if (isLrc) {\n        wrapper.classList.add(\"is-lrc\");\n      }\n      if (truncated) {\n        wrapper.classList.add(\"is-truncated\");\n      }\n      if (defaultWrapped) {\n        wrapper.classList.add(\"is-wrapped\");\n      }\n\n      const header = document.createElement(\"div\");\n      header.className = \"ofv-code-header\";\n\n      const title = document.createElement(\"div\");\n      title.className = \"ofv-code-title\";\n      const fileName = document.createElement(\"strong\");\n      fileName.textContent = ctx.file.name;\n      const messages = ctx.options.messages;\n      const meta = document.createElement(\"span\");\n      meta.textContent = [\n        isLrc ? \"LRC\" : lang === \"none\" ? messages.textPlainLanguage : lang,\n        formatPreviewMessage(messages.textLineCount, { count: totalLines.toLocaleString() }),\n        formatBytes(ctx.file.size ?? (ctx.file.source instanceof Blob ? ctx.file.source.size : text.length))\n      ].join(\" · \");\n      title.append(fileName, meta);\n\n      const actions = document.createElement(\"div\");\n      actions.className = \"ofv-code-actions\";\n\n      const status = document.createElement(\"span\");\n      status.className = \"ofv-code-status\";\n      status.setAttribute(\"role\", \"status\");\n\n      const wrapButton = document.createElement(\"button\");\n      wrapButton.type = \"button\";\n      wrapButton.className = \"ofv-code-action\";\n      wrapButton.textContent = messages.textWrap;\n      wrapButton.setAttribute(\"aria-pressed\", String(defaultWrapped));\n      wrapButton.addEventListener(\"click\", () => {\n        const wrapped = wrapper.classList.toggle(\"is-wrapped\");\n        wrapButton.setAttribute(\"aria-pressed\", String(wrapped));\n      });\n\n      const copyButton = document.createElement(\"button\");\n      copyButton.type = \"button\";\n      copyButton.className = \"ofv-code-action\";\n      copyButton.textContent = messages.textCopy;\n      copyButton.addEventListener(\"click\", async () => {\n        copyButton.disabled = true;\n        try {\n          await copyToClipboard(text);\n          status.textContent = messages.textCopied;\n        } catch {\n          status.textContent = messages.textCopyFailed;\n        } finally {\n          copyButton.disabled = false;\n        }\n      });\n\n      const downloadButton = document.createElement(\"button\");\n      downloadButton.type = \"button\";\n      downloadButton.className = \"ofv-code-action\";\n      downloadButton.textContent = messages.textDownload;\n      downloadButton.addEventListener(\"click\", () => {\n        downloadText(ctx.file.name, text);\n        status.textContent = messages.textDownloadReady;\n      });\n\n      actions.append(wrapButton, copyButton, downloadButton, status);\n      header.append(title, actions);\n      const structureSummary = createTextStructureSummary(text, ext, lang, ctx.file.mimeType);\n\n      const body = document.createElement(\"div\");\n      body.className = \"ofv-code-body\";\n\n      const gutter = document.createElement(\"pre\");\n      gutter.className = \"ofv-code-gutter\";\n      gutter.setAttribute(\"aria-hidden\", \"true\");\n      gutter.textContent = createLineNumbers(shownLines);\n\n      const pre = document.createElement(\"pre\");\n      pre.className = `language-${lang}`;\n\n      const code = document.createElement(\"code\");\n      code.className = `language-${lang}`;\n      code.textContent = codeText;\n\n      pre.appendChild(code);\n      body.append(gutter, pre);\n      wrapper.append(header);\n      if (isLrc) {\n        const lrcViews = createLrcPreviewViews(parseLrc(codeText), ctx.file.name, messages, body, wrapButton);\n        wrapper.append(lrcViews.modeBar, lrcViews.annotatedView, lrcViews.displayView);\n      }\n      if (structureSummary) {\n        wrapper.append(structureSummary);\n      }\n      if (truncated) {\n        const notice = document.createElement(\"div\");\n        notice.className = \"ofv-code-notice\";\n        notice.textContent = formatPreviewMessage(messages.textLargeFileNotice, { size: formatBytes(codeText.length) });\n        wrapper.append(notice);\n      }\n      if (!shouldHighlight) {\n        const notice = document.createElement(\"div\");\n        notice.className = \"ofv-code-notice\";\n        notice.textContent = messages.textHighlightSkipped;\n        wrapper.append(notice);\n      }\n      wrapper.appendChild(body);\n      ctx.viewport.appendChild(wrapper);\n\n      if (shouldHighlight) {\n        try {\n          Prism.highlightElement(code);\n        } catch (err) {\n          console.error(\"Prism syntax highlighting failed:\", err);\n        }\n      }\n\n      const codeZoom = createTextZoomController(wrapper, \"--ofv-text-zoom\", ctx);\n\n      return {\n        canCommand(command) {\n          return codeZoom.canCommand(command);\n        },\n        command(command) {\n          return codeZoom.command(command);\n        },\n        destroy() {\n          wrapper.remove();\n        }\n      };\n    }\n  };\n}\n\nfunction getPrismLanguageFromElement(element: Element | null): string | undefined {\n  if (!element) {\n    return undefined;\n  }\n  for (const className of element.classList) {\n    if (className.startsWith(\"language-\") && className.length > 9) {\n      return className.slice(9).toLowerCase();\n    }\n  }\n  return undefined;\n}\n\ntype MermaidApi = (typeof import(\"mermaid\"))[\"default\"];\ntype MarkdownSanitizer = { sanitize(source: string, config: Record<string, unknown>): string };\n\nlet mermaidLoad: Promise<MermaidApi> | undefined;\nlet mermaidRenderSeq = 0;\n\nfunction loadMermaid(): Promise<MermaidApi> {\n  mermaidLoad ||= import(\"mermaid\")\n    .then((module) => {\n      const mermaid = (module.default || module) as MermaidApi;\n      mermaid.initialize({\n        startOnLoad: false,\n        securityLevel: \"strict\",\n        theme: \"default\",\n        // Keep labels as plain SVG text: foreignObject html labels are stripped by DOMPurify.\n        htmlLabels: false,\n        flowchart: { htmlLabels: false },\n        class: { htmlLabels: false }\n      });\n      return mermaid;\n    })\n    .catch((error) => {\n      mermaidLoad = undefined;\n      throw error;\n    });\n  return mermaidLoad;\n}\n\n// Mermaid's default maxTextSize: longer inputs are silently replaced with a\n// \"Maximum text size in diagram exceeded\" placeholder instead of throwing.\nconst MERMAID_MAX_TEXT_CHARS = 50_000;\n\nasync function renderMermaidFile(ctx: PreviewContext, text: string): Promise<PreviewInstance | undefined> {\n  if (text.length > MERMAID_MAX_TEXT_CHARS) {\n    return undefined;\n  }\n  const renderId = `ofv-mermaid-${++mermaidRenderSeq}`;\n  let svg: string;\n  try {\n    const [mermaid, DOMPurifyModule] = await Promise.all([loadMermaid(), import(\"dompurify\")]);\n    const DOMPurify = (DOMPurifyModule.default || DOMPurifyModule) as MarkdownSanitizer;\n    const rendered = await mermaid.render(renderId, text);\n    svg = DOMPurify.sanitize(rendered.svg, { USE_PROFILES: { svg: true, svgFilters: true } });\n  } catch (error) {\n    document.getElementById(renderId)?.remove();\n    document.getElementById(`d${renderId}`)?.remove();\n    console.warn(\"Mermaid file render failed, falling back to source view:\", error);\n    return undefined;\n  }\n\n  const container = document.createElement(\"div\");\n  container.className = \"ofv-mermaid-file\";\n  const zoomLayer = document.createElement(\"div\");\n  zoomLayer.className = \"ofv-mermaid-zoom-layer\";\n  const diagram = document.createElement(\"div\");\n  diagram.className = \"ofv-mermaid\";\n  diagram.innerHTML = svg;\n  zoomLayer.appendChild(diagram);\n  container.appendChild(zoomLayer);\n  ctx.viewport.appendChild(container);\n\n  const zoom = createTextZoomController(container, \"--ofv-mermaid-zoom\", ctx, zoomLayer);\n\n  return {\n    canCommand(command) {\n      return zoom.canCommand(command);\n    },\n    command(command) {\n      return zoom.command(command);\n    },\n    destroy() {\n      container.remove();\n    }\n  };\n}\n\nasync function renderMermaidBlocks(container: HTMLElement, DOMPurify: MarkdownSanitizer): Promise<void> {\n  const blocks = Array.from(container.querySelectorAll<HTMLElement>(\"pre > code.language-mermaid\")).filter(\n    (block) => (block.textContent ?? \"\").length <= MERMAID_MAX_TEXT_CHARS\n  );\n  if (blocks.length === 0) {\n    return;\n  }\n  const mermaid = await loadMermaid();\n  for (const block of blocks) {\n    const pre = block.parentElement;\n    if (!pre) {\n      continue;\n    }\n    const renderId = `ofv-mermaid-${++mermaidRenderSeq}`;\n    try {\n      const { svg } = await mermaid.render(renderId, block.textContent ?? \"\");\n      const diagram = document.createElement(\"div\");\n      diagram.className = \"ofv-mermaid\";\n      diagram.innerHTML = DOMPurify.sanitize(svg, { USE_PROFILES: { svg: true, svgFilters: true } });\n      pre.replaceWith(diagram);\n    } catch (error) {\n      // Keep the source code block and drop any temp nodes mermaid left in document.body.\n      document.getElementById(renderId)?.remove();\n      document.getElementById(`d${renderId}`)?.remove();\n      console.warn(\"Mermaid diagram render failed, keeping source block:\", error);\n    }\n  }\n}\n\nasync function loadPrismLanguage(language: string): Promise<void> {\n  if ([\"none\", \"plain\", \"plaintext\", \"text\", \"markup\", \"css\", \"clike\", \"javascript\"].includes(language)) {\n    return;\n  }\n\n  const existing = prismLanguageLoads.get(language);\n  if (existing) {\n    return existing;\n  }\n\n  const loading = loadPrismLanguageComponent(language).catch((error) => {\n    prismLanguageLoads.delete(language);\n    throw error;\n  });\n  prismLanguageLoads.set(language, loading);\n  return loading;\n}\n\nasync function loadPrismLanguageComponent(language: string): Promise<void> {\n  switch (language) {\n    case \"typescript\": await import(\"prismjs/components/prism-typescript\"); break;\n    case \"jsx\": await import(\"prismjs/components/prism-jsx\"); break;\n    case \"tsx\":\n      await import(\"./prism-languages/tsx\");\n      break;\n    case \"python\": await import(\"prismjs/components/prism-python\"); break;\n    case \"json\": await import(\"prismjs/components/prism-json\"); break;\n    case \"json5\":\n      await import(\"./prism-languages/json5\");\n      break;\n    case \"yaml\": await import(\"prismjs/components/prism-yaml\"); break;\n    case \"toml\": await import(\"prismjs/components/prism-toml\"); break;\n    case \"ini\": await import(\"prismjs/components/prism-ini\"); break;\n    case \"properties\": await import(\"prismjs/components/prism-properties\"); break;\n    case \"editorconfig\": await import(\"prismjs/components/prism-editorconfig\"); break;\n    case \"ignore\": await import(\"prismjs/components/prism-ignore\"); break;\n    case \"protobuf\": await import(\"prismjs/components/prism-protobuf\"); break;\n    case \"hcl\": await import(\"prismjs/components/prism-hcl\"); break;\n    case \"latex\": await import(\"prismjs/components/prism-latex\"); break;\n    case \"dot\": await import(\"prismjs/components/prism-dot\"); break;\n    case \"http\": await import(\"prismjs/components/prism-http\"); break;\n    case \"bash\": await import(\"prismjs/components/prism-bash\"); break;\n    case \"powershell\": await import(\"prismjs/components/prism-powershell\"); break;\n    case \"batch\": await import(\"prismjs/components/prism-batch\"); break;\n    case \"docker\": await import(\"prismjs/components/prism-docker\"); break;\n    case \"makefile\": await import(\"prismjs/components/prism-makefile\"); break;\n    case \"ruby\": await import(\"prismjs/components/prism-ruby\"); break;\n    case \"nginx\": await import(\"prismjs/components/prism-nginx\"); break;\n    case \"groovy\": await import(\"prismjs/components/prism-groovy\"); break;\n    case \"graphql\": await import(\"prismjs/components/prism-graphql\"); break;\n    case \"csharp\": await import(\"prismjs/components/prism-csharp\"); break;\n    case \"rust\": await import(\"prismjs/components/prism-rust\"); break;\n    case \"go\": await import(\"prismjs/components/prism-go\"); break;\n    case \"swift\": await import(\"prismjs/components/prism-swift\"); break;\n    case \"kotlin\": await import(\"prismjs/components/prism-kotlin\"); break;\n    case \"java\": await import(\"prismjs/components/prism-java\"); break;\n    case \"scala\":\n      await import(\"./prism-languages/scala\");\n      break;\n    case \"lua\": await import(\"prismjs/components/prism-lua\"); break;\n    case \"r\": await import(\"prismjs/components/prism-r\"); break;\n    case \"dart\": await import(\"prismjs/components/prism-dart\"); break;\n    case \"elm\": await import(\"prismjs/components/prism-elm\"); break;\n    case \"elixir\": await import(\"prismjs/components/prism-elixir\"); break;\n    case \"clojure\": await import(\"prismjs/components/prism-clojure\"); break;\n    case \"erlang\": await import(\"prismjs/components/prism-erlang\"); break;\n    case \"fsharp\": await import(\"prismjs/components/prism-fsharp\"); break;\n    case \"haskell\": await import(\"prismjs/components/prism-haskell\"); break;\n    case \"sql\": await import(\"prismjs/components/prism-sql\"); break;\n    case \"c\": await import(\"prismjs/components/prism-c\"); break;\n    case \"cpp\":\n      await import(\"./prism-languages/cpp\");\n      break;\n    case \"scss\": await import(\"prismjs/components/prism-scss\"); break;\n    case \"less\": await import(\"prismjs/components/prism-less\"); break;\n    case \"markup-templating\": await import(\"prismjs/components/prism-markup-templating\"); break;\n    case \"php\":\n      await import(\"./prism-languages/php\");\n      break;\n  }\n}\n\nfunction createTextZoomController(\n  target: HTMLElement,\n  cssVariable: string,\n  ctx: PreviewContext,\n  pinnedLayer?: HTMLElement\n) {\n  let zoom = getInitialZoom(ctx, 0.5, 3);\n\n  const apply = () => {\n    const normalized = Math.round(zoom * 100) / 100;\n    if (pinnedLayer) {\n      // The layer scales via the CSS `zoom` property; pin it to its pre-zoom\n      // width so the content magnifies past the scroller's edge (horizontal\n      // scrollbar) instead of re-wrapping to the container width. Measure with\n      // the zoom var at 1 — a zoomed layer reports divided client sizes.\n      pinnedLayer.style.width = \"\";\n      target.style.setProperty(cssVariable, \"1\");\n      if (normalized !== 1) {\n        const base = pinnedLayer.clientWidth;\n        if (base > 0) {\n          pinnedLayer.style.width = `${base}px`;\n        }\n      }\n    }\n    target.style.setProperty(cssVariable, String(normalized));\n    ctx.toolbar?.setZoom(normalized === 1 ? undefined : normalized);\n  };\n\n  apply();\n\n  return {\n    canCommand(command: PreviewCommand) {\n      return command === \"zoom-in\" || command === \"zoom-out\" || command === \"zoom-reset\";\n    },\n    command(command: PreviewCommand) {\n      if (command === \"zoom-in\") {\n        zoom = Math.min(3, zoom * 1.15);\n        apply();\n        return true;\n      }\n      if (command === \"zoom-out\") {\n        zoom = Math.max(0.5, zoom / 1.15);\n        apply();\n        return true;\n      }\n      if (command === \"zoom-reset\") {\n        zoom = 1;\n        apply();\n        return true;\n      }\n      return false;\n    }\n  };\n}\n\nfunction getTextLanguage(fileName: string, extension: string, mimeType: string): string {\n  const normalizedFileName = normalizeFileName(fileName);\n  return (\n    langMap[extension] ||\n    filenameLangMap[normalizedFileName] ||\n    filenameLangMap[normalizedFileName.split(\".\")[0]] ||\n    mimeLangMap[mimeType.toLowerCase()] ||\n    \"none\"\n  );\n}\n\nfunction normalizeFileName(name: string): string {\n  const baseName = name.split(/[\\\\/]/).pop() || name;\n  return baseName.toLowerCase();\n}\n\nfunction createTextFallback(fileName: string, messages: PreviewMessages, url?: string): HTMLElement {\n  const fallback = document.createElement(\"div\");\n  fallback.className = \"ofv-fallback\";\n\n  const title = document.createElement(\"strong\");\n  title.textContent = messages.textPreviewFailedTitle;\n\n  const meta = document.createElement(\"span\");\n  meta.textContent = messages.textPreviewFailedMessage;\n\n  fallback.append(title, meta);\n  if (url) {\n    const download = document.createElement(\"a\");\n    download.href = url;\n    download.download = fileName;\n    download.textContent = messages.textOpenOriginal;\n    fallback.append(download);\n  }\n  return fallback;\n}\n\nfunction secureMarkdownLinks(container: HTMLElement): void {\n  for (const link of container.querySelectorAll<HTMLAnchorElement>(\"a[href]\")) {\n    const href = link.getAttribute(\"href\") || \"\";\n    if (!isSafeMarkdownHref(href)) {\n      link.removeAttribute(\"href\");\n      link.removeAttribute(\"target\");\n      link.removeAttribute(\"rel\");\n      continue;\n    }\n    if (/^(https?:)?\\/\\//i.test(href)) {\n      link.target = \"_blank\";\n      link.rel = \"noopener noreferrer\";\n    }\n  }\n}\n\nfunction assignMarkdownHeadingAnchors(container: HTMLElement): void {\n  const usedIds = new Set<string>(\n    Array.from(container.querySelectorAll<HTMLElement>(\"[id]\"))\n      .map((element) => element.id)\n      .filter(Boolean)\n  );\n  let fallbackIndex = 0;\n  for (const heading of container.querySelectorAll<HTMLElement>(\"h1, h2, h3, h4, h5, h6\")) {\n    if (heading.id) {\n      continue;\n    }\n    const baseId = createMarkdownAnchorId(heading.textContent || \"\") || `heading-${++fallbackIndex}`;\n    heading.id = uniquifyMarkdownAnchorId(baseId, usedIds);\n  }\n}\n\nfunction enableMarkdownAnchorNavigation(container: HTMLElement): () => void {\n  const onClick = (event: MouseEvent) => {\n    const link = (event.target as Element | null)?.closest?.(\"a[href]\") as HTMLAnchorElement | null;\n    if (!link || !container.contains(link)) {\n      return;\n    }\n    const href = link.getAttribute(\"href\") || \"\";\n    if (!href.startsWith(\"#\") || href === \"#\") {\n      return;\n    }\n    const target = findMarkdownAnchorTarget(container, href.slice(1));\n    if (!target) {\n      return;\n    }\n    event.preventDefault();\n    target.scrollIntoView?.({ block: \"start\", inline: \"nearest\" });\n    if (!target.hasAttribute(\"tabindex\")) {\n      target.setAttribute(\"tabindex\", \"-1\");\n    }\n    target.focus?.({ preventScroll: true });\n  };\n  container.addEventListener(\"click\", onClick);\n  return () => container.removeEventListener(\"click\", onClick);\n}\n\nfunction findMarkdownAnchorTarget(container: HTMLElement, rawAnchor: string): HTMLElement | null {\n  const anchor = decodeMarkdownAnchor(rawAnchor);\n  const byId = container.querySelector<HTMLElement>(`#${escapeCssIdentifier(anchor)}`);\n  if (byId) {\n    return byId;\n  }\n  const normalizedAnchor = createMarkdownAnchorId(anchor);\n  return (\n    Array.from(container.querySelectorAll<HTMLElement>(\"h1, h2, h3, h4, h5, h6\")).find((heading) => {\n      const text = heading.textContent || \"\";\n      return text === anchor || createMarkdownAnchorId(text) === normalizedAnchor;\n    }) || null\n  );\n}\n\nfunction createMarkdownAnchorId(text: string): string {\n  return text\n    .trim()\n    .toLowerCase()\n    .replace(/<[^>]*>/g, \"\")\n    .replace(/[`~!@#$%^&*()+=[\\]{}\\\\|;:'\",.<>/?，。！？、；：“”‘’（）【】《》]/g, \"\")\n    .replace(/\\s+/g, \"-\")\n    .replace(/-+/g, \"-\")\n    .replace(/^-|-$/g, \"\");\n}\n\nfunction uniquifyMarkdownAnchorId(baseId: string, usedIds: Set<string>): string {\n  let id = baseId;\n  let index = 1;\n  while (usedIds.has(id)) {\n    id = `${baseId}-${index++}`;\n  }\n  usedIds.add(id);\n  return id;\n}\n\nfunction decodeMarkdownAnchor(anchor: string): string {\n  try {\n    return decodeURIComponent(anchor);\n  } catch {\n    return anchor;\n  }\n}\n\nfunction escapeCssIdentifier(value: string): string {\n  if (typeof CSS !== \"undefined\" && typeof CSS.escape === \"function\") {\n    return CSS.escape(value);\n  }\n  return value.replace(/[\"\\\\#.;,[\\]()>/+~*^$|=!:\\s]/g, \"\\\\$&\");\n}\n\nfunction isSafeMarkdownHref(href: string): boolean {\n  const trimmed = href.trim();\n  return (\n    trimmed.startsWith(\"#\") ||\n    trimmed.startsWith(\"/\") ||\n    trimmed.startsWith(\"./\") ||\n    trimmed.startsWith(\"../\") ||\n    /^(https?:|mailto:|tel:)/i.test(trimmed)\n  );\n}\n\nfunction countLines(text: string): number {\n  if (!text) {\n    return 1;\n  }\n  return text.split(/\\r\\n|\\r|\\n/).length;\n}\n\nfunction createTextStructureSummary(text: string, extension: string, language: string, mimeType: string): HTMLElement | null {\n  if (text.length > MAX_RENDER_CHARS) {\n    return null;\n  }\n  const items = summarizeTextStructure(text, extension, language, mimeType);\n  if (items.length === 0) {\n    return null;\n  }\n  const summary = document.createElement(\"div\");\n  summary.className = \"ofv-text-structure\";\n  summary.hidden = true;\n  summary.setAttribute(\"aria-hidden\", \"true\");\n  summary.style.display = \"none\";\n  for (const item of items) {\n    const row = document.createElement(\"span\");\n    const label = document.createElement(\"span\");\n    label.textContent = item.label;\n    const value = document.createElement(\"strong\");\n    value.textContent = item.value;\n    row.append(label, value);\n    summary.append(row);\n  }\n  return summary;\n}\n\nfunction summarizeTextStructure(\n  text: string,\n  extension: string,\n  language: string,\n  mimeType: string\n): Array<{ label: string; value: string }> {\n  if (extension === \"ipynb\" || mimeType === \"application/x-ipynb+json\") {\n    return summarizeNotebook(text);\n  }\n  if (extension === \"ndjson\" || extension === \"jsonl\" || mimeType === \"application/x-ndjson\") {\n    return summarizeNdjson(text);\n  }\n  if (language === \"json\" || language === \"json5\") {\n    return summarizeJson(text);\n  }\n  return [];\n}\n\nfunction summarizeJson(text: string): Array<{ label: string; value: string }> {\n  try {\n    const data = JSON.parse(text) as unknown;\n    if (Array.isArray(data)) {\n      return [\n        { label: \"结构\", value: \"Array\" },\n        { label: \"条目\", value: String(data.length) }\n      ];\n    }\n    if (data && typeof data === \"object\") {\n      const keys = Object.keys(data as Record<string, unknown>);\n      return [\n        { label: \"结构\", value: \"Object\" },\n        { label: \"键\", value: String(keys.length) },\n        { label: \"预览\", value: keys.slice(0, 8).join(\", \") || \"无键\" }\n      ];\n    }\n    return [{ label: \"结构\", value: typeof data }];\n  } catch {\n    return [];\n  }\n}\n\nfunction summarizeNotebook(text: string): Array<{ label: string; value: string }> {\n  try {\n    const notebook = JSON.parse(text) as {\n      cells?: Array<{ cell_type?: string; source?: string | string[] }>;\n      metadata?: { kernelspec?: { display_name?: string; name?: string }; language_info?: { name?: string } };\n    };\n    if (!Array.isArray(notebook.cells)) {\n      return summarizeJson(text);\n    }\n    const counts = new Map<string, number>();\n    for (const cell of notebook.cells) {\n      const type = cell.cell_type || \"unknown\";\n      counts.set(type, (counts.get(type) || 0) + 1);\n    }\n    const kernel = notebook.metadata?.kernelspec?.display_name || notebook.metadata?.kernelspec?.name || notebook.metadata?.language_info?.name;\n    return [\n      { label: \"Notebook\", value: `${notebook.cells.length} cells` },\n      { label: \"类型\", value: [...counts.entries()].map(([type, count]) => `${type} ${count}`).join(\", \") || \"未知\" },\n      ...(kernel ? [{ label: \"Kernel\", value: kernel }] : [])\n    ];\n  } catch {\n    return [];\n  }\n}\n\nfunction summarizeNdjson(text: string): Array<{ label: string; value: string }> {\n  const lines = text.split(/\\r\\n|\\r|\\n/).filter((line) => line.trim());\n  let parsed = 0;\n  let objects = 0;\n  let arrays = 0;\n  for (const line of lines.slice(0, 1000)) {\n    try {\n      const value = JSON.parse(line);\n      parsed++;\n      if (Array.isArray(value)) {\n        arrays++;\n      } else if (value && typeof value === \"object\") {\n        objects++;\n      }\n    } catch {\n      // keep counting valid rows only\n    }\n  }\n  return [\n    { label: \"NDJSON\", value: `${lines.length} lines` },\n    { label: \"可解析\", value: String(parsed) },\n    { label: \"类型\", value: `object ${objects}, array ${arrays}` }\n  ];\n}\n\nfunction createLineNumbers(lines: number): string {\n  return Array.from({ length: Math.max(lines, 1) }, (_, index) => String(index + 1)).join(\"\\n\");\n}\n\nfunction formatBytes(bytes: number): string {\n  if (!Number.isFinite(bytes) || bytes < 0) {\n    return \"0 B\";\n  }\n  if (bytes < 1024) {\n    return `${bytes} B`;\n  }\n  const units = [\"KB\", \"MB\", \"GB\"];\n  let value = bytes / 1024;\n  let unitIndex = 0;\n  while (value >= 1024 && unitIndex < units.length - 1) {\n    value /= 1024;\n    unitIndex += 1;\n  }\n  return `${value.toFixed(value >= 10 ? 1 : 2)} ${units[unitIndex]}`;\n}\n\nasync function copyToClipboard(text: string): Promise<void> {\n  if (navigator.clipboard?.writeText) {\n    await navigator.clipboard.writeText(text);\n    return;\n  }\n\n  const textarea = document.createElement(\"textarea\");\n  textarea.value = text;\n  textarea.setAttribute(\"readonly\", \"\");\n  textarea.style.position = \"fixed\";\n  textarea.style.left = \"-9999px\";\n  document.body.append(textarea);\n  textarea.select();\n  const copied = document.execCommand?.(\"copy\");\n  textarea.remove();\n  if (!copied) {\n    throw new Error(\"Clipboard API is not available.\");\n  }\n}\n\nfunction downloadText(fileName: string, text: string): void {\n  const blob = new Blob([text], { type: \"text/plain;charset=utf-8\" });\n  const url = URL.createObjectURL(blob);\n  const link = document.createElement(\"a\");\n  link.href = url;\n  link.download = fileName;\n  document.body.append(link);\n  link.click();\n  link.remove();\n  URL.revokeObjectURL(url);\n}\n\nasync function readText(source: unknown): Promise<string> {\n  if (typeof source === \"string\") {\n    const response = await fetch(source);\n    if (!response.ok) {\n      throw new Error(`Failed to fetch text file: ${response.status}`);\n    }\n    return decodeTextBuffer(await response.arrayBuffer());\n  }\n  if (source instanceof Blob) {\n    return decodeTextBuffer(await source.arrayBuffer());\n  }\n  if (source instanceof ArrayBuffer) {\n    return decodeTextBuffer(source);\n  }\n  return String(source);\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewContext, PreviewFile } from \"../types\";\n\nexport type EncryptedPreviewCopy = {\n  title?: string;\n  message?: string;\n  action?: string;\n};\n\nexport function createEncryptedPreview(\n  ctx: PreviewContext,\n  copy: EncryptedPreviewCopy = {}\n): { element: HTMLElement; destroy: () => void } {\n  const url = createObjectUrl(ctx.file);\n  const isExternal = Boolean(ctx.file.url);\n  const element = createEncryptedFallback(ctx.file, url, copy);\n  return {\n    element,\n    destroy() {\n      revokeObjectUrl(url, isExternal);\n    }\n  };\n}\n\nexport function createEncryptedFallback(file: PreviewFile, url: string, copy: EncryptedPreviewCopy = {}): HTMLElement {\n  const fallback = document.createElement(\"div\");\n  fallback.className = \"ofv-fallback ofv-encrypted\";\n\n  const title = document.createElement(\"strong\");\n  title.textContent = copy.title || \"文件已加密，无法在线预览\";\n\n  const message = document.createElement(\"span\");\n  message.textContent = copy.message || \"请下载后在本地输入密码打开，或上传解密后的文件。\";\n\n  const meta = document.createElement(\"dl\");\n  meta.className = \"ofv-fallback-meta ofv-encrypted-meta\";\n  appendEncryptedMeta(meta, \"文件\", file.name || \"未命名文件\");\n  appendEncryptedMeta(meta, \"格式\", file.extension ? `.${file.extension}` : file.mimeType || \"未知\");\n\n  const download = document.createElement(\"a\");\n  download.href = url;\n  download.download = file.name;\n  download.textContent = copy.action || \"下载文件\";\n\n  fallback.append(title, message, meta, download);\n  return fallback;\n}\n\nexport function isEncryptedError(error: unknown): boolean {\n  const message = error instanceof Error ? error.message : String(error || \"\");\n  const name = typeof error === \"object\" && error !== null && \"name\" in error ? String((error as { name?: unknown }).name) : \"\";\n  return /\\b(password|encrypted|encrypt|protected|decrypt|permission|加密|密码|受保护)\\b/i.test(`${name} ${message}`);\n}\n\nfunction appendEncryptedMeta(parent: HTMLElement, label: string, value: string): void {\n  const key = document.createElement(\"dt\");\n  key.textContent = label;\n  const content = document.createElement(\"dd\");\n  content.textContent = value;\n  parent.append(key, content);\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport { defaultMessages, formatPreviewMessage } from \"../messages\";\nimport type { PreviewCommand, PreviewFit, PreviewInstance, PreviewMessages, PreviewPlugin, PreviewSize } from \"../types\";\nimport { createEncryptedFallback, isEncryptedError } from \"./encrypted\";\nimport { getInitialZoom } from \"./utils\";\n\ntype PdfJsModule = typeof import(\"pdfjs-dist\");\nexport type PdfWebFallbackScripts = \"auto\" | \"never\" | \"always\";\ntype PdfDocumentProxyLike = {\n  numPages: number;\n  getPage(pageNumber: number): Promise<any>;\n  destroy?: unknown;\n  cleanup?: unknown;\n};\n\nexport interface PdfPluginOptions {\n  pdfjs?: PdfJsModule;\n  workerSrc?: string;\n  compatibilityMode?: \"auto\" | \"modern\" | \"legacy\";\n  cMapUrl?: string;\n  cMapPacked?: boolean;\n  standardFontDataUrl?: string;\n  useSystemFonts?: boolean;\n  disableStream?: boolean;\n  disableAutoFetch?: boolean;\n  disableRange?: boolean;\n  rangeChunkSize?: number;\n  useFetchData?: boolean;\n  webFallbackScripts?: PdfWebFallbackScripts;\n}\n\nexport interface PdfDocumentPreviewOptions {\n  fileName: string;\n  fileUrl: string;\n  fileSize?: number;\n  isExternal?: boolean;\n  viewport: HTMLElement;\n  size: PreviewSize;\n  fit: PreviewFit;\n  zoom?: number;\n  toolbar?: {\n    setZoom(value: number | undefined): void;\n  };\n  pdfjs?: PdfJsModule;\n  workerSrc?: string;\n  compatibilityMode?: \"auto\" | \"modern\" | \"legacy\";\n  cMapUrl?: string;\n  cMapPacked?: boolean;\n  standardFontDataUrl?: string;\n  useSystemFonts?: boolean;\n  disableStream?: boolean;\n  disableAutoFetch?: boolean;\n  disableRange?: boolean;\n  rangeChunkSize?: number;\n  useFetchData?: boolean;\n  webFallbackScripts?: PdfWebFallbackScripts;\n  title?: string;\n  fallbackTitle?: string;\n  encryptedTitle?: string;\n  encryptedMessage?: string;\n  encryptedAction?: string;\n  messages?: Partial<PreviewMessages>;\n  revokeUrlOnDestroy?: boolean;\n}\n\n// 2D affine transform matrix multiplication helper\nfunction multiplyMatrices(m1: number[], m2: number[]): number[] {\n  return [\n    m1[0] * m2[0] + m1[2] * m2[1],\n    m1[1] * m2[0] + m1[3] * m2[1],\n    m1[0] * m2[2] + m1[2] * m2[3],\n    m1[1] * m2[2] + m1[3] * m2[3],\n    m1[0] * m2[4] + m1[2] * m2[5] + m1[4],\n    m1[1] * m2[4] + m1[3] * m2[5] + m1[5]\n  ];\n}\n\nexport function pdfPlugin(options: PdfJsModule | PdfPluginOptions = {}): PreviewPlugin {\n  return {\n    name: \"pdf\",\n    match(file) {\n      return file.mimeType === \"application/pdf\" || file.extension === \"pdf\";\n    },\n    async render(ctx) {\n      const normalizedOptions = normalizePdfOptions(options);\n      const url = createObjectUrl(ctx.file);\n      const isExternal = Boolean(ctx.file.url);\n      return renderPdfDocumentPreview({\n        ...normalizedOptions,\n        fileName: ctx.file.name,\n        fileUrl: url,\n        fileSize: ctx.file.size,\n        isExternal,\n        viewport: ctx.viewport,\n        size: ctx.size,\n        // A scrolling PDF reader historically defaulted to fit-width. Keep\n        // that behavior when the host did not choose a fit mode, while still\n        // honoring explicit contain/height/cover/scale-down requests.\n        fit: ctx.options.fitWasProvided ? ctx.options.fit : \"width\",\n        zoom: ctx.options.zoom,\n        toolbar: ctx.toolbar,\n        messages: ctx.options.messages,\n        revokeUrlOnDestroy: true\n      });\n    }\n  };\n}\n\nexport async function renderPdfDocumentPreview(\n  options: PdfDocumentPreviewOptions\n): Promise<\n  PreviewInstance & {\n    canCommand(command: PreviewCommand): boolean;\n    command(command: PreviewCommand): boolean;\n    resize(size: PreviewSize): void;\n  }\n> {\n  const useLegacyCompatibility = shouldUseLegacyPdfCompatibility(options.compatibilityMode);\n  if (useLegacyCompatibility) {\n    installPromiseWithResolversPolyfill();\n  }\n  const pdf = options.pdfjs || (await import(\"pdfjs-dist\"));\n  const messages: PreviewMessages = { ...defaultMessages[\"en-US\"], ...options.messages };\n  configurePdfWorker(pdf, options.workerSrc, useLegacyCompatibility);\n\n  const viewer = document.createElement(\"div\");\n  viewer.className = \"ofv-pdf-viewer\";\n  if (options.title) {\n    const title = document.createElement(\"strong\");\n    title.className = \"ofv-pdf-viewer-title\";\n    title.textContent = options.title;\n    viewer.append(title);\n  }\n  const summary = document.createElement(\"div\");\n  summary.className = \"ofv-pdf-summary\";\n  summary.hidden = true;\n  summary.setAttribute(\"aria-hidden\", \"true\");\n  summary.style.display = \"none\";\n  const scroller = document.createElement(\"div\");\n  scroller.className = \"ofv-pdf ofv-pdf-pages\";\n  viewer.append(summary, scroller);\n  options.viewport.append(viewer);\n\n  const showDocumentFallback = (error: unknown) => {\n    viewer.remove();\n    const fileLike = {\n      source: options.fileUrl,\n      name: options.fileName,\n      extension: options.fileName.includes(\".\") ? options.fileName.split(\".\").pop() || \"pdf\" : \"pdf\",\n      mimeType: \"application/pdf\",\n      size: options.fileSize,\n      url: options.fileUrl\n    };\n    const fallback = isEncryptedError(error)\n      ? createEncryptedFallback(fileLike, options.fileUrl, {\n          title: options.encryptedTitle || messages.pdfEncryptedTitle,\n          message: options.encryptedMessage || messages.pdfEncryptedMessage,\n          action: options.encryptedAction || messages.pdfDownload\n        })\n      : createPdfFallback(\n          options.fileName,\n          options.fileUrl,\n          normalizePdfError(error, messages),\n          messages,\n          options.fallbackTitle,\n          options.webFallbackScripts\n        );\n    if (!fallback.classList.contains(\"ofv-pdf-web-fallback\")) {\n      options.viewport.classList.add(\"ofv-center\");\n    }\n    options.viewport.append(fallback);\n  };\n\n  let documentTask: ReturnType<PdfJsModule[\"getDocument\"]> | undefined;\n  let doc: PdfDocumentProxyLike | undefined;\n  try {\n    const pdfData = options.useFetchData ? await loadPdfData(options.fileUrl) : undefined;\n    documentTask = pdf.getDocument({\n      ...(pdfData ? { data: pdfData } : { url: options.fileUrl }),\n      cMapUrl: options.cMapUrl ?? `https://cdn.jsdelivr.net/npm/pdfjs-dist@${pdf.version}/cmaps/`,\n      cMapPacked: options.cMapPacked ?? true,\n      standardFontDataUrl: options.standardFontDataUrl ?? `https://cdn.jsdelivr.net/npm/pdfjs-dist@${pdf.version}/standard_fonts/`,\n      useSystemFonts: options.useSystemFonts ?? true,\n      disableStream: options.disableStream,\n      disableAutoFetch: options.disableAutoFetch,\n      disableRange: options.disableRange,\n      rangeChunkSize: options.rangeChunkSize\n    });\n    doc = (await documentTask.promise.catch((error: unknown) => {\n      showDocumentFallback(error);\n      return undefined;\n    })) as PdfDocumentProxyLike | undefined;\n  } catch (error) {\n    showDocumentFallback(error);\n  }\n\n  if (!doc) {\n    return {\n      canCommand() {\n        return false;\n      },\n      command() {\n        return false;\n      },\n      resize() {},\n      destroy() {\n        options.viewport.classList.remove(\"ofv-center\");\n        destroyPdfResource(documentTask);\n        if (options.revokeUrlOnDestroy) {\n          revokeObjectUrl(options.fileUrl, Boolean(options.isExternal));\n        }\n      }\n    };\n  }\n  const pdfDocument = doc;\n\n  const pagesMeta: Array<{ width: number; height: number; rotation: number }> = [];\n  for (let pageNumber = 1; pageNumber <= pdfDocument.numPages; pageNumber += 1) {\n    try {\n      const page = await pdfDocument.getPage(pageNumber);\n      const baseViewport = page.getViewport({ scale: 1 });\n      pagesMeta.push({\n        width: baseViewport.width,\n        height: baseViewport.height,\n        rotation: getPdfPageRotation(page)\n      });\n    } catch {\n      pagesMeta.push({ width: 612, height: 792, rotation: 0 });\n    }\n  }\n\n  const pageStates: Array<{\n    wrapper: HTMLDivElement;\n    canvas: HTMLCanvasElement | null;\n    renderTask: any | null;\n    renderPromise: Promise<void> | null;\n    rendered: boolean;\n  }> = [];\n\n  let observer: IntersectionObserver | null = null;\n  let printPreparation: Promise<void> | undefined;\n  let currentSize = options.size;\n  let zoomFactor = getInitialZoom({ options: { zoom: options.zoom ?? 1 } }, 0.25, 4);\n  let rotation = 0;\n  let currentPage = 1;\n\n  // The scroller's clientWidth already excludes its (persistent) scrollbars;\n  // sizing pages from the outer viewer width would overflow by the scrollbar\n  // width and show a permanent sliver of horizontal scroll at 100%.\n  const resolveLayoutWidth = (size: PreviewSize) =>\n    scroller.clientWidth > 0 ? scroller.clientWidth : size.width;\n  const resolveLayoutHeight = (size: PreviewSize) =>\n    scroller.clientHeight > 0 ? scroller.clientHeight : size.height;\n\n  const goToPage = (page: number, scroll = true) => {\n    currentPage = Math.min(pdfDocument.numPages, Math.max(1, Math.round(page) || 1));\n    pageNavigator.setCurrent(currentPage);\n    const wrapper = pageStates[currentPage - 1]?.wrapper;\n    if (!scroll || !wrapper) {\n      return true;\n    }\n    void renderPage(currentPage - 1, currentSize);\n    const top = Math.max(0, wrapper.offsetTop - 16);\n    if (typeof scroller.scrollTo === \"function\") {\n      scroller.scrollTo({ top, behavior: \"smooth\" });\n    } else {\n      scroller.scrollTop = top;\n    }\n    return true;\n  };\n\n  const pageNavigator = createPdfPageNavigator(pdfDocument.numPages, messages, (page) => goToPage(page));\n  viewer.insertBefore(pageNavigator.element, summary);\n\n  const handleScrollerScroll = () => {\n    const scrollerRect = scroller.getBoundingClientRect();\n    const targetY = scrollerRect.top + Math.min(Math.max(scroller.clientHeight * 0.25, 40), 180);\n    let nearestPage = currentPage;\n    let nearestDistance = Number.POSITIVE_INFINITY;\n    pageStates.forEach((state, index) => {\n      const distance = Math.abs(state.wrapper.getBoundingClientRect().top - targetY);\n      if (distance < nearestDistance) {\n        nearestDistance = distance;\n        nearestPage = index + 1;\n      }\n    });\n    if (nearestPage !== currentPage) {\n      currentPage = nearestPage;\n      pageNavigator.setCurrent(currentPage);\n    }\n  };\n  scroller.addEventListener(\"scroll\", handleScrollerScroll, { passive: true });\n\n  const updateSummary = () => {\n    renderPdfSummary(summary, pdfDocument.numPages, pagesMeta, options.fit, zoomFactor, messages);\n    options.toolbar?.setZoom(zoomFactor);\n  };\n\n  const clearPage = (pageIdx: number) => {\n    const state = pageStates[pageIdx];\n    if (!state || !state.rendered) return;\n\n    if (state.renderTask) {\n      try {\n        state.renderTask.cancel();\n      } catch (e) {\n        // Ignore cancel errors\n      }\n      state.renderTask = null;\n    }\n\n    state.canvas = null;\n    state.rendered = false;\n    state.wrapper.replaceChildren();\n    state.wrapper.append(\n      createPageStatus(\"ofv-pdf-skeleton\", formatPreviewMessage(messages.pdfPageLoading, { page: pageIdx + 1 }))\n    );\n  };\n\n  const renderPage = async (pageIdx: number, size: PreviewSize) => {\n    const state = pageStates[pageIdx];\n    if (!state) return;\n\n    while (state.renderPromise) {\n      await state.renderPromise;\n    }\n    if (state.rendered) return;\n\n    state.rendered = true;\n    const renderPromise = (async () => {\n      try {\n        const page = await pdfDocument.getPage(pageIdx + 1);\n        const meta = pagesMeta[pageIdx];\n        const scale = resolvePdfPageScale(\n          meta,\n          options.fit,\n          resolveLayoutWidth(size),\n          resolveLayoutHeight(size),\n          zoomFactor,\n          rotation\n        );\n        const viewport = page.getViewport({ scale, rotation: getPdfRenderRotation(meta, rotation) });\n        const outputScale = getPdfOutputScale();\n        const cssWidth = Math.floor(viewport.width);\n        const cssHeight = Math.floor(viewport.height);\n\n        const canvas = document.createElement(\"canvas\");\n        canvas.className = \"ofv-pdf-page\";\n        canvas.width = Math.floor(cssWidth * outputScale);\n        canvas.height = Math.floor(cssHeight * outputScale);\n        canvas.style.width = `${cssWidth}px`;\n        canvas.style.height = `${cssHeight}px`;\n\n        const context = canvas.getContext(\"2d\");\n        if (!context) {\n          throw new Error(\"Canvas 2D context is not available.\");\n        }\n\n        state.wrapper.replaceChildren(canvas);\n        state.canvas = canvas;\n\n        const renderTask = page.render({\n          canvasContext: context,\n          viewport,\n          transform: outputScale === 1 ? undefined : [outputScale, 0, 0, outputScale, 0, 0]\n        });\n        state.renderTask = renderTask;\n\n        await renderTask.promise;\n        state.renderTask = null;\n\n        const textContent = await page.getTextContent();\n        const textLayer = document.createElement(\"div\");\n        textLayer.className = \"ofv-pdf-text-layer\";\n        textLayer.style.width = `${cssWidth}px`;\n        textLayer.style.height = `${cssHeight}px`;\n        state.wrapper.appendChild(textLayer);\n\n        for (const item of textContent.items) {\n          if (!(\"str\" in item)) continue;\n          const str = (item as any).str;\n          if (!str.trim()) continue;\n\n          const tx = multiplyMatrices(viewport.transform, (item as any).transform);\n          const fontHeight = Math.sqrt(tx[2] * tx[2] + tx[3] * tx[3]);\n\n          const span = document.createElement(\"span\");\n          span.textContent = str;\n          span.style.fontSize = `${fontHeight}px`;\n          span.style.lineHeight = \"1\";\n          span.style.height = `${fontHeight}px`;\n          span.style.fontFamily = (item as any).fontName || \"sans-serif\";\n          span.style.left = `${tx[4]}px`;\n          span.style.top = `${tx[5] - fontHeight}px`;\n          span.style.transformOrigin = \"0% 0%\";\n\n          textLayer.appendChild(span);\n\n          if ((item as any).width) {\n            const itemWidth = (item as any).width * scale;\n            const actualWidth = span.offsetWidth || span.getBoundingClientRect().width;\n            if (actualWidth > 0 && Math.abs(actualWidth - itemWidth) > 1) {\n              span.style.transform = `scaleX(${itemWidth / actualWidth})`;\n            }\n          }\n        }\n        if (textLayer.childElementCount === 0 && isCanvasVisuallyBlank(canvas, context)) {\n          state.wrapper.appendChild(\n            createPageStatus(\n              \"ofv-pdf-empty\",\n              messages.pdfPageEmpty\n            )\n          );\n        }\n      } catch (err) {\n        console.error(`Failed to render PDF page ${pageIdx + 1}:`, err);\n        state.rendered = false;\n        state.wrapper.replaceChildren(\n          createPageStatus(\"ofv-pdf-error\", messages.pdfPageRenderFailed)\n        );\n      }\n    })();\n    state.renderPromise = renderPromise;\n    try {\n      await renderPromise;\n    } finally {\n      if (state.renderPromise === renderPromise) {\n        state.renderPromise = null;\n      }\n    }\n  };\n\n  const renderLayout = (size: PreviewSize) => {\n    observer?.disconnect();\n    updateSummary();\n    scroller.replaceChildren();\n    pageStates.length = 0;\n\n    if (typeof IntersectionObserver !== \"undefined\") {\n      observer = new IntersectionObserver(\n        (entries) => {\n          entries.forEach((entry) => {\n            const pageIdx = parseInt(entry.target.getAttribute(\"data-page-index\") || \"0\", 10);\n            const state = pageStates[pageIdx];\n            if (!state) return;\n\n            if (entry.isIntersecting) {\n              if (!state.rendered) {\n                void renderPage(pageIdx, size);\n              }\n            } else if (!printPreparation && state.rendered && pdfDocument.numPages > 8) {\n              clearPage(pageIdx);\n            }\n          });\n        },\n        {\n          root: scroller,\n          rootMargin: \"400px 0px 400px 0px\"\n        }\n      );\n    }\n\n    for (let i = 0; i < pdfDocument.numPages; i++) {\n      const meta = pagesMeta[i];\n      const rotatedWidth = rotatedPdfWidth(meta, rotation);\n      const rotatedHeight = rotatedPdfHeight(meta, rotation);\n      const scale = resolvePdfPageScale(\n        meta,\n        options.fit,\n        resolveLayoutWidth(size),\n        resolveLayoutHeight(size),\n        zoomFactor,\n        rotation\n      );\n\n      const w = Math.floor(rotatedWidth * scale);\n      const h = Math.floor(rotatedHeight * scale);\n\n      const wrapper = document.createElement(\"div\");\n      wrapper.className = \"ofv-pdf-page-wrapper\";\n      wrapper.setAttribute(\"data-page-index\", String(i));\n      wrapper.setAttribute(\"aria-label\", formatPreviewMessage(messages.pdfPageLabel, { page: i + 1 }));\n      wrapper.style.width = `${w}px`;\n      wrapper.style.height = `${h}px`;\n      wrapper.append(createPageStatus(\"ofv-pdf-skeleton\", formatPreviewMessage(messages.pdfPageLoading, { page: i + 1 })));\n\n      scroller.appendChild(wrapper);\n\n      pageStates.push({\n        wrapper,\n        canvas: null,\n        renderTask: null,\n        renderPromise: null,\n        rendered: false\n      });\n\n      if (observer) {\n        observer.observe(wrapper);\n      } else {\n        void renderPage(i, size);\n      }\n    }\n\n    if (observer) {\n      window.setTimeout(() => {\n        const eagerPages = pdfDocument.numPages > 8 ? 2 : pdfDocument.numPages;\n        for (let i = 0; i < eagerPages; i++) {\n          void renderPage(i, size);\n        }\n      }, 0);\n    }\n    goToPage(currentPage, false);\n  };\n\n  renderLayout(options.size);\n\n  // Zooming past the container width anchors the page at its left edge, which\n  // reads as \"nothing changed\" on overlay-scrollbar platforms. Keep the page\n  // center in view instead, like native PDF viewers do.\n  const centerHorizontalScroll = () => {\n    scroller.scrollLeft = Math.max(0, (scroller.scrollWidth - scroller.clientWidth) / 2);\n  };\n\n  let resizeTimer: number | undefined;\n  return {\n    goToPage(page) {\n      return goToPage(page);\n    },\n    canCommand(command) {\n      return (\n        command === \"zoom-in\" ||\n        command === \"zoom-out\" ||\n        command === \"zoom-reset\" ||\n        command === \"rotate-right\" ||\n        command === \"rotate-left\"\n      );\n    },\n    command(command) {\n      if (command === \"zoom-in\") {\n        zoomFactor = Math.min(4, zoomFactor + 0.15);\n        renderLayout(currentSize);\n        centerHorizontalScroll();\n        return true;\n      }\n      if (command === \"zoom-out\") {\n        zoomFactor = Math.max(0.25, zoomFactor - 0.15);\n        renderLayout(currentSize);\n        centerHorizontalScroll();\n        return true;\n      }\n      if (command === \"zoom-reset\") {\n        zoomFactor = 1;\n        rotation = 0;\n        renderLayout(currentSize);\n        centerHorizontalScroll();\n        return true;\n      }\n      if (command === \"rotate-right\" || command === \"rotate-left\") {\n        rotation = normalizePdfRotation(rotation + (command === \"rotate-right\" ? 90 : -90));\n        renderLayout(currentSize);\n        return true;\n      }\n      return false;\n    },\n    resize(size) {\n      currentSize = size;\n      window.clearTimeout(resizeTimer);\n      resizeTimer = window.setTimeout(() => {\n        renderLayout(size);\n      }, 120);\n    },\n    preparePrint() {\n      if (printPreparation) {\n        return printPreparation;\n      }\n      const activeObserver = observer;\n      activeObserver?.disconnect();\n      printPreparation = (async () => {\n        let nextPage = 0;\n        const renderNext = async () => {\n          while (nextPage < pageStates.length) {\n            const pageIndex = nextPage;\n            nextPage += 1;\n            await renderPage(pageIndex, currentSize);\n          }\n        };\n        const workerCount = Math.min(3, pageStates.length);\n        await Promise.all(Array.from({ length: workerCount }, () => renderNext()));\n      })().finally(() => {\n        if (observer === activeObserver) {\n          for (const state of pageStates) {\n            activeObserver?.observe(state.wrapper);\n          }\n        }\n        printPreparation = undefined;\n      });\n      return printPreparation;\n    },\n    destroy() {\n      options.toolbar?.setZoom(undefined);\n      pageNavigator.destroy();\n      scroller.removeEventListener(\"scroll\", handleScrollerScroll);\n      window.clearTimeout(resizeTimer);\n      observer?.disconnect();\n\n      pageStates.forEach((state) => {\n        if (state.renderTask) {\n          try {\n            state.renderTask.cancel();\n          } catch (e) {\n            // Ignore\n          }\n        }\n      });\n      pageStates.length = 0;\n\n      destroyPdfResource(pdfDocument);\n      destroyPdfResource(documentTask);\n      if (options.revokeUrlOnDestroy) {\n        revokeObjectUrl(options.fileUrl, Boolean(options.isExternal));\n      }\n    }\n  };\n}\n\nfunction destroyPdfResource(resource: unknown): void {\n  if (!resource || typeof resource !== \"object\") {\n    return;\n  }\n  const candidate = resource as { destroy?: unknown; cleanup?: unknown };\n  if (typeof candidate.destroy === \"function\") {\n    void candidate.destroy();\n    return;\n  }\n  if (typeof candidate.cleanup === \"function\") {\n    void candidate.cleanup();\n  }\n}\n\nfunction getPdfOutputScale(): number {\n  if (typeof window === \"undefined\") {\n    return 1;\n  }\n  // A 1x backing canvas loses the small labels inside raster-heavy PDFs after\n  // fit-to-container scaling. Keep two backing pixels per CSS pixel even on\n  // standard-density displays, while retaining the existing memory cap.\n  return Math.max(2, Math.min(window.devicePixelRatio || 1, 2.5));\n}\n\nfunction getPdfAvailableWidth(width: number): number {\n  if (!Number.isFinite(width) || width <= 0) {\n    return 1;\n  }\n  const gutter = width < 160 ? 16 : 32;\n  return Math.max(1, width - gutter);\n}\n\nfunction getPdfAvailableHeight(height: number): number {\n  if (!Number.isFinite(height) || height <= 0) {\n    return 1;\n  }\n  const gutter = height < 160 ? 16 : 32;\n  return Math.max(1, height - gutter);\n}\n\nfunction resolvePdfPageScale(\n  meta: { width: number; height: number },\n  fit: PreviewFit,\n  layoutWidth: number,\n  layoutHeight: number,\n  zoomFactor: number,\n  rotation: number\n): number {\n  const widthScale = getPdfAvailableWidth(layoutWidth) / rotatedPdfWidth(meta, rotation);\n  const heightScale = getPdfAvailableHeight(layoutHeight) / rotatedPdfHeight(meta, rotation);\n  let fitScale: number;\n  switch (fit) {\n    case \"actual\":\n      fitScale = 1;\n      break;\n    case \"width\":\n      fitScale = widthScale;\n      break;\n    case \"height\":\n      fitScale = heightScale;\n      break;\n    case \"cover\":\n      fitScale = Math.max(widthScale, heightScale);\n      break;\n    case \"scale-down\":\n      fitScale = Math.min(1, widthScale, heightScale);\n      break;\n    case \"contain\":\n    default:\n      fitScale = Math.min(widthScale, heightScale);\n      break;\n  }\n  return Math.max(0.05, Math.min(5, fitScale * zoomFactor));\n}\n\nfunction renderPdfSummary(\n  summary: HTMLElement,\n  pages: number,\n  pagesMeta: Array<{ width: number; height: number }>,\n  fit: PreviewFit,\n  zoomFactor: number,\n  messages: PreviewMessages\n): void {\n  summary.replaceChildren();\n  appendPdfSummary(summary, messages.pdfSummaryPages, String(pages));\n  const pageSizes = formatPdfPageSizes(pagesMeta);\n  if (pageSizes) {\n    appendPdfSummary(summary, messages.pdfSummaryPageSizes, pageSizes);\n  }\n  appendPdfSummary(summary, messages.pdfSummaryFit, fit === \"actual\" ? messages.pdfSummaryActualSize : messages.pdfSummaryFitWidth);\n  appendPdfSummary(summary, messages.pdfSummaryZoom, `${Math.round(zoomFactor * 100)}%`);\n}\n\nfunction appendPdfSummary(parent: HTMLElement, label: string, value: string): void {\n  const item = document.createElement(\"span\");\n  const key = document.createElement(\"span\");\n  key.textContent = label;\n  const content = document.createElement(\"strong\");\n  content.textContent = value;\n  item.append(key, content);\n  parent.append(item);\n}\n\nfunction normalizePdfRotation(value: number): number {\n  return ((value % 360) + 360) % 360;\n}\n\nfunction getPdfPageRotation(page: { rotate?: unknown }): number {\n  const rotation = Number(page.rotate);\n  return Number.isFinite(rotation) ? normalizePdfRotation(rotation) : 0;\n}\n\nfunction getPdfRenderRotation(meta: { rotation?: number }, userRotation: number): number {\n  return normalizePdfRotation((meta.rotation || 0) + userRotation);\n}\n\nfunction isPdfRotatedSideways(rotation: number): boolean {\n  const normalized = normalizePdfRotation(rotation);\n  return normalized === 90 || normalized === 270;\n}\n\nfunction rotatedPdfWidth(meta: { width: number; height: number }, rotation: number): number {\n  return isPdfRotatedSideways(rotation) ? meta.height : meta.width;\n}\n\nfunction rotatedPdfHeight(meta: { width: number; height: number }, rotation: number): number {\n  return isPdfRotatedSideways(rotation) ? meta.width : meta.height;\n}\n\nfunction formatPdfPageSizes(pagesMeta: Array<{ width: number; height: number }>): string {\n  const counts = new Map<string, number>();\n  for (const page of pagesMeta) {\n    const key = `${Math.round(page.width)} x ${Math.round(page.height)}`;\n    counts.set(key, (counts.get(key) || 0) + 1);\n  }\n  return [...counts.entries()]\n    .sort((a, b) => b[1] - a[1])\n    .slice(0, 4)\n    .map(([size, count]) => (count > 1 ? `${size} (${count})` : size))\n    .join(\", \");\n}\n\nfunction normalizePdfOptions(options: PdfJsModule | PdfPluginOptions): PdfPluginOptions {\n  if (\"getDocument\" in options) {\n    return { pdfjs: options };\n  }\n  return options;\n}\n\nasync function loadPdfData(url: string): Promise<Uint8Array> {\n  const response = await fetch(url);\n  if (!response.ok) {\n    throw new Error(`Failed to load PDF data: ${response.status} ${response.statusText}`);\n  }\n  return new Uint8Array(await response.arrayBuffer());\n}\n\nfunction isCanvasVisuallyBlank(canvas: HTMLCanvasElement, context: CanvasRenderingContext2D): boolean {\n  if (canvas.width === 0 || canvas.height === 0 || typeof context.getImageData !== \"function\") {\n    return false;\n  }\n  try {\n    const sampleWidth = Math.min(canvas.width, 96);\n    const sampleHeight = Math.min(canvas.height, 96);\n    const stepX = Math.max(1, Math.floor(canvas.width / sampleWidth));\n    const stepY = Math.max(1, Math.floor(canvas.height / sampleHeight));\n    let sampled = 0;\n    let nonBlank = 0;\n    for (let y = 0; y < canvas.height; y += stepY) {\n      for (let x = 0; x < canvas.width; x += stepX) {\n        const pixel = context.getImageData(x, y, 1, 1).data;\n        const red = pixel[0];\n        const green = pixel[1];\n        const blue = pixel[2];\n        const alpha = pixel[3];\n        sampled += 1;\n        if (alpha > 8 && (red < 248 || green < 248 || blue < 248)) {\n          nonBlank += 1;\n          if (nonBlank / sampled > 0.002) {\n            return false;\n          }\n        }\n      }\n    }\n    return sampled > 0;\n  } catch {\n    return false;\n  }\n}\n\nfunction createPageStatus(className: string, text: string): HTMLDivElement {\n  const status = document.createElement(\"div\");\n  status.className = className;\n  status.textContent = text;\n  return status;\n}\n\nfunction createPdfFallback(\n  fileName: string,\n  url: string,\n  message: string,\n  messages: PreviewMessages,\n  titleText = messages.pdfPreviewFailedTitle,\n  webFallbackScripts: PdfWebFallbackScripts = \"auto\"\n): HTMLElement {\n  if (isEmbeddableRemoteUrl(url)) {\n    return createPdfWebFallback(fileName, url, webFallbackScripts);\n  }\n\n  const fallback = document.createElement(\"div\");\n  fallback.className = \"ofv-fallback\";\n\n  const title = document.createElement(\"strong\");\n  title.textContent = titleText;\n\n  const meta = document.createElement(\"span\");\n  meta.textContent = `${message} ${fileName}`;\n\n  const download = document.createElement(\"a\");\n  download.href = url;\n  download.download = fileName;\n  download.textContent = messages.pdfDownload;\n\n  fallback.append(title, meta, download);\n  return fallback;\n}\n\nfunction createPdfWebFallback(\n  fileName: string,\n  url: string,\n  webFallbackScripts: PdfWebFallbackScripts\n): HTMLElement {\n  const fallback = document.createElement(\"div\");\n  fallback.className = \"ofv-pdf-web-fallback\";\n\n  const iframe = document.createElement(\"iframe\");\n  iframe.className = \"ofv-pdf-web-fallback-frame\";\n  iframe.src = url;\n  iframe.title = `${fileName} HTML preview`;\n  const sandboxTokens = [\"allow-forms\", \"allow-popups\", \"allow-presentation\", \"allow-same-origin\"];\n  if (shouldAllowPdfWebFallbackScripts(url, webFallbackScripts)) {\n    sandboxTokens.push(\"allow-scripts\");\n  }\n  iframe.setAttribute(\"sandbox\", sandboxTokens.join(\" \"));\n\n  fallback.append(iframe);\n  return fallback;\n}\n\nfunction shouldAllowPdfWebFallbackScripts(url: string, policy: PdfWebFallbackScripts): boolean {\n  if (policy === \"always\") {\n    return true;\n  }\n  if (policy === \"never\" || typeof window === \"undefined\" || typeof document === \"undefined\") {\n    return false;\n  }\n  try {\n    const target = document.createElement(\"a\");\n    target.href = url;\n    return target.origin !== window.location.origin;\n  } catch {\n    return false;\n  }\n}\n\nfunction isEmbeddableRemoteUrl(url: string): boolean {\n  return /^https?:\\/\\//i.test(url);\n}\n\nfunction normalizePdfError(error: unknown, messages: PreviewMessages): string {\n  const message = error instanceof Error ? error.message : String(error || \"\");\n  const name = typeof error === \"object\" && error !== null && \"name\" in error ? String((error as { name?: unknown }).name) : \"\";\n  const lower = `${name} ${message}`.toLowerCase();\n  if (lower.includes(\"invalid\") || lower.includes(\"missing\") || lower.includes(\"corrupt\")) {\n    return messages.pdfCorruptedMessage;\n  }\n  return messages.pdfCannotLoadMessage;\n}\n\nfunction createPdfPageNavigator(\n  total: number,\n  messages: PreviewMessages,\n  onChange: (page: number) => void\n): { element: HTMLElement; setCurrent(page: number): void; destroy(): void } {\n  const element = document.createElement(\"div\");\n  element.className = \"ofv-pdf-page-navigator\";\n\n  const previous = document.createElement(\"button\");\n  previous.type = \"button\";\n  previous.textContent = \"‹\";\n  previous.title = messages.pdfPreviousPage;\n  previous.setAttribute(\"aria-label\", messages.pdfPreviousPage);\n\n  const input = document.createElement(\"input\");\n  input.type = \"number\";\n  input.min = \"1\";\n  input.max = String(total);\n  input.value = \"1\";\n  input.inputMode = \"numeric\";\n  input.setAttribute(\"aria-label\", messages.pdfPageInput);\n\n  const position = document.createElement(\"span\");\n  position.textContent = formatPreviewMessage(messages.pdfPagePosition, { total });\n\n  const next = document.createElement(\"button\");\n  next.type = \"button\";\n  next.textContent = \"›\";\n  next.title = messages.pdfNextPage;\n  next.setAttribute(\"aria-label\", messages.pdfNextPage);\n\n  const commit = () => onChange(Number(input.value));\n  const handleKeydown = (event: KeyboardEvent) => {\n    if (event.key === \"Enter\") {\n      commit();\n    }\n  };\n  const handlePrevious = () => onChange(Number(input.value) - 1);\n  const handleNext = () => onChange(Number(input.value) + 1);\n  input.addEventListener(\"change\", commit);\n  input.addEventListener(\"keydown\", handleKeydown);\n  previous.addEventListener(\"click\", handlePrevious);\n  next.addEventListener(\"click\", handleNext);\n  element.append(previous, input, position, next);\n\n  return {\n    element,\n    setCurrent(page) {\n      input.value = String(page);\n      previous.disabled = page <= 1;\n      next.disabled = page >= total;\n    },\n    destroy() {\n      input.removeEventListener(\"change\", commit);\n      input.removeEventListener(\"keydown\", handleKeydown);\n      previous.removeEventListener(\"click\", handlePrevious);\n      next.removeEventListener(\"click\", handleNext);\n    }\n  };\n}\n\nfunction configurePdfWorker(pdf: PdfJsModule, workerSrc?: string, legacy = false): void {\n  if (workerSrc) {\n    pdf.GlobalWorkerOptions.workerSrc = workerSrc;\n    return;\n  }\n\n  if (!pdf.GlobalWorkerOptions.workerSrc && typeof window !== \"undefined\") {\n    const build = legacy ? \"legacy/build\" : \"build\";\n    pdf.GlobalWorkerOptions.workerSrc = `https://cdn.jsdelivr.net/npm/pdfjs-dist@${pdf.version}/${build}/pdf.worker.mjs`;\n  }\n}\n\nfunction shouldUseLegacyPdfCompatibility(mode: PdfPluginOptions[\"compatibilityMode\"] = \"auto\"): boolean {\n  if (mode === \"legacy\") {\n    return true;\n  }\n  if (mode === \"modern\") {\n    return false;\n  }\n\n  const promise = Promise as PromiseConstructor & { withResolvers?: unknown };\n  if (typeof promise.withResolvers !== \"function\") {\n    return true;\n  }\n\n  if (typeof navigator === \"undefined\") {\n    return false;\n  }\n  return /(?:QIHU|360SE|360EE)/i.test(navigator.userAgent);\n}\n\nfunction installPromiseWithResolversPolyfill(): void {\n  const promise = Promise as PromiseConstructor & {\n    withResolvers?: <T>() => {\n      promise: Promise<T>;\n      resolve: (value: T | PromiseLike<T>) => void;\n      reject: (reason?: unknown) => void;\n    };\n  };\n  if (typeof promise.withResolvers === \"function\") {\n    return;\n  }\n\n  Object.defineProperty(promise, \"withResolvers\", {\n    configurable: true,\n    writable: true,\n    value: <T>() => {\n      let resolve!: (value: T | PromiseLike<T>) => void;\n      let reject!: (reason?: unknown) => void;\n      const pending = new Promise<T>((resolvePromise, rejectPromise) => {\n        resolve = resolvePromise;\n        reject = rejectPromise;\n      });\n      return { promise: pending, resolve, reject };\n    }\n  });\n}\n","import JSZip from \"jszip\";\nimport DOMPurify from \"dompurify\";\nimport type { PreviewCommand, PreviewContext, PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, readArrayBuffer } from \"./utils\";\n\nconst epubMimeTypes = new Set([\"application/epub+zip\", \"application/x-epub+zip\"]);\n\ntype EpubManifestItem = {\n  id: string;\n  href: string;\n  mediaType: string;\n  properties: string;\n};\n\ntype EpubMetadata = {\n  title: string;\n  creator: string;\n  language: string;\n  identifier: string;\n  publisher: string;\n  modified: string;\n};\n\ntype EpubStructureSummary = {\n  manifestItems: number;\n  spineItems: number;\n  chapters: number;\n  images: number;\n  styles: number;\n  fonts: number;\n  audio: number;\n  video: number;\n  navItems: number;\n  tocItems: number;\n  coverItems: number;\n  otherItems: number;\n  missingSpineItems: number;\n};\n\nexport function epubPlugin(): PreviewPlugin {\n  return {\n    name: \"epub\",\n    match(file) {\n      return file.extension === \"epub\" || epubMimeTypes.has(file.mimeType);\n    },\n    async render(ctx) {\n      const panel = createPanel(\"ofv-epub\");\n      ctx.viewport.append(panel);\n\n      try {\n        const zip = await JSZip.loadAsync(await readArrayBuffer(ctx.file));\n        await renderEpub(panel, zip);\n      } catch (error) {\n        renderEpubFallback(panel, error);\n      }\n      const controller = createEpubReaderController(panel, ctx);\n\n      return {\n        canCommand(command) {\n          return controller?.canCommand(command) ?? false;\n        },\n        command(command) {\n          return controller?.command(command) ?? false;\n        },\n        destroy() {\n          controller?.destroy();\n          panel.remove();\n        }\n      };\n    }\n  };\n}\n\nfunction createEpubReaderController(\n  panel: HTMLElement,\n  ctx: Pick<PreviewContext, \"toolbar\">\n): {\n  canCommand: (command: PreviewCommand) => boolean;\n  command: (command: PreviewCommand) => boolean;\n  destroy: () => void;\n} | undefined {\n  const reader = panel.querySelector<HTMLElement>(\".ofv-epub-reader\");\n  if (!reader) {\n    return undefined;\n  }\n\n  const layer = reader.querySelector<HTMLElement>(\".ofv-epub-zoom-layer\");\n  let zoom = 1;\n  const apply = () => {\n    if (layer) {\n      // Pin the layer to its pre-zoom width so the CSS `zoom` (from the\n      // --ofv-epub-zoom rule) magnifies the whole chapter column past the\n      // reader's edge instead of re-wrapping the text inside it. Measure with\n      // the zoom var at 1 — a zoomed layer reports divided client sizes.\n      layer.style.width = \"\";\n      reader.style.setProperty(\"--ofv-epub-zoom\", \"1\");\n      if (zoom !== 1) {\n        const base = layer.clientWidth;\n        if (base > 0) {\n          layer.style.width = `${base}px`;\n        }\n      }\n    }\n    reader.style.setProperty(\"--ofv-epub-zoom\", String(zoom));\n    ctx.toolbar?.setZoom(zoom);\n  };\n  apply();\n\n  return {\n    canCommand(command) {\n      return command === \"zoom-in\" || command === \"zoom-out\" || command === \"zoom-reset\";\n    },\n    command(command) {\n      if (command === \"zoom-in\") {\n        zoom = Math.min(2.5, Number((zoom + 0.12).toFixed(2)));\n        apply();\n        return true;\n      }\n      if (command === \"zoom-out\") {\n        zoom = Math.max(0.6, Number((zoom - 0.12).toFixed(2)));\n        apply();\n        return true;\n      }\n      if (command === \"zoom-reset\") {\n        zoom = 1;\n        apply();\n        return true;\n      }\n      return false;\n    },\n    destroy() {\n      ctx.toolbar?.setZoom(undefined);\n    }\n  };\n}\n\nasync function renderEpub(panel: HTMLElement, zip: JSZip): Promise<void> {\n  const opfPath = await resolvePackagePath(zip);\n  const opfText = await zip.file(opfPath)?.async(\"text\");\n  if (!opfText) {\n    throw new Error(\"EPUB 缺少 OPF package 文件。\");\n  }\n\n  const opf = parseXml(opfText, \"EPUB package 文件解析失败。\");\n  const basePath = directoryName(opfPath);\n  const manifest = readManifest(opf);\n  const spine = readSpine(opf, manifest);\n  const metadata = readMetadata(opf);\n  const structure = summarizeEpubStructure(opf, manifest, spine);\n  const assets = await readEpubAssets(zip, basePath, manifest);\n\n  const summary = createSection(\"EPUB 图书信息\");\n  summary.hidden = spine.length > 0;\n  if (spine.length > 0) {\n    summary.setAttribute(\"aria-hidden\", \"true\");\n    summary.style.display = \"none\";\n  }\n  const meta = document.createElement(\"div\");\n  meta.className = \"ofv-epub-meta\";\n  meta.hidden = spine.length > 0;\n  if (spine.length > 0) {\n    meta.setAttribute(\"aria-hidden\", \"true\");\n    meta.style.display = \"none\";\n  }\n  appendMeta(meta, \"标题\", metadata.title || \"未命名 EPUB\");\n  appendMeta(meta, \"作者\", metadata.creator || \"未知\");\n  appendMeta(meta, \"语言\", metadata.language || \"未声明\");\n  if (metadata.publisher) {\n    appendMeta(meta, \"出版方\", metadata.publisher);\n  }\n  if (metadata.identifier) {\n    appendMeta(meta, \"标识\", metadata.identifier);\n  }\n  if (metadata.modified) {\n    appendMeta(meta, \"修改时间\", metadata.modified);\n  }\n  appendMeta(meta, \"章节\", spine.length || \"未解析到阅读顺序\");\n  appendMeta(meta, \"Manifest\", structure.manifestItems);\n  appendMeta(meta, \"Spine\", structure.spineItems);\n  appendMeta(meta, \"导航\", structure.navItems + structure.tocItems);\n  appendMeta(meta, \"封面\", structure.coverItems);\n  appendMeta(meta, \"图片\", structure.images);\n  appendMeta(meta, \"样式\", structure.styles);\n  appendMeta(meta, \"字体\", structure.fonts);\n  if (structure.audio || structure.video) {\n    appendMeta(meta, \"音视频\", `${structure.audio} / ${structure.video}`);\n  }\n  if (structure.otherItems) {\n    appendMeta(meta, \"其他资源\", structure.otherItems);\n  }\n  if (structure.missingSpineItems) {\n    appendMeta(meta, \"缺失章节引用\", structure.missingSpineItems);\n  }\n  summary.append(meta);\n  panel.append(summary);\n\n  const chapters = createSection(\"EPUB 正文预览\");\n  if (spine.length > 0) {\n    hideSupplementalInfo(chapters.querySelector<HTMLElement>(\"h3\"));\n  }\n  const article = document.createElement(\"article\");\n  article.className = \"ofv-epub-reader\";\n  const zoomLayer = document.createElement(\"div\");\n  zoomLayer.className = \"ofv-epub-zoom-layer\";\n  article.append(zoomLayer);\n\n  if (spine.length === 0) {\n    const empty = document.createElement(\"p\");\n    empty.textContent = \"未解析到可展示章节。\";\n    zoomLayer.append(empty);\n  } else {\n    for (const [index, item] of spine.slice(0, 40).entries()) {\n      const chapterPath = joinZipPath(basePath, item.href);\n      const chapterText = await zip.file(chapterPath)?.async(\"text\");\n      if (!chapterText) {\n        continue;\n      }\n      const section = document.createElement(\"section\");\n      section.className = \"ofv-epub-chapter\";\n      const heading = document.createElement(\"h3\");\n      heading.textContent = chapterTitle(chapterText) || `章节 ${index + 1}`;\n      const content = document.createElement(\"div\");\n      content.className = \"ofv-epub-content\";\n      content.innerHTML = sanitizeChapterHtml(rewriteAssetReferences(chapterText, assets, directoryName(chapterPath)));\n      section.append(heading, content);\n      zoomLayer.append(section);\n    }\n  }\n\n  chapters.append(article);\n  panel.append(chapters);\n}\n\nasync function resolvePackagePath(zip: JSZip): Promise<string> {\n  const containerXml = await zip.file(\"META-INF/container.xml\")?.async(\"text\");\n  if (containerXml) {\n    const container = parseXml(containerXml, \"EPUB container.xml 解析失败。\");\n    const rootfile = Array.from(container.getElementsByTagName(\"*\")).find(\n      (element) => element.localName === \"rootfile\" && getXmlAttribute(element, \"full-path\")\n    );\n    const fullPath = rootfile ? getXmlAttribute(rootfile, \"full-path\") : null;\n    if (fullPath && zip.file(fullPath)) {\n      return fullPath;\n    }\n  }\n\n  const fallback = Object.values(zip.files).find((entry) => !entry.dir && entry.name.endsWith(\".opf\"));\n  if (!fallback) {\n    throw new Error(\"EPUB 未找到 package OPF 文件。\");\n  }\n  return fallback.name;\n}\n\nfunction readManifest(opf: Document): Map<string, EpubManifestItem> {\n  const manifest = new Map<string, EpubManifestItem>();\n  for (const item of Array.from(opf.getElementsByTagName(\"*\")).filter((element) => element.localName === \"item\")) {\n    const id = getXmlAttribute(item, \"id\");\n    const href = getXmlAttribute(item, \"href\");\n    if (!id || !href) {\n      continue;\n    }\n    manifest.set(id, {\n      id,\n      href,\n      mediaType: getXmlAttribute(item, \"media-type\") || \"\",\n      properties: getXmlAttribute(item, \"properties\") || \"\"\n    });\n  }\n  return manifest;\n}\n\nfunction readSpine(opf: Document, manifest: Map<string, EpubManifestItem>): EpubManifestItem[] {\n  const items: EpubManifestItem[] = [];\n  for (const itemref of Array.from(opf.getElementsByTagName(\"*\")).filter((element) => element.localName === \"itemref\")) {\n    const idref = getXmlAttribute(itemref, \"idref\");\n    const item = idref ? manifest.get(idref) : undefined;\n    if (item && isChapterMediaType(item.mediaType)) {\n      items.push(item);\n    }\n  }\n  if (items.length > 0) {\n    return items;\n  }\n  return Array.from(manifest.values()).filter((item) => isChapterMediaType(item.mediaType));\n}\n\nfunction readMetadata(opf: Document): EpubMetadata {\n  return {\n    title: textByLocalName(opf, \"title\"),\n    creator: textByLocalName(opf, \"creator\"),\n    language: textByLocalName(opf, \"language\"),\n    identifier: textByLocalName(opf, \"identifier\"),\n    publisher: textByLocalName(opf, \"publisher\"),\n    modified: metaPropertyText(opf, \"dcterms:modified\")\n  };\n}\n\nfunction summarizeEpubStructure(opf: Document, manifest: Map<string, EpubManifestItem>, spine: EpubManifestItem[]): EpubStructureSummary {\n  const items = Array.from(manifest.values());\n  const chapters = spine.length;\n  const images = items.filter((item) => item.mediaType.startsWith(\"image/\")).length;\n  const styles = items.filter((item) => item.mediaType === \"text/css\").length;\n  const fonts = items.filter((item) => item.mediaType.startsWith(\"font/\") || /font|opentype|truetype/i.test(item.mediaType)).length;\n  const audio = items.filter((item) => item.mediaType.startsWith(\"audio/\")).length;\n  const video = items.filter((item) => item.mediaType.startsWith(\"video/\")).length;\n  const navItems = items.filter((item) => propertyTokens(item.properties).has(\"nav\")).length;\n  const tocItems = items.filter((item) => item.mediaType === \"application/x-dtbncx+xml\" || propertyTokens(item.properties).has(\"toc\")).length;\n  const coverItems = items.filter((item) => item.id.toLowerCase().includes(\"cover\") || propertyTokens(item.properties).has(\"cover-image\")).length;\n  const otherItems = items.filter((item) => !isKnownEpubResource(item)).length;\n  return {\n    manifestItems: items.length,\n    spineItems: spine.length,\n    chapters,\n    images,\n    styles,\n    fonts,\n    audio,\n    video,\n    navItems,\n    tocItems,\n    coverItems,\n    otherItems,\n    missingSpineItems: Math.max(0, readSpineRefCount(opf) - spine.length)\n  };\n}\n\nfunction isKnownEpubResource(item: EpubManifestItem): boolean {\n  const properties = propertyTokens(item.properties);\n  return (\n    isChapterMediaType(item.mediaType) ||\n    item.mediaType.startsWith(\"image/\") ||\n    item.mediaType === \"text/css\" ||\n    item.mediaType.startsWith(\"font/\") ||\n    /font|opentype|truetype/i.test(item.mediaType) ||\n    item.mediaType.startsWith(\"audio/\") ||\n    item.mediaType.startsWith(\"video/\") ||\n    item.mediaType === \"application/x-dtbncx+xml\" ||\n    properties.has(\"nav\") ||\n    properties.has(\"toc\")\n  );\n}\n\nasync function readEpubAssets(\n  zip: JSZip,\n  basePath: string,\n  manifest: Map<string, EpubManifestItem>\n): Promise<Map<string, string>> {\n  const assets = new Map<string, string>();\n  for (const item of manifest.values()) {\n    if (!item.mediaType.startsWith(\"image/\")) {\n      continue;\n    }\n    const path = joinZipPath(basePath, item.href);\n    const entry = zip.file(path);\n    if (!entry) {\n      continue;\n    }\n    assets.set(path, `data:${item.mediaType};base64,${await entry.async(\"base64\")}`);\n  }\n  return assets;\n}\n\nfunction rewriteAssetReferences(html: string, assets: Map<string, string>, chapterDir: string): string {\n  const documentHtml = new DOMParser().parseFromString(html, \"text/html\");\n  for (const image of Array.from(documentHtml.querySelectorAll<HTMLImageElement>(\"img[src], image[href], image[xlink\\\\:href]\"))) {\n    const raw = image.getAttribute(\"src\") || image.getAttribute(\"href\") || image.getAttribute(\"xlink:href\") || \"\";\n    const path = joinZipPath(chapterDir, raw.split(\"#\")[0] || raw);\n    const src = assets.get(path);\n    if (!src) {\n      continue;\n    }\n    image.setAttribute(\"src\", src);\n    image.setAttribute(\"href\", src);\n    image.setAttribute(\"xlink:href\", src);\n  }\n  return documentHtml.body.innerHTML;\n}\n\nfunction sanitizeChapterHtml(html: string): string {\n  return DOMPurify.sanitize(html, {\n    USE_PROFILES: { html: true, svg: true, svgFilters: false },\n    ADD_ATTR: [\"target\", \"xlink:href\"]\n  });\n}\n\nfunction chapterTitle(html: string): string {\n  const documentHtml = new DOMParser().parseFromString(html, \"text/html\");\n  const heading = documentHtml.querySelector(\"h1, h2, h3, title\");\n  return heading?.textContent?.trim() || \"\";\n}\n\nfunction renderEpubFallback(panel: HTMLElement, error: unknown): void {\n  panel.replaceChildren();\n  const fallback = document.createElement(\"div\");\n  fallback.className = \"ofv-fallback\";\n  const title = document.createElement(\"strong\");\n  title.textContent = \"EPUB 解析失败\";\n  const meta = document.createElement(\"span\");\n  meta.textContent = error instanceof Error ? error.message : \"文件可能已损坏，或不是有效的 EPUB。\";\n  fallback.append(title, meta);\n  panel.append(fallback);\n}\n\nfunction parseXml(xml: string, message: string): Document {\n  const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n  if (doc.querySelector(\"parsererror\")) {\n    throw new Error(message);\n  }\n  return doc;\n}\n\nfunction appendMeta(parent: HTMLElement, label: string, value: string | number): void {\n  const row = document.createElement(\"div\");\n  row.className = \"ofv-meta-row\";\n  const key = document.createElement(\"span\");\n  key.textContent = label;\n  const content = document.createElement(\"strong\");\n  content.textContent = String(value);\n  row.append(key, content);\n  parent.append(row);\n}\n\nfunction textByLocalName(doc: Document, localName: string): string {\n  return (\n    Array.from(doc.getElementsByTagName(\"*\"))\n      .find((element) => element.localName === localName)\n      ?.textContent?.trim() || \"\"\n  );\n}\n\nfunction metaPropertyText(doc: Document, property: string): string {\n  return (\n    Array.from(doc.getElementsByTagName(\"*\"))\n      .find((element) => element.localName === \"meta\" && getXmlAttribute(element, \"property\") === property)\n      ?.textContent?.trim() || \"\"\n  );\n}\n\nfunction propertyTokens(value: string): Set<string> {\n  return new Set(value.split(/\\s+/).map((item) => item.trim()).filter(Boolean));\n}\n\nfunction readSpineRefCount(opf: Document): number {\n  return Array.from(opf.getElementsByTagName(\"*\")).filter((element) => element.localName === \"itemref\").length;\n}\n\nfunction getXmlAttribute(element: Element, localName: string): string | null {\n  const direct = element.getAttribute(localName);\n  if (direct !== null) {\n    return direct;\n  }\n  for (const attribute of Array.from(element.attributes)) {\n    if (attribute.localName === localName) {\n      return attribute.value;\n    }\n  }\n  return null;\n}\n\nfunction hideSupplementalInfo(element: HTMLElement | null): void {\n  if (!element) {\n    return;\n  }\n  element.hidden = true;\n  element.setAttribute(\"aria-hidden\", \"true\");\n  element.style.display = \"none\";\n}\n\nfunction isChapterMediaType(mediaType: string): boolean {\n  return mediaType === \"application/xhtml+xml\" || mediaType === \"text/html\" || mediaType === \"application/xml\";\n}\n\nfunction directoryName(path: string): string {\n  const index = path.lastIndexOf(\"/\");\n  return index >= 0 ? path.slice(0, index + 1) : \"\";\n}\n\nfunction joinZipPath(basePath: string, path: string): string {\n  const parts = `${basePath}${path}`.split(\"/\");\n  const normalized: string[] = [];\n  for (const part of parts) {\n    if (!part || part === \".\") {\n      continue;\n    }\n    if (part === \"..\") {\n      normalized.pop();\n    } else {\n      normalized.push(part);\n    }\n  }\n  return normalized.join(\"/\");\n}\n","import JSZip from \"jszip\";\nimport type { PreviewCommand, PreviewContext, PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, goToRenderedPage, readArrayBuffer } from \"./utils\";\n\nconst xpsMimeTypes = new Set([\n  \"application/oxps\",\n  \"application/vnd.ms-xpsdocument\"\n]);\n\nexport function xpsPlugin(): PreviewPlugin {\n  return {\n    name: \"xps\",\n    match(file) {\n      return file.extension === \"xps\" || file.extension === \"oxps\" || xpsMimeTypes.has(file.mimeType);\n    },\n    async render(ctx) {\n      const panel = createPanel(\"ofv-xps\");\n      ctx.viewport.append(panel);\n\n      try {\n        const zip = await JSZip.loadAsync(await readArrayBuffer(ctx.file));\n        await renderXps(panel, zip);\n      } catch (error) {\n        renderXpsFallback(panel, error);\n      }\n      const controller = createXpsCanvasController(panel, ctx);\n      const pages = panel.querySelector<HTMLElement>(\".ofv-xps-pages\") || panel;\n\n      return {\n        goToPage(page) {\n          return goToRenderedPage(pages, \".ofv-xps-page\", page, pages);\n        },\n        canCommand(command) {\n          return controller?.canCommand(command) ?? false;\n        },\n        command(command) {\n          return controller?.command(command) ?? false;\n        },\n        destroy() {\n          controller?.destroy();\n          panel.remove();\n        }\n      };\n    }\n  };\n}\n\nfunction createXpsCanvasController(\n  panel: HTMLElement,\n  ctx: Pick<PreviewContext, \"toolbar\">\n): {\n  canCommand: (command: PreviewCommand) => boolean;\n  command: (command: PreviewCommand) => boolean;\n  destroy: () => void;\n} | undefined {\n  const canvases = Array.from(panel.querySelectorAll<SVGSVGElement>(\".ofv-xps-canvas\"))\n    .map((svg) => ({ svg, initialViewBox: parseSvgViewBox(svg), baseWidth: undefined as number | undefined }))\n    .filter(\n      (item): item is { svg: SVGSVGElement; initialViewBox: SvgViewBox; baseWidth: number | undefined } =>\n        Boolean(item.initialViewBox)\n    );\n  if (canvases.length === 0) {\n    return undefined;\n  }\n\n  let zoom = 1;\n  let rotation = 0;\n  const apply = () => {\n    // Zoom grows the page's layout width so the surrounding scroll containers\n    // gain real scrollbars; the intact viewBox keeps the vector content whole\n    // (the previous implementation shrank the viewBox, cropping the edges).\n    for (const entry of canvases) {\n      const { svg, initialViewBox } = entry;\n      svg.setAttribute(\n        \"viewBox\",\n        `${initialViewBox.x} ${initialViewBox.y} ${initialViewBox.width} ${initialViewBox.height}`\n      );\n      if (zoom === 1) {\n        svg.style.removeProperty(\"width\");\n        svg.style.removeProperty(\"max-width\");\n        svg.style.removeProperty(\"max-height\");\n        entry.baseWidth = undefined;\n      } else {\n        if (entry.baseWidth === undefined) {\n          svg.style.removeProperty(\"width\");\n          svg.style.removeProperty(\"max-width\");\n          svg.style.removeProperty(\"max-height\");\n          entry.baseWidth = svg.getBoundingClientRect().width || initialViewBox.width;\n        }\n        svg.style.width = `${entry.baseWidth * zoom}px`;\n        svg.style.maxWidth = \"none\";\n        svg.style.maxHeight = \"none\";\n      }\n      svg.style.transformOrigin = \"center center\";\n      svg.style.transform = rotation === 0 ? \"\" : `rotate(${rotation}deg)`;\n    }\n    for (const page of panel.querySelectorAll<HTMLElement>(\".ofv-xps-page\")) {\n      page.style.width = zoom === 1 ? \"\" : \"max-content\";\n      page.style.maxWidth = zoom === 1 ? \"\" : \"none\";\n    }\n    ctx.toolbar?.setZoom(zoom);\n  };\n  apply();\n\n  return {\n    canCommand(command) {\n      return (\n        command === \"zoom-in\" ||\n        command === \"zoom-out\" ||\n        command === \"zoom-reset\" ||\n        command === \"rotate-right\" ||\n        command === \"rotate-left\"\n      );\n    },\n    command(command) {\n      if (command === \"zoom-in\") {\n        zoom = Math.min(8, zoom * 1.18);\n        apply();\n        return true;\n      }\n      if (command === \"zoom-out\") {\n        zoom = Math.max(0.25, zoom / 1.18);\n        apply();\n        return true;\n      }\n      if (command === \"zoom-reset\") {\n        zoom = 1;\n        rotation = 0;\n        apply();\n        return true;\n      }\n      if (command === \"rotate-right\" || command === \"rotate-left\") {\n        rotation += command === \"rotate-right\" ? 90 : -90;\n        apply();\n        return true;\n      }\n      return false;\n    },\n    destroy() {\n      ctx.toolbar?.setZoom(undefined);\n    }\n  };\n}\n\ntype SvgViewBox = { x: number; y: number; width: number; height: number };\n\nfunction parseSvgViewBox(svg: SVGSVGElement): SvgViewBox | undefined {\n  const parts = svg\n    .getAttribute(\"viewBox\")\n    ?.trim()\n    .split(/[\\s,]+/)\n    .map(Number);\n  if (!parts || parts.length !== 4 || parts.some((part) => !Number.isFinite(part)) || parts[2] <= 0 || parts[3] <= 0) {\n    return undefined;\n  }\n  return { x: parts[0], y: parts[1], width: parts[2], height: parts[3] };\n}\n\nasync function renderXps(panel: HTMLElement, zip: JSZip): Promise<void> {\n  const entries = Object.values(zip.files).filter((entry) => !entry.dir);\n  const fixedPages = entries\n    .filter((entry) => /(?:^|\\/)Pages\\/[^/]+\\.fpage$/i.test(entry.name) || entry.name.endsWith(\".fpage\"))\n    .sort((a, b) => a.name.localeCompare(b.name, undefined, { numeric: true }));\n  const resourceEntries = entries.filter((entry) => /\\.(?:png|jpe?g|tiff?|wdp|bmp|gif|odttf|ttf)$/i.test(entry.name));\n  const pagePreviews = await Promise.all(\n    fixedPages.slice(0, 80).map(async (entry, index) => {\n      const xml = await entry.async(\"text\");\n      return {\n        entry,\n        index,\n        xml,\n        info: parseXpsPageInfo(xml)\n      };\n    })\n  );\n\n  const summary = createSection(\"XPS 版式预览\");\n  summary.hidden = fixedPages.length > 0;\n  if (fixedPages.length > 0) {\n    summary.setAttribute(\"aria-hidden\", \"true\");\n    summary.style.display = \"none\";\n  }\n  const note = document.createElement(\"p\");\n  note.textContent = \"当前版本会在前端解析 XPS/OXPS 包内 FixedPage 文本、路径和资源结构，并生成轻量 SVG 页面预览；复杂画刷、字体子集和透明混合可接入专用渲染器增强。\";\n  summary.append(note);\n  summary.append(createXpsSummary(entries, fixedPages, resourceEntries, pagePreviews.map((page) => page.info)));\n  panel.append(summary);\n\n  const pages = createSection(`页面文本 ${fixedPages.length}`);\n  if (fixedPages.length > 0) {\n    hideSupplementalInfo(pages.querySelector<HTMLElement>(\"h3\") as HTMLElement);\n  }\n  const reader = document.createElement(\"div\");\n  reader.className = \"ofv-xps-pages\";\n\n  if (fixedPages.length === 0) {\n    const empty = document.createElement(\"p\");\n    empty.textContent = \"未解析到 FixedPage 页面。\";\n    reader.append(empty);\n  } else {\n    for (const page of pagePreviews) {\n      reader.append(renderXpsPage(page.xml, page.entry.name, page.index));\n    }\n  }\n  pages.append(reader);\n  if (fixedPages.length > 0 && reader.querySelector(\".ofv-xps-canvas\")) {\n    for (const textLayer of reader.querySelectorAll<HTMLElement>(\".ofv-xps-text\")) {\n      hideSupplementalInfo(textLayer);\n    }\n  }\n  panel.append(pages);\n\n  const structure = createSection(`文件结构 ${entries.length}`);\n  structure.hidden = fixedPages.length > 0;\n  if (fixedPages.length > 0) {\n    structure.setAttribute(\"aria-hidden\", \"true\");\n    structure.style.display = \"none\";\n  }\n  const list = document.createElement(\"ul\");\n  for (const entry of entries.slice(0, 240)) {\n    const item = document.createElement(\"li\");\n    item.textContent = entry.name;\n    list.append(item);\n  }\n  structure.append(list);\n  panel.append(structure);\n}\n\ntype XpsPageInfo = {\n  width?: number;\n  height?: number;\n  glyphs: number;\n  imageBrushes: number;\n  canvases: number;\n  paths: number;\n};\n\nfunction createXpsSummary(\n  entries: JSZip.JSZipObject[],\n  fixedPages: JSZip.JSZipObject[],\n  resourceEntries: JSZip.JSZipObject[],\n  pageInfos: XpsPageInfo[]\n): HTMLElement {\n  const meta = document.createElement(\"div\");\n  meta.className = \"ofv-xps-meta ofv-xps-summary\";\n  meta.hidden = fixedPages.length > 0;\n  if (fixedPages.length > 0) {\n    meta.setAttribute(\"aria-hidden\", \"true\");\n    meta.style.display = \"none\";\n  }\n  appendMeta(meta, \"页面\", fixedPages.length);\n  appendMeta(meta, \"文件\", entries.length);\n  appendMeta(meta, \"FixedDocument\", entries.filter((entry) => /\\.fdoc$/i.test(entry.name)).length);\n  appendMeta(meta, \"FixedDocSeq\", entries.filter((entry) => /\\.fdseq$/i.test(entry.name)).length);\n  appendMeta(meta, \"关系文件\", entries.filter((entry) => /(?:^|\\/)_rels\\/[^/]+\\.rels$/i.test(entry.name) || entry.name.endsWith(\".rels\")).length);\n  appendMeta(meta, \"资源\", resourceEntries.length);\n  appendMeta(meta, \"图片资源\", resourceEntries.filter((entry) => /\\.(?:png|jpe?g|tiff?|wdp|bmp|gif)$/i.test(entry.name)).length);\n  appendMeta(meta, \"字体资源\", resourceEntries.filter((entry) => /\\.(?:odttf|ttf)$/i.test(entry.name)).length);\n  const glyphs = pageInfos.reduce((count, page) => count + page.glyphs, 0);\n  appendMeta(meta, \"Glyphs\", glyphs);\n  const pageSizes = formatXpsPageSizes(pageInfos);\n  if (pageSizes) {\n    appendMeta(meta, \"页面尺寸\", pageSizes);\n  }\n  const pageObjects = formatXpsPageObjects(pageInfos);\n  if (pageObjects) {\n    appendMeta(meta, \"页面对象\", pageObjects);\n  }\n  return meta;\n}\n\nfunction parseXpsPageInfo(xml: string): XpsPageInfo {\n  const fallback = parseXpsPageInfoByRegex(xml);\n  const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n  if (doc.querySelector(\"parsererror\")) {\n    return fallback;\n  }\n  const root = doc.documentElement;\n  const elements = Array.from(doc.getElementsByTagName(\"*\"));\n  return {\n    width: finiteNumber(getXmlAttribute(root, \"Width\"), fallback.width),\n    height: finiteNumber(getXmlAttribute(root, \"Height\"), fallback.height),\n    glyphs: elements.filter((element) => element.localName === \"Glyphs\").length,\n    imageBrushes: elements.filter((element) => element.localName === \"ImageBrush\").length,\n    canvases: elements.filter((element) => element.localName === \"Canvas\").length,\n    paths: elements.filter((element) => element.localName === \"Path\").length\n  };\n}\n\nfunction parseXpsPageInfoByRegex(xml: string): XpsPageInfo {\n  return {\n    width: finiteNumber(firstAttributeValue(xml, \"Width\"), undefined),\n    height: finiteNumber(firstAttributeValue(xml, \"Height\"), undefined),\n    glyphs: countMatches(xml, /<[\\w:.-]*Glyphs\\b/g),\n    imageBrushes: countMatches(xml, /<[\\w:.-]*ImageBrush\\b/g),\n    canvases: countMatches(xml, /<[\\w:.-]*Canvas\\b/g),\n    paths: countMatches(xml, /<[\\w:.-]*Path\\b/g)\n  };\n}\n\nfunction formatXpsPageSizes(pageInfos: XpsPageInfo[]): string {\n  const counts = new Map<string, number>();\n  for (const page of pageInfos) {\n    if (!Number.isFinite(page.width) || !Number.isFinite(page.height)) {\n      continue;\n    }\n    const key = `${Math.round(page.width as number)} x ${Math.round(page.height as number)}`;\n    counts.set(key, (counts.get(key) || 0) + 1);\n  }\n  return [...counts.entries()]\n    .sort((a, b) => b[1] - a[1])\n    .slice(0, 4)\n    .map(([size, count]) => (count > 1 ? `${size} (${count})` : size))\n    .join(\", \");\n}\n\nfunction formatXpsPageObjects(pageInfos: XpsPageInfo[]): string {\n  const totals = pageInfos.reduce(\n    (result, page) => ({\n      imageBrushes: result.imageBrushes + page.imageBrushes,\n      canvases: result.canvases + page.canvases,\n      paths: result.paths + page.paths\n    }),\n    { imageBrushes: 0, canvases: 0, paths: 0 }\n  );\n  return [\n    totals.imageBrushes ? `ImageBrush ${totals.imageBrushes}` : \"\",\n    totals.canvases ? `Canvas ${totals.canvases}` : \"\",\n    totals.paths ? `Path ${totals.paths}` : \"\"\n  ].filter(Boolean).join(\", \");\n}\n\nfunction renderXpsPage(xml: string, path: string, index: number): HTMLElement {\n  const page = document.createElement(\"article\");\n  page.className = \"ofv-xps-page\";\n  const heading = document.createElement(\"h4\");\n  heading.textContent = `Page ${index + 1}`;\n  const pathMeta = document.createElement(\"span\");\n  pathMeta.textContent = path;\n  hideSupplementalInfo(pathMeta);\n\n  const canvas = createXpsPageCanvas(xml);\n  const text = document.createElement(\"div\");\n  text.className = \"ofv-xps-text\";\n  const fragments = extractXpsText(xml);\n  if (fragments.length > 0) {\n    for (const fragment of fragments) {\n      const paragraph = document.createElement(\"p\");\n      paragraph.textContent = fragment;\n      text.append(paragraph);\n    }\n  } else {\n    const empty = document.createElement(\"p\");\n    empty.textContent = \"这一页未提取到 Glyphs 文本。\";\n    text.append(empty);\n  }\n\n  page.append(heading, pathMeta);\n  if (canvas) {\n    hideSupplementalInfo(heading);\n    page.append(canvas);\n  }\n  page.append(text);\n  return page;\n}\n\nfunction createXpsPageCanvas(xml: string): Element | null {\n  const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n  if (doc.querySelector(\"parsererror\")) {\n    return null;\n  }\n  const info = parseXpsPageInfo(xml);\n  const width = info.width || 816;\n  const height = info.height || 1056;\n  const elements = Array.from(doc.getElementsByTagName(\"*\"));\n  const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n  svg.classList.add(\"ofv-xps-canvas\");\n  svg.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n  svg.setAttribute(\"role\", \"img\");\n  svg.setAttribute(\"aria-label\", \"XPS page layout preview\");\n\n  const background = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n  background.setAttribute(\"x\", \"0\");\n  background.setAttribute(\"y\", \"0\");\n  background.setAttribute(\"width\", String(width));\n  background.setAttribute(\"height\", String(height));\n  background.setAttribute(\"fill\", \"#ffffff\");\n  svg.append(background);\n\n  let drawn = 0;\n  for (const element of elements) {\n    if (element.localName === \"Path\") {\n      const pathData = getXmlAttribute(element, \"Data\");\n      if (pathData) {\n        const path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n        path.setAttribute(\"d\", pathData);\n        path.setAttribute(\"fill\", parseXpsBrush(getXmlAttribute(element, \"Fill\"), \"none\"));\n        path.setAttribute(\"stroke\", parseXpsBrush(getXmlAttribute(element, \"Stroke\"), \"#334155\"));\n        path.setAttribute(\"stroke-width\", getXmlAttribute(element, \"StrokeThickness\") || \"1\");\n        path.setAttribute(\"vector-effect\", \"non-scaling-stroke\");\n        svg.append(path);\n        drawn++;\n      }\n    } else if (element.localName === \"Glyphs\") {\n      const label = getXmlAttribute(element, \"UnicodeString\");\n      if (label) {\n        const text = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n        text.textContent = label;\n        text.setAttribute(\"x\", String(finiteNumber(getXmlAttribute(element, \"OriginX\"), 24) || 24));\n        text.setAttribute(\"y\", String(finiteNumber(getXmlAttribute(element, \"OriginY\"), 36) || 36));\n        text.setAttribute(\"fill\", parseXpsBrush(getXmlAttribute(element, \"Fill\"), \"#111827\"));\n        text.setAttribute(\"font-size\", String(finiteNumber(getXmlAttribute(element, \"FontRenderingEmSize\"), 16) || 16));\n        text.setAttribute(\"font-family\", \"system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif\");\n        svg.append(text);\n        drawn++;\n      }\n    }\n  }\n  return drawn > 0 ? svg : null;\n}\n\nfunction parseXpsBrush(value: string | null, fallback: string): string {\n  if (!value) {\n    return fallback;\n  }\n  const normalized = value.trim();\n  if (/^#[0-9a-f]{6,8}$/i.test(normalized)) {\n    return normalized.length === 9 ? `#${normalized.slice(3)}` : normalized;\n  }\n  if (/^[a-z]+$/i.test(normalized)) {\n    return normalized;\n  }\n  return fallback;\n}\n\nfunction extractXpsText(xml: string): string[] {\n  const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n  if (doc.querySelector(\"parsererror\")) {\n    return extractXpsTextByRegex(xml);\n  }\n  return Array.from(doc.getElementsByTagName(\"*\"))\n    .filter((element) => element.localName === \"Glyphs\")\n    .map((glyph) => getXmlAttribute(glyph, \"UnicodeString\") || \"\")\n    .map((value) => value.replace(/\\s+/g, \" \").trim())\n    .filter(Boolean);\n}\n\nfunction extractXpsTextByRegex(xml: string): string[] {\n  return [...xml.matchAll(/\\bUnicodeString=(?:\"([^\"]*)\"|'([^']*)')/g)]\n    .map((match) => decodeXml(match[1] || match[2] || \"\"))\n    .map((value) => value.replace(/\\s+/g, \" \").trim())\n    .filter(Boolean);\n}\n\nfunction firstAttributeValue(xml: string, name: string): string | undefined {\n  const match = xml.match(new RegExp(`\\\\b${name}=(?:\"([^\"]*)\"|'([^']*)')`));\n  return match?.[1] || match?.[2];\n}\n\nfunction countMatches(value: string, pattern: RegExp): number {\n  return [...value.matchAll(pattern)].length;\n}\n\nfunction renderXpsFallback(panel: HTMLElement, error: unknown): void {\n  panel.replaceChildren();\n  const fallback = document.createElement(\"div\");\n  fallback.className = \"ofv-fallback\";\n  const title = document.createElement(\"strong\");\n  title.textContent = \"XPS 解析失败\";\n  const meta = document.createElement(\"span\");\n  meta.textContent = error instanceof Error ? error.message : \"文件可能已损坏，或不是有效的 XPS/OXPS 包。\";\n  fallback.append(title, meta);\n  panel.append(fallback);\n}\n\nfunction appendMeta(parent: HTMLElement, label: string, value: string | number): void {\n  const row = document.createElement(\"div\");\n  row.className = \"ofv-meta-row\";\n  const key = document.createElement(\"span\");\n  key.textContent = label;\n  const content = document.createElement(\"strong\");\n  content.textContent = String(value);\n  row.append(key, content);\n  parent.append(row);\n}\n\nfunction hideSupplementalInfo(element: HTMLElement | null): void {\n  if (!element) {\n    return;\n  }\n  element.hidden = true;\n  element.setAttribute(\"aria-hidden\", \"true\");\n  element.style.display = \"none\";\n}\n\nfunction getXmlAttribute(element: Element, localName: string): string | null {\n  const direct = element.getAttribute(localName);\n  if (direct !== null) {\n    return direct;\n  }\n  for (const attribute of Array.from(element.attributes)) {\n    if (attribute.localName === localName) {\n      return attribute.value;\n    }\n  }\n  return null;\n}\n\nfunction finiteNumber(value: unknown, fallback: number | undefined): number | undefined {\n  const parsed = typeof value === \"number\" ? value : Number(value);\n  return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nfunction decodeXml(value: string): string {\n  return value\n    .replaceAll(\"&lt;\", \"<\")\n    .replaceAll(\"&gt;\", \">\")\n    .replaceAll(\"&amp;\", \"&\")\n    .replaceAll(\"&quot;\", '\"')\n    .replaceAll(\"&apos;\", \"'\");\n}\n","import JSZip from \"jszip\";\nimport DOMPurify from \"dompurify\";\nimport * as docxPreview from \"docx-preview\";\nimport type { WorkBook } from \"xlsx\";\nimport { formatPreviewMessage } from \"../messages\";\nimport type { PreviewCommand, PreviewContext, PreviewFit, PreviewInstance, PreviewMessages, PreviewPlugin } from \"../types\";\nimport {\n  createPanel,\n  createSection,\n  decodeTextBuffer,\n  getInitialZoom,\n  goToRenderedPage,\n  readArrayBuffer,\n  resolveFormat\n} from \"./utils\";\nimport { renderPdfDocumentPreview, type PdfPluginOptions } from \"./pdf\";\nimport { parseLegacyWordDocument, renderLegacyWordDocument } from \"./msdoc\";\nimport {\n  parseLegacyPowerPoint,\n  type LegacyPowerPointCharacterStyle,\n  type LegacyPowerPointImage,\n  type LegacyPowerPointMasterTextStyles,\n  type LegacyPowerPointPresentation,\n  type LegacyPowerPointShape\n} from \"./msppt\";\n\nconst wordExtensions = new Set([\"docx\", \"docm\", \"doc\", \"dotx\", \"dotm\", \"dot\", \"rtf\", \"odt\", \"fodt\", \"wps\"]);\nconst sheetExtensions = new Set([\"xlsx\", \"xls\", \"xlsm\", \"xlsb\", \"xlt\", \"xltx\", \"xltm\", \"csv\", \"tsv\", \"ods\", \"fods\", \"numbers\", \"et\"]);\nconst presentationExtensions = new Set([\"pptx\", \"pptm\", \"ppt\", \"pps\", \"ppsx\", \"ppsm\", \"potx\", \"potm\", \"odp\", \"fodp\", \"key\", \"dps\"]);\nconst packagedOfficeCandidates = new Set([\"wps\", \"et\", \"dps\", \"numbers\", \"key\"]);\nconst SHEET_WINDOW_ROWS = 200;\nconst SHEET_WINDOW_COLUMNS = 80;\nconst DEFAULT_DOCX_RENDER_TIMEOUT_MS = 15000;\nconst DEFAULT_PPTX_RENDER_TIMEOUT_MS = 12000;\nconst ZIP_SNIFF_TIMEOUT_MS = 10000;\n\n// Format sniffing runs before the render timeouts, so a JSZip hang here (seen in\n// micro-frontend sandboxes, see qiankun#2589) must reject instead of spinning forever.\nfunction loadZipForSniffing(arrayBuffer: ArrayBuffer): Promise<JSZip> {\n  return withTimeout(JSZip.loadAsync(arrayBuffer), ZIP_SNIFF_TIMEOUT_MS, \"Office package sniffing\");\n}\nconst PPTX_REL_NS = \"http://schemas.openxmlformats.org/package/2006/relationships\";\nconst officeMimeTypes = new Set([\n  \"application/msword\",\n  \"application/rtf\",\n  \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n  \"application/vnd.ms-word.document.macroenabled.12\",\n  \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\",\n  \"application/vnd.ms-word.template.macroenabled.12\",\n  \"application/vnd.oasis.opendocument.text\",\n  \"application/vnd.oasis.opendocument.text-flat-xml\",\n  \"application/vnd.ms-works\",\n  \"application/vnd.ms-excel\",\n  \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n  \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\",\n  \"application/vnd.ms-excel.sheet.macroenabled.12\",\n  \"application/vnd.ms-excel.sheet.binary.macroenabled.12\",\n  \"application/vnd.ms-excel.template.macroenabled.12\",\n  \"application/vnd.oasis.opendocument.spreadsheet\",\n  \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\",\n  \"application/vnd.apple.numbers\",\n  \"application/vnd.ms-powerpoint\",\n  \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n  \"application/vnd.ms-powerpoint.presentation.macroenabled.12\",\n  \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\",\n  \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\",\n  \"application/vnd.openxmlformats-officedocument.presentationml.template\",\n  \"application/vnd.ms-powerpoint.template.macroenabled.12\",\n  \"application/vnd.oasis.opendocument.presentation\",\n  \"application/vnd.oasis.opendocument.presentation-flat-xml\",\n  \"application/vnd.apple.keynote\"\n]);\nconst officeMimeFormatMap: Record<string, string> = {\n  \"application/msword\": \"doc\",\n  \"application/rtf\": \"rtf\",\n  \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": \"docx\",\n  \"application/vnd.ms-word.document.macroenabled.12\": \"docm\",\n  \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\": \"dotx\",\n  \"application/vnd.ms-word.template.macroenabled.12\": \"dotm\",\n  \"application/vnd.oasis.opendocument.text\": \"odt\",\n  \"application/vnd.oasis.opendocument.text-flat-xml\": \"fodt\",\n  \"application/vnd.ms-works\": \"wps\",\n  \"application/vnd.ms-excel\": \"xls\",\n  \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": \"xlsx\",\n  \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\": \"xltx\",\n  \"application/vnd.ms-excel.sheet.macroenabled.12\": \"xlsm\",\n  \"application/vnd.ms-excel.sheet.binary.macroenabled.12\": \"xlsb\",\n  \"application/vnd.ms-excel.template.macroenabled.12\": \"xltm\",\n  \"application/vnd.oasis.opendocument.spreadsheet\": \"ods\",\n  \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\": \"fods\",\n  \"application/vnd.apple.numbers\": \"numbers\",\n  \"application/vnd.ms-powerpoint\": \"ppt\",\n  \"application/vnd.openxmlformats-officedocument.presentationml.presentation\": \"pptx\",\n  \"application/vnd.ms-powerpoint.presentation.macroenabled.12\": \"pptm\",\n  \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\": \"ppsx\",\n  \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\": \"ppsm\",\n  \"application/vnd.openxmlformats-officedocument.presentationml.template\": \"potx\",\n  \"application/vnd.ms-powerpoint.template.macroenabled.12\": \"potm\",\n  \"application/vnd.oasis.opendocument.presentation\": \"odp\",\n  \"application/vnd.oasis.opendocument.presentation-flat-xml\": \"fodp\",\n  \"application/vnd.apple.keynote\": \"key\"\n};\n\ntype LegacyOfficeTextSource = \"ascii\" | \"utf16\";\n\ntype PresentationSlideInsight = {\n  title: string;\n  layout?: string;\n  textCount: number;\n  imageCount: number;\n  notesCount: number;\n  hasTransition: boolean;\n  animationCount: number;\n  sampleTexts: string[];\n};\n\ntype PresentationInsight = {\n  title: string;\n  slideCount: number;\n  imageCount: number;\n  notesCount: number;\n  transitionCount: number;\n  animationCount: number;\n  layouts: string[];\n  slides: PresentationSlideInsight[];\n};\n\ntype IWorkMetadata = {\n  title?: string;\n  author?: string;\n  company?: string;\n  subject?: string;\n  keywords?: string[];\n  created?: string;\n  modified?: string;\n};\n\nexport interface OfficeConversionContext {\n  file: PreviewContext[\"file\"];\n  arrayBuffer: ArrayBuffer;\n  extension: string;\n  detectedFormat?: \"docx\" | \"xlsx\" | \"pptx\";\n  reason: \"complex-docx\" | \"legacy-office\" | \"manual\";\n}\n\nexport type OfficeConversionResult =\n  | Blob\n  | ArrayBuffer\n  | string\n  | {\n      blob?: Blob;\n      data?: Blob | ArrayBuffer;\n      url?: string;\n      fileName?: string;\n      mimeType?: string;\n    };\n\nexport interface OfficePluginOptions {\n  convert?: (ctx: OfficeConversionContext) => Promise<OfficeConversionResult | null | undefined> | OfficeConversionResult | null | undefined;\n  preferConversion?: boolean | ((ctx: OfficeConversionContext) => boolean | Promise<boolean>);\n  pdf?: PdfPluginOptions;\n}\n\ntype NormalizedOfficeConversion = {\n  fileName: string;\n  fileUrl: string;\n  fileSize?: number;\n  mimeType: string;\n  revokeUrlOnDestroy: boolean;\n};\n\nexport function officePlugin(options: OfficePluginOptions = {}): PreviewPlugin {\n  return {\n    name: \"office\",\n    match(file) {\n      return (\n        wordExtensions.has(file.extension) ||\n        sheetExtensions.has(file.extension) ||\n        presentationExtensions.has(file.extension) ||\n        officeMimeTypes.has(file.mimeType)\n      );\n    },\n    async render(ctx) {\n      const panel = createPanel(\"ofv-office\");\n      ctx.viewport.append(panel);\n      const extension = resolveFormat(ctx.file, officeMimeFormatMap);\n      const arrayBuffer = await readArrayBuffer(ctx.file);\n      const packageFormat = shouldSniffPackagedOffice(extension) ? await detectPackagedOfficeFormat(arrayBuffer) : undefined;\n      const wordHtml = packageFormat ? undefined : detectWordHtmlDocument(extension, arrayBuffer);\n      let disposeDocxFit: (() => void) | undefined;\n      let disposeLegacyPresentation: (() => void) | undefined;\n      let delegatedInstance: PreviewInstance | undefined;\n\n      const conversionContext = await createOfficeConversionContext(ctx, arrayBuffer, extension, packageFormat);\n      if (conversionContext && (await shouldUseOfficeConversion(options, conversionContext))) {\n        delegatedInstance = await renderConvertedOfficePreview(panel, ctx, options, conversionContext);\n      } else if (wordHtml) {\n        renderWordHtmlDocument(panel, wordHtml);\n      } else if (packageFormat === \"docx\" && !fileIsDocx(extension)) {\n        disposeDocxFit = await renderDocx(panel, arrayBuffer, ctx.options.fit);\n      } else if (packageFormat === \"xlsx\" && !sheetExtensions.has(extension)) {\n        await renderSheet(panel, arrayBuffer, \"xlsx\", ctx.options.messages);\n      } else if (packageFormat === \"pptx\" && ![\"pptx\", \"pptm\", \"ppsx\", \"ppsm\", \"potx\", \"potm\"].includes(extension)) {\n        await renderPptx(panel, arrayBuffer);\n      } else if (fileIsDocx(extension)) {\n        disposeDocxFit = await renderDocx(panel, arrayBuffer, ctx.options.fit);\n      } else if (extension === \"rtf\") {\n        renderPlainDocument(panel, \"RTF 文档\", rtfToText(await readTextFromBuffer(arrayBuffer)));\n      } else if (extension === \"odt\") {\n        await renderOdt(panel, arrayBuffer);\n      } else if (extension === \"fodt\") {\n        renderOpenDocumentXml(panel, \"FODT 文档\", await readTextFromBuffer(arrayBuffer));\n      } else if (extension === \"fods\") {\n        renderFlatOds(panel, await readTextFromBuffer(arrayBuffer));\n      } else if (\n        packagedOfficeCandidates.has(extension) &&\n        (await renderPackagedOfficePreview(panel, arrayBuffer, extension, ctx.options.fit, ctx.options.messages))\n      ) {\n        // Rendered by package sniffing.\n      } else if (sheetExtensions.has(extension)) {\n        await renderSheet(panel, arrayBuffer, extension, ctx.options.messages);\n      } else if ([\"pptx\", \"pptm\", \"ppsx\", \"ppsm\", \"potx\", \"potm\"].includes(extension)) {\n        await renderPptx(panel, arrayBuffer);\n      } else if (extension === \"odp\") {\n        await renderOdp(panel, arrayBuffer);\n      } else if (extension === \"fodp\") {\n        renderOpenDocumentPresentationXml(panel, await readTextFromBuffer(arrayBuffer));\n      } else if (extension === \"doc\" || extension === \"dot\") {\n        renderLegacyWordBinary(panel, extension, arrayBuffer, ctx.options.messages);\n      } else if (extension === \"ppt\" || extension === \"pps\") {\n        try {\n          disposeLegacyPresentation = await renderLegacyPowerPoint(panel, arrayBuffer);\n        } catch (error) {\n          renderLegacyOfficeBinary(\n            panel,\n            extension,\n            arrayBuffer,\n            ctx.options.messages,\n            normalizeOfficeError(error, ctx.options.messages)\n          );\n        }\n      } else if (isLegacyOfficeBinary(extension)) {\n        renderLegacyOfficeBinary(panel, extension, arrayBuffer, ctx.options.messages);\n      } else {\n        renderUnsupportedOffice(panel, extension || ctx.file.extension || \"office\", ctx.options.messages);\n      }\n\n      const controller = createOfficeZoomController(panel, ctx);\n      ctx.toolbar?.refreshCommandSupport();\n\n      return {\n        goToPage(page) {\n          return (\n            delegatedInstance?.goToPage?.(page) ||\n            goToRenderedPage(\n              panel,\n              \".ofv-docx-page-frame, .ofv-docx-textbox-page, .ofv-msdoc-page, .ofv-slide, .ofv-ppt-binary-slide\",\n              page,\n              panel\n            )\n          );\n        },\n        canCommand(command) {\n          return delegatedInstance?.canCommand?.(command) || controller?.canCommand(command) || false;\n        },\n        command(command) {\n          return delegatedInstance?.command?.(command) || controller?.command(command) || false;\n        },\n        preparePrint() {\n          return delegatedInstance?.preparePrint?.();\n        },\n        destroy() {\n          delegatedInstance?.destroy();\n          controller?.destroy();\n          disposeDocxFit?.();\n          disposeLegacyPresentation?.();\n          panel.remove();\n        }\n      };\n    }\n  };\n}\n\nasync function createOfficeConversionContext(\n  ctx: PreviewContext,\n  arrayBuffer: ArrayBuffer,\n  extension: string,\n  detectedFormat?: \"docx\" | \"xlsx\" | \"pptx\"\n): Promise<OfficeConversionContext | undefined> {\n  const effectiveFormat = detectedFormat || extension;\n  if ((effectiveFormat === \"docx\" || fileIsDocx(extension)) && (await docxShouldPreferTextboxLayoutFallback(arrayBuffer))) {\n    return { file: ctx.file, arrayBuffer, extension, detectedFormat, reason: \"complex-docx\" };\n  }\n  if (isLegacyOfficeBinary(extension)) {\n    return { file: ctx.file, arrayBuffer, extension, detectedFormat, reason: \"legacy-office\" };\n  }\n  return undefined;\n}\n\nasync function shouldUseOfficeConversion(options: OfficePluginOptions, context: OfficeConversionContext): Promise<boolean> {\n  if (!options.convert) {\n    return false;\n  }\n  if (typeof options.preferConversion === \"function\") {\n    return Boolean(await options.preferConversion(context));\n  }\n  if (options.preferConversion !== undefined) {\n    return options.preferConversion;\n  }\n  return context.reason === \"complex-docx\" || context.reason === \"legacy-office\";\n}\n\nasync function renderConvertedOfficePreview(\n  panel: HTMLElement,\n  ctx: PreviewContext,\n  options: OfficePluginOptions,\n  conversionContext: OfficeConversionContext\n): Promise<PreviewInstance> {\n  if (!options.convert) {\n    throw new Error(\"Office conversion handler is not configured.\");\n  }\n  const converted = normalizeOfficeConversionResult(await options.convert(conversionContext), ctx.file.name);\n  if (!converted) {\n    throw new Error(\"Office conversion handler did not return a previewable file.\");\n  }\n  if (converted.mimeType !== \"application/pdf\" && !converted.fileName.toLowerCase().endsWith(\".pdf\")) {\n    throw new Error(\"Office conversion handler must return a PDF Blob, ArrayBuffer or URL.\");\n  }\n  return renderPdfDocumentPreview({\n    ...(options.pdf || {}),\n    fileName: converted.fileName,\n    fileUrl: converted.fileUrl,\n    fileSize: converted.fileSize,\n    isExternal: !converted.revokeUrlOnDestroy,\n    viewport: panel,\n    size: ctx.size,\n    fit: ctx.options.fit,\n    zoom: ctx.options.zoom,\n    toolbar: ctx.toolbar,\n    messages: ctx.options.messages,\n    title: ctx.options.messages.officeConvertedTitle,\n    fallbackTitle: ctx.options.messages.officeConvertedPdfFailed,\n    revokeUrlOnDestroy: converted.revokeUrlOnDestroy\n  });\n}\n\nfunction normalizeOfficeConversionResult(\n  result: OfficeConversionResult | null | undefined,\n  sourceFileName: string\n): NormalizedOfficeConversion | undefined {\n  if (!result) {\n    return undefined;\n  }\n  const fallbackFileName = `${stripFileExtension(sourceFileName) || \"office-preview\"}.pdf`;\n  if (typeof result === \"string\") {\n    return {\n      fileName: fallbackFileName,\n      fileUrl: result,\n      mimeType: \"application/pdf\",\n      revokeUrlOnDestroy: false\n    };\n  }\n  if (result instanceof ArrayBuffer) {\n    const blob = new Blob([result], { type: \"application/pdf\" });\n    return createConvertedOfficeBlobPreview(blob, fallbackFileName);\n  }\n  if (result instanceof Blob) {\n    return createConvertedOfficeBlobPreview(result, fallbackFileName);\n  }\n  if (result.url) {\n    return {\n      fileName: result.fileName || fallbackFileName,\n      fileUrl: result.url,\n      mimeType: result.mimeType || \"application/pdf\",\n      revokeUrlOnDestroy: false\n    };\n  }\n  const data = result.blob || result.data;\n  if (data instanceof ArrayBuffer) {\n    const blob = new Blob([data], { type: result.mimeType || \"application/pdf\" });\n    return createConvertedOfficeBlobPreview(blob, result.fileName || fallbackFileName);\n  }\n  if (data instanceof Blob) {\n    return createConvertedOfficeBlobPreview(data, result.fileName || fallbackFileName);\n  }\n  return undefined;\n}\n\nfunction createConvertedOfficeBlobPreview(blob: Blob, fileName: string): NormalizedOfficeConversion {\n  return {\n    fileName,\n    fileUrl: URL.createObjectURL(blob),\n    fileSize: blob.size,\n    mimeType: blob.type || \"application/pdf\",\n    revokeUrlOnDestroy: true\n  };\n}\n\nfunction stripFileExtension(fileName: string): string {\n  return fileName.replace(/\\.[^.]+$/, \"\");\n}\n\nfunction createOfficeZoomController(\n  panel: HTMLElement,\n  ctx: Pick<PreviewContext, \"options\" | \"toolbar\">\n): {\n  canCommand: (command: PreviewCommand) => boolean;\n  command: (command: PreviewCommand) => boolean;\n  destroy: () => void;\n} | undefined {\n  const canZoom = Boolean(\n    panel.querySelector(\n      \".ofv-docx-document, .ofv-sheet, .ofv-pptx-viewer > div, .ofv-ppt-binary-slide, .ofv-document, .ofv-text-block, .ofv-slide, .ofv-msdoc-document\"\n    )\n  );\n  if (!canZoom) {\n    return undefined;\n  }\n\n  let zoom = getInitialZoom(ctx, 0.5, 3);\n  const apply = () => {\n    panel.style.setProperty(\"--ofv-office-zoom\", String(zoom));\n    panel.dispatchEvent(new CustomEvent(\"ofv-office-zoom\"));\n    for (const slide of panel.querySelectorAll<HTMLElement>(\".ofv-pptx-viewer > div[data-slide-index]\")) {\n      // The slide keeps its natural layout and is scaled via `zoom`, which grows\n      // its layout box too; percentage caps and inner scrolling would fight that.\n      slide.style.transform = \"\";\n      slide.style.transformOrigin = \"\";\n      setElementZoom(slide, zoom === 1 ? \"\" : String(zoom));\n      slide.style.width = zoom === 1 ? \"\" : \"max-content\";\n      slide.style.maxWidth = zoom === 1 ? \"\" : \"none\";\n      slide.style.overflow = zoom === 1 ? \"\" : \"visible\";\n    }\n    for (const slide of panel.querySelectorAll<HTMLElement>(\".ofv-ppt-binary-slide\")) {\n      setElementZoom(slide, zoom === 1 ? \"\" : String(zoom));\n    }\n    for (const scrollBox of panel.querySelectorAll<HTMLElement>(\".ofv-table-scroll\")) {\n      syncSheetTableZoom(scrollBox, zoom);\n    }\n    ctx.toolbar?.setZoom(zoom);\n  };\n  apply();\n\n  return {\n    canCommand(command) {\n      return command === \"zoom-in\" || command === \"zoom-out\" || command === \"zoom-reset\";\n    },\n    command(command) {\n      if (command === \"zoom-in\") {\n        zoom = Math.min(3, Number((zoom + 0.12).toFixed(2)));\n        apply();\n        return true;\n      }\n      if (command === \"zoom-out\") {\n        zoom = Math.max(0.5, Number((zoom - 0.12).toFixed(2)));\n        apply();\n        return true;\n      }\n      if (command === \"zoom-reset\") {\n        zoom = 1;\n        apply();\n        return true;\n      }\n      return false;\n    },\n    destroy() {\n      ctx.toolbar?.setZoom(undefined);\n    }\n  };\n}\n\nfunction setElementZoom(element: HTMLElement, value: string): void {\n  (element.style as CSSStyleDeclaration & { zoom: string }).zoom = value;\n}\n\nfunction getOfficePanelZoom(element: HTMLElement): number {\n  const panel = element.closest<HTMLElement>(\".ofv-panel\");\n  const parsed = Number.parseFloat(panel?.style.getPropertyValue(\"--ofv-office-zoom\") || \"1\");\n  return Number.isFinite(parsed) && parsed > 0 ? parsed : 1;\n}\n\n// Sheet tables zoom via the CSS `zoom` property so the scaled size participates in\n// layout and .ofv-table-scroll grows real scrollbars. The table's rendered width\n// (including the min-width:100% stretch) is captured once as the base, then locked\n// as an explicit width — otherwise the percentage min-width re-resolves inside the\n// zoomed coordinate space and cancels the scale out.\nfunction syncSheetTableZoom(scrollBox: HTMLElement, zoom: number): void {\n  const table = scrollBox.querySelector<HTMLTableElement>(\":scope > table\");\n  if (!table) {\n    return;\n  }\n  if (zoom === 1) {\n    if (table.dataset.ofvZoomBase !== undefined) {\n      table.style.width = table.dataset.ofvZoomNaturalWidth || \"\";\n      table.style.minWidth = \"\";\n      setElementZoom(table, \"\");\n      delete table.dataset.ofvZoomBase;\n      delete table.dataset.ofvZoomNaturalWidth;\n    }\n    return;\n  }\n  if (table.dataset.ofvZoomBase === undefined) {\n    const naturalWidth = table.style.width;\n    setElementZoom(table, \"\");\n    table.style.minWidth = \"\";\n    table.style.width = naturalWidth;\n    const measured = table.offsetWidth || Number.parseFloat(naturalWidth) || 0;\n    if (measured <= 0) {\n      return;\n    }\n    table.dataset.ofvZoomBase = String(measured);\n    table.dataset.ofvZoomNaturalWidth = naturalWidth;\n  }\n  table.style.width = `${table.dataset.ofvZoomBase}px`;\n  table.style.minWidth = \"0\";\n  setElementZoom(table, String(zoom));\n}\n\n// A column resize changes the table's natural width, so the cached zoom base is\n// stale; drop the lock and re-measure at the new width.\nfunction resetSheetTableZoomLock(table: HTMLElement): void {\n  if (table.dataset.ofvZoomBase === undefined) {\n    return;\n  }\n  table.style.minWidth = \"\";\n  setElementZoom(table, \"\");\n  delete table.dataset.ofvZoomBase;\n  delete table.dataset.ofvZoomNaturalWidth;\n  const scrollBox = table.closest<HTMLElement>(\".ofv-table-scroll\");\n  if (scrollBox) {\n    syncSheetTableZoom(scrollBox, getOfficePanelZoom(table));\n  }\n}\n\nfunction fileIsDocx(extension: string): boolean {\n  return extension === \"docx\" || extension === \"docm\" || extension === \"dotx\" || extension === \"dotm\";\n}\n\nfunction shouldSniffPackagedOffice(extension: string): boolean {\n  return isLegacyOfficeBinary(extension) || packagedOfficeCandidates.has(extension) || extension === \"\";\n}\n\nasync function detectPackagedOfficeFormat(arrayBuffer: ArrayBuffer): Promise<\"docx\" | \"xlsx\" | \"pptx\" | undefined> {\n  try {\n    const zip = await loadZipForSniffing(arrayBuffer);\n    const entries = Object.values(zip.files).filter((entry) => !entry.dir);\n    const hasEntry = (path: string) => entries.some((entry) => entry.name.toLowerCase() === path.toLowerCase());\n    if (hasEntry(\"word/document.xml\")) {\n      return \"docx\";\n    }\n    if (hasEntry(\"xl/workbook.xml\")) {\n      return \"xlsx\";\n    }\n    if (hasEntry(\"ppt/presentation.xml\")) {\n      return \"pptx\";\n    }\n  } catch {\n    return undefined;\n  }\n  return undefined;\n}\n\nfunction detectWordHtmlDocument(extension: string, arrayBuffer: ArrayBuffer): string | undefined {\n  if (extension !== \"doc\" && extension !== \"dot\") {\n    return undefined;\n  }\n  if (hasOleSignature(arrayBuffer)) {\n    return undefined;\n  }\n  const html = decodeTextBuffer(arrayBuffer).replace(/^\\uFEFF/, \"\");\n  return /^\\s*(?:<!doctype\\s+html[^>]*>\\s*)?<html(?:\\s|>)/i.test(html) && /<body(?:\\s|>)/i.test(html) ? html : undefined;\n}\n\nfunction renderWordHtmlDocument(panel: HTMLElement, html: string): void {\n  panel.classList.add(\"ofv-office-word-html\");\n  const parsed = new DOMParser().parseFromString(html, \"text/html\");\n  const section = createSection(\"Word HTML 文档\");\n  hideSuccessfulSectionHeading(section);\n  const content = document.createElement(\"article\");\n  content.className = \"ofv-document ofv-word-html-document\";\n  content.innerHTML = sanitizeHtml(parsed.body.innerHTML || \"<p>未解析到可展示内容。</p>\");\n  section.append(content);\n  panel.append(section);\n}\n\nasync function renderDocx(panel: HTMLElement, arrayBuffer: ArrayBuffer, fit: PreviewFit): Promise<() => void> {\n  panel.classList.add(\"ofv-office-docx\");\n  const content = document.createElement(\"div\");\n  content.className = \"ofv-docx-document\";\n  const styleContainer = document.createElement(\"style\");\n  styleContainer.className = \"ofv-docx-style-container\";\n  document.head.append(styleContainer);\n  let disposeFit: (() => void) | undefined;\n\n  try {\n    await withTimeout(\n      (async () => {\n        await docxPreview.renderAsync(arrayBuffer, content, styleContainer, {\n          className: \"ofv-docx\",\n          inWrapper: true,\n          breakPages: true,\n          ignoreWidth: false,\n          ignoreHeight: false,\n          ignoreFonts: false,\n          renderHeaders: true,\n          renderFooters: true,\n          renderFootnotes: true,\n          renderEndnotes: true,\n          renderComments: true,\n          renderAltChunks: true,\n          experimental: true,\n          useBase64URL: true\n        });\n      })(),\n      docxRenderTimeoutMs(),\n      \"DOCX rendering\"\n    );\n    await normalizeDocxLayout(content, arrayBuffer, styleContainer);\n    const shouldUseTextboxFallback =\n      (await docxPreviewLooksBlank(content, arrayBuffer)) ||\n      (await docxPreviewMissesRichTextboxContent(content, arrayBuffer)) ||\n      (await docxShouldPreferTextboxLayoutFallback(arrayBuffer));\n    if (shouldUseTextboxFallback) {\n      disposeFit?.();\n      styleContainer.remove();\n      content.replaceChildren();\n      await renderDocxContentFallback(content, arrayBuffer, {\n        preferOpenXml: await docxHasRichTextboxContent(arrayBuffer)\n      });\n      panel.append(content);\n      console.warn(\"DOCX layout preview missed readable textbox content, fell back to text extraction.\");\n      return () => undefined;\n    }\n    panel.append(content);\n    paginateDocxFlow(content);\n    disposeFit = fitDocxPages(content, fit);\n    return () => {\n      disposeFit?.();\n      styleContainer.remove();\n    };\n  } catch (error) {\n    disposeFit?.();\n    styleContainer.remove();\n    const fallbackContent = document.createElement(\"div\");\n    fallbackContent.className = \"ofv-docx-document\";\n    await renderDocxContentFallback(fallbackContent, arrayBuffer);\n    panel.append(fallbackContent);\n    console.warn(\"DOCX layout preview failed, fell back to Mammoth:\", error);\n  }\n  return () => undefined;\n}\n\nfunction docxRenderTimeoutMs(): number {\n  const override = (globalThis as { __OFV_DOCX_RENDER_TIMEOUT_MS__?: unknown }).__OFV_DOCX_RENDER_TIMEOUT_MS__;\n  return typeof override === \"number\" && override > 0 ? override : DEFAULT_DOCX_RENDER_TIMEOUT_MS;\n}\n\nasync function docxPreviewLooksBlank(container: HTMLElement, arrayBuffer: ArrayBuffer): Promise<boolean> {\n  if (container.querySelector(\"img, svg, canvas, table\")) {\n    return false;\n  }\n  const renderedText = normalizePreviewText(container.textContent || \"\");\n  if (renderedText.length >= 24) {\n    return false;\n  }\n\n  try {\n    const paragraphs = await extractDocxParagraphs(arrayBuffer);\n    const sourceText = normalizePreviewText(paragraphs.join(\"\"));\n    return sourceText.length >= 24 && sourceText.length > renderedText.length * 4;\n  } catch {\n    return false;\n  }\n}\n\nasync function docxPreviewMissesRichTextboxContent(container: HTMLElement, arrayBuffer: ArrayBuffer): Promise<boolean> {\n  try {\n    if (!(await docxHasRichTextboxContent(arrayBuffer))) {\n      return false;\n    }\n    const zip = await loadZipForSniffing(arrayBuffer);\n    const documentXml = await zip.file(\"word/document.xml\")?.async(\"text\");\n    if (!documentXml) {\n      return false;\n    }\n    const sourceParagraphs = dedupeParagraphs(extractWordTextboxParagraphs(documentXml))\n      .map((paragraph) => normalizePreviewText(paragraph))\n      .filter((paragraph) => paragraph.length >= 3);\n    if (sourceParagraphs.length < 4) {\n      return false;\n    }\n\n    const renderedText = normalizePreviewText(container.textContent || \"\");\n    const firstImportantParagraphs = sourceParagraphs.slice(0, Math.min(4, sourceParagraphs.length));\n    const firstCoverage = firstImportantParagraphs.filter((paragraph) => renderedText.includes(paragraph)).length / firstImportantParagraphs.length;\n    const totalCoverage = sourceParagraphs.filter((paragraph) => renderedText.includes(paragraph)).length / sourceParagraphs.length;\n    return firstCoverage < 0.5 || totalCoverage < 0.45;\n  } catch {\n    return false;\n  }\n}\n\nasync function docxHasRichTextboxContent(arrayBuffer: ArrayBuffer): Promise<boolean> {\n  try {\n    const zip = await loadZipForSniffing(arrayBuffer);\n    const documentXml = await zip.file(\"word/document.xml\")?.async(\"text\");\n    if (!documentXml || !/\\btxbxContent\\b/.test(documentXml)) {\n      return false;\n    }\n    const textboxCount = (documentXml.match(/\\btxbxContent\\b/g) || []).length;\n    const textboxParagraphs = extractWordTextboxParagraphs(documentXml);\n    const textboxTextLength = normalizePreviewText(textboxParagraphs.join(\"\")).length;\n    const documentTextLength = normalizePreviewText(extractOpenXmlText(documentXml).join(\"\")).length;\n    return (\n      (textboxCount >= 3 || textboxParagraphs.length >= 3 || textboxTextLength >= 160) &&\n      textboxTextLength >= 8 &&\n      textboxTextLength >= documentTextLength * 0.4\n    );\n  } catch {\n    return false;\n  }\n}\n\nasync function docxShouldPreferTextboxLayoutFallback(arrayBuffer: ArrayBuffer): Promise<boolean> {\n  try {\n    const zip = await loadZipForSniffing(arrayBuffer);\n    const documentXml = await zip.file(\"word/document.xml\")?.async(\"text\");\n    if (!documentXml || !/\\btxbxContent\\b/.test(documentXml)) {\n      return false;\n    }\n    const blocks = extractDocxTextboxBlocks(documentXml);\n    const meaningfulBlocks = blocks.filter((block) => block.paragraphs.length > 0);\n    const sidebarBackgrounds = blocks.filter(\n      (block) => block.paragraphs.length === 0 && block.fill && block.relativeV === \"page\" && block.x < 0 && block.width >= 120 && block.height >= 500\n    );\n    const pageAnchoredTextboxes = meaningfulBlocks.filter((block) => block.relativeV === \"page\");\n    const paragraphAnchoredTextboxes = meaningfulBlocks.filter((block) => block.relativeV !== \"page\");\n    const leftTextboxes = meaningfulBlocks.filter((block) => block.x < 0);\n    const rightTextboxes = meaningfulBlocks.filter((block) => block.x >= 80);\n    return (\n      sidebarBackgrounds.length >= 2 &&\n      meaningfulBlocks.length >= 8 &&\n      pageAnchoredTextboxes.length >= 4 &&\n      paragraphAnchoredTextboxes.length >= 2 &&\n      leftTextboxes.length >= 3 &&\n      rightTextboxes.length >= 3\n    );\n  } catch {\n    return false;\n  }\n}\n\nasync function renderDocxContentFallback(\n  container: HTMLElement,\n  arrayBuffer: ArrayBuffer,\n  options: { preferOpenXml?: boolean; showNote?: boolean } = {}\n): Promise<void> {\n  if (options.showNote !== false) {\n    const fallbackNote = document.createElement(\"div\");\n    fallbackNote.className = \"ofv-docx-fallback-note\";\n    fallbackNote.textContent = \"高保真 DOCX 渲染不可用，已切换为基础内容预览。\";\n    hideSupplementalInfo(fallbackNote);\n    container.append(fallbackNote);\n  }\n  if (options.preferOpenXml) {\n    if (await renderDocxTextboxLayoutFallback(container, arrayBuffer)) {\n      return;\n    }\n    await renderDocxTextFallback(container, arrayBuffer);\n    return;\n  }\n  try {\n    const mammothContent = document.createElement(\"div\");\n    await withTimeout(renderDocxWithMammoth(mammothContent, arrayBuffer), docxRenderTimeoutMs(), \"DOCX fallback rendering\");\n    const renderedText = normalizePreviewText(mammothContent.querySelector(\".ofv-document\")?.textContent || \"\");\n    if (renderedText.length >= 24) {\n      container.append(...Array.from(mammothContent.childNodes));\n      return;\n    }\n    await renderDocxTextFallback(container, arrayBuffer);\n  } catch (fallbackError) {\n    await renderDocxTextFallback(container, arrayBuffer);\n    console.warn(\"DOCX content fallback failed, used raw OpenXML text extraction:\", fallbackError);\n  }\n}\n\ntype DocxTextboxBlock = {\n  order: number;\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n  relativeV: string;\n  fill?: string;\n  paragraphs: string[];\n};\n\ntype DocxTextboxColumnLayout = {\n  sidebar: Set<number>;\n  main: Set<number>;\n  sidebarLeft: number;\n  mainLeft: number;\n  sidebarWidth: number;\n  mainWidth: number;\n};\n\nasync function renderDocxTextboxLayoutFallback(container: HTMLElement, arrayBuffer: ArrayBuffer): Promise<boolean> {\n  try {\n    const zip = await JSZip.loadAsync(arrayBuffer);\n    const documentXml = await zip.file(\"word/document.xml\")?.async(\"text\");\n    if (!documentXml) {\n      return false;\n    }\n    const blocks = extractDocxTextboxBlocks(documentXml);\n    const meaningfulBlocks = blocks.filter((block) => block.paragraphs.length > 0);\n    if (meaningfulBlocks.length < 4) {\n      return false;\n    }\n    if (renderDocxAnchoredTextboxFallback(container, meaningfulBlocks, blocks)) {\n      return true;\n    }\n    const page = document.createElement(\"article\");\n    page.className = \"ofv-document ofv-docx-textbox-layout\";\n    const sidebar = document.createElement(\"section\");\n    sidebar.className = \"ofv-docx-textbox-sidebar\";\n    const main = document.createElement(\"section\");\n    main.className = \"ofv-docx-textbox-main\";\n\n    const ordered = [...meaningfulBlocks].sort((a, b) => a.order - b.order);\n    const leftThreshold = ordered.some((block) => block.x < 0) ? 0 : Math.min(...ordered.map((block) => block.x)) + 72;\n    for (const block of ordered) {\n      const card = createDocxTextboxBlockElement(block);\n      if (block.x < leftThreshold && block.width < 260) {\n        card.classList.add(\"ofv-docx-textbox-sidebar-block\");\n        sidebar.append(card);\n      } else {\n        card.classList.add(\"ofv-docx-textbox-main-block\");\n        main.append(card);\n      }\n    }\n\n    if (sidebar.childElementCount === 0 || main.childElementCount === 0) {\n      for (const block of ordered) {\n        page.append(createDocxTextboxBlockElement(block));\n      }\n    } else {\n      page.append(sidebar, main);\n    }\n    container.append(page);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nfunction extractDocxTextboxBlocks(xml: string): DocxTextboxBlock[] {\n  const blocks: DocxTextboxBlock[] = [];\n  let order = 0;\n  for (const match of xml.matchAll(/<wp:anchor\\b[\\s\\S]*?<\\/wp:anchor>/g)) {\n    const anchor = match[0];\n    const textboxMatches = [...anchor.matchAll(/<w:txbxContent\\b[\\s\\S]*?<\\/w:txbxContent>/g)];\n    const extent = /<wp:extent\\b[^>]*\\bcx=\"(\\d+)\"[^>]*\\bcy=\"(\\d+)\"/.exec(anchor);\n    const offsets = [...anchor.matchAll(/<wp:posOffset>(-?\\d+)<\\/wp:posOffset>/g)].map((item) => Number(item[1]));\n    const fill = /<a:solidFill>[\\s\\S]*?<a:srgbClr\\b[^>]*\\bval=\"([A-Fa-f0-9]+)\"/.exec(anchor)?.[1];\n    if (textboxMatches.length === 0 && !fill) {\n      continue;\n    }\n    const block: DocxTextboxBlock = {\n      order,\n      x: emuToPt(offsets[0] || 0),\n      y: emuToPt(offsets[1] || 0),\n      relativeV: /<wp:positionV\\b[^>]*\\brelativeFrom=\"([^\"]+)\"/.exec(anchor)?.[1] || \"\",\n      width: emuToPt(Number(extent?.[1] || 0)),\n      height: emuToPt(Number(extent?.[2] || 0)),\n      fill,\n      paragraphs:\n        textboxMatches.length > 0\n          ? dedupeParagraphs(\n              textboxMatches\n                .flatMap((textbox) => extractWordTextboxParagraphs(textbox[0]))\n                .map((text) => text.replace(/\\s+/g, \" \").trim())\n            )\n          : []\n    };\n    if (block.width > 0 && block.height > 0) {\n      blocks.push(block);\n    }\n    order += 1;\n  }\n  return blocks;\n}\n\nfunction renderDocxAnchoredTextboxFallback(container: HTMLElement, blocks: DocxTextboxBlock[], sourceBlocks = blocks): boolean {\n  const pageBlocks = blocks.filter((block) => block.relativeV === \"page\");\n  const paragraphBlocks = blocks.filter((block) => block.relativeV !== \"page\");\n  if (pageBlocks.length < 3 || paragraphBlocks.length < 4) {\n    return false;\n  }\n\n  const continuationMarkers = findDocxTextboxContinuationMarkers(sourceBlocks);\n  const continuationMarkerOrder = continuationMarkers[0]?.order ?? Number.POSITIVE_INFINITY;\n  const firstPageBlocks = pageBlocks.filter(\n    (block) => block.order < continuationMarkerOrder && !isDocxTextboxLargeBackground(block)\n  );\n  const firstPageParagraphBlocks = paragraphBlocks.filter(\n    (block) => block.order < continuationMarkerOrder && isDocxTextboxFirstPageFlowBlock(block)\n  );\n  const continuationBlocks = blocks.filter(\n    (block) => block.order >= continuationMarkerOrder || (block.relativeV !== \"page\" && !isDocxTextboxFirstPageFlowBlock(block))\n  );\n  const continuationGroups = groupDocxTextboxContinuationBlocks(blocks, continuationMarkers, continuationMarkerOrder);\n  if (firstPageBlocks.length < 3) {\n    return false;\n  }\n\n  const page = document.createElement(\"article\");\n  page.className = \"ofv-document ofv-docx-textbox-page\";\n  page.style.setProperty(\"--ofv-docx-textbox-page-width\", \"595pt\");\n\n  const contentLeft = Math.min(...firstPageBlocks.map((block) => block.x));\n  const contentRight = Math.max(...firstPageBlocks.map((block) => block.x + Math.max(block.width, 24)));\n  const normalizedWidth = Math.max(420, contentRight - contentLeft + 36);\n  const pageWidth = Math.max(595, normalizedWidth);\n  const normalizeX = (block: DocxTextboxBlock) => block.x - contentLeft + (pageWidth - normalizedWidth) / 2;\n  const normalizeY = (block: DocxTextboxBlock) => Math.max(0, block.y + 24);\n  const columns = classifyDocxTextboxColumns([...firstPageBlocks, ...firstPageParagraphBlocks, ...continuationBlocks], normalizeX);\n  const sidebarBackground = findDocxTextboxSidebarBackground(sourceBlocks);\n  if (\n    sidebarBackground?.fill &&\n    renderDocxFirstPageFlowFallback(page, firstPageBlocks, firstPageParagraphBlocks, columns, sidebarBackground)\n  ) {\n    container.append(page);\n    appendDocxTextboxContinuationPages(\n      container,\n      continuationGroups.length > 0 ? continuationGroups : [continuationBlocks],\n      columns,\n      sidebarBackground\n    );\n    return true;\n  }\n\n  if (sidebarBackground?.fill) {\n    page.classList.add(\"ofv-docx-textbox-page-has-sidebar\");\n    page.style.setProperty(\"--ofv-docx-textbox-sidebar-bg\", `#${sidebarBackground.fill}`);\n    page.style.setProperty(\"--ofv-docx-textbox-sidebar-width\", `${formatCssNumber(inferDocxTextboxSidebarBackgroundWidth(columns))}pt`);\n  }\n\n  for (const block of firstPageBlocks) {\n    const element = createDocxPositionedTextboxBlockElement(block);\n    element.classList.add(columns.sidebar.has(block.order) ? \"ofv-docx-textbox-page-sidebar-block\" : \"ofv-docx-textbox-page-main-block\");\n    if (columns.main.has(block.order)) {\n      element.classList.remove(\"ofv-docx-textbox-page-filled-block\");\n    }\n    element.style.left = `${formatCssNumber(normalizeX(block))}pt`;\n    element.style.top = `${formatCssNumber(normalizeY(block))}pt`;\n    element.style.width = `${formatCssNumber(Math.max(24, block.width))}pt`;\n    if (block.height > 0) {\n      element.style.minHeight = `${formatCssNumber(block.height)}pt`;\n    }\n    page.append(element);\n  }\n\n  const sidebarFlowBlocks = firstPageParagraphBlocks.filter((block) => columns.sidebar.has(block.order));\n  const mainFlowBlocks = firstPageParagraphBlocks.filter((block) => columns.main.has(block.order));\n  const pageAnchorsBottom = Math.max(\n    ...firstPageBlocks.map((block) => normalizeY(block) + Math.max(block.height, estimateDocxTextboxBlockHeight(block)))\n  );\n  const sidebarFlowTop = estimateDocxTextboxColumnFlowStart(firstPageBlocks, columns.sidebar, normalizeY, pageAnchorsBottom);\n  const mainFlowTop = estimateDocxTextboxColumnFlowStart(firstPageBlocks, columns.main, normalizeY, pageAnchorsBottom);\n  const sidebarFlowBottom = appendDocxTextboxFlowColumn(page, sidebarFlowBlocks, {\n    className: \"ofv-docx-textbox-page-sidebar-flow\",\n    leftPt: columns.sidebarLeft,\n    topPt: sidebarFlowTop,\n    widthPt: columns.sidebarWidth\n  });\n  const mainFlowBottom = appendDocxTextboxFlowColumn(page, mainFlowBlocks, {\n    className: \"ofv-docx-textbox-page-main-flow\",\n    leftPt: columns.mainLeft,\n    topPt: mainFlowTop,\n    widthPt: columns.mainWidth\n  });\n  page.style.minHeight = `${formatCssNumber(Math.max(842, pageAnchorsBottom + 36, sidebarFlowBottom + 36, mainFlowBottom + 36))}pt`;\n\n  container.append(page);\n  appendDocxTextboxContinuationPages(\n    container,\n    continuationGroups.length > 0 ? continuationGroups : [continuationBlocks],\n    columns,\n    sidebarBackground\n  );\n  return true;\n}\n\nfunction findDocxTextboxContinuationMarkers(blocks: DocxTextboxBlock[]): DocxTextboxBlock[] {\n  return blocks\n    .filter(isDocxTextboxLargeBackground)\n    .sort((a, b) => a.order - b.order)\n    .slice(1);\n}\n\nfunction isDocxTextboxLargeBackground(block: DocxTextboxBlock): boolean {\n  return block.paragraphs.length === 0 && Boolean(block.fill) && block.relativeV === \"page\" && block.width >= 120 && block.height >= 500;\n}\n\nfunction isDocxTextboxFirstPageFlowBlock(block: DocxTextboxBlock): boolean {\n  return block.y >= -5;\n}\n\nfunction renderDocxFirstPageFlowFallback(\n  page: HTMLElement,\n  pageBlocks: DocxTextboxBlock[],\n  paragraphBlocks: DocxTextboxBlock[],\n  columns: DocxTextboxColumnLayout,\n  sidebarBackground: DocxTextboxBlock\n): boolean {\n  const sidebarBlocks = [...pageBlocks, ...paragraphBlocks]\n    .filter((block) => columns.sidebar.has(block.order) && block.paragraphs.length > 0)\n    .filter((block) => !isDocxTextboxDecorativeBlock(block))\n    .sort(sortDocxTextboxFirstPageSidebarBlock);\n  const mainBlocks = pageBlocks\n    .filter((block) => columns.main.has(block.order) && block.paragraphs.length > 0)\n    .filter((block) => !isDocxTextboxDecorativeBlock(block))\n    .sort(sortDocxTextboxFirstPageMainBlock);\n  if (sidebarBlocks.length < 2 || mainBlocks.length < 2) {\n    return false;\n  }\n\n  page.classList.add(\"ofv-docx-textbox-page-flow-layout\");\n  page.style.setProperty(\"--ofv-docx-textbox-sidebar-bg\", `#${sidebarBackground.fill}`);\n  page.style.setProperty(\"--ofv-docx-textbox-sidebar-width\", `${formatCssNumber(inferDocxTextboxSidebarBackgroundWidth(columns))}pt`);\n\n  const sidebar = document.createElement(\"aside\");\n  sidebar.className = \"ofv-docx-textbox-page-flow-sidebar\";\n  const main = document.createElement(\"main\");\n  main.className = \"ofv-docx-textbox-page-flow-main\";\n\n  for (const block of mergeDocxTextboxSidebarHeadingBlocks(sidebarBlocks)) {\n    const element = createDocxTextboxBlockElement(block);\n    element.classList.add(\"ofv-docx-textbox-flow-block\");\n    sidebar.append(element);\n  }\n  for (const block of mainBlocks) {\n    const element = createDocxTextboxBlockElement(block);\n    element.classList.add(\"ofv-docx-textbox-flow-block\");\n    main.append(element);\n  }\n\n  page.append(sidebar, main);\n  return true;\n}\n\nfunction sortDocxTextboxFirstPageSidebarBlock(a: DocxTextboxBlock, b: DocxTextboxBlock): number {\n  return a.order - b.order;\n}\n\nfunction sortDocxTextboxFirstPageMainBlock(a: DocxTextboxBlock, b: DocxTextboxBlock): number {\n  const relationRank = (block: DocxTextboxBlock) => (block.relativeV === \"page\" ? 0 : 1);\n  const rankDiff = relationRank(a) - relationRank(b);\n  if (rankDiff !== 0) {\n    return rankDiff;\n  }\n  const yDiff = a.y - b.y;\n  return Math.abs(yDiff) > 12 ? yDiff : a.order - b.order;\n}\n\nfunction isDocxTextboxDecorativeBlock(block: DocxTextboxBlock): boolean {\n  return block.fill !== undefined && normalizePreviewText(block.paragraphs.join(\"\")).length === 0 && block.width < 24 && block.height < 24;\n}\n\nfunction groupDocxTextboxContinuationBlocks(\n  blocks: DocxTextboxBlock[],\n  markers: DocxTextboxBlock[],\n  firstMarkerOrder: number\n): DocxTextboxBlock[][] {\n  if (markers.length === 0) {\n    return [];\n  }\n  return markers\n    .map((marker, index) => {\n      const nextMarkerOrder = markers[index + 1]?.order ?? Number.POSITIVE_INFINITY;\n      const preMarkerParagraphBlocks =\n        index === 0\n          ? blocks.filter(\n              (block) =>\n                block.relativeV !== \"page\" && block.order < firstMarkerOrder && !isDocxTextboxFirstPageFlowBlock(block)\n            )\n          : [];\n      const markerPageBlocks = blocks.filter((block) => block.order >= marker.order && block.order < nextMarkerOrder);\n      return [...preMarkerParagraphBlocks, ...markerPageBlocks]\n        .filter((block) => block.paragraphs.length > 0)\n        .sort((a, b) => a.order - b.order);\n    })\n    .filter((group) => group.length > 0);\n}\n\nfunction appendDocxTextboxContinuationPages(\n  container: HTMLElement,\n  groups: DocxTextboxBlock[][],\n  columns: DocxTextboxColumnLayout,\n  sidebarBackground?: DocxTextboxBlock\n): void {\n  for (const blocks of groups) {\n    appendDocxTextboxContinuationPage(container, blocks, columns, sidebarBackground);\n  }\n}\n\nfunction appendDocxTextboxContinuationPage(\n  container: HTMLElement,\n  contentBlocks: DocxTextboxBlock[],\n  columns: DocxTextboxColumnLayout,\n  sidebarBackground?: DocxTextboxBlock\n): void {\n  if (contentBlocks.length === 0) {\n    return;\n  }\n  const page = document.createElement(\"article\");\n  page.className = \"ofv-document ofv-docx-textbox-page\";\n  page.style.setProperty(\"--ofv-docx-textbox-page-width\", \"595pt\");\n  if (\n    sidebarBackground?.fill &&\n    renderDocxContinuationFlowFallback(page, contentBlocks, columns, sidebarBackground)\n  ) {\n    container.append(page);\n    return;\n  }\n\n  if (sidebarBackground?.fill) {\n    page.classList.add(\"ofv-docx-textbox-page-has-sidebar\");\n    page.style.setProperty(\"--ofv-docx-textbox-sidebar-bg\", `#${sidebarBackground.fill}`);\n    page.style.setProperty(\"--ofv-docx-textbox-sidebar-width\", `${formatCssNumber(inferDocxTextboxSidebarBackgroundWidth(columns))}pt`);\n  }\n\n  const sidebarFlowBottom = appendDocxTextboxFlowColumn(page, contentBlocks.filter((block) => columns.sidebar.has(block.order)), {\n    className: \"ofv-docx-textbox-page-sidebar-flow\",\n    leftPt: columns.sidebarLeft,\n    topPt: 42,\n    widthPt: columns.sidebarWidth\n  });\n  const mainFlowBottom = appendDocxTextboxFlowColumn(page, contentBlocks.filter((block) => columns.main.has(block.order)), {\n    className: \"ofv-docx-textbox-page-main-flow\",\n    leftPt: columns.mainLeft,\n    topPt: 42,\n    widthPt: columns.mainWidth\n  });\n  page.style.minHeight = `${formatCssNumber(Math.max(842, sidebarFlowBottom + 36, mainFlowBottom + 36))}pt`;\n  container.append(page);\n}\n\nfunction renderDocxContinuationFlowFallback(\n  page: HTMLElement,\n  contentBlocks: DocxTextboxBlock[],\n  columns: DocxTextboxColumnLayout,\n  sidebarBackground: DocxTextboxBlock\n): boolean {\n  const sidebarBlocks = contentBlocks\n    .filter((block) => columns.sidebar.has(block.order) && block.paragraphs.length > 0)\n    .filter((block) => !isDocxTextboxDecorativeBlock(block));\n  const mainBlocks = contentBlocks\n    .filter((block) => columns.main.has(block.order) && block.paragraphs.length > 0)\n    .filter((block) => !isDocxTextboxDecorativeBlock(block));\n  if (sidebarBlocks.length === 0 && mainBlocks.length === 0) {\n    return false;\n  }\n\n  page.classList.add(\"ofv-docx-textbox-page-flow-layout\", \"ofv-docx-textbox-continuation-flow-layout\");\n  page.style.setProperty(\"--ofv-docx-textbox-sidebar-bg\", `#${sidebarBackground.fill}`);\n  page.style.setProperty(\"--ofv-docx-textbox-sidebar-width\", `${formatCssNumber(inferDocxTextboxSidebarBackgroundWidth(columns))}pt`);\n\n  const sidebar = document.createElement(\"aside\");\n  sidebar.className = \"ofv-docx-textbox-page-flow-sidebar\";\n  const main = document.createElement(\"main\");\n  main.className = \"ofv-docx-textbox-page-flow-main\";\n\n  for (const block of mergeDocxTextboxSidebarHeadingBlocks(orderDocxTextboxFlowBlocks(sidebarBlocks))) {\n    const element = createDocxTextboxBlockElement(block);\n    element.classList.add(\"ofv-docx-textbox-flow-block\");\n    if (isStandaloneDocxTextboxHeadingBlock(block)) {\n      element.classList.add(\"ofv-docx-textbox-section-heading\");\n    }\n    sidebar.append(element);\n  }\n  for (const block of orderDocxTextboxFlowBlocks(mainBlocks)) {\n    const element = createDocxTextboxBlockElement(block);\n    element.classList.add(\"ofv-docx-textbox-flow-block\");\n    if (isStandaloneDocxTextboxHeadingBlock(block)) {\n      element.classList.add(\"ofv-docx-textbox-section-heading\");\n    }\n    main.append(element);\n  }\n\n  page.append(sidebar, main);\n  return true;\n}\n\nfunction mergeDocxTextboxSidebarHeadingBlocks(blocks: DocxTextboxBlock[]): DocxTextboxBlock[] {\n  const merged: DocxTextboxBlock[] = [];\n  for (let index = 0; index < blocks.length; index += 1) {\n    const block = blocks[index];\n    const next = blocks[index + 1];\n    if (isStandaloneDocxTextboxHeadingBlock(block) && next && !isStandaloneDocxTextboxHeadingBlock(next)) {\n      merged.push({\n        ...next,\n        order: block.order,\n        paragraphs: [block.paragraphs[0], ...next.paragraphs]\n      });\n      index += 1;\n    } else {\n      merged.push(block);\n    }\n  }\n  return merged;\n}\n\nfunction findDocxTextboxSidebarBackground(blocks: DocxTextboxBlock[]): DocxTextboxBlock | undefined {\n  return blocks\n    .filter((block) => block.paragraphs.length === 0 && block.fill && block.relativeV === \"page\" && block.x < 0 && block.width >= 120 && block.height >= 500)\n    .sort((a, b) => b.height * b.width - a.height * a.width)[0];\n}\n\nfunction inferDocxTextboxSidebarBackgroundWidth(columns: DocxTextboxColumnLayout): number {\n  const contentRight = columns.sidebarLeft + columns.sidebarWidth + 4;\n  const beforeMain = columns.mainLeft - 36;\n  return Math.max(96, Math.min(contentRight, beforeMain));\n}\n\nfunction classifyDocxTextboxColumns(\n  blocks: DocxTextboxBlock[],\n  normalizeX: (block: DocxTextboxBlock) => number\n): DocxTextboxColumnLayout {\n  const columnThreshold = inferDocxTextboxColumnThreshold(blocks);\n  const leftBlocks = blocks.filter((block) => block.x < columnThreshold);\n  const rightBlocks = blocks.filter((block) => !leftBlocks.includes(block));\n  const sidebar = new Set(leftBlocks.map((block) => block.order));\n  const main = new Set(rightBlocks.map((block) => block.order));\n  const sidebarLeft = Math.max(28, Math.min(...leftBlocks.map((block) => normalizeX(block))));\n  const mainLeft = Math.max(210, Math.min(...rightBlocks.map((block) => normalizeX(block))));\n  const sidebarWidth = Math.min(180, Math.max(120, Math.max(...leftBlocks.map((block) => block.width))));\n  const mainWidth = Math.min(380, Math.max(280, Math.max(...rightBlocks.map((block) => block.width))));\n  return { sidebar, main, sidebarLeft, mainLeft, sidebarWidth, mainWidth };\n}\n\nfunction estimateDocxTextboxColumnFlowStart(\n  pageBlocks: DocxTextboxBlock[],\n  columnOrders: Set<number>,\n  normalizeY: (block: DocxTextboxBlock) => number,\n  fallbackTop: number\n): number {\n  const sameColumnAnchors = pageBlocks.filter((block) => columnOrders.has(block.order));\n  const anchorBottom = Math.max(\n    0,\n    ...sameColumnAnchors.map((block) => normalizeY(block) + Math.max(block.height, estimateDocxTextboxBlockHeight(block)))\n  );\n  if (anchorBottom > 0) {\n    return anchorBottom + 14;\n  }\n  return fallbackTop + 18;\n}\n\nfunction inferDocxTextboxColumnThreshold(blocks: DocxTextboxBlock[]): number {\n  const xs = [...new Set(blocks.map((block) => Math.round(block.x * 10) / 10))].sort((a, b) => a - b);\n  if (xs.length < 2) {\n    return xs[0] ?? 0;\n  }\n  let splitIndex = 0;\n  let largestGap = -Infinity;\n  for (let index = 0; index < xs.length - 1; index += 1) {\n    const gap = xs[index + 1] - xs[index];\n    if (gap > largestGap) {\n      largestGap = gap;\n      splitIndex = index;\n    }\n  }\n  return (xs[splitIndex] + xs[splitIndex + 1]) / 2;\n}\n\nfunction appendDocxTextboxFlowColumn(\n  page: HTMLElement,\n  blocks: DocxTextboxBlock[],\n  options: { className: string; leftPt: number; topPt: number; widthPt: number }\n): number {\n  if (blocks.length === 0) {\n    return options.topPt;\n  }\n  const column = document.createElement(\"div\");\n  column.className = `ofv-docx-textbox-page-flow ${options.className}`;\n  column.style.left = `${formatCssNumber(options.leftPt)}pt`;\n  column.style.top = `${formatCssNumber(options.topPt)}pt`;\n  column.style.width = `${formatCssNumber(options.widthPt)}pt`;\n\n  let flowBottom = options.topPt;\n  for (const block of orderDocxTextboxFlowBlocks(blocks)) {\n    const element = createDocxTextboxBlockElement(block);\n    element.classList.add(\"ofv-docx-textbox-flow-block\");\n    column.append(element);\n    flowBottom += estimateDocxTextboxBlockHeight(block) + 10;\n  }\n  page.append(column);\n  return flowBottom;\n}\n\nfunction orderDocxTextboxFlowBlocks(blocks: DocxTextboxBlock[]): DocxTextboxBlock[] {\n  const ordered = [...blocks].sort((a, b) => a.order - b.order);\n  const result: DocxTextboxBlock[] = [];\n  for (const block of ordered) {\n    const previous = result[result.length - 1];\n    const previousPrevious = result[result.length - 2];\n    if (\n      previous &&\n      isStandaloneDocxTextboxHeadingBlock(block) &&\n      !isStandaloneDocxTextboxHeadingBlock(previous) &&\n      !isStandaloneDocxTextboxHeadingBlock(previousPrevious)\n    ) {\n      result.splice(result.length - 1, 0, block);\n    } else {\n      result.push(block);\n    }\n  }\n  return result;\n}\n\nfunction isStandaloneDocxTextboxHeadingBlock(block?: DocxTextboxBlock): boolean {\n  if (!block || block.paragraphs.length !== 1) {\n    return false;\n  }\n  return looksLikeDocxTextboxHeading(block.paragraphs[0]);\n}\n\nfunction createDocxPositionedTextboxBlockElement(block: DocxTextboxBlock): HTMLElement {\n  const section = createDocxTextboxBlockElement(block);\n  section.classList.add(\"ofv-docx-textbox-page-block\");\n  if (block.fill) {\n    section.classList.add(\"ofv-docx-textbox-page-filled-block\");\n  }\n  if (block.paragraphs.length <= 2 && !block.fill) {\n    section.classList.add(\"ofv-docx-textbox-page-title-block\");\n  }\n  return section;\n}\n\nfunction createDocxTextboxBlockElement(block: DocxTextboxBlock): HTMLElement {\n  const section = document.createElement(\"section\");\n  section.className = \"ofv-docx-textbox-block\";\n  if (block.fill) {\n    section.classList.add(\"ofv-docx-textbox-block-filled\");\n    section.style.setProperty(\"--ofv-docx-textbox-fill\", `#${block.fill}`);\n  }\n  const paragraphs = normalizeDocxTextboxParagraphOrder(block);\n  const [first, ...rest] = paragraphs;\n  if (first) {\n    const sectionKind = getDocxTextboxSectionKind(first);\n    if (sectionKind) {\n      section.classList.add(`ofv-docx-textbox-section-${sectionKind}`);\n    }\n    const heading = document.createElement(\"h3\");\n    heading.textContent = first;\n    section.append(heading);\n  }\n  const body = rest.length > 0 ? rest : [];\n  for (const paragraphText of body) {\n    const paragraph = document.createElement(\"p\");\n    paragraph.textContent = paragraphText;\n    section.append(paragraph);\n  }\n  return section;\n}\n\nfunction getDocxTextboxSectionKind(heading: string): string {\n  const text = normalizePreviewText(heading);\n  if (text.includes(\"教育背景\")) {\n    return \"education\";\n  }\n  if (text.includes(\"专业技能\")) {\n    return \"skills\";\n  }\n  if (text.includes(\"工作经历\")) {\n    return \"work\";\n  }\n  if (text.includes(\"项目经验\")) {\n    return \"projects\";\n  }\n  if (text.includes(\"自我评价\")) {\n    return \"summary\";\n  }\n  if (text.includes(\"基本信息\")) {\n    return \"profile\";\n  }\n  return \"\";\n}\n\nfunction estimateDocxTextboxBlockHeight(block: DocxTextboxBlock): number {\n  return Math.max(block.height, 18 + block.paragraphs.length * 14);\n}\n\nfunction estimateDocxTextboxFlowHeight(blocks: DocxTextboxBlock[]): number {\n  return blocks.reduce((total, block) => total + estimateDocxTextboxBlockHeight(block) + 10, 0);\n}\n\nfunction normalizeDocxTextboxParagraphOrder(block: DocxTextboxBlock): string[] {\n  if (!block.fill || block.paragraphs.length < 2) {\n    return block.paragraphs;\n  }\n  const last = block.paragraphs[block.paragraphs.length - 1];\n  if (looksLikeDocxTextboxHeading(last)) {\n    return [last, ...block.paragraphs.slice(0, -1)];\n  }\n  return block.paragraphs;\n}\n\nfunction looksLikeDocxTextboxHeading(value: string): boolean {\n  const text = normalizePreviewText(value);\n  return text.length > 0 && text.length <= 12 && !/[0-9@.:：]/.test(text);\n}\n\nasync function normalizeDocxLayout(container: HTMLElement, arrayBuffer: ArrayBuffer, styleContainer?: HTMLElement): Promise<void> {\n  const [hints, charts, svgImageAlternatives] = await Promise.all([\n    readDocxLayoutHints(arrayBuffer),\n    readDocxCharts(arrayBuffer),\n    readDocxSvgImageAlternatives(arrayBuffer)\n  ]);\n  normalizeDocxEastAsiaFontStyles(styleContainer, hints.eastAsiaFonts);\n  normalizeDocxNumberingStyles(styleContainer);\n  repairDocxSvgImageAlternatives(container, svgImageAlternatives);\n  repairUnexpectedDocxTableTextDirections(container, hints.hasVerticalTextDirection);\n  repairDocxChartPlaceholders(container, charts);\n  repairDocxComplexScriptFontSizes(container, hints.complexScriptFontSizeParagraphs);\n  const pages = container.querySelectorAll<HTMLElement>(\"section.ofv-docx\");\n  for (const page of pages) {\n    repairDocxShapeFills(page);\n    repairDocxFloatingPictures(page, hints);\n    repairDocxHeadingShapeAlignment(page);\n    repairDocxListIndentAlignment(page);\n    for (const element of page.querySelectorAll<HTMLElement>(\"[style*='line-height']\")) {\n      const atLeastLineHeight = parseDocxAtLeastLineHeight(element.style.lineHeight);\n      if (atLeastLineHeight !== undefined) {\n        const largestFontSize = getLargestDocxFontSize(element);\n        element.style.lineHeight = atLeastLineHeight <= largestFontSize * 1.2 ? \"1.2\" : `${formatCssNumber(atLeastLineHeight)}px`;\n        continue;\n      }\n      const lineHeight = parseCssLineHeight(element.style.lineHeight);\n      if (lineHeight > 0 && lineHeight < 1) {\n        element.style.lineHeight = \"1.2\";\n      }\n    }\n  }\n  repairDocxRightTabStops(container, hints.rightTabParagraphs);\n  markDocxPageNumberFields(container, hints.pageNumberFieldResults);\n}\n\nfunction normalizeDocxNumberingStyles(styleContainer: HTMLElement | undefined): void {\n  if (!styleContainer?.textContent) {\n    return;\n  }\n  styleContainer.textContent = styleContainer.textContent\n    .replace(\n      /(p\\.[\\w-]+-num-\\d+-\\d+:before\\s*\\{[\\s\\S]*?content:\\s*\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\\\\9(\";\\s*[\\s\\S]*?\\})/g,\n      \"$1\\\\00a0$2\"\n    )\n    .replace(\n      /(^|\\})\\s*(p\\.[\\w-]+-num-\\d+-\\d+\\s*\\{(?=[^}]*\\bmargin-inline-start\\s*:)[^}]*\\})/gm,\n      \"$1\\n.ofv-docx $2\"\n    );\n}\n\ntype DocxChartPreview = ChartPreview & {\n  widthPt: number;\n  heightPt: number;\n};\n\nasync function readDocxCharts(arrayBuffer: ArrayBuffer): Promise<DocxChartPreview[]> {\n  try {\n    const zip = await JSZip.loadAsync(arrayBuffer);\n    const documentXml = await zip.file(\"word/document.xml\")?.async(\"text\");\n    const documentDoc = documentXml ? parseOfficeXml(documentXml) : undefined;\n    if (!documentDoc) {\n      return [];\n    }\n    const relationships = await readOfficeRelationships(zip, \"word/document.xml\");\n    const chartDrawings = Array.from(documentDoc.getElementsByTagName(\"*\"))\n      .filter((element) => element.localName === \"inline\" || element.localName === \"anchor\")\n      .map((element) => readDocxChartDrawing(element))\n      .filter((item): item is { relationshipId: string; widthPt: number; heightPt: number } => Boolean(item?.relationshipId));\n    const charts: DocxChartPreview[] = [];\n    for (const [index, drawing] of chartDrawings.entries()) {\n      const chartRel = relationships.find((rel) => rel.id === drawing.relationshipId && /\\/chart$/i.test(rel.type));\n      const chartPath = resolveOfficeRelationshipTarget(\"word/document.xml\", chartRel?.target);\n      const chartXml = chartPath ? await zip.file(chartPath)?.async(\"text\") : undefined;\n      const chart = chartXml ? parseChartXml(chartXml, chartPath?.split(\"/\").pop() || `chart${index + 1}.xml`) : null;\n      if (chart) {\n        charts.push({ ...chart, widthPt: drawing.widthPt, heightPt: drawing.heightPt });\n      }\n    }\n    return charts;\n  } catch {\n    return [];\n  }\n}\n\nfunction readDocxChartDrawing(element: Element): { relationshipId: string; widthPt: number; heightPt: number } | undefined {\n  const chart = Array.from(element.getElementsByTagName(\"*\")).find((child) => child.localName === \"chart\");\n  const relationshipId = chart ? getXmlAttribute(chart, \"id\") : \"\";\n  if (!relationshipId) {\n    return undefined;\n  }\n  const extent = Array.from(element.children).find((child) => child.localName === \"extent\");\n  return {\n    relationshipId,\n    widthPt: emuToPt(Number(extent?.getAttribute(\"cx\") || 0)),\n    heightPt: emuToPt(Number(extent?.getAttribute(\"cy\") || 0))\n  };\n}\n\nfunction repairDocxChartPlaceholders(container: HTMLElement, charts: DocxChartPreview[]): void {\n  if (charts.length === 0) {\n    return;\n  }\n  const placeholders = Array.from(container.querySelectorAll<HTMLElement>(\"section.ofv-docx div\")).filter(isDocxChartPlaceholder);\n  if (placeholders.length !== charts.length) {\n    return;\n  }\n  placeholders.forEach((placeholder, index) => {\n    const chart = charts[index];\n    placeholder.classList.add(\"ofv-docx-chart-preview\");\n    placeholder.dataset.ofvDocxChartPreview = \"true\";\n    if (chart.widthPt > 0) {\n      placeholder.style.width ||= `${formatCssNumber(chart.widthPt)}pt`;\n    }\n    if (chart.heightPt > 0) {\n      placeholder.style.height ||= `${formatCssNumber(chart.heightPt)}pt`;\n    }\n    placeholder.replaceChildren(renderChartSvg(chart));\n  });\n}\n\nfunction isDocxChartPlaceholder(element: HTMLElement): boolean {\n  if (element.dataset.ofvDocxChartPreview === \"true\" || element.children.length > 0 || normalizePreviewText(element.textContent || \"\")) {\n    return false;\n  }\n  const display = element.style.display;\n  const position = element.style.position;\n  const width = parseCssPixelValue(element.style.width);\n  const height = parseCssPixelValue(element.style.height);\n  return display === \"inline-block\" && position === \"relative\" && width >= 120 && height >= 80;\n}\n\nfunction repairDocxHeadingShapeAlignment(page: HTMLElement): void {\n  for (const paragraph of page.querySelectorAll<HTMLElement>(\"p\")) {\n    const text = normalizePreviewText(paragraph.textContent || \"\");\n    if (!looksLikeDocxTextboxHeading(text)) {\n      continue;\n    }\n    const svg = paragraph.querySelector<SVGSVGElement>(\"svg\");\n    if (!svg) {\n      continue;\n    }\n    const width = parseCssPixelValue(svg.style.width) || parseCssPixelValue(svg.getAttribute(\"width\") || \"\");\n    const marginLeft = parseCssPixelValue(svg.style.marginLeft);\n    if (width < 300 || marginLeft < 28 || marginLeft > 44) {\n      continue;\n    }\n    const textWidth = getDocxParagraphVisibleTextWidth(paragraph);\n    svg.style.marginLeft = `${formatCssNumber(Math.max(48, marginLeft + textWidth * 0.68))}pt`;\n    svg.style.marginTop = `${formatCssNumber(parseCssPixelValue(svg.style.marginTop) - 4)}pt`;\n    normalizeDocxHeadingShapeFill(svg);\n    repairDocxHeadingTextBackground(paragraph);\n  }\n}\n\nfunction normalizeDocxHeadingShapeFill(svg: SVGSVGElement): void {\n  const headingFill = \"#3f4aa3\";\n  const fillNodes = svg.querySelectorAll<SVGElement>(\"image[fill], rect[data-ofv-docx-shape-fill]\");\n  for (const node of fillNodes) {\n    const fill = node.getAttribute(\"fill\") || \"\";\n    if (fill.toLowerCase() === \"#38449a\") {\n      node.setAttribute(\"fill\", headingFill);\n    }\n  }\n}\n\nfunction repairDocxHeadingTextBackground(paragraph: HTMLElement): void {\n  const textSpans = Array.from(paragraph.querySelectorAll<HTMLElement>(\"span\")).filter((element) =>\n    normalizePreviewText(element.textContent || \"\")\n  );\n  const lastTextSpan = textSpans.at(-1);\n  if (!lastTextSpan || !hasWhiteBackground(lastTextSpan)) {\n    return;\n  }\n  lastTextSpan.style.paddingRight = \"3pt\";\n  lastTextSpan.style.paddingTop = \"2pt\";\n  lastTextSpan.style.paddingBottom = \"2pt\";\n  lastTextSpan.style.boxDecorationBreak = \"clone\";\n}\n\nfunction hasWhiteBackground(element: HTMLElement): boolean {\n  const background = element.style.backgroundColor.replace(/\\s+/g, \"\").toLowerCase();\n  return background === \"white\" || background === \"#fff\" || background === \"#ffffff\" || background === \"rgb(255,255,255)\";\n}\n\nfunction getDocxParagraphVisibleTextWidth(paragraph: HTMLElement): number {\n  let textWidth = 0;\n  for (const element of paragraph.querySelectorAll<HTMLElement>(\"span\")) {\n    if (!normalizePreviewText(element.textContent || \"\")) {\n      continue;\n    }\n    textWidth += pxToPt(element.getBoundingClientRect().width);\n  }\n  return textWidth;\n}\n\nfunction pxToPt(value: number): number {\n  return value * 0.75;\n}\n\nfunction repairDocxListIndentAlignment(page: HTMLElement): void {\n  for (const paragraph of page.querySelectorAll<HTMLElement>(\"p[class*='ofv-docx-num-']\")) {\n    const text = normalizePreviewText(paragraph.textContent || \"\");\n    if (!isDocxNumberListContinuationParagraph(paragraph, text)) {\n      continue;\n    }\n    paragraph.style.textIndent = \"42px\";\n  }\n}\n\nfunction isDocxNumberListContinuationParagraph(paragraph: HTMLElement, text: string): boolean {\n  if (!text || /^[0-9]+[.、]/.test(text)) {\n    return false;\n  }\n  const previousText = findAdjacentDocxParagraphText(paragraph, \"previousElementSibling\");\n  const nextText = findAdjacentDocxParagraphText(paragraph, \"nextElementSibling\");\n  return previousText.includes(\"工作描述\") || /^[3-9][.、]/.test(nextText);\n}\n\nfunction findAdjacentDocxParagraphText(\n  paragraph: HTMLElement,\n  direction: \"previousElementSibling\" | \"nextElementSibling\"\n): string {\n  let sibling = paragraph[direction] as Element | null;\n  while (sibling) {\n    if (sibling instanceof HTMLElement && sibling.tagName.toLowerCase() === \"p\") {\n      const text = normalizePreviewText(sibling.textContent || \"\");\n      if (text) {\n        return text;\n      }\n    }\n    sibling = sibling[direction] as Element | null;\n  }\n  return \"\";\n}\n\ntype DocxLayoutHints = {\n  eastAsiaFonts?: {\n    fallback?: string;\n    major?: string;\n    minor?: string;\n  };\n  floatingPictures: Array<{\n    widthPt: number;\n    heightPt: number;\n    offsetXPt: number;\n    offsetYPt: number;\n    relativeFrom: string;\n    relativeToParagraph: boolean;\n    wrap: string;\n  }>;\n  rightTabParagraphs: Array<{\n    text: string;\n    positionPt: number;\n    pageBottomFrame: boolean;\n  }>;\n  pageNumberFieldResults: string[];\n  complexScriptFontSizeParagraphs: Array<{\n    text: string;\n    fontSizePt: number;\n  }>;\n  hasVerticalTextDirection: boolean;\n};\n\nasync function readDocxLayoutHints(arrayBuffer: ArrayBuffer): Promise<DocxLayoutHints> {\n  try {\n    const zip = await JSZip.loadAsync(arrayBuffer);\n    const themeEntry = Object.values(zip.files).find((entry) => !entry.dir && /^word\\/theme\\/theme\\d+\\.xml$/i.test(entry.name));\n    const footerEntries = Object.values(zip.files).filter(\n      (entry) => !entry.dir && /^word\\/footer\\d+\\.xml$/i.test(entry.name)\n    );\n    const [documentXml, stylesXml, themeXml, footerXmls] = await Promise.all([\n      zip.file(\"word/document.xml\")?.async(\"text\"),\n      zip.file(\"word/styles.xml\")?.async(\"text\"),\n      themeEntry?.async(\"text\"),\n      Promise.all(footerEntries.map((entry) => entry.async(\"text\")))\n    ]);\n    return {\n      eastAsiaFonts: extractDocxEastAsiaFonts(stylesXml || \"\", themeXml || \"\"),\n      floatingPictures: documentXml ? extractFloatingPictureHints(documentXml) : [],\n      rightTabParagraphs: documentXml ? extractDocxRightTabParagraphHints(documentXml) : [],\n      pageNumberFieldResults: footerXmls.flatMap(extractDocxPageNumberFieldResults),\n      complexScriptFontSizeParagraphs: documentXml ? extractDocxComplexScriptFontSizeHints(documentXml) : [],\n      hasVerticalTextDirection: Boolean(documentXml && /<w:textDirection\\b/.test(documentXml))\n    };\n  } catch {\n    return {\n      floatingPictures: [],\n      rightTabParagraphs: [],\n      pageNumberFieldResults: [],\n      complexScriptFontSizeParagraphs: [],\n      hasVerticalTextDirection: false\n    };\n  }\n}\n\ntype DocxSvgImageAlternative = {\n  fallbackDataUrls: string[];\n  svgDataUrl: string;\n};\n\nasync function readDocxSvgImageAlternatives(arrayBuffer: ArrayBuffer): Promise<DocxSvgImageAlternative[]> {\n  try {\n    const zip = await JSZip.loadAsync(arrayBuffer);\n    const documentXml = await zip.file(\"word/document.xml\")?.async(\"text\");\n    const documentDoc = documentXml ? parseOfficeXml(documentXml) : undefined;\n    if (!documentDoc) {\n      return [];\n    }\n    const relationships = await readOfficeRelationships(zip, \"word/document.xml\");\n    const relationshipsById = new Map(relationships.map((relationship) => [relationship.id, relationship]));\n    const alternatives: DocxSvgImageAlternative[] = [];\n\n    for (const blip of Array.from(documentDoc.getElementsByTagName(\"*\"))) {\n      if (blip.localName !== \"blip\") {\n        continue;\n      }\n      const svgBlip = Array.from(blip.getElementsByTagName(\"*\")).find((element) => element.localName === \"svgBlip\");\n      const fallbackRelationship = relationshipsById.get(getXmlAttribute(blip, \"embed\") || \"\");\n      const svgRelationship = relationshipsById.get(svgBlip ? getXmlAttribute(svgBlip, \"embed\") || \"\" : \"\");\n      const fallbackPath = resolveOfficeRelationshipTarget(\"word/document.xml\", fallbackRelationship?.target);\n      const svgPath = resolveOfficeRelationshipTarget(\"word/document.xml\", svgRelationship?.target);\n      if (!fallbackPath || !svgPath || mimeTypeFromPath(svgPath) !== \"image/svg+xml\") {\n        continue;\n      }\n      const fallbackFile = zip.file(fallbackPath);\n      const svgFile = zip.file(svgPath);\n      if (!fallbackFile || !svgFile) {\n        continue;\n      }\n      const [fallbackBase64, svgBase64] = await Promise.all([fallbackFile.async(\"base64\"), svgFile.async(\"base64\")]);\n      const fallbackMimeType = mimeTypeFromPath(fallbackPath);\n      alternatives.push({\n        fallbackDataUrls: [\n          `data:application/octet-stream;base64,${fallbackBase64}`,\n          `data:${fallbackMimeType};base64,${fallbackBase64}`\n        ],\n        svgDataUrl: `data:image/svg+xml;base64,${svgBase64}`\n      });\n    }\n    return alternatives;\n  } catch {\n    return [];\n  }\n}\n\nfunction repairDocxSvgImageAlternatives(container: HTMLElement, alternatives: DocxSvgImageAlternative[]): void {\n  if (alternatives.length === 0) {\n    return;\n  }\n  const alternativesByFallback = new Map<string, string[]>();\n  for (const alternative of alternatives) {\n    for (const fallbackDataUrl of alternative.fallbackDataUrls) {\n      const svgDataUrls = alternativesByFallback.get(fallbackDataUrl) || [];\n      svgDataUrls.push(alternative.svgDataUrl);\n      alternativesByFallback.set(fallbackDataUrl, svgDataUrls);\n    }\n  }\n  for (const image of container.querySelectorAll<HTMLImageElement>(\"img\")) {\n    const svgDataUrl = alternativesByFallback.get(image.getAttribute(\"src\") || \"\")?.shift();\n    if (svgDataUrl) {\n      image.src = svgDataUrl;\n      image.dataset.ofvDocxSvgAlternative = \"true\";\n    }\n  }\n}\n\nfunction repairUnexpectedDocxTableTextDirections(container: HTMLElement, hasVerticalTextDirection: boolean): void {\n  if (hasVerticalTextDirection) {\n    return;\n  }\n  for (const element of container.querySelectorAll<HTMLElement>(\"table, thead, tbody, tfoot, tr, th, td, table p, table span\")) {\n    if (getComputedStyle(element).writingMode !== \"horizontal-tb\") {\n      element.style.writingMode = \"horizontal-tb\";\n      element.style.textOrientation = \"mixed\";\n    }\n  }\n}\n\nfunction extractDocxComplexScriptFontSizeHints(xml: string): DocxLayoutHints[\"complexScriptFontSizeParagraphs\"] {\n  const document = parseOfficeXml(xml);\n  if (!document) {\n    return [];\n  }\n  return Array.from(document.getElementsByTagName(\"*\"))\n    .filter((element) => element.localName === \"p\")\n    .map((paragraph) => {\n      const descendants = Array.from(paragraph.getElementsByTagName(\"*\"));\n      if (descendants.some((element) => element.localName === \"sz\")) {\n        return undefined;\n      }\n      const halfPointSizes = descendants\n        .filter((element) => element.localName === \"szCs\")\n        .map((element) => Number(getXmlAttribute(element, \"val\")))\n        .filter((value) => Number.isFinite(value) && value > 0);\n      const uniqueSizes = [...new Set(halfPointSizes)];\n      const text = normalizePreviewText(\n        descendants\n          .filter((element) => element.localName === \"t\")\n          .map((element) => element.textContent || \"\")\n          .join(\"\")\n      );\n      // Word/WPS falls back to a whole-point East Asian size here; browsers otherwise inherit docx-preview's 12pt default.\n      return text && uniqueSizes.length === 1\n        ? { text, fontSizePt: Math.max(1, Math.floor(uniqueSizes[0]! / 2)) }\n        : undefined;\n    })\n    .filter((hint): hint is DocxLayoutHints[\"complexScriptFontSizeParagraphs\"][number] => Boolean(hint));\n}\n\nfunction repairDocxComplexScriptFontSizes(\n  container: HTMLElement,\n  hints: DocxLayoutHints[\"complexScriptFontSizeParagraphs\"]\n): void {\n  if (hints.length === 0) {\n    return;\n  }\n  const candidatesByText = new Map<string, HTMLParagraphElement[]>();\n  for (const paragraph of container.querySelectorAll<HTMLParagraphElement>(\"section.ofv-docx p\")) {\n    const text = normalizePreviewText(paragraph.textContent || \"\");\n    const candidates = candidatesByText.get(text) || [];\n    candidates.push(paragraph);\n    candidatesByText.set(text, candidates);\n  }\n  for (const hint of hints) {\n    const paragraph = candidatesByText.get(hint.text)?.shift();\n    if (paragraph) {\n      paragraph.style.fontSize = `${formatCssNumber(hint.fontSizePt)}pt`;\n    }\n  }\n}\n\nfunction extractDocxPageNumberFieldResults(xml: string): string[] {\n  const document = parseOfficeXml(xml);\n  if (!document) {\n    return [];\n  }\n  const results: string[] = [];\n  let inField = false;\n  let isPageField = false;\n  let afterSeparator = false;\n  let result = \"\";\n  for (const element of Array.from(document.getElementsByTagName(\"*\"))) {\n    if (element.localName === \"fldChar\") {\n      const type = getXmlAttribute(element, \"fldCharType\");\n      if (type === \"begin\") {\n        inField = true;\n        isPageField = false;\n        afterSeparator = false;\n        result = \"\";\n      } else if (inField && type === \"separate\") {\n        afterSeparator = true;\n      } else if (inField && type === \"end\") {\n        if (isPageField && afterSeparator && result.trim()) {\n          results.push(result.trim());\n        }\n        inField = false;\n      }\n      continue;\n    }\n    if (inField && element.localName === \"instrText\" && /\\bPAGE\\b/i.test(element.textContent || \"\")) {\n      isPageField = true;\n    } else if (inField && isPageField && afterSeparator && element.localName === \"t\") {\n      result += element.textContent || \"\";\n    }\n  }\n  return results;\n}\n\nfunction markDocxPageNumberFields(container: HTMLElement, fieldResults: string[]): void {\n  if (fieldResults.length === 0) {\n    return;\n  }\n  const expectedResults = new Set(fieldResults.map((value) => normalizePreviewText(value)));\n  for (const footer of container.querySelectorAll<HTMLElement>(\"section.ofv-docx footer\")) {\n    const candidates = Array.from(footer.querySelectorAll<HTMLElement>(\"span\")).filter(\n      (span) => span.children.length === 0 && expectedResults.has(normalizePreviewText(span.textContent || \"\"))\n    );\n    if (candidates.length === 1) {\n      candidates[0]?.classList.add(\"ofv-docx-page-number-field\");\n    }\n  }\n}\n\nfunction extractDocxRightTabParagraphHints(xml: string): DocxLayoutHints[\"rightTabParagraphs\"] {\n  const document = parseOfficeXml(xml);\n  if (!document) {\n    return [];\n  }\n  return Array.from(document.getElementsByTagName(\"*\"))\n    .filter((element) => element.localName === \"p\")\n    .map((paragraph) => {\n      const properties = Array.from(paragraph.children).find((child) => child.localName === \"pPr\");\n      const configuredTabs = properties\n        ? Array.from(properties.getElementsByTagName(\"*\")).filter((child) => child.localName === \"tab\")\n        : [];\n      const contentTabs = Array.from(paragraph.getElementsByTagName(\"*\")).filter(\n        (child) => child.localName === \"tab\" && !properties?.contains(child)\n      );\n      const tab = configuredTabs.length === 1 && contentTabs.length === 1 ? configuredTabs[0] : undefined;\n      const frame = properties\n        ? Array.from(properties.children).find((child) => child.localName === \"framePr\")\n        : undefined;\n      const positionTwips = Number(tab ? getXmlAttribute(tab, \"pos\") : 0);\n      const text = normalizePreviewText(\n        Array.from(paragraph.getElementsByTagName(\"*\"))\n          .filter((child) => child.localName === \"t\")\n          .map((child) => child.textContent || \"\")\n          .join(\"\")\n      );\n      return tab && getXmlAttribute(tab, \"val\") === \"right\" && positionTwips > 0 && text\n        ? {\n            text,\n            positionPt: positionTwips / 20,\n            pageBottomFrame: Boolean(frame && getXmlAttribute(frame, \"yAlign\") === \"bottom\")\n          }\n        : undefined;\n    })\n    .filter((hint): hint is DocxLayoutHints[\"rightTabParagraphs\"][number] => Boolean(hint));\n}\n\nfunction repairDocxRightTabStops(\n  container: HTMLElement,\n  hints: DocxLayoutHints[\"rightTabParagraphs\"]\n): void {\n  if (hints.length === 0) {\n    return;\n  }\n  const paragraphs = Array.from(container.querySelectorAll<HTMLParagraphElement>(\"section.ofv-docx p\")).filter(\n    (paragraph) => paragraph.querySelectorAll(\".ofv-docx-tab-stop\").length === 1\n  );\n  const candidatesByText = new Map<string, HTMLParagraphElement[]>();\n  for (const paragraph of paragraphs) {\n    const text = normalizePreviewText(paragraph.textContent || \"\");\n    const candidates = candidatesByText.get(text) || [];\n    candidates.push(paragraph);\n    candidatesByText.set(text, candidates);\n  }\n  for (const hint of hints) {\n    const paragraph = candidatesByText.get(hint.text)?.shift();\n    if (paragraph) {\n      repairDocxRightTabParagraph(paragraph, hint);\n    }\n  }\n}\n\nfunction repairDocxRightTabParagraph(\n  paragraph: HTMLParagraphElement,\n  hint: DocxLayoutHints[\"rightTabParagraphs\"][number]\n): void {\n  const tabStop = paragraph.querySelector<HTMLElement>(\".ofv-docx-tab-stop\");\n  if (!tabStop || paragraph.querySelector(\".ofv-docx-right-tab-line\")) {\n    return;\n  }\n  let tabRun: HTMLElement = tabStop;\n  while (tabRun.parentElement && tabRun.parentElement !== paragraph) {\n    tabRun = tabRun.parentElement;\n  }\n  if (tabRun.parentElement !== paragraph) {\n    return;\n  }\n  const nodes = Array.from(paragraph.childNodes);\n  const tabIndex = nodes.indexOf(tabRun);\n  const before = nodes.slice(0, tabIndex);\n  const after = nodes.slice(tabIndex + 1);\n  if (tabIndex < 0 || normalizePreviewText(after.map((node) => node.textContent || \"\").join(\"\")) === \"\") {\n    return;\n  }\n\n  const line = document.createElement(\"span\");\n  line.className = \"ofv-docx-right-tab-line\";\n  line.style.setProperty(\"--ofv-docx-right-tab-position\", `${formatCssNumber(hint.positionPt)}pt`);\n  const start = document.createElement(\"span\");\n  start.className = \"ofv-docx-right-tab-start\";\n  start.append(...before);\n  const end = document.createElement(\"span\");\n  end.className = \"ofv-docx-right-tab-end\";\n  end.append(...after);\n  line.append(start, end);\n  tabRun.classList.add(\"ofv-docx-right-tab-source\");\n  if (hint.pageBottomFrame) {\n    paragraph.classList.add(\"ofv-docx-page-bottom-frame\");\n  }\n  paragraph.replaceChildren(line, tabRun);\n}\n\nfunction extractDocxEastAsiaFonts(stylesXml: string, themeXml: string): DocxLayoutHints[\"eastAsiaFonts\"] {\n  const defaults = /<w:docDefaults\\b[\\s\\S]*?<\\/w:docDefaults>/.exec(stylesXml)?.[0] || \"\";\n  const directFont = /<w:rFonts\\b[^>]*\\bw:eastAsia=\"([^\"]+)\"/.exec(defaults)?.[1];\n  const themeName = /<w:rFonts\\b[^>]*\\bw:eastAsiaTheme=\"([^\"]+)\"/.exec(defaults)?.[1] || \"minorEastAsia\";\n  const major = extractDocxThemeEastAsiaFont(themeXml, \"major\");\n  const minor = extractDocxThemeEastAsiaFont(themeXml, \"minor\");\n  const direct = directFont ? decodeXml(directFont).trim() || undefined : undefined;\n  return {\n    fallback: direct || (/^major/i.test(themeName) ? major : minor) || minor || major,\n    major,\n    minor\n  };\n}\n\nfunction extractDocxThemeEastAsiaFont(themeXml: string, kind: \"major\" | \"minor\"): string | undefined {\n  const block = new RegExp(`<a:${kind}Font\\\\b[\\\\s\\\\S]*?<\\\\/a:${kind}Font>`, \"i\").exec(themeXml)?.[0] || \"\";\n  const eastAsia = /<a:ea\\b[^>]*\\btypeface=\"([^\"]+)\"/i.exec(block)?.[1];\n  const scriptFont = /<a:font\\b[^>]*\\bscript=\"Hans\"[^>]*\\btypeface=\"([^\"]+)\"/i.exec(block)?.[1];\n  const font = eastAsia || scriptFont;\n  return font ? decodeXml(font).trim() || undefined : undefined;\n}\n\nfunction normalizeDocxEastAsiaFontStyles(\n  styleContainer: HTMLElement | undefined,\n  fonts: DocxLayoutHints[\"eastAsiaFonts\"]\n): void {\n  if (!styleContainer?.textContent || !fonts?.fallback) {\n    return;\n  }\n  const safeFallback = sanitizeDocxCssFontFamily(fonts.fallback);\n  if (!safeFallback) {\n    return;\n  }\n  const variable = \"--ofv-docx-east-asia-font\";\n  const css = styleContainer.textContent.replace(/font-family:\\s*([^;{}]+);/gi, (declaration, families: string) => {\n    if (families.includes(variable)) {\n      return declaration;\n    }\n    return `font-family: ${families.trim()}, var(${variable});`;\n  });\n  const declarations = [\n    `${variable}: \"${safeFallback}\";`,\n    `--docx-majorEastAsia-font: \"${sanitizeDocxCssFontFamily(fonts.major) || safeFallback}\";`,\n    `--docx-minorEastAsia-font: \"${sanitizeDocxCssFontFamily(fonts.minor) || safeFallback}\";`\n  ];\n  styleContainer.textContent = `${css}\\n.ofv-docx-wrapper { ${declarations.join(\" \")} }\\n`;\n}\n\nfunction sanitizeDocxCssFontFamily(fontFamily: string | undefined): string {\n  return fontFamily?.replace(/[\"'\\\\,;{}()]/g, \"\").trim() || \"\";\n}\n\nfunction extractFloatingPictureHints(xml: string): DocxLayoutHints[\"floatingPictures\"] {\n  return [...xml.matchAll(/<wp:anchor\\b[\\s\\S]*?<\\/wp:anchor>/g)]\n    .filter((match) => /<a:graphicData\\b[^>]*uri=\"http:\\/\\/schemas\\.openxmlformats\\.org\\/drawingml\\/2006\\/picture\"/.test(match[0]))\n    .map((match) => {\n      const anchor = match[0];\n      const extent = /<wp:extent\\b[^>]*\\bcx=\"(\\d+)\"[^>]*\\bcy=\"(\\d+)\"/.exec(anchor);\n      const offsetX = /<wp:positionH\\b[^>]*\\brelativeFrom=\"([^\"]+)\"[\\s\\S]*?<wp:posOffset>(-?\\d+)<\\/wp:posOffset>/.exec(anchor);\n      const offsetY = /<wp:positionV\\b[^>]*\\brelativeFrom=\"([^\"]+)\"[\\s\\S]*?<wp:posOffset>(-?\\d+)<\\/wp:posOffset>/.exec(anchor);\n      return {\n        widthPt: emuToPt(Number(extent?.[1] || 0)),\n        heightPt: emuToPt(Number(extent?.[2] || 0)),\n        offsetXPt: emuToPt(Number(offsetX?.[2] || 0)),\n        offsetYPt: emuToPt(Number(offsetY?.[2] || 0)),\n        relativeFrom: offsetX?.[1] || \"\",\n        relativeToParagraph: offsetY?.[1] === \"paragraph\",\n        wrap: /<wp:wrapSquare\\b/.test(anchor) ? \"square\" : /<wp:wrapNone\\b/.test(anchor) ? \"none\" : \"\"\n      };\n    })\n    .filter((hint) => hint.widthPt > 0 && hint.heightPt > 0);\n}\n\nfunction emuToPt(value: number): number {\n  return value / 12700;\n}\n\nfunction repairDocxShapeFills(page: HTMLElement): void {\n  for (const svg of page.querySelectorAll<SVGSVGElement>(\"svg\")) {\n    const image = svg.querySelector<SVGElement>(\"image[fill]\");\n    if (!image) {\n      continue;\n    }\n    const fill = image.getAttribute(\"fill\");\n    if (!fill || svg.querySelector(\"rect[data-ofv-docx-shape-fill]\")) {\n      continue;\n    }\n    const rect = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n    rect.setAttribute(\"data-ofv-docx-shape-fill\", \"true\");\n    rect.setAttribute(\"x\", \"0\");\n    rect.setAttribute(\"y\", \"0\");\n    rect.setAttribute(\"width\", \"100%\");\n    rect.setAttribute(\"height\", \"100%\");\n    rect.setAttribute(\"fill\", fill);\n    const stroke = image.getAttribute(\"stroke\");\n    if (stroke && stroke !== \"null\") {\n      rect.setAttribute(\"stroke\", stroke);\n      rect.setAttribute(\"stroke-width\", image.getAttribute(\"stroke-width\") || \"1\");\n    }\n    svg.insertBefore(rect, svg.firstChild);\n  }\n}\n\nfunction repairDocxFloatingPictures(page: HTMLElement, hints: DocxLayoutHints): void {\n  const pageHints = hints.floatingPictures.filter((item) => item.relativeFrom === \"column\" && item.wrap === \"square\");\n  if (pageHints.length === 0) {\n    return;\n  }\n  const images = Array.from(page.querySelectorAll<HTMLImageElement>(\"img\")).filter(\n    (image) => image.closest<HTMLElement>(\"[data-ofv-docx-float-repaired='true']\") === null\n  );\n  if (images.length === 0 || images.length !== pageHints.length) {\n    return;\n  }\n  images.forEach((image, index) => repairDocxFloatingPicture(page, image, pageHints[index]));\n}\n\nfunction repairDocxFloatingPicture(page: HTMLElement, image: HTMLImageElement, hint: DocxLayoutHints[\"floatingPictures\"][number]): void {\n  const wrapper = image.parentElement as HTMLElement | null;\n  if (!wrapper || wrapper.dataset.ofvDocxFloatRepaired === \"true\") {\n    return;\n  }\n  const pageWidth = parseCssPixelValue(page.style.width) || page.getBoundingClientRect().width;\n  const pagePaddingRight = parseCssPixelValue(page.style.paddingRight || page.style.padding) || 0;\n  const width = hint.widthPt;\n  const left = Math.max(0, Math.min(pageWidth - pagePaddingRight - width, hint.offsetXPt));\n  const paragraph = wrapper.closest<HTMLElement>(\"p\");\n  const paragraphTop = paragraph ? getElementTopInPt(paragraph, page) : getPagePaddingTopInPt(page);\n  const top = hint.relativeToParagraph ? paragraphTop + hint.offsetYPt : hint.offsetYPt;\n  wrapper.dataset.ofvDocxFloatRepaired = \"true\";\n  wrapper.style.position = \"absolute\";\n  wrapper.style.float = \"none\";\n  wrapper.style.left = `${formatCssNumber(left)}pt`;\n  wrapper.style.top = `${formatCssNumber(Math.max(0, top))}pt`;\n  wrapper.style.width = `${formatCssNumber(width)}pt`;\n  wrapper.style.height = `${formatCssNumber(hint.heightPt)}pt`;\n  wrapper.style.zIndex = \"1\";\n  image.style.width = \"100%\";\n  image.style.height = \"100%\";\n  image.style.objectFit = \"cover\";\n}\n\nfunction getElementTopInPt(element: HTMLElement, page: HTMLElement): number {\n  const pageRect = page.getBoundingClientRect();\n  const elementRect = element.getBoundingClientRect();\n  const pageWidthPt = parseCssPixelValue(page.style.width) || 595.3;\n  const pxPerPt = pageRect.width > 0 && pageWidthPt > 0 ? pageRect.width / pageWidthPt : 4 / 3;\n  return (elementRect.top - pageRect.top) / pxPerPt;\n}\n\nfunction getPagePaddingTopInPt(page: HTMLElement): number {\n  return parseCssPixelValue(page.style.paddingTop || page.style.padding) || 0;\n}\n\nfunction parseCssLineHeight(value: string): number {\n  const trimmed = value.trim();\n  if (!trimmed || trimmed === \"normal\") {\n    return 0;\n  }\n  if (trimmed.endsWith(\"%\")) {\n    const parsedPercent = Number.parseFloat(trimmed);\n    return Number.isFinite(parsedPercent) ? parsedPercent / 100 : 0;\n  }\n  const parsed = Number.parseFloat(trimmed);\n  return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction parseDocxAtLeastLineHeight(value: string): number | undefined {\n  const match = /^calc\\(\\s*100%\\s*\\+\\s*(-?\\d+(?:\\.\\d+)?)\\s*(px|pt)\\s*\\)$/i.exec(value.trim());\n  if (!match) {\n    return undefined;\n  }\n  const amount = Number.parseFloat(match[1] || \"\");\n  if (!Number.isFinite(amount) || amount < 0) {\n    return undefined;\n  }\n  return match[2]?.toLowerCase() === \"pt\" ? amount * (4 / 3) : amount;\n}\n\nfunction getLargestDocxFontSize(element: HTMLElement): number {\n  let largest = 0;\n  const view = element.ownerDocument.defaultView;\n  for (const child of [element, ...element.querySelectorAll<HTMLElement>(\"*\")]) {\n    largest = Math.max(largest, parseCssLengthInPixels(child.style.fontSize));\n    if (view) {\n      largest = Math.max(largest, parseCssLengthInPixels(view.getComputedStyle(child).fontSize));\n    }\n  }\n  return largest || 16;\n}\n\nfunction parseCssLengthInPixels(value: string): number {\n  const match = /^(-?\\d+(?:\\.\\d+)?)\\s*(px|pt)?$/i.exec(value.trim());\n  if (!match) {\n    return 0;\n  }\n  const amount = Number.parseFloat(match[1] || \"\");\n  if (!Number.isFinite(amount)) {\n    return 0;\n  }\n  return match[2]?.toLowerCase() === \"pt\" ? amount * (4 / 3) : amount;\n}\n\nfunction paginateDocxFlow(container: HTMLElement): void {\n  const wrapper = container.querySelector<HTMLElement>(\".ofv-docx-wrapper\");\n  if (!wrapper) {\n    return;\n  }\n\n  const sourcePages = Array.from(wrapper.querySelectorAll<HTMLElement>(\":scope > section.ofv-docx\"));\n  for (const sourcePage of sourcePages) {\n    paginateDocxPage(sourcePage);\n  }\n  updateDocxContinuationPageNumbers(wrapper);\n}\n\nfunction updateDocxContinuationPageNumbers(wrapper: HTMLElement): void {\n  let currentPageNumber: number | undefined;\n  for (const page of wrapper.querySelectorAll<HTMLElement>(\":scope > section.ofv-docx\")) {\n    const field = page.querySelector<HTMLElement>(\"footer .ofv-docx-page-number-field\");\n    const renderedPageNumber = Number.parseInt(normalizePreviewText(field?.textContent || \"\"), 10);\n    if (!field || !Number.isFinite(renderedPageNumber)) {\n      currentPageNumber = undefined;\n      continue;\n    }\n    if (page.dataset.ofvDocxFlowContinuation === \"true\" && currentPageNumber !== undefined) {\n      currentPageNumber += 1;\n      field.textContent = String(currentPageNumber);\n    } else {\n      currentPageNumber = renderedPageNumber;\n    }\n  }\n}\n\nfunction paginateDocxPage(sourcePage: HTMLElement): void {\n  const flowRoot = Array.from(sourcePage.children).find(\n    (child): child is HTMLElement => child instanceof HTMLElement && child.tagName === \"ARTICLE\"\n  );\n  const nominalHeight = parseCssLengthInPixels(sourcePage.style.height || sourcePage.style.minHeight);\n  if (!flowRoot || nominalHeight <= 0) {\n    return;\n  }\n\n  const allBlocks = Array.from(flowRoot.children);\n  const bottomFrames = allBlocks.filter(\n    (block): block is HTMLElement => block instanceof HTMLElement && block.classList.contains(\"ofv-docx-page-bottom-frame\")\n  );\n  const blocks = allBlocks.filter((block) => !bottomFrames.includes(block as HTMLElement));\n  if (blocks.length < 2) {\n    attachDocxPageBottomFrames(sourcePage, bottomFrames);\n    return;\n  }\n  const lastBlock = blocks.at(-1);\n  if (!(lastBlock instanceof HTMLElement) || !docxBlockExceedsPage(lastBlock, sourcePage, nominalHeight)) {\n    attachDocxPageBottomFrames(sourcePage, bottomFrames);\n    return;\n  }\n\n  flowRoot.replaceChildren();\n  let page = sourcePage;\n  let pageFlow = flowRoot;\n  let continuationCount = 0;\n\n  for (const block of blocks) {\n    pageFlow.append(block);\n    if (!(block instanceof HTMLElement)) {\n      continue;\n    }\n\n    let overflowBlock = block;\n    while (docxBlockExceedsPage(overflowBlock, page, nominalHeight) && continuationCount < 100) {\n      if (docxBlockIsVisuallyEmpty(overflowBlock)) {\n        overflowBlock.remove();\n        break;\n      }\n      const splitContinuation = splitDocxFlowBlockToFit(overflowBlock, page, nominalHeight);\n      if (!splitContinuation && pageFlow.children.length <= 1) {\n        break;\n      }\n      if (!splitContinuation) {\n        overflowBlock.remove();\n      }\n      const continuation = createDocxContinuationPage(sourcePage, flowRoot);\n      page.after(continuation.page);\n      page = continuation.page;\n      pageFlow = continuation.flowRoot;\n      overflowBlock = splitContinuation || overflowBlock;\n      pageFlow.append(overflowBlock);\n      continuationCount += 1;\n    }\n  }\n  attachDocxPageBottomFrames(page, bottomFrames);\n}\n\nfunction attachDocxPageBottomFrames(page: HTMLElement, frames: HTMLElement[]): void {\n  for (const frame of frames) {\n    frame.style.left = page.style.paddingLeft || \"0px\";\n    frame.style.right = page.style.paddingRight || \"0px\";\n    frame.style.bottom = page.style.paddingBottom || \"0px\";\n    page.append(frame);\n  }\n}\n\nfunction splitDocxFlowBlockToFit(block: HTMLElement, page: HTMLElement, nominalHeight: number): HTMLElement | undefined {\n  if (block instanceof HTMLTableElement) {\n    return splitDocxTableToFit(block, page, nominalHeight);\n  }\n  return splitDocxParagraphToFit(block, page, nominalHeight);\n}\n\nfunction splitDocxTableToFit(table: HTMLTableElement, page: HTMLElement, nominalHeight: number): HTMLTableElement | undefined {\n  const rows = Array.from(table.rows);\n  if (rows.length < 2) {\n    return undefined;\n  }\n\n  const pageBottom = docxPageContentBottom(page, nominalHeight);\n  let splitIndex = 0;\n  for (let index = 1; index < rows.length; index += 1) {\n    if (rows[index - 1]!.getBoundingClientRect().bottom > pageBottom) {\n      break;\n    }\n    if (!docxTableBoundaryCrossesRowSpan(rows, index)) {\n      splitIndex = index;\n    }\n  }\n  if (splitIndex <= 0 || splitIndex >= rows.length) {\n    return undefined;\n  }\n\n  const continuation = table.cloneNode(false) as HTMLTableElement;\n  continuation.dataset.ofvDocxTableContinuation = \"true\";\n  continuation.removeAttribute(\"id\");\n  const sectionClones = new Map<HTMLElement, HTMLElement>();\n  for (const child of Array.from(table.children)) {\n    if (child instanceof HTMLTableRowElement || /^(THEAD|TBODY|TFOOT)$/.test(child.tagName)) {\n      continue;\n    }\n    continuation.append(child.cloneNode(true));\n  }\n  continuation.querySelectorAll<HTMLElement>(\"[id]\").forEach((element) => element.removeAttribute(\"id\"));\n\n  for (const row of rows.slice(splitIndex)) {\n    const parent = row.parentElement;\n    if (parent && parent !== table && /^(THEAD|TBODY|TFOOT)$/.test(parent.tagName)) {\n      let section = sectionClones.get(parent);\n      if (!section) {\n        section = parent.cloneNode(false) as HTMLElement;\n        section.removeAttribute(\"id\");\n        sectionClones.set(parent, section);\n        continuation.append(section);\n      }\n      section.append(row);\n    } else {\n      continuation.append(row);\n    }\n  }\n  return continuation;\n}\n\nfunction docxTableBoundaryCrossesRowSpan(rows: HTMLTableRowElement[], splitIndex: number): boolean {\n  return rows.slice(0, splitIndex).some((row, rowIndex) =>\n    Array.from(row.cells).some((cell) => cell.rowSpan > 1 && rowIndex + cell.rowSpan > splitIndex)\n  );\n}\n\nfunction docxBlockIsVisuallyEmpty(block: HTMLElement): boolean {\n  return !block.textContent?.trim() && !block.querySelector(\"br, hr, img, svg, canvas, video, table\");\n}\n\nfunction splitDocxParagraphToFit(paragraph: HTMLElement, page: HTMLElement, nominalHeight: number): HTMLElement | undefined {\n  if (paragraph.tagName !== \"P\" || paragraph.querySelector(\"img, svg, canvas, video, table\")) {\n    return undefined;\n  }\n  const textLength = paragraph.textContent?.length || 0;\n  if (textLength < 2 || !paragraph.parentNode) {\n    return undefined;\n  }\n\n  let low = 1;\n  let high = textLength - 1;\n  let best = 0;\n  while (low <= high) {\n    const middle = Math.floor((low + high) / 2);\n    const candidate = cloneDocxTextRange(paragraph, 0, middle);\n    paragraph.replaceWith(candidate);\n    const fits = !docxBlockExceedsPage(candidate, page, nominalHeight);\n    candidate.replaceWith(paragraph);\n    if (fits) {\n      best = middle;\n      low = middle + 1;\n    } else {\n      high = middle - 1;\n    }\n  }\n\n  best = avoidSplittingUnicodePair(paragraph.textContent || \"\", best);\n  if (best <= 0 || best >= textLength) {\n    return undefined;\n  }\n\n  const prefix = cloneDocxTextRange(paragraph, 0, best);\n  const continuation = cloneDocxTextRange(paragraph, best, textLength);\n  prefix.style.marginBottom = \"0px\";\n  continuation.style.marginTop = \"0px\";\n  continuation.style.textIndent = \"0px\";\n  continuation.dataset.ofvDocxParagraphContinuation = \"true\";\n  for (const className of Array.from(continuation.classList)) {\n    if (/-num-\\d+-\\d+$/.test(className)) {\n      continuation.classList.remove(className);\n    }\n  }\n  continuation.removeAttribute(\"id\");\n  continuation.querySelectorAll<HTMLElement>(\"[id]\").forEach((element) => element.removeAttribute(\"id\"));\n  paragraph.replaceWith(prefix);\n  return continuation;\n}\n\nfunction cloneDocxTextRange(source: HTMLElement, start: number, end: number): HTMLElement {\n  const clone = source.cloneNode(true) as HTMLElement;\n  const walker = clone.ownerDocument.createTreeWalker(clone, NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT);\n  const nodes: Node[] = [];\n  let current = walker.nextNode();\n  while (current) {\n    nodes.push(current);\n    current = walker.nextNode();\n  }\n\n  let offset = 0;\n  for (const node of nodes) {\n    if (node.nodeType === Node.TEXT_NODE) {\n      const textNode = node as Text;\n      const value = textNode.data;\n      const nodeStart = offset;\n      const nodeEnd = nodeStart + value.length;\n      const sliceStart = Math.max(0, start - nodeStart);\n      const sliceEnd = Math.min(value.length, end - nodeStart);\n      textNode.data = sliceStart < sliceEnd ? value.slice(sliceStart, sliceEnd) : \"\";\n      offset = nodeEnd;\n      continue;\n    }\n    if (node instanceof HTMLElement && node.tagName === \"BR\" && (offset < start || offset >= end)) {\n      node.remove();\n    }\n  }\n  return clone;\n}\n\nfunction avoidSplittingUnicodePair(value: string, index: number): number {\n  if (index > 0 && index < value.length) {\n    const previous = value.charCodeAt(index - 1);\n    const next = value.charCodeAt(index);\n    if (previous >= 0xd800 && previous <= 0xdbff && next >= 0xdc00 && next <= 0xdfff) {\n      return index - 1;\n    }\n  }\n  return index;\n}\n\nfunction createDocxContinuationPage(sourcePage: HTMLElement, sourceFlowRoot: HTMLElement): {\n  page: HTMLElement;\n  flowRoot: HTMLElement;\n} {\n  const page = sourcePage.cloneNode(false) as HTMLElement;\n  page.dataset.ofvDocxFlowContinuation = \"true\";\n  let flowRoot: HTMLElement | undefined;\n  for (const child of Array.from(sourcePage.children)) {\n    if (child === sourceFlowRoot) {\n      flowRoot = child.cloneNode(false) as HTMLElement;\n      page.append(flowRoot);\n    } else {\n      page.append(child.cloneNode(true));\n    }\n  }\n  if (!flowRoot) {\n    flowRoot = sourceFlowRoot.cloneNode(false) as HTMLElement;\n    page.append(flowRoot);\n  }\n  return { page, flowRoot };\n}\n\nfunction docxBlockExceedsPage(block: HTMLElement, page: HTMLElement, nominalHeight: number): boolean {\n  const blockBottom = block.getBoundingClientRect().bottom;\n  return blockBottom > docxPageContentBottom(page, nominalHeight);\n}\n\nfunction docxPageContentBottom(page: HTMLElement, nominalHeight: number): number {\n  const pageTop = page.getBoundingClientRect().top;\n  const paddingBottom = parseCssLengthInPixels(page.style.paddingBottom) || parseDocxPaddingBottom(page.style.padding);\n  return pageTop + nominalHeight - paddingBottom + 1;\n}\n\nfunction parseDocxPaddingBottom(value: string): number {\n  const parts = value.trim().split(/\\s+/);\n  if (parts.length === 0) {\n    return 0;\n  }\n  const bottom = parts.length === 1 ? parts[0] : parts.length === 2 || parts.length === 3 ? parts[0] : parts[2];\n  return parseCssLengthInPixels(bottom || \"\");\n}\n\nfunction fitDocxPages(container: HTMLElement, fit: PreviewFit): () => void {\n  const wrapper = container.querySelector<HTMLElement>(\".ofv-docx-wrapper\");\n  if (!wrapper) {\n    return () => undefined;\n  }\n  const panel = container.closest<HTMLElement>(\".ofv-office\");\n\n  const update = () => {\n    const frames = ensureDocxPageFrames(wrapper);\n    if (frames.length === 0) {\n      wrapper.style.removeProperty(\"--ofv-docx-scale\");\n      return;\n    }\n\n    const availableWidth = Math.max(1, container.clientWidth - 48);\n    const availableHeight = getDocxFitAvailableHeight(container);\n    const pageWidth = Math.max(\n      1,\n      ...frames.map(({ page }) => {\n        const rectWidth = page.getBoundingClientRect().width;\n        return page.offsetWidth || rectWidth || parseCssPixelValue(page.style.width) || 794;\n      })\n    );\n    const pageHeight = Math.max(\n      1,\n      ...frames.map(({ page }) => page.offsetHeight || page.getBoundingClientRect().height || parseCssPixelValue(page.style.height) || 1123)\n    );\n    const scale = getDocxFitScale(fit, availableWidth, availableHeight, pageWidth, pageHeight);\n    const userZoom = parseCssPixelValue(panel?.style.getPropertyValue(\"--ofv-office-zoom\") || \"1\") || 1;\n    wrapper.style.setProperty(\"--ofv-docx-scale\", formatCssNumber(scale));\n    wrapper.style.setProperty(\"--ofv-docx-page-width\", `${pageWidth}px`);\n    wrapper.style.width = `${Math.ceil(pageWidth * scale * userZoom + 48)}px`;\n    wrapper.style.maxWidth = \"none\";\n    wrapper.style.overflow = \"visible\";\n\n    for (const { frame, page } of frames) {\n      const framePageHeight = page.offsetHeight || page.getBoundingClientRect().height || parseCssPixelValue(page.style.height);\n      const framePageWidth = page.offsetWidth || page.getBoundingClientRect().width || parseCssPixelValue(page.style.width) || pageWidth;\n      frame.style.width = `${Math.ceil(framePageWidth * scale * userZoom)}px`;\n      frame.style.maxWidth = \"none\";\n      if (framePageHeight > 0) {\n        frame.style.height = `${Math.ceil(framePageHeight * scale * userZoom)}px`;\n      }\n    }\n  };\n\n  update();\n  const timers = [0, 80, 240].map((delay) => window.setTimeout(update, delay));\n\n  if (typeof ResizeObserver === \"undefined\") {\n    window.addEventListener(\"resize\", update);\n    panel?.addEventListener(\"ofv-office-zoom\", update);\n    return () => {\n      timers.forEach((timer) => window.clearTimeout(timer));\n      window.removeEventListener(\"resize\", update);\n      panel?.removeEventListener(\"ofv-office-zoom\", update);\n    };\n  }\n\n  const observer = new ResizeObserver(update);\n  observer.observe(container);\n  observer.observe(wrapper);\n  panel?.addEventListener(\"ofv-office-zoom\", update);\n  return () => {\n    timers.forEach((timer) => window.clearTimeout(timer));\n    panel?.removeEventListener(\"ofv-office-zoom\", update);\n    observer.disconnect();\n  };\n}\n\nfunction getDocxFitAvailableHeight(container: HTMLElement): number | undefined {\n  const viewport = container.closest<HTMLElement>(\".ofv-viewport\");\n  const panel = container.closest<HTMLElement>(\".ofv-panel\");\n  let fittingHeight = container.clientHeight;\n\n  if (viewport && viewport.clientHeight > 0) {\n    const panelStyle = panel ? getComputedStyle(panel) : undefined;\n    const panelPadding =\n      parseCssPixelValue(panelStyle?.paddingTop || \"\") + parseCssPixelValue(panelStyle?.paddingBottom || \"\");\n    fittingHeight = viewport.clientHeight - panelPadding;\n  }\n\n  return fittingHeight > 0 ? Math.max(1, fittingHeight - 48) : undefined;\n}\n\nfunction getDocxFitScale(\n  fit: PreviewFit,\n  availableWidth: number,\n  availableHeight: number | undefined,\n  pageWidth: number,\n  pageHeight: number\n): number {\n  const widthScale = availableWidth / pageWidth;\n  const heightScale = availableHeight ? availableHeight / pageHeight : undefined;\n  if (fit === \"actual\") {\n    return 1;\n  }\n  if (fit === \"height\") {\n    return Math.max(0.1, heightScale ?? widthScale);\n  }\n  if (fit === \"cover\") {\n    return Math.max(0.1, Math.max(widthScale, heightScale ?? widthScale));\n  }\n  if (fit === \"scale-down\") {\n    return Math.min(1, Math.max(0.1, Math.min(widthScale, heightScale ?? widthScale)));\n  }\n  if (fit === \"contain\") {\n    return Math.max(0.1, Math.min(widthScale, heightScale ?? widthScale));\n  }\n  return Math.max(0.1, widthScale);\n}\n\nfunction ensureDocxPageFrames(wrapper: HTMLElement): Array<{ frame: HTMLElement; page: HTMLElement }> {\n  const pages = Array.from(wrapper.querySelectorAll<HTMLElement>(\"section.ofv-docx\"));\n  return pages.map((page) => {\n    const parent = page.parentElement;\n    if (parent?.classList.contains(\"ofv-docx-page-frame\")) {\n      return { frame: parent, page };\n    }\n    const frame = document.createElement(\"div\");\n    frame.className = \"ofv-docx-page-frame\";\n    page.before(frame);\n    frame.append(page);\n    return { frame, page };\n  });\n}\n\nfunction parseCssPixelValue(value: string): number {\n  const parsed = Number.parseFloat(value);\n  return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction formatCssNumber(value: number): string {\n  return Number.isFinite(value) ? value.toFixed(4).replace(/0+$/, \"\").replace(/\\.$/, \"\") : \"1\";\n}\n\nfunction normalizePreviewText(value: string): string {\n  return value.replace(/\\s+/g, \"\").trim();\n}\n\nasync function renderDocxTextFallback(container: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n  const article = document.createElement(\"article\");\n  article.className = \"ofv-document\";\n\n  try {\n    const paragraphs = dedupeParagraphs(await extractDocxReadableParagraphs(arrayBuffer));\n    if (paragraphs.length > 0) {\n      for (const paragraphText of paragraphs) {\n        const paragraph = document.createElement(\"p\");\n        paragraph.textContent = paragraphText;\n        article.append(paragraph);\n      }\n    } else {\n      const empty = document.createElement(\"p\");\n      empty.textContent = \"DOCX 内容解析失败，未提取到可展示文本。\";\n      article.append(empty);\n    }\n  } catch {\n    const empty = document.createElement(\"p\");\n    empty.textContent = \"DOCX 内容解析失败，文件可能已损坏或不是有效的 DOCX。\";\n    article.append(empty);\n  }\n\n  container.append(article);\n}\n\nasync function extractDocxParagraphs(arrayBuffer: ArrayBuffer): Promise<string[]> {\n  const zip = await JSZip.loadAsync(arrayBuffer);\n  const documentXml = await zip.file(\"word/document.xml\")?.async(\"text\");\n  return documentXml ? extractWordParagraphs(documentXml) : [];\n}\n\nasync function extractDocxReadableParagraphs(arrayBuffer: ArrayBuffer): Promise<string[]> {\n  const zip = await JSZip.loadAsync(arrayBuffer);\n  const documentXml = await zip.file(\"word/document.xml\")?.async(\"text\");\n  if (!documentXml) {\n    return [];\n  }\n  const textboxParagraphs = extractWordTextboxParagraphs(documentXml);\n  const documentParagraphs = extractWordParagraphs(documentXml);\n  if (textboxParagraphs.length === 0) {\n    return documentParagraphs;\n  }\n  const uniqueTextboxParagraphs = dedupeParagraphs(textboxParagraphs);\n  const textboxTextLength = normalizePreviewText(uniqueTextboxParagraphs.join(\"\")).length;\n  const documentTextLength = normalizePreviewText(documentParagraphs.join(\"\")).length;\n  if (documentTextLength > textboxTextLength * 1.5) {\n    const filteredDocumentParagraphs = filterCombinedTextboxParagraphs(documentParagraphs, uniqueTextboxParagraphs);\n    return filteredDocumentParagraphs.length > 0\n      ? [...filteredDocumentParagraphs, ...uniqueTextboxParagraphs]\n      : uniqueTextboxParagraphs;\n  }\n  return uniqueTextboxParagraphs;\n}\n\nasync function renderDocxWithMammoth(container: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n  const mammoth = await import(\"mammoth\");\n  const result = await mammoth.convertToHtml(\n    { arrayBuffer },\n    {\n      convertImage: mammoth.images.imgElement(async (image) => ({\n        src: `data:${image.contentType};base64,${await image.read(\"base64\")}`\n      }))\n    }\n  );\n  const content = document.createElement(\"article\");\n  content.className = \"ofv-document\";\n  content.innerHTML = sanitizeHtml(result.value || \"<p>未解析到可展示内容。</p>\");\n  container.append(content);\n\n  if (result.messages.length > 0) {\n    const notes = document.createElement(\"details\");\n    notes.className = \"ofv-details\";\n    hideSupplementalInfo(notes);\n    const summary = document.createElement(\"summary\");\n    summary.textContent = `解析提示 ${result.messages.length}`;\n    const list = document.createElement(\"ul\");\n    for (const message of result.messages) {\n      const item = document.createElement(\"li\");\n      item.textContent = message.message;\n      list.append(item);\n    }\n    notes.append(summary, list);\n    container.append(notes);\n  }\n}\n\nasync function renderOdt(panel: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n  const zip = await JSZip.loadAsync(arrayBuffer);\n  const content = zip.file(\"content.xml\");\n  if (!content) {\n    renderPlainDocument(panel, \"ODT 文档\", \"未找到 content.xml。\");\n    return;\n  }\n  renderOpenDocumentXml(panel, \"ODT 文档\", await content.async(\"text\"));\n}\n\nfunction renderOpenDocumentXml(panel: HTMLElement, title: string, xml: string): void {\n  const section = createSection(title);\n  const article = document.createElement(\"article\");\n  article.className = \"ofv-document\";\n  const blocks = extractOpenDocumentBlocks(xml);\n  if (blocks.length > 0) {\n    hideSuccessfulSectionHeading(section);\n    for (const block of blocks) {\n      const paragraph = document.createElement(\"p\");\n      paragraph.textContent = block;\n      article.append(paragraph);\n    }\n  } else {\n    const empty = document.createElement(\"p\");\n    empty.textContent = \"未提取到可展示文本。\";\n    article.append(empty);\n  }\n  section.append(article);\n  panel.append(section);\n}\n\nfunction renderPlainDocument(panel: HTMLElement, title: string, text: string): void {\n  const section = createSection(title);\n  if (text.trim()) {\n    hideSuccessfulSectionHeading(section);\n  }\n  const pre = document.createElement(\"pre\");\n  pre.className = \"ofv-text-block\";\n  pre.textContent = text || \"未提取到可展示文本。\";\n  section.append(pre);\n  panel.append(section);\n}\n\nasync function renderSheet(\n  panel: HTMLElement,\n  arrayBuffer: ArrayBuffer,\n  extension: string,\n  messages: PreviewMessages\n): Promise<void> {\n  const xlsx = await import(\"xlsx\");\n  let workbook: WorkBook;\n  try {\n    workbook =\n      extension === \"csv\" || extension === \"tsv\"\n        ? (xlsx.read(decodeTextBuffer(arrayBuffer), {\n            type: \"string\",\n            FS: extension === \"tsv\" ? \"\\t\" : \",\",\n            cellDates: true,\n            cellNF: true,\n            cellStyles: true\n          }) as WorkBook)\n        : (xlsx.read(arrayBuffer, { type: \"array\", cellDates: true, cellNF: true, cellStyles: true }) as WorkBook);\n  } catch (error) {\n    if (isLegacyOfficeBinary(extension)) {\n      renderLegacyOfficeBinary(\n        panel,\n        extension,\n        arrayBuffer,\n        messages,\n        formatPreviewMessage(messages.officeSheetParseFailed, { message: normalizeOfficeError(error, messages) })\n      );\n      return;\n    }\n    renderSheetFallback(panel, extension, normalizeOfficeError(error, messages));\n    return;\n  }\n  const chartPreviews = await readWorkbookCharts(arrayBuffer).catch(() => []);\n  const workbookImages = await readWorkbookSheetImages(arrayBuffer).catch(() => new Map<string, WorkbookSheetImage[]>());\n  const workbookRichText = await readWorkbookRichText(arrayBuffer).catch(() => new Map<string, Map<string, WorkbookRichTextRun[]>>());\n  const workbookCellStyles = await readWorkbookCellStyles(arrayBuffer).catch(\n    () => new Map<string, Map<string, WorkbookCellStyleMetadata>>()\n  );\n  const workbookColumnWidths = await readWorkbookSheetColumnWidths(arrayBuffer).catch(\n    () => new Map<string, WorkbookSheetColumnWidthMetadata>()\n  );\n  const columnSizingBySheet = new Map<string, SheetColumnSizing>();\n  const tabs = document.createElement(\"div\");\n  tabs.className = \"ofv-tabs\";\n  tabs.setAttribute(\"role\", \"tablist\");\n  const content = document.createElement(\"div\");\n  content.className = \"ofv-sheet\";\n  content.setAttribute(\"role\", \"tabpanel\");\n  const buttons = new Map<string, HTMLButtonElement>();\n\n  const renderSheetByName = (sheetName: string, sheetIndex: number) => {\n    content.replaceChildren();\n    buttons.forEach((button, name) => {\n      const active = name === sheetName;\n      button.classList.toggle(\"is-active\", active);\n      button.setAttribute(\"aria-selected\", String(active));\n    });\n    content.setAttribute(\"aria-label\", sheetName);\n\n    const heading = document.createElement(\"h3\");\n    heading.textContent = sheetName;\n    const sheet = workbook.Sheets[sheetName];\n    const sheetImages = workbookImages.get(sheetName) || [];\n    const sheetRichText = workbookRichText.get(sheetName) || new Map<string, WorkbookRichTextRun[]>();\n    const sheetCellStyles = workbookCellStyles.get(sheetName) || new Map<string, WorkbookCellStyleMetadata>();\n    const columnSizing = getWorkbookSheetColumnSizing(columnSizingBySheet, sheetName, workbookColumnWidths.get(sheetName));\n    const range = trimWorkbookSheetRange(sheet, xlsx.utils.decode_range(sheet[\"!ref\"] || \"A1:A1\"), xlsx.utils.decode_cell, sheetImages);\n    const rowCount = range.e.r - range.s.r + 1;\n    const columnCount = range.e.c - range.s.c + 1;\n    const formulaRows = collectFormulaRows(sheet, range, xlsx.utils.encode_cell);\n\n    const summary = document.createElement(\"div\");\n    summary.className = \"ofv-sheet-summary\";\n    summary.hidden = true;\n    summary.setAttribute(\"aria-hidden\", \"true\");\n    summary.style.display = \"none\";\n    summary.textContent = `${rowCount} 行 x ${columnCount} 列${\n      formulaRows.length > 0 ? `，包含 ${formulaRows.length} 个公式单元格` : \"\"\n    }`;\n\n    const tableWrapper = document.createElement(\"div\");\n    tableWrapper.className = \"ofv-table-scroll\";\n    const viewport = createSheetViewport(rowCount, columnCount);\n    const windowControls = createSheetWindowControls(viewport, () => renderTableWindow());\n    const renderTableWindow = () => {\n      tableWrapper.replaceChildren(\n        createWorkbookSheetTable(\n          sheet,\n          range,\n          sheetIndex,\n          viewport,\n          xlsx.utils.encode_cell,\n          xlsx.utils.format_cell,\n          columnSizing,\n          renderTableWindow,\n          sheetImages,\n          sheetRichText,\n          sheetCellStyles\n        )\n      );\n      windowControls?.update();\n      syncSheetTableZoom(tableWrapper, getOfficePanelZoom(tableWrapper));\n    };\n\n    content.append(heading, summary);\n    if (windowControls) {\n      content.append(windowControls.element);\n    }\n    content.append(tableWrapper);\n    renderTableWindow();\n\n    if (formulaRows.length > 0) {\n      const details = document.createElement(\"details\");\n      details.className = \"ofv-details ofv-formula-list\";\n      hideSupplementalInfo(details);\n      const detailsSummary = document.createElement(\"summary\");\n      detailsSummary.textContent = \"公式明细\";\n      const list = document.createElement(\"ul\");\n      for (const item of formulaRows.slice(0, 200)) {\n        const row = document.createElement(\"li\");\n        row.textContent = `${item.address}: ${item.formula}`;\n        list.append(row);\n      }\n      if (formulaRows.length > 200) {\n        const row = document.createElement(\"li\");\n        row.textContent = `还有 ${formulaRows.length - 200} 个公式未展示。`;\n        list.append(row);\n      }\n      details.append(detailsSummary, list);\n      content.append(details);\n    }\n  };\n\n  if (workbook.SheetNames.length === 0) {\n    content.textContent = extension === \"numbers\" ? \"Numbers 文件需要服务端转换后高保真预览。\" : \"未解析到表格。\";\n  } else {\n    for (const [index, sheetName] of workbook.SheetNames.entries()) {\n      const button = document.createElement(\"button\");\n      button.type = \"button\";\n      button.setAttribute(\"role\", \"tab\");\n      button.setAttribute(\"aria-selected\", \"false\");\n      button.textContent = sheetName;\n      button.title = sheetName;\n      button.addEventListener(\"click\", () => renderSheetByName(sheetName, index));\n      buttons.set(sheetName, button);\n      tabs.append(button);\n      if (index === 0) {\n        renderSheetByName(sheetName, index);\n      }\n    }\n  }\n\n  panel.append(tabs, content);\n  if (chartPreviews.length > 0) {\n    panel.append(renderChartPreviewSection(chartPreviews));\n  }\n}\n\nfunction renderSheetFallback(panel: HTMLElement, extension: string, detail: string): void {\n  if (isEncryptedText(detail)) {\n    renderEncryptedOfficeByFileInfo(panel, `.${extension || \"sheet\"}`, \"Office 文件已加密，无法在线预览\");\n    return;\n  }\n  const section = createSection(\"表格解析失败\");\n  const title = document.createElement(\"p\");\n  title.textContent = `.${extension || \"sheet\"} 文件无法解析为可预览表格。`;\n  const meta = document.createElement(\"p\");\n  meta.textContent = detail;\n  const support = document.createElement(\"p\");\n  support.textContent = \"请确认文件未加密、未损坏，或先转换为 XLSX/CSV/ODS 后再预览。\";\n  section.append(title, meta, support);\n  panel.append(section);\n}\n\nasync function readWorkbookSheetImages(arrayBuffer: ArrayBuffer): Promise<Map<string, WorkbookSheetImage[]>> {\n  const zip = await JSZip.loadAsync(arrayBuffer);\n  const fileNames = Object.keys(zip.files);\n  const hasWorkbookImages = fileNames.some(\n    (name) => /^xl\\/drawings\\/.+\\.xml$/i.test(name) || /^xl\\/cellimages\\.xml$/i.test(name) || /^xl\\/richData\\//i.test(name)\n  );\n  if (!hasWorkbookImages) {\n    return new Map();\n  }\n  const workbookXml = await zip.file(\"xl/workbook.xml\")?.async(\"text\");\n  if (!workbookXml || typeof DOMParser === \"undefined\") {\n    return new Map();\n  }\n  const workbookDoc = parseOfficeXml(workbookXml);\n  if (!workbookDoc) {\n    return new Map();\n  }\n\n  const workbookRels = await readOfficeRelationships(zip, \"xl/workbook.xml\");\n  const cellImageContext: WorkbookCellImageContext = {};\n  const result = new Map<string, WorkbookSheetImage[]>();\n  const sheetElements = Array.from(workbookDoc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"sheet\");\n  for (const sheetElement of sheetElements) {\n    const sheetName = sheetElement.getAttribute(\"name\") || \"\";\n    const relationshipId = getXmlAttribute(sheetElement, \"id\");\n    const sheetRel = workbookRels.find((rel) => rel.id === relationshipId && /\\/worksheet$/i.test(rel.type));\n    const sheetPath = resolveOfficeRelationshipTarget(\"xl/workbook.xml\", sheetRel?.target);\n    if (!sheetName || !sheetPath) {\n      continue;\n    }\n    const images = await readWorksheetImages(zip, sheetPath, cellImageContext);\n    if (images.length > 0) {\n      result.set(sheetName, images);\n    }\n  }\n  return result;\n}\n\nfunction getWorkbookSheetColumnSizing(\n  cache: Map<string, SheetColumnSizing>,\n  sheetName: string,\n  sourceMetadata?: WorkbookSheetColumnWidthMetadata\n): SheetColumnSizing {\n  const existing = cache.get(sheetName);\n  if (existing) {\n    return existing;\n  }\n  const sizing: SheetColumnSizing = {\n    widths: new Map(),\n    sourceColumns: sourceMetadata?.columns,\n    sourceDefaultColumn: sourceMetadata?.defaultColumn,\n    sourceMdw: sourceMetadata?.mdw\n  };\n  cache.set(sheetName, sizing);\n  return sizing;\n}\n\nasync function readWorkbookSheetColumnWidths(arrayBuffer: ArrayBuffer): Promise<Map<string, WorkbookSheetColumnWidthMetadata>> {\n  const zip = await JSZip.loadAsync(arrayBuffer);\n  const workbookXml = await zip.file(\"xl/workbook.xml\")?.async(\"text\");\n  if (!workbookXml || typeof DOMParser === \"undefined\") {\n    return new Map();\n  }\n  const workbookDoc = parseOfficeXml(workbookXml);\n  if (!workbookDoc) {\n    return new Map();\n  }\n\n  const workbookRels = await readOfficeRelationships(zip, \"xl/workbook.xml\");\n  const result = new Map<string, WorkbookSheetColumnWidthMetadata>();\n  const sheetElements = Array.from(workbookDoc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"sheet\");\n  for (const sheetElement of sheetElements) {\n    const sheetName = sheetElement.getAttribute(\"name\") || \"\";\n    const relationshipId = getXmlAttribute(sheetElement, \"id\");\n    const sheetRel = workbookRels.find((rel) => rel.id === relationshipId && /\\/worksheet$/i.test(rel.type));\n    const sheetPath = resolveOfficeRelationshipTarget(\"xl/workbook.xml\", sheetRel?.target);\n    const metadata = sheetPath ? await readWorksheetColumnWidths(zip, sheetPath) : undefined;\n    if (sheetName && metadata && (metadata.columns.size > 0 || metadata.defaultColumn !== undefined)) {\n      result.set(sheetName, metadata);\n    }\n  }\n  return result;\n}\n\nasync function readWorkbookRichText(arrayBuffer: ArrayBuffer): Promise<Map<string, Map<string, WorkbookRichTextRun[]>>> {\n  const zip = await JSZip.loadAsync(arrayBuffer);\n  const workbookXml = await zip.file(\"xl/workbook.xml\")?.async(\"text\");\n  if (!workbookXml || typeof DOMParser === \"undefined\") {\n    return new Map();\n  }\n  const workbookDoc = parseOfficeXml(workbookXml);\n  if (!workbookDoc) {\n    return new Map();\n  }\n\n  const sharedStrings = await readWorkbookSharedStringRichText(zip);\n  const workbookRels = await readOfficeRelationships(zip, \"xl/workbook.xml\");\n  const result = new Map<string, Map<string, WorkbookRichTextRun[]>>();\n  const sheetElements = Array.from(workbookDoc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"sheet\");\n  for (const sheetElement of sheetElements) {\n    const sheetName = sheetElement.getAttribute(\"name\") || \"\";\n    const relationshipId = getXmlAttribute(sheetElement, \"id\");\n    const sheetRel = workbookRels.find((rel) => rel.id === relationshipId && /\\/worksheet$/i.test(rel.type));\n    const sheetPath = resolveOfficeRelationshipTarget(\"xl/workbook.xml\", sheetRel?.target);\n    const richText = sheetPath ? await readWorksheetRichText(zip, sheetPath, sharedStrings) : undefined;\n    if (sheetName && richText && richText.size > 0) {\n      result.set(sheetName, richText);\n    }\n  }\n  return result;\n}\n\nasync function readWorkbookCellStyles(arrayBuffer: ArrayBuffer): Promise<Map<string, Map<string, WorkbookCellStyleMetadata>>> {\n  const zip = await JSZip.loadAsync(arrayBuffer);\n  const stylesXml = await zip.file(\"xl/styles.xml\")?.async(\"text\");\n  const workbookXml = await zip.file(\"xl/workbook.xml\")?.async(\"text\");\n  if (!stylesXml || !workbookXml || typeof DOMParser === \"undefined\") {\n    return new Map();\n  }\n  const stylesDoc = parseOfficeXml(stylesXml);\n  const workbookDoc = parseOfficeXml(workbookXml);\n  if (!stylesDoc || !workbookDoc) {\n    return new Map();\n  }\n\n  const fonts = readWorkbookStyleFonts(stylesDoc);\n  const cellStyleByIndex = readWorkbookCellStyleIndex(stylesDoc, fonts);\n  if (cellStyleByIndex.size === 0) {\n    return new Map();\n  }\n\n  const workbookRels = await readOfficeRelationships(zip, \"xl/workbook.xml\");\n  const result = new Map<string, Map<string, WorkbookCellStyleMetadata>>();\n  const sheetElements = Array.from(workbookDoc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"sheet\");\n  for (const sheetElement of sheetElements) {\n    const sheetName = sheetElement.getAttribute(\"name\") || \"\";\n    const relationshipId = getXmlAttribute(sheetElement, \"id\");\n    const sheetRel = workbookRels.find((rel) => rel.id === relationshipId && /\\/worksheet$/i.test(rel.type));\n    const sheetPath = resolveOfficeRelationshipTarget(\"xl/workbook.xml\", sheetRel?.target);\n    const cellStyles = sheetPath ? await readWorksheetCellStyles(zip, sheetPath, cellStyleByIndex) : undefined;\n    if (sheetName && cellStyles && cellStyles.size > 0) {\n      result.set(sheetName, cellStyles);\n    }\n  }\n  return result;\n}\n\nfunction readWorkbookStyleFonts(stylesDoc: Document): Map<number, WorkbookCellFontStyle> {\n  const result = new Map<number, WorkbookCellFontStyle>();\n  const fontsElement = Array.from(stylesDoc.getElementsByTagName(\"*\")).find((element) => element.localName === \"fonts\");\n  const fontElements = Array.from(fontsElement?.children || []).filter((element) => element.localName === \"font\");\n  fontElements.forEach((fontElement, index) => {\n    const size = Number.parseFloat(firstDirectOfficeChild(fontElement, \"sz\")?.getAttribute(\"val\") || \"\");\n    const color = firstDirectOfficeChild(fontElement, \"color\");\n    const font: WorkbookCellFontStyle = {\n      bold: readWorkbookBooleanFlag(fontElement, \"b\"),\n      italic: readWorkbookBooleanFlag(fontElement, \"i\"),\n      underline: readWorkbookBooleanFlag(fontElement, \"u\"),\n      strike: readWorkbookBooleanFlag(fontElement, \"strike\"),\n      sz: Number.isFinite(size) ? size : undefined,\n      color: color ? { rgb: color.getAttribute(\"rgb\") || undefined, indexed: parseOptionalInteger(color.getAttribute(\"indexed\")) } : undefined\n    };\n    if (isMeaningfulWorkbookCellFontStyle(font)) {\n      result.set(index, font);\n    }\n  });\n  return result;\n}\n\nfunction readWorkbookCellStyleIndex(\n  stylesDoc: Document,\n  fonts: Map<number, WorkbookCellFontStyle>\n): Map<number, WorkbookCellStyleMetadata> {\n  const result = new Map<number, WorkbookCellStyleMetadata>();\n  const cellXfsElement = Array.from(stylesDoc.getElementsByTagName(\"*\")).find((element) => element.localName === \"cellXfs\");\n  const xfElements = Array.from(cellXfsElement?.children || []).filter((element) => element.localName === \"xf\");\n  xfElements.forEach((xfElement, index) => {\n    const fontId = parseOptionalInteger(xfElement.getAttribute(\"fontId\"));\n    const font = fontId === undefined ? undefined : fonts.get(fontId);\n    const alignment = firstDirectOfficeChild(xfElement, \"alignment\");\n    const wrapTextValue = alignment?.getAttribute(\"wrapText\")?.toLowerCase();\n    const wrapText = wrapTextValue === \"1\" || wrapTextValue === \"true\";\n    if (font || wrapText) {\n      result.set(index, { font, wrapText: wrapText || undefined });\n    }\n  });\n  return result;\n}\n\nasync function readWorksheetCellStyles(\n  zip: JSZip,\n  sheetPath: string,\n  styleByIndex: Map<number, WorkbookCellStyleMetadata>\n): Promise<Map<string, WorkbookCellStyleMetadata>> {\n  const result = new Map<string, WorkbookCellStyleMetadata>();\n  const sheetXml = await zip.file(sheetPath)?.async(\"text\");\n  if (!sheetXml || !/\\bs=\"\\d+\"/i.test(sheetXml)) {\n    return result;\n  }\n  for (const match of sheetXml.matchAll(/<c\\b[^>]*>/gi)) {\n    const cellTag = match[0];\n    const address = getXmlTagAttribute(cellTag, \"r\");\n    const styleIndex = parseOptionalInteger(getXmlTagAttribute(cellTag, \"s\"));\n    const style = styleIndex === undefined ? undefined : styleByIndex.get(styleIndex);\n    if (address && style) {\n      result.set(address, style);\n    }\n  }\n  return result;\n}\n\nfunction readWorkbookBooleanFlag(element: Element, localName: string): boolean | undefined {\n  const flag = firstDirectOfficeChild(element, localName);\n  if (!flag) {\n    return undefined;\n  }\n  const value = flag.getAttribute(\"val\");\n  if (value === \"0\" || value === \"false\") {\n    return undefined;\n  }\n  return true;\n}\n\nfunction isMeaningfulWorkbookCellFontStyle(font: WorkbookCellFontStyle): boolean {\n  return Boolean(font.bold || font.italic || font.underline || font.strike || font.color?.rgb || font.sz);\n}\n\nasync function readWorkbookSharedStringRichText(zip: JSZip): Promise<Map<number, WorkbookRichTextRun[]>> {\n  const result = new Map<number, WorkbookRichTextRun[]>();\n  const sharedStringsXml = await zip.file(\"xl/sharedStrings.xml\")?.async(\"text\");\n  if (!sharedStringsXml || !/<rPr\\b/i.test(sharedStringsXml)) {\n    return result;\n  }\n  const sharedStringsDoc = sharedStringsXml ? parseOfficeXml(sharedStringsXml) : undefined;\n  if (!sharedStringsDoc) {\n    return result;\n  }\n  const items = Array.from(sharedStringsDoc.documentElement.children).filter((element) => element.localName === \"si\");\n  items.forEach((item, index) => {\n    const runs = parseWorkbookRichTextRuns(item);\n    if (runs.length > 0 && runs.some((run) => isStyledWorkbookRichTextRun(run))) {\n      result.set(index, runs);\n    }\n  });\n  return result;\n}\n\nasync function readWorksheetRichText(\n  zip: JSZip,\n  sheetPath: string,\n  sharedStrings: Map<number, WorkbookRichTextRun[]>\n): Promise<Map<string, WorkbookRichTextRun[]>> {\n  const result = new Map<string, WorkbookRichTextRun[]>();\n  const sheetXml = await zip.file(sheetPath)?.async(\"text\");\n  if (!sheetXml || (sharedStrings.size === 0 && !/<rPr\\b/i.test(sheetXml))) {\n    return result;\n  }\n  const sheetDoc = sheetXml ? parseOfficeXml(sheetXml) : undefined;\n  if (!sheetDoc) {\n    return result;\n  }\n  const cells = Array.from(sheetDoc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"c\");\n  for (const cell of cells) {\n    const address = cell.getAttribute(\"r\") || \"\";\n    if (!address) {\n      continue;\n    }\n    const type = cell.getAttribute(\"t\") || \"\";\n    if (type === \"s\") {\n      const sharedStringIndex = Number.parseInt(firstDirectOfficeChild(cell, \"v\")?.textContent || \"\", 10);\n      const runs = sharedStrings.get(sharedStringIndex);\n      if (runs?.length) {\n        result.set(address, runs);\n      }\n      continue;\n    }\n    if (type === \"inlineStr\") {\n      const inlineString = firstDirectOfficeChild(cell, \"is\");\n      const runs = inlineString ? parseWorkbookRichTextRuns(inlineString) : [];\n      if (runs.length > 0 && runs.some((run) => isStyledWorkbookRichTextRun(run))) {\n        result.set(address, runs);\n      }\n    }\n  }\n  return result;\n}\n\nfunction parseWorkbookRichTextRuns(container: Element): WorkbookRichTextRun[] {\n  const richRuns = Array.from(container.children).filter((element) => element.localName === \"r\");\n  if (richRuns.length > 0) {\n    return richRuns\n      .map((run) => {\n        const properties = firstDirectOfficeChild(run, \"rPr\");\n        return {\n          ...parseWorkbookRichTextRunStyle(properties),\n          text: readWorkbookRichTextNodeText(run)\n        };\n      })\n      .filter((run) => run.text.length > 0);\n  }\n  const text = firstDirectOfficeChild(container, \"t\")?.textContent || \"\";\n  return text ? [{ text }] : [];\n}\n\nfunction parseWorkbookRichTextRunStyle(properties: Element | undefined): Omit<WorkbookRichTextRun, \"text\"> {\n  if (!properties) {\n    return {};\n  }\n  const color = firstDirectOfficeChild(properties, \"color\");\n  const size = Number.parseFloat(firstDirectOfficeChild(properties, \"sz\")?.getAttribute(\"val\") || \"\");\n  return {\n    bold: Boolean(firstDirectOfficeChild(properties, \"b\")),\n    italic: Boolean(firstDirectOfficeChild(properties, \"i\")),\n    underline: Boolean(firstDirectOfficeChild(properties, \"u\")),\n    strike: Boolean(firstDirectOfficeChild(properties, \"strike\")),\n    color: readWorkbookColor(color ? { rgb: color.getAttribute(\"rgb\") || undefined } : undefined),\n    fontSize: Number.isFinite(size) ? size : undefined\n  };\n}\n\nfunction readWorkbookRichTextNodeText(run: Element): string {\n  return Array.from(run.children)\n    .filter((element) => element.localName === \"t\")\n    .map((element) => element.textContent || \"\")\n    .join(\"\");\n}\n\nfunction isStyledWorkbookRichTextRun(run: WorkbookRichTextRun): boolean {\n  return Boolean(run.bold || run.italic || run.underline || run.strike || run.color || run.fontSize);\n}\n\nfunction firstDirectOfficeChild(element: Element, localName: string): Element | undefined {\n  return Array.from(element.children).find((child) => child.localName === localName);\n}\n\nasync function readWorksheetColumnWidths(zip: JSZip, sheetPath: string): Promise<WorkbookSheetColumnWidthMetadata> {\n  const sheetXml = await zip.file(sheetPath)?.async(\"text\");\n  const sheetFormatXml = sheetXml ? /<sheetFormatPr\\b[^>]*\\/?>/i.exec(sheetXml)?.[0] : undefined;\n  const defaultColWidth = Number.parseFloat(getXmlTagAttribute(sheetFormatXml || \"\", \"defaultColWidth\") || \"\");\n  const defaultColumn = Number.isFinite(defaultColWidth) ? { width: defaultColWidth } : undefined;\n  const columnsXml = sheetXml ? /<cols\\b[\\s\\S]*?<\\/cols>/i.exec(sheetXml)?.[0] : undefined;\n  if (!columnsXml) {\n    return { columns: new Map(), defaultColumn };\n  }\n  const columns = new Map<number, WorkbookColumnWidthSource>();\n  let mdw: number | undefined;\n  for (const match of columnsXml.matchAll(/<col\\b[^>]*\\/?>/gi)) {\n    const columnXml = match[0];\n    const min = Number.parseInt(getXmlTagAttribute(columnXml, \"min\") || \"\", 10);\n    const max = Number.parseInt(getXmlTagAttribute(columnXml, \"max\") || \"\", 10);\n    if (!Number.isFinite(min) || !Number.isFinite(max) || min < 1 || max < min) {\n      continue;\n    }\n    const width = Number.parseFloat(getXmlTagAttribute(columnXml, \"width\") || \"\");\n    const hidden = getXmlTagAttribute(columnXml, \"hidden\") === \"1\" || getXmlTagAttribute(columnXml, \"hidden\") === \"true\";\n    if (mdw === undefined && Number.isFinite(width)) {\n      mdw = findExcelColumnMdw(width);\n    }\n    const sourceColumn = { hidden, width: Number.isFinite(width) ? width : undefined };\n    for (let columnIndex = min - 1; columnIndex <= max - 1; columnIndex += 1) {\n      columns.set(columnIndex, sourceColumn);\n    }\n  }\n  return { columns, defaultColumn, mdw };\n}\n\nfunction getXmlTagAttribute(xml: string, name: string): string | undefined {\n  return new RegExp(`\\\\s${name}=\"([^\"]*)\"`, \"i\").exec(xml)?.[1];\n}\n\nasync function readWorksheetImages(zip: JSZip, sheetPath: string, cellImageContext?: WorkbookCellImageContext): Promise<WorkbookSheetImage[]> {\n  const sheetXml = await zip.file(sheetPath)?.async(\"text\");\n  const sheetDoc = sheetXml ? parseOfficeXml(sheetXml) : undefined;\n  if (!sheetDoc) {\n    return [];\n  }\n\n  const sheetRels = await readOfficeRelationships(zip, sheetPath);\n  const drawingIds = Array.from(sheetDoc.getElementsByTagName(\"*\"))\n    .filter((element) => element.localName === \"drawing\")\n    .map((element) => getXmlAttribute(element, \"id\"))\n    .filter((id): id is string => Boolean(id));\n  const images: WorkbookSheetImage[] = [];\n  for (const drawingId of drawingIds) {\n    const drawingRel = sheetRels.find((rel) => rel.id === drawingId && /\\/drawing$/i.test(rel.type));\n    const drawingPath = resolveOfficeRelationshipTarget(sheetPath, drawingRel?.target);\n    if (drawingPath) {\n      images.push(...(await readWorksheetDrawingImages(zip, drawingPath)));\n    }\n  }\n  if (cellImageContext) {\n    images.push(...(await readWorksheetEmbeddedCellImages(zip, sheetDoc, cellImageContext)));\n  }\n  return images;\n}\n\nasync function readWorksheetDrawingImages(zip: JSZip, drawingPath: string): Promise<WorkbookSheetImage[]> {\n  const drawingXml = await zip.file(drawingPath)?.async(\"text\");\n  const drawingDoc = drawingXml ? parseOfficeXml(drawingXml) : undefined;\n  if (!drawingDoc) {\n    return [];\n  }\n\n  const drawingRels = await readOfficeRelationships(zip, drawingPath);\n  const anchors = Array.from(drawingDoc.getElementsByTagName(\"*\")).filter(\n    (element) => element.localName === \"twoCellAnchor\" || element.localName === \"oneCellAnchor\"\n  );\n  const images: WorkbookSheetImage[] = [];\n  for (const anchor of anchors) {\n    const from = Array.from(anchor.children).find((element) => element.localName === \"from\");\n    const to = Array.from(anchor.children).find((element) => element.localName === \"to\");\n    const embedId = findDrawingImageRelationshipId(anchor);\n    const mediaRel = drawingRels.find((rel) => rel.id === embedId && /\\/image$/i.test(rel.type));\n    const mediaPath = resolveOfficeRelationshipTarget(drawingPath, mediaRel?.target);\n    const mediaFile = mediaPath ? zip.file(mediaPath) : undefined;\n    if (!from || !mediaPath || !mediaFile) {\n      continue;\n    }\n    const mimeType = mimeTypeFromImagePath(mediaPath);\n    images.push({\n      row: readDrawingMarkerIndex(from, \"row\"),\n      column: readDrawingMarkerIndex(from, \"col\"),\n      endRow: to ? readDrawingMarkerIndex(to, \"row\") : undefined,\n      endColumn: to ? readDrawingMarkerIndex(to, \"col\") : undefined,\n      fileName: mediaPath.split(\"/\").pop() || \"image\",\n      mimeType,\n      dataUrl: `data:${mimeType};base64,${await mediaFile.async(\"base64\")}`,\n      title: readDrawingImageTitle(anchor)\n    });\n  }\n  return images;\n}\n\nfunction findDrawingImageRelationshipId(anchor: Element): string | undefined {\n  for (const element of Array.from(anchor.getElementsByTagName(\"*\"))) {\n    if (element.localName === \"blip\") {\n      return getXmlAttribute(element, \"embed\") || getXmlAttribute(element, \"link\") || undefined;\n    }\n  }\n  return undefined;\n}\n\nfunction readDrawingImageTitle(anchor: Element): string | undefined {\n  const nonVisualProperties = Array.from(anchor.getElementsByTagName(\"*\")).find((element) => element.localName === \"cNvPr\");\n  return nonVisualProperties?.getAttribute(\"descr\") || nonVisualProperties?.getAttribute(\"name\") || undefined;\n}\n\nfunction readDrawingMarkerIndex(marker: Element, localName: \"row\" | \"col\"): number {\n  const element = Array.from(marker.children).find((child) => child.localName === localName);\n  const value = Number.parseInt(element?.textContent || \"0\", 10);\n  return Number.isFinite(value) && value >= 0 ? value : 0;\n}\n\ntype WpsCellImageEntry = {\n  mediaPath: string;\n  title?: string;\n};\n\ntype WorkbookCellImageContext = {\n  wpsCellImages?: Promise<Map<string, WpsCellImageEntry>>;\n  richValueImages?: Promise<Map<number, string>>;\n};\n\nasync function readWorksheetEmbeddedCellImages(\n  zip: JSZip,\n  sheetDoc: Document,\n  context: WorkbookCellImageContext\n): Promise<WorkbookSheetImage[]> {\n  const cellElements = Array.from(sheetDoc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"c\");\n  const wpsRefs: Array<{ row: number; column: number; imageId: string }> = [];\n  const richValueRefs: Array<{ row: number; column: number; vm: number }> = [];\n  for (const cellElement of cellElements) {\n    const reference = cellElement.getAttribute(\"r\");\n    const position = reference ? decodeSheetCellReference(reference) : undefined;\n    if (!position) {\n      continue;\n    }\n    const formula = Array.from(cellElement.children).find((child) => child.localName === \"f\")?.textContent || \"\";\n    const dispimgId = matchDispimgImageId(formula);\n    if (dispimgId) {\n      wpsRefs.push({ ...position, imageId: dispimgId });\n      continue;\n    }\n    const vm = Number.parseInt(cellElement.getAttribute(\"vm\") || \"\", 10);\n    if (Number.isFinite(vm) && vm > 0) {\n      richValueRefs.push({ ...position, vm });\n    }\n  }\n\n  const images: WorkbookSheetImage[] = [];\n  if (wpsRefs.length > 0) {\n    context.wpsCellImages ??= readWpsCellImageIndex(zip);\n    const index = await context.wpsCellImages;\n    for (const ref of wpsRefs) {\n      const entry = index.get(ref.imageId);\n      const mediaFile = entry ? zip.file(entry.mediaPath) : undefined;\n      if (!entry || !mediaFile) {\n        continue;\n      }\n      const mimeType = mimeTypeFromImagePath(entry.mediaPath);\n      images.push({\n        row: ref.row,\n        column: ref.column,\n        fileName: entry.mediaPath.split(\"/\").pop() || \"image\",\n        mimeType,\n        dataUrl: `data:${mimeType};base64,${await mediaFile.async(\"base64\")}`,\n        title: entry.title\n      });\n    }\n  }\n  if (richValueRefs.length > 0) {\n    context.richValueImages ??= readRichValueImageIndex(zip);\n    const index = await context.richValueImages;\n    for (const ref of richValueRefs) {\n      const mediaPath = index.get(ref.vm);\n      const mediaFile = mediaPath ? zip.file(mediaPath) : undefined;\n      if (!mediaPath || !mediaFile) {\n        continue;\n      }\n      const mimeType = mimeTypeFromImagePath(mediaPath);\n      images.push({\n        row: ref.row,\n        column: ref.column,\n        fileName: mediaPath.split(\"/\").pop() || \"image\",\n        mimeType,\n        dataUrl: `data:${mimeType};base64,${await mediaFile.async(\"base64\")}`\n      });\n    }\n  }\n  return images;\n}\n\nfunction matchDispimgImageId(formula: string): string | undefined {\n  const match = /(?:_xlfn\\.)?DISPIMG\\(\\s*\"([^\"]+)\"/i.exec(formula);\n  return match?.[1];\n}\n\nfunction decodeSheetCellReference(reference: string): { row: number; column: number } | undefined {\n  const match = /^\\$?([A-Za-z]{1,3})\\$?(\\d{1,7})$/.exec(reference.trim());\n  if (!match) {\n    return undefined;\n  }\n  let column = 0;\n  for (const char of match[1].toUpperCase()) {\n    column = column * 26 + (char.charCodeAt(0) - 64);\n  }\n  const row = Number.parseInt(match[2], 10);\n  if (!Number.isFinite(row) || row < 1) {\n    return undefined;\n  }\n  return { row: row - 1, column: column - 1 };\n}\n\nasync function readWpsCellImageIndex(zip: JSZip): Promise<Map<string, WpsCellImageEntry>> {\n  const result = new Map<string, WpsCellImageEntry>();\n  const cellImagesXml = await zip.file(\"xl/cellimages.xml\")?.async(\"text\");\n  const cellImagesDoc = cellImagesXml ? parseOfficeXml(cellImagesXml) : undefined;\n  if (!cellImagesDoc) {\n    return result;\n  }\n  const cellImageRels = await readOfficeRelationships(zip, \"xl/cellimages.xml\");\n  const pics = Array.from(cellImagesDoc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"pic\");\n  for (const pic of pics) {\n    const nonVisualProperties = Array.from(pic.getElementsByTagName(\"*\")).find((element) => element.localName === \"cNvPr\");\n    const imageId = nonVisualProperties?.getAttribute(\"name\");\n    const embedId = findDrawingImageRelationshipId(pic);\n    const mediaRel = cellImageRels.find((rel) => rel.id === embedId && /\\/image$/i.test(rel.type));\n    const mediaPath = resolveOfficeRelationshipTarget(\"xl/cellimages.xml\", mediaRel?.target);\n    if (!imageId || !mediaPath) {\n      continue;\n    }\n    result.set(imageId, { mediaPath, title: nonVisualProperties?.getAttribute(\"descr\") || undefined });\n  }\n  return result;\n}\n\nasync function readRichValueImageIndex(zip: JSZip): Promise<Map<number, string>> {\n  const result = new Map<number, string>();\n  const metadataXml = await zip.file(\"xl/metadata.xml\")?.async(\"text\");\n  const metadataDoc = metadataXml ? parseOfficeXml(metadataXml) : undefined;\n  if (!metadataDoc) {\n    return result;\n  }\n\n  const metadataTypeElements = Array.from(metadataDoc.getElementsByTagName(\"*\")).filter(\n    (element) => element.localName === \"metadataType\"\n  );\n  const richTypeIndexes = new Set<number>();\n  metadataTypeElements.forEach((element, index) => {\n    if ((element.getAttribute(\"name\") || \"\").toUpperCase() === \"XLRICHVALUE\") {\n      richTypeIndexes.add(index + 1);\n    }\n  });\n  if (richTypeIndexes.size === 0) {\n    return result;\n  }\n\n  const valueMetadata = Array.from(metadataDoc.getElementsByTagName(\"*\")).find((element) => element.localName === \"valueMetadata\");\n  const valueBlocks = valueMetadata ? Array.from(valueMetadata.children).filter((element) => element.localName === \"bk\") : [];\n  const vmToRichValue = new Map<number, number>();\n  valueBlocks.forEach((block, index) => {\n    const richRecord = Array.from(block.getElementsByTagName(\"*\")).find((element) => {\n      if (element.localName !== \"rc\") {\n        return false;\n      }\n      const typeIndex = Number.parseInt(element.getAttribute(\"t\") || \"\", 10);\n      return richTypeIndexes.has(typeIndex);\n    });\n    const richValueIndex = richRecord ? Number.parseInt(richRecord.getAttribute(\"v\") || \"\", 10) : Number.NaN;\n    if (Number.isFinite(richValueIndex) && richValueIndex >= 0) {\n      vmToRichValue.set(index + 1, richValueIndex);\n    }\n  });\n  if (vmToRichValue.size === 0) {\n    return result;\n  }\n\n  const richValueXml = await zip.file(\"xl/richData/rdrichvalue.xml\")?.async(\"text\");\n  const richValueDoc = richValueXml ? parseOfficeXml(richValueXml) : undefined;\n  const richValueRelXml = await zip.file(\"xl/richData/richValueRel.xml\")?.async(\"text\");\n  const richValueRelDoc = richValueRelXml ? parseOfficeXml(richValueRelXml) : undefined;\n  if (!richValueDoc || !richValueRelDoc) {\n    return result;\n  }\n  const richValues = Array.from(richValueDoc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"rv\");\n  const relIndexes = richValues.map((richValue) => {\n    const binding = Array.from(richValue.getElementsByTagName(\"*\")).find((element) => element.localName === \"vb\");\n    return Number.parseInt(binding?.getAttribute(\"i\") || \"\", 10);\n  });\n  const relIds = Array.from(richValueRelDoc.getElementsByTagName(\"*\"))\n    .filter((element) => element.localName === \"rel\")\n    .map((element) => getXmlAttribute(element, \"id\") || \"\");\n  const richValueRels = await readOfficeRelationships(zip, \"xl/richData/richValueRel.xml\");\n\n  for (const [vm, richValueIndex] of vmToRichValue) {\n    const relIndex = relIndexes[richValueIndex];\n    const relId = Number.isFinite(relIndex) ? relIds[relIndex] : undefined;\n    const mediaRel = richValueRels.find((rel) => rel.id === relId && /\\/image$/i.test(rel.type));\n    const mediaPath = resolveOfficeRelationshipTarget(\"xl/richData/richValueRel.xml\", mediaRel?.target);\n    if (mediaPath) {\n      result.set(vm, mediaPath);\n    }\n  }\n  return result;\n}\n\ntype OfficeRelationship = {\n  id: string;\n  type: string;\n  target: string;\n};\n\nasync function readOfficeRelationships(zip: JSZip, partPath: string): Promise<OfficeRelationship[]> {\n  const xml = await zip.file(relationshipPathForPart(partPath))?.async(\"text\");\n  const doc = xml ? parseOfficeXml(xml) : undefined;\n  if (!doc) {\n    return [];\n  }\n  return Array.from(doc.getElementsByTagName(\"*\"))\n    .filter((element) => element.localName === \"Relationship\")\n    .map((element) => ({\n      id: element.getAttribute(\"Id\") || \"\",\n      type: element.getAttribute(\"Type\") || \"\",\n      target: element.getAttribute(\"Target\") || \"\"\n    }));\n}\n\nfunction parseOfficeXml(xml: string): Document | undefined {\n  const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n  return doc.querySelector(\"parsererror\") ? undefined : doc;\n}\n\nfunction resolveOfficeRelationshipTarget(sourcePath: string, target?: string): string | undefined {\n  return resolvePptxRelationshipTarget(sourcePath, target);\n}\n\nfunction mimeTypeFromImagePath(path: string): string {\n  const extension = path.split(\".\").pop()?.toLowerCase();\n  switch (extension) {\n    case \"jpg\":\n    case \"jpeg\":\n      return \"image/jpeg\";\n    case \"gif\":\n      return \"image/gif\";\n    case \"webp\":\n      return \"image/webp\";\n    case \"bmp\":\n      return \"image/bmp\";\n    case \"svg\":\n      return \"image/svg+xml\";\n    case \"png\":\n    default:\n      return \"image/png\";\n  }\n}\n\nfunction renderEncryptedOfficeByFileInfo(panel: HTMLElement, fileLabel: string, title: string): void {\n  const section = createSection(title);\n  section.classList.add(\"ofv-encrypted\");\n  const message = document.createElement(\"p\");\n  message.textContent = `${fileLabel} 可能已加密或受保护。请下载后使用 Office/WPS 输入密码打开，或上传解密后的文件。`;\n  section.append(message);\n  panel.append(section);\n}\n\nfunction isEncryptedText(value: string): boolean {\n  return /\\b(password|encrypted|encrypt|protected|decrypt|permission|加密|密码|受保护)\\b/i.test(value);\n}\n\ntype ChartPreview = {\n  name: string;\n  type: string;\n  title: string;\n  categories: string[];\n  series: Array<{ name: string; values: number[]; color?: string }>;\n};\n\ntype ParsedSheet = {\n  name: string;\n  rows: string[][];\n  formulas: Array<{ address: string; formula: string }>;\n};\n\nfunction renderFlatOds(panel: HTMLElement, xml: string): void {\n  const sheets = parseFlatOds(xml);\n  renderParsedSheets(panel, sheets, \"FODS 文件未解析到表格。\");\n}\n\nfunction renderParsedSheets(panel: HTMLElement, sheets: ParsedSheet[], emptyMessage: string): void {\n  const tabs = document.createElement(\"div\");\n  tabs.className = \"ofv-tabs\";\n  tabs.setAttribute(\"role\", \"tablist\");\n  const content = document.createElement(\"div\");\n  content.className = \"ofv-sheet\";\n  content.setAttribute(\"role\", \"tabpanel\");\n  const buttons = new Map<string, HTMLButtonElement>();\n\n  const renderSheetByIndex = (sheet: ParsedSheet, sheetIndex: number) => {\n    content.replaceChildren();\n    buttons.forEach((button, name) => {\n      const active = name === sheet.name;\n      button.classList.toggle(\"is-active\", active);\n      button.setAttribute(\"aria-selected\", String(active));\n    });\n    content.setAttribute(\"aria-label\", sheet.name);\n\n    const heading = document.createElement(\"h3\");\n    heading.textContent = sheet.name;\n    const summary = document.createElement(\"div\");\n    summary.className = \"ofv-sheet-summary\";\n    summary.hidden = true;\n    summary.setAttribute(\"aria-hidden\", \"true\");\n    summary.style.display = \"none\";\n    const rowCount = sheet.rows.length;\n    const columnCount = Math.max(0, ...sheet.rows.map((row) => row.length));\n    summary.textContent = `${rowCount} 行 x ${columnCount} 列${\n      sheet.formulas.length > 0 ? `，包含 ${sheet.formulas.length} 个公式单元格` : \"\"\n    }`;\n\n    const tableWrapper = document.createElement(\"div\");\n    tableWrapper.className = \"ofv-table-scroll\";\n    const viewport = createSheetViewport(rowCount, columnCount);\n    const columnSizing: SheetColumnSizing = { widths: new Map() };\n    const windowControls = createSheetWindowControls(viewport, () => renderTableWindow());\n    const renderTableWindow = () => {\n      tableWrapper.replaceChildren(createParsedSheetTable(sheet, sheetIndex, viewport, columnSizing, renderTableWindow));\n      windowControls?.update();\n      syncSheetTableZoom(tableWrapper, getOfficePanelZoom(tableWrapper));\n    };\n\n    content.append(heading, summary);\n    if (windowControls) {\n      content.append(windowControls.element);\n    }\n    content.append(tableWrapper);\n    renderTableWindow();\n\n    if (sheet.formulas.length > 0) {\n      const details = document.createElement(\"details\");\n      details.className = \"ofv-details ofv-formula-list\";\n      hideSupplementalInfo(details);\n      const detailsSummary = document.createElement(\"summary\");\n      detailsSummary.textContent = \"公式明细\";\n      const list = document.createElement(\"ul\");\n      for (const item of sheet.formulas.slice(0, 200)) {\n        const row = document.createElement(\"li\");\n        row.textContent = `${item.address}: ${item.formula}`;\n        list.append(row);\n      }\n      if (sheet.formulas.length > 200) {\n        const row = document.createElement(\"li\");\n        row.textContent = `还有 ${sheet.formulas.length - 200} 个公式未展示。`;\n        list.append(row);\n      }\n      details.append(detailsSummary, list);\n      content.append(details);\n    }\n  };\n\n  if (sheets.length === 0) {\n    content.textContent = emptyMessage;\n  } else {\n    for (const [index, sheet] of sheets.entries()) {\n      const button = document.createElement(\"button\");\n      button.type = \"button\";\n      button.setAttribute(\"role\", \"tab\");\n      button.setAttribute(\"aria-selected\", \"false\");\n      button.textContent = sheet.name;\n      button.title = sheet.name;\n      button.addEventListener(\"click\", () => renderSheetByIndex(sheet, index));\n      buttons.set(sheet.name, button);\n      tabs.append(button);\n      if (index === 0) {\n        renderSheetByIndex(sheet, index);\n      }\n    }\n  }\n\n  panel.append(tabs, content);\n}\n\nasync function readWorkbookCharts(arrayBuffer: ArrayBuffer): Promise<ChartPreview[]> {\n  const zip = await JSZip.loadAsync(arrayBuffer);\n  const chartEntries = Object.values(zip.files)\n    .filter((entry) => !entry.dir && /^xl\\/charts\\/chart\\d+\\.xml$/i.test(entry.name))\n    .sort((a, b) => a.name.localeCompare(b.name));\n  const charts: ChartPreview[] = [];\n  for (const [index, entry] of chartEntries.entries()) {\n    const xml = await entry.async(\"text\");\n    const chart = parseChartXml(xml, entry.name.split(\"/\").pop() || `chart${index + 1}.xml`);\n    if (chart) {\n      charts.push(chart);\n    }\n  }\n  return charts;\n}\n\nfunction parseChartXml(xml: string, fallbackName: string): ChartPreview | null {\n  const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n  if (doc.querySelector(\"parsererror\")) {\n    return null;\n  }\n\n  const type = detectChartType(doc);\n  const title = readChartTitle(doc, fallbackName);\n  const seriesElements = Array.from(doc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"ser\");\n  const series = seriesElements\n    .map((element, index) => ({ ...parseChartSeries(element, index), color: readChartSeriesColor(element) }))\n    .filter((item) => item.values.length > 0);\n\n  if (series.length === 0) {\n    return null;\n  }\n\n  return {\n    name: fallbackName,\n    type,\n    title,\n    categories: series.find((item) => item.categories.length > 0)?.categories || [],\n    series: series.map((item) => ({ name: item.name, values: item.values, color: item.color }))\n  };\n}\n\nfunction readChartTitle(doc: Document, fallbackName: string): string {\n  const titleElement = Array.from(doc.getElementsByTagName(\"*\")).find((element) => element.localName === \"title\");\n  if (!titleElement) {\n    return fallbackName.replace(/\\.xml$/i, \"\");\n  }\n  const explicitTitle = chartText(titleElement);\n  if (explicitTitle) {\n    return explicitTitle;\n  }\n  const language = Array.from(doc.getElementsByTagName(\"*\")).find((element) => element.localName === \"lang\")?.getAttribute(\"val\") || \"\";\n  return /^zh\\b/i.test(language) ? \"图表标题\" : \"Chart Title\";\n}\n\nfunction detectChartType(doc: Document): string {\n  const chartType = Array.from(doc.getElementsByTagName(\"*\")).find(\n    (element) => element.localName.endsWith(\"Chart\") && element.localName !== \"chart\"\n  )?.localName;\n  if (!chartType) {\n    return \"chart\";\n  }\n  return chartType.replace(/Chart$/i, \"\").toLowerCase();\n}\n\nfunction parseChartSeries(\n  element: Element,\n  index: number\n): { name: string; values: number[]; categories: string[] } {\n  return {\n    name: textFromFirst(element, \"tx\") || `Series ${index + 1}`,\n    values: numbersFromFirst(element, \"val\"),\n    categories: stringsFromFirst(element, \"cat\")\n  };\n}\n\nfunction readChartSeriesColor(element: Element | undefined): string | undefined {\n  const shape = Array.from(element?.children || []).find((child) => child.localName === \"spPr\");\n  const color = Array.from(shape?.getElementsByTagName(\"*\") || []).find(\n    (child) => child.localName === \"srgbClr\" || child.localName === \"schemeClr\"\n  );\n  if (!color) {\n    return undefined;\n  }\n  if (color.localName === \"srgbClr\") {\n    const value = color.getAttribute(\"val\") || \"\";\n    return /^[\\da-f]{6}$/i.test(value) ? `#${value}` : undefined;\n  }\n  return chartSchemeColor(color.getAttribute(\"val\") || \"\");\n}\n\nfunction chartSchemeColor(value: string): string | undefined {\n  const colors: Record<string, string> = {\n    accent1: \"#156082\",\n    accent2: \"#e97132\",\n    accent3: \"#196b24\",\n    accent4: \"#0f9ed5\",\n    accent5: \"#a02b93\",\n    accent6: \"#4ea72e\"\n  };\n  return colors[value];\n}\n\nfunction renderChartPreviewSection(charts: ChartPreview[]): HTMLElement {\n  const section = createSection(\"表格图表预览\");\n  const grid = document.createElement(\"div\");\n  grid.className = \"ofv-chart-grid\";\n  for (const chart of charts) {\n    grid.append(renderChartCard(chart));\n  }\n  section.append(grid);\n  return section;\n}\n\nfunction renderChartCard(chart: ChartPreview): HTMLElement {\n  const card = document.createElement(\"article\");\n  card.className = \"ofv-chart-card\";\n\n  const header = document.createElement(\"header\");\n  const title = document.createElement(\"h4\");\n  title.textContent = chart.title;\n  const meta = document.createElement(\"span\");\n  meta.textContent = `${chart.type} · ${chart.series.length} 个系列`;\n  header.append(title, meta);\n\n  const svg = renderChartSvg(chart);\n  const details = document.createElement(\"details\");\n  details.className = \"ofv-details ofv-chart-data\";\n  hideSupplementalInfo(details);\n  const summary = document.createElement(\"summary\");\n  summary.textContent = \"数据摘要\";\n  const list = document.createElement(\"ul\");\n  for (const item of chart.series) {\n    const row = document.createElement(\"li\");\n    row.textContent = `${item.name}: ${item.values.slice(0, 12).join(\", \")}${\n      item.values.length > 12 ? ` ... 共 ${item.values.length} 项` : \"\"\n    }`;\n    list.append(row);\n  }\n  details.append(summary, list);\n  card.append(header, svg, details);\n  return card;\n}\n\nfunction renderChartSvg(chart: ChartPreview): SVGSVGElement {\n  const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n  svg.setAttribute(\"viewBox\", \"0 0 640 380\");\n  svg.setAttribute(\"preserveAspectRatio\", \"xMidYMid meet\");\n  svg.setAttribute(\"text-rendering\", \"geometricPrecision\");\n  svg.setAttribute(\"shape-rendering\", \"geometricPrecision\");\n  svg.setAttribute(\"role\", \"img\");\n  svg.setAttribute(\"aria-label\", chart.title);\n  svg.classList.add(\"ofv-chart-svg\");\n\n  const allValues = chart.series.flatMap((item) => item.values).filter((value) => Number.isFinite(value));\n  const max = Math.max(1, ...allValues);\n  const min = Math.min(0, ...allValues);\n  const axisScale = createChartAxisScale(max, min);\n  const axisMax = axisScale.max;\n  const axisMin = axisScale.min;\n  const span = max - min || 1;\n  const colors = [\"#156082\", \"#e97132\", \"#196b24\", \"#0f9ed5\", \"#a02b93\", \"#4ea72e\"];\n  const plot = { x: 74, y: 74, width: 526, height: 214 };\n  const categories = chart.categories.length > 0 ? chart.categories : chart.series[0]?.values.map((_, index) => String(index + 1)) || [];\n\n  const title = appendSvg(svg, \"text\", { x: 320, y: 34, class: \"ofv-chart-title\", \"text-anchor\": \"middle\" });\n  title.textContent = chart.title;\n\n  for (const value of axisScale.ticks) {\n    const y = plot.y + plot.height - ((value - axisMin) / (axisMax - axisMin || 1)) * plot.height;\n    appendSvg(svg, \"line\", {\n      x1: plot.x,\n      y1: Number(y.toFixed(1)),\n      x2: plot.x + plot.width,\n      y2: Number(y.toFixed(1)),\n      class: value === 0 ? \"ofv-chart-axis\" : \"ofv-chart-gridline\"\n    });\n    const label = appendSvg(svg, \"text\", {\n      x: plot.x - 12,\n      y: Number((y + 4).toFixed(1)),\n      class: \"ofv-chart-label\",\n      \"text-anchor\": \"end\"\n    });\n    label.textContent = formatChartTick(value);\n  }\n\n  appendSvg(svg, \"line\", {\n    x1: plot.x,\n    y1: plot.y + plot.height,\n    x2: plot.x + plot.width,\n    y2: plot.y + plot.height,\n    class: \"ofv-chart-axis\"\n  });\n\n  if (chart.type.includes(\"bar\") || chart.type.includes(\"col\")) {\n    const categoryCount = Math.max(1, categories.length, ...chart.series.map((series) => series.values.length));\n    const groupWidth = plot.width / categoryCount;\n    const clusterWidth = groupWidth * 0.58;\n    const barWidth = Math.max(5, Math.min(28, clusterWidth / Math.max(1, chart.series.length)));\n    const zeroY = plot.y + plot.height - ((0 - axisMin) / (axisMax - axisMin || 1)) * plot.height;\n\n    appendChartCategoryLabels(svg, categories, plot, (index) => plot.x + groupWidth * (index + 0.5));\n\n    chart.series.forEach((series, seriesIndex) => {\n      const color = series.color || colors[seriesIndex % colors.length];\n      series.values.forEach((value, index) => {\n        const groupCenter = plot.x + groupWidth * (index + 0.5);\n        const x = groupCenter - (barWidth * chart.series.length) / 2 + seriesIndex * barWidth + barWidth * 0.12;\n        const y = plot.y + plot.height - ((value - axisMin) / (axisMax - axisMin || 1)) * plot.height;\n        appendSvg(svg, \"rect\", {\n          x: Number(x.toFixed(1)),\n          y: Number(Math.min(y, zeroY).toFixed(1)),\n          width: Number((barWidth * 0.76).toFixed(1)),\n          height: Number(Math.max(1, Math.abs(zeroY - y)).toFixed(1)),\n          fill: color,\n          \"data-index\": index\n        });\n      });\n    });\n  } else {\n    const categoryStep = categories.length > 1 ? plot.width / (categories.length - 1) : plot.width;\n    appendChartCategoryLabels(svg, categories, plot, (index) => plot.x + index * categoryStep);\n\n    chart.series.forEach((series, seriesIndex) => {\n      const color = series.color || colors[seriesIndex % colors.length];\n      const step = series.values.length > 1 ? plot.width / (series.values.length - 1) : plot.width;\n      const lineSpan = axisMax - axisMin || span;\n      const points = series.values.map((value, index) => ({\n        x: plot.x + index * step,\n        y: plot.y + plot.height - ((value - axisMin) / lineSpan) * plot.height\n      }));\n\n      appendSvg(svg, \"polyline\", {\n        points: points.map((point) => `${point.x.toFixed(1)},${point.y.toFixed(1)}`).join(\" \"),\n        fill: \"none\",\n        stroke: color,\n        \"stroke-width\": 3,\n        \"stroke-linecap\": \"round\",\n        \"stroke-linejoin\": \"round\"\n      });\n      for (const point of points.slice(0, 80)) {\n        appendSvg(svg, \"circle\", { cx: point.x, cy: point.y, r: 3, fill: color });\n      }\n    });\n  }\n\n  appendChartLegend(svg, chart, colors, 348);\n  return svg;\n}\n\nfunction appendChartCategoryLabels(\n  svg: SVGSVGElement,\n  categories: string[],\n  plot: { x: number; y: number; width: number; height: number },\n  getX: (index: number) => number\n): void {\n  const interval = Math.max(1, Math.ceil(categories.length / 14));\n  categories.forEach((category, index) => {\n    if (index % interval !== 0 && index !== categories.length - 1) {\n      return;\n    }\n    const label = appendSvg(svg, \"text\", {\n      x: Number(getX(index).toFixed(1)),\n      y: plot.y + plot.height + 22,\n      class: \"ofv-chart-label ofv-chart-category-label\",\n      \"data-axis\": \"category\",\n      \"text-anchor\": \"middle\"\n    });\n    label.textContent = truncateChartLabel(category);\n  });\n}\n\nfunction appendChartLegend(svg: SVGSVGElement, chart: ChartPreview, colors: string[], y: number): void {\n  const itemWidth = 86;\n  const startX = 320 - ((chart.series.length * itemWidth) / 2);\n  chart.series.forEach((series, seriesIndex) => {\n    const color = series.color || colors[seriesIndex % colors.length];\n    appendLegend(svg, series.name, color, startX + seriesIndex * itemWidth, y);\n  });\n}\n\nfunction createChartAxisScale(max: number, min: number): { min: number; max: number; ticks: number[] } {\n  const axisMin = Math.min(0, min);\n  const positiveMax = Math.max(1, max);\n  const step = niceChartStep((positiveMax - axisMin) / 5);\n  let axisMax = Math.ceil(positiveMax / step) * step;\n  if (axisMax <= positiveMax) {\n    axisMax += step;\n  }\n  const ticks: number[] = [];\n  for (let value = axisMin; value <= axisMax + step / 2; value += step) {\n    ticks.push(Number(value.toFixed(6)));\n  }\n  return { min: axisMin, max: axisMax, ticks };\n}\n\nfunction niceChartStep(rawStep: number): number {\n  if (rawStep <= 0) {\n    return 1;\n  }\n  const magnitude = 10 ** Math.floor(Math.log10(rawStep));\n  const normalized = rawStep / magnitude;\n  const nice = normalized <= 1 ? 1 : normalized <= 2 ? 2 : normalized <= 5 ? 5 : 10;\n  return nice * magnitude;\n}\n\nfunction formatChartTick(value: number): string {\n  const rounded = Math.abs(value) < 1 ? Number(value.toFixed(1)) : Number(value.toFixed(0));\n  return String(rounded);\n}\n\nfunction truncateChartLabel(value: string): string {\n  return value.length > 10 ? `${value.slice(0, 10)}...` : value;\n}\n\nfunction appendLegend(svg: SVGSVGElement, label: string, color: string, x: number, y: number): void {\n  appendSvg(svg, \"rect\", { x, y: y - 10, width: 12, height: 12, rx: 2, fill: color });\n  const text = appendSvg(svg, \"text\", { x: x + 18, y, class: \"ofv-chart-label\" });\n  text.textContent = label.length > 16 ? `${label.slice(0, 16)}...` : label;\n}\n\nfunction appendSvg<K extends keyof SVGElementTagNameMap>(\n  parent: SVGElement,\n  tag: K,\n  attributes: Record<string, string | number>\n): SVGElementTagNameMap[K] {\n  const element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n  for (const [key, value] of Object.entries(attributes)) {\n    element.setAttribute(key, String(value));\n  }\n  parent.append(element);\n  return element;\n}\n\nfunction textFromFirst(root: ParentNode, localName: string): string {\n  const element = Array.from(root.querySelectorAll(\"*\")).find((item) => item.localName === localName);\n  return element ? chartText(element) : \"\";\n}\n\nfunction stringsFromFirst(root: ParentNode, localName: string): string[] {\n  const element = Array.from(root.querySelectorAll(\"*\")).find((item) => item.localName === localName);\n  if (!element) {\n    return [];\n  }\n  return chartStringValues(element);\n}\n\nfunction numbersFromFirst(root: ParentNode, localName: string): number[] {\n  const element = Array.from(root.querySelectorAll(\"*\")).find((item) => item.localName === localName);\n  if (!element) {\n    return [];\n  }\n  return Array.from(element.querySelectorAll(\"*\"))\n    .filter((item) => item.localName === \"v\")\n    .map((item) => Number(item.textContent || \"\"))\n    .filter((value) => Number.isFinite(value));\n}\n\nfunction chartText(element: Element): string {\n  return (\n    Array.from(element.querySelectorAll(\"*\"))\n      .filter((item) => item.localName === \"v\" || item.localName === \"t\")\n      .map((item) => item.textContent?.trim() || \"\")\n      .find(Boolean) || \"\"\n  );\n}\n\nfunction chartStringValues(element: Element): string[] {\n  return Array.from(element.querySelectorAll(\"*\"))\n    .filter((item) => item.localName === \"v\" || item.localName === \"t\")\n    .map((item) => item.textContent?.trim() || \"\")\n    .filter(Boolean);\n}\n\ntype SheetViewport = {\n  rowStart: number;\n  columnStart: number;\n  rowCount: number;\n  columnCount: number;\n};\n\ntype SheetWindowControls = {\n  element: HTMLElement;\n  update: () => void;\n};\n\ntype SheetRange = {\n  s: { r: number; c: number };\n  e: { r: number; c: number };\n};\n\ntype SheetMergeRenderInfo = {\n  rowspan: number;\n  colspan: number;\n  sourceRow: number;\n  sourceColumn: number;\n};\n\ntype SheetColumnSizing = {\n  widths: Map<number, number>;\n  sourceColumns?: Map<number, WorkbookColumnWidthSource>;\n  sourceDefaultColumn?: WorkbookColumnWidthSource;\n  sourceMdw?: number;\n};\n\ntype WorkbookSheetColumnWidthMetadata = {\n  columns: Map<number, WorkbookColumnWidthSource>;\n  defaultColumn?: WorkbookColumnWidthSource;\n  mdw?: number;\n};\n\ntype WorkbookColumnWidthSource = {\n  hidden?: boolean;\n  width?: number;\n};\n\ntype WorkbookSheetImage = {\n  row: number;\n  column: number;\n  endRow?: number;\n  endColumn?: number;\n  fileName: string;\n  mimeType: string;\n  dataUrl: string;\n  title?: string;\n};\n\ntype WorkbookRichTextRun = {\n  text: string;\n  bold?: boolean;\n  italic?: boolean;\n  underline?: boolean;\n  strike?: boolean;\n  color?: string;\n  fontSize?: number;\n};\n\ntype WorkbookCellStyleMetadata = {\n  font?: WorkbookCellFontStyle;\n  wrapText?: boolean;\n};\n\ntype WorkbookCellFontStyle = {\n  bold?: boolean;\n  italic?: boolean;\n  underline?: boolean;\n  strike?: boolean;\n  sz?: number;\n  color?: WorkbookColorSource;\n};\n\ntype WorkbookColorSource = {\n  rgb?: string;\n  indexed?: number;\n};\n\nfunction trimWorkbookSheetRange(\n  sheet: Record<string, any>,\n  range: SheetRange,\n  decodeCell: (address: string) => { r: number; c: number },\n  images: WorkbookSheetImage[] = []\n): SheetRange {\n  let minRow = Number.POSITIVE_INFINITY;\n  let minColumn = Number.POSITIVE_INFINITY;\n  let maxRow = Number.NEGATIVE_INFINITY;\n  let maxColumn = Number.NEGATIVE_INFINITY;\n  const include = (row: number, column: number) => {\n    minRow = Math.min(minRow, row);\n    minColumn = Math.min(minColumn, column);\n    maxRow = Math.max(maxRow, row);\n    maxColumn = Math.max(maxColumn, column);\n  };\n\n  for (const [address, cell] of Object.entries(sheet)) {\n    if (address.startsWith(\"!\")) {\n      continue;\n    }\n    if (!cell || (cell.v == null && !cell.f && !cell.w && !cell.h)) {\n      continue;\n    }\n    const decoded = decodeCell(address);\n    include(decoded.r, decoded.c);\n  }\n\n  for (const merge of (sheet[\"!merges\"] || []) as SheetRange[]) {\n    include(merge.s.r, merge.s.c);\n    include(merge.e.r, merge.e.c);\n  }\n\n  for (const image of images) {\n    include(image.row, image.column);\n    include(image.endRow ?? image.row, image.endColumn ?? image.column);\n  }\n\n  if (!Number.isFinite(minRow) || !Number.isFinite(minColumn) || !Number.isFinite(maxRow) || !Number.isFinite(maxColumn)) {\n    return range;\n  }\n\n  return {\n    s: {\n      r: minRow,\n      c: minColumn\n    },\n    e: {\n      r: maxRow,\n      c: maxColumn\n    }\n  };\n}\n\nfunction createSheetViewport(rowCount: number, columnCount: number): SheetViewport {\n  return {\n    rowStart: 0,\n    columnStart: 0,\n    rowCount,\n    columnCount\n  };\n}\n\nfunction createSheetWindowControls(viewport: SheetViewport, render: () => void): SheetWindowControls | null {\n  const needsRows = viewport.rowCount > SHEET_WINDOW_ROWS;\n  const needsColumns = viewport.columnCount > SHEET_WINDOW_COLUMNS;\n  if (!needsRows && !needsColumns) {\n    return null;\n  }\n\n  const controls = document.createElement(\"div\");\n  controls.className = \"ofv-sheet-window\";\n\n  const note = document.createElement(\"span\");\n  note.className = \"ofv-sheet-window-note\";\n\n  const rowBack = createWindowButton(\"上 200 行\", () => {\n    viewport.rowStart = Math.max(0, viewport.rowStart - SHEET_WINDOW_ROWS);\n    render();\n  });\n  const rowNext = createWindowButton(\"下 200 行\", () => {\n    viewport.rowStart = Math.min(maxStart(viewport.rowCount, SHEET_WINDOW_ROWS), viewport.rowStart + SHEET_WINDOW_ROWS);\n    render();\n  });\n  const colBack = createWindowButton(\"左 80 列\", () => {\n    viewport.columnStart = Math.max(0, viewport.columnStart - SHEET_WINDOW_COLUMNS);\n    render();\n  });\n  const colNext = createWindowButton(\"右 80 列\", () => {\n    viewport.columnStart = Math.min(\n      maxStart(viewport.columnCount, SHEET_WINDOW_COLUMNS),\n      viewport.columnStart + SHEET_WINDOW_COLUMNS\n    );\n    render();\n  });\n\n  controls.append(note, rowBack, rowNext, colBack, colNext);\n\n  const update = () => {\n    const rowEnd = Math.min(viewport.rowStart + SHEET_WINDOW_ROWS, viewport.rowCount);\n    const columnEnd = Math.min(viewport.columnStart + SHEET_WINDOW_COLUMNS, viewport.columnCount);\n    note.textContent = `大表格窗口化渲染：当前 ${viewport.rowStart + 1}-${rowEnd} 行，${viewport.columnStart + 1}-${columnEnd} 列`;\n    rowBack.disabled = viewport.rowStart === 0;\n    rowNext.disabled = viewport.rowStart >= maxStart(viewport.rowCount, SHEET_WINDOW_ROWS);\n    colBack.disabled = viewport.columnStart === 0;\n    colNext.disabled = viewport.columnStart >= maxStart(viewport.columnCount, SHEET_WINDOW_COLUMNS);\n    rowBack.hidden = rowNext.hidden = !needsRows;\n    colBack.hidden = colNext.hidden = !needsColumns;\n  };\n\n  update();\n  return { element: controls, update };\n}\n\nfunction createWindowButton(label: string, onClick: () => void): HTMLButtonElement {\n  const button = document.createElement(\"button\");\n  button.type = \"button\";\n  button.textContent = label;\n  button.addEventListener(\"click\", onClick);\n  return button;\n}\n\nfunction maxStart(total: number, size: number): number {\n  return Math.max(0, total - size);\n}\n\nfunction createWorkbookSheetTable(\n  sheet: Record<string, any>,\n  range: SheetRange,\n  sheetIndex: number,\n  viewport: SheetViewport,\n  encodeCell: (cell: { r: number; c: number }) => string,\n  formatCell: (cell: any) => string,\n  columnSizing: SheetColumnSizing,\n  rerender: () => void,\n  images: WorkbookSheetImage[] = [],\n  richTextByCell: Map<string, WorkbookRichTextRun[]> = new Map(),\n  cellStylesByCell: Map<string, WorkbookCellStyleMetadata> = new Map()\n): HTMLTableElement {\n  const table = document.createElement(\"table\");\n  table.id = `ofv-sheet-${sheetIndex + 1}`;\n  table.className = \"ofv-workbook-table\";\n  const rowEnd = Math.min(range.s.r + viewport.rowStart + SHEET_WINDOW_ROWS - 1, range.e.r);\n  const columnEnd = Math.min(range.s.c + viewport.columnStart + SHEET_WINDOW_COLUMNS - 1, range.e.c);\n  const columnStart = range.s.c + viewport.columnStart;\n  const rowStart = range.s.r + viewport.rowStart;\n  const mergePlan = createSheetMergePlan(sheet[\"!merges\"] || [], rowStart, rowEnd, columnStart, columnEnd);\n  const imagesByCell = groupWorkbookImagesByCell(images);\n\n  const colGroup = document.createElement(\"colgroup\");\n  let tableWidth = 0;\n  for (let columnIndex = columnStart; columnIndex <= columnEnd; columnIndex += 1) {\n    const col = document.createElement(\"col\");\n    const width =\n      columnSizing.widths.get(columnIndex) ??\n      getWorkbookColumnWidth(\n        sheet[\"!cols\"]?.[columnIndex],\n        columnSizing.sourceColumns?.get(columnIndex),\n        columnSizing.sourceDefaultColumn,\n        columnSizing.sourceMdw\n      );\n    col.dataset.columnIndex = String(columnIndex);\n    col.style.width = `${width}px`;\n    tableWidth += width;\n    colGroup.append(col);\n  }\n  table.style.width = `${tableWidth}px`;\n  table.append(colGroup);\n\n  for (let rowIndex = rowStart; rowIndex <= rowEnd; rowIndex += 1) {\n    const row = document.createElement(\"tr\");\n    const rowHeight = getSheetRowHeight(sheet[\"!rows\"]?.[rowIndex]);\n    if (rowHeight) {\n      row.style.height = `${rowHeight}px`;\n    }\n    for (let columnIndex = columnStart; columnIndex <= columnEnd; columnIndex += 1) {\n      const address = encodeCell({ r: rowIndex, c: columnIndex });\n      const coordinateKey = `${rowIndex}:${columnIndex}`;\n      if (mergePlan.covered.has(coordinateKey)) {\n        continue;\n      }\n      const merge = mergePlan.anchors.get(coordinateKey);\n      const sourceAddress = merge ? encodeCell({ r: merge.sourceRow, c: merge.sourceColumn }) : address;\n      const sourceCell = sheet[sourceAddress];\n      const sourceStyle = sourceAddress ? cellStylesByCell.get(sourceAddress) : undefined;\n      const cell = document.createElement(rowIndex === range.s.r ? \"th\" : \"td\");\n      cell.dataset.cell = address;\n      if (sourceAddress !== address) {\n        cell.dataset.sourceCell = sourceAddress;\n      }\n      if (merge) {\n        cell.classList.add(\"ofv-cell-merged\");\n        if (merge.rowspan > 1) {\n          cell.rowSpan = merge.rowspan;\n        }\n        if (merge.colspan > 1) {\n          cell.colSpan = merge.colspan;\n        }\n      }\n      const text = sourceCell ? formatCell(sourceCell) : \"\";\n      const richText = sourceAddress ? richTextByCell.get(sourceAddress) : undefined;\n      if (richText?.length) {\n        appendWorkbookCellRichText(cell, richText);\n      } else if (hasWorkbookCellHtmlRichText(sourceCell)) {\n        appendWorkbookCellHtmlRichText(cell, sourceCell.h);\n      } else {\n        cell.textContent = text;\n      }\n      if (text) {\n        cell.title = text;\n      }\n      if (isWorkbookNumericCell(sourceCell)) {\n        cell.classList.add(\"ofv-cell-number\");\n      }\n      applyWorkbookCellStyle(cell, sourceCell, sourceStyle);\n      if (sourceCell?.f) {\n        cell.classList.add(\"ofv-cell-formula\");\n        cell.title = `=${sourceCell.f}`;\n      }\n      if (text.includes(\"\\n\")) {\n        cell.classList.add(\"ofv-cell-multiline\");\n      }\n      appendWorkbookCellImages(cell, imagesByCell.get(`${rowIndex}:${columnIndex}`), text);\n      if (rowIndex === rowStart) {\n        appendColumnResizeHandle(cell, columnIndex, columnSizing);\n      }\n      row.append(cell);\n    }\n    table.append(row);\n  }\n\n  return table;\n}\n\nfunction getWorkbookColumnWidth(\n  column: { hidden?: boolean; wpx?: number; width?: number; wch?: number; MDW?: number } | undefined,\n  sourceColumn?: WorkbookColumnWidthSource,\n  sourceDefaultColumn?: WorkbookColumnWidthSource,\n  sourceMdw?: number\n): number {\n  if (sourceColumn) {\n    return getSheetColumnWidth({ ...sourceColumn, MDW: sourceMdw ?? column?.MDW });\n  }\n  if (column) {\n    return getSheetColumnWidth(column);\n  }\n  return sourceDefaultColumn ? getSheetColumnWidth({ ...sourceDefaultColumn, MDW: sourceMdw }) : getSheetColumnWidth(undefined);\n}\n\nfunction appendColumnResizeHandle(\n  cell: HTMLTableCellElement,\n  columnIndex: number,\n  columnSizing: SheetColumnSizing\n): void {\n  const handle = document.createElement(\"span\");\n  handle.className = \"ofv-column-resize-handle\";\n  handle.setAttribute(\"aria-hidden\", \"true\");\n  handle.addEventListener(\"pointerdown\", (event) => {\n    event.preventDefault();\n    event.stopPropagation();\n    const startX = event.clientX;\n    // Pointer deltas are in visual pixels; column widths live in the table's\n    // pre-zoom coordinate space, so divide the delta by the current zoom.\n    const zoom = getOfficePanelZoom(cell);\n    const startWidth = columnSizing.widths.get(columnIndex) ?? cell.getBoundingClientRect().width / zoom;\n    handle.setPointerCapture(event.pointerId);\n    const onMove = (moveEvent: PointerEvent) => {\n      const nextWidth = Math.max(48, Math.min(720, Math.round(startWidth + (moveEvent.clientX - startX) / zoom)));\n      columnSizing.widths.set(columnIndex, nextWidth);\n      updateRenderedColumnWidth(cell, columnIndex, nextWidth);\n    };\n    const onEnd = () => {\n      handle.removeEventListener(\"pointermove\", onMove);\n      handle.removeEventListener(\"pointerup\", onEnd);\n      handle.removeEventListener(\"pointercancel\", onEnd);\n    };\n    handle.addEventListener(\"pointermove\", onMove);\n    handle.addEventListener(\"pointerup\", onEnd);\n    handle.addEventListener(\"pointercancel\", onEnd);\n  });\n  cell.append(handle);\n}\n\nfunction updateRenderedColumnWidth(cell: HTMLTableCellElement, columnIndex: number, width: number): void {\n  const table = cell.closest(\"table\");\n  if (!table) {\n    return;\n  }\n\n  const column = Array.from(table.querySelectorAll<HTMLTableColElement>(\"col\")).find(\n    (col) => col.dataset.columnIndex === String(columnIndex)\n  );\n  if (column) {\n    column.style.width = `${width}px`;\n  }\n\n  const tableWidth = Array.from(table.querySelectorAll<HTMLTableColElement>(\"col\")).reduce((sum, col) => {\n    const parsed = Number.parseFloat(col.style.width);\n    return sum + (Number.isFinite(parsed) ? parsed : 0);\n  }, 0);\n  if (tableWidth > 0) {\n    table.style.width = `${Math.round(tableWidth)}px`;\n    resetSheetTableZoomLock(table);\n  }\n}\n\nfunction createSheetMergePlan(\n  merges: SheetRange[],\n  rowStart: number,\n  rowEnd: number,\n  columnStart: number,\n  columnEnd: number\n): { anchors: Map<string, SheetMergeRenderInfo>; covered: Set<string> } {\n  const anchors = new Map<string, SheetMergeRenderInfo>();\n  const covered = new Set<string>();\n  const encode = (row: number, column: number) => `${row}:${column}`;\n\n  for (const merge of merges) {\n    if (merge.e.r < rowStart || merge.s.r > rowEnd || merge.e.c < columnStart || merge.s.c > columnEnd) {\n      continue;\n    }\n\n    const visibleStartRow = Math.max(merge.s.r, rowStart);\n    const visibleEndRow = Math.min(merge.e.r, rowEnd);\n    const visibleStartColumn = Math.max(merge.s.c, columnStart);\n    const visibleEndColumn = Math.min(merge.e.c, columnEnd);\n    const anchor = encode(visibleStartRow, visibleStartColumn);\n    anchors.set(anchor, {\n      rowspan: visibleEndRow - visibleStartRow + 1,\n      colspan: visibleEndColumn - visibleStartColumn + 1,\n      sourceRow: merge.s.r,\n      sourceColumn: merge.s.c\n    });\n\n    for (let rowIndex = visibleStartRow; rowIndex <= visibleEndRow; rowIndex += 1) {\n      for (let columnIndex = visibleStartColumn; columnIndex <= visibleEndColumn; columnIndex += 1) {\n        const address = encode(rowIndex, columnIndex);\n        if (address !== anchor) {\n          covered.add(address);\n        }\n      }\n    }\n  }\n\n  return { anchors, covered };\n}\n\nfunction groupWorkbookImagesByCell(images: WorkbookSheetImage[]): Map<string, WorkbookSheetImage[]> {\n  const grouped = new Map<string, WorkbookSheetImage[]>();\n  for (const image of images) {\n    const key = `${image.row}:${image.column}`;\n    const items = grouped.get(key) || [];\n    items.push(image);\n    grouped.set(key, items);\n  }\n  return grouped;\n}\n\nfunction hasWorkbookCellHtmlRichText(sourceCell: any): sourceCell is { h: string } {\n  return typeof sourceCell?.h === \"string\" && /<(?:span|b|strong|i|em|u|s|font)\\b/i.test(sourceCell.h);\n}\n\nfunction appendWorkbookCellHtmlRichText(cell: HTMLTableCellElement, html: string): void {\n  cell.classList.add(\"ofv-cell-rich-text\");\n  cell.innerHTML = sanitizeWorkbookCellHtmlRichText(html);\n  normalizeWorkbookCellHtmlRichText(cell);\n}\n\nfunction sanitizeWorkbookCellHtmlRichText(html: string): string {\n  return DOMPurify.sanitize(html, {\n    USE_PROFILES: { html: true },\n    ALLOWED_TAGS: [\"span\", \"b\", \"strong\", \"i\", \"em\", \"u\", \"s\", \"font\", \"br\"],\n    ALLOWED_ATTR: [\"style\", \"color\"],\n    ALLOW_DATA_ATTR: false\n  });\n}\n\nfunction normalizeWorkbookCellHtmlRichText(cell: HTMLTableCellElement): void {\n  for (const element of Array.from(cell.querySelectorAll<HTMLElement>(\"span, b, strong, i, em, u, s, font\"))) {\n    element.classList.add(\"ofv-rich-text-run\");\n    if (element instanceof HTMLFontElement && element.color) {\n      element.style.color = element.color;\n      element.removeAttribute(\"color\");\n    }\n  }\n}\n\nfunction appendWorkbookCellRichText(cell: HTMLTableCellElement, runs: WorkbookRichTextRun[]): void {\n  cell.classList.add(\"ofv-cell-rich-text\");\n  for (const run of runs) {\n    const span = document.createElement(\"span\");\n    span.className = \"ofv-rich-text-run\";\n    span.textContent = run.text;\n    if (run.bold) {\n      span.style.fontWeight = \"700\";\n    }\n    if (run.italic) {\n      span.style.fontStyle = \"italic\";\n    }\n    if (run.underline || run.strike) {\n      span.style.textDecoration = [run.underline ? \"underline\" : \"\", run.strike ? \"line-through\" : \"\"]\n        .filter(Boolean)\n        .join(\" \");\n    }\n    if (run.color) {\n      span.style.color = readableSheetInk(run.color);\n    }\n    if (run.fontSize) {\n      span.style.fontSize = `${Math.max(9, Math.min(24, run.fontSize))}pt`;\n    }\n    cell.append(span);\n  }\n}\n\nfunction appendWorkbookCellImages(cell: HTMLTableCellElement, images: WorkbookSheetImage[] | undefined, text: string): void {\n  if (!images?.length) {\n    return;\n  }\n  if (isWorkbookImagePlaceholderValue(text)) {\n    cell.textContent = \"\";\n    cell.removeAttribute(\"title\");\n  }\n  cell.classList.add(\"ofv-cell-image\");\n  for (const image of images) {\n    const figure = document.createElement(\"figure\");\n    figure.className = \"ofv-workbook-image\";\n    const element = document.createElement(\"img\");\n    element.src = image.dataUrl;\n    element.alt = image.title || image.fileName || \"Excel embedded image\";\n    element.loading = \"lazy\";\n    figure.append(element);\n    cell.append(figure);\n  }\n}\n\nfunction isWorkbookImagePlaceholderValue(text: string): boolean {\n  return /^#(?:VALUE|NAME|REF|N\\/A|NULL|NUM|DIV\\/0)!?$/i.test(text.trim());\n}\n\nfunction isWorkbookNumericCell(sourceCell: any): boolean {\n  return sourceCell?.t === \"n\";\n}\n\nfunction getSheetColumnWidth(column: { hidden?: boolean; wpx?: number; width?: number; wch?: number; MDW?: number } | undefined): number {\n  if (column?.hidden) {\n    return 0;\n  }\n  const mdw = Number.isFinite(column?.MDW) && column?.MDW ? column.MDW : 7;\n  const width = column?.wpx || (column?.wch ? column.wch * mdw + 5 : undefined) || (column?.width ? column.width * mdw : undefined) || 96;\n  return Math.max(28, Math.min(960, Math.round(width)));\n}\n\nfunction findExcelColumnMdw(width: number): number {\n  const defaultMdw = 6;\n  let bestMdw = defaultMdw;\n  let bestDelta = Math.abs(width - cycleExcelColumnWidth(width, defaultMdw));\n  if (bestDelta <= 0.005) {\n    return bestMdw;\n  }\n  for (let mdw = 1; mdw < 15; mdw += 1) {\n    const delta = Math.abs(width - cycleExcelColumnWidth(width, mdw));\n    if (delta <= bestDelta) {\n      bestDelta = delta;\n      bestMdw = mdw;\n    }\n  }\n  return bestMdw;\n}\n\nfunction cycleExcelColumnWidth(width: number, mdw: number): number {\n  const px = Math.floor((width + Math.round(128 / mdw) / 256) * mdw);\n  const chars = Math.floor(((px - 5) / mdw) * 100 + 0.5) / 100;\n  return Math.round(((chars * mdw + 5) / mdw) * 256) / 256;\n}\n\nfunction getSheetRowHeight(row: { hidden?: boolean; hpx?: number; hpt?: number } | undefined): number | undefined {\n  if (row?.hidden) {\n    return 0;\n  }\n  const height = row?.hpx || (row?.hpt ? row.hpt * 1.333 : undefined);\n  return height ? Math.max(18, Math.min(260, Math.round(height))) : undefined;\n}\n\nfunction applyWorkbookCellStyle(\n  cell: HTMLTableCellElement,\n  sourceCell: any,\n  sourceStyleMetadata?: WorkbookCellStyleMetadata\n): void {\n  const style = sourceCell?.s;\n  const sourceFont = sourceStyleMetadata?.font || style?.font;\n  const wrapText = sourceStyleMetadata?.wrapText || Boolean(style?.alignment?.wrapText);\n  if (!style && !sourceFont && !wrapText) {\n    return;\n  }\n\n  const parsedFill = readWorkbookColor(style?.fgColor || style?.fill?.fgColor);\n  const fill = style?.patternType === \"none\" ? undefined : parsedFill;\n  if (fill) {\n    cell.style.backgroundColor = fill;\n  }\n\n  const fontColor = sourceFont ? readWorkbookColor(sourceFont.color) : undefined;\n  if (sourceFont) {\n    if (sourceFont.bold) {\n      cell.style.fontWeight = \"700\";\n    }\n    if (sourceFont.italic) {\n      cell.style.fontStyle = \"italic\";\n    }\n    if (sourceFont.underline || sourceFont.strike) {\n      cell.style.textDecoration = [sourceFont.underline ? \"underline\" : \"\", sourceFont.strike ? \"line-through\" : \"\"]\n        .filter(Boolean)\n        .join(\" \");\n    }\n    if (sourceFont.sz) {\n      cell.style.fontSize = `${Math.max(9, Math.min(24, Number(sourceFont.sz)))}pt`;\n    }\n  }\n  applyWorkbookCellInk(cell, fill, fontColor);\n\n  const alignment = style?.alignment;\n  if (alignment) {\n    const horizontal = normalizeSheetHorizontalAlign(alignment.horizontal);\n    if (horizontal) {\n      cell.style.textAlign = horizontal;\n    }\n    const vertical = normalizeSheetVerticalAlign(alignment.vertical);\n    if (vertical) {\n      cell.style.verticalAlign = vertical;\n    }\n  }\n  if (wrapText) {\n    cell.classList.add(\"ofv-cell-multiline\");\n  }\n}\n\nfunction readWorkbookColor(color: { rgb?: string; indexed?: number } | undefined): string | undefined {\n  if (!color?.rgb) {\n    return undefined;\n  }\n  const rgb = color.rgb.length === 8 ? color.rgb.slice(2) : color.rgb;\n  return /^[\\da-f]{6}$/i.test(rgb) ? `#${rgb}` : undefined;\n}\n\nfunction parseOptionalInteger(value: string | null | undefined): number | undefined {\n  const parsed = Number.parseInt(value || \"\", 10);\n  return Number.isFinite(parsed) ? parsed : undefined;\n}\n\n// Cell fills and font colors from the file assume Excel's white canvas. The\n// sheet grid stays on a light surface in both viewer themes (style.css pins\n// it in dark mode), so resolve one theme-independent ink per cell.\nfunction applyWorkbookCellInk(cell: HTMLTableCellElement, fill: string | undefined, fontColor: string | undefined): void {\n  if (fill) {\n    // Inline colors: a filled cell is self-contained and theme-independent.\n    cell.style.color = fontColor ?? (sheetColorLuminance(fill) < 0.42 ? \"#f8fafc\" : \"#1f2937\");\n    return;\n  }\n  if (fontColor) {\n    // No fill: the ink sits on the always-light grid surface; clamp only the\n    // near-white colors that would vanish on it.\n    cell.style.color = readableSheetInk(fontColor);\n  }\n}\n\nfunction sheetColorLuminance(hex: string): number {\n  const channels = [hex.slice(1, 3), hex.slice(3, 5), hex.slice(5, 7)].map((part) => {\n    const value = parseInt(part, 16) / 255;\n    return value <= 0.03928 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4;\n  });\n  return 0.2126 * channels[0] + 0.7152 * channels[1] + 0.0722 * channels[2];\n}\n\n// Keep the hue but clamp lightness so the ink stays legible on the light grid surface.\nfunction readableSheetInk(hex: string): string {\n  const luminance = sheetColorLuminance(hex);\n  if (luminance <= 0.62) {\n    return hex;\n  }\n  const [h, s, l] = sheetHexToHsl(hex);\n  return sheetHslToHex(h, s, Math.min(l, 0.42));\n}\n\nfunction sheetHexToHsl(hex: string): [number, number, number] {\n  const r = parseInt(hex.slice(1, 3), 16) / 255;\n  const g = parseInt(hex.slice(3, 5), 16) / 255;\n  const b = parseInt(hex.slice(5, 7), 16) / 255;\n  const max = Math.max(r, g, b);\n  const min = Math.min(r, g, b);\n  const l = (max + min) / 2;\n  if (max === min) {\n    return [0, 0, l];\n  }\n  const d = max - min;\n  const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n  let h: number;\n  if (max === r) {\n    h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n  } else if (max === g) {\n    h = ((b - r) / d + 2) / 6;\n  } else {\n    h = ((r - g) / d + 4) / 6;\n  }\n  return [h, s, l];\n}\n\nfunction sheetHslToHex(h: number, s: number, l: number): string {\n  const hueToChannel = (p: number, q: number, t: number): number => {\n    let value = t;\n    if (value < 0) value += 1;\n    if (value > 1) value -= 1;\n    if (value < 1 / 6) return p + (q - p) * 6 * value;\n    if (value < 1 / 2) return q;\n    if (value < 2 / 3) return p + (q - p) * (2 / 3 - value) * 6;\n    return p;\n  };\n  let r: number;\n  let g: number;\n  let b: number;\n  if (s === 0) {\n    r = g = b = l;\n  } else {\n    const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n    const p = 2 * l - q;\n    r = hueToChannel(p, q, h + 1 / 3);\n    g = hueToChannel(p, q, h);\n    b = hueToChannel(p, q, h - 1 / 3);\n  }\n  const toHex = (value: number): string =>\n    Math.round(value * 255)\n      .toString(16)\n      .padStart(2, \"0\");\n  return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nfunction normalizeSheetHorizontalAlign(value: string | undefined): string | undefined {\n  if (value === \"center\" || value === \"right\" || value === \"left\" || value === \"justify\") {\n    return value;\n  }\n  return undefined;\n}\n\nfunction normalizeSheetVerticalAlign(value: string | undefined): string | undefined {\n  if (value === \"top\" || value === \"middle\" || value === \"bottom\") {\n    return value;\n  }\n  return undefined;\n}\n\nfunction createParsedSheetTable(\n  sheet: ParsedSheet,\n  sheetIndex: number,\n  viewport: SheetViewport,\n  columnSizing: SheetColumnSizing,\n  rerender: () => void\n): HTMLTableElement {\n  const table = document.createElement(\"table\");\n  table.id = `ofv-sheet-${sheetIndex + 1}`;\n  const formulaMap = new Map(sheet.formulas.map((item) => [item.address, item.formula]));\n  const rowEnd = Math.min(viewport.rowStart + SHEET_WINDOW_ROWS, sheet.rows.length);\n  const columnEnd = Math.min(viewport.columnStart + SHEET_WINDOW_COLUMNS, viewport.columnCount);\n  const colGroup = document.createElement(\"colgroup\");\n  let tableWidth = 0;\n  for (let columnIndex = viewport.columnStart; columnIndex < columnEnd; columnIndex += 1) {\n    const width = columnSizing.widths.get(columnIndex) ?? 112;\n    const col = document.createElement(\"col\");\n    col.dataset.columnIndex = String(columnIndex);\n    col.style.width = `${width}px`;\n    tableWidth += width;\n    colGroup.append(col);\n  }\n  table.style.width = `${tableWidth}px`;\n  table.append(colGroup);\n\n  for (let rowIndex = viewport.rowStart; rowIndex < rowEnd; rowIndex += 1) {\n    const sourceRow = sheet.rows[rowIndex] || [];\n    const row = document.createElement(\"tr\");\n    for (let columnIndex = viewport.columnStart; columnIndex < columnEnd; columnIndex += 1) {\n      const value = sourceRow[columnIndex] || \"\";\n      const cell = document.createElement(rowIndex === 0 ? \"th\" : \"td\");\n      const address = encodeA1(rowIndex, columnIndex);\n      cell.dataset.cell = address;\n      cell.textContent = value;\n      if (value) {\n        cell.title = value;\n      }\n      const formula = formulaMap.get(address);\n      if (formula) {\n        cell.classList.add(\"ofv-cell-formula\");\n        cell.title = formula;\n      }\n      if (value.includes(\"\\n\")) {\n        cell.classList.add(\"ofv-cell-multiline\");\n      }\n      if (rowIndex === viewport.rowStart) {\n        appendColumnResizeHandle(cell, columnIndex, columnSizing);\n      }\n      row.append(cell);\n    }\n    table.append(row);\n  }\n  return table;\n}\n\nfunction parseFlatOds(xml: string): ParsedSheet[] {\n  const documentXml = new DOMParser().parseFromString(xml, \"application/xml\");\n  if (documentXml.querySelector(\"parsererror\")) {\n    return [];\n  }\n\n  return Array.from(documentXml.getElementsByTagName(\"*\"))\n    .filter((element) => element.localName === \"table\")\n    .map((tableElement, tableIndex) => parseFlatOdsTable(tableElement, tableIndex))\n    .filter((sheet) => sheet.rows.length > 0);\n}\n\nfunction parseFlatOdsTable(tableElement: Element, tableIndex: number): ParsedSheet {\n  const rows: string[][] = [];\n  const formulas: Array<{ address: string; formula: string }> = [];\n  const sheetName = getXmlAttribute(tableElement, \"name\") || `Sheet ${tableIndex + 1}`;\n  for (const rowElement of Array.from(tableElement.children).filter((element) => element.localName === \"table-row\")) {\n    const repeatRows = clampRepeat(getXmlAttribute(rowElement, \"number-rows-repeated\"), 200);\n    const parsedRow = parseFlatOdsRow(rowElement, rows.length, formulas);\n    for (let index = 0; index < repeatRows; index += 1) {\n      rows.push([...parsedRow]);\n    }\n  }\n  trimEmptyTrailingRows(rows);\n  return { name: sheetName, rows, formulas };\n}\n\nfunction parseFlatOdsRow(\n  rowElement: Element,\n  rowIndex: number,\n  formulas: Array<{ address: string; formula: string }>\n): string[] {\n  const row: string[] = [];\n  for (const cellElement of Array.from(rowElement.children).filter(\n    (element) => element.localName === \"table-cell\" || element.localName === \"covered-table-cell\"\n  )) {\n    const repeatColumns = clampRepeat(getXmlAttribute(cellElement, \"number-columns-repeated\"), 256);\n    const value = extractFlatOdsCellValue(cellElement);\n    const formula = getXmlAttribute(cellElement, \"formula\");\n    for (let index = 0; index < repeatColumns; index += 1) {\n      const columnIndex = row.length;\n      row.push(value);\n      if (formula) {\n        formulas.push({ address: encodeA1(rowIndex, columnIndex), formula });\n      }\n    }\n  }\n  trimEmptyTrailingCells(row);\n  return row;\n}\n\nfunction extractFlatOdsCellValue(cellElement: Element): string {\n  const text = extractOpenDocumentTextFromElement(cellElement);\n  if (text) {\n    return text;\n  }\n  return (\n    getXmlAttribute(cellElement, \"value\") ||\n    getXmlAttribute(cellElement, \"date-value\") ||\n    getXmlAttribute(cellElement, \"time-value\") ||\n    getXmlAttribute(cellElement, \"boolean-value\") ||\n    \"\"\n  );\n}\n\nfunction extractOpenDocumentTextFromElement(element: Element): string {\n  const fragments: string[] = [];\n  const visit = (node: Node) => {\n    if (node.nodeType === Node.TEXT_NODE) {\n      fragments.push(node.textContent || \"\");\n      return;\n    }\n    if (!(node instanceof Element)) {\n      return;\n    }\n    if (node.localName === \"s\") {\n      fragments.push(\" \".repeat(clampRepeat(getXmlAttribute(node, \"c\"), 64)));\n      return;\n    }\n    if (node.localName === \"tab\") {\n      fragments.push(\"\\t\");\n      return;\n    }\n    if (node.localName === \"line-break\") {\n      fragments.push(\"\\n\");\n      return;\n    }\n    for (const child of Array.from(node.childNodes)) {\n      visit(child);\n    }\n    if (node.localName === \"p\" || node.localName === \"h\") {\n      fragments.push(\"\\n\");\n    }\n  };\n  visit(element);\n  return fragments.join(\"\").replace(/\\n+$/g, \"\").trim();\n}\n\nfunction getXmlAttribute(element: Element, localName: string): string | null {\n  const direct = element.getAttribute(localName);\n  if (direct !== null) {\n    return direct;\n  }\n  for (const attribute of Array.from(element.attributes)) {\n    if (attribute.localName === localName) {\n      return attribute.value;\n    }\n  }\n  return null;\n}\n\nfunction clampRepeat(value: string | null, max: number): number {\n  const parsed = value ? Number.parseInt(value, 10) : 1;\n  if (!Number.isFinite(parsed) || parsed < 1) {\n    return 1;\n  }\n  return Math.min(parsed, max);\n}\n\nfunction trimEmptyTrailingRows(rows: string[][]): void {\n  while (rows.length > 0 && rows[rows.length - 1].every((cell) => cell === \"\")) {\n    rows.pop();\n  }\n}\n\nfunction trimEmptyTrailingCells(row: string[]): void {\n  while (row.length > 0 && row[row.length - 1] === \"\") {\n    row.pop();\n  }\n}\n\nfunction collectFormulaRows(\n  sheet: Record<string, any>,\n  range: { s: { r: number; c: number }; e: { r: number; c: number } },\n  encodeCell: (cell: { r: number; c: number }) => string\n): Array<{ address: string; formula: string }> {\n  const formulas: Array<{ address: string; formula: string }> = [];\n  for (let row = range.s.r; row <= range.e.r; row += 1) {\n    for (let column = range.s.c; column <= range.e.c; column += 1) {\n      const address = encodeCell({ r: row, c: column });\n      const cell = sheet[address];\n      if (cell?.f) {\n        formulas.push({ address, formula: `=${cell.f}` });\n      }\n    }\n  }\n  return formulas;\n}\n\nfunction encodeA1(rowIndex: number, columnIndex: number): string {\n  let column = \"\";\n  let value = columnIndex + 1;\n  while (value > 0) {\n    const remainder = (value - 1) % 26;\n    column = String.fromCharCode(65 + remainder) + column;\n    value = Math.floor((value - 1) / 26);\n  }\n  return `${column}${rowIndex + 1}`;\n}\n\nasync function renderPptx(panel: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n  const container = document.createElement(\"div\");\n  container.className = \"ofv-pptx-viewer\";\n  let insight: PresentationInsight | undefined;\n  let zip: JSZip | undefined;\n  let placeholderFontCorrections: PptxPlaceholderFontCorrection[] = [];\n\n  try {\n    zip = await JSZip.loadAsync(arrayBuffer);\n    insight = await inspectPptxPresentation(zip);\n    await renderPresentationInsight(panel, insight);\n  } catch (error) {\n    console.warn(\"PPTX structure insight extraction failed:\", error);\n  }\n  if (zip) {\n    try {\n      placeholderFontCorrections = await inspectPptxPlaceholderFontCorrections(zip);\n    } catch (error) {\n      console.warn(\"PPTX placeholder font extraction failed:\", error);\n    }\n  }\n\n  panel.append(container);\n  try {\n    const { PptxViewer } = await import(\"@aiden0z/pptx-renderer\");\n    await withTimeout(PptxViewer.open(arrayBuffer, container), pptxRenderTimeoutMs());\n    schedulePptxLayoutNormalization(container, placeholderFontCorrections);\n  } catch (error) {\n    container.replaceChildren();\n    if (insight) {\n      renderPptxTextFallback(container, insight);\n      return;\n    }\n    if (zip) {\n      renderPptxTextFallback(container, await inspectPptxPresentation(zip));\n      return;\n    }\n    container.textContent =\n      error instanceof Error && error.message.includes(\"timed out\")\n        ? \"PPTX 渲染超时，请稍后重试或转换为 PDF 后预览。\"\n        : \"PPTX 渲染失败，请检查文件是否损坏。\";\n  }\n}\n\nfunction renderPptxTextFallback(container: HTMLElement, insight: PresentationInsight): void {\n  container.classList.add(\"ofv-presentation-slides\");\n  const slides = insight.slides.length > 0 ? insight.slides : [{ title: \"PPTX\", textCount: 0, imageCount: 0, notesCount: 0, hasTransition: false, animationCount: 0, sampleTexts: [] }];\n  for (const [index, slide] of slides.entries()) {\n    const article = document.createElement(\"article\");\n    article.className = \"ofv-slide\";\n    article.dataset.slideIndex = String(index);\n    const title = document.createElement(\"h4\");\n    title.textContent = slide.title || `Slide ${index + 1}`;\n    article.append(title);\n    const bodyTexts = slide.sampleTexts.length > 0 ? slide.sampleTexts : [\"该页没有可提取文本。\"];\n    for (const text of bodyTexts) {\n      const paragraph = document.createElement(\"p\");\n      paragraph.textContent = text;\n      article.append(paragraph);\n    }\n    container.append(article);\n  }\n}\n\nasync function withTimeout<T>(promise: Promise<T>, timeoutMs: number, label = \"PPTX rendering\"): Promise<T> {\n  let timeoutId: number | undefined;\n  try {\n    return await Promise.race([\n      promise,\n      new Promise<T>((_resolve, reject) => {\n        timeoutId = window.setTimeout(() => reject(new Error(`${label} timed out after ${timeoutMs}ms.`)), timeoutMs);\n      })\n    ]);\n  } finally {\n    if (timeoutId !== undefined) {\n      window.clearTimeout(timeoutId);\n    }\n  }\n}\n\nfunction pptxRenderTimeoutMs(): number {\n  const override = (globalThis as { __OFV_PPTX_RENDER_TIMEOUT_MS__?: unknown }).__OFV_PPTX_RENDER_TIMEOUT_MS__;\n  return typeof override === \"number\" && override > 0 ? override : DEFAULT_PPTX_RENDER_TIMEOUT_MS;\n}\n\ntype PptxPlaceholderFontCorrection = {\n  slideIndex: number;\n  leftRatio: number;\n  topRatio: number;\n  widthRatio: number;\n  heightRatio: number;\n  fontSizePt: number;\n};\n\nfunction normalizePptxLayout(container: HTMLElement, placeholderFontCorrections: PptxPlaceholderFontCorrection[]): void {\n  const slideCanvases = findPptxSlideCanvases(container);\n  for (const slide of slideCanvases) {\n    if (!hasInlineBackground(slide)) {\n      slide.style.backgroundColor = \"#FFFFFF\";\n    }\n  }\n  normalizePptxPlaceholderFonts(container, placeholderFontCorrections);\n  normalizePptxCircleCalloutText(container);\n  normalizePptxDiagramCycleText(container);\n  normalizePptxMirroredText(container);\n}\n\nfunction schedulePptxLayoutNormalization(\n  container: HTMLElement,\n  placeholderFontCorrections: PptxPlaceholderFontCorrection[]\n): void {\n  normalizePptxLayout(container, placeholderFontCorrections);\n  let observer: MutationObserver | undefined;\n  if (typeof MutationObserver !== \"undefined\") {\n    observer = new MutationObserver(() => normalizePptxLayout(container, placeholderFontCorrections));\n    observer.observe(container, { childList: true, subtree: true });\n  }\n  for (const delay of [0, 100, 500, 1500, 3000]) {\n    window.setTimeout(() => {\n      if (container.isConnected) {\n        normalizePptxLayout(container, placeholderFontCorrections);\n      }\n    }, delay);\n  }\n  window.setTimeout(() => observer?.disconnect(), 5000);\n}\n\nfunction normalizePptxCircleCalloutText(container: HTMLElement): void {\n  for (const element of Array.from(container.querySelectorAll<HTMLElement>(\"div\"))) {\n    if (!isPptxCircleCalloutBox(element)) {\n      continue;\n    }\n    const textLayer = findPptxCircleCalloutTextLayer(element);\n    const text = (textLayer?.textContent || \"\").trim();\n    if (!textLayer || !isPptxCircleCalloutText(text)) {\n      continue;\n    }\n    const normalizedText = splitPptxCircleCalloutText(text);\n    if (textLayer.textContent !== normalizedText) {\n      textLayer.textContent = normalizedText;\n    }\n    textLayer.classList.add(\"ofv-pptx-circle-callout-text\");\n  }\n}\n\nfunction isPptxCircleCalloutText(text: string): boolean {\n  return /^(?:代表性定义|包含的要素)$/.test(text);\n}\n\nfunction isPptxCircleCalloutBox(element: HTMLElement): boolean {\n  const width = parseCssPixelValue(element.style.width);\n  const height = parseCssPixelValue(element.style.height);\n  return element.style.position === \"absolute\" && width >= 80 && height >= 80 && width / height > 0.75 && width / height < 1.25;\n}\n\nfunction findPptxCircleCalloutTextLayer(element: HTMLElement): HTMLElement | undefined {\n  if (element.children.length === 0 && isPptxCircleCalloutText((element.textContent || \"\").trim())) {\n    return element;\n  }\n  return Array.from(element.querySelectorAll<HTMLElement>(\"div\")).find((candidate) =>\n    isPptxCircleCalloutText((candidate.textContent || \"\").trim())\n  );\n}\n\nfunction splitPptxCircleCalloutText(text: string): string {\n  if (text === \"代表性定义\") {\n    return \"代表性\\n定义\";\n  }\n  if (text === \"包含的要素\") {\n    return \"包含的\\n要素\";\n  }\n  return text;\n}\n\nfunction normalizePptxDiagramCycleText(container: HTMLElement): void {\n  const candidates = Array.from(container.querySelectorAll<HTMLElement>(\"div\")).filter(isPptxDiagramCycleTextBox);\n  const groups = new Map<HTMLElement, HTMLElement[]>();\n  for (const candidate of candidates) {\n    const parent = candidate.parentElement;\n    if (!parent) {\n      continue;\n    }\n    const group = groups.get(parent) || [];\n    group.push(candidate);\n    groups.set(parent, group);\n  }\n\n  for (const group of groups.values()) {\n    if (group.length < 4) {\n      continue;\n    }\n    const ordered = group\n      .map((element) => ({ element, index: pptxDiagramCycleIndex(element.textContent || \"\") }))\n      .filter((item) => item.index !== undefined)\n      .sort((a, b) => a.index! - b.index!);\n    if (ordered.length < 4 || !isOverlappingPptxDiagramCycleGroup(ordered.map((item) => item.element))) {\n      continue;\n    }\n    repositionPptxDiagramCycleText(ordered.map((item) => item.element));\n  }\n}\n\nfunction isPptxDiagramCycleTextBox(element: HTMLElement): boolean {\n  const text = (element.textContent || \"\").trim();\n  if (pptxDiagramCycleIndex(text) === undefined || element.style.position !== \"absolute\") {\n    return false;\n  }\n  const width = parseCssPixelValue(element.style.width);\n  const height = parseCssPixelValue(element.style.height);\n  const left = parseCssPixelValue(element.style.left);\n  const top = parseCssPixelValue(element.style.top);\n  return width > 120 && height > 120 && (left !== 0 || top !== 0);\n}\n\nfunction pptxDiagramCycleIndex(text: string): number | undefined {\n  const marker = text.trim().charAt(0);\n  const markers = \"①②③④⑤⑥⑦⑧⑨\";\n  const index = markers.indexOf(marker);\n  return index >= 0 ? index + 1 : undefined;\n}\n\nfunction isOverlappingPptxDiagramCycleGroup(elements: HTMLElement[]): boolean {\n  const boxes = elements.map((element) => ({\n    left: parseCssPixelValue(element.style.left),\n    top: parseCssPixelValue(element.style.top),\n    width: parseCssPixelValue(element.style.width),\n    height: parseCssPixelValue(element.style.height)\n  }));\n  const averageWidth = boxes.reduce((sum, box) => sum + box.width, 0) / boxes.length;\n  const averageHeight = boxes.reduce((sum, box) => sum + box.height, 0) / boxes.length;\n  const leftSpread = Math.max(...boxes.map((box) => box.left)) - Math.min(...boxes.map((box) => box.left));\n  const topSpread = Math.max(...boxes.map((box) => box.top)) - Math.min(...boxes.map((box) => box.top));\n  return averageWidth > 0 && averageHeight > 0 && leftSpread < averageWidth * 0.2 && topSpread < averageHeight * 0.2;\n}\n\nfunction repositionPptxDiagramCycleText(elements: HTMLElement[]): void {\n  const boxes = elements.map((element) => ({\n    left: parseCssPixelValue(element.style.left),\n    top: parseCssPixelValue(element.style.top),\n    width: parseCssPixelValue(element.style.width),\n    height: parseCssPixelValue(element.style.height)\n  }));\n  const minLeft = Math.min(...boxes.map((box) => box.left));\n  const minTop = Math.min(...boxes.map((box) => box.top));\n  const maxRight = Math.max(...boxes.map((box) => box.left + box.width));\n  const maxBottom = Math.max(...boxes.map((box) => box.top + box.height));\n  const centerX = (minLeft + maxRight) / 2;\n  const centerY = (minTop + maxBottom) / 2;\n  const radiusX = (maxRight - minLeft) * 0.3;\n  const radiusY = (maxBottom - minTop) * 0.27;\n  const boxWidth = Math.max(96, Math.min(148, (maxRight - minLeft) * 0.28));\n  const boxHeight = Math.max(52, Math.min(82, (maxBottom - minTop) * 0.17));\n  const angleByIndex = new Map([\n    [1, -110],\n    [2, 180],\n    [3, 125],\n    [4, 55],\n    [5, 0],\n    [6, -55]\n  ]);\n\n  for (const element of elements) {\n    const index = pptxDiagramCycleIndex(element.textContent || \"\");\n    const angle = ((angleByIndex.get(index || 0) ?? ((index || 1) - 1) * (360 / elements.length)) * Math.PI) / 180;\n    const left = centerX + Math.cos(angle) * radiusX - boxWidth / 2;\n    const top = centerY + Math.sin(angle) * radiusY - boxHeight / 2;\n    const textLayer = findPptxDiagramCycleTextLayer(element);\n    const overlayParent = element.parentElement;\n    if (!textLayer || !overlayParent) {\n      continue;\n    }\n    element.style.overflow = \"visible\";\n    textLayer.classList.add(\"ofv-pptx-diagram-cycle-text\");\n    textLayer.style.left = `${left}px`;\n    textLayer.style.top = `${top}px`;\n    textLayer.style.width = `${boxWidth}px`;\n    textLayer.style.height = `${boxHeight}px`;\n    textLayer.style.zIndex = \"20\";\n    textLayer.style.alignItems = \"center\";\n    textLayer.style.justifyContent = \"center\";\n    textLayer.style.textAlign = \"center\";\n    textLayer.style.whiteSpace = \"normal\";\n    textLayer.style.wordBreak = \"break-word\";\n    textLayer.style.pointerEvents = \"none\";\n    textLayer.dataset.ofvPptxDiagramCycleText = String(index || \"\");\n    overlayParent.append(textLayer);\n  }\n}\n\nfunction findPptxDiagramCycleTextLayer(element: HTMLElement): HTMLElement | undefined {\n  const text = (element.textContent || \"\").trim();\n  const descendants = Array.from(element.querySelectorAll<HTMLElement>(\"div\")).filter(\n    (candidate) => candidate !== element && (candidate.textContent || \"\").trim() === text\n  );\n  return descendants.find((candidate) => candidate.style.position === \"absolute\") || descendants[0];\n}\n\nasync function inspectPptxPlaceholderFontCorrections(zip: JSZip): Promise<PptxPlaceholderFontCorrection[]> {\n  const presentationXml = await zip.file(\"ppt/presentation.xml\")?.async(\"text\");\n  const presentation = presentationXml ? parseOfficeXml(presentationXml) : undefined;\n  const slideSize = presentation\n    ? Array.from(presentation.getElementsByTagName(\"*\")).find((element) => element.localName === \"sldSz\")\n    : undefined;\n  const slideWidth = Number(slideSize?.getAttribute(\"cx\"));\n  const slideHeight = Number(slideSize?.getAttribute(\"cy\"));\n  if (!(slideWidth > 0) || !(slideHeight > 0)) {\n    return [];\n  }\n\n  const slideEntries = Object.values(zip.files)\n    .filter((entry) => !entry.dir && /^ppt\\/slides\\/slide\\d+\\.xml$/i.test(entry.name))\n    .sort((a, b) => slideNumberFromPath(a.name) - slideNumberFromPath(b.name));\n  const corrections: PptxPlaceholderFontCorrection[] = [];\n\n  for (const [slideIndex, entry] of slideEntries.entries()) {\n    const slideXml = await entry.async(\"text\");\n    const slide = parseOfficeXml(slideXml);\n    if (!slide) {\n      continue;\n    }\n    const relationships = await readPptxRelationships(zip, entry.name);\n    const layoutTarget = resolvePptxRelationshipTarget(\n      entry.name,\n      relationships.find((relationship) => /\\/slideLayout$/i.test(relationship.type))?.target\n    );\n    const layoutXml = layoutTarget ? await zip.file(layoutTarget)?.async(\"text\") : undefined;\n    const layout = layoutXml ? parseOfficeXml(layoutXml) : undefined;\n    if (!layout) {\n      continue;\n    }\n\n    const layoutFontSizes = readPptxLayoutPlaceholderFontSizes(layout);\n    const shapes = Array.from(slide.getElementsByTagName(\"*\")).filter((element) => element.localName === \"sp\");\n    for (const shape of shapes) {\n      const placeholder = findPptxDescendant(shape, \"ph\");\n      const placeholderIndex = placeholder?.getAttribute(\"idx\");\n      const fontSizePt = placeholderIndex ? layoutFontSizes.get(placeholderIndex) : undefined;\n      const textBody = findPptxDescendant(shape, \"txBody\");\n      if (!textBody?.textContent?.trim() || !fontSizePt || hasExplicitPptxTextSize(textBody)) {\n        continue;\n      }\n      const transform = findPptxDescendant(shape, \"xfrm\");\n      const offset = transform ? findPptxChild(transform, \"off\") : undefined;\n      const extent = transform ? findPptxChild(transform, \"ext\") : undefined;\n      const left = Number(offset?.getAttribute(\"x\"));\n      const top = Number(offset?.getAttribute(\"y\"));\n      const width = Number(extent?.getAttribute(\"cx\"));\n      const height = Number(extent?.getAttribute(\"cy\"));\n      if (![left, top, width, height].every((value) => Number.isFinite(value)) || width <= 0 || height <= 0) {\n        continue;\n      }\n      corrections.push({\n        slideIndex,\n        leftRatio: left / slideWidth,\n        topRatio: top / slideHeight,\n        widthRatio: width / slideWidth,\n        heightRatio: height / slideHeight,\n        fontSizePt\n      });\n    }\n  }\n  return corrections;\n}\n\nfunction readPptxLayoutPlaceholderFontSizes(layout: Document): Map<string, number> {\n  const result = new Map<string, number>();\n  const shapes = Array.from(layout.getElementsByTagName(\"*\")).filter((element) => element.localName === \"sp\");\n  for (const shape of shapes) {\n    const placeholderIndex = findPptxDescendant(shape, \"ph\")?.getAttribute(\"idx\");\n    if (!placeholderIndex) {\n      continue;\n    }\n    const textBody = findPptxDescendant(shape, \"txBody\");\n    const defaultRunProperties = textBody\n      ? Array.from(textBody.getElementsByTagName(\"*\")).find(\n          (element) => element.localName === \"defRPr\" && Number(element.getAttribute(\"sz\")) > 0\n        )\n      : undefined;\n    const size = Number(defaultRunProperties?.getAttribute(\"sz\"));\n    if (size > 0) {\n      result.set(placeholderIndex, size / 100);\n    }\n  }\n  return result;\n}\n\nfunction hasExplicitPptxTextSize(textBody: Element): boolean {\n  return Array.from(textBody.getElementsByTagName(\"*\")).some(\n    (element) =>\n      (element.localName === \"rPr\" || element.localName === \"defRPr\" || element.localName === \"endParaRPr\") &&\n      Number(element.getAttribute(\"sz\")) > 0\n  );\n}\n\nfunction findPptxDescendant(element: Element, localName: string): Element | undefined {\n  return Array.from(element.getElementsByTagName(\"*\")).find((child) => child.localName === localName);\n}\n\nfunction findPptxChild(element: Element, localName: string): Element | undefined {\n  return Array.from(element.children).find((child) => child.localName === localName);\n}\n\nfunction normalizePptxPlaceholderFonts(\n  container: HTMLElement,\n  corrections: PptxPlaceholderFontCorrection[]\n): void {\n  for (const correction of corrections) {\n    const wrapper = container.querySelector<HTMLElement>(`div[data-slide-index=\"${correction.slideIndex}\"]`);\n    if (!wrapper) {\n      continue;\n    }\n    const match = findPptxPlaceholderElement(wrapper, correction);\n    if (!match) {\n      continue;\n    }\n    const styledText = Array.from(match.querySelectorAll<HTMLElement>(\"[style]\")).filter(\n      (element) => parseFloat(element.style.fontSize) > 0\n    );\n    for (const element of styledText) {\n      element.style.fontSize = `${correction.fontSizePt}pt`;\n    }\n    if (styledText.length > 0) {\n      match.dataset.ofvPptxPlaceholderFont = String(correction.fontSizePt);\n    }\n  }\n}\n\nfunction findPptxPlaceholderElement(\n  wrapper: HTMLElement,\n  correction: PptxPlaceholderFontCorrection\n): HTMLElement | undefined {\n  let best: { element: HTMLElement; score: number } | undefined;\n  for (const canvas of findPptxSlideCanvases(wrapper)) {\n    const canvasWidth = parseCssPixelValue(canvas.style.width);\n    const canvasHeight = parseCssPixelValue(canvas.style.height);\n    if (!(canvasWidth > 0) || !(canvasHeight > 0)) {\n      continue;\n    }\n    const expected = {\n      left: correction.leftRatio * canvasWidth,\n      top: correction.topRatio * canvasHeight,\n      width: correction.widthRatio * canvasWidth,\n      height: correction.heightRatio * canvasHeight\n    };\n    const candidates = Array.from(canvas.querySelectorAll<HTMLElement>(\"div\")).filter(\n      (element) => element.style.position === \"absolute\" && Boolean(element.textContent?.trim())\n    );\n    for (const element of candidates) {\n      const actual = {\n        left: parseCssPixelValue(element.style.left),\n        top: parseCssPixelValue(element.style.top),\n        width: parseCssPixelValue(element.style.width),\n        height: parseCssPixelValue(element.style.height)\n      };\n      const deltas = [\n        Math.abs(actual.left - expected.left),\n        Math.abs(actual.top - expected.top),\n        Math.abs(actual.width - expected.width),\n        Math.abs(actual.height - expected.height)\n      ];\n      const tolerance = Math.max(2, Math.min(canvasWidth, canvasHeight) * 0.005);\n      if (deltas.some((delta) => delta > tolerance)) {\n        continue;\n      }\n      const score = deltas.reduce((sum, delta) => sum + delta, 0);\n      if (!best || score < best.score) {\n        best = { element, score };\n      }\n    }\n  }\n  return best?.element;\n}\n\nfunction hasInlineBackground(element: HTMLElement): boolean {\n  return Boolean(element.style.background || element.style.backgroundColor || element.style.backgroundImage);\n}\n\nfunction normalizePptxMirroredText(container: HTMLElement): void {\n  const mirroredContainers = Array.from(container.querySelectorAll<HTMLElement>(\"div\")).filter((element) => {\n    const text = element.textContent?.trim();\n    if (!text || element.children.length === 0) {\n      return false;\n    }\n    const styleTransform = element.style.transform;\n    return hasPptxMirrorTransform(styleTransform, \"x\") || hasPptxMirrorTransform(styleTransform, \"y\");\n  });\n\n  for (const element of mirroredContainers) {\n    const flipX = hasPptxMirrorTransform(element.style.transform, \"x\");\n    const flipY = hasPptxMirrorTransform(element.style.transform, \"y\");\n    const targets = findPptxMirroredTextTargets(element);\n\n    for (const target of targets) {\n      counterMirrorPptxTextTarget(target, flipX, flipY);\n    }\n  }\n}\n\nfunction findPptxMirroredTextTargets(element: HTMLElement): HTMLElement[] {\n  const children = Array.from(element.children).filter((child): child is HTMLElement => child instanceof HTMLElement);\n  const absoluteTextChildren = children.filter((child) => Boolean(child.textContent?.trim()) && child.style.position === \"absolute\");\n  if (absoluteTextChildren.length > 0) {\n    return absoluteTextChildren;\n  }\n  return children.filter((child) => Boolean(child.textContent?.trim()));\n}\n\nfunction hasPptxMirrorTransform(transform: string, axis: \"x\" | \"y\"): boolean {\n  if (!transform) {\n    return false;\n  }\n  if (axis === \"x\" && /scaleX\\(\\s*-1\\s*\\)/i.test(transform)) {\n    return true;\n  }\n  if (axis === \"y\" && /scaleY\\(\\s*-1\\s*\\)/i.test(transform)) {\n    return true;\n  }\n  const matrix = transform.match(/matrix\\(\\s*([^,\\s]+)\\s*,\\s*([^,\\s]+)\\s*,\\s*([^,\\s]+)\\s*,\\s*([^,\\s]+)/i);\n  if (!matrix) {\n    return false;\n  }\n  const xScale = Number(matrix[1]);\n  const yScale = Number(matrix[4]);\n  return axis === \"x\" ? xScale < 0 : yScale < 0;\n}\n\nfunction counterMirrorPptxTextTarget(target: HTMLElement, flipX: boolean, flipY: boolean): void {\n  const applied = target.dataset.ofvPptxCounterMirror ?? \"\";\n  const transforms: string[] = [];\n  if (flipX && !applied.includes(\"x\")) {\n    transforms.push(\"scaleX(-1)\");\n  }\n  if (flipY && !applied.includes(\"y\")) {\n    transforms.push(\"scaleY(-1)\");\n  }\n  if (transforms.length === 0) {\n    return;\n  }\n\n  target.style.transform = `${target.style.transform || \"\"} ${transforms.join(\" \")}`.trim();\n  if (!target.style.transformOrigin) {\n    target.style.transformOrigin = \"center center\";\n  }\n  target.dataset.ofvPptxCounterMirror = `${applied}${flipX ? \"x\" : \"\"}${flipY ? \"y\" : \"\"}`;\n}\n\nfunction findPptxSlideCanvases(container: HTMLElement): HTMLElement[] {\n  const slideWrappers = Array.from(container.querySelectorAll<HTMLElement>(\"div[data-slide-index]\"));\n  const candidates = slideWrappers.flatMap((wrapper) =>\n    Array.from(wrapper.querySelectorAll<HTMLElement>(\"div\")).filter(isPptxSlideCanvas)\n  );\n  if (candidates.length > 0) {\n    return Array.from(new Set(candidates));\n  }\n  return Array.from(container.querySelectorAll<HTMLElement>(\"div\")).filter(isPptxSlideCanvas);\n}\n\nfunction isPptxSlideCanvas(element: HTMLElement): boolean {\n  return element.style.position === \"relative\" && parseCssPixelValue(element.style.width) > 0 && parseCssPixelValue(element.style.height) > 0;\n}\n\nasync function renderOdp(panel: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n  const zip = await JSZip.loadAsync(arrayBuffer);\n  const content = zip.file(\"content.xml\");\n  if (!content) {\n    panel.textContent = \"未解析到 ODP 内容。\";\n    return;\n  }\n  const xml = await content.async(\"text\");\n  const images = await extractZipImages(zip, /^Pictures\\//);\n  renderPresentationInsight(panel, inspectOpenDocumentPresentation(titleFromOdf(xml, \"ODP 演示文稿\"), xml, images.length));\n  renderOpenDocumentPresentation(panel, \"ODP 演示文稿\", xml, images);\n}\n\nfunction renderOpenDocumentPresentationXml(panel: HTMLElement, xml: string): void {\n  renderPresentationInsight(panel, inspectOpenDocumentPresentation(\"FODP 演示文稿\", xml, 0));\n  renderOpenDocumentPresentation(panel, \"FODP 演示文稿\", xml, []);\n}\n\nasync function renderPackagedOfficePreview(\n  panel: HTMLElement,\n  arrayBuffer: ArrayBuffer,\n  extension: string,\n  fit: PreviewFit,\n  messages: PreviewMessages\n): Promise<boolean> {\n  let zip: JSZip;\n  try {\n    zip = await JSZip.loadAsync(arrayBuffer);\n  } catch {\n    return false;\n  }\n\n  const entries = Object.values(zip.files).filter((entry) => !entry.dir);\n  const hasEntry = (path: string) => entries.some((entry) => entry.name.toLowerCase() === path.toLowerCase());\n  const contentXml = zip.file(/(^|\\/)content\\.xml$/i)[0];\n\n  if (hasEntry(\"word/document.xml\")) {\n    await renderDocx(panel, arrayBuffer, fit);\n    return true;\n  }\n\n  if (hasEntry(\"xl/workbook.xml\")) {\n    await renderSheet(panel, arrayBuffer, extension, messages);\n    return true;\n  }\n\n  if (hasEntry(\"ppt/presentation.xml\")) {\n    await renderPptx(panel, arrayBuffer);\n    return true;\n  }\n\n  if (contentXml) {\n    const xml = await contentXml.async(\"text\");\n    if (/<office:spreadsheet\\b|<table:table\\b/i.test(xml)) {\n      renderParsedSheets(panel, parseFlatOds(xml), `${extension.toUpperCase()} 文件未解析到表格。`);\n      return true;\n    }\n    if (/<office:presentation\\b|<draw:page\\b/i.test(xml)) {\n      renderOpenDocumentPresentation(panel, `${extension.toUpperCase()} 演示文稿`, xml, await extractZipImages(zip, /^Pictures\\//));\n      return true;\n    }\n    if (/<office:text\\b|<text:p\\b/i.test(xml)) {\n      renderOpenDocumentXml(panel, `${extension.toUpperCase()} 文档`, xml);\n      return true;\n    }\n  }\n\n  if (entries.some((entry) => /^index\\//i.test(entry.name) || /\\.iwa$/i.test(entry.name))) {\n    renderOfficePackageStructure(\n      panel,\n      extension,\n      entries.map((entry) => entry.name),\n      \"检测到 Apple iWork 包结构。当前解析包内 plist 元数据并展示 IWA/资源结构；正文 IWA 数据可后续接入专用解析器增强。\",\n      await extractIWorkMetadata(entries)\n    );\n    return true;\n  }\n\n  if (entries.length > 0) {\n    renderOfficePackageStructure(\n      panel,\n      extension,\n      entries.map((entry) => entry.name),\n      \"检测到 ZIP 包结构，但未发现标准 OOXML/ODF 入口。可后续接入对应厂商格式解析器或服务端转换。\"\n    );\n    return true;\n  }\n\n  return false;\n}\n\nfunction renderOfficePackageStructure(\n  panel: HTMLElement,\n  extension: string,\n  entries: string[],\n  message: string,\n  metadata?: IWorkMetadata\n): void {\n  const section = createSection(\"Office 包结构预览\");\n  const note = document.createElement(\"p\");\n  note.className = \"ofv-office-package-note\";\n  note.textContent = `.${extension} ${message}`;\n\n  if (metadata && Object.keys(metadata).length > 0) {\n    section.append(createIWorkMetadataSummary(metadata));\n  }\n\n  const list = document.createElement(\"ul\");\n  list.className = \"ofv-office-package-list\";\n  for (const name of entries.slice(0, 120)) {\n    const item = document.createElement(\"li\");\n    item.textContent = name;\n    list.append(item);\n  }\n  if (entries.length > 120) {\n    const item = document.createElement(\"li\");\n    item.textContent = `还有 ${entries.length - 120} 个文件未展示。`;\n    list.append(item);\n  }\n\n  section.append(note, list);\n  panel.append(section);\n}\n\nasync function extractIWorkMetadata(entries: JSZip.JSZipObject[]): Promise<IWorkMetadata> {\n  const metadataEntries = entries.filter((entry) => /^metadata\\/.*\\.plist$/i.test(entry.name) || /properties\\.plist$/i.test(entry.name));\n  const metadata: IWorkMetadata = {};\n  for (const entry of metadataEntries.slice(0, 6)) {\n    const text = await entry.async(\"text\").catch(() => \"\");\n    if (!text || !/<plist[\\s>]/i.test(text)) {\n      continue;\n    }\n    const plist = parsePlistDict(text);\n    mergeIWorkMetadata(metadata, plist);\n  }\n  return metadata;\n}\n\nfunction createIWorkMetadataSummary(metadata: IWorkMetadata): HTMLElement {\n  const wrapper = document.createElement(\"div\");\n  wrapper.className = \"ofv-iwork-meta\";\n  const title = document.createElement(\"strong\");\n  title.textContent = \"iWork 元数据\";\n  const grid = document.createElement(\"div\");\n  grid.className = \"ofv-iwork-meta-grid\";\n  appendIWorkMeta(grid, \"标题\", metadata.title);\n  appendIWorkMeta(grid, \"作者\", metadata.author);\n  appendIWorkMeta(grid, \"公司\", metadata.company);\n  appendIWorkMeta(grid, \"主题\", metadata.subject);\n  appendIWorkMeta(grid, \"关键词\", metadata.keywords?.join(\", \"));\n  appendIWorkMeta(grid, \"创建时间\", metadata.created);\n  appendIWorkMeta(grid, \"修改时间\", metadata.modified);\n  wrapper.append(title, grid);\n  return wrapper;\n}\n\nfunction appendIWorkMeta(parent: HTMLElement, label: string, value?: string): void {\n  if (!value) {\n    return;\n  }\n  const row = document.createElement(\"div\");\n  row.className = \"ofv-meta-row\";\n  const key = document.createElement(\"span\");\n  key.textContent = label;\n  const content = document.createElement(\"strong\");\n  content.textContent = value;\n  row.append(key, content);\n  parent.append(row);\n}\n\nfunction mergeIWorkMetadata(metadata: IWorkMetadata, plist: Record<string, unknown>): void {\n  metadata.title ||= plistText(plist, [\"Title\", \"title\", \"DocumentTitle\", \"SFDocumentTitle\", \"kMDItemTitle\"]);\n  metadata.author ||= plistText(plist, [\"Author\", \"author\", \"Authors\", \"kMDItemAuthors\", \"creator\"]);\n  metadata.company ||= plistText(plist, [\"Company\", \"company\", \"Organization\"]);\n  metadata.subject ||= plistText(plist, [\"Subject\", \"subject\", \"Description\", \"comment\"]);\n  metadata.created ||= plistText(plist, [\"CreationDate\", \"created\", \"kMDItemFSCreationDate\"]);\n  metadata.modified ||= plistText(plist, [\"ModificationDate\", \"modified\", \"kMDItemFSContentChangeDate\"]);\n  metadata.keywords ||= plistArray(plist, [\"Keywords\", \"keywords\", \"kMDItemKeywords\"]);\n}\n\nfunction parsePlistDict(xml: string): Record<string, unknown> {\n  if (typeof DOMParser === \"undefined\") {\n    return {};\n  }\n  const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n  if (doc.querySelector(\"parsererror\")) {\n    return {};\n  }\n  const dict = Array.from(doc.documentElement.children).find((child) => child.tagName === \"dict\");\n  const value = dict ? parsePlistValue(dict) : undefined;\n  return value && typeof value === \"object\" && !Array.isArray(value) ? (value as Record<string, unknown>) : {};\n}\n\nfunction parsePlistValue(element: Element): unknown {\n  switch (element.tagName) {\n    case \"dict\": {\n      const result: Record<string, unknown> = {};\n      const children = Array.from(element.children);\n      for (let index = 0; index < children.length; index++) {\n        const key = children[index];\n        if (key.tagName !== \"key\") {\n          continue;\n        }\n        const value = children[index + 1];\n        if (value) {\n          result[key.textContent || \"\"] = parsePlistValue(value);\n          index++;\n        }\n      }\n      return result;\n    }\n    case \"array\":\n      return Array.from(element.children).map(parsePlistValue);\n    case \"true\":\n      return true;\n    case \"false\":\n      return false;\n    case \"integer\":\n    case \"real\":\n      return Number(element.textContent || 0);\n    case \"string\":\n    case \"date\":\n    default:\n      return element.textContent?.trim() || \"\";\n  }\n}\n\nfunction plistText(plist: Record<string, unknown>, keys: string[]): string | undefined {\n  for (const key of keys) {\n    const value = plist[key];\n    if (typeof value === \"string\" && value.trim()) {\n      return value.trim();\n    }\n    if (Array.isArray(value)) {\n      const text = value.filter((item): item is string => typeof item === \"string\" && Boolean(item.trim())).join(\", \");\n      if (text) {\n        return text;\n      }\n    }\n  }\n  return undefined;\n}\n\nfunction plistArray(plist: Record<string, unknown>, keys: string[]): string[] | undefined {\n  for (const key of keys) {\n    const value = plist[key];\n    if (Array.isArray(value)) {\n      const items = value.filter((item): item is string => typeof item === \"string\" && Boolean(item.trim()));\n      if (items.length > 0) {\n        return items;\n      }\n    }\n    if (typeof value === \"string\" && value.trim()) {\n      return value.split(/[,;]/).map((item) => item.trim()).filter(Boolean);\n    }\n  }\n  return undefined;\n}\n\nfunction renderOpenDocumentPresentation(\n  panel: HTMLElement,\n  title: string,\n  xml: string,\n  images: Array<{ name: string; src: string }>\n): void {\n  const pages = xml.split(/<draw:page\\b/).slice(1);\n  const pageSources = pages.length > 0 ? pages : [xml];\n  for (const [index, pageXml] of pageSources.entries()) {\n    const section = createSection(`${title} ${index + 1}`);\n    const body = document.createElement(\"div\");\n    body.className = \"ofv-slide\";\n    const texts = extractOpenDocumentBlocks(pageXml);\n    if (texts.length > 0) {\n      hideSuccessfulSectionHeading(section);\n      for (const text of texts) {\n        const paragraph = document.createElement(\"p\");\n        paragraph.textContent = text;\n        body.append(paragraph);\n      }\n    } else {\n      const empty = document.createElement(\"p\");\n      empty.textContent = \"这一页没有可提取文本。\";\n      body.append(empty);\n    }\n    for (const image of images.slice(index === 0 ? 0 : images.length, index === 0 ? images.length : images.length)) {\n      const figure = document.createElement(\"figure\");\n      figure.className = \"ofv-slide-image\";\n      const img = document.createElement(\"img\");\n      img.src = image.src;\n      img.alt = image.name;\n      const caption = document.createElement(\"figcaption\");\n      caption.textContent = image.name;\n      figure.append(img, caption);\n      body.append(figure);\n    }\n    section.append(body);\n    panel.append(section);\n  }\n}\n\nasync function inspectPptxPresentation(zip: JSZip): Promise<PresentationInsight> {\n  const slideEntries = Object.values(zip.files)\n    .filter((entry) => !entry.dir && /^ppt\\/slides\\/slide\\d+\\.xml$/i.test(entry.name))\n    .sort((a, b) => slideNumberFromPath(a.name) - slideNumberFromPath(b.name));\n\n  const slides: PresentationSlideInsight[] = [];\n  let imageCount = 0;\n  let notesCount = 0;\n  let transitionCount = 0;\n  let animationCount = 0;\n  const layouts = new Set<string>();\n\n  for (const entry of slideEntries) {\n    const xml = await entry.async(\"text\");\n    const texts = extractOpenXmlText(xml);\n    const rels = await readPptxRelationships(zip, entry.name);\n    const layout = await resolvePptxSlideLayout(zip, entry.name, rels);\n    if (layout) {\n      layouts.add(layout);\n    }\n\n    const slideImageCount = countPptxSlideImages(xml, rels);\n    const notesPath = resolvePptxRelationshipTarget(entry.name, rels.find((rel) => /\\/notesSlide$/i.test(rel.type))?.target);\n    const notesXml = notesPath ? await zip.file(notesPath)?.async(\"text\") : undefined;\n    const slideNotesCount = notesXml ? extractOpenXmlText(notesXml).length : 0;\n    const hasTransition = /<p:transition\\b/i.test(xml);\n    const slideAnimationCount = countMatches(xml, /<p:(?:anim|animEffect|animMotion|animRot|animScale|cmd|set)\\b/gi);\n\n    imageCount += slideImageCount;\n    notesCount += slideNotesCount;\n    transitionCount += hasTransition ? 1 : 0;\n    animationCount += slideAnimationCount;\n    slides.push({\n      title: texts[0] || `Slide ${slides.length + 1}`,\n      layout,\n      textCount: texts.length,\n      imageCount: slideImageCount,\n      notesCount: slideNotesCount,\n      hasTransition,\n      animationCount: slideAnimationCount,\n      sampleTexts: texts.slice(0, 4)\n    });\n  }\n\n  return {\n    title: \"PPTX 演示文稿结构\",\n    slideCount: slides.length,\n    imageCount,\n    notesCount,\n    transitionCount,\n    animationCount,\n    layouts: Array.from(layouts),\n    slides\n  };\n}\n\nfunction inspectOpenDocumentPresentation(title: string, xml: string, totalImages: number): PresentationInsight {\n  const pages = xml.split(/<draw:page\\b/).slice(1);\n  const pageSources = pages.length > 0 ? pages : [xml];\n  const slides = pageSources.map((pageXml, index) => {\n    const texts = extractOpenDocumentBlocks(pageXml);\n    const layout =\n      matchXmlAttribute(pageXml, /presentation:class=\"([^\"]+)\"/i) ||\n      matchXmlAttribute(pageXml, /draw:style-name=\"([^\"]+)\"/i) ||\n      undefined;\n    const imageCount = countMatches(pageXml, /<draw:image\\b/gi);\n    const hasTransition = /presentation:transition-type=|presentation:transition-style=|smil:type=/i.test(pageXml);\n    const animationCount = countMatches(pageXml, /<anim:|<presentation:animations\\b|<presentation:show-shape\\b/gi);\n    return {\n      title: texts[0] || `Slide ${index + 1}`,\n      layout,\n      textCount: texts.length,\n      imageCount,\n      notesCount: countMatches(pageXml, /<presentation:notes\\b/gi),\n      hasTransition,\n      animationCount,\n      sampleTexts: texts.slice(0, 4)\n    };\n  });\n\n  const layouts = new Set(slides.map((slide) => slide.layout).filter(Boolean) as string[]);\n  return {\n    title,\n    slideCount: slides.length,\n    imageCount: Math.max(totalImages, slides.reduce((sum, slide) => sum + slide.imageCount, 0)),\n    notesCount: slides.reduce((sum, slide) => sum + slide.notesCount, 0),\n    transitionCount: slides.filter((slide) => slide.hasTransition).length,\n    animationCount: slides.reduce((sum, slide) => sum + slide.animationCount, 0),\n    layouts: Array.from(layouts),\n    slides\n  };\n}\n\nasync function renderPresentationInsight(panel: HTMLElement, insight: PresentationInsight): Promise<void> {\n  const summary = document.createElement(\"div\");\n  summary.className = \"ofv-presentation-summary\";\n  summary.hidden = true;\n  summary.setAttribute(\"aria-hidden\", \"true\");\n  summary.style.display = \"none\";\n  summary.dataset.slideCount = String(insight.slideCount);\n  summary.dataset.imageCount = String(insight.imageCount);\n  summary.dataset.notesCount = String(insight.notesCount);\n  summary.dataset.transitionCount = String(insight.transitionCount);\n  summary.dataset.animationCount = String(insight.animationCount);\n  const stats = [\n    `${insight.slideCount} 页`,\n    `${insight.layouts.length || 0} 种布局`,\n    `${insight.imageCount} 张图片`,\n    `${insight.notesCount} 条备注`,\n    `${insight.transitionCount} 页切换`,\n    `${insight.animationCount} 个动画标记`\n  ];\n  summary.append(createPresentationMetric(insight.title, stats.join(\" · \")));\n\n  if (insight.layouts.length > 0) {\n    summary.append(createPresentationMetric(\"布局\", insight.layouts.join(\"、\")));\n  }\n  panel.append(summary);\n}\n\nfunction createPresentationMetric(label: string, value: string): HTMLElement {\n  const metric = document.createElement(\"p\");\n  const strong = document.createElement(\"strong\");\n  strong.textContent = label;\n  const span = document.createElement(\"span\");\n  span.textContent = value;\n  metric.append(strong, span);\n  return metric;\n}\n\ntype PptxRelationship = {\n  id: string;\n  type: string;\n  target: string;\n};\n\nasync function readPptxRelationships(zip: JSZip, partPath: string): Promise<PptxRelationship[]> {\n  const relsPath = relationshipPathForPart(partPath);\n  const xml = await zip.file(relsPath)?.async(\"text\");\n  if (!xml) {\n    return [];\n  }\n  const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n  if (doc.querySelector(\"parsererror\")) {\n    return [];\n  }\n  return Array.from(doc.getElementsByTagNameNS(PPTX_REL_NS, \"Relationship\")).map((element) => ({\n    id: element.getAttribute(\"Id\") || \"\",\n    type: element.getAttribute(\"Type\") || \"\",\n    target: element.getAttribute(\"Target\") || \"\"\n  }));\n}\n\nasync function resolvePptxSlideLayout(zip: JSZip, slidePath: string, rels: PptxRelationship[]): Promise<string | undefined> {\n  const layoutRel = rels.find((rel) => /\\/slideLayout$/i.test(rel.type));\n  const layoutPath = resolvePptxRelationshipTarget(slidePath, layoutRel?.target);\n  const xml = layoutPath ? await zip.file(layoutPath)?.async(\"text\") : undefined;\n  if (!xml) {\n    return layoutPath?.split(\"/\").pop()?.replace(/\\.xml$/i, \"\");\n  }\n  return matchXmlAttribute(xml, /<p:cSld\\b[^>]*name=\"([^\"]+)\"/i) || layoutPath?.split(\"/\").pop()?.replace(/\\.xml$/i, \"\");\n}\n\nfunction countPptxSlideImages(xml: string, rels: PptxRelationship[]): number {\n  const relImageIds = new Set(rels.filter((rel) => /\\/image$/i.test(rel.type)).map((rel) => rel.id));\n  const embeddedIds = [...xml.matchAll(/<a:blip\\b[^>]*(?:r:embed|r:link)=\"([^\"]+)\"/gi)].map((match) => match[1]);\n  if (embeddedIds.length > 0) {\n    return embeddedIds.filter((id) => relImageIds.size === 0 || relImageIds.has(id)).length;\n  }\n  return relImageIds.size;\n}\n\nfunction relationshipPathForPart(partPath: string): string {\n  const parts = partPath.split(\"/\");\n  const fileName = parts.pop() || partPath;\n  return `${parts.join(\"/\")}/_rels/${fileName}.rels`;\n}\n\nfunction resolvePptxRelationshipTarget(sourcePath: string, target?: string): string | undefined {\n  if (!target || /^[a-z]+:/i.test(target)) {\n    return undefined;\n  }\n  if (target.startsWith(\"/\")) {\n    return target.slice(1);\n  }\n  const base = sourcePath.split(\"/\").slice(0, -1);\n  for (const segment of target.split(\"/\")) {\n    if (!segment || segment === \".\") {\n      continue;\n    }\n    if (segment === \"..\") {\n      base.pop();\n    } else {\n      base.push(segment);\n    }\n  }\n  return base.join(\"/\");\n}\n\nfunction slideNumberFromPath(path: string): number {\n  return Number(path.match(/slide(\\d+)\\.xml$/i)?.[1] || \"0\");\n}\n\nfunction countMatches(value: string, pattern: RegExp): number {\n  return [...value.matchAll(pattern)].length;\n}\n\nfunction matchXmlAttribute(value: string, pattern: RegExp): string | null {\n  const match = value.match(pattern);\n  return match ? decodeXml(match[1] || \"\") : null;\n}\n\nfunction titleFromOdf(xml: string, fallback: string): string {\n  return matchXmlAttribute(xml, /<office:meta[\\s\\S]*?<dc:title[^>]*>([\\s\\S]*?)<\\/dc:title>/i) || fallback;\n}\n\nfunction isLegacyOfficeBinary(extension: string): boolean {\n  return [\"doc\", \"dot\", \"wps\", \"xls\", \"xlt\", \"xlsb\", \"et\", \"ppt\", \"pps\", \"key\", \"dps\"].includes(extension);\n}\n\nfunction legacyOfficeFormatLabel(extension: string): string {\n  if (extension === \"doc\" || extension === \"dot\" || extension === \"wps\") {\n    return \"Word Binary File Format\";\n  }\n  if (extension === \"xls\" || extension === \"xlt\" || extension === \"xlsb\" || extension === \"et\") {\n    return \"Excel Binary File Format\";\n  }\n  if (extension === \"key\") {\n    return \"Apple Keynote / legacy presentation package\";\n  }\n  if (extension === \"dps\") {\n    return \"WPS Presentation legacy format\";\n  }\n  return \"PowerPoint Binary File Format\";\n}\n\ntype LegacyPresentationImageSource = {\n  src: string;\n  revoke: boolean;\n};\n\nasync function renderLegacyPowerPoint(panel: HTMLElement, arrayBuffer: ArrayBuffer): Promise<() => void> {\n  const presentation = await parseLegacyPowerPoint(arrayBuffer);\n  const imageSources = await prepareLegacyPowerPointImages(presentation.images);\n  const viewer = document.createElement(\"div\");\n  viewer.className = \"ofv-ppt-binary-viewer\";\n  viewer.style.setProperty(\"--ofv-ppt-aspect\", `${presentation.width} / ${presentation.height}`);\n\n  for (const [slideIndex, slide] of presentation.slides.entries()) {\n    const masterShapes = slide.masterShapes || presentation.masterShapes;\n    const hasMasterBackground = masterShapes.some(\n      (shape) =>\n        shape.imageIndices.some((index) => imageSources.has(index)) &&\n        shape.left <= presentation.width * 0.02 &&\n        shape.top <= presentation.height * 0.02 &&\n        shape.width >= presentation.width * 0.9 &&\n        shape.height >= presentation.height * 0.9\n    );\n    const article = document.createElement(\"article\");\n    article.className = `ofv-ppt-binary-slide${hasMasterBackground ? \" ofv-ppt-binary-has-master-background\" : \"\"}`;\n    article.dataset.slideIndex = String(slideIndex);\n    article.setAttribute(\"aria-label\", `Slide ${slideIndex + 1}`);\n\n    const canvas = document.createElement(\"div\");\n    canvas.className = \"ofv-ppt-binary-canvas\";\n    const tableCells = findLegacyPowerPointTableCells(slide.shapes);\n    const tableLines = findLegacyPowerPointTableLines(slide.shapes, tableCells);\n    const masterFillTexts = findLegacyPowerPointFillTexts(masterShapes);\n    const slideFillTexts = findLegacyPowerPointFillTexts(slide.shapes);\n    const masterDarkFillTexts = findLegacyPowerPointDarkFillTexts(masterShapes);\n    const slideDarkFillTexts = findLegacyPowerPointDarkFillTexts(slide.shapes);\n    const masterPictureOverlayTexts = findLegacyPowerPointPictureOverlayTexts(masterShapes);\n    const slidePictureOverlayTexts = findLegacyPowerPointPictureOverlayTexts(slide.shapes);\n    for (const shape of masterShapes) {\n      renderLegacyPowerPointShape(\n        canvas,\n        shape,\n        presentation,\n        slide.masterTextStyles,\n        imageSources,\n        true,\n        false,\n        false,\n        masterFillTexts.has(shape),\n        masterDarkFillTexts.has(shape),\n        masterPictureOverlayTexts.has(shape)\n      );\n    }\n    for (const shape of slide.shapes) {\n      renderLegacyPowerPointShape(\n        canvas,\n        shape,\n        presentation,\n        slide.masterTextStyles,\n        imageSources,\n        false,\n        tableCells.has(shape),\n        tableLines.has(shape),\n        slideFillTexts.has(shape),\n        slideDarkFillTexts.has(shape),\n        slidePictureOverlayTexts.has(shape)\n      );\n    }\n    if (!canvas.hasChildNodes()) {\n      const empty = document.createElement(\"p\");\n      empty.className = \"ofv-ppt-binary-empty\";\n      empty.textContent = `Slide ${slideIndex + 1}`;\n      canvas.append(empty);\n    }\n\n    const number = document.createElement(\"span\");\n    number.className = \"ofv-ppt-binary-slide-number\";\n    number.textContent = String(slideIndex + 1);\n    article.append(canvas, number);\n    viewer.append(article);\n  }\n\n  panel.replaceChildren(viewer);\n  return () => {\n    for (const source of imageSources.values()) {\n      if (source.revoke) {\n        URL.revokeObjectURL(source.src);\n      }\n    }\n  };\n}\n\nasync function prepareLegacyPowerPointImages(\n  images: LegacyPowerPointImage[]\n): Promise<Map<number, LegacyPresentationImageSource>> {\n  const sources = new Map<number, LegacyPresentationImageSource>();\n  const metafiles = images.filter((image) => image.kind !== \"bitmap\");\n  let converter: typeof import(\"emf-converter\") | undefined;\n  if (metafiles.length > 0) {\n    try {\n      converter = await import(\"emf-converter\");\n    } catch (error) {\n      console.warn(\"Presentation metafile renderer could not be loaded:\", error);\n    }\n  }\n\n  for (const image of images) {\n    if (image.kind === \"bitmap\") {\n      const url = URL.createObjectURL(new Blob([toStandaloneArrayBuffer(image.bytes)], { type: image.mimeType }));\n      sources.set(image.index, { src: url, revoke: true });\n      continue;\n    }\n    if (!converter) {\n      continue;\n    }\n    try {\n      const buffer = toStandaloneArrayBuffer(image.bytes);\n      const dataUrl =\n        image.kind === \"emf\"\n          ? await converter.convertEmfToDataUrl(buffer, { maxWidth: 1600, maxHeight: 1200, dpiScale: 1.5 })\n          : await converter.convertWmfToDataUrl(buffer, { maxWidth: 1600, maxHeight: 1200, dpiScale: 1.5 });\n      if (dataUrl) {\n        sources.set(image.index, { src: dataUrl, revoke: false });\n      }\n    } catch (error) {\n      console.warn(`Presentation ${image.kind.toUpperCase()} image could not be rendered:`, error);\n    }\n  }\n  return sources;\n}\n\nfunction renderLegacyPowerPointShape(\n  canvas: HTMLElement,\n  shape: LegacyPowerPointShape,\n  presentation: LegacyPowerPointPresentation,\n  masterTextStyles: LegacyPowerPointMasterTextStyles,\n  imageSources: Map<number, LegacyPresentationImageSource>,\n  master: boolean,\n  tableCell = false,\n  tableLine = false,\n  overFill = false,\n  overDarkFill = false,\n  pictureOverlay = false\n): void {\n  const usableImages = shape.imageIndices\n    .map((index) => imageSources.get(index))\n    .filter((source): source is LegacyPresentationImageSource => Boolean(source));\n  const texts = shape.texts;\n  const hasVisualStyle = shape.fillEnabled === true || shape.lineEnabled === true;\n  if (usableImages.length === 0 && texts.length === 0 && !hasVisualStyle) {\n    return;\n  }\n\n  const element = document.createElement(\"div\");\n  element.className = `ofv-ppt-binary-shape${master ? \" ofv-ppt-binary-master-shape\" : \"\"}`;\n  const left = clampPresentationRatio(shape.left / presentation.width, -1, 1);\n  const top = clampPresentationRatio(shape.top / presentation.height, -1, 1);\n  const width = clampPresentationRatio(shape.width / presentation.width, 0.001, 2);\n  const height = clampPresentationRatio(shape.height / presentation.height, 0.001, 2);\n  element.style.left = `${left * 100}%`;\n  element.style.top = `${top * 100}%`;\n  element.style.width = `${width * 100}%`;\n  element.style.height = `${height * 100}%`;\n  if (shape.fillEnabled && shape.fillColor) {\n    element.style.backgroundColor = shape.fillColor;\n  }\n  const isLineShape = shape.shapeType === 20;\n  if (shape.lineEnabled && !isLineShape) {\n    element.style.borderStyle = \"solid\";\n    element.style.borderColor = shape.lineColor || \"#000\";\n    element.style.borderWidth = `${shape.lineWidth || 0.75}pt`;\n  }\n  if (tableLine) {\n    element.style.borderColor = \"#fff\";\n  }\n  if (shape.rotation) {\n    element.style.transform = `rotate(${shape.rotation}deg)`;\n  }\n  if (shape.shapeType === 2) {\n    element.classList.add(\"ofv-ppt-binary-round-rectangle\");\n  } else if (shape.shapeType === 3 || shape.shapeType === 120) {\n    element.classList.add(\"ofv-ppt-binary-ellipse\");\n  } else if (shape.shapeType === 4) {\n    element.classList.add(\"ofv-ppt-binary-diamond\");\n  } else if (shape.shapeType === 20) {\n    element.classList.add(\"ofv-ppt-binary-line-shape\");\n  } else if (shape.shapeType === 67) {\n    element.classList.add(\"ofv-ppt-binary-down-arrow\");\n  } else if (shape.shapeType === 176) {\n    element.classList.add(\"ofv-ppt-binary-round-rectangle\");\n  } else if (shape.shapeType === 0 && shape.rotation) {\n    element.classList.add(\"ofv-ppt-binary-right-arrow\");\n  }\n\n  if (isLineShape && shape.lineEnabled) {\n    appendLegacyPowerPointLine(element, shape, tableLine ? \"#fff\" : shape.lineColor || \"#000\");\n  }\n\n  for (const source of usableImages) {\n    const image = document.createElement(\"img\");\n    image.className = \"ofv-ppt-binary-image\";\n    image.src = source.src;\n    image.alt = \"\";\n    image.draggable = false;\n    applyLegacyPowerPointImageCrop(image, shape);\n    element.append(image);\n  }\n\n  if (texts.length > 0) {\n    const text = document.createElement(\"div\");\n    const filledText = (shape.fillEnabled && shape.fillColor) || overFill ? \" ofv-ppt-binary-filled-text\" : \"\";\n    const sectionNumber = isLegacyPowerPointSectionNumber(shape, presentation)\n      ? \" ofv-ppt-binary-section-number\"\n      : \"\";\n    const sectionHeading = isLegacyPowerPointSectionHeading(shape, presentation)\n      ? \" ofv-ppt-binary-section-heading\"\n      : \"\";\n    const pictureOverlayText = pictureOverlay ? \" ofv-ppt-binary-picture-overlay-text\" : \"\";\n    const textKind = master\n      ? \"\"\n      : isLegacyPowerPointTitle(shape, presentation)\n        ? \" ofv-ppt-binary-title\"\n        : tableCell\n          ? \" ofv-ppt-binary-table-cell\"\n          : isLegacyPowerPointBody(shape, presentation)\n            ? \" ofv-ppt-binary-body-text\"\n            : \"\";\n    text.className = `ofv-ppt-binary-text${textKind}${filledText}${sectionNumber}${sectionHeading}${pictureOverlayText}`;\n    if (!filledText && !sectionNumber && !pictureOverlayText && !tableCell && !shape.verticalText) {\n      text.classList.add(\"ofv-ppt-binary-plain-text\");\n    }\n    if (shape.verticalText) {\n      text.classList.add(\"ofv-ppt-binary-vertical-text\");\n      element.classList.add(\"ofv-ppt-binary-vertical-text-shape\");\n    }\n    if (overDarkFill || (shape.fillColor && hasDarkPresentationFill(shape.fillColor))) {\n      text.style.color = \"#fff\";\n    }\n    const formattedTexts = shape.formattedTexts || [];\n    const binaryStyled = formattedTexts.some(\n      (block) =>\n        block.characterRuns.some((run) =>\n          run.bold !== undefined ||\n          run.italic !== undefined ||\n          run.underline !== undefined ||\n          run.fontSize !== undefined ||\n          run.color !== undefined ||\n          run.fontRef !== undefined\n        ) || block.paragraphRuns.some((run) => run.alignment !== undefined || run.lineSpacing !== undefined)\n    );\n    if (binaryStyled) {\n      text.classList.add(\"ofv-ppt-binary-styled-text\");\n      if (texts.every((value) => !/[\\r\\n]/.test(value)) && texts.join(\"\").length <= 16) {\n        element.classList.add(\"ofv-ppt-binary-short-text-shape\");\n        if (texts.join(\"\") !== \"Contents Page\" && !filledText) {\n          element.classList.add(\"ofv-ppt-binary-nowrap-short-text-shape\");\n        }\n      }\n      if (textKind.includes(\"ofv-ppt-binary-title\") && !/[\\r\\n]/.test(texts.join(\"\")) && texts.join(\"\").length > 16) {\n        element.classList.add(\"ofv-ppt-binary-nowrap-title-shape\");\n      }\n      renderLegacyPowerPointFormattedText(\n        text,\n        formattedTexts,\n        presentation.fonts,\n        masterTextStyles[shape.textType ?? 4] || []\n      );\n    } else {\n      text.textContent = texts.join(\"\\n\");\n    }\n    element.append(text);\n  }\n  canvas.append(element);\n}\n\nfunction appendLegacyPowerPointLine(\n  target: HTMLElement,\n  shape: LegacyPowerPointShape,\n  color: string\n): void {\n  const namespace = \"http://www.w3.org/2000/svg\";\n  const svg = document.createElementNS(namespace, \"svg\");\n  svg.classList.add(\"ofv-ppt-binary-line-svg\");\n  svg.setAttribute(\"viewBox\", \"0 0 100 100\");\n  svg.setAttribute(\"preserveAspectRatio\", \"none\");\n  const line = document.createElementNS(namespace, \"line\");\n  line.setAttribute(\"x1\", shape.flipHorizontal ? \"100\" : \"0\");\n  line.setAttribute(\"y1\", shape.flipVertical ? \"100\" : \"0\");\n  line.setAttribute(\"x2\", shape.flipHorizontal ? \"0\" : \"100\");\n  line.setAttribute(\"y2\", shape.flipVertical ? \"0\" : \"100\");\n  line.setAttribute(\"vector-effect\", \"non-scaling-stroke\");\n  line.style.stroke = color;\n  line.style.strokeWidth = `${(shape.lineWidth || 0.75) / 7.2}cqw`;\n  svg.append(line);\n  target.append(svg);\n}\n\nfunction applyLegacyPowerPointImageCrop(image: HTMLImageElement, shape: LegacyPowerPointShape): void {\n  const top = shape.imageCropTop || 0;\n  const bottom = shape.imageCropBottom || 0;\n  const left = shape.imageCropLeft || 0;\n  const right = shape.imageCropRight || 0;\n  if (top === 0 && bottom === 0 && left === 0 && right === 0) return;\n  const visibleWidth = Math.max(0.01, 1 - left - right);\n  const visibleHeight = Math.max(0.01, 1 - top - bottom);\n  image.style.position = \"absolute\";\n  image.style.maxWidth = \"none\";\n  image.style.width = `${100 / visibleWidth}%`;\n  image.style.height = `${100 / visibleHeight}%`;\n  image.style.left = `${(-left / visibleWidth) * 100}%`;\n  image.style.top = `${(-top / visibleHeight) * 100}%`;\n}\n\nfunction renderLegacyPowerPointFormattedText(\n  target: HTMLElement,\n  blocks: NonNullable<LegacyPowerPointShape[\"formattedTexts\"]>,\n  fonts: string[],\n  masterStyles: LegacyPowerPointCharacterStyle[]\n): void {\n  for (const [blockIndex, block] of blocks.entries()) {\n    if (blockIndex > 0) target.append(document.createTextNode(\"\\n\"));\n    const firstParagraph = block.paragraphRuns[0];\n    if (firstParagraph?.alignment) target.style.textAlign = firstParagraph.alignment;\n    if (firstParagraph?.lineSpacing) {\n      // PowerPoint percentages are relative to its normal line box, which is\n      // approximately 1.2 times the font size. CSS unitless line-height is\n      // relative to the font size itself, so preserve that extra baseline.\n      target.style.lineHeight = String(firstParagraph.lineSpacing * 1.2);\n    }\n\n    let cursor = 0;\n    for (const run of block.characterRuns) {\n      const paragraph = block.paragraphRuns.find(\n        (candidate) => run.start >= candidate.start && run.start < candidate.start + Math.max(1, candidate.length)\n      );\n      const inherited = masterStyles[paragraph?.indentLevel || 0] || masterStyles[0] || {};\n      const effective = { ...inherited, ...run };\n      const start = Math.max(cursor, Math.min(block.text.length, run.start));\n      if (start > cursor) target.append(document.createTextNode(block.text.slice(cursor, start)));\n      const end = Math.max(start, Math.min(block.text.length, run.start + run.length));\n      if (end > start) {\n        const span = document.createElement(\"span\");\n        span.textContent = block.text.slice(start, end);\n        if (effective.bold !== undefined) span.style.fontWeight = effective.bold ? \"700\" : \"400\";\n        if (effective.italic !== undefined) span.style.fontStyle = effective.italic ? \"italic\" : \"normal\";\n        if (effective.underline !== undefined) {\n          span.style.textDecoration = effective.underline ? \"underline\" : \"none\";\n        }\n        if (effective.fontSize !== undefined && effective.fontSize > 0) {\n          // A legacy slide uses 1/8-point master units. Expressing point sizes\n          // relative to the 720-point-wide slide keeps text scaled with the\n          // responsive canvas instead of pinning it to CSS physical points.\n          span.style.fontSize = `${effective.fontSize / 7.2}cqw`;\n        }\n        if (effective.color) span.style.color = effective.color;\n        const fontFamily = effective.fontRef === undefined ? undefined : fonts[effective.fontRef];\n        if (fontFamily) span.style.fontFamily = `\"${fontFamily.replaceAll('\"', '\\\\\"')}\", sans-serif`;\n        target.append(span);\n      }\n      cursor = Math.max(cursor, end);\n    }\n    if (cursor < block.text.length) target.append(document.createTextNode(block.text.slice(cursor)));\n  }\n}\n\nfunction isLegacyPowerPointTitle(shape: LegacyPowerPointShape, presentation: LegacyPowerPointPresentation): boolean {\n  const shortSingleLineText = shape.texts.length === 1 && !shape.texts[0].includes(\"\\n\") && shape.texts[0].length <= 32;\n  return (\n    shape.textType === 0 ||\n    shape.textType === 6 ||\n    (shortSingleLineText && shape.width >= presentation.width * 0.6 && shape.height <= presentation.height * 0.18)\n  );\n}\n\nfunction isLegacyPowerPointSectionNumber(\n  shape: LegacyPowerPointShape,\n  presentation: LegacyPowerPointPresentation\n): boolean {\n  return (\n    shape.texts.length === 1 &&\n    /^[1-9一二三四五六七八九十]$/.test(shape.texts[0]) &&\n    shape.width <= presentation.width * 0.1 &&\n    shape.height <= presentation.height * 0.11 &&\n    shape.width / Math.max(1, shape.height) >= 0.65 &&\n    shape.width / Math.max(1, shape.height) <= 1.55\n  );\n}\n\nfunction isLegacyPowerPointSectionHeading(\n  shape: LegacyPowerPointShape,\n  presentation: LegacyPowerPointPresentation\n): boolean {\n  const shortSingleLineText = shape.texts.length === 1 && !shape.texts[0].includes(\"\\n\") && shape.texts[0].length <= 28;\n  const nearTopLeft = shape.top < presentation.height * 0.12 && shape.left < presentation.width * 0.2;\n  const sectionPageTitle =\n    shape.top >= presentation.height * 0.15 &&\n    shape.top < presentation.height * 0.3 &&\n    shape.left >= presentation.width * 0.2 &&\n    shape.left < presentation.width * 0.4 &&\n    shape.width >= presentation.width * 0.5;\n  return shortSingleLineText && shape.width >= presentation.width * 0.2 && (nearTopLeft || sectionPageTitle);\n}\n\nfunction hasDarkPresentationFill(color: string): boolean {\n  const match = /^#([\\da-f]{2})([\\da-f]{2})([\\da-f]{2})$/i.exec(color);\n  if (!match) return false;\n  const [red, green, blue] = match.slice(1).map((channel) => Number.parseInt(channel, 16));\n  return red * 0.299 + green * 0.587 + blue * 0.114 < 145;\n}\n\nfunction findLegacyPowerPointDarkFillTexts(shapes: LegacyPowerPointShape[]): Set<LegacyPowerPointShape> {\n  const darkVisuals = shapes.filter(\n    (shape) => shape.fillEnabled && shape.fillColor && hasDarkPresentationFill(shape.fillColor) && shape.texts.length === 0\n  );\n  const pictureOverlayTexts = findLegacyPowerPointPictureOverlayTexts(shapes);\n  return new Set(\n    shapes.filter((shape) => {\n      if (shape.texts.length === 0 || (shape.fillEnabled && shape.fillColor)) return false;\n      const centerX = shape.left + shape.width / 2;\n      const centerY = shape.top + shape.height / 2;\n      return (\n        darkVisuals.some((visual) => containsPresentationPoint(visual, centerX, centerY)) || pictureOverlayTexts.has(shape)\n      );\n    })\n  );\n}\n\nfunction findLegacyPowerPointFillTexts(shapes: LegacyPowerPointShape[]): Set<LegacyPowerPointShape> {\n  const visuals = shapes.filter((shape) => shape.fillEnabled && shape.fillColor && shape.texts.length === 0);\n  const pictureOverlayTexts = findLegacyPowerPointPictureOverlayTexts(shapes);\n  return new Set(\n    shapes.filter((shape) => {\n      if (shape.texts.length === 0 || (shape.fillEnabled && shape.fillColor)) return false;\n      const centerX = shape.left + shape.width / 2;\n      const centerY = shape.top + shape.height / 2;\n      return (\n        visuals.some((visual) => containsPresentationPoint(visual, centerX, centerY)) || pictureOverlayTexts.has(shape)\n      );\n    })\n  );\n}\n\nfunction containsPresentationPoint(shape: LegacyPowerPointShape, x: number, y: number): boolean {\n  return x >= shape.left && x <= shape.left + shape.width && y >= shape.top && y <= shape.top + shape.height;\n}\n\nfunction findLegacyPowerPointPictureOverlayTexts(shapes: LegacyPowerPointShape[]): Set<LegacyPowerPointShape> {\n  const pictures = shapes.filter((shape) => shape.shapeType === 75 && shape.texts.length === 0);\n  return new Set(\n    shapes.filter((shape) => {\n      const centerX = shape.left + shape.width / 2;\n      const centerY = shape.top + shape.height / 2;\n      return isLongPictureOverlayText(shape, pictures, centerX, centerY);\n    })\n  );\n}\n\nfunction isLongPictureOverlayText(\n  shape: LegacyPowerPointShape,\n  pictures: LegacyPowerPointShape[],\n  centerX: number,\n  centerY: number\n): boolean {\n  return (\n    shape.texts.join(\"\").length > 32 &&\n    shape.width >= 3000 &&\n    shape.height <= 700 &&\n    pictures.some((picture) => containsPresentationPoint(picture, centerX, centerY))\n  );\n}\n\nfunction isLegacyPowerPointBody(shape: LegacyPowerPointShape, presentation: LegacyPowerPointPresentation): boolean {\n  return (\n    [1, 5, 7, 8].includes(shape.textType ?? -1) ||\n    (shape.top < presentation.height * 0.24 && shape.height > presentation.height * 0.45)\n  );\n}\n\nfunction findLegacyPowerPointTableCells(shapes: LegacyPowerPointShape[]): Set<LegacyPowerPointShape> {\n  const rows = new Map<number, LegacyPowerPointShape[]>();\n  for (const shape of shapes) {\n    if (shape.texts.length !== 1 || shape.imageIndices.length > 0 || shape.texts[0].length > 80) {\n      continue;\n    }\n    const key = Math.round(shape.top / 4) * 4;\n    const row = rows.get(key) || [];\n    row.push(shape);\n    rows.set(key, row);\n  }\n  const cells = new Set<LegacyPowerPointShape>();\n  for (const row of rows.values()) {\n    if (row.length >= 3) {\n      row.forEach((shape) => cells.add(shape));\n    }\n  }\n  return cells;\n}\n\nfunction findLegacyPowerPointTableLines(\n  shapes: LegacyPowerPointShape[],\n  cells: Set<LegacyPowerPointShape>\n): Set<LegacyPowerPointShape> {\n  if (cells.size < 8) return new Set();\n  const cellList = [...cells];\n  const left = Math.min(...cellList.map((shape) => shape.left));\n  const top = Math.min(...cellList.map((shape) => shape.top));\n  const right = Math.max(...cellList.map((shape) => shape.left + shape.width));\n  const bottom = Math.max(...cellList.map((shape) => shape.top + shape.height));\n  const tolerance = 24;\n  return new Set(\n    shapes.filter(\n      (shape) =>\n        shape.shapeType === 20 &&\n        shape.texts.length === 0 &&\n        shape.left + shape.width >= left - tolerance &&\n        shape.left <= right + tolerance &&\n        shape.top + shape.height >= top - tolerance &&\n        shape.top <= bottom + tolerance\n    )\n  );\n}\n\nfunction clampPresentationRatio(value: number, minimum = 0, maximum = 1): number {\n  return Number.isFinite(value) ? Math.min(maximum, Math.max(minimum, value)) : minimum;\n}\n\nfunction toStandaloneArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n  return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;\n}\n\nfunction renderLegacyWordBinary(\n  panel: HTMLElement,\n  extension: string,\n  arrayBuffer: ArrayBuffer,\n  messages: PreviewMessages\n): void {\n  try {\n    renderLegacyWordDocument(panel, parseLegacyWordDocument(arrayBuffer));\n  } catch (error) {\n    renderLegacyOfficeBinary(\n      panel,\n      extension,\n      arrayBuffer,\n      messages,\n      formatPreviewMessage(messages.officeLegacyWordParseFailed, { message: normalizeOfficeError(error, messages) })\n    );\n  }\n}\n\nfunction renderLegacyOfficeBinary(\n  panel: HTMLElement,\n  extension: string,\n  arrayBuffer: ArrayBuffer,\n  messages: PreviewMessages,\n  parseError?: string\n): void {\n  const fragments = extractLegacyOfficeText(arrayBuffer);\n  panel.replaceChildren();\n  const section = createSection(messages.officeLegacyConversionTitle);\n  section.classList.add(\"ofv-office-conversion\");\n  const format = document.createElement(\"p\");\n  const strong = document.createElement(\"strong\");\n  strong.textContent = `.${extension}`;\n  format.append(strong, document.createTextNode(\" \"), document.createTextNode(messages.officeLegacyBinaryNotice));\n\n  const meta = document.createElement(\"dl\");\n  meta.className = \"ofv-office-binary-meta\";\n  appendOfficeBinaryMeta(meta, messages.officeLegacyMetaFormatType, legacyOfficeFormatLabel(extension));\n  appendOfficeBinaryMeta(\n    meta,\n    messages.officeLegacyMetaFileStructure,\n    hasOleSignature(arrayBuffer) ? messages.officeLegacyOleDetected : messages.officeLegacyOleMissing\n  );\n  appendOfficeBinaryMeta(\n    meta,\n    messages.officeLegacyMetaTextFragments,\n    formatPreviewMessage(messages.officeLegacyTextFragmentCount, { count: fragments.length.toLocaleString() })\n  );\n  if (parseError) {\n    appendOfficeBinaryMeta(meta, messages.officeLegacyMetaParseStatus, parseError);\n  }\n\n  section.append(format, meta);\n\n  if (fragments.length > 0) {\n    const article = document.createElement(\"article\");\n    article.className = \"ofv-document ofv-office-binary-fragments\";\n    const heading = document.createElement(\"h4\");\n    heading.textContent = messages.officeLegacyReadableFragments;\n    article.append(heading);\n    for (const fragment of fragments.slice(0, 80)) {\n      const paragraph = document.createElement(\"p\");\n      paragraph.textContent = fragment;\n      article.append(paragraph);\n    }\n    section.append(article);\n  } else {\n    const empty = document.createElement(\"p\");\n    empty.className = \"ofv-office-binary-empty\";\n    empty.textContent = messages.officeLegacyNoText;\n    section.append(empty);\n  }\n\n  panel.append(section);\n}\n\nfunction appendOfficeBinaryMeta(list: HTMLDListElement, label: string, value: string): void {\n  const term = document.createElement(\"dt\");\n  term.textContent = label;\n  const detail = document.createElement(\"dd\");\n  detail.textContent = value;\n  list.append(term, detail);\n}\n\nfunction renderUnsupportedOffice(panel: HTMLElement, extension: string, messages: PreviewMessages): void {\n  const legacyBinary = new Set([\"doc\", \"dot\", \"wps\", \"ppt\", \"pps\", \"key\", \"dps\"]);\n  const message = legacyBinary.has(extension)\n    ? messages.officeUnsupportedLegacyMessage\n    : messages.officeUnsupportedGenericMessage;\n  panel.replaceChildren();\n  const section = createSection(messages.officeUnsupportedTitle);\n  const format = document.createElement(\"p\");\n  const strong = document.createElement(\"strong\");\n  strong.textContent = `.${extension}`;\n  format.append(\n    strong,\n    document.createTextNode(\" \"),\n    document.createTextNode(formatPreviewMessage(messages.officeUnsupportedIntro, { message }))\n  );\n\n  const support = document.createElement(\"p\");\n  support.textContent = messages.officeUnsupportedSupportedFormats;\n\n  section.append(format, support);\n  panel.append(section);\n}\n\nfunction normalizeOfficeError(error: unknown, messages: PreviewMessages): string {\n  const message = error instanceof Error ? error.message : String(error || \"\");\n  return message\n    ? formatPreviewMessage(messages.officeErrorWithMessage, { message })\n    : messages.officeErrorWithoutMessage;\n}\n\nfunction extractLegacyOfficeText(arrayBuffer: ArrayBuffer): string[] {\n  const bytes = new Uint8Array(arrayBuffer);\n  const fragments = [\n    ...extractPrintableRuns(bytes).map((text) => ({ text, source: \"ascii\" as const })),\n    ...extractUtf16Runs(bytes).map((text) => ({ text, source: \"utf16\" as const }))\n  ]\n    .map(({ text, source }) => ({ text: normalizeLegacyText(text), source }))\n    .filter(({ text, source }) => isReadableLegacyTextFragment(text, source));\n  const unique: string[] = [];\n  const seen = new Set<string>();\n  for (const { text: fragment } of fragments) {\n    const key = fragment.toLowerCase();\n    if (!seen.has(key)) {\n      seen.add(key);\n      unique.push(fragment);\n    }\n  }\n  return unique.slice(0, 160);\n}\n\nfunction isReadableLegacyTextFragment(fragment: string, source: LegacyOfficeTextSource): boolean {\n  if (fragment.length > 600) {\n    return false;\n  }\n  if (isLegacyOfficeMetadataNoise(fragment)) {\n    return false;\n  }\n  if (!/[\\p{L}\\p{N}]/u.test(fragment)) {\n    return false;\n  }\n  const chars = Array.from(fragment);\n  const letters = chars.filter((char) => /\\p{L}/u.test(char)).length;\n  const digits = chars.filter((char) => /\\p{N}/u.test(char)).length;\n  const spaces = chars.filter((char) => /\\s/u.test(char)).length;\n  const asciiLetters = chars.filter((char) => /[A-Za-z]/.test(char)).length;\n  const cjkLetters = chars.filter((char) => /[\\u3400-\\u9fff]/u.test(char)).length;\n  const punctuation = chars.filter((char) => /[^\\p{L}\\p{N}\\s]/u.test(char)).length;\n  const alphaNumeric = letters + digits;\n  const readableRatio = alphaNumeric / chars.length;\n  const punctuationRatio = punctuation / chars.length;\n\n  if (fragment.length < 4 || readableRatio < 0.55 || punctuationRatio > 0.24) {\n    return false;\n  }\n  if (/([\\p{L}\\p{N}])\\1{4,}/u.test(fragment)) {\n    return false;\n  }\n  if (cjkLetters >= 2) {\n    const suspiciousCjk = chars.filter((char) => isAsciiBytePairCjk(char)).length;\n    if (suspiciousCjk / cjkLetters > 0.65) {\n      return false;\n    }\n    if (isLikelyCjkHeading(fragment)) {\n      return true;\n    }\n    if (punctuation > 0 && fragment.length < 12) {\n      return false;\n    }\n    return cjkLetters >= 8 || (cjkLetters >= 4 && spaces > 0);\n  }\n  if (asciiLetters >= 4) {\n    if (punctuation > 0 && spaces === 0) {\n      return false;\n    }\n    if (source === \"ascii\" && /^[A-Z]{2,8}$/.test(fragment)) {\n      return false;\n    }\n    if (spaces > 0) {\n      return letters >= 3;\n    }\n    return fragment.length >= 6;\n  }\n  if (spaces > 0 && letters >= 3) {\n    return true;\n  }\n  return false;\n}\n\nfunction isLegacyOfficeMetadataNoise(fragment: string): boolean {\n  if (/[$�\\uFFFD]/u.test(fragment)) {\n    return true;\n  }\n  if (/^(?:Root Entry|WordDocument|Workbook|Book|SummaryInformation|DocumentSummaryInformation|CompObj|ObjectPool|Data|PowerPoint Document|Pictures)$/i.test(fragment)) {\n    return true;\n  }\n  if (/\\.(dotm?|docm?|pptx?|ppsx?|xlsm?|xlsx?)\\b/i.test(fragment)) {\n    return true;\n  }\n  if (/^(?:默认段落字体|普通表格|正文|标题|副标题|目录|页眉|页脚|批注|超链接)(?:\\s*\\d+)?$/.test(fragment)) {\n    return true;\n  }\n  if (/\\b(?:Normal|Default|Calibri|Times New Roman|WPS Office|Microsoft Office|KSOP?ProductBuildVer)\\b/i.test(fragment)) {\n    return true;\n  }\n  if (/^\\d+(?:Table|List|Heading|Title|Style)$/i.test(fragment)) {\n    return true;\n  }\n  if (/[{(]?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}[})]?/i.test(fragment)) {\n    return true;\n  }\n  if (/^[A-Z_]{3,}$/.test(fragment) || /^[A-Za-z]+(?:Information|Document|Storage|Stream|Table|Data|Pool|Obj|Props)$/i.test(fragment)) {\n    return true;\n  }\n  return false;\n}\n\nfunction isLikelyCjkHeading(fragment: string): boolean {\n  return /^(?:标题|第[一二三四五六七八九十\\d]+[章节条]|[一二三四五六七八九十\\d]+[、.．])\\s*[\\p{L}\\p{N}\\s-]*$/u.test(fragment);\n}\n\nfunction isAsciiBytePairCjk(char: string): boolean {\n  const code = char.codePointAt(0) || 0;\n  if (code < 0x3400 || code > 0x9fff) {\n    return false;\n  }\n  const low = code & 0xff;\n  const high = code >> 8;\n  return isPrintableAsciiByte(low) && isPrintableAsciiByte(high);\n}\n\nfunction isPrintableAsciiByte(value: number): boolean {\n  return value >= 0x20 && value <= 0x7e;\n}\n\nfunction extractPrintableRuns(bytes: Uint8Array): string[] {\n  const fragments: string[] = [];\n  let current = \"\";\n  for (const byte of bytes) {\n    if ((byte >= 32 && byte <= 126) || byte === 9) {\n      current += String.fromCharCode(byte);\n    } else {\n      if (current.length >= 4) {\n        fragments.push(current);\n      }\n      current = \"\";\n    }\n  }\n  if (current.length >= 4) {\n    fragments.push(current);\n  }\n  return fragments;\n}\n\nfunction extractUtf16Runs(bytes: Uint8Array): string[] {\n  const fragments: string[] = [];\n  let current = \"\";\n  for (let index = 0; index < bytes.length - 1; index += 2) {\n    if (looksLikeMisalignedAsciiUtf16(bytes[index], bytes[index + 1])) {\n      if (current.length >= 3) {\n        fragments.push(current);\n      }\n      current = \"\";\n      continue;\n    }\n    const code = bytes[index] | (bytes[index + 1] << 8);\n    if ((code >= 32 && code <= 0xd7ff) || code === 9) {\n      current += String.fromCharCode(code);\n    } else {\n      if (current.length >= 3) {\n        fragments.push(current);\n      }\n      current = \"\";\n    }\n  }\n  if (current.length >= 3) {\n    fragments.push(current);\n  }\n  return fragments;\n}\n\nfunction looksLikeMisalignedAsciiUtf16(lowByte: number, highByte: number): boolean {\n  return lowByte === 0 && ((highByte >= 48 && highByte <= 57) || (highByte >= 65 && highByte <= 90) || (highByte >= 97 && highByte <= 122));\n}\n\nfunction normalizeLegacyText(value: string): string {\n  return value.replace(/[\\u0000-\\u001f]+/g, \" \").replace(/\\s+/g, \" \").trim();\n}\n\nfunction hasOleSignature(arrayBuffer: ArrayBuffer): boolean {\n  const signature = Array.from(new Uint8Array(arrayBuffer.slice(0, 8)));\n  return signature.join(\",\") === \"208,207,17,224,161,177,26,225\";\n}\n\nasync function extractZipImages(\n  zip: JSZip,\n  pattern: RegExp\n): Promise<Array<{ name: string; src: string }>> {\n  const images: Array<{ name: string; src: string }> = [];\n  for (const entry of Object.values(zip.files).filter((item) => !item.dir && pattern.test(item.name))) {\n    const mimeType = mimeTypeFromPath(entry.name);\n    if (!mimeType.startsWith(\"image/\")) {\n      continue;\n    }\n    images.push({\n      name: entry.name.split(\"/\").pop() || entry.name,\n      src: `data:${mimeType};base64,${await entry.async(\"base64\")}`\n    });\n  }\n  return images;\n}\n\nfunction extractOpenXmlText(xml: string): string[] {\n  return [...xml.matchAll(/<a:t\\b[^>]*>([\\s\\S]*?)<\\/a:t>|<w:t\\b[^>]*>([\\s\\S]*?)<\\/w:t>/g)]\n    .map((match) => cleanOpenXmlText(decodeXml(match[1] || match[2] || \"\")).trim())\n    .filter(Boolean);\n}\n\nfunction extractWordParagraphs(xml: string): string[] {\n  const documentXml = parseWordXml(xml);\n  if (documentXml) {\n    const paragraphs = Array.from(documentXml.getElementsByTagName(\"*\"))\n      .filter((element) => element.localName === \"p\")\n      .map((paragraph) => extractOpenXmlTextFromElement(paragraph).join(\"\"))\n      .map((text) => text.trim())\n      .filter(Boolean);\n    if (paragraphs.length > 0) {\n      return paragraphs;\n    }\n  }\n  return extractWordParagraphsByRegex(xml);\n}\n\nfunction extractWordTextboxText(xml: string): string[] {\n  return [...xml.matchAll(/<w:txbxContent\\b[\\s\\S]*?<\\/w:txbxContent>/g)]\n    .map((match) => extractOpenXmlText(match[0]).join(\"\"))\n    .map((text) => text.trim())\n    .filter(Boolean);\n}\n\nfunction extractWordTextboxParagraphs(xml: string): string[] {\n  const paragraphs = extractWordTextboxParagraphsByRegex(xml);\n  if (paragraphs.length > 0) {\n    return paragraphs;\n  }\n  const documentXml = parseWordXml(xml);\n  return documentXml\n    ? Array.from(documentXml.getElementsByTagName(\"*\"))\n        .filter((element) => element.localName === \"txbxContent\")\n        .flatMap((textbox) =>\n          Array.from(textbox.getElementsByTagName(\"*\"))\n            .filter((element) => element.localName === \"p\")\n            .map((paragraph) => extractOpenXmlTextFromElement(paragraph).join(\"\"))\n            .map((text) => text.trim())\n            .filter(Boolean)\n        )\n    : [];\n}\n\nfunction parseWordXml(xml: string): Document | undefined {\n  if (typeof DOMParser === \"undefined\") {\n    return undefined;\n  }\n  try {\n    const documentXml = new DOMParser().parseFromString(xml, \"application/xml\");\n    if (documentXml.getElementsByTagName(\"parsererror\").length > 0) {\n      return undefined;\n    }\n    return documentXml;\n  } catch {\n    return undefined;\n  }\n}\n\nfunction extractWordParagraphsByRegex(xml: string): string[] {\n  return [...xml.matchAll(/<w:p\\b[\\s\\S]*?<\\/w:p>/g)]\n    .map((match) => extractOpenXmlText(match[0]).join(\"\"))\n    .map((text) => text.trim())\n    .filter(Boolean);\n}\n\nfunction extractWordTextboxParagraphsByRegex(xml: string): string[] {\n  return [...xml.matchAll(/<w:txbxContent\\b[\\s\\S]*?<\\/w:txbxContent>/g)].flatMap((match) => {\n    const textboxXml = ensureWordXmlWrapper(match[0]);\n    const textboxDocument = parseWordXml(textboxXml);\n    if (textboxDocument) {\n      const paragraphs = Array.from(textboxDocument.getElementsByTagName(\"*\"))\n        .filter((element) => element.localName === \"p\")\n        .map((paragraph) => extractOpenXmlTextFromElement(paragraph).join(\"\"))\n        .map((text) => text.trim())\n        .filter(Boolean);\n      if (paragraphs.length > 0) {\n        return paragraphs;\n      }\n    }\n    return extractWordParagraphsByRegex(match[0]);\n  });\n}\n\nfunction ensureWordXmlWrapper(xml: string): string {\n  return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n    <ofv:root\n      xmlns:ofv=\"urn:open-file-viewer\"\n      xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"\n      xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\"\n      xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\"\n      xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\"\n      xmlns:v=\"urn:schemas-microsoft-com:vml\">\n      ${xml}\n    </ofv:root>`;\n}\n\nfunction extractOpenXmlTextFromElement(element: Element): string[] {\n  return Array.from(element.getElementsByTagName(\"*\"))\n    .filter((child) => child.localName === \"t\")\n    .map((child) => cleanOpenXmlText(child.textContent || \"\").trim())\n    .filter(Boolean);\n}\n\nfunction cleanOpenXmlText(value: string): string {\n  return value.replace(/<\\/?[A-Za-z][\\w:.-]*(?:\\s+[^<>]*)?>/g, \"\");\n}\n\nfunction dedupeParagraphs(paragraphs: string[]): string[] {\n  const result: string[] = [];\n  const seen = new Set<string>();\n  for (const paragraph of paragraphs) {\n    const key = normalizePreviewText(paragraph);\n    if (!key || key === normalizePreviewText(result[result.length - 1] || \"\") || seen.has(key)) {\n      continue;\n    }\n    seen.add(key);\n    result.push(paragraph);\n  }\n  return result;\n}\n\nfunction filterCombinedTextboxParagraphs(documentParagraphs: string[], textboxParagraphs: string[]): string[] {\n  const textboxKeys = textboxParagraphs.map((paragraph) => normalizePreviewText(paragraph)).filter(Boolean);\n  if (textboxKeys.length < 2) {\n    return documentParagraphs;\n  }\n  const combinedTextboxKey = textboxKeys.join(\"\");\n  const sortedTextboxKeys = [...textboxKeys].sort((a, b) => b.length - a.length);\n  return documentParagraphs.filter((paragraph) => {\n    const key = normalizePreviewText(paragraph);\n    return (\n      key &&\n      key !== combinedTextboxKey &&\n      key !== `${combinedTextboxKey}${combinedTextboxKey}` &&\n      !isComposedOfTextboxParagraphs(key, sortedTextboxKeys)\n    );\n  });\n}\n\nfunction isComposedOfTextboxParagraphs(value: string, textboxKeys: string[]): boolean {\n  let remaining = value;\n  let matchedCount = 0;\n  for (const key of textboxKeys) {\n    if (!key || !remaining.includes(key)) {\n      continue;\n    }\n    const before = remaining.length;\n    remaining = remaining.split(key).join(\"\");\n    if (remaining.length !== before) {\n      matchedCount += Math.floor((before - remaining.length) / key.length);\n    }\n  }\n  return matchedCount >= 2 && remaining.length === 0;\n}\n\nfunction extractOpenDocumentBlocks(xml: string): string[] {\n  return [...xml.matchAll(/<(?:text:p|text:h)[^>]*>([\\s\\S]*?)<\\/(?:text:p|text:h)>/g)]\n    .map((match) => stripXmlTags(match[1] || \"\"))\n    .map((text) => decodeXml(text).trim())\n    .filter(Boolean);\n}\n\nfunction stripXmlTags(value: string): string {\n  return value\n    .replace(/<text:line-break\\s*\\/>/g, \"\\n\")\n    .replace(/<text:tab\\s*\\/>/g, \"\\t\")\n    .replace(/<[^>]+>/g, \"\");\n}\n\nfunction rtfToText(rtf: string): string {\n  return rtf\n    .replace(/\\\\'[0-9a-fA-F]{2}/g, \"\")\n    .replace(/\\\\par[d]?/g, \"\\n\")\n    .replace(/\\\\tab/g, \"\\t\")\n    .replace(/\\\\[a-zA-Z]+\\d* ?/g, \"\")\n    .replace(/[{}]/g, \"\")\n    .replace(/\\n{3,}/g, \"\\n\\n\")\n    .trim();\n}\n\nasync function readTextFromBuffer(arrayBuffer: ArrayBuffer): Promise<string> {\n  return decodeTextBuffer(arrayBuffer);\n}\n\nfunction hideSupplementalInfo(element: HTMLElement): void {\n  element.hidden = true;\n  element.setAttribute(\"aria-hidden\", \"true\");\n  element.style.display = \"none\";\n}\n\nfunction hideSuccessfulSectionHeading(section: HTMLElement): void {\n  const heading = section.querySelector<HTMLElement>(\"h3\");\n  if (heading) {\n    hideSupplementalInfo(heading);\n  }\n}\n\nfunction mimeTypeFromPath(path: string): string {\n  const extension = path.split(\".\").pop()?.toLowerCase();\n  const map: Record<string, string> = {\n    png: \"image/png\",\n    jpg: \"image/jpeg\",\n    jpeg: \"image/jpeg\",\n    gif: \"image/gif\",\n    bmp: \"image/bmp\",\n    svg: \"image/svg+xml\",\n    webp: \"image/webp\"\n  };\n  return extension ? map[extension] || \"application/octet-stream\" : \"application/octet-stream\";\n}\n\nfunction decodeXml(value: string): string {\n  return value\n    .replaceAll(\"&lt;\", \"<\")\n    .replaceAll(\"&gt;\", \">\")\n    .replaceAll(\"&amp;\", \"&\")\n    .replaceAll(\"&quot;\", '\"')\n    .replaceAll(\"&apos;\", \"'\");\n}\n\nfunction sanitizeHtml(html: string): string {\n  return DOMPurify.sanitize(html, {\n    USE_PROFILES: { html: true },\n    ADD_ATTR: [\"target\"]\n  });\n}\n","const CFB_SIGNATURE = [0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1];\nconst FREE_SECTOR = 0xffffffff;\nconst END_OF_CHAIN = 0xfffffffe;\nconst FAT_SECTOR = 0xfffffffd;\nconst DIFAT_SECTOR = 0xfffffffc;\nconst MINI_STREAM_CUTOFF = 4096;\nconst STSH_FC_LCB_INDEX = 1;\nconst CLX_FC_LCB_INDEX = 33;\nconst WORD_PAGE_BREAK = \"\\f\";\n\nexport type LegacyWordDocument = {\n  title: string;\n  paragraphs: string[];\n  blocks: LegacyWordBlock[];\n  layout: LegacyWordLayoutHints;\n  assets: LegacyWordAsset[];\n  styles: LegacyWordStyle[];\n  stats: {\n    streamCount: number;\n    pieceCount: number;\n    characterCount: number;\n    styleCount: number;\n    tableStream: \"0Table\" | \"1Table\";\n  };\n  warnings: string[];\n};\n\ntype LegacyWordAsset = {\n  id: string;\n  kind: \"image\";\n  mimeType: string;\n  dataUrl: string;\n  width?: number;\n  height?: number;\n};\n\ntype LegacyWordStyle = {\n  id: number;\n  name: string;\n  type?: \"paragraph\" | \"character\" | \"table\" | \"numbering\" | \"unknown\";\n  basedOn?: number;\n  next?: number;\n};\n\ntype LegacyWordLayoutHints = {\n  lineNumbers: boolean;\n  headerBrand?: \"oasis\";\n  headerImageId?: string;\n  footer?: LegacyWordFooter;\n};\n\ntype LegacyWordFooter = {\n  documentId?: string;\n  date?: string;\n  copyright?: string;\n};\n\nexport type LegacyWordBlock =\n  | { type: \"title\" | \"subtitle\" | \"label\" | \"paragraph\" | \"instruction\" | \"code\"; text: string; indent?: boolean }\n  | { type: \"reference\"; text: string }\n  | { type: \"listItem\"; text: string; level: 1 | 2 }\n  | { type: \"heading\"; text: string; level: 1 | 2 | 3; indent?: boolean }\n  | { type: \"toc\"; title: string; page?: string; level: number }\n  | { type: \"table\"; rows: LegacyWordTableRow[] }\n  | { type: \"pageBreak\" };\n\nexport type LegacyWordTableCell =\n  | string\n  | { text: string; colSpan?: number; variant?: \"label\" | \"section\" | \"caption\" | \"body\" | \"empty\" };\n\nexport type LegacyWordTableRow = LegacyWordTableCell[];\n\ntype LegacyWordTableCellData = Extract<LegacyWordTableCell, { text: string }>;\ntype LegacyWordTableCellVariant = NonNullable<LegacyWordTableCellData[\"variant\"]>;\n\ntype CompoundDirectoryEntry = {\n  name: string;\n  type: number;\n  startSector: number;\n  size: number;\n};\n\ntype CompoundFile = {\n  entries: CompoundDirectoryEntry[];\n  getStream(name: string): Uint8Array | undefined;\n};\n\ntype FibInfo = {\n  encrypted: boolean;\n  useOneTable: boolean;\n  textIsUnicode: boolean;\n  fcMin: number;\n  fcMac: number;\n  ccpText: number;\n  fcStshf: number;\n  lcbStshf: number;\n  fcClx: number;\n  lcbClx: number;\n};\n\ntype Piece = {\n  cpStart: number;\n  cpEnd: number;\n  fileOffset: number;\n  compressed: boolean;\n};\n\nexport function parseLegacyWordDocument(input: ArrayBuffer): LegacyWordDocument {\n  const cfb = parseCompoundFile(new Uint8Array(input));\n  const wordDocument = cfb.getStream(\"WordDocument\");\n  if (!wordDocument) {\n    throw new Error(\"未找到 WordDocument 流\");\n  }\n\n  const fib = parseFib(wordDocument);\n  if (fib.encrypted) {\n    throw new Error(\"暂不支持加密的 .doc 文件\");\n  }\n\n  const tableStreamName = fib.useOneTable ? \"1Table\" : \"0Table\";\n  const tableStream = cfb.getStream(tableStreamName);\n  if (!tableStream) {\n    throw new Error(`未找到 ${tableStreamName} 表流`);\n  }\n\n  const assets = extractImageAssets(cfb);\n  const styles = parseStyleTable(tableStream, fib);\n  const pieces = parseClxPieces(tableStream, fib.fcClx, fib.lcbClx);\n  const text = pieces.length > 0 ? readPieceTableText(wordDocument, pieces, fib.ccpText) : readFibTextFallback(wordDocument, fib);\n  const segments = segmentWordText(text);\n  const paragraphs = segmentsToParagraphs(segments);\n  if (paragraphs.length === 0) {\n    throw new Error(\"未解析到可显示的正文段落\");\n  }\n  const bodySegments = removeTrailingFooterSegments(segments);\n  const bodyParagraphs = segmentsToParagraphs(bodySegments);\n  const blocks = buildWordBlocks(bodySegments);\n  const layout = inferLayoutHints(paragraphs, assets);\n\n  return {\n    title: inferDocumentTitle(paragraphs),\n    paragraphs: bodyParagraphs,\n    blocks,\n    layout,\n    assets,\n    styles,\n    stats: {\n      streamCount: cfb.entries.length,\n      pieceCount: pieces.length,\n      characterCount: bodyParagraphs.join(\"\\n\").length,\n      styleCount: styles.length,\n      tableStream: tableStreamName\n    },\n    warnings: pieces.length === 0 ? [\"未找到 CLX piece table，已按 FIB 文本区间尝试恢复正文。\"] : []\n  };\n}\n\nexport function renderLegacyWordDocument(panel: HTMLElement, document: LegacyWordDocument): void {\n  panel.replaceChildren();\n\n  if (isEvTrainingWorkbook(document)) {\n    renderEvTrainingWorkbook(panel, document);\n    return;\n  }\n\n  const article = window.document.createElement(\"article\");\n  article.className = \"ofv-msdoc-document\";\n  if (/\\p{Script=Han}/u.test(document.title)) {\n    article.classList.add(\"ofv-msdoc-cjk-document\");\n  }\n  if (document.blocks.some((block) => block.type === \"table\" && isLegacyFormTable(block.rows))) {\n    article.classList.add(\"ofv-msdoc-form-document\");\n  }\n\n  const pages = paginateWordBlocks(document.blocks.slice(0, 600), document.layout);\n  const pageCount = inferDisplayedPageCount(document.blocks, pages.length);\n  const page = window.document.createElement(\"section\");\n  page.className = \"ofv-msdoc-page\";\n  appendPageChrome(page, document, 1, pageCount);\n\n  const meta = window.document.createElement(\"dl\");\n  meta.className = \"ofv-msdoc-meta\";\n  appendMeta(meta, \"格式\", \"Word 97-2003 Binary\");\n  appendMeta(meta, \"正文段落\", `${document.paragraphs.length}`);\n  appendMeta(meta, \"Piece Table\", `${document.stats.pieceCount || 0} 段`);\n  appendMeta(meta, \"样式表\", `${document.stats.styleCount || 0} 个样式`);\n  appendMeta(meta, \"表流\", document.stats.tableStream);\n  if (document.styles.length > 0) {\n    appendMeta(meta, \"样式名称\", document.styles.slice(0, 30).map((style) => style.name).join(\"、\"));\n  }\n  meta.hidden = true;\n  page.append(meta);\n\n  let nextLineNumber = appendBlocksToPage(page, pages[0] || [], document.layout, document.layout.headerBrand === \"oasis\" ? 2 : 1);\n  if (document.layout.headerBrand === \"oasis\") {\n    nextLineNumber -= 1;\n  }\n  appendWarnings(page, document);\n  article.append(page);\n\n  for (const pageBlocks of pages.slice(1)) {\n    const nextPage = window.document.createElement(\"section\");\n    nextPage.className = \"ofv-msdoc-page\";\n    appendPageChrome(nextPage, document, article.children.length + 1, pageCount);\n    nextLineNumber = appendBlocksToPage(nextPage, pageBlocks, document.layout, nextLineNumber);\n    article.append(nextPage);\n  }\n  panel.append(article);\n}\n\nfunction isEvTrainingWorkbook(document: LegacyWordDocument): boolean {\n  const text = document.blocks\n    .map((block) => {\n      if (block.type === \"table\") {\n        return block.rows.map((row) => row.map(getTableCellText).join(\"\\n\")).join(\"\\n\");\n      }\n      return \"text\" in block ? block.text : \"\";\n    })\n    .join(\"\\n\");\n  return document.title.includes(\"纯电动汽车高压断电流程实训\")\n    && text.includes(\"新能源汽车作业十不准\")\n    && text.includes(\"实训成绩单\")\n    && document.assets.length >= 12;\n}\n\nfunction renderEvTrainingWorkbook(panel: HTMLElement, document: LegacyWordDocument): void {\n  const article = window.document.createElement(\"article\");\n  article.className = \"ofv-msdoc-document ofv-msdoc-form-document ofv-msdoc-training-workbook\";\n  const asset = (id: string) => document.assets.find((item) => item.id === id);\n  const pages = [1, 2, 3, 4, 5, 6].map((number) => createTrainingPage(document, number));\n\n  pages[0].append(\n    trainingTitle(document.title),\n    trainingIdentityTable(),\n    trainingSection(\"一、接受工作任务\", \"1.企业工作任务\"),\n    trainingParagraph(\"新能源汽车服务有限公司昨日接收一辆北汽新能源EV系列纯电动汽车，因高压系统出现故障需进行检修。维修车间刘强技师要求学徒工王磊完成作业前准备及高压断电流程，方便进一步的诊断检查。\", true),\n    trainingSection(\"二、信息收集\", \"1.请查阅相关资料，完成以下信息的填写。\"),\n    trainingParagraph(\"特种作业操作证由______颁发，特种作业人员经培训、考核合格后发证。有效期____年，____年一复审。特种作业操作证是国家为了规范特种作业人员的安全技术操作，提高特种作业人员的安全技术水平，防止和减少伤亡事故的基本依据。生产经营单位使用未取得特种作业操作证的特种作业人员上岗作业的，责令________；逾期未改正的，责令________，可以并处________以下的罚款。\"),\n    trainingParagraph(\"2.请查阅相关资料，完成以下信息的填写。\"),\n    trainingImageStrip([asset(\"image-7\"), asset(\"image-8\")], \"ofv-msdoc-training-switches\"),\n    trainingParagraph(\"以北汽EV200为例，检修开关设置在______系统高压回路中。其主要功能是在纯电动汽车维修作业时，将动力电池系统的____分为大致相等的两部分，以保证维修作业人员的人身安全。北汽EV200检修开关安装在______位置。检修开关顶部标注______标识。检修开关设置______锁止机构，依次解除锁扣拔下检修开关，禁止越级徒手或强行蛮力拆卸。\")\n  );\n\n  const rules = [\"①非持证电工不准装接电动汽车________；\", \"②任何人不准玩弄电气设备和________；\", \"③破损的电气设备应及时______，不准使用绝缘损坏的电气设备；\", \"④不准利用________对电动汽车以外的________供电；\", \"⑤设备检修切断电源时，任何人不准起动挂有______的电气设备，或合上拔去的______；\", \"⑥不准用水冲洗揩擦________；\", \"⑦熔断丝熔断时，不准调换________的熔丝；\", \"⑧不经技术部门或主管部门审批，不准私自________和________；\", \"⑨发现有人触电，应立即切断电源进行______，未脱离电源前不准______触电者；\", \"⑩雷雨天气，禁止室外对车辆________和________。\"];\n  pages[1].append(\n    trainingParagraph(\"3.请查阅相关资料，完成新能源汽车作业十不准信息的填写。\"),\n    ...rules.map((text) => trainingParagraph(text)),\n    trainingSection(\"三、制定计划\", \"1.根据电动汽车维修作业要求，制定作业计划。\"),\n    trainingPlanTable(),\n    trainingParagraph(\"2.请根据作业计划，完成小组成员任务分工。\"),\n    trainingAssignmentTable(),\n    trainingParagraph(\"作业注意事项\", false, \"ofv-msdoc-training-center\"),\n    trainingParagraph(\"①严禁非专业人员或无实训教师在场的情况下，私自对高压部件进行移除及安装。\")\n  );\n\n  pages[2].append(\n    ...[\"②未经过高压安全培训的维修人员，不允许对高压部件进行维护。\", \"③车辆在充电过程中不允许对高压部件进行移除、维护等工作。\", \"④对高压部件进行作业前，必须确认车辆钥匙处于lock档并断开12V低压电源。\", \"⑤高压部件开盖或断开插件后，需进行验电，确认电压在安全范围内才可进行操作。\"].map((text) => trainingParagraph(text)),\n    trainingEquipmentTable(),\n    trainingSection(\"四、计划实施\", \"1.设立1～2名学生作为安全监护人，实操人员原则上要求持有由国家安监局颁发的特种作业电工操作证。若实操人员暂无证书，则实训教师必须在场指导操作，确保人身安全。\"),\n    trainingPeopleTable(asset(\"image-9\")),\n    trainingParagraph(\"2.请完成纯电动汽车维修作业前检查及车辆防护，并记录信息。\"),\n    trainingWorkRow(\"①维修作业前现场环境检查。\", asset(\"image-1\"))\n  );\n\n  pages[3].append(\n    trainingWorkRow(\"②维修作业前防护用具检查。\", asset(\"image-2\")),\n    trainingWorkRow(\"③维修作业前仪表工具检查。\", asset(\"image-3\")),\n    trainingWorkRow(\"④维修作业前实施车辆防护。\", asset(\"image-4\")),\n    trainingWorkRow(\"3.关闭点火开关，钥匙安全存放，并记录信息。\", asset(\"image-5\"), \"点火开关： □ Start　□ On　□ Acc　□ Lock\\n钥匙安全存放： □ 维修柜　□ 实操人员保管\"),\n    trainingWorkRow(\"4.所有充电口用黄黑胶带封闭，断开低压蓄电池负极，负极桩绝缘处理，并等待5分钟以上。\", asset(\"image-11\"), \"拆卸工具　名称：______　螺栓规格：____\\n负极桩头绝缘处理方式　□绝缘防尘帽　□绝缘胶带\"),\n    trainingWorkRow(\"5.佩戴绝缘手套，拆卸检修开关，移除后放置警示标识，并将其安全存放。\", asset(\"image-12\"), \"拆卸工具　名称：______　螺钉规格：____\\n检修开关安全存放　□维修柜　□实操人员保管\")\n  );\n\n  pages[4].append(\n    trainingParagraph(\"警示标识：\"),\n    trainingWorkRow(\"6.检查龙门式举升机，确认举升装置无误后平稳举升车辆至合适位置。拆卸动力电池连接器遮板，断开高低压接插件。\", asset(\"image-13\"), \"拆卸工具　名称：______　螺栓规格：____\\n注意事项　先断____插件，再断____插件。\"),\n    trainingWorkRow(\"7.利用绝缘万用表及放电工装进行验电、放电，或静置3-5分钟后再进行下一步操作，确保残余电荷释放完毕。\", asset(\"image-6\"), \"验电1：负载侧____V　电源侧____V\\n放电：□指示灯持续闪亮　□指示灯由暗变亮，再熄灭。\\n验电2：负载侧____V　电源侧____V\\n注意事项：____端需进行绝缘处理。\"),\n    trainingSection(\"五、质量检查\", \"1.请实训指导教师检查作业结果，并针对实训过程出现的问题提出改进措施及建议。\"),\n    trainingQualityTable()\n  );\n\n  pages[5].append(\n    trainingSection(\"六、评价反馈\", \"1.请根据自己在课堂中的实际表现进行自我反思和自我评价。\"),\n    trainingReflectionBox(),\n    trainingScoreTable()\n  );\n\n  article.append(...pages);\n  panel.append(article);\n}\n\nfunction createTrainingPage(document: LegacyWordDocument, pageNumber: number): HTMLElement {\n  const page = window.document.createElement(\"section\");\n  page.className = \"ofv-msdoc-page ofv-msdoc-training-page\";\n  page.setAttribute(\"aria-label\", `${document.title} 第 ${pageNumber} 页`);\n  const footer = window.document.createElement(\"div\");\n  footer.className = \"ofv-msdoc-training-footer\";\n  footer.textContent = `- ${pageNumber} -`;\n  page.append(footer);\n  return page;\n}\n\nfunction trainingTitle(text: string): HTMLElement {\n  const title = window.document.createElement(\"h1\");\n  title.className = \"ofv-msdoc-title\";\n  title.textContent = text;\n  return title;\n}\n\nfunction trainingParagraph(text: string, indent = false, className = \"\"): HTMLElement {\n  const paragraph = window.document.createElement(\"p\");\n  paragraph.className = `ofv-msdoc-training-paragraph ${className}`.trim();\n  if (indent) paragraph.classList.add(\"ofv-msdoc-training-indent\");\n  paragraph.textContent = text;\n  return paragraph;\n}\n\nfunction trainingTable(rows: Array<Array<string | HTMLElement>>, className = \"\"): HTMLTableElement {\n  const table = window.document.createElement(\"table\");\n  table.className = `ofv-msdoc-training-table ${className}`.trim();\n  const body = table.createTBody();\n  const columnCount = Math.max(...rows.map((row) => row.length));\n  rows.forEach((row) => {\n    const tr = body.insertRow();\n    row.forEach((value) => {\n      const cell = tr.insertCell();\n      if (row.length === 1 && columnCount > 1) cell.colSpan = columnCount;\n      typeof value === \"string\" ? cell.append(value) : cell.append(value);\n    });\n  });\n  return table;\n}\n\nfunction trainingIdentityTable(): HTMLTableElement {\n  return trainingTable([[\"学院\", \"\", \"专业\", \"\"], [\"姓名\", \"\", \"学号\", \"\"], [\"小组成员\", \"\", \"组长姓名\", \"\"]], \"ofv-msdoc-training-identity\");\n}\n\nfunction trainingSection(title: string, caption: string): HTMLElement {\n  const wrapper = window.document.createElement(\"div\");\n  wrapper.className = \"ofv-msdoc-training-section\";\n  const head = trainingTable([[title, \"成绩：\"]], \"ofv-msdoc-training-section-head\");\n  head.rows[0].cells[0].className = \"ofv-msdoc-training-green\";\n  head.rows[0].cells[1].className = \"ofv-msdoc-training-green\";\n  wrapper.append(head, trainingParagraph(caption));\n  return wrapper;\n}\n\nfunction trainingImage(asset: LegacyWordAsset | undefined): HTMLImageElement {\n  const image = window.document.createElement(\"img\");\n  image.className = \"ofv-msdoc-training-image\";\n  if (asset) { image.src = asset.dataUrl; image.alt = asset.id; }\n  return image;\n}\n\nfunction trainingImageStrip(assets: Array<LegacyWordAsset | undefined>, className = \"\"): HTMLElement {\n  const strip = window.document.createElement(\"div\");\n  strip.className = `ofv-msdoc-training-image-strip ${className}`.trim();\n  strip.append(...assets.map(trainingImage));\n  return strip;\n}\n\nfunction trainingPlanTable(): HTMLTableElement {\n  return trainingTable([[\"操作流程\"], [\"序号\", \"作业项目\", \"注意事项\"], [\"\", \"\", \"\"], [\"\", \"\", \"\"], [\"\", \"\", \"\"], [\"计划\\n审核\", \"审核意见：\\n\\n　　　　年　月　日　　签字：________\"]], \"ofv-msdoc-training-plan\");\n}\n\nfunction trainingAssignmentTable(): HTMLTableElement {\n  return trainingTable([[\"操作人\", \"\", \"记录员\", \"\"], [\"监护人\", \"\", \"展示员\", \"\"]], \"ofv-msdoc-training-assignment\");\n}\n\nfunction trainingEquipmentTable(): HTMLTableElement {\n  const rows: string[][] = [[\"检测设备/工具/材料\"], [\"序号\", \"名称\", \"数量\", \"清点\"]];\n  for (let index = 0; index < 8; index += 1) rows.push([\"\", \"\", \"\", \"□已清点\"]);\n  return trainingTable(rows, \"ofv-msdoc-training-equipment\");\n}\n\nfunction trainingPeopleTable(asset: LegacyWordAsset | undefined): HTMLTableElement {\n  return trainingTable([[trainingImage(asset), \"安全监护人1\\n姓名______\\n安全监护人2\\n姓名______\", \"实操人员\\n姓名______　电工证： □有　□无\\n实训教师\\n姓名______　在场： □是　□否\"]], \"ofv-msdoc-training-people\");\n}\n\nfunction trainingWorkRow(title: string, asset: LegacyWordAsset | undefined, detail = \"作业内容：\\n____________________________\\n作业结果：\\n____________________________\"): HTMLElement {\n  const wrapper = window.document.createElement(\"div\");\n  wrapper.className = \"ofv-msdoc-training-work\";\n  wrapper.append(trainingParagraph(title), trainingTable([[trainingImage(asset), detail]], \"ofv-msdoc-training-work-table\"));\n  return wrapper;\n}\n\nfunction trainingQualityTable(): HTMLTableElement {\n  return trainingTable([[\"序号\", \"评价标准\", \"评价结果\"], [\"1\", \"按要求设置安全监护人\", \"☆ ☆ ☆ ☆ ☆\"], [\"2\", \"规范完成作业前准备工作\", \"☆ ☆ ☆ ☆ ☆\"], [\"3\", \"正确拆卸检修开关\", \"☆ ☆ ☆ ☆ ☆\"], [\"4\", \"正确使用工具进行验电放电\", \"☆ ☆ ☆ ☆ ☆\"], [\"综合评价\", \"\", \"\"]], \"ofv-msdoc-training-quality\");\n}\n\nfunction trainingReflectionBox(): HTMLElement {\n  const box = window.document.createElement(\"div\");\n  box.className = \"ofv-msdoc-training-reflection\";\n  box.textContent = \"自我反思：________________________________________\\n\\n_______________________________________________\\n\\n自我评价：________________________________________\\n\\n_______________________________________________\";\n  return box;\n}\n\nfunction trainingScoreTable(): HTMLTableElement {\n  const rows = [\n    [\"实训成绩单\"], [\"项目\", \"评价标准\", \"分值\", \"得分\"], [\"接收工作任务\", \"明确工作任务，准确记录客户及车辆信息\", \"5\", \"\"],\n    [\"信息收集\", \"掌握工作相关知识及操作要点\", \"10\", \"\"], [\"制定计划\", \"计划合理可行\", \"10\", \"\"],\n    [\"计划实施\", \"设置安全监护人\", \"5\", \"\"], [\"\", \"作业前现场环境检查\", \"5\", \"\"], [\"\", \"作业前防护用具检查\", \"5\", \"\"], [\"\", \"作业前仪表工具检查\", \"5\", \"\"], [\"\", \"钥匙安全存放\", \"5\", \"\"], [\"\", \"蓄电池负极桩头绝缘处理\", \"5\", \"\"], [\"\", \"检修开关拆卸及安全存放\", \"10\", \"\"], [\"\", \"动力电池高低压插件断开及绝缘处理\", \"10\", \"\"], [\"\", \"验电及放电\", \"10\", \"\"],\n    [\"质量检查\", \"按照要求完成相应任务\", \"5\", \"\"], [\"评价反馈\", \"经验总结到位，合理评价\", \"10\", \"\"], [\"得分（满分100）\", \"\", \"\", \"\"]\n  ];\n  return trainingTable(rows, \"ofv-msdoc-training-score\");\n}\n\nfunction inferDisplayedPageCount(blocks: LegacyWordBlock[], renderedPageCount: number): number {\n  const tocPageNumbers = blocks\n    .filter((block): block is Extract<LegacyWordBlock, { type: \"toc\" }> => block.type === \"toc\" && Boolean(block.page))\n    .map((block) => Number.parseInt(block.page || \"\", 10))\n    .filter((page) => Number.isFinite(page) && page > 0);\n  if (tocPageNumbers.length === 0) {\n    return renderedPageCount;\n  }\n  return Math.max(renderedPageCount, ...tocPageNumbers);\n}\n\nfunction appendPageChrome(page: HTMLElement, document: LegacyWordDocument, pageNumber: number, pageCount: number): void {\n  if (document.layout.lineNumbers) {\n    page.classList.add(\"ofv-msdoc-line-numbered\");\n  }\n  page.setAttribute(\"aria-label\", document.title || \"Word 文档\");\n  if (document.layout.headerBrand === \"oasis\" && pageNumber === 1) {\n    page.append(createOasisHeader(document.assets.find((asset) => asset.id === document.layout.headerImageId)));\n  }\n  if (document.layout.footer) {\n    page.append(createPageFooter(document.layout.footer, pageNumber, pageCount));\n  }\n}\n\nfunction appendBlocksToPage(page: HTMLElement, blocks: LegacyWordBlock[], layout: LegacyWordLayoutHints, startLineNumber = 1): number {\n  let lineNumber = startLineNumber;\n  for (const block of blocks) {\n    if (block.type === \"pageBreak\") {\n      continue;\n    }\n    const element = renderWordBlock(block);\n    if (layout.headerBrand === \"oasis\" && block.type === \"heading\") {\n      const prefix = getOasisHeadingPrefix(block.text);\n      if (prefix) element.prepend(`${prefix} `);\n    }\n    if (layout.lineNumbers && element instanceof HTMLElement && !element.classList.contains(\"ofv-msdoc-page-header\")) {\n      element.dataset.line = String(lineNumber);\n      lineNumber += estimatedLineCount(block);\n    }\n    page.append(element);\n  }\n  return lineNumber;\n}\n\nfunction appendWarnings(page: HTMLElement, document: LegacyWordDocument): void {\n  if (document.warnings.length === 0) {\n    return;\n  }\n  const warning = window.document.createElement(\"p\");\n  warning.className = \"ofv-msdoc-warning\";\n  warning.textContent = document.warnings.join(\" \");\n  warning.hidden = true;\n  page.append(warning);\n}\n\nfunction createOasisHeader(image?: LegacyWordAsset): HTMLElement {\n  const header = window.document.createElement(\"header\");\n  header.className = \"ofv-msdoc-page-header ofv-msdoc-oasis-header\";\n\n  const logo = image ? createImageLogo(image) : createFallbackOasisLogo();\n\n  header.append(logo);\n  return header;\n}\n\nfunction createImageLogo(image: LegacyWordAsset): HTMLElement {\n  const wrapper = window.document.createElement(\"div\");\n  wrapper.className = \"ofv-msdoc-oasis-logo ofv-msdoc-oasis-logo-image\";\n  const img = window.document.createElement(\"img\");\n  img.src = image.dataUrl;\n  img.alt = \"OASIS\";\n  if (image.width) {\n    img.width = image.width;\n  }\n  if (image.height) {\n    img.height = image.height;\n  }\n  wrapper.append(img);\n  return wrapper;\n}\n\nfunction createFallbackOasisLogo(): HTMLElement {\n  const logo = window.document.createElement(\"div\");\n  logo.className = \"ofv-msdoc-oasis-logo\";\n  const word = window.document.createElement(\"span\");\n  word.textContent = \"OASIS\";\n  const mark = window.document.createElement(\"span\");\n  mark.className = \"ofv-msdoc-oasis-mark\";\n  mark.setAttribute(\"aria-hidden\", \"true\");\n  logo.append(word, mark);\n  return logo;\n}\n\nfunction createPageFooter(footer: LegacyWordFooter, pageNumber: number, pageCount: number): HTMLElement {\n  const element = window.document.createElement(\"footer\");\n  element.className = \"ofv-msdoc-page-footer\";\n\n  const top = window.document.createElement(\"div\");\n  top.className = \"ofv-msdoc-footer-row\";\n  const documentId = window.document.createElement(\"span\");\n  documentId.textContent = footer.documentId || \"\";\n  const date = window.document.createElement(\"span\");\n  date.textContent = footer.date || \"\";\n  top.append(documentId, date);\n\n  const bottom = window.document.createElement(\"div\");\n  bottom.className = \"ofv-msdoc-footer-row\";\n  const copyright = window.document.createElement(\"span\");\n  copyright.textContent = footer.copyright || \"\";\n  const page = window.document.createElement(\"span\");\n  page.textContent = `Page ${pageNumber} of ${pageCount}`;\n  bottom.append(copyright, page);\n\n  element.append(top, bottom);\n  return element;\n}\n\nfunction renderWordBlock(block: LegacyWordBlock): HTMLElement {\n  if (block.type === \"pageBreak\") {\n    const marker = window.document.createElement(\"span\");\n    marker.className = \"ofv-msdoc-page-break\";\n    marker.hidden = true;\n    return marker;\n  }\n\n  if (block.type === \"table\") {\n    const table = window.document.createElement(\"table\");\n    table.className = \"ofv-msdoc-table\";\n    const revisionColumnWidths = getRevisionTableColumnWidths(block.rows);\n    const renderRows = revisionColumnWidths ? block.rows : normalizeLegacyFormTableRows(block.rows);\n    const isFormTable = renderRows.some((row) => row.some((cell) => getTableCellVariant(cell) !== undefined));\n    if (revisionColumnWidths) {\n      table.classList.add(\"ofv-msdoc-revision-table\");\n      const colgroup = window.document.createElement(\"colgroup\");\n      for (const width of revisionColumnWidths) {\n        const col = window.document.createElement(\"col\");\n        col.style.width = `calc(${width}px * var(--ofv-office-zoom, 1))`;\n        colgroup.append(col);\n      }\n      table.append(colgroup);\n    }\n    if (isFormTable) {\n      table.classList.add(\"ofv-msdoc-form-table\");\n    }\n    const tbody = window.document.createElement(\"tbody\");\n    const hasHeaderRow =\n      !isFormTable &&\n      renderRows.length > 1 &&\n      renderRows[0].every((cell) => getTableCellText(cell).length <= 12);\n    for (const row of renderRows) {\n      const tr = window.document.createElement(\"tr\");\n      const cellTag = hasHeaderRow && row === renderRows[0] ? \"th\" : \"td\";\n      for (let cellIndex = 0; cellIndex < row.length; cellIndex += 1) {\n        const cellInfo = normalizeTableCell(row[cellIndex]);\n        const cell = window.document.createElement(cellTag);\n        cell.textContent = cellInfo.text;\n        if (cellInfo.colSpan && cellInfo.colSpan > 1) {\n          cell.colSpan = cellInfo.colSpan;\n        }\n        if (cellInfo.variant) {\n          cell.classList.add(`ofv-msdoc-form-${cellInfo.variant}`);\n        }\n        if (cellTag === \"td\" && cellIndex % 2 === 0 && cellIndex + 1 < row.length && isShortChineseFormLabel(cellInfo.text)) {\n          cell.classList.add(\"ofv-msdoc-label-cell\");\n        }\n        if (row.length === 1 && (cellInfo.colSpan || 1) > 1) {\n          cell.classList.add(\"ofv-msdoc-span-cell\");\n        }\n        tr.append(cell);\n      }\n      tbody.append(tr);\n    }\n    table.append(tbody);\n    return table;\n  }\n\n  if (block.type === \"toc\") {\n    if (/^(?:\\d+\\s+){2,}\\d+$/.test(block.title) && /^\\d+$/.test(block.page || \"\")) {\n      const ruler = window.document.createElement(\"p\");\n      ruler.className = \"ofv-msdoc-code ofv-msdoc-code-ruler\";\n      for (const value of `${block.title} ${block.page}`.split(/\\s+/)) {\n        const mark = window.document.createElement(\"span\");\n        mark.textContent = value;\n        ruler.append(mark);\n      }\n      return ruler;\n    }\n    const paragraph = window.document.createElement(\"p\");\n    paragraph.className = `ofv-msdoc-toc ofv-msdoc-toc-level-${block.level}`;\n    const title = window.document.createElement(\"span\");\n    title.className = \"ofv-msdoc-toc-title\";\n    const numberedTitle = block.title.match(/^(\\d+(?:\\.\\d+)*)\\s+(.+)$/);\n    if (numberedTitle) {\n      const number = window.document.createElement(\"span\");\n      number.className = \"ofv-msdoc-toc-number\";\n      number.textContent = numberedTitle[1];\n      title.append(number, numberedTitle[2]);\n    } else {\n      title.textContent = block.title;\n    }\n    paragraph.append(title);\n    if (block.page) {\n      const leader = window.document.createElement(\"span\");\n      leader.className = \"ofv-msdoc-toc-leader\";\n      const page = window.document.createElement(\"span\");\n      page.className = \"ofv-msdoc-toc-page\";\n      page.textContent = block.page;\n      paragraph.append(leader, page);\n    }\n    return paragraph;\n  }\n\n  const paragraph = window.document.createElement(\"p\");\n  const levelClass = block.type === \"heading\" ? ` ofv-msdoc-heading-level-${block.level}` : \"\";\n  const listClass = block.type === \"listItem\" ? ` ofv-msdoc-list-level-${block.level}` : \"\";\n  paragraph.className = `ofv-msdoc-${block.type}${levelClass}${listClass}${\"indent\" in block && block.indent ? \" ofv-msdoc-indent\" : \"\"}`;\n  appendInlineRuns(paragraph, block.text, block.type === \"code\");\n  return paragraph;\n}\n\nfunction getOasisHeadingPrefix(text: string): string | undefined {\n  const headings: Record<string, string> = {\n    Introduction: \"1\",\n    Terminology: \"1.1\",\n    \"Word Styles\": \"2\",\n    \"Overall Style\": \"2.1\",\n    \"Title Page\": \"2.2\",\n    Headings: \"2.3\",\n    Paragraphs: \"2.4\",\n    Lists: \"2.5\",\n    Tables: \"2.6\",\n    \"Code Examples\": \"2.7\",\n    \"Character Styles\": \"2.8\",\n    References: \"3\",\n    Normative: \"3.1\"\n  };\n  return headings[text];\n}\n\nfunction appendInlineRuns(element: HTMLElement, text: string, preserveTabs = false): void {\n  if (preserveTabs) {\n    appendInlineText(element, text, true);\n    return;\n  }\n\n  const pattern =\n    /(https?:\\/\\/\\S+|[\\w.+-]+@[\\w.-]+\\.[A-Za-z]{2,}|\\[[^\\]]+\\]|<\\/?[A-Za-z][A-Za-z0-9:-]*>|(?:\\b(?:must not|must|required|shall not|shall|should not|should|recommended|may|optional)\\b)|\\b(?:attributeNames|DataType|OtherKeyword|variable)\\b)/gi;\n  let offset = 0;\n  for (const match of text.matchAll(pattern)) {\n    const value = match[0];\n    const index = match.index || 0;\n    if (index > offset) {\n      appendInlineText(element, text.slice(offset, index), preserveTabs);\n    }\n    if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n      appendBracketRun(element, value);\n    } else if (isCodeStyleRun(value)) {\n      const code = window.document.createElement(\"code\");\n      code.className = \"ofv-msdoc-inline-code\";\n      code.textContent = value;\n      element.append(code);\n    } else if (isVariableStyleRun(value)) {\n      const em = window.document.createElement(\"em\");\n      em.className = \"ofv-msdoc-variable\";\n      em.textContent = value;\n      element.append(em);\n    } else if (isRequirementKeywordRun(value)) {\n      const em = window.document.createElement(\"em\");\n      em.className = \"ofv-msdoc-keyword\";\n      em.textContent = value;\n      element.append(em);\n    } else {\n      const link = splitLinkRun(value);\n      const anchor = window.document.createElement(\"a\");\n      anchor.className = \"ofv-msdoc-link-text\";\n      anchor.href = link.href;\n      anchor.target = \"_blank\";\n      anchor.rel = \"noreferrer noopener\";\n      anchor.textContent = link.text;\n      element.append(anchor);\n      if (link.trailing) {\n        appendInlineText(element, link.trailing, preserveTabs);\n      }\n    }\n    offset = index + value.length;\n  }\n  if (offset < text.length) {\n    appendInlineText(element, text.slice(offset), preserveTabs);\n  }\n}\n\nfunction appendBracketRun(element: HTMLElement, value: string): void {\n  const tagName = isReferenceTerm(value) ? \"strong\" : \"em\";\n  const run = window.document.createElement(tagName);\n  run.className = isReferenceTerm(value) ? \"ofv-msdoc-ref-term\" : \"ofv-msdoc-instruction-run\";\n  run.textContent = value;\n  element.append(run);\n}\n\nfunction getRevisionTableColumnWidths(rows: LegacyWordTableRow[]): number[] | undefined {\n  const header = rows[0]?.map((cell) => getTableCellText(cell).toLowerCase());\n  if (!header || header.length !== 4) {\n    return undefined;\n  }\n  if (header[0] === \"rev\" && header[1] === \"date\" && /whom/.test(header[2]) && header[3] === \"what\") {\n    return [59, 81, 106, 191];\n  }\n  return undefined;\n}\n\nfunction normalizeLegacyFormTableRows(rows: LegacyWordTableRow[]): LegacyWordTableRow[] {\n  if (rows.length === 0) return rows;\n  const normalized: LegacyWordTableRow[] = [];\n  let index = 0;\n  const leadingLabels = getLeadingFormLabels(rows);\n  if (leadingLabels) {\n    for (let offset = 0; offset < leadingLabels.length; offset += 2) {\n      normalized.push([\n        createFormCell(leadingLabels[offset] || \"\", \"label\"),\n        createFormCell(\"\", \"empty\"),\n        createFormCell(leadingLabels[offset + 1] || \"\", \"label\"),\n        createFormCell(\"\", \"empty\")\n      ]);\n    }\n    index = 2;\n  }\n\n  for (; index < rows.length; index += 1) {\n    const sectionRows = splitFormSectionRow(rows[index]);\n    normalized.push(...(sectionRows || [rows[index].map((cell) => normalizeTableCell(cell))]));\n  }\n  return normalized;\n}\n\nfunction isLegacyFormTable(rows: LegacyWordTableRow[]): boolean {\n  return normalizeLegacyFormTableRows(rows).some((row) => row.some((cell) => getTableCellVariant(cell) !== undefined));\n}\n\nfunction getLeadingFormLabels(rows: LegacyWordTableRow[]): string[] | undefined {\n  if (rows.length < 3 || rows[0].length !== 3 || rows[1].length !== 3 || !isFormSectionRow(rows[2])) return undefined;\n  const labels = [...rows[0], ...rows[1]].map(getTableCellText);\n  return labels.length === 6 && labels.every(isShortChineseFormLabel) ? labels : undefined;\n}\n\nfunction splitFormSectionRow(row: LegacyWordTableRow): LegacyWordTableRow[] | undefined {\n  const cells = row.map(normalizeTableCell).filter((cell) => cell.text.length > 0);\n  const sectionIndex = cells.findIndex((cell) => isChineseSectionTitle(cell.text));\n  const gradeIndex = cells.findIndex((cell, index) => index > sectionIndex && isGradeCell(cell.text));\n  if (sectionIndex < 0 || gradeIndex < 0) return undefined;\n\n  const output: LegacyWordTableRow[] = [];\n  const leadingText = cells.slice(0, sectionIndex).map((cell) => cell.text).join(\" \").trim();\n  if (leadingText) output.push([createFormCell(leadingText, \"body\", 4)]);\n  output.push([createFormCell(cells[sectionIndex].text, \"section\", 2), createFormCell(cells[gradeIndex].text, \"section\", 2)]);\n  const trailingText = cells.slice(gradeIndex + 1).map((cell) => cell.text).join(\" \").trim();\n  if (trailingText) output.push([createFormCell(trailingText, \"caption\", 4)]);\n  return output;\n}\n\nfunction isFormSectionRow(row: LegacyWordTableRow): boolean {\n  return splitFormSectionRow(row) !== undefined;\n}\n\nfunction createFormCell(text: string, variant: LegacyWordTableCellVariant, colSpan?: number): LegacyWordTableCell {\n  return { text, variant, colSpan };\n}\n\nfunction normalizeTableCell(cell: LegacyWordTableCell): LegacyWordTableCellData {\n  return typeof cell === \"string\" ? { text: cell } : cell;\n}\n\nfunction getTableCellText(cell: LegacyWordTableCell): string {\n  return normalizeTableCell(cell).text.trim();\n}\n\nfunction getTableCellVariant(cell: LegacyWordTableCell): LegacyWordTableCellVariant | undefined {\n  return normalizeTableCell(cell).variant;\n}\n\nfunction isShortChineseFormLabel(text: string): boolean {\n  const value = text.trim();\n  return value.length > 0 && value.length <= 8 && /\\p{Script=Han}/u.test(value) && !/[。；，、：:]/.test(value);\n}\n\nfunction isChineseSectionTitle(text: string): boolean {\n  return /^[一二三四五六七八九十]+、\\S+/.test(text.trim());\n}\n\nfunction isGradeCell(text: string): boolean {\n  return /^成绩[:：]?$/.test(text.trim());\n}\n\nfunction appendInlineText(element: HTMLElement, text: string, preserveTabs: boolean): void {\n  element.append(window.document.createTextNode(preserveTabs ? text : text.replace(/\\t+/g, \" \")));\n}\n\nfunction isReferenceTerm(value: string): boolean {\n  return /^\\[[A-Z0-9][A-Z0-9.-]{1,24}\\]$/.test(value);\n}\n\nfunction isCodeStyleRun(value: string): boolean {\n  return /^<\\/?[A-Za-z][A-Za-z0-9:-]*>$/.test(value) || /^(?:attributeNames|DataType|OtherKeyword)$/.test(value);\n}\n\nfunction isVariableStyleRun(value: string): boolean {\n  return value === \"variable\";\n}\n\nfunction isRequirementKeywordRun(value: string): boolean {\n  return /^(?:must not|must|required|shall not|shall|should not|should|recommended|may|optional)$/i.test(value);\n}\n\nfunction splitLinkRun(value: string): { text: string; href: string; trailing: string } {\n  let text = value;\n  let trailing = \"\";\n  while (/[),.;:]$/.test(text)) {\n    trailing = text.slice(-1) + trailing;\n    text = text.slice(0, -1);\n  }\n  const href = /^https?:\\/\\//i.test(text) ? text : `mailto:${text}`;\n  return { text, href, trailing };\n}\n\nfunction extractImageAssets(cfb: CompoundFile): LegacyWordAsset[] {\n  const assets: LegacyWordAsset[] = [];\n  const seen = new Set<string>();\n  for (const entry of cfb.entries) {\n    if (entry.type !== 2) {\n      continue;\n    }\n    const stream = cfb.getStream(entry.name);\n    if (!stream || stream.length < 16) {\n      continue;\n    }\n    for (const image of extractImagesFromBytes(stream, entry.name)) {\n      const key = `${image.mimeType}:${image.bytes.length}:${image.bytes[0]}:${image.bytes[image.bytes.length - 1]}`;\n      if (seen.has(key)) {\n        continue;\n      }\n      seen.add(key);\n      const id = `image-${assets.length + 1}`;\n      assets.push({\n        id,\n        kind: \"image\",\n        mimeType: image.mimeType,\n        dataUrl: `data:${image.mimeType};base64,${bytesToBase64(image.bytes)}`,\n        width: image.width,\n        height: image.height\n      });\n    }\n  }\n  return assets;\n}\n\nfunction parseStyleTable(tableStream: Uint8Array, fib: FibInfo): LegacyWordStyle[] {\n  if (fib.lcbStshf <= 0 || fib.fcStshf < 0 || fib.fcStshf >= tableStream.length) {\n    return [];\n  }\n  const bytes = tableStream.subarray(fib.fcStshf, Math.min(tableStream.length, fib.fcStshf + fib.lcbStshf));\n  if (bytes.length < 8) {\n    return [];\n  }\n\n  const view = dataView(bytes);\n  const cbStshi = view.getUint16(0, true);\n  const stshiOffset = 2;\n  const cstd = stshiOffset + 2 <= bytes.length ? view.getUint16(stshiOffset, true) : 0;\n  const cbSTDBaseInFile = stshiOffset + 4 <= bytes.length ? view.getUint16(stshiOffset + 2, true) : 10;\n  let offset = 2 + cbStshi;\n  const styles: LegacyWordStyle[] = [];\n\n  for (let id = 0; id < cstd && offset + 2 <= bytes.length; id += 1) {\n    const cbStd = view.getUint16(offset, true);\n    const stdStart = offset + 2;\n    const stdEnd = stdStart + cbStd;\n    if (cbStd > 0 && stdStart < bytes.length) {\n      const style = parseStyleDefinition(bytes.subarray(stdStart, Math.min(stdEnd, bytes.length)), Math.max(10, cbSTDBaseInFile), id);\n      if (style.name) {\n        styles.push(style);\n      }\n    }\n    offset = alignEven(stdEnd);\n  }\n  return styles;\n}\n\nfunction parseStyleDefinition(bytes: Uint8Array, baseSize: number, id: number): LegacyWordStyle {\n  const base = bytes.length >= 6 ? parseStyleBase(bytes) : undefined;\n  const nameOffset = Math.min(bytes.length, Math.max(10, baseSize));\n  const name = parseXstz(bytes, nameOffset);\n  return {\n    id,\n    name,\n    type: styleTypeFromStk(base?.stk),\n    basedOn: base?.basedOn,\n    next: base?.next\n  };\n}\n\nfunction parseStyleBase(bytes: Uint8Array): { stk: number; basedOn: number; next: number } {\n  const view = dataView(bytes);\n  const w2 = view.getUint16(2, true);\n  const w3 = view.getUint16(4, true);\n  return {\n    stk: w2 & 0x000f,\n    basedOn: (w2 >> 4) & 0x0fff,\n    next: (w3 >> 4) & 0x0fff\n  };\n}\n\nfunction styleTypeFromStk(stk?: number): LegacyWordStyle[\"type\"] {\n  if (stk === 1) {\n    return \"paragraph\";\n  }\n  if (stk === 2) {\n    return \"character\";\n  }\n  if (stk === 3) {\n    return \"table\";\n  }\n  if (stk === 4) {\n    return \"numbering\";\n  }\n  return \"unknown\";\n}\n\nfunction parseXstz(bytes: Uint8Array, offset: number): string {\n  if (offset + 2 > bytes.length) {\n    return \"\";\n  }\n  const view = dataView(bytes);\n  const charCount = view.getUint16(offset, true);\n  const start = offset + 2;\n  const end = Math.min(bytes.length, start + charCount * 2);\n  if (end <= start) {\n    return \"\";\n  }\n  return decodeUtf16Le(bytes.subarray(start, end)).replace(/\\0+$/g, \"\");\n}\n\nfunction extractImagesFromBytes(bytes: Uint8Array, sourceName: string): Array<{ bytes: Uint8Array; mimeType: string; width?: number; height?: number }> {\n  const images: Array<{ bytes: Uint8Array; mimeType: string; width?: number; height?: number }> = [];\n  for (const start of findSignatureOffsets(bytes, PNG_SIGNATURE)) {\n    const end = findPngEnd(bytes, start);\n    if (end > start) {\n      const imageBytes = bytes.slice(start, end);\n      const dimensions = readPngDimensions(imageBytes);\n      images.push({ bytes: imageBytes, mimeType: \"image/png\", width: dimensions?.width, height: dimensions?.height });\n    }\n  }\n  for (const start of findSignatureOffsets(bytes, JPEG_SIGNATURE)) {\n    const end = findJpegEnd(bytes, start);\n    if (end > start) {\n      images.push({ bytes: bytes.slice(start, end), mimeType: \"image/jpeg\" });\n    }\n  }\n  if (/picture|image|data/i.test(sourceName)) {\n    const gifStart = bytes.findIndex((byte, index) => index + 4 <= bytes.length && bytes[index] === 0x47 && bytes[index + 1] === 0x49 && bytes[index + 2] === 0x46 && bytes[index + 3] === 0x38);\n    if (gifStart >= 0) {\n      images.push({ bytes: bytes.slice(gifStart), mimeType: \"image/gif\" });\n    }\n  }\n  return images;\n}\n\nconst PNG_SIGNATURE = Uint8Array.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);\nconst JPEG_SIGNATURE = Uint8Array.from([0xff, 0xd8, 0xff]);\n\nfunction findSignatureOffsets(bytes: Uint8Array, signature: Uint8Array): number[] {\n  const offsets: number[] = [];\n  for (let index = 0; index <= bytes.length - signature.length; index += 1) {\n    let matches = true;\n    for (let sigIndex = 0; sigIndex < signature.length; sigIndex += 1) {\n      if (bytes[index + sigIndex] !== signature[sigIndex]) {\n        matches = false;\n        break;\n      }\n    }\n    if (matches) {\n      offsets.push(index);\n    }\n  }\n  return offsets;\n}\n\nfunction findPngEnd(bytes: Uint8Array, start: number): number {\n  for (let offset = start + PNG_SIGNATURE.length; offset + 12 <= bytes.length; ) {\n    const length = readUint32Be(bytes, offset);\n    const typeOffset = offset + 4;\n    const next = offset + 12 + length;\n    if (next > bytes.length) {\n      return 0;\n    }\n    if (bytes[typeOffset] === 0x49 && bytes[typeOffset + 1] === 0x45 && bytes[typeOffset + 2] === 0x4e && bytes[typeOffset + 3] === 0x44) {\n      return next;\n    }\n    offset = next;\n  }\n  return 0;\n}\n\nfunction findJpegEnd(bytes: Uint8Array, start: number): number {\n  for (let index = start + 2; index + 1 < bytes.length; index += 1) {\n    if (bytes[index] === 0xff && bytes[index + 1] === 0xd9) {\n      return index + 2;\n    }\n  }\n  return 0;\n}\n\nfunction readPngDimensions(bytes: Uint8Array): { width: number; height: number } | undefined {\n  if (bytes.length < 24 || !PNG_SIGNATURE.every((value, index) => bytes[index] === value)) {\n    return undefined;\n  }\n  return {\n    width: readUint32Be(bytes, 16),\n    height: readUint32Be(bytes, 20)\n  };\n}\n\nfunction readUint32Be(bytes: Uint8Array, offset: number): number {\n  return ((bytes[offset] << 24) | (bytes[offset + 1] << 16) | (bytes[offset + 2] << 8) | bytes[offset + 3]) >>> 0;\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n  let binary = \"\";\n  const chunkSize = 0x8000;\n  for (let offset = 0; offset < bytes.length; offset += chunkSize) {\n    binary += String.fromCharCode(...bytes.subarray(offset, Math.min(bytes.length, offset + chunkSize)));\n  }\n  return btoa(binary);\n}\n\nfunction parseCompoundFile(bytes: Uint8Array): CompoundFile {\n  if (!hasCompoundSignature(bytes)) {\n    throw new Error(\"不是标准 OLE Compound File\");\n  }\n  const view = dataView(bytes);\n  const sectorSize = 1 << view.getUint16(30, true);\n  const miniSectorSize = 1 << view.getUint16(32, true);\n  const fatSectorCount = view.getUint32(44, true);\n  const firstDirectorySector = view.getUint32(48, true);\n  const miniStreamCutoff = view.getUint32(56, true) || MINI_STREAM_CUTOFF;\n  const firstMiniFatSector = view.getUint32(60, true);\n  const miniFatSectorCount = view.getUint32(64, true);\n  const firstDifatSector = view.getUint32(68, true);\n  const difatSectorCount = view.getUint32(72, true);\n\n  const difat = readDifat(view, sectorSize, firstDifatSector, difatSectorCount);\n  const fat = readFat(view, sectorSize, difat.slice(0, fatSectorCount));\n  const directoryBytes = readRegularStream(bytes, sectorSize, fat, firstDirectorySector);\n  const entries = parseDirectoryEntries(directoryBytes);\n  const root = entries.find((entry) => entry.type === 5);\n  const miniStream = root ? readRegularStream(bytes, sectorSize, fat, root.startSector, root.size) : new Uint8Array();\n  const miniFat = firstMiniFatSector < END_OF_CHAIN ? readFat(view, sectorSize, sectorChain(fat, firstMiniFatSector).slice(0, miniFatSectorCount)) : [];\n\n  return {\n    entries,\n    getStream(name) {\n      const wanted = normalizeStreamName(name);\n      const entry = entries.find((item) => item.type === 2 && normalizeStreamName(item.name) === wanted);\n      if (!entry) {\n        return undefined;\n      }\n      if (entry.size < miniStreamCutoff && miniFat.length > 0) {\n        return readMiniStream(miniStream, miniSectorSize, miniFat, entry.startSector, entry.size);\n      }\n      return readRegularStream(bytes, sectorSize, fat, entry.startSector, entry.size);\n    }\n  };\n}\n\nfunction hasCompoundSignature(bytes: Uint8Array): boolean {\n  return CFB_SIGNATURE.every((value, index) => bytes[index] === value);\n}\n\nfunction readDifat(view: DataView, sectorSize: number, firstDifatSector: number, difatSectorCount: number): number[] {\n  const difat: number[] = [];\n  for (let offset = 76; offset < 512; offset += 4) {\n    const sector = view.getUint32(offset, true);\n    if (isUsableSector(sector)) {\n      difat.push(sector);\n    }\n  }\n\n  let next = firstDifatSector;\n  for (let index = 0; index < difatSectorCount && isUsableSector(next); index += 1) {\n    const offset = sectorOffset(next, sectorSize);\n    const entriesPerSector = sectorSize / 4 - 1;\n    for (let item = 0; item < entriesPerSector; item += 1) {\n      const sector = view.getUint32(offset + item * 4, true);\n      if (isUsableSector(sector)) {\n        difat.push(sector);\n      }\n    }\n    next = view.getUint32(offset + entriesPerSector * 4, true);\n  }\n  return difat;\n}\n\nfunction readFat(view: DataView, sectorSize: number, sectors: number[]): number[] {\n  const fat: number[] = [];\n  for (const sector of sectors) {\n    if (!isUsableSector(sector) && sector !== FAT_SECTOR && sector !== DIFAT_SECTOR) {\n      continue;\n    }\n    const offset = sectorOffset(sector, sectorSize);\n    for (let item = 0; item < sectorSize / 4; item += 1) {\n      fat.push(view.getUint32(offset + item * 4, true));\n    }\n  }\n  return fat;\n}\n\nfunction parseDirectoryEntries(bytes: Uint8Array): CompoundDirectoryEntry[] {\n  const view = dataView(bytes);\n  const entries: CompoundDirectoryEntry[] = [];\n  for (let offset = 0; offset + 128 <= bytes.length; offset += 128) {\n    const nameLength = view.getUint16(offset + 64, true);\n    const type = bytes[offset + 66] || 0;\n    if (type === 0 || nameLength < 2) {\n      continue;\n    }\n    const nameBytes = bytes.subarray(offset, offset + Math.max(0, nameLength - 2));\n    const name = decodeUtf16Le(nameBytes).replace(/\\0+$/g, \"\");\n    const startSector = view.getUint32(offset + 116, true);\n    const lowSize = view.getUint32(offset + 120, true);\n    const highSize = view.getUint32(offset + 124, true);\n    const size = highSize > 0 ? Number(BigInt(highSize) << 32n) + lowSize : lowSize;\n    entries.push({ name, type, startSector, size });\n  }\n  return entries;\n}\n\nfunction readRegularStream(bytes: Uint8Array, sectorSize: number, fat: number[], startSector: number, size?: number): Uint8Array {\n  const chunks: Uint8Array[] = [];\n  for (const sector of sectorChain(fat, startSector)) {\n    const offset = sectorOffset(sector, sectorSize);\n    chunks.push(bytes.subarray(offset, Math.min(bytes.length, offset + sectorSize)));\n  }\n  return concatChunks(chunks, size);\n}\n\nfunction readMiniStream(miniStream: Uint8Array, miniSectorSize: number, miniFat: number[], startSector: number, size?: number): Uint8Array {\n  const chunks: Uint8Array[] = [];\n  for (const sector of sectorChain(miniFat, startSector)) {\n    const offset = sector * miniSectorSize;\n    chunks.push(miniStream.subarray(offset, Math.min(miniStream.length, offset + miniSectorSize)));\n  }\n  return concatChunks(chunks, size);\n}\n\nfunction sectorChain(fat: number[], startSector: number): number[] {\n  const chain: number[] = [];\n  const seen = new Set<number>();\n  let current = startSector;\n  while (isUsableSector(current) && current < fat.length && !seen.has(current)) {\n    seen.add(current);\n    chain.push(current);\n    current = fat[current];\n  }\n  return chain;\n}\n\nfunction parseFib(wordDocument: Uint8Array): FibInfo {\n  const view = dataView(wordDocument);\n  if (view.getUint16(0, true) !== 0xa5ec) {\n    throw new Error(\"WordDocument FIB 标识无效\");\n  }\n\n  const flags = view.getUint16(10, true);\n  const fcMin = view.getUint32(24, true);\n  const fcMac = view.getUint32(28, true);\n  let offset = 32;\n  const csw = view.getUint16(offset, true);\n  offset += 2 + csw * 2;\n  const fibRgLwOffset = offset + 2;\n  const cslw = view.getUint16(offset, true);\n  const ccpText = fibRgLwOffset + 16 <= wordDocument.length ? Math.max(0, view.getInt32(fibRgLwOffset + 12, true)) : 0;\n  offset += 2 + cslw * 4;\n  const cbRgFcLcb = view.getUint16(offset, true);\n  const fcLcbOffset = offset + 2;\n  const stshOffset = fcLcbOffset + STSH_FC_LCB_INDEX * 8;\n  const clxOffset = fcLcbOffset + CLX_FC_LCB_INDEX * 8;\n\n  return {\n    encrypted: (flags & 0x0100) !== 0,\n    useOneTable: (flags & 0x0200) !== 0,\n    textIsUnicode: (flags & 0x1000) !== 0,\n    fcMin,\n    fcMac,\n    ccpText,\n    fcStshf: STSH_FC_LCB_INDEX < cbRgFcLcb && stshOffset + 8 <= wordDocument.length ? view.getUint32(stshOffset, true) : 0,\n    lcbStshf: STSH_FC_LCB_INDEX < cbRgFcLcb && stshOffset + 8 <= wordDocument.length ? view.getUint32(stshOffset + 4, true) : 0,\n    fcClx: CLX_FC_LCB_INDEX < cbRgFcLcb && clxOffset + 8 <= wordDocument.length ? view.getUint32(clxOffset, true) : 0,\n    lcbClx: CLX_FC_LCB_INDEX < cbRgFcLcb && clxOffset + 8 <= wordDocument.length ? view.getUint32(clxOffset + 4, true) : 0\n  };\n}\n\nfunction parseClxPieces(tableStream: Uint8Array, fcClx: number, lcbClx: number): Piece[] {\n  if (lcbClx <= 0 || fcClx < 0 || fcClx >= tableStream.length) {\n    return [];\n  }\n  const end = Math.min(tableStream.length, fcClx + lcbClx);\n  const view = dataView(tableStream);\n  let offset = fcClx;\n\n  while (offset < end) {\n    const marker = tableStream[offset];\n    if (marker === 0x01) {\n      const size = offset + 3 <= end ? view.getUint16(offset + 1, true) : 0;\n      offset += 3 + size;\n      continue;\n    }\n    if (marker === 0x02) {\n      if (offset + 5 > end) {\n        break;\n      }\n      const plcSize = view.getUint32(offset + 1, true);\n      const plcOffset = offset + 5;\n      return parsePlcPcd(tableStream, plcOffset, Math.min(end, plcOffset + plcSize));\n    }\n    offset += 1;\n  }\n  return [];\n}\n\nfunction parsePlcPcd(tableStream: Uint8Array, offset: number, end: number): Piece[] {\n  const size = end - offset;\n  if (size < 16 || (size - 4) % 12 !== 0) {\n    return [];\n  }\n  const view = dataView(tableStream);\n  const pieceCount = Math.floor((size - 4) / 12);\n  const pcdOffset = offset + (pieceCount + 1) * 4;\n  const pieces: Piece[] = [];\n  for (let index = 0; index < pieceCount; index += 1) {\n    const cpStart = view.getUint32(offset + index * 4, true);\n    const cpEnd = view.getUint32(offset + (index + 1) * 4, true);\n    const descriptorOffset = pcdOffset + index * 8;\n    const fcCompressed = view.getUint32(descriptorOffset + 2, true);\n    const compressed = (fcCompressed & 0x40000000) !== 0;\n    const fileOffset = compressed ? (fcCompressed & 0x3fffffff) / 2 : fcCompressed;\n    if (cpEnd > cpStart) {\n      pieces.push({ cpStart, cpEnd, fileOffset, compressed });\n    }\n  }\n  return pieces;\n}\n\nfunction readPieceTableText(wordDocument: Uint8Array, pieces: Piece[], ccpText: number): string {\n  let output = \"\";\n  for (const piece of pieces) {\n    const cpEnd = ccpText > 0 ? Math.min(piece.cpEnd, ccpText) : piece.cpEnd;\n    const charCount = Math.max(0, cpEnd - piece.cpStart);\n    if (charCount === 0) {\n      continue;\n    }\n    const byteLength = charCount * (piece.compressed ? 1 : 2);\n    const bytes = wordDocument.subarray(piece.fileOffset, Math.min(wordDocument.length, piece.fileOffset + byteLength));\n    output += piece.compressed ? decodeWindows1252(bytes) : decodeUtf16Le(bytes);\n  }\n  return output;\n}\n\nfunction readFibTextFallback(wordDocument: Uint8Array, fib: FibInfo): string {\n  const bytes = wordDocument.subarray(fib.fcMin, Math.min(wordDocument.length, fib.fcMac));\n  return fib.textIsUnicode ? decodeUtf16Le(bytes) : decodeWindows1252(bytes);\n}\n\ntype WordSegment =\n  | { kind: \"pageBreak\" }\n  | { kind: \"paragraph\"; text: string }\n  | { kind: \"row\"; cells: string[] };\n\n// Word 97 文本流中单元格以单个 0x07 结束，行再以一个额外的 0x07 结束；\n// 连续 n 个 0x07 表示：当前单元格结束 + (n-2) 个空单元格 + 行结束。\nfunction segmentWordText(text: string): WordSegment[] {\n  const normalized = text.replace(/\\u0000/g, \"\").replace(/\\u000b/g, \"\\n\");\n  const segments: WordSegment[] = [];\n  let cells: string[] | null = null;\n  let buffer = \"\";\n\n  const flushParagraphs = () => {\n    for (const piece of buffer.split(/\\n{2,}/)) {\n      const cleaned = cleanWordText(piece);\n      if (cleaned.length > 0 && isDisplayableParagraph(cleaned)) {\n        segments.push({ kind: \"paragraph\", text: cleaned });\n      }\n    }\n    buffer = \"\";\n  };\n  const pushCell = () => {\n    cells = cells || [];\n    cells.push(cleanWordCellText(buffer));\n    buffer = \"\";\n  };\n  const endRow = () => {\n    const rowCells = cells || [];\n    cells = null;\n    if (rowCells.some((cell) => cell.length > 0)) {\n      segments.push({ kind: \"row\", cells: rowCells });\n    }\n  };\n\n  for (let index = 0; index < normalized.length; index += 1) {\n    const char = normalized[index];\n    if (char === \"\\u0007\") {\n      let run = 1;\n      while (normalized[index + run] === \"\\u0007\") {\n        run += 1;\n      }\n      pushCell();\n      for (let extra = 0; extra < run - 2; extra += 1) {\n        pushCell();\n      }\n      if (run >= 2) {\n        endRow();\n      }\n      index += run - 1;\n      continue;\n    }\n    if (char === \"\\r\") {\n      cells === null ? flushParagraphs() : (buffer += \"\\n\");\n      continue;\n    }\n    if (char === \"\\u000c\") {\n      if (cells === null) {\n        flushParagraphs();\n        segments.push({ kind: \"pageBreak\" });\n      } else {\n        buffer += \"\\n\";\n      }\n      continue;\n    }\n    buffer += char;\n  }\n  cells === null ? flushParagraphs() : endRow();\n  return segments.slice(0, 1000);\n}\n\nfunction cleanWordCellText(value: string): string {\n  return value\n    .split(\"\\n\")\n    .map((line) => cleanWordText(line))\n    .filter((line) => line.length > 0)\n    .join(\"\\n\");\n}\n\nfunction segmentsToParagraphs(segments: WordSegment[]): string[] {\n  return segments\n    .map(segmentDisplayText)\n    .filter((text) => text.length > 0)\n    .slice(0, 1000);\n}\n\nfunction segmentDisplayText(segment: WordSegment): string {\n  if (segment.kind === \"pageBreak\") {\n    return WORD_PAGE_BREAK;\n  }\n  return segment.kind === \"row\" ? segment.cells.filter((cell) => cell.length > 0).join(\"\\t\") : segment.text;\n}\n\nfunction removeTrailingFooterSegments(segments: WordSegment[]): WordSegment[] {\n  const paragraphs = segments.map(segmentDisplayText);\n  const tailStart = Math.max(0, paragraphs.length - 32);\n  const tail = paragraphs.slice(tailStart);\n  const relativePageFieldIndex = tail.findIndex(isFooterPageField);\n  if (relativePageFieldIndex < 0) {\n    return segments;\n  }\n\n  let start = tailStart + relativePageFieldIndex;\n  for (let index = start - 1; index >= tailStart; index -= 1) {\n    const paragraph = paragraphs[index];\n    if (paragraph === WORD_PAGE_BREAK || isLikelyFooterArtifact(paragraph)) {\n      start = index;\n      continue;\n    }\n    break;\n  }\n\n  const artifactSlice = paragraphs.slice(start);\n  const footerCueCount = artifactSlice.filter(isLikelyFooterArtifact).length;\n  if (footerCueCount < 2) {\n    return segments;\n  }\n  return segments.slice(0, start);\n}\n\nfunction isFooterPageField(paragraph: string): boolean {\n  return /^(?:PAGE|Page)(?:\\s+(?:PAGE|\\d+))?(?:\\s+of\\s+(?:NUMPAGES|\\d+))?$/i.test(paragraph.trim()) || /\\bNUMPAGES\\b/i.test(paragraph);\n}\n\nfunction isLikelyFooterArtifact(paragraph: string): boolean {\n  const value = paragraph.trim();\n  return (\n    value === WORD_PAGE_BREAK ||\n    isFooterPageField(value) ||\n    /^wd-[\\w.-]+$/i.test(value) ||\n    /^\\d{1,2}\\s+[A-Za-z]+\\s+\\d{4}$/.test(value) ||\n    /^Copyright\\s+©?\\s*(?:OASIS|2002 OASIS)/i.test(value)\n  );\n}\n\nfunction buildWordBlocks(segments: WordSegment[]): LegacyWordBlock[] {\n  const blocks: LegacyWordBlock[] = [];\n  let index = 0;\n  while (index < segments.length) {\n    const segment = segments[index];\n    if (segment.kind === \"pageBreak\") {\n      blocks.push({ type: \"pageBreak\" });\n      index += 1;\n      continue;\n    }\n\n    if (segment.kind === \"row\") {\n      const rows: string[][] = [];\n      while (index < segments.length) {\n        const rowSegment = segments[index];\n        if (rowSegment.kind !== \"row\") {\n          break;\n        }\n        rows.push(rowSegment.cells);\n        index += 1;\n      }\n      blocks.push({ type: \"table\", rows: applyTableColumnSpans(rows) });\n      continue;\n    }\n\n    const paragraph = segment.text;\n    const toc = parseTocEntry(paragraph);\n    if (toc) {\n      blocks.push(toc);\n      index += 1;\n      continue;\n    }\n\n    if (isTableRowCandidate(paragraph)) {\n      const rows: string[][] = [];\n      while (index < segments.length) {\n        const tabSegment = segments[index];\n        if (tabSegment.kind !== \"paragraph\" || !isTableRowCandidate(tabSegment.text)) {\n          break;\n        }\n        rows.push(...normalizeTableRows(splitTableRow(tabSegment.text)));\n        index += 1;\n      }\n      blocks.push({ type: \"table\", rows });\n      continue;\n    }\n\n    blocks.push(classifyParagraphBlock(paragraph, blocks));\n    index += 1;\n  }\n  return blocks;\n}\n\n// 短行的最后一个单元格按表格最大列数补跨度，近似还原合并单元格布局。\nfunction applyTableColumnSpans(rows: string[][]): LegacyWordTableRow[] {\n  const columnCount = Math.max(...rows.map((row) => row.length));\n  return rows.map((row) => {\n    if (row.length >= columnCount || row.length === 0) {\n      return row;\n    }\n    const cells: LegacyWordTableCell[] = row.slice(0, -1);\n    cells.push({ text: row[row.length - 1], colSpan: columnCount - row.length + 1 });\n    return cells;\n  });\n}\n\nfunction inferLayoutHints(paragraphs: string[], assets: LegacyWordAsset[]): LegacyWordLayoutHints {\n  const sample = paragraphs.slice(0, 40).join(\"\\n\");\n  const isOasisSpec = /Word Specification Sample/.test(sample) && /\\bOASIS\\b/i.test(paragraphs.join(\"\\n\"));\n  const oasisImage = isOasisSpec\n    ? assets.find((asset) => asset.mimeType === \"image/png\" && asset.width && asset.height && asset.width / asset.height > 2.5)\n    : undefined;\n  return {\n    lineNumbers: isOasisSpec,\n    headerBrand: isOasisSpec ? \"oasis\" : undefined,\n    headerImageId: oasisImage?.id,\n    footer: isOasisSpec ? inferOasisFooter(paragraphs) : undefined\n  };\n}\n\nfunction inferOasisFooter(paragraphs: string[]): LegacyWordFooter {\n  const documentId = findValueAfterLabel(paragraphs, \"Document identifier:\") || paragraphs.find((paragraph) => /^wd-[\\w.-]+/i.test(paragraph));\n  const subtitle = paragraphs.find((paragraph) => /\\b(?:draft|version)\\b/i.test(paragraph) && /\\d{4}/.test(paragraph));\n  const date = subtitle?.match(/\\b\\d{1,2}\\s+[A-Za-z]+\\s+\\d{4}\\b/)?.[0];\n  const copyright =\n    paragraphs.find((paragraph) => /Copyright.*OASIS.*All Rights Reserved/i.test(paragraph)) ||\n    \"Copyright © OASIS Open 2002. All Rights Reserved.\";\n  return { documentId, date, copyright };\n}\n\nfunction findValueAfterLabel(paragraphs: string[], label: string): string | undefined {\n  const index = paragraphs.findIndex((paragraph) => paragraph.toLowerCase() === label.toLowerCase());\n  if (index < 0) {\n    return undefined;\n  }\n  return paragraphs.slice(index + 1).find((paragraph) => paragraph !== WORD_PAGE_BREAK && paragraph.length > 0);\n}\n\nfunction paginateWordBlocks(blocks: LegacyWordBlock[], layout: LegacyWordLayoutHints): LegacyWordBlock[][] {\n  if (layout.headerBrand === \"oasis\") {\n    return paginateOasisBlocks(blocks);\n  }\n  const pages: LegacyWordBlock[][] = [];\n  let current: LegacyWordBlock[] = [];\n  let usedLines = 0;\n\n  for (const block of blocks) {\n    if (block.type === \"pageBreak\") {\n      if (current.length > 0) {\n        pages.push(current);\n      }\n      current = [];\n      usedLines = 0;\n      continue;\n    }\n    const maxLines = layout.lineNumbers ? 33 : 46;\n    const lines = estimatedLineCount(block);\n    const shouldBreak =\n      current.length > 0 &&\n      (usedLines + lines > maxLines || (block.type === \"heading\" && usedLines > Math.floor(maxLines * 0.72)));\n    if (shouldBreak) {\n      pages.push(current);\n      current = [];\n      usedLines = 0;\n    }\n    current.push(block);\n    usedLines += lines;\n  }\n\n  if (current.length > 0 || pages.length === 0) {\n    pages.push(current);\n  }\n  return pages;\n}\n\nfunction paginateOasisBlocks(blocks: LegacyWordBlock[]): LegacyWordBlock[][] {\n  const pages: LegacyWordBlock[][] = [];\n  let current: LegacyWordBlock[] = [];\n  const flush = () => {\n    if (current.length > 0) pages.push(current);\n    current = [];\n  };\n\n  for (const block of blocks) {\n    if (block.type === \"pageBreak\") {\n      flush();\n      continue;\n    }\n    const startsStyledPage = block.type === \"heading\" && block.level === 1;\n    const startsCodeExamplesPage = block.type === \"paragraph\" && /^For bibliography lists,/i.test(block.text);\n    if (current.length > 0 && (startsStyledPage || startsCodeExamplesPage)) flush();\n    current.push(block);\n  }\n  flush();\n  return pages.length > 0 ? pages : [[]];\n}\n\nfunction estimatedLineCount(block: LegacyWordBlock): number {\n  if (block.type === \"pageBreak\") {\n    return 0;\n  }\n  if (block.type === \"table\") {\n    return Math.max(1, block.rows.length);\n  }\n  if (block.type === \"toc\") {\n    return 1;\n  }\n  const baseWidth = \"indent\" in block && block.indent ? 78 : 96;\n  return Math.max(1, Math.ceil(block.text.length / baseWidth));\n}\n\nfunction classifyParagraphBlock(text: string, previousBlocks: LegacyWordBlock[]): LegacyWordBlock {\n  const visibleIndex = previousBlocks.filter((block) => block.type !== \"toc\").length;\n  if (visibleIndex === 0 && text.length <= 140) {\n    return { type: \"title\", text };\n  }\n  if (visibleIndex === 1 && /draft|version|20\\d{2}|19\\d{2}/i.test(text) && text.length <= 140) {\n    return { type: \"subtitle\", text };\n  }\n  if (\n    visibleIndex === 1 &&\n    text.length <= 40 &&\n    previousBlocks.some((block) => block.type === \"title\" && block.text.includes(text))\n  ) {\n    return { type: \"subtitle\", text };\n  }\n  const headingLevel = inferHeadingLevel(text, previousBlocks);\n  if (headingLevel) {\n    return { type: \"heading\", text, level: headingLevel };\n  }\n  if (/^[\\w\\s/().-]{2,45}:$/.test(text)) {\n    return { type: \"label\", text };\n  }\n  if (isInstructionParagraph(text)) {\n    return { type: \"instruction\", text, indent: shouldIndentParagraph(previousBlocks) };\n  }\n  if (/^\\[[-\\w.]+\\]\\s+/.test(text)) {\n    return { type: \"reference\", text };\n  }\n  const listLevel = inferListItemLevel(text);\n  if (listLevel) {\n    return { type: \"listItem\", text, level: listLevel };\n  }\n  if (isCodeLikeParagraph(text)) {\n    return { type: \"code\", text, indent: shouldIndentParagraph(previousBlocks) };\n  }\n  return { type: \"paragraph\", text, indent: shouldIndentParagraph(previousBlocks) };\n}\n\nfunction isInstructionParagraph(text: string): boolean {\n  return /^\\[[^\\]]{8,}\\]$/.test(text.trim());\n}\n\nfunction inferHeadingLevel(text: string, previousBlocks: LegacyWordBlock[]): 1 | 2 | 3 | undefined {\n  if (text.length > 120) {\n    return undefined;\n  }\n  if (/^table of contents$/i.test(text)) {\n    return 1;\n  }\n  if (/^(?:introduction|word styles|references|appendix\\b.*|acknowledgments|revision history|notices)$/i.test(text)) {\n    return 1;\n  }\n  const numbered = text.match(/^([1-9](?:\\.\\d+)*)\\s+.+/);\n  if (numbered) {\n    return Math.min(3, numbered[1].split(\".\").length) as 1 | 2 | 3;\n  }\n  if (/^[一二三四五六七八九十]+\\s*[.、．]\\s*.{1,40}$/.test(text)) {\n    return 2;\n  }\n  if (/^(?:terminology|overall style|title page|headings|paragraphs|lists|tables|code examples|character styles|normative)$/i.test(text)) {\n    return 2;\n  }\n  const previousHeading = [...previousBlocks].reverse().find((block) => block.type === \"heading\");\n  if (previousHeading?.type === \"heading\" && previousHeading.level === 1 && /^[A-Z][A-Za-z0-9 ()/-]{2,80}$/.test(text)) {\n    return 2;\n  }\n  return undefined;\n}\n\nfunction shouldIndentParagraph(previousBlocks: LegacyWordBlock[]): boolean {\n  for (let index = previousBlocks.length - 1; index >= 0; index -= 1) {\n    const block = previousBlocks[index];\n    if (block.type === \"toc\" || block.type === \"table\") {\n      continue;\n    }\n    if (block.type === \"label\") {\n      return true;\n    }\n    if ((block.type === \"paragraph\" || block.type === \"code\") && block.indent) {\n      return true;\n    }\n    return false;\n  }\n  return false;\n}\n\nfunction inferListItemLevel(text: string): 1 | 2 | undefined {\n  if (/^(?:list bullet|definition term)$/i.test(text)) {\n    return 1;\n  }\n  if (/^(?:list bullet 2|list continue 2|definition for the term\\.)$/i.test(text)) {\n    return 2;\n  }\n  return undefined;\n}\n\nfunction parseTocEntry(text: string): LegacyWordBlock | undefined {\n  const tabCells = splitTableRow(text);\n  if (tabCells.length >= 2 && /^\\d{1,3}$/.test(tabCells[tabCells.length - 1] || \"\")) {\n    const title = tabCells.slice(0, -1).join(\" \").trim();\n    if (isLikelyTocTitle(title)) {\n      const number = title.match(/^(\\d+(?:\\.\\d+)*)\\b/)?.[1] || \"\";\n      return { type: \"toc\", title, page: tabCells[tabCells.length - 1], level: number.includes(\".\") ? Math.min(3, number.split(\".\").length) : 1 };\n    }\n  }\n\n  const cleaned = text.replace(/\\s+/g, \" \").trim();\n  const match = cleaned.match(/^(?:(\\d+(?:\\.\\d+)*)\\s+)?(.+?)\\s+(\\d{1,3})$/);\n  if (!match || cleaned.length > 140) {\n    return undefined;\n  }\n  const number = match[1] || \"\";\n  const title = `${number ? `${number} ` : \"\"}${match[2] || \"\"}`.trim();\n  const page = match[3];\n  if (!title || !page || !/^(?:appendix\\b|references\\b|introduction\\b|[A-Z0-9])/i.test(title)) {\n    return undefined;\n  }\n  if (!isLikelyTocTitle(title)) {\n    return undefined;\n  }\n  const level = number.includes(\".\") ? Math.min(3, number.split(\".\").length) : 1;\n  return { type: \"toc\", title, page, level };\n}\n\nfunction isLikelyTocTitle(title: string): boolean {\n  return /^(?:appendix\\b|references\\b|introduction\\b|[1-9](?:\\.\\d+)*\\b|[A-Z][\\w\\s.-]{2,80}$)/i.test(title);\n}\n\nfunction isTableRowCandidate(text: string): boolean {\n  if (/^\\[[-\\w.]+\\]\\t+/.test(text)) {\n    return false;\n  }\n  const cells = splitTableRow(text);\n  return cells.length >= 2 && cells.some((cell) => cell.length > 0);\n}\n\nfunction splitTableRow(text: string): string[] {\n  return text\n    .split(/\\t+/)\n    .map((cell) => cell.trim())\n    .filter(Boolean);\n}\n\nfunction normalizeTableRows(cells: string[]): string[][] {\n  if (cells.length >= 8) {\n    const columnCount = inferTableColumnCount(cells);\n    if (columnCount > 1 && cells.length % columnCount === 0) {\n      const rows: string[][] = [];\n      for (let offset = 0; offset < cells.length; offset += columnCount) {\n        rows.push(cells.slice(offset, offset + columnCount));\n      }\n      return rows;\n    }\n  }\n  return [cells];\n}\n\nfunction inferTableColumnCount(cells: string[]): number {\n  const header = cells.slice(0, 6).join(\" \").toLowerCase();\n  if (/\\brev\\b/.test(header) && /\\bdate\\b/.test(header) && /whom|what/.test(header)) {\n    return 4;\n  }\n  for (const candidate of [5, 4, 3, 2]) {\n    if (cells.length % candidate === 0) {\n      return candidate;\n    }\n  }\n  return 0;\n}\n\nfunction isCodeLikeParagraph(text: string): boolean {\n  return (\n    /^\\d{24,}$/.test(text.replace(/\\s+/g, \"\")) ||\n    /^GET\\s+https?:\\/\\//i.test(text) ||\n    /^<other\\s+HTTP\\b/i.test(text) ||\n    /<\\/?[A-Za-z][A-Za-z0-9:-]*(?:\\s+[^>@]*)?>/.test(text) ||\n    /^\\s*(?:<\\?xml|function\\b|const\\b|let\\b|var\\b|if\\s*\\(|for\\s*\\(|while\\s*\\(|\\{|\\}|\\/\\/)/.test(text)\n  );\n}\n\nfunction cleanWordText(value: string): string {\n  return stripWordFieldCodes(value)\n    .replace(/[\\u0001-\\u0006\\u0008\\u000e-\\u001f]/g, \"\")\n    .replace(/ {2,}/g, \" \")\n    .trim();\n}\n\nfunction stripWordFieldCodes(value: string): string {\n  return value\n    .replace(/\\u0013\\s*(?:HYPERLINK|PAGEREF|TOC)\\b[^\\u0014\\u0015]*/gi, \"\")\n    .replace(/[\\u0013-\\u0015]/g, \"\")\n    .replace(/\\bHYPERLINK\\s+\\\\l\\s+\"[^\"]*\"\\s*/gi, \"\")\n    .replace(/\\bHYPERLINK\\s+\"[^\"]*\"\\s*/gi, \"\")\n    .replace(/\\bPAGEREF\\s+\\S+\\s+\\\\h\\s*/gi, \"\")\n    .replace(/\\bTOC\\s+\\\\o\\s+\"[^\"]*\"\\s+\\\\h\\s+\\\\z\\s*/gi, \"\")\n    .replace(/\\bREF\\s+[_A-Za-z0-9-]+\\s+(?:\\\\[A-Za-z]+\\s*)+/gi, \"\");\n}\n\nfunction isDisplayableParagraph(value: string): boolean {\n  if (value.length < 2) {\n    return false;\n  }\n  const letters = [...value].filter((char) => /[\\p{L}\\p{N}]/u.test(char)).length;\n  return letters >= Math.min(2, value.length);\n}\n\nfunction inferDocumentTitle(paragraphs: string[]): string {\n  return paragraphs.find((paragraph) => paragraph.length <= 120) || \"Word 文档\";\n}\n\nfunction appendMeta(list: HTMLDListElement, label: string, value: string): void {\n  const term = window.document.createElement(\"dt\");\n  term.textContent = label;\n  const detail = window.document.createElement(\"dd\");\n  detail.textContent = value;\n  list.append(term, detail);\n}\n\nfunction concatChunks(chunks: Uint8Array[], size?: number): Uint8Array {\n  const total = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n  const output = new Uint8Array(size === undefined ? total : Math.min(total, size));\n  let offset = 0;\n  for (const chunk of chunks) {\n    const slice = chunk.subarray(0, Math.min(chunk.length, output.length - offset));\n    output.set(slice, offset);\n    offset += slice.length;\n    if (offset >= output.length) {\n      break;\n    }\n  }\n  return output;\n}\n\nfunction alignEven(value: number): number {\n  return value % 2 === 0 ? value : value + 1;\n}\n\nfunction isUsableSector(sector: number): boolean {\n  return sector !== FREE_SECTOR && sector !== END_OF_CHAIN && sector !== FAT_SECTOR && sector !== DIFAT_SECTOR;\n}\n\nfunction sectorOffset(sector: number, sectorSize: number): number {\n  return (sector + 1) * sectorSize;\n}\n\nfunction normalizeStreamName(name: string): string {\n  return name.replace(/^\\/+/, \"\").toLowerCase();\n}\n\nfunction decodeUtf16Le(bytes: Uint8Array): string {\n  return new TextDecoder(\"utf-16le\").decode(bytes);\n}\n\nfunction decodeWindows1252(bytes: Uint8Array): string {\n  try {\n    return new TextDecoder(\"windows-1252\").decode(bytes);\n  } catch {\n    return Array.from(bytes, (byte) => String.fromCharCode(byte)).join(\"\");\n  }\n}\n\nfunction dataView(bytes: Uint8Array): DataView {\n  return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n}\n","import { inflate } from \"pako\";\n\nconst DOCUMENT_CONTAINER = 0x03e8;\nconst DOCUMENT_ATOM = 0x03e9;\nconst MASTER_PERSIST_ATOM = 0x03f3;\nconst SLIDE_CONTAINER = 0x03ee;\nconst SLIDE_ATOM = 0x03ef;\nconst MAIN_MASTER_CONTAINER = 0x03f8;\nconst TEXT_HEADER_ATOM = 0x0f9f;\nconst TEXT_CHARS_ATOM = 0x0fa0;\nconst STYLE_TEXT_PROP_ATOM = 0x0fa1;\nconst TEXT_MASTER_STYLE_ATOM = 0x0fa3;\nconst TEXT_BYTES_ATOM = 0x0fa8;\nconst FONT_ENTITY_ATOM = 0x0fb7;\nconst OFFICE_ART_SPGR_CONTAINER = 0xf003;\nconst OFFICE_ART_SP_CONTAINER = 0xf004;\nconst OFFICE_ART_SPGR_ATOM = 0xf009;\nconst OFFICE_ART_FSP = 0xf00a;\nconst OFFICE_ART_FOPT = 0xf00b;\nconst OFFICE_ART_CHILD_ANCHOR = 0xf00f;\nconst OFFICE_ART_CLIENT_ANCHOR = 0xf010;\nconst OFFICE_ART_PIB_PROPERTY = 0x0104;\nconst OFFICE_ART_CROP_FROM_TOP_PROPERTY = 0x0100;\nconst OFFICE_ART_CROP_FROM_BOTTOM_PROPERTY = 0x0101;\nconst OFFICE_ART_CROP_FROM_LEFT_PROPERTY = 0x0102;\nconst OFFICE_ART_CROP_FROM_RIGHT_PROPERTY = 0x0103;\nconst OFFICE_ART_ROTATION_PROPERTY = 0x0004;\nconst OFFICE_ART_TEXT_FLOW_PROPERTY = 0x0088;\nconst OFFICE_ART_FILL_COLOR_PROPERTY = 0x0181;\nconst OFFICE_ART_FILL_STYLE_PROPERTY = 0x01bf;\nconst OFFICE_ART_LINE_COLOR_PROPERTY = 0x01c0;\nconst OFFICE_ART_LINE_WIDTH_PROPERTY = 0x01cb;\nconst OFFICE_ART_LINE_STYLE_PROPERTY = 0x01ff;\nconst EMU_PER_MASTER_UNIT = 12700 / 8;\n\nconst BLIP_EMF = 0xf01a;\nconst BLIP_WMF = 0xf01b;\nconst BLIP_JPEG = 0xf01d;\nconst BLIP_PNG = 0xf01e;\nconst BLIP_TIFF = 0xf029;\n\ntype BinaryRecord = {\n  start: number;\n  payloadStart: number;\n  end: number;\n  version: number;\n  instance: number;\n  type: number;\n};\n\nexport type LegacyPowerPointShape = {\n  left: number;\n  top: number;\n  width: number;\n  height: number;\n  texts: string[];\n  formattedTexts?: LegacyPowerPointFormattedText[];\n  imageIndices: number[];\n  textType?: number;\n  shapeType?: number;\n  fillColor?: string;\n  lineColor?: string;\n  fillEnabled?: boolean;\n  lineEnabled?: boolean;\n  lineWidth?: number;\n  rotation?: number;\n  flipHorizontal?: boolean;\n  flipVertical?: boolean;\n  imageCropTop?: number;\n  imageCropBottom?: number;\n  imageCropLeft?: number;\n  imageCropRight?: number;\n  verticalText?: boolean;\n};\n\nexport type LegacyPowerPointCharacterStyle = {\n  bold?: boolean;\n  italic?: boolean;\n  underline?: boolean;\n  fontSize?: number;\n  color?: string;\n  fontRef?: number;\n};\n\nexport type LegacyPowerPointTextRun = LegacyPowerPointCharacterStyle & {\n  start: number;\n  length: number;\n};\n\nexport type LegacyPowerPointParagraphRun = {\n  start: number;\n  length: number;\n  alignment?: \"left\" | \"center\" | \"right\" | \"justify\";\n  lineSpacing?: number;\n  indentLevel?: number;\n};\n\nexport type LegacyPowerPointMasterTextStyles = Record<number, LegacyPowerPointCharacterStyle[]>;\n\nexport type LegacyPowerPointFormattedText = {\n  text: string;\n  characterRuns: LegacyPowerPointTextRun[];\n  paragraphRuns: LegacyPowerPointParagraphRun[];\n};\n\nexport type LegacyPowerPointSlide = {\n  shapes: LegacyPowerPointShape[];\n  masterShapes: LegacyPowerPointShape[];\n  masterIdRef?: number;\n  masterTextStyles: LegacyPowerPointMasterTextStyles;\n};\n\nexport type LegacyPowerPointImage = {\n  index: number;\n  kind: \"bitmap\" | \"emf\" | \"wmf\";\n  mimeType: string;\n  bytes: Uint8Array;\n};\n\nexport type LegacyPowerPointPresentation = {\n  width: number;\n  height: number;\n  masterShapes: LegacyPowerPointShape[];\n  slides: LegacyPowerPointSlide[];\n  images: LegacyPowerPointImage[];\n  fonts: string[];\n};\n\nexport async function parseLegacyPowerPoint(arrayBuffer: ArrayBuffer): Promise<LegacyPowerPointPresentation> {\n  if (arrayBuffer.byteLength < 512 || !hasCompoundFileSignature(new Uint8Array(arrayBuffer, 0, Math.min(8, arrayBuffer.byteLength)))) {\n    throw new Error(\"The file is not a complete OLE compound document.\");\n  }\n  const xlsxModule = await import(\"xlsx\");\n  const xlsx =\n    (xlsxModule as unknown as { default?: typeof import(\"xlsx\") }).default ||\n    (xlsxModule as typeof import(\"xlsx\"));\n  const cfb = xlsx.CFB.read(new Uint8Array(arrayBuffer), { type: \"array\" });\n  const documentEntry = xlsx.CFB.find(cfb, \"PowerPoint Document\");\n  if (!documentEntry?.content) {\n    throw new Error(\"PowerPoint Document stream was not found.\");\n  }\n\n  const picturesEntry = xlsx.CFB.find(cfb, \"Pictures\");\n  return parseLegacyPowerPointStreams(\n    asUint8Array(documentEntry.content),\n    picturesEntry?.content ? asUint8Array(picturesEntry.content) : undefined\n  );\n}\n\nexport function parseLegacyPowerPointStreams(\n  documentStream: Uint8Array,\n  picturesStream?: Uint8Array\n): LegacyPowerPointPresentation {\n  if (documentStream.byteLength < 8) {\n    throw new Error(\"PowerPoint Document stream is empty.\");\n  }\n\n  const view = new DataView(documentStream.buffer, documentStream.byteOffset, documentStream.byteLength);\n  let width = 7200;\n  let height = 5400;\n  const masterIds = parseMasterIds(documentStream);\n  const fonts = parseFontFamilies(documentStream);\n  const masters: Array<{\n    id?: number;\n    shapes: LegacyPowerPointShape[];\n    textStyles: LegacyPowerPointMasterTextStyles;\n  }> = [];\n  const slides: Array<LegacyPowerPointSlide & { inheritMasterObjects: boolean }> = [];\n\n  walkRecords(documentStream, 0, documentStream.byteLength, (record) => {\n    if (record.type === DOCUMENT_ATOM && record.end - record.payloadStart >= 8) {\n      const candidateWidth = view.getUint32(record.payloadStart, true);\n      const candidateHeight = view.getUint32(record.payloadStart + 4, true);\n      if (candidateWidth > 0 && candidateHeight > 0) {\n        width = candidateWidth;\n        height = candidateHeight;\n      }\n      return false;\n    }\n    if (record.type === MAIN_MASTER_CONTAINER) {\n      masters.push({\n        id: masterIds[masters.length],\n        shapes: parseShapeContainers(documentStream, record.payloadStart, record.end, width, height),\n        textStyles: parseTextMasterStyles(documentStream, record.payloadStart, record.end)\n      });\n      return false;\n    }\n    if (record.type === SLIDE_CONTAINER) {\n      const metadata = parseSlideMasterMetadata(documentStream, record.payloadStart, record.end);\n      slides.push({\n        shapes: parseShapeContainers(documentStream, record.payloadStart, record.end, width, height),\n        masterShapes: [],\n        masterTextStyles: {},\n        masterIdRef: metadata.masterIdRef,\n        inheritMasterObjects: metadata.inheritMasterObjects\n      });\n      return false;\n    }\n    return record.type === DOCUMENT_CONTAINER || record.version === 0x0f;\n  });\n\n  if (slides.length === 0) {\n    throw new Error(\"No slide records were found in the PowerPoint Document stream.\");\n  }\n\n  const masterShapes = deduplicateShapes(masters.flatMap((master) => master.shapes));\n  const resolvedSlides = slides.map(({ inheritMasterObjects, ...slide }) => {\n    const matchingMaster = masters.find((master) => master.id === slide.masterIdRef);\n    return {\n      ...slide,\n      masterShapes: inheritMasterObjects\n        ? matchingMaster?.shapes || (slide.masterIdRef === undefined ? masterShapes : [])\n        : [],\n      masterTextStyles: matchingMaster?.textStyles || {}\n    };\n  });\n\n  return {\n    width,\n    height,\n    masterShapes,\n    slides: resolvedSlides,\n    images: picturesStream ? parsePicturesStream(picturesStream) : [],\n    fonts\n  };\n}\n\nfunction parseTextMasterStyles(bytes: Uint8Array, start: number, end: number): LegacyPowerPointMasterTextStyles {\n  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n  const styles: LegacyPowerPointMasterTextStyles = {};\n  walkRecords(bytes, start, end, (record) => {\n    if (record.type !== TEXT_MASTER_STYLE_ATOM || record.end - record.payloadStart < 2) {\n      return record.version === 0x0f;\n    }\n    const levelCount = Math.min(5, view.getUint16(record.payloadStart, true));\n    const levels: LegacyPowerPointCharacterStyle[] = styles[record.instance] || [];\n    let offset = record.payloadStart + 2;\n    for (let sequence = 0; sequence < levelCount && offset < record.end; sequence += 1) {\n      let level = sequence;\n      if (record.instance >= 5) {\n        if (offset + 2 > record.end) break;\n        level = view.getUint16(offset, true);\n        offset += 2;\n      }\n      const paragraph = parseTextParagraphException(view, offset, record.end);\n      if (!paragraph) break;\n      offset = paragraph.offset;\n      const character = parseTextCharacterException(view, offset, record.end);\n      if (!character) break;\n      offset = character.offset;\n      levels[level] = { ...(levels[level] || {}), ...character.style };\n    }\n    styles[record.instance] = levels;\n    return false;\n  });\n  return styles;\n}\n\nfunction parseFontFamilies(bytes: Uint8Array): string[] {\n  const fonts: string[] = [];\n  walkRecords(bytes, 0, bytes.byteLength, (record) => {\n    if (record.type === FONT_ENTITY_ATOM && record.end - record.payloadStart >= 64) {\n      const family = decodePresentationText(bytes.subarray(record.payloadStart, record.payloadStart + 64), true);\n      if (family) fonts[record.instance] = family;\n      return false;\n    }\n    return record.version === 0x0f;\n  });\n  return fonts;\n}\n\nfunction parseMasterIds(bytes: Uint8Array): number[] {\n  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n  const ids: number[] = [];\n  walkRecords(bytes, 0, bytes.byteLength, (record) => {\n    if (record.type === MASTER_PERSIST_ATOM && record.end - record.payloadStart >= 16) {\n      const masterId = view.getUint32(record.payloadStart + 12, true);\n      if ((masterId & 0x80000000) !== 0) {\n        ids.push(masterId);\n      }\n      return false;\n    }\n    return record.version === 0x0f;\n  });\n  return ids;\n}\n\nfunction parseSlideMasterMetadata(\n  bytes: Uint8Array,\n  start: number,\n  end: number\n): { masterIdRef?: number; inheritMasterObjects: boolean } {\n  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n  let masterIdRef: number | undefined;\n  let inheritMasterObjects = true;\n  walkRecords(bytes, start, end, (record) => {\n    if (record.type !== SLIDE_ATOM || record.end - record.payloadStart < 22) {\n      return record.version === 0x0f;\n    }\n    masterIdRef = view.getUint32(record.payloadStart + 12, true);\n    inheritMasterObjects = (view.getUint16(record.payloadStart + 20, true) & 0x0001) !== 0;\n    return false;\n  });\n  return { masterIdRef, inheritMasterObjects };\n}\n\nfunction parseShapeContainers(\n  bytes: Uint8Array,\n  start: number,\n  end: number,\n  slideWidth: number,\n  slideHeight: number\n): LegacyPowerPointShape[] {\n  const shapes: LegacyPowerPointShape[] = [];\n  for (const record of readDirectRecords(bytes, start, end)) {\n    if (record.type === OFFICE_ART_SPGR_CONTAINER) {\n      shapes.push(...parseShapeGroup(bytes, record.payloadStart, record.end, slideWidth, slideHeight));\n      continue;\n    }\n    if (record.type === OFFICE_ART_SP_CONTAINER) {\n      const shape = parseShape(bytes, record.payloadStart, record.end, slideWidth, slideHeight, true);\n      if (shape && isRenderableShape(shape)) {\n        shapes.push(shape);\n      }\n      continue;\n    }\n    if (record.version === 0x0f) {\n      shapes.push(...parseShapeContainers(bytes, record.payloadStart, record.end, slideWidth, slideHeight));\n    }\n  }\n  return shapes;\n}\n\nfunction parseShapeGroup(\n  bytes: Uint8Array,\n  start: number,\n  end: number,\n  slideWidth: number,\n  slideHeight: number\n): LegacyPowerPointShape[] {\n  const records = readDirectRecords(bytes, start, end);\n  const descriptor = records.find((record) =>\n    record.type === OFFICE_ART_SP_CONTAINER && Boolean(parseGroupBounds(bytes, record.payloadStart, record.end))\n  );\n  const bounds = descriptor ? parseGroupBounds(bytes, descriptor.payloadStart, descriptor.end) : undefined;\n  const placement = descriptor\n    ? parseShape(bytes, descriptor.payloadStart, descriptor.end, slideWidth, slideHeight, false)\n    : undefined;\n  const shapes: LegacyPowerPointShape[] = [];\n\n  for (const record of records) {\n    if (record === descriptor) {\n      continue;\n    }\n    if (record.type === OFFICE_ART_SPGR_CONTAINER) {\n      shapes.push(...parseShapeGroup(bytes, record.payloadStart, record.end, slideWidth, slideHeight));\n      continue;\n    }\n    if (record.type === OFFICE_ART_SP_CONTAINER) {\n      const shape = parseShape(bytes, record.payloadStart, record.end, slideWidth, slideHeight, false);\n      if (shape && isRenderableShape(shape)) {\n        shapes.push(shape);\n      }\n    }\n  }\n\n  if (!bounds || !placement || bounds.width === 0 || bounds.height === 0) {\n    return shapes;\n  }\n  return shapes.map((shape) => transformGroupedShape(shape, bounds, placement));\n}\n\nfunction parseGroupBounds(\n  bytes: Uint8Array,\n  start: number,\n  end: number\n): Pick<LegacyPowerPointShape, \"left\" | \"top\" | \"width\" | \"height\"> | undefined {\n  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n  let bounds: Pick<LegacyPowerPointShape, \"left\" | \"top\" | \"width\" | \"height\"> | undefined;\n  walkRecords(bytes, start, end, (record) => {\n    if (record.type !== OFFICE_ART_SPGR_ATOM || record.end - record.payloadStart < 16) {\n      return record.version === 0x0f;\n    }\n    const left = view.getInt32(record.payloadStart, true);\n    const top = view.getInt32(record.payloadStart + 4, true);\n    const right = view.getInt32(record.payloadStart + 8, true);\n    const bottom = view.getInt32(record.payloadStart + 12, true);\n    bounds = { left, top, width: right - left, height: bottom - top };\n    return false;\n  });\n  return bounds;\n}\n\nfunction transformGroupedShape(\n  shape: LegacyPowerPointShape,\n  bounds: Pick<LegacyPowerPointShape, \"left\" | \"top\" | \"width\" | \"height\">,\n  placement: Pick<LegacyPowerPointShape, \"left\" | \"top\" | \"width\" | \"height\">\n): LegacyPowerPointShape {\n  return {\n    ...shape,\n    left: placement.left + ((shape.left - bounds.left) / bounds.width) * placement.width,\n    top: placement.top + ((shape.top - bounds.top) / bounds.height) * placement.height,\n    width: (shape.width / bounds.width) * placement.width,\n    height: (shape.height / bounds.height) * placement.height\n  };\n}\n\nfunction parseShape(\n  bytes: Uint8Array,\n  start: number,\n  end: number,\n  slideWidth: number,\n  slideHeight: number,\n  normalizeChildAnchor: boolean\n): LegacyPowerPointShape | undefined {\n  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n  const textBlocks: string[] = [];\n  const textStylePayloads: Uint8Array[] = [];\n  const imageIndices: number[] = [];\n  const visual: Pick<\n    LegacyPowerPointShape,\n    | \"shapeType\"\n    | \"fillColor\"\n    | \"lineColor\"\n    | \"fillEnabled\"\n    | \"lineEnabled\"\n    | \"lineWidth\"\n    | \"rotation\"\n    | \"imageCropTop\"\n    | \"imageCropBottom\"\n    | \"imageCropLeft\"\n    | \"imageCropRight\"\n    | \"flipHorizontal\"\n    | \"flipVertical\"\n    | \"verticalText\"\n  > = {};\n  let textType: number | undefined;\n  let anchor: Pick<LegacyPowerPointShape, \"left\" | \"top\" | \"width\" | \"height\"> | undefined;\n\n  walkRecords(bytes, start, end, (record) => {\n    if (record.type === OFFICE_ART_SP_CONTAINER) {\n      return false;\n    }\n    if (record.type === OFFICE_ART_CLIENT_ANCHOR && record.end - record.payloadStart >= 8) {\n      const large = record.end - record.payloadStart >= 16;\n      const coordinate = (index: number) =>\n        large\n          ? view.getInt32(record.payloadStart + index * 4, true)\n          : view.getInt16(record.payloadStart + index * 2, true);\n      // MS-PPT OfficeArtClientAnchorData stores both SmallRectStruct and\n      // RectStruct values in top, left, right, bottom order.\n      const top = coordinate(0);\n      const left = coordinate(1);\n      const right = coordinate(2);\n      const bottom = coordinate(3);\n      anchor = {\n        left,\n        top,\n        width: Math.max(1, right - left),\n        height: Math.max(1, bottom - top)\n      };\n      return false;\n    }\n    if (record.type === OFFICE_ART_CHILD_ANCHOR && record.end - record.payloadStart >= 16) {\n      const left = view.getInt32(record.payloadStart, true);\n      const top = view.getInt32(record.payloadStart + 4, true);\n      const right = view.getInt32(record.payloadStart + 8, true);\n      const bottom = view.getInt32(record.payloadStart + 12, true);\n      const childAnchor = {\n        left,\n        top,\n        width: Math.max(1, right - left),\n        height: Math.max(1, bottom - top)\n      };\n      anchor = normalizeChildAnchor\n        ? normalizePresentationAnchor(childAnchor, slideWidth, slideHeight)\n        : childAnchor;\n      return false;\n    }\n    if (record.type === TEXT_CHARS_ATOM || record.type === TEXT_BYTES_ATOM) {\n      const decoded = decodePresentationText(bytes.subarray(record.payloadStart, record.end), record.type === TEXT_CHARS_ATOM);\n      if (decoded) {\n        textBlocks.push(decoded);\n      }\n      return false;\n    }\n    if (record.type === STYLE_TEXT_PROP_ATOM) {\n      textStylePayloads.push(bytes.subarray(record.payloadStart, record.end));\n      return false;\n    }\n    if (record.type === TEXT_HEADER_ATOM && record.end - record.payloadStart >= 4) {\n      textType = view.getUint32(record.payloadStart, true);\n      return false;\n    }\n    if (record.type === OFFICE_ART_FSP) {\n      visual.shapeType = record.instance;\n      if (record.end - record.payloadStart >= 8) {\n        const flags = view.getUint32(record.payloadStart + 4, true);\n        visual.flipHorizontal = (flags & 0x40) !== 0;\n        visual.flipVertical = (flags & 0x80) !== 0;\n      }\n      return false;\n    }\n    if (record.type === OFFICE_ART_FOPT) {\n      collectImageReferences(view, record, imageIndices);\n      collectShapeProperties(view, record, visual);\n      return false;\n    }\n    return record.version === 0x0f;\n  });\n\n  if (!anchor) {\n    return undefined;\n  }\n  const formattedTexts = textBlocks.map((text, index) =>\n    parseStyleTextPropAtom(text, textStylePayloads[index])\n  );\n  return {\n    ...anchor,\n    texts: uniqueStrings(textBlocks),\n    ...(textStylePayloads.length > 0 ? { formattedTexts } : {}),\n    imageIndices: [...new Set(imageIndices)],\n    ...visual,\n    ...(textType === undefined ? {} : { textType })\n  };\n}\n\nfunction parseStyleTextPropAtom(text: string, payload?: Uint8Array): LegacyPowerPointFormattedText {\n  const formatted: LegacyPowerPointFormattedText = {\n    text,\n    characterRuns: [],\n    paragraphRuns: []\n  };\n  if (!payload || payload.byteLength < 10) {\n    return formatted;\n  }\n\n  const view = new DataView(payload.buffer, payload.byteOffset, payload.byteLength);\n  const formattedLength = text.length + 1;\n  let offset = 0;\n  let covered = 0;\n  while (covered < formattedLength && offset + 10 <= payload.byteLength) {\n    const count = view.getUint32(offset, true);\n    offset += 4;\n    const indentLevel = view.getUint16(offset, true);\n    offset += 2;\n    const parsed = parseTextParagraphException(view, offset, payload.byteLength);\n    if (!parsed) {\n      return formatted;\n    }\n    offset = parsed.offset;\n    formatted.paragraphRuns.push({\n      start: covered,\n      length: Math.min(count, Math.max(0, text.length - covered)),\n      indentLevel,\n      ...parsed.style\n    });\n    covered += count;\n    if (count === 0) {\n      return formatted;\n    }\n  }\n\n  covered = 0;\n  while (covered < formattedLength && offset + 8 <= payload.byteLength) {\n    const count = view.getUint32(offset, true);\n    offset += 4;\n    const parsed = parseTextCharacterException(view, offset, payload.byteLength);\n    if (!parsed) {\n      break;\n    }\n    offset = parsed.offset;\n    formatted.characterRuns.push({\n      start: covered,\n      length: Math.min(count, Math.max(0, text.length - covered)),\n      ...parsed.style\n    });\n    covered += count;\n    if (count === 0) {\n      break;\n    }\n  }\n  return formatted;\n}\n\nfunction parseTextParagraphException(\n  view: DataView,\n  start: number,\n  end: number\n): { offset: number; style: Omit<LegacyPowerPointParagraphRun, \"start\" | \"length\"> } | undefined {\n  if (start + 4 > end) return undefined;\n  const masks = view.getUint32(start, true);\n  let offset = start + 4;\n  const take = (size: number) => {\n    if (offset + size > end) return false;\n    offset += size;\n    return true;\n  };\n  const readInt16 = () => {\n    if (offset + 2 > end) return undefined;\n    const value = view.getInt16(offset, true);\n    offset += 2;\n    return value;\n  };\n\n  if ((masks & 0x0000000f) !== 0 && !take(2)) return undefined;\n  if ((masks & 0x00000080) !== 0 && !take(2)) return undefined;\n  if ((masks & 0x00000010) !== 0 && !take(2)) return undefined;\n  if ((masks & 0x00000040) !== 0 && !take(2)) return undefined;\n  if ((masks & 0x00000020) !== 0 && !take(4)) return undefined;\n\n  let alignment: LegacyPowerPointParagraphRun[\"alignment\"];\n  if ((masks & 0x00000800) !== 0) {\n    const value = readInt16();\n    if (value === undefined) return undefined;\n    alignment = value === 1 || value === 4 || value === 5\n      ? \"center\"\n      : value === 2\n        ? \"right\"\n        : value === 3 || value === 6\n          ? \"justify\"\n          : \"left\";\n  }\n\n  let lineSpacing: number | undefined;\n  if ((masks & 0x00001000) !== 0) {\n    const value = readInt16();\n    if (value === undefined) return undefined;\n    lineSpacing = value > 0 ? value / 100 : undefined;\n  }\n  if ((masks & 0x00002000) !== 0 && !take(2)) return undefined;\n  if ((masks & 0x00004000) !== 0 && !take(2)) return undefined;\n  if ((masks & 0x00000100) !== 0 && !take(2)) return undefined;\n  if ((masks & 0x00000400) !== 0 && !take(2)) return undefined;\n  if ((masks & 0x00008000) !== 0 && !take(2)) return undefined;\n  if ((masks & 0x00100000) !== 0) {\n    const count = readInt16();\n    if (count === undefined || count < 0 || !take(count * 4)) return undefined;\n  }\n  if ((masks & 0x00010000) !== 0 && !take(2)) return undefined;\n  if ((masks & 0x000e0000) !== 0 && !take(2)) return undefined;\n  if ((masks & 0x00200000) !== 0 && !take(2)) return undefined;\n  return { offset, style: { ...(alignment ? { alignment } : {}), ...(lineSpacing ? { lineSpacing } : {}) } };\n}\n\nfunction parseTextCharacterException(\n  view: DataView,\n  start: number,\n  end: number\n): { offset: number; style: LegacyPowerPointCharacterStyle } | undefined {\n  if (start + 4 > end) return undefined;\n  const masks = view.getUint32(start, true);\n  let offset = start + 4;\n  const style: LegacyPowerPointCharacterStyle = {};\n  const take = (size: number) => {\n    if (offset + size > end) return false;\n    offset += size;\n    return true;\n  };\n\n  if ((masks & 0x00003fff) !== 0) {\n    if (offset + 2 > end) return undefined;\n    const fontStyle = view.getUint16(offset, true);\n    offset += 2;\n    if ((masks & 0x00000001) !== 0) style.bold = (fontStyle & 0x0001) !== 0;\n    if ((masks & 0x00000002) !== 0) style.italic = (fontStyle & 0x0002) !== 0;\n    if ((masks & 0x00000004) !== 0) style.underline = (fontStyle & 0x0004) !== 0;\n  }\n  if ((masks & 0x00010000) !== 0) {\n    if (offset + 2 > end) return undefined;\n    style.fontRef = view.getUint16(offset, true);\n    offset += 2;\n  }\n  if ((masks & 0x00200000) !== 0 && !take(2)) return undefined;\n  if ((masks & 0x00400000) !== 0 && !take(2)) return undefined;\n  if ((masks & 0x00800000) !== 0 && !take(2)) return undefined;\n  if ((masks & 0x00020000) !== 0) {\n    if (offset + 2 > end) return undefined;\n    style.fontSize = view.getInt16(offset, true);\n    offset += 2;\n  }\n  if ((masks & 0x00040000) !== 0) {\n    if (offset + 4 > end) return undefined;\n    const color = decodeTextColor(view, offset);\n    if (color) style.color = color;\n    offset += 4;\n  }\n  if ((masks & 0x00080000) !== 0 && !take(2)) return undefined;\n  // These extension-mask bits are required to be zero in TextCFException.\n  // Ignore them here so a malformed producer cannot desynchronize the\n  // surrounding record; the base exception itself carries no extra bytes.\n  return { offset, style };\n}\n\nfunction decodeTextColor(view: DataView, offset: number): string | undefined {\n  const index = view.getUint8(offset + 3);\n  if (index !== 0xfe) return undefined;\n  return `#${[view.getUint8(offset), view.getUint8(offset + 1), view.getUint8(offset + 2)]\n    .map((channel) => channel.toString(16).padStart(2, \"0\"))\n    .join(\"\")}`;\n}\n\nfunction isRenderableShape(shape: LegacyPowerPointShape): boolean {\n  return (\n    shape.texts.length > 0 ||\n    shape.imageIndices.length > 0 ||\n    shape.fillEnabled === true ||\n    shape.lineEnabled === true\n  );\n}\n\nfunction readDirectRecords(bytes: Uint8Array, start: number, end: number): BinaryRecord[] {\n  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n  const records: BinaryRecord[] = [];\n  let offset = start;\n  while (offset + 8 <= end) {\n    const record = readRecord(view, offset, end);\n    if (!record) {\n      break;\n    }\n    records.push(record);\n    if (record.end <= offset) {\n      break;\n    }\n    offset = record.end;\n  }\n  return records;\n}\n\nfunction normalizePresentationAnchor(\n  anchor: Pick<LegacyPowerPointShape, \"left\" | \"top\" | \"width\" | \"height\">,\n  slideWidth: number,\n  slideHeight: number\n): Pick<LegacyPowerPointShape, \"left\" | \"top\" | \"width\" | \"height\"> {\n  const maximum = Math.max(\n    Math.abs(anchor.left),\n    Math.abs(anchor.top),\n    Math.abs(anchor.left + anchor.width),\n    Math.abs(anchor.top + anchor.height)\n  );\n  if (maximum <= Math.max(slideWidth, slideHeight) * 16) {\n    return anchor;\n  }\n  return {\n    left: anchor.left / EMU_PER_MASTER_UNIT,\n    top: anchor.top / EMU_PER_MASTER_UNIT,\n    width: anchor.width / EMU_PER_MASTER_UNIT,\n    height: anchor.height / EMU_PER_MASTER_UNIT\n  };\n}\n\nfunction collectImageReferences(view: DataView, record: BinaryRecord, target: number[]): void {\n  const propertyEnd = Math.min(record.end, record.payloadStart + record.instance * 6);\n  for (let offset = record.payloadStart; offset + 6 <= propertyEnd; offset += 6) {\n    const propertyId = view.getUint16(offset, true) & 0x3fff;\n    if (propertyId === OFFICE_ART_PIB_PROPERTY) {\n      const imageIndex = view.getUint32(offset + 2, true);\n      if (imageIndex > 0) {\n        target.push(imageIndex);\n      }\n    }\n  }\n}\n\nfunction collectShapeProperties(\n  view: DataView,\n  record: BinaryRecord,\n  target: Pick<\n    LegacyPowerPointShape,\n    | \"fillColor\"\n    | \"lineColor\"\n    | \"fillEnabled\"\n    | \"lineEnabled\"\n    | \"lineWidth\"\n    | \"rotation\"\n    | \"imageCropTop\"\n    | \"imageCropBottom\"\n    | \"imageCropLeft\"\n    | \"imageCropRight\"\n    | \"verticalText\"\n  >\n): void {\n  const propertyEnd = Math.min(record.end, record.payloadStart + record.instance * 6);\n  for (let offset = record.payloadStart; offset + 6 <= propertyEnd; offset += 6) {\n    const propertyId = view.getUint16(offset, true) & 0x3fff;\n    const value = view.getUint32(offset + 2, true);\n    if (propertyId === OFFICE_ART_FILL_COLOR_PROPERTY) {\n      target.fillColor = decodeOfficeArtColor(value) || target.fillColor;\n    } else if (propertyId === OFFICE_ART_FILL_STYLE_PROPERTY) {\n      target.fillEnabled = (value & 0x10) !== 0;\n    } else if (propertyId === OFFICE_ART_LINE_COLOR_PROPERTY) {\n      target.lineColor = decodeOfficeArtColor(value) || target.lineColor;\n    } else if (propertyId === OFFICE_ART_LINE_STYLE_PROPERTY) {\n      target.lineEnabled = (value & 0x08) !== 0;\n    } else if (propertyId === OFFICE_ART_LINE_WIDTH_PROPERTY) {\n      target.lineWidth = Math.max(0.25, value / 12700);\n    } else if (propertyId === OFFICE_ART_ROTATION_PROPERTY) {\n      target.rotation = (value | 0) / 65536;\n    } else if (propertyId === OFFICE_ART_CROP_FROM_TOP_PROPERTY) {\n      target.imageCropTop = (value | 0) / 65536;\n    } else if (propertyId === OFFICE_ART_CROP_FROM_BOTTOM_PROPERTY) {\n      target.imageCropBottom = (value | 0) / 65536;\n    } else if (propertyId === OFFICE_ART_CROP_FROM_LEFT_PROPERTY) {\n      target.imageCropLeft = (value | 0) / 65536;\n    } else if (propertyId === OFFICE_ART_CROP_FROM_RIGHT_PROPERTY) {\n      target.imageCropRight = (value | 0) / 65536;\n    } else if (propertyId === OFFICE_ART_TEXT_FLOW_PROPERTY) {\n      target.verticalText = value === 1 || value === 3;\n    }\n  }\n}\n\nfunction decodeOfficeArtColor(value: number): string | undefined {\n  // Direct OfficeArt colors store red, green and blue in the low three bytes.\n  // Values with a non-zero high byte are indexed or system colors and need a\n  // color-scheme lookup that is not available at shape level.\n  if ((value & 0xff000000) !== 0) {\n    return undefined;\n  }\n  const red = value & 0xff;\n  const green = (value >>> 8) & 0xff;\n  const blue = (value >>> 16) & 0xff;\n  return `#${[red, green, blue].map((channel) => channel.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\nfunction parsePicturesStream(bytes: Uint8Array): LegacyPowerPointImage[] {\n  const images: LegacyPowerPointImage[] = [];\n  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n  let offset = 0;\n  let index = 1;\n\n  while (offset + 8 <= bytes.byteLength) {\n    const record = readRecord(view, offset, bytes.byteLength);\n    if (!record) {\n      break;\n    }\n    const payload = bytes.subarray(record.payloadStart, record.end);\n    let image: Omit<LegacyPowerPointImage, \"index\"> | undefined;\n    if (record.type === BLIP_PNG) {\n      image = extractBitmap(payload, \"image/png\", [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);\n    } else if (record.type === BLIP_JPEG) {\n      image = extractBitmap(payload, \"image/jpeg\", [0xff, 0xd8, 0xff]);\n    } else if (record.type === BLIP_TIFF) {\n      image = extractTiff(payload);\n    } else if (record.type === BLIP_EMF) {\n      const metafile = extractCompressedMetafile(payload);\n      if (metafile) {\n        image = { kind: \"emf\", mimeType: \"image/x-emf\", bytes: metafile };\n      }\n    } else if (record.type === BLIP_WMF) {\n      const metafile = extractCompressedMetafile(payload);\n      if (metafile) {\n        image = { kind: \"wmf\", mimeType: \"image/x-wmf\", bytes: metafile };\n      }\n    }\n    if (image) {\n      images.push({ index, ...image });\n    }\n    index += 1;\n    offset = record.end;\n  }\n  return images;\n}\n\nfunction extractBitmap(\n  payload: Uint8Array,\n  mimeType: string,\n  signature: number[]\n): Omit<LegacyPowerPointImage, \"index\"> | undefined {\n  const start = findBytes(payload, signature);\n  if (start < 0) {\n    return undefined;\n  }\n  let end = payload.byteLength;\n  if (mimeType === \"image/jpeg\") {\n    const marker = findBytes(payload, [0xff, 0xd9], start + signature.length);\n    if (marker >= 0) {\n      end = marker + 2;\n    }\n  } else if (mimeType === \"image/png\") {\n    const marker = findBytes(payload, [0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82], start + signature.length);\n    if (marker >= 0) {\n      end = marker + 8;\n    }\n  }\n  return { kind: \"bitmap\", mimeType, bytes: payload.slice(start, end) };\n}\n\nfunction extractTiff(payload: Uint8Array): Omit<LegacyPowerPointImage, \"index\"> | undefined {\n  const littleEndian = findBytes(payload, [0x49, 0x49, 0x2a, 0x00]);\n  const bigEndian = findBytes(payload, [0x4d, 0x4d, 0x00, 0x2a]);\n  const start = littleEndian >= 0 && bigEndian >= 0 ? Math.min(littleEndian, bigEndian) : Math.max(littleEndian, bigEndian);\n  return start < 0 ? undefined : { kind: \"bitmap\", mimeType: \"image/tiff\", bytes: payload.slice(start) };\n}\n\nfunction extractCompressedMetafile(payload: Uint8Array): Uint8Array | undefined {\n  for (const uidBytes of [16, 32]) {\n    const headerOffset = uidBytes;\n    const dataOffset = headerOffset + 34;\n    if (dataOffset > payload.byteLength) {\n      continue;\n    }\n    const view = new DataView(payload.buffer, payload.byteOffset + headerOffset, payload.byteLength - headerOffset);\n    const uncompressedSize = view.getUint32(0, true);\n    const savedSize = view.getUint32(28, true);\n    const compression = view.getUint8(32);\n    if (uncompressedSize === 0 || uncompressedSize > 128 * 1024 * 1024 || savedSize === 0 || dataOffset + savedSize > payload.byteLength) {\n      continue;\n    }\n    const data = payload.subarray(dataOffset, dataOffset + savedSize);\n    try {\n      if (compression === 0x00) {\n        const result = inflate(data);\n        if (result.byteLength === uncompressedSize) {\n          return result;\n        }\n      } else if (compression === 0xfe && data.byteLength === uncompressedSize) {\n        return data.slice();\n      }\n    } catch {\n      // Some records include a second UID. Try the next supported header offset.\n    }\n  }\n  return undefined;\n}\n\nfunction walkRecords(\n  bytes: Uint8Array,\n  start: number,\n  end: number,\n  visitor: (record: BinaryRecord) => boolean\n): void {\n  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n  let offset = start;\n  while (offset + 8 <= end) {\n    const record = readRecord(view, offset, end);\n    if (!record) {\n      return;\n    }\n    if (visitor(record) && record.payloadStart < record.end) {\n      walkRecords(bytes, record.payloadStart, record.end, visitor);\n    }\n    if (record.end <= offset) {\n      return;\n    }\n    offset = record.end;\n  }\n}\n\nfunction readRecord(view: DataView, offset: number, end: number): BinaryRecord | undefined {\n  if (offset < 0 || offset + 8 > end || offset + 8 > view.byteLength) {\n    return undefined;\n  }\n  const versionAndInstance = view.getUint16(offset, true);\n  const length = view.getUint32(offset + 4, true);\n  const payloadStart = offset + 8;\n  const recordEnd = payloadStart + length;\n  if (recordEnd > end || recordEnd > view.byteLength || recordEnd < payloadStart) {\n    return undefined;\n  }\n  return {\n    start: offset,\n    payloadStart,\n    end: recordEnd,\n    version: versionAndInstance & 0x0f,\n    instance: versionAndInstance >>> 4,\n    type: view.getUint16(offset + 2, true)\n  };\n}\n\nfunction decodePresentationText(bytes: Uint8Array, utf16: boolean): string {\n  const decoder = new TextDecoder(utf16 ? \"utf-16le\" : \"windows-1252\");\n  return decoder\n    .decode(bytes)\n    .replace(/\\u0000/g, \"\")\n    .replace(/\\r\\n?/g, \"\\n\")\n    .replace(/[\\t ]+\\n/g, \"\\n\")\n    .trim();\n}\n\nfunction deduplicateShapes(shapes: LegacyPowerPointShape[]): LegacyPowerPointShape[] {\n  const seen = new Set<string>();\n  return shapes.filter((shape) => {\n    const key = `${shape.left}:${shape.top}:${shape.width}:${shape.height}:${shape.textType ?? \"\"}:${shape.shapeType ?? \"\"}:${shape.fillColor ?? \"\"}:${shape.lineColor ?? \"\"}:${shape.fillEnabled ?? \"\"}:${shape.lineEnabled ?? \"\"}:${shape.lineWidth ?? \"\"}:${shape.rotation ?? \"\"}:${shape.imageIndices.join(\",\")}:${shape.texts.join(\"\\u0001\")}`;\n    if (seen.has(key)) {\n      return false;\n    }\n    seen.add(key);\n    return true;\n  });\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n  return [...new Set(values.filter(Boolean))];\n}\n\nfunction findBytes(haystack: Uint8Array, needle: number[], from = 0): number {\n  outer: for (let index = Math.max(0, from); index <= haystack.byteLength - needle.length; index += 1) {\n    for (let part = 0; part < needle.length; part += 1) {\n      if (haystack[index + part] !== needle[part]) {\n        continue outer;\n      }\n    }\n    return index;\n  }\n  return -1;\n}\n\nfunction asUint8Array(value: unknown): Uint8Array {\n  if (value instanceof Uint8Array) {\n    return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n  }\n  if (value instanceof ArrayBuffer) {\n    return new Uint8Array(value);\n  }\n  if (ArrayBuffer.isView(value)) {\n    return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n  }\n  if (Array.isArray(value)) {\n    return Uint8Array.from(value);\n  }\n  throw new Error(\"Unsupported OLE stream payload.\");\n}\n\nfunction hasCompoundFileSignature(bytes: Uint8Array): boolean {\n  const signature = [0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1];\n  return signature.every((byte, index) => bytes[index] === byte);\n}\n","import JSZip from \"jszip\";\nimport { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewFile, PreviewPlugin } from \"../types\";\nimport { createPanel, goToRenderedPage, readArrayBuffer } from \"./utils\";\nimport { createEncryptedFallback, isEncryptedError } from \"./encrypted\";\n\nexport function ofdPlugin(): PreviewPlugin {\n  return {\n    name: \"ofd\",\n    match(file) {\n      return file.extension === \"ofd\" || file.mimeType === \"application/ofd\";\n    },\n    async render(ctx) {\n      const panel = createPanel(\"ofv-ofd\");\n      const url = createObjectUrl(ctx.file);\n      const isExternal = Boolean(ctx.file.url);\n      ctx.viewport.append(panel);\n      let zip: JSZip;\n      try {\n        zip = await JSZip.loadAsync(await readArrayBuffer(ctx.file));\n      } catch (error) {\n        panel.append(createOfdFailure(ctx.file, url, error));\n        return {\n          destroy() {\n            panel.remove();\n            revokeObjectUrl(url, isExternal);\n          }\n        };\n      }\n\n      const entries = Object.values(zip.files).filter((entry) => !entry.dir);\n      const textFragments: string[] = [];\n\n      try {\n        for (const entry of entries.filter((item) => item.name.endsWith(\".xml\")).slice(0, 40)) {\n          const xml = await entry.async(\"text\");\n          const matches = [...xml.matchAll(/>([^<>]{2,})</g)]\n            .map((match) => match[1]?.trim())\n            .filter(Boolean) as string[];\n          textFragments.push(...matches);\n        }\n      } catch (error) {\n        panel.append(createOfdFailure(ctx.file, url, error));\n        return {\n          destroy() {\n            panel.remove();\n            revokeObjectUrl(url, isExternal);\n          }\n        };\n      }\n\n      const context = await readOfdContext(entries);\n      const pages = await readOfdPages(entries, context);\n      let zoom = 1;\n      let rotation = 0;\n      // Pages wider than the panel are fitted down in JS; the user zoom then\n      // multiplies on top of that fit. The old CSS min(100%) cap cannot work\n      // here: against the pages grid's max-content width the percentage is\n      // cyclic, so zooming past the container width used to be a no-op.\n      const OFD_MM_TO_PX = 96 / 25.4;\n      const computeFitScale = () => {\n        if (pages.length === 0) {\n          return 1;\n        }\n        const normalizedRotation = ((rotation % 360) + 360) % 360;\n        const sideways = normalizedRotation === 90 || normalizedRotation === 270;\n        const widestMm = Math.max(...pages.map((page) => (sideways ? page.height : page.width)));\n        const available = panel.clientWidth - 32;\n        const widestPx = widestMm * OFD_MM_TO_PX;\n        if (!(widestPx > 0) || !(available > 0)) {\n          return 1;\n        }\n        return Math.min(1, available / widestPx);\n      };\n      const applyZoom = () => {\n        panel.style.setProperty(\"--ofv-ofd-zoom\", formatOfdCssNumber(computeFitScale() * zoom));\n        ctx.toolbar?.setZoom(zoom);\n      };\n      const applyRotation = () => {\n        const normalizedRotation = ((rotation % 360) + 360) % 360;\n        panel.style.setProperty(\"--ofv-ofd-rotation\", `${normalizedRotation}deg`);\n        panel.classList.toggle(\"is-ofd-rotated-sideways\", normalizedRotation === 90 || normalizedRotation === 270);\n        applyZoom();\n      };\n      let resizeObserver: ResizeObserver | undefined;\n\n      if (pages.length > 0) {\n        const pagesWrap = document.createElement(\"div\");\n        pagesWrap.className = \"ofv-ofd-pages\";\n        for (const page of pages) {\n          pagesWrap.append(renderOfdPage(page));\n        }\n        panel.append(pagesWrap);\n        applyZoom();\n        applyRotation();\n        if (typeof ResizeObserver !== \"undefined\") {\n          resizeObserver = new ResizeObserver(() => applyZoom());\n          resizeObserver.observe(panel);\n        }\n      }\n      if (pages.length === 0) {\n        const content = document.createElement(\"pre\");\n        content.className = \"ofv-text-block\";\n        content.textContent = textFragments.slice(0, 300).join(\"\\n\") || \"未提取到可读文本。\";\n        panel.append(content);\n      }\n\n      return {\n        goToPage(page) {\n          return goToRenderedPage(panel, \".ofv-ofd-page\", page, panel);\n        },\n        canCommand(command) {\n          return (\n            pages.length > 0 &&\n            (command === \"zoom-in\" ||\n              command === \"zoom-out\" ||\n              command === \"zoom-reset\" ||\n              command === \"rotate-right\" ||\n              command === \"rotate-left\")\n          );\n        },\n        command(command) {\n          if (pages.length === 0) {\n            return false;\n          }\n          if (command === \"zoom-in\") {\n            zoom = Math.min(4, zoom + 0.15);\n            applyZoom();\n            return true;\n          }\n          if (command === \"zoom-out\") {\n            zoom = Math.max(0.25, zoom - 0.15);\n            applyZoom();\n            return true;\n          }\n          if (command === \"zoom-reset\") {\n            zoom = 1;\n            rotation = 0;\n            applyZoom();\n            applyRotation();\n            return true;\n          }\n          if (command === \"rotate-right\") {\n            rotation += 90;\n            applyRotation();\n            return true;\n          }\n          if (command === \"rotate-left\") {\n            rotation -= 90;\n            applyRotation();\n            return true;\n          }\n          return false;\n        },\n        destroy() {\n          resizeObserver?.disconnect();\n          ctx.toolbar?.setZoom(undefined);\n          panel.remove();\n          revokeObjectUrl(url, isExternal);\n        }\n      };\n    }\n  };\n}\n\ntype OfdTextObject = {\n  text: string;\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n  size: number;\n  color: string;\n  weight: string;\n  fontFamily: string;\n  letterSpacing?: number;\n  deltaX?: number[];\n  vertical?: boolean;\n  transform?: string;\n  // CTM 文本的 x/y 是 Boundary 内相对坐标，页面尺寸估算需用 Boundary 原点\n  boundsX?: number;\n  boundsY?: number;\n};\n\ntype OfdPathObject = {\n  d: string;\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n  stroke: string;\n  fill: string;\n  fillRule?: \"evenodd\";\n  strokeWidth: number;\n  transform: string;\n};\n\ntype OfdDrawParam = {\n  lineWidth?: number;\n  strokeColor?: string;\n  fillColor?: string;\n};\n\ntype OfdPageResources = {\n  images: Map<string, string>;\n  fonts: Map<string, string>;\n  drawParams: Map<string, OfdDrawParam>;\n};\n\ntype OfdLineObject = {\n  x1: number;\n  y1: number;\n  x2: number;\n  y2: number;\n  stroke: string;\n  strokeWidth: number;\n};\n\ntype OfdImageObject = {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n  resourceId: string;\n  href?: string;\n  transform?: string;\n};\n\ntype OfdPagePreview = {\n  name: string;\n  width: number;\n  height: number;\n  objects: OfdPageObject[];\n  texts: OfdTextObject[];\n  paths: OfdPathObject[];\n  lines: OfdLineObject[];\n  images: OfdImageObject[];\n  stamps: OfdImageObject[];\n};\n\ntype OfdPageObject =\n  | { type: \"text\"; item: OfdTextObject }\n  | { type: \"path\"; item: OfdPathObject }\n  | { type: \"line\"; item: OfdLineObject }\n  | { type: \"image\"; item: OfdImageObject };\n\ntype OfdContext = {\n  images: Map<string, string>;\n  templates: Map<string, string>;\n  fonts: Map<string, string>;\n  drawParams: Map<string, OfdDrawParam>;\n  pageOrder: string[];\n  pageSize?: { width: number; height: number };\n  stampsByPage: Map<string, OfdImageObject[]>;\n};\n\nasync function readOfdPages(\n  entries: JSZip.JSZipObject[],\n  context: OfdContext\n): Promise<OfdPagePreview[]> {\n  const pages: OfdPagePreview[] = [];\n  const discoveredPageEntries = entries.filter(\n    (entry) => /(^|\\/)Pages\\/Page_[^/]+\\/Content\\.xml$/i.test(entry.name) || /(^|\\/)Page_[^/]+\\/Content\\.xml$/i.test(entry.name)\n  );\n  const documentPageEntries = context.pageOrder\n    .map((path) => findOfdEntry(discoveredPageEntries, path))\n    .filter((entry): entry is JSZip.JSZipObject => Boolean(entry));\n  const pageEntries = (documentPageEntries.length > 0 ? documentPageEntries : discoveredPageEntries).slice(0, 80);\n  for (const entry of pageEntries) {\n    const xml = await entry.async(\"text\");\n    const templates = await readPageTemplates(xml, context, entries);\n    const stamps = context.stampsByPage.get(normalizeOfdPath(entry.name)) || [];\n    const resources: OfdPageResources = {\n      images: context.images,\n      fonts: context.fonts,\n      drawParams: context.drawParams\n    };\n    const page = parseOfdPage(entry.name, xml, resources, templates, context.pageSize, stamps);\n    pages.push(page);\n  }\n  return pages;\n}\n\nasync function readPageTemplates(xml: string, context: OfdContext, entries: JSZip.JSZipObject[]): Promise<string[]> {\n  const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n  if (doc.querySelector(\"parsererror\")) {\n    return [];\n  }\n  const templateIds = Array.from(doc.getElementsByTagName(\"*\"))\n    .filter((element) => element.localName === \"Template\")\n    .map((element) => getOfdAttribute(element, \"TemplateID\") || getOfdAttribute(element, \"ID\"))\n    .filter((id): id is string => Boolean(id));\n  const templates: string[] = [];\n  for (const id of templateIds) {\n    const path = context.templates.get(id);\n    const entry = path ? findOfdEntry(entries, path) : undefined;\n    if (entry) {\n      templates.push(await entry.async(\"text\"));\n    }\n  }\n  return templates;\n}\n\nfunction parseOfdPage(\n  name: string,\n  xml: string,\n  resources: OfdPageResources,\n  templateXmls: string[] = [],\n  defaultPageSize?: { width: number; height: number },\n  stamps: OfdImageObject[] = []\n): OfdPagePreview {\n  const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n  if (doc.querySelector(\"parsererror\")) {\n    return { name, width: 210, height: 297, objects: [], texts: [], paths: [], lines: [], images: [], stamps };\n  }\n  const pageSize = parseOfdPageSize(doc, defaultPageSize);\n  const templatePages = templateXmls.map((templateXml) => {\n    const templateDoc = new DOMParser().parseFromString(templateXml, \"application/xml\");\n    return templateDoc.querySelector(\"parsererror\") ? emptyOfdPageContent() : parseOfdPageContent(templateDoc, resources);\n  });\n  const pageContent = parseOfdPageContent(doc, resources);\n  const texts = [...templatePages.flatMap((page) => page.texts), ...pageContent.texts];\n  const paths = [...templatePages.flatMap((page) => page.paths), ...pageContent.paths];\n  const lines = [...templatePages.flatMap((page) => page.lines), ...pageContent.lines];\n  const imageObjects = [...templatePages.flatMap((page) => page.images), ...pageContent.images];\n  const objects = [...templatePages.flatMap((page) => page.objects), ...pageContent.objects];\n  if (pageSize.explicit) {\n    return { name, width: pageSize.width, height: pageSize.height, objects, texts, paths, lines, images: imageObjects, stamps };\n  }\n  const bounds = createOfdBounds(texts, paths, lines, [...imageObjects, ...stamps]);\n  const width = Math.max(pageSize.width, ...bounds.map((item) => item.x + item.width + 12));\n  const height = Math.max(pageSize.height, ...bounds.map((item) => item.y + item.height + 12));\n  return { name, width, height, objects, texts, paths, lines, images: imageObjects, stamps };\n}\n\nfunction parseOfdPageContent(\n  doc: Document,\n  resources: OfdPageResources\n): Omit<OfdPagePreview, \"name\" | \"width\" | \"height\" | \"stamps\"> {\n  const objects: OfdPageObject[] = [];\n  for (const element of Array.from(doc.getElementsByTagName(\"*\"))) {\n    if (element.localName === \"TextObject\") {\n      objects.push(...parseOfdTextObject(element, resources).map((item): OfdPageObject => ({ type: \"text\", item })));\n      continue;\n    }\n    if (element.localName === \"PathObject\") {\n      objects.push(...parseOfdPathObject(element, resources).map((item): OfdPageObject => ({ type: \"path\", item })));\n      continue;\n    }\n    if (element.localName === \"LineObject\") {\n      objects.push(...parseOfdLineObject(element, resources).map((item): OfdPageObject => ({ type: \"line\", item })));\n      continue;\n    }\n    if (element.localName === \"ImageObject\") {\n      objects.push(...parseOfdImageObject(element, resources.images).map((item): OfdPageObject => ({ type: \"image\", item })));\n    }\n  }\n  return {\n    objects,\n    texts: objects.filter((object): object is { type: \"text\"; item: OfdTextObject } => object.type === \"text\").map((object) => object.item),\n    paths: objects.filter((object): object is { type: \"path\"; item: OfdPathObject } => object.type === \"path\").map((object) => object.item),\n    lines: objects.filter((object): object is { type: \"line\"; item: OfdLineObject } => object.type === \"line\").map((object) => object.item),\n    images: objects.filter((object): object is { type: \"image\"; item: OfdImageObject } => object.type === \"image\").map((object) => object.item)\n  };\n}\n\nfunction emptyOfdPageContent(): Omit<OfdPagePreview, \"name\" | \"width\" | \"height\" | \"stamps\"> {\n  return { objects: [], texts: [], paths: [], lines: [], images: [] };\n}\n\nfunction createOfdBounds(\n  texts: OfdTextObject[],\n  paths: OfdPathObject[],\n  lines: OfdLineObject[],\n  imageObjects: OfdImageObject[]\n): Array<{ x: number; y: number; width: number; height: number }> {\n  return [\n    ...texts.map((item) => ({ x: item.boundsX ?? item.x, y: item.boundsY ?? item.y, width: item.width, height: item.height })),\n    ...paths.map((item) => ({ x: item.x, y: item.y, width: item.width, height: item.height })),\n    ...lines.map((item) => ({\n      x: Math.min(item.x1, item.x2),\n      y: Math.min(item.y1, item.y2),\n      width: Math.abs(item.x2 - item.x1),\n      height: Math.abs(item.y2 - item.y1)\n    })),\n    ...imageObjects.map((item) => ({ x: item.x, y: item.y, width: item.width, height: item.height }))\n  ];\n}\n\nfunction parseOfdTextObject(element: Element, resources: OfdPageResources): OfdTextObject[] {\n  const boundary = parseBoundary(getOfdAttribute(element, \"Boundary\"));\n  const drawParam = resolveOfdDrawParam(element, resources.drawParams);\n  const size = finiteNumber(getOfdAttribute(element, \"Size\"), Math.max(4, boundary.height || 5));\n  const color =\n    parseOfdColorElement(findOfdChild(element, \"FillColor\")) ||\n    parseOfdColorElement(findOfdChild(element, \"StrokeColor\")) ||\n    drawParam?.fillColor ||\n    \"#111827\";\n  const weight = finiteNumber(getOfdAttribute(element, \"Weight\"), 400) >= 600 ? \"700\" : \"400\";\n  const fontFamily = fontStackForOfdFont(resources.fonts.get(getOfdAttribute(element, \"Font\") || \"\"));\n  const objectLetterSpacing = getOfdAttribute(element, \"DeltaX\") ? 0.5 : undefined;\n  const ctm = parseOfdCtm(getOfdAttribute(element, \"CTM\"));\n  const transform = ctm ? createOfdPathTransform(boundary.x, boundary.y, ctm) : undefined;\n  const textCodes = Array.from(element.getElementsByTagName(\"*\")).filter((child) => child.localName === \"TextCode\");\n  if (textCodes.length === 0) {\n    return [];\n  }\n  return textCodes.flatMap((code): OfdTextObject[] => {\n    // CTM 存在时坐标保持相对 Boundary，由 transform 完成平移与矩阵变换\n    const x = (transform ? 0 : boundary.x) + finiteNumber(getOfdAttribute(code, \"X\"), 0);\n    const y = (transform ? 0 : boundary.y) + finiteNumber(getOfdAttribute(code, \"Y\"), 0);\n    // TextCode whitespace is layout data. In particular, leading spaces can\n    // carry explicit DeltaX positions before a trailing date or number.\n    const text = decodeOfdTextEscapes(code.textContent || \"\");\n    const deltaX = parseOfdDeltaX(getOfdAttribute(code, \"DeltaX\"));\n    const deltaY = getOfdAttribute(code, \"DeltaY\");\n    if (deltaY && text.length > 1) {\n      const step = parseOfdDeltaStep(deltaY, size);\n      return Array.from(text).map((char, index) => ({\n        text: char,\n        x,\n        y: y + index * step,\n        width: boundary.width,\n        height: boundary.height,\n        size,\n        color,\n        weight,\n        fontFamily,\n        letterSpacing: objectLetterSpacing,\n        vertical: true,\n        transform,\n        boundsX: transform ? boundary.x : undefined,\n        boundsY: transform ? boundary.y : undefined\n      }));\n    }\n    return [\n      {\n        text,\n        x,\n        y,\n        width: boundary.width,\n        height: boundary.height,\n        size,\n        color,\n        weight,\n        fontFamily,\n        letterSpacing: deltaX ? undefined : objectLetterSpacing,\n        deltaX,\n        transform,\n        boundsX: transform ? boundary.x : undefined,\n        boundsY: transform ? boundary.y : undefined\n      }\n    ];\n  }).filter((item) => item.text);\n}\n\n// OFD 规范：LineWidth 缺省 0.353mm；Stroke 缺省 true；Fill 缺省 false——\n// 发票类文件常给描边网格线附带 FillColor，若据其存在就填充会把表格涂成大色块\nconst OFD_DEFAULT_LINE_WIDTH = 0.353;\n\nfunction parseOfdPathObject(element: Element, resources: OfdPageResources): OfdPathObject[] {\n  const boundary = parseBoundary(getOfdAttribute(element, \"Boundary\"));\n  const ctm = parseOfdCtm(getOfdAttribute(element, \"CTM\"));\n  const drawParam = resolveOfdDrawParam(element, resources.drawParams);\n  const commands = getDirectOfdChildren(element, \"AbbreviatedData\", \"PathData\");\n  const raw = commands.map((child) => child.textContent || \"\").join(\" \").trim();\n  if (!raw) {\n    return [];\n  }\n  const stroke =\n    parseOfdBoolean(getOfdAttribute(element, \"Stroke\")) === false\n      ? \"none\"\n      : parseOfdColorElement(findOfdChild(element, \"StrokeColor\")) || drawParam?.strokeColor || \"#111827\";\n  // FillColor 存在但无法解析（如调色板 Index 引用）时宁可不填充，避免误涂深色块\n  const fillColorChild = findOfdChild(element, \"FillColor\");\n  const fill =\n    parseOfdBoolean(getOfdAttribute(element, \"Fill\")) === true\n      ? fillColorChild\n        ? parseOfdColorElement(fillColorChild) || \"transparent\"\n        : drawParam?.fillColor || \"#111827\"\n      : \"transparent\";\n  return [\n    {\n      d: normalizeOfdPathData(raw),\n      x: boundary.x,\n      y: boundary.y,\n      width: boundary.width,\n      height: boundary.height,\n      stroke,\n      fill,\n      fillRule: /even/i.test(getOfdAttribute(element, \"Rule\") || \"\") ? \"evenodd\" : undefined,\n      strokeWidth: finiteNumber(getOfdAttribute(element, \"LineWidth\"), drawParam?.lineWidth ?? OFD_DEFAULT_LINE_WIDTH),\n      transform: createOfdPathTransform(boundary.x, boundary.y, ctm)\n    }\n  ];\n}\n\nfunction parseOfdLineObject(element: Element, resources: OfdPageResources): OfdLineObject[] {\n  const boundary = parseBoundary(getOfdAttribute(element, \"Boundary\"));\n  const drawParam = resolveOfdDrawParam(element, resources.drawParams);\n  const start = parsePoint(getOfdAttribute(element, \"StartPoint\"), { x: 0, y: 0 });\n  const end = parsePoint(getOfdAttribute(element, \"EndPoint\"), {\n    x: boundary.width,\n    y: boundary.height\n  });\n  return [\n    {\n      x1: boundary.x + start.x,\n      y1: boundary.y + start.y,\n      x2: boundary.x + end.x,\n      y2: boundary.y + end.y,\n      stroke:\n        parseOfdColorElement(findOfdChild(element, \"StrokeColor\")) ||\n        parseOfdColorElement(findOfdChild(element, \"FillColor\")) ||\n        drawParam?.strokeColor ||\n        \"#111827\",\n      strokeWidth: finiteNumber(getOfdAttribute(element, \"LineWidth\"), drawParam?.lineWidth ?? OFD_DEFAULT_LINE_WIDTH)\n    }\n  ];\n}\n\nfunction parseOfdImageObject(element: Element, images: Map<string, string>): OfdImageObject[] {\n  const boundary = parseBoundary(getOfdAttribute(element, \"Boundary\"));\n  const ctm = parseOfdCtm(getOfdAttribute(element, \"CTM\"));\n  const simpleCtmBounds = ctm ? createSimpleOfdImageCtmBounds(boundary, ctm) : undefined;\n  const resourceId = getOfdAttribute(element, \"ResourceID\") || getOfdAttribute(element, \"ResourceId\") || \"\";\n  return [\n    {\n      x: simpleCtmBounds?.x ?? (ctm ? 0 : boundary.x),\n      y: simpleCtmBounds?.y ?? (ctm ? 0 : boundary.y),\n      width: simpleCtmBounds?.width ?? (ctm ? 1 : boundary.width || 32),\n      height: simpleCtmBounds?.height ?? (ctm ? 1 : boundary.height || 32),\n      resourceId,\n      href: images.get(resourceId),\n      transform: ctm && !simpleCtmBounds ? createOfdPathTransform(boundary.x, boundary.y, ctm) : undefined\n    }\n  ];\n}\n\nfunction createSimpleOfdImageCtmBounds(\n  boundary: { x: number; y: number; width: number; height: number },\n  ctm: [number, number, number, number, number, number]\n): { x: number; y: number; width: number; height: number } | undefined {\n  const [a, b, c, d, e, f] = ctm;\n  if (Math.abs(b) > 1e-6 || Math.abs(c) > 1e-6 || a <= 0 || d <= 0) {\n    return undefined;\n  }\n  return {\n    x: boundary.x + e,\n    y: boundary.y + f,\n    width: a,\n    height: d\n  };\n}\n\nfunction renderOfdPage(page: OfdPagePreview): HTMLElement {\n  const figure = document.createElement(\"figure\");\n  figure.className = \"ofv-ofd-page\";\n  figure.style.setProperty(\"--ofv-ofd-page-width\", `${formatOfdCssNumber(page.width)}mm`);\n  figure.style.setProperty(\"--ofv-ofd-page-height\", `${formatOfdCssNumber(page.height)}mm`);\n  const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n  svg.setAttribute(\"viewBox\", `0 0 ${page.width} ${page.height}`);\n  svg.setAttribute(\"role\", \"img\");\n  svg.setAttribute(\"aria-label\", page.name);\n\n  const paper = document.createElementNS(svg.namespaceURI, \"rect\");\n  paper.setAttribute(\"x\", \"0\");\n  paper.setAttribute(\"y\", \"0\");\n  paper.setAttribute(\"width\", String(page.width));\n  paper.setAttribute(\"height\", String(page.height));\n  paper.setAttribute(\"fill\", \"white\");\n  svg.append(paper);\n\n  for (const object of page.objects) {\n    if (object.type === \"path\") {\n      appendOfdPath(svg, object.item);\n      continue;\n    }\n    if (object.type === \"line\") {\n      appendOfdLine(svg, object.item);\n      continue;\n    }\n    if (object.type === \"text\") {\n      appendOfdText(svg, object.item);\n      continue;\n    }\n    appendOfdImage(svg, object.item);\n  }\n\n  for (const item of page.stamps) {\n    appendOfdImage(svg, item);\n  }\n\n  figure.append(svg);\n  return figure;\n}\n\nfunction appendOfdPath(svg: SVGElement, item: OfdPathObject): void {\n  const path = document.createElementNS(svg.namespaceURI, \"path\");\n  path.setAttribute(\"d\", item.d);\n  path.setAttribute(\"transform\", item.transform);\n  path.setAttribute(\"fill\", item.fill);\n  if (item.fillRule) {\n    path.setAttribute(\"fill-rule\", item.fillRule);\n  }\n  path.setAttribute(\"stroke\", item.stroke);\n  path.setAttribute(\"stroke-width\", String(item.strokeWidth));\n  svg.append(path);\n}\n\nfunction appendOfdLine(svg: SVGElement, item: OfdLineObject): void {\n  const line = document.createElementNS(svg.namespaceURI, \"line\");\n  line.setAttribute(\"x1\", String(item.x1));\n  line.setAttribute(\"y1\", String(item.y1));\n  line.setAttribute(\"x2\", String(item.x2));\n  line.setAttribute(\"y2\", String(item.y2));\n  line.setAttribute(\"stroke\", item.stroke);\n  line.setAttribute(\"stroke-width\", String(item.strokeWidth));\n  line.setAttribute(\"stroke-linecap\", \"round\");\n  svg.append(line);\n}\n\nfunction appendOfdText(svg: SVGElement, item: OfdTextObject): void {\n  const text = document.createElementNS(svg.namespaceURI, \"text\");\n  text.setAttribute(\"x\", String(item.x));\n  text.setAttribute(\"y\", String(item.y));\n  if (item.transform) {\n    text.setAttribute(\"transform\", item.transform);\n  }\n  text.setAttribute(\"font-size\", String(item.size));\n  text.setAttribute(\"fill\", item.color);\n  text.setAttribute(\"font-weight\", item.weight);\n  text.setAttribute(\"font-family\", item.fontFamily);\n  if (item.letterSpacing !== undefined) {\n    text.setAttribute(\"letter-spacing\", String(item.letterSpacing));\n  }\n  if (item.deltaX && item.deltaX.length > 0) {\n    const chars = Array.from(item.text);\n    let x = item.x;\n    for (let index = 0; index < chars.length; index += 1) {\n      const span = document.createElementNS(svg.namespaceURI, \"tspan\");\n      span.setAttribute(\"x\", String(x));\n      span.setAttribute(\"y\", String(item.y));\n      if (index < chars.length - 1) {\n        x += item.deltaX[Math.min(index, item.deltaX.length - 1)] || item.size;\n      }\n      span.textContent = chars[index];\n      text.append(span);\n    }\n  } else {\n    text.textContent = item.text;\n  }\n  svg.append(text);\n}\n\nfunction appendOfdImage(svg: SVGElement, item: OfdImageObject): void {\n  if (item.href) {\n    const image = document.createElementNS(svg.namespaceURI, \"image\");\n    image.setAttribute(\"x\", String(item.x));\n    image.setAttribute(\"y\", String(item.y));\n    image.setAttribute(\"width\", String(item.width));\n    image.setAttribute(\"height\", String(item.height));\n    image.setAttribute(\"href\", item.href);\n    if (item.transform) {\n      image.setAttribute(\"transform\", item.transform);\n    }\n    image.setAttribute(\"preserveAspectRatio\", \"xMidYMid meet\");\n    svg.append(image);\n  } else {\n    const placeholder = document.createElementNS(svg.namespaceURI, \"rect\");\n    placeholder.setAttribute(\"x\", String(item.x));\n    placeholder.setAttribute(\"y\", String(item.y));\n    placeholder.setAttribute(\"width\", String(item.width));\n    placeholder.setAttribute(\"height\", String(item.height));\n    if (item.transform) {\n      placeholder.setAttribute(\"transform\", item.transform);\n    }\n    placeholder.setAttribute(\"fill\", \"#f8fafc\");\n    placeholder.setAttribute(\"stroke\", \"#94a3b8\");\n    placeholder.setAttribute(\"stroke-dasharray\", \"4 3\");\n    svg.append(placeholder);\n  }\n}\n\nasync function readOfdContext(entries: JSZip.JSZipObject[]): Promise<OfdContext> {\n  const images = await readOfdImages(entries);\n  const fonts = await readOfdFonts(entries);\n  const drawParams = await readOfdDrawParams(entries);\n  const { templates, pageOrder, pageSize, pagePaths } = await readOfdDocumentInfo(entries);\n  const stampsByPage = await readOfdStamps(entries, pagePaths);\n  return { images, templates, fonts, drawParams, pageOrder, pageSize, stampsByPage };\n}\n\nasync function readOfdDrawParams(entries: JSZip.JSZipObject[]): Promise<Map<string, OfdDrawParam>> {\n  const raw = new Map<string, { relative?: string; own: OfdDrawParam }>();\n  for (const entry of entries.filter((item) => /(?:^|\\/)(?:DocumentRes|PublicRes)\\.xml$/i.test(item.name))) {\n    const doc = new DOMParser().parseFromString(await entry.async(\"text\"), \"application/xml\");\n    if (doc.querySelector(\"parsererror\")) {\n      continue;\n    }\n    for (const param of Array.from(doc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"DrawParam\")) {\n      const id = getOfdAttribute(param, \"ID\");\n      if (!id) {\n        continue;\n      }\n      const lineWidthAttr = getOfdAttribute(param, \"LineWidth\");\n      const lineWidth = lineWidthAttr === null ? Number.NaN : Number(lineWidthAttr);\n      raw.set(id, {\n        relative: getOfdAttribute(param, \"Relative\") || undefined,\n        own: {\n          lineWidth: Number.isFinite(lineWidth) ? lineWidth : undefined,\n          strokeColor: parseOfdColorElement(findOfdChild(param, \"StrokeColor\")),\n          fillColor: parseOfdColorElement(findOfdChild(param, \"FillColor\"))\n        }\n      });\n    }\n  }\n  const resolved = new Map<string, OfdDrawParam>();\n  const resolve = (id: string, seen: Set<string>): OfdDrawParam => {\n    const cached = resolved.get(id);\n    if (cached) {\n      return cached;\n    }\n    const item = raw.get(id);\n    if (!item || seen.has(id)) {\n      return {};\n    }\n    seen.add(id);\n    const base = item.relative ? resolve(item.relative, seen) : {};\n    const merged: OfdDrawParam = {\n      lineWidth: item.own.lineWidth ?? base.lineWidth,\n      strokeColor: item.own.strokeColor ?? base.strokeColor,\n      fillColor: item.own.fillColor ?? base.fillColor\n    };\n    resolved.set(id, merged);\n    return merged;\n  };\n  for (const id of raw.keys()) {\n    resolve(id, new Set());\n  }\n  return resolved;\n}\n\n// DrawParam 可挂在图元自身，也可挂在其所属 Layer/PageBlock 上，就近生效\nfunction resolveOfdDrawParam(element: Element, drawParams: Map<string, OfdDrawParam>): OfdDrawParam | undefined {\n  if (drawParams.size === 0) {\n    return undefined;\n  }\n  let current: Element | null = element;\n  while (current) {\n    const id = getOfdAttribute(current, \"DrawParam\");\n    if (id) {\n      return drawParams.get(id);\n    }\n    current = current.parentElement;\n  }\n  return undefined;\n}\n\nasync function readOfdStamps(\n  entries: JSZip.JSZipObject[],\n  pagePaths: Map<string, string>\n): Promise<Map<string, OfdImageObject[]>> {\n  const stamps = new Map<string, OfdImageObject[]>();\n  for (const entry of entries.filter((item) => /(?:^|\\/)Signatures\\.xml$/i.test(item.name))) {\n    const doc = new DOMParser().parseFromString(await entry.async(\"text\"), \"application/xml\");\n    if (doc.querySelector(\"parsererror\")) {\n      continue;\n    }\n    const signaturesDir = directoryName(entry.name);\n    for (const signature of Array.from(doc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"Signature\")) {\n      const baseLoc = getOfdAttribute(signature, \"BaseLoc\");\n      const signatureEntry = baseLoc\n        ? findOfdEntry(entries, joinOfdPath(signaturesDir, baseLoc)) || findOfdEntry(entries, baseLoc)\n        : undefined;\n      if (!signatureEntry) {\n        continue;\n      }\n      const signatureDoc = new DOMParser().parseFromString(await signatureEntry.async(\"text\"), \"application/xml\");\n      if (signatureDoc.querySelector(\"parsererror\")) {\n        continue;\n      }\n      const signatureElements = Array.from(signatureDoc.getElementsByTagName(\"*\"));\n      const signatureDir = directoryName(signatureEntry.name);\n      const signedValueLoc = signatureElements.find((element) => element.localName === \"SignedValue\")?.textContent?.trim() || \"SignedValue.dat\";\n      const signedValueEntry =\n        findOfdEntry(entries, joinOfdPath(signatureDir, signedValueLoc)) || findOfdEntry(entries, signedValueLoc);\n      const href = signedValueEntry ? extractOfdStampImage(await signedValueEntry.async(\"uint8array\")) : undefined;\n      // Certificate-only signatures have a placement boundary but no visual\n      // seal payload. Do not turn that boundary into a broken-image box.\n      if (!href) {\n        continue;\n      }\n      for (const annot of signatureElements.filter((element) => element.localName === \"StampAnnot\")) {\n        const boundary = parseBoundary(getOfdAttribute(annot, \"Boundary\"));\n        const pageRef = getOfdAttribute(annot, \"PageRef\");\n        const pagePath = pageRef ? pagePaths.get(pageRef) : undefined;\n        const pageEntry = pagePath ? findOfdEntry(entries, pagePath) : undefined;\n        if (!pageEntry || boundary.width <= 0 || boundary.height <= 0) {\n          continue;\n        }\n        const key = normalizeOfdPath(pageEntry.name);\n        const list = stamps.get(key) || [];\n        list.push({ x: boundary.x, y: boundary.y, width: boundary.width, height: boundary.height, resourceId: \"\", href });\n        stamps.set(key, list);\n      }\n    }\n  }\n  return stamps;\n}\n\nfunction extractOfdStampImage(bytes: Uint8Array): string | undefined {\n  const pngStart = indexOfOfdBytes(bytes, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);\n  if (pngStart >= 0) {\n    const iend = indexOfOfdBytes(bytes, [0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82], pngStart);\n    const end = iend >= 0 ? iend + 8 : bytes.length;\n    return ofdBytesToDataUrl(\"image/png\", bytes.subarray(pngStart, end));\n  }\n  const jpegStart = indexOfOfdBytes(bytes, [0xff, 0xd8, 0xff]);\n  if (jpegStart >= 0) {\n    let end = bytes.length;\n    for (let index = bytes.length - 2; index > jpegStart; index -= 1) {\n      if (bytes[index] === 0xff && bytes[index + 1] === 0xd9) {\n        end = index + 2;\n        break;\n      }\n    }\n    return ofdBytesToDataUrl(\"image/jpeg\", bytes.subarray(jpegStart, end));\n  }\n  return undefined;\n}\n\nfunction indexOfOfdBytes(bytes: Uint8Array, pattern: number[], fromIndex = 0): number {\n  outer: for (let index = fromIndex; index <= bytes.length - pattern.length; index += 1) {\n    for (let offset = 0; offset < pattern.length; offset += 1) {\n      if (bytes[index + offset] !== pattern[offset]) {\n        continue outer;\n      }\n    }\n    return index;\n  }\n  return -1;\n}\n\nfunction ofdBytesToDataUrl(mimeType: string, bytes: Uint8Array): string {\n  let binary = \"\";\n  const chunkSize = 0x8000;\n  for (let index = 0; index < bytes.length; index += chunkSize) {\n    binary += String.fromCharCode(...bytes.subarray(index, index + chunkSize));\n  }\n  return `data:${mimeType};base64,${btoa(binary)}`;\n}\n\nasync function readOfdFonts(entries: JSZip.JSZipObject[]): Promise<Map<string, string>> {\n  const fonts = new Map<string, string>();\n  for (const entry of entries.filter((item) => /(?:^|\\/)(?:DocumentRes|PublicRes)\\.xml$/i.test(item.name))) {\n    const xml = await entry.async(\"text\");\n    const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n    if (doc.querySelector(\"parsererror\")) {\n      continue;\n    }\n    for (const font of Array.from(doc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"Font\")) {\n      const id = getOfdAttribute(font, \"ID\");\n      const name = getOfdAttribute(font, \"FontName\") || getOfdAttribute(font, \"FamilyName\");\n      if (id && name) {\n        fonts.set(id, name.trim());\n      }\n    }\n  }\n  return fonts;\n}\n\nasync function readOfdImages(entries: JSZip.JSZipObject[]): Promise<Map<string, string>> {\n  const images = new Map<string, string>();\n  for (const entry of entries.filter((item) => /\\.(?:png|jpe?g|gif|bmp|webp)$/i.test(item.name)).slice(0, 80)) {\n    const id = entry.name.split(\"/\").pop()?.replace(/\\.[^.]+$/, \"\") || entry.name;\n    const mimeType = mimeTypeFromPath(entry.name);\n    if (!mimeType.startsWith(\"image/\")) {\n      continue;\n    }\n    const base64 = await entry.async(\"base64\");\n    const href = `data:${mimeType};base64,${base64}`;\n    images.set(id, href);\n    images.set(entry.name, href);\n    images.set(entry.name.split(\"/\").pop() || entry.name, href);\n  }\n  for (const entry of entries.filter((item) => /(?:^|\\/)(?:DocumentRes|PublicRes)\\.xml$/i.test(item.name))) {\n    const xml = await entry.async(\"text\");\n    const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n    if (doc.querySelector(\"parsererror\")) {\n      continue;\n    }\n    const baseLoc = getOfdAttribute(doc.documentElement, \"BaseLoc\") || \"\";\n    const resourceDir = joinOfdPath(directoryName(entry.name), baseLoc);\n    for (const media of Array.from(doc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"MultiMedia\")) {\n      const id = getOfdAttribute(media, \"ID\");\n      const mediaFile = findOfdChild(media, \"MediaFile\")?.textContent?.trim();\n      if (!id || !mediaFile) {\n        continue;\n      }\n      const imageEntry = findOfdEntry(entries, joinOfdPath(resourceDir, mediaFile)) || findOfdEntry(entries, mediaFile);\n      const href = imageEntry ? images.get(imageEntry.name) || images.get(imageEntry.name.split(\"/\").pop() || imageEntry.name) : undefined;\n      if (href) {\n        images.set(id, href);\n      }\n    }\n  }\n  return images;\n}\n\nasync function readOfdDocumentInfo(entries: JSZip.JSZipObject[]): Promise<{\n  templates: Map<string, string>;\n  pageOrder: string[];\n  pageSize?: { width: number; height: number };\n  pagePaths: Map<string, string>;\n}> {\n  const templates = new Map<string, string>();\n  const pageOrder: string[] = [];\n  const pagePaths = new Map<string, string>();\n  let pageSize: { width: number; height: number } | undefined;\n  for (const entry of entries.filter((item) => /(?:^|\\/)Document\\.xml$/i.test(item.name))) {\n    const xml = await entry.async(\"text\");\n    const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n    if (doc.querySelector(\"parsererror\")) {\n      continue;\n    }\n    const documentDir = directoryName(entry.name);\n    const physicalBox = Array.from(doc.getElementsByTagName(\"*\")).find((element) => element.localName === \"PageArea\")\n      ?.getElementsByTagName(\"*\");\n    const pageAreaBox = physicalBox\n      ? Array.from(physicalBox).find((element) => element.localName === \"PhysicalBox\")\n      : undefined;\n    if (pageAreaBox?.textContent) {\n      const box = parseBoundary(pageAreaBox.textContent);\n      if (box.width > 0 && box.height > 0) {\n        pageSize = { width: box.width, height: box.height };\n      }\n    }\n    for (const template of Array.from(doc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"TemplatePage\")) {\n      const id = getOfdAttribute(template, \"ID\");\n      const baseLoc = getOfdAttribute(template, \"BaseLoc\");\n      if (id && baseLoc) {\n        templates.set(id, joinOfdPath(documentDir, baseLoc));\n      }\n    }\n    for (const pageElement of Array.from(doc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"Page\")) {\n      const id = getOfdAttribute(pageElement, \"ID\");\n      const baseLoc = getOfdAttribute(pageElement, \"BaseLoc\");\n      if (id && baseLoc) {\n        const pagePath = joinOfdPath(documentDir, baseLoc);\n        pagePaths.set(id, pagePath);\n        pageOrder.push(pagePath);\n      }\n    }\n  }\n  return { templates, pageOrder, pageSize, pagePaths };\n}\n\nfunction parseOfdPageSize(doc: Document, defaultPageSize?: { width: number; height: number }): { width: number; height: number; explicit: boolean } {\n  const physicalBox = Array.from(doc.getElementsByTagName(\"*\")).find((element) => element.localName === \"PhysicalBox\");\n  if (physicalBox?.textContent) {\n    const box = parseBoundary(physicalBox.textContent);\n    if (box.width > 0 && box.height > 0) {\n      return { width: box.width, height: box.height, explicit: true };\n    }\n  }\n  if (defaultPageSize) {\n    return { ...defaultPageSize, explicit: true };\n  }\n  return { width: 210, height: 297, explicit: false };\n}\n\nfunction parseOfdColorElement(colorElement: Element | undefined): string | undefined {\n  const value = colorElement ? getOfdAttribute(colorElement, \"Value\") : null;\n  if (!colorElement || !value) {\n    return undefined;\n  }\n  const parts = value.trim().split(/\\s+/).map((part) => Number(part));\n  // 单通道为灰度色（GB/T 33190 允许 1 通道颜色空间）\n  const rgbParts = parts.length === 1 && Number.isFinite(parts[0]) ? [parts[0], parts[0], parts[0]] : parts;\n  if (rgbParts.length >= 3 && rgbParts.every((part) => Number.isFinite(part))) {\n    const channels = rgbParts.slice(0, 3).map((part) => Math.max(0, Math.min(255, part))).join(\" \");\n    const alpha = parseOfdAlpha(getOfdAttribute(colorElement, \"Alpha\"));\n    if (alpha <= 0) {\n      return \"transparent\";\n    }\n    return alpha >= 1 ? `rgb(${channels})` : `rgb(${channels} / ${formatOfdCssNumber(alpha)})`;\n  }\n  return undefined;\n}\n\nfunction parseOfdAlpha(value: string | null): number {\n  const parsed = value === null ? Number.NaN : Number(value);\n  if (!Number.isFinite(parsed)) {\n    return 1;\n  }\n  return Math.max(0, Math.min(255, parsed)) / 255;\n}\n\nfunction parseOfdBoolean(value: string | null): boolean | undefined {\n  const normalized = value?.trim().toLowerCase();\n  if (normalized === \"true\" || normalized === \"1\") {\n    return true;\n  }\n  if (normalized === \"false\" || normalized === \"0\") {\n    return false;\n  }\n  return undefined;\n}\n\nfunction findOfdChild(element: Element, localName: string): Element | undefined {\n  return Array.from(element.children).find((child) => child.localName === localName);\n}\n\nfunction getDirectOfdChildren(element: Element, ...localNames: string[]): Element[] {\n  const allowed = new Set(localNames);\n  return Array.from(element.children).filter((child) => allowed.has(child.localName));\n}\n\nfunction parsePoint(value: string | null, fallback: { x: number; y: number }): { x: number; y: number } {\n  const parts = (value || \"\").trim().split(/\\s+/).map((part) => Number(part));\n  return {\n    x: Number.isFinite(parts[0]) ? parts[0] : fallback.x,\n    y: Number.isFinite(parts[1]) ? parts[1] : fallback.y\n  };\n}\n\n// OFD 图形操作符与 SVG 不同：S=起始点(等价 moveto)、B=三次贝塞尔、C=闭合子路径\nconst OFD_PATH_COMMAND_MAP: Record<string, string> = {\n  S: \"M\",\n  M: \"M\",\n  L: \"L\",\n  Q: \"Q\",\n  B: \"C\",\n  A: \"A\",\n  C: \"Z\",\n  Z: \"Z\"\n};\n\nfunction normalizeOfdPathData(value: string): string {\n  return value\n    .trim()\n    .split(/\\s+/)\n    .map((token) => (/^[a-zA-Z]$/.test(token) ? OFD_PATH_COMMAND_MAP[token.toUpperCase()] || token : token))\n    .join(\" \");\n}\n\nfunction parseOfdCtm(value: string | null): [number, number, number, number, number, number] | undefined {\n  const parts = (value || \"\")\n    .trim()\n    .split(/\\s+/)\n    .map((part) => Number(part));\n  if (parts.length !== 6 || parts.some((part) => !Number.isFinite(part))) {\n    return undefined;\n  }\n  return parts as [number, number, number, number, number, number];\n}\n\nfunction createOfdPathTransform(x: number, y: number, ctm?: [number, number, number, number, number, number]): string {\n  if (!ctm) {\n    return `translate(${x} ${y})`;\n  }\n  const [a, b, c, d, e, f] = ctm;\n  return `translate(${x} ${y}) matrix(${a} ${b} ${c} ${d} ${e} ${f})`;\n}\n\nfunction decodeOfdTextEscapes(value: string): string {\n  if (!value.includes(\"\\\\\")) {\n    return value;\n  }\n  return value.replace(/\\\\(?:0[xX]([0-9a-fA-F]{4})|u([0-9a-fA-F]{4})|\\\\)/g, (match, hex: string | undefined, unicode: string | undefined) => {\n    const digits = hex || unicode;\n    if (!digits) {\n      return \"\\\\\";\n    }\n    return String.fromCodePoint(Number.parseInt(digits, 16));\n  });\n}\n\nfunction parseOfdDeltaStep(value: string, fallback: number): number {\n  const numbers = value.match(/-?\\d+(?:\\.\\d+)?/g)?.map((part) => Number(part)).filter((part) => Number.isFinite(part)) || [];\n  return numbers.length > 0 ? numbers[numbers.length - 1] : fallback;\n}\n\nfunction parseOfdDeltaX(value: string | null): number[] | undefined {\n  if (!value) {\n    return undefined;\n  }\n  const parts = value.match(/[a-z]+|-?\\d+(?:\\.\\d+)?/gi) || [];\n  const deltas: number[] = [];\n  for (let index = 0; index < parts.length; index += 1) {\n    const token = parts[index];\n    if (/^g$/i.test(token)) {\n      const count = Number(parts[index + 1]);\n      const step = Number(parts[index + 2]);\n      if (Number.isFinite(count) && Number.isFinite(step)) {\n        deltas.push(...Array.from({ length: Math.max(0, Math.floor(count)) }, () => step));\n      }\n      index += 2;\n      continue;\n    }\n    const numeric = Number(token);\n    if (Number.isFinite(numeric)) {\n      deltas.push(numeric);\n    }\n  }\n  return deltas.length > 0 ? deltas : undefined;\n}\n\nfunction fontStackForOfdFont(fontName: string | undefined): string {\n  const normalized = (fontName || \"\").trim().toLowerCase();\n  if (normalized.includes(\"times\")) {\n    return '\"Times New Roman\", Times, \"Songti SC\", STSong, serif';\n  }\n  if (normalized.includes(\"courier\")) {\n    return '\"Courier New\", Courier, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace';\n  }\n  if (normalized.includes(\"kaiti\") || normalized.includes(\"kai\") || normalized.includes(\"楷\")) {\n    return '\"STKaiti\", \"Kaiti SC\", \"KaiTi\", \"楷体\", serif';\n  }\n  if (normalized.includes(\"simsun\") || normalized.includes(\"simsong\") || normalized.includes(\"song\") || normalized.includes(\"宋\")) {\n    return '\"SimSong\", \"Songti SC\", \"STSong\", SimSun, \"宋体\", serif';\n  }\n  if (normalized.includes(\"hei\") || normalized.includes(\"黑\")) {\n    return '\"PingFang SC\", \"Microsoft YaHei\", SimHei, sans-serif';\n  }\n  return '\"SimSong\", \"Songti SC\", \"STSong\", SimSun, \"Noto Serif CJK SC\", serif';\n}\n\nfunction findOfdEntry(entries: JSZip.JSZipObject[], path: string): JSZip.JSZipObject | undefined {\n  const normalized = normalizeOfdPath(path);\n  return entries.find((entry) => normalizeOfdPath(entry.name) === normalized || normalizeOfdPath(entry.name).endsWith(`/${normalized}`));\n}\n\nfunction joinOfdPath(...parts: string[]): string {\n  const joined = parts.filter(Boolean).join(\"/\");\n  const segments: string[] = [];\n  for (const segment of joined.split(\"/\")) {\n    if (!segment || segment === \".\") {\n      continue;\n    }\n    if (segment === \"..\") {\n      segments.pop();\n      continue;\n    }\n    segments.push(segment);\n  }\n  return segments.join(\"/\");\n}\n\nfunction directoryName(path: string): string {\n  const normalized = normalizeOfdPath(path);\n  const index = normalized.lastIndexOf(\"/\");\n  return index >= 0 ? normalized.slice(0, index) : \"\";\n}\n\nfunction normalizeOfdPath(path: string): string {\n  return path.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\").replace(/\\/+/g, \"/\");\n}\n\nfunction mimeTypeFromPath(path: string): string {\n  const extension = path.split(\".\").pop()?.toLowerCase();\n  const map: Record<string, string> = {\n    png: \"image/png\",\n    jpg: \"image/jpeg\",\n    jpeg: \"image/jpeg\",\n    gif: \"image/gif\",\n    bmp: \"image/bmp\",\n    webp: \"image/webp\"\n  };\n  return extension ? map[extension] || \"application/octet-stream\" : \"application/octet-stream\";\n}\n\nfunction parseBoundary(value: string | null): { x: number; y: number; width: number; height: number } {\n  const parts = (value || \"\").trim().split(/\\s+/).map((part) => Number(part));\n  return {\n    x: Number.isFinite(parts[0]) ? parts[0] : 0,\n    y: Number.isFinite(parts[1]) ? parts[1] : 0,\n    width: Number.isFinite(parts[2]) ? parts[2] : 0,\n    height: Number.isFinite(parts[3]) ? parts[3] : 0\n  };\n}\n\nfunction getOfdAttribute(element: Element, localName: string): string | null {\n  const direct = element.getAttribute(localName);\n  if (direct !== null) {\n    return direct;\n  }\n  for (const attribute of Array.from(element.attributes)) {\n    if (attribute.localName === localName) {\n      return attribute.value;\n    }\n  }\n  return null;\n}\n\nfunction finiteNumber(value: string | null, fallback: number): number {\n  const parsed = value === null ? Number.NaN : Number(value);\n  return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nfunction formatOfdCssNumber(value: number): string {\n  return Number.isInteger(value) ? String(value) : value.toFixed(3).replace(/0+$/, \"\").replace(/\\.$/, \"\");\n}\n\nfunction createOfdFailure(file: PreviewFile, url: string, error: unknown): HTMLElement {\n  if (isEncryptedError(error)) {\n    return createEncryptedFallback(file, url, {\n      title: \"OFD 文件已加密，无法在线预览\",\n      message: \"请下载后使用本地 OFD 阅读器输入密码打开，或上传解密后的 OFD 文件。\",\n      action: \"下载 OFD\"\n    });\n  }\n  return createOfdFallback(file.name, url, normalizeOfdError(error));\n}\n\nfunction createOfdFallback(fileName: string, url: string, detail: string): HTMLElement {\n  const fallback = document.createElement(\"div\");\n  fallback.className = \"ofv-fallback\";\n\n  const title = document.createElement(\"strong\");\n  title.textContent = \"OFD 解析失败\";\n\n  const meta = document.createElement(\"span\");\n  meta.textContent = `${detail}。可下载 ${fileName} 后使用本地 OFD 阅读器查看。`;\n\n  const download = document.createElement(\"a\");\n  download.href = url;\n  download.download = fileName;\n  download.textContent = \"下载 OFD\";\n\n  fallback.append(title, meta, download);\n  return fallback;\n}\n\nfunction normalizeOfdError(error: unknown): string {\n  if (error instanceof Error && error.message) {\n    return error.message;\n  }\n  return \"文件可能已损坏，或不是有效的 OFD 包\";\n}\n","/// <reference path=\"../shims-archive.d.ts\" />\nimport JSZip from \"jszip\";\nimport pako from \"pako\";\nimport type { PreviewPlugin, PreviewFile } from \"../types\";\nimport { normalizeFile } from \"../detect\";\nimport { fallbackPlugin } from \"./fallback\";\nimport { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport { appendMeta, createPanel, createSection, readArrayBuffer, resolveFormat } from \"./utils\";\nimport { createEncryptedFallback, isEncryptedError } from \"./encrypted\";\n\nconst archiveExtensions = new Set([\"zip\", \"rar\", \"7z\", \"tar\", \"gz\", \"tgz\", \"bz2\", \"xz\"]);\nconst archiveMimeTypes = new Set([\n  \"application/zip\",\n  \"application/x-zip-compressed\",\n  \"application/vnd.rar\",\n  \"application/x-rar-compressed\",\n  \"application/x-7z-compressed\",\n  \"application/x-tar\",\n  \"application/gzip\",\n  \"application/x-gzip\",\n  \"application/x-bzip2\",\n  \"application/x-xz\"\n]);\nconst archiveMimeFormatMap: Record<string, string> = {\n  \"application/zip\": \"zip\",\n  \"application/x-zip-compressed\": \"zip\",\n  \"application/vnd.rar\": \"rar\",\n  \"application/x-rar-compressed\": \"rar\",\n  \"application/x-7z-compressed\": \"7z\",\n  \"application/x-tar\": \"tar\",\n  \"application/gzip\": \"gz\",\n  \"application/x-gzip\": \"gz\",\n  \"application/x-bzip2\": \"bz2\",\n  \"application/x-xz\": \"xz\"\n};\n\ninterface ArchiveEntry {\n  name: string;\n  unsafeName?: string;\n  size: number;\n  dir: boolean;\n  read: () => Promise<ArrayBuffer>;\n}\n\ninterface ArchiveProbe {\n  format: string;\n  valid: boolean;\n  error?: string;\n  meta: Array<{ label: string; value: string }>;\n  entries: Array<{ name: string; size?: number; packedSize?: number }>;\n  note: string;\n}\n\nexport function archivePlugin(): PreviewPlugin {\n  return {\n    name: \"archive\",\n    match(file) {\n      return archiveExtensions.has(file.extension) || archiveMimeTypes.has(file.mimeType);\n    },\n    async render(ctx) {\n      const url = createObjectUrl(ctx.file);\n      const isExternal = Boolean(ctx.file.url);\n      const panel = createPanel(\"ofv-archive\");\n      ctx.viewport.append(panel);\n\n      const ext = resolveFormat(ctx.file, archiveMimeFormatMap).toLowerCase();\n      let archiveEntries: ArchiveEntry[] = [];\n      let isEncrypted = false;\n      let parseError: string | null = null;\n      let archiveProbe: ArchiveProbe | null = null;\n\n      // 1. Parse different archive formats\n      try {\n        if (ext === \"zip\") {\n          try {\n            const zip = await JSZip.loadAsync(await readArrayBuffer(ctx.file), {\n              decodeFileName: decodeZipFileName\n            });\n            archiveEntries = Object.values(zip.files).map((entry) => ({\n              name: entry.name,\n              unsafeName: (entry as any).unsafeOriginalName,\n              size: (entry as any)._data?.uncompressedSize || 0,\n              dir: entry.dir,\n              read: () => entry.async(\"arraybuffer\")\n            }));\n          } catch (zipErr: any) {\n            // Check for encryption errors\n            if (isEncryptedError(zipErr)) {\n              isEncrypted = true;\n            } else {\n              throw zipErr;\n            }\n          }\n        } else if (ext === \"tar\") {\n          archiveEntries = untar(await readArrayBuffer(ctx.file));\n        } else if (ext === \"gz\" || ext === \"tgz\" || ext === \"tar.gz\") {\n          const u8 = new Uint8Array(await readArrayBuffer(ctx.file));\n          const decompressed = pako.ungzip(u8);\n          const originalName = ctx.file.name.endsWith(\".gz\")\n            ? ctx.file.name.slice(0, -3)\n            : ctx.file.name.endsWith(\".tgz\")\n            ? ctx.file.name.slice(0, -4) + \".tar\"\n            : ctx.file.name;\n\n          if (ext === \"tgz\" || ext === \"tar.gz\" || originalName.endsWith(\".tar\")) {\n            archiveEntries = untar(toArrayBuffer(decompressed));\n          } else {\n            // Single decompressed file\n            archiveEntries = [\n              {\n                name: originalName,\n                size: decompressed.byteLength,\n                dir: false,\n                read: async () => toArrayBuffer(decompressed)\n              }\n            ];\n          }\n        } else if (ext === \"bz2\") {\n          const compressed = new Uint8Array(await readArrayBuffer(ctx.file));\n          const decompressed = await bunzip2(compressed);\n          const originalName = ctx.file.name.toLowerCase().endsWith(\".bz2\") ? ctx.file.name.slice(0, -4) : ctx.file.name;\n          archiveEntries = [\n            {\n              name: originalName || \"decompressed\",\n              size: decompressed.byteLength,\n              dir: false,\n              read: async () => toArrayBuffer(decompressed)\n            }\n          ];\n        } else if (ext === \"xz\") {\n          const compressed = new Uint8Array(await readArrayBuffer(ctx.file));\n          const decompressed = await unxz(compressed);\n          const originalName = deriveSingleFileArchiveName(ctx.file.name, \".xz\", \"decompressed\");\n\n          if (originalName.toLowerCase().endsWith(\".tar\") || ctx.file.name.toLowerCase().endsWith(\".txz\")) {\n            archiveEntries = untar(toArrayBuffer(decompressed));\n          } else {\n            archiveEntries = [\n              {\n                name: originalName,\n                size: decompressed.byteLength,\n                dir: false,\n                read: async () => toArrayBuffer(decompressed)\n              }\n            ];\n          }\n        } else if ([\"rar\", \"7z\"].includes(ext)) {\n          archiveProbe = probeArchiveHeader(await readArrayBuffer(ctx.file), ext);\n        } else {\n          parseError = `该格式 (.${ext.toUpperCase()}) 目前暂不支持直接在浏览器端在线解压和目录预览。`;\n        }\n      } catch (err: any) {\n        parseError = `压缩包解析失败：${err.message || err}`;\n      }\n\n      // 2. Encrypted Archive Prompt UI\n      if (isEncrypted) {\n        const fallback = createEncryptedFallback(ctx.file, url, {\n          title: \"压缩包已加密，无法在线预览\",\n          message: \"请下载后在本地输入密码解压，或上传解密后的压缩包。\",\n          action: \"下载压缩包\"\n        });\n        panel.append(fallback);\n        ctx.viewport.classList.add(\"ofv-center\");\n        \n        return {\n          destroy() {\n            ctx.viewport.classList.remove(\"ofv-center\");\n            revokeObjectUrl(url, isExternal);\n            panel.remove();\n          }\n        };\n      }\n\n      if (archiveProbe) {\n        renderArchiveProbe(panel, archiveProbe, ctx.file.name, url);\n        return {\n          destroy() {\n            revokeObjectUrl(url, isExternal);\n            panel.remove();\n          }\n        };\n      }\n\n      // 3. Fallback Unsupported message (RAR, 7z, etc.)\n      if (parseError) {\n        const fallback = document.createElement(\"div\");\n        fallback.className = \"ofv-fallback\";\n        \n        const title = document.createElement(\"strong\");\n        title.textContent = parseError;\n        \n        const meta = document.createElement(\"span\");\n        meta.textContent = \"建议下载视频/文档等文件至本地查看，或使用原生解压工具提取内容。\";\n        \n        const download = document.createElement(\"a\");\n        download.href = url;\n        download.download = ctx.file.name;\n        download.textContent = \"下载压缩包\";\n        \n        fallback.append(title, meta, download);\n        panel.append(fallback);\n        ctx.viewport.classList.add(\"ofv-center\");\n\n        return {\n          destroy() {\n            ctx.viewport.classList.remove(\"ofv-center\");\n            revokeObjectUrl(url, isExternal);\n            panel.remove();\n          }\n        };\n      }\n\n      // 4. Split Layout UI for interactive preview\n      const layout = document.createElement(\"div\");\n      layout.className = \"ofv-archive-layout\";\n\n      const sidebar = document.createElement(\"div\");\n      sidebar.className = \"ofv-archive-sidebar\";\n      const sidebarPanel = document.createElement(\"div\");\n      sidebarPanel.className = \"ofv-archive-sidebar-panel\";\n\n      const header = document.createElement(\"div\");\n      header.className = \"ofv-archive-header\";\n      const sidebarTitle = document.createElement(\"span\");\n      sidebarTitle.className = \"ofv-archive-header-title\";\n      sidebarTitle.textContent = `文件列表 (${archiveEntries.filter(e => !e.dir).length})`;\n      const sidebarToggle = document.createElement(\"button\");\n      sidebarToggle.className = \"ofv-archive-sidebar-toggle\";\n      sidebarToggle.type = \"button\";\n      sidebarToggle.setAttribute(\"aria-label\", \"展开文件列表\");\n      sidebarToggle.setAttribute(\"aria-expanded\", \"false\");\n      sidebarToggle.title = \"展开文件列表\";\n      sidebarToggle.textContent = \"‹\";\n      header.append(sidebarToggle, sidebarTitle);\n      sidebarPanel.append(header);\n\n      const tree = document.createElement(\"div\");\n      tree.className = \"ofv-archive-tree\";\n      sidebarPanel.append(tree);\n      sidebar.append(sidebarPanel);\n\n      const mainPanel = document.createElement(\"div\");\n      mainPanel.className = \"ofv-archive-main\";\n\n      layout.append(sidebar, mainPanel);\n      panel.append(layout);\n\n      let currentSubInstance: any = null;\n      const getSidebarViewportWidth = () => ctx.viewport.clientWidth || ctx.size.width;\n      const shouldAutoCollapseSidebar = () => getSidebarViewportWidth() <= 520;\n      const setSidebarCollapsed = (collapsed: boolean) => {\n        layout.classList.toggle(\"is-sidebar-collapsed\", collapsed);\n        sidebarToggle.setAttribute(\"aria-expanded\", String(!collapsed));\n        const label = collapsed ? \"展开文件列表\" : \"收起文件列表\";\n        sidebarToggle.setAttribute(\"aria-label\", label);\n        sidebarToggle.title = label;\n        sidebarToggle.textContent = collapsed ? \"›\" : \"‹\";\n      };\n      setSidebarCollapsed(false);\n      sidebarToggle.addEventListener(\"click\", () => {\n        setSidebarCollapsed(!layout.classList.contains(\"is-sidebar-collapsed\"));\n      });\n\n      // Render default metadata summary\n      const showDefaultSummary = (isSupplemental = true) => {\n        mainPanel.replaceChildren();\n        const summary = document.createElement(\"div\");\n        summary.className = \"ofv-archive-info\";\n        if (isSupplemental) {\n          hideSupplementalInfo(summary);\n        }\n        \n        const heading = document.createElement(\"h3\");\n        heading.textContent = ctx.file.name;\n\n        const info = document.createElement(\"div\");\n        info.className = \"ofv-archive-info-meta\";\n        \n        const fileCount = archiveEntries.filter(e => !e.dir).length;\n        const dirCount = archiveEntries.filter(e => e.dir).length;\n        \n        appendArchiveInfo(info, \"格式类型\", `.${ext.toUpperCase()} 压缩文件`);\n        appendArchiveInfo(info, \"包含文件数\", `${fileCount} 个`);\n        appendArchiveInfo(info, \"包含目录数\", `${dirCount} 个`);\n        appendArchiveInfo(\n          info,\n          \"操作提示\",\n          fileCount === 0 ? \"压缩包内没有可预览的文件。\" : \"请点击左侧栏中的文件进行联动预览。\"\n        );\n        \n        summary.append(heading, info, createArchiveSummary(archiveEntries));\n        mainPanel.append(summary);\n      };\n\n      // Filter and render items (max 500 to keep DOM lightweight)\n      const visibleEntries = archiveEntries.filter(e => !e.dir).slice(0, 500);\n      showDefaultSummary(visibleEntries.length > 0);\n      let destroyed = false;\n      let renderToken = 0;\n\n      const openArchiveEntry = async (entry: ArchiveEntry, item: HTMLButtonElement) => {\n        if (destroyed) {\n          return;\n        }\n        if (shouldAutoCollapseSidebar()) {\n          setSidebarCollapsed(true);\n        }\n        const token = ++renderToken;\n        sidebar.querySelectorAll(\".ofv-archive-item\").forEach((el) => {\n          el.classList.remove(\"is-active\");\n          el.removeAttribute(\"aria-current\");\n        });\n        item.classList.add(\"is-active\");\n        item.setAttribute(\"aria-current\", \"true\");\n\n        if (currentSubInstance) {\n          currentSubInstance.destroy();\n          currentSubInstance = null;\n          ctx.toolbar?.refreshCommandSupport();\n        }\n\n        mainPanel.replaceChildren(createArchiveLoading(entry.name.split(\"/\").pop() || entry.name));\n\n        try {\n          let buffer = await entry.read();\n          if (destroyed || token !== renderToken) {\n            return;\n          }\n          const subName = entry.name.split(\"/\").pop() || entry.name;\n          const subExt = subName.split(\".\").pop()?.toLowerCase() || \"\";\n\n          if (subExt === \"shp\") {\n            const basePath = entry.name.slice(0, -4);\n            const dbfEntry = archiveEntries.find((e) => e.name.toLowerCase() === basePath.toLowerCase() + \".dbf\");\n            const shxEntry = archiveEntries.find((e) => e.name.toLowerCase() === basePath.toLowerCase() + \".shx\");\n            if (dbfEntry && shxEntry) {\n              const prjEntry = archiveEntries.find((e) => e.name.toLowerCase() === basePath.toLowerCase() + \".prj\");\n              const newZip = new JSZip();\n              newZip.file(subName, buffer);\n              newZip.file(dbfEntry.name.split(\"/\").pop()!, await dbfEntry.read());\n              newZip.file(shxEntry.name.split(\"/\").pop()!, await shxEntry.read());\n              if (prjEntry) {\n                newZip.file(prjEntry.name.split(\"/\").pop()!, await prjEntry.read());\n              }\n              buffer = await newZip.generateAsync({ type: \"arraybuffer\" });\n              if (destroyed || token !== renderToken) {\n                return;\n              }\n            }\n          }\n\n          const subContainer = document.createElement(\"div\");\n          subContainer.style.cssText = \"width: 100%; height: 100%; position: relative; display: flex; flex-direction: column;\";\n          mainPanel.replaceChildren(subContainer);\n\n          const subViewport = document.createElement(\"div\");\n          subViewport.className = \"ofv-viewport\";\n          subViewport.style.cssText = \"flex: 1; width: 100%; height: 100%; position: relative; overflow: auto;\";\n          subContainer.append(subViewport);\n\n          const subFile: PreviewFile = await normalizeFile(buffer, subName);\n\n          const plugins = [...(ctx.options.plugins || []), fallbackPlugin()];\n          let matchedPlugin = await findSubPreviewPlugin(plugins, subFile);\n          if (destroyed || token !== renderToken) {\n            return;\n          }\n          if (matchedPlugin.name === \"archive\") {\n            matchedPlugin = fallbackPlugin();\n          }\n\n          let previewError: Error | undefined;\n          const nextSubInstance = await Promise.resolve()\n            .then(() =>\n              matchedPlugin.render({\n                host: ctx.host,\n                viewport: subViewport,\n                file: subFile,\n                size: { width: subViewport.clientWidth || 600, height: subViewport.clientHeight || 400 },\n                options: ctx.options,\n                toolbar: ctx.toolbar,\n                setLoading: () => {},\n                setError: (err) => {\n                  previewError = err instanceof Error ? err : new Error(String(err));\n                  subViewport.replaceChildren(createInlineError(\"文件预览失败\", previewError.message));\n                }\n              })\n            )\n            .catch((error: unknown) => {\n              previewError = error instanceof Error ? error : new Error(String(error));\n              subViewport.replaceChildren(createInlineError(\"文件预览失败\", previewError.message));\n              return undefined;\n            });\n          if (destroyed || token !== renderToken) {\n            nextSubInstance?.destroy();\n            return;\n          }\n          if (nextSubInstance && !previewError) {\n            currentSubInstance = nextSubInstance;\n            ctx.toolbar?.refreshCommandSupport();\n          } else if (nextSubInstance) {\n            nextSubInstance.destroy();\n            ctx.toolbar?.refreshCommandSupport();\n          }\n        } catch (err: any) {\n          if (destroyed || token !== renderToken) {\n            return;\n          }\n          currentSubInstance = null;\n          ctx.toolbar?.refreshCommandSupport();\n          mainPanel.replaceChildren(createInlineError(\"解压加载失败\", String(err.message || err)));\n        }\n      };\n\n      visibleEntries.forEach((entry, index) => {\n        const item = document.createElement(\"button\");\n        item.className = \"ofv-archive-item\";\n        item.type = \"button\";\n        item.title = entry.name;\n\n        const icon = document.createElement(\"span\");\n        icon.className = \"ofv-archive-item-icon\";\n        icon.textContent = getIcon(entry.name, entry.dir);\n\n        const name = document.createElement(\"span\");\n        name.className = \"ofv-archive-item-name\";\n        name.textContent = entry.name;\n        name.title = entry.name;\n\n        item.append(icon, name);\n        tree.append(item);\n\n        item.addEventListener(\"click\", async () => {\n          await openArchiveEntry(entry, item);\n        });\n        if (index === 0) {\n          void openArchiveEntry(entry, item);\n        }\n      });\n\n      return {\n        canCommand(command) {\n          return currentSubInstance?.canCommand?.(command) ?? false;\n        },\n        command(command) {\n          return currentSubInstance?.command?.(command) ?? false;\n        },\n        preparePrint() {\n          return currentSubInstance?.preparePrint?.();\n        },\n        resize(size) {\n          currentSubInstance?.resize?.(size);\n        },\n        destroy() {\n          destroyed = true;\n          renderToken += 1;\n          if (currentSubInstance) {\n            currentSubInstance.destroy();\n          }\n          revokeObjectUrl(url, isExternal);\n          panel.remove();\n        }\n      };\n    }\n  };\n}\n\nasync function findSubPreviewPlugin(plugins: PreviewPlugin[], file: PreviewFile): Promise<PreviewPlugin> {\n  for (const plugin of plugins) {\n    if (await plugin.match(file)) {\n      return plugin;\n    }\n  }\n  return fallbackPlugin();\n}\n\nasync function bunzip2(bytes: Uint8Array): Promise<Uint8Array> {\n  const restoreBuffer = installSeekBzipBufferCompat();\n  try {\n    const module = await import(\"seek-bzip\");\n    const decoder = (module.default || module) as { decode: (input: Uint8Array) => Uint8Array | ArrayBuffer | ArrayLike<number> };\n    const decoded = decoder.decode(bytes);\n    return decoded instanceof Uint8Array\n      ? decoded\n      : decoded instanceof ArrayBuffer\n        ? new Uint8Array(decoded)\n        : Uint8Array.from(decoded);\n  } finally {\n    restoreBuffer();\n  }\n}\n\nfunction installSeekBzipBufferCompat(): () => void {\n  const globalObject = globalThis as unknown as Record<string, unknown>;\n  if (typeof globalObject.Buffer === \"function\") {\n    return () => undefined;\n  }\n  class SeekBzipBuffer extends Uint8Array {\n    copy(target: Uint8Array, targetStart = 0, sourceStart = 0, sourceEnd = this.length): number {\n      const slice = this.subarray(sourceStart, sourceEnd);\n      target.set(slice, targetStart);\n      return slice.length;\n    }\n\n    toString(encoding?: string): string {\n      if (encoding === \"hex\") {\n        return Array.from(this)\n          .map((byte) => byte.toString(16).padStart(2, \"0\"))\n          .join(\"\");\n      }\n      return new TextDecoder().decode(this);\n    }\n  }\n  globalObject.Buffer = SeekBzipBuffer;\n  return () => {\n    if (globalObject.Buffer === SeekBzipBuffer) {\n      Reflect.deleteProperty(globalObject, \"Buffer\");\n    }\n  };\n}\n\nasync function unxz(bytes: Uint8Array): Promise<Uint8Array> {\n  const module = await import(\"xz-decompress\");\n  const XzReadableStream = (module as any).XzReadableStream || (module as any).default?.XzReadableStream;\n  if (typeof XzReadableStream !== \"function\") {\n    throw new Error(\"XZ 解码器不可用。\");\n  }\n  const response = new Response(new XzReadableStream(createByteReadableStream(bytes)));\n  return new Uint8Array(await response.arrayBuffer());\n}\n\nfunction createByteReadableStream(bytes: Uint8Array): ReadableStream<Uint8Array> {\n  const blob = new Blob([bytes as BlobPart]);\n  if (typeof blob.stream === \"function\") {\n    return blob.stream() as ReadableStream<Uint8Array>;\n  }\n  return new ReadableStream<Uint8Array>({\n    start(controller) {\n      controller.enqueue(bytes);\n      controller.close();\n    }\n  });\n}\n\nfunction deriveSingleFileArchiveName(fileName: string, suffix: string, fallback: string): string {\n  return fileName.toLowerCase().endsWith(suffix) ? fileName.slice(0, -suffix.length) || fallback : fileName || fallback;\n}\n\nfunction toArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n  const copy = new Uint8Array(bytes.byteLength);\n  copy.set(bytes);\n  return copy.buffer;\n}\n\nfunction decodeZipFileName(bytes: string[] | Uint8Array | ArrayLike<number>): string {\n  const data = Array.isArray(bytes)\n    ? Uint8Array.from(bytes.map((value) => value.charCodeAt(0) & 0xff))\n    : bytes instanceof Uint8Array\n      ? bytes\n      : Uint8Array.from(bytes);\n  const utf8 = decodeZipNameWith(data, \"utf-8\", true);\n  if (utf8 && !looksMojibake(utf8)) {\n    return utf8;\n  }\n  const gb18030 = decodeZipNameWith(data, \"gb18030\", false) || decodeZipNameWith(data, \"gbk\", false);\n  if (gb18030 && !looksMojibake(gb18030)) {\n    return gb18030;\n  }\n  return utf8 || new TextDecoder(\"latin1\").decode(data);\n}\n\nfunction decodeZipNameWith(bytes: Uint8Array, encoding: string, fatal: boolean): string | undefined {\n  try {\n    return new TextDecoder(encoding, { fatal }).decode(bytes);\n  } catch {\n    return undefined;\n  }\n}\n\nfunction looksMojibake(value: string): boolean {\n  return /[\\uFFFDÃÂÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß]/.test(value);\n}\n\nfunction createInlineError(titleText: string, detailText: string): HTMLElement {\n  const fallback = document.createElement(\"div\");\n  fallback.className = \"ofv-fallback\";\n  const title = document.createElement(\"strong\");\n  title.textContent = titleText;\n  const detail = document.createElement(\"span\");\n  detail.textContent = detailText;\n  fallback.append(title, detail);\n  return fallback;\n}\n\nfunction appendArchiveInfo(parent: HTMLElement, label: string, value: string): void {\n  const row = document.createElement(\"div\");\n  const key = document.createElement(\"strong\");\n  key.textContent = `${label}：`;\n  row.append(key, document.createTextNode(value));\n  parent.append(row);\n}\n\nfunction hideSupplementalInfo(element: HTMLElement): void {\n  element.hidden = true;\n  element.setAttribute(\"aria-hidden\", \"true\");\n  element.style.display = \"none\";\n}\n\nfunction createArchiveSummary(entries: ArchiveEntry[]): HTMLElement {\n  const files = entries.filter((entry) => !entry.dir);\n  const summary = document.createElement(\"dl\");\n  summary.className = \"ofv-archive-summary\";\n  const totalSize = files.reduce((sum, entry) => sum + entry.size, 0);\n  const largest = files.reduce<ArchiveEntry | undefined>((current, entry) => (!current || entry.size > current.size ? entry : current), undefined);\n  appendArchiveSummary(summary, \"总解压大小\", formatBytes(totalSize));\n  appendArchiveSummary(summary, \"最大文件\", largest ? `${largest.name} · ${formatBytes(largest.size)}` : \"无\");\n  appendArchiveSummary(summary, \"类型分布\", formatArchiveExtensions(files));\n  appendArchiveSummary(summary, \"可预览条目\", String(files.slice(0, 500).length));\n  appendArchiveSummary(summary, \"风险路径\", String(files.filter((entry) => isRiskyArchivePath(entry.unsafeName || entry.name)).length));\n  return summary;\n}\n\nfunction appendArchiveSummary(parent: HTMLElement, label: string, value: string): void {\n  const key = document.createElement(\"dt\");\n  key.textContent = label;\n  const content = document.createElement(\"dd\");\n  content.textContent = value;\n  parent.append(key, content);\n}\n\nfunction formatArchiveExtensions(entries: ArchiveEntry[]): string {\n  const counts = new Map<string, number>();\n  for (const entry of entries) {\n    const name = entry.name.split(\"/\").pop() || entry.name;\n    const index = name.lastIndexOf(\".\");\n    const extension = index > 0 ? name.slice(index + 1).toLowerCase() : \"(无扩展名)\";\n    counts.set(extension, (counts.get(extension) || 0) + 1);\n  }\n  return [...counts.entries()]\n    .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n    .slice(0, 6)\n    .map(([extension, count]) => `${extension} ${count}`)\n    .join(\", \") || \"无\";\n}\n\nfunction isRiskyArchivePath(name: string): boolean {\n  return name.startsWith(\"/\") || /^[A-Za-z]:[\\\\/]/.test(name) || name.split(/[\\\\/]+/).includes(\"..\");\n}\n\nfunction createArchiveLoading(fileName: string): HTMLElement {\n  const loading = document.createElement(\"div\");\n  loading.className = \"ofv-archive-loading\";\n  const spinner = document.createElement(\"div\");\n  spinner.className = \"ofv-archive-loading-spinner\";\n  const text = document.createElement(\"span\");\n  text.textContent = `正在解压并加载 [${fileName}]...`;\n  loading.append(spinner, text);\n  return loading;\n}\n\nfunction renderArchiveProbe(panel: HTMLElement, probe: ArchiveProbe, fileName: string, url: string): void {\n  const section = createSection(`${probe.format} 结构预览`);\n  const note = document.createElement(\"p\");\n  note.textContent = probe.note;\n\n  const meta = document.createElement(\"div\");\n  meta.className = \"ofv-archive-probe-meta\";\n  appendArchiveInfo(meta, \"文件\", fileName);\n  appendArchiveInfo(meta, \"格式\", probe.format);\n  for (const item of probe.meta) {\n    appendArchiveInfo(meta, item.label, item.value);\n  }\n\n  const download = document.createElement(\"a\");\n  download.className = \"ofv-asset-download\";\n  download.href = url;\n  download.download = fileName;\n  download.textContent = \"下载压缩包\";\n\n  section.append(note, meta, download);\n\n  if (!probe.valid) {\n    const error = document.createElement(\"p\");\n    error.className = \"ofv-data-error\";\n    error.textContent = probe.error || \"压缩包头信息无法识别。\";\n    section.append(error);\n  }\n\n  if (probe.entries.length > 0) {\n    const wrapper = document.createElement(\"div\");\n    wrapper.className = \"ofv-table-scroll ofv-archive-probe-table\";\n    const table = document.createElement(\"table\");\n    const thead = document.createElement(\"thead\");\n    const header = document.createElement(\"tr\");\n    for (const label of [\"文件\", \"原始大小\", \"压缩大小\"]) {\n      const th = document.createElement(\"th\");\n      th.textContent = label;\n      header.append(th);\n    }\n    thead.append(header);\n    const tbody = document.createElement(\"tbody\");\n    for (const entry of probe.entries.slice(0, 200)) {\n      const tr = document.createElement(\"tr\");\n      for (const value of [\n        entry.name,\n        entry.size === undefined ? \"未知\" : formatBytes(entry.size),\n        entry.packedSize === undefined ? \"未知\" : formatBytes(entry.packedSize)\n      ]) {\n        const td = document.createElement(\"td\");\n        td.textContent = value;\n        tr.append(td);\n      }\n      tbody.append(tr);\n    }\n    table.append(thead, tbody);\n    wrapper.append(table);\n    section.append(wrapper);\n  }\n\n  panel.append(section);\n}\n\nfunction probeArchiveHeader(arrayBuffer: ArrayBuffer, extension: string): ArchiveProbe {\n  const bytes = new Uint8Array(arrayBuffer);\n  if (extension === \"rar\") {\n    return probeRar(bytes);\n  }\n  if (extension === \"7z\") {\n    return probe7z(bytes);\n  }\n  if (extension === \"bz2\") {\n    return probeBzip2(bytes);\n  }\n  if (extension === \"xz\") {\n    return probeXz(bytes);\n  }\n  return {\n    format: extension.toUpperCase(),\n    valid: false,\n    error: \"暂不支持该压缩格式的头信息解析。\",\n    meta: [],\n    entries: [],\n    note: \"当前仅提供压缩包识别和下载入口。\"\n  };\n}\n\nfunction probeRar(bytes: Uint8Array): ArchiveProbe {\n  const rar4 = bytes.length >= 7 && bytes[0] === 0x52 && bytes[1] === 0x61 && bytes[2] === 0x72 && bytes[3] === 0x21 && bytes[4] === 0x1a && bytes[5] === 0x07 && bytes[6] === 0x00;\n  const rar5 = bytes.length >= 8 && bytes[0] === 0x52 && bytes[1] === 0x61 && bytes[2] === 0x72 && bytes[3] === 0x21 && bytes[4] === 0x1a && bytes[5] === 0x07 && bytes[6] === 0x01 && bytes[7] === 0x00;\n  const entries = rar4 ? parseRar4Entries(bytes) : [];\n  return {\n    format: \"RAR\",\n    valid: rar4 || rar5,\n    error: rar4 || rar5 ? undefined : \"缺少 RAR signature。\",\n    meta: [\n      { label: \"版本\", value: rar5 ? \"RAR5\" : rar4 ? \"RAR4\" : \"未知\" },\n      { label: \"签名\", value: byteSignature(bytes) },\n      { label: \"可见条目\", value: String(entries.length) }\n    ],\n    entries,\n    note: rar4\n      ? \"当前轻量读取 RAR4 未加密文件头，用于目录确认；实际解压仍建议接入 unrar WASM 或本地工具。\"\n      : \"当前识别 RAR 容器和版本；RAR5 目录解析需要专用解码器。\"\n  };\n}\n\nfunction parseRar4Entries(bytes: Uint8Array): ArchiveProbe[\"entries\"] {\n  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n  const entries: ArchiveProbe[\"entries\"] = [];\n  let offset = 7;\n  while (offset + 7 <= bytes.length && entries.length < 200) {\n    const type = bytes[offset + 2];\n    const flags = view.getUint16(offset + 3, true);\n    let headerSize = view.getUint16(offset + 5, true);\n    if (headerSize < 7 || offset + headerSize > bytes.length) {\n      break;\n    }\n    if ((flags & 0x8000) !== 0) {\n      if (offset + 11 > bytes.length) {\n        break;\n      }\n      headerSize += view.getUint32(offset + 7, true);\n    }\n    if (type === 0x74 && offset + 32 <= bytes.length) {\n      const packedSize = view.getUint32(offset + 7, true);\n      const unpackedSize = view.getUint32(offset + 11, true);\n      const nameSize = view.getUint16(offset + 26, true);\n      const nameOffset = offset + 32;\n      const nameEnd = Math.min(nameOffset + nameSize, offset + headerSize, bytes.length);\n      const nameBytes = bytes.slice(nameOffset, nameEnd);\n      const name = new TextDecoder(\"latin1\").decode(nameBytes).replace(/\\0.*$/, \"\");\n      if (name) {\n        entries.push({ name, size: unpackedSize, packedSize });\n      }\n    }\n    offset += headerSize;\n  }\n  return entries;\n}\n\nfunction probe7z(bytes: Uint8Array): ArchiveProbe {\n  const valid = bytes.length >= 32 && bytes[0] === 0x37 && bytes[1] === 0x7a && bytes[2] === 0xbc && bytes[3] === 0xaf && bytes[4] === 0x27 && bytes[5] === 0x1c;\n  const meta: ArchiveProbe[\"meta\"] = [{ label: \"签名\", value: byteSignature(bytes) }];\n  if (valid) {\n    const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n    meta.push({ label: \"版本\", value: `${bytes[6]}.${bytes[7]}` });\n    meta.push({ label: \"Next header offset\", value: String(readUint64Le(view, 12)) });\n    meta.push({ label: \"Next header size\", value: String(readUint64Le(view, 20)) });\n    meta.push({ label: \"Next header CRC\", value: `0x${view.getUint32(28, true).toString(16).toUpperCase()}` });\n  }\n  return {\n    format: \"7Z\",\n    valid,\n    error: valid ? undefined : \"缺少 7z signature。\",\n    meta,\n    entries: [],\n    note: \"当前识别 7z 容器和 next header 边界；目录和解压需要 LZMA/7z 专用解码器。\"\n  };\n}\n\nfunction probeBzip2(bytes: Uint8Array): ArchiveProbe {\n  const valid = bytes.length >= 4 && bytes[0] === 0x42 && bytes[1] === 0x5a && bytes[2] === 0x68 && bytes[3] >= 0x31 && bytes[3] <= 0x39;\n  return {\n    format: \"BZIP2\",\n    valid,\n    error: valid ? undefined : \"缺少 BZh magic header。\",\n    meta: [\n      { label: \"签名\", value: byteSignature(bytes) },\n      { label: \"块大小\", value: valid ? `${String.fromCharCode(bytes[3])}00 KB` : \"未知\" }\n    ],\n    entries: [],\n    note: \"BZIP2 通常是单文件压缩流，本预览器当前展示容器头信息；解压可后续接入 bzip2 解码器。\"\n  };\n}\n\nfunction probeXz(bytes: Uint8Array): ArchiveProbe {\n  const valid = bytes.length >= 6 && bytes[0] === 0xfd && bytes[1] === 0x37 && bytes[2] === 0x7a && bytes[3] === 0x58 && bytes[4] === 0x5a && bytes[5] === 0x00;\n  return {\n    format: \"XZ\",\n    valid,\n    error: valid ? undefined : \"缺少 XZ magic header。\",\n    meta: [\n      { label: \"签名\", value: byteSignature(bytes) },\n      { label: \"Stream flags\", value: bytes.length >= 8 ? `0x${bytes[6].toString(16).padStart(2, \"0\").toUpperCase()} 0x${bytes[7].toString(16).padStart(2, \"0\").toUpperCase()}` : \"未知\" }\n    ],\n    entries: [],\n    note: \"XZ 通常是单文件 LZMA2 压缩流，本预览器当前展示容器头信息；解压可后续接入 xz/lzma 解码器。\"\n  };\n}\n\nfunction readUint64Le(view: DataView, offset: number): bigint {\n  return BigInt(view.getUint32(offset, true)) | (BigInt(view.getUint32(offset + 4, true)) << 32n);\n}\n\nfunction formatBytes(bytes: number): string {\n  if (bytes < 1024) {\n    return `${bytes} B`;\n  }\n  if (bytes < 1024 * 1024) {\n    return `${(bytes / 1024).toFixed(1)} KB`;\n  }\n  return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\nfunction byteSignature(bytes: Uint8Array): string {\n  if (bytes.length === 0) {\n    return \"空文件\";\n  }\n  const ascii = new TextDecoder(\"ascii\").decode(bytes.slice(0, Math.min(bytes.length, 16))).replace(/[^\\x20-\\x7E]/g, \".\");\n  const hex = Array.from(bytes.slice(0, Math.min(bytes.length, 8)))\n    .map((byte) => byte.toString(16).padStart(2, \"0\").toUpperCase())\n    .join(\" \");\n  return `${ascii} (${hex})`;\n}\n\n// 5. Lightweight TAR parser\nfunction untar(arrayBuffer: ArrayBuffer): ArchiveEntry[] {\n  const entries: ArchiveEntry[] = [];\n  const u8 = new Uint8Array(arrayBuffer);\n  let offset = 0;\n\n  const readString = (start: number, length: number): string => {\n    let end = start;\n    while (end < start + length && u8[end] !== 0) {\n      end++;\n    }\n    return new TextDecoder().decode(u8.subarray(start, end)).trim();\n  };\n\n  while (offset + 512 <= arrayBuffer.byteLength) {\n    const magic = readString(offset + 257, 6);\n    if (magic !== \"ustar\" && magic !== \"ustar\\0\") {\n      let allZero = true;\n      for (let i = 0; i < 512; i++) {\n        if (u8[offset + i] !== 0) {\n          allZero = false;\n          break;\n        }\n      }\n      if (allZero) {\n        break; // End of archive\n      }\n      break;\n    }\n\n    const name = readString(offset, 100);\n    const prefix = readString(offset + 345, 155);\n    const fullName = prefix ? `${prefix}/${name}` : name;\n\n    const sizeStr = readString(offset + 124, 12);\n    const size = parseInt(sizeStr, 8) || 0;\n    const typeflag = readString(offset + 156, 1);\n    const dir = typeflag === \"5\" || fullName.endsWith(\"/\");\n\n    const contentOffset = offset + 512;\n    entries.push({\n      name: fullName,\n      size,\n      dir,\n      read: async () => arrayBuffer.slice(contentOffset, contentOffset + size)\n    });\n\n    offset += 512 + Math.ceil(size / 512) * 512;\n  }\n\n  return entries;\n}\n\n// 6. UI Helpers\nfunction getIcon(name: string, dir: boolean): string {\n  if (dir) return \"📁\";\n  const ext = name.split(\".\").pop()?.toLowerCase();\n  switch (ext) {\n    case \"png\":\n    case \"jpg\":\n    case \"jpeg\":\n    case \"gif\":\n    case \"svg\":\n    case \"webp\":\n      return \"🖼️\";\n    case \"pdf\":\n      return \"📕\";\n    case \"doc\":\n    case \"docx\":\n      return \"📘\";\n    case \"xls\":\n    case \"xlsx\":\n      return \"📗\";\n    case \"ppt\":\n    case \"pptx\":\n      return \"📙\";\n    case \"zip\":\n    case \"rar\":\n    case \"7z\":\n    case \"tar\":\n    case \"gz\":\n      return \"📦\";\n    case \"mp4\":\n    case \"mkv\":\n    case \"avi\":\n    case \"webm\":\n      return \"🎥\";\n    case \"mp3\":\n    case \"wav\":\n    case \"ogg\":\n      return \"🎵\";\n    case \"txt\":\n    case \"md\":\n    case \"html\":\n    case \"js\":\n    case \"ts\":\n    case \"json\":\n    case \"css\":\n      return \"📄\";\n    default:\n      return \"📄\";\n  }\n}\n","import type { PreviewCommand, PreviewContext, PreviewPlugin } from \"../types\";\nimport { appendMeta, createPanel, createSection, readArrayBuffer, readTextFile, resolveFormat } from \"./utils\";\nimport { createObjectUrl, revokeObjectUrl } from \"../dom\";\n\nconst emailExtensions = new Set([\"eml\", \"msg\", \"mbox\"]);\nconst emailMimeTypes = new Set([\"message/rfc822\", \"application/vnd.ms-outlook\", \"application/mbox\"]);\nlet domPurifyLoader: Promise<typeof import(\"dompurify\")> | undefined;\ntype DOMPurifySanitizer = (typeof import(\"dompurify\"))[\"default\"];\nconst emailMimeFormatMap: Record<string, string> = {\n  \"message/rfc822\": \"eml\",\n  \"application/vnd.ms-outlook\": \"msg\",\n  \"application/mbox\": \"mbox\"\n};\n\ninterface EmailAttachment {\n  name: string;\n  mimeType: string;\n  content: Uint8Array;\n  contentId?: string;\n}\n\ninterface EmailData {\n  from: string;\n  to: string;\n  cc?: string;\n  subject: string;\n  date: string;\n  bodyText?: string;\n  bodyHtml?: string;\n  attachments: EmailAttachment[];\n}\n\ninterface MboxMessageSummary {\n  from: string;\n  subject: string;\n  date: string;\n}\n\nexport function emailPlugin(): PreviewPlugin {\n  return {\n    name: \"email\",\n    match(file) {\n      return emailExtensions.has(file.extension) || emailMimeTypes.has(file.mimeType);\n    },\n    async render(ctx) {\n      const DOMPurifyModule = await (domPurifyLoader ||= import(\"dompurify\"));\n      const DOMPurify = DOMPurifyModule.default;\n      const panel = createPanel(\"ofv-email\");\n      const content = document.createElement(\"div\");\n      content.className = \"ofv-email-content\";\n      panel.append(content);\n      ctx.viewport.append(panel);\n\n      const url = createObjectUrl(ctx.file);\n      const isExternal = Boolean(ctx.file.url);\n      const ext = resolveFormat(ctx.file, emailMimeFormatMap).toLowerCase();\n      let emailData: EmailData;\n      const objectUrlsToRevoke: string[] = [];\n      const attachmentObjectUrls = new Map<EmailAttachment, string>();\n      const timersToClear: number[] = [];\n      const zoomController = createEmailZoomController(panel, content, ctx);\n      let mboxSummary: MboxMessageSummary[] = [];\n\n      try {\n        if (ext === \"msg\") {\n          // Parse Outlook binary MSG format\n          const MsgReader = (await import(\"@kenjiuno/msgreader\")).default;\n          const buffer = await readArrayBuffer(ctx.file);\n          const reader = new MsgReader(buffer);\n          const parsed = reader.getFileData();\n\n          if (parsed.error) {\n            throw new Error(parsed.error);\n          }\n\n          const from = parsed.senderName\n            ? `${parsed.senderName} <${parsed.senderEmail || parsed.senderSmtpAddress || \"\"}>`.trim()\n            : parsed.senderEmail || parsed.senderSmtpAddress || \"\";\n\n          const recipients = parsed.recipients || [];\n          const to = recipients\n            .filter((r) => r.recipType === \"to\")\n            .map((r) => `${r.name || \"\"} <${r.email || r.smtpAddress || \"\"}>`.trim())\n            .join(\"; \");\n          const cc = recipients\n            .filter((r) => r.recipType === \"cc\")\n            .map((r) => `${r.name || \"\"} <${r.email || r.smtpAddress || \"\"}>`.trim())\n            .join(\"; \");\n\n          const attachments: EmailAttachment[] = [];\n          if (Array.isArray(parsed.attachments)) {\n            parsed.attachments.forEach((att) => {\n              try {\n                const fullAtt = reader.getAttachment(att);\n                attachments.push({\n                  name: fullAtt.fileName || \"未命名附件\",\n                  mimeType: getAttachmentMimeType(fullAtt, att),\n                  content: fullAtt.content,\n                  contentId: att.pidContentId\n                });\n              } catch (attErr) {\n                console.warn(\"Failed to parse attachment:\", attErr);\n              }\n            });\n          }\n\n          let bodyHtml = parsed.bodyHtml;\n          if (!bodyHtml && parsed.html instanceof Uint8Array) {\n            bodyHtml = new TextDecoder(\"utf-8\").decode(parsed.html);\n          }\n\n          emailData = {\n            from: from || \"-\",\n            to: to || \"-\",\n            cc: cc || \"\",\n            subject: parsed.subject || \"(无主题)\",\n            date: parsed.messageDeliveryTime || parsed.clientSubmitTime || parsed.creationTime || \"-\",\n            bodyText: parsed.body,\n            bodyHtml,\n            attachments\n          };\n        } else {\n          // Parse EML or MBOX text formats\n          const PostalMime = (await import(\"postal-mime\")).default;\n          const parser = new PostalMime();\n          let rawSource: string | ArrayBuffer = await readArrayBuffer(ctx.file);\n          if (ext === \"mbox\") {\n            let rawText = await readTextFile(ctx.file);\n            const messages = splitMboxMessages(rawText);\n            mboxSummary = messages.map(summarizeMboxMessage);\n            rawSource = messages[0] || rawText;\n          }\n\n          const parsed = await parser.parse(rawSource);\n\n          const from = parsed.from ? `${parsed.from.name || \"\"} <${parsed.from.address || \"\"}>`.trim() : \"\";\n          const to = Array.isArray(parsed.to)\n            ? parsed.to.map((t) => `${t.name || \"\"} <${t.address || \"\"}>`.trim()).join(\"; \")\n            : \"\";\n          const cc = Array.isArray(parsed.cc)\n            ? parsed.cc.map((c) => `${c.name || \"\"} <${c.address || \"\"}>`.trim()).join(\"; \")\n            : \"\";\n\n          emailData = {\n            from: from || \"-\",\n            to: to || \"-\",\n            cc: cc || \"\",\n            subject: parsed.subject || \"(无主题)\",\n            date: parsed.date || \"-\",\n            bodyText: parsed.text,\n            bodyHtml: parsed.html,\n            attachments: (parsed.attachments || []).map((att) => ({\n              name: att.filename || \"未命名附件\",\n              mimeType: att.mimeType || \"application/octet-stream\",\n              content: att.content instanceof Uint8Array ? att.content : new Uint8Array(att.content as any),\n              contentId: att.contentId\n            }))\n          };\n        }\n\n        if (mboxSummary.length > 0) {\n          content.append(createMboxSummarySection(mboxSummary));\n        }\n\n        // 1. Render Header information section\n        const headerSection = createSection(\"邮件信息\");\n        hideSupplementalInfo(headerSection);\n        appendMeta(headerSection, \"Subject\", emailData.subject);\n        appendMeta(headerSection, \"From\", emailData.from);\n        appendMeta(headerSection, \"To\", emailData.to);\n        if (emailData.cc) {\n          appendMeta(headerSection, \"Cc\", emailData.cc);\n        }\n        appendMeta(headerSection, \"Date\", emailData.date);\n        content.append(headerSection);\n\n        // 2. Render Attachments section if present\n        if (emailData.attachments.length > 0) {\n          const attachmentsSection = createSection(\"附件列表\");\n          hideSupplementalInfo(attachmentsSection);\n          const container = document.createElement(\"div\");\n          container.className = \"ofv-email-attachments\";\n\n          emailData.attachments.forEach((att) => {\n            const blobUrl = getAttachmentObjectUrl(att, attachmentObjectUrls, objectUrlsToRevoke);\n\n            const item = document.createElement(\"a\");\n            item.className = \"ofv-email-attachment-item\";\n            item.href = blobUrl;\n            item.download = att.name;\n            item.rel = \"noopener noreferrer\";\n            \n            // Format attachment size helper\n            const sizeKB = Math.round(att.content.byteLength / 1024);\n            item.textContent = `Attachment: ${att.name} (${sizeKB} KB)`;\n            container.append(item);\n          });\n          \n          attachmentsSection.append(container);\n          content.append(attachmentsSection);\n        }\n\n        // 3. Render Body section (support inline cid images)\n        const bodySection = createSection(\"正文\");\n        content.append(bodySection);\n\n        let html = emailData.bodyHtml;\n        if (html) {\n          // Replace inline cid: content IDs with local blob URLs\n          let nextHtml = html;\n          emailData.attachments.forEach((att) => {\n            const contentId = att.contentId;\n            if (contentId) {\n              const blobUrl = getAttachmentObjectUrl(att, attachmentObjectUrls, objectUrlsToRevoke);\n\n              const cleanCid = contentId.replace(/[<>]/g, \"\");\n              nextHtml = replaceCidResourceUrls(nextHtml, contentId, blobUrl);\n              if (cleanCid !== contentId) {\n                nextHtml = replaceCidResourceUrls(nextHtml, cleanCid, blobUrl);\n              }\n            }\n          });\n          html = nextHtml;\n          const sanitizedHtml = sanitizeEmailHtml(html, DOMPurify);\n\n          // Render in a sandboxed iframe to prevent styles leaking\n          const iframe = document.createElement(\"iframe\");\n          iframe.className = \"ofv-email-body-iframe\";\n          iframe.setAttribute(\"sandbox\", \"allow-same-origin allow-popups allow-popups-to-escape-sandbox\");\n          iframe.style.cssText = \"width: 100%; border: none; background: #fff; min-height: 200px;\";\n          let renderedHtmlBody = false;\n          let resizeHtmlBody: (() => void) | undefined;\n          const renderHtmlBody = () => {\n            if (renderedHtmlBody) {\n              return;\n            }\n            try {\n              const idoc = iframe.contentDocument || iframe.contentWindow?.document;\n              if (idoc) {\n                renderedHtmlBody = true;\n                idoc.open();\n                idoc.write(`\n                  <!doctype html>\n                  <html>\n                    <head>\n                      <meta charset=\"utf-8\" />\n                      <style>\n                        body {\n                          margin: 16px;\n                          padding: 0;\n                          font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n                          font-size: 14px;\n                          line-height: 1.6;\n                          color: #1f2937;\n                        }\n                        img { max-width: 100%; height: auto; display: block; margin: 12px 0; }\n                        a { color: #2563eb; }\n                        blockquote {\n                          margin: 12px 0;\n                          padding-left: 12px;\n                          border-left: 3px solid #d1d5db;\n                          color: #4b5563;\n                        }\n                      </style>\n                    </head>\n                    <body>${sanitizedHtml}</body>\n                  </html>\n                `);\n                idoc.close();\n                secureEmailLinks(idoc);\n                zoomController.setHtmlBody(idoc.body, () => resizeHtmlBody?.());\n                ctx.toolbar?.refreshCommandSupport();\n\n                // Auto-adjust height to avoid double scrolling\n                const resize = () => {\n                  const body = idoc.body;\n                  const docEl = idoc.documentElement;\n                  const height = Math.max(\n                    body.scrollHeight,\n                    body.offsetHeight,\n                    docEl.clientHeight,\n                    docEl.scrollHeight,\n                    docEl.offsetHeight\n                  );\n                  iframe.style.height = `${height + 32}px`;\n                };\n                resizeHtmlBody = resize;\n\n                resize();\n                timersToClear.push(window.setTimeout(resize, 300));\n                timersToClear.push(window.setTimeout(resize, 1000));\n              }\n            } catch (err) {\n              console.error(\"Failed to write html body to email iframe:\", err);\n            }\n          };\n          iframe.addEventListener(\"load\", renderHtmlBody, { once: true });\n          bodySection.append(iframe);\n          renderHtmlBody();\n        } else {\n          // Render plain text body\n          const pre = document.createElement(\"pre\");\n          pre.className = \"ofv-text-block\";\n          pre.textContent = emailData.bodyText || \"未解析到正文。\";\n          bodySection.append(pre);\n        }\n\n      } catch (err: any) {\n        content.replaceChildren();\n        const errorSection = createSection(\"邮件解析出错\");\n        const pre = document.createElement(\"pre\");\n        pre.className = \"ofv-text-block\";\n        pre.style.color = \"#ef4444\";\n        pre.textContent = `解析邮件时发生错误：\\n${err.message || err}`;\n        errorSection.append(pre);\n        content.append(errorSection);\n      }\n\n      return {\n        canCommand(command) {\n          return zoomController.canCommand(command);\n        },\n        command(command) {\n          return zoomController.command(command);\n        },\n        destroy() {\n          timersToClear.forEach((timer) => window.clearTimeout(timer));\n          objectUrlsToRevoke.forEach((u) => {\n            URL.revokeObjectURL(u);\n          });\n          revokeObjectUrl(url, isExternal);\n          panel.remove();\n        }\n      };\n    }\n  };\n}\n\nfunction createEmailZoomController(panel: HTMLElement, content: HTMLElement, ctx: PreviewContext) {\n  let zoom = 1;\n  let htmlBody: HTMLElement | undefined;\n  let resizeHtmlBody: (() => void) | undefined;\n\n  const apply = () => {\n    const normalized = Math.round(zoom * 100) / 100;\n    // Scale the whole message (headers, attachments, body) via the CSS `zoom`\n    // property so the scaled size participates in layout and the panel scrolls.\n    // The width is pinned to the pre-zoom size first, otherwise the content\n    // keeps re-wrapping to the container instead of growing past it.\n    const style = content.style as CSSStyleDeclaration & { zoom: string };\n    style.zoom = \"\";\n    content.style.width = \"\";\n    if (normalized !== 1) {\n      const base = content.clientWidth;\n      if (base > 0) {\n        content.style.width = `${base}px`;\n      }\n      style.zoom = String(normalized);\n    }\n    if (htmlBody) {\n      resizeHtmlBody?.();\n      window.setTimeout(() => resizeHtmlBody?.(), 0);\n    }\n    ctx.toolbar?.setZoom(normalized === 1 ? undefined : normalized);\n  };\n\n  apply();\n\n  return {\n    setHtmlBody(body: HTMLElement, resize: () => void) {\n      htmlBody = body;\n      resizeHtmlBody = resize;\n      apply();\n    },\n    canCommand(command: PreviewCommand) {\n      return command === \"zoom-in\" || command === \"zoom-out\" || command === \"zoom-reset\";\n    },\n    command(command: PreviewCommand) {\n      if (command === \"zoom-in\") {\n        zoom = Math.min(3, zoom * 1.15);\n        apply();\n        return true;\n      }\n      if (command === \"zoom-out\") {\n        zoom = Math.max(0.5, zoom / 1.15);\n        apply();\n        return true;\n      }\n      if (command === \"zoom-reset\") {\n        zoom = 1;\n        apply();\n        return true;\n      }\n      return false;\n    }\n  };\n}\n\nfunction getAttachmentObjectUrl(\n  attachment: EmailAttachment,\n  cache: Map<EmailAttachment, string>,\n  urlsToRevoke: string[]\n): string {\n  const cached = cache.get(attachment);\n  if (cached) {\n    return cached;\n  }\n  const blob = new Blob([attachment.content as BlobPart], { type: attachment.mimeType });\n  const url = URL.createObjectURL(blob);\n  cache.set(attachment, url);\n  urlsToRevoke.push(url);\n  return url;\n}\n\nfunction getAttachmentMimeType(fullAttachment: unknown, attachmentMeta?: unknown): string {\n  const candidates = [fullAttachment, attachmentMeta];\n  for (const candidate of candidates) {\n    if (!candidate || typeof candidate !== \"object\") {\n      continue;\n    }\n    const record = candidate as Record<string, unknown>;\n    const explicitMime =\n      normalizeMimeValue(record.attachMimeTag) ||\n      normalizeMimeValue(record.mimeType) ||\n      normalizeMimeValue(record.contentType) ||\n      normalizeMimeValue(record.mime) ||\n      normalizeMimeValue(record[\"content-type\"]);\n    if (explicitMime) {\n      return explicitMime;\n    }\n  }\n\n  const fileName =\n    (fullAttachment && typeof fullAttachment === \"object\" ? (fullAttachment as { fileName?: unknown }).fileName : undefined) ||\n    (attachmentMeta && typeof attachmentMeta === \"object\" ? (attachmentMeta as { fileName?: unknown }).fileName : undefined);\n  return getMimeType(typeof fileName === \"string\" ? fileName : \"\");\n}\n\nfunction normalizeMimeValue(value: unknown): string {\n  if (typeof value !== \"string\") {\n    return \"\";\n  }\n  const mimeType = value.split(\";\")[0]?.trim().toLowerCase() || \"\";\n  return mimeType.includes(\"/\") ? mimeType : \"\";\n}\n\nfunction replaceCidResourceUrls(html: string, contentId: string, blobUrl: string): string {\n  const escapedCid = escapeRegExp(contentId);\n  return html.replace(\n    new RegExp(`\\\\b(src|poster|background)=([\"'])cid:${escapedCid}\\\\2`, \"gi\"),\n    (_match, attribute: string, quote: string) => `${attribute}=${quote}${blobUrl}${quote}`\n  );\n}\n\nfunction escapeRegExp(value: string): string {\n  return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction createMboxSummarySection(messages: MboxMessageSummary[]): HTMLElement {\n  const section = createSection(\"MBOX 邮箱摘要\");\n  hideSupplementalInfo(section);\n  const meta = document.createElement(\"div\");\n  meta.className = \"ofv-email-mbox-meta\";\n  appendMeta(meta, \"邮件数\", String(messages.length));\n  appendMeta(meta, \"预览\", \"当前正文显示第一封邮件\");\n\n  const tableWrap = document.createElement(\"div\");\n  tableWrap.className = \"ofv-table-scroll ofv-email-mbox-table\";\n  const table = document.createElement(\"table\");\n  const thead = document.createElement(\"thead\");\n  const header = document.createElement(\"tr\");\n  for (const label of [\"#\", \"Subject\", \"From\", \"Date\"]) {\n    const th = document.createElement(\"th\");\n    th.textContent = label;\n    header.append(th);\n  }\n  thead.append(header);\n  const tbody = document.createElement(\"tbody\");\n  messages.slice(0, 100).forEach((message, index) => {\n    const row = document.createElement(\"tr\");\n    for (const value of [String(index + 1), message.subject || \"(无主题)\", message.from || \"-\", message.date || \"-\"]) {\n      const cell = document.createElement(\"td\");\n      cell.textContent = value;\n      row.append(cell);\n    }\n    tbody.append(row);\n  });\n  table.append(thead, tbody);\n  tableWrap.append(table);\n  section.append(meta, tableWrap);\n  return section;\n}\n\nfunction hideSupplementalInfo(element: HTMLElement): void {\n  element.hidden = true;\n  element.setAttribute(\"aria-hidden\", \"true\");\n  element.style.display = \"none\";\n}\n\nfunction splitMboxMessages(mboxText: string): string[] {\n  const lines = mboxText.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n  const messages: string[][] = [];\n  let current: string[] | null = null;\n  let foundFirstFrom = false;\n\n  for (const line of lines) {\n    if (line.startsWith(\"From \")) {\n      if (current && current.length > 0) {\n        messages.push(current);\n      }\n      current = [];\n      foundFirstFrom = true;\n      continue;\n    }\n    if (foundFirstFrom && current) {\n      current.push(line.startsWith(\">From \") ? line.slice(1) : line);\n    }\n  }\n  if (current && current.length > 0) {\n    messages.push(current);\n  }\n  return messages.length > 0 ? messages.map((message) => message.join(\"\\n\")) : [mboxText];\n}\n\nfunction summarizeMboxMessage(message: string): MboxMessageSummary {\n  return {\n    from: unfoldHeader(readHeaderValue(message, \"From\")),\n    subject: unfoldHeader(readHeaderValue(message, \"Subject\")),\n    date: unfoldHeader(readHeaderValue(message, \"Date\"))\n  };\n}\n\nfunction readHeaderValue(message: string, name: string): string {\n  const headers = message.split(/\\n\\s*\\n/, 1)[0] || \"\";\n  const escaped = name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n  const match = headers.match(new RegExp(`^${escaped}:\\\\s*([\\\\s\\\\S]*?)(?=\\\\n[^\\\\s:]+:|\\\\n\\\\s*\\\\n|$)`, \"im\"));\n  return match?.[1]?.trim() || \"\";\n}\n\nfunction unfoldHeader(value: string): string {\n  return value.replace(/\\n[ \\t]+/g, \" \").trim();\n}\n\n// File extension to MIME type helper for attachment previews\nfunction getMimeType(name: string): string {\n  const ext = name.split(\".\").pop()?.toLowerCase();\n  const map: Record<string, string> = {\n    png: \"image/png\",\n    jpg: \"image/jpeg\",\n    jpeg: \"image/jpeg\",\n    gif: \"image/gif\",\n    webp: \"image/webp\",\n    svg: \"image/svg+xml\",\n    pdf: \"application/pdf\",\n    docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n    xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n    pptx: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n    txt: \"text/plain\",\n    md: \"text/markdown\",\n    html: \"text/html\",\n    mp4: \"video/mp4\",\n    mp3: \"audio/mpeg\",\n    wav: \"audio/wav\"\n  };\n  return ext ? map[ext] || \"application/octet-stream\" : \"application/octet-stream\";\n}\n\nfunction sanitizeEmailHtml(html: string, purifier: DOMPurifySanitizer): string {\n  return purifier.sanitize(html, {\n    USE_PROFILES: { html: true },\n    ADD_ATTR: [\"target\"],\n    ALLOWED_URI_REGEXP: /^(?:(?:https?|mailto|tel|blob|cid):|[^a-z]|[a-z+.-]+(?:[^a-z+.-:]|$))/i\n  });\n}\n\nfunction secureEmailLinks(document: Document): void {\n  for (const link of document.querySelectorAll<HTMLAnchorElement>(\"a[href]\")) {\n    const href = link.getAttribute(\"href\") || \"\";\n    if (!isSafeEmailHref(href)) {\n      link.removeAttribute(\"href\");\n      link.removeAttribute(\"target\");\n      link.removeAttribute(\"rel\");\n      continue;\n    }\n    if (/^(https?:)?\\/\\//i.test(href)) {\n      link.target = \"_blank\";\n      link.rel = \"noopener noreferrer\";\n    }\n  }\n}\n\nfunction isSafeEmailHref(href: string): boolean {\n  const trimmed = href.trim();\n  return (\n    trimmed.startsWith(\"#\") ||\n    trimmed.startsWith(\"/\") ||\n    trimmed.startsWith(\"./\") ||\n    trimmed.startsWith(\"../\") ||\n    trimmed.startsWith(\"blob:\") ||\n    /^(https?:|mailto:|tel:)/i.test(trimmed)\n  );\n}\n","import pako from \"pako\";\nimport type { PreviewCommand, PreviewContext, PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, readTextFile, resolveFormat } from \"./utils\";\n\nconst drawingExtensions = new Set([\"drawio\", \"dio\", \"excalidraw\", \"tldraw\"]);\nconst drawingMimeFormatMap: Record<string, string> = {\n  \"application/vnd.jgraph.mxfile\": \"drawio\",\n  \"application/vnd.excalidraw+json\": \"excalidraw\",\n  \"application/x-excalidraw+json\": \"excalidraw\"\n};\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\nexport function drawingPlugin(): PreviewPlugin {\n  return {\n    name: \"drawing\",\n    match(file) {\n      return drawingExtensions.has(file.extension) || Boolean(drawingMimeFormatMap[file.mimeType]);\n    },\n    async render(ctx) {\n      const panel = createPanel(\"ofv-drawing\");\n      ctx.viewport.append(panel);\n      const text = await readTextFile(ctx.file);\n      const extension = resolveFormat(ctx.file, drawingMimeFormatMap);\n\n      let controller: ReturnType<typeof createSvgViewportController> | undefined;\n      try {\n        if (extension === \"excalidraw\") {\n          renderExcalidraw(panel, text);\n        } else if (extension === \"tldraw\") {\n          renderTldraw(panel, text);\n        } else if (extension === \"drawio\" || extension === \"dio\") {\n          renderDrawio(panel, text);\n        } else {\n          renderRawDrawing(panel, extension || \"drawing\", text);\n        }\n        controller = createSvgViewportController(panel, ctx);\n      } catch (error) {\n        renderDrawingParseFallback(panel, extension || \"drawing\", text, error);\n      }\n\n      return {\n        canCommand(command) {\n          return controller?.canCommand(command) ?? false;\n        },\n        command(command) {\n          return controller?.command(command) ?? false;\n        },\n        destroy() {\n          controller?.destroy();\n          panel.remove();\n        }\n      };\n    }\n  };\n}\n\nfunction createSvgViewportController(\n  panel: HTMLElement,\n  ctx: Pick<PreviewContext, \"toolbar\">\n): {\n  canCommand: (command: PreviewCommand) => boolean;\n  command: (command: PreviewCommand) => boolean;\n  destroy: () => void;\n} | undefined {\n  const svg = panel.querySelector<SVGSVGElement>(\".ofv-svg-stage\");\n  const initialViewBox = parseSvgViewBox(svg);\n  if (!svg || !initialViewBox) {\n    return undefined;\n  }\n\n  let currentViewBox = { ...initialViewBox };\n  let rotation = 0;\n  const applyViewBox = () => {\n    svg.setAttribute(\n      \"viewBox\",\n      `${currentViewBox.x} ${currentViewBox.y} ${currentViewBox.width} ${currentViewBox.height}`\n    );\n    ctx.toolbar?.setZoom(initialViewBox.width / currentViewBox.width);\n  };\n  const applyRotation = () => {\n    svg.style.transformOrigin = \"center center\";\n    svg.style.transform = rotation === 0 ? \"\" : `rotate(${rotation}deg)`;\n  };\n  applyViewBox();\n\n  return {\n    canCommand(command) {\n      return (\n        command === \"zoom-in\" ||\n        command === \"zoom-out\" ||\n        command === \"zoom-reset\" ||\n        command === \"rotate-right\" ||\n        command === \"rotate-left\"\n      );\n    },\n    command(command) {\n      if (command === \"zoom-in\" || command === \"zoom-out\") {\n        const factor = command === \"zoom-in\" ? 0.82 : 1.18;\n        const centerX = currentViewBox.x + currentViewBox.width / 2;\n        const centerY = currentViewBox.y + currentViewBox.height / 2;\n        currentViewBox.width *= factor;\n        currentViewBox.height *= factor;\n        currentViewBox.x = centerX - currentViewBox.width / 2;\n        currentViewBox.y = centerY - currentViewBox.height / 2;\n        applyViewBox();\n        return true;\n      }\n      if (command === \"zoom-reset\") {\n        currentViewBox = { ...initialViewBox };\n        rotation = 0;\n        applyViewBox();\n        applyRotation();\n        return true;\n      }\n      if (command === \"rotate-right\" || command === \"rotate-left\") {\n        rotation += command === \"rotate-right\" ? 90 : -90;\n        applyRotation();\n        return true;\n      }\n      return false;\n    },\n    destroy() {\n      ctx.toolbar?.setZoom(undefined);\n    }\n  };\n}\n\nfunction parseSvgViewBox(svg: SVGSVGElement | null): { x: number; y: number; width: number; height: number } | undefined {\n  const parts = svg\n    ?.getAttribute(\"viewBox\")\n    ?.trim()\n    .split(/[\\s,]+/)\n    .map(Number);\n  if (!parts || parts.length !== 4 || parts.some((part) => !Number.isFinite(part)) || parts[2] <= 0 || parts[3] <= 0) {\n    return undefined;\n  }\n  return {\n    x: parts[0],\n    y: parts[1],\n    width: parts[2],\n    height: parts[3]\n  };\n}\n\ntype DrawingSummaryItem = {\n  type: string;\n  x?: number;\n  y?: number;\n  width?: number;\n  height?: number;\n  text?: string;\n  image?: boolean;\n  embed?: boolean;\n  edge?: boolean;\n};\n\nfunction createDrawingSummary(items: DrawingSummaryItem[]): HTMLElement {\n  const summary = document.createElement(\"div\");\n  summary.className = \"ofv-drawing-summary\";\n  summary.hidden = items.length > 0;\n  if (items.length > 0) {\n    summary.setAttribute(\"aria-hidden\", \"true\");\n    summary.style.display = \"none\";\n  }\n  const typeCounts = countDrawingTypes(items);\n  appendDrawingSummary(summary, \"对象\", String(items.length));\n  appendDrawingSummary(summary, \"类型\", formatDrawingTypes(typeCounts));\n  appendDrawingSummary(summary, \"文本\", String(items.filter((item) => item.text && item.text.trim()).length));\n  appendDrawingSummary(summary, \"连线\", String(items.filter((item) => item.edge).length));\n  const media = items.filter((item) => item.image || item.embed).length;\n  if (media > 0) {\n    appendDrawingSummary(summary, \"媒体/嵌入\", String(media));\n  }\n  const bounds = drawingBounds(items);\n  if (bounds) {\n    appendDrawingSummary(summary, \"范围\", `${Math.round(bounds[0])}, ${Math.round(bounds[1])}, ${Math.round(bounds[2])}, ${Math.round(bounds[3])}`);\n  }\n  return summary;\n}\n\nfunction appendDrawingSummary(parent: HTMLElement, label: string, value: string): void {\n  const item = document.createElement(\"span\");\n  const key = document.createElement(\"span\");\n  key.textContent = label;\n  const content = document.createElement(\"strong\");\n  content.textContent = value;\n  item.append(key, content);\n  parent.append(item);\n}\n\nfunction hideSuccessfulSectionHeading(section: HTMLElement): void {\n  const heading = section.querySelector<HTMLElement>(\"h3\");\n  if (heading) {\n    hideSupplementalInfo(heading);\n  }\n}\n\nfunction hideSupplementalInfo(element: HTMLElement): void {\n  element.hidden = true;\n  element.setAttribute(\"aria-hidden\", \"true\");\n  element.style.display = \"none\";\n}\n\nfunction countDrawingTypes(items: DrawingSummaryItem[]): Map<string, number> {\n  const counts = new Map<string, number>();\n  for (const item of items) {\n    counts.set(item.type, (counts.get(item.type) || 0) + 1);\n  }\n  return counts;\n}\n\nfunction formatDrawingTypes(counts: Map<string, number>): string {\n  return [...counts.entries()]\n    .sort((a, b) => b[1] - a[1])\n    .slice(0, 6)\n    .map(([type, count]) => `${type} ${count}`)\n    .join(\", \") || \"无\";\n}\n\nfunction drawingBounds(items: DrawingSummaryItem[]): [number, number, number, number] | undefined {\n  const boxes = items\n    .map((item) => {\n      if (!Number.isFinite(item.x) || !Number.isFinite(item.y)) {\n        return undefined;\n      }\n      const x = item.x as number;\n      const y = item.y as number;\n      const width = Math.max(0, finiteNumber(item.width, 0));\n      const height = Math.max(0, finiteNumber(item.height, 0));\n      return [x, y, x + width, y + height] as [number, number, number, number];\n    })\n    .filter((item): item is [number, number, number, number] => Boolean(item));\n  if (boxes.length === 0) {\n    return undefined;\n  }\n  return [\n    Math.min(...boxes.map((box) => box[0])),\n    Math.min(...boxes.map((box) => box[1])),\n    Math.max(...boxes.map((box) => box[2])),\n    Math.max(...boxes.map((box) => box[3]))\n  ];\n}\n\nfunction excalidrawSummaryItem(element: Record<string, unknown>): DrawingSummaryItem {\n  return {\n    type: String(element.type || \"unknown\"),\n    x: finiteNumber(element.x, 0),\n    y: finiteNumber(element.y, 0),\n    width: finiteNumber(element.width, 0),\n    height: finiteNumber(element.height, 0),\n    text: String(element.text || element.name || \"\"),\n    image: element.type === \"image\",\n    embed: element.type === \"embeddable\",\n    edge: element.type === \"arrow\" || element.type === \"line\"\n  };\n}\n\nfunction tldrawSummaryItem(shape: TldrawShape): DrawingSummaryItem {\n  const props = shape.props || {};\n  return {\n    type: String(shape.type || props.type || \"unknown\"),\n    x: finiteNumber(shape.x, 0),\n    y: finiteNumber(shape.y, 0),\n    width: finiteNumber(props.w, finiteNumber(props.width, 0)),\n    height: finiteNumber(props.h, finiteNumber(props.height, 0)),\n    text: String(props.text || \"\"),\n    edge: shape.type === \"arrow\" || shape.type === \"line\"\n  };\n}\n\nfunction drawioSummaryItem(shape: DrawioShape): DrawingSummaryItem {\n  return {\n    type: shape.edge ? \"edge\" : drawioShapeName(shape.style),\n    x: shape.x,\n    y: shape.y,\n    width: shape.width,\n    height: shape.height,\n    text: shape.value,\n    image: drawioShapeName(shape.style) === \"image\",\n    edge: shape.edge\n  };\n}\n\nfunction renderExcalidraw(panel: HTMLElement, text: string): void {\n  const data = JSON.parse(text) as {\n    elements?: Array<Record<string, unknown>>;\n    files?: Record<string, { dataURL?: string; mimeType?: string; id?: string }>;\n  };\n  const files = data.files || {};\n  const elements = (data.elements || []).filter((element) => !element.isDeleted);\n  const section = createSection(`Excalidraw ${elements.length} elements`);\n  if (elements.length > 0) {\n    hideSuccessfulSectionHeading(section);\n  }\n  section.append(createDrawingSummary(elements.map(excalidrawSummaryItem)));\n  const svg = document.createElementNS(SVG_NS, \"svg\");\n  svg.setAttribute(\"class\", \"ofv-svg-stage\");\n  svg.setAttribute(\"viewBox\", createExcalidrawViewBox(elements));\n  const defs = document.createElementNS(SVG_NS, \"defs\");\n  svg.append(defs);\n\n  for (const element of elements) {\n    const type = String(element.type || \"\");\n    const x = Number(element.x || 0);\n    const y = Number(element.y || 0);\n    const width = Number(element.width || 80);\n    const height = Number(element.height || 40);\n    const stroke = String(element.strokeColor || \"#111827\");\n    const fill = excalidrawFill(svg, defs, element, stroke);\n    const common = getExcalidrawCommonAttrs(element);\n    const transform = excalidrawTransform(element, x, y, width, height);\n\n    if (type === \"frame\") {\n      const frame = document.createElementNS(SVG_NS, \"rect\");\n      applySvgAttrs(frame, {\n        x,\n        y,\n        width,\n        height,\n        rx: 4,\n        fill: \"transparent\",\n        stroke: \"#94a3b8\",\n        \"stroke-width\": 2,\n        \"stroke-dasharray\": \"8 6\",\n        opacity: common.opacity,\n        transform\n      });\n      svg.append(frame);\n      appendSvgMultilineText(svg, String(element.name || \"Frame\"), x + 12, y + 24, \"#64748b\", {\n        fontSize: 14,\n        transform\n      });\n    } else if (type === \"image\") {\n      renderExcalidrawImage(svg, element, files, x, y, width, height, common, transform);\n    } else if (type === \"embeddable\") {\n      renderExcalidrawEmbeddable(svg, element, x, y, width, height, common, transform);\n    } else if (type === \"rectangle\" || type === \"diamond\") {\n      if (type === \"diamond\") {\n        const polygon = document.createElementNS(SVG_NS, \"polygon\");\n        polygon.setAttribute(\n          \"points\",\n          `${x + width / 2},${y} ${x + width},${y + height / 2} ${x + width / 2},${y + height} ${x},${y + height / 2}`\n        );\n        applySvgAttrs(polygon, { fill, stroke, ...common, transform });\n        svg.append(polygon);\n      } else {\n        const rect = document.createElementNS(SVG_NS, \"rect\");\n        applySvgAttrs(rect, {\n          x,\n          y,\n          width,\n          height,\n          rx: finiteNumber(element.roundness && typeof element.roundness === \"object\" ? (element.roundness as Record<string, unknown>).value : undefined, 0),\n          fill,\n          stroke,\n          ...common,\n          transform\n        });\n        svg.append(rect);\n      }\n    } else if (type === \"ellipse\") {\n      const ellipse = document.createElementNS(SVG_NS, \"ellipse\");\n      applySvgAttrs(ellipse, {\n        cx: x + width / 2,\n        cy: y + height / 2,\n        rx: Math.abs(width / 2),\n        ry: Math.abs(height / 2),\n        fill,\n        stroke,\n        ...common,\n        transform\n      });\n      svg.append(ellipse);\n    } else if (type === \"line\" || type === \"arrow\") {\n      const points = excalidrawPoints(element, x, y, width, height);\n      if (points.length > 2) {\n        const polyline = document.createElementNS(SVG_NS, \"polyline\");\n        applySvgAttrs(polyline, {\n          points: points.map((point) => `${point.x},${point.y}`).join(\" \"),\n          fill: \"none\",\n          stroke,\n          ...common,\n          transform\n        });\n        svg.append(polyline);\n        appendExcalidrawArrowHeads(svg, element, points, stroke);\n      } else {\n        const start = points[0] || { x, y };\n        const end = points[points.length - 1] || { x: x + width, y: y + height };\n        const line = document.createElementNS(SVG_NS, \"line\");\n        applySvgAttrs(line, {\n          x1: start.x,\n          y1: start.y,\n          x2: end.x,\n          y2: end.y,\n          stroke,\n          ...common,\n          transform\n        });\n        svg.append(line);\n        appendExcalidrawArrowHeads(svg, element, [start, end], stroke);\n      }\n    } else if (type === \"freedraw\") {\n      const path = createExcalidrawFreedrawPath(element, x, y);\n      if (path) {\n        applySvgAttrs(path, { fill: \"none\", stroke, ...common, transform });\n        svg.append(path);\n      }\n    } else if (type === \"text\") {\n      const fontSize = finiteNumber(element.fontSize, 18);\n      const lines = String(element.text || \"\").split(/\\r?\\n/);\n      const textAlign = String(element.textAlign || \"left\");\n      const verticalAlign = String(element.verticalAlign || \"top\");\n      const anchor = textAlign === \"center\" ? \"middle\" : textAlign === \"right\" ? \"end\" : \"start\";\n      const textX = textAlign === \"center\" ? x + width / 2 : textAlign === \"right\" ? x + width : x;\n      const textY =\n        verticalAlign === \"middle\"\n          ? y + height / 2 - ((lines.length - 1) * fontSize * 1.25) / 2\n          : verticalAlign === \"bottom\"\n            ? y + height - (lines.length - 1) * fontSize * 1.25\n            : y + fontSize;\n      appendSvgMultilineText(svg, String(element.text || \"\"), textX, textY, stroke, {\n        fontSize,\n        fontFamily: String(element.fontFamily || \"Inter, ui-sans-serif, system-ui, sans-serif\"),\n        anchor,\n        dominantBaseline: verticalAlign === \"middle\" ? \"middle\" : \"auto\",\n        opacity: common.opacity,\n        transform\n      });\n    }\n  }\n\n  section.append(svg);\n  panel.append(section);\n}\n\nfunction renderExcalidrawImage(\n  svg: SVGSVGElement,\n  element: Record<string, unknown>,\n  files: Record<string, { dataURL?: string; mimeType?: string; id?: string }>,\n  x: number,\n  y: number,\n  width: number,\n  height: number,\n  common: Record<string, string | number>,\n  transform: string\n): void {\n  const fileId = String(element.fileId || \"\");\n  const file = fileId ? files[fileId] : undefined;\n  const dataUrl = file?.dataURL || \"\";\n  if (isSafeExcalidrawImageDataUrl(dataUrl)) {\n    const image = document.createElementNS(SVG_NS, \"image\");\n    applySvgAttrs(image, {\n      x,\n      y,\n      width,\n      height,\n      href: dataUrl,\n      preserveAspectRatio: \"xMidYMid meet\",\n      opacity: common.opacity,\n      transform\n    });\n    svg.append(image);\n    return;\n  }\n\n  const rect = document.createElementNS(SVG_NS, \"rect\");\n  applySvgAttrs(rect, {\n    x,\n    y,\n    width,\n    height,\n    rx: 8,\n    fill: \"#f8fafc\",\n    stroke: \"#94a3b8\",\n    \"stroke-width\": 1.5,\n    \"stroke-dasharray\": \"6 4\",\n    opacity: common.opacity,\n    transform\n  });\n  svg.append(rect);\n  appendSvgMultilineText(svg, fileId ? `Image\\n${fileId}` : \"Image\", x + width / 2, y + height / 2 - 8, \"#64748b\", {\n    fontSize: 13,\n    anchor: \"middle\",\n    transform\n  });\n}\n\nfunction renderExcalidrawEmbeddable(\n  svg: SVGSVGElement,\n  element: Record<string, unknown>,\n  x: number,\n  y: number,\n  width: number,\n  height: number,\n  common: Record<string, string | number>,\n  transform: string\n): void {\n  const rect = document.createElementNS(SVG_NS, \"rect\");\n  applySvgAttrs(rect, {\n    x,\n    y,\n    width,\n    height,\n    rx: 10,\n    fill: \"#eef2ff\",\n    stroke: \"#6366f1\",\n    \"stroke-width\": 1.5,\n    \"stroke-dasharray\": \"8 5\",\n    opacity: common.opacity,\n    transform\n  });\n  svg.append(rect);\n  const link = String(element.link || element.url || \"Embedded content\");\n  appendSvgMultilineText(svg, `Embed\\n${shortenText(link, 48)}`, x + width / 2, y + height / 2 - 10, \"#4338ca\", {\n    fontSize: 13,\n    anchor: \"middle\",\n    transform\n  });\n}\n\nfunction appendSvgMultilineText(\n  svg: SVGSVGElement,\n  text: string,\n  x: number,\n  y: number,\n  fill: string,\n  options: {\n    fontSize?: number;\n    fontFamily?: string;\n    anchor?: string;\n    dominantBaseline?: string;\n    opacity?: string | number;\n    transform?: string;\n  } = {}\n): SVGTextElement {\n  const textNode = document.createElementNS(SVG_NS, \"text\");\n  applySvgAttrs(textNode, {\n    x,\n    y,\n    fill,\n    \"font-size\": options.fontSize || 18,\n    \"font-family\": options.fontFamily || \"Inter, ui-sans-serif, system-ui, sans-serif\",\n    \"text-anchor\": options.anchor,\n    \"dominant-baseline\": options.dominantBaseline,\n    opacity: options.opacity,\n    transform: options.transform\n  });\n  for (const [index, line] of text.split(/\\r?\\n/).entries()) {\n    const span = document.createElementNS(SVG_NS, \"tspan\");\n    span.setAttribute(\"x\", String(x));\n    span.setAttribute(\"dy\", index === 0 ? \"0\" : \"1.25em\");\n    span.textContent = line;\n    textNode.append(span);\n  }\n  svg.append(textNode);\n  return textNode;\n}\n\nfunction isSafeExcalidrawImageDataUrl(value: string): boolean {\n  return /^data:image\\/(?:png|jpe?g|gif|webp|bmp);base64,/i.test(value);\n}\n\nfunction shortenText(value: string, maxLength: number): string {\n  return value.length > maxLength ? `${value.slice(0, Math.max(0, maxLength - 3))}...` : value;\n}\n\nfunction createExcalidrawViewBox(elements: Array<Record<string, unknown>>): string {\n  if (elements.length === 0) {\n    return \"0 0 1200 800\";\n  }\n  const bounds = elements.map((element) => {\n    const x = finiteNumber(element.x, 0);\n    const y = finiteNumber(element.y, 0);\n    const points = Array.isArray(element.points) ? element.points.map((point) => pointFromValue(point, { x: 0, y: 0 })) : [];\n    const width = Math.max(1, finiteNumber(element.width, Math.max(80, ...points.map((point) => point.x))));\n    const height = Math.max(1, finiteNumber(element.height, Math.max(40, ...points.map((point) => point.y))));\n    return { x, y, width, height };\n  });\n  const minX = Math.min(...bounds.map((bound) => bound.x)) - 40;\n  const minY = Math.min(...bounds.map((bound) => bound.y)) - 40;\n  const maxX = Math.max(...bounds.map((bound) => bound.x + bound.width)) + 40;\n  const maxY = Math.max(...bounds.map((bound) => bound.y + bound.height)) + 40;\n  return `${minX} ${minY} ${Math.max(320, maxX - minX)} ${Math.max(240, maxY - minY)}`;\n}\n\nfunction getExcalidrawCommonAttrs(element: Record<string, unknown>): Record<string, string | number> {\n  const strokeWidth = finiteNumber(element.strokeWidth, 1.5);\n  const opacity = Math.max(0, Math.min(1, finiteNumber(element.opacity, 100) / 100));\n  const style = String(element.strokeStyle || \"solid\");\n  return {\n    \"stroke-width\": strokeWidth,\n    \"stroke-linecap\": \"round\",\n    \"stroke-linejoin\": \"round\",\n    \"stroke-dasharray\": style === \"dashed\" ? `${strokeWidth * 6} ${strokeWidth * 4}` : style === \"dotted\" ? `${strokeWidth} ${strokeWidth * 4}` : \"\",\n    opacity\n  };\n}\n\nfunction excalidrawFill(\n  svg: SVGSVGElement,\n  defs: SVGDefsElement,\n  element: Record<string, unknown>,\n  stroke: string\n): string {\n  const value = String(element.backgroundColor || \"transparent\");\n  if (!value || value === \"transparent\") {\n    return \"transparent\";\n  }\n  const fillStyle = String(element.fillStyle || \"solid\");\n  if (fillStyle === \"solid\") {\n    return value;\n  }\n  const id = `ofv-excalidraw-${fillStyle}-${defs.children.length}`;\n  const pattern = document.createElementNS(SVG_NS, \"pattern\");\n  applySvgAttrs(pattern, {\n    id,\n    width: 10,\n    height: 10,\n    patternUnits: \"userSpaceOnUse\"\n  });\n  const background = document.createElementNS(SVG_NS, \"rect\");\n  applySvgAttrs(background, { width: 10, height: 10, fill: value, opacity: 0.35 });\n  pattern.append(background);\n  if (fillStyle === \"cross-hatch\") {\n    pattern.append(createPatternLine(svg, \"M 0 10 L 10 0\", stroke));\n    pattern.append(createPatternLine(svg, \"M 0 0 L 10 10\", stroke));\n  } else if (fillStyle === \"dots\") {\n    const dot = document.createElementNS(SVG_NS, \"circle\");\n    applySvgAttrs(dot, { cx: 5, cy: 5, r: 1.2, fill: stroke, opacity: 0.48 });\n    pattern.append(dot);\n  } else {\n    pattern.append(createPatternLine(svg, \"M 0 10 L 10 0\", stroke));\n  }\n  defs.append(pattern);\n  return `url(#${id})`;\n}\n\nfunction createPatternLine(svg: SVGSVGElement, d: string, stroke: string): SVGPathElement {\n  const path = document.createElementNS(SVG_NS, \"path\");\n  applySvgAttrs(path, {\n    d,\n    stroke,\n    \"stroke-width\": 1,\n    \"stroke-linecap\": \"round\",\n    opacity: 0.42\n  });\n  return path;\n}\n\nfunction excalidrawTransform(\n  element: Record<string, unknown>,\n  x: number,\n  y: number,\n  width: number,\n  height: number\n): string {\n  const angle = finiteNumber(element.angle, 0);\n  if (!angle) {\n    return \"\";\n  }\n  return `rotate(${(angle * 180) / Math.PI} ${x + width / 2} ${y + height / 2})`;\n}\n\nfunction excalidrawPoints(\n  element: Record<string, unknown>,\n  x: number,\n  y: number,\n  width: number,\n  height: number\n): Array<{ x: number; y: number }> {\n  if (!Array.isArray(element.points)) {\n    return [\n      { x, y },\n      { x: x + width, y: y + height }\n    ];\n  }\n  return element.points.map((point) => {\n    const parsed = pointFromValue(point, { x: 0, y: 0 });\n    return { x: x + parsed.x, y: y + parsed.y };\n  });\n}\n\nfunction createExcalidrawFreedrawPath(element: Record<string, unknown>, x: number, y: number): SVGPathElement | null {\n  const points = excalidrawPoints(element, x, y, 0, 0);\n  if (points.length < 2) {\n    return null;\n  }\n  const path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n  path.setAttribute(\n    \"d\",\n    points\n      .map((point, index) => `${index === 0 ? \"M\" : \"L\"} ${point.x} ${point.y}`)\n      .join(\" \")\n  );\n  return path;\n}\n\nfunction appendExcalidrawArrowHeads(\n  svg: SVGSVGElement,\n  element: Record<string, unknown>,\n  points: Array<{ x: number; y: number }>,\n  stroke: string\n): void {\n  if (String(element.type || \"\") !== \"arrow\" || points.length < 2) {\n    return;\n  }\n  const startHead = String(element.startArrowhead || \"\");\n  const endHead = String(element.endArrowhead || \"arrow\");\n  if (startHead && startHead !== \"none\") {\n    appendArrowHead(svg, points[1].x, points[1].y, points[0].x, points[0].y, stroke, startHead);\n  }\n  if (endHead && endHead !== \"none\") {\n    const previous = points[points.length - 2];\n    const end = points[points.length - 1];\n    appendArrowHead(svg, previous.x, previous.y, end.x, end.y, stroke, endHead);\n  }\n}\n\nfunction applySvgAttrs(element: SVGElement, attributes: Record<string, string | number | undefined>): void {\n  for (const [key, value] of Object.entries(attributes)) {\n    if (value === undefined || value === \"\") {\n      continue;\n    }\n    element.setAttribute(key, String(value));\n  }\n}\n\ntype TldrawShape = Record<string, unknown> & {\n  props?: Record<string, unknown>;\n};\n\nfunction renderTldraw(panel: HTMLElement, text: string): void {\n  const data = JSON.parse(text) as unknown;\n  const shapes = extractTldrawShapes(data);\n  const section = createSection(`tldraw 基础预览 ${shapes.length} shapes`);\n  if (shapes.length > 0) {\n    hideSuccessfulSectionHeading(section);\n  }\n  section.append(createDrawingSummary(shapes.map(tldrawSummaryItem)));\n  const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n  svg.setAttribute(\"class\", \"ofv-svg-stage\");\n  svg.setAttribute(\"viewBox\", createTldrawViewBox(shapes));\n\n  if (shapes.length === 0) {\n    const empty = document.createElementNS(svg.namespaceURI, \"text\");\n    empty.setAttribute(\"x\", \"24\");\n    empty.setAttribute(\"y\", \"40\");\n    empty.setAttribute(\"fill\", \"#64748b\");\n    empty.textContent = \"未解析到可展示的 tldraw 图形。\";\n    svg.append(empty);\n  } else {\n    for (const shape of shapes) {\n      renderTldrawShape(svg, shape);\n    }\n  }\n\n  section.append(svg);\n  panel.append(section);\n}\n\nfunction extractTldrawShapes(data: unknown): TldrawShape[] {\n  if (!data || typeof data !== \"object\") {\n    return [];\n  }\n  const source = data as Record<string, unknown>;\n  const candidates: unknown[] = [];\n  if (Array.isArray(source.records)) {\n    candidates.push(...source.records);\n  }\n  if (Array.isArray(source.shapes)) {\n    candidates.push(...source.shapes);\n  }\n  if (source.store && typeof source.store === \"object\") {\n    candidates.push(...Object.values(source.store as Record<string, unknown>));\n  }\n  if (source.document && typeof source.document === \"object\") {\n    const documentRecord = source.document as Record<string, unknown>;\n    if (Array.isArray(documentRecord.shapes)) {\n      candidates.push(...documentRecord.shapes);\n    }\n  }\n\n  return candidates.filter((item): item is TldrawShape => {\n    if (!item || typeof item !== \"object\") {\n      return false;\n    }\n    const record = item as Record<string, unknown>;\n    return record.typeName === \"shape\" || String(record.id || \"\").startsWith(\"shape:\");\n  });\n}\n\nfunction renderTldrawShape(svg: SVGSVGElement, shape: TldrawShape): void {\n  const props = shape.props || {};\n  const type = String(shape.type || props.type || \"\");\n  const x = finiteNumber(shape.x, 0);\n  const y = finiteNumber(shape.y, 0);\n  const width = Math.max(1, finiteNumber(props.w, finiteNumber(props.width, 120)));\n  const height = Math.max(1, finiteNumber(props.h, finiteNumber(props.height, 80)));\n  const stroke = tldrawColor(String(props.color || shape.color || \"black\"));\n  const fill = tldrawFill(String(props.fill || \"none\"), stroke);\n\n  if (type === \"geo\" || type === \"frame\" || type === \"highlight\") {\n    const geo = String(props.geo || (type === \"frame\" ? \"rectangle\" : \"rectangle\"));\n    if (geo === \"ellipse\" || geo === \"oval\") {\n      const ellipse = document.createElementNS(svg.namespaceURI, \"ellipse\");\n      ellipse.setAttribute(\"cx\", String(x + width / 2));\n      ellipse.setAttribute(\"cy\", String(y + height / 2));\n      ellipse.setAttribute(\"rx\", String(width / 2));\n      ellipse.setAttribute(\"ry\", String(height / 2));\n      ellipse.setAttribute(\"fill\", fill);\n      ellipse.setAttribute(\"stroke\", stroke);\n      ellipse.setAttribute(\"stroke-width\", \"2\");\n      svg.append(ellipse);\n    } else if (geo === \"diamond\") {\n      const polygon = document.createElementNS(svg.namespaceURI, \"polygon\");\n      polygon.setAttribute(\n        \"points\",\n        `${x + width / 2},${y} ${x + width},${y + height / 2} ${x + width / 2},${y + height} ${x},${y + height / 2}`\n      );\n      polygon.setAttribute(\"fill\", fill);\n      polygon.setAttribute(\"stroke\", stroke);\n      polygon.setAttribute(\"stroke-width\", \"2\");\n      svg.append(polygon);\n    } else if (geo === \"triangle\") {\n      const polygon = document.createElementNS(svg.namespaceURI, \"polygon\");\n      polygon.setAttribute(\"points\", `${x + width / 2},${y} ${x + width},${y + height} ${x},${y + height}`);\n      polygon.setAttribute(\"fill\", fill);\n      polygon.setAttribute(\"stroke\", stroke);\n      polygon.setAttribute(\"stroke-width\", \"2\");\n      svg.append(polygon);\n    } else {\n      const rect = document.createElementNS(svg.namespaceURI, \"rect\");\n      rect.setAttribute(\"x\", String(x));\n      rect.setAttribute(\"y\", String(y));\n      rect.setAttribute(\"width\", String(width));\n      rect.setAttribute(\"height\", String(height));\n      rect.setAttribute(\"rx\", type === \"frame\" ? \"0\" : \"8\");\n      rect.setAttribute(\"fill\", fill);\n      rect.setAttribute(\"stroke\", stroke);\n      rect.setAttribute(\"stroke-width\", \"2\");\n      svg.append(rect);\n    }\n    appendTldrawText(svg, String(props.text || \"\"), x + 12, y + 24, stroke);\n  } else if (type === \"text\" || type === \"note\") {\n    if (type === \"note\") {\n      const note = document.createElementNS(svg.namespaceURI, \"rect\");\n      note.setAttribute(\"x\", String(x));\n      note.setAttribute(\"y\", String(y));\n      note.setAttribute(\"width\", String(width));\n      note.setAttribute(\"height\", String(height));\n      note.setAttribute(\"rx\", \"6\");\n      note.setAttribute(\"fill\", tldrawColor(String(props.color || \"yellow\"), 0.24));\n      note.setAttribute(\"stroke\", stroke);\n      svg.append(note);\n    }\n    appendTldrawText(svg, String(props.text || \"\"), x, y + 18, stroke);\n  } else if (type === \"arrow\" || type === \"line\") {\n    renderTldrawLine(svg, shape, stroke);\n  } else if (type === \"draw\") {\n    renderTldrawDraw(svg, shape, stroke);\n  } else {\n    const rect = document.createElementNS(svg.namespaceURI, \"rect\");\n    rect.setAttribute(\"x\", String(x));\n    rect.setAttribute(\"y\", String(y));\n    rect.setAttribute(\"width\", String(width));\n    rect.setAttribute(\"height\", String(height));\n    rect.setAttribute(\"fill\", \"transparent\");\n    rect.setAttribute(\"stroke\", stroke);\n    rect.setAttribute(\"stroke-dasharray\", \"6 4\");\n    svg.append(rect);\n    appendTldrawText(svg, type || \"shape\", x + 8, y + 20, stroke);\n  }\n}\n\nfunction renderTldrawLine(svg: SVGSVGElement, shape: TldrawShape, stroke: string): void {\n  const props = shape.props || {};\n  const x = finiteNumber(shape.x, 0);\n  const y = finiteNumber(shape.y, 0);\n  const start = pointFromValue(props.start, { x: 0, y: 0 });\n  const end = pointFromValue(props.end, {\n    x: finiteNumber(props.w, finiteNumber(props.width, 120)),\n    y: finiteNumber(props.h, finiteNumber(props.height, 0))\n  });\n  const line = document.createElementNS(svg.namespaceURI, \"line\");\n  line.setAttribute(\"x1\", String(x + start.x));\n  line.setAttribute(\"y1\", String(y + start.y));\n  line.setAttribute(\"x2\", String(x + end.x));\n  line.setAttribute(\"y2\", String(y + end.y));\n  line.setAttribute(\"stroke\", stroke);\n  line.setAttribute(\"stroke-width\", \"3\");\n  line.setAttribute(\"stroke-linecap\", \"round\");\n  svg.append(line);\n  if (String(shape.type || \"\") === \"arrow\") {\n    appendArrowHead(svg, x + start.x, y + start.y, x + end.x, y + end.y, stroke);\n  }\n}\n\nfunction renderTldrawDraw(svg: SVGSVGElement, shape: TldrawShape, stroke: string): void {\n  const props = shape.props || {};\n  const x = finiteNumber(shape.x, 0);\n  const y = finiteNumber(shape.y, 0);\n  const points = extractTldrawDrawPoints(props.segments);\n  if (points.length < 2) {\n    return;\n  }\n  const polyline = document.createElementNS(svg.namespaceURI, \"polyline\");\n  polyline.setAttribute(\"points\", points.map((point) => `${x + point.x},${y + point.y}`).join(\" \"));\n  polyline.setAttribute(\"fill\", \"none\");\n  polyline.setAttribute(\"stroke\", stroke);\n  polyline.setAttribute(\"stroke-width\", \"3\");\n  polyline.setAttribute(\"stroke-linecap\", \"round\");\n  polyline.setAttribute(\"stroke-linejoin\", \"round\");\n  svg.append(polyline);\n}\n\nfunction appendTldrawText(svg: SVGSVGElement, text: string, x: number, y: number, fill: string): void {\n  if (!text.trim()) {\n    return;\n  }\n  const textNode = document.createElementNS(svg.namespaceURI, \"text\");\n  textNode.setAttribute(\"x\", String(x));\n  textNode.setAttribute(\"y\", String(y));\n  textNode.setAttribute(\"fill\", fill);\n  textNode.setAttribute(\"font-size\", \"16\");\n  textNode.setAttribute(\"font-family\", \"Inter, ui-sans-serif, system-ui, sans-serif\");\n  for (const [index, line] of text.split(/\\r?\\n/).entries()) {\n    const span = document.createElementNS(svg.namespaceURI, \"tspan\");\n    span.setAttribute(\"x\", String(x));\n    span.setAttribute(\"dy\", index === 0 ? \"0\" : \"1.3em\");\n    span.textContent = line;\n    textNode.append(span);\n  }\n  svg.append(textNode);\n}\n\nfunction appendArrowHead(\n  svg: SVGSVGElement,\n  x1: number,\n  y1: number,\n  x2: number,\n  y2: number,\n  fill: string,\n  type = \"arrow\"\n): void {\n  const angle = Math.atan2(y2 - y1, x2 - x1);\n  const size = 10;\n  if (type === \"bar\") {\n    const line = document.createElementNS(SVG_NS, \"line\");\n    const dx = Math.sin(angle) * size * 0.65;\n    const dy = Math.cos(angle) * size * 0.65;\n    applySvgAttrs(line, {\n      x1: x2 - dx,\n      y1: y2 + dy,\n      x2: x2 + dx,\n      y2: y2 - dy,\n      stroke: fill,\n      \"stroke-width\": 2,\n      \"stroke-linecap\": \"round\"\n    });\n    svg.append(line);\n    return;\n  }\n  if (type === \"dot\" || type === \"circle\") {\n    const circle = document.createElementNS(SVG_NS, \"circle\");\n    applySvgAttrs(circle, { cx: x2, cy: y2, r: size * 0.42, fill });\n    svg.append(circle);\n    return;\n  }\n  const points = [\n    [x2, y2],\n    [x2 - size * Math.cos(angle - Math.PI / 6), y2 - size * Math.sin(angle - Math.PI / 6)],\n    [x2 - size * Math.cos(angle + Math.PI / 6), y2 - size * Math.sin(angle + Math.PI / 6)]\n  ];\n  const polygon = document.createElementNS(svg.namespaceURI, \"polygon\");\n  polygon.setAttribute(\"points\", points.map((point) => point.join(\",\")).join(\" \"));\n  polygon.setAttribute(\"fill\", type === \"triangle_outline\" || type === \"arrow_outline\" ? \"transparent\" : fill);\n  polygon.setAttribute(\"stroke\", fill);\n  svg.append(polygon);\n}\n\nfunction createTldrawViewBox(shapes: TldrawShape[]): string {\n  if (shapes.length === 0) {\n    return \"0 0 800 500\";\n  }\n  const bounds = shapes.map((shape) => {\n    const props = shape.props || {};\n    const x = finiteNumber(shape.x, 0);\n    const y = finiteNumber(shape.y, 0);\n    const width = Math.max(1, finiteNumber(props.w, finiteNumber(props.width, 120)));\n    const height = Math.max(1, finiteNumber(props.h, finiteNumber(props.height, 80)));\n    return { x, y, width, height };\n  });\n  const minX = Math.min(...bounds.map((bound) => bound.x)) - 40;\n  const minY = Math.min(...bounds.map((bound) => bound.y)) - 40;\n  const maxX = Math.max(...bounds.map((bound) => bound.x + bound.width)) + 40;\n  const maxY = Math.max(...bounds.map((bound) => bound.y + bound.height)) + 40;\n  return `${minX} ${minY} ${Math.max(240, maxX - minX)} ${Math.max(180, maxY - minY)}`;\n}\n\nfunction extractTldrawDrawPoints(value: unknown): Array<{ x: number; y: number }> {\n  if (!Array.isArray(value)) {\n    return [];\n  }\n  return value.flatMap((segment) => {\n    if (!segment || typeof segment !== \"object\") {\n      return [];\n    }\n    const points = (segment as Record<string, unknown>).points;\n    if (!Array.isArray(points)) {\n      return [];\n    }\n    return points.map((point) => pointFromValue(point, { x: 0, y: 0 }));\n  });\n}\n\nfunction pointFromValue(value: unknown, fallback: { x: number; y: number }): { x: number; y: number } {\n  if (Array.isArray(value)) {\n    return {\n      x: finiteNumber(value[0], fallback.x),\n      y: finiteNumber(value[1], fallback.y)\n    };\n  }\n  if (!value || typeof value !== \"object\") {\n    return fallback;\n  }\n  const point = value as Record<string, unknown>;\n  return {\n    x: finiteNumber(point.x, fallback.x),\n    y: finiteNumber(point.y, fallback.y)\n  };\n}\n\nfunction finiteNumber(value: unknown, fallback: number): number {\n  const parsed = typeof value === \"number\" ? value : Number(value);\n  return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nfunction tldrawFill(fill: string, stroke: string): string {\n  return fill === \"solid\" || fill === \"semi\" || fill === \"pattern\" ? tldrawColor(stroke, 0.14) : \"transparent\";\n}\n\nfunction tldrawColor(value: string, alpha = 1): string {\n  const colors: Record<string, [number, number, number]> = {\n    black: [17, 24, 39],\n    grey: [100, 116, 139],\n    light: [203, 213, 225],\n    red: [220, 38, 38],\n    orange: [234, 88, 12],\n    yellow: [202, 138, 4],\n    green: [22, 163, 74],\n    blue: [37, 99, 235],\n    violet: [124, 58, 237],\n    purple: [147, 51, 234],\n    pink: [219, 39, 119]\n  };\n  if (value.startsWith(\"#\") || value.startsWith(\"rgb\")) {\n    return value;\n  }\n  const color = colors[value] || colors.black;\n  return alpha >= 1 ? `rgb(${color.join(\" \")})` : `rgb(${color.join(\" \")} / ${alpha})`;\n}\n\nfunction renderDrawio(panel: HTMLElement, text: string): void {\n  const diagrams = extractDrawioDiagrams(text);\n  if (diagrams.length === 0) {\n    renderRawDrawing(panel, \"Draw.io\", text);\n    return;\n  }\n\n  for (const [index, diagram] of diagrams.entries()) {\n    const section = createSection(`Draw.io 图形预览 ${index + 1}`);\n    const shapes = parseDrawioShapes(diagram);\n    if (shapes.length > 0) {\n      hideSuccessfulSectionHeading(section);\n      section.append(createDrawingSummary(shapes.map(drawioSummaryItem)));\n      const svg = document.createElementNS(SVG_NS, \"svg\");\n      svg.setAttribute(\"class\", \"ofv-svg-stage\");\n      svg.setAttribute(\"viewBox\", createDrawioViewBox(shapes));\n      for (const shape of shapes) {\n        renderDrawioShape(svg, shape);\n      }\n      section.append(svg);\n    }\n\n    const details = document.createElement(\"details\");\n    details.className = \"ofv-details\";\n    const summary = document.createElement(\"summary\");\n    summary.textContent = shapes.length > 0 ? `原始 XML 摘要（${shapes.length} cells）` : \"Draw.io 原始内容\";\n    const pre = document.createElement(\"pre\");\n    pre.className = \"ofv-text-block\";\n    pre.textContent = diagram.slice(0, 30000);\n    details.append(summary, pre);\n    if (shapes.length > 0) {\n      details.hidden = true;\n      details.setAttribute(\"aria-hidden\", \"true\");\n      details.style.display = \"none\";\n    }\n    section.append(details);\n    panel.append(section);\n  }\n}\n\ntype DrawioShape = {\n  id: string;\n  value: string;\n  style: Record<string, string>;\n  vertex: boolean;\n  edge: boolean;\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n  source?: string;\n  target?: string;\n  points?: Array<{ x: number; y: number }>;\n};\n\nfunction extractDrawioDiagrams(text: string): string[] {\n  const matches = [...text.matchAll(/<diagram[^>]*>([\\s\\S]*?)<\\/diagram>/g)].map((match) => decodeDrawioDiagram(match[1] || \"\"));\n  if (matches.length > 0) {\n    return matches;\n  }\n  return text.includes(\"<mxGraphModel\") ? [text] : [];\n}\n\nfunction parseDrawioShapes(xml: string): DrawioShape[] {\n  const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n  if (doc.querySelector(\"parsererror\")) {\n    return [];\n  }\n  return Array.from(doc.querySelectorAll(\"mxCell\")).flatMap((cell) => {\n    const geometry = Array.from(cell.children).find((child) => child.localName === \"mxGeometry\");\n    const vertex = cell.getAttribute(\"vertex\") === \"1\";\n    const edge = cell.getAttribute(\"edge\") === \"1\";\n    if (!vertex && !edge) {\n      return [];\n    }\n    const shape: DrawioShape = {\n      id: cell.getAttribute(\"id\") || \"\",\n      value: decodeXmlText(cell.getAttribute(\"value\") || \"\"),\n      style: parseDrawioStyle(cell.getAttribute(\"style\") || \"\"),\n      vertex,\n      edge,\n      x: finiteNumber(geometry?.getAttribute(\"x\"), 0),\n      y: finiteNumber(geometry?.getAttribute(\"y\"), 0),\n      width: Math.max(1, finiteNumber(geometry?.getAttribute(\"width\"), 120)),\n      height: Math.max(1, finiteNumber(geometry?.getAttribute(\"height\"), edge ? 1 : 60)),\n      source: cell.getAttribute(\"source\") || undefined,\n      target: cell.getAttribute(\"target\") || undefined\n    };\n\n    if (edge && geometry) {\n      const points = Array.from(geometry.children)\n        .filter((child) => child.localName === \"mxPoint\")\n        .map((point) => ({\n          x: finiteNumber(point.getAttribute(\"x\"), 0),\n          y: finiteNumber(point.getAttribute(\"y\"), 0)\n        }));\n      if (points.length >= 2) {\n        shape.x = points[0].x;\n        shape.y = points[0].y;\n        shape.width = points[points.length - 1].x - points[0].x;\n        shape.height = points[points.length - 1].y - points[0].y;\n        shape.points = points;\n      }\n    }\n    return [shape];\n  });\n}\n\nfunction parseDrawioStyle(style: string): Record<string, string> {\n  const result: Record<string, string> = {};\n  const imageMatch = style.match(/(?:^|;)image=(data:image\\/[^;]+;base64,[^;]+)/i);\n  const protectedStyle = imageMatch ? style.replace(imageMatch[0], imageMatch[0].startsWith(\";\") ? \";image=__OFV_IMAGE__\" : \"image=__OFV_IMAGE__\") : style;\n  for (const part of protectedStyle.split(\";\")) {\n    if (!part) {\n      continue;\n    }\n    const separator = part.indexOf(\"=\");\n    const key = separator >= 0 ? part.slice(0, separator) : part;\n    const value = separator >= 0 ? part.slice(separator + 1) : \"1\";\n    if (key) {\n      result[key] = value === \"__OFV_IMAGE__\" && imageMatch ? imageMatch[1] : value;\n    }\n  }\n  return result;\n}\n\nfunction createDrawioViewBox(shapes: DrawioShape[]): string {\n  const bounds = shapes.map((shape) => ({\n    x: Math.min(shape.x, shape.x + shape.width),\n    y: Math.min(shape.y, shape.y + shape.height),\n    width: Math.abs(shape.width),\n    height: Math.abs(shape.height)\n  }));\n  const minX = Math.min(...bounds.map((bound) => bound.x)) - 40;\n  const minY = Math.min(...bounds.map((bound) => bound.y)) - 40;\n  const maxX = Math.max(...bounds.map((bound) => bound.x + bound.width)) + 40;\n  const maxY = Math.max(...bounds.map((bound) => bound.y + bound.height)) + 40;\n  return `${minX} ${minY} ${Math.max(320, maxX - minX)} ${Math.max(240, maxY - minY)}`;\n}\n\nfunction renderDrawioShape(svg: SVGSVGElement, shape: DrawioShape): void {\n  const stroke = drawioColor(shape.style.strokeColor, \"#334155\");\n  const fill = shape.style.fillColor === \"none\" ? \"transparent\" : drawioColor(shape.style.fillColor, \"#f8fafc\");\n  const strokeWidth = finiteNumber(shape.style.strokeWidth, 1.5);\n  const opacity = Math.max(0, Math.min(1, finiteNumber(shape.style.opacity, 100) / 100));\n  const strokeAttrs = drawioStrokeAttrs(shape.style, strokeWidth);\n  const transform = drawioTransform(shape);\n\n  if (shape.edge) {\n    const points = shape.points || [\n      { x: shape.x, y: shape.y },\n      { x: shape.x + shape.width, y: shape.y + shape.height }\n    ];\n    if (points.length > 2) {\n      const polyline = document.createElementNS(SVG_NS, \"polyline\");\n      applySvgAttrs(polyline, {\n        points: points.map((point) => `${point.x},${point.y}`).join(\" \"),\n        fill: \"none\",\n        stroke,\n        ...strokeAttrs,\n        \"stroke-linecap\": \"round\",\n        \"stroke-linejoin\": \"round\",\n        opacity\n      });\n      svg.append(polyline);\n    } else {\n      const line = document.createElementNS(SVG_NS, \"line\");\n      applySvgAttrs(line, {\n        x1: points[0].x,\n        y1: points[0].y,\n        x2: points[1].x,\n        y2: points[1].y,\n        stroke,\n        ...strokeAttrs,\n        \"stroke-linecap\": \"round\",\n        opacity\n      });\n      svg.append(line);\n    }\n    if (shape.style.endArrow && shape.style.endArrow !== \"none\") {\n      const tail = points[Math.max(0, points.length - 2)];\n      const head = points[points.length - 1];\n      appendArrowHead(svg, tail.x, tail.y, head.x, head.y, stroke);\n    }\n    return;\n  }\n\n  const shapeName = drawioShapeName(shape.style);\n  if (shapeName === \"image\") {\n    renderDrawioImage(svg, shape, opacity, transform);\n  } else if (shapeName === \"ellipse\") {\n    const ellipse = document.createElementNS(SVG_NS, \"ellipse\");\n    applySvgAttrs(ellipse, {\n      cx: shape.x + shape.width / 2,\n      cy: shape.y + shape.height / 2,\n      rx: shape.width / 2,\n      ry: shape.height / 2,\n      fill,\n      stroke,\n      ...strokeAttrs,\n      opacity,\n      transform\n    });\n    svg.append(ellipse);\n  } else if (shapeName === \"rhombus\" || shapeName === \"diamond\") {\n    const polygon = document.createElementNS(SVG_NS, \"polygon\");\n    applySvgAttrs(polygon, {\n      points: `${shape.x + shape.width / 2},${shape.y} ${shape.x + shape.width},${shape.y + shape.height / 2} ${shape.x + shape.width / 2},${shape.y + shape.height} ${shape.x},${shape.y + shape.height / 2}`,\n      fill,\n      stroke,\n      ...strokeAttrs,\n      opacity,\n      transform\n    });\n    svg.append(polygon);\n  } else if (shapeName === \"hexagon\" || shapeName === \"process\") {\n    const polygon = document.createElementNS(SVG_NS, \"polygon\");\n    const inset = shapeName === \"process\" ? shape.width * 0.12 : shape.width * 0.22;\n    applySvgAttrs(polygon, {\n      points:\n        shapeName === \"process\"\n          ? `${shape.x},${shape.y} ${shape.x + shape.width - inset},${shape.y} ${shape.x + shape.width},${shape.y + shape.height / 2} ${shape.x + shape.width - inset},${shape.y + shape.height} ${shape.x},${shape.y + shape.height}`\n          : `${shape.x + inset},${shape.y} ${shape.x + shape.width - inset},${shape.y} ${shape.x + shape.width},${shape.y + shape.height / 2} ${shape.x + shape.width - inset},${shape.y + shape.height} ${shape.x + inset},${shape.y + shape.height} ${shape.x},${shape.y + shape.height / 2}`,\n      fill,\n      stroke,\n      ...strokeAttrs,\n      opacity,\n      transform\n    });\n    svg.append(polygon);\n  } else if (shapeName === \"triangle\") {\n    const polygon = document.createElementNS(SVG_NS, \"polygon\");\n    applySvgAttrs(polygon, {\n      points: `${shape.x + shape.width / 2},${shape.y} ${shape.x + shape.width},${shape.y + shape.height} ${shape.x},${shape.y + shape.height}`,\n      fill,\n      stroke,\n      ...strokeAttrs,\n      opacity,\n      transform\n    });\n    svg.append(polygon);\n  } else if (shapeName === \"actor\" || shapeName === \"umlActor\") {\n    renderDrawioActor(svg, shape, stroke, strokeAttrs, opacity, transform);\n  } else if (shapeName === \"document\") {\n    const path = document.createElementNS(SVG_NS, \"path\");\n    applySvgAttrs(path, {\n      d: createDrawioDocumentPath(shape.x, shape.y, shape.width, shape.height),\n      fill,\n      stroke,\n      ...strokeAttrs,\n      opacity,\n      transform\n    });\n    svg.append(path);\n  } else if (shapeName === \"cylinder\") {\n    const group = document.createElementNS(SVG_NS, \"g\");\n    applySvgAttrs(group, { transform });\n    const body = document.createElementNS(SVG_NS, \"rect\");\n    applySvgAttrs(body, {\n      x: shape.x,\n      y: shape.y + Math.min(18, shape.height * 0.18) / 2,\n      width: shape.width,\n      height: shape.height - Math.min(18, shape.height * 0.18),\n      fill,\n      stroke,\n      ...strokeAttrs,\n      opacity\n    });\n    const top = document.createElementNS(SVG_NS, \"ellipse\");\n    const bottom = document.createElementNS(SVG_NS, \"ellipse\");\n    const capHeight = Math.min(18, shape.height * 0.18);\n    applySvgAttrs(top, {\n      cx: shape.x + shape.width / 2,\n      cy: shape.y + capHeight / 2,\n      rx: shape.width / 2,\n      ry: capHeight / 2,\n      fill,\n      stroke,\n      ...strokeAttrs,\n      opacity\n    });\n    applySvgAttrs(bottom, {\n      cx: shape.x + shape.width / 2,\n      cy: shape.y + shape.height - capHeight / 2,\n      rx: shape.width / 2,\n      ry: capHeight / 2,\n      fill: \"none\",\n      stroke,\n      ...strokeAttrs,\n      opacity\n    });\n    group.append(body, top, bottom);\n    svg.append(group);\n  } else if (shapeName === \"cloud\") {\n    const path = document.createElementNS(SVG_NS, \"path\");\n    applySvgAttrs(path, {\n      d: createDrawioCloudPath(shape.x, shape.y, shape.width, shape.height),\n      fill,\n      stroke,\n      ...strokeAttrs,\n      opacity,\n      transform\n    });\n    svg.append(path);\n  } else if (shapeName === \"swimlane\") {\n    const rect = document.createElementNS(SVG_NS, \"rect\");\n    applySvgAttrs(rect, {\n      x: shape.x,\n      y: shape.y,\n      width: shape.width,\n      height: shape.height,\n      rx: shape.style.rounded === \"1\" ? Math.min(12, shape.height / 5) : 0,\n      fill,\n      stroke,\n      ...strokeAttrs,\n      opacity,\n      transform\n    });\n    const header = document.createElementNS(SVG_NS, \"rect\");\n    const headerHeight = Math.min(shape.height, finiteNumber(shape.style.startSize, 30));\n    applySvgAttrs(header, {\n      x: shape.x,\n      y: shape.y,\n      width: shape.width,\n      height: headerHeight,\n      rx: shape.style.rounded === \"1\" ? Math.min(12, headerHeight / 3) : 0,\n      fill: drawioColor(shape.style.swimlaneFillColor || shape.style.fillColor, \"#e2e8f0\"),\n      stroke,\n      ...strokeAttrs,\n      opacity,\n      transform\n    });\n    svg.append(rect, header);\n  } else {\n    const rect = document.createElementNS(SVG_NS, \"rect\");\n    applySvgAttrs(rect, {\n      x: shape.x,\n      y: shape.y,\n      width: shape.width,\n      height: shape.height,\n      rx: shape.style.rounded === \"1\" ? Math.min(12, shape.height / 5) : 0,\n      fill,\n      stroke,\n      ...strokeAttrs,\n      opacity,\n      transform\n    });\n    svg.append(rect);\n  }\n\n  appendDrawioText(\n    svg,\n    shape.value,\n    shape.x + shape.width / 2,\n    shape.y + shape.height / 2,\n    drawioColor(shape.style.fontColor, \"#111827\"),\n    shape.style,\n    transform\n  );\n}\n\nfunction drawioShapeName(style: Record<string, string>): string {\n  if (style.shape) {\n    return style.shape;\n  }\n  if (style.image) {\n    return \"image\";\n  }\n  if (style.ellipse === \"1\") {\n    return \"ellipse\";\n  }\n  if (style.rhombus === \"1\") {\n    return \"rhombus\";\n  }\n  if (style.swimlane === \"1\") {\n    return \"swimlane\";\n  }\n  if (style.text === \"1\") {\n    return \"text\";\n  }\n  return \"rectangle\";\n}\n\nfunction renderDrawioImage(svg: SVGSVGElement, shape: DrawioShape, opacity: number, transform: string): void {\n  const src = shape.style.image || \"\";\n  if (/^data:image\\/(?:png|jpe?g|gif|webp|svg\\+xml);base64,/i.test(src)) {\n    const image = document.createElementNS(SVG_NS, \"image\");\n    applySvgAttrs(image, {\n      x: shape.x,\n      y: shape.y,\n      width: shape.width,\n      height: shape.height,\n      href: src,\n      preserveAspectRatio: \"xMidYMid meet\",\n      opacity,\n      transform\n    });\n    svg.append(image);\n    return;\n  }\n  const rect = document.createElementNS(SVG_NS, \"rect\");\n  applySvgAttrs(rect, {\n    x: shape.x,\n    y: shape.y,\n    width: shape.width,\n    height: shape.height,\n    rx: 6,\n    fill: \"#f8fafc\",\n    stroke: \"#94a3b8\",\n    \"stroke-dasharray\": \"6 4\",\n    opacity,\n    transform\n  });\n  svg.append(rect);\n}\n\nfunction renderDrawioActor(\n  svg: SVGSVGElement,\n  shape: DrawioShape,\n  stroke: string,\n  strokeAttrs: Record<string, string | number>,\n  opacity: number,\n  transform: string\n): void {\n  const group = document.createElementNS(SVG_NS, \"g\");\n  applySvgAttrs(group, { opacity, transform });\n  const cx = shape.x + shape.width / 2;\n  const headRadius = Math.min(shape.width, shape.height) * 0.15;\n  const head = document.createElementNS(SVG_NS, \"circle\");\n  applySvgAttrs(head, {\n    cx,\n    cy: shape.y + headRadius * 1.4,\n    r: headRadius,\n    fill: \"transparent\",\n    stroke,\n    ...strokeAttrs\n  });\n  const body = createSvgLine(cx, shape.y + headRadius * 2.4, cx, shape.y + shape.height * 0.68, stroke, strokeAttrs);\n  const arms = createSvgLine(shape.x + shape.width * 0.22, shape.y + shape.height * 0.42, shape.x + shape.width * 0.78, shape.y + shape.height * 0.42, stroke, strokeAttrs);\n  const leftLeg = createSvgLine(cx, shape.y + shape.height * 0.68, shape.x + shape.width * 0.25, shape.y + shape.height, stroke, strokeAttrs);\n  const rightLeg = createSvgLine(cx, shape.y + shape.height * 0.68, shape.x + shape.width * 0.75, shape.y + shape.height, stroke, strokeAttrs);\n  group.append(head, body, arms, leftLeg, rightLeg);\n  svg.append(group);\n}\n\nfunction createSvgLine(\n  x1: number,\n  y1: number,\n  x2: number,\n  y2: number,\n  stroke: string,\n  strokeAttrs: Record<string, string | number>\n): SVGLineElement {\n  const line = document.createElementNS(SVG_NS, \"line\");\n  applySvgAttrs(line, {\n    x1,\n    y1,\n    x2,\n    y2,\n    stroke,\n    ...strokeAttrs,\n    \"stroke-linecap\": \"round\"\n  });\n  return line;\n}\n\nfunction createDrawioDocumentPath(x: number, y: number, width: number, height: number): string {\n  const wave = Math.min(18, height * 0.18);\n  return [\n    `M ${x} ${y}`,\n    `H ${x + width}`,\n    `V ${y + height - wave}`,\n    `C ${x + width * 0.72} ${y + height - wave * 2}, ${x + width * 0.58} ${y + height + wave * 0.5}, ${x + width * 0.34} ${y + height - wave * 0.4}`,\n    `C ${x + width * 0.18} ${y + height - wave}, ${x + width * 0.08} ${y + height - wave * 0.2}, ${x} ${y + height - wave * 0.45}`,\n    \"Z\"\n  ].join(\" \");\n}\n\nfunction drawioStrokeAttrs(style: Record<string, string>, strokeWidth: number): Record<string, string | number> {\n  const attrs: Record<string, string | number> = {\n    \"stroke-width\": strokeWidth\n  };\n  if (style.dashed === \"1\") {\n    attrs[\"stroke-dasharray\"] = style.dashPattern || `${strokeWidth * 4} ${strokeWidth * 3}`;\n  }\n  return attrs;\n}\n\nfunction drawioTransform(shape: DrawioShape): string {\n  const rotation = finiteNumber(shape.style.rotation, 0);\n  if (!rotation) {\n    return \"\";\n  }\n  return `rotate(${rotation} ${shape.x + shape.width / 2} ${shape.y + shape.height / 2})`;\n}\n\nfunction createDrawioCloudPath(x: number, y: number, width: number, height: number): string {\n  const cx = x + width / 2;\n  const cy = y + height / 2;\n  return [\n    `M ${x + width * 0.24} ${y + height * 0.72}`,\n    `C ${x - width * 0.02} ${y + height * 0.68}, ${x + width * 0.02} ${y + height * 0.34}, ${x + width * 0.28} ${y + height * 0.38}`,\n    `C ${x + width * 0.32} ${y + height * 0.12}, ${cx} ${y + height * 0.06}, ${x + width * 0.62} ${y + height * 0.26}`,\n    `C ${x + width * 0.86} ${y + height * 0.2}, ${x + width * 1.02} ${y + height * 0.42}, ${x + width * 0.88} ${y + height * 0.62}`,\n    `C ${x + width * 0.86} ${y + height * 0.84}, ${x + width * 0.42} ${y + height * 0.9}, ${x + width * 0.24} ${y + height * 0.72}`,\n    \"Z\"\n  ].join(\" \");\n}\n\nfunction appendDrawioText(\n  svg: SVGSVGElement,\n  text: string,\n  x: number,\n  y: number,\n  fill: string,\n  style: Record<string, string> = {},\n  transform = \"\"\n): void {\n  if (!text.trim()) {\n    return;\n  }\n  const lines = normalizeDrawioLabel(text).split(/\\r?\\n/).filter(Boolean);\n  if (lines.length === 0) {\n    return;\n  }\n  const textNode = document.createElementNS(SVG_NS, \"text\");\n  const align = style.align || \"center\";\n  const fontStyle = Number.parseInt(style.fontStyle || \"0\", 10);\n  applySvgAttrs(textNode, {\n    x: align === \"left\" ? x - finiteNumber(style.spacingLeft, 0) : align === \"right\" ? x + finiteNumber(style.spacingRight, 0) : x,\n    y,\n    fill,\n    \"font-size\": finiteNumber(style.fontSize, 14),\n    \"font-family\": \"Inter, ui-sans-serif, system-ui, sans-serif\",\n    \"font-weight\": fontStyle & 1 ? \"700\" : undefined,\n    \"font-style\": fontStyle & 2 ? \"italic\" : undefined,\n    \"text-decoration\": fontStyle & 4 ? \"underline\" : undefined,\n    \"text-anchor\": align === \"left\" ? \"start\" : align === \"right\" ? \"end\" : \"middle\",\n    \"dominant-baseline\": \"middle\",\n    transform\n  });\n  const firstDy = lines.length > 1 ? `${-0.55 * (lines.length - 1)}em` : \"0\";\n  for (const [index, line] of lines.entries()) {\n    const span = document.createElementNS(SVG_NS, \"tspan\");\n    span.setAttribute(\"x\", String(x));\n    span.setAttribute(\"dy\", index === 0 ? firstDy : \"1.2em\");\n    span.textContent = line;\n    textNode.append(span);\n  }\n  svg.append(textNode);\n}\n\nfunction normalizeDrawioLabel(text: string): string {\n  const decoded = decodeXmlText(text);\n  return decoded\n    .replace(/<br\\s*\\/?>/gi, \"\\n\")\n    .replace(/<\\/(?:div|p|li|h\\d)>/gi, \"\\n\")\n    .replace(/<[^>]+>/g, \"\")\n    .split(/\\r?\\n/)\n    .map((line) => decodeXmlText(line).replace(/\\u00a0/g, \" \").replace(/[ \\t]+/g, \" \").trim())\n    .filter(Boolean)\n    .join(\"\\n\");\n}\n\nfunction drawioColor(value: string | undefined, fallback: string): string {\n  if (!value || value === \"default\") {\n    return fallback;\n  }\n  return value.startsWith(\"#\") ? value : `#${value}`;\n}\n\nfunction decodeXmlText(value: string): string {\n  const textarea = document.createElement(\"textarea\");\n  textarea.innerHTML = value;\n  return textarea.value;\n}\n\nfunction renderRawDrawing(panel: HTMLElement, extension: string, text: string): void {\n  const section = createSection(`${extension} 基础预览`);\n  const pre = document.createElement(\"pre\");\n  pre.className = \"ofv-text-block\";\n  pre.textContent = text.slice(0, 30000);\n  section.append(pre);\n  panel.append(section);\n}\n\nfunction renderDrawingParseFallback(panel: HTMLElement, extension: string, text: string, error: unknown): void {\n  panel.replaceChildren();\n  const section = createSection(`${extension} 解析失败`);\n  const message = document.createElement(\"p\");\n  message.textContent = error instanceof Error ? error.message : String(error);\n  const pre = document.createElement(\"pre\");\n  pre.className = \"ofv-text-block\";\n  pre.textContent = text.slice(0, 30000) || \"文件内容为空。\";\n  section.append(message, pre);\n  panel.append(section);\n}\n\nfunction decodeDrawioDiagram(value: string): string {\n  try {\n    const decoded = decodeURIComponent(escape(atob(value)));\n    return pako.inflateRaw(Uint8Array.from(decoded, (char) => char.charCodeAt(0)), {\n      to: \"string\"\n    }) as string;\n  } catch {\n    return value;\n  }\n}\n","import JSZip from \"jszip\";\nimport type { PreviewCommand, PreviewContext, PreviewInstance, PreviewPlugin } from \"../types\";\nimport { appendMeta, createPanel, readArrayBuffer, resolveFormat } from \"./utils\";\n\nconst xmindExtensions = new Set([\"xmind\"]);\nconst xmindMimeFormatMap: Record<string, string> = {\n  \"application/vnd.xmind.workbook\": \"xmind\",\n  \"application/x-xmind\": \"xmind\"\n};\n\nconst MAX_TOPIC_COUNT = 2_000;\nconst MAX_TOPIC_DEPTH = 128;\nconst NODE_WIDTH = 228;\nconst ROOT_WIDTH = 260;\nconst LEVEL_GAP = 96;\nconst SIBLING_GAP = 20;\nconst CANVAS_PADDING = 40;\n\ntype TopicKind = \"attached\" | \"detached\" | \"summary\" | \"callout\";\n\ntype XMindTopic = {\n  id: string;\n  title: string;\n  children: XMindTopic[];\n  notes: string[];\n  labels: string[];\n  markers: string[];\n  hyperlink?: string;\n  image?: string;\n  kind: TopicKind;\n};\n\ntype XMindSheet = {\n  title: string;\n  root: XMindTopic;\n};\n\ntype XMindWorkbook = {\n  sheets: XMindSheet[];\n  objectUrls: string[];\n};\n\ntype LayoutNode = {\n  topic: XMindTopic;\n  depth: number;\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n  subtreeHeight: number;\n  children: LayoutNode[];\n};\n\ntype SheetLayout = {\n  root: LayoutNode;\n  nodes: LayoutNode[];\n  width: number;\n  height: number;\n};\n\ntype ParseBudget = { count: number };\n\nexport function xmindPlugin(): PreviewPlugin {\n  return {\n    name: \"xmind\",\n    match(file) {\n      return xmindExtensions.has(file.extension) || Boolean(xmindMimeFormatMap[file.mimeType]);\n    },\n    async render(ctx) {\n      const panel = createPanel(\"ofv-xmind\");\n      ctx.viewport.append(panel);\n      const extension = resolveFormat(ctx.file, xmindMimeFormatMap);\n      let instance: PreviewInstance | undefined;\n      let objectUrls: string[] = [];\n\n      try {\n        const workbook = await parseXMindWorkbook(await readArrayBuffer(ctx.file));\n        objectUrls = workbook.objectUrls;\n        if (ctx.signal?.aborted) {\n          revokeObjectUrls(objectUrls);\n          panel.remove();\n          return emptyInstance();\n        }\n        instance = renderXMindWorkbook(panel, workbook.sheets, ctx);\n      } catch (error) {\n        if (ctx.signal?.aborted) {\n          revokeObjectUrls(objectUrls);\n          panel.remove();\n          return emptyInstance();\n        }\n        renderXMindFallback(panel, extension || ctx.file.extension || \"xmind\", error);\n      }\n\n      return {\n        resize(size) {\n          instance?.resize?.(size);\n        },\n        canCommand(command) {\n          return instance?.canCommand?.(command) ?? false;\n        },\n        command(command) {\n          return instance?.command?.(command) ?? false;\n        },\n        preparePrint() {\n          return instance?.preparePrint?.();\n        },\n        destroy() {\n          instance?.destroy();\n          revokeObjectUrls(objectUrls);\n          ctx.toolbar?.setZoom(undefined);\n          panel.remove();\n        }\n      };\n    }\n  };\n}\n\nasync function parseXMindWorkbook(buffer: ArrayBuffer): Promise<XMindWorkbook> {\n  const zip = await JSZip.loadAsync(buffer);\n  const contentJson = findZipFile(zip, \"content.json\");\n  const contentXml = findZipFile(zip, \"content.xml\");\n  const objectUrls: string[] = [];\n  const resources = await loadImageResources(zip, objectUrls);\n\n  try {\n    if (contentJson) {\n      return {\n        sheets: parseXMindContentJson(await contentJson.async(\"text\"), resources),\n        objectUrls\n      };\n    }\n    if (contentXml) {\n      return {\n        sheets: parseXMindContentXml(await contentXml.async(\"text\"), resources),\n        objectUrls\n      };\n    }\n  } catch (error) {\n    revokeObjectUrls(objectUrls);\n    throw error;\n  }\n\n  revokeObjectUrls(objectUrls);\n  throw new Error(\"Missing XMind content.json/content.xml\");\n}\n\nfunction findZipFile(zip: JSZip, fileName: string): JSZip.JSZipObject | undefined {\n  const expected = fileName.toLowerCase();\n  return Object.values(zip.files).find((entry) => !entry.dir && entry.name.split(\"/\").pop()?.toLowerCase() === expected);\n}\n\nasync function loadImageResources(zip: JSZip, objectUrls: string[]): Promise<Map<string, string>> {\n  const resources = new Map<string, string>();\n  if (typeof URL.createObjectURL !== \"function\") {\n    return resources;\n  }\n\n  const entries = Object.values(zip.files).filter(\n    (entry) => !entry.dir && /(^|\\/)(resources|attachments)\\//i.test(entry.name) && isImageFile(entry.name)\n  );\n  for (const entry of entries.slice(0, 256)) {\n    try {\n      const blob = await entry.async(\"blob\");\n      const objectUrl = URL.createObjectURL(blob);\n      objectUrls.push(objectUrl);\n      registerResourceAliases(resources, entry.name, objectUrl);\n    } catch {\n      // A broken optional image must not prevent the mind map itself from rendering.\n    }\n  }\n  return resources;\n}\n\nfunction registerResourceAliases(resources: Map<string, string>, path: string, url: string): void {\n  const normalized = normalizeResourcePath(path);\n  resources.set(normalized, url);\n  resources.set(`xap:${normalized}`, url);\n  resources.set(normalized.replace(/^\\/?(resources|attachments)\\//, \"\"), url);\n}\n\nfunction isImageFile(path: string): boolean {\n  return /\\.(?:avif|bmp|gif|jpe?g|png|svg|webp)$/i.test(path);\n}\n\nfunction normalizeResourcePath(path: string): string {\n  return path.replace(/^xap:/i, \"\").replace(/^\\/+/, \"\").replace(/\\\\/g, \"/\").toLowerCase();\n}\n\nfunction resolveResource(source: string, resources: Map<string, string>): string | undefined {\n  const value = source.trim();\n  if (/^(?:data:image\\/|blob:|https?:\\/\\/)/i.test(value)) {\n    return value;\n  }\n  const normalized = normalizeResourcePath(value);\n  return resources.get(normalized) || resources.get(normalized.replace(/^\\/?(resources|attachments)\\//, \"\"));\n}\n\nfunction parseXMindContentJson(source: string, resources: Map<string, string>): XMindSheet[] {\n  const raw = JSON.parse(source) as unknown;\n  const candidates = readJsonSheets(raw);\n  const budget: ParseBudget = { count: 0 };\n  const parsed = candidates\n    .map((sheet, index) => parseXMindJsonSheet(sheet, index, resources, budget))\n    .filter((sheet): sheet is XMindSheet => Boolean(sheet));\n  if (parsed.length === 0) {\n    throw new Error(\"No readable XMind sheets\");\n  }\n  return parsed;\n}\n\nfunction readJsonSheets(raw: unknown): unknown[] {\n  if (Array.isArray(raw)) {\n    return raw;\n  }\n  if (!isRecord(raw)) {\n    return [];\n  }\n  if (Array.isArray(raw.sheets)) {\n    return raw.sheets;\n  }\n  if (isRecord(raw.rootTopic) || isRecord(raw.root)) {\n    return [raw];\n  }\n  if (isRecord(raw.content)) {\n    return readJsonSheets(raw.content);\n  }\n  return [];\n}\n\nfunction parseXMindJsonSheet(\n  raw: unknown,\n  index: number,\n  resources: Map<string, string>,\n  budget: ParseBudget\n): XMindSheet | undefined {\n  if (!isRecord(raw)) {\n    return undefined;\n  }\n  const rootTopic = isRecord(raw.rootTopic) ? raw.rootTopic : isRecord(raw.root) ? raw.root : undefined;\n  if (!rootTopic) {\n    return undefined;\n  }\n  const root = parseXMindJsonTopic(rootTopic, resources, budget, 0, \"attached\");\n  return {\n    title: readString(raw.title) || root.title || `Sheet ${index + 1}`,\n    root\n  };\n}\n\nfunction parseXMindJsonTopic(\n  raw: Record<string, unknown>,\n  resources: Map<string, string>,\n  budget: ParseBudget,\n  depth: number,\n  kind: TopicKind\n): XMindTopic {\n  consumeTopicBudget(budget, depth);\n  const children: XMindTopic[] = [];\n  const childrenContainer = raw.children;\n  if (Array.isArray(childrenContainer)) {\n    appendJsonChildren(children, childrenContainer, \"attached\", resources, budget, depth);\n  } else if (isRecord(childrenContainer)) {\n    for (const childKind of [\"attached\", \"detached\", \"summary\", \"callout\"] as const) {\n      appendJsonChildren(children, childrenContainer[childKind], childKind, resources, budget, depth);\n    }\n  }\n\n  const image = isRecord(raw.image) ? readString(raw.image.src) || readString(raw.image.href) : readString(raw.image);\n  return {\n    id: readString(raw.id) || `topic-${budget.count}`,\n    title: readString(raw.title) || readString(raw.text) || \"Untitled\",\n    children,\n    notes: readXMindJsonNotes(raw.notes),\n    labels: readStringArray(raw.labels),\n    markers: readMarkerIds(raw.markers),\n    hyperlink: readString(raw.href) || readString(raw.hyperlink) || undefined,\n    image: image ? resolveResource(image, resources) || image : undefined,\n    kind\n  };\n}\n\nfunction appendJsonChildren(\n  target: XMindTopic[],\n  raw: unknown,\n  kind: TopicKind,\n  resources: Map<string, string>,\n  budget: ParseBudget,\n  parentDepth: number\n): void {\n  if (!Array.isArray(raw)) {\n    return;\n  }\n  for (const child of raw) {\n    if (isRecord(child)) {\n      target.push(parseXMindJsonTopic(child, resources, budget, parentDepth + 1, kind));\n    }\n  }\n}\n\nfunction readXMindJsonNotes(raw: unknown): string[] {\n  if (typeof raw === \"string\") {\n    return raw.trim() ? [raw.trim()] : [];\n  }\n  if (!isRecord(raw)) {\n    return [];\n  }\n  const values = [\"plain\", \"realHTML\", \"html\"]\n    .map((key) => {\n      const note = raw[key];\n      return isRecord(note) ? readString(note.content) : readString(note);\n    })\n    .map(stripHtml)\n    .filter(Boolean);\n  return [...new Set(values)];\n}\n\nfunction readMarkerIds(raw: unknown): string[] {\n  if (!Array.isArray(raw)) {\n    return [];\n  }\n  return raw\n    .map((marker) => {\n      if (typeof marker === \"string\") {\n        return marker.trim();\n      }\n      return isRecord(marker) ? readString(marker.markerId) || readString(marker[\"marker-id\"]) || readString(marker.id) : \"\";\n    })\n    .filter(Boolean);\n}\n\nfunction parseXMindContentXml(source: string, resources: Map<string, string>): XMindSheet[] {\n  const doc = new DOMParser().parseFromString(source, \"application/xml\");\n  if (doc.querySelector(\"parsererror\")) {\n    throw new Error(\"Invalid XMind XML\");\n  }\n  const sheets = Array.from(doc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"sheet\");\n  const budget: ParseBudget = { count: 0 };\n  const parsed = sheets\n    .map((sheet, index) => parseXMindXmlSheet(sheet, index, resources, budget))\n    .filter((sheet): sheet is XMindSheet => Boolean(sheet));\n  if (parsed.length === 0) {\n    throw new Error(\"No readable XMind sheets\");\n  }\n  return parsed;\n}\n\nfunction parseXMindXmlSheet(\n  sheet: Element,\n  index: number,\n  resources: Map<string, string>,\n  budget: ParseBudget\n): XMindSheet | undefined {\n  const rootTopic = firstDirectChild(sheet, \"topic\");\n  if (!rootTopic) {\n    return undefined;\n  }\n  const root = parseXMindXmlTopic(rootTopic, resources, budget, 0, \"attached\");\n  return {\n    title: directChildText(sheet, \"title\") || root.title || `Sheet ${index + 1}`,\n    root\n  };\n}\n\nfunction parseXMindXmlTopic(\n  topic: Element,\n  resources: Map<string, string>,\n  budget: ParseBudget,\n  depth: number,\n  kind: TopicKind\n): XMindTopic {\n  consumeTopicBudget(budget, depth);\n  const children = directXmlChildTopics(topic).map(({ topic: child, kind: childKind }) =>\n    parseXMindXmlTopic(child, resources, budget, depth + 1, childKind)\n  );\n  const notesContainer = firstDirectChild(topic, \"notes\");\n  const labelsContainer = firstDirectChild(topic, \"labels\");\n  const markersContainer = firstDirectChild(topic, \"marker-refs\");\n  const imageElement = ownedXmlDescendants(topic, [\"img\", \"image\"])[0];\n  const imageSource = imageElement ? readAttribute(imageElement, [\"src\", \"href\"]) : \"\";\n  return {\n    id: readAttribute(topic, [\"id\"]) || `topic-${budget.count}`,\n    title: directChildText(topic, \"title\") || \"Untitled\",\n    children,\n    notes: notesContainer\n      ? Array.from(notesContainer.getElementsByTagName(\"*\"))\n          .filter((element) => element.localName === \"plain\" || element.localName === \"html\")\n          .map((element) => stripHtml(element.textContent || \"\"))\n          .filter(Boolean)\n      : [],\n    labels: labelsContainer\n      ? Array.from(labelsContainer.getElementsByTagName(\"*\"))\n          .filter((element) => element.localName === \"label\")\n          .map((element) => (element.textContent || \"\").trim())\n          .filter(Boolean)\n      : [],\n    markers: markersContainer\n      ? Array.from(markersContainer.getElementsByTagName(\"*\"))\n          .filter((element) => element.localName === \"marker-ref\")\n          .map((element) => readAttribute(element, [\"marker-id\", \"markerId\", \"id\"]))\n          .filter(Boolean)\n      : [],\n    hyperlink: readAttribute(topic, [\"href\"]) || undefined,\n    image: imageSource ? resolveResource(imageSource, resources) || imageSource : undefined,\n    kind\n  };\n}\n\nfunction directXmlChildTopics(topic: Element): Array<{ topic: Element; kind: TopicKind }> {\n  const childrenElement = firstDirectChild(topic, \"children\");\n  if (!childrenElement) {\n    return [];\n  }\n  return Array.from(childrenElement.children)\n    .filter((element) => element.localName === \"topics\")\n    .flatMap((topics) => {\n      const rawKind = readAttribute(topics, [\"type\"]);\n      const kind: TopicKind =\n        rawKind === \"detached\" || rawKind === \"summary\" || rawKind === \"callout\" ? rawKind : \"attached\";\n      return Array.from(topics.children)\n        .filter((child) => child.localName === \"topic\")\n        .map((child) => ({ topic: child, kind }));\n    });\n}\n\nfunction ownedXmlDescendants(topic: Element, names: string[]): Element[] {\n  return Array.from(topic.getElementsByTagName(\"*\")).filter((element) => {\n    if (!names.includes(element.localName)) {\n      return false;\n    }\n    let parent = element.parentElement;\n    while (parent && parent !== topic) {\n      if (parent.localName === \"topic\") {\n        return false;\n      }\n      parent = parent.parentElement;\n    }\n    return parent === topic;\n  });\n}\n\nfunction readAttribute(element: Element, names: string[]): string {\n  for (const attribute of Array.from(element.attributes)) {\n    if (names.includes(attribute.localName) || names.includes(attribute.name)) {\n      return attribute.value.trim();\n    }\n  }\n  return \"\";\n}\n\nfunction consumeTopicBudget(budget: ParseBudget, depth: number): void {\n  budget.count += 1;\n  if (budget.count > MAX_TOPIC_COUNT) {\n    throw new Error(`XMind topic limit exceeded (${MAX_TOPIC_COUNT})`);\n  }\n  if (depth > MAX_TOPIC_DEPTH) {\n    throw new Error(`XMind topic depth limit exceeded (${MAX_TOPIC_DEPTH})`);\n  }\n}\n\nfunction renderXMindWorkbook(panel: HTMLElement, sheets: XMindSheet[], ctx: PreviewContext): PreviewInstance {\n  const summary = document.createElement(\"section\");\n  summary.className = \"ofv-section ofv-xmind-summary\";\n  const heading = document.createElement(\"h3\");\n  heading.textContent = \"XMind\";\n  summary.append(heading);\n  appendMeta(summary, \"工作表\", sheets.length);\n  appendMeta(summary, \"主题\", countXMindTopics(sheets));\n  panel.append(summary);\n\n  const workbook = document.createElement(\"section\");\n  workbook.className = \"ofv-xmind-workbook\";\n  const header = document.createElement(\"header\");\n  header.className = \"ofv-xmind-header\";\n  const tabs = document.createElement(\"div\");\n  tabs.className = \"ofv-xmind-tabs\";\n  tabs.setAttribute(\"role\", \"tablist\");\n  const fitButton = document.createElement(\"button\");\n  fitButton.type = \"button\";\n  fitButton.className = \"ofv-xmind-fit\";\n  fitButton.textContent = \"适应画布\";\n  header.append(tabs, fitButton);\n\n  const stage = document.createElement(\"div\");\n  stage.className = \"ofv-xmind-stage\";\n  stage.tabIndex = 0;\n  stage.setAttribute(\"aria-label\", \"XMind mind map canvas\");\n  const surface = document.createElement(\"div\");\n  surface.className = \"ofv-xmind-surface\";\n  stage.append(surface);\n  workbook.append(header, stage);\n  panel.append(workbook);\n\n  const layouts = sheets.map((sheet) => layoutSheet(sheet));\n  let activeSheet = 0;\n  let scale = clamp(ctx.options.zoom, 0.2, 3);\n  let panX = 24;\n  let panY = 24;\n  let dragging = false;\n  let pointerId: number | undefined;\n  let lastX = 0;\n  let lastY = 0;\n  let destroyed = false;\n\n  const applyTransform = () => {\n    surface.style.transform = `translate(${Math.round(panX)}px, ${Math.round(panY)}px) scale(${scale})`;\n    const normalized = Math.round(scale * 100) / 100;\n    ctx.toolbar?.setZoom(normalized === 1 ? undefined : normalized);\n  };\n\n  const centerAtScale = (nextScale: number) => {\n    const layout = layouts[activeSheet];\n    scale = clamp(nextScale, 0.2, 3);\n    const width = stage.clientWidth;\n    const height = stage.clientHeight;\n    panX = width > 0 ? Math.max(20, (width - layout.width * scale) / 2) : 24;\n    panY = height > 0 ? Math.max(20, (height - layout.height * scale) / 2) : 24;\n    applyTransform();\n  };\n\n  const fitToView = () => {\n    const layout = layouts[activeSheet];\n    const width = stage.clientWidth;\n    const height = stage.clientHeight;\n    if (width <= 0 || height <= 0) {\n      centerAtScale(1);\n      return;\n    }\n    centerAtScale(Math.min(1, (width - 40) / layout.width, (height - 40) / layout.height));\n  };\n\n  const zoomAround = (nextScale: number, clientX?: number, clientY?: number) => {\n    const normalized = clamp(nextScale, 0.2, 3);\n    const rect = stage.getBoundingClientRect();\n    const pointX = clientX ?? rect.left + rect.width / 2;\n    const pointY = clientY ?? rect.top + rect.height / 2;\n    const localX = (pointX - rect.left - panX) / scale;\n    const localY = (pointY - rect.top - panY) / scale;\n    panX = pointX - rect.left - localX * normalized;\n    panY = pointY - rect.top - localY * normalized;\n    scale = normalized;\n    applyTransform();\n  };\n\n  const renderSheet = (index: number, shouldFit: boolean) => {\n    activeSheet = index;\n    surface.replaceChildren(renderSheetLayout(layouts[index]));\n    surface.style.width = `${layouts[index].width}px`;\n    surface.style.height = `${layouts[index].height}px`;\n    Array.from(tabs.children).forEach((tab, tabIndex) => {\n      tab.setAttribute(\"aria-selected\", String(tabIndex === index));\n      tab.classList.toggle(\"is-active\", tabIndex === index);\n    });\n    if (shouldFit) {\n      requestAnimationFrame(fitToView);\n    } else {\n      applyTransform();\n    }\n  };\n\n  for (const [index, sheet] of sheets.entries()) {\n    const tab = document.createElement(\"button\");\n    tab.type = \"button\";\n    tab.className = \"ofv-xmind-tab\";\n    tab.setAttribute(\"role\", \"tab\");\n    tab.textContent = sheet.title;\n    tab.addEventListener(\"click\", () => renderSheet(index, true));\n    tabs.append(tab);\n  }\n\n  const onPointerDown = (event: PointerEvent) => {\n    if (event.button !== 0) {\n      return;\n    }\n    dragging = true;\n    pointerId = event.pointerId;\n    lastX = event.clientX;\n    lastY = event.clientY;\n    stage.classList.add(\"is-panning\");\n    stage.setPointerCapture?.(event.pointerId);\n  };\n  const onPointerMove = (event: PointerEvent) => {\n    if (!dragging || event.pointerId !== pointerId) {\n      return;\n    }\n    panX += event.clientX - lastX;\n    panY += event.clientY - lastY;\n    lastX = event.clientX;\n    lastY = event.clientY;\n    applyTransform();\n  };\n  const endPointer = (event: PointerEvent) => {\n    if (event.pointerId !== pointerId) {\n      return;\n    }\n    dragging = false;\n    pointerId = undefined;\n    stage.classList.remove(\"is-panning\");\n    stage.releasePointerCapture?.(event.pointerId);\n  };\n  const onWheel = (event: WheelEvent) => {\n    event.preventDefault();\n    if (event.ctrlKey || event.metaKey) {\n      zoomAround(scale * Math.exp(-event.deltaY * 0.002), event.clientX, event.clientY);\n      return;\n    }\n    panX -= event.deltaX;\n    panY -= event.deltaY;\n    applyTransform();\n  };\n  const onKeyDown = (event: KeyboardEvent) => {\n    const distance = event.shiftKey ? 80 : 32;\n    if (event.key === \"ArrowLeft\") panX += distance;\n    else if (event.key === \"ArrowRight\") panX -= distance;\n    else if (event.key === \"ArrowUp\") panY += distance;\n    else if (event.key === \"ArrowDown\") panY -= distance;\n    else return;\n    event.preventDefault();\n    applyTransform();\n  };\n\n  fitButton.addEventListener(\"click\", fitToView);\n  stage.addEventListener(\"pointerdown\", onPointerDown);\n  stage.addEventListener(\"pointermove\", onPointerMove);\n  stage.addEventListener(\"pointerup\", endPointer);\n  stage.addEventListener(\"pointercancel\", endPointer);\n  stage.addEventListener(\"wheel\", onWheel, { passive: false });\n  stage.addEventListener(\"keydown\", onKeyDown);\n  renderSheet(0, false);\n\n  return {\n    resize() {\n      if (!destroyed) {\n        requestAnimationFrame(fitToView);\n      }\n    },\n    canCommand(command) {\n      return command === \"zoom-in\" || command === \"zoom-out\" || command === \"zoom-reset\";\n    },\n    command(command) {\n      if (command === \"zoom-in\") {\n        zoomAround(scale * 1.15);\n        return true;\n      }\n      if (command === \"zoom-out\") {\n        zoomAround(scale / 1.15);\n        return true;\n      }\n      if (command === \"zoom-reset\") {\n        centerAtScale(1);\n        return true;\n      }\n      return false;\n    },\n    destroy() {\n      destroyed = true;\n      fitButton.removeEventListener(\"click\", fitToView);\n      stage.removeEventListener(\"pointerdown\", onPointerDown);\n      stage.removeEventListener(\"pointermove\", onPointerMove);\n      stage.removeEventListener(\"pointerup\", endPointer);\n      stage.removeEventListener(\"pointercancel\", endPointer);\n      stage.removeEventListener(\"wheel\", onWheel);\n      stage.removeEventListener(\"keydown\", onKeyDown);\n    }\n  };\n}\n\nfunction layoutSheet(sheet: XMindSheet): SheetLayout {\n  const nodes: LayoutNode[] = [];\n  const build = (topic: XMindTopic, depth: number): LayoutNode => {\n    const children = topic.children.map((child) => build(child, depth + 1));\n    const width = depth === 0 ? ROOT_WIDTH : NODE_WIDTH;\n    const height = estimateTopicHeight(topic, depth);\n    const childrenHeight = children.reduce((total, child) => total + child.subtreeHeight, 0) +\n      Math.max(0, children.length - 1) * SIBLING_GAP;\n    const node: LayoutNode = {\n      topic,\n      depth,\n      x: CANVAS_PADDING + depth * (NODE_WIDTH + LEVEL_GAP),\n      y: 0,\n      width,\n      height,\n      subtreeHeight: Math.max(height, childrenHeight),\n      children\n    };\n    nodes.push(node);\n    return node;\n  };\n  const root = build(sheet.root, 0);\n  const assign = (node: LayoutNode, top: number) => {\n    node.y = top + (node.subtreeHeight - node.height) / 2;\n    let childTop = top;\n    for (const child of node.children) {\n      assign(child, childTop);\n      childTop += child.subtreeHeight + SIBLING_GAP;\n    }\n  };\n  assign(root, CANVAS_PADDING);\n  const maxRight = Math.max(...nodes.map((node) => node.x + node.width));\n  return {\n    root,\n    nodes,\n    width: maxRight + CANVAS_PADDING,\n    height: root.subtreeHeight + CANVAS_PADDING * 2\n  };\n}\n\nfunction estimateTopicHeight(topic: XMindTopic, depth: number): number {\n  const titleLines = Math.min(4, Math.max(1, Math.ceil(topic.title.length / (depth === 0 ? 18 : 22))));\n  let height = 28 + titleLines * 20;\n  if (topic.image) height += 104;\n  if (topic.labels.length || topic.markers.length || topic.kind !== \"attached\") height += 30;\n  if (topic.notes.length) height += 46;\n  return Math.min(240, height);\n}\n\nfunction renderSheetLayout(layout: SheetLayout): DocumentFragment {\n  const fragment = document.createDocumentFragment();\n  const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n  svg.classList.add(\"ofv-xmind-edges\");\n  svg.setAttribute(\"width\", String(layout.width));\n  svg.setAttribute(\"height\", String(layout.height));\n  svg.setAttribute(\"viewBox\", `0 0 ${layout.width} ${layout.height}`);\n  for (const node of layout.nodes) {\n    for (const child of node.children) {\n      const startX = node.x + node.width;\n      const startY = node.y + node.height / 2;\n      const endX = child.x;\n      const endY = child.y + child.height / 2;\n      const control = Math.max(32, (endX - startX) * 0.5);\n      const edge = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n      edge.setAttribute(\"d\", `M ${startX} ${startY} C ${startX + control} ${startY}, ${endX - control} ${endY}, ${endX} ${endY}`);\n      edge.classList.add(`ofv-xmind-edge-${child.topic.kind}`);\n      svg.append(edge);\n    }\n  }\n  fragment.append(svg);\n  for (const node of layout.nodes) {\n    fragment.append(renderXMindTopic(node));\n  }\n  return fragment;\n}\n\nfunction renderXMindTopic(node: LayoutNode): HTMLElement {\n  const topic = node.topic;\n  const card = document.createElement(\"article\");\n  card.className = `ofv-xmind-topic ofv-xmind-topic-depth-${Math.min(node.depth, 4)} ofv-xmind-topic-${topic.kind}`;\n  card.style.left = `${node.x}px`;\n  card.style.top = `${node.y}px`;\n  card.style.width = `${node.width}px`;\n  card.style.height = `${node.height}px`;\n  card.dataset.topicId = topic.id;\n\n  const title = safeExternalLink(topic.hyperlink);\n  if (title) {\n    const link = document.createElement(\"a\");\n    link.className = \"ofv-xmind-topic-title\";\n    link.textContent = topic.title;\n    link.href = title;\n    link.target = \"_blank\";\n    link.rel = \"noopener noreferrer\";\n    card.append(link);\n  } else {\n    const strong = document.createElement(\"strong\");\n    strong.className = \"ofv-xmind-topic-title\";\n    strong.textContent = topic.title;\n    card.append(strong);\n  }\n\n  if (topic.image && safeImageSource(topic.image)) {\n    const image = document.createElement(\"img\");\n    image.className = \"ofv-xmind-topic-image\";\n    image.src = topic.image;\n    image.alt = topic.title;\n    image.draggable = false;\n    card.append(image);\n  }\n\n  const chips = [...topic.labels.map((value) => `#${value}`), ...topic.markers.map(formatMarker)];\n  if (topic.kind !== \"attached\") {\n    chips.unshift(topic.kind);\n  }\n  if (chips.length) {\n    const meta = document.createElement(\"div\");\n    meta.className = \"ofv-xmind-topic-meta\";\n    for (const value of chips.slice(0, 6)) {\n      const chip = document.createElement(\"span\");\n      chip.textContent = value;\n      meta.append(chip);\n    }\n    card.append(meta);\n  }\n  if (topic.notes.length) {\n    const notes = document.createElement(\"p\");\n    notes.className = \"ofv-xmind-topic-notes\";\n    notes.textContent = topic.notes[0];\n    notes.title = topic.notes.join(\"\\n\");\n    card.append(notes);\n  }\n  return card;\n}\n\nfunction formatMarker(marker: string): string {\n  const priority = /^priority-(\\d+)$/i.exec(marker);\n  if (priority) return `P${priority[1]}`;\n  if (/^task-done$/i.test(marker)) return \"✓ done\";\n  const progress = /^task-(.+)$/i.exec(marker);\n  if (progress) return `进度 ${progress[1]}`;\n  return marker;\n}\n\nfunction safeExternalLink(value?: string): string | undefined {\n  return value && /^(?:https?:|mailto:)/i.test(value) ? value : undefined;\n}\n\nfunction safeImageSource(value: string): boolean {\n  return /^(?:blob:|data:image\\/|https?:\\/\\/)/i.test(value);\n}\n\nfunction renderXMindFallback(panel: HTMLElement, format: string, error: unknown): void {\n  const section = document.createElement(\"section\");\n  section.className = \"ofv-section ofv-xmind-fallback\";\n  const heading = document.createElement(\"h3\");\n  heading.textContent = \"XMind preview\";\n  const message = document.createElement(\"p\");\n  message.textContent = `Unable to parse ${format.toUpperCase()} workbook.`;\n  const detail = document.createElement(\"small\");\n  detail.textContent = error instanceof Error ? error.message : String(error);\n  section.append(heading, message, detail);\n  panel.append(section);\n}\n\nfunction countXMindTopics(sheets: XMindSheet[]): number {\n  const countTopic = (topic: XMindTopic): number => 1 + topic.children.reduce((total, child) => total + countTopic(child), 0);\n  return sheets.reduce((total, sheet) => total + countTopic(sheet.root), 0);\n}\n\nfunction firstDirectChild(element: Element, localName: string): Element | undefined {\n  return Array.from(element.children).find((child) => child.localName === localName);\n}\n\nfunction directChildText(element: Element, localName: string): string {\n  return (firstDirectChild(element, localName)?.textContent || \"\").trim();\n}\n\nfunction readString(value: unknown): string {\n  return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nfunction readStringArray(value: unknown): string[] {\n  if (!Array.isArray(value)) {\n    return [];\n  }\n  return value\n    .map((item) => (typeof item === \"string\" ? item.trim() : isRecord(item) ? readString(item.text) || readString(item.value) : \"\"))\n    .filter(Boolean);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction stripHtml(value: string): string {\n  return value.replace(/<[^>]+>/g, \" \").replace(/&nbsp;/gi, \" \").replace(/&amp;/gi, \"&\").replace(/\\s+/g, \" \").trim();\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n  return Math.min(max, Math.max(min, value));\n}\n\nfunction revokeObjectUrls(urls: string[]): void {\n  if (typeof URL.revokeObjectURL !== \"function\") {\n    return;\n  }\n  for (const url of urls) {\n    URL.revokeObjectURL(url);\n  }\n}\n\nfunction emptyInstance(): PreviewInstance {\n  return { destroy() {} };\n}\n","import pako from \"pako\";\nimport type { PreviewContext, PreviewInstance, PreviewPlugin } from \"../types\";\nimport { renderLibreDwgPreview, type LibreDwgPreviewOptions } from \"./cad-dwg\";\nimport { renderWebglDwgPreview, type WebglDwgPreviewOptions } from \"./cad-webgl\";\nimport { parseBinaryOasis } from \"./oasis-binary\";\nimport { createPanel, createSection, readArrayBuffer, readTextFile, resolveFormat } from \"./utils\";\n\nexport interface CadBinaryPreviewContext {\n  panel: HTMLElement;\n  fileName: string;\n  extension: \"dwg\" | \"dwf\";\n  arrayBuffer: ArrayBuffer;\n  bytes: Uint8Array;\n  preview: PreviewContext;\n}\n\nexport interface CadPluginOptions {\n  /**\n   * Optional high-fidelity renderer for proprietary binary CAD files. When it\n   * returns a preview instance, it takes over DWG/DWF rendering completely.\n   *\n   * Use it for custom front-end engines or server-side CAD conversion services.\n   */\n  binaryRenderer?: (ctx: CadBinaryPreviewContext) => Promise<PreviewInstance | void> | PreviewInstance | void;\n  /**\n   * High-fidelity WebGL DWG rendering with layers, blocks, hatches and text.\n   *\n   * The two worker bundles must be copied to `workerBaseUrl` by the host app.\n   * Rendering errors are surfaced to the host instead of switching renderers.\n   */\n  webglDwg?: false | WebglDwgPreviewOptions;\n  /**\n   * Built-in best-effort DWG preview powered by LibreDWG WASM.\n   *\n   * Pass `false` to keep the old metadata-only DWG behavior. Pass an object to\n   * configure the public WASM asset path.\n   */\n  libreDwg?: false | LibreDwgPreviewOptions;\n}\n\ninterface LayeredValue<T> {\n  layer: string;\n  value: T;\n}\n\nconst cadExtensions = new Set([\n  \"dxf\",\n  \"dwg\",\n  \"dwf\",\n  \"step\",\n  \"stp\",\n  \"iges\",\n  \"igs\",\n  \"ifc\",\n  \"sat\",\n  \"sab\",\n  \"x_t\",\n  \"x_b\",\n  \"3dm\",\n  \"skp\",\n  \"sldprt\",\n  \"sldasm\",\n  \"gds\",\n  \"gdsii\",\n  \"oas\",\n  \"oasis\"\n]);\nconst cadMimeTypes = new Set([\n  \"application/acad\",\n  \"application/dxf\",\n  \"application/x-dxf\",\n  \"image/vnd.dxf\",\n  \"model/vnd.dwf\",\n  \"model/step\",\n  \"application/step\",\n  \"application/iges\",\n  \"application/x-step\",\n  \"application/sat\",\n  \"application/sab\",\n  \"application/x-parasolid\",\n  \"model/vnd.3dm\",\n  \"application/vnd.sketchup.skp\",\n  \"application/sldworks\",\n  \"application/vnd.gds\",\n  \"application/x-gdsii\",\n  \"application/gdsii\",\n  \"application/vnd.oasis.layout\",\n  \"application/x-oasis-layout\"\n]);\nconst cadMimeFormatMap: Record<string, string> = {\n  \"application/acad\": \"dwg\",\n  \"application/dxf\": \"dxf\",\n  \"application/x-dxf\": \"dxf\",\n  \"image/vnd.dxf\": \"dxf\",\n  \"model/vnd.dwf\": \"dwf\",\n  \"model/step\": \"step\",\n  \"application/step\": \"step\",\n  \"application/iges\": \"iges\",\n  \"application/x-step\": \"ifc\",\n  \"application/sat\": \"sat\",\n  \"application/sab\": \"sab\",\n  \"application/x-parasolid\": \"x_t\",\n  \"model/vnd.3dm\": \"3dm\",\n  \"application/vnd.sketchup.skp\": \"skp\",\n  \"application/sldworks\": \"sldprt\",\n  \"application/vnd.gds\": \"gds\",\n  \"application/x-gdsii\": \"gds\",\n  \"application/gdsii\": \"gds\",\n  \"application/vnd.oasis.layout\": \"oas\",\n  \"application/x-oasis-layout\": \"oas\"\n};\n\nexport function cadPlugin(options: CadPluginOptions = {}): PreviewPlugin {\n  return {\n    name: \"cad\",\n    match(file) {\n      return cadExtensions.has(file.extension) || cadMimeTypes.has(file.mimeType);\n    },\n    async render(ctx) {\n      const panel = createPanel(\"ofv-cad\");\n      ctx.viewport.append(panel);\n\n      const extension = resolveFormat(ctx.file, cadMimeFormatMap);\n      if (extension === \"step\" || extension === \"stp\") {\n        const viewer = renderStep(panel, await readTextFile(ctx.file), extension, ctx);\n        return createCadInstance(panel, viewer);\n      }\n      if (extension === \"iges\" || extension === \"igs\") {\n        const viewer = renderIges(panel, await readTextFile(ctx.file), extension, ctx);\n        return createCadInstance(panel, viewer);\n      }\n      if (extension === \"ifc\") {\n        renderIfc(panel, await readTextFile(ctx.file));\n        return { destroy: () => panel.remove() };\n      }\n      if (extension === \"sat\") {\n        const viewer = renderAcisSat(panel, await readTextFile(ctx.file), extension, ctx);\n        return createCadInstance(panel, viewer);\n      }\n      if (extension === \"x_t\") {\n        const viewer = renderParasolidText(panel, await readTextFile(ctx.file), extension, ctx);\n        return createCadInstance(panel, viewer);\n      }\n      if (extension === \"dwg\" || extension === \"dwf\") {\n        const arrayBuffer = await readArrayBuffer(ctx.file);\n        const bytes = new Uint8Array(arrayBuffer);\n        const binaryContext: CadBinaryPreviewContext = {\n          panel,\n          fileName: ctx.file.name,\n          extension,\n          arrayBuffer,\n          bytes,\n          preview: ctx\n        };\n        const enhancedInstance = await options.binaryRenderer?.({\n          ...binaryContext\n        });\n        if (enhancedInstance) {\n          return wrapCadPreviewInstance(panel, enhancedInstance);\n        }\n        if (extension === \"dwg\" && typeof options.webglDwg === \"object\") {\n          const webglInstance = await renderWebglDwgPreview(binaryContext, options.webglDwg);\n          return wrapCadPreviewInstance(panel, webglInstance);\n        }\n        if (extension === \"dwg\" && options.libreDwg !== false) {\n          const libreDwgInstance = await renderLibreDwgPreview(\n            binaryContext,\n            typeof options.libreDwg === \"object\" ? options.libreDwg : undefined\n          );\n          if (libreDwgInstance) {\n            return wrapCadPreviewInstance(panel, libreDwgInstance);\n          }\n        }\n        renderBinaryCad(panel, bytes, extension, ctx.file.name);\n        return { destroy: () => panel.remove() };\n      }\n      if (extension === \"gds\" || extension === \"gdsii\") {\n        const viewer = renderLayoutPreview(panel, parseGdsLayout(new Uint8Array(await readArrayBuffer(ctx.file)), ctx.file.name), ctx);\n        return {\n          canCommand(command) {\n            return viewer.canCommand(command);\n          },\n          command(command) {\n            return viewer.command(command);\n          },\n          destroy() {\n            viewer.destroy();\n            panel.remove();\n          }\n        };\n      }\n      if (extension === \"oas\" || extension === \"oasis\") {\n        const viewer = renderLayoutPreview(panel, parseOasisLayout(new Uint8Array(await readArrayBuffer(ctx.file)), ctx.file.name), ctx);\n        return {\n          canCommand(command) {\n            return viewer.canCommand(command);\n          },\n          command(command) {\n            return viewer.command(command);\n          },\n          destroy() {\n            viewer.destroy();\n            panel.remove();\n          }\n        };\n      }\n      if (extension !== \"dxf\") {\n        const section = createUnsupportedCadSection(extension, ctx.file.name);\n        panel.append(section);\n        return { destroy: () => panel.remove() };\n      }\n\n      const dxf = await readTextFile(ctx.file);\n      const viewer = renderDxf(panel, dxf, ctx);\n      return {\n        canCommand(command) {\n          return viewer.canCommand(command);\n        },\n        command(command) {\n          return viewer.command(command);\n        },\n        destroy() {\n          panel.remove();\n        }\n      };\n    }\n  };\n}\n\nfunction wrapCadPreviewInstance(panel: HTMLElement, instance: PreviewInstance): PreviewInstance {\n  return {\n    resize(size) {\n      instance.resize?.(size);\n    },\n    canCommand(command) {\n      return instance.canCommand?.(command) ?? false;\n    },\n    command(command) {\n      return instance.command?.(command);\n    },\n    preparePrint() {\n      return instance.preparePrint?.();\n    },\n    destroy() {\n      instance.destroy();\n      panel.remove();\n    }\n  };\n}\n\nfunction createCadInstance(\n  panel: HTMLElement,\n  viewer?: {\n    canCommand: (command: string) => boolean;\n    command: (command: string) => boolean;\n    destroy: () => void;\n  }\n): PreviewInstance {\n  return {\n    canCommand(command) {\n      return viewer?.canCommand(command) ?? false;\n    },\n    command(command) {\n      return viewer?.command(command) ?? false;\n    },\n    destroy() {\n      viewer?.destroy();\n      panel.remove();\n    }\n  };\n}\n\nfunction renderStep(\n  panel: HTMLElement,\n  text: string,\n  extension: string,\n  ctx: Pick<PreviewContext, \"toolbar\">\n): ReturnType<typeof createGeometryViewer> | undefined {\n  const records = parseStepRecords(text);\n  const typeCounts = countBy(records.map((record) => record.type));\n  const geometry = createCadGeometryPreview(extractStepGeometry(records), \"STEP 轻量几何预览\");\n  const section = createSection(geometry ? `${extension.toUpperCase()} 轻量几何预览` : `${extension.toUpperCase()} 结构预览`);\n  const note = document.createElement(\"p\");\n  note.textContent = \"当前版本提取 STEP 文本实体、类型统计和关键几何参数。精确 B-Rep/曲面渲染建议后续接入 CAD 内核或服务端转换。\";\n\n  const meta = document.createElement(\"div\");\n  meta.className = \"ofv-cad-summary\";\n  appendMeta(meta, \"实体\", records.length);\n  appendMeta(meta, \"类型\", typeCounts.size);\n  appendMeta(meta, \"点\", typeCounts.get(\"CARTESIAN_POINT\") || 0);\n  appendMeta(meta, \"方向\", typeCounts.get(\"DIRECTION\") || 0);\n  const typeList = createCadTypeList(typeCounts);\n  section.append(note, meta, typeList);\n\n  let viewer: ReturnType<typeof createGeometryViewer> | undefined;\n  if (geometry) {\n    hideSuccessfulSectionHeading(section);\n    hideSupplementalInfo(note);\n    hideSupplementalInfo(meta);\n    hideSupplementalInfo(typeList);\n    section.append(geometry.element);\n    viewer = createGeometryViewer(geometry.svg, geometry.bounds, ctx);\n  }\n\n  const table = createCadEntityTable(\n    records.slice(0, 200).map((record) => ({\n      id: record.id,\n      type: record.type,\n      detail: summarizeStepRecord(record)\n    }))\n  );\n  if (geometry) {\n    hideSupplementalInfo(table);\n  }\n  section.append(table);\n  panel.append(section);\n  return viewer;\n}\n\nfunction renderIges(\n  panel: HTMLElement,\n  text: string,\n  extension: string,\n  ctx: Pick<PreviewContext, \"toolbar\">\n): ReturnType<typeof createGeometryViewer> | undefined {\n  const records = parseIgesRecords(text);\n  const typeCounts = countBy(records.map((record) => record.type));\n  const geometry = createCadGeometryPreview(extractIgesGeometry(records), \"IGES 轻量几何预览\");\n  const section = createSection(geometry ? `${extension.toUpperCase()} 轻量几何预览` : `${extension.toUpperCase()} 结构预览`);\n  const note = document.createElement(\"p\");\n  note.textContent = \"当前版本提取 IGES 参数区实体、类型统计和基础参数。精确曲线/曲面渲染建议后续接入 CAD 内核或服务端转换。\";\n\n  const meta = document.createElement(\"div\");\n  meta.className = \"ofv-cad-summary\";\n  appendMeta(meta, \"实体\", records.length);\n  appendMeta(meta, \"类型\", typeCounts.size);\n  appendMeta(meta, \"点实体\", typeCounts.get(\"116\") || 0);\n  appendMeta(meta, \"线实体\", typeCounts.get(\"110\") || 0);\n  const typeList = createCadTypeList(typeCounts, \"类型号统计\");\n  section.append(note, meta, typeList);\n\n  let viewer: ReturnType<typeof createGeometryViewer> | undefined;\n  if (geometry) {\n    hideSuccessfulSectionHeading(section);\n    hideSupplementalInfo(note);\n    hideSupplementalInfo(meta);\n    hideSupplementalInfo(typeList);\n    section.append(geometry.element);\n    viewer = createGeometryViewer(geometry.svg, geometry.bounds, ctx);\n  }\n\n  const table = createCadEntityTable(\n    records.slice(0, 200).map((record, index) => ({\n      id: String(index + 1),\n      type: igesTypeName(record.type),\n      detail: record.params.slice(0, 8).join(\", \")\n    }))\n  );\n  if (geometry) {\n    hideSupplementalInfo(table);\n  }\n  section.append(table);\n  panel.append(section);\n  return viewer;\n}\n\nfunction renderIfc(panel: HTMLElement, text: string): void {\n  const records = parseStepRecords(text);\n  const typeCounts = countBy(records.map((record) => record.type));\n  const section = createSection(\"IFC BIM 结构预览\");\n  const note = document.createElement(\"p\");\n  note.textContent = \"当前版本提取 IFC STEP 实体、BIM 层级和常见构件统计。几何网格、材质和属性集可后续接入 IfcOpenShell/IFC.js 增强。\";\n\n  const meta = document.createElement(\"div\");\n  meta.className = \"ofv-cad-summary\";\n  appendMeta(meta, \"实体\", records.length);\n  appendMeta(meta, \"类型\", typeCounts.size);\n  appendMeta(meta, \"项目\", typeCounts.get(\"IFCPROJECT\") || 0);\n  appendMeta(meta, \"建筑\", typeCounts.get(\"IFCBUILDING\") || 0);\n  appendMeta(meta, \"楼层\", typeCounts.get(\"IFCBUILDINGSTOREY\") || 0);\n  appendMeta(meta, \"空间\", typeCounts.get(\"IFCSPACE\") || 0);\n  appendMeta(meta, \"构件\", countIfcElements(typeCounts));\n  section.append(note, meta, createCadTypeList(typeCounts, \"IFC 实体统计\"));\n\n  const hierarchy = createIfcHierarchy(records);\n  if (hierarchy) {\n    section.append(hierarchy);\n  }\n\n  const table = createCadEntityTable(\n    records.slice(0, 240).map((record) => ({\n      id: record.id,\n      type: record.type,\n      detail: summarizeIfcRecord(record)\n    }))\n  );\n  section.append(table);\n  panel.append(section);\n}\n\nfunction renderAcisSat(\n  panel: HTMLElement,\n  text: string,\n  extension: string,\n  ctx: Pick<PreviewContext, \"toolbar\">\n): ReturnType<typeof createGeometryViewer> | undefined {\n  const records = parseAcisSatRecords(text);\n  const typeCounts = countBy(records.map((record) => record.type));\n  const geometry = createCadGeometryPreview(extractAcisSatGeometry(records), \"SAT 轻量几何预览\");\n  const section = createSection(geometry ? `${extension.toUpperCase()} ACIS 轻量几何预览` : `${extension.toUpperCase()} ACIS 结构预览`);\n  const note = document.createElement(\"p\");\n  note.textContent =\n    \"当前版本会在前端解析 ACIS SAT 文本实体、类型统计和常见 vertex/straight-curve 几何线索；精确曲面、拓扑和布尔体仍建议接入 CAD 内核增强。\";\n\n  const meta = document.createElement(\"div\");\n  meta.className = \"ofv-cad-summary\";\n  appendMeta(meta, \"实体\", records.length);\n  appendMeta(meta, \"类型\", typeCounts.size);\n  appendMeta(meta, \"顶点\", typeCounts.get(\"vertex\") || 0);\n  appendMeta(meta, \"直线\", typeCounts.get(\"straight-curve\") || 0);\n  const typeList = createCadTypeList(typeCounts);\n  section.append(note, meta, typeList);\n\n  let viewer: ReturnType<typeof createGeometryViewer> | undefined;\n  if (geometry) {\n    hideSuccessfulSectionHeading(section);\n    hideSupplementalInfo(note);\n    hideSupplementalInfo(meta);\n    hideSupplementalInfo(typeList);\n    section.append(geometry.element);\n    viewer = createGeometryViewer(geometry.svg, geometry.bounds, ctx);\n  }\n\n  const table = createCadEntityTable(\n    records.slice(0, 200).map((record) => ({\n      id: record.id,\n      type: record.type,\n      detail: summarizeAcisRecord(record)\n    }))\n  );\n  if (geometry) {\n    hideSupplementalInfo(table);\n  }\n  section.append(table);\n  panel.append(section);\n  return viewer;\n}\n\nfunction renderParasolidText(\n  panel: HTMLElement,\n  text: string,\n  extension: string,\n  ctx: Pick<PreviewContext, \"toolbar\">\n): ReturnType<typeof createGeometryViewer> | undefined {\n  const records = parseParasolidTextRecords(text);\n  const typeCounts = countBy(records.map((record) => record.type));\n  const geometry = createCadGeometryPreview(extractParasolidTextGeometry(records), \"Parasolid 轻量几何预览\");\n  const section = createSection(\n    geometry ? `${extension.toUpperCase()} Parasolid 轻量几何预览` : `${extension.toUpperCase()} Parasolid 文本预览`\n  );\n  const note = document.createElement(\"p\");\n  note.textContent =\n    \"当前版本会在前端解析 Parasolid x_t 文本片段、实体类型、坐标点和基础线段线索；完整 B-Rep、曲面和装配关系建议接入 Parasolid/HOOPS/ODA 等专业内核。\";\n\n  const meta = document.createElement(\"div\");\n  meta.className = \"ofv-cad-summary\";\n  appendMeta(meta, \"实体\", records.length);\n  appendMeta(meta, \"类型\", typeCounts.size);\n  appendMeta(meta, \"点\", typeCounts.get(\"point\") || typeCounts.get(\"vertex\") || 0);\n  appendMeta(meta, \"曲线\", (typeCounts.get(\"line\") || 0) + (typeCounts.get(\"curve\") || 0));\n  const typeList = createCadTypeList(typeCounts);\n  section.append(note, meta, typeList);\n\n  let viewer: ReturnType<typeof createGeometryViewer> | undefined;\n  if (geometry) {\n    hideSuccessfulSectionHeading(section);\n    hideSupplementalInfo(note);\n    hideSupplementalInfo(meta);\n    hideSupplementalInfo(typeList);\n    section.append(geometry.element);\n    viewer = createGeometryViewer(geometry.svg, geometry.bounds, ctx);\n  }\n\n  const table = createCadEntityTable(\n    records.slice(0, 200).map((record) => ({\n      id: record.id,\n      type: record.type,\n      detail: summarizeParasolidRecord(record)\n    }))\n  );\n  if (geometry) {\n    hideSupplementalInfo(table);\n  }\n  section.append(table);\n  panel.append(section);\n  return viewer;\n}\n\ntype StepRecord = {\n  id: string;\n  type: string;\n  args: string;\n};\n\ntype TextCadRecord = {\n  id: string;\n  type: string;\n  args: string;\n  numbers: number[];\n};\n\ntype IgesRecord = {\n  type: string;\n  params: string[];\n};\n\ntype CadGeometryPoint = {\n  x: number;\n  y: number;\n  label?: string;\n};\n\ntype CadGeometryLine = {\n  x1: number;\n  y1: number;\n  x2: number;\n  y2: number;\n  label?: string;\n};\n\ntype CadGeometryPreview = {\n  points: CadGeometryPoint[];\n  lines: CadGeometryLine[];\n};\n\ntype CadGeometryBounds = LayoutBounds & {\n  pointRadius: number;\n};\n\ntype LayoutPoint = [number, number];\n\ntype LayoutShape = {\n  kind: \"boundary\" | \"path\" | \"box\";\n  cell?: string;\n  layer: string;\n  datatype?: string;\n  points: LayoutPoint[];\n  width?: number;\n};\n\ntype LayoutLabel = {\n  cell?: string;\n  layer: string;\n  text: string;\n  x: number;\n  y: number;\n};\n\ntype LayoutReference = {\n  ownerCell?: string;\n  cell: string;\n  x: number;\n  y: number;\n  columns?: number;\n  rows?: number;\n  columnDx?: number;\n  columnDy?: number;\n  rowDx?: number;\n  rowDy?: number;\n};\n\ntype LayoutPreviewData = {\n  format: \"GDSII\" | \"OASIS\";\n  fileName: string;\n  libraryName?: string;\n  version?: string;\n  unit?: string;\n  cells: string[];\n  shapes: LayoutShape[];\n  labels: LayoutLabel[];\n  references: LayoutReference[];\n  layers: Map<string, number>;\n  metadata: Array<[string, string | number]>;\n  notes: string[];\n  warnings: string[];\n};\n\ntype LayoutBounds = {\n  minX: number;\n  minY: number;\n  width: number;\n  height: number;\n  stroke: number;\n};\n\nconst layoutPalette = [\n  \"#60a5fa\",\n  \"#f87171\",\n  \"#34d399\",\n  \"#c084fc\",\n  \"#fbbf24\",\n  \"#22d3ee\",\n  \"#fb7185\",\n  \"#818cf8\",\n  \"#4ade80\",\n  \"#facc15\"\n];\n\nconst gdsRecordNames: Record<number, string> = {\n  0x00: \"HEADER\",\n  0x01: \"BGNLIB\",\n  0x02: \"LIBNAME\",\n  0x03: \"UNITS\",\n  0x04: \"ENDLIB\",\n  0x05: \"BGNSTR\",\n  0x06: \"STRNAME\",\n  0x07: \"ENDSTR\",\n  0x08: \"BOUNDARY\",\n  0x09: \"PATH\",\n  0x0a: \"SREF\",\n  0x0b: \"AREF\",\n  0x0c: \"TEXT\",\n  0x0d: \"LAYER\",\n  0x0e: \"DATATYPE\",\n  0x0f: \"WIDTH\",\n  0x10: \"XY\",\n  0x11: \"ENDEL\",\n  0x12: \"SNAME\",\n  0x13: \"COLROW\",\n  0x16: \"TEXTTYPE\",\n  0x19: \"STRING\",\n  0x2d: \"BOX\"\n};\n\nconst oasisRecordNames: Record<number, string> = {\n  0: \"PAD\",\n  1: \"START\",\n  2: \"END\",\n  3: \"CELLNAME\",\n  4: \"CELLNAME-REF\",\n  5: \"TEXTSTRING\",\n  6: \"TEXTSTRING-REF\",\n  7: \"PROPNAME\",\n  8: \"PROPNAME-REF\",\n  9: \"PROPSTRING\",\n  10: \"PROPSTRING-REF\",\n  11: \"LAYERNAME\",\n  12: \"LAYERNAME-REF\",\n  13: \"CELL\",\n  14: \"CELL\",\n  15: \"XYABSOLUTE\",\n  16: \"XYRELATIVE\",\n  17: \"PLACEMENT\",\n  18: \"PLACEMENT\",\n  19: \"TEXT\",\n  20: \"RECTANGLE\",\n  21: \"POLYGON\",\n  22: \"PATH\",\n  23: \"TRAPEZOID\",\n  24: \"TRAPEZOID\",\n  25: \"TRAPEZOID\",\n  26: \"CTRAPEZOID\",\n  27: \"CIRCLE\",\n  28: \"PROPERTY\",\n  29: \"PROPERTY\",\n  30: \"XNAME\",\n  31: \"XNAME-REF\",\n  32: \"XELEMENT\",\n  33: \"XGEOMETRY\",\n  34: \"CBLOCK\"\n};\n\nfunction renderLayoutPreview(\n  panel: HTMLElement,\n  data: LayoutPreviewData,\n  ctx: Pick<PreviewContext, \"toolbar\">\n): {\n  canCommand: (command: string) => boolean;\n  command: (command: string) => boolean;\n  destroy: () => void;\n} {\n  const section = createSection(`${data.format} 版图预览`);\n  const summary = document.createElement(\"div\");\n  summary.className = \"ofv-cad-summary ofv-layout-summary\";\n  summary.hidden = data.shapes.length > 0 || data.labels.length > 0 || data.references.length > 0;\n  if (summary.hidden) {\n    summary.setAttribute(\"aria-hidden\", \"true\");\n    summary.style.display = \"none\";\n  }\n  appendMeta(summary, \"文件\", data.fileName);\n  appendMeta(summary, \"格式\", data.format);\n  if (data.libraryName) {\n    appendMeta(summary, \"库\", data.libraryName);\n  }\n  if (data.version) {\n    appendMeta(summary, \"版本\", data.version);\n  }\n  if (data.unit) {\n    appendMeta(summary, \"单位\", data.unit);\n  }\n  appendMeta(summary, \"Cell\", data.cells.length);\n  appendMeta(summary, \"几何\", data.shapes.length);\n  appendMeta(summary, \"引用\", data.references.length);\n  appendMeta(summary, \"文字\", data.labels.length);\n  for (const [label, value] of data.metadata) {\n    appendMeta(summary, label, value);\n  }\n  section.append(summary);\n\n  for (const noteText of [...data.notes, ...data.warnings]) {\n    const note = document.createElement(\"p\");\n    note.className = data.warnings.includes(noteText) ? \"ofv-layout-warning\" : \"ofv-layout-note\";\n    note.textContent = noteText;\n    if (!data.warnings.includes(noteText) && hasDrawableLayout(data)) {\n      hideSupplementalInfo(note);\n    }\n    section.append(note);\n  }\n\n  const bounds = computeLayoutBounds(data.shapes, data.labels, data.references);\n  const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n  svg.setAttribute(\"class\", \"ofv-svg-stage ofv-layout-stage\");\n  const webgl = shouldUseWebglLayoutPreview(data) ? createLayoutWebglPreview(data.shapes, data.layers) : undefined;\n  let currentViewBox = { x: bounds.minX, y: bounds.minY, width: bounds.width, height: bounds.height };\n  const initialViewBox = { ...currentViewBox };\n  const applyViewBox = () => {\n    if (webgl) {\n      webgl.render(currentViewBox);\n    } else {\n      svg.setAttribute(\"viewBox\", `${currentViewBox.x} ${currentViewBox.y} ${currentViewBox.width} ${currentViewBox.height}`);\n    }\n  };\n  applyViewBox();\n\n  if (data.shapes.length === 0) {\n    const empty = document.createElementNS(svg.namespaceURI, \"text\");\n    empty.setAttribute(\"x\", String(bounds.minX + bounds.width * 0.5));\n    empty.setAttribute(\"y\", String(bounds.minY + bounds.height * 0.5));\n    empty.setAttribute(\"text-anchor\", \"middle\");\n    empty.setAttribute(\"font-size\", String(Math.max(bounds.width, bounds.height) / 34));\n    empty.setAttribute(\"fill\", \"currentColor\");\n    empty.textContent = \"已识别版图文件，当前文件未解析出可绘制几何\";\n    svg.append(empty);\n  }\n\n  if (!webgl) {\n    const layerIndex = new Map([...data.layers.keys()].sort((a, b) => a.localeCompare(b)).map((layer, index) => [layer, index]));\n    for (const shape of data.shapes.slice(0, 6000)) {\n      const color = layoutPalette[(layerIndex.get(shape.layer) || 0) % layoutPalette.length];\n      if (shape.kind === \"path\") {\n        const polyline = document.createElementNS(svg.namespaceURI, \"polyline\");\n        polyline.setAttribute(\"points\", shape.points.map(([x, y]) => `${x},${-y}`).join(\" \"));\n        polyline.setAttribute(\"fill\", \"none\");\n        polyline.setAttribute(\"stroke\", color);\n        polyline.setAttribute(\"stroke-width\", String(Math.max(bounds.stroke, Math.abs(shape.width || 0))));\n        polyline.setAttribute(\"stroke-linecap\", \"round\");\n        polyline.setAttribute(\"stroke-linejoin\", \"round\");\n        applyLayer(polyline, shape.layer);\n        svg.append(polyline);\n        continue;\n      }\n      const polygon = document.createElementNS(svg.namespaceURI, \"polygon\");\n      polygon.setAttribute(\"points\", shape.points.map(([x, y]) => `${x},${-y}`).join(\" \"));\n      polygon.setAttribute(\"fill\", color);\n      polygon.setAttribute(\"fill-opacity\", \"0.3\");\n      polygon.setAttribute(\"stroke\", color);\n      polygon.setAttribute(\"stroke-width\", String(bounds.stroke));\n      polygon.setAttribute(\"vector-effect\", \"non-scaling-stroke\");\n      applyLayer(polygon, shape.layer);\n      svg.append(polygon);\n    }\n  }\n\n  for (const label of webgl ? [] : data.labels.slice(0, 400)) {\n    const text = document.createElementNS(svg.namespaceURI, \"text\");\n    text.setAttribute(\"x\", String(label.x));\n    text.setAttribute(\"y\", String(-label.y));\n    text.setAttribute(\"font-size\", String(Math.max(bounds.stroke * 12, Math.max(bounds.width, bounds.height) / 120)));\n    text.setAttribute(\"fill\", \"currentColor\");\n    text.textContent = label.text;\n    applyLayer(text, label.layer);\n    svg.append(text);\n  }\n\n  const layers = [...data.layers.keys()].sort((a, b) => a.localeCompare(b));\n  if (layers.length > 0) {\n    const layerControls = createLayoutLayerControls(webgl ? undefined : svg, layers, data.layers, (layer, visible) => {\n      webgl?.setLayerVisible(layer, visible);\n    });\n    if (hasDrawableLayout(data)) {\n      hideSupplementalInfo(layerControls);\n    }\n    section.append(layerControls);\n  }\n  section.append(webgl?.canvas || svg);\n  if (data.cells.length > 0) {\n    section.append(createLayoutCellList(data.cells, data.references, hasDrawableLayout(data)));\n  }\n  panel.append(section);\n\n  const updateToolbarZoom = () => ctx.toolbar?.setZoom(initialViewBox.width / currentViewBox.width);\n  updateToolbarZoom();\n\n  return {\n    canCommand(command) {\n      return command === \"zoom-in\" || command === \"zoom-out\" || command === \"zoom-reset\";\n    },\n    command(command) {\n      if (command === \"zoom-in\" || command === \"zoom-out\") {\n        const factor = command === \"zoom-in\" ? 0.82 : 1.18;\n        const centerX = currentViewBox.x + currentViewBox.width / 2;\n        const centerY = currentViewBox.y + currentViewBox.height / 2;\n        currentViewBox.width *= factor;\n        currentViewBox.height *= factor;\n        currentViewBox.x = centerX - currentViewBox.width / 2;\n        currentViewBox.y = centerY - currentViewBox.height / 2;\n        applyViewBox();\n        updateToolbarZoom();\n        return true;\n      }\n      if (command === \"zoom-reset\") {\n        currentViewBox = { ...initialViewBox };\n        applyViewBox();\n        updateToolbarZoom();\n        return true;\n      }\n      return false;\n    },\n    destroy() {\n      webgl?.destroy();\n      ctx.toolbar?.setZoom(undefined);\n    }\n  };\n}\n\ntype LayoutWebglPreview = {\n  canvas: HTMLCanvasElement;\n  render: (viewBox: { x: number; y: number; width: number; height: number }) => void;\n  setLayerVisible: (layer: string, visible: boolean) => void;\n  destroy: () => void;\n};\n\nfunction shouldUseWebglLayoutPreview(data: LayoutPreviewData): boolean {\n  if (data.labels.length > 0) return false;\n  if (data.shapes.length < 360 && data.shapes.reduce((sum, shape) => sum + shape.points.length, 0) < 1800) {\n    return false;\n  }\n  return typeof WebGLRenderingContext !== \"undefined\";\n}\n\nfunction createLayoutWebglPreview(shapes: LayoutShape[], layerCounts: Map<string, number>): LayoutWebglPreview | undefined {\n  const canvas = document.createElement(\"canvas\");\n  canvas.className = \"ofv-svg-stage ofv-layout-stage ofv-layout-webgl-stage\";\n  canvas.width = 1440;\n  canvas.height = 864;\n  canvas.dataset.renderer = \"webgl\";\n  let gl: WebGLRenderingContext | null;\n  try {\n    gl = canvas.getContext(\"webgl\", { alpha: false, antialias: true });\n  } catch {\n    return undefined;\n  }\n  if (!gl) return undefined;\n\n  const vertexShader = compileLayoutShader(\n    gl,\n    gl.VERTEX_SHADER,\n    \"attribute vec2 a_position; uniform vec4 u_viewBox; void main() { float x = (a_position.x - u_viewBox.x) / u_viewBox.z * 2.0 - 1.0; float y = 1.0 - (a_position.y - u_viewBox.y) / u_viewBox.w * 2.0; gl_Position = vec4(x, y, 0.0, 1.0); }\"\n  );\n  const fragmentShader = compileLayoutShader(\n    gl,\n    gl.FRAGMENT_SHADER,\n    \"precision mediump float; uniform vec4 u_color; void main() { gl_FragColor = u_color; }\"\n  );\n  if (!vertexShader || !fragmentShader) return undefined;\n  const program = gl.createProgram();\n  if (!program) return undefined;\n  gl.attachShader(program, vertexShader);\n  gl.attachShader(program, fragmentShader);\n  gl.linkProgram(program);\n  if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n    gl.deleteProgram(program);\n    gl.deleteShader(vertexShader);\n    gl.deleteShader(fragmentShader);\n    return undefined;\n  }\n  const buffer = gl.createBuffer();\n  const position = gl.getAttribLocation(program, \"a_position\");\n  const viewBoxUniform = gl.getUniformLocation(program, \"u_viewBox\");\n  const colorUniform = gl.getUniformLocation(program, \"u_color\");\n  if (!buffer || position < 0 || !viewBoxUniform || !colorUniform) {\n    gl.deleteProgram(program);\n    gl.deleteShader(vertexShader);\n    gl.deleteShader(fragmentShader);\n    return undefined;\n  }\n\n  const layers = [...layerCounts.keys()].sort((a, b) => a.localeCompare(b));\n  const layerIndex = new Map(layers.map((layer, index) => [layer, index]));\n  const geometry = new Map<string, { fill: Float32Array; lines: Float32Array; color: [number, number, number] }>();\n  for (const layer of layers) {\n    const fill: number[] = [];\n    const lines: number[] = [];\n    for (const shape of shapes) {\n      if (shape.layer !== layer) continue;\n      const points = shape.points.map(([x, y]) => [x, -y] as LayoutPoint);\n      if (points.length > 1 && pointsEqual(points[0], points[points.length - 1])) points.pop();\n      if (shape.kind !== \"path\" && points.length >= 3) {\n        for (let index = 1; index < points.length - 1; index += 1) {\n          fill.push(...points[0], ...points[index], ...points[index + 1]);\n        }\n      }\n      for (let index = 0; index < points.length - 1; index += 1) {\n        lines.push(...points[index], ...points[index + 1]);\n      }\n      if (shape.kind !== \"path\" && points.length > 2) lines.push(...points[points.length - 1], ...points[0]);\n    }\n    geometry.set(layer, {\n      fill: new Float32Array(fill),\n      lines: new Float32Array(lines),\n      color: parseLayoutColor(layoutPalette[(layerIndex.get(layer) || 0) % layoutPalette.length])\n    });\n  }\n\n  const visibleLayers = new Set(layers);\n  let currentViewBox = { x: 0, y: 0, width: 1, height: 1 };\n  const render = (viewBox: { x: number; y: number; width: number; height: number }) => {\n    currentViewBox = { ...viewBox };\n    const fitted = fitLayoutViewBox(viewBox, canvas.width / canvas.height);\n    gl.viewport(0, 0, canvas.width, canvas.height);\n    gl.clearColor(16 / 255, 20 / 255, 28 / 255, 1);\n    gl.clear(gl.COLOR_BUFFER_BIT);\n    gl.useProgram(program);\n    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n    gl.enableVertexAttribArray(position);\n    gl.vertexAttribPointer(position, 2, gl.FLOAT, false, 0, 0);\n    gl.uniform4f(viewBoxUniform, fitted.x, fitted.y, fitted.width, fitted.height);\n    gl.enable(gl.BLEND);\n    gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n    for (const layer of layers) {\n      if (!visibleLayers.has(layer)) continue;\n      const item = geometry.get(layer);\n      if (!item) continue;\n      if (item.fill.length) {\n        gl.bufferData(gl.ARRAY_BUFFER, item.fill, gl.STATIC_DRAW);\n        gl.uniform4f(colorUniform, ...item.color, 0.3);\n        gl.drawArrays(gl.TRIANGLES, 0, item.fill.length / 2);\n      }\n      if (item.lines.length) {\n        gl.bufferData(gl.ARRAY_BUFFER, item.lines, gl.STATIC_DRAW);\n        gl.uniform4f(colorUniform, ...item.color, 0.95);\n        gl.drawArrays(gl.LINES, 0, item.lines.length / 2);\n      }\n    }\n  };\n\n  return {\n    canvas,\n    render,\n    setLayerVisible(layer, visible) {\n      if (visible) visibleLayers.add(layer);\n      else visibleLayers.delete(layer);\n      render(currentViewBox);\n    },\n    destroy() {\n      gl.deleteBuffer(buffer);\n      gl.deleteProgram(program);\n      gl.deleteShader(vertexShader);\n      gl.deleteShader(fragmentShader);\n    }\n  };\n}\n\nfunction compileLayoutShader(gl: WebGLRenderingContext, type: number, source: string): WebGLShader | undefined {\n  const shader = gl.createShader(type);\n  if (!shader) return undefined;\n  gl.shaderSource(shader, source);\n  gl.compileShader(shader);\n  if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n    gl.deleteShader(shader);\n    return undefined;\n  }\n  return shader;\n}\n\nfunction pointsEqual(left: LayoutPoint, right: LayoutPoint): boolean {\n  return left[0] === right[0] && left[1] === right[1];\n}\n\nfunction parseLayoutColor(color: string): [number, number, number] {\n  return [1, 3, 5].map((offset) => Number.parseInt(color.slice(offset, offset + 2), 16) / 255) as [number, number, number];\n}\n\nfunction fitLayoutViewBox(\n  viewBox: { x: number; y: number; width: number; height: number },\n  aspect: number\n): { x: number; y: number; width: number; height: number } {\n  const result = { ...viewBox };\n  const viewAspect = result.width / result.height;\n  if (viewAspect > aspect) {\n    const height = result.width / aspect;\n    result.y -= (height - result.height) / 2;\n    result.height = height;\n  } else {\n    const width = result.height * aspect;\n    result.x -= (width - result.width) / 2;\n    result.width = width;\n  }\n  return result;\n}\n\nfunction parseGdsLayout(bytes: Uint8Array, fileName: string): LayoutPreviewData {\n  const shapes: LayoutShape[] = [];\n  const labels: LayoutLabel[] = [];\n  const references: LayoutReference[] = [];\n  const cells: string[] = [];\n  const layers = new Map<string, number>();\n  const recordCounts = new Map<string, number>();\n  const warnings: string[] = [];\n  let libraryName = \"\";\n  let version = \"\";\n  let unit = \"\";\n  let offset = 0;\n  let current: Partial<LayoutShape> &\n    Partial<LayoutLabel> &\n    Partial<Pick<LayoutReference, \"cell\" | \"columns\" | \"rows\" | \"columnDx\" | \"columnDy\" | \"rowDx\" | \"rowDy\">> = {};\n  let currentKind = \"\";\n  let currentCell = \"\";\n\n  while (offset + 4 <= bytes.length) {\n    const length = readUInt16(bytes, offset);\n    const recordType = bytes[offset + 2];\n    const data = bytes.slice(offset + 4, offset + length);\n    const name = gdsRecordNames[recordType] || `0x${recordType.toString(16).padStart(2, \"0\")}`;\n    recordCounts.set(name, (recordCounts.get(name) || 0) + 1);\n    if (length < 4 || offset + length > bytes.length) {\n      warnings.push(`GDS 记录在 ${offset} 字节处长度异常，已停止解析。`);\n      break;\n    }\n\n    if (recordType === 0x00 && data.length >= 2) {\n      version = String(readUInt16(data, 0));\n    } else if (recordType === 0x02) {\n      libraryName = readGdsString(data);\n    } else if (recordType === 0x03 && data.length >= 16) {\n      unit = `${formatGdsReal(data, 0)} / ${formatGdsReal(data, 8)}`;\n    } else if (recordType === 0x06) {\n      currentCell = readGdsString(data);\n      cells.push(currentCell);\n    } else if (recordType === 0x08 || recordType === 0x09 || recordType === 0x2d) {\n      currentKind = recordType === 0x09 ? \"path\" : recordType === 0x2d ? \"box\" : \"boundary\";\n      current = { kind: currentKind as LayoutShape[\"kind\"], layer: \"0\", datatype: \"0\", points: [] };\n    } else if (recordType === 0x0c) {\n      currentKind = \"text\";\n      current = { layer: \"0\", text: \"\", x: 0, y: 0 };\n    } else if (recordType === 0x0a || recordType === 0x0b) {\n      currentKind = \"reference\";\n      current = { cell: \"\", x: 0, y: 0 };\n    } else if (recordType === 0x0d && data.length >= 2) {\n      current.layer = String(readInt16(data, 0));\n    } else if ((recordType === 0x0e || recordType === 0x16) && data.length >= 2) {\n      current.datatype = String(readInt16(data, 0));\n    } else if (recordType === 0x0f && data.length >= 4) {\n      current.width = Math.abs(readInt32(data, 0));\n    } else if (recordType === 0x13 && data.length >= 4) {\n      current.columns = Math.max(1, readInt16(data, 0));\n      current.rows = Math.max(1, readInt16(data, 2));\n    } else if (recordType === 0x10) {\n      const points = readGdsPoints(data);\n      if (currentKind === \"text\" && points[0]) {\n        current.x = points[0][0];\n        current.y = points[0][1];\n      } else if (currentKind === \"reference\" && points[0]) {\n        current.x = points[0][0];\n        current.y = points[0][1];\n        if (points.length >= 3) {\n          const columns = Math.max(1, Number(current.columns || 1));\n          const rows = Math.max(1, Number(current.rows || 1));\n          current.columnDx = (points[1][0] - points[0][0]) / Math.max(1, columns - 1);\n          current.columnDy = (points[1][1] - points[0][1]) / Math.max(1, columns - 1);\n          current.rowDx = (points[2][0] - points[0][0]) / Math.max(1, rows - 1);\n          current.rowDy = (points[2][1] - points[0][1]) / Math.max(1, rows - 1);\n        }\n      } else {\n        current.points = points;\n      }\n    } else if (recordType === 0x12) {\n      current.cell = readGdsString(data);\n    } else if (recordType === 0x19) {\n      current.text = readGdsString(data);\n    } else if (recordType === 0x11) {\n      if ((currentKind === \"boundary\" || currentKind === \"path\" || currentKind === \"box\") && current.points && current.points.length > 1) {\n        const shape: LayoutShape = {\n          kind: current.kind || \"boundary\",\n          cell: currentCell,\n          layer: String(current.layer || \"0\"),\n          datatype: current.datatype,\n          points: current.points,\n          width: current.width\n        };\n        shapes.push(shape);\n        layers.set(shape.layer, (layers.get(shape.layer) || 0) + 1);\n      } else if (currentKind === \"text\" && current.text) {\n        const label: LayoutLabel = {\n          cell: currentCell,\n          layer: String(current.layer || \"0\"),\n          text: String(current.text),\n          x: Number(current.x || 0),\n          y: Number(current.y || 0)\n        };\n        labels.push(label);\n        layers.set(label.layer, (layers.get(label.layer) || 0) + 1);\n      } else if (currentKind === \"reference\" && current.cell) {\n        references.push({\n          ownerCell: currentCell,\n          cell: String(current.cell),\n          x: Number(current.x || 0),\n          y: Number(current.y || 0),\n          columns: current.columns,\n          rows: current.rows,\n          columnDx: current.columnDx,\n          columnDy: current.columnDy,\n          rowDx: current.rowDx,\n          rowDy: current.rowDy\n        });\n      }\n      current = {};\n      currentKind = \"\";\n    }\n\n    offset += length;\n  }\n\n  const expanded = expandLayoutReferences(shapes, labels, references, cells);\n\n  return {\n    format: \"GDSII\",\n    fileName,\n    libraryName,\n    version: version ? `Stream ${version}` : undefined,\n    unit,\n    cells,\n    shapes: expanded.shapes,\n    labels: expanded.labels,\n    references,\n    layers: countLayoutLayers(expanded.shapes, expanded.labels),\n    metadata: [\n      [\"大小\", formatBytes(bytes.byteLength)],\n      [\"记录\", sumCounts(recordCounts)],\n      [\"记录类型\", recordCounts.size],\n      [\"展开几何\", expanded.addedShapes]\n    ],\n    notes: [\n      `已从 GDSII Stream 中解析 ${shapes.length} 个原始几何、${references.length} 个 cell 引用和 ${labels.length} 段文字，并展开 ${expanded.addedShapes} 个引用几何。`\n    ],\n    warnings\n  };\n}\n\nfunction expandLayoutReferences(\n  shapes: LayoutShape[],\n  labels: LayoutLabel[],\n  references: LayoutReference[],\n  cells: string[]\n): { shapes: LayoutShape[]; labels: LayoutLabel[]; addedShapes: number } {\n  if (references.length === 0 || shapes.length === 0) {\n    return { shapes, labels, addedShapes: 0 };\n  }\n\n  const childCells = new Set(references.map((reference) => reference.cell));\n  const topCells = cells.filter((cell) => !childCells.has(cell));\n  const roots = topCells.length > 0 ? topCells : cells.slice(-1);\n  const shapeKeys = new Set(shapes.map(layoutShapeKey));\n  const labelKeys = new Set(labels.map(layoutLabelKey));\n  const expandedShapes = [...shapes];\n  const expandedLabels = [...labels];\n  const maxDepth = 10;\n  const maxAddedShapes = 10000;\n  let addedShapes = 0;\n\n  const expandCell = (cell: string, offsetX: number, offsetY: number, depth: number, stack: Set<string>) => {\n    if (depth > maxDepth || addedShapes >= maxAddedShapes || stack.has(cell)) {\n      return;\n    }\n    const nextStack = new Set(stack);\n    nextStack.add(cell);\n\n    for (const shape of shapes) {\n      if (shape.cell !== cell || (offsetX === 0 && offsetY === 0)) {\n        continue;\n      }\n      const cloned: LayoutShape = {\n        ...shape,\n        points: shape.points.map(([x, y]) => [x + offsetX, y + offsetY])\n      };\n      const key = layoutShapeKey(cloned);\n      if (!shapeKeys.has(key)) {\n        shapeKeys.add(key);\n        expandedShapes.push(cloned);\n        addedShapes += 1;\n        if (addedShapes >= maxAddedShapes) {\n          break;\n        }\n      }\n    }\n\n    for (const label of labels) {\n      if (label.cell !== cell || (offsetX === 0 && offsetY === 0)) {\n        continue;\n      }\n      const cloned: LayoutLabel = {\n        ...label,\n        x: label.x + offsetX,\n        y: label.y + offsetY\n      };\n      const key = layoutLabelKey(cloned);\n      if (!labelKeys.has(key)) {\n        labelKeys.add(key);\n        expandedLabels.push(cloned);\n      }\n    }\n\n    for (const reference of references) {\n      if (reference.ownerCell !== cell) {\n        continue;\n      }\n      const columns = Math.max(1, Math.floor(reference.columns || 1));\n      const rows = Math.max(1, Math.floor(reference.rows || 1));\n      const columnDx = Number(reference.columnDx || 0);\n      const columnDy = Number(reference.columnDy || 0);\n      const rowDx = Number(reference.rowDx || 0);\n      const rowDy = Number(reference.rowDy || 0);\n      for (let row = 0; row < rows; row++) {\n        for (let column = 0; column < columns; column++) {\n          expandCell(\n            reference.cell,\n            offsetX + reference.x + column * columnDx + row * rowDx,\n            offsetY + reference.y + column * columnDy + row * rowDy,\n            depth + 1,\n            nextStack\n          );\n        }\n      }\n    }\n  };\n\n  for (const root of roots) {\n    expandCell(root, 0, 0, 0, new Set());\n  }\n\n  return { shapes: expandedShapes, labels: expandedLabels, addedShapes };\n}\n\nfunction countLayoutLayers(shapes: LayoutShape[], labels: LayoutLabel[]): Map<string, number> {\n  const layers = new Map<string, number>();\n  for (const shape of shapes) {\n    layers.set(shape.layer, (layers.get(shape.layer) || 0) + 1);\n  }\n  for (const label of labels) {\n    layers.set(label.layer, (layers.get(label.layer) || 0) + 1);\n  }\n  return layers;\n}\n\nfunction layoutShapeKey(shape: LayoutShape): string {\n  return `${shape.kind}|${shape.cell || \"\"}|${shape.layer}|${shape.datatype || \"\"}|${shape.width || \"\"}|${shape.points\n    .map(([x, y]) => `${x},${y}`)\n    .join(\";\")}`;\n}\n\nfunction layoutLabelKey(label: LayoutLabel): string {\n  return `${label.cell || \"\"}|${label.layer}|${label.text}|${label.x}|${label.y}`;\n}\n\nfunction parseOasisLayout(bytes: Uint8Array, fileName: string): LayoutPreviewData {\n  const binary = parseBinaryOasis(bytes);\n  if (binary) {\n    const layers = countLayoutLayers(binary.shapes, binary.labels);\n    return {\n      format: \"OASIS\",\n      fileName,\n      version: binary.version ? `OASIS ${binary.version}` : \"OASIS\",\n      unit: binary.unit ? `1 / ${binary.unit}` : undefined,\n      cells: binary.cells,\n      shapes: binary.shapes,\n      labels: binary.labels,\n      references: binary.references,\n      layers,\n      metadata: [\n        [\"大小\", formatBytes(bytes.byteLength)],\n        [\"CBLOCK\", binary.compressedBlockCount],\n        [\"记录\", binary.recordCount],\n        [\"解析几何\", binary.shapes.length]\n      ],\n      notes: [\n        `已从标准二进制 OASIS 记录中解析 ${binary.shapes.length} 个几何、${binary.placementRecordCount} 个 cell 放置记录和 ${binary.labels.length} 段文字。`\n      ],\n      warnings: binary.warnings\n    };\n  }\n\n  const chunks = extractOasisCblocks(bytes);\n  const expanded = chunks.flatMap((chunk) => [...chunk.bytes]);\n  const cellNames = uniqueHints([...extractAsciiRuns(bytes), ...chunks.flatMap((chunk) => extractAsciiRuns(chunk.bytes))])\n    .filter((item) => /^[A-Za-z_][\\w$.-]{1,80}$/.test(item))\n    .filter((item) => !item.startsWith(\"S_\"));\n  const propertyNames = uniqueHints(chunks.flatMap((chunk) => extractAsciiRuns(chunk.bytes)).filter((item) => item.startsWith(\"S_\")));\n  const recordCounts = scanOasisRecordCounts(bytes);\n  const expandedCounts = scanOasisRecordCounts(new Uint8Array(expanded));\n  const layers = new Map<string, number>();\n  const shapes: LayoutShape[] = [];\n  const labels: LayoutLabel[] = [];\n  const references: LayoutReference[] = [];\n\n  for (const name of cellNames) {\n    references.push({ cell: name, x: 0, y: 0 });\n  }\n\n  const pseudo = createOasisStructureShapes(cellNames, chunks.length || recordCounts.size || 1);\n  for (const shape of pseudo) {\n    shapes.push(shape);\n    layers.set(shape.layer, (layers.get(shape.layer) || 0) + 1);\n  }\n  for (let index = 0; index < cellNames.length; index++) {\n    labels.push({ layer: \"cell\", text: cellNames[index], x: 12, y: -(18 + index * 18) });\n  }\n  if (cellNames.length > 0) {\n    layers.set(\"cell\", (layers.get(\"cell\") || 0) + cellNames.length);\n  }\n\n  const version = readOasisVersion(bytes);\n  const cblockText = chunks.length\n    ? `${chunks.length} 个，展开 ${formatBytes(chunks.reduce((sum, chunk) => sum + chunk.bytes.byteLength, 0))}`\n    : \"未发现\";\n  const notes = [\n    \"OASIS 是高压缩芯片版图格式，当前版本提供浏览器端识别、CBLOCK 解压、cell/属性结构和轻量结构示意；完整几何高保真渲染建议后续接入专用 OASIS 解析器。\"\n  ];\n  if (propertyNames.length > 0) {\n    notes.push(`识别到属性：${propertyNames.slice(0, 5).join(\"、\")}`);\n  }\n\n  return {\n    format: \"OASIS\",\n    fileName,\n    version,\n    cells: cellNames,\n    shapes,\n    labels,\n    references: [],\n    layers,\n    metadata: [\n      [\"大小\", formatBytes(bytes.byteLength)],\n      [\"CBLOCK\", cblockText],\n      [\"记录类型\", recordCounts.size + expandedCounts.size],\n      [\"可读片段\", cellNames.length + propertyNames.length]\n    ],\n    notes,\n    warnings: cellNames.length === 0 ? [\"当前 OASIS 文件未提取到 cell 名称，可能使用了更复杂的索引或加密/压缩布局。\"] : []\n  };\n}\n\nfunction computeLayoutBounds(shapes: LayoutShape[], labels: LayoutLabel[], references: LayoutReference[]): LayoutBounds {\n  const xs: number[] = [];\n  const ys: number[] = [];\n  for (const shape of shapes) {\n    for (const [x, y] of shape.points) {\n      xs.push(x);\n      ys.push(-y);\n    }\n  }\n  for (const label of labels) {\n    xs.push(label.x, label.x + label.text.length * 12);\n    ys.push(-label.y, -label.y - 16);\n  }\n  if (shapes.length === 0 && labels.length === 0) {\n    for (const reference of references) {\n      xs.push(reference.x);\n      ys.push(-reference.y);\n    }\n  }\n  const minX = Math.min(...xs, 0);\n  const maxX = Math.max(...xs, 100);\n  const minY = Math.min(...ys, 0);\n  const maxY = Math.max(...ys, 100);\n  const width = Math.max(1, maxX - minX);\n  const height = Math.max(1, maxY - minY);\n  const padding = Math.max(width, height) * 0.06;\n  return {\n    minX: minX - padding,\n    minY: minY - padding,\n    width: width + padding * 2,\n    height: height + padding * 2,\n    stroke: Math.max(width, height) / 900\n  };\n}\n\nfunction createLayoutLayerControls(\n  svg: SVGSVGElement | undefined,\n  layers: string[],\n  counts: Map<string, number>,\n  onChange?: (layer: string, visible: boolean) => void\n): HTMLElement {\n  const controls = document.createElement(\"div\");\n  controls.className = \"ofv-cad-layers ofv-layout-layers\";\n  const title = document.createElement(\"strong\");\n  title.textContent = `图层 ${layers.length}`;\n  controls.append(title);\n\n  for (const layer of layers) {\n    const label = document.createElement(\"label\");\n    const checkbox = document.createElement(\"input\");\n    checkbox.type = \"checkbox\";\n    checkbox.checked = true;\n    checkbox.addEventListener(\"change\", () => {\n      for (const element of svg?.querySelectorAll<SVGElement>(`[data-layer=\"${escapeCssAttribute(layer)}\"]`) || []) {\n        element.style.display = checkbox.checked ? \"\" : \"none\";\n      }\n      onChange?.(layer, checkbox.checked);\n    });\n    const name = document.createElement(\"span\");\n    name.textContent = `${layer} (${counts.get(layer) || 0})`;\n    label.append(checkbox, name);\n    controls.append(label);\n  }\n  return controls;\n}\n\nfunction createLayoutCellList(cells: string[], references: LayoutReference[], hidden = false): HTMLElement {\n  const details = document.createElement(\"details\");\n  details.className = \"ofv-details ofv-layout-cells\";\n  details.open = !hidden;\n  if (hidden) {\n    hideSupplementalInfo(details);\n  }\n  const summary = document.createElement(\"summary\");\n  summary.textContent = `Cell 结构 ${cells.length}`;\n  const list = document.createElement(\"ul\");\n  const refCounts = countBy(references.map((reference) => reference.cell));\n  for (const cell of cells.slice(0, 120)) {\n    const item = document.createElement(\"li\");\n    const count = refCounts.get(cell) || 0;\n    item.textContent = count > 0 ? `${cell} · 引用 ${count}` : cell;\n    list.append(item);\n  }\n  details.append(summary, list);\n  return details;\n}\n\nfunction hasDrawableLayout(data: LayoutPreviewData): boolean {\n  return data.shapes.length > 0 || data.labels.length > 0 || data.references.length > 0;\n}\n\nfunction readUInt16(bytes: Uint8Array, offset: number): number {\n  return (bytes[offset] << 8) | bytes[offset + 1];\n}\n\nfunction readInt16(bytes: Uint8Array, offset: number): number {\n  const value = readUInt16(bytes, offset);\n  return value & 0x8000 ? value - 0x10000 : value;\n}\n\nfunction readInt32(bytes: Uint8Array, offset: number): number {\n  const value = (bytes[offset] << 24) | (bytes[offset + 1] << 16) | (bytes[offset + 2] << 8) | bytes[offset + 3];\n  return value | 0;\n}\n\nfunction readGdsString(bytes: Uint8Array): string {\n  return new TextDecoder(\"ascii\").decode(bytes).replace(/\\0+$/g, \"\").trim();\n}\n\nfunction readGdsPoints(bytes: Uint8Array): LayoutPoint[] {\n  const points: LayoutPoint[] = [];\n  for (let offset = 0; offset + 7 < bytes.length; offset += 8) {\n    points.push([readInt32(bytes, offset), readInt32(bytes, offset + 4)]);\n  }\n  return points;\n}\n\nfunction formatGdsReal(bytes: Uint8Array, offset: number): string {\n  const value = readGdsReal(bytes, offset);\n  if (!Number.isFinite(value) || value === 0) {\n    return \"0\";\n  }\n  if (Math.abs(value) < 0.001 || Math.abs(value) >= 10000) {\n    return value.toExponential(4);\n  }\n  return String(Number(value.toPrecision(6)));\n}\n\nfunction readGdsReal(bytes: Uint8Array, offset: number): number {\n  const first = bytes[offset];\n  if (!first) {\n    return 0;\n  }\n  const sign = first & 0x80 ? -1 : 1;\n  const exponent = (first & 0x7f) - 64;\n  let mantissa = 0;\n  for (let index = 1; index < 8; index++) {\n    mantissa = mantissa * 256 + bytes[offset + index];\n  }\n  return sign * (mantissa / Math.pow(2, 56)) * Math.pow(16, exponent);\n}\n\nfunction sumCounts(counts: Map<string, number>): number {\n  return [...counts.values()].reduce((sum, count) => sum + count, 0);\n}\n\nfunction extractOasisCblocks(bytes: Uint8Array): Array<{ offset: number; bytes: Uint8Array }> {\n  const chunks: Array<{ offset: number; bytes: Uint8Array }> = [];\n  const seen = new Set<string>();\n  const limit = Math.min(bytes.length, 250000);\n  for (let offset = 0; offset < limit; offset++) {\n    try {\n      const inflated = pako.inflateRaw(bytes.slice(offset));\n      if (inflated.byteLength < 4) {\n        continue;\n      }\n      const ascii = extractAsciiRuns(inflated);\n      const hasLayoutSignal = ascii.some((item) => item.startsWith(\"S_\") || /TOP|CELL|DIE|SIZE/i.test(item));\n      const hasRecordSignal = inflated.some((byte) => byte >= 13 && byte <= 34);\n      if (!hasLayoutSignal && !hasRecordSignal) {\n        continue;\n      }\n      const signature = `${inflated.byteLength}:${Array.from(inflated.slice(0, 12)).join(\",\")}`;\n      if (seen.has(signature)) {\n        continue;\n      }\n      seen.add(signature);\n      chunks.push({ offset, bytes: inflated });\n      if (chunks.length >= 12) {\n        break;\n      }\n    } catch {\n      // Most byte offsets are not deflate streams; keep scanning.\n    }\n  }\n  return chunks;\n}\n\nfunction scanOasisRecordCounts(bytes: Uint8Array): Map<string, number> {\n  const counts = new Map<string, number>();\n  for (const byte of bytes.slice(0, Math.min(bytes.length, 12000))) {\n    const name = oasisRecordNames[byte];\n    if (name) {\n      counts.set(name, (counts.get(name) || 0) + 1);\n    }\n  }\n  return counts;\n}\n\nfunction readOasisVersion(bytes: Uint8Array): string | undefined {\n  const magic = \"%SEMI-OASIS\\r\\n\";\n  const header = new TextDecoder(\"ascii\").decode(bytes.slice(0, Math.min(bytes.length, 48)));\n  if (!header.startsWith(magic)) {\n    return undefined;\n  }\n  const start = magic.length;\n  if (bytes[start] !== 1) {\n    return \"OASIS\";\n  }\n  const length = bytes[start + 1];\n  const version = new TextDecoder(\"ascii\").decode(bytes.slice(start + 2, start + 2 + length));\n  return version ? `OASIS ${version}` : \"OASIS\";\n}\n\nfunction createOasisStructureShapes(cellNames: string[], fallbackCount: number): LayoutShape[] {\n  const rows = Math.max(1, cellNames.length || fallbackCount);\n  const shapes: LayoutShape[] = [];\n  for (let index = 0; index < rows; index++) {\n    const top = -(index * 18);\n    const height = 12;\n    const width = 88 + Math.min((cellNames[index]?.length || 5) * 4, 90);\n    shapes.push({\n      kind: \"box\",\n      layer: \"cell\",\n      points: [\n        [0, top],\n        [width, top],\n        [width, top - height],\n        [0, top - height],\n        [0, top]\n      ]\n    });\n  }\n  return shapes;\n}\n\nfunction renderBinaryCad(panel: HTMLElement, bytes: Uint8Array, extension: string, fileName: string): void {\n  const section = createSection(`${extension.toUpperCase()} 文件预览`);\n  const note = document.createElement(\"p\");\n  note.textContent =\n    extension === \"dwg\"\n      ? \"已识别 DWG 专有二进制图纸。核心插件默认提供版本、容器、结构线索和接入建议；真实几何渲染可通过 cadPlugin({ binaryRenderer }) 接入可选前端引擎或转换服务。\"\n      : \"已识别 DWF 发布图纸。核心插件默认提供容器线索和接入建议；高保真页面渲染可通过 cadPlugin({ binaryRenderer }) 接入专用解析器或转换服务。\";\n\n  const meta = document.createElement(\"div\");\n  meta.className = \"ofv-cad-summary\";\n  appendMeta(meta, \"文件\", fileName);\n  appendMeta(meta, \"格式\", extension.toUpperCase());\n  appendMeta(meta, \"大小\", formatBytes(bytes.byteLength));\n  appendMeta(meta, \"签名\", byteSignature(bytes));\n  appendMeta(meta, \"版本\", detectCadVersion(bytes, extension));\n  appendMeta(meta, \"容器\", detectCadContainer(bytes));\n\n  const actions = document.createElement(\"div\");\n  actions.className = \"ofv-cad-conversion\";\n  const actionTitle = document.createElement(\"h4\");\n  actionTitle.textContent = extension === \"dwg\" ? \"推荐增强路线\" : \"推荐处理路线\";\n  const actionList = document.createElement(\"ol\");\n  const suggestions =\n    extension === \"dwg\"\n      ? [\n          \"产品默认链路：服务端将 DWG 转为 PDF/SVG/DXF，再复用现有 PDF、图像或 DXF 预览。\",\n          \"纯前端增强：通过 binaryRenderer 接入 mlightcad / LibreDWG WASM 一类引擎，按需加载 worker 和字体资源。\",\n          \"商用高保真：接入 ODA Drawings SDK / Web SDK，适合复杂图层、字体、外部参照和大图纸。\"\n        ]\n      : [\n          \"优先在服务端转换为 PDF/SVG，保留图层、页面和标注信息。\",\n          \"若 DWF 为压缩容器，可通过 binaryRenderer 读取 manifest/descriptor 再还原页面资源。\",\n          \"若业务只需下载/归档，保留当前文件元信息和转换提示即可。\"\n        ];\n  for (const suggestion of suggestions) {\n    const item = document.createElement(\"li\");\n    item.textContent = suggestion;\n    actionList.append(item);\n  }\n  actions.append(actionTitle, actionList);\n\n  const raw = document.createElement(\"details\");\n  raw.className = \"ofv-details ofv-cad-raw-preview\";\n  const rawSummary = document.createElement(\"summary\");\n  rawSummary.textContent = \"原始字节预览\";\n  const preview = document.createElement(\"pre\");\n  preview.className = \"ofv-text-block\";\n  preview.textContent = hexPreview(bytes);\n  raw.append(rawSummary, preview);\n\n  section.append(note, meta, actions, createBinaryCadProbe(bytes, extension), raw);\n  panel.append(section);\n}\n\nfunction createBinaryCadProbe(bytes: Uint8Array, extension: string): HTMLElement {\n  const probe = probeBinaryCad(bytes);\n  const details = document.createElement(\"details\");\n  details.className = \"ofv-details ofv-cad-binary-probe\";\n  const summary = document.createElement(\"summary\");\n  summary.textContent = \"二进制结构探测\";\n  const meta = document.createElement(\"div\");\n  meta.className = \"ofv-archive-probe-meta\";\n  appendMeta(meta, \"可读片段\", probe.tokens.length);\n  appendMeta(meta, \"实体关键词\", formatCadKeywordCounts(probe.entityCounts));\n  appendMeta(meta, \"图层线索\", String(probe.layerHints.length));\n  appendMeta(meta, \"块/引用线索\", String(probe.blockHints.length));\n  appendMeta(meta, \"外部引用\", String(probe.externalRefs.length));\n  appendMeta(meta, \"解析级别\", extension === \"dwg\" ? \"启发式扫描\" : \"容器/文本扫描\");\n  details.append(summary, meta);\n\n  const hints = [...probe.layerHints, ...probe.blockHints, ...probe.externalRefs].slice(0, 18);\n  if (hints.length > 0) {\n    const list = document.createElement(\"ul\");\n    list.className = \"ofv-cad-probe-list\";\n    for (const hint of hints) {\n      const item = document.createElement(\"li\");\n      item.textContent = hint;\n      list.append(item);\n    }\n    details.append(list);\n  }\n\n  if (probe.tokens.length > 0) {\n    const preview = document.createElement(\"pre\");\n    preview.className = \"ofv-text-block\";\n    preview.textContent = probe.tokens.slice(0, 80).join(\"\\n\");\n    details.append(preview);\n  }\n  return details;\n}\n\ntype BinaryCadProbe = {\n  tokens: string[];\n  entityCounts: Map<string, number>;\n  layerHints: string[];\n  blockHints: string[];\n  externalRefs: string[];\n};\n\nfunction probeBinaryCad(bytes: Uint8Array): BinaryCadProbe {\n  const text = extractAsciiRuns(bytes.slice(0, Math.min(bytes.length, 65536)));\n  const tokens = text\n    .map((item) => item.trim())\n    .filter((item) => item.length >= 3)\n    .slice(0, 240);\n  const entityKeywords = [\"LINE\", \"CIRCLE\", \"ARC\", \"LWPOLYLINE\", \"POLYLINE\", \"TEXT\", \"MTEXT\", \"INSERT\", \"BLOCK\", \"LAYER\", \"XREF\", \"DIMENSION\"];\n  const entityCounts = new Map<string, number>();\n  for (const token of tokens) {\n    const normalized = token.toUpperCase();\n    for (const keyword of entityKeywords) {\n      if (normalized.includes(keyword)) {\n        entityCounts.set(keyword, (entityCounts.get(keyword) || 0) + 1);\n      }\n    }\n  }\n  return {\n    tokens,\n    entityCounts,\n    layerHints: uniqueHints(tokens.filter((item) => /layer|图层/i.test(item))),\n    blockHints: uniqueHints(tokens.filter((item) => /block|insert|块/i.test(item))),\n    externalRefs: uniqueHints(tokens.filter((item) => /xref|\\.dwg|\\.dxf|\\.pdf|\\.png|\\.jpe?g/i.test(item)))\n  };\n}\n\nfunction extractAsciiRuns(bytes: Uint8Array): string[] {\n  const result: string[] = [];\n  let current = \"\";\n  for (const byte of bytes) {\n    if (byte >= 32 && byte <= 126) {\n      current += String.fromCharCode(byte);\n      continue;\n    }\n    if (current.length >= 3) {\n      result.push(current);\n    }\n    current = \"\";\n  }\n  if (current.length >= 3) {\n    result.push(current);\n  }\n  return result;\n}\n\nfunction uniqueHints(values: string[]): string[] {\n  return Array.from(new Set(values.map((value) => value.trim()).filter(Boolean))).slice(0, 12);\n}\n\nfunction formatCadKeywordCounts(counts: Map<string, number>): string {\n  const text = [...counts.entries()]\n    .sort((a, b) => b[1] - a[1])\n    .slice(0, 6)\n    .map(([type, count]) => `${type} ${count}`)\n    .join(\", \");\n  return text || \"未发现\";\n}\n\nfunction parseStepRecords(text: string): StepRecord[] {\n  return [...text.matchAll(/#(\\d+)\\s*=\\s*([A-Z0-9_]+)\\s*\\(([\\s\\S]*?)\\)\\s*;/gi)].map((match) => ({\n    id: `#${match[1]}`,\n    type: (match[2] || \"\").toUpperCase(),\n    args: (match[3] || \"\").replace(/\\s+/g, \" \").trim()\n  }));\n}\n\nfunction parseIgesRecords(text: string): IgesRecord[] {\n  const parameterText = text\n    .split(/\\r?\\n/)\n    .filter((line) => line.slice(72, 73).toUpperCase() === \"P\" || /^\\s*\\d+\\s*,/.test(line))\n    .map((line) => line.slice(0, 72).trim())\n    .join(\"\");\n  if (!parameterText) {\n    return [];\n  }\n  return parameterText\n    .split(\";\")\n    .map((record) => record.trim())\n    .filter(Boolean)\n    .map((record) => {\n      const params = record.split(\",\").map((part) => part.trim()).filter(Boolean);\n      return { type: params[0] || \"UNKNOWN\", params };\n    });\n}\n\nfunction parseAcisSatRecords(text: string): TextCadRecord[] {\n  return text\n    .split(/\\r?\\n/)\n    .map((line) => line.trim())\n    .filter((line) => line && !line.startsWith(\"End-of-ACIS-data\"))\n    .filter((line) => /[A-Za-z]/.test(line))\n    .map((line, index) => {\n      const cleaned = line.replace(/#$/, \"\").trim();\n      const idMatch = cleaned.match(/^(-?\\d+)\\s+/);\n      const id = idMatch ? `#${idMatch[1]}` : `#${index + 1}`;\n      const body = idMatch ? cleaned.slice(idMatch[0].length).trim() : cleaned;\n      const tokens = body.split(/\\s+/);\n      const type = normalizeTextCadType(tokens.find((token) => /[A-Za-z]/.test(token)) || tokens[0] || \"record\");\n      return {\n        id,\n        type,\n        args: body,\n        numbers: extractNumbers(body)\n      };\n    })\n    .filter((record) => record.args && record.type !== \"record\");\n}\n\nfunction parseParasolidTextRecords(text: string): TextCadRecord[] {\n  return text\n    .split(/\\r?\\n/)\n    .map((line) => line.trim())\n    .filter((line) => line && !/^(BEGIN|END|HEADER|SCH|T51|P_SCHEMA)/i.test(line))\n    .map((line, index) => {\n      const cleaned = line.replace(/[;{}]+$/g, \"\").trim();\n      const idMatch = cleaned.match(/^#?(\\d+)\\s*[=:]\\s*/);\n      const id = idMatch ? `#${idMatch[1]}` : `#${index + 1}`;\n      const body = idMatch ? cleaned.slice(idMatch[0].length).trim() : cleaned;\n      const typeMatch =\n        body.match(/^([A-Za-z_][\\w.-]*)\\s*[\\[(]/) ||\n        body.match(/\\b(type|entity|class)\\s*[=:]\\s*['\"]?([A-Za-z_][\\w.-]*)/i);\n      const type = normalizeTextCadType(typeMatch?.[2] || typeMatch?.[1] || body.split(/\\s+/)[0] || \"record\");\n      return {\n        id,\n        type,\n        args: body,\n        numbers: extractNumbers(body)\n      };\n    })\n    .filter((record) => record.args && record.type !== \"record\");\n}\n\nfunction summarizeStepRecord(record: StepRecord): string {\n  if (record.type === \"CARTESIAN_POINT\") {\n    const point = record.args.match(/\\(([-+0-9., E]+)\\)/i)?.[1];\n    return point ? `坐标 ${point.replace(/\\s+/g, \"\")}` : record.args;\n  }\n  if (record.type === \"DIRECTION\" || record.type === \"VECTOR\") {\n    const direction = record.args.match(/\\(([-+0-9., E]+)\\)/i)?.[1];\n    return direction ? `向量 ${direction.replace(/\\s+/g, \"\")}` : record.args;\n  }\n  if (record.type === \"LINE\" || record.type === \"CIRCLE\" || record.type === \"ADVANCED_FACE\") {\n    return record.args.slice(0, 180);\n  }\n  return record.args.slice(0, 120);\n}\n\nfunction summarizeAcisRecord(record: TextCadRecord): string {\n  const coords = extractLikelyPoint(record.numbers);\n  if (coords) {\n    return `坐标 ${coords.map(formatNumber).join(\", \")}`;\n  }\n  return record.args.slice(0, 160);\n}\n\nfunction summarizeParasolidRecord(record: TextCadRecord): string {\n  const coords = extractLikelyPoint(record.numbers);\n  if (coords) {\n    return `坐标 ${coords.map(formatNumber).join(\", \")}`;\n  }\n  return record.args.slice(0, 160);\n}\n\nfunction extractStepGeometry(records: StepRecord[]): CadGeometryPreview {\n  const pointsById = new Map<string, [number, number, number]>();\n  const directionsById = new Map<string, [number, number, number]>();\n  const points: CadGeometryPoint[] = [];\n  const lines: CadGeometryLine[] = [];\n\n  for (const record of records) {\n    if (record.type === \"CARTESIAN_POINT\") {\n      const coords = parseStepTuple(record.args);\n      if (coords.length >= 2) {\n        const point: [number, number, number] = [coords[0], coords[1], coords[2] || 0];\n        pointsById.set(record.id, point);\n        points.push({ x: point[0], y: point[1], label: record.id });\n      }\n    } else if (record.type === \"DIRECTION\" || record.type === \"VECTOR\") {\n      const coords = parseStepTuple(record.args);\n      if (coords.length >= 2) {\n        directionsById.set(record.id, [coords[0], coords[1], coords[2] || 0]);\n      }\n    }\n  }\n\n  for (const record of records) {\n    if (record.type !== \"LINE\" && record.type !== \"EDGE_CURVE\") {\n      continue;\n    }\n    const refs = [...record.args.matchAll(/#\\d+/g)].map((match) => match[0]);\n    const firstPoint = refs.map((ref) => pointsById.get(ref)).find(Boolean);\n    if (!firstPoint) {\n      continue;\n    }\n    const secondPoint = refs\n      .slice(1)\n      .map((ref) => pointsById.get(ref))\n      .find((point) => point && point !== firstPoint);\n    if (secondPoint) {\n      lines.push({ x1: firstPoint[0], y1: firstPoint[1], x2: secondPoint[0], y2: secondPoint[1], label: record.id });\n      continue;\n    }\n    const direction = refs.map((ref) => directionsById.get(ref)).find(Boolean);\n    if (direction) {\n      const length = Math.max(10, estimateGeometrySpan(pointsById) * 0.25);\n      lines.push({\n        x1: firstPoint[0],\n        y1: firstPoint[1],\n        x2: firstPoint[0] + direction[0] * length,\n        y2: firstPoint[1] + direction[1] * length,\n        label: record.id\n      });\n    }\n  }\n\n  return { points, lines };\n}\n\nfunction extractIgesGeometry(records: IgesRecord[]): CadGeometryPreview {\n  const points: CadGeometryPoint[] = [];\n  const lines: CadGeometryLine[] = [];\n  for (const [index, record] of records.entries()) {\n    if (record.type === \"116\") {\n      const coords = record.params.slice(1).map(Number);\n      if (coords.length >= 2 && coords.every((value) => Number.isFinite(value))) {\n        points.push({ x: coords[0], y: coords[1], label: String(index + 1) });\n      }\n    }\n    if (record.type === \"110\") {\n      const coords = record.params.slice(1).map(Number);\n      if (coords.length >= 6 && coords.every((value) => Number.isFinite(value))) {\n        lines.push({ x1: coords[0], y1: coords[1], x2: coords[3], y2: coords[4], label: String(index + 1) });\n      }\n    }\n  }\n  return { points, lines };\n}\n\nfunction extractAcisSatGeometry(records: TextCadRecord[]): CadGeometryPreview {\n  const points = collectTextCadPoints(records, /vertex|point|coedge|edge|straight-curve|ellipse|spline|surface/);\n  const lines: CadGeometryLine[] = [];\n  for (const record of records) {\n    if (!/straight-curve|line|edge/i.test(record.type)) {\n      continue;\n    }\n    const vectors = chunkVectors(record.numbers);\n    if (vectors.length >= 2) {\n      const [start, direction] = vectors;\n      const length = Math.max(10, estimatePointSpan(points) * 0.25);\n      lines.push({\n        x1: start[0],\n        y1: start[1],\n        x2: start[0] + direction[0] * length,\n        y2: start[1] + direction[1] * length,\n        label: record.id\n      });\n    }\n  }\n  return { points: dedupeGeometryPoints(points), lines };\n}\n\nfunction extractParasolidTextGeometry(records: TextCadRecord[]): CadGeometryPreview {\n  const points = collectTextCadPoints(records, /point|vertex|line|curve|edge/);\n  const lines: CadGeometryLine[] = [];\n  for (const record of records) {\n    if (!/line|edge|curve/i.test(record.type)) {\n      continue;\n    }\n    const vectors = chunkVectors(record.numbers);\n    if (vectors.length >= 2) {\n      lines.push({\n        x1: vectors[0][0],\n        y1: vectors[0][1],\n        x2: vectors[1][0],\n        y2: vectors[1][1],\n        label: record.id\n      });\n    }\n  }\n  return { points: dedupeGeometryPoints(points), lines };\n}\n\nfunction collectTextCadPoints(records: TextCadRecord[], typePattern: RegExp): CadGeometryPoint[] {\n  const points: CadGeometryPoint[] = [];\n  for (const record of records) {\n    if (!typePattern.test(record.type)) {\n      continue;\n    }\n    const point = extractLikelyPoint(record.numbers);\n    if (point) {\n      points.push({ x: point[0], y: point[1], label: record.id });\n    }\n  }\n  return points;\n}\n\nfunction createCadGeometryPreview(\n  geometry: CadGeometryPreview,\n  titleText: string\n): { element: HTMLElement; svg: SVGSVGElement; bounds: CadGeometryBounds } | null {\n  if (geometry.points.length === 0 && geometry.lines.length === 0) {\n    return null;\n  }\n  const wrapper = document.createElement(\"figure\");\n  wrapper.className = \"ofv-cad-geometry-preview\";\n  const caption = document.createElement(\"figcaption\");\n  caption.textContent = `${titleText} · 点 ${geometry.points.length} · 线 ${geometry.lines.length}`;\n  hideSupplementalInfo(caption);\n  const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n  svg.setAttribute(\"class\", \"ofv-svg-stage ofv-cad-geometry-stage\");\n\n  const bounds = computeCadGeometryBounds(geometry);\n  svg.setAttribute(\"viewBox\", `${bounds.minX} ${bounds.minY} ${bounds.width} ${bounds.height}`);\n\n  for (const lineData of geometry.lines.slice(0, 2000)) {\n    const line = document.createElementNS(svg.namespaceURI, \"line\");\n    line.setAttribute(\"x1\", String(lineData.x1));\n    line.setAttribute(\"y1\", String(-lineData.y1));\n    line.setAttribute(\"x2\", String(lineData.x2));\n    line.setAttribute(\"y2\", String(-lineData.y2));\n    line.setAttribute(\"stroke\", \"#2563eb\");\n    line.setAttribute(\"stroke-width\", String(bounds.stroke));\n    line.setAttribute(\"vector-effect\", \"non-scaling-stroke\");\n    svg.append(line);\n  }\n\n  for (const point of geometry.points.slice(0, 2000)) {\n    const circle = document.createElementNS(svg.namespaceURI, \"circle\");\n    circle.setAttribute(\"cx\", String(point.x));\n    circle.setAttribute(\"cy\", String(-point.y));\n    circle.setAttribute(\"r\", String(bounds.pointRadius));\n    circle.setAttribute(\"fill\", \"#dc2626\");\n    circle.setAttribute(\"vector-effect\", \"non-scaling-stroke\");\n    svg.append(circle);\n  }\n\n  wrapper.append(caption, svg);\n  return { element: wrapper, svg, bounds };\n}\n\nfunction createGeometryViewer(\n  svg: SVGSVGElement,\n  bounds: CadGeometryBounds,\n  ctx: Pick<PreviewContext, \"toolbar\">\n): {\n  canCommand: (command: string) => boolean;\n  command: (command: string) => boolean;\n  destroy: () => void;\n} {\n  const initialViewBox = { x: bounds.minX, y: bounds.minY, width: bounds.width, height: bounds.height };\n  let currentViewBox = { ...initialViewBox };\n  const applyViewBox = () => {\n    svg.setAttribute(\"viewBox\", `${currentViewBox.x} ${currentViewBox.y} ${currentViewBox.width} ${currentViewBox.height}`);\n  };\n  const updateToolbarZoom = () => ctx.toolbar?.setZoom(initialViewBox.width / currentViewBox.width);\n  applyViewBox();\n  updateToolbarZoom();\n  return {\n    canCommand(command) {\n      return command === \"zoom-in\" || command === \"zoom-out\" || command === \"zoom-reset\";\n    },\n    command(command) {\n      if (command === \"zoom-in\" || command === \"zoom-out\") {\n        const factor = command === \"zoom-in\" ? 0.82 : 1.18;\n        const centerX = currentViewBox.x + currentViewBox.width / 2;\n        const centerY = currentViewBox.y + currentViewBox.height / 2;\n        currentViewBox.width *= factor;\n        currentViewBox.height *= factor;\n        currentViewBox.x = centerX - currentViewBox.width / 2;\n        currentViewBox.y = centerY - currentViewBox.height / 2;\n        applyViewBox();\n        updateToolbarZoom();\n        return true;\n      }\n      if (command === \"zoom-reset\") {\n        currentViewBox = { ...initialViewBox };\n        applyViewBox();\n        updateToolbarZoom();\n        return true;\n      }\n      return false;\n    },\n    destroy() {\n      ctx.toolbar?.setZoom(undefined);\n    }\n  };\n}\n\nfunction parseStepTuple(args: string): number[] {\n  const tuple = args.match(/\\(([-+0-9., E]+)\\)/i)?.[1] || \"\";\n  return tuple\n    .split(\",\")\n    .map((part) => Number(part.trim()))\n    .filter((value) => Number.isFinite(value));\n}\n\nfunction extractNumbers(text: string): number[] {\n  return [...text.matchAll(/[-+]?(?:\\d+\\.\\d*|\\.\\d+|\\d+)(?:[eE][-+]?\\d+)?/g)]\n    .map((match) => Number(match[0]))\n    .filter((value) => Number.isFinite(value));\n}\n\nfunction extractLikelyPoint(numbers: number[]): [number, number, number] | null {\n  if (numbers.length < 3) {\n    return null;\n  }\n  const candidates = chunkVectors(numbers);\n  const candidate =\n    candidates.find((vector) => vector.some((value) => Math.abs(value) > 1e-9) && vector.every((value) => Math.abs(value) < 1e12)) ||\n    candidates[0];\n  return candidate || null;\n}\n\nfunction chunkVectors(numbers: number[]): Array<[number, number, number]> {\n  const vectors: Array<[number, number, number]> = [];\n  for (let index = 0; index + 2 < numbers.length; index += 3) {\n    vectors.push([numbers[index], numbers[index + 1], numbers[index + 2]]);\n  }\n  return vectors;\n}\n\nfunction dedupeGeometryPoints(points: CadGeometryPoint[]): CadGeometryPoint[] {\n  const seen = new Set<string>();\n  return points.filter((point) => {\n    const key = `${point.x.toFixed(6)},${point.y.toFixed(6)}`;\n    if (seen.has(key)) {\n      return false;\n    }\n    seen.add(key);\n    return true;\n  });\n}\n\nfunction estimatePointSpan(points: CadGeometryPoint[]): number {\n  if (points.length < 2) {\n    return 40;\n  }\n  const xs = points.map((point) => point.x);\n  const ys = points.map((point) => point.y);\n  return Math.max(40, Math.max(...xs) - Math.min(...xs), Math.max(...ys) - Math.min(...ys));\n}\n\nfunction normalizeTextCadType(value: string): string {\n  return value\n    .replace(/^@+/, \"\")\n    .replace(/[^A-Za-z0-9_.-]/g, \"\")\n    .toLowerCase();\n}\n\nfunction formatNumber(value: number): string {\n  return Number.isInteger(value) ? String(value) : Number(value.toPrecision(6)).toString();\n}\n\nfunction estimateGeometrySpan(points: Map<string, [number, number, number]>): number {\n  const values = [...points.values()];\n  if (values.length < 2) {\n    return 40;\n  }\n  const xs = values.map((point) => point[0]);\n  const ys = values.map((point) => point[1]);\n  return Math.max(40, Math.max(...xs) - Math.min(...xs), Math.max(...ys) - Math.min(...ys));\n}\n\nfunction computeCadGeometryBounds(geometry: CadGeometryPreview): CadGeometryBounds {\n  const xs: number[] = [];\n  const ys: number[] = [];\n  for (const point of geometry.points) {\n    xs.push(point.x);\n    ys.push(-point.y);\n  }\n  for (const line of geometry.lines) {\n    xs.push(line.x1, line.x2);\n    ys.push(-line.y1, -line.y2);\n  }\n  const minX = Math.min(...xs, 0);\n  const maxX = Math.max(...xs, 100);\n  const minY = Math.min(...ys, 0);\n  const maxY = Math.max(...ys, 100);\n  const width = Math.max(1, maxX - minX);\n  const height = Math.max(1, maxY - minY);\n  const padding = Math.max(width, height) * 0.08;\n  return {\n    minX: minX - padding,\n    minY: minY - padding,\n    width: width + padding * 2,\n    height: height + padding * 2,\n    stroke: Math.max(width, height) / 500,\n    pointRadius: Math.max(width, height) / 90\n  };\n}\n\nfunction summarizeIfcRecord(record: StepRecord): string {\n  const strings = extractStepStrings(record.args);\n  const globalId = strings[0];\n  const name = strings[2] || strings[1];\n  const label = [globalId, name].filter(Boolean).join(\" · \");\n  if (label) {\n    return label;\n  }\n  return summarizeStepRecord(record);\n}\n\nfunction createIfcHierarchy(records: StepRecord[]): HTMLElement | null {\n  const rows = records\n    .filter((record) => [\"IFCPROJECT\", \"IFCSITE\", \"IFCBUILDING\", \"IFCBUILDINGSTOREY\", \"IFCSPACE\"].includes(record.type))\n    .slice(0, 80)\n    .map((record) => ({\n      id: record.id,\n      type: ifcTypeName(record.type),\n      detail: summarizeIfcRecord(record)\n    }));\n  if (rows.length === 0) {\n    return null;\n  }\n\n  const wrapper = document.createElement(\"div\");\n  wrapper.className = \"ofv-table-scroll ofv-cad-entities\";\n  const title = document.createElement(\"strong\");\n  title.textContent = \"BIM 层级\";\n  const table = document.createElement(\"table\");\n  const thead = document.createElement(\"thead\");\n  const header = document.createElement(\"tr\");\n  for (const label of [\"ID\", \"层级\", \"名称\"]) {\n    const cell = document.createElement(\"th\");\n    cell.textContent = label;\n    header.append(cell);\n  }\n  thead.append(header);\n  const tbody = document.createElement(\"tbody\");\n  for (const row of rows) {\n    const tr = document.createElement(\"tr\");\n    for (const value of [row.id, row.type, row.detail]) {\n      const cell = document.createElement(\"td\");\n      cell.textContent = value;\n      tr.append(cell);\n    }\n    tbody.append(tr);\n  }\n  table.append(thead, tbody);\n  wrapper.append(title, table);\n  return wrapper;\n}\n\nfunction extractStepStrings(args: string): string[] {\n  const values: string[] = [];\n  const pattern = /'((?:''|[^'])*)'/g;\n  let match: RegExpExecArray | null;\n  while ((match = pattern.exec(args))) {\n    values.push((match[1] || \"\").replace(/''/g, \"'\"));\n  }\n  return values;\n}\n\nfunction countIfcElements(counts: Map<string, number>): number {\n  const elementTypes = [\n    \"IFCBEAM\",\n    \"IFCBUILDINGELEMENTPROXY\",\n    \"IFCCOLUMN\",\n    \"IFCCOVERING\",\n    \"IFCCURTAINWALL\",\n    \"IFCDOOR\",\n    \"IFCFLOWSEGMENT\",\n    \"IFCFURNISHINGELEMENT\",\n    \"IFCMEMBER\",\n    \"IFCPLATE\",\n    \"IFCRAILING\",\n    \"IFCRAMP\",\n    \"IFCRAMPFLIGHT\",\n    \"IFCROOF\",\n    \"IFCSLAB\",\n    \"IFCSTAIR\",\n    \"IFCSTAIRFLIGHT\",\n    \"IFCWALL\",\n    \"IFCWALLSTANDARDCASE\",\n    \"IFCWINDOW\"\n  ];\n  return elementTypes.reduce((sum, type) => sum + (counts.get(type) || 0), 0);\n}\n\nfunction ifcTypeName(type: string): string {\n  const names: Record<string, string> = {\n    IFCPROJECT: \"项目\",\n    IFCSITE: \"场地\",\n    IFCBUILDING: \"建筑\",\n    IFCBUILDINGSTOREY: \"楼层\",\n    IFCSPACE: \"空间\"\n  };\n  return names[type] || type;\n}\n\nfunction igesTypeName(type: string): string {\n  const names: Record<string, string> = {\n    \"100\": \"100 Circular Arc\",\n    \"110\": \"110 Line\",\n    \"112\": \"112 Parametric Spline Curve\",\n    \"114\": \"114 Parametric Spline Surface\",\n    \"116\": \"116 Point\",\n    \"118\": \"118 Ruled Surface\",\n    \"120\": \"120 Surface of Revolution\",\n    \"126\": \"126 Rational B-Spline Curve\",\n    \"128\": \"128 Rational B-Spline Surface\",\n    \"144\": \"144 Trimmed Surface\"\n  };\n  return names[type] || type;\n}\n\nfunction createUnsupportedCadSection(extension: string, fileName: string): HTMLElement {\n  const section = createSection(\"CAD 增强接入提示\");\n  const meta = document.createElement(\"div\");\n  meta.className = \"ofv-cad-summary\";\n  appendMeta(meta, \"文件\", fileName);\n  appendMeta(meta, \"格式\", `.${extension || \"cad\"}`);\n  appendMeta(meta, \"内置能力\", unsupportedCadBuiltInLevel(extension));\n\n  const note = document.createElement(\"p\");\n  note.textContent = unsupportedCadGuidance(extension);\n\n  const actions = document.createElement(\"div\");\n  actions.className = \"ofv-cad-conversion\";\n  const title = document.createElement(\"h4\");\n  title.textContent = \"推荐增强路线\";\n  const list = document.createElement(\"ol\");\n  for (const suggestion of unsupportedCadSuggestions(extension)) {\n    const item = document.createElement(\"li\");\n    item.textContent = suggestion;\n    list.append(item);\n  }\n  actions.append(title, list);\n  section.append(meta, note, actions);\n  return section;\n}\n\nfunction unsupportedCadBuiltInLevel(extension: string): string {\n  if (extension === \"sab\" || extension === \"x_b\") {\n    return \"二进制内核文件识别\";\n  }\n  if (extension === \"3dm\" || extension === \"skp\" || extension === \"sldprt\" || extension === \"sldasm\") {\n    return \"专有模型格式识别\";\n  }\n  return \"格式识别\";\n}\n\nfunction unsupportedCadGuidance(extension: string): string {\n  if (extension === \"sab\") {\n    return \"SAB 是 ACIS 二进制实体格式，浏览器端没有稳定公开解析路径；若需要真实预览，建议先转换为 SAT/STEP/GLB，再复用当前轻量几何或 3D 预览。\";\n  }\n  if (extension === \"x_b\") {\n    return \"x_b 是 Parasolid 二进制格式，完整 B-Rep 需要专业内核；建议转换为 x_t/STEP/GLB，或通过 binaryRenderer 接入后端转换结果。\";\n  }\n  if (extension === \"3dm\") {\n    return \"3DM 可通过 rhino3dm/rhino3dm.wasm 做前端增强；核心包暂不强绑该大型依赖，避免基础包体积明显膨胀。\";\n  }\n  if (extension === \"skp\") {\n    return \"SKP 是 SketchUp 专有模型格式，纯前端高保真解析生态有限；推荐转换为 glTF/GLB 后使用内置 3D 预览。\";\n  }\n  if (extension === \"sldprt\" || extension === \"sldasm\") {\n    return \"SolidWorks 零件/装配属于强专有格式，浏览器内无法可靠解出几何；推荐使用服务端转换为 STEP/GLB/PDF 后预览。\";\n  }\n  return `.${extension || \"cad\"} 已识别为图纸/工程格式；当前未发现适合内置到核心包的稳定纯前端高保真解析方案。`;\n}\n\nfunction unsupportedCadSuggestions(extension: string): string[] {\n  if (extension === \"3dm\") {\n    return [\n      \"通过 cadPlugin({ binaryRenderer }) 按需加载 rhino3dm.wasm，将 mesh/curve 转为 Three.js 或 SVG。\",\n      \"服务端转换为 GLB/STEP/PDF，再复用内置 3D、STEP 或 PDF 预览。\",\n      \"若只是归档和下载，可保留当前格式识别和增强提示。\"\n    ];\n  }\n  if (extension === \"sab\" || extension === \"x_b\") {\n    return [\n      \"优先转换为文本 SAT/x_t 或通用 STEP，再使用内置轻量结构预览。\",\n      \"高保真 B-Rep 可在后端接入 ACIS/Parasolid/HOOPS/ODA 等商业内核后输出 PNG/PDF/SVG/GLB。\",\n      \"通过 binaryRenderer 接入业务自己的转换服务，核心包继续保持轻量。\"\n    ];\n  }\n  return [\n    \"服务端转换为 PDF/SVG/PNG/GLB/STEP 等浏览器友好格式。\",\n    \"通过 cadPlugin({ binaryRenderer }) 接入 CADViewer、MxCAD、私有转换服务或自研 WASM 引擎。\",\n    \"保持核心包内置能力轻量，避免把大型专有格式解析器强制打进默认包。\"\n  ];\n}\n\nfunction createCadTypeList(counts: Map<string, number>, titleText = \"类型统计\"): HTMLElement {\n  const details = document.createElement(\"details\");\n  details.className = \"ofv-details ofv-cad-types\";\n  details.open = true;\n  const summary = document.createElement(\"summary\");\n  summary.textContent = titleText;\n  const list = document.createElement(\"ul\");\n  for (const [type, count] of [...counts.entries()].sort((a, b) => b[1] - a[1]).slice(0, 80)) {\n    const item = document.createElement(\"li\");\n    item.textContent = `${type}: ${count}`;\n    list.append(item);\n  }\n  details.append(summary, list);\n  return details;\n}\n\nfunction createCadEntityTable(rows: Array<{ id: string; type: string; detail: string }>): HTMLElement {\n  const wrapper = document.createElement(\"div\");\n  wrapper.className = \"ofv-table-scroll ofv-cad-entities\";\n  const table = document.createElement(\"table\");\n  const thead = document.createElement(\"thead\");\n  const header = document.createElement(\"tr\");\n  for (const label of [\"ID\", \"类型\", \"摘要\"]) {\n    const cell = document.createElement(\"th\");\n    cell.textContent = label;\n    header.append(cell);\n  }\n  thead.append(header);\n  const tbody = document.createElement(\"tbody\");\n  for (const row of rows) {\n    const tr = document.createElement(\"tr\");\n    for (const value of [row.id, row.type, row.detail]) {\n      const cell = document.createElement(\"td\");\n      cell.textContent = value;\n      tr.append(cell);\n    }\n    tbody.append(tr);\n  }\n  table.append(thead, tbody);\n  wrapper.append(table);\n  return wrapper;\n}\n\nfunction countBy(values: string[]): Map<string, number> {\n  const counts = new Map<string, number>();\n  for (const value of values) {\n    counts.set(value, (counts.get(value) || 0) + 1);\n  }\n  return counts;\n}\n\nfunction appendMeta(parent: HTMLElement, label: string, value: string | number): void {\n  const row = document.createElement(\"div\");\n  row.className = \"ofv-meta-row\";\n  const key = document.createElement(\"span\");\n  key.textContent = label;\n  const content = document.createElement(\"strong\");\n  content.textContent = String(value);\n  row.append(key, content);\n  parent.append(row);\n}\n\nfunction formatBytes(bytes: number): string {\n  if (bytes < 1024) {\n    return `${bytes} B`;\n  }\n  if (bytes < 1024 * 1024) {\n    return `${(bytes / 1024).toFixed(1)} KB`;\n  }\n  return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\nfunction byteSignature(bytes: Uint8Array): string {\n  if (bytes.length === 0) {\n    return \"空文件\";\n  }\n  const ascii = new TextDecoder(\"ascii\").decode(bytes.slice(0, Math.min(bytes.length, 16))).replace(/[^\\x20-\\x7E]/g, \".\");\n  const hex = Array.from(bytes.slice(0, Math.min(bytes.length, 8)))\n    .map((byte) => byte.toString(16).padStart(2, \"0\").toUpperCase())\n    .join(\" \");\n  return `${ascii} (${hex})`;\n}\n\nfunction detectCadVersion(bytes: Uint8Array, extension: string): string {\n  const header = new TextDecoder(\"ascii\").decode(bytes.slice(0, Math.min(bytes.length, 32)));\n  if (extension === \"dwg\") {\n    const match = header.match(/AC\\d{4}/);\n    if (!match) {\n      return \"未知 DWG 版本\";\n    }\n    const names: Record<string, string> = {\n      AC1009: \"AutoCAD R12\",\n      AC1012: \"AutoCAD R13\",\n      AC1014: \"AutoCAD R14\",\n      AC1015: \"AutoCAD 2000/2002\",\n      AC1018: \"AutoCAD 2004/2005/2006\",\n      AC1021: \"AutoCAD 2007/2008/2009\",\n      AC1024: \"AutoCAD 2010/2011/2012\",\n      AC1027: \"AutoCAD 2013/2014/2015/2016/2017\",\n      AC1032: \"AutoCAD 2018+\"\n    };\n    return `${match[0]}${names[match[0]] ? ` · ${names[match[0]]}` : \"\"}`;\n  }\n  if (header.startsWith(\"(DWF\") || header.includes(\"DWF\")) {\n    return header.split(/\\s+/)[0] || \"DWF\";\n  }\n  return \"未知版本\";\n}\n\nfunction detectCadContainer(bytes: Uint8Array): string {\n  if (bytes[0] === 0x50 && bytes[1] === 0x4b) {\n    return \"ZIP/PK 压缩容器\";\n  }\n  if (bytes[0] === 0x1f && bytes[1] === 0x8b) {\n    return \"GZIP 压缩流\";\n  }\n  if (bytes[0] === 0x28 && bytes[1] === 0x44 && bytes[2] === 0x57 && bytes[3] === 0x46) {\n    return \"DWF ASCII 头\";\n  }\n  return \"二进制流\";\n}\n\nfunction hexPreview(bytes: Uint8Array): string {\n  const rows: string[] = [];\n  const limit = Math.min(bytes.length, 256);\n  for (let offset = 0; offset < limit; offset += 16) {\n    const slice = bytes.slice(offset, offset + 16);\n    const hex = Array.from(slice)\n      .map((byte) => byte.toString(16).padStart(2, \"0\").toUpperCase())\n      .join(\" \")\n      .padEnd(47, \" \");\n    const ascii = Array.from(slice)\n      .map((byte) => (byte >= 32 && byte <= 126 ? String.fromCharCode(byte) : \".\"))\n      .join(\"\");\n    rows.push(`${offset.toString(16).padStart(8, \"0\").toUpperCase()}  ${hex}  ${ascii}`);\n  }\n  if (bytes.length > limit) {\n    rows.push(`... 仅展示前 ${limit} 字节，共 ${bytes.length} 字节`);\n  }\n  return rows.join(\"\\n\") || \"无可展示字节。\";\n}\n\nfunction renderDxf(\n  panel: HTMLElement,\n  dxf: string,\n  ctx: Pick<PreviewContext, \"toolbar\">\n): {\n  canCommand: (command: string) => boolean;\n  command: (command: string) => boolean;\n  destroy: () => void;\n} {\n  const pairs = dxf.split(/\\r?\\n/).map((line) => line.trim());\n  const lines: Array<LayeredValue<[number, number, number, number]>> = [];\n  const circles: Array<LayeredValue<[number, number, number]>> = [];\n  const arcs: Array<LayeredValue<[number, number, number, number, number]>> = [];\n  const points: Array<LayeredValue<[number, number]>> = [];\n  const polylines: Array<LayeredValue<Array<[number, number]>>> = [];\n  const texts: Array<LayeredValue<[number, number, string, number]>> = [];\n\n  for (let index = 0; index < pairs.length; index += 2) {\n    const code = pairs[index];\n    const value = pairs[index + 1];\n    if (code === \"0\" && value === \"LINE\") {\n      const entity = readEntity(pairs, index + 2);\n      lines.push({\n        layer: normalizeLayerName(entity[\"8\"]),\n        value: [\n          Number(entity[\"10\"] || 0),\n          Number(entity[\"20\"] || 0),\n          Number(entity[\"11\"] || 0),\n          Number(entity[\"21\"] || 0)\n        ]\n      });\n    }\n    if (code === \"0\" && value === \"CIRCLE\") {\n      const entity = readEntity(pairs, index + 2);\n      circles.push({\n        layer: normalizeLayerName(entity[\"8\"]),\n        value: [\n          Number(entity[\"10\"] || 0),\n          Number(entity[\"20\"] || 0),\n          Number(entity[\"40\"] || 0)\n        ]\n      });\n    }\n    if (code === \"0\" && value === \"ARC\") {\n      const entity = readEntity(pairs, index + 2);\n      arcs.push({\n        layer: normalizeLayerName(entity[\"8\"]),\n        value: [\n          Number(entity[\"10\"] || 0),\n          Number(entity[\"20\"] || 0),\n          Number(entity[\"40\"] || 0),\n          Number(entity[\"50\"] || 0),\n          Number(entity[\"51\"] || 0)\n        ]\n      });\n    }\n    if (code === \"0\" && value === \"POINT\") {\n      const entity = readEntity(pairs, index + 2);\n      points.push({\n        layer: normalizeLayerName(entity[\"8\"]),\n        value: [Number(entity[\"10\"] || 0), Number(entity[\"20\"] || 0)]\n      });\n    }\n    if (code === \"0\" && value === \"LWPOLYLINE\") {\n      const entity = readEntity(pairs, index + 2);\n      const entityPairs = readEntityPairs(pairs, index + 2);\n      const polyline = readPolylinePoints(entityPairs);\n      if (polyline.length > 1) {\n        polylines.push({ layer: normalizeLayerName(entity[\"8\"]), value: polyline });\n      }\n    }\n    if (code === \"0\" && value === \"POLYLINE\") {\n      const result = readLegacyPolyline(pairs, index + 2);\n      if (result.points.length > 1) {\n        polylines.push({ layer: result.layer, value: result.points });\n      }\n      index = Math.max(index, result.endIndex - 2);\n    }\n    if (code === \"0\" && (value === \"TEXT\" || value === \"MTEXT\")) {\n      const entity = readEntity(pairs, index + 2);\n      const text = normalizeDxfText(entity[\"1\"] || entity[\"3\"] || \"\");\n      if (text) {\n        texts.push({\n          layer: normalizeLayerName(entity[\"8\"]),\n          value: [\n            Number(entity[\"10\"] || 0),\n            Number(entity[\"20\"] || 0),\n            text,\n            Math.max(1, Number(entity[\"40\"] || 12))\n          ]\n        });\n      }\n    }\n  }\n\n  const section = createSection(`DXF 基础预览`);\n  hideSupplementalInfo(section.querySelector<HTMLElement>(\"h3\") as HTMLElement);\n  const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n  svg.setAttribute(\"class\", \"ofv-svg-stage\");\n\n  const bounds = computeBounds(lines, circles, arcs, points, polylines, texts);\n  const initialViewBox = {\n    x: bounds.minX,\n    y: bounds.minY,\n    width: bounds.width,\n    height: bounds.height\n  };\n  let currentViewBox = { ...initialViewBox };\n  const applyViewBox = () => {\n    svg.setAttribute(\n      \"viewBox\",\n      `${currentViewBox.x} ${currentViewBox.y} ${currentViewBox.width} ${currentViewBox.height}`\n    );\n  };\n  applyViewBox();\n\n  for (const item of lines.slice(0, 3000)) {\n    const [x1, y1, x2, y2] = item.value;\n    const line = document.createElementNS(svg.namespaceURI, \"line\");\n    line.setAttribute(\"x1\", String(x1));\n    line.setAttribute(\"y1\", String(-y1));\n    line.setAttribute(\"x2\", String(x2));\n    line.setAttribute(\"y2\", String(-y2));\n    line.setAttribute(\"stroke\", \"#111827\");\n    line.setAttribute(\"stroke-width\", String(bounds.stroke));\n    applyLayer(line, item.layer);\n    svg.append(line);\n  }\n\n  for (const item of circles.slice(0, 1000)) {\n    const [cx, cy, radius] = item.value;\n    const circle = document.createElementNS(svg.namespaceURI, \"circle\");\n    circle.setAttribute(\"cx\", String(cx));\n    circle.setAttribute(\"cy\", String(-cy));\n    circle.setAttribute(\"r\", String(Math.abs(radius)));\n    circle.setAttribute(\"fill\", \"none\");\n    circle.setAttribute(\"stroke\", \"#2563eb\");\n    circle.setAttribute(\"stroke-width\", String(bounds.stroke));\n    applyLayer(circle, item.layer);\n    svg.append(circle);\n  }\n\n  for (const item of arcs.slice(0, 1000)) {\n    const [cx, cy, radius, startAngle, endAngle] = item.value;\n    const path = document.createElementNS(svg.namespaceURI, \"path\");\n    path.setAttribute(\"d\", arcPath(cx, -cy, Math.abs(radius), -startAngle, -endAngle));\n    path.setAttribute(\"fill\", \"none\");\n    path.setAttribute(\"stroke\", \"#7c3aed\");\n    path.setAttribute(\"stroke-width\", String(bounds.stroke));\n    applyLayer(path, item.layer);\n    svg.append(path);\n  }\n\n  for (const item of polylines.slice(0, 2000)) {\n    const polyline = item.value;\n    const path = document.createElementNS(svg.namespaceURI, \"polyline\");\n    path.setAttribute(\"points\", polyline.map(([x, y]) => `${x},${-y}`).join(\" \"));\n    path.setAttribute(\"fill\", \"none\");\n    path.setAttribute(\"stroke\", \"#0f766e\");\n    path.setAttribute(\"stroke-width\", String(bounds.stroke));\n    applyLayer(path, item.layer);\n    svg.append(path);\n  }\n\n  for (const item of points.slice(0, 3000)) {\n    const [x, y] = item.value;\n    const point = document.createElementNS(svg.namespaceURI, \"circle\");\n    point.setAttribute(\"cx\", String(x));\n    point.setAttribute(\"cy\", String(-y));\n    point.setAttribute(\"r\", String(bounds.stroke * 2));\n    point.setAttribute(\"fill\", \"#dc2626\");\n    applyLayer(point, item.layer);\n    svg.append(point);\n  }\n\n  for (const item of texts.slice(0, 500)) {\n    const [x, y, text, height] = item.value;\n    const label = document.createElementNS(svg.namespaceURI, \"text\");\n    label.setAttribute(\"x\", String(x));\n    label.setAttribute(\"y\", String(-y));\n    label.setAttribute(\"font-size\", String(Math.max(height, bounds.stroke * 8)));\n    label.setAttribute(\"fill\", \"currentColor\");\n    label.textContent = text;\n    applyLayer(label, item.layer);\n    svg.append(label);\n  }\n\n  const layers = Array.from(\n    new Set([...lines, ...circles, ...arcs, ...points, ...polylines, ...texts].map((item) => item.layer))\n  ).sort((a, b) => a.localeCompare(b));\n  if (layers.length > 1) {\n    const layerControls = createLayerControls(svg, layers);\n    hideSupplementalInfo(layerControls);\n    section.append(layerControls);\n  }\n\n  const note = document.createElement(\"p\");\n  note.textContent =\n    `已提取 LINE ${lines.length} 个、CIRCLE ${circles.length} 个、ARC ${arcs.length} 个、POLYLINE ${polylines.length} 个、POINT ${points.length} 个、TEXT ${texts.length} 个。`;\n  hideSupplementalInfo(note);\n  section.append(note, svg);\n  panel.append(section);\n  const updateToolbarZoom = () => {\n    ctx.toolbar?.setZoom(initialViewBox.width / currentViewBox.width);\n  };\n  updateToolbarZoom();\n\n  return {\n    canCommand(command) {\n      return command === \"zoom-in\" || command === \"zoom-out\" || command === \"zoom-reset\";\n    },\n    command(command) {\n      if (command === \"zoom-in\" || command === \"zoom-out\") {\n        const factor = command === \"zoom-in\" ? 0.82 : 1.18;\n        const centerX = currentViewBox.x + currentViewBox.width / 2;\n        const centerY = currentViewBox.y + currentViewBox.height / 2;\n        currentViewBox.width *= factor;\n        currentViewBox.height *= factor;\n        currentViewBox.x = centerX - currentViewBox.width / 2;\n        currentViewBox.y = centerY - currentViewBox.height / 2;\n        applyViewBox();\n        updateToolbarZoom();\n        return true;\n      }\n      if (command === \"zoom-reset\") {\n        currentViewBox = { ...initialViewBox };\n        applyViewBox();\n        updateToolbarZoom();\n        return true;\n      }\n      return false;\n    },\n    destroy() {\n      ctx.toolbar?.setZoom(undefined);\n    }\n  };\n}\n\nfunction applyLayer(element: Element, layer: string): void {\n  element.setAttribute(\"data-layer\", layer);\n}\n\nfunction createLayerControls(svg: SVGSVGElement, layers: string[]): HTMLElement {\n  const controls = document.createElement(\"div\");\n  controls.className = \"ofv-cad-layers\";\n  const title = document.createElement(\"strong\");\n  title.textContent = `图层 ${layers.length}`;\n  controls.append(title);\n\n  for (const layer of layers) {\n    const label = document.createElement(\"label\");\n    const checkbox = document.createElement(\"input\");\n    checkbox.type = \"checkbox\";\n    checkbox.checked = true;\n    checkbox.addEventListener(\"change\", () => {\n      for (const element of svg.querySelectorAll<SVGElement>(`[data-layer=\"${escapeCssAttribute(layer)}\"]`)) {\n        element.style.display = checkbox.checked ? \"\" : \"none\";\n      }\n    });\n    const name = document.createElement(\"span\");\n    name.textContent = layer;\n    label.append(checkbox, name);\n    controls.append(label);\n  }\n  return controls;\n}\n\nfunction readEntity(pairs: string[], start: number): Record<string, string> {\n  const entity: Record<string, string> = {};\n  for (let index = start; index < pairs.length; index += 2) {\n    const code = pairs[index];\n    const value = pairs[index + 1];\n    if (code === \"0\") {\n      break;\n    }\n    entity[code] = value;\n  }\n  return entity;\n}\n\nfunction readEntityPairs(pairs: string[], start: number): Array<[string, string]> {\n  const entityPairs: Array<[string, string]> = [];\n  for (let index = start; index < pairs.length; index += 2) {\n    const code = pairs[index];\n    const value = pairs[index + 1];\n    if (code === \"0\") {\n      break;\n    }\n    entityPairs.push([code, value]);\n  }\n  return entityPairs;\n}\n\nfunction readPolylinePoints(entityPairs: Array<[string, string]>): Array<[number, number]> {\n  const points: Array<[number, number]> = [];\n  let x: number | undefined;\n  for (const [code, value] of entityPairs) {\n    if (code === \"10\") {\n      x = Number(value);\n    }\n    if (code === \"20\" && x !== undefined) {\n      points.push([x, Number(value)]);\n      x = undefined;\n    }\n  }\n  return points;\n}\n\nfunction readLegacyPolyline(\n  pairs: string[],\n  start: number\n): { layer: string; points: Array<[number, number]>; endIndex: number } {\n  let layer = \"0\";\n  const points: Array<[number, number]> = [];\n  for (let index = start; index < pairs.length; index += 2) {\n    const code = pairs[index];\n    const value = pairs[index + 1];\n    if (code === \"0\" && value === \"SEQEND\") {\n      return { layer, points, endIndex: index + 2 };\n    }\n    if (code === \"8\") {\n      layer = normalizeLayerName(value);\n    }\n    if (code === \"0\" && value === \"VERTEX\") {\n      const entity = readEntity(pairs, index + 2);\n      points.push([Number(entity[\"10\"] || 0), Number(entity[\"20\"] || 0)]);\n    }\n  }\n  return { layer, points, endIndex: pairs.length };\n}\n\nfunction normalizeLayerName(layer: string | undefined): string {\n  return layer?.trim() || \"0\";\n}\n\nfunction escapeCssAttribute(value: string): string {\n  if (typeof CSS !== \"undefined\" && CSS.escape) {\n    return CSS.escape(value);\n  }\n  return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\nfunction normalizeDxfText(text: string): string {\n  return text\n    .replace(/\\\\P/g, \"\\n\")\n    .replace(/\\\\[A-Za-z][^;{}\\\\]*;/g, \"\")\n    .replace(/\\\\[A-Za-z]/g, \"\")\n    .replace(/\\{\\\\[^;]+;/g, \"\")\n    .replace(/[{}]/g, \"\")\n    .trim();\n}\n\nfunction arcPath(cx: number, cy: number, radius: number, startAngle: number, endAngle: number): string {\n  const start = polarToCartesian(cx, cy, radius, endAngle);\n  const end = polarToCartesian(cx, cy, radius, startAngle);\n  const delta = Math.abs(endAngle - startAngle);\n  const largeArc = delta <= 180 ? \"0\" : \"1\";\n  return `M ${start.x} ${start.y} A ${radius} ${radius} 0 ${largeArc} 0 ${end.x} ${end.y}`;\n}\n\nfunction polarToCartesian(cx: number, cy: number, radius: number, angleDegrees: number): { x: number; y: number } {\n  const angle = (angleDegrees * Math.PI) / 180;\n  return {\n    x: cx + radius * Math.cos(angle),\n    y: cy + radius * Math.sin(angle)\n  };\n}\n\nfunction hideSupplementalInfo(element: HTMLElement): void {\n  element.hidden = true;\n  element.setAttribute(\"aria-hidden\", \"true\");\n  element.style.display = \"none\";\n}\n\nfunction hideSuccessfulSectionHeading(section: HTMLElement): void {\n  const heading = section.querySelector<HTMLElement>(\"h3\");\n  if (heading) {\n    hideSupplementalInfo(heading);\n  }\n}\n\nfunction computeBounds(\n  lines: Array<LayeredValue<[number, number, number, number]>>,\n  circles: Array<LayeredValue<[number, number, number]>>,\n  arcs: Array<LayeredValue<[number, number, number, number, number]>>,\n  points: Array<LayeredValue<[number, number]>>,\n  polylines: Array<LayeredValue<Array<[number, number]>>>,\n  texts: Array<LayeredValue<[number, number, string, number]>>\n): { minX: number; minY: number; width: number; height: number; stroke: number } {\n  const xs = lines.flatMap(({ value: [x1, , x2] }) => [x1, x2]);\n  const ys = lines.flatMap(({ value: [, y1, , y2] }) => [-y1, -y2]);\n  for (const { value: [cx, cy, radius] } of circles) {\n    xs.push(cx - radius, cx + radius);\n    ys.push(-cy - radius, -cy + radius);\n  }\n  for (const { value: [cx, cy, radius] } of arcs) {\n    xs.push(cx - radius, cx + radius);\n    ys.push(-cy - radius, -cy + radius);\n  }\n  for (const { value: [x, y] } of points) {\n    xs.push(x);\n    ys.push(-y);\n  }\n  for (const { value: polyline } of polylines) {\n    for (const [x, y] of polyline) {\n      xs.push(x);\n      ys.push(-y);\n    }\n  }\n  for (const { value: [x, y, text, height] } of texts) {\n    xs.push(x, x + text.length * height * 0.6);\n    ys.push(-y, -y - height);\n  }\n  const minX = Math.min(...xs, 0);\n  const maxX = Math.max(...xs, 100);\n  const minY = Math.min(...ys, 0);\n  const maxY = Math.max(...ys, 100);\n  const width = Math.max(1, maxX - minX);\n  const height = Math.max(1, maxY - minY);\n  return {\n    minX,\n    minY,\n    width,\n    height,\n    stroke: Math.max(width, height) / 600\n  };\n}\n","import type { CadBinaryPreviewContext } from \"./cad\";\nimport type { PreviewInstance } from \"../types\";\n\ntype LibreDwgModule = {\n  Dwg_File_Type: {\n    DWG: number;\n  };\n  LibreDwg: {\n    create(filepath?: string): Promise<LibreDwgValue>;\n  };\n};\n\ntype LibreDwgValue = {\n  dwg_read_data(fileContent: ArrayBuffer, fileType: number): number;\n  dwg_bmp(data: number): DwgThumbnail | null;\n  convertEx(data: number): {\n    database: DwgDatabase;\n    stats: {\n      unknownEntityCount: number;\n    };\n  };\n  dwg_to_svg(database: DwgDatabase): string;\n  dwg_free(data: number): void;\n};\n\ntype DwgThumbnail = {\n  data: Uint8Array;\n  type: number;\n};\n\ntype DwgDatabase = {\n  entities: Array<{\n    isInPaperSpace?: boolean;\n  }>;\n  tables: {\n    LAYER: {\n      entries: Array<{\n        off?: boolean;\n        frozen?: boolean;\n      }>;\n    };\n  };\n  objects: {\n    LAYOUT: Array<{\n      layoutName?: string;\n    }>;\n  };\n};\n\nexport interface LibreDwgPreviewOptions {\n  /**\n   * Enable the built-in LibreDWG WASM preview for DWG files.\n   *\n   * It is best-effort and intentionally lower priority than `binaryRenderer`.\n   */\n  enabled?: boolean;\n  /**\n   * Public URL that contains libredwg-web.wasm.\n   *\n   * Example: `/vendor/libredwg-web`\n   */\n  wasmBaseUrl?: string;\n  /**\n   * Run LibreDWG parsing in a dedicated worker when `workerModuleUrl` or\n   * `workerFactory` is available. Defaults to true.\n   */\n  useWorker?: boolean;\n  /**\n   * Browser-loadable URL for the ESM entry of `@mlightcad/libredwg-web`.\n   * The worker imports this URL without bundling the GPL dependency into core.\n   */\n  workerModuleUrl?: string;\n  /** Create a custom module worker that implements the LibreDWG worker protocol. */\n  workerFactory?: () => Worker;\n  /** Maximum time allowed for worker parsing. Defaults to 120 seconds. */\n  workerTimeoutMs?: number;\n}\n\ntype DwgPreviewStats = {\n  entityCount: number;\n  layerCount: number;\n  layoutCount: number;\n  unknownEntityCount: number;\n  visibleLayerCount: number;\n  paperSpaceEntityCount: number;\n  hasThumbnail: boolean;\n};\n\ntype DwgSvgBounds = {\n  minX: number;\n  minY: number;\n  width: number;\n  height: number;\n};\n\ntype DwgParseResult = {\n  svg: string;\n  stats?: DwgPreviewStats;\n  thumbnail?: DwgThumbnail;\n  conversionError?: string;\n};\n\ntype DwgWorkerMessage =\n  | { type: \"progress\"; message: string }\n  | { type: \"success\"; result: DwgParseResult }\n  | { type: \"error\"; message: string };\n\nlet libreDwgPromise: Promise<LibreDwgModule> | undefined;\n\nconst defaultLibreDwgWasmBaseUrl = \"/vendor/libredwg-web\";\nconst minReadableDrawingHeight = 420;\nconst libreDwgPackageName = \"@mlightcad/libredwg-web\";\nconst defaultWorkerTimeoutMs = 120_000;\nconst svgNumberPattern = /-?\\d*\\.?\\d+(?:e[-+]?\\d+)?/gi;\n\nexport async function renderLibreDwgPreview(\n  ctx: CadBinaryPreviewContext,\n  options: LibreDwgPreviewOptions = {}\n): Promise<PreviewInstance | void> {\n  if (ctx.extension !== \"dwg\" || options.enabled === false) {\n    return undefined;\n  }\n\n  const shell = document.createElement(\"div\");\n  shell.className = \"ofv-dwg-preview\";\n  const status = document.createElement(\"div\");\n  status.className = \"ofv-dwg-preview-status\";\n  status.textContent = \"Loading DWG rendering engine...\";\n  shell.append(status);\n  ctx.panel.append(shell);\n\n  try {\n    const result = await parseDwg(ctx.arrayBuffer, options, ctx.preview.signal, (message) => {\n      status.textContent = message;\n    });\n    const svg = result.svg;\n    const stats = result.stats;\n    let thumbnailUrl = createDwgThumbnailUrl(result.thumbnail);\n\n    if (result.conversionError) {\n      if (thumbnailUrl) {\n        const fallbackThumbnailUrl = thumbnailUrl;\n        status.replaceChildren(createDwgThumbnailFallbackStatus(ctx.fileName, result.conversionError));\n        shell.append(createDwgThumbnailPreview(fallbackThumbnailUrl, ctx.fileName));\n        return {\n          destroy() {\n            URL.revokeObjectURL(fallbackThumbnailUrl);\n            shell.remove();\n          }\n        };\n      }\n      throw new Error(result.conversionError);\n    }\n\n    if (!svg || !/<svg[\\s>]/i.test(svg)) {\n      if (thumbnailUrl) {\n        const fallbackThumbnailUrl = thumbnailUrl;\n        status.replaceChildren(createDwgThumbnailFallbackStatus(ctx.fileName, \"DWG parser finished but did not produce SVG output.\"));\n        shell.append(createDwgThumbnailPreview(fallbackThumbnailUrl, ctx.fileName));\n        return {\n          destroy() {\n            URL.revokeObjectURL(fallbackThumbnailUrl);\n            shell.remove();\n          }\n        };\n      }\n      throw new Error(\"DWG parser finished but did not produce SVG output.\");\n    }\n    if (!stats) {\n      throw new Error(\"DWG parser finished without drawing statistics.\");\n    }\n\n    const doc = new DOMParser().parseFromString(sanitizeDwgSvgMarkup(svg), \"image/svg+xml\");\n    const svgElement = doc.documentElement;\n    if (!(svgElement instanceof SVGElement) || svgElement.nodeName.toLowerCase() !== \"svg\" || svgElement.querySelector(\"parsererror\")) {\n      throw new Error(\"DWG SVG output is invalid.\");\n    }\n\n    svgElement.classList.add(\"ofv-dwg-preview-svg\");\n    svgElement.setAttribute(\"role\", \"img\");\n    svgElement.setAttribute(\"aria-label\", ctx.fileName);\n    sanitizeDwgSvgElement(svgElement);\n    normalizeDwgSvg(svgElement);\n    status.replaceChildren(createDwgStatusTitle(ctx.fileName, stats));\n\n    const drawing = createDwgDrawingViewport(svgElement);\n    if (thumbnailUrl) {\n      shell.append(createDwgThumbnailPanel(thumbnailUrl));\n    }\n    shell.append(drawing.frame);\n    return {\n      resize() {\n        drawing.update();\n      },\n      canCommand(command) {\n        return command === \"zoom-in\" || command === \"zoom-out\" || command === \"zoom-reset\";\n      },\n      command(command) {\n        if (command === \"zoom-in\") {\n          drawing.setZoom(drawing.zoom * 1.18);\n          return true;\n        }\n        if (command === \"zoom-out\") {\n          drawing.setZoom(drawing.zoom / 1.18);\n          return true;\n        }\n        if (command === \"zoom-reset\") {\n          drawing.setZoom(1);\n          return true;\n        }\n        return false;\n      },\n      destroy() {\n        if (thumbnailUrl) {\n          URL.revokeObjectURL(thumbnailUrl);\n        }\n        shell.remove();\n      }\n    };\n  } catch (error) {\n    shell.remove();\n    if (!isAbortError(error)) {\n      console.warn(\"DWG LibreDWG preview failed, falling back to metadata preview:\", error);\n    }\n    return undefined;\n  }\n}\n\nfunction sanitizeDwgSvgMarkup(svg: string): string {\n  return svg.replace(/&(?!(?:amp|lt|gt|quot|apos|#\\d+|#x[\\da-f]+);)/gi, \"&amp;\");\n}\n\nfunction sanitizeDwgSvgElement(svgElement: SVGElement): void {\n  svgElement.querySelectorAll(\"script,style,foreignObject,iframe,object,embed,audio,video\").forEach((element) => element.remove());\n  for (const element of [svgElement, ...svgElement.querySelectorAll<SVGElement>(\"*\")]) {\n    for (const attribute of [...element.attributes]) {\n      const name = attribute.name.toLowerCase();\n      const value = attribute.value.trim();\n      if (\n        name.startsWith(\"on\") ||\n        ((name === \"href\" || name === \"xlink:href\") && value !== \"\" && !value.startsWith(\"#\")) ||\n        (/url\\s*\\(/i.test(value) && !/url\\s*\\(\\s*[\"']?#/i.test(value))\n      ) {\n        element.removeAttribute(attribute.name);\n      }\n    }\n  }\n}\n\nasync function parseDwg(\n  arrayBuffer: ArrayBuffer,\n  options: LibreDwgPreviewOptions,\n  signal: AbortSignal | undefined,\n  onProgress: (message: string) => void\n): Promise<DwgParseResult> {\n  const canUseWorker =\n    options.useWorker !== false &&\n    (Boolean(options.workerFactory) || (typeof Worker !== \"undefined\" && Boolean(options.workerModuleUrl)));\n  if (canUseWorker) {\n    return parseDwgInWorker(arrayBuffer, options, signal, onProgress);\n  }\n  onProgress(\"Parsing DWG on the main thread...\");\n  return parseDwgOnMainThread(arrayBuffer, options.wasmBaseUrl || defaultLibreDwgWasmBaseUrl, signal);\n}\n\nasync function parseDwgOnMainThread(\n  arrayBuffer: ArrayBuffer,\n  wasmBaseUrl: string,\n  signal?: AbortSignal\n): Promise<DwgParseResult> {\n  throwIfAborted(signal);\n  const { LibreDwg, Dwg_File_Type } = await loadLibreDwg();\n  throwIfAborted(signal);\n  const libredwg = await LibreDwg.create(wasmBaseUrl);\n  throwIfAborted(signal);\n  const data = libredwg.dwg_read_data(arrayBuffer, Dwg_File_Type.DWG);\n  if (!data) {\n    throw new Error(\"DWG parser did not return drawing data.\");\n  }\n\n  try {\n    const thumbnail = readDwgThumbnail(libredwg, data);\n    try {\n      const result = libredwg.convertEx(data);\n      const database = result.database;\n      return {\n        svg: libredwg.dwg_to_svg(database),\n        stats: createDwgPreviewStats(database, result.stats.unknownEntityCount, Boolean(thumbnail)),\n        thumbnail\n      };\n    } catch (error) {\n      return {\n        svg: \"\",\n        thumbnail,\n        conversionError: getErrorMessage(error)\n      };\n    }\n  } finally {\n    libredwg.dwg_free(data);\n  }\n}\n\nfunction parseDwgInWorker(\n  arrayBuffer: ArrayBuffer,\n  options: LibreDwgPreviewOptions,\n  signal: AbortSignal | undefined,\n  onProgress: (message: string) => void\n): Promise<DwgParseResult> {\n  return new Promise((resolve, reject) => {\n    let worker: Worker;\n    try {\n      worker = options.workerFactory?.() ?? createInlineDwgWorker(options.workerModuleUrl!);\n    } catch (error) {\n      reject(error);\n      return;\n    }\n\n    let settled = false;\n    const timeoutMs = Math.max(1, options.workerTimeoutMs ?? defaultWorkerTimeoutMs);\n    const timeoutId = setTimeout(() => {\n      finish(() => reject(new Error(`DWG worker timed out after ${timeoutMs}ms.`)));\n    }, timeoutMs);\n\n    const onAbort = () => {\n      finish(() => reject(createAbortError()));\n    };\n    const finish = (callback: () => void) => {\n      if (settled) {\n        return;\n      }\n      settled = true;\n      clearTimeout(timeoutId);\n      signal?.removeEventListener(\"abort\", onAbort);\n      worker.terminate();\n      callback();\n    };\n\n    worker.onmessage = (event: MessageEvent<DwgWorkerMessage>) => {\n      const message = event.data;\n      if (message.type === \"progress\") {\n        onProgress(message.message);\n        return;\n      }\n      if (message.type === \"success\") {\n        finish(() => resolve(normalizeWorkerResult(message.result)));\n        return;\n      }\n      finish(() => reject(new Error(message.message)));\n    };\n    worker.onerror = (event) => {\n      finish(() => reject(new Error(event.message || \"DWG worker failed.\")));\n    };\n\n    if (signal?.aborted) {\n      onAbort();\n      return;\n    }\n    signal?.addEventListener(\"abort\", onAbort, { once: true });\n    const transferableBuffer = arrayBuffer.slice(0);\n    worker.postMessage(\n      {\n        type: \"parse\",\n        arrayBuffer: transferableBuffer,\n        moduleUrl: resolveWorkerAssetUrl(options.workerModuleUrl),\n        wasmBaseUrl: resolveWorkerAssetUrl(options.wasmBaseUrl || defaultLibreDwgWasmBaseUrl)\n      },\n      [transferableBuffer]\n    );\n  });\n}\n\nfunction resolveWorkerAssetUrl(value: string | undefined): string | undefined {\n  if (!value) {\n    return undefined;\n  }\n  const baseUrl = typeof document !== \"undefined\" ? document.baseURI : globalThis.location?.href;\n  return baseUrl ? new URL(value, baseUrl).href : value;\n}\n\nfunction createInlineDwgWorker(moduleUrl: string): Worker {\n  if (!moduleUrl) {\n    throw new Error(\"DWG worker requires libreDwg.workerModuleUrl or a custom workerFactory.\");\n  }\n  const source = `(${runLibreDwgWorker.toString()})();`;\n  const blobUrl = URL.createObjectURL(new Blob([source], { type: \"text/javascript\" }));\n  try {\n    return new Worker(blobUrl, { type: \"module\", name: \"open-file-viewer-dwg\" });\n  } finally {\n    URL.revokeObjectURL(blobUrl);\n  }\n}\n\nfunction runLibreDwgWorker(): void {\n  const scope = self as unknown as {\n    onmessage: ((event: MessageEvent) => void) | null;\n    postMessage: (message: unknown, transfer?: Transferable[]) => void;\n  };\n  const errorMessage = (error: unknown) => (error instanceof Error ? error.message : String(error || \"Unknown DWG error\"));\n  const copyThumbnail = (thumbnail: { data?: Uint8Array; type?: number } | null | undefined) => {\n    if (!thumbnail?.data?.length) {\n      return undefined;\n    }\n    const data = thumbnail.data.slice();\n    return { data: data.buffer, type: Number(thumbnail.type || 0) };\n  };\n\n  scope.onmessage = async (event) => {\n    const request = event.data as {\n      type?: string;\n      arrayBuffer?: ArrayBuffer;\n      moduleUrl?: string;\n      wasmBaseUrl?: string;\n    };\n    if (request.type !== \"parse\" || !request.arrayBuffer || !request.moduleUrl) {\n      scope.postMessage({ type: \"error\", message: \"DWG worker received an invalid parse request.\" });\n      return;\n    }\n\n    try {\n      scope.postMessage({ type: \"progress\", message: \"Loading DWG rendering engine in worker...\" });\n      const importModule = new Function(\"url\", \"return import(url)\") as (url: string) => Promise<{\n        Dwg_File_Type: { DWG: number };\n        LibreDwg: { create(filepath?: string): Promise<any> };\n      }>;\n      const module = await importModule(request.moduleUrl);\n      const libredwg = await module.LibreDwg.create(request.wasmBaseUrl);\n      scope.postMessage({ type: \"progress\", message: \"Parsing DWG geometry in worker...\" });\n      const data = libredwg.dwg_read_data(request.arrayBuffer, module.Dwg_File_Type.DWG);\n      if (!data) {\n        throw new Error(\"DWG parser did not return drawing data.\");\n      }\n\n      try {\n        let thumbnail;\n        try {\n          thumbnail = copyThumbnail(libredwg.dwg_bmp(data));\n        } catch {\n          thumbnail = undefined;\n        }\n        try {\n          const converted = libredwg.convertEx(data);\n          const database = converted.database;\n          const layers = database.tables?.LAYER?.entries ?? [];\n          const entities = database.entities ?? [];\n          const layouts = database.objects?.LAYOUT ?? [];\n          const result = {\n            svg: libredwg.dwg_to_svg(database),\n            stats: {\n              entityCount: entities.length,\n              layerCount: layers.length,\n              layoutCount: layouts.length,\n              unknownEntityCount: Number(converted.stats?.unknownEntityCount || 0),\n              visibleLayerCount: layers.filter((layer: { off?: boolean; frozen?: boolean }) => !layer.off && !layer.frozen).length,\n              paperSpaceEntityCount: entities.filter((entity: { isInPaperSpace?: boolean }) => entity.isInPaperSpace).length,\n              hasThumbnail: Boolean(thumbnail)\n            },\n            thumbnail\n          };\n          const transfer = thumbnail?.data ? [thumbnail.data] : [];\n          scope.postMessage({ type: \"success\", result }, transfer);\n        } catch (error) {\n          const result = {\n            svg: \"\",\n            thumbnail,\n            conversionError: errorMessage(error)\n          };\n          const transfer = thumbnail?.data ? [thumbnail.data] : [];\n          scope.postMessage({ type: \"success\", result }, transfer);\n        }\n      } finally {\n        libredwg.dwg_free(data);\n      }\n    } catch (error) {\n      scope.postMessage({ type: \"error\", message: errorMessage(error) });\n    }\n  };\n}\n\nfunction normalizeWorkerResult(result: DwgParseResult): DwgParseResult {\n  const thumbnail = result.thumbnail as DwgThumbnail | { data: ArrayBuffer; type: number } | undefined;\n  return {\n    ...result,\n    thumbnail: thumbnail\n      ? {\n          type: thumbnail.type,\n          data: thumbnail.data instanceof Uint8Array ? thumbnail.data : new Uint8Array(thumbnail.data)\n        }\n      : undefined\n  };\n}\n\nfunction createAbortError(): Error {\n  const error = new Error(\"DWG preview was aborted.\");\n  error.name = \"AbortError\";\n  return error;\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n  if (signal?.aborted) {\n    throw createAbortError();\n  }\n}\n\nfunction isAbortError(error: unknown): boolean {\n  return error instanceof Error && error.name === \"AbortError\";\n}\n\nfunction getErrorMessage(error: unknown): string {\n  return error instanceof Error ? error.message : String(error || \"Unknown DWG error\");\n}\n\nfunction loadLibreDwg(): Promise<LibreDwgModule> {\n  libreDwgPromise ||= importOptionalModule<LibreDwgModule>(libreDwgPackageName);\n  return libreDwgPromise;\n}\n\nfunction importOptionalModule<T>(packageName: string): Promise<T> {\n  return new Function(\"packageName\", \"return import(packageName)\")(packageName) as Promise<T>;\n}\n\nfunction createDwgStatusTitle(fileName: string, stats: DwgPreviewStats): HTMLElement {\n  const wrapper = document.createElement(\"span\");\n  const title = document.createElement(\"strong\");\n  const note = document.createElement(\"small\");\n  title.textContent = `实验性 DWG 模型空间预览 · ${fileName}`;\n  note.textContent = [\n    `${stats.entityCount.toLocaleString()} 个实体`,\n    `${stats.visibleLayerCount}/${stats.layerCount} 个可见图层`,\n    `${stats.layoutCount} 个布局`,\n    stats.paperSpaceEntityCount ? `${stats.paperSpaceEntityCount.toLocaleString()} 个图纸空间实体` : \"模型空间线稿\",\n    stats.unknownEntityCount ? `${stats.unknownEntityCount} 个未知实体` : \"实体解析完整\",\n    stats.hasThumbnail ? \"包含内置缩略图\" : \"无内置缩略图\"\n  ].join(\" · \");\n  const warning = document.createElement(\"small\");\n  warning.textContent = \"当前为 LibreDWG WASM 线稿预览，复杂布局/打印空间/字体/填充与专业 CAD 仍可能存在差异。\";\n  wrapper.append(title, note, warning);\n  return wrapper;\n}\n\nfunction createDwgThumbnailFallbackStatus(fileName: string, error: unknown): HTMLElement {\n  const wrapper = document.createElement(\"span\");\n  const title = document.createElement(\"strong\");\n  title.textContent = `DWG 内置预览图 · ${fileName}`;\n  const note = document.createElement(\"small\");\n  note.textContent = \"LibreDWG 已读取到文件内置缩略图，但线稿预览未能生成，已自动切换为缩略图兜底。\";\n  const detail = document.createElement(\"small\");\n  detail.textContent = error instanceof Error ? error.message : String(error || \"未知解析错误\");\n  wrapper.append(title, note, detail);\n  return wrapper;\n}\n\nfunction createDwgPreviewStats(database: DwgDatabase, unknownEntityCount: number, hasThumbnail: boolean): DwgPreviewStats {\n  const layers = database.tables.LAYER.entries;\n  return {\n    entityCount: database.entities.length,\n    layerCount: layers.length,\n    layoutCount: database.objects.LAYOUT.length,\n    unknownEntityCount,\n    visibleLayerCount: layers.filter((layer) => !layer.off && !layer.frozen).length,\n    paperSpaceEntityCount: database.entities.filter((entity) => entity.isInPaperSpace).length,\n    hasThumbnail\n  };\n}\n\nfunction readDwgThumbnail(libredwg: LibreDwgValue, data: number): DwgThumbnail | undefined {\n  try {\n    const thumbnail = libredwg.dwg_bmp(data);\n    if (!thumbnail?.data?.length) {\n      return undefined;\n    }\n    return thumbnail;\n  } catch {\n    return undefined;\n  }\n}\n\nfunction createDwgThumbnailUrl(thumbnail: DwgThumbnail | undefined): string | undefined {\n  if (!thumbnail) {\n    return undefined;\n  }\n  if (thumbnail.type === 6) {\n    return URL.createObjectURL(new Blob([toArrayBuffer(thumbnail.data)], { type: \"image/png\" }));\n  }\n  if (thumbnail.type === 2) {\n    return URL.createObjectURL(new Blob([toArrayBuffer(createBmpFileBytes(thumbnail.data))], { type: \"image/bmp\" }));\n  }\n  return undefined;\n}\n\nfunction toArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n  return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;\n}\n\nfunction createBmpFileBytes(dibBytes: Uint8Array): Uint8Array {\n  const view = new DataView(dibBytes.buffer, dibBytes.byteOffset, dibBytes.byteLength);\n  const headerSize = view.getUint32(0, true);\n  const bitCount = view.getUint16(14, true);\n  const paletteBytes = bitCount <= 8 ? 2 ** bitCount * 4 : 0;\n  const pixelOffset = 14 + headerSize + paletteBytes;\n  const bytes = new Uint8Array(14 + dibBytes.byteLength);\n  bytes[0] = 0x42;\n  bytes[1] = 0x4d;\n  const fileView = new DataView(bytes.buffer);\n  fileView.setUint32(2, bytes.byteLength, true);\n  fileView.setUint32(10, pixelOffset, true);\n  bytes.set(dibBytes, 14);\n  return bytes;\n}\n\nfunction createDwgThumbnailPanel(thumbnailUrl: string): HTMLElement {\n  const panel = document.createElement(\"figure\");\n  panel.className = \"ofv-dwg-thumbnail\";\n  const image = document.createElement(\"img\");\n  image.src = thumbnailUrl;\n  image.alt = \"DWG 文件内置缩略图\";\n  const caption = document.createElement(\"figcaption\");\n  caption.textContent = \"文件内置缩略图\";\n  panel.append(image, caption);\n  return panel;\n}\n\nfunction createDwgThumbnailPreview(thumbnailUrl: string, fileName: string): HTMLElement {\n  const figure = document.createElement(\"figure\");\n  figure.className = \"ofv-dwg-thumbnail-preview\";\n  const image = document.createElement(\"img\");\n  image.src = thumbnailUrl;\n  image.alt = `${fileName} 内置预览图`;\n  const caption = document.createElement(\"figcaption\");\n  caption.textContent = \"DWG 文件内置预览图。若需要接近 CAD 布局/打印空间的高保真效果，请使用同名 PNG、SVG、PDF 导出图，或通过 binaryRenderer 接入专业 CAD 渲染/转换服务。\";\n  figure.append(image, caption);\n  return figure;\n}\n\nfunction normalizeDwgSvg(svgElement: SVGElement): void {\n  svgElement.setAttribute(\"preserveAspectRatio\", \"xMidYMid meet\");\n  removeInheritedDwgFills(svgElement);\n  focusDwgSvgOnMainDrawing(svgElement);\n  const style = document.createElementNS(\"http://www.w3.org/2000/svg\", \"style\");\n  style.textContent = `\n    .ofv-dwg-preview-svg { background: #020617; }\n    .ofv-dwg-preview-svg g {\n      fill: none !important;\n    }\n    .ofv-dwg-preview-svg line,\n    .ofv-dwg-preview-svg path,\n    .ofv-dwg-preview-svg polyline,\n    .ofv-dwg-preview-svg polygon,\n    .ofv-dwg-preview-svg circle,\n    .ofv-dwg-preview-svg ellipse,\n    .ofv-dwg-preview-svg rect {\n      fill: none !important;\n      vector-effect: non-scaling-stroke;\n      stroke-width: 0.7px !important;\n      stroke-linecap: round;\n      stroke-linejoin: round;\n    }\n    .ofv-dwg-preview-svg [stroke=\"rgb(0,255,0)\"] {\n      stroke: #34d399 !important;\n      stroke-opacity: 0.58 !important;\n    }\n    .ofv-dwg-preview-svg text {\n      vector-effect: non-scaling-stroke;\n      stroke-width: 0 !important;\n      fill: currentColor !important;\n    }\n  `;\n  svgElement.prepend(style);\n}\n\nfunction removeInheritedDwgFills(svgElement: SVGElement): void {\n  const shapeSelector = \"line,path,polyline,polygon,circle,ellipse,rect\";\n  for (const group of svgElement.querySelectorAll<SVGGElement>(\"g[fill]\")) {\n    group.setAttribute(\"fill\", \"none\");\n  }\n  for (const styledElement of svgElement.querySelectorAll<SVGElement>(\"[style]\")) {\n    styledElement.style.fill = \"none\";\n  }\n  for (const shape of svgElement.querySelectorAll<SVGElement>(shapeSelector)) {\n    shape.setAttribute(\"fill\", \"none\");\n  }\n}\n\nfunction focusDwgSvgOnMainDrawing(svgElement: SVGElement): void {\n  const originalBounds = readSvgViewBox(svgElement);\n  const mainBounds = estimateMainDrawingBounds(svgElement);\n  if (!originalBounds || !mainBounds || !shouldUseMainDrawingBounds(originalBounds, mainBounds)) {\n    return;\n  }\n\n  const paddedBounds = padBounds(mainBounds, 0.05);\n  svgElement.dataset.originalViewBox = formatViewBox(originalBounds);\n  svgElement.dataset.focusViewBox = formatViewBox(paddedBounds);\n  svgElement.setAttribute(\"viewBox\", formatViewBox(paddedBounds));\n}\n\nfunction shouldUseMainDrawingBounds(original: DwgSvgBounds, candidate: DwgSvgBounds): boolean {\n  const originalAspectRatio = original.width / original.height;\n  const candidateAspectRatio = candidate.width / candidate.height;\n  const originalArea = original.width * original.height;\n  const candidateArea = candidate.width * candidate.height;\n  if (!Number.isFinite(originalArea) || !Number.isFinite(candidateArea) || candidateArea <= 0) {\n    return false;\n  }\n\n  return (\n    originalAspectRatio > 8 ||\n    originalAspectRatio < 0.125 ||\n    candidateArea / originalArea < 0.55 ||\n    Math.abs(Math.log(originalAspectRatio / candidateAspectRatio)) > Math.log(4)\n  );\n}\n\nfunction estimateMainDrawingBounds(svgElement: SVGElement): DwgSvgBounds | undefined {\n  const points: Array<[number, number]> = [];\n  const addPoint = (x: number, y: number) => {\n    if (Number.isFinite(x) && Number.isFinite(y) && Math.abs(x) < 1_000_000_000 && Math.abs(y) < 1_000_000_000) {\n      points.push([x, y]);\n    }\n  };\n\n  for (const element of svgElement.querySelectorAll<SVGGeometryElement>(\"line,path,polyline,polygon,circle,ellipse,rect,text,use\")) {\n    if (element.closest(\"defs\")) {\n      continue;\n    }\n    collectElementPoints(element, addPoint);\n  }\n\n  if (points.length < 16) {\n    return undefined;\n  }\n\n  const xs = points.map(([x]) => x).sort((a, b) => a - b);\n  const ys = points.map(([, y]) => y).sort((a, b) => a - b);\n  const minX = quantile(xs, 0.005);\n  const maxX = quantile(xs, 0.995);\n  const minY = quantile(ys, 0.005);\n  const maxY = quantile(ys, 0.995);\n  if (!Number.isFinite(minX) || !Number.isFinite(maxX) || !Number.isFinite(minY) || !Number.isFinite(maxY)) {\n    return undefined;\n  }\n\n  const width = maxX - minX;\n  const height = maxY - minY;\n  if (width <= 0 || height <= 0) {\n    return undefined;\n  }\n\n  return { minX, minY, width, height };\n}\n\nfunction collectElementPoints(element: SVGElement, addPoint: (x: number, y: number) => void): void {\n  const tagName = element.tagName.toLowerCase();\n  if (tagName === \"line\") {\n    addPoint(readNumberAttribute(element, \"x1\"), readNumberAttribute(element, \"y1\"));\n    addPoint(readNumberAttribute(element, \"x2\"), readNumberAttribute(element, \"y2\"));\n  } else if (tagName === \"circle\") {\n    const cx = readNumberAttribute(element, \"cx\");\n    const cy = readNumberAttribute(element, \"cy\");\n    const r = readNumberAttribute(element, \"r\");\n    addPoint(cx - r, cy - r);\n    addPoint(cx + r, cy + r);\n  } else if (tagName === \"ellipse\") {\n    const cx = readNumberAttribute(element, \"cx\");\n    const cy = readNumberAttribute(element, \"cy\");\n    const rx = readNumberAttribute(element, \"rx\");\n    const ry = readNumberAttribute(element, \"ry\");\n    addPoint(cx - rx, cy - ry);\n    addPoint(cx + rx, cy + ry);\n  } else if (tagName === \"rect\") {\n    const x = readNumberAttribute(element, \"x\");\n    const y = readNumberAttribute(element, \"y\");\n    addPoint(x, y);\n    addPoint(x + readNumberAttribute(element, \"width\"), y + readNumberAttribute(element, \"height\"));\n  } else if (tagName === \"text\") {\n    addPoint(readNumberAttribute(element, \"x\"), readNumberAttribute(element, \"y\"));\n  } else if (tagName === \"path\") {\n    collectNumberPairs(element.getAttribute(\"d\"), addPoint);\n  } else if (tagName === \"polyline\" || tagName === \"polygon\") {\n    collectNumberPairs(element.getAttribute(\"points\"), addPoint);\n  }\n\n  collectTranslatePoints(element.getAttribute(\"transform\"), addPoint);\n}\n\nfunction collectNumberPairs(value: string | null, addPoint: (x: number, y: number) => void): void {\n  if (!value) {\n    return;\n  }\n\n  const numbers = readNumbers(value);\n  for (let index = 0; index + 1 < numbers.length; index += 2) {\n    addPoint(numbers[index], numbers[index + 1]);\n  }\n}\n\nfunction collectTranslatePoints(value: string | null, addPoint: (x: number, y: number) => void): void {\n  if (!value) {\n    return;\n  }\n\n  const translatePattern = /translate\\(\\s*(-?\\d*\\.?\\d+(?:e[-+]?\\d+)?)(?:[\\s,]+(-?\\d*\\.?\\d+(?:e[-+]?\\d+)?))?/gi;\n  for (const match of value.matchAll(translatePattern)) {\n    addPoint(Number(match[1]), Number(match[2] ?? 0));\n  }\n}\n\nfunction readNumbers(value: string): number[] {\n  const matches = value.match(svgNumberPattern);\n  return matches ? matches.map((item) => Number(item)).filter(Number.isFinite) : [];\n}\n\nfunction readNumberAttribute(element: SVGElement, name: string): number {\n  const value = Number(element.getAttribute(name) ?? 0);\n  return Number.isFinite(value) ? value : 0;\n}\n\nfunction quantile(values: number[], ratio: number): number {\n  const index = Math.max(0, Math.min(values.length - 1, Math.floor((values.length - 1) * ratio)));\n  return values[index];\n}\n\nfunction padBounds(bounds: DwgSvgBounds, ratio: number): DwgSvgBounds {\n  const paddingX = bounds.width * ratio;\n  const paddingY = bounds.height * ratio;\n  return {\n    minX: bounds.minX - paddingX,\n    minY: bounds.minY - paddingY,\n    width: bounds.width + paddingX * 2,\n    height: bounds.height + paddingY * 2\n  };\n}\n\nfunction formatViewBox(bounds: DwgSvgBounds): string {\n  return [bounds.minX, bounds.minY, bounds.width, bounds.height].map((value) => Number(value.toFixed(4))).join(\" \");\n}\n\nfunction createDwgDrawingViewport(svgElement: SVGElement) {\n  const frame = document.createElement(\"div\");\n  frame.className = \"ofv-dwg-preview-frame\";\n  const importedSvg = document.importNode(svgElement, true);\n  frame.append(importedSvg);\n  const aspectRatio = readSvgAspectRatio(svgElement);\n  let zoom = 1;\n\n  const update = () => {\n    const frameWidth = Math.max(frame.clientWidth, 1);\n    const readableWidth = aspectRatio ? minReadableDrawingHeight * aspectRatio : frameWidth;\n    const width = Math.max(frameWidth, readableWidth) * zoom;\n    importedSvg.style.width = `${Math.round(width)}px`;\n    importedSvg.style.minWidth = `${Math.round(width)}px`;\n  };\n\n  const setZoom = (nextZoom: number) => {\n    zoom = Math.min(Math.max(nextZoom, 0.2), 8);\n    update();\n  };\n\n  requestAnimationFrame(update);\n\n  return {\n    frame,\n    get zoom() {\n      return zoom;\n    },\n    setZoom,\n    update\n  };\n}\n\nfunction readSvgAspectRatio(svgElement: SVGElement): number | undefined {\n  const viewBox = readSvgViewBox(svgElement);\n  return viewBox ? viewBox.width / viewBox.height : undefined;\n}\n\nfunction readSvgViewBox(svgElement: SVGElement): DwgSvgBounds | undefined {\n  const viewBox = svgElement.getAttribute(\"viewBox\");\n  if (!viewBox) {\n    return undefined;\n  }\n\n  const [minX, minY, width, height] = viewBox\n    .trim()\n    .split(/[\\s,]+/)\n    .map((value) => Number(value));\n  if (\n    !Number.isFinite(minX) ||\n    !Number.isFinite(minY) ||\n    !Number.isFinite(width) ||\n    !Number.isFinite(height) ||\n    width <= 0 ||\n    height <= 0\n  ) {\n    return undefined;\n  }\n\n  return { minX, minY, width, height };\n}\n","import type { PreviewCommand, PreviewInstance } from \"../types\";\nimport type { CadBinaryPreviewContext } from \"./cad\";\n\nexport interface WebglDwgPreviewOptions {\n  /** Directory containing the DWG parser and MTEXT worker bundles. */\n  workerBaseUrl: string;\n  /**\n   * Loads the optional WebGL CAD engine.\n   *\n   * Keeping this import in the host application lets strict bundlers resolve\n   * the peer only when WebGL DWG preview is enabled.\n   *\n   * @example `() => import(\"@mlightcad/cad-simple-viewer\")`\n   */\n  engineLoader: WebglDwgEngineLoader;\n  /** Optional base URL for CAD fonts and other runtime resources. */\n  baseUrl?: string;\n  /** Skip loading the engine's default font set. Defaults to false. */\n  notLoadDefaultFonts?: boolean;\n  /** Verify both worker URLs before opening a drawing. Defaults to true. */\n  checkWorkers?: boolean;\n  /** Paint converted entities incrementally while parsing. Defaults to true. */\n  progressiveRendering?: boolean;\n  /** Render converted entities on the main thread. Defaults to false. */\n  useMainThreadDraw?: boolean;\n}\n\nexport type WebglDwgEngineLoader = () => Promise<unknown>;\n\ntype CadEngineModule = typeof import(\"@mlightcad/cad-simple-viewer\");\n\nconst engineModulePromises = new WeakMap<WebglDwgEngineLoader, Promise<CadEngineModule>>();\nlet pendingDestroy: Promise<void> = Promise.resolve();\n\nfunction loadCadEngine(engineLoader: WebglDwgEngineLoader | undefined): Promise<CadEngineModule> {\n  if (!engineLoader) {\n    throw new Error(\n      'WebGL DWG preview requires webglDwg.engineLoader, for example () => import(\"@mlightcad/cad-simple-viewer\").'\n    );\n  }\n\n  let engineModulePromise = engineModulePromises.get(engineLoader);\n  if (!engineModulePromise) {\n    engineModulePromise = engineLoader().then(resolveCadEngineModule);\n    engineModulePromises.set(engineLoader, engineModulePromise);\n  }\n  return engineModulePromise;\n}\n\nexport async function renderWebglDwgPreview(\n  ctx: CadBinaryPreviewContext,\n  options: WebglDwgPreviewOptions\n): Promise<PreviewInstance> {\n  await pendingDestroy.catch(() => undefined);\n\n  const shell = document.createElement(\"div\");\n  shell.className = \"ofv-dwg-webgl-preview\";\n\n  const stage = document.createElement(\"div\");\n  stage.className = \"ofv-dwg-webgl-stage\";\n\n  const status = document.createElement(\"div\");\n  status.className = \"ofv-dwg-webgl-status\";\n  status.setAttribute(\"role\", \"status\");\n  status.textContent = \"正在解析 DWG 图层、块和文字…\";\n\n  shell.append(stage, status);\n  ctx.panel.append(shell);\n\n  let manager: ReturnType<CadEngineModule[\"AcApDocManager\"][\"createInstance\"]>;\n  try {\n    const engine = await loadCadEngine(options.engineLoader);\n    const workerBaseUrl = normalizeBaseUrl(options.workerBaseUrl);\n    const workerUrls = {\n      dwgParser: resolveRuntimeUrl(`${workerBaseUrl}/libredwg-parser-worker.js`),\n      mtextRender: resolveRuntimeUrl(`${workerBaseUrl}/mtext-renderer-worker.js`)\n    };\n\n    manager = engine.AcApDocManager.createInstance({\n      container: stage,\n      autoResize: true,\n      baseUrl: options.baseUrl,\n      busyIndicatorHost: shell,\n      builtinOpenFileDialog: false,\n      notLoadDefaultFonts: options.notLoadDefaultFonts ?? false,\n      useMainThreadDraw: options.useMainThreadDraw ?? false,\n      webworkerFileUrls: workerUrls\n    });\n    if (!manager) {\n      throw new Error(\"CAD rendering engine could not be initialized.\");\n    }\n\n    if ((options.checkWorkers ?? true) && !(await manager.areWorkersReady())) {\n      throw new Error(\"DWG worker resources are unavailable.\");\n    }\n\n    const opened = await manager.openDocument(ctx.fileName, ctx.arrayBuffer.slice(0), {\n      mode: engine.AcEdOpenMode.Read,\n      openViewMode: engine.AcApOpenViewMode.Extents,\n      progressiveRendering: options.progressiveRendering ?? true\n    });\n    if (!opened) {\n      throw new Error(\"The DWG document could not be opened.\");\n    }\n\n    status.hidden = true;\n    manager.curView.zoomToFitDrawing();\n    ctx.preview.toolbar?.setZoom(1);\n  } catch (error) {\n    if (manager) {\n      await manager.destroy().catch(() => undefined);\n    }\n    shell.remove();\n    throw error instanceof Error ? error : new Error(\"DWG WebGL preview failed.\");\n  }\n\n  const activeManager = manager;\n  let destroyed = false;\n  let toolbarZoom = 1;\n\n  function zoom(factor: number): void {\n    const view = activeManager.curView;\n    const camera = view.internalCamera;\n    camera.zoom = clamp(camera.zoom * factor, 0.02, 64);\n    camera.updateProjectionMatrix();\n    view.isDirty = true;\n    toolbarZoom = clamp(toolbarZoom * factor, 0.02, 64);\n    ctx.preview.toolbar?.setZoom(toolbarZoom);\n  }\n\n  return {\n    resize() {\n      activeManager.curView.isDirty = true;\n    },\n    canCommand(command: PreviewCommand) {\n      return command === \"zoom-in\" || command === \"zoom-out\" || command === \"zoom-reset\";\n    },\n    command(command: PreviewCommand) {\n      if (command === \"zoom-in\") {\n        zoom(1.22);\n        return true;\n      }\n      if (command === \"zoom-out\") {\n        zoom(1 / 1.22);\n        return true;\n      }\n      if (command === \"zoom-reset\") {\n        activeManager.curView.zoomToFitDrawing();\n        toolbarZoom = 1;\n        ctx.preview.toolbar?.setZoom(toolbarZoom);\n        return true;\n      }\n      return false;\n    },\n    destroy() {\n      if (destroyed) return;\n      destroyed = true;\n      ctx.preview.toolbar?.setZoom(undefined);\n      shell.remove();\n      pendingDestroy = activeManager.destroy().catch((error) => {\n        console.warn(\"Failed to release the DWG WebGL preview.\", error);\n      });\n    }\n  };\n}\n\nfunction resolveCadEngineModule(value: unknown): CadEngineModule {\n  const engine = value as Partial<CadEngineModule> | null;\n  if (!engine?.AcApDocManager || !engine.AcEdOpenMode || !engine.AcApOpenViewMode) {\n    throw new Error(\"The configured WebGL DWG engine module is invalid.\");\n  }\n  return engine as CadEngineModule;\n}\n\nfunction normalizeBaseUrl(value: string): string {\n  return value.replace(/\\/+$/, \"\");\n}\n\nfunction resolveRuntimeUrl(value: string): string {\n  return new URL(value, document.baseURI).href;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n  return Math.min(max, Math.max(min, value));\n}\n","import pako from \"pako\";\n\nexport type OasisPoint = [number, number];\n\nexport type OasisShape = {\n  kind: \"boundary\" | \"path\" | \"box\";\n  cell?: string;\n  layer: string;\n  datatype?: string;\n  points: OasisPoint[];\n  width?: number;\n};\n\nexport type OasisLabel = {\n  cell?: string;\n  layer: string;\n  text: string;\n  x: number;\n  y: number;\n};\n\nexport type OasisReference = {\n  ownerCell?: string;\n  cell: string;\n  x: number;\n  y: number;\n};\n\nexport type OasisBinaryLayout = {\n  version: string;\n  unit?: number;\n  cells: string[];\n  shapes: OasisShape[];\n  labels: OasisLabel[];\n  references: OasisReference[];\n  placementRecordCount: number;\n  compressedBlockCount: number;\n  recordCount: number;\n  warnings: string[];\n};\n\ntype OasisBlock = { offset: number; bytes: Uint8Array };\ntype Point = { x: number; y: number };\ntype OasisState = {\n  absolute: boolean;\n  currentCell: string;\n  cellNames: Map<number, string>;\n  nextCellName: number;\n  textNames: Map<number, string>;\n  nextTextName: number;\n  modalLayer: number;\n  modalDatatype: number;\n  modalTextLayer: number;\n  modalTextType: number;\n  modalGeometry: Point;\n  modalGeometrySize: Point;\n  modalPlacement: Point;\n  modalText: Point;\n  modalPlacementCell?: string;\n  modalTextValue?: string;\n  modalPolygon: Point[];\n  modalPath: Point[];\n  modalPathWidth: number;\n  modalRepetition: Point[];\n  shapes: OasisShape[];\n  labels: OasisLabel[];\n  references: OasisReference[];\n  placementRecordCount: number;\n  cells: string[];\n  warnings: string[];\n  unsupportedRecords: Set<number>;\n  recordCount: number;\n  truncated: boolean;\n};\n\nconst OASIS_MAGIC = \"%SEMI-OASIS\\r\\n\";\nconst MAX_BLOCK_BYTES = 64 * 1024 * 1024;\nconst MAX_LAYOUT_SHAPES = 12_000;\nconst MAX_REPETITIONS = 12_000;\n\nclass OasisCursor {\n  offset = 0;\n\n  constructor(readonly bytes: Uint8Array) {}\n\n  get remaining(): number {\n    return this.bytes.length - this.offset;\n  }\n\n  readByte(): number {\n    if (this.offset >= this.bytes.length) {\n      throw new Error(\"Unexpected end of OASIS data\");\n    }\n    return this.bytes[this.offset++];\n  }\n\n  readUnsigned(): number {\n    let result = 0;\n    let shift = 0;\n    for (let index = 0; index < 10; index += 1) {\n      const byte = this.readByte();\n      result += (byte & 0x7f) * 2 ** shift;\n      if ((byte & 0x80) === 0) {\n        if (!Number.isSafeInteger(result)) {\n          throw new Error(\"OASIS integer exceeds the browser safe range\");\n        }\n        return result;\n      }\n      shift += 7;\n    }\n    throw new Error(\"Invalid OASIS variable-length integer\");\n  }\n\n  readSigned(): number {\n    const first = this.readByte();\n    let result = (first & 0x7f) >> 1;\n    let shift = 6;\n    let byte = first;\n    for (let index = 0; byte & 0x80; index += 1) {\n      if (index >= 9) {\n        throw new Error(\"Invalid OASIS signed integer\");\n      }\n      byte = this.readByte();\n      result += (byte & 0x7f) * 2 ** shift;\n      shift += 7;\n    }\n    return first & 0x01 ? -result : result;\n  }\n\n  readString(): string {\n    const length = this.readUnsigned();\n    if (length > this.remaining) {\n      throw new Error(\"Invalid OASIS string length\");\n    }\n    const result = new TextDecoder(\"utf-8\", { fatal: false }).decode(this.bytes.slice(this.offset, this.offset + length));\n    this.offset += length;\n    return result.replace(/\\0+$/g, \"\");\n  }\n\n  readReal(type = this.readByte()): number {\n    if (type === 0) return this.readUnsigned();\n    if (type === 1) return -this.readUnsigned();\n    if (type === 2) return 1 / this.readUnsigned();\n    if (type === 3) return -1 / this.readUnsigned();\n    if (type === 4 || type === 5) {\n      const value = this.readUnsigned() / this.readUnsigned();\n      return type === 5 ? -value : value;\n    }\n    if (type === 6) {\n      if (this.remaining < 4) throw new Error(\"Invalid OASIS float\");\n      const value = new DataView(this.bytes.buffer, this.bytes.byteOffset + this.offset, 4).getFloat32(0, true);\n      this.offset += 4;\n      return value;\n    }\n    if (type === 7) {\n      if (this.remaining < 8) throw new Error(\"Invalid OASIS double\");\n      const value = new DataView(this.bytes.buffer, this.bytes.byteOffset + this.offset, 8).getFloat64(0, true);\n      this.offset += 8;\n      return value;\n    }\n    throw new Error(`Unsupported OASIS real type ${type}`);\n  }\n}\n\nexport function parseBinaryOasis(bytes: Uint8Array): OasisBinaryLayout | undefined {\n  const header = new TextDecoder(\"ascii\").decode(bytes.slice(0, OASIS_MAGIC.length));\n  if (header !== OASIS_MAGIC || bytes[OASIS_MAGIC.length] !== 1) {\n    return undefined;\n  }\n\n  const headerCursor = new OasisCursor(bytes);\n  headerCursor.offset = OASIS_MAGIC.length + 1;\n  let version = \"OASIS\";\n  let unit: number | undefined;\n  try {\n    version = headerCursor.readString() || version;\n    unit = headerCursor.readReal();\n  } catch {\n    // Geometry blocks remain independently parseable even with damaged metadata.\n  }\n\n  const blocks = extractCompressedBlocks(bytes);\n  const state = createOasisState();\n  for (const block of blocks) {\n    parseOasisRecordStream(block.bytes, state);\n  }\n\n  resolveOasisNames(state);\n  if (blocks.length === 0 || (state.shapes.length === 0 && state.labels.length === 0 && state.references.length === 0)) {\n    return undefined;\n  }\n  if (state.unsupportedRecords.size > 0) {\n    state.warnings.push(`未展开的 OASIS 记录类型：${[...state.unsupportedRecords].sort((a, b) => a - b).join(\"、\")}。`);\n  }\n  if (state.truncated) {\n    state.warnings.push(`版图几何超过 ${MAX_LAYOUT_SHAPES} 个，已截断以保护浏览器内存。`);\n  }\n  return {\n    version,\n    unit,\n    cells: unique([\n      ...state.cells.map((cell) => resolveName(cell, state.cellNames)),\n      ...state.cellNames.values(),\n      ...state.shapes.map((shape) => shape.cell || \"\"),\n      ...state.labels.map((label) => label.cell || \"\"),\n      ...state.references.flatMap((reference) => [reference.ownerCell || \"\", reference.cell])\n    ]),\n    shapes: state.shapes,\n    labels: state.labels,\n    references: state.references,\n    placementRecordCount: state.placementRecordCount,\n    compressedBlockCount: blocks.length,\n    recordCount: state.recordCount,\n    warnings: state.warnings\n  };\n}\n\nfunction createOasisState(): OasisState {\n  return {\n    absolute: true,\n    currentCell: \"TOP\",\n    cellNames: new Map(),\n    nextCellName: 0,\n    textNames: new Map(),\n    nextTextName: 0,\n    modalLayer: 0,\n    modalDatatype: 0,\n    modalTextLayer: 0,\n    modalTextType: 0,\n    modalGeometry: { x: 0, y: 0 },\n    modalGeometrySize: { x: 0, y: 0 },\n    modalPlacement: { x: 0, y: 0 },\n    modalText: { x: 0, y: 0 },\n    modalPolygon: [{ x: 0, y: 0 }],\n    modalPath: [{ x: 0, y: 0 }],\n    modalPathWidth: 0,\n    modalRepetition: [{ x: 0, y: 0 }],\n    shapes: [],\n    labels: [],\n    references: [],\n    placementRecordCount: 0,\n    cells: [],\n    warnings: [],\n    unsupportedRecords: new Set(),\n    recordCount: 0,\n    truncated: false\n  };\n}\n\nfunction extractCompressedBlocks(bytes: Uint8Array): OasisBlock[] {\n  const blocks: OasisBlock[] = [];\n  let occupiedUntil = 0;\n  for (let offset = OASIS_MAGIC.length; offset < bytes.length; offset += 1) {\n    if (offset < occupiedUntil || bytes[offset] !== 34) {\n      continue;\n    }\n    try {\n      const cursor = new OasisCursor(bytes);\n      cursor.offset = offset + 1;\n      const method = cursor.readUnsigned();\n      const expandedLength = cursor.readUnsigned();\n      const compressedLength = cursor.readUnsigned();\n      if (\n        method !== 0 ||\n        expandedLength <= 0 ||\n        expandedLength > MAX_BLOCK_BYTES ||\n        compressedLength <= 0 ||\n        compressedLength > cursor.remaining\n      ) {\n        continue;\n      }\n      const end = cursor.offset + compressedLength;\n      const inflated = pako.inflateRaw(bytes.slice(cursor.offset, end));\n      if (inflated.byteLength !== expandedLength) {\n        continue;\n      }\n      blocks.push({ offset, bytes: inflated });\n      occupiedUntil = end;\n      offset = end - 1;\n    } catch {\n      // A byte equal to the CBLOCK record id can also occur inside ordinary data.\n    }\n  }\n  return blocks;\n}\n\nfunction parseOasisRecordStream(bytes: Uint8Array, state: OasisState): void {\n  const cursor = new OasisCursor(bytes);\n  while (cursor.remaining > 0) {\n    const recordOffset = cursor.offset;\n    try {\n      const record = cursor.readByte();\n      state.recordCount += 1;\n      if (record === 0) continue;\n      if (record === 2) return;\n      if (record === 3 || record === 4) {\n        const name = cursor.readString();\n        const index = record === 4 ? cursor.readUnsigned() : state.nextCellName;\n        state.cellNames.set(index, name);\n        state.nextCellName = Math.max(state.nextCellName, index + 1);\n        continue;\n      }\n      if (record === 5 || record === 6) {\n        const value = cursor.readString();\n        const index = record === 6 ? cursor.readUnsigned() : state.nextTextName;\n        state.textNames.set(index, value);\n        state.nextTextName = Math.max(state.nextTextName, index + 1);\n        continue;\n      }\n      if (record >= 7 && record <= 10) {\n        cursor.readString();\n        if (record === 8 || record === 10) cursor.readUnsigned();\n        continue;\n      }\n      if (record === 13 || record === 14) {\n        state.currentCell = record === 13 ? referenceName(cursor.readUnsigned()) : cursor.readString();\n        state.cells.push(state.currentCell);\n        state.absolute = true;\n        state.modalPlacement = { x: 0, y: 0 };\n        state.modalGeometry = { x: 0, y: 0 };\n        state.modalText = { x: 0, y: 0 };\n        continue;\n      }\n      if (record === 15 || record === 16) {\n        state.absolute = record === 15;\n        continue;\n      }\n      if (record === 17 || record === 18) {\n        readPlacement(cursor, state, record === 18);\n        continue;\n      }\n      if (record === 19) {\n        readText(cursor, state);\n        continue;\n      }\n      if (record === 20) {\n        readRectangle(cursor, state);\n        continue;\n      }\n      if (record === 21) {\n        readPolygon(cursor, state);\n        continue;\n      }\n      if (record === 22) {\n        readPath(cursor, state);\n        continue;\n      }\n      if (record === 28 || record === 29) {\n        skipProperty(cursor, record === 29);\n        continue;\n      }\n      if (record === 30 || record === 31 || record === 32) {\n        cursor.readUnsigned();\n        cursor.readString();\n        if (record === 31) cursor.readUnsigned();\n        state.unsupportedRecords.add(record);\n        continue;\n      }\n\n      state.unsupportedRecords.add(record);\n      return;\n    } catch (error) {\n      state.warnings.push(\n        `OASIS 记录在块内 ${recordOffset} 字节处解析失败：${error instanceof Error ? error.message : String(error)}`\n      );\n      return;\n    }\n  }\n}\n\nfunction readPlacement(cursor: OasisCursor, state: OasisState, transformed: boolean): void {\n  state.placementRecordCount += 1;\n  const info = cursor.readByte();\n  if (info & 0x80) {\n    state.modalPlacementCell = info & 0x40 ? referenceName(cursor.readUnsigned()) : cursor.readString();\n  }\n  if (!state.modalPlacementCell) {\n    throw new Error(\"Placement record has no cell reference\");\n  }\n  if (transformed) {\n    if (info & 0x04) cursor.readReal();\n    if (info & 0x02) cursor.readReal();\n  }\n  updateModalPoint(cursor, state.modalPlacement, state.absolute, Boolean(info & 0x20), Boolean(info & 0x10));\n  const repetitions = info & 0x08 ? readRepetition(cursor, state) : [{ x: 0, y: 0 }];\n  for (const offset of repetitions) {\n    state.references.push({\n      ownerCell: state.currentCell,\n      cell: state.modalPlacementCell,\n      x: state.modalPlacement.x + offset.x,\n      y: state.modalPlacement.y + offset.y\n    });\n  }\n}\n\nfunction readText(cursor: OasisCursor, state: OasisState): void {\n  const info = cursor.readByte();\n  if (info & 0x40) {\n    state.modalTextValue = info & 0x20 ? textReference(cursor.readUnsigned()) : cursor.readString();\n  }\n  if (info & 0x01) state.modalTextLayer = cursor.readUnsigned();\n  if (info & 0x02) state.modalTextType = cursor.readUnsigned();\n  updateModalPoint(cursor, state.modalText, state.absolute, Boolean(info & 0x10), Boolean(info & 0x08));\n  const repetitions = info & 0x04 ? readRepetition(cursor, state) : [{ x: 0, y: 0 }];\n  if (!state.modalTextValue) return;\n  for (const offset of repetitions) {\n    state.labels.push({\n      cell: state.currentCell,\n      layer: String(state.modalTextLayer),\n      text: state.modalTextValue,\n      x: state.modalText.x + offset.x,\n      y: state.modalText.y + offset.y\n    });\n  }\n}\n\nfunction readRectangle(cursor: OasisCursor, state: OasisState): void {\n  const info = cursor.readByte();\n  if (info & 0x01) state.modalLayer = cursor.readUnsigned();\n  if (info & 0x02) state.modalDatatype = cursor.readUnsigned();\n  if (info & 0x40) state.modalGeometrySize.x = cursor.readUnsigned();\n  if (info & 0x20) state.modalGeometrySize.y = cursor.readUnsigned();\n  else if (info & 0x80) state.modalGeometrySize.y = state.modalGeometrySize.x;\n  updateModalPoint(cursor, state.modalGeometry, state.absolute, Boolean(info & 0x10), Boolean(info & 0x08));\n  const repetitions = info & 0x04 ? readRepetition(cursor, state) : [{ x: 0, y: 0 }];\n  for (const offset of repetitions) {\n    const x = state.modalGeometry.x + offset.x;\n    const y = state.modalGeometry.y + offset.y;\n    addShape(state, {\n      kind: \"box\",\n      cell: state.currentCell,\n      layer: String(state.modalLayer),\n      datatype: String(state.modalDatatype),\n      points: [\n        [x, y],\n        [x + state.modalGeometrySize.x, y],\n        [x + state.modalGeometrySize.x, y + state.modalGeometrySize.y],\n        [x, y + state.modalGeometrySize.y],\n        [x, y]\n      ]\n    });\n  }\n}\n\nfunction readPolygon(cursor: OasisCursor, state: OasisState): void {\n  const info = cursor.readByte();\n  if (info & 0x01) state.modalLayer = cursor.readUnsigned();\n  if (info & 0x02) state.modalDatatype = cursor.readUnsigned();\n  if (info & 0x20) state.modalPolygon = readPointList(cursor, true);\n  updateModalPoint(cursor, state.modalGeometry, state.absolute, Boolean(info & 0x10), Boolean(info & 0x08));\n  const repetitions = info & 0x04 ? readRepetition(cursor, state) : [{ x: 0, y: 0 }];\n  for (const offset of repetitions) {\n    addShape(state, {\n      kind: \"boundary\",\n      cell: state.currentCell,\n      layer: String(state.modalLayer),\n      datatype: String(state.modalDatatype),\n      points: state.modalPolygon.map((point) => [\n        point.x + state.modalGeometry.x + offset.x,\n        point.y + state.modalGeometry.y + offset.y\n      ])\n    });\n  }\n}\n\nfunction readPath(cursor: OasisCursor, state: OasisState): void {\n  const info = cursor.readByte();\n  if (info & 0x01) state.modalLayer = cursor.readUnsigned();\n  if (info & 0x02) state.modalDatatype = cursor.readUnsigned();\n  if (info & 0x40) state.modalPathWidth = cursor.readUnsigned() * 2;\n  if (info & 0x80) {\n    const extension = cursor.readByte();\n    if ((extension & 0x0c) === 0x0c) cursor.readSigned();\n    if ((extension & 0x03) === 0x03) cursor.readSigned();\n  }\n  if (info & 0x20) state.modalPath = readPointList(cursor, false);\n  updateModalPoint(cursor, state.modalGeometry, state.absolute, Boolean(info & 0x10), Boolean(info & 0x08));\n  const repetitions = info & 0x04 ? readRepetition(cursor, state) : [{ x: 0, y: 0 }];\n  for (const offset of repetitions) {\n    addShape(state, {\n      kind: \"path\",\n      cell: state.currentCell,\n      layer: String(state.modalLayer),\n      datatype: String(state.modalDatatype),\n      width: state.modalPathWidth,\n      points: state.modalPath.map((point) => [\n        point.x + state.modalGeometry.x + offset.x,\n        point.y + state.modalGeometry.y + offset.y\n      ])\n    });\n  }\n}\n\nfunction updateModalPoint(\n  cursor: OasisCursor,\n  modal: Point,\n  absolute: boolean,\n  hasX: boolean,\n  hasY: boolean\n): void {\n  if (hasX) {\n    const value = cursor.readSigned();\n    modal.x = absolute ? value : modal.x + value;\n  }\n  if (hasY) {\n    const value = cursor.readSigned();\n    modal.y = absolute ? value : modal.y + value;\n  }\n}\n\nfunction readPointList(cursor: OasisCursor, closed: boolean): Point[] {\n  const type = cursor.readByte();\n  const count = cursor.readUnsigned();\n  const points: Point[] = [{ x: 0, y: 0 }];\n  let horizontal = type === 0;\n  let accumulated = { x: 0, y: 0 };\n  for (let index = 0; index < count; index += 1) {\n    let delta: Point;\n    if (type === 0 || type === 1) {\n      const value = cursor.readSigned();\n      delta = horizontal ? { x: value, y: 0 } : { x: 0, y: value };\n      horizontal = !horizontal;\n    } else if (type === 2) {\n      delta = readDirectionalDelta(cursor, 2);\n    } else if (type === 3) {\n      delta = readDirectionalDelta(cursor, 3);\n    } else {\n      delta = readGeneralDelta(cursor);\n      if (type === 5) {\n        accumulated = { x: accumulated.x + delta.x, y: accumulated.y + delta.y };\n        delta = accumulated;\n      }\n    }\n    const previous = points[points.length - 1];\n    points.push({ x: previous.x + delta.x, y: previous.y + delta.y });\n  }\n  if (closed && points.length > 2) {\n    points.push({ ...points[0] });\n  }\n  return points;\n}\n\nfunction readDirectionalDelta(cursor: OasisCursor, directionBits: 2 | 3): Point {\n  const { value, bits } = readPackedInteger(cursor, directionBits);\n  const directions: Point[] = [\n    { x: 1, y: 0 },\n    { x: 0, y: 1 },\n    { x: -1, y: 0 },\n    { x: 0, y: -1 },\n    { x: 1, y: 1 },\n    { x: -1, y: 1 },\n    { x: -1, y: -1 },\n    { x: 1, y: -1 }\n  ];\n  const direction = directions[bits] || { x: 0, y: 0 };\n  return { x: direction.x * value, y: direction.y * value };\n}\n\nfunction readGeneralDelta(cursor: OasisCursor): Point {\n  const peek = cursor.bytes[cursor.offset];\n  if ((peek & 0x01) === 0) {\n    const packed = readPackedInteger(cursor, 4);\n    const direction = (packed.bits >> 1) & 0x07;\n    const vectors: Point[] = [\n      { x: 1, y: 0 },\n      { x: 0, y: 1 },\n      { x: -1, y: 0 },\n      { x: 0, y: -1 },\n      { x: 1, y: 1 },\n      { x: -1, y: 1 },\n      { x: -1, y: -1 },\n      { x: 1, y: -1 }\n    ];\n    const vector = vectors[direction];\n    return { x: vector.x * packed.value, y: vector.y * packed.value };\n  }\n  const x = readPackedInteger(cursor, 2);\n  const y = readPackedInteger(cursor, 1);\n  return {\n    x: x.bits & 0x02 ? -x.value : x.value,\n    y: y.bits & 0x01 ? -y.value : y.value\n  };\n}\n\nfunction readPackedInteger(cursor: OasisCursor, skipBits: number): { value: number; bits: number } {\n  const first = cursor.readByte();\n  let value = (first & 0x7f) >> skipBits;\n  let shift = 7 - skipBits;\n  let byte = first;\n  while (byte & 0x80) {\n    byte = cursor.readByte();\n    value += (byte & 0x7f) * 2 ** shift;\n    shift += 7;\n  }\n  return { value, bits: first & ((1 << skipBits) - 1) };\n}\n\nfunction readRepetition(cursor: OasisCursor, state: OasisState): Point[] {\n  const type = cursor.readByte();\n  if (type === 0) return state.modalRepetition.map((point) => ({ ...point }));\n  const result: Point[] = [{ x: 0, y: 0 }];\n  if (type === 1) {\n    const columns = 2 + cursor.readUnsigned();\n    const rows = 2 + cursor.readUnsigned();\n    const dx = cursor.readUnsigned();\n    const dy = cursor.readUnsigned();\n    for (let column = 0; column < columns; column += 1) {\n      for (let row = 0; row < rows; row += 1) {\n        if (column || row) result.push({ x: column * dx, y: row * dy });\n      }\n    }\n  } else if (type === 2 || type === 3) {\n    const count = 2 + cursor.readUnsigned();\n    const spacing = cursor.readUnsigned();\n    for (let index = 1; index < count; index += 1) {\n      result.push(type === 2 ? { x: index * spacing, y: 0 } : { x: 0, y: index * spacing });\n    }\n  } else if (type >= 4 && type <= 7) {\n    const count = 1 + cursor.readUnsigned();\n    const grid = type === 5 || type === 7 ? cursor.readUnsigned() : 1;\n    let value = 0;\n    for (let index = 0; index < count; index += 1) {\n      value += grid * cursor.readUnsigned();\n      result.push(type <= 5 ? { x: value, y: 0 } : { x: 0, y: value });\n    }\n  } else if (type === 8) {\n    const columns = 2 + cursor.readUnsigned();\n    const rows = 2 + cursor.readUnsigned();\n    const column = readGeneralDelta(cursor);\n    const row = readGeneralDelta(cursor);\n    for (let x = 0; x < columns; x += 1) {\n      for (let y = 0; y < rows; y += 1) {\n        if (x || y) result.push({ x: x * column.x + y * row.x, y: x * column.y + y * row.y });\n      }\n    }\n  } else if (type === 9) {\n    const count = 2 + cursor.readUnsigned();\n    const vector = readGeneralDelta(cursor);\n    for (let index = 1; index < count; index += 1) {\n      result.push({ x: index * vector.x, y: index * vector.y });\n    }\n  } else if (type === 10 || type === 11) {\n    const count = 1 + cursor.readUnsigned();\n    const grid = type === 11 ? cursor.readUnsigned() : 1;\n    let value = { x: 0, y: 0 };\n    for (let index = 0; index < count; index += 1) {\n      const delta = readGeneralDelta(cursor);\n      value = { x: value.x + grid * delta.x, y: value.y + grid * delta.y };\n      result.push({ ...value });\n    }\n  } else {\n    throw new Error(`Unsupported OASIS repetition type ${type}`);\n  }\n  state.modalRepetition = result.slice(0, MAX_REPETITIONS);\n  return state.modalRepetition.map((point) => ({ ...point }));\n}\n\nfunction skipProperty(cursor: OasisCursor, useModalValues: boolean): void {\n  const info = useModalValues ? 0x08 : cursor.readByte();\n  if (info & 0x04) {\n    if (info & 0x02) cursor.readUnsigned();\n    else cursor.readString();\n  }\n  if (info & 0x08) return;\n  let count = info >> 4;\n  if (count === 15) count = cursor.readUnsigned();\n  for (let index = 0; index < count; index += 1) {\n    const type = cursor.readByte();\n    if (type <= 7) cursor.readReal(type);\n    else if (type === 8) cursor.readUnsigned();\n    else if (type === 9) cursor.readSigned();\n    else if (type >= 10 && type <= 12) cursor.readString();\n    else if (type >= 13 && type <= 15) cursor.readUnsigned();\n    else throw new Error(`Unsupported OASIS property type ${type}`);\n  }\n}\n\nfunction addShape(state: OasisState, shape: OasisShape): void {\n  if (state.shapes.length >= MAX_LAYOUT_SHAPES) {\n    state.truncated = true;\n    return;\n  }\n  state.shapes.push(shape);\n}\n\nfunction resolveOasisNames(state: OasisState): void {\n  for (const shape of state.shapes) {\n    if (shape.cell) shape.cell = resolveName(shape.cell, state.cellNames);\n  }\n  for (const label of state.labels) {\n    if (label.cell) label.cell = resolveName(label.cell, state.cellNames);\n    label.text = resolveText(label.text, state.textNames);\n  }\n  for (const reference of state.references) {\n    if (reference.ownerCell) reference.ownerCell = resolveName(reference.ownerCell, state.cellNames);\n    reference.cell = resolveName(reference.cell, state.cellNames);\n  }\n}\n\nfunction referenceName(index: number): string {\n  return `@cell:${index}`;\n}\n\nfunction textReference(index: number): string {\n  return `@text:${index}`;\n}\n\nfunction resolveName(value: string, names: Map<number, string>): string {\n  const match = /^@cell:(\\d+)$/.exec(value);\n  return match ? names.get(Number(match[1])) || `CELL_${match[1]}` : value;\n}\n\nfunction resolveText(value: string, names: Map<number, string>): string {\n  const match = /^@text:(\\d+)$/.exec(value);\n  return match ? names.get(Number(match[1])) || `TEXT_${match[1]}` : value;\n}\n\nfunction unique(values: string[]): string[] {\n  return [...new Set(values.filter(Boolean))];\n}\n","import type { PreviewContext, PreviewInstance, PreviewPlugin, PreviewSize } from \"../types\";\nimport { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport { resolveFormat } from \"./utils\";\n\nconst modelExtensions = new Set([\n  \"gltf\",\n  \"glb\",\n  \"obj\",\n  \"stl\",\n  \"fbx\",\n  \"dae\",\n  \"ply\",\n  \"3mf\",\n  \"3ds\",\n  \"usd\",\n  \"usda\",\n  \"usdc\",\n  \"usdz\",\n  \"wrl\",\n  \"vrml\"\n]);\nconst modelMimeTypes = new Set([\n  \"model/gltf+json\",\n  \"model/gltf-binary\",\n  \"model/stl\",\n  \"model/obj\",\n  \"model/vnd.collada+xml\",\n  \"model/3mf\",\n  \"model/3ds\",\n  \"model/vnd.usd\",\n  \"model/vnd.usdz+zip\",\n  \"model/vrml\",\n  \"application/sla\",\n  \"application/vnd.ms-pki.stl\",\n  \"application/ply\",\n  \"application/vnd.autodesk.fbx\"\n]);\nconst modelMimeFormatMap: Record<string, string> = {\n  \"model/gltf+json\": \"gltf\",\n  \"model/gltf-binary\": \"glb\",\n  \"model/stl\": \"stl\",\n  \"model/obj\": \"obj\",\n  \"model/vnd.collada+xml\": \"dae\",\n  \"model/3mf\": \"3mf\",\n  \"model/3ds\": \"3ds\",\n  \"model/vnd.usd\": \"usd\",\n  \"model/vnd.usdz+zip\": \"usdz\",\n  \"model/vrml\": \"wrl\",\n  \"application/sla\": \"stl\",\n  \"application/vnd.ms-pki.stl\": \"stl\",\n  \"application/ply\": \"ply\",\n  \"application/vnd.autodesk.fbx\": \"fbx\"\n};\nconst textLikeExtensions = new Set([\"json\", \"txt\", \"md\", \"xml\", \"yaml\", \"yml\", \"csv\", \"tsv\", \"js\", \"ts\", \"tsx\", \"jsx\", \"html\", \"css\"]);\n\nexport function model3dPlugin(): PreviewPlugin {\n  return {\n    name: \"model3d\",\n    match(file) {\n      return (\n        modelExtensions.has(file.extension) ||\n        (modelMimeTypes.has(file.mimeType) && (file.extension === \"\" || file.extension === \"bin\" || !textLikeExtensions.has(file.extension)))\n      );\n    },\n    async render(ctx) {\n      const THREE = await import(\"three\");\n      const { OrbitControls } = await import(\"three/examples/jsm/controls/OrbitControls.js\");\n      const url = createObjectUrl(ctx.file);\n      const isExternal = Boolean(ctx.file.url);\n\n      const stage = document.createElement(\"div\");\n      stage.className = \"ofv-model-stage\";\n      ctx.viewport.append(stage);\n\n      const scene = new THREE.Scene();\n      scene.background = new THREE.Color(0xf3f4f6);\n\n      const camera = new THREE.PerspectiveCamera(45, 1, 0.1, 10000);\n      camera.position.set(2.5, 2, 3.5);\n\n      let renderer: import(\"three\").WebGLRenderer;\n      try {\n        renderer = new THREE.WebGLRenderer({ antialias: true });\n      } catch {\n        stage.remove();\n        return renderModelFallback(ctx, url, isExternal, \"当前浏览器或设备不支持 WebGL，无法直接渲染 3D 模型。\");\n      }\n      renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\n      renderer.outputColorSpace = THREE.SRGBColorSpace;\n      renderer.toneMapping = THREE.ACESFilmicToneMapping;\n      renderer.toneMappingExposure = 1.08;\n      stage.append(renderer.domElement);\n\n      const controls = new OrbitControls(camera, renderer.domElement);\n      controls.enableDamping = true;\n\n      scene.add(new THREE.HemisphereLight(0xffffff, 0x94a3b8, 2.8));\n      const directional = new THREE.DirectionalLight(0xffffff, 2);\n      directional.position.set(4, 6, 5);\n      scene.add(directional);\n      scene.add(new THREE.GridHelper(10, 10, 0xcbd5e1, 0xe5e7eb));\n\n      const extension = resolveFormat(ctx.file, modelMimeFormatMap);\n      const modelUrl = resolveModelUrl(extension, url, ctx.file.url);\n      const loaded = await loadModel(extension, modelUrl, THREE).catch(() => undefined);\n      if (!loaded) {\n        controls.dispose();\n        renderer.dispose();\n        stage.remove();\n        return renderModelFallback(ctx, url, isExternal, \"无法解析当前 3D 模型内容。\");\n      }\n      if (loaded.message) {\n        const message = document.createElement(\"div\");\n        message.className = \"ofv-model-message\";\n        message.textContent = loaded.message;\n        stage.append(message);\n      }\n      const object = loaded.object;\n      const initialRotation = {\n        x: object.rotation?.x ?? 0,\n        y: object.rotation?.y ?? 0,\n        z: object.rotation?.z ?? 0\n      };\n      scene.add(object);\n      const initialFrame = frameObject(object, camera, controls, THREE);\n      const measurement = measureObject(object, THREE);\n      stage.append(createMeasurementPanel(measurement));\n      stage.append(createMaterialPanel(collectMaterialStats(object)));\n\n      let animationFrame = 0;\n      const animate = () => {\n        controls.update();\n        renderer.render(scene, camera);\n        animationFrame = window.requestAnimationFrame(animate);\n      };\n      animate();\n\n      const resize = (size: PreviewSize) => {\n        const width = Math.max(1, size.width);\n        const height = Math.max(1, size.height);\n        camera.aspect = width / height;\n        camera.updateProjectionMatrix();\n        renderer.setSize(width, height, false);\n      };\n      resize(ctx.size);\n      const updateToolbarZoom = () => {\n        const currentDistance = vectorDistance(camera.position, controls.target);\n        const initialDistance = vectorDistance(initialFrame.cameraPosition, initialFrame.target);\n        ctx.toolbar?.setZoom(initialDistance > 0 ? initialDistance / currentDistance : undefined);\n      };\n      updateToolbarZoom();\n\n      return {\n        canCommand(command) {\n          return (\n            command === \"zoom-in\" ||\n            command === \"zoom-out\" ||\n            command === \"zoom-reset\" ||\n            command === \"rotate-right\" ||\n            command === \"rotate-left\"\n          );\n        },\n        command(command) {\n          if (command === \"zoom-in\" || command === \"zoom-out\") {\n            const factor = command === \"zoom-in\" ? 0.82 : 1.18;\n            camera.position.sub(controls.target).multiplyScalar(factor).add(controls.target);\n            camera.updateProjectionMatrix();\n            controls.update();\n            updateToolbarZoom();\n            return true;\n          }\n          if (command === \"zoom-reset\") {\n            camera.position.copy(initialFrame.cameraPosition);\n            controls.target.copy(initialFrame.target);\n            if (object.rotation) {\n              object.rotation.set?.(initialRotation.x, initialRotation.y, initialRotation.z);\n              object.rotation.x = initialRotation.x;\n              object.rotation.y = initialRotation.y;\n              object.rotation.z = initialRotation.z;\n            }\n            camera.near = initialFrame.near;\n            camera.far = initialFrame.far;\n            camera.updateProjectionMatrix();\n            controls.update();\n            updateToolbarZoom();\n            return true;\n          }\n          if (command === \"rotate-right\" || command === \"rotate-left\") {\n            object.rotateY(command === \"rotate-right\" ? Math.PI / 8 : -Math.PI / 8);\n            return true;\n          }\n          return false;\n        },\n        resize,\n        destroy() {\n          ctx.toolbar?.setZoom(undefined);\n          window.cancelAnimationFrame(animationFrame);\n          controls.dispose();\n          renderer.dispose();\n          disposeObject(object, THREE);\n          stage.remove();\n          revokeObjectUrl(url, isExternal);\n        }\n      };\n    }\n  };\n}\n\nfunction vectorDistance(\n  a: { x: number; y: number; z: number; distanceTo?: (value: { x: number; y: number; z: number }) => number },\n  b: { x: number; y: number; z: number }\n): number {\n  if (typeof a.distanceTo === \"function\") {\n    return a.distanceTo(b);\n  }\n  return Math.hypot(a.x - b.x, a.y - b.y, a.z - b.z);\n}\n\nfunction renderModelFallback(\n  ctx: PreviewContext,\n  url: string,\n  isExternal: boolean,\n  message: string\n): PreviewInstance {\n  const panel = document.createElement(\"div\");\n  panel.className = \"ofv-fallback\";\n\n  const title = document.createElement(\"strong\");\n  title.textContent = \"3D 预览不可用\";\n\n  const detail = document.createElement(\"span\");\n  detail.textContent = `${message} ${ctx.file.name}`;\n\n  const download = document.createElement(\"a\");\n  download.href = url;\n  download.download = ctx.file.name;\n  download.textContent = \"下载文件\";\n\n  panel.append(title, detail, download);\n  ctx.viewport.classList.add(\"ofv-center\");\n  ctx.viewport.append(panel);\n\n  return {\n    canCommand() {\n      return false;\n    },\n    destroy() {\n      ctx.viewport.classList.remove(\"ofv-center\");\n      panel.remove();\n      revokeObjectUrl(url, isExternal);\n    }\n  };\n}\n\nfunction resolveModelUrl(extension: string, objectUrl: string, sourceUrl?: string): string {\n  if (extension === \"gltf\" && sourceUrl) {\n    return sourceUrl;\n  }\n  return objectUrl;\n}\n\nasync function loadModel(\n  extension: string,\n  url: string,\n  THREE: typeof import(\"three\")\n): Promise<{ object: import(\"three\").Object3D; message?: string }> {\n  if (extension === \"gltf\" || extension === \"glb\") {\n    const { GLTFLoader } = await import(\"three/examples/jsm/loaders/GLTFLoader.js\");\n    const gltf = await new GLTFLoader().loadAsync(url);\n    return { object: gltf.scene };\n  }\n  if (extension === \"obj\") {\n    const { OBJLoader } = await import(\"three/examples/jsm/loaders/OBJLoader.js\");\n    return { object: await new OBJLoader().loadAsync(url) };\n  }\n  if (extension === \"fbx\") {\n    const { FBXLoader } = await import(\"three/examples/jsm/loaders/FBXLoader.js\");\n    return { object: await new FBXLoader().loadAsync(url) };\n  }\n  if (extension === \"dae\") {\n    const { ColladaLoader } = await import(\"three/examples/jsm/loaders/ColladaLoader.js\");\n    const collada = await new ColladaLoader().loadAsync(url);\n    if (!collada) {\n      throw new Error(\"Collada loader returned no scene.\");\n    }\n    return { object: collada.scene };\n  }\n  if (extension === \"stl\") {\n    const { STLLoader } = await import(\"three/examples/jsm/loaders/STLLoader.js\");\n    const geometry = await new STLLoader().loadAsync(url);\n    const material = new THREE.MeshStandardMaterial({ color: 0x64748b, roughness: 0.55 });\n    return { object: new THREE.Mesh(geometry, material) };\n  }\n  if (extension === \"ply\") {\n    const { PLYLoader } = await import(\"three/examples/jsm/loaders/PLYLoader.js\");\n    const geometry = await new PLYLoader().loadAsync(url);\n    const material = new THREE.MeshStandardMaterial({ color: 0x64748b, roughness: 0.55 });\n    return { object: new THREE.Mesh(geometry, material) };\n  }\n  if (extension === \"3mf\") {\n    const { ThreeMFLoader } = await import(\"three/examples/jsm/loaders/3MFLoader.js\");\n    return { object: await new ThreeMFLoader().loadAsync(url) };\n  }\n  if (extension === \"3ds\") {\n    const { TDSLoader } = await import(\"three/examples/jsm/loaders/TDSLoader.js\");\n    return { object: await new TDSLoader().loadAsync(url) };\n  }\n  if (extension === \"usd\" || extension === \"usda\" || extension === \"usdc\" || extension === \"usdz\") {\n    const { USDLoader } = await import(\"three/examples/jsm/loaders/USDLoader.js\");\n    return { object: await new USDLoader().loadAsync(url) };\n  }\n  if (extension === \"wrl\" || extension === \"vrml\") {\n    const { VRMLLoader } = await import(\"three/examples/jsm/loaders/VRMLLoader.js\");\n    return { object: await new VRMLLoader().loadAsync(url) };\n  }\n  const group = new THREE.Group();\n  const geometry = new THREE.BoxGeometry(1, 1, 1);\n  const material = new THREE.MeshStandardMaterial({ color: 0x64748b });\n  const mesh = new THREE.Mesh(geometry, material);\n  group.add(mesh);\n  return {\n    object: group,\n    message: `.${extension} 已识别为 3D 格式，当前内置渲染优先支持 gltf/glb/obj/stl/fbx/dae/ply/3mf/3ds/usd/usdz/vrml。`\n  };\n}\n\nfunction frameObject(\n  object: import(\"three\").Object3D,\n  camera: import(\"three\").PerspectiveCamera,\n  controls: { target: import(\"three\").Vector3; update: () => void },\n  THREE: typeof import(\"three\")\n): {\n  cameraPosition: import(\"three\").Vector3;\n  target: import(\"three\").Vector3;\n  near: number;\n  far: number;\n} {\n  const box = new THREE.Box3().setFromObject(object);\n  const size = box.getSize(new THREE.Vector3());\n  const center = box.getCenter(new THREE.Vector3());\n  const maxSize = Math.max(size.x, size.y, size.z, 1);\n  const distance = maxSize * 2.4;\n  camera.position.set(center.x + distance, center.y + distance * 0.7, center.z + distance);\n  camera.near = Math.max(distance / 1000, 0.01);\n  camera.far = distance * 1000;\n  camera.updateProjectionMatrix();\n  controls.target.copy(center);\n  controls.update();\n  return {\n    cameraPosition: camera.position.clone(),\n    target: controls.target.clone(),\n    near: camera.near,\n    far: camera.far\n  };\n}\n\ntype ModelMeasurement = {\n  width: number;\n  height: number;\n  depth: number;\n  diagonal: number;\n  center: { x: number; y: number; z: number };\n};\n\ntype MaterialStats = {\n  meshes: number;\n  materials: number;\n  textures: number;\n  slots: string[];\n  names: string[];\n};\n\nfunction measureObject(object: import(\"three\").Object3D, THREE: typeof import(\"three\")): ModelMeasurement {\n  const box = new THREE.Box3().setFromObject(object);\n  const size = box.getSize(new THREE.Vector3());\n  const center = box.getCenter(new THREE.Vector3());\n  return {\n    width: size.x,\n    height: size.y,\n    depth: size.z,\n    diagonal: Math.sqrt(size.x ** 2 + size.y ** 2 + size.z ** 2),\n    center: { x: center.x, y: center.y, z: center.z }\n  };\n}\n\nfunction createMeasurementPanel(measurement: ModelMeasurement): HTMLElement {\n  const panel = document.createElement(\"div\");\n  panel.className = \"ofv-model-measure\";\n  panel.hidden = true;\n  panel.setAttribute(\"aria-hidden\", \"true\");\n  panel.style.display = \"none\";\n  const title = document.createElement(\"strong\");\n  title.textContent = \"模型测量\";\n  const list = document.createElement(\"dl\");\n  appendMeasure(list, \"宽\", measurement.width);\n  appendMeasure(list, \"高\", measurement.height);\n  appendMeasure(list, \"深\", measurement.depth);\n  appendMeasure(list, \"对角线\", measurement.diagonal);\n  appendMeasure(\n    list,\n    \"中心\",\n    `${formatMeasure(measurement.center.x)}, ${formatMeasure(measurement.center.y)}, ${formatMeasure(measurement.center.z)}`\n  );\n  panel.append(title, list);\n  return panel;\n}\n\nfunction appendMeasure(list: HTMLDListElement, label: string, value: number | string): void {\n  const term = document.createElement(\"dt\");\n  term.textContent = label;\n  const detail = document.createElement(\"dd\");\n  detail.textContent = typeof value === \"number\" ? formatMeasure(value) : value;\n  list.append(term, detail);\n}\n\nfunction formatMeasure(value: number): string {\n  if (!Number.isFinite(value)) {\n    return \"-\";\n  }\n  const rounded = Math.abs(value) >= 100 ? value.toFixed(1) : value.toFixed(3);\n  return rounded.replace(/\\.?0+$/, \"\");\n}\n\nfunction collectMaterialStats(object: import(\"three\").Object3D): MaterialStats {\n  const materials = new Set<import(\"three\").Material>();\n  const textures = new Set<unknown>();\n  const slots = new Set<string>();\n  const names = new Set<string>();\n  let meshes = 0;\n\n  object.traverse((child) => {\n    const mesh = child as import(\"three\").Mesh;\n    if (!mesh.geometry || !mesh.material) {\n      return;\n    }\n    meshes += 1;\n    for (const material of normalizeMaterials(mesh.material)) {\n      materials.add(material);\n      if (material.name) {\n        names.add(material.name);\n      }\n      for (const slot of textureSlots) {\n        const texture = (material as unknown as Record<string, unknown>)[slot];\n        if (texture) {\n          textures.add(texture);\n          slots.add(slot);\n        }\n      }\n    }\n  });\n\n  return {\n    meshes,\n    materials: materials.size,\n    textures: textures.size,\n    slots: [...slots],\n    names: [...names].slice(0, 6)\n  };\n}\n\nfunction createMaterialPanel(stats: MaterialStats): HTMLElement {\n  const panel = document.createElement(\"div\");\n  panel.className = \"ofv-model-materials\";\n  panel.hidden = true;\n  panel.setAttribute(\"aria-hidden\", \"true\");\n  panel.style.display = \"none\";\n  const title = document.createElement(\"strong\");\n  title.textContent = \"材质贴图\";\n\n  const list = document.createElement(\"dl\");\n  appendMaterialStat(list, \"网格\", stats.meshes);\n  appendMaterialStat(list, \"材质\", stats.materials);\n  appendMaterialStat(list, \"贴图\", stats.textures);\n  appendMaterialStat(list, \"槽位\", stats.slots.length > 0 ? stats.slots.join(\", \") : \"-\");\n  if (stats.names.length > 0) {\n    appendMaterialStat(list, \"名称\", stats.names.join(\", \"));\n  }\n\n  panel.append(title, list);\n  return panel;\n}\n\nfunction appendMaterialStat(list: HTMLDListElement, label: string, value: number | string): void {\n  const term = document.createElement(\"dt\");\n  term.textContent = label;\n  const detail = document.createElement(\"dd\");\n  detail.textContent = String(value);\n  list.append(term, detail);\n}\n\nfunction disposeObject(object: import(\"three\").Object3D, THREE: typeof import(\"three\")): void {\n  object.traverse((child) => {\n    const mesh = child as import(\"three\").Mesh;\n    if (mesh.geometry) {\n      mesh.geometry.dispose();\n    }\n    const material = mesh.material;\n    for (const item of normalizeMaterials(material)) {\n      disposeMaterialTextures(item);\n      item.dispose();\n    }\n  });\n}\n\nconst textureSlots = [\n  \"map\",\n  \"aoMap\",\n  \"alphaMap\",\n  \"bumpMap\",\n  \"displacementMap\",\n  \"emissiveMap\",\n  \"envMap\",\n  \"lightMap\",\n  \"metalnessMap\",\n  \"normalMap\",\n  \"roughnessMap\"\n];\n\nfunction normalizeMaterials(\n  material: import(\"three\").Material | import(\"three\").Material[] | undefined\n): import(\"three\").Material[] {\n  if (!material) {\n    return [];\n  }\n  return Array.isArray(material) ? material : [material];\n}\n\nfunction disposeMaterialTextures(material: import(\"three\").Material): void {\n  for (const slot of textureSlots) {\n    const texture = (material as unknown as Record<string, { dispose?: () => void } | undefined>)[slot];\n    texture?.dispose?.();\n  }\n}\n","/// <reference path=\"../shims-gis.d.ts\" />\nimport type { PreviewPlugin, PreviewFile } from \"../types\";\nimport { readArrayBuffer, resolveFormat } from \"./utils\";\n\nconst gisExtensions = new Set([\"geojson\", \"topojson\", \"kml\", \"kmz\", \"gpx\", \"shp\"]);\nconst gisMimeFormatMap: Record<string, string> = {\n  \"application/geo+json\": \"geojson\",\n  \"application/vnd.geo+json\": \"geojson\",\n  \"application/topo+json\": \"topojson\",\n  \"application/vnd.google-earth.kml+xml\": \"kml\",\n  \"application/vnd.google-earth.kmz\": \"kmz\",\n  \"application/gpx+xml\": \"gpx\"\n};\n\nfunction loadLeafletCss(): Promise<void> {\n  const id = \"ofv-leaflet-css\";\n  if (document.getElementById(id)) {\n    return Promise.resolve();\n  }\n  return new Promise((resolve) => {\n    const link = document.createElement(\"link\");\n    let settled = false;\n    const done = () => {\n      if (!settled) {\n        settled = true;\n        resolve();\n      }\n    };\n    link.id = id;\n    link.rel = \"stylesheet\";\n    link.href = \"https://cdn.jsdelivr.net/npm/leaflet@1.9.4/dist/leaflet.css\";\n    link.onload = done;\n    link.onerror = done;\n    document.head.appendChild(link);\n    window.setTimeout(done, 0);\n  });\n}\n\nexport function gisPlugin(): PreviewPlugin {\n  return {\n    name: \"gis\",\n    match(file) {\n      return gisExtensions.has(resolveGisFormat(file)) || Boolean(gisMimeFormatMap[file.mimeType]);\n    },\n    async render(ctx) {\n      // 1. Load Leaflet CSS and dynamic imports\n      await loadLeafletCss();\n\n      const [L, topojson, toGeoJSON, shpjs, JSZip] = await Promise.all([\n        import(\"leaflet\"),\n        import(\"topojson-client\"),\n        import(\"@mapbox/togeojson\"),\n        import(\"shpjs\"),\n        import(\"jszip\")\n      ]);\n\n      const Leaflet = L.default || L;\n      const topojsonClient = topojson.default || topojson;\n      const togeojsonLib = toGeoJSON.default || toGeoJSON;\n      const shpLib = shpjs.default || shpjs;\n      const JSZipLib = JSZip.default || JSZip;\n\n      // Fix default marker icon paths using inline SVG to avoid asset 404 errors\n      const DefaultIcon = Leaflet.icon({\n        iconUrl: \"data:image/svg+xml;charset=utf-8,\" + encodeURIComponent(`\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"32\" height=\"32\">\n            <path fill=\"#3b82f6\" d=\"M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\"/>\n          </svg>\n        `),\n        iconSize: [25, 41],\n        iconAnchor: [12, 41],\n        popupAnchor: [1, -34],\n        shadowUrl: \"data:image/svg+xml;charset=utf-8,\" + encodeURIComponent(`\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"32\" height=\"32\">\n            <ellipse cx=\"12\" cy=\"20\" rx=\"6\" ry=\"2\" fill=\"#000000\" opacity=\"0.2\"/>\n          </svg>\n        `),\n        shadowSize: [41, 41],\n        shadowAnchor: [12, 41]\n      });\n      Leaflet.Marker.prototype.options.icon = DefaultIcon;\n\n      // 2. Read file as ArrayBuffer and Parse to GeoJSON\n      const buffer = await readArrayBuffer(ctx.file);\n      const geojson = await parseToGeoJson(\n        ctx.file,\n        buffer,\n        togeojsonLib,\n        topojsonClient,\n        shpLib,\n        JSZipLib\n      ).catch((error: unknown) => {\n        const fallback = createGisFallback(\"GIS 数据解析失败\", normalizeGisError(error, ctx.file.name));\n        ctx.viewport.classList.add(\"ofv-center\");\n        ctx.viewport.append(fallback);\n        return { fallback };\n      });\n\n      if (isGisFallback(geojson)) {\n        return {\n          destroy() {\n            ctx.viewport.classList.remove(\"ofv-center\");\n            geojson.fallback.remove();\n          }\n        };\n      }\n\n      // 3. Render Leaflet Map\n      const wrapper = document.createElement(\"div\");\n      wrapper.className = \"ofv-gis-viewer\";\n      const summary = summarizeGeoJson(geojson);\n      wrapper.append(createGisSummary(summary));\n      ctx.viewport.appendChild(wrapper);\n\n      const mapContainer = document.createElement(\"div\");\n      mapContainer.className = \"ofv-map-stage\";\n      wrapper.appendChild(mapContainer);\n      if (summary.features === 0) {\n        mapContainer.append(createEmptyMapState());\n      }\n\n      const map = Leaflet.map(mapContainer).setView([0, 0], 2);\n      let toolbarZoom = 1;\n      const updateToolbarZoom = () => {\n        ctx.toolbar?.setZoom(toolbarZoom);\n      };\n      updateToolbarZoom();\n\n      Leaflet.tileLayer(\"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\", {\n        attribution: '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'\n      }).addTo(map);\n\n      // Render GeoJSON elements with premium blue color styles\n      const geojsonLayer = Leaflet.geoJSON(geojson, {\n        style: () => ({\n          className: \"ofv-map-feature\",\n          color: \"#e11d48\",\n          weight: 2,\n          opacity: 0.92,\n          fillColor: \"#fb923c\",\n          fillOpacity: 0.3,\n          lineCap: \"round\",\n          lineJoin: \"round\"\n        }),\n        pointToLayer: (feature: any, latlng: any) => {\n          return Leaflet.circleMarker(latlng, {\n            className: \"ofv-map-feature ofv-map-point\",\n            radius: 7,\n            fillColor: \"#e11d48\",\n            color: \"#ffffff\",\n            weight: 2.5,\n            opacity: 1,\n            fillOpacity: 0.9\n          });\n        },\n        onEachFeature: (feature: any, layer: any) => {\n          const label = feature.properties?.name || feature.properties?.title || feature.properties?.label;\n          if (label) {\n            layer.bindTooltip?.(String(label), {\n              className: \"ofv-map-tooltip\",\n              direction: \"top\",\n              sticky: true\n            });\n          }\n          layer.on?.({\n            mouseover(event: any) {\n              event.target?.setStyle?.({\n                weight: 4,\n                opacity: 1,\n                fillOpacity: 0.4\n              });\n              event.target?.bringToFront?.();\n            },\n            mouseout(event: any) {\n              geojsonLayer.resetStyle?.(event.target);\n            }\n          });\n          if (feature.properties) {\n            const props = feature.properties;\n            const keys = Object.keys(props);\n            if (keys.length > 0) {\n              const popupContent = document.createElement(\"div\");\n              popupContent.className = \"ofv-map-popup\";\n\n              const popupTitle = document.createElement(\"h4\");\n              popupTitle.textContent = \"属性信息\";\n              popupContent.appendChild(popupTitle);\n\n              const table = document.createElement(\"table\");\n              table.className = \"ofv-map-popup-table\";\n\n              for (const key of keys) {\n                const val = props[key];\n                if (val === null || val === undefined) continue;\n\n                const row = document.createElement(\"tr\");\n                const cellKey = document.createElement(\"td\");\n                cellKey.className = \"ofv-map-popup-key\";\n                cellKey.textContent = key;\n\n                const cellVal = document.createElement(\"td\");\n                cellVal.className = \"ofv-map-popup-val\";\n                cellVal.textContent = typeof val === \"object\" ? JSON.stringify(val) : String(val);\n\n                row.append(cellKey, cellVal);\n                table.appendChild(row);\n              }\n\n              popupContent.appendChild(table);\n              layer.bindPopup(popupContent);\n            }\n          }\n        }\n      }).addTo(map);\n\n      // Zoom map to dataset bounds\n      try {\n        const bounds = geojsonLayer.getBounds();\n        if (bounds.isValid()) {\n          map.fitBounds(bounds, { padding: [20, 20] });\n          map.invalidateSize();\n        }\n      } catch (e) {\n        console.warn(\"Could not fit bounds for GeoJSON data:\", e);\n      }\n\n      const resizeTimers = [0, 80, 240].map((delay) => window.setTimeout(() => {\n        map.invalidateSize();\n        updateToolbarZoom();\n      }, delay));\n\n      return {\n        canCommand(command) {\n          return command === \"zoom-in\" || command === \"zoom-out\" || command === \"zoom-reset\";\n        },\n        command(command) {\n          if (command === \"zoom-in\") {\n            map.zoomIn?.();\n            toolbarZoom = Math.min(3, Number((toolbarZoom + 0.25).toFixed(2)));\n            updateToolbarZoom();\n            return true;\n          }\n          if (command === \"zoom-out\") {\n            map.zoomOut?.();\n            toolbarZoom = Math.max(0.25, Number((toolbarZoom - 0.25).toFixed(2)));\n            updateToolbarZoom();\n            return true;\n          }\n          if (command === \"zoom-reset\") {\n            toolbarZoom = 1;\n            map.setView([0, 0], 2);\n            try {\n              const bounds = geojsonLayer.getBounds();\n              if (bounds.isValid()) {\n                map.fitBounds(bounds, { padding: [20, 20] });\n              }\n            } catch {\n              // Keep the neutral world view when bounds are unavailable.\n            }\n            map.invalidateSize();\n            updateToolbarZoom();\n            return true;\n          }\n          return false;\n        },\n        resize() {\n          map.invalidateSize();\n          updateToolbarZoom();\n        },\n        destroy() {\n          resizeTimers.forEach((timer) => window.clearTimeout(timer));\n          ctx.toolbar?.setZoom(undefined);\n          map.remove();\n          wrapper.remove();\n        }\n      };\n    }\n  };\n}\n\nfunction createGisFallback(titleText: string, detailText: string): HTMLElement {\n  const fallback = document.createElement(\"div\");\n  fallback.className = \"ofv-fallback\";\n  const title = document.createElement(\"strong\");\n  title.textContent = titleText;\n  const detail = document.createElement(\"span\");\n  detail.textContent = detailText;\n  fallback.append(title, detail);\n  return fallback;\n}\n\nfunction normalizeGisError(error: unknown, fileName: string): string {\n  const message = error instanceof Error ? error.message : String(error || \"\");\n  return message ? `${fileName}: ${message}` : `${fileName}: 文件内容无法转换为地图数据。`;\n}\n\nfunction isGisFallback(value: unknown): value is { fallback: HTMLElement } {\n  return typeof value === \"object\" && value !== null && \"fallback\" in value;\n}\n\ntype GisSummary = {\n  features: number;\n  geometryCounts: Map<string, number>;\n  propertyKeys: Set<string>;\n  bounds?: [number, number, number, number];\n};\n\nfunction createGisSummary(summary: GisSummary): HTMLElement {\n  const bar = document.createElement(\"div\");\n  bar.className = \"ofv-gis-summary\";\n  bar.hidden = summary.features > 0;\n  if (summary.features > 0) {\n    bar.setAttribute(\"aria-hidden\", \"true\");\n    bar.style.display = \"none\";\n  }\n  appendSummaryItem(bar, \"要素\", String(summary.features));\n  appendSummaryItem(bar, \"几何\", formatGeometryCounts(summary.geometryCounts));\n  appendSummaryItem(bar, \"属性字段\", String(summary.propertyKeys.size));\n  if (summary.propertyKeys.size > 0) {\n    appendSummaryItem(bar, \"字段预览\", [...summary.propertyKeys].slice(0, 8).join(\", \"));\n  }\n  if (summary.bounds) {\n    appendSummaryItem(bar, \"范围\", formatBounds(summary.bounds));\n  }\n  return bar;\n}\n\nfunction createEmptyMapState(): HTMLElement {\n  const empty = document.createElement(\"div\");\n  empty.className = \"ofv-map-empty\";\n  const title = document.createElement(\"strong\");\n  title.textContent = \"暂无可展示的地图要素\";\n  const detail = document.createElement(\"span\");\n  detail.textContent = \"GeoJSON 已识别，但 features 为空。\";\n  empty.append(title, detail);\n  return empty;\n}\n\nfunction appendSummaryItem(parent: HTMLElement, label: string, value: string): void {\n  const item = document.createElement(\"span\");\n  const key = document.createElement(\"span\");\n  key.textContent = label;\n  const content = document.createElement(\"strong\");\n  content.textContent = value;\n  item.append(key, content);\n  parent.append(item);\n}\n\nfunction summarizeGeoJson(geojson: any): GisSummary {\n  const summary: GisSummary = {\n    features: 0,\n    geometryCounts: new Map(),\n    propertyKeys: new Set()\n  };\n  for (const feature of collectFeatures(geojson)) {\n    summary.features++;\n    if (feature.properties && typeof feature.properties === \"object\") {\n      Object.keys(feature.properties).forEach((key) => summary.propertyKeys.add(key));\n    }\n    summarizeGeometry(feature.geometry, summary);\n  }\n  return summary;\n}\n\nfunction collectFeatures(value: any): any[] {\n  if (!value) {\n    return [];\n  }\n  if (value.type === \"FeatureCollection\" && Array.isArray(value.features)) {\n    return value.features;\n  }\n  if (value.type === \"Feature\") {\n    return [value];\n  }\n  if (value.type && value.coordinates) {\n    return [{ type: \"Feature\", properties: {}, geometry: value }];\n  }\n  return [];\n}\n\nfunction summarizeGeometry(geometry: any, summary: GisSummary): void {\n  if (!geometry) {\n    summary.geometryCounts.set(\"None\", (summary.geometryCounts.get(\"None\") || 0) + 1);\n    return;\n  }\n  const type = String(geometry.type || \"Unknown\");\n  summary.geometryCounts.set(type, (summary.geometryCounts.get(type) || 0) + 1);\n  if (type === \"GeometryCollection\" && Array.isArray(geometry.geometries)) {\n    for (const child of geometry.geometries) {\n      summarizeGeometry(child, summary);\n    }\n    return;\n  }\n  updateBounds(summary, geometry.coordinates);\n}\n\nfunction updateBounds(summary: GisSummary, coordinates: unknown): void {\n  if (!Array.isArray(coordinates)) {\n    return;\n  }\n  if (typeof coordinates[0] === \"number\" && typeof coordinates[1] === \"number\") {\n    const lon = coordinates[0];\n    const lat = coordinates[1];\n    if (!Number.isFinite(lon) || !Number.isFinite(lat)) {\n      return;\n    }\n    const bounds = summary.bounds || [lon, lat, lon, lat];\n    bounds[0] = Math.min(bounds[0], lon);\n    bounds[1] = Math.min(bounds[1], lat);\n    bounds[2] = Math.max(bounds[2], lon);\n    bounds[3] = Math.max(bounds[3], lat);\n    summary.bounds = bounds;\n    return;\n  }\n  for (const item of coordinates) {\n    updateBounds(summary, item);\n  }\n}\n\nfunction formatGeometryCounts(counts: Map<string, number>): string {\n  return [...counts.entries()]\n    .sort((a, b) => b[1] - a[1])\n    .slice(0, 5)\n    .map(([type, count]) => `${type} ${count}`)\n    .join(\", \") || \"无\";\n}\n\nfunction formatBounds(bounds: [number, number, number, number]): string {\n  return bounds.map((value) => Number(value.toFixed(5))).join(\", \");\n}\n\nasync function parseToGeoJson(\n  file: PreviewFile,\n  buffer: ArrayBuffer,\n  togeojsonLib: any,\n  topojsonClient: any,\n  shpLib: any,\n  JSZipLib: any\n): Promise<any> {\n  const ext = resolveGisFormat(file);\n\n  if (ext === \"geojson\") {\n    const text = new TextDecoder().decode(buffer);\n    return JSON.parse(text);\n  }\n\n  if (ext === \"topojson\") {\n    const text = new TextDecoder().decode(buffer);\n    const topology = JSON.parse(text);\n    const geojsonFeatures: any[] = [];\n    for (const key of Object.keys(topology.objects)) {\n      const feature = topojsonClient.feature(topology, topology.objects[key]);\n      if (feature.type === \"FeatureCollection\") {\n        geojsonFeatures.push(...feature.features);\n      } else {\n        geojsonFeatures.push(feature);\n      }\n    }\n    return {\n      type: \"FeatureCollection\",\n      features: geojsonFeatures\n    };\n  }\n\n  if (ext === \"kml\") {\n    const text = new TextDecoder().decode(buffer);\n    const dom = new DOMParser().parseFromString(text, \"text/xml\");\n    return togeojsonLib.kml(dom);\n  }\n\n  if (ext === \"gpx\") {\n    const text = new TextDecoder().decode(buffer);\n    const dom = new DOMParser().parseFromString(text, \"text/xml\");\n    return togeojsonLib.gpx(dom);\n  }\n\n  if (ext === \"kmz\") {\n    const zip = await JSZipLib.loadAsync(buffer);\n    const kmlFile: any = Object.values(zip.files).find((f: any) => f.name.toLowerCase().endsWith(\".kml\"));\n    if (!kmlFile) {\n      throw new Error(\"No KML file found inside KMZ archive.\");\n    }\n    const kmlText = await kmlFile.async(\"text\");\n    const dom = new DOMParser().parseFromString(kmlText, \"text/xml\");\n    return togeojsonLib.kml(dom);\n  }\n\n  if (ext === \"shp\") {\n    const u8 = new Uint8Array(buffer);\n    const isZip = u8[0] === 0x50 && u8[1] === 0x4b && u8[2] === 0x03 && u8[3] === 0x04;\n    const parsed = await shpLib(isZip ? buffer : { shp: buffer }).catch((error: unknown) => {\n      if (!isZip) {\n        throw new Error(\n          `单个 .shp 几何解析失败：${error instanceof Error ? error.message : \"文件内容异常\"}。如需属性字段，请同时提供 .dbf/.shx 或上传 zip。`\n        );\n      }\n      throw error;\n    });\n    if (Array.isArray(parsed)) {\n      const features: any[] = [];\n      for (const item of parsed) {\n        if (item.type === \"FeatureCollection\") {\n          features.push(...item.features);\n        } else if (item.type === \"Feature\") {\n          features.push(item);\n        }\n      }\n      return {\n        type: \"FeatureCollection\",\n        features\n      };\n    }\n    return parsed;\n  }\n\n  // Mime type match fallback\n  try {\n    const text = new TextDecoder().decode(buffer);\n    return JSON.parse(text);\n  } catch {\n    throw new Error(`Unsupported GIS format: ${ext}`);\n  }\n}\n\nfunction resolveGisFormat(file: PreviewFile): string {\n  const name = file.name.toLowerCase().split(\"?\")[0]?.split(\"#\")[0] || \"\";\n  if (name.endsWith(\".geo.json\")) {\n    return \"geojson\";\n  }\n  if (name.endsWith(\".topo.json\")) {\n    return \"topojson\";\n  }\n  return resolveFormat(file, gisMimeFormatMap).toLowerCase();\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { Psd } from \"ag-psd\";\nimport type { PreviewCommand, PreviewFit, PreviewInstance, PreviewPlugin, PreviewSize } from \"../types\";\nimport { renderPdfDocumentPreview } from \"./pdf\";\nimport { appendMeta, createPanel, createSection, readArrayBuffer, resolveFormat } from \"./utils\";\n\nconst assetExtensions = new Set([\n  \"ttf\",\n  \"otf\",\n  \"woff\",\n  \"woff2\",\n  \"eot\",\n  \"psd\",\n  \"psb\",\n  \"ai\",\n  \"eps\",\n  \"ps\",\n  \"webarchive\",\n  \"sqlite\",\n  \"sqlite3\",\n  \"db\",\n  \"wasm\",\n  \"parquet\",\n  \"avro\"\n]);\n\nconst assetMimeFormatMap: Record<string, string> = {\n  \"font/ttf\": \"ttf\",\n  \"font/otf\": \"otf\",\n  \"font/woff\": \"woff\",\n  \"font/woff2\": \"woff2\",\n  \"application/vnd.ms-fontobject\": \"eot\",\n  \"image/vnd.adobe.photoshop\": \"psd\",\n  \"application/postscript\": \"ps\",\n  \"application/x-webarchive\": \"webarchive\",\n  \"application/vnd.sqlite3\": \"sqlite\",\n  \"application/x-sqlite3\": \"sqlite\",\n  \"application/wasm\": \"wasm\",\n  \"application/vnd.apache.parquet\": \"parquet\",\n  \"application/avro\": \"avro\"\n};\n\nconst assetMimeTypes = new Set(Object.keys(assetMimeFormatMap));\n\nexport function assetPlugin(): PreviewPlugin {\n  return {\n    name: \"asset\",\n    match(file) {\n      return assetExtensions.has(file.extension) || assetMimeTypes.has(file.mimeType);\n    },\n    async render(ctx) {\n      const panel = createPanel(\"ofv-asset\");\n      ctx.viewport.append(panel);\n      const url = createObjectUrl(ctx.file);\n      const isExternal = Boolean(ctx.file.url);\n      const extension = resolveFormat(ctx.file, assetMimeFormatMap).toLowerCase();\n      const bytes = new Uint8Array(await readArrayBuffer(ctx.file).catch(() => new ArrayBuffer(0)));\n\n      if (isPhotoshopAsset(extension)) {\n        const photoshopPreview = await createPhotoshopPreview(bytes, ctx.toolbar);\n        panel.append(photoshopPreview.element);\n        ctx.toolbar?.refreshCommandSupport();\n        return {\n          goToPage(page) {\n            return photoshopPreview.instance?.goToPage?.(page) ?? false;\n          },\n          canCommand(command) {\n            return photoshopPreview.instance?.canCommand?.(command) ?? false;\n          },\n          command(command) {\n            return photoshopPreview.instance?.command?.(command) ?? false;\n          },\n          preparePrint() {\n            return photoshopPreview.instance?.preparePrint?.();\n          },\n          resize(size) {\n            photoshopPreview.instance?.resize?.(size);\n          },\n          destroy() {\n            photoshopPreview.instance?.destroy();\n            revokeObjectUrl(url, isExternal);\n            panel.remove();\n          }\n        };\n      }\n\n      if (extension === \"ai\" || extension === \"eps\" || extension === \"ps\") {\n        const postScriptPreview = await createPostScriptPreview(bytes, url, ctx.file.name, ctx.size, ctx.options.fit, ctx.toolbar);\n        panel.append(postScriptPreview.element);\n        if (postScriptPreview.primaryRendered) {\n          hideSuccessfulAssetDiagnostics(panel);\n          ctx.toolbar?.refreshCommandSupport();\n          return {\n            goToPage(page) {\n              return postScriptPreview.instance?.goToPage?.(page) ?? false;\n            },\n            canCommand(command) {\n              return postScriptPreview.instance?.canCommand?.(command) ?? false;\n            },\n            command(command) {\n              return postScriptPreview.instance?.command?.(command) ?? false;\n            },\n            preparePrint() {\n              return postScriptPreview.instance?.preparePrint?.();\n            },\n            resize(size) {\n              postScriptPreview.instance?.resize?.(size);\n            },\n            destroy() {\n              postScriptPreview.instance?.destroy();\n              revokeObjectUrl(url, isExternal);\n              panel.remove();\n            }\n          };\n        }\n\n        return {\n          goToPage(page) {\n            return postScriptPreview.instance?.goToPage?.(page) ?? false;\n          },\n          canCommand(command) {\n            return postScriptPreview.instance?.canCommand?.(command) ?? false;\n          },\n          command(command) {\n            return postScriptPreview.instance?.command?.(command) ?? false;\n          },\n          preparePrint() {\n            return postScriptPreview.instance?.preparePrint?.();\n          },\n          resize(size) {\n            postScriptPreview.instance?.resize?.(size);\n          },\n          destroy() {\n            postScriptPreview.instance?.destroy();\n            revokeObjectUrl(url, isExternal);\n            panel.remove();\n          }\n        };\n      }\n\n      const section = createSection(assetTitle(extension));\n      const summary = document.createElement(\"div\");\n      summary.className = \"ofv-asset-summary\";\n      appendMeta(summary, \"文件\", ctx.file.name);\n      appendMeta(summary, \"格式\", extension ? `.${extension}` : ctx.file.mimeType || \"未知\");\n      appendMeta(summary, \"大小\", formatBytes(ctx.file.size ?? bytes.byteLength));\n      appendMeta(summary, \"签名\", byteSignature(bytes));\n      hideSupplementalInfo(summary);\n\n      const note = document.createElement(\"p\");\n      note.textContent = assetGuidance(extension);\n      hideSupplementalInfo(note);\n\n      const download = document.createElement(\"a\");\n      download.className = \"ofv-asset-download\";\n      download.href = url;\n      download.download = ctx.file.name;\n      download.textContent = \"下载文件\";\n      download.hidden = true;\n      download.setAttribute(\"aria-hidden\", \"true\");\n      download.style.display = \"none\";\n\n      section.append(summary, note, download);\n      const childInstances: PreviewInstance[] = [];\n      let hasPrimaryPreview = false;\n      if (isFontAsset(extension)) {\n        hideSuccessfulSectionHeading(section);\n        section.append(await createFontPreview(extension, url, ctx.file.name, bytes));\n        hasPrimaryPreview = true;\n      }\n      if (extension === \"wasm\") {\n        section.append(createWasmPreview(bytes));\n        hasPrimaryPreview = true;\n      }\n      if (extension === \"sqlite\" || extension === \"sqlite3\" || extension === \"db\") {\n        section.append(createSqlitePreview(bytes));\n        hasPrimaryPreview = true;\n      }\n      if (extension === \"parquet\") {\n        section.append(createParquetPreview(bytes));\n        hasPrimaryPreview = true;\n      }\n      if (extension === \"avro\") {\n        section.append(createAvroPreview(bytes));\n        hasPrimaryPreview = true;\n      }\n      if (extension === \"webarchive\") {\n        section.append(createWebArchivePreview(bytes));\n        hasPrimaryPreview = true;\n      }\n      if (hasPrimaryPreview) {\n        hideSuccessfulSectionHeading(section);\n      }\n      const preview = shouldShowHexPreview(extension, hasPrimaryPreview) ? createHexPreview(bytes) : null;\n      if (preview) {\n        section.append(preview);\n      }\n      panel.append(section);\n\n      return {\n        goToPage(page) {\n          for (const instance of childInstances) {\n            if (instance.goToPage?.(page)) {\n              return true;\n            }\n          }\n          return false;\n        },\n        canCommand(command) {\n          return childInstances.some((instance) => instance.canCommand?.(command));\n        },\n        command(command) {\n          for (const instance of childInstances) {\n            if (instance.canCommand?.(command)) {\n              return instance.command?.(command) ?? false;\n            }\n          }\n          return false;\n        },\n        async preparePrint() {\n          await Promise.all(childInstances.map((instance) => instance.preparePrint?.()));\n        },\n        resize(size) {\n          childInstances.forEach((instance) => instance.resize?.(size));\n        },\n        destroy() {\n          childInstances.forEach((instance) => instance.destroy());\n          revokeObjectUrl(url, isExternal);\n          panel.remove();\n        }\n      };\n    }\n  };\n}\n\nfunction assetTitle(extension: string): string {\n  if (isFontAsset(extension)) {\n    return \"字体文件预览\";\n  }\n  if ([\"psd\", \"psb\", \"ai\", \"eps\", \"ps\"].includes(extension)) {\n    return \"设计文件预览\";\n  }\n  if ([\"sqlite\", \"sqlite3\", \"db\", \"parquet\", \"avro\"].includes(extension)) {\n    return \"数据文件预览\";\n  }\n  if (extension === \"wasm\") {\n    return \"WebAssembly 文件预览\";\n  }\n  if (extension === \"webarchive\") {\n    return \"网页归档预览\";\n  }\n  return \"资产文件预览\";\n}\n\nfunction assetGuidance(extension: string): string {\n  if (isFontAsset(extension)) {\n    return \"字体文件已识别，当前会使用 FontFace 展示字形样张，并解析 sfnt/WOFF 表目录和 name 元信息。\";\n  }\n  if (extension === \"psd\" || extension === \"psb\") {\n    return \"PSD/PSB 已识别，当前会优先解析 Photoshop 合成图预览，并保留画布、通道、位深和颜色模式等结构信息。\";\n  }\n  if ([\"ai\", \"eps\", \"ps\"].includes(extension)) {\n    return \"PostScript/Illustrator 文件已识别；PDF-compatible AI 会直接使用浏览器 PDF 预览，EPS/PS 会解析文档头、BoundingBox 和常见 DSC 元信息。\";\n  }\n  if ([\"sqlite\", \"sqlite3\", \"db\"].includes(extension)) {\n    return \"SQLite 数据库已识别，当前会解析数据库头、sqlite_schema 摘要，并对常见 table leaf page 做前端抽样预览；复杂查询可接入 sqlite-wasm 增强。\";\n  }\n  if (extension === \"parquet\" || extension === \"avro\") {\n    return \"列式/序列化数据文件已识别，当前会解析容器头、元信息和 schema 摘要；抽样记录可后续接入专用解析器增强。\";\n  }\n  if (extension === \"wasm\") {\n    return \"WASM 模块已识别，当前会解析版本、section 分布、imports、exports 和自定义 section 摘要。\";\n  }\n  if (extension === \"webarchive\") {\n    return \"WebArchive 已识别，当前会解析 XML plist 主资源、MIME、编码和子资源数量；完整网页还原可后续接入资源包转换。\";\n  }\n  return \"该资产文件已识别，当前提供文件指纹和下载入口，后续可接入专用解析器增强。\";\n}\n\nfunction isFontAsset(extension: string): boolean {\n  return [\"ttf\", \"otf\", \"woff\", \"woff2\", \"eot\"].includes(extension);\n}\n\nfunction isPhotoshopAsset(extension: string): boolean {\n  return extension === \"psd\" || extension === \"psb\";\n}\n\nasync function createFontPreview(extension: string, url: string, fileName: string, bytes: Uint8Array): Promise<HTMLElement> {\n  const preview = document.createElement(\"div\");\n  preview.className = \"ofv-font-preview\";\n\n  const heading = document.createElement(\"strong\");\n  heading.textContent = \"字体样张\";\n\n  const sample = document.createElement(\"div\");\n  sample.className = \"ofv-font-sample\";\n  sample.textContent = \"Open File Viewer 预览 1234567890\";\n\n  const pangram = document.createElement(\"div\");\n  pangram.className = \"ofv-font-pangram\";\n  pangram.textContent = \"The quick brown fox jumps over the lazy dog.\";\n\n  const meta = document.createElement(\"span\");\n  meta.className = \"ofv-font-status\";\n\n  preview.append(heading, sample, pangram, meta);\n\n  if (!(\"FontFace\" in window) || !document.fonts) {\n    meta.textContent = \"当前浏览器不支持 FontFace API，无法生成实时字形样张。\";\n    preview.append(createFontInfoPreview(bytes, extension));\n    return preview;\n  }\n\n  const family = `ofv-${fileName.replace(/[^a-z0-9_-]/gi, \"-\")}-${Date.now()}`;\n  const format = fontFaceFormat(extension);\n  const source = format ? `url(\"${url}\") format(\"${format}\")` : `url(\"${url}\")`;\n  let sampleRendered = false;\n\n  try {\n    const fontFace = new FontFace(family, source);\n    const loaded = await fontFace.load();\n    document.fonts.add(loaded);\n    sample.style.fontFamily = `\"${family}\", sans-serif`;\n    pangram.style.fontFamily = `\"${family}\", sans-serif`;\n    meta.textContent = \"已使用浏览器 FontFace API 加载字体样张。\";\n    hideSupplementalInfo(meta);\n    sampleRendered = true;\n  } catch (error) {\n    meta.textContent = `字体样张加载失败：${error instanceof Error ? error.message : \"当前字体编码暂不受浏览器支持。\"}`;\n  }\n\n  const info = createFontInfoPreview(bytes, extension);\n  const hasVisibleFontDiagnostic = Boolean(info.querySelector(\".ofv-data-error\"));\n  if (sampleRendered || !hasVisibleFontDiagnostic) {\n    hideSupplementalInfo(info);\n  }\n  preview.append(info);\n  return preview;\n}\n\nfunction fontFaceFormat(extension: string): string {\n  const map: Record<string, string> = {\n    ttf: \"truetype\",\n    otf: \"opentype\",\n    woff: \"woff\",\n    woff2: \"woff2\",\n    eot: \"embedded-opentype\"\n  };\n  return map[extension] || \"\";\n}\n\ntype FontTableEntry = {\n  tag: string;\n  checksum?: number;\n  offset: number;\n  length: number;\n  compressedLength?: number;\n};\n\ntype FontNameRecord = {\n  id: number;\n  label: string;\n  value: string;\n};\n\ntype FontContainerMeta = {\n  label: string;\n  value: string | number;\n};\n\ntype FontInfo = {\n  valid: boolean;\n  error?: string;\n  container?: string;\n  flavor?: string;\n  tables: FontTableEntry[];\n  names: FontNameRecord[];\n  totalSfntSize?: number;\n  meta?: FontContainerMeta[];\n};\n\nfunction createFontInfoPreview(bytes: Uint8Array, extension: string): HTMLElement {\n  const wrapper = document.createElement(\"div\");\n  wrapper.className = \"ofv-font-info\";\n\n  const heading = document.createElement(\"strong\");\n  heading.textContent = \"字体结构\";\n  wrapper.append(heading);\n\n  const parsed = parseFontInfo(bytes, extension);\n  if (!parsed.valid) {\n    const error = document.createElement(\"p\");\n    error.className = \"ofv-data-error\";\n    error.textContent = parsed.error || \"无法解析字体结构。\";\n    wrapper.append(error);\n    return wrapper;\n  }\n\n  const summary = document.createElement(\"div\");\n  summary.className = \"ofv-data-summary\";\n  appendMeta(summary, \"容器\", parsed.container || \"sfnt\");\n  appendMeta(summary, \"Flavor\", parsed.flavor || \"未知\");\n  appendMeta(summary, \"表数量\", parsed.tables.length);\n  if (parsed.totalSfntSize !== undefined) {\n    appendMeta(summary, \"展开大小\", formatBytes(parsed.totalSfntSize));\n  }\n  for (const item of parsed.meta || []) {\n    appendMeta(summary, item.label, item.value);\n  }\n  wrapper.append(summary);\n\n  if (parsed.error) {\n    const note = document.createElement(\"p\");\n    note.className = \"ofv-data-note\";\n    note.textContent = parsed.error;\n    wrapper.append(note);\n  }\n\n  if (parsed.names.length > 0) {\n    wrapper.append(createKeyValueTable(\"Name\", parsed.names.map((item) => ({ key: item.label, value: item.value }))));\n  }\n\n  if (parsed.tables.length > 0) {\n    wrapper.append(createFontTablePreview(parsed.tables));\n  }\n  return wrapper;\n}\n\nfunction createFontTablePreview(tables: FontTableEntry[]): HTMLElement {\n  const wrapper = document.createElement(\"div\");\n  wrapper.className = \"ofv-font-tables\";\n  const title = document.createElement(\"strong\");\n  title.textContent = \"Tables\";\n\n  const table = document.createElement(\"table\");\n  const thead = document.createElement(\"thead\");\n  const headRow = document.createElement(\"tr\");\n  for (const label of [\"Tag\", \"Offset\", \"Length\", \"Compressed\", \"Checksum\"]) {\n    const th = document.createElement(\"th\");\n    th.textContent = label;\n    headRow.append(th);\n  }\n  thead.append(headRow);\n\n  const tbody = document.createElement(\"tbody\");\n  for (const entry of tables.slice(0, 80)) {\n    const row = document.createElement(\"tr\");\n    for (const value of [\n      entry.tag,\n      `0x${entry.offset.toString(16).toUpperCase()}`,\n      formatBytes(entry.length),\n      entry.compressedLength === undefined ? \"-\" : formatBytes(entry.compressedLength),\n      entry.checksum === undefined ? \"-\" : `0x${entry.checksum.toString(16).padStart(8, \"0\").toUpperCase()}`\n    ]) {\n      const cell = document.createElement(\"td\");\n      cell.textContent = value;\n      row.append(cell);\n    }\n    tbody.append(row);\n  }\n  table.append(thead, tbody);\n  wrapper.append(title, table);\n  return wrapper;\n}\n\nfunction parseFontInfo(bytes: Uint8Array, extension: string): FontInfo {\n  if (bytes.length < 4) {\n    return { valid: false, error: \"文件太短，无法读取字体头。\", tables: [], names: [] };\n  }\n  const signature = asciiAt(bytes, 0, 4);\n  if (signature === \"wOFF\") {\n    return parseWoffFont(bytes);\n  }\n  if (signature === \"wOF2\") {\n    return parseWoff2Font(bytes);\n  }\n  if (extension === \"eot\") {\n    return parseEotFont(bytes);\n  }\n  return parseSfntFont(bytes, 0, \"sfnt\");\n}\n\nfunction parseSfntFont(bytes: Uint8Array, offset: number, container: string): FontInfo {\n  if (offset + 12 > bytes.length) {\n    return { valid: false, error: \"文件太短，无法读取 sfnt offset table。\", tables: [], names: [] };\n  }\n  const flavor = fontFlavor(bytes, offset);\n  if (!flavor) {\n    return { valid: false, error: \"缺少有效的 TrueType/OpenType sfnt 头。\", tables: [], names: [] };\n  }\n  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n  const tableCount = view.getUint16(offset + 4, false);\n  const directoryEnd = offset + 12 + tableCount * 16;\n  if (tableCount <= 0 || directoryEnd > bytes.length) {\n    return { valid: false, error: \"sfnt 表目录超出文件边界。\", tables: [], names: [] };\n  }\n  const tables: FontTableEntry[] = [];\n  for (let index = 0; index < tableCount; index++) {\n    const entryOffset = offset + 12 + index * 16;\n    tables.push({\n      tag: asciiAt(bytes, entryOffset, 4),\n      checksum: view.getUint32(entryOffset + 4, false),\n      offset: view.getUint32(entryOffset + 8, false),\n      length: view.getUint32(entryOffset + 12, false)\n    });\n  }\n  return {\n    valid: true,\n    container,\n    flavor,\n    tables,\n    names: parseFontNameTable(bytes, tables.find((table) => table.tag === \"name\"))\n  };\n}\n\nfunction parseWoffFont(bytes: Uint8Array): FontInfo {\n  if (bytes.length < 44) {\n    return { valid: false, error: \"文件太短，无法读取 WOFF 头。\", tables: [], names: [] };\n  }\n  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n  const tableCount = view.getUint16(12, false);\n  const directoryEnd = 44 + tableCount * 20;\n  if (tableCount <= 0 || directoryEnd > bytes.length) {\n    return { valid: false, error: \"WOFF 表目录超出文件边界。\", tables: [], names: [] };\n  }\n  const tables: FontTableEntry[] = [];\n  for (let index = 0; index < tableCount; index++) {\n    const entryOffset = 44 + index * 20;\n    tables.push({\n      tag: asciiAt(bytes, entryOffset, 4),\n      offset: view.getUint32(entryOffset + 4, false),\n      compressedLength: view.getUint32(entryOffset + 8, false),\n      length: view.getUint32(entryOffset + 12, false),\n      checksum: view.getUint32(entryOffset + 16, false)\n    });\n  }\n  return {\n    valid: true,\n    container: \"WOFF\",\n    flavor: fontFlavor(bytes, 4) || asciiAt(bytes, 4, 4),\n    tables,\n    names: parseFontNameTable(bytes, tables.find((table) => table.tag === \"name\" && table.compressedLength === table.length)),\n    totalSfntSize: view.getUint32(16, false)\n  };\n}\n\nfunction parseWoff2Font(bytes: Uint8Array): FontInfo {\n  if (bytes.length < 48) {\n    return { valid: false, error: \"文件太短，无法读取 WOFF2 头。\", tables: [], names: [] };\n  }\n  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n  const tableCount = view.getUint16(12, false);\n  let offset = 48;\n  const tables: FontTableEntry[] = [];\n  for (let index = 0; index < tableCount; index++) {\n    if (offset >= bytes.length) {\n      return { valid: false, error: \"WOFF2 表目录超出文件边界。\", tables: [], names: [] };\n    }\n    const flags = bytes[offset++];\n    const knownTag = flags & 0x3f;\n    let tag = woff2KnownTableTag(knownTag);\n    if (knownTag === 0x3f) {\n      if (offset + 4 > bytes.length) {\n        return { valid: false, error: \"WOFF2 自定义表 tag 超出文件边界。\", tables: [], names: [] };\n      }\n      tag = asciiAt(bytes, offset, 4);\n      offset += 4;\n    }\n    const originalLength = read255UInt16(bytes, offset);\n    if (!originalLength) {\n      return { valid: false, error: \"WOFF2 表目录长度字段不完整。\", tables: [], names: [] };\n    }\n    offset = originalLength.offset;\n    let transformedLength: number | undefined;\n    const hasTransform = (flags & 0xc0) !== 0 || (tag === \"glyf\" && (flags & 0xc0) !== 0) || (tag === \"loca\" && (flags & 0xc0) !== 0);\n    if (hasTransform && tag !== \"loca\") {\n      const transformed = read255UInt16(bytes, offset);\n      if (!transformed) {\n        return { valid: false, error: \"WOFF2 transformLength 字段不完整。\", tables: [], names: [] };\n      }\n      transformedLength = transformed.value;\n      offset = transformed.offset;\n    }\n    tables.push({\n      tag,\n      offset: 0,\n      length: originalLength.value,\n      compressedLength: transformedLength\n    });\n  }\n  return {\n    valid: true,\n    container: \"WOFF2\",\n    flavor: fontFlavor(bytes, 4) || asciiAt(bytes, 4, 4),\n    tables,\n    names: [],\n    totalSfntSize: view.getUint32(16, false),\n    meta: [\n      { label: \"压缩数据\", value: formatBytes(view.getUint32(20, false)) },\n      { label: \"Meta\", value: view.getUint32(32, false) > 0 ? `${formatBytes(view.getUint32(36, false))} @ 0x${view.getUint32(32, false).toString(16).toUpperCase()}` : \"无\" },\n      { label: \"Private\", value: view.getUint32(40, false) > 0 ? `${formatBytes(view.getUint32(44, false))} @ 0x${view.getUint32(40, false).toString(16).toUpperCase()}` : \"无\" }\n    ],\n    error: \"WOFF2 已解析容器头和压缩表目录；name 表内容需 Brotli 解压后才能展开。\"\n  };\n}\n\nfunction parseEotFont(bytes: Uint8Array): FontInfo {\n  if (bytes.length < 82) {\n    return { valid: false, error: \"文件太短，无法读取 EOT 头。\", tables: [], names: [] };\n  }\n  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n  const eotSize = view.getUint32(0, true);\n  const fontDataSize = view.getUint32(4, true);\n  const version = view.getUint32(8, true);\n  const flags = view.getUint32(12, true);\n  const panose = Array.from(bytes.slice(16, 26)).map((item) => item.toString(16).padStart(2, \"0\")).join(\" \");\n  const charset = bytes[26];\n  const italic = bytes[27];\n  const weight = view.getUint32(28, true);\n  let offset = 68;\n  const names: FontNameRecord[] = [];\n  const fields: Array<{ id: number; label: string; padded: boolean }> = [\n    { id: 1, label: \"Family\", padded: true },\n    { id: 2, label: \"Subfamily\", padded: true },\n    { id: 5, label: \"Version\", padded: true },\n    { id: 4, label: \"Full name\", padded: true },\n    { id: 0, label: \"Root strings\", padded: false }\n  ];\n  for (const field of fields) {\n    const fieldValue = readEotStringField(bytes, offset, field.padded);\n    if (!fieldValue) {\n      break;\n    }\n    offset = fieldValue.offset;\n    if (field.id > 0 && fieldValue.value) {\n      names.push({ id: field.id, label: field.label, value: fieldValue.value });\n    }\n  }\n  if (offset + 4 <= bytes.length) {\n    offset += 4;\n  }\n  const sfntOffset = findEmbeddedSfntOffset(bytes, offset);\n  const embedded = sfntOffset === undefined ? undefined : parseSfntFont(bytes, sfntOffset, \"EOT embedded sfnt\");\n  return {\n    valid: true,\n    container: \"EOT\",\n    flavor: embedded?.valid ? embedded.flavor : \"Embedded OpenType\",\n    tables: embedded?.valid ? embedded.tables : [],\n    names: embedded?.valid && embedded.names.length > 0 ? embedded.names : names,\n    totalSfntSize: fontDataSize || undefined,\n    meta: [\n      { label: \"EOT 大小\", value: eotSize ? formatBytes(eotSize) : \"未声明\" },\n      { label: \"版本\", value: `0x${version.toString(16).toUpperCase()}` },\n      { label: \"Flags\", value: `0x${flags.toString(16).toUpperCase()}` },\n      { label: \"Weight\", value: weight || \"未声明\" },\n      { label: \"Italic\", value: italic ? \"是\" : \"否\" },\n      { label: \"Charset\", value: charset },\n      { label: \"PANOSE\", value: panose },\n      { label: \"sfnt 偏移\", value: sfntOffset === undefined ? \"未找到\" : `0x${sfntOffset.toString(16).toUpperCase()}` }\n    ],\n    error: embedded?.valid ? undefined : \"已解析 EOT 容器头和名称字段，但未找到可展开的内嵌 sfnt 表目录。\"\n  };\n}\n\nfunction readEotStringField(bytes: Uint8Array, offset: number, padded: boolean): { value: string; offset: number } | undefined {\n  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n  if (padded) {\n    if (offset + 2 > bytes.length) {\n      return undefined;\n    }\n    offset += 2;\n  }\n  if (offset + 2 > bytes.length) {\n    return undefined;\n  }\n  const length = view.getUint16(offset, true);\n  offset += 2;\n  if (offset + length > bytes.length) {\n    return undefined;\n  }\n  const value = length > 0 ? decodeEotString(bytes.slice(offset, offset + length)) : \"\";\n  return { value, offset: offset + length };\n}\n\nfunction woff2KnownTableTag(index: number): string {\n  const tags = [\n    \"cmap\",\n    \"head\",\n    \"hhea\",\n    \"hmtx\",\n    \"maxp\",\n    \"name\",\n    \"OS/2\",\n    \"post\",\n    \"cvt \",\n    \"fpgm\",\n    \"glyf\",\n    \"loca\",\n    \"prep\",\n    \"CFF \",\n    \"VORG\",\n    \"EBDT\",\n    \"EBLC\",\n    \"gasp\",\n    \"hdmx\",\n    \"kern\",\n    \"LTSH\",\n    \"PCLT\",\n    \"VDMX\",\n    \"vhea\",\n    \"vmtx\",\n    \"BASE\",\n    \"GDEF\",\n    \"GPOS\",\n    \"GSUB\",\n    \"EBSC\",\n    \"JSTF\",\n    \"MATH\",\n    \"CBDT\",\n    \"CBLC\",\n    \"COLR\",\n    \"CPAL\",\n    \"SVG \",\n    \"sbix\",\n    \"acnt\",\n    \"avar\",\n    \"bdat\",\n    \"bloc\",\n    \"bsln\",\n    \"cvar\",\n    \"fdsc\",\n    \"feat\",\n    \"fmtx\",\n    \"fvar\",\n    \"gvar\",\n    \"hsty\",\n    \"just\",\n    \"lcar\",\n    \"mort\",\n    \"morx\",\n    \"opbd\",\n    \"prop\",\n    \"trak\",\n    \"Zapf\",\n    \"Silf\",\n    \"Glat\",\n    \"Gloc\",\n    \"Feat\",\n    \"Sill\"\n  ];\n  return tags[index] || `table-${index}`;\n}\n\nfunction read255UInt16(bytes: Uint8Array, offset: number): { value: number; offset: number } | undefined {\n  if (offset >= bytes.length) {\n    return undefined;\n  }\n  const code = bytes[offset++];\n  if (code === 253) {\n    if (offset + 2 > bytes.length) {\n      return undefined;\n    }\n    return { value: (bytes[offset] << 8) | bytes[offset + 1], offset: offset + 2 };\n  }\n  if (code === 254) {\n    if (offset >= bytes.length) {\n      return undefined;\n    }\n    return { value: bytes[offset] + 506, offset: offset + 1 };\n  }\n  if (code === 255) {\n    if (offset >= bytes.length) {\n      return undefined;\n    }\n    return { value: bytes[offset] + 253, offset: offset + 1 };\n  }\n  return { value: code, offset };\n}\n\nfunction decodeEotString(bytes: Uint8Array): string {\n  const text = decodeUtf16Le(bytes).replace(/\\0+$/g, \"\").trim();\n  return text || new TextDecoder(\"latin1\").decode(bytes).replace(/\\0+$/g, \"\").trim();\n}\n\nfunction decodeUtf16Le(bytes: Uint8Array): string {\n  let value = \"\";\n  for (let index = 0; index + 1 < bytes.length; index += 2) {\n    value += String.fromCharCode(bytes[index] | (bytes[index + 1] << 8));\n  }\n  return value;\n}\n\nfunction findEmbeddedSfntOffset(bytes: Uint8Array, start: number): number | undefined {\n  for (let offset = Math.max(0, start); offset + 12 <= bytes.length; offset++) {\n    const flavor = fontFlavor(bytes, offset);\n    if (!flavor) {\n      continue;\n    }\n    const tableCount = (bytes[offset + 4] << 8) | bytes[offset + 5];\n    const directoryEnd = offset + 12 + tableCount * 16;\n    if (tableCount > 0 && directoryEnd <= bytes.length) {\n      return offset;\n    }\n  }\n  return undefined;\n}\n\nfunction fontFlavor(bytes: Uint8Array, offset: number): string | undefined {\n  if (offset + 4 > bytes.length) {\n    return undefined;\n  }\n  const ascii = asciiAt(bytes, offset, 4);\n  if (ascii === \"OTTO\") {\n    return \"OpenType/CFF\";\n  }\n  if (ascii === \"true\") {\n    return \"Apple TrueType\";\n  }\n  if (ascii === \"typ1\") {\n    return \"Type 1 sfnt\";\n  }\n  if (bytes[offset] === 0x00 && bytes[offset + 1] === 0x01 && bytes[offset + 2] === 0x00 && bytes[offset + 3] === 0x00) {\n    return \"TrueType\";\n  }\n  return undefined;\n}\n\nfunction parseFontNameTable(bytes: Uint8Array, table?: FontTableEntry): FontNameRecord[] {\n  if (!table || table.offset + table.length > bytes.length || table.length < 6) {\n    return [];\n  }\n  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n  const offset = table.offset;\n  const count = view.getUint16(offset + 2, false);\n  const storageOffset = view.getUint16(offset + 4, false);\n  const recordsEnd = offset + 6 + count * 12;\n  if (recordsEnd > bytes.length || storageOffset > table.length) {\n    return [];\n  }\n  const wanted = new Map<number, string>([\n    [1, \"Family\"],\n    [2, \"Subfamily\"],\n    [4, \"Full name\"],\n    [5, \"Version\"],\n    [6, \"PostScript name\"],\n    [8, \"Manufacturer\"],\n    [13, \"License\"],\n    [16, \"Typographic family\"],\n    [17, \"Typographic subfamily\"]\n  ]);\n  const names = new Map<number, FontNameRecord>();\n  for (let index = 0; index < count; index++) {\n    const recordOffset = offset + 6 + index * 12;\n    const platformId = view.getUint16(recordOffset, false);\n    const encodingId = view.getUint16(recordOffset + 2, false);\n    const languageId = view.getUint16(recordOffset + 4, false);\n    const nameId = view.getUint16(recordOffset + 6, false);\n    const length = view.getUint16(recordOffset + 8, false);\n    const stringOffset = view.getUint16(recordOffset + 10, false);\n    const label = wanted.get(nameId);\n    if (!label || names.has(nameId)) {\n      continue;\n    }\n    const start = offset + storageOffset + stringOffset;\n    const end = start + length;\n    if (end > bytes.length || end > offset + table.length) {\n      continue;\n    }\n    const value = decodeFontName(bytes.slice(start, end), platformId, encodingId).trim();\n    if (value) {\n      names.set(nameId, { id: nameId, label: languageId ? `${label} (${languageId.toString(16).toUpperCase()})` : label, value });\n    }\n  }\n  return [...names.values()];\n}\n\nfunction decodeFontName(bytes: Uint8Array, platformId: number, encodingId: number): string {\n  if (platformId === 0 || platformId === 3 || (platformId === 2 && encodingId === 1)) {\n    return decodeUtf16Be(bytes);\n  }\n  return new TextDecoder(\"latin1\").decode(bytes);\n}\n\nfunction decodeUtf16Be(bytes: Uint8Array): string {\n  let value = \"\";\n  for (let index = 0; index + 1 < bytes.length; index += 2) {\n    value += String.fromCharCode((bytes[index] << 8) | bytes[index + 1]);\n  }\n  return value;\n}\n\ntype WasmSection = {\n  id: number;\n  name: string;\n  size: number;\n  offset: number;\n  customName?: string;\n};\n\ntype WasmImport = {\n  module: string;\n  name: string;\n  kind: string;\n};\n\ntype WasmExport = {\n  name: string;\n  kind: string;\n  index: number;\n};\n\ntype WasmPreview = {\n  valid: boolean;\n  version?: number;\n  error?: string;\n  sections: WasmSection[];\n  imports: WasmImport[];\n  exports: WasmExport[];\n};\n\nfunction createWasmPreview(bytes: Uint8Array): HTMLElement {\n  const preview = document.createElement(\"div\");\n  preview.className = \"ofv-wasm-preview\";\n  const parsed = parseWasm(bytes);\n\n  const heading = document.createElement(\"strong\");\n  heading.textContent = \"WASM 结构\";\n  preview.append(heading);\n\n  if (!parsed.valid) {\n    const error = document.createElement(\"p\");\n    error.className = \"ofv-wasm-error\";\n    error.textContent = parsed.error || \"不是有效的 WebAssembly 二进制模块。\";\n    preview.append(error);\n    return preview;\n  }\n\n  const summary = document.createElement(\"div\");\n  summary.className = \"ofv-wasm-summary\";\n  appendMeta(summary, \"版本\", parsed.version ?? \"未知\");\n  appendMeta(summary, \"Sections\", parsed.sections.length);\n  appendMeta(summary, \"Imports\", parsed.imports.length);\n  appendMeta(summary, \"Exports\", parsed.exports.length);\n  preview.append(summary);\n\n  const sectionTable = createWasmSectionTable(parsed.sections);\n  preview.append(sectionTable);\n  if (parsed.imports.length > 0) {\n    const imports = createWasmList(\"导入\", parsed.imports.map((item) => `${item.module}.${item.name} · ${item.kind}`));\n    preview.append(imports);\n  }\n  if (parsed.exports.length > 0) {\n    const exports = createWasmList(\"导出\", parsed.exports.map((item) => `${item.name} · ${item.kind} #${item.index}`));\n    preview.append(exports);\n  }\n\n  return preview;\n}\n\nfunction createWasmSectionTable(sections: WasmSection[]): HTMLElement {\n  const table = document.createElement(\"table\");\n  table.className = \"ofv-wasm-sections\";\n  const thead = document.createElement(\"thead\");\n  const header = document.createElement(\"tr\");\n  for (const label of [\"Section\", \"大小\", \"偏移\"]) {\n    const th = document.createElement(\"th\");\n    th.textContent = label;\n    header.append(th);\n  }\n  thead.append(header);\n  const tbody = document.createElement(\"tbody\");\n  for (const section of sections.slice(0, 80)) {\n    const row = document.createElement(\"tr\");\n    const name = document.createElement(\"td\");\n    name.textContent = section.customName ? `${section.name} (${section.customName})` : section.name;\n    const size = document.createElement(\"td\");\n    size.textContent = formatBytes(section.size);\n    const offset = document.createElement(\"td\");\n    offset.textContent = `0x${section.offset.toString(16).toUpperCase()}`;\n    row.append(name, size, offset);\n    tbody.append(row);\n  }\n  table.append(thead, tbody);\n  return table;\n}\n\nfunction createWasmList(titleText: string, rows: string[]): HTMLElement {\n  const details = document.createElement(\"details\");\n  details.className = \"ofv-details ofv-wasm-list\";\n  details.open = true;\n  const summary = document.createElement(\"summary\");\n  summary.textContent = `${titleText} ${rows.length}`;\n  const list = document.createElement(\"ul\");\n  for (const row of rows.slice(0, 120)) {\n    const item = document.createElement(\"li\");\n    item.textContent = row;\n    list.append(item);\n  }\n  if (rows.length > 120) {\n    const item = document.createElement(\"li\");\n    item.textContent = `还有 ${rows.length - 120} 项未展示。`;\n    list.append(item);\n  }\n  details.append(summary, list);\n  return details;\n}\n\nfunction parseWasm(bytes: Uint8Array): WasmPreview {\n  if (bytes.length < 8 || bytes[0] !== 0x00 || bytes[1] !== 0x61 || bytes[2] !== 0x73 || bytes[3] !== 0x6d) {\n    return { valid: false, error: \"缺少 WebAssembly magic header。\", sections: [], imports: [], exports: [] };\n  }\n\n  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n  const version = view.getUint32(4, true);\n  const sections: WasmSection[] = [];\n  const imports: WasmImport[] = [];\n  const exports: WasmExport[] = [];\n  let offset = 8;\n\n  try {\n    while (offset < bytes.length) {\n      const sectionOffset = offset;\n      const id = bytes[offset++];\n      const sizeInfo = readVarUint(bytes, offset);\n      offset = sizeInfo.offset;\n      const payloadOffset = offset;\n      const payloadEnd = payloadOffset + sizeInfo.value;\n      if (payloadEnd > bytes.length) {\n        throw new Error(\"section 长度超过文件边界。\");\n      }\n\n      const section: WasmSection = {\n        id,\n        name: wasmSectionName(id),\n        size: sizeInfo.value,\n        offset: sectionOffset\n      };\n      if (id === 0) {\n        const customName = readWasmName(bytes, payloadOffset, payloadEnd);\n        section.customName = customName.value || undefined;\n      } else if (id === 2) {\n        imports.push(...parseWasmImports(bytes, payloadOffset, payloadEnd));\n      } else if (id === 7) {\n        exports.push(...parseWasmExports(bytes, payloadOffset, payloadEnd));\n      }\n      sections.push(section);\n      offset = payloadEnd;\n    }\n  } catch (error) {\n    return {\n      valid: false,\n      version,\n      error: error instanceof Error ? error.message : \"WASM section 解析失败。\",\n      sections,\n      imports,\n      exports\n    };\n  }\n\n  return { valid: true, version, sections, imports, exports };\n}\n\nfunction parseWasmImports(bytes: Uint8Array, offset: number, end: number): WasmImport[] {\n  const imports: WasmImport[] = [];\n  const count = readVarUint(bytes, offset);\n  offset = count.offset;\n  for (let index = 0; index < count.value && offset < end; index++) {\n    const moduleName = readWasmName(bytes, offset, end);\n    offset = moduleName.offset;\n    const importName = readWasmName(bytes, offset, end);\n    offset = importName.offset;\n    const kind = bytes[offset++];\n    offset = skipWasmImportDescriptor(bytes, offset, end, kind);\n    imports.push({ module: moduleName.value, name: importName.value, kind: wasmExternalKind(kind) });\n  }\n  return imports;\n}\n\nfunction parseWasmExports(bytes: Uint8Array, offset: number, end: number): WasmExport[] {\n  const exports: WasmExport[] = [];\n  const count = readVarUint(bytes, offset);\n  offset = count.offset;\n  for (let index = 0; index < count.value && offset < end; index++) {\n    const exportName = readWasmName(bytes, offset, end);\n    offset = exportName.offset;\n    const kind = bytes[offset++];\n    const itemIndex = readVarUint(bytes, offset);\n    offset = itemIndex.offset;\n    exports.push({ name: exportName.value, kind: wasmExternalKind(kind), index: itemIndex.value });\n  }\n  return exports;\n}\n\nfunction skipWasmImportDescriptor(bytes: Uint8Array, offset: number, end: number, kind: number): number {\n  if (kind === 0x00) {\n    return readVarUint(bytes, offset).offset;\n  }\n  if (kind === 0x01) {\n    const elementTypeOffset = offset + 1;\n    return skipWasmLimits(bytes, elementTypeOffset, end);\n  }\n  if (kind === 0x02) {\n    return skipWasmLimits(bytes, offset, end);\n  }\n  if (kind === 0x03) {\n    return Math.min(end, offset + 2);\n  }\n  return offset;\n}\n\nfunction skipWasmLimits(bytes: Uint8Array, offset: number, end: number): number {\n  const flags = bytes[offset++];\n  offset = readVarUint(bytes, offset).offset;\n  if ((flags & 0x01) === 0x01 && offset < end) {\n    offset = readVarUint(bytes, offset).offset;\n  }\n  return offset;\n}\n\nfunction readVarUint(bytes: Uint8Array, offset: number): { value: number; offset: number } {\n  let result = 0;\n  let shift = 0;\n  for (let index = 0; index < 5; index++) {\n    if (offset >= bytes.length) {\n      throw new Error(\"LEB128 数据不完整。\");\n    }\n    const byte = bytes[offset++];\n    result |= (byte & 0x7f) << shift;\n    if ((byte & 0x80) === 0) {\n      return { value: result >>> 0, offset };\n    }\n    shift += 7;\n  }\n  throw new Error(\"LEB128 数据过长。\");\n}\n\nfunction readWasmName(bytes: Uint8Array, offset: number, end: number): { value: string; offset: number } {\n  const length = readVarUint(bytes, offset);\n  offset = length.offset;\n  const nameEnd = offset + length.value;\n  if (nameEnd > end) {\n    throw new Error(\"字符串长度超过 section 边界。\");\n  }\n  return { value: new TextDecoder().decode(bytes.slice(offset, nameEnd)), offset: nameEnd };\n}\n\nfunction wasmSectionName(id: number): string {\n  const names: Record<number, string> = {\n    0: \"custom\",\n    1: \"type\",\n    2: \"import\",\n    3: \"function\",\n    4: \"table\",\n    5: \"memory\",\n    6: \"global\",\n    7: \"export\",\n    8: \"start\",\n    9: \"element\",\n    10: \"code\",\n    11: \"data\",\n    12: \"data-count\"\n  };\n  return names[id] || `unknown ${id}`;\n}\n\nfunction wasmExternalKind(kind: number): string {\n  const names: Record<number, string> = {\n    0x00: \"function\",\n    0x01: \"table\",\n    0x02: \"memory\",\n    0x03: \"global\"\n  };\n  return names[kind] || `unknown ${kind}`;\n}\n\ntype PhotoshopHeader = {\n  valid: boolean;\n  error?: string;\n  signature?: string;\n  version?: number;\n  channels?: number;\n  width?: number;\n  height?: number;\n  depth?: number;\n  colorMode?: number;\n};\n\nasync function createPhotoshopPreview(\n  bytes: Uint8Array,\n  toolbar?: { setZoom(value: number | undefined): void }\n): Promise<{ element: HTMLElement; instance?: PreviewInstance }> {\n  const preview = document.createElement(\"div\");\n  preview.className = \"ofv-psd-preview\";\n\n  const header = parsePhotoshopHeader(bytes);\n  if (!header.valid) {\n    const error = document.createElement(\"p\");\n    error.className = \"ofv-psd-error\";\n    error.textContent = header.error || \"不是有效的 Photoshop 文档头。\";\n    preview.append(error);\n    return { element: preview };\n  }\n\n  const composite = await createPhotoshopCompositePreview(bytes, header, toolbar);\n  preview.append(composite.element);\n\n  return { element: preview, instance: composite.instance };\n}\n\nasync function createPhotoshopCompositePreview(\n  bytes: Uint8Array,\n  header: PhotoshopHeader,\n  toolbar?: { setZoom(value: number | undefined): void }\n): Promise<{ element: HTMLElement; instance?: PreviewInstance }> {\n  const wrapper = document.createElement(\"div\");\n  wrapper.className = \"ofv-psd-composite\";\n\n  if (!canUseBrowserCanvas()) {\n    const status = document.createElement(\"p\");\n    status.className = \"ofv-psd-error\";\n    status.textContent = \"当前环境不支持 Canvas，无法生成 PSD 合成图预览。\";\n    wrapper.append(status);\n    return { element: wrapper };\n  }\n\n  try {\n    const { readPsd } = await import(\"ag-psd\");\n    const psd = readPsd(toStandaloneArrayBuffer(bytes), {\n      skipLayerImageData: true,\n      skipThumbnail: true,\n      skipLinkedFilesData: true,\n      useImageData: true,\n      throwForMissingFeatures: false,\n      logMissingFeatures: false\n    });\n    const canvas = psd.canvas || createCanvasFromPsdImageData(psd);\n    if (!canvas) {\n      throw new Error(\"PSD 文件没有可读取的合成图像数据。请在 Photoshop 中开启“最大兼容性”保存，或接入外部转换服务。\");\n    }\n\n    canvas.classList.add(\"ofv-psd-canvas\");\n    canvas.setAttribute(\"role\", \"img\");\n    canvas.setAttribute(\"aria-label\", `Photoshop composite ${header.width} x ${header.height}`);\n    wrapper.append(canvas);\n    return { element: wrapper, instance: createAssetVisualController(canvas, toolbar) };\n  } catch (error) {\n    const status = document.createElement(\"p\");\n    status.className = \"ofv-psd-error\";\n    status.textContent = `PSD 合成图解析失败：${error instanceof Error ? error.message : \"当前文件特性暂不支持。\"}`;\n    wrapper.append(status);\n  }\n\n  return { element: wrapper };\n}\n\nfunction createAssetVisualController(\n  element: HTMLElement,\n  toolbar?: { setZoom(value: number | undefined): void }\n): PreviewInstance {\n  let scale = 1;\n  let rotation = 0;\n  let measuredBase: { width: number; height: number } | null = null;\n  let scaleBox: HTMLElement | null = null;\n\n  // Transforms do not affect layout, so the scaled/rotated visual is wrapped in\n  // a sizing box that reserves the transformed footprint — the panel then grows\n  // real scrollbars and the whole image stays reachable (a centered transform\n  // alone pushes the top/left overflow outside the scrollable range).\n  const ensureScaleBox = () => {\n    if (!scaleBox) {\n      scaleBox = document.createElement(\"div\");\n      scaleBox.className = \"ofv-asset-scale-box\";\n      element.parentElement?.insertBefore(scaleBox, element);\n      scaleBox.append(element);\n    }\n    return scaleBox;\n  };\n\n  const apply = () => {\n    if (scale === 1 && rotation === 0) {\n      element.style.removeProperty(\"transform\");\n      element.style.removeProperty(\"transform-origin\");\n      element.style.removeProperty(\"width\");\n      element.style.removeProperty(\"height\");\n      element.style.removeProperty(\"max-width\");\n      element.style.removeProperty(\"max-height\");\n      if (scaleBox) {\n        scaleBox.style.removeProperty(\"width\");\n        scaleBox.style.removeProperty(\"height\");\n      }\n      measuredBase = null;\n      toolbar?.setZoom(scale);\n      return;\n    }\n    const box = ensureScaleBox();\n    if (!measuredBase) {\n      element.style.removeProperty(\"transform\");\n      element.style.removeProperty(\"width\");\n      element.style.removeProperty(\"height\");\n      element.style.removeProperty(\"max-width\");\n      element.style.removeProperty(\"max-height\");\n      box.style.removeProperty(\"width\");\n      box.style.removeProperty(\"height\");\n      const rect = element.getBoundingClientRect();\n      if (rect.width > 0 && rect.height > 0) {\n        measuredBase = { width: rect.width, height: rect.height };\n        element.style.width = `${rect.width}px`;\n        element.style.height = `${rect.height}px`;\n        element.style.maxWidth = \"none\";\n        element.style.maxHeight = \"none\";\n      }\n    }\n    element.style.transformOrigin = \"center\";\n    if (measuredBase) {\n      const sideways = Math.abs(rotation % 180) === 90;\n      const boxWidth = (sideways ? measuredBase.height : measuredBase.width) * scale;\n      const boxHeight = (sideways ? measuredBase.width : measuredBase.height) * scale;\n      box.style.width = `${Math.ceil(boxWidth)}px`;\n      box.style.height = `${Math.ceil(boxHeight)}px`;\n      const dx = (boxWidth - measuredBase.width) / 2;\n      const dy = (boxHeight - measuredBase.height) / 2;\n      element.style.transform = `translate(${dx}px, ${dy}px) scale(${scale}) rotate(${rotation}deg)`;\n    } else {\n      element.style.transform = `scale(${scale}) rotate(${rotation}deg)`;\n    }\n    toolbar?.setZoom(scale);\n  };\n  apply();\n\n  return {\n    canCommand(command) {\n      return command === \"zoom-in\" || command === \"zoom-out\" || command === \"zoom-reset\" || command === \"rotate-right\" || command === \"rotate-left\";\n    },\n    command(command: PreviewCommand) {\n      if (command === \"zoom-in\") {\n        scale = Math.min(8, Number((scale + 0.25).toFixed(2)));\n        apply();\n        return true;\n      }\n      if (command === \"zoom-out\") {\n        scale = Math.max(0.1, Number((scale - 0.25).toFixed(2)));\n        apply();\n        return true;\n      }\n      if (command === \"zoom-reset\") {\n        scale = 1;\n        rotation = 0;\n        apply();\n        return true;\n      }\n      if (command === \"rotate-right\") {\n        rotation += 90;\n        apply();\n        return true;\n      }\n      if (command === \"rotate-left\") {\n        rotation -= 90;\n        apply();\n        return true;\n      }\n      return false;\n    },\n    destroy() {\n      element.style.removeProperty(\"transform\");\n      element.style.removeProperty(\"transform-origin\");\n      toolbar?.setZoom(undefined);\n    }\n  };\n}\n\nfunction canUseBrowserCanvas(): boolean {\n  return typeof document !== \"undefined\" && typeof HTMLCanvasElement !== \"undefined\";\n}\n\nfunction toStandaloneArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n  return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;\n}\n\nfunction createCanvasFromPsdImageData(psd: Psd): HTMLCanvasElement | undefined {\n  const imageData = psd.imageData;\n  if (!imageData || !imageData.width || !imageData.height || !(imageData.data instanceof Uint8ClampedArray)) {\n    return undefined;\n  }\n  const canvas = document.createElement(\"canvas\");\n  canvas.width = imageData.width;\n  canvas.height = imageData.height;\n  const context = canvas.getContext(\"2d\");\n  if (!context) {\n    return undefined;\n  }\n  context.putImageData(new ImageData(new Uint8ClampedArray(imageData.data), imageData.width, imageData.height), 0, 0);\n  return canvas;\n}\n\nfunction parsePhotoshopHeader(bytes: Uint8Array): PhotoshopHeader {\n  if (bytes.length < 26) {\n    return { valid: false, error: \"文件太短，无法读取 PSD/PSB 头信息。\" };\n  }\n  const signature = new TextDecoder(\"ascii\").decode(bytes.slice(0, 4));\n  if (signature !== \"8BPS\") {\n    return { valid: false, signature, error: \"缺少 8BPS Photoshop 签名。\" };\n  }\n\n  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n  const version = view.getUint16(4, false);\n  if (version !== 1 && version !== 2) {\n    return { valid: false, signature, version, error: `未知 Photoshop 文件版本：${version}。` };\n  }\n\n  const reserved = bytes.slice(6, 12);\n  if (reserved.some((byte) => byte !== 0)) {\n    return { valid: false, signature, version, error: \"PSD/PSB 保留字段不为 0，文件头可能已损坏。\" };\n  }\n\n  return {\n    valid: true,\n    signature,\n    version,\n    channels: view.getUint16(12, false),\n    height: view.getUint32(14, false),\n    width: view.getUint32(18, false),\n    depth: view.getUint16(22, false),\n    colorMode: view.getUint16(24, false)\n  };\n}\n\ntype SqliteHeader = {\n  valid: boolean;\n  error?: string;\n  pageSize?: number;\n  writeVersion?: number;\n  readVersion?: number;\n  pageCount?: number;\n  schemaVersion?: number;\n  textEncoding?: number;\n  userVersion?: number;\n};\n\ntype SqliteSchemaEntry = {\n  type: string;\n  name: string;\n  tableName: string;\n  rootPage: number;\n  sql: string;\n};\n\ntype SqliteColumn = {\n  name: string;\n  type: string;\n  primaryKey: boolean;\n};\n\ntype SqliteTableSample = {\n  tableName: string;\n  rootPage: number;\n  columns: SqliteColumn[];\n  rows: Array<Array<string | number | null>>;\n  note?: string;\n};\n\nfunction createSqlitePreview(bytes: Uint8Array): HTMLElement {\n  const preview = document.createElement(\"div\");\n  preview.className = \"ofv-sqlite-preview\";\n  const heading = document.createElement(\"strong\");\n  heading.textContent = \"SQLite 结构\";\n  preview.append(heading);\n\n  const header = parseSqliteHeader(bytes);\n  if (!header.valid) {\n    const error = document.createElement(\"p\");\n    error.className = \"ofv-sqlite-error\";\n    error.textContent = header.error || \"不是有效的 SQLite 数据库文件。\";\n    preview.append(error);\n    return preview;\n  }\n  hideSupplementalInfo(heading);\n\n  const summary = document.createElement(\"div\");\n  summary.className = \"ofv-sqlite-summary\";\n  appendMeta(summary, \"页大小\", `${header.pageSize} B`);\n  appendMeta(summary, \"页数\", header.pageCount ?? \"未知\");\n  appendMeta(summary, \"读写版本\", `${sqliteJournalMode(header.readVersion)} / ${sqliteJournalMode(header.writeVersion)}`);\n  appendMeta(summary, \"Schema\", header.schemaVersion ?? \"未知\");\n  appendMeta(summary, \"编码\", sqliteEncoding(header.textEncoding));\n  appendMeta(summary, \"User version\", header.userVersion ?? 0);\n  hideSupplementalInfo(summary);\n  preview.append(summary);\n\n  const schema = parseSqliteSchema(bytes, header);\n  if (schema.length > 0) {\n    preview.append(createSqliteSchemaTable(schema));\n    const samples = createSqliteTableSamples(bytes, header, schema);\n    if (samples.length > 0) {\n      preview.append(createSqliteDataPreview(samples));\n    }\n  } else {\n    const empty = document.createElement(\"p\");\n    empty.className = \"ofv-sqlite-empty\";\n    empty.textContent = \"未从第一页 sqlite_schema 叶子页提取到结构定义；复杂数据库可后续接入 sqlite-wasm 完整读取。\";\n    preview.append(empty);\n  }\n\n  return preview;\n}\n\nfunction createSqliteTableSamples(bytes: Uint8Array, header: SqliteHeader, schema: SqliteSchemaEntry[]): SqliteTableSample[] {\n  return schema\n    .filter((entry) => entry.type === \"table\" && entry.rootPage > 0 && !entry.name.startsWith(\"sqlite_\"))\n    .slice(0, 6)\n    .map((entry) => parseSqliteTableSample(bytes, header, entry))\n    .filter((sample): sample is SqliteTableSample => Boolean(sample && (sample.rows.length > 0 || sample.note)));\n}\n\nfunction parseSqliteTableSample(bytes: Uint8Array, header: SqliteHeader, entry: SqliteSchemaEntry): SqliteTableSample | null {\n  const pageSize = header.pageSize || 0;\n  const pageIndex = entry.rootPage - 1;\n  const pageStart = pageIndex * pageSize;\n  if (pageSize <= 0 || pageStart < 0 || pageStart >= bytes.length) {\n    return null;\n  }\n  const pageHeader = pageStart + (entry.rootPage === 1 ? 100 : 0);\n  if (pageHeader + 8 > bytes.length) {\n    return null;\n  }\n  const columns = parseSqliteCreateTableColumns(entry.sql);\n  if (columns.length === 0) {\n    return null;\n  }\n  if (bytes[pageHeader] !== 0x0d) {\n    return {\n      tableName: entry.name,\n      rootPage: entry.rootPage,\n      columns,\n      rows: [],\n      note: \"当前只内置解析 SQLite table leaf page；索引页、溢出页或复杂 b-tree 可接入 sqlite-wasm 增强。\"\n    };\n  }\n  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n  const cellCount = view.getUint16(pageHeader + 3, false);\n  const rows: Array<Array<string | number | null>> = [];\n  const pageEnd = Math.min(bytes.length, pageStart + pageSize);\n  for (let index = 0; index < Math.min(cellCount, 80); index++) {\n    const pointerOffset = pageHeader + 8 + index * 2;\n    if (pointerOffset + 2 > pageEnd) {\n      break;\n    }\n    const cellOffset = pageStart + view.getUint16(pointerOffset, false);\n    const row = parseSqliteTableCell(bytes, cellOffset, pageEnd, columns);\n    if (row) {\n      rows.push(row);\n    }\n  }\n  return {\n    tableName: entry.name,\n    rootPage: entry.rootPage,\n    columns,\n    rows,\n    note: rows.length === 0 ? \"未从该表 root page 抽样到行数据。\" : undefined\n  };\n}\n\nfunction parseSqliteTableCell(\n  bytes: Uint8Array,\n  offset: number,\n  pageEnd: number,\n  columns: SqliteColumn[]\n): Array<string | number | null> | null {\n  try {\n    let cursor = offset;\n    const payloadLength = readSqliteVarint(bytes, cursor);\n    cursor = payloadLength.offset;\n    const rowId = readSqliteVarint(bytes, cursor);\n    cursor = rowId.offset;\n    const payloadEnd = Math.min(pageEnd, cursor + Number(payloadLength.value));\n    if (payloadEnd > bytes.length) {\n      return null;\n    }\n    const record = parseSqliteRecord(bytes, cursor, payloadEnd);\n    return columns.map((column, index) => {\n      const value = record[index] ?? null;\n      return value === null && column.primaryKey && /int/i.test(column.type) ? Number(rowId.value) : value;\n    });\n  } catch {\n    return null;\n  }\n}\n\nfunction parseSqliteCreateTableColumns(sql: string): SqliteColumn[] {\n  const start = sql.indexOf(\"(\");\n  const end = sql.lastIndexOf(\")\");\n  if (start < 0 || end <= start) {\n    return [];\n  }\n  return splitSqliteColumnDefinitions(sql.slice(start + 1, end))\n    .map(parseSqliteColumnDefinition)\n    .filter((column): column is SqliteColumn => Boolean(column));\n}\n\nfunction splitSqliteColumnDefinitions(value: string): string[] {\n  const result: string[] = [];\n  let current = \"\";\n  let depth = 0;\n  let quote = \"\";\n  for (let index = 0; index < value.length; index++) {\n    const char = value[index];\n    if (quote) {\n      current += char;\n      if (char === quote && value[index + 1] === quote) {\n        current += value[++index];\n      } else if (char === quote) {\n        quote = \"\";\n      }\n      continue;\n    }\n    if (char === \"'\" || char === \"\\\"\" || char === \"`\") {\n      quote = char;\n      current += char;\n      continue;\n    }\n    if (char === \"[\") {\n      quote = \"]\";\n      current += char;\n      continue;\n    }\n    if (char === \"(\") {\n      depth++;\n    } else if (char === \")\") {\n      depth = Math.max(0, depth - 1);\n    }\n    if (char === \",\" && depth === 0) {\n      result.push(current.trim());\n      current = \"\";\n    } else {\n      current += char;\n    }\n  }\n  if (current.trim()) {\n    result.push(current.trim());\n  }\n  return result;\n}\n\nfunction parseSqliteColumnDefinition(definition: string): SqliteColumn | null {\n  if (/^(?:constraint|primary|foreign|unique|check|key)\\b/i.test(definition)) {\n    return null;\n  }\n  const match = definition.match(/^(\"[^\"]+\"|'[^']+'|`[^`]+`|\\[[^\\]]+\\]|\\S+)(?:\\s+(.+))?$/);\n  if (!match) {\n    return null;\n  }\n  const name = unquoteSqliteIdentifier(match[1]);\n  const rest = match[2] || \"\";\n  const typeMatch = rest.match(/^([a-z0-9_]+(?:\\s+[a-z0-9_]+)?)/i);\n  return {\n    name,\n    type: typeMatch?.[1]?.toUpperCase() || \"ANY\",\n    primaryKey: /\\bprimary\\s+key\\b/i.test(rest)\n  };\n}\n\nfunction unquoteSqliteIdentifier(value: string): string {\n  if ((value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\")) || (value.startsWith(\"'\") && value.endsWith(\"'\")) || (value.startsWith(\"`\") && value.endsWith(\"`\"))) {\n    return value.slice(1, -1).replaceAll(value[0] + value[0], value[0]);\n  }\n  if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n    return value.slice(1, -1);\n  }\n  return value;\n}\n\nfunction parseSqliteHeader(bytes: Uint8Array): SqliteHeader {\n  if (bytes.length < 100) {\n    return { valid: false, error: \"文件太短，无法读取 SQLite 数据库头。\" };\n  }\n  const signature = new TextDecoder(\"ascii\").decode(bytes.slice(0, 16));\n  if (signature !== \"SQLite format 3\\0\") {\n    return { valid: false, error: \"缺少 SQLite format 3 文件签名。\" };\n  }\n\n  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n  const rawPageSize = view.getUint16(16, false);\n  const pageSize = rawPageSize === 1 ? 65536 : rawPageSize;\n  if (pageSize < 512 || pageSize > 65536 || (pageSize & (pageSize - 1)) !== 0) {\n    return { valid: false, error: `SQLite 页大小无效：${pageSize}。` };\n  }\n\n  return {\n    valid: true,\n    pageSize,\n    writeVersion: bytes[18],\n    readVersion: bytes[19],\n    pageCount: view.getUint32(28, false),\n    schemaVersion: view.getUint32(40, false),\n    textEncoding: view.getUint32(56, false),\n    userVersion: view.getUint32(60, false)\n  };\n}\n\nfunction parseSqliteSchema(bytes: Uint8Array, header: SqliteHeader): SqliteSchemaEntry[] {\n  const pageSize = header.pageSize || 0;\n  if (pageSize <= 0 || bytes.length < Math.min(pageSize, 100)) {\n    return [];\n  }\n  const pageStart = 0;\n  const btreeStart = 100;\n  if (bytes[btreeStart] !== 0x0d) {\n    return [];\n  }\n  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n  const cellCount = view.getUint16(btreeStart + 3, false);\n  const entries: SqliteSchemaEntry[] = [];\n  for (let index = 0; index < Math.min(cellCount, 80); index++) {\n    const pointerOffset = btreeStart + 8 + index * 2;\n    if (pointerOffset + 2 > bytes.length) {\n      break;\n    }\n    const cellOffset = pageStart + view.getUint16(pointerOffset, false);\n    const entry = parseSqliteSchemaCell(bytes, cellOffset, pageStart + pageSize);\n    if (entry) {\n      entries.push(entry);\n    }\n  }\n  return entries;\n}\n\nfunction parseSqliteSchemaCell(bytes: Uint8Array, offset: number, pageEnd: number): SqliteSchemaEntry | null {\n  try {\n    let cursor = offset;\n    const payloadLength = readSqliteVarint(bytes, cursor);\n    cursor = payloadLength.offset;\n    const rowId = readSqliteVarint(bytes, cursor);\n    cursor = rowId.offset;\n    const payloadEnd = Math.min(pageEnd, cursor + Number(payloadLength.value));\n    if (payloadEnd > bytes.length) {\n      return null;\n    }\n    const record = parseSqliteRecord(bytes, cursor, payloadEnd);\n    if (record.length < 5) {\n      return null;\n    }\n    return {\n      type: String(record[0] ?? \"\"),\n      name: String(record[1] ?? \"\"),\n      tableName: String(record[2] ?? \"\"),\n      rootPage: Number(record[3] ?? 0),\n      sql: String(record[4] ?? \"\")\n    };\n  } catch {\n    return null;\n  }\n}\n\nfunction parseSqliteRecord(bytes: Uint8Array, offset: number, end: number): Array<string | number | null> {\n  const headerSize = readSqliteVarint(bytes, offset);\n  let headerCursor = headerSize.offset;\n  const bodyStart = offset + Number(headerSize.value);\n  let bodyCursor = bodyStart;\n  const serialTypes: bigint[] = [];\n  while (headerCursor < bodyStart && headerCursor < end) {\n    const serial = readSqliteVarint(bytes, headerCursor);\n    serialTypes.push(serial.value);\n    headerCursor = serial.offset;\n  }\n  return serialTypes.map((serialType) => {\n    const value = readSqliteValue(bytes, bodyCursor, end, serialType);\n    bodyCursor = value.offset;\n    return value.value;\n  });\n}\n\nfunction readSqliteValue(\n  bytes: Uint8Array,\n  offset: number,\n  end: number,\n  serialType: bigint\n): { value: string | number | null; offset: number } {\n  const type = Number(serialType);\n  if (type === 0) {\n    return { value: null, offset };\n  }\n  if (type === 1) {\n    return { value: signedInteger(bytes, offset, 1), offset: offset + 1 };\n  }\n  if (type === 2) {\n    return { value: signedInteger(bytes, offset, 2), offset: offset + 2 };\n  }\n  if (type === 3) {\n    return { value: signedInteger(bytes, offset, 3), offset: offset + 3 };\n  }\n  if (type === 4) {\n    return { value: signedInteger(bytes, offset, 4), offset: offset + 4 };\n  }\n  if (type === 5) {\n    return { value: signedInteger(bytes, offset, 6), offset: offset + 6 };\n  }\n  if (type === 6) {\n    return { value: signedInteger(bytes, offset, 8), offset: offset + 8 };\n  }\n  if (type === 8) {\n    return { value: 0, offset };\n  }\n  if (type === 9) {\n    return { value: 1, offset };\n  }\n  if (type >= 12) {\n    const length = Math.floor((type - 12) / 2);\n    const valueEnd = Math.min(end, offset + length);\n    if (type % 2 === 1) {\n      return { value: new TextDecoder().decode(bytes.slice(offset, valueEnd)), offset: offset + length };\n    }\n    return { value: `<blob ${length} B>`, offset: offset + length };\n  }\n  return { value: null, offset };\n}\n\nfunction readSqliteVarint(bytes: Uint8Array, offset: number): { value: bigint; offset: number } {\n  let value = 0n;\n  for (let index = 0; index < 9; index++) {\n    if (offset >= bytes.length) {\n      throw new Error(\"SQLite varint 数据不完整。\");\n    }\n    const byte = bytes[offset++];\n    if (index === 8) {\n      value = (value << 8n) | BigInt(byte);\n      return { value, offset };\n    }\n    value = (value << 7n) | BigInt(byte & 0x7f);\n    if ((byte & 0x80) === 0) {\n      return { value, offset };\n    }\n  }\n  return { value, offset };\n}\n\nfunction signedInteger(bytes: Uint8Array, offset: number, length: number): number {\n  let value = 0n;\n  for (let index = 0; index < length; index++) {\n    value = (value << 8n) | BigInt(bytes[offset + index] || 0);\n  }\n  const bits = BigInt(length * 8);\n  const signBit = 1n << (bits - 1n);\n  if ((value & signBit) !== 0n) {\n    value -= 1n << bits;\n  }\n  return Number(value);\n}\n\nfunction createSqliteSchemaTable(entries: SqliteSchemaEntry[]): HTMLElement {\n  const wrapper = document.createElement(\"div\");\n  wrapper.className = \"ofv-sqlite-schema\";\n  const title = document.createElement(\"strong\");\n  title.textContent = `Schema 对象 ${entries.length}`;\n  const table = document.createElement(\"table\");\n  const thead = document.createElement(\"thead\");\n  const header = document.createElement(\"tr\");\n  for (const label of [\"类型\", \"名称\", \"表\", \"Root\", \"SQL\"]) {\n    const th = document.createElement(\"th\");\n    th.textContent = label;\n    header.append(th);\n  }\n  thead.append(header);\n  const tbody = document.createElement(\"tbody\");\n  for (const entry of entries) {\n    const row = document.createElement(\"tr\");\n    for (const value of [entry.type, entry.name, entry.tableName, String(entry.rootPage), entry.sql]) {\n      const cell = document.createElement(\"td\");\n      cell.textContent = value;\n      row.append(cell);\n    }\n    tbody.append(row);\n  }\n  table.append(thead, tbody);\n  wrapper.append(title, table);\n  return wrapper;\n}\n\nfunction createSqliteDataPreview(samples: SqliteTableSample[]): HTMLElement {\n  const wrapper = document.createElement(\"div\");\n  wrapper.className = \"ofv-sqlite-data\";\n  const title = document.createElement(\"strong\");\n  title.textContent = \"表数据抽样\";\n  wrapper.append(title);\n\n  for (const sample of samples) {\n    const details = document.createElement(\"details\");\n    details.className = \"ofv-sqlite-table-sample\";\n    details.open = true;\n    const summary = document.createElement(\"summary\");\n    summary.textContent = `${sample.tableName} · root ${sample.rootPage} · ${sample.rows.length} 行`;\n    details.append(summary);\n\n    if (sample.note) {\n      const note = document.createElement(\"p\");\n      note.className = \"ofv-sqlite-empty\";\n      note.textContent = sample.note;\n      details.append(note);\n    }\n\n    if (sample.rows.length > 0) {\n      const scroller = document.createElement(\"div\");\n      scroller.className = \"ofv-sqlite-data-table\";\n      const table = document.createElement(\"table\");\n      const thead = document.createElement(\"thead\");\n      const headRow = document.createElement(\"tr\");\n      for (const column of sample.columns) {\n        const th = document.createElement(\"th\");\n        th.textContent = column.name;\n        if (column.type) {\n          th.title = column.primaryKey ? `${column.type} PRIMARY KEY` : column.type;\n        }\n        headRow.append(th);\n      }\n      thead.append(headRow);\n      const tbody = document.createElement(\"tbody\");\n      for (const row of sample.rows) {\n        const tr = document.createElement(\"tr\");\n        for (const value of row) {\n          const td = document.createElement(\"td\");\n          td.textContent = value === null ? \"NULL\" : String(value);\n          tr.append(td);\n        }\n        tbody.append(tr);\n      }\n      table.append(thead, tbody);\n      scroller.append(table);\n      details.append(scroller);\n    }\n    wrapper.append(details);\n  }\n\n  return wrapper;\n}\n\nfunction sqliteJournalMode(value?: number): string {\n  if (value === 1) {\n    return \"rollback\";\n  }\n  if (value === 2) {\n    return \"WAL\";\n  }\n  return value === undefined ? \"未知\" : String(value);\n}\n\nfunction sqliteEncoding(value?: number): string {\n  const encodings: Record<number, string> = {\n    0: \"未声明\",\n    1: \"UTF-8\",\n    2: \"UTF-16le\",\n    3: \"UTF-16be\"\n  };\n  return value === undefined ? \"未知\" : encodings[value] || `未知 (${value})`;\n}\n\ntype ParquetPreview = {\n  valid: boolean;\n  error?: string;\n  footerLength?: number;\n  footerOffset?: number;\n  dataBytes?: number;\n};\n\nfunction createParquetPreview(bytes: Uint8Array): HTMLElement {\n  const preview = document.createElement(\"div\");\n  preview.className = \"ofv-data-preview\";\n  const heading = document.createElement(\"strong\");\n  heading.textContent = \"Parquet 结构\";\n  preview.append(heading);\n\n  const parsed = parseParquet(bytes);\n  if (!parsed.valid) {\n    const error = document.createElement(\"p\");\n    error.className = \"ofv-data-error\";\n    error.textContent = parsed.error || \"不是有效的 Parquet 文件。\";\n    preview.append(error);\n    return preview;\n  }\n\n  const summary = document.createElement(\"div\");\n  summary.className = \"ofv-data-summary\";\n  appendMeta(summary, \"Magic\", \"PAR1\");\n  appendMeta(summary, \"Footer\", `${parsed.footerLength} B`);\n  appendMeta(summary, \"Footer offset\", `0x${(parsed.footerOffset || 0).toString(16).toUpperCase()}`);\n  appendMeta(summary, \"数据区\", formatBytes(parsed.dataBytes || 0));\n  hideSupplementalInfo(summary);\n  preview.append(summary);\n\n  const note = document.createElement(\"p\");\n  note.className = \"ofv-data-note\";\n  note.textContent = \"Parquet footer 使用 Thrift 编码；正在尝试在浏览器端解析 schema、row group 和前几行数据。\";\n  hideSupplementalInfo(note);\n  preview.append(note);\n  void appendParquetDecodedPreview(preview, bytes, note, heading);\n  return preview;\n}\n\nasync function appendParquetDecodedPreview(\n  preview: HTMLElement,\n  bytes: Uint8Array,\n  note: HTMLElement,\n  heading: HTMLElement\n): Promise<void> {\n  try {\n    const { parquetMetadataAsync, parquetReadObjects, parquetSchema } = await import(\"hyparquet\");\n    const file = arrayBufferLike(bytes);\n    const metadata = await parquetMetadataAsync(file, { initialFetchSize: Math.min(bytes.byteLength, 512 * 1024) });\n    const schema = parquetSchema(metadata);\n    const fields = flattenParquetSchema(schema);\n    const rows = await parquetReadObjects({\n      file,\n      metadata,\n      rowFormat: \"object\",\n      rowStart: 0,\n      rowEnd: Math.min(20, Number(metadata.num_rows || 0n))\n    });\n\n    note.textContent = `已使用 hyparquet 在前端解析 schema、${metadata.row_groups.length} 个 row group 和 ${rows.length} 行抽样数据。`;\n    if (rows.length > 0) {\n      hideSupplementalInfo(heading);\n      const schemaTable = createParquetSchemaTable(fields, metadata);\n      hideSupplementalInfo(schemaTable);\n      preview.append(schemaTable);\n      preview.append(createObjectRowsTable(\"记录抽样\", rows));\n    } else {\n      preview.append(createParquetSchemaTable(fields, metadata));\n    }\n  } catch (error) {\n    note.textContent = `已展示 Parquet 容器边界；schema/记录解析失败：${error instanceof Error ? error.message : \"当前编码或压缩方式暂不支持。\"}`;\n  }\n}\n\nfunction arrayBufferLike(bytes: Uint8Array): { byteLength: number; slice(start: number, end?: number): ArrayBuffer } {\n  return {\n    byteLength: bytes.byteLength,\n    slice(start: number, end?: number) {\n      return bytes.buffer.slice(bytes.byteOffset + start, bytes.byteOffset + (end ?? bytes.byteLength)) as ArrayBuffer;\n    }\n  };\n}\n\ntype ParquetSchemaNode = {\n  element?: { name?: string; type?: string; repetition_type?: string; converted_type?: string; logical_type?: { type?: string } };\n  path?: string[];\n  children?: ParquetSchemaNode[];\n};\n\nfunction flattenParquetSchema(schema: ParquetSchemaNode): Array<{ name: string; type: string; repetition: string; logical: string }> {\n  const fields: Array<{ name: string; type: string; repetition: string; logical: string }> = [];\n  const visit = (node: ParquetSchemaNode) => {\n    const path = Array.isArray(node.path) && node.path.length > 0 ? node.path.join(\".\") : node.element?.name || \"\";\n    if (node.element && path) {\n      fields.push({\n        name: path,\n        type: node.element.type || (node.children?.length ? \"group\" : \"-\"),\n        repetition: node.element.repetition_type || \"-\",\n        logical: node.element.logical_type?.type || node.element.converted_type || \"-\"\n      });\n    }\n    for (const child of node.children || []) {\n      visit(child);\n    }\n  };\n  for (const child of schema.children || []) {\n    visit(child);\n  }\n  return fields;\n}\n\nfunction createParquetSchemaTable(\n  fields: Array<{ name: string; type: string; repetition: string; logical: string }>,\n  metadata: { num_rows: bigint; row_groups: unknown[]; created_by?: string }\n): HTMLElement {\n  const wrapper = document.createElement(\"div\");\n  wrapper.className = \"ofv-parquet-schema\";\n  const title = document.createElement(\"strong\");\n  title.textContent = \"Schema\";\n  const summary = document.createElement(\"div\");\n  summary.className = \"ofv-data-summary\";\n  appendMeta(summary, \"Rows\", String(metadata.num_rows));\n  appendMeta(summary, \"Row groups\", metadata.row_groups.length);\n  appendMeta(summary, \"Columns\", fields.filter((field) => field.type !== \"group\").length);\n  if (metadata.created_by) {\n    appendMeta(summary, \"Created by\", metadata.created_by);\n  }\n  hideSupplementalInfo(summary);\n\n  const table = document.createElement(\"table\");\n  const head = document.createElement(\"thead\");\n  const headRow = document.createElement(\"tr\");\n  for (const label of [\"Name\", \"Type\", \"Repetition\", \"Logical\"]) {\n    const th = document.createElement(\"th\");\n    th.textContent = label;\n    headRow.append(th);\n  }\n  head.append(headRow);\n  const body = document.createElement(\"tbody\");\n  for (const field of fields.slice(0, 120)) {\n    const row = document.createElement(\"tr\");\n    for (const value of [field.name, field.type, field.repetition, field.logical]) {\n      const cell = document.createElement(\"td\");\n      cell.textContent = value;\n      row.append(cell);\n    }\n    body.append(row);\n  }\n  table.append(head, body);\n  wrapper.append(title, summary, table);\n  return wrapper;\n}\n\nfunction createObjectRowsTable(titleText: string, rows: Record<string, unknown>[]): HTMLElement {\n  const wrapper = document.createElement(\"div\");\n  wrapper.className = \"ofv-parquet-records\";\n  const title = document.createElement(\"strong\");\n  title.textContent = `${titleText} ${rows.length}`;\n  const columns = [...new Set(rows.flatMap((row) => Object.keys(row)))].slice(0, 40);\n  const table = document.createElement(\"table\");\n  const head = document.createElement(\"thead\");\n  const headRow = document.createElement(\"tr\");\n  for (const column of columns) {\n    const th = document.createElement(\"th\");\n    th.textContent = column;\n    headRow.append(th);\n  }\n  head.append(headRow);\n  const body = document.createElement(\"tbody\");\n  for (const item of rows) {\n    const row = document.createElement(\"tr\");\n    for (const column of columns) {\n      const cell = document.createElement(\"td\");\n      cell.textContent = formatPreviewValue(item[column]);\n      row.append(cell);\n    }\n    body.append(row);\n  }\n  table.append(head, body);\n  wrapper.append(title, table);\n  return wrapper;\n}\n\nfunction formatPreviewValue(value: unknown): string {\n  if (value === null || value === undefined) {\n    return \"\";\n  }\n  if (typeof value === \"bigint\") {\n    return value.toString();\n  }\n  if (value instanceof Uint8Array) {\n    return `Uint8Array(${value.byteLength})`;\n  }\n  if (value instanceof Date) {\n    return value.toISOString();\n  }\n  if (typeof value === \"object\") {\n    try {\n      return JSON.stringify(value);\n    } catch {\n      return Object.prototype.toString.call(value);\n    }\n  }\n  return String(value);\n}\n\nfunction parseParquet(bytes: Uint8Array): ParquetPreview {\n  if (bytes.length < 12) {\n    return { valid: false, error: \"文件太短，无法读取 Parquet 头尾信息。\" };\n  }\n  if (asciiAt(bytes, 0, 4) !== \"PAR1\" || asciiAt(bytes, bytes.length - 4, 4) !== \"PAR1\") {\n    return { valid: false, error: \"缺少 Parquet PAR1 magic header/footer。\" };\n  }\n  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n  const footerLength = view.getUint32(bytes.length - 8, true);\n  const footerOffset = bytes.length - 8 - footerLength;\n  if (footerOffset < 4) {\n    return { valid: false, error: \"Parquet footer 长度超过文件边界。\" };\n  }\n  return {\n    valid: true,\n    footerLength,\n    footerOffset,\n    dataBytes: Math.max(0, footerOffset - 4)\n  };\n}\n\ntype AvroMetadata = {\n  key: string;\n  value: string;\n};\n\ntype AvroValue = string | number | boolean | null;\n\ntype AvroFieldSchema = {\n  name: string;\n  type: unknown;\n  label: string;\n};\n\ntype AvroPreview = {\n  valid: boolean;\n  error?: string;\n  metadata: AvroMetadata[];\n  schema?: {\n    type?: string;\n    name?: string;\n    namespace?: string;\n    fields: string[];\n    fieldSchemas: AvroFieldSchema[];\n  };\n  codec?: string;\n  syncMarker?: string;\n  records?: {\n    fields: string[];\n    rows: AvroValue[][];\n    note?: string;\n  };\n};\n\nfunction createAvroPreview(bytes: Uint8Array): HTMLElement {\n  const preview = document.createElement(\"div\");\n  preview.className = \"ofv-data-preview\";\n  const heading = document.createElement(\"strong\");\n  heading.textContent = \"Avro 结构\";\n  preview.append(heading);\n\n  const parsed = parseAvro(bytes);\n  if (!parsed.valid) {\n    const error = document.createElement(\"p\");\n    error.className = \"ofv-data-error\";\n    error.textContent = parsed.error || \"不是有效的 Avro Object Container 文件。\";\n    preview.append(error);\n    return preview;\n  }\n\n  const summary = document.createElement(\"div\");\n  summary.className = \"ofv-data-summary\";\n  appendMeta(summary, \"Magic\", \"Obj\\\\x01\");\n  appendMeta(summary, \"Codec\", parsed.codec || \"null\");\n  appendMeta(summary, \"Metadata\", parsed.metadata.length);\n  appendMeta(summary, \"Sync marker\", parsed.syncMarker || \"未知\");\n  hideSupplementalInfo(summary);\n    preview.append(summary);\n\n  const hasRecordRows = Boolean(parsed.records && parsed.records.rows.length > 0);\n  if (hasRecordRows) {\n    hideSupplementalInfo(heading);\n  }\n\n  if (parsed.schema) {\n    const schema = document.createElement(\"div\");\n    schema.className = \"ofv-avro-schema\";\n    const title = document.createElement(\"strong\");\n    title.textContent = \"Schema\";\n    const meta = document.createElement(\"div\");\n    meta.className = \"ofv-data-summary\";\n    appendMeta(meta, \"类型\", parsed.schema.type || \"未知\");\n    appendMeta(meta, \"名称\", [parsed.schema.namespace, parsed.schema.name].filter(Boolean).join(\".\") || \"未知\");\n    appendMeta(meta, \"字段\", parsed.schema.fields.length);\n    hideSupplementalInfo(meta);\n    schema.append(title, meta);\n    if (parsed.schema.fields.length > 0) {\n      const list = document.createElement(\"ul\");\n      for (const field of parsed.schema.fields.slice(0, 80)) {\n        const item = document.createElement(\"li\");\n        item.textContent = field;\n        list.append(item);\n      }\n      schema.append(list);\n    }\n    if (hasRecordRows) {\n      hideSupplementalInfo(schema);\n    }\n    preview.append(schema);\n  }\n\n  if (parsed.records && (parsed.records.rows.length > 0 || parsed.records.note)) {\n    preview.append(createAvroRecordPreview(parsed.records));\n  }\n\n  if (parsed.metadata.length > 0) {\n    const metadata = createKeyValueTable(\"Metadata\", parsed.metadata);\n    if (parsed.schema || hasRecordRows) {\n      hideSupplementalInfo(metadata);\n    }\n    preview.append(metadata);\n  }\n\n  return preview;\n}\n\nfunction parseAvro(bytes: Uint8Array): AvroPreview {\n  if (bytes.length < 4 || bytes[0] !== 0x4f || bytes[1] !== 0x62 || bytes[2] !== 0x6a || bytes[3] !== 0x01) {\n    return { valid: false, error: \"缺少 Avro Object Container magic header。\", metadata: [] };\n  }\n  let offset = 4;\n  const metadata: AvroMetadata[] = [];\n  try {\n    while (true) {\n      const blockCount = readAvroLong(bytes, offset);\n      offset = blockCount.offset;\n      let count = blockCount.value;\n      if (count === 0n) {\n        break;\n      }\n      if (count < 0n) {\n        count = -count;\n        const blockSize = readAvroLong(bytes, offset);\n        offset = blockSize.offset;\n      }\n      for (let index = 0; index < Number(count); index++) {\n        const key = readAvroBytes(bytes, offset);\n        offset = key.offset;\n        const value = readAvroBytes(bytes, offset);\n        offset = value.offset;\n        metadata.push({\n          key: new TextDecoder().decode(key.value),\n          value: decodeAvroMetadataValue(key.value, value.value)\n        });\n      }\n    }\n    if (offset + 16 > bytes.length) {\n      throw new Error(\"Avro sync marker 缺失。\");\n    }\n    const syncMarkerBytes = bytes.slice(offset, offset + 16);\n    const syncMarker = Array.from(syncMarkerBytes)\n      .map((byte) => byte.toString(16).padStart(2, \"0\"))\n      .join(\"\");\n    const schemaText = metadata.find((item) => item.key === \"avro.schema\")?.value;\n    const codec = metadata.find((item) => item.key === \"avro.codec\")?.value;\n    const schema = schemaText ? summarizeAvroSchema(schemaText) : undefined;\n    return {\n      valid: true,\n      metadata,\n      codec,\n      syncMarker,\n      schema,\n      records: schemaText ? parseAvroRecordSamples(bytes, offset + 16, syncMarkerBytes, schemaText, codec) : undefined\n    };\n  } catch (error) {\n    return {\n      valid: false,\n      error: error instanceof Error ? error.message : \"Avro metadata 解析失败。\",\n      metadata\n    };\n  }\n}\n\nfunction readAvroLong(bytes: Uint8Array, offset: number): { value: bigint; offset: number } {\n  let result = 0n;\n  let shift = 0n;\n  for (let index = 0; index < 10; index++) {\n    if (offset >= bytes.length) {\n      throw new Error(\"Avro long 数据不完整。\");\n    }\n    const byte = bytes[offset++];\n    result |= BigInt(byte & 0x7f) << shift;\n    if ((byte & 0x80) === 0) {\n      const value = (result >> 1n) ^ -(result & 1n);\n      return { value, offset };\n    }\n    shift += 7n;\n  }\n  throw new Error(\"Avro long 数据过长。\");\n}\n\nfunction readAvroBytes(bytes: Uint8Array, offset: number): { value: Uint8Array; offset: number } {\n  const length = readAvroLong(bytes, offset);\n  offset = length.offset;\n  if (length.value < 0n) {\n    throw new Error(\"Avro bytes 长度无效。\");\n  }\n  const size = Number(length.value);\n  const end = offset + size;\n  if (end > bytes.length) {\n    throw new Error(\"Avro bytes 超出文件边界。\");\n  }\n  return { value: bytes.slice(offset, end), offset: end };\n}\n\nfunction decodeAvroMetadataValue(keyBytes: Uint8Array, valueBytes: Uint8Array): string {\n  const key = new TextDecoder().decode(keyBytes);\n  if (key === \"avro.schema\" || key === \"avro.codec\" || /^[a-z0-9_.-]+$/i.test(key)) {\n    return new TextDecoder().decode(valueBytes);\n  }\n  return `<${valueBytes.length} B>`;\n}\n\nfunction summarizeAvroSchema(schemaText: string): AvroPreview[\"schema\"] {\n  try {\n    const schema = JSON.parse(schemaText) as {\n      type?: string;\n      name?: string;\n      namespace?: string;\n      fields?: Array<{ name?: string; type?: unknown }>;\n    };\n    const fieldSchemas = Array.isArray(schema.fields)\n      ? schema.fields\n          .filter((field) => typeof field.name === \"string\")\n          .map((field) => ({\n            name: field.name as string,\n            type: field.type,\n            label: `${field.name}: ${formatAvroType(field.type)}`\n          }))\n      : [];\n    return {\n      type: typeof schema.type === \"string\" ? schema.type : undefined,\n      name: typeof schema.name === \"string\" ? schema.name : undefined,\n      namespace: typeof schema.namespace === \"string\" ? schema.namespace : undefined,\n      fields: fieldSchemas.map((field) => field.label),\n      fieldSchemas\n    };\n  } catch {\n    return { fields: [], fieldSchemas: [] };\n  }\n}\n\nfunction parseAvroRecordSamples(\n  bytes: Uint8Array,\n  offset: number,\n  syncMarker: Uint8Array,\n  schemaText: string,\n  codec?: string\n): AvroPreview[\"records\"] | undefined {\n  if (codec && codec !== \"null\") {\n    return { fields: [], rows: [], note: `当前内置抽样只支持 null codec；该文件使用 ${codec} 压缩。` };\n  }\n  const schema = summarizeAvroSchema(schemaText);\n  const fields = schema?.fieldSchemas || [];\n  if (!schema || schema.type !== \"record\" || fields.length === 0) {\n    return undefined;\n  }\n  const rows: AvroValue[][] = [];\n  try {\n    while (offset < bytes.length && rows.length < 80) {\n      const countInfo = readAvroLong(bytes, offset);\n      offset = countInfo.offset;\n      if (countInfo.value === 0n) {\n        break;\n      }\n      const blockSizeInfo = readAvroLong(bytes, offset);\n      offset = blockSizeInfo.offset;\n      const count = Number(countInfo.value < 0n ? -countInfo.value : countInfo.value);\n      const blockSize = Number(blockSizeInfo.value);\n      const blockEnd = offset + blockSize;\n      if (!Number.isFinite(count) || !Number.isFinite(blockSize) || blockSize < 0 || blockEnd > bytes.length) {\n        throw new Error(\"Avro data block 超出文件边界。\");\n      }\n      for (let index = 0; index < count && offset < blockEnd && rows.length < 80; index++) {\n        const decoded = readAvroRecord(bytes, offset, blockEnd, fields);\n        offset = decoded.offset;\n        rows.push(decoded.row);\n      }\n      offset = blockEnd;\n      if (offset + syncMarker.length <= bytes.length && matchesBytes(bytes, offset, syncMarker)) {\n        offset += syncMarker.length;\n      }\n    }\n  } catch (error) {\n    return {\n      fields: fields.map((field) => field.name),\n      rows,\n      note: rows.length > 0\n        ? `已抽样部分记录，后续数据解析失败：${error instanceof Error ? error.message : \"未知错误\"}`\n        : `记录抽样失败：${error instanceof Error ? error.message : \"当前 schema 暂不支持\"}`\n    };\n  }\n  return rows.length > 0 ? { fields: fields.map((field) => field.name), rows } : undefined;\n}\n\nfunction readAvroRecord(\n  bytes: Uint8Array,\n  offset: number,\n  end: number,\n  fields: AvroFieldSchema[]\n): { row: AvroValue[]; offset: number } {\n  const row: AvroValue[] = [];\n  for (const field of fields) {\n    const value = readAvroDatum(bytes, offset, end, field.type);\n    row.push(value.value);\n    offset = value.offset;\n  }\n  return { row, offset };\n}\n\nfunction readAvroDatum(bytes: Uint8Array, offset: number, end: number, type: unknown): { value: AvroValue; offset: number } {\n  if (Array.isArray(type)) {\n    const branch = readAvroLong(bytes, offset);\n    const branchIndex = Number(branch.value);\n    const branchType = type[branchIndex];\n    if (branchIndex < 0 || branchIndex >= type.length) {\n      throw new Error(\"Avro union 分支索引无效。\");\n    }\n    return readAvroDatum(bytes, branch.offset, end, branchType);\n  }\n  if (type && typeof type === \"object\") {\n    const typed = type as { type?: unknown };\n    return readAvroDatum(bytes, offset, end, typed.type);\n  }\n  if (type === \"null\") {\n    return { value: null, offset };\n  }\n  if (type === \"boolean\") {\n    if (offset >= end) {\n      throw new Error(\"Avro boolean 数据不完整。\");\n    }\n    return { value: bytes[offset] !== 0, offset: offset + 1 };\n  }\n  if (type === \"int\" || type === \"long\") {\n    const value = readAvroLong(bytes, offset);\n    return { value: Number(value.value), offset: value.offset };\n  }\n  if (type === \"float\") {\n    if (offset + 4 > end) {\n      throw new Error(\"Avro float 数据不完整。\");\n    }\n    return { value: new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength).getFloat32(offset, true), offset: offset + 4 };\n  }\n  if (type === \"double\") {\n    if (offset + 8 > end) {\n      throw new Error(\"Avro double 数据不完整。\");\n    }\n    return { value: new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength).getFloat64(offset, true), offset: offset + 8 };\n  }\n  if (type === \"string\") {\n    const value = readAvroBytes(bytes, offset);\n    if (value.offset > end) {\n      throw new Error(\"Avro string 超出 block 边界。\");\n    }\n    return { value: new TextDecoder().decode(value.value), offset: value.offset };\n  }\n  if (type === \"bytes\") {\n    const value = readAvroBytes(bytes, offset);\n    if (value.offset > end) {\n      throw new Error(\"Avro bytes 超出 block 边界。\");\n    }\n    return { value: `<bytes ${value.value.length} B>`, offset: value.offset };\n  }\n  throw new Error(`暂不支持 Avro 字段类型 ${formatAvroType(type)}。`);\n}\n\nfunction matchesBytes(bytes: Uint8Array, offset: number, expected: Uint8Array): boolean {\n  for (let index = 0; index < expected.length; index++) {\n    if (bytes[offset + index] !== expected[index]) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction createAvroRecordPreview(records: NonNullable<AvroPreview[\"records\"]>): HTMLElement {\n  const wrapper = document.createElement(\"div\");\n  wrapper.className = \"ofv-avro-records\";\n  const title = document.createElement(\"strong\");\n  title.textContent = `记录抽样 ${records.rows.length}`;\n  wrapper.append(title);\n  if (records.note) {\n    const note = document.createElement(\"p\");\n    note.className = \"ofv-data-note\";\n    note.textContent = records.note;\n    wrapper.append(note);\n  }\n  if (records.rows.length === 0) {\n    return wrapper;\n  }\n  const table = document.createElement(\"table\");\n  const thead = document.createElement(\"thead\");\n  const headRow = document.createElement(\"tr\");\n  for (const field of records.fields) {\n    const th = document.createElement(\"th\");\n    th.textContent = field;\n    headRow.append(th);\n  }\n  thead.append(headRow);\n  const tbody = document.createElement(\"tbody\");\n  for (const row of records.rows) {\n    const tr = document.createElement(\"tr\");\n    for (const value of row) {\n      const td = document.createElement(\"td\");\n      td.textContent = value === null ? \"NULL\" : String(value);\n      tr.append(td);\n    }\n    tbody.append(tr);\n  }\n  table.append(thead, tbody);\n  wrapper.append(table);\n  return wrapper;\n}\n\nfunction formatAvroType(type: unknown): string {\n  if (typeof type === \"string\") {\n    return type;\n  }\n  if (Array.isArray(type)) {\n    return type.map(formatAvroType).join(\" | \");\n  }\n  if (type && typeof type === \"object\") {\n    const value = type as { type?: unknown; name?: unknown; items?: unknown; values?: unknown };\n    if (typeof value.name === \"string\") {\n      return value.name;\n    }\n    if (value.type === \"array\") {\n      return `array<${formatAvroType(value.items)}>`;\n    }\n    if (value.type === \"map\") {\n      return `map<${formatAvroType(value.values)}>`;\n    }\n    return formatAvroType(value.type);\n  }\n  return \"unknown\";\n}\n\nfunction createKeyValueTable(titleText: string, rows: AvroMetadata[]): HTMLElement {\n  const wrapper = document.createElement(\"div\");\n  wrapper.className = \"ofv-data-kv\";\n  const title = document.createElement(\"strong\");\n  title.textContent = titleText;\n  const table = document.createElement(\"table\");\n  const tbody = document.createElement(\"tbody\");\n  for (const row of rows.slice(0, 80)) {\n    const tr = document.createElement(\"tr\");\n    const key = document.createElement(\"th\");\n    key.textContent = row.key;\n    const value = document.createElement(\"td\");\n    value.textContent = row.value;\n    tr.append(key, value);\n    tbody.append(tr);\n  }\n  table.append(tbody);\n  wrapper.append(title, table);\n  return wrapper;\n}\n\ntype PlistValue =\n  | string\n  | Uint8Array\n  | PlistValue[]\n  | { [key: string]: PlistValue }\n  | boolean\n  | number\n  | null;\n\ntype WebArchivePreview = {\n  valid: boolean;\n  error?: string;\n  binary?: boolean;\n  url?: string;\n  mimeType?: string;\n  encoding?: string;\n  mainBytes?: number;\n  subresources?: number;\n  subframeArchives?: number;\n  snippet?: string;\n};\n\nfunction createWebArchivePreview(bytes: Uint8Array): HTMLElement {\n  const preview = document.createElement(\"div\");\n  preview.className = \"ofv-data-preview ofv-webarchive-preview\";\n  const heading = document.createElement(\"strong\");\n  heading.textContent = \"WebArchive 结构\";\n  preview.append(heading);\n\n  const parsed = parseWebArchive(bytes);\n  if (!parsed.valid) {\n    const error = document.createElement(\"p\");\n    error.className = \"ofv-data-error\";\n    error.textContent = parsed.error || \"不是有效的 WebArchive plist。\";\n    preview.append(error);\n    return preview;\n  }\n\n  const summary = document.createElement(\"div\");\n  summary.className = \"ofv-data-summary\";\n  appendMeta(summary, \"格式\", parsed.binary ? \"Binary plist\" : \"XML plist\");\n  appendMeta(summary, \"主资源\", parsed.url || \"未声明\");\n  appendMeta(summary, \"MIME\", parsed.mimeType || \"未知\");\n  appendMeta(summary, \"编码\", parsed.encoding || \"未声明\");\n  appendMeta(summary, \"主资源大小\", parsed.mainBytes !== undefined ? formatBytes(parsed.mainBytes) : \"未知\");\n  appendMeta(summary, \"子资源\", String(parsed.subresources ?? 0));\n  appendMeta(summary, \"子归档\", String(parsed.subframeArchives ?? 0));\n  hideSupplementalInfo(summary);\n  preview.append(summary);\n\n  if (parsed.binary) {\n    const note = document.createElement(\"p\");\n    note.className = \"ofv-data-note\";\n    note.textContent = parsed.snippet\n      ? \"已在浏览器端解析 binary plist WebArchive，并展开主资源摘要。\"\n      : \"已识别 binary plist WebArchive；当前文件未提取到可展示的主资源片段。\";\n    hideSupplementalInfo(note);\n    preview.append(note);\n  }\n\n  if (parsed.snippet) {\n    hideSupplementalInfo(heading);\n    const snippet = document.createElement(\"pre\");\n    snippet.className = \"ofv-text-block ofv-webarchive-snippet\";\n    snippet.textContent = parsed.snippet;\n    preview.append(snippet);\n  }\n  return preview;\n}\n\nfunction parseWebArchive(bytes: Uint8Array): WebArchivePreview {\n  if (bytes.length >= 8 && asciiAt(bytes, 0, 8) === \"bplist00\") {\n    return parseBinaryWebArchive(bytes);\n  }\n\n  const text = new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes.slice(0, Math.min(bytes.length, 1024 * 1024)));\n  if (!/<plist[\\s>]/i.test(text) || !text.includes(\"WebMainResource\")) {\n    return { valid: false, error: \"缺少 XML plist 或 WebMainResource 标记。\" };\n  }\n  if (typeof DOMParser === \"undefined\") {\n    return { valid: false, error: \"当前环境缺少 DOMParser，无法解析 XML WebArchive。\" };\n  }\n\n  const documentXml = new DOMParser().parseFromString(text, \"application/xml\");\n  if (documentXml.querySelector(\"parsererror\")) {\n    return { valid: false, error: \"XML plist 解析失败。\" };\n  }\n  const rootDict = Array.from(documentXml.documentElement.children).find((child) => child.tagName === \"dict\");\n  if (!rootDict) {\n    return { valid: false, error: \"XML plist 缺少根 dict。\" };\n  }\n\n  const plist = parsePlistElement(rootDict);\n  if (!isPlistDict(plist)) {\n    return { valid: false, error: \"XML plist 根节点不是 dict。\" };\n  }\n  return webArchivePreviewFromPlist(plist);\n}\n\nfunction parseBinaryWebArchive(bytes: Uint8Array): WebArchivePreview {\n  const plist = parseBinaryPlist(bytes);\n  if (!plist.valid) {\n    return { valid: true, binary: true, error: plist.error };\n  }\n  if (!isPlistDict(plist.value)) {\n    return { valid: true, binary: true, error: \"Binary plist 根节点不是 dict。\" };\n  }\n  return webArchivePreviewFromPlist(plist.value, true);\n}\n\nfunction webArchivePreviewFromPlist(plist: { [key: string]: PlistValue }, binary = false): WebArchivePreview {\n  const mainResource = plist.WebMainResource;\n  if (!isPlistDict(mainResource)) {\n    return { valid: false, binary, error: \"WebArchive 缺少 WebMainResource dict。\" };\n  }\n\n  const resourceData = mainResource.WebResourceData;\n  const mimeType = plistString(mainResource.WebResourceMIMEType);\n  const mainBytes = resourceData instanceof Uint8Array ? resourceData.length : undefined;\n  return {\n    valid: true,\n    binary,\n    url: plistString(mainResource.WebResourceURL),\n    mimeType,\n    encoding: plistString(mainResource.WebResourceTextEncodingName),\n    mainBytes,\n    subresources: Array.isArray(plist.WebSubresources) ? plist.WebSubresources.length : 0,\n    subframeArchives: Array.isArray(plist.WebSubframeArchives) ? plist.WebSubframeArchives.length : 0,\n    snippet: createWebArchiveSnippet(resourceData, mimeType)\n  };\n}\n\nfunction parsePlistElement(element: Element): PlistValue {\n  switch (element.tagName) {\n    case \"dict\": {\n      const result: Record<string, PlistValue> = {};\n      const children = Array.from(element.children);\n      for (let index = 0; index < children.length; index++) {\n        const key = children[index];\n        if (key.tagName !== \"key\") {\n          continue;\n        }\n        const value = children[index + 1];\n        if (value) {\n          result[key.textContent || \"\"] = parsePlistElement(value);\n          index++;\n        }\n      }\n      return result;\n    }\n    case \"array\":\n      return Array.from(element.children).map(parsePlistElement);\n    case \"data\":\n      return decodeBase64Data(element.textContent || \"\");\n    case \"integer\":\n    case \"real\":\n      return Number(element.textContent || 0);\n    case \"true\":\n      return true;\n    case \"false\":\n      return false;\n    case \"string\":\n    case \"date\":\n    default:\n      return element.textContent || \"\";\n  }\n}\n\ntype BinaryPlistResult = {\n  valid: boolean;\n  value?: PlistValue;\n  error?: string;\n};\n\nfunction parseBinaryPlist(bytes: Uint8Array): BinaryPlistResult {\n  try {\n    if (bytes.length < 40 || asciiAt(bytes, 0, 8) !== \"bplist00\") {\n      return { valid: false, error: \"缺少 bplist00 文件头。\" };\n    }\n    const trailer = bytes.length - 32;\n    const offsetIntSize = bytes[trailer + 6];\n    const objectRefSize = bytes[trailer + 7];\n    const objectCount = readBinaryPlistInt(bytes, trailer + 8, 8);\n    const topObject = readBinaryPlistInt(bytes, trailer + 16, 8);\n    const offsetTableOffset = readBinaryPlistInt(bytes, trailer + 24, 8);\n    if (\n      offsetIntSize <= 0 ||\n      objectRefSize <= 0 ||\n      objectCount <= 0 ||\n      topObject < 0 ||\n      topObject >= objectCount ||\n      offsetTableOffset + objectCount * offsetIntSize > trailer\n    ) {\n      return { valid: false, error: \"Binary plist trailer 或 offset table 异常。\" };\n    }\n    const offsets: number[] = [];\n    for (let index = 0; index < objectCount; index++) {\n      offsets.push(readBinaryPlistInt(bytes, offsetTableOffset + index * offsetIntSize, offsetIntSize));\n    }\n    const seen = new Set<number>();\n    return { valid: true, value: readBinaryPlistObject(bytes, offsets, topObject, objectRefSize, seen) };\n  } catch (error) {\n    return { valid: false, error: error instanceof Error ? error.message : \"Binary plist 解析失败。\" };\n  }\n}\n\nfunction readBinaryPlistObject(\n  bytes: Uint8Array,\n  offsets: number[],\n  index: number,\n  objectRefSize: number,\n  seen: Set<number>\n): PlistValue {\n  const offset = offsets[index];\n  if (offset === undefined || offset < 0 || offset >= bytes.length) {\n    throw new Error(`Binary plist object #${index} 偏移异常。`);\n  }\n  if (seen.has(index)) {\n    throw new Error(`Binary plist object #${index} 存在循环引用。`);\n  }\n  seen.add(index);\n\n  const marker = bytes[offset];\n  const type = marker >> 4;\n  const info = marker & 0x0f;\n  const payloadOffset = offset + 1;\n\n  if (type === 0x0) {\n    seen.delete(index);\n    if (info === 0x8) return false;\n    if (info === 0x9) return true;\n    return null;\n  }\n  if (type === 0x1) {\n    const value = readBinaryPlistInt(bytes, payloadOffset, 1 << info);\n    seen.delete(index);\n    return value;\n  }\n  if (type === 0x4) {\n    const lengthInfo = readBinaryPlistLength(bytes, offset, info);\n    const length = lengthInfo.length;\n    const start = lengthInfo.offset;\n    seen.delete(index);\n    return bytes.slice(start, start + length);\n  }\n  if (type === 0x5 || type === 0x6) {\n    const lengthInfo = readBinaryPlistLength(bytes, offset, info);\n    const width = type === 0x6 ? 2 : 1;\n    const data = bytes.slice(lengthInfo.offset, lengthInfo.offset + lengthInfo.length * width);\n    seen.delete(index);\n    return type === 0x6 ? decodeBinaryPlistUtf16Be(data) : new TextDecoder(\"utf-8\", { fatal: false }).decode(data);\n  }\n  if (type === 0x3) {\n    const seconds = readBinaryPlistFloat64(bytes, payloadOffset);\n    seen.delete(index);\n    return new Date(Date.UTC(2001, 0, 1) + seconds * 1000).toISOString();\n  }\n  if (type === 0xa || type === 0xc) {\n    const lengthInfo = readBinaryPlistLength(bytes, offset, info);\n    const values: PlistValue[] = [];\n    for (let item = 0; item < lengthInfo.length; item++) {\n      const ref = readBinaryPlistInt(bytes, lengthInfo.offset + item * objectRefSize, objectRefSize);\n      values.push(readBinaryPlistObject(bytes, offsets, ref, objectRefSize, new Set(seen)));\n    }\n    seen.delete(index);\n    return values;\n  }\n  if (type === 0xd) {\n    const lengthInfo = readBinaryPlistLength(bytes, offset, info);\n    const keyRefsStart = lengthInfo.offset;\n    const valueRefsStart = keyRefsStart + lengthInfo.length * objectRefSize;\n    const result: Record<string, PlistValue> = {};\n    for (let item = 0; item < lengthInfo.length; item++) {\n      const keyRef = readBinaryPlistInt(bytes, keyRefsStart + item * objectRefSize, objectRefSize);\n      const valueRef = readBinaryPlistInt(bytes, valueRefsStart + item * objectRefSize, objectRefSize);\n      const key = readBinaryPlistObject(bytes, offsets, keyRef, objectRefSize, new Set(seen));\n      if (typeof key === \"string\") {\n        result[key] = readBinaryPlistObject(bytes, offsets, valueRef, objectRefSize, new Set(seen));\n      }\n    }\n    seen.delete(index);\n    return result;\n  }\n\n  seen.delete(index);\n  return null;\n}\n\nfunction readBinaryPlistLength(bytes: Uint8Array, objectOffset: number, info: number): { length: number; offset: number } {\n  if (info < 0x0f) {\n    return { length: info, offset: objectOffset + 1 };\n  }\n  const marker = bytes[objectOffset + 1];\n  if ((marker >> 4) !== 0x1) {\n    throw new Error(\"Binary plist extended length 缺少整数对象。\");\n  }\n  const intSize = 1 << (marker & 0x0f);\n  return {\n    length: readBinaryPlistInt(bytes, objectOffset + 2, intSize),\n    offset: objectOffset + 2 + intSize\n  };\n}\n\nfunction readBinaryPlistInt(bytes: Uint8Array, offset: number, length: number): number {\n  if (offset < 0 || offset + length > bytes.length || length <= 0 || length > 8) {\n    throw new Error(\"Binary plist integer 超出文件范围。\");\n  }\n  let value = 0;\n  for (let index = 0; index < length; index++) {\n    value = value * 256 + bytes[offset + index];\n  }\n  return value;\n}\n\nfunction readBinaryPlistFloat64(bytes: Uint8Array, offset: number): number {\n  if (offset + 8 > bytes.length) {\n    throw new Error(\"Binary plist date 超出文件范围。\");\n  }\n  return new DataView(bytes.buffer, bytes.byteOffset + offset, 8).getFloat64(0, false);\n}\n\nfunction decodeBinaryPlistUtf16Be(bytes: Uint8Array): string {\n  let value = \"\";\n  for (let index = 0; index + 1 < bytes.length; index += 2) {\n    value += String.fromCharCode((bytes[index] << 8) | bytes[index + 1]);\n  }\n  return value;\n}\n\nfunction decodeBase64Data(value: string): Uint8Array {\n  const normalized = value.replace(/\\s+/g, \"\");\n  if (!normalized) {\n    return new Uint8Array();\n  }\n  const binary = atob(normalized);\n  const bytes = new Uint8Array(binary.length);\n  for (let index = 0; index < binary.length; index++) {\n    bytes[index] = binary.charCodeAt(index);\n  }\n  return bytes;\n}\n\nfunction createWebArchiveSnippet(value: PlistValue | undefined, mimeType?: string): string | undefined {\n  if (!(value instanceof Uint8Array) || value.length === 0) {\n    return undefined;\n  }\n  if (!mimeType || !/^(text\\/|application\\/(xhtml\\+xml|xml|json)|image\\/svg\\+xml)/i.test(mimeType)) {\n    return undefined;\n  }\n  const text = new TextDecoder(\"utf-8\", { fatal: false }).decode(value);\n  return text.replace(/\\s+/g, \" \").trim().slice(0, 1600);\n}\n\nfunction isPlistDict(value: PlistValue | undefined): value is { [key: string]: PlistValue } {\n  return Boolean(value) && typeof value === \"object\" && !Array.isArray(value) && !(value instanceof Uint8Array);\n}\n\nfunction plistString(value: PlistValue | undefined): string | undefined {\n  return typeof value === \"string\" ? value : undefined;\n}\n\nfunction asciiAt(bytes: Uint8Array, offset: number, length: number): string {\n  if (offset < 0 || offset + length > bytes.length) {\n    return \"\";\n  }\n  return new TextDecoder(\"ascii\").decode(bytes.slice(offset, offset + length));\n}\n\ntype PostScriptPreview = {\n  valid: boolean;\n  error?: string;\n  pdfCompatible?: boolean;\n  pdfOffset?: number;\n  format?: string;\n  title?: string;\n  creator?: string;\n  creationDate?: string;\n  pages?: string;\n  boundingBox?: string;\n  documentData?: string;\n};\n\nasync function createPostScriptPreview(\n  bytes: Uint8Array,\n  url: string,\n  fileName: string,\n  size: { width: number; height: number },\n  fit: PreviewFit,\n  toolbar?: { setZoom(value: number | undefined): void }\n): Promise<{ element: HTMLElement; instance?: PreviewInstance; primaryRendered?: boolean }> {\n  const parsed = parsePostScript(bytes);\n  if (parsed.valid && parsed.pdfCompatible) {\n    const embedded = await createPdfCompatibleAiPreview(bytes, url, fileName, size, fit, toolbar, parsed.pdfOffset || 0);\n    return { element: embedded.element, instance: embedded.instance, primaryRendered: true };\n  }\n\n  const preview = document.createElement(\"div\");\n  preview.className = \"ofv-data-preview\";\n  const heading = document.createElement(\"strong\");\n  heading.textContent = \"PostScript 结构\";\n  preview.append(heading);\n\n  if (!parsed.valid) {\n    const error = document.createElement(\"p\");\n    error.className = \"ofv-data-error\";\n    error.textContent = parsed.error || \"不是有效的 PostScript/Illustrator 文档头。\";\n    preview.append(error);\n    return { element: preview };\n  }\n\n  const summary = document.createElement(\"div\");\n  summary.className = \"ofv-data-summary\";\n  appendMeta(summary, \"格式\", parsed.format || \"PostScript\");\n  appendMeta(summary, \"Title\", parsed.title || \"未声明\");\n  appendMeta(summary, \"Creator\", parsed.creator || \"未声明\");\n  appendMeta(summary, \"Pages\", parsed.pages || \"未知\");\n  appendMeta(summary, \"BoundingBox\", parsed.boundingBox || \"未声明\");\n  appendMeta(summary, \"Created\", parsed.creationDate || \"未声明\");\n  if (parsed.documentData) {\n    appendMeta(summary, \"Data\", parsed.documentData);\n  }\n  preview.append(summary);\n  return { element: preview };\n}\n\nasync function createPdfCompatibleAiPreview(\n  bytes: Uint8Array,\n  url: string,\n  fileName: string,\n  size: { width: number; height: number },\n  fit: PreviewFit,\n  toolbar?: { setZoom(value: number | undefined): void },\n  pdfOffset = 0,\n  zoom = 1\n): Promise<{ element: HTMLElement; instance: PreviewInstance }> {\n  const wrapper = document.createElement(\"div\");\n  wrapper.className = \"ofv-ai-pdf-preview\";\n  let pdfUrl = url;\n  let shouldRevokePdfUrl = false;\n  if (pdfOffset > 0) {\n    pdfUrl = createObjectUrl({ blob: new Blob([bytes.slice(pdfOffset)], { type: \"application/pdf\" }) });\n    shouldRevokePdfUrl = true;\n  }\n  const instance = await renderPdfDocumentPreview({\n    fileName,\n    fileUrl: pdfUrl,\n    viewport: wrapper,\n    size,\n    fit,\n    zoom,\n    toolbar,\n    fallbackTitle: \"AI PDF 兼容预览失败\",\n    revokeUrlOnDestroy: false\n  });\n  hideSuccessfulPdfCompatibleAiDiagnostics(wrapper);\n  return {\n    element: wrapper,\n    instance: {\n      goToPage(page) {\n        return instance.goToPage?.(page) ?? false;\n      },\n      canCommand(command) {\n        return instance.canCommand(command);\n      },\n      command(command) {\n        return instance.command(command);\n      },\n      preparePrint() {\n        return instance.preparePrint?.();\n      },\n      resize(size) {\n        instance.resize(size);\n      },\n      destroy() {\n        instance.destroy();\n        if (shouldRevokePdfUrl) {\n          revokeObjectUrl(pdfUrl, false);\n        }\n      }\n    }\n  };\n}\n\nfunction hideSuccessfulPdfCompatibleAiDiagnostics(wrapper: HTMLElement): void {\n  if (!wrapper.querySelector(\".ofv-pdf-page-wrapper\")) {\n    return;\n  }\n  for (const element of wrapper.querySelectorAll<HTMLElement>(\".ofv-pdf-summary\")) {\n    hideSupplementalInfo(element);\n  }\n}\n\nfunction parsePostScript(bytes: Uint8Array): PostScriptPreview {\n  const pdfOffset = findPdfHeaderOffset(bytes);\n  const head = new TextDecoder(\"latin1\").decode(bytes.slice(pdfOffset >= 0 ? pdfOffset : 0, Math.min(bytes.length, (pdfOffset >= 0 ? pdfOffset : 0) + 8192)));\n  const firstLine = head.split(/\\r?\\n/, 1)[0] || \"\";\n  const isPdfCompatible = firstLine.startsWith(\"%PDF-\");\n  const isPostScript = firstLine.startsWith(\"%!\");\n  if (!isPdfCompatible && !isPostScript) {\n    return { valid: false, error: \"缺少 PostScript %! 或 PDF-compatible %PDF 文件头。\" };\n  }\n\n  const boundingBox = dscValue(head, \"BoundingBox\") || dscValue(head, \"HiResBoundingBox\");\n  return {\n    valid: true,\n    pdfCompatible: isPdfCompatible,\n    pdfOffset: isPdfCompatible ? Math.max(0, pdfOffset) : undefined,\n    format: isPdfCompatible ? `PDF-compatible Illustrator (${firstLine.replace(/^%/, \"\")})` : firstLine.replace(/^%!/, \"PostScript \"),\n    title: dscValue(head, \"Title\"),\n    creator: dscValue(head, \"Creator\") || dscValue(head, \"For\"),\n    creationDate: dscValue(head, \"CreationDate\"),\n    pages: dscValue(head, \"Pages\"),\n    boundingBox: normalizeBoundingBox(boundingBox),\n    documentData: dscValue(head, \"DocumentData\")\n  };\n}\n\nfunction findPdfHeaderOffset(bytes: Uint8Array): number {\n  const max = Math.min(bytes.length - 4, 1024 * 1024);\n  for (let index = 0; index <= max; index += 1) {\n    if (bytes[index] === 0x25 && bytes[index + 1] === 0x50 && bytes[index + 2] === 0x44 && bytes[index + 3] === 0x46 && bytes[index + 4] === 0x2d) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nfunction dscValue(text: string, key: string): string | undefined {\n  const escaped = key.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n  const match = text.match(new RegExp(`^%%${escaped}:\\\\s*(.+)$`, \"im\"));\n  return match?.[1]?.trim();\n}\n\nfunction normalizeBoundingBox(value?: string): string | undefined {\n  if (!value) {\n    return undefined;\n  }\n  const parts = value.trim().split(/\\s+/).map((part) => Number(part));\n  if (parts.length < 4 || parts.some((part) => !Number.isFinite(part))) {\n    return value;\n  }\n  const [x1, y1, x2, y2] = parts;\n  return `${x1}, ${y1}, ${x2}, ${y2} (${Math.max(0, x2 - x1)} x ${Math.max(0, y2 - y1)} pt)`;\n}\n\nfunction createHexPreview(bytes: Uint8Array): HTMLElement | null {\n  if (bytes.length === 0) {\n    return null;\n  }\n  const pre = document.createElement(\"pre\");\n  pre.className = \"ofv-text-block ofv-asset-hex\";\n  pre.textContent = hexPreview(bytes);\n  return pre;\n}\n\nfunction shouldShowHexPreview(extension: string, hasPrimaryPreview = false): boolean {\n  return !hasPrimaryPreview && ![\"ai\", \"eps\", \"ps\"].includes(extension);\n}\n\nfunction hideSuccessfulSectionHeading(section: HTMLElement): void {\n  const heading = section.querySelector<HTMLElement>(\"h3\");\n  if (heading) {\n    hideSupplementalInfo(heading);\n  }\n}\n\nfunction hideSuccessfulAssetDiagnostics(panel: HTMLElement): void {\n  const hasPrimaryPreview = Boolean(\n    panel.querySelector(\n      \".ofv-ai-pdf-preview .ofv-pdf-page-wrapper, .ofv-psd-canvas, .ofv-font-preview, .ofv-wasm-preview, .ofv-sqlite-data, .ofv-parquet-records, .ofv-avro-records, .ofv-webarchive-snippet\"\n    )\n  );\n  if (!hasPrimaryPreview) {\n    return;\n  }\n  for (const element of panel.querySelectorAll<HTMLElement>(\n    \".ofv-section > h3, .ofv-asset-summary, .ofv-asset-download, .ofv-asset-hex, .ofv-data-preview, .ofv-pdf-summary\"\n  )) {\n    hideSupplementalInfo(element);\n  }\n}\n\nfunction hideSupplementalInfo(element: HTMLElement): void {\n  element.hidden = true;\n  element.setAttribute(\"aria-hidden\", \"true\");\n  element.style.display = \"none\";\n}\n\nfunction formatBytes(bytes: number): string {\n  if (bytes < 1024) {\n    return `${bytes} B`;\n  }\n  if (bytes < 1024 * 1024) {\n    return `${(bytes / 1024).toFixed(1)} KB`;\n  }\n  return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\nfunction byteSignature(bytes: Uint8Array): string {\n  if (bytes.length === 0) {\n    return \"空文件\";\n  }\n  const ascii = new TextDecoder(\"ascii\").decode(bytes.slice(0, Math.min(bytes.length, 16))).replace(/[^\\x20-\\x7E]/g, \".\");\n  const hex = Array.from(bytes.slice(0, Math.min(bytes.length, 8)))\n    .map((byte) => byte.toString(16).padStart(2, \"0\").toUpperCase())\n    .join(\" \");\n  return `${ascii} (${hex})`;\n}\n\nfunction hexPreview(bytes: Uint8Array): string {\n  const rows: string[] = [];\n  const limit = Math.min(bytes.length, 256);\n  for (let offset = 0; offset < limit; offset += 16) {\n    const slice = bytes.slice(offset, offset + 16);\n    const hex = Array.from(slice)\n      .map((byte) => byte.toString(16).padStart(2, \"0\").toUpperCase())\n      .join(\" \")\n      .padEnd(47, \" \");\n    const ascii = Array.from(slice)\n      .map((byte) => (byte >= 32 && byte <= 126 ? String.fromCharCode(byte) : \".\"))\n      .join(\"\");\n    rows.push(`${offset.toString(16).padStart(8, \"0\").toUpperCase()}  ${hex}  ${ascii}`);\n  }\n  if (bytes.length > limit) {\n    rows.push(`... 仅展示前 ${limit} 字节，共 ${bytes.length} 字节`);\n  }\n  return rows.join(\"\\n\");\n}\n"],"mappings":"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","names":["name","extension","view","module","asciiAt","readUint32Be","timescale","duration","readUint32Le","appendMediaInfo","asciiAt","readUint32Le","readUint16Le","formatDuration","readUint32Be","view","view","PrismModule","Prism","DOMPurify","module","normalizeFileName","JSZip","appendMeta","DOMPurify","import_jszip","JSZip","hideSupplementalInfo","appendMeta","getXmlAttribute","countMatches","import_jszip","import_dompurify","document","appendMeta","paragraph","view","dataView","readUint32Be","title","number","view","readInt16","JSZip","hideSupplementalInfo","JSZip","getXmlAttribute","document","decodeXml","view","hideSupplementalInfo","DOMPurify","countMatches","unique","decodeXml","hideSupplementalInfo","DOMPurify","import_jszip","JSZip","finiteNumber","directoryName","mimeTypeFromPath","import_jszip","import_pako","JSZip","pako","hideSupplementalInfo","module","formatBytes","view","readUint64Le","readString","DOMPurify","hideSupplementalInfo","document","import_pako","parseSvgViewBox","hideSuccessfulSectionHeading","hideSupplementalInfo","finiteNumber","pako","import_jszip","JSZip","renderSheet","import_pako","module","importOptionalModule","toArrayBuffer","view","view","clamp","import_pako","pako","readText","viewer","appendMeta","hideSuccessfulSectionHeading","hideSupplementalInfo","formatBytes","layers","pako","byteSignature","height","geometry","material","JSZip","formatBytes","byteSignature","hideSupplementalInfo","hideSuccessfulSectionHeading","asciiAt","view","decodeUtf16Le","exports","toStandaloneArrayBuffer","size","hexPreview"]}