@eigenpal/docx-js-editor 0.0.20 → 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ClipboardManager-EZ0C6Onq.d.cts → ClipboardManager-B1jZrC6h.d.cts} +1 -1
- package/dist/{ClipboardManager-D6dkOFg6.d.ts → ClipboardManager-jqJVxB6g.d.ts} +1 -1
- package/dist/{DocumentAgent-BcCDg7i2.d.ts → DocumentAgent-CnJ9AEl_.d.cts} +31 -3
- package/dist/{DocumentAgent-B0EC8lPC.d.cts → DocumentAgent-CrbsDniO.d.ts} +31 -3
- package/dist/{FindReplaceDialog-AWQXKEUQ.js → FindReplaceDialog-AQFR4OCT.js} +1 -2
- package/dist/FindReplaceDialog-J3DI3U5I.cjs +1 -0
- package/dist/{FootnotePropertiesDialog-73VT2ZVZ.cjs → FootnotePropertiesDialog-DO5DCAW6.cjs} +1 -2
- package/dist/{FootnotePropertiesDialog-ZM3EF3EF.js → FootnotePropertiesDialog-YYIZU5U6.js} +1 -2
- package/dist/{HyperlinkDialog-BA25XUT5.js → HyperlinkDialog-HGZ2S37Z.js} +1 -2
- package/dist/HyperlinkDialog-PEPS3C2G.cjs +1 -0
- package/dist/{ImagePositionDialog-AIAMKPFK.js → ImagePositionDialog-DQ4JWS4F.js} +1 -2
- package/dist/{ImagePositionDialog-KMK7ROV2.cjs → ImagePositionDialog-UYXYHSP4.cjs} +1 -2
- package/dist/{ImagePropertiesDialog-ERFCUVCW.js → ImagePropertiesDialog-GJMGLM6G.js} +1 -2
- package/dist/{ImagePropertiesDialog-USMMRK6X.cjs → ImagePropertiesDialog-V6SVKINO.cjs} +1 -2
- package/dist/{TablePropertiesDialog-72CIUAZT.cjs → TablePropertiesDialog-A36OXG3A.cjs} +1 -2
- package/dist/{TablePropertiesDialog-EMUEVYB3.js → TablePropertiesDialog-STZOGHJB.js} +1 -2
- package/dist/{agentApi-BFVyKagE.d.cts → agentApi-DfsWRyrP.d.cts} +1 -1
- package/dist/{agentApi-BFVyKagE.d.ts → agentApi-DfsWRyrP.d.ts} +1 -1
- package/dist/{chunk-FDANI5P4.cjs → chunk-2VHQ7YOQ.cjs} +1 -2
- package/dist/chunk-2Y6FLZ5Q.js +3 -0
- package/dist/chunk-32HMU2UV.js +111 -0
- package/dist/chunk-4CUGBNL2.cjs +1 -0
- package/dist/chunk-5GFXHUMP.js +1 -0
- package/dist/chunk-6NDMKJIE.js +9 -0
- package/dist/chunk-6NYA53QC.cjs +258 -0
- package/dist/chunk-7KJ3YVDQ.js +10 -0
- package/dist/{chunk-JOYPFQW2.js → chunk-AARNCPWR.js} +1 -2
- package/dist/{chunk-4QT5LPBA.cjs → chunk-B7TICMXD.cjs} +16 -17
- package/dist/{chunk-2QOEHCBX.js → chunk-BUEMG4NW.js} +1 -2
- package/dist/{chunk-CV5WFE7K.js → chunk-CLDB6TL7.js} +2 -3
- package/dist/{chunk-M2T6XKT5.js → chunk-CTYOM6BE.js} +1 -2
- package/dist/chunk-EH3NY2DQ.cjs +26 -0
- package/dist/{chunk-FGVGZLBL.js → chunk-FVUGBRDD.js} +1 -2
- package/dist/chunk-FXJAIFPR.js +59 -0
- package/dist/chunk-GICVJSFJ.cjs +9 -0
- package/dist/{chunk-Y6VCTLCJ.js → chunk-H5NTJZO4.js} +1 -2
- package/dist/chunk-HT2Z33YM.cjs +111 -0
- package/dist/chunk-JRRTZZ72.cjs +1 -0
- package/dist/{chunk-T2HQYRA7.cjs → chunk-NVAQQYBJ.cjs} +1 -2
- package/dist/chunk-P3AEZKQO.cjs +3 -0
- package/dist/{chunk-GWBTKVFD.cjs → chunk-P7ZF45KZ.cjs} +1 -2
- package/dist/{chunk-QEBO3EQP.cjs → chunk-PCJ5ACUV.cjs} +1 -2
- package/dist/{chunk-Q6HUGWO6.js → chunk-PJVI53AH.js} +1 -2
- package/dist/chunk-Q7YYC75E.js +258 -0
- package/dist/{chunk-7JSPKVOW.js → chunk-QVPR2W5S.js} +1 -2
- package/dist/{chunk-XZNOV52K.cjs → chunk-TAF6KYDM.cjs} +4 -5
- package/dist/chunk-USRMBYI6.js +3 -0
- package/dist/chunk-UTWPV2I4.js +26 -0
- package/dist/{chunk-DJAEBZ33.cjs → chunk-VTAS7VZ6.cjs} +1 -2
- package/dist/chunk-XQNCLN4T.cjs +3 -0
- package/dist/{chunk-S26DZVRQ.cjs → chunk-XS2AQFMF.cjs} +1 -2
- package/dist/chunk-Y6QBJGMO.cjs +59 -0
- package/dist/{chunk-WD2HTKRR.cjs → chunk-YS7FDEZ4.cjs} +1 -2
- package/dist/chunk-ZTVQA46Q.js +1 -0
- package/dist/{clipboard-beGtyabO.d.ts → clipboard-BE8E-szx.d.ts} +1 -1
- package/dist/{clipboard-CqE-UZ2d.d.cts → clipboard-DkfAv07F.d.cts} +1 -1
- package/dist/{colorResolver-B5YbO_a4.d.ts → colorResolver-CYttioMe.d.ts} +46 -3
- package/dist/{colorResolver-Cu46bSKr.d.cts → colorResolver-Dr8kQZAQ.d.cts} +46 -3
- package/dist/core-plugins-reexport.cjs +1 -2
- package/dist/core-plugins-reexport.d.cts +4 -4
- package/dist/core-plugins-reexport.d.ts +4 -4
- package/dist/core-plugins-reexport.js +1 -2
- package/dist/core-reexport.cjs +1 -2
- package/dist/core-reexport.d.cts +10 -10
- package/dist/core-reexport.d.ts +10 -10
- package/dist/core-reexport.js +1 -2
- package/dist/executor-JGWZ7S6Z.cjs +1 -0
- package/dist/executor-L2MVKMXO.js +1 -0
- package/dist/{fontLoader-CFKpg0Ri.d.ts → fontLoader-BsqQnB4v.d.ts} +1 -1
- package/dist/{fontLoader-HZYfILUm.d.cts → fontLoader-DECXIoMr.d.cts} +1 -1
- package/dist/headless-reexport.cjs +4 -5
- package/dist/headless-reexport.d.cts +7 -7
- package/dist/headless-reexport.d.ts +7 -7
- package/dist/headless-reexport.js +4 -5
- package/dist/index.cjs +6 -7
- package/dist/index.css +0 -1
- package/dist/index.d.cts +12 -12
- package/dist/index.d.ts +12 -12
- package/dist/index.js +6 -7
- package/dist/lib-GD2QD2JK.js +1 -0
- package/dist/lib-HOLGQI5K.cjs +1 -0
- package/dist/mcp-reexport.cjs +9 -10
- package/dist/mcp-reexport.d.cts +2 -2
- package/dist/mcp-reexport.d.ts +2 -2
- package/dist/mcp-reexport.js +4 -5
- package/dist/{processTemplate-G37IM66O.js → processTemplate-3HN7Q3KT.js} +1 -2
- package/dist/processTemplate-BXZKWRQD.cjs +1 -0
- package/dist/{react-BjOCdeTs.d.ts → react-C6bgHDFl.d.ts} +8 -6
- package/dist/{react-UzAn4o7l.d.cts → react-CAlVCYa4.d.cts} +8 -6
- package/dist/react.cjs +1 -2
- package/dist/react.css +0 -1
- package/dist/react.d.cts +5 -5
- package/dist/react.d.ts +5 -5
- package/dist/react.js +1 -2
- package/dist/{registry-DjacfR6Q.d.cts → registry-BU-FbHh-.d.cts} +1 -1
- package/dist/{registry-CV6nYWqP.d.ts → registry-gRbkCooh.d.ts} +1 -1
- package/dist/selectionRects-7QU337P5.cjs +1 -0
- package/dist/selectionRects-V5RC2BYX.js +1 -0
- package/dist/styles.css +1 -1
- package/dist/{types-DwZ3xysp.d.ts → types-7wjInVMW.d.ts} +1 -1
- package/dist/{types-Bnp8rvJn.d.cts → types-DEEpBL9H.d.cts} +1 -1
- package/dist/ui.cjs +1 -2
- package/dist/ui.d.cts +32 -85
- package/dist/ui.d.ts +32 -85
- package/dist/ui.js +1 -2
- package/dist/{variableDetector-CMhJtM96.d.cts → variableDetector-B4oQJa2e.d.cts} +33 -2
- package/dist/{variableDetector-BaDeXz7D.d.ts → variableDetector-BXJaTkiB.d.ts} +33 -2
- package/package.json +1 -1
- package/dist/FindReplaceDialog-AWQXKEUQ.js.map +0 -1
- package/dist/FindReplaceDialog-I4SZDSVP.cjs +0 -2
- package/dist/FindReplaceDialog-I4SZDSVP.cjs.map +0 -1
- package/dist/FootnotePropertiesDialog-73VT2ZVZ.cjs.map +0 -1
- package/dist/FootnotePropertiesDialog-ZM3EF3EF.js.map +0 -1
- package/dist/HyperlinkDialog-BA25XUT5.js.map +0 -1
- package/dist/HyperlinkDialog-V63LPOT2.cjs +0 -2
- package/dist/HyperlinkDialog-V63LPOT2.cjs.map +0 -1
- package/dist/ImagePositionDialog-AIAMKPFK.js.map +0 -1
- package/dist/ImagePositionDialog-KMK7ROV2.cjs.map +0 -1
- package/dist/ImagePropertiesDialog-ERFCUVCW.js.map +0 -1
- package/dist/ImagePropertiesDialog-USMMRK6X.cjs.map +0 -1
- package/dist/TablePropertiesDialog-72CIUAZT.cjs.map +0 -1
- package/dist/TablePropertiesDialog-EMUEVYB3.js.map +0 -1
- package/dist/chunk-2CHPKB5A.cjs +0 -112
- package/dist/chunk-2CHPKB5A.cjs.map +0 -1
- package/dist/chunk-2QOEHCBX.js.map +0 -1
- package/dist/chunk-4QT5LPBA.cjs.map +0 -1
- package/dist/chunk-5DYSI4O4.cjs +0 -60
- package/dist/chunk-5DYSI4O4.cjs.map +0 -1
- package/dist/chunk-5FJXHXFV.cjs +0 -2
- package/dist/chunk-5FJXHXFV.cjs.map +0 -1
- package/dist/chunk-6FEWNF6B.js +0 -4
- package/dist/chunk-6FEWNF6B.js.map +0 -1
- package/dist/chunk-6LF5HZCV.js +0 -10
- package/dist/chunk-6LF5HZCV.js.map +0 -1
- package/dist/chunk-7JSPKVOW.js.map +0 -1
- package/dist/chunk-C33XDRDJ.cjs +0 -28
- package/dist/chunk-C33XDRDJ.cjs.map +0 -1
- package/dist/chunk-CV5WFE7K.js.map +0 -1
- package/dist/chunk-CXJRNISO.js +0 -2
- package/dist/chunk-CXJRNISO.js.map +0 -1
- package/dist/chunk-DJAEBZ33.cjs.map +0 -1
- package/dist/chunk-DP6Q75ZD.js +0 -28
- package/dist/chunk-DP6Q75ZD.js.map +0 -1
- package/dist/chunk-FDANI5P4.cjs.map +0 -1
- package/dist/chunk-FGVGZLBL.js.map +0 -1
- package/dist/chunk-GJ4GKSDU.cjs +0 -2
- package/dist/chunk-GJ4GKSDU.cjs.map +0 -1
- package/dist/chunk-GWBTKVFD.cjs.map +0 -1
- package/dist/chunk-JOYPFQW2.js.map +0 -1
- package/dist/chunk-L54YNLSE.js +0 -2
- package/dist/chunk-L54YNLSE.js.map +0 -1
- package/dist/chunk-LPGMLJMO.js +0 -259
- package/dist/chunk-LPGMLJMO.js.map +0 -1
- package/dist/chunk-M2T6XKT5.js.map +0 -1
- package/dist/chunk-OHG7ROFC.js +0 -11
- package/dist/chunk-OHG7ROFC.js.map +0 -1
- package/dist/chunk-PANKMCFX.cjs +0 -4
- package/dist/chunk-PANKMCFX.cjs.map +0 -1
- package/dist/chunk-Q6HUGWO6.js.map +0 -1
- package/dist/chunk-QDV75OJ4.js +0 -112
- package/dist/chunk-QDV75OJ4.js.map +0 -1
- package/dist/chunk-QEBO3EQP.cjs.map +0 -1
- package/dist/chunk-QVIZ775M.cjs +0 -259
- package/dist/chunk-QVIZ775M.cjs.map +0 -1
- package/dist/chunk-RMUMR42R.cjs +0 -10
- package/dist/chunk-RMUMR42R.cjs.map +0 -1
- package/dist/chunk-S26DZVRQ.cjs.map +0 -1
- package/dist/chunk-T2HQYRA7.cjs.map +0 -1
- package/dist/chunk-ULXNEG66.js +0 -60
- package/dist/chunk-ULXNEG66.js.map +0 -1
- package/dist/chunk-WD2HTKRR.cjs.map +0 -1
- package/dist/chunk-XZNOV52K.cjs.map +0 -1
- package/dist/chunk-Y6VCTLCJ.js.map +0 -1
- package/dist/core-plugins-reexport.cjs.map +0 -1
- package/dist/core-plugins-reexport.js.map +0 -1
- package/dist/core-reexport.cjs.map +0 -1
- package/dist/core-reexport.js.map +0 -1
- package/dist/executor-K5RXUTTR.js +0 -2
- package/dist/executor-K5RXUTTR.js.map +0 -1
- package/dist/executor-XIPIU3H4.cjs +0 -2
- package/dist/executor-XIPIU3H4.cjs.map +0 -1
- package/dist/headless-reexport.cjs.map +0 -1
- package/dist/headless-reexport.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.css.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/mcp-reexport.cjs.map +0 -1
- package/dist/mcp-reexport.js.map +0 -1
- package/dist/processTemplate-G37IM66O.js.map +0 -1
- package/dist/processTemplate-RFBGVH7T.cjs +0 -2
- package/dist/processTemplate-RFBGVH7T.cjs.map +0 -1
- package/dist/react.cjs.map +0 -1
- package/dist/react.css.map +0 -1
- package/dist/react.js.map +0 -1
- package/dist/selectionRects-6DU7HN7E.js +0 -2
- package/dist/selectionRects-6DU7HN7E.js.map +0 -1
- package/dist/selectionRects-YZSC24ZP.cjs +0 -2
- package/dist/selectionRects-YZSC24ZP.cjs.map +0 -1
- package/dist/ui.cjs.map +0 -1
- package/dist/ui.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../core/src/docx/serializer/xmlUtils.ts","../../core/src/docx/serializer/runSerializer.ts","../../core/src/docx/serializer/paragraphSerializer.ts","../../core/src/docx/serializer/tableSerializer.ts","../../core/src/docx/serializer/documentSerializer.ts","../../core/src/docx/rezip.ts","../../core/src/docx/serializer/headerFooterSerializer.ts","../../core/src/docx/serializer/commentSerializer.ts"],"names":["escapeXml","text","serializeColorElement","color","attrs","serializeShading","shading","serializeTextFormatting","formatting","parts","fontAttrs","colorXml","uAttrs","shadingXml","extractRPrInner","rPrXml","serializeRunPropertyChange","change","normalizedId","authorCandidate","normalizedAuthor","normalizedDate","normalizedRsid","previousRPrXml","serializeRunProperties","propertyChanges","currentRPrXml","currentInner","propertyChangeXml","combined","serializeTextContent","content","serializeTabContent","_content","serializeBreakContent","serializeSymbolContent","serializeNoteReference","serializeFieldChar","serializeInstrText","serializeSoftHyphen","serializeNoBreakHyphen","serializeDrawingColor","clr","serializeFill","fill","g","stops","s","direction","serializeOutline","outline","serializePosition","pos","h","v","serializeWrap","wrap","wrapText","serializePicGraphic","image","cx","cy","rId","id","name","xfrmAttrs","serializeDrawingContent","isFloating","distT","distB","distL","distR","docPrId","docPrName","graphic","behindDoc","position","serializeShapeTextBody","paragraphs","p","serializeParagraph","serializeShapeContent","shape","isTextBox","spPr","textBody","tb","bpAttrs","serializeRunContent","serializeRun","run","contentXml","serializeBorder","border","elementName","serializeParagraphBorders","borders","topXml","leftXml","bottomXml","rightXml","betweenXml","barXml","serializeTabStops","tabs","tab","serializeSpacing","serializeIndentation","serializeNumbering","numPr","serializeFrameProperties","frame","serializeParagraphFormatting","frameXml","numPrXml","bordersXml","tabsXml","spacingXml","indXml","serializeParagraphPropertyChange","extractPPrInner","pPrXml","previousPPrXml","previousPPrInner","normalizedPreviousPPr","serializeHyperlink","hyperlink","childrenXml","child","serializeBookmarkStart","serializeBookmarkEnd","bookmark","serializeSimpleField","field","firstRun","c","beginAttrs","spaceAttr","item","serializeComplexField","resultFormatting","serializeInlineSdt","sdt","props","prParts","items","i","serializeMoveRangeStart","tag","marker","serializeTrackedChange","info","serializeParagraphContent","paragraph","attrsStr","normalizeTrackedChangeInfo","serializeTrackedChangeAttributes","rsid","normalized","serializeMeasurement","measurement","serializeTableBorders","insideHXml","insideVXml","serializeCellMargins","margins","serializeTableLook","look","serializeFloatingTableProperties","floating","serializeTableFormatting","floatingXml","widthXml","cellSpacingXml","indentXml","marginsXml","lookXml","serializeTablePropertyChange","extractTblPrInner","tblPrXml","previousTblPrXml","previousTblPrInner","normalizedPreviousTblPr","serializeTableRowFormatting","structuralChange","serializeTableRowPropertyChange","extractTrPrInner","trPrXml","previousTrPrXml","previousTrPrInner","normalizedPreviousTrPr","serializeConditionalFormatStyle","style","val","serializeTableCellFormatting","cnfStyleXml","serializeTableCellPropertyChange","extractTcPrInner","tcPrXml","previousTcPrXml","previousTcPrInner","normalizedPreviousTcPr","serializeTableGrid","columnWidths","w","serializeCellContent","serializeTable","serializeTableCell","cell","serializeTableRow","row","table","tblGridXml","NAMESPACES","buildNamespaceDeclarations","minimalNamespaces","prefix","uri","serializeHeaderReference","ref","serializeFooterReference","serializeFootnoteProperties","serializeEndnoteProperties","serializePageSize","serializePageMargins","serializeColumns","colElements","col","colAttrs","serializeLineNumbers","ln","serializePageBorders","pb","borderElements","serializeDocGrid","dg","serializeSectionProperties","footnotePrXml","endnotePrXml","pgSzXml","pgMarXml","pgBordersXml","lnNumXml","colsXml","docGridXml","serializeBlockContent","block","b","serializeBodyContent","serializeDocumentBody","body","serializeDocument","doc","nsDecl","import_jszip","se","ae","serializeBlock","serializeHeaderFooter","hf","rootTag","xml","rPr","preserveSpace","serializeParagraphWithAnnotationRef","serializeComment","comment","serializeComments","comments","topLevel","replies","reply","findMaxRId","relsXml","maxId","match","serializeCommentsToZip","zip","compressionLevel","commentsXml","ensureCommentsContentType","ensureCommentsRelationship","collectNewImages","blocks","images","MIME_TO_EXT","decodeDataUrl","dataUrl","binary","bytes","processNewImages","newImages","relsPath","relsFile","maxImageNum","relativePath","num","relEntries","extensionsAdded","data","extension","mediaFilename","mediaPath","newRId","ctFile","ctXml","ext","contentType","getContentTypeForExtension","collectHyperlinksWithoutRId","hyperlinks","processNewHyperlinks","newHyperlinks","RELATIONSHIP_TYPES","repackDocx","options","updateModifiedDate","modifiedBy","exportDocument","originalZip","JSZip","newZip","path","file","documentXml","serializeHeadersFootersToZip","corePropsPath","corePropsFile","originalCoreProps","updatedCoreProps","updateCoreProperties","COMMENTS_CONTENT_TYPE","COMMENTS_RELATIONSHIP_TYPE","rels","compressionOptions","headerFooter","rel","filename","corePropsXml","result","now","mimeType","createEmptyDocx","createDocx","emptyBuffer","docWithBuffer"],"mappings":"qHAIO,SAASA,CAAAA,CAAUC,CAAAA,CAAsB,CAC9C,OAAOA,CAAAA,CACJ,QAAQ,IAAA,CAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,IAAA,CAAM,MAAM,EACpB,OAAA,CAAQ,IAAA,CAAM,MAAM,CAAA,CACpB,OAAA,CAAQ,IAAA,CAAM,QAAQ,CAAA,CACtB,OAAA,CAAQ,IAAA,CAAM,QAAQ,CAC3B,CCoCA,SAASC,EAAAA,CAAsBC,CAAAA,CAAuC,CACpE,GAAI,CAACA,CAAAA,CAAO,OAAO,EAAA,CAEnB,IAAMC,CAAAA,CAAkB,EAAC,CAoBzB,OAlBID,EAAM,IAAA,CACRC,CAAAA,CAAM,IAAA,CAAK,cAAc,CAAA,CAChBD,CAAAA,CAAM,GAAA,EACfC,CAAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAUD,CAAAA,CAAM,GAAG,CAAA,CAAA,CAAG,CAAA,CAG/BA,EAAM,UAAA,EACRC,CAAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiBD,CAAAA,CAAM,UAAU,GAAG,CAAA,CAG7CA,CAAAA,CAAM,SAAA,EACRC,CAAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgBD,EAAM,SAAS,CAAA,CAAA,CAAG,CAAA,CAG3CA,CAAAA,CAAM,UAAA,EACRC,CAAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiBD,CAAAA,CAAM,UAAU,CAAA,CAAA,CAAG,CAAA,CAG7CC,CAAAA,CAAM,MAAA,GAAW,EAAU,EAAA,CAExB,CAAA,SAAA,EAAYA,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAC,IACpC,CASA,SAASC,EAAAA,CAAiBC,CAAAA,CAAgD,CACxE,GAAI,CAACA,CAAAA,CAAS,OAAO,EAAA,CAErB,IAAMF,CAAAA,CAAkB,EAAC,CAoCzB,OAjCIE,CAAAA,CAAQ,OAAA,CACVF,CAAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAUE,CAAAA,CAAQ,OAAO,CAAA,CAAA,CAAG,CAAA,CAEvCF,CAAAA,CAAM,IAAA,CAAK,eAAe,CAAA,CAIxBE,EAAQ,KAAA,EAAO,GAAA,CACjBF,CAAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAYE,CAAAA,CAAQ,MAAM,GAAG,CAAA,CAAA,CAAG,CAAA,CAClCA,CAAAA,CAAQ,KAAA,EAAO,IAAA,EACxBF,CAAAA,CAAM,IAAA,CAAK,gBAAgB,CAAA,CAIzBE,CAAAA,CAAQ,IAAA,EAAM,GAAA,CAChBF,CAAAA,CAAM,KAAK,CAAA,QAAA,EAAWE,CAAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,CAAA,CAAG,CAAA,CAChCA,EAAQ,IAAA,EAAM,IAAA,EACvBF,CAAAA,CAAM,IAAA,CAAK,eAAe,CAAA,CAIxBE,EAAQ,IAAA,EAAM,UAAA,EAChBF,CAAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgBE,CAAAA,CAAQ,IAAA,CAAK,UAAU,CAAA,CAAA,CAAG,CAAA,CAGnDA,CAAAA,CAAQ,IAAA,EAAM,SAAA,EAChBF,CAAAA,CAAM,KAAK,CAAA,iBAAA,EAAoBE,CAAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,CAAA,CAAG,CAAA,CAGtDA,EAAQ,IAAA,EAAM,UAAA,EAChBF,CAAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqBE,CAAAA,CAAQ,KAAK,UAAU,CAAA,CAAA,CAAG,CAAA,CAGxDF,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAU,EAAA,CAExB,CAAA,OAAA,EAAUA,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CAClC,CASO,SAASG,CAAAA,CAAwBC,CAAAA,CAAgD,CACtF,GAAI,CAACA,CAAAA,CAAY,OAAO,EAAA,CAExB,IAAMC,CAAAA,CAAkB,EAAC,CAQzB,GALID,EAAW,OAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoBT,CAAAA,CAAUQ,CAAAA,CAAW,OAAO,CAAC,CAAA,GAAA,CAAK,CAAA,CAI/DA,CAAAA,CAAW,UAAA,CAAY,CACzB,IAAME,EAAsB,EAAC,CACzBF,CAAAA,CAAW,UAAA,CAAW,KAAA,EACxBE,CAAAA,CAAU,KAAK,CAAA,SAAA,EAAYV,CAAAA,CAAUQ,CAAAA,CAAW,UAAA,CAAW,KAAK,CAAC,GAAG,CAAA,CAElEA,CAAAA,CAAW,UAAA,CAAW,KAAA,EACxBE,CAAAA,CAAU,IAAA,CAAK,CAAA,SAAA,EAAYV,CAAAA,CAAUQ,CAAAA,CAAW,UAAA,CAAW,KAAK,CAAC,CAAA,CAAA,CAAG,CAAA,CAElEA,EAAW,UAAA,CAAW,QAAA,EACxBE,CAAAA,CAAU,IAAA,CAAK,CAAA,YAAA,EAAeV,CAAAA,CAAUQ,EAAW,UAAA,CAAW,QAAQ,CAAC,CAAA,CAAA,CAAG,CAAA,CAExEA,CAAAA,CAAW,WAAW,EAAA,EACxBE,CAAAA,CAAU,IAAA,CAAK,CAAA,MAAA,EAASV,CAAAA,CAAUQ,CAAAA,CAAW,UAAA,CAAW,EAAE,CAAC,CAAA,CAAA,CAAG,CAAA,CAE5DA,CAAAA,CAAW,UAAA,CAAW,UAAA,EACxBE,EAAU,IAAA,CAAK,CAAA,cAAA,EAAiBF,CAAAA,CAAW,UAAA,CAAW,UAAU,CAAA,CAAA,CAAG,EAEjEA,CAAAA,CAAW,UAAA,CAAW,UAAA,EACxBE,CAAAA,CAAU,IAAA,CAAK,CAAA,cAAA,EAAiBF,EAAW,UAAA,CAAW,UAAU,CAAA,CAAA,CAAG,CAAA,CAEjEA,CAAAA,CAAW,UAAA,CAAW,aAAA,EACxBE,CAAAA,CAAU,IAAA,CAAK,CAAA,iBAAA,EAAoBF,CAAAA,CAAW,UAAA,CAAW,aAAa,CAAA,CAAA,CAAG,EAEvEA,CAAAA,CAAW,UAAA,CAAW,OAAA,EACxBE,CAAAA,CAAU,IAAA,CAAK,CAAA,WAAA,EAAcF,EAAW,UAAA,CAAW,OAAO,CAAA,CAAA,CAAG,CAAA,CAE3DE,CAAAA,CAAU,MAAA,CAAS,GACrBD,CAAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAaC,CAAAA,CAAU,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CAAI,EAEnD,CAGIF,CAAAA,CAAW,IAAA,GAAS,IAAA,CACtBC,CAAAA,CAAM,KAAK,QAAQ,CAAA,CACVD,CAAAA,CAAW,IAAA,GAAS,KAAA,EAC7BC,CAAAA,CAAM,KAAK,kBAAkB,CAAA,CAG3BD,CAAAA,CAAW,MAAA,GAAW,IAAA,CACxBC,CAAAA,CAAM,KAAK,UAAU,CAAA,CACZD,CAAAA,CAAW,MAAA,GAAW,KAAA,EAC/BC,CAAAA,CAAM,IAAA,CAAK,oBAAoB,CAAA,CAI7BD,CAAAA,CAAW,MAAA,GAAW,IAAA,CACxBC,CAAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,CACVD,CAAAA,CAAW,MAAA,GAAW,KAAA,EAC/BC,CAAAA,CAAM,IAAA,CAAK,kBAAkB,CAAA,CAG3BD,CAAAA,CAAW,QAAA,GAAa,IAAA,CAC1BC,CAAAA,CAAM,IAAA,CAAK,UAAU,CAAA,CACZD,CAAAA,CAAW,QAAA,GAAa,KAAA,EACjCC,CAAAA,CAAM,IAAA,CAAK,oBAAoB,CAAA,CAI7BD,CAAAA,CAAW,OAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,WAAW,CAAA,CAGpBD,EAAW,SAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,gBAAgB,CAAA,CAIzBD,CAAAA,CAAW,QACbC,CAAAA,CAAM,IAAA,CAAK,aAAa,CAAA,CAGtBD,CAAAA,CAAW,YAAA,EACbC,EAAM,IAAA,CAAK,cAAc,CAAA,CAIvBD,CAAAA,CAAW,OAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,cAAc,CAAA,CAIvBD,CAAAA,CAAW,MAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,aAAa,EAItBD,CAAAA,CAAW,MAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,aAAa,CAAA,CAItBD,EAAW,OAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,cAAc,CAAA,CAIvBD,CAAAA,CAAW,QACbC,CAAAA,CAAM,IAAA,CAAK,aAAa,CAAA,CAI1B,IAAME,CAAAA,CAAWT,EAAAA,CAAsBM,CAAAA,CAAW,KAAK,CAAA,CA4DvD,GA3DIG,CAAAA,EACFF,CAAAA,CAAM,IAAA,CAAKE,CAAQ,CAAA,CAIjBH,CAAAA,CAAW,OAAA,GAAY,MAAA,EACzBC,CAAAA,CAAM,IAAA,CAAK,qBAAqBD,CAAAA,CAAW,OAAO,CAAA,GAAA,CAAK,CAAA,CAIrDA,CAAAA,CAAW,KAAA,GAAU,QACvBC,CAAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAeD,CAAAA,CAAW,KAAK,CAAA,GAAA,CAAK,CAAA,CAI7CA,CAAAA,CAAW,OAAA,GAAY,MAAA,EACzBC,CAAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkBD,CAAAA,CAAW,OAAO,CAAA,GAAA,CAAK,CAAA,CAIlDA,CAAAA,CAAW,QAAA,GAAa,MAAA,EAC1BC,CAAAA,CAAM,KAAK,CAAA,mBAAA,EAAsBD,CAAAA,CAAW,QAAQ,CAAA,GAAA,CAAK,CAAA,CAIvDA,CAAAA,CAAW,WAAa,MAAA,EAC1BC,CAAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgBD,CAAAA,CAAW,QAAQ,CAAA,GAAA,CAAK,CAAA,CAGjDA,CAAAA,CAAW,UAAA,GAAe,MAAA,EAC5BC,CAAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkBD,EAAW,UAAU,CAAA,GAAA,CAAK,CAAA,CAIrDA,CAAAA,CAAW,SAAA,EAAaA,CAAAA,CAAW,YAAc,MAAA,EACtB,IAAI,GAAA,CAAI,CACnC,OAAA,CACA,MAAA,CACA,OACA,UAAA,CACA,UAAA,CACA,UAAA,CACA,WAAA,CACA,aAAA,CACA,SAAA,CACA,YAAA,CACA,OAAA,CACA,WAAA,CACA,SAAA,CACA,KAAA,CACA,OAAA,CACA,QACF,CAAC,EACwB,GAAA,CAAIA,CAAAA,CAAW,SAAS,CAAA,EAC/CC,CAAAA,CAAM,IAAA,CAAK,uBAAuBD,CAAAA,CAAW,SAAS,CAAA,GAAA,CAAK,CAAA,CAK3DA,CAAAA,CAAW,SAAA,CAAW,CACxB,IAAMI,CAAAA,CAAmB,CAAC,CAAA,OAAA,EAAUJ,CAAAA,CAAW,SAAA,CAAU,KAAK,CAAA,CAAA,CAAG,CAAA,CAC7DA,CAAAA,CAAW,SAAA,CAAU,KAAA,GACnBA,CAAAA,CAAW,SAAA,CAAU,MAAM,GAAA,EAC7BI,CAAAA,CAAO,IAAA,CAAK,CAAA,SAAA,EAAYJ,CAAAA,CAAW,SAAA,CAAU,MAAM,GAAG,CAAA,CAAA,CAAG,CAAA,CAEvDA,CAAAA,CAAW,SAAA,CAAU,KAAA,CAAM,YAC7BI,CAAAA,CAAO,IAAA,CAAK,CAAA,cAAA,EAAiBJ,CAAAA,CAAW,SAAA,CAAU,KAAA,CAAM,UAAU,CAAA,CAAA,CAAG,CAAA,CAAA,CAGzEC,CAAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQG,CAAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CAAI,EACzC,CAGIJ,CAAAA,CAAW,MAAA,EAAUA,EAAW,MAAA,GAAW,MAAA,EAC7CC,CAAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoBD,CAAAA,CAAW,MAAM,CAAA,GAAA,CAAK,CAAA,CAInDA,CAAAA,CAAW,YAAA,EAAgBA,CAAAA,CAAW,YAAA,GAAiB,MAAA,EACzDC,CAAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgBD,CAAAA,CAAW,YAAY,CAAA,GAAA,CAAK,CAAA,CAIzD,IAAMK,CAAAA,CAAaR,EAAAA,CAAiBG,CAAAA,CAAW,OAAO,CAAA,CAmBtD,OAlBIK,GACFJ,CAAAA,CAAM,IAAA,CAAKI,CAAU,CAAA,CAInBL,CAAAA,CAAW,SAAA,EAAaA,EAAW,SAAA,GAAc,UAAA,EACnDC,CAAAA,CAAM,IAAA,CAAK,CAAA,oBAAA,EAAuBD,CAAAA,CAAW,SAAS,CAAA,GAAA,CAAK,CAAA,CAIzDA,CAAAA,CAAW,GAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,UAAU,EAGnBD,CAAAA,CAAW,EAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,SAAS,CAAA,CAGlBA,EAAM,MAAA,GAAW,CAAA,CAAU,EAAA,CAExB,CAAA,OAAA,EAAUA,CAAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA,QAAA,CACjC,CAEA,SAASK,EAAAA,CAAgBC,CAAAA,CAAwB,CAC/C,OAAI,CAACA,CAAAA,CAAO,UAAA,CAAW,SAAS,CAAA,EAAK,CAACA,EAAO,QAAA,CAAS,UAAU,CAAA,CACvD,EAAA,CAEFA,CAAAA,CAAO,KAAA,CAAM,EAAkB,EAAkB,CAC1D,CAEA,SAASC,EAAAA,CAA2BC,CAAAA,CAAmC,CACrE,IAAMC,CAAAA,CAAe,MAAA,CAAO,SAAA,CAAUD,CAAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAKA,CAAAA,CAAO,IAAA,CAAK,EAAA,EAAM,CAAA,CAAIA,CAAAA,CAAO,IAAA,CAAK,GAAK,CAAA,CAC1FE,CAAAA,CAAkB,OAAOF,CAAAA,CAAO,IAAA,CAAK,MAAA,EAAW,SAAWA,CAAAA,CAAO,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK,CAAI,EAAA,CACvFG,EAAmBD,CAAAA,CAAgB,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAkB,SAAA,CAClEE,CAAAA,CAAiB,OAAOJ,CAAAA,CAAO,IAAA,CAAK,IAAA,EAAS,QAAA,CAAWA,CAAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAK,CAAI,MAAA,CAClFK,CAAAA,CAAiB,OAAOL,CAAAA,CAAO,IAAA,CAAK,MAAS,QAAA,CAAWA,CAAAA,CAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAK,CAAI,OAClFb,CAAAA,CAAQ,CAAC,CAAA,MAAA,EAASc,CAAY,CAAA,CAAA,CAAA,CAAK,CAAA,UAAA,EAAalB,CAAAA,CAAUoB,CAAgB,CAAC,CAAA,CAAA,CAAG,CAAA,CAEhFC,CAAAA,EACFjB,CAAAA,CAAM,IAAA,CAAK,WAAWJ,CAAAA,CAAUqB,CAAc,CAAC,CAAA,CAAA,CAAG,CAAA,CAEhDC,CAAAA,EACFlB,EAAM,IAAA,CAAK,CAAA,QAAA,EAAWJ,CAAAA,CAAUsB,CAAc,CAAC,CAAA,CAAA,CAAG,EAGpD,IAAMC,CAAAA,CAAiBhB,CAAAA,CAAwBU,CAAAA,CAAO,kBAAkB,CAAA,EAAK,UAAA,CAC7E,OAAO,CAAA,aAAA,EAAgBb,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,EAAImB,CAAc,CAAA,cAAA,CAC1D,CAEA,SAASC,EAAAA,CACPhB,CAAAA,CACAiB,CAAAA,CACQ,CACR,IAAMC,CAAAA,CAAgBnB,CAAAA,CAAwBC,CAAU,CAAA,CAClDmB,CAAAA,CAAeD,EAAgBZ,EAAAA,CAAgBY,CAAa,CAAA,CAAI,EAAA,CAChEE,CAAAA,CAAAA,CAAqBH,CAAAA,EAAmB,EAAC,EAAG,GAAA,CAAIT,EAA0B,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,CACnFa,EAAW,CAAA,EAAGF,CAAY,CAAA,EAAGC,CAAiB,CAAA,CAAA,CAEpD,OAAKC,EAIE,CAAA,OAAA,EAAUA,CAAQ,CAAA,QAAA,CAAA,CAHhB,EAIX,CASA,SAASC,GAAqBC,CAAAA,CAA8B,CAS1D,OAAO,CAAA,IAAA,EAPLA,CAAAA,CAAQ,aAAA,EACRA,CAAAA,CAAQ,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAC3BA,CAAAA,CAAQ,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EACzBA,CAAAA,CAAQ,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,CAEM,wBAA0B,EAErC,CAAA,CAAA,EAAI/B,CAAAA,CAAU+B,CAAAA,CAAQ,IAAI,CAAC,QACpD,CAKA,SAASC,EAAAA,CAAoBC,CAAAA,CAA8B,CACzD,OAAO,UACT,CAKA,SAASC,EAAAA,CAAsBH,CAAAA,CAA+B,CAC5D,IAAM3B,CAAAA,CAAkB,EAAC,CAazB,OAXI2B,CAAAA,CAAQ,SAAA,GAAc,MAAA,CACxB3B,CAAAA,CAAM,KAAK,eAAe,CAAA,CACjB2B,CAAAA,CAAQ,SAAA,GAAc,QAAA,CAC/B3B,CAAAA,CAAM,KAAK,iBAAiB,CAAA,CACnB2B,CAAAA,CAAQ,SAAA,GAAc,cAAA,GAC/B3B,CAAAA,CAAM,IAAA,CAAK,uBAAuB,CAAA,CAC9B2B,CAAAA,CAAQ,KAAA,EAASA,CAAAA,CAAQ,KAAA,GAAU,MAAA,EACrC3B,EAAM,IAAA,CAAK,CAAA,SAAA,EAAY2B,CAAAA,CAAQ,KAAK,CAAA,CAAA,CAAG,CAAA,CAAA,CAIvC3B,EAAM,MAAA,GAAW,CAAA,CACZ,SAAA,CAGF,CAAA,MAAA,EAASA,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CACjC,CAKA,SAAS+B,EAAAA,CAAuBJ,CAAAA,CAAgC,CAC9D,OAAO,CAAA,eAAA,EAAkB/B,CAAAA,CAAU+B,CAAAA,CAAQ,IAAI,CAAC,aAAa/B,CAAAA,CAAU+B,CAAAA,CAAQ,IAAI,CAAC,CAAA,GAAA,CACtF,CAKA,SAASK,EAAAA,CAAuBL,CAAAA,CAAuC,CACrE,OAAIA,CAAAA,CAAQ,IAAA,GAAS,cACZ,CAAA,2BAAA,EAA8BA,CAAAA,CAAQ,EAAE,CAAA,GAAA,CAAA,CAExC,CAAA,0BAAA,EAA6BA,CAAAA,CAAQ,EAAE,CAAA,GAAA,CAElD,CAKA,SAASM,EAAAA,CAAmBN,CAAAA,CAAmC,CAC7D,IAAM3B,EAAkB,CAAC,CAAA,eAAA,EAAkB2B,CAAAA,CAAQ,QAAQ,CAAA,CAAA,CAAG,CAAA,CAE9D,OAAIA,CAAAA,CAAQ,OAAA,EACV3B,CAAAA,CAAM,IAAA,CAAK,kBAAkB,CAAA,CAG3B2B,EAAQ,KAAA,EACV3B,CAAAA,CAAM,IAAA,CAAK,gBAAgB,CAAA,CAGtB,CAAA,WAAA,EAAcA,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CACtC,CAKA,SAASkC,EAAAA,CAAmBP,EAAmC,CAM7D,OAAO,CAAA,YAAA,EAJLA,CAAAA,CAAQ,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAKA,CAAAA,CAAQ,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAKA,EAAQ,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,CAExD,uBAAA,CAA0B,EAE7B,CAAA,CAAA,EAAI/B,CAAAA,CAAU+B,CAAAA,CAAQ,IAAI,CAAC,CAAA,cAAA,CAC5D,CAKA,SAASQ,GAAoBN,CAAAA,CAAqC,CAChE,OAAO,iBACT,CAKA,SAASO,GAAuBP,CAAAA,CAAwC,CACtE,OAAO,oBACT,CAOA,SAASQ,EAAsBtC,CAAAA,CAAuC,CACpE,GAAI,CAACA,CAAAA,CAAO,OAAO,EAAA,CACnB,GAAIA,CAAAA,CAAM,GAAA,CACR,OAAO,CAAA,gBAAA,EAAmBA,CAAAA,CAAM,GAAA,CAAI,QAAQ,GAAA,CAAK,EAAE,CAAC,CAAA,GAAA,CAAA,CAEtD,GAAIA,CAAAA,CAAM,WAAY,CACpB,IAAIuC,CAAAA,CAAM,CAAA,kBAAA,EAAqBvC,CAAAA,CAAM,UAAU,IAC/C,OAAIA,CAAAA,CAAM,SAAA,CACRuC,CAAAA,EAAO,CAAA,cAAA,EAAiBvC,CAAAA,CAAM,SAAS,CAAA,iBAAA,CAAA,CAC9BA,CAAAA,CAAM,UAAA,CACfuC,CAAAA,EAAO,CAAA,eAAA,EAAkBvC,CAAAA,CAAM,UAAU,oBAEzCuC,CAAAA,EAAO,IAAA,CAEFA,CACT,CACA,OAAO,EACT,CAGA,SAASC,EAAAA,CAAcC,CAAAA,CAAqC,CAC1D,GAAI,CAACA,GAAQA,CAAAA,CAAK,IAAA,GAAS,MAAA,CAAQ,OAAO,aAAA,CAC1C,GAAIA,CAAAA,CAAK,IAAA,GAAS,OAAA,EAAWA,CAAAA,CAAK,KAAA,CAChC,OAAO,CAAA,aAAA,EAAgBH,CAAAA,CAAsBG,EAAK,KAAK,CAAC,CAAA,cAAA,CAAA,CAE1D,GAAIA,CAAAA,CAAK,IAAA,GAAS,YAAcA,CAAAA,CAAK,QAAA,CAAU,CAC7C,IAAMC,CAAAA,CAAID,CAAAA,CAAK,SACTE,CAAAA,CAAQD,CAAAA,CAAE,KAAA,CACb,GAAA,CAAKE,CAAAA,EAAM,CAAA,WAAA,EAAcA,CAAAA,CAAE,QAAQ,CAAA,EAAA,EAAKN,CAAAA,CAAsBM,CAAAA,CAAE,KAAK,CAAC,CAAA,OAAA,CAAS,EAC/E,IAAA,CAAK,EAAE,CAAA,CACJC,CAAAA,CACJH,CAAAA,CAAE,IAAA,GAAS,SAAW,CAAA,YAAA,EAAA,CAAgBA,CAAAA,CAAE,KAAA,EAAS,CAAA,EAAK,GAAK,CAAA,cAAA,CAAA,CAAmB,GAChF,OAAO,CAAA,qBAAA,EAAwBC,CAAK,CAAA,UAAA,EAAaE,CAAS,CAAA,aAAA,CAC5D,CACA,OAAO,EACT,CAGA,SAASC,CAAAA,CAAiBC,CAAAA,CAA2C,CACnE,GAAI,CAACA,CAAAA,CAAS,OAAO,EAAA,CACrB,IAAM9C,CAAAA,CAAkB,EAAC,CACrB8C,CAAAA,CAAQ,KAAA,EAAS,IAAA,EAAM9C,CAAAA,CAAM,IAAA,CAAK,MAAM8C,CAAAA,CAAQ,KAAK,CAAA,CAAA,CAAG,CAAA,CACxDA,CAAAA,CAAQ,GAAA,EAAK9C,CAAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ8C,CAAAA,CAAQ,GAAG,CAAA,CAAA,CAAG,CAAA,CAElD,IAAMzC,EAAkB,EAAC,CAkBzB,OAjBIyC,CAAAA,CAAQ,KAAA,EACVzC,CAAAA,CAAM,KAAK,CAAA,aAAA,EAAgBgC,CAAAA,CAAsBS,CAAAA,CAAQ,KAAK,CAAC,CAAA,cAAA,CAAgB,EAE7EA,CAAAA,CAAQ,KAAA,EAASA,CAAAA,CAAQ,KAAA,GAAU,OAAA,EACrCzC,CAAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoByC,CAAAA,CAAQ,KAAK,CAAA,GAAA,CAAK,CAAA,CAE/CA,CAAAA,CAAQ,OAAA,EACVzC,EAAM,IAAA,CACJ,CAAA,iBAAA,EAAoByC,CAAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA,CAAA,EAAIA,EAAQ,OAAA,CAAQ,KAAA,CAAQ,CAAA,IAAA,EAAOA,CAAAA,CAAQ,OAAA,CAAQ,KAAK,IAAM,EAAE,CAAA,EAAGA,CAAAA,CAAQ,OAAA,CAAQ,MAAA,CAAS,CAAA,MAAA,EAASA,CAAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,CAAA,CAAA,CAAM,EAAE,CAAA,EAAA,CAC7K,CAAA,CAEEA,CAAAA,CAAQ,SACVzC,CAAAA,CAAM,IAAA,CACJ,CAAA,iBAAA,EAAoByC,CAAAA,CAAQ,OAAA,CAAQ,IAAI,IAAIA,CAAAA,CAAQ,OAAA,CAAQ,KAAA,CAAQ,CAAA,IAAA,EAAOA,CAAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,CAAA,CAAA,CAAM,EAAE,CAAA,EAAGA,CAAAA,CAAQ,OAAA,CAAQ,MAAA,CAAS,CAAA,MAAA,EAASA,CAAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,CAAA,CAAA,CAAM,EAAE,CAAA,EAAA,CAC7K,CAAA,CAGEzC,EAAM,MAAA,GAAW,CAAA,EAAKL,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAU,EAAA,CAC9C,QAAQA,CAAAA,CAAM,MAAA,CAAS,GAAA,CAAMA,CAAAA,CAAM,IAAA,CAAK,GAAG,EAAI,EAAE,CAAA,CAAA,EAAIK,CAAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA,OAAA,CAC5E,CAGA,SAAS0C,CAAAA,CAAkBC,CAAAA,CAA4B,CACrD,IAAM3C,CAAAA,CAAkB,EAAC,CAGnB4C,CAAAA,CAAID,CAAAA,CAAI,UAAA,CACd3C,CAAAA,CAAM,IAAA,CAAK,+BAA+B4C,CAAAA,CAAE,UAAU,CAAA,EAAA,CAAI,CAAA,CACtDA,CAAAA,CAAE,SAAA,CACJ5C,EAAM,IAAA,CAAK,CAAA,UAAA,EAAa4C,CAAAA,CAAE,SAAS,CAAA,WAAA,CAAa,CAAA,CAEhD5C,CAAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB4C,CAAAA,CAAE,SAAA,EAAa,CAAC,CAAA,eAAA,CAAiB,CAAA,CAE/D5C,EAAM,IAAA,CAAK,iBAAiB,CAAA,CAG5B,IAAM6C,CAAAA,CAAIF,CAAAA,CAAI,SACd,OAAA3C,CAAAA,CAAM,IAAA,CAAK,CAAA,4BAAA,EAA+B6C,CAAAA,CAAE,UAAU,IAAI,CAAA,CACtDA,CAAAA,CAAE,SAAA,CACJ7C,CAAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa6C,CAAAA,CAAE,SAAS,CAAA,WAAA,CAAa,CAAA,CAEhD7C,CAAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB6C,CAAAA,CAAE,WAAa,CAAC,CAAA,eAAA,CAAiB,CAAA,CAE/D7C,CAAAA,CAAM,IAAA,CAAK,iBAAiB,EAErBA,CAAAA,CAAM,IAAA,CAAK,EAAE,CACtB,CAGA,SAAS8C,EAAcC,CAAAA,CAAyB,CAC9C,IAAMC,CAAAA,CAAWD,CAAAA,CAAK,QAAA,CAAW,CAAA,WAAA,EAAcA,CAAAA,CAAK,QAAQ,CAAA,CAAA,CAAA,CAAM,uBAAA,CAClE,OAAQA,CAAAA,CAAK,IAAA,EACX,KAAK,QAAA,CACH,OAAO,CAAA,cAAA,EAAiBC,CAAQ,CAAA,EAAA,CAAA,CAClC,KAAK,OAAA,CACH,OAAO,CAAA,aAAA,EAAgBA,CAAQ,CAAA,mMAAA,CAAA,CACjC,KAAK,UACH,OAAO,CAAA,eAAA,EAAkBA,CAAQ,CAAA,qMAAA,CAAA,CACnC,KAAK,cAAA,CACH,OAAO,wBAAA,CACT,KAAK,QAAA,CACL,KAAK,SAAA,CACH,OAAO,gBAAA,CACT,QACE,OAAO,gBACX,CACF,CAGA,SAASC,EAAAA,CAAoBC,EAAsB,CACjD,IAAMC,CAAAA,CAAKD,CAAAA,CAAM,IAAA,CAAK,KAAA,CAChBE,EAAKF,CAAAA,CAAM,IAAA,CAAK,MAAA,CAChBG,CAAAA,CAAMH,CAAAA,CAAM,GAAA,EAAO,MAAA,CACnBI,CAAAA,CAAKJ,CAAAA,CAAM,EAAA,EAAM,GAAA,CACjBK,CAAAA,CAAOL,CAAAA,CAAM,QAAA,EAAY,QAAQI,CAAE,CAAA,CAAA,CAErCE,CAAAA,CAAY,EAAA,CAChB,OAAIN,CAAAA,CAAM,WAAW,QAAA,GACnBM,CAAAA,EAAa,CAAA,MAAA,EAAS,IAAA,CAAK,KAAA,CAAMN,CAAAA,CAAM,UAAU,QAAA,CAAW,GAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAEhEA,CAAAA,CAAM,SAAA,EAAW,KAAA,GAAOM,CAAAA,EAAa,YAAA,CAAA,CACrCN,CAAAA,CAAM,SAAA,EAAW,KAAA,GAAOM,CAAAA,EAAa,YAAA,CAAA,CAElC,CACL,6EAAA,CACA,gFAAA,CACA,gFAAA,CACA,eAAA,CACA,CAAA,eAAA,EAAkBF,CAAE,WAAW/D,CAAAA,CAAUgE,CAAI,CAAC,CAAA,CAAA,EAAIL,CAAAA,CAAM,GAAA,CAAM,WAAW3D,CAAAA,CAAU2D,CAAAA,CAAM,GAAG,CAAC,CAAA,CAAA,CAAA,CAAM,EAAE,CAAA,EAAA,CAAA,CACrG,iBAAA,CACA,gBAAA,CACA,gBAAA,CACA,CAAA,iBAAA,EAAoBG,CAAG,CAAA,GAAA,CAAA,CACvB,sCAAA,CACA,kBACA,YAAA,CACA,CAAA,OAAA,EAAUG,CAAS,CAAA,CAAA,CAAA,CACnB,sBAAA,CACA,CAAA,WAAA,EAAcL,CAAE,CAAA,MAAA,EAASC,CAAE,CAAA,GAAA,CAAA,CAC3B,WAAA,CACA,iDAAA,CACAF,CAAAA,CAAM,QAAUV,CAAAA,CAAiBU,CAAAA,CAAM,OAAO,CAAA,CAAI,EAAA,CAClD,aAAA,CACA,YAAA,CACA,kBAAA,CACA,cACF,CAAA,CAAE,IAAA,CAAK,EAAE,CACX,CAKA,SAASO,EAAAA,CAAwBnC,CAAAA,CAAiC,CAChE,IAAM4B,CAAAA,CAAQ5B,CAAAA,CAAQ,MAChBoC,CAAAA,CAAaR,CAAAA,CAAM,IAAA,CAAK,IAAA,GAAS,QAAA,CACjCC,CAAAA,CAAKD,EAAM,IAAA,CAAK,KAAA,CAChBE,CAAAA,CAAKF,CAAAA,CAAM,IAAA,CAAK,MAAA,CAChBS,CAAAA,CAAQT,CAAAA,CAAM,OAAA,EAAS,GAAA,EAAOA,CAAAA,CAAM,IAAA,CAAK,KAAA,EAAS,CAAA,CAClDU,EAAQV,CAAAA,CAAM,OAAA,EAAS,MAAA,EAAUA,CAAAA,CAAM,IAAA,CAAK,KAAA,EAAS,EACrDW,CAAAA,CAAQX,CAAAA,CAAM,OAAA,EAAS,IAAA,EAAQA,CAAAA,CAAM,IAAA,CAAK,OAAS,CAAA,CACnDY,CAAAA,CAAQZ,CAAAA,CAAM,OAAA,EAAS,KAAA,EAASA,CAAAA,CAAM,IAAA,CAAK,KAAA,EAAS,CAAA,CACpDa,CAAAA,CAAUb,CAAAA,CAAM,EAAA,EAAM,GAAA,CACtBc,CAAAA,CAAYd,EAAM,KAAA,EAASA,CAAAA,CAAM,QAAA,EAAY,CAAA,QAAA,EAAWa,CAAO,CAAA,CAAA,CAE/DE,EAAUhB,EAAAA,CAAoBC,CAAK,CAAA,CAEzC,GAAI,CAACQ,CAAAA,CAEH,OAAO,CACL,aAAA,CACA,CAAA,kBAAA,EAAqBC,CAAK,CAAA,SAAA,EAAYC,CAAK,CAAA,SAAA,EAAYC,CAAK,CAAA,SAAA,EAAYC,CAAK,CAAA,EAAA,CAAA,CAC7E,CAAA,eAAA,EAAkBX,CAAE,CAAA,MAAA,EAASC,CAAE,CAAA,GAAA,CAAA,CAC/B,4CAAA,CACA,CAAA,cAAA,EAAiBW,CAAO,CAAA,QAAA,EAAWxE,CAAAA,CAAUyE,CAAS,CAAC,CAAA,CAAA,EAAId,CAAAA,CAAM,GAAA,CAAM,CAAA,QAAA,EAAW3D,CAAAA,CAAU2D,EAAM,GAAG,CAAC,CAAA,CAAA,CAAA,CAAM,EAAE,CAAA,EAAGA,CAAAA,CAAM,UAAA,CAAa,aAAA,CAAgB,EAAE,CAAA,EAAA,CAAA,CACtJ,wJAAA,CACAe,CAAAA,CACA,cAAA,CACA,cACF,EAAE,IAAA,CAAK,EAAE,CAAA,CAIX,IAAMC,CAAAA,CAAYhB,CAAAA,CAAM,KAAK,IAAA,GAAS,QAAA,CAAW,GAAA,CAAM,GAAA,CACjDiB,CAAAA,CAAWjB,CAAAA,CAAM,SACnBR,CAAAA,CAAkBQ,CAAAA,CAAM,QAAQ,CAAA,CAChC,uKAAA,CACEH,CAAAA,CAAOD,CAAAA,CAAcI,CAAAA,CAAM,IAAI,CAAA,CAErC,OAAO,CACL,aAAA,CACA,CAAA,kBAAA,EAAqBS,CAAK,CAAA,SAAA,EAAYC,CAAK,CAAA,SAAA,EAAYC,CAAK,CAAA,SAAA,EAAYC,CAAK,yDAAyDI,CAAS,CAAA,+CAAA,CAAA,CAC/I,6BAAA,CACAC,CAAAA,CACA,CAAA,eAAA,EAAkBhB,CAAE,SAASC,CAAE,CAAA,GAAA,CAAA,CAC/B,4CAAA,CACAL,CAAAA,CACA,CAAA,cAAA,EAAiBgB,CAAO,CAAA,QAAA,EAAWxE,CAAAA,CAAUyE,CAAS,CAAC,CAAA,CAAA,EAAId,CAAAA,CAAM,GAAA,CAAM,CAAA,QAAA,EAAW3D,EAAU2D,CAAAA,CAAM,GAAG,CAAC,CAAA,CAAA,CAAA,CAAM,EAAE,CAAA,EAAA,CAAA,CAC9G,yJACAe,CAAAA,CACA,cAAA,CACA,cACF,CAAA,CAAE,IAAA,CAAK,EAAE,CACX,CAGA,SAASG,EAAAA,CAAuBC,CAAAA,CAAiC,CAC/D,OAAOA,CAAAA,CAAW,GAAA,CAAKC,CAAAA,EAAMC,CAAAA,CAAmBD,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAC7D,CAKA,SAASE,EAAAA,CAAsBlD,CAAAA,CAA+B,CAC5D,IAAMmD,CAAAA,CAAQnD,CAAAA,CAAQ,KAAA,CAChB6B,CAAAA,CAAKsB,CAAAA,CAAM,IAAA,CAAK,MAChBrB,CAAAA,CAAKqB,CAAAA,CAAM,IAAA,CAAK,MAAA,CAChBC,CAAAA,CAAYD,CAAAA,CAAM,SAAA,GAAc,SAAA,CAChCf,CAAAA,CAAae,CAAAA,CAAM,IAAA,EAAQA,CAAAA,CAAM,IAAA,CAAK,IAAA,GAAS,SAC/Cd,CAAAA,CAAQc,CAAAA,CAAM,IAAA,EAAM,KAAA,EAAS,CAAA,CAC7Bb,CAAAA,CAAQa,EAAM,IAAA,EAAM,KAAA,EAAS,CAAA,CAC7BZ,CAAAA,CAAQY,CAAAA,CAAM,IAAA,EAAM,OAAS,CAAA,CAC7BX,CAAAA,CAAQW,CAAAA,CAAM,IAAA,EAAM,KAAA,EAAS,CAAA,CAC7BV,CAAAA,CAAUU,CAAAA,CAAM,EAAA,EAAM,GAAA,CACtBT,CAAAA,CAAYS,CAAAA,CAAM,IAAA,GAASC,CAAAA,CAAY,WAAWX,CAAO,CAAA,CAAA,CAAK,CAAA,MAAA,EAASA,CAAO,CAAA,CAAA,CAAA,CAGhFP,CAAAA,CAAY,GACZiB,CAAAA,CAAM,SAAA,EAAW,QAAA,GACnBjB,CAAAA,EAAa,CAAA,MAAA,EAAS,IAAA,CAAK,MAAMiB,CAAAA,CAAM,SAAA,CAAU,QAAA,CAAW,GAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAEhEA,CAAAA,CAAM,SAAA,EAAW,KAAA,GAAOjB,CAAAA,EAAa,YAAA,CAAA,CACrCiB,CAAAA,CAAM,SAAA,EAAW,KAAA,GAAOjB,GAAa,YAAA,CAAA,CAGzC,IAAMmB,CAAAA,CAAO,CACX,YAAA,CACA,CAAA,OAAA,EAAUnB,CAAS,CAAA,CAAA,CAAA,CACnB,sBAAA,CACA,CAAA,WAAA,EAAcL,CAAE,CAAA,MAAA,EAASC,CAAE,MAC3B,WAAA,CACA,CAAA,kBAAA,EAAqBqB,CAAAA,CAAM,SAAA,GAAc,SAAA,CAAY,MAAA,CAASA,EAAM,SAAS,CAAA,yBAAA,CAAA,CAC7EvC,EAAAA,CAAcuC,CAAAA,CAAM,IAAI,CAAA,CACxBjC,EAAiBiC,CAAAA,CAAM,OAAO,CAAA,CAC9B,aACF,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,CAGLG,CAAAA,CAAW,EAAA,CACf,GAAIH,CAAAA,CAAM,QAAA,CAAU,CAClB,IAAMI,CAAAA,CAAKJ,CAAAA,CAAM,QAAA,CACXK,CAAAA,CAAoB,CAAC,SAAA,CAAW,aAAa,CAAA,CAC/CD,CAAAA,CAAG,MAAA,EAAQC,CAAAA,CAAQ,IAAA,CAAK,CAAA,QAAA,EAAWD,EAAG,MAAA,GAAW,QAAA,CAAW,KAAA,CAAQA,CAAAA,CAAG,MAAM,CAAA,CAAA,CAAG,EAChFA,CAAAA,CAAG,YAAA,EAAcC,CAAAA,CAAQ,IAAA,CAAK,eAAe,CAAA,CAC7CD,EAAG,OAAA,GACDA,CAAAA,CAAG,OAAA,CAAQ,IAAA,EAAQ,IAAA,EAAMC,CAAAA,CAAQ,IAAA,CAAK,CAAA,MAAA,EAASD,CAAAA,CAAG,OAAA,CAAQ,IAAI,CAAA,CAAA,CAAG,CAAA,CACjEA,CAAAA,CAAG,QAAQ,GAAA,EAAO,IAAA,EAAMC,CAAAA,CAAQ,IAAA,CAAK,CAAA,MAAA,EAASD,CAAAA,CAAG,QAAQ,GAAG,CAAA,CAAA,CAAG,CAAA,CAC/DA,CAAAA,CAAG,OAAA,CAAQ,KAAA,EAAS,MAAMC,CAAAA,CAAQ,IAAA,CAAK,CAAA,MAAA,EAASD,CAAAA,CAAG,OAAA,CAAQ,KAAK,CAAA,CAAA,CAAG,CAAA,CACnEA,CAAAA,CAAG,OAAA,CAAQ,MAAA,EAAU,IAAA,EAAMC,CAAAA,CAAQ,IAAA,CAAK,SAASD,CAAAA,CAAG,OAAA,CAAQ,MAAM,CAAA,CAAA,CAAG,CAAA,CAAA,CAGvEH,CAAAA,CACFE,EAAW,CACT,2BAAA,CACAR,EAAAA,CAAuBS,CAAAA,CAAG,OAAO,CAAA,CACjC,8BACA,CAAA,YAAA,EAAeC,CAAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CAClC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,CAETF,CAAAA,CAAW,CAAC,CAAA,YAAA,EAAeE,CAAAA,CAAQ,KAAK,GAAG,CAAC,CAAA,EAAA,CAAI,CAAA,CAAE,IAAA,CAAK,EAAE,EAE7D,CAYA,IAAMb,CAAAA,CAAU,CACd,6EAAA,CACA,yFAAA,CAXU,CACV,WAAA,CACA,CAAA,YAAA,EAAeS,CAAAA,CAAY,YAAA,CAAe,EAAE,CAAA,EAAA,CAAA,CAC5CC,CAAAA,CACAC,CAAAA,CACA,YACF,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,CAOP,kBAAA,CACA,cACF,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,CAET,GAAI,CAAClB,EACH,OAAO,CACL,aAAA,CACA,CAAA,kBAAA,EAAqBC,CAAK,CAAA,SAAA,EAAYC,CAAK,CAAA,SAAA,EAAYC,CAAK,CAAA,SAAA,EAAYC,CAAK,CAAA,EAAA,CAAA,CAC7E,CAAA,eAAA,EAAkBX,CAAE,CAAA,MAAA,EAASC,CAAE,CAAA,GAAA,CAAA,CAC/B,4CAAA,CACA,CAAA,cAAA,EAAiBW,CAAO,CAAA,QAAA,EAAWxE,EAAUyE,CAAS,CAAC,CAAA,GAAA,CAAA,CACvD,yBAAA,CACAC,CAAAA,CACA,cAAA,CACA,cACF,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,CAIX,IAAMC,EAAAA,CAAYO,EAAM,IAAA,EAAM,IAAA,GAAS,QAAA,CAAW,GAAA,CAAM,GAAA,CAClDN,EAAAA,CAAWM,CAAAA,CAAM,QAAA,CACnB/B,CAAAA,CAAkB+B,CAAAA,CAAM,QAAQ,CAAA,CAChC,uKAAA,CACE1B,EAAAA,CAAOD,EAAc2B,CAAAA,CAAM,IAAK,CAAA,CAEtC,OAAO,CACL,aAAA,CACA,qBAAqBd,CAAK,CAAA,SAAA,EAAYC,CAAK,CAAA,SAAA,EAAYC,CAAK,CAAA,SAAA,EAAYC,CAAK,CAAA,sDAAA,EAAyDI,EAAS,CAAA,+CAAA,CAAA,CAC/I,6BAAA,CACAC,EAAAA,CACA,CAAA,eAAA,EAAkBhB,CAAE,CAAA,MAAA,EAASC,CAAE,CAAA,GAAA,CAAA,CAC/B,4CAAA,CACAL,EAAAA,CACA,CAAA,cAAA,EAAiBgB,CAAO,WAAWxE,CAAAA,CAAUyE,CAAS,CAAC,CAAA,GAAA,CAAA,CACvD,yBAAA,CACAC,CAAAA,CACA,eACA,cACF,CAAA,CAAE,IAAA,CAAK,EAAE,CACX,CAKA,SAASc,EAAAA,CAAoBzD,CAAAA,CAA6B,CACxD,OAAQA,CAAAA,CAAQ,IAAA,EACd,KAAK,MAAA,CACH,OAAOD,EAAAA,CAAqBC,CAAO,CAAA,CACrC,KAAK,MACH,OAAOC,EAAAA,CAA2B,CAAA,CACpC,KAAK,OAAA,CACH,OAAOE,EAAAA,CAAsBH,CAAO,CAAA,CACtC,KAAK,QAAA,CACH,OAAOI,GAAuBJ,CAAO,CAAA,CACvC,KAAK,aAAA,CACL,KAAK,YAAA,CACH,OAAOK,EAAAA,CAAuBL,CAAO,CAAA,CACvC,KAAK,WAAA,CACH,OAAOM,EAAAA,CAAmBN,CAAO,CAAA,CACnC,KAAK,WAAA,CACH,OAAOO,EAAAA,CAAmBP,CAAO,EACnC,KAAK,YAAA,CACH,OAAOQ,EAAAA,CAA2B,CAAA,CACpC,KAAK,eAAA,CACH,OAAOC,EAAAA,CAA8B,CAAA,CACvC,KAAK,SAAA,CACH,OAAO0B,EAAAA,CAAwBnC,CAAO,CAAA,CACxC,KAAK,OAAA,CACH,OAAOkD,GAAsBlD,CAAO,CAAA,CACtC,QACE,OAAO,EACX,CACF,CAYO,SAAS0D,CAAAA,CAAaC,CAAAA,CAAkB,CAC7C,IAAMjF,CAAAA,CAAkB,EAAC,CAGnBM,CAAAA,CAASS,EAAAA,CAAuBkE,CAAAA,CAAI,UAAA,CAAYA,CAAAA,CAAI,eAAe,CAAA,CACrE3E,CAAAA,EACFN,CAAAA,CAAM,IAAA,CAAKM,CAAM,CAAA,CAInB,IAAA,IAAWgB,KAAW2D,CAAAA,CAAI,OAAA,CAAS,CACjC,IAAMC,CAAAA,CAAaH,EAAAA,CAAoBzD,CAAO,CAAA,CAC1C4D,CAAAA,EACFlF,CAAAA,CAAM,IAAA,CAAKkF,CAAU,EAEzB,CAEA,OAAO,CAAA,KAAA,EAAQlF,CAAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA,MAAA,CAC/B,CCz1BA,SAASmF,CAAAA,CAAgBC,CAAAA,CAAgCC,CAAAA,CAA6B,CACpF,GAAI,CAACD,CAAAA,EAAUA,CAAAA,CAAO,KAAA,GAAU,MAAA,EAAUA,CAAAA,CAAO,KAAA,GAAU,MACzD,OAAO,EAAA,CAGT,IAAMzF,CAAAA,CAAkB,CAAC,CAAA,OAAA,EAAUyF,EAAO,KAAK,CAAA,CAAA,CAAG,CAAA,CAElD,OAAIA,CAAAA,CAAO,IAAA,GAAS,MAAA,EAClBzF,CAAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAASyF,CAAAA,CAAO,IAAI,CAAA,CAAA,CAAG,CAAA,CAGhCA,EAAO,KAAA,GAAU,MAAA,EACnBzF,CAAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAYyF,CAAAA,CAAO,KAAK,CAAA,CAAA,CAAG,CAAA,CAIpCA,CAAAA,CAAO,KAAA,GACLA,CAAAA,CAAO,KAAA,CAAM,KACfzF,CAAAA,CAAM,IAAA,CAAK,gBAAgB,CAAA,CAClByF,CAAAA,CAAO,KAAA,CAAM,GAAA,EACtBzF,CAAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAYyF,CAAAA,CAAO,KAAA,CAAM,GAAG,CAAA,CAAA,CAAG,EAGxCA,CAAAA,CAAO,KAAA,CAAM,UAAA,EACfzF,CAAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiByF,EAAO,KAAA,CAAM,UAAU,CAAA,CAAA,CAAG,CAAA,CAGpDA,CAAAA,CAAO,KAAA,CAAM,WACfzF,CAAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgByF,CAAAA,CAAO,KAAA,CAAM,SAAS,CAAA,CAAA,CAAG,CAAA,CAGlDA,CAAAA,CAAO,KAAA,CAAM,UAAA,EACfzF,CAAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiByF,EAAO,KAAA,CAAM,UAAU,CAAA,CAAA,CAAG,CAAA,CAAA,CAItDA,CAAAA,CAAO,MAAA,EACTzF,EAAM,IAAA,CAAK,iBAAiB,CAAA,CAG1ByF,CAAAA,CAAO,KAAA,EACTzF,CAAAA,CAAM,KAAK,gBAAgB,CAAA,CAGtB,CAAA,GAAA,EAAM0F,CAAW,CAAA,CAAA,EAAI1F,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CAC7C,CAKA,SAAS2F,EAAAA,CAA0BC,CAAAA,CAAiD,CAClF,GAAI,CAACA,CAAAA,CAAS,OAAO,EAAA,CAErB,IAAMvF,EAAkB,EAAC,CAEzB,GAAIuF,CAAAA,CAAQ,GAAA,CAAK,CACf,IAAMC,CAAAA,CAASL,CAAAA,CAAgBI,CAAAA,CAAQ,GAAA,CAAK,KAAK,CAAA,CAC7CC,CAAAA,EAAQxF,CAAAA,CAAM,IAAA,CAAKwF,CAAM,EAC/B,CAEA,GAAID,CAAAA,CAAQ,KAAM,CAChB,IAAME,CAAAA,CAAUN,CAAAA,CAAgBI,CAAAA,CAAQ,IAAA,CAAM,MAAM,CAAA,CAChDE,CAAAA,EAASzF,CAAAA,CAAM,IAAA,CAAKyF,CAAO,EACjC,CAEA,GAAIF,CAAAA,CAAQ,MAAA,CAAQ,CAClB,IAAMG,CAAAA,CAAYP,CAAAA,CAAgBI,CAAAA,CAAQ,MAAA,CAAQ,QAAQ,CAAA,CACtDG,CAAAA,EAAW1F,CAAAA,CAAM,IAAA,CAAK0F,CAAS,EACrC,CAEA,GAAIH,CAAAA,CAAQ,KAAA,CAAO,CACjB,IAAMI,CAAAA,CAAWR,CAAAA,CAAgBI,CAAAA,CAAQ,KAAA,CAAO,OAAO,CAAA,CACnDI,GAAU3F,CAAAA,CAAM,IAAA,CAAK2F,CAAQ,EACnC,CAEA,GAAIJ,CAAAA,CAAQ,OAAA,CAAS,CACnB,IAAMK,CAAAA,CAAaT,CAAAA,CAAgBI,CAAAA,CAAQ,OAAA,CAAS,SAAS,CAAA,CACzDK,CAAAA,EAAY5F,CAAAA,CAAM,IAAA,CAAK4F,CAAU,EACvC,CAEA,GAAIL,CAAAA,CAAQ,GAAA,CAAK,CACf,IAAMM,CAAAA,CAASV,EAAgBI,CAAAA,CAAQ,GAAA,CAAK,KAAK,CAAA,CAC7CM,CAAAA,EAAQ7F,CAAAA,CAAM,IAAA,CAAK6F,CAAM,EAC/B,CAEA,OAAI7F,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAU,GAExB,CAAA,QAAA,EAAWA,CAAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA,SAAA,CAClC,CASA,SAASJ,EAAAA,CAAiBC,CAAAA,CAAgD,CACxE,GAAI,CAACA,EAAS,OAAO,EAAA,CAErB,IAAMF,CAAAA,CAAkB,EAAC,CAoCzB,OAjCIE,CAAAA,CAAQ,OAAA,CACVF,CAAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAUE,CAAAA,CAAQ,OAAO,GAAG,CAAA,CAEvCF,CAAAA,CAAM,IAAA,CAAK,eAAe,CAAA,CAIxBE,CAAAA,CAAQ,OAAO,GAAA,CACjBF,CAAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAYE,CAAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAA,CAAG,CAAA,CAClCA,CAAAA,CAAQ,KAAA,EAAO,IAAA,EACxBF,CAAAA,CAAM,IAAA,CAAK,gBAAgB,CAAA,CAIzBE,CAAAA,CAAQ,IAAA,EAAM,GAAA,CAChBF,CAAAA,CAAM,IAAA,CAAK,WAAWE,CAAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,CAAA,CAAG,CAAA,CAChCA,CAAAA,CAAQ,MAAM,IAAA,EACvBF,CAAAA,CAAM,IAAA,CAAK,eAAe,CAAA,CAIxBE,CAAAA,CAAQ,MAAM,UAAA,EAChBF,CAAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgBE,CAAAA,CAAQ,IAAA,CAAK,UAAU,CAAA,CAAA,CAAG,CAAA,CAGnDA,CAAAA,CAAQ,IAAA,EAAM,SAAA,EAChBF,CAAAA,CAAM,IAAA,CAAK,oBAAoBE,CAAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,CAAA,CAAG,CAAA,CAGtDA,CAAAA,CAAQ,MAAM,UAAA,EAChBF,CAAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqBE,CAAAA,CAAQ,IAAA,CAAK,UAAU,CAAA,CAAA,CAAG,CAAA,CAGxDF,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAU,EAAA,CAExB,CAAA,OAAA,EAAUA,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CAClC,CASA,SAASmG,GAAkBC,CAAAA,CAAqC,CAC9D,OAAI,CAACA,CAAAA,EAAQA,CAAAA,CAAK,SAAW,CAAA,CAAU,EAAA,CAYhC,CAAA,QAAA,EAVaA,CAAAA,CAAK,GAAA,CAAKC,CAAAA,EAAQ,CACpC,IAAMrG,CAAAA,CAAkB,CAAC,CAAA,OAAA,EAAUqG,CAAAA,CAAI,SAAS,CAAA,CAAA,CAAA,CAAK,CAAA,OAAA,EAAUA,CAAAA,CAAI,QAAQ,CAAA,CAAA,CAAG,CAAA,CAE9E,OAAIA,CAAAA,CAAI,QAAUA,CAAAA,CAAI,MAAA,GAAW,MAAA,EAC/BrG,CAAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAaqG,EAAI,MAAM,CAAA,CAAA,CAAG,CAAA,CAGhC,CAAA,OAAA,EAAUrG,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CAClC,CAAC,CAAA,CAE6B,IAAA,CAAK,EAAE,CAAC,CAAA,SAAA,CACxC,CASA,SAASsG,EAAAA,CAAiBlG,CAAAA,CAAyC,CACjE,IAAMJ,EAAkB,EAAC,CA0BzB,OAxBII,CAAAA,CAAW,WAAA,GAAgB,MAAA,EAC7BJ,EAAM,IAAA,CAAK,CAAA,UAAA,EAAaI,CAAAA,CAAW,WAAW,CAAA,CAAA,CAAG,CAAA,CAG/CA,EAAW,UAAA,GAAe,MAAA,EAC5BJ,CAAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAYI,CAAAA,CAAW,UAAU,CAAA,CAAA,CAAG,CAAA,CAG7CA,CAAAA,CAAW,WAAA,GAAgB,MAAA,EAC7BJ,CAAAA,CAAM,IAAA,CAAK,WAAWI,CAAAA,CAAW,WAAW,CAAA,CAAA,CAAG,CAAA,CAG7CA,CAAAA,CAAW,eAAA,EACbJ,EAAM,IAAA,CAAK,CAAA,YAAA,EAAeI,CAAAA,CAAW,eAAe,CAAA,CAAA,CAAG,CAAA,CAGrDA,EAAW,iBAAA,EACbJ,CAAAA,CAAM,IAAA,CAAK,yBAAyB,CAAA,CAGlCI,CAAAA,CAAW,gBAAA,EACbJ,CAAAA,CAAM,IAAA,CAAK,wBAAwB,CAAA,CAGjCA,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAU,GAExB,CAAA,WAAA,EAAcA,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CACtC,CASA,SAASuG,EAAAA,CAAqBnG,CAAAA,CAAyC,CACrE,IAAMJ,CAAAA,CAAkB,EAAC,CAmBzB,OAjBII,CAAAA,CAAW,UAAA,GAAe,MAAA,EAC5BJ,CAAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAWI,CAAAA,CAAW,UAAU,CAAA,CAAA,CAAG,CAAA,CAG5CA,CAAAA,CAAW,WAAA,GAAgB,QAC7BJ,CAAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAYI,CAAAA,CAAW,WAAW,CAAA,CAAA,CAAG,EAG9CA,CAAAA,CAAW,eAAA,GAAoB,MAAA,GAC7BA,CAAAA,CAAW,aAAA,CAEbJ,CAAAA,CAAM,KAAK,CAAA,WAAA,EAAc,IAAA,CAAK,GAAA,CAAII,CAAAA,CAAW,eAAe,CAAC,CAAA,CAAA,CAAG,CAAA,CACvDA,CAAAA,CAAW,eAAA,GAAoB,CAAA,EACxCJ,CAAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgBI,EAAW,eAAe,CAAA,CAAA,CAAG,CAAA,CAAA,CAIxDJ,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAU,GAExB,CAAA,OAAA,EAAUA,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CAClC,CASA,SAASwG,EAAAA,CAAmBC,CAAAA,CAA6C,CACvE,GAAI,CAACA,EAAO,OAAO,EAAA,CAEnB,IAAMpG,CAAAA,CAAkB,EAAC,CAUzB,OARIoG,CAAAA,CAAM,IAAA,GAAS,MAAA,EACjBpG,CAAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkBoG,EAAM,IAAI,CAAA,GAAA,CAAK,CAAA,CAG1CA,CAAAA,CAAM,KAAA,GAAU,MAAA,EAClBpG,EAAM,IAAA,CAAK,CAAA,gBAAA,EAAmBoG,CAAAA,CAAM,KAAK,CAAA,GAAA,CAAK,CAAA,CAG5CpG,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAU,EAAA,CAExB,CAAA,SAAA,EAAYA,CAAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA,UAAA,CACnC,CASA,SAASqG,EAAAA,CAAyBC,CAAAA,CAA6C,CAC7E,GAAI,CAACA,CAAAA,CAAO,OAAO,EAAA,CAEnB,IAAM3G,CAAAA,CAAkB,EAAC,CAsCzB,OApCI2G,CAAAA,CAAM,KAAA,GAAU,MAAA,EAClB3G,CAAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ2G,CAAAA,CAAM,KAAK,CAAA,CAAA,CAAG,CAAA,CAG/BA,CAAAA,CAAM,MAAA,GAAW,QACnB3G,CAAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ2G,CAAAA,CAAM,MAAM,CAAA,CAAA,CAAG,EAGhCA,CAAAA,CAAM,OAAA,EACR3G,CAAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc2G,CAAAA,CAAM,OAAO,CAAA,CAAA,CAAG,CAAA,CAGvCA,CAAAA,CAAM,OAAA,EACR3G,CAAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc2G,CAAAA,CAAM,OAAO,CAAA,CAAA,CAAG,CAAA,CAGvCA,CAAAA,CAAM,CAAA,GAAM,MAAA,EACd3G,EAAM,IAAA,CAAK,CAAA,KAAA,EAAQ2G,CAAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAA,CAG3BA,EAAM,CAAA,GAAM,MAAA,EACd3G,CAAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ2G,CAAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAA,CAG3BA,CAAAA,CAAM,MAAA,EACR3G,CAAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa2G,CAAAA,CAAM,MAAM,CAAA,CAAA,CAAG,CAAA,CAGrCA,CAAAA,CAAM,MAAA,EACR3G,CAAAA,CAAM,KAAK,CAAA,UAAA,EAAa2G,CAAAA,CAAM,MAAM,CAAA,CAAA,CAAG,CAAA,CAGrCA,CAAAA,CAAM,MACR3G,CAAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW2G,CAAAA,CAAM,IAAI,CAAA,CAAA,CAAG,EAGjC3G,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAU,EAAA,CAExB,CAAA,WAAA,EAAcA,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CACtC,CASO,SAAS4G,CAAAA,CACdxG,CAAAA,CACAiB,EACQ,CACR,IAAMhB,CAAAA,CAAkB,EAAC,CAEzB,GAAID,EAAY,CAEVA,CAAAA,CAAW,OAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoBT,EAAUQ,CAAAA,CAAW,OAAO,CAAC,CAAA,GAAA,CAAK,CAAA,CAI/DA,CAAAA,CAAW,QAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,eAAe,CAAA,CAGxBD,CAAAA,CAAW,SAAA,EACbC,CAAAA,CAAM,KAAK,gBAAgB,CAAA,CAGzBD,CAAAA,CAAW,iBAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,wBAAwB,CAAA,CAGjCD,CAAAA,CAAW,eAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,sBAAsB,EAInC,IAAMwG,CAAAA,CAAWH,EAAAA,CAAyBtG,CAAAA,CAAW,KAAK,CAAA,CACtDyG,CAAAA,EACFxG,CAAAA,CAAM,IAAA,CAAKwG,CAAQ,CAAA,CAIjBzG,CAAAA,CAAW,YAAA,GAAiB,KAAA,CAC9BC,EAAM,IAAA,CAAK,6BAA6B,CAAA,CAC/BD,CAAAA,CAAW,YAAA,GAAiB,IAAA,EACrCC,EAAM,IAAA,CAAK,mBAAmB,CAAA,CAIhC,IAAMyG,CAAAA,CAAWN,EAAAA,CAAmBpG,EAAW,KAAK,CAAA,CAChD0G,CAAAA,EACFzG,CAAAA,CAAM,IAAA,CAAKyG,CAAQ,CAAA,CAIrB,IAAMC,CAAAA,CAAapB,EAAAA,CAA0BvF,CAAAA,CAAW,OAAO,CAAA,CAC3D2G,CAAAA,EACF1G,EAAM,IAAA,CAAK0G,CAAU,CAAA,CAIvB,IAAMtG,CAAAA,CAAaR,EAAAA,CAAiBG,EAAW,OAAO,CAAA,CAClDK,CAAAA,EACFJ,CAAAA,CAAM,IAAA,CAAKI,CAAU,EAIvB,IAAMuG,CAAAA,CAAUb,EAAAA,CAAkB/F,CAAAA,CAAW,IAAI,CAAA,CAC7C4G,CAAAA,EACF3G,CAAAA,CAAM,IAAA,CAAK2G,CAAO,CAAA,CAIhB5G,CAAAA,CAAW,mBAAA,EACbC,CAAAA,CAAM,KAAK,0BAA0B,CAAA,CAInCD,CAAAA,CAAW,mBAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,0BAA0B,CAAA,CAIvC,IAAM4G,CAAAA,CAAaX,EAAAA,CAAiBlG,CAAU,CAAA,CAC1C6G,GACF5G,CAAAA,CAAM,IAAA,CAAK4G,CAAU,CAAA,CAIvB,IAAMC,CAAAA,CAASX,EAAAA,CAAqBnG,CAAU,CAAA,CAqB9C,GApBI8G,CAAAA,EACF7G,CAAAA,CAAM,IAAA,CAAK6G,CAAM,EAIf9G,CAAAA,CAAW,IAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,WAAW,CAAA,CAIpBD,EAAW,SAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgBD,CAAAA,CAAW,SAAS,KAAK,CAAA,CAIlDA,CAAAA,CAAW,YAAA,GAAiB,MAAA,EAC9BC,CAAAA,CAAM,IAAA,CAAK,CAAA,qBAAA,EAAwBD,CAAAA,CAAW,YAAY,CAAA,GAAA,CAAK,CAAA,CAI7DA,CAAAA,CAAW,aAAA,CAAe,CAC5B,IAAMO,CAAAA,CAASR,CAAAA,CAAwBC,CAAAA,CAAW,aAAa,CAAA,CAC3DO,CAAAA,EACFN,EAAM,IAAA,CAAKM,CAAM,EAErB,CACF,CAMA,OAJIU,GAAmBA,CAAAA,CAAgB,MAAA,CAAS,CAAA,EAC9ChB,CAAAA,CAAM,IAAA,CAAK,GAAGgB,CAAAA,CAAgB,GAAA,CAAKR,CAAAA,EAAWsG,EAAAA,CAAiCtG,CAAM,CAAC,CAAC,CAAA,CAGrFR,EAAM,MAAA,GAAW,CAAA,CAAU,EAAA,CAExB,CAAA,OAAA,EAAUA,CAAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA,QAAA,CACjC,CAEA,SAAS+G,EAAAA,CAAgBC,CAAAA,CAAwB,CAC/C,OAAI,CAACA,CAAAA,CAAO,UAAA,CAAW,SAAS,CAAA,EAAK,CAACA,CAAAA,CAAO,QAAA,CAAS,UAAU,CAAA,CACvD,EAAA,CAEFA,CAAAA,CAAO,KAAA,CAAM,EAAkB,EAAkB,CAC1D,CAEA,SAASF,EAAAA,CAAiCtG,CAAAA,CAAyC,CACjF,IAAMC,CAAAA,CAAe,MAAA,CAAO,SAAA,CAAUD,CAAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAKA,CAAAA,CAAO,IAAA,CAAK,EAAA,EAAM,CAAA,CAAIA,CAAAA,CAAO,IAAA,CAAK,EAAA,CAAK,CAAA,CAC1FE,CAAAA,CAAkB,OAAOF,CAAAA,CAAO,IAAA,CAAK,MAAA,EAAW,SAAWA,CAAAA,CAAO,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK,CAAI,EAAA,CACvFG,EAAmBD,CAAAA,CAAgB,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAkB,SAAA,CAClEE,CAAAA,CAAiB,OAAOJ,CAAAA,CAAO,IAAA,CAAK,IAAA,EAAS,QAAA,CAAWA,CAAAA,CAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAK,CAAI,MAAA,CAClFK,CAAAA,CAAiB,OAAOL,CAAAA,CAAO,IAAA,CAAK,MAAS,QAAA,CAAWA,CAAAA,CAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAK,CAAI,OAClFb,CAAAA,CAAQ,CAAC,CAAA,MAAA,EAASc,CAAY,CAAA,CAAA,CAAA,CAAK,CAAA,UAAA,EAAalB,EAAUoB,CAAgB,CAAC,CAAA,CAAA,CAAG,CAAA,CAChFC,CAAAA,EACFjB,CAAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAWJ,CAAAA,CAAUqB,CAAc,CAAC,CAAA,CAAA,CAAG,CAAA,CAEhDC,CAAAA,EACFlB,EAAM,IAAA,CAAK,CAAA,QAAA,EAAWJ,CAAAA,CAAUsB,CAAc,CAAC,CAAA,CAAA,CAAG,EAGpD,IAAMoG,CAAAA,CAAiBV,CAAAA,CAA6B/F,CAAAA,CAAO,kBAAkB,CAAA,EAAK,WAC5E0G,CAAAA,CAAmBH,EAAAA,CAAgBE,CAAc,CAAA,CACjDE,CAAAA,CACJD,CAAAA,CAAiB,MAAA,CAAS,CAAA,CAAI,CAAA,OAAA,EAAUA,CAAgB,CAAA,QAAA,CAAA,CAAa,UAAA,CACvE,OAAO,CAAA,aAAA,EAAgBvH,EAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,EAAIwH,CAAqB,CAAA,cAAA,CACjE,CASA,SAASC,CAAAA,CAAmBC,CAAAA,CAA8B,CACxD,IAAM1H,CAAAA,CAAkB,EAAC,CAErB0H,CAAAA,CAAU,GAAA,EACZ1H,CAAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS0H,CAAAA,CAAU,GAAG,CAAA,CAAA,CAAG,CAAA,CAGlCA,CAAAA,CAAU,MAAA,EACZ1H,CAAAA,CAAM,IAAA,CAAK,aAAaJ,CAAAA,CAAU8H,CAAAA,CAAU,MAAM,CAAC,CAAA,CAAA,CAAG,CAAA,CAGpDA,EAAU,OAAA,EACZ1H,CAAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAcJ,CAAAA,CAAU8H,CAAAA,CAAU,OAAO,CAAC,CAAA,CAAA,CAAG,CAAA,CAGtDA,CAAAA,CAAU,MAAA,EACZ1H,CAAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAeJ,CAAAA,CAAU8H,CAAAA,CAAU,MAAM,CAAC,CAAA,CAAA,CAAG,CAAA,CAGtDA,EAAU,OAAA,GAAY,KAAA,EACxB1H,CAAAA,CAAM,IAAA,CAAK,eAAe,CAAA,CAGxB0H,EAAU,WAAA,EACZ1H,CAAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkBJ,CAAAA,CAAU8H,CAAAA,CAAU,WAAW,CAAC,CAAA,CAAA,CAAG,CAAA,CAIlE,IAAMC,CAAAA,CAAcD,CAAAA,CAAU,QAAA,CAC3B,GAAA,CAAKE,CAAAA,EACAA,CAAAA,CAAM,IAAA,GAAS,KAAA,CACVvC,CAAAA,CAAauC,CAAK,EAChBA,CAAAA,CAAM,IAAA,GAAS,eAAA,CACjBC,CAAAA,CAAuBD,CAAK,CAAA,CAC1BA,EAAM,IAAA,GAAS,aAAA,CACjBE,CAAAA,CAAqBF,CAAK,CAAA,CAE5B,EACR,EACA,IAAA,CAAK,EAAE,CAAA,CAGV,OAAO,CAAA,YAAA,EADU5H,CAAAA,CAAM,MAAA,CAAS,CAAA,CAAI,GAAA,CAAMA,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAA,CAAI,EAC9B,IAAI2H,CAAW,CAAA,cAAA,CAC/C,CAKA,SAASE,CAAAA,CAAuBE,CAAAA,CAAiC,CAC/D,IAAM/H,CAAAA,CAAkB,CAAC,CAAA,MAAA,EAAS+H,CAAAA,CAAS,EAAE,IAAK,CAAA,QAAA,EAAWnI,CAAAA,CAAUmI,CAAAA,CAAS,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAExF,OAAIA,CAAAA,CAAS,QAAA,GAAa,MAAA,EACxB/H,CAAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe+H,EAAS,QAAQ,CAAA,CAAA,CAAG,CAAA,CAG5CA,CAAAA,CAAS,OAAA,GAAY,MAAA,EACvB/H,EAAM,IAAA,CAAK,CAAA,WAAA,EAAc+H,CAAAA,CAAS,OAAO,CAAA,CAAA,CAAG,CAAA,CAGvC,oBAAoB/H,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CAC5C,CAKA,SAAS8H,CAAAA,CAAqBC,CAAAA,CAA+B,CAC3D,OAAO,CAAA,qBAAA,EAAwBA,CAAAA,CAAS,EAAE,KAC5C,CAOA,SAASC,EAAAA,CAAqBC,CAAAA,CAA4B,CACxD,IAAM5H,EAAkB,EAAC,CAGnB6H,CAAAA,CAAWD,CAAAA,CAAM,OAAA,CAAQ,IAAA,CAAME,GAAgBA,CAAAA,CAAE,IAAA,GAAS,KAAK,CAAA,CAC/DxH,CAAAA,CAASuH,CAAAA,EAAU,UAAA,CAAa/H,CAAAA,CAAwB+H,CAAAA,CAAS,UAAU,CAAA,CAAI,EAAA,CAG/EE,CAAAA,CAAuB,CAAC,uBAAuB,CAAA,CACjDH,CAAAA,CAAM,OAAA,EACRG,CAAAA,CAAW,IAAA,CAAK,kBAAkB,EAEpC/H,CAAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQM,CAAM,CAAA,WAAA,EAAcyH,CAAAA,CAAW,KAAK,GAAG,CAAC,CAAA,QAAA,CAAU,CAAA,CAOrE,IAAMC,CAAAA,CAHJJ,CAAAA,CAAM,WAAA,CAAY,UAAA,CAAW,GAAG,CAAA,EAChCA,CAAAA,CAAM,WAAA,CAAY,QAAA,CAAS,GAAG,CAAA,EAC9BA,CAAAA,CAAM,WAAA,CAAY,QAAA,CAAS,IAAI,CAAA,CACC,wBAA0B,EAAA,CAC5D5H,CAAAA,CAAM,IAAA,CACJ,CAAA,KAAA,EAAQM,CAAM,CAAA,YAAA,EAAe0H,CAAS,CAAA,CAAA,EAAIzI,CAAAA,CAAUqI,CAAAA,CAAM,WAAW,CAAC,CAAA,oBAAA,CACxE,CAAA,CAGA5H,CAAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQM,CAAM,CAAA,2CAAA,CAA6C,CAAA,CAGtE,IAAA,IAAW2H,KAAQL,CAAAA,CAAM,OAAA,CACnBK,CAAAA,CAAK,IAAA,GAAS,KAAA,EAChBjI,CAAAA,CAAM,KAAKgF,CAAAA,CAAaiD,CAAI,CAAC,CAAA,CAKjC,OAAAjI,CAAAA,CAAM,KAAK,CAAA,KAAA,EAAQM,CAAM,CAAA,sCAAA,CAAwC,CAAA,CAE1DN,CAAAA,CAAM,IAAA,CAAK,EAAE,CACtB,CAOA,SAASkI,EAAAA,CAAsBN,CAAAA,CAA6B,CAC1D,IAAM5H,EAAkB,EAAC,CAKnBmI,CAAAA,CAAmBP,CAAAA,CAAM,WAAA,GAAc,CAAC,GAAG,UAAA,CAC3CtH,CAAAA,CAAS6H,CAAAA,CAAmBrI,CAAAA,CAAwBqI,CAAgB,CAAA,CAAI,GAIxEJ,CAAAA,CAAuB,CAAC,uBAAuB,CAAA,CAOrD,GANIH,CAAAA,CAAM,OAAA,EACRG,CAAAA,CAAW,IAAA,CAAK,kBAAkB,CAAA,CAEpC/H,CAAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQM,CAAM,CAAA,WAAA,EAAcyH,CAAAA,CAAW,IAAA,CAAK,GAAG,CAAC,CAAA,QAAA,CAAU,EAGjEH,CAAAA,CAAM,SAAA,CAAU,MAAA,CAAS,CAAA,CAC3B5H,CAAAA,CAAM,IAAA,CAAK,GAAG4H,CAAAA,CAAM,SAAA,CAAU,GAAA,CAAK3C,CAAAA,EAAQD,CAAAA,CAAaC,CAAG,CAAC,CAAC,CAAA,CAAA,KACxD,CAML,IAAM+C,CAAAA,CAHJJ,CAAAA,CAAM,WAAA,CAAY,WAAW,GAAG,CAAA,EAChCA,CAAAA,CAAM,WAAA,CAAY,QAAA,CAAS,GAAG,GAC9BA,CAAAA,CAAM,WAAA,CAAY,QAAA,CAAS,IAAI,CAAA,CACC,uBAAA,CAA0B,GAC5D5H,CAAAA,CAAM,IAAA,CACJ,CAAA,KAAA,EAAQM,CAAM,CAAA,YAAA,EAAe0H,CAAS,CAAA,CAAA,EAAIzI,CAAAA,CAAUqI,CAAAA,CAAM,WAAW,CAAC,CAAA,oBAAA,CACxE,EACF,CAGA,OAAA5H,CAAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQM,CAAM,CAAA,2CAAA,CAA6C,CAAA,CAGtEN,EAAM,IAAA,CAAK,GAAG4H,CAAAA,CAAM,WAAA,CAAY,GAAA,CAAK3C,CAAAA,EAAQD,EAAaC,CAAG,CAAC,CAAC,CAAA,CAG/DjF,CAAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQM,CAAM,CAAA,sCAAA,CAAwC,CAAA,CAE1DN,CAAAA,CAAM,IAAA,CAAK,EAAE,CACtB,CAKA,SAASoI,EAAAA,CAAmBC,CAAAA,CAAwB,CAClD,IAAMC,CAAAA,CAAQD,EAAI,UAAA,CACZE,CAAAA,CAAoB,EAAC,CAQ3B,OANID,CAAAA,CAAM,OAAOC,CAAAA,CAAQ,IAAA,CAAK,CAAA,gBAAA,EAAmBhJ,CAAAA,CAAU+I,CAAAA,CAAM,KAAK,CAAC,CAAA,GAAA,CAAK,CAAA,CACxEA,CAAAA,CAAM,GAAA,EAAKC,CAAAA,CAAQ,IAAA,CAAK,iBAAiBhJ,CAAAA,CAAU+I,CAAAA,CAAM,GAAG,CAAC,CAAA,GAAA,CAAK,CAAA,CAClEA,EAAM,IAAA,EAAQA,CAAAA,CAAM,IAAA,GAAS,UAAA,EAAYC,CAAAA,CAAQ,IAAA,CAAK,kBAAkBD,CAAAA,CAAM,IAAI,CAAA,GAAA,CAAK,CAAA,CACvFA,CAAAA,CAAM,kBAAA,EAAoBC,CAAAA,CAAQ,IAAA,CAAK,oBAAoB,CAAA,CAGvDD,CAAAA,CAAM,OAAA,EACZ,KAAK,YACHC,CAAAA,CAAQ,IAAA,CAAK,WAAW,CAAA,CACxB,MACF,KAAK,OACCD,CAAAA,CAAM,UAAA,CACRC,CAAAA,CAAQ,IAAA,CAAK,CAAA,oBAAA,EAAuBhJ,CAAAA,CAAU+I,EAAM,UAAU,CAAC,CAAA,GAAA,CAAK,CAAA,CAEpEC,CAAAA,CAAQ,IAAA,CAAK,WAAW,CAAA,CAE1B,MACF,KAAK,UAAA,CAAY,CACf,IAAMC,CAAAA,CAAAA,CAASF,EAAM,SAAA,EAAa,EAAC,EAChC,GAAA,CACEG,CAAAA,EACC,CAAA,2BAAA,EAA8BlJ,EAAUkJ,CAAAA,CAAE,WAAW,CAAC,CAAA,WAAA,EAAclJ,CAAAA,CAAUkJ,CAAAA,CAAE,KAAK,CAAC,CAAA,GAAA,CAC1F,CAAA,CACC,IAAA,CAAK,EAAE,CAAA,CACVF,CAAAA,CAAQ,IAAA,CAAK,CAAA,gBAAA,EAAmBC,CAAK,CAAA,iBAAA,CAAmB,CAAA,CACxD,KACF,CACA,KAAK,UAAA,CAAY,CACf,IAAMA,CAAAA,CAAAA,CAASF,CAAAA,CAAM,SAAA,EAAa,EAAC,EAChC,GAAA,CACEG,CAAAA,EACC,CAAA,2BAAA,EAA8BlJ,CAAAA,CAAUkJ,CAAAA,CAAE,WAAW,CAAC,CAAA,WAAA,EAAclJ,CAAAA,CAAUkJ,CAAAA,CAAE,KAAK,CAAC,CAAA,GAAA,CAC1F,CAAA,CACC,IAAA,CAAK,EAAE,CAAA,CACVF,CAAAA,CAAQ,IAAA,CAAK,CAAA,YAAA,EAAeC,CAAK,CAAA,aAAA,CAAe,CAAA,CAChD,KACF,CACA,KAAK,UAAA,CACHD,EAAQ,IAAA,CACN,CAAA,oCAAA,EAAuCD,CAAAA,CAAM,OAAA,CAAU,GAAA,CAAM,GAAG,oBAClE,CAAA,CACA,MACF,KAAK,SAAA,CACHC,CAAAA,CAAQ,IAAA,CAAK,cAAc,CAAA,CAC3B,KACJ,CAEA,IAAMrD,CAAAA,CAAamD,CAAAA,CAAI,OAAA,CACpB,IAAKJ,CAAAA,EACAA,CAAAA,CAAK,IAAA,GAAS,KAAA,CAAcjD,CAAAA,CAAaiD,CAAI,EAC7CA,CAAAA,CAAK,IAAA,GAAS,WAAA,CAAoBb,CAAAA,CAAmBa,CAAI,CAAA,CACtD,EACR,CAAA,CACA,IAAA,CAAK,EAAE,CAAA,CAEV,OAAO,CAAA,gBAAA,EAAmBM,CAAAA,CAAQ,IAAA,CAAK,EAAE,CAAC,CAAA,wBAAA,EAA2BrD,CAAU,CAAA,uBAAA,CACjF,CAEA,SAASwD,CAAAA,CACPC,CAAAA,CACAC,CAAAA,CACQ,CACR,IAAMjJ,CAAAA,CAAQ,CAAC,CAAA,MAAA,EAASiJ,CAAAA,CAAO,EAAE,CAAA,CAAA,CAAA,CAAK,CAAA,QAAA,EAAWrJ,CAAAA,CAAUqJ,EAAO,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAC1E,OAAO,CAAA,GAAA,EAAMD,CAAG,CAAA,CAAA,EAAIhJ,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CACrC,CAKA,SAASkJ,CAAAA,CACPF,CAAAA,CACAnI,CAAAA,CACQ,CACR,IAAMsI,CAAAA,CAAOtI,EAAO,IAAA,CACdC,CAAAA,CAAe,MAAA,CAAO,SAAA,CAAUqI,CAAAA,CAAK,EAAE,GAAKA,CAAAA,CAAK,EAAA,EAAM,CAAA,CAAIA,CAAAA,CAAK,EAAA,CAAK,CAAA,CACrEpI,CAAAA,CAAkB,OAAOoI,CAAAA,CAAK,MAAA,EAAW,QAAA,CAAWA,CAAAA,CAAK,MAAA,CAAO,IAAA,GAAS,EAAA,CACzEnI,CAAAA,CAAmBD,CAAAA,CAAgB,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAkB,UAClEE,CAAAA,CAAiB,OAAOkI,CAAAA,CAAK,IAAA,EAAS,QAAA,CAAWA,CAAAA,CAAK,KAAK,IAAA,EAAK,CAAI,MAAA,CACpEnJ,CAAAA,CAAQ,CAAC,CAAA,MAAA,EAASc,CAAY,CAAA,CAAA,CAAA,CAAK,CAAA,UAAA,EAAalB,CAAAA,CAAUoB,CAAgB,CAAC,CAAA,CAAA,CAAG,CAAA,CAChFC,GAAgBjB,CAAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAWJ,CAAAA,CAAUqB,CAAc,CAAC,GAAG,CAAA,CAEtE,IAAMsE,CAAAA,CAAa1E,CAAAA,CAAO,OAAA,CACvB,GAAA,CAAKyH,GACAA,CAAAA,CAAK,IAAA,GAAS,KAAA,CACZU,CAAAA,GAAQ,KAAA,EAASA,CAAAA,GAAQ,UAAA,CACpB3D,CAAAA,CAAaiD,CAAI,CAAA,CACrB,OAAA,CAAQ,SAAA,CAAW,YAAY,CAAA,CAC/B,QAAQ,UAAA,CAAY,cAAc,CAAA,CAClC,OAAA,CAAQ,iBAAA,CAAmB,iBAAiB,EAC5C,OAAA,CAAQ,kBAAA,CAAoB,mBAAmB,CAAA,CAE7CjD,CAAAA,CAAaiD,CAAI,EAEtBA,CAAAA,CAAK,IAAA,GAAS,WAAA,CAAoBb,CAAAA,CAAmBa,CAAI,CAAA,CACtD,EACR,CAAA,CACA,IAAA,CAAK,EAAE,CAAA,CAEV,OAAO,CAAA,GAAA,EAAMU,CAAG,IAAIhJ,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,EAAIuF,CAAU,OAAOyD,CAAG,CAAA,CAAA,CAC7D,CAKA,SAASI,EAAAA,CAA0BzH,CAAAA,CAAmC,CACpE,OAAQA,CAAAA,CAAQ,IAAA,EACd,KAAK,KAAA,CACH,OAAO0D,CAAAA,CAAa1D,CAAO,CAAA,CAC7B,KAAK,WAAA,CACH,OAAO8F,CAAAA,CAAmB9F,CAAO,CAAA,CACnC,KAAK,eAAA,CACH,OAAOkG,CAAAA,CAAuBlG,CAAO,EACvC,KAAK,aAAA,CACH,OAAOmG,CAAAA,CAAqBnG,CAAO,CAAA,CACrC,KAAK,aAAA,CACH,OAAOqG,EAAAA,CAAqBrG,CAAO,CAAA,CACrC,KAAK,cAAA,CACH,OAAO4G,EAAAA,CAAsB5G,CAAO,CAAA,CACtC,KAAK,WAAA,CACH,OAAO8G,GAAmB9G,CAAO,CAAA,CACnC,KAAK,mBAAA,CACH,OAAO,CAAA,2BAAA,EAA8BA,EAAQ,EAAE,CAAA,GAAA,CAAA,CACjD,KAAK,iBAAA,CACH,OACE,CAAA,yBAAA,EAA4BA,EAAQ,EAAE,CAAA,qFAAA,EAC+CA,CAAAA,CAAQ,EAAE,CAAA,SAAA,CAAA,CAEnG,KAAK,WAAA,CACH,OAAOuH,CAAAA,CAAuB,KAAA,CAAOvH,CAAO,CAAA,CAC9C,KAAK,UAAA,CACH,OAAOuH,CAAAA,CAAuB,KAAA,CAAOvH,CAAO,CAAA,CAC9C,KAAK,UAAA,CACH,OAAOuH,CAAAA,CAAuB,UAAA,CAAYvH,CAAO,CAAA,CACnD,KAAK,QAAA,CACH,OAAOuH,CAAAA,CAAuB,QAAA,CAAUvH,CAAO,CAAA,CACjD,KAAK,oBAAA,CACH,OAAOoH,CAAAA,CAAwB,oBAAA,CAAsBpH,CAA6B,CAAA,CACpF,KAAK,kBAAA,CACH,OAAO,6BAA6BA,CAAAA,CAAQ,EAAE,CAAA,GAAA,CAAA,CAChD,KAAK,kBAAA,CACH,OAAOoH,EAAwB,kBAAA,CAAoBpH,CAA2B,CAAA,CAChF,KAAK,gBAAA,CACH,OAAO,2BAA2BA,CAAAA,CAAQ,EAAE,CAAA,GAAA,CAAA,CAC9C,KAAK,cAAA,CAEH,OAAOA,CAAAA,CAAQ,OAAA,EAAW,EAAA,CAC5B,QACE,OAAO,EACX,CACF,CAYO,SAASiD,CAAAA,CAAmByE,CAAAA,CAA8B,CAC/D,IAAMhJ,CAAAA,CAAkB,GAGlBL,CAAAA,CAAkB,EAAC,CACrBqJ,CAAAA,CAAU,MAAA,EACZrJ,CAAAA,CAAM,KAAK,CAAA,YAAA,EAAeqJ,CAAAA,CAAU,MAAM,CAAA,CAAA,CAAG,CAAA,CAE3CA,CAAAA,CAAU,MAAA,EACZrJ,CAAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAeqJ,CAAAA,CAAU,MAAM,CAAA,CAAA,CAAG,CAAA,CAE/C,IAAMC,CAAAA,CAAWtJ,CAAAA,CAAM,MAAA,CAAS,CAAA,CAAI,GAAA,CAAMA,CAAAA,CAAM,KAAK,GAAG,CAAA,CAAI,EAAA,CAGtDqH,CAAAA,CAAST,CAAAA,CAA6ByC,CAAAA,CAAU,WAAYA,CAAAA,CAAU,eAAe,CAAA,CACvFhC,CAAAA,EACFhH,CAAAA,CAAM,IAAA,CAAKgH,CAAM,CAAA,CAInB,IAAA,IAAW1F,CAAAA,IAAW0H,CAAAA,CAAU,OAAA,CAAS,CACvC,IAAM9D,EAAa6D,EAAAA,CAA0BzH,CAAO,CAAA,CAChD4D,CAAAA,EACFlF,CAAAA,CAAM,IAAA,CAAKkF,CAAU,EAEzB,CAEA,OAAO,CAAA,IAAA,EAAO+D,CAAQ,CAAA,CAAA,EAAIjJ,EAAM,IAAA,CAAK,EAAE,CAAC,CAAA,MAAA,CAC1C,CCz0BA,SAASkJ,EAAAA,CAA2BJ,CAAAA,CAIlC,CACA,IAAMrI,CAAAA,CAAe,MAAA,CAAO,SAAA,CAAUqI,CAAAA,CAAK,EAAE,CAAA,EAAKA,CAAAA,CAAK,EAAA,EAAM,CAAA,CAAIA,CAAAA,CAAK,EAAA,CAAK,EACrEpI,CAAAA,CAAkB,OAAOoI,CAAAA,CAAK,MAAA,EAAW,QAAA,CAAWA,CAAAA,CAAK,OAAO,IAAA,EAAK,CAAI,EAAA,CACzEnI,CAAAA,CAAmBD,CAAAA,CAAgB,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAkB,SAAA,CAClEE,CAAAA,CAAiB,OAAOkI,CAAAA,CAAK,IAAA,EAAS,QAAA,CAAWA,EAAK,IAAA,CAAK,IAAA,EAAK,CAAI,MAAA,CAE1E,OAAO,CACL,GAAIrI,CAAAA,CACJ,MAAA,CAAQE,CAAAA,CACR,IAAA,CAAMC,CACR,CACF,CAEA,SAASuI,CAAAA,CACPL,CAAAA,CACAM,CAAAA,CACQ,CACR,IAAMC,CAAAA,CAAaH,EAAAA,CAA2BJ,CAAI,CAAA,CAC5CnJ,CAAAA,CAAQ,CAAC,CAAA,MAAA,EAAS0J,CAAAA,CAAW,EAAE,CAAA,CAAA,CAAA,CAAK,CAAA,UAAA,EAAa9J,CAAAA,CAAU8J,CAAAA,CAAW,MAAM,CAAC,GAAG,CAAA,CACtF,OAAIA,CAAAA,CAAW,IAAA,EACb1J,CAAAA,CAAM,IAAA,CAAK,WAAWJ,CAAAA,CAAU8J,CAAAA,CAAW,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAEjDD,CAAAA,EAAQA,CAAAA,CAAK,IAAA,EAAK,CAAE,MAAA,CAAS,CAAA,EAC/BzJ,CAAAA,CAAM,IAAA,CAAK,WAAWJ,CAAAA,CAAU6J,CAAAA,CAAK,IAAA,EAAM,CAAC,CAAA,CAAA,CAAG,EAE1CzJ,CAAAA,CAAM,IAAA,CAAK,GAAG,CACvB,CASA,SAAS2J,EACPC,CAAAA,CACAlE,CAAAA,CACQ,CACR,GAAI,CAACkE,CAAAA,CAAa,OAAO,EAAA,CAEzB,IAAM5J,CAAAA,CAAkB,CAAC,CAAA,KAAA,EAAQ4J,CAAAA,CAAY,KAAK,IAAK,CAAA,QAAA,EAAWA,CAAAA,CAAY,IAAI,CAAA,CAAA,CAAG,CAAA,CAErF,OAAO,MAAMlE,CAAW,CAAA,CAAA,EAAI1F,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAC,IAC7C,CASA,SAASwF,CAAAA,CAAgBC,CAAAA,CAAgCC,CAAAA,CAA6B,CACpF,GAAI,CAACD,CAAAA,EAAUA,CAAAA,CAAO,KAAA,GAAU,MAAA,EAAUA,CAAAA,CAAO,KAAA,GAAU,MACzD,OAAO,EAAA,CAGT,IAAMzF,CAAAA,CAAkB,CAAC,CAAA,OAAA,EAAUyF,EAAO,KAAK,CAAA,CAAA,CAAG,CAAA,CAElD,OAAIA,CAAAA,CAAO,IAAA,GAAS,QAClBzF,CAAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAASyF,CAAAA,CAAO,IAAI,CAAA,CAAA,CAAG,CAAA,CAGhCA,CAAAA,CAAO,KAAA,GAAU,MAAA,EACnBzF,CAAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAYyF,CAAAA,CAAO,KAAK,CAAA,CAAA,CAAG,CAAA,CAIpCA,CAAAA,CAAO,KAAA,GACLA,CAAAA,CAAO,KAAA,CAAM,KACfzF,CAAAA,CAAM,IAAA,CAAK,gBAAgB,CAAA,CAClByF,CAAAA,CAAO,KAAA,CAAM,KACtBzF,CAAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAYyF,CAAAA,CAAO,KAAA,CAAM,GAAG,CAAA,CAAA,CAAG,CAAA,CAGxCA,CAAAA,CAAO,KAAA,CAAM,UAAA,EACfzF,CAAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiByF,EAAO,KAAA,CAAM,UAAU,CAAA,CAAA,CAAG,CAAA,CAGpDA,CAAAA,CAAO,KAAA,CAAM,WACfzF,CAAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgByF,CAAAA,CAAO,KAAA,CAAM,SAAS,GAAG,CAAA,CAGlDA,CAAAA,CAAO,KAAA,CAAM,UAAA,EACfzF,CAAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiByF,CAAAA,CAAO,KAAA,CAAM,UAAU,CAAA,CAAA,CAAG,CAAA,CAAA,CAItDA,CAAAA,CAAO,MAAA,EACTzF,EAAM,IAAA,CAAK,iBAAiB,CAAA,CAG1ByF,CAAAA,CAAO,KAAA,EACTzF,CAAAA,CAAM,KAAK,gBAAgB,CAAA,CAGtB,CAAA,GAAA,EAAM0F,CAAW,CAAA,CAAA,EAAI1F,CAAAA,CAAM,KAAK,GAAG,CAAC,CAAA,EAAA,CAC7C,CAKA,SAAS6J,CAAAA,CAAsBjE,CAAAA,CAAmCF,CAAAA,CAA6B,CAC7F,GAAI,CAACE,CAAAA,CAAS,OAAO,EAAA,CAErB,IAAMvF,CAAAA,CAAkB,EAAC,CAEzB,GAAIuF,CAAAA,CAAQ,GAAA,CAAK,CACf,IAAMC,CAAAA,CAASL,CAAAA,CAAgBI,CAAAA,CAAQ,GAAA,CAAK,KAAK,EAC7CC,CAAAA,EAAQxF,CAAAA,CAAM,IAAA,CAAKwF,CAAM,EAC/B,CAEA,GAAID,CAAAA,CAAQ,IAAA,CAAM,CAChB,IAAME,CAAAA,CAAUN,CAAAA,CAAgBI,CAAAA,CAAQ,KAAM,MAAM,CAAA,CAChDE,CAAAA,EAASzF,CAAAA,CAAM,IAAA,CAAKyF,CAAO,EACjC,CAEA,GAAIF,CAAAA,CAAQ,MAAA,CAAQ,CAClB,IAAMG,EAAYP,CAAAA,CAAgBI,CAAAA,CAAQ,MAAA,CAAQ,QAAQ,CAAA,CACtDG,CAAAA,EAAW1F,CAAAA,CAAM,IAAA,CAAK0F,CAAS,EACrC,CAEA,GAAIH,CAAAA,CAAQ,KAAA,CAAO,CACjB,IAAMI,CAAAA,CAAWR,CAAAA,CAAgBI,CAAAA,CAAQ,KAAA,CAAO,OAAO,EACnDI,CAAAA,EAAU3F,CAAAA,CAAM,IAAA,CAAK2F,CAAQ,EACnC,CAEA,GAAIJ,CAAAA,CAAQ,OAAA,CAAS,CACnB,IAAMkE,CAAAA,CAAatE,CAAAA,CAAgBI,CAAAA,CAAQ,OAAA,CAAS,SAAS,CAAA,CACzDkE,CAAAA,EAAYzJ,CAAAA,CAAM,IAAA,CAAKyJ,CAAU,EACvC,CAEA,GAAIlE,CAAAA,CAAQ,OAAA,CAAS,CACnB,IAAMmE,EAAavE,CAAAA,CAAgBI,CAAAA,CAAQ,OAAA,CAAS,SAAS,CAAA,CACzDmE,CAAAA,EAAY1J,EAAM,IAAA,CAAK0J,CAAU,EACvC,CAEA,OAAI1J,CAAAA,CAAM,SAAW,CAAA,CAAU,EAAA,CAExB,CAAA,GAAA,EAAMqF,CAAW,CAAA,CAAA,EAAIrF,CAAAA,CAAM,KAAK,EAAE,CAAC,CAAA,IAAA,EAAOqF,CAAW,CAAA,CAAA,CAC9D,CASA,SAASsE,CAAAA,CAAqBC,CAAAA,CAAkCvE,CAAAA,CAA6B,CAC3F,GAAI,CAACuE,EAAS,OAAO,EAAA,CAErB,IAAM5J,CAAAA,CAAkB,EAAC,CAkBzB,OAhBI4J,CAAAA,CAAQ,GAAA,EACV5J,CAAAA,CAAM,IAAA,CAAKsJ,CAAAA,CAAqBM,CAAAA,CAAQ,GAAA,CAAK,KAAK,CAAC,CAAA,CAGjDA,CAAAA,CAAQ,IAAA,EACV5J,CAAAA,CAAM,IAAA,CAAKsJ,EAAqBM,CAAAA,CAAQ,IAAA,CAAM,MAAM,CAAC,CAAA,CAGnDA,CAAAA,CAAQ,QACV5J,CAAAA,CAAM,IAAA,CAAKsJ,CAAAA,CAAqBM,CAAAA,CAAQ,MAAA,CAAQ,QAAQ,CAAC,CAAA,CAGvDA,CAAAA,CAAQ,KAAA,EACV5J,CAAAA,CAAM,IAAA,CAAKsJ,CAAAA,CAAqBM,CAAAA,CAAQ,MAAO,OAAO,CAAC,CAAA,CAGrD5J,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAU,GAExB,CAAA,GAAA,EAAMqF,CAAW,CAAA,CAAA,EAAIrF,CAAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA,IAAA,EAAOqF,CAAW,CAAA,CAAA,CAC9D,CASA,SAASzF,CAAAA,CAAiBC,CAAAA,CAAgD,CACxE,GAAI,CAACA,CAAAA,CAAS,OAAO,EAAA,CAErB,IAAMF,EAAkB,EAAC,CAoCzB,OAjCIE,CAAAA,CAAQ,OAAA,CACVF,CAAAA,CAAM,KAAK,CAAA,OAAA,EAAUE,CAAAA,CAAQ,OAAO,CAAA,CAAA,CAAG,CAAA,CAEvCF,CAAAA,CAAM,KAAK,eAAe,CAAA,CAIxBE,CAAAA,CAAQ,KAAA,EAAO,GAAA,CACjBF,CAAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAYE,CAAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAA,CAAG,CAAA,CAClCA,CAAAA,CAAQ,OAAO,IAAA,EACxBF,CAAAA,CAAM,IAAA,CAAK,gBAAgB,CAAA,CAIzBE,CAAAA,CAAQ,MAAM,GAAA,CAChBF,CAAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAWE,CAAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,CAAA,CAAG,CAAA,CAChCA,CAAAA,CAAQ,IAAA,EAAM,IAAA,EACvBF,CAAAA,CAAM,IAAA,CAAK,eAAe,CAAA,CAIxBE,CAAAA,CAAQ,IAAA,EAAM,UAAA,EAChBF,CAAAA,CAAM,IAAA,CAAK,gBAAgBE,CAAAA,CAAQ,IAAA,CAAK,UAAU,CAAA,CAAA,CAAG,CAAA,CAGnDA,CAAAA,CAAQ,MAAM,SAAA,EAChBF,CAAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoBE,CAAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,CAAA,CAAG,CAAA,CAGtDA,CAAAA,CAAQ,IAAA,EAAM,UAAA,EAChBF,CAAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqBE,CAAAA,CAAQ,IAAA,CAAK,UAAU,CAAA,CAAA,CAAG,CAAA,CAGxDF,CAAAA,CAAM,SAAW,CAAA,CAAU,EAAA,CAExB,CAAA,OAAA,EAAUA,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CAClC,CASA,SAASkK,EAAAA,CAAmBC,CAAAA,CAAqC,CAC/D,GAAI,CAACA,CAAAA,CAAM,OAAO,EAAA,CAElB,IAAMnK,CAAAA,CAAkB,EAAC,CA0BzB,OAxBImK,CAAAA,CAAK,QAAA,EACPnK,CAAAA,CAAM,IAAA,CAAK,gBAAgB,EAGzBmK,CAAAA,CAAK,OAAA,EACPnK,CAAAA,CAAM,IAAA,CAAK,eAAe,CAAA,CAGxBmK,EAAK,WAAA,EACPnK,CAAAA,CAAM,IAAA,CAAK,mBAAmB,CAAA,CAG5BmK,CAAAA,CAAK,YACPnK,CAAAA,CAAM,IAAA,CAAK,kBAAkB,CAAA,CAG3BmK,CAAAA,CAAK,OAAA,EACPnK,CAAAA,CAAM,IAAA,CAAK,eAAe,CAAA,CAGxBmK,CAAAA,CAAK,OAAA,EACPnK,CAAAA,CAAM,IAAA,CAAK,eAAe,CAAA,CAGxBA,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAU,EAAA,CAExB,CAAA,WAAA,EAAcA,EAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CACtC,CASA,SAASoK,GAAiCC,CAAAA,CAAuD,CAC/F,GAAI,CAACA,CAAAA,CAAU,OAAO,EAAA,CAEtB,IAAMrK,CAAAA,CAAkB,EAAC,CA0CzB,OAxCIqK,CAAAA,CAAS,UAAA,EACXrK,EAAM,IAAA,CAAK,CAAA,cAAA,EAAiBqK,CAAAA,CAAS,UAAU,CAAA,CAAA,CAAG,CAAA,CAGhDA,EAAS,UAAA,EACXrK,CAAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiBqK,CAAAA,CAAS,UAAU,GAAG,CAAA,CAGhDA,CAAAA,CAAS,KAAA,GAAU,MAAA,EACrBrK,CAAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAYqK,CAAAA,CAAS,KAAK,CAAA,CAAA,CAAG,CAAA,CAGtCA,CAAAA,CAAS,SAAA,EACXrK,CAAAA,CAAM,KAAK,CAAA,aAAA,EAAgBqK,CAAAA,CAAS,SAAS,CAAA,CAAA,CAAG,CAAA,CAG9CA,CAAAA,CAAS,QAAU,MAAA,EACrBrK,CAAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAYqK,CAAAA,CAAS,KAAK,GAAG,CAAA,CAGtCA,CAAAA,CAAS,SAAA,EACXrK,CAAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgBqK,CAAAA,CAAS,SAAS,CAAA,CAAA,CAAG,CAAA,CAG9CA,CAAAA,CAAS,WAAA,GAAgB,MAAA,EAC3BrK,CAAAA,CAAM,KAAK,CAAA,eAAA,EAAkBqK,CAAAA,CAAS,WAAW,CAAA,CAAA,CAAG,CAAA,CAGlDA,CAAAA,CAAS,iBAAmB,MAAA,EAC9BrK,CAAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqBqK,CAAAA,CAAS,cAAc,GAAG,CAAA,CAGxDA,CAAAA,CAAS,YAAA,GAAiB,MAAA,EAC5BrK,CAAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmBqK,CAAAA,CAAS,YAAY,CAAA,CAAA,CAAG,CAAA,CAGpDA,CAAAA,CAAS,aAAA,GAAkB,MAAA,EAC7BrK,EAAM,IAAA,CAAK,CAAA,iBAAA,EAAoBqK,CAAAA,CAAS,aAAa,CAAA,CAAA,CAAG,CAAA,CAGtDrK,EAAM,MAAA,GAAW,CAAA,CAAU,EAAA,CAExB,CAAA,UAAA,EAAaA,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CACrC,CASO,SAASsK,CAAAA,CACdlK,CAAAA,CACAiB,CAAAA,CACQ,CACR,IAAMhB,CAAAA,CAAkB,EAAC,CAEzB,GAAID,CAAAA,CAAY,CAEVA,CAAAA,CAAW,OAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAsBT,CAAAA,CAAUQ,EAAW,OAAO,CAAC,CAAA,GAAA,CAAK,CAAA,CAIrE,IAAMmK,CAAAA,CAAcH,GAAiChK,CAAAA,CAAW,QAAQ,CAAA,CACpEmK,CAAAA,EACFlK,CAAAA,CAAM,IAAA,CAAKkK,CAAW,CAAA,CAIpBnK,CAAAA,CAAW,IAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,iBAAiB,CAAA,CAI9B,IAAMmK,CAAAA,CAAWb,CAAAA,CAAqBvJ,CAAAA,CAAW,KAAA,CAAO,MAAM,CAAA,CAC1DoK,GACFnK,CAAAA,CAAM,IAAA,CAAKmK,CAAQ,CAAA,CAIjBpK,CAAAA,CAAW,aAAA,EACbC,EAAM,IAAA,CAAK,CAAA,aAAA,EAAgBD,CAAAA,CAAW,aAAa,CAAA,GAAA,CAAK,CAAA,CAI1D,IAAMqK,CAAAA,CAAiBd,CAAAA,CAAqBvJ,CAAAA,CAAW,WAAA,CAAa,gBAAgB,CAAA,CAChFqK,CAAAA,EACFpK,EAAM,IAAA,CAAKoK,CAAc,CAAA,CAI3B,IAAMC,CAAAA,CAAYf,CAAAA,CAAqBvJ,EAAW,MAAA,CAAQ,QAAQ,CAAA,CAC9DsK,CAAAA,EACFrK,CAAAA,CAAM,IAAA,CAAKqK,CAAS,CAAA,CAItB,IAAM3D,CAAAA,CAAa8C,CAAAA,CAAsBzJ,CAAAA,CAAW,OAAA,CAAS,YAAY,CAAA,CACrE2G,CAAAA,EACF1G,CAAAA,CAAM,IAAA,CAAK0G,CAAU,CAAA,CAIvB,IAAM4D,EAAaX,CAAAA,CAAqB5J,CAAAA,CAAW,WAAA,CAAa,YAAY,CAAA,CACxEuK,CAAAA,EACFtK,EAAM,IAAA,CAAKsK,CAAU,CAAA,CAInBvK,CAAAA,CAAW,MAAA,EACbC,CAAAA,CAAM,KAAK,CAAA,qBAAA,EAAwBD,CAAAA,CAAW,MAAM,CAAA,GAAA,CAAK,CAAA,CAI3D,IAAMK,CAAAA,CAAaR,CAAAA,CAAiBG,CAAAA,CAAW,OAAO,CAAA,CAClDK,CAAAA,EACFJ,CAAAA,CAAM,IAAA,CAAKI,CAAU,CAAA,CAIvB,IAAMmK,CAAAA,CAAUV,EAAAA,CAAmB9J,CAAAA,CAAW,IAAI,EAC9CwK,CAAAA,EACFvK,CAAAA,CAAM,IAAA,CAAKuK,CAAO,CAAA,CAIhBxK,CAAAA,CAAW,SACbC,CAAAA,CAAM,IAAA,CAAK,CAAA,qBAAA,EAAwBD,CAAAA,CAAW,OAAO,CAAA,GAAA,CAAK,EAE9D,CAMA,OAJIiB,CAAAA,EAAmBA,CAAAA,CAAgB,MAAA,CAAS,CAAA,EAC9ChB,CAAAA,CAAM,KAAK,GAAGgB,CAAAA,CAAgB,GAAA,CAAKR,CAAAA,EAAWgK,EAAAA,CAA6BhK,CAAM,CAAC,CAAC,CAAA,CAGjFR,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAU,EAAA,CAExB,YAAYA,CAAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA,UAAA,CACnC,CAEA,SAASyK,EAAAA,CAAkBC,CAAAA,CAA0B,CACnD,OAAI,CAACA,CAAAA,CAAS,UAAA,CAAW,WAAW,CAAA,EAAK,CAACA,CAAAA,CAAS,QAAA,CAAS,YAAY,CAAA,CAC/D,GAEFA,CAAAA,CAAS,KAAA,CAAM,CAAA,CAAoB,GAAoB,CAChE,CAEA,SAASF,EAAAA,CAA6BhK,CAAAA,CAAqC,CACzE,IAAMb,CAAAA,CAAQwJ,CAAAA,CAAiC3I,CAAAA,CAAO,IAAA,CAAMA,CAAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CACtEmK,CAAAA,CAAmBV,CAAAA,CAAyBzJ,EAAO,kBAAkB,CAAA,EAAK,YAAA,CAC1EoK,CAAAA,CAAqBH,EAAAA,CAAkBE,CAAgB,EACvDE,CAAAA,CACJD,CAAAA,CAAmB,MAAA,CAAS,CAAA,CAAI,CAAA,SAAA,EAAYA,CAAkB,aAAe,YAAA,CAE/E,OAAO,CAAA,eAAA,EAAkBjL,CAAK,CAAA,CAAA,EAAIkL,CAAuB,CAAA,gBAAA,CAC3D,CASO,SAASC,CAAAA,CACd/K,CAAAA,CACAiB,CAAAA,CACA+J,CAAAA,CACQ,CACR,IAAM/K,CAAAA,CAAkB,EAAC,CAEzB,GAAID,CAAAA,CAAY,CAYd,GAVIA,CAAAA,CAAW,SAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,gBAAgB,CAAA,CAIzBD,EAAW,MAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,gBAAgB,CAAA,CAIzBD,CAAAA,CAAW,MAAA,CAAQ,CACrB,IAAMJ,CAAAA,CAAkB,CAAC,CAAA,OAAA,EAAUI,CAAAA,CAAW,MAAA,CAAO,KAAK,CAAA,CAAA,CAAG,CAAA,CAEzDA,CAAAA,CAAW,UAAA,EACbJ,CAAAA,CAAM,IAAA,CAAK,YAAYI,CAAAA,CAAW,UAAU,CAAA,CAAA,CAAG,CAAA,CAGjDC,CAAAA,CAAM,IAAA,CAAK,eAAeL,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CAAI,EAC/C,CAGII,CAAAA,CAAW,aAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgBD,CAAAA,CAAW,aAAa,KAAK,CAAA,CAItDA,CAAAA,CAAW,MAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,aAAa,EAE5B,CAcA,OAZI+K,CAAAA,GACEA,CAAAA,CAAiB,IAAA,GAAS,mBAAA,CAC5B/K,EAAM,IAAA,CAAK,CAAA,OAAA,EAAUmJ,CAAAA,CAAiC4B,CAAAA,CAAiB,IAAI,CAAC,CAAA,EAAA,CAAI,CAAA,CACvEA,CAAAA,CAAiB,IAAA,GAAS,kBAAA,EACnC/K,CAAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAUmJ,EAAiC4B,CAAAA,CAAiB,IAAI,CAAC,CAAA,EAAA,CAAI,CAAA,CAAA,CAIhF/J,CAAAA,EAAmBA,EAAgB,MAAA,CAAS,CAAA,EAC9ChB,CAAAA,CAAM,IAAA,CAAK,GAAGgB,CAAAA,CAAgB,IAAKR,CAAAA,EAAWwK,EAAAA,CAAgCxK,CAAM,CAAC,CAAC,CAAA,CAGpFR,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAU,EAAA,CAExB,CAAA,QAAA,EAAWA,CAAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA,SAAA,CAClC,CAEA,SAASiL,EAAAA,CAAiBC,CAAAA,CAAyB,CACjD,OAAI,CAACA,CAAAA,CAAQ,UAAA,CAAW,UAAU,CAAA,EAAK,CAACA,EAAQ,QAAA,CAAS,WAAW,CAAA,CAC3D,EAAA,CAEFA,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAmB,EAAmB,CAC7D,CAEA,SAASF,EAAAA,CAAgCxK,CAAAA,CAAwC,CAC/E,IAAMb,CAAAA,CAAQwJ,CAAAA,CAAiC3I,CAAAA,CAAO,IAAA,CAAMA,CAAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CACtE2K,CAAAA,CAAkBL,CAAAA,CAA4BtK,CAAAA,CAAO,kBAAkB,CAAA,EAAK,YAC5E4K,CAAAA,CAAoBH,EAAAA,CAAiBE,CAAe,CAAA,CACpDE,CAAAA,CACJD,CAAAA,CAAkB,MAAA,CAAS,CAAA,CAAI,CAAA,QAAA,EAAWA,CAAiB,CAAA,SAAA,CAAA,CAAc,WAAA,CAE3E,OAAO,CAAA,cAAA,EAAiBzL,CAAK,CAAA,CAAA,EAAI0L,CAAsB,CAAA,eAAA,CACzD,CASA,SAASC,EAAAA,CAAgCC,EAAmD,CAC1F,GAAI,CAACA,CAAAA,CAAO,OAAO,EAAA,CAkBnB,IAAMC,CAAAA,CAfO,CACXD,CAAAA,CAAM,QAAA,CAAW,GAAA,CAAM,GAAA,CACvBA,CAAAA,CAAM,OAAA,CAAU,GAAA,CAAM,GAAA,CACtBA,CAAAA,CAAM,WAAA,CAAc,GAAA,CAAM,GAAA,CAC1BA,EAAM,UAAA,CAAa,GAAA,CAAM,GAAA,CACzBA,CAAAA,CAAM,QAAA,CAAW,GAAA,CAAM,IACvBA,CAAAA,CAAM,SAAA,CAAY,GAAA,CAAM,GAAA,CACxBA,CAAAA,CAAM,QAAA,CAAW,IAAM,GAAA,CACvBA,CAAAA,CAAM,SAAA,CAAY,GAAA,CAAM,GAAA,CACxBA,CAAAA,CAAM,MAAA,CAAS,GAAA,CAAM,GAAA,CACrBA,CAAAA,CAAM,MAAA,CAAS,GAAA,CAAM,GAAA,CACrBA,CAAAA,CAAM,OAAS,GAAA,CAAM,GAAA,CACrBA,CAAAA,CAAM,MAAA,CAAS,GAAA,CAAM,GACvB,EAEiB,IAAA,CAAK,EAAE,CAAA,CAGxB,OAAIC,CAAAA,GAAQ,cAAA,CAAuB,GAE5B,CAAA,mBAAA,EAAsBA,CAAG,CAAA,GAAA,CAClC,CASO,SAASC,CAAAA,CACd1L,CAAAA,CACAiB,CAAAA,CACA+J,CAAAA,CACQ,CACR,IAAM/K,CAAAA,CAAkB,EAAC,CAEzB,GAAID,CAAAA,CAAY,CAEd,IAAM2L,CAAAA,CAAcJ,EAAAA,CAAgCvL,CAAAA,CAAW,iBAAiB,CAAA,CAC5E2L,CAAAA,EACF1L,CAAAA,CAAM,IAAA,CAAK0L,CAAW,CAAA,CAIxB,IAAMvB,CAAAA,CAAWb,CAAAA,CAAqBvJ,CAAAA,CAAW,KAAA,CAAO,KAAK,CAAA,CACzDoK,CAAAA,EACFnK,CAAAA,CAAM,IAAA,CAAKmK,CAAQ,CAAA,CAIjBpK,CAAAA,CAAW,QAAA,EAAYA,CAAAA,CAAW,SAAW,CAAA,EAC/CC,CAAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAsBD,CAAAA,CAAW,QAAQ,KAAK,CAAA,CAIvDA,CAAAA,CAAW,MAAA,GACTA,CAAAA,CAAW,MAAA,GAAW,SAAA,CACxBC,EAAM,IAAA,CAAK,6BAA6B,CAAA,CAGxCA,CAAAA,CAAM,IAAA,CAAK,aAAa,GAK5B,IAAM0G,CAAAA,CAAa8C,CAAAA,CAAsBzJ,CAAAA,CAAW,OAAA,CAAS,WAAW,EACpE2G,CAAAA,EACF1G,CAAAA,CAAM,IAAA,CAAK0G,CAAU,CAAA,CAIvB,IAAMtG,EAAaR,CAAAA,CAAiBG,CAAAA,CAAW,OAAO,CAAA,CAClDK,CAAAA,EACFJ,CAAAA,CAAM,KAAKI,CAAU,CAAA,CAInBL,CAAAA,CAAW,MAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,aAAa,CAAA,CAI1B,IAAMsK,CAAAA,CAAaX,CAAAA,CAAqB5J,CAAAA,CAAW,OAAA,CAAS,OAAO,EAC/DuK,CAAAA,EACFtK,CAAAA,CAAM,IAAA,CAAKsK,CAAU,CAAA,CAInBvK,CAAAA,CAAW,eACbC,CAAAA,CAAM,IAAA,CAAK,CAAA,wBAAA,EAA2BD,CAAAA,CAAW,aAAa,CAAA,GAAA,CAAK,EAIjEA,CAAAA,CAAW,OAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,gBAAgB,CAAA,CAIzBD,CAAAA,CAAW,aAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoBD,CAAAA,CAAW,aAAa,CAAA,GAAA,CAAK,EAI1DA,CAAAA,CAAW,QAAA,EACbC,CAAAA,CAAM,IAAA,CAAK,eAAe,EAE9B,CAgBA,OAdI+K,CAAAA,GACEA,CAAAA,CAAiB,IAAA,GAAS,oBAAA,CAC5B/K,CAAAA,CAAM,KAAK,CAAA,WAAA,EAAcmJ,CAAAA,CAAiC4B,CAAAA,CAAiB,IAAI,CAAC,CAAA,EAAA,CAAI,CAAA,CAC3EA,CAAAA,CAAiB,IAAA,GAAS,mBAAA,CACnC/K,CAAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAcmJ,CAAAA,CAAiC4B,EAAiB,IAAI,CAAC,CAAA,EAAA,CAAI,CAAA,CAC3EA,CAAAA,CAAiB,IAAA,GAAS,kBACnC/K,CAAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgBmJ,CAAAA,CAAiC4B,CAAAA,CAAiB,IAAI,CAAC,CAAA,EAAA,CAAI,CAAA,CAAA,CAItF/J,CAAAA,EAAmBA,CAAAA,CAAgB,MAAA,CAAS,CAAA,EAC9ChB,CAAAA,CAAM,IAAA,CAAK,GAAGgB,CAAAA,CAAgB,GAAA,CAAKR,CAAAA,EAAWmL,EAAAA,CAAiCnL,CAAM,CAAC,CAAC,CAAA,CAGrFR,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAU,EAAA,CAExB,WAAWA,CAAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA,SAAA,CAClC,CAEA,SAAS4L,EAAAA,CAAiBC,CAAAA,CAAyB,CACjD,OAAI,CAACA,CAAAA,CAAQ,UAAA,CAAW,UAAU,CAAA,EAAK,CAACA,CAAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,CAC3D,GAEFA,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAmB,EAAmB,CAC7D,CAEA,SAASF,EAAAA,CAAiCnL,CAAAA,CAAyC,CACjF,IAAMb,CAAAA,CAAQwJ,CAAAA,CAAiC3I,EAAO,IAAA,CAAMA,CAAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CACtEsL,CAAAA,CAAkBL,CAAAA,CAA6BjL,CAAAA,CAAO,kBAAkB,CAAA,EAAK,WAAA,CAC7EuL,CAAAA,CAAoBH,EAAAA,CAAiBE,CAAe,EACpDE,CAAAA,CACJD,CAAAA,CAAkB,MAAA,CAAS,CAAA,CAAI,CAAA,QAAA,EAAWA,CAAiB,YAAc,WAAA,CAE3E,OAAO,CAAA,cAAA,EAAiBpM,CAAK,CAAA,CAAA,EAAIqM,CAAsB,iBACzD,CASA,SAASC,EAAAA,CAAmBC,CAAAA,CAA4C,CACtE,OAAI,CAACA,CAAAA,EAAgBA,CAAAA,CAAa,MAAA,GAAW,CAAA,CAAU,EAAA,CAIhD,CAAA,WAAA,EAFMA,CAAAA,CAAa,IAAKC,CAAAA,EAAM,CAAA,gBAAA,EAAmBA,CAAC,CAAA,GAAA,CAAK,CAAA,CAEpC,IAAA,CAAK,EAAE,CAAC,CAAA,YAAA,CACpC,CASA,SAASC,EAAAA,CAAqB9K,CAAAA,CAAwC,CACpE,IAAMtB,CAAAA,CAAkB,EAAC,CAEzB,IAAA,IAAWiI,CAAAA,IAAQ3G,CAAAA,CACb2G,CAAAA,CAAK,IAAA,GAAS,WAAA,CAChBjI,CAAAA,CAAM,IAAA,CAAKuE,CAAAA,CAAmB0D,CAAI,CAAC,CAAA,CAC1BA,CAAAA,CAAK,IAAA,GAAS,OAAA,EACvBjI,CAAAA,CAAM,IAAA,CAAKqM,EAAepE,CAAI,CAAC,CAAA,CAKnC,OAAIjI,CAAAA,CAAM,MAAA,GAAW,GACnBA,CAAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,CAGdA,CAAAA,CAAM,IAAA,CAAK,EAAE,CACtB,CASO,SAASsM,EAAAA,CAAmBC,CAAAA,CAAyB,CAC1D,IAAMvM,EAAkB,EAAC,CAGnB6L,CAAAA,CAAUJ,CAAAA,CACdc,CAAAA,CAAK,UAAA,CACLA,EAAK,eAAA,CACLA,CAAAA,CAAK,gBACP,CAAA,CACA,OAAIV,CAAAA,EACF7L,EAAM,IAAA,CAAK6L,CAAO,CAAA,CAIpB7L,CAAAA,CAAM,IAAA,CAAKoM,EAAAA,CAAqBG,CAAAA,CAAK,OAAO,CAAC,CAAA,CAEtC,CAAA,MAAA,EAASvM,CAAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA,OAAA,CAChC,CASO,SAASwM,EAAAA,CAAkBC,CAAAA,CAAuB,CACvD,IAAMzM,CAAAA,CAAkB,EAAC,CAGnBkL,CAAAA,CAAUJ,CAAAA,CACd2B,CAAAA,CAAI,WACJA,CAAAA,CAAI,eAAA,CACJA,CAAAA,CAAI,gBACN,CAAA,CACIvB,CAAAA,EACFlL,CAAAA,CAAM,IAAA,CAAKkL,CAAO,CAAA,CAIpB,IAAA,IAAWqB,CAAAA,IAAQE,CAAAA,CAAI,KAAA,CACrBzM,EAAM,IAAA,CAAKsM,EAAAA,CAAmBC,CAAI,CAAC,CAAA,CAGrC,OAAO,SAASvM,CAAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA,OAAA,CAChC,CAYO,SAASqM,CAAAA,CAAeK,CAAAA,CAAsB,CACnD,IAAM1M,CAAAA,CAAkB,EAAC,CAGnB0K,CAAAA,CAAWT,CAAAA,CAAyByC,CAAAA,CAAM,UAAA,CAAYA,CAAAA,CAAM,eAAe,CAAA,CAC7EhC,GACF1K,CAAAA,CAAM,IAAA,CAAK0K,CAAQ,CAAA,CAIrB,IAAMiC,CAAAA,CAAaV,GAAmBS,CAAAA,CAAM,YAAY,CAAA,CACpDC,CAAAA,EACF3M,CAAAA,CAAM,IAAA,CAAK2M,CAAU,CAAA,CAIvB,IAAA,IAAWF,CAAAA,IAAOC,CAAAA,CAAM,IAAA,CACtB1M,CAAAA,CAAM,IAAA,CAAKwM,EAAAA,CAAkBC,CAAG,CAAC,CAAA,CAGnC,OAAO,CAAA,OAAA,EAAUzM,CAAAA,CAAM,KAAK,EAAE,CAAC,CAAA,QAAA,CACjC,CC5yBA,IAAM4M,CAAAA,CAAa,CACjB,GAAA,CAAK,oEAAA,CAUL,EAAA,CAAI,8DAGJ,CAAA,CAAG,yCAAA,CAEH,CAAA,CAAG,qEAAA,CACH,CAAA,CAAG,4DAAA,CACH,CAAA,CAAG,gCACH,IAAA,CAAM,qEAAA,CACN,EAAA,CAAI,wEAAA,CACJ,GAAA,CAAK,uCAAA,CACL,CAAA,CAAG,8DAAA,CACH,GAAA,CAAK,sDAAA,CACL,GAAA,CAAK,sDAAA,CAML,GAAA,CAAK,mEAAA,CAGL,IAAK,mEACP,CAAA,CAKA,SAASC,EAAAA,EAAqC,CAE5C,IAAMC,CAAAA,CAAoB,CACxB,GAAA,CAAKF,CAAAA,CAAW,GAAA,CAChB,EAAA,CAAIA,CAAAA,CAAW,EAAA,CACf,EAAGA,CAAAA,CAAW,CAAA,CACd,CAAA,CAAGA,CAAAA,CAAW,CAAA,CACd,CAAA,CAAGA,EAAW,CAAA,CACd,CAAA,CAAGA,CAAAA,CAAW,CAAA,CACd,IAAA,CAAMA,CAAAA,CAAW,KACjB,EAAA,CAAIA,CAAAA,CAAW,EAAA,CACf,GAAA,CAAKA,CAAAA,CAAW,GAAA,CAChB,CAAA,CAAGA,CAAAA,CAAW,CAAA,CACd,GAAA,CAAKA,CAAAA,CAAW,GAAA,CAChB,GAAA,CAAKA,CAAAA,CAAW,IAChB,GAAA,CAAKA,CAAAA,CAAW,GAAA,CAChB,GAAA,CAAKA,CAAAA,CAAW,GAClB,EAEA,OAAO,MAAA,CAAO,OAAA,CAAQE,CAAiB,CAAA,CACpC,GAAA,CAAI,CAAC,CAACC,CAAAA,CAAQC,CAAG,CAAA,GAAM,CAAA,MAAA,EAASD,CAAM,CAAA,EAAA,EAAKC,CAAG,CAAA,CAAA,CAAG,CAAA,CACjD,IAAA,CAAK,GAAG,CACb,CAaA,SAAS7H,CAAAA,CAAgBC,CAAAA,CAAgCC,CAAAA,CAA6B,CACpF,GAAI,CAACD,GAAUA,CAAAA,CAAO,KAAA,GAAU,MAAA,EAAUA,CAAAA,CAAO,KAAA,GAAU,KAAA,CACzD,OAAO,EAAA,CAGT,IAAMzF,CAAAA,CAAkB,CAAC,CAAA,OAAA,EAAUyF,CAAAA,CAAO,KAAK,CAAA,CAAA,CAAG,CAAA,CAElD,OAAIA,CAAAA,CAAO,IAAA,GAAS,MAAA,EAClBzF,CAAAA,CAAM,KAAK,CAAA,MAAA,EAASyF,CAAAA,CAAO,IAAI,CAAA,CAAA,CAAG,CAAA,CAGhCA,CAAAA,CAAO,QAAU,MAAA,EACnBzF,CAAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAYyF,CAAAA,CAAO,KAAK,GAAG,CAAA,CAGpCA,CAAAA,CAAO,KAAA,GACLA,CAAAA,CAAO,KAAA,CAAM,IAAA,CACfzF,CAAAA,CAAM,IAAA,CAAK,gBAAgB,CAAA,CAClByF,CAAAA,CAAO,KAAA,CAAM,GAAA,EACtBzF,CAAAA,CAAM,KAAK,CAAA,SAAA,EAAYyF,CAAAA,CAAO,KAAA,CAAM,GAAG,CAAA,CAAA,CAAG,CAAA,CAGxCA,EAAO,KAAA,CAAM,UAAA,EACfzF,CAAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiByF,CAAAA,CAAO,MAAM,UAAU,CAAA,CAAA,CAAG,CAAA,CAGpDA,CAAAA,CAAO,KAAA,CAAM,SAAA,EACfzF,CAAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgByF,CAAAA,CAAO,KAAA,CAAM,SAAS,CAAA,CAAA,CAAG,CAAA,CAGlDA,EAAO,KAAA,CAAM,UAAA,EACfzF,CAAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiByF,CAAAA,CAAO,MAAM,UAAU,CAAA,CAAA,CAAG,CAAA,CAAA,CAItDA,CAAAA,CAAO,MAAA,EACTzF,CAAAA,CAAM,KAAK,iBAAiB,CAAA,CAG1ByF,CAAAA,CAAO,KAAA,EACTzF,CAAAA,CAAM,IAAA,CAAK,gBAAgB,CAAA,CAGtB,CAAA,GAAA,EAAM0F,CAAW,CAAA,CAAA,EAAI1F,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CAC7C,CASA,SAASsN,EAAAA,CAAyBC,CAAAA,CAA8B,CAG9D,OAAO,CAAA,mBAAA,EAFiB,CAAC,CAAA,QAAA,EAAWA,CAAAA,CAAI,IAAI,CAAA,CAAA,CAAA,CAAK,SAASA,CAAAA,CAAI,GAAG,CAAA,CAAA,CAAG,CAAA,CAEjC,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CAC9C,CAKA,SAASC,EAAAA,CAAyBD,CAAAA,CAA8B,CAG9D,OAAO,sBAFiB,CAAC,CAAA,QAAA,EAAWA,CAAAA,CAAI,IAAI,CAAA,CAAA,CAAA,CAAK,CAAA,MAAA,EAASA,EAAI,GAAG,CAAA,CAAA,CAAG,CAAA,CAEjC,IAAA,CAAK,GAAG,CAAC,IAC9C,CAKA,SAASE,EAAAA,CAA4B9E,CAAAA,CAA+C,CAClF,GAAI,CAACA,CAAAA,CAAO,OAAO,EAAA,CAEnB,IAAMtI,CAAAA,CAAkB,EAAC,CAkBzB,OAhBIsI,CAAAA,CAAM,QAAA,EACRtI,CAAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiBsI,CAAAA,CAAM,QAAQ,CAAA,GAAA,CAAK,CAAA,CAG7CA,CAAAA,CAAM,MAAA,EACRtI,CAAAA,CAAM,IAAA,CAAK,oBAAoBsI,CAAAA,CAAM,MAAM,CAAA,GAAA,CAAK,CAAA,CAG9CA,CAAAA,CAAM,QAAA,GAAa,MAAA,EACrBtI,CAAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAsBsI,CAAAA,CAAM,QAAQ,CAAA,GAAA,CAAK,CAAA,CAGlDA,EAAM,UAAA,EACRtI,CAAAA,CAAM,IAAA,CAAK,CAAA,qBAAA,EAAwBsI,CAAAA,CAAM,UAAU,KAAK,CAAA,CAGtDtI,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAU,EAAA,CAExB,CAAA,cAAA,EAAiBA,EAAM,IAAA,CAAK,EAAE,CAAC,CAAA,eAAA,CACxC,CAKA,SAASqN,EAAAA,CAA2B/E,CAAAA,CAA8C,CAChF,GAAI,CAACA,CAAAA,CAAO,OAAO,EAAA,CAEnB,IAAMtI,CAAAA,CAAkB,EAAC,CAkBzB,OAhBIsI,CAAAA,CAAM,QAAA,EACRtI,EAAM,IAAA,CAAK,CAAA,cAAA,EAAiBsI,CAAAA,CAAM,QAAQ,CAAA,GAAA,CAAK,CAAA,CAG7CA,EAAM,MAAA,EACRtI,CAAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoBsI,CAAAA,CAAM,MAAM,CAAA,GAAA,CAAK,CAAA,CAG9CA,CAAAA,CAAM,QAAA,GAAa,MAAA,EACrBtI,CAAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAsBsI,EAAM,QAAQ,CAAA,GAAA,CAAK,CAAA,CAGlDA,CAAAA,CAAM,UAAA,EACRtI,CAAAA,CAAM,KAAK,CAAA,qBAAA,EAAwBsI,CAAAA,CAAM,UAAU,CAAA,GAAA,CAAK,CAAA,CAGtDtI,CAAAA,CAAM,SAAW,CAAA,CAAU,EAAA,CAExB,CAAA,aAAA,EAAgBA,CAAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA,cAAA,CACvC,CAKA,SAASsN,EAAAA,CAAkBhF,CAAAA,CAAkC,CAC3D,IAAM3I,EAAkB,EAAC,CAczB,OAZI2I,CAAAA,CAAM,SAAA,GAAc,MAAA,EACtB3I,EAAM,IAAA,CAAK,CAAA,KAAA,EAAQ2I,CAAAA,CAAM,SAAS,CAAA,CAAA,CAAG,CAAA,CAGnCA,EAAM,UAAA,GAAe,MAAA,EACvB3I,CAAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ2I,CAAAA,CAAM,UAAU,CAAA,CAAA,CAAG,CAAA,CAGpCA,CAAAA,CAAM,WAAA,GAAgB,WAAA,EACxB3I,CAAAA,CAAM,IAAA,CAAK,sBAAsB,CAAA,CAG/BA,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAU,EAAA,CAExB,CAAA,QAAA,EAAWA,EAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CACnC,CAKA,SAAS4N,GAAqBjF,CAAAA,CAAkC,CAC9D,IAAM3I,CAAAA,CAAkB,EAAC,CA8BzB,OA5BI2I,CAAAA,CAAM,SAAA,GAAc,MAAA,EACtB3I,CAAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU2I,CAAAA,CAAM,SAAS,CAAA,CAAA,CAAG,CAAA,CAGrCA,CAAAA,CAAM,WAAA,GAAgB,MAAA,EACxB3I,CAAAA,CAAM,KAAK,CAAA,SAAA,EAAY2I,CAAAA,CAAM,WAAW,CAAA,CAAA,CAAG,CAAA,CAGzCA,CAAAA,CAAM,eAAiB,MAAA,EACzB3I,CAAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa2I,CAAAA,CAAM,YAAY,CAAA,CAAA,CAAG,CAAA,CAG3CA,CAAAA,CAAM,UAAA,GAAe,MAAA,EACvB3I,CAAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW2I,EAAM,UAAU,CAAA,CAAA,CAAG,CAAA,CAGvCA,CAAAA,CAAM,cAAA,GAAmB,MAAA,EAC3B3I,EAAM,IAAA,CAAK,CAAA,UAAA,EAAa2I,CAAAA,CAAM,cAAc,CAAA,CAAA,CAAG,CAAA,CAG7CA,EAAM,cAAA,GAAmB,MAAA,EAC3B3I,CAAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa2I,CAAAA,CAAM,cAAc,CAAA,CAAA,CAAG,CAAA,CAG7CA,CAAAA,CAAM,MAAA,GAAW,MAAA,EACnB3I,CAAAA,CAAM,IAAA,CAAK,aAAa2I,CAAAA,CAAM,MAAM,CAAA,CAAA,CAAG,CAAA,CAGrC3I,CAAAA,CAAM,MAAA,GAAW,EAAU,EAAA,CAExB,CAAA,SAAA,EAAYA,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAC,IACpC,CAKA,SAAS6N,EAAAA,CAAiBlF,CAAAA,CAAkC,CAC1D,GAAI,CAACA,CAAAA,CAAM,WAAA,EAAe,CAACA,CAAAA,CAAM,OAAA,EAAS,MAAA,CAAQ,OAAO,GAEzD,IAAM3I,CAAAA,CAAkB,EAAC,CAErB2I,CAAAA,CAAM,WAAA,GAAgB,QAAaA,CAAAA,CAAM,WAAA,CAAc,CAAA,EACzD3I,CAAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU2I,EAAM,WAAW,CAAA,CAAA,CAAG,CAAA,CAGvCA,CAAAA,CAAM,WAAA,GAAgB,MAAA,EACxB3I,CAAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY2I,CAAAA,CAAM,WAAW,CAAA,CAAA,CAAG,CAAA,CAGzCA,CAAAA,CAAM,aAAe,MAAA,EACvB3I,CAAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB2I,CAAAA,CAAM,UAAA,CAAa,IAAM,GAAG,CAAA,CAAA,CAAG,CAAA,CAGzDA,CAAAA,CAAM,SAAA,EACR3I,CAAAA,CAAM,KAAK,WAAW,CAAA,CAIxB,IAAI8N,CAAAA,CAAc,EAAA,CAgBlB,OAfInF,CAAAA,CAAM,OAAA,EAAWA,CAAAA,CAAM,OAAA,CAAQ,MAAA,CAAS,CAAA,GAC1CmF,CAAAA,CAAcnF,CAAAA,CAAM,QACjB,GAAA,CAAKoF,CAAAA,EAAQ,CACZ,IAAMC,CAAAA,CAAqB,GAC3B,OAAID,CAAAA,CAAI,KAAA,GAAU,MAAA,EAChBC,CAAAA,CAAS,IAAA,CAAK,QAAQD,CAAAA,CAAI,KAAK,CAAA,CAAA,CAAG,CAAA,CAEhCA,CAAAA,CAAI,KAAA,GAAU,MAAA,EAChBC,CAAAA,CAAS,IAAA,CAAK,CAAA,SAAA,EAAYD,CAAAA,CAAI,KAAK,CAAA,CAAA,CAAG,CAAA,CAEjC,UAAUC,CAAAA,CAAS,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CACrC,CAAC,EACA,IAAA,CAAK,EAAE,CAAA,CAAA,CAGRhO,CAAAA,CAAM,MAAA,GAAW,CAAA,EAAK,CAAC8N,CAAAA,CAAoB,EAAA,CAGxC,CAAA,OAAA,EADU9N,CAAAA,CAAM,MAAA,CAAS,CAAA,CAAI,GAAA,CAAMA,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAA,CAAI,EACnC,CAAA,CAAA,EAAI8N,CAAW,WAC1C,CAKA,SAASG,EAAAA,CAAqBtF,CAAAA,CAAkC,CAC9D,GAAI,CAACA,CAAAA,CAAM,WAAA,CAAa,OAAO,EAAA,CAE/B,IAAMuF,CAAAA,CAAKvF,EAAM,WAAA,CACX3I,CAAAA,CAAkB,EAAC,CAkBzB,OAhBIkO,CAAAA,CAAG,OAAA,GAAY,MAAA,EACjBlO,CAAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAckO,CAAAA,CAAG,OAAO,CAAA,CAAA,CAAG,EAGpCA,CAAAA,CAAG,KAAA,GAAU,MAAA,EACflO,CAAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAYkO,EAAG,KAAK,CAAA,CAAA,CAAG,CAAA,CAGhCA,CAAAA,CAAG,QAAA,GAAa,MAAA,EAClBlO,EAAM,IAAA,CAAK,CAAA,YAAA,EAAekO,CAAAA,CAAG,QAAQ,CAAA,CAAA,CAAG,CAAA,CAGtCA,CAAAA,CAAG,OAAA,EACLlO,CAAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAckO,CAAAA,CAAG,OAAO,CAAA,CAAA,CAAG,EAGpClO,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAU,EAAA,CAExB,CAAA,aAAA,EAAgBA,CAAAA,CAAM,KAAK,GAAG,CAAC,CAAA,EAAA,CACxC,CAKA,SAASmO,EAAAA,CAAqBxF,EAAkC,CAC9D,GAAI,CAACA,CAAAA,CAAM,WAAA,CAAa,OAAO,EAAA,CAE/B,IAAMyF,CAAAA,CAAKzF,CAAAA,CAAM,WAAA,CACX3I,CAAAA,CAAkB,EAAC,CACnBqO,EAA2B,EAAC,CAclC,GAZID,CAAAA,CAAG,OAAA,EACLpO,CAAAA,CAAM,KAAK,CAAA,WAAA,EAAcoO,CAAAA,CAAG,OAAO,CAAA,CAAA,CAAG,CAAA,CAGpCA,CAAAA,CAAG,YACLpO,CAAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiBoO,CAAAA,CAAG,UAAU,CAAA,CAAA,CAAG,CAAA,CAG1CA,CAAAA,CAAG,MAAA,EACLpO,CAAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAaoO,CAAAA,CAAG,MAAM,GAAG,CAAA,CAGlCA,CAAAA,CAAG,GAAA,CAAK,CACV,IAAMvI,CAAAA,CAASL,EAAgB4I,CAAAA,CAAG,GAAA,CAAK,KAAK,CAAA,CACxCvI,CAAAA,EAAQwI,CAAAA,CAAe,KAAKxI,CAAM,EACxC,CAEA,GAAIuI,CAAAA,CAAG,IAAA,CAAM,CACX,IAAMtI,CAAAA,CAAUN,CAAAA,CAAgB4I,CAAAA,CAAG,IAAA,CAAM,MAAM,CAAA,CAC3CtI,GAASuI,CAAAA,CAAe,IAAA,CAAKvI,CAAO,EAC1C,CAEA,GAAIsI,EAAG,MAAA,CAAQ,CACb,IAAMrI,CAAAA,CAAYP,CAAAA,CAAgB4I,CAAAA,CAAG,OAAQ,QAAQ,CAAA,CACjDrI,CAAAA,EAAWsI,CAAAA,CAAe,IAAA,CAAKtI,CAAS,EAC9C,CAEA,GAAIqI,CAAAA,CAAG,KAAA,CAAO,CACZ,IAAMpI,CAAAA,CAAWR,EAAgB4I,CAAAA,CAAG,KAAA,CAAO,OAAO,CAAA,CAC9CpI,CAAAA,EAAUqI,CAAAA,CAAe,KAAKrI,CAAQ,EAC5C,CAEA,OAAIqI,CAAAA,CAAe,MAAA,GAAW,EAAU,EAAA,CAGjC,CAAA,YAAA,EADUrO,CAAAA,CAAM,MAAA,CAAS,CAAA,CAAI,GAAA,CAAMA,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAA,CAAI,EAC9B,CAAA,CAAA,EAAIqO,CAAAA,CAAe,IAAA,CAAK,EAAE,CAAC,CAAA,cAAA,CAC3D,CAKA,SAASC,EAAAA,CAAiB3F,CAAAA,CAAkC,CAC1D,GAAI,CAACA,CAAAA,CAAM,OAAA,CAAS,OAAO,EAAA,CAE3B,IAAM4F,CAAAA,CAAK5F,CAAAA,CAAM,OAAA,CACX3I,CAAAA,CAAkB,EAAC,CAczB,OAZIuO,CAAAA,CAAG,IAAA,EACLvO,CAAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAWuO,CAAAA,CAAG,IAAI,GAAG,CAAA,CAG9BA,CAAAA,CAAG,SAAA,GAAc,MAAA,EACnBvO,CAAAA,CAAM,IAAA,CAAK,gBAAgBuO,CAAAA,CAAG,SAAS,CAAA,CAAA,CAAG,CAAA,CAGxCA,CAAAA,CAAG,SAAA,GAAc,QACnBvO,CAAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgBuO,CAAAA,CAAG,SAAS,CAAA,CAAA,CAAG,CAAA,CAGxCvO,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAU,EAAA,CAExB,CAAA,WAAA,EAAcA,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CACtC,CAKO,SAASwO,EAAAA,CAA2B7F,CAAAA,CAA8C,CACvF,GAAI,CAACA,CAAAA,CAAO,OAAO,EAAA,CAEnB,IAAMtI,EAAkB,EAAC,CAGzB,GAAIsI,CAAAA,CAAM,gBAAA,CACR,IAAA,IAAW4E,CAAAA,IAAO5E,CAAAA,CAAM,gBAAA,CACtBtI,CAAAA,CAAM,IAAA,CAAKiN,EAAAA,CAAyBC,CAAG,CAAC,EAK5C,GAAI5E,CAAAA,CAAM,gBAAA,CACR,IAAA,IAAW4E,CAAAA,IAAO5E,CAAAA,CAAM,iBACtBtI,CAAAA,CAAM,IAAA,CAAKmN,EAAAA,CAAyBD,CAAG,CAAC,CAAA,CAK5C,IAAMkB,CAAAA,CAAgBhB,EAAAA,CAA4B9E,CAAAA,CAAM,UAAU,CAAA,CAC9D8F,CAAAA,EACFpO,CAAAA,CAAM,IAAA,CAAKoO,CAAa,CAAA,CAI1B,IAAMC,CAAAA,CAAehB,EAAAA,CAA2B/E,CAAAA,CAAM,SAAS,CAAA,CAC3D+F,CAAAA,EACFrO,CAAAA,CAAM,IAAA,CAAKqO,CAAY,CAAA,CAIrB/F,EAAM,YAAA,EACRtI,CAAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkBsI,CAAAA,CAAM,YAAY,KAAK,CAAA,CAItD,IAAMgG,CAAAA,CAAUhB,EAAAA,CAAkBhF,CAAK,CAAA,CACnCgG,CAAAA,EACFtO,CAAAA,CAAM,IAAA,CAAKsO,CAAO,CAAA,CAIpB,IAAMC,CAAAA,CAAWhB,EAAAA,CAAqBjF,CAAK,CAAA,CAM3C,GALIiG,CAAAA,EACFvO,CAAAA,CAAM,IAAA,CAAKuO,CAAQ,EAIjBjG,CAAAA,CAAM,aAAA,GAAkB,MAAA,EAAaA,CAAAA,CAAM,aAAA,GAAkB,MAAA,CAAW,CAC1E,IAAM3I,CAAAA,CAAkB,EAAC,CACrB2I,CAAAA,CAAM,aAAA,GAAkB,MAAA,EAC1B3I,CAAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY2I,CAAAA,CAAM,aAAa,CAAA,CAAA,CAAG,CAAA,CAE3CA,EAAM,aAAA,GAAkB,MAAA,EAC1B3I,CAAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY2I,CAAAA,CAAM,aAAa,CAAA,CAAA,CAAG,CAAA,CAE/CtI,CAAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAeL,CAAAA,CAAM,KAAK,GAAG,CAAC,CAAA,EAAA,CAAI,EAC/C,CAGA,IAAM6O,CAAAA,CAAeV,EAAAA,CAAqBxF,CAAK,CAAA,CAC3CkG,CAAAA,EACFxO,CAAAA,CAAM,IAAA,CAAKwO,CAAY,EAIzB,IAAMC,CAAAA,CAAWb,EAAAA,CAAqBtF,CAAK,CAAA,CACvCmG,CAAAA,EACFzO,EAAM,IAAA,CAAKyO,CAAQ,CAAA,CAIrB,IAAMC,CAAAA,CAAUlB,EAAAA,CAAiBlF,CAAK,CAAA,CAClCoG,CAAAA,EACF1O,CAAAA,CAAM,IAAA,CAAK0O,CAAO,CAAA,CAIpB,IAAMC,CAAAA,CAAaV,EAAAA,CAAiB3F,CAAK,CAAA,CAyBzC,OAxBIqG,CAAAA,EACF3O,CAAAA,CAAM,KAAK2O,CAAU,CAAA,CAInBrG,CAAAA,CAAM,aAAA,EACRtI,CAAAA,CAAM,IAAA,CAAK,oBAAoBsI,CAAAA,CAAM,aAAa,CAAA,GAAA,CAAK,CAAA,CAIrDA,CAAAA,CAAM,IAAA,EACRtI,EAAM,IAAA,CAAK,WAAW,CAAA,CAIpBsI,CAAAA,CAAM,OAAA,EACRtI,CAAAA,CAAM,IAAA,CAAK,cAAc,CAAA,CAIvBsI,CAAAA,CAAM,iBAAA,EACRtI,CAAAA,CAAM,IAAA,CAAK,wBAAwB,EAGjCA,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAU,EAAA,CAExB,CAAA,UAAA,EAAaA,CAAAA,CAAM,KAAK,EAAE,CAAC,CAAA,WAAA,CACpC,CASA,SAAS4O,CAAAA,CAAsBC,EAA6B,CAC1D,GAAIA,CAAAA,CAAM,IAAA,GAAS,WAAA,CACjB,OAAOtK,CAAAA,CAAmBsK,CAAK,CAAA,CAC1B,GAAIA,CAAAA,CAAM,IAAA,GAAS,OAAA,CACxB,OAAOxC,EAAewC,CAAK,CAAA,CACtB,GAAIA,CAAAA,CAAM,IAAA,GAAS,UAAA,CAAY,CAEpC,IAAM3J,CAAAA,CAAa2J,CAAAA,CAAM,OAAA,CAAQ,GAAA,CAAKC,CAAAA,EAAMF,EAAsBE,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,CACvExG,CAAAA,CAAQuG,CAAAA,CAAM,UAAA,CACdtG,CAAAA,CAAoB,EAAC,CAC3B,OAAID,CAAAA,CAAM,OAAOC,CAAAA,CAAQ,IAAA,CAAK,CAAA,gBAAA,EAAmBD,CAAAA,CAAM,KAAK,CAAA,GAAA,CAAK,EAC7DA,CAAAA,CAAM,GAAA,EAAKC,CAAAA,CAAQ,IAAA,CAAK,CAAA,cAAA,EAAiBD,CAAAA,CAAM,GAAG,CAAA,GAAA,CAAK,CAAA,CACpD,CAAA,gBAAA,EAAmBC,CAAAA,CAAQ,IAAA,CAAK,EAAE,CAAC,CAAA,wBAAA,EAA2BrD,CAAU,CAAA,uBAAA,CACjF,CACA,OAAO,EACT,CAKA,SAAS6J,EAAAA,CAAqBzN,CAAAA,CAAiC,CAC7D,OAAOA,CAAAA,CAAQ,GAAA,CAAKuN,GAAUD,CAAAA,CAAsBC,CAAK,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CACrE,CAYO,SAASG,EAAAA,CAAsBC,CAAAA,CAA4B,CAChE,IAAMjP,CAAAA,CAAkB,EAAC,CAGzB,OAAAA,CAAAA,CAAM,IAAA,CAAK+O,EAAAA,CAAqBE,CAAAA,CAAK,OAAO,CAAC,CAAA,CAGzCA,CAAAA,CAAK,sBAAA,EACPjP,CAAAA,CAAM,IAAA,CAAKmO,GAA2Bc,CAAAA,CAAK,sBAAsB,CAAC,CAAA,CAG7DjP,CAAAA,CAAM,IAAA,CAAK,EAAE,CACtB,CAQO,SAASkP,CAAAA,CAAkBC,CAAAA,CAAuB,CACvD,IAAMnP,CAAAA,CAAkB,EAAC,CAGzBA,CAAAA,CAAM,IAAA,CAAK,yDAAyD,CAAA,CAGpE,IAAMoP,CAAAA,CAASvC,EAAAA,EAA2B,CAC1C,OAAA7M,CAAAA,CAAM,IAAA,CAAK,eAAeoP,CAAM,CAAA,6BAAA,CAA+B,CAAA,CAG/DpP,CAAAA,CAAM,IAAA,CAAK,UAAU,EACrBA,CAAAA,CAAM,IAAA,CAAKgP,EAAAA,CAAsBG,CAAAA,CAAI,OAAA,CAAQ,QAAQ,CAAC,CAAA,CACtDnP,CAAAA,CAAM,IAAA,CAAK,WAAW,CAAA,CAGtBA,CAAAA,CAAM,IAAA,CAAK,eAAe,CAAA,CAEnBA,CAAAA,CAAM,IAAA,CAAK,EAAE,CACtB,CCjmBA,IAAAqP,CAAAA,CAAkBC,mBAAA,CAAAC,mBAAA,EAAA,CAAA,CAAA,CAAA,CCdlB,IAAM3C,EAAAA,CAAqC,CACzC,GAAA,CAAK,qEACL,EAAA,CAAI,6DAAA,CACJ,CAAA,CAAG,yCAAA,CACH,CAAA,CAAG,qEAAA,CACH,CAAA,CAAG,4DAAA,CACH,CAAA,CAAG,+BAAA,CACH,IAAA,CAAM,qEAAA,CACN,EAAA,CAAI,wEAAA,CACJ,IAAK,uCAAA,CACL,CAAA,CAAG,8DAAA,CACH,GAAA,CAAK,sDAAA,CACL,GAAA,CAAK,uDACL,GAAA,CAAK,mEAAA,CACL,GAAA,CAAK,mEACP,CAAA,CAEA,SAASC,IAAqC,CAC5C,OAAO,MAAA,CAAO,OAAA,CAAQD,EAAU,CAAA,CAC7B,GAAA,CAAI,CAAC,CAACG,CAAAA,CAAQC,CAAG,CAAA,GAAM,CAAA,MAAA,EAASD,CAAM,KAAKC,CAAG,CAAA,CAAA,CAAG,CAAA,CACjD,IAAA,CAAK,GAAG,CACb,CAKA,SAASwC,EAAAA,CAAeX,CAAAA,CAAkC,CACxD,OAAIA,CAAAA,CAAM,OAAS,WAAA,CACVtK,CAAAA,CAAmBsK,CAAK,CAAA,CACtBA,CAAAA,CAAM,IAAA,GAAS,OAAA,CACjBxC,CAAAA,CAAewC,CAAK,CAAA,CAEtB,EACT,CAQO,SAASY,CAAAA,CAAsBC,EAA0B,CAC9D,IAAMC,CAAAA,CAAUD,CAAAA,CAAG,IAAA,GAAS,QAAA,CAAW,QAAU,OAAA,CAC3CN,CAAAA,CAASvC,EAAAA,EAA2B,CAGtC3H,CAAAA,CAAawK,CAAAA,CAAG,QAAQ,GAAA,CAAKb,CAAAA,EAAUW,EAAAA,CAAeX,CAAK,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,CAGzE,OAAK3J,CAAAA,GACHA,CAAAA,CAAa,qBAAA,CAAA,CAGR,CAAA;AAAA,CAAA,EAA6DyK,CAAO,CAAA,CAAA,EAAIP,CAAM,CAAA,CAAA,EAAIlK,CAAU,CAAA,EAAA,EAAKyK,CAAO,CAAA,CAAA,CACjH,CC9DA,SAAS5K,CAAAA,CAAoBE,CAAAA,CAAkB,CAC7C,IAAI2K,CAAAA,CAAM,OAAA,CAEJC,CAAAA,CAAgB,EAAC,CACnB5K,CAAAA,CAAI,UAAA,EAAY,IAAA,EAAM4K,CAAAA,CAAI,IAAA,CAAK,QAAQ,CAAA,CACvC5K,CAAAA,CAAI,UAAA,EAAY,QAAQ4K,CAAAA,CAAI,IAAA,CAAK,QAAQ,CAAA,CACzCA,CAAAA,CAAI,MAAA,CAAS,CAAA,GAAGD,CAAAA,EAAO,CAAA,OAAA,EAAUC,CAAAA,CAAI,IAAA,CAAK,EAAE,CAAC,CAAA,QAAA,CAAA,CAAA,CAEjD,IAAA,IAAW/H,CAAAA,IAAK7C,CAAAA,CAAI,OAAA,CAClB,GAAI6C,CAAAA,CAAE,IAAA,GAAS,MAAA,CAAQ,CACrB,IAAMgI,CAAAA,CAAgBhI,CAAAA,CAAE,IAAA,GAASA,CAAAA,CAAE,IAAA,CAAK,IAAA,EAAK,EAAKA,CAAAA,CAAE,KAAK,QAAA,CAAS,IAAI,CAAA,CACtE8H,CAAAA,EAAOE,CAAAA,CACH,CAAA,0BAAA,EAA6BvQ,CAAAA,CAAUuI,CAAAA,CAAE,IAAI,CAAC,CAAA,MAAA,CAAA,CAC9C,CAAA,KAAA,EAAQvI,CAAAA,CAAUuI,CAAAA,CAAE,IAAI,CAAC,CAAA,MAAA,EAC/B,CAAA,KAAWA,CAAAA,CAAE,IAAA,GAAS,OAAA,GACpB8H,CAAAA,EAAO,SAAA,CAAA,CAGX,OAAAA,CAAAA,EAAO,QAAA,CACAA,CACT,CAEA,SAASrL,EAAAA,CAAmBD,CAAAA,CAAsB,CAChD,IAAIsL,CAAAA,CAAM,OAAA,CACV,IAAA,IAAW3H,CAAAA,IAAQ3D,CAAAA,CAAE,OAAA,CACf2D,CAAAA,CAAK,IAAA,GAAS,KAAA,GAChB2H,CAAAA,EAAO7K,CAAAA,CAAoBkD,CAAI,CAAA,CAAA,CAGnC,OAAA2H,CAAAA,EAAO,QAAA,CACAA,CACT,CAGA,SAASG,EAAAA,CAAoCzL,CAAAA,CAAsB,CACjE,IAAIsL,CAAAA,CAAM,OAAA,CACVA,CAAAA,EAAO,kFAAA,CACP,IAAA,IAAW3H,CAAAA,IAAQ3D,CAAAA,CAAE,OAAA,CACf2D,CAAAA,CAAK,OAAS,KAAA,GAChB2H,CAAAA,EAAO7K,CAAAA,CAAoBkD,CAAI,CAAA,CAAA,CAGnC,OAAA2H,CAAAA,EAAO,QAAA,CACAA,CACT,CAEA,SAASI,CAAAA,CAAiBC,CAAAA,CAA0B,CAClD,IAAMtQ,CAAAA,CAAkB,CAAC,CAAA,MAAA,EAASsQ,CAAAA,CAAQ,EAAE,CAAA,CAAA,CAAG,CAAA,CAC3CA,CAAAA,CAAQ,MAAA,EAAQtQ,CAAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAaJ,CAAAA,CAAU0Q,CAAAA,CAAQ,MAAM,CAAC,CAAA,CAAA,CAAG,EACpEA,CAAAA,CAAQ,QAAA,EAAUtQ,CAAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAeJ,CAAAA,CAAU0Q,CAAAA,CAAQ,QAAQ,CAAC,CAAA,CAAA,CAAG,CAAA,CAC1EA,CAAAA,CAAQ,IAAA,EAAMtQ,CAAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAWJ,CAAAA,CAAU0Q,CAAAA,CAAQ,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAElE,IAAIL,CAAAA,CAAM,CAAA,WAAA,EAAcjQ,CAAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA,CACvC,GAAIsQ,CAAAA,CAAQ,SAAWA,CAAAA,CAAQ,OAAA,CAAQ,MAAA,CAAS,CAAA,CAAG,CAEjDL,CAAAA,EAAOG,EAAAA,CAAoCE,CAAAA,CAAQ,OAAA,CAAQ,CAAC,CAAC,CAAA,CAC7D,IAAA,IAASxH,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIwH,CAAAA,CAAQ,OAAA,CAAQ,MAAA,CAAQxH,CAAAA,EAAAA,CAC1CmH,CAAAA,EAAOrL,EAAAA,CAAmB0L,CAAAA,CAAQ,OAAA,CAAQxH,CAAC,CAAC,EAEhD,CAAA,KAEEmH,CAAAA,EACE,6FAAA,CAEJ,OAAAA,CAAAA,EAAO,eACAA,CACT,CAKO,SAASM,EAAAA,CAAkBC,CAAAA,CAA6B,CAC7D,GAAI,CAACA,CAAAA,EAAYA,CAAAA,CAAS,MAAA,GAAW,CAAA,CAAG,OAAO,EAAA,CAG/C,IAAMC,CAAAA,CAAsB,EAAC,CACvBC,CAAAA,CAAqB,EAAC,CAC5B,IAAA,IAAWvI,CAAAA,IAAKqI,CAAAA,CAAAA,CACbrI,CAAAA,CAAE,QAAA,EAAY,IAAA,CAAOsI,CAAAA,CAAWC,CAAAA,EAAS,IAAA,CAAKvI,CAAC,CAAA,CAGlD,IAAI8H,CAAAA,CACF,CAAA;AAAA,49BAAA,CAAA,CAkBF,IAAA,IAAWK,CAAAA,IAAWG,CAAAA,CACpBR,CAAAA,EAAOI,EAAiBC,CAAO,CAAA,CAEjC,IAAA,IAAWK,CAAAA,IAASD,CAAAA,CAClBT,CAAAA,EAAOI,CAAAA,CAAiBM,CAAK,EAG/B,OAAAV,CAAAA,EAAO,eAAA,CACAA,CACT,CF1EA,SAASW,CAAAA,CAAWC,CAAAA,CAAyB,CAC3C,IAAIC,CAAAA,CAAQ,CAAA,CACZ,IAAA,IAAWC,KAASF,CAAAA,CAAQ,QAAA,CAAS,gBAAgB,CAAA,CAAG,CACtD,IAAMlN,CAAAA,CAAK,QAAA,CAASoN,CAAAA,CAAM,CAAC,CAAA,CAAG,EAAE,CAAA,CAC5BpN,EAAKmN,CAAAA,GAAOA,CAAAA,CAAQnN,CAAAA,EAC1B,CACA,OAAOmN,CACT,CAMA,eAAeE,EAAAA,CACbxB,EACAyB,CAAAA,CACAC,CAAAA,CACe,CACf,IAAMV,CAAAA,CAAWhB,CAAAA,CAAI,OAAA,CAAQ,QAAA,CAAS,SACtC,GAAI,CAACgB,CAAAA,EAAYA,CAAAA,CAAS,SAAW,CAAA,CAAG,OAExC,IAAMW,CAAAA,CAAcZ,GAAkBC,CAAQ,CAAA,CAC9CS,CAAAA,CAAI,IAAA,CAAK,mBAAA,CAAqBE,CAAAA,CAAa,CACzC,WAAA,CAAa,UACb,kBAAA,CAAoB,CAAE,KAAA,CAAOD,CAAiB,CAChD,CAAC,CAAA,CAED,MAAM,OAAA,CAAQ,IAAI,CAChBE,EAAAA,CAA0BH,CAAAA,CAAKC,CAAgB,CAAA,CAC/CG,EAAAA,CAA2BJ,CAAAA,CAAKC,CAAgB,CAClD,CAAC,EACH,CAUA,SAASI,GAAiBC,CAAAA,CAAiC,CACzD,IAAMC,CAAAA,CAAkB,EAAC,CAEzB,IAAA,IAAWtC,CAAAA,IAASqC,CAAAA,CAClB,GAAIrC,CAAAA,CAAM,IAAA,GAAS,WAAA,CAAA,CACjB,QAAW5G,CAAAA,IAAQ4G,CAAAA,CAAM,OAAA,CACvB,GAAI5G,EAAK,IAAA,GAAS,KAAA,CAChB,IAAA,IAAWH,CAAAA,IAAKG,EAAK,OAAA,CACfH,CAAAA,CAAE,IAAA,GAAS,SAAA,EAAaA,CAAAA,CAAE,KAAA,CAAM,GAAA,EAAK,UAAA,CAAW,OAAO,CAAA,EACzDqJ,CAAAA,CAAO,IAAA,CAAKrJ,CAAAA,CAAE,KAAK,EAAA,CAAA,KAAA,GAKlB+G,CAAAA,CAAM,IAAA,GAAS,OAAA,CACxB,QAAWpC,CAAAA,IAAOoC,CAAAA,CAAM,IAAA,CACtB,IAAA,IAAWtC,CAAAA,IAAQE,CAAAA,CAAI,KAAA,CACrB0E,CAAAA,CAAO,KAAK,GAAGF,EAAAA,CAAiB1E,CAAAA,CAAK,OAAO,CAAC,CAAA,CAMrD,OAAO4E,CACT,CAGA,IAAMC,EAAAA,CAAsC,CAC1C,WAAA,CAAa,KAAA,CACb,YAAA,CAAc,MAAA,CACd,WAAA,CAAa,KAAA,CACb,YAAa,KAAA,CACb,YAAA,CAAc,MAAA,CACd,YAAA,CAAc,OACd,eAAA,CAAiB,KACnB,CAAA,CAKA,SAASC,GAAcC,CAAAA,CAA2D,CAChF,IAAMZ,CAAAA,CAAQY,CAAAA,CAAQ,KAAA,CAAM,4BAA4B,CAAA,CACxD,GAAI,CAACZ,CAAAA,CACH,MAAM,IAAI,MAAM,kBAAkB,CAAA,CAGpC,IAAMa,CAAAA,CAAS,KAAKb,CAAAA,CAAM,CAAC,CAAC,CAAA,CACtBc,CAAAA,CAAQ,IAAI,UAAA,CAAWD,CAAAA,CAAO,MAAM,CAAA,CAC1C,IAAA,IAAS,CAAA,CAAI,CAAA,CAAG,EAAIA,CAAAA,CAAO,MAAA,CAAQ,CAAA,EAAA,CACjCC,CAAAA,CAAM,CAAC,CAAA,CAAID,CAAAA,CAAO,UAAA,CAAW,CAAC,CAAA,CAGhC,OAAO,CAAE,IAAA,CAAMC,EAAM,MAAA,CAAQ,SAAA,CAAWJ,EAAAA,CAAYV,CAAAA,CAAM,CAAC,CAAC,CAAA,EAAK,KAAM,CACzE,CASA,eAAee,EAAAA,CACbC,CAAAA,CACAd,CAAAA,CACAC,CAAAA,CACe,CACf,GAAIa,CAAAA,CAAU,SAAW,CAAA,CAAG,OAG5B,IAAMC,CAAAA,CAAW,+BACXC,CAAAA,CAAWhB,CAAAA,CAAI,IAAA,CAAKe,CAAQ,EAClC,GAAI,CAACC,CAAAA,CAAU,OACf,IAAIpB,CAAAA,CAAU,MAAMoB,CAAAA,CAAS,MAAM,MAAM,CAAA,CAGrCnB,CAAAA,CAAQF,CAAAA,CAAWC,CAAO,CAAA,CAG1BqB,CAAAA,CAAc,CAAA,CAClBjB,CAAAA,CAAI,QAASkB,CAAAA,EAAiB,CAC5B,IAAM,CAAA,CAAIA,CAAAA,CAAa,KAAA,CAAM,4BAA4B,CAAA,CACzD,GAAI,CAAA,CAAG,CACL,IAAMC,CAAAA,CAAM,SAAS,CAAA,CAAE,CAAC,CAAA,CAAG,EAAE,EACzBA,CAAAA,CAAMF,CAAAA,GAAaA,CAAAA,CAAcE,CAAAA,EACvC,CACF,CAAC,CAAA,CAED,IAAMC,EAAuB,EAAC,CACxBC,CAAAA,CAAkB,IAAI,IAE5B,IAAA,IAAW/O,CAAAA,IAASwO,CAAAA,CAAW,CAC7B,GAAM,CAAE,IAAA,CAAAQ,CAAAA,CAAM,SAAA,CAAAC,CAAU,CAAA,CAAId,EAAAA,CAAcnO,CAAAA,CAAM,GAAI,CAAA,CAEpD2O,CAAAA,EAAAA,CACApB,CAAAA,EAAAA,CACA,IAAM2B,EAAgB,CAAA,KAAA,EAAQP,CAAW,CAAA,CAAA,EAAIM,CAAS,GAChDE,CAAAA,CAAY,CAAA,WAAA,EAAcD,CAAa,CAAA,CAAA,CACvCE,CAAAA,CAAS,CAAA,GAAA,EAAM7B,CAAK,CAAA,CAAA,CAG1BG,EAAI,IAAA,CAAKyB,CAAAA,CAAWH,CAAAA,CAAM,CACxB,YAAa,SAAA,CACb,kBAAA,CAAoB,CAAE,KAAA,CAAOrB,CAAiB,CAChD,CAAC,CAAA,CAGDmB,CAAAA,CAAW,IAAA,CACT,CAAA,kBAAA,EAAqBM,CAAM,CAAA,iGAAA,EAAoGF,CAAa,CAAA,GAAA,CAC9I,CAAA,CAEAH,CAAAA,CAAgB,GAAA,CAAIE,CAAS,CAAA,CAG7BjP,CAAAA,CAAM,GAAA,CAAMoP,EACd,CAYA,GATIN,CAAAA,CAAW,MAAA,CAAS,CAAA,GACtBxB,CAAAA,CAAUA,CAAAA,CAAQ,OAAA,CAAQ,kBAAA,CAAoBwB,EAAW,IAAA,CAAK,EAAE,CAAA,CAAI,kBAAkB,EACtFpB,CAAAA,CAAI,IAAA,CAAKe,CAAAA,CAAUnB,CAAAA,CAAS,CAC1B,WAAA,CAAa,SAAA,CACb,kBAAA,CAAoB,CAAE,KAAA,CAAOK,CAAiB,CAChD,CAAC,GAICoB,CAAAA,CAAgB,IAAA,CAAO,CAAA,CAAG,CAC5B,IAAMM,CAAAA,CAAS3B,CAAAA,CAAI,IAAA,CAAK,qBAAqB,EAC7C,GAAI2B,CAAAA,CAAQ,CACV,IAAIC,CAAAA,CAAQ,MAAMD,CAAAA,CAAO,KAAA,CAAM,MAAM,CAAA,CACrC,IAAA,IAAWE,CAAAA,IAAOR,CAAAA,CAChB,GAAI,CAACO,CAAAA,CAAM,QAAA,CAAS,CAAA,WAAA,EAAcC,CAAG,CAAA,CAAA,CAAG,CAAA,CAAG,CACzC,IAAMC,CAAAA,CAAcC,EAAAA,CAA2BF,CAAO,EACtDD,CAAAA,CAAQA,CAAAA,CAAM,OAAA,CACZ,UAAA,CACA,uBAAuBC,CAAG,CAAA,eAAA,EAAkBC,CAAW,CAAA,WAAA,CACzD,EACF,CAEF9B,CAAAA,CAAI,IAAA,CAAK,qBAAA,CAAuB4B,CAAAA,CAAO,CACrC,WAAA,CAAa,SAAA,CACb,mBAAoB,CAAE,KAAA,CAAO3B,CAAiB,CAChD,CAAC,EACH,CACF,CACF,CAUA,SAAS+B,EAAAA,CAA4B1B,CAAAA,CAAqC,CACxE,IAAM2B,CAAAA,CAA0B,EAAC,CAEjC,IAAA,IAAWhE,KAASqC,CAAAA,CAClB,GAAIrC,CAAAA,CAAM,IAAA,GAAS,YACjB,IAAA,IAAW5G,CAAAA,IAAQ4G,CAAAA,CAAM,OAAA,CACnB5G,EAAK,IAAA,GAAS,WAAA,EAAeA,CAAAA,CAAK,IAAA,EAAQ,CAACA,CAAAA,CAAK,GAAA,EAAO,CAACA,EAAK,MAAA,EAC/D4K,CAAAA,CAAW,IAAA,CAAK5K,CAAI,UAGf4G,CAAAA,CAAM,IAAA,GAAS,OAAA,CACxB,IAAA,IAAWpC,KAAOoC,CAAAA,CAAM,IAAA,CACtB,IAAA,IAAWtC,CAAAA,IAAQE,CAAAA,CAAI,KAAA,CACrBoG,CAAAA,CAAW,IAAA,CAAK,GAAGD,EAAAA,CAA4BrG,CAAAA,CAAK,OAAO,CAAC,EAMpE,OAAOsG,CACT,CAMA,eAAeC,GACbC,CAAAA,CACAnC,CAAAA,CACAC,CAAAA,CACe,CACf,GAAIkC,CAAAA,CAAc,MAAA,GAAW,CAAA,CAAG,OAEhC,IAAMpB,CAAAA,CAAW,8BAAA,CACXC,CAAAA,CAAWhB,EAAI,IAAA,CAAKe,CAAQ,CAAA,CAClC,GAAI,CAACC,CAAAA,CAAU,OACf,IAAIpB,CAAAA,CAAU,MAAMoB,CAAAA,CAAS,KAAA,CAAM,MAAM,EAErCnB,CAAAA,CAAQF,CAAAA,CAAWC,CAAO,CAAA,CACxBwB,EAAuB,EAAC,CAE9B,IAAA,IAAW3K,CAAAA,IAAa0L,EAAe,CACrCtC,CAAAA,EAAAA,CACA,IAAM6B,CAAAA,CAAS,CAAA,GAAA,EAAM7B,CAAK,CAAA,CAAA,CAE1BuB,CAAAA,CAAW,KACT,CAAA,kBAAA,EAAqBM,CAAM,CAAA,QAAA,EAAWU,mBAAAA,CAAmB,SAAS,CAAA,UAAA,EAAazT,CAAAA,CAAU8H,CAAAA,CAAU,IAAK,CAAC,CAAA,yBAAA,CAC3G,CAAA,CAGAA,CAAAA,CAAU,GAAA,CAAMiL,EAClB,CAEIN,CAAAA,CAAW,MAAA,CAAS,IACtBxB,CAAAA,CAAUA,CAAAA,CAAQ,OAAA,CAAQ,kBAAA,CAAoBwB,EAAW,IAAA,CAAK,EAAE,CAAA,CAAI,kBAAkB,EACtFpB,CAAAA,CAAI,IAAA,CAAKe,CAAAA,CAAUnB,CAAAA,CAAS,CAC1B,WAAA,CAAa,SAAA,CACb,kBAAA,CAAoB,CAAE,KAAA,CAAOK,CAAiB,CAChD,CAAC,CAAA,EAEL,CA0BA,eAAsBoC,EAAAA,CAAW9D,EAAe+D,CAAAA,CAAyB,EAAC,CAAyB,CAEjG,GAAI,CAAC/D,CAAAA,CAAI,cAAA,CACP,MAAM,IAAI,KAAA,CACR,gGAEF,CAAA,CAGF,GAAM,CAAE,gBAAA,CAAA0B,CAAAA,CAAmB,CAAA,CAAG,mBAAAsC,CAAAA,CAAqB,IAAA,CAAM,UAAA,CAAAC,CAAW,CAAA,CAAIF,CAAAA,CAClEG,CAAAA,CAAiBlE,CAAAA,CAGjBmE,EAAc,MAAM,CAAA,CAAAC,OAAAA,CAAM,SAAA,CAAUpE,EAAI,cAAc,CAAA,CAGtDqE,CAAAA,CAAS,IAAI,EAAAD,OAAAA,CAGnB,IAAA,GAAW,CAACE,CAAAA,CAAMC,CAAI,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQJ,EAAY,KAAK,CAAA,CAAG,CAE5D,GAAII,EAAK,GAAA,CAAK,CACZF,CAAAA,CAAO,MAAA,CAAOC,EAAK,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAC,CAAA,CACrC,QACF,CAGA,IAAMnS,EAAU,MAAMoS,CAAAA,CAAK,KAAA,CAAM,aAAa,EAG9CF,CAAAA,CAAO,IAAA,CAAKC,CAAAA,CAAMnS,CAAAA,CAAS,CACzB,WAAA,CAAa,SAAA,CACb,kBAAA,CAAoB,CAAE,KAAA,CAAOuP,CAAiB,CAChD,CAAC,EACH,CAIA,IAAMa,CAAAA,CAAYT,EAAAA,CAAiBoC,EAAe,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,CAC1E,MAAM5B,EAAAA,CAAiBC,CAAAA,CAAW8B,CAAAA,CAAQ3C,CAAgB,CAAA,CAI1D,IAAMkC,CAAAA,CAAgBH,EAAAA,CAA4BS,EAAe,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,CACzF,MAAMP,EAAAA,CAAqBC,CAAAA,CAAeS,CAAAA,CAAQ3C,CAAgB,EAGlE,IAAM8C,CAAAA,CAAczE,CAAAA,CAAkBmE,CAAc,CAAA,CAapD,GAZAG,CAAAA,CAAO,IAAA,CAAK,oBAAqBG,CAAAA,CAAa,CAC5C,WAAA,CAAa,SAAA,CACb,mBAAoB,CAAE,KAAA,CAAO9C,CAAiB,CAChD,CAAC,CAAA,CAGD+C,EAAAA,CAA6BP,CAAAA,CAAgBG,CAAAA,CAAQ3C,CAAgB,CAAA,CAGrE,MAAMF,EAAAA,CAAuB0C,EAAgBG,CAAAA,CAAQ3C,CAAgB,CAAA,CAGjEsC,CAAAA,CAAoB,CACtB,IAAMU,CAAAA,CAAgB,mBAAA,CAChBC,CAAAA,CAAgBR,EAAY,IAAA,CAAKO,CAAa,CAAA,CAEpD,GAAIC,CAAAA,CAAe,CACjB,IAAMC,CAAAA,CAAoB,MAAMD,CAAAA,CAAc,KAAA,CAAM,MAAM,CAAA,CACpDE,EAAmBC,EAAAA,CAAqBF,CAAAA,CAAmB,CAC/D,kBAAA,CAAAZ,EACA,UAAA,CAAAC,CACF,CAAC,CAAA,CAEDI,CAAAA,CAAO,IAAA,CAAKK,CAAAA,CAAeG,CAAAA,CAAkB,CAC3C,WAAA,CAAa,SAAA,CACb,kBAAA,CAAoB,CAAE,MAAOnD,CAAiB,CAChD,CAAC,EACH,CACF,CASA,OANoB,MAAM2C,CAAAA,CAAO,aAAA,CAAc,CAC7C,IAAA,CAAM,aAAA,CACN,YAAa,SAAA,CACb,kBAAA,CAAoB,CAAE,KAAA,CAAO3C,CAAiB,CAChD,CAAC,CAGH,CAqFA,IAAMqD,EAAAA,CACJ,6EAAA,CACIC,EAAAA,CACJ,8EAAA,CAMF,eAAepD,EAAAA,CAA0BH,CAAAA,CAAYC,CAAAA,CAAyC,CAC5F,IAAM0B,CAAAA,CAAS3B,CAAAA,CAAI,IAAA,CAAK,qBAAqB,CAAA,CAC7C,GAAI,CAAC2B,CAAAA,CAAQ,OAEb,IAAIC,CAAAA,CAAQ,MAAMD,CAAAA,CAAO,KAAA,CAAM,MAAM,CAAA,CACjCC,CAAAA,CAAM,SAAS,oBAAoB,CAAA,GAGvCA,CAAAA,CAAQA,CAAAA,CAAM,QACZ,UAAA,CACA,CAAA,qDAAA,EAAwD0B,EAAqB,CAAA,WAAA,CAC/E,EACAtD,CAAAA,CAAI,IAAA,CAAK,qBAAA,CAAuB4B,CAAAA,CAAO,CACrC,WAAA,CAAa,SAAA,CACb,kBAAA,CAAoB,CAAE,KAAA,CAAO3B,CAAiB,CAChD,CAAC,GACH,CAMA,eAAeG,EAAAA,CAA2BJ,CAAAA,CAAYC,EAAyC,CAC7F,IAAMc,CAAAA,CAAW,8BAAA,CACXC,CAAAA,CAAWhB,CAAAA,CAAI,IAAA,CAAKe,CAAQ,EAClC,GAAI,CAACC,CAAAA,CAAU,OAEf,IAAIpB,CAAAA,CAAU,MAAMoB,CAAAA,CAAS,KAAA,CAAM,MAAM,CAAA,CACzC,GAAIpB,CAAAA,CAAQ,QAAA,CAAS,cAAc,CAAA,CAAG,OAGtC,IAAM8B,EAAS,CAAA,GAAA,EAAM/B,CAAAA,CAAWC,CAAO,CAAA,CAAI,CAAC,CAAA,CAAA,CAE5CA,CAAAA,CAAUA,CAAAA,CAAQ,OAAA,CAChB,mBACA,CAAA,kBAAA,EAAqB8B,CAAM,CAAA,QAAA,EAAW6B,EAA0B,CAAA,yCAAA,CAClE,CAAA,CACAvD,CAAAA,CAAI,IAAA,CAAKe,EAAUnB,CAAAA,CAAS,CAC1B,WAAA,CAAa,SAAA,CACb,mBAAoB,CAAE,KAAA,CAAOK,CAAiB,CAChD,CAAC,EACH,CA2OA,SAAS+C,EAAAA,CAA6BzE,CAAAA,CAAeyB,CAAAA,CAAYC,CAAAA,CAAgC,CAC/F,IAAMuD,CAAAA,CAAOjF,CAAAA,CAAI,OAAA,CAAQ,aAAA,CACzB,GAAI,CAACiF,CAAAA,CAAM,OAEX,IAAMC,EAAqB,CAAE,KAAA,CAAOxD,CAAiB,CAAA,CAGrD,GAAI1B,CAAAA,CAAI,OAAA,CAAQ,OAAA,CACd,OAAW,CAAC9L,CAAAA,CAAKiR,CAAY,CAAA,GAAKnF,EAAI,OAAA,CAAQ,OAAA,CAAQ,OAAA,EAAQ,CAAG,CAC/D,IAAMoF,CAAAA,CAAMH,CAAAA,CAAK,GAAA,CAAI/Q,CAAG,CAAA,CACxB,GAAIkR,CAAAA,EAAOA,EAAI,IAAA,GAASvB,mBAAAA,CAAmB,MAAA,EAAUuB,CAAAA,CAAI,OAAQ,CAC/D,IAAMC,CAAAA,CAAWD,CAAAA,CAAI,OAAO,UAAA,CAAW,GAAG,CAAA,CAAIA,CAAAA,CAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,CAAI,QAAQA,CAAAA,CAAI,MAAM,CAAA,CAAA,CAChF3E,CAAAA,CAAMH,EAAsB6E,CAAY,CAAA,CAC9C1D,CAAAA,CAAI,IAAA,CAAK4D,EAAU5E,CAAAA,CAAK,CAAE,WAAA,CAAa,SAAA,CAAW,kBAAA,CAAAyE,CAAmB,CAAC,EACxE,CACF,CAIF,GAAIlF,CAAAA,CAAI,OAAA,CAAQ,QACd,IAAA,GAAW,CAAC9L,CAAAA,CAAKiR,CAAY,IAAKnF,CAAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,OAAA,EAAQ,CAAG,CAC/D,IAAMoF,CAAAA,CAAMH,EAAK,GAAA,CAAI/Q,CAAG,CAAA,CACxB,GAAIkR,GAAOA,CAAAA,CAAI,IAAA,GAASvB,mBAAAA,CAAmB,MAAA,EAAUuB,EAAI,MAAA,CAAQ,CAC/D,IAAMC,CAAAA,CAAWD,CAAAA,CAAI,MAAA,CAAO,UAAA,CAAW,GAAG,EAAIA,CAAAA,CAAI,MAAA,CAAO,KAAA,CAAM,CAAC,EAAI,CAAA,KAAA,EAAQA,CAAAA,CAAI,MAAM,CAAA,CAAA,CAChF3E,EAAMH,CAAAA,CAAsB6E,CAAY,CAAA,CAC9C1D,CAAAA,CAAI,IAAA,CAAK4D,CAAAA,CAAU5E,CAAAA,CAAK,CAAE,YAAa,SAAA,CAAW,kBAAA,CAAAyE,CAAmB,CAAC,EACxE,CACF,CAEJ,CASA,SAASJ,GACPQ,CAAAA,CACAvB,CAAAA,CACQ,CACR,IAAIwB,CAAAA,CAASD,CAAAA,CAEb,GAAIvB,CAAAA,CAAQ,mBAAoB,CAC9B,IAAMyB,CAAAA,CAAM,IAAI,MAAK,CAAE,WAAA,EAAY,CAG/BD,CAAAA,CAAO,SAAS,mBAAmB,CAAA,CACrCA,CAAAA,CAASA,CAAAA,CAAO,OAAA,CACd,kDAAA,CACA,CAAA,4CAAA,EAA+CC,CAAG,qBACpD,CAAA,CAGAD,CAAAA,CAASA,CAAAA,CAAO,OAAA,CACd,uBACA,CAAA,4CAAA,EAA+CC,CAAG,CAAA,uCAAA,CACpD,EAEJ,CAEA,OAAIzB,CAAAA,CAAQ,UAAA,GAENwB,CAAAA,CAAO,QAAA,CAAS,oBAAoB,CAAA,CACtCA,CAAAA,CAASA,EAAO,OAAA,CACd,+CAAA,CACA,CAAA,mBAAA,EAAsBnV,CAAAA,CAAU2T,EAAQ,UAAU,CAAC,CAAA,oBAAA,CACrD,CAAA,CAGAwB,EAASA,CAAAA,CAAO,OAAA,CACd,sBAAA,CACA,CAAA,mBAAA,EAAsBnV,CAAAA,CAAU2T,CAAAA,CAAQ,UAAU,CAAC,0CACrD,CAAA,CAAA,CAIGwB,CACT,CAKA,SAAS/B,GAA2BR,CAAAA,CAAmByC,CAAAA,CAA0B,CAE/E,OAE6C,CAC3C,GAAA,CAAK,WAAA,CACL,GAAA,CAAK,YAAA,CACL,IAAA,CAAM,YAAA,CACN,GAAA,CAAK,YACL,GAAA,CAAK,WAAA,CACL,GAAA,CAAK,YAAA,CACL,KAAM,YAAA,CACN,GAAA,CAAK,eAAA,CACL,IAAA,CAAM,aACN,GAAA,CAAK,aAAA,CACL,GAAA,CAAK,aACP,CAAA,CAEoBzC,CAAS,CAAA,EAAK,0BACpC,CA+GA,eAAsB0C,EAAAA,EAAwC,CAC5D,IAAMjE,EAAM,IAAI,CAAA,CAAA2C,OAAAA,CAGhB3C,CAAAA,CAAI,KACF,qBAAA,CACA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CASF,CAAA,CAGAA,CAAAA,CAAI,IAAA,CACF,aAAA,CACA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAA,CAMF,CAAA,CAGAA,CAAAA,CAAI,IAAA,CACF,8BAAA,CACA,CAAA;AAAA;AAAA;AAAA,gBAAA,CAIF,CAAA,CAGAA,CAAAA,CAAI,IAAA,CACF,mBAAA,CACA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAA,CAcF,CAAA,CAGAA,CAAAA,CAAI,IAAA,CACF,iBAAA,CACA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAA,CAmBF,CAAA,CAGA,IAAM+D,CAAAA,CAAM,IAAI,IAAA,EAAK,CAAE,WAAA,EAAY,CACnC,OAAA/D,CAAAA,CAAI,IAAA,CACF,mBAAA,CACA,CAAA;AAAA;AAAA;AAAA,6CAAA,EAG2C+D,CAAG,CAAA;AAAA,8CAAA,EACFA,CAAG,CAAA;AAAA,oBAAA,CAEjD,CAAA,CAGA/D,CAAAA,CAAI,IAAA,CACF,kBAAA,CACA,CAAA;AAAA;AAAA;AAAA;AAAA,aAAA,CAKF,CAAA,CAEOA,CAAAA,CAAI,aAAA,CAAc,CACvB,KAAM,aAAA,CACN,WAAA,CAAa,SAAA,CACb,kBAAA,CAAoB,CAAE,KAAA,CAAO,CAAE,CACjC,CAAC,CACH,CAQA,eAAsBkE,EAAAA,CAAW3F,CAAAA,CAAqC,CAEpE,IAAM4F,CAAAA,CAAc,MAAMF,EAAAA,GAGpBG,CAAAA,CAA0B,CAC9B,GAAG7F,CAAAA,CACH,eAAgB4F,CAClB,CAAA,CAGA,OAAO9B,EAAAA,CAAW+B,CAAa,CACjC","file":"chunk-5DYSI4O4.cjs","sourcesContent":["/**\n * Shared XML utility functions for serializers.\n */\n\nexport function escapeXml(text: string): string {\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n","/**\n * Run Serializer - Serialize runs to OOXML XML\n *\n * Converts Run objects back to <w:r> XML format for DOCX files.\n * Handles all formatting properties and content types.\n *\n * OOXML Reference:\n * - Run: w:r\n * - Run properties: w:rPr\n * - Text content: w:t\n */\n\nimport type {\n Run,\n RunContent,\n TextContent,\n TabContent,\n BreakContent,\n SymbolContent,\n NoteReferenceContent,\n FieldCharContent,\n InstrTextContent,\n SoftHyphenContent,\n NoBreakHyphenContent,\n DrawingContent,\n ShapeContent,\n TextFormatting,\n ColorValue,\n ShadingProperties,\n Image,\n ShapeFill,\n ShapeOutline,\n ImagePosition,\n ImageWrap,\n Paragraph,\n RunPropertyChange,\n} from '../../types/document';\nimport { serializeParagraph } from './paragraphSerializer';\nimport { escapeXml } from './xmlUtils';\n\n// ============================================================================\n// COLOR SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize a color element (w:color)\n */\nfunction serializeColorElement(color: ColorValue | undefined): string {\n if (!color) return '';\n\n const attrs: string[] = [];\n\n if (color.auto) {\n attrs.push('w:val=\"auto\"');\n } else if (color.rgb) {\n attrs.push(`w:val=\"${color.rgb}\"`);\n }\n\n if (color.themeColor) {\n attrs.push(`w:themeColor=\"${color.themeColor}\"`);\n }\n\n if (color.themeTint) {\n attrs.push(`w:themeTint=\"${color.themeTint}\"`);\n }\n\n if (color.themeShade) {\n attrs.push(`w:themeShade=\"${color.themeShade}\"`);\n }\n\n if (attrs.length === 0) return '';\n\n return `<w:color ${attrs.join(' ')}/>`;\n}\n\n// ============================================================================\n// SHADING SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize shading properties (w:shd)\n */\nfunction serializeShading(shading: ShadingProperties | undefined): string {\n if (!shading) return '';\n\n const attrs: string[] = [];\n\n // Pattern/val\n if (shading.pattern) {\n attrs.push(`w:val=\"${shading.pattern}\"`);\n } else {\n attrs.push('w:val=\"clear\"');\n }\n\n // Color (pattern color)\n if (shading.color?.rgb) {\n attrs.push(`w:color=\"${shading.color.rgb}\"`);\n } else if (shading.color?.auto) {\n attrs.push('w:color=\"auto\"');\n }\n\n // Fill (background color)\n if (shading.fill?.rgb) {\n attrs.push(`w:fill=\"${shading.fill.rgb}\"`);\n } else if (shading.fill?.auto) {\n attrs.push('w:fill=\"auto\"');\n }\n\n // Theme fill\n if (shading.fill?.themeColor) {\n attrs.push(`w:themeFill=\"${shading.fill.themeColor}\"`);\n }\n\n if (shading.fill?.themeTint) {\n attrs.push(`w:themeFillTint=\"${shading.fill.themeTint}\"`);\n }\n\n if (shading.fill?.themeShade) {\n attrs.push(`w:themeFillShade=\"${shading.fill.themeShade}\"`);\n }\n\n if (attrs.length === 0) return '';\n\n return `<w:shd ${attrs.join(' ')}/>`;\n}\n\n// ============================================================================\n// TEXT FORMATTING SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize text formatting properties to w:rPr XML\n */\nexport function serializeTextFormatting(formatting: TextFormatting | undefined): string {\n if (!formatting) return '';\n\n const parts: string[] = [];\n\n // Style reference (must be first)\n if (formatting.styleId) {\n parts.push(`<w:rStyle w:val=\"${escapeXml(formatting.styleId)}\"/>`);\n }\n\n // Font family (w:rFonts)\n if (formatting.fontFamily) {\n const fontAttrs: string[] = [];\n if (formatting.fontFamily.ascii) {\n fontAttrs.push(`w:ascii=\"${escapeXml(formatting.fontFamily.ascii)}\"`);\n }\n if (formatting.fontFamily.hAnsi) {\n fontAttrs.push(`w:hAnsi=\"${escapeXml(formatting.fontFamily.hAnsi)}\"`);\n }\n if (formatting.fontFamily.eastAsia) {\n fontAttrs.push(`w:eastAsia=\"${escapeXml(formatting.fontFamily.eastAsia)}\"`);\n }\n if (formatting.fontFamily.cs) {\n fontAttrs.push(`w:cs=\"${escapeXml(formatting.fontFamily.cs)}\"`);\n }\n if (formatting.fontFamily.asciiTheme) {\n fontAttrs.push(`w:asciiTheme=\"${formatting.fontFamily.asciiTheme}\"`);\n }\n if (formatting.fontFamily.hAnsiTheme) {\n fontAttrs.push(`w:hAnsiTheme=\"${formatting.fontFamily.hAnsiTheme}\"`);\n }\n if (formatting.fontFamily.eastAsiaTheme) {\n fontAttrs.push(`w:eastAsiaTheme=\"${formatting.fontFamily.eastAsiaTheme}\"`);\n }\n if (formatting.fontFamily.csTheme) {\n fontAttrs.push(`w:csTheme=\"${formatting.fontFamily.csTheme}\"`);\n }\n if (fontAttrs.length > 0) {\n parts.push(`<w:rFonts ${fontAttrs.join(' ')}/>`);\n }\n }\n\n // Bold\n if (formatting.bold === true) {\n parts.push('<w:b/>');\n } else if (formatting.bold === false) {\n parts.push('<w:b w:val=\"0\"/>');\n }\n\n if (formatting.boldCs === true) {\n parts.push('<w:bCs/>');\n } else if (formatting.boldCs === false) {\n parts.push('<w:bCs w:val=\"0\"/>');\n }\n\n // Italic\n if (formatting.italic === true) {\n parts.push('<w:i/>');\n } else if (formatting.italic === false) {\n parts.push('<w:i w:val=\"0\"/>');\n }\n\n if (formatting.italicCs === true) {\n parts.push('<w:iCs/>');\n } else if (formatting.italicCs === false) {\n parts.push('<w:iCs w:val=\"0\"/>');\n }\n\n // Caps\n if (formatting.allCaps) {\n parts.push('<w:caps/>');\n }\n\n if (formatting.smallCaps) {\n parts.push('<w:smallCaps/>');\n }\n\n // Strike\n if (formatting.strike) {\n parts.push('<w:strike/>');\n }\n\n if (formatting.doubleStrike) {\n parts.push('<w:dstrike/>');\n }\n\n // Outline\n if (formatting.outline) {\n parts.push('<w:outline/>');\n }\n\n // Shadow\n if (formatting.shadow) {\n parts.push('<w:shadow/>');\n }\n\n // Emboss\n if (formatting.emboss) {\n parts.push('<w:emboss/>');\n }\n\n // Imprint\n if (formatting.imprint) {\n parts.push('<w:imprint/>');\n }\n\n // Hidden\n if (formatting.hidden) {\n parts.push('<w:vanish/>');\n }\n\n // Color\n const colorXml = serializeColorElement(formatting.color);\n if (colorXml) {\n parts.push(colorXml);\n }\n\n // Spacing\n if (formatting.spacing !== undefined) {\n parts.push(`<w:spacing w:val=\"${formatting.spacing}\"/>`);\n }\n\n // Scale (w:w)\n if (formatting.scale !== undefined) {\n parts.push(`<w:w w:val=\"${formatting.scale}\"/>`);\n }\n\n // Kerning\n if (formatting.kerning !== undefined) {\n parts.push(`<w:kern w:val=\"${formatting.kerning}\"/>`);\n }\n\n // Position\n if (formatting.position !== undefined) {\n parts.push(`<w:position w:val=\"${formatting.position}\"/>`);\n }\n\n // Font size\n if (formatting.fontSize !== undefined) {\n parts.push(`<w:sz w:val=\"${formatting.fontSize}\"/>`);\n }\n\n if (formatting.fontSizeCs !== undefined) {\n parts.push(`<w:szCs w:val=\"${formatting.fontSizeCs}\"/>`);\n }\n\n // Highlight — only emit valid OOXML named colors (not CSS values)\n if (formatting.highlight && formatting.highlight !== 'none') {\n const validHighlightColors = new Set([\n 'black',\n 'blue',\n 'cyan',\n 'darkBlue',\n 'darkCyan',\n 'darkGray',\n 'darkGreen',\n 'darkMagenta',\n 'darkRed',\n 'darkYellow',\n 'green',\n 'lightGray',\n 'magenta',\n 'red',\n 'white',\n 'yellow',\n ]);\n if (validHighlightColors.has(formatting.highlight)) {\n parts.push(`<w:highlight w:val=\"${formatting.highlight}\"/>`);\n }\n }\n\n // Underline\n if (formatting.underline) {\n const uAttrs: string[] = [`w:val=\"${formatting.underline.style}\"`];\n if (formatting.underline.color) {\n if (formatting.underline.color.rgb) {\n uAttrs.push(`w:color=\"${formatting.underline.color.rgb}\"`);\n }\n if (formatting.underline.color.themeColor) {\n uAttrs.push(`w:themeColor=\"${formatting.underline.color.themeColor}\"`);\n }\n }\n parts.push(`<w:u ${uAttrs.join(' ')}/>`);\n }\n\n // Effect\n if (formatting.effect && formatting.effect !== 'none') {\n parts.push(`<w:effect w:val=\"${formatting.effect}\"/>`);\n }\n\n // Emphasis mark\n if (formatting.emphasisMark && formatting.emphasisMark !== 'none') {\n parts.push(`<w:em w:val=\"${formatting.emphasisMark}\"/>`);\n }\n\n // Shading\n const shadingXml = serializeShading(formatting.shading);\n if (shadingXml) {\n parts.push(shadingXml);\n }\n\n // Vertical alignment\n if (formatting.vertAlign && formatting.vertAlign !== 'baseline') {\n parts.push(`<w:vertAlign w:val=\"${formatting.vertAlign}\"/>`);\n }\n\n // RTL and CS\n if (formatting.rtl) {\n parts.push('<w:rtl/>');\n }\n\n if (formatting.cs) {\n parts.push('<w:cs/>');\n }\n\n if (parts.length === 0) return '';\n\n return `<w:rPr>${parts.join('')}</w:rPr>`;\n}\n\nfunction extractRPrInner(rPrXml: string): string {\n if (!rPrXml.startsWith('<w:rPr>') || !rPrXml.endsWith('</w:rPr>')) {\n return '';\n }\n return rPrXml.slice('<w:rPr>'.length, -'</w:rPr>'.length);\n}\n\nfunction serializeRunPropertyChange(change: RunPropertyChange): string {\n const normalizedId = Number.isInteger(change.info.id) && change.info.id >= 0 ? change.info.id : 0;\n const authorCandidate = typeof change.info.author === 'string' ? change.info.author.trim() : '';\n const normalizedAuthor = authorCandidate.length > 0 ? authorCandidate : 'Unknown';\n const normalizedDate = typeof change.info.date === 'string' ? change.info.date.trim() : undefined;\n const normalizedRsid = typeof change.info.rsid === 'string' ? change.info.rsid.trim() : undefined;\n const attrs = [`w:id=\"${normalizedId}\"`, `w:author=\"${escapeXml(normalizedAuthor)}\"`];\n\n if (normalizedDate) {\n attrs.push(`w:date=\"${escapeXml(normalizedDate)}\"`);\n }\n if (normalizedRsid) {\n attrs.push(`w:rsid=\"${escapeXml(normalizedRsid)}\"`);\n }\n\n const previousRPrXml = serializeTextFormatting(change.previousFormatting) || '<w:rPr/>';\n return `<w:rPrChange ${attrs.join(' ')}>${previousRPrXml}</w:rPrChange>`;\n}\n\nfunction serializeRunProperties(\n formatting: TextFormatting | undefined,\n propertyChanges: RunPropertyChange[] | undefined\n): string {\n const currentRPrXml = serializeTextFormatting(formatting);\n const currentInner = currentRPrXml ? extractRPrInner(currentRPrXml) : '';\n const propertyChangeXml = (propertyChanges ?? []).map(serializeRunPropertyChange).join('');\n const combined = `${currentInner}${propertyChangeXml}`;\n\n if (!combined) {\n return '';\n }\n\n return `<w:rPr>${combined}</w:rPr>`;\n}\n\n// ============================================================================\n// RUN CONTENT SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize text content (w:t)\n */\nfunction serializeTextContent(content: TextContent): string {\n const needsPreserve =\n content.preserveSpace ||\n content.text.startsWith(' ') ||\n content.text.endsWith(' ') ||\n content.text.includes(' ');\n\n const spaceAttr = needsPreserve ? ' xml:space=\"preserve\"' : '';\n\n return `<w:t${spaceAttr}>${escapeXml(content.text)}</w:t>`;\n}\n\n/**\n * Serialize tab content (w:tab)\n */\nfunction serializeTabContent(_content: TabContent): string {\n return '<w:tab/>';\n}\n\n/**\n * Serialize break content (w:br)\n */\nfunction serializeBreakContent(content: BreakContent): string {\n const attrs: string[] = [];\n\n if (content.breakType === 'page') {\n attrs.push('w:type=\"page\"');\n } else if (content.breakType === 'column') {\n attrs.push('w:type=\"column\"');\n } else if (content.breakType === 'textWrapping') {\n attrs.push('w:type=\"textWrapping\"');\n if (content.clear && content.clear !== 'none') {\n attrs.push(`w:clear=\"${content.clear}\"`);\n }\n }\n\n if (attrs.length === 0) {\n return '<w:br/>';\n }\n\n return `<w:br ${attrs.join(' ')}/>`;\n}\n\n/**\n * Serialize symbol content (w:sym)\n */\nfunction serializeSymbolContent(content: SymbolContent): string {\n return `<w:sym w:font=\"${escapeXml(content.font)}\" w:char=\"${escapeXml(content.char)}\"/>`;\n}\n\n/**\n * Serialize footnote/endnote reference\n */\nfunction serializeNoteReference(content: NoteReferenceContent): string {\n if (content.type === 'footnoteRef') {\n return `<w:footnoteReference w:id=\"${content.id}\"/>`;\n } else {\n return `<w:endnoteReference w:id=\"${content.id}\"/>`;\n }\n}\n\n/**\n * Serialize field character (w:fldChar)\n */\nfunction serializeFieldChar(content: FieldCharContent): string {\n const attrs: string[] = [`w:fldCharType=\"${content.charType}\"`];\n\n if (content.fldLock) {\n attrs.push('w:fldLock=\"true\"');\n }\n\n if (content.dirty) {\n attrs.push('w:dirty=\"true\"');\n }\n\n return `<w:fldChar ${attrs.join(' ')}/>`;\n}\n\n/**\n * Serialize field instruction text (w:instrText)\n */\nfunction serializeInstrText(content: InstrTextContent): string {\n const needsPreserve =\n content.text.startsWith(' ') || content.text.endsWith(' ') || content.text.includes(' ');\n\n const spaceAttr = needsPreserve ? ' xml:space=\"preserve\"' : '';\n\n return `<w:instrText${spaceAttr}>${escapeXml(content.text)}</w:instrText>`;\n}\n\n/**\n * Serialize soft hyphen (w:softHyphen)\n */\nfunction serializeSoftHyphen(_content: SoftHyphenContent): string {\n return '<w:softHyphen/>';\n}\n\n/**\n * Serialize non-breaking hyphen (w:noBreakHyphen)\n */\nfunction serializeNoBreakHyphen(_content: NoBreakHyphenContent): string {\n return '<w:noBreakHyphen/>';\n}\n\n// ============================================================================\n// DRAWING / IMAGE / SHAPE SERIALIZATION\n// ============================================================================\n\n/** Serialize a color value to DrawingML a:srgbClr or a:schemeClr */\nfunction serializeDrawingColor(color: ColorValue | undefined): string {\n if (!color) return '';\n if (color.rgb) {\n return `<a:srgbClr val=\"${color.rgb.replace('#', '')}\"/>`;\n }\n if (color.themeColor) {\n let clr = `<a:schemeClr val=\"${color.themeColor}\"`;\n if (color.themeTint) {\n clr += `><a:tint val=\"${color.themeTint}\"/></a:schemeClr>`;\n } else if (color.themeShade) {\n clr += `><a:shade val=\"${color.themeShade}\"/></a:schemeClr>`;\n } else {\n clr += `/>`;\n }\n return clr;\n }\n return '';\n}\n\n/** Serialize shape fill to DrawingML */\nfunction serializeFill(fill: ShapeFill | undefined): string {\n if (!fill || fill.type === 'none') return '<a:noFill/>';\n if (fill.type === 'solid' && fill.color) {\n return `<a:solidFill>${serializeDrawingColor(fill.color)}</a:solidFill>`;\n }\n if (fill.type === 'gradient' && fill.gradient) {\n const g = fill.gradient;\n const stops = g.stops\n .map((s) => `<a:gs pos=\"${s.position}\">${serializeDrawingColor(s.color)}</a:gs>`)\n .join('');\n const direction =\n g.type === 'linear' ? `<a:lin ang=\"${(g.angle || 0) * 60000}\" scaled=\"1\"/>` : '';\n return `<a:gradFill><a:gsLst>${stops}</a:gsLst>${direction}</a:gradFill>`;\n }\n return '';\n}\n\n/** Serialize shape outline to DrawingML a:ln */\nfunction serializeOutline(outline: ShapeOutline | undefined): string {\n if (!outline) return '';\n const attrs: string[] = [];\n if (outline.width != null) attrs.push(`w=\"${outline.width}\"`);\n if (outline.cap) attrs.push(`cap=\"${outline.cap}\"`);\n\n const parts: string[] = [];\n if (outline.color) {\n parts.push(`<a:solidFill>${serializeDrawingColor(outline.color)}</a:solidFill>`);\n }\n if (outline.style && outline.style !== 'solid') {\n parts.push(`<a:prstDash val=\"${outline.style}\"/>`);\n }\n if (outline.headEnd) {\n parts.push(\n `<a:headEnd type=\"${outline.headEnd.type}\"${outline.headEnd.width ? ` w=\"${outline.headEnd.width}\"` : ''}${outline.headEnd.length ? ` len=\"${outline.headEnd.length}\"` : ''}/>`\n );\n }\n if (outline.tailEnd) {\n parts.push(\n `<a:tailEnd type=\"${outline.tailEnd.type}\"${outline.tailEnd.width ? ` w=\"${outline.tailEnd.width}\"` : ''}${outline.tailEnd.length ? ` len=\"${outline.tailEnd.length}\"` : ''}/>`\n );\n }\n\n if (parts.length === 0 && attrs.length === 0) return '';\n return `<a:ln${attrs.length ? ' ' + attrs.join(' ') : ''}>${parts.join('')}</a:ln>`;\n}\n\n/** Build wp:positionH and wp:positionV for floating drawings */\nfunction serializePosition(pos: ImagePosition): string {\n const parts: string[] = [];\n\n // Horizontal\n const h = pos.horizontal;\n parts.push(`<wp:positionH relativeFrom=\"${h.relativeTo}\">`);\n if (h.alignment) {\n parts.push(`<wp:align>${h.alignment}</wp:align>`);\n } else {\n parts.push(`<wp:posOffset>${h.posOffset || 0}</wp:posOffset>`);\n }\n parts.push('</wp:positionH>');\n\n // Vertical\n const v = pos.vertical;\n parts.push(`<wp:positionV relativeFrom=\"${v.relativeTo}\">`);\n if (v.alignment) {\n parts.push(`<wp:align>${v.alignment}</wp:align>`);\n } else {\n parts.push(`<wp:posOffset>${v.posOffset || 0}</wp:posOffset>`);\n }\n parts.push('</wp:positionV>');\n\n return parts.join('');\n}\n\n/** Serialize wrap type to wp:wrap* element */\nfunction serializeWrap(wrap: ImageWrap): string {\n const wrapText = wrap.wrapText ? ` wrapText=\"${wrap.wrapText}\"` : ' wrapText=\"bothSides\"';\n switch (wrap.type) {\n case 'square':\n return `<wp:wrapSquare${wrapText}/>`;\n case 'tight':\n return `<wp:wrapTight${wrapText}><wp:wrapPolygon edited=\"0\"><wp:start x=\"0\" y=\"0\"/><wp:lineTo x=\"0\" y=\"21600\"/><wp:lineTo x=\"21600\" y=\"21600\"/><wp:lineTo x=\"21600\" y=\"0\"/><wp:lineTo x=\"0\" y=\"0\"/></wp:wrapPolygon></wp:wrapTight>`;\n case 'through':\n return `<wp:wrapThrough${wrapText}><wp:wrapPolygon edited=\"0\"><wp:start x=\"0\" y=\"0\"/><wp:lineTo x=\"0\" y=\"21600\"/><wp:lineTo x=\"21600\" y=\"21600\"/><wp:lineTo x=\"21600\" y=\"0\"/><wp:lineTo x=\"0\" y=\"0\"/></wp:wrapPolygon></wp:wrapThrough>`;\n case 'topAndBottom':\n return '<wp:wrapTopAndBottom/>';\n case 'behind':\n case 'inFront':\n return '<wp:wrapNone/>';\n default:\n return '<wp:wrapNone/>';\n }\n}\n\n/** Build the common a:graphic > pic:pic element for images */\nfunction serializePicGraphic(image: Image): string {\n const cx = image.size.width;\n const cy = image.size.height;\n const rId = image.rId || 'rId1';\n const id = image.id || '0';\n const name = image.filename || `image${id}`;\n\n let xfrmAttrs = '';\n if (image.transform?.rotation) {\n xfrmAttrs += ` rot=\"${Math.round(image.transform.rotation * 60000)}\"`;\n }\n if (image.transform?.flipH) xfrmAttrs += ' flipH=\"1\"';\n if (image.transform?.flipV) xfrmAttrs += ' flipV=\"1\"';\n\n return [\n '<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">',\n '<a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">',\n '<pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">',\n '<pic:nvPicPr>',\n `<pic:cNvPr id=\"${id}\" name=\"${escapeXml(name)}\"${image.alt ? ` descr=\"${escapeXml(image.alt)}\"` : ''}/>`,\n '<pic:cNvPicPr/>',\n '</pic:nvPicPr>',\n '<pic:blipFill>',\n `<a:blip r:embed=\"${rId}\"/>`,\n '<a:stretch><a:fillRect/></a:stretch>',\n '</pic:blipFill>',\n '<pic:spPr>',\n `<a:xfrm${xfrmAttrs}>`,\n '<a:off x=\"0\" y=\"0\"/>',\n `<a:ext cx=\"${cx}\" cy=\"${cy}\"/>`,\n '</a:xfrm>',\n '<a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom>',\n image.outline ? serializeOutline(image.outline) : '',\n '</pic:spPr>',\n '</pic:pic>',\n '</a:graphicData>',\n '</a:graphic>',\n ].join('');\n}\n\n/**\n * Serialize drawing/image content (w:drawing) to full DrawingML XML\n */\nfunction serializeDrawingContent(content: DrawingContent): string {\n const image = content.image;\n const isFloating = image.wrap.type !== 'inline';\n const cx = image.size.width;\n const cy = image.size.height;\n const distT = image.padding?.top ?? image.wrap.distT ?? 0;\n const distB = image.padding?.bottom ?? image.wrap.distB ?? 0;\n const distL = image.padding?.left ?? image.wrap.distL ?? 0;\n const distR = image.padding?.right ?? image.wrap.distR ?? 0;\n const docPrId = image.id || '1';\n const docPrName = image.title || image.filename || `Picture ${docPrId}`;\n\n const graphic = serializePicGraphic(image);\n\n if (!isFloating) {\n // Inline image\n return [\n '<w:drawing>',\n `<wp:inline distT=\"${distT}\" distB=\"${distB}\" distL=\"${distL}\" distR=\"${distR}\">`,\n `<wp:extent cx=\"${cx}\" cy=\"${cy}\"/>`,\n '<wp:effectExtent l=\"0\" t=\"0\" r=\"0\" b=\"0\"/>',\n `<wp:docPr id=\"${docPrId}\" name=\"${escapeXml(docPrName)}\"${image.alt ? ` descr=\"${escapeXml(image.alt)}\"` : ''}${image.decorative ? ' hidden=\"1\"' : ''}/>`,\n '<wp:cNvGraphicFramePr><a:graphicFrameLocks xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" noChangeAspect=\"1\"/></wp:cNvGraphicFramePr>',\n graphic,\n '</wp:inline>',\n '</w:drawing>',\n ].join('');\n }\n\n // Floating (anchored) image\n const behindDoc = image.wrap.type === 'behind' ? '1' : '0';\n const position = image.position\n ? serializePosition(image.position)\n : '<wp:positionH relativeFrom=\"column\"><wp:posOffset>0</wp:posOffset></wp:positionH><wp:positionV relativeFrom=\"paragraph\"><wp:posOffset>0</wp:posOffset></wp:positionV>';\n const wrap = serializeWrap(image.wrap);\n\n return [\n '<w:drawing>',\n `<wp:anchor distT=\"${distT}\" distB=\"${distB}\" distL=\"${distL}\" distR=\"${distR}\" simplePos=\"0\" relativeHeight=\"251658240\" behindDoc=\"${behindDoc}\" locked=\"0\" layoutInCell=\"1\" allowOverlap=\"1\">`,\n '<wp:simplePos x=\"0\" y=\"0\"/>',\n position,\n `<wp:extent cx=\"${cx}\" cy=\"${cy}\"/>`,\n '<wp:effectExtent l=\"0\" t=\"0\" r=\"0\" b=\"0\"/>',\n wrap,\n `<wp:docPr id=\"${docPrId}\" name=\"${escapeXml(docPrName)}\"${image.alt ? ` descr=\"${escapeXml(image.alt)}\"` : ''}/>`,\n '<wp:cNvGraphicFramePr><a:graphicFrameLocks xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" noChangeAspect=\"1\"/></wp:cNvGraphicFramePr>',\n graphic,\n '</wp:anchor>',\n '</w:drawing>',\n ].join('');\n}\n\n/** Serialize text body content for shapes/textboxes */\nfunction serializeShapeTextBody(paragraphs: Paragraph[]): string {\n return paragraphs.map((p) => serializeParagraph(p)).join('');\n}\n\n/**\n * Serialize shape content to full DrawingML XML (wps:wsp inside w:drawing)\n */\nfunction serializeShapeContent(content: ShapeContent): string {\n const shape = content.shape;\n const cx = shape.size.width;\n const cy = shape.size.height;\n const isTextBox = shape.shapeType === 'textBox';\n const isFloating = shape.wrap && shape.wrap.type !== 'inline';\n const distT = shape.wrap?.distT ?? 0;\n const distB = shape.wrap?.distB ?? 0;\n const distL = shape.wrap?.distL ?? 0;\n const distR = shape.wrap?.distR ?? 0;\n const docPrId = shape.id || '1';\n const docPrName = shape.name || (isTextBox ? `TextBox ${docPrId}` : `Shape ${docPrId}`);\n\n // Build xfrm\n let xfrmAttrs = '';\n if (shape.transform?.rotation) {\n xfrmAttrs += ` rot=\"${Math.round(shape.transform.rotation * 60000)}\"`;\n }\n if (shape.transform?.flipH) xfrmAttrs += ' flipH=\"1\"';\n if (shape.transform?.flipV) xfrmAttrs += ' flipV=\"1\"';\n\n // Build wps:spPr\n const spPr = [\n '<wps:spPr>',\n `<a:xfrm${xfrmAttrs}>`,\n '<a:off x=\"0\" y=\"0\"/>',\n `<a:ext cx=\"${cx}\" cy=\"${cy}\"/>`,\n '</a:xfrm>',\n `<a:prstGeom prst=\"${shape.shapeType === 'textBox' ? 'rect' : shape.shapeType}\"><a:avLst/></a:prstGeom>`,\n serializeFill(shape.fill),\n serializeOutline(shape.outline),\n '</wps:spPr>',\n ].join('');\n\n // Build text body if present\n let textBody = '';\n if (shape.textBody) {\n const tb = shape.textBody;\n const bpAttrs: string[] = ['rot=\"0\"', 'vert=\"horz\"'];\n if (tb.anchor) bpAttrs.push(`anchor=\"${tb.anchor === 'middle' ? 'ctr' : tb.anchor}\"`);\n if (tb.anchorCenter) bpAttrs.push('anchorCtr=\"1\"');\n if (tb.margins) {\n if (tb.margins.left != null) bpAttrs.push(`lIns=\"${tb.margins.left}\"`);\n if (tb.margins.top != null) bpAttrs.push(`tIns=\"${tb.margins.top}\"`);\n if (tb.margins.right != null) bpAttrs.push(`rIns=\"${tb.margins.right}\"`);\n if (tb.margins.bottom != null) bpAttrs.push(`bIns=\"${tb.margins.bottom}\"`);\n }\n\n if (isTextBox) {\n textBody = [\n '<wps:txbx><w:txbxContent>',\n serializeShapeTextBody(tb.content),\n '</w:txbxContent></wps:txbx>',\n `<wps:bodyPr ${bpAttrs.join(' ')}/>`,\n ].join('');\n } else {\n textBody = [`<wps:bodyPr ${bpAttrs.join(' ')}/>`].join('');\n }\n }\n\n // Build wps:wsp\n const wsp = [\n '<wps:wsp>',\n `<wps:cNvSpPr${isTextBox ? ' txBox=\"1\"' : ''}/>`,\n spPr,\n textBody,\n '</wps:wsp>',\n ].join('');\n\n // Wrap in a:graphic\n const graphic = [\n '<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">',\n '<a:graphicData uri=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\">',\n wsp,\n '</a:graphicData>',\n '</a:graphic>',\n ].join('');\n\n if (!isFloating) {\n return [\n '<w:drawing>',\n `<wp:inline distT=\"${distT}\" distB=\"${distB}\" distL=\"${distL}\" distR=\"${distR}\">`,\n `<wp:extent cx=\"${cx}\" cy=\"${cy}\"/>`,\n '<wp:effectExtent l=\"0\" t=\"0\" r=\"0\" b=\"0\"/>',\n `<wp:docPr id=\"${docPrId}\" name=\"${escapeXml(docPrName)}\"/>`,\n '<wp:cNvGraphicFramePr/>',\n graphic,\n '</wp:inline>',\n '</w:drawing>',\n ].join('');\n }\n\n // Floating shape\n const behindDoc = shape.wrap?.type === 'behind' ? '1' : '0';\n const position = shape.position\n ? serializePosition(shape.position)\n : '<wp:positionH relativeFrom=\"column\"><wp:posOffset>0</wp:posOffset></wp:positionH><wp:positionV relativeFrom=\"paragraph\"><wp:posOffset>0</wp:posOffset></wp:positionV>';\n const wrap = serializeWrap(shape.wrap!);\n\n return [\n '<w:drawing>',\n `<wp:anchor distT=\"${distT}\" distB=\"${distB}\" distL=\"${distL}\" distR=\"${distR}\" simplePos=\"0\" relativeHeight=\"251658240\" behindDoc=\"${behindDoc}\" locked=\"0\" layoutInCell=\"1\" allowOverlap=\"1\">`,\n '<wp:simplePos x=\"0\" y=\"0\"/>',\n position,\n `<wp:extent cx=\"${cx}\" cy=\"${cy}\"/>`,\n '<wp:effectExtent l=\"0\" t=\"0\" r=\"0\" b=\"0\"/>',\n wrap,\n `<wp:docPr id=\"${docPrId}\" name=\"${escapeXml(docPrName)}\"/>`,\n '<wp:cNvGraphicFramePr/>',\n graphic,\n '</wp:anchor>',\n '</w:drawing>',\n ].join('');\n}\n\n/**\n * Serialize a single run content item\n */\nfunction serializeRunContent(content: RunContent): string {\n switch (content.type) {\n case 'text':\n return serializeTextContent(content);\n case 'tab':\n return serializeTabContent(content);\n case 'break':\n return serializeBreakContent(content);\n case 'symbol':\n return serializeSymbolContent(content);\n case 'footnoteRef':\n case 'endnoteRef':\n return serializeNoteReference(content);\n case 'fieldChar':\n return serializeFieldChar(content);\n case 'instrText':\n return serializeInstrText(content);\n case 'softHyphen':\n return serializeSoftHyphen(content);\n case 'noBreakHyphen':\n return serializeNoBreakHyphen(content);\n case 'drawing':\n return serializeDrawingContent(content);\n case 'shape':\n return serializeShapeContent(content);\n default:\n return '';\n }\n}\n\n// ============================================================================\n// MAIN SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize a run to OOXML XML (w:r)\n *\n * @param run - The run to serialize\n * @returns XML string for the run\n */\nexport function serializeRun(run: Run): string {\n const parts: string[] = [];\n\n // Add run properties if present\n const rPrXml = serializeRunProperties(run.formatting, run.propertyChanges);\n if (rPrXml) {\n parts.push(rPrXml);\n }\n\n // Add run content\n for (const content of run.content) {\n const contentXml = serializeRunContent(content);\n if (contentXml) {\n parts.push(contentXml);\n }\n }\n\n return `<w:r>${parts.join('')}</w:r>`;\n}\n\n/**\n * Serialize multiple runs to OOXML XML\n *\n * @param runs - The runs to serialize\n * @returns XML string for all runs\n */\nexport function serializeRuns(runs: Run[]): string {\n return runs.map(serializeRun).join('');\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Check if a run has any content\n */\nexport function hasRunContent(run: Run): boolean {\n return run.content.length > 0;\n}\n\n/**\n * Check if a run has formatting\n */\nexport function hasRunFormatting(run: Run): boolean {\n return run.formatting !== undefined && Object.keys(run.formatting).length > 0;\n}\n\n/**\n * Get plain text from a run (for comparison/debugging)\n */\nexport function getRunPlainText(run: Run): string {\n return run.content\n .filter((c): c is TextContent => c.type === 'text')\n .map((c) => c.text)\n .join('');\n}\n\n/**\n * Create an empty run\n */\nexport function createEmptyRun(): Run {\n return {\n type: 'run',\n content: [],\n };\n}\n\n/**\n * Create a text run\n */\nexport function createTextRun(text: string, formatting?: TextFormatting): Run {\n return {\n type: 'run',\n formatting,\n content: [{ type: 'text', text }],\n };\n}\n\n/**\n * Create a break run\n */\nexport function createBreakRun(\n breakType?: 'page' | 'column' | 'textWrapping',\n formatting?: TextFormatting\n): Run {\n return {\n type: 'run',\n formatting,\n content: [{ type: 'break', breakType }],\n };\n}\n\n/**\n * Create a tab run\n */\nexport function createTabRun(formatting?: TextFormatting): Run {\n return {\n type: 'run',\n formatting,\n content: [{ type: 'tab' }],\n };\n}\n\nexport default serializeRun;\n","/**\n * Paragraph Serializer - Serialize paragraphs to OOXML XML\n *\n * Converts Paragraph objects back to <w:p> XML format for DOCX files.\n * Handles all paragraph properties and child content (runs, hyperlinks, fields, bookmarks).\n *\n * OOXML Reference:\n * - Paragraph: w:p\n * - Paragraph properties: w:pPr\n * - Runs, hyperlinks, bookmarks, fields as child elements\n */\n\nimport type {\n Paragraph,\n ParagraphContent,\n ParagraphFormatting,\n Run,\n Hyperlink,\n BookmarkStart,\n BookmarkEnd,\n SimpleField,\n ComplexField,\n InlineSdt,\n Insertion,\n Deletion,\n MoveFrom,\n MoveTo,\n MoveFromRangeStart,\n MoveToRangeStart,\n ParagraphPropertyChange,\n TabStop,\n BorderSpec,\n ShadingProperties,\n TextFormatting,\n} from '../../types/document';\n\nimport { serializeRun, serializeTextFormatting } from './runSerializer';\n\nimport { escapeXml } from './xmlUtils';\n\n// ============================================================================\n// BORDER SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize a single border element\n */\nfunction serializeBorder(border: BorderSpec | undefined, elementName: string): string {\n if (!border || border.style === 'none' || border.style === 'nil') {\n return '';\n }\n\n const attrs: string[] = [`w:val=\"${border.style}\"`];\n\n if (border.size !== undefined) {\n attrs.push(`w:sz=\"${border.size}\"`);\n }\n\n if (border.space !== undefined) {\n attrs.push(`w:space=\"${border.space}\"`);\n }\n\n // Color\n if (border.color) {\n if (border.color.auto) {\n attrs.push('w:color=\"auto\"');\n } else if (border.color.rgb) {\n attrs.push(`w:color=\"${border.color.rgb}\"`);\n }\n\n if (border.color.themeColor) {\n attrs.push(`w:themeColor=\"${border.color.themeColor}\"`);\n }\n\n if (border.color.themeTint) {\n attrs.push(`w:themeTint=\"${border.color.themeTint}\"`);\n }\n\n if (border.color.themeShade) {\n attrs.push(`w:themeShade=\"${border.color.themeShade}\"`);\n }\n }\n\n if (border.shadow) {\n attrs.push('w:shadow=\"true\"');\n }\n\n if (border.frame) {\n attrs.push('w:frame=\"true\"');\n }\n\n return `<w:${elementName} ${attrs.join(' ')}/>`;\n}\n\n/**\n * Serialize paragraph borders (w:pBdr)\n */\nfunction serializeParagraphBorders(borders: ParagraphFormatting['borders']): string {\n if (!borders) return '';\n\n const parts: string[] = [];\n\n if (borders.top) {\n const topXml = serializeBorder(borders.top, 'top');\n if (topXml) parts.push(topXml);\n }\n\n if (borders.left) {\n const leftXml = serializeBorder(borders.left, 'left');\n if (leftXml) parts.push(leftXml);\n }\n\n if (borders.bottom) {\n const bottomXml = serializeBorder(borders.bottom, 'bottom');\n if (bottomXml) parts.push(bottomXml);\n }\n\n if (borders.right) {\n const rightXml = serializeBorder(borders.right, 'right');\n if (rightXml) parts.push(rightXml);\n }\n\n if (borders.between) {\n const betweenXml = serializeBorder(borders.between, 'between');\n if (betweenXml) parts.push(betweenXml);\n }\n\n if (borders.bar) {\n const barXml = serializeBorder(borders.bar, 'bar');\n if (barXml) parts.push(barXml);\n }\n\n if (parts.length === 0) return '';\n\n return `<w:pBdr>${parts.join('')}</w:pBdr>`;\n}\n\n// ============================================================================\n// SHADING SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize shading properties (w:shd)\n */\nfunction serializeShading(shading: ShadingProperties | undefined): string {\n if (!shading) return '';\n\n const attrs: string[] = [];\n\n // Pattern/val\n if (shading.pattern) {\n attrs.push(`w:val=\"${shading.pattern}\"`);\n } else {\n attrs.push('w:val=\"clear\"');\n }\n\n // Color (pattern color)\n if (shading.color?.rgb) {\n attrs.push(`w:color=\"${shading.color.rgb}\"`);\n } else if (shading.color?.auto) {\n attrs.push('w:color=\"auto\"');\n }\n\n // Fill (background color)\n if (shading.fill?.rgb) {\n attrs.push(`w:fill=\"${shading.fill.rgb}\"`);\n } else if (shading.fill?.auto) {\n attrs.push('w:fill=\"auto\"');\n }\n\n // Theme fill\n if (shading.fill?.themeColor) {\n attrs.push(`w:themeFill=\"${shading.fill.themeColor}\"`);\n }\n\n if (shading.fill?.themeTint) {\n attrs.push(`w:themeFillTint=\"${shading.fill.themeTint}\"`);\n }\n\n if (shading.fill?.themeShade) {\n attrs.push(`w:themeFillShade=\"${shading.fill.themeShade}\"`);\n }\n\n if (attrs.length === 0) return '';\n\n return `<w:shd ${attrs.join(' ')}/>`;\n}\n\n// ============================================================================\n// TAB STOPS SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize tab stops (w:tabs)\n */\nfunction serializeTabStops(tabs: TabStop[] | undefined): string {\n if (!tabs || tabs.length === 0) return '';\n\n const tabElements = tabs.map((tab) => {\n const attrs: string[] = [`w:val=\"${tab.alignment}\"`, `w:pos=\"${tab.position}\"`];\n\n if (tab.leader && tab.leader !== 'none') {\n attrs.push(`w:leader=\"${tab.leader}\"`);\n }\n\n return `<w:tab ${attrs.join(' ')}/>`;\n });\n\n return `<w:tabs>${tabElements.join('')}</w:tabs>`;\n}\n\n// ============================================================================\n// SPACING SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize spacing properties (w:spacing)\n */\nfunction serializeSpacing(formatting: ParagraphFormatting): string {\n const attrs: string[] = [];\n\n if (formatting.spaceBefore !== undefined) {\n attrs.push(`w:before=\"${formatting.spaceBefore}\"`);\n }\n\n if (formatting.spaceAfter !== undefined) {\n attrs.push(`w:after=\"${formatting.spaceAfter}\"`);\n }\n\n if (formatting.lineSpacing !== undefined) {\n attrs.push(`w:line=\"${formatting.lineSpacing}\"`);\n }\n\n if (formatting.lineSpacingRule) {\n attrs.push(`w:lineRule=\"${formatting.lineSpacingRule}\"`);\n }\n\n if (formatting.beforeAutospacing) {\n attrs.push('w:beforeAutospacing=\"1\"');\n }\n\n if (formatting.afterAutospacing) {\n attrs.push('w:afterAutospacing=\"1\"');\n }\n\n if (attrs.length === 0) return '';\n\n return `<w:spacing ${attrs.join(' ')}/>`;\n}\n\n// ============================================================================\n// INDENTATION SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize indentation properties (w:ind)\n */\nfunction serializeIndentation(formatting: ParagraphFormatting): string {\n const attrs: string[] = [];\n\n if (formatting.indentLeft !== undefined) {\n attrs.push(`w:left=\"${formatting.indentLeft}\"`);\n }\n\n if (formatting.indentRight !== undefined) {\n attrs.push(`w:right=\"${formatting.indentRight}\"`);\n }\n\n if (formatting.indentFirstLine !== undefined) {\n if (formatting.hangingIndent) {\n // Hanging indent is stored as positive value but uses w:hanging attribute\n attrs.push(`w:hanging=\"${Math.abs(formatting.indentFirstLine)}\"`);\n } else if (formatting.indentFirstLine !== 0) {\n attrs.push(`w:firstLine=\"${formatting.indentFirstLine}\"`);\n }\n }\n\n if (attrs.length === 0) return '';\n\n return `<w:ind ${attrs.join(' ')}/>`;\n}\n\n// ============================================================================\n// NUMBERING SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize numbering properties (w:numPr)\n */\nfunction serializeNumbering(numPr: ParagraphFormatting['numPr']): string {\n if (!numPr) return '';\n\n const parts: string[] = [];\n\n if (numPr.ilvl !== undefined) {\n parts.push(`<w:ilvl w:val=\"${numPr.ilvl}\"/>`);\n }\n\n if (numPr.numId !== undefined) {\n parts.push(`<w:numId w:val=\"${numPr.numId}\"/>`);\n }\n\n if (parts.length === 0) return '';\n\n return `<w:numPr>${parts.join('')}</w:numPr>`;\n}\n\n// ============================================================================\n// FRAME PROPERTIES SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize frame properties (w:framePr)\n */\nfunction serializeFrameProperties(frame: ParagraphFormatting['frame']): string {\n if (!frame) return '';\n\n const attrs: string[] = [];\n\n if (frame.width !== undefined) {\n attrs.push(`w:w=\"${frame.width}\"`);\n }\n\n if (frame.height !== undefined) {\n attrs.push(`w:h=\"${frame.height}\"`);\n }\n\n if (frame.hAnchor) {\n attrs.push(`w:hAnchor=\"${frame.hAnchor}\"`);\n }\n\n if (frame.vAnchor) {\n attrs.push(`w:vAnchor=\"${frame.vAnchor}\"`);\n }\n\n if (frame.x !== undefined) {\n attrs.push(`w:x=\"${frame.x}\"`);\n }\n\n if (frame.y !== undefined) {\n attrs.push(`w:y=\"${frame.y}\"`);\n }\n\n if (frame.xAlign) {\n attrs.push(`w:xAlign=\"${frame.xAlign}\"`);\n }\n\n if (frame.yAlign) {\n attrs.push(`w:yAlign=\"${frame.yAlign}\"`);\n }\n\n if (frame.wrap) {\n attrs.push(`w:wrap=\"${frame.wrap}\"`);\n }\n\n if (attrs.length === 0) return '';\n\n return `<w:framePr ${attrs.join(' ')}/>`;\n}\n\n// ============================================================================\n// PARAGRAPH PROPERTIES SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize paragraph formatting properties to w:pPr XML\n */\nexport function serializeParagraphFormatting(\n formatting: ParagraphFormatting | undefined,\n propertyChanges?: ParagraphPropertyChange[]\n): string {\n const parts: string[] = [];\n\n if (formatting) {\n // Style reference (must be first)\n if (formatting.styleId) {\n parts.push(`<w:pStyle w:val=\"${escapeXml(formatting.styleId)}\"/>`);\n }\n\n // Keep next/lines/widow\n if (formatting.keepNext) {\n parts.push('<w:keepNext/>');\n }\n\n if (formatting.keepLines) {\n parts.push('<w:keepLines/>');\n }\n\n if (formatting.contextualSpacing) {\n parts.push('<w:contextualSpacing/>');\n }\n\n if (formatting.pageBreakBefore) {\n parts.push('<w:pageBreakBefore/>');\n }\n\n // Frame properties\n const frameXml = serializeFrameProperties(formatting.frame);\n if (frameXml) {\n parts.push(frameXml);\n }\n\n // Widow control\n if (formatting.widowControl === false) {\n parts.push('<w:widowControl w:val=\"0\"/>');\n } else if (formatting.widowControl === true) {\n parts.push('<w:widowControl/>');\n }\n\n // Numbering\n const numPrXml = serializeNumbering(formatting.numPr);\n if (numPrXml) {\n parts.push(numPrXml);\n }\n\n // Paragraph borders\n const bordersXml = serializeParagraphBorders(formatting.borders);\n if (bordersXml) {\n parts.push(bordersXml);\n }\n\n // Shading\n const shadingXml = serializeShading(formatting.shading);\n if (shadingXml) {\n parts.push(shadingXml);\n }\n\n // Tabs\n const tabsXml = serializeTabStops(formatting.tabs);\n if (tabsXml) {\n parts.push(tabsXml);\n }\n\n // Suppress line numbers\n if (formatting.suppressLineNumbers) {\n parts.push('<w:suppressLineNumbers/>');\n }\n\n // Suppress auto hyphens\n if (formatting.suppressAutoHyphens) {\n parts.push('<w:suppressAutoHyphens/>');\n }\n\n // Spacing\n const spacingXml = serializeSpacing(formatting);\n if (spacingXml) {\n parts.push(spacingXml);\n }\n\n // Indentation\n const indXml = serializeIndentation(formatting);\n if (indXml) {\n parts.push(indXml);\n }\n\n // Text direction (bidi)\n if (formatting.bidi) {\n parts.push('<w:bidi/>');\n }\n\n // Justification\n if (formatting.alignment) {\n parts.push(`<w:jc w:val=\"${formatting.alignment}\"/>`);\n }\n\n // Outline level\n if (formatting.outlineLevel !== undefined) {\n parts.push(`<w:outlineLvl w:val=\"${formatting.outlineLevel}\"/>`);\n }\n\n // Run properties (default run formatting for paragraph)\n if (formatting.runProperties) {\n const rPrXml = serializeTextFormatting(formatting.runProperties);\n if (rPrXml) {\n parts.push(rPrXml);\n }\n }\n }\n\n if (propertyChanges && propertyChanges.length > 0) {\n parts.push(...propertyChanges.map((change) => serializeParagraphPropertyChange(change)));\n }\n\n if (parts.length === 0) return '';\n\n return `<w:pPr>${parts.join('')}</w:pPr>`;\n}\n\nfunction extractPPrInner(pPrXml: string): string {\n if (!pPrXml.startsWith('<w:pPr>') || !pPrXml.endsWith('</w:pPr>')) {\n return '';\n }\n return pPrXml.slice('<w:pPr>'.length, -'</w:pPr>'.length);\n}\n\nfunction serializeParagraphPropertyChange(change: ParagraphPropertyChange): string {\n const normalizedId = Number.isInteger(change.info.id) && change.info.id >= 0 ? change.info.id : 0;\n const authorCandidate = typeof change.info.author === 'string' ? change.info.author.trim() : '';\n const normalizedAuthor = authorCandidate.length > 0 ? authorCandidate : 'Unknown';\n const normalizedDate = typeof change.info.date === 'string' ? change.info.date.trim() : undefined;\n const normalizedRsid = typeof change.info.rsid === 'string' ? change.info.rsid.trim() : undefined;\n const attrs = [`w:id=\"${normalizedId}\"`, `w:author=\"${escapeXml(normalizedAuthor)}\"`];\n if (normalizedDate) {\n attrs.push(`w:date=\"${escapeXml(normalizedDate)}\"`);\n }\n if (normalizedRsid) {\n attrs.push(`w:rsid=\"${escapeXml(normalizedRsid)}\"`);\n }\n\n const previousPPrXml = serializeParagraphFormatting(change.previousFormatting) || '<w:pPr/>';\n const previousPPrInner = extractPPrInner(previousPPrXml);\n const normalizedPreviousPPr =\n previousPPrInner.length > 0 ? `<w:pPr>${previousPPrInner}</w:pPr>` : '<w:pPr/>';\n return `<w:pPrChange ${attrs.join(' ')}>${normalizedPreviousPPr}</w:pPrChange>`;\n}\n\n// ============================================================================\n// CONTENT SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize a hyperlink (w:hyperlink)\n */\nfunction serializeHyperlink(hyperlink: Hyperlink): string {\n const attrs: string[] = [];\n\n if (hyperlink.rId) {\n attrs.push(`r:id=\"${hyperlink.rId}\"`);\n }\n\n if (hyperlink.anchor) {\n attrs.push(`w:anchor=\"${escapeXml(hyperlink.anchor)}\"`);\n }\n\n if (hyperlink.tooltip) {\n attrs.push(`w:tooltip=\"${escapeXml(hyperlink.tooltip)}\"`);\n }\n\n if (hyperlink.target) {\n attrs.push(`w:tgtFrame=\"${escapeXml(hyperlink.target)}\"`);\n }\n\n if (hyperlink.history === false) {\n attrs.push('w:history=\"0\"');\n }\n\n if (hyperlink.docLocation) {\n attrs.push(`w:docLocation=\"${escapeXml(hyperlink.docLocation)}\"`);\n }\n\n // Serialize children\n const childrenXml = hyperlink.children\n .map((child) => {\n if (child.type === 'run') {\n return serializeRun(child);\n } else if (child.type === 'bookmarkStart') {\n return serializeBookmarkStart(child);\n } else if (child.type === 'bookmarkEnd') {\n return serializeBookmarkEnd(child);\n }\n return '';\n })\n .join('');\n\n const attrsStr = attrs.length > 0 ? ' ' + attrs.join(' ') : '';\n return `<w:hyperlink${attrsStr}>${childrenXml}</w:hyperlink>`;\n}\n\n/**\n * Serialize bookmark start (w:bookmarkStart)\n */\nfunction serializeBookmarkStart(bookmark: BookmarkStart): string {\n const attrs: string[] = [`w:id=\"${bookmark.id}\"`, `w:name=\"${escapeXml(bookmark.name)}\"`];\n\n if (bookmark.colFirst !== undefined) {\n attrs.push(`w:colFirst=\"${bookmark.colFirst}\"`);\n }\n\n if (bookmark.colLast !== undefined) {\n attrs.push(`w:colLast=\"${bookmark.colLast}\"`);\n }\n\n return `<w:bookmarkStart ${attrs.join(' ')}/>`;\n}\n\n/**\n * Serialize bookmark end (w:bookmarkEnd)\n */\nfunction serializeBookmarkEnd(bookmark: BookmarkEnd): string {\n return `<w:bookmarkEnd w:id=\"${bookmark.id}\"/>`;\n}\n\n/**\n * Serialize a simple field as a complex field (fldChar begin/separate/end).\n * Complex field format is more widely supported by OOXML consumers\n * (Google Docs, Apple Pages) than w:fldSimple.\n */\nfunction serializeSimpleField(field: SimpleField): string {\n const parts: string[] = [];\n\n // Extract formatting from the first content run\n const firstRun = field.content.find((c): c is Run => c.type === 'run');\n const rPrXml = firstRun?.formatting ? serializeTextFormatting(firstRun.formatting) : '';\n\n // Begin field character\n const beginAttrs: string[] = ['w:fldCharType=\"begin\"'];\n if (field.fldLock) {\n beginAttrs.push('w:fldLock=\"true\"');\n }\n parts.push(`<w:r>${rPrXml}<w:fldChar ${beginAttrs.join(' ')}/></w:r>`);\n\n // Field code (instrText)\n const needsPreserve =\n field.instruction.startsWith(' ') ||\n field.instruction.endsWith(' ') ||\n field.instruction.includes(' ');\n const spaceAttr = needsPreserve ? ' xml:space=\"preserve\"' : '';\n parts.push(\n `<w:r>${rPrXml}<w:instrText${spaceAttr}>${escapeXml(field.instruction)}</w:instrText></w:r>`\n );\n\n // Separate field character\n parts.push(`<w:r>${rPrXml}<w:fldChar w:fldCharType=\"separate\"/></w:r>`);\n\n // Field result (the display runs)\n for (const item of field.content) {\n if (item.type === 'run') {\n parts.push(serializeRun(item));\n }\n }\n\n // End field character\n parts.push(`<w:r>${rPrXml}<w:fldChar w:fldCharType=\"end\"/></w:r>`);\n\n return parts.join('');\n}\n\n/**\n * Serialize a complex field\n * Complex fields are represented by multiple runs with fldChar elements,\n * so we convert them back to that structure\n */\nfunction serializeComplexField(field: ComplexField): string {\n const parts: string[] = [];\n\n // Extract formatting from the first result run to apply to structural runs\n // (begin/separate/end). OOXML consumers expect consistent formatting across\n // all runs in a complex field.\n const resultFormatting = field.fieldResult?.[0]?.formatting;\n const rPrXml = resultFormatting ? serializeTextFormatting(resultFormatting) : '';\n\n // Begin field character (never set dirty — dirty causes apps to recalculate\n // and potentially discard run formatting)\n const beginAttrs: string[] = ['w:fldCharType=\"begin\"'];\n if (field.fldLock) {\n beginAttrs.push('w:fldLock=\"true\"');\n }\n parts.push(`<w:r>${rPrXml}<w:fldChar ${beginAttrs.join(' ')}/></w:r>`);\n\n // Field code (instrText)\n if (field.fieldCode.length > 0) {\n parts.push(...field.fieldCode.map((run) => serializeRun(run)));\n } else {\n // Fallback: create instrText from instruction\n const needsPreserve =\n field.instruction.startsWith(' ') ||\n field.instruction.endsWith(' ') ||\n field.instruction.includes(' ');\n const spaceAttr = needsPreserve ? ' xml:space=\"preserve\"' : '';\n parts.push(\n `<w:r>${rPrXml}<w:instrText${spaceAttr}>${escapeXml(field.instruction)}</w:instrText></w:r>`\n );\n }\n\n // Separate field character\n parts.push(`<w:r>${rPrXml}<w:fldChar w:fldCharType=\"separate\"/></w:r>`);\n\n // Field result\n parts.push(...field.fieldResult.map((run) => serializeRun(run)));\n\n // End field character\n parts.push(`<w:r>${rPrXml}<w:fldChar w:fldCharType=\"end\"/></w:r>`);\n\n return parts.join('');\n}\n\n/**\n * Serialize an inline SDT (w:sdt)\n */\nfunction serializeInlineSdt(sdt: InlineSdt): string {\n const props = sdt.properties;\n const prParts: string[] = [];\n\n if (props.alias) prParts.push(`<w:alias w:val=\"${escapeXml(props.alias)}\"/>`);\n if (props.tag) prParts.push(`<w:tag w:val=\"${escapeXml(props.tag)}\"/>`);\n if (props.lock && props.lock !== 'unlocked') prParts.push(`<w:lock w:val=\"${props.lock}\"/>`);\n if (props.showingPlaceholder) prParts.push('<w:showingPlcHdr/>');\n\n // Type-specific properties\n switch (props.sdtType) {\n case 'plainText':\n prParts.push('<w:text/>');\n break;\n case 'date':\n if (props.dateFormat) {\n prParts.push(`<w:date w:fullDate=\"${escapeXml(props.dateFormat)}\"/>`);\n } else {\n prParts.push('<w:date/>');\n }\n break;\n case 'dropdown': {\n const items = (props.listItems ?? [])\n .map(\n (i) =>\n `<w:listItem w:displayText=\"${escapeXml(i.displayText)}\" w:value=\"${escapeXml(i.value)}\"/>`\n )\n .join('');\n prParts.push(`<w:dropDownList>${items}</w:dropDownList>`);\n break;\n }\n case 'comboBox': {\n const items = (props.listItems ?? [])\n .map(\n (i) =>\n `<w:listItem w:displayText=\"${escapeXml(i.displayText)}\" w:value=\"${escapeXml(i.value)}\"/>`\n )\n .join('');\n prParts.push(`<w:comboBox>${items}</w:comboBox>`);\n break;\n }\n case 'checkbox':\n prParts.push(\n `<w14:checkbox><w14:checked w14:val=\"${props.checked ? '1' : '0'}\"/></w14:checkbox>`\n );\n break;\n case 'picture':\n prParts.push('<w:picture/>');\n break;\n }\n\n const contentXml = sdt.content\n .map((item) => {\n if (item.type === 'run') return serializeRun(item);\n if (item.type === 'hyperlink') return serializeHyperlink(item);\n return '';\n })\n .join('');\n\n return `<w:sdt><w:sdtPr>${prParts.join('')}</w:sdtPr><w:sdtContent>${contentXml}</w:sdtContent></w:sdt>`;\n}\n\nfunction serializeMoveRangeStart(\n tag: 'moveFromRangeStart' | 'moveToRangeStart',\n marker: MoveFromRangeStart | MoveToRangeStart\n): string {\n const attrs = [`w:id=\"${marker.id}\"`, `w:name=\"${escapeXml(marker.name)}\"`];\n return `<w:${tag} ${attrs.join(' ')}/>`;\n}\n\n/**\n * Serialize a tracked change wrapper (ins/del/moveFrom/moveTo)\n */\nfunction serializeTrackedChange(\n tag: 'ins' | 'del' | 'moveFrom' | 'moveTo',\n change: Insertion | Deletion | MoveFrom | MoveTo\n): string {\n const info = change.info;\n const normalizedId = Number.isInteger(info.id) && info.id >= 0 ? info.id : 0;\n const authorCandidate = typeof info.author === 'string' ? info.author.trim() : '';\n const normalizedAuthor = authorCandidate.length > 0 ? authorCandidate : 'Unknown';\n const normalizedDate = typeof info.date === 'string' ? info.date.trim() : undefined;\n const attrs = [`w:id=\"${normalizedId}\"`, `w:author=\"${escapeXml(normalizedAuthor)}\"`];\n if (normalizedDate) attrs.push(`w:date=\"${escapeXml(normalizedDate)}\"`);\n\n const contentXml = change.content\n .map((item) => {\n if (item.type === 'run') {\n if (tag === 'del' || tag === 'moveFrom') {\n return serializeRun(item)\n .replace(/<w:t\\b/g, '<w:delText')\n .replace(/<\\/w:t>/g, '</w:delText>')\n .replace(/<w:instrText\\b/g, '<w:delInstrText')\n .replace(/<\\/w:instrText>/g, '</w:delInstrText>');\n }\n return serializeRun(item);\n }\n if (item.type === 'hyperlink') return serializeHyperlink(item);\n return '';\n })\n .join('');\n\n return `<w:${tag} ${attrs.join(' ')}>${contentXml}</w:${tag}>`;\n}\n\n/**\n * Serialize a single paragraph content item\n */\nfunction serializeParagraphContent(content: ParagraphContent): string {\n switch (content.type) {\n case 'run':\n return serializeRun(content);\n case 'hyperlink':\n return serializeHyperlink(content);\n case 'bookmarkStart':\n return serializeBookmarkStart(content);\n case 'bookmarkEnd':\n return serializeBookmarkEnd(content);\n case 'simpleField':\n return serializeSimpleField(content);\n case 'complexField':\n return serializeComplexField(content);\n case 'inlineSdt':\n return serializeInlineSdt(content);\n case 'commentRangeStart':\n return `<w:commentRangeStart w:id=\"${content.id}\"/>`;\n case 'commentRangeEnd':\n return (\n `<w:commentRangeEnd w:id=\"${content.id}\"/>` +\n `<w:r><w:rPr><w:rStyle w:val=\"CommentReference\"/></w:rPr><w:commentReference w:id=\"${content.id}\"/></w:r>`\n );\n case 'insertion':\n return serializeTrackedChange('ins', content);\n case 'deletion':\n return serializeTrackedChange('del', content);\n case 'moveFrom':\n return serializeTrackedChange('moveFrom', content);\n case 'moveTo':\n return serializeTrackedChange('moveTo', content);\n case 'moveFromRangeStart':\n return serializeMoveRangeStart('moveFromRangeStart', content as MoveFromRangeStart);\n case 'moveFromRangeEnd':\n return `<w:moveFromRangeEnd w:id=\"${content.id}\"/>`;\n case 'moveToRangeStart':\n return serializeMoveRangeStart('moveToRangeStart', content as MoveToRangeStart);\n case 'moveToRangeEnd':\n return `<w:moveToRangeEnd w:id=\"${content.id}\"/>`;\n case 'mathEquation':\n // Round-trip the raw OMML XML directly\n return content.ommlXml || '';\n default:\n return '';\n }\n}\n\n// ============================================================================\n// MAIN SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize a paragraph to OOXML XML (w:p)\n *\n * @param paragraph - The paragraph to serialize\n * @returns XML string for the paragraph\n */\nexport function serializeParagraph(paragraph: Paragraph): string {\n const parts: string[] = [];\n\n // Paragraph ID attributes\n const attrs: string[] = [];\n if (paragraph.paraId) {\n attrs.push(`w14:paraId=\"${paragraph.paraId}\"`);\n }\n if (paragraph.textId) {\n attrs.push(`w14:textId=\"${paragraph.textId}\"`);\n }\n const attrsStr = attrs.length > 0 ? ' ' + attrs.join(' ') : '';\n\n // Add paragraph properties if present\n const pPrXml = serializeParagraphFormatting(paragraph.formatting, paragraph.propertyChanges);\n if (pPrXml) {\n parts.push(pPrXml);\n }\n\n // Add paragraph content\n for (const content of paragraph.content) {\n const contentXml = serializeParagraphContent(content);\n if (contentXml) {\n parts.push(contentXml);\n }\n }\n\n return `<w:p${attrsStr}>${parts.join('')}</w:p>`;\n}\n\n/**\n * Serialize multiple paragraphs to OOXML XML\n *\n * @param paragraphs - The paragraphs to serialize\n * @returns XML string for all paragraphs\n */\nexport function serializeParagraphs(paragraphs: Paragraph[]): string {\n return paragraphs.map(serializeParagraph).join('');\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Check if a paragraph has any content\n */\nexport function hasParagraphContent(paragraph: Paragraph): boolean {\n return paragraph.content.length > 0;\n}\n\n/**\n * Check if a paragraph has formatting\n */\nexport function hasParagraphFormatting(paragraph: Paragraph): boolean {\n return paragraph.formatting !== undefined && Object.keys(paragraph.formatting).length > 0;\n}\n\n/**\n * Get plain text from a paragraph (for comparison/debugging)\n */\nexport function getParagraphPlainText(paragraph: Paragraph): string {\n const texts: string[] = [];\n\n for (const content of paragraph.content) {\n if (content.type === 'run') {\n for (const item of content.content) {\n if (item.type === 'text') {\n texts.push(item.text);\n } else if (item.type === 'tab') {\n texts.push('\\t');\n } else if (item.type === 'break') {\n texts.push('\\n');\n }\n }\n } else if (content.type === 'hyperlink') {\n for (const child of content.children) {\n if (child.type === 'run') {\n for (const item of child.content) {\n if (item.type === 'text') {\n texts.push(item.text);\n }\n }\n }\n }\n } else if (content.type === 'simpleField') {\n for (const item of content.content) {\n if (item.type === 'run') {\n for (const subItem of item.content) {\n if (subItem.type === 'text') {\n texts.push(subItem.text);\n }\n }\n }\n }\n } else if (content.type === 'complexField') {\n for (const run of content.fieldResult) {\n for (const item of run.content) {\n if (item.type === 'text') {\n texts.push(item.text);\n }\n }\n }\n } else if (content.type === 'inlineSdt') {\n for (const item of content.content) {\n if (item.type === 'run') {\n for (const subItem of item.content) {\n if (subItem.type === 'text') {\n texts.push(subItem.text);\n }\n }\n }\n }\n } else if (\n content.type === 'insertion' ||\n content.type === 'deletion' ||\n content.type === 'moveFrom' ||\n content.type === 'moveTo'\n ) {\n for (const item of content.content) {\n if (item.type === 'run') {\n for (const subItem of item.content) {\n if (subItem.type === 'text') {\n texts.push(subItem.text);\n }\n }\n }\n }\n }\n }\n\n return texts.join('');\n}\n\n/**\n * Create an empty paragraph\n */\nexport function createEmptyParagraph(formatting?: ParagraphFormatting): Paragraph {\n return {\n type: 'paragraph',\n formatting,\n content: [],\n };\n}\n\n/**\n * Create a paragraph with a single text run\n */\nexport function createTextParagraph(\n text: string,\n paragraphFormatting?: ParagraphFormatting,\n textFormatting?: TextFormatting\n): Paragraph {\n return {\n type: 'paragraph',\n formatting: paragraphFormatting,\n content: [\n {\n type: 'run',\n formatting: textFormatting,\n content: [{ type: 'text', text }],\n },\n ],\n };\n}\n\n/**\n * Check if paragraph is a list item\n */\nexport function isListParagraph(paragraph: Paragraph): boolean {\n return paragraph.formatting?.numPr !== undefined;\n}\n\n/**\n * Get list level of a paragraph (0-8, or -1 if not a list)\n */\nexport function getListLevel(paragraph: Paragraph): number {\n return paragraph.formatting?.numPr?.ilvl ?? -1;\n}\n\nexport default serializeParagraph;\n","/**\n * Table Serializer - Serialize tables to OOXML XML\n *\n * Converts Table objects back to <w:tbl> XML format for DOCX files.\n * Handles all table, row, and cell properties including merged cells.\n *\n * OOXML Reference:\n * - Table: w:tbl\n * - Table properties: w:tblPr\n * - Table grid: w:tblGrid\n * - Table row: w:tr\n * - Row properties: w:trPr\n * - Table cell: w:tc\n * - Cell properties: w:tcPr\n */\n\nimport type {\n Table,\n TableRow,\n TableCell,\n TableFormatting,\n TableRowFormatting,\n TableCellFormatting,\n TablePropertyChange,\n TableRowPropertyChange,\n TableCellPropertyChange,\n TableStructuralChangeInfo,\n TableMeasurement,\n TableBorders,\n TableLook,\n CellMargins,\n FloatingTableProperties,\n ConditionalFormatStyle,\n BorderSpec,\n ShadingProperties,\n Paragraph,\n} from '../../types/document';\n\nimport { serializeParagraph } from './paragraphSerializer';\nimport { escapeXml } from './xmlUtils';\n\nfunction normalizeTrackedChangeInfo(info: { id: number; author: string; date?: string }): {\n id: number;\n author: string;\n date?: string;\n} {\n const normalizedId = Number.isInteger(info.id) && info.id >= 0 ? info.id : 0;\n const authorCandidate = typeof info.author === 'string' ? info.author.trim() : '';\n const normalizedAuthor = authorCandidate.length > 0 ? authorCandidate : 'Unknown';\n const normalizedDate = typeof info.date === 'string' ? info.date.trim() : undefined;\n\n return {\n id: normalizedId,\n author: normalizedAuthor,\n date: normalizedDate,\n };\n}\n\nfunction serializeTrackedChangeAttributes(\n info: { id: number; author: string; date?: string },\n rsid?: string\n): string {\n const normalized = normalizeTrackedChangeInfo(info);\n const attrs = [`w:id=\"${normalized.id}\"`, `w:author=\"${escapeXml(normalized.author)}\"`];\n if (normalized.date) {\n attrs.push(`w:date=\"${escapeXml(normalized.date)}\"`);\n }\n if (rsid && rsid.trim().length > 0) {\n attrs.push(`w:rsid=\"${escapeXml(rsid.trim())}\"`);\n }\n return attrs.join(' ');\n}\n\n// ============================================================================\n// MEASUREMENT SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize a table measurement (width, height)\n */\nfunction serializeMeasurement(\n measurement: TableMeasurement | undefined,\n elementName: string\n): string {\n if (!measurement) return '';\n\n const attrs: string[] = [`w:w=\"${measurement.value}\"`, `w:type=\"${measurement.type}\"`];\n\n return `<w:${elementName} ${attrs.join(' ')}/>`;\n}\n\n// ============================================================================\n// BORDER SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize a single border element\n */\nfunction serializeBorder(border: BorderSpec | undefined, elementName: string): string {\n if (!border || border.style === 'none' || border.style === 'nil') {\n return '';\n }\n\n const attrs: string[] = [`w:val=\"${border.style}\"`];\n\n if (border.size !== undefined) {\n attrs.push(`w:sz=\"${border.size}\"`);\n }\n\n if (border.space !== undefined) {\n attrs.push(`w:space=\"${border.space}\"`);\n }\n\n // Color\n if (border.color) {\n if (border.color.auto) {\n attrs.push('w:color=\"auto\"');\n } else if (border.color.rgb) {\n attrs.push(`w:color=\"${border.color.rgb}\"`);\n }\n\n if (border.color.themeColor) {\n attrs.push(`w:themeColor=\"${border.color.themeColor}\"`);\n }\n\n if (border.color.themeTint) {\n attrs.push(`w:themeTint=\"${border.color.themeTint}\"`);\n }\n\n if (border.color.themeShade) {\n attrs.push(`w:themeShade=\"${border.color.themeShade}\"`);\n }\n }\n\n if (border.shadow) {\n attrs.push('w:shadow=\"true\"');\n }\n\n if (border.frame) {\n attrs.push('w:frame=\"true\"');\n }\n\n return `<w:${elementName} ${attrs.join(' ')}/>`;\n}\n\n/**\n * Serialize table borders (w:tblBorders or w:tcBorders)\n */\nfunction serializeTableBorders(borders: TableBorders | undefined, elementName: string): string {\n if (!borders) return '';\n\n const parts: string[] = [];\n\n if (borders.top) {\n const topXml = serializeBorder(borders.top, 'top');\n if (topXml) parts.push(topXml);\n }\n\n if (borders.left) {\n const leftXml = serializeBorder(borders.left, 'left');\n if (leftXml) parts.push(leftXml);\n }\n\n if (borders.bottom) {\n const bottomXml = serializeBorder(borders.bottom, 'bottom');\n if (bottomXml) parts.push(bottomXml);\n }\n\n if (borders.right) {\n const rightXml = serializeBorder(borders.right, 'right');\n if (rightXml) parts.push(rightXml);\n }\n\n if (borders.insideH) {\n const insideHXml = serializeBorder(borders.insideH, 'insideH');\n if (insideHXml) parts.push(insideHXml);\n }\n\n if (borders.insideV) {\n const insideVXml = serializeBorder(borders.insideV, 'insideV');\n if (insideVXml) parts.push(insideVXml);\n }\n\n if (parts.length === 0) return '';\n\n return `<w:${elementName}>${parts.join('')}</w:${elementName}>`;\n}\n\n// ============================================================================\n// CELL MARGINS SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize cell margins (w:tblCellMar or w:tcMar)\n */\nfunction serializeCellMargins(margins: CellMargins | undefined, elementName: string): string {\n if (!margins) return '';\n\n const parts: string[] = [];\n\n if (margins.top) {\n parts.push(serializeMeasurement(margins.top, 'top'));\n }\n\n if (margins.left) {\n parts.push(serializeMeasurement(margins.left, 'left'));\n }\n\n if (margins.bottom) {\n parts.push(serializeMeasurement(margins.bottom, 'bottom'));\n }\n\n if (margins.right) {\n parts.push(serializeMeasurement(margins.right, 'right'));\n }\n\n if (parts.length === 0) return '';\n\n return `<w:${elementName}>${parts.join('')}</w:${elementName}>`;\n}\n\n// ============================================================================\n// SHADING SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize shading properties (w:shd)\n */\nfunction serializeShading(shading: ShadingProperties | undefined): string {\n if (!shading) return '';\n\n const attrs: string[] = [];\n\n // Pattern/val\n if (shading.pattern) {\n attrs.push(`w:val=\"${shading.pattern}\"`);\n } else {\n attrs.push('w:val=\"clear\"');\n }\n\n // Color (pattern color)\n if (shading.color?.rgb) {\n attrs.push(`w:color=\"${shading.color.rgb}\"`);\n } else if (shading.color?.auto) {\n attrs.push('w:color=\"auto\"');\n }\n\n // Fill (background color)\n if (shading.fill?.rgb) {\n attrs.push(`w:fill=\"${shading.fill.rgb}\"`);\n } else if (shading.fill?.auto) {\n attrs.push('w:fill=\"auto\"');\n }\n\n // Theme fill\n if (shading.fill?.themeColor) {\n attrs.push(`w:themeFill=\"${shading.fill.themeColor}\"`);\n }\n\n if (shading.fill?.themeTint) {\n attrs.push(`w:themeFillTint=\"${shading.fill.themeTint}\"`);\n }\n\n if (shading.fill?.themeShade) {\n attrs.push(`w:themeFillShade=\"${shading.fill.themeShade}\"`);\n }\n\n if (attrs.length === 0) return '';\n\n return `<w:shd ${attrs.join(' ')}/>`;\n}\n\n// ============================================================================\n// TABLE LOOK SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize table look flags (w:tblLook)\n */\nfunction serializeTableLook(look: TableLook | undefined): string {\n if (!look) return '';\n\n const attrs: string[] = [];\n\n if (look.firstRow) {\n attrs.push('w:firstRow=\"1\"');\n }\n\n if (look.lastRow) {\n attrs.push('w:lastRow=\"1\"');\n }\n\n if (look.firstColumn) {\n attrs.push('w:firstColumn=\"1\"');\n }\n\n if (look.lastColumn) {\n attrs.push('w:lastColumn=\"1\"');\n }\n\n if (look.noHBand) {\n attrs.push('w:noHBand=\"1\"');\n }\n\n if (look.noVBand) {\n attrs.push('w:noVBand=\"1\"');\n }\n\n if (attrs.length === 0) return '';\n\n return `<w:tblLook ${attrs.join(' ')}/>`;\n}\n\n// ============================================================================\n// FLOATING TABLE PROPERTIES SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize floating table properties (w:tblpPr)\n */\nfunction serializeFloatingTableProperties(floating: FloatingTableProperties | undefined): string {\n if (!floating) return '';\n\n const attrs: string[] = [];\n\n if (floating.horzAnchor) {\n attrs.push(`w:horzAnchor=\"${floating.horzAnchor}\"`);\n }\n\n if (floating.vertAnchor) {\n attrs.push(`w:vertAnchor=\"${floating.vertAnchor}\"`);\n }\n\n if (floating.tblpX !== undefined) {\n attrs.push(`w:tblpX=\"${floating.tblpX}\"`);\n }\n\n if (floating.tblpXSpec) {\n attrs.push(`w:tblpXSpec=\"${floating.tblpXSpec}\"`);\n }\n\n if (floating.tblpY !== undefined) {\n attrs.push(`w:tblpY=\"${floating.tblpY}\"`);\n }\n\n if (floating.tblpYSpec) {\n attrs.push(`w:tblpYSpec=\"${floating.tblpYSpec}\"`);\n }\n\n if (floating.topFromText !== undefined) {\n attrs.push(`w:topFromText=\"${floating.topFromText}\"`);\n }\n\n if (floating.bottomFromText !== undefined) {\n attrs.push(`w:bottomFromText=\"${floating.bottomFromText}\"`);\n }\n\n if (floating.leftFromText !== undefined) {\n attrs.push(`w:leftFromText=\"${floating.leftFromText}\"`);\n }\n\n if (floating.rightFromText !== undefined) {\n attrs.push(`w:rightFromText=\"${floating.rightFromText}\"`);\n }\n\n if (attrs.length === 0) return '';\n\n return `<w:tblpPr ${attrs.join(' ')}/>`;\n}\n\n// ============================================================================\n// TABLE PROPERTIES SERIALIZATION (w:tblPr)\n// ============================================================================\n\n/**\n * Serialize table formatting properties (w:tblPr)\n */\nexport function serializeTableFormatting(\n formatting: TableFormatting | undefined,\n propertyChanges?: TablePropertyChange[]\n): string {\n const parts: string[] = [];\n\n if (formatting) {\n // Table style (must be first)\n if (formatting.styleId) {\n parts.push(`<w:tblStyle w:val=\"${escapeXml(formatting.styleId)}\"/>`);\n }\n\n // Floating table properties\n const floatingXml = serializeFloatingTableProperties(formatting.floating);\n if (floatingXml) {\n parts.push(floatingXml);\n }\n\n // Bidirectional\n if (formatting.bidi) {\n parts.push('<w:bidiVisual/>');\n }\n\n // Table width\n const widthXml = serializeMeasurement(formatting.width, 'tblW');\n if (widthXml) {\n parts.push(widthXml);\n }\n\n // Table justification\n if (formatting.justification) {\n parts.push(`<w:jc w:val=\"${formatting.justification}\"/>`);\n }\n\n // Cell spacing\n const cellSpacingXml = serializeMeasurement(formatting.cellSpacing, 'tblCellSpacing');\n if (cellSpacingXml) {\n parts.push(cellSpacingXml);\n }\n\n // Table indent\n const indentXml = serializeMeasurement(formatting.indent, 'tblInd');\n if (indentXml) {\n parts.push(indentXml);\n }\n\n // Table borders\n const bordersXml = serializeTableBorders(formatting.borders, 'tblBorders');\n if (bordersXml) {\n parts.push(bordersXml);\n }\n\n // Default cell margins\n const marginsXml = serializeCellMargins(formatting.cellMargins, 'tblCellMar');\n if (marginsXml) {\n parts.push(marginsXml);\n }\n\n // Table layout\n if (formatting.layout) {\n parts.push(`<w:tblLayout w:type=\"${formatting.layout}\"/>`);\n }\n\n // Shading\n const shadingXml = serializeShading(formatting.shading);\n if (shadingXml) {\n parts.push(shadingXml);\n }\n\n // Table look\n const lookXml = serializeTableLook(formatting.look);\n if (lookXml) {\n parts.push(lookXml);\n }\n\n // Overlap\n if (formatting.overlap) {\n parts.push(`<w:tblOverlap w:val=\"${formatting.overlap}\"/>`);\n }\n }\n\n if (propertyChanges && propertyChanges.length > 0) {\n parts.push(...propertyChanges.map((change) => serializeTablePropertyChange(change)));\n }\n\n if (parts.length === 0) return '';\n\n return `<w:tblPr>${parts.join('')}</w:tblPr>`;\n}\n\nfunction extractTblPrInner(tblPrXml: string): string {\n if (!tblPrXml.startsWith('<w:tblPr>') || !tblPrXml.endsWith('</w:tblPr>')) {\n return '';\n }\n return tblPrXml.slice('<w:tblPr>'.length, -'</w:tblPr>'.length);\n}\n\nfunction serializeTablePropertyChange(change: TablePropertyChange): string {\n const attrs = serializeTrackedChangeAttributes(change.info, change.info.rsid);\n const previousTblPrXml = serializeTableFormatting(change.previousFormatting) || '<w:tblPr/>';\n const previousTblPrInner = extractTblPrInner(previousTblPrXml);\n const normalizedPreviousTblPr =\n previousTblPrInner.length > 0 ? `<w:tblPr>${previousTblPrInner}</w:tblPr>` : '<w:tblPr/>';\n\n return `<w:tblPrChange ${attrs}>${normalizedPreviousTblPr}</w:tblPrChange>`;\n}\n\n// ============================================================================\n// TABLE ROW PROPERTIES SERIALIZATION (w:trPr)\n// ============================================================================\n\n/**\n * Serialize table row formatting properties (w:trPr)\n */\nexport function serializeTableRowFormatting(\n formatting: TableRowFormatting | undefined,\n propertyChanges?: TableRowPropertyChange[],\n structuralChange?: TableStructuralChangeInfo\n): string {\n const parts: string[] = [];\n\n if (formatting) {\n // Can't split\n if (formatting.cantSplit) {\n parts.push('<w:cantSplit/>');\n }\n\n // Header row\n if (formatting.header) {\n parts.push('<w:tblHeader/>');\n }\n\n // Row height\n if (formatting.height) {\n const attrs: string[] = [`w:val=\"${formatting.height.value}\"`];\n\n if (formatting.heightRule) {\n attrs.push(`w:hRule=\"${formatting.heightRule}\"`);\n }\n\n parts.push(`<w:trHeight ${attrs.join(' ')}/>`);\n }\n\n // Row justification\n if (formatting.justification) {\n parts.push(`<w:jc w:val=\"${formatting.justification}\"/>`);\n }\n\n // Hidden\n if (formatting.hidden) {\n parts.push('<w:hidden/>');\n }\n }\n\n if (structuralChange) {\n if (structuralChange.type === 'tableRowInsertion') {\n parts.push(`<w:ins ${serializeTrackedChangeAttributes(structuralChange.info)}/>`);\n } else if (structuralChange.type === 'tableRowDeletion') {\n parts.push(`<w:del ${serializeTrackedChangeAttributes(structuralChange.info)}/>`);\n }\n }\n\n if (propertyChanges && propertyChanges.length > 0) {\n parts.push(...propertyChanges.map((change) => serializeTableRowPropertyChange(change)));\n }\n\n if (parts.length === 0) return '';\n\n return `<w:trPr>${parts.join('')}</w:trPr>`;\n}\n\nfunction extractTrPrInner(trPrXml: string): string {\n if (!trPrXml.startsWith('<w:trPr>') || !trPrXml.endsWith('</w:trPr>')) {\n return '';\n }\n return trPrXml.slice('<w:trPr>'.length, -'</w:trPr>'.length);\n}\n\nfunction serializeTableRowPropertyChange(change: TableRowPropertyChange): string {\n const attrs = serializeTrackedChangeAttributes(change.info, change.info.rsid);\n const previousTrPrXml = serializeTableRowFormatting(change.previousFormatting) || '<w:trPr/>';\n const previousTrPrInner = extractTrPrInner(previousTrPrXml);\n const normalizedPreviousTrPr =\n previousTrPrInner.length > 0 ? `<w:trPr>${previousTrPrInner}</w:trPr>` : '<w:trPr/>';\n\n return `<w:trPrChange ${attrs}>${normalizedPreviousTrPr}</w:trPrChange>`;\n}\n\n// ============================================================================\n// CONDITIONAL FORMAT STYLE SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize conditional format style (w:cnfStyle)\n */\nfunction serializeConditionalFormatStyle(style: ConditionalFormatStyle | undefined): string {\n if (!style) return '';\n\n // Build the 12-character binary string\n const bits = [\n style.firstRow ? '1' : '0',\n style.lastRow ? '1' : '0',\n style.firstColumn ? '1' : '0',\n style.lastColumn ? '1' : '0',\n style.oddVBand ? '1' : '0',\n style.evenVBand ? '1' : '0',\n style.oddHBand ? '1' : '0',\n style.evenHBand ? '1' : '0',\n style.nwCell ? '1' : '0',\n style.neCell ? '1' : '0',\n style.swCell ? '1' : '0',\n style.seCell ? '1' : '0',\n ];\n\n const val = bits.join('');\n\n // Only serialize if any bits are set\n if (val === '000000000000') return '';\n\n return `<w:cnfStyle w:val=\"${val}\"/>`;\n}\n\n// ============================================================================\n// TABLE CELL PROPERTIES SERIALIZATION (w:tcPr)\n// ============================================================================\n\n/**\n * Serialize table cell formatting properties (w:tcPr)\n */\nexport function serializeTableCellFormatting(\n formatting: TableCellFormatting | undefined,\n propertyChanges?: TableCellPropertyChange[],\n structuralChange?: TableStructuralChangeInfo\n): string {\n const parts: string[] = [];\n\n if (formatting) {\n // Conditional format style\n const cnfStyleXml = serializeConditionalFormatStyle(formatting.conditionalFormat);\n if (cnfStyleXml) {\n parts.push(cnfStyleXml);\n }\n\n // Cell width\n const widthXml = serializeMeasurement(formatting.width, 'tcW');\n if (widthXml) {\n parts.push(widthXml);\n }\n\n // Grid span (horizontal merge)\n if (formatting.gridSpan && formatting.gridSpan > 1) {\n parts.push(`<w:gridSpan w:val=\"${formatting.gridSpan}\"/>`);\n }\n\n // Vertical merge\n if (formatting.vMerge) {\n if (formatting.vMerge === 'restart') {\n parts.push('<w:vMerge w:val=\"restart\"/>');\n } else {\n // continue is the default when w:vMerge has no value\n parts.push('<w:vMerge/>');\n }\n }\n\n // Cell borders\n const bordersXml = serializeTableBorders(formatting.borders, 'tcBorders');\n if (bordersXml) {\n parts.push(bordersXml);\n }\n\n // Shading\n const shadingXml = serializeShading(formatting.shading);\n if (shadingXml) {\n parts.push(shadingXml);\n }\n\n // No wrap\n if (formatting.noWrap) {\n parts.push('<w:noWrap/>');\n }\n\n // Cell margins\n const marginsXml = serializeCellMargins(formatting.margins, 'tcMar');\n if (marginsXml) {\n parts.push(marginsXml);\n }\n\n // Text direction\n if (formatting.textDirection) {\n parts.push(`<w:textDirection w:val=\"${formatting.textDirection}\"/>`);\n }\n\n // Fit text\n if (formatting.fitText) {\n parts.push('<w:tcFitText/>');\n }\n\n // Vertical alignment\n if (formatting.verticalAlign) {\n parts.push(`<w:vAlign w:val=\"${formatting.verticalAlign}\"/>`);\n }\n\n // Hide mark\n if (formatting.hideMark) {\n parts.push('<w:hideMark/>');\n }\n }\n\n if (structuralChange) {\n if (structuralChange.type === 'tableCellInsertion') {\n parts.push(`<w:cellIns ${serializeTrackedChangeAttributes(structuralChange.info)}/>`);\n } else if (structuralChange.type === 'tableCellDeletion') {\n parts.push(`<w:cellDel ${serializeTrackedChangeAttributes(structuralChange.info)}/>`);\n } else if (structuralChange.type === 'tableCellMerge') {\n parts.push(`<w:cellMerge ${serializeTrackedChangeAttributes(structuralChange.info)}/>`);\n }\n }\n\n if (propertyChanges && propertyChanges.length > 0) {\n parts.push(...propertyChanges.map((change) => serializeTableCellPropertyChange(change)));\n }\n\n if (parts.length === 0) return '';\n\n return `<w:tcPr>${parts.join('')}</w:tcPr>`;\n}\n\nfunction extractTcPrInner(tcPrXml: string): string {\n if (!tcPrXml.startsWith('<w:tcPr>') || !tcPrXml.endsWith('</w:tcPr>')) {\n return '';\n }\n return tcPrXml.slice('<w:tcPr>'.length, -'</w:tcPr>'.length);\n}\n\nfunction serializeTableCellPropertyChange(change: TableCellPropertyChange): string {\n const attrs = serializeTrackedChangeAttributes(change.info, change.info.rsid);\n const previousTcPrXml = serializeTableCellFormatting(change.previousFormatting) || '<w:tcPr/>';\n const previousTcPrInner = extractTcPrInner(previousTcPrXml);\n const normalizedPreviousTcPr =\n previousTcPrInner.length > 0 ? `<w:tcPr>${previousTcPrInner}</w:tcPr>` : '<w:tcPr/>';\n\n return `<w:tcPrChange ${attrs}>${normalizedPreviousTcPr}</w:tcPrChange>`;\n}\n\n// ============================================================================\n// TABLE GRID SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize table grid (w:tblGrid)\n */\nfunction serializeTableGrid(columnWidths: number[] | undefined): string {\n if (!columnWidths || columnWidths.length === 0) return '';\n\n const cols = columnWidths.map((w) => `<w:gridCol w:w=\"${w}\"/>`);\n\n return `<w:tblGrid>${cols.join('')}</w:tblGrid>`;\n}\n\n// ============================================================================\n// CELL CONTENT SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize cell content (paragraphs, nested tables)\n */\nfunction serializeCellContent(content: (Paragraph | Table)[]): string {\n const parts: string[] = [];\n\n for (const item of content) {\n if (item.type === 'paragraph') {\n parts.push(serializeParagraph(item));\n } else if (item.type === 'table') {\n parts.push(serializeTable(item));\n }\n }\n\n // Ensure at least one empty paragraph (Word requires this)\n if (parts.length === 0) {\n parts.push('<w:p/>');\n }\n\n return parts.join('');\n}\n\n// ============================================================================\n// TABLE CELL SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize a table cell (w:tc)\n */\nexport function serializeTableCell(cell: TableCell): string {\n const parts: string[] = [];\n\n // Cell properties\n const tcPrXml = serializeTableCellFormatting(\n cell.formatting,\n cell.propertyChanges,\n cell.structuralChange\n );\n if (tcPrXml) {\n parts.push(tcPrXml);\n }\n\n // Cell content\n parts.push(serializeCellContent(cell.content));\n\n return `<w:tc>${parts.join('')}</w:tc>`;\n}\n\n// ============================================================================\n// TABLE ROW SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize a table row (w:tr)\n */\nexport function serializeTableRow(row: TableRow): string {\n const parts: string[] = [];\n\n // Row properties\n const trPrXml = serializeTableRowFormatting(\n row.formatting,\n row.propertyChanges,\n row.structuralChange\n );\n if (trPrXml) {\n parts.push(trPrXml);\n }\n\n // Cells\n for (const cell of row.cells) {\n parts.push(serializeTableCell(cell));\n }\n\n return `<w:tr>${parts.join('')}</w:tr>`;\n}\n\n// ============================================================================\n// MAIN TABLE SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize a table to OOXML XML (w:tbl)\n *\n * @param table - The table to serialize\n * @returns XML string for the table\n */\nexport function serializeTable(table: Table): string {\n const parts: string[] = [];\n\n // Table properties\n const tblPrXml = serializeTableFormatting(table.formatting, table.propertyChanges);\n if (tblPrXml) {\n parts.push(tblPrXml);\n }\n\n // Table grid\n const tblGridXml = serializeTableGrid(table.columnWidths);\n if (tblGridXml) {\n parts.push(tblGridXml);\n }\n\n // Rows\n for (const row of table.rows) {\n parts.push(serializeTableRow(row));\n }\n\n return `<w:tbl>${parts.join('')}</w:tbl>`;\n}\n\n/**\n * Serialize multiple tables to OOXML XML\n *\n * @param tables - The tables to serialize\n * @returns XML string for all tables\n */\nexport function serializeTables(tables: Table[]): string {\n return tables.map(serializeTable).join('');\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Check if a table has any rows\n */\nexport function hasTableRows(table: Table): boolean {\n return table.rows.length > 0;\n}\n\n/**\n * Check if a table has formatting\n */\nexport function hasTableFormatting(table: Table): boolean {\n return table.formatting !== undefined && Object.keys(table.formatting).length > 0;\n}\n\n/**\n * Check if a row has any cells\n */\nexport function hasRowCells(row: TableRow): boolean {\n return row.cells.length > 0;\n}\n\n/**\n * Check if a row has formatting\n */\nexport function hasRowFormatting(row: TableRow): boolean {\n return row.formatting !== undefined && Object.keys(row.formatting).length > 0;\n}\n\n/**\n * Check if a cell has any content\n */\nexport function hasCellContent(cell: TableCell): boolean {\n return cell.content.length > 0;\n}\n\n/**\n * Check if a cell has formatting\n */\nexport function hasCellFormatting(cell: TableCell): boolean {\n return cell.formatting !== undefined && Object.keys(cell.formatting).length > 0;\n}\n\n/**\n * Get the number of columns in a table\n */\nexport function getTableColumnCount(table: Table): number {\n if (table.columnWidths && table.columnWidths.length > 0) {\n return table.columnWidths.length;\n }\n\n if (table.rows.length === 0) return 0;\n\n // Count cells in first row, accounting for grid span\n return table.rows[0].cells.reduce((count, cell) => {\n return count + (cell.formatting?.gridSpan ?? 1);\n }, 0);\n}\n\n/**\n * Get the number of rows in a table\n */\nexport function getTableRowCount(table: Table): number {\n return table.rows.length;\n}\n\n/**\n * Create an empty table\n */\nexport function createEmptyTable(rows: number = 1, cols: number = 1): Table {\n const tableRows: TableRow[] = [];\n\n for (let r = 0; r < rows; r++) {\n const cells: TableCell[] = [];\n for (let c = 0; c < cols; c++) {\n cells.push({\n type: 'tableCell',\n content: [{ type: 'paragraph', content: [] }],\n });\n }\n tableRows.push({\n type: 'tableRow',\n cells,\n });\n }\n\n return {\n type: 'table',\n rows: tableRows,\n };\n}\n\n/**\n * Create a table cell with text content\n */\nexport function createTextCell(text: string, formatting?: TableCellFormatting): TableCell {\n return {\n type: 'tableCell',\n formatting,\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'run',\n content: [{ type: 'text', text }],\n },\n ],\n },\n ],\n };\n}\n\nexport default serializeTable;\n","/**\n * Document Serializer - Serialize complete document.xml\n *\n * Converts Document objects back to valid document.xml OOXML format.\n * Combines all content (paragraphs, tables) with section properties\n * and proper namespace declarations.\n *\n * OOXML Reference:\n * - Document root: w:document\n * - Document body: w:body\n * - Section properties: w:sectPr\n */\n\nimport type {\n Document,\n DocumentBody,\n BlockContent,\n SectionProperties,\n HeaderReference,\n FooterReference,\n FootnoteProperties,\n EndnoteProperties,\n BorderSpec,\n} from '../../types/document';\n\nimport { serializeParagraph } from './paragraphSerializer';\nimport { serializeTable } from './tableSerializer';\n\n// ============================================================================\n// XML NAMESPACES\n// ============================================================================\n\n/**\n * Standard OOXML namespaces for document.xml\n */\nconst NAMESPACES = {\n wpc: 'http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas',\n cx: 'http://schemas.microsoft.com/office/drawing/2014/chartex',\n cx1: 'http://schemas.microsoft.com/office/drawing/2015/9/8/chartex',\n cx2: 'http://schemas.microsoft.com/office/drawing/2015/10/21/chartex',\n cx3: 'http://schemas.microsoft.com/office/drawing/2016/5/9/chartex',\n cx4: 'http://schemas.microsoft.com/office/drawing/2016/5/10/chartex',\n cx5: 'http://schemas.microsoft.com/office/drawing/2016/5/11/chartex',\n cx6: 'http://schemas.microsoft.com/office/drawing/2016/5/12/chartex',\n cx7: 'http://schemas.microsoft.com/office/drawing/2016/5/13/chartex',\n cx8: 'http://schemas.microsoft.com/office/drawing/2016/5/14/chartex',\n mc: 'http://schemas.openxmlformats.org/markup-compatibility/2006',\n aink: 'http://schemas.microsoft.com/office/drawing/2016/ink',\n am3d: 'http://schemas.microsoft.com/office/drawing/2017/model3d',\n o: 'urn:schemas-microsoft-com:office:office',\n oel: 'http://schemas.microsoft.com/office/2019/extlst',\n r: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n m: 'http://schemas.openxmlformats.org/officeDocument/2006/math',\n v: 'urn:schemas-microsoft-com:vml',\n wp14: 'http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing',\n wp: 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing',\n w10: 'urn:schemas-microsoft-com:office:word',\n w: 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',\n w14: 'http://schemas.microsoft.com/office/word/2010/wordml',\n w15: 'http://schemas.microsoft.com/office/word/2012/wordml',\n w16cex: 'http://schemas.microsoft.com/office/word/2018/wordml/cex',\n w16cid: 'http://schemas.microsoft.com/office/word/2016/wordml/cid',\n w16: 'http://schemas.microsoft.com/office/word/2018/wordml',\n w16sdtdh: 'http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash',\n w16se: 'http://schemas.microsoft.com/office/word/2015/wordml/symex',\n wpg: 'http://schemas.microsoft.com/office/word/2010/wordprocessingGroup',\n wpi: 'http://schemas.microsoft.com/office/word/2010/wordprocessingInk',\n wne: 'http://schemas.microsoft.com/office/word/2006/wordml',\n wps: 'http://schemas.microsoft.com/office/word/2010/wordprocessingShape',\n};\n\n/**\n * Build namespace declaration string for document element\n */\nfunction buildNamespaceDeclarations(): string {\n // Minimal set of commonly used namespaces\n const minimalNamespaces = {\n wpc: NAMESPACES.wpc,\n mc: NAMESPACES.mc,\n o: NAMESPACES.o,\n r: NAMESPACES.r,\n m: NAMESPACES.m,\n v: NAMESPACES.v,\n wp14: NAMESPACES.wp14,\n wp: NAMESPACES.wp,\n w10: NAMESPACES.w10,\n w: NAMESPACES.w,\n w14: NAMESPACES.w14,\n w15: NAMESPACES.w15,\n wpg: NAMESPACES.wpg,\n wps: NAMESPACES.wps,\n };\n\n return Object.entries(minimalNamespaces)\n .map(([prefix, uri]) => `xmlns:${prefix}=\"${uri}\"`)\n .join(' ');\n}\n\n// ============================================================================\n// XML ESCAPING\n// ============================================================================\n\n// ============================================================================\n// BORDER SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize a border element\n */\nfunction serializeBorder(border: BorderSpec | undefined, elementName: string): string {\n if (!border || border.style === 'none' || border.style === 'nil') {\n return '';\n }\n\n const attrs: string[] = [`w:val=\"${border.style}\"`];\n\n if (border.size !== undefined) {\n attrs.push(`w:sz=\"${border.size}\"`);\n }\n\n if (border.space !== undefined) {\n attrs.push(`w:space=\"${border.space}\"`);\n }\n\n if (border.color) {\n if (border.color.auto) {\n attrs.push('w:color=\"auto\"');\n } else if (border.color.rgb) {\n attrs.push(`w:color=\"${border.color.rgb}\"`);\n }\n\n if (border.color.themeColor) {\n attrs.push(`w:themeColor=\"${border.color.themeColor}\"`);\n }\n\n if (border.color.themeTint) {\n attrs.push(`w:themeTint=\"${border.color.themeTint}\"`);\n }\n\n if (border.color.themeShade) {\n attrs.push(`w:themeShade=\"${border.color.themeShade}\"`);\n }\n }\n\n if (border.shadow) {\n attrs.push('w:shadow=\"true\"');\n }\n\n if (border.frame) {\n attrs.push('w:frame=\"true\"');\n }\n\n return `<w:${elementName} ${attrs.join(' ')}/>`;\n}\n\n// ============================================================================\n// SECTION PROPERTIES SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize header reference (w:headerReference)\n */\nfunction serializeHeaderReference(ref: HeaderReference): string {\n const attrs: string[] = [`w:type=\"${ref.type}\"`, `r:id=\"${ref.rId}\"`];\n\n return `<w:headerReference ${attrs.join(' ')}/>`;\n}\n\n/**\n * Serialize footer reference (w:footerReference)\n */\nfunction serializeFooterReference(ref: FooterReference): string {\n const attrs: string[] = [`w:type=\"${ref.type}\"`, `r:id=\"${ref.rId}\"`];\n\n return `<w:footerReference ${attrs.join(' ')}/>`;\n}\n\n/**\n * Serialize footnote properties (w:footnotePr)\n */\nfunction serializeFootnoteProperties(props: FootnoteProperties | undefined): string {\n if (!props) return '';\n\n const parts: string[] = [];\n\n if (props.position) {\n parts.push(`<w:pos w:val=\"${props.position}\"/>`);\n }\n\n if (props.numFmt) {\n parts.push(`<w:numFmt w:val=\"${props.numFmt}\"/>`);\n }\n\n if (props.numStart !== undefined) {\n parts.push(`<w:numStart w:val=\"${props.numStart}\"/>`);\n }\n\n if (props.numRestart) {\n parts.push(`<w:numRestart w:val=\"${props.numRestart}\"/>`);\n }\n\n if (parts.length === 0) return '';\n\n return `<w:footnotePr>${parts.join('')}</w:footnotePr>`;\n}\n\n/**\n * Serialize endnote properties (w:endnotePr)\n */\nfunction serializeEndnoteProperties(props: EndnoteProperties | undefined): string {\n if (!props) return '';\n\n const parts: string[] = [];\n\n if (props.position) {\n parts.push(`<w:pos w:val=\"${props.position}\"/>`);\n }\n\n if (props.numFmt) {\n parts.push(`<w:numFmt w:val=\"${props.numFmt}\"/>`);\n }\n\n if (props.numStart !== undefined) {\n parts.push(`<w:numStart w:val=\"${props.numStart}\"/>`);\n }\n\n if (props.numRestart) {\n parts.push(`<w:numRestart w:val=\"${props.numRestart}\"/>`);\n }\n\n if (parts.length === 0) return '';\n\n return `<w:endnotePr>${parts.join('')}</w:endnotePr>`;\n}\n\n/**\n * Serialize page size (w:pgSz)\n */\nfunction serializePageSize(props: SectionProperties): string {\n const attrs: string[] = [];\n\n if (props.pageWidth !== undefined) {\n attrs.push(`w:w=\"${props.pageWidth}\"`);\n }\n\n if (props.pageHeight !== undefined) {\n attrs.push(`w:h=\"${props.pageHeight}\"`);\n }\n\n if (props.orientation === 'landscape') {\n attrs.push('w:orient=\"landscape\"');\n }\n\n if (attrs.length === 0) return '';\n\n return `<w:pgSz ${attrs.join(' ')}/>`;\n}\n\n/**\n * Serialize page margins (w:pgMar)\n */\nfunction serializePageMargins(props: SectionProperties): string {\n const attrs: string[] = [];\n\n if (props.marginTop !== undefined) {\n attrs.push(`w:top=\"${props.marginTop}\"`);\n }\n\n if (props.marginRight !== undefined) {\n attrs.push(`w:right=\"${props.marginRight}\"`);\n }\n\n if (props.marginBottom !== undefined) {\n attrs.push(`w:bottom=\"${props.marginBottom}\"`);\n }\n\n if (props.marginLeft !== undefined) {\n attrs.push(`w:left=\"${props.marginLeft}\"`);\n }\n\n if (props.headerDistance !== undefined) {\n attrs.push(`w:header=\"${props.headerDistance}\"`);\n }\n\n if (props.footerDistance !== undefined) {\n attrs.push(`w:footer=\"${props.footerDistance}\"`);\n }\n\n if (props.gutter !== undefined) {\n attrs.push(`w:gutter=\"${props.gutter}\"`);\n }\n\n if (attrs.length === 0) return '';\n\n return `<w:pgMar ${attrs.join(' ')}/>`;\n}\n\n/**\n * Serialize columns (w:cols)\n */\nfunction serializeColumns(props: SectionProperties): string {\n if (!props.columnCount && !props.columns?.length) return '';\n\n const attrs: string[] = [];\n\n if (props.columnCount !== undefined && props.columnCount > 1) {\n attrs.push(`w:num=\"${props.columnCount}\"`);\n }\n\n if (props.columnSpace !== undefined) {\n attrs.push(`w:space=\"${props.columnSpace}\"`);\n }\n\n if (props.equalWidth !== undefined) {\n attrs.push(`w:equalWidth=\"${props.equalWidth ? '1' : '0'}\"`);\n }\n\n if (props.separator) {\n attrs.push('w:sep=\"1\"');\n }\n\n // Individual column definitions\n let colElements = '';\n if (props.columns && props.columns.length > 0) {\n colElements = props.columns\n .map((col) => {\n const colAttrs: string[] = [];\n if (col.width !== undefined) {\n colAttrs.push(`w:w=\"${col.width}\"`);\n }\n if (col.space !== undefined) {\n colAttrs.push(`w:space=\"${col.space}\"`);\n }\n return `<w:col ${colAttrs.join(' ')}/>`;\n })\n .join('');\n }\n\n if (attrs.length === 0 && !colElements) return '';\n\n const attrsStr = attrs.length > 0 ? ' ' + attrs.join(' ') : '';\n return `<w:cols${attrsStr}>${colElements}</w:cols>`;\n}\n\n/**\n * Serialize line numbers (w:lnNumType)\n */\nfunction serializeLineNumbers(props: SectionProperties): string {\n if (!props.lineNumbers) return '';\n\n const ln = props.lineNumbers;\n const attrs: string[] = [];\n\n if (ln.countBy !== undefined) {\n attrs.push(`w:countBy=\"${ln.countBy}\"`);\n }\n\n if (ln.start !== undefined) {\n attrs.push(`w:start=\"${ln.start}\"`);\n }\n\n if (ln.distance !== undefined) {\n attrs.push(`w:distance=\"${ln.distance}\"`);\n }\n\n if (ln.restart) {\n attrs.push(`w:restart=\"${ln.restart}\"`);\n }\n\n if (attrs.length === 0) return '';\n\n return `<w:lnNumType ${attrs.join(' ')}/>`;\n}\n\n/**\n * Serialize page borders (w:pgBorders)\n */\nfunction serializePageBorders(props: SectionProperties): string {\n if (!props.pageBorders) return '';\n\n const pb = props.pageBorders;\n const attrs: string[] = [];\n const borderElements: string[] = [];\n\n if (pb.display) {\n attrs.push(`w:display=\"${pb.display}\"`);\n }\n\n if (pb.offsetFrom) {\n attrs.push(`w:offsetFrom=\"${pb.offsetFrom}\"`);\n }\n\n if (pb.zOrder) {\n attrs.push(`w:zOrder=\"${pb.zOrder}\"`);\n }\n\n if (pb.top) {\n const topXml = serializeBorder(pb.top, 'top');\n if (topXml) borderElements.push(topXml);\n }\n\n if (pb.left) {\n const leftXml = serializeBorder(pb.left, 'left');\n if (leftXml) borderElements.push(leftXml);\n }\n\n if (pb.bottom) {\n const bottomXml = serializeBorder(pb.bottom, 'bottom');\n if (bottomXml) borderElements.push(bottomXml);\n }\n\n if (pb.right) {\n const rightXml = serializeBorder(pb.right, 'right');\n if (rightXml) borderElements.push(rightXml);\n }\n\n if (borderElements.length === 0) return '';\n\n const attrsStr = attrs.length > 0 ? ' ' + attrs.join(' ') : '';\n return `<w:pgBorders${attrsStr}>${borderElements.join('')}</w:pgBorders>`;\n}\n\n/**\n * Serialize document grid (w:docGrid)\n */\nfunction serializeDocGrid(props: SectionProperties): string {\n if (!props.docGrid) return '';\n\n const dg = props.docGrid;\n const attrs: string[] = [];\n\n if (dg.type) {\n attrs.push(`w:type=\"${dg.type}\"`);\n }\n\n if (dg.linePitch !== undefined) {\n attrs.push(`w:linePitch=\"${dg.linePitch}\"`);\n }\n\n if (dg.charSpace !== undefined) {\n attrs.push(`w:charSpace=\"${dg.charSpace}\"`);\n }\n\n if (attrs.length === 0) return '';\n\n return `<w:docGrid ${attrs.join(' ')}/>`;\n}\n\n/**\n * Serialize section properties (w:sectPr)\n */\nexport function serializeSectionProperties(props: SectionProperties | undefined): string {\n if (!props) return '';\n\n const parts: string[] = [];\n\n // Header references\n if (props.headerReferences) {\n for (const ref of props.headerReferences) {\n parts.push(serializeHeaderReference(ref));\n }\n }\n\n // Footer references\n if (props.footerReferences) {\n for (const ref of props.footerReferences) {\n parts.push(serializeFooterReference(ref));\n }\n }\n\n // Footnote properties\n const footnotePrXml = serializeFootnoteProperties(props.footnotePr);\n if (footnotePrXml) {\n parts.push(footnotePrXml);\n }\n\n // Endnote properties\n const endnotePrXml = serializeEndnoteProperties(props.endnotePr);\n if (endnotePrXml) {\n parts.push(endnotePrXml);\n }\n\n // Section type\n if (props.sectionStart) {\n parts.push(`<w:type w:val=\"${props.sectionStart}\"/>`);\n }\n\n // Page size\n const pgSzXml = serializePageSize(props);\n if (pgSzXml) {\n parts.push(pgSzXml);\n }\n\n // Page margins\n const pgMarXml = serializePageMargins(props);\n if (pgMarXml) {\n parts.push(pgMarXml);\n }\n\n // Paper source\n if (props.paperSrcFirst !== undefined || props.paperSrcOther !== undefined) {\n const attrs: string[] = [];\n if (props.paperSrcFirst !== undefined) {\n attrs.push(`w:first=\"${props.paperSrcFirst}\"`);\n }\n if (props.paperSrcOther !== undefined) {\n attrs.push(`w:other=\"${props.paperSrcOther}\"`);\n }\n parts.push(`<w:paperSrc ${attrs.join(' ')}/>`);\n }\n\n // Page borders\n const pgBordersXml = serializePageBorders(props);\n if (pgBordersXml) {\n parts.push(pgBordersXml);\n }\n\n // Line numbers\n const lnNumXml = serializeLineNumbers(props);\n if (lnNumXml) {\n parts.push(lnNumXml);\n }\n\n // Columns\n const colsXml = serializeColumns(props);\n if (colsXml) {\n parts.push(colsXml);\n }\n\n // Document grid\n const docGridXml = serializeDocGrid(props);\n if (docGridXml) {\n parts.push(docGridXml);\n }\n\n // Vertical alignment\n if (props.verticalAlign) {\n parts.push(`<w:vAlign w:val=\"${props.verticalAlign}\"/>`);\n }\n\n // Bidirectional\n if (props.bidi) {\n parts.push('<w:bidi/>');\n }\n\n // Title page (different first page header/footer)\n if (props.titlePg) {\n parts.push('<w:titlePg/>');\n }\n\n // Even and odd headers\n if (props.evenAndOddHeaders) {\n parts.push('<w:evenAndOddHeaders/>');\n }\n\n if (parts.length === 0) return '';\n\n return `<w:sectPr>${parts.join('')}</w:sectPr>`;\n}\n\n// ============================================================================\n// CONTENT SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize a single block content item (paragraph or table)\n */\nfunction serializeBlockContent(block: BlockContent): string {\n if (block.type === 'paragraph') {\n return serializeParagraph(block);\n } else if (block.type === 'table') {\n return serializeTable(block);\n } else if (block.type === 'blockSdt') {\n // Block-level SDT: wrap content in w:sdt\n const contentXml = block.content.map((b) => serializeBlockContent(b)).join('');\n const props = block.properties;\n const prParts: string[] = [];\n if (props.alias) prParts.push(`<w:alias w:val=\"${props.alias}\"/>`);\n if (props.tag) prParts.push(`<w:tag w:val=\"${props.tag}\"/>`);\n return `<w:sdt><w:sdtPr>${prParts.join('')}</w:sdtPr><w:sdtContent>${contentXml}</w:sdtContent></w:sdt>`;\n }\n return '';\n}\n\n/**\n * Serialize document body content\n */\nfunction serializeBodyContent(content: BlockContent[]): string {\n return content.map((block) => serializeBlockContent(block)).join('');\n}\n\n// ============================================================================\n// MAIN DOCUMENT SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize a DocumentBody to document.xml body content\n *\n * @param body - The document body to serialize\n * @returns XML string for the body element (without body tags)\n */\nexport function serializeDocumentBody(body: DocumentBody): string {\n const parts: string[] = [];\n\n // Serialize all content blocks\n parts.push(serializeBodyContent(body.content));\n\n // Final section properties (at the end of body)\n if (body.finalSectionProperties) {\n parts.push(serializeSectionProperties(body.finalSectionProperties));\n }\n\n return parts.join('');\n}\n\n/**\n * Serialize a complete Document to valid document.xml\n *\n * @param doc - The document to serialize\n * @returns Complete XML string for document.xml\n */\nexport function serializeDocument(doc: Document): string {\n const parts: string[] = [];\n\n // XML declaration\n parts.push('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>');\n\n // Document element with namespaces\n const nsDecl = buildNamespaceDeclarations();\n parts.push(`<w:document ${nsDecl} mc:Ignorable=\"w14 w15 wp14\">`);\n\n // Document body\n parts.push('<w:body>');\n parts.push(serializeDocumentBody(doc.package.document));\n parts.push('</w:body>');\n\n // Close document element\n parts.push('</w:document>');\n\n return parts.join('');\n}\n\n/**\n * Serialize just the document body (useful for partial updates)\n *\n * @param body - The document body to serialize\n * @returns XML string for the w:body element\n */\nexport function serializeDocumentBodyElement(body: DocumentBody): string {\n return `<w:body>${serializeDocumentBody(body)}</w:body>`;\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Check if document has any content\n */\nexport function hasDocumentContent(doc: Document): boolean {\n return doc.package.document.content.length > 0;\n}\n\n/**\n * Check if document has sections\n */\nexport function hasDocumentSections(doc: Document): boolean {\n return (doc.package.document.sections?.length ?? 0) > 0;\n}\n\n/**\n * Check if document has section properties\n */\nexport function hasSectionProperties(doc: Document): boolean {\n return doc.package.document.finalSectionProperties !== undefined;\n}\n\n/**\n * Get document content count (paragraphs + tables)\n */\nexport function getDocumentContentCount(doc: Document): number {\n return doc.package.document.content.length;\n}\n\n/**\n * Get paragraph count in document\n */\nexport function getDocumentParagraphCount(doc: Document): number {\n return doc.package.document.content.filter((b) => b.type === 'paragraph').length;\n}\n\n/**\n * Get table count in document\n */\nexport function getDocumentTableCount(doc: Document): number {\n return doc.package.document.content.filter((b) => b.type === 'table').length;\n}\n\n/**\n * Get plain text from document (for comparison/debugging)\n */\nexport function getDocumentPlainText(doc: Document): string {\n const texts: string[] = [];\n\n for (const block of doc.package.document.content) {\n if (block.type === 'paragraph') {\n for (const content of block.content) {\n if (content.type === 'run') {\n for (const item of content.content) {\n if (item.type === 'text') {\n texts.push(item.text);\n } else if (item.type === 'tab') {\n texts.push('\\t');\n } else if (item.type === 'break') {\n texts.push('\\n');\n }\n }\n }\n }\n texts.push('\\n'); // Paragraph break\n }\n }\n\n return texts.join('');\n}\n\n/**\n * Create an empty document\n */\nexport function createEmptyDocument(): Document {\n return {\n package: {\n document: {\n content: [],\n },\n },\n };\n}\n\n/**\n * Create a simple document with text content\n */\nexport function createSimpleDocument(\n paragraphs: Array<{ text: string; styleId?: string }>\n): Document {\n return {\n package: {\n document: {\n content: paragraphs.map((p) => ({\n type: 'paragraph' as const,\n formatting: p.styleId ? { styleId: p.styleId } : undefined,\n content: [\n {\n type: 'run' as const,\n content: [{ type: 'text' as const, text: p.text }],\n },\n ],\n })),\n },\n },\n };\n}\n\nexport default serializeDocument;\n","/**\n * DOCX Repacker - Repack modified document into valid DOCX\n *\n * Takes a Document with modified content and creates a new DOCX file\n * by updating document.xml while preserving all other files from\n * the original ZIP archive.\n *\n * This ensures round-trip fidelity:\n * - styles.xml, theme1.xml, fontTable.xml remain untouched\n * - Media files preserved\n * - Relationships preserved\n * - Only document.xml is updated with new content\n *\n * OOXML Package Structure:\n * - [Content_Types].xml - Content type declarations\n * - _rels/.rels - Package relationships\n * - word/document.xml - Main document (modified)\n * - word/styles.xml - Styles (preserved)\n * - word/theme/theme1.xml - Theme (preserved)\n * - word/numbering.xml - Numbering (preserved)\n * - word/fontTable.xml - Font table (preserved)\n * - word/settings.xml - Settings (preserved)\n * - word/header*.xml - Headers (preserved)\n * - word/footer*.xml - Footers (preserved)\n * - word/footnotes.xml - Footnotes (preserved)\n * - word/endnotes.xml - Endnotes (preserved)\n * - word/media/* - Media files (preserved)\n * - word/_rels/document.xml.rels - Document relationships (preserved)\n * - docProps/* - Document properties (preserved)\n */\n\nimport JSZip from 'jszip';\nimport type { Document } from '../types/document';\nimport type { BlockContent, Image, Hyperlink } from '../types/content';\nimport { serializeDocument } from './serializer/documentSerializer';\nimport { serializeHeaderFooter } from './serializer/headerFooterSerializer';\nimport { serializeComments } from './serializer/commentSerializer';\nimport { RELATIONSHIP_TYPES } from './relsParser';\nimport { type RawDocxContent } from './unzip';\nimport { escapeXml } from './serializer/xmlUtils';\n\n/**\n * Find the highest rId number in a relationships XML string.\n */\nfunction findMaxRId(relsXml: string): number {\n let maxId = 0;\n for (const match of relsXml.matchAll(/Id=\"rId(\\d+)\"/g)) {\n const id = parseInt(match[1], 10);\n if (id > maxId) maxId = id;\n }\n return maxId;\n}\n\n// ============================================================================\n// COMMENTS SERIALIZATION\n// ============================================================================\n\nasync function serializeCommentsToZip(\n doc: Document,\n zip: JSZip,\n compressionLevel: number\n): Promise<void> {\n const comments = doc.package.document.comments;\n if (!comments || comments.length === 0) return;\n\n const commentsXml = serializeComments(comments);\n zip.file('word/comments.xml', commentsXml, {\n compression: 'DEFLATE',\n compressionOptions: { level: compressionLevel },\n });\n\n await Promise.all([\n ensureCommentsContentType(zip, compressionLevel),\n ensureCommentsRelationship(zip, compressionLevel),\n ]);\n}\n\n// ============================================================================\n// NEW IMAGE HANDLING\n// ============================================================================\n\n/**\n * Collect all images with data-URL src from the document content.\n * These are newly inserted images that need to be added to the ZIP.\n */\nfunction collectNewImages(blocks: BlockContent[]): Image[] {\n const images: Image[] = [];\n\n for (const block of blocks) {\n if (block.type === 'paragraph') {\n for (const item of block.content) {\n if (item.type === 'run') {\n for (const c of item.content) {\n if (c.type === 'drawing' && c.image.src?.startsWith('data:')) {\n images.push(c.image);\n }\n }\n }\n }\n } else if (block.type === 'table') {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n images.push(...collectNewImages(cell.content));\n }\n }\n }\n }\n\n return images;\n}\n\n/** Map MIME type to file extension (inverse of getContentTypeForExtension) */\nconst MIME_TO_EXT: Record<string, string> = {\n 'image/png': 'png',\n 'image/jpeg': 'jpeg',\n 'image/gif': 'gif',\n 'image/bmp': 'bmp',\n 'image/tiff': 'tiff',\n 'image/webp': 'webp',\n 'image/svg+xml': 'svg',\n};\n\n/**\n * Decode a data URL to binary ArrayBuffer and file extension.\n */\nfunction decodeDataUrl(dataUrl: string): { data: ArrayBuffer; extension: string } {\n const match = dataUrl.match(/^data:([^;]+);base64,(.+)$/);\n if (!match) {\n throw new Error('Invalid data URL');\n }\n\n const binary = atob(match[2]);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n\n return { data: bytes.buffer, extension: MIME_TO_EXT[match[1]] || 'png' };\n}\n\n/**\n * Process newly inserted images: add binary data to ZIP, create relationships,\n * update content types, and rewrite rIds in the document model so the serializer\n * outputs correct references.\n *\n * Mutates the images' rId fields in-place.\n */\nasync function processNewImages(\n newImages: Image[],\n zip: JSZip,\n compressionLevel: number\n): Promise<void> {\n if (newImages.length === 0) return;\n\n // Read existing relationships\n const relsPath = 'word/_rels/document.xml.rels';\n const relsFile = zip.file(relsPath);\n if (!relsFile) return;\n let relsXml = await relsFile.async('text');\n\n // Find highest existing rId\n let maxId = findMaxRId(relsXml);\n\n // Find highest existing image number in word/media/\n let maxImageNum = 0;\n zip.forEach((relativePath) => {\n const m = relativePath.match(/^word\\/media\\/image(\\d+)\\./);\n if (m) {\n const num = parseInt(m[1], 10);\n if (num > maxImageNum) maxImageNum = num;\n }\n });\n\n const relEntries: string[] = [];\n const extensionsAdded = new Set<string>();\n\n for (const image of newImages) {\n const { data, extension } = decodeDataUrl(image.src!);\n\n maxImageNum++;\n maxId++;\n const mediaFilename = `image${maxImageNum}.${extension}`;\n const mediaPath = `word/media/${mediaFilename}`;\n const newRId = `rId${maxId}`;\n\n // Add binary to ZIP\n zip.file(mediaPath, data, {\n compression: 'DEFLATE',\n compressionOptions: { level: compressionLevel },\n });\n\n // Build relationship entry\n relEntries.push(\n `<Relationship Id=\"${newRId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"media/${mediaFilename}\"/>`\n );\n\n extensionsAdded.add(extension);\n\n // Rewrite the image's rId so the serializer outputs the correct reference\n image.rId = newRId;\n }\n\n // Update relationships XML\n if (relEntries.length > 0) {\n relsXml = relsXml.replace('</Relationships>', relEntries.join('') + '</Relationships>');\n zip.file(relsPath, relsXml, {\n compression: 'DEFLATE',\n compressionOptions: { level: compressionLevel },\n });\n }\n\n // Update [Content_Types].xml if new extensions were added\n if (extensionsAdded.size > 0) {\n const ctFile = zip.file('[Content_Types].xml');\n if (ctFile) {\n let ctXml = await ctFile.async('text');\n for (const ext of extensionsAdded) {\n if (!ctXml.includes(`Extension=\"${ext}\"`)) {\n const contentType = getContentTypeForExtension(ext, '');\n ctXml = ctXml.replace(\n '</Types>',\n `<Default Extension=\"${ext}\" ContentType=\"${contentType}\"/></Types>`\n );\n }\n }\n zip.file('[Content_Types].xml', ctXml, {\n compression: 'DEFLATE',\n compressionOptions: { level: compressionLevel },\n });\n }\n }\n}\n\n// ============================================================================\n// NEW HYPERLINK HANDLING\n// ============================================================================\n\n/**\n * Collect all hyperlinks that have an href but no rId from block content.\n * These are newly created hyperlinks that need relationship entries.\n */\nfunction collectHyperlinksWithoutRId(blocks: BlockContent[]): Hyperlink[] {\n const hyperlinks: Hyperlink[] = [];\n\n for (const block of blocks) {\n if (block.type === 'paragraph') {\n for (const item of block.content) {\n if (item.type === 'hyperlink' && item.href && !item.rId && !item.anchor) {\n hyperlinks.push(item);\n }\n }\n } else if (block.type === 'table') {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n hyperlinks.push(...collectHyperlinksWithoutRId(cell.content));\n }\n }\n }\n }\n\n return hyperlinks;\n}\n\n/**\n * Process newly created hyperlinks: assign rIds and add relationship entries.\n * Mutates the hyperlinks' rId fields in-place.\n */\nasync function processNewHyperlinks(\n newHyperlinks: Hyperlink[],\n zip: JSZip,\n compressionLevel: number\n): Promise<void> {\n if (newHyperlinks.length === 0) return;\n\n const relsPath = 'word/_rels/document.xml.rels';\n const relsFile = zip.file(relsPath);\n if (!relsFile) return;\n let relsXml = await relsFile.async('text');\n\n let maxId = findMaxRId(relsXml);\n const relEntries: string[] = [];\n\n for (const hyperlink of newHyperlinks) {\n maxId++;\n const newRId = `rId${maxId}`;\n\n relEntries.push(\n `<Relationship Id=\"${newRId}\" Type=\"${RELATIONSHIP_TYPES.hyperlink}\" Target=\"${escapeXml(hyperlink.href!)}\" TargetMode=\"External\"/>`\n );\n\n // Rewrite the hyperlink's rId so the serializer outputs the correct reference\n hyperlink.rId = newRId;\n }\n\n if (relEntries.length > 0) {\n relsXml = relsXml.replace('</Relationships>', relEntries.join('') + '</Relationships>');\n zip.file(relsPath, relsXml, {\n compression: 'DEFLATE',\n compressionOptions: { level: compressionLevel },\n });\n }\n}\n\n// ============================================================================\n// MAIN REPACKER\n// ============================================================================\n\n/**\n * Options for repacking DOCX\n */\nexport interface RepackOptions {\n /** Compression level (0-9, default: 6) */\n compressionLevel?: number;\n /** Whether to update modification date in docProps/core.xml */\n updateModifiedDate?: boolean;\n /** Custom modifier name for lastModifiedBy */\n modifiedBy?: string;\n}\n\n/**\n * Repack a Document into a valid DOCX file\n *\n * @param doc - Document with modified content\n * @param options - Optional repack options\n * @returns Promise resolving to DOCX as ArrayBuffer\n * @throws Error if document has no original buffer for round-trip\n */\nexport async function repackDocx(doc: Document, options: RepackOptions = {}): Promise<ArrayBuffer> {\n // Validate we have an original buffer to base on\n if (!doc.originalBuffer) {\n throw new Error(\n 'Cannot repack document: no original buffer for round-trip. ' +\n 'Use createDocx() for new documents.'\n );\n }\n\n const { compressionLevel = 6, updateModifiedDate = true, modifiedBy } = options;\n const exportDocument = doc;\n\n // Load the original ZIP\n const originalZip = await JSZip.loadAsync(doc.originalBuffer);\n\n // Create a new ZIP with all original files\n const newZip = new JSZip();\n\n // Copy all files from original ZIP\n for (const [path, file] of Object.entries(originalZip.files)) {\n // Skip directories\n if (file.dir) {\n newZip.folder(path.replace(/\\/$/, ''));\n continue;\n }\n\n // Get original file content\n const content = await file.async('arraybuffer');\n\n // Add to new ZIP (we'll update specific files below)\n newZip.file(path, content, {\n compression: 'DEFLATE',\n compressionOptions: { level: compressionLevel },\n });\n }\n\n // Process newly inserted images (data URLs → binary media files + relationships).\n // This mutates image rIds in-place so the serializer outputs correct references.\n const newImages = collectNewImages(exportDocument.package.document.content);\n await processNewImages(newImages, newZip, compressionLevel);\n\n // Process newly created hyperlinks (assign rIds + add relationship entries).\n // This mutates hyperlink rIds in-place so the serializer outputs correct references.\n const newHyperlinks = collectHyperlinksWithoutRId(exportDocument.package.document.content);\n await processNewHyperlinks(newHyperlinks, newZip, compressionLevel);\n\n // Serialize and update document.xml (after image/hyperlink rIds have been rewritten)\n const documentXml = serializeDocument(exportDocument);\n newZip.file('word/document.xml', documentXml, {\n compression: 'DEFLATE',\n compressionOptions: { level: compressionLevel },\n });\n\n // Serialize and update modified headers/footers\n serializeHeadersFootersToZip(exportDocument, newZip, compressionLevel);\n\n // Serialize comments\n await serializeCommentsToZip(exportDocument, newZip, compressionLevel);\n\n // Optionally update modification date in docProps/core.xml\n if (updateModifiedDate) {\n const corePropsPath = 'docProps/core.xml';\n const corePropsFile = originalZip.file(corePropsPath);\n\n if (corePropsFile) {\n const originalCoreProps = await corePropsFile.async('text');\n const updatedCoreProps = updateCoreProperties(originalCoreProps, {\n updateModifiedDate,\n modifiedBy,\n });\n\n newZip.file(corePropsPath, updatedCoreProps, {\n compression: 'DEFLATE',\n compressionOptions: { level: compressionLevel },\n });\n }\n }\n\n // Generate the new DOCX file\n const arrayBuffer = await newZip.generateAsync({\n type: 'arraybuffer',\n compression: 'DEFLATE',\n compressionOptions: { level: compressionLevel },\n });\n\n return arrayBuffer;\n}\n\n/**\n * Repack a Document using raw content for more control\n *\n * @param doc - Document with modified content\n * @param rawContent - Original raw content from unzipDocx\n * @param options - Optional repack options\n * @returns Promise resolving to DOCX as ArrayBuffer\n */\nexport async function repackDocxFromRaw(\n doc: Document,\n rawContent: RawDocxContent,\n options: RepackOptions = {}\n): Promise<ArrayBuffer> {\n const { compressionLevel = 6, updateModifiedDate = true, modifiedBy } = options;\n const exportDocument = doc;\n\n // Create a new ZIP with all original files\n const newZip = new JSZip();\n\n // Copy all files from original ZIP\n for (const [path, file] of Object.entries(rawContent.originalZip.files)) {\n // Skip directories\n if (file.dir) {\n newZip.folder(path.replace(/\\/$/, ''));\n continue;\n }\n\n // Get original file content\n const content = await file.async('arraybuffer');\n\n // Add to new ZIP\n newZip.file(path, content, {\n compression: 'DEFLATE',\n compressionOptions: { level: compressionLevel },\n });\n }\n\n // Serialize and update document.xml\n const newImages = collectNewImages(exportDocument.package.document.content);\n await processNewImages(newImages, newZip, compressionLevel);\n\n const newHyperlinks = collectHyperlinksWithoutRId(exportDocument.package.document.content);\n await processNewHyperlinks(newHyperlinks, newZip, compressionLevel);\n\n const documentXml = serializeDocument(exportDocument);\n newZip.file('word/document.xml', documentXml, {\n compression: 'DEFLATE',\n compressionOptions: { level: compressionLevel },\n });\n\n // Serialize and update modified headers/footers\n serializeHeadersFootersToZip(exportDocument, newZip, compressionLevel);\n\n // Serialize comments\n await serializeCommentsToZip(exportDocument, newZip, compressionLevel);\n\n // Optionally update core properties\n if (updateModifiedDate && rawContent.corePropsXml) {\n const updatedCoreProps = updateCoreProperties(rawContent.corePropsXml, {\n updateModifiedDate,\n modifiedBy,\n });\n\n newZip.file('docProps/core.xml', updatedCoreProps, {\n compression: 'DEFLATE',\n compressionOptions: { level: compressionLevel },\n });\n }\n\n // Generate the new DOCX file\n const arrayBuffer = await newZip.generateAsync({\n type: 'arraybuffer',\n compression: 'DEFLATE',\n compressionOptions: { level: compressionLevel },\n });\n\n return arrayBuffer;\n}\n\n// ============================================================================\n// COMMENT PACKAGING HELPERS\n// ============================================================================\n\nconst COMMENTS_CONTENT_TYPE =\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml';\nconst COMMENTS_RELATIONSHIP_TYPE =\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments';\n\n/**\n * Ensure [Content_Types].xml contains an Override for word/comments.xml.\n * If the document already had comments, this is a no-op.\n */\nasync function ensureCommentsContentType(zip: JSZip, compressionLevel: number): Promise<void> {\n const ctFile = zip.file('[Content_Types].xml');\n if (!ctFile) return;\n\n let ctXml = await ctFile.async('text');\n if (ctXml.includes('/word/comments.xml')) return;\n\n // Insert before closing </Types>\n ctXml = ctXml.replace(\n '</Types>',\n `<Override PartName=\"/word/comments.xml\" ContentType=\"${COMMENTS_CONTENT_TYPE}\"/></Types>`\n );\n zip.file('[Content_Types].xml', ctXml, {\n compression: 'DEFLATE',\n compressionOptions: { level: compressionLevel },\n });\n}\n\n/**\n * Ensure word/_rels/document.xml.rels contains a Relationship for comments.xml.\n * If the document already had comments, this is a no-op.\n */\nasync function ensureCommentsRelationship(zip: JSZip, compressionLevel: number): Promise<void> {\n const relsPath = 'word/_rels/document.xml.rels';\n const relsFile = zip.file(relsPath);\n if (!relsFile) return;\n\n let relsXml = await relsFile.async('text');\n if (relsXml.includes('comments.xml')) return;\n\n // Generate a unique rId\n const newRId = `rId${findMaxRId(relsXml) + 1}`;\n\n relsXml = relsXml.replace(\n '</Relationships>',\n `<Relationship Id=\"${newRId}\" Type=\"${COMMENTS_RELATIONSHIP_TYPE}\" Target=\"comments.xml\"/></Relationships>`\n );\n zip.file(relsPath, relsXml, {\n compression: 'DEFLATE',\n compressionOptions: { level: compressionLevel },\n });\n}\n\n// ============================================================================\n// SELECTIVE UPDATES\n// ============================================================================\n\n/**\n * Update only document.xml in a DOCX buffer (minimal changes)\n *\n * @param originalBuffer - Original DOCX as ArrayBuffer\n * @param newDocumentXml - New document.xml content\n * @param options - Optional repack options\n * @returns Promise resolving to DOCX as ArrayBuffer\n */\nexport async function updateDocumentXml(\n originalBuffer: ArrayBuffer,\n newDocumentXml: string,\n options: RepackOptions = {}\n): Promise<ArrayBuffer> {\n const { compressionLevel = 6 } = options;\n\n // Load original ZIP\n const zip = await JSZip.loadAsync(originalBuffer);\n\n // Update document.xml\n zip.file('word/document.xml', newDocumentXml, {\n compression: 'DEFLATE',\n compressionOptions: { level: compressionLevel },\n });\n\n // Generate new DOCX\n return zip.generateAsync({\n type: 'arraybuffer',\n compression: 'DEFLATE',\n compressionOptions: { level: compressionLevel },\n });\n}\n\n/**\n * Update a specific XML file in a DOCX buffer\n *\n * @param originalBuffer - Original DOCX as ArrayBuffer\n * @param path - Path within the ZIP (e.g., \"word/styles.xml\")\n * @param content - New XML content\n * @param options - Optional repack options\n * @returns Promise resolving to DOCX as ArrayBuffer\n */\nexport async function updateXmlFile(\n originalBuffer: ArrayBuffer,\n path: string,\n content: string,\n options: RepackOptions = {}\n): Promise<ArrayBuffer> {\n const { compressionLevel = 6 } = options;\n\n const zip = await JSZip.loadAsync(originalBuffer);\n\n zip.file(path, content, {\n compression: 'DEFLATE',\n compressionOptions: { level: compressionLevel },\n });\n\n return zip.generateAsync({\n type: 'arraybuffer',\n compression: 'DEFLATE',\n compressionOptions: { level: compressionLevel },\n });\n}\n\n/**\n * Update multiple files in a DOCX buffer\n *\n * @param originalBuffer - Original DOCX as ArrayBuffer\n * @param updates - Map of path -> content for files to update\n * @param options - Optional repack options\n * @returns Promise resolving to DOCX as ArrayBuffer\n */\nexport async function updateMultipleFiles(\n originalBuffer: ArrayBuffer,\n updates: Map<string, string | ArrayBuffer>,\n options: RepackOptions = {}\n): Promise<ArrayBuffer> {\n const { compressionLevel = 6 } = options;\n\n const zip = await JSZip.loadAsync(originalBuffer);\n\n for (const [path, content] of updates) {\n zip.file(path, content, {\n compression: 'DEFLATE',\n compressionOptions: { level: compressionLevel },\n });\n }\n\n return zip.generateAsync({\n type: 'arraybuffer',\n compression: 'DEFLATE',\n compressionOptions: { level: compressionLevel },\n });\n}\n\n// ============================================================================\n// RELATIONSHIP MANAGEMENT\n// ============================================================================\n\n/**\n * Add a new relationship to document.xml.rels\n *\n * @param originalBuffer - Original DOCX as ArrayBuffer\n * @param relationship - New relationship to add\n * @returns Promise resolving to { buffer: ArrayBuffer, rId: string }\n */\nexport async function addRelationship(\n originalBuffer: ArrayBuffer,\n relationship: {\n type: string;\n target: string;\n targetMode?: 'External' | 'Internal';\n }\n): Promise<{ buffer: ArrayBuffer; rId: string }> {\n const zip = await JSZip.loadAsync(originalBuffer);\n\n // Read existing relationships\n const relsPath = 'word/_rels/document.xml.rels';\n const relsFile = zip.file(relsPath);\n\n if (!relsFile) {\n throw new Error('document.xml.rels not found in DOCX');\n }\n\n const relsXml = await relsFile.async('text');\n\n // Generate new rId\n const newRId = `rId${findMaxRId(relsXml) + 1}`;\n\n // Build new relationship element\n const targetModeAttr = relationship.targetMode === 'External' ? ' TargetMode=\"External\"' : '';\n\n const newRelElement = `<Relationship Id=\"${newRId}\" Type=\"${relationship.type}\" Target=\"${escapeXml(relationship.target)}\"${targetModeAttr}/>`;\n\n // Insert before closing tag\n const updatedRelsXml = relsXml.replace('</Relationships>', `${newRelElement}</Relationships>`);\n\n // Update the ZIP\n zip.file(relsPath, updatedRelsXml);\n\n const buffer = await zip.generateAsync({\n type: 'arraybuffer',\n compression: 'DEFLATE',\n compressionOptions: { level: 6 },\n });\n\n return { buffer, rId: newRId };\n}\n\n/**\n * Add a media file to the DOCX\n *\n * @param originalBuffer - Original DOCX as ArrayBuffer\n * @param filename - Filename for the media (e.g., \"image1.png\")\n * @param data - Binary data for the media file\n * @param mimeType - MIME type (e.g., \"image/png\")\n * @returns Promise resolving to { buffer: ArrayBuffer, rId: string, path: string }\n */\nexport async function addMedia(\n originalBuffer: ArrayBuffer,\n filename: string,\n data: ArrayBuffer,\n mimeType: string\n): Promise<{ buffer: ArrayBuffer; rId: string; path: string }> {\n const zip = await JSZip.loadAsync(originalBuffer);\n\n // Determine media path\n const mediaPath = `word/media/${filename}`;\n\n // Add media file\n zip.file(mediaPath, data);\n\n // Add relationship\n const relResult = await addRelationship(await zip.generateAsync({ type: 'arraybuffer' }), {\n type: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',\n target: `media/${filename}`,\n });\n\n // Update content types if needed\n const contentTypesFile = zip.file('[Content_Types].xml');\n if (contentTypesFile) {\n const contentTypesXml = await contentTypesFile.async('text');\n const extension = filename.split('.').pop()?.toLowerCase() || '';\n\n // Check if extension is already registered\n const hasExtension = contentTypesXml.includes(`Extension=\"${extension}\"`);\n\n if (!hasExtension && extension) {\n // Add content type for this extension\n const contentType = getContentTypeForExtension(extension, mimeType);\n const extensionElement = `<Default Extension=\"${extension}\" ContentType=\"${contentType}\"/>`;\n\n // Insert after other defaults\n const updatedContentTypes = contentTypesXml.replace(\n '</Types>',\n `${extensionElement}</Types>`\n );\n\n const finalZip = await JSZip.loadAsync(relResult.buffer);\n finalZip.file('[Content_Types].xml', updatedContentTypes);\n\n return {\n buffer: await finalZip.generateAsync({\n type: 'arraybuffer',\n compression: 'DEFLATE',\n compressionOptions: { level: 6 },\n }),\n rId: relResult.rId,\n path: mediaPath,\n };\n }\n }\n\n return {\n buffer: relResult.buffer,\n rId: relResult.rId,\n path: mediaPath,\n };\n}\n\n// ============================================================================\n// HEADER/FOOTER SERIALIZATION\n// ============================================================================\n\n/**\n * Serialize modified headers and footers into the ZIP\n *\n * Maps rId → filename via relationships, then serializes each\n * HeaderFooter object to its corresponding word/header*.xml or word/footer*.xml\n */\nfunction serializeHeadersFootersToZip(doc: Document, zip: JSZip, compressionLevel: number): void {\n const rels = doc.package.relationships;\n if (!rels) return;\n\n const compressionOptions = { level: compressionLevel };\n\n // Serialize headers\n if (doc.package.headers) {\n for (const [rId, headerFooter] of doc.package.headers.entries()) {\n const rel = rels.get(rId);\n if (rel && rel.type === RELATIONSHIP_TYPES.header && rel.target) {\n const filename = rel.target.startsWith('/') ? rel.target.slice(1) : `word/${rel.target}`;\n const xml = serializeHeaderFooter(headerFooter);\n zip.file(filename, xml, { compression: 'DEFLATE', compressionOptions });\n }\n }\n }\n\n // Serialize footers\n if (doc.package.footers) {\n for (const [rId, headerFooter] of doc.package.footers.entries()) {\n const rel = rels.get(rId);\n if (rel && rel.type === RELATIONSHIP_TYPES.footer && rel.target) {\n const filename = rel.target.startsWith('/') ? rel.target.slice(1) : `word/${rel.target}`;\n const xml = serializeHeaderFooter(headerFooter);\n zip.file(filename, xml, { compression: 'DEFLATE', compressionOptions });\n }\n }\n }\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Update core properties XML with new modification date\n */\nfunction updateCoreProperties(\n corePropsXml: string,\n options: { updateModifiedDate?: boolean; modifiedBy?: string }\n): string {\n let result = corePropsXml;\n\n if (options.updateModifiedDate) {\n const now = new Date().toISOString();\n\n // Update dcterms:modified\n if (result.includes('<dcterms:modified')) {\n result = result.replace(\n /<dcterms:modified[^>]*>[^<]*<\\/dcterms:modified>/,\n `<dcterms:modified xsi:type=\"dcterms:W3CDTF\">${now}</dcterms:modified>`\n );\n } else {\n // Add modified date if not present\n result = result.replace(\n '</cp:coreProperties>',\n `<dcterms:modified xsi:type=\"dcterms:W3CDTF\">${now}</dcterms:modified></cp:coreProperties>`\n );\n }\n }\n\n if (options.modifiedBy) {\n // Update cp:lastModifiedBy\n if (result.includes('<cp:lastModifiedBy')) {\n result = result.replace(\n /<cp:lastModifiedBy>[^<]*<\\/cp:lastModifiedBy>/,\n `<cp:lastModifiedBy>${escapeXml(options.modifiedBy)}</cp:lastModifiedBy>`\n );\n } else {\n // Add lastModifiedBy if not present\n result = result.replace(\n '</cp:coreProperties>',\n `<cp:lastModifiedBy>${escapeXml(options.modifiedBy)}</cp:lastModifiedBy></cp:coreProperties>`\n );\n }\n }\n\n return result;\n}\n\n/**\n * Get content type for a file extension\n */\nfunction getContentTypeForExtension(extension: string, mimeType: string): string {\n // Use provided mime type or fall back to common types\n if (mimeType) return mimeType;\n\n const contentTypes: Record<string, string> = {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n bmp: 'image/bmp',\n tif: 'image/tiff',\n tiff: 'image/tiff',\n svg: 'image/svg+xml',\n webp: 'image/webp',\n wmf: 'image/x-wmf',\n emf: 'image/x-emf',\n };\n\n return contentTypes[extension] || 'application/octet-stream';\n}\n\n// ============================================================================\n// VALIDATION\n// ============================================================================\n\n/**\n * Validate that a buffer is a valid DOCX file\n *\n * @param buffer - Buffer to validate\n * @returns Promise resolving to validation result\n */\nexport async function validateDocx(buffer: ArrayBuffer): Promise<{\n valid: boolean;\n errors: string[];\n warnings: string[];\n}> {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n try {\n const zip = await JSZip.loadAsync(buffer);\n\n // Check for required files\n const requiredFiles = ['[Content_Types].xml', 'word/document.xml'];\n\n for (const file of requiredFiles) {\n if (!zip.file(file)) {\n errors.push(`Missing required file: ${file}`);\n }\n }\n\n // Check for recommended files\n const recommendedFiles = ['_rels/.rels', 'word/_rels/document.xml.rels', 'word/styles.xml'];\n\n for (const file of recommendedFiles) {\n if (!zip.file(file)) {\n warnings.push(`Missing recommended file: ${file}`);\n }\n }\n\n // Validate document.xml is valid XML\n const docFile = zip.file('word/document.xml');\n if (docFile) {\n const docXml = await docFile.async('text');\n\n // Basic XML validation\n if (!docXml.includes('<?xml')) {\n warnings.push('document.xml missing XML declaration');\n }\n\n if (!docXml.includes('<w:document')) {\n errors.push('document.xml missing w:document element');\n }\n\n if (!docXml.includes('<w:body>')) {\n errors.push('document.xml missing w:body element');\n }\n }\n\n // Validate Content_Types.xml\n const ctFile = zip.file('[Content_Types].xml');\n if (ctFile) {\n const ctXml = await ctFile.async('text');\n\n if (\n !ctXml.includes('word/document.xml') &&\n !ctXml.includes(\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml'\n )\n ) {\n warnings.push('Content_Types.xml may be missing document.xml type declaration');\n }\n }\n } catch (error) {\n errors.push(\n `Failed to read as ZIP: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n/**\n * Check if buffer looks like a DOCX file (quick check)\n *\n * @param buffer - Buffer to check\n * @returns true if buffer starts with ZIP signature\n */\nexport function isDocxBuffer(buffer: ArrayBuffer): boolean {\n if (buffer.byteLength < 4) return false;\n\n const view = new Uint8Array(buffer);\n\n // ZIP file signature: PK (0x50, 0x4B)\n return view[0] === 0x50 && view[1] === 0x4b;\n}\n\n// ============================================================================\n// CREATE NEW DOCX\n// ============================================================================\n\n/**\n * Create a new empty DOCX file\n *\n * @returns Promise resolving to minimal DOCX as ArrayBuffer\n */\nexport async function createEmptyDocx(): Promise<ArrayBuffer> {\n const zip = new JSZip();\n\n // Content Types\n zip.file(\n '[Content_Types].xml',\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\n <Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>\n <Default Extension=\"xml\" ContentType=\"application/xml\"/>\n <Override PartName=\"/word/document.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\"/>\n <Override PartName=\"/word/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\"/>\n <Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\"/>\n <Override PartName=\"/docProps/app.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.extended-properties+xml\"/>\n</Types>`\n );\n\n // Package relationships\n zip.file(\n '_rels/.rels',\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"word/document.xml\"/>\n <Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\" Target=\"docProps/core.xml\"/>\n <Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\" Target=\"docProps/app.xml\"/>\n</Relationships>`\n );\n\n // Document relationships\n zip.file(\n 'word/_rels/document.xml.rels',\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>\n</Relationships>`\n );\n\n // Document\n zip.file(\n 'word/document.xml',\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:document xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\n <w:body>\n <w:p>\n <w:r>\n <w:t></w:t>\n </w:r>\n </w:p>\n <w:sectPr>\n <w:pgSz w:w=\"12240\" w:h=\"15840\"/>\n <w:pgMar w:top=\"1440\" w:right=\"1440\" w:bottom=\"1440\" w:left=\"1440\" w:header=\"720\" w:footer=\"720\" w:gutter=\"0\"/>\n </w:sectPr>\n </w:body>\n</w:document>`\n );\n\n // Minimal styles\n zip.file(\n 'word/styles.xml',\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:styles xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\n <w:docDefaults>\n <w:rPrDefault>\n <w:rPr>\n <w:rFonts w:ascii=\"Calibri\" w:hAnsi=\"Calibri\"/>\n <w:sz w:val=\"22\"/>\n </w:rPr>\n </w:rPrDefault>\n <w:pPrDefault>\n <w:pPr>\n <w:spacing w:after=\"200\" w:line=\"276\" w:lineRule=\"auto\"/>\n </w:pPr>\n </w:pPrDefault>\n </w:docDefaults>\n <w:style w:type=\"paragraph\" w:default=\"1\" w:styleId=\"Normal\">\n <w:name w:val=\"Normal\"/>\n </w:style>\n</w:styles>`\n );\n\n // Core properties\n const now = new Date().toISOString();\n zip.file(\n 'docProps/core.xml',\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<cp:coreProperties xmlns:cp=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:dcterms=\"http://purl.org/dc/terms/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n <dc:creator>EigenPal DOCX Editor</dc:creator>\n <dcterms:created xsi:type=\"dcterms:W3CDTF\">${now}</dcterms:created>\n <dcterms:modified xsi:type=\"dcterms:W3CDTF\">${now}</dcterms:modified>\n</cp:coreProperties>`\n );\n\n // App properties\n zip.file(\n 'docProps/app.xml',\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\">\n <Application>EigenPal DOCX Editor</Application>\n <AppVersion>1.0.0</AppVersion>\n</Properties>`\n );\n\n return zip.generateAsync({\n type: 'arraybuffer',\n compression: 'DEFLATE',\n compressionOptions: { level: 6 },\n });\n}\n\n/**\n * Create a new DOCX from a Document (without requiring original buffer)\n *\n * @param doc - Document to serialize\n * @returns Promise resolving to DOCX as ArrayBuffer\n */\nexport async function createDocx(doc: Document): Promise<ArrayBuffer> {\n // Start with an empty DOCX\n const emptyBuffer = await createEmptyDocx();\n\n // Add document as original buffer\n const docWithBuffer: Document = {\n ...doc,\n originalBuffer: emptyBuffer,\n };\n\n // Repack with the document content\n return repackDocx(docWithBuffer);\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default repackDocx;\n","/**\n * Header/Footer Serializer - Serialize headers/footers to OOXML XML\n *\n * Converts HeaderFooter objects back to valid header*.xml / footer*.xml format.\n * Reuses paragraph and table serializers for content.\n *\n * OOXML Reference:\n * - Header root: w:hdr\n * - Footer root: w:ftr\n * - Content: w:p, w:tbl (same as document body)\n */\n\nimport type { HeaderFooter, Paragraph, Table } from '../../types/document';\nimport { serializeParagraph } from './paragraphSerializer';\nimport { serializeTable } from './tableSerializer';\n\n// Minimal namespaces needed for header/footer XML\nconst NAMESPACES: Record<string, string> = {\n wpc: 'http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas',\n mc: 'http://schemas.openxmlformats.org/markup-compatibility/2006',\n o: 'urn:schemas-microsoft-com:office:office',\n r: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n m: 'http://schemas.openxmlformats.org/officeDocument/2006/math',\n v: 'urn:schemas-microsoft-com:vml',\n wp14: 'http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing',\n wp: 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing',\n w10: 'urn:schemas-microsoft-com:office:word',\n w: 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',\n w14: 'http://schemas.microsoft.com/office/word/2010/wordml',\n w15: 'http://schemas.microsoft.com/office/word/2012/wordml',\n wpg: 'http://schemas.microsoft.com/office/word/2010/wordprocessingGroup',\n wps: 'http://schemas.microsoft.com/office/word/2010/wordprocessingShape',\n};\n\nfunction buildNamespaceDeclarations(): string {\n return Object.entries(NAMESPACES)\n .map(([prefix, uri]) => `xmlns:${prefix}=\"${uri}\"`)\n .join(' ');\n}\n\n/**\n * Serialize a block content item (paragraph or table) for header/footer\n */\nfunction serializeBlock(block: Paragraph | Table): string {\n if (block.type === 'paragraph') {\n return serializeParagraph(block);\n } else if (block.type === 'table') {\n return serializeTable(block);\n }\n return '';\n}\n\n/**\n * Serialize a HeaderFooter object to valid OOXML XML\n *\n * @param hf - HeaderFooter object to serialize\n * @returns Complete XML string for header*.xml or footer*.xml\n */\nexport function serializeHeaderFooter(hf: HeaderFooter): string {\n const rootTag = hf.type === 'header' ? 'w:hdr' : 'w:ftr';\n const nsDecl = buildNamespaceDeclarations();\n\n // Serialize content blocks\n let contentXml = hf.content.map((block) => serializeBlock(block)).join('');\n\n // Ensure at least one empty paragraph (required by OOXML spec)\n if (!contentXml) {\n contentXml = '<w:p><w:pPr/></w:p>';\n }\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<${rootTag} ${nsDecl}>${contentXml}</${rootTag}>`;\n}\n","/**\n * Comment Serializer\n *\n * Serializes Comment[] to OOXML comments.xml format.\n */\n\nimport type { Comment, Paragraph, Run } from '../../types/content';\nimport { escapeXml } from './xmlUtils';\n\nfunction serializeRunContent(run: Run): string {\n let xml = '<w:r>';\n // Run properties (minimal — just preserve formatting basics)\n const rPr: string[] = [];\n if (run.formatting?.bold) rPr.push('<w:b/>');\n if (run.formatting?.italic) rPr.push('<w:i/>');\n if (rPr.length > 0) xml += `<w:rPr>${rPr.join('')}</w:rPr>`;\n\n for (const c of run.content) {\n if (c.type === 'text') {\n const preserveSpace = c.text !== c.text.trim() || c.text.includes(' ');\n xml += preserveSpace\n ? `<w:t xml:space=\"preserve\">${escapeXml(c.text)}</w:t>`\n : `<w:t>${escapeXml(c.text)}</w:t>`;\n } else if (c.type === 'break') {\n xml += '<w:br/>';\n }\n }\n xml += '</w:r>';\n return xml;\n}\n\nfunction serializeParagraph(p: Paragraph): string {\n let xml = '<w:p>';\n for (const item of p.content) {\n if (item.type === 'run') {\n xml += serializeRunContent(item);\n }\n }\n xml += '</w:p>';\n return xml;\n}\n\n/** Serialize a paragraph, prepending an annotationRef run (required by Word in first paragraph of a comment) */\nfunction serializeParagraphWithAnnotationRef(p: Paragraph): string {\n let xml = '<w:p>';\n xml += '<w:r><w:rPr><w:rStyle w:val=\"CommentReference\"/></w:rPr><w:annotationRef/></w:r>';\n for (const item of p.content) {\n if (item.type === 'run') {\n xml += serializeRunContent(item);\n }\n }\n xml += '</w:p>';\n return xml;\n}\n\nfunction serializeComment(comment: Comment): string {\n const attrs: string[] = [`w:id=\"${comment.id}\"`];\n if (comment.author) attrs.push(`w:author=\"${escapeXml(comment.author)}\"`);\n if (comment.initials) attrs.push(`w:initials=\"${escapeXml(comment.initials)}\"`);\n if (comment.date) attrs.push(`w:date=\"${escapeXml(comment.date)}\"`);\n\n let xml = `<w:comment ${attrs.join(' ')}>`;\n if (comment.content && comment.content.length > 0) {\n // First paragraph must contain an annotationRef run for Word to link the comment\n xml += serializeParagraphWithAnnotationRef(comment.content[0]);\n for (let i = 1; i < comment.content.length; i++) {\n xml += serializeParagraph(comment.content[i]);\n }\n } else {\n // Empty comment — still needs a paragraph with annotationRef\n xml +=\n '<w:p><w:r><w:rPr><w:rStyle w:val=\"CommentReference\"/></w:rPr><w:annotationRef/></w:r></w:p>';\n }\n xml += '</w:comment>';\n return xml;\n}\n\n/**\n * Serialize comments array to comments.xml content\n */\nexport function serializeComments(comments: Comment[]): string {\n if (!comments || comments.length === 0) return '';\n\n // Separate top-level comments and replies in a single pass\n const topLevel: Comment[] = [];\n const replies: Comment[] = [];\n for (const c of comments) {\n (c.parentId == null ? topLevel : replies).push(c);\n }\n\n let xml =\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n' +\n '<w:comments xmlns:wpc=\"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas\" ' +\n 'xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" ' +\n 'xmlns:o=\"urn:schemas-microsoft-com:office:office\" ' +\n 'xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" ' +\n 'xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" ' +\n 'xmlns:v=\"urn:schemas-microsoft-com:vml\" ' +\n 'xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" ' +\n 'xmlns:w10=\"urn:schemas-microsoft-com:office:word\" ' +\n 'xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" ' +\n 'xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" ' +\n 'xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\" ' +\n 'xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\" ' +\n 'xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" ' +\n 'xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\" ' +\n 'mc:Ignorable=\"w14 wp14\">';\n\n // Serialize top-level comments first, then replies\n for (const comment of topLevel) {\n xml += serializeComment(comment);\n }\n for (const reply of replies) {\n xml += serializeComment(reply);\n }\n\n xml += '</w:comments>';\n return xml;\n}\n"]}
|