From 26264b2aed1260763fedcdb3579024196391461a Mon Sep 17 00:00:00 2001 From: Stanislav Pankevich Date: Tue, 24 Feb 2026 19:10:39 +0100 Subject: [PATCH] Bump version to 0.0.32 WHAT: This synchronizes to the upstream commit: 38cd41c71fbc55b011eb3ddedb14d023d8408a86. Since the last sync, there were several fixes made, especially the issue with empty

paragraphs that could result in empty pages printed. The empty

paragraphs were reproduced in the input content produced by a commercial tool. Technically, it is not an issue with html2pdf4doc.js per se, but we decided to handle this case anyway. WHY: This helps us to test out the current batch of fixes and continue testing with the improved baseline. --- html2pdf4doc/__init__.py | 2 +- html2pdf4doc/html2pdf4doc_js/html2pdf4doc.min.js | 8 ++++---- html2pdf4doc/main.py | 6 +++--- submodules/html2pdf | 2 +- .../test.py | 10 +++++----- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/html2pdf4doc/__init__.py b/html2pdf4doc/__init__.py index 6df17d2..5d15239 100644 --- a/html2pdf4doc/__init__.py +++ b/html2pdf4doc/__init__.py @@ -1,7 +1,7 @@ import os from pathlib import Path -__version__ = "0.0.31" +__version__ = "0.0.32" PATH_TO_HTML2PDF4DOC_PY = os.path.join( os.path.dirname(os.path.join(__file__)), diff --git a/html2pdf4doc/html2pdf4doc_js/html2pdf4doc.min.js b/html2pdf4doc/html2pdf4doc_js/html2pdf4doc.min.js index e4acdc0..ad1392b 100644 --- a/html2pdf4doc/html2pdf4doc_js/html2pdf4doc.min.js +++ b/html2pdf4doc/html2pdf4doc_js/html2pdf4doc.min.js @@ -1,11 +1,11 @@ /*! Version: 0.3.0 */ -var HTML2PDF4DOC;(()=>{"use strict";var e={d:(t,i)=>{for(var o in i)e.o(i,o)&&!e.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:i[o]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{init:()=>wn});var i={};e.r(i),e.d(i,{log:()=>A,logGroup:()=>B,logGroupEnd:()=>F,strictAssert:()=>H});var o={};e.r(o),e.d(o,{isAfterContentFlowStart:()=>te,isComplexTextBlock:()=>oe,isContentFlowEnd:()=>ie,isContentFlowStart:()=>ee,isFlexRow:()=>ue,isForcedPageBreak:()=>re,isGrid:()=>le,isGridAutoFlowRow:()=>ge,isIMG:()=>K,isInline:()=>se,isInlineBlock:()=>ae,isLiNode:()=>Y,isNeutral:()=>X,isNotBreakable:()=>pe,isOBJECT:()=>q,isPRE:()=>de,isSTYLE:()=>V,isSVG:()=>U,isSelectorMatching:()=>j,isSignificantTextNode:()=>z,isSliced:()=>_e,isSlough:()=>fe,isSyntheticTextWrapper:()=>ne,isTableLikeNode:()=>he,isTableNode:()=>ce,isWrappedTextGroup:()=>Q,isWrappedTextLine:()=>J,isWrappedTextNode:()=>Z});var n={};e.r(n),e.d(n,{explainHeuristicSelectorMismatch:()=>Ce,filterHeuristicSelectorMatches:()=>Ee,hasNoSignificantSiblingNodes:()=>Se,hasSignificantLeadingText:()=>Me,hasSignificantTrailingText:()=>Pe,isHeuristicSelector:()=>we,resolveConfigSelectorConstraints:()=>be,validateHeuristicSelectorMatch:()=>ye});var r={};e.r(r),e.d(r,{insertStyle:()=>Te});var s={};e.r(s),e.d(s,{isFirstChildOfFirstChild:()=>ve,isLastChildOfLastChild:()=>De,isLineChanged:()=>ke,isLineKept:()=>Re,resolveFlowElement:()=>xe,setInitStyle:()=>Ne});var a={};e.r(a),e.d(a,{getBottom:()=>$e,getBottomWithMargin:()=>Ge,getContentHeightByProbe:()=>Ze,getEmptyNodeHeightByProbe:()=>Ve,getHeightWithMargin:()=>We,getLineHeight:()=>Ke,getMaxWidth:()=>ze,getNormalizedBottomWithMargin:()=>He,getNormalizedTop:()=>Ae,getTableEmptyRowHeight:()=>qe,getTableEntries:()=>Xe,getTableRowHeight:()=>Ue,getTableRowShellHeightByTD:()=>Ye,getTop:()=>Ie,getTopForPageStartCandidate:()=>Fe,getTopWithMargin:()=>je,resolveRowBoundsGeneric:()=>Je});var l={};e.r(l),e.d(l,{create:()=>Qe,createComplexTextBlock:()=>at,createForcedPageBreak:()=>ct,createNeutral:()=>et,createNeutralBlock:()=>tt,createPrintPageBreak:()=>st,createSignpost:()=>dt,createSliceWrapper:()=>ut,createTable:()=>gt,createTestNodeFrom:()=>lt,createTextGroup:()=>nt,createTextLine:()=>ot,createTextNodeWrapper:()=>it,createWithFlagNoBreak:()=>rt,createWord:()=>ht});var h={};e.r(h),e.d(h,{prepareSplittedNode:()=>mt,splitByWordsGreedyWithSpacesFilter:()=>ft,splitTextByLinesGreedy:()=>pt,splitTextByWordsGreedy:()=>_t});var c={};e.r(c),e.d(c,{MarkersState:()=>Lt,isNoBreak:()=>Bt,isNoHanging:()=>Ft,isPageStart:()=>xt,isSlice:()=>At,markBottomCut:()=>kt,markCleanBottomCut:()=>vt,markCleanTopCut:()=>Ot,markNoBreak:()=>St,markNoHanging:()=>Mt,markPageEnd:()=>Et,markPageNumber:()=>Tt,markPageStart:()=>yt,markProcessed:()=>wt,markSlice:()=>Pt,markSliceCuts:()=>Rt,markSliceCutsInRows:()=>Nt,markTopCut:()=>Dt,unmarkPageStart:()=>Ct});var d={};e.r(d),e.d(d,{_getMarkAttributeConfig:()=>ii,_isStyleMark:()=>oi,_registerMark:()=>Qt,_unregisterMark:()=>ei,clearMark:()=>zt,getMark:()=>Wt,getRegisteredPageDividers:()=>Yt,getRegisteredPageEnds:()=>ti,getRegisteredPageNumberForElement:()=>Jt,getRegisteredPageNumbers:()=>Zt,hasMark:()=>jt,registerPageDivider:()=>qt,setMark:()=>Gt});var g={};e.r(g),e.d(g,{wrapNodeChildrenWithNeutralBlock:()=>ni});var u={};e.r(u),e.d(u,{copyNodeWidth:()=>hi,estimateInlineImgGapBelow:()=>gi,fitElementWithinBoundaries:()=>si,fitElementWithinHeight:()=>ai,lockNodesWidths:()=>di,lockTableWidths:()=>ci,scaleCellsToHeight:()=>li});var p={};e.r(p),e.d(p,{findAllForcedPageBreakInside:()=>Si,findBetterForcedPageStarter:()=>pi,findBetterPageStart:()=>_i,findFirstChildParent:()=>bi,findFirstChildParentFromPage:()=>fi,findLastChildParent:()=>wi,findPreviousNonHangingsFromPage:()=>mi});var _={};e.r(_),e.d(_,{getFirstChildrenChain:()=>vi,getLastChildrenChain:()=>Di,getPreparedChildren:()=>Ti,getSplitChildren:()=>Oi});var f={};e.r(f),e.d(f,{isReplacedElement:()=>Ii,resolveReplacedElement:()=>Li});var m={};e.r(m),e.d(m,{cloneAndCleanOutsideRange:()=>Ui,getSplitPoints:()=>Gi,getSplitPointsPerCells:()=>Wi,isFirstSliceEmpty:()=>Ki,normalizeContentCuts:()=>zi,sliceNodeBySplitPoints:()=>ji,sliceNodeContentBySplitPoints:()=>Vi});var b={};e.r(b),e.d(b,{shouldSkipFlowElement:()=>Ji});var w={};e.r(w),e.d(w,{getBCRCached:()=>Qi,getComputedStyleCached:()=>eo,resetMeasureCache:()=>to});var S={};e.r(S),e.d(S,{buildRowSlices:()=>oo,evaluateRowSplitPlacement:()=>ro,paginationBuildBalancedRowSlices:()=>no,replaceCurrentRowsAfterRowSplit:()=>so,sliceCellsBySplitPoints:()=>io});var M={};e.r(M),e.d(M,{paginationApplyFullPageScaling:()=>co,paginationScaleCellsToHeight:()=>lo,paginationShouldScaleFullPage:()=>ho});var P={};e.r(P),e.d(P,{applyRowSlicesToEntriesAfterRowSplit:()=>go,computeRowFlags:()=>uo});var y={};e.r(y),e.d(y,{paginationRefreshRowsAfterSplit:()=>_o,validateSplitterAdapter:()=>po});var C={};e.r(C),e.d(C,{paginationComputeCellShellHeights:()=>fo});var E={};e.r(E),e.d(E,{handleRowOverflow:()=>wo,handleRowSplitFailure:()=>So,scaleRowCellsToHeight:()=>bo});var T={};e.r(T),e.d(T,{absorbShortTrailingSliceIfFits:()=>Po,calculateFinalPartReclaimedHeight:()=>Mo});var O={};e.r(O),e.d(O,{paginationBuildRowEvaluationContext:()=>Co,paginationCanAbsorbLastRow:()=>Eo});var v={};e.r(v),e.d(v,{paginationCalculateRowSplitBudget:()=>ko,paginationHandleRowSlicesPlacement:()=>Fo,paginationProcessRowSplitResult:()=>xo,paginationResolveAlreadySlicedRow:()=>Do,paginationResolveOverflowingRow:()=>Oo,paginationResolveRowWithRowspan:()=>vo,paginationResolveSplittableRow:()=>Bo,paginationSplitRow:()=>Ro});const D="html2pdf4doc",k="html2pdf";function R(e,t){if("string"!=typeof e)return e;if(!e.includes(D))return e;if(t){if(!e.includes(t))return e;const i=t.replaceAll(D,k);if(i===t)return e;const o=e.replaceAll(t,i);return o===e?e:`${e},${o}`}const i=e.replaceAll(D,k);return i===e?e:`${e},${i}`}const N={init:"[html2pdf4doc]",root:"html2pdf4doc-root",paperFlow:"html2pdf4doc-paper-flow",contentFlow:"html2pdf4doc-content-flow",overlayFlow:"html2pdf4doc-overlay-flow",pageDivider:"html2pdf4doc-page",pageStartMarker:"[html2pdf4doc-page-start]",pageEndMarker:"[html2pdf4doc-page-end]",pageMarker:"[html2pdf4doc-page]",contentFlowStart:"html2pdf4doc-content-flow-start",contentFlowEnd:"html2pdf4doc-content-flow-end",style:"[html2pdf4doc-style]",frontpageTemplate:"[html2pdf4doc-frontpage]",headerTemplate:"[html2pdf4doc-header]",footerTemplate:"[html2pdf4doc-footer]",frontpageElement:"html2pdf4doc-frontpage",frontpageContent:"html2pdf4doc-frontpage-content",headerContent:"html2pdf4doc-header",footerContent:"html2pdf4doc-footer",pageNumberRoot:"[html2pdf4doc-page-number]",pageNumberCurrent:"[html2pdf4doc-page-number-current]",pageNumberTotal:"[html2pdf4doc-page-number-total]",pageChrome:"html2pdf4doc-page-chrome",pageBodySpacer:"html2pdf4doc-page-body-spacer",pageHeader:"html2pdf4doc-page-header",pageFooter:"html2pdf4doc-page-footer",printPageBreak:"html2pdf4doc-print-page-break",runningSafety:"html2pdf4doc-print-running",virtualPaper:"html2pdf4doc-virtual-paper",virtualPaperTopMargin:"html2pdf4doc-virtual-paper-margin-top",virtualPaperBottomMargin:"html2pdf4doc-virtual-paper-margin-bottom",virtualPaperGap:"html2pdf4doc-virtual-paper-gap",printIgnore:"[html2pdf4doc-print-ignore]",printHide:"[html2pdf4doc-print-hide]",neutral:"html2pdf4doc-neutral",word:"html2pdf4doc-word",textNode:"html2pdf4doc-text-node",textLine:"html2pdf4doc-text-line",textGroup:"html2pdf4doc-text-group",complexTextBlock:"html2pdf4doc-complex-text-block",printForcedPageBreak:"html2pdf4doc-print-forced-page-break",split:"[html2pdf4doc-split]",processed:"[html2pdf4doc-processed]",flagNoBreak:"[html2pdf4doc-flag-no-break]",flagNoHanging:"[html2pdf4doc-flag-no-hanging]",flagSlice:"[html2pdf4doc-flag-slice]",topCutPart:".html2pdf4doc-top-cut",bottomCutPart:".html2pdf4doc-bottom-cut",cleanTopCut:".html2pdf4doc-clean-top-cut",cleanBottomCut:".html2pdf4doc-clean-bottom-cut",tocPageNumber:"html2pdf4doc-toc-page-number"},x="background:#eee;color:#888;padding: 0 1px 0 0;";function B(e,t="",i=!1){"boolean"==typeof t&&(i=t,t=""),!0===i?this._debug._&&console.groupCollapsed(`%c${e}`,t):this._debug._&&console.group(`%c${e}`,t)}function F(e){this._debug._&&console.log(`%c ▲ ${e} `,x),this._debug._&&console.groupEnd()}function A(e,...t){this._debug._&&console.log(`[${e}]`,...t)}function H(e,...t){this._assert&&console.assert(e,"⛔",...t)}class I{constructor({DOM:e,config:t}){this.document=e,this.body=e.body,this._debug=t.debugMode?{...t.debugConfig.DOM}:{},this._assert=!!t.consoleAssert,Object.assign(this,i)}createElement(e){return this.document.createElement(e)}createDocumentFragment(){return this.document.createDocumentFragment()}cloneNode(e){return e?.cloneNode(!0)}cloneNodeWrapper(e){return e?.cloneNode(!1)}insertBefore(e,...t){const i=t.filter(e=>null!=e);e.before(...i)}insertAfter(e,...t){const i=t.filter(e=>null!=e);e.after(...i)}insertAtEnd(e,...t){const i=t.filter(e=>null!=e);e.append(...i)}insertAtStart(e,...t){const i=t.filter(e=>null!=e);e.prepend(...i)}insertInsteadOf(e,...t){this.insertBefore(e,...t),e.remove()}wrap(e,t){return e.before(t),t.append(e),t}moveContent(e,t){for(;e.firstChild;)t.append(e.firstChild);this.strictAssert(""===this.getInnerHTML(e))}moveRowContent(e,t){if(!e||!t)return void(this._debug._&&console.warn("moveRowContent(): sourceTR or targetTR is missing"));const i=this.getElementTagName(e),o=this.getElementTagName(t);this.strictAssert("TR"===i,`moveRowContent(): source is not TR, got ${i}`),this.strictAssert("TR"===o,`moveRowContent(): target is not TR, got ${o}`);const n=[...this.getChildren(e)],r=[...this.getChildren(t)];n.length!==r.length&&this._debug._&&console.warn(`moveRowContent(): cells count mismatch: ${n.length} (source) vs ${r.length} (target)`);const s=Math.min(n.length,r.length);for(let e=0;e0,"getAll(selectors), selectors:",e),1===e.length?[...this.getAllElements(e[0],t)]:[...e].flatMap(e=>[...this.getAllElements(e,t)])}getElement(e,t=this.document){return this.strictAssert(e),t.querySelector(e)}getAllElements(e,t=this.document){return this.strictAssert(e),t.querySelectorAll(e)}getElementById(e,t=this.document){return t.getElementById(e)}getNodeType(e){return e.nodeType}getRightNeighbor(e){return e.nextElementSibling}getLeftNeighbor(e){return e.previousElementSibling}getParentNode(e){return e.parentElement}getNodeValue(e){return e.nodeValue}getNodeWholeText(e){return e.wholeText}getLastElementChild(e){return e.lastElementChild}getFirstElementChild(e){return e.firstElementChild}getChildNodes(e){return e.childNodes}getChildren(e){return e.children}getElementOffsetParent(e){return e.offsetParent}getComputedStyle(e){return window.getComputedStyle(e)}getElementBCR(e){return e.getBoundingClientRect()}getElementOffsetLeft(e){return e?.offsetLeft}getElementOffsetHeight(e){return e?.offsetHeight}getElementOffsetWidth(e){return e?.offsetWidth}getElementOffsetTop(e){return e?.offsetTop}getElementOffsetBottom(e){return e?.offsetTop+e?.offsetHeight||void 0}getElementTagName(e){return e.tagName}getDataId(e){return e.dataset.id}getAttribute(e,t){if(!e||!t)return void(this._debug._&&console.warn("getAttribute() must have 2 params"));const i=t.charAt(0);if("."!==i&&"#"!==i||this.log("getAttribute",`you're really sure ${t} is attribute selector?`),"["===i){this.strictAssert("]"===t.at(-1),`the ${t} selector is not OK.`);const i=t.substring(1,t.length-1);return e.getAttribute(i)}e.getAttribute(t)}setAttribute(e,t,i){if(!e||!t)return void(this._debug._&&console.warn("setAttribute() must have 2 params"));const o=t.charAt(0);if("."===o){const i=t.substring(1);return void e.classList.add(i)}if("#"===o){const i=t.substring(1);return void(e.id=i)}if("["===o){this.strictAssert("]"===t.at(-1),`the ${t} selector is not OK.`);const o=t.substring(1,t.length-1);return void e.setAttribute(o,i||"")}this.log("setAttribute",`you're really sure ${t} is a selector?`)}setStyles(e,t){Object.entries(t).forEach(([t,i])=>{Array.isArray(i)?this.setStyle(e,t,i[0],i[1]||""):this.setStyle(e,t,i)})}setStyle(e,t,i,o=""){const n=this._toKebab(t);null==i||""===i?e.style.removeProperty(n):e.style.setProperty(n,String(i),o)}_toKebab=e=>{if(e.includes("-"))return e;const t=e.match(/^(webkit|moz|ms|o)(?=[A-Z])/);return t&&(e="-"+t[1]+"-"+e.slice(t[1].length)),e.replace(/[A-Z]/g,e=>"-"+e.toLowerCase())};addClasses(e,...t){e.classList.add(...t)}removeAttribute(e,t){if(!e||!t)return void(this._debug._&&console.warn("removeAttribute() must have 2 params"));const i=t.charAt(0);if(this.strictAssert(i.match(/[a-zA-Z#\[\.]/),`removeAttribute() expects a valid selector, but received ${t}`),"."===i){const i=t.substring(1);return void e.classList.remove(i)}if("#"===i){const i=t.substring(1);return void e.removeAttribute(i)}if("["===i){this.strictAssert("]"===t.at(-1),`the ${t} selector is not OK.`);const i=t.substring(1,t.length-1);return void e.removeAttribute(i)}e.removeAttribute(attr)}removeAllAttributes(e){for(;e.attributes.length>0;)e.removeAttribute(e.attributes[0].name)}removeClasses(e,...t){e.classList.remove(...t)}removeAllClasses(e){e.classList=""}removeAllStyles(e){e.style=""}getInnerHTML(e){if("string"==typeof e){const t=this.document.querySelector(e);return t?t.innerHTML:void 0}return e.innerHTML}setInnerHTML(e,t){if("string"==typeof e){const i=this.document.querySelector(e);i&&(i.innerHTML=t)}e.innerHTML=t}isDocumentBody(e){return"BODY"===e.tagName}isTextNode(e){return e.nodeType===Node.TEXT_NODE}isElementNode(e){return e.nodeType===Node.ELEMENT_NODE}hasClass(e,t){return e.classList.contains(t)}hasID(e,t){return e.id===t}hasAttribute(e,t){return e.hasAttribute(t)}}class L{constructor(e){this.config=e,this._printWidth=parseFloat(this.config.paperWidth),this._printLeft=parseFloat(this.config.printLeftMargin),this._printRight=parseFloat(this.config.printRightMargin),this._printContentWidth=this._printWidth-this._printLeft-this._printRight+"px",this._flowPreviewPaddingBottom="100px",this._chromeBorderSafeSpace="2px",this._ensureBFC="display: flow-root",this.charWidth="10px"}create(){return this._pageRule()+this._layoutStyles().screen+this._layoutStyles().print+this._chromeStyles().screen+this._chromeStyles().print+this._serviceElementsStyle().screen+this._serviceElementsStyle().print+this._cutEdgeStyle()+(this.config.debugMode?this._testScreenOnlyStyle():"")}_pageRule(){return`@page {\n size: A4;\n size: ${`${this.config.paperWidth} ${this.config.paperHeight}`};\n margin-left: ${this.config.printLeftMargin};\n margin-right: ${this.config.printRightMargin};\n margin-top: ${this.config.printTopMargin};\n margin-bottom: 0;\n}`}_layoutStyles(){return{screen:`\n${N.root} {\n --paper-color: ${this.config.paperColor};\n display: flow-root;\n position: relative;\n z-index: 1;\n width: ${this._printContentWidth};\n margin: 0 auto;\n font-size: ${this.config.printFontSize};\n padding-bottom: ${this._flowPreviewPaddingBottom};\n}\n\n${N.contentFlow} {\n display: block;\n}\n\n${N.paperFlow} {\n display: block;\n position: absolute;\n width: 100%;\n z-index: -1;\n padding-bottom: ${this._flowPreviewPaddingBottom};\n pointer-events: none;\n}\n\n${N.overlayFlow} {\n display: block;\n position: absolute;\n width: 100%;\n z-index: 2147483647;\n padding-bottom: ${this._flowPreviewPaddingBottom};\n pointer-events: none;\n}\n\n${N.virtualPaper} {\n display: grid;\n grid-template-columns: 1fr;\n grid-template-rows: minmax(min-content, max-content) minmax(min-content, max-content) 1fr minmax(min-content, max-content) minmax(min-content, max-content);\n place-items: stretch stretch;\n place-content: stretch stretch;\n width: ${this._printContentWidth};\n height: ${this.config.paperHeight};\n font-size: ${this.config.printFontSize};\n}\n\n${N.virtualPaper}::before {\n position: absolute;\n content: '';\n width: ${this.config.paperWidth};\n height: ${this.config.paperHeight};\n left: -${this.config.printLeftMargin};\n background: var(--paper-color, white);\n box-shadow: rgba(0, 0, 0, 0.1) 2px 2px 12px 0px;\n z-index: -1;\n}\n\n${N.pageChrome} {\n display: block;\n pointer-events: none;\n}\n\n${N.pageBodySpacer} {\n display: block;\n pointer-events: none;\n}\n\n${N.pageFooter},\n${N.pageHeader} {\n display: block;\n position: relative;\n pointer-events: auto;\n}\n\n${N.pageFooter}::before,\n${N.pageHeader}::before {\n content: '';\n position: absolute;\n inset: 0;\n left: -10px;\n right: -10px;\n z-index: -1;\n background: var(--paper-color, white);\n}\n\n${N.pageFooter}::before {\n top: ${this._chromeBorderSafeSpace};\n}\n\n${N.pageHeader}::before {\n bottom: ${this._chromeBorderSafeSpace};\n}\n\n${N.virtualPaperTopMargin} {\n display: block;\n height: ${this.config.printTopMargin};\n}\n\n${N.virtualPaperBottomMargin} {\n display: block;\n height: ${this.config.printBottomMargin};\n}\n\n${N.virtualPaperGap} {\n display: block;\n padding-top: ${this.config.virtualPagesGap};\n}\n\n${N.contentFlowStart},\n${N.contentFlowEnd},\n${N.pageDivider},\n${N.runningSafety} {\n ${this._ensureBFC};\n}\n `,print:`\n@media print {\n\n ${N.root},\n ${N.overlayFlow},\n ${N.paperFlow} {\n padding: 0;\n }\n\n ${N.paperFlow},\n ${N.printHide} {\n display: none !important;\n }\n\n ${N.printIgnore} {\n display: contents !important;\n }\n\n ${N.virtualPaperTopMargin},\n ${N.virtualPaperBottomMargin},\n ${N.virtualPaperGap} {\n display: none !important;\n }\n\n ${N.pageChrome},\n ${N.frontpageElement},\n ${N.pageBodySpacer} {\n break-inside: avoid;\n }\n}\n `}}_chromeStyles(){return{screen:`\n${N.headerContent},\n${N.footerContent} {\n display: block;\n font-size: small;\n}\n\n${N.headerContent} p,\n${N.footerContent} p {\n margin: 0;\n}\n\n${N.headerContent} {\n padding-bottom: ${this.config.headerMargin};\n padding-top: 10px; /* for page numbers */\n}\n\n${N.footerContent} {\n padding-top: ${this.config.footerMargin};\n min-height: 32px; /* for page numbers */\n}\n\n${N.tocPageNumber} {\n min-width: 3ch;\n display: flex;\n justify-content: flex-end;\n align-items: baseline;\n}\n\n${R(N.pageNumberRoot)} {\n display: flex;\n column-gap: 2px;\n position: absolute;\n right: 0;\n text-align: right;\n line-height: 1;\n}\n\n${R(`${N.headerContent} ${N.pageNumberRoot}`,N.pageNumberRoot)} {\n top: 0;\n}\n\n${R(`${N.footerContent} ${N.pageNumberRoot}`,N.pageNumberRoot)} {\n bottom: 0;\n}\n `,print:""}}_cutEdgeStyle(){return`\n${N.topCutPart} {\n margin-top: 0 !important;\n}\n${N.bottomCutPart} {\n margin-bottom: 0 !important;\n}\n${N.cleanTopCut} {\n margin-top: 0 !important;\n padding-top: 0 !important;\n border-top: none !important;\n}\n${N.cleanBottomCut} {\n margin-bottom: 0 !important;\n padding-bottom: 0 !important;\n border-bottom: none !important;\n}\n `}_serviceElementsStyle(){const e="display: inline";return{screen:`\n.null {\n display: inline;\n padding: 0;\n margin: 0;\n font: 0;\n color: transparent;\n line-height: 0;\n border: none;\n outline: none;\n background: none;\n background-color: transparent;\n}\n\n${N.word},\n${N.textNode},\n${N.textLine},\n${N.textGroup},\n${N.neutral},\n${N.neutral} span {\n display: inline;\n padding: 0;\n margin: 0;\n font: inherit;\n color: inherit;\n line-height: inherit;\n background: none;\n background-color: transparent;\n}\n\n${N.textGroup} {\n display: block;\n}\n\n${N.textLine} {\n display: inline-block;\n}\n\n${N.textGroup} ${N.textLine} {\n ${e};\n}\n\n${N.complexTextBlock} {\n display: block;\n}\n\n${N.complexTextBlock} ${N.complexTextBlock} {\n ${e};\n}\n\n${N.printPageBreak} {\n ${this._ensureBFC};\n}\n\n${N.printForcedPageBreak} {\n display: block;\n visibility: hidden;\n height: 0;\n overflow: hidden;\n}\n `,print:`\n@media print {\n\n ${N.printPageBreak} {\n break-after: page;\n }\n\n ${N.textLine} {\n ${e};\n }\n}\n `}}_testScreenOnlyStyle(){return`\n/* DEBUG PREVIEW */\n@media screen {\n\n ${N.contentFlow} {\n background:repeating-linear-gradient(\n -45deg,\n rgba(222, 222, 222, .1),\n rgba(222, 222, 222, .1) 10px,\n rgba(222, 222, 222, .2) 10px,\n rgba(222, 222, 222, .2) 20px\n );\n }\n\n ${N.overlayFlow} {\n background:repeating-linear-gradient(\n 45deg,\n rgba(222, 222, 222, 0),\n rgba(222, 222, 222, 0) 18px,\n rgba(0, 166, 255, 0.05) 18px,\n rgba(0, 166, 255, 0.05) 20px\n );\n }\n\n ${N.virtualPaperGap} {\n background: #ff000020;\n }\n\n ${N.pageFooter},\n ${N.pageHeader} {\n background: #fff1ff99;\n }\n ${N.pageBodySpacer} {\n background: #ffee0020;\n }\n ${N.runningSafety} {\n background: #f200ff;\n outline: 0.1px dashed #f200ff88;\n }\n ${N.frontpageElement} {\n background: #00fcff20;\n }\n\n ${N.neutral} {\n background: #00ffee10;\n }\n\n ${N.textNode} {\n background: #00ff0010;\n }\n\n ${N.textGroup},\n ${N.textLine} {\n background: #0000ff08;\n }\n}\n `}}class ${constructor({config:e,DOM:t,node:o,selector:n}){this.success=!1,Object.assign(this,i),this.root,this.paperFlow,this.contentFlow,this.overlayFlow,this.frontpageTemplate,this.headerTemplate,this.footerTemplate,this._initialRoot,this._contentRoot,this._config=e,this._debug=e.debugMode?{...e.debugConfig.layout}:{},this._assert=!!e.consoleAssert,this._DOM=t,this._selector=n,this._node=o,this._customInitialRootSelector=e.initialRoot,this._defaultInitialRootSelector=n.init}create(){if(this._getTemplates(),this._insertStyle(),this._DOM.getElement(`style${this._selector.style}`)){if(this._createLayout(),this._DOM.getParentNode(this.root)!==this._initialRoot||this._DOM.getElementOffsetParent(this.paperFlow)!==this.root||this._DOM.getElementOffsetParent(this.contentFlow)!==this.root||this._DOM.getElementOffsetParent(this.overlayFlow)!==this.root)return this.strictAssert(this._DOM.getParentNode(this.root)===this._initialRoot,"Failed to insert the layout root into the DOM."),this.strictAssert(this._DOM.getElementOffsetParent(this.paperFlow)===this.root,"Failed to insert the paperFlow element into the DOM."),void this.strictAssert(this._DOM.getElementOffsetParent(this.contentFlow)===this.root,"Failed to insert the contentFlow element into the DOM.");this.success=!0}else console.error("Failed to add print styles into the DOM.")}_getTemplates(){this.strictAssert(this._selector.frontpageTemplate,"frontpageTemplate selector is missing"),this.strictAssert(this._selector.headerTemplate,"headerTemplate selector is missing"),this.strictAssert(this._selector.footerTemplate,"footerTemplate selector is missing"),this.frontpageTemplate=this._DOM.getInnerHTML(R(this._selector.frontpageTemplate)),this.headerTemplate=this._DOM.getInnerHTML(R(this._selector.headerTemplate)),this.footerTemplate=this._DOM.getInnerHTML(R(this._selector.footerTemplate))}_insertStyle(){this._node.insertStyle(new L(this._config).create())}_createLayout(){this._getInitialRoot(),this._initialRoot?(this.log("create Layout","initial root:",this._initialRoot),this._createRoot(),this._createPaperFlow(),this._createContentFlow(),this._createOverlayFlow(),this._DOM.moveContent(this._initialRoot,this.contentFlow),this._DOM.insertAtEnd(this._initialRoot,this.root),this._DOM.insertAtEnd(this.root,this.paperFlow,this.overlayFlow,this.contentFlow),this._insertContentFlowStartAndEnd(this.contentFlow),this._ignoreUnprintableEnvironment(this.root)):console.error("Failed to initialize the root element.")}_insertContentFlowStartAndEnd(e){const t=this._node.create(this._selector.contentFlowStart),i=this._node.create(this._selector.contentFlowEnd);return this._DOM.insertAtStart(e,t),this._DOM.insertAtEnd(e,i),{contentFlowStart:t,contentFlowEnd:i}}_getInitialRoot(){let e=this._customInitialRootSelector?this._DOM.getElement(this._customInitialRootSelector):this._DOM.getElement(this._defaultInitialRootSelector);if(!e){if(!this._DOM.body)return void console.error("We expected to find the BODY tag.");e=this._DOM.body,console.warn(`The printable area is currently unspecified and encompasses the entire contents of the BODY tag. To restrict the printed content to a specific area, include ${this._defaultInitialRootSelector} in the root element of the desired printing area.`)}return this._initialRoot=e,e}_createRoot(){const e=this._node.create(this._selector.root);return this._DOM.setStyles(e,{visibility:"hidden"}),this.root=e,e}_createPaperFlow(){const e=this._node.create(this._selector.paperFlow);return this.paperFlow=e,e}_createOverlayFlow(){const e=this._node.create(this._selector.overlayFlow);return this.overlayFlow=e,e}_createContentFlow(){const e=this._node.create(this._selector.contentFlow);return this.contentFlow=e,e}_ignoreUnprintableEnvironment(e){if(e===this._DOM.body)return void this.strictAssert(!1,"misshapen root");let t=this._DOM.getParentNode(e);this._DOM.setAttribute(t,this._selector.printIgnore),this._DOM.getChildNodes(t).forEach(t=>{if(t!==e&&this._DOM.isElementNode(t))this._DOM.setAttribute(t,this._selector.printHide);else{if(!this._node.isSignificantTextNode(t))return;{const e=this._node.createTextNodeWrapper();this._DOM.wrap(t,e),this._DOM.setAttribute(e,this._selector.printHide)}}}),this._DOM.isDocumentBody(t)||this._ignoreUnprintableEnvironment(t)}}function G(e){return function(t){return t._config.debugMode&&t._debug[e]}}const W=G("selectors");function j(e,t){if(!e||!t)return void(W(this)&&console.warn("isSelectorMatching() must have 2 params","\n element: ",e,"\n selector: ",t));const i=[t];if("string"==typeof t&&t.includes("html2pdf4doc")){const e=t.replaceAll("html2pdf4doc","html2pdf");e!==t&&i.push(e)}return i.some(t=>{const i=t.charAt(0);if("."===i){const i=t.substring(1);return this._DOM.hasClass(e,i)}if("#"===i){const i=t.substring(1);return this._DOM.hasID(e,i)}if("["===i){this.strictAssert("]"===t.at(-1),`the ${t} selector is not OK.`);const i=t.substring(1,t.length-1);return this._DOM.hasAttribute(e,i)}return this._DOM.getElementTagName(e)===t.toUpperCase()})}function z(e){return!!this._DOM.isTextNode(e)&&this._DOM.getNodeValue(e).trim().length>0}function V(e){return"STYLE"===this._DOM.getElementTagName(e)}function K(e){return"IMG"===this._DOM.getElementTagName(e)}function U(e){return"svg"===this._DOM.getElementTagName(e)}function q(e){return"OBJECT"===this._DOM.getElementTagName(e)}function Y(e){return"LI"===this._DOM.getElementTagName(e)}function X(e){return this.isSelectorMatching(e,this._selector.neutral)}function Z(e){return this.isSelectorMatching(e,this._selector.textNode)}function J(e){return this.isSelectorMatching(e,this._selector.textLine)}function Q(e){return this.isSelectorMatching(e,this._selector.textGroup)}function ee(e){return this.isSelectorMatching(e,this._selector.contentFlowStart)}function te(e){const t=this._DOM.getLeftNeighbor(e);return this.isSelectorMatching(t,this._selector.contentFlowStart)}function ie(e){return this.isSelectorMatching(e,this._selector.contentFlowEnd)}function oe(e){return this.isSelectorMatching(e,this._selector.complexTextBlock)}function ne(e){return this.isComplexTextBlock(e)||this.isWrappedTextNode(e)||this.isWrappedTextLine(e)||this.isWrappedTextGroup(e)}function re(e){return this.isSelectorMatching(e,this._selector.printForcedPageBreak)}function se(e,t){if(!(e instanceof HTMLElement))return;const i=(t||this._DOM.getComputedStyle(e)).display;return"inline"===i||"inline-block"===i||"inline-table"===i||"inline-flex"===i||"inline-grid"===i}function ae(e,t){if(!(e instanceof HTMLElement))return;const i=(t||this._DOM.getComputedStyle(e)).display;return"inline-block"===i||"inline-table"===i||"inline-flex"===i||"inline-grid"===i}function le(e,t){if(!(e instanceof HTMLElement))return;return"grid"===(t||this._DOM.getComputedStyle(e)).display}function he(e,t){if(!(e instanceof HTMLElement))return;const i=(t||this._DOM.getComputedStyle(e)).display;if("TABLE"!==this._DOM.getElementTagName(e)&&["table","inline-table"].includes(i))return!0;const o=e=>"table-row"===e,n=e=>"table-cell"===e;if(o(i)){const t=this._DOM.getChildren(e);for(const e of t)if(e instanceof HTMLElement&&n(this._DOM.getComputedStyle(e).display))return!0;return!1}if("table-row-group"===(r=i)||"table-header-group"===r||"table-footer-group"===r){const t=this._DOM.getChildren(e);for(const e of t){if(!(e instanceof HTMLElement))continue;if(!o(this._DOM.getComputedStyle(e).display))continue;const t=this._DOM.getChildren(e);for(const e of t)if(e instanceof HTMLElement&&n(this._DOM.getComputedStyle(e).display))return!0}return!1}var r;return!1}function ce(e,t){if(e instanceof HTMLElement) +var HTML2PDF4DOC;(()=>{"use strict";var e={d:(t,i)=>{for(var o in i)e.o(i,o)&&!e.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:i[o]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{init:()=>Bn});var i={};e.r(i),e.d(i,{log:()=>H,logGroup:()=>F,logGroupEnd:()=>A,strictAssert:()=>I});var o={};e.r(o),e.d(o,{isAfterContentFlowStart:()=>ie,isComplexTextBlock:()=>ne,isContentFlowEnd:()=>oe,isContentFlowStart:()=>te,isFlexRow:()=>pe,isForcedPageBreak:()=>se,isGrid:()=>ce,isGridAutoFlowRow:()=>ue,isIMG:()=>q,isInline:()=>ae,isInlineBlock:()=>le,isLiNode:()=>X,isNeutral:()=>Q,isNotBreakable:()=>_e,isOBJECT:()=>Y,isPRE:()=>ge,isSTYLE:()=>U,isSVG:()=>K,isSelectorMatching:()=>j,isSignificantTextNode:()=>V,isSliced:()=>fe,isSlough:()=>me,isSyntheticTextWrapper:()=>re,isTableLikeNode:()=>he,isTableNode:()=>de,isWrappedTextGroup:()=>ee,isWrappedTextLine:()=>J,isWrappedTextNode:()=>Z});var n={};e.r(n),e.d(n,{explainHeuristicSelectorMismatch:()=>Ee,filterHeuristicSelectorMatches:()=>Te,hasNoSignificantSiblingNodes:()=>Me,hasSignificantLeadingText:()=>ye,hasSignificantTrailingText:()=>Pe,isHeuristicSelector:()=>Se,resolveConfigSelectorConstraints:()=>we,validateHeuristicSelectorMatch:()=>Ce});var r={};e.r(r),e.d(r,{insertStyle:()=>Oe});var s={};e.r(s),e.d(s,{isFirstChildOfFirstChild:()=>De,isLastChildOfLastChild:()=>ke,isVerticalDrop:()=>Re,resolveFlowBoxElement:()=>xe,setInitStyle:()=>Ne});var a={};e.r(a),e.d(a,{getBottom:()=>Ge,getBottomWithMargin:()=>We,getContentHeightByProbe:()=>Ze,getEmptyNodeHeightByProbe:()=>Ue,getHeightWithMargin:()=>ze,getLineHeight:()=>qe,getMaxWidth:()=>Ve,getNormalizedBottomWithMargin:()=>Ie,getNormalizedTop:()=>He,getPageStartTopInfo:()=>Ae,getTableEmptyRowHeight:()=>Ye,getTableEntries:()=>Qe,getTableRowHeight:()=>Ke,getTableRowShellHeightByTD:()=>Xe,getTop:()=>Le,getTopForPageStartCandidate:()=>Fe,getTopWithMargin:()=>je,resolveRowBoundsGeneric:()=>Je});var l={};e.r(l),e.d(l,{create:()=>et,createComplexTextBlock:()=>lt,createForcedPageBreak:()=>dt,createNeutral:()=>tt,createNeutralBlock:()=>it,createPrintPageBreak:()=>at,createSignpost:()=>gt,createSliceWrapper:()=>pt,createTable:()=>ut,createTestNodeFrom:()=>ct,createTextGroup:()=>rt,createTextLine:()=>nt,createTextNodeWrapper:()=>ot,createWithFlagNoBreak:()=>st,createWord:()=>ht});var c={};e.r(c),e.d(c,{prepareSplittedNode:()=>bt,splitByWordsGreedyWithSpacesFilter:()=>mt,splitTextByLinesGreedy:()=>_t,splitTextByWordsGreedy:()=>ft});var h={};e.r(h),e.d(h,{MarkersState:()=>$t,isNoBreak:()=>Ft,isNoHanging:()=>At,isPageStart:()=>Bt,isSlice:()=>Ht,markBottomCut:()=>Rt,markCleanBottomCut:()=>Dt,markCleanTopCut:()=>vt,markNoBreak:()=>Mt,markNoHanging:()=>yt,markPageEnd:()=>Tt,markPageNumber:()=>Ot,markPageStart:()=>Ct,markProcessed:()=>St,markSlice:()=>Pt,markSliceCuts:()=>Nt,markSliceCutsInRows:()=>xt,markTopCut:()=>kt,unmarkPageStart:()=>Et});var d={};e.r(d),e.d(d,{_getMarkAttributeConfig:()=>oi,_isStyleMark:()=>ni,_registerMark:()=>ei,_unregisterMark:()=>ti,clearMark:()=>Vt,getMark:()=>zt,getRegisteredPageDividers:()=>Xt,getRegisteredPageEnds:()=>ii,getRegisteredPageNumberForElement:()=>Jt,getRegisteredPageNumbers:()=>Zt,hasMark:()=>jt,registerPageDivider:()=>Yt,setMark:()=>Wt});var g={};e.r(g),e.d(g,{wrapNodeChildrenWithNeutralBlock:()=>ri});var u={};e.r(u),e.d(u,{copyNodeWidth:()=>hi,estimateInlineImgGapBelow:()=>ui,fitElementWithinBoundaries:()=>ai,fitElementWithinHeight:()=>li,lockNodesWidths:()=>gi,lockTableWidths:()=>di,scaleCellsToHeight:()=>ci});var p={};e.r(p),e.d(p,{findAllForcedPageBreakInside:()=>Mi,findBetterForcedPageStarter:()=>_i,findBetterPageStart:()=>fi,findFirstChildParent:()=>wi,findFirstChildParentFromPage:()=>mi,findLastChildParent:()=>Si,findPreviousNonHangingsFromPage:()=>bi});var _={};e.r(_),e.d(_,{getFirstChildrenChain:()=>Ni,getFlowChildren:()=>vi,getFlowFirstChild:()=>Di,getFlowLastChild:()=>ki,getLastChildrenChain:()=>xi,getPreparedChildren:()=>Oi,getSplitChildren:()=>Ri,isIgnorableSpacerParagraph:()=>Bi,isStructurallyEmptyNode:()=>Fi});var f={};e.r(f),e.d(f,{isReplacedElement:()=>ji,resolveReplacedElement:()=>Vi});var m={};e.r(m),e.d(m,{getBottomCollapseChain:()=>qi,getTopCollapseChain:()=>Ui});var b={};e.r(b),e.d(b,{cloneAndCleanOutsideRange:()=>to,getSplitPoints:()=>Yi,getSplitPointsPerCells:()=>Xi,isFirstSliceEmpty:()=>eo,normalizeContentCuts:()=>Zi,sliceNodeBySplitPoints:()=>Qi,sliceNodeContentBySplitPoints:()=>Ji});var w={};e.r(w),e.d(w,{isRegisteredFloatElement:()=>co,shouldSkipFlowElement:()=>lo});var S={};e.r(S),e.d(S,{getBCRCached:()=>ho,getComputedStyleCached:()=>go,resetMeasureCache:()=>uo});var M={};e.r(M),e.d(M,{buildRowSlices:()=>_o,evaluateRowSplitPlacement:()=>mo,paginationBuildBalancedRowSlices:()=>fo,replaceCurrentRowsAfterRowSplit:()=>bo,sliceCellsBySplitPoints:()=>po});var y={};e.r(y),e.d(y,{paginationApplyFullPageScaling:()=>yo,paginationScaleCellsToHeight:()=>So,paginationShouldScaleFullPage:()=>Mo});var P={};e.r(P),e.d(P,{applyRowSlicesToEntriesAfterRowSplit:()=>Po,computeRowFlags:()=>Co});var C={};e.r(C),e.d(C,{paginationRefreshRowsAfterSplit:()=>To,validateSplitterAdapter:()=>Eo});var E={};e.r(E),e.d(E,{paginationComputeCellShellHeights:()=>Oo});var T={};e.r(T),e.d(T,{handleRowOverflow:()=>ko,handleRowSplitFailure:()=>Ro,scaleRowCellsToHeight:()=>Do});var O={};e.r(O),e.d(O,{absorbShortTrailingSliceIfFits:()=>xo,calculateFinalPartReclaimedHeight:()=>No});var v={};e.r(v),e.d(v,{paginationBuildRowEvaluationContext:()=>Fo,paginationCanAbsorbLastRow:()=>Ao});var D={};e.r(D),e.d(D,{paginationCalculateRowSplitBudget:()=>Go,paginationHandleRowSlicesPlacement:()=>Uo,paginationProcessRowSplitResult:()=>jo,paginationResolveAlreadySlicedRow:()=>$o,paginationResolveOverflowingRow:()=>Io,paginationResolveRowWithRowspan:()=>Lo,paginationResolveSplittableRow:()=>Vo,paginationSplitRow:()=>Wo});const k="html2pdf4doc",R="html2pdf";function N(e,t){if("string"!=typeof e)return e;if(!e.includes(k))return e;if(t){if(!e.includes(t))return e;const i=t.replaceAll(k,R);if(i===t)return e;const o=e.replaceAll(t,i);return o===e?e:`${e},${o}`}const i=e.replaceAll(k,R);return i===e?e:`${e},${i}`}const x={init:"[html2pdf4doc]",root:"html2pdf4doc-root",paperFlow:"html2pdf4doc-paper-flow",contentFlow:"html2pdf4doc-content-flow",overlayFlow:"html2pdf4doc-overlay-flow",pageDivider:"html2pdf4doc-page",pageStartMarker:"[html2pdf4doc-page-start]",pageEndMarker:"[html2pdf4doc-page-end]",pageMarker:"[html2pdf4doc-page]",contentFlowStart:"html2pdf4doc-content-flow-start",contentFlowEnd:"html2pdf4doc-content-flow-end",style:"[html2pdf4doc-style]",frontpageTemplate:"[html2pdf4doc-frontpage]",headerTemplate:"[html2pdf4doc-header]",footerTemplate:"[html2pdf4doc-footer]",frontpageElement:"html2pdf4doc-frontpage",frontpageContent:"html2pdf4doc-frontpage-content",headerContent:"html2pdf4doc-header",footerContent:"html2pdf4doc-footer",pageNumberRoot:"[html2pdf4doc-page-number]",pageNumberCurrent:"[html2pdf4doc-page-number-current]",pageNumberTotal:"[html2pdf4doc-page-number-total]",pageChrome:"html2pdf4doc-page-chrome",pageBodySpacer:"html2pdf4doc-page-body-spacer",pageHeader:"html2pdf4doc-page-header",pageFooter:"html2pdf4doc-page-footer",printPageBreak:"html2pdf4doc-print-page-break",runningSafety:"html2pdf4doc-print-running",virtualPaper:"html2pdf4doc-virtual-paper",virtualPaperTopMargin:"html2pdf4doc-virtual-paper-margin-top",virtualPaperBottomMargin:"html2pdf4doc-virtual-paper-margin-bottom",virtualPaperGap:"html2pdf4doc-virtual-paper-gap",printIgnore:"[html2pdf4doc-print-ignore]",printHide:"[html2pdf4doc-print-hide]",neutral:"html2pdf4doc-neutral",word:"html2pdf4doc-word",textNode:"html2pdf4doc-text-node",textLine:"html2pdf4doc-text-line",textGroup:"html2pdf4doc-text-group",complexTextBlock:"html2pdf4doc-complex-text-block",printForcedPageBreak:"html2pdf4doc-print-forced-page-break",split:"[html2pdf4doc-split]",processed:"[html2pdf4doc-processed]",flagNoBreak:"[html2pdf4doc-flag-no-break]",flagNoHanging:"[html2pdf4doc-flag-no-hanging]",flagSlice:"[html2pdf4doc-flag-slice]",topCutPart:".html2pdf4doc-top-cut",bottomCutPart:".html2pdf4doc-bottom-cut",cleanTopCut:".html2pdf4doc-clean-top-cut",cleanBottomCut:".html2pdf4doc-clean-bottom-cut",tocPageNumber:"html2pdf4doc-toc-page-number"},B="background:#eee;color:#888;padding: 0 1px 0 0;";function F(e,t="",i=!1){"boolean"==typeof t&&(i=t,t=""),!0===i?this._debug._&&console.groupCollapsed(`%c${e}`,t):this._debug._&&console.group(`%c${e}`,t)}function A(e){this._debug._&&console.log(`%c ▲ ${e} `,B),this._debug._&&console.groupEnd()}function H(e,...t){this._debug._&&console.log(`[${e}]`,...t)}function I(e,...t){this._assert&&console.assert(e,"⛔",...t)}class L{constructor({DOM:e,config:t}){this.document=e,this.body=e.body,this._debug=t.debugMode?{...t.debugConfig.DOM}:{},this._assert=!!t.consoleAssert,Object.assign(this,i)}createElement(e){return this.document.createElement(e)}createDocumentFragment(){return this.document.createDocumentFragment()}cloneNode(e){return e?.cloneNode(!0)}cloneNodeWrapper(e){return e?.cloneNode(!1)}insertBefore(e,...t){const i=t.filter(e=>null!=e);e.before(...i)}insertAfter(e,...t){const i=t.filter(e=>null!=e);e.after(...i)}insertAtEnd(e,...t){const i=t.filter(e=>null!=e);e.append(...i)}insertAtStart(e,...t){const i=t.filter(e=>null!=e);e.prepend(...i)}insertInsteadOf(e,...t){this.insertBefore(e,...t),e.remove()}wrap(e,t){return e.before(t),t.append(e),t}moveContent(e,t){for(;e.firstChild;)t.append(e.firstChild);this.strictAssert(""===this.getInnerHTML(e))}moveRowContent(e,t){if(!e||!t)return void(this._debug._&&console.warn("moveRowContent(): sourceTR or targetTR is missing"));const i=this.getElementTagName(e),o=this.getElementTagName(t);this.strictAssert("TR"===i,`moveRowContent(): source is not TR, got ${i}`),this.strictAssert("TR"===o,`moveRowContent(): target is not TR, got ${o}`);const n=[...this.getChildren(e)],r=[...this.getChildren(t)];n.length!==r.length&&this._debug._&&console.warn(`moveRowContent(): cells count mismatch: ${n.length} (source) vs ${r.length} (target)`);const s=Math.min(n.length,r.length);for(let e=0;e0,"getAll(selectors), selectors:",e),1===e.length?[...this.getAllElements(e[0],t)]:[...e].flatMap(e=>[...this.getAllElements(e,t)])}getElement(e,t=this.document){return this.strictAssert(e),t.querySelector(e)}getAllElements(e,t=this.document){return this.strictAssert(e),t.querySelectorAll(e)}getElementById(e,t=this.document){return t.getElementById(e)}getNodeType(e){return e.nodeType}getRightNeighbor(e){return e.nextElementSibling}getLeftNeighbor(e){return e.previousElementSibling}getParentNode(e){return e.parentElement}getNodeValue(e){return e.nodeValue}getNodeWholeText(e){return e.wholeText}getLastElementChild(e){return e.lastElementChild}getFirstElementChild(e){return e.firstElementChild}getChildNodes(e){return e.childNodes}getChildren(e){return e.children}getElementOffsetParent(e){return e.offsetParent}getComputedStyle(e){return window.getComputedStyle(e)}getElementBCR(e){return e.getBoundingClientRect()}getElementOffsetLeft(e){return e?.offsetLeft}getElementOffsetHeight(e){return e?.offsetHeight}getElementOffsetWidth(e){return e?.offsetWidth}getElementOffsetTop(e){return e?.offsetTop}getElementOffsetBottom(e){return e?.offsetTop+e?.offsetHeight||void 0}getElementTagName(e){return e.tagName}getDataId(e){return e.dataset.id}getAttribute(e,t){if(!e||!t)return void(this._debug._&&console.warn("getAttribute() must have 2 params"));const i=t.charAt(0);if("."!==i&&"#"!==i||this.log("getAttribute",`you're really sure ${t} is attribute selector?`),"["===i){this.strictAssert("]"===t.at(-1),`the ${t} selector is not OK.`);const i=t.substring(1,t.length-1);return e.getAttribute(i)}e.getAttribute(t)}setAttribute(e,t,i){if(!e||!t)return void(this._debug._&&console.warn("setAttribute() must have 2 params"));const o=t.charAt(0);if("."===o){const i=t.substring(1);return void e.classList.add(i)}if("#"===o){const i=t.substring(1);return void(e.id=i)}if("["===o){this.strictAssert("]"===t.at(-1),`the ${t} selector is not OK.`);const o=t.substring(1,t.length-1);return void e.setAttribute(o,i||"")}this.log("setAttribute",`you're really sure ${t} is a selector?`)}setStyles(e,t){Object.entries(t).forEach(([t,i])=>{Array.isArray(i)?this.setStyle(e,t,i[0],i[1]||""):this.setStyle(e,t,i)})}setStyle(e,t,i,o=""){const n=this._toKebab(t);null==i||""===i?e.style.removeProperty(n):e.style.setProperty(n,String(i),o)}_toKebab=e=>{if(e.includes("-"))return e;const t=e.match(/^(webkit|moz|ms|o)(?=[A-Z])/);return t&&(e="-"+t[1]+"-"+e.slice(t[1].length)),e.replace(/[A-Z]/g,e=>"-"+e.toLowerCase())};addClasses(e,...t){e.classList.add(...t)}removeAttribute(e,t){if(!e||!t)return void(this._debug._&&console.warn("removeAttribute() must have 2 params"));const i=t.charAt(0);if(this.strictAssert(i.match(/[a-zA-Z#\[\.]/),`removeAttribute() expects a valid selector, but received ${t}`),"."===i){const i=t.substring(1);return void e.classList.remove(i)}if("#"===i){const i=t.substring(1);return void e.removeAttribute(i)}if("["===i){this.strictAssert("]"===t.at(-1),`the ${t} selector is not OK.`);const i=t.substring(1,t.length-1);return void e.removeAttribute(i)}e.removeAttribute(attr)}removeAllAttributes(e){for(;e.attributes.length>0;)e.removeAttribute(e.attributes[0].name)}removeClasses(e,...t){e.classList.remove(...t)}removeAllClasses(e){e.classList=""}removeAllStyles(e){e.style=""}getInnerHTML(e){if("string"==typeof e){const t=this.document.querySelector(e);return t?t.innerHTML:void 0}return e.innerHTML}setInnerHTML(e,t){if("string"==typeof e){const i=this.document.querySelector(e);i&&(i.innerHTML=t)}e.innerHTML=t}isDocumentBody(e){return"BODY"===e.tagName}isTextNode(e){return e.nodeType===Node.TEXT_NODE}isElementNode(e){return e.nodeType===Node.ELEMENT_NODE}hasClass(e,t){return e.classList.contains(t)}hasID(e,t){return e.id===t}hasAttribute(e,t){return e.hasAttribute(t)}}class ${constructor(e){this.config=e,this._printWidth=parseFloat(this.config.paperWidth),this._printLeft=parseFloat(this.config.printLeftMargin),this._printRight=parseFloat(this.config.printRightMargin),this._printContentWidth=this._printWidth-this._printLeft-this._printRight+"px",this._flowPreviewPaddingBottom="100px",this._chromeBorderSafeSpace="2px",this._ensureBFC="display: flow-root",this.charWidth="10px"}create(){return this._pageRule()+this._layoutStyles().screen+this._layoutStyles().print+this._chromeStyles().screen+this._chromeStyles().print+this._serviceElementsStyle().screen+this._serviceElementsStyle().print+this._cutEdgeStyle()+(this.config.debugMode?this._testScreenOnlyStyle():"")}_pageRule(){return`@page {\n size: A4;\n size: ${`${this.config.paperWidth} ${this.config.paperHeight}`};\n margin-left: ${this.config.printLeftMargin};\n margin-right: ${this.config.printRightMargin};\n margin-top: ${this.config.printTopMargin};\n margin-bottom: 0;\n}`}_layoutStyles(){return{screen:`\n${x.root} {\n --paper-color: ${this.config.paperColor};\n display: flow-root;\n position: relative;\n z-index: 1;\n width: ${this._printContentWidth};\n margin: 0 auto;\n font-size: ${this.config.printFontSize};\n padding-bottom: ${this._flowPreviewPaddingBottom};\n}\n\n${x.contentFlow} {\n display: block;\n}\n\n${x.paperFlow} {\n display: block;\n position: absolute;\n width: 100%;\n z-index: -1;\n padding-bottom: ${this._flowPreviewPaddingBottom};\n pointer-events: none;\n}\n\n${x.overlayFlow} {\n display: block;\n position: absolute;\n width: 100%;\n z-index: 2147483647;\n padding-bottom: ${this._flowPreviewPaddingBottom};\n pointer-events: none;\n}\n\n${x.virtualPaper} {\n display: grid;\n grid-template-columns: 1fr;\n grid-template-rows: minmax(min-content, max-content) minmax(min-content, max-content) 1fr minmax(min-content, max-content) minmax(min-content, max-content);\n place-items: stretch stretch;\n place-content: stretch stretch;\n width: ${this._printContentWidth};\n height: ${this.config.paperHeight};\n font-size: ${this.config.printFontSize};\n}\n\n${x.virtualPaper}::before {\n position: absolute;\n content: '';\n width: ${this.config.paperWidth};\n height: ${this.config.paperHeight};\n left: -${this.config.printLeftMargin};\n background: var(--paper-color, white);\n box-shadow: rgba(0, 0, 0, 0.1) 2px 2px 12px 0px;\n z-index: -1;\n}\n\n${x.pageChrome} {\n display: block;\n pointer-events: none;\n}\n\n${x.pageBodySpacer} {\n display: block;\n pointer-events: none;\n}\n\n${x.pageFooter},\n${x.pageHeader} {\n display: block;\n position: relative;\n pointer-events: auto;\n}\n\n${x.pageFooter}::before,\n${x.pageHeader}::before {\n content: '';\n position: absolute;\n inset: 0;\n left: -10px;\n right: -10px;\n z-index: -1;\n background: var(--paper-color, white);\n}\n\n${x.pageFooter}::before {\n top: ${this._chromeBorderSafeSpace};\n}\n\n${x.pageHeader}::before {\n bottom: ${this._chromeBorderSafeSpace};\n}\n\n${x.virtualPaperTopMargin} {\n display: block;\n height: ${this.config.printTopMargin};\n}\n\n${x.virtualPaperBottomMargin} {\n display: block;\n height: ${this.config.printBottomMargin};\n}\n\n${x.virtualPaperGap} {\n display: block;\n padding-top: ${this.config.virtualPagesGap};\n}\n\n${x.contentFlowStart},\n${x.contentFlowEnd},\n${x.pageDivider},\n${x.runningSafety} {\n ${this._ensureBFC};\n}\n `,print:`\n@media print {\n\n ${x.root},\n ${x.overlayFlow},\n ${x.paperFlow} {\n padding: 0;\n }\n\n ${x.paperFlow},\n ${x.printHide} {\n display: none !important;\n }\n\n ${x.printIgnore} {\n display: contents !important;\n }\n\n ${x.virtualPaperTopMargin},\n ${x.virtualPaperBottomMargin},\n ${x.virtualPaperGap} {\n display: none !important;\n }\n\n ${x.pageChrome},\n ${x.frontpageElement},\n ${x.pageBodySpacer} {\n break-inside: avoid;\n }\n}\n `}}_chromeStyles(){return{screen:`\n${x.headerContent},\n${x.footerContent} {\n display: block;\n font-size: small;\n}\n\n${x.headerContent} p,\n${x.footerContent} p {\n margin: 0;\n}\n\n${x.headerContent} {\n padding-bottom: ${this.config.headerMargin};\n padding-top: 10px; /* for page numbers */\n}\n\n${x.footerContent} {\n padding-top: ${this.config.footerMargin};\n min-height: 32px; /* for page numbers */\n}\n\n${x.tocPageNumber} {\n min-width: 3ch;\n display: flex;\n justify-content: flex-end;\n align-items: baseline;\n}\n\n${N(x.pageNumberRoot)} {\n display: flex;\n column-gap: 2px;\n position: absolute;\n right: 0;\n text-align: right;\n line-height: 1;\n}\n\n${N(`${x.headerContent} ${x.pageNumberRoot}`,x.pageNumberRoot)} {\n top: 0;\n}\n\n${N(`${x.footerContent} ${x.pageNumberRoot}`,x.pageNumberRoot)} {\n bottom: 0;\n}\n `,print:""}}_cutEdgeStyle(){return`\n${x.topCutPart} {\n margin-top: 0 !important;\n}\n${x.bottomCutPart} {\n margin-bottom: 0 !important;\n}\n${x.cleanTopCut} {\n margin-top: 0 !important;\n padding-top: 0 !important;\n border-top: none !important;\n}\n${x.cleanBottomCut} {\n margin-bottom: 0 !important;\n padding-bottom: 0 !important;\n border-bottom: none !important;\n}\n `}_serviceElementsStyle(){return{screen:`\n.null {\n display: inline;\n padding: 0;\n margin: 0;\n font: 0;\n color: transparent;\n line-height: 0;\n border: none;\n outline: none;\n background: none;\n background-color: transparent;\n}\n\n${x.word},\n${x.textNode},\n${x.textLine},\n${x.textGroup},\n${x.neutral},\n${x.neutral} span {\n display: inline;\n padding: 0;\n margin: 0;\n font: inherit;\n color: inherit;\n line-height: inherit;\n background: none;\n background-color: transparent;\n}\n\n${x.textGroup} {\n display: block;\n}\n\n${x.complexTextBlock} {\n display: block;\n}\n\n${x.complexTextBlock} ${x.complexTextBlock} {\n display: inline;\n}\n\n${x.printPageBreak} {\n ${this._ensureBFC};\n}\n\n${x.printForcedPageBreak} {\n display: block;\n visibility: hidden;\n height: 0;\n overflow: hidden;\n}\n `,print:`\n@media print {\n\n ${x.printPageBreak} {\n break-after: page;\n }\n\n}\n `}}_testScreenOnlyStyle(){return`\n/* DEBUG PREVIEW */\n@media screen {\n\n ${x.contentFlow} {\n background:repeating-linear-gradient(\n -45deg,\n rgba(222, 222, 222, .1),\n rgba(222, 222, 222, .1) 10px,\n rgba(222, 222, 222, .2) 10px,\n rgba(222, 222, 222, .2) 20px\n );\n }\n\n ${x.overlayFlow} {\n background:repeating-linear-gradient(\n 45deg,\n rgba(222, 222, 222, 0),\n rgba(222, 222, 222, 0) 18px,\n rgba(0, 166, 255, 0.05) 18px,\n rgba(0, 166, 255, 0.05) 20px\n );\n }\n\n ${x.virtualPaperGap} {\n background: #ff000020;\n }\n\n ${x.pageFooter},\n ${x.pageHeader} {\n background: #fff1ff99;\n }\n ${x.pageBodySpacer} {\n background: #ffee0020;\n }\n ${x.runningSafety} {\n background: #f200ff;\n outline: 0.1px dashed #f200ff88;\n }\n ${x.frontpageElement} {\n background: #00fcff20;\n }\n\n ${x.neutral} {\n background: #00ffee10;\n }\n\n ${x.textNode} {\n background: #00ff0010;\n }\n\n ${x.textGroup},\n ${x.textLine} {\n background: #0000ff08;\n }\n}\n `}}class G{constructor({config:e,DOM:t,node:o,selector:n}){this.success=!1,Object.assign(this,i),this.root,this.paperFlow,this.contentFlow,this.overlayFlow,this.frontpageTemplate,this.headerTemplate,this.footerTemplate,this._initialRoot,this._contentRoot,this._config=e,this._debug=e.debugMode?{...e.debugConfig.layout}:{},this._assert=!!e.consoleAssert,this._DOM=t,this._selector=n,this._node=o,this._customInitialRootSelector=e.initialRoot,this._defaultInitialRootSelector=n.init}create(){if(this._getTemplates(),this._insertStyle(),this._DOM.getElement(`style${this._selector.style}`)){if(this._createLayout(),this._DOM.getParentNode(this.root)!==this._initialRoot||this._DOM.getElementOffsetParent(this.paperFlow)!==this.root||this._DOM.getElementOffsetParent(this.contentFlow)!==this.root||this._DOM.getElementOffsetParent(this.overlayFlow)!==this.root)return this.strictAssert(this._DOM.getParentNode(this.root)===this._initialRoot,"Failed to insert the layout root into the DOM."),this.strictAssert(this._DOM.getElementOffsetParent(this.paperFlow)===this.root,"Failed to insert the paperFlow element into the DOM."),void this.strictAssert(this._DOM.getElementOffsetParent(this.contentFlow)===this.root,"Failed to insert the contentFlow element into the DOM.");this.success=!0}else console.error("Failed to add print styles into the DOM.")}_getTemplates(){this.strictAssert(this._selector.frontpageTemplate,"frontpageTemplate selector is missing"),this.strictAssert(this._selector.headerTemplate,"headerTemplate selector is missing"),this.strictAssert(this._selector.footerTemplate,"footerTemplate selector is missing"),this.frontpageTemplate=this._DOM.getInnerHTML(N(this._selector.frontpageTemplate)),this.headerTemplate=this._DOM.getInnerHTML(N(this._selector.headerTemplate)),this.footerTemplate=this._DOM.getInnerHTML(N(this._selector.footerTemplate))}_insertStyle(){this._node.insertStyle(new $(this._config).create())}_createLayout(){this._getInitialRoot(),this._initialRoot?(this.log("create Layout","initial root:",this._initialRoot),this._createRoot(),this._createPaperFlow(),this._createContentFlow(),this._createOverlayFlow(),this._DOM.moveContent(this._initialRoot,this.contentFlow),this._DOM.insertAtEnd(this._initialRoot,this.root),this._DOM.insertAtEnd(this.root,this.paperFlow,this.overlayFlow,this.contentFlow),this._insertContentFlowStartAndEnd(this.contentFlow),this._ignoreUnprintableEnvironment(this.root)):console.error("Failed to initialize the root element.")}_insertContentFlowStartAndEnd(e){const t=this._node.create(this._selector.contentFlowStart),i=this._node.create(this._selector.contentFlowEnd);return this._DOM.insertAtStart(e,t),this._DOM.insertAtEnd(e,i),{contentFlowStart:t,contentFlowEnd:i}}_getInitialRoot(){let e=this._customInitialRootSelector?this._DOM.getElement(this._customInitialRootSelector):this._DOM.getElement(this._defaultInitialRootSelector);if(!e){if(!this._DOM.body)return void console.error("We expected to find the BODY tag.");e=this._DOM.body,console.warn(`The printable area is currently unspecified and encompasses the entire contents of the BODY tag. To restrict the printed content to a specific area, include ${this._defaultInitialRootSelector} in the root element of the desired printing area.`)}return this._initialRoot=e,e}_createRoot(){const e=this._node.create(this._selector.root);return this._DOM.setStyles(e,{visibility:"hidden"}),this.root=e,e}_createPaperFlow(){const e=this._node.create(this._selector.paperFlow);return this.paperFlow=e,e}_createOverlayFlow(){const e=this._node.create(this._selector.overlayFlow);return this.overlayFlow=e,e}_createContentFlow(){const e=this._node.create(this._selector.contentFlow);return this.contentFlow=e,e}_ignoreUnprintableEnvironment(e){if(e===this._DOM.body)return void this.strictAssert(!1,"misshapen root");let t=this._DOM.getParentNode(e);this._DOM.setAttribute(t,this._selector.printIgnore),this._DOM.getChildNodes(t).forEach(t=>{if(t!==e&&this._DOM.isElementNode(t))this._DOM.setAttribute(t,this._selector.printHide);else{if(!this._node.isSignificantTextNode(t))return;{const e=this._node.createTextNodeWrapper();this._DOM.wrap(t,e),this._DOM.setAttribute(e,this._selector.printHide)}}}),this._DOM.isDocumentBody(t)||this._ignoreUnprintableEnvironment(t)}}function W(e){return function(t){return t._config.debugMode&&t._debug[e]}}const z=W("selectors");function j(e,t){if(!e||!t)return void(z(this)&&console.warn("isSelectorMatching() must have 2 params","\n element: ",e,"\n selector: ",t));const i=[t];if("string"==typeof t&&t.includes("html2pdf4doc")){const e=t.replaceAll("html2pdf4doc","html2pdf");e!==t&&i.push(e)}return i.some(t=>{const i=t.charAt(0);if("."===i){const i=t.substring(1);return this._DOM.hasClass(e,i)}if("#"===i){const i=t.substring(1);return this._DOM.hasID(e,i)}if("["===i){this.strictAssert("]"===t.at(-1),`the ${t} selector is not OK.`);const i=t.substring(1,t.length-1);return this._DOM.hasAttribute(e,i)}return this._DOM.getElementTagName(e)===t.toUpperCase()})}function V(e){return!!this._DOM.isTextNode(e)&&this._DOM.getNodeValue(e).trim().length>0}function U(e){return"STYLE"===this._DOM.getElementTagName(e)}function q(e){return"IMG"===this._DOM.getElementTagName(e)}function K(e){return"svg"===this._DOM.getElementTagName(e)}function Y(e){return"OBJECT"===this._DOM.getElementTagName(e)}function X(e){return"LI"===this._DOM.getElementTagName(e)}function Q(e){return this.isSelectorMatching(e,this._selector.neutral)}function Z(e){return this.isSelectorMatching(e,this._selector.textNode)}function J(e){return this.isSelectorMatching(e,this._selector.textLine)}function ee(e){return this.isSelectorMatching(e,this._selector.textGroup)}function te(e){return this.isSelectorMatching(e,this._selector.contentFlowStart)}function ie(e){let t=this._DOM.getLeftNeighbor(e);for(;t&&this.shouldSkipFlowElement(t,{context:"isAfterContentFlowStart"});)t=this._DOM.getLeftNeighbor(t);return this.isSelectorMatching(t,this._selector.contentFlowStart)}function oe(e){return this.isSelectorMatching(e,this._selector.contentFlowEnd)}function ne(e){return this.isSelectorMatching(e,this._selector.complexTextBlock)}function re(e){return this.isComplexTextBlock(e)||this.isWrappedTextNode(e)||this.isWrappedTextLine(e)||this.isWrappedTextGroup(e)}function se(e){return this.isSelectorMatching(e,this._selector.printForcedPageBreak)}function ae(e,t){if(!(e instanceof HTMLElement))return;const i=(t||this._DOM.getComputedStyle(e)).display;return"inline"===i||"inline-block"===i||"inline-table"===i||"inline-flex"===i||"inline-grid"===i}function le(e,t){if(!(e instanceof HTMLElement))return;const i=(t||this._DOM.getComputedStyle(e)).display;return"inline-block"===i||"inline-table"===i||"inline-flex"===i||"inline-grid"===i}function ce(e,t){if(!(e instanceof HTMLElement))return;return"grid"===(t||this._DOM.getComputedStyle(e)).display}function he(e,t){if(!(e instanceof HTMLElement))return;const i=(t||this._DOM.getComputedStyle(e)).display;if("TABLE"!==this._DOM.getElementTagName(e)&&["table","inline-table"].includes(i))return!0;const o=e=>"table-row"===e,n=e=>"table-cell"===e;if(o(i)){const t=this._DOM.getChildren(e);for(const e of t)if(e instanceof HTMLElement&&n(this._DOM.getComputedStyle(e).display))return!0;return!1}if("table-row-group"===(r=i)||"table-header-group"===r||"table-footer-group"===r){const t=this._DOM.getChildren(e);for(const e of t){if(!(e instanceof HTMLElement))continue;if(!o(this._DOM.getComputedStyle(e).display))continue;const t=this._DOM.getChildren(e);for(const e of t)if(e instanceof HTMLElement&&n(this._DOM.getComputedStyle(e).display))return!0}return!1}var r;return!1}function de(e,t){if(e instanceof HTMLElement) //! const computedStyle = style || this._DOM.getComputedStyle(element); return"TABLE"===this._DOM.getElementTagName(e); //! || ['table', 'inline-table'].includes(computedStyle.display) -}function de(e,t){if(!(e instanceof HTMLElement))return;const i=t||this._DOM.getComputedStyle(e);return["block"].includes(i.display)&&["pre","pre-wrap","pre-line","break-spaces","nowrap"].includes(i.whiteSpace)}function ge(e,t){if(!(e instanceof HTMLElement))return;const i=t||this._DOM.getComputedStyle(e),o=i.display,n=i.gridAutoFlow;return("grid"===o||"inline-grid"===o)&&"row"===n}function ue(e,t){if(!(e instanceof HTMLElement))return;const i=t||this._DOM.getComputedStyle(e),o=i.display;if("flex"!==o&&"inline-flex"!==o)return!1;return(i.flexDirection||"").startsWith("row")}function pe(e,t){const i=!!t&&this.isInlineBlock(e,t);return this.isNoBreak(e)||this.isWrappedTextLine(e)||this.isWrappedTextGroup(e)||i||this.notSolved(e)}function _e(e,t){const i=t||this._DOM.getComputedStyle(e);return this.isTableNode(e,i)||this.isTableLikeNode(e,i)||this.isGridAutoFlowRow(e,i)}function fe(e){return this._DOM.hasAttribute(e,"slough-node")}const me=G("selectorHeuristics");function be(e,t,i){const o=[],n=new Set;return me(this)&&console.group(i),e.forEach(e=>{const i=this._DOM.getAllElements(e,t),r=this.isHeuristicSelector(e);me(this)&&r&&console.log("🪄 [heuristic selector]",e,`\n${i.length} elements found`);for(const t of i)r&&!this.validateHeuristicSelectorMatch(t,e)||n.has(t)||(n.add(t),o.push(t))}),me(this)&&console.log(i,o.length?o:"has no elements"),me(this)&&console.groupEnd(i),o}function we(e){return/:(only-child|first-child|last-child)\b/.test(e)}function Se(e,{allowWhitespaceText:t=!0,ignoreComments:i=!0}={}){const o=e&&e.parentNode;if(!o)return!1;for(let n=o.firstChild;n;n=n.nextSibling)if(n!==e){if(n.nodeType===Node.ELEMENT_NODE)return!1;if(n.nodeType!==Node.TEXT_NODE){if(n.nodeType===Node.COMMENT_NODE){if(i)continue;return!1}return!1}if(!t)return!1;if(n.nodeValue&&""!==n.nodeValue.trim())return!1}return!0}function Me(e){const t=e&&e.parentNode;if(!t)return!1;for(let i=t.firstChild;i&&i!==e;i=i.nextSibling){if(i.nodeType===Node.TEXT_NODE&&i.nodeValue&&""!==i.nodeValue.trim())return!0;if(i.nodeType!==Node.COMMENT_NODE&&i.nodeType!==Node.ELEMENT_NODE&&i.nodeType!==Node.TEXT_NODE&&i.nodeType!==Node.COMMENT_NODE)return!0}return!1}function Pe(e){const t=e&&e.parentNode;if(!t)return!1;let i=!1;for(let o=t.firstChild;o;o=o.nextSibling)if(i){if(o.nodeType===Node.TEXT_NODE&&o.nodeValue&&""!==o.nodeValue.trim())return!0;if(o.nodeType!==Node.COMMENT_NODE&&o.nodeType!==Node.ELEMENT_NODE&&o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE)return!0}else o===e&&(i=!0);return!1}function ye(e,t){return/:only-child\b/.test(t)?this.hasNoSignificantSiblingNodes(e,{allowWhitespaceText:!0,ignoreComments:!0}):/:first-child\b/.test(t)?!this.hasSignificantLeadingText(e):!/:last-child\b/.test(t)||!this.hasSignificantTrailingText(e)}function Ce(e,t){return/:only-child\b/.test(t)?"has significant sibling nodes (text/elements)":/:first-child\b/.test(t)?"has significant leading text":/:last-child\b/.test(t)?"has significant trailing text":"failed heuristic validation"}function Ee(e,t){return this.isHeuristicSelector(t)?e.filter(e=>this.validateHeuristicSelectorMatch(e,t)):e}function Te(e,t=""){const i=this._DOM.getElement("head"),o=this._DOM.body;if(!i&&!o)return void console.error("Check the structure of your document. We didn`t find HEAD and BODY tags. HTML2PDF4DOC expects valid HTML.");const n=this.create("style",e);n?(this._DOM.setAttribute(n,this._selector.style,t),i?this._DOM.insertAtEnd(i,n):o?this._DOM.insertBefore(o,n):this.strictAssert(!1,"We expected to find the HEAD and BODY tags.")):console.error("Failed to create print styles")}const Oe=G("positioning");function ve(e,t){if(!e||!this._DOM.getParentNode(e))return!1;let i=e;for(;this._DOM.getParentNode(i)&&i!==t;){if(this._DOM.getFirstElementChild(this._DOM.getParentNode(i))!==i)return!1;i=this._DOM.getParentNode(i)}return i===t}function De(e,t){if(!e||!this._DOM.getParentNode(e))return!1;let i=e;for(;this._DOM.getParentNode(i)&&i!==t;){if(this._DOM.getParentNode(i)===t){let e=this._DOM.getRightNeighbor(i);for(;!this._DOM.getElementOffsetHeight(e)&&!this._DOM.getElementOffsetWidth(e);)if(e=this._DOM.getRightNeighbor(e),this.isContentFlowEnd(e))return!0;return this.isContentFlowEnd(e)}if(this._DOM.getLastElementChild(this._DOM.getParentNode(i))!==i)return!1;i=this._DOM.getParentNode(i)}return i===t}function ke(e,t){return this._DOM.getElementOffsetTop(t)-this._DOM.getElementOffsetBottom(e)>-2}function Re(e,t){const i=this._DOM.getElementOffsetBottom(e),o=this._DOM.getElementOffsetTop(t),n=i-o,r=n>=2;return Oe(this)&&console.group("isLineKept?"),Oe(this)&&console.log("\n",r,"\n","\n currentBottom",i,[e],"\n nextTop",o,[t],"\n delta",n),Oe(this)&&console.groupEnd("isLineKept?"),r}function Ne(e,t,i){const o="[init-position]",n="[init-vertical-align]",r="relative",s=i||this._DOM.getComputedStyle(t),a=s.position,l=s.verticalAlign;if(e)a!=r&&(this._DOM.setStyles(t,{position:r}),this._DOM.setAttribute(t,o,a)),"top"!=l&&(this._DOM.setStyles(t,{"vertical-align":"top"}),this._DOM.setAttribute(t,n,l));else{const e=this._DOM.getAttribute(t,o),i=this._DOM.getAttribute(t,n);e&&(this._DOM.setStyles(t,{position:e}),this._DOM.removeAttribute(t,o)),i&&(this._DOM.setStyles(t,{"vertical-align":i}),this._DOM.removeAttribute(t,n))}}function xe(e,{prefer:t="self"}={}){if(!e)return null;const i=e=>"last"===t?this._DOM.getLastElementChild(e):"first"===t||"self"===t?this._DOM.getFirstElementChild(e):null,o=new Set;let n=e;for(;n&&!o.has(n);){o.add(n);if(this._DOM.getElementOffsetParent(n))return n;const e=this._DOM.getComputedStyle(n);if(!e)return null;const t=e.display,r=e.visibility,s=e.position;if("none"===t||"collapse"===r||"fixed"===s)return null;if("contents"===t){const e=i.call(this,n);if(!e)return null;n=e;continue}return null}return null}const Be=G("getters");function Fe(e,t){return this.getTop(e,t)}function Ae(e,t,i){const o=i||this._DOM.getComputedStyle(t),n=parseFloat(o.paddingTop)||0;return this.getTop(e,t)-n}function He(e,t,i){const o=i||this._DOM.getComputedStyle(t),n=parseFloat(o.paddingTop)||0;return this.getBottomWithMargin(e,t)-n}function Ie(e,t=null,i=0,o=null,n=[],r=null){if(!e)return void(Be(this)&&console.warn("[getTop] element must be provided, but was received:",e,"\nThe function returned:",void 0));if(!(e instanceof HTMLElement))return void this.strictAssert(0,"[getTop] element must be HTMLElement, but was received:",e,"\nThe function returned:",void 0);if(null===t)return this._DOM.getElementOffsetTop(e);if(!(t instanceof HTMLElement))return void this.strictAssert(0,"[getTop] root must be HTMLElement, but was received:",t,"\nThe function returned:",void 0);if(o=o||{element:e,root:t},0===i&&!t.contains(e))return void this.strictAssert(0,"[getTop] the provided root does not contain the element.",{element:e,root:t,paramSnapshot:o},"\nThe function returned:",void 0);if(!(r=r||Le.call(this,t,o)))return void(Be(this)&&console.warn("Root has no a usable offset reference; nothing else to measure against. \nThe function returned:",void 0,{element:e,paramSnapshot:o,offsetParent:a,traversal:s}));if(e===t)return i;const s=[...n,e],a=this._DOM.getElementOffsetParent(e);if(!a)return void(Be(this)&&console.warn("Element has no offset parent; offset chain is broken. \nThe function returned:",void 0,{element:e,paramSnapshot:o,offsetParent:a,traversal:s}));const l=this._DOM.getElementOffsetTop(e);return a===t?l+i:a===r.sharedOffsetParent?(r.sharedOffsetParentIsBody&&!r.warnedAboutBody&&(r.warnedAboutBody=!0,Be(this)&&console.warn("getTop(): reached document.body while measuring offsets. Layout likely lacks positioned ancestors.",{element:e,root:t,paramSnapshot:o})),l+i-r.rootOffsetFromSharedParent):this.getTop(a,t,i+l,o,s,r)}function Le(e,t){const i=this._DOM.getElementOffsetParent(e);if(!i)return Be(this)&&console.warn("[getTop*]: root has no offset parent; cannot build relative offsets.",{root:e,paramSnapshot:t}),null;const o=this._DOM.getElementOffsetTop(e);return"number"!=typeof o?(Be(this)&&console.warn("[getTop*]: root offsetTop is not a number.",{root:e,sharedOffsetParent:i,paramSnapshot:t}),null):{sharedOffsetParent:i,rootOffsetFromSharedParent:o,sharedOffsetParentIsBody:i===e.ownerDocument?.body,warnedAboutBody:!1}}function $e(e,t=null){if(e){if(null===t)return this._DOM.getElementOffsetBottom(e);if(t)return this.getTop(e,t)+this._DOM.getElementOffsetHeight(e);Be(this)&&console.warn("root must be provided, but was received:",t,"\nThe function returned:",void 0)}else Be(this)&&console.warn("[getBottom] element must be provided, but was received:",e,"\nThe function returned:",void 0)}function Ge(e,t){if(!e)return;const i=this.getBottom(e,t);let o;const n=this.createNeutralBlock();this._DOM.insertAfter(e,n);const r=this.getTop(n,t);this._DOM.removeNode(n);if(r>=i)o=r;else{o=i+parseInt(this._DOM.getComputedStyle(e).marginBottom)}return o}function We(e){const t=parseInt(this._DOM.getComputedStyle(e).marginTop),i=parseInt(this._DOM.getComputedStyle(e).marginBottom);return this._DOM.getElementOffsetHeight(e)+t+i}function je(e,t){const i=parseInt(this._DOM.getComputedStyle(e).marginTop);return this.getTop(e,t)-i}function ze(e){const t=this.create();this._DOM.insertAtEnd(e,t);const i=this._DOM.getElementOffsetWidth(t);return this._DOM.removeNode(t),i}function Ve(e,t="",i=!0){const o=this.create();i&&this._DOM.setStyles(o,{overflow:"auto"});const n=this._DOM.cloneNodeWrapper(e);this._DOM.setInnerHTML(n,t),this._DOM.insertAtEnd(o,n),this._DOM.insertBefore(e,o);const r=this._DOM.getElementOffsetHeight(o);return this._DOM.removeNode(o),r}function Ke(e){const t=this.createNeutral();this._DOM.setInnerHTML(t,"!"),this._DOM.setStyles(t,{display:"block"}),this._DOM.insertAtEnd(e,t);const i=this._DOM.getElementOffsetHeight(t);return this._DOM.removeNode(t),i}function Ue(e,t=0){const i=this._DOM.getElementOffsetTop(e),o=this._DOM.cloneNode(e),n="!
".repeat(t);[...o.children].forEach(e=>this._DOM.setInnerHTML(e,n)),this._DOM.insertBefore(e,o);const r=this._DOM.getElementOffsetTop(e);return this._DOM.removeNode(o),r-i}function qe(e){const t=this._DOM.getElementOffsetTop(e),i=this._DOM.cloneNodeWrapper(e);this._DOM.insertBefore(e,i);const o=this._DOM.getElementOffsetTop(e);return this._DOM.removeNode(i),o-t}function Ye(e){const t=this._DOM.getElementOffsetTop(e),i=this._DOM.cloneNodeWrapper(e),o=e.children.length,n=[...e.children];this._DOM.insertBefore(e,i);const r=[];for(let s=0;sthis._DOM.removeNode(e))}return this._DOM.removeNode(i),r}function Xe(e){if(!(e instanceof HTMLElement)||"TABLE"!==e.tagName)throw new Error("Expected a element.");const t=[...e.children].reduce((e,t)=>{const i=t.tagName;return"TBODY"===i?{...e,rows:[...e.rows,...t.children]}:"CAPTION"===i?(this.markNoBreak(t),{...e,caption:t}):"COLGROUP"===i?(this.markNoBreak(t),{...e,colgroup:t}):"THEAD"===i?(this.markNoBreak(t),{...e,thead:t}):"TFOOT"===i?(this.markNoBreak(t),{...e,tfoot:t}):"TR"===i?{...e,rows:[...e.rows,...t]}:(Be(this)&&t&&console.warn("unexpected:",t),{...e,unexpected:[...e.unexpected,...t]})},{caption:null,thead:null,tfoot:null,rows:[],unexpected:[]});return t.unexpected.length>0&&Be(this)&&console.warn(`something unexpected is found in the table ${e}`),t}function Ze(e,t){const i=t||this._DOM.getComputedStyle(e),o=this.createNeutralBlock();this._DOM.setStyles(o,{display:"block",padding:"0",margin:"0",border:"0",height:"0",clear:"both",visibility:"hidden",contain:"layout"}),this._DOM.insertAtEnd(e,o);const n=this.getNormalizedTop(o,e,i);return this._DOM.removeNode(o),n}function Je(e,t,i="both"){const o="bottom"!==i,n="top"!==i;if(e instanceof HTMLElement){const r=o?this.getTop(e,t):void 0,s=n?this.getBottom(e,t):void 0;return o&&!Number.isFinite(r)?(this.strictAssert(!1,"[resolveRowBoundsGeneric] failed to measure top for HTMLElement",{row:e,root:t,want:i}),{top:void 0,bottom:void 0}):n&&!Number.isFinite(s)?(this.strictAssert(!1,"[resolveRowBoundsGeneric] failed to measure bottom for HTMLElement",{row:e,root:t,want:i}),{top:void 0,bottom:void 0}):"top"===i?{top:r,bottom:r}:"bottom"===i?{top:s,bottom:s}:{top:r,bottom:s}}if(Array.isArray(e)){let r=o?1/0:void 0,s=n?-1/0:void 0,a=!1,l=!1;return e.forEach(e=>{if(e instanceof HTMLElement){if(o){const i=this.getTop(e,t);Number.isFinite(i)&&(r=Math.min(r,i),a=!0)}if(n){const i=this.getBottom(e,t);Number.isFinite(i)&&(s=Math.max(s,i),l=!0)}}}),"top"===i?a?{top:r,bottom:r}:(this.strictAssert(!1,"[resolveRowBoundsGeneric] no valid top found in row array",{row:e,root:t,want:i}),{top:void 0,bottom:void 0}):"bottom"===i?l?{top:s,bottom:s}:(this.strictAssert(!1,"[resolveRowBoundsGeneric] no valid bottom found in row array",{row:e,root:t,want:i}),{top:void 0,bottom:void 0}):o&&!a?(this.strictAssert(!1,"[resolveRowBoundsGeneric] no valid top found in row array",{row:e,root:t,want:i}),{top:void 0,bottom:void 0}):n&&!l?(this.strictAssert(!1,"[resolveRowBoundsGeneric] no valid bottom found in row array",{row:e,root:t,want:i}),{top:void 0,bottom:void 0}):{top:r,bottom:s}}return this.strictAssert(!1,"[resolveRowBoundsGeneric] unexpected row payload",{row:e,root:t,want:i}),{top:void 0,bottom:void 0}}G("creators");function Qe(e,t){let i;if(e){const t=e.charAt(0);if(t.match(/[#\[\.]/))i=this._DOM.createElement("div"),this._DOM.setAttribute(i,e);else{if(!t.match(/[a-zA-Z]/))return void this.strictAssert(!1,"Expected valid html selector ot tag name, but received:",e);i=this._DOM.createElement(e)}}else i=this._DOM.createElement("div");return t&&this._DOM.setInnerHTML(i,t),i}function et(){return this.create(this._selector.neutral)}function tt(){const e=this.createNeutral();return e.style.display="block",e.style.clear="both",e}function it(){return this.create(this._selector.textNode)}function ot(){return this.create(this._selector.textLine)}function nt(){return this.create(this._selector.textGroup)}function rt(e){const t=this.create();return this.markNoBreak(t),e&&this._DOM.setStyles(t,e),t}function st(){return this.create(this._selector.printPageBreak)}function at(){return this.create(this._selector.complexTextBlock)}function lt(e){const t=this._DOM.cloneNodeWrapper(e);return this._DOM.setAttribute(t,".test-node"),this._DOM.setStyles(t,{position:"absolute",background:"rgb(255 239 177)",width:this.getMaxWidth(e)+"px"}),t}function ht(e,t){const i=this.create(this._selector.word);return this._DOM.setInnerHTML(i,e),i.dataset.index=t,i}function ct(){return this.create(this._selector.printForcedPageBreak)}function dt(e,t){if(!t)return null;const i=this.create();return this._DOM.setStyles(i,{display:"flex",flexWrap:"nowrap",alignItems:"center",justifyContent:"center",textAlign:"center",fontSize:"8px",fontFamily:"sans-serif",letterSpacing:"1px",textTransform:"uppercase",height:t+"px"}),e&&this._DOM.setInnerHTML(i,e),this.markNoBreak(i),i}function gt({wrapper:e,caption:t,colgroup:i,thead:o,tfoot:n,tbody:r}){const s=e||this.create("table"),a=this.create("TBODY");return t&&this._DOM.insertAtEnd(s,t),i&&this._DOM.insertAtEnd(s,i),o&&this._DOM.insertAtEnd(s,o),r&&this._DOM.insertAtEnd(a,...r),this._DOM.insertAtEnd(s,a),n&&this._DOM.insertAtEnd(s,n),s}function ut(e){const t=this._DOM.cloneNodeWrapper(e);return this.unmarkPageStart(t),this.markNoBreak(t),t}G("splitters");function pt(e){return e.split(/(?<=\n)/)}function _t(e){return(this._DOM.getNodeValue(e)||this._DOM.getInnerHTML(e)).split(/(?<=\s|-)/)}function ft(e){return(this._DOM.getNodeValue(e)||this._DOM.getInnerHTML(e)).trim().split(/(?<=\s|-)/).filter(e=>" "!=e)}function mt(e){const t=e,i=this.splitTextByWordsGreedy(e),o=i.map(e=>{const t=this._DOM.createElement("span");return this._DOM.setInnerHTML(t,e+" "),t}),n=this.createTestNodeFrom(e);return this._DOM.insertAtEnd(n,...o),this._DOM.insertAtEnd(e,n),{splittedNode:t,nodeWords:i,nodeWordItems:o}}const bt=G("markers");function wt(e,t){this.setMark(e,"processed",t)}function St(e){this.setMark(e,"noBreak")}function Mt(e,t){this.setMark(e,"noHanging",t)}function Pt(e){this.setMark(e,"slice")}function yt(e,t){this.setMark(e,"pageStart",t)}function Ct(e){this.clearMark(e,"pageStart")}function Et(e,t){this.setMark(e,"pageEnd",t)}function Tt(e,t){this.setMark(e,"pageNumber",t)}function Ot(e){bt(this)&&console.log("[mark ⊤ cut]",e),e&&this.setMark(e,"cleanTopCut")}function vt(e){bt(this)&&console.log("[mark ⊥ cut]",e),e&&this.setMark(e,"cleanBottomCut")}function Dt(e){bt(this)&&console.log("[mark ⊤ cut]",e),e&&this.setMark(e,"topCut")}function kt(e){bt(this)&&console.log("[mark ⊥ cut]",e),e&&this.setMark(e,"bottomCut")}function Rt(e){if(e&&e.length)if(1!==e.length)for(let t=0;t0,o=t0,n=t","color:blue",i),r=i,s=[...this._DOM.getChildren(i)]):Array.isArray(i)?(bt(this)&&console.log("%c[markSliceCutsInRows] It is an Array","color:blue",i),r=void 0,s=i):this.strictAssert(0,"we expected TR or an array of elements!"),!r&&!s.length){bt(this)&&console.log("%c[markSliceCutsInRows] There was no split","color:red",{rowWrapper:r,cellWrappers:s});break}o&&(r&&(bt(this)&&console.log("[markSliceCutsInRows] rowWrapper ⊥",r),this.markTopCut(r)),s.forEach(e=>{bt(this)&&console.log("[markSliceCutsInRows] cell 🖍️ ⊥",e),this.markTopCut(e)})),n&&(r&&(bt(this)&&console.log("[markSliceCutsInRows] rowWrapper ⊤",r),this.markBottomCut(r)),s.forEach(e=>{bt(this)&&console.log("[markSliceCutsInRows] cell 🖍️ ⊤",e),this.markBottomCut(e)}))}else bt(this)&&console.log("%c[markSliceCutsInRows] The rows were not passed. Doing nothing.","color:red")}function xt(e){return this.hasMark(e,"pageStart")}function Bt(e){return this.hasMark(e,"noBreak")}function Ft(e){return this.hasMark(e,"noHanging")}function At(e){return this.hasMark(e,"slice")}class Ht{constructor({debugMode:e=!1,markupDebugMode:t=!1,setAttribute:i,removeAttribute:o}={}){this._debugMode=Boolean(e),this._markupDebugMode=Boolean(t),this._setAttribute=i,this._removeAttribute=o,this._marks=new WeakMap,this._symbols=new Map}set(e,t,i=true,o={}){if(!e||!t)return;this._getEntry(e).set(t,i),this._debugMode&&(e[this._getSymbol(t)]=i),this._applyAttribute(e,i,o)}get(e,t){const i=this._marks.get(e);return i?i.get(t):void 0}has(e,t){const i=this._marks.get(e);return Boolean(i&&i.has(t))}clear(e,t,i={}){if(!e||!t)return;const o=this._marks.get(e);if(o&&(o.delete(t),0===o.size&&this._marks.delete(e)),this._debugMode){const i=this._symbols.get(t);i&&delete e[i]}this._removeAttributeMarker(e,i)}_getEntry(e){let t=this._marks.get(e);return t||(t=new Map,this._marks.set(e,t)),t}_getSymbol(e){return this._symbols.has(e)||this._symbols.set(e,Symbol(String(e))),this._symbols.get(e)}_applyAttribute(e,t,i={}){const{attributeSelector:o,attributeValue:n,forceAttribute:r=!1}=i;if(!(r||this._markupDebugMode)||!this._setAttribute||!o)return;const s="function"==typeof n?n(t):void 0!==n?n:t;this._setAttribute(e,o,s)}_removeAttributeMarker(e,t={}){const{attributeSelector:i,forceAttribute:o=!1}=t;(o||this._markupDebugMode)&&this._removeAttribute&&i&&this._removeAttribute(e,i)}}class It{constructor(){this.pageStart=new Map,this.pageEnd=new Map,this.pageDividerByPage=new Map,this.pageNumberByPage=new Map,this.pageNumberByElement=new WeakMap}}class Lt{constructor(e={}){this.marks=new Ht(e),this.registry=new It}}const $t={pageStart:{kind:"structural",selectorKey:"pageStartMarker",registry:"pageStart"},pageEnd:{kind:"structural",selectorKey:"pageEndMarker",registry:"pageEnd"},pageNumber:{kind:"structural",selectorKey:"pageMarker",registry:"pageNumber"},noBreak:{kind:"runtime",selectorKey:"flagNoBreak"},noHanging:{kind:"runtime",selectorKey:"flagNoHanging"},slice:{kind:"runtime",selectorKey:"flagSlice"},split:{kind:"runtime",selectorKey:"split"},processed:{kind:"debug",selectorKey:"processed",attributeValue:e=>"🏷️ "+e},cleanTopCut:{kind:"style",selectorKey:"cleanTopCut"},cleanBottomCut:{kind:"style",selectorKey:"cleanBottomCut"},topCut:{kind:"style",selectorKey:"topCutPart"},bottomCut:{kind:"style",selectorKey:"bottomCutPart"}};function Gt(e,t,i,o={}){const n=this._getMarkAttributeConfig?.(t),r=this._isStyleMark?.(t),s={...n,...r?{forceAttribute:!0}:{},...o};this._marks.set(e,t,i,s),this._registerMark?.(e,t,i)}function Wt(e,t){return this._marks.get(e,t)}function jt(e,t){return this._marks.has(e,t)}function zt(e,t,i){const o=this._isStyleMark?.(t),n=o?{...i,forceAttribute:!0}:i;this._marks.clear(e,t,n),this._unregisterMark?.(e,t)}function Vt(e,t){e&&this._markers.registry.pageStart.set(Number(t),e)}function Kt(e){if(e)for(const[t,i]of this._markers.registry.pageStart.entries())if(i===e)return void this._markers.registry.pageStart.delete(t)}function Ut(e,t){e&&this._markers.registry.pageEnd.set(Number(t),e)}function qt(e,t){e&&this._markers.registry.pageDividerByPage.set(Number(t),e)}function Yt(){return this._markers.registry.pageDividerByPage}function Xt(e,t){if(!e)return;const i=Number(t);let o=this._markers.registry.pageNumberByPage.get(i);o||(o=new Set,this._markers.registry.pageNumberByPage.set(i,o)),o.add(e),this._markers.registry.pageNumberByElement.set(e,i)}function Zt(){return this._markers.registry.pageNumberByPage}function Jt(e){if(e)return this._markers.registry.pageNumberByElement.get(e)}function Qt(e,t,i){if(!e)return;const o=$t[t];if(o&&o.registry)switch(o.registry){case"pageStart":Vt.call(this,e,i);break;case"pageEnd":Ut.call(this,e,i);break;case"pageNumber":Xt.call(this,e,i)}}function ei(e,t){if(!e)return;const i=$t[t];if(i&&i.registry)switch(i.registry){case"pageStart":Kt.call(this,e);break;case"pageEnd":for(const[t,i]of this._markers.registry.pageEnd.entries())if(i===e){this._markers.registry.pageEnd.delete(t);break}break;case"pageNumber":{const t=this._markers.registry.pageNumberByElement.get(e);if(void 0!==t){const i=this._markers.registry.pageNumberByPage.get(t);i&&(i.delete(e),0===i.size&&this._markers.registry.pageNumberByPage.delete(t)),this._markers.registry.pageNumberByElement.delete(e)}}}}function ti(){return this._markers.registry.pageEnd}function ii(e){const t=$t[e];if(!t||!t.selectorKey)return;const i=this._selector[t.selectorKey];return i?{attributeSelector:i,attributeValue:t.attributeValue}:void 0}function oi(e){return"style"===$t[e]?.kind}G("wrappers");function ni(e){const t=this._DOM.getChildren(e),i=this.createNeutralBlock();return this._DOM.insertAtStart(i,...t),this._DOM.insertAtStart(e,i),i}const ri=G("fitters");function si({element:e,height:t,width:i,vspace:o,hspace:n}){const r=o/t,s=n/i,a=rl&&(g||(g=this.wrapNodeChildrenWithNeutralBlock(s),d=this._DOM.getElementOffsetHeight(g)||d),this.fitElementWithinHeight(g,l),n=!0,ri(this)&&console.warn("💢 scaleCellsToHeight: resized cell content",{cell:s,target:l}))}return n}function hi(e,t){this._DOM.setStyles(e,{"box-sizing":"border-box",width:`${this._DOM.getElementOffsetWidth(t)}px`,"min-width":`${this._DOM.getElementOffsetWidth(t)}px`})}function ci(e){this.copyNodeWidth(e,e),this._DOM.getAll("td",e).forEach(e=>this.copyNodeWidth(e,e))}function di(e){Array.isArray(e)&&e.forEach(e=>{e&&this.copyNodeWidth(e,e)})}function gi(e,t={}){const{descentRatio:i=.22,normalLH:o=1.2,safety:n=1}=t,r=getComputedStyle(e),s=parseFloat(r.fontSize)||0;let a;if("normal"!==r.lineHeight&&r.lineHeight){const e=parseFloat(r.lineHeight);a=Number.isFinite(e)?e:o*s}else a=o*s;const l=(Math.max(0,(a-s)/2)+i*s)*n;return Math.ceil(l)}const ui=G("pageBreaks");function pi(e,t){let i=e;for(;;){const e=this.findFirstChildParent(i,t);if(!e||e===i)break;i=e}return i}function _i(e,t,i){ui(this)&&console.group("➗ findBetterPageStart");let o=!1,n=!1,r=!1;const s=t?this.getTop(t,i):0;ui(this)&&console.log("Start calculations:",{pageStart:e,lastPageStart:t,root:i,topLimit:s});const a=this.findFirstChildParentFromPage(e,s,i);let l;if(a)l=a;else{l=this.getTop(e,i){if(this.isSTYLE(t))return Ei(this)&&console.info("🚸 (getPreparedChildren) ignore STYLE",[t]),e;if(this.isSignificantTextNode(t)){const i=this.createTextNodeWrapper();return this._DOM.wrap(t,i),e.push(i),Ei(this)&&console.info("🚸 (getPreparedChildren) wrap and return TEXT NODE",[t]),e}if(this._DOM.isElementNode(t)){if(this.shouldSkipFlowElement(t,{context:"getPreparedChildren"}))return e;if(!this._DOM.getElementOffsetParent(t)){const i=this.getPreparedChildren(t);return i.length>0&&e.push(...i),Ei(this)&&console.info("%c🚸 (getPreparedChildren) * no offset parent — unwrapped","color:green",i,[t]),e}return e.push(t),Ei(this)&&console.info("🚸 (getPreparedChildren) * normal node",[t]),e}return Ei(this)&&console.info("%c🚸 (getPreparedChildren) IGNORE whitespace / comment ...","color:red",[t]),e},[]),Ei(this)&&console.groupEnd("⚗️🚸 distill children"),Ei(this)&&console.info("🚸 distilled children",t);const i=xi.call(this,t),o=this.isInline(e);i&&(Ei(this)&&console.info("🚸 isVerticalFlowDisrupted in children of element",[e]),o?(Ei(this)&&console.info("🎒🚸 parent element is inline wrapper",[e]),t=[Ri.call(this,e)]):t=ki.call(this,t))}}return Ei(this)&&console.info("🚸 getPreparedChildren:",t),Ei(this)&&console.groupEnd("🚸 getPreparedChildren of"),t}function Oi(e,t,i,o){let n=[];if(this.isNotBreakable(e))return Ei(this)&&console.info("🧡 isNotBreakable",e),[];if(this.isComplexTextBlock(e))return Ei(this)&&console.info("💚 ComplexTextBlock",e),this._paragraph.split(e)||[];if(this.isWrappedTextNode(e))return Ei(this)&&console.info("💚 TextNode",e),this._paragraph.split(e)||[];if(!Bi.call(this,e))return Ei(this)&&console.info("🪲 getSplitChildren: empty node, return []",e),[];const r=this._DOM.getComputedStyle(e);if(this.isTableNode(e,r))Ei(this)&&console.info("💚 TABLE",e),n=this._table.split(e,t,i,o,r)||[];else if(this.isTableLikeNode(e,r))Ei(this)&&console.info("💚 TABLE like",e),n=this._tableLike.split(e,t,i,o,r)||[];else if(this.isPRE(e,r))Ei(this)&&console.info("💚 PRE",e),n=this._pre.split(e,t,i,o,r)||[];else if(this.isFlexRow(e,r)){Ei(this)&&console.info("🩷 Flex ROW",e);let t=this.getPreparedChildren(e);n=Ni.call(this,t)}else this.isGridAutoFlowRow(e,r)?(Ei(this)&&console.info("💜 GRID"),n=this._grid.split(e,t,i,o)||[]):(Ei(this)&&console.info("💚 found some node - use main this.getPreparedChildren() for:",e),n=this.getPreparedChildren(e));return n}function vi(e){const t=[];if(!e||!this||!this._DOM)return t;let i=e;for(;i;){let e=this._DOM.getFirstElementChild(i);for(;e&&this.shouldSkipFlowElement(e,{context:"getFirstChildren:firstChild"});)e=this._DOM.getRightNeighbor(e);if(!e)break;if(this.isSyntheticTextWrapper(e))break;t.push(e),i=e}return t}function Di(e){const t=[];if(!e||!this||!this._DOM)return t;let i=e;for(;i;){let e=this._DOM.getLastElementChild(i);for(;e&&this.shouldSkipFlowElement(e,{context:"getLastChildren:lastChild"});)e=this._DOM.getLeftNeighbor(e);if(!e)break;if(this.isSyntheticTextWrapper(e))break;t.push(e),i=e}return t}function ki(e){let t=null;const i=[];return e.forEach(e=>{this.isInline(e)?(t||(t=Ri.call(this,e),i.push(t)),this._DOM.insertAtEnd(t,e)):(t=null,i.push(e))}),i}function Ri(e){const t=this.createComplexTextBlock();return this._DOM.wrap(e,t),t}function Ni(e){const t=e.filter(e=>this._DOM.getElementOffsetHeight(e)>0);return t.length>0?t:e}function xi(e){return e.some((e,t,i)=>{const o=e,n=i[t+1];if(!n)return!1;return this._DOM.getElementOffsetBottom(o)>this._DOM.getElementOffsetTop(n)})}function Bi(e){let t=e.firstChild;for(;t;){if(this._DOM.isElementNode(t)){if(!this.shouldSkipFlowElement(t,{context:"hasRenderableChild"}))return!0}else if(this.isSignificantTextNode(t))return!0;t=t.nextSibling}return!1}const Fi=G("media"),Ai=new Set(["IMG","SVG","OBJECT","EMBED","IFRAME","VIDEO","AUDIO","CANVAS"]);function Hi(e,t="self"){return"last"===t?this._DOM.getLastElementChild(e):this._DOM.getFirstElementChild(e)}function Ii(e){if(!e)return!1;const t=this._DOM.getElementTagName(e);if(!t)return!1;if("INPUT"===t){return"image"===(this._DOM.getAttribute(e,"type")||"").toLowerCase()}return Ai.has(t)}function Li(e,{prefer:t="self"}={}){if(!e)return null;const i=new Set;let o=e;for(;o&&!i.has(o);){if(i.add(o),this.isReplacedElement(o))return o;if("function"==typeof this.resolveFlowElement){const e=this.resolveFlowElement(o,{prefer:t});if(e&&e!==o){if(this.isReplacedElement(e))return e;o=e;continue}}const e=[...this._DOM.getChildren(o)].filter(e=>{const t=this._DOM.getComputedStyle(e)?.display;return"none"!==t});if(1!==e.length)return Fi(this)&&console.info("🧭 resolveReplacedElement: branching or empty wrapper",o,e),null;o=Hi.call(this,o,t)||e[0]}return null}const $i=G("slicers");function Gi({rootNode:e,rootComputedStyle:t,children:i,firstPartHeight:o,fullPageHeight:n,firstChild:r,points:s=[]}){if(!i.length)return $i(this)&&console.log("🧶 [getSplitPoints] %c has no children, early returns []","font-weight:bold",{rootNode:e}),[];const a=t=>{const i=this.findBetterPageStart(t,s.at(-1),e);return s.length||i!==r?($i(this)&&console.log("%c 🧼🧼🧼🧼 push(point) in registerPoint()","color:violet",{point:i,points:s,firstChild:r},s.length),s.push(i),!1):($i(this)&&console.log("%c !points.length && point === children[0] && children[1]","color:red"),$i(this)&&console.log("%c 🅾️ push(null) in registerPoint()","color:red"),s.push(null),!0)};$i(this)&&console.group("🧶 getSplitPoints"),$i(this)&&console.log("points.length",s.length);const l=t||this._DOM.getComputedStyle(e),h=new WeakMap,c=e=>{let t=h.get(e);return t||(t=Object.create(null),h.set(e,t)),t},d=t=>{if(!t)return NaN;const i=c(t);return"top"in i||(i.top=this.getNormalizedTop(t,e,l)),i.top},g=t=>{if(!t)return NaN;const i=c(t);return"bottomWithMargin"in i||(i.bottomWithMargin=this.getNormalizedBottomWithMargin(t,e,l)),i.bottomWithMargin},u=e=>{if(!e)return 0;const t=c(e);return"offsetHeight"in t||(t.offsetHeight=this._DOM.getElementOffsetHeight(e)),t.offsetHeight};this.setInitStyle(!0,e,l);let p=!1;const _=()=>(p||(p=!0,$i(this)&&console.groupEnd(`walking through ${i.length} children`),this.setInitStyle(!1,e,t),$i(this)&&console.groupEnd("getSplitPoints")),s);$i(this)&&console.group(`walking through ${i.length} children`,i);for(let t=0;th))if($i(this)&&console.log("[getSplitPoints]",`next overtook the floater : (nextElementTop) ${b} > ${h}`,{currentElement:p},"does current overflow? let's check.",{isNextElementTopFinite:w}),(this.isSVG(p)||this.isIMG(p))&&$i(this)&&console.log("%cIMAGE","color:red;text-weight:bold"),S=g(p),S<=h){if(w){$i(this)&&console.log("[getSplitPoints]",`current fits: (currentElementBottom) ${S} <= ${h}, 🍎 register nextElement as Point.`,{currentElement:p,nextElement:m});if(a(m))return $i(this)&&console.log("%cNULL CASE, return","color:red;text-weight:bold"),_();continue}$i(this)&&console.log("[getSplitPoints] nextElementTop not finite and current fits tail window",{currentElementBottom:S,floater:h,nextElement:m})}else $i(this)&&console.log(`🔪🥒 try to split overflowing current: (currentElementBottom > ) ${S} > ${h}`,{currentElement:p}),M=!0;if(!m){$i(this)&&console.log("%c[getSplitPoints] !nextElement","color:red"),$i(this)&&console.log("%c[getSplitPoints] * Try to split it. 🔪🥒","color:blue"),S=S??g(p);let t=p;if(p.parentElement&&e.contains(p.parentElement)){let i=p.parentElement;for(;i&&e.contains(i)&&i!==e&&!this._DOM.getRightNeighbor(i);)t=i,i=i.parentElement}const i=t===p?S:g(t);if(i<=h){$i(this)&&console.log("%c 🍕 [getSplitPoints] !nextElement branch fits with container shell","color:violet",{currentElementBottom:S,containerBottom:i,floater:h,containerElement:t});continue}M=!0}if(!M)continue;let P=[];const y=this.getSplitChildren(p,o,n,e);if(y.length){if(P=Gi.call(this,{rootNode:e,rootComputedStyle:l,children:y,firstPartHeight:o,fullPageHeight:n,firstChild:r,points:s}),0===P.length){const e=Math.max(o,n),t=u(p),i=t>e&&(!P.length||1===P.length&&null===P[0]);if($i(this)&&console.log("room (Math.max)",e),i){if($i(this)&&console.warn("%c⚠️ UNSPLITTABLE OVERSIZED ELEMENT — SCALE IT","color:white; background:red; font-weight:bold;",p,`height: ${t}`),!s.length&&p===r)return $i(this)&&console.warn("🅾️ (1) points.push(null) in isUnbreakableOversized"),s.push(null),_();if(m){if(a(m))return _()}}else if(a(p))return _()}}else{$i(this)&&console.log("🍎 currentElementChildren.length == 0");const e=u(p);if(e>c&&(!P.length||1===P.length&&null===P[0])){if($i(this)&&console.warn("%c⚠️ UNSPLITTABLE OVERSIZED ELEMENT — SCALE IT","color:white; background:red; font-weight:bold;",p,`height: ${e}`),$i(this)&&console.warn("🅾️ (2) points.push(null) in isUnbreakableOversized"),!s.length&&p===r)return s.push(null),_();if(m){$i(this)&&console.warn("🅾️🅾️🅾️🅾️🅾️🅾️🅾️🅾️ registerPoint(nextElement)");if(a(m))return _()}}else{if(a(p))return _()}}}return _()}function Wi(e,t,i,o,n){$i(this)&&console.group("[✖️] getSplitPointsPerCells");const r=e.map((e,r)=>{$i(this)&&console.group(`(•) Split CELL.${r} in:`,n);let s=[];const a=i-(t[r]||0),l=o-(t[r]||0);let h=this.getSplitChildren(e,a,l,n);if(h.length){const t=h[0];$i(this)&&console.log("firstChild",t),s=this.getSplitPoints({rootNode:e,children:h,firstPartHeight:a,fullPageHeight:l,firstChild:t})}else $i(this)&&console.log(`(•) empty cell #${r}`);return $i(this)&&console.log(`(•) return splitPoints for CELL#${r}`,s),$i(this)&&console.groupEnd(),s}),s=r.some(Ki);$i(this)&&console.log("🧽🧽🧽🧽🧽🧽🧽 isFirstPartEmptyInAnyCell",s);let a=r,l=!1;if(s){a=e.map((e,r)=>{$i(this)&&console.group(`(••) Split CELL.${r} in:`,n);const s=i-(t[r]||0),a=o-(t[r]||0),l=this.getSplitChildren(e,s,a,n),h=l[0];$i(this)&&console.log("firstChild",h);let c=[];return l.length&&(c=this.getSplitPoints({rootNode:e,children:l,firstPartHeight:a,fullPageHeight:a,firstChild:h})),$i(this)&&console.log(`(••) return splitPoints for CELL#${r}`,c),$i(this)&&console.groupEnd(),c}),$i(this)&&console.log("[••] splitPointsPerCell",a);for(let e=0;e0&&this.strictAssert(i.every(e=>null!==e),"sliceNodeBySplitPoints: splitPoints contains null — sanitize upstream before slicing"),this.strictAssert(i.every(e=>!e||e.nodeType===Node.ELEMENT_NODE&&(t===e||t.contains(e))),"sliceNodeBySplitPoints: split point is not an Element within rootNode");for(let e=0;e<=i.length;e++){const n=i[e-1]??null,r=i[e]??null,s=this.cloneAndCleanOutsideRange(t,n,r);this.normalizeContentCuts({slice:s,top:null!==n,bottom:null!==r}),this._DOM.getChildNodes(s).length>0&&o.push(s)}return $i(this)&&console.log(o),$i(this)&&console.groupEnd(`🔪 (${e}) sliceNodeBySplitPoints`),o}function zi({slice:e,top:t=!1,bottom:i=!1}){if(e){if(t){const t=[...this.getFirstChildrenChain(e)];t.forEach(e=>this.markCleanTopCut(e)),$i(this)&&console.log("[normalizeContentCuts] topChain 👗",t)}if(i){const t=[...this.getLastChildrenChain(e)];t.forEach(e=>this.markCleanBottomCut(e)),$i(this)&&console.log("[normalizeContentCuts] bottomChain 👗",t)}}else $i(this)&&console.log("[normalizeContentCuts] no slice has been passed; return")}function Vi({index:e,rootNode:t,splitPoints:i}){$i(this)&&console.group(`🔪 (${e}) sliceNodeContentBySplitPoints`);const o=[];for(let e=0;e<=i.length;e++){const n=i[e-1]??null,r=i[e]??null,s=this.cloneAndCleanOutsideRange(t,n,r);$i(this)&&console.log({slice:s});const a=this.createNeutralBlock();for(;s.firstChild;)a.appendChild(s.firstChild);a.childNodes.length>0&&o.push(a)}return $i(this)&&console.log(o),$i(this)&&console.groupEnd(`🔪 (${e}) sliceNodeContentBySplitPoints`),o}function Ki(e){return!!Array.isArray(e)&&(e.length>0&&null===e[0])}function Ui(e,t,i){t&&t.setAttribute("split","start"),i&&i.setAttribute("split","end");let o=e.cloneNode(!0);if(t){let t=o.querySelector('[split="start"]'),i=t.previousElementSibling;for(;i;){let e=i;i=i.previousElementSibling,e.remove()}let n=t.parentElement;for(;n&&n!==e;){let e=n.previousElementSibling;for(;e;){let t=e;e=e.previousElementSibling,t.remove()}n=n.parentElement}t.removeAttribute("split")}if(i){let t=o.querySelector('[split="end"]'),i=t.nextElementSibling;for(;i;){let e=i;i=i.nextElementSibling,e.remove()}let n=t.parentElement;for(;n&&n!==e;){let e=n.nextElementSibling;for(;e;){let t=e;e=e.nextElementSibling,t.remove()}n=n.parentElement}t.remove()}return t&&t.removeAttribute("split"),i&&i.removeAttribute("split"),o}const qi=G("flowfilters"),Yi="__html2pdf4docFlowFilter",Xi=[{test:e=>"none"===e.display,cache:{reason:"display:none",message:"* display:none — skipped"}},{test:e=>"absolute"===e.position,cache:{reason:"position:absolute",message:"* position:absolute — skipped"}},{test:e=>"fixed"===e.position,cache:{reason:"position:fixed",message:"* position:fixed — skipped"}},{test:e=>"collapse"===e.visibility,cache:{reason:"visibility:collapse",message:"* visibility:collapse — skipped"}}];function Zi(e,t,i,o,{cached:n}={cached:!1}){if(!qi(e))return;const r=t?`(${t}) `:"",s=n?" (cached)":"";console.info(`🚸 ${r}${i.message}${s}`,[o])}function Ji(e,{context:t="",computedStyle:i}={}){if(!(e&&this&&this._DOM&&this._DOM.isElementNode(e)))return!1;const o=e[Yi];if(o)return Zi(this,t,o,e,{cached:!0}),!0;const n=i??this._DOM.getComputedStyle(e);if(!n)return!1;for(const i of Xi)if(i.test(n))return e[Yi]=i.cache,Zi(this,t,i.cache,e),!0;return!1}function Qi(e,t,i){return this._cache.measure.getBCR(e,t,i)}function eo(e,t,i){const o=i||(()=>this._DOM.getComputedStyle(e));return this._cache.measure.getStyle(e,t,o)}function to(){this._cache.resetMeasureCache()}G("pagination");function io({cells:e,splitPointsPerCell:t,sliceCell:i}){return t.map((t,o)=>{const n=e[o];return i({cell:n,index:o,splitPoints:t})})}function oo({originalRow:e,originalCells:t,slicedCellsPerOriginal:i,beginRow:o,cloneCellFallback:n,handleCell:r,finalizeRow:s}){const a=Math.max(...i.map(e=>e.length)),l=[];for(let h=0;h{const o=i[t][h]||n(e);r({context:a,cellClone:o,originalCell:e,cellIndex:t})}),l.push(s({context:a}))}return l}function no({originalRow:e,originalCells:t,splitPointsPerCell:i,sliceCell:o,beginRow:n,cloneCellFallback:r,handleCell:s,finalizeRow:a}){if(!Array.isArray(i)||!i.length)return[];const l=this.sliceCellsBySplitPoints({cells:t,splitPointsPerCell:i,sliceCell:o});return this.buildRowSlices({originalRow:e,originalCells:t,slicedCellsPerOriginal:l,beginRow:n,cloneCellFallback:r,handleCell:s,finalizeRow:a})}function ro({usedRemainingWindow:e,isFirstPartEmpty:t,firstSliceTop:i,firstSliceBottom:o,pageBottom:n,epsilon:r=.5}){return{placeOnCurrentPage:e&&!t,remainingWindowSpace:Math.max(0,n-i),exceedsWindow:o>n+r}}function so({currentRows:e,index:t,rowSlices:i}){return Array.isArray(e)?(e.splice(t,1,...i),e):[]}const ao=G("pagination");function lo({cells:e,targetHeight:t,shells:i}){return!!(Array.isArray(e)&&e.length&&t>0)&&this.scaleCellsToHeight(e,t,i)}function ho({needsScalingInFullPage:e,cells:t}){return Boolean(e&&Array.isArray(t)&&t.length)}function co({needsScalingInFullPage:e,scaleCallback:t,payload:i}){if(!e)return!1;if("function"!=typeof t)return!1;const o=t(i||{});return!o&&this&&this._debug&&this._debug._&&ao(this)&&console.warn("[pagination.scaling] requested full-page scaling but callback reported no change",i),Boolean(o)}G("pagination");function go(e,t,i){e&&Array.isArray(e.rows)&&e.rows.splice(t,1,...i)}function uo({rows:e,DOM:t,cellTagFilter:i,guardCallback:o}){if(!Array.isArray(e))return{};let n=!1,r=!1,s=!1,a=null;e.forEach(e=>{const o=Array.isArray(e)?e:Array.from(t.getChildren(e)||[]);null==a&&(a=o.length),o.length!==a&&(s=!0),o.forEach(e=>{const o=t.getElementTagName(e);if(!i||i(o,e)){const t=parseInt(e.getAttribute?.("rowspan"));Number.isFinite(t)&&t>1&&(n=!0);const i=parseInt(e.getAttribute?.("colspan"));Number.isFinite(i)&&i>1&&(r=!0)}})});const l={hasRowspan:n,hasColspan:r,inconsistentCells:s};return o?.(l),l}G("pagination");function po(e){if(!e||"object"!=typeof e)throw new Error("splitter kernel adapter must be an object.");if(!e.rows||"object"!=typeof e.rows)throw new Error("splitter kernel adapter must expose a rows provider.");if("function"!=typeof e.rows.replaceRow)throw new Error("splitter kernel adapter rows.replaceRow must be a function.")}function _o(e,{rowIndex:t,rowSlices:i}){po(e);const o=Number.isFinite(t)?t:0,n=Array.isArray(i)?i:[],r=e.rows;r.replaceRow({rowIndex:o,rowSlices:n}),r.syncEntries?.({rowIndex:o,rowSlices:n});const s=e.guards?.getConfig?.({rowIndex:o,rowSlices:n})??r.getGuardConfig?.({rowIndex:o,rowSlices:n})??null;let a=null;if(s){const t={rows:s.rows,DOM:s.DOM||this._DOM,cellTagFilter:s.cellTagFilter,guardCallback:s.guardCallback};Array.isArray(t.rows)&&t.DOM&&(a=this.computeRowFlags(t),e.guards?.onFlags?.({flags:a,rowIndex:o,rowSlices:n}))}return e.metrics?.refresh?.({rowIndex:o,rowSlices:n,flags:a}),r.onRowsChanged?.({rowIndex:o,rowSlices:n,flags:a}),{flags:a}}G("pagination");function fo({cells:e}){return Array.isArray(e)&&e.length?e.map(e=>{if(!e)return 0;const t=this._DOM.getComputedStyle(e),i=(parseFloat(t?.paddingTop)||0)+(parseFloat(t?.paddingBottom)||0)+(parseFloat(t?.borderTopWidth)||0)+(parseFloat(t?.borderBottomWidth)||0);return Number.isFinite(i)?Math.max(0,i):0}):[]}const mo=G("pagination");function bo({ownerLabel:e,DOM:t,row:i,targetHeight:o,cachedShells:n,getRowShellHeightsCallback:r,scaleCellsToHeightCallback:s}){if(e||mo(this)&&console.warn("[scaleRowCellsToHeight] 👤 Owner wanted!",{owner:e}),!i)return mo(this)&&console.warn("[pagination.overflow] Missing row for scaling.",{owner:e}),!1;if("function"!=typeof s)return mo(this)&&console.warn("[pagination.overflow] scaleCellsToHeight callback is required.",{owner:e}),!1;const a=t,l=a&&"function"==typeof a.getChildren?a.getChildren(i):null;return s(l?[...l]:[],o,Array.isArray(n)?n:"function"==typeof r?r(i):[])}function wo({ownerLabel:e,rowIndex:t,row:i,availableRowHeight:o,fullPageHeight:n,splitStartRowIndexes:r,reasonTail:s,reasonFull:a,registerPageStartCallback:l,scaleProblematicCellsCallback:h,debugLogger:c}){return e||mo(this)&&console.warn("[handleRowOverflow] 👤 Owner wanted!",{owner:e}),Array.isArray(r)?"function"!=typeof l?(mo(this)&&console.warn("[pagination.overflow] registerPageStart callback is required.",{owner:e}),t):o!1,isSlice:n=()=>!1}=t,{handleRowWithRowspan:r=()=>e.rowIndex,handleSplittableRow:s=()=>e.rowIndex,handleAlreadySlicedRow:a=()=>e.rowIndex}=i,{row:l}=e;return o(l,e)?r({evaluation:e}):n(l,e)?a({evaluation:e}):s({evaluation:e})}function vo({evaluation:e,splitStartRowIndexes:t,fullPageHeight:i,resolveOverflow:o,debug:n,afterResolve:r}){const{rowIndex:s,tailWindowHeight:a}=e;To(this)&&console.log("%c ⚠️ Row has ROWSPAN; use conservative fallback (no slicing)","color:DarkOrange; font-weight:bold");const l=o({rowIndex:s,evaluation:e,availableRowHeight:a,splitStartRowIndexes:t,fullPageHeight:i});return r?.({evaluation:e,tailWindowHeight:a,fullPageHeight:i,result:l}),l}function Do({evaluation:e,splitStartRowIndexes:t,resolveSplitFailure:i,fullPageHeight:o,debug:n}){const{rowIndex:r,row:s,tailWindowHeight:a,delta:l}=e;return To(this)&&console.log(`%c Row # ${r} is slice! but don't fit`,"color:DarkOrange; font-weight:bold",s),To(this)&&console.warn("%c SUPER BIG","background:red;color:white",l,{part:o}),i({evaluation:e,splitStartRowIndexes:t,availableRowHeight:a,fullPageHeight:o})}function ko({tailWindowHeight:e,minMeaningfulRowSpace:t,fullPartHeight:i,debug:o}){return ethis.sliceNodeBySplitPoints({index:t,rootNode:e,splitPoints:i})),f=a.beginRow||(({originalRow:t,sliceIndex:i})=>{const o=this._DOM.cloneNodeWrapper(t);return r?.({rowWrapper:o,rowIndex:e,sliceIndex:i,originalRow:t}),{rowWrapper:o}}),m=a.cloneCellFallback||(e=>this._DOM.cloneNodeWrapper(e)),b=a.handleCell||(({context:e,cellClone:t})=>{this._DOM.insertAtEnd(e.rowWrapper,t)}),w=a.finalizeRow||(({context:e})=>e.rowWrapper),S=[];if(g.some(e=>Array.isArray(e)&&e.length)){const e=this.paginationBuildBalancedRowSlices({originalRow:t,originalCells:h,splitPointsPerCell:g,sliceCell:_,beginRow:f,cloneCellFallback:m,handleCell:b,finalizeRow:w});S.push(...e)}else To(this)&&console.log("🔴 There is no Split");return S.length&&this.markSliceCutsInRows(S),n&&n._&&console.log("%c newRows \n","color:magenta; font-weight:bold",S),{newRows:S,isFirstPartEmptyInAnyTD:u,needsScalingInFullPage:p}}function No({row:e,rowIndex:t,decorateRowSlice:i}){const o=Array.isArray(e),n=this;return{getParentContainer:()=>o?null:e,getOriginalCells:()=>o?[...e]:[...n._DOM.getChildren(e)],getShellHeights:({cells:t})=>o?[]:n.getTableRowShellHeightByTD(e),markOriginalRow:({cells:t})=>{o||n.markSlice(e)},beginRow:({originalRow:e,sliceIndex:r})=>{if(o)return{cells:[]};const s=n._DOM.cloneNodeWrapper(e);return i?.({rowWrapper:s,rowIndex:t,sliceIndex:r,originalRow:e}),{rowWrapper:s}},cloneCellFallback:e=>n._DOM.cloneNodeWrapper(e),handleCell:({context:e,cellClone:t})=>{o?(n.markSlice(t),e.cells.push(t)):n._DOM.insertAtEnd(e.rowWrapper,t)},finalizeRow:({context:e})=>o?e.cells:e.rowWrapper}}function xo({evaluation:e,splitResult:t,splitStartRowIndexes:i,insufficientRemainingWindow:o,extraCapacity:n,fullPageHeight:r,debug:s,handlers:a={}}){const{newRows:l,isFirstPartEmptyInAnyTD:h,needsScalingInFullPage:c}=t||{},{rowIndex:d,row:g,isLastRow:u,tailWindowHeight:p}=e,{onReplaceRow:_,onAbsorbTail:f,onRefreshRows:m,onPlacement:b,onSplitFailure:w}=a;return Array.isArray(l)&&l.length?(_?.({evaluation:e,newRows:l}),u&&f?.({evaluation:e,newRows:l,extraCapacity:n}),m?.({evaluation:e,newRows:l,splitStartRowIndexes:i}),b?.({evaluation:e,newRows:l,insufficientRemainingWindow:o,isFirstPartEmptyInAnyTD:h,needsScalingInFullPage:c,splitStartRowIndexes:i})??e.rowIndex):(To(this)&&console.log(`%c The row is not split. (ROW.${d})`,"color:orange",g),w?.({evaluation:e,splitStartRowIndexes:i,availableRowHeight:p,fullPageHeight:r})??e.rowIndex)}function Bo({evaluation:e,splitStartRowIndexes:t,extraCapacity:i,fullPageHeight:o,minPartLines:n,debug:r,decorateRowSlice:s,onBudgetInfo:a,handlers:l={}}){if(!e||!e.row)return e?.rowIndex??0;const{row:h}=e,c=this.getTableRowHeight(h,n),d=this.paginationCalculateRowSplitBudget({tailWindowHeight:e.tailWindowHeight,minMeaningfulRowSpace:c,fullPartHeight:o,debug:r});a?.({evaluation:e,firstPartHeight:d.firstPartHeight,fullPartHeight:o});const g=l.getRowSliceAdapter,u=g?.({evaluation:e,row:h,rowIndex:e.rowIndex,decorateRowSlice:s}),p=this.paginationSplitRow({rowIndex:e.rowIndex,row:h,firstPartHeight:d.firstPartHeight,fullPageHeight:o,debug:r,decorateRowSlice:s,rowAdapter:u});return this.paginationProcessRowSplitResult({evaluation:e,splitResult:p,splitStartRowIndexes:t,insufficientRemainingWindow:d.insufficientRemainingWindow,extraCapacity:i,fullPageHeight:o,debug:r,handlers:l})}function Fo({evaluation:e,table:t,newRows:i,insufficientRemainingWindow:o,isFirstPartEmptyInAnyTD:n,needsScalingInFullPage:r,splitStartRowIndexes:s,pageBottom:a,fullPageHeight:l,debug:h,resolveRowBounds:c,registerPageStartCallback:d,scaleProblematicSliceCallback:g,applyFullPageScalingCallback:u}){const{rowIndex:p}=e,_=Array.isArray(i)?i[0]:null;if(!_)return d?.({targetIndex:p,reason:"Row split produced empty first slice"}),p-1;const f="function"==typeof c?c:e=>this.resolveRowBoundsGeneric(e,t),{top:m,bottom:b}=f(_),w=this.evaluateRowSplitPlacement({usedRemainingWindow:!o,isFirstPartEmpty:n,firstSliceTop:m,firstSliceBottom:b,pageBottom:a,epsilon:0});return w.placeOnCurrentPage?(w.remainingWindowSpace>0&&g?.(_,w.remainingWindowSpace),d?.({targetIndex:p+1,reason:"Row split — next slice starts new page"})):(u?.({row:_,needsScalingInFullPage:r,fullPageHeight:l}),d?.({targetIndex:p,reason:"Empty first part — move row to next page"})),p-1}const Ao="default";class Ho{constructor(){this._bcr=new WeakMap,this._styles=new WeakMap}getBCR(e,t=Ao,i){if(!e)return;const o=this._getBucket(this._bcr,e);if(o.has(t))return o.get(t);const n=i?i():e.getBoundingClientRect();return o.set(t,n),n}getStyle(e,t=Ao,i){if(!e)return;const o=this._getBucket(this._styles,e);if(o.has(t))return o.get(t);const n=i?i():window.getComputedStyle(e);return o.set(t,n),n}delete(e){e&&(this._bcr.delete(e),this._styles.delete(e))}reset(){this._bcr=new WeakMap,this._styles=new WeakMap}_getBucket(e,t){let i=e.get(t);return i||(i=new Map,e.set(t,i)),i}}class Io{constructor(){this.measure=new Ho}resetMeasureCache(){this.measure.reset()}}class Lo{constructor({config:e,DOM:t,node:o,selector:n}){this._debug=e.debugMode?{...e.debugConfig.paragraph}:{},this._assert=!!e.consoleAssert,this._DOM=t,this._selector=n,this._node=o,this._minParagraphLeftLines=2,this._minParagraphDanglingLines=2,this._minParagraphBreakableLines=this._minParagraphLeftLines+this._minParagraphDanglingLines||2,Object.assign(this,i)}split(e){return this._splitComplexTextBlockIntoLines(e)}_estimateLineCount(e){return Math.ceil(this._DOM.getElementOffsetHeight(e)/this._node.getLineHeight(e))}_splitComplexTextBlockIntoLines(e){if(this._debug._&&console.group("_splitComplexTextBlockIntoLines",[e]),this._estimateLineCount(e){const t=this._node.getLineHeight(e),i=this._DOM.getElementOffsetHeight(e),o=this._DOM.getElementOffsetLeft(e),n=this._DOM.getElementOffsetTop(e);return{element:e,lines:Math.ceil(i/t),left:o,top:n,height:i,lineHeight:t,text:this._DOM.getInnerHTML(e)}});this._debug._&&console.log("\n🚸 nodeChildren",[...t],"\n🚸 extendedChildrenArray",[...i]);const o=i.flatMap(e=>e.lines>1&&!this._node.isNotBreakable(e.element)?this._breakItIntoLines(e.element):e.element);this._debug._&&console.log("\n🚸🚸🚸\n partiallyLinedChildren",[...o]);const n=o.reduce((e,t,i,o)=>(e||(e=[]),"BR"===this._DOM.getElementTagName(t)?(e.length||e.push([]),e.at(-1).push(t),e.push([]),this._debug._&&console.log("br; push:",t),e):!e.length||this._node.isLineChanged(e.at(-1).at(-1),t)?(e.push([t]),this._debug._&&console.log("◼️ start new line:",t),e):0===e.at(-1).length||e.length&&this._node.isLineKept(e.at(-1).at(-1),t)?(this._debug._&&console.log("⬆ add to line:",t),e.at(-1).push(t),e):void this.strictAssert(!0,"groupedPartiallyLinedChildren: An unexpected case of splitting a complex paragraph into lines.","\nOn the element:",t)),[]);if(this._debug._&&console.log("🟡🟡🟡 groupedPartiallyLinedChildren \n",n.length,[...n]),n.length{let i;if(0==e.length)i=e[0],i.setAttribute("role","🚫"),this.strictAssert(0==e.length,"The string cannot be empty (_splitComplexTextBlockIntoLines)");else if(1==e.length)i=e[0];else{i=this._node.createTextGroup(),this._DOM.insertBefore(e[0],i),this._DOM.insertAtEnd(i,...e)}return i.dataset.child=t,i});return this.logGroupEnd("OK _splitComplexTextBlockIntoLines"),this._node.setMark(e,"split"),a}_breakItIntoLines(e){if(this._debug._&&console.group("_breakItIntoLines",[e]),this._node.isNoBreak(e))return this.logGroupEnd("isNoBreak"),e;if(this._node.isWrappedTextNode(e)){const t=this._breakWrappedTextNodeIntoLines(e);return this.logGroupEnd("TextNode newLines"),t}return this.logGroupEnd("(recursive _breakItIntoLines)"),this._processNestedInlineElements(e)}_processNestedInlineElements(e){this._debug._&&console.group("_processNestedInlineElements",[e]);const t=this._getNestedInlineChildren(e).flatMap(e=>this._estimateLineCount(e)>1?this._breakItIntoLines(e):e),i=this._findNewLineStarts(t,e),o=i.map((o,n)=>{const r=t[o],s=t[i[n+1]];return this._node.cloneAndCleanOutsideRange(e,r,s)});return this._DOM.insertInsteadOf(e,...o),this.logGroupEnd("Nested Inline parts"),o}_getNestedInlineChildren(e){return[...this._DOM.getChildNodes(e)].reduce((e,t)=>{if(this._node.isSignificantTextNode(t)){const i=this._node.createTextNodeWrapper();return this._DOM.wrap(t,i),e.push(i),e}if(!this._DOM.getElementOffsetParent(t)){const i=this._node.getPreparedChildren(t);return i.length>0&&e.push(...i),e}if(this._DOM.isElementNode(t)){return this._getNestedInlineChildren(t).forEach(t=>e.push(t)),e}},[])}_makeWordsFromTextNode(e){const t=this._node.splitTextByWordsGreedy(e);this._debug._&&console.log("wordArray",t);const i=t.map((e,t)=>this._node.createWord(e+"",t));return this._debug._&&console.log("wrappedWordArray",i),{wordArray:t,wrappedWordArray:i}}_breakWrappedTextNodeIntoLines(e){e.classList.add("🔠_breakItIntoLines"),e.classList.add("🚫_must_be_removed");const{wordArray:t,wrappedWordArray:i}=this._makeWordsFromTextNode(e);this._DOM.setInnerHTML(e,""),this._DOM.insertAtEnd(e,...i);const o=this._findNewLineStarts(i,e),n=o.reduce((i,n,r)=>{const s=this._node.createTextLine(),a=o[r],l=o[r+1],h=t.slice(a,l).join("")+"";return this._DOM.setInnerHTML(s,h),this._DOM.insertBefore(e,s),i.push(s),i},[]);return e.remove(),n}_findNewLineStarts(e,t){const i=t.style.lineHeight;t.style.lineHeight=2;const o=e.reduce((t,i,o)=>{const n=o>0?e[o-1].offsetTop:void 0,r=o>0?e[o-1].offsetHeight:void 0,s=i.offsetTop;return o>0&&n+r<=s&&t.push(o),t},[0]);return t.style.lineHeight=i,o}}function $o(e){if(e)return"function"==typeof e.getDebug?e.getDebug():e.debug}function Go(e,t,i="unknown case"){if(!e||"function"!=typeof e.getSplitBottom||"function"!=typeof e.setSplitBottom)throw new Error("updateSplitBottom: adapter must expose getSplitBottom() and setSplitBottom().");const o=e.getSplitBottom();let n;if("number"==typeof t)n=t;else{if(!(t instanceof HTMLElement))throw new Error("updateSplitBottom: unexpected value type: "+typeof t);if("function"!=typeof e.computeSplitBottomForElement)throw new Error("updateSplitBottom: adapter must implement computeSplitBottomForElement(element).");n=e.computeSplitBottomForElement(t)}e.setSplitBottom(n);const r=function(e){return e?"function"==typeof e.getSplitBottomLog?e.getSplitBottomLog():e.splitBottomLog||null:null}(e);Array.isArray(r)&&r.push(n);const s=$o(e);s&&s._&&console.log(`%c♻️ [${function(e){return e?.label||"👤 [paginator.label] element"}(e)}] update splitBottom (with ${t}) \n • ${i}`,"color: green; font-weight: bold","\n",o||"•••","->",n,r?`\n log: ${r}`:"")}function Wo(e,t,i,o="register page start"){const n=function(e){return e?"function"==typeof e.getRows?e.getRows()||[]:e.rows||[]:[]}(e),r=n.length,s=function(e){return!!e&&("function"==typeof e.shouldAssert?e.shouldAssert():Boolean(e.assert))}(e),a=$o(e),l=Number.isInteger(t);if(s&&console.assert(l,`registerPageStartAt: index must be an integer, got: ${t}`),!l)return;if(s&&console.assert(r>0,"registerPageStartAt: no rows to register"),0===r)return;if(0===t)return a&&a._&&console.log("%c 📍 Row #0 forced to next page (no short first fragment)","color:green; font-weight:bold"),void((n[0]instanceof HTMLElement||"number"==typeof n[0])&&Go(e,n[0],`${o} (index=0)`));let h=Math.max(1,Math.min(t,r-1));const c=i.at(-1);if(null!=c&&h<=c&&(h=c+1),h>=r)return void(a&&a._&&console.warn(`registerPageStartAt return: computed index (${h}) >= rowsLen (${r})`,"Last split index should not equal rows.length, or the original table will be empty."));i.push(h),a&&a._&&console.log(`%c 📍 Row # ${h} registered as page start`,"color:green; font-weight:bold");const d=n[h];(d instanceof HTMLElement||"number"==typeof d)&&Go(e,d,o)}function jo({owner:e=null,currentRows:t=[]}={}){return{owner:e,currentRows:Array.isArray(t)?t:[],parts:[]}}function zo({entries:e,part:t,startIndex:i=null,endIndex:o=null,type:n="unknown",rows:r=[],meta:s}){if(!e||!t)return null;const a=function(e){if(e)return Array.isArray(e.parts)||(e.parts=[]),e.parts}(e);if(!a)return null;const l={part:t,type:n,startIndex:i,endIndex:o,rows:Array.isArray(r)?[...r]:[]};return s&&"object"==typeof s&&Object.keys(s).length&&(l.meta={...s}),a.push(l),l}class Vo{constructor({config:e,DOM:t,node:o,selector:n}){this._debug=e.debugMode?{...e.debugConfig.table}:{},this._assert=!!e.consoleAssert,this._DOM=t,this._selector=n,this._node=o,this._splitLabelHeightFromConfig=e.splitLabelHeight,this._initConstants(),Object.assign(this,i),this._resetCurrent()}split(e,t,i,o,n){this._setCurrent(e,t,i,o);const r=this._splitCurrentTable();return this._resetCurrent(),r}_initConstants(){this._signpostHeight=parseFloat(this._splitLabelHeightFromConfig)||0,this._minPartLines=2}_resetCurrent(){this._currentTable=void 0,this._currentFirstPageBottom=void 0,this._currentFullPageHeight=void 0,this._currentRoot=void 0,this._currentTableEntries=void 0,this._currentTableRecordedParts=void 0,this._currentTableDistributedRows=void 0,this._currentTableFirstPartContentBottom=void 0,this._currentTableFullPartContentHeight=void 0,this._currentTableTfootHeight=void 0,this._currentTableSplitBottom=void 0,this._logSplitBottom_=[],this._currentRowShellCache=void 0,this._currentOverflowHelpers=void 0,this._currentTableHasRowspan=void 0,this._currentTableHasColspan=void 0,this._currentTableInconsistentCells=void 0,this._currentTableHasUnexpectedChildren=void 0}_setCurrent(e,t,i,o){this._currentTable=e,this._currentFirstPageBottom=t,this._currentFullPageHeight=i,this._currentRoot=o,this._currentRowShellCache=new WeakMap,this._currentOverflowHelpers=this._composeOverflowHelpers()}_prepareCurrentTableForSplitting(){this._lockCurrentTableWidths(),this._collectCurrentTableEntries(),this._updateCurrentTableDistributedRows(),this._currentTableRecordedParts=jo({owner:this._currentTable,currentRows:this._currentTableDistributedRows}),this._currentTableEntries&&(this._currentTableEntries.recordedParts=this._currentTableRecordedParts),this._currentTable.__html2pdf4docRecordedParts=this._currentTableRecordedParts,this._analyzeCurrentTableStructure(),this._collectCurrentTableMetrics()}_lockCurrentTableWidths(){this._node.lockTableWidths(this._currentTable)}_splitCurrentTable(){this._prepareCurrentTableForSplitting(),this._setCurrentTableFirstSplitBottom(),this._debug._&&console.group("%c📊 _splitCurrentTable()","color:green; background:#eee; padding:3px","\n•",this._currentTableFirstPartContentBottom,"(1st bottom)","\n•",this._currentTableFullPartContentHeight,"(full part height)",{table:this._currentTable,rows:[...this._currentTableDistributedRows],rowCount:this._currentTableDistributedRows.length,entries:this._currentTableEntries,root:this._currentRoot});const e=this._resolveCurrentTableDistributedRowsInPlace();if(this._debug._&&console.log("📊 updated table rows",{rows_new:[...this._currentTableDistributedRows],rowCount_new:this._currentTableDistributedRows.length,splitStartRowIndexes:e}),!e.length)return this.logGroupEnd("[_splitCurrentTable]: there are no splits (!splitStartRowIndexes.length)"),[];let t=this._createTableSlices({splitPoints:e,table:this._currentTable,tableEntries:this._currentTableEntries});return this._node.markSliceCuts([this._currentTable,...t]),this._signpostHeight&&(t=this._extendTableSlices(t)),this._DOM.insertAfter(this._currentTable,...t),this._debug._&&console.log("tableSlices",t),this._debug._&&console.log("[table.split] recordedParts",this._currentTableRecordedParts?.parts),this.logGroupEnd("[_splitCurrentTable]"),[this._currentTable,...t]}_resolveCurrentTableDistributedRowsInPlace(){let e=[];for(let t=0;tNumber.isInteger(e)&&e>0&&e<=this._currentTableDistributedRows.length),"splitStartRowIndexes contains invalid indexes"),this.strictAssert(e.every((e,t,i)=>0===t||e>i[t-1]),"splitStartRowIndexes must be strictly ascending and without duplicates"),this.strictAssert(e.at(-1)!==this._currentTableDistributedRows.length,"Last split index should not equal rows.length, or the original table will be empty."),e}_evaluateAndResolveRow(e,t){const i=e,o=this._currentTableDistributedRows.length;this._debug._&&console.groupCollapsed(`🔲 %c Check the Row # ${i} (from ${o})`,"");const n=this._node.paginationBuildRowEvaluationContext({rows:this._currentTableDistributedRows,rowIndex:e,table:this._currentTable,splitBottom:this._currentTableSplitBottom});if(!n?.row)return console.warn("[table.split] Missing row during evaluation.",{rowIndex:e}),this.logGroupEnd(`Row # ${i} (from ${o}) is checked`),e;if(this._debug._){const e=n.fitsCurrentWindow,t=e?"green":"orange",i=e?"<=":">";console.log(`%c📐 does row fit? %c ${e} %c :: ${n.nextMarker} ${i} ${this._currentTableSplitBottom} %c(Δ=${n.delta})`,"",`font-weight:bold;color:${t};`,"",`color:${t};`)}if(this._debug._&&console.info({row:n.row,rows:[...this._currentTableDistributedRows]}),n.fitsCurrentWindow)return this._debug._&&console.log(`%c ✓ Row # ${e}: PASS`,"color:green"),this.logGroupEnd(`Row # ${i} (from ${o}) is checked`),e;const r=this._node.calculateFinalPartReclaimedHeight({signpostHeight:this._signpostHeight,tfootHeight:this._currentTableTfootHeight});if(this._node.paginationCanAbsorbLastRow({evaluation:n,extraCapacity:r,splitBottom:this._currentTableSplitBottom,debug:this._debug}))return this._debug._&&console.log("🫟 last-row-fits-without-bottom-signpost: skip split"),this.logGroupEnd(`Row # ${i} (from ${o}) is checked`),e;const s=this._resolveOverflowingRow({evaluation:n,splitStartRowIndexes:t,extraCapacity:r});return this.logGroupEnd(`Row # ${i} (from ${o}) is checked`),s}_resolveOverflowingRow({evaluation:e,splitStartRowIndexes:t,extraCapacity:i}){return this._node.paginationResolveOverflowingRow({evaluation:e,utils:{rowHasSpan:e=>this._rowHasSpan(e),isSlice:e=>this._node.isSlice(e)},handlers:{handleRowWithRowspan:()=>this._node.paginationResolveRowWithRowspan({evaluation:e,splitStartRowIndexes:t,fullPageHeight:this._currentTableFullPartContentHeight,resolveOverflow:({evaluation:e,splitStartRowIndexes:t,availableRowHeight:i,fullPageHeight:o})=>this._forwardOverflowFallback({rowIndex:e.rowIndex,row:e.row,availableRowHeight:i,fullPageHeight:o,splitStartRowIndexes:t,reasonTail:"Row with ROWSPAN — move to next page",reasonFull:"Row with ROWSPAN — scaled TDs to full page",branch:"rowspan"}),debug:this._debug,afterResolve:({tailWindowHeight:e,fullPageHeight:t})=>{this._debug._&&e>=t&&console.warn("[table.fallback] ROWSPAN row required full-page scaling to fit.")}}),handleSplittableRow:()=>this._resolveSplittableRow({evaluation:e,splitStartRowIndexes:t,extraCapacity:i}),handleAlreadySlicedRow:()=>this._node.paginationResolveAlreadySlicedRow({evaluation:e,splitStartRowIndexes:t,fullPageHeight:this._currentTableFullPartContentHeight,debug:this._debug,resolveSplitFailure:({evaluation:e,splitStartRowIndexes:t,availableRowHeight:i,fullPageHeight:o})=>this._forwardOverflowFallback({rowIndex:e.rowIndex,row:e.row,availableRowHeight:i,fullPageHeight:o,splitStartRowIndexes:t,reasonTail:"Slice doesn't fit tail — move to next page",reasonFull:"Scaled TD content to fit full page",branch:"alreadySliced"})})}})}_resolveSplittableRow({evaluation:e,splitStartRowIndexes:t,extraCapacity:i}){const{rowIndex:o}=e;this._debug._&&console.group(`%c 🔳 Try to split the ROW ${o} %c (from ${this._currentTableDistributedRows.length})`,"color:magenta;","");const n=this._node.paginationResolveSplittableRow({evaluation:e,splitStartRowIndexes:t,extraCapacity:i,fullPageHeight:this._currentTableFullPartContentHeight,minPartLines:this._minPartLines,debug:this._debug,decorateRowSlice:({rowWrapper:e,rowIndex:t,sliceIndex:i})=>{this._DOM.setAttribute(e,`.splitted_row_${t}_part_${i}`)},onBudgetInfo:({evaluation:e,firstPartHeight:t,fullPartHeight:i})=>{this._debug._&&console.info({currRowTop:e.rowTop,"• splitBottom":this._currentTableSplitBottom,"• is row sliced?":!1,"remaining page space":e.tailWindowHeight,"first part height":t,"full part height":i})},handlers:{onReplaceRow:({evaluation:e,newRows:t})=>{this._replaceRowInDOM(e.row,t)},onAbsorbTail:({newRows:e,extraCapacity:t})=>{this._node.absorbShortTrailingSliceIfFits({slices:e,extraCapacity:t,ownerLabel:"table",debug:this._debug})},onRefreshRows:({evaluation:e,newRows:t})=>{this._node.paginationRefreshRowsAfterSplit(this._getSplitterAdapter(),{rowIndex:e.rowIndex,rowSlices:t})},onPlacement:({evaluation:e,newRows:i,insufficientRemainingWindow:o,isFirstPartEmptyInAnyTD:n,needsScalingInFullPage:r})=>this._node.paginationHandleRowSlicesPlacement({evaluation:e,table:this._currentTable,newRows:i,insufficientRemainingWindow:o,isFirstPartEmptyInAnyTD:n,needsScalingInFullPage:r,splitStartRowIndexes:t,pageBottom:this._currentTableSplitBottom,fullPageHeight:this._currentTableFullPartContentHeight,debug:this._debug,registerPageStartCallback:({targetIndex:e,reason:i})=>this._registerPageStartAt(e,t,i),scaleProblematicSliceCallback:(e,t)=>{t>0&&(this._debug._&&console.log("⚖️ scaleProblematicCellsToHeight"),this._scaleProblematicCellsToHeight(e,t,this._getRowShellHeights(e)))},applyFullPageScalingCallback:({row:e,needsScalingInFullPage:t,fullPageHeight:i})=>{this._node.paginationApplyFullPageScaling({needsScalingInFullPage:t&&Boolean(e),payload:{row:e,targetHeight:i},scaleCallback:({row:e,targetHeight:t})=>(this._debug._&&console.log("⚖️ scaleProblematicCellsToHeight"),this._scaleProblematicCellsToHeight(e,t,this._getRowShellHeights(e)))})}}),onSplitFailure:({evaluation:e,splitStartRowIndexes:t,availableRowHeight:i,fullPageHeight:o})=>this._forwardOverflowFallback({rowIndex:e.rowIndex,row:e.row,availableRowHeight:i,fullPageHeight:o,splitStartRowIndexes:t,reasonTail:"Split failed — move row to next page",reasonFull:"Scaled TDs to fit full-page",branch:"splitFailure"})}});return this.logGroupEnd(`🔳 Try to split the ROW ${o} (from ${this._currentTableDistributedRows.length})`),n}_collectCurrentTableEntries(){this._currentTableEntries=this._node.getTableEntries(this._currentTable)}_rowHasSpan(e){const t=[...this._DOM.getChildren(e)];for(const e of t){const t=this._DOM.getElementTagName(e);if("TD"!==t&&"TH"!==t)continue;const i=parseInt(e.getAttribute("rowspan"));if(Number.isFinite(i)&&i>1)return!0}return!1}_collectCurrentTableMetrics(){const e=this._node.getEmptyNodeHeightByProbe(this._currentTable,'',!1),t=this._node.getTopForPageStartCandidate(this._currentTable,this._currentRoot),i=(this._node.getTopWithMargin(this._currentTable,this._currentRoot),this._DOM.getElementOffsetHeight(this._currentTableEntries.caption)||0),o=this._DOM.getElementOffsetTop(this._currentTableDistributedRows[0],this._currentTable)-i||0;this._currentTableTfootHeight=this._DOM.getElementOffsetHeight(this._currentTableEntries.tfoot)||0,this._currentTableFirstPartContentBottom=this._currentFirstPageBottom-t-e-this._signpostHeight,this._currentTableFullPartContentHeight=this._currentFullPageHeight-i-o-this._currentTableTfootHeight-e-2*this._signpostHeight}_getDistributedRows(e){return[...e.rows,...e.tfoot?[e.tfoot]:[]]}_updateCurrentTableDistributedRows(){this._currentTableDistributedRows=this._getDistributedRows(this._currentTableEntries)}_analyzeCurrentTableStructure(){this._currentTableEntries;const e=this._currentTableDistributedRows||[],t=this._node.computeRowFlags({rows:e,DOM:this._DOM,cellTagFilter:(e,t)=>"TFOOT"!==this._DOM.getElementTagName(t.parentNode)&&("TD"===e||"TH"===e)});this._currentTableHasRowspan=t.hasRowspan,this._currentTableHasColspan=t.hasColspan,this._currentTableInconsistentCells=t.inconsistentCells,this._debug._&&(t.hasRowspan&&console.warn("[table.guard] ROWSPAN detected — slicing not implemented; applying conservative fallback.",{table:this._currentTable}),t.hasColspan&&console.warn("[table.guard] COLSPAN present — handled within-row slicing; monitor results.",{table:this._currentTable}),t.inconsistentCells&&console.warn("[table.guard] Inconsistent cell counts across rows — results may vary.",{table:this._currentTable}))}_updateCurrentTableEntriesAfterSplit(e,t){this._currentTableEntries.rows.splice(e,1,...t)}_setCurrentTableFirstSplitBottom(){this._node.getTop(this._currentTableDistributedRows[0],this._currentTable)>this._currentTableSplitBottom?(this._updateCurrentTableSplitBottom(this._currentTableFullPartContentHeight,"SPECIAL CASE: start immediately from the full height of the page"),this._debug._&&console.log("The Row 0 goes to the 2nd page")):this._updateCurrentTableSplitBottom(this._currentTableFirstPartContentBottom,"start with a short first part")}_getPaginatorAdapter(){return{label:"table",getSplitBottom:()=>this._currentTableSplitBottom,setSplitBottom:e=>{this._currentTableSplitBottom=e},computeSplitBottomForElement:e=>this._node.getTop(e,this._currentTable)+this._currentTableFullPartContentHeight,getRows:()=>this._currentTableDistributedRows,shouldAssert:()=>this._assert,getDebug:()=>this._debug,getSplitBottomLog:()=>this._logSplitBottom_}}_getSplitterAdapter(){const e=()=>({rows:this._currentTableDistributedRows||[],DOM:this._DOM,cellTagFilter:(e,t)=>{const i=t?.parentNode;return"TFOOT"!==(i?this._DOM.getElementTagName(i):void 0)&&("TD"===e||"TH"===e)}});return{label:"table",rows:{getCurrentRows:()=>this._currentTableDistributedRows||[],replaceRow:({rowIndex:e,rowSlices:t})=>{this._node.applyRowSlicesToEntriesAfterRowSplit(this._currentTableEntries,e,t)},syncEntries:()=>{this._updateCurrentTableDistributedRows(),this._currentTableRecordedParts&&(this._currentTableRecordedParts.currentRows=this._currentTableDistributedRows)},getGuardConfig:e,onRowsChanged:()=>{this._currentTableRecordedParts&&(this._currentTableRecordedParts.currentRows=this._currentTableDistributedRows)}},guards:{getConfig:e,onFlags:({flags:e})=>{e&&(this._currentTableHasRowspan=Boolean(e.hasRowspan),this._currentTableHasColspan=Boolean(e.hasColspan),this._currentTableInconsistentCells=Boolean(e.inconsistentCells))}}}}_updateCurrentTableSplitBottom(e,t="unknown case"){Go(this._getPaginatorAdapter(),e,t)}_registerPageStartAt(e,t,i="register page start"){Wo(this._getPaginatorAdapter(),e,t,i)}_composeOverflowHelpers(){const e=this._node.scaleCellsToHeight.bind(this._node),t=this._getRowShellHeights.bind(this),i={ownerLabel:"table",registerPageStartCallback:this._registerPageStartAt.bind(this),debugLogger:this._debug&&this._debug._?(e,t)=>console.log(e,t):void 0,scaleProblematicCellsCallback:(i,o,n)=>this._node.scaleRowCellsToHeight({ownerLabel:"table",DOM:this._DOM,row:i,targetHeight:o,cachedShells:n,getRowShellHeightsCallback:t,scaleCellsToHeightCallback:e})};return this._currentOverflowHelpers=i,i}_scaleProblematicCellsToHeight(e,t,i){return(this._currentOverflowHelpers||this._composeOverflowHelpers()).scaleProblematicCellsCallback(e,t,i)}_forwardOverflowFallback({rowIndex:e,row:t,availableRowHeight:i,fullPageHeight:o,splitStartRowIndexes:n,reasonTail:r,reasonFull:s,branch:a}){const l=this._currentOverflowHelpers||this._composeOverflowHelpers(),h={ownerLabel:`table:${a}`,rowIndex:e,row:t,availableRowHeight:i,fullPageHeight:o,splitStartRowIndexes:n,reasonTail:r,reasonFull:s,registerPageStartCallback:l.registerPageStartCallback,scaleProblematicCellsCallback:l.scaleProblematicCellsCallback,debugLogger:l.debugLogger};return this._debug._&&console.log(`%c[table.overflow] branch=${a} rowIndex=${e} tail=${i} full=${o}`,"color:orange; font-weight:bold",{reasonTail:r,reasonFull:s}),"splitFailure"===a?this._node.handleRowSplitFailure(h):this._node.handleRowOverflow(h)}_getRowShellHeights(e){if(!this._currentRowShellCache)return this._node.getTableRowShellHeightByTD(e);if(this._currentRowShellCache.has(e))return this._currentRowShellCache.get(e);const t=this._node.getTableRowShellHeightByTD(e);return this._currentRowShellCache.set(e,t),t}_createTableSlice({startId:e,endId:t,table:i,tableEntries:o}){this._debug._&&console.group(`[CREATE Table Slice] range: [${e}, ${t})`),this.strictAssert(Number.isInteger(e)&&(Number.isInteger(t)||t===1/0),`[createTableSlice] invalid bounds: startId=${e}, endId=${t}`);const n=o&&o.rows?o.rows.length:0;this.strictAssert(n>=0,`[createTableSlice]: invalid rows length: ${n}`),this.strictAssert(e>0&&t>0&&ethis._createTableSlice({startId:e,endId:o===n.length-1?1/0:n[o+1],table:t,tableEntries:i}))}_extendTableSlices(e){return e.reduce((e,t,i,o)=>{const n=0===i,r=i===o.length-1;return n&&e.push(this._createBottomSignpost()),e.push(this._node.createForcedPageBreak()),e.push(this._createTopSignpost()),e.push(t),!r&&e.push(this._createBottomSignpost()),e},[])}_createTopSignpost(){return this._node.createSignpost("(table continued)",this._signpostHeight)}_createBottomSignpost(){return this._node.createSignpost("(table continues on the next page)",this._signpostHeight)}_replaceRowInDOM(e,t){this._debug._&&this._DOM.setAttribute(e,".🚫_must_be_removed"),this._DOM.insertInsteadOf(e,...t)}}class Ko{constructor({config:e,DOM:t,node:i,selector:o}){this._debug=e.debugMode?{...e.debugConfig.tableLike}:{},this._DOM=t,this._selector=o,this._node=i,this._minLeftLines=2,this._minDanglingLines=2,this._minBreakableLines=this._minLeftLines+this._minDanglingLines,this._minLeftRows=1,this._minDanglingRows=1,this._minBreakableRows=1,this._minPreFirstBlockLines=3,this._minPreLastBlockLines=3,this._minPreBreakableLines=this._minPreFirstBlockLines+this._minPreLastBlockLines,this._minBreakableGridRows=4,this._imageReductionRatio=.8,this._signpostHeight=parseFloat(e.splitLabelHeight)||0}split(e,t,i,o,n){const r=n||this._DOM.getComputedStyle(e);this._debug._&&console.log("root",o);const s=this._node.getPreparedChildren(e),a=this._node.getTop(e,o),l=this._node.getEmptyNodeHeightByProbe(e),h=i-l;let c=s,d=0,g=[],u=t-a-l;const p=r.position;"relative"!=p&&this._DOM.setStyles(e,{position:"relative"});for(let t=0;tu&&(t&&g.push(t),t&&(d+=1),u=t?this._node.getTop(i,e)+h:h)}if(this._DOM.setStyles(e,{position:p}),!g.length)return this._debug._&&console.log("splitters.length",g.length),[];g.push(null);const _=g.map((t,i,o)=>{const n=this._node.createSliceWrapper(e),r=o[i-1]||0,s=t||o[o.length];return this._DOM.insertAtEnd(n,...c.slice(r,s)),n});return this._node.markSliceCuts(_),this._DOM.replaceNodeContentsWith(e,..._),this._DOM.removeAllClasses(e),this._DOM.removeAllStyles(e),this._DOM.setStyles(e,{display:"contents"}),this._DOM.setAttribute(e,"[slough-node]",""),_}}class Uo{constructor({config:e,DOM:t,node:o,selector:n}){this._debug=e.debugMode?{...e.debugConfig.grid}:{},this._assert=!!e.consoleAssert,Object.assign(this,i),this._DOM=t,this._selector=n,this._node=o,this._resetCurrent(),this._minBreakableGridRows=1,this._minGridRowContentLines=2,this._gridCellLineHeightCache=new WeakMap,this._gridComputedStyleCache=new WeakMap,this._signpostHeight=parseFloat(e.splitLabelHeight)||0}split(e,t,i,o,n){this._resetCurrent(),this._debug._&&console.group("%c split Grid Node","background:#00FFFF",e);const r=this._node.getPreparedChildren(e);this._node.lockNodesWidths(r);const s=n||this._getComputedStyleCached(e);if(!r.length)return this._node.setInitStyle(!1,e,s),this._debug._&&console.groupEnd(),[];this._node.setInitStyle(!0,e,s);const a=this._scanGridLayout(e,s);if(!a.safe)return this._debug._&&console.warn("[grid.split] skip unsafe layout",a),this._debug._&&console.warn("[grid.split] Unsupported grid layout detected; keeping original grid intact.",a),this._node.setInitStyle(!1,e,s),this._debug._&&console.groupEnd(),[];const l=[];let h=!1,c=!1;const d=new Set;let g=null,u=null,p=null;r.forEach(t=>{const i=this._getComputedStyleCached(t),o=parseInt(i.gridRowStart,10),n=Number.isFinite(o),r=this._node.getTop(t,e),s=this._node.getBottom(t,e);let a=!1;a=!l.length||(n&&null!=g?o!==g:null!=p?r>=p-.5:null==u||Math.abs(r-u)>.5),a?(l.push([t]),g=n?o:null,u=r,p=s):(l[l.length-1].push(t),n&&null==g&&(g=o),(null==u||rp)&&(p=s));const _=i.gridRowEnd||"",f=i.gridColumnEnd||"";h=h||_.includes("span"),c=c||f.includes("span"),n&&d.add(o)});const _=d.size>0&&Math.max(...d)>l.length;if(_)return this._debug._&&console.warn("[grid.split]","Unsupported implicit row gap detected; keeping grid unsplit.",{hasImplicitRowGaps:_}),this._node.setInitStyle(!1,e,s),this._debug._&&console.groupEnd(),[];if(h||c)return this._debug._&&console.warn("[grid.split]","Grid contains row/column spans; using fallback (move row to next page).",{hasRowSpan:h,hasColumnSpan:c}),this._debug._&&console.groupEnd(),this._fallbackMoveGridToNextPage({gridNode:e,nodeComputedStyle:s});this.log("grid.split","currentRows:",l);const f=this._node.getTop(e,o),m=this._node.getEmptyNodeHeightByProbe(e),b=t-f-m,w=i-m;if(this.log("grid.split",{firstPartHeight:b,fullPagePartHeight:w}),this._currentGridNode=e,this._currentGridRows=l,this._currentGridFullPartHeight=w,this._currentGridSplitLog=[],this._currentGridEntries=jo({owner:e,currentRows:l}),this._currentGridRecordedParts=this._currentGridEntries,this._currentGridNode.__html2pdf4docRecordedParts=this._currentGridRecordedParts,this._currentGridShellCache=new WeakMap,l.length0?Math.floor(t):1;let n=0;return()=>{if(n+=1,n<=o)return;const t={label:e,iterations:n,limit:o};throw i&&console.assert(!1,`\n\n ⛔ [${e}] ♾️ loop guard triggered`,t),new Error(`\n ⛔ [${e}] ♾️ loop guard triggered`)}}({label:"grid.split",limit:Math.max(1,6*(l.length||1)),assert:this._assert});this._updateCurrentGridSplitBottom(b,"start with initial window");for(let t=0;tthis._buildGridSplit({startId:o[i-1]||0,endId:t,node:e,entries:M})).filter(Boolean).map(e=>e.part),this._createAndInsertGridFinalSlice({node:e,entries:M,startId:y})];return this.log("grid.split",{splitStartRowIndexes:S,splits:C,recordedParts:this._currentGridRecordedParts?.parts}),this._node.setInitStyle(!1,e,s),this._resetCurrent(),this.logGroupEnd("split Grid Node"),C}_fallbackMoveGridToNextPage({gridNode:e,nodeComputedStyle:t}){return this._node.setInitStyle(!1,e,t),this._resetCurrent(),[]}_resetCurrent(){this._currentGridNode=void 0,this._currentGridRows=void 0,this._currentGridEntries=void 0,this._currentGridRecordedParts=void 0,this._currentGridSplitBottom=void 0,this._currentGridFullPartHeight=void 0,this._currentGridSplitLog=void 0,this._currentGridRowFlags=void 0,this._currentGridShellCache=void 0,this._gridCellLineHeightCache=new WeakMap,this._gridComputedStyleCache=new WeakMap}_getGridSplittableHandlers({evaluation:e,splitStartRowIndexes:t}){return{getRowSliceAdapter:({row:t})=>this._createGridRowSliceAdapter({row:t,rowIndex:e.rowIndex}),onReplaceRow:({newRows:t})=>{this._removeOriginalGridRowCells(e.row),this._node.paginationRefreshRowsAfterSplit(this._getSplitterAdapter(),{rowIndex:e.rowIndex,rowSlices:t})},onAbsorbTail:()=>{},onRefreshRows:({newRows:t})=>{this._node.paginationRefreshRowsAfterSplit(this._getSplitterAdapter(),{rowIndex:e.rowIndex,rowSlices:t})},onPlacement:({evaluation:e,newRows:i,insufficientRemainingWindow:o,isFirstPartEmptyInAnyTD:n,needsScalingInFullPage:r})=>this._node.paginationHandleRowSlicesPlacement({evaluation:e,table:this._currentGridNode,newRows:i,insufficientRemainingWindow:o,isFirstPartEmptyInAnyTD:n,needsScalingInFullPage:r,splitStartRowIndexes:t,pageBottom:this._currentGridSplitBottom,fullPageHeight:this._currentGridFullPartHeight,debug:this._debug,resolveRowBounds:e=>this._getRowBounds(e,this._currentGridNode),registerPageStartCallback:({targetIndex:e,reason:i})=>this._registerPageStartAt(e,t,i),scaleProblematicSliceCallback:(e,t)=>this._scaleGridCellsToHeight(e,t),applyFullPageScalingCallback:({row:e,needsScalingInFullPage:t,fullPageHeight:i})=>{this._node.paginationApplyFullPageScaling({needsScalingInFullPage:t&&Boolean(e),payload:{cells:e,targetHeight:i},scaleCallback:({cells:e,targetHeight:t})=>this._scaleGridCellsToHeight(e,t)})}}),onSplitFailure:({evaluation:e,splitStartRowIndexes:t,availableRowHeight:i,fullPageHeight:o})=>this._forwardGridOverflowFallback({evaluation:e,splitStartRowIndexes:t,availableRowHeight:i,fullPageHeight:o,branch:"splitFailure"})}}_forwardGridOverflowFallback({evaluation:e,splitStartRowIndexes:t,availableRowHeight:i,fullPageHeight:o=this._currentGridFullPartHeight,branch:n,reasonTail:r,reasonFull:s}){const a=this._composeGridOverflowHelpers(),l={ownerLabel:`grid:${n}`,gridNode:this._currentGridNode,evaluation:e,rowIndex:e.rowIndex,row:e.row,availableRowHeight:i,fullPageHeight:o,splitStartRowIndexes:t,reasonTail:r||("splitFailure"===n?"Grid split failed — move row to next page":"Grid slice overflow — move row to next page"),reasonFull:s||("splitFailure"===n?"Grid split failed — scaled cells to full page":"Grid slice overflow — scaled cells to full page"),registerPageStartCallback:a.registerPageStartCallback,scaleProblematicCellsCallback:a.scaleProblematicCellsCallback,debugLogger:a.debugLogger};return this._debug._&&console.log("[grid.overflow]",n,l),"splitFailure"===n?this._node.handleRowSplitFailure(l):this._node.handleRowOverflow(l)}_buildGridRowEvaluation({rows:e,rowIndex:t,gridNode:i,splitBottom:o}){if(!Array.isArray(e))return null;const n=e[t];if(!n)return null;const r=Array.isArray(n)?new Array(n.length):null,{top:s,bottom:a}=this._getRowBounds(n,i),l=e[t+1],h=l?this._getRowTop(l,i):a,c=h-o;return{rowIndex:t,row:n,rowTop:s,rowBottom:a,nextMarker:h,delta:c,tailWindowHeight:o-s,isLastRow:!l,fitsCurrentWindow:c<=0,cellStyles:r}}_composeGridOverflowHelpers(){return{registerPageStartCallback:this._registerPageStartAt.bind(this),scaleProblematicCellsCallback:(e,t)=>!!Array.isArray(e)&&this._scaleGridCellsToHeight(e,t),debugLogger:this._debug&&this._debug._?(e,t)=>console.log(e,t):void 0}}_resolveGridOverflowingRow({evaluation:e,splitStartRowIndexes:t}){return this._node.paginationResolveOverflowingRow({evaluation:e,utils:{rowHasSpan:()=>!1,isSlice:e=>this._isGridRowSlice(e)},handlers:{handleRowWithRowspan:()=>(this._debug._&&console.warn("[grid.split] ROWSPAN guard triggered unexpectedly.",{evaluation:e}),this._registerPageStartAt(e.rowIndex,t,"Grid ROWSPAN fallback — move row to next page"),e.rowIndex-1),handleSplittableRow:()=>this._resolveGridSplittableRow({evaluation:e,splitStartRowIndexes:t}),handleAlreadySlicedRow:()=>this._forwardGridOverflowFallback({evaluation:e,splitStartRowIndexes:t,branch:"alreadySliced"})}})}_resolveGridSplittableRow({evaluation:e,splitStartRowIndexes:t}){const{rowIndex:i}=e;this._debug._&&console.group("%c[grid.split] Stage5 — splittable row","color:#0080ff",{rowIndex:i,row:e.row,tailWindowHeight:e.tailWindowHeight});const o=this._estimateGridRowMeaningfulSpace({row:e.row,cellStyles:e.cellStyles,minContentLines:this._minGridRowContentLines});if(!(o>0))return console.warn("[grid.metrics] Meaningful row space is unavailable; falling back to overflow handler."),this._forwardGridOverflowFallback({evaluation:e,splitStartRowIndexes:t,availableRowHeight:e.tailWindowHeight,fullPageHeight:this._currentGridFullPartHeight,branch:"metricsMissing",reasonTail:"Grid row metrics missing — move row to next page",reasonFull:"Grid row metrics missing — scaled cells to full page"});const n=this._node.paginationCalculateRowSplitBudget({tailWindowHeight:e.tailWindowHeight,minMeaningfulRowSpace:o,fullPartHeight:this._currentGridFullPartHeight,debug:this._debug}),r=this._node.paginationSplitRow({rowIndex:i,row:e.row,firstPartHeight:n.firstPartHeight,fullPageHeight:this._currentGridFullPartHeight,debug:this._debug,decorateRowSlice:({rowWrapper:e,rowIndex:t,sliceIndex:i})=>{e instanceof HTMLElement&&this._DOM.setAttribute(e,`.grid_row_${t}_part_${i}`)},rowAdapter:this._createGridRowSliceAdapter({row:e.row,rowIndex:i,cellStyles:e.cellStyles})}),s=this._node.paginationProcessRowSplitResult({evaluation:e,splitResult:r,splitStartRowIndexes:t,insufficientRemainingWindow:n.insufficientRemainingWindow,extraCapacity:0,fullPageHeight:this._currentGridFullPartHeight,debug:this._debug,handlers:this._getGridSplittableHandlers({evaluation:e,splitStartRowIndexes:t})});return this.logGroupEnd("[grid.split] Stage5 — splittable row"),s}_createGridRowSliceAdapter({row:e,rowIndex:t,cellStyles:i}){if(!Array.isArray(e))return null;const o=this._currentGridNode,n=e[0]||null,r=this;return{getParentContainer:()=>o,getOriginalCells:()=>[...e],getShellHeights:()=>r._getGridShellHeights(e,i),markOriginalRow:({cells:e})=>{e.forEach(e=>r._node.markSlice(e))},beginRow:()=>({fragment:r._DOM.createDocumentFragment(),cells:[]}),cloneCellFallback:e=>r._DOM.cloneNodeWrapper(e),handleCell:({context:e,cellClone:t})=>{r._node.markSlice(t),e.fragment.append(t),e.cells.push(t)},finalizeRow:({context:e})=>(n&&r._DOM.insertBefore(n,e.fragment),e.cells)}}_removeOriginalGridRowCells(e){Array.isArray(e)&&e.forEach(e=>{e instanceof HTMLElement&&this._DOM.removeNode(e)})}_isGridRowSlice(e){if(Array.isArray(e)){const t=e.find(e=>e instanceof HTMLElement);return!!t&&this._node.isSlice(t)}return!!e&&this._node.isSlice(e)}_getPaginatorAdapter(){return{label:"grid",getSplitBottom:()=>this._currentGridSplitBottom,setSplitBottom:e=>{this._currentGridSplitBottom=e},computeSplitBottomForElement:e=>e&&this._currentGridNode?this._node.getTop(e,this._currentGridNode)+(this._currentGridFullPartHeight||0):this._currentGridSplitBottom||0,getRows:()=>Array.isArray(this._currentGridRows)?this._currentGridRows.map(e=>{if(!e)return null;if(e instanceof HTMLElement)return e;if(Array.isArray(e)){const t=e.find(e=>e instanceof HTMLElement);if(t)return t;const i=this._getRowTop(e,this._currentGridNode);return Number.isFinite(i)?i:null}const t=this._getRowTop(e,this._currentGridNode);return Number.isFinite(t)?t:null}):[],shouldAssert:()=>this._assert,getDebug:()=>this._debug,getSplitBottomLog:()=>this._currentGridSplitLog}}_getSplitterAdapter(){return{label:"grid",rows:{getCurrentRows:()=>this._currentGridRows||[],replaceRow:({rowIndex:e,rowSlices:t})=>{Array.isArray(this._currentGridRows)&&this._node.replaceCurrentRowsAfterRowSplit({currentRows:this._currentGridRows,index:e,rowSlices:t})},syncEntries:()=>{this._currentGridEntries&&(this._currentGridEntries.currentRows=this._currentGridRows),this._currentGridRecordedParts&&(this._currentGridRecordedParts.currentRows=this._currentGridRows)},getGuardConfig:()=>({rows:this._currentGridRows||[],DOM:this._DOM})},guards:{onFlags:({flags:e})=>{this._currentGridRowFlags=e}}}}_updateCurrentGridSplitBottom(e,t="unknown case"){Go(this._getPaginatorAdapter(),e,t)}_registerPageStartAt(e,t,i="register page start"){Wo(this._getPaginatorAdapter(),e,t,i)}_scaleGridCellsToHeight(e,t){if(!(Array.isArray(e)&&e.length&&t>0))return!1;const i=this._getGridShellHeights(e),o=this._debug._?e.map(e=>this._DOM.getElementOffsetHeight(e)):null,n=this._node.paginationScaleCellsToHeight({cells:e,targetHeight:t,shells:i});if(this._debug._){const r=e.map(e=>this._DOM.getElementOffsetHeight(e));console.log("[grid.scaleCells] target:",t,"shells:",i,"before:",o,"after:",r,"scaled:",n)}return n}_buildGridSplit({startId:e,endId:t,node:i,entries:o}){const n=o?.currentRows||this._currentGridRows||[];if(e===t)return this._debug._&&console.warn("[grid.split] _buildGridSplit: skip empty slice request",e,t),this.strictAssert(!1,"[grid.split] _buildGridSplit: empty slice encountered"),null;if(this._debug._){const i=n.slice(e,t);console.log(`=> [grid.split] _buildGridSplit: slice rows [${e}, ${t})`,i)}const r=this._createAndInsertGridSlice({startId:e,endId:t,node:i,entries:o}),s=this._collectGridTelemetryRows(n,e,t);return this._recordGridPart(r,{startId:e,endId:t,type:"slice",rows:s}),{part:r,telemetryRows:s}}_createAndInsertGridSlice({startId:e,endId:t,node:i,entries:o}){const n=this._DOM.cloneNodeWrapper(i);this._node.copyNodeWidth(n,i),this._node.markNoBreak(n),e&&this._node.markTopCut(n),this._node.markBottomCut(n),i.before(n);const r=o?.currentRows||fallbackCurrentRows||[],s=this&&this._DOM&&"function"==typeof this._DOM.isElementNode?this._DOM.isElementNode.bind(this._DOM):null,a=r.slice(e,t).flat().map(e=>{if(!e)return null;if(s&&s(e))return e;if("undefined"!=typeof HTMLElement&&e instanceof HTMLElement)return e;const t=e.element;if(t){if(s&&s(t))return t;if("undefined"!=typeof HTMLElement&&t instanceof HTMLElement)return t}return null}).filter(Boolean);return this._DOM.insertAtEnd(n,...a),n}_createAndInsertGridFinalSlice({node:e,entries:t,startId:i}){const o=e;this._node.markTopCut(o),this._node.markNoBreak(o);const n=t?.currentRows||this._currentGridRows||[],r=this._collectGridTelemetryRows(n,i);return this._recordGridPart(o,{startId:i,endId:n.length,type:"final",rows:r}),o}_collectGridTelemetryRows(e,t,i){if(!Array.isArray(e))return[];return e.slice(t,"number"==typeof i?i:void 0).map((e,i)=>{const o=Array.isArray(e)?[...e]:[e];return{rowIndex:t+i,row:e,cells:o}})}_recordGridPart(e,t={}){const i=this._currentGridRecordedParts;if(!i||!e)return null;const{startId:o=null,endId:n=null,type:r="unknown",rows:s=[],meta:a}=t||{};return zo({entries:i,part:e,startIndex:o,endIndex:n,type:r,rows:s,meta:a})}_estimateGridRowMeaningfulSpace({row:e,cellStyles:t=null,minContentLines:i=this._minGridRowContentLines}){if(!Array.isArray(e)||0===e.length)return console.warn("[grid.metrics] Row payload missing while estimating split budget."),null;const o=this._getGridShellHeights(e,t),n=Array.isArray(t)?t:null,r=Math.max(1,i);let s=0;return e.forEach((e,t)=>{if(!(e instanceof HTMLElement))return void console.warn("[grid.metrics] Unexpected non-element cell in row; ignoring during split budget calculation.",{cell:e,index:t});let i=n?n[t]:null;i||(i=this._getComputedStyleCached(e),n&&(n[t]=i));const a=this._resolveGridCellLineHeight({cell:e,style:i}),l=(o?.[t]||0)+a*r;s=Math.max(s,l)}),s>0?s:(console.warn("[grid.metrics] Failed to measure meaningful row space."),null)}_resolveGridCellLineHeight({cell:e,style:t}){const i=this._gridCellLineHeightCache,o=i?.get(e);if(o>0)return o;t||(console.warn("[grid.metrics] style not passed for _resolveGridCellLineHeight",{cell:e}),t=this._getComputedStyleCached(e));let n=parseFloat(t?.lineHeight);if(n>0)return i?.set(e,n),n;const r=parseFloat(t?.fontSize);if(Number.isFinite(r)&&r>0){const t=1.2*r;return i?.set(e,t),t}if(n=this._node.getLineHeight(e),n>0)return i?.set(e,n),n;return i?.set(e,16),16}_getGridShellHeights(e,t=null){if(this._currentGridShellCache||(this._currentGridShellCache=new WeakMap),this._currentGridShellCache.has(e))return this._currentGridShellCache.get(e);const i=Array.isArray(e)?e:[e].filter(Boolean),o=this._computeGridCellShellHeights(i,t);return this._currentGridShellCache.set(e,o),o}_getComputedStyleCached(e){if(!e)return console.warn("[grid.split] the element was not passed to _getComputedStyleCached"),null;const t=this._gridComputedStyleCache;if(!t)return this._DOM.getComputedStyle(e);const i=t.get(e);if(i)return i;const o=this._DOM.getComputedStyle(e);return t.set(e,o),o}_computeGridCellShellHeights(e,t=null){return Array.isArray(e)&&e.length?e.map((e,i)=>{if(!e)return 0;let o=null;t?(o=t[i],o||(o=this._getComputedStyleCached(e),t[i]=o)):o=this._getComputedStyleCached(e);const n=parseFloat(o?.paddingTop)||0,r=parseFloat(o?.paddingBottom)||0,s=parseFloat(o?.borderTopWidth)||0,a=parseFloat(o?.borderBottomWidth)||0,l=parseFloat(o?.marginTop)||0,h=parseFloat(o?.marginBottom)||0,c=n+r+s+a,d=Math.max(0,l)+Math.max(0,h),g=Math.max(0,c);return Math.max(0,g+d)}):[]}_getRowBounds(e,t,i="both"){return this._node.resolveRowBoundsGeneric(e,t,i)}_getRowTop(e,t){return this._getRowBounds(e,t,"top").top}_getRowBottom(e,t){return this._getRowBounds(e,t,"bottom").bottom}_scanGridLayout(e,t){const i=t.gridAutoFlow||"";if(!i.startsWith("row"))return{safe:!1,reason:`grid-auto-flow=${i}`};if(i.includes("dense"))return{safe:!1,reason:"grid-auto-flow dense not supported yet"};if("none"!==(t.gridTemplateAreas||"none"))return{safe:!1,reason:"grid-template-areas present"};const o=t.gridTemplateColumns||"",n=t.gridTemplateRows||"",r=e=>e.includes("subgrid")||e.includes("auto-fit")||e.includes("auto-fill")||e.includes("fit-content");if(r(o)||r(n))return{safe:!1,reason:"complex track sizing (subgrid/auto-fit/fit-content)"};return/\[.*?\]/.test(o)||/\[.*?\]/.test(n)?{safe:!1,reason:"named grid lines detected"}:{safe:!0}}}const qo="background:#999;color:#FFF;padding: 0 4px;";class Yo{constructor({config:e,DOM:t,node:o,selector:n}){this._debug=e.debugMode?{...e.debugConfig.pre}:{},this._assert=!!e.consoleAssert,Object.assign(this,i),this._DOM=t,this._selector=n,this._node=o,this._minPreFirstBlockLines=3,this._minPreLastBlockLines=3,this._minPreBreakableLines=this._minPreFirstBlockLines+this._minPreLastBlockLines,this._imageReductionRatio=.8,this._signpostHeight=parseFloat(e.splitLabelHeight)||0}_normalizeLinesInPlace(e){const t=e.splice(0,this._minPreFirstBlockLines).join(""),i=e.splice(-this._minPreLastBlockLines).join("");e.unshift(t),e.push(i)}_analyzeChildren(e){const t={},i=[...e].map(e=>{const i=this._DOM.getNodeType(e);return i===Node.TEXT_NODE?(t.text=!0,"text"):i===Node.ELEMENT_NODE?"BR"===this._DOM.getElementTagName(e)?(t.br=!0,"br"):this._node.isWrappedTextNode(e)?(t.wrappedText=!0,"wrappedText"):(t.node=!0,"node"):(t.other=!0,"other")});return{has:t,items:i}}split(e,t){this._debug._&&console.group("%c 🔲 PRE [split]","background:orange",{node:e});const i=()=>{this._debug._&&console.log("%c END 🔲 PRE [split]",qo),this._debug._&&console.groupEnd()},o=this._DOM.getChildNodes(e);if(this._debug._&&console.log("_children:",o.length,o),0==o.length)return this._debug._&&console.log("%c END _splitPreNode (not breakable)",qo),i(),[];let n=[];const r=this._analyzeChildren(o);if(this._debug._&&console.log("_childrenTypes:",r.items.length,r),this.strictAssert(!r.has.wrappedText,"Expected to be dealing with unprocessed PRE child nodes, but have wrappedText!",r),this.strictAssert(!(r.has.text&&r.has.wrappedText),"PRE children has text and wrappedText simultaneously",r),r.has.br&&this._debug._&&console.warn("PRE children has BR"),r.has.node){const t=this._DOM.getInnerHTML(e),i=this._node.splitTextByLinesGreedy(t);n.push(...i)}else for(const e of o){if(this._DOM.isTextNode(e)){const t=this._DOM.getNodeValue(e),i=this._node.splitTextByLinesGreedy(t);n.push(...i);continue}if(this._node.isWrappedTextNode(e)){const t=this._DOM.getInnerHTML(e),i=this._node.splitTextByLinesGreedy(t);n.push(...i);continue}}if(this._debug._&&console.log("_lines:",n),n.length{const t=this._node.createWithFlagNoBreak();return this._DOM.setInnerHTML(t,e),t});return this._debug._&&console.log("linesFromNode",s),this._DOM.replaceNodeContentsWith(e,...s),i(),s}slice(e,t,i,o,n){const r=n||this._DOM.getComputedStyle(e),s=["%c_SLICE PreNode\n","color:white"];this._debug._&&console.group("%c_✂️ slice PRE","background:cyan",{node:e,pageBottom:t,fullPageHeight:i});const a=()=>{this._debug._&&console.log("%c END ✂️ slice PRE",qo),this._debug._&&console.groupEnd()},l=e=>isNaN(parseFloat(e))?0:Math.ceil(parseFloat(e)),h=(l(r.marginTop),l(r.marginBottom),l(r.paddingTop)),c=l(r.paddingBottom),d=l(r.borderTopWidth),g=l(r.borderBottomWidth),u=l(r.lineHeight),p=this._node.getTop(e,o),_=h+c+d+g;if(this._DOM.getElementOffsetHeight(e)<_+u*this._minPreBreakableLines)return this._debug._&&console.log("%c END ✂️ slice (small node)",qo),a(),[];const f=this._DOM.getChildNodes(e);if(0==f.length)return this._debug._&&console.log("%c END ✂️ slice (not breakable)",qo),a(),[];if(f.length>1)return this._debug._&&console.log("%c END ✂️ slice TODO!",qo),a(),[];{if(this._DOM.isElementNode(f[0])){const e=f[0];return this._debug._&&console.warn("is Element Node",e),this._debug._&&console.log("%c END ✂️ slice ???????",qo),a(),[]}this._node.isWrappedTextNode(f[0])&&this._debug._&&console.warn(`is TEXT Node: ${f[0]}`);const o=f[0].wholeText,n=this._node.splitTextByLinesGreedy(o);if(n.length{const t=this._node.createWithFlagNoBreak();return this._DOM.setInnerHTML(t,e),t});this._debug._&&console.log("linesFromNode",c),this._DOM.replaceNodeContentsWith(e,...c);const u=0,m=u+d,b=u+g;let w=t-p-b-_; +}function ge(e,t){if(!(e instanceof HTMLElement))return;const i=t||this._DOM.getComputedStyle(e);return["block"].includes(i.display)&&["pre","pre-wrap","pre-line","break-spaces","nowrap"].includes(i.whiteSpace)}function ue(e,t){if(!(e instanceof HTMLElement))return;const i=t||this._DOM.getComputedStyle(e),o=i.display,n=i.gridAutoFlow;return("grid"===o||"inline-grid"===o)&&"row"===n}function pe(e,t){if(!(e instanceof HTMLElement))return;const i=t||this._DOM.getComputedStyle(e),o=i.display;if("flex"!==o&&"inline-flex"!==o)return!1;return(i.flexDirection||"").startsWith("row")}function _e(e,t){const i=!!t&&this.isInlineBlock(e,t);return this.isNoBreak(e)||this.isWrappedTextLine(e)||this.isWrappedTextGroup(e)||i||this.notSolved(e)}function fe(e,t){const i=t||this._DOM.getComputedStyle(e);return this.isTableNode(e,i)||this.isTableLikeNode(e,i)||this.isGridAutoFlowRow(e,i)}function me(e){return this._DOM.hasAttribute(e,"slough-node")}const be=W("selectorHeuristics");function we(e,t,i){const o=[],n=new Set;return be(this)&&console.group(i),e.forEach(e=>{const i=this._DOM.getAllElements(e,t),r=this.isHeuristicSelector(e);be(this)&&r&&console.log("🪄 [heuristic selector]",e,`\n${i.length} elements found`);for(const t of i)r&&!this.validateHeuristicSelectorMatch(t,e)||n.has(t)||(n.add(t),o.push(t))}),be(this)&&console.log(i,o.length?o:"has no elements"),be(this)&&console.groupEnd(i),o}function Se(e){return/:(only-child|first-child|last-child)\b/.test(e)}function Me(e,{allowWhitespaceText:t=!0,ignoreComments:i=!0}={}){const o=e&&e.parentNode;if(!o)return!1;for(let n=o.firstChild;n;n=n.nextSibling)if(n!==e){if(n.nodeType===Node.ELEMENT_NODE)return!1;if(n.nodeType!==Node.TEXT_NODE){if(n.nodeType===Node.COMMENT_NODE){if(i)continue;return!1}return!1}if(!t)return!1;if(n.nodeValue&&""!==n.nodeValue.trim())return!1}return!0}function ye(e){const t=e&&e.parentNode;if(!t)return!1;for(let i=t.firstChild;i&&i!==e;i=i.nextSibling){if(i.nodeType===Node.TEXT_NODE&&i.nodeValue&&""!==i.nodeValue.trim())return!0;if(i.nodeType!==Node.COMMENT_NODE&&i.nodeType!==Node.ELEMENT_NODE&&i.nodeType!==Node.TEXT_NODE&&i.nodeType!==Node.COMMENT_NODE)return!0}return!1}function Pe(e){const t=e&&e.parentNode;if(!t)return!1;let i=!1;for(let o=t.firstChild;o;o=o.nextSibling)if(i){if(o.nodeType===Node.TEXT_NODE&&o.nodeValue&&""!==o.nodeValue.trim())return!0;if(o.nodeType!==Node.COMMENT_NODE&&o.nodeType!==Node.ELEMENT_NODE&&o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE)return!0}else o===e&&(i=!0);return!1}function Ce(e,t){return/:only-child\b/.test(t)?this.hasNoSignificantSiblingNodes(e,{allowWhitespaceText:!0,ignoreComments:!0}):/:first-child\b/.test(t)?!this.hasSignificantLeadingText(e):!/:last-child\b/.test(t)||!this.hasSignificantTrailingText(e)}function Ee(e,t){return/:only-child\b/.test(t)?"has significant sibling nodes (text/elements)":/:first-child\b/.test(t)?"has significant leading text":/:last-child\b/.test(t)?"has significant trailing text":"failed heuristic validation"}function Te(e,t){return this.isHeuristicSelector(t)?e.filter(e=>this.validateHeuristicSelectorMatch(e,t)):e}function Oe(e,t=""){const i=this._DOM.getElement("head"),o=this._DOM.body;if(!i&&!o)return void console.error("Check the structure of your document. We didn`t find HEAD and BODY tags. HTML2PDF4DOC expects valid HTML.");const n=this.create("style",e);n?(this._DOM.setAttribute(n,this._selector.style,t),i?this._DOM.insertAtEnd(i,n):o?this._DOM.insertBefore(o,n):this.strictAssert(!1,"We expected to find the HEAD and BODY tags.")):console.error("Failed to create print styles")}const ve=W("positioning");function De(e,t){if(!e||!this._DOM.getParentNode(e))return!1;let i=e;for(;this._DOM.getParentNode(i)&&i!==t;){if(this._DOM.getFirstElementChild(this._DOM.getParentNode(i))!==i)return!1;i=this._DOM.getParentNode(i)}return i===t}function ke(e,t){if(!e||!this._DOM.getParentNode(e))return!1;let i=e;for(;this._DOM.getParentNode(i)&&i!==t;){if(this._DOM.getParentNode(i)===t){let e=this._DOM.getRightNeighbor(i);for(;!this._DOM.getElementOffsetHeight(e)&&!this._DOM.getElementOffsetWidth(e);)if(e=this._DOM.getRightNeighbor(e),this.isContentFlowEnd(e))return!0;return this.isContentFlowEnd(e)}if(this._DOM.getLastElementChild(this._DOM.getParentNode(i))!==i)return!1;i=this._DOM.getParentNode(i)}return i===t}function Re(e,t){const i=this._DOM.getElementOffsetBottom(e),o=this._DOM.getElementOffsetTop(t),n=o-i,r=n>-2;return ve(this)&&console.log("%c isVerticalDrop?","font-weight:bold",r,"\n delta",n,"\n firstBottom",i,[e],"\n secondTop",o,[t]),r}function Ne(e,t,i){const o="[init-position]",n="[init-vertical-align]",r="relative",s=i||this._DOM.getComputedStyle(t),a=s.position,l=s.verticalAlign;if(e)a!=r&&(this._DOM.setStyles(t,{position:r}),this._DOM.setAttribute(t,o,a)),"top"!=l&&(this._DOM.setStyles(t,{"vertical-align":"top"}),this._DOM.setAttribute(t,n,l));else{const e=this._DOM.getAttribute(t,o),i=this._DOM.getAttribute(t,n);e&&(this._DOM.setStyles(t,{position:e}),this._DOM.removeAttribute(t,o)),i&&(this._DOM.setStyles(t,{"vertical-align":i}),this._DOM.removeAttribute(t,n))}}function xe(e,{prefer:t="self"}={}){if(!e)return null;const i=e=>"last"===t?this._DOM.getLastElementChild(e):"first"===t||"self"===t?this._DOM.getFirstElementChild(e):null,o=new Set;let n=e;for(;n&&!o.has(n);){o.add(n);if(this._DOM.getElementOffsetParent(n))return n;const e=this._DOM.getComputedStyle(n);if(!e)return null;if(this.shouldSkipFlowElement(n,{context:"resolveFlowElement",computedStyle:e}))return null;if("contents"===e.display){const e=i.call(this,n);if(!e)return null;n=e;continue}return null}return null}const Be=W("getters");function Fe(e,t){const i=this.getPageStartTopInfo(e,t);return i?.top}function Ae(e,t){if(!e)return;const i=this._DOM.getComputedStyle(e),o="contents"===i?.display,n=!o&&this.isInline(e,i);if(o||n){let i=this.resolveReplacedElement?.(e,{prefer:"first"});if(!i){const t=this.getFlowChildren?.(e)||[];1===t.length&&(i=t[0])}if(i&&i!==e){const o=this.getTop(i,t),n=this.getTop(e,t);if(void 0!==o&&void 0!==n)return{top:Math.min(o,n),anchor:i};if(void 0!==o)return{top:o,anchor:i}}}return{top:this.getTop(e,t),anchor:null}}function He(e,t,i){const o=i||this._DOM.getComputedStyle(t),n=parseFloat(o.paddingTop)||0;return this.getTop(e,t)-n}function Ie(e,t,i){const o=i||this._DOM.getComputedStyle(t),n=parseFloat(o.paddingTop)||0;return this.getBottomWithMargin(e,t)-n}function Le(e,t=null,i=0,o=null,n=[],r=null){if(!e)return void(Be(this)&&console.warn("[getTop] element must be provided, but was received:",e,"\nThe function returned:",void 0));if(!(e instanceof HTMLElement))return void this.strictAssert(0,"[getTop] element must be HTMLElement, but was received:",e,"\nThe function returned:",void 0);if(null===t)return this._DOM.getElementOffsetTop(e);if(!(t instanceof HTMLElement))return void this.strictAssert(0,"[getTop] root must be HTMLElement, but was received:",t,"\nThe function returned:",void 0);if(o=o||{element:e,root:t},0===i&&!t.contains(e))return void this.strictAssert(0,"[getTop] the provided root does not contain the element.",{element:e,root:t,paramSnapshot:o},"\nThe function returned:",void 0);if(!(r=r||$e.call(this,t,o)))return void(Be(this)&&console.warn("Root has no a usable offset reference; nothing else to measure against. \nThe function returned:",void 0,{element:e,paramSnapshot:o,offsetParent:a,traversal:s}));if(e===t)return i;const s=[...n,e],a=this._DOM.getElementOffsetParent(e);if(!a)return void(Be(this)&&console.warn("Element has no offset parent; offset chain is broken. \nThe function returned:",void 0,{element:e,paramSnapshot:o,offsetParent:a,traversal:s}));const l=this._DOM.getElementOffsetTop(e);return a===t?l+i:a===r.sharedOffsetParent?(r.sharedOffsetParentIsBody&&!r.warnedAboutBody&&(r.warnedAboutBody=!0,Be(this)&&console.warn("getTop(): reached document.body while measuring offsets. Layout likely lacks positioned ancestors.",{element:e,root:t,paramSnapshot:o})),l+i-r.rootOffsetFromSharedParent):this.getTop(a,t,i+l,o,s,r)}function $e(e,t){const i=this._DOM.getElementOffsetParent(e);if(!i)return Be(this)&&console.warn("[getTop*]: root has no offset parent; cannot build relative offsets.",{root:e,paramSnapshot:t}),null;const o=this._DOM.getElementOffsetTop(e);return"number"!=typeof o?(Be(this)&&console.warn("[getTop*]: root offsetTop is not a number.",{root:e,sharedOffsetParent:i,paramSnapshot:t}),null):{sharedOffsetParent:i,rootOffsetFromSharedParent:o,sharedOffsetParentIsBody:i===e.ownerDocument?.body,warnedAboutBody:!1}}function Ge(e,t=null){if(e){if(null===t)return this._DOM.getElementOffsetBottom(e);if(t)return this.getTop(e,t)+this._DOM.getElementOffsetHeight(e);Be(this)&&console.warn("root must be provided, but was received:",t,"\nThe function returned:",void 0)}else Be(this)&&console.warn("[getBottom] element must be provided, but was received:",e,"\nThe function returned:",void 0)}function We(e,t){if(!e)return;const i=this.getBottom(e,t);let o;const n=this.createNeutralBlock();this._DOM.insertAfter(e,n);const r=this.getTop(n,t);this._DOM.removeNode(n);if(r>=i)o=r;else{o=i+parseInt(this._DOM.getComputedStyle(e).marginBottom)}return o}function ze(e){const t=parseInt(this._DOM.getComputedStyle(e).marginTop),i=parseInt(this._DOM.getComputedStyle(e).marginBottom);return this._DOM.getElementOffsetHeight(e)+t+i}function je(e,t){const i=parseInt(this._DOM.getComputedStyle(e).marginTop);return this.getTop(e,t)-i}function Ve(e){const t=this.create();this._DOM.insertAtEnd(e,t);const i=this._DOM.getElementOffsetWidth(t);return this._DOM.removeNode(t),i}function Ue(e,t="",i=!0){const o=this.create();i&&this._DOM.setStyles(o,{overflow:"auto"});const n=this._DOM.cloneNodeWrapper(e);this._DOM.setInnerHTML(n,t),this._DOM.insertAtEnd(o,n),this._DOM.insertBefore(e,o);const r=this._DOM.getElementOffsetHeight(o);return this._DOM.removeNode(o),r}function qe(e){const t=this.createNeutral();this._DOM.setInnerHTML(t,"!"),this._DOM.setStyles(t,{display:"block"}),this._DOM.insertAtEnd(e,t);const i=this._DOM.getElementOffsetHeight(t);return this._DOM.removeNode(t),i}function Ke(e,t=0){const i=this._DOM.getElementOffsetTop(e),o=this._DOM.cloneNode(e),n="!
".repeat(t);[...o.children].forEach(e=>this._DOM.setInnerHTML(e,n)),this._DOM.insertBefore(e,o);const r=this._DOM.getElementOffsetTop(e);return this._DOM.removeNode(o),r-i}function Ye(e){const t=this._DOM.getElementOffsetTop(e),i=this._DOM.cloneNodeWrapper(e);this._DOM.insertBefore(e,i);const o=this._DOM.getElementOffsetTop(e);return this._DOM.removeNode(i),o-t}function Xe(e){const t=this._DOM.getElementOffsetTop(e),i=this._DOM.cloneNodeWrapper(e),o=e.children.length,n=[...e.children];this._DOM.insertBefore(e,i);const r=[];for(let s=0;sthis._DOM.removeNode(e))}return this._DOM.removeNode(i),r}function Qe(e){if(!(e instanceof HTMLElement)||"TABLE"!==e.tagName)throw new Error("Expected a
element.");const t=[...e.children].reduce((e,t)=>{const i=t.tagName;return"TBODY"===i?{...e,rows:[...e.rows,...t.children]}:"CAPTION"===i?(this.markNoBreak(t),{...e,caption:t}):"COLGROUP"===i?(this.markNoBreak(t),{...e,colgroup:t}):"THEAD"===i?(this.markNoBreak(t),{...e,thead:t}):"TFOOT"===i?(this.markNoBreak(t),{...e,tfoot:t}):"TR"===i?{...e,rows:[...e.rows,...t]}:(Be(this)&&t&&console.warn("unexpected:",t),{...e,unexpected:[...e.unexpected,...t]})},{caption:null,thead:null,tfoot:null,rows:[],unexpected:[]});return t.unexpected.length>0&&Be(this)&&console.warn(`something unexpected is found in the table ${e}`),t}function Ze(e,t){const i=t||this._DOM.getComputedStyle(e),o=this.createNeutralBlock();this._DOM.setStyles(o,{display:"block",padding:"0",margin:"0",border:"0",height:"0",clear:"both",visibility:"hidden",contain:"layout"}),this._DOM.insertAtEnd(e,o);const n=this.getNormalizedTop(o,e,i);return this._DOM.removeNode(o),n}function Je(e,t,i="both"){const o="bottom"!==i,n="top"!==i;if(e instanceof HTMLElement){const r=o?this.getTop(e,t):void 0,s=n?this.getBottom(e,t):void 0;return o&&!Number.isFinite(r)?(this.strictAssert(!1,"[resolveRowBoundsGeneric] failed to measure top for HTMLElement",{row:e,root:t,want:i}),{top:void 0,bottom:void 0}):n&&!Number.isFinite(s)?(this.strictAssert(!1,"[resolveRowBoundsGeneric] failed to measure bottom for HTMLElement",{row:e,root:t,want:i}),{top:void 0,bottom:void 0}):"top"===i?{top:r,bottom:r}:"bottom"===i?{top:s,bottom:s}:{top:r,bottom:s}}if(Array.isArray(e)){let r=o?1/0:void 0,s=n?-1/0:void 0,a=!1,l=!1;return e.forEach(e=>{if(e instanceof HTMLElement){if(o){const i=this.getTop(e,t);Number.isFinite(i)&&(r=Math.min(r,i),a=!0)}if(n){const i=this.getBottom(e,t);Number.isFinite(i)&&(s=Math.max(s,i),l=!0)}}}),"top"===i?a?{top:r,bottom:r}:(this.strictAssert(!1,"[resolveRowBoundsGeneric] no valid top found in row array",{row:e,root:t,want:i}),{top:void 0,bottom:void 0}):"bottom"===i?l?{top:s,bottom:s}:(this.strictAssert(!1,"[resolveRowBoundsGeneric] no valid bottom found in row array",{row:e,root:t,want:i}),{top:void 0,bottom:void 0}):o&&!a?(this.strictAssert(!1,"[resolveRowBoundsGeneric] no valid top found in row array",{row:e,root:t,want:i}),{top:void 0,bottom:void 0}):n&&!l?(this.strictAssert(!1,"[resolveRowBoundsGeneric] no valid bottom found in row array",{row:e,root:t,want:i}),{top:void 0,bottom:void 0}):{top:r,bottom:s}}return this.strictAssert(!1,"[resolveRowBoundsGeneric] unexpected row payload",{row:e,root:t,want:i}),{top:void 0,bottom:void 0}}W("creators");function et(e,t){let i;if(e){const t=e.charAt(0);if(t.match(/[#\[\.]/))i=this._DOM.createElement("div"),this._DOM.setAttribute(i,e);else{if(!t.match(/[a-zA-Z]/))return void this.strictAssert(!1,"Expected valid html selector ot tag name, but received:",e);i=this._DOM.createElement(e)}}else i=this._DOM.createElement("div");return t&&this._DOM.setInnerHTML(i,t),i}function tt(){return this.create(this._selector.neutral)}function it(){const e=this.createNeutral();return e.style.display="block",e.style.clear="both",e}function ot(){return this.create(this._selector.textNode)}function nt(){return this.create(this._selector.textLine)}function rt(){return this.create(this._selector.textGroup)}function st(e){const t=this.create();return this.markNoBreak(t),e&&this._DOM.setStyles(t,e),t}function at(){return this.create(this._selector.printPageBreak)}function lt(){return this.create(this._selector.complexTextBlock)}function ct(e){const t=this._DOM.cloneNodeWrapper(e);return this._DOM.setAttribute(t,".test-node"),this._DOM.setStyles(t,{position:"absolute",background:"rgb(255 239 177)",width:this.getMaxWidth(e)+"px"}),t}function ht(e,t){const i=this.create(this._selector.word);return this._DOM.setInnerHTML(i,e),i.dataset.index=t,i}function dt(){return this.create(this._selector.printForcedPageBreak)}function gt(e,t){if(!t)return null;const i=this.create();return this._DOM.setStyles(i,{display:"flex",flexWrap:"nowrap",alignItems:"center",justifyContent:"center",textAlign:"center",fontSize:"8px",fontFamily:"sans-serif",letterSpacing:"1px",textTransform:"uppercase",height:t+"px"}),e&&this._DOM.setInnerHTML(i,e),this.markNoBreak(i),i}function ut({wrapper:e,caption:t,colgroup:i,thead:o,tfoot:n,tbody:r}){const s=e||this.create("table"),a=this.create("TBODY");return t&&this._DOM.insertAtEnd(s,t),i&&this._DOM.insertAtEnd(s,i),o&&this._DOM.insertAtEnd(s,o),r&&this._DOM.insertAtEnd(a,...r),this._DOM.insertAtEnd(s,a),n&&this._DOM.insertAtEnd(s,n),s}function pt(e){const t=this._DOM.cloneNodeWrapper(e);return this.unmarkPageStart(t),this.markNoBreak(t),t}W("splitters");function _t(e){return e.split(/(?<=\n)/)}function ft(e){return(this._DOM.getNodeValue(e)||this._DOM.getInnerHTML(e)).split(/(?<=\s|-)/)}function mt(e){return(this._DOM.getNodeValue(e)||this._DOM.getInnerHTML(e)).trim().split(/(?<=\s|-)/).filter(e=>" "!=e)}function bt(e){const t=e,i=this.splitTextByWordsGreedy(e),o=i.map(e=>{const t=this._DOM.createElement("span");return this._DOM.setInnerHTML(t,e+" "),t}),n=this.createTestNodeFrom(e);return this._DOM.insertAtEnd(n,...o),this._DOM.insertAtEnd(e,n),{splittedNode:t,nodeWords:i,nodeWordItems:o}}const wt=W("markers");function St(e,t){this.setMark(e,"processed",t)}function Mt(e){this.setMark(e,"noBreak")}function yt(e,t){this.setMark(e,"noHanging",t)}function Pt(e){this.setMark(e,"slice")}function Ct(e,t){this.setMark(e,"pageStart",t)}function Et(e){this.clearMark(e,"pageStart")}function Tt(e,t){this.setMark(e,"pageEnd",t)}function Ot(e,t){this.setMark(e,"pageNumber",t)}function vt(e){wt(this)&&console.log("[mark ⊤ cut]",e),e&&this.setMark(e,"cleanTopCut")}function Dt(e){wt(this)&&console.log("[mark ⊥ cut]",e),e&&this.setMark(e,"cleanBottomCut")}function kt(e){wt(this)&&console.log("[mark ⊤ cut]",e),e&&this.setMark(e,"topCut")}function Rt(e){wt(this)&&console.log("[mark ⊥ cut]",e),e&&this.setMark(e,"bottomCut")}function Nt(e){if(e&&e.length)if(1!==e.length)for(let t=0;t0,o=t0,n=t","color:blue",i),r=i,s=[...this._DOM.getChildren(i)]):Array.isArray(i)?(wt(this)&&console.log("%c[markSliceCutsInRows] It is an Array","color:blue",i),r=void 0,s=i):this.strictAssert(0,"we expected TR or an array of elements!"),!r&&!s.length){wt(this)&&console.log("%c[markSliceCutsInRows] There was no split","color:red",{rowWrapper:r,cellWrappers:s});break}o&&(r&&(wt(this)&&console.log("[markSliceCutsInRows] rowWrapper ⊥",r),this.markTopCut(r)),s.forEach(e=>{wt(this)&&console.log("[markSliceCutsInRows] cell 🖍️ ⊥",e),this.markTopCut(e)})),n&&(r&&(wt(this)&&console.log("[markSliceCutsInRows] rowWrapper ⊤",r),this.markBottomCut(r)),s.forEach(e=>{wt(this)&&console.log("[markSliceCutsInRows] cell 🖍️ ⊤",e),this.markBottomCut(e)}))}else wt(this)&&console.log("%c[markSliceCutsInRows] The rows were not passed. Doing nothing.","color:red")}function Bt(e){return this.hasMark(e,"pageStart")}function Ft(e){return this.hasMark(e,"noBreak")}function At(e){return this.hasMark(e,"noHanging")}function Ht(e){return this.hasMark(e,"slice")}class It{constructor({debugMode:e=!1,markupDebugMode:t=!1,setAttribute:i,removeAttribute:o}={}){this._debugMode=Boolean(e),this._markupDebugMode=Boolean(t),this._setAttribute=i,this._removeAttribute=o,this._marks=new WeakMap,this._symbols=new Map}set(e,t,i=true,o={}){if(!e||!t)return;this._getEntry(e).set(t,i),this._debugMode&&(e[this._getSymbol(t)]=i),this._applyAttribute(e,i,o)}get(e,t){const i=this._marks.get(e);return i?i.get(t):void 0}has(e,t){const i=this._marks.get(e);return Boolean(i&&i.has(t))}clear(e,t,i={}){if(!e||!t)return;const o=this._marks.get(e);if(o&&(o.delete(t),0===o.size&&this._marks.delete(e)),this._debugMode){const i=this._symbols.get(t);i&&delete e[i]}this._removeAttributeMarker(e,i)}_getEntry(e){let t=this._marks.get(e);return t||(t=new Map,this._marks.set(e,t)),t}_getSymbol(e){return this._symbols.has(e)||this._symbols.set(e,Symbol(String(e))),this._symbols.get(e)}_applyAttribute(e,t,i={}){const{attributeSelector:o,attributeValue:n,forceAttribute:r=!1}=i;if(!(r||this._markupDebugMode)||!this._setAttribute||!o)return;const s="function"==typeof n?n(t):void 0!==n?n:t;this._setAttribute(e,o,s)}_removeAttributeMarker(e,t={}){const{attributeSelector:i,forceAttribute:o=!1}=t;(o||this._markupDebugMode)&&this._removeAttribute&&i&&this._removeAttribute(e,i)}}class Lt{constructor(){this.pageStart=new Map,this.pageEnd=new Map,this.pageDividerByPage=new Map,this.pageNumberByPage=new Map,this.pageNumberByElement=new WeakMap}}class $t{constructor(e={}){this.marks=new It(e),this.registry=new Lt}}const Gt={pageStart:{kind:"structural",selectorKey:"pageStartMarker",registry:"pageStart"},pageEnd:{kind:"structural",selectorKey:"pageEndMarker",registry:"pageEnd"},pageNumber:{kind:"structural",selectorKey:"pageMarker",registry:"pageNumber"},noBreak:{kind:"runtime",selectorKey:"flagNoBreak"},noHanging:{kind:"runtime",selectorKey:"flagNoHanging"},slice:{kind:"runtime",selectorKey:"flagSlice"},split:{kind:"runtime",selectorKey:"split"},processed:{kind:"debug",selectorKey:"processed",attributeValue:e=>"🏷️ "+e},cleanTopCut:{kind:"style",selectorKey:"cleanTopCut"},cleanBottomCut:{kind:"style",selectorKey:"cleanBottomCut"},topCut:{kind:"style",selectorKey:"topCutPart"},bottomCut:{kind:"style",selectorKey:"bottomCutPart"}};function Wt(e,t,i,o={}){const n=this._getMarkAttributeConfig?.(t),r=this._isStyleMark?.(t),s={...n,...r?{forceAttribute:!0}:{},...o};this._marks.set(e,t,i,s),this._registerMark?.(e,t,i)}function zt(e,t){return this._marks.get(e,t)}function jt(e,t){return this._marks.has(e,t)}function Vt(e,t,i){const o=this._isStyleMark?.(t),n=o?{...i,forceAttribute:!0}:i;this._marks.clear(e,t,n),this._unregisterMark?.(e,t)}function Ut(e,t){e&&this._markers.registry.pageStart.set(Number(t),e)}function qt(e){if(e)for(const[t,i]of this._markers.registry.pageStart.entries())if(i===e)return void this._markers.registry.pageStart.delete(t)}function Kt(e,t){e&&this._markers.registry.pageEnd.set(Number(t),e)}function Yt(e,t){e&&this._markers.registry.pageDividerByPage.set(Number(t),e)}function Xt(){return this._markers.registry.pageDividerByPage}function Qt(e,t){if(!e)return;const i=Number(t);let o=this._markers.registry.pageNumberByPage.get(i);o||(o=new Set,this._markers.registry.pageNumberByPage.set(i,o)),o.add(e),this._markers.registry.pageNumberByElement.set(e,i)}function Zt(){return this._markers.registry.pageNumberByPage}function Jt(e){if(e)return this._markers.registry.pageNumberByElement.get(e)}function ei(e,t,i){if(!e)return;const o=Gt[t];if(o&&o.registry)switch(o.registry){case"pageStart":Ut.call(this,e,i);break;case"pageEnd":Kt.call(this,e,i);break;case"pageNumber":Qt.call(this,e,i)}}function ti(e,t){if(!e)return;const i=Gt[t];if(i&&i.registry)switch(i.registry){case"pageStart":qt.call(this,e);break;case"pageEnd":for(const[t,i]of this._markers.registry.pageEnd.entries())if(i===e){this._markers.registry.pageEnd.delete(t);break}break;case"pageNumber":{const t=this._markers.registry.pageNumberByElement.get(e);if(void 0!==t){const i=this._markers.registry.pageNumberByPage.get(t);i&&(i.delete(e),0===i.size&&this._markers.registry.pageNumberByPage.delete(t)),this._markers.registry.pageNumberByElement.delete(e)}}}}function ii(){return this._markers.registry.pageEnd}function oi(e){const t=Gt[e];if(!t||!t.selectorKey)return;const i=this._selector[t.selectorKey];return i?{attributeSelector:i,attributeValue:t.attributeValue}:void 0}function ni(e){return"style"===Gt[e]?.kind}W("wrappers");function ri(e){const t=this._DOM.getChildren(e),i=this.createNeutralBlock();return this._DOM.insertAtStart(i,...t),this._DOM.insertAtStart(e,i),i}const si=W("fitters");function ai({element:e,height:t,width:i,vspace:o,hspace:n}){const r=o/t,s=n/i,a=rl&&(g||(g=this.wrapNodeChildrenWithNeutralBlock(s),d=this._DOM.getElementOffsetHeight(g)||d),this.fitElementWithinHeight(g,l),n=!0,si(this)&&console.warn("💢 scaleCellsToHeight: resized cell content",{cell:s,target:l}))}return n}function hi(e,t){this._DOM.setStyles(e,{"box-sizing":"border-box",width:`${this._DOM.getElementOffsetWidth(t)}px`,"min-width":`${this._DOM.getElementOffsetWidth(t)}px`})}function di(e){this.copyNodeWidth(e,e),this._DOM.getAll("td",e).forEach(e=>this.copyNodeWidth(e,e))}function gi(e){Array.isArray(e)&&e.forEach(e=>{e&&this.copyNodeWidth(e,e)})}function ui(e,t={}){const{descentRatio:i=.22,normalLH:o=1.2,safety:n=1}=t,r=getComputedStyle(e),s=parseFloat(r.fontSize)||0;let a;if("normal"!==r.lineHeight&&r.lineHeight){const e=parseFloat(r.lineHeight);a=Number.isFinite(e)?e:o*s}else a=o*s;const l=(Math.max(0,(a-s)/2)+i*s)*n;return Math.ceil(l)}const pi=W("pageBreaks");function _i(e,t){let i=e;for(;;){const e=this.findFirstChildParent(i,t);if(!e||e===i)break;i=e}return i}function fi(e,t,i){pi(this)&&console.group("➗ findBetterPageStart");let o=!1,n=!1,r=!1;const s=t?this.getTop(t,i):0;pi(this)&&console.log("Start calculations:",{pageStart:e,lastPageStart:t,root:i,topLimit:s});const a=this.findFirstChildParentFromPage(e,s,i);let l;if(a)l=a;else{l=this.getTop(e,i){if(this.isSTYLE(t))return Ti(this)&&console.info("🚸 (getPreparedChildren) ignore STYLE",[t]),e;if(this.isSignificantTextNode(t)){const i=this.createTextNodeWrapper();return this._DOM.wrap(t,i),e.push(i),Ti(this)&&console.info("🚸 (getPreparedChildren) wrap and return TEXT NODE",[t]),e}if(this._DOM.isElementNode(t)){if(this.shouldSkipFlowElement(t,{context:"getPreparedChildren"}))return e;if(!this._DOM.getElementOffsetParent(t)){const i=this.getPreparedChildren(t);return i.length>0&&e.push(...i),Ti(this)&&console.info("%c🚸 (getPreparedChildren) * no offset parent — unwrapped","color:green",i,[t]),e}return e.push(t),Ti(this)&&console.info("🚸 (getPreparedChildren) * normal node",[t]),e}return Ti(this)&&console.info("%c🚸 (getPreparedChildren) IGNORE whitespace / comment ...","color:red",[t]),e},[]),Ti(this)&&console.groupEnd("⚗️🚸 distill children"),Ti(this)&&console.info("🚸 distilled children",t);const i=Li.call(this,t),o=this.isInline(e);i&&(Ti(this)&&console.info("🚸 isVerticalFlowDisrupted in children of element",[e]),o?(Ti(this)&&console.info("🎒🚸 parent element is inline wrapper",[e]),t=[Hi.call(this,e)]):t=Ai.call(this,t))}}return Ti(this)&&console.info("🚸 getPreparedChildren:",t),Ti(this)&&console.groupEnd("🚸 getPreparedChildren of"),t}function vi(e){if(!e)return[];const t=[];for(const i of this._DOM.getChildNodes(e))this._DOM.isElementNode(i)&&(this.shouldSkipFlowElement(i,{context:"getFilteredChildren"})||t.push(i));return t}function Di(e){return this.getFlowChildren(e)[0]}function ki(e){const t=this.getFlowChildren(e);return t[t.length-1]}function Ri(e,t,i,o){let n=[];if(this.isNotBreakable(e))return Ti(this)&&console.info("🧡 isNotBreakable",e),[];if(this.isComplexTextBlock(e))return Ti(this)&&console.info("💚 ComplexTextBlock",e),this._paragraph.split(e)||[];if(this.isWrappedTextNode(e))return Ti(this)&&console.info("💚 TextNode",e),this._paragraph.split(e)||[];if(!$i.call(this,e))return Ti(this)&&console.info("🪲 getSplitChildren: empty node, return []",e),[];const r=this._DOM.getComputedStyle(e);if(this.isTableNode(e,r))Ti(this)&&console.info("💚 TABLE",e),n=this._table.split(e,t,i,o,r)||[];else if(this.isTableLikeNode(e,r))Ti(this)&&console.info("💚 TABLE like",e),n=this._tableLike.split(e,t,i,o,r)||[];else if(this.isPRE(e,r))Ti(this)&&console.info("💚 PRE",e),n=this._pre.split(e,t,i,o,r)||[];else if(this.isFlexRow(e,r)){Ti(this)&&console.info("🩷 Flex ROW",e);let t=this.getPreparedChildren(e);n=Ii.call(this,t)}else this.isGridAutoFlowRow(e,r)?(Ti(this)&&console.info("💜 GRID"),n=this._grid.split(e,t,i,o)||[]):(Ti(this)&&console.info("💚 found some node - use main this.getPreparedChildren() for:",e),n=this.getPreparedChildren(e));return n}function Ni(e,t=null,{skipFloat:i=!1}={}){const o=[];if(!e||!this||!this._DOM)return o;let n=e;for(;n;){let e=this._DOM.getFirstElementChild(n);for(;e;)if(this.shouldSkipFlowElement(e,{context:"getFirstChildren:firstChild"}))e=this._DOM.getRightNeighbor(e);else{if(!i||!this.isRegisteredFloatElement(e))break;e=this._DOM.getRightNeighbor(e)}if(!e)break;if(this.isSyntheticTextWrapper(e))break;if(t&&t(e,n,o))break;o.push(e),n=e}return o}function xi(e,t=null,{skipFloat:i=!1}={}){const o=[];if(!e||!this||!this._DOM)return o;let n=e;for(;n;){let e=this._DOM.getLastElementChild(n);for(;e;)if(this.shouldSkipFlowElement(e,{context:"getLastChildren:lastChild"}))e=this._DOM.getLeftNeighbor(e);else{if(!i||!this.isRegisteredFloatElement(e))break;e=this._DOM.getLeftNeighbor(e)}if(!e)break;if(this.isSyntheticTextWrapper(e))break;if(t&&t(e,n,o))break;o.push(e),n=e}return o}function Bi(e){if(!e||"P"!==this._DOM.getElementTagName(e))return!1;if(!this.isStructurallyEmptyNode(e))return!1;return!(0!==this._DOM.getElementOffsetHeight(e))}function Fi(e){const t=this._DOM.getChildNodes(e);for(const e of t){if(e.nodeType===Node.ELEMENT_NODE)return!1;if(e.nodeType!==Node.TEXT_NODE);else if(""!==(e.nodeValue||"").trim())return!1}return!0}function Ai(e){let t=null;const i=[];return e.forEach(e=>{this.isInline(e)?(t||(t=Hi.call(this,e),i.push(t)),this._DOM.insertAtEnd(t,e)):(t=null,i.push(e))}),i}function Hi(e){const t=this.createComplexTextBlock();return this._DOM.wrap(e,t),t}function Ii(e){const t=e.filter(e=>this._DOM.getElementOffsetHeight(e)>0);return t.length>0?t:e}function Li(e){return e.some((e,t,i)=>{const o=e,n=i[t+1];if(!n)return!1;return this._DOM.getElementOffsetBottom(o)>this._DOM.getElementOffsetTop(n)})}function $i(e){let t=e.firstChild;for(;t;){if(this._DOM.isElementNode(t)){if(!this.shouldSkipFlowElement(t,{context:"hasRenderableChild"}))return!0}else if(this.isSignificantTextNode(t))return!0;t=t.nextSibling}return!1}const Gi=W("media"),Wi=new Set(["IMG","SVG","OBJECT","EMBED","IFRAME","VIDEO","AUDIO","CANVAS"]);function zi(e,t="self"){return"last"===t?this.getFlowLastChild?.(e)||this._DOM.getLastElementChild(e):this.getFlowFirstChild?.(e)||this._DOM.getFirstElementChild(e)}function ji(e){if(!e)return!1;const t=this._DOM.getElementTagName(e);if(!t)return!1;if("INPUT"===t){return"image"===(this._DOM.getAttribute(e,"type")||"").toLowerCase()}return Wi.has(t)}function Vi(e,{prefer:t="self"}={}){if(!e)return null;const i=new Set;let o=e;for(;o&&!i.has(o);){if(i.add(o),this.isReplacedElement(o))return o;const e=this.resolveFlowBoxElement(o,{prefer:t});if(e&&e!==o){if(this.isReplacedElement(e))return e;o=e;continue}const n=this.getFlowChildren(o).filter(e=>{const t=this._DOM.getComputedStyle(e)?.display;return"none"!==t});if(1!==n.length)return Gi(this)&&console.info("🖼️ resolveReplacedElement: branching or empty wrapper",o,n),null;o=zi.call(this,o,t)||n[0]}return null}W("normalizer");function Ui(e,t){if(!e||!t)return[];const i=new Map,o=e=>{if(!e)return;if(i.has(e))return i.get(e);const o=this.getTop(e,t);return i.set(e,o),o};return this.getFirstChildrenChain(e,(e,t)=>{const i=o(e),n=o(t);return void 0===i||void 0===n||i!==n},{skipFloat:!0})}function qi(e,t){if(!e||!t)return[];const i=new Map,o=e=>{if(!e)return;if(i.has(e))return i.get(e);const o=this.getBottom(e,t);return i.set(e,o),o};return this.getLastChildrenChain(e,(e,t)=>{const i=o(e),n=o(t);return void 0===i||void 0===n||i!==n},{skipFloat:!0})}const Ki=W("slicers");function Yi({rootNode:e,rootComputedStyle:t,children:i,firstPartHeight:o,fullPageHeight:n,firstChild:r,points:s=[]}){if(!i.length)return Ki(this)&&console.log("🧶 [getSplitPoints] %c has no children, early returns []","font-weight:bold",{rootNode:e}),[];const a=t=>{const i=this.findBetterPageStart(t,s.at(-1),e);return s.length||i!==r?(Ki(this)&&console.log("%c 🧼🧼🧼🧼 push(point) in registerPoint()","color:violet",{point:i,points:s,firstChild:r},s.length),s.push(i),!1):(Ki(this)&&console.log("%c !points.length && point === children[0] && children[1]","color:red"),Ki(this)&&console.log("%c 🅾️ push(null) in registerPoint()","color:red"),s.push(null),!0)};Ki(this)&&console.group("🧶 getSplitPoints"),Ki(this)&&console.log("points.length",s.length);const l=t||this._DOM.getComputedStyle(e),c=new WeakMap,h=e=>{let t=c.get(e);return t||(t=Object.create(null),c.set(e,t)),t},d=t=>{if(!t)return NaN;const i=h(t);return"top"in i||(i.top=this.getNormalizedTop(t,e,l)),i.top},g=t=>{if(!t)return NaN;const i=h(t);return"bottomWithMargin"in i||(i.bottomWithMargin=this.getNormalizedBottomWithMargin(t,e,l)),i.bottomWithMargin},u=e=>{if(!e)return 0;const t=h(e);return"offsetHeight"in t||(t.offsetHeight=this._DOM.getElementOffsetHeight(e)),t.offsetHeight};this.setInitStyle(!0,e,l);let p=!1;const _=()=>(p||(p=!0,Ki(this)&&console.groupEnd(`walking through ${i.length} children`),this.setInitStyle(!1,e,t),Ki(this)&&console.groupEnd("getSplitPoints")),s);Ki(this)&&console.group(`walking through ${i.length} children`,i);for(let t=0;tc))if(Ki(this)&&console.log("[getSplitPoints]",`next overtook the floater : (nextElementTop) ${b} > ${c}`,{currentElement:p},"does current overflow? let's check.",{isNextElementTopFinite:w}),(this.isSVG(p)||this.isIMG(p))&&Ki(this)&&console.log("%cIMAGE","color:red;text-weight:bold"),S=g(p),S<=c){if(w){Ki(this)&&console.log("[getSplitPoints]",`current fits: (currentElementBottom) ${S} <= ${c}, 🍎 register nextElement as Point.`,{currentElement:p,nextElement:m});if(a(m))return Ki(this)&&console.log("%cNULL CASE, return","color:red;text-weight:bold"),_();continue}Ki(this)&&console.log("[getSplitPoints] nextElementTop not finite and current fits tail window",{currentElementBottom:S,floater:c,nextElement:m})}else Ki(this)&&console.log(`🔪🥒 try to split overflowing current: (currentElementBottom > ) ${S} > ${c}`,{currentElement:p}),M=!0;if(!m){Ki(this)&&console.log("%c[getSplitPoints] !nextElement","color:red"),Ki(this)&&console.log("%c[getSplitPoints] * Try to split it. 🔪🥒","color:blue"),S=S??g(p);let t=p;if(p.parentElement&&e.contains(p.parentElement)){let i=p.parentElement;for(;i&&e.contains(i)&&i!==e&&!this._DOM.getRightNeighbor(i);)t=i,i=i.parentElement}const i=t===p?S:g(t);if(i<=c){Ki(this)&&console.log("%c 🍕 [getSplitPoints] !nextElement branch fits with container shell","color:violet",{currentElementBottom:S,containerBottom:i,floater:c,containerElement:t});continue}M=!0}if(!M)continue;let y=[];const P=this.getSplitChildren(p,o,n,e);if(P.length){if(y=Yi.call(this,{rootNode:e,rootComputedStyle:l,children:P,firstPartHeight:o,fullPageHeight:n,firstChild:r,points:s}),0===y.length){const e=Math.max(o,n),t=u(p),i=t>e&&(!y.length||1===y.length&&null===y[0]);if(Ki(this)&&console.log("room (Math.max)",e),i){if(Ki(this)&&console.warn("%c⚠️ UNSPLITTABLE OVERSIZED ELEMENT — SCALE IT","color:white; background:red; font-weight:bold;",p,`height: ${t}`),!s.length&&p===r)return Ki(this)&&console.warn("🅾️ (1) points.push(null) in isUnbreakableOversized"),s.push(null),_();if(m){if(a(m))return _()}}else if(a(p))return _()}}else{Ki(this)&&console.log("🍎 currentElementChildren.length == 0");const e=u(p);if(e>h&&(!y.length||1===y.length&&null===y[0])){if(Ki(this)&&console.warn("%c⚠️ UNSPLITTABLE OVERSIZED ELEMENT — SCALE IT","color:white; background:red; font-weight:bold;",p,`height: ${e}`),Ki(this)&&console.warn("🅾️ (2) points.push(null) in isUnbreakableOversized"),!s.length&&p===r)return s.push(null),_();if(m){Ki(this)&&console.warn("🅾️🅾️🅾️🅾️🅾️🅾️🅾️🅾️ registerPoint(nextElement)");if(a(m))return _()}}else{if(a(p))return _()}}}return _()}function Xi(e,t,i,o,n){Ki(this)&&console.group("[✖️] getSplitPointsPerCells");const r=e.map((e,r)=>{Ki(this)&&console.group(`(•) Split CELL.${r} in:`,n);let s=[];const a=i-(t[r]||0),l=o-(t[r]||0);let c=this.getSplitChildren(e,a,l,n);if(c.length){const t=c[0];Ki(this)&&console.log("firstChild",t),s=this.getSplitPoints({rootNode:e,children:c,firstPartHeight:a,fullPageHeight:l,firstChild:t})}else Ki(this)&&console.log(`(•) empty cell #${r}`);return Ki(this)&&console.log(`(•) return splitPoints for CELL#${r}`,s),Ki(this)&&console.groupEnd(),s}),s=r.some(eo);Ki(this)&&console.log("🧽🧽🧽🧽🧽🧽🧽 isFirstPartEmptyInAnyCell",s);let a=r,l=!1;if(s){a=e.map((e,r)=>{Ki(this)&&console.group(`(••) Split CELL.${r} in:`,n);const s=i-(t[r]||0),a=o-(t[r]||0),l=this.getSplitChildren(e,s,a,n),c=l[0];Ki(this)&&console.log("firstChild",c);let h=[];return l.length&&(h=this.getSplitPoints({rootNode:e,children:l,firstPartHeight:a,fullPageHeight:a,firstChild:c})),Ki(this)&&console.log(`(••) return splitPoints for CELL#${r}`,h),Ki(this)&&console.groupEnd(),h}),Ki(this)&&console.log("[••] splitPointsPerCell",a);for(let e=0;e0&&this.strictAssert(i.every(e=>null!==e),"sliceNodeBySplitPoints: splitPoints contains null — sanitize upstream before slicing"),this.strictAssert(i.every(e=>!e||e.nodeType===Node.ELEMENT_NODE&&(t===e||t.contains(e))),"sliceNodeBySplitPoints: split point is not an Element within rootNode");for(let e=0;e<=i.length;e++){const n=i[e-1]??null,r=i[e]??null,s=this.cloneAndCleanOutsideRange(t,n,r);this.normalizeContentCuts({slice:s,top:null!==n,bottom:null!==r}),this._DOM.getChildNodes(s).length>0&&o.push(s)}return Ki(this)&&console.log(o),Ki(this)&&console.groupEnd(`🔪 (${e}) sliceNodeBySplitPoints`),o}function Zi({slice:e,top:t=!1,bottom:i=!1}){if(e){if(t){const t=[...this.getFirstChildrenChain(e)];t.forEach(e=>this.markCleanTopCut(e)),Ki(this)&&console.log("[normalizeContentCuts] topChain 👗",t)}if(i){const t=[...this.getLastChildrenChain(e)];t.forEach(e=>this.markCleanBottomCut(e)),Ki(this)&&console.log("[normalizeContentCuts] bottomChain 👗",t)}}else Ki(this)&&console.log("[normalizeContentCuts] no slice has been passed; return")}function Ji({index:e,rootNode:t,splitPoints:i}){Ki(this)&&console.group(`🔪 (${e}) sliceNodeContentBySplitPoints`);const o=[];for(let e=0;e<=i.length;e++){const n=i[e-1]??null,r=i[e]??null,s=this.cloneAndCleanOutsideRange(t,n,r);Ki(this)&&console.log({slice:s});const a=this.createNeutralBlock();for(;s.firstChild;)a.appendChild(s.firstChild);a.childNodes.length>0&&o.push(a)}return Ki(this)&&console.log(o),Ki(this)&&console.groupEnd(`🔪 (${e}) sliceNodeContentBySplitPoints`),o}function eo(e){return!!Array.isArray(e)&&(e.length>0&&null===e[0])}function to(e,t,i){t&&t.setAttribute("split","start"),i&&i.setAttribute("split","end");let o=e.cloneNode(!0);if(t){let t=o.querySelector('[split="start"]'),i=t.previousElementSibling;for(;i;){let e=i;i=i.previousElementSibling,e.remove()}let n=t.parentElement;for(;n&&n!==e;){let e=n.previousElementSibling;for(;e;){let t=e;e=e.previousElementSibling,t.remove()}n=n.parentElement}t.removeAttribute("split")}if(i){let t=o.querySelector('[split="end"]'),i=t.nextElementSibling;for(;i;){let e=i;i=i.nextElementSibling,e.remove()}let n=t.parentElement;for(;n&&n!==e;){let e=n.nextElementSibling;for(;e;){let t=e;e=e.nextElementSibling,t.remove()}n=n.parentElement}t.remove()}return t&&t.removeAttribute("split"),i&&i.removeAttribute("split"),o}const io=W("flowFilters"),oo="__html2pdf4docFlowFilter",no="__html2pdf4docFloat",ro=[{test:e=>"none"===e.display,cache:{reason:"display:none",message:"* display:none — skipped"}},{test:e=>"absolute"===e.position,cache:{reason:"position:absolute",message:"* position:absolute — skipped"}},{test:e=>"fixed"===e.position,cache:{reason:"position:fixed",message:"* position:fixed — skipped"}},{test:e=>"collapse"===e.visibility,cache:{reason:"visibility:collapse",message:"* visibility:collapse — skipped"}},{test:(e,t)=>(e.float&&"none"!==e.float&&(t[no]=!0),!1),cache:null}],so=new Set(["SOURCE","TEMPLATE","SCRIPT","NOSCRIPT","STYLE","LINK","META","HEAD","TITLE"]);function ao(e,t,i,o,{cached:n}={cached:!1}){if(!io(e))return;const r=t?`(${t}) `:"",s=n?" (cached)":"";console.info(`🚸 ${r}${i.message}${s}`,[o])}function lo(e,{context:t="",computedStyle:i}={}){if(!(e&&this&&this._DOM&&this._DOM.isElementNode(e)))return!1;const o=e[oo];if(o)return ao(this,t,o,e,{cached:!0}),!0;const n=this._DOM.getElementTagName(e);if(so.has(n))return ao(this,t,{message:`* <${n}> — skipped`},e),!0;const r=i??this._DOM.getComputedStyle(e);if(!r)return!1;for(const i of ro)if(i.test(r,e))return e[oo]=i.cache,ao(this,t,i.cache,e),!0;return!1}function co(e){return!!e?.[no]}function ho(e,t,i){return this._cache.measure.getBCR(e,t,i)}function go(e,t,i){const o=i||(()=>this._DOM.getComputedStyle(e));return this._cache.measure.getStyle(e,t,o)}function uo(){this._cache.resetMeasureCache()}W("pagination");function po({cells:e,splitPointsPerCell:t,sliceCell:i}){return t.map((t,o)=>{const n=e[o];return i({cell:n,index:o,splitPoints:t})})}function _o({originalRow:e,originalCells:t,slicedCellsPerOriginal:i,beginRow:o,cloneCellFallback:n,handleCell:r,finalizeRow:s}){const a=Math.max(...i.map(e=>e.length)),l=[];for(let c=0;c{const o=i[t][c]||n(e);r({context:a,cellClone:o,originalCell:e,cellIndex:t})}),l.push(s({context:a}))}return l}function fo({originalRow:e,originalCells:t,splitPointsPerCell:i,sliceCell:o,beginRow:n,cloneCellFallback:r,handleCell:s,finalizeRow:a}){if(!Array.isArray(i)||!i.length)return[];const l=this.sliceCellsBySplitPoints({cells:t,splitPointsPerCell:i,sliceCell:o});return this.buildRowSlices({originalRow:e,originalCells:t,slicedCellsPerOriginal:l,beginRow:n,cloneCellFallback:r,handleCell:s,finalizeRow:a})}function mo({usedRemainingWindow:e,isFirstPartEmpty:t,firstSliceTop:i,firstSliceBottom:o,pageBottom:n,epsilon:r=.5}){return{placeOnCurrentPage:e&&!t,remainingWindowSpace:Math.max(0,n-i),exceedsWindow:o>n+r}}function bo({currentRows:e,index:t,rowSlices:i}){return Array.isArray(e)?(e.splice(t,1,...i),e):[]}const wo=W("pagination");function So({cells:e,targetHeight:t,shells:i}){return!!(Array.isArray(e)&&e.length&&t>0)&&this.scaleCellsToHeight(e,t,i)}function Mo({needsScalingInFullPage:e,cells:t}){return Boolean(e&&Array.isArray(t)&&t.length)}function yo({needsScalingInFullPage:e,scaleCallback:t,payload:i}){if(!e)return!1;if("function"!=typeof t)return!1;const o=t(i||{});return!o&&this&&this._debug&&this._debug._&&wo(this)&&console.warn("[pagination.scaling] requested full-page scaling but callback reported no change",i),Boolean(o)}W("pagination");function Po(e,t,i){e&&Array.isArray(e.rows)&&e.rows.splice(t,1,...i)}function Co({rows:e,DOM:t,cellTagFilter:i,guardCallback:o}){if(!Array.isArray(e))return{};let n=!1,r=!1,s=!1,a=null;e.forEach(e=>{const o=Array.isArray(e)?e:Array.from(t.getChildren(e)||[]);null==a&&(a=o.length),o.length!==a&&(s=!0),o.forEach(e=>{const o=t.getElementTagName(e);if(!i||i(o,e)){const t=parseInt(e.getAttribute?.("rowspan"));Number.isFinite(t)&&t>1&&(n=!0);const i=parseInt(e.getAttribute?.("colspan"));Number.isFinite(i)&&i>1&&(r=!0)}})});const l={hasRowspan:n,hasColspan:r,inconsistentCells:s};return o?.(l),l}W("pagination");function Eo(e){if(!e||"object"!=typeof e)throw new Error("splitter kernel adapter must be an object.");if(!e.rows||"object"!=typeof e.rows)throw new Error("splitter kernel adapter must expose a rows provider.");if("function"!=typeof e.rows.replaceRow)throw new Error("splitter kernel adapter rows.replaceRow must be a function.")}function To(e,{rowIndex:t,rowSlices:i}){Eo(e);const o=Number.isFinite(t)?t:0,n=Array.isArray(i)?i:[],r=e.rows;r.replaceRow({rowIndex:o,rowSlices:n}),r.syncEntries?.({rowIndex:o,rowSlices:n});const s=e.guards?.getConfig?.({rowIndex:o,rowSlices:n})??r.getGuardConfig?.({rowIndex:o,rowSlices:n})??null;let a=null;if(s){const t={rows:s.rows,DOM:s.DOM||this._DOM,cellTagFilter:s.cellTagFilter,guardCallback:s.guardCallback};Array.isArray(t.rows)&&t.DOM&&(a=this.computeRowFlags(t),e.guards?.onFlags?.({flags:a,rowIndex:o,rowSlices:n}))}return e.metrics?.refresh?.({rowIndex:o,rowSlices:n,flags:a}),r.onRowsChanged?.({rowIndex:o,rowSlices:n,flags:a}),{flags:a}}W("pagination");function Oo({cells:e}){return Array.isArray(e)&&e.length?e.map(e=>{if(!e)return 0;const t=this._DOM.getComputedStyle(e),i=(parseFloat(t?.paddingTop)||0)+(parseFloat(t?.paddingBottom)||0)+(parseFloat(t?.borderTopWidth)||0)+(parseFloat(t?.borderBottomWidth)||0);return Number.isFinite(i)?Math.max(0,i):0}):[]}const vo=W("pagination");function Do({ownerLabel:e,DOM:t,row:i,targetHeight:o,cachedShells:n,getRowShellHeightsCallback:r,scaleCellsToHeightCallback:s}){if(e||vo(this)&&console.warn("[scaleRowCellsToHeight] 👤 Owner wanted!",{owner:e}),!i)return vo(this)&&console.warn("[pagination.overflow] Missing row for scaling.",{owner:e}),!1;if("function"!=typeof s)return vo(this)&&console.warn("[pagination.overflow] scaleCellsToHeight callback is required.",{owner:e}),!1;const a=t,l=a&&"function"==typeof a.getChildren?a.getChildren(i):null;return s(l?[...l]:[],o,Array.isArray(n)?n:"function"==typeof r?r(i):[])}function ko({ownerLabel:e,rowIndex:t,row:i,availableRowHeight:o,fullPageHeight:n,splitStartRowIndexes:r,reasonTail:s,reasonFull:a,registerPageStartCallback:l,scaleProblematicCellsCallback:c,debugLogger:h}){return e||vo(this)&&console.warn("[handleRowOverflow] 👤 Owner wanted!",{owner:e}),Array.isArray(r)?"function"!=typeof l?(vo(this)&&console.warn("[pagination.overflow] registerPageStart callback is required.",{owner:e}),t):o!1,isSlice:n=()=>!1}=t,{handleRowWithRowspan:r=()=>e.rowIndex,handleSplittableRow:s=()=>e.rowIndex,handleAlreadySlicedRow:a=()=>e.rowIndex}=i,{row:l}=e;return o(l,e)?r({evaluation:e}):n(l,e)?a({evaluation:e}):s({evaluation:e})}function Lo({evaluation:e,splitStartRowIndexes:t,fullPageHeight:i,resolveOverflow:o,debug:n,afterResolve:r}){const{rowIndex:s,tailWindowHeight:a}=e;Ho(this)&&console.log("%c ⚠️ Row has ROWSPAN; use conservative fallback (no slicing)","color:DarkOrange; font-weight:bold");const l=o({rowIndex:s,evaluation:e,availableRowHeight:a,splitStartRowIndexes:t,fullPageHeight:i});return r?.({evaluation:e,tailWindowHeight:a,fullPageHeight:i,result:l}),l}function $o({evaluation:e,splitStartRowIndexes:t,resolveSplitFailure:i,fullPageHeight:o,debug:n}){const{rowIndex:r,row:s,tailWindowHeight:a,delta:l}=e;return Ho(this)&&console.log(`%c Row # ${r} is slice! but don't fit`,"color:DarkOrange; font-weight:bold",s),Ho(this)&&console.warn("%c SUPER BIG","background:red;color:white",l,{part:o}),i({evaluation:e,splitStartRowIndexes:t,availableRowHeight:a,fullPageHeight:o})}function Go({tailWindowHeight:e,minMeaningfulRowSpace:t,fullPartHeight:i,debug:o}){return ethis.sliceNodeBySplitPoints({index:t,rootNode:e,splitPoints:i})),f=a.beginRow||(({originalRow:t,sliceIndex:i})=>{const o=this._DOM.cloneNodeWrapper(t);return r?.({rowWrapper:o,rowIndex:e,sliceIndex:i,originalRow:t}),{rowWrapper:o}}),m=a.cloneCellFallback||(e=>this._DOM.cloneNodeWrapper(e)),b=a.handleCell||(({context:e,cellClone:t})=>{this._DOM.insertAtEnd(e.rowWrapper,t)}),w=a.finalizeRow||(({context:e})=>e.rowWrapper),S=[];if(g.some(e=>Array.isArray(e)&&e.length)){const e=this.paginationBuildBalancedRowSlices({originalRow:t,originalCells:c,splitPointsPerCell:g,sliceCell:_,beginRow:f,cloneCellFallback:m,handleCell:b,finalizeRow:w});S.push(...e)}else Ho(this)&&console.log("🔴 There is no Split");return S.length&&this.markSliceCutsInRows(S),n&&n._&&console.log("%c newRows \n","color:magenta; font-weight:bold",S),{newRows:S,isFirstPartEmptyInAnyTD:u,needsScalingInFullPage:p}}function zo({row:e,rowIndex:t,decorateRowSlice:i}){const o=Array.isArray(e),n=this;return{getParentContainer:()=>o?null:e,getOriginalCells:()=>o?[...e]:[...n._DOM.getChildren(e)],getShellHeights:({cells:t})=>o?[]:n.getTableRowShellHeightByTD(e),markOriginalRow:({cells:t})=>{o||n.markSlice(e)},beginRow:({originalRow:e,sliceIndex:r})=>{if(o)return{cells:[]};const s=n._DOM.cloneNodeWrapper(e);return i?.({rowWrapper:s,rowIndex:t,sliceIndex:r,originalRow:e}),{rowWrapper:s}},cloneCellFallback:e=>n._DOM.cloneNodeWrapper(e),handleCell:({context:e,cellClone:t})=>{o?(n.markSlice(t),e.cells.push(t)):n._DOM.insertAtEnd(e.rowWrapper,t)},finalizeRow:({context:e})=>o?e.cells:e.rowWrapper}}function jo({evaluation:e,splitResult:t,splitStartRowIndexes:i,insufficientRemainingWindow:o,extraCapacity:n,fullPageHeight:r,debug:s,handlers:a={}}){const{newRows:l,isFirstPartEmptyInAnyTD:c,needsScalingInFullPage:h}=t||{},{rowIndex:d,row:g,isLastRow:u,tailWindowHeight:p}=e,{onReplaceRow:_,onAbsorbTail:f,onRefreshRows:m,onPlacement:b,onSplitFailure:w}=a;return Array.isArray(l)&&l.length?(_?.({evaluation:e,newRows:l}),u&&f?.({evaluation:e,newRows:l,extraCapacity:n}),m?.({evaluation:e,newRows:l,splitStartRowIndexes:i}),b?.({evaluation:e,newRows:l,insufficientRemainingWindow:o,isFirstPartEmptyInAnyTD:c,needsScalingInFullPage:h,splitStartRowIndexes:i})??e.rowIndex):(Ho(this)&&console.log(`%c The row is not split. (ROW.${d})`,"color:orange",g),w?.({evaluation:e,splitStartRowIndexes:i,availableRowHeight:p,fullPageHeight:r})??e.rowIndex)}function Vo({evaluation:e,splitStartRowIndexes:t,extraCapacity:i,fullPageHeight:o,minPartLines:n,debug:r,decorateRowSlice:s,onBudgetInfo:a,handlers:l={}}){if(!e||!e.row)return e?.rowIndex??0;const{row:c}=e,h=this.getTableRowHeight(c,n),d=this.paginationCalculateRowSplitBudget({tailWindowHeight:e.tailWindowHeight,minMeaningfulRowSpace:h,fullPartHeight:o,debug:r});a?.({evaluation:e,firstPartHeight:d.firstPartHeight,fullPartHeight:o});const g=l.getRowSliceAdapter,u=g?.({evaluation:e,row:c,rowIndex:e.rowIndex,decorateRowSlice:s}),p=this.paginationSplitRow({rowIndex:e.rowIndex,row:c,firstPartHeight:d.firstPartHeight,fullPageHeight:o,debug:r,decorateRowSlice:s,rowAdapter:u});return this.paginationProcessRowSplitResult({evaluation:e,splitResult:p,splitStartRowIndexes:t,insufficientRemainingWindow:d.insufficientRemainingWindow,extraCapacity:i,fullPageHeight:o,debug:r,handlers:l})}function Uo({evaluation:e,table:t,newRows:i,insufficientRemainingWindow:o,isFirstPartEmptyInAnyTD:n,needsScalingInFullPage:r,splitStartRowIndexes:s,pageBottom:a,fullPageHeight:l,debug:c,resolveRowBounds:h,registerPageStartCallback:d,scaleProblematicSliceCallback:g,applyFullPageScalingCallback:u}){const{rowIndex:p}=e,_=Array.isArray(i)?i[0]:null;if(!_)return d?.({targetIndex:p,reason:"Row split produced empty first slice"}),p-1;const f="function"==typeof h?h:e=>this.resolveRowBoundsGeneric(e,t),{top:m,bottom:b}=f(_),w=this.evaluateRowSplitPlacement({usedRemainingWindow:!o,isFirstPartEmpty:n,firstSliceTop:m,firstSliceBottom:b,pageBottom:a,epsilon:0});return w.placeOnCurrentPage?(w.remainingWindowSpace>0&&g?.(_,w.remainingWindowSpace),d?.({targetIndex:p+1,reason:"Row split — next slice starts new page"})):(u?.({row:_,needsScalingInFullPage:r,fullPageHeight:l}),d?.({targetIndex:p,reason:"Empty first part — move row to next page"})),p-1}const qo="default";class Ko{constructor(){this._bcr=new WeakMap,this._styles=new WeakMap}getBCR(e,t=qo,i){if(!e)return;const o=this._getBucket(this._bcr,e);if(o.has(t))return o.get(t);const n=i?i():e.getBoundingClientRect();return o.set(t,n),n}getStyle(e,t=qo,i){if(!e)return;const o=this._getBucket(this._styles,e);if(o.has(t))return o.get(t);const n=i?i():window.getComputedStyle(e);return o.set(t,n),n}delete(e){e&&(this._bcr.delete(e),this._styles.delete(e))}reset(){this._bcr=new WeakMap,this._styles=new WeakMap}_getBucket(e,t){let i=e.get(t);return i||(i=new Map,e.set(t,i)),i}}class Yo{constructor(){this.measure=new Ko}resetMeasureCache(){this.measure.reset()}}class Xo{constructor({config:e,DOM:t,node:o,selector:n}){this._debug=e.debugMode?{...e.debugConfig.paragraph}:{},this._assert=!!e.consoleAssert,this._DOM=t,this._selector=n,this._node=o,this._minParagraphLeftLines=2,this._minParagraphDanglingLines=2,this._minParagraphBreakableLines=this._minParagraphLeftLines+this._minParagraphDanglingLines||2,Object.assign(this,i)}split(e){return this._splitComplexTextBlockIntoLines(e)}_estimateLineCount(e){return Math.ceil(this._DOM.getElementOffsetHeight(e)/this._node.getLineHeight(e))}_splitComplexTextBlockIntoLines(e){if(this._debug._&&console.group("_splitComplexTextBlockIntoLines",[e]),this._estimateLineCount(e){const t=this._node.getLineHeight(e),i=this._DOM.getElementOffsetHeight(e),o=this._DOM.getElementOffsetLeft(e),n=this._DOM.getElementOffsetTop(e);return{element:e,lines:Math.ceil(i/t),left:o,top:n,height:i,lineHeight:t,text:this._DOM.getInnerHTML(e)}});this._debug._&&console.log("\n🚸 nodeChildren",[...t],"\n🚸 extendedChildrenArray",[...i]);const o=i.flatMap(e=>e.lines>1&&!this._node.isNotBreakable(e.element)?this._breakItIntoLines(e.element):e.element);this._debug._&&console.log("\n🚸🚸🚸\n partiallyLinedChildren",[...o]);const n=o.reduce((e,t,i,o)=>{if(!e.length)return e=[[t]],this._debug._&&console.log("%c➡️ ◼️ start the first line:","font-weight: bold; color: yellow; background-color: #808080;",t),e;const n=e.at(-1);if("BR"===this._DOM.getElementTagName(t))return n.push(t),e.push([]),this._debug._&&console.log("↩️ (BR) add to line last element:",t),e;if(0===n.length)return this._debug._&&console.log("⬆️ add to line 1st element:",t),n.push(t),e;const r=this._node.isVerticalDrop(n.at(-1),t);return r?(e.push([t]),this._debug._&&console.log("%c➡️ ◼️ start new line with current:","font-weight: bold; color: yellow; background-color: #808080;",t),e):r?void this.strictAssert(!0,"groupedPartiallyLinedChildren: An unexpected case of splitting a complex paragraph into lines.","\nOn the element:",t):(this._debug._&&console.log("⬆️ add to line:",t),n.push(t),e)},[]);if(this._debug._&&console.log("🟡🟡🟡 groupedPartiallyLinedChildren \n",n.length,[...n]),n.length{let i;if(0==e.length)i=e[0],i.setAttribute("role","🚫"),this.strictAssert(0==e.length,"The string cannot be empty (_splitComplexTextBlockIntoLines)");else{i=this._node.createTextGroup(),this._DOM.insertBefore(e[0],i),this._DOM.insertAtEnd(i,...e)}return i.dataset.child=t,i});return this.logGroupEnd("OK _splitComplexTextBlockIntoLines"),this._node.setMark(e,"split"),a}_breakItIntoLines(e){if(this._debug._&&console.group("_breakItIntoLines",[e]),this._node.isNoBreak(e))return this.logGroupEnd("isNoBreak"),e;if(this._node.isWrappedTextNode(e)){const t=this._breakWrappedTextNodeIntoLines(e);return this.logGroupEnd("TextNode newLines"),t}return this.logGroupEnd("(recursive _breakItIntoLines)"),this._processNestedInlineElements(e)}_processNestedInlineElements(e){this._debug._&&console.group("_processNestedInlineElements",[e]);const t=this._getNestedInlineChildren(e).flatMap(e=>this._estimateLineCount(e)>1?this._breakItIntoLines(e):e),i=this._findNewLineStarts(t,e),o=i.map((o,n)=>{const r=t[o],s=t[i[n+1]];return this._node.cloneAndCleanOutsideRange(e,r,s)});return this._DOM.insertInsteadOf(e,...o),this.logGroupEnd("Nested Inline parts"),o}_getNestedInlineChildren(e){return[...this._DOM.getChildNodes(e)].reduce((e,t)=>{if(this._node.isSignificantTextNode(t)){const i=this._node.createTextNodeWrapper();return this._DOM.wrap(t,i),e.push(i),e}if(!this._DOM.getElementOffsetParent(t)){const i=this._node.getPreparedChildren(t);return i.length>0&&e.push(...i),e}if(this._DOM.isElementNode(t)){return this._getNestedInlineChildren(t).forEach(t=>e.push(t)),e}},[])}_makeWordsFromTextNode(e){const t=this._node.splitTextByWordsGreedy(e);this._debug._&&console.log("wordArray",t);const i=t.map((e,t)=>this._node.createWord(e+"",t));return this._debug._&&console.log("wrappedWordArray",i),{wordArray:t,wrappedWordArray:i}}_breakWrappedTextNodeIntoLines(e){e.classList.add("🔠_breakItIntoLines"),e.classList.add("🚫_must_be_removed");const{wordArray:t,wrappedWordArray:i}=this._makeWordsFromTextNode(e);this._DOM.setInnerHTML(e,""),this._DOM.insertAtEnd(e,...i);const o=this._findNewLineStarts(i,e),n=o.reduce((i,n,r)=>{const s=this._node.createTextLine(),a=o[r],l=o[r+1],c=t.slice(a,l).join("")+"";return this._DOM.setInnerHTML(s,c),this._DOM.insertBefore(e,s),i.push(s),i},[]);return e.remove(),n}_findNewLineStarts(e,t){const i=t.style.lineHeight;t.style.lineHeight=2;const o=new WeakMap,n=e=>{if(!e)return null;const t=o.get(e);if(t)return t;const i=this._DOM.getElementBCR(e);return o.set(e,i),i},r=e.reduce((t,i,o)=>{const r=o>0?e[o-1]:null,s=o>0?(a=r,n(a)?.bottom):void 0;var a;const l=(e=>n(e)?.top)(i);return o>0&&s<=l&&t.push(o),t},[0]);return t.style.lineHeight=i,r}}function Qo(e){if(e)return"function"==typeof e.getDebug?e.getDebug():e.debug}function Zo(e,t,i="unknown case"){if(!e||"function"!=typeof e.getSplitBottom||"function"!=typeof e.setSplitBottom)throw new Error("updateSplitBottom: adapter must expose getSplitBottom() and setSplitBottom().");const o=e.getSplitBottom();let n;if("number"==typeof t)n=t;else{if(!(t instanceof HTMLElement))throw new Error("updateSplitBottom: unexpected value type: "+typeof t);if("function"!=typeof e.computeSplitBottomForElement)throw new Error("updateSplitBottom: adapter must implement computeSplitBottomForElement(element).");n=e.computeSplitBottomForElement(t)}e.setSplitBottom(n);const r=function(e){return e?"function"==typeof e.getSplitBottomLog?e.getSplitBottomLog():e.splitBottomLog||null:null}(e);Array.isArray(r)&&r.push(n);const s=Qo(e);s&&s._&&console.log(`%c♻️ [${function(e){return e?.label||"👤 [paginator.label] element"}(e)}] update splitBottom (with ${t}) \n • ${i}`,"color: green; font-weight: bold","\n",o||"•••","->",n,r?`\n log: ${r}`:"")}function Jo(e,t,i,o="register page start"){const n=function(e){return e?"function"==typeof e.getRows?e.getRows()||[]:e.rows||[]:[]}(e),r=n.length,s=function(e){return!!e&&("function"==typeof e.shouldAssert?e.shouldAssert():Boolean(e.assert))}(e),a=Qo(e),l=Number.isInteger(t);if(s&&console.assert(l,`registerPageStartAt: index must be an integer, got: ${t}`),!l)return;if(s&&console.assert(r>0,"registerPageStartAt: no rows to register"),0===r)return;if(0===t)return a&&a._&&console.log("%c 📍 Row #0 forced to next page (no short first fragment)","color:green; font-weight:bold"),void((n[0]instanceof HTMLElement||"number"==typeof n[0])&&Zo(e,n[0],`${o} (index=0)`));let c=Math.max(1,Math.min(t,r-1));const h=i.at(-1);if(null!=h&&c<=h&&(c=h+1),c>=r)return void(a&&a._&&console.warn(`registerPageStartAt return: computed index (${c}) >= rowsLen (${r})`,"Last split index should not equal rows.length, or the original table will be empty."));i.push(c),a&&a._&&console.log(`%c 📍 Row # ${c} registered as page start`,"color:green; font-weight:bold");const d=n[c];(d instanceof HTMLElement||"number"==typeof d)&&Zo(e,d,o)}function en({owner:e=null,currentRows:t=[]}={}){return{owner:e,currentRows:Array.isArray(t)?t:[],parts:[]}}function tn({entries:e,part:t,startIndex:i=null,endIndex:o=null,type:n="unknown",rows:r=[],meta:s}){if(!e||!t)return null;const a=function(e){if(e)return Array.isArray(e.parts)||(e.parts=[]),e.parts}(e);if(!a)return null;const l={part:t,type:n,startIndex:i,endIndex:o,rows:Array.isArray(r)?[...r]:[]};return s&&"object"==typeof s&&Object.keys(s).length&&(l.meta={...s}),a.push(l),l}class on{constructor({config:e,DOM:t,node:o,selector:n}){this._debug=e.debugMode?{...e.debugConfig.table}:{},this._assert=!!e.consoleAssert,this._DOM=t,this._selector=n,this._node=o,this._splitLabelHeightFromConfig=e.splitLabelHeight,this._initConstants(),Object.assign(this,i),this._resetCurrent()}split(e,t,i,o,n){this._setCurrent(e,t,i,o);const r=this._splitCurrentTable();return this._resetCurrent(),r}_initConstants(){this._signpostHeight=parseFloat(this._splitLabelHeightFromConfig)||0,this._minPartLines=2}_resetCurrent(){this._currentTable=void 0,this._currentFirstPageBottom=void 0,this._currentFullPageHeight=void 0,this._currentRoot=void 0,this._currentTableEntries=void 0,this._currentTableRecordedParts=void 0,this._currentTableDistributedRows=void 0,this._currentTableFirstPartContentBottom=void 0,this._currentTableFullPartContentHeight=void 0,this._currentTableTfootHeight=void 0,this._currentTableSplitBottom=void 0,this._logSplitBottom_=[],this._currentRowShellCache=void 0,this._currentOverflowHelpers=void 0,this._currentTableHasRowspan=void 0,this._currentTableHasColspan=void 0,this._currentTableInconsistentCells=void 0,this._currentTableHasUnexpectedChildren=void 0}_setCurrent(e,t,i,o){this._currentTable=e,this._currentFirstPageBottom=t,this._currentFullPageHeight=i,this._currentRoot=o,this._currentRowShellCache=new WeakMap,this._currentOverflowHelpers=this._composeOverflowHelpers()}_prepareCurrentTableForSplitting(){this._lockCurrentTableWidths(),this._collectCurrentTableEntries(),this._updateCurrentTableDistributedRows(),this._currentTableRecordedParts=en({owner:this._currentTable,currentRows:this._currentTableDistributedRows}),this._currentTableEntries&&(this._currentTableEntries.recordedParts=this._currentTableRecordedParts),this._currentTable.__html2pdf4docRecordedParts=this._currentTableRecordedParts,this._analyzeCurrentTableStructure(),this._collectCurrentTableMetrics()}_lockCurrentTableWidths(){this._node.lockTableWidths(this._currentTable)}_splitCurrentTable(){this._prepareCurrentTableForSplitting(),this._setCurrentTableFirstSplitBottom(),this._debug._&&console.group("%c📊 _splitCurrentTable()","color:green; background:#eee; padding:3px","\n•",this._currentTableFirstPartContentBottom,"(1st bottom)","\n•",this._currentTableFullPartContentHeight,"(full part height)",{table:this._currentTable,rows:[...this._currentTableDistributedRows],rowCount:this._currentTableDistributedRows.length,entries:this._currentTableEntries,root:this._currentRoot});const e=this._resolveCurrentTableDistributedRowsInPlace();if(this._debug._&&console.log("📊 updated table rows",{rows_new:[...this._currentTableDistributedRows],rowCount_new:this._currentTableDistributedRows.length,splitStartRowIndexes:e}),!e.length)return this.logGroupEnd("[_splitCurrentTable]: there are no splits (!splitStartRowIndexes.length)"),[];let t=this._createTableSlices({splitPoints:e,table:this._currentTable,tableEntries:this._currentTableEntries});return this._node.markSliceCuts([this._currentTable,...t]),this._signpostHeight&&(t=this._extendTableSlices(t)),this._DOM.insertAfter(this._currentTable,...t),this._debug._&&console.log("tableSlices",t),this._debug._&&console.log("[table.split] recordedParts",this._currentTableRecordedParts?.parts),this.logGroupEnd("[_splitCurrentTable]"),[this._currentTable,...t]}_resolveCurrentTableDistributedRowsInPlace(){let e=[];for(let t=0;tNumber.isInteger(e)&&e>0&&e<=this._currentTableDistributedRows.length),"splitStartRowIndexes contains invalid indexes"),this.strictAssert(e.every((e,t,i)=>0===t||e>i[t-1]),"splitStartRowIndexes must be strictly ascending and without duplicates"),this.strictAssert(e.at(-1)!==this._currentTableDistributedRows.length,"Last split index should not equal rows.length, or the original table will be empty."),e}_evaluateAndResolveRow(e,t){const i=e,o=this._currentTableDistributedRows.length;this._debug._&&console.groupCollapsed(`🔲 %c Check the Row # ${i} (from ${o})`,"");const n=this._node.paginationBuildRowEvaluationContext({rows:this._currentTableDistributedRows,rowIndex:e,table:this._currentTable,splitBottom:this._currentTableSplitBottom});if(!n?.row)return console.warn("[table.split] Missing row during evaluation.",{rowIndex:e}),this.logGroupEnd(`Row # ${i} (from ${o}) is checked`),e;if(this._debug._){const e=n.fitsCurrentWindow,t=e?"green":"orange",i=e?"<=":">";console.log(`%c📐 does row fit? %c ${e} %c :: ${n.nextMarker} ${i} ${this._currentTableSplitBottom} %c(Δ=${n.delta})`,"",`font-weight:bold;color:${t};`,"",`color:${t};`)}if(this._debug._&&console.info({row:n.row,rows:[...this._currentTableDistributedRows]}),n.fitsCurrentWindow)return this._debug._&&console.log(`%c ✓ Row # ${e}: PASS`,"color:green"),this.logGroupEnd(`Row # ${i} (from ${o}) is checked`),e;const r=this._node.calculateFinalPartReclaimedHeight({signpostHeight:this._signpostHeight,tfootHeight:this._currentTableTfootHeight});if(this._node.paginationCanAbsorbLastRow({evaluation:n,extraCapacity:r,splitBottom:this._currentTableSplitBottom,debug:this._debug}))return this._debug._&&console.log("🫟 last-row-fits-without-bottom-signpost: skip split"),this.logGroupEnd(`Row # ${i} (from ${o}) is checked`),e;const s=this._resolveOverflowingRow({evaluation:n,splitStartRowIndexes:t,extraCapacity:r});return this.logGroupEnd(`Row # ${i} (from ${o}) is checked`),s}_resolveOverflowingRow({evaluation:e,splitStartRowIndexes:t,extraCapacity:i}){return this._node.paginationResolveOverflowingRow({evaluation:e,utils:{rowHasSpan:e=>this._rowHasSpan(e),isSlice:e=>this._node.isSlice(e)},handlers:{handleRowWithRowspan:()=>this._node.paginationResolveRowWithRowspan({evaluation:e,splitStartRowIndexes:t,fullPageHeight:this._currentTableFullPartContentHeight,resolveOverflow:({evaluation:e,splitStartRowIndexes:t,availableRowHeight:i,fullPageHeight:o})=>this._forwardOverflowFallback({rowIndex:e.rowIndex,row:e.row,availableRowHeight:i,fullPageHeight:o,splitStartRowIndexes:t,reasonTail:"Row with ROWSPAN — move to next page",reasonFull:"Row with ROWSPAN — scaled TDs to full page",branch:"rowspan"}),debug:this._debug,afterResolve:({tailWindowHeight:e,fullPageHeight:t})=>{this._debug._&&e>=t&&console.warn("[table.fallback] ROWSPAN row required full-page scaling to fit.")}}),handleSplittableRow:()=>this._resolveSplittableRow({evaluation:e,splitStartRowIndexes:t,extraCapacity:i}),handleAlreadySlicedRow:()=>this._node.paginationResolveAlreadySlicedRow({evaluation:e,splitStartRowIndexes:t,fullPageHeight:this._currentTableFullPartContentHeight,debug:this._debug,resolveSplitFailure:({evaluation:e,splitStartRowIndexes:t,availableRowHeight:i,fullPageHeight:o})=>this._forwardOverflowFallback({rowIndex:e.rowIndex,row:e.row,availableRowHeight:i,fullPageHeight:o,splitStartRowIndexes:t,reasonTail:"Slice doesn't fit tail — move to next page",reasonFull:"Scaled TD content to fit full page",branch:"alreadySliced"})})}})}_resolveSplittableRow({evaluation:e,splitStartRowIndexes:t,extraCapacity:i}){const{rowIndex:o}=e;this._debug._&&console.group(`%c 🔳 Try to split the ROW ${o} %c (from ${this._currentTableDistributedRows.length})`,"color:magenta;","");const n=this._node.paginationResolveSplittableRow({evaluation:e,splitStartRowIndexes:t,extraCapacity:i,fullPageHeight:this._currentTableFullPartContentHeight,minPartLines:this._minPartLines,debug:this._debug,decorateRowSlice:({rowWrapper:e,rowIndex:t,sliceIndex:i})=>{this._DOM.setAttribute(e,`.splitted_row_${t}_part_${i}`)},onBudgetInfo:({evaluation:e,firstPartHeight:t,fullPartHeight:i})=>{this._debug._&&console.info({currRowTop:e.rowTop,"• splitBottom":this._currentTableSplitBottom,"• is row sliced?":!1,"remaining page space":e.tailWindowHeight,"first part height":t,"full part height":i})},handlers:{onReplaceRow:({evaluation:e,newRows:t})=>{this._replaceRowInDOM(e.row,t)},onAbsorbTail:({newRows:e,extraCapacity:t})=>{this._node.absorbShortTrailingSliceIfFits({slices:e,extraCapacity:t,ownerLabel:"table",debug:this._debug})},onRefreshRows:({evaluation:e,newRows:t})=>{this._node.paginationRefreshRowsAfterSplit(this._getSplitterAdapter(),{rowIndex:e.rowIndex,rowSlices:t})},onPlacement:({evaluation:e,newRows:i,insufficientRemainingWindow:o,isFirstPartEmptyInAnyTD:n,needsScalingInFullPage:r})=>this._node.paginationHandleRowSlicesPlacement({evaluation:e,table:this._currentTable,newRows:i,insufficientRemainingWindow:o,isFirstPartEmptyInAnyTD:n,needsScalingInFullPage:r,splitStartRowIndexes:t,pageBottom:this._currentTableSplitBottom,fullPageHeight:this._currentTableFullPartContentHeight,debug:this._debug,registerPageStartCallback:({targetIndex:e,reason:i})=>this._registerPageStartAt(e,t,i),scaleProblematicSliceCallback:(e,t)=>{t>0&&(this._debug._&&console.log("⚖️ scaleProblematicCellsToHeight"),this._scaleProblematicCellsToHeight(e,t,this._getRowShellHeights(e)))},applyFullPageScalingCallback:({row:e,needsScalingInFullPage:t,fullPageHeight:i})=>{this._node.paginationApplyFullPageScaling({needsScalingInFullPage:t&&Boolean(e),payload:{row:e,targetHeight:i},scaleCallback:({row:e,targetHeight:t})=>(this._debug._&&console.log("⚖️ scaleProblematicCellsToHeight"),this._scaleProblematicCellsToHeight(e,t,this._getRowShellHeights(e)))})}}),onSplitFailure:({evaluation:e,splitStartRowIndexes:t,availableRowHeight:i,fullPageHeight:o})=>this._forwardOverflowFallback({rowIndex:e.rowIndex,row:e.row,availableRowHeight:i,fullPageHeight:o,splitStartRowIndexes:t,reasonTail:"Split failed — move row to next page",reasonFull:"Scaled TDs to fit full-page",branch:"splitFailure"})}});return this.logGroupEnd(`🔳 Try to split the ROW ${o} (from ${this._currentTableDistributedRows.length})`),n}_collectCurrentTableEntries(){this._currentTableEntries=this._node.getTableEntries(this._currentTable)}_rowHasSpan(e){const t=[...this._DOM.getChildren(e)];for(const e of t){const t=this._DOM.getElementTagName(e);if("TD"!==t&&"TH"!==t)continue;const i=parseInt(e.getAttribute("rowspan"));if(Number.isFinite(i)&&i>1)return!0}return!1}_collectCurrentTableMetrics(){const e=this._node.getEmptyNodeHeightByProbe(this._currentTable,'',!1),t=this._node.getTopForPageStartCandidate(this._currentTable,this._currentRoot),i=(this._node.getTopWithMargin(this._currentTable,this._currentRoot),this._DOM.getElementOffsetHeight(this._currentTableEntries.caption)||0),o=this._DOM.getElementOffsetTop(this._currentTableDistributedRows[0],this._currentTable)-i||0;this._currentTableTfootHeight=this._DOM.getElementOffsetHeight(this._currentTableEntries.tfoot)||0,this._currentTableFirstPartContentBottom=this._currentFirstPageBottom-t-e-this._signpostHeight,this._currentTableFullPartContentHeight=this._currentFullPageHeight-i-o-this._currentTableTfootHeight-e-2*this._signpostHeight}_getDistributedRows(e){return[...e.rows,...e.tfoot?[e.tfoot]:[]]}_updateCurrentTableDistributedRows(){this._currentTableDistributedRows=this._getDistributedRows(this._currentTableEntries)}_analyzeCurrentTableStructure(){this._currentTableEntries;const e=this._currentTableDistributedRows||[],t=this._node.computeRowFlags({rows:e,DOM:this._DOM,cellTagFilter:(e,t)=>"TFOOT"!==this._DOM.getElementTagName(t.parentNode)&&("TD"===e||"TH"===e)});this._currentTableHasRowspan=t.hasRowspan,this._currentTableHasColspan=t.hasColspan,this._currentTableInconsistentCells=t.inconsistentCells,this._debug._&&(t.hasRowspan&&console.warn("[table.guard] ROWSPAN detected — slicing not implemented; applying conservative fallback.",{table:this._currentTable}),t.hasColspan&&console.warn("[table.guard] COLSPAN present — handled within-row slicing; monitor results.",{table:this._currentTable}),t.inconsistentCells&&console.warn("[table.guard] Inconsistent cell counts across rows — results may vary.",{table:this._currentTable}))}_updateCurrentTableEntriesAfterSplit(e,t){this._currentTableEntries.rows.splice(e,1,...t)}_setCurrentTableFirstSplitBottom(){this._node.getTop(this._currentTableDistributedRows[0],this._currentTable)>this._currentTableSplitBottom?(this._updateCurrentTableSplitBottom(this._currentTableFullPartContentHeight,"SPECIAL CASE: start immediately from the full height of the page"),this._debug._&&console.log("The Row 0 goes to the 2nd page")):this._updateCurrentTableSplitBottom(this._currentTableFirstPartContentBottom,"start with a short first part")}_getPaginatorAdapter(){return{label:"table",getSplitBottom:()=>this._currentTableSplitBottom,setSplitBottom:e=>{this._currentTableSplitBottom=e},computeSplitBottomForElement:e=>this._node.getTop(e,this._currentTable)+this._currentTableFullPartContentHeight,getRows:()=>this._currentTableDistributedRows,shouldAssert:()=>this._assert,getDebug:()=>this._debug,getSplitBottomLog:()=>this._logSplitBottom_}}_getSplitterAdapter(){const e=()=>({rows:this._currentTableDistributedRows||[],DOM:this._DOM,cellTagFilter:(e,t)=>{const i=t?.parentNode;return"TFOOT"!==(i?this._DOM.getElementTagName(i):void 0)&&("TD"===e||"TH"===e)}});return{label:"table",rows:{getCurrentRows:()=>this._currentTableDistributedRows||[],replaceRow:({rowIndex:e,rowSlices:t})=>{this._node.applyRowSlicesToEntriesAfterRowSplit(this._currentTableEntries,e,t)},syncEntries:()=>{this._updateCurrentTableDistributedRows(),this._currentTableRecordedParts&&(this._currentTableRecordedParts.currentRows=this._currentTableDistributedRows)},getGuardConfig:e,onRowsChanged:()=>{this._currentTableRecordedParts&&(this._currentTableRecordedParts.currentRows=this._currentTableDistributedRows)}},guards:{getConfig:e,onFlags:({flags:e})=>{e&&(this._currentTableHasRowspan=Boolean(e.hasRowspan),this._currentTableHasColspan=Boolean(e.hasColspan),this._currentTableInconsistentCells=Boolean(e.inconsistentCells))}}}}_updateCurrentTableSplitBottom(e,t="unknown case"){Zo(this._getPaginatorAdapter(),e,t)}_registerPageStartAt(e,t,i="register page start"){Jo(this._getPaginatorAdapter(),e,t,i)}_composeOverflowHelpers(){const e=this._node.scaleCellsToHeight.bind(this._node),t=this._getRowShellHeights.bind(this),i={ownerLabel:"table",registerPageStartCallback:this._registerPageStartAt.bind(this),debugLogger:this._debug&&this._debug._?(e,t)=>console.log(e,t):void 0,scaleProblematicCellsCallback:(i,o,n)=>this._node.scaleRowCellsToHeight({ownerLabel:"table",DOM:this._DOM,row:i,targetHeight:o,cachedShells:n,getRowShellHeightsCallback:t,scaleCellsToHeightCallback:e})};return this._currentOverflowHelpers=i,i}_scaleProblematicCellsToHeight(e,t,i){return(this._currentOverflowHelpers||this._composeOverflowHelpers()).scaleProblematicCellsCallback(e,t,i)}_forwardOverflowFallback({rowIndex:e,row:t,availableRowHeight:i,fullPageHeight:o,splitStartRowIndexes:n,reasonTail:r,reasonFull:s,branch:a}){const l=this._currentOverflowHelpers||this._composeOverflowHelpers(),c={ownerLabel:`table:${a}`,rowIndex:e,row:t,availableRowHeight:i,fullPageHeight:o,splitStartRowIndexes:n,reasonTail:r,reasonFull:s,registerPageStartCallback:l.registerPageStartCallback,scaleProblematicCellsCallback:l.scaleProblematicCellsCallback,debugLogger:l.debugLogger};return this._debug._&&console.log(`%c[table.overflow] branch=${a} rowIndex=${e} tail=${i} full=${o}`,"color:orange; font-weight:bold",{reasonTail:r,reasonFull:s}),"splitFailure"===a?this._node.handleRowSplitFailure(c):this._node.handleRowOverflow(c)}_getRowShellHeights(e){if(!this._currentRowShellCache)return this._node.getTableRowShellHeightByTD(e);if(this._currentRowShellCache.has(e))return this._currentRowShellCache.get(e);const t=this._node.getTableRowShellHeightByTD(e);return this._currentRowShellCache.set(e,t),t}_createTableSlice({startId:e,endId:t,table:i,tableEntries:o}){this._debug._&&console.group(`[CREATE Table Slice] range: [${e}, ${t})`),this.strictAssert(Number.isInteger(e)&&(Number.isInteger(t)||t===1/0),`[createTableSlice] invalid bounds: startId=${e}, endId=${t}`);const n=o&&o.rows?o.rows.length:0;this.strictAssert(n>=0,`[createTableSlice]: invalid rows length: ${n}`),this.strictAssert(e>0&&t>0&&ethis._createTableSlice({startId:e,endId:o===n.length-1?1/0:n[o+1],table:t,tableEntries:i}))}_extendTableSlices(e){return e.reduce((e,t,i,o)=>{const n=0===i,r=i===o.length-1;return n&&e.push(this._createBottomSignpost()),e.push(this._node.createForcedPageBreak()),e.push(this._createTopSignpost()),e.push(t),!r&&e.push(this._createBottomSignpost()),e},[])}_createTopSignpost(){return this._node.createSignpost("(table continued)",this._signpostHeight)}_createBottomSignpost(){return this._node.createSignpost("(table continues on the next page)",this._signpostHeight)}_replaceRowInDOM(e,t){this._debug._&&this._DOM.setAttribute(e,".🚫_must_be_removed"),this._DOM.insertInsteadOf(e,...t)}}class nn{constructor({config:e,DOM:t,node:i,selector:o}){this._debug=e.debugMode?{...e.debugConfig.tableLike}:{},this._DOM=t,this._selector=o,this._node=i,this._minLeftLines=2,this._minDanglingLines=2,this._minBreakableLines=this._minLeftLines+this._minDanglingLines,this._minLeftRows=1,this._minDanglingRows=1,this._minBreakableRows=1,this._minPreFirstBlockLines=3,this._minPreLastBlockLines=3,this._minPreBreakableLines=this._minPreFirstBlockLines+this._minPreLastBlockLines,this._minBreakableGridRows=4,this._imageReductionRatio=.8,this._signpostHeight=parseFloat(e.splitLabelHeight)||0}split(e,t,i,o,n){const r=n||this._DOM.getComputedStyle(e);this._debug._&&console.log("root",o);const s=this._node.getPreparedChildren(e),a=this._node.getTop(e,o),l=this._node.getEmptyNodeHeightByProbe(e),c=i-l;let h=s,d=0,g=[],u=t-a-l;const p=r.position;"relative"!=p&&this._DOM.setStyles(e,{position:"relative"});for(let t=0;tu&&(t&&g.push(t),t&&(d+=1),u=t?this._node.getTop(i,e)+c:c)}if(this._DOM.setStyles(e,{position:p}),!g.length)return this._debug._&&console.log("splitters.length",g.length),[];g.push(null);const _=g.map((t,i,o)=>{const n=this._node.createSliceWrapper(e),r=o[i-1]||0,s=t||o[o.length];return this._DOM.insertAtEnd(n,...h.slice(r,s)),n});return this._node.markSliceCuts(_),this._DOM.replaceNodeContentsWith(e,..._),this._DOM.removeAllClasses(e),this._DOM.removeAllStyles(e),this._DOM.setStyles(e,{display:"contents"}),this._DOM.setAttribute(e,"[slough-node]",""),_}}class rn{constructor({config:e,DOM:t,node:o,selector:n}){this._debug=e.debugMode?{...e.debugConfig.grid}:{},this._assert=!!e.consoleAssert,Object.assign(this,i),this._DOM=t,this._selector=n,this._node=o,this._resetCurrent(),this._minBreakableGridRows=1,this._minGridRowContentLines=2,this._gridCellLineHeightCache=new WeakMap,this._gridComputedStyleCache=new WeakMap,this._signpostHeight=parseFloat(e.splitLabelHeight)||0}split(e,t,i,o,n){this._resetCurrent(),this._debug._&&console.group("%c split Grid Node","background:#00FFFF",e);const r=this._node.getPreparedChildren(e);this._node.lockNodesWidths(r);const s=n||this._getComputedStyleCached(e);if(!r.length)return this._node.setInitStyle(!1,e,s),this._debug._&&console.groupEnd(),[];this._node.setInitStyle(!0,e,s);const a=this._scanGridLayout(e,s);if(!a.safe)return this._debug._&&console.warn("[grid.split] skip unsafe layout",a),this._debug._&&console.warn("[grid.split] Unsupported grid layout detected; keeping original grid intact.",a),this._node.setInitStyle(!1,e,s),this._debug._&&console.groupEnd(),[];const l=[];let c=!1,h=!1;const d=new Set;let g=null,u=null,p=null;r.forEach(t=>{const i=this._getComputedStyleCached(t),o=parseInt(i.gridRowStart,10),n=Number.isFinite(o),r=this._node.getTop(t,e),s=this._node.getBottom(t,e);let a=!1;a=!l.length||(n&&null!=g?o!==g:null!=p?r>=p-.5:null==u||Math.abs(r-u)>.5),a?(l.push([t]),g=n?o:null,u=r,p=s):(l[l.length-1].push(t),n&&null==g&&(g=o),(null==u||rp)&&(p=s));const _=i.gridRowEnd||"",f=i.gridColumnEnd||"";c=c||_.includes("span"),h=h||f.includes("span"),n&&d.add(o)});const _=d.size>0&&Math.max(...d)>l.length;if(_)return this._debug._&&console.warn("[grid.split]","Unsupported implicit row gap detected; keeping grid unsplit.",{hasImplicitRowGaps:_}),this._node.setInitStyle(!1,e,s),this._debug._&&console.groupEnd(),[];if(c||h)return this._debug._&&console.warn("[grid.split]","Grid contains row/column spans; using fallback (move row to next page).",{hasRowSpan:c,hasColumnSpan:h}),this._debug._&&console.groupEnd(),this._fallbackMoveGridToNextPage({gridNode:e,nodeComputedStyle:s});this.log("grid.split","currentRows:",l);const f=this._node.getTop(e,o),m=this._node.getEmptyNodeHeightByProbe(e),b=t-f-m,w=i-m;if(this.log("grid.split",{firstPartHeight:b,fullPagePartHeight:w}),this._currentGridNode=e,this._currentGridRows=l,this._currentGridFullPartHeight=w,this._currentGridSplitLog=[],this._currentGridEntries=en({owner:e,currentRows:l}),this._currentGridRecordedParts=this._currentGridEntries,this._currentGridNode.__html2pdf4docRecordedParts=this._currentGridRecordedParts,this._currentGridShellCache=new WeakMap,l.length0?Math.floor(t):1;let n=0;return()=>{if(n+=1,n<=o)return;const t={label:e,iterations:n,limit:o};throw i&&console.assert(!1,`\n\n ⛔ [${e}] ♾️ loop guard triggered`,t),new Error(`\n ⛔ [${e}] ♾️ loop guard triggered`)}}({label:"grid.split",limit:Math.max(1,6*(l.length||1)),assert:this._assert});this._updateCurrentGridSplitBottom(b,"start with initial window");for(let t=0;tthis._buildGridSplit({startId:o[i-1]||0,endId:t,node:e,entries:M})).filter(Boolean).map(e=>e.part),this._createAndInsertGridFinalSlice({node:e,entries:M,startId:P})];return this.log("grid.split",{splitStartRowIndexes:S,splits:C,recordedParts:this._currentGridRecordedParts?.parts}),this._node.setInitStyle(!1,e,s),this._resetCurrent(),this.logGroupEnd("split Grid Node"),C}_fallbackMoveGridToNextPage({gridNode:e,nodeComputedStyle:t}){return this._node.setInitStyle(!1,e,t),this._resetCurrent(),[]}_resetCurrent(){this._currentGridNode=void 0,this._currentGridRows=void 0,this._currentGridEntries=void 0,this._currentGridRecordedParts=void 0,this._currentGridSplitBottom=void 0,this._currentGridFullPartHeight=void 0,this._currentGridSplitLog=void 0,this._currentGridRowFlags=void 0,this._currentGridShellCache=void 0,this._gridCellLineHeightCache=new WeakMap,this._gridComputedStyleCache=new WeakMap}_getGridSplittableHandlers({evaluation:e,splitStartRowIndexes:t}){return{getRowSliceAdapter:({row:t})=>this._createGridRowSliceAdapter({row:t,rowIndex:e.rowIndex}),onReplaceRow:({newRows:t})=>{this._removeOriginalGridRowCells(e.row),this._node.paginationRefreshRowsAfterSplit(this._getSplitterAdapter(),{rowIndex:e.rowIndex,rowSlices:t})},onAbsorbTail:()=>{},onRefreshRows:({newRows:t})=>{this._node.paginationRefreshRowsAfterSplit(this._getSplitterAdapter(),{rowIndex:e.rowIndex,rowSlices:t})},onPlacement:({evaluation:e,newRows:i,insufficientRemainingWindow:o,isFirstPartEmptyInAnyTD:n,needsScalingInFullPage:r})=>this._node.paginationHandleRowSlicesPlacement({evaluation:e,table:this._currentGridNode,newRows:i,insufficientRemainingWindow:o,isFirstPartEmptyInAnyTD:n,needsScalingInFullPage:r,splitStartRowIndexes:t,pageBottom:this._currentGridSplitBottom,fullPageHeight:this._currentGridFullPartHeight,debug:this._debug,resolveRowBounds:e=>this._getRowBounds(e,this._currentGridNode),registerPageStartCallback:({targetIndex:e,reason:i})=>this._registerPageStartAt(e,t,i),scaleProblematicSliceCallback:(e,t)=>this._scaleGridCellsToHeight(e,t),applyFullPageScalingCallback:({row:e,needsScalingInFullPage:t,fullPageHeight:i})=>{this._node.paginationApplyFullPageScaling({needsScalingInFullPage:t&&Boolean(e),payload:{cells:e,targetHeight:i},scaleCallback:({cells:e,targetHeight:t})=>this._scaleGridCellsToHeight(e,t)})}}),onSplitFailure:({evaluation:e,splitStartRowIndexes:t,availableRowHeight:i,fullPageHeight:o})=>this._forwardGridOverflowFallback({evaluation:e,splitStartRowIndexes:t,availableRowHeight:i,fullPageHeight:o,branch:"splitFailure"})}}_forwardGridOverflowFallback({evaluation:e,splitStartRowIndexes:t,availableRowHeight:i,fullPageHeight:o=this._currentGridFullPartHeight,branch:n,reasonTail:r,reasonFull:s}){const a=this._composeGridOverflowHelpers(),l={ownerLabel:`grid:${n}`,gridNode:this._currentGridNode,evaluation:e,rowIndex:e.rowIndex,row:e.row,availableRowHeight:i,fullPageHeight:o,splitStartRowIndexes:t,reasonTail:r||("splitFailure"===n?"Grid split failed — move row to next page":"Grid slice overflow — move row to next page"),reasonFull:s||("splitFailure"===n?"Grid split failed — scaled cells to full page":"Grid slice overflow — scaled cells to full page"),registerPageStartCallback:a.registerPageStartCallback,scaleProblematicCellsCallback:a.scaleProblematicCellsCallback,debugLogger:a.debugLogger};return this._debug._&&console.log("[grid.overflow]",n,l),"splitFailure"===n?this._node.handleRowSplitFailure(l):this._node.handleRowOverflow(l)}_buildGridRowEvaluation({rows:e,rowIndex:t,gridNode:i,splitBottom:o}){if(!Array.isArray(e))return null;const n=e[t];if(!n)return null;const r=Array.isArray(n)?new Array(n.length):null,{top:s,bottom:a}=this._getRowBounds(n,i),l=e[t+1],c=l?this._getRowTop(l,i):a,h=c-o;return{rowIndex:t,row:n,rowTop:s,rowBottom:a,nextMarker:c,delta:h,tailWindowHeight:o-s,isLastRow:!l,fitsCurrentWindow:h<=0,cellStyles:r}}_composeGridOverflowHelpers(){return{registerPageStartCallback:this._registerPageStartAt.bind(this),scaleProblematicCellsCallback:(e,t)=>!!Array.isArray(e)&&this._scaleGridCellsToHeight(e,t),debugLogger:this._debug&&this._debug._?(e,t)=>console.log(e,t):void 0}}_resolveGridOverflowingRow({evaluation:e,splitStartRowIndexes:t}){return this._node.paginationResolveOverflowingRow({evaluation:e,utils:{rowHasSpan:()=>!1,isSlice:e=>this._isGridRowSlice(e)},handlers:{handleRowWithRowspan:()=>(this._debug._&&console.warn("[grid.split] ROWSPAN guard triggered unexpectedly.",{evaluation:e}),this._registerPageStartAt(e.rowIndex,t,"Grid ROWSPAN fallback — move row to next page"),e.rowIndex-1),handleSplittableRow:()=>this._resolveGridSplittableRow({evaluation:e,splitStartRowIndexes:t}),handleAlreadySlicedRow:()=>this._forwardGridOverflowFallback({evaluation:e,splitStartRowIndexes:t,branch:"alreadySliced"})}})}_resolveGridSplittableRow({evaluation:e,splitStartRowIndexes:t}){const{rowIndex:i}=e;this._debug._&&console.group("%c[grid.split] Stage5 — splittable row","color:#0080ff",{rowIndex:i,row:e.row,tailWindowHeight:e.tailWindowHeight});const o=this._estimateGridRowMeaningfulSpace({row:e.row,cellStyles:e.cellStyles,minContentLines:this._minGridRowContentLines});if(!(o>0))return console.warn("[grid.metrics] Meaningful row space is unavailable; falling back to overflow handler."),this._forwardGridOverflowFallback({evaluation:e,splitStartRowIndexes:t,availableRowHeight:e.tailWindowHeight,fullPageHeight:this._currentGridFullPartHeight,branch:"metricsMissing",reasonTail:"Grid row metrics missing — move row to next page",reasonFull:"Grid row metrics missing — scaled cells to full page"});const n=this._node.paginationCalculateRowSplitBudget({tailWindowHeight:e.tailWindowHeight,minMeaningfulRowSpace:o,fullPartHeight:this._currentGridFullPartHeight,debug:this._debug}),r=this._node.paginationSplitRow({rowIndex:i,row:e.row,firstPartHeight:n.firstPartHeight,fullPageHeight:this._currentGridFullPartHeight,debug:this._debug,decorateRowSlice:({rowWrapper:e,rowIndex:t,sliceIndex:i})=>{e instanceof HTMLElement&&this._DOM.setAttribute(e,`.grid_row_${t}_part_${i}`)},rowAdapter:this._createGridRowSliceAdapter({row:e.row,rowIndex:i,cellStyles:e.cellStyles})}),s=this._node.paginationProcessRowSplitResult({evaluation:e,splitResult:r,splitStartRowIndexes:t,insufficientRemainingWindow:n.insufficientRemainingWindow,extraCapacity:0,fullPageHeight:this._currentGridFullPartHeight,debug:this._debug,handlers:this._getGridSplittableHandlers({evaluation:e,splitStartRowIndexes:t})});return this.logGroupEnd("[grid.split] Stage5 — splittable row"),s}_createGridRowSliceAdapter({row:e,rowIndex:t,cellStyles:i}){if(!Array.isArray(e))return null;const o=this._currentGridNode,n=e[0]||null,r=this;return{getParentContainer:()=>o,getOriginalCells:()=>[...e],getShellHeights:()=>r._getGridShellHeights(e,i),markOriginalRow:({cells:e})=>{e.forEach(e=>r._node.markSlice(e))},beginRow:()=>({fragment:r._DOM.createDocumentFragment(),cells:[]}),cloneCellFallback:e=>r._DOM.cloneNodeWrapper(e),handleCell:({context:e,cellClone:t})=>{r._node.markSlice(t),e.fragment.append(t),e.cells.push(t)},finalizeRow:({context:e})=>(n&&r._DOM.insertBefore(n,e.fragment),e.cells)}}_removeOriginalGridRowCells(e){Array.isArray(e)&&e.forEach(e=>{e instanceof HTMLElement&&this._DOM.removeNode(e)})}_isGridRowSlice(e){if(Array.isArray(e)){const t=e.find(e=>e instanceof HTMLElement);return!!t&&this._node.isSlice(t)}return!!e&&this._node.isSlice(e)}_getPaginatorAdapter(){return{label:"grid",getSplitBottom:()=>this._currentGridSplitBottom,setSplitBottom:e=>{this._currentGridSplitBottom=e},computeSplitBottomForElement:e=>e&&this._currentGridNode?this._node.getTop(e,this._currentGridNode)+(this._currentGridFullPartHeight||0):this._currentGridSplitBottom||0,getRows:()=>Array.isArray(this._currentGridRows)?this._currentGridRows.map(e=>{if(!e)return null;if(e instanceof HTMLElement)return e;if(Array.isArray(e)){const t=e.find(e=>e instanceof HTMLElement);if(t)return t;const i=this._getRowTop(e,this._currentGridNode);return Number.isFinite(i)?i:null}const t=this._getRowTop(e,this._currentGridNode);return Number.isFinite(t)?t:null}):[],shouldAssert:()=>this._assert,getDebug:()=>this._debug,getSplitBottomLog:()=>this._currentGridSplitLog}}_getSplitterAdapter(){return{label:"grid",rows:{getCurrentRows:()=>this._currentGridRows||[],replaceRow:({rowIndex:e,rowSlices:t})=>{Array.isArray(this._currentGridRows)&&this._node.replaceCurrentRowsAfterRowSplit({currentRows:this._currentGridRows,index:e,rowSlices:t})},syncEntries:()=>{this._currentGridEntries&&(this._currentGridEntries.currentRows=this._currentGridRows),this._currentGridRecordedParts&&(this._currentGridRecordedParts.currentRows=this._currentGridRows)},getGuardConfig:()=>({rows:this._currentGridRows||[],DOM:this._DOM})},guards:{onFlags:({flags:e})=>{this._currentGridRowFlags=e}}}}_updateCurrentGridSplitBottom(e,t="unknown case"){Zo(this._getPaginatorAdapter(),e,t)}_registerPageStartAt(e,t,i="register page start"){Jo(this._getPaginatorAdapter(),e,t,i)}_scaleGridCellsToHeight(e,t){if(!(Array.isArray(e)&&e.length&&t>0))return!1;const i=this._getGridShellHeights(e),o=this._debug._?e.map(e=>this._DOM.getElementOffsetHeight(e)):null,n=this._node.paginationScaleCellsToHeight({cells:e,targetHeight:t,shells:i});if(this._debug._){const r=e.map(e=>this._DOM.getElementOffsetHeight(e));console.log("[grid.scaleCells] target:",t,"shells:",i,"before:",o,"after:",r,"scaled:",n)}return n}_buildGridSplit({startId:e,endId:t,node:i,entries:o}){const n=o?.currentRows||this._currentGridRows||[];if(e===t)return this._debug._&&console.warn("[grid.split] _buildGridSplit: skip empty slice request",e,t),this.strictAssert(!1,"[grid.split] _buildGridSplit: empty slice encountered"),null;if(this._debug._){const i=n.slice(e,t);console.log(`=> [grid.split] _buildGridSplit: slice rows [${e}, ${t})`,i)}const r=this._createAndInsertGridSlice({startId:e,endId:t,node:i,entries:o}),s=this._collectGridTelemetryRows(n,e,t);return this._recordGridPart(r,{startId:e,endId:t,type:"slice",rows:s}),{part:r,telemetryRows:s}}_createAndInsertGridSlice({startId:e,endId:t,node:i,entries:o}){const n=this._DOM.cloneNodeWrapper(i);this._node.copyNodeWidth(n,i),this._node.markNoBreak(n),e&&this._node.markTopCut(n),this._node.markBottomCut(n),i.before(n);const r=o?.currentRows||fallbackCurrentRows||[],s=this&&this._DOM&&"function"==typeof this._DOM.isElementNode?this._DOM.isElementNode.bind(this._DOM):null,a=r.slice(e,t).flat().map(e=>{if(!e)return null;if(s&&s(e))return e;if("undefined"!=typeof HTMLElement&&e instanceof HTMLElement)return e;const t=e.element;if(t){if(s&&s(t))return t;if("undefined"!=typeof HTMLElement&&t instanceof HTMLElement)return t}return null}).filter(Boolean);return this._DOM.insertAtEnd(n,...a),n}_createAndInsertGridFinalSlice({node:e,entries:t,startId:i}){const o=e;this._node.markTopCut(o),this._node.markNoBreak(o);const n=t?.currentRows||this._currentGridRows||[],r=this._collectGridTelemetryRows(n,i);return this._recordGridPart(o,{startId:i,endId:n.length,type:"final",rows:r}),o}_collectGridTelemetryRows(e,t,i){if(!Array.isArray(e))return[];return e.slice(t,"number"==typeof i?i:void 0).map((e,i)=>{const o=Array.isArray(e)?[...e]:[e];return{rowIndex:t+i,row:e,cells:o}})}_recordGridPart(e,t={}){const i=this._currentGridRecordedParts;if(!i||!e)return null;const{startId:o=null,endId:n=null,type:r="unknown",rows:s=[],meta:a}=t||{};return tn({entries:i,part:e,startIndex:o,endIndex:n,type:r,rows:s,meta:a})}_estimateGridRowMeaningfulSpace({row:e,cellStyles:t=null,minContentLines:i=this._minGridRowContentLines}){if(!Array.isArray(e)||0===e.length)return console.warn("[grid.metrics] Row payload missing while estimating split budget."),null;const o=this._getGridShellHeights(e,t),n=Array.isArray(t)?t:null,r=Math.max(1,i);let s=0;return e.forEach((e,t)=>{if(!(e instanceof HTMLElement))return void console.warn("[grid.metrics] Unexpected non-element cell in row; ignoring during split budget calculation.",{cell:e,index:t});let i=n?n[t]:null;i||(i=this._getComputedStyleCached(e),n&&(n[t]=i));const a=this._resolveGridCellLineHeight({cell:e,style:i}),l=(o?.[t]||0)+a*r;s=Math.max(s,l)}),s>0?s:(console.warn("[grid.metrics] Failed to measure meaningful row space."),null)}_resolveGridCellLineHeight({cell:e,style:t}){const i=this._gridCellLineHeightCache,o=i?.get(e);if(o>0)return o;t||(console.warn("[grid.metrics] style not passed for _resolveGridCellLineHeight",{cell:e}),t=this._getComputedStyleCached(e));let n=parseFloat(t?.lineHeight);if(n>0)return i?.set(e,n),n;const r=parseFloat(t?.fontSize);if(Number.isFinite(r)&&r>0){const t=1.2*r;return i?.set(e,t),t}if(n=this._node.getLineHeight(e),n>0)return i?.set(e,n),n;return i?.set(e,16),16}_getGridShellHeights(e,t=null){if(this._currentGridShellCache||(this._currentGridShellCache=new WeakMap),this._currentGridShellCache.has(e))return this._currentGridShellCache.get(e);const i=Array.isArray(e)?e:[e].filter(Boolean),o=this._computeGridCellShellHeights(i,t);return this._currentGridShellCache.set(e,o),o}_getComputedStyleCached(e){if(!e)return console.warn("[grid.split] the element was not passed to _getComputedStyleCached"),null;const t=this._gridComputedStyleCache;if(!t)return this._DOM.getComputedStyle(e);const i=t.get(e);if(i)return i;const o=this._DOM.getComputedStyle(e);return t.set(e,o),o}_computeGridCellShellHeights(e,t=null){return Array.isArray(e)&&e.length?e.map((e,i)=>{if(!e)return 0;let o=null;t?(o=t[i],o||(o=this._getComputedStyleCached(e),t[i]=o)):o=this._getComputedStyleCached(e);const n=parseFloat(o?.paddingTop)||0,r=parseFloat(o?.paddingBottom)||0,s=parseFloat(o?.borderTopWidth)||0,a=parseFloat(o?.borderBottomWidth)||0,l=parseFloat(o?.marginTop)||0,c=parseFloat(o?.marginBottom)||0,h=n+r+s+a,d=Math.max(0,l)+Math.max(0,c),g=Math.max(0,h);return Math.max(0,g+d)}):[]}_getRowBounds(e,t,i="both"){return this._node.resolveRowBoundsGeneric(e,t,i)}_getRowTop(e,t){return this._getRowBounds(e,t,"top").top}_getRowBottom(e,t){return this._getRowBounds(e,t,"bottom").bottom}_scanGridLayout(e,t){const i=t.gridAutoFlow||"";if(!i.startsWith("row"))return{safe:!1,reason:`grid-auto-flow=${i}`};if(i.includes("dense"))return{safe:!1,reason:"grid-auto-flow dense not supported yet"};if("none"!==(t.gridTemplateAreas||"none"))return{safe:!1,reason:"grid-template-areas present"};const o=t.gridTemplateColumns||"",n=t.gridTemplateRows||"",r=e=>e.includes("subgrid")||e.includes("auto-fit")||e.includes("auto-fill")||e.includes("fit-content");if(r(o)||r(n))return{safe:!1,reason:"complex track sizing (subgrid/auto-fit/fit-content)"};return/\[.*?\]/.test(o)||/\[.*?\]/.test(n)?{safe:!1,reason:"named grid lines detected"}:{safe:!0}}}const sn="background:#999;color:#FFF;padding: 0 4px;";class an{constructor({config:e,DOM:t,node:o,selector:n}){this._debug=e.debugMode?{...e.debugConfig.pre}:{},this._assert=!!e.consoleAssert,Object.assign(this,i),this._DOM=t,this._selector=n,this._node=o,this._minPreFirstBlockLines=3,this._minPreLastBlockLines=3,this._minPreBreakableLines=this._minPreFirstBlockLines+this._minPreLastBlockLines,this._imageReductionRatio=.8,this._signpostHeight=parseFloat(e.splitLabelHeight)||0}_normalizeLinesInPlace(e){const t=e.splice(0,this._minPreFirstBlockLines).join(""),i=e.splice(-this._minPreLastBlockLines).join("");e.unshift(t),e.push(i)}_analyzeChildren(e){const t={},i=[...e].map(e=>{const i=this._DOM.getNodeType(e);return i===Node.TEXT_NODE?(t.text=!0,"text"):i===Node.ELEMENT_NODE?"BR"===this._DOM.getElementTagName(e)?(t.br=!0,"br"):this._node.isWrappedTextNode(e)?(t.wrappedText=!0,"wrappedText"):(t.node=!0,"node"):(t.other=!0,"other")});return{has:t,items:i}}split(e,t){this._debug._&&console.group("%c 🔲 PRE [split]","background:orange",{node:e});const i=()=>{this._debug._&&console.log("%c END 🔲 PRE [split]",sn),this._debug._&&console.groupEnd()},o=this._DOM.getChildNodes(e);if(this._debug._&&console.log("_children:",o.length,o),0==o.length)return this._debug._&&console.log("%c END _splitPreNode (not breakable)",sn),i(),[];let n=[];const r=this._analyzeChildren(o);if(this._debug._&&console.log("_childrenTypes:",r.items.length,r),this.strictAssert(!r.has.wrappedText,"Expected to be dealing with unprocessed PRE child nodes, but have wrappedText!",r),this.strictAssert(!(r.has.text&&r.has.wrappedText),"PRE children has text and wrappedText simultaneously",r),r.has.br&&this._debug._&&console.warn("PRE children has BR"),r.has.node){const t=this._DOM.getInnerHTML(e),i=this._node.splitTextByLinesGreedy(t);n.push(...i)}else for(const e of o){if(this._DOM.isTextNode(e)){const t=this._DOM.getNodeValue(e),i=this._node.splitTextByLinesGreedy(t);n.push(...i);continue}if(this._node.isWrappedTextNode(e)){const t=this._DOM.getInnerHTML(e),i=this._node.splitTextByLinesGreedy(t);n.push(...i);continue}}if(this._debug._&&console.log("_lines:",n),n.length{const t=this._node.createWithFlagNoBreak();return this._DOM.setInnerHTML(t,e),t});return this._debug._&&console.log("linesFromNode",s),this._DOM.replaceNodeContentsWith(e,...s),i(),s}slice(e,t,i,o,n){const r=n||this._DOM.getComputedStyle(e),s=["%c_SLICE PreNode\n","color:white"];this._debug._&&console.group("%c_✂️ slice PRE","background:cyan",{node:e,pageBottom:t,fullPageHeight:i});const a=()=>{this._debug._&&console.log("%c END ✂️ slice PRE",sn),this._debug._&&console.groupEnd()},l=e=>isNaN(parseFloat(e))?0:Math.ceil(parseFloat(e)),c=(l(r.marginTop),l(r.marginBottom),l(r.paddingTop)),h=l(r.paddingBottom),d=l(r.borderTopWidth),g=l(r.borderBottomWidth),u=l(r.lineHeight),p=this._node.getTop(e,o),_=c+h+d+g;if(this._DOM.getElementOffsetHeight(e)<_+u*this._minPreBreakableLines)return this._debug._&&console.log("%c END ✂️ slice (small node)",sn),a(),[];const f=this._DOM.getChildNodes(e);if(0==f.length)return this._debug._&&console.log("%c END ✂️ slice (not breakable)",sn),a(),[];if(f.length>1)return this._debug._&&console.log("%c END ✂️ slice TODO!",sn),a(),[];{if(this._DOM.isElementNode(f[0])){const e=f[0];return this._debug._&&console.warn("is Element Node",e),this._debug._&&console.log("%c END ✂️ slice ???????",sn),a(),[]}this._node.isWrappedTextNode(f[0])&&this._debug._&&console.warn(`is TEXT Node: ${f[0]}`);const o=f[0].wholeText,n=this._node.splitTextByLinesGreedy(o);if(n.length{const t=this._node.createWithFlagNoBreak();return this._DOM.setInnerHTML(t,e),t});this._debug._&&console.log("linesFromNode",h),this._DOM.replaceNodeContentsWith(e,...h);const u=0,m=u+d,b=u+g;let w=t-p-b-_; //! For firstPartSpace we need all margins & preWrapperHeight. //! For firstPartSpaceForSPlitting we only need selected amendments. -const S=i-_-m;this._debug._&&console.log({pageBottom:t,nodeTop:p,preWrapperHeight:_,topCutLineAmend:m,bottomCutLineAmend:b,fullPageHeight:i},{firstPartSpace:w,fullPageSpace:S});let M=0,P=[],y=w;const C=r.position;"relative"!=C&&this._DOM.setStyles(e,{position:"relative"});for(let t=0;ty&&(this._debug._&&console.log(`start a new page: currentBottom (${o}) > floater(${y})`,i),t&&P.push(t),t&&(M+=1),y=t?this._node.getTop(i,e)+S:S)}if(this._DOM.setStyles(e,{position:C}),!P.length)return this._debug._&&console.log("%c END ✂️ slice - NO SPLIITERS",qo),a(),[];this._debug._&&console.log(...s,"splitters",P);const E=P.map((t,i,o)=>{const n=this._node.createSliceWrapper(e),r=t,s=i===o.length-1?1/0:o[i+1],a=c.slice(r,s);return this._DOM.insertAtEnd(n,...a),n});return this._node.markSliceCuts([e,...E]),this._debug._&&console.log(...s,"newPreElementsArray",E),this._DOM.insertAfter(e,...E),this._debug._&&console.log("%c END ✂️ slice PRE",qo),a(),[e,...E]}}}class Xo{constructor({config:e,DOM:t,selector:D}){this._config=e,this._DOM=t,this._selector=D,this._debug=e.debugMode?{...e.debugConfig.node}:{},this._assert=!!e.consoleAssert,this._markupDebugMode=this._config.markupDebugMode,this._markers=new Lt({debugMode:this._config.debugMode,markupDebugMode:this._config.markupDebugMode,setAttribute:this._DOM.setAttribute.bind(this._DOM),removeAttribute:this._DOM.removeAttribute.bind(this._DOM)}),this._marks=this._markers.marks,this._cache=new Io,Object.assign(this,i),Object.assign(this,o),Object.assign(this,n),Object.assign(this,r),Object.assign(this,s),Object.assign(this,a),Object.assign(this,l),Object.assign(this,h),Object.assign(this,d),Object.assign(this,c),Object.assign(this,g),Object.assign(this,u),Object.assign(this,p),Object.assign(this,_),Object.assign(this,f),Object.assign(this,m),Object.assign(this,b),Object.assign(this,w),Object.assign(this,S),Object.assign(this,M),Object.assign(this,P),Object.assign(this,y),Object.assign(this,C),Object.assign(this,E),Object.assign(this,T),Object.assign(this,O),Object.assign(this,v),this._paragraph=new Lo({config:this._config,DOM:this._DOM,selector:this._selector,node:this}),this._pre=new Yo({config:this._config,DOM:this._DOM,selector:this._selector,node:this}),this._table=new Vo({config:this._config,DOM:this._DOM,selector:this._selector,node:this}),this._grid=new Uo({config:this._config,DOM:this._DOM,selector:this._selector,node:this}),this._tableLike=new Ko({config:this._config,DOM:this._DOM,selector:this._selector,node:this})}clearTemplates(e){this._DOM.getAll("template",e).forEach(e=>this._DOM.removeNode(e))}notSolved(e){this._DOM.getElementTagName(e);return!1}}function Zo(e){return e?.length?e?.split(/\s+/).filter(Boolean):[]}const Jo="#66CC00",Qo=`color: ${Jo};font-weight:bold`,en=`border:1px solid ${Jo};background:#EEEEEE;color:${Jo};`,tn="background:#999;color:#FFF;padding: 0 4px;";class on{constructor({config:e,DOM:t,node:o,selector:n,layout:r,referenceWidth:s,referenceHeight:a}){Object.assign(this,i),this._debug=e.debugMode?{...e.debugConfig.pages}:{},this._assert=!!e.consoleAssert,this._selector=n,this._node=o,this._configSelectors={noHanging:e.noHangingSelectors,pageBreakBefore:e.pageBreakBeforeSelectors,pageBreakAfter:e.pageBreakAfterSelectors,forcedPageBreak:e.forcedPageBreakSelectors,noBreak:e.noBreakSelectors,garbage:e.garbageSelectors},this._DOM=t,this._root=r.root,this._contentFlow=r.contentFlow,this._referenceWidth=s,this._referenceHeight=a,this._minLeftLines=2,this._minDanglingLines=2,this._minBreakableLines=this._minLeftLines+this._minDanglingLines,this._minLeftRows=1,this._minDanglingRows=1,this._minBreakableRows=1,this._minPreFirstBlockLines=3,this._minPreLastBlockLines=3,this._minPreBreakableLines=this._minPreFirstBlockLines+this._minPreLastBlockLines,this._minBreakableGridRows=4,this._imageReductionRatio=.8,this._signpostHeight=parseFloat(e.splitLabelHeight)||0,this._commonLineHeight=this._node.getLineHeight(this._root),this._minimumBreakableHeight=this._commonLineHeight*this._minBreakableLines,this._contentFlowEnd,this._contentFlowLastChild,this.pages=[]}calculate(){return this._removeGarbageElements(),this._prepareConfigSelectorConstraints(),this._calculatePageStarts(),this._resolvePageEnds(),this._debug._&&console.log("%c ✔ Pages.calculate()",en,this.pages),this.pages}_removeGarbageElements(){const e=Zo(this._configSelectors.garbage);if(e.length){this._node.resolveConfigSelectorConstraints(e,this._contentFlow).forEach(e=>{this._DOM.removeNode(e)})}}_prepareConfigSelectorConstraints(){this._debug._&&console.groupCollapsed("🗂️ prepare config selector constraints");const e=Zo(this._configSelectors.noHanging),t=Zo(this._configSelectors.pageBreakBefore),i=Zo(this._configSelectors.pageBreakAfter),o=Zo(this._configSelectors.forcedPageBreak),n=Zo(this._configSelectors.noBreak);this._prepareNoHangingElements(e),this._prepareForcedPageBreakElements({beforeSelectors:t,afterSelectors:i,forcedSelectors:o}),this._prepareNoBreakElements(n);this._debug._&&console.groupEnd("🗂️ prepare config selector constraints")}_prepareNoHangingElements(e){if(e.length){const t=this._node.resolveConfigSelectorConstraints(e,this._contentFlow,"noHangings");t.forEach(e=>{this._node.markNoHanging(e);const t=this._node.findLastChildParent(e,this._contentFlow);t&&this._node.markNoHanging(t,"parent")}),this._debug._&&t.length&&console.log("✓ noHangings got the flag")}}_prepareNoBreakElements(e){if(e.length){const t=this._node.resolveConfigSelectorConstraints(e,this._contentFlow,"noBreaks");t.forEach(e=>this._node.markNoBreak(e)),this._debug._&&t.length&&console.log("✓ noBreaks got the flag")}}_prepareForcedPageBreakElements({beforeSelectors:e,afterSelectors:t,forcedSelectors:i}){const o=e.length?this._node.resolveConfigSelectorConstraints(e,this._contentFlow,"pageStarters"):[],n=t.length?this._node.resolveConfigSelectorConstraints(t,this._contentFlow,"pageEnders"):[],r=this._node.resolveConfigSelectorConstraints(i,this._contentFlow,"forcedPageStarters");if(o.length){const e=o[0],t=this._node.findFirstChildParent(e,this._contentFlow)||e;this._node.isAfterContentFlowStart(t)&&o.shift()}if(n.length){const e=n.at(-1),t=this._node.findLastChildParent(e,this._contentFlow)||e,i=this._DOM.getRightNeighbor(t);this._node.isContentFlowEnd(i)&&n.pop()}o.length&&o.forEach(e=>{const t=this._node.findBetterForcedPageStarter(e,this._contentFlow);this.strictAssert(t,"findBetterForcedPageStarter should return an element. Returns:",t),this._DOM.insertBefore(t,this._node.createForcedPageBreak()),this._debug._&&console.log("📄⤵️ pageStarters • inserted before",{candidate:t,element:e})}),r&&r.forEach(e=>{if(!this._node.isForcedPageBreak(e)){const t=this._node.findBetterForcedPageStarter(e,this._contentFlow);this.strictAssert(t,"findBetterForcedPageStarter should return an element. Returns:",t),this._DOM.insertBefore(t,this._node.createForcedPageBreak()),this._debug._&&console.log("📄⤵️⤵️ forcedPageStarters • inserted before",{candidate:t,element:e})}}),n.length&&n.forEach(e=>{const t=this._node.findLastChildParent(e,this._contentFlow);t&&(e=t),this._node.isForcedPageBreak(this._DOM.getRightNeighbor(e))||(this._DOM.insertAfter(e,this._node.createForcedPageBreak()),this._debug._&&console.log("📄⤴️ pageEnders • inserted after",{element:e}))})}_registerFirstPage(){this._registerPageStart({element:this._DOM.getElement(this._selector.contentFlowStart,this._contentFlow),context:"register First Page"})}_isContentFlowShort(){const e=this._DOM.getElement(this._selector.contentFlowEnd,this._contentFlow),t=this._node.getBottom(e,this._root),i=tthis._registerPageStart({element:e,context:"All Forced Page Break Inside _contentFlow"}))}_calculatePageStarts(){if(this._registerFirstPage(),this._isContentFlowShort())return void this._resolveForcedPBInsideContentFlow();const e=this._node.getPreparedChildren(this._contentFlow);this._contentFlowEnd=e.at(-1),this._contentFlowLastChild=e.at(-2),this._debug._&&console.groupCollapsed("%c🚸 children(contentFlow)",en),this._debug._&&console.log(e),this._debug._&&console.groupEnd("%c🚸 children(contentFlow)",en),this._parseNodes({array:e})}_resolvePageEnds(){for(let e=1;e"),"📄",this.pages.length,{currentElement:o}),this._debug._parseNode&&console.log({previousElement:i,currentElement:o,nextElement:n,isFirstChild:e,isLastChild:t,arrayTopParent:r,arrayBottomParent:s}),!n)return this._node.markProcessed(o,"content-flow-end"),this._debug._parseNode&&console.log("%c END _parseNode (!nextElement)",tn),void(this._debug._parseNode&&console.groupEnd());const l=this._node.getBottom(o,this._root),h=s?this._node.getBottom(s,this._root):void 0;let c=h;const d=this._node.getTop(o,this._root);if(void 0!==h&&h-l>=this._referenceHeight){if(c=void 0,this._debug._parseNode&&console.log("🪁 Tail: We got a tail from the lower shells of the last child. Giving up our “last child” rule here and will try to insert a page break at the end of some parent. ",{arrayParentBottomEdge:h,currentParentBottomEdge:c,currentElementBottom:l,pageBottom:this.pages.at(-1).pageBottom},{currentElement:o,arrayBottomParent:s}),l<=this.pages.at(-1).pageBottom){this._debug._parseNode&&console.log("🪁 Tail: currentElementBottom <= this.pages.at(-1).pageBottom");const e=[];let t=o;for(this._debug._parseNode&&console.log("🪁 Tail: currentElement",o);t&&t!==s;)e.push({element:t,bottom:this._node.getBottom(t,this._root)}),t=t.parentElement;if(t!==s)throw new Error('"bottom" parent not found in the ancestor chain');e.push({element:s,bottom:h}),this._debug._parseNode&&console.log("🪁 Tail: _parents",e),this._debug._parseNode&&console.log("🪁 Tail: current PageBottom",this.pages.at(-1).pageBottom);for(let t=0;tthis.pages.at(-1).pageBottom){this._debug._parseNode&&console.log("🪁 Tail: _parents[i].bottom > this.pages.at(-1).pageBottom",e[t].bottom,">",this.pages.at(-1).pageBottom,e[t].element);const i=this._node.createNeutral();if(i.classList.add("service"),this._DOM.insertAtEnd(e[t].element,i),this._registerPageStart({element:i,context:"_isTailLongerThanPage"}),this._debug._parseNode&&console.log("_registerPageStart",i),this._node.markProcessed(i,"node is ForcedPageBreak"),this._debug._parseNode&&console.log(this.pages.at(-1).pageBottom,h),!(h>this.pages.at(-1).pageBottom))return this._debug._parseNode&&console.log("%c END _parseNode (bottom Tail of parents)",tn),void(this._debug._parseNode&&console.groupEnd());this._debug._&&console.log("🧧 • arrayParentBottomEdge > this.pages.at(-1).pageBottom")}return this._debug._parseNode&&console.log("%c END _parseNode (bottom Tail of parents)",tn),void(this._debug._parseNode&&console.groupEnd())}this._debug._parseNode&&console.log("🪁 Tail: currentElementBottom > this.pages.at(-1).pageBottom","DOING NOTHING")} +const S=i-_-m;this._debug._&&console.log({pageBottom:t,nodeTop:p,preWrapperHeight:_,topCutLineAmend:m,bottomCutLineAmend:b,fullPageHeight:i},{firstPartSpace:w,fullPageSpace:S});let M=0,y=[],P=w;const C=r.position;"relative"!=C&&this._DOM.setStyles(e,{position:"relative"});for(let t=0;tP&&(this._debug._&&console.log(`start a new page: currentBottom (${o}) > floater(${P})`,i),t&&y.push(t),t&&(M+=1),P=t?this._node.getTop(i,e)+S:S)}if(this._DOM.setStyles(e,{position:C}),!y.length)return this._debug._&&console.log("%c END ✂️ slice - NO SPLIITERS",sn),a(),[];this._debug._&&console.log(...s,"splitters",y);const E=y.map((t,i,o)=>{const n=this._node.createSliceWrapper(e),r=t,s=i===o.length-1?1/0:o[i+1],a=h.slice(r,s);return this._DOM.insertAtEnd(n,...a),n});return this._node.markSliceCuts([e,...E]),this._debug._&&console.log(...s,"newPreElementsArray",E),this._DOM.insertAfter(e,...E),this._debug._&&console.log("%c END ✂️ slice PRE",sn),a(),[e,...E]}}}class ln{constructor({config:e,DOM:t,selector:k}){this._config=e,this._DOM=t,this._selector=k,this._debug=e.debugMode?{...e.debugConfig.node}:{},this._assert=!!e.consoleAssert,this._markupDebugMode=this._config.markupDebugMode,this._markers=new $t({debugMode:this._config.debugMode,markupDebugMode:this._config.markupDebugMode,setAttribute:this._DOM.setAttribute.bind(this._DOM),removeAttribute:this._DOM.removeAttribute.bind(this._DOM)}),this._marks=this._markers.marks,this._cache=new Yo,Object.assign(this,i),Object.assign(this,o),Object.assign(this,n),Object.assign(this,r),Object.assign(this,s),Object.assign(this,a),Object.assign(this,l),Object.assign(this,c),Object.assign(this,d),Object.assign(this,h),Object.assign(this,g),Object.assign(this,u),Object.assign(this,p),Object.assign(this,_),Object.assign(this,f),Object.assign(this,m),Object.assign(this,b),Object.assign(this,w),Object.assign(this,S),Object.assign(this,M),Object.assign(this,y),Object.assign(this,P),Object.assign(this,C),Object.assign(this,E),Object.assign(this,T),Object.assign(this,O),Object.assign(this,v),Object.assign(this,D),this._paragraph=new Xo({config:this._config,DOM:this._DOM,selector:this._selector,node:this}),this._pre=new an({config:this._config,DOM:this._DOM,selector:this._selector,node:this}),this._table=new on({config:this._config,DOM:this._DOM,selector:this._selector,node:this}),this._grid=new rn({config:this._config,DOM:this._DOM,selector:this._selector,node:this}),this._tableLike=new nn({config:this._config,DOM:this._DOM,selector:this._selector,node:this})}clearTemplates(e){this._DOM.getAll("template",e).forEach(e=>this._DOM.removeNode(e))}notSolved(e){this._DOM.getElementTagName(e);return!1}}function cn(e){return e?.length?e?.split(/\s+/).filter(Boolean):[]}const hn="#66CC00",dn=`color: ${hn};font-weight:bold`,gn=`border:1px solid ${hn};background:#EEEEEE;color:${hn};`,un="background:#999;color:#FFF;padding: 0 4px;";class pn{constructor({config:e,DOM:t,node:o,selector:n,layout:r,referenceWidth:s,referenceHeight:a,mutationQueue:l}){Object.assign(this,i),this._debug=e.debugMode?{...e.debugConfig.pages}:{},this._assert=!!e.consoleAssert,this._selector=n,this._node=o,this._configSelectors={noHanging:e.noHangingSelectors,pageBreakBefore:e.pageBreakBeforeSelectors,pageBreakAfter:e.pageBreakAfterSelectors,forcedPageBreak:e.forcedPageBreakSelectors,noBreak:e.noBreakSelectors,garbage:e.garbageSelectors},this._DOM=t,this._root=r.root,this._contentFlow=r.contentFlow,this._referenceWidth=s,this._referenceHeight=a,this._mutationQueue=l,this._minLeftLines=2,this._minDanglingLines=2,this._minBreakableLines=this._minLeftLines+this._minDanglingLines,this._minLeftRows=1,this._minDanglingRows=1,this._minBreakableRows=1,this._minPreFirstBlockLines=3,this._minPreLastBlockLines=3,this._minPreBreakableLines=this._minPreFirstBlockLines+this._minPreLastBlockLines,this._minBreakableGridRows=4,this._imageReductionRatio=.8,this._signpostHeight=parseFloat(e.splitLabelHeight)||0,this._commonLineHeight=this._node.getLineHeight(this._root),this._minimumBreakableHeight=this._commonLineHeight*this._minBreakableLines,this._contentFlowEnd,this._contentFlowLastChild,this.pages=[]}calculate(){return this._removeGarbageElements(),this._prepareConfigSelectorConstraints(),this._calculatePageStarts(),this._resolvePageEnds(),this._debug._&&console.log("%c ✔ Pages.calculate()",gn,this.pages),this.pages}_removeGarbageElements(){const e=cn(this._configSelectors.garbage);if(e.length){this._node.resolveConfigSelectorConstraints(e,this._contentFlow).forEach(e=>{this._DOM.removeNode(e)})}}_prepareConfigSelectorConstraints(){this._debug._&&console.groupCollapsed("🗂️ prepare config selector constraints");const e=cn(this._configSelectors.noHanging),t=cn(this._configSelectors.pageBreakBefore),i=cn(this._configSelectors.pageBreakAfter),o=cn(this._configSelectors.forcedPageBreak),n=cn(this._configSelectors.noBreak);this._prepareNoHangingElements(e),this._prepareForcedPageBreakElements({beforeSelectors:t,afterSelectors:i,forcedSelectors:o}),this._prepareNoBreakElements(n);this._debug._&&console.groupEnd("🗂️ prepare config selector constraints")}_prepareNoHangingElements(e){if(e.length){const t=this._node.resolveConfigSelectorConstraints(e,this._contentFlow,"noHangings");t.forEach(e=>{this._node.markNoHanging(e);const t=this._node.findLastChildParent(e,this._contentFlow);t&&this._node.markNoHanging(t,"parent")}),this._debug._&&t.length&&console.log("✓ noHangings got the flag")}}_prepareNoBreakElements(e){if(e.length){const t=this._node.resolveConfigSelectorConstraints(e,this._contentFlow,"noBreaks");t.forEach(e=>this._node.markNoBreak(e)),this._debug._&&t.length&&console.log("✓ noBreaks got the flag")}}_prepareForcedPageBreakElements({beforeSelectors:e,afterSelectors:t,forcedSelectors:i}){const o=e.length?this._node.resolveConfigSelectorConstraints(e,this._contentFlow,"pageStarters"):[],n=t.length?this._node.resolveConfigSelectorConstraints(t,this._contentFlow,"pageEnders"):[],r=this._node.resolveConfigSelectorConstraints(i,this._contentFlow,"forcedPageStarters");if(o.length){const e=o[0],t=this._node.findFirstChildParent(e,this._contentFlow)||e;this._node.isAfterContentFlowStart(t)&&o.shift()}if(n.length){const e=n.at(-1),t=this._node.findLastChildParent(e,this._contentFlow)||e,i=this._DOM.getRightNeighbor(t);this._node.isContentFlowEnd(i)&&n.pop()}o.length&&o.forEach(e=>{const t=this._node.findBetterForcedPageStarter(e,this._contentFlow);this.strictAssert(t,"findBetterForcedPageStarter should return an element. Returns:",t),this._DOM.insertBefore(t,this._node.createForcedPageBreak()),this._debug._&&console.log("📄⤵️ pageStarters • inserted before",{candidate:t,element:e})}),r&&r.forEach(e=>{if(!this._node.isForcedPageBreak(e)){const t=this._node.findBetterForcedPageStarter(e,this._contentFlow);this.strictAssert(t,"findBetterForcedPageStarter should return an element. Returns:",t),this._DOM.insertBefore(t,this._node.createForcedPageBreak()),this._debug._&&console.log("📄⤵️⤵️ forcedPageStarters • inserted before",{candidate:t,element:e})}}),n.length&&n.forEach(e=>{const t=this._node.findLastChildParent(e,this._contentFlow);t&&(e=t),this._node.isForcedPageBreak(this._DOM.getRightNeighbor(e))||(this._DOM.insertAfter(e,this._node.createForcedPageBreak()),this._debug._&&console.log("📄⤴️ pageEnders • inserted after",{element:e}))})}_registerFirstPage(){this._registerPageStart({element:this._DOM.getElement(this._selector.contentFlowStart,this._contentFlow),context:"register First Page"})}_isContentFlowShort(){const e=this._DOM.getElement(this._selector.contentFlowEnd,this._contentFlow),t=this._node.getBottom(e,this._root),i=tthis._registerPageStart({element:e,context:"All Forced Page Break Inside _contentFlow"}))}_calculatePageStarts(){if(this._registerFirstPage(),this._isContentFlowShort())return void this._resolveForcedPBInsideContentFlow();const e=this._node.getPreparedChildren(this._contentFlow);this._contentFlowEnd=e.at(-1),this._contentFlowLastChild=e.at(-2),this._debug._&&console.groupCollapsed("%c🚸 children(contentFlow)",gn),this._debug._&&console.log(e),this._debug._&&console.groupEnd("%c🚸 children(contentFlow)",gn),this._parseNodes({array:e})}_resolvePageEnds(){for(let e=1;e"),"📄",this.pages.length,{currentElement:o}),this._debug._parseNode&&console.log({previousElement:i,currentElement:o,nextElement:n,isFirstChild:e,isLastChild:t,arrayTopParent:r,arrayBottomParent:s}),!n)return this._node.markProcessed(o,"content-flow-end"),this._debug._parseNode&&console.log("%c END _parseNode (!nextElement)",un),void(this._debug._parseNode&&console.groupEnd());const l=this._node.getBottom(o,this._root),c=s?this._node.getBottom(s,this._root):void 0;let h=c;const d=this._node.getTop(o,this._root);if(void 0!==c&&c-l>=this._referenceHeight){if(h=void 0,this._debug._parseNode&&console.log("🪁 Tail: We got a tail from the lower shells of the last child. Giving up our “last child” rule here and will try to insert a page break at the end of some parent. ",{arrayParentBottomEdge:c,currentParentBottomEdge:h,currentElementBottom:l,pageBottom:this.pages.at(-1).pageBottom},{currentElement:o,arrayBottomParent:s}),l<=this.pages.at(-1).pageBottom){this._debug._parseNode&&console.log("🪁 Tail: currentElementBottom <= this.pages.at(-1).pageBottom");const e=[];let t=o;for(this._debug._parseNode&&console.log("🪁 Tail: currentElement",o);t&&t!==s;)e.push({element:t,bottom:this._node.getBottom(t,this._root)}),t=t.parentElement;if(t!==s)throw new Error('"bottom" parent not found in the ancestor chain');e.push({element:s,bottom:c}),this._debug._parseNode&&console.log("🪁 Tail: _parents",e),this._debug._parseNode&&console.log("🪁 Tail: current PageBottom",this.pages.at(-1).pageBottom);for(let t=0;tthis.pages.at(-1).pageBottom){this._debug._parseNode&&console.log("🪁 Tail: _parents[i].bottom > this.pages.at(-1).pageBottom",e[t].bottom,">",this.pages.at(-1).pageBottom,e[t].element);const i=this._node.createNeutral();if(i.classList.add("service"),this._DOM.insertAtEnd(e[t].element,i),this._registerPageStart({element:i,context:"_isTailLongerThanPage"}),this._debug._parseNode&&console.log("_registerPageStart",i),this._node.markProcessed(i,"node is ForcedPageBreak"),this._debug._parseNode&&console.log(this.pages.at(-1).pageBottom,c),!(c>this.pages.at(-1).pageBottom))return this._debug._parseNode&&console.log("%c END _parseNode (bottom Tail of parents)",un),void(this._debug._parseNode&&console.groupEnd());this._debug._&&console.log("🧧 • arrayParentBottomEdge > this.pages.at(-1).pageBottom")}return this._debug._parseNode&&console.log("%c END _parseNode (bottom Tail of parents)",un),void(this._debug._parseNode&&console.groupEnd())}this._debug._parseNode&&console.log("🪁 Tail: currentElementBottom > this.pages.at(-1).pageBottom","DOING NOTHING")} //! currentParentBottomEdge is refreshed right before, so descendants see live parent boundaries. -const g=c??l;if(this._debug._parseNode&&console.log("[_parseNode]",{currentBlockBottom:g,currentParentBottomEdge:c,currentElementBottom:l}),this.pages.at(-1).pageStart===o&&(this._node.isNotBreakable(o)||g<=this.pages.at(-1).pageBottom))return this._node.markProcessed(o,"node is already registered and fits in the page"),this._debug._parseNode&&console.log("%c END _parseNode (node is already registered and fits in the next page)",tn),void(this._debug._parseNode&&console.groupEnd());if(d>=this.pages.at(-1).pageBottom&&l-d){const t=e&&Boolean(r)?this._node.getTopForPageStartCandidate(r,this._root):void 0,i=Boolean(t)&&d-t>=this._referenceHeight;if(i)this._debug._parseNode&&console.log("🪁 beginning Tail",{parentTop:t,currentParentBottomEdge:c,currentElementTop:d,pageBottom:this.pages.at(-1).pageBottom},{currentElement:o,arrayTopParent:r});else{const e=this._DOM.getComputedStyle(o)?.display||"";if(e.includes("inline")||"contents"===e)return this._debug._parseNode&&console.log("🧅 current in thin wrapper"),this._registerPageStart({element:o,improveResult:!0,context:"🧅 current in thin wrapper"}),this._debug._parseNode&&console.log("%c END _parseNode (registered new page start)",tn),void(this._debug._parseNode&&console.groupEnd())}this._registerPageStart({element:o,improveResult:!i,context:"currentElementTop >= this.pages.at(-1).pageBottom"})}if(this._node.isForcedPageBreak(o))return this._registerPageStart({element:o,context:"currentElement is ForcedPageBreak"}),this._node.markProcessed(o,"node is ForcedPageBreak"),this._debug._parseNode&&console.log("%c END _parseNode (isForcedPageBreak)",tn),void(this._debug._parseNode&&console.groupEnd());this.strictAssert(this._DOM.getElementOffsetParent(o),"it is expected that the element has an offset parent",o);const u=this._node.getTop(n,this._root);if(this._debug._parseNode&&console.log(...a,"• pageBottom",this.pages.at(-1).pageBottom,"\n","• nextElementTop",u),u<=this.pages.at(-1).pageBottom)return this._debug._parseNode&&console.log("nextElementTop <= this.pages.at(-1).pageBottom",u,"<=",this.pages.at(-1).pageBottom),this._node.markProcessed(o,"node fits"),this._node.findAllForcedPageBreakInside(o).forEach(e=>{this._node.markProcessed(e,"node is ForcedPageBreak (inside a node that fits)"),this._registerPageStart({element:e,context:"All Forced Page Break Inside currentElement"})}),this._debug._parseNode&&console.log("%c END _parseNode (node pass)",tn),void(this._debug._parseNode&&console.groupEnd());{if(this._debug._parseNode&&console.log("nextElementTop > this.pages.at(-1).pageBottom",u,">",this.pages.at(-1).pageBottom),g<=this.pages.at(-1).pageBottom)return this._debug._parseNode&&console.log("currentBlockBottom <= this.pages.at(-1).pageBottom",g,"<=",this.pages.at(-1).pageBottom,"\n register nextElement as pageStart"),this._node.isNoHanging(o)?(this._debug._parseNode&&console.log("currentElement fits / last, and _isNoHanging => move it to the next page"),this._node.markProcessed(o,"it fits & last & _isNoHanging => move it to the next page"),this._registerPageStart({element:o,improveResult:!0,context:"currentElement is NoHanging"}),this._debug._parseNode&&console.log("%c END _parseNode (isNoHanging)",tn),void(this._debug._parseNode&&console.groupEnd())):(this._registerPageStart({element:n,type:"next",context:"currentBlockBottom <= PgBtt && nextElementTop > PgBtt"}),this._node.markProcessed(o,"fits, its bottom falls exactly on the cut"),this._node.markProcessed(n,"starts new page, its top is exactly on the cut"),this._debug._parseNode&&console.log("%c END _parseNode (currentElement fits, register the next element)",tn),void(this._debug._parseNode&&console.groupEnd()));const t=this._node.resolveReplacedElement(o,{prefer:"first"});if(t){const i=this._node.isSVG(t),s=i?this._node.createSignpost(t):t,a=this._node.getTop(s,this._root),l=this._node.getBottom(s,this._root),d=e&&r?this._node.getTop(r,this._root):void 0,g=r||this._DOM.getParentNode(s),u=this._node.estimateInlineImgGapBelow(g);let p=this.pages.at(-1).pageBottom-a-u;p-=h?h-l:0;const _=this._DOM.getElementOffsetHeight(s),f=this._DOM.getElementOffsetWidth(s);if(this._debug._parseNode&&console.log("🖼️🖼️🖼️🖼️🖼️🖼️ (if mediaElement)",t,{_imageParent:g,arrayTopParent:r,arrayParentBottomEdge:h,availableImageNodeSpace:p,currentParentBottomEdge:c,currentElement:o,currentImage:s,currentImageHeight:_,currentImageWidth:f,isSvgMedia:i,imgGapBelow:u,parentTopForImage:d}),f>this._referenceWidth&&this._debug._parseNode&&console.warn("%c IMAGE is too wide","color: red"),_this._imageReductionRatio)return this._debug._parseNode&&console.log("Register next elements; 🖼️🖼️🖼️ IMG RESIZE to availableImageNodeSpace:",p,o),this._node.markProcessed(o,`IMG with ratio ${m}, and next starts on next`),this._node.fitElementWithinBoundaries({element:t,height:_,width:f,vspace:p,hspace:this._referenceWidth}),this._registerPageStart({element:n,type:"next",context:"current IMG was RESIZED to availableImageNodeSpace"}),this._debug._parseNode&&console.log("%c END _parseNode 🖼️ IMG scaled",tn),void(this._debug._parseNode&&console.groupEnd());this._node.markProcessed(o,"IMG starts on next");const b=i?s:t;this._registerPageStart({element:b,improveResult:!0,context:"move IMG it to next page"}),this._debug._parseNode&&console.log("🖼️ register Page Start",o);let w=this.pages.at(-1).pageBottom-a-u;const S=h?null:this._node.findLastChildParent(o,this._contentFlow),M=h||this._node.getBottom(S||o,this._root);return M>l&&(w-=M-l),_>w&&(this._node.fitElementWithinBoundaries({element:t,height:_,width:f,vspace:w,hspace:this._referenceWidth}),this._node.markProcessed(o,"IMG starts on next and resized"),this._debug._parseNode&&console.log("🖼️ ..and fit it to full page",o)),this._debug._parseNode&&console.log("%c END",tn),void(this._debug._parseNode&&console.groupEnd())}if(o.style.height){this._debug._parseNode&&console.log("🥁 currentElement has HEIGHT",o.style.height);const e=this.pages.at(-1).pageBottom-d,t=u-d,i=e/t,r=this._referenceHeight/t;return this._debug._parseNode&&console.log("\n🥁 currentElementTop",d,"\n🥁 pageBottom",this.pages.at(-1).pageBottom,"\n🥁 availableSpace",e,"\n🥁 currentElementContextualHeight",t,"\n🥁 availableSpaceFactor",i,"\n🥁 fullPageFactor",r),this.strictAssert(i<1),i>.8?(this._debug._parseNode&&console.log("🥁 availableSpaceFactor > 0.8: ",i),this._DOM.setStyles(o,{transform:`scale(${i})`,"transform-origin":"top center"}),this._registerPageStart({element:n,type:"next",context:"IMMEDIATELY scale currentElement to the remaining space; availableSpaceFactor > 0.8; currentElement.style.height"}),this._node.markProcessed(o,"processed as a image, has been scaled down within 20%, the next one starts a new page"),this._node.markProcessed(n,"the previous one was scaled down within 20%, and this one starts a new page."),this._debug._parseNode&&console.log("%c END _parseNode (has height & scale)",tn),void(this._debug._parseNode&&console.groupEnd())):(r<1&&(this._debug._parseNode&&console.log("🥁 fullPageFactor < 1: ",r),this._node.markProcessed(o,"processed as a image, has been scaled down, and starts new page"),this._DOM.setStyles(o,{transform:`scale(${r})`,"transform-origin":"top center"})),this._debug._parseNode&&console.log("🥁 _registerPageStart",o),this._registerPageStart({element:o,improveResult:!0,context:'has height & processed "as a image", has been scaled down, and starts new page'}),this._node.markProcessed(o,"processed as a image, starts new page"),this._debug._parseNode&&console.log("%c END _parseNode (has height & put on next page)",tn),void(this._debug._parseNode&&console.groupEnd()))}if(this._debug._parseNode&&console.log("split or not? \n","currentBlockBottom",g),this._debug._parseNode&&console.log("currentParentBottomEdge || currentElementBottom",{currentParentBottomEdge:c,currentElementBottom:l},"currentBlockBottom > this.pages.at(-1).pageBottom",g,">",this.pages.at(-1).pageBottom),this._DOM.getElementOffsetHeight(o) this.pages.at(-1).pageBottom"}),this._node.markProcessed(o,"starts new page, #fewLines"),this._debug._parseNode&&console.log("%c END _parseNode #fewLines",tn),void(this._debug._parseNode&&console.groupEnd());const p=this._node.getSplitChildren(o,this.pages.at(-1).pageBottom,this._referenceHeight,this._root);this._debug._parseNode&&console.log("try to break it and loop the children:",p);if(p.length){const e=r||o,t=s||o,a=this._node.isSliced(o)||this._node.isSlough(o);this._debug._parseNode&&console.log({isSlicedParent:a,arrayTopParent:r}),this._parseNodes({array:p,previous:i,next:n,arrayTopParent:a?void 0:e,arrayBottomParent:a?void 0:t}),this._node.markProcessed(o,"getSplitChildren and _parseNodes")}else this._debug._parseNode&&console.log(...a,"_registerPageStart (from _parseNode): \n",o),this._registerPageStart({element:o,improveResult:!0,context:"does not fit, has no children, register it (or parents if improved)"}),this._node.markProcessed(o,"doesn't fit, has no children, register it or parents")}this._debug._parseNode&&console.log("%c END _parseNode [•••]",tn,{currentElement:o}),this._debug._parseNode&&console.groupEnd()}}class nn{constructor({config:e,DOM:t,node:i,selector:o,layout:n}){this._debug=e.debugMode?{...e.debugConfig.paper}:{},this._DOM=t,this._selector=o,this._node=i,this._frontpageTemplate=n.frontpageTemplate,this._headerTemplate=n.headerTemplate,this._footerTemplate=n.footerTemplate,this._pageChromeSelector=o?.pageChrome||".pageChrome",this._pageBodySpacerSelector=o?.pageBodySpacer||".pageBodySpacer",this._pageHeaderSelector=o?.pageHeader||".pageHeader",this._pageFooterSelector=o?.pageFooter||".pageFooter",this._headerContentSelector=o?.headerContent||".headerContent",this._footerContentSelector=o?.footerContent||".footerContent",this._frontpageElementSelector=o?.frontpageElement||".frontpageElement",this._frontpageContentSelector=o?.frontpageContent||".frontpageContent",this._virtualPaperSelector=o?.virtualPaper||".virtualPaper",this._virtualPaperTopMarginSelector=o?.virtualPaperTopMargin||".virtualPaperTopMargin",this._virtualPaperBottomMarginSelector=o?.virtualPaperBottomMargin||".virtualPaperBottomMargin",this._pageNumberRootSelector=o?.pageNumberRoot?R(o.pageNumberRoot):void 0,this._pageNumberCurrentSelector=o?.pageNumberCurrent?R(o.pageNumberCurrent):void 0,this._pageNumberTotalSelector=o?.pageNumberTotal?R(o.pageNumberTotal):void 0,this._paperHeight,this._frontpageFactor,this.headerHeight,this.footerHeight,this.bodyHeight,this.bodyWidth,this._calculatePaperParams()}createPageChrome({pageNumber:e,pageCount:t}){const i=this._node.create(this._pageChromeSelector);this._node.markPageNumber(i,e);const o=this._composePageElements({pageNumber:e,pageCount:t});return this._DOM.insertAtEnd(i,o),i}_composePageElements({pageNumber:e,pageCount:t}){const i=this._DOM.createDocumentFragment(),o=this._createPageBodySpacer(this.bodyHeight);this._node.markPageNumber(o,e);const n=this._createPageHeader(this._headerTemplate),r=this._createPageFooter(this._footerTemplate);return this._DOM.insertAtEnd(i,this.createVirtualTopMargin(),n,o,r,this.createVirtualBottomMargin()),e&&t&&(this._setPageNumber(n,e,t),this._setPageNumber(r,e,t)),i}createFrontpage(){if(!this._frontpageTemplate)return void(this._debug&&console.warn("[paper • createFrontpage()] called without a template"));const e=this._node.create(this._frontpageElementSelector);this._DOM.setStyles(e,{height:this.bodyHeight+"px",display:"inline-block",width:"100%","vertical-align":"top"});const t=this._createFrontpageContent(this._frontpageTemplate,this._frontpageFactor);return this._DOM.setStyles(t,{display:"flow-root","transform-origin":"top center",height:"100%"}),this._DOM.insertAtStart(e,t),e}createVirtualTopMargin(){return this._node.create(this._virtualPaperTopMarginSelector)}createVirtualBottomMargin(){return this._node.create(this._virtualPaperBottomMarginSelector)}createVirtualPaper(e){const t=this._node.create(this._virtualPaperSelector);return e&&this._DOM.insertAtEnd(t,this.createVirtualTopMargin(),e,this.createVirtualBottomMargin()),t}_createFrontpageContent(e,t){const i=this._node.create(this._frontpageContentSelector);return e&&this._DOM.setInnerHTML(i,e),t&&this._DOM.setStyles(i,{transform:`scale(${t})`}),i}_createPageBodySpacer(e,t){const i=this._node.create(this._pageBodySpacerSelector);return this._DOM.setStyles(i,{height:e+"px"}),t&&this._DOM.insertAtEnd(i,t),i}_createPageHeader(e){const t=this._node.create(this._pageHeaderSelector);if(e){const i=this._node.create(this._headerContentSelector);this._DOM.setInnerHTML(i,e),this._DOM.insertAtEnd(t,i)}return t}_createPageFooter(e){const t=this._node.create(this._pageFooterSelector);if(e){const i=this._node.create(this._footerContentSelector);this._DOM.setInnerHTML(i,e),this._DOM.insertAtEnd(t,i)}return t}_setPageNumber(e,t,i){const o=this._pageNumberRootSelector?this._DOM.getElement(this._pageNumberRootSelector,e):this._pageNumberRootSelector;if(o){const e=this._DOM.getElement(this._pageNumberCurrentSelector,o),n=this._DOM.getElement(this._pageNumberTotalSelector,o);this._DOM.setInnerHTML(e,t),this._DOM.setInnerHTML(n,i)}}_calculatePaperParams(){const e=this._createPageBodySpacer(),t=this._createPageHeader(this._headerTemplate),i=this._createPageFooter(this._footerTemplate),o=this._node.create(this._virtualPaperSelector);this._DOM.insertAtEnd(o,this.createVirtualTopMargin(),t,e,i,this.createVirtualBottomMargin());const n=this._node.create("#workbench");this._DOM.setStyles(n,{position:"absolute",left:"-3000px"}),this._DOM.insertAtEnd(n,o),this._DOM.insertAtStart(this._DOM.body,n);const r=this._DOM.getElementBCR(o).height,s=this._DOM.getElementBCR(t).height||0,a=this._DOM.getElementBCR(i).height||0,l=this._DOM.getElementBCR(e).height,h=this._DOM.getElementBCR(e).width,c=this._createFrontpageContent(this._frontpageTemplate);this._DOM.insertAtStart(e,c);const d=this._DOM.getElementBCR(e).height,g=d>l?l/d:1;this._DOM.removeNode(n),s>.2*r&&console.warn("It seems that your custom header is too high"),a>.15*r&&console.warn("It seems that your custom footer is too high"),g<1&&console.warn("It seems that your frontpage content is too large. We made it smaller to fit on the page. Check out how it looks! It might make sense to fix this with styles or reduce the text amount."),this._paperHeight=r,this.headerHeight=s,this.footerHeight=a,this.bodyHeight=l,this.bodyWidth=h,this._frontpageFactor=g}}class rn{constructor({config:e,DOM:t,selector:o,node:n,pages:r,layout:s,paper:a}){this._config=e,this._debug=e.debugMode?{...e.debugConfig.preview}:{},this._assert=!!e.consoleAssert,Object.assign(this,i),this._accumulatedAssertions={},this._DOM=t,this._selector=o,this._node=n,this._virtualPaperGapSelector=o.virtualPaperGap,this._runningSafetySelector=o.runningSafety,this._printPageBreakSelector=o.printPageBreak,this._pageDivider=o.pageDivider,this._virtualPaper=o.virtualPaper,this._virtualPaperTopMargin=o.virtualPaperTopMargin,this._pageBodySpacer=o.pageBodySpacer,this._pages=r,this._root=s.root,this._contentFlow=s.contentFlow,this._paperFlow=s.paperFlow,this._overlayFlow=s.overlayFlow,this._paper=a,this._hasFrontPage=!!s.frontpageTemplate}create(){return this._processFrontPage(),this._processPages(),(!0===this._config.mask||"true"===this._config.mask)&&this._addMask(),this._makeRootVisible(),this._accumulatedAssertions}_addMask(){const e=parseInt(this._config.virtualPagesGap),t=parseInt(this._config.paperHeight),i=parseInt(this._config.printTopMargin),o=parseInt(this._config.printBottomMargin),n=parseInt(this._config.headerMargin),r=parseInt(this._config.footerMargin),s=this._paper.headerHeight,a=this._paper.footerHeight,l=this._paper.bodyHeight,h=s?Math.ceil(n/2):0,c=a?Math.ceil(r/2):0,d=s-h,g=a-c,u=l+h+c,p=i+d,_=t+e;this.strictAssert(t===u+d+i+g+o,"Paper size calculation params do not match");const f=function({maskStep:e,maskWindow:t,maskFirstShift:i}){return`\n -webkit-mask-image: linear-gradient(\n black 0,\n black ${t}px,\n transparent ${t}px,\n transparent ${e}px\n );\n mask-image: linear-gradient(\n black 0,\n black ${t}px,\n transparent ${t}px,\n transparent ${e}px\n );\n -webkit-mask-repeat: no-repeat;\n mask-repeat: no-repeat;\n -webkit-mask-size: 100% ${e}px;\n mask-size: 100% ${e}px;\n -webkit-mask-position: 100% ${i}px;\n mask-position: 100% ${i}px;\n -webkit-mask-repeat: repeat-y;\n mask-repeat: repeat-y;\n -webkit-mask-origin: border-box;\n mask-origin: border-box;\n `}({maskFirstShift:p,maskStep:_,maskWindow:u}),m=`\n @media screen {\n ${this._selector.contentFlow} {\n ${f}\n }\n }\n @media print {\n ${this._selector.root}::after {\n /* Safety placeholder for the bottom margin of the paper.\n Remove if the margins at the bottom of the page are replaced with padding.\n Placed under the footer.\n */\n --paper-color: ${this._config.paperColor};\n background: var(--paper-color, white);\n content: '';\n position: fixed;\n pointer-events: none;\n z-index: 11;\n inset: 0;\n top: unset;\n height: ${o+a}px;\n }\n }`;this._node.insertStyle(m,"mask")}_makeRootVisible(){this._DOM.setStyles(this._root,{visibility:"visible"})}_processFrontPage(){if(this._hasFrontPage){const e=this._paper.createFrontpage();this._DOM.insertAtStart(this._contentFlow,e),this._pages.unshift({pageStart:e,pageEnd:e}),this._pages[1].prevPageEnd=e}}_processPages(){for(let e=0;e0&&this._debug._&&console.warn(`[preview] There is no page end element before ${e}. Perhaps it's a 'beginningTail'.`)}_createPageBreaker(e,t){const i=this._node.create(this._pageDivider);return this._DOM.setAttribute(i,"[page]",`${e+1}`),this._node.registerPageDivider(i,e+1),t&&this._paper.footerHeight&&this._DOM.setStyles(i,{marginTop:this._paper.footerHeight+"px"}),this._paper.headerHeight&&this._DOM.setStyles(i,{paddingBottom:this._paper.headerHeight+"px"}),i}_updatePageNumberElementAttrValue(e){this._hasFrontPage&&this._node.markPageStart(this._pages[e].pageStart,`${e+1}`),this._node.markPageEnd(this._pages[e].pageEnd,`${e+1}`)}_insertPaper(e,t,i){i?this._DOM.insertAtEnd(e,i,t):this._DOM.insertAtEnd(e,t)}_createVirtualPaperGap(){return this._node.create(this._virtualPaperGapSelector)}_createVirtualPaperTopMargin(){return this._paper.createVirtualTopMargin()}_createVirtualPaperBottomMargin(){return this._paper.createVirtualBottomMargin()}_insertFrontpageSpacer(e,t){const i=this._node.create();return this._DOM.setStyles(i,{paddingBottom:t+"px"}),this._DOM.setAttribute(i,".printFrontpageSpacer"),this._DOM.insertAtStart(e,i),i}_insertHeaderSpacer(e,t){const i=this._DOM.createDocumentFragment(),o=this._node.create(this._runningSafetySelector);this._DOM.insertAtEnd(i,this._createVirtualPaperTopMargin(),o),this._DOM.insertAtEnd(e,i)}_insertFooterSpacer({target:e,footerHeight:t,pageSeparator:i,paperSeparator:o,pageIndex:n}){const r=this._DOM.createDocumentFragment(),s=this._createVirtualPaperGap(),a=this._node.create(this._runningSafetySelector);this._DOM.insertAtEnd(r,a,this._createVirtualPaperBottomMargin(),this._node.create(this._printPageBreakSelector),s),this._DOM.insertAtStart(e,r),this._balanceFooter({balancingFooter:a,contentSeparator:s,pageSeparator:i,paperSeparator:o,pageIndex:n})}_balanceFooter({balancingFooter:e,contentSeparator:t,pageSeparator:i,paperSeparator:o,pageIndex:n}){const r=this._node.getTop(i,this._root),s=this._node.getTop(o,this._root),a=this._node.getTop(t,this._root);this.strictAssert(s==r,"balancers in paper layers are misaligned",{pageIndex:n,balancingFooter:e,contentSeparator:t,pageSeparator:i,paperSeparator:o,paperSeparatorTop:s,pageSeparatorTop:r});const l=r-a;this._debug._&&console.log({balancingFooter:e,contentSeparatorTop:a,paperSeparatorTop:s,pageSeparatorTop:r}),this._DOM.setStyles(e,{"margin-bottom":l+"px"});l<-1&&(this._debug._&&console.warn(`[pages: ${n}-${n+1}] balancer is negative: ${l} < 0. Submitted to the Validator.`,t),this._accumulatedAssertions[n]={balancer:l,contentSeparator:t,pageNumber:n})}}class sn{constructor({config:e,DOM:t,selector:i,node:o,layout:n}){this._globalDebugMode=e.debugMode,this._debug=e.debugMode?{...e.debugConfig.toc}:{},this._assert=!!e.consoleAssert,this._DOM=t,this._node=o,this._tocPageNumberSelector=e.tocPageNumberSelector,this._root=n.root,this._contentFlow=n.contentFlow,this._pageDividerSelector=i.pageDivider}render(){this._globalDebugMode&&console.time("Processing TOC"),this._debug._&&console.log(`\n📑 TOC: I am here!\n\ntocPageNumberSelector:\n • ${this._tocPageNumberSelector}\n pageDividerSelector:\n • ${this._pageDividerSelector}\n `);const e=this._DOM.getAll(this._tocPageNumberSelector,this._contentFlow);if(this._debug._&&console.log("📑 tocPageNumberBoxes",e.length),!e.length)return void(this._debug._&&console.log("📑 no valid toc"));const t=this._node.getRegisteredPageDividers?.(),i=(t&&t.size?[...t.entries()]:this._DOM.getAll(this._pageDividerSelector,this._contentFlow).map((e,t)=>[t+1,e])).reduce((e,[t,i])=>{const o=this._node.getTop(i,this._root)-1,n=String(t);return e[o]=n,e},{});this._debug._&&console.log("📑 dataFromPagesMarkers",i);const o=e.reduce((e,t)=>{const i=this._DOM.getDataId(t),o=this._DOM.getElementById(i),n=this._node.getTop(o,this._root);return e[n]={box:t,id:i,targetTop:n},e},{});this._debug._&&console.log("📑 dataFromTOC",o);const n={...i,...o};let r=0;this._debug._&&console.groupCollapsed("Processing obj");for(const e in n){const t=n[e];this._debug._&&console.log(`Processing ${e}: ${t}`),"string"==typeof t?r=t:(t.page=r,this._DOM.setInnerHTML(t.box,r))}this._debug._&&console.groupEnd("Processing obj"),this._debug._&&console.log("📑 tocObject",n),this._globalDebugMode&&console.timeEnd("Processing TOC")}}class an{constructor({config:e,DOM:t,selector:o,node:n,layout:r,pages:s,previewValidations:a}){this._config=e,this._selector=o,this._DOM=t,this._node=n,this._layout=r,this._root=r.root,this._pageCount=s.length,this._accumulatedAssertions=a,this._assert=!!e.consoleAssert,Object.assign(this,i)}init(){this._config.debugMode&&console.log("🐙 i am Validator!");const e=this._collectPageOverflowAssertions();for(const[t,i]of Object.entries(e))this._accumulatedAssertions[t]={...this._accumulatedAssertions[t]||{},...i};this.strictAssert(0===Object.keys(this._accumulatedAssertions).length,"Page overflow detected:",this._accumulatedAssertions)}_collectPageOverflowAssertions(){const e=`${this._selector.paperFlow} ${this._selector.virtualPaperGap}`,t=`${this._selector.contentFlow} ${this._selector.virtualPaperGap}`,i=(this._selector.contentFlow,this._selector.contentFlowEnd,`${this._selector.pageChrome} ${this._selector.pageBodySpacer}`),o={},n=[...this._DOM.getAllElements(e)],r=[...this._DOM.getAllElements(t)];this._assertElementsCount(this._pageCount-1,{paperGapElements:n,pageGapElements:r});const s=n.map(e=>this._node.getTop(e,this._root)),a=r.map(e=>this._node.getTop(e,this._root));for(let e=0;ee?this._node.getBottom(e,this._root):void 0),u=c.map(e=>e?this._node.getBottom(e,this._root):void 0);for(let e=0;e{e<=.1&&(clearInterval(t),this._preloader.remove()),this._preloader.style.opacity=e,e-=.1*e},50);this._debugMode&&console.log("%c Preloader removed ",ln)}_insertStyle(){const e=document.querySelector("head"),t=document.createElement("style");t.append(document.createTextNode(this._css())),t.setAttribute("data-preloader-style",""),e.append(t)}_css(){return`\n /* PRELOADER */\n .lds-dual-ring {\n position: absolute;\n z-index: 99999;\n top: 0; left: 0; bottom: 0; right: 0;\n background: ${this._preloaderBackground};\n display: flex;\n justify-content: center;\n align-items: center;\n }\n /*\n .lds-dual-ring:after {\n content: " ";\n display: block;\n width: 64px;\n height: 64px;\n margin: 8px;\n border-radius: 50%;\n border: 6px solid #eee;\n border-color: #eee transparent #eee transparent;\n animation: lds-dual-ring 1.2s linear infinite;\n }\n @keyframes lds-dual-ring {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n */\n `}_resolveTarget(e){const t=(e.preloaderTarget||"").trim();return t&&document.querySelector(t)}}class cn{constructor(e){this._debugMode=e.debugMode}run(){let e=[...document.querySelectorAll("object")];this._debugMode&&console.log(e);let t=[];return e.forEach(e=>{const i=new Promise(t=>{e.addEventListener("load",i=>{this._debugMode&&console.log("⏰ EVENT: object load",e.clientHeight,e.clientWidth,e),t()})});t.push(i)}),Promise.all(t)}}const dn=e=>!0===e||"true"===e;function gn(e){const t=Array.isArray(e)?[]:{};return Object.entries(e).forEach(([e,i])=>{t[e]=!i||"object"!=typeof i||gn(i)}),t}const un={DOM:{_:!1},layout:{_:!1},pages:{_:!1,_parseNode:!1,_parseNodes:!1,_registerPageStart:!1},paper:{_:!1},preview:{_:!1},toc:{_:!1},node:{_:!1,children:!1,creators:!1,flowFilters:!1,fitters:!1,getters:!1,markers:!1,pageBreaks:!1,positioning:!1,selectors:!1,selectorHeuristics:!1,slicers:!1,splitters:!1,wrappers:!1,pagination:!1},paragraph:{_:!1},grid:{_:!1},pre:{_:!1},table:{_:!1},tableLike:{_:!1},testSignals:{forcedModeLog:!1}};function pn(e){const t=function(e){let t={debugMode:!1,forcedDebugMode:!1,consoleAssert:!1,markupDebugMode:!1,preloader:!1,preloaderTarget:"",preloaderBackground:"",mask:!0,noHangingSelectors:"",forcedPageBreakSelectors:"",pageBreakBeforeSelectors:"",pageBreakAfterSelectors:"",noBreakSelectors:"",tocPageNumberSelector:"html2pdf4doc-toc-page-number",printLeftMargin:"21mm",printRightMargin:"21mm",printTopMargin:"12mm",printBottomMargin:"12mm",printFontSize:"12pt",paperColor:"white",paperWidth:"210mm",paperHeight:"297mm",headerMargin:"16px",footerMargin:"16px",virtualPagesGap:"16px",splitLabelHeight:"24px"};const i={paperWidth:"210mm",paperHeight:"297mm"},o={paperWidth:"148.5mm",paperHeight:"210mm"};switch((e=function(e){const t={...e};for(const e in t){const i=t[e];if("string"==typeof i){const o=i.toLowerCase();"true"===o||"1"===o?t[e]=!0:"false"!==o&&"0"!==o&&""!==o||(t[e]=!1)}}return t}(e)).printPaperSize){case"A5":case"a5":t={...t,...o};break;default:t={...t,...i}}t={...t,initialRoot:R(N.init),tocPageNumberSelector:R(N.tocPageNumber),...e},console.info("[HTML2PDF4DOC] Config:",t);const n={printLeftMargin:t.printLeftMargin,printRightMargin:t.printRightMargin,printTopMargin:t.printTopMargin,printBottomMargin:t.printBottomMargin,printFontSize:t.printFontSize,paperWidth:t.paperWidth,paperHeight:t.paperHeight,headerMargin:t.headerMargin,footerMargin:t.footerMargin,virtualPagesGap:t.virtualPagesGap},r=document.createElement("div");return r.style="\n position:absolute;\n z-index:1000;\n left: 200%;\n ",document.body.append(r),Object.entries(n).forEach(([e,t])=>{r.style.width=t,n[e]=`${Math.trunc(r.getBoundingClientRect().width)}px`}),r.remove(),t={...t,...n},t.noHangingSelectors=t.noHangingSelectors+" H1 H2 H3 H4 H5 H6",t.forcedPageBreakSelectors=t.forcedPageBreakSelectors+" "+R(N.printForcedPageBreak),t.debugMode&&console.info("Config with converted units:",t),t}(e);t.forcedDebugMode&&(t.debugMode=!0,t.consoleAssert=!0,t.markupDebugMode=!0);const i=t.forcedDebugMode?gn(un):un;return{...t,debugConfig:i}}const _n="color:Gray;border:1px solid;";console.info("[HTML2PDF4DOC] Version:","0.3.0");const fn=document.currentScript.dataset,mn=new class{constructor(e){this.params=function(e={}){const t={...e};return[["printWidth","paperWidth","data-print-width","data-paper-width"],["printHeight","paperHeight","data-print-height","data-paper-height"]].forEach(([e,i,o,n])=>{Object.prototype.hasOwnProperty.call(t,e)&&(console.warn(`[HTML2PDF4DOC] Config option "${o}" is deprecated. Use "${n}" instead.`),Object.prototype.hasOwnProperty.call(t,i)||(t[i]=t[e]),delete t[e])}),t}(e),this.forcedDebugMode=dn(e.forcedDebugMode),this.debugMode=dn(e.debugMode)||this.forcedDebugMode,this.preloader=e.preloader,this.selector=N,this.config}async render(){console.time("[HTML2PDF4DOC] Total time"),this.debugMode&&console.log("🏁 document.readyState",document.readyState),document.addEventListener("readystatechange",e=>{this.debugMode&&console.log("🏁 readystatechange",document.readyState)}),this.debugMode&&console.time("⏱️ await DOMContentLoaded time"),await new Promise(e=>{window.addEventListener("DOMContentLoaded",t=>{this.debugMode&&console.log("⏰ EVENT: DOMContentLoaded"),e()})}),this.debugMode&&console.timeEnd("⏱️ await DOMContentLoaded time"),this.debugMode&&console.time("⏱️ create Preloader time");const e=new hn(this.params);"true"===this.preloader&&e.create(),this.debugMode&&console.timeEnd("⏱️ create Preloader time"),this.debugMode&&console.time("⏱️ Config time"),this.debugMode&&console.groupCollapsed("%c config ",_n+"color:LightGray"),this.config=pn(this.params),this.debugMode&&console.groupEnd(),this.debugMode&&console.info("⚙️ Current config with debugConfig:",this.config),this.debugMode&&console.timeEnd("⏱️ Config time"),this.config.debugConfig.testSignals.forcedModeLog&&console.info("[HTML2PDF4DOC] 🛠️ Forced debug mode is active."),this.config.consoleAssert&&console.info("[HTML2PDF4DOC] 🧧 Assertions enabled."),this.debugMode&&console.time("⏱️ DOM helpers init time");const t=new I({DOM:window.document,config:this.config});this.debugMode&&console.timeEnd("⏱️ DOM helpers init time"),this.debugMode&&console.time("⏱️ node helpers init time");const i=new Xo({config:this.config,DOM:t,selector:this.selector});this.debugMode&&console.timeEnd("⏱️ node helpers init time"),this.debugMode&&console.time("⏱️ await window load time"),await new Promise(e=>{window.addEventListener("load",t=>{this.debugMode&&console.log("⏰ EVENT: window load"),e()})}),this.debugMode&&console.timeEnd("⏱️ await window load time"),this.debugMode&&console.time("⏱️ Layout time"),this.debugMode&&console.groupCollapsed("%c Layout ",_n);const o=new $({config:this.config,DOM:t,selector:this.selector,node:i});if(o.create(),this.debugMode&&console.groupEnd(),this.debugMode&&console.timeEnd("⏱️ Layout time"),!o.success)return void(this.debugMode&&console.error("Failed to create layout.\n\nWe have to interrupt the process of creating PDF preview."));this.debugMode&&console.info("%c calculate Paper params ",_n),this.debugMode&&console.time("⏱️ Paper time");const n=new nn({config:this.config,DOM:t,selector:this.selector,node:i,layout:o});if(this.debugMode&&console.timeEnd("⏱️ Paper time"),!n||!n.bodyHeight||!n.bodyWidth)return void(this.debugMode&&console.error("Failed to create paper calculations.\n\nWe have to interrupt the process of creating PDF preview."));this.debugMode&&console.time("⏱️ Preprocess time"),this.debugMode&&console.groupCollapsed("%c Preprocess ",_n),await new cn(this.config).run(),this.debugMode&&console.groupEnd(),this.debugMode&&console.timeEnd("⏱️ Preprocess time"),this.debugMode&&console.time("⏱️ Pages time"),this.debugMode&&console.group("%c Pages ",_n);const r=new on({config:this.config,DOM:t,selector:this.selector,node:i,layout:o,referenceHeight:n.bodyHeight,referenceWidth:n.bodyWidth}).calculate();this.debugMode&&console.groupEnd(),this.debugMode&&console.timeEnd("⏱️ Pages time"),this.debugMode&&console.time("⏱️ Preview time"),this.debugMode&&console.groupCollapsed("%c Preview ",_n);const s=new rn({config:this.config,DOM:t,selector:this.selector,node:i,layout:o,paper:n,pages:r}).create();this.debugMode&&console.groupEnd(),this.debugMode&&console.timeEnd("⏱️ Preview time"),this.debugMode&&console.time("⏱️ Toc time"),new sn({config:this.config,DOM:t,selector:this.selector,node:i,layout:o}).render(),this.debugMode&&console.timeEnd("⏱️ Toc time"),this.debugMode&&console.time("⏱️ Validator time"),new an({config:this.config,DOM:t,selector:this.selector,node:i,layout:o,pages:r,previewValidations:s}).init(),this.debugMode&&console.timeEnd("⏱️ Validator time"),t.setAttribute(o.root,"[success]"),t.setAttribute(o.root,"[pages]",r.length),e.remove(),console.info("[HTML2PDF4DOC] Page count:",r.length),console.timeEnd("[HTML2PDF4DOC] Total time")}}(fn),bn="manual"===fn.init;function wn(){bn&&mn.render()}bn&&console.info("HTML2PDF4DOC in manual initialization mode"),!bn&&mn.render(),HTML2PDF4DOC=t})(); \ No newline at end of file +const g=h??l;if(this._debug._parseNode&&console.log("[_parseNode]",{currentBlockBottom:g,currentParentBottomEdge:h,currentElementBottom:l}),this.pages.at(-1).pageStart===o&&(this._node.isNotBreakable(o)||g<=this.pages.at(-1).pageBottom))return this._node.markProcessed(o,"node is already registered and fits in the page"),this._debug._parseNode&&console.log("%c END _parseNode (node is already registered and fits in the next page)",un),void(this._debug._parseNode&&console.groupEnd());if(d>=this.pages.at(-1).pageBottom&&l-d){const t=e&&Boolean(r)?this._node.getTopForPageStartCandidate(r,this._root):void 0,i=Boolean(t)&&d-t>=this._referenceHeight;if(i)this._debug._parseNode&&console.log("🪁 beginning Tail",{parentTop:t,currentParentBottomEdge:h,currentElementTop:d,pageBottom:this.pages.at(-1).pageBottom},{currentElement:o,arrayTopParent:r});else{const e=this._DOM.getComputedStyle(o)?.display||"";if(e.includes("inline")||"contents"===e)return this._debug._parseNode&&console.log("🧅 current in thin wrapper"),this._registerPageStart({element:o,improveResult:!0,context:"🧅 current in thin wrapper"}),this._debug._parseNode&&console.log("%c END _parseNode (registered new page start)",un),void(this._debug._parseNode&&console.groupEnd())}this._registerPageStart({element:o,improveResult:!i,context:"currentElementTop >= this.pages.at(-1).pageBottom"})}if(this._node.isForcedPageBreak(o))return this._registerPageStart({element:o,context:"currentElement is ForcedPageBreak"}),this._node.markProcessed(o,"node is ForcedPageBreak"),this._debug._parseNode&&console.log("%c END _parseNode (isForcedPageBreak)",un),void(this._debug._parseNode&&console.groupEnd());this.strictAssert(this._DOM.getElementOffsetParent(o),"it is expected that the element has an offset parent",o);const u=this._node.getTop(n,this._root);if(this._debug._parseNode&&console.log(...a,"• pageBottom",this.pages.at(-1).pageBottom,"\n","• nextElementTop",u),u<=this.pages.at(-1).pageBottom)return this._debug._parseNode&&console.log("nextElementTop <= this.pages.at(-1).pageBottom",u,"<=",this.pages.at(-1).pageBottom),this._node.markProcessed(o,"node fits"),this._node.findAllForcedPageBreakInside(o).forEach(e=>{this._node.markProcessed(e,"node is ForcedPageBreak (inside a node that fits)"),this._registerPageStart({element:e,context:"All Forced Page Break Inside currentElement"})}),this._debug._parseNode&&console.log("%c END _parseNode (node pass)",un),void(this._debug._parseNode&&console.groupEnd());{if(this._debug._parseNode&&console.log("nextElementTop > this.pages.at(-1).pageBottom",u,">",this.pages.at(-1).pageBottom),g<=this.pages.at(-1).pageBottom)return this._debug._parseNode&&console.log("currentBlockBottom <= this.pages.at(-1).pageBottom",g,"<=",this.pages.at(-1).pageBottom,"\n register nextElement as pageStart"),this._node.isNoHanging(o)?(this._debug._parseNode&&console.log("currentElement fits / last, and _isNoHanging => move it to the next page"),this._node.markProcessed(o,"it fits & last & _isNoHanging => move it to the next page"),this._registerPageStart({element:o,improveResult:!0,context:"currentElement is NoHanging"}),this._debug._parseNode&&console.log("%c END _parseNode (isNoHanging)",un),void(this._debug._parseNode&&console.groupEnd())):(this._registerPageStart({element:n,type:"next",context:"currentBlockBottom <= PgBtt && nextElementTop > PgBtt"}),this._node.markProcessed(o,"fits, its bottom falls exactly on the cut"),this._node.markProcessed(n,"starts new page, its top is exactly on the cut"),this._debug._parseNode&&console.log("%c END _parseNode (currentElement fits, register the next element)",un),void(this._debug._parseNode&&console.groupEnd()));const t=this._node.resolveReplacedElement(o,{prefer:"first"});if(t){const i=this._node.isSVG(t),s=i?this._node.createSignpost(t):t,a=this._node.getTop(s,this._root),l=this._node.getBottom(s,this._root),d=e&&r?this._node.getTop(r,this._root):void 0,g=r||this._DOM.getParentNode(s),u=this._node.estimateInlineImgGapBelow(g);let p=this.pages.at(-1).pageBottom-a-u;p-=c?c-l:0;const _=this._DOM.getElementOffsetHeight(s),f=this._DOM.getElementOffsetWidth(s);if(this._debug._parseNode&&console.log("🖼️🖼️🖼️🖼️🖼️🖼️ (if mediaElement)",t,{_imageParent:g,arrayTopParent:r,arrayParentBottomEdge:c,availableImageNodeSpace:p,currentParentBottomEdge:h,currentElement:o,currentImage:s,currentImageHeight:_,currentImageWidth:f,isSvgMedia:i,imgGapBelow:u,parentTopForImage:d}),f>this._referenceWidth&&this._debug._parseNode&&console.warn("%c IMAGE is too wide","color: red"),_this._imageReductionRatio)return this._debug._parseNode&&console.log("Register next elements; 🖼️🖼️🖼️ IMG RESIZE to availableImageNodeSpace:",p,o),this._node.markProcessed(o,`IMG with ratio ${m}, and next starts on next`),this._node.fitElementWithinBoundaries({element:t,height:_,width:f,vspace:p,hspace:this._referenceWidth}),this._registerPageStart({element:n,type:"next",context:"current IMG was RESIZED to availableImageNodeSpace"}),this._debug._parseNode&&console.log("%c END _parseNode 🖼️ IMG scaled",un),void(this._debug._parseNode&&console.groupEnd());this._node.markProcessed(o,"IMG starts on next");const b=i?s:t;this._registerPageStart({element:b,improveResult:!0,context:"move IMG it to next page"}),this._debug._parseNode&&console.log("🖼️ register Page Start",o);let w=this.pages.at(-1).pageBottom-a-u;const S=c?null:this._node.findLastChildParent(o,this._contentFlow),M=c||this._node.getBottom(S||o,this._root);return M>l&&(w-=M-l),_>w&&(this._node.fitElementWithinBoundaries({element:t,height:_,width:f,vspace:w,hspace:this._referenceWidth}),this._node.markProcessed(o,"IMG starts on next and resized"),this._debug._parseNode&&console.log("🖼️ ..and fit it to full page",o)),this._debug._parseNode&&console.log("%c END",un),void(this._debug._parseNode&&console.groupEnd())}if(o.style.height){this._debug._parseNode&&console.log("🥁 currentElement has HEIGHT",o.style.height);const e=this.pages.at(-1).pageBottom-d,t=u-d,i=e/t,r=this._referenceHeight/t;this._debug._parseNode&&console.log("\n🥁 currentElementTop",d,"\n🥁 pageBottom",this.pages.at(-1).pageBottom,"\n🥁 availableSpace",e,"\n🥁 currentElementContextualHeight",t,"\n🥁 availableSpaceFactor",i,"\n🥁 fullPageFactor",r),this.strictAssert(i<1);const s=e=>{this._DOM.setStyles(o,{transform:`scale(${e})`,"transform-origin":"top center"});const i=Math.max(0,Math.trunc(t*e)),n=this._DOM.getParentNode(o);if(n&&this._node.isNeutral(n))return void this._DOM.setStyles(n,{height:`${i}px`});const r=this._node.createNeutral();this._DOM.setStyles(r,{display:"inline-block",verticalAlign:"top",width:"100%",height:`${i}px`}),this._DOM.wrap(o,r)};return i>.8?(this._debug._parseNode&&console.log("🥁 availableSpaceFactor > 0.8: ",i),s(i),this._registerPageStart({element:n,type:"next",context:"IMMEDIATELY scale currentElement to the remaining space; availableSpaceFactor > 0.8; currentElement.style.height"}),this._node.markProcessed(o,"processed as a image, has been scaled down within 20%, the next one starts a new page"),this._node.markProcessed(n,"the previous one was scaled down within 20%, and this one starts a new page."),this._debug._parseNode&&console.log("%c END _parseNode (has height & scale)",un),void(this._debug._parseNode&&console.groupEnd())):(r<1&&(this._debug._parseNode&&console.log("🥁 fullPageFactor < 1: ",r),this._node.markProcessed(o,"processed as a image, has been scaled down, and starts new page"),s(r)),this._debug._parseNode&&console.log("🥁 _registerPageStart",o),this._registerPageStart({element:o,improveResult:!0,context:'has height & processed "as a image", has been scaled down, and starts new page'}),this._node.markProcessed(o,"processed as a image, starts new page"),this._debug._parseNode&&console.log("%c END _parseNode (has height & put on next page)",un),void(this._debug._parseNode&&console.groupEnd()))}if(this._debug._parseNode&&console.log("split or not? \n","currentBlockBottom",g),this._debug._parseNode&&console.log("currentParentBottomEdge || currentElementBottom",{currentParentBottomEdge:h,currentElementBottom:l},"currentBlockBottom > this.pages.at(-1).pageBottom",g,">",this.pages.at(-1).pageBottom),this._DOM.getElementOffsetHeight(o) this.pages.at(-1).pageBottom"}),this._node.markProcessed(o,"starts new page, #fewLines"),this._debug._parseNode&&console.log("%c END _parseNode #fewLines",un),void(this._debug._parseNode&&console.groupEnd());const p=this._node.getSplitChildren(o,this.pages.at(-1).pageBottom,this._referenceHeight,this._root);this._debug._parseNode&&console.log("try to break it and loop the children:",p);if(p.length){const e=r||o,t=s||o,a=this._node.isSliced(o)||this._node.isSlough(o);this._debug._parseNode&&console.log({isSlicedParent:a,arrayTopParent:r}),this._parseNodes({array:p,previous:i,next:n,arrayTopParent:a?void 0:e,arrayBottomParent:a?void 0:t}),this._node.markProcessed(o,"getSplitChildren and _parseNodes")}else this._debug._parseNode&&console.log(...a,"_registerPageStart (from _parseNode): \n",o),this._registerPageStart({element:o,improveResult:!0,context:"does not fit, has no children, register it (or parents if improved)"}),this._node.markProcessed(o,"doesn't fit, has no children, register it or parents")}this._debug._parseNode&&console.log("%c END _parseNode [•••]",un,{currentElement:o}),this._debug._parseNode&&console.groupEnd()}}class _n{constructor({config:e,DOM:t,node:i,selector:o,layout:n}){this._debug=e.debugMode?{...e.debugConfig.paper}:{},this._DOM=t,this._selector=o,this._node=i,this._frontpageTemplate=n.frontpageTemplate,this._headerTemplate=n.headerTemplate,this._footerTemplate=n.footerTemplate,this._pageChromeSelector=o?.pageChrome||".pageChrome",this._pageBodySpacerSelector=o?.pageBodySpacer||".pageBodySpacer",this._pageHeaderSelector=o?.pageHeader||".pageHeader",this._pageFooterSelector=o?.pageFooter||".pageFooter",this._headerContentSelector=o?.headerContent||".headerContent",this._footerContentSelector=o?.footerContent||".footerContent",this._frontpageElementSelector=o?.frontpageElement||".frontpageElement",this._frontpageContentSelector=o?.frontpageContent||".frontpageContent",this._virtualPaperSelector=o?.virtualPaper||".virtualPaper",this._virtualPaperTopMarginSelector=o?.virtualPaperTopMargin||".virtualPaperTopMargin",this._virtualPaperBottomMarginSelector=o?.virtualPaperBottomMargin||".virtualPaperBottomMargin",this._pageNumberRootSelector=o?.pageNumberRoot?N(o.pageNumberRoot):void 0,this._pageNumberCurrentSelector=o?.pageNumberCurrent?N(o.pageNumberCurrent):void 0,this._pageNumberTotalSelector=o?.pageNumberTotal?N(o.pageNumberTotal):void 0,this._paperHeight,this._frontpageFactor,this.headerHeight,this.footerHeight,this.bodyHeight,this.bodyWidth,this._calculatePaperParams()}createPageChrome({pageNumber:e,pageCount:t}){const i=this._node.create(this._pageChromeSelector);this._node.markPageNumber(i,e);const o=this._composePageElements({pageNumber:e,pageCount:t});return this._DOM.insertAtEnd(i,o),i}_composePageElements({pageNumber:e,pageCount:t}){const i=this._DOM.createDocumentFragment(),o=this._createPageBodySpacer(this.bodyHeight);this._node.markPageNumber(o,e);const n=this._createPageHeader(this._headerTemplate),r=this._createPageFooter(this._footerTemplate);return this._DOM.insertAtEnd(i,this.createVirtualTopMargin(),n,o,r,this.createVirtualBottomMargin()),e&&t&&(this._setPageNumber(n,e,t),this._setPageNumber(r,e,t)),i}createFrontpage(){if(!this._frontpageTemplate)return void(this._debug&&console.warn("[paper • createFrontpage()] called without a template"));const e=this._node.create(this._frontpageElementSelector);this._DOM.setStyles(e,{height:this.bodyHeight+"px",display:"inline-block",width:"100%","vertical-align":"top"});const t=this._createFrontpageContent(this._frontpageTemplate,this._frontpageFactor);return this._DOM.setStyles(t,{display:"flow-root","transform-origin":"top center",height:"100%"}),this._DOM.insertAtStart(e,t),e}createVirtualTopMargin(){return this._node.create(this._virtualPaperTopMarginSelector)}createVirtualBottomMargin(){return this._node.create(this._virtualPaperBottomMarginSelector)}createVirtualPaper(e){const t=this._node.create(this._virtualPaperSelector);return e&&this._DOM.insertAtEnd(t,this.createVirtualTopMargin(),e,this.createVirtualBottomMargin()),t}_createFrontpageContent(e,t){const i=this._node.create(this._frontpageContentSelector);return e&&this._DOM.setInnerHTML(i,e),t&&this._DOM.setStyles(i,{transform:`scale(${t})`}),i}_createPageBodySpacer(e,t){const i=this._node.create(this._pageBodySpacerSelector);return this._DOM.setStyles(i,{height:e+"px"}),t&&this._DOM.insertAtEnd(i,t),i}_createPageHeader(e){const t=this._node.create(this._pageHeaderSelector);if(e){const i=this._node.create(this._headerContentSelector);this._DOM.setInnerHTML(i,e),this._DOM.insertAtEnd(t,i)}return t}_createPageFooter(e){const t=this._node.create(this._pageFooterSelector);if(e){const i=this._node.create(this._footerContentSelector);this._DOM.setInnerHTML(i,e),this._DOM.insertAtEnd(t,i)}return t}_setPageNumber(e,t,i){const o=this._pageNumberRootSelector?this._DOM.getElement(this._pageNumberRootSelector,e):this._pageNumberRootSelector;if(o){const e=this._DOM.getElement(this._pageNumberCurrentSelector,o),n=this._DOM.getElement(this._pageNumberTotalSelector,o);this._DOM.setInnerHTML(e,t),this._DOM.setInnerHTML(n,i)}}_calculatePaperParams(){const e=this._createPageBodySpacer(),t=this._createPageHeader(this._headerTemplate),i=this._createPageFooter(this._footerTemplate),o=this._node.create(this._virtualPaperSelector);this._DOM.insertAtEnd(o,this.createVirtualTopMargin(),t,e,i,this.createVirtualBottomMargin());const n=this._node.create("#workbench");this._DOM.setStyles(n,{position:"absolute",left:"-3000px"}),this._DOM.insertAtEnd(n,o),this._DOM.insertAtStart(this._DOM.body,n);const r=this._DOM.getElementBCR(o).height,s=this._DOM.getElementBCR(t).height||0,a=this._DOM.getElementBCR(i).height||0,l=this._DOM.getElementBCR(e).height,c=this._DOM.getElementBCR(e).width,h=this._createFrontpageContent(this._frontpageTemplate);this._DOM.insertAtStart(e,h);const d=this._DOM.getElementBCR(e).height,g=d>l?l/d:1;this._DOM.removeNode(n),s>.2*r&&console.warn("It seems that your custom header is too high"),a>.15*r&&console.warn("It seems that your custom footer is too high"),g<1&&console.warn("It seems that your frontpage content is too large. We made it smaller to fit on the page. Check out how it looks! It might make sense to fix this with styles or reduce the text amount."),this._paperHeight=r,this.headerHeight=s,this.footerHeight=a,this.bodyHeight=l,this.bodyWidth=c,this._frontpageFactor=g}}class fn{constructor({config:e,DOM:t,selector:o,node:n,pages:r,layout:s,paper:a,mutationQueue:l}){this._config=e,this._debug=e.debugMode?{...e.debugConfig.preview}:{},this._assert=!!e.consoleAssert,Object.assign(this,i),this._accumulatedAssertions={},this._DOM=t,this._selector=o,this._node=n,this._virtualPaperGapSelector=o.virtualPaperGap,this._runningSafetySelector=o.runningSafety,this._printPageBreakSelector=o.printPageBreak,this._pageDivider=o.pageDivider,this._virtualPaper=o.virtualPaper,this._virtualPaperTopMargin=o.virtualPaperTopMargin,this._pageBodySpacer=o.pageBodySpacer,this._pages=r,this._root=s.root,this._contentFlow=s.contentFlow,this._paperFlow=s.paperFlow,this._overlayFlow=s.overlayFlow,this._paper=a,this._mutationQueue=l,this._hasFrontPage=!!s.frontpageTemplate}create(){return this._mutationQueue?.flush(),this._processFrontPage(),this._processPages(),(!0===this._config.mask||"true"===this._config.mask)&&this._addMask(),this._makeRootVisible(),this._accumulatedAssertions}_addMask(){const e=parseInt(this._config.virtualPagesGap),t=parseInt(this._config.paperHeight),i=parseInt(this._config.printTopMargin),o=parseInt(this._config.printBottomMargin),n=parseInt(this._config.headerMargin),r=parseInt(this._config.footerMargin),s=this._paper.headerHeight,a=this._paper.footerHeight,l=this._paper.bodyHeight,c=s?Math.ceil(n/2):0,h=a?Math.ceil(r/2):0,d=s-c,g=a-h,u=l+c+h,p=i+d,_=t+e;this.strictAssert(t===u+d+i+g+o,"Paper size calculation params do not match");const f=function({maskStep:e,maskWindow:t,maskFirstShift:i}){return`\n -webkit-mask-image: linear-gradient(\n black 0,\n black ${t}px,\n transparent ${t}px,\n transparent ${e}px\n );\n mask-image: linear-gradient(\n black 0,\n black ${t}px,\n transparent ${t}px,\n transparent ${e}px\n );\n -webkit-mask-repeat: no-repeat;\n mask-repeat: no-repeat;\n -webkit-mask-size: 100% ${e}px;\n mask-size: 100% ${e}px;\n -webkit-mask-position: 100% ${i}px;\n mask-position: 100% ${i}px;\n -webkit-mask-repeat: repeat-y;\n mask-repeat: repeat-y;\n -webkit-mask-origin: border-box;\n mask-origin: border-box;\n `}({maskFirstShift:p,maskStep:_,maskWindow:u}),m=`\n @media screen {\n ${this._selector.contentFlow} {\n ${f}\n }\n }\n @media print {\n ${this._selector.root}::after {\n /* Safety placeholder for the bottom margin of the paper.\n Remove if the margins at the bottom of the page are replaced with padding.\n Placed under the footer.\n */\n --paper-color: ${this._config.paperColor};\n background: var(--paper-color, white);\n content: '';\n position: fixed;\n pointer-events: none;\n z-index: 11;\n inset: 0;\n top: unset;\n height: ${o+a}px;\n }\n }`;this._node.insertStyle(m,"mask")}_makeRootVisible(){this._DOM.setStyles(this._root,{visibility:"visible"})}_processFrontPage(){if(this._hasFrontPage){const e=this._paper.createFrontpage();this._DOM.insertAtStart(this._contentFlow,e),this._pages.unshift({pageStart:e,pageEnd:e}),this._pages[1].prevPageEnd=e}}_processPages(){for(let e=0;e{this._DOM.setStyles(e,{"margin-top":["0","important"]})})}else this.strictAssert(0,"[preview] [_preventPageOverflow] current page First Element do not pass! page:",e);if(i){this._DOM.setStyles(i,{"margin-bottom":["0","important"]});this._node.getBottomCollapseChain(i,this._root).forEach(e=>{this._DOM.setStyles(e,{"margin-bottom":["0","important"]})}),this._node.isIMG(i)&&this._DOM.setStyles(i,{"vertical-align":["top","important"]})}else e>0&&this._debug._&&console.warn(`[preview] There is no page end element before ${e}. Perhaps it's a 'beginningTail'.`)}_createPageBreaker(e,t){const i=this._node.create(this._pageDivider);return this._DOM.setAttribute(i,"[page]",`${e+1}`),this._node.registerPageDivider(i,e+1),t&&this._paper.footerHeight&&this._DOM.setStyles(i,{marginTop:this._paper.footerHeight+"px"}),this._paper.headerHeight&&this._DOM.setStyles(i,{paddingBottom:this._paper.headerHeight+"px"}),i}_updatePageNumberElementAttrValue(e){this._hasFrontPage&&this._node.markPageStart(this._pages[e].pageStart,`${e+1}`),this._node.markPageEnd(this._pages[e].pageEnd,`${e+1}`)}_insertPaper(e,t,i){i?this._DOM.insertAtEnd(e,i,t):this._DOM.insertAtEnd(e,t)}_createVirtualPaperGap(){return this._node.create(this._virtualPaperGapSelector)}_createVirtualPaperTopMargin(){return this._paper.createVirtualTopMargin()}_createVirtualPaperBottomMargin(){return this._paper.createVirtualBottomMargin()}_insertFrontpageSpacer(e,t){const i=this._node.create();return this._DOM.setStyles(i,{paddingBottom:t+"px"}),this._DOM.setAttribute(i,".printFrontpageSpacer"),this._DOM.insertAtStart(e,i),i}_insertHeaderSpacer(e,t){const i=this._DOM.createDocumentFragment(),o=this._node.create(this._runningSafetySelector);this._DOM.insertAtEnd(i,this._createVirtualPaperTopMargin(),o),this._DOM.insertAtEnd(e,i)}_insertFooterSpacer({target:e,footerHeight:t,pageSeparator:i,paperSeparator:o,pageIndex:n}){const r=this._DOM.createDocumentFragment(),s=this._createVirtualPaperGap(),a=this._node.create(this._runningSafetySelector);this._DOM.insertAtEnd(r,a,this._createVirtualPaperBottomMargin(),this._node.create(this._printPageBreakSelector),s),this._DOM.insertAtStart(e,r),this._balanceFooter({balancingFooter:a,contentSeparator:s,pageSeparator:i,paperSeparator:o,pageIndex:n})}_balanceFooter({balancingFooter:e,contentSeparator:t,pageSeparator:i,paperSeparator:o,pageIndex:n}){const r=this._node.getTop(i,this._root),s=this._node.getTop(o,this._root),a=this._node.getTop(t,this._root);this.strictAssert(s==r,"balancers in paper layers are misaligned",{pageIndex:n,balancingFooter:e,contentSeparator:t,pageSeparator:i,paperSeparator:o,paperSeparatorTop:s,pageSeparatorTop:r});const l=r-a;this._debug._&&console.log({balancingFooter:e,contentSeparatorTop:a,paperSeparatorTop:s,pageSeparatorTop:r}),this._DOM.setStyles(e,{"margin-bottom":l+"px"});l<-1&&(this._debug._&&console.warn(`[pages: ${n}-${n+1}] balancer is negative: ${l} < 0. Submitted to the Validator.`,t),this._accumulatedAssertions[n]={balancer:l,contentSeparator:t,pageNumber:n})}}class mn{constructor({config:e,DOM:t,selector:i,node:o,layout:n}){this._globalDebugMode=e.debugMode,this._debug=e.debugMode?{...e.debugConfig.toc}:{},this._assert=!!e.consoleAssert,this._DOM=t,this._node=o,this._tocPageNumberSelector=e.tocPageNumberSelector,this._root=n.root,this._contentFlow=n.contentFlow,this._pageDividerSelector=i.pageDivider}render(){this._globalDebugMode&&console.time("Processing TOC"),this._debug._&&console.log(`\n📑 TOC: I am here!\n\ntocPageNumberSelector:\n • ${this._tocPageNumberSelector}\n pageDividerSelector:\n • ${this._pageDividerSelector}\n `);const e=this._DOM.getAll(this._tocPageNumberSelector,this._contentFlow);if(this._debug._&&console.log("📑 tocPageNumberBoxes",e.length),!e.length)return void(this._debug._&&console.log("📑 no valid toc"));const t=this._node.getRegisteredPageDividers?.(),i=(t&&t.size?[...t.entries()]:this._DOM.getAll(this._pageDividerSelector,this._contentFlow).map((e,t)=>[t+1,e])).reduce((e,[t,i])=>{const o=this._node.getTop(i,this._root)-1,n=String(t);return e[o]=n,e},{});this._debug._&&console.log("📑 dataFromPagesMarkers",i);const o=e.reduce((e,t)=>{const i=this._DOM.getDataId(t),o=this._DOM.getElementById(i),n=this._node.getTop(o,this._root);return e[n]={box:t,id:i,targetTop:n},e},{});this._debug._&&console.log("📑 dataFromTOC",o);const n={...i,...o};let r=0;this._debug._&&console.groupCollapsed("Processing obj");for(const e in n){const t=n[e];this._debug._&&console.log(`Processing ${e}: ${t}`),"string"==typeof t?r=t:(t.page=r,this._DOM.setInnerHTML(t.box,r))}this._debug._&&console.groupEnd("Processing obj"),this._debug._&&console.log("📑 tocObject",n),this._globalDebugMode&&console.timeEnd("Processing TOC")}}class bn{constructor({config:e,DOM:t,selector:o,node:n,layout:r,pages:s,previewValidations:a}){this._config=e,this._selector=o,this._DOM=t,this._node=n,this._layout=r,this._root=r.root,this._pageCount=s.length,this._accumulatedAssertions=a,this._assert=!!e.consoleAssert,Object.assign(this,i)}init(){this._config.debugMode&&console.log("🐙 i am Validator!"),this._validateLayout()}_validateLayout(){const e=this._collectPageOverflowAssertions();for(const[t,i]of Object.entries(e))this._accumulatedAssertions[t]={...this._accumulatedAssertions[t]||{},...i};this.strictAssert(0===Object.keys(this._accumulatedAssertions).length,"Page overflow detected:",this._accumulatedAssertions)}_collectPageOverflowAssertions(){const e=`${this._selector.paperFlow} ${this._selector.virtualPaperGap}`,t=`${this._selector.contentFlow} ${this._selector.virtualPaperGap}`,i=(this._selector.contentFlow,this._selector.contentFlowEnd,`${this._selector.pageChrome} ${this._selector.pageBodySpacer}`),o={},n=[...this._DOM.getAllElements(e)],r=[...this._DOM.getAllElements(t)];this._assertElementsCount(this._pageCount-1,{paperGapElements:n,pageGapElements:r});const s=n.map(e=>this._node.getTop(e,this._root)),a=r.map(e=>this._node.getTop(e,this._root));for(let e=0;ee?this._node.getBottom(e,this._root):void 0),u=h.map(e=>e?this._node.getBottom(e,this._root):void 0);for(let e=0;e{e<=.1&&(clearInterval(t),this._preloader.remove()),this._preloader.style.opacity=e,e-=.1*e},50);this._debugMode&&console.log("%c Preloader removed ",wn)}_insertStyle(){const e=document.querySelector("head"),t=document.createElement("style");t.append(document.createTextNode(this._css())),t.setAttribute("data-preloader-style",""),e.append(t)}_css(){return`\n /* PRELOADER */\n .lds-dual-ring {\n position: absolute;\n z-index: 99999;\n top: 0; left: 0; bottom: 0; right: 0;\n background: ${this._preloaderBackground};\n display: flex;\n justify-content: center;\n align-items: center;\n }\n /*\n .lds-dual-ring:after {\n content: " ";\n display: block;\n width: 64px;\n height: 64px;\n margin: 8px;\n border-radius: 50%;\n border: 6px solid #eee;\n border-color: #eee transparent #eee transparent;\n animation: lds-dual-ring 1.2s linear infinite;\n }\n @keyframes lds-dual-ring {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n */\n `}_resolveTarget(e){const t=(e.preloaderTarget||"").trim();return t&&document.querySelector(t)}}const Mn="html2pdf4doc-resource-status";class yn{constructor(e,t){this._config=e,this._DOM=t,this._debugMode=e.debugMode,this._resourceIssues=[]}async run(){return await this._awaitResources(),this._resourceIssues}async _awaitResources(){const e=this._config.resourceTimeout??this._config.resourceTimeoutMs??2e3,t=this._config.initialRoot,i=t&&this._DOM.document.querySelector(t)||this._DOM.body,o=i?[i,...i.querySelectorAll("*")]:[];this._DOM.document.fonts?.ready&&await this._DOM.document.fonts.ready;const n=[...i.querySelectorAll("img")].map(t=>this._waitForImageElement(t,e)),r=[...i.querySelectorAll("svg image")].map(t=>{const i=t.getAttribute("href")||t.getAttribute("xlink:href");return i?this._preloadUrl(i,t,e):Promise.resolve()}),s=o.flatMap(t=>function(e){if(!e||"none"===e)return[];const t=[],i=/url\((['"]?)(.*?)\1\)/g;let o;for(;null!==(o=i.exec(e));)o[2]&&t.push(o[2]);return t}(window.getComputedStyle(t).backgroundImage).map(i=>this._preloadUrl(i,t,e))),a=[...i.querySelectorAll("object, embed")].map(t=>Pn(new Promise(e=>{t.addEventListener("load",()=>{"OBJECT"!==t.tagName||t.contentDocument||this._markResourceStatus(t,"error"),e()},{once:!0}),t.addEventListener("error",()=>{this._markResourceStatus(t,"error"),e()},{once:!0})}),e,()=>this._markResourceStatus(t,"timeout")));await Promise.all([...n,...r,...s,...a])}_waitForImageElement(e,t){if(e.complete&&0===e.naturalWidth)return this._markResourceStatus(e,"error"),Promise.resolve();return Pn(e.decode?e.decode().catch(()=>{this._markResourceStatus(e,"error")}):e.complete?Promise.resolve():new Promise(t=>{e.addEventListener("load",t,{once:!0}),e.addEventListener("error",()=>{this._markResourceStatus(e,"error"),t()},{once:!0})}),t,()=>this._markResourceStatus(e,"timeout"))}_preloadUrl(e,t,i){if(!e||e.startsWith("data:"))return Promise.resolve();const o=new Image,n=new Promise(e=>{o.addEventListener("load",e,{once:!0}),o.addEventListener("error",()=>{this._markResourceStatus(t,"error"),e()},{once:!0})});return o.src=e,Pn(n,i,()=>this._markResourceStatus(t,"timeout"))}_markResourceStatus(e,t){e&&!e.hasAttribute(Mn)&&(this._DOM.setAttribute(e,`[${Mn}]`,t),this._debugMode&&console.log(`[HTML2PDF4DOC] Resource status: ${t}`,e),this._handleResourceIssue({element:e,status:t}))}_handleResourceIssue(e){if(!e||!e.element)return;const t={status:e.status,element:e.element,tag:e.element.tagName};this._resourceIssues.push(t),this._warnResourceIssue(t),this._emitResourceIssue(t)}_warnResourceIssue(e){console.warn(`[HTML2PDF4DOC] Resource ${e.status}`,e.element)}_emitResourceIssue(e){this._DOM.document.dispatchEvent(new CustomEvent("html2pdf4doc:resource-issue",{detail:e}))}}function Pn(e,t,i){return!t||t<=0?e.catch(()=>{}):new Promise(o=>{let n=!1;const r=setTimeout(()=>{n||(n=!0,i(),o())},t);e.catch(()=>{}).finally(()=>{n||(n=!0,clearTimeout(r),o())})})}const Cn=e=>!0===e||"true"===e;function En(e){const t=Array.isArray(e)?[]:{};return Object.entries(e).forEach(([e,i])=>{t[e]=!i||"object"!=typeof i||En(i)}),t}const Tn={DOM:{_:!1},layout:{_:!1},pages:{_:!1,_parseNode:!1,_parseNodes:!1,_registerPageStart:!1},paper:{_:!1},preview:{_:!1},toc:{_:!1},node:{_:!1,children:!1,creators:!1,flowFilters:!1,fitters:!1,getters:!1,markers:!1,media:!1,normalizer:!1,pageBreaks:!1,positioning:!1,selectors:!1,selectorHeuristics:!1,slicers:!1,splitters:!1,wrappers:!1,pagination:!1},paragraph:{_:!1},grid:{_:!1},pre:{_:!1},table:{_:!1},tableLike:{_:!1},testSignals:{forcedModeLog:!1}};function On(e){const t=function(e){let t={debugMode:!1,forcedDebugMode:!1,consoleAssert:!1,markupDebugMode:!1,resourceTimeoutMs:2e3,preloader:!1,preloaderTarget:"",preloaderBackground:"",mask:!0,noHangingSelectors:"",forcedPageBreakSelectors:"",pageBreakBeforeSelectors:"",pageBreakAfterSelectors:"",noBreakSelectors:"",tocPageNumberSelector:"html2pdf4doc-toc-page-number",printLeftMargin:"21mm",printRightMargin:"21mm",printTopMargin:"12mm",printBottomMargin:"12mm",printFontSize:"12pt",paperColor:"white",paperWidth:"210mm",paperHeight:"297mm",headerMargin:"16px",footerMargin:"16px",virtualPagesGap:"16px",splitLabelHeight:"24px"};const i={paperWidth:"210mm",paperHeight:"297mm"},o={paperWidth:"148.5mm",paperHeight:"210mm"};switch((e=function(e){const t={...e};for(const e in t){const i=t[e];if("string"==typeof i){const o=i.toLowerCase();"true"===o||"1"===o?t[e]=!0:"false"!==o&&"0"!==o&&""!==o||(t[e]=!1)}}return t}(e)).printPaperSize){case"A5":case"a5":t={...t,...o};break;default:t={...t,...i}}t={...t,initialRoot:N(x.init),tocPageNumberSelector:N(x.tocPageNumber),...e},console.info("[HTML2PDF4DOC] Config:",t);const n={printLeftMargin:t.printLeftMargin,printRightMargin:t.printRightMargin,printTopMargin:t.printTopMargin,printBottomMargin:t.printBottomMargin,printFontSize:t.printFontSize,paperWidth:t.paperWidth,paperHeight:t.paperHeight,headerMargin:t.headerMargin,footerMargin:t.footerMargin,virtualPagesGap:t.virtualPagesGap},r=document.createElement("div");return r.style="\n position:absolute;\n z-index:1000;\n left: 200%;\n ",document.body.append(r),Object.entries(n).forEach(([e,t])=>{r.style.width=t,n[e]=`${Math.trunc(r.getBoundingClientRect().width)}px`}),r.remove(),t={...t,...n},t.noHangingSelectors=t.noHangingSelectors+" H1 H2 H3 H4 H5 H6",t.forcedPageBreakSelectors=t.forcedPageBreakSelectors+" "+N(x.printForcedPageBreak),t.debugMode&&console.info("Config with converted units:",t),t}(e);t.forcedDebugMode&&(t.debugMode=!0,t.consoleAssert=!0,t.markupDebugMode=!0);const i=t.forcedDebugMode?En(Tn):Tn;return{...t,debugConfig:i}}const vn="color:Gray;border:1px solid;";class Dn{constructor(e){this.params=function(e={}){const t={...e};return[["printWidth","paperWidth","data-print-width","data-paper-width"],["printHeight","paperHeight","data-print-height","data-paper-height"]].forEach(([e,i,o,n])=>{Object.prototype.hasOwnProperty.call(t,e)&&(console.warn(`[HTML2PDF4DOC] Config option "${o}" is deprecated. Use "${n}" instead.`),Object.prototype.hasOwnProperty.call(t,i)||(t[i]=t[e]),delete t[e])}),t}(e),this.forcedDebugMode=Cn(e.forcedDebugMode),this.debugMode=Cn(e.debugMode)||this.forcedDebugMode,this.preloader=e.preloader,this.selector=x,this.config}async render(){console.time("[HTML2PDF4DOC] Total time"),function({kickReload:e=!1}={}){const t=document.createElement("style");t.setAttribute("data-html2pdf-sanitize",""),t.textContent="html2pdf4doc-content-flow * { contain: none !important; content-visibility: visible !important; }",document.head.appendChild(t);const i=["data-src","data-lazy-src","data-original","data-url"],o=["data-srcset","data-lazy-srcset"],n=(e,t)=>{for(const i of t){const t=e.getAttribute(i);if(t&&t.trim())return t.trim()}return""};for(const t of document.images){if("lazy"===t.getAttribute("loading")&&t.setAttribute("loading","eager"),!t.getAttribute("src")){const e=n(t,i);e&&t.setAttribute("src",e)}if(!t.getAttribute("srcset")){const e=n(t,o);e&&t.setAttribute("srcset",e)}if(e){const e=t.getAttribute("src"),i=t.getAttribute("srcset");e&&(t.setAttribute("src",""),t.setAttribute("src",e)),i&&(t.setAttribute("srcset",""),t.setAttribute("srcset",i))}}for(const e of document.querySelectorAll("picture source"))if(!e.getAttribute("srcset")){const t=n(e,o);t&&e.setAttribute("srcset",t)}}(),this.debugMode&&console.log("🏁 document.readyState:",document.readyState),document.addEventListener("readystatechange",e=>{this.debugMode&&console.log("🏁 readystatechange:",document.readyState)}),this.debugMode&&console.time("⏱️ await DOMContentLoaded time"),"loading"===document.readyState?await new Promise(e=>{window.addEventListener("DOMContentLoaded",t=>{this.debugMode&&console.log("⏰ EVENT: DOMContentLoaded"),e()})}):this.debugMode&&console.log("🕰️ EVENT: DOMContentLoaded (event fired before init)"),this.debugMode&&console.timeEnd("⏱️ await DOMContentLoaded time"),this.debugMode&&console.time("⏱️ create Preloader time");const e=new Sn(this.params);"true"===this.preloader&&e.create(),this.debugMode&&console.timeEnd("⏱️ create Preloader time"),this.debugMode&&console.time("⏱️ Config time"),this.debugMode&&console.groupCollapsed("%c config ",vn+"color:LightGray"),this.config=On(this.params),this.debugMode&&console.groupEnd(),this.debugMode&&console.info("⚙️ Current config with debugConfig:",this.config),this.debugMode&&console.timeEnd("⏱️ Config time"),this.config.debugConfig.testSignals.forcedModeLog&&console.info("[HTML2PDF4DOC] 🛠️ Forced debug mode is active."),this.config.consoleAssert&&console.info("[HTML2PDF4DOC] 🧧 Assertions enabled."),this.debugMode&&console.time("⏱️ DOM helpers init time");const t=new L({DOM:window.document,config:this.config});this.debugMode&&console.timeEnd("⏱️ DOM helpers init time"),this.debugMode&&console.time("⏱️ node helpers init time");const i=new ln({config:this.config,DOM:t,selector:this.selector});this.debugMode&&console.timeEnd("⏱️ node helpers init time"),this.debugMode&&console.time("⏱️ await window load time"),"complete"!==document.readyState?await new Promise(e=>{window.addEventListener("load",t=>{this.debugMode&&console.log("⏰ EVENT: window load"),e()})}):this.debugMode&&console.log("🕰️ EVENT: window load (event fired before init)"),this.debugMode&&console.timeEnd("⏱️ await window load time"),this.debugMode&&console.time("⏱️ Layout time"),this.debugMode&&console.groupCollapsed("%c Layout ",vn);const o=new G({config:this.config,DOM:t,selector:this.selector,node:i});if(o.create(),this.debugMode&&console.groupEnd(),this.debugMode&&console.timeEnd("⏱️ Layout time"),!o.success)return void(this.debugMode&&console.error("Failed to create layout.\n\nWe have to interrupt the process of creating PDF preview."));this.debugMode&&console.time("⏱️ Preprocess time"),this.debugMode&&console.groupCollapsed("%c Preprocess ",vn),await new yn(this.config,t).run(),this.debugMode&&console.groupEnd(),this.debugMode&&console.timeEnd("⏱️ Preprocess time"),this.debugMode&&console.info("%c calculate Paper params ",vn),this.debugMode&&console.time("⏱️ Paper time");const n=new _n({config:this.config,DOM:t,selector:this.selector,node:i,layout:o});if(this.debugMode&&console.timeEnd("⏱️ Paper time"),!n||!n.bodyHeight||!n.bodyWidth)return void(this.debugMode&&console.error("Failed to create paper calculations.\n\nWe have to interrupt the process of creating PDF preview."));this.debugMode&&console.time("⏱️ Pages time"),this.debugMode&&console.group("%c Pages ",vn);const r=function(){const e=[];return{enqueue(t){"function"==typeof t&&e.push(t)},flush(){for(const t of e)t();e.length=0}}}(),s=new pn({config:this.config,DOM:t,selector:this.selector,node:i,layout:o,referenceHeight:n.bodyHeight,referenceWidth:n.bodyWidth,mutationQueue:r}).calculate();this.debugMode&&console.groupEnd(),this.debugMode&&console.timeEnd("⏱️ Pages time"),this.debugMode&&console.time("⏱️ Preview time"),this.debugMode&&console.groupCollapsed("%c Preview ",vn);const a=new fn({config:this.config,DOM:t,selector:this.selector,node:i,layout:o,paper:n,pages:s,mutationQueue:r}).create();this.debugMode&&console.groupEnd(),this.debugMode&&console.timeEnd("⏱️ Preview time"),this.debugMode&&console.time("⏱️ Toc time"),new mn({config:this.config,DOM:t,selector:this.selector,node:i,layout:o}).render(),this.debugMode&&console.timeEnd("⏱️ Toc time"),this.debugMode&&console.time("⏱️ Validator time"),window.scrollTo(0,document.body.scrollHeight),await new Promise(e=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{window.scrollTo(0,0),e()})})}),new bn({config:this.config,DOM:t,selector:this.selector,node:i,layout:o,pages:s,previewValidations:a}).init(),this.debugMode&&console.timeEnd("⏱️ Validator time"),t.setAttribute(o.root,"[success]"),t.setAttribute(o.root,"[pages]",s.length),e.remove(),console.info("[HTML2PDF4DOC] Page count:",s.length),console.timeEnd("[HTML2PDF4DOC] Total time")}}console.info("[HTML2PDF4DOC] Version:","0.3.0");const kn=document.currentScript,Rn=kn&&kn.dataset;let Nn=null,xn=!1;function Bn(){xn&&Nn&&Nn.render()}Rn?(Nn=new Dn(Rn),xn="manual"===Rn.init,xn&&console.info("HTML2PDF4DOC in manual initialization mode"),!xn&&Nn.render()):console.warn('[HTML2PDF4DOC] ⛔ Unable to read parameters from the current