@aglyn/aglyn 1.0.0-beta.197 → 1.0.0-beta.199

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/package.json +11 -11
  2. package/src/lib/app-utils/docs-help.generated.d.ts +1 -1
  3. package/src/lib/app-utils/docs-help.generated.js +1 -0
  4. package/src/lib/app-utils/docs-help.generated.js.map +1 -1
  5. package/src/lib/app-utils/docs-index.generated.js +3 -3
  6. package/src/lib/app-utils/docs-index.generated.js.map +1 -1
  7. package/src/lib/app-utils/media-embedded-fields.d.ts +471 -0
  8. package/src/lib/app-utils/media-embedded-fields.js +619 -0
  9. package/src/lib/app-utils/media-embedded-fields.js.map +1 -0
  10. package/src/lib/app-utils/media-embedded-metadata/exif.d.ts +160 -0
  11. package/src/lib/app-utils/media-embedded-metadata/exif.js +1267 -0
  12. package/src/lib/app-utils/media-embedded-metadata/exif.js.map +1 -0
  13. package/src/lib/app-utils/media-embedded-metadata/gif.d.ts +44 -0
  14. package/src/lib/app-utils/media-embedded-metadata/gif.js +134 -0
  15. package/src/lib/app-utils/media-embedded-metadata/gif.js.map +1 -0
  16. package/src/lib/app-utils/media-embedded-metadata/heif.d.ts +23 -0
  17. package/src/lib/app-utils/media-embedded-metadata/heif.js +354 -0
  18. package/src/lib/app-utils/media-embedded-metadata/heif.js.map +1 -0
  19. package/src/lib/app-utils/media-embedded-metadata/icc.d.ts +22 -0
  20. package/src/lib/app-utils/media-embedded-metadata/icc.js +85 -0
  21. package/src/lib/app-utils/media-embedded-metadata/icc.js.map +1 -0
  22. package/src/lib/app-utils/media-embedded-metadata/image-blocks.d.ts +145 -0
  23. package/src/lib/app-utils/media-embedded-metadata/image-blocks.js +200 -0
  24. package/src/lib/app-utils/media-embedded-metadata/image-blocks.js.map +1 -0
  25. package/src/lib/app-utils/media-embedded-metadata/index.d.ts +93 -0
  26. package/src/lib/app-utils/media-embedded-metadata/index.js +744 -0
  27. package/src/lib/app-utils/media-embedded-metadata/index.js.map +1 -0
  28. package/src/lib/app-utils/media-embedded-metadata/iptc.d.ts +59 -0
  29. package/src/lib/app-utils/media-embedded-metadata/iptc.js +529 -0
  30. package/src/lib/app-utils/media-embedded-metadata/iptc.js.map +1 -0
  31. package/src/lib/app-utils/media-embedded-metadata/jpeg.d.ts +43 -0
  32. package/src/lib/app-utils/media-embedded-metadata/jpeg.js +456 -0
  33. package/src/lib/app-utils/media-embedded-metadata/jpeg.js.map +1 -0
  34. package/src/lib/app-utils/media-embedded-metadata/mp4.d.ts +37 -0
  35. package/src/lib/app-utils/media-embedded-metadata/mp4.js +621 -0
  36. package/src/lib/app-utils/media-embedded-metadata/mp4.js.map +1 -0
  37. package/src/lib/app-utils/media-embedded-metadata/ooxml.d.ts +131 -0
  38. package/src/lib/app-utils/media-embedded-metadata/ooxml.js +1058 -0
  39. package/src/lib/app-utils/media-embedded-metadata/ooxml.js.map +1 -0
  40. package/src/lib/app-utils/media-embedded-metadata/pdf-objects.d.ts +223 -0
  41. package/src/lib/app-utils/media-embedded-metadata/pdf-objects.js +936 -0
  42. package/src/lib/app-utils/media-embedded-metadata/pdf-objects.js.map +1 -0
  43. package/src/lib/app-utils/media-embedded-metadata/pdf.d.ts +82 -0
  44. package/src/lib/app-utils/media-embedded-metadata/pdf.js +1167 -0
  45. package/src/lib/app-utils/media-embedded-metadata/pdf.js.map +1 -0
  46. package/src/lib/app-utils/media-embedded-metadata/png.d.ts +41 -0
  47. package/src/lib/app-utils/media-embedded-metadata/png.js +512 -0
  48. package/src/lib/app-utils/media-embedded-metadata/png.js.map +1 -0
  49. package/src/lib/app-utils/media-embedded-metadata/svg.d.ts +30 -0
  50. package/src/lib/app-utils/media-embedded-metadata/svg.js +154 -0
  51. package/src/lib/app-utils/media-embedded-metadata/svg.js.map +1 -0
  52. package/src/lib/app-utils/media-embedded-metadata/tiff.d.ts +40 -0
  53. package/src/lib/app-utils/media-embedded-metadata/tiff.js +158 -0
  54. package/src/lib/app-utils/media-embedded-metadata/tiff.js.map +1 -0
  55. package/src/lib/app-utils/media-embedded-metadata/types.d.ts +60 -0
  56. package/src/lib/app-utils/media-embedded-metadata/types.js +32 -0
  57. package/src/lib/app-utils/media-embedded-metadata/types.js.map +1 -0
  58. package/src/lib/app-utils/media-embedded-metadata/webm.d.ts +26 -0
  59. package/src/lib/app-utils/media-embedded-metadata/webm.js +417 -0
  60. package/src/lib/app-utils/media-embedded-metadata/webm.js.map +1 -0
  61. package/src/lib/app-utils/media-embedded-metadata/webp.d.ts +37 -0
  62. package/src/lib/app-utils/media-embedded-metadata/webp.js +272 -0
  63. package/src/lib/app-utils/media-embedded-metadata/webp.js.map +1 -0
  64. package/src/lib/app-utils/media-embedded-metadata/xml.d.ts +231 -0
  65. package/src/lib/app-utils/media-embedded-metadata/xml.js +598 -0
  66. package/src/lib/app-utils/media-embedded-metadata/xml.js.map +1 -0
  67. package/src/lib/app-utils/media-embedded-metadata/xmp.d.ts +100 -0
  68. package/src/lib/app-utils/media-embedded-metadata/xmp.js +1475 -0
  69. package/src/lib/app-utils/media-embedded-metadata/xmp.js.map +1 -0
  70. package/src/lib/app-utils/media-embedded-metadata/zip.d.ts +93 -0
  71. package/src/lib/app-utils/media-embedded-metadata/zip.js +531 -0
  72. package/src/lib/app-utils/media-embedded-metadata/zip.js.map +1 -0
  73. package/src/lib/app-utils/name-search.d.ts +12 -0
  74. package/src/lib/app-utils/name-search.js +11 -0
  75. package/src/lib/app-utils/name-search.js.map +1 -1
  76. package/src/lib/foundation/definitions/platform.types.d.ts +11 -0
  77. package/src/lib/foundation/definitions/platform.types.js.map +1 -1
  78. package/src/server.d.ts +1 -0
  79. package/src/server.js +7 -0
  80. package/src/server.js.map +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/aglyn/src/lib/app-utils/media-embedded-metadata/pdf-objects.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * The object layer under the PDF metadata reader and writer (AGL-3331).\n *\n * - A tokenizer and parser for the COS syntax of ISO 32000-2 §7.2–§7.3:\n * names, literal and hexadecimal strings, numbers, arrays, dictionaries,\n * indirect references, `stream`…`endstream` bodies, booleans and null.\n * - A serializer that writes a parsed object back out faithfully, so a\n * dictionary the writer re-emits (a catalog gaining `/Metadata`, an Info\n * dictionary with one entry changed) keeps every other entry as it was.\n * - The text-string codec of §7.9.2.2 (PDFDocEncoding, UTF-16BE, UTF-8).\n * - FlateDecode with the §7.4.4.4 predictors — the only filter a reader of\n * cross-reference streams, object streams and metadata streams needs.\n *\n * ## Hostile input\n *\n * Every byte here comes from an uploaded file. Nothing in this module\n * throws on malformed input: the parser returns `null` for what it cannot\n * read, nesting is capped at {@link PDF_MAX_DEPTH}, one object may spend at\n * most {@link PDF_MAX_TOKENS} tokens, every offset is checked against the\n * buffer, and inflation is capped by the caller's `maxOutputLength`.\n */\n\nimport { constants, inflateRawSync, inflateSync } from 'zlib'\n\nexport interface PdfNull {\n kind: 'null'\n}\nexport interface PdfBoolean {\n kind: 'boolean'\n value: boolean\n}\nexport interface PdfNumber {\n kind: 'number'\n value: number\n /** As written, so `0.50` reserializes as `0.50` rather than `0.5`. */\n text: string\n}\nexport interface PdfString {\n kind: 'string'\n /** The string's bytes after escape processing (§7.3.4). */\n bytes: Uint8Array\n /** Written as `<…>` rather than `(…)`; kept so reserializing is faithful. */\n hex: boolean\n}\nexport interface PdfName {\n kind: 'name'\n /**\n * The name's BYTES after `#xx` decoding (§7.3.5), one char per byte.\n * {@link pdfNameText} turns it into display text.\n */\n name: string\n}\nexport interface PdfArray {\n kind: 'array'\n items: PdfObject[]\n}\nexport interface PdfDict {\n kind: 'dict'\n /** Keyed by name bytes like {@link PdfName.name}; insertion-ordered. */\n entries: Map<string, PdfObject>\n}\nexport interface PdfRef {\n kind: 'ref'\n num: number\n gen: number\n}\nexport interface PdfStream {\n kind: 'stream'\n dict: PdfDict\n /** The ENCODED data, a view into the buffer it was parsed from. */\n data: Uint8Array\n}\n\n/** A PDF object as parsed (ISO 32000-2 §7.3). */\nexport type PdfObject =\n | PdfNull\n | PdfBoolean\n | PdfNumber\n | PdfString\n | PdfName\n | PdfArray\n | PdfDict\n | PdfRef\n | PdfStream\n\nexport const PDF_NULL: PdfNull = { kind: 'null' }\n\n/** Deepest array/dictionary nesting the parser follows. */\nexport const PDF_MAX_DEPTH = 64\n/** Tokens one object may consume before the parser gives up on it. */\nexport const PDF_MAX_TOKENS = 2_000_000\n/** Longest name or bare keyword kept; the rest of the run is skipped. */\nconst MAX_WORD = 4096\n\n// §7.2.3 character classes: 0 regular, 1 white-space, 2 delimiter.\nconst CHAR_CLASS = new Uint8Array(256)\nfor (const b of [0x00, 0x09, 0x0a, 0x0c, 0x0d, 0x20]) CHAR_CLASS[b] = 1\nfor (const c of '()<>[]{}/%') CHAR_CLASS[c.charCodeAt(0)] = 2\n\n/** A byte of `bytes`, or -1 outside `[0, end)`. */\nfunction byteAt(bytes: Uint8Array, i: number, end = bytes.length): number {\n return i >= 0 && i < end ? (bytes[i] ?? -1) : -1\n}\n\nexport function isPdfWhitespace(b: number): boolean {\n return b >= 0 && b < 256 && CHAR_CLASS[b] === 1\n}\n\nfunction isRegular(b: number): boolean {\n return b >= 0 && b < 256 && CHAR_CLASS[b] === 0\n}\n\nfunction hexValue(b: number): number {\n if (b >= 0x30 && b <= 0x39) return b - 0x30\n if (b >= 0x41 && b <= 0x46) return b - 0x37\n if (b >= 0x61 && b <= 0x66) return b - 0x57\n return -1\n}\n\n/** Bytes as a binary string, one char per byte. */\nexport function latin1Text(bytes: Uint8Array): string {\n let out = ''\n for (let i = 0; i < bytes.length; i += 8192) {\n out += String.fromCharCode(...bytes.subarray(i, i + 8192))\n }\n return out\n}\n\n/** A binary string (chars 0–255) as bytes. */\nexport function latin1Bytes(text: string): Uint8Array {\n const out = new Uint8Array(text.length)\n for (let i = 0; i < text.length; i++) out[i] = text.charCodeAt(i) & 0xff\n return out\n}\n\n/** The first index of `needle` in `bytes[from, to)`, or -1. */\nexport function indexOfBytes(\n bytes: Uint8Array,\n needle: Uint8Array,\n from = 0,\n to = bytes.length,\n): number {\n const first = needle[0]\n if (first === undefined) return -1\n const last = Math.min(to, bytes.length) - needle.length\n outer: for (let i = Math.max(0, from); i <= last; i++) {\n if (bytes[i] !== first) continue\n for (let j = 1; j < needle.length; j++) {\n if (bytes[i + j] !== needle[j]) continue outer\n }\n return i\n }\n return -1\n}\n\n/** The last index of `needle` in `bytes` starting at or before `from`. */\nexport function lastIndexOfBytes(\n bytes: Uint8Array,\n needle: Uint8Array,\n from = bytes.length - needle.length,\n): number {\n const first = needle[0]\n if (first === undefined) return -1\n outer: for (let i = Math.min(from, bytes.length - needle.length); i >= 0; i--) {\n if (bytes[i] !== first) continue\n for (let j = 1; j < needle.length; j++) {\n if (bytes[i + j] !== needle[j]) continue outer\n }\n return i\n }\n return -1\n}\n\n/** A growable byte buffer for string bodies of unknown length. */\nclass ByteSink {\n private buf = new Uint8Array(64)\n length = 0\n push(b: number): void {\n if (this.length === this.buf.length) {\n const next = new Uint8Array(this.buf.length * 2)\n next.set(this.buf)\n this.buf = next\n }\n this.buf[this.length++] = b\n }\n bytes(): Uint8Array {\n return this.buf.slice(0, this.length)\n }\n}\n\nexport type PdfToken =\n | { type: 'eof' }\n | { type: 'number'; value: number; text: string }\n | { type: 'keyword'; text: string }\n | { type: 'name'; name: string }\n | { type: 'string'; bytes: Uint8Array; hex: boolean }\n | { type: 'punct'; text: '[' | ']' | '<<' | '>>' | '{' | '}' }\n\nconst NUMBER = /^[+-]?(?:\\d+\\.?\\d*|\\.\\d+)$/\nconst INTEGER = /^\\d+$/\n\n/** The §7.2 tokenizer. `end` is exclusive; nothing is read past it. */\nexport class PdfLexer {\n pos: number\n readonly end: number\n\n constructor(\n readonly bytes: Uint8Array,\n pos = 0,\n end = bytes.length,\n ) {\n this.end = Math.max(0, Math.min(end, bytes.length))\n this.pos = Math.max(0, pos)\n }\n\n private at(i: number): number {\n return byteAt(this.bytes, i, this.end)\n }\n\n /** Skips white-space and `%` comments (§7.2.4). */\n skipSpace(): void {\n for (;;) {\n const b = this.at(this.pos)\n if (b < 0) return\n if (isPdfWhitespace(b)) {\n this.pos++\n } else if (b === 0x25) {\n while (this.pos < this.end) {\n const c = this.at(this.pos)\n if (c === 0x0a || c === 0x0d) break\n this.pos++\n }\n } else {\n return\n }\n }\n }\n\n /** Whether `word` is the next token, as a whole keyword. */\n peekKeyword(word: string): boolean {\n this.skipSpace()\n for (let i = 0; i < word.length; i++) {\n if (this.at(this.pos + i) !== word.charCodeAt(i)) return false\n }\n return !isRegular(this.at(this.pos + word.length))\n }\n\n next(): PdfToken {\n this.skipSpace()\n const b = this.at(this.pos)\n if (b < 0) return { type: 'eof' }\n switch (b) {\n case 0x2f: // '/'\n return this.name()\n case 0x28: // '('\n return this.literalString()\n case 0x3c: // '<'\n if (this.at(this.pos + 1) === 0x3c) {\n this.pos += 2\n return { type: 'punct', text: '<<' }\n }\n return this.hexString()\n case 0x3e: // '>'\n if (this.at(this.pos + 1) === 0x3e) {\n this.pos += 2\n return { type: 'punct', text: '>>' }\n }\n this.pos++\n return { type: 'keyword', text: '>' }\n case 0x5b:\n this.pos++\n return { type: 'punct', text: '[' }\n case 0x5d:\n this.pos++\n return { type: 'punct', text: ']' }\n case 0x7b:\n this.pos++\n return { type: 'punct', text: '{' }\n case 0x7d:\n this.pos++\n return { type: 'punct', text: '}' }\n case 0x29: // a stray ')'\n this.pos++\n return { type: 'keyword', text: ')' }\n }\n let text = ''\n while (isRegular(this.at(this.pos))) {\n if (text.length < MAX_WORD) text += String.fromCharCode(this.at(this.pos))\n this.pos++\n }\n if (NUMBER.test(text)) {\n const value = Number(text)\n if (Number.isFinite(value)) return { type: 'number', value, text }\n }\n return { type: 'keyword', text }\n }\n\n /** §7.3.5: a name, with `#xx` escapes decoded to bytes. */\n private name(): PdfToken {\n this.pos++\n let name = ''\n while (isRegular(this.at(this.pos))) {\n let b = this.at(this.pos)\n if (b === 0x23) {\n const hi = hexValue(this.at(this.pos + 1))\n const lo = hexValue(this.at(this.pos + 2))\n if (hi >= 0 && lo >= 0) {\n b = hi * 16 + lo\n this.pos += 2\n }\n }\n if (name.length < MAX_WORD) name += String.fromCharCode(b)\n this.pos++\n }\n return { type: 'name', name }\n }\n\n /**\n * §7.3.4.2: a literal string. Balanced parentheses nest; `\\` escapes\n * `n r t b f ( ) \\`, one to three octal digits, and an end-of-line (a\n * line continuation, which contributes nothing). An unescaped CR, LF or\n * CRLF reads as a single LF. An unterminated string ends at the buffer.\n */\n private literalString(): PdfToken {\n this.pos++\n const out = new ByteSink()\n let depth = 1\n while (this.pos < this.end) {\n const b = this.at(this.pos++)\n if (b === 0x28) {\n depth++\n out.push(b)\n } else if (b === 0x29) {\n if (--depth === 0) break\n out.push(b)\n } else if (b === 0x5c) {\n const e = this.at(this.pos++)\n switch (e) {\n case 0x6e: out.push(0x0a); break\n case 0x72: out.push(0x0d); break\n case 0x74: out.push(0x09); break\n case 0x62: out.push(0x08); break\n case 0x66: out.push(0x0c); break\n case 0x0d:\n if (this.at(this.pos) === 0x0a) this.pos++\n break\n case 0x0a:\n break\n case -1:\n break\n default:\n if (e >= 0x30 && e <= 0x37) {\n let code = e - 0x30\n for (let k = 0; k < 2; k++) {\n const d = this.at(this.pos)\n if (d < 0x30 || d > 0x37) break\n code = code * 8 + (d - 0x30)\n this.pos++\n }\n out.push(code & 0xff)\n } else {\n out.push(e)\n }\n }\n } else if (b === 0x0d) {\n if (this.at(this.pos) === 0x0a) this.pos++\n out.push(0x0a)\n } else {\n out.push(b)\n }\n }\n return { type: 'string', bytes: out.bytes(), hex: false }\n }\n\n /**\n * §7.3.4.3: a hexadecimal string. White-space is ignored, an odd final\n * digit is followed by an implied 0, and any other stray byte is skipped\n * rather than ending the string.\n */\n private hexString(): PdfToken {\n this.pos++\n const out = new ByteSink()\n let high = -1\n while (this.pos < this.end) {\n const b = this.at(this.pos++)\n if (b === 0x3e) break\n const v = hexValue(b)\n if (v < 0) continue\n if (high < 0) {\n high = v\n } else {\n out.push(high * 16 + v)\n high = -1\n }\n }\n if (high >= 0) out.push(high * 16)\n return { type: 'string', bytes: out.bytes(), hex: true }\n }\n}\n\n/** Keywords that end whatever is being parsed; seeing one means a truncated container. */\nconst STRUCTURAL = new Set([\n 'obj',\n 'endobj',\n 'stream',\n 'endstream',\n 'xref',\n 'trailer',\n 'startxref',\n])\n\nexport interface PdfParseOptions {\n /** Resolves an indirect stream `/Length` (§7.3.8.2) to a number. */\n resolveLength?: (ref: PdfRef) => number | null\n}\n\nexport interface PdfIndirectObject {\n num: number\n gen: number\n obj: PdfObject\n}\n\nconst ENDSTREAM = latin1Bytes('endstream')\n\n/**\n * The §7.3 object parser over {@link PdfLexer}. Returns `null` for what it\n * cannot read rather than throwing; see the module doc for the limits.\n */\nexport class PdfParser {\n readonly lexer: PdfLexer\n private budget = PDF_MAX_TOKENS\n private failed = false\n\n constructor(\n readonly bytes: Uint8Array,\n pos = 0,\n private readonly options: PdfParseOptions = {},\n end = bytes.length,\n ) {\n this.lexer = new PdfLexer(bytes, pos, end)\n }\n\n get pos(): number {\n return this.lexer.pos\n }\n\n /** One direct object at the current position. */\n parseObject(): PdfObject | null {\n this.failed = false\n this.budget = PDF_MAX_TOKENS\n const obj = this.object(this.lexer.next(), 0)\n return this.failed ? null : obj\n }\n\n /**\n * `num gen obj … endobj` at the current position (§7.3.10). A dictionary\n * followed by `stream` becomes a {@link PdfStream} (§7.3.8). `endobj` is\n * not required: plenty of writers forget it, and nothing depends on it.\n */\n parseIndirectObject(): PdfIndirectObject | null {\n const numToken = this.lexer.next()\n const genToken = this.lexer.next()\n if (!isIntegerToken(numToken) || !isIntegerToken(genToken)) return null\n if (!this.lexer.peekKeyword('obj')) return null\n this.lexer.next()\n this.failed = false\n this.budget = PDF_MAX_TOKENS\n const start = this.lexer.pos\n const token = this.lexer.next()\n let obj: PdfObject | null\n if (token.type === 'keyword' && token.text === 'endobj') {\n obj = PDF_NULL\n } else {\n obj = this.object(token, 0)\n if (this.failed || !obj) {\n this.lexer.pos = start\n return null\n }\n }\n if (obj.kind === 'dict' && this.lexer.peekKeyword('stream')) {\n this.lexer.next()\n obj = this.streamBody(obj)\n }\n if (this.lexer.peekKeyword('endobj')) this.lexer.next()\n return { num: numToken.value, gen: genToken.value, obj }\n }\n\n private object(token: PdfToken, depth: number): PdfObject | null {\n if (--this.budget < 0 || depth > PDF_MAX_DEPTH) {\n this.failed = true\n return null\n }\n switch (token.type) {\n case 'number': {\n if (INTEGER.test(token.text)) {\n const mark = this.lexer.pos\n const gen = this.lexer.next()\n if (isIntegerToken(gen)) {\n const r = this.lexer.next()\n if (r.type === 'keyword' && r.text === 'R') {\n return { kind: 'ref', num: token.value, gen: gen.value }\n }\n }\n this.lexer.pos = mark\n }\n return { kind: 'number', value: token.value, text: token.text }\n }\n case 'name':\n return { kind: 'name', name: token.name }\n case 'string':\n return { kind: 'string', bytes: token.bytes, hex: token.hex }\n case 'keyword':\n if (token.text === 'true') return { kind: 'boolean', value: true }\n if (token.text === 'false') return { kind: 'boolean', value: false }\n if (token.text === 'null') return PDF_NULL\n return null\n case 'punct':\n if (token.text === '[') return this.array(depth)\n if (token.text === '<<') return this.dict(depth)\n return null\n default:\n return null\n }\n }\n\n private array(depth: number): PdfObject | null {\n const items: PdfObject[] = []\n for (;;) {\n const mark = this.lexer.pos\n const token = this.lexer.next()\n if (token.type === 'eof') break\n if (token.type === 'punct' && token.text === ']') break\n if (token.type === 'keyword' && STRUCTURAL.has(token.text)) {\n this.lexer.pos = mark\n break\n }\n const item = this.object(token, depth + 1)\n if (this.failed) return null\n if (item) items.push(item)\n }\n return { kind: 'array', items }\n }\n\n private dict(depth: number): PdfObject | null {\n const entries = new Map<string, PdfObject>()\n for (;;) {\n const mark = this.lexer.pos\n const token = this.lexer.next()\n if (token.type === 'eof') break\n if (token.type === 'punct' && token.text === '>>') break\n if (token.type === 'keyword' && STRUCTURAL.has(token.text)) {\n this.lexer.pos = mark\n break\n }\n if (token.type !== 'name') {\n // A key that is not a name: skip it (and whatever it opened).\n this.object(token, depth + 1)\n if (this.failed) return null\n continue\n }\n const valueMark = this.lexer.pos\n const valueToken = this.lexer.next()\n if (valueToken.type === 'punct' && valueToken.text === '>>') break\n if (\n valueToken.type === 'eof' ||\n (valueToken.type === 'keyword' && STRUCTURAL.has(valueToken.text))\n ) {\n this.lexer.pos = valueMark\n break\n }\n const value = this.object(valueToken, depth + 1)\n if (this.failed) return null\n // §7.3.7 leaves duplicate keys undefined; the first one wins, as in\n // Poppler, whose `pdfinfo` is what these files are checked against.\n if (value && !entries.has(token.name)) entries.set(token.name, value)\n }\n return { kind: 'dict', entries }\n }\n\n /**\n * §7.3.8.1: the data starts after the EOL that ends the `stream` keyword\n * (CRLF or LF; a lone CR is tolerated) and runs for `/Length` bytes. When\n * `/Length` is missing, unresolvable or does not land on `endstream`, the\n * data runs to the next `endstream` instead, less the EOL before it.\n */\n private streamBody(dict: PdfDict): PdfStream {\n const { bytes } = this\n const end = this.lexer.end\n let start = this.lexer.pos\n if (byteAt(bytes, start, end) === 0x0d) start++\n if (byteAt(bytes, start, end) === 0x0a) start++\n const length = this.streamLength(dict)\n if (length !== null && start + length <= end) {\n const probe = new PdfLexer(bytes, start + length, end)\n if (probe.peekKeyword('endstream')) {\n probe.next()\n this.lexer.pos = probe.pos\n return { kind: 'stream', dict, data: bytes.subarray(start, start + length) }\n }\n }\n const found = indexOfBytes(bytes, ENDSTREAM, start, end)\n let stop = found < 0 ? end : found\n if (byteAt(bytes, stop - 1, end) === 0x0a && stop > start) stop--\n if (byteAt(bytes, stop - 1, end) === 0x0d && stop > start) stop--\n this.lexer.pos = found < 0 ? end : found + ENDSTREAM.length\n return { kind: 'stream', dict, data: bytes.subarray(start, stop) }\n }\n\n private streamLength(dict: PdfDict): number | null {\n const value = dict.entries.get('Length')\n let length: number | null = null\n if (value?.kind === 'number') length = value.value\n else if (value?.kind === 'ref') length = this.options.resolveLength?.(value) ?? null\n return length !== null && Number.isSafeInteger(length) && length >= 0 ? length : null\n }\n}\n\nfunction isIntegerToken(\n token: PdfToken,\n): token is { type: 'number'; value: number; text: string } {\n return token.type === 'number' && INTEGER.test(token.text)\n}\n\n// ---------------------------------------------------------------------------\n// Serializing\n\nconst HEX = '0123456789ABCDEF'\n\n/** §7.3.5: regular characters 0x21–0x7E other than `#` are written as-is. */\nexport function serializePdfName(name: string): string {\n let out = '/'\n for (let i = 0; i < name.length; i++) {\n const b = name.charCodeAt(i) & 0xff\n if (b > 0x20 && b < 0x7f && b !== 0x23 && CHAR_CLASS[b] === 0) {\n out += String.fromCharCode(b)\n } else {\n out += '#' + HEX.charAt(b >> 4) + HEX.charAt(b & 15)\n }\n }\n return out\n}\n\n/**\n * A string as a literal (§7.3.4.2) or, when it was read as one, a hex\n * string (§7.3.4.3). Literal bytes outside printable ASCII are written as\n * three-digit octal escapes so the output is 7-bit clean and byte-exact.\n */\nexport function serializePdfString(value: PdfString): string {\n if (value.hex) {\n let out = '<'\n for (const b of value.bytes) out += HEX.charAt(b >> 4) + HEX.charAt(b & 15)\n return out + '>'\n }\n let out = '('\n for (const b of value.bytes) {\n if (b === 0x28 || b === 0x29 || b === 0x5c) out += '\\\\' + String.fromCharCode(b)\n else if (b === 0x0a) out += '\\\\n'\n else if (b === 0x0d) out += '\\\\r'\n else if (b === 0x09) out += '\\\\t'\n else if (b >= 0x20 && b < 0x7f) out += String.fromCharCode(b)\n else out += '\\\\' + b.toString(8).padStart(3, '0')\n }\n return out + ')'\n}\n\n/**\n * An object as PDF syntax, in a binary string (one char per byte). Streams\n * cannot be nested inside another object (§7.3.8.1), so one met here is\n * written as `null`; a top-level stream is laid out by its writer.\n */\nexport function serializePdfObject(obj: PdfObject, depth = 0): string {\n if (depth > PDF_MAX_DEPTH) return 'null'\n switch (obj.kind) {\n case 'null':\n return 'null'\n case 'boolean':\n return obj.value ? 'true' : 'false'\n case 'number':\n return NUMBER.test(obj.text) ? obj.text : String(obj.value)\n case 'string':\n return serializePdfString(obj)\n case 'name':\n return serializePdfName(obj.name)\n case 'ref':\n return `${obj.num} ${obj.gen} R`\n case 'array':\n return '[' + obj.items.map((item) => serializePdfObject(item, depth + 1)).join(' ') + ']'\n case 'dict': {\n const entries: string[] = []\n for (const [key, value] of obj.entries) {\n entries.push(serializePdfName(key) + ' ' + serializePdfObject(value, depth + 1))\n }\n return '<<' + entries.join(' ') + '>>'\n }\n case 'stream':\n return 'null'\n }\n}\n\n// ---------------------------------------------------------------------------\n// Text strings (§7.9.2.2)\n\n/**\n * PDFDocEncoding (Annex D.2) where it differs from Latin-1: 0x18–0x1F are\n * spacing accents and 0x80–0xA0 are typographic marks. 0x7F, 0x9F and 0xAD\n * are undefined and read as their Latin-1 code points, as pdf.js does.\n */\nconst PDF_DOC_ENCODING: Record<number, number> = {\n 0x18: 0x02d8, 0x19: 0x02c7, 0x1a: 0x02c6, 0x1b: 0x02d9,\n 0x1c: 0x02dd, 0x1d: 0x02db, 0x1e: 0x02da, 0x1f: 0x02dc,\n 0x80: 0x2022, 0x81: 0x2020, 0x82: 0x2021, 0x83: 0x2026,\n 0x84: 0x2014, 0x85: 0x2013, 0x86: 0x0192, 0x87: 0x2044,\n 0x88: 0x2039, 0x89: 0x203a, 0x8a: 0x2212, 0x8b: 0x2030,\n 0x8c: 0x201e, 0x8d: 0x201c, 0x8e: 0x201d, 0x8f: 0x2018,\n 0x90: 0x2019, 0x91: 0x201a, 0x92: 0x2122, 0x93: 0xfb01,\n 0x94: 0xfb02, 0x95: 0x0141, 0x96: 0x0152, 0x97: 0x0160,\n 0x98: 0x0178, 0x99: 0x017d, 0x9a: 0x0131, 0x9b: 0x0142,\n 0x9c: 0x0153, 0x9d: 0x0161, 0x9e: 0x017e, 0xa0: 0x20ac,\n}\n\nfunction utf16Text(bytes: Uint8Array, start: number, littleEndian: boolean): string {\n let out = ''\n for (let i = start; i + 1 < bytes.length; i += 2) {\n const a = bytes[i] ?? 0\n const b = bytes[i + 1] ?? 0\n out += String.fromCharCode(littleEndian ? b * 256 + a : a * 256 + b)\n }\n // Lone surrogates from a truncated pair become U+FFFD.\n return out.toWellFormed()\n}\n\n/**\n * A text string's bytes as text (§7.9.2.2): UTF-16BE after a FE FF byte\n * order mark, UTF-8 after EF BB BF (PDF 2.0), PDFDocEncoding otherwise.\n * UTF-16LE after FF FE is not in the standard but is written by enough\n * software that reading it as PDFDocEncoding (\"ÿþ…\") helps nobody.\n * Language escapes (ESC lang ESC, §7.9.2.2.1) and trailing NULs are removed.\n */\nexport function decodePdfTextString(bytes: Uint8Array): string {\n let text: string\n if (bytes[0] === 0xfe && bytes[1] === 0xff) {\n text = utf16Text(bytes, 2, false)\n } else if (bytes[0] === 0xff && bytes[1] === 0xfe) {\n text = utf16Text(bytes, 2, true)\n } else if (bytes[0] === 0xef && bytes[1] === 0xbb && bytes[2] === 0xbf) {\n text = new TextDecoder('utf-8').decode(bytes.subarray(3))\n } else {\n text = ''\n for (const b of bytes) text += String.fromCharCode(PDF_DOC_ENCODING[b] ?? b)\n }\n return stripLanguageEscapes(text).replace(TRAILING_NULS, '')\n}\n\nconst ESC = String.fromCharCode(0x1b)\nconst TRAILING_NULS = new RegExp(String.fromCharCode(0) + '+$')\n\n/** §7.9.2.2.1: ESC, a 2-letter language, an optional 2-letter country, ESC. */\nfunction stripLanguageEscapes(text: string): string {\n let out = ''\n let at = 0\n for (;;) {\n const open = text.indexOf(ESC, at)\n if (open < 0) break\n const close = text.indexOf(ESC, open + 1)\n if (close < 0 || close - open > 9) {\n out += text.slice(at, open + 1)\n at = open + 1\n continue\n }\n out += text.slice(at, open)\n at = close + 1\n }\n return out + text.slice(at)\n}\n\n/**\n * Text as a text string: a literal when every char is printable ASCII (or\n * tab, CR, LF, which escape cleanly and mean the same in PDFDocEncoding),\n * otherwise UTF-16BE with a byte order mark, written as hex (§7.9.2.2).\n */\nexport function encodePdfTextString(text: string): PdfString {\n if (/^[\\x20-\\x7e\\t\\n\\r]*$/.test(text)) {\n return { kind: 'string', bytes: latin1Bytes(text), hex: false }\n }\n const units = text.toWellFormed()\n const bytes = new Uint8Array(2 + units.length * 2)\n bytes[0] = 0xfe\n bytes[1] = 0xff\n for (let i = 0; i < units.length; i++) {\n const unit = units.charCodeAt(i)\n bytes[2 + i * 2] = unit >> 8\n bytes[3 + i * 2] = unit & 0xff\n }\n return { kind: 'string', bytes, hex: true }\n}\n\nconst UTF8_STRICT = new TextDecoder('utf-8', { fatal: true })\n\n/**\n * A name's bytes as display text: UTF-8 when they are valid UTF-8 (PDF 2.0\n * §7.3.5 recommends it), Latin-1 otherwise.\n */\nexport function pdfNameText(name: string): string {\n let ascii = true\n for (let i = 0; i < name.length && ascii; i++) ascii = name.charCodeAt(i) < 0x80\n if (ascii) return name\n try {\n return UTF8_STRICT.decode(latin1Bytes(name))\n } catch {\n return name\n }\n}\n\n/** Display text as name bytes (UTF-8), the inverse of {@link pdfNameText}. */\nexport function pdfNameFromText(text: string): string {\n return latin1Text(new TextEncoder().encode(text))\n}\n\n// ---------------------------------------------------------------------------\n// Stream filters (§7.4)\n\nexport type PdfResolver = (obj: PdfObject | undefined) => PdfObject | undefined\n\nfunction asArray(obj: PdfObject | undefined, resolve: PdfResolver): PdfObject[] {\n const value = resolve(obj)\n if (!value || value.kind === 'null') return []\n return value.kind === 'array' ? value.items : [value]\n}\n\nfunction intParam(dict: PdfDict | null, key: string, fallback: number): number {\n const value = dict?.entries.get(key)\n return value?.kind === 'number' && Number.isInteger(value.value) ? value.value : fallback\n}\n\n/**\n * zlib inflation capped at `maxOutputLength`. A strict pass first; a stream\n * truncated or missing its Adler-32 (common, and harmless to the data) is\n * retried with a sync flush, and one written without a zlib header as raw\n * deflate. `null` when none of them produces anything.\n */\nexport function inflatePdf(data: Uint8Array, maxOutputLength: number): Uint8Array | null {\n const options = { maxOutputLength }\n const lenient = { maxOutputLength, finishFlush: constants.Z_SYNC_FLUSH }\n const attempts = [\n () => inflateSync(data, options),\n () => inflateSync(data, lenient),\n () => inflateRawSync(data, lenient),\n ]\n for (const attempt of attempts) {\n try {\n const out = attempt()\n return new Uint8Array(out.buffer, out.byteOffset, out.byteLength)\n } catch {\n // The next attempt is more lenient; a size-cap error fails them all.\n }\n }\n return null\n}\n\n/**\n * §7.4.4.4: undo a TIFF (2) or PNG (10–15) predictor. PNG rows each carry\n * their own filter-type byte, so the Predictor value past 10 is only a hint.\n * `null` for parameters this cannot honor.\n */\nexport function unpredict(data: Uint8Array, params: PdfDict | null): Uint8Array | null {\n const predictor = intParam(params, 'Predictor', 1)\n if (predictor === 1) return data\n const colors = intParam(params, 'Colors', 1)\n const bpc = intParam(params, 'BitsPerComponent', 8)\n const columns = intParam(params, 'Columns', 1)\n if (colors < 1 || colors > 32 || ![1, 2, 4, 8, 16].includes(bpc)) return null\n if (columns < 1 || columns > 1 << 24) return null\n const bpp = Math.max(1, Math.ceil((colors * bpc) / 8))\n const rowLength = Math.ceil((colors * bpc * columns) / 8)\n if (predictor === 2) {\n if (bpc !== 8) return null\n const out = data.slice()\n for (let row = 0; row < out.length; row += rowLength) {\n for (let i = row + bpp; i < Math.min(row + rowLength, out.length); i++) {\n out[i] = ((out[i] ?? 0) + (out[i - bpp] ?? 0)) & 0xff\n }\n }\n return out\n }\n if (predictor < 10 || predictor > 15) return null\n const rows = Math.ceil(data.length / (rowLength + 1))\n // Every row writes at most its own input, so the output is never longer\n // than the input — a hostile /Columns cannot make this allocate more.\n const out = new Uint8Array(Math.min(rows * rowLength, data.length))\n let written = 0\n for (let row = 0; row < rows; row++) {\n const src = row * (rowLength + 1)\n const type = data[src] ?? 0\n const base = row * rowLength\n const available = Math.min(rowLength, data.length - src - 1)\n for (let i = 0; i < available; i++) {\n const raw = data[src + 1 + i] ?? 0\n const left = i >= bpp ? (out[base + i - bpp] ?? 0) : 0\n const up = row > 0 ? (out[base - rowLength + i] ?? 0) : 0\n const upLeft = row > 0 && i >= bpp ? (out[base - rowLength + i - bpp] ?? 0) : 0\n let value: number\n switch (type) {\n case 1: value = raw + left; break\n case 2: value = raw + up; break\n case 3: value = raw + ((left + up) >> 1); break\n case 4: {\n const p = left + up - upLeft\n const pa = Math.abs(p - left)\n const pb = Math.abs(p - up)\n const pc = Math.abs(p - upLeft)\n value = raw + (pa <= pb && pa <= pc ? left : pb <= pc ? up : upLeft)\n break\n }\n default: value = raw\n }\n out[base + i] = value & 0xff\n }\n written = base + Math.max(0, available)\n }\n return out.subarray(0, written)\n}\n\n/**\n * A stream's decoded data, or `null` when it uses a filter other than\n * FlateDecode (§7.4.4) or does not decode within `maxOutputLength`.\n */\nexport function decodePdfStream(\n stream: PdfStream,\n resolve: PdfResolver,\n maxOutputLength: number,\n): Uint8Array | null {\n const filters = asArray(stream.dict.entries.get('Filter'), resolve)\n const params = asArray(stream.dict.entries.get('DecodeParms'), resolve)\n if (filters.length > 8) return null\n let data: Uint8Array | null = stream.data\n for (let i = 0; i < filters.length && data; i++) {\n const filter = resolve(filters[i])\n if (filter?.kind !== 'name') return null\n if (filter.name !== 'FlateDecode' && filter.name !== 'Fl') return null\n const param = resolve(params[i])\n data = inflatePdf(data, maxOutputLength)\n if (data) data = unpredict(data, param?.kind === 'dict' ? param : null)\n }\n if (data && data.length > maxOutputLength) return null\n return data\n}\n"],"names":["constants","inflateRawSync","inflateSync","PDF_NULL","kind","PDF_MAX_DEPTH","PDF_MAX_TOKENS","MAX_WORD","CHAR_CLASS","Uint8Array","b","c","charCodeAt","byteAt","bytes","i","end","length","isPdfWhitespace","isRegular","hexValue","latin1Text","out","String","fromCharCode","subarray","latin1Bytes","text","indexOfBytes","needle","from","to","first","undefined","last","Math","min","outer","max","j","lastIndexOfBytes","ByteSink","push","buf","next","set","slice","NUMBER","INTEGER","PdfLexer","at","skipSpace","pos","peekKeyword","word","type","name","literalString","hexString","test","value","Number","isFinite","hi","lo","depth","e","code","k","d","hex","high","v","STRUCTURAL","Set","ENDSTREAM","PdfParser","lexer","parseObject","failed","budget","obj","object","parseIndirectObject","numToken","genToken","isIntegerToken","start","token","streamBody","num","gen","mark","r","array","dict","items","has","item","entries","Map","valueMark","valueToken","streamLength","probe","data","found","stop","get","options","resolveLength","isSafeInteger","HEX","serializePdfName","charAt","serializePdfString","toString","padStart","serializePdfObject","map","join","key","PDF_DOC_ENCODING","utf16Text","littleEndian","a","toWellFormed","decodePdfTextString","TextDecoder","decode","stripLanguageEscapes","replace","TRAILING_NULS","ESC","RegExp","open","indexOf","close","encodePdfTextString","units","unit","UTF8_STRICT","fatal","pdfNameText","ascii","pdfNameFromText","TextEncoder","encode","asArray","resolve","intParam","fallback","isInteger","inflatePdf","maxOutputLength","lenient","finishFlush","Z_SYNC_FLUSH","attempts","attempt","buffer","byteOffset","byteLength","unpredict","params","predictor","colors","bpc","columns","includes","bpp","ceil","rowLength","row","rows","written","src","base","available","raw","left","up","upLeft","p","pa","abs","pb","pc","decodePdfStream","stream","filters","filter","param"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;;;;;;;;;CAoBC,GAED,SAASA,SAAS,EAAEC,cAAc,EAAEC,WAAW,QAAQ,OAAM;AA+D7D,OAAO,MAAMC,WAAoB;IAAEC,MAAM;AAAO,EAAC;AAEjD,yDAAyD,GACzD,OAAO,MAAMC,gBAAgB,GAAE;AAC/B,oEAAoE,GACpE,OAAO,MAAMC,iBAAiB,QAAS;AACvC,uEAAuE,GACvE,MAAMC,WAAW;AAEjB,mEAAmE;AACnE,MAAMC,aAAa,IAAIC,WAAW;AAClC,KAAK,MAAMC,KAAK;IAAC;IAAM;IAAM;IAAM;IAAM;IAAM;CAAK,CAAEF,UAAU,CAACE,EAAE,GAAG;AACtE,KAAK,MAAMC,KAAK,aAAcH,UAAU,CAACG,EAAEC,UAAU,CAAC,GAAG,GAAG;AAE5D,iDAAiD,GACjD,SAASC,OAAOC,KAAiB,EAAEC,CAAS,EAAEC,MAAMF,MAAMG,MAAM;QAClCH;IAA5B,OAAOC,KAAK,KAAKA,IAAIC,OAAOF,WAAAA,KAAK,CAACC,EAAE,YAARD,WAAY,CAAC,IAAK,CAAC;AACjD;AAEA,OAAO,SAASI,gBAAgBR,CAAS;IACvC,OAAOA,KAAK,KAAKA,IAAI,OAAOF,UAAU,CAACE,EAAE,KAAK;AAChD;AAEA,SAASS,UAAUT,CAAS;IAC1B,OAAOA,KAAK,KAAKA,IAAI,OAAOF,UAAU,CAACE,EAAE,KAAK;AAChD;AAEA,SAASU,SAASV,CAAS;IACzB,IAAIA,KAAK,QAAQA,KAAK,MAAM,OAAOA,IAAI;IACvC,IAAIA,KAAK,QAAQA,KAAK,MAAM,OAAOA,IAAI;IACvC,IAAIA,KAAK,QAAQA,KAAK,MAAM,OAAOA,IAAI;IACvC,OAAO,CAAC;AACV;AAEA,iDAAiD,GACjD,OAAO,SAASW,WAAWP,KAAiB;IAC1C,IAAIQ,MAAM;IACV,IAAK,IAAIP,IAAI,GAAGA,IAAID,MAAMG,MAAM,EAAEF,KAAK,KAAM;QAC3CO,OAAOC,OAAOC,YAAY,IAAIV,MAAMW,QAAQ,CAACV,GAAGA,IAAI;IACtD;IACA,OAAOO;AACT;AAEA,4CAA4C,GAC5C,OAAO,SAASI,YAAYC,IAAY;IACtC,MAAML,MAAM,IAAIb,WAAWkB,KAAKV,MAAM;IACtC,IAAK,IAAIF,IAAI,GAAGA,IAAIY,KAAKV,MAAM,EAAEF,IAAKO,GAAG,CAACP,EAAE,GAAGY,KAAKf,UAAU,CAACG,KAAK;IACpE,OAAOO;AACT;AAEA,6DAA6D,GAC7D,OAAO,SAASM,aACdd,KAAiB,EACjBe,MAAkB,EAClBC,OAAO,CAAC,EACRC,KAAKjB,MAAMG,MAAM;IAEjB,MAAMe,QAAQH,MAAM,CAAC,EAAE;IACvB,IAAIG,UAAUC,WAAW,OAAO,CAAC;IACjC,MAAMC,OAAOC,KAAKC,GAAG,CAACL,IAAIjB,MAAMG,MAAM,IAAIY,OAAOZ,MAAM;IACvDoB,OAAO,IAAK,IAAItB,IAAIoB,KAAKG,GAAG,CAAC,GAAGR,OAAOf,KAAKmB,MAAMnB,IAAK;QACrD,IAAID,KAAK,CAACC,EAAE,KAAKiB,OAAO;QACxB,IAAK,IAAIO,IAAI,GAAGA,IAAIV,OAAOZ,MAAM,EAAEsB,IAAK;YACtC,IAAIzB,KAAK,CAACC,IAAIwB,EAAE,KAAKV,MAAM,CAACU,EAAE,EAAE,SAASF;QAC3C;QACA,OAAOtB;IACT;IACA,OAAO,CAAC;AACV;AAEA,wEAAwE,GACxE,OAAO,SAASyB,iBACd1B,KAAiB,EACjBe,MAAkB,EAClBC,OAAOhB,MAAMG,MAAM,GAAGY,OAAOZ,MAAM;IAEnC,MAAMe,QAAQH,MAAM,CAAC,EAAE;IACvB,IAAIG,UAAUC,WAAW,OAAO,CAAC;IACjCI,OAAO,IAAK,IAAItB,IAAIoB,KAAKC,GAAG,CAACN,MAAMhB,MAAMG,MAAM,GAAGY,OAAOZ,MAAM,GAAGF,KAAK,GAAGA,IAAK;QAC7E,IAAID,KAAK,CAACC,EAAE,KAAKiB,OAAO;QACxB,IAAK,IAAIO,IAAI,GAAGA,IAAIV,OAAOZ,MAAM,EAAEsB,IAAK;YACtC,IAAIzB,KAAK,CAACC,IAAIwB,EAAE,KAAKV,MAAM,CAACU,EAAE,EAAE,SAASF;QAC3C;QACA,OAAOtB;IACT;IACA,OAAO,CAAC;AACV;AAEA,gEAAgE,GAChE,IAAA,AAAM0B,WAAN,MAAMA;IAGJC,KAAKhC,CAAS,EAAQ;QACpB,IAAI,IAAI,CAACO,MAAM,KAAK,IAAI,CAAC0B,GAAG,CAAC1B,MAAM,EAAE;YACnC,MAAM2B,OAAO,IAAInC,WAAW,IAAI,CAACkC,GAAG,CAAC1B,MAAM,GAAG;YAC9C2B,KAAKC,GAAG,CAAC,IAAI,CAACF,GAAG;YACjB,IAAI,CAACA,GAAG,GAAGC;QACb;QACA,IAAI,CAACD,GAAG,CAAC,IAAI,CAAC1B,MAAM,GAAG,GAAGP;IAC5B;IACAI,QAAoB;QAClB,OAAO,IAAI,CAAC6B,GAAG,CAACG,KAAK,CAAC,GAAG,IAAI,CAAC7B,MAAM;IACtC;;aAZQ0B,MAAM,IAAIlC,WAAW;aAC7BQ,SAAS;;AAYX;AAUA,MAAM8B,SAAS;AACf,MAAMC,UAAU;AAEhB,qEAAqE,GACrE,OAAO,MAAMC;IAaHC,GAAGnC,CAAS,EAAU;QAC5B,OAAOF,OAAO,IAAI,CAACC,KAAK,EAAEC,GAAG,IAAI,CAACC,GAAG;IACvC;IAEA,iDAAiD,GACjDmC,YAAkB;QAChB,OAAS;YACP,MAAMzC,IAAI,IAAI,CAACwC,EAAE,CAAC,IAAI,CAACE,GAAG;YAC1B,IAAI1C,IAAI,GAAG;YACX,IAAIQ,gBAAgBR,IAAI;gBACtB,IAAI,CAAC0C,GAAG;YACV,OAAO,IAAI1C,MAAM,MAAM;gBACrB,MAAO,IAAI,CAAC0C,GAAG,GAAG,IAAI,CAACpC,GAAG,CAAE;oBAC1B,MAAML,IAAI,IAAI,CAACuC,EAAE,CAAC,IAAI,CAACE,GAAG;oBAC1B,IAAIzC,MAAM,QAAQA,MAAM,MAAM;oBAC9B,IAAI,CAACyC,GAAG;gBACV;YACF,OAAO;gBACL;YACF;QACF;IACF;IAEA,0DAA0D,GAC1DC,YAAYC,IAAY,EAAW;QACjC,IAAI,CAACH,SAAS;QACd,IAAK,IAAIpC,IAAI,GAAGA,IAAIuC,KAAKrC,MAAM,EAAEF,IAAK;YACpC,IAAI,IAAI,CAACmC,EAAE,CAAC,IAAI,CAACE,GAAG,GAAGrC,OAAOuC,KAAK1C,UAAU,CAACG,IAAI,OAAO;QAC3D;QACA,OAAO,CAACI,UAAU,IAAI,CAAC+B,EAAE,CAAC,IAAI,CAACE,GAAG,GAAGE,KAAKrC,MAAM;IAClD;IAEA2B,OAAiB;QACf,IAAI,CAACO,SAAS;QACd,MAAMzC,IAAI,IAAI,CAACwC,EAAE,CAAC,IAAI,CAACE,GAAG;QAC1B,IAAI1C,IAAI,GAAG,OAAO;YAAE6C,MAAM;QAAM;QAChC,OAAQ7C;YACN,KAAK;gBACH,OAAO,IAAI,CAAC8C,IAAI;YAClB,KAAK;gBACH,OAAO,IAAI,CAACC,aAAa;YAC3B,KAAK;gBACH,IAAI,IAAI,CAACP,EAAE,CAAC,IAAI,CAACE,GAAG,GAAG,OAAO,MAAM;oBAClC,IAAI,CAACA,GAAG,IAAI;oBACZ,OAAO;wBAAEG,MAAM;wBAAS5B,MAAM;oBAAK;gBACrC;gBACA,OAAO,IAAI,CAAC+B,SAAS;YACvB,KAAK;gBACH,IAAI,IAAI,CAACR,EAAE,CAAC,IAAI,CAACE,GAAG,GAAG,OAAO,MAAM;oBAClC,IAAI,CAACA,GAAG,IAAI;oBACZ,OAAO;wBAAEG,MAAM;wBAAS5B,MAAM;oBAAK;gBACrC;gBACA,IAAI,CAACyB,GAAG;gBACR,OAAO;oBAAEG,MAAM;oBAAW5B,MAAM;gBAAI;YACtC,KAAK;gBACH,IAAI,CAACyB,GAAG;gBACR,OAAO;oBAAEG,MAAM;oBAAS5B,MAAM;gBAAI;YACpC,KAAK;gBACH,IAAI,CAACyB,GAAG;gBACR,OAAO;oBAAEG,MAAM;oBAAS5B,MAAM;gBAAI;YACpC,KAAK;gBACH,IAAI,CAACyB,GAAG;gBACR,OAAO;oBAAEG,MAAM;oBAAS5B,MAAM;gBAAI;YACpC,KAAK;gBACH,IAAI,CAACyB,GAAG;gBACR,OAAO;oBAAEG,MAAM;oBAAS5B,MAAM;gBAAI;YACpC,KAAK;gBACH,IAAI,CAACyB,GAAG;gBACR,OAAO;oBAAEG,MAAM;oBAAW5B,MAAM;gBAAI;QACxC;QACA,IAAIA,OAAO;QACX,MAAOR,UAAU,IAAI,CAAC+B,EAAE,CAAC,IAAI,CAACE,GAAG,GAAI;YACnC,IAAIzB,KAAKV,MAAM,GAAGV,UAAUoB,QAAQJ,OAAOC,YAAY,CAAC,IAAI,CAAC0B,EAAE,CAAC,IAAI,CAACE,GAAG;YACxE,IAAI,CAACA,GAAG;QACV;QACA,IAAIL,OAAOY,IAAI,CAAChC,OAAO;YACrB,MAAMiC,QAAQC,OAAOlC;YACrB,IAAIkC,OAAOC,QAAQ,CAACF,QAAQ,OAAO;gBAAEL,MAAM;gBAAUK;gBAAOjC;YAAK;QACnE;QACA,OAAO;YAAE4B,MAAM;YAAW5B;QAAK;IACjC;IAEA,yDAAyD,GACzD,AAAQ6B,OAAiB;QACvB,IAAI,CAACJ,GAAG;QACR,IAAII,OAAO;QACX,MAAOrC,UAAU,IAAI,CAAC+B,EAAE,CAAC,IAAI,CAACE,GAAG,GAAI;YACnC,IAAI1C,IAAI,IAAI,CAACwC,EAAE,CAAC,IAAI,CAACE,GAAG;YACxB,IAAI1C,MAAM,MAAM;gBACd,MAAMqD,KAAK3C,SAAS,IAAI,CAAC8B,EAAE,CAAC,IAAI,CAACE,GAAG,GAAG;gBACvC,MAAMY,KAAK5C,SAAS,IAAI,CAAC8B,EAAE,CAAC,IAAI,CAACE,GAAG,GAAG;gBACvC,IAAIW,MAAM,KAAKC,MAAM,GAAG;oBACtBtD,IAAIqD,KAAK,KAAKC;oBACd,IAAI,CAACZ,GAAG,IAAI;gBACd;YACF;YACA,IAAII,KAAKvC,MAAM,GAAGV,UAAUiD,QAAQjC,OAAOC,YAAY,CAACd;YACxD,IAAI,CAAC0C,GAAG;QACV;QACA,OAAO;YAAEG,MAAM;YAAQC;QAAK;IAC9B;IAEA;;;;;GAKC,GACD,AAAQC,gBAA0B;QAChC,IAAI,CAACL,GAAG;QACR,MAAM9B,MAAM,IAAImB;QAChB,IAAIwB,QAAQ;QACZ,MAAO,IAAI,CAACb,GAAG,GAAG,IAAI,CAACpC,GAAG,CAAE;YAC1B,MAAMN,IAAI,IAAI,CAACwC,EAAE,CAAC,IAAI,CAACE,GAAG;YAC1B,IAAI1C,MAAM,MAAM;gBACduD;gBACA3C,IAAIoB,IAAI,CAAChC;YACX,OAAO,IAAIA,MAAM,MAAM;gBACrB,IAAI,EAAEuD,UAAU,GAAG;gBACnB3C,IAAIoB,IAAI,CAAChC;YACX,OAAO,IAAIA,MAAM,MAAM;gBACrB,MAAMwD,IAAI,IAAI,CAAChB,EAAE,CAAC,IAAI,CAACE,GAAG;gBAC1B,OAAQc;oBACN,KAAK;wBAAM5C,IAAIoB,IAAI,CAAC;wBAAO;oBAC3B,KAAK;wBAAMpB,IAAIoB,IAAI,CAAC;wBAAO;oBAC3B,KAAK;wBAAMpB,IAAIoB,IAAI,CAAC;wBAAO;oBAC3B,KAAK;wBAAMpB,IAAIoB,IAAI,CAAC;wBAAO;oBAC3B,KAAK;wBAAMpB,IAAIoB,IAAI,CAAC;wBAAO;oBAC3B,KAAK;wBACH,IAAI,IAAI,CAACQ,EAAE,CAAC,IAAI,CAACE,GAAG,MAAM,MAAM,IAAI,CAACA,GAAG;wBACxC;oBACF,KAAK;wBACH;oBACF,KAAK,CAAC;wBACJ;oBACF;wBACE,IAAIc,KAAK,QAAQA,KAAK,MAAM;4BAC1B,IAAIC,OAAOD,IAAI;4BACf,IAAK,IAAIE,IAAI,GAAGA,IAAI,GAAGA,IAAK;gCAC1B,MAAMC,IAAI,IAAI,CAACnB,EAAE,CAAC,IAAI,CAACE,GAAG;gCAC1B,IAAIiB,IAAI,QAAQA,IAAI,MAAM;gCAC1BF,OAAOA,OAAO,IAAKE,CAAAA,IAAI,IAAG;gCAC1B,IAAI,CAACjB,GAAG;4BACV;4BACA9B,IAAIoB,IAAI,CAACyB,OAAO;wBAClB,OAAO;4BACL7C,IAAIoB,IAAI,CAACwB;wBACX;gBACJ;YACF,OAAO,IAAIxD,MAAM,MAAM;gBACrB,IAAI,IAAI,CAACwC,EAAE,CAAC,IAAI,CAACE,GAAG,MAAM,MAAM,IAAI,CAACA,GAAG;gBACxC9B,IAAIoB,IAAI,CAAC;YACX,OAAO;gBACLpB,IAAIoB,IAAI,CAAChC;YACX;QACF;QACA,OAAO;YAAE6C,MAAM;YAAUzC,OAAOQ,IAAIR,KAAK;YAAIwD,KAAK;QAAM;IAC1D;IAEA;;;;GAIC,GACD,AAAQZ,YAAsB;QAC5B,IAAI,CAACN,GAAG;QACR,MAAM9B,MAAM,IAAImB;QAChB,IAAI8B,OAAO,CAAC;QACZ,MAAO,IAAI,CAACnB,GAAG,GAAG,IAAI,CAACpC,GAAG,CAAE;YAC1B,MAAMN,IAAI,IAAI,CAACwC,EAAE,CAAC,IAAI,CAACE,GAAG;YAC1B,IAAI1C,MAAM,MAAM;YAChB,MAAM8D,IAAIpD,SAASV;YACnB,IAAI8D,IAAI,GAAG;YACX,IAAID,OAAO,GAAG;gBACZA,OAAOC;YACT,OAAO;gBACLlD,IAAIoB,IAAI,CAAC6B,OAAO,KAAKC;gBACrBD,OAAO,CAAC;YACV;QACF;QACA,IAAIA,QAAQ,GAAGjD,IAAIoB,IAAI,CAAC6B,OAAO;QAC/B,OAAO;YAAEhB,MAAM;YAAUzC,OAAOQ,IAAIR,KAAK;YAAIwD,KAAK;QAAK;IACzD;IA/LA,YACE,AAASxD,KAAiB,EAC1BsC,MAAM,CAAC,EACPpC,MAAMF,MAAMG,MAAM,CAClB;aAHSH,QAAAA;QAIT,IAAI,CAACE,GAAG,GAAGmB,KAAKG,GAAG,CAAC,GAAGH,KAAKC,GAAG,CAACpB,KAAKF,MAAMG,MAAM;QACjD,IAAI,CAACmC,GAAG,GAAGjB,KAAKG,GAAG,CAAC,GAAGc;IACzB;AAyLF;AAEA,wFAAwF,GACxF,MAAMqB,aAAa,IAAIC,IAAI;IACzB;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAaD,MAAMC,YAAYjD,YAAY;AAE9B;;;CAGC,GACD,OAAO,MAAMkD;IAcX,IAAIxB,MAAc;QAChB,OAAO,IAAI,CAACyB,KAAK,CAACzB,GAAG;IACvB;IAEA,+CAA+C,GAC/C0B,cAAgC;QAC9B,IAAI,CAACC,MAAM,GAAG;QACd,IAAI,CAACC,MAAM,GAAG1E;QACd,MAAM2E,MAAM,IAAI,CAACC,MAAM,CAAC,IAAI,CAACL,KAAK,CAACjC,IAAI,IAAI;QAC3C,OAAO,IAAI,CAACmC,MAAM,GAAG,OAAOE;IAC9B;IAEA;;;;GAIC,GACDE,sBAAgD;QAC9C,MAAMC,WAAW,IAAI,CAACP,KAAK,CAACjC,IAAI;QAChC,MAAMyC,WAAW,IAAI,CAACR,KAAK,CAACjC,IAAI;QAChC,IAAI,CAAC0C,eAAeF,aAAa,CAACE,eAAeD,WAAW,OAAO;QACnE,IAAI,CAAC,IAAI,CAACR,KAAK,CAACxB,WAAW,CAAC,QAAQ,OAAO;QAC3C,IAAI,CAACwB,KAAK,CAACjC,IAAI;QACf,IAAI,CAACmC,MAAM,GAAG;QACd,IAAI,CAACC,MAAM,GAAG1E;QACd,MAAMiF,QAAQ,IAAI,CAACV,KAAK,CAACzB,GAAG;QAC5B,MAAMoC,QAAQ,IAAI,CAACX,KAAK,CAACjC,IAAI;QAC7B,IAAIqC;QACJ,IAAIO,MAAMjC,IAAI,KAAK,aAAaiC,MAAM7D,IAAI,KAAK,UAAU;YACvDsD,MAAM9E;QACR,OAAO;YACL8E,MAAM,IAAI,CAACC,MAAM,CAACM,OAAO;YACzB,IAAI,IAAI,CAACT,MAAM,IAAI,CAACE,KAAK;gBACvB,IAAI,CAACJ,KAAK,CAACzB,GAAG,GAAGmC;gBACjB,OAAO;YACT;QACF;QACA,IAAIN,IAAI7E,IAAI,KAAK,UAAU,IAAI,CAACyE,KAAK,CAACxB,WAAW,CAAC,WAAW;YAC3D,IAAI,CAACwB,KAAK,CAACjC,IAAI;YACfqC,MAAM,IAAI,CAACQ,UAAU,CAACR;QACxB;QACA,IAAI,IAAI,CAACJ,KAAK,CAACxB,WAAW,CAAC,WAAW,IAAI,CAACwB,KAAK,CAACjC,IAAI;QACrD,OAAO;YAAE8C,KAAKN,SAASxB,KAAK;YAAE+B,KAAKN,SAASzB,KAAK;YAAEqB;QAAI;IACzD;IAEQC,OAAOM,KAAe,EAAEvB,KAAa,EAAoB;QAC/D,IAAI,EAAE,IAAI,CAACe,MAAM,GAAG,KAAKf,QAAQ5D,eAAe;YAC9C,IAAI,CAAC0E,MAAM,GAAG;YACd,OAAO;QACT;QACA,OAAQS,MAAMjC,IAAI;YAChB,KAAK;gBAAU;oBACb,IAAIP,QAAQW,IAAI,CAAC6B,MAAM7D,IAAI,GAAG;wBAC5B,MAAMiE,OAAO,IAAI,CAACf,KAAK,CAACzB,GAAG;wBAC3B,MAAMuC,MAAM,IAAI,CAACd,KAAK,CAACjC,IAAI;wBAC3B,IAAI0C,eAAeK,MAAM;4BACvB,MAAME,IAAI,IAAI,CAAChB,KAAK,CAACjC,IAAI;4BACzB,IAAIiD,EAAEtC,IAAI,KAAK,aAAasC,EAAElE,IAAI,KAAK,KAAK;gCAC1C,OAAO;oCAAEvB,MAAM;oCAAOsF,KAAKF,MAAM5B,KAAK;oCAAE+B,KAAKA,IAAI/B,KAAK;gCAAC;4BACzD;wBACF;wBACA,IAAI,CAACiB,KAAK,CAACzB,GAAG,GAAGwC;oBACnB;oBACA,OAAO;wBAAExF,MAAM;wBAAUwD,OAAO4B,MAAM5B,KAAK;wBAAEjC,MAAM6D,MAAM7D,IAAI;oBAAC;gBAChE;YACA,KAAK;gBACH,OAAO;oBAAEvB,MAAM;oBAAQoD,MAAMgC,MAAMhC,IAAI;gBAAC;YAC1C,KAAK;gBACH,OAAO;oBAAEpD,MAAM;oBAAUU,OAAO0E,MAAM1E,KAAK;oBAAEwD,KAAKkB,MAAMlB,GAAG;gBAAC;YAC9D,KAAK;gBACH,IAAIkB,MAAM7D,IAAI,KAAK,QAAQ,OAAO;oBAAEvB,MAAM;oBAAWwD,OAAO;gBAAK;gBACjE,IAAI4B,MAAM7D,IAAI,KAAK,SAAS,OAAO;oBAAEvB,MAAM;oBAAWwD,OAAO;gBAAM;gBACnE,IAAI4B,MAAM7D,IAAI,KAAK,QAAQ,OAAOxB;gBAClC,OAAO;YACT,KAAK;gBACH,IAAIqF,MAAM7D,IAAI,KAAK,KAAK,OAAO,IAAI,CAACmE,KAAK,CAAC7B;gBAC1C,IAAIuB,MAAM7D,IAAI,KAAK,MAAM,OAAO,IAAI,CAACoE,IAAI,CAAC9B;gBAC1C,OAAO;YACT;gBACE,OAAO;QACX;IACF;IAEQ6B,MAAM7B,KAAa,EAAoB;QAC7C,MAAM+B,QAAqB,EAAE;QAC7B,OAAS;YACP,MAAMJ,OAAO,IAAI,CAACf,KAAK,CAACzB,GAAG;YAC3B,MAAMoC,QAAQ,IAAI,CAACX,KAAK,CAACjC,IAAI;YAC7B,IAAI4C,MAAMjC,IAAI,KAAK,OAAO;YAC1B,IAAIiC,MAAMjC,IAAI,KAAK,WAAWiC,MAAM7D,IAAI,KAAK,KAAK;YAClD,IAAI6D,MAAMjC,IAAI,KAAK,aAAakB,WAAWwB,GAAG,CAACT,MAAM7D,IAAI,GAAG;gBAC1D,IAAI,CAACkD,KAAK,CAACzB,GAAG,GAAGwC;gBACjB;YACF;YACA,MAAMM,OAAO,IAAI,CAAChB,MAAM,CAACM,OAAOvB,QAAQ;YACxC,IAAI,IAAI,CAACc,MAAM,EAAE,OAAO;YACxB,IAAImB,MAAMF,MAAMtD,IAAI,CAACwD;QACvB;QACA,OAAO;YAAE9F,MAAM;YAAS4F;QAAM;IAChC;IAEQD,KAAK9B,KAAa,EAAoB;QAC5C,MAAMkC,UAAU,IAAIC;QACpB,OAAS;YACP,MAAMR,OAAO,IAAI,CAACf,KAAK,CAACzB,GAAG;YAC3B,MAAMoC,QAAQ,IAAI,CAACX,KAAK,CAACjC,IAAI;YAC7B,IAAI4C,MAAMjC,IAAI,KAAK,OAAO;YAC1B,IAAIiC,MAAMjC,IAAI,KAAK,WAAWiC,MAAM7D,IAAI,KAAK,MAAM;YACnD,IAAI6D,MAAMjC,IAAI,KAAK,aAAakB,WAAWwB,GAAG,CAACT,MAAM7D,IAAI,GAAG;gBAC1D,IAAI,CAACkD,KAAK,CAACzB,GAAG,GAAGwC;gBACjB;YACF;YACA,IAAIJ,MAAMjC,IAAI,KAAK,QAAQ;gBACzB,8DAA8D;gBAC9D,IAAI,CAAC2B,MAAM,CAACM,OAAOvB,QAAQ;gBAC3B,IAAI,IAAI,CAACc,MAAM,EAAE,OAAO;gBACxB;YACF;YACA,MAAMsB,YAAY,IAAI,CAACxB,KAAK,CAACzB,GAAG;YAChC,MAAMkD,aAAa,IAAI,CAACzB,KAAK,CAACjC,IAAI;YAClC,IAAI0D,WAAW/C,IAAI,KAAK,WAAW+C,WAAW3E,IAAI,KAAK,MAAM;YAC7D,IACE2E,WAAW/C,IAAI,KAAK,SACnB+C,WAAW/C,IAAI,KAAK,aAAakB,WAAWwB,GAAG,CAACK,WAAW3E,IAAI,GAChE;gBACA,IAAI,CAACkD,KAAK,CAACzB,GAAG,GAAGiD;gBACjB;YACF;YACA,MAAMzC,QAAQ,IAAI,CAACsB,MAAM,CAACoB,YAAYrC,QAAQ;YAC9C,IAAI,IAAI,CAACc,MAAM,EAAE,OAAO;YACxB,oEAAoE;YACpE,oEAAoE;YACpE,IAAInB,SAAS,CAACuC,QAAQF,GAAG,CAACT,MAAMhC,IAAI,GAAG2C,QAAQtD,GAAG,CAAC2C,MAAMhC,IAAI,EAAEI;QACjE;QACA,OAAO;YAAExD,MAAM;YAAQ+F;QAAQ;IACjC;IAEA;;;;;GAKC,GACD,AAAQV,WAAWM,IAAa,EAAa;QAC3C,MAAM,EAAEjF,KAAK,EAAE,GAAG,IAAI;QACtB,MAAME,MAAM,IAAI,CAAC6D,KAAK,CAAC7D,GAAG;QAC1B,IAAIuE,QAAQ,IAAI,CAACV,KAAK,CAACzB,GAAG;QAC1B,IAAIvC,OAAOC,OAAOyE,OAAOvE,SAAS,MAAMuE;QACxC,IAAI1E,OAAOC,OAAOyE,OAAOvE,SAAS,MAAMuE;QACxC,MAAMtE,SAAS,IAAI,CAACsF,YAAY,CAACR;QACjC,IAAI9E,WAAW,QAAQsE,QAAQtE,UAAUD,KAAK;YAC5C,MAAMwF,QAAQ,IAAIvD,SAASnC,OAAOyE,QAAQtE,QAAQD;YAClD,IAAIwF,MAAMnD,WAAW,CAAC,cAAc;gBAClCmD,MAAM5D,IAAI;gBACV,IAAI,CAACiC,KAAK,CAACzB,GAAG,GAAGoD,MAAMpD,GAAG;gBAC1B,OAAO;oBAAEhD,MAAM;oBAAU2F;oBAAMU,MAAM3F,MAAMW,QAAQ,CAAC8D,OAAOA,QAAQtE;gBAAQ;YAC7E;QACF;QACA,MAAMyF,QAAQ9E,aAAad,OAAO6D,WAAWY,OAAOvE;QACpD,IAAI2F,OAAOD,QAAQ,IAAI1F,MAAM0F;QAC7B,IAAI7F,OAAOC,OAAO6F,OAAO,GAAG3F,SAAS,QAAQ2F,OAAOpB,OAAOoB;QAC3D,IAAI9F,OAAOC,OAAO6F,OAAO,GAAG3F,SAAS,QAAQ2F,OAAOpB,OAAOoB;QAC3D,IAAI,CAAC9B,KAAK,CAACzB,GAAG,GAAGsD,QAAQ,IAAI1F,MAAM0F,QAAQ/B,UAAU1D,MAAM;QAC3D,OAAO;YAAEb,MAAM;YAAU2F;YAAMU,MAAM3F,MAAMW,QAAQ,CAAC8D,OAAOoB;QAAM;IACnE;IAEQJ,aAAaR,IAAa,EAAiB;;QACjD,MAAMnC,QAAQmC,KAAKI,OAAO,CAACS,GAAG,CAAC;QAC/B,IAAI3F,SAAwB;QAC5B,IAAI2C,CAAAA,yBAAAA,MAAOxD,IAAI,MAAK,UAAUa,SAAS2C,MAAMA,KAAK;aAC7C,IAAIA,CAAAA,yBAAAA,MAAOxD,IAAI,MAAK,OAAOa,iBAAS,IAAI,CAAC4F,OAAO,CAACC,aAAa,oBAA1B,IAAI,CAACD,OAAO,CAACC,aAAa,MAA1B,IAAI,CAACD,OAAO,EAAiBjD,yBAAU;QAChF,OAAO3C,WAAW,QAAQ4C,OAAOkD,aAAa,CAAC9F,WAAWA,UAAU,IAAIA,SAAS;IACnF;IArLA,YACE,AAASH,KAAiB,EAC1BsC,MAAM,CAAC,EACP,AAAiByD,UAA2B,CAAC,CAAC,EAC9C7F,MAAMF,MAAMG,MAAM,CAClB;aAJSH,QAAAA;aAEQ+F,UAAAA;aANX7B,SAAS1E;aACTyE,SAAS;QAQf,IAAI,CAACF,KAAK,GAAG,IAAI5B,SAASnC,OAAOsC,KAAKpC;IACxC;AA+KF;AAEA,SAASsE,eACPE,KAAe;IAEf,OAAOA,MAAMjC,IAAI,KAAK,YAAYP,QAAQW,IAAI,CAAC6B,MAAM7D,IAAI;AAC3D;AAEA,8EAA8E;AAC9E,cAAc;AAEd,MAAMqF,MAAM;AAEZ,2EAA2E,GAC3E,OAAO,SAASC,iBAAiBzD,IAAY;IAC3C,IAAIlC,MAAM;IACV,IAAK,IAAIP,IAAI,GAAGA,IAAIyC,KAAKvC,MAAM,EAAEF,IAAK;QACpC,MAAML,IAAI8C,KAAK5C,UAAU,CAACG,KAAK;QAC/B,IAAIL,IAAI,QAAQA,IAAI,QAAQA,MAAM,QAAQF,UAAU,CAACE,EAAE,KAAK,GAAG;YAC7DY,OAAOC,OAAOC,YAAY,CAACd;QAC7B,OAAO;YACLY,OAAO,MAAM0F,IAAIE,MAAM,CAACxG,KAAK,KAAKsG,IAAIE,MAAM,CAACxG,IAAI;QACnD;IACF;IACA,OAAOY;AACT;AAEA;;;;CAIC,GACD,OAAO,SAAS6F,mBAAmBvD,KAAgB;IACjD,IAAIA,MAAMU,GAAG,EAAE;QACb,IAAIhD,MAAM;QACV,KAAK,MAAMZ,KAAKkD,MAAM9C,KAAK,CAAEQ,OAAO0F,IAAIE,MAAM,CAACxG,KAAK,KAAKsG,IAAIE,MAAM,CAACxG,IAAI;QACxE,OAAOY,MAAM;IACf;IACA,IAAIA,MAAM;IACV,KAAK,MAAMZ,KAAKkD,MAAM9C,KAAK,CAAE;QAC3B,IAAIJ,MAAM,QAAQA,MAAM,QAAQA,MAAM,MAAMY,OAAO,OAAOC,OAAOC,YAAY,CAACd;aACzE,IAAIA,MAAM,MAAMY,OAAO;aACvB,IAAIZ,MAAM,MAAMY,OAAO;aACvB,IAAIZ,MAAM,MAAMY,OAAO;aACvB,IAAIZ,KAAK,QAAQA,IAAI,MAAMY,OAAOC,OAAOC,YAAY,CAACd;aACtDY,OAAO,OAAOZ,EAAE0G,QAAQ,CAAC,GAAGC,QAAQ,CAAC,GAAG;IAC/C;IACA,OAAO/F,MAAM;AACf;AAEA;;;;CAIC,GACD,OAAO,SAASgG,mBAAmBrC,GAAc,EAAEhB,QAAQ,CAAC;IAC1D,IAAIA,QAAQ5D,eAAe,OAAO;IAClC,OAAQ4E,IAAI7E,IAAI;QACd,KAAK;YACH,OAAO;QACT,KAAK;YACH,OAAO6E,IAAIrB,KAAK,GAAG,SAAS;QAC9B,KAAK;YACH,OAAOb,OAAOY,IAAI,CAACsB,IAAItD,IAAI,IAAIsD,IAAItD,IAAI,GAAGJ,OAAO0D,IAAIrB,KAAK;QAC5D,KAAK;YACH,OAAOuD,mBAAmBlC;QAC5B,KAAK;YACH,OAAOgC,iBAAiBhC,IAAIzB,IAAI;QAClC,KAAK;YACH,OAAO,GAAGyB,IAAIS,GAAG,CAAC,CAAC,EAAET,IAAIU,GAAG,CAAC,EAAE,CAAC;QAClC,KAAK;YACH,OAAO,MAAMV,IAAIe,KAAK,CAACuB,GAAG,CAAC,CAACrB,OAASoB,mBAAmBpB,MAAMjC,QAAQ,IAAIuD,IAAI,CAAC,OAAO;QACxF,KAAK;YAAQ;gBACX,MAAMrB,UAAoB,EAAE;gBAC5B,KAAK,MAAM,CAACsB,KAAK7D,MAAM,IAAIqB,IAAIkB,OAAO,CAAE;oBACtCA,QAAQzD,IAAI,CAACuE,iBAAiBQ,OAAO,MAAMH,mBAAmB1D,OAAOK,QAAQ;gBAC/E;gBACA,OAAO,OAAOkC,QAAQqB,IAAI,CAAC,OAAO;YACpC;QACA,KAAK;YACH,OAAO;IACX;AACF;AAEA,8EAA8E;AAC9E,0BAA0B;AAE1B;;;;CAIC,GACD,MAAME,mBAA2C;IAC/C,MAAM;IAAQ,MAAM;IAAQ,MAAM;IAAQ,MAAM;IAChD,MAAM;IAAQ,MAAM;IAAQ,MAAM;IAAQ,MAAM;IAChD,MAAM;IAAQ,MAAM;IAAQ,MAAM;IAAQ,MAAM;IAChD,MAAM;IAAQ,MAAM;IAAQ,MAAM;IAAQ,MAAM;IAChD,MAAM;IAAQ,MAAM;IAAQ,MAAM;IAAQ,MAAM;IAChD,MAAM;IAAQ,MAAM;IAAQ,MAAM;IAAQ,MAAM;IAChD,MAAM;IAAQ,MAAM;IAAQ,MAAM;IAAQ,MAAM;IAChD,MAAM;IAAQ,MAAM;IAAQ,MAAM;IAAQ,MAAM;IAChD,MAAM;IAAQ,MAAM;IAAQ,MAAM;IAAQ,MAAM;IAChD,MAAM;IAAQ,MAAM;IAAQ,MAAM;IAAQ,MAAM;AAClD;AAEA,SAASC,UAAU7G,KAAiB,EAAEyE,KAAa,EAAEqC,YAAqB;IACxE,IAAItG,MAAM;IACV,IAAK,IAAIP,IAAIwE,OAAOxE,IAAI,IAAID,MAAMG,MAAM,EAAEF,KAAK,EAAG;YACtCD,UACAA;QADV,MAAM+G,KAAI/G,WAAAA,KAAK,CAACC,EAAE,YAARD,WAAY;QACtB,MAAMJ,KAAII,UAAAA,KAAK,CAACC,IAAI,EAAE,YAAZD,UAAgB;QAC1BQ,OAAOC,OAAOC,YAAY,CAACoG,eAAelH,IAAI,MAAMmH,IAAIA,IAAI,MAAMnH;IACpE;IACA,uDAAuD;IACvD,OAAOY,IAAIwG,YAAY;AACzB;AAEA;;;;;;CAMC,GACD,OAAO,SAASC,oBAAoBjH,KAAiB;IACnD,IAAIa;IACJ,IAAIb,KAAK,CAAC,EAAE,KAAK,QAAQA,KAAK,CAAC,EAAE,KAAK,MAAM;QAC1Ca,OAAOgG,UAAU7G,OAAO,GAAG;IAC7B,OAAO,IAAIA,KAAK,CAAC,EAAE,KAAK,QAAQA,KAAK,CAAC,EAAE,KAAK,MAAM;QACjDa,OAAOgG,UAAU7G,OAAO,GAAG;IAC7B,OAAO,IAAIA,KAAK,CAAC,EAAE,KAAK,QAAQA,KAAK,CAAC,EAAE,KAAK,QAAQA,KAAK,CAAC,EAAE,KAAK,MAAM;QACtEa,OAAO,IAAIqG,YAAY,SAASC,MAAM,CAACnH,MAAMW,QAAQ,CAAC;IACxD,OAAO;YAE8CiG;QADnD/F,OAAO;QACP,KAAK,MAAMjB,KAAKI,MAAOa,QAAQJ,OAAOC,YAAY,EAACkG,sBAAAA,gBAAgB,CAAChH,EAAE,YAAnBgH,sBAAuBhH;IAC5E;IACA,OAAOwH,qBAAqBvG,MAAMwG,OAAO,CAACC,eAAe;AAC3D;AAEA,MAAMC,MAAM9G,OAAOC,YAAY,CAAC;AAChC,MAAM4G,gBAAgB,IAAIE,OAAO/G,OAAOC,YAAY,CAAC,KAAK;AAE1D,6EAA6E,GAC7E,SAAS0G,qBAAqBvG,IAAY;IACxC,IAAIL,MAAM;IACV,IAAI4B,KAAK;IACT,OAAS;QACP,MAAMqF,OAAO5G,KAAK6G,OAAO,CAACH,KAAKnF;QAC/B,IAAIqF,OAAO,GAAG;QACd,MAAME,QAAQ9G,KAAK6G,OAAO,CAACH,KAAKE,OAAO;QACvC,IAAIE,QAAQ,KAAKA,QAAQF,OAAO,GAAG;YACjCjH,OAAOK,KAAKmB,KAAK,CAACI,IAAIqF,OAAO;YAC7BrF,KAAKqF,OAAO;YACZ;QACF;QACAjH,OAAOK,KAAKmB,KAAK,CAACI,IAAIqF;QACtBrF,KAAKuF,QAAQ;IACf;IACA,OAAOnH,MAAMK,KAAKmB,KAAK,CAACI;AAC1B;AAEA;;;;CAIC,GACD,OAAO,SAASwF,oBAAoB/G,IAAY;IAC9C,IAAI,uBAAuBgC,IAAI,CAAChC,OAAO;QACrC,OAAO;YAAEvB,MAAM;YAAUU,OAAOY,YAAYC;YAAO2C,KAAK;QAAM;IAChE;IACA,MAAMqE,QAAQhH,KAAKmG,YAAY;IAC/B,MAAMhH,QAAQ,IAAIL,WAAW,IAAIkI,MAAM1H,MAAM,GAAG;IAChDH,KAAK,CAAC,EAAE,GAAG;IACXA,KAAK,CAAC,EAAE,GAAG;IACX,IAAK,IAAIC,IAAI,GAAGA,IAAI4H,MAAM1H,MAAM,EAAEF,IAAK;QACrC,MAAM6H,OAAOD,MAAM/H,UAAU,CAACG;QAC9BD,KAAK,CAAC,IAAIC,IAAI,EAAE,GAAG6H,QAAQ;QAC3B9H,KAAK,CAAC,IAAIC,IAAI,EAAE,GAAG6H,OAAO;IAC5B;IACA,OAAO;QAAExI,MAAM;QAAUU;QAAOwD,KAAK;IAAK;AAC5C;AAEA,MAAMuE,cAAc,IAAIb,YAAY,SAAS;IAAEc,OAAO;AAAK;AAE3D;;;CAGC,GACD,OAAO,SAASC,YAAYvF,IAAY;IACtC,IAAIwF,QAAQ;IACZ,IAAK,IAAIjI,IAAI,GAAGA,IAAIyC,KAAKvC,MAAM,IAAI+H,OAAOjI,IAAKiI,QAAQxF,KAAK5C,UAAU,CAACG,KAAK;IAC5E,IAAIiI,OAAO,OAAOxF;IAClB,IAAI;QACF,OAAOqF,YAAYZ,MAAM,CAACvG,YAAY8B;IACxC,EAAE,eAAM;QACN,OAAOA;IACT;AACF;AAEA,4EAA4E,GAC5E,OAAO,SAASyF,gBAAgBtH,IAAY;IAC1C,OAAON,WAAW,IAAI6H,cAAcC,MAAM,CAACxH;AAC7C;AAOA,SAASyH,QAAQnE,GAA0B,EAAEoE,OAAoB;IAC/D,MAAMzF,QAAQyF,QAAQpE;IACtB,IAAI,CAACrB,SAASA,MAAMxD,IAAI,KAAK,QAAQ,OAAO,EAAE;IAC9C,OAAOwD,MAAMxD,IAAI,KAAK,UAAUwD,MAAMoC,KAAK,GAAG;QAACpC;KAAM;AACvD;AAEA,SAAS0F,SAASvD,IAAoB,EAAE0B,GAAW,EAAE8B,QAAgB;IACnE,MAAM3F,QAAQmC,wBAAAA,KAAMI,OAAO,CAACS,GAAG,CAACa;IAChC,OAAO7D,CAAAA,yBAAAA,MAAOxD,IAAI,MAAK,YAAYyD,OAAO2F,SAAS,CAAC5F,MAAMA,KAAK,IAAIA,MAAMA,KAAK,GAAG2F;AACnF;AAEA;;;;;CAKC,GACD,OAAO,SAASE,WAAWhD,IAAgB,EAAEiD,eAAuB;IAClE,MAAM7C,UAAU;QAAE6C;IAAgB;IAClC,MAAMC,UAAU;QAAED;QAAiBE,aAAa5J,UAAU6J,YAAY;IAAC;IACvE,MAAMC,WAAW;QACf,IAAM5J,YAAYuG,MAAMI;QACxB,IAAM3G,YAAYuG,MAAMkD;QACxB,IAAM1J,eAAewG,MAAMkD;KAC5B;IACD,KAAK,MAAMI,WAAWD,SAAU;QAC9B,IAAI;YACF,MAAMxI,MAAMyI;YACZ,OAAO,IAAItJ,WAAWa,IAAI0I,MAAM,EAAE1I,IAAI2I,UAAU,EAAE3I,IAAI4I,UAAU;QAClE,EAAE,eAAM;QACN,qEAAqE;QACvE;IACF;IACA,OAAO;AACT;AAEA;;;;CAIC,GACD,OAAO,SAASC,UAAU1D,IAAgB,EAAE2D,MAAsB;IAChE,MAAMC,YAAYf,SAASc,QAAQ,aAAa;IAChD,IAAIC,cAAc,GAAG,OAAO5D;IAC5B,MAAM6D,SAAShB,SAASc,QAAQ,UAAU;IAC1C,MAAMG,MAAMjB,SAASc,QAAQ,oBAAoB;IACjD,MAAMI,UAAUlB,SAASc,QAAQ,WAAW;IAC5C,IAAIE,SAAS,KAAKA,SAAS,MAAM,CAAC;QAAC;QAAG;QAAG;QAAG;QAAG;KAAG,CAACG,QAAQ,CAACF,MAAM,OAAO;IACzE,IAAIC,UAAU,KAAKA,UAAU,KAAK,IAAI,OAAO;IAC7C,MAAME,MAAMvI,KAAKG,GAAG,CAAC,GAAGH,KAAKwI,IAAI,CAAC,AAACL,SAASC,MAAO;IACnD,MAAMK,YAAYzI,KAAKwI,IAAI,CAAC,AAACL,SAASC,MAAMC,UAAW;IACvD,IAAIH,cAAc,GAAG;QACnB,IAAIE,QAAQ,GAAG,OAAO;QACtB,MAAMjJ,MAAMmF,KAAK3D,KAAK;QACtB,IAAK,IAAI+H,MAAM,GAAGA,MAAMvJ,IAAIL,MAAM,EAAE4J,OAAOD,UAAW;YACpD,IAAK,IAAI7J,IAAI8J,MAAMH,KAAK3J,IAAIoB,KAAKC,GAAG,CAACyI,MAAMD,WAAWtJ,IAAIL,MAAM,GAAGF,IAAK;oBAC3DO,QAAgBA;gBAA3BA,GAAG,CAACP,EAAE,GAAG,EAAEO,SAAAA,GAAG,CAACP,EAAE,YAANO,SAAU,OAAMA,QAAAA,GAAG,CAACP,IAAI2J,IAAI,YAAZpJ,QAAgB,KAAM;YACnD;QACF;QACA,OAAOA;IACT;IACA,IAAI+I,YAAY,MAAMA,YAAY,IAAI,OAAO;IAC7C,MAAMS,OAAO3I,KAAKwI,IAAI,CAAClE,KAAKxF,MAAM,GAAI2J,CAAAA,YAAY,CAAA;IAClD,wEAAwE;IACxE,sEAAsE;IACtE,MAAMtJ,MAAM,IAAIb,WAAW0B,KAAKC,GAAG,CAAC0I,OAAOF,WAAWnE,KAAKxF,MAAM;IACjE,IAAI8J,UAAU;IACd,IAAK,IAAIF,MAAM,GAAGA,MAAMC,MAAMD,MAAO;YAEtBpE;QADb,MAAMuE,MAAMH,MAAOD,CAAAA,YAAY,CAAA;QAC/B,MAAMrH,QAAOkD,YAAAA,IAAI,CAACuE,IAAI,YAATvE,YAAa;QAC1B,MAAMwE,OAAOJ,MAAMD;QACnB,MAAMM,YAAY/I,KAAKC,GAAG,CAACwI,WAAWnE,KAAKxF,MAAM,GAAG+J,MAAM;QAC1D,IAAK,IAAIjK,IAAI,GAAGA,IAAImK,WAAWnK,IAAK;gBACtB0F,QACanF,QACHA,QACgBA;YAHtC,MAAM6J,OAAM1E,SAAAA,IAAI,CAACuE,MAAM,IAAIjK,EAAE,YAAjB0F,SAAqB;YACjC,MAAM2E,OAAOrK,KAAK2J,OAAOpJ,SAAAA,GAAG,CAAC2J,OAAOlK,IAAI2J,IAAI,YAAnBpJ,SAAuB,IAAK;YACrD,MAAM+J,KAAKR,MAAM,KAAKvJ,SAAAA,GAAG,CAAC2J,OAAOL,YAAY7J,EAAE,YAAzBO,SAA6B,IAAK;YACxD,MAAMgK,SAAST,MAAM,KAAK9J,KAAK2J,OAAOpJ,SAAAA,GAAG,CAAC2J,OAAOL,YAAY7J,IAAI2J,IAAI,YAA/BpJ,SAAmC,IAAK;YAC9E,IAAIsC;YACJ,OAAQL;gBACN,KAAK;oBAAGK,QAAQuH,MAAMC;oBAAM;gBAC5B,KAAK;oBAAGxH,QAAQuH,MAAME;oBAAI;gBAC1B,KAAK;oBAAGzH,QAAQuH,MAAO,CAAA,AAACC,OAAOC,MAAO,CAAA;oBAAI;gBAC1C,KAAK;oBAAG;wBACN,MAAME,IAAIH,OAAOC,KAAKC;wBACtB,MAAME,KAAKrJ,KAAKsJ,GAAG,CAACF,IAAIH;wBACxB,MAAMM,KAAKvJ,KAAKsJ,GAAG,CAACF,IAAIF;wBACxB,MAAMM,KAAKxJ,KAAKsJ,GAAG,CAACF,IAAID;wBACxB1H,QAAQuH,MAAOK,CAAAA,MAAME,MAAMF,MAAMG,KAAKP,OAAOM,MAAMC,KAAKN,KAAKC,MAAK;wBAClE;oBACF;gBACA;oBAAS1H,QAAQuH;YACnB;YACA7J,GAAG,CAAC2J,OAAOlK,EAAE,GAAG6C,QAAQ;QAC1B;QACAmH,UAAUE,OAAO9I,KAAKG,GAAG,CAAC,GAAG4I;IAC/B;IACA,OAAO5J,IAAIG,QAAQ,CAAC,GAAGsJ;AACzB;AAEA;;;CAGC,GACD,OAAO,SAASa,gBACdC,MAAiB,EACjBxC,OAAoB,EACpBK,eAAuB;IAEvB,MAAMoC,UAAU1C,QAAQyC,OAAO9F,IAAI,CAACI,OAAO,CAACS,GAAG,CAAC,WAAWyC;IAC3D,MAAMe,SAAShB,QAAQyC,OAAO9F,IAAI,CAACI,OAAO,CAACS,GAAG,CAAC,gBAAgByC;IAC/D,IAAIyC,QAAQ7K,MAAM,GAAG,GAAG,OAAO;IAC/B,IAAIwF,OAA0BoF,OAAOpF,IAAI;IACzC,IAAK,IAAI1F,IAAI,GAAGA,IAAI+K,QAAQ7K,MAAM,IAAIwF,MAAM1F,IAAK;QAC/C,MAAMgL,SAAS1C,QAAQyC,OAAO,CAAC/K,EAAE;QACjC,IAAIgL,CAAAA,0BAAAA,OAAQ3L,IAAI,MAAK,QAAQ,OAAO;QACpC,IAAI2L,OAAOvI,IAAI,KAAK,iBAAiBuI,OAAOvI,IAAI,KAAK,MAAM,OAAO;QAClE,MAAMwI,QAAQ3C,QAAQe,MAAM,CAACrJ,EAAE;QAC/B0F,OAAOgD,WAAWhD,MAAMiD;QACxB,IAAIjD,MAAMA,OAAO0D,UAAU1D,MAAMuF,CAAAA,yBAAAA,MAAO5L,IAAI,MAAK,SAAS4L,QAAQ;IACpE;IACA,IAAIvF,QAAQA,KAAKxF,MAAM,GAAGyI,iBAAiB,OAAO;IAClD,OAAOjD;AACT"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ export interface PdfMetadataRead {
18
+ /**
19
+ * Document-info entries, in the file's order. Text strings are decoded
20
+ * (PDFDocEncoding, UTF-16BE with BOM, UTF-8 with BOM per PDF 2.0);
21
+ * `CreationDate` and `ModDate` become ISO 8601, with a zone only when the
22
+ * file recorded one. A name value (`/Trapped /True`) reads as its text and
23
+ * any other non-string value as its PDF syntax, both `editable: false`.
24
+ * Empty for an encrypted file, whose strings are ciphertext.
25
+ */
26
+ info: Array<{
27
+ name: string;
28
+ value: string;
29
+ editable: boolean;
30
+ }>;
31
+ /**
32
+ * The catalog's `/Metadata` stream as text. Unfiltered or FlateDecode;
33
+ * any other filter, and an encrypted file, read as `null`.
34
+ */
35
+ xmp: string | null;
36
+ /** `/Root /Pages /Count`. */
37
+ pageCount: number | null;
38
+ /** The header's `%PDF-x.y`, or the catalog's `/Version` when later (§7.2.2 note, Table 29). */
39
+ version: string | null;
40
+ /** The trailer has `/Encrypt`. */
41
+ encrypted: boolean;
42
+ /**
43
+ * The file carries a signature, or might: a `/ByteRange` anywhere, a
44
+ * signature field with a value, AcroForm `/SigFlags` 1 or 2, or catalog
45
+ * `/Perms`. Conservative on purpose — a false positive only makes the
46
+ * file read-only; a false negative lets an edit break a signature.
47
+ */
48
+ signed: boolean;
49
+ }
50
+ export interface PdfMetadataUpdate {
51
+ /**
52
+ * Document-info entries by raw name (`Title`, `Author`, `Subject`,
53
+ * `Keywords`, `Creator`, `Producer`, `CreationDate`, `ModDate`, or any
54
+ * custom name as {@link readPdf} spelled it). `null` removes the entry.
55
+ * `CreationDate`/`ModDate` take ISO 8601.
56
+ */
57
+ info: Record<string, string | null>;
58
+ /** A replacement XMP packet for the catalog's `/Metadata` stream. */
59
+ xmp?: string;
60
+ }
61
+ /**
62
+ * A PDF date as ISO 8601, or `null` when it is not one. Missing month and
63
+ * day default to 01 (§7.9.4); a time is shown only when the date has one,
64
+ * and a zone only when both were recorded — never invented.
65
+ */
66
+ export declare function pdfDateToIso(text: string): string | null;
67
+ /** ISO 8601 as a PDF date (§7.9.4), or `null` when it is not ISO. */
68
+ export declare function isoToPdfDate(value: string): string | null;
69
+ /**
70
+ * The metadata a PDF carries, or `null` when the bytes are not a PDF or
71
+ * nothing in them could be found — neither a catalog nor an Info
72
+ * dictionary. Never throws.
73
+ */
74
+ export declare function readPdf(bytes: Uint8Array): PdfMetadataRead | null;
75
+ /**
76
+ * Writes an edit as an incremental update (§7.5.6) appended to `bytes`.
77
+ * Returns the new file; `bytes` is a prefix of it. Throws
78
+ * {@link EmbeddedWriteError} for a file that is not a PDF, is encrypted or
79
+ * signed, or whose cross-reference data had to be repaired to be read —
80
+ * and, as a last line, when the output does not read back as written.
81
+ */
82
+ export declare function writePdf(bytes: Uint8Array, update: PdfMetadataUpdate): Uint8Array;