@devmm/puredocs-excel-formula 1.0.7 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/formula-value.ts","../src/formula-token.ts","../src/formula-lexer.ts","../src/formula-node.ts","../src/formula-parser.ts","../src/criteria-index.ts","../src/functions/math-functions.ts","../src/functions/text-functions.ts","../src/functions/logical-functions.ts","../src/functions/date-functions.ts","../src/functions/lookup-functions.ts","../src/functions/statistical-functions.ts","../src/functions/info-functions.ts","../src/functions/finance-functions.ts","../src/functions/meta-functions.ts","../src/functions/aggregate-functions.ts","../src/functions/array-functions.ts","../src/function-registry.ts","../src/formula-context.ts","../src/lru-cache.ts","../src/formula-evaluator.ts","../src/range-cache.ts","../src/recalc-references.ts","../src/dependency-index.ts","../src/recalc-engine.ts"],"names":["FormulaError","num","value","rows","columns","row","offset","TokenType","upper","BinaryOperator","UnaryOperator","left","right","ln","arg","_pos","i","mid","exact","len","count","code","mode","out","best","column","sumSq","a","pv","fv","pmt","rate","nper","sum","days","cellRefFromRowCol","countA","variance","asArray","byCol","byRow","FormulaHelper","_functions","parseCellRef","resolveName","EXCEL_MAX_ROWS","EXCEL_MAX_COLUMNS","TILE_ROWS","TILE_COLS","_placements","cellKey"],"mappings":";;;;;;;;;;;;;;;;;;AAUO,IAAW,YAAA,qBAAAA,aAAAA,KAAX;AACL,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,UAAQ,CAAA,CAAA,GAAR,MAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,UAAQ,CAAA,CAAA,GAAR,MAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,UAAQ,CAAA,CAAA,GAAR,MAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,WAAQ,CAAA,CAAA,GAAR,OAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,SAAQ,CAAA,CAAA,GAAR,KAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,UAAQ,CAAA,CAAA,GAAR,MAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,SAAQ,CAAA,CAAA,GAAR,KAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,QAAQ,CAAA,CAAA,GAAR,IAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,UAAQ,CAAA,CAAA,GAAR,MAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,WAAQ,CAAA,CAAA,GAAR,OAAA;AAVgB,EAAA,OAAAA,aAAAA;AAAA,CAAA,EAAA,YAAA,IAAA,EAAA;AAoCX,IAAM,WAAN,MAAe;AAAA,EACpB,WAAA,CAAqB,QAA6B,IAAA,EAAsB;AAAnD,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAA6B,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAuB;AAC3E,CAAA;AAhDA,IAAA,IAAA,EAAA,IAAA;AAkDO,IAAM,aAAA,GAAN,MAAM,aAAA,CAAa;AAAA,EAQhB,YACN,IAAA,EACAC,IAAAA,GAAM,CAAA,EACN,GAAA,EACA,YAA0B,CAAA,aAC1B;AAVF;AAAA,IAAA,YAAA,CAAA,IAAA,EAAS,IAAA,CAAA;AAET;AAAA,IAAA,YAAA,CAAA,IAAA,EAAS,IAAA,CAAA;AASP,IAAA,IAAA,CAAK,IAAA,GAAY,IAAA;AACjB,IAAA,YAAA,CAAA,IAAA,EAAK,IAAA,EAAYA,IAAAA,CAAAA;AACjB,IAAA,YAAA,CAAA,IAAA,EAAK,IAAA,EAAY,GAAA,CAAA;AACjB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAAA;AAAA,EAoBA,OAAO,OAAO,CAAA,EAAyB;AACrC,IAAA,IAAI,CAAA,KAAM,CAAA,EAAG,OAAO,aAAA,CAAa,IAAA;AACjC,IAAA,IAAI,CAAA,KAAM,CAAA,EAAG,OAAO,aAAA,CAAa,GAAA;AACjC,IAAA,OAAO,IAAI,aAAA,CAAa,QAAA,EAAU,CAAC,CAAA;AAAA,EACrC;AAAA,EAEA,OAAO,KAAK,CAAA,EAAyB;AACnC,IAAA,IAAI,CAAA,KAAM,EAAA,EAAI,OAAO,aAAA,CAAa,WAAA;AAClC,IAAA,OAAO,IAAI,aAAA,CAAa,MAAA,EAAQ,CAAA,EAAG,CAAC,CAAA;AAAA,EACtC;AAAA,EAEA,OAAO,QAAQ,CAAA,EAA0B;AACvC,IAAA,OAAO,CAAA,GAAI,aAAA,CAAa,KAAA,GAAQ,aAAA,CAAa,MAAA;AAAA,EAC/C;AAAA,EAEA,OAAO,MAAM,CAAA,EAA+B;AAC1C,IAAA,QAAQ,CAAA;AAAG,MACT,KAAK,CAAA;AAAoB,QAAA,OAAO,aAAA,CAAa,SAAA;AAAA,MAC7C,KAAK,CAAA;AAAoB,QAAA,OAAO,aAAA,CAAa,UAAA;AAAA,MAC7C,KAAK,CAAA;AAAoB,QAAA,OAAO,aAAA,CAAa,QAAA;AAAA,MAC7C,KAAK,CAAA;AAAoB,QAAA,OAAO,aAAA,CAAa,SAAA;AAAA,MAC7C,KAAK,CAAA;AAAoB,QAAA,OAAO,aAAA,CAAa,OAAA;AAAA,MAC7C,KAAK,CAAA;AAAoB,QAAA,OAAO,aAAA,CAAa,QAAA;AAAA,MAC7C,KAAK,CAAA;AAAoB,QAAA,OAAO,aAAA,CAAa,SAAA;AAAA,MAC7C;AAAS,QAAA,OAAO,IAAI,aAAA,CAAa,OAAA,EAAS,CAAA,EAAG,QAAW,CAAC,CAAA;AAAA;AAC3D,EACF;AAAA,EAEA,OAAO,MAAM,CAAA,EAA6B;AACxC,IAAA,OAAO,IAAI,aAAA,CAAa,OAAA,EAAS,CAAA,EAAG,CAAC,CAAA;AAAA,EACvC;AAAA,EAEA,OAAO,OAAO,EAAA,EAA8B;AAC1C,IAAA,OAAO,IAAI,aAAA,CAAa,QAAA,EAAU,CAAA,EAAG,EAAE,CAAA;AAAA,EACzC;AAAA;AAAA,EAIA,IAAI,OAAA,GAAqB;AAAE,IAAA,OAAO,KAAK,IAAA,KAAS,OAAA;AAAA,EAAS;AAAA,EACzD,IAAI,QAAA,GAAqB;AAAE,IAAA,OAAO,KAAK,IAAA,KAAS,QAAA;AAAA,EAAU;AAAA,EAC1D,IAAI,MAAA,GAAqB;AAAE,IAAA,OAAO,KAAK,IAAA,KAAS,MAAA;AAAA,EAAQ;AAAA,EACxD,IAAI,SAAA,GAAqB;AAAE,IAAA,OAAO,KAAK,IAAA,KAAS,SAAA;AAAA,EAAW;AAAA,EAC3D,IAAI,OAAA,GAAqB;AAAE,IAAA,OAAO,KAAK,IAAA,KAAS,OAAA;AAAA,EAAS;AAAA,EACzD,IAAI,OAAA,GAAqB;AAAE,IAAA,OAAO,KAAK,IAAA,KAAS,OAAA;AAAA,EAAS;AAAA,EACzD,IAAI,QAAA,GAAqB;AAAE,IAAA,OAAO,KAAK,IAAA,KAAS,QAAA;AAAA,EAAU;AAAA,EAC1D,IAAI,SAAA,GAAqB;AAAE,IAAA,OAAO,KAAK,IAAA,KAAS,QAAA,IAAY,KAAK,IAAA,KAAS,SAAA,IAAa,KAAK,IAAA,KAAS,OAAA;AAAA,EAAS;AAAA;AAAA,EAI9G,IAAI,WAAA,GAA2B;AAAE,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA;AAAA,EAAM;AAAA,EACnD,IAAI,SAAA,GAA2B;AAAE,IAAA,OAAQ,mBAAK,IAAA,CAAA,IAAmB,EAAA;AAAA,EAAI;AAAA,EACrE,IAAI,YAAA,GAA2B;AAAE,IAAA,OAAO,mBAAK,IAAA,CAAA,KAAS,CAAA;AAAA,EAAG;AAAA,EACzD,IAAI,QAAA,GAA2B;AAAE,IAAA,OAAQ,YAAA,CAAA,IAAA,EAAK,SAAuB,UAAA,CAAW,KAAA;AAAA,EAAO;AAAA,EACvF,IAAI,SAAA,GAA2B;AAAE,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA;AAAA,EAAoB;AAAA;AAAA,EAIjE,cAAA,GAA+B;AAC7B,IAAA,QAAQ,KAAK,IAAA;AAAM,MACjB,KAAK,QAAA;AAAW,QAAA,OAAO,IAAA;AAAA,MACvB,KAAK,OAAA;AAAW,QAAA,OAAO,aAAA,CAAa,IAAA;AAAA,MACpC,KAAK,SAAA;AAAW,QAAA,OAAO,aAAA,CAAa,MAAA,CAAO,YAAA,CAAA,IAAA,EAAK,IAAA,CAAI,CAAA;AAAA,MACpD,KAAK,OAAA;AAAW,QAAA,OAAO,IAAA;AAAA,MACvB,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,CAAA,GAAI,UAAA,CAAW,IAAA,CAAK,SAAS,CAAA;AACnC,QAAA,OAAO,MAAM,CAAC,CAAA,GAAI,cAAa,UAAA,GAAa,aAAA,CAAa,OAAO,CAAC,CAAA;AAAA,MACnE;AAAA,MACA;AAAS,QAAA,OAAO,aAAA,CAAa,UAAA;AAAA;AAC/B,EACF;AAAA,EAEA,WAAA,GAA2D;AACzD,IAAA,QAAQ,KAAK,IAAA;AAAM,MACjB,KAAK,QAAA;AAAW,QAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,mBAAK,IAAA,CAAA,EAAK;AAAA,MACpD,KAAK,OAAA;AAAW,QAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,CAAA,EAAE;AAAA,MAC5C,KAAK,SAAA;AAAW,QAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,mBAAK,IAAA,CAAA,EAAK;AAAA,MACpD,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,CAAA,GAAI,UAAA,CAAW,IAAA,CAAK,SAAS,CAAA;AACnC,QAAA,OAAO,KAAA,CAAM,CAAC,CAAA,GAAI,EAAE,EAAA,EAAI,KAAA,EAAM,GAAI,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,CAAA,EAAE;AAAA,MACzD;AAAA,MACA;AAAS,QAAA,OAAO,EAAE,IAAI,KAAA,EAAM;AAAA;AAC9B,EACF;AAAA,EAEA,YAAA,GAA6B;AAC3B,IAAA,QAAQ,KAAK,IAAA;AAAM,MACjB,KAAK,SAAA;AAAW,QAAA,OAAO,IAAA;AAAA,MACvB,KAAK,QAAA;AAAW,QAAA,OAAO,aAAA,CAAa,OAAA,CAAQ,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,KAAS,CAAC,CAAA;AAAA,MAC3D,KAAK,OAAA;AAAW,QAAA,OAAO,aAAA,CAAa,MAAA;AAAA,MACpC,KAAK,OAAA;AAAW,QAAA,OAAO,IAAA;AAAA,MACvB,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,WAAA,EAAY;AACrC,QAAA,IAAI,CAAA,KAAM,MAAA,EAAS,OAAO,aAAA,CAAa,KAAA;AACvC,QAAA,IAAI,CAAA,KAAM,OAAA,EAAS,OAAO,aAAA,CAAa,MAAA;AACvC,QAAA,OAAO,aAAA,CAAa,UAAA;AAAA,MACtB;AAAA,MACA;AAAS,QAAA,OAAO,aAAA,CAAa,UAAA;AAAA;AAC/B,EACF;AAAA,EAEA,MAAA,GAAiB;AACf,IAAA,QAAQ,KAAK,IAAA;AAAM,MACjB,KAAK,MAAA;AAAW,QAAA,OAAO,IAAA,CAAK,SAAA;AAAA,MAC5B,KAAK,QAAA;AAAW,QAAA,OAAO,MAAA,CAAO,mBAAK,IAAA,CAAI,CAAA;AAAA,MACvC,KAAK,SAAA;AAAW,QAAA,OAAO,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,KAAS,CAAA,GAAI,MAAA,GAAS,OAAA;AAAA,MAClD,KAAK,OAAA;AAAW,QAAA,OAAO,EAAA;AAAA,MACvB,KAAK,OAAA;AAAW,QAAA,OAAO,aAAA,CAAa,aAAA,CAAc,IAAA,CAAK,SAAS,CAAA;AAAA,MAChE,KAAK,QAAA;AAAW,QAAA,OAAO,aAAA,CAAa,cAAc,CAAA,YAAiB;AAAA,MACnE;AAAgB,QAAA,OAAO,EAAA;AAAA;AACzB,EACF;AAAA;AAAA,EAIA,OAAO,QAAA,CAAS,CAAA,EAAiB,CAAA,EAA0B;AACzD,IAAA,IAAI,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,EAAS,OAAO,IAAA;AACnC,IAAA,IAAI,EAAE,OAAA,EAAS;AACb,MAAA,IAAI,EAAE,QAAA,EAAW,OAAO,KAAK,GAAA,CAAI,CAAA,CAAE,WAAW,CAAA,GAAI,KAAA;AAClD,MAAA,IAAI,CAAA,CAAE,MAAA,EAAW,OAAO,CAAA,CAAE,SAAA,KAAc,EAAA;AACxC,MAAA,IAAI,CAAA,CAAE,SAAA,EAAW,OAAO,CAAC,CAAA,CAAE,YAAA;AAC3B,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,EAAE,OAAA,EAAS,OAAO,aAAA,CAAa,QAAA,CAAS,GAAG,CAAC,CAAA;AAChD,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,CAAA,CAAE,IAAA,EAAM,OAAO,KAAA;AAC9B,IAAA,QAAQ,EAAE,IAAA;AAAM,MACd,KAAK,QAAA;AAAW,QAAA,OAAO,KAAK,GAAA,CAAI,YAAA,CAAA,CAAA,EAAE,IAAA,CAAA,GAAO,YAAA,CAAA,CAAA,EAAE,KAAI,CAAA,GAAI,KAAA;AAAA,MACnD,KAAK,SAAA;AAAW,QAAA,OAAO,YAAA,CAAA,CAAA,EAAE,UAAS,YAAA,CAAA,CAAA,EAAE,IAAA,CAAA;AAAA,MACpC,KAAK,MAAA;AAAW,QAAA,OAAO,EAAE,SAAA,CAAU,WAAA,EAAY,KAAM,CAAA,CAAE,UAAU,WAAA,EAAY;AAAA,MAC7E;AAAgB,QAAA,OAAO,KAAA;AAAA;AACzB,EACF;AAAA;AAAA,EAGA,OAAO,OAAA,CAAQ,CAAA,EAAiB,CAAA,EAAyB;AACvD,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAoB,CAAA,CAAE,SAAS,SAAA,GAAY,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,CAAA;AAC7E,IAAA,MAAM,KAAK,KAAA,CAAM,CAAC,CAAA,EAAG,EAAA,GAAK,MAAM,CAAC,CAAA;AACjC,IAAA,IAAI,EAAA,KAAO,EAAA,EAAI,OAAO,EAAA,GAAK,EAAA;AAC3B,IAAA,QAAQ,EAAA;AAAI,MACV,KAAK,CAAA;AAAG,QAAA,OAAA,CAAQ,CAAA,CAAE,UAAU,CAAA,GAAI,CAAA,CAAE,gBAAgB,CAAA,CAAE,OAAA,GAAU,IAAI,CAAA,CAAE,WAAA,CAAA;AAAA,MACpE,KAAK,CAAA;AAAG,QAAA,OAAO,EAAE,SAAA,CAAU,WAAA,EAAY,GAAI,CAAA,CAAE,UAAU,WAAA,EAAY,GAAI,EAAA,GAAK,CAAA,CAAE,UAAU,WAAA,EAAY,GAAI,EAAE,SAAA,CAAU,WAAA,KAAgB,CAAA,GAAI,CAAA;AAAA,MACxI,KAAK,CAAA;AAAG,QAAA,OAAO,YAAA,CAAA,CAAA,EAAE,QAAO,YAAA,CAAA,CAAA,EAAE,IAAA,CAAA;AAAA,MAC1B;AAAS,QAAA,OAAO,CAAA;AAAA;AAClB,EACF;AAAA;AAAA,EAIA,OAAO,cAAc,CAAA,EAAyB;AAC5C,IAAA,MAAM,GAAA,GAAoC;AAAA,MACxC,CAAC,eAAqB,EAAA;AAAA,MACtB,CAAC,eAAqB,QAAA;AAAA,MACtB,CAAC,eAAqB,SAAA;AAAA,MACtB,CAAC,gBAAqB,SAAA;AAAA,MACtB,CAAC,cAAqB,OAAA;AAAA,MACtB,CAAC,eAAqB,QAAA;AAAA,MACtB,CAAC,cAAqB,OAAA;AAAA,MACtB,CAAC,aAAqB,MAAA;AAAA,MACtB,CAAC,eAAqB,QAAA;AAAA,MACtB,CAAC,gBAAqB;AAAA,KACxB;AACA,IAAA,OAAO,GAAA,CAAI,CAAC,CAAA,IAAK,SAAA;AAAA,EACnB;AAAA,EAEA,OAAO,gBAAgB,CAAA,EAAyB;AAC9C,IAAA,MAAM,GAAA,GAAoC;AAAA,MACxC,QAAA,EAAY,CAAA;AAAA,MACZ,SAAA,EAAY,CAAA;AAAA,MACZ,SAAA,EAAY,CAAA;AAAA,MACZ,OAAA,EAAY,CAAA;AAAA,MACZ,QAAA,EAAY,CAAA;AAAA,MACZ,OAAA,EAAY,CAAA;AAAA,MACZ,MAAA,EAAY,CAAA;AAAA,MACZ,QAAA,EAAY,CAAA;AAAA,MACZ,SAAA,EAAY,CAAA;AAAA,KACd;AACA,IAAA,OAAO,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AAAA,EACnB;AAAA;AAAA,EAIA,OAAO,eAAeC,MAAAA,EAA8B;AAClD,IAAA,IAAIA,MAAAA,KAAU,IAAA,IAAQA,MAAAA,KAAU,MAAA,SAAkB,aAAA,CAAa,KAAA;AAC/D,IAAA,IAAI,OAAOA,MAAAA,KAAU,QAAA,EAAW,OAAO,KAAA,CAAMA,MAAK,CAAA,GAAI,aAAA,CAAa,UAAA,GAAa,aAAA,CAAa,MAAA,CAAOA,MAAK,CAAA;AACzG,IAAA,IAAI,OAAOA,MAAAA,KAAU,SAAA,EAAW,OAAO,aAAA,CAAa,QAAQA,MAAK,CAAA;AACjE,IAAA,IAAI,OAAOA,MAAAA,KAAU,QAAA,EAAW,OAAOA,MAAAA,KAAU,KAAK,aAAA,CAAa,KAAA,GAAQ,aAAA,CAAa,IAAA,CAAKA,MAAK,CAAA;AAClG,IAAA,IAAIA,kBAAiB,IAAA,EAAM;AACzB,MAAA,OAAO,aAAA,CAAa,MAAA,CAAO,QAAA,CAASA,MAAK,CAAC,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,aAAA,CAAa,IAAA,CAAK,MAAA,CAAOA,MAAK,CAAC,CAAA;AAAA,EACxC;AAAA,EAEA,QAAA,GAAoB;AAClB,IAAA,QAAQ,KAAK,IAAA;AAAM,MACjB,KAAK,QAAA;AAAW,QAAA,OAAO,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA;AAAA,MAC5B,KAAK,MAAA;AAAW,QAAA,OAAO,IAAA,CAAK,SAAA;AAAA,MAC5B,KAAK,SAAA;AAAW,QAAA,OAAO,IAAA,CAAK,YAAA;AAAA,MAC5B,KAAK,OAAA;AAAW,QAAA,OAAO,IAAA;AAAA,MACvB,KAAK,OAAA;AAAW,QAAA,OAAO,aAAA,CAAa,aAAA,CAAc,IAAA,CAAK,SAAS,CAAA;AAAA,MAChE,KAAK,OAAA;AAAW,QAAA,OAAO,IAAA,CAAK,SAAS,aAAA,EAAc;AAAA,MACnD,KAAK,QAAA;AAAW,QAAA,OAAO,aAAA,CAAa,cAAc,CAAA,YAAiB;AAAA,MACnE;AAAgB,QAAA,OAAO,IAAA;AAAA;AACzB,EACF;AAAA,EAEA,QAAA,GAAmB;AAAE,IAAA,OAAO,KAAK,MAAA,EAAO;AAAA,EAAG;AAC7C,CAAA;AAhPW,IAAA,GAAA,IAAA,OAAA,EAAA;AAEA,IAAA,GAAA,IAAA,OAAA,EAAA;AAAA;AALE,aAAA,CAsBK,KAAA,GAAc,IAAI,aAAA,CAAa,OAAO,CAAA;AAtB3C,aAAA,CAuBK,IAAA,GAAc,IAAI,aAAA,CAAa,QAAA,EAAU,CAAC,CAAA;AAvB/C,aAAA,CAwBK,GAAA,GAAc,IAAI,aAAA,CAAa,QAAA,EAAU,CAAC,CAAA;AAxB/C,aAAA,CAyBK,KAAA,GAAc,IAAI,aAAA,CAAa,SAAA,EAAW,CAAC,CAAA;AAzBhD,aAAA,CA0BK,MAAA,GAAc,IAAI,aAAA,CAAa,SAAA,EAAW,CAAC,CAAA;AA1BhD,aAAA,CA2BK,WAAA,GAAc,IAAI,aAAA,CAAa,MAAA,EAAQ,GAAG,EAAE,CAAA;AA3BjD,aAAA,CA4BK,YAAc,IAAI,aAAA,CAAa,OAAA,EAAS,CAAA,EAAG,QAAW,CAAA,YAAiB;AA5B5E,aAAA,CA6BK,aAAc,IAAI,aAAA,CAAa,OAAA,EAAS,CAAA,EAAG,QAAW,CAAA,aAAkB;AA7B7E,aAAA,CA8BK,WAAc,IAAI,aAAA,CAAa,OAAA,EAAS,CAAA,EAAG,QAAW,CAAA,WAAgB;AA9B3E,aAAA,CA+BK,YAAc,IAAI,aAAA,CAAa,OAAA,EAAS,CAAA,EAAG,QAAW,CAAA,YAAiB;AA/B5E,aAAA,CAgCK,UAAc,IAAI,aAAA,CAAa,OAAA,EAAS,CAAA,EAAG,QAAW,CAAA,UAAe;AAhC1E,aAAA,CAiCK,WAAc,IAAI,aAAA,CAAa,OAAA,EAAS,CAAA,EAAG,QAAW,CAAA,WAAgB;AAjC3E,aAAA,CAkCK,YAAc,IAAI,aAAA,CAAa,OAAA,EAAS,CAAA,EAAG,QAAW,CAAA,YAAiB;AAlClF,IAAM,YAAA,GAAN;AAlDP,IAAA,KAAA;AA6SO,IAAM,WAAA,GAAN,MAAM,WAAA,CAAW;AAAA,EAOtB,WAAA,CAAYC,OAAcC,QAAAA,EAAiB;AAJ3C,IAAA,YAAA,CAAA,IAAA,EAAS,KAAA,CAAA;AAKP,IAAA,IAAA,CAAK,IAAA,GAAUD,KAAAA;AACf,IAAA,IAAA,CAAK,OAAA,GAAUC,QAAAA;AACf,IAAA,YAAA,CAAA,IAAA,EAAK,KAAA,EAAU,IAAI,KAAA,CAAoBD,KAAAA,GAAOC,QAAO,CAAA,CAAE,IAAA,CAAK,aAAa,KAAK,CAAA,CAAA;AAAA,EAChF;AAAA,EAEA,IAAI,MAAA,GAAiB;AAAE,IAAA,OAAO,mBAAK,KAAA,CAAA,CAAM,MAAA;AAAA,EAAQ;AAAA,EAEjD,GAAA,CAAIC,MAAa,GAAA,EAA2B;AAC1C,IAAA,IAAIA,IAAAA,GAAM,KAAKA,IAAAA,IAAO,IAAA,CAAK,QAAQ,GAAA,GAAM,CAAA,IAAK,GAAA,IAAO,IAAA,CAAK,OAAA,EAAS;AACjE,MAAA,OAAO,YAAA,CAAa,QAAA;AAAA,IACtB;AACA,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAMA,IAAAA,GAAM,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,EAC5C;AAAA,EAEA,GAAA,CAAIA,IAAAA,EAAa,GAAA,EAAaH,MAAAA,EAA2B;AACvD,IAAA,IAAIG,IAAAA,IAAO,KAAKA,IAAAA,GAAM,IAAA,CAAK,QAAQ,GAAA,IAAO,CAAA,IAAK,GAAA,GAAM,IAAA,CAAK,OAAA,EAAS;AACjE,MAAA,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAMA,IAAAA,GAAM,IAAA,CAAK,OAAA,GAAU,GAAG,CAAA,GAAIH,MAAAA;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,QAAQ,KAAA,EAA6B;AACnC,IAAA,OAAO,KAAA,IAAS,CAAA,IAAK,KAAA,GAAQ,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,SACpC,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,KAAK,CAAA,GAChB,YAAA,CAAa,QAAA;AAAA,EACnB;AAAA,EAEA,OAAA,CAAQ,OAAeA,MAAAA,EAA2B;AAChD,IAAA,IAAI,KAAA,IAAS,CAAA,IAAK,KAAA,GAAQ,YAAA,CAAA,IAAA,EAAK,OAAM,MAAA,EAAQ;AAC3C,MAAA,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,KAAK,CAAA,GAAIA,MAAAA;AAAA,IACtB;AAAA,EACF;AAAA;AAAA,EAGA,MAAA,GAAiC;AAAE,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA;AAAA,EAAO;AAAA,EAEtD,aAAA,GAA2B;AACzB,IAAA,OAAO,mBAAK,KAAA,CAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,UAAU,CAAA;AAAA,EACzC;AAAA;AAAA,EAGA,OAAO,SAAS,MAAA,EAAoC;AAClD,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW,MAAA,CAAO,QAAQ,CAAC,CAAA;AAC3C,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAC,CAAA;AAC1C,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAGA,OAAO,WAAWA,MAAAA,EAAiC;AACjD,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAW,CAAA,EAAG,CAAC,CAAA;AAC/B,IAAA,GAAA,CAAI,OAAA,CAAQ,GAAGA,MAAK,CAAA;AACpB,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAGA,OAAO,SAAA,CACL,CAAA,EACA,CAAA,EACA,EAAA,EACY;AACZ,IAAA,MAAMC,QAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,IAAA,EAAM,EAAE,IAAI,CAAA;AACpC,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,OAAA,EAAS,EAAE,OAAO,CAAA;AAG1C,IAAA,IAAK,EAAE,IAAA,KAAS,CAAA,IAAK,EAAE,IAAA,KAAS,CAAA,IAAK,EAAE,IAAA,KAAS,CAAA,CAAE,QAC7C,CAAA,CAAE,OAAA,KAAY,KAAK,CAAA,CAAE,OAAA,KAAY,KAAK,CAAA,CAAE,OAAA,KAAY,EAAE,OAAA,EAAU;AACnE,MAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAWA,KAAAA,EAAM,IAAI,CAAA;AACrC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,EAAQ,KAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,YAAA,CAAa,UAAU,CAAA;AAC3E,MAAA,OAAO,GAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAWA,KAAAA,EAAM,IAAI,CAAA;AACxC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIA,KAAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,CAAA,GAAI,CAAA,CAAE,IAAA,GAAO,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,CAAA,GAAI,CAAC,CAAA;AAC1D,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,CAAA,GAAI,CAAA,CAAE,IAAA,GAAO,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,CAAA,GAAI,CAAC,CAAA;AAC1D,QAAA,MAAA,CAAO,IAAI,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,EAAA,EAAI,EAAE,CAAC,CAAA;AAAA,MAC7B;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGA,iBAAA,CAAkB,UAAA,EAAoB,UAAA,EAAoB,aAAA,EAAuB,aAAA,EAAqC;AACpH,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,CAAA,IAAK,IAAA,CAAK,OAAA,KAAY,GAAG,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AAC/D,IAAA,IAAI,IAAA,CAAK,YAAY,CAAA,EAAG;AACtB,MAAA,MAAMG,UAAS,UAAA,GAAa,aAAA;AAC5B,MAAA,OAAOA,OAAAA,IAAU,CAAA,IAAKA,OAAAA,GAAS,IAAA,CAAK,IAAA,GAAO,KAAK,GAAA,CAAIA,OAAAA,EAAQ,CAAC,CAAA,GAAI,YAAA,CAAa,UAAA;AAAA,IAChF;AACA,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,MAAA,MAAMA,UAAS,UAAA,GAAa,aAAA;AAC5B,MAAA,OAAOA,OAAAA,IAAU,CAAA,IAAKA,OAAAA,GAAS,IAAA,CAAK,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,EAAGA,OAAM,CAAA,GAAI,YAAA,CAAa,UAAA;AAAA,IACnF;AACA,IAAA,MAAM,KAAK,UAAA,GAAa,aAAA;AACxB,IAAA,MAAM,KAAK,UAAA,GAAa,aAAA;AACxB,IAAA,OAAO,EAAA,IAAM,CAAA,IAAK,EAAA,GAAK,IAAA,CAAK,QAAQ,EAAA,IAAM,CAAA,IAAK,EAAA,GAAK,IAAA,CAAK,UACrD,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,IACf,YAAA,CAAa,UAAA;AAAA,EACnB;AAAA,EAEA,SAAA,GAAwB;AACtB,IAAA,MAAM,SAAS,IAAI,WAAA,CAAW,IAAA,CAAK,OAAA,EAAS,KAAK,IAAI,CAAA;AACrD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAM,CAAA,EAAA,EAAK;AAClC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,SAAS,CAAA,EAAA,EAAK;AACrC,QAAA,MAAA,CAAO,IAAI,CAAA,EAAG,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,MACjC;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAA;AAjHW,KAAA,GAAA,IAAA,OAAA,EAAA;AAHE,WAAA,CACK,KAAA,GAAQ,IAAI,WAAA,CAAW,CAAA,EAAG,CAAC,CAAA;AADtC,IAAM,UAAA,GAAN;;;ACxSA,IAAW,SAAA,qBAAAC,UAAAA,KAAX;AACL,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,eAAA,CAAA,GAAA,CAAA,CAAA,GAAA,eAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,UAAA,CAAA,GAAA,CAAA,CAAA,GAAA,UAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,WAAA,CAAA,GAAA,CAAA,CAAA,GAAA,WAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,YAAA,CAAA,GAAA,CAAA,CAAA,GAAA,YAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,OAAA,CAAA,GAAA,EAAA,CAAA,GAAA,OAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,UAAA,CAAA,GAAA,EAAA,CAAA,GAAA,UAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,QAAA,CAAA,GAAA,EAAA,CAAA,GAAA,QAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,OAAA,CAAA,GAAA,EAAA,CAAA,GAAA,OAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,SAAA,CAAA,GAAA,EAAA,CAAA,GAAA,SAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,WAAA,CAAA,GAAA,EAAA,CAAA,GAAA,WAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,OAAA,CAAA,GAAA,EAAA,CAAA,GAAA,OAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,UAAA,CAAA,GAAA,EAAA,CAAA,GAAA,UAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,UAAA,CAAA,GAAA,EAAA,CAAA,GAAA,UAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,iBAAA,CAAA,GAAA,EAAA,CAAA,GAAA,iBAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,aAAA,CAAA,GAAA,EAAA,CAAA,GAAA,aAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,oBAAA,CAAA,GAAA,EAAA,CAAA,GAAA,oBAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,gBAAA,CAAA,GAAA,EAAA,CAAA,GAAA,gBAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,YAAA,CAAA,GAAA,EAAA,CAAA,GAAA,YAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,gBAAA,CAAA,GAAA,EAAA,CAAA,GAAA,gBAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,aAAA,CAAA,GAAA,EAAA,CAAA,GAAA,aAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,QAAA,CAAA,GAAA,EAAA,CAAA,GAAA,QAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,cAAA,CAAA,GAAA,EAAA,CAAA,GAAA,cAAA;AACA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,KAAA,CAAA,GAAA,EAAA,CAAA,GAAA,KAAA;AA7BgB,EAAA,OAAAA,UAAAA;AAAA,CAAA,EAAA,SAAA,IAAA,EAAA;AAsCX,SAAS,SAAA,CAAU,IAAA,EAAiBL,MAAAA,EAAe,QAAA,EAAyB;AACjF,EAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAAA,MAAAA,EAAO,QAAA,EAAS;AACjC;;;AC5BO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EAC1C,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AACF;AAEA,IAAM,YAAA,uBAAmB,GAAA,CAAI;AAAA,EAC3B,QAAA;AAAA,EAAU,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,QAAA;AAAA,EAAU;AAChF,CAAC,CAAA;AA1BD,IAAA,QAAA,EAAA,IAAA,EAAA,uBAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,iBAAA;AA4BO,IAAM,eAAN,MAAmB;AAAA,EAIxB,YAAY,OAAA,EAAiB;AAJxB,IAAA,YAAA,CAAA,IAAA,EAAA,uBAAA,CAAA;AACL,IAAA,YAAA,CAAA,IAAA,EAAS,QAAA,CAAA;AACT,IAAA,YAAA,CAAA,IAAA,EAAA,IAAA,EAAO,CAAA,CAAA;AAGL,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,iBAAiB,0BAA0B,CAAA;AACnE,IAAA,YAAA,CAAA,IAAA,EAAK,QAAA,EAAW,OAAA,CAAA;AAAA,EAClB;AAAA,EAEA,QAAA,GAAoB;AAClB,IAAA,YAAA,CAAA,IAAA,EAAK,IAAA,EAAO,CAAA,CAAA;AACZ,IAAA,MAAM,SAAkB,EAAC;AAEzB,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,GAAO,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,MAAA,EAAQ;AACvC,MAAA,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,iBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,MAAA,IAAI,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,IAAQ,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,MAAA,EAAQ;AAEvC,MAAA,MAAM,KAAA,GAAQ,sBAAK,uBAAA,EAAA,gBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACd,MAAA,IAAI,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAAA,IAC9B;AAEA,IAAA,MAAA,CAAO,IAAA,CAAK,SAAA,CAAA,EAAA,YAAyB,EAAA,EAAI,YAAA,CAAA,IAAA,EAAK,KAAI,CAAC,CAAA;AACnD,IAAA,OAAO,MAAA;AAAA,EACT;AAkMF;AAxNW,QAAA,GAAA,IAAA,OAAA,EAAA;AACT,IAAA,GAAA,IAAA,OAAA,EAAA;AAFK,uBAAA,GAAA,IAAA,OAAA,EAAA;AAAA;AA2BL,gBAAA,GAAc,WAAiB;AAC7B,EAAA,MAAM,CAAA,GAAI,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,YAAA,CAAA,IAAA,EAAK,IAAA,CAAI,CAAA;AAEjC,EAAA,IAAI,CAAA,KAAM,GAAA,EAAM,OAAO,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,aAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACvB,EAAA,IAAI,CAAA,KAAM,GAAA,EAAM,OAAO,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,mBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACvB,EAAA,IAAI,CAAA,KAAM,GAAA,EAAM,OAAO,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,qBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AAEvB,EAAA,IAAI,MAAM,GAAA,IAAO,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,GAAO,CAAA,GAAI,mBAAK,QAAA,CAAA,CAAS,MAAA,IAAU,IAAA,CAAK,IAAA,CAAK,mBAAK,QAAA,CAAA,CAAS,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,GAAO,CAAC,CAAE,CAAA,EAAG;AACjG,IAAA,OAAO,sBAAK,uBAAA,EAAA,aAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAK,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,sBAAK,uBAAA,EAAA,aAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACzB,EAAA,IAAI,aAAa,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,sBAAK,uBAAA,EAAA,iBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AAEjC,EAAA,OAAO,sBAAK,uBAAA,EAAA,eAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACT,CAAA;AAEA,aAAA,GAAW,WAAU;AACnB,EAAA,MAAM,KAAA,GAAQ,uBAAK,IAAA,CAAA,CAAL,CAAA,EAAA;AACd,EAAA,IAAIA,MAAAA,GAAQ,EAAA;AAEZ,EAAA,OAAO,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,GAAO,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,MAAA,EAAQ;AACvC,IAAA,MAAM,EAAA,GAAK,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,YAAA,CAAA,IAAA,EAAK,IAAA,CAAI,CAAA;AAClC,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,gBAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAL,CAAA,EAAA;AACA,MAAA,IAAI,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,YAAA,CAAA,IAAA,EAAK,IAAA,CAAI,MAAM,GAAA,EAAK;AAAE,QAAAA,MAAAA,IAAS,GAAA;AAAK,QAAA,gBAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAL,CAAA,EAAA;AAAA,MAAa,CAAA,MAC9D,OAAO,SAAA,CAAA,CAAA,eAA4BA,MAAAA,EAAO,KAAK,CAAA;AAAA,IACtD,CAAA,MAAO;AACL,MAAAA,MAAAA,IAAS,EAAA;AACT,MAAA,gBAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAL,CAAA,EAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,gCAAA,EAAmC,KAAK,CAAA,CAAA,CAAG,CAAA;AACxE,CAAA;AAEA,mBAAA,GAAiB,WAAU;AACzB,EAAA,MAAM,QAAQ,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA;AACnB,EAAA,IAAI,GAAA,GAAM,GAAA;AACV,EAAA,gBAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAL,CAAA,EAAA;AAEA,EAAA,OAAO,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,GAAO,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,MAAA,EAAQ;AACvC,IAAA,MAAM,EAAA,GAAK,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,YAAA,CAAA,IAAA,EAAK,IAAA,CAAI,CAAA;AAClC,IAAA,IAAI,eAAe,IAAA,CAAK,EAAE,KAAK,EAAA,KAAO,GAAA,IAAO,OAAO,GAAA,EAAK;AACvD,MAAA,GAAA,IAAO,EAAA;AACP,MAAA,gBAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAL,CAAA,EAAA;AACA,MAAA,IAAI,EAAA,KAAO,GAAA,IAAO,EAAA,KAAO,GAAA,EAAK;AAAA,IAChC,CAAA,MAAO;AAAA,EACT;AAEA,EAAA,MAAMM,MAAAA,GAAQ,IAAI,WAAA,EAAY;AAC9B,EAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAIA,MAAK,CAAA,EAAG;AAC5B,IAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,uBAAA,EAA0B,GAAG,CAAA,cAAA,EAAiB,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,EACnF;AACA,EAAA,OAAO,SAAA,CAAA,EAAA,qBAAkCA,QAAO,KAAK,CAAA;AACvD,CAAA;AAEA,qBAAA,GAAmB,WAAU;AAC3B,EAAA,MAAM,KAAA,GAAQ,uBAAK,IAAA,CAAA,CAAL,CAAA,EAAA;AACd,EAAA,IAAI,SAAA,GAAY,EAAA;AAEhB,EAAA,OAAO,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,GAAO,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,MAAA,EAAQ;AACvC,IAAA,MAAM,EAAA,GAAK,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,YAAA,CAAA,IAAA,EAAK,IAAA,CAAI,CAAA;AAClC,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,gBAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAL,CAAA,EAAA;AACA,MAAA,IAAI,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,YAAA,CAAA,IAAA,EAAK,IAAA,CAAI,MAAM,GAAA,EAAK;AAAE,QAAA,SAAA,IAAa,GAAA;AAAK,QAAA,gBAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAL,CAAA,EAAA;AAAA,MAAa,CAAA,MAClE;AACH,QAAA,IAAI,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,YAAA,CAAA,IAAA,EAAK,IAAA,CAAI,MAAM,GAAA,EAAK;AACpC,UAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,iDAAA,EAAoD,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,QACzF;AACA,QAAA,gBAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAL,CAAA,EAAA;AACA,QAAA,MAAM,OAAA,GAAU,sBAAK,uBAAA,EAAA,mBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AAChB,QAAA,OAAO,mCAAoC,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,OAAO,IAAI,KAAK,CAAA;AAAA,MAC7E;AAAA,IACF,CAAA,MAAO;AACL,MAAA,SAAA,IAAa,EAAA;AACb,MAAA,gBAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAL,CAAA,EAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,2CAAA,EAA8C,KAAK,CAAA,CAAA,CAAG,CAAA;AACnF,CAAA;AAEA,aAAA,GAAW,WAAU;AACnB,EAAA,MAAM,QAAQ,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA;AACnB,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,IAAI,IAAA,GAAS,KAAA;AAEb,EAAA,OAAO,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,GAAO,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,MAAA,EAAQ;AACvC,IAAA,MAAM,EAAA,GAAK,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,YAAA,CAAA,IAAA,EAAK,IAAA,CAAI,CAAA;AAClC,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA,EAAG;AAAE,MAAA,GAAA,IAAO,EAAA;AAAI,MAAA,gBAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAL,CAAA,EAAA;AAAA,IAAa,WACpC,EAAA,KAAO,GAAA,IAAO,CAAC,MAAA,IAAU,CAAC,IAAA,EAAM;AAAE,MAAA,MAAA,GAAS,IAAA;AAAM,MAAA,GAAA,IAAO,EAAA;AAAI,MAAA,gBAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAL,CAAA,EAAA;AAAA,IAAa,CAAA,MAAA,IAAA,CACxE,OAAO,GAAA,IAAO,EAAA,KAAO,QAAQ,CAAC,IAAA,IAAQ,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG;AAC9D,MAAA,IAAA,GAAO,IAAA;AAAM,MAAA,GAAA,IAAO,EAAA;AAAI,MAAA,gBAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAL,CAAA,EAAA;AACxB,MAAA,IAAI,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,YAAA,CAAA,IAAA,EAAK,IAAA,CAAI,CAAA,KAAM,GAAA,IAAO,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,YAAA,CAAA,IAAA,EAAK,IAAA,CAAI,CAAA,KAAM,GAAA,EAAK;AACxE,QAAA,GAAA,IAAO,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,gBAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAL,CAAA,EAAW,CAAA;AAAA,MAClC;AAAA,IACF,CAAA,MAAO;AAAA,EACT;AAEA,EAAA,OAAO,SAAA,CAAA,CAAA,eAA4B,KAAK,KAAK,CAAA;AAC/C,CAAA;AAEA,iBAAA,GAAe,WAAU;AACvB,EAAA,MAAM,QAAQ,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA;AACnB,EAAA,IAAI,GAAA,GAAM,EAAA;AAEV,EAAA,OAAO,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,GAAO,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,MAAA,EAAQ;AACvC,IAAA,MAAM,EAAA,GAAK,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,YAAA,CAAA,IAAA,EAAK,IAAA,CAAI,CAAA;AAClC,IAAA,IAAI,gBAAA,CAAiB,IAAA,CAAK,EAAE,CAAA,EAAG;AAAE,MAAA,GAAA,IAAO,EAAA;AAAI,MAAA,gBAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAL,CAAA,EAAA;AAAA,IAAa,CAAA,MACpD;AAAA,EACP;AAGA,EAAA,IAAIA,MAAAA,GAAQ,IAAI,WAAA,EAAY;AAC5B,EAAA,IAAIA,MAAAA,CAAM,UAAA,CAAW,QAAQ,CAAA,EAAG;AAAE,IAAA,GAAA,GAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AAAG,IAAAA,MAAAA,GAAQA,MAAAA,CAAM,KAAA,CAAM,CAAC,CAAA;AAAA,EAAG;AAE9E,EAAA,IAAIA,MAAAA,KAAU,MAAA,EAAS,OAAO,SAAA,CAAA,CAAA,gBAA6B,QAAS,KAAK,CAAA;AACzE,EAAA,IAAIA,MAAAA,KAAU,OAAA,EAAS,OAAO,SAAA,CAAA,CAAA,gBAA6B,SAAS,KAAK,CAAA;AAGzE,EAAA,IAAI,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,YAAA,CAAA,IAAA,EAAK,IAAA,CAAI,MAAM,GAAA,EAAK;AACpC,IAAA,gBAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAL,CAAA,EAAA;AACA,IAAA,MAAM,OAAA,GAAU,sBAAK,uBAAA,EAAA,mBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AAChB,IAAA,OAAO,mCAAoC,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,OAAO,IAAI,KAAK,CAAA;AAAA,EACvE;AAGA,EAAA,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,iBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,EAAA,IAAI,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,YAAA,CAAA,IAAA,EAAK,IAAA,CAAI,MAAM,GAAA,EAAK;AACpC,IAAA,OAAO,SAAA,CAAA,CAAA,iBAA8BA,QAAO,KAAK,CAAA;AAAA,EACnD;AAGA,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACtC,EAAA,IAAI,SAAA,CAAU,QAAQ,CAAA,EAAG;AAEvB,IAAA,IAAI,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,YAAA,CAAA,IAAA,EAAK,IAAA,CAAI,MAAM,GAAA,EAAK;AACpC,MAAA,gBAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAL,CAAA,EAAA;AACA,MAAA,OAAO,SAAA,CAAA,EAAA,uBAAoC,UAAU,KAAK,CAAA;AAAA,IAC5D;AACA,IAAA,OAAO,SAAA,CAAA,CAAA,sBAAmC,UAAU,KAAK,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,SAAA,CAAA,EAAA,mBAAgC,KAAK,KAAK,CAAA;AACnD,CAAA;AAEA,mBAAA,GAAiB,WAAW;AAC1B,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,OAAO,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,GAAO,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,MAAA,EAAQ;AACvC,IAAA,MAAM,EAAA,GAAK,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,YAAA,CAAA,IAAA,EAAK,IAAA,CAAI,CAAA;AAClC,IAAA,IAAI,cAAA,CAAe,IAAA,CAAK,EAAE,CAAA,EAAG;AAAE,MAAA,GAAA,IAAO,EAAA;AAAI,MAAA,gBAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAL,CAAA,EAAA;AAAA,IAAa,CAAA,MAClD;AAAA,EACP;AACA,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAC9B,CAAA;AAEA,eAAA,GAAa,WAAU;AACrB,EAAA,MAAM,QAAQ,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA;AACnB,EAAA,MAAM,EAAA,GAAK,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,gBAAA,CAAA,IAAA,EAAK,MAAL,CAAA,EAAW,CAAA;AAEpC,EAAA,QAAQ,EAAA;AAAI,IACV,KAAK,GAAA;AAAK,MAAA,OAAO,SAAA,CAAA,CAAA,kBAAgC,KAAK,KAAK,CAAA;AAAA,IAC3D,KAAK,GAAA;AAAK,MAAA,OAAO,SAAA,CAAA,CAAA,mBAAgC,KAAK,KAAK,CAAA;AAAA,IAC3D,KAAK,GAAA;AAAK,MAAA,OAAO,SAAA,CAAA,CAAA,cAAgC,KAAK,KAAK,CAAA;AAAA,IAC3D,KAAK,GAAA;AAAK,MAAA,OAAO,SAAA,CAAA,CAAA,cAAgC,KAAK,KAAK,CAAA;AAAA,IAC3D,KAAK,GAAA;AAAK,MAAA,OAAO,SAAA,CAAA,CAAA,aAAgC,KAAK,KAAK,CAAA;AAAA,IAC3D,KAAK,GAAA;AAAK,MAAA,OAAO,SAAA,CAAA,EAAA,cAAgC,KAAK,KAAK,CAAA;AAAA,IAC3D,KAAK,GAAA;AAAK,MAAA,OAAO,SAAA,CAAA,EAAA,iBAAgC,KAAK,KAAK,CAAA;AAAA,IAC3D,KAAK,GAAA;AAAK,MAAA,OAAO,SAAA,CAAA,EAAA,eAAgC,KAAK,KAAK,CAAA;AAAA,IAC3D,KAAK,GAAA;AAAK,MAAA,OAAO,SAAA,CAAA,EAAA,cAAgC,KAAK,KAAK,CAAA;AAAA,IAC3D,KAAK,GAAA;AAAK,MAAA,OAAO,SAAA,CAAA,EAAA,gBAAgC,KAAK,KAAK,CAAA;AAAA,IAC3D,KAAK,GAAA;AAAK,MAAA,OAAO,SAAA,CAAA,EAAA,kBAAgC,KAAK,KAAK,CAAA;AAAA,IAC3D,KAAK,GAAA;AAAK,MAAA,OAAO,SAAA,CAAA,EAAA,cAAgC,KAAK,KAAK,CAAA;AAAA,IAC3D,KAAK,GAAA;AAAK,MAAA,OAAO,SAAA,CAAA,EAAA,eAAgC,KAAK,KAAK,CAAA;AAAA,IAC3D,KAAK,GAAA;AAAK,MAAA,OAAO,SAAA,CAAA,EAAA,oBAAgC,KAAK,KAAK,CAAA;AAAA,IAC3D,KAAK,GAAA;AACH,MAAA,IAAI,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,YAAA,CAAA,IAAA,EAAK,IAAA,CAAI,MAAM,GAAA,EAAK;AAAE,QAAA,gBAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAL,CAAA,EAAA;AAAa,QAAA,OAAO,SAAA,CAAA,EAAA,iBAAsC,MAAM,KAAK,CAAA;AAAA,MAAG;AAChH,MAAA,IAAI,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,YAAA,CAAA,IAAA,EAAK,IAAA,CAAI,MAAM,GAAA,EAAK;AAAE,QAAA,gBAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAL,CAAA,EAAA;AAAa,QAAA,OAAO,SAAA,CAAA,EAAA,wBAAsC,MAAM,KAAK,CAAA;AAAA,MAAG;AAChH,MAAA,OAAO,SAAA,CAAA,EAAA,iBAA8B,KAAK,KAAK,CAAA;AAAA,IACjD,KAAK,GAAA;AACH,MAAA,IAAI,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,YAAA,CAAA,IAAA,EAAK,IAAA,CAAI,MAAM,GAAA,EAAK;AAAE,QAAA,gBAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAL,CAAA,EAAA;AAAa,QAAA,OAAO,SAAA,CAAA,EAAA,2BAAwC,MAAM,KAAK,CAAA;AAAA,MAAG;AAClH,MAAA,OAAO,SAAA,CAAA,EAAA,oBAAiC,KAAK,KAAK,CAAA;AAAA,IACpD;AACE,MAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,sBAAA,EAAyB,EAAE,CAAA,cAAA,EAAiB,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA;AAErF,CAAA;AAEA,iBAAA,GAAe,WAAS;AACtB,EAAA,OAAO,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,GAAO,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,MAAA,IAAU,IAAA,CAAK,IAAA,CAAK,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,YAAA,CAAA,IAAA,EAAK,IAAA,CAAI,CAAE,CAAA,EAAG;AAC/E,IAAA,gBAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAL,CAAA,EAAA;AAAA,EACF;AACF,CAAA;AAGF,SAAS,UAAU,CAAA,EAAoB;AACrC,EAAA,IAAI,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACzB,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,EAAE,MAAA,IAAU,UAAA,CAAW,KAAK,CAAA,CAAE,CAAC,CAAE,CAAA,EAAG,CAAA,EAAA;AAC/C,EAAA,IAAI,CAAA,KAAM,CAAA,IAAK,CAAA,IAAK,CAAA,CAAE,QAAQ,OAAO,KAAA;AACrC,EAAA,OAAO,CAAA,GAAI,EAAE,MAAA,IAAU,IAAA,CAAK,KAAK,CAAA,CAAE,CAAC,CAAE,CAAA,EAAG,CAAA,EAAA;AACzC,EAAA,OAAO,MAAM,CAAA,CAAE,MAAA;AACjB;;;ACrPO,IAAe,cAAf,MAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAShC,aAAa,GAAA,EAA8C;AACzD,IAAA,OAAO,IAAA,CAAK,SAAS,GAAG,CAAA;AAAA,EAC1B;AACF;AAIO,IAAM,UAAA,GAAN,cAAyB,WAAA,CAAY;AAAA,EAC1C,YAAqBN,MAAAA,EAAe;AAAE,IAAA,KAAA,EAAM;AAAvB,IAAA,IAAA,CAAA,KAAA,GAAAA,MAAAA;AAAA,EAA0B;AAAA,EAC/C,QAAA,GAAyB;AAAE,IAAA,OAAO,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAAA,EAAG;AACrE;AAEO,IAAM,UAAA,GAAN,cAAyB,WAAA,CAAY;AAAA,EAC1C,YAAqBA,MAAAA,EAAe;AAAE,IAAA,KAAA,EAAM;AAAvB,IAAA,IAAA,CAAA,KAAA,GAAAA,MAAAA;AAAA,EAA0B;AAAA,EAC/C,QAAA,GAAyB;AAAE,IAAA,OAAO,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,EAAG;AACnE;AAEO,IAAM,WAAA,GAAN,cAA0B,WAAA,CAAY;AAAA,EAC3C,YAAqBA,MAAAA,EAAgB;AAAE,IAAA,KAAA,EAAM;AAAxB,IAAA,IAAA,CAAA,KAAA,GAAAA,MAAAA;AAAA,EAA2B;AAAA,EAChD,QAAA,GAAyB;AAAE,IAAA,OAAO,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAAA,EAAG;AACtE;AAEO,IAAM,SAAA,GAAN,cAAwB,WAAA,CAAY;AAAA,EACzC,YAAqB,UAAA,EAA0B;AAAE,IAAA,KAAA,EAAM;AAAlC,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAAA,EAAqC;AAAA,EAC1D,QAAA,GAAyB;AAAE,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EAAY;AACrD;AAGO,IAAM,SAAA,GAAN,cAAwB,WAAA,CAAY;AAAA,EACzC,QAAA,GAAyB;AAAE,IAAA,OAAO,YAAA,CAAa,KAAA;AAAA,EAAO;AACxD;AAIO,IAAM,iBAAA,GAAN,cAAgC,WAAA,CAAY;AAAA,EACjD,YAAqB,SAAA,EAAmB;AAAE,IAAA,KAAA,EAAM;AAA3B,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAA8B;AAAA,EACnD,SAAS,GAAA,EAAmC;AAC1C,IAAA,OAAO,GAAA,CAAI,YAAA,CAAa,IAAA,CAAK,SAAS,CAAA;AAAA,EACxC;AACF;AAEO,IAAM,kBAAA,GAAN,cAAiC,WAAA,CAAY;AAAA,EAClD,WAAA,CAAqB,UAA2B,MAAA,EAAgB;AAAE,IAAA,KAAA,EAAM;AAAnD,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAA2B,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAA2B;AAAA,EAC3E,SAAS,GAAA,EAAmC;AAC1C,IAAA,OAAO,GAAA,CAAI,cAAA,CAAe,IAAA,CAAK,QAAA,EAAU,KAAK,MAAM,CAAA;AAAA,EACtD;AACF;AAEO,IAAM,sBAAA,GAAN,cAAqC,WAAA,CAAY;AAAA,EACtD,WAAA,CAAqB,WAA4B,aAAA,EAAuB;AAAE,IAAA,KAAA,EAAM;AAA3D,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAA4B,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AAAA,EAAkC;AAAA,EACnF,SAAS,GAAA,EAAmC;AAC1C,IAAA,OAAO,GAAA,CAAI,iBAAA,CAAkB,IAAA,CAAK,SAAA,EAAW,KAAK,aAAa,CAAA;AAAA,EACjE;AACF;AAEO,IAAM,uBAAA,GAAN,cAAsC,WAAA,CAAY;AAAA,EACvD,WAAA,CACW,SAAA,EACA,QAAA,EACA,MAAA,EACT;AAAE,IAAA,KAAA,EAAM;AAHC,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EACE;AAAA,EACb,SAAS,GAAA,EAAmC;AAC1C,IAAA,OAAO,IAAI,mBAAA,CAAoB,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA,EAAU,KAAK,MAAM,CAAA;AAAA,EAC3E;AACF;AAYO,IAAM,sBAAA,GAAN,cAAqC,WAAA,CAAY;AAAA,EACtD,WAAA,CACW,QAAA,EACA,MAAA,EACA,QAAA,EACA,QACA,SAAA,EACT;AAAE,IAAA,KAAA,EAAM;AALC,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EACE;AAAA,EAEb,SAAS,GAAA,EAAmC;AAC1C,IAAA,OAAO,IAAA,CAAK,SAAA,KAAc,MAAA,GACtB,GAAA,CAAI,kBAAA,CAAmB,KAAK,QAAA,EAAU,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA,GAC7E,GAAA,CAAI,uBAAA,CAAwB,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAAA,EACxG;AACF;AAEO,IAAM,cAAA,GAAN,cAA6B,WAAA,CAAY;AAAA,EAC9C,YAAqB,IAAA,EAAc;AAAE,IAAA,KAAA,EAAM;AAAtB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAyB;AAAA,EAC9C,SAAS,GAAA,EAAmC;AAC1C,IAAA,OAAO,GAAA,CAAI,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AAAA,EACxC;AACF;AAGO,IAAM,kBAAA,GAAN,cAAiC,WAAA,CAAY;AAAA,EAClD,YAAqB,SAAA,EAAmB;AAAE,IAAA,KAAA,EAAM;AAA3B,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAA8B;AAAA,EACnD,SAAS,GAAA,EAAmC;AAC1C,IAAA,OAAO,GAAA,CAAI,iBAAA,CAAkB,IAAA,CAAK,SAAS,CAAA;AAAA,EAC7C;AACF;AAIO,IAAW,cAAA,qBAAAO,eAAAA,KAAX;AACL,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA,KAAA;AAAK,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,UAAA,CAAA,GAAA,CAAA,CAAA,GAAA,UAAA;AAAU,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,UAAA,CAAA,GAAA,CAAA,CAAA,GAAA,UAAA;AAAU,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAA;AAAQ,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;AACjC,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,aAAA,CAAA,GAAA,CAAA,CAAA,GAAA,aAAA;AACA,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;AAAO,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,UAAA,CAAA,GAAA,CAAA,CAAA,GAAA,UAAA;AAAU,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,UAAA,CAAA,GAAA,CAAA,CAAA,GAAA,UAAA;AAAU,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,iBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,iBAAA;AAAiB,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,aAAA,CAAA,GAAA,EAAA,CAAA,GAAA,aAAA;AAAa,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,oBAAA,CAAA,GAAA,EAAA,CAAA,GAAA,oBAAA;AAHzC,EAAA,OAAAA,eAAAA;AAAA,CAAA,EAAA,cAAA,IAAA,EAAA;AAMX,IAAW,aAAA,qBAAAC,cAAAA,KAAX;AACL,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAA;AAAQ,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAA;AAAM,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAA;AADE,EAAA,OAAAA,cAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;AArIlB,IAAA,uBAAA,EAAA,aAAA;AAyIO,IAAM,YAAA,GAAN,cAA2B,WAAA,CAAY;AAAA,EAC5C,WAAA,CACWC,KAAAA,EACA,EAAA,EACAC,MAAAA,EACT;AAAE,IAAA,KAAA,EAAM;AAHC,IAAA,IAAA,CAAA,IAAA,GAAAD,KAAAA;AACA,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAAC,MAAAA;AAJN,IAAA,YAAA,CAAA,IAAA,EAAA,uBAAA,CAAA;AAAA,EAKQ;AAAA,EAEb,SAAS,GAAA,EAAmC;AAC1C,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA;AAChC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA;AAGjC,IAAA,IAAI,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,EAAS;AAC1B,MAAA,MAAM,KAAK,CAAA,CAAE,OAAA,GAAU,EAAE,QAAA,GAAW,UAAA,CAAW,WAAW,CAAC,CAAA;AAC3D,MAAA,MAAM,KAAK,CAAA,CAAE,OAAA,GAAU,EAAE,QAAA,GAAW,UAAA,CAAW,WAAW,CAAC,CAAA;AAC3D,MAAA,OAAO,YAAA,CAAa,KAAA;AAAA,QAClB,UAAA,CAAW,SAAA,CAAU,EAAA,EAAI,EAAA,EAAI,CAAC,CAAA,EAAG,CAAA,KAAM,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,aAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAiB,CAAA,EAAG,CAAA,CAAE;AAAA,OAC/D;AAAA,IACF;AAEA,IAAA,OAAO,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,aAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAiB,CAAA,EAAG,CAAA,CAAA;AAAA,EAC7B;AA0CF;AA/DO,uBAAA,GAAA,IAAA,OAAA,EAAA;AAuBL,aAAA,GAAW,SAAC,GAAiB,CAAA,EAA+B;AAC1D,EAAA,MAAM,KAAK,IAAA,CAAK,EAAA;AAGhB,EAAA,IAAI,EAAA,KAAO,eAAmC,OAAO,YAAA,CAAa,QAAQ,YAAA,CAAa,QAAA,CAAS,CAAA,EAAG,CAAC,CAAC,CAAA;AACrG,EAAA,IAAI,EAAA,KAAO,CAAA,iBAAmC,OAAO,YAAA,CAAa,OAAA,CAAQ,CAAC,YAAA,CAAa,QAAA,CAAS,CAAA,EAAG,CAAC,CAAC,CAAA;AACtG,EAAA,IAAI,EAAA,KAAO,CAAA,iBAAmC,OAAO,YAAA,CAAa,OAAA,CAAQ,aAAa,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAA,GAAI,CAAC,CAAA;AACxG,EAAA,IAAI,EAAA,KAAO,CAAA,wBAAmC,OAAO,YAAA,CAAa,OAAA,CAAQ,aAAa,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAA,IAAK,CAAC,CAAA;AACzG,EAAA,IAAI,EAAA,KAAO,EAAA,oBAAmC,OAAO,YAAA,CAAa,OAAA,CAAQ,aAAa,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAA,GAAI,CAAC,CAAA;AACxG,EAAA,IAAI,EAAA,KAAO,EAAA,2BAAmC,OAAO,YAAA,CAAa,OAAA,CAAQ,aAAa,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAA,IAAK,CAAC,CAAA;AAGzG,EAAA,IAAI,OAAO,CAAA,oBAA4B;AACrC,IAAA,IAAI,CAAA,CAAE,SAAS,OAAO,CAAA;AACtB,IAAA,IAAI,CAAA,CAAE,SAAS,OAAO,CAAA;AACtB,IAAA,OAAO,aAAa,IAAA,CAAK,CAAA,CAAE,QAAO,GAAI,CAAA,CAAE,QAAQ,CAAA;AAAA,EAClD;AAGA,EAAA,MAAMC,GAAAA,GAAK,EAAE,cAAA,EAAe;AAC5B,EAAA,IAAIA,GAAAA,CAAG,SAAS,OAAOA,GAAAA;AACvB,EAAA,MAAM,EAAA,GAAK,EAAE,cAAA,EAAe;AAC5B,EAAA,IAAI,EAAA,CAAG,SAAS,OAAO,EAAA;AAEvB,EAAA,MAAM,KAAKA,GAAAA,CAAG,WAAA;AACd,EAAA,MAAM,KAAK,EAAA,CAAG,WAAA;AAEd,EAAA,QAAQ,EAAA;AAAI,IACV,KAAK,CAAA;AAAyB,MAAA,OAAO,YAAA,CAAa,MAAA,CAAO,EAAA,GAAK,EAAE,CAAA;AAAA,IAChE,KAAK,CAAA;AAAyB,MAAA,OAAO,YAAA,CAAa,MAAA,CAAO,EAAA,GAAK,EAAE,CAAA;AAAA,IAChE,KAAK,CAAA;AAAyB,MAAA,OAAO,YAAA,CAAa,MAAA,CAAO,EAAA,GAAK,EAAE,CAAA;AAAA,IAChE,KAAK,CAAA;AACH,MAAA,IAAI,EAAA,KAAO,CAAA,EAAG,OAAO,YAAA,CAAa,SAAA;AAClC,MAAA,OAAO,YAAA,CAAa,MAAA,CAAO,EAAA,GAAK,EAAE,CAAA;AAAA,IACpC,KAAK,CAAA;AACH,MAAA,OAAO,aAAa,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAC,CAAA;AAAA,IAC7C;AACE,MAAA,OAAO,YAAA,CAAa,UAAA;AAAA;AAE1B,CAAA;AAGK,IAAM,WAAA,GAAN,cAA0B,WAAA,CAAY;AAAA,EAC3C,WAAA,CAAqB,IAA4B,OAAA,EAAsB;AAAE,IAAA,KAAA,EAAM;AAA1D,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAA4B,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAAiC;AAAA,EAElF,SAAS,GAAA,EAAmC;AAC1C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA;AAErC,IAAA,IAAI,IAAA,CAAK,OAAO,CAAA,aAAoB;AAClC,MAAA,OAAO,IAAI,cAAA,EAAe;AAAA,IAC5B;AACA,IAAA,IAAI,IAAA,CAAK,OAAO,CAAA,eAAsB;AACpC,MAAA,MAAM,CAAA,GAAI,IAAI,cAAA,EAAe;AAC7B,MAAA,IAAI,CAAA,CAAE,SAAS,OAAO,CAAA;AACtB,MAAA,OAAO,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,CAAE,WAAW,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,IAAA,CAAK,OAAO,CAAA,gBAAuB;AACrC,MAAA,MAAM,CAAA,GAAI,IAAI,cAAA,EAAe;AAC7B,MAAA,IAAI,CAAA,CAAE,SAAS,OAAO,CAAA;AACtB,MAAA,OAAO,YAAA,CAAa,MAAA,CAAO,CAAA,CAAE,WAAA,GAAc,GAAG,CAAA;AAAA,IAChD;AACA,IAAA,OAAO,YAAA,CAAa,UAAA;AAAA,EACtB;AACF;AAGO,IAAM,wBAAA,GAAN,cAAuC,WAAA,CAAY;AAAA,EACxD,YAAqB,KAAA,EAAoB;AAAE,IAAA,KAAA,EAAM;AAA5B,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EAA+B;AAAA,EAEpD,SAAS,GAAA,EAAmC;AAC1C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA;AACnC,IAAA,IAAI,CAAC,GAAA,CAAI,OAAA,EAAS,OAAO,GAAA;AACzB,IAAA,OAAO,GAAA,CAAI,SAAS,iBAAA,CAAkB,GAAA,CAAI,YAAY,GAAA,CAAI,UAAA,EAAY,GAAG,CAAC,CAAA;AAAA,EAC5E;AACF;AAIO,IAAM,gBAAA,GAAN,cAA+B,WAAA,CAAY;AAAA,EAChD,WAAA,CACW,cACA,IAAA,EACT;AAAE,IAAA,KAAA,EAAM;AAFC,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EACE;AAAA,EAEb,SAAS,GAAA,EAAmC;AAC1C,IAAA,OAAO,GAAA,CAAI,gBAAA,CAAiB,IAAA,CAAK,YAAA,EAAc,KAAK,IAAI,CAAA;AAAA,EAC1D;AAAA,EAES,aAAa,GAAA,EAA8C;AAClE,IAAA,MAAM,OAAO,IAAA,CAAK,YAAA;AAClB,IAAA,MAAM,IAAI,IAAA,CAAK,IAAA;AAIf,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,IAAA,EAAM;AACT,QAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,GAAG,CAAA;AAC/B,QAAA,IAAI,IAAA,CAAK,SAAS,OAAO,IAAA;AACzB,QAAA,MAAM,CAAA,GAAI,KAAK,YAAA,EAAa;AAC5B,QAAA,IAAI,CAAA,CAAE,SAAS,OAAO,CAAA;AACtB,QAAA,IAAI,EAAE,YAAA,EAAc,OAAO,EAAE,CAAC,CAAA,CAAG,aAAa,GAAG,CAAA;AACjD,QAAA,OAAO,CAAA,CAAE,SAAS,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,YAAA,CAAa,GAAG,CAAA,GAAI,YAAA,CAAa,MAAA;AAAA,MAC/D;AAAA,MACA,KAAK,KAAA,EAAO;AACV,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAI,CAAA,CAAE,MAAA,EAAQ,KAAK,CAAA,EAAG;AACxC,UAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,GAAG,CAAA;AAC/B,UAAA,IAAI,IAAA,CAAK,SAAS,OAAO,IAAA;AACzB,UAAA,MAAM,CAAA,GAAI,KAAK,YAAA,EAAa;AAC5B,UAAA,IAAI,CAAA,CAAE,SAAS,OAAO,CAAA;AACtB,UAAA,IAAI,CAAA,CAAE,cAAc,OAAO,CAAA,CAAE,IAAI,CAAC,CAAA,CAAG,aAAa,GAAG,CAAA;AAAA,QACvD;AACA,QAAA,OAAO,YAAA,CAAa,OAAA;AAAA,MACtB;AAAA,MACA,KAAK,SAAA,EAAW;AACd,QAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,GAAG,CAAA;AAC5B,QAAA,OAAO,EAAE,OAAA,GAAU,CAAA,CAAE,CAAC,CAAA,CAAG,YAAA,CAAa,GAAG,CAAA,GAAI,CAAA;AAAA,MAC/C;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,GAAG,CAAA;AAC5B,QAAA,OAAO,CAAA,CAAE,WAAW,CAAA,CAAE,SAAA,KAAA,CAAA,YAAgC,EAAE,CAAC,CAAA,CAAG,YAAA,CAAa,GAAG,CAAA,GAAI,CAAA;AAAA,MAClF;AAAA,MACA,KAAK,KAAA,EAAO;AACV,QAAA,IAAI,EAAE,MAAA,GAAS,CAAA,IAAK,CAAA,CAAE,MAAA,GAAS,MAAM,CAAA,EAAG;AACxC,QAAA,MAAM,QAAA,uBAAe,GAAA,EAA0B;AAC/C,QAAA,GAAA,CAAI,UAAU,QAAQ,CAAA;AACtB,QAAA,IAAI;AACF,UAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,EAAE,MAAA,GAAS,CAAA,EAAG,KAAK,CAAA,EAAG;AACxC,YAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA;AACd,YAAA,IAAI,EAAE,EAAA,YAAc,cAAA,CAAA,EAAiB,OAAO,YAAA,CAAa,UAAA;AACzD,YAAA,MAAM,MAAM,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,CAAG,SAAS,GAAG,CAAA;AAClC,YAAA,IAAI,GAAA,CAAI,SAAS,OAAO,GAAA;AACxB,YAAA,QAAA,CAAS,GAAA,CAAI,EAAA,CAAG,IAAA,CAAK,WAAA,IAAe,GAAG,CAAA;AAAA,UACzC;AAEA,UAAA,OAAO,EAAE,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CAAG,aAAa,GAAG,CAAA;AAAA,QAC1C,CAAA,SAAE;AACA,UAAA,GAAA,CAAI,QAAA,EAAS;AAAA,QACf;AAAA,MACF;AAAA;AAIF,IAAA,IAAI,CAAC,GAAA,CAAI,WAAA,CAAY,IAAI,CAAA,EAAG;AAC1B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,iBAAA,CAAkB,IAAI,CAAA;AACxC,MAAA,IAAI,MAAM,QAAA,EAAU;AAClB,QAAA,OAAO,IAAI,QAAA,CAAS,KAAA,CAAM,SAAA,EAAW,CAAA,CAAE,GAAA,CAAI,CAAAC,IAAAA,KAAOA,IAAAA,CAAI,QAAA,CAAS,GAAG,CAAC,CAAC,CAAA;AAAA,MACtE;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,SAAS,GAAG,CAAA;AAAA,EAC1B;AACF;AAMO,IAAM,QAAA,GAAN,cAAuB,WAAA,CAAY;AAAA,EACxC,WAAA,CAAqB,QAA8B,IAAA,EAAqB;AAAE,IAAA,KAAA,EAAM;AAA3D,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAA8B,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAgC;AAAA,EAEnF,SAAS,GAAA,EAAmC;AAC1C,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA;AACnC,IAAA,IAAI,EAAA,CAAG,SAAS,OAAO,EAAA;AACvB,IAAA,IAAI,CAAC,EAAA,CAAG,QAAA,EAAU,OAAO,YAAA,CAAa,UAAA;AACtC,IAAA,OAAO,EAAA,CAAG,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAC,CAAC,CAAA;AAAA,EAC9D;AAAA,EAES,aAAa,GAAA,EAA8C;AAClE,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA;AACnC,IAAA,IAAI,EAAA,CAAG,SAAS,OAAO,EAAA;AACvB,IAAA,IAAI,CAAC,EAAA,CAAG,QAAA,EAAU,OAAO,YAAA,CAAa,UAAA;AACtC,IAAA,OAAO,IAAI,QAAA,CAAS,EAAA,CAAG,SAAA,EAAW,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAC,CAAC,CAAA;AAAA,EACvE;AACF;;;AC5UA,IAAA,OAAA,EAAAC,KAAAA,EAAA,wBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,cAAA,EAAA,aAAA,EAAA,aAAA,EAAA,eAAA,EAAA,eAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,eAAA;AA0BO,IAAM,gBAAN,MAAoB;AAAA,EAIzB,YAAY,MAAA,EAAiB;AAJxB,IAAA,YAAA,CAAA,IAAA,EAAA,wBAAA,CAAA;AACL,IAAA,YAAA,CAAA,IAAA,EAAS,OAAA,CAAA;AACT,IAAA,YAAA,CAAA,IAAA,EAAAA,KAAAA,EAAO,CAAA,CAAA;AAGL,IAAA,YAAA,CAAA,IAAA,EAAK,OAAA,EAAU,MAAA,CAAA;AAAA,EACjB;AAAA,EAEA,KAAA,GAAqB;AACnB,IAAA,YAAA,CAAA,IAAA,EAAKA,KAAAA,EAAO,CAAA,CAAA;AACZ,IAAA,MAAM,IAAA,GAAO,sBAAK,wBAAA,EAAA,kBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACb,IAAA,IAAI,YAAA,CAAA,IAAA,EAAK,uCAAS,IAAA,KAAA,EAAA,YAAwB;AACxC,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,qBAAqB,YAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,WAAA,CAAA,CAAS,KAAK,CAAA,cAAA,EAAiB,YAAA,CAAA,IAAA,EAAK,uCAAS,QAAQ,CAAA,CAAA;AAAA,OACjF;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AA6QF;AA7RW,OAAA,GAAA,IAAA,OAAA,EAAA;AACTA,KAAAA,GAAA,IAAA,OAAA,EAAA;AAFK,wBAAA,GAAA,IAAA,OAAA,EAAA;AAqBD,WAAA,GAAQ,WAAU;AACpB,EAAA,OAAO,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,CAAQ,YAAA,CAAA,IAAA,EAAKA,KAAAA,CAAI,CAAA,IAAK,EAAE,IAAA,EAAA,EAAA,YAAqB,KAAA,EAAO,EAAA,EAAI,QAAA,EAAU,EAAA,EAAG;AACnF,CAAA;AAEA,UAAA,GAAQ,WAAU;AAChB,EAAA,MAAM,IAAI,YAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,WAAA,CAAA;AACf,EAAA,gBAAA,CAAA,IAAA,EAAKA,KAAAA,CAAAA,CAAL,CAAA,EAAA;AACA,EAAA,OAAO,CAAA;AACT,CAAA;AAEA,SAAA,GAAO,SAAC,IAAA,EAAwB;AAC9B,EAAA,IAAI,YAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,WAAA,CAAA,CAAS,IAAA,KAAS,IAAA,EAAM;AAC/B,IAAA,MAAM,IAAI,gBAAA;AAAA,MACR,CAAA,oBAAA,EAAuB,IAAI,CAAA,SAAA,EAAY,YAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,WAAA,CAAA,CAAS,IAAI,CAAA,GAAA,EAAM,YAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,WAAA,CAAA,CAAS,KAAK,CAAA,eAAA,EAAkB,YAAA,CAAA,IAAA,EAAK,uCAAS,QAAQ,CAAA,CAAA;AAAA,KAC5H;AAAA,EACF;AACA,EAAA,OAAO,sBAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACT,CAAA;AAAA;AAIA,kBAAA,GAAgB,WAAgB;AAC9B,EAAA,IAAIJ,KAAAA,GAAO,sBAAK,wBAAA,EAAA,qBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACX,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,MAAM,EAAA,GAAK,YAAA,CAAa,YAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,WAAA,CAAA,CAAS,IAAI,CAAA;AAC1C,IAAA,IAAI,OAAO,IAAA,EAAM;AACjB,IAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,IAAAA,QAAO,IAAI,YAAA,CAAaA,OAAM,EAAA,EAAI,eAAA,CAAA,IAAA,EAAK,iDAAL,IAAA,CAAA,IAAA,CAA0B,CAAA;AAAA,EAC9D;AACA,EAAA,OAAOA,KAAAA;AACT,CAAA;AAEA,qBAAA,GAAmB,WAAgB;AACjC,EAAA,IAAIA,KAAAA,GAAO,sBAAK,wBAAA,EAAA,cAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACX,EAAA,OAAO,YAAA,CAAA,IAAA,EAAK,uCAAS,IAAA,KAAA,EAAA,kBAA8B;AACjD,IAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,IAAAA,QAAO,IAAI,YAAA,CAAaA,KAAAA,EAAAA,CAAAA,oBAAkC,eAAA,CAAA,IAAA,EAAK,0CAAL,IAAA,CAAA,IAAA,CAAmB,CAAA;AAAA,EAC/E;AACA,EAAA,OAAOA,KAAAA;AACT,CAAA;AAEA,cAAA,GAAY,WAAgB;AAC1B,EAAA,IAAIA,KAAAA,GAAO,sBAAK,wBAAA,EAAA,cAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACX,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,MAAM,CAAA,GAAI,mBAAK,wBAAA,EAAA,WAAA,CAAA,CAAS,IAAA;AACxB,IAAA,IAAI,sBAAwB,CAAA,KAAA,EAAA,cAAuB;AACnD,IAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,IAAA,MAAM,EAAA,GAAK,CAAA,KAAA,CAAA,cAAA,CAAA,aAAA,CAAA;AACX,IAAAA,QAAO,IAAI,YAAA,CAAaA,OAAM,EAAA,EAAI,eAAA,CAAA,IAAA,EAAK,0CAAL,IAAA,CAAA,IAAA,CAAmB,CAAA;AAAA,EACvD;AACA,EAAA,OAAOA,KAAAA;AACT,CAAA;AAEA,cAAA,GAAY,WAAgB;AAC1B,EAAA,IAAIA,KAAAA,GAAO,sBAAK,wBAAA,EAAA,aAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACX,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,MAAM,CAAA,GAAI,mBAAK,wBAAA,EAAA,WAAA,CAAA,CAAS,IAAA;AACxB,IAAA,IAAI,2BAA4B,CAAA,KAAA,EAAA,eAAwB;AACxD,IAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,IAAA,MAAM,EAAA,GAAK,CAAA,KAAA,EAAA,kBAAA,CAAA,kBAAA,CAAA;AACX,IAAAA,QAAO,IAAI,YAAA,CAAaA,OAAM,EAAA,EAAI,eAAA,CAAA,IAAA,EAAK,yCAAL,IAAA,CAAA,IAAA,CAAkB,CAAA;AAAA,EACtD;AACA,EAAA,OAAOA,KAAAA;AACT,CAAA;AAEA,aAAA,GAAW,WAAgB;AACzB,EAAA,IAAI,YAAA,CAAA,IAAA,EAAK,uCAAS,IAAA,KAAA,EAAA,cAA0B;AAC1C,IAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,IAAA,OAAO,IAAI,WAAA,CAAA,CAAA,eAAkC,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,aAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAkB,CAAA;AAAA,EACjE;AACA,EAAA,IAAI,YAAA,CAAA,IAAA,EAAK,uCAAS,IAAA,KAAA,CAAA,aAAyB;AACzC,IAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,IAAA,OAAO,IAAI,WAAA,CAAA,CAAA,aAAgC,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,aAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAkB,CAAA;AAAA,EAC/D;AACA,EAAA,IAAI,YAAA,CAAA,IAAA,EAAK,uCAAS,IAAA,KAAA,EAAA,eAA2B;AAC3C,IAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,IAAA,OAAO,IAAI,wBAAA,CAAyB,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,aAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAkB,CAAA;AAAA,EACxD;AACA,EAAA,OAAO,sBAAK,wBAAA,EAAA,aAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACT,CAAA;AAEA,aAAA,GAAW,WAAgB;AACzB,EAAA,MAAMA,KAAAA,GAAO,sBAAK,wBAAA,EAAA,eAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACb,EAAA,IAAI,YAAA,CAAA,IAAA,EAAK,uCAAS,IAAA,KAAA,EAAA,cAA0B;AAC1C,IAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AAEA,IAAA,OAAO,IAAI,YAAA,CAAaA,KAAAA,EAAAA,CAAAA,cAA4B,eAAA,CAAA,IAAA,EAAK,yCAAL,IAAA,CAAA,IAAA,CAAkB,CAAA;AAAA,EACxE;AACA,EAAA,OAAOA,KAAAA;AACT,CAAA;AAEA,eAAA,GAAa,WAAgB;AAC3B,EAAA,IAAI,IAAA,GAAO,sBAAK,wBAAA,EAAA,eAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACX,EAAA,OAAO,YAAA,CAAA,IAAA,EAAK,uCAAS,IAAA,KAAA,EAAA,gBAA4B;AAC/C,IAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,IAAA,IAAA,GAAO,IAAI,6BAAmC,IAAI,CAAA;AAAA,EACpD;AACA,EAAA,OAAO,IAAA;AACT,CAAA;AAAA;AAGA,eAAA,GAAa,WAAgB;AAC3B,EAAA,IAAI,IAAA,GAAO,sBAAK,wBAAA,EAAA,eAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACX,EAAA,OAAO,YAAA,CAAA,IAAA,EAAK,uCAAS,IAAA,KAAA,CAAA,kBAA8B;AACjD,IAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,IAAA,IAAA,GAAO,IAAI,QAAA,CAAS,IAAA,EAAM,eAAA,CAAA,IAAA,EAAK,2CAAL,IAAA,CAAA,IAAA,CAAoB,CAAA;AAAA,EAChD;AACA,EAAA,OAAO,IAAA;AACT,CAAA;AAEA,eAAA,GAAa,WAAgB;AAC3B,EAAA,MAAM,QAAQ,YAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,WAAA,CAAA;AAEnB,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAA,CAAA,eAAuB;AACrB,MAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AAGA,MAAA,IAAI,YAAA,CAAA,IAAA,EAAK,uCAAS,IAAA,KAAA,CAAA,cAA0B;AAC1C,QAAA,MAAM,IAAA,GAAO,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,oBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAwB,KAAA,CAAM,KAAA,CAAA;AAC3C,QAAA,IAAI,MAAM,OAAO,IAAA;AAAA,MACnB;AACA,MAAA,MAAM,CAAA,GAAI,UAAA,CAAW,KAAA,CAAM,KAAK,CAAA;AAChC,MAAA,IAAI,KAAA,CAAM,CAAC,CAAA,EAAG,MAAM,IAAI,gBAAA,CAAiB,CAAA,gBAAA,EAAmB,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AACzE,MAAA,OAAO,IAAI,WAAW,CAAC,CAAA;AAAA,IACzB;AAAA,IAEA,KAAA,CAAA;AACE,MAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,MAAA,OAAO,IAAI,UAAA,CAAW,KAAA,CAAM,KAAK,CAAA;AAAA,IAEnC,KAAA,CAAA;AACE,MAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,MAAA,OAAO,IAAI,WAAA,CAAY,KAAA,CAAM,KAAA,KAAU,MAAM,CAAA;AAAA,IAE/C,KAAA,EAAA;AACE,MAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,MAAA,OAAO,IAAI,UAAU,YAAA,CAAa,KAAA,CAAM,aAAa,eAAA,CAAgB,KAAA,CAAM,KAAK,CAAC,CAAC,CAAA;AAAA,IAEpF,KAAA,CAAA,sBAA8B;AAC5B,MAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AAEA,MAAA,IAAI,YAAA,CAAA,IAAA,EAAK,uCAAS,IAAA,KAAA,CAAA,cAA0B;AAC1C,QAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,QAAA,MAAM,GAAA,GAAM,sBAAK,wBAAA,EAAA,SAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAA,CAAA,qBAAA;AACZ,QAAA,OAAO,IAAI,kBAAA,CAAmB,KAAA,CAAM,KAAA,EAAO,IAAI,KAAK,CAAA;AAAA,MACtD;AACA,MAAA,OAAO,IAAI,iBAAA,CAAkB,KAAA,CAAM,KAAK,CAAA;AAAA,IAC1C;AAAA,IAEA,KAAA,EAAA,uBAA+B;AAC7B,MAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA;AACnC,MAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA;AACzB,MAAA,MAAM,OAAA,GAAY,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAC9B,MAAA,IAAI,YAAA,CAAA,IAAA,EAAK,uCAAS,IAAA,KAAA,CAAA,cAA0B;AAG1C,QAAA,MAAM,IAAA,GAAO,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,oBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAwB,OAAA,EAAS,SAAA,CAAA;AAC9C,QAAA,IAAI,MAAM,OAAO,IAAA;AAEjB,QAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,QAAA,MAAM,GAAA,GAAM,sBAAK,wBAAA,EAAA,SAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAA,CAAA,qBAAA;AACZ,QAAA,OAAO,IAAI,uBAAA,CAAwB,SAAA,EAAW,OAAA,EAAS,IAAI,KAAK,CAAA;AAAA,MAClE;AACA,MAAA,OAAO,IAAI,sBAAA,CAAuB,SAAA,EAAW,OAAO,CAAA;AAAA,IACtD;AAAA,IAEA,KAAA,EAAA,mBAA2B;AACzB,MAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AAIA,MAAA,IAAI,YAAA,CAAA,IAAA,EAAK,uCAAS,IAAA,KAAA,CAAA,cAA0B;AAC1C,QAAA,MAAM,IAAA,GAAO,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,oBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAwB,KAAA,CAAM,KAAA,CAAA;AAC3C,QAAA,IAAI,MAAM,OAAO,IAAA;AAAA,MACnB;AACA,MAAA,OAAO,IAAI,cAAA,CAAe,KAAA,CAAM,KAAK,CAAA;AAAA,IACvC;AAAA,IAEA,KAAA,EAAA;AACE,MAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,MAAA,OAAO,IAAI,kBAAA,CAAmB,KAAA,CAAM,KAAK,CAAA;AAAA,IAE3C,KAAA,CAAA;AACE,MAAA,OAAO,sBAAK,wBAAA,EAAA,gBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AAAA,IAET,KAAA,CAAA,kBAA0B;AACxB,MAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,MAAA,MAAM,IAAA,GAAO,sBAAK,wBAAA,EAAA,kBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACb,MAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,SAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAA,CAAA,kBAAA;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,IAEA;AACE,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,CAAA,kBAAA,EAAqB,MAAM,KAAK,CAAA,QAAA,EAAW,MAAM,IAAI,CAAA,cAAA,EAAiB,MAAM,QAAQ,CAAA,CAAA;AAAA,OACtF;AAAA;AAEN,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYA,oBAAA,GAAkB,SAAC,WAAmB,SAAA,EAAwC;AAC5E,EAAA,MAAM,QAAA,GAAW,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,CAAQ,YAAA,CAAA,IAAA,EAAKI,SAAO,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,MAAM,KAAA,GAAQ,cAAc,SAAS,CAAA;AACrC,EAAA,MAAM,GAAA,GAAM,aAAA,CAAc,QAAA,CAAS,KAAK,CAAA;AACxC,EAAA,IAAI,CAAC,SAAS,CAAC,GAAA,IAAO,MAAM,IAAA,KAAS,GAAA,CAAI,MAAM,OAAO,IAAA;AAEtD,EAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,EAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AAIA,EAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAA,EAAO,IAAI,KAAK,CAAA;AAC1C,EAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAA,EAAO,IAAI,KAAK,CAAA;AAC1C,EAAA,OAAO,MAAM,IAAA,KAAS,KAAA,GAClB,IAAI,sBAAA,CAAuB,IAAI,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,SAAS,IACxD,IAAI,sBAAA,CAAuB,MAAM,IAAA,EAAM,EAAA,EAAI,IAAI,SAAS,CAAA;AAC9D,CAAA;AAEA,gBAAA,GAAc,WAAgB;AAC5B,EAAA,MAAM,SAAA,GAAY,sBAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AAClB,EAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,SAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAA,CAAA,iBAAA;AACA,EAAA,OAAO,IAAI,iBAAiB,SAAA,CAAU,KAAA,CAAM,aAAY,EAAG,eAAA,CAAA,IAAA,EAAK,2CAAL,IAAA,CAAA,IAAA,CAAoB,CAAA;AACjF,CAAA;AAAA;AAGA,eAAA,GAAa,WAAkB;AAC7B,EAAA,MAAM,OAAsB,EAAC;AAE7B,EAAA,IAAI,YAAA,CAAA,IAAA,EAAK,uCAAS,IAAA,KAAA,CAAA,mBAA+B;AAE/C,IAAA,IAAI,YAAA,CAAA,IAAA,EAAK,uCAAS,IAAA,KAAA,CAAA,cAA0B;AAC1C,MAAA,IAAA,CAAK,IAAA,CAAK,IAAI,SAAA,EAAW,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,IAAA,CAAK,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,kBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAuB,CAAA;AAAA,IACnC;AAEA,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,uCAAS,IAAA,KAAA,CAAA,cAA0B;AAC7C,MAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,UAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AACA,MAAA,IACE,YAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,WAAA,CAAA,CAAS,IAAA,KAAA,CAAA,gBACd,YAAA,CAAA,IAAA,EAAK,uCAAS,IAAA,KAAA,CAAA,mBACd;AACA,QAAA,IAAA,CAAK,IAAA,CAAK,IAAI,SAAA,EAAW,CAAA;AAAA,MAC3B,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,IAAA,CAAK,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,kBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAuB,CAAA;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,eAAA,CAAA,IAAA,EAAK,wBAAA,EAAA,SAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAA,CAAA,kBAAA;AACA,EAAA,OAAO,IAAA;AACT,CAAA;AASF,SAAS,cAAc,IAAA,EAA6D;AAClF,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAInC,EAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG;AACtB,IAAA,MAAMV,IAAAA,GAAM,QAAA,CAAS,IAAA,EAAM,EAAE,CAAA;AAC7B,IAAA,OAAOA,IAAAA,IAAO,KAAKA,IAAAA,IAAO,cAAA,GAAiB,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAOA,IAAAA,EAAI,GAAI,IAAA;AAAA,EAC3E;AACA,EAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA,EAAG;AAChC,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,CAAK,WAAA,EAAa,CAAA;AAC3C,IAAA,OAAO,GAAA,IAAO,KAAK,GAAA,IAAO,iBAAA,GAAoB,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,GAAA,EAAI,GAAI,IAAA;AAAA,EAC9E;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,aAAa,IAAA,EAAwC;AAC5D,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAA,EAAA;AAAmC,MAAA,OAAA,CAAA;AAAA,IACnC,KAAA,EAAA;AAAmC,MAAA,OAAA,CAAA;AAAA,IACnC,KAAA,EAAA;AAAmC,MAAA,OAAA,CAAA;AAAA,IACnC,KAAA,EAAA;AAAmC,MAAA,OAAA,CAAA;AAAA,IACnC,KAAA,EAAA;AAAmC,MAAA,OAAA,EAAA;AAAA,IACnC,KAAA,EAAA;AAAmC,MAAA,OAAA,EAAA;AAAA,IACnC;AAAS,MAAA,OAAO,IAAA;AAAA;AAEpB;;;ACtSA,IAAM,OAAA,GAAU,KAAA;AAuChB,IAAM,OAAA,uBAAc,OAAA,EAA2B;AAE/C,SAAS,MAAM,GAAA,EAAwB;AACrC,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAsB;AACzC,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAsB;AAE3C,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAmE;AACvF,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,EAAc,CAAA,EAAiBW,EAAAA,KAAoB;AACrE,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAC9B,IAAA,IAAI,KAAA,EAAO,KAAA,CAAM,SAAA,CAAU,IAAA,CAAKA,EAAC,CAAA;AAAA,SAC5B,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,EAAE,SAAA,EAAW,CAACA,EAAC,CAAA,EAAG,cAAA,EAAgB,CAAA,EAAG,CAAA;AAAA,EAC9D,CAAA;AAEA,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,MAAA,EAAO,EAAG;AAC5B,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,MAAA,EAAO,CAAE,WAAA,EAAY;AACvC,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACjC,IAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AAAA,SAAQ,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,CAAC,CAAC,CAAC,CAAA;AAExD,IAAA,IAAI,EAAE,QAAA,EAAU;AACd,MAAA,MAAM,IAAI,CAAA,CAAE,WAAA;AACZ,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA;AAC5B,MAAA,IAAI,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AAAA,WAAQ,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAAA,IACpD,CAAA,MAAO;AACL,MAAA,UAAA,CAAW,CAAA,CAAE,IAAA,EAAM,CAAA,EAAG,CAAC,CAAA;AAAA,IACzB;AACA,IAAA,CAAA,EAAA;AAAA,EACF;AAEA,EAAA,MAAM,gBAAgB,YAAA,CAAa,IAAA,CAAK,SAAS,IAAA,EAAM,EAAE,IAAA,EAAK;AAC9D,EAAA,MAAM,UAAA,GAAa,IAAI,UAAA,CAAW,aAAA,CAAc,SAAS,CAAC,CAAA;AAC1D,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,aAAA,CAAc,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,UAAA,CAAW,CAAA,GAAI,CAAC,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA,GAAK,QAAA,CAAS,GAAA,CAAI,aAAA,CAAc,CAAC,CAAE,CAAA,CAAG,MAAA;AAAA,EACxE;AACA,EAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,aAAA,EAAe,UAAA,EAAY,OAAA,EAAS,CAAC,GAAG,OAAA,CAAQ,MAAA,EAAQ,CAAA,EAAE;AACvF;AASA,SAAS,QAAQ,GAAA,EAAwB;AACvC,EAAA,IAAI,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AACzB,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,GAAA,GAAM,MAAM,GAAG,CAAA;AACf,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,EACtB;AACA,EAAA,OAAO,GAAA;AACT;AAGA,SAAS,UAAA,CAAW,QAAsB,MAAA,EAAwB;AAChE,EAAA,IAAI,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,MAAA,CAAO,MAAA;AACxB,EAAA,OAAO,KAAK,EAAA,EAAI;AACd,IAAA,MAAMC,IAAAA,GAAO,KAAK,EAAA,IAAO,CAAA;AACzB,IAAA,IAAI,MAAA,CAAOA,IAAG,CAAA,GAAK,MAAA,OAAaA,IAAAA,GAAM,CAAA;AAAA,SAAQ,EAAA,GAAKA,IAAAA;AAAA,EACrD;AACA,EAAA,OAAO,EAAA;AACT;AAGA,SAAS,UAAA,CAAW,QAAsB,MAAA,EAAwB;AAChE,EAAA,IAAI,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,MAAA,CAAO,MAAA;AACxB,EAAA,OAAO,KAAK,EAAA,EAAI;AACd,IAAA,MAAMA,IAAAA,GAAO,KAAK,EAAA,IAAO,CAAA;AACzB,IAAA,IAAI,MAAA,CAAOA,IAAG,CAAA,IAAM,MAAA,OAAaA,IAAAA,GAAM,CAAA;AAAA,SAAQ,EAAA,GAAKA,IAAAA;AAAA,EACtD;AACA,EAAA,OAAO,EAAA;AACT;AAWO,SAAS,iBAAA,CACd,aAAA,EACA,QAAA,EACA,OAAA,EAC0B;AAC1B,EAAA,IAAI,CAAC,aAAA,CAAc,OAAA,EAAS,OAAO,IAAA;AACnC,EAAA,MAAM,MAAM,aAAA,CAAc,QAAA;AAG1B,EAAA,IAAI,GAAA,CAAI,MAAA,GAAS,OAAA,EAAS,OAAO,IAAA;AAEjC,EAAA,IAAI,QAAA,CAAS,SAAS,YAAA,EAAc;AAClC,IAAA,OAAO,QAAQ,GAAG,CAAA,CAAE,OAAO,GAAA,CAAI,QAAA,CAAS,IAAK,CAAA,IAAK,KAAA;AAAA,EACpD;AAEA,EAAA,IAAI,QAAA,CAAS,SAAS,cAAA,EAAgB;AACpC,IAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,IAAA,MAAM,GAAA,GAAM,QAAQ,GAAG,CAAA;AAGvB,IAAA,MAAMC,MAAAA,GAAQ,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAIrC,IAAA,IAAI,IAAA;AACJ,IAAA,MAAM,EAAE,eAAc,GAAI,GAAA;AAC1B,IAAA,KAAA,IAAS,CAAA,GAAI,WAAW,aAAA,EAAe,MAAA,GAAS,OAAO,CAAA,EAAG,CAAA,GAAI,aAAA,CAAc,MAAA,EAAQ,CAAA,EAAA,EAAK;AACvF,MAAA,MAAMhB,MAAAA,GAAQ,cAAc,CAAC,CAAA;AAC7B,MAAA,IAAIA,MAAAA,GAAQ,SAAS,OAAA,EAAS;AAC9B,MAAA,IAAIA,WAAU,MAAA,EAAQ;AAGtB,MAAA,IAAI,CAAC,QAAA,CAAS,IAAA,CAAK,aAAa,MAAA,CAAOA,MAAK,CAAC,CAAA,EAAG;AAChD,MAAA,CAAC,IAAA,KAAA,IAAA,GAAS,EAAC,CAAA,EAAG,IAAA,CAAK,GAAG,GAAA,CAAI,QAAA,CAAS,GAAA,CAAIA,MAAK,CAAE,CAAA;AAAA,IAChD;AAIA,IAAA,MAAM,MAAA,GAAS,SAAS,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA,GAAI,cAAA,CAAe,GAAG,CAAA,GAAI,MAAA;AAEzE,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,MAAA,EAAQ,MAAA,SAAegB,MAAAA,IAAS,KAAA;AAC9C,IAAA,MAAM,MAAA,GAAS,CAAC,GAAIA,MAAAA,IAAS,KAAA,EAAQ,GAAI,IAAA,IAAQ,KAAA,EAAQ,GAAI,MAAA,IAAU,KAAM,CAAA;AAC7E,IAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAC3B,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAA,CAAS,SAAS,eAAA,EAAiB;AACrC,IAAA,OAAO,iBAAiB,OAAA,CAAQ,GAAG,CAAA,EAAG,QAAA,EAAU,IAAI,MAAM,CAAA;AAAA,EAC5D;AAEA,EAAA,OAAO,IAAA;AACT;AAsBA,SAAS,gBAAA,CACP,GAAA,EACA,QAAA,EACA,MAAA,EAC0B;AAC1B,EAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,EAAA,MAAM,EAAE,eAAc,GAAI,GAAA;AAG1B,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,KAAK,aAAA,CAAc,MAAA;AACvB,EAAA,QAAQ,SAAS,EAAA;AAAI,IACnB,KAAK,GAAA;AAAM,MAAA,IAAA,GAAO,UAAA,CAAW,eAAe,MAAM,CAAA;AAAG,MAAA;AAAA,IACrD,KAAK,IAAA;AAAM,MAAA,IAAA,GAAO,UAAA,CAAW,eAAe,MAAM,CAAA;AAAG,MAAA;AAAA,IACrD,KAAK,GAAA;AAAM,MAAA,EAAA,GAAK,UAAA,CAAW,eAAe,MAAM,CAAA;AAAG,MAAA;AAAA,IACnD;AAAW,MAAA,EAAA,GAAK,UAAA,CAAW,eAAe,MAAM,CAAA;AAAG,MAAA;AAAA;AAOrD,EAAA,MAAM,SAAS,MAAA,IAAU,CAAA;AACzB,EAAA,MAAM,cAAA,GAAiB,IAAI,OAAA,CAAQ,MAAA,CAAO,OAAK,QAAA,CAAS,IAAA,CAAK,CAAA,CAAE,cAAc,CAAC,CAAA;AAC9E,EAAA,IAAI,QAAQ,GAAA,CAAI,UAAA,CAAW,EAAE,CAAA,GAAK,GAAA,CAAI,WAAW,IAAI,CAAA;AACrD,EAAA,KAAA,MAAW,KAAA,IAAS,cAAA,EAAgB,KAAA,IAAS,KAAA,CAAM,SAAA,CAAU,MAAA;AAC7D,EAAA,IAAI,KAAA,GAAQ,QAAQ,OAAO,IAAA;AAE3B,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,KAAA,IAAS,CAAA,GAAI,IAAA,EAAM,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC9B,IAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,aAAA,CAAc,CAAC,CAAE,CAAA,EAAI,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA;AAAA,EACxE;AACA,EAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,SAAA,EAAW,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EACnD;AAEA,EAAA,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAC9B,EAAA,OAAO,SAAA;AACT;AAGA,SAAS,eAAe,GAAA,EAAkC;AACxD,EAAA,OAAO,IAAI,OAAA,CAAQ,IAAA,CAAK,OAAK,CAAA,CAAE,cAAA,CAAe,OAAO,CAAA,EAAG,SAAA;AAC1D;AAEA,IAAM,QAA2B,EAAC;;;ACtR3B,SAAS,aAAa,CAAA,EAA2B;AACtD,EAAA,CAAA,CAAE,QAAA,CAAS,KAAA,EAAgB,GAAA,EAAc,CAAC,CAAA;AAC1C,EAAA,CAAA,CAAE,QAAA,CAAS,SAAA,EAAgB,OAAA,EAAc,CAAC,CAAA;AAC1C,EAAA,CAAA,CAAE,QAAA,CAAS,KAAA,EAAgB,GAAA,EAAc,CAAC,CAAA;AAC1C,EAAA,CAAA,CAAE,QAAA,CAAS,KAAA,EAAgB,GAAA,EAAc,CAAC,CAAA;AAC1C,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAgB,KAAA,EAAc,CAAC,CAAA;AAC1C,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAgB,MAAA,EAAc,CAAC,CAAA;AAC1C,EAAA,CAAA,CAAE,QAAA,CAAS,YAAA,EAAgB,UAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,SAAA,EAAgB,OAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,UAAA,EAAgB,QAAA,EAAc,CAAC,CAAA;AAC1C,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAgB,KAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAgB,MAAA,EAAc,CAAC,CAAA;AAC1C,EAAA,CAAA,CAAE,QAAA,CAAS,WAAA,EAAgB,SAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,YAAA,EAAgB,UAAA,EAAc,CAAC,CAAA;AAC1C,EAAA,CAAA,CAAE,QAAA,CAAS,SAAA,EAAgB,OAAA,EAAc,CAAC,CAAA;AAC1C,EAAA,CAAA,CAAE,QAAA,CAAS,YAAA,EAAgB,UAAA,EAAc,CAAC,CAAA;AAC1C,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAgB,KAAA,EAAc,CAAC,CAAA;AAC1C,EAAA,CAAA,CAAE,QAAA,CAAS,KAAA,EAAgB,GAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAgB,KAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,SAAA,EAAgB,OAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,WAAA,EAAgB,SAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,SAAA,EAAgB,OAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,cAAA,EAAgB,OAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAgB,KAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,YAAA,EAAgB,KAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,KAAA,EAAgB,IAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAgB,KAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,KAAA,EAAgB,GAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,UAAA,EAAgB,QAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAgB,KAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAgB,IAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAgB,IAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,IAAA,EAAgB,EAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAgB,IAAA,EAAc,CAAA,EAAG,GAAG,IAAI,CAAA;AACnD,EAAA,CAAA,CAAE,QAAA,CAAS,aAAA,EAAgB,WAAA,EAAc,CAAA,EAAG,GAAG,IAAI,CAAA;AACnD,EAAA,CAAA,CAAE,QAAA,CAAS,KAAA,EAAgB,GAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAgB,KAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,IAAA,EAAgB,EAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,KAAA,EAAgB,GAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAgB,IAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAgB,MAAA,EAAc,CAAA,EAAG,CAAC,CAAA;AAE7C,EAAA,CAAA,CAAE,SAAS,KAAA,EAAgB,KAAA,CAAM,KAAK,GAAG,CAAA,EAAK,GAAG,CAAC,CAAA;AAClD,EAAA,CAAA,CAAE,SAAS,KAAA,EAAgB,KAAA,CAAM,KAAK,GAAG,CAAA,EAAK,GAAG,CAAC,CAAA;AAClD,EAAA,CAAA,CAAE,SAAS,KAAA,EAAgB,KAAA,CAAM,KAAK,GAAG,CAAA,EAAK,GAAG,CAAC,CAAA;AAClD,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAgB,IAAA,EAAmB,CAAA,EAAG,CAAC,CAAA;AAClD,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAgB,IAAA,EAAmB,CAAA,EAAG,CAAC,CAAA;AAClD,EAAA,CAAA,CAAE,SAAS,MAAA,EAAgB,KAAA,CAAM,KAAK,IAAI,CAAA,EAAI,GAAG,CAAC,CAAA;AAClD,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAgB,KAAA,EAAmB,CAAA,EAAG,CAAC,CAAA;AAClD,EAAA,CAAA,CAAE,SAAS,MAAA,EAAgB,KAAA,CAAM,KAAK,IAAI,CAAA,EAAI,GAAG,CAAC,CAAA;AAClD,EAAA,CAAA,CAAE,SAAS,MAAA,EAAgB,KAAA,CAAM,KAAK,IAAI,CAAA,EAAI,GAAG,CAAC,CAAA;AAClD,EAAA,CAAA,CAAE,SAAS,MAAA,EAAgB,KAAA,CAAM,KAAK,IAAI,CAAA,EAAI,GAAG,CAAC,CAAA;AAClD,EAAA,CAAA,CAAE,QAAA,CAAS,SAAA,EAAgB,KAAA,CAAM,CAAA,GAAA,KAAQ,GAAA,GAAM,MAAO,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACpE,EAAA,CAAA,CAAE,QAAA,CAAS,SAAA,EAAgB,KAAA,CAAM,CAAA,CAAA,KAAM,CAAA,GAAI,KAAK,EAAA,GAAM,GAAG,CAAA,EAAO,CAAA,EAAG,CAAC,CAAA;AACtE;AAKA,SAAS,OAAA,CAAQ,GAAiB,CAAA,EAAyB;AACzD,EAAA,OAAO,EAAE,OAAA,GAAU,CAAA,CAAE,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,GAAI,CAAA;AAC7C;AAGA,SAAS,SAAS,CAAA,EAAyB;AACzC,EAAA,OAAO,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,QAAA,CAAS,MAAA,GAAS,CAAA;AACzC;AAOA,IAAM,eAAA,GAAkB,EAAA;AAiCxB,SAAS,mBAAA,CAAoB,CAAA,EAAS,CAAA,EAAQ,QAAA,EAAkBC,IAAAA,EAAwB;AACtF,EAAA,MAAM,SAAyB,EAAC;AAChC,EAAA,MAAM,WAA6C,EAAC;AACpD,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,QAAA,GAAW,EAAA;AAEf,EAAA,KAAA,IAAS,IAAI,QAAA,EAAU,CAAA,GAAI,IAAI,CAAA,CAAE,MAAA,EAAQ,KAAK,CAAA,EAAG;AAC/C,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC3B,IAAA,IAAI,GAAG,OAAA,EAAS,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,EAAA,EAAG;AAC9C,IAAA,MAAM,OAAO,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AACjC,IAAA,IAAI,KAAK,OAAA,EAAS,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,IAAA,EAAK;AAElD,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAA;AAC5D,IAAA,MAAA,CAAO,KAAK,EAAE,CAAA;AACd,IAAA,QAAA,CAAS,KAAK,QAAQ,CAAA;AAEtB,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,EAAA,EAAI,QAAA,EAAU,eAAe,CAAA;AACjE,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,IAAA,GAAO,SAAA;AACP,QAAA,QAAA,GAAW,OAAO,MAAA,GAAS,CAAA;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,MAAA,EAAW;AAGtB,IAAA,IAAI,aAAuB,EAAC;AAC5B,IAAA,KAAA,MAAW,KAAK,IAAA,EAAM,IAAI,IAAIA,IAAAA,EAAK,UAAA,CAAW,KAAK,CAAC,CAAA;AAEpD,IAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,MAAA,CAAO,UAAU,UAAA,CAAW,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC/D,MAAA,IAAI,MAAM,QAAA,EAAU;AACpB,MAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,CAAC,CAAA,CAAG,IAAA;AAC1B,MAAA,MAAM,OAAiB,EAAC;AACxB,MAAA,KAAA,MAAW,CAAA,IAAK,UAAA,EAAY,IAAI,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,CAAC,CAAC,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AACpE,MAAA,UAAA,GAAa,IAAA;AAAA,IACf;AACA,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,SAAA,EAAW,UAAA,EAAW;AAAA,EAC3C;AAEA,EAAA,MAAM,OAAO,IAAI,UAAA,CAAWA,IAAG,CAAA,CAAE,KAAK,CAAC,CAAA;AACvC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,CAAC,CAAA,CAAG,IAAA;AAC1B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIA,IAAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,MAAA,IAAI,CAAC,IAAA,CAAK,CAAC,CAAA,EAAG;AACd,MAAA,IAAI,CAAC,KAAK,OAAA,CAAQ,KAAA,EAAO,CAAC,CAAC,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA;AAAA,IAC1C;AAAA,EACF;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAC1B;AAGA,SAAS,eAAA,CACP,GAAA,EACAA,IAAAA,EACA,KAAA,EACM;AACN,EAAA,IAAI,eAAe,GAAA,EAAK;AACtB,IAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,SAAA,EAAW,KAAA,CAAM,CAAC,CAAA;AACtC,IAAA;AAAA,EACF;AACA,EAAA,MAAM,EAAE,MAAK,GAAI,GAAA;AACjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIA,IAAAA,EAAK,CAAA,EAAA,MAAS,IAAA,CAAK,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA;AACpD;AAEA,SAAS,MAAA,CAAO,GAAS,CAAA,EAAsB;AAE7C,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,IAAK,CAAA,CAAE,SAAS,CAAA,KAAM,CAAA,SAAU,YAAA,CAAa,UAAA;AAC5D,EAAA,MAAM,QAAA,GAAW,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AACjC,EAAA,IAAI,QAAA,CAAS,SAAS,OAAO,QAAA;AAC7B,EAAA,MAAMA,IAAAA,GAAM,SAAS,QAAQ,CAAA;AAC7B,EAAA,MAAM,GAAA,GAAM,mBAAA,CAAoB,CAAA,EAAG,CAAA,EAAG,GAAGA,IAAG,CAAA;AAC5C,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,GAAA,CAAI,KAAA;AAExB,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,eAAA,CAAgB,GAAA,EAAKA,MAAK,CAAA,CAAA,KAAK;AAC7B,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,QAAA,EAAU,CAAC,EAAE,WAAA,EAAY;AAC3C,IAAA,IAAI,CAAA,CAAE,EAAA,EAAI,KAAA,IAAS,CAAA,CAAE,KAAA;AAAA,EACvB,CAAC,CAAA;AACD,EAAA,OAAO,YAAA,CAAa,OAAO,KAAK,CAAA;AAClC;AAEA,SAAS,QAAA,CAAS,GAAS,CAAA,EAAsB;AAE/C,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,IAAK,CAAA,CAAE,SAAS,CAAA,KAAM,CAAA,SAAU,YAAA,CAAa,UAAA;AAC5D,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC9B,EAAA,IAAI,KAAA,CAAM,SAAS,OAAO,KAAA;AAC1B,EAAA,MAAMA,IAAAA,GAAM,SAAS,KAAK,CAAA;AAC1B,EAAA,MAAM,GAAA,GAAM,mBAAA,CAAoB,CAAA,EAAG,CAAA,EAAG,GAAGA,IAAG,CAAA;AAC5C,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,GAAA,CAAI,KAAA;AAExB,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,eAAA,CAAgB,GAAA,EAAKA,MAAK,MAAM;AAAE,IAAA,CAAA,EAAA;AAAA,EAAK,CAAC,CAAA;AACxC,EAAA,OAAO,YAAA,CAAa,OAAO,CAAC,CAAA;AAC9B;AAEA,SAAS,UAAA,CAAW,GAAS,CAAA,EAAsB;AAEjD,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,IAAK,CAAA,CAAE,SAAS,CAAA,KAAM,CAAA,SAAU,YAAA,CAAa,UAAA;AAC5D,EAAA,MAAM,QAAA,GAAW,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AACjC,EAAA,IAAI,QAAA,CAAS,SAAS,OAAO,QAAA;AAC7B,EAAA,MAAMA,IAAAA,GAAM,SAAS,QAAQ,CAAA;AAC7B,EAAA,MAAM,GAAA,GAAM,mBAAA,CAAoB,CAAA,EAAG,CAAA,EAAG,GAAGA,IAAG,CAAA;AAC5C,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,GAAA,CAAI,KAAA;AAExB,EAAA,IAAI,KAAA,GAAQ,GAAG,GAAA,GAAM,CAAA;AACrB,EAAA,eAAA,CAAgB,GAAA,EAAKA,MAAK,CAAA,CAAA,KAAK;AAC7B,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,QAAA,EAAU,CAAC,EAAE,WAAA,EAAY;AAC3C,IAAA,IAAI,EAAE,EAAA,EAAI;AAAE,MAAA,KAAA,IAAS,CAAA,CAAE,KAAA;AAAO,MAAA,GAAA,EAAA;AAAA,IAAO;AAAA,EACvC,CAAC,CAAA;AACD,EAAA,OAAO,QAAQ,CAAA,GAAI,YAAA,CAAa,YAAY,YAAA,CAAa,MAAA,CAAO,QAAQ,GAAG,CAAA;AAC7E;AAEA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,CAAA,GAAI,aAAA,CAAc,cAAA,CAAe,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,OAAO,YAAA,CAAa,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AACpE;AAKA,SAAS,MAAM,EAAA,EAA8D;AAC3E,EAAA,OAAO,CAAC,GAAG,CAAA,KAAM;AACf,IAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,IAAA,OAAO,CAAA,CAAE,KAAK,YAAA,CAAa,MAAA,CAAO,GAAG,CAAA,CAAE,KAAK,CAAC,CAAA,GAAI,CAAA,CAAE,KAAA;AAAA,EACrD,CAAA;AACF;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,IAAI,EAAE,KAAA,GAAQ,EAAA,IAAM,EAAE,KAAA,GAAQ,CAAA,SAAU,YAAA,CAAa,QAAA;AACrD,EAAA,OAAO,aAAa,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,CAAA,CAAE,KAAK,CAAC,CAAA;AAC/C;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,IAAI,EAAE,KAAA,GAAQ,EAAA,IAAM,EAAE,KAAA,GAAQ,CAAA,SAAU,YAAA,CAAa,QAAA;AACrD,EAAA,OAAO,aAAa,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,CAAA,CAAE,KAAK,CAAC,CAAA;AAC/C;AAEA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAE5C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,IAAI,EAAE,KAAA,KAAU,CAAA,IAAK,EAAE,KAAA,KAAU,CAAA,SAAU,YAAA,CAAa,SAAA;AACxD,EAAA,OAAO,YAAA,CAAa,OAAO,IAAA,CAAK,KAAA,CAAM,EAAE,KAAA,EAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AACzD;AAIA,SAAS,GAAA,CAAI,GAAS,CAAA,EAAsB;AAC1C,EAAA,MAAM,CAAA,GAAI,aAAA,CAAc,cAAA,CAAe,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,OAAO,YAAA,CAAa,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAChE;AAEA,SAAS,OAAA,CAAQ,GAAS,CAAA,EAAsB;AAC9C,EAAA,MAAM,CAAA,GAAI,aAAA,CAAc,cAAA,CAAe,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,IAAI,CAAA,CAAE,MAAA,CAAO,MAAA,KAAW,CAAA,SAAU,YAAA,CAAa,SAAA;AAC/C,EAAA,OAAO,YAAA,CAAa,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,OAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA,CAAE,OAAO,MAAM,CAAA;AAClF;AAEA,SAAS,GAAA,CAAI,GAAS,CAAA,EAAsB;AAC1C,EAAA,MAAM,CAAA,GAAI,aAAA,CAAc,cAAA,CAAe,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,OAAO,CAAA,CAAE,MAAA,CAAO,MAAA,KAAW,CAAA,GAAI,YAAA,CAAa,IAAA,GAAO,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,CAAE,MAAM,CAAC,CAAA;AAC9F;AAEA,SAAS,GAAA,CAAI,GAAS,CAAA,EAAsB;AAC1C,EAAA,MAAM,CAAA,GAAI,aAAA,CAAc,cAAA,CAAe,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,OAAO,CAAA,CAAE,MAAA,CAAO,MAAA,KAAW,CAAA,GAAI,YAAA,CAAa,IAAA,GAAO,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,CAAE,MAAM,CAAC,CAAA;AAC9F;AAEA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,IAAI,CAAA,CAAE,QAAA,IAAa,CAAA,CAAE,MAAA,IAAU,CAAC,MAAM,UAAA,CAAW,CAAA,CAAE,SAAS,CAAC,CAAA,EAAI,CAAA,EAAA;AAAA,EACnE;AACA,EAAA,OAAO,YAAA,CAAa,OAAO,CAAC,CAAA;AAC9B;AAEA,SAAS,MAAA,CAAO,GAAS,CAAA,EAAsB;AAC7C,EAAA,OAAO,YAAA,CAAa,MAAA,CAAO,aAAA,CAAc,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,OAAO,EAAE,MAAM,CAAA;AAC3F;AAEA,SAAS,UAAA,CAAW,GAAS,CAAA,EAAsB;AACjD,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC1B,EAAA,IAAI,CAAC,EAAE,OAAA,EAAS,OAAO,aAAa,MAAA,CAAO,CAAA,CAAE,OAAA,GAAU,CAAA,GAAI,CAAC,CAAA;AAC5D,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,MAAW,QAAQ,CAAA,CAAE,QAAA,CAAS,QAAO,EAAG,IAAI,KAAK,OAAA,EAAS,CAAA,EAAA;AAC1D,EAAA,OAAO,YAAA,CAAa,OAAO,CAAC,CAAA;AAC9B;AAEA,SAAS,OAAA,CAAQ,GAAS,CAAA,EAAsB;AAC9C,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC9B,EAAA,IAAI,KAAA,CAAM,SAAS,OAAO,KAAA;AAC1B,EAAA,MAAM,IAAA,GAAQ,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC9B,EAAA,IAAI,IAAA,CAAK,SAAS,OAAO,IAAA;AACzB,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,EAAO;AAE7B,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,EAAS,OAAO,YAAA,CAAa,MAAA,CAAO,aAAA,CAAc,eAAA,CAAgB,KAAA,EAAO,QAAQ,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA;AACrG,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,QAAA,CAAS,MAAA,EAAO,EAAG;AAC1C,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,cAAc,eAAA,CAAgB,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAA;AAAA,EACtE;AACA,EAAA,OAAO,YAAA,CAAa,OAAO,CAAC,CAAA;AAC9B;AAEA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC9B,EAAA,IAAI,KAAA,CAAM,SAAS,OAAO,KAAA;AAC1B,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC7B,EAAA,IAAI,IAAA,CAAK,SAAS,OAAO,IAAA;AACzB,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,EAAO;AAE7B,EAAA,MAAM,QAAA,GAAW,EAAE,MAAA,GAAS,CAAA,GAAI,EAAE,CAAC,CAAA,CAAG,QAAA,CAAS,CAAC,CAAA,GAAI,KAAA;AACpD,EAAA,IAAI,QAAA,CAAS,SAAS,OAAO,QAAA;AAE7B,EAAA,IAAI,CAAC,MAAM,OAAA,EAAS;AAClB,IAAA,IAAI,aAAA,CAAc,eAAA,CAAgB,KAAA,EAAO,QAAQ,CAAA,EAAG;AAClD,MAAA,MAAM,CAAA,GAAI,SAAS,WAAA,EAAY;AAC/B,MAAA,OAAO,EAAE,EAAA,GAAK,YAAA,CAAa,OAAO,CAAA,CAAE,KAAK,IAAI,YAAA,CAAa,IAAA;AAAA,IAC5D;AACA,IAAA,OAAO,YAAA,CAAa,IAAA;AAAA,EACtB;AAEA,EAAA,MAAM,WAAY,KAAA,CAAM,QAAA;AACxB,EAAA,MAAM,MAAA,GAAY,QAAA,CAAS,OAAA,GAAU,QAAA,CAAS,QAAA,GAAW,IAAA;AACzD,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA;AAC7B,IAAA,IAAI,GAAG,OAAA,EAAS;AAChB,IAAA,IAAI,aAAA,CAAc,eAAA,CAAgB,EAAA,EAAI,QAAQ,CAAA,EAAG;AAC/C,MAAA,MAAM,EAAA,GAAK,SAAS,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAC,CAAA;AAC1D,MAAA,MAAM,CAAA,GAAI,GAAG,WAAA,EAAY;AACzB,MAAA,IAAI,CAAA,CAAE,EAAA,EAAI,KAAA,IAAS,CAAA,CAAE,KAAA;AAAA,IACvB;AAAA,EACF;AACA,EAAA,OAAO,YAAA,CAAa,OAAO,KAAK,CAAA;AAClC;AAEA,SAAS,SAAA,CAAU,GAAS,CAAA,EAAsB;AAChD,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC9B,EAAA,IAAI,KAAA,CAAM,SAAS,OAAO,KAAA;AAC1B,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC7B,EAAA,IAAI,IAAA,CAAK,SAAS,OAAO,IAAA;AACzB,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,EAAO;AAC7B,EAAA,MAAM,QAAA,GAAW,EAAE,MAAA,GAAS,CAAA,GAAI,EAAE,CAAC,CAAA,CAAG,QAAA,CAAS,CAAC,CAAA,GAAI,KAAA;AACpD,EAAA,IAAI,QAAA,CAAS,SAAS,OAAO,QAAA;AAE7B,EAAA,IAAI,CAAC,MAAM,OAAA,EAAS;AAClB,IAAA,IAAI,CAAC,aAAA,CAAc,eAAA,CAAgB,OAAO,QAAQ,CAAA,SAAU,YAAA,CAAa,SAAA;AACzE,IAAA,MAAM,CAAA,GAAI,SAAS,WAAA,EAAY;AAC/B,IAAA,OAAO,EAAE,EAAA,GAAK,YAAA,CAAa,OAAO,CAAA,CAAE,KAAK,IAAI,YAAA,CAAa,SAAA;AAAA,EAC5D;AAEA,EAAA,MAAM,WAAW,KAAA,CAAM,QAAA;AACvB,EAAA,MAAM,MAAA,GAAW,QAAA,CAAS,OAAA,GAAU,QAAA,CAAS,QAAA,GAAW,IAAA;AACxD,EAAA,IAAI,KAAA,GAAQ,GAAG,GAAA,GAAM,CAAA;AAErB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA;AAC7B,IAAA,IAAI,GAAG,OAAA,EAAS;AAChB,IAAA,IAAI,aAAA,CAAc,eAAA,CAAgB,EAAA,EAAI,QAAQ,CAAA,EAAG;AAC/C,MAAA,MAAM,EAAA,GAAK,SAAS,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAC,CAAA;AAC1D,MAAA,MAAM,CAAA,GAAI,GAAG,WAAA,EAAY;AACzB,MAAA,IAAI,EAAE,EAAA,EAAI;AAAE,QAAA,KAAA,IAAS,CAAA,CAAE,KAAA;AAAO,QAAA,GAAA,EAAA;AAAA,MAAO;AAAA,IACvC;AAAA,EACF;AACA,EAAA,OAAO,QAAQ,CAAA,GAAI,YAAA,CAAa,YAAY,YAAA,CAAa,MAAA,CAAO,QAAQ,GAAG,CAAA;AAC7E;AAEA,SAAS,OAAA,CAAQ,GAAS,CAAA,EAAsB;AAC9C,EAAA,MAAM,CAAA,GAAI,aAAA,CAAc,cAAA,CAAe,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,OAAO,YAAA,CAAa,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAChE;AAEA,SAAS,UAAA,CAAW,GAAS,CAAA,EAAsB;AACjD,EAAA,MAAM,MAAA,GAAS,EAAE,GAAA,CAAI,CAAAL,SAAOA,IAAAA,CAAI,QAAA,CAAS,CAAC,CAAC,CAAA;AAC3C,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,EAAQ,IAAI,CAAA,CAAE,SAAS,OAAO,CAAA;AAE9C,EAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,EAAA,MAAMK,IAAAA,GAAM,KAAA,CAAM,OAAA,GAAU,KAAA,CAAM,SAAS,MAAA,GAAS,CAAA;AACpD,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIA,IAAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,MAAM,OAAO,CAAA,CAAE,OAAA,GAAU,EAAE,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,GAAI,CAAA;AACjD,MAAA,MAAM,CAAA,GAAI,KAAK,WAAA,EAAY;AAC3B,MAAA,IAAI,CAAC,EAAE,EAAA,EAAI;AAAE,QAAA,IAAA,GAAO,CAAA;AAAG,QAAA;AAAA,MAAO;AAC9B,MAAA,IAAA,IAAQ,CAAA,CAAE,KAAA;AAAA,IACZ;AACA,IAAA,KAAA,IAAS,IAAA;AAAA,EACX;AACA,EAAA,OAAO,YAAA,CAAa,OAAO,KAAK,CAAA;AAClC;AAIA,SAAS,GAAA,CAAI,GAAS,CAAA,EAAsB;AAC1C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,OAAO,CAAA,CAAE,EAAA,GAAK,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA,GAAI,CAAA,CAAE,KAAA;AAC3D;AAEA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,KAAA,CAAM,CAAA,CAAE,KAAK,CAAC,CAAA;AAC/C,EAAA,OAAO,YAAA,CAAa,OAAO,IAAA,CAAK,KAAA,CAAM,EAAE,KAAA,GAAQ,MAAM,IAAI,MAAM,CAAA;AAClE;AAEA,SAAS,OAAA,CAAQ,GAAS,CAAA,EAAsB;AAC9C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,KAAA,CAAM,CAAA,CAAE,KAAK,CAAC,CAAA;AAC/C,EAAA,OAAO,YAAA,CAAa,OAAO,IAAA,CAAK,IAAA,CAAK,EAAE,KAAA,GAAQ,MAAM,IAAI,MAAM,CAAA;AACjE;AAEA,SAAS,SAAA,CAAU,GAAS,CAAA,EAAsB;AAChD,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,KAAA,CAAM,CAAA,CAAE,KAAK,CAAC,CAAA;AAC/C,EAAA,OAAO,YAAA,CAAa,OAAO,IAAA,CAAK,KAAA,CAAM,EAAE,KAAA,GAAQ,MAAM,IAAI,MAAM,CAAA;AAClE;AAEA,SAAS,OAAA,CAAQ,GAAS,CAAA,EAAsB;AAC9C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,IAAI,CAAA,CAAE,KAAA,KAAU,CAAA,EAAG,OAAO,YAAA,CAAa,IAAA;AACvC,EAAA,OAAO,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAK,CAAA,GAAI,CAAA,CAAE,KAAK,CAAA;AACnE;AAEA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,IAAI,CAAA,CAAE,KAAA,KAAU,CAAA,EAAG,OAAO,YAAA,CAAa,IAAA;AACvC,EAAA,OAAO,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAK,CAAA,GAAI,CAAA,CAAE,KAAK,CAAA;AACpE;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,OAAO,CAAA,CAAE,EAAA,GAAK,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,KAAK,CAAC,CAAA,GAAI,CAAA,CAAE,KAAA;AAC7D;AAEA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAChB,IAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,IAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,IAAA,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAK,CAAA;AAAA,EAC7B;AACA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,MAAM,CAAA;AAClC,EAAA,OAAO,YAAA,CAAa,OAAO,IAAA,CAAK,KAAA,CAAM,EAAE,KAAA,GAAQ,MAAM,IAAI,MAAM,CAAA;AAClE;AAEA,SAAS,GAAA,CAAI,GAAS,CAAA,EAAsB;AAC1C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,IAAI,CAAA,CAAE,KAAA,KAAU,CAAA,EAAG,OAAO,YAAA,CAAa,SAAA;AACvC,EAAA,OAAO,YAAA,CAAa,MAAA,CAAO,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAK,CAAC,CAAA;AAC9E;AAEA,SAAS,QAAA,CAAS,GAAS,CAAA,EAAsB;AAC/C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,IAAI,CAAA,CAAE,KAAA,KAAU,CAAA,EAAG,OAAO,YAAA,CAAa,SAAA;AACvC,EAAA,OAAO,YAAA,CAAa,OAAO,IAAA,CAAK,KAAA,CAAM,EAAE,KAAA,GAAQ,CAAA,CAAE,KAAK,CAAC,CAAA;AAC1D;AAEA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,OAAO,YAAA,CAAa,OAAO,IAAA,CAAK,GAAA,CAAI,EAAE,KAAA,EAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AACvD;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,IAAI,CAAA,CAAE,KAAA,GAAQ,CAAA,EAAG,OAAO,YAAA,CAAa,QAAA;AACrC,EAAA,OAAO,aAAa,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,CAAA,CAAE,KAAK,CAAC,CAAA;AAC/C;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,OAAO,CAAA,CAAE,EAAA,GAAK,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,KAAK,CAAC,CAAA,GAAI,CAAA,CAAE,KAAA;AAC5D;AAEA,SAAS,EAAA,GAAoB;AAAE,EAAA,OAAO,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAAG;AACpE,SAAS,IAAA,GAAqB;AAAE,EAAA,OAAO,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAG;AAE3E,SAAS,WAAA,CAAY,GAAS,CAAA,EAAsB;AAClD,EAAA,MAAM,KAAK,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC5C,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,KAAA;AACtB,EAAA,MAAM,KAAK,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC5C,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,KAAA;AACtB,EAAA,OAAO,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAG,KAAA,GAAQ,IAAA,CAAK,MAAA,EAAO,IAAK,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG,KAAA,GAAQ,EAAE,CAAC,CAAA;AAC7F;AAEA,SAAS,GAAA,CAAI,GAAS,CAAA,EAAsB;AAC1C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,IAAI,CAAA,CAAE,KAAA,IAAS,CAAA,EAAG,OAAO,YAAA,CAAa,QAAA;AACtC,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAChB,IAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,IAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,IAAA,IAAA,GAAO,CAAA,CAAE,KAAA;AAAA,EACX;AACA,EAAA,IAAI,IAAA,IAAQ,CAAA,IAAK,IAAA,KAAS,CAAA,SAAU,YAAA,CAAa,QAAA;AACjD,EAAA,OAAO,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAC,CAAA;AAC/D;AAEA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,IAAI,CAAA,CAAE,KAAA,IAAS,CAAA,EAAG,OAAO,YAAA,CAAa,QAAA;AACtC,EAAA,OAAO,aAAa,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAK,CAAC,CAAA;AAChD;AAEA,SAAS,EAAA,CAAG,GAAS,CAAA,EAAsB;AACzC,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,IAAI,CAAA,CAAE,KAAA,IAAS,CAAA,EAAG,OAAO,YAAA,CAAa,QAAA;AACtC,EAAA,OAAO,aAAa,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAC9C;AAEA,SAAS,GAAA,CAAI,GAAS,CAAA,EAAsB;AAC1C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,OAAO,CAAA,CAAE,EAAA,GAAK,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA,GAAI,CAAA,CAAE,KAAA;AAC3D;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAK,CAAA;AAC5B,EAAA,IAAI,CAAA,GAAI,CAAA,EAAG,OAAO,YAAA,CAAa,QAAA;AAC/B,EAAA,IAAI,CAAA,GAAI,GAAA,EAAK,OAAO,YAAA,CAAa,QAAA;AACjC,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,KAAK,CAAA,IAAK,CAAA;AAClC,EAAA,OAAO,YAAA,CAAa,OAAO,CAAC,CAAA;AAC9B;AAEA,SAAS,MAAA,CAAO,GAAS,CAAA,EAAsB;AAC7C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAK,CAAA;AAC5B,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAK,CAAA;AAC5B,EAAA,IAAI,IAAI,CAAA,IAAK,CAAA,GAAI,KAAK,CAAA,GAAI,CAAA,SAAU,YAAA,CAAa,QAAA;AAEjD,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,EAAG,KAAK,MAAA,GAAS,MAAA,IAAU,CAAA,GAAI,CAAA,CAAA,IAAM,CAAA,GAAI,CAAA,CAAA;AAC7D,EAAA,OAAO,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAC/C;AChlBO,SAAS,aAAa,CAAA,EAA2B;AACtD,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAe,IAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAe,KAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,CAAA,CAAE,QAAA,CAAS,KAAA,EAAe,GAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,CAAA,CAAE,QAAA,CAAS,KAAA,EAAe,GAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAe,KAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAe,KAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAe,MAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAe,IAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAe,KAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,CAAA,CAAE,QAAA,CAAS,YAAA,EAAe,UAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,CAAA,CAAE,QAAA,CAAS,SAAA,EAAe,OAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,CAAA,CAAE,QAAA,CAAS,aAAA,EAAe,WAAA,EAAa,CAAC,CAAA;AACxC,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAe,WAAA,EAAa,CAAC,CAAA;AACxC,EAAA,CAAA,CAAE,QAAA,CAAS,UAAA,EAAe,QAAA,EAAa,CAAC,CAAA;AACxC,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAe,KAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAe,KAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAe,IAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAe,MAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAe,IAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAe,KAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAe,KAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAe,IAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,CAAA,CAAE,QAAA,CAAS,GAAA,EAAe,EAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,CAAA,CAAE,QAAA,CAAS,YAAA,EAAe,UAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,CAAA,CAAE,QAAA,CAAS,WAAA,EAAe,SAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC7C;AAIA,SAAS,GAAA,CAAI,CAAA,EAAS,CAAA,EAAQ,GAAA,EAAuE;AACnG,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,GAAG,GAAI,CAAC,CAAA;AAC7C,EAAA,OAAO,CAAA,CAAE,EAAA,GAAK,EAAE,EAAA,EAAI,MAAM,CAAA,EAAG,CAAA,CAAE,KAAA,EAAM,GAAI,EAAE,EAAA,EAAI,KAAA,EAAO,CAAA,EAAG,EAAE,KAAA,EAAM;AACnE;AAEA,SAAS,GAAA,CAAI,CAAA,EAAS,CAAA,EAAQ,GAAA,EAAuE;AACnG,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,GAAG,GAAI,CAAC,CAAA;AAC7C,EAAA,OAAO,CAAA,CAAE,EAAA,GAAK,EAAE,EAAA,EAAI,MAAM,CAAA,EAAG,CAAA,CAAE,KAAA,EAAM,GAAI,EAAE,EAAA,EAAI,KAAA,EAAO,CAAA,EAAG,EAAE,KAAA,EAAM;AACnE;AAIA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAC5C,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAAE,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,IAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAAG,IAAA,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAC,CAAA;AAAA,EAAG;AACxF,EAAA,IAAI,CAAA,GAAI,CAAA,EAAG,OAAO,YAAA,CAAa,UAAA;AAC/B,EAAA,OAAO,aAAa,IAAA,CAAK,CAAA,CAAE,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAC1C;AAEA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAC5C,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAAE,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,IAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAAG,IAAA,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAC,CAAA;AAAA,EAAG;AACxF,EAAA,IAAI,CAAA,GAAI,CAAA,EAAG,OAAO,YAAA,CAAa,UAAA;AAC/B,EAAA,OAAO,YAAA,CAAa,IAAA,CAAK,CAAA,IAAK,CAAA,CAAE,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AAChE;AAEA,SAAS,GAAA,CAAI,GAAS,CAAA,EAAsB;AAC1C,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAC5C,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,CAAA;AAC/C,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,CAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA;AACjC,EAAA,MAAMC,MAAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,CAAC,CAAA;AAC7B,EAAA,IAAI,KAAA,GAAQ,CAAA,IAAKA,MAAAA,GAAQ,CAAA,SAAU,YAAA,CAAa,UAAA;AAChD,EAAA,OAAO,YAAA,CAAa,KAAK,CAAA,CAAE,CAAA,CAAE,MAAM,KAAA,EAAO,KAAA,GAAQA,MAAK,CAAC,CAAA;AAC1D;AAEA,SAAS,GAAA,CAAI,GAAS,CAAA,EAAsB;AAC1C,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAC5C,EAAA,OAAO,YAAA,CAAa,MAAA,CAAO,CAAA,CAAE,CAAA,CAAE,MAAM,CAAA;AACvC;AAEA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAC5C,EAAA,OAAO,YAAA,CAAa,IAAA,CAAK,CAAA,CAAE,CAAA,CAAE,aAAa,CAAA;AAC5C;AAEA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAC5C,EAAA,OAAO,YAAA,CAAa,IAAA,CAAK,CAAA,CAAE,CAAA,CAAE,aAAa,CAAA;AAC5C;AAEA,SAAS,MAAA,CAAO,GAAS,CAAA,EAAsB;AAC7C,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAC5C,EAAA,IAAI,UAAA,GAAa,IAAA;AACjB,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,MAAW,EAAA,IAAM,EAAE,CAAA,EAAG;AACpB,IAAA,MAAA,IAAU,UAAA,GAAa,EAAA,CAAG,WAAA,EAAY,GAAI,GAAG,WAAA,EAAY;AACzD,IAAA,UAAA,GAAa,CAAC,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA;AAAA,EAClC;AACA,EAAA,OAAO,YAAA,CAAa,KAAK,MAAM,CAAA;AACjC;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAE5C,EAAA,OAAO,YAAA,CAAa,KAAK,CAAA,CAAE,CAAA,CAAE,MAAK,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAC,CAAA;AAC1D;AAEA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAC5C,EAAA,OAAO,aAAa,IAAA,CAAK,CAAC,GAAG,CAAA,CAAE,CAAC,CAAA,CAAE,MAAA,CAAO,CAAA,EAAA,KAAM,EAAA,CAAG,WAAW,CAAC,CAAA,IAAK,EAAE,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA;AACjF;AAEA,SAAS,UAAA,CAAW,GAAS,CAAA,EAAsB;AACjD,EAAA,MAAM,CAAA,GAAM,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAC9C,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,GAAA,CAAI,CAAA;AAClD,EAAA,MAAM,EAAA,GAAM,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,CAAA;AAEhD,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAChB,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,IAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,CAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,CAAC,CAAA;AAC5B,IAAA,IAAIA,MAAAA,GAAQ,CAAA,EAAG,GAAA,GAAM,CAAA,EAAG,MAAA,GAAS,EAAA;AACjC,IAAA,OAAO,GAAA,GAAM,CAAA,CAAE,CAAA,CAAE,MAAA,EAAQ;AACvB,MAAA,MAAM,MAAM,CAAA,CAAE,CAAA,CAAE,OAAA,CAAQ,GAAA,CAAI,GAAG,GAAG,CAAA;AAClC,MAAA,IAAI,MAAM,CAAA,EAAG;AAAE,QAAA,MAAA,IAAU,CAAA,CAAE,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA;AAAG,QAAA;AAAA,MAAO;AAChD,MAAAA,MAAAA,EAAAA;AACA,MAAA,IAAIA,WAAU,IAAA,EAAM;AAClB,QAAA,MAAA,IAAU,EAAE,CAAA,CAAE,KAAA,CAAM,GAAA,EAAK,GAAG,IAAI,EAAA,CAAG,CAAA;AACnC,QAAA,GAAA,GAAM,GAAA,GAAM,IAAI,CAAA,CAAE,MAAA;AAClB,QAAA,MAAA,IAAU,CAAA,CAAE,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA;AACvB,QAAA;AAAA,MACF;AACA,MAAA,MAAA,IAAU,EAAE,CAAA,CAAE,KAAA,CAAM,KAAK,GAAA,GAAM,GAAA,CAAI,EAAE,MAAM,CAAA;AAC3C,MAAA,GAAA,GAAM,GAAA,GAAM,IAAI,CAAA,CAAE,MAAA;AAAA,IACpB;AACA,IAAA,OAAO,YAAA,CAAa,KAAK,MAAM,CAAA;AAAA,EACjC;AAEA,EAAA,OAAO,YAAA,CAAa,IAAA,CAAK,CAAA,CAAE,CAAA,CAAE,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,CAAE,IAAA,CAAK,EAAA,CAAG,CAAC,CAAC,CAAA;AACtD;AAEA,SAAS,OAAA,CAAQ,GAAS,CAAA,EAAsB;AAC9C,EAAA,MAAM,CAAA,GAAK,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAC7C,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,CAAA;AAC/C,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,CAAA;AAC/C,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,CAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,EAAA,CAAG,CAAC,CAAA,GAAI,CAAC,CAAA;AAC9C,EAAA,MAAMA,MAAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,EAAA,CAAG,CAAC,CAAC,CAAA;AAC1C,EAAA,OAAO,YAAA,CAAa,IAAA,CAAK,CAAA,CAAE,CAAA,CAAE,MAAM,CAAA,EAAG,KAAK,CAAA,GAAI,EAAA,CAAG,IAAI,CAAA,CAAE,CAAA,CAAE,KAAA,CAAM,KAAA,GAAQA,MAAK,CAAC,CAAA;AAChF;AAEA,SAAS,WAAA,CAAY,GAAS,CAAA,EAAsB;AAClD,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,MAAWN,QAAO,CAAA,EAAG;AACnB,IAAA,MAAM,CAAA,GAAIA,IAAAA,CAAI,QAAA,CAAS,CAAC,CAAA;AACxB,IAAA,IAAI,CAAA,CAAE,SAAS,OAAO,CAAA;AACtB,IAAA,MAAA,IAAU,EAAE,MAAA,EAAO;AAAA,EACrB;AACA,EAAA,OAAO,YAAA,CAAa,KAAK,MAAM,CAAA;AACjC;AAEA,SAAS,QAAA,CAAS,GAAS,CAAA,EAAsB;AAC/C,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,KAAA,CAAM,EAAA,EAAI,OAAO,KAAA,CAAM,CAAA;AACxD,EAAA,MAAM,IAAA,GAAQ,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC9B,EAAA,IAAI,IAAA,CAAK,SAAS,OAAO,IAAA;AACzB,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,YAAA,EAAa,CAAE,YAAA;AACxC,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC1B,IAAA,IAAI,CAAA,CAAE,SAAS,OAAO,CAAA;AACtB,IAAA,IAAI,EAAE,OAAA,EAAS;AACb,MAAA,KAAA,MAAW,IAAA,IAAQ,CAAA,CAAE,QAAA,CAAS,MAAA,EAAO,EAAG;AACtC,QAAA,MAAM,CAAA,GAAI,KAAK,MAAA,EAAO;AACtB,QAAA,IAAI,CAAC,WAAA,IAAe,CAAA,KAAM,EAAA,EAAI,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,MAC5C;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,CAAA,GAAI,EAAE,MAAA,EAAO;AACnB,MAAA,IAAI,CAAC,WAAA,IAAe,CAAA,KAAM,EAAA,EAAI,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IAC5C;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACjC,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,KAAA,EAAO,OAAO,YAAA,CAAa,UAAA;AAC/C,EAAA,OAAO,YAAA,CAAa,KAAK,MAAM,CAAA;AACjC;AAEA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAE5C,EAAA,IAAI;AACF,IAAA,OAAO,aAAa,IAAA,CAAK,YAAA,CAAa,EAAE,KAAA,EAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,EACrD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,YAAA,CAAa,UAAA;AAAA,EACtB;AACF;AAEA,SAAS,YAAA,CAAaZ,QAAe,GAAA,EAAqB;AAExD,EAAA,IAAI,QAAQ,GAAA,EAAK,OAAO,OAAO,IAAA,CAAK,KAAA,CAAMA,MAAK,CAAC,CAAA;AAChD,EAAA,IAAI,GAAA,KAAQ,MAAA,EAAQ,OAAOA,MAAAA,CAAM,QAAQ,CAAC,CAAA;AAC1C,EAAA,IAAI,GAAA,KAAQ,SAAS,OAAO,IAAA,CAAK,MAAMA,MAAK,CAAA,CAAE,eAAe,OAAO,CAAA;AACpE,EAAA,IAAI,GAAA,KAAQ,UAAA,EAAY,OAAOA,MAAAA,CAAM,cAAA,CAAe,OAAA,EAAS,EAAE,qBAAA,EAAuB,CAAA,EAAG,qBAAA,EAAuB,CAAA,EAAG,CAAA;AACnH,EAAA,IAAI,GAAA,KAAQ,MAAM,OAAO,CAAA,EAAG,KAAK,KAAA,CAAMA,MAAAA,GAAQ,GAAG,CAAC,CAAA,CAAA,CAAA;AACnD,EAAA,IAAI,GAAA,KAAQ,SAAS,OAAO,CAAA,EAAA,CAAIA,SAAQ,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAEvD,EAAA,IAAI,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA,EAAG;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,WAAWA,MAAK,CAAA;AAC7B,MAAA,OAAO,KAAK,kBAAA,EAAmB;AAAA,IACjC,CAAA,CAAA,MAAQ;AAAA,IAAqB;AAAA,EAC/B;AACA,EAAA,OAAO,OAAOA,MAAK,CAAA;AACrB;AAEA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAC5C,EAAA,MAAM,CAAA,GAAI,UAAA,CAAW,CAAA,CAAE,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,CAAC,CAAA,KAAM;AAAE,IAAA,OAAO,IAAI,MAAA,CAAO,UAAA,CAAW,EAAE,CAAC,CAAA,GAAI,GAAG,CAAA,GAAI,EAAA;AAAA,EAAI,CAAC,CAAC,CAAA;AACnH,EAAA,IAAI,KAAA,CAAM,CAAC,CAAA,EAAG,OAAO,YAAA,CAAa,UAAA;AAClC,EAAA,OAAO,YAAA,CAAa,OAAO,CAAC,CAAA;AAC9B;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAM,MAAA,GAAW,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,MAAA,CAAO,EAAA,EAAI,OAAO,MAAA,CAAO,CAAA;AAC7D,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,QAAA,CAAS,CAAA;AACjE,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAAE,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,IAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAAG,IAAA,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA;AAAA,EAAG;AAChG,EAAA,MAAM,MAAM,QAAA,CAAS,CAAA,CAAE,OAAA,CAAQ,MAAA,CAAO,GAAG,KAAK,CAAA;AAC9C,EAAA,OAAO,MAAM,CAAA,GAAI,YAAA,CAAa,aAAa,YAAA,CAAa,MAAA,CAAO,MAAM,CAAC,CAAA;AACxE;AAEA,SAAS,MAAA,CAAO,GAAS,CAAA,EAAsB;AAC7C,EAAA,MAAM,MAAA,GAAW,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,MAAA,CAAO,EAAA,EAAI,OAAO,MAAA,CAAO,CAAA;AAC7D,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,QAAA,CAAS,CAAA;AACjE,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAAE,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,IAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAAG,IAAA,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA;AAAA,EAAG;AAChG,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,CAAA,CAAE,WAAA,EAAY,CAAE,QAAQ,MAAA,CAAO,CAAA,CAAE,WAAA,EAAY,EAAG,KAAK,CAAA;AAC1E,EAAA,OAAO,MAAM,CAAA,GAAI,YAAA,CAAa,aAAa,YAAA,CAAa,MAAA,CAAO,MAAM,CAAC,CAAA;AACxE;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAC5C,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAC5C,EAAA,MAAMkB,MAAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAC,CAAA;AAC5B,EAAA,IAAIA,MAAAA,GAAQ,CAAA,EAAG,OAAO,YAAA,CAAa,UAAA;AACnC,EAAA,OAAO,aAAa,IAAA,CAAK,CAAA,CAAE,CAAA,CAAE,MAAA,CAAOA,MAAK,CAAC,CAAA;AAC5C;AAEA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,CAAA;AAC/C,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,CAAA;AAC/C,EAAA,OAAO,YAAA,CAAa,OAAA,CAAQ,EAAA,CAAG,CAAA,KAAM,GAAG,CAAC,CAAA;AAC3C;AAEA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAC5C,EAAA,MAAMC,KAAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAC,CAAA;AAC3B,EAAA,IAAIA,KAAAA,GAAO,CAAA,IAAKA,KAAAA,GAAO,GAAA,SAAY,YAAA,CAAa,UAAA;AAChD,EAAA,OAAO,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,YAAA,CAAaA,KAAI,CAAC,CAAA;AACpD;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAC5C,EAAA,IAAI,CAAA,CAAE,CAAA,CAAE,MAAA,KAAW,CAAA,SAAU,YAAA,CAAa,UAAA;AAC1C,EAAA,OAAO,aAAa,MAAA,CAAO,CAAA,CAAE,CAAA,CAAE,UAAA,CAAW,CAAC,CAAC,CAAA;AAC9C;AAEA,SAAS,EAAA,CAAG,GAAS,CAAA,EAAsB;AACzC,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC1B,EAAA,OAAO,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,YAAA,CAAa,WAAA;AACrC;AAKA,SAAS,UAAA,CAAW,GAAS,CAAA,EAAsB;AAAE,EAAA,OAAO,WAAA,CAAY,CAAA,EAAG,CAAA,EAAG,QAAQ,CAAA;AAAG;AACzF,SAAS,SAAA,CAAU,GAAS,CAAA,EAAsB;AAAE,EAAA,OAAO,WAAA,CAAY,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA;AAAG;AAEvF,SAAS,WAAA,CAAY,CAAA,EAAS,CAAA,EAAQC,KAAAA,EAAwC;AAC5E,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAC5C,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAC5C,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAAE,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,IAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAAG,IAAA,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAC,CAAA;AAAA,EAAG;AAC/F,EAAA,IAAI,QAAA,KAAa,CAAA,EAAG,OAAO,YAAA,CAAa,UAAA;AAExC,EAAA,MAAM,OAAO,CAAA,CAAE,CAAA;AACf,EAAA,MAAM,QAAQ,CAAA,CAAE,CAAA;AAEhB,EAAA,IAAI,UAAU,EAAA,EAAI;AAChB,IAAA,OAAO,YAAA,CAAa,IAAA,CAAKA,KAAAA,KAAS,QAAA,GAAW,KAAK,IAAI,CAAA;AAAA,EACxD;AAGA,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,WAAS;AACP,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA;AACpC,IAAA,IAAI,QAAQ,EAAA,EAAI;AAChB,IAAA,SAAA,CAAU,KAAK,GAAG,CAAA;AAClB,IAAA,IAAA,GAAO,MAAM,KAAA,CAAM,MAAA;AAAA,EACrB;AACA,EAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG,OAAO,YAAA,CAAa,OAAA;AAEhD,EAAA,MAAM,MAAM,QAAA,GAAW,CAAA,GAAI,QAAA,GAAW,CAAA,GAAI,UAAU,MAAA,GAAS,QAAA;AAC7D,EAAA,IAAI,MAAM,CAAA,IAAK,GAAA,IAAO,SAAA,CAAU,MAAA,SAAe,YAAA,CAAa,OAAA;AAE5D,EAAA,MAAM,GAAA,GAAM,UAAU,GAAG,CAAA;AACzB,EAAA,OAAO,YAAA,CAAa,IAAA;AAAA,IAClBA,KAAAA,KAAS,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,KAAA,CAAM,MAAM;AAAA,GACxE;AACF;;;ACjTO,SAAS,gBAAgB,CAAA,EAA2B;AACzD,EAAA,CAAA,CAAE,QAAA,CAAS,IAAA,EAAW,GAAA,EAAU,CAAA,EAAG,CAAC,CAAA;AACpC,EAAA,CAAA,CAAE,QAAA,CAAS,KAAA,EAAW,GAAA,EAAU,CAAC,CAAA;AACjC,EAAA,CAAA,CAAE,QAAA,CAAS,IAAA,EAAW,EAAA,EAAU,CAAC,CAAA;AACjC,EAAA,CAAA,CAAE,QAAA,CAAS,KAAA,EAAW,GAAA,EAAU,CAAA,EAAG,CAAC,CAAA;AACpC,EAAA,CAAA,CAAE,QAAA,CAAS,KAAA,EAAW,GAAA,EAAU,CAAC,CAAA;AACjC,EAAA,CAAA,CAAE,QAAA,CAAS,SAAA,EAAW,OAAA,EAAU,CAAA,EAAG,CAAC,CAAA;AACpC,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAW,IAAA,EAAU,CAAA,EAAG,CAAC,CAAA;AACpC,EAAA,CAAA,CAAE,QAAA,CAAS,KAAA,EAAW,GAAA,EAAU,CAAC,CAAA;AACjC,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAW,OAAA,EAAU,CAAC,CAAA;AACjC,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAW,MAAA,EAAU,CAAA,EAAG,CAAC,CAAA;AACpC,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAW,OAAA,EAAU,CAAA,EAAG,CAAC,CAAA;AACtC;AAEA,SAAS,GAAA,CAAI,GAAS,CAAA,EAAsB;AAC1C,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC7B,EAAA,IAAI,IAAA,CAAK,SAAS,OAAO,IAAA;AACzB,EAAA,MAAM,CAAA,GAAI,KAAK,YAAA,EAAa;AAC5B,EAAA,IAAI,CAAA,CAAE,SAAS,OAAO,CAAA;AACtB,EAAA,OAAO,EAAE,YAAA,GACL,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA,GAChB,CAAA,CAAE,MAAA,GAAS,IAAI,CAAA,CAAE,CAAC,EAAG,QAAA,CAAS,CAAC,IAAI,YAAA,CAAa,MAAA;AACtD;AAEA,SAAS,GAAA,CAAI,GAAS,CAAA,EAAsB;AAC1C,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,KAAA,MAAWR,QAAO,CAAA,EAAG;AACnB,IAAA,MAAM,CAAA,GAAIA,IAAAA,CAAI,QAAA,CAAS,CAAC,CAAA;AACxB,IAAA,IAAI,CAAA,CAAE,SAAS,OAAO,CAAA;AACtB,IAAA,IAAI,EAAE,OAAA,EAAS;AACb,MAAA,KAAA,MAAW,IAAA,IAAQ,CAAA,CAAE,QAAA,CAAS,MAAA,EAAO,EAAG;AACtC,QAAA,IAAI,KAAK,OAAA,EAAS;AAClB,QAAA,IAAI,IAAA,CAAK,SAAS,OAAO,IAAA;AACzB,QAAA,QAAA,GAAW,IAAA;AACX,QAAA,MAAM,EAAA,GAAK,KAAK,YAAA,EAAa;AAC7B,QAAA,IAAI,EAAA,CAAG,SAAS,OAAO,EAAA;AACvB,QAAA,IAAI,CAAC,EAAA,CAAG,YAAA,EAAc,OAAO,YAAA,CAAa,MAAA;AAAA,MAC5C;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAI,EAAE,OAAA,EAAS;AAAE,QAAA,QAAA,GAAW,IAAA;AAAM,QAAA;AAAA,MAAU;AAC5C,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,MAAM,EAAA,GAAK,EAAE,YAAA,EAAa;AAC1B,MAAA,IAAI,EAAA,CAAG,SAAS,OAAO,EAAA;AACvB,MAAA,IAAI,CAAC,EAAA,CAAG,YAAA,EAAc,OAAO,YAAA,CAAa,MAAA;AAAA,IAC5C;AAAA,EACF;AACA,EAAA,OAAO,QAAA,GAAW,YAAA,CAAa,KAAA,GAAQ,YAAA,CAAa,UAAA;AACtD;AAEA,SAAS,EAAA,CAAG,GAAS,CAAA,EAAsB;AACzC,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,KAAA,MAAWA,QAAO,CAAA,EAAG;AACnB,IAAA,MAAM,CAAA,GAAIA,IAAAA,CAAI,QAAA,CAAS,CAAC,CAAA;AACxB,IAAA,IAAI,CAAA,CAAE,SAAS,OAAO,CAAA;AACtB,IAAA,IAAI,EAAE,OAAA,EAAS;AACb,MAAA,KAAA,MAAW,IAAA,IAAQ,CAAA,CAAE,QAAA,CAAS,MAAA,EAAO,EAAG;AACtC,QAAA,IAAI,KAAK,OAAA,EAAS;AAClB,QAAA,IAAI,IAAA,CAAK,SAAS,OAAO,IAAA;AACzB,QAAA,QAAA,GAAW,IAAA;AACX,QAAA,MAAM,EAAA,GAAK,KAAK,YAAA,EAAa;AAC7B,QAAA,IAAI,EAAA,CAAG,SAAS,OAAO,EAAA;AACvB,QAAA,IAAI,EAAA,CAAG,YAAA,EAAc,OAAO,YAAA,CAAa,KAAA;AAAA,MAC3C;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAI,EAAE,OAAA,EAAS;AAAE,QAAA,QAAA,GAAW,IAAA;AAAM,QAAA;AAAA,MAAU;AAC5C,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,MAAM,EAAA,GAAK,EAAE,YAAA,EAAa;AAC1B,MAAA,IAAI,EAAA,CAAG,SAAS,OAAO,EAAA;AACvB,MAAA,IAAI,EAAA,CAAG,YAAA,EAAc,OAAO,YAAA,CAAa,KAAA;AAAA,IAC3C;AAAA,EACF;AACA,EAAA,OAAO,QAAA,GAAW,YAAA,CAAa,MAAA,GAAS,YAAA,CAAa,UAAA;AACvD;AAEA,SAAS,GAAA,CAAI,GAAS,CAAA,EAAsB;AAC1C,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC1B,EAAA,IAAI,CAAA,CAAE,SAAS,OAAO,CAAA;AACtB,EAAA,MAAM,EAAA,GAAK,EAAE,YAAA,EAAa;AAC1B,EAAA,IAAI,EAAA,CAAG,SAAS,OAAO,EAAA;AACvB,EAAA,OAAO,YAAA,CAAa,OAAA,CAAQ,CAAC,EAAA,CAAG,YAAY,CAAA;AAC9C;AAEA,SAAS,GAAA,CAAI,GAAS,CAAA,EAAsB;AAC1C,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,KAAA,MAAWA,QAAO,CAAA,EAAG;AACnB,IAAA,MAAM,CAAA,GAAIA,IAAAA,CAAI,QAAA,CAAS,CAAC,CAAA;AACxB,IAAA,IAAI,CAAA,CAAE,SAAS,OAAO,CAAA;AACtB,IAAA,MAAM,EAAA,GAAK,EAAE,YAAA,EAAa;AAC1B,IAAA,IAAI,EAAA,CAAG,SAAS,OAAO,EAAA;AACvB,IAAA,IAAI,GAAG,YAAA,EAAc,SAAA,EAAA;AAAA,EACvB;AACA,EAAA,OAAO,YAAA,CAAa,OAAA,CAAQ,SAAA,GAAY,CAAA,KAAM,CAAC,CAAA;AACjD;AAEA,SAAS,OAAA,CAAQ,GAAS,CAAA,EAAsB;AAC9C,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC1B,EAAA,OAAO,EAAE,OAAA,GAAU,CAAA,CAAE,CAAC,CAAA,CAAG,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA;AACzC;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC1B,EAAA,OAAO,CAAA,CAAE,WAAW,CAAA,CAAE,SAAA,KAAA,CAAA,YAAgC,EAAE,CAAC,CAAA,CAAG,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA;AAC5E;AAEA,SAAS,GAAA,CAAI,GAAS,CAAA,EAAsB;AAC1C,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAI,CAAA,CAAE,MAAA,EAAQ,KAAK,CAAA,EAAG;AACxC,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC7B,IAAA,IAAI,IAAA,CAAK,SAAS,OAAO,IAAA;AACzB,IAAA,MAAM,EAAA,GAAK,KAAK,YAAA,EAAa;AAC7B,IAAA,IAAI,EAAA,CAAG,SAAS,OAAO,EAAA;AACvB,IAAA,IAAI,EAAA,CAAG,cAAc,OAAO,CAAA,CAAE,IAAI,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAA,EAClD;AACA,EAAA,OAAO,YAAA,CAAa,OAAA;AACtB;AAEA,SAAS,OAAA,CAAQ,GAAS,CAAA,EAAsB;AAC9C,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC7B,EAAA,IAAI,IAAA,CAAK,SAAS,OAAO,IAAA;AACzB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAI,CAAA,CAAE,MAAA,EAAQ,KAAK,CAAA,EAAG;AACxC,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC3B,IAAA,IAAI,EAAA,CAAG,SAAS,OAAO,EAAA;AACvB,IAAA,IAAI,YAAA,CAAa,QAAA,CAAS,IAAA,EAAM,EAAE,CAAA,EAAG,OAAO,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,CAAG,QAAA,CAAS,CAAC,CAAA;AAAA,EAClE;AAEA,EAAA,OAAO,CAAA,CAAE,MAAA,GAAS,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CAAG,QAAA,CAAS,CAAC,CAAA,GAAI,YAAA,CAAa,OAAA;AAC1E;AAEA,SAAS,MAAA,GAAwB;AAAE,EAAA,OAAO,YAAA,CAAa,KAAA;AAAO;AAC9D,SAAS,OAAA,GAAwB;AAAE,EAAA,OAAO,YAAA,CAAa,MAAA;AAAQ;;;AC/H/D,IAAM,WAAA,GAAc,KAAK,GAAA,CAAI,IAAA,EAAM,IAAI,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACrD,IAAM,UAAA,GAAc,KAAA;AAEpB,SAAS,KAAK,IAAA,EAAoB;AAChC,EAAA,OAAA,CAAQ,IAAA,CAAK,GAAA;AAAA,IAAI,KAAK,WAAA,EAAY;AAAA,IAAG,KAAK,QAAA,EAAS;AAAA,IAAG,KAAK,OAAA,EAAQ;AAAA,IACjE,KAAK,QAAA,EAAS;AAAA,IAAG,KAAK,UAAA,EAAW;AAAA,IAAG,KAAK,UAAA;AAAW,MAAK,WAAA,IAAe,UAAA;AAC5E;AAEA,SAAS,OAAO,EAAA,EAAkB;AAChC,EAAA,MAAM,EAAA,GAAK,cAAc,EAAA,GAAK,UAAA;AAC9B,EAAA,MAAM,CAAA,GAAK,IAAI,IAAA,CAAK,EAAE,CAAA;AACtB,EAAA,OAAO,IAAI,IAAA;AAAA,IAAK,EAAE,cAAA,EAAe;AAAA,IAAG,EAAE,WAAA,EAAY;AAAA,IAAG,EAAE,UAAA,EAAW;AAAA,IAChE,EAAE,WAAA,EAAY;AAAA,IAAG,EAAE,aAAA,EAAc;AAAA,IAAG,EAAE,aAAA;AAAc,GAAC;AACzD;AAEO,SAAS,aAAa,CAAA,EAA2B;AACtD,EAAA,CAAA,CAAE,QAAA,CAAS,KAAA,EAAgB,GAAA,EAAa,CAAA,EAAG,GAAG,IAAI,CAAA;AAClD,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAgB,KAAA,EAAa,CAAA,EAAG,GAAG,IAAI,CAAA;AAClD,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAgB,KAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC5C,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAgB,IAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC5C,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAgB,KAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC5C,EAAA,CAAA,CAAE,QAAA,CAAS,KAAA,EAAgB,GAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC5C,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAgB,IAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC5C,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAgB,MAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC5C,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAgB,MAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC5C,EAAA,CAAA,CAAE,QAAA,CAAS,WAAA,EAAgB,SAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC5C,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAgB,IAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC5C,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAgB,KAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC5C,EAAA,CAAA,CAAE,QAAA,CAAS,SAAA,EAAgB,OAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC5C,EAAA,CAAA,CAAE,QAAA,CAAS,SAAA,EAAgB,OAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC5C,EAAA,CAAA,CAAE,QAAA,CAAS,SAAA,EAAgB,OAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC5C,EAAA,CAAA,CAAE,QAAA,CAAS,aAAA,EAAgB,WAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC5C,EAAA,CAAA,CAAE,QAAA,CAAS,SAAA,EAAgB,OAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAC9C;AAEA,SAAS,QAAA,CAAS,CAAA,EAAS,CAAA,EAAQ,GAAA,EAA4E;AAC7G,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,GAAG,GAAI,CAAC,CAAA;AAC7C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA;AAClB,EAAA,IAAI;AACF,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAM,MAAA,CAAO,CAAA,CAAE,KAAK,CAAA,EAAE;AAAA,EAC3C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,aAAa,UAAA,EAAW;AAAA,EACrD;AACF;AAEA,SAAS,GAAA,GAAsB;AAAE,EAAA,OAAO,aAAa,MAAA,CAAO,IAAA,iBAAK,IAAI,IAAA,EAAM,CAAC,CAAA;AAAG;AAC/E,SAAS,KAAA,GAAsB;AAAE,EAAA,MAAM,CAAA,uBAAQ,IAAA,EAAK;AAAG,EAAA,OAAO,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,IAAI,KAAK,CAAA,CAAE,WAAA,EAAY,EAAG,CAAA,CAAE,UAAS,EAAG,CAAA,CAAE,OAAA,EAAS,CAAC,CAAC,CAAA;AAAG;AAE/I,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AAClE,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AAClE,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AAClE,EAAA,IAAI;AAAE,IAAA,OAAO,YAAA,CAAa,OAAO,IAAA,CAAK,IAAI,KAAK,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAK,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,CAAE,KAAK,IAAI,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,CAAE,KAAK,CAAC,CAAC,CAAC,CAAA;AAAA,EAAG,CAAA,CAAA,MAC/G;AAAE,IAAA,OAAO,YAAA,CAAa,UAAA;AAAA,EAAY;AAC1C;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,OAAO,CAAA,CAAE,KAAK,YAAA,CAAa,MAAA,CAAO,EAAE,IAAA,CAAK,WAAA,EAAa,CAAA,GAAI,CAAA,CAAE,KAAA;AAC3F;AACA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,OAAO,CAAA,CAAE,EAAA,GAAK,YAAA,CAAa,MAAA,CAAO,CAAA,CAAE,KAAK,QAAA,EAAS,GAAI,CAAC,CAAA,GAAI,CAAA,CAAE,KAAA;AAC5F;AACA,SAAS,GAAA,CAAI,GAAS,CAAA,EAAsB;AAC1C,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,OAAO,CAAA,CAAE,KAAK,YAAA,CAAa,MAAA,CAAO,EAAE,IAAA,CAAK,OAAA,EAAS,CAAA,GAAI,CAAA,CAAE,KAAA;AACvF;AACA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,OAAO,CAAA,CAAE,KAAK,YAAA,CAAa,MAAA,CAAO,EAAE,IAAA,CAAK,QAAA,EAAU,CAAA,GAAI,CAAA,CAAE,KAAA;AACxF;AACA,SAAS,MAAA,CAAO,GAAS,CAAA,EAAsB;AAC7C,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,OAAO,CAAA,CAAE,KAAK,YAAA,CAAa,MAAA,CAAO,EAAE,IAAA,CAAK,UAAA,EAAY,CAAA,GAAI,CAAA,CAAE,KAAA;AAC1F;AACA,SAAS,MAAA,CAAO,GAAS,CAAA,EAAsB;AAC7C,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,OAAO,CAAA,CAAE,KAAK,YAAA,CAAa,MAAA,CAAO,EAAE,IAAA,CAAK,UAAA,EAAY,CAAA,GAAI,CAAA,CAAE,KAAA;AAC1F;AAEA,SAAS,SAAA,CAAU,GAAS,CAAA,EAAsB;AAChD,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AAClE,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,CAAA,CAAE,KAAK,CAAA;AAC1B,EAAA,IAAI,MAAM,CAAA,CAAE,OAAA,EAAS,CAAA,SAAU,YAAA,CAAa,UAAA;AAC5C,EAAA,OAAO,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAA;AACpC;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAM,EAAA,GAAK,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,KAAA;AACpD,EAAA,MAAM,EAAA,GAAK,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,KAAA;AACpD,EAAA,OAAO,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,KAAA,CAAA,CAAO,EAAA,CAAG,IAAA,CAAK,OAAA,EAAQ,GAAI,EAAA,CAAG,IAAA,CAAK,OAAA,EAAQ,IAAK,UAAU,CAAC,CAAA;AAC7F;AAEA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACjD,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AAClE,EAAA,MAAM,SAAS,IAAI,IAAA,CAAK,EAAE,IAAA,CAAK,WAAA,IAAe,CAAA,CAAE,IAAA,CAAK,UAAS,GAAI,IAAA,CAAK,MAAM,CAAA,CAAE,KAAK,GAAG,CAAA,CAAE,IAAA,CAAK,SAAS,CAAA;AACvG,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,OAAA,EAAS,CAAA,GAAI,YAAA,CAAa,QAAA,GAAW,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAC3F;AAEA,SAAS,OAAA,CAAQ,GAAS,CAAA,EAAsB;AAC9C,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACjD,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AAClE,EAAA,MAAM,SAAS,IAAI,IAAA,CAAK,CAAA,CAAE,IAAA,CAAK,aAAY,EAAG,CAAA,CAAE,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,KAAA,CAAM,EAAE,KAAK,CAAA,GAAI,GAAG,CAAC,CAAA;AAC5F,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,OAAA,EAAS,CAAA,GAAI,YAAA,CAAa,QAAA,GAAW,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAC3F;AAEA,SAAS,OAAA,CAAQ,GAAS,CAAA,EAAsB;AAC9C,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACjD,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAAE,IAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,IAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AAAO,IAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAK,CAAA;AAAA,EAAG;AACzH,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,IAAA,CAAK,MAAA,EAAO;AAC1B,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,CAAA;AAAG,MAAA,OAAO,aAAa,MAAA,CAAO,GAAA,KAAQ,CAAA,GAAI,CAAA,GAAI,MAAM,CAAC,CAAA;AAAA;AAAA,IAC1D,KAAK,CAAA;AAAG,MAAA,OAAO,YAAA,CAAa,MAAA,CAAO,GAAA,KAAQ,CAAA,GAAI,IAAI,GAAG,CAAA;AAAA;AAAA,IACtD,KAAK,CAAA;AAAG,MAAA,OAAO,aAAa,MAAA,CAAO,GAAA,KAAQ,CAAA,GAAI,CAAA,GAAI,MAAM,CAAC,CAAA;AAAA;AAAA,IAC1D;AAAS,MAAA,OAAO,YAAA,CAAa,QAAA;AAAA;AAEjC;AAEA,SAAS,OAAA,CAAQ,GAAS,CAAA,EAAsB;AAC9C,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACjD,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAA,CAAE,KAAK,WAAA,EAAY,EAAG,GAAG,CAAC,CAAA;AAChD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAA,CAAO,CAAA,CAAE,IAAA,CAAK,SAAQ,GAAI,IAAA,CAAK,OAAA,EAAQ,IAAK,UAAU,CAAA;AACzE,EAAA,OAAO,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,IAAA,CAAA,CAAM,KAAA,GAAQ,KAAK,MAAA,EAAO,GAAI,CAAA,IAAK,CAAC,CAAC,CAAA;AACvE;AAEA,SAAS,WAAA,CAAY,GAAS,CAAA,EAAsB;AAClD,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,KAAA,CAAM,EAAA,EAAI,OAAO,KAAA,CAAM,KAAA;AAC7D,EAAA,MAAM,GAAA,GAAQ,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAM,OAAO,GAAA,CAAI,KAAA;AAE3D,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAChB,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC3B,IAAA,IAAI,EAAA,CAAG,SAAS,OAAO,EAAA;AACvB,IAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,OAAA,GAAU,CAAC,GAAG,EAAA,CAAG,QAAA,CAAS,MAAA,EAAQ,CAAA,GAAI,CAAC,EAAE,CAAA;AAC1D,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,KAAK,OAAA,EAAS;AAClB,MAAA,MAAM,CAAA,GAAI,KAAK,WAAA,EAAY;AAC3B,MAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,YAAA,CAAa,UAAA;AAC/B,MAAA,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IAClC;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,IAAQ,GAAA,CAAI,OAAO,CAAA,GAAI,EAAA;AACzC,EAAA,IAAIM,MAAAA,GAAQ,CAAA;AACZ,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAE/B,EAAA,OAAO,MAAM,CAAA,GAAI,GAAA,IAAO,IAAI,IAAA,GAAO,GAAA,IAAO,IAAI,IAAA,EAAM;AAClD,IAAA,MAAM,GAAA,GAAM,IAAI,MAAA,EAAO;AACvB,IAAA,MAAM,EAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA;AAChC,IAAA,IAAI,GAAA,KAAQ,KAAK,GAAA,KAAQ,CAAA,IAAK,CAAC,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAGA,MAAAA,EAAAA;AACjD,IAAA,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,OAAA,EAAQ,GAAI,GAAG,CAAA;AAAA,EACjC;AAEA,EAAA,OAAO,YAAA,CAAa,MAAA,CAAOA,MAAAA,GAAQ,GAAG,CAAA;AACxC;AAEA,SAAS,OAAA,CAAQ,GAAS,CAAA,EAAsB;AAC9C,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,KAAA,CAAM,EAAA,EAAI,OAAO,KAAA,CAAM,KAAA;AAC7D,EAAA,MAAM,GAAA,GAAQ,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAM,OAAO,GAAA,CAAI,KAAA;AAC3D,EAAA,MAAM,OAAQ,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA,CAAK,KAAA;AAE5E,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,EAAM,CAAA,GAAI,GAAA,CAAI,IAAA;AAC9B,EAAA,IAAI,CAAA,GAAI,CAAA,EAAG,OAAO,YAAA,CAAa,QAAA;AAE/B,EAAA,QAAQ,IAAA,CAAK,KAAA,CAAM,WAAA,EAAY;AAAG,IAChC,KAAK,GAAA;AACH,MAAA,OAAO,YAAA,CAAa,MAAA,CAAO,CAAA,CAAE,WAAA,EAAY,GAAI,CAAA,CAAE,WAAA,EAAY,IACxD,CAAA,CAAE,QAAA,EAAS,GAAI,CAAA,CAAE,QAAA,EAAS,IAAM,CAAA,CAAE,QAAA,EAAS,KAAM,CAAA,CAAE,QAAA,EAAS,IAAK,CAAA,CAAE,OAAA,EAAQ,GAAI,CAAA,CAAE,OAAA,EAAQ,GAAK,CAAA,GAAI,CAAA,CAAE,CAAA;AAAA,IACzG,KAAK,GAAA;AACH,MAAA,OAAO,YAAA,CAAa,QAAQ,CAAA,CAAE,WAAA,KAAgB,CAAA,CAAE,WAAA,EAAY,IAAK,EAAA,GAAK,CAAA,CAAE,QAAA,KAAa,CAAA,CAAE,QAAA,MACpF,CAAA,CAAE,OAAA,KAAY,CAAA,CAAE,OAAA,EAAQ,GAAI,CAAA,GAAI,CAAA,CAAE,CAAA;AAAA,IACvC,KAAK,GAAA;AACH,MAAA,OAAO,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,KAAA,CAAA,CAAO,CAAA,CAAE,OAAA,EAAQ,GAAI,CAAA,CAAE,OAAA,EAAQ,IAAK,UAAU,CAAC,CAAA;AAAA,IACjF,KAAK,IAAA;AACH,MAAA,OAAO,YAAA,CAAa,MAAA,CAAO,CAAA,CAAE,OAAA,MAAa,CAAA,CAAE,OAAA,EAAQ,GAChD,CAAA,CAAE,OAAA,EAAQ,GAAI,CAAA,CAAE,OAAA,KAChB,IAAI,IAAA,CAAK,CAAA,CAAE,WAAA,EAAY,EAAG,CAAA,CAAE,QAAA,EAAS,GAAI,GAAG,CAAC,CAAA,CAAE,OAAA,EAAQ,GAAI,CAAA,CAAE,OAAA,EAAQ,GAAI,CAAA,CAAE,SAAS,CAAA;AAAA,IAC1F,KAAK,IAAA;AACH,MAAA,OAAO,aAAa,MAAA,CAAA,CAAQ,CAAA,CAAE,QAAA,EAAS,GAAI,EAAE,QAAA,EAAS,GAAI,EAAA,IAAM,EAAA,IAAM,EAAE,OAAA,EAAQ,GAAI,EAAE,OAAA,EAAQ,GAAI,IAAI,CAAA,CAAE,CAAA;AAAA,IAC1G,KAAK,IAAA,EAAM;AACT,MAAA,MAAM,WAAA,GAAc,IAAI,IAAA,CAAK,CAAA,CAAE,WAAA,EAAY,EAAG,CAAA,CAAE,QAAA,EAAS,EAAG,CAAA,CAAE,OAAA,EAAS,CAAA;AACvE,MAAA,OAAO,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,KAAA,CAAA,CAAO,CAAA,CAAE,OAAA,EAAQ,GAAI,WAAA,CAAY,OAAA,EAAQ,IAAK,UAAU,CAAC,CAAA;AAAA,IAC3F;AAAA,IACA;AAAS,MAAA,OAAO,YAAA,CAAa,QAAA;AAAA;AAEjC;ACrLO,SAAS,eAAe,CAAA,EAA2B;AACxD,EAAA,CAAA,CAAE,QAAA,CAAS,SAAA,EAAY,OAAA,EAAU,CAAA,EAAG,CAAC,CAAA;AACrC,EAAA,CAAA,CAAE,QAAA,CAAS,SAAA,EAAY,OAAA,EAAU,CAAA,EAAG,CAAC,CAAA;AACrC,EAAA,CAAA,CAAE,QAAA,CAAS,SAAA,EAAY,OAAA,EAAU,CAAA,EAAG,CAAC,CAAA;AACrC,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAY,MAAA,EAAU,CAAA,EAAG,CAAC,CAAA;AACrC,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAY,MAAA,EAAU,CAAA,EAAG,CAAC,CAAA;AACrC,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAY,KAAA,EAAU,CAAA,EAAG,CAAC,CAAA;AACrC,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAY,MAAA,EAAU,CAAA,EAAG,CAAC,CAAA;AACrC,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAY,MAAA,EAAU,CAAC,CAAA;AAClC,EAAA,CAAA,CAAE,QAAA,CAAS,SAAA,EAAY,OAAA,EAAU,CAAA,EAAG,CAAC,CAAA;AACrC,EAAA,CAAA,CAAE,QAAA,CAAS,KAAA,EAAY,GAAA,EAAU,CAAA,EAAG,CAAC,CAAA;AACrC,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAY,MAAA,EAAU,CAAA,EAAG,CAAC,CAAA;AACrC,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAY,IAAA,EAAU,CAAA,EAAG,CAAC,CAAA;AACrC,EAAA,CAAA,CAAE,QAAA,CAAS,SAAA,EAAY,OAAA,EAAU,CAAA,EAAG,CAAC,CAAA;AACrC,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAY,MAAA,EAAU,CAAA,EAAG,GAAG,IAAI,CAAA;AAC3C,EAAA,CAAA,CAAE,QAAA,CAAS,UAAA,EAAY,QAAA,EAAU,CAAA,EAAG,GAAG,IAAI,CAAA;AAC7C;AAIA,SAASnB,IAAAA,CAAI,CAAA,EAAS,CAAA,EAAQ,CAAA,EAAqE;AACjG,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,OAAO,CAAA,CAAE,EAAA,GAAK,EAAE,EAAA,EAAI,MAAM,CAAA,EAAG,CAAA,CAAE,KAAA,EAAM,GAAI,EAAE,EAAA,EAAI,KAAA,EAAO,CAAA,EAAG,EAAE,KAAA,EAAM;AACnE;AAIA,SAAS,OAAA,CAAQ,GAAS,CAAA,EAAsB;AAC9C,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,SAAA,CAAU,SAAS,OAAO,SAAA;AACnE,EAAA,MAAM,QAAA,GAAY,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,QAAA,CAAS,SAAU,OAAO,QAAA;AACnE,EAAA,IAAI,CAAC,QAAA,CAAS,OAAA,EAAS,OAAO,YAAA,CAAa,QAAA;AAC3C,EAAA,MAAM,EAAA,GAAKA,IAAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,CAAA;AAC/C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA;AAElC,EAAA,IAAI,UAAA,GAAa,IAAA;AACjB,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAChB,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC3B,IAAA,IAAI,EAAA,CAAG,SAAS,OAAO,EAAA;AACvB,IAAA,UAAA,GAAa,CAAC,EAAA,CAAG,YAAA,EAAa,CAAE,YAAA;AAAA,EAClC;AAEA,EAAA,MAAM,MAAM,QAAA,CAAS,QAAA;AACrB,EAAA,IAAI,SAAS,CAAA,IAAK,MAAA,IAAU,GAAA,CAAI,OAAA,SAAgB,YAAA,CAAa,QAAA;AAE7D,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAM,CAAA,EAAA,EAAK;AACjC,MAAA,IAAI,YAAA,CAAa,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,EAAG,SAAS,CAAA,EAAG,OAAO,GAAA,CAAI,GAAA,CAAI,GAAG,MAAM,CAAA;AAAA,IAC/E;AACA,IAAA,OAAO,YAAA,CAAa,OAAA;AAAA,EACtB;AAGA,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAM,CAAA,EAAA,EAAK;AACjC,IAAA,IAAI,YAAA,CAAa,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,EAAG,SAAS,CAAA,IAAK,CAAA,EAAG,IAAA,GAAO,CAAA;AAAA,SAAQ;AAAA,EAC1E;AACA,EAAA,OAAO,QAAQ,CAAA,GAAI,GAAA,CAAI,IAAI,IAAA,EAAM,MAAM,IAAI,YAAA,CAAa,OAAA;AAC1D;AAEA,SAAS,OAAA,CAAQ,GAAS,CAAA,EAAsB;AAC9C,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,SAAA,CAAU,SAAS,OAAO,SAAA;AACnE,EAAA,MAAM,QAAA,GAAY,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,QAAA,CAAS,SAAU,OAAO,QAAA;AACnE,EAAA,IAAI,CAAC,QAAA,CAAS,OAAA,EAAS,OAAO,YAAA,CAAa,QAAA;AAC3C,EAAA,MAAM,EAAA,GAAKA,IAAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,CAAA;AAC/C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA;AAElC,EAAA,IAAI,UAAA,GAAa,IAAA;AACjB,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAChB,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC3B,IAAA,IAAI,EAAA,CAAG,SAAS,OAAO,EAAA;AACvB,IAAA,UAAA,GAAa,CAAC,EAAA,CAAG,YAAA,EAAa,CAAE,YAAA;AAAA,EAClC;AAEA,EAAA,MAAM,MAAM,QAAA,CAAS,QAAA;AACrB,EAAA,IAAI,SAAS,CAAA,IAAK,MAAA,IAAU,GAAA,CAAI,IAAA,SAAa,YAAA,CAAa,QAAA;AAE1D,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,CAAI,SAAS,GAAA,EAAA,EAAO;AAC1C,MAAA,IAAI,YAAA,CAAa,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,GAAG,CAAA,EAAG,SAAS,CAAA,EAAG,OAAO,GAAA,CAAI,GAAA,CAAI,QAAQ,GAAG,CAAA;AAAA,IACnF;AACA,IAAA,OAAO,YAAA,CAAa,OAAA;AAAA,EACtB;AAEA,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,CAAI,SAAS,GAAA,EAAA,EAAO;AAC1C,IAAA,IAAI,YAAA,CAAa,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,GAAG,CAAA,EAAG,SAAS,CAAA,IAAK,CAAA,EAAG,IAAA,GAAO,GAAA;AAAA,SAAU;AAAA,EAC9E;AACA,EAAA,OAAO,QAAQ,CAAA,GAAI,GAAA,CAAI,IAAI,MAAA,EAAQ,IAAI,IAAI,YAAA,CAAa,OAAA;AAC1D;AAGA,SAAS,cAAc,OAAA,EAAyB;AAC9C,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,EAAA,GAAK,QAAQ,CAAC,CAAA;AACpB,IAAA,IAAI,EAAA,KAAO,GAAA,IAAO,CAAA,GAAI,CAAA,GAAI,QAAQ,MAAA,EAAQ;AACxC,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,EAAE,CAAC,CAAA;AACxB,MAAA,GAAA,IAAO,IAAA,CAAK,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA;AAAA,IACnD,CAAA,MAAA,IAAW,EAAA,KAAO,GAAA,EAAK,GAAA,IAAO,IAAA;AAAA,SAAA,IACrB,EAAA,KAAO,KAAK,GAAA,IAAO,GAAA;AAAA,SACvB,GAAA,IAAO,EAAA,CAAG,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA;AAAA,EACtD;AACA,EAAA,OAAO,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,GAAG,KAAK,GAAG,CAAA;AACnC;AASA,SAAS,SAAA,CACP,CAAA,EACA,GAAA,EACA,SAAA,EACA,WACA,UAAA,EACQ;AAER,EAAA,IAAA,CAAK,UAAA,KAAe,CAAA,IAAK,UAAA,KAAe,EAAA,KAAO,cAAc,CAAA,EAAG;AAC9D,IAAA,MAAM,EAAA,GAAK,eAAe,CAAA,GAAI,GAAA,GAAM,CAAC,CAAA,KAAc,GAAA,CAAI,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA;AAChE,IAAA,IAAI,KAAK,CAAA,EAAG,EAAA,GAAK,IAAI,CAAA,EAAG,MAAA,GAAS,IAAI,OAAA,GAAU,EAAA;AAC/C,IAAA,OAAO,MAAM,EAAA,EAAI;AACf,MAAA,MAAMgB,IAAAA,GAAO,KAAK,EAAA,KAAQ,CAAA;AAC1B,MAAA,MAAM,MAAM,YAAA,CAAa,OAAA,CAAQ,EAAA,CAAGA,IAAG,GAAG,SAAS,CAAA;AACnD,MAAA,IAAI,QAAQ,CAAA,EAAG,OAAO,eAAe,CAAA,GAAIA,IAAAA,GAAM,IAAI,CAAA,GAAIA,IAAAA;AACvD,MAAA,IAAI,MAAM,CAAA,EAAG;AAAE,QAAA,MAAA,GAASA,IAAAA;AAAK,QAAA,EAAA,GAAKA,IAAAA,GAAM,CAAA;AAAA,MAAG,CAAA,MACtC;AAAE,QAAA,OAAA,GAAUA,IAAAA;AAAK,QAAA,EAAA,GAAKA,IAAAA,GAAM,CAAA;AAAA,MAAG;AAAA,IACtC;AACA,IAAA,MAAM,MAAM,SAAA,KAAc,EAAA,GAAK,MAAA,GAAS,SAAA,KAAc,IAAI,OAAA,GAAU,EAAA;AACpE,IAAA,OAAO,MAAM,CAAA,GAAI,EAAA,GAAM,eAAe,CAAA,GAAI,GAAA,GAAM,IAAI,CAAA,GAAI,GAAA;AAAA,EAC1D;AAGA,EAAA,MAAM,UAAU,UAAA,KAAe,EAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,OAAA,GACV,KAAA,CAAM,IAAA,CAAK,EAAE,QAAQ,CAAA,EAAE,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,IAAI,CAAC,CAAA,GAC7C,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,GAAE,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,CAAA;AAEzC,EAAA,IAAI,cAAc,CAAA,EAAG;AACnB,IAAA,MAAM,EAAA,GAAK,aAAA,CAAc,SAAA,CAAU,MAAA,EAAQ,CAAA;AAC3C,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,EAAO,IAAI,EAAA,CAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,CAAE,MAAA,EAAQ,CAAA,EAAG,OAAO,CAAA;AAC5D,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,IAAI,cAAc,CAAA,EAAG;AACnB,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,EAAO,IAAI,YAAA,CAAa,QAAA,CAAS,IAAI,CAAC,CAAA,EAAG,SAAS,CAAA,EAAG,OAAO,CAAA;AAC5E,IAAA,OAAO,EAAA;AAAA,EACT;AAGA,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,IAAI,OAAA,GAA+B,IAAA;AACnC,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AACf,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,OAAA,CAAQ,CAAA,EAAG,SAAS,CAAA;AAC7C,IAAA,IAAI,GAAA,KAAQ,GAAG,OAAO,CAAA;AACtB,IAAA,IAAI,SAAA,KAAc,EAAA,IAAM,GAAA,GAAM,CAAA,EAAG;AAC/B,MAAA,IAAI,YAAY,IAAA,IAAQ,YAAA,CAAa,QAAQ,CAAA,EAAG,OAAO,IAAI,CAAA,EAAG;AAAE,QAAA,IAAA,GAAO,CAAA;AAAG,QAAA,OAAA,GAAU,CAAA;AAAA,MAAG;AAAA,IACzF,CAAA,MAAA,IAAW,SAAA,KAAc,CAAA,IAAK,GAAA,GAAM,CAAA,EAAG;AACrC,MAAA,IAAI,YAAY,IAAA,IAAQ,YAAA,CAAa,QAAQ,CAAA,EAAG,OAAO,IAAI,CAAA,EAAG;AAAE,QAAA,IAAA,GAAO,CAAA;AAAG,QAAA,OAAA,GAAU,CAAA;AAAA,MAAG;AAAA,IACzF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,OAAA,CAAQ,GAAS,CAAA,EAAsB;AAC9C,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,SAAA,CAAU,SAAS,OAAO,SAAA;AACnE,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,SAAA,CAAU,SAAS,OAAO,SAAA;AACnE,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,SAAA,CAAU,SAAS,OAAO,SAAA;AAEnE,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,MAAA,GAAS,CAAA,GAAIhB,IAAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,EAAE,EAAA,EAAI,IAAA,EAAe,GAAG,CAAA,EAAE;AAC1E,EAAA,IAAI,CAAC,SAAA,CAAU,EAAA,EAAI,OAAO,SAAA,CAAU,CAAA;AACpC,EAAA,MAAM,UAAA,GAAa,CAAA,CAAE,MAAA,GAAS,CAAA,GAAIA,IAAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,EAAE,EAAA,EAAI,IAAA,EAAe,GAAG,CAAA,EAAE;AAC3E,EAAA,IAAI,CAAC,UAAA,CAAW,EAAA,EAAI,OAAO,UAAA,CAAW,CAAA;AACtC,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,CAAC,GAAG,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,CAAC,CAAA;AAEhE,EAAA,MAAM,KAAK,SAAA,CAAU,OAAA,GAAU,UAAU,QAAA,GAAW,UAAA,CAAW,WAAW,SAAS,CAAA;AACnF,EAAA,IAAI,GAAG,IAAA,GAAO,CAAA,IAAK,GAAG,OAAA,GAAU,CAAA,SAAU,YAAA,CAAa,UAAA;AACvD,EAAA,MAAM,WAAW,EAAE,EAAA,CAAG,IAAA,KAAS,CAAA,IAAK,GAAG,OAAA,GAAU,CAAA,CAAA;AACjD,EAAA,MAAM,CAAA,GAAI,QAAA,GAAW,EAAA,CAAG,IAAA,GAAO,EAAA,CAAG,OAAA;AAClC,EAAA,MAAM,GAAA,GAAM,QAAA,GAAW,CAAC,CAAA,KAAc,GAAG,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,GAAI,CAAC,CAAA,KAAc,EAAA,CAAG,GAAA,CAAI,GAAG,CAAC,CAAA;AAE/E,EAAA,MAAM,MAAM,SAAA,CAAU,CAAA,EAAG,GAAA,EAAK,SAAA,EAAW,IAAI,EAAE,CAAA;AAC/C,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,OAAO,CAAA,CAAE,SAAS,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,QAAA,CAAS,CAAC,CAAA,GAAI,YAAA,CAAa,OAAA;AAAA,EACzD;AAEA,EAAA,MAAM,MAAM,SAAA,CAAU,OAAA,GAAU,UAAU,QAAA,GAAW,UAAA,CAAW,WAAW,SAAS,CAAA;AACpF,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,IAAI,GAAA,CAAI,IAAA,KAAS,CAAA,EAAG,OAAO,YAAA,CAAa,UAAA;AACxC,IAAA,IAAI,IAAI,OAAA,KAAY,CAAA,SAAU,GAAA,CAAI,GAAA,CAAI,KAAK,CAAC,CAAA;AAC5C,IAAA,MAAMsB,IAAAA,GAAM,IAAI,UAAA,CAAW,CAAA,EAAG,IAAI,OAAO,CAAA;AACzC,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,CAAI,SAAS,GAAA,EAAA,EAAOA,IAAAA,CAAI,GAAA,CAAI,GAAG,GAAA,EAAK,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,GAAG,CAAC,CAAA;AAC7E,IAAA,OAAO,YAAA,CAAa,MAAMA,IAAG,CAAA;AAAA,EAC/B;AACA,EAAA,IAAI,GAAA,CAAI,OAAA,KAAY,CAAA,EAAG,OAAO,YAAA,CAAa,UAAA;AAC3C,EAAA,IAAI,IAAI,IAAA,KAAS,CAAA,SAAU,GAAA,CAAI,GAAA,CAAI,GAAG,GAAG,CAAA;AACzC,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,GAAA,CAAI,MAAM,CAAC,CAAA;AACtC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAM,CAAA,EAAA,EAAK,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAA;AAChE,EAAA,OAAO,YAAA,CAAa,MAAM,GAAG,CAAA;AAC/B;AAQA,SAAS,MAAA,CAAO,GAAS,CAAA,EAAsB;AAC7C,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,SAAA,CAAU,SAAS,OAAO,SAAA;AACnE,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,SAAA,CAAU,SAAS,OAAO,SAAA;AAEnE,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,MAAA,GAAS,CAAA,GAAItB,IAAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,EAAE,EAAA,EAAI,IAAA,EAAe,GAAG,CAAA,EAAE;AAC1E,EAAA,IAAI,CAAC,SAAA,CAAU,EAAA,EAAI,OAAO,SAAA,CAAU,CAAA;AACpC,EAAA,MAAM,UAAA,GAAa,CAAA,CAAE,MAAA,GAAS,CAAA,GAAIA,IAAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,EAAE,EAAA,EAAI,IAAA,EAAe,GAAG,CAAA,EAAE;AAC3E,EAAA,IAAI,CAAC,UAAA,CAAW,EAAA,EAAI,OAAO,UAAA,CAAW,CAAA;AAEtC,EAAA,MAAM,KAAK,SAAA,CAAU,OAAA,GAAU,UAAU,QAAA,GAAW,UAAA,CAAW,WAAW,SAAS,CAAA;AACnF,EAAA,IAAI,GAAG,IAAA,GAAO,CAAA,IAAK,GAAG,OAAA,GAAU,CAAA,SAAU,YAAA,CAAa,UAAA;AACvD,EAAA,MAAM,WAAW,EAAE,EAAA,CAAG,IAAA,KAAS,CAAA,IAAK,GAAG,OAAA,GAAU,CAAA,CAAA;AACjD,EAAA,MAAM,CAAA,GAAM,QAAA,GAAW,EAAA,CAAG,IAAA,GAAO,EAAA,CAAG,OAAA;AACpC,EAAA,MAAM,GAAA,GAAM,QAAA,GAAW,CAAC,CAAA,KAAc,GAAG,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,GAAI,CAAC,CAAA,KAAc,EAAA,CAAG,GAAA,CAAI,GAAG,CAAC,CAAA;AAE/E,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,CAAA,EAAG,GAAA,EAAK,WAAW,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,CAAC,CAAC,CAAA;AAC1F,EAAA,OAAO,MAAM,CAAA,GAAI,YAAA,CAAa,UAAU,YAAA,CAAa,MAAA,CAAO,MAAM,CAAC,CAAA;AACrE;AAEA,SAAS,MAAA,CAAO,GAAS,CAAA,EAAsB;AAC7C,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,MAAA,CAAO,SAAS,OAAO,MAAA;AAC7D,EAAA,MAAM,EAAA,GAAKA,IAAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,CAAA;AAC/C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA;AAClC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAAE,IAAA,MAAM,EAAA,GAAKA,IAAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,IAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,CAAA;AAAG,IAAA,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA;AAAA,EAAG;AAErG,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS,OAAO,WAAW,CAAA,IAAK,MAAA,KAAW,CAAA,GAAI,MAAA,GAAS,YAAA,CAAa,QAAA;AAEjF,EAAA,MAAM,MAAM,MAAA,CAAO,QAAA;AACnB,EAAA,IAAI,MAAA,GAAS,KAAK,MAAA,IAAU,GAAA,CAAI,QAAQ,MAAA,GAAS,CAAA,IAAK,MAAA,IAAU,GAAA,CAAI,OAAA,EAAS;AAC3E,IAAA,OAAO,YAAA,CAAa,QAAA;AAAA,EACtB;AACA,EAAA,OAAO,GAAA,CAAI,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAA;AAC/B;AAEA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,SAAA,CAAU,SAAS,OAAO,SAAA;AACnE,EAAA,MAAM,MAAA,GAAY,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,MAAA,CAAO,SAAY,OAAO,MAAA;AACnE,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAAE,IAAA,MAAM,CAAA,GAAIA,IAAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,IAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAAG,IAAA,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAC,CAAA;AAAA,EAAG;AAEhG,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO,aAAa,QAAA,CAAS,MAAA,EAAQ,SAAS,CAAA,GAAI,YAAA,CAAa,MAAM,YAAA,CAAa,OAAA;AAAA,EACpF;AAEA,EAAA,MAAM,MAAM,MAAA,CAAO,QAAA;AACnB,EAAA,MAAMkB,OAAM,GAAA,CAAI,MAAA;AAEhB,EAAA,IAAI,cAAc,CAAA,EAAG;AACnB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIA,IAAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,MAAA,IAAI,YAAA,CAAa,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,EAAG,SAAS,CAAA,EAAG,OAAO,YAAA,CAAa,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AAAA,IACxF;AACA,IAAA,OAAO,YAAA,CAAa,OAAA;AAAA,EACtB;AAEA,EAAA,IAAI,cAAc,CAAA,EAAG;AACnB,IAAA,IAAIK,KAAAA,GAAO,EAAA;AACX,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIL,IAAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,MAAA,IAAI,YAAA,CAAa,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,CAAC,GAAG,SAAS,CAAA,IAAK,CAAA,EAAGK,KAAAA,GAAO,CAAA;AAAA,WAAQ;AAAA,IAC3E;AACA,IAAA,OAAOA,SAAQ,CAAA,GAAI,YAAA,CAAa,OAAOA,KAAAA,GAAO,CAAC,IAAI,YAAA,CAAa,OAAA;AAAA,EAClE;AAGA,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIL,IAAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,IAAA,IAAI,YAAA,CAAa,QAAQ,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,EAAG,SAAS,CAAA,IAAK,CAAA,EAAG,IAAA,GAAO,CAAA;AAAA,SAAQ;AAAA,EAC3E;AACA,EAAA,OAAO,QAAQ,CAAA,GAAI,YAAA,CAAa,OAAO,IAAA,GAAO,CAAC,IAAI,YAAA,CAAa,OAAA;AAClE;AAEA,SAAS,MAAA,CAAO,GAAS,CAAA,EAAsB;AAC7C,EAAA,MAAM,EAAA,GAAKlB,IAAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,CAAA;AAC/C,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,CAAC,CAAA;AAC3B,EAAA,IAAI,MAAM,CAAA,IAAK,GAAA,IAAO,CAAA,CAAE,MAAA,SAAe,YAAA,CAAa,UAAA;AACpD,EAAA,OAAO,CAAA,CAAE,GAAG,CAAA,CAAG,QAAA,CAAS,CAAC,CAAA;AAC3B;AAGA,SAAS,eAAA,CAAgB,KAAiB,SAAA,EAAiC;AACzE,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,IAAA,IAAI,YAAA,CAAa,QAAQ,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,EAAG,SAAS,CAAA,IAAK,CAAA,EAAG,IAAA,GAAO,CAAA;AAAA,SAC5D;AAAA,EACP;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,MAAA,CAAO,GAAS,CAAA,EAAsB;AAC7C,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,SAAA,CAAU,SAAS,OAAO,SAAA;AACnE,EAAA,MAAM,MAAA,GAAY,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,MAAA,CAAO,SAAY,OAAO,MAAA;AAGnE,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAChB,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,IAAA,IAAI,MAAA,CAAO,SAAS,OAAO,MAAA;AAC7D,IAAA,MAAM,SAAS,MAAA,CAAO,OAAA,GAAU,OAAO,QAAA,GAAW,UAAA,CAAW,WAAW,MAAM,CAAA;AAC9E,IAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,MAAA,EAAQ,SAAS,CAAA;AAC7C,IAAA,IAAI,GAAA,GAAM,CAAA,EAAG,OAAO,YAAA,CAAa,OAAA;AACjC,IAAA,IAAI,OAAO,OAAA,EAAS,OAAO,MAAA,CAAO,QAAA,CAAS,QAAQ,GAAG,CAAA;AACtD,IAAA,OAAO,GAAA,KAAQ,CAAA,GAAI,MAAA,GAAS,YAAA,CAAa,OAAA;AAAA,EAC3C;AAGA,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO,aAAa,QAAA,CAAS,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,YAAA,CAAa,OAAA;AAAA,EAC1E;AAIA,EAAA,MAAM,MAAM,MAAA,CAAO,QAAA;AACnB,EAAA,IAAI,GAAA,CAAI,OAAA,IAAW,GAAA,CAAI,IAAA,EAAM;AAC3B,IAAA,IAAIuB,KAAAA,GAAO,EAAA;AACX,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,CAAI,SAAS,GAAA,EAAA,EAAO;AAC1C,MAAA,IAAI,YAAA,CAAa,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,GAAG,CAAA,EAAG,SAAS,CAAA,IAAK,CAAA,EAAGA,KAAAA,GAAO,GAAA;AAAA,WAAU;AAAA,IAC9E;AACA,IAAA,OAAOA,KAAAA,IAAQ,IAAI,GAAA,CAAI,GAAA,CAAI,IAAI,IAAA,GAAO,CAAA,EAAGA,KAAI,CAAA,GAAI,YAAA,CAAa,OAAA;AAAA,EAChE;AACA,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAM,CAAA,EAAA,EAAK;AACjC,IAAA,IAAI,YAAA,CAAa,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,EAAG,SAAS,CAAA,IAAK,CAAA,EAAG,IAAA,GAAO,CAAA;AAAA,SAAQ;AAAA,EAC1E;AACA,EAAA,OAAO,IAAA,IAAQ,IAAI,GAAA,CAAI,GAAA,CAAI,MAAM,GAAA,CAAI,OAAA,GAAU,CAAC,CAAA,GAAI,YAAA,CAAa,OAAA;AACnE;AAEA,SAAS,OAAA,CAAQ,GAAS,CAAA,EAAsB;AAC9C,EAAA,MAAM,EAAA,GAAKvB,IAAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,CAAA;AAC/C,EAAA,MAAM,EAAA,GAAKA,IAAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,CAAA;AAC/C,EAAA,MAAMI,IAAAA,GAAM,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,CAAC,CAAA;AAC3B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,CAAC,CAAA;AAC3B,EAAA,IAAIA,IAAAA,GAAM,CAAA,IAAK,GAAA,GAAM,CAAA,SAAU,YAAA,CAAa,UAAA;AAE5C,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAAE,IAAA,MAAM,CAAA,GAAIJ,IAAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,IAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAAG,IAAA,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAC,CAAA;AAAA,EAAG;AAC7F,EAAA,IAAI,MAAA,GAAS,CAAA,IAAK,MAAA,GAAS,CAAA,SAAU,YAAA,CAAa,UAAA;AAElD,EAAA,IAAI,EAAA,GAAK,IAAA;AACT,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAChB,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC1B,IAAA,IAAI,CAAA,CAAE,SAAS,OAAO,CAAA;AAEtB,IAAA,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,IAAA,GAAO,CAAA,CAAE,cAAa,CAAE,YAAA;AAAA,EAC3C;AAEA,EAAA,IAAI,WAAA,GAAc,EAAA;AAClB,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAChB,IAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,IAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,IAAA,IAAI,EAAE,KAAA,KAAU,EAAA,EAAI,WAAA,GAAc,CAAA,EAAG,EAAE,KAAK,CAAA,CAAA,CAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,MAAA,GAAS,MAAA,KAAW,CAAA,IAAK,MAAA,KAAW,CAAA;AAC1C,EAAA,MAAM,MAAA,GAAS,MAAA,KAAW,CAAA,IAAK,MAAA,KAAW,CAAA;AAE1C,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,GAAA,GAAM,CAAA,EAAG,MAAA,GAAS,GAAA,GAAM,EAAE,CAAA,EAAG,YAAA,CAAa,GAAG,CAAC,CAAA,EAAG,MAAA,GAAS,GAAA,GAAM,EAAE,GAAGI,IAAG,CAAA,CAAA;AAAA,EAC1E,CAAA,MAAO;AACL,IAAA,MAAM,QAAQ,MAAA,GAAS,CAAA,CAAA,EAAIA,IAAG,CAAA,CAAA,GAAK,KAAKA,IAAG,CAAA,CAAA,CAAA;AAC3C,IAAA,MAAM,QAAQ,MAAA,GAAS,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GAAK,KAAK,GAAG,CAAA,CAAA,CAAA;AAC3C,IAAA,GAAA,GAAM,CAAA,EAAG,KAAK,CAAA,EAAG,KAAK,CAAA,CAAA;AAAA,EACxB;AACA,EAAA,OAAO,aAAa,IAAA,CAAK,CAAA,EAAG,WAAW,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA;AACjD;AAEA,SAAS,GAAA,CAAI,GAAS,CAAA,EAAsB;AAC1C,EAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG,OAAO,aAAa,MAAA,CAAO,CAAA,CAAE,cAAc,CAAC,CAAA;AAChE,EAAA,MAAM,IAAA,GAAO,EAAE,CAAC,CAAA;AAChB,EAAA,IAAI,gBAAgB,iBAAA,EAAmB;AACrC,IAAA,OAAO,aAAa,MAAA,CAAO,YAAA,CAAa,IAAA,CAAK,SAAS,EAAE,GAAG,CAAA;AAAA,EAC7D;AACA,EAAA,IAAI,gBAAgB,kBAAA,EAAoB;AACtC,IAAA,OAAO,aAAa,MAAA,CAAO,YAAA,CAAa,IAAA,CAAK,QAAQ,EAAE,GAAG,CAAA;AAAA,EAC5D;AACA,EAAA,OAAO,YAAA,CAAa,UAAA;AACtB;AAEA,SAAS,MAAA,CAAO,GAAS,CAAA,EAAsB;AAC7C,EAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG,OAAO,aAAa,MAAA,CAAO,CAAA,CAAE,cAAc,CAAC,CAAA;AAChE,EAAA,MAAM,IAAA,GAAO,EAAE,CAAC,CAAA;AAChB,EAAA,IAAI,gBAAgB,iBAAA,EAAmB;AACrC,IAAA,OAAO,aAAa,MAAA,CAAO,YAAA,CAAa,IAAA,CAAK,SAAS,EAAE,MAAM,CAAA;AAAA,EAChE;AACA,EAAA,IAAI,gBAAgB,kBAAA,EAAoB;AACtC,IAAA,OAAO,aAAa,MAAA,CAAO,YAAA,CAAa,IAAA,CAAK,QAAQ,EAAE,MAAM,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,YAAA,CAAa,UAAA;AACtB;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,IAAI,CAAA,CAAE,CAAC,CAAA,YAAa,kBAAA,EAAoB;AACtC,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,cAAA,CAAe,CAAA,CAAE,CAAC,EAAE,QAAA,EAAU,CAAA,CAAE,CAAC,CAAA,CAAE,MAAM,CAAA;AACrD,IAAA,OAAO,aAAa,MAAA,CAAO,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,WAAW,CAAC,CAAA;AAAA,EACtD;AACA,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC1B,EAAA,OAAO,CAAA,CAAE,UAAU,YAAA,CAAa,MAAA,CAAO,EAAE,QAAA,CAAS,IAAI,IAAI,YAAA,CAAa,GAAA;AACzE;AAEA,SAAS,OAAA,CAAQ,GAAS,CAAA,EAAsB;AAC9C,EAAA,IAAI,CAAA,CAAE,CAAC,CAAA,YAAa,kBAAA,EAAoB;AACtC,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,cAAA,CAAe,CAAA,CAAE,CAAC,EAAE,QAAA,EAAU,CAAA,CAAE,CAAC,CAAA,CAAE,MAAM,CAAA;AACrD,IAAA,OAAO,aAAa,MAAA,CAAO,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,WAAW,CAAC,CAAA;AAAA,EACtD;AACA,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC1B,EAAA,OAAO,CAAA,CAAE,UAAU,YAAA,CAAa,MAAA,CAAO,EAAE,QAAA,CAAS,OAAO,IAAI,YAAA,CAAa,GAAA;AAC5E;AAKA,SAAS,QAAA,CAAS,GAAS,CAAA,EAAsB;AAC/C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,IAAI,EAAA,GAAK,IAAA;AACT,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAChB,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC1B,IAAA,IAAI,CAAA,CAAE,SAAS,OAAO,CAAA;AACtB,IAAA,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,IAAA,GAAO,CAAA,CAAE,cAAa,CAAE,YAAA;AAAA,EAC3C;AAEA,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,KAAA,CAAM,IAAA,EAAK;AAC1B,EAAA,IAAI,IAAA,KAAS,EAAA,EAAI,OAAO,YAAA,CAAa,QAAA;AAGrC,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,IAAA,GAAO,IAAA;AACX,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AACjC,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,KAAA,GAAQ,KAAK,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,CAAE,OAAA,CAAQ,UAAU,EAAE,CAAA;AAChD,IAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,CAAC,CAAA;AAAA,EAC5B;AAEA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC9B,EAAA,IAAI;AACF,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,CAAK,KAAA,CAAM,GAAG,KAAK,CAAA,EAAG,IAAI,CAAC,CAAA;AAC9C,MAAA,MAAM,GAAA,GAAQ,KAAK,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAC,CAAA,EAAG,IAAI,CAAC,CAAA;AAC/C,MAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,GAAA,KAAQ,IAAA,SAAa,YAAA,CAAa,QAAA;AACxD,MAAA,OAAO,KAAA,KAAU,KAAA,CAAA,GACb,CAAA,CAAE,mBAAA,CAAoB,KAAA,EAAO,KAAA,EAAO,GAAG,CAAA,GACvC,CAAA,CAAE,cAAA,CAAe,KAAA,EAAO,GAAG,CAAA;AAAA,IACjC;AACA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,EAAM,EAAA,EAAI,CAAC,CAAA;AAC7B,IAAA,IAAI,IAAA,KAAS,IAAA,EAAM,OAAO,YAAA,CAAa,QAAA;AACvC,IAAA,OAAO,KAAA,KAAU,SAAY,CAAA,CAAE,iBAAA,CAAkB,OAAO,IAAI,CAAA,GAAI,CAAA,CAAE,YAAA,CAAa,IAAI,CAAA;AAAA,EACrF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,YAAA,CAAa,QAAA;AAAA,EACtB;AACF;AAGA,SAAS,IAAA,CAAK,GAAA,EAAa,EAAA,EAAa,CAAA,EAAuB;AAC7D,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,EAAK;AACnB,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAAoB,OAAAA,EAAO,GAAI,aAAa,CAAC,CAAA;AACtC,MAAA,OAAO,iBAAA,CAAkBpB,MAAKoB,OAAM,CAAA;AAAA,IACtC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,MAAM,CAAA,GAAI,uCAAA,CAAwC,IAAA,CAAK,CAAC,CAAA;AACxD,EAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,EAA0B,IAAA,KAAgC;AACtE,IAAA,IAAI,IAAA,KAAS,QAAW,OAAO,IAAA;AAC/B,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG,OAAO,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,EAAG,EAAE,CAAA;AACtE,IAAA,OAAO,QAAA,CAAS,MAAM,EAAE,CAAA;AAAA,EAC1B,CAAA;AACA,EAAA,MAAMpB,OAAM,IAAA,CAAK,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,cAAc,CAAC,CAAA;AACxC,EAAA,MAAM,MAAM,IAAA,CAAK,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,cAAc,CAAC,CAAA;AACxC,EAAA,IAAIA,IAAAA,KAAQ,QAAQ,GAAA,KAAQ,IAAA,IAAQA,OAAM,CAAA,IAAK,GAAA,GAAM,GAAG,OAAO,IAAA;AAC/D,EAAA,OAAO,iBAAA,CAAkBA,MAAK,GAAG,CAAA;AACnC;AAEA,SAAS,MAAA,CAAO,GAAS,CAAA,EAAsB;AAC7C,EAAA,MAAM,QAAA,GAAW,EAAE,CAAC,CAAA;AACpB,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,QAAA,YAAoB,iBAAA,EAAyB,OAAA,GAAU,QAAA,CAAS,SAAA;AAAA,OAAA,IAC3D,QAAA,YAAoB,kBAAA,EAAoB,OAAA,GAAU,QAAA,CAAS,QAAA;AAAA,cACxD,YAAA,CAAa,UAAA;AAEzB,EAAA,MAAM,IAAA,GAAO,aAAa,OAAO,CAAA;AAEjC,EAAA,MAAM,KAAK,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,KAAA;AACrE,EAAA,MAAM,KAAK,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,KAAA;AAErE,EAAA,MAAM,SAAS,IAAA,CAAK,GAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,KAAK,CAAA;AAChD,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,KAAK,CAAA;AAChD,EAAA,IAAI,MAAA,GAAS,CAAA,IAAK,MAAA,GAAS,CAAA,SAAU,YAAA,CAAa,QAAA;AAElD,EAAA,IAAI,MAAA,GAAS,GAAG,KAAA,GAAQ,CAAA;AACxB,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAAE,IAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,IAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AAAO,IAAA,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAK,CAAA;AAAA,EAAG;AAC3H,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAAE,IAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,IAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AAAO,IAAA,KAAA,GAAS,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAK,CAAA;AAAA,EAAG;AAE3H,EAAA,IAAI,MAAA,KAAW,CAAA,IAAK,KAAA,KAAU,CAAA,EAAG,OAAO,EAAE,YAAA,CAAa,iBAAA,CAAkB,MAAA,EAAQ,MAAM,CAAC,CAAA;AAExF,EAAA,OAAO,CAAA,CAAE,cAAA;AAAA,IACP,iBAAA,CAAkB,QAAQ,MAAM,CAAA;AAAA,IAChC,kBAAkB,MAAA,GAAS,MAAA,GAAS,CAAA,EAAG,MAAA,GAAS,QAAQ,CAAC;AAAA,GAC3D;AACF;;;AC/fO,SAAS,oBAAoB,CAAA,EAA2B;AAC7D,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAoB,MAAA,EAAa,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAoB,IAAA,EAAa,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,WAAA,EAAoB,IAAA,EAAa,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAoB,KAAA,EAAa,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,SAAA,EAAoB,KAAA,EAAa,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAoB,MAAA,EAAa,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,SAAA,EAAoB,MAAA,EAAa,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,KAAA,EAAoB,IAAA,EAAa,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAoB,IAAA,EAAa,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAoB,IAAA,EAAa,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAoB,IAAA,EAAa,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAoB,KAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAChD,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAoB,KAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAChD,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAoB,IAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAChD,EAAA,CAAA,CAAE,QAAA,CAAS,SAAA,EAAoB,IAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAChD,EAAA,CAAA,CAAE,QAAA,CAAS,YAAA,EAAoB,UAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAChD,EAAA,CAAA,CAAE,QAAA,CAAS,gBAAA,EAAoB,UAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAChD,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAoB,MAAA,EAAa,CAAC,CAAA;AAC7C,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAoB,MAAA,EAAa,CAAC,CAAA;AAC/C;AAIA,SAAS,QAAA,CAAS,MAAgB,UAAA,EAA6B;AAC7D,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,IAAA,CAAK,MAAA;AACpD,EAAA,MAAMqB,MAAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAA,CAAK,CAAA,GAAI,IAAA,KAAS,CAAA,EAAG,CAAC,CAAA;AAC1D,EAAA,OAAOA,MAAAA,IAAS,UAAA,GAAa,IAAA,CAAK,MAAA,GAAS,KAAK,MAAA,GAAS,CAAA,CAAA;AAC3D;AAEA,SAAS,cAAc,CAAA,EAA2B;AAChD,EAAA,IAAI,EAAE,OAAA,EAAS;AACb,IAAA,OAAO,CAAC,GAAG,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAA,CAC3B,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,QAAQ,CAAA,CACtB,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,WAAW,CAAA;AAAA,EAC3B;AACA,EAAA,OAAO,EAAE,QAAA,GAAW,CAAC,CAAA,CAAE,WAAW,IAAI,EAAC;AACzC;AAEA,SAASzB,IAAAA,CAAI,CAAA,EAAS,CAAA,EAAQ,CAAA,EAAqE;AACjG,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,OAAO,CAAA,CAAE,EAAA,GAAK,EAAE,EAAA,EAAI,MAAM,CAAA,EAAG,CAAA,CAAE,KAAA,EAAM,GAAI,EAAE,EAAA,EAAI,KAAA,EAAO,CAAA,EAAG,EAAE,KAAA,EAAM;AACnE;AAIA,SAAS,MAAA,CAAO,GAAS,CAAA,EAAsB;AAC7C,EAAA,MAAM,CAAA,GAAI,aAAA,CAAc,cAAA,CAAe,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,IAAI,CAAA,CAAE,MAAA,CAAO,MAAA,KAAW,CAAA,SAAU,YAAA,CAAa,QAAA;AAC/C,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,CAAA,CAAE,MAAM,CAAA,CAAE,IAAA,CAAK,CAAC0B,EAAAA,EAAG,CAAA,KAAMA,EAAAA,GAAI,CAAC,CAAA;AACjD,EAAA,MAAMV,IAAAA,GAAM,OAAO,MAAA,IAAU,CAAA;AAC7B,EAAA,OAAO,YAAA,CAAa,MAAA;AAAA,IAClB,MAAA,CAAO,MAAA,GAAS,CAAA,KAAM,CAAA,GAAA,CAAK,MAAA,CAAOA,IAAAA,GAAM,CAAC,CAAA,GAAK,MAAA,CAAOA,IAAG,CAAA,IAAM,CAAA,GAAI,OAAOA,IAAG;AAAA,GAC9E;AACF;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAM,CAAA,GAAI,aAAA,CAAc,cAAA,CAAe,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,IAAI,CAAA,CAAE,MAAA,CAAO,MAAA,KAAW,CAAA,SAAU,YAAA,CAAa,OAAA;AAC/C,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAoB;AACrC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,MAAW,CAAA,IAAK,EAAE,MAAA,EAAQ;AACxB,IAAA,MAAM,GAAA,GAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAC,KAAK,CAAA,IAAK,CAAA;AACjC,IAAA,IAAA,CAAK,GAAA,CAAI,GAAG,GAAG,CAAA;AACf,IAAA,IAAI,GAAA,GAAM,QAAQ,MAAA,GAAS,GAAA;AAAA,EAC7B;AACA,EAAA,IAAI,MAAA,KAAW,CAAA,EAAG,OAAO,YAAA,CAAa,OAAA;AACtC,EAAA,KAAA,MAAW,CAAA,IAAK,EAAE,MAAA,EAAQ;AACxB,IAAA,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,IAAK,OAAO,MAAA,EAAQ,OAAO,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,YAAA,CAAa,OAAA;AACtB;AAEA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,CAAA,GAAI,aAAA,CAAc,cAAA,CAAe,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,IAAI,CAAA,CAAE,MAAA,CAAO,MAAA,GAAS,CAAA,SAAU,YAAA,CAAa,SAAA;AAC7C,EAAA,OAAO,YAAA,CAAa,OAAO,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,CAAE,MAAA,EAAQ,KAAK,CAAC,CAAC,CAAA;AACjE;AAEA,SAAS,MAAA,CAAO,GAAS,CAAA,EAAsB;AAC7C,EAAA,MAAM,CAAA,GAAI,aAAA,CAAc,cAAA,CAAe,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,IAAI,CAAA,CAAE,MAAA,CAAO,MAAA,KAAW,CAAA,SAAU,YAAA,CAAa,SAAA;AAC/C,EAAA,OAAO,YAAA,CAAa,OAAO,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,CAAE,MAAA,EAAQ,IAAI,CAAC,CAAC,CAAA;AAChE;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAM,CAAA,GAAI,aAAA,CAAc,cAAA,CAAe,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,IAAI,CAAA,CAAE,MAAA,CAAO,MAAA,GAAS,CAAA,SAAU,YAAA,CAAa,SAAA;AAC7C,EAAA,OAAO,aAAa,MAAA,CAAO,QAAA,CAAS,CAAA,CAAE,MAAA,EAAQ,KAAK,CAAC,CAAA;AACtD;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAM,CAAA,GAAI,aAAA,CAAc,cAAA,CAAe,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,IAAI,CAAA,CAAE,MAAA,CAAO,MAAA,KAAW,CAAA,SAAU,YAAA,CAAa,SAAA;AAC/C,EAAA,OAAO,aAAa,MAAA,CAAO,QAAA,CAAS,CAAA,CAAE,MAAA,EAAQ,IAAI,CAAC,CAAA;AACrD;AAEA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,IAAA,CAAK,SAAS,OAAO,IAAA;AACzD,EAAA,MAAM,EAAA,GAAKhB,IAAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,CAAA;AAC/C,EAAA,MAAM,IAAA,GAAO,cAAc,IAAI,CAAA,CAAE,KAAK,CAAC0B,EAAAA,EAAG,CAAA,KAAM,CAAA,GAAIA,EAAC,CAAA;AACrD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,CAAC,CAAA;AACzB,EAAA,IAAI,IAAI,CAAA,IAAK,CAAA,GAAI,IAAA,CAAK,MAAA,SAAe,YAAA,CAAa,QAAA;AAClD,EAAA,OAAO,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,CAAA,GAAI,CAAC,CAAE,CAAA;AACzC;AAEA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,IAAA,CAAK,SAAS,OAAO,IAAA;AACzD,EAAA,MAAM,EAAA,GAAK1B,IAAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,CAAA;AAC/C,EAAA,MAAM,IAAA,GAAO,cAAc,IAAI,CAAA,CAAE,KAAK,CAAC0B,EAAAA,EAAG,CAAA,KAAMA,EAAAA,GAAI,CAAC,CAAA;AACrD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,CAAC,CAAA;AACzB,EAAA,IAAI,IAAI,CAAA,IAAK,CAAA,GAAI,IAAA,CAAK,MAAA,SAAe,YAAA,CAAa,QAAA;AAClD,EAAA,OAAO,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,CAAA,GAAI,CAAC,CAAE,CAAA;AACzC;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAM,KAAK,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,KAAA;AACrE,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,IAAA,CAAK,SAAS,OAAO,IAAA;AACzD,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAAE,IAAA,MAAM,EAAA,GAAK1B,IAAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAG,IAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,CAAA;AAAG,IAAA,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,CAAC,CAAA;AAAA,EAAG;AAChG,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC0B,EAAAA,EAAG,CAAA,KAAM,KAAA,KAAU,CAAA,GAAI,CAAA,GAAIA,EAAAA,GAAIA,KAAI,CAAC,CAAA;AAC3E,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,KAAK,CAAA;AACjC,EAAA,OAAO,MAAM,CAAA,GAAI,YAAA,CAAa,UAAU,YAAA,CAAa,MAAA,CAAO,MAAM,CAAC,CAAA;AACrE;AAEA,SAAS,UAAA,CAAW,GAAS,CAAA,EAAsB;AACjD,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,IAAA,CAAK,SAAS,OAAO,IAAA;AACzD,EAAA,MAAM,KAAK,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,KAAA;AACrE,EAAA,IAAI,GAAG,KAAA,GAAQ,CAAA,IAAK,GAAG,KAAA,GAAQ,CAAA,SAAU,YAAA,CAAa,QAAA;AACtD,EAAA,MAAM,IAAA,GAAO,cAAc,IAAI,CAAA,CAAE,KAAK,CAACA,EAAAA,EAAG,CAAA,KAAMA,EAAAA,GAAI,CAAC,CAAA;AACrD,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,YAAA,CAAa,QAAA;AAC3C,EAAA,MAAM,CAAA,GAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,EAAA,CAAG,KAAA;AACjC,EAAA,MAAM,EAAA,GAAK,KAAK,KAAA,CAAM,CAAC,GAAG,EAAA,GAAK,IAAA,CAAK,KAAK,CAAC,CAAA;AAC1C,EAAA,IAAI,OAAO,EAAA,EAAI,OAAO,aAAa,MAAA,CAAO,IAAA,CAAK,EAAE,CAAE,CAAA;AACnD,EAAA,OAAO,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,GAAA,CAAM,IAAA,CAAK,EAAE,CAAA,GAAK,IAAA,CAAK,EAAE,CAAA,KAAO,CAAA,GAAI,EAAA,CAAG,CAAA;AAC3E;AAEA,SAAS,MAAA,CAAO,GAAS,CAAA,EAAsB;AAC7C,EAAA,OAAO,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AACjC;AAEA,SAAS,MAAA,CAAO,GAAS,CAAA,EAAsB;AAC7C,EAAA,OAAO,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AACjC;AAEA,SAAS,YAAA,CAAa,CAAA,EAAS,CAAA,EAAQL,KAAAA,EAAmC;AACxE,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,IAAA,CAAM,CAAA,CAAE,SAAS,CAAA,IAAK,CAAA,KAAM,CAAA,EAAG,OAAO,YAAA,CAAa,UAAA;AAClE,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,SAAA,CAAU,SAAS,OAAO,SAAA;AACnE,EAAA,IAAI,CAAC,SAAA,CAAU,OAAA,EAAS,OAAO,YAAA,CAAa,UAAA;AAE5C,EAAA,MAAM,MAAM,SAAA,CAAU,QAAA;AACtB,EAAA,MAAMH,OAAM,GAAA,CAAI,MAAA;AAChB,EAAA,MAAM,OAAO,IAAI,UAAA,CAAWA,IAAG,CAAA,CAAE,KAAK,CAAC,CAAA;AAEvC,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAI,CAAA,CAAE,MAAA,EAAQ,KAAK,CAAA,EAAG;AACxC,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,IAAA,IAAI,EAAA,CAAG,SAAS,OAAO,EAAA;AACrD,IAAA,MAAM,QAAA,GAAW,EAAE,CAAA,GAAI,CAAC,EAAG,QAAA,CAAS,CAAC,EAAE,MAAA,EAAO;AAC9C,IAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,OAAA,GAAU,EAAA,CAAG,QAAA,GAAW,IAAA;AACzC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIA,IAAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,MAAA,IAAI,CAAC,IAAA,CAAK,CAAC,CAAA,EAAG;AACd,MAAA,MAAM,EAAA,GAAK,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,EAAA;AACtC,MAAA,IAAI,CAAC,cAAc,eAAA,CAAgB,EAAA,EAAI,QAAQ,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA;AAAA,IAC9D;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,GAASG,KAAAA,KAAS,KAAA,GAAQ,CAAA,QAAA,GAAY,QAAA;AAC1C,EAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIH,IAAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,IAAA,IAAI,CAAC,IAAA,CAAK,CAAC,CAAA,EAAG;AACd,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,OAAA,CAAQ,CAAC,EAAE,WAAA,EAAY;AACrC,IAAA,IAAI,CAAC,EAAE,EAAA,EAAI;AACX,IAAA,IAAIG,UAAS,KAAA,GAAQ,CAAA,CAAE,QAAQ,MAAA,GAAS,CAAA,CAAE,QAAQ,MAAA,EAAQ;AAAE,MAAA,MAAA,GAAS,CAAA,CAAE,KAAA;AAAO,MAAA,KAAA,GAAQ,IAAA;AAAA,IAAM;AAAA,EAC9F;AACA,EAAA,OAAO,KAAA,GAAQ,YAAA,CAAa,MAAA,CAAO,MAAM,IAAI,YAAA,CAAa,IAAA;AAC5D;;;ACpLO,SAAS,aAAa,CAAA,EAA2B;AACtD,EAAA,CAAA,CAAE,QAAA,CAAS,SAAA,EAAe,OAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAC1C,EAAA,CAAA,CAAE,QAAA,CAAS,UAAA,EAAe,QAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAC1C,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAe,MAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAC1C,EAAA,CAAA,CAAE,QAAA,CAAS,SAAA,EAAe,OAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAC1C,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAe,KAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAC1C,EAAA,CAAA,CAAE,QAAA,CAAS,WAAA,EAAe,SAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAC1C,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAe,IAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAC1C,EAAA,CAAA,CAAE,QAAA,CAAS,WAAA,EAAe,SAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAC1C,EAAA,CAAA,CAAE,QAAA,CAAS,IAAA,EAAe,EAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAC1C,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAe,KAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAC1C,EAAA,CAAA,CAAE,QAAA,CAAS,GAAA,EAAe,EAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAC1C,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAe,KAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAC1C,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAe,MAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAC1C,EAAA,CAAA,CAAE,QAAA,CAAS,YAAA,EAAe,SAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAC5C;AAEA,SAAS,OAAA,CAAQ,GAAS,CAAA,EAAwB;AAAE,EAAA,OAAO,YAAA,CAAa,QAAQ,CAAA,CAAE,CAAC,EAAG,QAAA,CAAS,CAAC,EAAE,OAAO,CAAA;AAAG;AAC5G,SAAS,QAAA,CAAS,GAAS,CAAA,EAAuB;AAAE,EAAA,OAAO,YAAA,CAAa,QAAQ,CAAA,CAAE,CAAC,EAAG,QAAA,CAAS,CAAC,EAAE,QAAQ,CAAA;AAAG;AAC7G,SAAS,MAAA,CAAO,GAAS,CAAA,EAAyB;AAChD,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC1B,EAAA,OAAO,aAAa,OAAA,CAAQ,CAAA,CAAE,UAAU,CAAA,CAAE,SAAA,CAAU,SAAS,CAAC,CAAA;AAChE;AACA,SAAS,OAAA,CAAQ,GAAS,CAAA,EAAwB;AAAE,EAAA,OAAO,YAAA,CAAa,QAAQ,CAAA,CAAE,CAAC,EAAG,QAAA,CAAS,CAAC,EAAE,OAAO,CAAA;AAAG;AAC5G,SAAS,KAAA,CAAM,GAAS,CAAA,EAA0B;AAChD,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC1B,EAAA,OAAO,YAAA,CAAa,OAAA,CAAQ,CAAA,CAAE,OAAA,IAAW,EAAE,SAAA,KAAA,CAAA,UAA6B;AAC1E;AACA,SAAS,SAAA,CAAU,GAAS,CAAA,EAAsB;AAAE,EAAA,OAAO,YAAA,CAAa,QAAQ,CAAA,CAAE,CAAC,EAAG,QAAA,CAAS,CAAC,EAAE,SAAS,CAAA;AAAG;AAC9G,SAAS,IAAA,CAAK,GAAS,CAAA,EAA2B;AAChD,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC1B,EAAA,OAAO,YAAA,CAAa,OAAA,CAAQ,CAAA,CAAE,OAAA,IAAW,EAAE,SAAA,KAAA,CAAA,UAA6B;AAC1E;AACA,SAAS,SAAA,CAAU,GAAS,CAAA,EAAsB;AAAE,EAAA,OAAO,YAAA,CAAa,QAAQ,CAAC,CAAA,CAAE,CAAC,CAAA,CAAG,QAAA,CAAS,CAAC,CAAA,CAAE,MAAM,CAAA;AAAG;AAC5G,SAAS,EAAA,GAA0C;AAAE,EAAA,OAAO,YAAA,CAAa,OAAA;AAAS;AAElF,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC1B,EAAA,MAAM,IAAI,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,OAAA,GAAU,IAChC,CAAA,CAAE,MAAA,GAAY,CAAA,GACd,CAAA,CAAE,YAAY,CAAA,GACd,CAAA,CAAE,UAAY,EAAA,GACd,CAAA,CAAE,UAAY,EAAA,GAAK,CAAA;AACvB,EAAA,OAAO,YAAA,CAAa,OAAO,CAAC,CAAA;AAC9B;AAEA,SAAS,EAAA,CAAG,GAAS,CAAA,EAAsB;AACzC,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC1B,EAAA,IAAI,CAAA,CAAE,UAAW,OAAO,CAAA;AACxB,EAAA,IAAI,CAAA,CAAE,WAAW,OAAO,YAAA,CAAa,OAAO,CAAA,CAAE,YAAA,GAAe,IAAI,CAAC,CAAA;AAClE,EAAA,OAAO,YAAA,CAAa,IAAA;AACtB;AAEA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AAClE,EAAA,OAAO,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAK,CAAC,CAAA,GAAI,CAAA,KAAM,CAAC,CAAA;AACrE;AAEA,SAAS,MAAA,CAAO,GAAS,CAAA,EAAsB;AAC7C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AAClE,EAAA,OAAO,YAAA,CAAa,QAAQ,IAAA,CAAK,KAAA,CAAM,EAAE,KAAK,CAAA,GAAI,MAAM,CAAC,CAAA;AAC3D;AAEA,SAAS,SAAA,CAAU,GAAS,CAAA,EAAsB;AAChD,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC1B,EAAA,IAAI,CAAC,CAAA,CAAE,OAAA,EAAS,OAAO,YAAA,CAAa,OAAA;AACpC,EAAA,MAAM,GAAA,GAA6C;AAAA,IACjD,gBAAsB,CAAA;AAAA,IACtB,gBAAsB,CAAA;AAAA,IACtB,iBAAsB,CAAA;AAAA,IACtB,eAAsB,CAAA;AAAA,IACtB,gBAAsB,CAAA;AAAA,IACtB,eAAsB,CAAA;AAAA,IACtB,cAAsB;AAAA,GACxB;AACA,EAAA,OAAO,aAAa,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,SAAS,KAAK,CAAC,CAAA;AAClD;;;ACxEO,SAAS,gBAAgB,CAAA,EAA2B;AACzD,EAAA,CAAA,CAAE,QAAA,CAAS,KAAA,EAAQ,GAAA,EAAM,CAAA,EAAG,CAAC,CAAA;AAC7B,EAAA,CAAA,CAAE,QAAA,CAAS,IAAA,EAAQ,EAAA,EAAM,CAAA,EAAG,CAAC,CAAA;AAC7B,EAAA,CAAA,CAAE,QAAA,CAAS,IAAA,EAAQ,EAAA,EAAM,CAAA,EAAG,CAAC,CAAA;AAC7B,EAAA,CAAA,CAAE,QAAA,CAAS,KAAA,EAAQ,GAAA,EAAM,CAAC,CAAA;AAC1B,EAAA,CAAA,CAAE,QAAA,CAAS,KAAA,EAAQ,GAAA,EAAM,CAAA,EAAG,CAAC,CAAA;AAC7B,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAQ,IAAA,EAAM,CAAA,EAAG,CAAC,CAAA;AAC7B,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAQ,IAAA,EAAM,CAAA,EAAG,CAAC,CAAA;AAC7B,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAQ,IAAA,EAAM,CAAA,EAAG,CAAC,CAAA;AAC7B,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAQ,IAAA,EAAM,CAAA,EAAG,CAAC,CAAA;AAC7B,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAQ,IAAA,EAAM,CAAA,EAAG,CAAC,CAAA;AAC7B,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAQ,IAAA,EAAM,CAAA,EAAG,CAAC,CAAA;AAC/B;AAKA,SAAS,QAAA,CAAS,CAAA,EAAW,CAAA,EAAWM,GAAAA,EAAYC,KAAY,IAAA,EAAsB;AACpF,EAAA,IAAI,CAAA,KAAM,CAAA,EAAG,OAAO,EAAED,MAAKC,GAAAA,CAAAA,GAAM,CAAA;AACjC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,GAAG,CAAC,CAAA;AAC7B,EAAA,IAAI,WAAW,CAACA,GAAAA,GAAKD,GAAAA,GAAK,GAAA,IAAO,KAAK,GAAA,GAAM,CAAA,CAAA;AAC5C,EAAA,IAAI,IAAA,KAAS,CAAA,EAAG,OAAA,IAAY,CAAA,GAAI,CAAA;AAChC,EAAA,OAAO,OAAA;AACT;AAGA,SAAS,OAAA,CAAQ,CAAA,EAAW,CAAA,EAAWE,IAAAA,EAAaF,KAAY,IAAA,EAAsB;AACpF,EAAA,IAAI,CAAA,KAAM,CAAA,EAAG,OAAO,EAAEA,MAAKE,IAAAA,GAAM,CAAA,CAAA;AACjC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,GAAG,CAAC,CAAA;AAC7B,EAAA,OAAO,EAAEF,MAAK,GAAA,GAAME,IAAAA,IAAO,IAAI,CAAA,GAAI,IAAA,CAAA,IAAS,MAAM,CAAA,CAAA,GAAK,CAAA,CAAA;AACzD;AAGA,SAAS,GAAA,CAAI,CAAA,EAAS,CAAA,EAAQ,GAAA,EAAa,IAAA,EAAwE;AACjH,EAAA,IAAI,GAAA,IAAO,EAAE,MAAA,EAAQ,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,GAAG,IAAA,EAAK;AAChD,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,GAAG,GAAI,CAAC,CAAA;AAC7C,EAAA,OAAO,CAAA,CAAE,EAAA,GAAK,EAAE,EAAA,EAAI,MAAM,CAAA,EAAG,CAAA,CAAE,KAAA,EAAM,GAAI,EAAE,EAAA,EAAI,KAAA,EAAO,CAAA,EAAG,EAAE,KAAA,EAAM;AACnE;AAEA,SAAS,GAAA,CAAI,GAAS,CAAA,EAAsB;AAC1C,EAAA,MAAMC,KAAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAACA,KAAAA,CAAK,EAAA,EAAI,OAAOA,KAAAA,CAAK,CAAA;AACxD,EAAA,MAAMC,KAAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAACA,KAAAA,CAAK,EAAA,EAAI,OAAOA,KAAAA,CAAK,CAAA;AACxD,EAAA,MAAM,GAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAK,OAAO,GAAA,CAAI,CAAA;AACvD,EAAA,MAAM,GAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAK,OAAO,GAAA,CAAI,CAAA;AACvD,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA,CAAK,CAAA;AAExD,EAAA,MAAM,CAAA,GAAID,KAAAA,CAAK,CAAA,EAAG,CAAA,GAAIC,KAAAA,CAAK,CAAA,EAAG,OAAA,GAAU,GAAA,CAAI,CAAA,EAAG,MAAA,GAAS,GAAA,CAAI,CAAA,EAAG,IAAI,IAAA,CAAK,CAAA;AACxE,EAAA,IAAI,CAAA,KAAM,CAAA,EAAG,OAAO,YAAA,CAAa,QAAA;AACjC,EAAA,OAAO,YAAA,CAAa,OAAO,QAAA,CAAS,CAAA,EAAG,GAAG,OAAA,EAAS,MAAA,EAAQ,CAAC,CAAC,CAAA;AAC/D;AAEA,SAAS,EAAA,CAAG,GAAS,CAAA,EAAsB;AACzC,EAAA,MAAMD,KAAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAACA,KAAAA,CAAK,EAAA,EAAI,OAAOA,KAAAA,CAAK,CAAA;AACxD,EAAA,MAAMC,KAAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAACA,KAAAA,CAAK,EAAA,EAAI,OAAOA,KAAAA,CAAK,CAAA;AACxD,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA,CAAK,CAAA;AACxD,EAAA,MAAM,GAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAK,OAAO,GAAA,CAAI,CAAA;AACvD,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA,CAAK,CAAA;AAExD,EAAA,MAAM,CAAA,GAAID,KAAAA,CAAK,CAAA,EAAG,CAAA,GAAIC,KAAAA,CAAK,CAAA,EAAG,OAAA,GAAU,IAAA,CAAK,CAAA,EAAG,OAAA,GAAU,GAAA,CAAI,CAAA,EAAG,IAAI,IAAA,CAAK,CAAA;AAC1E,EAAA,OAAO,YAAA,CAAa,OAAO,OAAA,CAAQ,CAAA,EAAG,GAAG,OAAA,EAAS,OAAA,EAAS,CAAC,CAAC,CAAA;AAC/D;AAEA,SAAS,EAAA,CAAG,GAAS,CAAA,EAAsB;AACzC,EAAA,MAAMD,KAAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAACA,KAAAA,CAAK,EAAA,EAAI,OAAOA,KAAAA,CAAK,CAAA;AACxD,EAAA,MAAMC,KAAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAACA,KAAAA,CAAK,EAAA,EAAI,OAAOA,KAAAA,CAAK,CAAA;AACxD,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA,CAAK,CAAA;AACxD,EAAA,MAAM,GAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAK,OAAO,GAAA,CAAI,CAAA;AACvD,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA,CAAK,CAAA;AAExD,EAAA,MAAM,CAAA,GAAID,KAAAA,CAAK,CAAA,EAAG,CAAA,GAAIC,KAAAA,CAAK,CAAA,EAAG,OAAA,GAAU,IAAA,CAAK,CAAA,EAAG,MAAA,GAAS,GAAA,CAAI,CAAA,EAAG,IAAI,IAAA,CAAK,CAAA;AACzE,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,YAAA,CAAa,OAAO,EAAE,MAAA,GAAS,UAAU,CAAA,CAAE,CAAA;AAE/D,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,GAAG,CAAC,CAAA;AAC7B,EAAA,OAAO,YAAA,CAAa,MAAA,CAAO,EAAE,MAAA,GAAS,OAAA,IAAW,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA,IAAM,GAAA,GAAM,CAAA,CAAA,GAAK,CAAA,CAAA,GAAK,GAAG,CAAA;AACpF;AAEA,SAAS,GAAA,CAAI,GAAS,CAAA,EAAsB;AAC1C,EAAA,MAAMD,QAAO,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC9C,EAAA,IAAI,CAACA,KAAAA,CAAK,EAAA,EAAI,OAAOA,KAAAA,CAAK,KAAA;AAC1B,EAAA,IAAIA,KAAAA,CAAK,KAAA,KAAU,EAAA,EAAI,OAAO,YAAA,CAAa,SAAA;AAE3C,EAAA,MAAM,QAAQ,aAAA,CAAc,cAAA,CAAe,EAAE,KAAA,CAAM,CAAC,GAAG,CAAC,CAAA;AACxD,EAAA,IAAI,CAAC,KAAA,CAAM,EAAA,EAAI,OAAO,KAAA,CAAM,KAAA;AAE5B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AAC5C,IAAA,KAAA,IAAS,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,GAAK,IAAA,CAAK,IAAI,CAAA,GAAIA,KAAAA,CAAK,KAAA,EAAO,CAAA,GAAI,CAAC,CAAA;AAAA,EAC5D;AACA,EAAA,OAAO,YAAA,CAAa,OAAO,KAAK,CAAA;AAClC;AAEA,SAAS,GAAA,CAAI,GAAS,CAAA,EAAsB;AAC1C,EAAA,MAAM,QAAA,GAAW,cAAc,cAAA,CAAe,CAAC,EAAE,CAAC,CAAE,GAAG,CAAC,CAAA;AACxD,EAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,QAAA,CAAS,KAAA;AAClC,EAAA,MAAM,QAAQ,QAAA,CAAS,MAAA;AACvB,EAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAO,YAAA,CAAa,QAAA;AAE1C,EAAA,IAAI,KAAA,GAAQ,GAAA;AACZ,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAChB,IAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,IAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,IAAA,KAAA,GAAQ,CAAA,CAAE,KAAA;AAAA,EACZ;AAEA,EAAA,MAAM,KAAA,GAAQ,CAACA,KAAAA,KAAyB;AACtC,IAAA,IAAIE,IAAAA,GAAM,CAAA;AACV,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAKA,IAAAA,IAAO,KAAA,CAAM,CAAC,CAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAIF,OAAM,CAAC,CAAA;AAC9E,IAAA,OAAOE,IAAAA;AAAA,EACT,CAAA;AAGA,EAAA,IAAIF,KAAAA,GAAO,KAAA;AACX,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,GAAA,EAAK,IAAA,EAAA,EAAQ;AACrC,IAAA,MAAM,CAAA,GAAI,MAAMA,KAAI,CAAA;AACpB,IAAA,IAAI,IAAA,CAAK,IAAI,CAAC,CAAA,GAAI,MAAM,OAAO,YAAA,CAAa,OAAOA,KAAI,CAAA;AACvD,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,MAAM,KAAA,GAAA,CAAS,KAAA,CAAMA,KAAAA,GAAO,CAAC,IAAI,CAAA,IAAK,CAAA;AACtC,IAAA,IAAI,UAAU,CAAA,EAAG;AACjB,IAAA,MAAM,IAAA,GAAOA,QAAO,CAAA,GAAI,KAAA;AACxB,IAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,IAAK,QAAQ,EAAA,EAAI;AACnC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAA,GAAOA,KAAI,IAAI,IAAA,EAAM;AAAE,MAAAA,KAAAA,GAAO,IAAA;AAAM,MAAA;AAAA,IAAO;AACxD,IAAAA,KAAAA,GAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAA,CAAMA,KAAI,CAAC,IAAI,IAAA,EAAM,OAAO,YAAA,CAAa,MAAA,CAAOA,KAAI,CAAA;AACjE,EAAA,OAAO,YAAA,CAAa,QAAA;AACtB;AAQA,SAAS,IAAI,CAAA,EAAW,CAAA,EAAWD,IAAAA,EAAaF,GAAAA,EAAYC,KAAY,IAAA,EAAsB;AAC5F,EAAA,IAAI,CAAA,KAAM,CAAA,EAAG,OAAOD,GAAAA,GAAKE,OAAM,CAAA,GAAID,GAAAA;AACnC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,GAAG,CAAC,CAAA;AAC7B,EAAA,OAAOD,GAAAA,GAAK,MAAME,IAAAA,IAAO,CAAA,GAAI,IAAI,IAAA,CAAA,IAAS,GAAA,GAAM,KAAK,CAAA,GAAID,GAAAA;AAC3D;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAMG,KAAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAACA,KAAAA,CAAK,EAAA,EAAI,OAAOA,KAAAA,CAAK,CAAA;AACxD,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA,CAAK,CAAA;AACxD,EAAA,MAAM,GAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAK,OAAO,GAAA,CAAI,CAAA;AACvD,EAAA,MAAM,GAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAK,OAAO,GAAA,CAAI,CAAA;AACvD,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA,CAAK,CAAA;AACxD,EAAA,MAAM,EAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,GAAG,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,CAAA;AAEtD,EAAA,MAAM,CAAA,GAAIA,KAAAA,CAAK,CAAA,EAAGF,IAAAA,GAAM,IAAA,CAAK,CAAA,EAAGF,GAAAA,GAAK,GAAA,CAAI,CAAA,EAAGC,GAAAA,GAAK,GAAA,CAAI,CAAA,EAAG,IAAI,IAAA,CAAK,CAAA;AACjE,EAAA,IAAI,CAAA,KAAM,CAAA,EAAG,OAAO,YAAA,CAAa,QAAA;AAGjC,EAAA,IAAI,IAAI,EAAA,CAAG,CAAA;AACX,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,GAAA,EAAK,IAAA,EAAA,EAAQ;AACrC,IAAA,MAAM,IAAI,GAAA,CAAI,CAAA,EAAG,GAAGC,IAAAA,EAAKF,GAAAA,EAAIC,KAAI,CAAC,CAAA;AAClC,IAAA,IAAI,IAAA,CAAK,IAAI,CAAC,CAAA,GAAI,MAAM,OAAO,YAAA,CAAa,OAAO,CAAC,CAAA;AACpD,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,MAAM,KAAA,GAAA,CAAS,GAAA,CAAI,CAAA,GAAI,CAAA,EAAG,CAAA,EAAGC,MAAKF,GAAAA,EAAIC,GAAAA,EAAI,CAAC,CAAA,GAAI,CAAA,IAAK,CAAA;AACpD,IAAA,IAAI,UAAU,CAAA,EAAG;AACjB,IAAA,MAAM,IAAA,GAAO,IAAI,CAAA,GAAI,KAAA;AACrB,IAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,IAAK,QAAQ,EAAA,EAAI;AACnC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,CAAC,IAAI,KAAA,EAAO;AAAE,MAAA,CAAA,GAAI,IAAA;AAAM,MAAA;AAAA,IAAO;AACnD,IAAA,CAAA,GAAI,IAAA;AAAA,EACN;AACA,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,GAAGC,IAAAA,EAAKF,GAAAA,EAAIC,GAAAA,EAAI,CAAC,CAAC,CAAA,GAAI,IAAA,EAAM,OAAO,YAAA,CAAa,OAAO,CAAC,CAAA;AAC5E,EAAA,OAAO,YAAA,CAAa,QAAA;AACtB;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAME,KAAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAACA,KAAAA,CAAK,EAAA,EAAI,OAAOA,KAAAA,CAAK,CAAA;AACxD,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA,CAAK,CAAA;AACxD,EAAA,MAAM,GAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAK,OAAO,GAAA,CAAI,CAAA;AACvD,EAAA,MAAM,GAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAK,OAAO,GAAA,CAAI,CAAA;AACvD,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA,CAAK,CAAA;AAExD,EAAA,MAAM,CAAA,GAAIA,KAAAA,CAAK,CAAA,EAAGD,IAAAA,GAAM,IAAA,CAAK,CAAA,EAAGF,GAAAA,GAAK,GAAA,CAAI,CAAA,EAAGC,GAAAA,GAAK,GAAA,CAAI,CAAA,EAAG,IAAI,IAAA,CAAK,CAAA;AAEjE,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,IAAIC,IAAAA,KAAQ,CAAA,EAAG,OAAO,YAAA,CAAa,QAAA;AACnC,IAAA,OAAO,YAAA,CAAa,MAAA,CAAO,EAAEF,GAAAA,GAAKC,OAAMC,IAAG,CAAA;AAAA,EAC7C;AAEA,EAAA,MAAM,GAAA,GAAMA,IAAAA,IAAO,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA;AAC3B,EAAA,MAAM7B,IAAAA,GAAM,MAAM4B,GAAAA,GAAK,CAAA;AACvB,EAAA,MAAM,GAAA,GAAM,MAAMD,GAAAA,GAAK,CAAA;AACvB,EAAA,IAAI,QAAQ,CAAA,IAAK3B,IAAAA,GAAM,GAAA,IAAO,CAAA,SAAU,YAAA,CAAa,QAAA;AACrD,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAIA,IAAAA,GAAM,GAAG,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA;AACnD,EAAA,IAAI,CAAC,QAAA,CAAS,MAAM,CAAA,SAAU,YAAA,CAAa,QAAA;AAC3C,EAAA,OAAO,YAAA,CAAa,OAAO,MAAM,CAAA;AACnC;AAQA,SAAS,kBAAkB,CAAA,EAAW,GAAA,EAAa,CAAA,EAAW2B,GAAAA,EAAYC,KAAY,CAAA,EAAmB;AACvG,EAAA,MAAM,MAAM,QAAA,CAAS,CAAA,EAAG,CAAA,EAAGD,GAAAA,EAAIC,KAAI,CAAC,CAAA;AAIpC,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,IAAI,GAAA,KAAQ,GAAG,OAAO,CAAA;AACtB,IAAA,OAAO,OAAA,CAAQ,GAAG,GAAA,GAAM,CAAA,EAAG,KAAKD,GAAAA,EAAI,CAAC,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,CAAA;AAAA,EACpD;AACA,EAAA,OAAO,QAAQ,CAAA,EAAG,GAAA,GAAM,GAAG,GAAA,EAAKA,GAAAA,EAAI,CAAC,CAAA,GAAI,CAAA;AAC3C;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAMG,KAAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAACA,KAAAA,CAAK,EAAA,EAAI,OAAOA,KAAAA,CAAK,CAAA;AACxD,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA,CAAK,CAAA;AACxD,EAAA,MAAMC,KAAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAACA,KAAAA,CAAK,EAAA,EAAI,OAAOA,KAAAA,CAAK,CAAA;AACxD,EAAA,MAAM,GAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAK,OAAO,GAAA,CAAI,CAAA;AACvD,EAAA,MAAM,GAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAK,OAAO,GAAA,CAAI,CAAA;AACvD,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA,CAAK,CAAA;AAExD,EAAA,MAAM,IAAID,KAAAA,CAAK,CAAA,EAAG,GAAA,GAAM,IAAA,CAAK,GAAG,CAAA,GAAIC,KAAAA,CAAK,CAAA,EAAGJ,GAAAA,GAAK,IAAI,CAAA,EAAGC,GAAAA,GAAK,GAAA,CAAI,CAAA,EAAG,IAAI,IAAA,CAAK,CAAA;AAC7E,EAAA,IAAI,MAAM,CAAA,IAAK,GAAA,GAAM,KAAK,GAAA,GAAM,CAAA,SAAU,YAAA,CAAa,QAAA;AACvD,EAAA,OAAO,YAAA,CAAa,OAAO,iBAAA,CAAkB,CAAA,EAAG,KAAK,CAAA,EAAGD,GAAAA,EAAIC,GAAAA,EAAI,CAAC,CAAC,CAAA;AACpE;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAME,KAAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAACA,KAAAA,CAAK,EAAA,EAAI,OAAOA,KAAAA,CAAK,CAAA;AACxD,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA,CAAK,CAAA;AACxD,EAAA,MAAMC,KAAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAACA,KAAAA,CAAK,EAAA,EAAI,OAAOA,KAAAA,CAAK,CAAA;AACxD,EAAA,MAAM,GAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAK,OAAO,GAAA,CAAI,CAAA;AACvD,EAAA,MAAM,GAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAK,OAAO,GAAA,CAAI,CAAA;AACvD,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA,CAAK,CAAA;AAExD,EAAA,MAAM,IAAID,KAAAA,CAAK,CAAA,EAAG,GAAA,GAAM,IAAA,CAAK,GAAG,CAAA,GAAIC,KAAAA,CAAK,CAAA,EAAGJ,GAAAA,GAAK,IAAI,CAAA,EAAGC,GAAAA,GAAK,GAAA,CAAI,CAAA,EAAG,IAAI,IAAA,CAAK,CAAA;AAC7E,EAAA,IAAI,MAAM,CAAA,IAAK,GAAA,GAAM,KAAK,GAAA,GAAM,CAAA,SAAU,YAAA,CAAa,QAAA;AACvD,EAAA,MAAM,MAAM,QAAA,CAAS,CAAA,EAAG,CAAA,EAAGD,GAAAA,EAAIC,KAAI,CAAC,CAAA;AACpC,EAAA,OAAO,YAAA,CAAa,MAAA,CAAO,GAAA,GAAM,iBAAA,CAAkB,CAAA,EAAG,KAAK,CAAA,EAAGD,GAAAA,EAAIC,GAAAA,EAAI,CAAC,CAAC,CAAA;AAC1E;AAOA,SAAS,WAAA,CACP,MACA,CAAA,EACiE;AACjE,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AACzB,EAAA,IAAI,EAAE,OAAA,EAAS,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,GAAG,CAAA,EAAE;AACxC,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAA4C;AACxD,IAAA,IAAI,IAAA,CAAK,SAAS,OAAO,IAAA;AACzB,IAAA,MAAM,CAAA,GAAI,KAAK,WAAA,EAAY;AAC3B,IAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,YAAA,CAAa,UAAA;AAC/B,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,KAAK,CAAA;AAChB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AACA,EAAA,IAAI,EAAE,OAAA,EAAS;AACb,IAAA,KAAA,MAAW,IAAA,IAAQ,CAAA,CAAE,QAAA,CAAS,MAAA,EAAO,EAAG;AACtC,MAAA,MAAM,GAAA,GAAM,KAAK,IAAI,CAAA;AACrB,MAAA,IAAI,KAAK,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,GAAG,GAAA,EAAI;AAAA,IACtC;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,KAAK,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,GAAG,GAAA,EAAI;AAAA,EACtC;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AACjC;AAGA,SAAS,MAAA,CAAOE,KAAAA,EAAc,MAAA,EAAkBG,KAAAA,EAAwB;AACtE,EAAA,IAAID,IAAAA,GAAM,CAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAAA,IAAAA,IAAO,MAAA,CAAO,CAAC,CAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAIF,KAAAA,EAAMG,KAAAA,CAAK,CAAC,CAAA,GAAK,GAAG,CAAA;AAAA,EACvD;AACA,EAAA,OAAOD,IAAAA;AACT;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAM,UAAU,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AACjD,EAAA,IAAI,CAAC,OAAA,CAAQ,EAAA,EAAI,OAAO,OAAA,CAAQ,KAAA;AAChC,EAAA,MAAMF,QAAO,OAAA,CAAQ,KAAA;AACrB,EAAA,IAAIA,KAAAA,IAAQ,EAAA,EAAI,OAAO,YAAA,CAAa,QAAA;AAEpC,EAAA,MAAM,OAAA,GAAW,WAAA,CAAY,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,OAAA,CAAQ,EAAA,EAAK,OAAO,OAAA,CAAQ,CAAA;AACzE,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,QAAA,CAAS,CAAA;AAC1E,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,EAAA,MAAM,QAAS,QAAA,CAAS,MAAA;AACxB,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,IAAK,MAAA,CAAO,WAAW,KAAA,CAAM,MAAA,SAAe,YAAA,CAAa,QAAA;AAE/E,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,CAAC,CAAE,CAAA;AACjC,EAAA,MAAMG,KAAAA,GAAO,MAAM,GAAA,CAAI,CAAA,CAAA,KAAK,KAAK,KAAA,CAAM,CAAC,IAAI,IAAI,CAAA;AAChD,EAAA,IAAIA,MAAK,IAAA,CAAK,CAAA,CAAA,KAAK,IAAI,CAAC,CAAA,SAAU,YAAA,CAAa,QAAA;AAE/C,EAAA,OAAO,aAAa,MAAA,CAAO,MAAA,CAAOH,KAAAA,EAAM,MAAA,EAAQG,KAAI,CAAC,CAAA;AACvD;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAM,OAAA,GAAW,WAAA,CAAY,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,OAAA,CAAQ,EAAA,EAAK,OAAO,OAAA,CAAQ,CAAA;AACzE,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,QAAA,CAAS,CAAA;AAC1E,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,EAAA,MAAM,QAAS,QAAA,CAAS,MAAA;AACxB,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,IAAK,MAAA,CAAO,WAAW,KAAA,CAAM,MAAA,SAAe,YAAA,CAAa,QAAA;AAE7E,EAAA,IAAI,KAAA,GAAQ,GAAA;AACZ,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAChB,IAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,IAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,IAAA,KAAA,GAAQ,CAAA,CAAE,KAAA;AAAA,EACZ;AAEA,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,CAAC,CAAE,CAAA;AACjC,EAAA,MAAMA,KAAAA,GAAO,MAAM,GAAA,CAAI,CAAA,CAAA,KAAK,KAAK,KAAA,CAAM,CAAC,IAAI,IAAI,CAAA;AAChD,EAAA,IAAIA,MAAK,IAAA,CAAK,CAAA,CAAA,KAAK,IAAI,CAAC,CAAA,SAAU,YAAA,CAAa,QAAA;AAG/C,EAAA,MAAM,OAAA,GAAU,CAACH,KAAAA,KAAyB;AACxC,IAAA,IAAIE,IAAAA,GAAM,CAAA;AACV,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,MAAM,CAAA,GAAIC,KAAAA,CAAK,CAAC,CAAA,GAAK,GAAA;AACrB,MAAAD,IAAAA,IAAO,CAAC,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAIF,KAAAA,EAAM,CAAA,GAAI,CAAC,CAAA;AAAA,IACnD;AACA,IAAA,OAAOE,IAAAA;AAAA,EACT,CAAA;AAEA,EAAA,IAAIF,KAAAA,GAAO,KAAA;AACX,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,GAAA,EAAK,IAAA,EAAA,EAAQ;AACrC,IAAA,MAAM,CAAA,GAAI,MAAA,CAAOA,KAAAA,EAAM,MAAA,EAAQG,KAAI,CAAA;AACnC,IAAA,IAAI,IAAA,CAAK,IAAI,CAAC,CAAA,GAAI,MAAM,OAAO,YAAA,CAAa,OAAOH,KAAI,CAAA;AACvD,IAAA,MAAM,KAAA,GAAQ,QAAQA,KAAI,CAAA;AAC1B,IAAA,IAAI,UAAU,CAAA,EAAG;AACjB,IAAA,MAAM,IAAA,GAAOA,QAAO,CAAA,GAAI,KAAA;AACxB,IAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,IAAK,QAAQ,EAAA,EAAI;AACnC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAA,GAAOA,KAAI,IAAI,IAAA,EAAM;AAAE,MAAAA,KAAAA,GAAO,IAAA;AAAM,MAAA;AAAA,IAAO;AACxD,IAAAA,KAAAA,GAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,MAAA,CAAOA,KAAAA,EAAM,MAAA,EAAQG,KAAI,CAAC,CAAA,GAAI,IAAA,EAAM,OAAO,YAAA,CAAa,MAAA,CAAOH,KAAI,CAAA;AAChF,EAAA,OAAO,YAAA,CAAa,QAAA;AACtB;;;ACrVA,IAAM,mBAAA,GAAsB,GAAA;AAQrB,SAAS,aAAa,CAAA,EAA2B;AACtD,EAAA,CAAA,CAAE,QAAA,CAAS,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA;AACzB,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAU,OAAA,EAAS,CAAC,CAAA;AAC/B,EAAA,CAAA,CAAE,QAAA,CAAS,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA;AACzB,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAU,OAAA,EAAS,CAAA,EAAG,CAAC,CAAA;AAClC,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAQ,KAAA,EAAO,CAAA,EAAG,CAAC,CAAA;AAC9B,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAS,KAAA,EAAO,CAAA,EAAG,CAAC,CAAA;AAC/B,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAS,KAAA,EAAO,CAAA,EAAG,CAAC,CAAA;AACjC;AAEA,IAAM,OAAA,GAAU,CAAC,CAAA,KACf,CAAA,CAAE,UAAU,CAAA,CAAE,QAAA,GAAW,UAAA,CAAW,UAAA,CAAW,CAAC,CAAA;AASlD,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAE3C,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,IAAK,CAAA,CAAE,SAAS,CAAA,KAAM,CAAA,SAAU,YAAA,CAAa,UAAA;AAE5D,EAAA,MAAM,QAAA,uBAAe,GAAA,EAA0B;AAC/C,EAAA,CAAA,CAAE,UAAU,QAAQ,CAAA;AACpB,EAAA,IAAI;AACF,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,EAAE,MAAA,GAAS,CAAA,EAAG,KAAK,CAAA,EAAG;AACxC,MAAA,MAAM,QAAA,GAAW,EAAE,CAAC,CAAA;AACpB,MAAA,IAAI,EAAE,QAAA,YAAoB,cAAA,CAAA,EAAiB,OAAO,YAAA,CAAa,UAAA;AAC/D,MAAA,MAAM7B,SAAQ,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAClC,MAAA,IAAIA,MAAAA,CAAM,SAAS,OAAOA,MAAAA;AAC1B,MAAA,QAAA,CAAS,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,WAAA,IAAeA,MAAK,CAAA;AAAA,IACjD;AACA,IAAA,OAAO,EAAE,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAA,EACpC,CAAA,SAAE;AACA,IAAA,CAAA,CAAE,QAAA,EAAS;AAAA,EACb;AACF;AASA,SAAS,OAAA,CAAQ,GAAS,CAAA,EAAsB;AAC9C,EAAA,MAAM,UAAA,GAAa,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAChC,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AAC3B,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,IAAI,EAAE,CAAA,YAAa,cAAA,CAAA,EAAiB,OAAO,YAAA,CAAa,UAAA;AACxD,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,CAAE,IAAA,CAAK,WAAA,EAAa,CAAA;AAAA,EAClC;AACA,EAAA,MAAM,GAAA,GAAM,CAAA;AAEZ,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB,OAAO,MAAA,CAAO,MAAA;AAAA;AAAA;AAAA,IAId,KAAK,IAAA,EAA+C;AAClD,MAAA,MAAM,QAAA,uBAAe,GAAA,EAA0B;AAC/C,MAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA,IAAK,YAAA,CAAa,KAAK,CAAC,CAAA;AACvE,MAAA,GAAA,CAAI,UAAU,QAAQ,CAAA;AACtB,MAAA,IAAI;AACF,QAAA,OAAO,IAAA,CAAK,aAAa,GAAG,CAAA;AAAA,MAC9B,CAAA,SAAE;AACA,QAAA,GAAA,CAAI,QAAA,EAAS;AAAA,MACf;AAAA,IACF,CAAA;AAAA;AAAA;AAAA,IAIA,KAAK,IAAA,EAAoC;AACvC,MAAA,MAAM,QAAQ,GAAA,CAAI,cAAA;AAClB,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,IAAI,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,GAAA,SAAY,YAAA,CAAa,QAAA;AAClD,QAAA,KAAA,CAAM,KAAA,EAAA;AAAA,MACR;AACA,MAAA,IAAI;AACF,QAAA,IAAI,OAAA,GAAsB,MAAA;AAC1B,QAAA,IAAI,WAAA,GAAc,IAAA;AAClB,QAAA,KAAA,IAAS,IAAA,GAAO,KAAK,IAAA,EAAA,EAAQ;AAC3B,UAAA,IAAI,IAAA,GAAO,mBAAA,EAAqB,OAAO,YAAA,CAAa,QAAA;AACpD,UAAA,MAAM,CAAA,GAAI,QAAQ,IAAA,GAAO,OAAA,CAAQ,KAAK,WAAW,CAAA,GAAI,OAAA,CAAQ,IAAA,CAAK,WAAW,CAAA;AAC7E,UAAA,IAAI,aAAa,QAAA,EAAU;AACzB,YAAA,OAAA,GAAU,CAAA,CAAE,MAAA;AACZ,YAAA,WAAA,GAAc,CAAA,CAAE,IAAA;AAChB,YAAA;AAAA,UACF;AACA,UAAA,OAAO,CAAA;AAAA,QACT;AAAA,MACF,CAAA,SAAE;AACA,QAAA,IAAI,OAAO,KAAA,CAAM,KAAA,EAAA;AAAA,MACnB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,OAAO,YAAA,CAAa,OAAO,MAAM,CAAA;AACnC;AAGA,SAAS,SAAA,CAAU,MAAmB,CAAA,EAAuE;AAC3G,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AACzB,EAAA,IAAI,EAAE,OAAA,EAAS,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,GAAG,CAAA,EAAE;AACxC,EAAA,IAAI,CAAC,EAAE,QAAA,EAAU,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,CAAA,EAAG,YAAA,CAAa,UAAA,EAAW;AAChE,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,EAAA,EAAI,EAAE,SAAA,EAAU;AACrC;AAGA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAM,KAAK,SAAA,CAAU,CAAA,CAAE,EAAE,MAAA,GAAS,CAAC,GAAI,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,CAAA;AACjE,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,OAAA,CAAQ,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAC7D,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,YAAA,CAAa,UAAA;AAC7C,EAAA,MAAMC,KAAAA,GAAO,OAAO,CAAC,CAAA,CAAG,MAAM,IAAA,GAAO,MAAA,CAAO,CAAC,CAAA,CAAG,OAAA;AAChD,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAWA,KAAAA,EAAM,IAAI,CAAA;AACrC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIA,KAAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,MAAA,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,GAAA,EAAK,EAAA,CAAG,GAAG,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,EAAA,KAAM,GAAG,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAC,CAAC,CAAA;AAAA,IAC9D;AAAA,EACF;AACA,EAAA,OAAO,YAAA,CAAa,MAAM,GAAG,CAAA;AAC/B;AAGA,SAAS,OAAA,CAAQ,GAAS,CAAA,EAAsB;AAC9C,EAAA,IAAI,GAAA,GAAM,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC1B,EAAA,IAAI,GAAA,CAAI,SAAS,OAAO,GAAA;AACxB,EAAA,MAAM,MAAM,OAAA,CAAQ,CAAA,CAAE,CAAC,CAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AACrC,EAAA,MAAM,EAAA,GAAK,SAAA,CAAU,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,CAAA;AACtD,EAAA,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,MAAA,EAAO,EAAG;AAC5B,IAAA,GAAA,GAAM,GAAG,EAAA,CAAG,IAAA,CAAK,CAAC,GAAA,EAAK,CAAC,CAAC,CAAA;AACzB,IAAA,IAAI,GAAA,CAAI,SAAS,OAAO,GAAA;AAAA,EAC1B;AACA,EAAA,OAAO,GAAA;AACT;AAGA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,IAAI,GAAA,GAAM,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC1B,EAAA,IAAI,GAAA,CAAI,SAAS,OAAO,GAAA;AACxB,EAAA,MAAM,MAAM,OAAA,CAAQ,CAAA,CAAE,CAAC,CAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AACrC,EAAA,MAAM,EAAA,GAAK,SAAA,CAAU,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,CAAA;AACtD,EAAA,MAAM,MAAM,IAAI,UAAA,CAAW,GAAA,CAAI,IAAA,EAAM,IAAI,OAAO,CAAA;AAChD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAM,CAAA,EAAA,EAAK;AACjC,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,CAAI,SAAS,GAAA,EAAA,EAAO;AAC1C,MAAA,GAAA,GAAM,EAAA,CAAG,EAAA,CAAG,IAAA,CAAK,CAAC,GAAA,EAAK,IAAI,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAC,CAAA;AACvC,MAAA,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,OAAO,YAAA,CAAa,MAAM,GAAG,CAAA;AAC/B;AAGA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,MAAM,OAAA,CAAQ,CAAA,CAAE,CAAC,CAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AACrC,EAAA,MAAM,EAAA,GAAK,SAAA,CAAU,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,CAAA;AACtD,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,GAAA,CAAI,MAAM,CAAC,CAAA;AACtC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAM,CAAA,EAAA,EAAK;AACjC,IAAA,MAAME,IAAAA,GAAM,IAAI,UAAA,CAAW,CAAA,EAAG,IAAI,OAAO,CAAA;AACzC,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,CAAI,SAAS,GAAA,EAAA,EAAOA,IAAAA,CAAI,GAAA,CAAI,GAAG,GAAA,EAAK,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAA;AAC3E,IAAA,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,EAAA,CAAG,IAAA,CAAK,CAAC,YAAA,CAAa,KAAA,CAAMA,IAAG,CAAC,CAAC,CAAC,CAAA;AAAA,EACrD;AACA,EAAA,OAAO,YAAA,CAAa,MAAM,GAAG,CAAA;AAC/B;AAGA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,MAAM,OAAA,CAAQ,CAAA,CAAE,CAAC,CAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AACrC,EAAA,MAAM,EAAA,GAAK,SAAA,CAAU,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,CAAA;AACtD,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,CAAA,EAAG,IAAI,OAAO,CAAA;AACzC,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,CAAI,SAAS,GAAA,EAAA,EAAO;AAC1C,IAAA,MAAMoB,OAAAA,GAAS,IAAI,UAAA,CAAW,GAAA,CAAI,MAAM,CAAC,CAAA;AACzC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAM,CAAA,EAAA,EAAKA,OAAAA,CAAO,GAAA,CAAI,GAAG,CAAA,EAAG,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAA;AACnE,IAAA,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,GAAA,EAAK,EAAA,CAAG,EAAA,CAAG,IAAA,CAAK,CAAC,YAAA,CAAa,KAAA,CAAMA,OAAM,CAAC,CAAC,CAAC,CAAA;AAAA,EAC1D;AACA,EAAA,OAAO,YAAA,CAAa,MAAM,GAAG,CAAA;AAC/B;ACnLO,SAAS,kBAAkB,CAAA,EAA2B;AAC3D,EAAA,CAAA,CAAE,QAAA,CAAS,UAAA,EAAY,QAAA,EAAU,CAAC,CAAA;AAClC,EAAA,CAAA,CAAE,QAAA,CAAS,WAAA,EAAa,SAAA,EAAW,CAAC,CAAA;AACtC;AAeA,SAAS,aAAA,CACP,CAAA,EACA,CAAA,EACA,QAAA,EACA,IAAA,EAC2E;AAC3E,EAAA,MAAM,MAAsB,EAAC;AAC7B,EAAA,MAAM,KAAK,CAAA,CAAE,SAAA;AAEb,EAAA,KAAA,IAAS,CAAA,GAAI,QAAA,EAAU,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,IAAA,GAAO,EAAE,CAAC,CAAA;AAChB,IAAA,IAAI,gBAAgB,kBAAA,EAAoB;AACtC,MAAA,MAAM,IAAI,CAAA,CAAE,cAAA,CAAe,IAAA,CAAK,QAAA,EAAU,KAAK,MAAM,CAAA;AACrD,MAAA,KAAA,IAASpB,OAAM,CAAA,CAAE,QAAA,EAAUA,IAAAA,IAAO,CAAA,CAAE,QAAQA,IAAAA,EAAAA,EAAO;AACjD,QAAA,IAAI,IAAA,CAAK,aAAA,IAAiB,EAAA,CAAG,WAAA,GAAcA,IAAG,CAAA,EAAG;AACjD,QAAA,KAAA,IAAS,MAAM,CAAA,CAAE,QAAA,EAAU,GAAA,IAAO,CAAA,CAAE,QAAQ,GAAA,EAAA,EAAO;AACjD,UAAA,MAAM,GAAA,GAAM8B,iBAAAA,CAAkB9B,IAAAA,EAAK,GAAG,CAAA;AACtC,UAAA,IAAI,KAAK,aAAA,EAAe;AACtB,YAAA,MAAM,CAAA,GAAI,EAAA,CAAG,cAAA,GAAiB,GAAG,CAAA;AACjC,YAAA,IAAI,CAAA,IAAK,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,EAAG;AAAA,UACvC;AACA,UAAA,MAAM,CAAA,GAAI,CAAA,CAAE,YAAA,CAAa,GAAG,CAAA;AAC5B,UAAA,IAAI,EAAE,OAAA,EAAS;AACb,YAAA,IAAI,KAAK,YAAA,EAAc;AACvB,YAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,EAAE;AAAA,UAC/B;AACA,UAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,QACZ;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AACzB,MAAA,IAAI,EAAE,OAAA,EAAS;AACb,QAAA,IAAI,KAAK,YAAA,EAAc;AACvB,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,EAAE;AAAA,MAC/B;AACA,MAAA,IAAI,EAAE,OAAA,EAAS;AACb,QAAA,KAAA,MAAW,IAAA,IAAQ,CAAA,CAAE,QAAA,CAAS,MAAA,EAAO,EAAG;AACtC,UAAA,IAAI,KAAK,OAAA,EAAS;AAAE,YAAA,IAAI,KAAK,YAAA,EAAc;AAAU,YAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,IAAA,EAAK;AAAA,UAAG;AACxF,UAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,QACf;AAAA,MACF,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AACjC;AAGA,SAAS,cAAA,CAAe,EAAA,EAAY,MAAA,EAAwB,KAAA,EAA8B;AACxF,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,IAAI+B,OAAAA,GAAS,CAAA;AACb,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,CAAC,CAAA,CAAE,OAAA,EAASA,OAAAA,EAAAA;AAChB,IAAA,MAAM,CAAA,GAAI,EAAE,WAAA,EAAY;AACxB,IAAA,IAAI,CAAA,CAAE,EAAA,IAAM,CAAC,CAAA,CAAE,MAAA,IAAU,CAAC,CAAA,CAAE,OAAA,EAAS,IAAA,CAAK,IAAA,CAAK,CAAA,CAAE,KAAK,CAAA;AAAA,EACxD;AAEA,EAAA,MAAMH,IAAAA,GAAM,MAAM,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AAChD,EAAA,MAAM,MAAM,MAAO,IAAA,CAAK,SAASA,IAAAA,EAAI,GAAI,KAAK,MAAA,GAAS,GAAA;AACvD,EAAA,MAAMI,SAAAA,GAAW,CAAC,MAAA,KAA4B;AAC5C,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,IAAA,IAAI,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,GAAG,OAAO,GAAA;AACnC,IAAA,MAAM,IAAI,GAAA,EAAI;AACd,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAA,CAAK,CAAA,GAAI,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA;AACpD,IAAA,OAAO,EAAA,IAAM,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA;AAAA,EAChC,CAAA;AACA,EAAA,MAAM,MAAA,GAAS,MAAM,CAAC,GAAG,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAEnD,EAAA,QAAQ,EAAA;AAAI,IACV,KAAK,CAAA;AAAI,MAAA,OAAO,KAAA,CAAM,KAAK,CAAA,GAAI,aAAa,SAAA,GAAY,YAAA,CAAa,MAAA,CAAO,GAAA,EAAK,CAAA;AAAA,IACjF,KAAK,CAAA;AAAI,MAAA,OAAO,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA;AAAA,IAC/C,KAAK,CAAA;AAAI,MAAA,OAAO,YAAA,CAAa,OAAOD,OAAM,CAAA;AAAA;AAAA,IAC1C,KAAK,CAAA;AAAI,MAAA,OAAO,IAAA,CAAK,MAAA,GAAS,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,IAAI,GAAG,IAAI,CAAC,CAAA,GAAI,YAAA,CAAa,IAAA;AAAA,IACpF,KAAK,CAAA;AAAI,MAAA,OAAO,IAAA,CAAK,MAAA,GAAS,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,IAAI,GAAG,IAAI,CAAC,CAAA,GAAI,YAAA,CAAa,IAAA;AAAA,IACpF,KAAK,CAAA;AAAI,MAAA,OAAO,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA;AAAA,IACnE,KAAK,CAAA,EAAI;AAAE,MAAA,MAAM,CAAA,GAAIC,UAAS,IAAI,CAAA;AAAI,MAAA,OAAO,KAAA,CAAM,CAAC,CAAA,GAAI,YAAA,CAAa,SAAA,GAAY,aAAa,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,IAAG;AAAA;AAAA,IACpH,KAAK,CAAA,EAAI;AAAE,MAAA,MAAM,CAAA,GAAIA,UAAS,KAAK,CAAA;AAAG,MAAA,OAAO,KAAA,CAAM,CAAC,CAAA,GAAI,YAAA,CAAa,SAAA,GAAY,aAAa,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,IAAG;AAAA;AAAA,IACpH,KAAK,CAAA;AAAI,MAAA,OAAO,YAAA,CAAa,MAAA,CAAOJ,IAAAA,EAAK,CAAA;AAAA;AAAA,IACzC,KAAK,EAAA,EAAI;AAAE,MAAA,MAAM,CAAA,GAAII,UAAS,IAAI,CAAA;AAAI,MAAA,OAAO,MAAM,CAAC,CAAA,GAAI,aAAa,SAAA,GAAY,YAAA,CAAa,OAAO,CAAC,CAAA;AAAA,IAAG;AAAA;AAAA,IACzG,KAAK,EAAA,EAAI;AAAE,MAAA,MAAM,CAAA,GAAIA,UAAS,KAAK,CAAA;AAAG,MAAA,OAAO,MAAM,CAAC,CAAA,GAAI,aAAa,SAAA,GAAY,YAAA,CAAa,OAAO,CAAC,CAAA;AAAA,IAAG;AAAA;AAAA;AAAA,IAEzG,KAAK,EAAA,EAAI;AAAE,MAAA,MAAM,IAAI,MAAA,EAAO;AAAG,MAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AAAQ,MAAA,IAAI,CAAC,CAAA,EAAG,OAAO,YAAA,CAAa,QAAA;AACpE,MAAA,MAAMpB,IAAAA,GAAM,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAAG,MAAA,OAAO,YAAA,CAAa,MAAA,CAAO,CAAA,GAAI,CAAA,GAAI,EAAEA,IAAG,CAAA,GAAA,CAAM,CAAA,CAAEA,IAAAA,GAAM,CAAC,CAAA,GAAK,CAAA,CAAEA,IAAG,KAAM,CAAC,CAAA;AAAA,IAAG;AAAA;AAAA,IACrH,KAAK,EAAA,EAAI;AAAE,MAAA,MAAM,IAAI,MAAA,EAAO;AAAG,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,KAAA,IAAS,CAAC,CAAA;AACnD,MAAA,OAAO,CAAA,IAAK,CAAA,IAAK,CAAA,IAAK,CAAA,CAAE,MAAA,GAAS,YAAA,CAAa,MAAA,CAAO,CAAA,CAAE,CAAA,CAAE,MAAA,GAAS,CAAC,CAAE,IAAI,YAAA,CAAa,QAAA;AAAA,IAAU;AAAA,IAC3G,KAAK,EAAA,EAAI;AAAE,MAAA,MAAM,IAAI,MAAA,EAAO;AAAG,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,KAAA,IAAS,CAAC,CAAA;AACnD,MAAA,OAAO,CAAA,IAAK,CAAA,IAAK,CAAA,IAAK,CAAA,CAAE,MAAA,GAAS,YAAA,CAAa,MAAA,CAAO,CAAA,CAAE,CAAA,GAAI,CAAC,CAAE,CAAA,GAAI,YAAA,CAAa,QAAA;AAAA,IAAU;AAAA,IACpG;AAAS,MAAA,OAAO,YAAA,CAAa,UAAA;AAAA;AAEjC;AAEA,SAAS,QAAA,CAAS,GAAS,CAAA,EAAsB;AAC/C,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC9B,EAAA,IAAI,KAAA,CAAM,SAAS,OAAO,KAAA;AAC1B,EAAA,MAAM,GAAA,GAAM,MAAM,WAAA,EAAY;AAC9B,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,YAAA,CAAa,UAAA;AACjC,EAAA,MAAMI,KAAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA;AACjC,EAAA,MAAM,aAAA,GAAgBA,KAAAA,IAAQ,GAAA,IAAOA,KAAAA,IAAQ,GAAA;AAC7C,EAAA,MAAM,EAAA,GAAK,aAAA,GAAgBA,KAAAA,GAAO,GAAA,GAAMA,KAAAA;AACxC,EAAA,IAAI,EAAA,GAAK,CAAA,IAAK,EAAA,GAAK,EAAA,SAAW,YAAA,CAAa,UAAA;AAE3C,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG;AAAA,IACvC,aAAA;AAAA,IACA,aAAA,EAAe,oBAAA;AAAA,IACf,YAAA,EAAc;AAAA,GACf,CAAA;AACD,EAAA,IAAI,CAAC,SAAA,CAAU,EAAA,EAAI,OAAO,SAAA,CAAU,KAAA;AACpC,EAAA,OAAO,cAAA,CAAe,EAAA,EAAI,SAAA,CAAU,MAAM,CAAA;AAC5C;AAEA,SAAS,SAAA,CAAU,GAAS,CAAA,EAAsB;AAChD,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC9B,EAAA,IAAI,KAAA,CAAM,SAAS,OAAO,KAAA;AAC1B,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC/B,EAAA,IAAI,MAAA,CAAO,SAAS,OAAO,MAAA;AAC3B,EAAA,MAAM,GAAA,GAAM,MAAM,WAAA,EAAY;AAC9B,EAAA,MAAM,IAAA,GAAO,OAAO,WAAA,EAAY;AAChC,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,IAAM,CAAC,IAAA,CAAK,EAAA,SAAW,YAAA,CAAa,UAAA;AAE7C,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AACpC,EAAA,IAAI,EAAA,GAAK,CAAA,IAAK,EAAA,GAAK,EAAA,SAAW,YAAA,CAAa,UAAA;AAI3C,EAAA,MAAM,gBAAgB,MAAA,KAAW,CAAA,IAAK,WAAW,CAAA,IAAK,MAAA,KAAW,KAAK,MAAA,KAAW,CAAA;AACjF,EAAA,MAAM,eAAgB,MAAA,KAAW,CAAA,IAAK,WAAW,CAAA,IAAK,MAAA,KAAW,KAAK,MAAA,KAAW,CAAA;AACjF,EAAA,MAAM,YAAA,GAAgB,MAAA,IAAU,CAAA,IAAK,MAAA,KAAW,KAAK,MAAA,KAAW,CAAA;AAGhE,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,SAAS,CAAA,CAAE,MAAA;AACf,EAAA,IAAI,EAAA,KAAO,EAAA,IAAM,EAAA,KAAO,EAAA,EAAI;AAC1B,IAAA,MAAM,OAAO,CAAA,CAAE,CAAA,CAAE,SAAS,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AACxC,IAAA,MAAM,EAAA,GAAK,KAAK,WAAA,EAAY;AAC5B,IAAA,IAAI,CAAC,EAAA,CAAG,EAAA,EAAI,OAAO,YAAA,CAAa,UAAA;AAChC,IAAA,KAAA,GAAQ,EAAA,CAAG,KAAA;AACX,IAAA,MAAA,GAAS,EAAE,MAAA,GAAS,CAAA;AAAA,EACtB;AAEA,EAAA,MAAM,SAAA,GAAY,cAAc,CAAA,CAAE,KAAA,CAAM,GAAG,MAAM,CAAA,EAAG,GAAG,CAAA,EAAG;AAAA,IACxD,aAAA;AAAA,IACA,aAAA,EAAe,eAAe,gCAAA,GAAmC,IAAA;AAAA,IACjE;AAAA,GACD,CAAA;AACD,EAAA,IAAI,CAAC,SAAA,CAAU,EAAA,EAAI,OAAO,SAAA,CAAU,KAAA;AACpC,EAAA,OAAO,cAAA,CAAe,EAAA,EAAI,SAAA,CAAU,MAAA,EAAQ,KAAK,CAAA;AACnD;;;ACxKO,SAAS,cAAc,CAAA,EAA2B;AACvD,EAAA,CAAA,CAAE,QAAA,CAAS,WAAA,EAAa,SAAA,EAAW,CAAA,EAAG,CAAC,CAAA;AACvC,EAAA,CAAA,CAAE,QAAA,CAAS,UAAA,EAAa,QAAA,EAAW,CAAA,EAAG,CAAC,CAAA;AACvC,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAa,MAAA,EAAW,CAAA,EAAG,CAAC,CAAA;AACvC,EAAA,CAAA,CAAE,QAAA,CAAS,MAAA,EAAa,IAAA,EAAW,CAAA,EAAG,CAAC,CAAA;AACvC,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAa,MAAA,EAAW,CAAC,CAAA;AACpC,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAa,MAAA,EAAW,CAAA,EAAG,CAAC,CAAA;AACvC,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAa,KAAA,EAAW,CAAA,EAAG,CAAC,CAAA;AACvC,EAAA,CAAA,CAAE,QAAA,CAAS,WAAA,EAAa,SAAA,EAAW,CAAA,EAAG,CAAC,CAAA;AACvC,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAa,MAAA,EAAW,CAAC,CAAA;AACpC,EAAA,CAAA,CAAE,QAAA,CAAS,QAAA,EAAa,MAAA,EAAW,CAAC,CAAA;AACpC,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAa,KAAA,EAAW,CAAA,EAAG,CAAC,CAAA;AACvC,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,EAAa,KAAA,EAAW,CAAA,EAAG,CAAC,CAAA;AACzC;AAGA,IAAM,QAAA,GAAW,OAAA;AACjB,IAAM,QAAA,GAAW,KAAA;AAEjB,IAAMiB,QAAAA,GAAU,CAAC,CAAA,KACf,CAAA,CAAE,UAAU,CAAA,CAAE,QAAA,GAAW,UAAA,CAAW,UAAA,CAAW,CAAC,CAAA;AAElD,SAAS,SAASnC,KAAAA,EAAsC;AACtD,EAAA,MAAM,KAAKA,KAAAA,CAAK,MAAA;AAChB,EAAA,MAAM,KAAK,EAAA,GAAK,CAAA,GAAIA,KAAAA,CAAK,CAAC,EAAG,MAAA,GAAS,CAAA;AACtC,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,EAAA,EAAI,EAAE,CAAA;AACjC,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAI,CAAA,EAAA,EAAK,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAI,CAAA,EAAA,EAAK,GAAA,CAAI,IAAI,CAAA,EAAG,CAAA,EAAGA,MAAK,CAAC,CAAA,CAAG,CAAC,CAAE,CAAA;AACpF,EAAA,OAAO,YAAA,CAAa,MAAM,GAAG,CAAA;AAC/B;AAEA,SAAS,OAAO,GAAA,EAAmC;AACjD,EAAA,MAAMA,QAAyB,EAAC;AAChC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAM,CAAA,EAAA,EAAK;AACjC,IAAA,MAAME,OAAsB,EAAC;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,OAAA,EAAS,CAAA,EAAA,EAAKA,IAAAA,CAAI,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAC5D,IAAAF,KAAAA,CAAK,KAAKE,IAAG,CAAA;AAAA,EACf;AACA,EAAA,OAAOF,KAAAA;AACT;AAEA,IAAMF,IAAAA,GAAM,CAAC,CAAA,EAAS,CAAA,EAAQ,GAAW,IAAA,KAA2E;AAClH,EAAA,IAAI,CAAA,IAAK,EAAE,MAAA,EAAQ,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,GAAG,IAAA,EAAK;AAC9C,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAC3C,EAAA,OAAO,CAAA,CAAE,EAAA,GAAK,EAAE,EAAA,EAAI,MAAM,CAAA,EAAG,CAAA,CAAE,KAAA,EAAM,GAAI,EAAE,EAAA,EAAI,KAAA,EAAO,CAAA,EAAG,EAAE,KAAA,EAAM;AACnE,CAAA;AAEA,SAAS,SAAA,CAAU,GAAS,CAAA,EAAsB;AAChD,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC1B,EAAA,IAAI,CAAA,CAAE,SAAS,OAAO,CAAA;AACtB,EAAA,OAAO,aAAa,KAAA,CAAMqC,QAAAA,CAAQ,CAAC,CAAA,CAAE,WAAW,CAAA;AAClD;AAEA,SAAS,QAAA,CAAS,GAAS,CAAA,EAAsB;AAC/C,EAAA,MAAMnC,KAAAA,GAAOF,IAAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAACE,KAAAA,CAAK,EAAA,EAAI,OAAOA,KAAAA,CAAK,CAAA;AACxD,EAAA,MAAM,IAAA,GAAOF,IAAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA,CAAK,CAAA;AACxD,EAAA,MAAM,KAAA,GAAQA,IAAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,KAAA,CAAM,EAAA,EAAI,OAAO,KAAA,CAAM,CAAA;AAC3D,EAAA,MAAM,IAAA,GAAOA,IAAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA,CAAK,CAAA;AACxD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAME,KAAAA,CAAK,CAAC,GAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AACnD,EAAA,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,SAAU,YAAA,CAAa,UAAA;AACxC,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,CAAA,EAAG,CAAC,CAAA;AAC/B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,CAAA,EAAG,GAAA,EAAA,EAAO;AAChC,MAAA,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,GAAA,EAAK,YAAA,CAAa,MAAA,CAAO,KAAA,CAAM,CAAA,GAAA,CAAK,CAAA,GAAI,CAAA,GAAI,GAAA,IAAO,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,IACvE;AAAA,EACF;AACA,EAAA,OAAO,YAAA,CAAa,MAAM,GAAG,CAAA;AAC/B;AAgBA,SAAS,QAAQ,CAAA,EAAyB;AACxC,EAAA,QAAQ,EAAE,IAAA;AAAM,IACd,KAAK,QAAA;AAAW,MAAA,OAAO,OAAO,CAAA,CAAE,WAAA,KAAgB,IAAI,GAAA,GAAM,MAAA,CAAO,EAAE,WAAW,CAAA,CAAA;AAAA,IAC9E,KAAK,MAAA;AAAW,MAAA,OAAO,GAAA,GAAM,CAAA,CAAE,SAAA,CAAU,WAAA,EAAY;AAAA;AAAA,IACrD,KAAK,SAAA;AAAW,MAAA,OAAO,CAAA,CAAE,eAAe,IAAA,GAAO,IAAA;AAAA,IAC/C,KAAK,OAAA;AAAW,MAAA,OAAO,GAAA;AAAA,IACvB,KAAK,OAAA;AAAW,MAAA,OAAO,MAAM,CAAA,CAAE,SAAA;AAAA,IAC/B;AAAgB,MAAA,OAAO,GAAA;AAAA;AAE3B;AAWA,SAAS,MAAA,CAAO,GAAS,CAAA,EAAsB;AAC7C,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,CAAA,CAAE,SAAS,OAAO,CAAA;AACnD,EAAA,MAAMoC,MAAAA,GAAQ,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,QAAA,CAAS,CAAC,CAAA,CAAE,YAAA,EAAa,CAAE,YAAA,GAAe,KAAA;AAC7E,EAAA,MAAM,WAAA,GAAc,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,QAAA,CAAS,CAAC,CAAA,CAAE,YAAA,EAAa,CAAE,YAAA,GAAe,KAAA;AAEnF,EAAA,MAAM,IAAA,GAAOA,SAAQD,QAAAA,CAAQ,CAAC,EAAE,SAAA,EAAU,GAAIA,SAAQ,CAAC,CAAA;AACvD,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAsD;AACtE,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAM,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,KAAA,GAAwB,IAAI,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AACpD,IAAA,IAAI,GAAA,GAAM,EAAA;AACV,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,CAAK,SAAS,GAAA,EAAA,EAAO;AAC3C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAA;AAC5B,MAAA,KAAA,CAAM,GAAG,CAAA,GAAI,IAAA;AACb,MAAA,MAAM,CAAA,GAAI,QAAQ,IAAI,CAAA;AACtB,MAAA,GAAA,IAAO,CAAA,CAAE,SAAS,GAAA,GAAM,CAAA;AAAA,IAC1B;AACA,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AACvB,IAAA,IAAI,KAAK,GAAA,CAAI,KAAA,EAAA;AAAA,SACR;AAAE,MAAA,GAAA,CAAI,IAAI,GAAA,EAAK,EAAE,KAAA,EAAO,KAAA,EAAO,GAAG,CAAA;AAAG,MAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,IAAG;AAAA,EAC7D;AAEA,EAAA,MAAM,SAA2B,EAAC;AAClC,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AACrB,IAAA,IAAI,WAAA,IAAe,CAAA,CAAE,KAAA,GAAQ,CAAA,EAAG;AAChC,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAK,CAAA;AAAA,EACrB;AACA,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,aAAa,KAAA,CAAA,CAAA,YAAuB;AACpE,EAAA,MAAM,GAAA,GAAM,SAAS,MAAM,CAAA;AAC3B,EAAA,OAAOC,SAAQ,YAAA,CAAa,KAAA,CAAM,IAAI,QAAA,CAAS,SAAA,EAAW,CAAA,GAAI,GAAA;AAChE;AAEA,SAAS,IAAA,CAAK,GAAS,CAAA,EAAsB;AAC3C,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,CAAA,CAAE,SAAS,OAAO,CAAA;AACnD,EAAA,MAAM,SAAA,GAAYtC,IAAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,SAAA,CAAU,EAAA,EAAI,OAAO,SAAA,CAAU,CAAA;AACvE,EAAA,MAAM,SAAA,GAAYA,IAAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,SAAA,CAAU,EAAA,EAAI,OAAO,SAAA,CAAU,CAAA;AACvE,EAAA,MAAMsC,MAAAA,GAAQ,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,QAAA,CAAS,CAAC,CAAA,CAAE,YAAA,EAAa,CAAE,YAAA,GAAe,KAAA;AAE7E,EAAA,MAAM,IAAA,GAAOA,SAAQD,QAAAA,CAAQ,CAAC,EAAE,SAAA,EAAU,GAAIA,SAAQ,CAAC,CAAA;AACvD,EAAA,MAAMnC,KAAAA,GAAO,OAAO,IAAI,CAAA;AACxB,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,GAAI,CAAA;AACtC,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,CAAA;AACnC,EAAA,IAAIA,KAAAA,CAAK,MAAA,GAAS,CAAA,KAAM,GAAA,GAAM,CAAA,IAAK,GAAA,IAAOA,KAAAA,CAAK,CAAC,CAAA,CAAG,MAAA,CAAA,EAAS,OAAO,YAAA,CAAa,UAAA;AAEhF,EAAA,MAAM,MAAA,GAASA,KAAAA,CACZ,GAAA,CAAI,CAAC,GAAG,CAAA,MAAO,EAAE,CAAA,EAAG,CAAA,EAAE,CAAE,CAAA,CACxB,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACd,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,OAAA,CAAQ,CAAA,CAAE,CAAA,CAAE,GAAG,CAAA,EAAI,CAAA,CAAE,CAAA,CAAE,GAAG,CAAE,CAAA,GAAI,GAAA;AACzD,IAAA,OAAO,GAAA,KAAQ,CAAA,GAAI,GAAA,GAAM,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AAAA,EACnC,CAAC,CAAA,CACA,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,CAAC,CAAA;AAEf,EAAA,MAAM,GAAA,GAAM,SAAS,MAAM,CAAA;AAC3B,EAAA,OAAOoC,SAAQ,YAAA,CAAa,KAAA,CAAM,IAAI,QAAA,CAAS,SAAA,EAAW,CAAA,GAAI,GAAA;AAChE;AAWA,SAAS,MAAA,CAAO,GAAS,CAAA,EAAsB;AAC7C,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,CAAA,CAAE,SAAS,OAAO,CAAA;AACnD,EAAA,MAAM,IAAA,GAAOD,SAAQ,CAAC,CAAA;AAItB,EAAA,MAAM,OAAgD,EAAC;AACvD,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,EAAE,MAAA,EAAQ;AACnB,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,IAAA,IAAI,KAAA,CAAM,SAAS,OAAO,KAAA;AAC3D,IAAA,CAAA,EAAA;AACA,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,IAAI,CAAA,GAAI,EAAE,MAAA,EAAQ;AAChB,MAAA,MAAM,UAAA,GAAa,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AACnC,MAAA,IAAI,UAAA,CAAW,SAAS,OAAO,UAAA;AAC/B,MAAA,IAAI,CAAC,UAAA,CAAW,OAAA,IAAW,UAAA,CAAW,SAAA,EAAW;AAC/C,QAAA,MAAM,CAAA,GAAI,WAAW,WAAA,EAAY;AACjC,QAAA,IAAI,EAAE,EAAA,EAAI;AAAE,UAAA,GAAA,GAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,GAAI,EAAA,GAAK,CAAA;AAAG,UAAA,CAAA,EAAA;AAAA,QAAK;AAAA,MAC/C;AAAA,IACF;AACA,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,CAAC,GAAGA,QAAAA,CAAQ,KAAK,CAAA,CAAE,MAAA,EAAQ,CAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EACvD;AACA,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,YAAA,CAAa,UAAA;AAG3C,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,CAAG,IAAA,CAAK,MAAA;AACxB,EAAA,IAAI,IAAA,CAAK,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,MAAA,KAAW,CAAC,CAAA,EAAG,OAAO,YAAA,CAAa,UAAA;AAC7D,EAAA,MAAME,MAAAA,GAAQ,MAAM,IAAA,CAAK,IAAA;AACzB,EAAA,MAAM,QAAA,GAAW,CAACA,MAAAA,IAAS,CAAA,KAAM,IAAA,CAAK,OAAA;AACtC,EAAA,IAAI,CAACA,MAAAA,IAAS,CAAC,QAAA,SAAiB,YAAA,CAAa,UAAA;AAE7C,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,GAAE,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,CAAA;AAClD,EAAA,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAClB,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAI,GAAA,CAAI,IAAA,CAAK,CAAC,CAAE,CAAA,GAAI,GAAA,CAAI,GAAA;AACnE,MAAA,IAAI,GAAA,KAAQ,GAAG,OAAO,GAAA;AAAA,IACxB;AACA,IAAA,OAAO,CAAA,GAAI,CAAA;AAAA,EACb,CAAC,CAAA;AAED,EAAA,MAAM,MAAM,IAAI,UAAA,CAAW,IAAA,CAAK,IAAA,EAAM,KAAK,OAAO,CAAA;AAClD,EAAA,IAAIA,MAAAA,EAAO;AACT,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAM,CAAA,EAAA,EAAK;AAClC,MAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,MAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,CAAK,SAAS,GAAA,EAAA,EAAO,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,IACjF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,CAAK,SAAS,GAAA,EAAA,EAAO;AAC3C,MAAA,MAAM,GAAA,GAAM,KAAK,GAAG,CAAA;AACpB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAM,CAAA,EAAA,EAAK,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,IACtE;AAAA,EACF;AACA,EAAA,OAAO,YAAA,CAAa,MAAM,GAAG,CAAA;AAC/B;AAEA,SAAS,MAAA,CAAO,GAAS,CAAA,EAAsB;AAC7C,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,CAAA,CAAE,SAAS,OAAO,CAAA;AACnD,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,GAAA,CAAI,SAAS,OAAO,GAAA;AACvD,EAAA,MAAM,GAAA,GAAMF,SAAQ,CAAC,CAAA;AACrB,EAAA,MAAM,MAAA,GAASA,SAAQ,GAAG,CAAA;AAG1B,EAAA,MAAM,SAAS,MAAA,CAAO,IAAA,KAAS,GAAA,CAAI,IAAA,IAAQ,OAAO,OAAA,KAAY,CAAA;AAC9D,EAAA,MAAM,SAAS,MAAA,CAAO,OAAA,KAAY,GAAA,CAAI,OAAA,IAAW,OAAO,IAAA,KAAS,CAAA;AACjE,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,SAAe,YAAA,CAAa,UAAA;AAE5C,EAAA,MAAM,WAA6B,EAAC;AACpC,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAM,CAAA,EAAA,EAAK;AACjC,MAAA,IAAI,CAAC,OAAO,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,CAAE,YAAA,GAAe,YAAA,EAAc;AACnD,MAAA,MAAMjC,OAAsB,EAAC;AAC7B,MAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,CAAI,OAAA,EAAS,GAAA,EAAA,EAAOA,IAAAA,CAAI,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAA;AACpE,MAAA,QAAA,CAAS,KAAKA,IAAG,CAAA;AAAA,IACnB;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,CAAI,SAAS,GAAA,EAAA,EAAO;AAC1C,MAAA,IAAI,MAAA,CAAO,GAAA,CAAI,CAAA,EAAG,GAAG,CAAA,CAAE,cAAa,CAAE,YAAA,EAAc,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA;AAAA,IACvE;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAM,CAAA,EAAA,EAAK;AACjC,MAAA,QAAA,CAAS,IAAA,CAAK,SAAS,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAC,CAAA;AAAA,IACpD;AACA,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,QAAA,CAAS,MAAA,GAAS,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,IAAM,QAAA,CAAS,CAAC,KAAK,QAAA,CAAS,CAAC,CAAA,CAAE,MAAA,KAAW,CAAA,EAAI;AACtE,IAAA,OAAO,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,CAAA,CAAE,CAAC,EAAG,QAAA,CAAS,CAAC,CAAA,GAAI,YAAA,CAAa,KAAA,CAAA,CAAA,YAAuB;AAAA,EAChF;AACA,EAAA,OAAO,SAAS,QAAQ,CAAA;AAC1B;AAEA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,EAAA,CAAG,SAAS,OAAO,EAAA;AACrD,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAAG,EAAA,IAAI,EAAA,CAAG,SAAS,OAAO,EAAA;AACrD,EAAA,MAAM,IAAIiC,QAAAA,CAAQ,EAAE,CAAA,EAAG,CAAA,GAAIA,SAAQ,EAAE,CAAA;AACrC,EAAA,IAAI,CAAA,CAAE,OAAA,KAAY,CAAA,CAAE,IAAA,SAAa,YAAA,CAAa,UAAA;AAE9C,EAAA,MAAM,MAAM,IAAI,UAAA,CAAW,CAAA,CAAE,IAAA,EAAM,EAAE,OAAO,CAAA;AAC5C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK;AAC/B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,SAAS,CAAA,EAAA,EAAK;AAClC,MAAA,IAAIL,IAAAA,GAAM,CAAA;AACV,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,SAAS,CAAA,EAAA,EAAK;AAClC,QAAA,MAAM,IAAI,CAAA,CAAE,GAAA,CAAI,CAAA,EAAG,CAAC,EAAE,WAAA,EAAY;AAClC,QAAA,MAAM,IAAI,CAAA,CAAE,GAAA,CAAI,CAAA,EAAG,CAAC,EAAE,WAAA,EAAY;AAClC,QAAA,IAAI,CAAC,CAAA,CAAE,EAAA,IAAM,CAAC,CAAA,CAAE,EAAA,SAAW,YAAA,CAAa,UAAA;AACxC,QAAAA,IAAAA,IAAO,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAA;AAAA,MACrB;AACA,MAAA,GAAA,CAAI,IAAI,CAAA,EAAG,CAAA,EAAG,YAAA,CAAa,MAAA,CAAOA,IAAG,CAAC,CAAA;AAAA,IACxC;AAAA,EACF;AACA,EAAA,OAAO,YAAA,CAAa,MAAM,GAAG,CAAA;AAC/B;AAEA,SAAS,SAAA,CAAU,GAAS,CAAA,EAAsB;AAChD,EAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AAClE,EAAA,MAAM,OAAO,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA,CAAK,KAAA;AAC3E,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAChB,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,CAAC,CAAA;AAC3B,IAAA,IAAI,EAAA,CAAG,SAAS,OAAO,EAAA;AACvB,IAAA,IAAI,CAAC,GAAG,OAAA,EAAS;AAAE,MAAA,MAAM,IAAI,aAAA,CAAc,UAAA,CAAW,CAAA,CAAE,CAAC,GAAI,CAAC,CAAA;AAAG,MAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AAAO,MAAA,IAAA,GAAO,CAAA,CAAE,KAAA;AAAA,IAAO;AAAA,EAC9G;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,EAAW,CAAA,KAAyB,CAAA,KAAM,EAAA,GAAK,CAAC,CAAC,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AAC7E,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,CAAM,CAAA,CAAE,OAAO,IAAI,CAAA,GAAI,CAAC,CAAA,CAAE,KAAK,CAAA;AACpD,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,CAAA,IAAA,KAAQ,MAAM,IAAA,EAAM,IAAA,CAAK,KAAK,CAAC,CAAA;AACtD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,CAAA;AAE5D,EAAA,MAAM9B,KAAAA,GAAyB,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK;AAC3C,IAAA,MAAME,OAAsB,EAAC;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,KAAKA,IAAAA,CAAI,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,CAAA,CAAE,CAAC,CAAA,IAAK,EAAE,CAAC,CAAA;AACtE,IAAA,OAAOA,IAAAA;AAAA,EACT,CAAC,CAAA;AACD,EAAA,OAAO,SAASF,KAAI,CAAA;AACtB;AASA,SAAS,MAAA,CAAO,GAAS,CAAA,EAAsB;AAG7C,EAAA,MAAM,QAAsB,EAAC;AAC7B,EAAA,IAAI,SAAA,GAAY,GAAG,OAAA,GAAU,CAAA;AAC7B,EAAA,KAAA,MAAW,QAAQ,CAAA,EAAG;AACpB,IAAA,MAAM,GAAA,GAAMmC,QAAAA,CAAQ,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AACpC,IAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AACd,IAAA,SAAA,IAAa,GAAA,CAAI,IAAA;AACjB,IAAA,IAAI,GAAA,CAAI,OAAA,GAAU,OAAA,EAAS,OAAA,GAAU,GAAA,CAAI,OAAA;AAAA,EAC3C;AACA,EAAA,IAAI,SAAA,GAAY,QAAA,IAAY,OAAA,GAAU,QAAA,SAAiB,YAAA,CAAa,QAAA;AAEpE,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,SAAA,EAAW,OAAO,CAAA;AAC7C,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAM,CAAA,EAAA,EAAK;AACjC,MAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,OAAA,EAAS,GAAA,EAAA,EAAO;AACtC,QAAA,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,GAAA,EAAK,GAAA,GAAM,GAAA,CAAI,OAAA,GAAU,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,GAAG,CAAA,GAAI,aAAa,OAAO,CAAA;AAAA,MACrF;AAAA,IACF;AACA,IAAA,MAAA,IAAU,GAAA,CAAI,IAAA;AAAA,EAChB;AACA,EAAA,OAAO,YAAA,CAAa,MAAM,GAAG,CAAA;AAC/B;AAMA,SAAS,MAAA,CAAO,GAAS,CAAA,EAAsB;AAC7C,EAAA,MAAM,QAAsB,EAAC;AAC7B,EAAA,IAAI,SAAA,GAAY,GAAG,OAAA,GAAU,CAAA;AAC7B,EAAA,KAAA,MAAW,QAAQ,CAAA,EAAG;AACpB,IAAA,MAAM,GAAA,GAAMA,QAAAA,CAAQ,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AACpC,IAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AACd,IAAA,SAAA,IAAa,GAAA,CAAI,OAAA;AACjB,IAAA,IAAI,GAAA,CAAI,IAAA,GAAO,OAAA,EAAS,OAAA,GAAU,GAAA,CAAI,IAAA;AAAA,EACxC;AACA,EAAA,IAAI,OAAA,GAAU,QAAA,IAAY,SAAA,GAAY,QAAA,SAAiB,YAAA,CAAa,QAAA;AAEpE,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,OAAA,EAAS,SAAS,CAAA;AAC7C,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,CAAI,SAAS,GAAA,EAAA,EAAO;AAC1C,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,QAAA,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,MAAA,GAAS,GAAA,EAAK,CAAA,GAAI,GAAA,CAAI,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,GAAG,CAAA,GAAI,aAAa,OAAO,CAAA;AAAA,MAChF;AAAA,IACF;AACA,IAAA,MAAA,IAAU,GAAA,CAAI,OAAA;AAAA,EAChB;AACA,EAAA,OAAO,YAAA,CAAa,MAAM,GAAG,CAAA;AAC/B;AAKA,SAAS,OAAA,CAAQ,GAAS,CAAA,EAA+E;AACvG,EAAA,MAAM,MAAMA,QAAAA,CAAQ,CAAA,CAAE,CAAC,CAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AACrC,EAAA,MAAM,EAAA,GAAKrC,IAAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,GAAG,EAAA,EAAI,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,CAAA,EAAG,EAAA,CAAG,CAAA,EAAE;AACpE,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,CAAC,CAAA;AAC9B,EAAA,MAAMsC,MAAAA,GAAQ,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAG,QAAA,CAAS,CAAC,CAAA,CAAE,YAAA,EAAa,CAAE,YAAA,GAAe,KAAA;AAE7E,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAA,CACT,MAAA,GAAS,CAAA,MAAO,CAAA,IAAM,CAAA,CAAE,OAAA,IAAA,CAAe,MAAA,GAAS,CAAA,MAAO,CAAA,IAAM,CAAA,CAAE,OAAA;AAEpE,EAAA,MAAM,SAAyB,EAAC;AAChC,EAAA,IAAIA,MAAAA,EAAO;AACT,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,CAAI,OAAA,EAAS,GAAA,EAAA;AACnC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAM,CAAA,EAAA,EAAK;AAAE,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,GAAG,CAAA;AAAG,QAAA,IAAI,CAAC,IAAA,CAAK,CAAC,CAAA,EAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MAAG;AAAA,EAClG,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,IAAA,EAAM,CAAA,EAAA;AAC5B,MAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,CAAI,SAAS,GAAA,EAAA,EAAO;AAAE,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,GAAG,CAAA;AAAG,QAAA,IAAI,CAAC,IAAA,CAAK,CAAC,CAAA,EAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MAAG;AAAA,EAC3G;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAO;AAC5B;AAGA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAC7C,EAAA,IAAI,CAAA,CAAE,MAAA,CAAO,MAAA,KAAW,CAAA,SAAU,YAAA,CAAa,OAAA;AAC/C,EAAA,MAAM,MAAM,IAAI,UAAA,CAAW,CAAA,CAAE,MAAA,CAAO,QAAQ,CAAC,CAAA;AAC7C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,OAAO,MAAA,EAAQ,CAAA,EAAA,EAAK,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,MAAA,CAAO,CAAC,CAAE,CAAA;AACpE,EAAA,OAAO,YAAA,CAAa,MAAM,GAAG,CAAA;AAC/B;AAGA,SAAS,KAAA,CAAM,GAAS,CAAA,EAAsB;AAC5C,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAA;AAAG,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAC7C,EAAA,IAAI,CAAA,CAAE,MAAA,CAAO,MAAA,KAAW,CAAA,SAAU,YAAA,CAAa,OAAA;AAC/C,EAAA,MAAM,MAAM,IAAI,UAAA,CAAW,CAAA,EAAG,CAAA,CAAE,OAAO,MAAM,CAAA;AAC7C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,OAAO,MAAA,EAAQ,CAAA,EAAA,EAAK,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,MAAA,CAAO,CAAC,CAAE,CAAA;AACpE,EAAA,OAAO,YAAA,CAAa,MAAM,GAAG,CAAA;AAC/B;;;ACraA,IAAA,QAAA,EAAA,UAAA,EAAA,2BAAA,EAAA,mBAAA;AA6BO,IAAM,iBAAA,GAAN,MAAM,iBAAA,CAAiB;AAAA,EAAvB,WAAA,GAAA;AAAA,IAAA,YAAA,CAAA,IAAA,EAAA,2BAAA,CAAA;AAYL,IAAA,YAAA,CAAA,IAAA,EAAS,UAAA,sBAAiB,GAAA,EAAyB,CAAA;AAAA,EAAA;AAAA;AAAA,EARnD,WAAW,OAAA,GAA4B;AAjCzC,IAAA,IAAA,EAAA;AAkCI,IAAA,IAAI,CAAC,gCAAiB,QAAA,CAAA,EAAU;AAC9B,MAAA,YAAA,CAAA,iBAAA,EAAiB,QAAA,EAAW,IAAI,iBAAA,EAAiB,CAAA;AACjD,MAAA,eAAA,CAAA,EAAA,GAAA,YAAA,CAAA,iBAAA,EAAiB,WAAS,2BAAA,EAAA,mBAAA,CAAA,CAA1B,IAAA,CAAA,EAAA,CAAA;AAAA,IACF;AACA,IAAA,OAAO,YAAA,CAAA,iBAAA,EAAiB,QAAA,CAAA;AAAA,EAC1B;AAAA;AAAA,EAKA,QAAA,CACE,MACA,OAAA,EACA,OAAA,GAAU,GACV,OAAA,GAAU,EAAA,EACV,aAAa,KAAA,EACP;AACN,IAAA,YAAA,CAAA,IAAA,EAAK,UAAA,CAAA,CAAW,GAAA,CAAI,IAAA,CAAK,WAAA,EAAY,EAAG;AAAA,MACtC,IAAA,EAAM,KAAK,WAAA,EAAY;AAAA,MAAG,OAAA;AAAA,MAAS,OAAA;AAAA,MAAS,UAAA;AAAA,MAAY;AAAA,KACzD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAA,CAAQ,IAAA,EAAc,IAAA,EAAqB,GAAA,EAAmC;AAC5E,IAAA,MAAM,MAAM,YAAA,CAAA,IAAA,EAAK,UAAA,CAAA,CAAW,GAAA,CAAI,IAAA,CAAK,aAAa,CAAA;AAClD,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,YAAA,CAAa,SAAA;AAE9B,IAAA,IAAI,IAAA,CAAK,MAAA,GAAS,GAAA,CAAI,OAAA,SAAgB,YAAA,CAAa,UAAA;AACnD,IAAA,IAAI,GAAA,CAAI,WAAW,CAAA,IAAK,IAAA,CAAK,SAAS,GAAA,CAAI,OAAA,SAAgB,YAAA,CAAa,UAAA;AAEvE,IAAA,IAAI;AACF,MAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAAA,IAC9B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,YAAA,CAAa,UAAA;AAAA,IACtB;AAAA,EACF;AAAA;AAAA,EAGA,WAAW,IAAA,EAAuB;AAChC,IAAA,OAAO,mBAAK,UAAA,CAAA,CAAW,GAAA,CAAI,KAAK,WAAA,EAAa,GAAG,UAAA,IAAc,KAAA;AAAA,EAChE;AAAA;AAAA,EAGA,IAAI,IAAA,EAAuB;AACzB,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,UAAA,CAAA,CAAW,GAAA,CAAI,IAAA,CAAK,aAAa,CAAA;AAAA,EAC/C;AAmBF,CAAA;AApES,QAAA,GAAA,IAAA,OAAA,EAAA;AAWE,UAAA,GAAA,IAAA,OAAA,EAAA;AAZJ,2BAAA,GAAA,IAAA,OAAA,EAAA;AAoDL,mBAAA,GAAiB,WAAS;AAKxB,EAAA,YAAA,CAAa,IAAI,CAAA;AACjB,EAAA,YAAA,CAAa,IAAI,CAAA;AACjB,EAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,EAAA,YAAA,CAAa,IAAI,CAAA;AACjB,EAAA,cAAA,CAAe,IAAI,CAAA;AACnB,EAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,EAAA,YAAA,CAAa,IAAI,CAAA;AACjB,EAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,EAAA,YAAA,CAAa,IAAI,CAAA;AACjB,EAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,EAAA,aAAA,CAAc,IAAI,CAAA;AACpB,CAAA;AAnEA,YAAA,CADW,iBAAA,EACJ,QAAA,CAAA;AADF,IAAM,gBAAA,GAAN;AAyEA,IAAU;AAAA,CAAV,CAAUE,cAAAA,KAAV;AAEE,EAAA,SAAS,UAAA,CACd,MACA,GAAA,EACkE;AAClE,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA;AAC3B,IAAA,IAAI,EAAE,OAAA,EAAS,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,CAAA,EAAE;AAC5C,IAAA,MAAM,CAAA,GAAI,EAAE,WAAA,EAAY;AACxB,IAAA,IAAI,CAAC,EAAE,EAAA,EAAI,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,YAAA,CAAa,UAAA,EAAW;AAC9D,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,EAAE,KAAA,EAAM;AAAA,EACpC;AATO,EAAAA,cAAAA,CAAS,UAAA,GAAA,UAAA;AAYT,EAAA,SAAS,UAAA,CACd,MACA,GAAA,EACkE;AAClE,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA;AAC3B,IAAA,IAAI,EAAE,OAAA,EAAS,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,CAAA,EAAE;AAC5C,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,CAAA,CAAE,QAAO,EAAE;AAAA,EACvC;AAPO,EAAAA,cAAAA,CAAS,UAAA,GAAA,UAAA;AAaT,EAAA,SAAS,cAAA,CACd,MACA,GAAA,EACqE;AACrE,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,KAAA,MAAW3B,QAAO,IAAA,EAAM;AACtB,MAAA,MAAM,CAAA,GAAIA,IAAAA,CAAI,QAAA,CAAS,GAAG,CAAA;AAC1B,MAAA,IAAI,EAAE,OAAA,EAAS,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,CAAA,EAAE;AAC5C,MAAA,IAAI,EAAE,OAAA,EAAS;AACb,QAAA,KAAA,MAAW,IAAA,IAAQ,CAAA,CAAE,QAAA,CAAS,MAAA,EAAO,EAAG;AACtC,UAAA,IAAI,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,MAAA,EAAQ;AACjC,UAAA,IAAI,KAAK,OAAA,EAAS,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,IAAA,EAAK;AAClD,UAAA,MAAM,CAAA,GAAI,KAAK,WAAA,EAAY;AAC3B,UAAA,IAAI,CAAA,CAAE,EAAA,EAAI,IAAA,CAAK,IAAA,CAAK,EAAE,KAAK,CAAA;AAAA,QAC7B;AAAA,MACF,WAAW,CAAC,CAAA,CAAE,OAAA,IAAW,CAAC,EAAE,MAAA,EAAQ;AAClC,QAAA,MAAM,CAAA,GAAI,EAAE,WAAA,EAAY;AACxB,QAAA,IAAI,CAAC,EAAE,EAAA,EAAI,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,YAAA,CAAa,UAAA,EAAW;AAC9D,QAAA,IAAA,CAAK,IAAA,CAAK,EAAE,KAAK,CAAA;AAAA,MACnB;AAAA,IACF;AACA,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK;AAAA,EAClC;AAtBO,EAAA2B,cAAAA,CAAS,cAAA,GAAA,cAAA;AAyBT,EAAA,SAAS,WAAA,CACd,MACA,GAAA,EACgB;AAChB,IAAA,MAAM,SAAyB,EAAC;AAChC,IAAA,KAAA,MAAW3B,QAAO,IAAA,EAAM;AACtB,MAAA,MAAM,CAAA,GAAIA,IAAAA,CAAI,QAAA,CAAS,GAAG,CAAA;AAC1B,MAAA,IAAI,EAAE,OAAA,EAAS;AACb,QAAA,KAAA,MAAW,QAAQ,CAAA,CAAE,QAAA,CAAS,QAAO,EAAG,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,MAC1D,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MACf;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAdO,EAAA2B,cAAAA,CAAS,WAAA,GAAA,WAAA;AA4CT,EAAA,SAAS,gBAAgB,QAAA,EAAoC;AAClE,IAAA,MAAM,OAAA,GAAU,SAAS,IAAA,EAAK;AAG9B,IAAA,MAAM,OAAA,GAAU,wBAAA,CAAyB,IAAA,CAAK,OAAO,CAAA;AACrD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,EAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,MAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,MAAA,MAAM,MAAA,GAAS,WAAW,GAAG,CAAA;AAC7B,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAM,CAAA,GAAI,IAAA,GAAO,MAAA;AACtC,MAAA,MAAM,QAAA,GAAW,WAAW,IAAA,GAAO,YAAA,CAAa,OAAO,MAAM,CAAA,GAAI,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA;AAEtF,MAAA,IAAI,OAAO,GAAA,EAAK;AACd,QAAA,OAAO,WAAW,IAAA,GACd,cAAA,CAAe,MAAM,CAAA,GACrB,aAAa,GAAG,CAAA;AAAA,MACtB;AACA,MAAA,IAAI,OAAO,IAAA,EAAM;AAGf,QAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,CAAA,CAAA,KAAK,CAAC,YAAA,CAAa,QAAA,CAAS,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA,MACzE;AACA,MAAA,MAAM,MAAA,GAAS,OAAO,GAAA,GAAM,CAAC,MAAc,CAAA,GAAI,CAAA,GAC3C,OAAO,IAAA,GAAO,CAAC,MAAc,CAAA,IAAK,CAAA,GAClC,OAAO,GAAA,GAAM,CAAC,MAAc,CAAA,GAAI,CAAA,GAChC,CAAC,CAAA,KAAc,CAAA,IAAK,CAAA;AACxB,MAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAA6B,MAAA,CAAO,aAAa,OAAA,CAAQ,CAAA,EAAG,QAAQ,CAAC,CAAA;AAQnF,MAAA,OAAO,MAAA,KAAW,IAAA,GACd,EAAE,IAAA,EAAM,eAAA,EAAiB,MAAA,EAAQ,MAAA,EAAQ,EAAA,EAAmC,IAAA,EAAK,GACjF,EAAE,IAAA,EAAM,SAAS,IAAA,EAAK;AAAA,IAC5B;AAGA,IAAA,IAAI,QAAQ,QAAA,CAAS,GAAG,KAAK,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AAClD,MAAA,MAAM,OAAA,GAAU,gBAAgB,OAAO,CAAA;AACvC,MAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,CAAA,CAAA,KAAK,QAAQ,IAAA,CAAK,CAAA,CAAE,MAAA,EAAQ,CAAA,EAAE;AAAA,IAC9D;AAGA,IAAA,MAAMxC,IAAAA,GAAM,WAAW,OAAO,CAAA;AAC9B,IAAA,OAAO,MAAMA,IAAG,CAAA,GAAI,aAAa,OAAO,CAAA,GAAI,eAAeA,IAAG,CAAA;AAAA,EAChE;AAhDO,EAAAwC,cAAAA,CAAS,eAAA,GAAA,eAAA;AAsDhB,EAAA,SAAS,eAAe,CAAA,EAA6B;AACnD,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA;AACpC,IAAA,OAAO,EAAE,IAAA,EAAM,cAAA,EAAgB,MAAA,EAAQ,CAAA,EAAG,IAAA,EAAM,CAAA,CAAA,KAAK,YAAA,CAAa,QAAA,CAAS,CAAA,EAAG,MAAM,CAAA,EAAE;AAAA,EACxF;AAOA,EAAA,SAAS,aAAa,CAAA,EAA6B;AACjD,IAAA,MAAMjC,MAAAA,GAAQ,EAAE,WAAA,EAAY;AAC5B,IAAA,OAAO,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAMA,MAAAA,EAAO,IAAA,EAAM,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,EAAO,CAAE,WAAA,EAAY,KAAMA,MAAAA,EAAM;AAAA,EAC1F;AAGO,EAAA,SAAS,eAAA,CAAgBN,QAAqB,QAAA,EAA2B;AAC9E,IAAA,OAAO,eAAA,CAAgB,QAAQ,CAAA,CAAE,IAAA,CAAKA,MAAK,CAAA;AAAA,EAC7C;AAFO,EAAAuC,cAAAA,CAAS,eAAA,GAAA,eAAA;AAIhB,EAAA,SAAS,gBAAgB,OAAA,EAAyB;AAChD,IAAA,MAAM,OAAA,GAAU,OAAA,CACb,OAAA,CAAQ,mBAAA,EAAqB,MAAM,CAAA,CACnC,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA,CACnB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AACrB,IAAA,OAAO,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,OAAO,KAAK,GAAG,CAAA;AAAA,EACvC;AAAA,CAAA,EAhLe,aAAA,KAAA,aAAA,GAAA,EAAA,CAAA,CAAA;;;ACtGjB,IAAA,MAAA,EAAAC,WAAAA,EAAA,WAAA,EAAA,OAAA,EAAA,yBAAA,EAAA,cAAA,EAAA,WAAA;AAkDO,IAAM,eAAA,GAAN,MAAM,eAAA,CAAe;AAAA,EA+D1B,YACE,KAAA,EACA,UAAA,GAAa,GACb,UAAA,GAAa,CAAA,EACb,YACA,QAAA,EACA;AArEG,IAAA,YAAA,CAAA,IAAA,EAAA,yBAAA,CAAA;AACL,IAAA,YAAA,CAAA,IAAA,EAAS,MAAA,CAAA;AACT,IAAA,YAAA,CAAA,IAAA,EAASA,WAAAA,CAAAA;AACT,IAAA,YAAA,CAAA,IAAA,EAAS,WAAA,CAAA;AAsCT;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,YAAA,CAAA,IAAA,EAAS,SAA4C,EAAC,CAAA;AA6BpD,IAAA,YAAA,CAAA,IAAA,EAAK,MAAA,EAAa,KAAA,CAAA;AAClB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,YAAA,CAAA,IAAA,EAAK,WAAA,EAAc,UAAA,oBAAc,IAAI,GAAA,EAAY,CAAA;AACjD,IAAA,YAAA,CAAA,IAAA,EAAKA,WAAAA,EAAc,YAAY,gBAAA,CAAiB,OAAA,CAAA;AAAA,EAClD;AAAA;AAAA,EA/BA,UAAU,QAAA,EAA2C;AACnD,IAAA,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA,EAC5B;AAAA;AAAA,EAGA,QAAA,GAAiB;AACf,IAAA,YAAA,CAAA,IAAA,EAAK,SAAQ,GAAA,EAAI;AAAA,EACnB;AAAA,EA0BA,IAAI,SAAA,GAA2B;AAAE,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA;AAAA,EAAQ;AAAA;AAAA,EAIrD,aAAa,aAAA,EAAqC;AAChD,IAAA,MAAM,OAAO,aAAA,CAAc,OAAA,CAAQ,KAAA,EAAO,EAAE,EAAE,WAAA,EAAY;AAG1D,IAAA,IAAI,mBAAK,WAAA,CAAA,CAAY,GAAA,CAAI,IAAI,CAAA,SAAU,YAAA,CAAa,QAAA;AACpD,IAAA,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,IAAI,IAAI,CAAA;AAEzB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,YAAA,CAAa,aAAa,CAAA;AAClD,MAAA,OAAO,YAAA,CAAa,eAAe,GAAG,CAAA;AAAA,IACxC,CAAA,SAAE;AACA,MAAA,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,OAAO,IAAI,CAAA;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,cAAA,CAAe,UAAkB,MAAA,EAA8B;AAC7D,IAAA,MAAM,CAAA,GAAIC,aAAa,QAAQ,CAAA;AAC/B,IAAA,MAAM,CAAA,GAAIA,aAAa,MAAM,CAAA;AAC7B,IAAA,OAAO,IAAA,CAAK,sBAAsB,CAAA,CAAE,GAAA,EAAK,EAAE,MAAA,EAAQ,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,MAAM,CAAA;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,qBAAA,CACE,QAAA,EACA,QAAA,EACA,MAAA,EACA,MAAA,EACc;AACd,IAAA,MAAMxC,KAAAA,GAAO,SAAS,QAAA,GAAW,CAAA;AACjC,IAAA,MAAM,IAAA,GAAO,SAAS,QAAA,GAAW,CAAA;AAIjC,IAAA,MAAM,KAAA,GAAQA,KAAAA,GAAO,IAAA,GAAO,CAAA,GAAI,KAAK,UAAA,GAAa,MAAA;AAClD,IAAA,MAAM,WAAW,KAAA,GAAQ,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,IAAA,CAAK,aAAY,GAAI,EAAA;AAC1D,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,MAAM,KAAA,CAAM,GAAA,CAAI,UAAU,QAAA,EAAU,QAAA,EAAU,QAAQ,MAAM,CAAA;AAClE,MAAA,IAAI,GAAA,KAAQ,QAAW,OAAO,GAAA;AAAA,IAChC;AAEA,IAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAWA,KAAAA,EAAM,IAAI,CAAA;AAIrC,IAAA,MAAM,EAAA,GAAK,mBAAK,MAAA,CAAA,CAAO,cAAA;AACvB,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIA,KAAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,UAAA,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,YAAA,CAAa,eAAe,EAAA,CAAG,IAAA,CAAK,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,EAAQ,QAAA,GAAW,CAAA,EAAG,QAAA,GAAW,CAAC,CAAC,CAAC,CAAA;AAAA,QAC7F;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIA,KAAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,UAAA,MAAM,GAAA,GAAMgC,iBAAAA,CAAkB,QAAA,GAAW,CAAA,EAAG,WAAW,CAAC,CAAA;AACxD,UAAA,GAAA,CAAI,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAMjC,MAAAA,GAAQ,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA;AACpC,IAAA,IAAI,KAAA,IAASC,KAAAA,GAAO,CAAA,IAAK,IAAA,GAAO,CAAA,EAAG;AACjC,MAAA,KAAA,CAAM,GAAA,CAAI,UAAU,QAAA,EAAU,QAAA,EAAU,QAAQ,MAAA,EAAQD,MAAAA,EAAOC,QAAO,IAAI,CAAA;AAAA,IAC5E;AACA,IAAA,OAAOD,MAAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,kBAAA,CACE,QAAA,EACA,MAAA,EACA,QAAA,EACA,MAAA,EACc;AACd,IAAA,MAAM,MAAA,GAAS,mBAAK,MAAA,CAAA,CAAO,UAAA;AAC3B,IAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,YAAA,CAAa,QAAA;AACjC,IAAA,IAAI,OAAO,QAAA,KAAa,CAAA,IAAK,OAAO,WAAA,KAAgB,CAAA,SAAU,YAAA,CAAa,KAAA;AAE3E,IAAA,MAAM,KAAK,QAAA,IAAY,CAAA;AACvB,IAAA,MAAM,EAAA,GAAK,UAAU,MAAA,CAAO,QAAA;AAC5B,IAAA,MAAM,KAAK,QAAA,IAAY,CAAA;AACvB,IAAA,MAAM,EAAA,GAAK,UAAU,MAAA,CAAO,WAAA;AAG5B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,OAAO,QAAQ,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,OAAO,WAAW,CAAA;AAC/C,IAAA,IAAI,OAAA,GAAU,EAAA,IAAM,OAAA,GAAU,EAAA,SAAW,YAAA,CAAa,KAAA;AAEtD,IAAA,OAAO,IAAA,CAAK,qBAAA,CAAsB,EAAA,EAAI,EAAA,EAAI,SAAS,OAAO,CAAA;AAAA,EAC5D;AAAA,EAEA,iBAAA,CAAkB,WAAmB,aAAA,EAAqC;AACxE,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAU,OAAO,YAAA,CAAa,QAAA;AACxC,IAAA,IAAI;AACF,MAAA,OAAO,eAAA,CAAA,IAAA,EAAK,yBAAA,EAAA,WAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAe,SAAA,CAAA,CAAW,aAAa,aAAa,CAAA;AAAA,IAC7D,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,YAAA,CAAa,QAAA;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,mBAAA,CAAoB,SAAA,EAAmB,QAAA,EAAkB,MAAA,EAA8B;AACrF,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAU,OAAO,YAAA,CAAa,QAAA;AACxC,IAAA,IAAI;AACF,MAAA,OAAO,sBAAK,yBAAA,EAAA,WAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAe,SAAA,CAAA,CAAW,cAAA,CAAe,UAAU,MAAM,CAAA;AAAA,IAClE,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,YAAA,CAAa,QAAA;AAAA,IACtB;AAAA,EACF;AAAA;AAAA,EAGA,uBAAA,CACE,SAAA,EACA,QAAA,EACA,MAAA,EACA,UACA,MAAA,EACc;AACd,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAU,OAAO,YAAA,CAAa,QAAA;AACxC,IAAA,IAAI;AACF,MAAA,OAAO,eAAA,CAAA,IAAA,EAAK,wCAAL,IAAA,CAAA,IAAA,EAAe,SAAA,CAAA,CAAW,mBAAmB,QAAA,EAAU,MAAA,EAAQ,UAAU,MAAM,CAAA;AAAA,IACxF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,YAAA,CAAa,QAAA;AAAA,IACtB;AAAA,EACF;AAAA,EAkBA,kBAAkB,IAAA,EAA4B;AAE5C,IAAA,MAAM,MAAA,GAAS,eAAA,CAAA,IAAA,EAAK,yBAAA,EAAA,cAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAkB,IAAA,CAAA;AACjC,IAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AAIjC,IAAA,OAAO,KAAK,YAAA,GAAe,IAAA,CAAK,YAAA,CAAa,IAAI,IAAI,YAAA,CAAa,SAAA;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB,SAAA,EAAiC;AACjD,IAAA,MAAM,QAAA,GAAW,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,aAAA,GAAgB,SAAS,CAAA;AACtD,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,YAAA,CAAa,QAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,GAAG,CAAA;AAClC,IAAA,IAAI,KAAA,GAAQ,CAAA,EAAG,OAAO,IAAA,CAAK,aAAa,QAAQ,CAAA;AAChD,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,EAAG,QAAA,CAAS,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAC,CAAA;AAAA,EAChF;AAAA,EAEA,cAAA,CAAe,UAAkB,MAAA,EAAwF;AACvH,IAAA,MAAM,CAAA,GAAIyC,aAAa,QAAQ,CAAA;AAC/B,IAAA,MAAM,CAAA,GAAIA,aAAa,MAAM,CAAA;AAC7B,IAAA,OAAO,EAAE,QAAA,EAAU,CAAA,CAAE,GAAA,EAAK,QAAA,EAAU,CAAA,CAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA,CAAE,GAAA,EAAK,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO;AAAA,EAChF;AAAA;AAAA;AAAA,EAKA,YAAY,IAAA,EAAuB;AACjC,IAAA,OAAO,YAAA,CAAA,IAAA,EAAKD,WAAAA,CAAAA,CAAW,GAAA,CAAI,IAAI,CAAA;AAAA,EACjC;AAAA,EAEA,gBAAA,CAAiB,MAAc,IAAA,EAAmC;AAEhE,IAAA,IAAI,CAAC,YAAA,CAAA,IAAA,EAAKA,WAAAA,CAAAA,CAAW,GAAA,CAAI,IAAI,CAAA,EAAG;AAC9B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAA;AACzC,MAAA,IAAI,MAAM,QAAA,EAAU;AAClB,QAAA,OAAO,KAAA,CAAM,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,OAAK,CAAA,CAAE,QAAA,CAAS,IAAI,CAAC,CAAC,CAAA;AAAA,MAC7D;AAAA,IACF;AACA,IAAA,OAAO,YAAA,CAAA,IAAA,EAAKA,WAAAA,CAAAA,CAAW,OAAA,CAAQ,IAAA,EAAM,MAAM,IAAI,CAAA;AAAA,EACjD;AACF,CAAA;AAtRW,MAAA,GAAA,IAAA,OAAA,EAAA;AACAA,WAAAA,GAAA,IAAA,OAAA,EAAA;AACA,WAAA,GAAA,IAAA,OAAA,EAAA;AAsCA,OAAA,GAAA,IAAA,OAAA,EAAA;AAzCJ,yBAAA,GAAA,IAAA,OAAA,EAAA;AAqDL,cAAA,GAAY,SAAC,IAAA,EAAwC;AACnD,EAAA,IAAI,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AACtC,EAAA,MAAM,GAAA,GAAM,KAAK,WAAA,EAAY;AAC7B,EAAA,KAAA,IAAS,IAAI,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,CAAQ,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACjD,IAAA,MAAM,IAAI,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,CAAQ,CAAC,CAAA,CAAG,IAAI,GAAG,CAAA;AAClC,IAAA,IAAI,CAAA,KAAM,QAAW,OAAO,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,MAAA;AACT,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqKA,WAAA,GAAS,SAAC,SAAA,EAAmC;AAC3C,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAU,YAAA,CAAa,SAAS,CAAA;AACnD,EAAA,MAAM,GAAA,GAAM,IAAI,eAAA,CAAe,KAAA,EAAO,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,EAAa,YAAA,CAAA,IAAA,EAAKA,WAAAA,CAAU,CAAA;AACzG,EAAA,GAAA,CAAI,WAAW,IAAA,CAAK,QAAA;AACpB,EAAA,GAAA,CAAI,aAAa,IAAA,CAAK,UAAA;AACtB,EAAA,OAAO,GAAA;AACT,CAAA;AAxOK,IAAM,cAAA,GAAN;;;AClDP,IAAA,IAAA,EAAA,SAAA,EAAA,KAAA,EAAA,OAAA,EAAA,UAAA;AAUO,IAAM,WAAN,MAAqB;AAAA,EAQ1B,YAAY,QAAA,EAAkB;AAP9B,IAAA,YAAA,CAAA,IAAA,EAAS,IAAA,CAAA;AACT,IAAA,YAAA,CAAA,IAAA,EAAA,SAAA,CAAA;AAEA,IAAA,YAAA,CAAA,IAAA,EAAA,KAAA,EAAU,CAAA,CAAA;AACV,IAAA,YAAA,CAAA,IAAA,EAAA,OAAA,EAAU,CAAA,CAAA;AACV,IAAA,YAAA,CAAA,IAAA,EAAA,UAAA,EAAa,CAAA,CAAA;AAGX,IAAA,IAAI,QAAA,IAAY,CAAA,EAAG,MAAM,IAAI,WAAW,gCAAgC,CAAA;AACxE,IAAA,YAAA,CAAA,IAAA,EAAK,SAAA,EAAY,QAAA,CAAA;AACjB,IAAA,YAAA,CAAA,IAAA,EAAK,IAAA,sBAAW,GAAA,EAAI,CAAA;AAAA,EACtB;AAAA,EAEA,IAAI,QAAA,GAAmB;AAAE,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,SAAA,CAAA;AAAA,EAAW;AAAA,EAChD,IAAI,IAAA,GAAmB;AAAE,IAAA,OAAO,mBAAK,IAAA,CAAA,CAAK,IAAA;AAAA,EAAM;AAAA,EAChD,IAAI,IAAA,GAAmB;AAAE,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA;AAAA,EAAO;AAAA,EAC5C,IAAI,MAAA,GAAmB;AAAE,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA;AAAA,EAAS;AAAA,EAC9C,IAAI,SAAA,GAAmB;AAAE,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,UAAA,CAAA;AAAA,EAAY;AAAA,EACjD,IAAI,OAAA,GAAmB;AACrB,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,GAAQ,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA;AAChC,IAAA,OAAO,KAAA,KAAU,CAAA,GAAI,CAAA,GAAI,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,GAAQ,KAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,GAAA,EAAuB;AACzB,IAAA,MAAMxC,MAAAA,GAAQ,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAC/B,IAAA,IAAIA,WAAU,MAAA,EAAW;AACvB,MAAA,gBAAA,CAAA,IAAA,EAAK,OAAA,CAAA,CAAL,CAAA,EAAA;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAK,OAAO,GAAG,CAAA;AACpB,IAAA,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAK,GAAA,CAAI,GAAA,EAAKA,MAAK,CAAA;AACxB,IAAA,gBAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAL,CAAA,EAAA;AACA,IAAA,OAAOA,MAAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,GAAA,CAAI,KAAQA,MAAAA,EAAgB;AAC1B,IAAA,IAAI,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AAEtB,MAAA,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAK,OAAO,GAAG,CAAA;AAAA,IACtB,CAAA,MAAA,IAAW,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAK,IAAA,IAAQ,mBAAK,SAAA,CAAA,EAAW;AAE3C,MAAA,MAAM,SAAS,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAK,IAAA,EAAK,CAAE,MAAK,CAAE,KAAA;AACvC,MAAA,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAK,OAAO,MAAM,CAAA;AACvB,MAAA,gBAAA,CAAA,IAAA,EAAK,UAAA,CAAA,CAAL,CAAA,EAAA;AAAA,IACF;AACA,IAAA,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAK,GAAA,CAAI,GAAA,EAAKA,MAAK,CAAA;AAAA,EAC1B;AAAA;AAAA,EAGA,OAAO,GAAA,EAAiB;AACtB,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAAA,EAC7B;AAAA;AAAA,EAGA,IAAI,GAAA,EAAiB;AACnB,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAAA,EAC1B;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,YAAA,CAAA,IAAA,EAAK,MAAK,KAAA,EAAM;AAChB,IAAA,YAAA,CAAA,IAAA,EAAK,KAAA,EAAQ,YAAA,CAAA,IAAA,EAAK,OAAA,EAAU,YAAA,CAAA,IAAA,EAAK,UAAA,EAAa,CAAA,CAAA,CAAA,CAAA;AAAA,EAChD;AAAA;AAAA,EAGA,OAAO,WAAA,EAA2B;AAChC,IAAA,IAAI,WAAA,IAAe,CAAA,EAAG,MAAM,IAAI,WAAW,uBAAuB,CAAA;AAClE,IAAA,YAAA,CAAA,IAAA,EAAK,SAAA,EAAY,WAAA,CAAA;AACjB,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAK,IAAA,GAAO,WAAA,EAAa;AACnC,MAAA,MAAM,SAAS,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAK,IAAA,EAAK,CAAE,MAAK,CAAE,KAAA;AACvC,MAAA,YAAA,CAAA,IAAA,EAAK,IAAA,CAAA,CAAK,OAAO,MAAM,CAAA;AACvB,MAAA,gBAAA,CAAA,IAAA,EAAK,UAAA,CAAA,CAAL,CAAA,EAAA;AAAA,IACF;AAAA,EACF;AACF;AAnFW,IAAA,GAAA,IAAA,OAAA,EAAA;AACT,SAAA,GAAA,IAAA,OAAA,EAAA;AAEA,KAAA,GAAA,IAAA,OAAA,EAAA;AACA,OAAA,GAAA,IAAA,OAAA,EAAA;AACA,UAAA,GAAA,IAAA,OAAA,EAAA;;;ACFF,IAAM,sBAAA,GAAyB,GAAA;AAG/B,IAAM,QAAA,GAAW,IAAI,QAAA,CAA8B,sBAAsB,CAAA;AAKlE,SAAS,aAAa,OAAA,EAA8B;AACzD,EAAA,MAAM,QAAA,GAAW,QAAQ,UAAA,CAAW,GAAG,IAAI,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,OAAA;AAC9D,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA;AACpC,EAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AAEjC,EAAA,MAAM,GAAA,GAAM,qBAAqB,QAAQ,CAAA;AACzC,EAAA,QAAA,CAAS,GAAA,CAAI,UAAU,GAAG,CAAA;AAC1B,EAAA,OAAO,GAAA;AACT;AAUO,SAAS,qBAAqB,OAAA,EAA8B;AACjE,EAAA,MAAM,QAAA,GAAW,QAAQ,UAAA,CAAW,GAAG,IAAI,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,OAAA;AAC9D,EAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa,QAAQ,EAAE,QAAA,EAAS;AACnD,EAAA,OAAO,IAAI,aAAA,CAAc,MAAM,CAAA,CAAE,KAAA,EAAM;AACzC;AAGA,IAAM,oBAAA,GAAuB,IAAA;AAuB7B,SAAS,YAAA,CAAa,OAAsB,IAAA,EAA2C;AACrF,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,oBAAc,IAAI,GAAA,EAAY;AACtD,EAAA,MAAM,MAAM,IAAI,cAAA;AAAA,IACd,KAAA;AAAA,IACA,KAAK,UAAA,IAAc,CAAA;AAAA,IACnB,KAAK,UAAA,IAAc,CAAA;AAAA,IACnB;AAAA,GACF;AACA,EAAA,GAAA,CAAI,iBAAiB,IAAA,CAAK,cAAA,IAAkB,EAAE,KAAA,EAAO,CAAA,EAAG,KAAK,oBAAA,EAAqB;AAClF,EAAA,GAAA,CAAI,aAAa,IAAA,CAAK,UAAA;AAEtB,EAAA,MAAM,KAAK,IAAA,CAAK,QAAA;AAChB,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,GAAA,CAAI,QAAA,GAAW,EAAA;AACf,IAAA,IAAI,OAAO,EAAA,CAAG,cAAA,KAAmB,UAAA,EAAY;AAC3C,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,cAAA,oBAAkB,IAAI,GAAA,EAAY;AACzD,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,oBAAiB,IAAI,GAAA,EAA0B;AACrE,MAAA,MAAM,QAAQ,GAAA,CAAI,cAAA;AAClB,MAAA,GAAA,CAAI,YAAA,GAAe,CAAC,IAAA,KAClB,WAAA,CAAY,IAAA,EAAM,OAAO,EAAA,EAAI,UAAA,EAAY,SAAA,EAAW,QAAA,EAAU,KAAK,CAAA;AAAA,IACvE;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAQA,SAAS,YACP,IAAA,EACA,KAAA,EACA,UACA,UAAA,EACA,SAAA,EACA,UACA,cAAA,EACc;AACd,EAAA,MAAM,MAAM,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,aAAa,CAAA,CAAA;AAC/C,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAC/B,EAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AAEjC,EAAA,IAAI,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,SAAU,YAAA,CAAa,QAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,cAAA,CAAgB,IAAA,EAAM,MAAM,IAAI,CAAA;AAC1D,EAAA,IAAI,QAAA,IAAY,IAAA,IAAQ,QAAA,KAAa,EAAA,SAAW,YAAA,CAAa,SAAA;AAE7D,EAAA,SAAA,CAAU,IAAI,GAAG,CAAA;AACjB,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,aAAa,QAAQ,CAAA;AACjC,IAAA,MAAM,GAAA,GAAM,aAAa,KAAA,EAAO;AAAA,MAC9B,QAAA;AAAA,MAAU,UAAA;AAAA,MAAY,cAAA,EAAgB,SAAA;AAAA,MAAW,aAAA,EAAe,QAAA;AAAA,MAAU;AAAA,KAC3E,CAAA;AACD,IAAA,MAAMA,MAAAA,GAAQ,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA;AAG9B,IAAA,IAAIA,MAAAA,CAAM,QAAA,EAAU,QAAA,CAAS,GAAA,CAAI,KAAKA,MAAK,CAAA;AAC3C,IAAA,OAAOA,MAAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,YAAA,CAAa,SAAA;AAAA,EACtB,CAAA,SAAE;AACA,IAAA,SAAA,CAAU,OAAO,GAAG,CAAA;AAAA,EACtB;AACF;AAMO,SAAS,eAAA,CACd,OAAA,EACA,KAAA,EACA,OAAA,EAKc;AACd,EAAA,IAAI,CAAC,OAAA,EAAS,OAAO,YAAA,CAAa,KAAA;AAElC,EAAA,IAAI;AACF,IAAA,OAAO,WAAA,CAAY,YAAA,CAAa,OAAO,CAAA,EAAG,OAAO,OAAO,CAAA;AAAA,EAC1D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,YAAA,CAAa,UAAA;AAAA,EACtB;AACF;AAQO,SAAS,WAAA,CACd,GAAA,EACA,KAAA,EACA,OAAA,EAUc;AACd,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,aAAa,KAAA,EAAO;AAAA,MAC9B,UAAY,OAAA,EAAS,QAAA;AAAA,MACrB,YAAY,OAAA,EAAS,UAAA;AAAA,MACrB,YAAY,OAAA,EAAS,UAAA;AAAA,MACrB,YAAY,OAAA,EAAS;AAAA,KACtB,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,SAAS,GAAG,CAAA;AAAA,EACzB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,YAAA,CAAa,UAAA;AAAA,EACtB;AACF;AAIO,SAAS,aAAA,GAAsB;AACpC,EAAA,QAAA,CAAS,KAAA,EAAM;AACjB;AAEO,SAAS,gBAAA,GAAoF;AAClG,EAAA,OAAO;AAAA,IACL,MAAS,QAAA,CAAS,IAAA;AAAA,IAClB,MAAS,QAAA,CAAS,IAAA;AAAA,IAClB,QAAS,QAAA,CAAS,MAAA;AAAA,IAClB,SAAS,QAAA,CAAS;AAAA,GACpB;AACF;AAEO,SAAS,oBAAoB,QAAA,EAAwB;AAC1D,EAAA,QAAA,CAAS,OAAO,QAAQ,CAAA;AAC1B;;;ACvLA,IAAM,SAAA,GAAY,EAAA;AAClB,IAAM,SAAA,GAAY,EAAA;AAElB,IAAM,mBAAA,GAAsB,EAAA;AAE5B,IAAM,iBAAA,GAAoB,GAAA;AA9B1B,IAAA,QAAA,EAAA,MAAA,EAAA,KAAA,EAAA,WAAA,EAAA,MAAA,EAAA,MAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,SAAA;AAgCO,IAAM,WAAA,GAAN,MAAM,WAAA,CAAW;AAAA,EAkBtB,WAAA,CAAY,WAAmB,iBAAA,EAAmB;AAlB7C,IAAA,YAAA,CAAA,IAAA,EAAA,qBAAA,CAAA;AAEL;AAAA,IAAA,YAAA,CAAA,IAAA,EAAS,QAAA,sBAAe,GAAA,EAA0B,CAAA;AAElD;AAAA,IAAA,YAAA,CAAA,IAAA,EAAS,MAAA,sBAAa,GAAA,EAAyB,CAAA;AAE/C;AAAA,IAAA,YAAA,CAAA,IAAA,EAAS,KAAA,sBAAY,GAAA,EAAyB,CAAA;AAE9C;AAAA,IAAA,YAAA,CAAA,IAAA,EAAS,WAAA,sBAAkB,GAAA,EAAsB,CAAA;AAEjD;AAAA,IAAA,YAAA,CAAA,IAAA,EAAS,MAAA,sBAAa,GAAA,EAAoB,CAAA;AAE1C;AAAA,IAAA,YAAA,CAAA,IAAA,EAAA,MAAA,EAAS,CAAA,CAAA;AACT,IAAA,YAAA,CAAA,IAAA,EAAS,SAAA,CAAA;AAET,IAAA,IAAA,CAAA,IAAA,GAAO,CAAA;AACP,IAAA,IAAA,CAAA,MAAA,GAAS,CAAA;AAGP,IAAA,YAAA,CAAA,IAAA,EAAK,SAAA,EAAY,QAAA,CAAA;AAAA,EACnB;AAAA,EAEA,IAAI,IAAA,GAAe;AAAE,IAAA,OAAO,mBAAK,QAAA,CAAA,CAAS,IAAA;AAAA,EAAM;AAAA,EAChD,IAAI,WAAA,GAAsB;AAAE,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA;AAAA,EAAQ;AAAA,EAEhD,OAAO,GAAA,CAAI,KAAA,EAAe,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AAChF,IAAA,OAAO,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA;AAAA,EACzC;AAAA,EAEA,GAAA,CAAI,KAAA,EAAe,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAsC;AAC3F,IAAA,MAAM,GAAA,GAAM,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,GAAA,CAAI,WAAA,CAAW,GAAA,CAAI,KAAA,EAAO,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAC,CAAA;AACnE,IAAA,IAAI,GAAA,KAAQ,QAAW,IAAA,CAAK,MAAA,EAAA;AAAA,SAAe,IAAA,CAAK,IAAA,EAAA;AAChD,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAGA,IACE,KAAA,EACA,EAAA,EAAY,IAAY,EAAA,EAAY,EAAA,EACpCA,QACA,KAAA,EACM;AACN,IAAA,IAAI,KAAA,IAAS,CAAA,IAAK,KAAA,GAAQ,YAAA,CAAA,IAAA,EAAK,SAAA,CAAA,EAAW;AAE1C,IAAA,MAAM,MAAM,WAAA,CAAW,GAAA,CAAI,OAAO,EAAA,EAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AAChD,IAAA,IAAI,mBAAK,QAAA,CAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG,eAAA,CAAA,IAAA,EAAK,gCAAL,IAAA,CAAA,IAAA,EAAW,GAAA,CAAA;AAEvC,IAAA,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,GAAA,CAAI,GAAA,EAAKA,MAAK,CAAA;AAC5B,IAAA,YAAA,CAAA,IAAA,EAAK,MAAA,EAAL,mBAAK,MAAA,CAAA,GAAU,KAAA,CAAA;AAEf,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,MAAM,WAAY,EAAA,GAAK,SAAA,GAAa,CAAA,EAAG,QAAA,GAAY,KAAK,SAAA,GAAa,CAAA;AACrE,IAAA,MAAM,WAAY,EAAA,GAAK,SAAA,GAAa,CAAA,EAAG,QAAA,GAAY,KAAK,SAAA,GAAa,CAAA;AACrE,IAAA,MAAM,SAAA,GAAA,CAAa,QAAA,GAAW,QAAA,GAAW,CAAA,KAAM,WAAW,QAAA,GAAW,CAAA,CAAA;AAErE,IAAA,IAAI,YAAY,mBAAA,EAAqB;AACnC,MAAA,eAAA,CAAA,IAAA,EAAK,qBAAA,EAAA,SAAA,CAAA,CAAL,WAAa,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,EAAO,OAAO,GAAA,EAAK,OAAA,EAAS,KAAK,KAAK,CAAA,CAAA,CAAA;AAAA,IAC1D,CAAA,MAAO;AACL,MAAA,KAAA,IAAS,EAAA,GAAK,QAAA,EAAU,EAAA,IAAM,QAAA,EAAU,EAAA,EAAA,EAAM;AAC5C,QAAA,KAAA,IAAS,EAAA,GAAK,QAAA,EAAU,EAAA,IAAM,QAAA,EAAU,EAAA,EAAA,EAAM;AAC5C,UAAA,MAAM,SAAS,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA;AACnC,UAAA,eAAA,CAAA,IAAA,EAAK,qBAAA,EAAA,SAAA,CAAA,CAAL,WAAa,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,EAAQ,QAAQ,GAAA,EAAK,OAAA,EAAS,KAAK,MAAM,CAAA,CAAA,CAAA;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AACA,IAAA,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA;AACjC,IAAA,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAI1B,IAAA,IAAI,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,GAAS,YAAA,CAAA,IAAA,EAAK,SAAA,CAAA,EAAW;AAChC,MAAA,KAAA,MAAW,MAAA,IAAU,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,IAAA,EAAK,EAAG;AACzC,QAAA,IAAI,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,IAAU,YAAA,CAAA,IAAA,EAAK,SAAA,CAAA,EAAW;AACnC,QAAA,IAAI,WAAW,GAAA,EAAK;AACpB,QAAA,eAAA,CAAA,IAAA,EAAK,gCAAL,IAAA,CAAA,IAAA,EAAW,MAAA,CAAA;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,cAAA,CAAe,KAAA,EAAeG,IAAAA,EAAa,GAAA,EAAmB;AAhHhE,IAAA,IAAA,EAAA,EAAA,EAAA;AAiHI,IAAA,MAAM,IAAA,GAAO,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,GAAA,CAAI,GAAG,KAAK,CAAA,CAAA,EAAKA,IAAAA,GAAM,SAAA,GAAa,CAAC,CAAA,CAAA,EAAK,GAAA,GAAM,SAAA,GAAa,CAAC,CAAA,CAAE,CAAA;AACzF,IAAA,IAAI,IAAA,EAAM;AAGR,MAAA,KAAA,MAAW,GAAA,IAAO,CAAC,GAAG,IAAI,CAAA,EAAG;AAC3B,QAAA,IAAI,eAAA,CAAA,EAAA,GAAA,WAAA,EAAW,iCAAX,IAAA,CAAA,EAAA,EAAqB,GAAA,EAAK,OAAOA,IAAAA,EAAK,GAAA,CAAA,EAAM,eAAA,CAAA,IAAA,EAAK,qBAAA,EAAA,OAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAW,GAAA,CAAA;AAAA,MAC7D;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA,CAAM,GAAA,CAAI,KAAK,CAAA;AACjC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,KAAA,MAAW,GAAA,IAAO,CAAC,GAAG,IAAI,CAAA,EAAG;AAC3B,QAAA,IAAI,eAAA,CAAA,EAAA,GAAA,WAAA,EAAW,iCAAX,IAAA,CAAA,EAAA,EAAqB,GAAA,EAAK,OAAOA,IAAAA,EAAK,GAAA,CAAA,EAAM,eAAA,CAAA,IAAA,EAAK,qBAAA,EAAA,OAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAW,GAAA,CAAA;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,YAAA,CAAA,IAAA,EAAK,UAAS,KAAA,EAAM;AACpB,IAAA,YAAA,CAAA,IAAA,EAAK,QAAO,KAAA,EAAM;AAClB,IAAA,YAAA,CAAA,IAAA,EAAK,OAAM,KAAA,EAAM;AACjB,IAAA,YAAA,CAAA,IAAA,EAAK,aAAY,KAAA,EAAM;AACvB,IAAA,YAAA,CAAA,IAAA,EAAK,QAAO,KAAA,EAAM;AAClB,IAAA,YAAA,CAAA,IAAA,EAAK,MAAA,EAAS,CAAA,CAAA;AAAA,EAChB;AA0CF,CAAA;AAhJW,QAAA,GAAA,IAAA,OAAA,EAAA;AAEA,MAAA,GAAA,IAAA,OAAA,EAAA;AAEA,KAAA,GAAA,IAAA,OAAA,EAAA;AAEA,WAAA,GAAA,IAAA,OAAA,EAAA;AAEA,MAAA,GAAA,IAAA,OAAA,EAAA;AAET,MAAA,GAAA,IAAA,OAAA,EAAA;AACS,SAAA,GAAA,IAAA,OAAA,EAAA;AAbJ,kBAAA,GAAA,IAAA,OAAA,EAAA;AA0GE,WAAA,GAAS,SAAC,GAAA,EAAa,KAAA,EAAeA,IAAAA,EAAa,GAAA,EAAsB;AAC9E,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAE3B,EAAA,MAAM,IAAI,KAAA,CAAM,MAAA;AAChB,EAAA,MAAM,EAAA,GAAK,CAAC,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,EAAI,EAAA,GAAK,CAAC,KAAA,CAAM,CAAA,GAAI,CAAC,GAAI,EAAA,GAAK,CAAC,MAAM,CAAA,GAAI,CAAC,GAAI,EAAA,GAAK,CAAC,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AACtF,EAAA,IAAI,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,CAAC,EAAE,IAAA,CAAK,GAAG,CAAA,KAAM,KAAA,EAAO,OAAO,KAAA;AACtD,EAAA,OAAOA,QAAO,EAAA,IAAMA,IAAAA,IAAO,EAAA,IAAM,GAAA,IAAO,MAAM,GAAA,IAAO,EAAA;AACvD,CAAA;AAjHK,qBAAA,GAAA,IAAA,OAAA,EAAA;AAmHL,OAAA,GAAK,SAAC,GAAA,EAAmB;AACvB,EAAA,IAAI,CAAC,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,MAAA,CAAO,GAAG,CAAA,EAAG;AAChC,EAAA,YAAA,CAAA,IAAA,EAAK,QAAL,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,IAAU,mBAAK,MAAA,CAAA,CAAO,GAAA,CAAI,GAAG,CAAA,IAAK,CAAA,CAAA,CAAA;AACvC,EAAA,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,OAAO,GAAG,CAAA;AACtB,EAAA,MAAM,OAAA,GAAU,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AACxC,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,KAAA,GAAQ,OAAO,UAAA,CAAW,CAAC,MAAM,GAAA,GAAgB,YAAA,CAAA,IAAA,EAAK,SAAQ,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA;AACzE,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAChC,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA;AAC/B,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,GAAA,CAAI,OAAO,GAAG,CAAA;AACd,MAAA,IAAI,GAAA,CAAI,IAAA,KAAS,CAAA,EAAG,KAAA,CAAM,OAAO,SAAS,CAAA;AAAA,IAC5C;AACA,IAAA,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,OAAO,GAAG,CAAA;AAAA,EAC7B;AACF,CAAA;AAEA,SAAA,GAAO,SACL,KAAA,EACA,SAAA,EACA,QAAA,EACA,SACA,QAAA,EACM;AACN,EAAA,IAAI,GAAA,GAAM,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA;AAC7B,EAAA,IAAI,CAAC,GAAA,EAAK;AAAE,IAAA,GAAA,uBAAU,GAAA,EAAI;AAAG,IAAA,KAAA,CAAM,GAAA,CAAI,WAAW,GAAG,CAAA;AAAA,EAAG;AACxD,EAAA,IAAI,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAA,EAAG;AACvB,EAAA,GAAA,CAAI,IAAI,QAAQ,CAAA;AAChB,EAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA;AACvB,CAAA;AAjJK,YAAA,CAAM,WAAA,EAAN,kBAAA,CAAA;AAAA,IAAM,UAAA,GAAN;ACwBA,SAAS,kBACd,GAAA,EACA,YAAA,EACA,QAAA,GAA6B,gBAAA,CAAiB,SAC9CuC,YAAAA,EACe;AACf,EAAA,MAAM,OAAuB,EAAC;AAC9B,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAElC,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,EAAe,GAAA,KAA8B;AACzD,IAAA,MAAM,EAAE,GAAA,EAAAvC,IAAAA,EAAK,QAAAoB,OAAAA,EAAO,GAAIkB,aAAa,GAAG,CAAA;AACxC,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,CAAM,WAAA,EAAY,EAAG,QAAA,EAAUtC,IAAAA,EAAK,QAAA,EAAUoB,OAAAA,EAAQ,MAAA,EAAQpB,IAAAA,EAAK,MAAA,EAAQoB,OAAAA,EAAO;AAAA,EACpG,CAAA;AACA,EAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,EAAe,QAAA,EAAkB,MAAA,KAAiC;AAC/E,IAAA,MAAM,CAAA,GAAIkB,aAAa,QAAQ,CAAA;AAC/B,IAAA,MAAM,CAAA,GAAIA,aAAa,MAAM,CAAA;AAC7B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,MAAM,WAAA,EAAY;AAAA,MACzB,UAAU,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,GAAA,EAAK,EAAE,GAAG,CAAA;AAAA,MAC/B,UAAU,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,MAAA,EAAQ,EAAE,MAAM,CAAA;AAAA,MACrC,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,GAAA,EAAK,EAAE,GAAG,CAAA;AAAA,MAC7B,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,MAAA,EAAQ,EAAE,MAAM;AAAA,KACrC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAA4B;AACxC,IAAA,IAAI,gBAAgB,iBAAA,EAAmB;AACrC,MAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,YAAA,EAAc,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,IAC9C,CAAA,MAAA,IAAW,gBAAgB,kBAAA,EAAoB;AAC7C,MAAA,IAAA,CAAK,KAAK,KAAA,CAAM,YAAA,EAAc,KAAK,QAAA,EAAU,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IAC3D,CAAA,MAAA,IAAW,gBAAgB,sBAAA,EAAwB;AACjD,MAAA,IAAA,CAAK,KAAK,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,aAAa,CAAC,CAAA;AAAA,IACpD,CAAA,MAAA,IAAW,gBAAgB,uBAAA,EAAyB;AAClD,MAAA,IAAA,CAAK,IAAA,CAAK,MAAM,IAAA,CAAK,SAAA,EAAW,KAAK,QAAA,EAAU,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IAC7D,CAAA,MAAA,IAAW,gBAAgB,sBAAA,EAAwB;AAKjD,MAAA,IAAA,CAAK,IAAA,CAAK;AAAA,QACR,KAAA,EAAA,CAAQ,IAAA,CAAK,SAAA,IAAa,YAAA,EAAc,WAAA,EAAY;AAAA,QACpD,QAAA,EAAU,KAAK,QAAA,IAAY,CAAA;AAAA,QAC3B,MAAA,EAAQ,KAAK,MAAA,IAAUE,cAAAA;AAAA,QACvB,QAAA,EAAU,KAAK,QAAA,IAAY,CAAA;AAAA,QAC3B,MAAA,EAAQ,KAAK,MAAA,IAAUC;AAAA,OACxB,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,gBAAgB,cAAA,EAAgB;AACzC,MAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,IACtB,CAAA,MAAA,IAAW,gBAAgB,kBAAA,EAAoB;AAG7C,MAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,YAAA,EAAc,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,IAC9C,CAAA,MAAA,IAAW,gBAAgB,gBAAA,EAAkB;AAC3C,MAAA,IAAI,QAAA,CAAS,UAAA,CAAW,IAAA,CAAK,YAAY,GAAG,QAAA,GAAW,IAAA;AACvD,MAAA,KAAA,MAAWhC,IAAAA,IAAO,IAAA,CAAK,IAAA,EAAM,IAAA,CAAKA,IAAG,CAAA;AAAA,IACvC,CAAA,MAAA,IAAW,gBAAgB,YAAA,EAAc;AACvC,MAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AACd,MAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,IACjB,CAAA,MAAA,IAAW,gBAAgB,WAAA,EAAa;AACtC,MAAA,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,IACnB,CAAA,MAAA,IAAW,gBAAgB,wBAAA,EAA0B;AACnD,MAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,IACjB;AAAA,EAEF,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAuB;AACzC,IAAA,IAAI,CAAC8B,YAAAA,EAAa;AAClB,IAAA,MAAM,GAAA,GAAM,KAAK,WAAA,EAAY;AAC7B,IAAA,IAAI,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,EAAG;AACxB,IAAA,SAAA,CAAU,IAAI,GAAG,CAAA;AACjB,IAAA,MAAM,QAAA,GAAWA,YAAAA,CAAY,IAAA,EAAM,YAAY,CAAA;AAC/C,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAC,CAAA;AAAA,IAC7B,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AAEA,EAAA,IAAA,CAAK,GAAG,CAAA;AACR,EAAA,OAAO,EAAE,MAAM,QAAA,EAAS;AAC1B;AAGO,SAAS,WAAA,CAAY,GAAA,EAAmB,KAAA,EAAevC,IAAAA,EAAa,GAAA,EAAsB;AAC/F,EAAA,OACE,GAAA,CAAI,KAAA,KAAU,KAAA,IACdA,IAAAA,IAAO,GAAA,CAAI,QAAA,IAAYA,IAAAA,IAAO,GAAA,CAAI,MAAA,IAClC,GAAA,IAAO,GAAA,CAAI,QAAA,IAAY,OAAO,GAAA,CAAI,MAAA;AAEtC;;;ACpHA,IAAM0C,UAAAA,GAAY,EAAA;AAClB,IAAMC,UAAAA,GAAY,EAAA;AAElB,IAAM,iBAAA,GAAoB,EAAA;AAK1B,IAAM,cAAA,GAAiB,EAAA;AAEvB,IAAM,mBAAA,GAAsB,EAAA;AAE5B,IAAM,SAAA,GAAY,CAAC3C,IAAAA,KAAyBA,IAAAA,GAAM0C,UAAAA,GAAa,CAAA;AAC/D,IAAM,SAAA,GAAY,CAAC,GAAA,KAAyB,GAAA,GAAMC,UAAAA,GAAa,CAAA;AA7C/D,IAAA,QAAA,EAAAC,YAAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,OAAA;AA+CO,IAAM,kBAAN,MAAsB;AAAA,EAAtB,WAAA,GAAA;AAAA,IAAA,YAAA,CAAA,IAAA,EAAA,0BAAA,CAAA;AAWL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,YAAA,CAAA,IAAA,EAAS,QAAA,sBAAe,GAAA,EAAyB,CAAA;AAEjD;AAAA,IAAA,YAAA,CAAA,IAAA,EAASA,YAAAA,sBAAkB,GAAA,EAAsB,CAAA;AAAA,EAAA;AAAA;AAAA,EAGjD,GAAA,CAAI,YAAoB,IAAA,EAAqC;AAC3D,IAAA,IAAA,CAAK,OAAO,UAAU,CAAA;AACtB,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AAEvB,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,MAAA,GAAS,GAAA,CAAI,QAAA,GAAW,CAAA;AAC5C,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,MAAA,GAAS,GAAA,CAAI,QAAA,GAAW,CAAA;AAC5C,MAAA,MAAM,QAAA,GAAW,UAAU,GAAA,CAAI,QAAQ,GAAG,QAAA,GAAW,SAAA,CAAU,IAAI,MAAM,CAAA;AACzE,MAAA,MAAM,QAAA,GAAW,UAAU,GAAA,CAAI,QAAQ,GAAG,QAAA,GAAW,SAAA,CAAU,IAAI,MAAM,CAAA;AACzE,MAAA,MAAM,QAAA,GAAW,WAAW,QAAA,GAAW,CAAA;AACvC,MAAA,MAAM,QAAA,GAAW,WAAW,QAAA,GAAW,CAAA;AAIvC,MAAA,IAAI,OAAA,IAAW,cAAA,IAAkB,OAAA,IAAW,OAAA,EAAS;AACnD,QAAA,IAAI,OAAA,GAAU,QAAA,IAAY,mBAAA,IAAuB,QAAA,IAAY,iBAAA,EAAmB;AAC9E,UAAA,KAAA,IAAS,MAAM,GAAA,CAAI,QAAA,EAAU,GAAA,IAAO,GAAA,CAAI,QAAQ,GAAA,EAAA,EAAO;AACrD,YAAA,KAAA,IAAS,EAAA,GAAK,QAAA,EAAU,EAAA,IAAM,QAAA,EAAU,EAAA,EAAA,EAAM;AAC5C,cAAA,eAAA,CAAA,IAAA,EAAK,0BAAA,EAAA,OAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAW,CAAA,EAAA,EAAK,GAAA,CAAI,KAAK,IAAI,GAAG,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,UAAA,EAAY,OAAA,CAAA;AAAA,YACxD;AAAA,UACF;AAAA,QACF,CAAA,MAAO;AACL,UAAA,KAAA,IAAS,MAAM,GAAA,CAAI,QAAA,EAAU,GAAA,IAAO,GAAA,CAAI,QAAQ,GAAA,EAAA,EAAO;AACrD,YAAA,eAAA,CAAA,IAAA,EAAK,0BAAA,EAAA,OAAA,CAAA,CAAL,WAAW,CAAA,EAAA,EAAK,GAAA,CAAI,KAAK,CAAA,CAAA,EAAI,GAAG,IAAI,UAAA,EAAY,OAAA,CAAA;AAAA,UAClD;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,WAAW,cAAA,EAAgB;AAC7B,QAAA,IAAI,OAAA,GAAU,QAAA,IAAY,mBAAA,IAAuB,QAAA,IAAY,iBAAA,EAAmB;AAC9E,UAAA,KAAA,IAAS5C,OAAM,GAAA,CAAI,QAAA,EAAUA,IAAAA,IAAO,GAAA,CAAI,QAAQA,IAAAA,EAAAA,EAAO;AACrD,YAAA,KAAA,IAAS,EAAA,GAAK,QAAA,EAAU,EAAA,IAAM,QAAA,EAAU,EAAA,EAAA,EAAM;AAC5C,cAAA,eAAA,CAAA,IAAA,EAAK,0BAAA,EAAA,OAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAW,CAAA,EAAA,EAAK,GAAA,CAAI,KAAK,IAAIA,IAAG,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,UAAA,EAAY,OAAA,CAAA;AAAA,YACxD;AAAA,UACF;AAAA,QACF,CAAA,MAAO;AACL,UAAA,KAAA,IAASA,OAAM,GAAA,CAAI,QAAA,EAAUA,IAAAA,IAAO,GAAA,CAAI,QAAQA,IAAAA,EAAAA,EAAO;AACrD,YAAA,eAAA,CAAA,IAAA,EAAK,0BAAA,EAAA,OAAA,CAAA,CAAL,WAAW,CAAA,EAAA,EAAK,GAAA,CAAI,KAAK,CAAA,CAAA,EAAIA,IAAG,IAAI,UAAA,EAAY,OAAA,CAAA;AAAA,UAClD;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,QAAA,GAAW,YAAY,iBAAA,EAAmB;AAC5C,QAAA,KAAA,IAAS,EAAA,GAAK,QAAA,EAAU,EAAA,IAAM,QAAA,EAAU,EAAA,EAAA,EAAM;AAC5C,UAAA,KAAA,IAAS,EAAA,GAAK,QAAA,EAAU,EAAA,IAAM,QAAA,EAAU,EAAA,EAAA,EAAM;AAC5C,YAAA,eAAA,CAAA,IAAA,EAAK,0BAAA,EAAA,OAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAW,CAAA,EAAA,EAAK,GAAA,CAAI,KAAK,IAAI,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,UAAA,EAAY,OAAA,CAAA;AAAA,UACvD;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAGA,MAAA,eAAA,CAAA,IAAA,EAAK,qCAAL,IAAA,CAAA,IAAA,EAAW,CAAA,EAAA,EAAK,GAAA,CAAI,KAAK,IAAI,UAAA,EAAY,OAAA,CAAA;AAAA,IAC3C;AACA,IAAA,YAAA,CAAA,IAAA,EAAK4C,YAAAA,CAAAA,CAAY,GAAA,CAAI,UAAA,EAAY,OAAO,CAAA;AAAA,EAC1C;AAAA;AAAA,EAGA,OAAO,UAAA,EAA0B;AAC/B,IAAA,MAAM,OAAA,GAAU,YAAA,CAAA,IAAA,EAAKA,YAAAA,CAAAA,CAAY,GAAA,CAAI,UAAU,CAAA;AAC/C,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,GAAA,GAAM,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AACpC,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,GAAA,CAAI,OAAO,UAAU,CAAA;AACrB,MAAA,IAAI,IAAI,IAAA,KAAS,CAAA,EAAG,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,OAAO,MAAM,CAAA;AAAA,IACjD;AACA,IAAA,YAAA,CAAA,IAAA,EAAKA,YAAAA,CAAAA,CAAY,OAAO,UAAU,CAAA;AAAA,EACpC;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,YAAA,CAAA,IAAA,EAAK,UAAS,KAAA,EAAM;AACpB,IAAA,YAAA,CAAA,IAAA,EAAKA,cAAY,KAAA,EAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAA,CAAW,KAAA,EAAe5C,IAAAA,EAAa,GAAA,EAAa,KAAA,EAA2C;AAC7F,IAAA,MAAM,EAAA,GAAK,UAAUA,IAAG,CAAA;AACxB,IAAA,MAAM,EAAA,GAAK,UAAU,GAAG,CAAA;AACxB,IAAA,eAAA,CAAA,IAAA,EAAK,0BAAA,EAAA,QAAA,CAAA,CAAL,WAAY,CAAA,EAAA,EAAK,KAAK,IAAI,GAAG,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,KAAA,CAAA;AACvC,IAAA,eAAA,CAAA,IAAA,EAAK,sCAAL,IAAA,CAAA,IAAA,EAAY,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,KAAA,CAAA;AACjC,IAAA,eAAA,CAAA,IAAA,EAAK,0BAAA,EAAA,QAAA,CAAA,CAAL,WAAY,CAAA,EAAA,EAAK,KAAK,IAAIA,IAAG,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,KAAA,CAAA;AACvC,IAAA,eAAA,CAAA,IAAA,EAAK,sCAAL,IAAA,CAAA,IAAA,EAAY,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,EAAIA,IAAG,CAAA,CAAA,EAAI,KAAA,CAAA;AACjC,IAAA,eAAA,CAAA,IAAA,EAAK,0BAAA,EAAA,QAAA,CAAA,CAAL,WAAY,CAAA,EAAA,EAAK,KAAK,IAAI,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,KAAA,CAAA;AACtC,IAAA,eAAA,CAAA,IAAA,EAAK,0BAAA,EAAA,QAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAY,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,EAAI,KAAA,CAAA;AAAA,EAC5B;AAcF,CAAA;AApHW,QAAA,GAAA,IAAA,OAAA,EAAA;AAEA4C,YAAAA,GAAA,IAAA,OAAA,EAAA;AAbJ,0BAAA,GAAA,IAAA,OAAA,EAAA;AAmHL,QAAA,GAAM,SAAC,QAAgB,KAAA,EAA2C;AAChE,EAAA,MAAM,GAAA,GAAM,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AACpC,EAAA,IAAI,GAAA,EAAK,KAAA,MAAW,GAAA,IAAO,GAAA,QAAW,GAAG,CAAA;AAC3C,CAAA;AAEA,OAAA,GAAK,SAAC,MAAA,EAAgB,UAAA,EAAoB,OAAA,EAAyB;AACjE,EAAA,IAAI,GAAA,GAAM,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAClC,EAAA,IAAI,CAAC,GAAA,EAAK;AAAE,IAAA,GAAA,uBAAU,GAAA,EAAI;AAAG,IAAA,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA,CAAS,GAAA,CAAI,MAAA,EAAQ,GAAG,CAAA;AAAA,EAAG;AAC7D,EAAA,IAAI,GAAA,CAAI,GAAA,CAAI,UAAU,CAAA,EAAG;AACzB,EAAA,GAAA,CAAI,IAAI,UAAU,CAAA;AAClB,EAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AACrB,CAAA;;;AC3GK,SAAS,0BAA0B,QAAA,EAAyC;AACjF,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,CAAC,KAAA,EAAO,GAAA,KAAQ,SAAS,YAAA,CAAa,KAAK,CAAA,CAAE,YAAA,CAAa,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA,IAI3E,cAAA,EAAgB,CAAC,KAAA,EAAO5C,IAAAA,EAAKoB,OAAAA,KAAW;AACtC,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,YAAA,CAAa,KAAK,CAAA;AACtC,MAAA,OAAO,EAAA,CAAG,cAAA,GACN,EAAA,CAAG,cAAA,CAAepB,IAAAA,EAAKoB,OAAM,CAAA,GAC7B,EAAA,CAAG,YAAA,CAAaU,iBAAAA,CAAkB9B,IAAAA,EAAKoB,OAAM,CAAC,CAAA;AAAA,IACpD,CAAA;AAAA,IACA,aAAA,EAAe,CAAA,KAAA,KAAS,QAAA,CAAS,YAAA,CAAa,KAAK,CAAA,CAAE,UAAA;AAAA,IACrD,YAAA,EAAc,CAAC,KAAA,EAAO,GAAA,EAAKvB,MAAAA,KAAU;AAAE,MAAA,QAAA,CAAS,aAAa,KAAK,CAAA,CAAE,QAAQ,GAAG,CAAA,CAAE,iBAAiBA,MAAK,CAAA;AAAA,IAAG,CAAA;AAAA,IAC1G,cAAA,EAAgB,CAAC,KAAA,EAAO,GAAA,EAAK,OAAA,KAAY;AAAE,MAAA,QAAA,CAAS,aAAa,KAAK,CAAA,CAAE,QAAQ,GAAG,CAAA,CAAE,WAAW,OAAO,CAAA;AAAA,IAAG,CAAA;AAAA,IAC1G,SAAA,EAAW,CAAC,KAAA,EAAO,GAAA,KAAQ;AAAE,MAAA,QAAA,CAAS,aAAa,KAAK,CAAA,CAAE,OAAA,CAAQ,GAAG,EAAE,KAAA,EAAM;AAAA,IAAG,CAAA;AAAA,IAChF,eAAA,EAAiB,CAAC,KAAA,EAAO,GAAA,EAAK,QAAA,KAAa;AAAE,MAAA,QAAA,CAAS,aAAa,KAAK,CAAA,CAAE,QAAQ,GAAG,CAAA,CAAE,YAAY,QAAQ,CAAA;AAAA,IAAG,CAAA;AAAA,IAC9G,cAAA,EAAgB,CAAC,KAAA,EAAO,GAAA,KAAQ,QAAA,CAAS,aAAa,KAAK,CAAA,CAAE,cAAA,GAAiB,GAAG,CAAA,IAAK,IAAA;AAAA,IACtF,aAAA,EAAe,CAAC,KAAA,EAAO,GAAA,KAAQ,QAAA,CAAS,aAAa,KAAK,CAAA,CAAE,aAAA,GAAgB,GAAG,CAAA,IAAK,IAAA;AAAA,IACpF,WAAA,EAAa,CAAC,KAAA,EAAOG,IAAAA,KAAQ,QAAA,CAAS,aAAa,KAAK,CAAA,CAAE,WAAA,GAAcA,IAAG,CAAA,IAAK,KAAA;AAAA,IAChF,gBAAgB,CAAC,IAAA,EAAM,UAAU,QAAA,CAAS,cAAA,CAAe,MAAM,KAAK;AAAA,GACtE;AACF;AA4EA,IAAM,SAAA,GAAY,CAAC,CAAA,KAAsB,CAAA,CAAE,WAAA,EAAY;AACvD,IAAM,OAAA,GAAU,CAAC,CAAA,KAAsB,CAAA,CAAE,QAAQ,KAAA,EAAO,EAAE,EAAE,WAAA,EAAY;AACxE,IAAM,KAAA,GAAQ,CAAC,KAAA,EAAe,GAAA,KAAwB,CAAA,EAAG,SAAA,CAAU,KAAK,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAG,CAAC,CAAA,CAAA;AAGzF,SAAS,SAAS,GAAA,EAAuE;AACvF,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC5B,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA;AAC/B,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,IAAA,GAAO,CAAC,CAAA;AAC9B,EAAA,MAAM,EAAE,GAAA,EAAAA,IAAAA,EAAK,QAAAoB,OAAAA,EAAO,GAAIkB,aAAa,GAAG,CAAA;AACxC,EAAA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,GAAA,EAAAtC,IAAAA,EAAK,KAAKoB,OAAAA,EAAO;AACxC;AA/KA,IAAA,MAAA,EAAA,SAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,WAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,uBAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,cAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,eAAA,EAAA,cAAA,EAAA,aAAA,EAAA,aAAA,EAAA,uBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,oBAAA;AAiLO,IAAM,eAAN,MAAmB;AAAA,EAgCxB,WAAA,CAAY,KAAA,EAAoB,QAAA,GAA6B,gBAAA,CAAiB,OAAA,EAAS;AAhClF,IAAA,YAAA,CAAA,IAAA,EAAA,uBAAA,CAAA;AACL,IAAA,YAAA,CAAA,IAAA,EAAS,MAAA,CAAA;AACT,IAAA,YAAA,CAAA,IAAA,EAAS,SAAA,CAAA;AACT,IAAA,YAAA,CAAA,IAAA,EAAA,SAAA,sBAAgB,GAAA,EAA0B,CAAA;AAE1C;AAAA,IAAA,YAAA,CAAA,IAAA,EAAS,WAAA,sBAAkB,GAAA,EAAoB,CAAA;AAE/C;AAAA,IAAA,YAAA,CAAA,IAAA,EAAA,OAAA,sBAAc,GAAA,EAAyB,CAAA;AAEvC;AAAA,IAAA,YAAA,CAAA,IAAA,EAAS,WAAA,sBAAkB,GAAA,EAAoB,CAAA;AAK/C;AAAA;AAAA;AAAA;AAAA,IAAA,YAAA,CAAA,IAAA,EAAS,WAAA,EAAc,IAAI,eAAA,EAAgB,CAAA;AAK3C;AAAA;AAAA;AAAA;AAAA,IAAA,YAAA,CAAA,IAAA,EAAS,UAAA,sBAAiB,GAAA,EAAY,CAAA;AAEtC;AAAA,IAAA,YAAA,CAAA,IAAA,EAAS,WAAA,sBAAkB,GAAA,EAA2B,CAAA;AACtD,IAAA,YAAA,CAAA,IAAA,EAAA,aAAA,CAAA;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,YAAA,CAAA,IAAA,EAAS,WAAA,EAAc,IAAI,UAAA,EAAW,CAAA;AAGpC,IAAA,YAAA,CAAA,IAAA,EAAK,MAAA,EAAS,KAAA,CAAA;AACd,IAAA,YAAA,CAAA,IAAA,EAAK,SAAA,EAAY,QAAA,CAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2CA,cAAA,CAAe,KAAA,EAAe,GAAA,EAAa,OAAA,EAAiC;AAC1E,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,MAAM,0BAA0B,CAAA;AACxD,IAAA,MAAM,IAAA,GAAO,QAAQ,UAAA,CAAW,GAAG,IAAI,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,OAAA;AAC1D,IAAA,MAAM,CAAA,GAAI,UAAU,KAAK,CAAA;AACzB,IAAA,MAAM,CAAA,GAAI,QAAQ,GAAG,CAAA;AACrB,IAAA,MAAM,EAAE,GAAA,EAAApB,IAAAA,EAAK,QAAAoB,OAAAA,EAAO,GAAIkB,aAAa,CAAC,CAAA;AAEtC,IAAA,MAAM,GAAA,GAAM,qBAAqB,IAAI,CAAA;AACrC,IAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAS,GAAI,iBAAA;AAAA,MACzB,GAAA;AAAA,MACA,CAAA;AAAA,MACA,YAAA,CAAA,IAAA,EAAK,SAAA,CAAA;AAAA,MACL,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,cAAA,GAAiB,CAAC,CAAA,EAAG,EAAA,KAAO,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,cAAA,CAAgB,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,KAC/E;AAEA,IAAA,eAAA,CAAA,IAAA,EAAK,2CAAL,IAAA,CAAA,IAAA,EAAoB,KAAA,CAAA;AACpB,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACtB,IAAA,eAAA,CAAA,IAAA,EAAK,sCAAL,IAAA,CAAA,IAAA,EAAe;AAAA,MACb,KAAA,EAAO,CAAA;AAAA,MAAG,SAAA,EAAW,KAAA;AAAA,MAAO,GAAA,EAAK,CAAA;AAAA,MAAG,GAAA;AAAA,MAAK,GAAA,EAAAtC,IAAAA;AAAA,MAAK,GAAA,EAAKoB,OAAAA;AAAA,MAAQ,OAAA,EAAS,IAAA;AAAA,MAAM,GAAA;AAAA,MAAK,IAAA;AAAA,MAAM;AAAA,KACvF,CAAA;AAMA,IAAA,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,cAAA,GAAiB,KAAA,EAAO,CAAA,EAAG,IAAI,CAAA;AAC3C,IAAA,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,cAAA,CAAe,CAAA,EAAGpB,IAAAA,EAAKoB,OAAM,CAAA;AAG9C,IAAA,OAAO,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,aAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAiB,CAAC,EAAE,KAAA,EAAO,CAAA,EAAG,GAAA,EAAApB,IAAAA,EAAK,GAAA,EAAKoB,OAAAA,EAAQ,CAAA,EAAG,GAAA,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,aACE,OAAA,EACsF;AACtF,IAAA,MAAMmB,YAAAA,GAAc,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,cAAA,GAC5B,CAAC,CAAA,EAAW,EAAA,KAAgB,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,cAAA,CAAgB,CAAA,EAAG,EAAE,CAAA,GAC7D,MAAA;AAEJ,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,MAAM,SAA+D,EAAC;AAEtE,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAK,OAAA,EAAQ,GAAI,KAAA;AAChC,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,MAAM,IAAA,GAAO,QAAQ,UAAA,CAAW,GAAG,IAAI,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,OAAA;AAC1D,MAAA,MAAM,CAAA,GAAI,UAAU,KAAK,CAAA;AACzB,MAAA,MAAM,CAAA,GAAI,QAAQ,GAAG,CAAA;AAErB,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,GAAA,EAAAvC,IAAAA,EAAK,QAAAoB,OAAAA,EAAO,GAAIkB,aAAa,CAAC,CAAA;AACtC,QAAA,MAAM,GAAA,GAAM,qBAAqB,IAAI,CAAA;AACrC,QAAA,MAAM,EAAE,MAAM,QAAA,EAAS,GAAI,kBAAkB,GAAA,EAAK,CAAA,EAAG,YAAA,CAAA,IAAA,EAAK,SAAA,CAAA,EAAWC,YAAW,CAAA;AAChF,QAAA,eAAA,CAAA,IAAA,EAAK,2CAAL,IAAA,CAAA,IAAA,EAAoB,KAAA,CAAA;AACpB,QAAA,eAAA,CAAA,IAAA,EAAK,sCAAL,IAAA,CAAA,IAAA,EAAe;AAAA,UACb,KAAA,EAAO,CAAA;AAAA,UAAG,SAAA,EAAW,KAAA;AAAA,UAAO,GAAA,EAAK,CAAA;AAAA,UAAG,GAAA,EAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAAA,UACnD,GAAA,EAAAvC,IAAAA;AAAA,UAAK,GAAA,EAAKoB,OAAAA;AAAA,UAAQ,OAAA,EAAS,IAAA;AAAA,UAAM,GAAA;AAAA,UAAK,IAAA;AAAA,UAAM;AAAA,SAC9C,CAAA;AACA,QAAA,UAAA,EAAA;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAA,EAAG,CAAA;AAAA,MACrF;AAAA,IACF;AAKA,IAAA,IAAI,UAAA,GAAa,CAAA,EAAG,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,KAAA,EAAM;AAE3C,IAAA,OAAO,EAAE,YAAY,MAAA,EAAO;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,CAAiB,OAAe,GAAA,EAA6B;AAC3D,IAAA,MAAM,CAAA,GAAI,UAAU,KAAK,CAAA;AACzB,IAAA,MAAM,CAAA,GAAI,QAAQ,GAAG,CAAA;AACrB,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACtB,IAAA,IAAI,CAAC,YAAA,CAAA,IAAA,EAAK,SAAA,CAAA,CAAU,IAAI,GAAG,CAAA,SAAU,EAAC;AACtC,IAAA,eAAA,CAAA,IAAA,EAAK,wCAAL,IAAA,CAAA,IAAA,EAAiB,GAAA,CAAA;AACjB,IAAA,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,SAAA,GAAY,KAAA,EAAO,CAAC,CAAA;AAChC,IAAA,MAAM,EAAE,GAAA,EAAApB,IAAAA,EAAK,QAAAoB,OAAAA,EAAO,GAAIkB,aAAa,CAAC,CAAA;AACtC,IAAA,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,cAAA,CAAe,CAAA,EAAGtC,IAAAA,EAAKoB,OAAM,CAAA;AAC9C,IAAA,OAAO,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,aAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAiB,CAAC,EAAE,KAAA,EAAO,CAAA,EAAG,GAAA,EAAApB,IAAAA,EAAK,GAAA,EAAKoB,OAAAA,EAAQ,CAAA,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAA,CAAa,KAAA,EAAe,GAAA,EAAavB,MAAAA,EAAgC;AACvE,IAAA,eAAA,CAAA,IAAA,EAAK,2CAAL,IAAA,CAAA,IAAA,EAAoB,KAAA,CAAA;AACpB,IAAA,MAAM,CAAA,GAAI,UAAU,KAAK,CAAA;AACzB,IAAA,MAAM,CAAA,GAAI,QAAQ,GAAG,CAAA;AACrB,IAAA,MAAM,EAAE,GAAA,EAAAG,IAAAA,EAAK,QAAAoB,OAAAA,EAAO,GAAIkB,aAAa,CAAC,CAAA;AACtC,IAAA,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,YAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAgB,KAAA,EAAO,CAAA,EAAGzC,QAAOG,IAAAA,EAAKoB,OAAAA,CAAAA;AACtC,IAAA,OAAO,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,aAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAiB,CAAC,EAAE,KAAA,EAAO,CAAA,EAAG,GAAA,EAAApB,IAAAA,EAAK,GAAA,EAAKoB,OAAAA,EAAQ,CAAA,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAA,CAAc,OAAe,GAAA,EAA6B;AACxD,IAAA,eAAA,CAAA,IAAA,EAAK,2CAAL,IAAA,CAAA,IAAA,EAAoB,KAAA,CAAA;AACpB,IAAA,MAAM,CAAA,GAAI,UAAU,KAAK,CAAA;AACzB,IAAA,MAAM,CAAA,GAAI,QAAQ,GAAG,CAAA;AACrB,IAAA,MAAM,EAAE,GAAA,EAAApB,IAAAA,EAAK,QAAAoB,OAAAA,EAAO,GAAIkB,aAAa,CAAC,CAAA;AAEtC,IAAA,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,cAAA,CAAe,CAAA,EAAGtC,IAAAA,EAAKoB,OAAM,CAAA;AAC9C,IAAA,OAAO,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,aAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAiB,CAAC,EAAE,KAAA,EAAO,CAAA,EAAG,GAAA,EAAApB,IAAAA,EAAK,GAAA,EAAKoB,OAAAA,EAAQ,CAAA,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BA,UAAU,OAAA,EAIS;AACjB,IAAA,MAAM,QAAQ,OAAA,EAAS,KAAA;AACvB,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,OAAO,eAAA,CAAA,IAAA,EAAK,0CAAL,IAAA,CAAA,IAAA,EAAmB,CAAC,GAAG,YAAA,CAAA,IAAA,EAAK,SAAA,CAAA,CAAU,MAAA,EAAQ,CAAA,CAAA,CAAG,OAAA;AAAA,IAC1D;AAEA,IAAA,MAAM,OAAA,GAAU,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,gBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAoB,KAAA,CAAA;AACpC,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,OAAA,EAAS,eAAA,GAAkB,QAAQ,QAAQ,CAAA;AAG3C,MAAA,OAAO,eAAA,CAAA,IAAA,EAAK,0CAAL,IAAA,CAAA,IAAA,EAAmB,CAAC,GAAG,YAAA,CAAA,IAAA,EAAK,SAAA,CAAA,CAAU,MAAA,EAAQ,CAAA,CAAA,CAAG,OAAA;AAAA,IAC1D;AACA,IAAA,OAAO,OAAA,CAAQ,OAAA;AAAA,EACjB;AAAA;AAAA,EA2DA,aAAA,CAAc,OAAe,GAAA,EAAsC;AACjE,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,WAAU,GAAA,CAAI,KAAA,CAAM,OAAO,GAAG,CAAC,CAAA,EAAG,IAAA,IAAQ,EAAC;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,cAAA,CAAe,KAAA,EAAe,EAAA,EAAYL,MAAAA,GAAQ,CAAA,EAAmB;AACnE,IAAA,OAAO,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,aAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAiB,EAAE,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,KAAA,EAAAA,MAAAA,EAAO,SAAA,EAAW,KAAA,EAAM,CAAA;AAAA,EACpF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aAAA,CAAc,KAAA,EAAe,EAAA,EAAYA,MAAAA,GAAQ,CAAA,EAAmB;AAClE,IAAA,OAAO,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,aAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAiB,EAAE,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,KAAA,EAAAA,MAAAA,EAAO,SAAA,EAAW,KAAA,EAAM,CAAA;AAAA,EACpF;AAAA;AAAA,EAGA,iBAAA,CAAkB,KAAA,EAAe,EAAA,EAAYA,MAAAA,GAAQ,CAAA,EAAmB;AACtE,IAAA,OAAO,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,aAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAiB,EAAE,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,KAAA,EAAAA,MAAAA,EAAO,SAAA,EAAW,KAAA,EAAM,CAAA;AAAA,EACpF;AAAA;AAAA,EAGA,gBAAA,CAAiB,KAAA,EAAe,EAAA,EAAYA,MAAAA,GAAQ,CAAA,EAAmB;AACrE,IAAA,OAAO,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,aAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAiB,EAAE,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,KAAA,EAAAA,MAAAA,EAAO,SAAA,EAAW,KAAA,EAAM,CAAA;AAAA,EACpF;AA6eF;AAj1BW,MAAA,GAAA,IAAA,OAAA,EAAA;AACA,SAAA,GAAA,IAAA,OAAA,EAAA;AACT,SAAA,GAAA,IAAA,OAAA,EAAA;AAES,WAAA,GAAA,IAAA,OAAA,EAAA;AAET,OAAA,GAAA,IAAA,OAAA,EAAA;AAES,WAAA,GAAA,IAAA,OAAA,EAAA;AAKA,WAAA,GAAA,IAAA,OAAA,EAAA;AAKA,UAAA,GAAA,IAAA,OAAA,EAAA;AAEA,WAAA,GAAA,IAAA,OAAA,EAAA;AACT,aAAA,GAAA,IAAA,OAAA,EAAA;AAQS,WAAA,GAAA,IAAA,OAAA,EAAA;AA9BJ,uBAAA,GAAA,IAAA,OAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2CL,YAAA,GAAU,SAAC,SAAA,EAAmB,GAAA,EAAalB,MAAAA,EAAgBG,MAAc,GAAA,EAAoB;AAC3F,EAAA,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,YAAA,CAAa,SAAA,EAAW,GAAA,EAAKH,MAAK,CAAA;AAC9C,EAAA,IAAIG,IAAAA,KAAQ,MAAA,IAAa,GAAA,KAAQ,MAAA,EAAW;AAC1C,IAAA,MAAM,MAAA,GAASsC,aAAa,GAAG,CAAA;AAC/B,IAAAtC,OAAM,MAAA,CAAO,GAAA;AACb,IAAA,GAAA,GAAM,MAAA,CAAO,MAAA;AAAA,EACf;AACA,EAAA,YAAA,CAAA,IAAA,EAAK,aAAY,cAAA,CAAe,SAAA,CAAU,SAAS,CAAA,EAAGA,MAAK,GAAG,CAAA;AAChE,CAAA;AAAA;AAGA,WAAA,GAAS,SAAC,KAAA,EAA2B;AACnC,EAAA,YAAA,CAAA,IAAA,EAAK,SAAA,CAAA,CAAU,GAAA,CAAI,KAAA,CAAM,GAAA,EAAK,KAAK,CAAA;AACnC,EAAA,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,GAAA,CAAI,KAAA,CAAM,GAAA,EAAK,MAAM,IAAI,CAAA;AAC1C,EAAA,IAAI,MAAM,QAAA,EAAU,YAAA,CAAA,IAAA,EAAK,UAAA,CAAA,CAAW,GAAA,CAAI,MAAM,GAAG,CAAA;AAAA,OAC5C,YAAA,CAAA,IAAA,EAAK,UAAA,CAAA,CAAW,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AACvC,CAAA;AAEA,aAAA,GAAW,SAAC,GAAA,EAAmB;AAC7B,EAAA,YAAA,CAAA,IAAA,EAAK,SAAA,CAAA,CAAU,OAAO,GAAG,CAAA;AACzB,EAAA,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,OAAO,GAAG,CAAA;AAC3B,EAAA,YAAA,CAAA,IAAA,EAAK,UAAA,CAAA,CAAW,OAAO,GAAG,CAAA;AAC5B,CAAA;AAEA,gBAAA,GAAc,SAAC,IAAA,EAAoB;AACjC,EAAA,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,GAAA,CAAI,SAAA,CAAU,IAAI,GAAG,IAAI,CAAA;AAC5C,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwMA,gBAAA,GAAc,SAAC,KAAA,EAGb;AACA,EAAA,MAAM,UAA0B,EAAC;AACjC,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,KAAA,MAAW,EAAE,KAAA,EAAO,GAAA,EAAI,IAAK,KAAA,EAAO;AAClC,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA;AAC5B,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACnB,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAA,IAAA,EAAK,SAAA,CAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AACpC,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AAEZ,IAAA,MAAM,OAAA,GAAU,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,cAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAkB,KAAA,CAAA;AAClC,IAAA,OAAA,CAAQ,IAAA,CAAK,QAAQ,MAAM,CAAA;AAC3B,IAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,OAAA,CAAQ,OAAO,CAAA;AAC/B,IAAA,IAAI,OAAA,CAAQ,MAAA,CAAO,KAAA,EAAO,OAAA,GAAU,IAAA;AAGpC,IAAA,IAAI,QAAA;AACJ,IAAA,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,yBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAA6B,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,GAAA,EAAK,KAAA,CAAM,GAAA,EAAK,GAAA,EAAK,KAAA,CAAM,GAAA,IAAO,CAAA,GAAA,KAAO;AAC1F,MAAA,IAAI,QAAA,IAAY,GAAA,CAAI,GAAA,KAAQ,KAAA,CAAM,GAAA,EAAK;AACvC,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,EAAG,QAAA,GAAW,EAAE,SAAA,EAAW,GAAA,CAAI,GAAA,EAAK,SAAA,EAAW,KAAA,CAAM,GAAA,EAAI;AAAA,IAC/E,CAAA,CAAA;AACA,IAAA,IAAI,UAAU,OAAO,EAAE,OAAA,EAAS,IAAI,QAAA,EAAS;AAAA,EAC/C;AAEA,EAAA,MAAM,IAAA,GAAO,CAAC,GAAG,YAAA,CAAA,IAAA,EAAK,WAAU,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,OAAK,CAAC,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,GAAG,CAAC,CAAA;AACtE,EAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,IAAA,MAAM,IAAA,GAAO,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,eAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAmB,IAAA,CAAA;AAChC,IAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,IAAA,CAAK,OAAO,CAAA;AAC5B,IAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,IAAA,CAAK,OAAO,CAAA;AAAA,EAC9B;AAIA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,IAAI,CAAA;AAC9B,IAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,cAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAkB,sBAAK,uBAAA,EAAA,mBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAuB,OAAA,EAAS,SAAA,CAAA,EAAY,SAAA,CAAU,CAAA;AAAA,EAC1F;AAEA,EAAA,OAAO,EAAE,OAAA,EAAQ;AACnB,CAAA;AA6CA,aAAA,GAAW,SAAC,KAAA,EAAiC;AAC3C,EAAA,MAAM,WAAA,GAAc,SAAA,CAAU,KAAA,CAAM,SAAS,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,MAAM,GAAA,KAAQ,KAAA;AACjC,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,EAAA,GAAK,KAAA,CAAM,KAAA,GAAQ,CAAA;AAEzC,EAAA,MAAM,UAA0B,EAAC;AACjC,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AAEpC,EAAA,KAAA,MAAW,CAAA,IAAK,YAAA,CAAA,IAAA,EAAK,SAAA,CAAA,CAAU,MAAA,EAAO,EAAG;AAEvC,IAAA,IAAIA,OAAM,CAAA,CAAE,GAAA;AACZ,IAAA,IAAI,MAAM,CAAA,CAAE,GAAA;AACZ,IAAA,IAAI,CAAA,CAAE,UAAU,WAAA,EAAa;AAC3B,MAAA,MAAM,OAAA,GAAU,UAAA,CAAW,UAAA,GAAaA,IAAAA,GAAM,KAAK,KAAK,CAAA;AACxD,MAAA,IAAI,YAAY,IAAA,EAAM;AACtB,MAAA,IAAI,UAAA,EAAYA,IAAAA,GAAM,OAAA;AAAA,WAAc,GAAA,GAAM,OAAA;AAAA,IAC5C;AAKA,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,KAAK,IAAA,CAAK,CAAA,CAAA,KACzD,CAAA,CAAE,KAAA,KAAU,WAAA,KAAgB,UAAA,GACxB,EAAE,MAAA,IAAU,KAAA,CAAM,EAAA,IAAM,CAAA,CAAE,QAAA,IAAY,OAAA,GACtC,CAAA,CAAE,MAAA,IAAU,KAAA,CAAM,EAAA,IAAM,CAAA,CAAE,QAAA,IAAY,OAAA,CAAQ,CAAA;AAEpD,IAAA,MAAM,YAAY,gBAAA,CAAiB,CAAA,CAAE,OAAA,EAAS,KAAA,EAAO,EAAE,SAAS,CAAA;AAChE,IAAA,MAAM,KAAA,GAAQA,IAAAA,KAAQ,CAAA,CAAE,GAAA,IAAO,QAAQ,CAAA,CAAE,GAAA;AACzC,IAAA,MAAM,MAAM,KAAA,GAAQ8B,iBAAAA,CAAkB9B,IAAAA,EAAK,GAAG,IAAI,CAAA,CAAE,GAAA;AACpD,IAAA,MAAM,MAAM,KAAA,GAAQ,KAAA,CAAM,EAAE,KAAA,EAAO,GAAG,IAAI,CAAA,CAAE,GAAA;AAE5C,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,GAAG,CAAA;AAAA,MACH,GAAA;AAAA,MACA,GAAA;AAAA,MACA,GAAA,EAAAA,IAAAA;AAAA,MACA,GAAA;AAAA,MACA,OAAA,EAAS,SAAA,CAAU,OAAA,GAAU,SAAA,CAAU,OAAO,CAAA,CAAE,OAAA;AAAA;AAAA;AAAA,MAGhD,GAAA,EAAK,SAAA,CAAU,OAAA,GAAU,MAAA,GAAY,CAAA,CAAE,GAAA;AAAA,MACvC,MAAM,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,kBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAsB,CAAA,CAAE,MAAM,KAAA,EAAO,WAAA;AAAA;AAAA;AAAA,KAG5C,CAAA;AACD,IAAA,IAAI,WAAA,IAAe,SAAA,CAAU,WAAA,EAAa,WAAA,CAAY,IAAI,GAAG,CAAA;AAAA,EAC/D;AAGA,EAAA,YAAA,CAAA,IAAA,EAAK,SAAA,sBAAgB,GAAA,EAAI,CAAA;AACzB,EAAA,YAAA,CAAA,IAAA,EAAK,aAAY,KAAA,EAAM;AACvB,EAAA,YAAA,CAAA,IAAA,EAAK,YAAW,KAAA,EAAM;AACtB,EAAA,KAAA,MAAW,CAAA,IAAK,OAAA,EAAS,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,WAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAe,CAAA,CAAA;AAExC,EAAA,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,wBAAA,CAAA,CAAL,WAA4B,KAAA,EAAO,WAAA,CAAA;AAInC,EAAA,YAAA,CAAA,IAAA,EAAK,aAAY,KAAA,EAAM;AAGvB,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA0B;AAC9C,EAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AAC3B,IAAA,MAAM,CAAA,GAAI,YAAA,CAAA,IAAA,EAAK,SAAA,CAAA,CAAU,GAAA,CAAI,CAAC,CAAA;AAC9B,IAAA,IAAI,CAAA,EAAG,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AAAA,EACzB;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,YAAA,CAAA,IAAA,EAAK,SAAA,CAAA,CAAU,MAAA,EAAO,EAAG;AACvC,IAAA,IAAI,EAAE,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,cAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAkB,OAAA,sBAAa,GAAA,EAAI,CAAA;AAC5C,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYA,kBAAA,GAAgB,SACd,IAAA,EACA,KAAA,EACA,WAAA,EACgB;AAChB,EAAA,MAAM,MAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,IAAI,CAAA,CAAE,UAAU,WAAA,EAAa;AAAE,MAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AAAG,MAAA;AAAA,IAAU;AAEtD,IAAA,IAAI,KAAA,CAAM,QAAQ,KAAA,EAAO;AACvB,MAAA,MAAM,OAAO,SAAA,CAAU,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAQ,KAAK,CAAA;AAClD,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,UAAU,IAAA,CAAK,KAAA;AAAA,QACf,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAKwC,cAAc,CAAA;AAAA,QACzC,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,QAAQ,CAAA,CAAE;AAAA,OACX,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAM,OAAO,SAAA,CAAU,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAQ,KAAK,CAAA;AAClD,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,UAAU,IAAA,CAAK,KAAA;AAAA,QACf,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAKC,iBAAiB;AAAA,OAC7C,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT,CAAA;AAAA;AAGA,wBAAA,GAAsB,SAAC,OAAiB,WAAA,EAA2B;AACjE,EAAA,MAAM,YAAA,GAAe,CAAC,GAAA,KAA+B;AACnD,IAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAAzC,MAAK,GAAA,EAAI,GAAI,SAAS,GAAG,CAAA;AACxC,IAAA,IAAI,KAAA,KAAU,aAAa,OAAO,GAAA;AAClC,IAAA,MAAM,IAAI,KAAA,CAAM,GAAA,KAAQ,QAAQ,UAAA,CAAWA,IAAAA,EAAK,KAAK,CAAA,GAAIA,IAAAA;AACzD,IAAA,MAAM,IAAI,KAAA,CAAM,GAAA,KAAQ,QAAQ,UAAA,CAAW,GAAA,EAAK,KAAK,CAAA,GAAI,GAAA;AACzD,IAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,IAAA,EAAM,OAAO,IAAA;AACrC,IAAA,OAAO,KAAA,CAAM,KAAA,EAAO8B,iBAAAA,CAAkB,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,EAC7C,CAAA;AAEA,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAyB;AAC/C,EAAA,YAAA,CAAA,IAAA,EAAK,aAAY,KAAA,EAAM;AAEvB,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,OAAO,CAAA,IAAK,mBAAK,OAAA,CAAA,EAAS;AAC5C,IAAA,MAAM,SAAA,GAAY,aAAa,MAAM,CAAA;AACrC,IAAA,IAAI,cAAc,IAAA,EAAM;AAEtB,MAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,QAAA,MAAM,OAAA,GAAU,aAAa,CAAC,CAAA;AAC9B,QAAA,IAAI,CAAC,OAAA,EAAS;AACd,QAAA,MAAM,IAAA,GAAO,SAAS,OAAO,CAAA;AAC7B,QAAA,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,YAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAgB,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,IAAI,IAAA,CAAK,KAAK,CAAA,IAAK,IAAA,CAAK,OAAO,IAAA,CAAK,GAAA,EAAK,IAAA,EAAM,IAAA,CAAK,KAAK,IAAA,CAAK,GAAA,CAAA;AAAA,MACjG;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,MAAM,OAAA,GAAU,aAAa,CAAC,CAAA;AAC9B,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,UAAA,CAAW,IAAI,OAAO,CAAA;AACtB,MAAA,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,GAAA,CAAI,OAAA,EAAS,SAAS,CAAA;AAAA,IACzC;AACA,IAAA,SAAA,CAAU,GAAA,CAAI,WAAW,UAAU,CAAA;AAAA,EACrC;AAEA,EAAA,YAAA,CAAA,IAAA,EAAK,OAAA,EAAU,SAAA,CAAA;AACjB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcA,aAAA,GAAW,SACT,OACA,UAAA,EACgB;AAChB,EAAA,MAAM,UAA0B,EAAC;AACjC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAIlC,EAAA,IAAI,OAAA,GAAU,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,mBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAuB,KAAA,EAAO,SAAA,CAAA;AAC5C,EAAA,eAAA,CAAA,IAAA,EAAK,0CAAL,IAAA,CAAA,IAAA,EAAmB,OAAA,CAAA;AACnB,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,IAAA,GAAO,YAAA,CAAA,IAAA,EAAK,SAAA,CAAA,CAAU,GAAA,CAAI,UAAU,CAAA;AAC1C,IAAA,IAAI,IAAA,EAAM,OAAA,CAAQ,GAAA,CAAI,UAAA,EAAY,IAAI,CAAA;AAAA,EACxC;AAEA,EAAA,OAAA,CAAQ,KAAK,GAAG,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,cAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAkB,SAAS,SAAA,CAAU,CAAA;AACrD,EAAA,OAAO,OAAA;AACT,CAAA;AAAA;AAGA,cAAA,GAAY,SAAC,SAAoC,SAAA,EAAwC;AACvF,EAAA,MAAM,UAA0B,EAAC;AACjC,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,MAAM,aAAA,GAAgB,YAAA,CAAA,IAAA,EAAK,SAAA,CAAA,CAAU,IAAA,GAAO,CAAA;AAC5C,EAAA,OAAO,OAAA,CAAQ,IAAA,GAAO,CAAA,IAAK,KAAA,EAAA,IAAW,aAAA,EAAe;AACnD,IAAA,MAAM,EAAE,OAAA,EAAS,WAAA,EAAa,OAAA,EAAQ,GAAI,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,eAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAmB,CAAC,GAAG,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAAA;AACjF,IAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,WAAW,CAAA;AAC3B,IAAA,KAAA,MAAW,KAAK,OAAA,CAAQ,IAAA,EAAK,EAAG,SAAA,CAAU,IAAI,CAAC,CAAA;AAC/C,IAAA,OAAA,GAAU,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,mBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAuB,OAAA,EAAS,SAAA,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,OAAA;AACT,CAAA;AAAA;AAGA,eAAA,GAAa,SAAC,OAAA,EAA0C;AACtD,EAAA,KAAA,MAAW,GAAA,IAAO,mBAAK,UAAA,CAAA,EAAY;AACjC,IAAA,MAAM,CAAA,GAAI,YAAA,CAAA,IAAA,EAAK,SAAA,CAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAChC,IAAA,IAAI,CAAA,EAAG,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,CAAC,CAAA;AAAA,EAC3B;AACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,mBAAA,GAAiB,SAAC,OAAiB,SAAA,EAAmD;AACpF,EAAA,MAAM,GAAA,uBAAU,GAAA,EAA0B;AAC1C,EAAA,MAAM,KAAA,GAAkB,CAAC,GAAG,KAAK,CAAA;AACjC,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,KAAA,CAAM,QAAQ,IAAA,EAAA,EAAQ;AAC9C,IAAA,MAAM,IAAA,GAAO,MAAM,IAAI,CAAA;AACvB,IAAA,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,yBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAA6B,IAAA,EAAM,CAAA,GAAA,KAAO;AACxC,MAAA,IAAI,GAAA,CAAI,IAAI,GAAA,CAAI,GAAG,KAAK,SAAA,CAAU,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,EAAG;AAChD,MAAA,GAAA,CAAI,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA;AACpB,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,CAAA;AAAA,IAC7D,CAAA,CAAA;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,yBAAA,GAAuB,SAAC,MAAc,KAAA,EAA4C;AAChF,EAAA,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,WAAW,IAAA,CAAK,KAAA,EAAO,KAAK,GAAA,EAAK,IAAA,CAAK,KAAK,CAAA,GAAA,KAAO;AACjE,IAAA,MAAM,CAAA,GAAI,YAAA,CAAA,IAAA,EAAK,SAAA,CAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAChC,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,KAAA,MAAW,GAAA,IAAO,EAAE,IAAA,EAAM;AACxB,MAAA,IAAI,WAAA,CAAY,KAAK,IAAA,CAAK,KAAA,EAAO,KAAK,GAAA,EAAK,IAAA,CAAK,GAAG,CAAA,EAAG;AAAE,QAAA,KAAA,CAAM,CAAC,CAAA;AAAG,QAAA;AAAA,MAAQ;AAAA,IAC5E;AAAA,EACF,CAAC,CAAA;AACH,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,eAAA,GAAa,SAAC,OAAA,EAAyE;AACrF,EAAA,MAAM,KAAA,uBAAY,GAAA,EAA0B;AAC5C,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAK3C,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAsB;AAC7C,EAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,IAAA,EAAK,EAAG;AAAE,IAAA,QAAA,CAAS,GAAA,CAAI,GAAG,CAAC,CAAA;AAAG,IAAA,UAAA,CAAW,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA;AAAA,EAAG;AAE3E,EAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,yBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAA6B,EAAE,KAAA,EAAO,EAAA,CAAG,KAAA,EAAO,GAAA,EAAK,EAAA,CAAG,GAAA,EAAK,GAAA,EAAK,EAAA,CAAG,GAAA,IAAO,CAAA,GAAA,KAAO;AACjF,MAAA,IAAI,GAAA,CAAI,GAAA,KAAQ,EAAA,CAAG,GAAA,IAAO,CAAC,KAAA,CAAM,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,EAAG;AACpE,MAAA,IAAA,CAAK,GAAA,CAAI,IAAI,GAAG,CAAA;AAChB,MAAA,UAAA,CAAW,IAAI,EAAA,CAAG,GAAG,CAAA,CAAG,IAAA,CAAK,IAAI,GAAG,CAAA;AACpC,MAAA,QAAA,CAAS,GAAA,CAAI,IAAI,GAAA,EAAK,QAAA,CAAS,IAAI,GAAA,CAAI,GAAG,IAAK,CAAC,CAAA;AAAA,IAClD,CAAA,CAAA;AAAA,EACF;AAIA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,QAAA,MAAc,CAAA,KAAM,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AACxD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,KAAA,CAAM,QAAQ,IAAA,EAAA,EAAQ;AAC9C,IAAA,MAAM,CAAA,GAAI,MAAM,IAAI,CAAA;AACpB,IAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACZ,IAAA,KAAA,MAAW,CAAA,IAAK,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,EAAI;AAClC,MAAA,MAAMxB,KAAAA,GAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,GAAK,CAAA;AAChC,MAAA,QAAA,CAAS,GAAA,CAAI,GAAGA,KAAI,CAAA;AACpB,MAAA,IAAIA,KAAAA,KAAS,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AAAA,IAC9B;AAAA,EACF;AAEA,EAAA,MAAM,UAA0B,EAAC;AACjC,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,KAAK,CAAA;AAE7B,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA;AACrB,IAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,GAAE,GAAI,eAAA,CAAA,IAAA,EAAK,yCAAL,IAAA,CAAA,IAAA,EAAkB,CAAA,CAAA;AACjD,IAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AACnB,IAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,EACnB;AAGA,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,KAAA,EAAO;AAC1B,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG;AACpB,IAAA,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,aAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAiB,CAAA,CAAE,GAAA,EAAK,OAAA,CAAA;AACxB,IAAA,MAAMT,MAAAA,GAAQ,YAAA,CAAa,QAAA,CAAS,QAAA,EAAS;AAC7C,IAAA,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,YAAA,CAAA,CAAL,WAAgB,CAAA,CAAE,SAAA,EAAW,EAAE,GAAA,EAAKA,MAAAA,EAAO,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,GAAA,CAAA;AACpD,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,CAAA;AACvD,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,CAAE,SAAA,EAAW,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,KAAA,EAAAA,MAAAA,EAAO,QAAA,EAAU,IAAA,EAAM,CAAA;AAAA,EACxE;AAEA,EAAA,OAAO,EAAE,SAAS,OAAA,EAAQ;AAC5B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,cAAA,GAAY,SAAC,CAAA,EAA8D;AACzE,EAAA,MAAM,YAAY,CAAA,CAAE,GAAA;AACpB,EAAA,MAAM2B,GAAAA,GAAK,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,uBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAA2B,CAAA,CAAA;AACtC,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,YAAY,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,CAAQ,IAAI,SAAS,CAAA,wBAAS,GAAA,EAAY;AAEjE,EAAA,IAAI,CAACA,IAAG,OAAA,EAAS;AACf,IAAA,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,aAAA,CAAA,CAAL,WAAiB,SAAA,EAAW,OAAA,CAAA;AAC5B,IAAA,YAAA,CAAA,IAAA,EAAK,QAAO,eAAA,GAAkB,CAAA,CAAE,SAAA,EAAW,CAAA,CAAE,KAAK,IAAI,CAAA;AACtD,IAAA,MAAM3B,MAAAA,GAAQ2B,IAAG,QAAA,EAAS;AAC1B,IAAA,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,YAAA,CAAA,CAAL,WAAgB,CAAA,CAAE,SAAA,EAAW,EAAE,GAAA,EAAK3B,MAAAA,EAAO,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,GAAA,CAAA;AACpD,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,CAAA;AACvD,IAAA,OAAO,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,CAAA,CAAE,SAAA,EAAW,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,KAAA,EAAAA,MAAAA,EAAM,EAAG,OAAA,EAAQ;AAAA,EACtE;AAEA,EAAA,MAAM,MAAM2B,GAAAA,CAAG,QAAA;AACf,EAAA,MAAM1B,KAAAA,GAAO,GAAA,CAAI,IAAA,EAAM,IAAA,GAAO,GAAA,CAAI,OAAA;AAGlC,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,KAAA,IAAS,KAAK,CAAA,EAAG,EAAA,GAAKA,KAAAA,IAAQ,CAAC,UAAU,EAAA,EAAA,EAAM;AAC7C,IAAA,KAAA,IAAS,KAAK,CAAA,EAAG,EAAA,GAAK,IAAA,IAAQ,CAAC,UAAU,EAAA,EAAA,EAAM;AAC7C,MAAA,IAAI,EAAA,KAAO,CAAA,IAAK,EAAA,KAAO,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAI,CAAA,CAAE,GAAA,GAAM,EAAA,EAAI,CAAA,GAAI,EAAE,GAAA,GAAM,EAAA;AAClC,MAAA,MAAM+C,WAAU,KAAA,CAAM,CAAA,CAAE,OAAOf,iBAAAA,CAAkB,CAAA,EAAG,CAAC,CAAC,CAAA;AACtD,MAAA,IAAI,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,aAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAiBe,QAAAA,EAAS,CAAA,CAAE,SAAA,EAAWf,iBAAAA,CAAkB,CAAA,EAAG,CAAC,CAAA,EAAG,SAAA,EAAW,SAAA,CAAA,EAAY;AACzF,QAAA,QAAA,GAAW,IAAA;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,aAAA,CAAA,CAAL,WAAiB,SAAA,EAAW,OAAA,CAAA;AAC5B,IAAA,YAAA,CAAA,IAAA,EAAK,QAAO,eAAA,GAAkB,CAAA,CAAE,SAAA,EAAW,CAAA,CAAE,KAAK,IAAI,CAAA;AACtD,IAAA,MAAMjC,MAAAA,GAAQ,YAAA,CAAa,KAAA,CAAA,CAAA,aAAwB,CAAE,QAAA,EAAS;AAC9D,IAAA,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,YAAA,CAAA,CAAL,WAAgB,CAAA,CAAE,SAAA,EAAW,EAAE,GAAA,EAAKA,MAAAA,EAAO,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,GAAA,CAAA;AACpD,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,CAAA;AACvD,IAAA,OAAO,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,CAAA,CAAE,SAAA,EAAW,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,KAAA,EAAAA,MAAAA,EAAM,EAAG,OAAA,EAAQ;AAAA,EACtE;AAGA,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,EAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAKC,KAAAA,EAAM,EAAA,EAAA,EAAM;AAChC,IAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,IAAA,EAAM,EAAA,EAAA,EAAM;AAChC,MAAA,MAAM,IAAI,CAAA,CAAE,GAAA,GAAM,EAAA,EAAI,CAAA,GAAI,EAAE,GAAA,GAAM,EAAA;AAClC,MAAA,MAAM,GAAA,GAAMgC,iBAAAA,CAAkB,CAAA,EAAG,CAAC,CAAA;AAClC,MAAA,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,YAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAgB,CAAA,CAAE,SAAA,EAAW,GAAA,EAAK,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,CAAE,QAAA,EAAS,EAAG,CAAA,EAAG,CAAA,CAAA;AACjE,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,CAAE,OAAO,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,CAAA;AAC/C,MAAA,IAAI,EAAA,KAAO,CAAA,IAAK,EAAA,KAAO,CAAA,EAAG;AACxB,QAAA,MAAMe,QAAAA,GAAU,KAAA,CAAM,CAAA,CAAE,KAAA,EAAO,GAAG,CAAA;AAClC,QAAA,QAAA,CAAS,IAAIA,QAAO,CAAA;AACpB,QAAA,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,GAAA,CAAIA,QAAAA,EAAS,SAAS,CAAA;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,UAAU,SAAA,EAAW;AAC9B,IAAA,IAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAA,GAAO,SAAS,MAAM,CAAA;AAC5B,IAAA,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,YAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAgB,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,IAAI,IAAA,CAAK,KAAK,CAAA,IAAK,IAAA,CAAK,OAAO,IAAA,CAAK,GAAA,EAAK,IAAA,EAAM,IAAA,CAAK,KAAK,IAAA,CAAK,GAAA,CAAA;AAC/F,IAAA,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,OAAO,MAAM,CAAA;AAC9B,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,EAClE;AAEA,EAAA,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,CAAQ,GAAA,CAAI,SAAA,EAAW,QAAQ,CAAA;AAEpC,EAAA,MAAM,QAAA,GAAW,CAAA,EAAG,CAAA,CAAE,GAAG,IAAIf,iBAAAA,CAAkB,CAAA,CAAE,GAAA,GAAMhC,KAAAA,GAAO,CAAA,EAAG,CAAA,CAAE,GAAA,GAAM,IAAA,GAAO,CAAC,CAAC,CAAA,CAAA;AAClF,EAAA,YAAA,CAAA,IAAA,EAAK,QAAO,eAAA,GAAkB,CAAA,CAAE,SAAA,EAAW,CAAA,CAAE,KAAK,QAAQ,CAAA;AAC1D,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,EAAE,KAAA,EAAO,CAAA,CAAE,WAAW,GAAA,EAAK,CAAA,CAAE,KAAK,KAAA,EAAO,GAAA,CAAI,IAAI,CAAA,EAAG,CAAC,EAAE,QAAA,EAAS,EAAG,OAAO,EAAE,IAAA,EAAAA,KAAAA,EAAM,IAAA,EAAK,EAAE;AAAA,IACjG;AAAA,GACF;AACF,CAAA;AAAA;AAGA,aAAA,GAAW,SACT+C,QAAAA,EACA,SAAA,EACA,GAAA,EACA,WACA,SAAA,EACS;AAET,EAAA,IAAI,mBAAK,SAAA,CAAA,CAAU,GAAA,CAAIA,QAAO,CAAA,IAAKA,QAAAA,KAAY,WAAW,OAAO,IAAA;AAEjE,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,GAAA,CAAIA,QAAO,CAAA;AAC1C,EAAA,IAAI,KAAA,IAAS,KAAA,KAAU,SAAA,EAAW,OAAO,IAAA;AAEzC,EAAA,IAAI,SAAA,CAAU,GAAA,CAAIA,QAAO,CAAA,EAAG,OAAO,KAAA;AAEnC,EAAA,MAAM,CAAA,GAAI,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,YAAA,CAAa,WAAW,GAAG,CAAA;AACjD,EAAA,OAAO,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,MAAA,IAAa,CAAA,KAAM,EAAA;AAChD,CAAA;AAAA;AAGA,aAAA,GAAW,SAAC,WAAmB,OAAA,EAAyB;AACtD,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,CAAQ,GAAA,CAAI,SAAS,CAAA;AACxC,EAAA,IAAI,CAAC,KAAA,EAAO;AACZ,EAAA,KAAA,MAAWA,YAAW,KAAA,EAAO;AAC3B,IAAA,MAAM,IAAA,GAAO,SAASA,QAAO,CAAA;AAC7B,IAAA,eAAA,CAAA,IAAA,EAAK,uBAAA,EAAA,YAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAgB,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,IAAI,IAAA,CAAK,KAAK,CAAA,IAAK,IAAA,CAAK,OAAO,IAAA,CAAK,GAAA,EAAK,IAAA,EAAM,IAAA,CAAK,KAAK,IAAA,CAAK,GAAA,CAAA;AAC/F,IAAA,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,OAAOA,QAAO,CAAA;AAC/B,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,EAClE;AACA,EAAA,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA,CAAQ,OAAO,SAAS,CAAA;AAC/B,CAAA;AAEA,uBAAA,GAAqB,SAAC,CAAA,EAA+B;AACnD,EAAA,IAAI,CAAC,EAAE,GAAA,EAAK;AAEV,IAAA,IAAI;AACF,MAAA,CAAA,CAAE,GAAA,GAAM,oBAAA,CAAqB,CAAA,CAAE,OAAO,CAAA;AAAA,IACxC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,YAAA,CAAa,UAAA;AAAA,IACtB;AAAA,EACF;AACA,EAAA,OAAO,YAAY,CAAA,CAAE,GAAA,EAAK,sBAAK,uBAAA,EAAA,YAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAgB,EAAE,SAAA,CAAA,EAAY;AAAA,IACtD,QAAA,EAAU,sBAAK,uBAAA,EAAA,oBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AAAA,IACV,YAAY,CAAA,CAAE,GAAA;AAAA,IACd,YAAY,CAAA,CAAE,GAAA;AAAA,IACd,YAAY,YAAA,CAAA,IAAA,EAAK,WAAA;AAAA,GAClB,CAAA;AACH,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,YAAA,GAAU,SAAC,SAAA,EAAkC;AAC3C,EAAA,IAAI,MAAA,GAAS,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,GAAA,CAAI,SAAS,CAAA;AAC3C,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAA,GAAS,eAAA,CAAA,IAAA,EAAK,4CAAL,IAAA,CAAA,IAAA,EAAqB,SAAA,CAAA;AAC9B,IAAA,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,GAAA,CAAI,SAAA,EAAW,MAAM,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,MAAA;AACT,CAAA;AAEA,iBAAA,GAAe,SAAC,SAAA,EAAkC;AAChD,EAAA,MAAM,QAAQ,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA;AACnB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,cAAc,CAAC,GAAA,KAAgB,mBAAK,MAAA,CAAA,CAAO,YAAA,CAAa,WAAW,GAAG,CAAA;AAAA,IACtE,cAAA,EAAgB,KAAA,CAAM,cAAA,GAClB,CAAC7C,IAAAA,EAAaoB,OAAAA,KAAmB,KAAA,CAAM,cAAA,CAAgB,SAAA,EAAWpB,IAAAA,EAAKoB,OAAM,CAAA,GAC7E,MAAA;AAAA;AAAA;AAAA,IAGJ,IAAI,UAAA,GAAa;AACf,MAAA,OAAO,KAAA,CAAM,gBAAgB,SAAS,CAAA;AAAA,IACxC,CAAA;AAAA,IACA,WAAA,EAAa,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,WAAA,GACrB,CAACpB,IAAAA,KAAgB,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,WAAA,CAAa,SAAA,EAAWA,IAAG,CAAA,GACxD,MAAA;AAAA,IACJ,cAAA,EAAgB,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,cAAA,GACxB,CAAC,GAAA,KAAgB,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,cAAA,CAAgB,SAAA,EAAW,GAAG,CAAA,GAC3D,MAAA;AAAA,IACJ,aAAA,EAAe,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,aAAA,GACvB,CAAC,GAAA,KAAgB,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,aAAA,CAAe,SAAA,EAAW,GAAG,CAAA,GAC1D;AAAA,GACN;AACF,CAAA;AAEA,oBAAA,GAAkB,WAAiB;AACjC,EAAA,IAAI,YAAA,CAAA,IAAA,EAAK,aAAA,CAAA,EAAe,OAAO,YAAA,CAAA,IAAA,EAAK,aAAA,CAAA;AACpC,EAAA,MAAM,IAAA,GAAO,IAAA;AACb,EAAA,OAAQ,mBAAK,aAAA,EAAgB;AAAA,IAC3B,IAAI,UAAA,GAAuC;AACzC,MAAA,OAAO,CAAC,GAAG,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,QAAQ,CAAA,CAAE,IAAI,CAAA,CAAA,KAAE;AA3/BpD,QAAA,IAAA,EAAA;AA2/BuD,QAAA,OAAA,eAAA,CAAA,EAAA,GAAA,IAAA,EAAK,uCAAL,IAAA,CAAA,EAAA,EAAgB,CAAA,CAAA;AAAA,MAAA,CAAE,CAAA;AAAA,IACnE,CAAA;AAAA,IACA,YAAA,EAAc,CAAC,IAAA,KAAc;AA7/BnC,MAAA,IAAA,EAAA;AA6/BsC,MAAA,OAAA,eAAA,CAAA,EAAA,GAAA,IAAA,EAAK,uCAAL,IAAA,CAAA,EAAA,EAAgB,IAAA,CAAA;AAAA,IAAA,CAAA;AAAA,IAChD,cAAA,EAAgB,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,cAAA,GACxB,CAAC,IAAA,EAAc,KAAA,KAAmB,YAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,cAAA,CAAgB,IAAA,EAAM,KAAK,CAAA,GACzE;AAAA,GACN,CAAA;AACF,CAAA","file":"index.js","sourcesContent":["/**\n * Discriminated union for formula values.\n * Port of TVE.PureDocs.Excel.Formulas.FormulaValue (C# readonly struct)\n *\n * C# used a value-type struct with LayoutKind.Auto for zero-GC scalar values.\n * TypeScript/JS uses a class with static factory methods and cached singletons.\n * The tradeoff: objects vs structs — acceptable for JS runtimes.\n */\nimport { toOADate } from '@devmm/puredocs-excel';\n\nexport const enum FormulaError {\n None = 0,\n Null = 1,\n Div0 = 2,\n Value = 3,\n Ref = 4,\n Name = 5,\n Num = 6,\n NA = 7,\n Calc = 8,\n Spill = 9,\n}\n\nexport type FormulaValueKind = 'blank' | 'number' | 'text' | 'boolean' | 'error' | 'array' | 'lambda';\n\n/**\n * A callable value produced by LAMBDA. Kept as an opaque interface so\n * formula-value.ts stays decoupled from the AST/context modules.\n */\nexport interface LambdaLike {\n /** Number of declared parameters. */\n readonly arity: number;\n /** Invokes the lambda with the given argument values (runs to completion). */\n call(args: FormulaValue[]): FormulaValue;\n /**\n * Runs the lambda body ONCE in tail-aware mode. Returns either the final value\n * or a TailCall describing the next tail call, so a trampoline can iterate\n * without growing the JS stack. Optional; call() is the fallback.\n */\n step?(args: FormulaValue[]): FormulaValue | TailCall;\n}\n\n/**\n * A pending tail call produced by evaluating a node in tail position. The\n * trampoline in a lambda's call() loops on these instead of recursing.\n */\nexport class TailCall {\n constructor(readonly lambda: LambdaLike, readonly args: FormulaValue[]) {}\n}\n\nexport class FormulaValue {\n readonly kind: FormulaValueKind;\n /** Numeric payload (also used for boolean: 1=true, 0=false). */\n readonly #num: number;\n /** String, ArrayValue, or LambdaLike payload. */\n readonly #obj: string | ArrayValue | LambdaLike | undefined;\n readonly errorCode: FormulaError;\n\n private constructor(\n kind: FormulaValueKind,\n num = 0,\n obj?: string | ArrayValue | LambdaLike,\n errorCode: FormulaError = FormulaError.None,\n ) {\n this.kind = kind;\n this.#num = num;\n this.#obj = obj;\n this.errorCode = errorCode;\n }\n\n // ── Cached singletons ────────────────────────────────────────────────────\n\n static readonly blank = new FormulaValue('blank');\n static readonly zero = new FormulaValue('number', 0);\n static readonly one = new FormulaValue('number', 1);\n static readonly true_ = new FormulaValue('boolean', 1);\n static readonly false_ = new FormulaValue('boolean', 0);\n static readonly emptyString = new FormulaValue('text', 0, '');\n static readonly errorDiv0 = new FormulaValue('error', 0, undefined, FormulaError.Div0);\n static readonly errorValue = new FormulaValue('error', 0, undefined, FormulaError.Value);\n static readonly errorRef = new FormulaValue('error', 0, undefined, FormulaError.Ref);\n static readonly errorName = new FormulaValue('error', 0, undefined, FormulaError.Name);\n static readonly errorNA = new FormulaValue('error', 0, undefined, FormulaError.NA);\n static readonly errorNum = new FormulaValue('error', 0, undefined, FormulaError.Num);\n static readonly errorNull = new FormulaValue('error', 0, undefined, FormulaError.Null);\n\n // ── Static factories ─────────────────────────────────────────────────────\n\n static number(v: number): FormulaValue {\n if (v === 0) return FormulaValue.zero;\n if (v === 1) return FormulaValue.one;\n return new FormulaValue('number', v);\n }\n\n static text(v: string): FormulaValue {\n if (v === '') return FormulaValue.emptyString;\n return new FormulaValue('text', 0, v);\n }\n\n static boolean(v: boolean): FormulaValue {\n return v ? FormulaValue.true_ : FormulaValue.false_;\n }\n\n static error(e: FormulaError): FormulaValue {\n switch (e) {\n case FormulaError.Div0: return FormulaValue.errorDiv0;\n case FormulaError.Value: return FormulaValue.errorValue;\n case FormulaError.Ref: return FormulaValue.errorRef;\n case FormulaError.Name: return FormulaValue.errorName;\n case FormulaError.NA: return FormulaValue.errorNA;\n case FormulaError.Num: return FormulaValue.errorNum;\n case FormulaError.Null: return FormulaValue.errorNull;\n default: return new FormulaValue('error', 0, undefined, e);\n }\n }\n\n static array(a: ArrayValue): FormulaValue {\n return new FormulaValue('array', 0, a);\n }\n\n static lambda(fn: LambdaLike): FormulaValue {\n return new FormulaValue('lambda', 0, fn);\n }\n\n // ── Type checks ──────────────────────────────────────────────────────────\n\n get isBlank(): boolean { return this.kind === 'blank'; }\n get isNumber(): boolean { return this.kind === 'number'; }\n get isText(): boolean { return this.kind === 'text'; }\n get isBoolean(): boolean { return this.kind === 'boolean'; }\n get isError(): boolean { return this.kind === 'error'; }\n get isArray(): boolean { return this.kind === 'array'; }\n get isLambda(): boolean { return this.kind === 'lambda'; }\n get isNumeric(): boolean { return this.kind === 'number' || this.kind === 'boolean' || this.kind === 'blank'; }\n\n // ── Value accessors ──────────────────────────────────────────────────────\n\n get numberValue(): number { return this.#num; }\n get textValue(): string { return (this.#obj as string) ?? ''; }\n get booleanValue(): boolean { return this.#num !== 0; }\n get arrayVal(): ArrayValue { return (this.#obj as ArrayValue) ?? ArrayValue.empty; }\n get lambdaVal(): LambdaLike { return this.#obj as LambdaLike; }\n\n // ── Coercion (Excel semantics, no exceptions) ─────────────────────────────\n\n coerceToNumber(): FormulaValue {\n switch (this.kind) {\n case 'number': return this;\n case 'blank': return FormulaValue.zero;\n case 'boolean': return FormulaValue.number(this.#num);\n case 'error': return this;\n case 'text': {\n const n = parseFloat(this.textValue);\n return isNaN(n) ? FormulaValue.errorValue : FormulaValue.number(n);\n }\n default: return FormulaValue.errorValue;\n }\n }\n\n tryAsDouble(): { ok: true; value: number } | { ok: false } {\n switch (this.kind) {\n case 'number': return { ok: true, value: this.#num };\n case 'blank': return { ok: true, value: 0 };\n case 'boolean': return { ok: true, value: this.#num };\n case 'text': {\n const n = parseFloat(this.textValue);\n return isNaN(n) ? { ok: false } : { ok: true, value: n };\n }\n default: return { ok: false };\n }\n }\n\n coerceToBool(): FormulaValue {\n switch (this.kind) {\n case 'boolean': return this;\n case 'number': return FormulaValue.boolean(this.#num !== 0);\n case 'blank': return FormulaValue.false_;\n case 'error': return this;\n case 'text': {\n const u = this.textValue.toUpperCase();\n if (u === 'TRUE') return FormulaValue.true_;\n if (u === 'FALSE') return FormulaValue.false_;\n return FormulaValue.errorValue;\n }\n default: return FormulaValue.errorValue;\n }\n }\n\n asText(): string {\n switch (this.kind) {\n case 'text': return this.textValue;\n case 'number': return String(this.#num);\n case 'boolean': return this.#num !== 0 ? 'TRUE' : 'FALSE';\n case 'blank': return '';\n case 'error': return FormulaValue.errorToString(this.errorCode);\n case 'lambda': return FormulaValue.errorToString(FormulaError.Calc);\n default: return '';\n }\n }\n\n // ── Comparison (Excel semantics) ─────────────────────────────────────────\n\n static areEqual(a: FormulaValue, b: FormulaValue): boolean {\n if (a.isBlank && b.isBlank) return true;\n if (a.isBlank) {\n if (b.isNumber) return Math.abs(b.numberValue) < 1e-10;\n if (b.isText) return b.textValue === '';\n if (b.isBoolean) return !b.booleanValue;\n return false;\n }\n if (b.isBlank) return FormulaValue.areEqual(b, a);\n if (a.kind !== b.kind) return false;\n switch (a.kind) {\n case 'number': return Math.abs(a.#num - b.#num) < 1e-10;\n case 'boolean': return a.#num === b.#num;\n case 'text': return a.textValue.toUpperCase() === b.textValue.toUpperCase();\n default: return false;\n }\n }\n\n /** Excel-compatible sort order: Number/Blank < Text < Boolean. */\n static compare(a: FormulaValue, b: FormulaValue): number {\n const order = (v: FormulaValue) => v.kind === 'boolean' ? 2 : v.isText ? 1 : 0;\n const oa = order(a), ob = order(b);\n if (oa !== ob) return oa - ob;\n switch (oa) {\n case 0: return (a.isBlank ? 0 : a.numberValue) - (b.isBlank ? 0 : b.numberValue);\n case 1: return a.textValue.toUpperCase() < b.textValue.toUpperCase() ? -1 : a.textValue.toUpperCase() > b.textValue.toUpperCase() ? 1 : 0;\n case 2: return a.#num - b.#num;\n default: return 0;\n }\n }\n\n // ── Error helpers ─────────────────────────────────────────────────────────\n\n static errorToString(e: FormulaError): string {\n const map: Record<FormulaError, string> = {\n [FormulaError.None]: '',\n [FormulaError.Null]: '#NULL!',\n [FormulaError.Div0]: '#DIV/0!',\n [FormulaError.Value]: '#VALUE!',\n [FormulaError.Ref]: '#REF!',\n [FormulaError.Name]: '#NAME?',\n [FormulaError.Num]: '#NUM!',\n [FormulaError.NA]: '#N/A',\n [FormulaError.Calc]: '#CALC!',\n [FormulaError.Spill]: '#SPILL!',\n };\n return map[e] ?? '#ERROR!';\n }\n\n static errorFromString(s: string): FormulaError {\n const map: Record<string, FormulaError> = {\n '#NULL!': FormulaError.Null,\n '#DIV/0!': FormulaError.Div0,\n '#VALUE!': FormulaError.Value,\n '#REF!': FormulaError.Ref,\n '#NAME?': FormulaError.Name,\n '#NUM!': FormulaError.Num,\n '#N/A': FormulaError.NA,\n '#CALC!': FormulaError.Calc,\n '#SPILL!': FormulaError.Spill,\n };\n return map[s] ?? FormulaError.Value;\n }\n\n // ── JS interop ────────────────────────────────────────────────────────────\n\n static fromObjectSync(value: unknown): FormulaValue {\n if (value === null || value === undefined) return FormulaValue.blank;\n if (typeof value === 'number') return isNaN(value) ? FormulaValue.errorValue : FormulaValue.number(value);\n if (typeof value === 'boolean') return FormulaValue.boolean(value);\n if (typeof value === 'string') return value === '' ? FormulaValue.blank : FormulaValue.text(value);\n if (value instanceof Date) {\n return FormulaValue.number(toOADate(value));\n }\n return FormulaValue.text(String(value));\n }\n\n toObject(): unknown {\n switch (this.kind) {\n case 'number': return this.#num;\n case 'text': return this.textValue;\n case 'boolean': return this.booleanValue;\n case 'blank': return null;\n case 'error': return FormulaValue.errorToString(this.errorCode);\n case 'array': return this.arrayVal.toObjectArray();\n case 'lambda': return FormulaValue.errorToString(FormulaError.Calc);\n default: return null;\n }\n }\n\n toString(): string { return this.asText(); }\n}\n\n// ── ArrayValue ────────────────────────────────────────────────────────────────\n\n/**\n * 2D array value for formula results and range data.\n * Port of TVE.PureDocs.Excel.Formulas.ArrayValue (C#)\n */\nexport class ArrayValue {\n static readonly empty = new ArrayValue(0, 0);\n\n readonly #data: FormulaValue[];\n readonly rows: number;\n readonly columns: number;\n\n constructor(rows: number, columns: number) {\n this.rows = rows;\n this.columns = columns;\n this.#data = new Array<FormulaValue>(rows * columns).fill(FormulaValue.blank);\n }\n\n get length(): number { return this.#data.length; }\n\n get(row: number, col: number): FormulaValue {\n if (row < 0 || row >= this.rows || col < 0 || col >= this.columns) {\n return FormulaValue.errorRef;\n }\n return this.#data[row * this.columns + col]!;\n }\n\n set(row: number, col: number, value: FormulaValue): void {\n if (row >= 0 && row < this.rows && col >= 0 && col < this.columns) {\n this.#data[row * this.columns + col] = value;\n }\n }\n\n getFlat(index: number): FormulaValue {\n return index >= 0 && index < this.#data.length\n ? this.#data[index]!\n : FormulaValue.errorRef;\n }\n\n setFlat(index: number, value: FormulaValue): void {\n if (index >= 0 && index < this.#data.length) {\n this.#data[index] = value;\n }\n }\n\n /** Iterate all values in row-major order. */\n values(): Iterable<FormulaValue> { return this.#data; }\n\n toObjectArray(): unknown[] {\n return this.#data.map(v => v.toObject());\n }\n\n /** Create from a flat array (single column). */\n static fromFlat(values: FormulaValue[]): ArrayValue {\n const arr = new ArrayValue(values.length, 1);\n values.forEach((v, i) => arr.setFlat(i, v));\n return arr;\n }\n\n /** Create a 1×1 array wrapping a scalar value (for broadcasting). */\n static fromScalar(value: FormulaValue): ArrayValue {\n const arr = new ArrayValue(1, 1);\n arr.setFlat(0, value);\n return arr;\n }\n\n /** Element-wise broadcasting operation (mirrors ArrayValue.Broadcast in C#). */\n static broadcast(\n a: ArrayValue,\n b: ArrayValue,\n op: (av: FormulaValue, bv: FormulaValue) => FormulaValue,\n ): ArrayValue {\n const rows = Math.max(a.rows, b.rows);\n const cols = Math.max(a.columns, b.columns);\n\n // Validate compatibility\n if ((a.rows !== 1 && b.rows !== 1 && a.rows !== b.rows) ||\n (a.columns !== 1 && b.columns !== 1 && a.columns !== b.columns)) {\n const err = new ArrayValue(rows, cols);\n for (let i = 0; i < err.length; i++) err.setFlat(i, FormulaValue.errorValue);\n return err;\n }\n\n const result = new ArrayValue(rows, cols);\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const av = a.get(r < a.rows ? r : 0, c < a.columns ? c : 0);\n const bv = b.get(r < b.rows ? r : 0, c < b.columns ? c : 0);\n result.set(r, c, op(av, bv));\n }\n }\n return result;\n }\n\n /** Implicit intersection: reduce array to scalar based on formula position. */\n implicitIntersect(formulaRow: number, formulaCol: number, rangeStartRow: number, rangeStartCol: number): FormulaValue {\n if (this.rows === 1 && this.columns === 1) return this.get(0, 0);\n if (this.columns === 1) {\n const offset = formulaRow - rangeStartRow;\n return offset >= 0 && offset < this.rows ? this.get(offset, 0) : FormulaValue.errorValue;\n }\n if (this.rows === 1) {\n const offset = formulaCol - rangeStartCol;\n return offset >= 0 && offset < this.columns ? this.get(0, offset) : FormulaValue.errorValue;\n }\n const ro = formulaRow - rangeStartRow;\n const co = formulaCol - rangeStartCol;\n return ro >= 0 && ro < this.rows && co >= 0 && co < this.columns\n ? this.get(ro, co)\n : FormulaValue.errorValue;\n }\n\n transpose(): ArrayValue {\n const result = new ArrayValue(this.columns, this.rows);\n for (let r = 0; r < this.rows; r++) {\n for (let c = 0; c < this.columns; c++) {\n result.set(c, r, this.get(r, c));\n }\n }\n return result;\n }\n}\n","/**\n * Tokens produced by the formula lexer.\n * Port of TVE.PureDocs.Excel.Formulas.FormulaToken + FormulaTokenType (C#)\n */\n\nexport const enum TokenType {\n Number,\n String,\n Boolean,\n CellReference,\n Colon,\n Function,\n LeftParen,\n RightParen,\n Comma,\n Plus,\n Minus,\n Multiply,\n Divide,\n Power,\n Percent,\n Ampersand,\n Equal,\n NotEqual,\n LessThan,\n LessThanOrEqual,\n GreaterThan,\n GreaterThanOrEqual,\n SheetReference,\n NamedRange,\n SpillReference,\n Exclamation,\n AtSign,\n ErrorLiteral,\n EOF,\n}\n\nexport interface Token {\n readonly type: TokenType;\n readonly value: string;\n readonly position: number;\n}\n\nexport function makeToken(type: TokenType, value: string, position: number): Token {\n return { type, value, position };\n}\n","/**\n * Tokenises an Excel formula string into a sequence of tokens.\n * Full port of TVE.PureDocs.Excel.Formulas.FormulaLexer (C#)\n *\n * Supports:\n * - String literals (\"hello\")\n * - Error literals (#N/A, #REF!, #VALUE!, etc.)\n * - Quoted sheet references ('My Sheet'!A1)\n * - Unquoted sheet references (Sheet1!A1)\n * - _xlfn. prefix stripping\n * - Cell references ($A$1, A1, AA123)\n * - Named ranges\n * - @ implicit intersection operator\n * - All standard operators\n */\nimport { Token, TokenType, makeToken } from './formula-token.js';\n\nexport class FormulaException extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'FormulaException';\n }\n}\n\nconst KNOWN_ERRORS = new Set([\n '#NULL!', '#DIV/0!', '#VALUE!', '#REF!', '#NAME?', '#NUM!', '#N/A', '#CALC!', '#SPILL!',\n]);\n\nexport class FormulaLexer {\n readonly #formula: string;\n #pos = 0;\n\n constructor(formula: string) {\n if (!formula) throw new FormulaException('Formula cannot be empty.');\n this.#formula = formula;\n }\n\n tokenize(): Token[] {\n this.#pos = 0;\n const tokens: Token[] = [];\n\n while (this.#pos < this.#formula.length) {\n this.#skipWhitespace();\n if (this.#pos >= this.#formula.length) break;\n\n const token = this.#readNextToken();\n if (token) tokens.push(token);\n }\n\n tokens.push(makeToken(TokenType.EOF, '', this.#pos));\n return tokens;\n }\n\n // ── Private tokenisers ─────────────────────────────────────────────────────\n\n #readNextToken(): Token | null {\n const c = this.#formula[this.#pos]!;\n\n if (c === '\"') return this.#readString();\n if (c === '#') return this.#readErrorLiteral();\n if (c === \"'\") return this.#readQuotedSheetRef();\n\n if (c === '.' && this.#pos + 1 < this.#formula.length && /\\d/.test(this.#formula[this.#pos + 1]!)) {\n return this.#readNumber();\n }\n if (/\\d/.test(c)) return this.#readNumber();\n if (/[a-zA-Z_$]/.test(c)) return this.#readIdentifier();\n\n return this.#readOperator();\n }\n\n #readString(): Token {\n const start = this.#pos++;\n let value = '';\n\n while (this.#pos < this.#formula.length) {\n const ch = this.#formula[this.#pos];\n if (ch === '\"') {\n this.#pos++;\n if (this.#formula[this.#pos] === '\"') { value += '\"'; this.#pos++; }\n else return makeToken(TokenType.String, value, start);\n } else {\n value += ch;\n this.#pos++;\n }\n }\n throw new FormulaException(`Unterminated string at position ${start}.`);\n }\n\n #readErrorLiteral(): Token {\n const start = this.#pos;\n let raw = '#';\n this.#pos++;\n\n while (this.#pos < this.#formula.length) {\n const ch = this.#formula[this.#pos]!;\n if (/[a-zA-Z0-9/]/.test(ch) || ch === '!' || ch === '?') {\n raw += ch;\n this.#pos++;\n if (ch === '!' || ch === '?') break;\n } else break;\n }\n\n const upper = raw.toUpperCase();\n if (!KNOWN_ERRORS.has(upper)) {\n throw new FormulaException(`Unknown error literal \"${raw}\" at position ${start}.`);\n }\n return makeToken(TokenType.ErrorLiteral, upper, start);\n }\n\n #readQuotedSheetRef(): Token {\n const start = this.#pos++;\n let sheetName = '';\n\n while (this.#pos < this.#formula.length) {\n const ch = this.#formula[this.#pos]!;\n if (ch === \"'\") {\n this.#pos++;\n if (this.#formula[this.#pos] === \"'\") { sheetName += \"'\"; this.#pos++; }\n else {\n if (this.#formula[this.#pos] !== '!') {\n throw new FormulaException(`Expected '!' after quoted sheet name at position ${start}.`);\n }\n this.#pos++; // skip !\n const cellRef = this.#readCellRefChars();\n return makeToken(TokenType.SheetReference, `${sheetName}!${cellRef}`, start);\n }\n } else {\n sheetName += ch;\n this.#pos++;\n }\n }\n throw new FormulaException(`Unterminated quoted sheet name at position ${start}.`);\n }\n\n #readNumber(): Token {\n const start = this.#pos;\n let raw = '';\n let hasDot = false;\n let hasE = false;\n\n while (this.#pos < this.#formula.length) {\n const ch = this.#formula[this.#pos]!;\n if (/\\d/.test(ch)) { raw += ch; this.#pos++; }\n else if (ch === '.' && !hasDot && !hasE) { hasDot = true; raw += ch; this.#pos++; }\n else if ((ch === 'e' || ch === 'E') && !hasE && raw.length > 0) {\n hasE = true; raw += ch; this.#pos++;\n if (this.#formula[this.#pos] === '+' || this.#formula[this.#pos] === '-') {\n raw += this.#formula[this.#pos++];\n }\n } else break;\n }\n\n return makeToken(TokenType.Number, raw, start);\n }\n\n #readIdentifier(): Token {\n const start = this.#pos;\n let raw = '';\n\n while (this.#pos < this.#formula.length) {\n const ch = this.#formula[this.#pos]!;\n if (/[a-zA-Z0-9_$.]/.test(ch)) { raw += ch; this.#pos++; }\n else break;\n }\n\n // Strip _xlfn. prefix\n let upper = raw.toUpperCase();\n if (upper.startsWith('_XLFN.')) { raw = raw.slice(6); upper = upper.slice(6); }\n\n if (upper === 'TRUE') return makeToken(TokenType.Boolean, 'TRUE', start);\n if (upper === 'FALSE') return makeToken(TokenType.Boolean, 'FALSE', start);\n\n // Sheet reference: Identifier!CellRef\n if (this.#formula[this.#pos] === '!') {\n this.#pos++; // skip !\n const cellRef = this.#readCellRefChars();\n return makeToken(TokenType.SheetReference, `${raw}!${cellRef}`, start);\n }\n\n // Function: Identifier followed by (\n this.#skipWhitespace();\n if (this.#formula[this.#pos] === '(') {\n return makeToken(TokenType.Function, upper, start);\n }\n\n // Cell reference or named range\n const stripped = raw.replace(/\\$/g, '');\n if (isCellRef(stripped)) {\n // Spill-range operator: A1# refers to the array that spills from A1.\n if (this.#formula[this.#pos] === '#') {\n this.#pos++; // consume '#'\n return makeToken(TokenType.SpillReference, stripped, start);\n }\n return makeToken(TokenType.CellReference, stripped, start);\n }\n return makeToken(TokenType.NamedRange, raw, start);\n }\n\n #readCellRefChars(): string {\n let ref = '';\n while (this.#pos < this.#formula.length) {\n const ch = this.#formula[this.#pos]!;\n if (/[a-zA-Z0-9$]/.test(ch)) { ref += ch; this.#pos++; }\n else break;\n }\n return ref.replace(/\\$/g, '');\n }\n\n #readOperator(): Token {\n const start = this.#pos;\n const ch = this.#formula[this.#pos++]!;\n\n switch (ch) {\n case '(': return makeToken(TokenType.LeftParen, '(', start);\n case ')': return makeToken(TokenType.RightParen, ')', start);\n case ',': return makeToken(TokenType.Comma, ',', start);\n case ':': return makeToken(TokenType.Colon, ':', start);\n case '+': return makeToken(TokenType.Plus, '+', start);\n case '-': return makeToken(TokenType.Minus, '-', start);\n case '*': return makeToken(TokenType.Multiply, '*', start);\n case '/': return makeToken(TokenType.Divide, '/', start);\n case '^': return makeToken(TokenType.Power, '^', start);\n case '%': return makeToken(TokenType.Percent, '%', start);\n case '&': return makeToken(TokenType.Ampersand, '&', start);\n case '=': return makeToken(TokenType.Equal, '=', start);\n case '@': return makeToken(TokenType.AtSign, '@', start);\n case '!': return makeToken(TokenType.Exclamation,'!', start);\n case '<':\n if (this.#formula[this.#pos] === '>') { this.#pos++; return makeToken(TokenType.NotEqual, '<>', start); }\n if (this.#formula[this.#pos] === '=') { this.#pos++; return makeToken(TokenType.LessThanOrEqual, '<=', start); }\n return makeToken(TokenType.LessThan, '<', start);\n case '>':\n if (this.#formula[this.#pos] === '=') { this.#pos++; return makeToken(TokenType.GreaterThanOrEqual, '>=', start); }\n return makeToken(TokenType.GreaterThan, '>', start);\n default:\n throw new FormulaException(`Unexpected character '${ch}' at position ${start}.`);\n }\n }\n\n #skipWhitespace(): void {\n while (this.#pos < this.#formula.length && /\\s/.test(this.#formula[this.#pos]!)) {\n this.#pos++;\n }\n }\n}\n\nfunction isCellRef(s: string): boolean {\n if (s.length < 2) return false;\n let i = 0;\n while (i < s.length && /[a-zA-Z]/.test(s[i]!)) i++;\n if (i === 0 || i >= s.length) return false;\n while (i < s.length && /\\d/.test(s[i]!)) i++;\n return i === s.length;\n}\n","/**\n * AST node types for formula expressions.\n * Port of TVE.PureDocs.Excel.Formulas.FormulaNode (C#)\n */\nimport { FormulaValue, FormulaError, ArrayValue, TailCall } from './formula-value.js';\nimport type { FormulaContext } from './formula-context.js';\n\n// ── Base ───────────────────────────────────────────────────────────────────\n\nexport abstract class FormulaNode {\n abstract evaluate(ctx: FormulaContext): FormulaValue;\n\n /**\n * Evaluates this node in tail position. Returns a TailCall when the node's\n * value is a call to a lambda in tail position (so the caller's trampoline can\n * iterate without growing the stack); otherwise the final value. The default\n * is a plain evaluate — only control-flow and call nodes override it.\n */\n evaluateTail(ctx: FormulaContext): FormulaValue | TailCall {\n return this.evaluate(ctx);\n }\n}\n\n// ── Literals ───────────────────────────────────────────────────────────────\n\nexport class NumberNode extends FormulaNode {\n constructor(readonly value: number) { super(); }\n evaluate(): FormulaValue { return FormulaValue.number(this.value); }\n}\n\nexport class StringNode extends FormulaNode {\n constructor(readonly value: string) { super(); }\n evaluate(): FormulaValue { return FormulaValue.text(this.value); }\n}\n\nexport class BooleanNode extends FormulaNode {\n constructor(readonly value: boolean) { super(); }\n evaluate(): FormulaValue { return FormulaValue.boolean(this.value); }\n}\n\nexport class ErrorNode extends FormulaNode {\n constructor(readonly errorValue: FormulaValue) { super(); }\n evaluate(): FormulaValue { return this.errorValue; }\n}\n\n/** Represents an empty/omitted argument in a function call (e.g. IF(A1,,0)). */\nexport class BlankNode extends FormulaNode {\n evaluate(): FormulaValue { return FormulaValue.blank; }\n}\n\n// ── References ────────────────────────────────────────────────────────────\n\nexport class CellReferenceNode extends FormulaNode {\n constructor(readonly reference: string) { super(); }\n evaluate(ctx: FormulaContext): FormulaValue {\n return ctx.getCellValue(this.reference);\n }\n}\n\nexport class RangeReferenceNode extends FormulaNode {\n constructor(readonly startRef: string, readonly endRef: string) { super(); }\n evaluate(ctx: FormulaContext): FormulaValue {\n return ctx.getRangeValues(this.startRef, this.endRef);\n }\n}\n\nexport class SheetCellReferenceNode extends FormulaNode {\n constructor(readonly sheetName: string, readonly cellReference: string) { super(); }\n evaluate(ctx: FormulaContext): FormulaValue {\n return ctx.getSheetCellValue(this.sheetName, this.cellReference);\n }\n}\n\nexport class SheetRangeReferenceNode extends FormulaNode {\n constructor(\n readonly sheetName: string,\n readonly startRef: string,\n readonly endRef: string,\n ) { super(); }\n evaluate(ctx: FormulaContext): FormulaValue {\n return ctx.getSheetRangeValues(this.sheetName, this.startRef, this.endRef);\n }\n}\n\n/**\n * A whole-column (`A:A`, `$B:$D`) or whole-row (`1:1`, `3:7`) reference,\n * optionally sheet-qualified (`Sheet1!A:A`).\n *\n * Exactly one dimension is bounded: a column range fixes the columns and leaves\n * the rows open, a row range the reverse. The open dimension is resolved against\n * the sheet's used range at evaluation time rather than baked in as 1..1048576 —\n * expanding it eagerly would turn `SUM(A:A)` on a twelve-row sheet into a\n * million-cell read, and Excel's own answer is the used range too.\n */\nexport class FullRangeReferenceNode extends FormulaNode {\n constructor(\n readonly startCol: number | null,\n readonly endCol: number | null,\n readonly startRow: number | null,\n readonly endRow: number | null,\n readonly sheetName?: string,\n ) { super(); }\n\n evaluate(ctx: FormulaContext): FormulaValue {\n return this.sheetName === undefined\n ? ctx.getFullRangeValues(this.startCol, this.endCol, this.startRow, this.endRow)\n : ctx.getSheetFullRangeValues(this.sheetName, this.startCol, this.endCol, this.startRow, this.endRow);\n }\n}\n\nexport class NamedRangeNode extends FormulaNode {\n constructor(readonly name: string) { super(); }\n evaluate(ctx: FormulaContext): FormulaValue {\n return ctx.resolveNamedRange(this.name);\n }\n}\n\n/** Spill-range reference (A1#): the array that spills from an anchor cell. */\nexport class SpillReferenceNode extends FormulaNode {\n constructor(readonly anchorRef: string) { super(); }\n evaluate(ctx: FormulaContext): FormulaValue {\n return ctx.resolveSpillRange(this.anchorRef);\n }\n}\n\n// ── Operators ─────────────────────────────────────────────────────────────\n\nexport const enum BinaryOperator {\n Add, Subtract, Multiply, Divide, Power,\n Concatenate,\n Equal, NotEqual, LessThan, LessThanOrEqual, GreaterThan, GreaterThanOrEqual,\n}\n\nexport const enum UnaryOperator {\n Negate, Plus, Percent,\n}\n\nexport class BinaryOpNode extends FormulaNode {\n constructor(\n readonly left: FormulaNode,\n readonly op: BinaryOperator,\n readonly right: FormulaNode,\n ) { super(); }\n\n evaluate(ctx: FormulaContext): FormulaValue {\n const l = this.left.evaluate(ctx);\n const r = this.right.evaluate(ctx);\n\n // Array broadcasting\n if (l.isArray || r.isArray) {\n const la = l.isArray ? l.arrayVal : ArrayValue.fromScalar(l);\n const ra = r.isArray ? r.arrayVal : ArrayValue.fromScalar(r);\n return FormulaValue.array(\n ArrayValue.broadcast(la, ra, (a, b) => this.#evalScalar(a, b)),\n );\n }\n\n return this.#evalScalar(l, r);\n }\n\n #evalScalar(l: FormulaValue, r: FormulaValue): FormulaValue {\n const op = this.op;\n\n // Comparisons\n if (op === BinaryOperator.Equal) return FormulaValue.boolean(FormulaValue.areEqual(l, r));\n if (op === BinaryOperator.NotEqual) return FormulaValue.boolean(!FormulaValue.areEqual(l, r));\n if (op === BinaryOperator.LessThan) return FormulaValue.boolean(FormulaValue.compare(l, r) < 0);\n if (op === BinaryOperator.LessThanOrEqual) return FormulaValue.boolean(FormulaValue.compare(l, r) <= 0);\n if (op === BinaryOperator.GreaterThan) return FormulaValue.boolean(FormulaValue.compare(l, r) > 0);\n if (op === BinaryOperator.GreaterThanOrEqual) return FormulaValue.boolean(FormulaValue.compare(l, r) >= 0);\n\n // Concatenation\n if (op === BinaryOperator.Concatenate) {\n if (l.isError) return l;\n if (r.isError) return r;\n return FormulaValue.text(l.asText() + r.asText());\n }\n\n // Arithmetic — coerce to numbers\n const ln = l.coerceToNumber();\n if (ln.isError) return ln;\n const rn = r.coerceToNumber();\n if (rn.isError) return rn;\n\n const lv = ln.numberValue;\n const rv = rn.numberValue;\n\n switch (op) {\n case BinaryOperator.Add: return FormulaValue.number(lv + rv);\n case BinaryOperator.Subtract: return FormulaValue.number(lv - rv);\n case BinaryOperator.Multiply: return FormulaValue.number(lv * rv);\n case BinaryOperator.Divide:\n if (rv === 0) return FormulaValue.errorDiv0;\n return FormulaValue.number(lv / rv);\n case BinaryOperator.Power:\n return FormulaValue.number(Math.pow(lv, rv));\n default:\n return FormulaValue.errorValue;\n }\n }\n}\n\nexport class UnaryOpNode extends FormulaNode {\n constructor(readonly op: UnaryOperator, readonly operand: FormulaNode) { super(); }\n\n evaluate(ctx: FormulaContext): FormulaValue {\n const val = this.operand.evaluate(ctx);\n\n if (this.op === UnaryOperator.Plus) {\n return val.coerceToNumber();\n }\n if (this.op === UnaryOperator.Negate) {\n const n = val.coerceToNumber();\n if (n.isError) return n;\n return FormulaValue.number(-n.numberValue);\n }\n if (this.op === UnaryOperator.Percent) {\n const n = val.coerceToNumber();\n if (n.isError) return n;\n return FormulaValue.number(n.numberValue / 100);\n }\n return FormulaValue.errorValue;\n }\n}\n\n/** @ implicit intersection operator (Excel 365). */\nexport class ImplicitIntersectionNode extends FormulaNode {\n constructor(readonly inner: FormulaNode) { super(); }\n\n evaluate(ctx: FormulaContext): FormulaValue {\n const val = this.inner.evaluate(ctx);\n if (!val.isArray) return val;\n return val.arrayVal.implicitIntersect(ctx.formulaRow, ctx.formulaCol, 0, 0);\n }\n}\n\n// ── Function call ─────────────────────────────────────────────────────────\n\nexport class FunctionCallNode extends FormulaNode {\n constructor(\n readonly functionName: string,\n readonly args: FormulaNode[],\n ) { super(); }\n\n evaluate(ctx: FormulaContext): FormulaValue {\n return ctx.evaluateFunction(this.functionName, this.args);\n }\n\n override evaluateTail(ctx: FormulaContext): FormulaValue | TailCall {\n const name = this.functionName;\n const a = this.args;\n\n // Control-flow functions are tail-transparent: tail position flows into the\n // branch they select. Branch selection mirrors the handlers exactly.\n switch (name) {\n case 'IF': {\n const cond = a[0]!.evaluate(ctx);\n if (cond.isError) return cond;\n const b = cond.coerceToBool();\n if (b.isError) return b;\n if (b.booleanValue) return a[1]!.evaluateTail(ctx);\n return a.length > 2 ? a[2]!.evaluateTail(ctx) : FormulaValue.false_;\n }\n case 'IFS': {\n for (let i = 0; i + 1 < a.length; i += 2) {\n const cond = a[i]!.evaluate(ctx);\n if (cond.isError) return cond;\n const b = cond.coerceToBool();\n if (b.isError) return b;\n if (b.booleanValue) return a[i + 1]!.evaluateTail(ctx);\n }\n return FormulaValue.errorNA;\n }\n case 'IFERROR': {\n const v = a[0]!.evaluate(ctx);\n return v.isError ? a[1]!.evaluateTail(ctx) : v;\n }\n case 'IFNA': {\n const v = a[0]!.evaluate(ctx);\n return v.isError && v.errorCode === FormulaError.NA ? a[1]!.evaluateTail(ctx) : v;\n }\n case 'LET': {\n if (a.length < 3 || a.length % 2 === 0) break;\n const bindings = new Map<string, FormulaValue>();\n ctx.pushScope(bindings);\n try {\n for (let i = 0; i < a.length - 1; i += 2) {\n const nn = a[i]!;\n if (!(nn instanceof NamedRangeNode)) return FormulaValue.errorValue;\n const val = a[i + 1]!.evaluate(ctx);\n if (val.isError) return val;\n bindings.set(nn.name.toUpperCase(), val);\n }\n // Args of any tail call are evaluated eagerly here (scope still in place).\n return a[a.length - 1]!.evaluateTail(ctx);\n } finally {\n ctx.popScope();\n }\n }\n }\n\n // A call to an unregistered name that resolves to a lambda is a tail call.\n if (!ctx.hasFunction(name)) {\n const named = ctx.resolveNamedRange(name);\n if (named.isLambda) {\n return new TailCall(named.lambdaVal, a.map(arg => arg.evaluate(ctx)));\n }\n }\n return this.evaluate(ctx);\n }\n}\n\n/**\n * Calls the value produced by an expression (e.g. an inline LAMBDA:\n * `LAMBDA(x,x+1)(5)`). The callee must evaluate to a lambda, else #VALUE!.\n */\nexport class CallNode extends FormulaNode {\n constructor(readonly callee: FormulaNode, readonly args: FormulaNode[]) { super(); }\n\n evaluate(ctx: FormulaContext): FormulaValue {\n const fn = this.callee.evaluate(ctx);\n if (fn.isError) return fn;\n if (!fn.isLambda) return FormulaValue.errorValue;\n return fn.lambdaVal.call(this.args.map(a => a.evaluate(ctx)));\n }\n\n override evaluateTail(ctx: FormulaContext): FormulaValue | TailCall {\n const fn = this.callee.evaluate(ctx);\n if (fn.isError) return fn;\n if (!fn.isLambda) return FormulaValue.errorValue;\n return new TailCall(fn.lambdaVal, this.args.map(a => a.evaluate(ctx)));\n }\n}\n","/**\n * Recursive descent parser converting formula tokens into an AST.\n * Port of TVE.PureDocs.Excel.Formulas.FormulaParser (C#)\n *\n * Operator precedence (low → high):\n * Comparison: =, <>, <, <=, >, >=\n * Concatenation: &\n * Addition/Subtraction: +, -\n * Multiplication/Division: *, /\n * Unary: +, -, @ (prefix)\n * Power: ^ (right-associative)\n * Percent: % (postfix)\n * Primary: literals, refs, functions, parentheses\n */\nimport { columnNumber, EXCEL_MAX_ROWS, EXCEL_MAX_COLUMNS } from '@devmm/puredocs-excel';\nimport { Token, TokenType } from './formula-token.js';\nimport { FormulaException } from './formula-lexer.js';\nimport {\n FormulaNode, NumberNode, StringNode, BooleanNode, ErrorNode, BlankNode,\n CellReferenceNode, RangeReferenceNode, SheetCellReferenceNode, SheetRangeReferenceNode,\n FullRangeReferenceNode, NamedRangeNode, SpillReferenceNode, FunctionCallNode, CallNode,\n BinaryOpNode, BinaryOperator, UnaryOpNode, UnaryOperator,\n ImplicitIntersectionNode,\n} from './formula-node.js';\nimport { FormulaValue } from './formula-value.js';\n\nexport class FormulaParser {\n readonly #tokens: Token[];\n #pos = 0;\n\n constructor(tokens: Token[]) {\n this.#tokens = tokens;\n }\n\n parse(): FormulaNode {\n this.#pos = 0;\n const node = this.#parseComparison();\n if (this.#current.type !== TokenType.EOF) {\n throw new FormulaException(\n `Unexpected token '${this.#current.value}' at position ${this.#current.position}.`,\n );\n }\n return node;\n }\n\n // ── Token helpers ──────────────────────────────────────────────────────────\n\n get #current(): Token {\n return this.#tokens[this.#pos] ?? { type: TokenType.EOF, value: '', position: -1 };\n }\n\n #advance(): Token {\n const t = this.#current;\n this.#pos++;\n return t;\n }\n\n #expect(type: TokenType): Token {\n if (this.#current.type !== type) {\n throw new FormulaException(\n `Expected token type ${type} but got ${this.#current.type} ('${this.#current.value}') at position ${this.#current.position}.`,\n );\n }\n return this.#advance();\n }\n\n // ── Precedence levels ──────────────────────────────────────────────────────\n\n #parseComparison(): FormulaNode {\n let left = this.#parseConcatenation();\n while (true) {\n const op = comparisonOp(this.#current.type);\n if (op === null) break;\n this.#advance();\n left = new BinaryOpNode(left, op, this.#parseConcatenation());\n }\n return left;\n }\n\n #parseConcatenation(): FormulaNode {\n let left = this.#parseAddSub();\n while (this.#current.type === TokenType.Ampersand) {\n this.#advance();\n left = new BinaryOpNode(left, BinaryOperator.Concatenate, this.#parseAddSub());\n }\n return left;\n }\n\n #parseAddSub(): FormulaNode {\n let left = this.#parseMulDiv();\n while (true) {\n const t = this.#current.type;\n if (t !== TokenType.Plus && t !== TokenType.Minus) break;\n this.#advance();\n const op = t === TokenType.Plus ? BinaryOperator.Add : BinaryOperator.Subtract;\n left = new BinaryOpNode(left, op, this.#parseMulDiv());\n }\n return left;\n }\n\n #parseMulDiv(): FormulaNode {\n let left = this.#parseUnary();\n while (true) {\n const t = this.#current.type;\n if (t !== TokenType.Multiply && t !== TokenType.Divide) break;\n this.#advance();\n const op = t === TokenType.Multiply ? BinaryOperator.Multiply : BinaryOperator.Divide;\n left = new BinaryOpNode(left, op, this.#parseUnary());\n }\n return left;\n }\n\n #parseUnary(): FormulaNode {\n if (this.#current.type === TokenType.Minus) {\n this.#advance();\n return new UnaryOpNode(UnaryOperator.Negate, this.#parsePower());\n }\n if (this.#current.type === TokenType.Plus) {\n this.#advance();\n return new UnaryOpNode(UnaryOperator.Plus, this.#parsePower());\n }\n if (this.#current.type === TokenType.AtSign) {\n this.#advance();\n return new ImplicitIntersectionNode(this.#parsePower());\n }\n return this.#parsePower();\n }\n\n #parsePower(): FormulaNode {\n const left = this.#parsePercent();\n if (this.#current.type === TokenType.Power) {\n this.#advance();\n // Right-associative\n return new BinaryOpNode(left, BinaryOperator.Power, this.#parseUnary());\n }\n return left;\n }\n\n #parsePercent(): FormulaNode {\n let node = this.#parsePostfix();\n while (this.#current.type === TokenType.Percent) {\n this.#advance();\n node = new UnaryOpNode(UnaryOperator.Percent, node);\n }\n return node;\n }\n\n /** Handles postfix call syntax on an expression, e.g. LAMBDA(x,x+1)(5). */\n #parsePostfix(): FormulaNode {\n let node = this.#parsePrimary();\n while (this.#current.type === TokenType.LeftParen) {\n this.#advance(); // consume '('\n node = new CallNode(node, this.#parseArgList());\n }\n return node;\n }\n\n #parsePrimary(): FormulaNode {\n const token = this.#current;\n\n switch (token.type) {\n case TokenType.Number: {\n this.#advance();\n // 1:1 — a whole-row reference. Two integers around a ':' have no other\n // meaning in a formula, so this cannot shadow arithmetic.\n if (this.#current.type === TokenType.Colon) {\n const full = this.#tryParseFullRange(token.value);\n if (full) return full;\n }\n const n = parseFloat(token.value);\n if (isNaN(n)) throw new FormulaException(`Invalid number: ${token.value}`);\n return new NumberNode(n);\n }\n\n case TokenType.String:\n this.#advance();\n return new StringNode(token.value);\n\n case TokenType.Boolean:\n this.#advance();\n return new BooleanNode(token.value === 'TRUE');\n\n case TokenType.ErrorLiteral:\n this.#advance();\n return new ErrorNode(FormulaValue.error(FormulaValue.errorFromString(token.value)));\n\n case TokenType.CellReference: {\n this.#advance();\n // Check for range A1:B5\n if (this.#current.type === TokenType.Colon) {\n this.#advance();\n const end = this.#expect(TokenType.CellReference);\n return new RangeReferenceNode(token.value, end.value);\n }\n return new CellReferenceNode(token.value);\n }\n\n case TokenType.SheetReference: {\n this.#advance();\n const parts = token.value.split('!');\n const sheetName = parts[0]!;\n const cellRef = parts[1] ?? '';\n if (this.#current.type === TokenType.Colon) {\n // Sheet1!A:A / Sheet1!1:1 — the qualified half lexes as a bare column\n // or row, so it is decided the same way as the unqualified form.\n const full = this.#tryParseFullRange(cellRef, sheetName);\n if (full) return full;\n // Sheet1!A1:B5\n this.#advance();\n const end = this.#expect(TokenType.CellReference);\n return new SheetRangeReferenceNode(sheetName, cellRef, end.value);\n }\n return new SheetCellReferenceNode(sheetName, cellRef);\n }\n\n case TokenType.NamedRange: {\n this.#advance();\n // A:A — a bare column letter is lexed as a name (it has no row digits),\n // and only the following ':' tells it apart from a defined name called\n // \"A\". Deciding it here rather than in the lexer keeps `SUM(A)` working.\n if (this.#current.type === TokenType.Colon) {\n const full = this.#tryParseFullRange(token.value);\n if (full) return full;\n }\n return new NamedRangeNode(token.value);\n }\n\n case TokenType.SpillReference:\n this.#advance();\n return new SpillReferenceNode(token.value);\n\n case TokenType.Function:\n return this.#parseFunction();\n\n case TokenType.LeftParen: {\n this.#advance();\n const expr = this.#parseComparison();\n this.#expect(TokenType.RightParen);\n return expr;\n }\n\n default:\n throw new FormulaException(\n `Unexpected token '${token.value}' (type ${token.type}) at position ${token.position}.`,\n );\n }\n }\n\n /**\n * Completes a whole-column or whole-row reference whose first half has already\n * been consumed and whose ':' is the current token. Returns null — consuming\n * nothing — when the two halves are not a matching pair of columns or rows, so\n * the caller can fall back to its normal interpretation.\n *\n * Both halves must be the same kind: `A:A` and `1:5` are ranges, `A:1` is not\n * a reference at all in Excel and must stay an error rather than becoming a\n * silently different region.\n */\n #tryParseFullRange(startText: string, sheetName?: string): FormulaNode | null {\n const endToken = this.#tokens[this.#pos + 1];\n if (!endToken) return null;\n\n const start = classifyBound(startText);\n const end = classifyBound(endToken.value);\n if (!start || !end || start.kind !== end.kind) return null;\n\n this.#advance(); // ':'\n this.#advance(); // end half\n\n // Excel normalises a reversed range (C:A → A:C); the evaluator assumes\n // start ≤ end when it walks the rectangle.\n const lo = Math.min(start.index, end.index);\n const hi = Math.max(start.index, end.index);\n return start.kind === 'col'\n ? new FullRangeReferenceNode(lo, hi, null, null, sheetName)\n : new FullRangeReferenceNode(null, null, lo, hi, sheetName);\n }\n\n #parseFunction(): FormulaNode {\n const nameToken = this.#advance();\n this.#expect(TokenType.LeftParen);\n return new FunctionCallNode(nameToken.value.toUpperCase(), this.#parseArgList());\n }\n\n /** Parses a comma-separated argument list up to and including the ')'. */\n #parseArgList(): FormulaNode[] {\n const args: FormulaNode[] = [];\n\n if (this.#current.type !== TokenType.RightParen) {\n // First arg — may be blank if leading comma\n if (this.#current.type === TokenType.Comma) {\n args.push(new BlankNode());\n } else {\n args.push(this.#parseComparison());\n }\n\n while (this.#current.type === TokenType.Comma) {\n this.#advance(); // consume comma\n if (\n this.#current.type === TokenType.Comma ||\n this.#current.type === TokenType.RightParen\n ) {\n args.push(new BlankNode());\n } else {\n args.push(this.#parseComparison());\n }\n }\n }\n\n this.#expect(TokenType.RightParen);\n return args;\n }\n}\n\n/**\n * Reads one half of a possible whole-column/whole-row reference: `A`, `$AB`, or\n * a row number. Returns null for anything else — including a column past the\n * sheet's last (`ZZZZ:ZZZZ`) or a row past 1,048,576 — so an out-of-range\n * reference stays a parse error instead of quietly clamping to a valid region.\n */\nfunction classifyBound(text: string): { kind: 'col' | 'row'; index: number } | null {\n const bare = text.replace(/\\$/g, '');\n // The kind follows from the shape: all digits is a row, one to three letters\n // is a column. Nothing else — including a real cell reference like `A1` — can\n // be one half of a whole-column/whole-row range.\n if (/^\\d+$/.test(bare)) {\n const row = parseInt(bare, 10);\n return row >= 1 && row <= EXCEL_MAX_ROWS ? { kind: 'row', index: row } : null;\n }\n if (/^[A-Za-z]{1,3}$/.test(bare)) {\n const col = columnNumber(bare.toUpperCase());\n return col >= 1 && col <= EXCEL_MAX_COLUMNS ? { kind: 'col', index: col } : null;\n }\n return null;\n}\n\nfunction comparisonOp(type: TokenType): BinaryOperator | null {\n switch (type) {\n case TokenType.Equal: return BinaryOperator.Equal;\n case TokenType.NotEqual: return BinaryOperator.NotEqual;\n case TokenType.LessThan: return BinaryOperator.LessThan;\n case TokenType.LessThanOrEqual: return BinaryOperator.LessThanOrEqual;\n case TokenType.GreaterThan: return BinaryOperator.GreaterThan;\n case TokenType.GreaterThanOrEqual: return BinaryOperator.GreaterThanOrEqual;\n default: return null;\n }\n}\n","/**\n * Position index over a criteria range, for the equality case.\n *\n * The problem. `SUMIFS($H$4:$H$294, $W$4:$W$294, $W282)` filled down 291 rows\n * scans the same 291-cell criteria range 291 times, once per row, because each\n * row asks about a different criterion. That is O(rows × range) comparisons —\n * quadratic in the size of one perfectly ordinary block of a spreadsheet, and\n * the range memo cannot help, because the *reading* is already cached; it is the\n * *comparing* that repeats.\n *\n * The observation. Across those 291 formulas the criteria range is one and the\n * same array, and only the criterion varies. So invert it once: group the\n * positions by value, and each formula becomes a lookup instead of a scan.\n *\n * Where the index lives. Keyed off the ArrayValue itself in a WeakMap, not off\n * (sheet, rectangle). That is deliberate: the array handed out by the range memo\n * is a stable object for exactly as long as its contents are valid, and the memo\n * drops it the moment a cell inside it is written. Hanging the index on that\n * object gives it the same lifetime for free — there is no second invalidation\n * path to keep in step with the first, which is where a cache of a cache would\n * normally go wrong. An uncached array (a literal, a function result) simply gets\n * an index that dies with it.\n *\n * Equivalence with scanning. Three criteria shapes are indexed, and each is\n * matched here exactly the way {@link FormulaHelper.compileCriteria} would:\n *\n * - `equalsText` compares `value.asText().toUpperCase()`, so the map is keyed by\n * that same string for every value, whatever its type.\n * - `equalsNumber` uses `FormulaValue.areEqual`, which matches numeric cells\n * within a 1e-10 tolerance and blank cells when the criterion is itself within\n * tolerance of zero. An exact-value map would miss the tolerance, so distinct\n * numeric values are also kept sorted: a lookup takes the window\n * [c − 1e-10, c + 1e-10] by binary search, which finds every value a scan\n * would and nothing else.\n * - `compareNumber` (`\">5\"`, `\"<=0\"`) uses `FormulaValue.compare`, which has **no**\n * tolerance and ranks by value class before looking inside it. So the numbers\n * form an exact interval, and each other class gets a single verdict — see\n * {@link comparePositions}.\n *\n * Not indexed: `<>` (its match set is nearly the whole range), wildcards\n * (per-value regex), and comparisons against text (text-against-text is\n * per-value, with no class-level uniformity to exploit). Those scan, as before.\n *\n * None of this is trusted on argument alone: `consistency.fuzz.test.ts` compares\n * the positions returned here against a scan, position for position, over\n * randomly generated ranges and criteria — including the tolerance boundary,\n * blanks, errors and mixed types.\n */\nimport { FormulaValue, ArrayValue } from './formula-value.js';\nimport type { FormulaHelper } from './function-registry.js';\n\n/** Matches the tolerance in {@link FormulaValue.areEqual}. */\nconst EPSILON = 1e-10;\n\ninterface Index {\n /** `value.asText().toUpperCase()` → positions, over every value in the array. */\n readonly byText: Map<string, number[]>;\n /** Exact numeric value → positions, for values of kind `number` only. */\n readonly byNumber: Map<number, number[]>;\n /** The distinct numeric values, ascending, for windows and intervals. */\n readonly sortedNumbers: Float64Array;\n /**\n * Running total of positions across `sortedNumbers`: `cumulative[k]` is how many\n * positions the first `k` distinct values hold. It makes the size of an interval\n * a subtraction, so a comparison that would match most of the range can be\n * declined before anything is built rather than half way through building it.\n */\n readonly cumulative: Int32Array;\n /**\n * Positions grouped by value class, for the comparison case. Against a numeric\n * criterion every member of a class gets the same verdict, so one test on one\n * representative decides the whole group — see {@link matchingPositions}.\n */\n readonly classes: readonly ClassGroup[];\n}\n\n/**\n * One value class, with a member kept as the representative. Every member of a\n * class answers a numeric comparison the same way, so testing the representative\n * decides the group — and using a real member rather than a synthesised one means\n * there is no assumption about the class to get wrong.\n */\ninterface ClassGroup {\n readonly positions: number[];\n readonly representative: FormulaValue;\n}\n\n/**\n * Built indexes, alive only as long as the array they describe. Nothing else\n * references them, so a dropped range takes its index with it.\n */\nconst indexes = new WeakMap<ArrayValue, Index>();\n\nfunction build(arr: ArrayValue): Index {\n const byText = new Map<string, number[]>();\n const byNumber = new Map<number, number[]>();\n // Non-numeric values, grouped by class, each keeping its first member.\n const classes = new Map<string, { positions: number[]; representative: FormulaValue }>();\n const addToClass = (kind: string, v: FormulaValue, i: number): void => {\n const group = classes.get(kind);\n if (group) group.positions.push(i);\n else classes.set(kind, { positions: [i], representative: v });\n };\n\n let i = 0;\n for (const v of arr.values()) {\n const textKey = v.asText().toUpperCase();\n const atText = byText.get(textKey);\n if (atText) atText.push(i); else byText.set(textKey, [i]);\n\n if (v.isNumber) {\n const n = v.numberValue;\n const atNum = byNumber.get(n);\n if (atNum) atNum.push(i); else byNumber.set(n, [i]);\n } else {\n addToClass(v.kind, v, i);\n }\n i++;\n }\n\n const sortedNumbers = Float64Array.from(byNumber.keys()).sort();\n const cumulative = new Int32Array(sortedNumbers.length + 1);\n for (let k = 0; k < sortedNumbers.length; k++) {\n cumulative[k + 1] = cumulative[k]! + byNumber.get(sortedNumbers[k]!)!.length;\n }\n return { byText, byNumber, sortedNumbers, cumulative, classes: [...classes.values()] };\n}\n\n/**\n * The index for an array, building it on first use.\n *\n * Building costs one pass; it pays for itself as soon as two formulas ask about\n * the same range, which is the situation this exists for. Ranges too small to\n * benefit are rejected by the caller, not here.\n */\nfunction indexOf(arr: ArrayValue): Index {\n let idx = indexes.get(arr);\n if (!idx) {\n idx = build(arr);\n indexes.set(arr, idx);\n }\n return idx;\n}\n\n/** First position in `sorted` with a value ≥ `target`. */\nfunction lowerBound(sorted: Float64Array, target: number): number {\n let lo = 0, hi = sorted.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (sorted[mid]! < target) lo = mid + 1; else hi = mid;\n }\n return lo;\n}\n\n/** First position in `sorted` with a value > `target`. */\nfunction upperBound(sorted: Float64Array, target: number): number {\n let lo = 0, hi = sorted.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (sorted[mid]! <= target) lo = mid + 1; else hi = mid;\n }\n return lo;\n}\n\n/**\n * The positions of an equality criterion within a criteria range, or null when\n * the caller should scan instead.\n *\n * Returns null — rather than an empty result — whenever the index cannot answer\n * the question: an unsupported criteria shape, or a range small enough that\n * building an index would cost more than the scan it saves. A null is always\n * safe; a wrong list of positions is a silently wrong total.\n */\nexport function matchingPositions(\n criteriaRange: FormulaValue,\n criteria: FormulaHelper.CompiledCriteria,\n minSize: number,\n): readonly number[] | null {\n if (!criteriaRange.isArray) return null;\n const arr = criteriaRange.arrayVal;\n // Below this the scan is cheaper than the bookkeeping — and a one-shot formula\n // would pay for an index nothing else reads.\n if (arr.length < minSize) return null;\n\n if (criteria.kind === 'equalsText') {\n return indexOf(arr).byText.get(criteria.text!) ?? EMPTY;\n }\n\n if (criteria.kind === 'equalsNumber') {\n const target = criteria.number!;\n const idx = indexOf(arr);\n\n // Exact hit first: the overwhelmingly common case, one map lookup.\n const exact = idx.byNumber.get(target);\n\n // Then anything else inside the tolerance window. Usually nothing, so this\n // costs a binary search and one comparison.\n let near: number[] | undefined;\n const { sortedNumbers } = idx;\n for (let k = lowerBound(sortedNumbers, target - EPSILON); k < sortedNumbers.length; k++) {\n const value = sortedNumbers[k]!;\n if (value > target + EPSILON) break;\n if (value === target) continue; // already covered by the exact hit\n // Confirm with the same predicate a scan would use, so the window can\n // never widen the match set.\n if (!criteria.test(FormulaValue.number(value))) continue;\n (near ??= []).push(...idx.byNumber.get(value)!);\n }\n\n // A blank cell matches a numeric criterion only when the criterion is zero\n // (within tolerance) — exactly what areEqual does for a blank.\n const blanks = criteria.test(FormulaValue.blank) ? blankPositions(idx) : undefined;\n\n if (!near && !blanks?.length) return exact ?? EMPTY;\n const merged = [...(exact ?? EMPTY), ...(near ?? EMPTY), ...(blanks ?? EMPTY)];\n merged.sort((a, b) => a - b);\n return merged;\n }\n\n if (criteria.kind === 'compareNumber') {\n return comparePositions(indexOf(arr), criteria, arr.length);\n }\n\n return null;\n}\n\n/**\n * Positions matching a comparison against a number (`\">5\"`, `\"<=0\"`).\n *\n * Two parts, and the split is exactly Excel's own comparison rule:\n *\n * - **Numbers** form an interval. `FormulaValue.compare` subtracts, with no\n * tolerance anywhere — unlike equality — so the interval boundary is an exact\n * binary search over the distinct values. Applying the equality epsilon here\n * would silently widen the match by one value at the boundary.\n * - **Every other class gets one verdict.** `compare` ranks by class before\n * looking inside it (number/blank < text < boolean), so against a numeric\n * criterion all text values compare the same way, all booleans do, blanks\n * compare as zero, and errors compare as zero. One test on one representative\n * settles each group — which is why a *text* criterion is not handled here:\n * text-against-text is per-value, with no uniformity to exploit.\n *\n * Returns null when the match set is more than half the range: building a long\n * list then walking it is worse than the dense scan it would replace, and an\n * index that makes things slower is not worth having.\n */\nfunction comparePositions(\n idx: Index,\n criteria: FormulaHelper.CompiledCriteria,\n length: number,\n): readonly number[] | null {\n const target = criteria.number!;\n const { sortedNumbers } = idx;\n\n // The slice of distinct numeric values the operator admits.\n let from = 0;\n let to = sortedNumbers.length; // exclusive\n switch (criteria.op) {\n case '>': from = upperBound(sortedNumbers, target); break;\n case '>=': from = lowerBound(sortedNumbers, target); break;\n case '<': to = lowerBound(sortedNumbers, target); break;\n default: to = upperBound(sortedNumbers, target); break; // '<='\n }\n\n // Decide before building. One test per non-numeric class settles that class, and\n // the numeric interval's size is a subtraction, so declining costs O(log n)\n // rather than half a list — a criterion like \">-1\", which matches everything,\n // used to pay for a list it then threw away.\n const budget = length >> 1;\n const matchedClasses = idx.classes.filter(g => criteria.test(g.representative));\n let total = idx.cumulative[to]! - idx.cumulative[from]!;\n for (const group of matchedClasses) total += group.positions.length;\n if (total > budget) return null;\n\n const positions: number[] = [];\n for (let k = from; k < to; k++) {\n for (const i of idx.byNumber.get(sortedNumbers[k]!)!) positions.push(i);\n }\n for (const group of matchedClasses) {\n for (const i of group.positions) positions.push(i);\n }\n\n positions.sort((a, b) => a - b);\n return positions;\n}\n\n/** The positions holding a blank, or none. */\nfunction blankPositions(idx: Index): number[] | undefined {\n return idx.classes.find(g => g.representative.isBlank)?.positions;\n}\n\nconst EMPTY: readonly number[] = [];\n","/**\n * Mathematical and aggregate Excel functions.\n * Port of TVE.PureDocs.Excel.Formulas.MathFunctions (C#)\n */\nimport { FormulaValue } from '../formula-value.js';\nimport { matchingPositions } from '../criteria-index.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerMath(r: FunctionRegistry): void {\n r.register('SUM', sum, 1);\n r.register('AVERAGE', average, 1);\n r.register('MIN', min, 1);\n r.register('MAX', max, 1);\n r.register('COUNT', count, 1);\n r.register('COUNTA', countA, 1);\n r.register('COUNTBLANK', countBlank, 1, 1);\n r.register('COUNTIF', countIf, 2, 2);\n r.register('COUNTIFS', countIfs, 2);\n r.register('SUMIF', sumIf, 2, 3);\n r.register('SUMIFS', sumIfs, 3);\n r.register('AVERAGEIF', averageIf, 2, 3);\n r.register('AVERAGEIFS', averageIfs, 3);\n r.register('PRODUCT', product, 1);\n r.register('SUMPRODUCT', sumProduct, 1);\n r.register('SUMSQ', sumSq, 1);\n r.register('ABS', abs, 1, 1);\n r.register('ROUND', round, 2, 2);\n r.register('ROUNDUP', roundUp, 2, 2);\n r.register('ROUNDDOWN', roundDown, 2, 2);\n r.register('CEILING', ceiling, 2, 2);\n r.register('CEILING.MATH', ceiling, 2, 2);\n r.register('FLOOR', floor, 2, 2);\n r.register('FLOOR.MATH', floor, 2, 2);\n r.register('INT', int_, 1, 1);\n r.register('TRUNC', trunc, 1, 2);\n r.register('MOD', mod, 2, 2);\n r.register('QUOTIENT', quotient, 2, 2);\n r.register('POWER', power, 2, 2);\n r.register('SQRT', sqrt, 1, 1);\n r.register('SIGN', sign, 1, 1);\n r.register('PI', pi, 0, 0);\n r.register('RAND', rand, 0, 0, true);\n r.register('RANDBETWEEN', randBetween, 2, 2, true);\n r.register('LOG', log, 1, 2);\n r.register('LOG10', log10, 1, 1);\n r.register('LN', ln, 1, 1);\n r.register('EXP', exp, 1, 1);\n r.register('FACT', fact, 1, 1);\n r.register('COMBIN', combin, 2, 2);\n // Trigonometry\n r.register('SIN', unary(Math.sin), 1, 1);\n r.register('COS', unary(Math.cos), 1, 1);\n r.register('TAN', unary(Math.tan), 1, 1);\n r.register('ASIN', asin, 1, 1);\n r.register('ACOS', acos, 1, 1);\n r.register('ATAN', unary(Math.atan), 1, 1);\n r.register('ATAN2', atan2, 2, 2);\n r.register('SINH', unary(Math.sinh), 1, 1);\n r.register('COSH', unary(Math.cosh), 1, 1);\n r.register('TANH', unary(Math.tanh), 1, 1);\n r.register('DEGREES', unary(r2d => (r2d * 180) / Math.PI), 1, 1);\n r.register('RADIANS', unary(d => (d * Math.PI) / 180), 1, 1);\n}\n\n// ── Multi-criteria aggregates (SUMIFS/COUNTIFS/AVERAGEIFS) ────────────────────\n\n/** Value at flat index i of a value that may be a scalar or an array. */\nfunction valueAt(v: FormulaValue, i: number): FormulaValue {\n return v.isArray ? v.arrayVal.getFlat(i) : v;\n}\n\n/** Flat length of a value that may be a scalar or an array. */\nfunction lengthOf(v: FormulaValue): number {\n return v.isArray ? v.arrayVal.length : 1;\n}\n\n/**\n * Below this many cells a criteria range is scanned rather than indexed: the\n * index costs a pass plus a sort, which only pays back when several formulas ask\n * about the same range.\n */\nconst INDEX_MIN_RANGE = 32;\n\n/**\n * The set of positions a criteria list selects.\n *\n * Two shapes, because the two cost different things to consume. `positions` is a\n * short list of matches, which the aggregation walks directly — the point of\n * indexing is lost if the caller still touches every cell of the range. `mask` is\n * the dense fallback for criteria that select a *range* of values (`\">5\"`,\n * wildcards) and therefore have no short list to offer.\n */\ntype Selection =\n | { readonly ok: true; readonly positions: readonly number[] }\n | { readonly ok: true; readonly mask: Uint8Array }\n | { readonly ok: false; readonly error: FormulaValue };\n\n/**\n * Resolves the criteria pairs (criteria_range, criteria) starting at `startIdx`\n * into the positions that satisfy all of them, over `len` positions.\n *\n * Strategy, in the order it matters:\n *\n * 1. Each criterion is compiled once. It used to be re-parsed — regex, number\n * conversion, sometimes a fresh RegExp — for every cell of every range.\n * 2. If any pair is an equality criterion over a large enough range, its\n * matching positions come from an index instead of a scan, and every\n * remaining pair then only has to filter that short list. A `SUMIFS` filled\n * down a block goes from O(rows × range) to O(rows × matches).\n * 3. Only when no pair can be indexed does this fall back to the dense mask.\n *\n * Pairs are still evaluated strictly in order and the first error wins, so error\n * reporting is unchanged by any of the above.\n */\nfunction resolveIfsSelection(a: Args, c: Ctx, startIdx: number, len: number): Selection {\n const ranges: FormulaValue[] = [];\n const criteria: FormulaHelper.CompiledCriteria[] = [];\n let seed: readonly number[] | undefined;\n let seedPair = -1;\n\n for (let p = startIdx; p + 1 < a.length; p += 2) {\n const cr = a[p]!.evaluate(c);\n if (cr.isError) return { ok: false, error: cr };\n const crit = a[p + 1]!.evaluate(c);\n if (crit.isError) return { ok: false, error: crit };\n\n const compiled = FormulaHelper.compileCriteria(crit.asText());\n ranges.push(cr);\n criteria.push(compiled);\n\n if (seed === undefined) {\n const positions = matchingPositions(cr, compiled, INDEX_MIN_RANGE);\n if (positions) {\n seed = positions;\n seedPair = ranges.length - 1;\n }\n }\n }\n\n if (seed !== undefined) {\n // Candidates from the index, then narrowed by the other pairs. `len` bounds\n // it because the criteria range may be longer than the range being summed.\n let candidates: number[] = [];\n for (const i of seed) if (i < len) candidates.push(i);\n\n for (let k = 0; k < ranges.length && candidates.length > 0; k++) {\n if (k === seedPair) continue;\n const range = ranges[k]!;\n const test = criteria[k]!.test;\n const next: number[] = [];\n for (const i of candidates) if (test(valueAt(range, i))) next.push(i);\n candidates = next;\n }\n return { ok: true, positions: candidates };\n }\n\n const mask = new Uint8Array(len).fill(1);\n for (let k = 0; k < ranges.length; k++) {\n const range = ranges[k]!;\n const test = criteria[k]!.test;\n for (let i = 0; i < len; i++) {\n if (!mask[i]) continue;\n if (!test(valueAt(range, i))) mask[i] = 0;\n }\n }\n return { ok: true, mask };\n}\n\n/** Calls `visit` for each selected position, whichever shape the selection is. */\nfunction forEachSelected(\n sel: { readonly positions: readonly number[] } | { readonly mask: Uint8Array },\n len: number,\n visit: (i: number) => void,\n): void {\n if ('positions' in sel) {\n for (const i of sel.positions) visit(i);\n return;\n }\n const { mask } = sel;\n for (let i = 0; i < len; i++) if (mask[i]) visit(i);\n}\n\nfunction sumIfs(a: Args, c: Ctx): FormulaValue {\n // sum_range, (criteria_range, criteria)+ → 1 + 2k args (odd, ≥ 3)\n if (a.length < 3 || a.length % 2 === 0) return FormulaValue.errorValue;\n const sumRange = a[0]!.evaluate(c);\n if (sumRange.isError) return sumRange;\n const len = lengthOf(sumRange);\n const sel = resolveIfsSelection(a, c, 1, len);\n if (!sel.ok) return sel.error;\n\n let total = 0;\n forEachSelected(sel, len, i => {\n const r = valueAt(sumRange, i).tryAsDouble();\n if (r.ok) total += r.value;\n });\n return FormulaValue.number(total);\n}\n\nfunction countIfs(a: Args, c: Ctx): FormulaValue {\n // (criteria_range, criteria)+ → 2k args (even, ≥ 2)\n if (a.length < 2 || a.length % 2 !== 0) return FormulaValue.errorValue;\n const first = a[0]!.evaluate(c);\n if (first.isError) return first;\n const len = lengthOf(first);\n const sel = resolveIfsSelection(a, c, 0, len);\n if (!sel.ok) return sel.error;\n\n let n = 0;\n forEachSelected(sel, len, () => { n++; });\n return FormulaValue.number(n);\n}\n\nfunction averageIfs(a: Args, c: Ctx): FormulaValue {\n // average_range, (criteria_range, criteria)+ → 1 + 2k args (odd, ≥ 3)\n if (a.length < 3 || a.length % 2 === 0) return FormulaValue.errorValue;\n const avgRange = a[0]!.evaluate(c);\n if (avgRange.isError) return avgRange;\n const len = lengthOf(avgRange);\n const sel = resolveIfsSelection(a, c, 1, len);\n if (!sel.ok) return sel.error;\n\n let total = 0, cnt = 0;\n forEachSelected(sel, len, i => {\n const r = valueAt(avgRange, i).tryAsDouble();\n if (r.ok) { total += r.value; cnt++; }\n });\n return cnt === 0 ? FormulaValue.errorDiv0 : FormulaValue.number(total / cnt);\n}\n\nfunction sumSq(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n return FormulaValue.number(r.values.reduce((s, n) => s + n * n, 0));\n}\n\n// ── Trigonometry ─────────────────────────────────────────────────────────────\n\n/** Wraps a single-argument Math function into a formula handler. */\nfunction unary(fn: (x: number) => number): (a: Args, c: Ctx) => FormulaValue {\n return (a, c) => {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n return r.ok ? FormulaValue.number(fn(r.value)) : r.error;\n };\n}\n\nfunction asin(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n if (!r.ok) return r.error;\n if (r.value < -1 || r.value > 1) return FormulaValue.errorNum;\n return FormulaValue.number(Math.asin(r.value));\n}\n\nfunction acos(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n if (!r.ok) return r.error;\n if (r.value < -1 || r.value > 1) return FormulaValue.errorNum;\n return FormulaValue.number(Math.acos(r.value));\n}\n\nfunction atan2(a: Args, c: Ctx): FormulaValue {\n // Excel ATAN2(x, y) — note the reversed argument order vs Math.atan2(y, x).\n const x = FormulaHelper.evalDouble(a[0]!, c);\n if (!x.ok) return x.error;\n const y = FormulaHelper.evalDouble(a[1]!, c);\n if (!y.ok) return y.error;\n if (x.value === 0 && y.value === 0) return FormulaValue.errorDiv0;\n return FormulaValue.number(Math.atan2(y.value, x.value));\n}\n\n// ── Aggregates ─────────────────────────────────────────────────────────────\n\nfunction sum(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n return FormulaValue.number(r.values.reduce((s, n) => s + n, 0));\n}\n\nfunction average(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length === 0) return FormulaValue.errorDiv0;\n return FormulaValue.number(r.values.reduce((s, n) => s + n, 0) / r.values.length);\n}\n\nfunction min(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n return r.values.length === 0 ? FormulaValue.zero : FormulaValue.number(Math.min(...r.values));\n}\n\nfunction max(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n return r.values.length === 0 ? FormulaValue.zero : FormulaValue.number(Math.max(...r.values));\n}\n\nfunction count(a: Args, c: Ctx): FormulaValue {\n const flat = FormulaHelper.flattenArgs(a, c);\n let n = 0;\n for (const v of flat) {\n if (v.isNumber || (v.isText && !isNaN(parseFloat(v.textValue)))) n++;\n }\n return FormulaValue.number(n);\n}\n\nfunction countA(a: Args, c: Ctx): FormulaValue {\n return FormulaValue.number(FormulaHelper.flattenArgs(a, c).filter(v => !v.isBlank).length);\n}\n\nfunction countBlank(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n if (!v.isArray) return FormulaValue.number(v.isBlank ? 1 : 0);\n let n = 0;\n for (const item of v.arrayVal.values()) if (item.isBlank) n++;\n return FormulaValue.number(n);\n}\n\nfunction countIf(a: Args, c: Ctx): FormulaValue {\n const range = a[0]!.evaluate(c);\n if (range.isError) return range;\n const crit = a[1]!.evaluate(c);\n if (crit.isError) return crit;\n const criteria = crit.asText();\n\n if (!range.isArray) return FormulaValue.number(FormulaHelper.matchesCriteria(range, criteria) ? 1 : 0);\n let n = 0;\n for (const item of range.arrayVal.values()) {\n if (!item.isBlank && FormulaHelper.matchesCriteria(item, criteria)) n++;\n }\n return FormulaValue.number(n);\n}\n\nfunction sumIf(a: Args, c: Ctx): FormulaValue {\n const range = a[0]!.evaluate(c);\n if (range.isError) return range;\n const crit = a[1]!.evaluate(c);\n if (crit.isError) return crit;\n const criteria = crit.asText();\n\n const sumRange = a.length > 2 ? a[2]!.evaluate(c) : range;\n if (sumRange.isError) return sumRange;\n\n if (!range.isArray) {\n if (FormulaHelper.matchesCriteria(range, criteria)) {\n const r = sumRange.tryAsDouble();\n return r.ok ? FormulaValue.number(r.value) : FormulaValue.zero;\n }\n return FormulaValue.zero;\n }\n\n const rangeArr = range.arrayVal;\n const sumArr = sumRange.isArray ? sumRange.arrayVal : null;\n let total = 0;\n\n for (let i = 0; i < rangeArr.length; i++) {\n const rv = rangeArr.getFlat(i);\n if (rv.isBlank) continue;\n if (FormulaHelper.matchesCriteria(rv, criteria)) {\n const sv = sumArr ? sumArr.getFlat(i) : rangeArr.getFlat(i);\n const r = sv.tryAsDouble();\n if (r.ok) total += r.value;\n }\n }\n return FormulaValue.number(total);\n}\n\nfunction averageIf(a: Args, c: Ctx): FormulaValue {\n const range = a[0]!.evaluate(c);\n if (range.isError) return range;\n const crit = a[1]!.evaluate(c);\n if (crit.isError) return crit;\n const criteria = crit.asText();\n const avgRange = a.length > 2 ? a[2]!.evaluate(c) : range;\n if (avgRange.isError) return avgRange;\n\n if (!range.isArray) {\n if (!FormulaHelper.matchesCriteria(range, criteria)) return FormulaValue.errorDiv0;\n const r = avgRange.tryAsDouble();\n return r.ok ? FormulaValue.number(r.value) : FormulaValue.errorDiv0;\n }\n\n const rangeArr = range.arrayVal;\n const avgArr = avgRange.isArray ? avgRange.arrayVal : null;\n let total = 0, cnt = 0;\n\n for (let i = 0; i < rangeArr.length; i++) {\n const rv = rangeArr.getFlat(i);\n if (rv.isBlank) continue;\n if (FormulaHelper.matchesCriteria(rv, criteria)) {\n const sv = avgArr ? avgArr.getFlat(i) : rangeArr.getFlat(i);\n const r = sv.tryAsDouble();\n if (r.ok) { total += r.value; cnt++; }\n }\n }\n return cnt === 0 ? FormulaValue.errorDiv0 : FormulaValue.number(total / cnt);\n}\n\nfunction product(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n return FormulaValue.number(r.values.reduce((p, n) => p * n, 1));\n}\n\nfunction sumProduct(a: Args, c: Ctx): FormulaValue {\n const arrays = a.map(arg => arg.evaluate(c));\n for (const v of arrays) if (v.isError) return v;\n\n const first = arrays[0]!;\n const len = first.isArray ? first.arrayVal.length : 1;\n let total = 0;\n\n for (let i = 0; i < len; i++) {\n let prod = 1;\n for (const v of arrays) {\n const item = v.isArray ? v.arrayVal.getFlat(i) : v;\n const r = item.tryAsDouble();\n if (!r.ok) { prod = 0; break; }\n prod *= r.value;\n }\n total += prod;\n }\n return FormulaValue.number(total);\n}\n\n// ── Single-arg math ────────────────────────────────────────────────────────\n\nfunction abs(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n return r.ok ? FormulaValue.number(Math.abs(r.value)) : r.error;\n}\n\nfunction round(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const d = FormulaHelper.evalDouble(a[1]!, c);\n if (!d.ok) return d.error;\n const factor = Math.pow(10, Math.round(d.value));\n return FormulaValue.number(Math.round(n.value * factor) / factor);\n}\n\nfunction roundUp(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const d = FormulaHelper.evalDouble(a[1]!, c);\n if (!d.ok) return d.error;\n const factor = Math.pow(10, Math.round(d.value));\n return FormulaValue.number(Math.ceil(n.value * factor) / factor);\n}\n\nfunction roundDown(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const d = FormulaHelper.evalDouble(a[1]!, c);\n if (!d.ok) return d.error;\n const factor = Math.pow(10, Math.round(d.value));\n return FormulaValue.number(Math.floor(n.value * factor) / factor);\n}\n\nfunction ceiling(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const s = FormulaHelper.evalDouble(a[1]!, c);\n if (!s.ok) return s.error;\n if (s.value === 0) return FormulaValue.zero;\n return FormulaValue.number(Math.ceil(n.value / s.value) * s.value);\n}\n\nfunction floor(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const s = FormulaHelper.evalDouble(a[1]!, c);\n if (!s.ok) return s.error;\n if (s.value === 0) return FormulaValue.zero;\n return FormulaValue.number(Math.floor(n.value / s.value) * s.value);\n}\n\nfunction int_(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n return r.ok ? FormulaValue.number(Math.floor(r.value)) : r.error;\n}\n\nfunction trunc(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n let digits = 0;\n if (a.length > 1) {\n const d = FormulaHelper.evalDouble(a[1]!, c);\n if (!d.ok) return d.error;\n digits = Math.round(d.value);\n }\n const factor = Math.pow(10, digits);\n return FormulaValue.number(Math.trunc(n.value * factor) / factor);\n}\n\nfunction mod(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const d = FormulaHelper.evalDouble(a[1]!, c);\n if (!d.ok) return d.error;\n if (d.value === 0) return FormulaValue.errorDiv0;\n return FormulaValue.number(n.value - d.value * Math.floor(n.value / d.value));\n}\n\nfunction quotient(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const d = FormulaHelper.evalDouble(a[1]!, c);\n if (!d.ok) return d.error;\n if (d.value === 0) return FormulaValue.errorDiv0;\n return FormulaValue.number(Math.trunc(n.value / d.value));\n}\n\nfunction power(a: Args, c: Ctx): FormulaValue {\n const b = FormulaHelper.evalDouble(a[0]!, c);\n if (!b.ok) return b.error;\n const e = FormulaHelper.evalDouble(a[1]!, c);\n if (!e.ok) return e.error;\n return FormulaValue.number(Math.pow(b.value, e.value));\n}\n\nfunction sqrt(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n if (!r.ok) return r.error;\n if (r.value < 0) return FormulaValue.errorNum;\n return FormulaValue.number(Math.sqrt(r.value));\n}\n\nfunction sign(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n return r.ok ? FormulaValue.number(Math.sign(r.value)) : r.error;\n}\n\nfunction pi(): FormulaValue { return FormulaValue.number(Math.PI); }\nfunction rand(): FormulaValue { return FormulaValue.number(Math.random()); }\n\nfunction randBetween(a: Args, c: Ctx): FormulaValue {\n const lo = FormulaHelper.evalDouble(a[0]!, c);\n if (!lo.ok) return lo.error;\n const hi = FormulaHelper.evalDouble(a[1]!, c);\n if (!hi.ok) return hi.error;\n return FormulaValue.number(Math.floor(lo.value + Math.random() * (hi.value - lo.value + 1)));\n}\n\nfunction log(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n if (n.value <= 0) return FormulaValue.errorNum;\n let base = 10;\n if (a.length > 1) {\n const b = FormulaHelper.evalDouble(a[1]!, c);\n if (!b.ok) return b.error;\n base = b.value;\n }\n if (base <= 0 || base === 1) return FormulaValue.errorNum;\n return FormulaValue.number(Math.log(n.value) / Math.log(base));\n}\n\nfunction log10(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n if (!r.ok) return r.error;\n if (r.value <= 0) return FormulaValue.errorNum;\n return FormulaValue.number(Math.log10(r.value));\n}\n\nfunction ln(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n if (!r.ok) return r.error;\n if (r.value <= 0) return FormulaValue.errorNum;\n return FormulaValue.number(Math.log(r.value));\n}\n\nfunction exp(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n return r.ok ? FormulaValue.number(Math.exp(r.value)) : r.error;\n}\n\nfunction fact(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n if (!r.ok) return r.error;\n const n = Math.round(r.value);\n if (n < 0) return FormulaValue.errorNum;\n if (n > 170) return FormulaValue.errorNum;\n let f = 1;\n for (let i = 2; i <= n; i++) f *= i;\n return FormulaValue.number(f);\n}\n\nfunction combin(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const k = FormulaHelper.evalDouble(a[1]!, c);\n if (!k.ok) return k.error;\n const N = Math.round(n.value);\n const K = Math.round(k.value);\n if (N < 0 || K < 0 || K > N) return FormulaValue.errorNum;\n // C(N,K) = N! / (K! * (N-K)!)\n let result = 1;\n for (let i = 0; i < K; i++) result = result * (N - i) / (i + 1);\n return FormulaValue.number(Math.round(result));\n}\n","/**\n * Text/string Excel functions.\n * Port of TVE.PureDocs.Excel.Formulas.TextFunctions (C#)\n */\nimport { fromOADate } from '@devmm/puredocs-excel';\nimport { FormulaValue } from '../formula-value.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerText(r: FunctionRegistry): void {\n r.register('LEFT', left, 1, 2);\n r.register('RIGHT', right, 1, 2);\n r.register('MID', mid, 3, 3);\n r.register('LEN', len, 1, 1);\n r.register('UPPER', upper, 1, 1);\n r.register('LOWER', lower, 1, 1);\n r.register('PROPER', proper, 1, 1);\n r.register('TRIM', trim, 1, 1);\n r.register('CLEAN', clean, 1, 1);\n r.register('SUBSTITUTE', substitute, 3, 4);\n r.register('REPLACE', replace, 4, 4);\n r.register('CONCATENATE', concatenate, 1);\n r.register('CONCAT', concatenate, 1);\n r.register('TEXTJOIN', textJoin, 3);\n r.register('TEXT', text_, 2, 2);\n r.register('VALUE', value, 1, 1);\n r.register('FIND', find, 2, 3);\n r.register('SEARCH', search, 2, 3);\n r.register('REPT', rept, 2, 2);\n r.register('EXACT', exact, 2, 2);\n r.register('CHAR', char_, 1, 1);\n r.register('CODE', code, 1, 1);\n r.register('T', t_, 1, 1);\n r.register('TEXTBEFORE', textBefore, 2, 3);\n r.register('TEXTAFTER', textAfter, 2, 3);\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction str(a: Args, c: Ctx, idx: number): { ok: true; s: string } | { ok: false; e: FormulaValue } {\n const r = FormulaHelper.evalString(a[idx]!, c);\n return r.ok ? { ok: true, s: r.value } : { ok: false, e: r.error };\n}\n\nfunction num(a: Args, c: Ctx, idx: number): { ok: true; n: number } | { ok: false; e: FormulaValue } {\n const r = FormulaHelper.evalDouble(a[idx]!, c);\n return r.ok ? { ok: true, n: r.value } : { ok: false, e: r.error };\n}\n\n// ── Implementations ──────────────────────────────────────────────────────────\n\nfunction left(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n let n = 1;\n if (a.length > 1) { const r = num(a, c, 1); if (!r.ok) return r.e; n = Math.round(r.n); }\n if (n < 0) return FormulaValue.errorValue;\n return FormulaValue.text(s.s.slice(0, n));\n}\n\nfunction right(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n let n = 1;\n if (a.length > 1) { const r = num(a, c, 1); if (!r.ok) return r.e; n = Math.round(r.n); }\n if (n < 0) return FormulaValue.errorValue;\n return FormulaValue.text(n >= s.s.length ? s.s : s.s.slice(-n));\n}\n\nfunction mid(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n const sv = num(a, c, 1); if (!sv.ok) return sv.e;\n const nv = num(a, c, 2); if (!nv.ok) return nv.e;\n const start = Math.round(sv.n) - 1;\n const count = Math.round(nv.n);\n if (start < 0 || count < 0) return FormulaValue.errorValue;\n return FormulaValue.text(s.s.slice(start, start + count));\n}\n\nfunction len(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n return FormulaValue.number(s.s.length);\n}\n\nfunction upper(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n return FormulaValue.text(s.s.toUpperCase());\n}\n\nfunction lower(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n return FormulaValue.text(s.s.toLowerCase());\n}\n\nfunction proper(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n let capitalise = true;\n let result = '';\n for (const ch of s.s) {\n result += capitalise ? ch.toUpperCase() : ch.toLowerCase();\n capitalise = !/[a-zA-Z]/.test(ch);\n }\n return FormulaValue.text(result);\n}\n\nfunction trim(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n // Excel TRIM removes leading/trailing spaces AND collapses internal spaces to one\n return FormulaValue.text(s.s.trim().replace(/\\s+/g, ' '));\n}\n\nfunction clean(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n return FormulaValue.text([...s.s].filter(ch => ch.charCodeAt(0) >= 32).join(''));\n}\n\nfunction substitute(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n const old = str(a, c, 1); if (!old.ok) return old.e;\n const nw = str(a, c, 2); if (!nw.ok) return nw.e;\n\n if (a.length > 3) {\n const iv = num(a, c, 3); if (!iv.ok) return iv.e;\n const inst = Math.round(iv.n);\n let count = 0, pos = 0, result = '';\n while (pos < s.s.length) {\n const idx = s.s.indexOf(old.s, pos);\n if (idx < 0) { result += s.s.slice(pos); break; }\n count++;\n if (count === inst) {\n result += s.s.slice(pos, idx) + nw.s;\n pos = idx + old.s.length;\n result += s.s.slice(pos);\n break;\n }\n result += s.s.slice(pos, idx + old.s.length);\n pos = idx + old.s.length;\n }\n return FormulaValue.text(result);\n }\n\n return FormulaValue.text(s.s.split(old.s).join(nw.s));\n}\n\nfunction replace(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n const sv = num(a, c, 1); if (!sv.ok) return sv.e;\n const nv = num(a, c, 2); if (!nv.ok) return nv.e;\n const nw = str(a, c, 3); if (!nw.ok) return nw.e;\n const start = Math.max(0, Math.round(sv.n) - 1);\n const count = Math.max(0, Math.round(nv.n));\n return FormulaValue.text(s.s.slice(0, start) + nw.s + s.s.slice(start + count));\n}\n\nfunction concatenate(a: Args, c: Ctx): FormulaValue {\n let result = '';\n for (const arg of a) {\n const v = arg.evaluate(c);\n if (v.isError) return v;\n result += v.asText();\n }\n return FormulaValue.text(result);\n}\n\nfunction textJoin(a: Args, c: Ctx): FormulaValue {\n const delim = str(a, c, 0); if (!delim.ok) return delim.e;\n const ignV = a[1]!.evaluate(c);\n if (ignV.isError) return ignV;\n const ignoreEmpty = ignV.coerceToBool().booleanValue;\n const parts: string[] = [];\n\n for (let i = 2; i < a.length; i++) {\n const v = a[i]!.evaluate(c);\n if (v.isError) return v;\n if (v.isArray) {\n for (const item of v.arrayVal.values()) {\n const t = item.asText();\n if (!ignoreEmpty || t !== '') parts.push(t);\n }\n } else {\n const t = v.asText();\n if (!ignoreEmpty || t !== '') parts.push(t);\n }\n }\n\n const result = parts.join(delim.s);\n if (result.length > 32767) return FormulaValue.errorValue;\n return FormulaValue.text(result);\n}\n\nfunction text_(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const f = str(a, c, 1); if (!f.ok) return f.e;\n // Map common Excel format codes to JS toLocaleString / toFixed patterns\n try {\n return FormulaValue.text(formatNumber(n.value, f.s));\n } catch {\n return FormulaValue.errorValue;\n }\n}\n\nfunction formatNumber(value: number, fmt: string): string {\n // Minimal Excel format code interpreter\n if (fmt === '0') return String(Math.round(value));\n if (fmt === '0.00') return value.toFixed(2);\n if (fmt === '#,##0') return Math.round(value).toLocaleString('en-US');\n if (fmt === '#,##0.00') return value.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n if (fmt === '0%') return `${Math.round(value * 100)}%`;\n if (fmt === '0.00%') return `${(value * 100).toFixed(2)}%`;\n // Date patterns — convert OADate back if it looks like a date format\n if (/[yYmMdD]/.test(fmt)) {\n try {\n const date = fromOADate(value);\n return date.toLocaleDateString();\n } catch { /* fall through */ }\n }\n return String(value);\n}\n\nfunction value(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n const n = parseFloat(s.s.replace(/,/g, '').replace(/%$/, (m) => { return m ? String(parseFloat(s.s) / 100) : ''; }));\n if (isNaN(n)) return FormulaValue.errorValue;\n return FormulaValue.number(n);\n}\n\nfunction find(a: Args, c: Ctx): FormulaValue {\n const needle = str(a, c, 0); if (!needle.ok) return needle.e;\n const haystack = str(a, c, 1); if (!haystack.ok) return haystack.e;\n let start = 0;\n if (a.length > 2) { const r = num(a, c, 2); if (!r.ok) return r.e; start = Math.round(r.n) - 1; }\n const idx = haystack.s.indexOf(needle.s, start);\n return idx < 0 ? FormulaValue.errorValue : FormulaValue.number(idx + 1);\n}\n\nfunction search(a: Args, c: Ctx): FormulaValue {\n const needle = str(a, c, 0); if (!needle.ok) return needle.e;\n const haystack = str(a, c, 1); if (!haystack.ok) return haystack.e;\n let start = 0;\n if (a.length > 2) { const r = num(a, c, 2); if (!r.ok) return r.e; start = Math.round(r.n) - 1; }\n const idx = haystack.s.toLowerCase().indexOf(needle.s.toLowerCase(), start);\n return idx < 0 ? FormulaValue.errorValue : FormulaValue.number(idx + 1);\n}\n\nfunction rept(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n const n = num(a, c, 1); if (!n.ok) return n.e;\n const count = Math.round(n.n);\n if (count < 0) return FormulaValue.errorValue;\n return FormulaValue.text(s.s.repeat(count));\n}\n\nfunction exact(a: Args, c: Ctx): FormulaValue {\n const s1 = str(a, c, 0); if (!s1.ok) return s1.e;\n const s2 = str(a, c, 1); if (!s2.ok) return s2.e;\n return FormulaValue.boolean(s1.s === s2.s);\n}\n\nfunction char_(a: Args, c: Ctx): FormulaValue {\n const r = num(a, c, 0); if (!r.ok) return r.e;\n const code = Math.round(r.n);\n if (code < 1 || code > 255) return FormulaValue.errorValue;\n return FormulaValue.text(String.fromCharCode(code));\n}\n\nfunction code(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n if (s.s.length === 0) return FormulaValue.errorValue;\n return FormulaValue.number(s.s.charCodeAt(0));\n}\n\nfunction t_(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n return v.isText ? v : FormulaValue.emptyString;\n}\n\n// TEXTBEFORE(text, delimiter, [instance_num]) — text before the nth delimiter.\n// TEXTAFTER(text, delimiter, [instance_num]) — text after the nth delimiter.\n// instance_num defaults to 1; a negative value counts occurrences from the end.\nfunction textBefore(a: Args, c: Ctx): FormulaValue { return textSplitAt(a, c, 'before'); }\nfunction textAfter(a: Args, c: Ctx): FormulaValue { return textSplitAt(a, c, 'after'); }\n\nfunction textSplitAt(a: Args, c: Ctx, mode: 'before' | 'after'): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n const d = str(a, c, 1); if (!d.ok) return d.e;\n let instance = 1;\n if (a.length > 2) { const r = num(a, c, 2); if (!r.ok) return r.e; instance = Math.trunc(r.n); }\n if (instance === 0) return FormulaValue.errorValue;\n\n const text = s.s;\n const delim = d.s;\n // Empty delimiter: BEFORE → \"\", AFTER → whole text (mirrors Excel).\n if (delim === '') {\n return FormulaValue.text(mode === 'before' ? '' : text);\n }\n\n // Collect all occurrence start positions.\n const positions: number[] = [];\n let from = 0;\n for (;;) {\n const idx = text.indexOf(delim, from);\n if (idx === -1) break;\n positions.push(idx);\n from = idx + delim.length;\n }\n if (positions.length === 0) return FormulaValue.errorNA;\n\n const nth = instance > 0 ? instance - 1 : positions.length + instance;\n if (nth < 0 || nth >= positions.length) return FormulaValue.errorNA;\n\n const pos = positions[nth]!;\n return FormulaValue.text(\n mode === 'before' ? text.slice(0, pos) : text.slice(pos + delim.length),\n );\n}\n","/**\n * Logical Excel functions.\n * Port of TVE.PureDocs.Excel.Formulas.LogicalFunctions (C#)\n */\nimport { FormulaValue, FormulaError } from '../formula-value.js';\nimport type { FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerLogical(r: FunctionRegistry): void {\n r.register('IF', if_, 2, 3);\n r.register('AND', and, 1);\n r.register('OR', or, 1);\n r.register('NOT', not, 1, 1);\n r.register('XOR', xor, 1);\n r.register('IFERROR', ifError, 2, 2);\n r.register('IFNA', ifNa, 2, 2);\n r.register('IFS', ifs, 2);\n r.register('SWITCH', switch_, 3);\n r.register('TRUE', trueFn, 0, 0);\n r.register('FALSE', falseFn, 0, 0);\n}\n\nfunction if_(a: Args, c: Ctx): FormulaValue {\n const cond = a[0]!.evaluate(c);\n if (cond.isError) return cond;\n const b = cond.coerceToBool();\n if (b.isError) return b;\n return b.booleanValue\n ? a[1]!.evaluate(c)\n : a.length > 2 ? a[2]!.evaluate(c) : FormulaValue.false_;\n}\n\nfunction and(a: Args, c: Ctx): FormulaValue {\n let hasValue = false;\n for (const arg of a) {\n const v = arg.evaluate(c);\n if (v.isError) return v;\n if (v.isArray) {\n for (const item of v.arrayVal.values()) {\n if (item.isBlank) continue;\n if (item.isError) return item;\n hasValue = true;\n const bv = item.coerceToBool();\n if (bv.isError) return bv;\n if (!bv.booleanValue) return FormulaValue.false_;\n }\n } else {\n if (v.isBlank) { hasValue = true; continue; }\n hasValue = true;\n const bv = v.coerceToBool();\n if (bv.isError) return bv;\n if (!bv.booleanValue) return FormulaValue.false_;\n }\n }\n return hasValue ? FormulaValue.true_ : FormulaValue.errorValue;\n}\n\nfunction or(a: Args, c: Ctx): FormulaValue {\n let hasValue = false;\n for (const arg of a) {\n const v = arg.evaluate(c);\n if (v.isError) return v;\n if (v.isArray) {\n for (const item of v.arrayVal.values()) {\n if (item.isBlank) continue;\n if (item.isError) return item;\n hasValue = true;\n const bv = item.coerceToBool();\n if (bv.isError) return bv;\n if (bv.booleanValue) return FormulaValue.true_;\n }\n } else {\n if (v.isBlank) { hasValue = true; continue; }\n hasValue = true;\n const bv = v.coerceToBool();\n if (bv.isError) return bv;\n if (bv.booleanValue) return FormulaValue.true_;\n }\n }\n return hasValue ? FormulaValue.false_ : FormulaValue.errorValue;\n}\n\nfunction not(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n if (v.isError) return v;\n const bv = v.coerceToBool();\n if (bv.isError) return bv;\n return FormulaValue.boolean(!bv.booleanValue);\n}\n\nfunction xor(a: Args, c: Ctx): FormulaValue {\n let trueCount = 0;\n for (const arg of a) {\n const v = arg.evaluate(c);\n if (v.isError) return v;\n const bv = v.coerceToBool();\n if (bv.isError) return bv;\n if (bv.booleanValue) trueCount++;\n }\n return FormulaValue.boolean(trueCount % 2 === 1);\n}\n\nfunction ifError(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n return v.isError ? a[1]!.evaluate(c) : v;\n}\n\nfunction ifNa(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n return v.isError && v.errorCode === FormulaError.NA ? a[1]!.evaluate(c) : v;\n}\n\nfunction ifs(a: Args, c: Ctx): FormulaValue {\n for (let i = 0; i + 1 < a.length; i += 2) {\n const cond = a[i]!.evaluate(c);\n if (cond.isError) return cond;\n const bv = cond.coerceToBool();\n if (bv.isError) return bv;\n if (bv.booleanValue) return a[i + 1]!.evaluate(c);\n }\n return FormulaValue.errorNA;\n}\n\nfunction switch_(a: Args, c: Ctx): FormulaValue {\n const expr = a[0]!.evaluate(c);\n if (expr.isError) return expr;\n for (let i = 1; i + 1 < a.length; i += 2) {\n const cv = a[i]!.evaluate(c);\n if (cv.isError) return cv;\n if (FormulaValue.areEqual(expr, cv)) return a[i + 1]!.evaluate(c);\n }\n // Default value: last arg when even count\n return a.length % 2 === 0 ? a[a.length - 1]!.evaluate(c) : FormulaValue.errorNA;\n}\n\nfunction trueFn(): FormulaValue { return FormulaValue.true_; }\nfunction falseFn(): FormulaValue { return FormulaValue.false_; }\n","/**\n * Date and time Excel functions.\n * Port of TVE.PureDocs.Excel.Formulas.DateFunctions (C#)\n */\nimport { FormulaValue } from '../formula-value.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\n// OADate helpers (same logic as core package, duplicated to avoid circular dep)\nconst OA_EPOCH_MS = Date.UTC(1899, 11, 30, 0, 0, 0, 0);\nconst MS_PER_DAY = 86_400_000;\n\nfunction toOA(date: Date): number {\n return (Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(),\n date.getHours(), date.getMinutes(), date.getSeconds()) - OA_EPOCH_MS) / MS_PER_DAY;\n}\n\nfunction fromOA(oa: number): Date {\n const ms = OA_EPOCH_MS + oa * MS_PER_DAY;\n const d = new Date(ms);\n return new Date(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(),\n d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds());\n}\n\nexport function registerDate(r: FunctionRegistry): void {\n r.register('NOW', now, 0, 0, true);\n r.register('TODAY', today, 0, 0, true);\n r.register('DATE', date_, 3, 3);\n r.register('YEAR', year, 1, 1);\n r.register('MONTH', month, 1, 1);\n r.register('DAY', day, 1, 1);\n r.register('HOUR', hour, 1, 1);\n r.register('MINUTE', minute, 1, 1);\n r.register('SECOND', second, 1, 1);\n r.register('DATEVALUE', dateValue, 1, 1);\n r.register('DAYS', days, 2, 2);\n r.register('EDATE', edate, 2, 2);\n r.register('EOMONTH', eomonth, 2, 2);\n r.register('WEEKDAY', weekday, 1, 2);\n r.register('WEEKNUM', weeknum, 1, 2);\n r.register('NETWORKDAYS', networkdays, 2, 3);\n r.register('DATEDIF', datedif, 3, 3);\n}\n\nfunction evalDate(a: Args, c: Ctx, idx: number): { ok: true; date: Date } | { ok: false; error: FormulaValue } {\n const r = FormulaHelper.evalDouble(a[idx]!, c);\n if (!r.ok) return r;\n try {\n return { ok: true, date: fromOA(r.value) };\n } catch {\n return { ok: false, error: FormulaValue.errorValue };\n }\n}\n\nfunction now(): FormulaValue { return FormulaValue.number(toOA(new Date())); }\nfunction today(): FormulaValue { const d = new Date(); return FormulaValue.number(toOA(new Date(d.getFullYear(), d.getMonth(), d.getDate()))); }\n\nfunction date_(a: Args, c: Ctx): FormulaValue {\n const y = FormulaHelper.evalDouble(a[0]!, c); if (!y.ok) return y.error;\n const m = FormulaHelper.evalDouble(a[1]!, c); if (!m.ok) return m.error;\n const d = FormulaHelper.evalDouble(a[2]!, c); if (!d.ok) return d.error;\n try { return FormulaValue.number(toOA(new Date(Math.round(y.value), Math.round(m.value) - 1, Math.round(d.value)))); }\n catch { return FormulaValue.errorValue; }\n}\n\nfunction year(a: Args, c: Ctx): FormulaValue {\n const r = evalDate(a, c, 0); return r.ok ? FormulaValue.number(r.date.getFullYear()) : r.error;\n}\nfunction month(a: Args, c: Ctx): FormulaValue {\n const r = evalDate(a, c, 0); return r.ok ? FormulaValue.number(r.date.getMonth() + 1) : r.error;\n}\nfunction day(a: Args, c: Ctx): FormulaValue {\n const r = evalDate(a, c, 0); return r.ok ? FormulaValue.number(r.date.getDate()) : r.error;\n}\nfunction hour(a: Args, c: Ctx): FormulaValue {\n const r = evalDate(a, c, 0); return r.ok ? FormulaValue.number(r.date.getHours()) : r.error;\n}\nfunction minute(a: Args, c: Ctx): FormulaValue {\n const r = evalDate(a, c, 0); return r.ok ? FormulaValue.number(r.date.getMinutes()) : r.error;\n}\nfunction second(a: Args, c: Ctx): FormulaValue {\n const r = evalDate(a, c, 0); return r.ok ? FormulaValue.number(r.date.getSeconds()) : r.error;\n}\n\nfunction dateValue(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalString(a[0]!, c); if (!r.ok) return r.error;\n const d = new Date(r.value);\n if (isNaN(d.getTime())) return FormulaValue.errorValue;\n return FormulaValue.number(toOA(d));\n}\n\nfunction days(a: Args, c: Ctx): FormulaValue {\n const d1 = evalDate(a, c, 0); if (!d1.ok) return d1.error;\n const d2 = evalDate(a, c, 1); if (!d2.ok) return d2.error;\n return FormulaValue.number(Math.round((d1.date.getTime() - d2.date.getTime()) / MS_PER_DAY));\n}\n\nfunction edate(a: Args, c: Ctx): FormulaValue {\n const d = evalDate(a, c, 0); if (!d.ok) return d.error;\n const m = FormulaHelper.evalDouble(a[1]!, c); if (!m.ok) return m.error;\n const result = new Date(d.date.getFullYear(), d.date.getMonth() + Math.round(m.value), d.date.getDate());\n return isNaN(result.getTime()) ? FormulaValue.errorNum : FormulaValue.number(toOA(result));\n}\n\nfunction eomonth(a: Args, c: Ctx): FormulaValue {\n const d = evalDate(a, c, 0); if (!d.ok) return d.error;\n const m = FormulaHelper.evalDouble(a[1]!, c); if (!m.ok) return m.error;\n const target = new Date(d.date.getFullYear(), d.date.getMonth() + Math.round(m.value) + 1, 0);\n return isNaN(target.getTime()) ? FormulaValue.errorNum : FormulaValue.number(toOA(target));\n}\n\nfunction weekday(a: Args, c: Ctx): FormulaValue {\n const d = evalDate(a, c, 0); if (!d.ok) return d.error;\n let type = 1;\n if (a.length > 1) { const r = FormulaHelper.evalDouble(a[1]!, c); if (!r.ok) return r.error; type = Math.round(r.value); }\n const dow = d.date.getDay(); // 0 = Sunday\n switch (type) {\n case 1: return FormulaValue.number(dow === 0 ? 1 : dow + 1); // Sun=1\n case 2: return FormulaValue.number(dow === 0 ? 7 : dow); // Mon=1\n case 3: return FormulaValue.number(dow === 0 ? 6 : dow - 1); // Mon=0\n default: return FormulaValue.errorNum;\n }\n}\n\nfunction weeknum(a: Args, c: Ctx): FormulaValue {\n const d = evalDate(a, c, 0); if (!d.ok) return d.error;\n const jan1 = new Date(d.date.getFullYear(), 0, 1);\n const days_ = Math.floor((d.date.getTime() - jan1.getTime()) / MS_PER_DAY);\n return FormulaValue.number(Math.ceil((days_ + jan1.getDay() + 1) / 7));\n}\n\nfunction networkdays(a: Args, c: Ctx): FormulaValue {\n const start = evalDate(a, c, 0); if (!start.ok) return start.error;\n const end = evalDate(a, c, 1); if (!end.ok) return end.error;\n\n const holidays = new Set<number>();\n if (a.length > 2) {\n const hv = a[2]!.evaluate(c);\n if (hv.isError) return hv;\n const items = hv.isArray ? [...hv.arrayVal.values()] : [hv];\n for (const item of items) {\n if (item.isBlank) continue;\n const r = item.tryAsDouble();\n if (!r.ok) return FormulaValue.errorValue;\n holidays.add(Math.floor(r.value));\n }\n }\n\n const dir = start.date <= end.date ? 1 : -1;\n let count = 0;\n const cur = new Date(start.date);\n\n while (dir > 0 ? cur <= end.date : cur >= end.date) {\n const dow = cur.getDay();\n const oa = Math.floor(toOA(cur));\n if (dow !== 0 && dow !== 6 && !holidays.has(oa)) count++;\n cur.setDate(cur.getDate() + dir);\n }\n\n return FormulaValue.number(count * dir);\n}\n\nfunction datedif(a: Args, c: Ctx): FormulaValue {\n const start = evalDate(a, c, 0); if (!start.ok) return start.error;\n const end = evalDate(a, c, 1); if (!end.ok) return end.error;\n const unit = FormulaHelper.evalString(a[2]!, c); if (!unit.ok) return unit.error;\n\n const s = start.date, e = end.date;\n if (s > e) return FormulaValue.errorNum;\n\n switch (unit.value.toUpperCase()) {\n case 'Y':\n return FormulaValue.number(e.getFullYear() - s.getFullYear() -\n (e.getMonth() < s.getMonth() || (e.getMonth() === s.getMonth() && e.getDate() < s.getDate()) ? 1 : 0));\n case 'M':\n return FormulaValue.number((e.getFullYear() - s.getFullYear()) * 12 + e.getMonth() - s.getMonth() -\n (e.getDate() < s.getDate() ? 1 : 0));\n case 'D':\n return FormulaValue.number(Math.round((e.getTime() - s.getTime()) / MS_PER_DAY));\n case 'MD':\n return FormulaValue.number(e.getDate() >= s.getDate()\n ? e.getDate() - s.getDate()\n : new Date(s.getFullYear(), s.getMonth() + 1, 0).getDate() - s.getDate() + e.getDate());\n case 'YM':\n return FormulaValue.number((e.getMonth() - s.getMonth() + 12) % 12 - (e.getDate() < s.getDate() ? 1 : 0));\n case 'YD': {\n const sameYearEnd = new Date(e.getFullYear(), s.getMonth(), s.getDate());\n return FormulaValue.number(Math.round((e.getTime() - sameYearEnd.getTime()) / MS_PER_DAY));\n }\n default: return FormulaValue.errorNum;\n }\n}\n","/**\n * Lookup and reference Excel functions.\n * Port of TVE.PureDocs.Excel.Formulas.LookupFunctions (C#)\n */\nimport { parseCellRef, cellRefFromRowCol, columnLetter } from '@devmm/puredocs-excel';\nimport { FormulaValue, ArrayValue } from '../formula-value.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport { CellReferenceNode, RangeReferenceNode } from '../formula-node.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerLookup(r: FunctionRegistry): void {\n r.register('VLOOKUP', vlookup, 3, 4);\n r.register('HLOOKUP', hlookup, 3, 4);\n r.register('XLOOKUP', xlookup, 3, 6);\n r.register('LOOKUP', lookup, 2, 3);\n r.register('INDEX', index_, 2, 3);\n r.register('MATCH', match, 2, 3);\n r.register('XMATCH', xmatch, 2, 4);\n r.register('CHOOSE', choose, 2);\n r.register('ADDRESS', address, 2, 5);\n r.register('ROW', row, 0, 1);\n r.register('COLUMN', column, 0, 1);\n r.register('ROWS', rows, 1, 1);\n r.register('COLUMNS', columns, 1, 1);\n r.register('OFFSET', offset, 3, 5, true);\n r.register('INDIRECT', indirect, 1, 2, true);\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction num(a: Args, c: Ctx, i: number): { ok: true; n: number } | { ok: false; e: FormulaValue } {\n const r = FormulaHelper.evalDouble(a[i]!, c);\n return r.ok ? { ok: true, n: r.value } : { ok: false, e: r.error };\n}\n\n// ── Implementations ──────────────────────────────────────────────────────────\n\nfunction vlookup(a: Args, c: Ctx): FormulaValue {\n const lookupVal = a[0]!.evaluate(c); if (lookupVal.isError) return lookupVal;\n const tableVal = a[1]!.evaluate(c); if (tableVal.isError) return tableVal;\n if (!tableVal.isArray) return FormulaValue.errorRef;\n const ci = num(a, c, 2); if (!ci.ok) return ci.e;\n const colIdx = Math.round(ci.n) - 1;\n\n let exactMatch = true;\n if (a.length > 3) {\n const mv = a[3]!.evaluate(c);\n if (mv.isError) return mv;\n exactMatch = !mv.coerceToBool().booleanValue;\n }\n\n const tbl = tableVal.arrayVal;\n if (colIdx < 0 || colIdx >= tbl.columns) return FormulaValue.errorRef;\n\n if (exactMatch) {\n for (let r = 0; r < tbl.rows; r++) {\n if (FormulaValue.areEqual(tbl.get(r, 0), lookupVal)) return tbl.get(r, colIdx);\n }\n return FormulaValue.errorNA;\n }\n\n // Approximate match — first column must be sorted ascending\n let best = -1;\n for (let r = 0; r < tbl.rows; r++) {\n if (FormulaValue.compare(tbl.get(r, 0), lookupVal) <= 0) best = r; else break;\n }\n return best >= 0 ? tbl.get(best, colIdx) : FormulaValue.errorNA;\n}\n\nfunction hlookup(a: Args, c: Ctx): FormulaValue {\n const lookupVal = a[0]!.evaluate(c); if (lookupVal.isError) return lookupVal;\n const tableVal = a[1]!.evaluate(c); if (tableVal.isError) return tableVal;\n if (!tableVal.isArray) return FormulaValue.errorRef;\n const ri = num(a, c, 2); if (!ri.ok) return ri.e;\n const rowIdx = Math.round(ri.n) - 1;\n\n let exactMatch = true;\n if (a.length > 3) {\n const mv = a[3]!.evaluate(c);\n if (mv.isError) return mv;\n exactMatch = !mv.coerceToBool().booleanValue;\n }\n\n const tbl = tableVal.arrayVal;\n if (rowIdx < 0 || rowIdx >= tbl.rows) return FormulaValue.errorRef;\n\n if (exactMatch) {\n for (let col = 0; col < tbl.columns; col++) {\n if (FormulaValue.areEqual(tbl.get(0, col), lookupVal)) return tbl.get(rowIdx, col);\n }\n return FormulaValue.errorNA;\n }\n\n let best = -1;\n for (let col = 0; col < tbl.columns; col++) {\n if (FormulaValue.compare(tbl.get(0, col), lookupVal) <= 0) best = col; else break;\n }\n return best >= 0 ? tbl.get(rowIdx, best) : FormulaValue.errorNA;\n}\n\n/** Builds a case-insensitive regex from an Excel wildcard pattern (*, ?, ~). */\nfunction wildcardRegex(pattern: string): RegExp {\n let out = '';\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern[i]!;\n if (ch === '~' && i + 1 < pattern.length) {\n const next = pattern[++i]!;\n out += next.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n } else if (ch === '*') out += '.*';\n else if (ch === '?') out += '.';\n else out += ch.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n return new RegExp(`^${out}$`, 'i');\n}\n\n/**\n * Locates the match index (0-based) in a length-`n` vector, or -1.\n * matchMode: 0 exact · -1 exact-or-next-smaller · 1 exact-or-next-larger · 2 wildcard\n * searchMode: 1 first→last · -1 last→first · 2 binary asc · -2 binary desc\n * Binary modes read the vector via `get` without materialising it, so a lookup\n * over a full sorted column stays O(log n) in both time and allocations.\n */\nfunction findMatch(\n n: number,\n get: (i: number) => FormulaValue,\n lookupVal: FormulaValue,\n matchMode: number,\n searchMode: number,\n): number {\n // Binary search (only meaningful for exact / next-smaller / next-larger).\n if ((searchMode === 2 || searchMode === -2) && matchMode !== 2) {\n const at = searchMode === 2 ? get : (j: number) => get(n - 1 - j);\n let lo = 0, hi = n - 1, lastLE = -1, firstGE = -1;\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const cmp = FormulaValue.compare(at(mid), lookupVal);\n if (cmp === 0) return searchMode === 2 ? mid : n - 1 - mid;\n if (cmp < 0) { lastLE = mid; lo = mid + 1; }\n else { firstGE = mid; hi = mid - 1; }\n }\n const idx = matchMode === -1 ? lastLE : matchMode === 1 ? firstGE : -1;\n return idx < 0 ? -1 : (searchMode === 2 ? idx : n - 1 - idx);\n }\n\n // Linear scan (honouring direction).\n const reverse = searchMode === -1;\n const order = reverse\n ? Array.from({ length: n }, (_, k) => n - 1 - k)\n : Array.from({ length: n }, (_, k) => k);\n\n if (matchMode === 2) {\n const re = wildcardRegex(lookupVal.asText());\n for (const i of order) if (re.test(get(i).asText())) return i;\n return -1;\n }\n if (matchMode === 0) {\n for (const i of order) if (FormulaValue.areEqual(get(i), lookupVal)) return i;\n return -1;\n }\n\n // Approximate: track the closest value on the requested side.\n let best = -1;\n let bestVal: FormulaValue | null = null;\n for (const i of order) {\n const v = get(i);\n const cmp = FormulaValue.compare(v, lookupVal);\n if (cmp === 0) return i;\n if (matchMode === -1 && cmp < 0) {\n if (bestVal === null || FormulaValue.compare(v, bestVal) > 0) { best = i; bestVal = v; }\n } else if (matchMode === 1 && cmp > 0) {\n if (bestVal === null || FormulaValue.compare(v, bestVal) < 0) { best = i; bestVal = v; }\n }\n }\n return best;\n}\n\nfunction xlookup(a: Args, c: Ctx): FormulaValue {\n const lookupVal = a[0]!.evaluate(c); if (lookupVal.isError) return lookupVal;\n const lookupRaw = a[1]!.evaluate(c); if (lookupRaw.isError) return lookupRaw;\n const returnRaw = a[2]!.evaluate(c); if (returnRaw.isError) return returnRaw;\n\n const matchMode = a.length > 4 ? num(a, c, 4) : { ok: true as const, n: 0 };\n if (!matchMode.ok) return matchMode.e;\n const searchMode = a.length > 5 ? num(a, c, 5) : { ok: true as const, n: 1 };\n if (!searchMode.ok) return searchMode.e;\n const mm = Math.trunc(matchMode.n), sm = Math.trunc(searchMode.n);\n\n const la = lookupRaw.isArray ? lookupRaw.arrayVal : ArrayValue.fromScalar(lookupRaw);\n if (la.rows > 1 && la.columns > 1) return FormulaValue.errorValue;\n const vertical = !(la.rows === 1 && la.columns > 1);\n const n = vertical ? la.rows : la.columns;\n const get = vertical ? (i: number) => la.get(i, 0) : (i: number) => la.get(0, i);\n\n const idx = findMatch(n, get, lookupVal, mm, sm);\n if (idx < 0) {\n return a.length > 3 ? a[3]!.evaluate(c) : FormulaValue.errorNA;\n }\n\n const ret = returnRaw.isArray ? returnRaw.arrayVal : ArrayValue.fromScalar(returnRaw);\n if (vertical) {\n if (ret.rows !== n) return FormulaValue.errorValue;\n if (ret.columns === 1) return ret.get(idx, 0);\n const out = new ArrayValue(1, ret.columns);\n for (let col = 0; col < ret.columns; col++) out.set(0, col, ret.get(idx, col));\n return FormulaValue.array(out);\n }\n if (ret.columns !== n) return FormulaValue.errorValue;\n if (ret.rows === 1) return ret.get(0, idx);\n const out = new ArrayValue(ret.rows, 1);\n for (let r = 0; r < ret.rows; r++) out.set(r, 0, ret.get(r, idx));\n return FormulaValue.array(out);\n}\n\n/**\n * XMATCH(lookup_value, lookup_array, [match_mode], [search_mode]) — returns the\n * 1-based position of a value in a 1-D vector. Semantics (match/search modes)\n * are identical to XLOOKUP, so we reuse `findMatch`: binary modes stay O(log n)\n * with no array materialisation, keeping full-column lookups cheap.\n */\nfunction xmatch(a: Args, c: Ctx): FormulaValue {\n const lookupVal = a[0]!.evaluate(c); if (lookupVal.isError) return lookupVal;\n const lookupRaw = a[1]!.evaluate(c); if (lookupRaw.isError) return lookupRaw;\n\n const matchMode = a.length > 2 ? num(a, c, 2) : { ok: true as const, n: 0 };\n if (!matchMode.ok) return matchMode.e;\n const searchMode = a.length > 3 ? num(a, c, 3) : { ok: true as const, n: 1 };\n if (!searchMode.ok) return searchMode.e;\n\n const la = lookupRaw.isArray ? lookupRaw.arrayVal : ArrayValue.fromScalar(lookupRaw);\n if (la.rows > 1 && la.columns > 1) return FormulaValue.errorValue;\n const vertical = !(la.rows === 1 && la.columns > 1);\n const n = vertical ? la.rows : la.columns;\n const get = vertical ? (i: number) => la.get(i, 0) : (i: number) => la.get(0, i);\n\n const idx = findMatch(n, get, lookupVal, Math.trunc(matchMode.n), Math.trunc(searchMode.n));\n return idx < 0 ? FormulaValue.errorNA : FormulaValue.number(idx + 1);\n}\n\nfunction index_(a: Args, c: Ctx): FormulaValue {\n const arrVal = a[0]!.evaluate(c); if (arrVal.isError) return arrVal;\n const rv = num(a, c, 1); if (!rv.ok) return rv.e;\n const rowIdx = Math.round(rv.n) - 1;\n let colIdx = 0;\n if (a.length > 2) { const cv = num(a, c, 2); if (!cv.ok) return cv.e; colIdx = Math.round(cv.n) - 1; }\n\n if (!arrVal.isArray) return rowIdx === 0 && colIdx === 0 ? arrVal : FormulaValue.errorRef;\n\n const arr = arrVal.arrayVal;\n if (rowIdx < 0 || rowIdx >= arr.rows || colIdx < 0 || colIdx >= arr.columns) {\n return FormulaValue.errorRef;\n }\n return arr.get(rowIdx, colIdx);\n}\n\nfunction match(a: Args, c: Ctx): FormulaValue {\n const lookupVal = a[0]!.evaluate(c); if (lookupVal.isError) return lookupVal;\n const arrVal = a[1]!.evaluate(c); if (arrVal.isError) return arrVal;\n let matchType = 1;\n if (a.length > 2) { const r = num(a, c, 2); if (!r.ok) return r.e; matchType = Math.round(r.n); }\n\n if (!arrVal.isArray) {\n return FormulaValue.areEqual(arrVal, lookupVal) ? FormulaValue.one : FormulaValue.errorNA;\n }\n\n const arr = arrVal.arrayVal;\n const len = arr.length;\n\n if (matchType === 0) {\n for (let i = 0; i < len; i++) {\n if (FormulaValue.areEqual(arr.getFlat(i), lookupVal)) return FormulaValue.number(i + 1);\n }\n return FormulaValue.errorNA;\n }\n\n if (matchType === 1) {\n let best = -1;\n for (let i = 0; i < len; i++) {\n if (FormulaValue.compare(arr.getFlat(i), lookupVal) <= 0) best = i; else break;\n }\n return best >= 0 ? FormulaValue.number(best + 1) : FormulaValue.errorNA;\n }\n\n // matchType === -1\n let best = -1;\n for (let i = 0; i < len; i++) {\n if (FormulaValue.compare(arr.getFlat(i), lookupVal) >= 0) best = i; else break;\n }\n return best >= 0 ? FormulaValue.number(best + 1) : FormulaValue.errorNA;\n}\n\nfunction choose(a: Args, c: Ctx): FormulaValue {\n const iv = num(a, c, 0); if (!iv.ok) return iv.e;\n const idx = Math.round(iv.n);\n if (idx < 1 || idx >= a.length) return FormulaValue.errorValue;\n return a[idx]!.evaluate(c);\n}\n\n/** Largest index i (in flat order) with values[i] <= lookupVal, else -1. */\nfunction approxMatchFlat(arr: ArrayValue, lookupVal: FormulaValue): number {\n let best = -1;\n for (let i = 0; i < arr.length; i++) {\n if (FormulaValue.compare(arr.getFlat(i), lookupVal) <= 0) best = i;\n else break;\n }\n return best;\n}\n\nfunction lookup(a: Args, c: Ctx): FormulaValue {\n const lookupVal = a[0]!.evaluate(c); if (lookupVal.isError) return lookupVal;\n const vecVal = a[1]!.evaluate(c); if (vecVal.isError) return vecVal;\n\n // Vector form with explicit result vector.\n if (a.length > 2) {\n const resVal = a[2]!.evaluate(c); if (resVal.isError) return resVal;\n const vecArr = vecVal.isArray ? vecVal.arrayVal : ArrayValue.fromScalar(vecVal);\n const idx = approxMatchFlat(vecArr, lookupVal);\n if (idx < 0) return FormulaValue.errorNA;\n if (resVal.isArray) return resVal.arrayVal.getFlat(idx);\n return idx === 0 ? resVal : FormulaValue.errorNA;\n }\n\n // Scalar.\n if (!vecVal.isArray) {\n return FormulaValue.areEqual(vecVal, lookupVal) ? vecVal : FormulaValue.errorNA;\n }\n\n // Array form: Excel searches the first row when the array is wider than tall,\n // otherwise the first column; the result comes from the last row/column.\n const arr = vecVal.arrayVal;\n if (arr.columns >= arr.rows) {\n let best = -1;\n for (let col = 0; col < arr.columns; col++) {\n if (FormulaValue.compare(arr.get(0, col), lookupVal) <= 0) best = col; else break;\n }\n return best >= 0 ? arr.get(arr.rows - 1, best) : FormulaValue.errorNA;\n }\n let best = -1;\n for (let r = 0; r < arr.rows; r++) {\n if (FormulaValue.compare(arr.get(r, 0), lookupVal) <= 0) best = r; else break;\n }\n return best >= 0 ? arr.get(best, arr.columns - 1) : FormulaValue.errorNA;\n}\n\nfunction address(a: Args, c: Ctx): FormulaValue {\n const rn = num(a, c, 0); if (!rn.ok) return rn.e;\n const cn = num(a, c, 1); if (!cn.ok) return cn.e;\n const row = Math.round(rn.n);\n const col = Math.round(cn.n);\n if (row < 1 || col < 1) return FormulaValue.errorValue;\n\n let absNum = 1;\n if (a.length > 2) { const r = num(a, c, 2); if (!r.ok) return r.e; absNum = Math.round(r.n); }\n if (absNum < 1 || absNum > 4) return FormulaValue.errorValue;\n\n let a1 = true;\n if (a.length > 3) {\n const v = a[3]!.evaluate(c);\n if (v.isError) return v;\n // A1 style is the default; only an explicit FALSE selects R1C1.\n a1 = v.isBlank ? true : v.coerceToBool().booleanValue;\n }\n\n let sheetPrefix = '';\n if (a.length > 4) {\n const s = FormulaHelper.evalString(a[4]!, c);\n if (!s.ok) return s.error;\n if (s.value !== '') sheetPrefix = `${s.value}!`;\n }\n\n const rowAbs = absNum === 1 || absNum === 2;\n const colAbs = absNum === 1 || absNum === 3;\n\n let ref: string;\n if (a1) {\n ref = `${colAbs ? '$' : ''}${columnLetter(col)}${rowAbs ? '$' : ''}${row}`;\n } else {\n const rPart = rowAbs ? `R${row}` : `R[${row}]`;\n const cPart = colAbs ? `C${col}` : `C[${col}]`;\n ref = `${rPart}${cPart}`;\n }\n return FormulaValue.text(`${sheetPrefix}${ref}`);\n}\n\nfunction row(a: Args, c: Ctx): FormulaValue {\n if (a.length === 0) return FormulaValue.number(c.formulaRow || 1);\n const node = a[0]!;\n if (node instanceof CellReferenceNode) {\n return FormulaValue.number(parseCellRef(node.reference).row);\n }\n if (node instanceof RangeReferenceNode) {\n return FormulaValue.number(parseCellRef(node.startRef).row);\n }\n return FormulaValue.errorValue;\n}\n\nfunction column(a: Args, c: Ctx): FormulaValue {\n if (a.length === 0) return FormulaValue.number(c.formulaCol || 1);\n const node = a[0]!;\n if (node instanceof CellReferenceNode) {\n return FormulaValue.number(parseCellRef(node.reference).column);\n }\n if (node instanceof RangeReferenceNode) {\n return FormulaValue.number(parseCellRef(node.startRef).column);\n }\n return FormulaValue.errorValue;\n}\n\nfunction rows(a: Args, c: Ctx): FormulaValue {\n if (a[0] instanceof RangeReferenceNode) {\n const b = c.getRangeBounds(a[0].startRef, a[0].endRef);\n return FormulaValue.number(b.endRow - b.startRow + 1);\n }\n const v = a[0]!.evaluate(c);\n return v.isArray ? FormulaValue.number(v.arrayVal.rows) : FormulaValue.one;\n}\n\nfunction columns(a: Args, c: Ctx): FormulaValue {\n if (a[0] instanceof RangeReferenceNode) {\n const b = c.getRangeBounds(a[0].startRef, a[0].endRef);\n return FormulaValue.number(b.endCol - b.startCol + 1);\n }\n const v = a[0]!.evaluate(c);\n return v.isArray ? FormulaValue.number(v.arrayVal.columns) : FormulaValue.one;\n}\n\n// INDIRECT(ref_text, [a1]) — resolves a reference given as text. Volatile: the\n// dependency graph cannot see through it, so the recalc engine recomputes it\n// every pass.\nfunction indirect(a: Args, c: Ctx): FormulaValue {\n const s = FormulaHelper.evalString(a[0]!, c);\n if (!s.ok) return s.error;\n let a1 = true;\n if (a.length > 1) {\n const v = a[1]!.evaluate(c);\n if (v.isError) return v;\n a1 = v.isBlank ? true : v.coerceToBool().booleanValue;\n }\n\n const text = s.value.trim();\n if (text === '') return FormulaValue.errorRef;\n\n // Split off an optional sheet qualifier (\"Sheet1!\" or \"'My Sheet'!\").\n let sheet: string | undefined;\n let body = text;\n const bang = text.lastIndexOf('!');\n if (bang >= 0) {\n sheet = text.slice(0, bang).replace(/^'|'$/g, '');\n body = text.slice(bang + 1);\n }\n\n const colon = body.indexOf(':');\n try {\n if (colon >= 0) {\n const start = toA1(body.slice(0, colon), a1, c);\n const end = toA1(body.slice(colon + 1), a1, c);\n if (start === null || end === null) return FormulaValue.errorRef;\n return sheet !== undefined\n ? c.getSheetRangeValues(sheet, start, end)\n : c.getRangeValues(start, end);\n }\n const cell = toA1(body, a1, c);\n if (cell === null) return FormulaValue.errorRef;\n return sheet !== undefined ? c.getSheetCellValue(sheet, cell) : c.getCellValue(cell);\n } catch {\n return FormulaValue.errorRef;\n }\n}\n\n/** Normalises a single reference (A1 or R1C1) to a plain A1 string, or null. */\nfunction toA1(ref: string, a1: boolean, c: Ctx): string | null {\n const r = ref.trim();\n if (a1) {\n try {\n const { row, column } = parseCellRef(r);\n return cellRefFromRowCol(row, column);\n } catch {\n return null;\n }\n }\n // R1C1 — absolute R{n}C{n} or relative R[{d}]C[{d}] (relative to formula cell).\n const m = /^R(\\[-?\\d+\\]|\\d+)?C(\\[-?\\d+\\]|\\d+)?$/i.exec(r);\n if (!m) return null;\n const axis = (part: string | undefined, base: number): number | null => {\n if (part === undefined) return base; // bare R or C → same row/col\n if (part.startsWith('[')) return base + parseInt(part.slice(1, -1), 10); // relative\n return parseInt(part, 10); // absolute\n };\n const row = axis(m[1], c.formulaRow || 1);\n const col = axis(m[2], c.formulaCol || 1);\n if (row === null || col === null || row < 1 || col < 1) return null;\n return cellRefFromRowCol(row, col);\n}\n\nfunction offset(a: Args, c: Ctx): FormulaValue {\n const baseNode = a[0]!;\n let baseRef: string;\n if (baseNode instanceof CellReferenceNode) baseRef = baseNode.reference;\n else if (baseNode instanceof RangeReferenceNode) baseRef = baseNode.startRef;\n else return FormulaValue.errorValue;\n\n const base = parseCellRef(baseRef);\n\n const ro = FormulaHelper.evalDouble(a[1]!, c); if (!ro.ok) return ro.error;\n const co = FormulaHelper.evalDouble(a[2]!, c); if (!co.ok) return co.error;\n\n const newRow = base.row + Math.round(ro.value);\n const newCol = base.column + Math.round(co.value);\n if (newRow < 1 || newCol < 1) return FormulaValue.errorRef;\n\n let height = 1, width = 1;\n if (a.length > 3) { const h = FormulaHelper.evalDouble(a[3]!, c); if (!h.ok) return h.error; height = Math.round(h.value); }\n if (a.length > 4) { const w = FormulaHelper.evalDouble(a[4]!, c); if (!w.ok) return w.error; width = Math.round(w.value); }\n\n if (height === 1 && width === 1) return c.getCellValue(cellRefFromRowCol(newRow, newCol));\n\n return c.getRangeValues(\n cellRefFromRowCol(newRow, newCol),\n cellRefFromRowCol(newRow + height - 1, newCol + width - 1),\n );\n}\n","/**\n * Statistical Excel functions.\n * Port of TVE.PureDocs.Excel.Formulas.StatisticalFunctions (C#)\n */\nimport { FormulaValue } from '../formula-value.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerStatistical(r: FunctionRegistry): void {\n r.register('MEDIAN', median, 1);\n r.register('MODE', mode, 1);\n r.register('MODE.SNGL', mode, 1);\n r.register('STDEV', stdev, 1);\n r.register('STDEV.S', stdev, 1);\n r.register('STDEVP', stdevp, 1);\n r.register('STDEV.P', stdevp, 1);\n r.register('VAR', var_, 1);\n r.register('VAR.S', var_, 1);\n r.register('VARP', varp, 1);\n r.register('VAR.P', varp, 1);\n r.register('LARGE', large, 2, 2);\n r.register('SMALL', small, 2, 2);\n r.register('RANK', rank, 2, 3);\n r.register('RANK.EQ', rank, 2, 3);\n r.register('PERCENTILE', percentile, 2, 2);\n r.register('PERCENTILE.INC', percentile, 2, 2);\n r.register('MAXIFS', maxIfs, 3);\n r.register('MINIFS', minIfs, 3);\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction variance(nums: number[], population: boolean): number {\n const mean = nums.reduce((s, n) => s + n, 0) / nums.length;\n const sumSq = nums.reduce((s, n) => s + (n - mean) ** 2, 0);\n return sumSq / (population ? nums.length : nums.length - 1);\n}\n\nfunction numsFromArray(v: FormulaValue): number[] {\n if (v.isArray) {\n return [...v.arrayVal.values()]\n .filter(i => i.isNumber)\n .map(i => i.numberValue);\n }\n return v.isNumber ? [v.numberValue] : [];\n}\n\nfunction num(a: Args, c: Ctx, i: number): { ok: true; n: number } | { ok: false; e: FormulaValue } {\n const r = FormulaHelper.evalDouble(a[i]!, c);\n return r.ok ? { ok: true, n: r.value } : { ok: false, e: r.error };\n}\n\n// ── Implementations ──────────────────────────────────────────────────────────\n\nfunction median(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length === 0) return FormulaValue.errorNum;\n const sorted = [...r.values].sort((a, b) => a - b);\n const mid = sorted.length >> 1;\n return FormulaValue.number(\n sorted.length % 2 === 0 ? (sorted[mid - 1]! + sorted[mid]!) / 2 : sorted[mid]!,\n );\n}\n\nfunction mode(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length === 0) return FormulaValue.errorNA;\n const freq = new Map<number, number>();\n let maxCnt = 0;\n for (const n of r.values) {\n const cnt = (freq.get(n) ?? 0) + 1;\n freq.set(n, cnt);\n if (cnt > maxCnt) maxCnt = cnt;\n }\n if (maxCnt === 1) return FormulaValue.errorNA;\n for (const n of r.values) {\n if ((freq.get(n) ?? 0) === maxCnt) return FormulaValue.number(n);\n }\n return FormulaValue.errorNA;\n}\n\nfunction stdev(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length < 2) return FormulaValue.errorDiv0;\n return FormulaValue.number(Math.sqrt(variance(r.values, false)));\n}\n\nfunction stdevp(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length === 0) return FormulaValue.errorDiv0;\n return FormulaValue.number(Math.sqrt(variance(r.values, true)));\n}\n\nfunction var_(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length < 2) return FormulaValue.errorDiv0;\n return FormulaValue.number(variance(r.values, false));\n}\n\nfunction varp(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length === 0) return FormulaValue.errorDiv0;\n return FormulaValue.number(variance(r.values, true));\n}\n\nfunction large(a: Args, c: Ctx): FormulaValue {\n const arrV = a[0]!.evaluate(c); if (arrV.isError) return arrV;\n const kv = num(a, c, 1); if (!kv.ok) return kv.e;\n const nums = numsFromArray(arrV).sort((a, b) => b - a);\n const k = Math.round(kv.n);\n if (k < 1 || k > nums.length) return FormulaValue.errorNum;\n return FormulaValue.number(nums[k - 1]!);\n}\n\nfunction small(a: Args, c: Ctx): FormulaValue {\n const arrV = a[0]!.evaluate(c); if (arrV.isError) return arrV;\n const kv = num(a, c, 1); if (!kv.ok) return kv.e;\n const nums = numsFromArray(arrV).sort((a, b) => a - b);\n const k = Math.round(kv.n);\n if (k < 1 || k > nums.length) return FormulaValue.errorNum;\n return FormulaValue.number(nums[k - 1]!);\n}\n\nfunction rank(a: Args, c: Ctx): FormulaValue {\n const nv = FormulaHelper.evalDouble(a[0]!, c); if (!nv.ok) return nv.error;\n const arrV = a[1]!.evaluate(c); if (arrV.isError) return arrV;\n let order = 0;\n if (a.length > 2) { const ov = num(a, c, 2); if (!ov.ok) return ov.e; order = Math.round(ov.n); }\n const nums = numsFromArray(arrV).sort((a, b) => order === 0 ? b - a : a - b);\n const idx = nums.indexOf(nv.value);\n return idx < 0 ? FormulaValue.errorNA : FormulaValue.number(idx + 1);\n}\n\nfunction percentile(a: Args, c: Ctx): FormulaValue {\n const arrV = a[0]!.evaluate(c); if (arrV.isError) return arrV;\n const kv = FormulaHelper.evalDouble(a[1]!, c); if (!kv.ok) return kv.error;\n if (kv.value < 0 || kv.value > 1) return FormulaValue.errorNum;\n const nums = numsFromArray(arrV).sort((a, b) => a - b);\n if (nums.length === 0) return FormulaValue.errorNum;\n const n = (nums.length - 1) * kv.value;\n const lo = Math.floor(n), hi = Math.ceil(n);\n if (lo === hi) return FormulaValue.number(nums[lo]!);\n return FormulaValue.number(nums[lo]! + (nums[hi]! - nums[lo]!) * (n - lo));\n}\n\nfunction maxIfs(a: Args, c: Ctx): FormulaValue {\n return ifsAggregate(a, c, 'max');\n}\n\nfunction minIfs(a: Args, c: Ctx): FormulaValue {\n return ifsAggregate(a, c, 'min');\n}\n\nfunction ifsAggregate(a: Args, c: Ctx, mode: 'max' | 'min'): FormulaValue {\n if (a.length < 3 || (a.length - 1) % 2 !== 0) return FormulaValue.errorValue;\n const mainRange = a[0]!.evaluate(c); if (mainRange.isError) return mainRange;\n if (!mainRange.isArray) return FormulaValue.errorValue;\n\n const arr = mainRange.arrayVal;\n const len = arr.length;\n const mask = new Uint8Array(len).fill(1);\n\n for (let p = 1; p + 1 < a.length; p += 2) {\n const cr = a[p]!.evaluate(c); if (cr.isError) return cr;\n const criteria = a[p + 1]!.evaluate(c).asText();\n const crArr = cr.isArray ? cr.arrayVal : null;\n for (let i = 0; i < len; i++) {\n if (!mask[i]) continue;\n const cv = crArr ? crArr.getFlat(i) : cr;\n if (!FormulaHelper.matchesCriteria(cv, criteria)) mask[i] = 0;\n }\n }\n\n let result = mode === 'max' ? -Infinity : Infinity;\n let found = false;\n for (let i = 0; i < len; i++) {\n if (!mask[i]) continue;\n const r = arr.getFlat(i).tryAsDouble();\n if (!r.ok) continue;\n if (mode === 'max' ? r.value > result : r.value < result) { result = r.value; found = true; }\n }\n return found ? FormulaValue.number(result) : FormulaValue.zero;\n}\n","/**\n * Information Excel functions (IS*, TYPE, N, ERROR.TYPE, etc.).\n * Port of TVE.PureDocs.Excel.Formulas.InfoFunctions (C#)\n */\nimport { FormulaValue, FormulaError } from '../formula-value.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerInfo(r: FunctionRegistry): void {\n r.register('ISBLANK', isBlank, 1, 1);\n r.register('ISNUMBER', isNumber, 1, 1);\n r.register('ISTEXT', isText, 1, 1);\n r.register('ISERROR', isError, 1, 1);\n r.register('ISERR', isErr, 1, 1);\n r.register('ISLOGICAL', isLogical, 1, 1);\n r.register('ISNA', isNa, 1, 1);\n r.register('ISNONTEXT', isNonText, 1, 1);\n r.register('NA', na, 0, 0);\n r.register('TYPE', type_, 1, 1);\n r.register('N', n_, 1, 1);\n r.register('ISODD', isOdd, 1, 1);\n r.register('ISEVEN', isEven, 1, 1);\n r.register('ERROR.TYPE', errorType, 1, 1);\n}\n\nfunction isBlank(a: Args, c: Ctx): FormulaValue { return FormulaValue.boolean(a[0]!.evaluate(c).isBlank); }\nfunction isNumber(a: Args, c: Ctx): FormulaValue { return FormulaValue.boolean(a[0]!.evaluate(c).isNumber); }\nfunction isText(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n return FormulaValue.boolean(v.isText && v.textValue.length > 0);\n}\nfunction isError(a: Args, c: Ctx): FormulaValue { return FormulaValue.boolean(a[0]!.evaluate(c).isError); }\nfunction isErr(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n return FormulaValue.boolean(v.isError && v.errorCode !== FormulaError.NA);\n}\nfunction isLogical(a: Args, c: Ctx): FormulaValue { return FormulaValue.boolean(a[0]!.evaluate(c).isBoolean); }\nfunction isNa(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n return FormulaValue.boolean(v.isError && v.errorCode === FormulaError.NA);\n}\nfunction isNonText(a: Args, c: Ctx): FormulaValue { return FormulaValue.boolean(!a[0]!.evaluate(c).isText); }\nfunction na(): FormulaValue { return FormulaValue.errorNA; }\n\nfunction type_(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n const t = v.isNumber || v.isBlank ? 1\n : v.isText ? 2\n : v.isBoolean ? 4\n : v.isError ? 16\n : v.isArray ? 64 : 1;\n return FormulaValue.number(t);\n}\n\nfunction n_(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n if (v.isNumber) return v;\n if (v.isBoolean) return FormulaValue.number(v.booleanValue ? 1 : 0);\n return FormulaValue.zero;\n}\n\nfunction isOdd(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c); if (!r.ok) return r.error;\n return FormulaValue.boolean(Math.abs(Math.trunc(r.value)) % 2 === 1);\n}\n\nfunction isEven(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c); if (!r.ok) return r.error;\n return FormulaValue.boolean(Math.trunc(r.value) % 2 === 0);\n}\n\nfunction errorType(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n if (!v.isError) return FormulaValue.errorNA;\n const map: Partial<Record<FormulaError, number>> = {\n [FormulaError.Null]: 1,\n [FormulaError.Div0]: 2,\n [FormulaError.Value]: 3,\n [FormulaError.Ref]: 4,\n [FormulaError.Name]: 5,\n [FormulaError.Num]: 6,\n [FormulaError.NA]: 7,\n };\n return FormulaValue.number(map[v.errorCode] ?? 7);\n}\n","/**\n * Financial Excel functions: PMT, FV, PV, NPV, IRR, RATE, NPER, XNPV, XIRR,\n * IPMT, PPMT.\n *\n * Sign conventions follow Excel: money you receive is positive, money you pay\n * is negative. `type` is 0 for end-of-period payments (default) or 1 for\n * beginning-of-period.\n */\nimport { FormulaValue } from '../formula-value.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerFinance(r: FunctionRegistry): void {\n r.register('PMT', pmt, 3, 5);\n r.register('FV', fv, 3, 5);\n r.register('PV', pv, 3, 5);\n r.register('NPV', npv, 2);\n r.register('IRR', irr, 1, 2);\n r.register('RATE', rate, 3, 6);\n r.register('NPER', nper, 3, 5);\n r.register('XNPV', xnpv, 3, 3);\n r.register('XIRR', xirr, 2, 3);\n r.register('IPMT', ipmt, 4, 6);\n r.register('PPMT', ppmt, 4, 6);\n}\n\n// ── Shared time-value-of-money kernels (used by PMT/FV/IPMT/PPMT) ─────────────\n\n/** Level payment for an annuity. Mirrors Excel PMT. */\nfunction pmtValue(r: number, n: number, pv: number, fv: number, type: number): number {\n if (r === 0) return -(pv + fv) / n;\n const pow = Math.pow(1 + r, n);\n let payment = (-fv - pv * pow) * r / (pow - 1);\n if (type === 1) payment /= (1 + r);\n return payment;\n}\n\n/** Future value after `n` periods. Mirrors Excel FV. */\nfunction fvValue(r: number, n: number, pmt: number, pv: number, type: number): number {\n if (r === 0) return -(pv + pmt * n);\n const pow = Math.pow(1 + r, n);\n return -(pv * pow + pmt * (1 + r * type) * (pow - 1) / r);\n}\n\n/** Reads argument `idx` as a number, defaulting when the argument is absent. */\nfunction arg(a: Args, c: Ctx, idx: number, dflt: number): { ok: true; n: number } | { ok: false; e: FormulaValue } {\n if (idx >= a.length) return { ok: true, n: dflt };\n const r = FormulaHelper.evalDouble(a[idx]!, c);\n return r.ok ? { ok: true, n: r.value } : { ok: false, e: r.error };\n}\n\nfunction pmt(a: Args, c: Ctx): FormulaValue {\n const rate = arg(a, c, 0, 0); if (!rate.ok) return rate.e;\n const nper = arg(a, c, 1, 0); if (!nper.ok) return nper.e;\n const pvv = arg(a, c, 2, 0); if (!pvv.ok) return pvv.e;\n const fvv = arg(a, c, 3, 0); if (!fvv.ok) return fvv.e;\n const type = arg(a, c, 4, 0); if (!type.ok) return type.e;\n\n const r = rate.n, n = nper.n, present = pvv.n, future = fvv.n, t = type.n;\n if (n === 0) return FormulaValue.errorNum;\n return FormulaValue.number(pmtValue(r, n, present, future, t));\n}\n\nfunction fv(a: Args, c: Ctx): FormulaValue {\n const rate = arg(a, c, 0, 0); if (!rate.ok) return rate.e;\n const nper = arg(a, c, 1, 0); if (!nper.ok) return nper.e;\n const pmtv = arg(a, c, 2, 0); if (!pmtv.ok) return pmtv.e;\n const pvv = arg(a, c, 3, 0); if (!pvv.ok) return pvv.e;\n const type = arg(a, c, 4, 0); if (!type.ok) return type.e;\n\n const r = rate.n, n = nper.n, payment = pmtv.n, present = pvv.n, t = type.n;\n return FormulaValue.number(fvValue(r, n, payment, present, t));\n}\n\nfunction pv(a: Args, c: Ctx): FormulaValue {\n const rate = arg(a, c, 0, 0); if (!rate.ok) return rate.e;\n const nper = arg(a, c, 1, 0); if (!nper.ok) return nper.e;\n const pmtv = arg(a, c, 2, 0); if (!pmtv.ok) return pmtv.e;\n const fvv = arg(a, c, 3, 0); if (!fvv.ok) return fvv.e;\n const type = arg(a, c, 4, 0); if (!type.ok) return type.e;\n\n const r = rate.n, n = nper.n, payment = pmtv.n, future = fvv.n, t = type.n;\n if (r === 0) return FormulaValue.number(-(future + payment * n));\n\n const pow = Math.pow(1 + r, n);\n return FormulaValue.number(-(future + payment * (1 + r * t) * (pow - 1) / r) / pow);\n}\n\nfunction npv(a: Args, c: Ctx): FormulaValue {\n const rate = FormulaHelper.evalDouble(a[0]!, c);\n if (!rate.ok) return rate.error;\n if (rate.value === -1) return FormulaValue.errorDiv0;\n\n const flows = FormulaHelper.collectNumbers(a.slice(1), c);\n if (!flows.ok) return flows.error;\n\n let total = 0;\n for (let i = 0; i < flows.values.length; i++) {\n total += flows.values[i]! / Math.pow(1 + rate.value, i + 1);\n }\n return FormulaValue.number(total);\n}\n\nfunction irr(a: Args, c: Ctx): FormulaValue {\n const flowsRes = FormulaHelper.collectNumbers([a[0]!], c);\n if (!flowsRes.ok) return flowsRes.error;\n const flows = flowsRes.values;\n if (flows.length < 2) return FormulaValue.errorNum;\n\n let guess = 0.1;\n if (a.length > 1) {\n const g = FormulaHelper.evalDouble(a[1]!, c);\n if (!g.ok) return g.error;\n guess = g.value;\n }\n\n const npvAt = (rate: number): number => {\n let sum = 0;\n for (let i = 0; i < flows.length; i++) sum += flows[i]! / Math.pow(1 + rate, i);\n return sum;\n };\n\n // Newton-Raphson with a numeric derivative; bounded iterations.\n let rate = guess;\n for (let iter = 0; iter < 100; iter++) {\n const f = npvAt(rate);\n if (Math.abs(f) < 1e-7) return FormulaValue.number(rate);\n const h = 1e-6;\n const deriv = (npvAt(rate + h) - f) / h;\n if (deriv === 0) break;\n const next = rate - f / deriv;\n if (!isFinite(next) || next <= -1) break;\n if (Math.abs(next - rate) < 1e-9) { rate = next; break; }\n rate = next;\n }\n if (Math.abs(npvAt(rate)) < 1e-6) return FormulaValue.number(rate);\n return FormulaValue.errorNum;\n}\n\n/**\n * Time-value-of-money residual: the present value of a stream that should\n * equal zero at the true rate. Shared by RATE (root-finding) so its Newton\n * iteration and the closed forms above stay consistent.\n * pv·(1+r)^n + pmt·(1+r·type)·((1+r)^n − 1)/r + fv\n */\nfunction tvm(r: number, n: number, pmt: number, pv: number, fv: number, type: number): number {\n if (r === 0) return pv + pmt * n + fv;\n const pow = Math.pow(1 + r, n);\n return pv * pow + pmt * (1 + r * type) * (pow - 1) / r + fv;\n}\n\nfunction rate(a: Args, c: Ctx): FormulaValue {\n const nper = arg(a, c, 0, 0); if (!nper.ok) return nper.e;\n const pmtv = arg(a, c, 1, 0); if (!pmtv.ok) return pmtv.e;\n const pvv = arg(a, c, 2, 0); if (!pvv.ok) return pvv.e;\n const fvv = arg(a, c, 3, 0); if (!fvv.ok) return fvv.e;\n const type = arg(a, c, 4, 0); if (!type.ok) return type.e;\n const gs = arg(a, c, 5, 0.1); if (!gs.ok) return gs.e;\n\n const n = nper.n, pmt = pmtv.n, pv = pvv.n, fv = fvv.n, t = type.n;\n if (n === 0) return FormulaValue.errorNum;\n\n // Newton-Raphson with a numeric derivative; Excel's own default guess is 10%.\n let r = gs.n;\n for (let iter = 0; iter < 100; iter++) {\n const f = tvm(r, n, pmt, pv, fv, t);\n if (Math.abs(f) < 1e-8) return FormulaValue.number(r);\n const h = 1e-6;\n const deriv = (tvm(r + h, n, pmt, pv, fv, t) - f) / h;\n if (deriv === 0) break;\n const next = r - f / deriv;\n if (!isFinite(next) || next <= -1) break;\n if (Math.abs(next - r) < 1e-10) { r = next; break; }\n r = next;\n }\n if (Math.abs(tvm(r, n, pmt, pv, fv, t)) < 1e-6) return FormulaValue.number(r);\n return FormulaValue.errorNum;\n}\n\nfunction nper(a: Args, c: Ctx): FormulaValue {\n const rate = arg(a, c, 0, 0); if (!rate.ok) return rate.e;\n const pmtv = arg(a, c, 1, 0); if (!pmtv.ok) return pmtv.e;\n const pvv = arg(a, c, 2, 0); if (!pvv.ok) return pvv.e;\n const fvv = arg(a, c, 3, 0); if (!fvv.ok) return fvv.e;\n const type = arg(a, c, 4, 0); if (!type.ok) return type.e;\n\n const r = rate.n, pmt = pmtv.n, pv = pvv.n, fv = fvv.n, t = type.n;\n\n if (r === 0) {\n if (pmt === 0) return FormulaValue.errorNum;\n return FormulaValue.number(-(pv + fv) / pmt);\n }\n // Closed form: n = ln((pmt·(1+r·t) − fv·r)/(pmt·(1+r·t) + pv·r)) / ln(1+r)\n const adj = pmt * (1 + r * t);\n const num = adj - fv * r;\n const den = adj + pv * r;\n if (den === 0 || num / den <= 0) return FormulaValue.errorNum;\n const result = Math.log(num / den) / Math.log(1 + r);\n if (!isFinite(result)) return FormulaValue.errorNum;\n return FormulaValue.number(result);\n}\n\n/**\n * IPMT / PPMT — split the level annuity payment for a single period `per` into\n * its interest and principal parts. IPMT is the balance at the start of the\n * period times the rate; PPMT is the remainder of the payment. Both are O(1)\n * closed forms (no per-period loop), reusing the shared PMT/FV kernels.\n */\nfunction interestForPeriod(r: number, per: number, n: number, pv: number, fv: number, t: number): number {\n const pay = pmtValue(r, n, pv, fv, t);\n // Outstanding balance at the start of period `per` = FV after (per-1) periods.\n // For beginning-of-period annuities the first period accrues no interest, and\n // subsequent periods discount the accrued interest by one period.\n if (t === 1) {\n if (per === 1) return 0;\n return fvValue(r, per - 2, pay, pv, 1) * r / (1 + r);\n }\n return fvValue(r, per - 1, pay, pv, 0) * r;\n}\n\nfunction ipmt(a: Args, c: Ctx): FormulaValue {\n const rate = arg(a, c, 0, 0); if (!rate.ok) return rate.e;\n const perv = arg(a, c, 1, 0); if (!perv.ok) return perv.e;\n const nper = arg(a, c, 2, 0); if (!nper.ok) return nper.e;\n const pvv = arg(a, c, 3, 0); if (!pvv.ok) return pvv.e;\n const fvv = arg(a, c, 4, 0); if (!fvv.ok) return fvv.e;\n const type = arg(a, c, 5, 0); if (!type.ok) return type.e;\n\n const r = rate.n, per = perv.n, n = nper.n, pv = pvv.n, fv = fvv.n, t = type.n;\n if (n === 0 || per < 1 || per > n) return FormulaValue.errorNum;\n return FormulaValue.number(interestForPeriod(r, per, n, pv, fv, t));\n}\n\nfunction ppmt(a: Args, c: Ctx): FormulaValue {\n const rate = arg(a, c, 0, 0); if (!rate.ok) return rate.e;\n const perv = arg(a, c, 1, 0); if (!perv.ok) return perv.e;\n const nper = arg(a, c, 2, 0); if (!nper.ok) return nper.e;\n const pvv = arg(a, c, 3, 0); if (!pvv.ok) return pvv.e;\n const fvv = arg(a, c, 4, 0); if (!fvv.ok) return fvv.e;\n const type = arg(a, c, 5, 0); if (!type.ok) return type.e;\n\n const r = rate.n, per = perv.n, n = nper.n, pv = pvv.n, fv = fvv.n, t = type.n;\n if (n === 0 || per < 1 || per > n) return FormulaValue.errorNum;\n const pay = pmtValue(r, n, pv, fv, t);\n return FormulaValue.number(pay - interestForPeriod(r, per, n, pv, fv, t));\n}\n\n/**\n * Reads a node as a flat list of numbers in row-major order, keeping positional\n * alignment (blanks count as 0, unlike collectNumbers which drops them). Used to\n * pair cash flows with their dates for XNPV/XIRR.\n */\nfunction flatNumbers(\n node: FormulaNode,\n c: Ctx,\n): { ok: true; values: number[] } | { ok: false; e: FormulaValue } {\n const v = node.evaluate(c);\n if (v.isError) return { ok: false, e: v };\n const out: number[] = [];\n const push = (item: FormulaValue): FormulaValue | null => {\n if (item.isError) return item;\n const d = item.tryAsDouble();\n if (!d.ok) return FormulaValue.errorValue;\n out.push(d.value);\n return null;\n };\n if (v.isArray) {\n for (const item of v.arrayVal.values()) {\n const err = push(item);\n if (err) return { ok: false, e: err };\n }\n } else {\n const err = push(v);\n if (err) return { ok: false, e: err };\n }\n return { ok: true, values: out };\n}\n\n/** Discounted value of dated cash flows: Σ vᵢ / (1+rate)^((dateᵢ − date₀)/365). */\nfunction xnpvAt(rate: number, values: number[], days: number[]): number {\n let sum = 0;\n for (let i = 0; i < values.length; i++) {\n sum += values[i]! / Math.pow(1 + rate, days[i]! / 365);\n }\n return sum;\n}\n\nfunction xnpv(a: Args, c: Ctx): FormulaValue {\n const rateRes = FormulaHelper.evalDouble(a[0]!, c);\n if (!rateRes.ok) return rateRes.error;\n const rate = rateRes.value;\n if (rate <= -1) return FormulaValue.errorNum;\n\n const valsRes = flatNumbers(a[1]!, c); if (!valsRes.ok) return valsRes.e;\n const datesRes = flatNumbers(a[2]!, c); if (!datesRes.ok) return datesRes.e;\n const values = valsRes.values;\n const dates = datesRes.values;\n if (values.length === 0 || values.length !== dates.length) return FormulaValue.errorNum;\n\n const base = Math.trunc(dates[0]!);\n const days = dates.map(d => Math.trunc(d) - base);\n if (days.some(d => d < 0)) return FormulaValue.errorNum;\n\n return FormulaValue.number(xnpvAt(rate, values, days));\n}\n\nfunction xirr(a: Args, c: Ctx): FormulaValue {\n const valsRes = flatNumbers(a[0]!, c); if (!valsRes.ok) return valsRes.e;\n const datesRes = flatNumbers(a[1]!, c); if (!datesRes.ok) return datesRes.e;\n const values = valsRes.values;\n const dates = datesRes.values;\n if (values.length < 2 || values.length !== dates.length) return FormulaValue.errorNum;\n\n let guess = 0.1;\n if (a.length > 2) {\n const g = FormulaHelper.evalDouble(a[2]!, c);\n if (!g.ok) return g.error;\n guess = g.value;\n }\n\n const base = Math.trunc(dates[0]!);\n const days = dates.map(d => Math.trunc(d) - base);\n if (days.some(d => d < 0)) return FormulaValue.errorNum;\n\n // Analytic derivative: f'(r) = Σ −(dᵢ/365)·vᵢ / (1+r)^(dᵢ/365 + 1).\n const derivAt = (rate: number): number => {\n let sum = 0;\n for (let i = 0; i < values.length; i++) {\n const e = days[i]! / 365;\n sum += -e * values[i]! / Math.pow(1 + rate, e + 1);\n }\n return sum;\n };\n\n let rate = guess;\n for (let iter = 0; iter < 100; iter++) {\n const f = xnpvAt(rate, values, days);\n if (Math.abs(f) < 1e-7) return FormulaValue.number(rate);\n const deriv = derivAt(rate);\n if (deriv === 0) break;\n const next = rate - f / deriv;\n if (!isFinite(next) || next <= -1) break;\n if (Math.abs(next - rate) < 1e-9) { rate = next; break; }\n rate = next;\n }\n if (Math.abs(xnpvAt(rate, values, days)) < 1e-6) return FormulaValue.number(rate);\n return FormulaValue.errorNum;\n}\n","/**\n * Meta / language functions: LET (and later LAMBDA and its helpers).\n *\n * These are not ordinary value functions — they manipulate names and scopes,\n * so they inspect their argument AST nodes directly rather than only their\n * evaluated values.\n */\nimport { FormulaValue, ArrayValue, TailCall, type LambdaLike } from '../formula-value.js';\n\n/** Safety cap on trampoline iterations (guards a non-terminating tail loop). */\nconst MAX_TAIL_ITERATIONS = 10_000_000;\nimport { type FunctionRegistry } from '../function-registry.js';\nimport { NamedRangeNode, type FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerMeta(r: FunctionRegistry): void {\n r.register('LET', let_, 3);\n r.register('LAMBDA', lambda_, 1);\n r.register('MAP', map_, 2);\n r.register('REDUCE', reduce_, 3, 3);\n r.register('SCAN', scan_, 3, 3);\n r.register('BYROW', byRow, 2, 2);\n r.register('BYCOL', byCol, 2, 2);\n}\n\nconst asArray = (v: FormulaValue): ArrayValue =>\n v.isArray ? v.arrayVal : ArrayValue.fromScalar(v);\n\n/**\n * LET(name1, value1, [name2, value2, ...], calculation)\n *\n * Binds each name to its value in a fresh lexical scope, then evaluates the\n * final calculation. Later bindings may reference earlier ones. Names are\n * ordinary identifiers, which the parser represents as NamedRangeNode.\n */\nfunction let_(a: Args, c: Ctx): FormulaValue {\n // Need an odd count ≥ 3: pairs of (name, value) followed by one calculation.\n if (a.length < 3 || a.length % 2 === 0) return FormulaValue.errorValue;\n\n const bindings = new Map<string, FormulaValue>();\n c.pushScope(bindings);\n try {\n for (let i = 0; i < a.length - 1; i += 2) {\n const nameNode = a[i]!;\n if (!(nameNode instanceof NamedRangeNode)) return FormulaValue.errorValue;\n const value = a[i + 1]!.evaluate(c); // may reference names bound earlier\n if (value.isError) return value;\n bindings.set(nameNode.name.toUpperCase(), value);\n }\n return a[a.length - 1]!.evaluate(c);\n } finally {\n c.popScope();\n }\n}\n\n/**\n * LAMBDA(param1, ..., paramN, calculation)\n *\n * Produces a callable value. When invoked, each parameter is bound to its\n * argument in a fresh scope on the defining context and the calculation is\n * evaluated. Usable inline — LAMBDA(x,x+1)(5) — or via a defined name.\n */\nfunction lambda_(a: Args, c: Ctx): FormulaValue {\n const paramNodes = a.slice(0, -1);\n const body = a[a.length - 1]!;\n const params: string[] = [];\n for (const p of paramNodes) {\n if (!(p instanceof NamedRangeNode)) return FormulaValue.errorValue;\n params.push(p.name.toUpperCase());\n }\n const ctx = c; // capture defining context\n\n const lambda: LambdaLike = {\n arity: params.length,\n\n // One tail-aware evaluation of the body: binds params, then evaluates in\n // tail mode so a self/other tail call surfaces as a TailCall.\n step(args: FormulaValue[]): FormulaValue | TailCall {\n const bindings = new Map<string, FormulaValue>();\n params.forEach((p, i) => bindings.set(p, args[i] ?? FormulaValue.blank));\n ctx.pushScope(bindings);\n try {\n return body.evaluateTail(ctx);\n } finally {\n ctx.popScope();\n }\n },\n\n // Run to completion. Tail calls iterate here (O(1) stack); only non-tail\n // recursion re-enters call() and is bounded by the recursion guard.\n call(args: FormulaValue[]): FormulaValue {\n const guard = ctx.recursionGuard;\n if (guard) {\n if (guard.depth >= guard.max) return FormulaValue.errorNum; // too deep → #NUM!\n guard.depth++;\n }\n try {\n let current: LambdaLike = lambda;\n let currentArgs = args;\n for (let iter = 0; ; iter++) {\n if (iter > MAX_TAIL_ITERATIONS) return FormulaValue.errorNum;\n const r = current.step ? current.step(currentArgs) : current.call(currentArgs);\n if (r instanceof TailCall) {\n current = r.lambda;\n currentArgs = r.args;\n continue;\n }\n return r;\n }\n } finally {\n if (guard) guard.depth--;\n }\n },\n };\n\n return FormulaValue.lambda(lambda);\n}\n\n/** Resolves the trailing lambda argument. */\nfunction lambdaArg(node: FormulaNode, c: Ctx): { ok: true; fn: LambdaLike } | { ok: false; e: FormulaValue } {\n const v = node.evaluate(c);\n if (v.isError) return { ok: false, e: v };\n if (!v.isLambda) return { ok: false, e: FormulaValue.errorValue };\n return { ok: true, fn: v.lambdaVal };\n}\n\n// MAP(array1, [array2, ...], lambda) — element-wise map over one or more arrays.\nfunction map_(a: Args, c: Ctx): FormulaValue {\n const fn = lambdaArg(a[a.length - 1]!, c); if (!fn.ok) return fn.e;\n const arrays = a.slice(0, -1).map(n => asArray(n.evaluate(c)));\n if (arrays.length === 0) return FormulaValue.errorValue;\n const rows = arrays[0]!.rows, cols = arrays[0]!.columns;\n const out = new ArrayValue(rows, cols);\n for (let r = 0; r < rows; r++) {\n for (let col = 0; col < cols; col++) {\n out.set(r, col, fn.fn.call(arrays.map(ar => ar.get(r, col))));\n }\n }\n return FormulaValue.array(out);\n}\n\n// REDUCE(initial, array, lambda(acc, value)) — fold to a single value.\nfunction reduce_(a: Args, c: Ctx): FormulaValue {\n let acc = a[0]!.evaluate(c);\n if (acc.isError) return acc;\n const arr = asArray(a[1]!.evaluate(c));\n const fn = lambdaArg(a[2]!, c); if (!fn.ok) return fn.e;\n for (const v of arr.values()) {\n acc = fn.fn.call([acc, v]);\n if (acc.isError) return acc;\n }\n return acc;\n}\n\n// SCAN(initial, array, lambda(acc, value)) — running fold; returns an array.\nfunction scan_(a: Args, c: Ctx): FormulaValue {\n let acc = a[0]!.evaluate(c);\n if (acc.isError) return acc;\n const arr = asArray(a[1]!.evaluate(c));\n const fn = lambdaArg(a[2]!, c); if (!fn.ok) return fn.e;\n const out = new ArrayValue(arr.rows, arr.columns);\n for (let r = 0; r < arr.rows; r++) {\n for (let col = 0; col < arr.columns; col++) {\n acc = fn.fn.call([acc, arr.get(r, col)]);\n out.set(r, col, acc);\n }\n }\n return FormulaValue.array(out);\n}\n\n// BYROW(array, lambda(row)) — apply lambda to each row → column vector.\nfunction byRow(a: Args, c: Ctx): FormulaValue {\n const arr = asArray(a[0]!.evaluate(c));\n const fn = lambdaArg(a[1]!, c); if (!fn.ok) return fn.e;\n const out = new ArrayValue(arr.rows, 1);\n for (let r = 0; r < arr.rows; r++) {\n const row = new ArrayValue(1, arr.columns);\n for (let col = 0; col < arr.columns; col++) row.set(0, col, arr.get(r, col));\n out.set(r, 0, fn.fn.call([FormulaValue.array(row)]));\n }\n return FormulaValue.array(out);\n}\n\n// BYCOL(array, lambda(col)) — apply lambda to each column → row vector.\nfunction byCol(a: Args, c: Ctx): FormulaValue {\n const arr = asArray(a[0]!.evaluate(c));\n const fn = lambdaArg(a[1]!, c); if (!fn.ok) return fn.e;\n const out = new ArrayValue(1, arr.columns);\n for (let col = 0; col < arr.columns; col++) {\n const column = new ArrayValue(arr.rows, 1);\n for (let r = 0; r < arr.rows; r++) column.set(r, 0, arr.get(r, col));\n out.set(0, col, fn.fn.call([FormulaValue.array(column)]));\n }\n return FormulaValue.array(out);\n}\n","/**\n * SUBTOTAL and AGGREGATE — aggregates with visibility/nesting awareness.\n *\n * Both can skip rows hidden in the sheet and ignore nested SUBTOTAL/AGGREGATE\n * cells inside their ranges. That requires reference-level information (which\n * cell each value comes from, whether its row is hidden, what formula it holds),\n * so these functions inspect their argument nodes rather than only values, and\n * read the worksheet's optional isRowHidden/getCellFormula hooks.\n */\nimport { cellRefFromRowCol } from '@devmm/puredocs-excel';\nimport { FormulaValue } from '../formula-value.js';\nimport { type FunctionRegistry } from '../function-registry.js';\nimport { RangeReferenceNode, type FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerAggregate(r: FunctionRegistry): void {\n r.register('SUBTOTAL', subtotal, 2);\n r.register('AGGREGATE', aggregate, 3);\n}\n\ninterface CollectOptions {\n excludeHidden: boolean;\n /** Regex of formula names to treat as \"nested\" and skip, or null. */\n nestedPattern: RegExp | null;\n /** Skip cells whose evaluated value is an error (AGGREGATE option 6/7). */\n ignoreErrors: boolean;\n}\n\n/**\n * Collects the included values from the reference/value arguments starting at\n * `startIdx`, honouring hidden-row and nested-formula exclusions for cells that\n * come from same-sheet ranges. Returns the flat list of values, or an error.\n */\nfunction collectValues(\n a: Args,\n c: Ctx,\n startIdx: number,\n opts: CollectOptions,\n): { ok: true; values: FormulaValue[] } | { ok: false; error: FormulaValue } {\n const out: FormulaValue[] = [];\n const ws = c.worksheet;\n\n for (let i = startIdx; i < a.length; i++) {\n const node = a[i]!;\n if (node instanceof RangeReferenceNode) {\n const b = c.getRangeBounds(node.startRef, node.endRef);\n for (let row = b.startRow; row <= b.endRow; row++) {\n if (opts.excludeHidden && ws.isRowHidden?.(row)) continue;\n for (let col = b.startCol; col <= b.endCol; col++) {\n const ref = cellRefFromRowCol(row, col);\n if (opts.nestedPattern) {\n const f = ws.getCellFormula?.(ref);\n if (f && opts.nestedPattern.test(f)) continue; // skip nested SUBTOTAL/AGGREGATE\n }\n const v = c.getCellValue(ref);\n if (v.isError) {\n if (opts.ignoreErrors) continue;\n return { ok: false, error: v };\n }\n out.push(v);\n }\n }\n } else {\n const v = node.evaluate(c);\n if (v.isError) {\n if (opts.ignoreErrors) continue;\n return { ok: false, error: v };\n }\n if (v.isArray) {\n for (const item of v.arrayVal.values()) {\n if (item.isError) { if (opts.ignoreErrors) continue; return { ok: false, error: item }; }\n out.push(item);\n }\n } else {\n out.push(v);\n }\n }\n }\n return { ok: true, values: out };\n}\n\n/** Applies aggregate selector 1-11 (SUBTOTAL) / 1-19 (AGGREGATE) to values. */\nfunction applyAggregate(fn: number, values: FormulaValue[], extra?: number): FormulaValue {\n const nums: number[] = [];\n let countA = 0;\n for (const v of values) {\n if (!v.isBlank) countA++;\n const r = v.tryAsDouble();\n if (r.ok && !v.isText && !v.isBlank) nums.push(r.value);\n }\n\n const sum = () => nums.reduce((s, n) => s + n, 0);\n const avg = () => (nums.length ? sum() / nums.length : NaN);\n const variance = (sample: boolean): number => {\n const n = nums.length;\n if (sample ? n < 2 : n < 1) return NaN;\n const m = avg();\n const ss = nums.reduce((s, x) => s + (x - m) ** 2, 0);\n return ss / (sample ? n - 1 : n);\n };\n const sorted = () => [...nums].sort((x, y) => x - y);\n\n switch (fn) {\n case 1: return isNaN(avg()) ? FormulaValue.errorDiv0 : FormulaValue.number(avg());\n case 2: return FormulaValue.number(nums.length); // COUNT\n case 3: return FormulaValue.number(countA); // COUNTA\n case 4: return nums.length ? FormulaValue.number(Math.max(...nums)) : FormulaValue.zero;\n case 5: return nums.length ? FormulaValue.number(Math.min(...nums)) : FormulaValue.zero;\n case 6: return FormulaValue.number(nums.reduce((p, n) => p * n, 1)); // PRODUCT\n case 7: { const v = variance(true); return isNaN(v) ? FormulaValue.errorDiv0 : FormulaValue.number(Math.sqrt(v)); } // STDEV.S\n case 8: { const v = variance(false); return isNaN(v) ? FormulaValue.errorDiv0 : FormulaValue.number(Math.sqrt(v)); } // STDEV.P\n case 9: return FormulaValue.number(sum()); // SUM\n case 10: { const v = variance(true); return isNaN(v) ? FormulaValue.errorDiv0 : FormulaValue.number(v); } // VAR.S\n case 11: { const v = variance(false); return isNaN(v) ? FormulaValue.errorDiv0 : FormulaValue.number(v); } // VAR.P\n // AGGREGATE-only selectors:\n case 12: { const s = sorted(); const m = s.length; if (!m) return FormulaValue.errorNum;\n const mid = Math.floor(m / 2); return FormulaValue.number(m % 2 ? s[mid]! : (s[mid - 1]! + s[mid]!) / 2); } // MEDIAN\n case 14: { const s = sorted(); const k = Math.round(extra ?? 0); // LARGE\n return k >= 1 && k <= s.length ? FormulaValue.number(s[s.length - k]!) : FormulaValue.errorNum; }\n case 15: { const s = sorted(); const k = Math.round(extra ?? 0); // SMALL\n return k >= 1 && k <= s.length ? FormulaValue.number(s[k - 1]!) : FormulaValue.errorNum; }\n default: return FormulaValue.errorValue;\n }\n}\n\nfunction subtotal(a: Args, c: Ctx): FormulaValue {\n const fnVal = a[0]!.evaluate(c);\n if (fnVal.isError) return fnVal;\n const raw = fnVal.tryAsDouble();\n if (!raw.ok) return FormulaValue.errorValue;\n const code = Math.round(raw.value);\n const excludeHidden = code >= 101 && code <= 111;\n const fn = excludeHidden ? code - 100 : code;\n if (fn < 1 || fn > 11) return FormulaValue.errorValue;\n\n const collected = collectValues(a, c, 1, {\n excludeHidden,\n nestedPattern: /^\\s*SUBTOTAL\\s*\\(/i,\n ignoreErrors: false,\n });\n if (!collected.ok) return collected.error;\n return applyAggregate(fn, collected.values);\n}\n\nfunction aggregate(a: Args, c: Ctx): FormulaValue {\n const fnVal = a[0]!.evaluate(c);\n if (fnVal.isError) return fnVal;\n const optVal = a[1]!.evaluate(c);\n if (optVal.isError) return optVal;\n const fnR = fnVal.tryAsDouble();\n const optR = optVal.tryAsDouble();\n if (!fnR.ok || !optR.ok) return FormulaValue.errorValue;\n\n const fn = Math.round(fnR.value);\n const option = Math.round(optR.value);\n if (fn < 1 || fn > 19) return FormulaValue.errorValue;\n\n // option: 0/1 ignore nested SUBTOTAL/AGGREGATE; 2/3 also ignore errors;\n // 4 nothing; 5 ignore hidden rows; 6 ignore errors; 7 ignore hidden + errors.\n const excludeHidden = option === 1 || option === 3 || option === 5 || option === 7;\n const ignoreErrors = option === 2 || option === 3 || option === 6 || option === 7;\n const ignoreNested = option <= 3 || option === 5 || option === 7;\n\n // LARGE(14)/SMALL(15) take a k argument as the last value argument.\n let extra: number | undefined;\n let endIdx = a.length;\n if (fn === 14 || fn === 15) {\n const kVal = a[a.length - 1]!.evaluate(c);\n const kR = kVal.tryAsDouble();\n if (!kR.ok) return FormulaValue.errorValue;\n extra = kR.value;\n endIdx = a.length - 1;\n }\n\n const collected = collectValues(a.slice(0, endIdx), c, 2, {\n excludeHidden,\n nestedPattern: ignoreNested ? /^\\s*(SUBTOTAL|AGGREGATE)\\s*\\(/i : null,\n ignoreErrors,\n });\n if (!collected.ok) return collected.error;\n return applyAggregate(fn, collected.values, extra);\n}\n","/**\n * Dynamic-array functions (Excel 365): TRANSPOSE, SEQUENCE, UNIQUE, SORT,\n * FILTER, MMULT, TEXTSPLIT, VSTACK, HSTACK, TOCOL, TOROW.\n *\n * Each returns a FormulaValue array; the recalc engine spills it across a block\n * of cells. In a bare evaluateFormula call (no recalc engine) the array is\n * returned as-is and callers may read its top-left with implicit intersection.\n */\nimport { FormulaValue, ArrayValue, FormulaError } from '../formula-value.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerArray(r: FunctionRegistry): void {\n r.register('TRANSPOSE', transpose, 1, 1);\n r.register('SEQUENCE', sequence, 1, 4);\n r.register('UNIQUE', unique, 1, 3);\n r.register('SORT', sort, 1, 4);\n r.register('SORTBY', sortBy, 2);\n r.register('FILTER', filter, 2, 3);\n r.register('MMULT', mmult, 2, 2);\n r.register('TEXTSPLIT', textSplit, 2, 6);\n r.register('VSTACK', vstack, 1);\n r.register('HSTACK', hstack, 1);\n r.register('TOCOL', toCol, 1, 3);\n r.register('TOROW', toRow, 1, 3);\n}\n\n/** Excel grid limits — guard against runaway allocations from bad formulas. */\nconst MAX_ROWS = 1048576;\nconst MAX_COLS = 16384;\n\nconst asArray = (v: FormulaValue): ArrayValue =>\n v.isArray ? v.arrayVal : ArrayValue.fromScalar(v);\n\nfunction fromRows(rows: FormulaValue[][]): FormulaValue {\n const nr = rows.length;\n const nc = nr > 0 ? rows[0]!.length : 0;\n const arr = new ArrayValue(nr, nc);\n for (let r = 0; r < nr; r++) for (let c = 0; c < nc; c++) arr.set(r, c, rows[r]![c]!);\n return FormulaValue.array(arr);\n}\n\nfunction toRows(arr: ArrayValue): FormulaValue[][] {\n const rows: FormulaValue[][] = [];\n for (let r = 0; r < arr.rows; r++) {\n const row: FormulaValue[] = [];\n for (let c = 0; c < arr.columns; c++) row.push(arr.get(r, c));\n rows.push(row);\n }\n return rows;\n}\n\nconst num = (a: Args, c: Ctx, i: number, dflt: number): { ok: true; n: number } | { ok: false; e: FormulaValue } => {\n if (i >= a.length) return { ok: true, n: dflt };\n const r = FormulaHelper.evalDouble(a[i]!, c);\n return r.ok ? { ok: true, n: r.value } : { ok: false, e: r.error };\n};\n\nfunction transpose(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n if (v.isError) return v;\n return FormulaValue.array(asArray(v).transpose());\n}\n\nfunction sequence(a: Args, c: Ctx): FormulaValue {\n const rows = num(a, c, 0, 1); if (!rows.ok) return rows.e;\n const cols = num(a, c, 1, 1); if (!cols.ok) return cols.e;\n const start = num(a, c, 2, 1); if (!start.ok) return start.e;\n const step = num(a, c, 3, 1); if (!step.ok) return step.e;\n const R = Math.trunc(rows.n), C = Math.trunc(cols.n);\n if (R < 1 || C < 1) return FormulaValue.errorValue;\n const arr = new ArrayValue(R, C);\n for (let r = 0; r < R; r++) {\n for (let col = 0; col < C; col++) {\n arr.set(r, col, FormulaValue.number(start.n + (r * C + col) * step.n));\n }\n }\n return FormulaValue.array(arr);\n}\n\n/**\n * Canonical dedup key for one cell. Two cells that UNIQUE must treat as the same\n * yield the same string; distinct classes yield distinct strings. A kind prefix\n * prevents cross-type collisions (number 1 vs text \"1\" vs boolean TRUE).\n *\n * Deliberate deviations from FormulaValue.areEqual (which is a *comparison*\n * helper, not a dedup rule, and is not transitive):\n * • numbers use exact equality, not the 1e-10 fuzz — matches Excel UNIQUE and\n * restores transitivity (a fuzz-based key cannot have a canonical form);\n * • blank is its own class, never merged with 0 / \"\" / FALSE (Excel keeps an\n * empty cell and a 0 as distinct rows);\n * • errors dedupe by error code, so #N/A ≡ #N/A (areEqual returns false for\n * every error pair, which would leave error rows never deduplicated).\n */\nfunction cellKey(v: FormulaValue): string {\n switch (v.kind) {\n case 'number': return 'n' + (v.numberValue === 0 ? '0' : String(v.numberValue));\n case 'text': return 't' + v.textValue.toUpperCase(); // case-insensitive\n case 'boolean': return v.booleanValue ? 'b1' : 'b0';\n case 'blank': return 'B';\n case 'error': return 'e' + v.errorCode;\n default: return 'x'; // array/lambda never occur as a scalar cell\n }\n}\n\n/**\n * UNIQUE(array, [by_col], [exactly_once]).\n *\n * Single pass over the rows into a Map keyed by a canonical row key (length-\n * prefixed per cell so [\"a\",\"b\"] ≠ [\"ab\",\"\"]). O(n·k) time / O(u·k) memory\n * (u = distinct rows), replacing the previous O(n²·k) pairwise scan. Output\n * order follows first appearance; `exactly_once` filters on the per-key count\n * accumulated in the same pass — no second O(n²) counting sweep.\n */\nfunction unique(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c); if (v.isError) return v;\n const byCol = a.length > 1 ? a[1]!.evaluate(c).coerceToBool().booleanValue : false;\n const exactlyOnce = a.length > 2 ? a[2]!.evaluate(c).coerceToBool().booleanValue : false;\n\n const base = byCol ? asArray(v).transpose() : asArray(v);\n const map = new Map<string, { cells: FormulaValue[]; count: number }>();\n const order: string[] = [];\n for (let r = 0; r < base.rows; r++) {\n const cells: FormulaValue[] = new Array(base.columns);\n let key = '';\n for (let col = 0; col < base.columns; col++) {\n const cell = base.get(r, col);\n cells[col] = cell;\n const k = cellKey(cell);\n key += k.length + ':' + k;\n }\n const hit = map.get(key);\n if (hit) hit.count++;\n else { map.set(key, { cells, count: 1 }); order.push(key); }\n }\n\n const result: FormulaValue[][] = [];\n for (const key of order) {\n const e = map.get(key)!;\n if (exactlyOnce && e.count > 1) continue;\n result.push(e.cells);\n }\n if (result.length === 0) return FormulaValue.error(FormulaError.Calc);\n const out = fromRows(result);\n return byCol ? FormulaValue.array(out.arrayVal.transpose()) : out;\n}\n\nfunction sort(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c); if (v.isError) return v;\n const sortIndex = num(a, c, 1, 1); if (!sortIndex.ok) return sortIndex.e;\n const sortOrder = num(a, c, 2, 1); if (!sortOrder.ok) return sortOrder.e;\n const byCol = a.length > 3 ? a[3]!.evaluate(c).coerceToBool().booleanValue : false;\n\n const base = byCol ? asArray(v).transpose() : asArray(v);\n const rows = toRows(base);\n const idx = Math.trunc(sortIndex.n) - 1;\n const dir = sortOrder.n < 0 ? -1 : 1;\n if (rows.length > 0 && (idx < 0 || idx >= rows[0]!.length)) return FormulaValue.errorValue;\n\n const sorted = rows\n .map((r, i) => ({ r, i }))\n .sort((x, y) => {\n const cmp = FormulaValue.compare(x.r[idx]!, y.r[idx]!) * dir;\n return cmp !== 0 ? cmp : x.i - y.i; // stable\n })\n .map(o => o.r);\n\n const out = fromRows(sorted);\n return byCol ? FormulaValue.array(out.arrayVal.transpose()) : out;\n}\n\n/**\n * SORTBY(array, by_array1, [sort_order1], [by_array2, sort_order2], ...)\n *\n * Sorts `array` by one or more parallel key vectors without reordering `array`\n * itself in place: we sort a permutation of indices (O(n log n), stable) and\n * materialise the result once. Keys are read into flat vectors up front — only\n * the (small) key columns are copied, never the potentially large data array,\n * which keeps peak memory proportional to the keys plus a single output copy.\n */\nfunction sortBy(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c); if (v.isError) return v;\n const data = asArray(v);\n\n // Parse the trailing (by_array, [sort_order]) groups. sort_order is optional\n // per group; we treat a scalar-numeric argument following a key as its order.\n const keys: { vals: FormulaValue[]; dir: number }[] = [];\n let i = 1;\n while (i < a.length) {\n const byVal = a[i]!.evaluate(c); if (byVal.isError) return byVal;\n i++;\n let dir = 1;\n if (i < a.length) {\n const maybeOrder = a[i]!.evaluate(c);\n if (maybeOrder.isError) return maybeOrder;\n if (!maybeOrder.isArray && maybeOrder.isNumeric) {\n const d = maybeOrder.tryAsDouble();\n if (d.ok) { dir = d.value < 0 ? -1 : 1; i++; }\n }\n }\n keys.push({ vals: [...asArray(byVal).values()], dir });\n }\n if (keys.length === 0) return FormulaValue.errorValue;\n\n // Axis: keys aligned to rows sort rows; keys aligned to columns sort columns.\n const n = keys[0]!.vals.length;\n if (keys.some(k => k.vals.length !== n)) return FormulaValue.errorValue;\n const byRow = n === data.rows;\n const byColumn = !byRow && n === data.columns;\n if (!byRow && !byColumn) return FormulaValue.errorValue;\n\n const perm = Array.from({ length: n }, (_, k) => k);\n perm.sort((x, y) => {\n for (const key of keys) {\n const cmp = FormulaValue.compare(key.vals[x]!, key.vals[y]!) * key.dir;\n if (cmp !== 0) return cmp;\n }\n return x - y; // stable\n });\n\n const out = new ArrayValue(data.rows, data.columns);\n if (byRow) {\n for (let r = 0; r < data.rows; r++) {\n const src = perm[r]!;\n for (let col = 0; col < data.columns; col++) out.set(r, col, data.get(src, col));\n }\n } else {\n for (let col = 0; col < data.columns; col++) {\n const src = perm[col]!;\n for (let r = 0; r < data.rows; r++) out.set(r, col, data.get(r, src));\n }\n }\n return FormulaValue.array(out);\n}\n\nfunction filter(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c); if (v.isError) return v;\n const inc = a[1]!.evaluate(c); if (inc.isError) return inc;\n const arr = asArray(v);\n const incArr = asArray(inc);\n\n // include is a column mask (per row) or a row mask (per column).\n const perRow = incArr.rows === arr.rows && incArr.columns === 1;\n const perCol = incArr.columns === arr.columns && incArr.rows === 1;\n if (!perRow && !perCol) return FormulaValue.errorValue;\n\n const keptRows: FormulaValue[][] = [];\n if (perRow) {\n for (let r = 0; r < arr.rows; r++) {\n if (!incArr.get(r, 0).coerceToBool().booleanValue) continue;\n const row: FormulaValue[] = [];\n for (let col = 0; col < arr.columns; col++) row.push(arr.get(r, col));\n keptRows.push(row);\n }\n } else {\n // Keep columns; build rows from kept columns.\n const keepCols: number[] = [];\n for (let col = 0; col < arr.columns; col++) {\n if (incArr.get(0, col).coerceToBool().booleanValue) keepCols.push(col);\n }\n for (let r = 0; r < arr.rows; r++) {\n keptRows.push(keepCols.map(col => arr.get(r, col)));\n }\n if (keepCols.length === 0) keptRows.length = 0;\n }\n\n if (keptRows.length === 0 || (keptRows[0] && keptRows[0].length === 0)) {\n return a.length > 2 ? a[2]!.evaluate(c) : FormulaValue.error(FormulaError.Calc);\n }\n return fromRows(keptRows);\n}\n\nfunction mmult(a: Args, c: Ctx): FormulaValue {\n const av = a[0]!.evaluate(c); if (av.isError) return av;\n const bv = a[1]!.evaluate(c); if (bv.isError) return bv;\n const A = asArray(av), B = asArray(bv);\n if (A.columns !== B.rows) return FormulaValue.errorValue;\n\n const out = new ArrayValue(A.rows, B.columns);\n for (let i = 0; i < A.rows; i++) {\n for (let j = 0; j < B.columns; j++) {\n let sum = 0;\n for (let k = 0; k < A.columns; k++) {\n const x = A.get(i, k).tryAsDouble();\n const y = B.get(k, j).tryAsDouble();\n if (!x.ok || !y.ok) return FormulaValue.errorValue;\n sum += x.value * y.value;\n }\n out.set(i, j, FormulaValue.number(sum));\n }\n }\n return FormulaValue.array(out);\n}\n\nfunction textSplit(a: Args, c: Ctx): FormulaValue {\n const t = FormulaHelper.evalString(a[0]!, c); if (!t.ok) return t.error;\n const colD = FormulaHelper.evalString(a[1]!, c); if (!colD.ok) return colD.error;\n let rowD = '';\n if (a.length > 2) {\n const rd = a[2]!.evaluate(c);\n if (rd.isError) return rd;\n if (!rd.isBlank) { const r = FormulaHelper.evalString(a[2]!, c); if (!r.ok) return r.error; rowD = r.value; }\n }\n\n const split = (s: string, d: string): string[] => (d === '' ? [s] : s.split(d));\n const lines = rowD ? split(t.value, rowD) : [t.value];\n const grid = lines.map(line => split(line, colD.value));\n const width = grid.reduce((m, r) => Math.max(m, r.length), 0);\n\n const rows: FormulaValue[][] = grid.map(r => {\n const row: FormulaValue[] = [];\n for (let i = 0; i < width; i++) row.push(FormulaValue.text(r[i] ?? ''));\n return row;\n });\n return fromRows(rows);\n}\n\n/**\n * VSTACK(array1, [array2], ...) — stack arrays vertically. The result width is\n * the widest input; shorter rows are padded with #N/A (Excel behaviour). Two\n * passes: size first, then copy element-by-element into a single output buffer\n * via `get`/`set` — inputs are never re-materialised, so peak memory is one\n * output array regardless of how large the inputs are.\n */\nfunction vstack(a: Args, c: Ctx): FormulaValue {\n // Errors are embedded as cell values (Excel behaviour), not propagated — a\n // downstream TOCOL(..,2) can then drop them.\n const parts: ArrayValue[] = [];\n let totalRows = 0, maxCols = 0;\n for (const node of a) {\n const arr = asArray(node.evaluate(c));\n parts.push(arr);\n totalRows += arr.rows;\n if (arr.columns > maxCols) maxCols = arr.columns;\n }\n if (totalRows > MAX_ROWS || maxCols > MAX_COLS) return FormulaValue.errorNum;\n\n const out = new ArrayValue(totalRows, maxCols);\n let rowOff = 0;\n for (const arr of parts) {\n for (let r = 0; r < arr.rows; r++) {\n for (let col = 0; col < maxCols; col++) {\n out.set(rowOff + r, col, col < arr.columns ? arr.get(r, col) : FormulaValue.errorNA);\n }\n }\n rowOff += arr.rows;\n }\n return FormulaValue.array(out);\n}\n\n/**\n * HSTACK(array1, [array2], ...) — stack arrays horizontally. Result height is\n * the tallest input; shorter columns are padded with #N/A.\n */\nfunction hstack(a: Args, c: Ctx): FormulaValue {\n const parts: ArrayValue[] = [];\n let totalCols = 0, maxRows = 0;\n for (const node of a) {\n const arr = asArray(node.evaluate(c));\n parts.push(arr);\n totalCols += arr.columns;\n if (arr.rows > maxRows) maxRows = arr.rows;\n }\n if (maxRows > MAX_ROWS || totalCols > MAX_COLS) return FormulaValue.errorNum;\n\n const out = new ArrayValue(maxRows, totalCols);\n let colOff = 0;\n for (const arr of parts) {\n for (let col = 0; col < arr.columns; col++) {\n for (let r = 0; r < maxRows; r++) {\n out.set(r, colOff + col, r < arr.rows ? arr.get(r, col) : FormulaValue.errorNA);\n }\n }\n colOff += arr.columns;\n }\n return FormulaValue.array(out);\n}\n\n/** Shared flatten for TOCOL/TOROW: walks the array in scan order, applying the\n * `ignore` filter, and returns the surviving values in order. Streams through\n * `get` without building an intermediate index array. */\nfunction flatten(a: Args, c: Ctx): { ok: true; values: FormulaValue[] } | { ok: false; e: FormulaValue } {\n const arr = asArray(a[0]!.evaluate(c));\n const ig = num(a, c, 1, 0); if (!ig.ok) return { ok: false, e: ig.e };\n const ignore = Math.trunc(ig.n); // bit 1 = skip blanks, bit 2 = skip errors\n const byCol = a.length > 2 ? a[2]!.evaluate(c).coerceToBool().booleanValue : false;\n\n const skip = (x: FormulaValue) =>\n (((ignore & 1) !== 0) && x.isBlank) || (((ignore & 2) !== 0) && x.isError);\n\n const values: FormulaValue[] = [];\n if (byCol) {\n for (let col = 0; col < arr.columns; col++)\n for (let r = 0; r < arr.rows; r++) { const x = arr.get(r, col); if (!skip(x)) values.push(x); }\n } else {\n for (let r = 0; r < arr.rows; r++)\n for (let col = 0; col < arr.columns; col++) { const x = arr.get(r, col); if (!skip(x)) values.push(x); }\n }\n return { ok: true, values };\n}\n\n/** TOCOL(array, [ignore], [scan_by_column]) — flatten to a single column. */\nfunction toCol(a: Args, c: Ctx): FormulaValue {\n const f = flatten(a, c); if (!f.ok) return f.e;\n if (f.values.length === 0) return FormulaValue.errorNA;\n const out = new ArrayValue(f.values.length, 1);\n for (let i = 0; i < f.values.length; i++) out.set(i, 0, f.values[i]!);\n return FormulaValue.array(out);\n}\n\n/** TOROW(array, [ignore], [scan_by_column]) — flatten to a single row. */\nfunction toRow(a: Args, c: Ctx): FormulaValue {\n const f = flatten(a, c); if (!f.ok) return f.e;\n if (f.values.length === 0) return FormulaValue.errorNA;\n const out = new ArrayValue(1, f.values.length);\n for (let i = 0; i < f.values.length; i++) out.set(0, i, f.values[i]!);\n return FormulaValue.array(out);\n}\n","/**\n * Central registry of all supported Excel functions.\n * Port of TVE.PureDocs.Excel.Formulas.FunctionRegistry (C#)\n */\nimport { FormulaValue } from './formula-value.js';\nimport type { FormulaNode } from './formula-node.js';\nimport type { FormulaContext } from './formula-context.js';\nimport { registerMath } from './functions/math-functions.js';\nimport { registerText } from './functions/text-functions.js';\nimport { registerLogical } from './functions/logical-functions.js';\nimport { registerDate } from './functions/date-functions.js';\nimport { registerLookup } from './functions/lookup-functions.js';\nimport { registerStatistical } from './functions/statistical-functions.js';\nimport { registerInfo } from './functions/info-functions.js';\nimport { registerFinance } from './functions/finance-functions.js';\nimport { registerMeta } from './functions/meta-functions.js';\nimport { registerAggregate } from './functions/aggregate-functions.js';\nimport { registerArray } from './functions/array-functions.js';\n\nexport type FormulaFunction = (args: FormulaNode[], ctx: FormulaContext) => FormulaValue;\n\nexport interface FunctionDef {\n readonly name: string;\n readonly minArgs: number;\n readonly maxArgs: number; // -1 = unlimited\n readonly isVolatile: boolean;\n readonly handler: FormulaFunction;\n}\n\nexport class FunctionRegistry {\n static #default: FunctionRegistry | undefined;\n\n /** Lazily-created default registry with all built-in functions registered. */\n static get default(): FunctionRegistry {\n if (!FunctionRegistry.#default) {\n FunctionRegistry.#default = new FunctionRegistry();\n FunctionRegistry.#default.#registerBuiltIns();\n }\n return FunctionRegistry.#default;\n }\n\n readonly #functions = new Map<string, FunctionDef>();\n\n /** Registers a function. Name is normalised to UPPERCASE. */\n register(\n name: string,\n handler: FormulaFunction,\n minArgs = 0,\n maxArgs = -1,\n isVolatile = false,\n ): void {\n this.#functions.set(name.toUpperCase(), {\n name: name.toUpperCase(), minArgs, maxArgs, isVolatile, handler,\n });\n }\n\n /** Executes a function by name with argument validation. */\n execute(name: string, args: FormulaNode[], ctx: FormulaContext): FormulaValue {\n const def = this.#functions.get(name.toUpperCase());\n if (!def) return FormulaValue.errorName;\n\n if (args.length < def.minArgs) return FormulaValue.errorValue;\n if (def.maxArgs >= 0 && args.length > def.maxArgs) return FormulaValue.errorValue;\n\n try {\n return def.handler(args, ctx);\n } catch {\n return FormulaValue.errorValue;\n }\n }\n\n /** Returns true if the named function is volatile (NOW, RAND, etc.). */\n isVolatile(name: string): boolean {\n return this.#functions.get(name.toUpperCase())?.isVolatile ?? false;\n }\n\n /** Returns true if the function is registered. */\n has(name: string): boolean {\n return this.#functions.has(name.toUpperCase());\n }\n\n #registerBuiltIns(): void {\n // Static imports keep registration synchronous and deterministic.\n // The circular import (registry ↔ function modules) is safe because the\n // register* bindings are only invoked here at call time, never during\n // module evaluation.\n registerMath(this);\n registerText(this);\n registerLogical(this);\n registerDate(this);\n registerLookup(this);\n registerStatistical(this);\n registerInfo(this);\n registerFinance(this);\n registerMeta(this);\n registerAggregate(this);\n registerArray(this);\n }\n}\n\n// ── FormulaHelper — shared utilities used by function implementations ─────────\n\nexport namespace FormulaHelper {\n /** Evaluates a node and coerces to number, propagating errors. */\n export function evalDouble(\n node: FormulaNode,\n ctx: FormulaContext,\n ): { ok: true; value: number } | { ok: false; error: FormulaValue } {\n const v = node.evaluate(ctx);\n if (v.isError) return { ok: false, error: v };\n const r = v.tryAsDouble();\n if (!r.ok) return { ok: false, error: FormulaValue.errorValue };\n return { ok: true, value: r.value };\n }\n\n /** Evaluates a node and coerces to string, propagating errors. */\n export function evalString(\n node: FormulaNode,\n ctx: FormulaContext,\n ): { ok: true; value: string } | { ok: false; error: FormulaValue } {\n const v = node.evaluate(ctx);\n if (v.isError) return { ok: false, error: v };\n return { ok: true, value: v.asText() };\n }\n\n /**\n * Collects numbers from all args (expanding arrays, skipping blanks/text).\n * Returns false + error value if any arg is an error.\n */\n export function collectNumbers(\n args: FormulaNode[],\n ctx: FormulaContext,\n ): { ok: true; values: number[] } | { ok: false; error: FormulaValue } {\n const nums: number[] = [];\n for (const arg of args) {\n const v = arg.evaluate(ctx);\n if (v.isError) return { ok: false, error: v };\n if (v.isArray) {\n for (const item of v.arrayVal.values()) {\n if (item.isBlank || item.isText) continue;\n if (item.isError) return { ok: false, error: item };\n const r = item.tryAsDouble();\n if (r.ok) nums.push(r.value);\n }\n } else if (!v.isBlank && !v.isText) {\n const r = v.tryAsDouble();\n if (!r.ok) return { ok: false, error: FormulaValue.errorValue };\n nums.push(r.value);\n }\n }\n return { ok: true, values: nums };\n }\n\n /** Flattens all args into FormulaValue array (expanding arrays). */\n export function flattenArgs(\n args: FormulaNode[],\n ctx: FormulaContext,\n ): FormulaValue[] {\n const result: FormulaValue[] = [];\n for (const arg of args) {\n const v = arg.evaluate(ctx);\n if (v.isArray) {\n for (const item of v.arrayVal.values()) result.push(item);\n } else {\n result.push(v);\n }\n }\n return result;\n }\n\n /**\n * A criteria string analysed once, so testing it against N values does not\n * re-parse it N times.\n *\n * `kind` is what lets a caller index instead of scan: `equalsNumber` and\n * `equalsText` are the two shapes whose matching positions can be looked up,\n * and they are the overwhelming majority in real files (`SUMIFS(H:H, W:W, W282)`).\n * Everything else — comparisons, wildcards — only gets the compiled `test`.\n */\n export interface CompiledCriteria {\n readonly kind: 'equalsNumber' | 'equalsText' | 'compareNumber' | 'other';\n /** For `equalsNumber` and `compareNumber`: the number compared against. */\n readonly number?: number;\n /** For `equalsText`: the criterion, upper-cased (matching is case-insensitive). */\n readonly text?: string;\n /** For `compareNumber`: which comparison. */\n readonly op?: '>' | '>=' | '<' | '<=';\n readonly test: (value: FormulaValue) => boolean;\n }\n\n /**\n * Compiles a criteria string into a reusable predicate.\n *\n * Same semantics as {@link matchesCriteria} — that function is now this one\n * applied immediately — but the parsing, the number conversion and any wildcard\n * RegExp happen once instead of once per cell. A SUMIFS filled down 291 rows\n * over a 291-cell range was doing that 84 000 times.\n */\n export function compileCriteria(criteria: string): CompiledCriteria {\n const trimmed = criteria.trim();\n\n // Comparison operator prefix\n const opMatch = /^(>=|<=|<>|>|<|=)(.*)$/.exec(trimmed);\n if (opMatch) {\n const op = opMatch[1]!;\n const rhs = opMatch[2]!;\n const rhsVal = parseFloat(rhs);\n const rhsNum = isNaN(rhsVal) ? null : rhsVal;\n const rhsValue = rhsNum !== null ? FormulaValue.number(rhsNum) : FormulaValue.text(rhs);\n\n if (op === '=') {\n return rhsNum !== null\n ? numberEquality(rhsNum)\n : textEquality(rhs);\n }\n if (op === '<>') {\n // The complement of an equality is almost the whole range, so there is\n // nothing to gain from a list of positions here.\n return { kind: 'other', test: v => !FormulaValue.areEqual(v, rhsValue) };\n }\n const wanted = op === '>' ? (c: number) => c > 0\n : op === '>=' ? (c: number) => c >= 0\n : op === '<' ? (c: number) => c < 0\n : (c: number) => c <= 0;\n const test = (v: FormulaValue): boolean => wanted(FormulaValue.compare(v, rhsValue));\n\n // A numeric right-hand side is the indexable case: `compare` ranks by class\n // first (number/blank < text < boolean), so every text value gets the same\n // verdict, every boolean gets the same verdict, and only the numbers form an\n // interval. Against a *text* right-hand side, text values compare\n // lexicographically one by one, with no such uniformity — those stay on the\n // scan path.\n return rhsNum !== null\n ? { kind: 'compareNumber', number: rhsNum, op: op as '>' | '>=' | '<' | '<=', test }\n : { kind: 'other', test };\n }\n\n // Wildcard string matching — the RegExp is built once, not per value.\n if (trimmed.includes('*') || trimmed.includes('?')) {\n const pattern = wildcardToRegex(trimmed);\n return { kind: 'other', test: v => pattern.test(v.asText()) };\n }\n\n // Exact match\n const num = parseFloat(trimmed);\n return isNaN(num) ? textEquality(trimmed) : numberEquality(num);\n }\n\n /**\n * Equality against a number, with Excel's semantics: only a numeric cell can\n * match, plus a blank one when the criterion is (within tolerance of) zero.\n */\n function numberEquality(n: number): CompiledCriteria {\n const target = FormulaValue.number(n);\n return { kind: 'equalsNumber', number: n, test: v => FormulaValue.areEqual(v, target) };\n }\n\n /**\n * Equality against text: case-insensitive comparison of the value's *display*\n * text, so `\"5\"` as a criterion here would also match the number 5 — which is\n * why a numeric-looking criterion never reaches this branch.\n */\n function textEquality(s: string): CompiledCriteria {\n const upper = s.toUpperCase();\n return { kind: 'equalsText', text: upper, test: v => v.asText().toUpperCase() === upper };\n }\n\n /** Matches a criteria string (e.g. \">5\", \"=hello\", \"*partial*\") against a value. */\n export function matchesCriteria(value: FormulaValue, criteria: string): boolean {\n return compileCriteria(criteria).test(value);\n }\n\n function wildcardToRegex(pattern: string): RegExp {\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n return new RegExp(`^${escaped}$`, 'i');\n }\n}\n","/**\n * Evaluation context — resolves cell/range values, dispatches functions.\n * Port of TVE.PureDocs.Excel.Formulas.FormulaContext (C#)\n */\nimport { parseCellRef, cellRefFromRowCol } from '@devmm/puredocs-excel';\nimport { FormulaValue, ArrayValue } from './formula-value.js';\nimport { FunctionRegistry } from './function-registry.js';\nimport type { RangeCache } from './range-cache.js';\nimport type { FormulaNode } from './formula-node.js';\n\n// Forward declaration to avoid circular import\nexport interface WorksheetLike {\n getCellValue(reference: string): unknown;\n name: string;\n /**\n * Optional: value of a cell by 1-based row/column. Range reads use this when\n * present, which saves building — and re-parsing — one reference string per\n * cell. Implementations that resolve values lazily inside getCellValue should\n * leave it undefined to keep that path.\n */\n getCellValueAt?(row: number, column: number): unknown;\n /**\n * Optional: the populated extent of the sheet — the highest 1-based row and\n * column that hold a cell (0 when empty). Used to bound whole-column and\n * whole-row references (`A:A`, `1:1`), which Excel evaluates over the used\n * range rather than all 1,048,576 rows.\n */\n readonly usedBounds?: { rowCount: number; columnCount: number };\n /** Optional: whether a 1-based row is hidden (used by SUBTOTAL/AGGREGATE). */\n isRowHidden?(row: number): boolean;\n /** Optional: formula text of a cell (used by SUBTOTAL to skip nested calls). */\n getCellFormula?(reference: string): string | null;\n /** Optional: spill range (e.g. \"A1:A3\") of a dynamic-array anchor, for A1#. */\n getSpillRange?(reference: string): string | null;\n}\n\nexport interface WorkbookLike {\n worksheets: readonly WorksheetLike[];\n getWorksheet(name: string): WorksheetLike;\n /**\n * Optional resolver for defined names (named ranges). Returns the refers-to\n * expression (without leading '='), following Excel scoping: a name scoped to\n * `sheetName` wins over the workbook-global name. When this method is absent\n * (or returns undefined), named-range references evaluate to #NAME?.\n *\n * @devmm/puredocs-excel's Workbook implements this.\n */\n getDefinedName?(name: string, sheetName?: string): string | undefined;\n}\n\nexport class FormulaContext {\n readonly #sheet: WorksheetLike;\n readonly #functions: FunctionRegistry;\n readonly #evaluating: Set<string>;\n\n /** Row of the formula cell (for @ implicit intersection). */\n formulaRow: number;\n /** Column of the formula cell (for @ implicit intersection). */\n formulaCol: number;\n\n /** Optional workbook reference for cross-sheet references. */\n workbook?: WorkbookLike;\n\n /**\n * Optional memo for range reads, supplied by whoever owns the write side —\n * the recalculation engine, which invalidates it as it writes results. Left\n * undefined for one-shot evaluation, where a stale entry could otherwise\n * outlive a caller's direct edit to the model.\n */\n rangeCache?: RangeCache;\n\n /**\n * Optional named-range resolver, installed by the evaluator when the workbook\n * exposes getDefinedName. Given a name, returns its evaluated value. Left\n * undefined when no resolver is available, in which case named ranges are\n * #NAME? (unchanged legacy behaviour).\n */\n nameResolver?: (name: string) => FormulaValue;\n\n /**\n * Shared recursion budget for LAMBDA calls, threaded across all contexts in a\n * single evaluation. Guards non-tail recursion (which grows the JS stack);\n * tail recursion is trampolined and does not count against it.\n */\n recursionGuard?: { depth: number; max: number };\n\n /**\n * Lexical scope stack for LET/LAMBDA local names. Each frame maps an\n * upper-cased local name to its value. Names resolve innermost-first and take\n * precedence over workbook defined names.\n */\n readonly #scopes: Array<Map<string, FormulaValue>> = [];\n\n /** Pushes a new binding frame (used by LET/LAMBDA). */\n pushScope(bindings: Map<string, FormulaValue>): void {\n this.#scopes.push(bindings);\n }\n\n /** Pops the innermost binding frame. */\n popScope(): void {\n this.#scopes.pop();\n }\n\n #lookupScope(name: string): FormulaValue | undefined {\n if (this.#scopes.length === 0) return undefined;\n const key = name.toUpperCase();\n for (let i = this.#scopes.length - 1; i >= 0; i--) {\n const v = this.#scopes[i]!.get(key);\n if (v !== undefined) return v;\n }\n return undefined;\n }\n\n constructor(\n sheet: WorksheetLike,\n formulaRow = 0,\n formulaCol = 0,\n evaluating?: Set<string>,\n registry?: FunctionRegistry,\n ) {\n this.#sheet = sheet;\n this.formulaRow = formulaRow;\n this.formulaCol = formulaCol;\n this.#evaluating = evaluating ?? new Set<string>();\n this.#functions = registry ?? FunctionRegistry.default;\n }\n\n get worksheet(): WorksheetLike { return this.#sheet; }\n\n // ── Cell/Range resolution ─────────────────────────────────────────────────\n\n getCellValue(cellReference: string): FormulaValue {\n const norm = cellReference.replace(/\\$/g, '').toUpperCase();\n\n // Circular reference detection\n if (this.#evaluating.has(norm)) return FormulaValue.errorRef;\n this.#evaluating.add(norm);\n\n try {\n const raw = this.#sheet.getCellValue(cellReference);\n return FormulaValue.fromObjectSync(raw);\n } finally {\n this.#evaluating.delete(norm);\n }\n }\n\n getRangeValues(startRef: string, endRef: string): FormulaValue {\n const s = parseCellRef(startRef);\n const e = parseCellRef(endRef);\n return this.getRangeValuesByIndex(s.row, s.column, e.row, e.column);\n }\n\n /**\n * Resolves a rectangle already known in coordinates. Split out from\n * {@link getRangeValues} because whole-column references and the range memo\n * both work in numbers, and formatting them back into `A1` strings only to\n * re-parse them is measurable at range scale.\n */\n getRangeValuesByIndex(\n startRow: number,\n startCol: number,\n endRow: number,\n endCol: number,\n ): FormulaValue {\n const rows = endRow - startRow + 1;\n const cols = endCol - startCol + 1;\n\n // A single cell is cheaper to read than to memo, and the cache would fill\n // with entries that never see a second hit.\n const cache = rows * cols > 1 ? this.rangeCache : undefined;\n const sheetKey = cache ? this.#sheet.name.toUpperCase() : '';\n if (cache) {\n const hit = cache.get(sheetKey, startRow, startCol, endRow, endCol);\n if (hit !== undefined) return hit;\n }\n\n const arr = new ArrayValue(rows, cols);\n // Fast path: the sheet can address cells by coordinate, so no per-cell\n // reference string is built and the circular-reference guard — which cannot\n // fire on a plain value read — is skipped.\n const at = this.#sheet.getCellValueAt;\n if (at) {\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n arr.set(r, c, FormulaValue.fromObjectSync(at.call(this.#sheet, startRow + r, startCol + c)));\n }\n }\n } else {\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const ref = cellRefFromRowCol(startRow + r, startCol + c);\n arr.set(r, c, this.getCellValue(ref));\n }\n }\n }\n\n const value = FormulaValue.array(arr);\n if (cache && rows > 0 && cols > 0) {\n cache.set(sheetKey, startRow, startCol, endRow, endCol, value, rows * cols);\n }\n return value;\n }\n\n /**\n * Resolves a whole-column (`A:A`) or whole-row (`1:1`) reference, bounded by\n * the sheet's used range the way Excel does. Without a bound this would\n * materialise a million-cell array for a sheet with twelve rows in it.\n *\n * A sheet that cannot report its extent yields `#REF!` rather than a guess:\n * silently reading nothing would make SUM(A:A) return 0 on a full column.\n */\n getFullRangeValues(\n startCol: number | null,\n endCol: number | null,\n startRow: number | null,\n endRow: number | null,\n ): FormulaValue {\n const bounds = this.#sheet.usedBounds;\n if (!bounds) return FormulaValue.errorRef;\n if (bounds.rowCount === 0 || bounds.columnCount === 0) return FormulaValue.blank;\n\n const r0 = startRow ?? 1;\n const r1 = endRow ?? bounds.rowCount;\n const c0 = startCol ?? 1;\n const c1 = endCol ?? bounds.columnCount;\n // Clamp to the used range: the unbounded dimension follows it, and the\n // bounded one may still point past the data.\n const lastRow = Math.min(r1, bounds.rowCount);\n const lastCol = Math.min(c1, bounds.columnCount);\n if (lastRow < r0 || lastCol < c0) return FormulaValue.blank;\n\n return this.getRangeValuesByIndex(r0, c0, lastRow, lastCol);\n }\n\n getSheetCellValue(sheetName: string, cellReference: string): FormulaValue {\n if (!this.workbook) return FormulaValue.errorRef;\n try {\n return this.#forSheet(sheetName).getCellValue(cellReference);\n } catch {\n return FormulaValue.errorRef;\n }\n }\n\n getSheetRangeValues(sheetName: string, startRef: string, endRef: string): FormulaValue {\n if (!this.workbook) return FormulaValue.errorRef;\n try {\n return this.#forSheet(sheetName).getRangeValues(startRef, endRef);\n } catch {\n return FormulaValue.errorRef;\n }\n }\n\n /** Whole-column/whole-row reference qualified by a sheet name. */\n getSheetFullRangeValues(\n sheetName: string,\n startCol: number | null,\n endCol: number | null,\n startRow: number | null,\n endRow: number | null,\n ): FormulaValue {\n if (!this.workbook) return FormulaValue.errorRef;\n try {\n return this.#forSheet(sheetName).getFullRangeValues(startCol, endCol, startRow, endRow);\n } catch {\n return FormulaValue.errorRef;\n }\n }\n\n /**\n * A sibling context bound to another sheet, sharing this one's circular-\n * reference guard and range memo. These contexts only read values — they\n * never evaluate an AST — so the name resolver and recursion budget are\n * deliberately not carried over; passing them would suggest a scoping\n * relationship that does not exist. The memo, on the other hand, must be\n * carried: cross-sheet ranges are the most expensive reads in a workbook.\n */\n #forSheet(sheetName: string): FormulaContext {\n const sheet = this.workbook!.getWorksheet(sheetName);\n const ctx = new FormulaContext(sheet, this.formulaRow, this.formulaCol, this.#evaluating, this.#functions);\n ctx.workbook = this.workbook;\n ctx.rangeCache = this.rangeCache;\n return ctx;\n }\n\n resolveNamedRange(name: string): FormulaValue {\n // LET/LAMBDA locals shadow everything else.\n const scoped = this.#lookupScope(name);\n if (scoped !== undefined) return scoped;\n // Otherwise delegate to the evaluator-installed nameResolver, which looks\n // the name up on the workbook and evaluates its refers-to expression.\n // Absent a resolver, a named reference is #NAME? (legacy behaviour).\n return this.nameResolver ? this.nameResolver(name) : FormulaValue.errorName;\n }\n\n /**\n * Resolves a spill-range reference (A1#) to the array spilling from the anchor\n * cell. Requires the worksheet to expose getSpillRange; otherwise #REF!.\n */\n resolveSpillRange(anchorRef: string): FormulaValue {\n const spillRef = this.#sheet.getSpillRange?.(anchorRef);\n if (!spillRef) return FormulaValue.errorRef;\n const colon = spillRef.indexOf(':');\n if (colon < 0) return this.getCellValue(spillRef);\n return this.getRangeValues(spillRef.slice(0, colon), spillRef.slice(colon + 1));\n }\n\n getRangeBounds(startRef: string, endRef: string): { startRow: number; startCol: number; endRow: number; endCol: number } {\n const s = parseCellRef(startRef);\n const e = parseCellRef(endRef);\n return { startRow: s.row, startCol: s.column, endRow: e.row, endCol: e.column };\n }\n\n // ── Function dispatch ─────────────────────────────────────────────────────\n\n /** True if a built-in function with this name is registered. */\n hasFunction(name: string): boolean {\n return this.#functions.has(name);\n }\n\n evaluateFunction(name: string, args: FormulaNode[]): FormulaValue {\n // A call to an unregistered name may be a call to a named LAMBDA.\n if (!this.#functions.has(name)) {\n const named = this.resolveNamedRange(name);\n if (named.isLambda) {\n return named.lambdaVal.call(args.map(a => a.evaluate(this)));\n }\n }\n return this.#functions.execute(name, args, this);\n }\n}\n","/**\n * Least-Recently-Used cache using JavaScript Map insertion-order semantics.\n * Port of TVE.PureDocs.Excel.Formulas.LruCache<TKey, TValue> (C#)\n *\n * JS Map maintains insertion order, so LRU eviction is simply:\n * delete oldest key = map.keys().next().value\n * move to end = delete + re-insert\n *\n * This is simpler and faster than the C# LinkedList + Dictionary approach.\n */\nexport class LruCache<K, V> {\n readonly #map: Map<K, V>;\n #capacity: number;\n\n #hits = 0;\n #misses = 0;\n #evictions = 0;\n\n constructor(capacity: number) {\n if (capacity <= 0) throw new RangeError('LruCache capacity must be > 0.');\n this.#capacity = capacity;\n this.#map = new Map();\n }\n\n get capacity(): number { return this.#capacity; }\n get size(): number { return this.#map.size; }\n get hits(): number { return this.#hits; }\n get misses(): number { return this.#misses; }\n get evictions():number { return this.#evictions; }\n get hitRate(): number {\n const total = this.#hits + this.#misses;\n return total === 0 ? 0 : this.#hits / total;\n }\n\n /**\n * Returns the value for key, or undefined if not present.\n * Moves the accessed key to the \"most recently used\" end.\n */\n get(key: K): V | undefined {\n const value = this.#map.get(key);\n if (value === undefined) {\n this.#misses++;\n return undefined;\n }\n // Move to end (most recently used)\n this.#map.delete(key);\n this.#map.set(key, value);\n this.#hits++;\n return value;\n }\n\n /**\n * Inserts or updates a key-value pair.\n * Evicts the least-recently-used entry if over capacity.\n */\n set(key: K, value: V): void {\n if (this.#map.has(key)) {\n // Update: remove and re-insert to move to end\n this.#map.delete(key);\n } else if (this.#map.size >= this.#capacity) {\n // Evict oldest (first key in Map)\n const oldest = this.#map.keys().next().value as K;\n this.#map.delete(oldest);\n this.#evictions++;\n }\n this.#map.set(key, value);\n }\n\n /** Removes a key from the cache. Returns true if it existed. */\n delete(key: K): boolean {\n return this.#map.delete(key);\n }\n\n /** Returns true if the key is present (does NOT update LRU order). */\n has(key: K): boolean {\n return this.#map.has(key);\n }\n\n /** Removes all entries and resets statistics. */\n clear(): void {\n this.#map.clear();\n this.#hits = this.#misses = this.#evictions = 0;\n }\n\n /** Resizes the cache, evicting oldest entries if necessary. */\n resize(newCapacity: number): void {\n if (newCapacity <= 0) throw new RangeError('Capacity must be > 0.');\n this.#capacity = newCapacity;\n while (this.#map.size > newCapacity) {\n const oldest = this.#map.keys().next().value as K;\n this.#map.delete(oldest);\n this.#evictions++;\n }\n }\n}\n","/**\n * Main entry point for formula evaluation.\n * Port of TVE.PureDocs.Excel.Formulas.FormulaEvaluator (C#)\n *\n * Includes LRU cache for parsed ASTs to avoid re-parsing identical formulas.\n */\nimport { FormulaLexer } from './formula-lexer.js';\nimport { FormulaParser } from './formula-parser.js';\nimport { FormulaContext, type WorksheetLike, type WorkbookLike } from './formula-context.js';\nimport { FormulaValue } from './formula-value.js';\nimport { LruCache } from './lru-cache.js';\nimport type { RangeCache } from './range-cache.js';\nimport type { FormulaNode } from './formula-node.js';\n\nconst DEFAULT_CACHE_CAPACITY = 10_000;\n\n// Global AST cache shared across all evaluations (formula text → AST)\nconst astCache = new LruCache<string, FormulaNode>(DEFAULT_CACHE_CAPACITY);\n\n/**\n * Parses a formula string to an AST, with LRU caching.\n */\nexport function parseFormula(formula: string): FormulaNode {\n const stripped = formula.startsWith('=') ? formula.slice(1) : formula;\n const cached = astCache.get(stripped);\n if (cached !== undefined) return cached;\n\n const ast = parseFormulaUncached(stripped);\n astCache.set(stripped, ast);\n return ast;\n}\n\n/**\n * Parses a formula without consulting or populating the shared AST cache.\n *\n * For callers that keep the AST themselves — the recalculation engine holds one\n * per registered formula — the cache is pure overhead: it would evict entries\n * that are still live elsewhere once a workbook has more formulas than its\n * capacity, paying eviction cost and retaining memory for no hits.\n */\nexport function parseFormulaUncached(formula: string): FormulaNode {\n const stripped = formula.startsWith('=') ? formula.slice(1) : formula;\n const tokens = new FormulaLexer(stripped).tokenize();\n return new FormulaParser(tokens).parse();\n}\n\n/** Default cap on non-tail LAMBDA recursion depth (JS stack safety). */\nconst DEFAULT_LAMBDA_DEPTH = 1024;\n\ninterface BuildContextOptions {\n workbook?: WorkbookLike;\n formulaRow?: number;\n formulaCol?: number;\n /** Shared cell-evaluation guard (circular cell reference detection). */\n evaluating?: Set<string>;\n /** Shared named-range-resolution guard (circular name detection). */\n resolvingNames?: Set<string>;\n /** Shared cache of resolved names within one top-level evaluation. */\n resolvedNames?: Map<string, FormulaValue>;\n /** Shared recursion budget for LAMBDA calls. */\n recursionGuard?: { depth: number; max: number };\n /** Optional range memo, owned and invalidated by the caller. */\n rangeCache?: RangeCache;\n}\n\n/**\n * Builds a FormulaContext, wiring the named-range resolver when the workbook\n * exposes getDefinedName. The evaluation and name-resolution guard sets, the\n * resolved-name cache, and the recursion guard are threaded into child contexts.\n */\nfunction buildContext(sheet: WorksheetLike, opts: BuildContextOptions): FormulaContext {\n const evaluating = opts.evaluating ?? new Set<string>();\n const ctx = new FormulaContext(\n sheet,\n opts.formulaRow ?? 0,\n opts.formulaCol ?? 0,\n evaluating,\n );\n ctx.recursionGuard = opts.recursionGuard ?? { depth: 0, max: DEFAULT_LAMBDA_DEPTH };\n ctx.rangeCache = opts.rangeCache;\n\n const wb = opts.workbook;\n if (wb) {\n ctx.workbook = wb;\n if (typeof wb.getDefinedName === 'function') {\n const resolving = opts.resolvingNames ?? new Set<string>();\n const resolved = opts.resolvedNames ?? new Map<string, FormulaValue>();\n const guard = ctx.recursionGuard;\n ctx.nameResolver = (name: string) =>\n resolveName(name, sheet, wb, evaluating, resolving, resolved, guard);\n }\n }\n return ctx;\n}\n\n/**\n * Resolves a named range by looking up its refers-to expression on the workbook\n * (scoped to the referencing sheet) and evaluating it. Results are cached per\n * top-level evaluation so recursive named lambdas don't re-parse each call, and\n * name→name cycles are guarded.\n */\nfunction resolveName(\n name: string,\n sheet: WorksheetLike,\n workbook: WorkbookLike,\n evaluating: Set<string>,\n resolving: Set<string>,\n resolved: Map<string, FormulaValue>,\n recursionGuard: { depth: number; max: number },\n): FormulaValue {\n const key = `${sheet.name} ${name.toUpperCase()}`;\n const cached = resolved.get(key);\n if (cached !== undefined) return cached;\n\n if (resolving.has(key)) return FormulaValue.errorRef; // circular name definition\n const refersTo = workbook.getDefinedName!(name, sheet.name);\n if (refersTo == null || refersTo === '') return FormulaValue.errorName;\n\n resolving.add(key);\n try {\n const ast = parseFormula(refersTo);\n const ctx = buildContext(sheet, {\n workbook, evaluating, resolvingNames: resolving, resolvedNames: resolved, recursionGuard,\n });\n const value = ast.evaluate(ctx);\n // Cache only pure lambdas — they are stable closures. Other values may read\n // cells and are cheap to recompute; caching them risks subtle staleness.\n if (value.isLambda) resolved.set(key, value);\n return value;\n } catch {\n return FormulaValue.errorName;\n } finally {\n resolving.delete(key);\n }\n}\n\n/**\n * Evaluates a formula string against a worksheet.\n * Mirrors FormulaEvaluator.Evaluate() in C#.\n */\nexport function evaluateFormula(\n formula: string,\n sheet: WorksheetLike,\n options?: {\n workbook?: WorkbookLike;\n formulaRow?: number;\n formulaCol?: number;\n },\n): FormulaValue {\n if (!formula) return FormulaValue.blank;\n\n try {\n return evaluateAst(parseFormula(formula), sheet, options);\n } catch {\n return FormulaValue.errorValue;\n }\n}\n\n/**\n * Evaluates an already-parsed formula. Callers that hold onto an AST — such as\n * the recalculation engine, which parses each formula once when it is\n * registered — should use this so repeated evaluation never depends on the\n * global AST cache still holding the entry.\n */\nexport function evaluateAst(\n ast: FormulaNode,\n sheet: WorksheetLike,\n options?: {\n workbook?: WorkbookLike;\n formulaRow?: number;\n formulaCol?: number;\n /**\n * Range memo shared across evaluations. Only pass one if you invalidate it\n * on every write to the model — {@link RecalcEngine} does.\n */\n rangeCache?: RangeCache;\n },\n): FormulaValue {\n try {\n const ctx = buildContext(sheet, {\n workbook: options?.workbook,\n formulaRow: options?.formulaRow,\n formulaCol: options?.formulaCol,\n rangeCache: options?.rangeCache,\n });\n return ast.evaluate(ctx);\n } catch {\n return FormulaValue.errorValue;\n }\n}\n\n// ── Cache management ──────────────────────────────────────────────────────────\n\nexport function clearAstCache(): void {\n astCache.clear();\n}\n\nexport function getAstCacheStats(): { size: number; hits: number; misses: number; hitRate: number } {\n return {\n size: astCache.size,\n hits: astCache.hits,\n misses: astCache.misses,\n hitRate: astCache.hitRate,\n };\n}\n\nexport function setAstCacheCapacity(capacity: number): void {\n astCache.resize(capacity);\n}\n","/**\n * Memo for range reads: `(sheet, rectangle) → array value`.\n *\n * Why this exists. A range reference is resolved by materialising an ArrayValue\n * and reading every cell in the rectangle. The dominant pattern in real\n * workbooks is many formulas reading the *same* range — a SUMIFS filled down\n * 291 rows reads its two 291-cell ranges 291 times each — so the same rectangle\n * is rebuilt over and over. Memoising it turns O(formulas × range) into\n * O(distinct ranges × range) for the read side, which is the difference between\n * a recalculation that finishes and one that does not.\n *\n * Why invalidation is per-rectangle rather than per-sheet. During a recalc pass\n * the engine writes a computed value after every formula, so a sheet-wide\n * generation counter would invalidate the whole cache thousands of times per\n * pass and never hit. Instead each cached rectangle is filed into a coarse tile\n * grid (same shape as {@link DependencyIndex}), and a write only drops the\n * rectangles that actually contain the written cell — writes to a column of\n * results leave the input ranges cached.\n *\n * Safety. Cached values are shared, not copied, so a reader must not mutate the\n * ArrayValue it receives. Every built-in function builds its own result array;\n * none writes into an argument.\n */\nimport type { FormulaValue } from './formula-value.js';\n\nconst TILE_ROWS = 64;\nconst TILE_COLS = 64;\n/** Above this many tiles a rectangle is filed sheet-wide instead. */\nconst MAX_TILES_PER_RANGE = 32;\n/** Default ceiling on cached cells, ≈ a few MB of references. */\nconst DEFAULT_MAX_CELLS = 2_000_000;\n\nexport class RangeCache {\n /** `SHEET r0 c0 r1 c1` → the memoised array value. Insertion-ordered (FIFO eviction). */\n readonly #entries = new Map<string, FormulaValue>();\n /** `sheet tr tc` → entry keys whose rectangle overlaps that tile. */\n readonly #tiles = new Map<string, Set<string>>();\n /** sheet → entry keys whose rectangle is too broad to tile. */\n readonly #wide = new Map<string, Set<string>>();\n /** entry key → buckets it was filed under, for cheap removal. */\n readonly #placements = new Map<string, string[]>();\n /** entry key → its area, so eviction can give the budget back. */\n readonly #sizes = new Map<string, number>();\n /** Number of cells across all cached rectangles, kept under {@link #maxCells}. */\n #cells = 0;\n readonly #maxCells: number;\n\n hits = 0;\n misses = 0;\n\n constructor(maxCells: number = DEFAULT_MAX_CELLS) {\n this.#maxCells = maxCells;\n }\n\n get size(): number { return this.#entries.size; }\n get cachedCells(): number { return this.#cells; }\n\n static key(sheet: string, r0: number, c0: number, r1: number, c1: number): string {\n return `${sheet} ${r0} ${c0} ${r1} ${c1}`;\n }\n\n get(sheet: string, r0: number, c0: number, r1: number, c1: number): FormulaValue | undefined {\n const hit = this.#entries.get(RangeCache.key(sheet, r0, c0, r1, c1));\n if (hit === undefined) this.misses++; else this.hits++;\n return hit;\n }\n\n /** Memoises a rectangle's value. `cells` is its area, for the budget. */\n set(\n sheet: string,\n r0: number, c0: number, r1: number, c1: number,\n value: FormulaValue,\n cells: number,\n ): void {\n if (cells <= 0 || cells > this.#maxCells) return; // never worth evicting everything for one range\n\n const key = RangeCache.key(sheet, r0, c0, r1, c1);\n if (this.#entries.has(key)) this.#drop(key);\n\n this.#entries.set(key, value);\n this.#cells += cells;\n\n const buckets: string[] = [];\n const tileRow0 = (r0 / TILE_ROWS) | 0, tileRow1 = (r1 / TILE_ROWS) | 0;\n const tileCol0 = (c0 / TILE_COLS) | 0, tileCol1 = (c1 / TILE_COLS) | 0;\n const tileCount = (tileRow1 - tileRow0 + 1) * (tileCol1 - tileCol0 + 1);\n\n if (tileCount > MAX_TILES_PER_RANGE) {\n this.#fileIn(this.#wide, sheet, key, buckets, `w ${sheet}`);\n } else {\n for (let tr = tileRow0; tr <= tileRow1; tr++) {\n for (let tc = tileCol0; tc <= tileCol1; tc++) {\n const bucket = `${sheet} ${tr} ${tc}`;\n this.#fileIn(this.#tiles, bucket, key, buckets, `t ${bucket}`);\n }\n }\n }\n this.#placements.set(key, buckets);\n this.#sizes.set(key, cells);\n\n // FIFO eviction: the oldest rectangles are the least likely to be the one\n // the current fill-down is hammering.\n if (this.#cells > this.#maxCells) {\n for (const oldest of this.#entries.keys()) {\n if (this.#cells <= this.#maxCells) break;\n if (oldest === key) continue; // never evict what we just inserted\n this.#drop(oldest);\n }\n }\n }\n\n /** Drops every cached rectangle containing the given cell. */\n invalidateCell(sheet: string, row: number, col: number): void {\n const tile = this.#tiles.get(`${sheet} ${(row / TILE_ROWS) | 0} ${(col / TILE_COLS) | 0}`);\n if (tile) {\n // A tile is coarser than a rectangle, so confirm before dropping — a\n // false drop is only a lost hit, but confirming is nearly free.\n for (const key of [...tile]) {\n if (RangeCache.#contains(key, sheet, row, col)) this.#drop(key);\n }\n }\n const wide = this.#wide.get(sheet);\n if (wide) {\n for (const key of [...wide]) {\n if (RangeCache.#contains(key, sheet, row, col)) this.#drop(key);\n }\n }\n }\n\n clear(): void {\n this.#entries.clear();\n this.#tiles.clear();\n this.#wide.clear();\n this.#placements.clear();\n this.#sizes.clear();\n this.#cells = 0;\n }\n\n static #contains(key: string, sheet: string, row: number, col: number): boolean {\n const parts = key.split(' ');\n // The sheet name itself may contain spaces, so read the rectangle off the end.\n const n = parts.length;\n const c1 = +parts[n - 1]!, r1 = +parts[n - 2]!, c0 = +parts[n - 3]!, r0 = +parts[n - 4]!;\n if (parts.slice(0, n - 4).join(' ') !== sheet) return false;\n return row >= r0 && row <= r1 && col >= c0 && col <= c1;\n }\n\n #drop(key: string): void {\n if (!this.#entries.delete(key)) return;\n this.#cells -= this.#sizes.get(key) ?? 0;\n this.#sizes.delete(key);\n const buckets = this.#placements.get(key);\n if (buckets) {\n for (const bucket of buckets) {\n const store = bucket.charCodeAt(0) === 119 /* 'w' */ ? this.#wide : this.#tiles;\n const bucketKey = bucket.slice(2);\n const set = store.get(bucketKey);\n if (!set) continue;\n set.delete(key);\n if (set.size === 0) store.delete(bucketKey);\n }\n this.#placements.delete(key);\n }\n }\n\n #fileIn(\n store: Map<string, Set<string>>,\n bucketKey: string,\n entryKey: string,\n buckets: string[],\n bucketId: string,\n ): void {\n let set = store.get(bucketKey);\n if (!set) { set = new Set(); store.set(bucketKey, set); }\n if (set.has(entryKey)) return;\n set.add(entryKey);\n buckets.push(bucketId);\n }\n}\n","/**\n * Static precedent extraction from a parsed formula AST.\n *\n * Walks the AST and collects the cell/range references a formula reads\n * (its precedents), plus whether the formula is volatile (contains a volatile\n * function such as NOW/RAND/OFFSET/INDIRECT). The dependency graph is built\n * from these precedents; volatile formulas are always recalculated because\n * their real precedents cannot be known statically (e.g. INDIRECT/OFFSET\n * compute a reference at run time).\n */\nimport { parseCellRef, EXCEL_MAX_ROWS, EXCEL_MAX_COLUMNS } from '@devmm/puredocs-excel';\nimport { FunctionRegistry } from './function-registry.js';\nimport { parseFormula } from './formula-evaluator.js';\nimport {\n FormulaNode,\n CellReferenceNode,\n RangeReferenceNode,\n SheetCellReferenceNode,\n SheetRangeReferenceNode,\n FullRangeReferenceNode,\n NamedRangeNode,\n SpillReferenceNode,\n FunctionCallNode,\n BinaryOpNode,\n UnaryOpNode,\n ImplicitIntersectionNode,\n} from './formula-node.js';\n\n/** A rectangular precedent region on a specific sheet (1-based, inclusive). */\nexport interface PrecedentRef {\n /** Upper-cased sheet name. */\n readonly sheet: string;\n readonly startRow: number;\n readonly startCol: number;\n readonly endRow: number;\n readonly endCol: number;\n}\n\nexport interface ExtractResult {\n readonly refs: PrecedentRef[];\n readonly volatile: boolean;\n}\n\n/** Resolves a defined name to its refers-to expression, for name expansion. */\nexport type NameResolver = (name: string, sheet: string) => string | undefined;\n\n/**\n * Extracts the precedents and volatility of a formula AST.\n *\n * @param ast The parsed formula.\n * @param formulaSheet Upper-cased name of the sheet the formula lives on;\n * unqualified references resolve against it.\n * @param registry Function registry used to test volatility.\n * @param resolveName Optional resolver so NamedRangeNode precedents expand to\n * the references inside their refers-to expression.\n */\nexport function extractReferences(\n ast: FormulaNode,\n formulaSheet: string,\n registry: FunctionRegistry = FunctionRegistry.default,\n resolveName?: NameResolver,\n): ExtractResult {\n const refs: PrecedentRef[] = [];\n let volatile = false;\n const seenNames = new Set<string>();\n\n const cell = (sheet: string, ref: string): PrecedentRef => {\n const { row, column } = parseCellRef(ref);\n return { sheet: sheet.toUpperCase(), startRow: row, startCol: column, endRow: row, endCol: column };\n };\n const range = (sheet: string, startRef: string, endRef: string): PrecedentRef => {\n const s = parseCellRef(startRef);\n const e = parseCellRef(endRef);\n return {\n sheet: sheet.toUpperCase(),\n startRow: Math.min(s.row, e.row),\n startCol: Math.min(s.column, e.column),\n endRow: Math.max(s.row, e.row),\n endCol: Math.max(s.column, e.column),\n };\n };\n\n const walk = (node: FormulaNode): void => {\n if (node instanceof CellReferenceNode) {\n refs.push(cell(formulaSheet, node.reference));\n } else if (node instanceof RangeReferenceNode) {\n refs.push(range(formulaSheet, node.startRef, node.endRef));\n } else if (node instanceof SheetCellReferenceNode) {\n refs.push(cell(node.sheetName, node.cellReference));\n } else if (node instanceof SheetRangeReferenceNode) {\n refs.push(range(node.sheetName, node.startRef, node.endRef));\n } else if (node instanceof FullRangeReferenceNode) {\n // The precedent rectangle spans the whole open dimension, not just the\n // currently-used part of it: a formula reading A:A must recompute when a\n // value appears *below* today's last row, which is exactly the case the\n // used-range bound would miss.\n refs.push({\n sheet: (node.sheetName ?? formulaSheet).toUpperCase(),\n startRow: node.startRow ?? 1,\n endRow: node.endRow ?? EXCEL_MAX_ROWS,\n startCol: node.startCol ?? 1,\n endCol: node.endCol ?? EXCEL_MAX_COLUMNS,\n });\n } else if (node instanceof NamedRangeNode) {\n expandName(node.name);\n } else if (node instanceof SpillReferenceNode) {\n // A1# co-changes with its anchor; depending on the anchor cell suffices\n // to retrigger this formula whenever the spilling formula recomputes.\n refs.push(cell(formulaSheet, node.anchorRef));\n } else if (node instanceof FunctionCallNode) {\n if (registry.isVolatile(node.functionName)) volatile = true;\n for (const arg of node.args) walk(arg);\n } else if (node instanceof BinaryOpNode) {\n walk(node.left);\n walk(node.right);\n } else if (node instanceof UnaryOpNode) {\n walk(node.operand);\n } else if (node instanceof ImplicitIntersectionNode) {\n walk(node.inner);\n }\n // Literal nodes have no precedents.\n };\n\n const expandName = (name: string): void => {\n if (!resolveName) return;\n const key = name.toUpperCase();\n if (seenNames.has(key)) return; // guard against name → name cycles\n seenNames.add(key);\n const refersTo = resolveName(name, formulaSheet);\n if (!refersTo) return;\n try {\n walk(parseFormula(refersTo));\n } catch {\n /* ignore unparseable refers-to */\n }\n };\n\n walk(ast);\n return { refs, volatile };\n}\n\n/** True if the 1-based cell (sheet,row,col) falls inside a precedent region. */\nexport function refContains(ref: PrecedentRef, sheet: string, row: number, col: number): boolean {\n return (\n ref.sheet === sheet &&\n row >= ref.startRow && row <= ref.endRow &&\n col >= ref.startCol && col <= ref.endCol\n );\n}\n","/**\n * Reverse-dependency index: given a cell, which registered formulas read it?\n *\n * Without an index the only way to answer that is to test every formula's\n * precedent rectangles, which makes a single edit O(F) and a full recalc O(F²).\n * Since precedents are rectangles rather than points, they are bucketed, and a\n * query only inspects the buckets that can contain the cell.\n *\n * The bucketing rule, and why it is shaped this way. A formula's input is almost\n * always a *tall, narrow* rectangle: one column, or a few adjacent ones, running\n * down a block of rows (`$H$4:$H$294`, `A:A`). Two earlier attempts both went\n * quadratic on exactly that shape:\n *\n * - Tiling both dimensions at 64×64 buries the selective dimension. The input\n * columns and the result column of a table sit within a few of each other, so\n * they land in one 64-wide tile, and \"who reads this cell?\" answers \"every\n * formula in the table\".\n * - Treating anything too tall to tile as sheet-wide has the same effect for a\n * different reason: a whole column is 16 384 tiles tall, so every such formula\n * ends up in one list that every query scans.\n *\n * So the rule is: **exact resolution on the narrow dimension, tile resolution on\n * the broad one.** A column range is filed under its column (exactly) crossed\n * with the row tiles it spans; a row range the other way round; a rectangle\n * that is compact in both is tiled in both; one that is broad in both — rare,\n * and genuinely unselective — goes to a per-sheet list.\n *\n * Buckets over-approximate by at most one tile in the broad dimension, so\n * callers still confirm each candidate with {@link refContains}.\n */\nimport { refContains, type PrecedentRef } from './recalc-references.js';\n\nconst TILE_ROWS = 64;\nconst TILE_COLS = 64;\n/** Above this many tiles a dimension is not enumerated at tile resolution. */\nconst MAX_TILES_PER_REF = 32;\n/**\n * A span this narrow is enumerated exactly, one bucket per column (or row).\n * Comfortably covers what real formulas read — a handful of adjacent columns.\n */\nconst MAX_EXACT_SPAN = 16;\n/** Ceiling on buckets per rectangle, so registration stays cheap. */\nconst MAX_BUCKETS_PER_REF = 64;\n\nconst tileOfRow = (row: number): number => (row / TILE_ROWS) | 0;\nconst tileOfCol = (col: number): number => (col / TILE_COLS) | 0;\n\nexport class DependencyIndex {\n /**\n * All buckets in one map, keyed by a discriminating prefix:\n *\n * `t s tr tc` rectangle compact in both dimensions\n * `c s col tr` narrow columns, row tiles (the common case)\n * `C s col` narrow columns, every row (`A:A`)\n * `r s row tc` narrow rows, column tiles\n * `R s row` narrow rows, every column (`1:1`)\n * `w s` broad in both dimensions\n */\n readonly #buckets = new Map<string, Set<string>>();\n /** formula key → the buckets it was filed under, for cheap removal. */\n readonly #placements = new Map<string, string[]>();\n\n /** Registers (or re-registers) a formula's precedent rectangles. */\n add(formulaKey: string, refs: readonly PrecedentRef[]): void {\n this.remove(formulaKey);\n if (refs.length === 0) return;\n\n const buckets: string[] = [];\n for (const ref of refs) {\n const rowSpan = ref.endRow - ref.startRow + 1;\n const colSpan = ref.endCol - ref.startCol + 1;\n const rowTile0 = tileOfRow(ref.startRow), rowTile1 = tileOfRow(ref.endRow);\n const colTile0 = tileOfCol(ref.startCol), colTile1 = tileOfCol(ref.endCol);\n const rowTiles = rowTile1 - rowTile0 + 1;\n const colTiles = colTile1 - colTile0 + 1;\n\n // Narrow in columns — the usual shape. File under each exact column,\n // crossed with the row tiles when that stays cheap.\n if (colSpan <= MAX_EXACT_SPAN && colSpan <= rowSpan) {\n if (colSpan * rowTiles <= MAX_BUCKETS_PER_REF && rowTiles <= MAX_TILES_PER_REF) {\n for (let col = ref.startCol; col <= ref.endCol; col++) {\n for (let tr = rowTile0; tr <= rowTile1; tr++) {\n this.#file(`c ${ref.sheet} ${col} ${tr}`, formulaKey, buckets);\n }\n }\n } else {\n for (let col = ref.startCol; col <= ref.endCol; col++) {\n this.#file(`C ${ref.sheet} ${col}`, formulaKey, buckets);\n }\n }\n continue;\n }\n\n // Narrow in rows — the transpose of the above.\n if (rowSpan <= MAX_EXACT_SPAN) {\n if (rowSpan * colTiles <= MAX_BUCKETS_PER_REF && colTiles <= MAX_TILES_PER_REF) {\n for (let row = ref.startRow; row <= ref.endRow; row++) {\n for (let tc = colTile0; tc <= colTile1; tc++) {\n this.#file(`r ${ref.sheet} ${row} ${tc}`, formulaKey, buckets);\n }\n }\n } else {\n for (let row = ref.startRow; row <= ref.endRow; row++) {\n this.#file(`R ${ref.sheet} ${row}`, formulaKey, buckets);\n }\n }\n continue;\n }\n\n // Compact in both dimensions: tile both.\n if (rowTiles * colTiles <= MAX_TILES_PER_REF) {\n for (let tr = rowTile0; tr <= rowTile1; tr++) {\n for (let tc = colTile0; tc <= colTile1; tc++) {\n this.#file(`t ${ref.sheet} ${tr} ${tc}`, formulaKey, buckets);\n }\n }\n continue;\n }\n\n // Broad both ways — nothing selective left to index on.\n this.#file(`w ${ref.sheet}`, formulaKey, buckets);\n }\n this.#placements.set(formulaKey, buckets);\n }\n\n /** Forgets a formula. */\n remove(formulaKey: string): void {\n const buckets = this.#placements.get(formulaKey);\n if (!buckets) return;\n for (const bucket of buckets) {\n const set = this.#buckets.get(bucket);\n if (!set) continue;\n set.delete(formulaKey);\n if (set.size === 0) this.#buckets.delete(bucket);\n }\n this.#placements.delete(formulaKey);\n }\n\n /** Drops every registration. */\n clear(): void {\n this.#buckets.clear();\n this.#placements.clear();\n }\n\n /**\n * Calls `visit` with the key of each formula that *may* read the given cell.\n * Callers still confirm with {@link refContains}: buckets are coarser than\n * rectangles in the broad dimension, so this over-approximates.\n *\n * A fixed six lookups, whatever the workbook contains.\n */\n candidates(sheet: string, row: number, col: number, visit: (formulaKey: string) => void): void {\n const tr = tileOfRow(row);\n const tc = tileOfCol(col);\n this.#visit(`c ${sheet} ${col} ${tr}`, visit);\n this.#visit(`C ${sheet} ${col}`, visit);\n this.#visit(`r ${sheet} ${row} ${tc}`, visit);\n this.#visit(`R ${sheet} ${row}`, visit);\n this.#visit(`t ${sheet} ${tr} ${tc}`, visit);\n this.#visit(`w ${sheet}`, visit);\n }\n\n #visit(bucket: string, visit: (formulaKey: string) => void): void {\n const set = this.#buckets.get(bucket);\n if (set) for (const key of set) visit(key);\n }\n\n #file(bucket: string, formulaKey: string, buckets: string[]): void {\n let set = this.#buckets.get(bucket);\n if (!set) { set = new Set(); this.#buckets.set(bucket, set); }\n if (set.has(formulaKey)) return; // several refs can share one bucket\n set.add(formulaKey);\n buckets.push(bucket);\n }\n}\n\nexport { refContains };\n","/**\n * Workbook-level recalculation engine: dependency graph + topological recalc.\n *\n * The formula evaluator (evaluateFormula) is a pure function — it computes one\n * formula and reads precedent values from the model, but it does not track which\n * cells depend on which, nor write results back. This engine is the missing\n * stateful layer:\n *\n * 1. Register formulas with setCellFormula(); their precedents are extracted\n * from the AST (see recalc-references.ts).\n * 2. When an input cell changes, only the dependent formulas are recomputed,\n * in dependency (topological) order, and written back to the model.\n * 3. Volatile formulas (NOW/RAND/OFFSET/INDIRECT/…) are always recomputed,\n * since their true precedents cannot be known statically.\n * 4. Circular references are detected at the graph level and marked #REF!.\n *\n * The engine talks to storage through the small RecalcModel interface, so it is\n * independent of the core Workbook class (though it adapts to one trivially).\n */\nimport {\n parseCellRef,\n cellRefFromRowCol,\n shiftIndex,\n shiftSpan,\n shiftFormulaRefs,\n EXCEL_MAX_ROWS,\n EXCEL_MAX_COLUMNS,\n type RefShift,\n} from '@devmm/puredocs-excel';\nimport { FormulaValue, FormulaError } from './formula-value.js';\nimport { FunctionRegistry } from './function-registry.js';\nimport { evaluateAst, parseFormulaUncached } from './formula-evaluator.js';\nimport type { FormulaNode } from './formula-node.js';\nimport type { WorksheetLike, WorkbookLike } from './formula-context.js';\nimport { extractReferences, refContains, type PrecedentRef } from './recalc-references.js';\nimport { DependencyIndex } from './dependency-index.js';\nimport { RangeCache } from './range-cache.js';\n\n// ── Core Workbook adapter ──────────────────────────────────────────────────────\n\ninterface CoreCellLike {\n setComputedValue(value: unknown): unknown;\n setFormula(formula: string): unknown;\n setArrayRef(spillRef: string | null): unknown;\n clear(): void;\n}\ninterface CoreSheetLike {\n getCellValue(ref: string): unknown;\n getCellValueAt?(row: number, column: number): unknown;\n readonly usedBounds?: { rowCount: number; columnCount: number };\n getCell(ref: string): CoreCellLike;\n getCellFormula?(ref: string): string | null;\n getSpillRange?(ref: string): string | null;\n isRowHidden?(row: number): boolean;\n}\ninterface CoreWorkbookLike {\n getWorksheet(name: string): CoreSheetLike;\n getDefinedName(name: string, sheet?: string): string | undefined;\n}\n\n/**\n * Adapts a @devmm/puredocs-excel Workbook to a RecalcModel so the engine can\n * read cell values and write computed results back into the document (via\n * Cell.setComputedValue, which preserves the formula). Named ranges defined on\n * the workbook are resolved automatically.\n */\nexport function createWorkbookRecalcModel(workbook: CoreWorkbookLike): RecalcModel {\n return {\n getCellValue: (sheet, ref) => workbook.getWorksheet(sheet).getCellValue(ref),\n // Falls back to the reference-string read rather than reporting \"no value\":\n // an older core without getCellValueAt must still return the real value,\n // because a silent undefined here reads as a blank cell.\n getCellValueAt: (sheet, row, column) => {\n const ws = workbook.getWorksheet(sheet);\n return ws.getCellValueAt\n ? ws.getCellValueAt(row, column)\n : ws.getCellValue(cellRefFromRowCol(row, column));\n },\n getUsedBounds: sheet => workbook.getWorksheet(sheet).usedBounds,\n setCellValue: (sheet, ref, value) => { workbook.getWorksheet(sheet).getCell(ref).setComputedValue(value); },\n setCellFormula: (sheet, ref, formula) => { workbook.getWorksheet(sheet).getCell(ref).setFormula(formula); },\n clearCell: (sheet, ref) => { workbook.getWorksheet(sheet).getCell(ref).clear(); },\n setCellArrayRef: (sheet, ref, spillRef) => { workbook.getWorksheet(sheet).getCell(ref).setArrayRef(spillRef); },\n getCellFormula: (sheet, ref) => workbook.getWorksheet(sheet).getCellFormula?.(ref) ?? null,\n getSpillRange: (sheet, ref) => workbook.getWorksheet(sheet).getSpillRange?.(ref) ?? null,\n isRowHidden: (sheet, row) => workbook.getWorksheet(sheet).isRowHidden?.(row) ?? false,\n getDefinedName: (name, sheet) => workbook.getDefinedName(name, sheet),\n };\n}\n\n/** Minimal storage abstraction the engine reads inputs from and writes results to. */\nexport interface RecalcModel {\n /** Current value of a cell (raw input value, or last computed value). */\n getCellValue(sheet: string, ref: string): unknown;\n /**\n * Optional: value of a cell by 1-based row/column. Range reads prefer this —\n * it saves building and re-parsing a reference string per cell, which at\n * range scale is tens of millions of strings per recalculation. Must return\n * the same value `getCellValue` would for that coordinate.\n */\n getCellValueAt?(sheet: string, row: number, column: number): unknown;\n /**\n * Optional: the sheet's populated extent, used to bound whole-column (`A:A`)\n * and whole-row (`1:1`) references. Without it those references are `#REF!`,\n * since guessing a bound would silently change what SUM(A:A) adds up.\n */\n getUsedBounds?(sheet: string): { rowCount: number; columnCount: number } | undefined;\n /** Store a computed formula result. Must NOT clear the cell's formula. */\n setCellValue(sheet: string, ref: string, value: unknown): void;\n /**\n * Optional: persist a formula string on a cell so it serialises with the\n * document. When present, the engine calls it from setCellFormula so the\n * model stays the source of truth for the formula text.\n */\n setCellFormula?(sheet: string, ref: string, formula: string): void;\n /** Optional: clear a cell (value + formula) — used by clearCellFormula. */\n clearCell?(sheet: string, ref: string): void;\n /** Optional: mark/unmark a cell as a dynamic-array anchor with its spill range. */\n setCellArrayRef?(sheet: string, ref: string, spillRef: string | null): void;\n /** Optional: formula text of a cell (lets SUBTOTAL skip nested calls). */\n getCellFormula?(sheet: string, ref: string): string | null;\n /** Optional: spill range of a dynamic-array anchor (enables A1#). */\n getSpillRange?(sheet: string, ref: string): string | null;\n /** Optional: whether a 1-based row is hidden (SUBTOTAL/AGGREGATE). */\n isRowHidden?(sheet: string, row: number): boolean;\n /** Optional defined-name resolver (enables named ranges in formulas). */\n getDefinedName?(name: string, sheet?: string): string | undefined;\n}\n\n/** One recomputed cell, in evaluation order. */\nexport interface RecalcResult {\n readonly sheet: string;\n readonly ref: string;\n /** The written JS value (null/number/string/boolean). For a dynamic array,\n * this is the anchor's top-left value. */\n readonly value: unknown;\n /** True when the cell is part of a circular reference. */\n readonly circular?: boolean;\n /** For a dynamic-array anchor: the spilled block size (rows × cols). */\n readonly spill?: { rows: number; cols: number };\n}\n\ninterface FormulaEntry {\n sheet: string; // upper-cased key (for graph/containment)\n sheetName: string; // original casing (for model I/O)\n ref: string; // normalised (no '$', upper-cased)\n /** Precomputed `SHEET!REF` map key — rebuilding it is pure string churn. */\n key: string;\n row: number;\n col: number;\n formula: string; // without leading '='\n /**\n * Parsed form of `formula`, kept for the lifetime of the registration so\n * repeated evaluation never re-parses and never depends on the global AST\n * cache still holding this text. Cleared when the text is rewritten.\n */\n ast?: FormulaNode;\n refs: PrecedentRef[];\n volatile: boolean;\n}\n\n/** A cell coordinate with its upper-cased sheet key. */\ninterface CellRC { sheet: string; row: number; col: number }\n\nconst normSheet = (s: string): string => s.toUpperCase();\nconst normRef = (r: string): string => r.replace(/\\$/g, '').toUpperCase();\nconst keyOf = (sheet: string, ref: string): string => `${normSheet(sheet)}!${normRef(ref)}`;\n\n/** Splits a \"SHEET!REF\" key back into its parts (sheet upper-cased). */\nfunction parseKey(key: string): { sheet: string; ref: string; row: number; col: number } {\n const bang = key.indexOf('!');\n const sheet = key.slice(0, bang);\n const ref = key.slice(bang + 1);\n const { row, column } = parseCellRef(ref);\n return { sheet, ref, row, col: column };\n}\n\nexport class RecalcEngine {\n readonly #model: RecalcModel;\n readonly #registry: FunctionRegistry;\n #formulas = new Map<string, FormulaEntry>();\n /** upper-cased sheet key → original casing, for case-correct model I/O. */\n readonly #sheetNames = new Map<string, string>();\n /** anchor cellKey → set of spilled (non-anchor) cellKeys it currently owns. */\n #spills = new Map<string, Set<string>>();\n /** spilled cellKey → the anchor cellKey that owns it. */\n readonly #spillOwner = new Map<string, string>();\n /**\n * Reverse dependency index, so finding the formulas that read a cell does not\n * mean testing every registered formula.\n */\n readonly #dependents = new DependencyIndex();\n /**\n * Keys of the volatile formulas. Maintained incrementally: scanning every\n * formula for volatility on each edit is O(F) per keystroke on its own.\n */\n readonly #volatiles = new Set<string>();\n /** Memoised per-sheet adapters — these are stateless w.r.t. the formula. */\n readonly #sheetLikes = new Map<string, WorksheetLike>();\n #workbookLike?: WorkbookLike;\n /**\n * Memo for range reads. The engine owns it because it owns the writes: every\n * value written goes through {@link #writeCell}, which drops the cached\n * rectangles containing that cell. Nothing else may write to the model behind\n * the engine's back without calling {@link onCellChanged} — that was already\n * true for dependency tracking, and now also keeps this memo honest.\n */\n readonly #rangeCache = new RangeCache();\n\n constructor(model: RecalcModel, registry: FunctionRegistry = FunctionRegistry.default) {\n this.#model = model;\n this.#registry = registry;\n }\n\n /**\n * The single write path into the model. Writing a value invalidates the\n * cached rectangles that contain the cell, so a formula evaluated later in the\n * same pass cannot read a pre-write copy of a range. Coordinates are passed in\n * where the caller already knows them, to avoid re-parsing the reference.\n */\n #writeCell(sheetName: string, ref: string, value: unknown, row?: number, col?: number): void {\n this.#model.setCellValue(sheetName, ref, value);\n if (row === undefined || col === undefined) {\n const parsed = parseCellRef(ref);\n row = parsed.row;\n col = parsed.column;\n }\n this.#rangeCache.invalidateCell(normSheet(sheetName), row, col);\n }\n\n /** Registers an entry in the map, the reverse index and the volatile set. */\n #register(entry: FormulaEntry): void {\n this.#formulas.set(entry.key, entry);\n this.#dependents.add(entry.key, entry.refs);\n if (entry.volatile) this.#volatiles.add(entry.key);\n else this.#volatiles.delete(entry.key);\n }\n\n #unregister(key: string): void {\n this.#formulas.delete(key);\n this.#dependents.remove(key);\n this.#volatiles.delete(key);\n }\n\n #rememberSheet(name: string): void {\n this.#sheetNames.set(normSheet(name), name);\n }\n\n // ── Registration ─────────────────────────────────────────────────────────────\n\n /**\n * Registers (or replaces) a formula for a cell and recalculates that cell and\n * everything downstream of it. Returns the recomputed cells in the order they\n * were evaluated. The leading '=' of the formula is optional.\n */\n setCellFormula(sheet: string, ref: string, formula: string): RecalcResult[] {\n if (!formula) throw new Error('Formula cannot be empty.');\n const text = formula.startsWith('=') ? formula.slice(1) : formula;\n const s = normSheet(sheet);\n const r = normRef(ref);\n const { row, column } = parseCellRef(r);\n\n const ast = parseFormulaUncached(text);\n const { refs, volatile } = extractReferences(\n ast,\n s,\n this.#registry,\n this.#model.getDefinedName ? (n, sh) => this.#model.getDefinedName!(n, sh) : undefined,\n );\n\n this.#rememberSheet(sheet);\n const key = keyOf(s, r);\n this.#register({\n sheet: s, sheetName: sheet, ref: r, key, row, col: column, formula: text, ast, refs, volatile,\n });\n\n // Persist the formula text on the model (source of truth for serialisation)\n // before evaluating; the computed value is written back during recalc.\n // Setting a formula also clears the cell's cached value, so any range that\n // covered it must be re-read.\n this.#model.setCellFormula?.(sheet, r, text);\n this.#rangeCache.invalidateCell(s, row, column);\n\n // Recompute this cell and its dependents.\n return this.#recalcFrom([{ sheet: s, row, col: column }], key);\n }\n\n /**\n * Indexes many formulas **without evaluating anything**.\n *\n * This is the path for loading a workbook. `setCellFormula` is built for an\n * edit: it recalculates the new cell and everything downstream of it, which is\n * right for one keystroke and quadratic for a file — registering N formulas one\n * by one evaluates the whole workbook N times. Here the formulas are only\n * parsed and filed into the dependency index; call {@link recalcAll} once\n * afterwards, or nothing at all if the cached values from the file will do.\n *\n * The model is deliberately **not** written to. These formulas are assumed to\n * be the ones the model already holds (they came from the file), and persisting\n * them again would clear each cell's cached value — leaving every formula cell\n * blank until a full recalculation had run. Use `setCellFormula` for formulas\n * the user is actually introducing.\n *\n * A formula that fails to parse is reported rather than thrown: one unsupported\n * construct in a large workbook should not abort the load.\n */\n registerBulk(\n entries: Iterable<{ sheet: string; ref: string; formula: string }>,\n ): { registered: number; failed: Array<{ sheet: string; ref: string; error: string }> } {\n const resolveName = this.#model.getDefinedName\n ? (n: string, sh?: string) => this.#model.getDefinedName!(n, sh)\n : undefined;\n\n let registered = 0;\n const failed: Array<{ sheet: string; ref: string; error: string }> = [];\n\n for (const entry of entries) {\n const { sheet, ref, formula } = entry;\n if (!formula) continue;\n const text = formula.startsWith('=') ? formula.slice(1) : formula;\n const s = normSheet(sheet);\n const r = normRef(ref);\n\n try {\n const { row, column } = parseCellRef(r);\n const ast = parseFormulaUncached(text);\n const { refs, volatile } = extractReferences(ast, s, this.#registry, resolveName);\n this.#rememberSheet(sheet);\n this.#register({\n sheet: s, sheetName: sheet, ref: r, key: keyOf(s, r),\n row, col: column, formula: text, ast, refs, volatile,\n });\n registered++;\n } catch (err) {\n failed.push({ sheet, ref, error: err instanceof Error ? err.message : String(err) });\n }\n }\n\n // Registrations change which cells are read, not what they hold; but a\n // formula cell's own value is now owned by the engine, so drop the memo\n // rather than reason about which rectangles are affected.\n if (registered > 0) this.#rangeCache.clear();\n\n return { registered, failed };\n }\n\n /**\n * Removes a formula from a cell and recalculates its dependents (which may now\n * read a plain input value instead). Returns the recomputed dependent cells.\n */\n clearCellFormula(sheet: string, ref: string): RecalcResult[] {\n const s = normSheet(sheet);\n const r = normRef(ref);\n const key = keyOf(s, r);\n if (!this.#formulas.has(key)) return [];\n this.#unregister(key);\n this.#model.clearCell?.(sheet, r);\n const { row, column } = parseCellRef(r);\n this.#rangeCache.invalidateCell(s, row, column);\n return this.#recalcFrom([{ sheet: s, row, col: column }]);\n }\n\n /**\n * Writes a raw input value to a cell and recalculates every formula that\n * depends on it. Use this for non-formula edits so dependents stay current.\n */\n setCellValue(sheet: string, ref: string, value: unknown): RecalcResult[] {\n this.#rememberSheet(sheet);\n const s = normSheet(sheet);\n const r = normRef(ref);\n const { row, column } = parseCellRef(r);\n this.#writeCell(sheet, r, value, row, column);\n return this.#recalcFrom([{ sheet: s, row, col: column }]);\n }\n\n /**\n * Signals that a cell changed by some external means (the model was already\n * updated) and recalculates its dependents.\n */\n onCellChanged(sheet: string, ref: string): RecalcResult[] {\n this.#rememberSheet(sheet);\n const s = normSheet(sheet);\n const r = normRef(ref);\n const { row, column } = parseCellRef(r);\n // The write happened outside the engine, so the memo has to be told.\n this.#rangeCache.invalidateCell(s, row, column);\n return this.#recalcFrom([{ sheet: s, row, col: column }]);\n }\n\n /**\n * Recalculates every registered formula.\n *\n * By default the order is derived here, with a topological sort over the\n * dependency index. `order` — typically `workbook.calcChain` — supplies one\n * instead, so the sort is not needed.\n *\n * **A supplied order is verified, not trusted.** Evaluating in a stale order\n * makes a formula read a precedent that has not been computed yet, and the\n * result is a plausible wrong number with nothing to distinguish it from a\n * right one. In a calculation engine that is the worst failure available, so\n * this checks as it goes: after each formula is written, the dependency index\n * says who reads it, and any reader that was already evaluated is an inversion.\n * On the first inversion the ordered attempt is abandoned and the whole\n * recalculation is redone through the sorted path, whose result is returned;\n * `onOrderConflict`, if given, is told which pair conflicted.\n *\n * The verification costs about what the sort it replaces costs, so `order` is\n * worth roughly nothing now (measured at ~9% of a full recalculation on a\n * 2 000-formula workbook, after the dependency index stopped being the\n * bottleneck). It is kept because reading an order Excel already computed is a\n * reasonable thing to want; prefer plain `recalcAll()` unless you have measured\n * a reason not to.\n *\n * Registered formulas the order does not mention are evaluated afterwards\n * through the sorted path, and a dynamic array that spills still triggers the\n * usual fixpoint, so neither silently misses cells.\n */\n recalcAll(options?: {\n order?: ReadonlyArray<{ sheet: string; ref: string }>;\n /** Called when the supplied order turned out to be invalid and was discarded. */\n onOrderConflict?: (conflict: { dependent: string; precedent: string }) => void;\n }): RecalcResult[] {\n const order = options?.order;\n if (!order || order.length === 0) {\n return this.#evaluatePass([...this.#formulas.values()]).results;\n }\n\n const attempt = this.#recalcInOrder(order);\n if (attempt.conflict) {\n options?.onOrderConflict?.(attempt.conflict);\n // Every registered formula is re-evaluated, so anything the abandoned\n // attempt wrote is overwritten with a value computed in a valid order.\n return this.#evaluatePass([...this.#formulas.values()]).results;\n }\n return attempt.results;\n }\n\n /**\n * One pass in a caller-supplied order, watching for inversions.\n *\n * The check is the mirror image of the topological sort: instead of asking\n * \"which of my precedents come first?\", it asks, of each formula just\n * evaluated, \"has anything that reads me already run?\". The dependency index\n * answers that directly, and one positive answer is enough to know the order\n * cannot be trusted.\n */\n #recalcInOrder(order: ReadonlyArray<{ sheet: string; ref: string }>): {\n results: RecalcResult[];\n conflict?: { dependent: string; precedent: string };\n } {\n const results: RecalcResult[] = [];\n const changed: CellRC[] = [];\n const done = new Set<string>();\n let spilled = false;\n\n for (const { sheet, ref } of order) {\n const key = keyOf(sheet, ref);\n if (done.has(key)) continue;\n const entry = this.#formulas.get(key);\n if (!entry) continue; // the order mentions a cell we hold no formula for\n done.add(key);\n\n const written = this.#writeResult(entry);\n results.push(written.result);\n changed.push(...written.changed);\n if (written.result.spill) spilled = true;\n\n // Anything that reads this cell must not have been evaluated yet.\n let conflict: { dependent: string; precedent: string } | undefined;\n this.#forEachDirectDependent({ sheet: entry.sheet, row: entry.row, col: entry.col }, dep => {\n if (conflict || dep.key === entry.key) return;\n if (done.has(dep.key)) conflict = { dependent: dep.key, precedent: entry.key };\n });\n if (conflict) return { results: [], conflict };\n }\n\n const rest = [...this.#formulas.values()].filter(e => !done.has(e.key));\n if (rest.length > 0) {\n const pass = this.#evaluatePass(rest);\n results.push(...pass.results);\n changed.push(...pass.changed);\n }\n\n // A spill writes cells the graph could not know about in advance; those may\n // have dependents of their own.\n if (spilled) {\n const evaluated = new Set(done);\n results.push(...this.#runFixpoint(this.#dependentClosure(changed, evaluated), evaluated));\n }\n\n return { results };\n }\n\n /** The precedents recorded for a formula cell (mainly for tests/inspection). */\n getPrecedents(sheet: string, ref: string): readonly PrecedentRef[] {\n return this.#formulas.get(keyOf(sheet, ref))?.refs ?? [];\n }\n\n // ── Structural edits ─────────────────────────────────────────────────────────\n\n /**\n * Tells the engine rows were inserted on a sheet. Call AFTER the\n * corresponding `Worksheet.insertRows` (the model must already reflect the\n * edit). The dependency graph is translated in place — registrations,\n * formula text and spill bookkeeping all move — and only volatile formulas\n * are recomputed, because a pure translation changes no values.\n *\n * @example\n * ws.insertRows(3, 2);\n * engine.onRowsInserted('S1', 3, 2);\n */\n onRowsInserted(sheet: string, at: number, count = 1): RecalcResult[] {\n return this.#applyShift({ dim: 'row', kind: 'insert', at, count, sheetName: sheet });\n }\n\n /**\n * Tells the engine rows were deleted on a sheet. Call AFTER the\n * corresponding `Worksheet.deleteRows`. Registrations inside the deleted\n * band are dropped; the rest of the graph is translated, and only formulas\n * whose precedents touched the deleted band (plus their dependents and\n * volatiles) are recomputed.\n */\n onRowsDeleted(sheet: string, at: number, count = 1): RecalcResult[] {\n return this.#applyShift({ dim: 'row', kind: 'delete', at, count, sheetName: sheet });\n }\n\n /** Column counterpart to {@link onRowsInserted}. */\n onColumnsInserted(sheet: string, at: number, count = 1): RecalcResult[] {\n return this.#applyShift({ dim: 'col', kind: 'insert', at, count, sheetName: sheet });\n }\n\n /** Column counterpart to {@link onRowsDeleted}. */\n onColumnsDeleted(sheet: string, at: number, count = 1): RecalcResult[] {\n return this.#applyShift({ dim: 'col', kind: 'delete', at, count, sheetName: sheet });\n }\n\n #applyShift(shift: RefShift): RecalcResult[] {\n const editedSheet = normSheet(shift.sheetName);\n const isRowShift = shift.dim === 'row';\n const bandEnd = shift.at + shift.count - 1;\n\n const rekeyed: FormulaEntry[] = [];\n const needsRecalc = new Set<string>();\n\n for (const e of this.#formulas.values()) {\n // Translate the registration's own position on the edited sheet.\n let row = e.row;\n let col = e.col;\n if (e.sheet === editedSheet) {\n const shifted = shiftIndex(isRowShift ? row : col, shift);\n if (shifted === null) continue; // the formula cell itself was deleted\n if (isRowShift) row = shifted; else col = shifted;\n }\n\n // Did a pre-shift precedent rectangle touch the deleted band? Those\n // formulas lost a precedent value and must be recomputed; a pure\n // translation must not be.\n const touchedBand = shift.kind === 'delete' && e.refs.some(r =>\n r.sheet === editedSheet && (isRowShift\n ? r.endRow >= shift.at && r.startRow <= bandEnd\n : r.endCol >= shift.at && r.startCol <= bandEnd));\n\n const rewritten = shiftFormulaRefs(e.formula, shift, e.sheetName);\n const moved = row !== e.row || col !== e.col;\n const ref = moved ? cellRefFromRowCol(row, col) : e.ref;\n const key = moved ? keyOf(e.sheet, ref) : e.key;\n\n rekeyed.push({\n ...e,\n ref,\n key,\n row,\n col,\n formula: rewritten.changed ? rewritten.text : e.formula,\n // A rewritten formula's cached AST no longer matches its text; it is\n // re-parsed lazily, and only if the cell is actually evaluated again.\n ast: rewritten.changed ? undefined : e.ast,\n refs: this.#shiftPrecedents(e.refs, shift, editedSheet),\n // Volatility is a property of which *functions* a formula calls, and\n // rewriting references cannot change that.\n });\n if (touchedBand || rewritten.hasRefError) needsRecalc.add(key);\n }\n\n // Rebuild the map and the reverse index from the translated entries.\n this.#formulas = new Map();\n this.#dependents.clear();\n this.#volatiles.clear();\n for (const e of rekeyed) this.#register(e);\n\n this.#shiftSpillBookkeeping(shift, editedSheet);\n\n // Every rectangle on the edited sheet moved (and cross-sheet rectangles\n // pointing into it were rewritten), so no cached rectangle can be trusted.\n this.#rangeCache.clear();\n\n // Seed the fixpoint: affected formulas (delete only) plus volatiles.\n const pending = new Map<string, FormulaEntry>();\n for (const k of needsRecalc) {\n const e = this.#formulas.get(k);\n if (e) pending.set(k, e);\n }\n for (const e of this.#formulas.values()) {\n if (e.volatile) pending.set(e.key, e);\n }\n return this.#runFixpoint(pending, new Set());\n }\n\n /**\n * Translates precedent rectangles across a structural edit.\n *\n * This is arithmetic rather than a re-parse of the rewritten formula, and the\n * two are equivalent by construction: `shiftFormulaRefs` derives the new\n * reference text by calling `shiftSpan`/`shiftIndex` on exactly these numbers,\n * so applying the same functions to the stored rectangle yields the same\n * region. A rectangle that is entirely deleted disappears, matching the\n * `#REF!` the text rewrite produces.\n */\n #shiftPrecedents(\n refs: readonly PrecedentRef[],\n shift: RefShift,\n editedSheet: string,\n ): PrecedentRef[] {\n const out: PrecedentRef[] = [];\n for (const r of refs) {\n if (r.sheet !== editedSheet) { out.push(r); continue; }\n\n if (shift.dim === 'row') {\n const span = shiftSpan(r.startRow, r.endRow, shift);\n if (!span) continue; // region deleted → the formula now reads #REF!\n out.push({\n sheet: r.sheet,\n startRow: span.start,\n endRow: Math.min(span.end, EXCEL_MAX_ROWS),\n startCol: r.startCol,\n endCol: r.endCol,\n });\n } else {\n const span = shiftSpan(r.startCol, r.endCol, shift);\n if (!span) continue;\n out.push({\n sheet: r.sheet,\n startRow: r.startRow,\n endRow: r.endRow,\n startCol: span.start,\n endCol: Math.min(span.end, EXCEL_MAX_COLUMNS),\n });\n }\n }\n return out;\n }\n\n /** Translates spill ownership across a structural edit on `editedSheet`. */\n #shiftSpillBookkeeping(shift: RefShift, editedSheet: string): void {\n const shiftCellKey = (key: string): string | null => {\n const { sheet, row, col } = parseKey(key);\n if (sheet !== editedSheet) return key;\n const r = shift.dim === 'row' ? shiftIndex(row, shift) : row;\n const c = shift.dim === 'col' ? shiftIndex(col, shift) : col;\n if (r === null || c === null) return null;\n return keyOf(sheet, cellRefFromRowCol(r, c));\n };\n\n const newSpills = new Map<string, Set<string>>();\n this.#spillOwner.clear();\n\n for (const [anchor, members] of this.#spills) {\n const newAnchor = shiftCellKey(anchor);\n if (newAnchor === null) {\n // The anchor was deleted — clear its surviving spilled values.\n for (const m of members) {\n const shifted = shiftCellKey(m);\n if (!shifted) continue;\n const cell = parseKey(shifted);\n this.#writeCell(this.#sheetNames.get(cell.sheet) ?? cell.sheet, cell.ref, null, cell.row, cell.col);\n }\n continue;\n }\n const newMembers = new Set<string>();\n for (const m of members) {\n const shifted = shiftCellKey(m);\n if (!shifted) continue;\n newMembers.add(shifted);\n this.#spillOwner.set(shifted, newAnchor);\n }\n newSpills.set(newAnchor, newMembers);\n }\n\n this.#spills = newSpills;\n }\n\n // ── Internals ────────────────────────────────────────────────────────────────\n\n /**\n * Recomputes formulas affected by the given changed cells, to a fixpoint.\n *\n * A single topological pass is not enough once dynamic arrays exist: a\n * formula that spills changes cells the graph could not know about until the\n * array was computed, and those cells may have their own dependents. So we\n * evaluate a pass, collect every cell whose value actually changed (formula\n * outputs plus spilled/cleared cells), then recompute the dependents of those\n * cells, repeating until nothing new is affected (bounded for safety).\n */\n #recalcFrom(\n seeds: CellRC[],\n includeKey?: string,\n ): RecalcResult[] {\n const results: RecalcResult[] = [];\n const evaluated = new Set<string>();\n\n // First wave: dependents of the seed cells, plus volatiles, plus a\n // freshly-set formula cell.\n let pending = this.#dependentClosure(seeds, evaluated);\n this.#addVolatiles(pending);\n if (includeKey) {\n const self = this.#formulas.get(includeKey);\n if (self) pending.set(includeKey, self);\n }\n\n results.push(...this.#runFixpoint(pending, evaluated));\n return results;\n }\n\n /** Evaluates `pending` entries to a fixpoint, following spill-induced changes. */\n #runFixpoint(pending: Map<string, FormulaEntry>, evaluated: Set<string>): RecalcResult[] {\n const results: RecalcResult[] = [];\n let guard = 0;\n const maxIterations = this.#formulas.size + 8;\n while (pending.size > 0 && guard++ <= maxIterations) {\n const { results: passResults, changed } = this.#evaluatePass([...pending.values()]);\n results.push(...passResults);\n for (const k of pending.keys()) evaluated.add(k);\n pending = this.#dependentClosure(changed, evaluated);\n }\n return results;\n }\n\n /** Adds every volatile formula to a pending set. */\n #addVolatiles(pending: Map<string, FormulaEntry>): void {\n for (const key of this.#volatiles) {\n const e = this.#formulas.get(key);\n if (e) pending.set(key, e);\n }\n }\n\n /**\n * Formula entries (not yet evaluated) whose precedents include one of the\n * cells, transitively. The queue is walked with a head index — Array.shift()\n * is O(n) per dequeue, which turns a long dependency chain quadratic.\n */\n #dependentClosure(cells: CellRC[], evaluated: Set<string>): Map<string, FormulaEntry> {\n const out = new Map<string, FormulaEntry>();\n const queue: CellRC[] = [...cells];\n for (let head = 0; head < queue.length; head++) {\n const cell = queue[head]!;\n this.#forEachDirectDependent(cell, dep => {\n if (out.has(dep.key) || evaluated.has(dep.key)) return;\n out.set(dep.key, dep);\n queue.push({ sheet: dep.sheet, row: dep.row, col: dep.col });\n });\n }\n return out;\n }\n\n /**\n * Visits the formula entries whose precedents include the given cell, via the\n * reverse index. The index over-approximates (it buckets rectangles into\n * tiles), so each candidate is still confirmed against its real rectangles.\n */\n #forEachDirectDependent(cell: CellRC, visit: (entry: FormulaEntry) => void): void {\n this.#dependents.candidates(cell.sheet, cell.row, cell.col, key => {\n const e = this.#formulas.get(key);\n if (!e) return;\n for (const ref of e.refs) {\n if (refContains(ref, cell.sheet, cell.row, cell.col)) { visit(e); return; }\n }\n });\n }\n\n /**\n * Topologically sorts the given entries and evaluates them, writing results\n * (scalars or spilled arrays) back to the model. Returns the results and the\n * flat list of cells whose value changed. Entries left in a cycle are #REF!.\n */\n #evaluatePass(entries: FormulaEntry[]): { results: RecalcResult[]; changed: CellRC[] } {\n const inSet = new Map<string, FormulaEntry>();\n for (const e of entries) inSet.set(e.key, e);\n\n // Build edges precedent → dependent, restricted to entries in this pass.\n // Driven from the reverse index: asking \"who reads this cell\" for each pass\n // member is O(candidates), where testing every pair would be O(n²).\n const indegree = new Map<string, number>();\n const dependents = new Map<string, string[]>();\n for (const k of inSet.keys()) { indegree.set(k, 0); dependents.set(k, []); }\n\n for (const pe of entries) {\n const seen = new Set<string>();\n this.#forEachDirectDependent({ sheet: pe.sheet, row: pe.row, col: pe.col }, dep => {\n if (dep.key === pe.key || !inSet.has(dep.key) || seen.has(dep.key)) return;\n seen.add(dep.key);\n dependents.get(pe.key)!.push(dep.key);\n indegree.set(dep.key, indegree.get(dep.key)! + 1);\n });\n }\n\n // Kahn topological sort. The ready list is drained with a head index, since\n // Array.shift() would be O(n) per step.\n const ready: string[] = [];\n for (const [k, d] of indegree) if (d === 0) ready.push(k);\n const order: string[] = [];\n for (let head = 0; head < ready.length; head++) {\n const k = ready[head]!;\n order.push(k);\n for (const d of dependents.get(k)!) {\n const left = indegree.get(d)! - 1;\n indegree.set(d, left);\n if (left === 0) ready.push(d);\n }\n }\n\n const results: RecalcResult[] = [];\n const changed: CellRC[] = [];\n const emitted = new Set(order);\n\n for (const k of order) {\n const e = inSet.get(k)!;\n const { result, changed: c } = this.#writeResult(e);\n results.push(result);\n changed.push(...c);\n }\n\n // Anything not emitted is in a circular reference.\n for (const [k, e] of inSet) {\n if (emitted.has(k)) continue;\n this.#clearSpill(e.key, changed);\n const value = FormulaValue.errorRef.toObject();\n this.#writeCell(e.sheetName, e.ref, value, e.row, e.col);\n changed.push({ sheet: e.sheet, row: e.row, col: e.col });\n results.push({ sheet: e.sheetName, ref: e.ref, value, circular: true });\n }\n\n return { results, changed };\n }\n\n /**\n * Evaluates one formula and writes its result. Scalars go to the anchor cell.\n * Arrays spill across a block anchored at the formula cell: on a collision\n * with existing content the anchor becomes #SPILL! and nothing spills; when\n * an array shrinks, previously-spilled cells it no longer covers are cleared.\n */\n #writeResult(e: FormulaEntry): { result: RecalcResult; changed: CellRC[] } {\n const anchorKey = e.key;\n const fv = this.#evaluateFormulaValue(e);\n const changed: CellRC[] = [];\n const prevSpill = this.#spills.get(anchorKey) ?? new Set<string>();\n\n if (!fv.isArray) {\n this.#clearSpill(anchorKey, changed);\n this.#model.setCellArrayRef?.(e.sheetName, e.ref, null);\n const value = fv.toObject();\n this.#writeCell(e.sheetName, e.ref, value, e.row, e.col);\n changed.push({ sheet: e.sheet, row: e.row, col: e.col });\n return { result: { sheet: e.sheetName, ref: e.ref, value }, changed };\n }\n\n const arr = fv.arrayVal;\n const rows = arr.rows, cols = arr.columns;\n\n // Collision check for every non-anchor cell in the target block.\n let collides = false;\n for (let dr = 0; dr < rows && !collides; dr++) {\n for (let dc = 0; dc < cols && !collides; dc++) {\n if (dr === 0 && dc === 0) continue;\n const r = e.row + dr, c = e.col + dc;\n const cellKey = keyOf(e.sheet, cellRefFromRowCol(r, c));\n if (this.#isOccupied(cellKey, e.sheetName, cellRefFromRowCol(r, c), anchorKey, prevSpill)) {\n collides = true;\n }\n }\n }\n\n if (collides) {\n this.#clearSpill(anchorKey, changed);\n this.#model.setCellArrayRef?.(e.sheetName, e.ref, null);\n const value = FormulaValue.error(FormulaError.Spill).toObject(); // '#SPILL!'\n this.#writeCell(e.sheetName, e.ref, value, e.row, e.col);\n changed.push({ sheet: e.sheet, row: e.row, col: e.col });\n return { result: { sheet: e.sheetName, ref: e.ref, value }, changed };\n }\n\n // Write the block; track newly-owned spill cells.\n const newSpill = new Set<string>();\n for (let dr = 0; dr < rows; dr++) {\n for (let dc = 0; dc < cols; dc++) {\n const r = e.row + dr, c = e.col + dc;\n const ref = cellRefFromRowCol(r, c);\n this.#writeCell(e.sheetName, ref, arr.get(dr, dc).toObject(), r, c);\n changed.push({ sheet: e.sheet, row: r, col: c });\n if (dr !== 0 || dc !== 0) {\n const cellKey = keyOf(e.sheet, ref);\n newSpill.add(cellKey);\n this.#spillOwner.set(cellKey, anchorKey);\n }\n }\n }\n\n // Clear previously-spilled cells no longer covered.\n for (const oldKey of prevSpill) {\n if (newSpill.has(oldKey)) continue;\n const cell = parseKey(oldKey);\n this.#writeCell(this.#sheetNames.get(cell.sheet) ?? cell.sheet, cell.ref, null, cell.row, cell.col);\n this.#spillOwner.delete(oldKey);\n changed.push({ sheet: cell.sheet, row: cell.row, col: cell.col });\n }\n\n this.#spills.set(anchorKey, newSpill);\n // Mark the anchor as a dynamic-array formula spanning the written block.\n const spillRef = `${e.ref}:${cellRefFromRowCol(e.row + rows - 1, e.col + cols - 1)}`;\n this.#model.setCellArrayRef?.(e.sheetName, e.ref, spillRef);\n return {\n result: { sheet: e.sheetName, ref: e.ref, value: arr.get(0, 0).toObject(), spill: { rows, cols } },\n changed,\n };\n }\n\n /** Whether a target cell already holds content that blocks a spill. */\n #isOccupied(\n cellKey: string,\n sheetName: string,\n ref: string,\n anchorKey: string,\n prevSpill: Set<string>,\n ): boolean {\n // Another formula living in the target block blocks the spill.\n if (this.#formulas.has(cellKey) && cellKey !== anchorKey) return true;\n // Owned by a different anchor's spill → collision.\n const owner = this.#spillOwner.get(cellKey);\n if (owner && owner !== anchorKey) return true;\n // Our own previous spill cell → free to reuse.\n if (prevSpill.has(cellKey)) return false;\n // A literal value already there → collision.\n const v = this.#model.getCellValue(sheetName, ref);\n return v !== null && v !== undefined && v !== '';\n }\n\n /** Clears an anchor's spilled cells (not the anchor itself) and forgets them. */\n #clearSpill(anchorKey: string, changed: CellRC[]): void {\n const spill = this.#spills.get(anchorKey);\n if (!spill) return;\n for (const cellKey of spill) {\n const cell = parseKey(cellKey);\n this.#writeCell(this.#sheetNames.get(cell.sheet) ?? cell.sheet, cell.ref, null, cell.row, cell.col);\n this.#spillOwner.delete(cellKey);\n changed.push({ sheet: cell.sheet, row: cell.row, col: cell.col });\n }\n this.#spills.delete(anchorKey);\n }\n\n #evaluateFormulaValue(e: FormulaEntry): FormulaValue {\n if (!e.ast) {\n // Only reachable after a structural rewrite invalidated the cached AST.\n try {\n e.ast = parseFormulaUncached(e.formula);\n } catch {\n return FormulaValue.errorValue;\n }\n }\n return evaluateAst(e.ast, this.#sheetLike(e.sheetName), {\n workbook: this.#buildWorkbookLike(),\n formulaRow: e.row,\n formulaCol: e.col,\n rangeCache: this.#rangeCache,\n });\n }\n\n /**\n * Per-sheet evaluator adapter. Memoised: these hold no per-formula state, and\n * rebuilding one (with its four closures) for every formula evaluated made a\n * full recalc allocate several objects per cell.\n */\n #sheetLike(sheetName: string): WorksheetLike {\n let cached = this.#sheetLikes.get(sheetName);\n if (!cached) {\n cached = this.#buildSheetLike(sheetName);\n this.#sheetLikes.set(sheetName, cached);\n }\n return cached;\n }\n\n #buildSheetLike(sheetName: string): WorksheetLike {\n const model = this.#model;\n return {\n name: sheetName,\n getCellValue: (ref: string) => this.#model.getCellValue(sheetName, ref),\n getCellValueAt: model.getCellValueAt\n ? (row: number, column: number) => model.getCellValueAt!(sheetName, row, column)\n : undefined,\n // A getter, not a snapshot: the extent grows as formulas write results,\n // and a whole-column reference read later in the same pass must see it.\n get usedBounds() {\n return model.getUsedBounds?.(sheetName);\n },\n isRowHidden: this.#model.isRowHidden\n ? (row: number) => this.#model.isRowHidden!(sheetName, row)\n : undefined,\n getCellFormula: this.#model.getCellFormula\n ? (ref: string) => this.#model.getCellFormula!(sheetName, ref)\n : undefined,\n getSpillRange: this.#model.getSpillRange\n ? (ref: string) => this.#model.getSpillRange!(sheetName, ref)\n : undefined,\n };\n }\n\n #buildWorkbookLike(): WorkbookLike {\n if (this.#workbookLike) return this.#workbookLike;\n const self = this;\n return (this.#workbookLike = {\n get worksheets(): readonly WorksheetLike[] {\n return [...self.#sheetNames.values()].map(n => self.#sheetLike(n));\n },\n getWorksheet: (name: string) => self.#sheetLike(name),\n getDefinedName: this.#model.getDefinedName\n ? (name: string, sheet?: string) => this.#model.getDefinedName!(name, sheet)\n : undefined,\n });\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/formula-value.ts","../src/formula-token.ts","../src/formula-lexer.ts","../src/formula-node.ts","../src/formula-parser.ts","../src/criteria-index.ts","../src/functions/math-functions.ts","../src/functions/text-functions.ts","../src/functions/logical-functions.ts","../src/functions/date-functions.ts","../src/functions/lookup-functions.ts","../src/functions/statistical-functions.ts","../src/functions/info-functions.ts","../src/functions/finance-functions.ts","../src/functions/meta-functions.ts","../src/functions/aggregate-functions.ts","../src/functions/array-functions.ts","../src/function-registry.ts","../src/formula-context.ts","../src/lru-cache.ts","../src/formula-evaluator.ts","../src/range-cache.ts","../src/recalc-references.ts","../src/dependency-index.ts","../src/recalc-engine.ts"],"names":["FormulaError","num","value","rows","columns","row","offset","TokenType","upper","BinaryOperator","UnaryOperator","left","right","ln","arg","_pos","i","mid","exact","len","count","code","mode","out","best","column","sumSq","a","pv","fv","pmt","rate","nper","sum","days","cellRefFromRowCol","countA","variance","asArray","byCol","byRow","FormulaHelper","_functions","parseCellRef","resolveName","EXCEL_MAX_ROWS","EXCEL_MAX_COLUMNS","TILE_ROWS","TILE_COLS","_placements","cellKey"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Discriminated union for formula values.\n * Port of TVE.PureDocs.Excel.Formulas.FormulaValue (C# readonly struct)\n *\n * C# used a value-type struct with LayoutKind.Auto for zero-GC scalar values.\n * TypeScript/JS uses a class with static factory methods and cached singletons.\n * The tradeoff: objects vs structs — acceptable for JS runtimes.\n */\nimport { toOADate } from '@devmm/puredocs-excel';\n\nexport const enum FormulaError {\n None = 0,\n Null = 1,\n Div0 = 2,\n Value = 3,\n Ref = 4,\n Name = 5,\n Num = 6,\n NA = 7,\n Calc = 8,\n Spill = 9,\n}\n\nexport type FormulaValueKind = 'blank' | 'number' | 'text' | 'boolean' | 'error' | 'array' | 'lambda';\n\n/**\n * A callable value produced by LAMBDA. Kept as an opaque interface so\n * formula-value.ts stays decoupled from the AST/context modules.\n */\nexport interface LambdaLike {\n /** Number of declared parameters. */\n readonly arity: number;\n /** Invokes the lambda with the given argument values (runs to completion). */\n call(args: FormulaValue[]): FormulaValue;\n /**\n * Runs the lambda body ONCE in tail-aware mode. Returns either the final value\n * or a TailCall describing the next tail call, so a trampoline can iterate\n * without growing the JS stack. Optional; call() is the fallback.\n */\n step?(args: FormulaValue[]): FormulaValue | TailCall;\n}\n\n/**\n * A pending tail call produced by evaluating a node in tail position. The\n * trampoline in a lambda's call() loops on these instead of recursing.\n */\nexport class TailCall {\n constructor(readonly lambda: LambdaLike, readonly args: FormulaValue[]) {}\n}\n\nexport class FormulaValue {\n readonly kind: FormulaValueKind;\n /** Numeric payload (also used for boolean: 1=true, 0=false). */\n readonly #num: number;\n /** String, ArrayValue, or LambdaLike payload. */\n readonly #obj: string | ArrayValue | LambdaLike | undefined;\n readonly errorCode: FormulaError;\n\n private constructor(\n kind: FormulaValueKind,\n num = 0,\n obj?: string | ArrayValue | LambdaLike,\n errorCode: FormulaError = FormulaError.None,\n ) {\n this.kind = kind;\n this.#num = num;\n this.#obj = obj;\n this.errorCode = errorCode;\n }\n\n // ── Cached singletons ────────────────────────────────────────────────────\n\n static readonly blank = new FormulaValue('blank');\n static readonly zero = new FormulaValue('number', 0);\n static readonly one = new FormulaValue('number', 1);\n static readonly true_ = new FormulaValue('boolean', 1);\n static readonly false_ = new FormulaValue('boolean', 0);\n static readonly emptyString = new FormulaValue('text', 0, '');\n static readonly errorDiv0 = new FormulaValue('error', 0, undefined, FormulaError.Div0);\n static readonly errorValue = new FormulaValue('error', 0, undefined, FormulaError.Value);\n static readonly errorRef = new FormulaValue('error', 0, undefined, FormulaError.Ref);\n static readonly errorName = new FormulaValue('error', 0, undefined, FormulaError.Name);\n static readonly errorNA = new FormulaValue('error', 0, undefined, FormulaError.NA);\n static readonly errorNum = new FormulaValue('error', 0, undefined, FormulaError.Num);\n static readonly errorNull = new FormulaValue('error', 0, undefined, FormulaError.Null);\n\n // ── Static factories ─────────────────────────────────────────────────────\n\n static number(v: number): FormulaValue {\n if (v === 0) return FormulaValue.zero;\n if (v === 1) return FormulaValue.one;\n return new FormulaValue('number', v);\n }\n\n static text(v: string): FormulaValue {\n if (v === '') return FormulaValue.emptyString;\n return new FormulaValue('text', 0, v);\n }\n\n static boolean(v: boolean): FormulaValue {\n return v ? FormulaValue.true_ : FormulaValue.false_;\n }\n\n static error(e: FormulaError): FormulaValue {\n switch (e) {\n case FormulaError.Div0: return FormulaValue.errorDiv0;\n case FormulaError.Value: return FormulaValue.errorValue;\n case FormulaError.Ref: return FormulaValue.errorRef;\n case FormulaError.Name: return FormulaValue.errorName;\n case FormulaError.NA: return FormulaValue.errorNA;\n case FormulaError.Num: return FormulaValue.errorNum;\n case FormulaError.Null: return FormulaValue.errorNull;\n default: return new FormulaValue('error', 0, undefined, e);\n }\n }\n\n static array(a: ArrayValue): FormulaValue {\n return new FormulaValue('array', 0, a);\n }\n\n static lambda(fn: LambdaLike): FormulaValue {\n return new FormulaValue('lambda', 0, fn);\n }\n\n // ── Type checks ──────────────────────────────────────────────────────────\n\n get isBlank(): boolean { return this.kind === 'blank'; }\n get isNumber(): boolean { return this.kind === 'number'; }\n get isText(): boolean { return this.kind === 'text'; }\n get isBoolean(): boolean { return this.kind === 'boolean'; }\n get isError(): boolean { return this.kind === 'error'; }\n get isArray(): boolean { return this.kind === 'array'; }\n get isLambda(): boolean { return this.kind === 'lambda'; }\n get isNumeric(): boolean { return this.kind === 'number' || this.kind === 'boolean' || this.kind === 'blank'; }\n\n // ── Value accessors ──────────────────────────────────────────────────────\n\n get numberValue(): number { return this.#num; }\n get textValue(): string { return (this.#obj as string) ?? ''; }\n get booleanValue(): boolean { return this.#num !== 0; }\n get arrayVal(): ArrayValue { return (this.#obj as ArrayValue) ?? ArrayValue.empty; }\n get lambdaVal(): LambdaLike { return this.#obj as LambdaLike; }\n\n // ── Coercion (Excel semantics, no exceptions) ─────────────────────────────\n\n coerceToNumber(): FormulaValue {\n switch (this.kind) {\n case 'number': return this;\n case 'blank': return FormulaValue.zero;\n case 'boolean': return FormulaValue.number(this.#num);\n case 'error': return this;\n case 'text': {\n const n = parseFloat(this.textValue);\n return isNaN(n) ? FormulaValue.errorValue : FormulaValue.number(n);\n }\n default: return FormulaValue.errorValue;\n }\n }\n\n tryAsDouble(): { ok: true; value: number } | { ok: false } {\n switch (this.kind) {\n case 'number': return { ok: true, value: this.#num };\n case 'blank': return { ok: true, value: 0 };\n case 'boolean': return { ok: true, value: this.#num };\n case 'text': {\n const n = parseFloat(this.textValue);\n return isNaN(n) ? { ok: false } : { ok: true, value: n };\n }\n default: return { ok: false };\n }\n }\n\n coerceToBool(): FormulaValue {\n switch (this.kind) {\n case 'boolean': return this;\n case 'number': return FormulaValue.boolean(this.#num !== 0);\n case 'blank': return FormulaValue.false_;\n case 'error': return this;\n case 'text': {\n const u = this.textValue.toUpperCase();\n if (u === 'TRUE') return FormulaValue.true_;\n if (u === 'FALSE') return FormulaValue.false_;\n return FormulaValue.errorValue;\n }\n default: return FormulaValue.errorValue;\n }\n }\n\n asText(): string {\n switch (this.kind) {\n case 'text': return this.textValue;\n case 'number': return String(this.#num);\n case 'boolean': return this.#num !== 0 ? 'TRUE' : 'FALSE';\n case 'blank': return '';\n case 'error': return FormulaValue.errorToString(this.errorCode);\n case 'lambda': return FormulaValue.errorToString(FormulaError.Calc);\n default: return '';\n }\n }\n\n // ── Comparison (Excel semantics) ─────────────────────────────────────────\n\n static areEqual(a: FormulaValue, b: FormulaValue): boolean {\n if (a.isBlank && b.isBlank) return true;\n if (a.isBlank) {\n if (b.isNumber) return Math.abs(b.numberValue) < 1e-10;\n if (b.isText) return b.textValue === '';\n if (b.isBoolean) return !b.booleanValue;\n return false;\n }\n if (b.isBlank) return FormulaValue.areEqual(b, a);\n if (a.kind !== b.kind) return false;\n switch (a.kind) {\n case 'number': return Math.abs(a.#num - b.#num) < 1e-10;\n case 'boolean': return a.#num === b.#num;\n case 'text': return a.textValue.toUpperCase() === b.textValue.toUpperCase();\n default: return false;\n }\n }\n\n /** Excel-compatible sort order: Number/Blank < Text < Boolean. */\n static compare(a: FormulaValue, b: FormulaValue): number {\n const order = (v: FormulaValue) => v.kind === 'boolean' ? 2 : v.isText ? 1 : 0;\n const oa = order(a), ob = order(b);\n if (oa !== ob) return oa - ob;\n switch (oa) {\n case 0: return (a.isBlank ? 0 : a.numberValue) - (b.isBlank ? 0 : b.numberValue);\n case 1: return a.textValue.toUpperCase() < b.textValue.toUpperCase() ? -1 : a.textValue.toUpperCase() > b.textValue.toUpperCase() ? 1 : 0;\n case 2: return a.#num - b.#num;\n default: return 0;\n }\n }\n\n // ── Error helpers ─────────────────────────────────────────────────────────\n\n static errorToString(e: FormulaError): string {\n const map: Record<FormulaError, string> = {\n [FormulaError.None]: '',\n [FormulaError.Null]: '#NULL!',\n [FormulaError.Div0]: '#DIV/0!',\n [FormulaError.Value]: '#VALUE!',\n [FormulaError.Ref]: '#REF!',\n [FormulaError.Name]: '#NAME?',\n [FormulaError.Num]: '#NUM!',\n [FormulaError.NA]: '#N/A',\n [FormulaError.Calc]: '#CALC!',\n [FormulaError.Spill]: '#SPILL!',\n };\n return map[e] ?? '#ERROR!';\n }\n\n static errorFromString(s: string): FormulaError {\n const map: Record<string, FormulaError> = {\n '#NULL!': FormulaError.Null,\n '#DIV/0!': FormulaError.Div0,\n '#VALUE!': FormulaError.Value,\n '#REF!': FormulaError.Ref,\n '#NAME?': FormulaError.Name,\n '#NUM!': FormulaError.Num,\n '#N/A': FormulaError.NA,\n '#CALC!': FormulaError.Calc,\n '#SPILL!': FormulaError.Spill,\n };\n return map[s] ?? FormulaError.Value;\n }\n\n // ── JS interop ────────────────────────────────────────────────────────────\n\n static fromObjectSync(value: unknown): FormulaValue {\n if (value === null || value === undefined) return FormulaValue.blank;\n if (typeof value === 'number') return isNaN(value) ? FormulaValue.errorValue : FormulaValue.number(value);\n if (typeof value === 'boolean') return FormulaValue.boolean(value);\n if (typeof value === 'string') return value === '' ? FormulaValue.blank : FormulaValue.text(value);\n if (value instanceof Date) {\n return FormulaValue.number(toOADate(value));\n }\n return FormulaValue.text(String(value));\n }\n\n toObject(): unknown {\n switch (this.kind) {\n case 'number': return this.#num;\n case 'text': return this.textValue;\n case 'boolean': return this.booleanValue;\n case 'blank': return null;\n case 'error': return FormulaValue.errorToString(this.errorCode);\n case 'array': return this.arrayVal.toObjectArray();\n case 'lambda': return FormulaValue.errorToString(FormulaError.Calc);\n default: return null;\n }\n }\n\n toString(): string { return this.asText(); }\n}\n\n// ── ArrayValue ────────────────────────────────────────────────────────────────\n\n/**\n * 2D array value for formula results and range data.\n * Port of TVE.PureDocs.Excel.Formulas.ArrayValue (C#)\n */\nexport class ArrayValue {\n static readonly empty = new ArrayValue(0, 0);\n\n readonly #data: FormulaValue[];\n readonly rows: number;\n readonly columns: number;\n\n constructor(rows: number, columns: number) {\n this.rows = rows;\n this.columns = columns;\n this.#data = new Array<FormulaValue>(rows * columns).fill(FormulaValue.blank);\n }\n\n get length(): number { return this.#data.length; }\n\n get(row: number, col: number): FormulaValue {\n if (row < 0 || row >= this.rows || col < 0 || col >= this.columns) {\n return FormulaValue.errorRef;\n }\n return this.#data[row * this.columns + col]!;\n }\n\n set(row: number, col: number, value: FormulaValue): void {\n if (row >= 0 && row < this.rows && col >= 0 && col < this.columns) {\n this.#data[row * this.columns + col] = value;\n }\n }\n\n getFlat(index: number): FormulaValue {\n return index >= 0 && index < this.#data.length\n ? this.#data[index]!\n : FormulaValue.errorRef;\n }\n\n setFlat(index: number, value: FormulaValue): void {\n if (index >= 0 && index < this.#data.length) {\n this.#data[index] = value;\n }\n }\n\n /** Iterate all values in row-major order. */\n values(): Iterable<FormulaValue> { return this.#data; }\n\n toObjectArray(): unknown[] {\n return this.#data.map(v => v.toObject());\n }\n\n /** Create from a flat array (single column). */\n static fromFlat(values: FormulaValue[]): ArrayValue {\n const arr = new ArrayValue(values.length, 1);\n values.forEach((v, i) => arr.setFlat(i, v));\n return arr;\n }\n\n /** Create a 1×1 array wrapping a scalar value (for broadcasting). */\n static fromScalar(value: FormulaValue): ArrayValue {\n const arr = new ArrayValue(1, 1);\n arr.setFlat(0, value);\n return arr;\n }\n\n /** Element-wise broadcasting operation (mirrors ArrayValue.Broadcast in C#). */\n static broadcast(\n a: ArrayValue,\n b: ArrayValue,\n op: (av: FormulaValue, bv: FormulaValue) => FormulaValue,\n ): ArrayValue {\n const rows = Math.max(a.rows, b.rows);\n const cols = Math.max(a.columns, b.columns);\n\n // Validate compatibility\n if ((a.rows !== 1 && b.rows !== 1 && a.rows !== b.rows) ||\n (a.columns !== 1 && b.columns !== 1 && a.columns !== b.columns)) {\n const err = new ArrayValue(rows, cols);\n for (let i = 0; i < err.length; i++) err.setFlat(i, FormulaValue.errorValue);\n return err;\n }\n\n const result = new ArrayValue(rows, cols);\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const av = a.get(r < a.rows ? r : 0, c < a.columns ? c : 0);\n const bv = b.get(r < b.rows ? r : 0, c < b.columns ? c : 0);\n result.set(r, c, op(av, bv));\n }\n }\n return result;\n }\n\n /** Implicit intersection: reduce array to scalar based on formula position. */\n implicitIntersect(formulaRow: number, formulaCol: number, rangeStartRow: number, rangeStartCol: number): FormulaValue {\n if (this.rows === 1 && this.columns === 1) return this.get(0, 0);\n if (this.columns === 1) {\n const offset = formulaRow - rangeStartRow;\n return offset >= 0 && offset < this.rows ? this.get(offset, 0) : FormulaValue.errorValue;\n }\n if (this.rows === 1) {\n const offset = formulaCol - rangeStartCol;\n return offset >= 0 && offset < this.columns ? this.get(0, offset) : FormulaValue.errorValue;\n }\n const ro = formulaRow - rangeStartRow;\n const co = formulaCol - rangeStartCol;\n return ro >= 0 && ro < this.rows && co >= 0 && co < this.columns\n ? this.get(ro, co)\n : FormulaValue.errorValue;\n }\n\n transpose(): ArrayValue {\n const result = new ArrayValue(this.columns, this.rows);\n for (let r = 0; r < this.rows; r++) {\n for (let c = 0; c < this.columns; c++) {\n result.set(c, r, this.get(r, c));\n }\n }\n return result;\n }\n}\n","/**\n * Tokens produced by the formula lexer.\n * Port of TVE.PureDocs.Excel.Formulas.FormulaToken + FormulaTokenType (C#)\n */\n\nexport const enum TokenType {\n Number,\n String,\n Boolean,\n CellReference,\n Colon,\n Function,\n LeftParen,\n RightParen,\n Comma,\n Plus,\n Minus,\n Multiply,\n Divide,\n Power,\n Percent,\n Ampersand,\n Equal,\n NotEqual,\n LessThan,\n LessThanOrEqual,\n GreaterThan,\n GreaterThanOrEqual,\n SheetReference,\n NamedRange,\n SpillReference,\n Exclamation,\n AtSign,\n LeftBrace,\n RightBrace,\n Semicolon,\n ErrorLiteral,\n EOF,\n}\n\nexport interface Token {\n readonly type: TokenType;\n readonly value: string;\n readonly position: number;\n}\n\nexport function makeToken(type: TokenType, value: string, position: number): Token {\n return { type, value, position };\n}\n","/**\n * Tokenises an Excel formula string into a sequence of tokens.\n * Full port of TVE.PureDocs.Excel.Formulas.FormulaLexer (C#)\n *\n * Supports:\n * - String literals (\"hello\")\n * - Error literals (#N/A, #REF!, #VALUE!, etc.)\n * - Quoted sheet references ('My Sheet'!A1)\n * - Unquoted sheet references (Sheet1!A1)\n * - _xlfn. / _xlws. / _xlpm. prefix stripping\n * - Array constants ({1,2;3,4})\n * - Cell references ($A$1, A1, AA123)\n * - Named ranges\n * - @ implicit intersection operator\n * - All standard operators\n */\nimport { Token, TokenType, makeToken } from './formula-token.js';\n\nexport class FormulaException extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'FormulaException';\n }\n}\n\nconst UNDERSCORE = 0x5f;\n\n/**\n * Name decorations Excel writes into stored formulas, upper-cased:\n * _xlfn. function newer than the file format's baseline (SORT, LET, …)\n * _xlws. function that also lives in the worksheet-only namespace (FILTER, SORT)\n * _xlpm. a LET/LAMBDA parameter name\n */\nconst RESERVED_PREFIXES = ['_XLFN.', '_XLWS.', '_XLPM.'] as const;\n\nconst KNOWN_ERRORS = new Set([\n '#NULL!', '#DIV/0!', '#VALUE!', '#REF!', '#NAME?', '#NUM!', '#N/A', '#CALC!', '#SPILL!',\n]);\n\nexport class FormulaLexer {\n readonly #formula: string;\n #pos = 0;\n\n constructor(formula: string) {\n if (!formula) throw new FormulaException('Formula cannot be empty.');\n this.#formula = formula;\n }\n\n tokenize(): Token[] {\n this.#pos = 0;\n const tokens: Token[] = [];\n\n while (this.#pos < this.#formula.length) {\n this.#skipWhitespace();\n if (this.#pos >= this.#formula.length) break;\n\n const token = this.#readNextToken();\n if (token) tokens.push(token);\n }\n\n tokens.push(makeToken(TokenType.EOF, '', this.#pos));\n return tokens;\n }\n\n // ── Private tokenisers ─────────────────────────────────────────────────────\n\n #readNextToken(): Token | null {\n const c = this.#formula[this.#pos]!;\n\n if (c === '\"') return this.#readString();\n if (c === '#') return this.#readErrorLiteral();\n if (c === \"'\") return this.#readQuotedSheetRef();\n\n if (c === '.' && this.#pos + 1 < this.#formula.length && /\\d/.test(this.#formula[this.#pos + 1]!)) {\n return this.#readNumber();\n }\n if (/\\d/.test(c)) return this.#readNumber();\n if (/[a-zA-Z_$]/.test(c)) return this.#readIdentifier();\n\n return this.#readOperator();\n }\n\n #readString(): Token {\n const start = this.#pos++;\n let value = '';\n\n while (this.#pos < this.#formula.length) {\n const ch = this.#formula[this.#pos];\n if (ch === '\"') {\n this.#pos++;\n if (this.#formula[this.#pos] === '\"') { value += '\"'; this.#pos++; }\n else return makeToken(TokenType.String, value, start);\n } else {\n value += ch;\n this.#pos++;\n }\n }\n throw new FormulaException(`Unterminated string at position ${start}.`);\n }\n\n #readErrorLiteral(): Token {\n const start = this.#pos;\n let raw = '#';\n this.#pos++;\n\n while (this.#pos < this.#formula.length) {\n const ch = this.#formula[this.#pos]!;\n if (/[a-zA-Z0-9/]/.test(ch) || ch === '!' || ch === '?') {\n raw += ch;\n this.#pos++;\n if (ch === '!' || ch === '?') break;\n } else break;\n }\n\n const upper = raw.toUpperCase();\n if (!KNOWN_ERRORS.has(upper)) {\n throw new FormulaException(`Unknown error literal \"${raw}\" at position ${start}.`);\n }\n return makeToken(TokenType.ErrorLiteral, upper, start);\n }\n\n #readQuotedSheetRef(): Token {\n const start = this.#pos++;\n let sheetName = '';\n\n while (this.#pos < this.#formula.length) {\n const ch = this.#formula[this.#pos]!;\n if (ch === \"'\") {\n this.#pos++;\n if (this.#formula[this.#pos] === \"'\") { sheetName += \"'\"; this.#pos++; }\n else {\n if (this.#formula[this.#pos] !== '!') {\n throw new FormulaException(`Expected '!' after quoted sheet name at position ${start}.`);\n }\n this.#pos++; // skip !\n const cellRef = this.#readCellRefChars();\n return makeToken(TokenType.SheetReference, `${sheetName}!${cellRef}`, start);\n }\n } else {\n sheetName += ch;\n this.#pos++;\n }\n }\n throw new FormulaException(`Unterminated quoted sheet name at position ${start}.`);\n }\n\n #readNumber(): Token {\n const start = this.#pos;\n let raw = '';\n let hasDot = false;\n let hasE = false;\n\n while (this.#pos < this.#formula.length) {\n const ch = this.#formula[this.#pos]!;\n if (/\\d/.test(ch)) { raw += ch; this.#pos++; }\n else if (ch === '.' && !hasDot && !hasE) { hasDot = true; raw += ch; this.#pos++; }\n else if ((ch === 'e' || ch === 'E') && !hasE && raw.length > 0) {\n hasE = true; raw += ch; this.#pos++;\n if (this.#formula[this.#pos] === '+' || this.#formula[this.#pos] === '-') {\n raw += this.#formula[this.#pos++];\n }\n } else break;\n }\n\n return makeToken(TokenType.Number, raw, start);\n }\n\n #readIdentifier(): Token {\n const start = this.#pos;\n let raw = '';\n\n while (this.#pos < this.#formula.length) {\n const ch = this.#formula[this.#pos]!;\n if (/[a-zA-Z0-9_$.]/.test(ch)) { raw += ch; this.#pos++; }\n else break;\n }\n\n let upper = raw.toUpperCase();\n raw = this.#stripReservedPrefixes(raw, upper);\n if (raw.length !== upper.length) upper = upper.slice(upper.length - raw.length);\n\n if (upper === 'TRUE') return makeToken(TokenType.Boolean, 'TRUE', start);\n if (upper === 'FALSE') return makeToken(TokenType.Boolean, 'FALSE', start);\n\n // Sheet reference: Identifier!CellRef\n if (this.#formula[this.#pos] === '!') {\n this.#pos++; // skip !\n const cellRef = this.#readCellRefChars();\n return makeToken(TokenType.SheetReference, `${raw}!${cellRef}`, start);\n }\n\n // Function: Identifier followed by (\n this.#skipWhitespace();\n if (this.#formula[this.#pos] === '(') {\n return makeToken(TokenType.Function, upper, start);\n }\n\n // Cell reference or named range\n const stripped = raw.replace(/\\$/g, '');\n if (isCellRef(stripped)) {\n // Spill-range operator: A1# refers to the array that spills from A1.\n if (this.#formula[this.#pos] === '#') {\n this.#pos++; // consume '#'\n return makeToken(TokenType.SpillReference, stripped, start);\n }\n return makeToken(TokenType.CellReference, stripped, start);\n }\n return makeToken(TokenType.NamedRange, raw, start);\n }\n\n /**\n * Drops Excel's storage-level name decorations. They carry no semantics — the\n * writer stamps them so an older reader fails loudly instead of silently\n * mis-evaluating — and they *stack*: `_xlfn._xlws.FILTER` wears two. Stripping\n * one prefix once, as this used to, leaves `_XLWS.FILTER` unresolvable.\n *\n * Every identifier in every formula passes through here, so the common case is\n * gated on a single char-code test: a name not starting with '_' returns\n * untouched without so much as a comparison against the prefix table.\n */\n #stripReservedPrefixes(raw: string, upper: string): string {\n if (raw.charCodeAt(0) !== UNDERSCORE) return raw;\n\n let cut = 0;\n outer: for (;;) {\n for (const prefix of RESERVED_PREFIXES) {\n if (upper.startsWith(prefix, cut)) { cut += prefix.length; continue outer; }\n }\n break;\n }\n // A name that is nothing but prefixes is not a name; leave it intact so it\n // surfaces as an unresolved identifier rather than as the empty string.\n return cut > 0 && cut < raw.length ? raw.slice(cut) : raw;\n }\n\n #readCellRefChars(): string {\n let ref = '';\n while (this.#pos < this.#formula.length) {\n const ch = this.#formula[this.#pos]!;\n if (/[a-zA-Z0-9$]/.test(ch)) { ref += ch; this.#pos++; }\n else break;\n }\n return ref.replace(/\\$/g, '');\n }\n\n #readOperator(): Token {\n const start = this.#pos;\n const ch = this.#formula[this.#pos++]!;\n\n switch (ch) {\n case '(': return makeToken(TokenType.LeftParen, '(', start);\n case ')': return makeToken(TokenType.RightParen, ')', start);\n case ',': return makeToken(TokenType.Comma, ',', start);\n case ':': return makeToken(TokenType.Colon, ':', start);\n case '+': return makeToken(TokenType.Plus, '+', start);\n case '-': return makeToken(TokenType.Minus, '-', start);\n case '*': return makeToken(TokenType.Multiply, '*', start);\n case '/': return makeToken(TokenType.Divide, '/', start);\n case '^': return makeToken(TokenType.Power, '^', start);\n case '%': return makeToken(TokenType.Percent, '%', start);\n case '&': return makeToken(TokenType.Ampersand, '&', start);\n case '=': return makeToken(TokenType.Equal, '=', start);\n case '@': return makeToken(TokenType.AtSign, '@', start);\n case '!': return makeToken(TokenType.Exclamation,'!', start);\n case '{': return makeToken(TokenType.LeftBrace, '{', start);\n case '}': return makeToken(TokenType.RightBrace, '}', start);\n // Inside an array constant ';' separates rows. Excel always stores ',' as\n // the argument separator regardless of locale, so ';' has no other role.\n case ';': return makeToken(TokenType.Semicolon, ';', start);\n case '<':\n if (this.#formula[this.#pos] === '>') { this.#pos++; return makeToken(TokenType.NotEqual, '<>', start); }\n if (this.#formula[this.#pos] === '=') { this.#pos++; return makeToken(TokenType.LessThanOrEqual, '<=', start); }\n return makeToken(TokenType.LessThan, '<', start);\n case '>':\n if (this.#formula[this.#pos] === '=') { this.#pos++; return makeToken(TokenType.GreaterThanOrEqual, '>=', start); }\n return makeToken(TokenType.GreaterThan, '>', start);\n default:\n throw new FormulaException(`Unexpected character '${ch}' at position ${start}.`);\n }\n }\n\n #skipWhitespace(): void {\n while (this.#pos < this.#formula.length && /\\s/.test(this.#formula[this.#pos]!)) {\n this.#pos++;\n }\n }\n}\n\nfunction isCellRef(s: string): boolean {\n if (s.length < 2) return false;\n let i = 0;\n while (i < s.length && /[a-zA-Z]/.test(s[i]!)) i++;\n if (i === 0 || i >= s.length) return false;\n while (i < s.length && /\\d/.test(s[i]!)) i++;\n return i === s.length;\n}\n","/**\n * AST node types for formula expressions.\n * Port of TVE.PureDocs.Excel.Formulas.FormulaNode (C#)\n */\nimport { FormulaValue, FormulaError, ArrayValue, TailCall } from './formula-value.js';\nimport type { FormulaContext } from './formula-context.js';\n\n// ── Base ───────────────────────────────────────────────────────────────────\n\nexport abstract class FormulaNode {\n abstract evaluate(ctx: FormulaContext): FormulaValue;\n\n /**\n * Evaluates this node in tail position. Returns a TailCall when the node's\n * value is a call to a lambda in tail position (so the caller's trampoline can\n * iterate without growing the stack); otherwise the final value. The default\n * is a plain evaluate — only control-flow and call nodes override it.\n */\n evaluateTail(ctx: FormulaContext): FormulaValue | TailCall {\n return this.evaluate(ctx);\n }\n}\n\n// ── Literals ───────────────────────────────────────────────────────────────\n\nexport class NumberNode extends FormulaNode {\n constructor(readonly value: number) { super(); }\n evaluate(): FormulaValue { return FormulaValue.number(this.value); }\n}\n\nexport class StringNode extends FormulaNode {\n constructor(readonly value: string) { super(); }\n evaluate(): FormulaValue { return FormulaValue.text(this.value); }\n}\n\nexport class BooleanNode extends FormulaNode {\n constructor(readonly value: boolean) { super(); }\n evaluate(): FormulaValue { return FormulaValue.boolean(this.value); }\n}\n\nexport class ErrorNode extends FormulaNode {\n constructor(readonly errorValue: FormulaValue) { super(); }\n evaluate(): FormulaValue { return this.errorValue; }\n}\n\n/**\n * An array constant — `{1,2;3,4}`. Excel allows only literals inside one, so the\n * whole value is known at parse time and is built exactly once, by the parser.\n * Evaluation is a field read: no allocation, no per-recalc rebuild, however many\n * times the owning formula recomputes.\n *\n * The shared ArrayValue is treated as immutable. Every function in the library\n * materialises a fresh array for its result rather than writing through an\n * argument, so no caller can reach in and corrupt the constant.\n */\nexport class ArrayLiteralNode extends FormulaNode {\n readonly #value: FormulaValue;\n constructor(readonly array: ArrayValue) {\n super();\n this.#value = FormulaValue.array(array);\n }\n evaluate(): FormulaValue { return this.#value; }\n}\n\n/** Represents an empty/omitted argument in a function call (e.g. IF(A1,,0)). */\nexport class BlankNode extends FormulaNode {\n evaluate(): FormulaValue { return FormulaValue.blank; }\n}\n\n// ── References ────────────────────────────────────────────────────────────\n\nexport class CellReferenceNode extends FormulaNode {\n constructor(readonly reference: string) { super(); }\n evaluate(ctx: FormulaContext): FormulaValue {\n return ctx.getCellValue(this.reference);\n }\n}\n\nexport class RangeReferenceNode extends FormulaNode {\n constructor(readonly startRef: string, readonly endRef: string) { super(); }\n evaluate(ctx: FormulaContext): FormulaValue {\n return ctx.getRangeValues(this.startRef, this.endRef);\n }\n}\n\nexport class SheetCellReferenceNode extends FormulaNode {\n constructor(readonly sheetName: string, readonly cellReference: string) { super(); }\n evaluate(ctx: FormulaContext): FormulaValue {\n return ctx.getSheetCellValue(this.sheetName, this.cellReference);\n }\n}\n\nexport class SheetRangeReferenceNode extends FormulaNode {\n constructor(\n readonly sheetName: string,\n readonly startRef: string,\n readonly endRef: string,\n ) { super(); }\n evaluate(ctx: FormulaContext): FormulaValue {\n return ctx.getSheetRangeValues(this.sheetName, this.startRef, this.endRef);\n }\n}\n\n/**\n * A whole-column (`A:A`, `$B:$D`) or whole-row (`1:1`, `3:7`) reference,\n * optionally sheet-qualified (`Sheet1!A:A`).\n *\n * Exactly one dimension is bounded: a column range fixes the columns and leaves\n * the rows open, a row range the reverse. The open dimension is resolved against\n * the sheet's used range at evaluation time rather than baked in as 1..1048576 —\n * expanding it eagerly would turn `SUM(A:A)` on a twelve-row sheet into a\n * million-cell read, and Excel's own answer is the used range too.\n */\nexport class FullRangeReferenceNode extends FormulaNode {\n constructor(\n readonly startCol: number | null,\n readonly endCol: number | null,\n readonly startRow: number | null,\n readonly endRow: number | null,\n readonly sheetName?: string,\n ) { super(); }\n\n evaluate(ctx: FormulaContext): FormulaValue {\n return this.sheetName === undefined\n ? ctx.getFullRangeValues(this.startCol, this.endCol, this.startRow, this.endRow)\n : ctx.getSheetFullRangeValues(this.sheetName, this.startCol, this.endCol, this.startRow, this.endRow);\n }\n}\n\nexport class NamedRangeNode extends FormulaNode {\n constructor(readonly name: string) { super(); }\n evaluate(ctx: FormulaContext): FormulaValue {\n return ctx.resolveNamedRange(this.name);\n }\n}\n\n/** Spill-range reference (A1#): the array that spills from an anchor cell. */\nexport class SpillReferenceNode extends FormulaNode {\n constructor(readonly anchorRef: string) { super(); }\n evaluate(ctx: FormulaContext): FormulaValue {\n return ctx.resolveSpillRange(this.anchorRef);\n }\n}\n\n// ── Operators ─────────────────────────────────────────────────────────────\n\nexport const enum BinaryOperator {\n Add, Subtract, Multiply, Divide, Power,\n Concatenate,\n Equal, NotEqual, LessThan, LessThanOrEqual, GreaterThan, GreaterThanOrEqual,\n}\n\nexport const enum UnaryOperator {\n Negate, Plus, Percent,\n}\n\nexport class BinaryOpNode extends FormulaNode {\n constructor(\n readonly left: FormulaNode,\n readonly op: BinaryOperator,\n readonly right: FormulaNode,\n ) { super(); }\n\n evaluate(ctx: FormulaContext): FormulaValue {\n const l = this.left.evaluate(ctx);\n const r = this.right.evaluate(ctx);\n\n // Array broadcasting\n if (l.isArray || r.isArray) {\n const la = l.isArray ? l.arrayVal : ArrayValue.fromScalar(l);\n const ra = r.isArray ? r.arrayVal : ArrayValue.fromScalar(r);\n return FormulaValue.array(\n ArrayValue.broadcast(la, ra, (a, b) => this.#evalScalar(a, b)),\n );\n }\n\n return this.#evalScalar(l, r);\n }\n\n #evalScalar(l: FormulaValue, r: FormulaValue): FormulaValue {\n const op = this.op;\n\n // Comparisons\n if (op === BinaryOperator.Equal) return FormulaValue.boolean(FormulaValue.areEqual(l, r));\n if (op === BinaryOperator.NotEqual) return FormulaValue.boolean(!FormulaValue.areEqual(l, r));\n if (op === BinaryOperator.LessThan) return FormulaValue.boolean(FormulaValue.compare(l, r) < 0);\n if (op === BinaryOperator.LessThanOrEqual) return FormulaValue.boolean(FormulaValue.compare(l, r) <= 0);\n if (op === BinaryOperator.GreaterThan) return FormulaValue.boolean(FormulaValue.compare(l, r) > 0);\n if (op === BinaryOperator.GreaterThanOrEqual) return FormulaValue.boolean(FormulaValue.compare(l, r) >= 0);\n\n // Concatenation\n if (op === BinaryOperator.Concatenate) {\n if (l.isError) return l;\n if (r.isError) return r;\n return FormulaValue.text(l.asText() + r.asText());\n }\n\n // Arithmetic — coerce to numbers\n const ln = l.coerceToNumber();\n if (ln.isError) return ln;\n const rn = r.coerceToNumber();\n if (rn.isError) return rn;\n\n const lv = ln.numberValue;\n const rv = rn.numberValue;\n\n switch (op) {\n case BinaryOperator.Add: return FormulaValue.number(lv + rv);\n case BinaryOperator.Subtract: return FormulaValue.number(lv - rv);\n case BinaryOperator.Multiply: return FormulaValue.number(lv * rv);\n case BinaryOperator.Divide:\n if (rv === 0) return FormulaValue.errorDiv0;\n return FormulaValue.number(lv / rv);\n case BinaryOperator.Power:\n return FormulaValue.number(Math.pow(lv, rv));\n default:\n return FormulaValue.errorValue;\n }\n }\n}\n\nexport class UnaryOpNode extends FormulaNode {\n constructor(readonly op: UnaryOperator, readonly operand: FormulaNode) { super(); }\n\n evaluate(ctx: FormulaContext): FormulaValue {\n const val = this.operand.evaluate(ctx);\n\n if (this.op === UnaryOperator.Plus) {\n return val.coerceToNumber();\n }\n if (this.op === UnaryOperator.Negate) {\n const n = val.coerceToNumber();\n if (n.isError) return n;\n return FormulaValue.number(-n.numberValue);\n }\n if (this.op === UnaryOperator.Percent) {\n const n = val.coerceToNumber();\n if (n.isError) return n;\n return FormulaValue.number(n.numberValue / 100);\n }\n return FormulaValue.errorValue;\n }\n}\n\n/** @ implicit intersection operator (Excel 365). */\nexport class ImplicitIntersectionNode extends FormulaNode {\n constructor(readonly inner: FormulaNode) { super(); }\n\n evaluate(ctx: FormulaContext): FormulaValue {\n const val = this.inner.evaluate(ctx);\n if (!val.isArray) return val;\n return val.arrayVal.implicitIntersect(ctx.formulaRow, ctx.formulaCol, 0, 0);\n }\n}\n\n// ── Function call ─────────────────────────────────────────────────────────\n\nexport class FunctionCallNode extends FormulaNode {\n constructor(\n readonly functionName: string,\n readonly args: FormulaNode[],\n ) { super(); }\n\n evaluate(ctx: FormulaContext): FormulaValue {\n return ctx.evaluateFunction(this.functionName, this.args);\n }\n\n override evaluateTail(ctx: FormulaContext): FormulaValue | TailCall {\n const name = this.functionName;\n const a = this.args;\n\n // Control-flow functions are tail-transparent: tail position flows into the\n // branch they select. Branch selection mirrors the handlers exactly.\n switch (name) {\n case 'IF': {\n const cond = a[0]!.evaluate(ctx);\n if (cond.isError) return cond;\n const b = cond.coerceToBool();\n if (b.isError) return b;\n if (b.booleanValue) return a[1]!.evaluateTail(ctx);\n return a.length > 2 ? a[2]!.evaluateTail(ctx) : FormulaValue.false_;\n }\n case 'IFS': {\n for (let i = 0; i + 1 < a.length; i += 2) {\n const cond = a[i]!.evaluate(ctx);\n if (cond.isError) return cond;\n const b = cond.coerceToBool();\n if (b.isError) return b;\n if (b.booleanValue) return a[i + 1]!.evaluateTail(ctx);\n }\n return FormulaValue.errorNA;\n }\n case 'IFERROR': {\n const v = a[0]!.evaluate(ctx);\n return v.isError ? a[1]!.evaluateTail(ctx) : v;\n }\n case 'IFNA': {\n const v = a[0]!.evaluate(ctx);\n return v.isError && v.errorCode === FormulaError.NA ? a[1]!.evaluateTail(ctx) : v;\n }\n case 'LET': {\n if (a.length < 3 || a.length % 2 === 0) break;\n const bindings = new Map<string, FormulaValue>();\n ctx.pushScope(bindings);\n try {\n for (let i = 0; i < a.length - 1; i += 2) {\n const nn = a[i]!;\n if (!(nn instanceof NamedRangeNode)) return FormulaValue.errorValue;\n const val = a[i + 1]!.evaluate(ctx);\n if (val.isError) return val;\n bindings.set(nn.name.toUpperCase(), val);\n }\n // Args of any tail call are evaluated eagerly here (scope still in place).\n return a[a.length - 1]!.evaluateTail(ctx);\n } finally {\n ctx.popScope();\n }\n }\n }\n\n // A call to an unregistered name that resolves to a lambda is a tail call.\n if (!ctx.hasFunction(name)) {\n const named = ctx.resolveNamedRange(name);\n if (named.isLambda) {\n return new TailCall(named.lambdaVal, a.map(arg => arg.evaluate(ctx)));\n }\n }\n return this.evaluate(ctx);\n }\n}\n\n/**\n * Calls the value produced by an expression (e.g. an inline LAMBDA:\n * `LAMBDA(x,x+1)(5)`). The callee must evaluate to a lambda, else #VALUE!.\n */\nexport class CallNode extends FormulaNode {\n constructor(readonly callee: FormulaNode, readonly args: FormulaNode[]) { super(); }\n\n evaluate(ctx: FormulaContext): FormulaValue {\n const fn = this.callee.evaluate(ctx);\n if (fn.isError) return fn;\n if (!fn.isLambda) return FormulaValue.errorValue;\n return fn.lambdaVal.call(this.args.map(a => a.evaluate(ctx)));\n }\n\n override evaluateTail(ctx: FormulaContext): FormulaValue | TailCall {\n const fn = this.callee.evaluate(ctx);\n if (fn.isError) return fn;\n if (!fn.isLambda) return FormulaValue.errorValue;\n return new TailCall(fn.lambdaVal, this.args.map(a => a.evaluate(ctx)));\n }\n}\n","/**\n * Recursive descent parser converting formula tokens into an AST.\n * Port of TVE.PureDocs.Excel.Formulas.FormulaParser (C#)\n *\n * Operator precedence (low → high):\n * Comparison: =, <>, <, <=, >, >=\n * Concatenation: &\n * Addition/Subtraction: +, -\n * Multiplication/Division: *, /\n * Unary: +, -, @ (prefix)\n * Power: ^ (right-associative)\n * Percent: % (postfix)\n * Primary: literals, refs, functions, parentheses\n */\nimport { columnNumber, EXCEL_MAX_ROWS, EXCEL_MAX_COLUMNS } from '@devmm/puredocs-excel';\nimport { Token, TokenType } from './formula-token.js';\nimport { FormulaException } from './formula-lexer.js';\nimport {\n FormulaNode, NumberNode, StringNode, BooleanNode, ErrorNode, BlankNode,\n CellReferenceNode, RangeReferenceNode, SheetCellReferenceNode, SheetRangeReferenceNode,\n FullRangeReferenceNode, NamedRangeNode, SpillReferenceNode, FunctionCallNode, CallNode,\n BinaryOpNode, BinaryOperator, UnaryOpNode, UnaryOperator,\n ImplicitIntersectionNode, ArrayLiteralNode,\n} from './formula-node.js';\nimport { FormulaValue, ArrayValue } from './formula-value.js';\n\nexport class FormulaParser {\n readonly #tokens: Token[];\n #pos = 0;\n\n constructor(tokens: Token[]) {\n this.#tokens = tokens;\n }\n\n parse(): FormulaNode {\n this.#pos = 0;\n const node = this.#parseComparison();\n if (this.#current.type !== TokenType.EOF) {\n throw new FormulaException(\n `Unexpected token '${this.#current.value}' at position ${this.#current.position}.`,\n );\n }\n return node;\n }\n\n // ── Token helpers ──────────────────────────────────────────────────────────\n\n get #current(): Token {\n return this.#tokens[this.#pos] ?? { type: TokenType.EOF, value: '', position: -1 };\n }\n\n #advance(): Token {\n const t = this.#current;\n this.#pos++;\n return t;\n }\n\n #expect(type: TokenType): Token {\n if (this.#current.type !== type) {\n throw new FormulaException(\n `Expected token type ${type} but got ${this.#current.type} ('${this.#current.value}') at position ${this.#current.position}.`,\n );\n }\n return this.#advance();\n }\n\n // ── Precedence levels ──────────────────────────────────────────────────────\n\n #parseComparison(): FormulaNode {\n let left = this.#parseConcatenation();\n while (true) {\n const op = comparisonOp(this.#current.type);\n if (op === null) break;\n this.#advance();\n left = new BinaryOpNode(left, op, this.#parseConcatenation());\n }\n return left;\n }\n\n #parseConcatenation(): FormulaNode {\n let left = this.#parseAddSub();\n while (this.#current.type === TokenType.Ampersand) {\n this.#advance();\n left = new BinaryOpNode(left, BinaryOperator.Concatenate, this.#parseAddSub());\n }\n return left;\n }\n\n #parseAddSub(): FormulaNode {\n let left = this.#parseMulDiv();\n while (true) {\n const t = this.#current.type;\n if (t !== TokenType.Plus && t !== TokenType.Minus) break;\n this.#advance();\n const op = t === TokenType.Plus ? BinaryOperator.Add : BinaryOperator.Subtract;\n left = new BinaryOpNode(left, op, this.#parseMulDiv());\n }\n return left;\n }\n\n #parseMulDiv(): FormulaNode {\n let left = this.#parseUnary();\n while (true) {\n const t = this.#current.type;\n if (t !== TokenType.Multiply && t !== TokenType.Divide) break;\n this.#advance();\n const op = t === TokenType.Multiply ? BinaryOperator.Multiply : BinaryOperator.Divide;\n left = new BinaryOpNode(left, op, this.#parseUnary());\n }\n return left;\n }\n\n #parseUnary(): FormulaNode {\n if (this.#current.type === TokenType.Minus) {\n this.#advance();\n return new UnaryOpNode(UnaryOperator.Negate, this.#parsePower());\n }\n if (this.#current.type === TokenType.Plus) {\n this.#advance();\n return new UnaryOpNode(UnaryOperator.Plus, this.#parsePower());\n }\n if (this.#current.type === TokenType.AtSign) {\n this.#advance();\n return new ImplicitIntersectionNode(this.#parsePower());\n }\n return this.#parsePower();\n }\n\n #parsePower(): FormulaNode {\n const left = this.#parsePercent();\n if (this.#current.type === TokenType.Power) {\n this.#advance();\n // Right-associative\n return new BinaryOpNode(left, BinaryOperator.Power, this.#parseUnary());\n }\n return left;\n }\n\n #parsePercent(): FormulaNode {\n let node = this.#parsePostfix();\n while (this.#current.type === TokenType.Percent) {\n this.#advance();\n node = new UnaryOpNode(UnaryOperator.Percent, node);\n }\n return node;\n }\n\n /** Handles postfix call syntax on an expression, e.g. LAMBDA(x,x+1)(5). */\n #parsePostfix(): FormulaNode {\n let node = this.#parsePrimary();\n while (this.#current.type === TokenType.LeftParen) {\n this.#advance(); // consume '('\n node = new CallNode(node, this.#parseArgList());\n }\n return node;\n }\n\n #parsePrimary(): FormulaNode {\n const token = this.#current;\n\n switch (token.type) {\n case TokenType.Number: {\n this.#advance();\n // 1:1 — a whole-row reference. Two integers around a ':' have no other\n // meaning in a formula, so this cannot shadow arithmetic.\n if (this.#current.type === TokenType.Colon) {\n const full = this.#tryParseFullRange(token.value);\n if (full) return full;\n }\n const n = parseFloat(token.value);\n if (isNaN(n)) throw new FormulaException(`Invalid number: ${token.value}`);\n return new NumberNode(n);\n }\n\n case TokenType.String:\n this.#advance();\n return new StringNode(token.value);\n\n case TokenType.Boolean:\n this.#advance();\n return new BooleanNode(token.value === 'TRUE');\n\n case TokenType.ErrorLiteral:\n this.#advance();\n return new ErrorNode(FormulaValue.error(FormulaValue.errorFromString(token.value)));\n\n case TokenType.CellReference: {\n this.#advance();\n // Check for range A1:B5\n if (this.#current.type === TokenType.Colon) {\n this.#advance();\n const end = this.#expect(TokenType.CellReference);\n return new RangeReferenceNode(token.value, end.value);\n }\n return new CellReferenceNode(token.value);\n }\n\n case TokenType.SheetReference: {\n this.#advance();\n const parts = token.value.split('!');\n const sheetName = parts[0]!;\n const cellRef = parts[1] ?? '';\n if (this.#current.type === TokenType.Colon) {\n // Sheet1!A:A / Sheet1!1:1 — the qualified half lexes as a bare column\n // or row, so it is decided the same way as the unqualified form.\n const full = this.#tryParseFullRange(cellRef, sheetName);\n if (full) return full;\n // Sheet1!A1:B5\n this.#advance();\n const end = this.#expect(TokenType.CellReference);\n return new SheetRangeReferenceNode(sheetName, cellRef, end.value);\n }\n return new SheetCellReferenceNode(sheetName, cellRef);\n }\n\n case TokenType.NamedRange: {\n this.#advance();\n // A:A — a bare column letter is lexed as a name (it has no row digits),\n // and only the following ':' tells it apart from a defined name called\n // \"A\". Deciding it here rather than in the lexer keeps `SUM(A)` working.\n if (this.#current.type === TokenType.Colon) {\n const full = this.#tryParseFullRange(token.value);\n if (full) return full;\n }\n return new NamedRangeNode(token.value);\n }\n\n case TokenType.SpillReference:\n this.#advance();\n return new SpillReferenceNode(token.value);\n\n case TokenType.Function:\n return this.#parseFunction();\n\n case TokenType.LeftBrace:\n return this.#parseArrayLiteral();\n\n case TokenType.LeftParen: {\n this.#advance();\n const expr = this.#parseComparison();\n this.#expect(TokenType.RightParen);\n return expr;\n }\n\n default:\n throw new FormulaException(\n `Unexpected token '${token.value}' (type ${token.type}) at position ${token.position}.`,\n );\n }\n }\n\n /**\n * Completes a whole-column or whole-row reference whose first half has already\n * been consumed and whose ':' is the current token. Returns null — consuming\n * nothing — when the two halves are not a matching pair of columns or rows, so\n * the caller can fall back to its normal interpretation.\n *\n * Both halves must be the same kind: `A:A` and `1:5` are ranges, `A:1` is not\n * a reference at all in Excel and must stay an error rather than becoming a\n * silently different region.\n */\n #tryParseFullRange(startText: string, sheetName?: string): FormulaNode | null {\n const endToken = this.#tokens[this.#pos + 1];\n if (!endToken) return null;\n\n const start = classifyBound(startText);\n const end = classifyBound(endToken.value);\n if (!start || !end || start.kind !== end.kind) return null;\n\n this.#advance(); // ':'\n this.#advance(); // end half\n\n // Excel normalises a reversed range (C:A → A:C); the evaluator assumes\n // start ≤ end when it walks the rectangle.\n const lo = Math.min(start.index, end.index);\n const hi = Math.max(start.index, end.index);\n return start.kind === 'col'\n ? new FullRangeReferenceNode(lo, hi, null, null, sheetName)\n : new FullRangeReferenceNode(null, null, lo, hi, sheetName);\n }\n\n /**\n * Parses an array constant: `{1,2;3,4}` — ',' separates columns, ';' rows.\n *\n * Excel permits only literals inside one (no references, no calls, not even\n * arithmetic beyond a leading sign), so the value is fully determined here and\n * is materialised once into the node instead of being rebuilt on every eval.\n *\n * A ragged constant is rejected rather than padded: Excel refuses to accept\n * one at entry, so a file cannot legitimately contain it, and silently filling\n * the gaps would invent data the author never wrote.\n */\n #parseArrayLiteral(): FormulaNode {\n const open = this.#advance(); // '{'\n const rows: FormulaValue[][] = [];\n let row: FormulaValue[] = [];\n\n for (;;) {\n row.push(this.#parseArrayElement());\n\n if (this.#current.type === TokenType.Comma) { this.#advance(); continue; }\n if (this.#current.type === TokenType.Semicolon) {\n this.#advance();\n rows.push(row);\n row = [];\n continue;\n }\n break;\n }\n rows.push(row);\n this.#expect(TokenType.RightBrace);\n\n const cols = rows[0]!.length;\n if (rows.some(r => r.length !== cols)) {\n throw new FormulaException(\n `Array constant at position ${open.position} has rows of differing lengths.`,\n );\n }\n\n const array = new ArrayValue(rows.length, cols);\n for (let r = 0; r < rows.length; r++) {\n for (let c = 0; c < cols; c++) array.set(r, c, rows[r]![c]!);\n }\n return new ArrayLiteralNode(array);\n }\n\n /** One element of an array constant: a literal, optionally signed. */\n #parseArrayElement(): FormulaValue {\n let negate = false;\n let signed = false;\n while (this.#current.type === TokenType.Minus || this.#current.type === TokenType.Plus) {\n if (this.#current.type === TokenType.Minus) negate = !negate;\n signed = true;\n this.#advance();\n }\n\n const token = this.#advance();\n switch (token.type) {\n case TokenType.Number: {\n const n = parseFloat(token.value);\n if (isNaN(n)) throw new FormulaException(`Invalid number: ${token.value}`);\n return FormulaValue.number(negate ? -n : n);\n }\n case TokenType.String:\n if (signed) break;\n return FormulaValue.text(token.value);\n case TokenType.Boolean:\n if (signed) break;\n return FormulaValue.boolean(token.value === 'TRUE');\n case TokenType.ErrorLiteral:\n if (signed) break;\n return FormulaValue.error(FormulaValue.errorFromString(token.value));\n default:\n break;\n }\n throw new FormulaException(\n `Array constants accept only literal values; got '${token.value}' at position ${token.position}.`,\n );\n }\n\n #parseFunction(): FormulaNode {\n const nameToken = this.#advance();\n this.#expect(TokenType.LeftParen);\n return new FunctionCallNode(nameToken.value.toUpperCase(), this.#parseArgList());\n }\n\n /** Parses a comma-separated argument list up to and including the ')'. */\n #parseArgList(): FormulaNode[] {\n const args: FormulaNode[] = [];\n\n if (this.#current.type !== TokenType.RightParen) {\n // First arg — may be blank if leading comma\n if (this.#current.type === TokenType.Comma) {\n args.push(new BlankNode());\n } else {\n args.push(this.#parseComparison());\n }\n\n while (this.#current.type === TokenType.Comma) {\n this.#advance(); // consume comma\n if (\n this.#current.type === TokenType.Comma ||\n this.#current.type === TokenType.RightParen\n ) {\n args.push(new BlankNode());\n } else {\n args.push(this.#parseComparison());\n }\n }\n }\n\n this.#expect(TokenType.RightParen);\n return args;\n }\n}\n\n/**\n * Reads one half of a possible whole-column/whole-row reference: `A`, `$AB`, or\n * a row number. Returns null for anything else — including a column past the\n * sheet's last (`ZZZZ:ZZZZ`) or a row past 1,048,576 — so an out-of-range\n * reference stays a parse error instead of quietly clamping to a valid region.\n */\nfunction classifyBound(text: string): { kind: 'col' | 'row'; index: number } | null {\n const bare = text.replace(/\\$/g, '');\n // The kind follows from the shape: all digits is a row, one to three letters\n // is a column. Nothing else — including a real cell reference like `A1` — can\n // be one half of a whole-column/whole-row range.\n if (/^\\d+$/.test(bare)) {\n const row = parseInt(bare, 10);\n return row >= 1 && row <= EXCEL_MAX_ROWS ? { kind: 'row', index: row } : null;\n }\n if (/^[A-Za-z]{1,3}$/.test(bare)) {\n const col = columnNumber(bare.toUpperCase());\n return col >= 1 && col <= EXCEL_MAX_COLUMNS ? { kind: 'col', index: col } : null;\n }\n return null;\n}\n\nfunction comparisonOp(type: TokenType): BinaryOperator | null {\n switch (type) {\n case TokenType.Equal: return BinaryOperator.Equal;\n case TokenType.NotEqual: return BinaryOperator.NotEqual;\n case TokenType.LessThan: return BinaryOperator.LessThan;\n case TokenType.LessThanOrEqual: return BinaryOperator.LessThanOrEqual;\n case TokenType.GreaterThan: return BinaryOperator.GreaterThan;\n case TokenType.GreaterThanOrEqual: return BinaryOperator.GreaterThanOrEqual;\n default: return null;\n }\n}\n","/**\n * Position index over a criteria range, for the equality case.\n *\n * The problem. `SUMIFS($H$4:$H$294, $W$4:$W$294, $W282)` filled down 291 rows\n * scans the same 291-cell criteria range 291 times, once per row, because each\n * row asks about a different criterion. That is O(rows × range) comparisons —\n * quadratic in the size of one perfectly ordinary block of a spreadsheet, and\n * the range memo cannot help, because the *reading* is already cached; it is the\n * *comparing* that repeats.\n *\n * The observation. Across those 291 formulas the criteria range is one and the\n * same array, and only the criterion varies. So invert it once: group the\n * positions by value, and each formula becomes a lookup instead of a scan.\n *\n * Where the index lives. Keyed off the ArrayValue itself in a WeakMap, not off\n * (sheet, rectangle). That is deliberate: the array handed out by the range memo\n * is a stable object for exactly as long as its contents are valid, and the memo\n * drops it the moment a cell inside it is written. Hanging the index on that\n * object gives it the same lifetime for free — there is no second invalidation\n * path to keep in step with the first, which is where a cache of a cache would\n * normally go wrong. An uncached array (a literal, a function result) simply gets\n * an index that dies with it.\n *\n * Equivalence with scanning. Three criteria shapes are indexed, and each is\n * matched here exactly the way {@link FormulaHelper.compileCriteria} would:\n *\n * - `equalsText` compares `value.asText().toUpperCase()`, so the map is keyed by\n * that same string for every value, whatever its type.\n * - `equalsNumber` uses `FormulaValue.areEqual`, which matches numeric cells\n * within a 1e-10 tolerance and blank cells when the criterion is itself within\n * tolerance of zero. An exact-value map would miss the tolerance, so distinct\n * numeric values are also kept sorted: a lookup takes the window\n * [c − 1e-10, c + 1e-10] by binary search, which finds every value a scan\n * would and nothing else.\n * - `compareNumber` (`\">5\"`, `\"<=0\"`) uses `FormulaValue.compare`, which has **no**\n * tolerance and ranks by value class before looking inside it. So the numbers\n * form an exact interval, and each other class gets a single verdict — see\n * {@link comparePositions}.\n *\n * Not indexed: `<>` (its match set is nearly the whole range), wildcards\n * (per-value regex), and comparisons against text (text-against-text is\n * per-value, with no class-level uniformity to exploit). Those scan, as before.\n *\n * None of this is trusted on argument alone: `consistency.fuzz.test.ts` compares\n * the positions returned here against a scan, position for position, over\n * randomly generated ranges and criteria — including the tolerance boundary,\n * blanks, errors and mixed types.\n */\nimport { FormulaValue, ArrayValue } from './formula-value.js';\nimport type { FormulaHelper } from './function-registry.js';\n\n/** Matches the tolerance in {@link FormulaValue.areEqual}. */\nconst EPSILON = 1e-10;\n\ninterface Index {\n /** `value.asText().toUpperCase()` → positions, over every value in the array. */\n readonly byText: Map<string, number[]>;\n /** Exact numeric value → positions, for values of kind `number` only. */\n readonly byNumber: Map<number, number[]>;\n /** The distinct numeric values, ascending, for windows and intervals. */\n readonly sortedNumbers: Float64Array;\n /**\n * Running total of positions across `sortedNumbers`: `cumulative[k]` is how many\n * positions the first `k` distinct values hold. It makes the size of an interval\n * a subtraction, so a comparison that would match most of the range can be\n * declined before anything is built rather than half way through building it.\n */\n readonly cumulative: Int32Array;\n /**\n * Positions grouped by value class, for the comparison case. Against a numeric\n * criterion every member of a class gets the same verdict, so one test on one\n * representative decides the whole group — see {@link matchingPositions}.\n */\n readonly classes: readonly ClassGroup[];\n}\n\n/**\n * One value class, with a member kept as the representative. Every member of a\n * class answers a numeric comparison the same way, so testing the representative\n * decides the group — and using a real member rather than a synthesised one means\n * there is no assumption about the class to get wrong.\n */\ninterface ClassGroup {\n readonly positions: number[];\n readonly representative: FormulaValue;\n}\n\n/**\n * Built indexes, alive only as long as the array they describe. Nothing else\n * references them, so a dropped range takes its index with it.\n */\nconst indexes = new WeakMap<ArrayValue, Index>();\n\nfunction build(arr: ArrayValue): Index {\n const byText = new Map<string, number[]>();\n const byNumber = new Map<number, number[]>();\n // Non-numeric values, grouped by class, each keeping its first member.\n const classes = new Map<string, { positions: number[]; representative: FormulaValue }>();\n const addToClass = (kind: string, v: FormulaValue, i: number): void => {\n const group = classes.get(kind);\n if (group) group.positions.push(i);\n else classes.set(kind, { positions: [i], representative: v });\n };\n\n let i = 0;\n for (const v of arr.values()) {\n const textKey = v.asText().toUpperCase();\n const atText = byText.get(textKey);\n if (atText) atText.push(i); else byText.set(textKey, [i]);\n\n if (v.isNumber) {\n const n = v.numberValue;\n const atNum = byNumber.get(n);\n if (atNum) atNum.push(i); else byNumber.set(n, [i]);\n } else {\n addToClass(v.kind, v, i);\n }\n i++;\n }\n\n const sortedNumbers = Float64Array.from(byNumber.keys()).sort();\n const cumulative = new Int32Array(sortedNumbers.length + 1);\n for (let k = 0; k < sortedNumbers.length; k++) {\n cumulative[k + 1] = cumulative[k]! + byNumber.get(sortedNumbers[k]!)!.length;\n }\n return { byText, byNumber, sortedNumbers, cumulative, classes: [...classes.values()] };\n}\n\n/**\n * The index for an array, building it on first use.\n *\n * Building costs one pass; it pays for itself as soon as two formulas ask about\n * the same range, which is the situation this exists for. Ranges too small to\n * benefit are rejected by the caller, not here.\n */\nfunction indexOf(arr: ArrayValue): Index {\n let idx = indexes.get(arr);\n if (!idx) {\n idx = build(arr);\n indexes.set(arr, idx);\n }\n return idx;\n}\n\n/** First position in `sorted` with a value ≥ `target`. */\nfunction lowerBound(sorted: Float64Array, target: number): number {\n let lo = 0, hi = sorted.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (sorted[mid]! < target) lo = mid + 1; else hi = mid;\n }\n return lo;\n}\n\n/** First position in `sorted` with a value > `target`. */\nfunction upperBound(sorted: Float64Array, target: number): number {\n let lo = 0, hi = sorted.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (sorted[mid]! <= target) lo = mid + 1; else hi = mid;\n }\n return lo;\n}\n\n/**\n * The positions of an equality criterion within a criteria range, or null when\n * the caller should scan instead.\n *\n * Returns null — rather than an empty result — whenever the index cannot answer\n * the question: an unsupported criteria shape, or a range small enough that\n * building an index would cost more than the scan it saves. A null is always\n * safe; a wrong list of positions is a silently wrong total.\n */\nexport function matchingPositions(\n criteriaRange: FormulaValue,\n criteria: FormulaHelper.CompiledCriteria,\n minSize: number,\n): readonly number[] | null {\n if (!criteriaRange.isArray) return null;\n const arr = criteriaRange.arrayVal;\n // Below this the scan is cheaper than the bookkeeping — and a one-shot formula\n // would pay for an index nothing else reads.\n if (arr.length < minSize) return null;\n\n if (criteria.kind === 'equalsText') {\n return indexOf(arr).byText.get(criteria.text!) ?? EMPTY;\n }\n\n if (criteria.kind === 'equalsNumber') {\n const target = criteria.number!;\n const idx = indexOf(arr);\n\n // Exact hit first: the overwhelmingly common case, one map lookup.\n const exact = idx.byNumber.get(target);\n\n // Then anything else inside the tolerance window. Usually nothing, so this\n // costs a binary search and one comparison.\n let near: number[] | undefined;\n const { sortedNumbers } = idx;\n for (let k = lowerBound(sortedNumbers, target - EPSILON); k < sortedNumbers.length; k++) {\n const value = sortedNumbers[k]!;\n if (value > target + EPSILON) break;\n if (value === target) continue; // already covered by the exact hit\n // Confirm with the same predicate a scan would use, so the window can\n // never widen the match set.\n if (!criteria.test(FormulaValue.number(value))) continue;\n (near ??= []).push(...idx.byNumber.get(value)!);\n }\n\n // A blank cell matches a numeric criterion only when the criterion is zero\n // (within tolerance) — exactly what areEqual does for a blank.\n const blanks = criteria.test(FormulaValue.blank) ? blankPositions(idx) : undefined;\n\n if (!near && !blanks?.length) return exact ?? EMPTY;\n const merged = [...(exact ?? EMPTY), ...(near ?? EMPTY), ...(blanks ?? EMPTY)];\n merged.sort((a, b) => a - b);\n return merged;\n }\n\n if (criteria.kind === 'compareNumber') {\n return comparePositions(indexOf(arr), criteria, arr.length);\n }\n\n return null;\n}\n\n/**\n * Positions matching a comparison against a number (`\">5\"`, `\"<=0\"`).\n *\n * Two parts, and the split is exactly Excel's own comparison rule:\n *\n * - **Numbers** form an interval. `FormulaValue.compare` subtracts, with no\n * tolerance anywhere — unlike equality — so the interval boundary is an exact\n * binary search over the distinct values. Applying the equality epsilon here\n * would silently widen the match by one value at the boundary.\n * - **Every other class gets one verdict.** `compare` ranks by class before\n * looking inside it (number/blank < text < boolean), so against a numeric\n * criterion all text values compare the same way, all booleans do, blanks\n * compare as zero, and errors compare as zero. One test on one representative\n * settles each group — which is why a *text* criterion is not handled here:\n * text-against-text is per-value, with no uniformity to exploit.\n *\n * Returns null when the match set is more than half the range: building a long\n * list then walking it is worse than the dense scan it would replace, and an\n * index that makes things slower is not worth having.\n */\nfunction comparePositions(\n idx: Index,\n criteria: FormulaHelper.CompiledCriteria,\n length: number,\n): readonly number[] | null {\n const target = criteria.number!;\n const { sortedNumbers } = idx;\n\n // The slice of distinct numeric values the operator admits.\n let from = 0;\n let to = sortedNumbers.length; // exclusive\n switch (criteria.op) {\n case '>': from = upperBound(sortedNumbers, target); break;\n case '>=': from = lowerBound(sortedNumbers, target); break;\n case '<': to = lowerBound(sortedNumbers, target); break;\n default: to = upperBound(sortedNumbers, target); break; // '<='\n }\n\n // Decide before building. One test per non-numeric class settles that class, and\n // the numeric interval's size is a subtraction, so declining costs O(log n)\n // rather than half a list — a criterion like \">-1\", which matches everything,\n // used to pay for a list it then threw away.\n const budget = length >> 1;\n const matchedClasses = idx.classes.filter(g => criteria.test(g.representative));\n let total = idx.cumulative[to]! - idx.cumulative[from]!;\n for (const group of matchedClasses) total += group.positions.length;\n if (total > budget) return null;\n\n const positions: number[] = [];\n for (let k = from; k < to; k++) {\n for (const i of idx.byNumber.get(sortedNumbers[k]!)!) positions.push(i);\n }\n for (const group of matchedClasses) {\n for (const i of group.positions) positions.push(i);\n }\n\n positions.sort((a, b) => a - b);\n return positions;\n}\n\n/** The positions holding a blank, or none. */\nfunction blankPositions(idx: Index): number[] | undefined {\n return idx.classes.find(g => g.representative.isBlank)?.positions;\n}\n\nconst EMPTY: readonly number[] = [];\n","/**\n * Mathematical and aggregate Excel functions.\n * Port of TVE.PureDocs.Excel.Formulas.MathFunctions (C#)\n */\nimport { FormulaValue } from '../formula-value.js';\nimport { matchingPositions } from '../criteria-index.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerMath(r: FunctionRegistry): void {\n r.register('SUM', sum, 1);\n r.register('AVERAGE', average, 1);\n r.register('MIN', min, 1);\n r.register('MAX', max, 1);\n r.register('COUNT', count, 1);\n r.register('COUNTA', countA, 1);\n r.register('COUNTBLANK', countBlank, 1, 1);\n r.register('COUNTIF', countIf, 2, 2);\n r.register('COUNTIFS', countIfs, 2);\n r.register('SUMIF', sumIf, 2, 3);\n r.register('SUMIFS', sumIfs, 3);\n r.register('AVERAGEIF', averageIf, 2, 3);\n r.register('AVERAGEIFS', averageIfs, 3);\n r.register('PRODUCT', product, 1);\n r.register('SUMPRODUCT', sumProduct, 1);\n r.register('SUMSQ', sumSq, 1);\n r.register('ABS', abs, 1, 1);\n r.register('ROUND', round, 2, 2);\n r.register('ROUNDUP', roundUp, 2, 2);\n r.register('ROUNDDOWN', roundDown, 2, 2);\n r.register('CEILING', ceiling, 2, 2);\n r.register('CEILING.MATH', ceiling, 2, 2);\n r.register('FLOOR', floor, 2, 2);\n r.register('FLOOR.MATH', floor, 2, 2);\n r.register('INT', int_, 1, 1);\n r.register('TRUNC', trunc, 1, 2);\n r.register('MOD', mod, 2, 2);\n r.register('QUOTIENT', quotient, 2, 2);\n r.register('POWER', power, 2, 2);\n r.register('SQRT', sqrt, 1, 1);\n r.register('SIGN', sign, 1, 1);\n r.register('PI', pi, 0, 0);\n r.register('RAND', rand, 0, 0, true);\n r.register('RANDBETWEEN', randBetween, 2, 2, true);\n r.register('LOG', log, 1, 2);\n r.register('LOG10', log10, 1, 1);\n r.register('LN', ln, 1, 1);\n r.register('EXP', exp, 1, 1);\n r.register('FACT', fact, 1, 1);\n r.register('COMBIN', combin, 2, 2);\n // Trigonometry\n r.register('SIN', unary(Math.sin), 1, 1);\n r.register('COS', unary(Math.cos), 1, 1);\n r.register('TAN', unary(Math.tan), 1, 1);\n r.register('ASIN', asin, 1, 1);\n r.register('ACOS', acos, 1, 1);\n r.register('ATAN', unary(Math.atan), 1, 1);\n r.register('ATAN2', atan2, 2, 2);\n r.register('SINH', unary(Math.sinh), 1, 1);\n r.register('COSH', unary(Math.cosh), 1, 1);\n r.register('TANH', unary(Math.tanh), 1, 1);\n r.register('DEGREES', unary(r2d => (r2d * 180) / Math.PI), 1, 1);\n r.register('RADIANS', unary(d => (d * Math.PI) / 180), 1, 1);\n}\n\n// ── Multi-criteria aggregates (SUMIFS/COUNTIFS/AVERAGEIFS) ────────────────────\n\n/** Value at flat index i of a value that may be a scalar or an array. */\nfunction valueAt(v: FormulaValue, i: number): FormulaValue {\n return v.isArray ? v.arrayVal.getFlat(i) : v;\n}\n\n/** Flat length of a value that may be a scalar or an array. */\nfunction lengthOf(v: FormulaValue): number {\n return v.isArray ? v.arrayVal.length : 1;\n}\n\n/**\n * Below this many cells a criteria range is scanned rather than indexed: the\n * index costs a pass plus a sort, which only pays back when several formulas ask\n * about the same range.\n */\nconst INDEX_MIN_RANGE = 32;\n\n/**\n * The set of positions a criteria list selects.\n *\n * Two shapes, because the two cost different things to consume. `positions` is a\n * short list of matches, which the aggregation walks directly — the point of\n * indexing is lost if the caller still touches every cell of the range. `mask` is\n * the dense fallback for criteria that select a *range* of values (`\">5\"`,\n * wildcards) and therefore have no short list to offer.\n */\ntype Selection =\n | { readonly ok: true; readonly positions: readonly number[] }\n | { readonly ok: true; readonly mask: Uint8Array }\n | { readonly ok: false; readonly error: FormulaValue };\n\n/**\n * Resolves the criteria pairs (criteria_range, criteria) starting at `startIdx`\n * into the positions that satisfy all of them, over `len` positions.\n *\n * Strategy, in the order it matters:\n *\n * 1. Each criterion is compiled once. It used to be re-parsed — regex, number\n * conversion, sometimes a fresh RegExp — for every cell of every range.\n * 2. If any pair is an equality criterion over a large enough range, its\n * matching positions come from an index instead of a scan, and every\n * remaining pair then only has to filter that short list. A `SUMIFS` filled\n * down a block goes from O(rows × range) to O(rows × matches).\n * 3. Only when no pair can be indexed does this fall back to the dense mask.\n *\n * Pairs are still evaluated strictly in order and the first error wins, so error\n * reporting is unchanged by any of the above.\n */\nfunction resolveIfsSelection(a: Args, c: Ctx, startIdx: number, len: number): Selection {\n const ranges: FormulaValue[] = [];\n const criteria: FormulaHelper.CompiledCriteria[] = [];\n let seed: readonly number[] | undefined;\n let seedPair = -1;\n\n for (let p = startIdx; p + 1 < a.length; p += 2) {\n const cr = a[p]!.evaluate(c);\n if (cr.isError) return { ok: false, error: cr };\n const crit = a[p + 1]!.evaluate(c);\n if (crit.isError) return { ok: false, error: crit };\n\n const compiled = FormulaHelper.compileCriteria(crit.asText());\n ranges.push(cr);\n criteria.push(compiled);\n\n if (seed === undefined) {\n const positions = matchingPositions(cr, compiled, INDEX_MIN_RANGE);\n if (positions) {\n seed = positions;\n seedPair = ranges.length - 1;\n }\n }\n }\n\n if (seed !== undefined) {\n // Candidates from the index, then narrowed by the other pairs. `len` bounds\n // it because the criteria range may be longer than the range being summed.\n let candidates: number[] = [];\n for (const i of seed) if (i < len) candidates.push(i);\n\n for (let k = 0; k < ranges.length && candidates.length > 0; k++) {\n if (k === seedPair) continue;\n const range = ranges[k]!;\n const test = criteria[k]!.test;\n const next: number[] = [];\n for (const i of candidates) if (test(valueAt(range, i))) next.push(i);\n candidates = next;\n }\n return { ok: true, positions: candidates };\n }\n\n const mask = new Uint8Array(len).fill(1);\n for (let k = 0; k < ranges.length; k++) {\n const range = ranges[k]!;\n const test = criteria[k]!.test;\n for (let i = 0; i < len; i++) {\n if (!mask[i]) continue;\n if (!test(valueAt(range, i))) mask[i] = 0;\n }\n }\n return { ok: true, mask };\n}\n\n/** Calls `visit` for each selected position, whichever shape the selection is. */\nfunction forEachSelected(\n sel: { readonly positions: readonly number[] } | { readonly mask: Uint8Array },\n len: number,\n visit: (i: number) => void,\n): void {\n if ('positions' in sel) {\n for (const i of sel.positions) visit(i);\n return;\n }\n const { mask } = sel;\n for (let i = 0; i < len; i++) if (mask[i]) visit(i);\n}\n\nfunction sumIfs(a: Args, c: Ctx): FormulaValue {\n // sum_range, (criteria_range, criteria)+ → 1 + 2k args (odd, ≥ 3)\n if (a.length < 3 || a.length % 2 === 0) return FormulaValue.errorValue;\n const sumRange = a[0]!.evaluate(c);\n if (sumRange.isError) return sumRange;\n const len = lengthOf(sumRange);\n const sel = resolveIfsSelection(a, c, 1, len);\n if (!sel.ok) return sel.error;\n\n let total = 0;\n forEachSelected(sel, len, i => {\n const r = valueAt(sumRange, i).tryAsDouble();\n if (r.ok) total += r.value;\n });\n return FormulaValue.number(total);\n}\n\nfunction countIfs(a: Args, c: Ctx): FormulaValue {\n // (criteria_range, criteria)+ → 2k args (even, ≥ 2)\n if (a.length < 2 || a.length % 2 !== 0) return FormulaValue.errorValue;\n const first = a[0]!.evaluate(c);\n if (first.isError) return first;\n const len = lengthOf(first);\n const sel = resolveIfsSelection(a, c, 0, len);\n if (!sel.ok) return sel.error;\n\n let n = 0;\n forEachSelected(sel, len, () => { n++; });\n return FormulaValue.number(n);\n}\n\nfunction averageIfs(a: Args, c: Ctx): FormulaValue {\n // average_range, (criteria_range, criteria)+ → 1 + 2k args (odd, ≥ 3)\n if (a.length < 3 || a.length % 2 === 0) return FormulaValue.errorValue;\n const avgRange = a[0]!.evaluate(c);\n if (avgRange.isError) return avgRange;\n const len = lengthOf(avgRange);\n const sel = resolveIfsSelection(a, c, 1, len);\n if (!sel.ok) return sel.error;\n\n let total = 0, cnt = 0;\n forEachSelected(sel, len, i => {\n const r = valueAt(avgRange, i).tryAsDouble();\n if (r.ok) { total += r.value; cnt++; }\n });\n return cnt === 0 ? FormulaValue.errorDiv0 : FormulaValue.number(total / cnt);\n}\n\nfunction sumSq(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n return FormulaValue.number(r.values.reduce((s, n) => s + n * n, 0));\n}\n\n// ── Trigonometry ─────────────────────────────────────────────────────────────\n\n/** Wraps a single-argument Math function into a formula handler. */\nfunction unary(fn: (x: number) => number): (a: Args, c: Ctx) => FormulaValue {\n return (a, c) => {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n return r.ok ? FormulaValue.number(fn(r.value)) : r.error;\n };\n}\n\nfunction asin(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n if (!r.ok) return r.error;\n if (r.value < -1 || r.value > 1) return FormulaValue.errorNum;\n return FormulaValue.number(Math.asin(r.value));\n}\n\nfunction acos(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n if (!r.ok) return r.error;\n if (r.value < -1 || r.value > 1) return FormulaValue.errorNum;\n return FormulaValue.number(Math.acos(r.value));\n}\n\nfunction atan2(a: Args, c: Ctx): FormulaValue {\n // Excel ATAN2(x, y) — note the reversed argument order vs Math.atan2(y, x).\n const x = FormulaHelper.evalDouble(a[0]!, c);\n if (!x.ok) return x.error;\n const y = FormulaHelper.evalDouble(a[1]!, c);\n if (!y.ok) return y.error;\n if (x.value === 0 && y.value === 0) return FormulaValue.errorDiv0;\n return FormulaValue.number(Math.atan2(y.value, x.value));\n}\n\n// ── Aggregates ─────────────────────────────────────────────────────────────\n\nfunction sum(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n return FormulaValue.number(r.values.reduce((s, n) => s + n, 0));\n}\n\nfunction average(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length === 0) return FormulaValue.errorDiv0;\n return FormulaValue.number(r.values.reduce((s, n) => s + n, 0) / r.values.length);\n}\n\nfunction min(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n return r.values.length === 0 ? FormulaValue.zero : FormulaValue.number(Math.min(...r.values));\n}\n\nfunction max(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n return r.values.length === 0 ? FormulaValue.zero : FormulaValue.number(Math.max(...r.values));\n}\n\nfunction count(a: Args, c: Ctx): FormulaValue {\n const flat = FormulaHelper.flattenArgs(a, c);\n let n = 0;\n for (const v of flat) {\n if (v.isNumber || (v.isText && !isNaN(parseFloat(v.textValue)))) n++;\n }\n return FormulaValue.number(n);\n}\n\nfunction countA(a: Args, c: Ctx): FormulaValue {\n return FormulaValue.number(FormulaHelper.flattenArgs(a, c).filter(v => !v.isBlank).length);\n}\n\nfunction countBlank(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n if (!v.isArray) return FormulaValue.number(v.isBlank ? 1 : 0);\n let n = 0;\n for (const item of v.arrayVal.values()) if (item.isBlank) n++;\n return FormulaValue.number(n);\n}\n\nfunction countIf(a: Args, c: Ctx): FormulaValue {\n const range = a[0]!.evaluate(c);\n if (range.isError) return range;\n const crit = a[1]!.evaluate(c);\n if (crit.isError) return crit;\n const criteria = crit.asText();\n\n if (!range.isArray) return FormulaValue.number(FormulaHelper.matchesCriteria(range, criteria) ? 1 : 0);\n let n = 0;\n for (const item of range.arrayVal.values()) {\n if (!item.isBlank && FormulaHelper.matchesCriteria(item, criteria)) n++;\n }\n return FormulaValue.number(n);\n}\n\nfunction sumIf(a: Args, c: Ctx): FormulaValue {\n const range = a[0]!.evaluate(c);\n if (range.isError) return range;\n const crit = a[1]!.evaluate(c);\n if (crit.isError) return crit;\n const criteria = crit.asText();\n\n const sumRange = a.length > 2 ? a[2]!.evaluate(c) : range;\n if (sumRange.isError) return sumRange;\n\n if (!range.isArray) {\n if (FormulaHelper.matchesCriteria(range, criteria)) {\n const r = sumRange.tryAsDouble();\n return r.ok ? FormulaValue.number(r.value) : FormulaValue.zero;\n }\n return FormulaValue.zero;\n }\n\n const rangeArr = range.arrayVal;\n const sumArr = sumRange.isArray ? sumRange.arrayVal : null;\n let total = 0;\n\n for (let i = 0; i < rangeArr.length; i++) {\n const rv = rangeArr.getFlat(i);\n if (rv.isBlank) continue;\n if (FormulaHelper.matchesCriteria(rv, criteria)) {\n const sv = sumArr ? sumArr.getFlat(i) : rangeArr.getFlat(i);\n const r = sv.tryAsDouble();\n if (r.ok) total += r.value;\n }\n }\n return FormulaValue.number(total);\n}\n\nfunction averageIf(a: Args, c: Ctx): FormulaValue {\n const range = a[0]!.evaluate(c);\n if (range.isError) return range;\n const crit = a[1]!.evaluate(c);\n if (crit.isError) return crit;\n const criteria = crit.asText();\n const avgRange = a.length > 2 ? a[2]!.evaluate(c) : range;\n if (avgRange.isError) return avgRange;\n\n if (!range.isArray) {\n if (!FormulaHelper.matchesCriteria(range, criteria)) return FormulaValue.errorDiv0;\n const r = avgRange.tryAsDouble();\n return r.ok ? FormulaValue.number(r.value) : FormulaValue.errorDiv0;\n }\n\n const rangeArr = range.arrayVal;\n const avgArr = avgRange.isArray ? avgRange.arrayVal : null;\n let total = 0, cnt = 0;\n\n for (let i = 0; i < rangeArr.length; i++) {\n const rv = rangeArr.getFlat(i);\n if (rv.isBlank) continue;\n if (FormulaHelper.matchesCriteria(rv, criteria)) {\n const sv = avgArr ? avgArr.getFlat(i) : rangeArr.getFlat(i);\n const r = sv.tryAsDouble();\n if (r.ok) { total += r.value; cnt++; }\n }\n }\n return cnt === 0 ? FormulaValue.errorDiv0 : FormulaValue.number(total / cnt);\n}\n\nfunction product(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n return FormulaValue.number(r.values.reduce((p, n) => p * n, 1));\n}\n\nfunction sumProduct(a: Args, c: Ctx): FormulaValue {\n const arrays = a.map(arg => arg.evaluate(c));\n for (const v of arrays) if (v.isError) return v;\n\n const first = arrays[0]!;\n const len = first.isArray ? first.arrayVal.length : 1;\n let total = 0;\n\n for (let i = 0; i < len; i++) {\n let prod = 1;\n for (const v of arrays) {\n const item = v.isArray ? v.arrayVal.getFlat(i) : v;\n const r = item.tryAsDouble();\n if (!r.ok) { prod = 0; break; }\n prod *= r.value;\n }\n total += prod;\n }\n return FormulaValue.number(total);\n}\n\n// ── Single-arg math ────────────────────────────────────────────────────────\n\nfunction abs(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n return r.ok ? FormulaValue.number(Math.abs(r.value)) : r.error;\n}\n\nfunction round(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const d = FormulaHelper.evalDouble(a[1]!, c);\n if (!d.ok) return d.error;\n const factor = Math.pow(10, Math.round(d.value));\n return FormulaValue.number(Math.round(n.value * factor) / factor);\n}\n\nfunction roundUp(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const d = FormulaHelper.evalDouble(a[1]!, c);\n if (!d.ok) return d.error;\n const factor = Math.pow(10, Math.round(d.value));\n return FormulaValue.number(Math.ceil(n.value * factor) / factor);\n}\n\nfunction roundDown(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const d = FormulaHelper.evalDouble(a[1]!, c);\n if (!d.ok) return d.error;\n const factor = Math.pow(10, Math.round(d.value));\n return FormulaValue.number(Math.floor(n.value * factor) / factor);\n}\n\nfunction ceiling(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const s = FormulaHelper.evalDouble(a[1]!, c);\n if (!s.ok) return s.error;\n if (s.value === 0) return FormulaValue.zero;\n return FormulaValue.number(Math.ceil(n.value / s.value) * s.value);\n}\n\nfunction floor(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const s = FormulaHelper.evalDouble(a[1]!, c);\n if (!s.ok) return s.error;\n if (s.value === 0) return FormulaValue.zero;\n return FormulaValue.number(Math.floor(n.value / s.value) * s.value);\n}\n\nfunction int_(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n return r.ok ? FormulaValue.number(Math.floor(r.value)) : r.error;\n}\n\nfunction trunc(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n let digits = 0;\n if (a.length > 1) {\n const d = FormulaHelper.evalDouble(a[1]!, c);\n if (!d.ok) return d.error;\n digits = Math.round(d.value);\n }\n const factor = Math.pow(10, digits);\n return FormulaValue.number(Math.trunc(n.value * factor) / factor);\n}\n\nfunction mod(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const d = FormulaHelper.evalDouble(a[1]!, c);\n if (!d.ok) return d.error;\n if (d.value === 0) return FormulaValue.errorDiv0;\n return FormulaValue.number(n.value - d.value * Math.floor(n.value / d.value));\n}\n\nfunction quotient(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const d = FormulaHelper.evalDouble(a[1]!, c);\n if (!d.ok) return d.error;\n if (d.value === 0) return FormulaValue.errorDiv0;\n return FormulaValue.number(Math.trunc(n.value / d.value));\n}\n\nfunction power(a: Args, c: Ctx): FormulaValue {\n const b = FormulaHelper.evalDouble(a[0]!, c);\n if (!b.ok) return b.error;\n const e = FormulaHelper.evalDouble(a[1]!, c);\n if (!e.ok) return e.error;\n return FormulaValue.number(Math.pow(b.value, e.value));\n}\n\nfunction sqrt(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n if (!r.ok) return r.error;\n if (r.value < 0) return FormulaValue.errorNum;\n return FormulaValue.number(Math.sqrt(r.value));\n}\n\nfunction sign(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n return r.ok ? FormulaValue.number(Math.sign(r.value)) : r.error;\n}\n\nfunction pi(): FormulaValue { return FormulaValue.number(Math.PI); }\nfunction rand(): FormulaValue { return FormulaValue.number(Math.random()); }\n\nfunction randBetween(a: Args, c: Ctx): FormulaValue {\n const lo = FormulaHelper.evalDouble(a[0]!, c);\n if (!lo.ok) return lo.error;\n const hi = FormulaHelper.evalDouble(a[1]!, c);\n if (!hi.ok) return hi.error;\n return FormulaValue.number(Math.floor(lo.value + Math.random() * (hi.value - lo.value + 1)));\n}\n\nfunction log(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n if (n.value <= 0) return FormulaValue.errorNum;\n let base = 10;\n if (a.length > 1) {\n const b = FormulaHelper.evalDouble(a[1]!, c);\n if (!b.ok) return b.error;\n base = b.value;\n }\n if (base <= 0 || base === 1) return FormulaValue.errorNum;\n return FormulaValue.number(Math.log(n.value) / Math.log(base));\n}\n\nfunction log10(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n if (!r.ok) return r.error;\n if (r.value <= 0) return FormulaValue.errorNum;\n return FormulaValue.number(Math.log10(r.value));\n}\n\nfunction ln(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n if (!r.ok) return r.error;\n if (r.value <= 0) return FormulaValue.errorNum;\n return FormulaValue.number(Math.log(r.value));\n}\n\nfunction exp(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n return r.ok ? FormulaValue.number(Math.exp(r.value)) : r.error;\n}\n\nfunction fact(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n if (!r.ok) return r.error;\n const n = Math.round(r.value);\n if (n < 0) return FormulaValue.errorNum;\n if (n > 170) return FormulaValue.errorNum;\n let f = 1;\n for (let i = 2; i <= n; i++) f *= i;\n return FormulaValue.number(f);\n}\n\nfunction combin(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const k = FormulaHelper.evalDouble(a[1]!, c);\n if (!k.ok) return k.error;\n const N = Math.round(n.value);\n const K = Math.round(k.value);\n if (N < 0 || K < 0 || K > N) return FormulaValue.errorNum;\n // C(N,K) = N! / (K! * (N-K)!)\n let result = 1;\n for (let i = 0; i < K; i++) result = result * (N - i) / (i + 1);\n return FormulaValue.number(Math.round(result));\n}\n","/**\n * Text/string Excel functions.\n * Port of TVE.PureDocs.Excel.Formulas.TextFunctions (C#)\n */\nimport { fromOADate } from '@devmm/puredocs-excel';\nimport { FormulaValue } from '../formula-value.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerText(r: FunctionRegistry): void {\n r.register('LEFT', left, 1, 2);\n r.register('RIGHT', right, 1, 2);\n r.register('MID', mid, 3, 3);\n r.register('LEN', len, 1, 1);\n r.register('UPPER', upper, 1, 1);\n r.register('LOWER', lower, 1, 1);\n r.register('PROPER', proper, 1, 1);\n r.register('TRIM', trim, 1, 1);\n r.register('CLEAN', clean, 1, 1);\n r.register('SUBSTITUTE', substitute, 3, 4);\n r.register('REPLACE', replace, 4, 4);\n r.register('CONCATENATE', concatenate, 1);\n r.register('CONCAT', concatenate, 1);\n r.register('TEXTJOIN', textJoin, 3);\n r.register('TEXT', text_, 2, 2);\n r.register('VALUE', value, 1, 1);\n r.register('FIND', find, 2, 3);\n r.register('SEARCH', search, 2, 3);\n r.register('REPT', rept, 2, 2);\n r.register('EXACT', exact, 2, 2);\n r.register('CHAR', char_, 1, 1);\n r.register('CODE', code, 1, 1);\n r.register('T', t_, 1, 1);\n r.register('TEXTBEFORE', textBefore, 2, 3);\n r.register('TEXTAFTER', textAfter, 2, 3);\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction str(a: Args, c: Ctx, idx: number): { ok: true; s: string } | { ok: false; e: FormulaValue } {\n const r = FormulaHelper.evalString(a[idx]!, c);\n return r.ok ? { ok: true, s: r.value } : { ok: false, e: r.error };\n}\n\nfunction num(a: Args, c: Ctx, idx: number): { ok: true; n: number } | { ok: false; e: FormulaValue } {\n const r = FormulaHelper.evalDouble(a[idx]!, c);\n return r.ok ? { ok: true, n: r.value } : { ok: false, e: r.error };\n}\n\n// ── Implementations ──────────────────────────────────────────────────────────\n\nfunction left(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n let n = 1;\n if (a.length > 1) { const r = num(a, c, 1); if (!r.ok) return r.e; n = Math.round(r.n); }\n if (n < 0) return FormulaValue.errorValue;\n return FormulaValue.text(s.s.slice(0, n));\n}\n\nfunction right(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n let n = 1;\n if (a.length > 1) { const r = num(a, c, 1); if (!r.ok) return r.e; n = Math.round(r.n); }\n if (n < 0) return FormulaValue.errorValue;\n return FormulaValue.text(n >= s.s.length ? s.s : s.s.slice(-n));\n}\n\nfunction mid(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n const sv = num(a, c, 1); if (!sv.ok) return sv.e;\n const nv = num(a, c, 2); if (!nv.ok) return nv.e;\n const start = Math.round(sv.n) - 1;\n const count = Math.round(nv.n);\n if (start < 0 || count < 0) return FormulaValue.errorValue;\n return FormulaValue.text(s.s.slice(start, start + count));\n}\n\nfunction len(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n return FormulaValue.number(s.s.length);\n}\n\nfunction upper(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n return FormulaValue.text(s.s.toUpperCase());\n}\n\nfunction lower(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n return FormulaValue.text(s.s.toLowerCase());\n}\n\nfunction proper(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n let capitalise = true;\n let result = '';\n for (const ch of s.s) {\n result += capitalise ? ch.toUpperCase() : ch.toLowerCase();\n capitalise = !/[a-zA-Z]/.test(ch);\n }\n return FormulaValue.text(result);\n}\n\nfunction trim(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n // Excel TRIM removes leading/trailing spaces AND collapses internal spaces to one\n return FormulaValue.text(s.s.trim().replace(/\\s+/g, ' '));\n}\n\nfunction clean(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n return FormulaValue.text([...s.s].filter(ch => ch.charCodeAt(0) >= 32).join(''));\n}\n\nfunction substitute(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n const old = str(a, c, 1); if (!old.ok) return old.e;\n const nw = str(a, c, 2); if (!nw.ok) return nw.e;\n\n if (a.length > 3) {\n const iv = num(a, c, 3); if (!iv.ok) return iv.e;\n const inst = Math.round(iv.n);\n let count = 0, pos = 0, result = '';\n while (pos < s.s.length) {\n const idx = s.s.indexOf(old.s, pos);\n if (idx < 0) { result += s.s.slice(pos); break; }\n count++;\n if (count === inst) {\n result += s.s.slice(pos, idx) + nw.s;\n pos = idx + old.s.length;\n result += s.s.slice(pos);\n break;\n }\n result += s.s.slice(pos, idx + old.s.length);\n pos = idx + old.s.length;\n }\n return FormulaValue.text(result);\n }\n\n return FormulaValue.text(s.s.split(old.s).join(nw.s));\n}\n\nfunction replace(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n const sv = num(a, c, 1); if (!sv.ok) return sv.e;\n const nv = num(a, c, 2); if (!nv.ok) return nv.e;\n const nw = str(a, c, 3); if (!nw.ok) return nw.e;\n const start = Math.max(0, Math.round(sv.n) - 1);\n const count = Math.max(0, Math.round(nv.n));\n return FormulaValue.text(s.s.slice(0, start) + nw.s + s.s.slice(start + count));\n}\n\nfunction concatenate(a: Args, c: Ctx): FormulaValue {\n let result = '';\n for (const arg of a) {\n const v = arg.evaluate(c);\n if (v.isError) return v;\n result += v.asText();\n }\n return FormulaValue.text(result);\n}\n\nfunction textJoin(a: Args, c: Ctx): FormulaValue {\n const delim = str(a, c, 0); if (!delim.ok) return delim.e;\n const ignV = a[1]!.evaluate(c);\n if (ignV.isError) return ignV;\n const ignoreEmpty = ignV.coerceToBool().booleanValue;\n const parts: string[] = [];\n\n for (let i = 2; i < a.length; i++) {\n const v = a[i]!.evaluate(c);\n if (v.isError) return v;\n if (v.isArray) {\n for (const item of v.arrayVal.values()) {\n const t = item.asText();\n if (!ignoreEmpty || t !== '') parts.push(t);\n }\n } else {\n const t = v.asText();\n if (!ignoreEmpty || t !== '') parts.push(t);\n }\n }\n\n const result = parts.join(delim.s);\n if (result.length > 32767) return FormulaValue.errorValue;\n return FormulaValue.text(result);\n}\n\nfunction text_(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const f = str(a, c, 1); if (!f.ok) return f.e;\n // Map common Excel format codes to JS toLocaleString / toFixed patterns\n try {\n return FormulaValue.text(formatNumber(n.value, f.s));\n } catch {\n return FormulaValue.errorValue;\n }\n}\n\nfunction formatNumber(value: number, fmt: string): string {\n // Minimal Excel format code interpreter\n if (fmt === '0') return String(Math.round(value));\n if (fmt === '0.00') return value.toFixed(2);\n if (fmt === '#,##0') return Math.round(value).toLocaleString('en-US');\n if (fmt === '#,##0.00') return value.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n if (fmt === '0%') return `${Math.round(value * 100)}%`;\n if (fmt === '0.00%') return `${(value * 100).toFixed(2)}%`;\n // Date patterns — convert OADate back if it looks like a date format\n if (/[yYmMdD]/.test(fmt)) {\n try {\n const date = fromOADate(value);\n return date.toLocaleDateString();\n } catch { /* fall through */ }\n }\n return String(value);\n}\n\nfunction value(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n const n = parseFloat(s.s.replace(/,/g, '').replace(/%$/, (m) => { return m ? String(parseFloat(s.s) / 100) : ''; }));\n if (isNaN(n)) return FormulaValue.errorValue;\n return FormulaValue.number(n);\n}\n\nfunction find(a: Args, c: Ctx): FormulaValue {\n const needle = str(a, c, 0); if (!needle.ok) return needle.e;\n const haystack = str(a, c, 1); if (!haystack.ok) return haystack.e;\n let start = 0;\n if (a.length > 2) { const r = num(a, c, 2); if (!r.ok) return r.e; start = Math.round(r.n) - 1; }\n const idx = haystack.s.indexOf(needle.s, start);\n return idx < 0 ? FormulaValue.errorValue : FormulaValue.number(idx + 1);\n}\n\nfunction search(a: Args, c: Ctx): FormulaValue {\n const needle = str(a, c, 0); if (!needle.ok) return needle.e;\n const haystack = str(a, c, 1); if (!haystack.ok) return haystack.e;\n let start = 0;\n if (a.length > 2) { const r = num(a, c, 2); if (!r.ok) return r.e; start = Math.round(r.n) - 1; }\n const idx = haystack.s.toLowerCase().indexOf(needle.s.toLowerCase(), start);\n return idx < 0 ? FormulaValue.errorValue : FormulaValue.number(idx + 1);\n}\n\nfunction rept(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n const n = num(a, c, 1); if (!n.ok) return n.e;\n const count = Math.round(n.n);\n if (count < 0) return FormulaValue.errorValue;\n return FormulaValue.text(s.s.repeat(count));\n}\n\nfunction exact(a: Args, c: Ctx): FormulaValue {\n const s1 = str(a, c, 0); if (!s1.ok) return s1.e;\n const s2 = str(a, c, 1); if (!s2.ok) return s2.e;\n return FormulaValue.boolean(s1.s === s2.s);\n}\n\nfunction char_(a: Args, c: Ctx): FormulaValue {\n const r = num(a, c, 0); if (!r.ok) return r.e;\n const code = Math.round(r.n);\n if (code < 1 || code > 255) return FormulaValue.errorValue;\n return FormulaValue.text(String.fromCharCode(code));\n}\n\nfunction code(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n if (s.s.length === 0) return FormulaValue.errorValue;\n return FormulaValue.number(s.s.charCodeAt(0));\n}\n\nfunction t_(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n return v.isText ? v : FormulaValue.emptyString;\n}\n\n// TEXTBEFORE(text, delimiter, [instance_num]) — text before the nth delimiter.\n// TEXTAFTER(text, delimiter, [instance_num]) — text after the nth delimiter.\n// instance_num defaults to 1; a negative value counts occurrences from the end.\nfunction textBefore(a: Args, c: Ctx): FormulaValue { return textSplitAt(a, c, 'before'); }\nfunction textAfter(a: Args, c: Ctx): FormulaValue { return textSplitAt(a, c, 'after'); }\n\nfunction textSplitAt(a: Args, c: Ctx, mode: 'before' | 'after'): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n const d = str(a, c, 1); if (!d.ok) return d.e;\n let instance = 1;\n if (a.length > 2) { const r = num(a, c, 2); if (!r.ok) return r.e; instance = Math.trunc(r.n); }\n if (instance === 0) return FormulaValue.errorValue;\n\n const text = s.s;\n const delim = d.s;\n // Empty delimiter: BEFORE → \"\", AFTER → whole text (mirrors Excel).\n if (delim === '') {\n return FormulaValue.text(mode === 'before' ? '' : text);\n }\n\n // Collect all occurrence start positions.\n const positions: number[] = [];\n let from = 0;\n for (;;) {\n const idx = text.indexOf(delim, from);\n if (idx === -1) break;\n positions.push(idx);\n from = idx + delim.length;\n }\n if (positions.length === 0) return FormulaValue.errorNA;\n\n const nth = instance > 0 ? instance - 1 : positions.length + instance;\n if (nth < 0 || nth >= positions.length) return FormulaValue.errorNA;\n\n const pos = positions[nth]!;\n return FormulaValue.text(\n mode === 'before' ? text.slice(0, pos) : text.slice(pos + delim.length),\n );\n}\n","/**\n * Logical Excel functions.\n * Port of TVE.PureDocs.Excel.Formulas.LogicalFunctions (C#)\n */\nimport { FormulaValue, FormulaError } from '../formula-value.js';\nimport type { FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerLogical(r: FunctionRegistry): void {\n r.register('IF', if_, 2, 3);\n r.register('AND', and, 1);\n r.register('OR', or, 1);\n r.register('NOT', not, 1, 1);\n r.register('XOR', xor, 1);\n r.register('IFERROR', ifError, 2, 2);\n r.register('IFNA', ifNa, 2, 2);\n r.register('IFS', ifs, 2);\n r.register('SWITCH', switch_, 3);\n r.register('TRUE', trueFn, 0, 0);\n r.register('FALSE', falseFn, 0, 0);\n}\n\nfunction if_(a: Args, c: Ctx): FormulaValue {\n const cond = a[0]!.evaluate(c);\n if (cond.isError) return cond;\n const b = cond.coerceToBool();\n if (b.isError) return b;\n return b.booleanValue\n ? a[1]!.evaluate(c)\n : a.length > 2 ? a[2]!.evaluate(c) : FormulaValue.false_;\n}\n\nfunction and(a: Args, c: Ctx): FormulaValue {\n let hasValue = false;\n for (const arg of a) {\n const v = arg.evaluate(c);\n if (v.isError) return v;\n if (v.isArray) {\n for (const item of v.arrayVal.values()) {\n if (item.isBlank) continue;\n if (item.isError) return item;\n hasValue = true;\n const bv = item.coerceToBool();\n if (bv.isError) return bv;\n if (!bv.booleanValue) return FormulaValue.false_;\n }\n } else {\n if (v.isBlank) { hasValue = true; continue; }\n hasValue = true;\n const bv = v.coerceToBool();\n if (bv.isError) return bv;\n if (!bv.booleanValue) return FormulaValue.false_;\n }\n }\n return hasValue ? FormulaValue.true_ : FormulaValue.errorValue;\n}\n\nfunction or(a: Args, c: Ctx): FormulaValue {\n let hasValue = false;\n for (const arg of a) {\n const v = arg.evaluate(c);\n if (v.isError) return v;\n if (v.isArray) {\n for (const item of v.arrayVal.values()) {\n if (item.isBlank) continue;\n if (item.isError) return item;\n hasValue = true;\n const bv = item.coerceToBool();\n if (bv.isError) return bv;\n if (bv.booleanValue) return FormulaValue.true_;\n }\n } else {\n if (v.isBlank) { hasValue = true; continue; }\n hasValue = true;\n const bv = v.coerceToBool();\n if (bv.isError) return bv;\n if (bv.booleanValue) return FormulaValue.true_;\n }\n }\n return hasValue ? FormulaValue.false_ : FormulaValue.errorValue;\n}\n\nfunction not(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n if (v.isError) return v;\n const bv = v.coerceToBool();\n if (bv.isError) return bv;\n return FormulaValue.boolean(!bv.booleanValue);\n}\n\nfunction xor(a: Args, c: Ctx): FormulaValue {\n let trueCount = 0;\n for (const arg of a) {\n const v = arg.evaluate(c);\n if (v.isError) return v;\n const bv = v.coerceToBool();\n if (bv.isError) return bv;\n if (bv.booleanValue) trueCount++;\n }\n return FormulaValue.boolean(trueCount % 2 === 1);\n}\n\nfunction ifError(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n return v.isError ? a[1]!.evaluate(c) : v;\n}\n\nfunction ifNa(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n return v.isError && v.errorCode === FormulaError.NA ? a[1]!.evaluate(c) : v;\n}\n\nfunction ifs(a: Args, c: Ctx): FormulaValue {\n for (let i = 0; i + 1 < a.length; i += 2) {\n const cond = a[i]!.evaluate(c);\n if (cond.isError) return cond;\n const bv = cond.coerceToBool();\n if (bv.isError) return bv;\n if (bv.booleanValue) return a[i + 1]!.evaluate(c);\n }\n return FormulaValue.errorNA;\n}\n\nfunction switch_(a: Args, c: Ctx): FormulaValue {\n const expr = a[0]!.evaluate(c);\n if (expr.isError) return expr;\n for (let i = 1; i + 1 < a.length; i += 2) {\n const cv = a[i]!.evaluate(c);\n if (cv.isError) return cv;\n if (FormulaValue.areEqual(expr, cv)) return a[i + 1]!.evaluate(c);\n }\n // Default value: last arg when even count\n return a.length % 2 === 0 ? a[a.length - 1]!.evaluate(c) : FormulaValue.errorNA;\n}\n\nfunction trueFn(): FormulaValue { return FormulaValue.true_; }\nfunction falseFn(): FormulaValue { return FormulaValue.false_; }\n","/**\n * Date and time Excel functions.\n * Port of TVE.PureDocs.Excel.Formulas.DateFunctions (C#)\n */\nimport { FormulaValue } from '../formula-value.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\n// OADate helpers (same logic as core package, duplicated to avoid circular dep)\nconst OA_EPOCH_MS = Date.UTC(1899, 11, 30, 0, 0, 0, 0);\nconst MS_PER_DAY = 86_400_000;\n\nfunction toOA(date: Date): number {\n return (Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(),\n date.getHours(), date.getMinutes(), date.getSeconds()) - OA_EPOCH_MS) / MS_PER_DAY;\n}\n\nfunction fromOA(oa: number): Date {\n const ms = OA_EPOCH_MS + oa * MS_PER_DAY;\n const d = new Date(ms);\n return new Date(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(),\n d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds());\n}\n\nexport function registerDate(r: FunctionRegistry): void {\n r.register('NOW', now, 0, 0, true);\n r.register('TODAY', today, 0, 0, true);\n r.register('DATE', date_, 3, 3);\n r.register('YEAR', year, 1, 1);\n r.register('MONTH', month, 1, 1);\n r.register('DAY', day, 1, 1);\n r.register('HOUR', hour, 1, 1);\n r.register('MINUTE', minute, 1, 1);\n r.register('SECOND', second, 1, 1);\n r.register('DATEVALUE', dateValue, 1, 1);\n r.register('DAYS', days, 2, 2);\n r.register('EDATE', edate, 2, 2);\n r.register('EOMONTH', eomonth, 2, 2);\n r.register('WEEKDAY', weekday, 1, 2);\n r.register('WEEKNUM', weeknum, 1, 2);\n r.register('NETWORKDAYS', networkdays, 2, 3);\n r.register('DATEDIF', datedif, 3, 3);\n}\n\nfunction evalDate(a: Args, c: Ctx, idx: number): { ok: true; date: Date } | { ok: false; error: FormulaValue } {\n const r = FormulaHelper.evalDouble(a[idx]!, c);\n if (!r.ok) return r;\n try {\n return { ok: true, date: fromOA(r.value) };\n } catch {\n return { ok: false, error: FormulaValue.errorValue };\n }\n}\n\nfunction now(): FormulaValue { return FormulaValue.number(toOA(new Date())); }\nfunction today(): FormulaValue { const d = new Date(); return FormulaValue.number(toOA(new Date(d.getFullYear(), d.getMonth(), d.getDate()))); }\n\nfunction date_(a: Args, c: Ctx): FormulaValue {\n const y = FormulaHelper.evalDouble(a[0]!, c); if (!y.ok) return y.error;\n const m = FormulaHelper.evalDouble(a[1]!, c); if (!m.ok) return m.error;\n const d = FormulaHelper.evalDouble(a[2]!, c); if (!d.ok) return d.error;\n try { return FormulaValue.number(toOA(new Date(Math.round(y.value), Math.round(m.value) - 1, Math.round(d.value)))); }\n catch { return FormulaValue.errorValue; }\n}\n\nfunction year(a: Args, c: Ctx): FormulaValue {\n const r = evalDate(a, c, 0); return r.ok ? FormulaValue.number(r.date.getFullYear()) : r.error;\n}\nfunction month(a: Args, c: Ctx): FormulaValue {\n const r = evalDate(a, c, 0); return r.ok ? FormulaValue.number(r.date.getMonth() + 1) : r.error;\n}\nfunction day(a: Args, c: Ctx): FormulaValue {\n const r = evalDate(a, c, 0); return r.ok ? FormulaValue.number(r.date.getDate()) : r.error;\n}\nfunction hour(a: Args, c: Ctx): FormulaValue {\n const r = evalDate(a, c, 0); return r.ok ? FormulaValue.number(r.date.getHours()) : r.error;\n}\nfunction minute(a: Args, c: Ctx): FormulaValue {\n const r = evalDate(a, c, 0); return r.ok ? FormulaValue.number(r.date.getMinutes()) : r.error;\n}\nfunction second(a: Args, c: Ctx): FormulaValue {\n const r = evalDate(a, c, 0); return r.ok ? FormulaValue.number(r.date.getSeconds()) : r.error;\n}\n\nfunction dateValue(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalString(a[0]!, c); if (!r.ok) return r.error;\n const d = new Date(r.value);\n if (isNaN(d.getTime())) return FormulaValue.errorValue;\n return FormulaValue.number(toOA(d));\n}\n\nfunction days(a: Args, c: Ctx): FormulaValue {\n const d1 = evalDate(a, c, 0); if (!d1.ok) return d1.error;\n const d2 = evalDate(a, c, 1); if (!d2.ok) return d2.error;\n return FormulaValue.number(Math.round((d1.date.getTime() - d2.date.getTime()) / MS_PER_DAY));\n}\n\nfunction edate(a: Args, c: Ctx): FormulaValue {\n const d = evalDate(a, c, 0); if (!d.ok) return d.error;\n const m = FormulaHelper.evalDouble(a[1]!, c); if (!m.ok) return m.error;\n const result = new Date(d.date.getFullYear(), d.date.getMonth() + Math.round(m.value), d.date.getDate());\n return isNaN(result.getTime()) ? FormulaValue.errorNum : FormulaValue.number(toOA(result));\n}\n\nfunction eomonth(a: Args, c: Ctx): FormulaValue {\n const d = evalDate(a, c, 0); if (!d.ok) return d.error;\n const m = FormulaHelper.evalDouble(a[1]!, c); if (!m.ok) return m.error;\n const target = new Date(d.date.getFullYear(), d.date.getMonth() + Math.round(m.value) + 1, 0);\n return isNaN(target.getTime()) ? FormulaValue.errorNum : FormulaValue.number(toOA(target));\n}\n\nfunction weekday(a: Args, c: Ctx): FormulaValue {\n const d = evalDate(a, c, 0); if (!d.ok) return d.error;\n let type = 1;\n if (a.length > 1) { const r = FormulaHelper.evalDouble(a[1]!, c); if (!r.ok) return r.error; type = Math.round(r.value); }\n const dow = d.date.getDay(); // 0 = Sunday\n switch (type) {\n case 1: return FormulaValue.number(dow === 0 ? 1 : dow + 1); // Sun=1\n case 2: return FormulaValue.number(dow === 0 ? 7 : dow); // Mon=1\n case 3: return FormulaValue.number(dow === 0 ? 6 : dow - 1); // Mon=0\n default: return FormulaValue.errorNum;\n }\n}\n\nfunction weeknum(a: Args, c: Ctx): FormulaValue {\n const d = evalDate(a, c, 0); if (!d.ok) return d.error;\n const jan1 = new Date(d.date.getFullYear(), 0, 1);\n const days_ = Math.floor((d.date.getTime() - jan1.getTime()) / MS_PER_DAY);\n return FormulaValue.number(Math.ceil((days_ + jan1.getDay() + 1) / 7));\n}\n\nfunction networkdays(a: Args, c: Ctx): FormulaValue {\n const start = evalDate(a, c, 0); if (!start.ok) return start.error;\n const end = evalDate(a, c, 1); if (!end.ok) return end.error;\n\n const holidays = new Set<number>();\n if (a.length > 2) {\n const hv = a[2]!.evaluate(c);\n if (hv.isError) return hv;\n const items = hv.isArray ? [...hv.arrayVal.values()] : [hv];\n for (const item of items) {\n if (item.isBlank) continue;\n const r = item.tryAsDouble();\n if (!r.ok) return FormulaValue.errorValue;\n holidays.add(Math.floor(r.value));\n }\n }\n\n const dir = start.date <= end.date ? 1 : -1;\n let count = 0;\n const cur = new Date(start.date);\n\n while (dir > 0 ? cur <= end.date : cur >= end.date) {\n const dow = cur.getDay();\n const oa = Math.floor(toOA(cur));\n if (dow !== 0 && dow !== 6 && !holidays.has(oa)) count++;\n cur.setDate(cur.getDate() + dir);\n }\n\n return FormulaValue.number(count * dir);\n}\n\nfunction datedif(a: Args, c: Ctx): FormulaValue {\n const start = evalDate(a, c, 0); if (!start.ok) return start.error;\n const end = evalDate(a, c, 1); if (!end.ok) return end.error;\n const unit = FormulaHelper.evalString(a[2]!, c); if (!unit.ok) return unit.error;\n\n const s = start.date, e = end.date;\n if (s > e) return FormulaValue.errorNum;\n\n switch (unit.value.toUpperCase()) {\n case 'Y':\n return FormulaValue.number(e.getFullYear() - s.getFullYear() -\n (e.getMonth() < s.getMonth() || (e.getMonth() === s.getMonth() && e.getDate() < s.getDate()) ? 1 : 0));\n case 'M':\n return FormulaValue.number((e.getFullYear() - s.getFullYear()) * 12 + e.getMonth() - s.getMonth() -\n (e.getDate() < s.getDate() ? 1 : 0));\n case 'D':\n return FormulaValue.number(Math.round((e.getTime() - s.getTime()) / MS_PER_DAY));\n case 'MD':\n return FormulaValue.number(e.getDate() >= s.getDate()\n ? e.getDate() - s.getDate()\n : new Date(s.getFullYear(), s.getMonth() + 1, 0).getDate() - s.getDate() + e.getDate());\n case 'YM':\n return FormulaValue.number((e.getMonth() - s.getMonth() + 12) % 12 - (e.getDate() < s.getDate() ? 1 : 0));\n case 'YD': {\n const sameYearEnd = new Date(e.getFullYear(), s.getMonth(), s.getDate());\n return FormulaValue.number(Math.round((e.getTime() - sameYearEnd.getTime()) / MS_PER_DAY));\n }\n default: return FormulaValue.errorNum;\n }\n}\n","/**\n * Lookup and reference Excel functions.\n * Port of TVE.PureDocs.Excel.Formulas.LookupFunctions (C#)\n */\nimport { parseCellRef, cellRefFromRowCol, columnLetter } from '@devmm/puredocs-excel';\nimport { FormulaValue, ArrayValue } from '../formula-value.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport { CellReferenceNode, RangeReferenceNode } from '../formula-node.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerLookup(r: FunctionRegistry): void {\n r.register('VLOOKUP', vlookup, 3, 4);\n r.register('HLOOKUP', hlookup, 3, 4);\n r.register('XLOOKUP', xlookup, 3, 6);\n r.register('LOOKUP', lookup, 2, 3);\n r.register('INDEX', index_, 2, 3);\n r.register('MATCH', match, 2, 3);\n r.register('XMATCH', xmatch, 2, 4);\n r.register('CHOOSE', choose, 2);\n r.register('ADDRESS', address, 2, 5);\n r.register('ROW', row, 0, 1);\n r.register('COLUMN', column, 0, 1);\n r.register('ROWS', rows, 1, 1);\n r.register('COLUMNS', columns, 1, 1);\n r.register('OFFSET', offset, 3, 5, true);\n r.register('INDIRECT', indirect, 1, 2, true);\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction num(a: Args, c: Ctx, i: number): { ok: true; n: number } | { ok: false; e: FormulaValue } {\n const r = FormulaHelper.evalDouble(a[i]!, c);\n return r.ok ? { ok: true, n: r.value } : { ok: false, e: r.error };\n}\n\n// ── Implementations ──────────────────────────────────────────────────────────\n\nfunction vlookup(a: Args, c: Ctx): FormulaValue {\n const lookupVal = a[0]!.evaluate(c); if (lookupVal.isError) return lookupVal;\n const tableVal = a[1]!.evaluate(c); if (tableVal.isError) return tableVal;\n if (!tableVal.isArray) return FormulaValue.errorRef;\n const ci = num(a, c, 2); if (!ci.ok) return ci.e;\n const colIdx = Math.round(ci.n) - 1;\n\n let exactMatch = true;\n if (a.length > 3) {\n const mv = a[3]!.evaluate(c);\n if (mv.isError) return mv;\n exactMatch = !mv.coerceToBool().booleanValue;\n }\n\n const tbl = tableVal.arrayVal;\n if (colIdx < 0 || colIdx >= tbl.columns) return FormulaValue.errorRef;\n\n if (exactMatch) {\n for (let r = 0; r < tbl.rows; r++) {\n if (FormulaValue.areEqual(tbl.get(r, 0), lookupVal)) return tbl.get(r, colIdx);\n }\n return FormulaValue.errorNA;\n }\n\n // Approximate match — first column must be sorted ascending\n let best = -1;\n for (let r = 0; r < tbl.rows; r++) {\n if (FormulaValue.compare(tbl.get(r, 0), lookupVal) <= 0) best = r; else break;\n }\n return best >= 0 ? tbl.get(best, colIdx) : FormulaValue.errorNA;\n}\n\nfunction hlookup(a: Args, c: Ctx): FormulaValue {\n const lookupVal = a[0]!.evaluate(c); if (lookupVal.isError) return lookupVal;\n const tableVal = a[1]!.evaluate(c); if (tableVal.isError) return tableVal;\n if (!tableVal.isArray) return FormulaValue.errorRef;\n const ri = num(a, c, 2); if (!ri.ok) return ri.e;\n const rowIdx = Math.round(ri.n) - 1;\n\n let exactMatch = true;\n if (a.length > 3) {\n const mv = a[3]!.evaluate(c);\n if (mv.isError) return mv;\n exactMatch = !mv.coerceToBool().booleanValue;\n }\n\n const tbl = tableVal.arrayVal;\n if (rowIdx < 0 || rowIdx >= tbl.rows) return FormulaValue.errorRef;\n\n if (exactMatch) {\n for (let col = 0; col < tbl.columns; col++) {\n if (FormulaValue.areEqual(tbl.get(0, col), lookupVal)) return tbl.get(rowIdx, col);\n }\n return FormulaValue.errorNA;\n }\n\n let best = -1;\n for (let col = 0; col < tbl.columns; col++) {\n if (FormulaValue.compare(tbl.get(0, col), lookupVal) <= 0) best = col; else break;\n }\n return best >= 0 ? tbl.get(rowIdx, best) : FormulaValue.errorNA;\n}\n\n/** Builds a case-insensitive regex from an Excel wildcard pattern (*, ?, ~). */\nfunction wildcardRegex(pattern: string): RegExp {\n let out = '';\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern[i]!;\n if (ch === '~' && i + 1 < pattern.length) {\n const next = pattern[++i]!;\n out += next.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n } else if (ch === '*') out += '.*';\n else if (ch === '?') out += '.';\n else out += ch.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n return new RegExp(`^${out}$`, 'i');\n}\n\n/**\n * Locates the match index (0-based) in a length-`n` vector, or -1.\n * matchMode: 0 exact · -1 exact-or-next-smaller · 1 exact-or-next-larger · 2 wildcard\n * searchMode: 1 first→last · -1 last→first · 2 binary asc · -2 binary desc\n * Binary modes read the vector via `get` without materialising it, so a lookup\n * over a full sorted column stays O(log n) in both time and allocations.\n */\nfunction findMatch(\n n: number,\n get: (i: number) => FormulaValue,\n lookupVal: FormulaValue,\n matchMode: number,\n searchMode: number,\n): number {\n // Binary search (only meaningful for exact / next-smaller / next-larger).\n if ((searchMode === 2 || searchMode === -2) && matchMode !== 2) {\n const at = searchMode === 2 ? get : (j: number) => get(n - 1 - j);\n let lo = 0, hi = n - 1, lastLE = -1, firstGE = -1;\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const cmp = FormulaValue.compare(at(mid), lookupVal);\n if (cmp === 0) return searchMode === 2 ? mid : n - 1 - mid;\n if (cmp < 0) { lastLE = mid; lo = mid + 1; }\n else { firstGE = mid; hi = mid - 1; }\n }\n const idx = matchMode === -1 ? lastLE : matchMode === 1 ? firstGE : -1;\n return idx < 0 ? -1 : (searchMode === 2 ? idx : n - 1 - idx);\n }\n\n // Linear scan (honouring direction).\n const reverse = searchMode === -1;\n const order = reverse\n ? Array.from({ length: n }, (_, k) => n - 1 - k)\n : Array.from({ length: n }, (_, k) => k);\n\n if (matchMode === 2) {\n const re = wildcardRegex(lookupVal.asText());\n for (const i of order) if (re.test(get(i).asText())) return i;\n return -1;\n }\n if (matchMode === 0) {\n for (const i of order) if (FormulaValue.areEqual(get(i), lookupVal)) return i;\n return -1;\n }\n\n // Approximate: track the closest value on the requested side.\n let best = -1;\n let bestVal: FormulaValue | null = null;\n for (const i of order) {\n const v = get(i);\n const cmp = FormulaValue.compare(v, lookupVal);\n if (cmp === 0) return i;\n if (matchMode === -1 && cmp < 0) {\n if (bestVal === null || FormulaValue.compare(v, bestVal) > 0) { best = i; bestVal = v; }\n } else if (matchMode === 1 && cmp > 0) {\n if (bestVal === null || FormulaValue.compare(v, bestVal) < 0) { best = i; bestVal = v; }\n }\n }\n return best;\n}\n\nfunction xlookup(a: Args, c: Ctx): FormulaValue {\n const lookupVal = a[0]!.evaluate(c); if (lookupVal.isError) return lookupVal;\n const lookupRaw = a[1]!.evaluate(c); if (lookupRaw.isError) return lookupRaw;\n const returnRaw = a[2]!.evaluate(c); if (returnRaw.isError) return returnRaw;\n\n const matchMode = a.length > 4 ? num(a, c, 4) : { ok: true as const, n: 0 };\n if (!matchMode.ok) return matchMode.e;\n const searchMode = a.length > 5 ? num(a, c, 5) : { ok: true as const, n: 1 };\n if (!searchMode.ok) return searchMode.e;\n const mm = Math.trunc(matchMode.n), sm = Math.trunc(searchMode.n);\n\n const la = lookupRaw.isArray ? lookupRaw.arrayVal : ArrayValue.fromScalar(lookupRaw);\n if (la.rows > 1 && la.columns > 1) return FormulaValue.errorValue;\n const vertical = !(la.rows === 1 && la.columns > 1);\n const n = vertical ? la.rows : la.columns;\n const get = vertical ? (i: number) => la.get(i, 0) : (i: number) => la.get(0, i);\n\n const idx = findMatch(n, get, lookupVal, mm, sm);\n if (idx < 0) {\n return a.length > 3 ? a[3]!.evaluate(c) : FormulaValue.errorNA;\n }\n\n const ret = returnRaw.isArray ? returnRaw.arrayVal : ArrayValue.fromScalar(returnRaw);\n if (vertical) {\n if (ret.rows !== n) return FormulaValue.errorValue;\n if (ret.columns === 1) return ret.get(idx, 0);\n const out = new ArrayValue(1, ret.columns);\n for (let col = 0; col < ret.columns; col++) out.set(0, col, ret.get(idx, col));\n return FormulaValue.array(out);\n }\n if (ret.columns !== n) return FormulaValue.errorValue;\n if (ret.rows === 1) return ret.get(0, idx);\n const out = new ArrayValue(ret.rows, 1);\n for (let r = 0; r < ret.rows; r++) out.set(r, 0, ret.get(r, idx));\n return FormulaValue.array(out);\n}\n\n/**\n * XMATCH(lookup_value, lookup_array, [match_mode], [search_mode]) — returns the\n * 1-based position of a value in a 1-D vector. Semantics (match/search modes)\n * are identical to XLOOKUP, so we reuse `findMatch`: binary modes stay O(log n)\n * with no array materialisation, keeping full-column lookups cheap.\n */\nfunction xmatch(a: Args, c: Ctx): FormulaValue {\n const lookupVal = a[0]!.evaluate(c); if (lookupVal.isError) return lookupVal;\n const lookupRaw = a[1]!.evaluate(c); if (lookupRaw.isError) return lookupRaw;\n\n const matchMode = a.length > 2 ? num(a, c, 2) : { ok: true as const, n: 0 };\n if (!matchMode.ok) return matchMode.e;\n const searchMode = a.length > 3 ? num(a, c, 3) : { ok: true as const, n: 1 };\n if (!searchMode.ok) return searchMode.e;\n\n const la = lookupRaw.isArray ? lookupRaw.arrayVal : ArrayValue.fromScalar(lookupRaw);\n if (la.rows > 1 && la.columns > 1) return FormulaValue.errorValue;\n const vertical = !(la.rows === 1 && la.columns > 1);\n const n = vertical ? la.rows : la.columns;\n const get = vertical ? (i: number) => la.get(i, 0) : (i: number) => la.get(0, i);\n\n const idx = findMatch(n, get, lookupVal, Math.trunc(matchMode.n), Math.trunc(searchMode.n));\n return idx < 0 ? FormulaValue.errorNA : FormulaValue.number(idx + 1);\n}\n\nfunction index_(a: Args, c: Ctx): FormulaValue {\n const arrVal = a[0]!.evaluate(c); if (arrVal.isError) return arrVal;\n const rv = num(a, c, 1); if (!rv.ok) return rv.e;\n const rowIdx = Math.round(rv.n) - 1;\n let colIdx = 0;\n if (a.length > 2) { const cv = num(a, c, 2); if (!cv.ok) return cv.e; colIdx = Math.round(cv.n) - 1; }\n\n if (!arrVal.isArray) return rowIdx === 0 && colIdx === 0 ? arrVal : FormulaValue.errorRef;\n\n const arr = arrVal.arrayVal;\n if (rowIdx < 0 || rowIdx >= arr.rows || colIdx < 0 || colIdx >= arr.columns) {\n return FormulaValue.errorRef;\n }\n return arr.get(rowIdx, colIdx);\n}\n\nfunction match(a: Args, c: Ctx): FormulaValue {\n const lookupVal = a[0]!.evaluate(c); if (lookupVal.isError) return lookupVal;\n const arrVal = a[1]!.evaluate(c); if (arrVal.isError) return arrVal;\n let matchType = 1;\n if (a.length > 2) { const r = num(a, c, 2); if (!r.ok) return r.e; matchType = Math.round(r.n); }\n\n if (!arrVal.isArray) {\n return FormulaValue.areEqual(arrVal, lookupVal) ? FormulaValue.one : FormulaValue.errorNA;\n }\n\n const arr = arrVal.arrayVal;\n const len = arr.length;\n\n if (matchType === 0) {\n for (let i = 0; i < len; i++) {\n if (FormulaValue.areEqual(arr.getFlat(i), lookupVal)) return FormulaValue.number(i + 1);\n }\n return FormulaValue.errorNA;\n }\n\n if (matchType === 1) {\n let best = -1;\n for (let i = 0; i < len; i++) {\n if (FormulaValue.compare(arr.getFlat(i), lookupVal) <= 0) best = i; else break;\n }\n return best >= 0 ? FormulaValue.number(best + 1) : FormulaValue.errorNA;\n }\n\n // matchType === -1\n let best = -1;\n for (let i = 0; i < len; i++) {\n if (FormulaValue.compare(arr.getFlat(i), lookupVal) >= 0) best = i; else break;\n }\n return best >= 0 ? FormulaValue.number(best + 1) : FormulaValue.errorNA;\n}\n\nfunction choose(a: Args, c: Ctx): FormulaValue {\n const iv = num(a, c, 0); if (!iv.ok) return iv.e;\n const idx = Math.round(iv.n);\n if (idx < 1 || idx >= a.length) return FormulaValue.errorValue;\n return a[idx]!.evaluate(c);\n}\n\n/** Largest index i (in flat order) with values[i] <= lookupVal, else -1. */\nfunction approxMatchFlat(arr: ArrayValue, lookupVal: FormulaValue): number {\n let best = -1;\n for (let i = 0; i < arr.length; i++) {\n if (FormulaValue.compare(arr.getFlat(i), lookupVal) <= 0) best = i;\n else break;\n }\n return best;\n}\n\nfunction lookup(a: Args, c: Ctx): FormulaValue {\n const lookupVal = a[0]!.evaluate(c); if (lookupVal.isError) return lookupVal;\n const vecVal = a[1]!.evaluate(c); if (vecVal.isError) return vecVal;\n\n // Vector form with explicit result vector.\n if (a.length > 2) {\n const resVal = a[2]!.evaluate(c); if (resVal.isError) return resVal;\n const vecArr = vecVal.isArray ? vecVal.arrayVal : ArrayValue.fromScalar(vecVal);\n const idx = approxMatchFlat(vecArr, lookupVal);\n if (idx < 0) return FormulaValue.errorNA;\n if (resVal.isArray) return resVal.arrayVal.getFlat(idx);\n return idx === 0 ? resVal : FormulaValue.errorNA;\n }\n\n // Scalar.\n if (!vecVal.isArray) {\n return FormulaValue.areEqual(vecVal, lookupVal) ? vecVal : FormulaValue.errorNA;\n }\n\n // Array form: Excel searches the first row when the array is wider than tall,\n // otherwise the first column; the result comes from the last row/column.\n const arr = vecVal.arrayVal;\n if (arr.columns >= arr.rows) {\n let best = -1;\n for (let col = 0; col < arr.columns; col++) {\n if (FormulaValue.compare(arr.get(0, col), lookupVal) <= 0) best = col; else break;\n }\n return best >= 0 ? arr.get(arr.rows - 1, best) : FormulaValue.errorNA;\n }\n let best = -1;\n for (let r = 0; r < arr.rows; r++) {\n if (FormulaValue.compare(arr.get(r, 0), lookupVal) <= 0) best = r; else break;\n }\n return best >= 0 ? arr.get(best, arr.columns - 1) : FormulaValue.errorNA;\n}\n\nfunction address(a: Args, c: Ctx): FormulaValue {\n const rn = num(a, c, 0); if (!rn.ok) return rn.e;\n const cn = num(a, c, 1); if (!cn.ok) return cn.e;\n const row = Math.round(rn.n);\n const col = Math.round(cn.n);\n if (row < 1 || col < 1) return FormulaValue.errorValue;\n\n let absNum = 1;\n if (a.length > 2) { const r = num(a, c, 2); if (!r.ok) return r.e; absNum = Math.round(r.n); }\n if (absNum < 1 || absNum > 4) return FormulaValue.errorValue;\n\n let a1 = true;\n if (a.length > 3) {\n const v = a[3]!.evaluate(c);\n if (v.isError) return v;\n // A1 style is the default; only an explicit FALSE selects R1C1.\n a1 = v.isBlank ? true : v.coerceToBool().booleanValue;\n }\n\n let sheetPrefix = '';\n if (a.length > 4) {\n const s = FormulaHelper.evalString(a[4]!, c);\n if (!s.ok) return s.error;\n if (s.value !== '') sheetPrefix = `${s.value}!`;\n }\n\n const rowAbs = absNum === 1 || absNum === 2;\n const colAbs = absNum === 1 || absNum === 3;\n\n let ref: string;\n if (a1) {\n ref = `${colAbs ? '$' : ''}${columnLetter(col)}${rowAbs ? '$' : ''}${row}`;\n } else {\n const rPart = rowAbs ? `R${row}` : `R[${row}]`;\n const cPart = colAbs ? `C${col}` : `C[${col}]`;\n ref = `${rPart}${cPart}`;\n }\n return FormulaValue.text(`${sheetPrefix}${ref}`);\n}\n\nfunction row(a: Args, c: Ctx): FormulaValue {\n if (a.length === 0) return FormulaValue.number(c.formulaRow || 1);\n const node = a[0]!;\n if (node instanceof CellReferenceNode) {\n return FormulaValue.number(parseCellRef(node.reference).row);\n }\n if (node instanceof RangeReferenceNode) {\n return FormulaValue.number(parseCellRef(node.startRef).row);\n }\n return FormulaValue.errorValue;\n}\n\nfunction column(a: Args, c: Ctx): FormulaValue {\n if (a.length === 0) return FormulaValue.number(c.formulaCol || 1);\n const node = a[0]!;\n if (node instanceof CellReferenceNode) {\n return FormulaValue.number(parseCellRef(node.reference).column);\n }\n if (node instanceof RangeReferenceNode) {\n return FormulaValue.number(parseCellRef(node.startRef).column);\n }\n return FormulaValue.errorValue;\n}\n\nfunction rows(a: Args, c: Ctx): FormulaValue {\n if (a[0] instanceof RangeReferenceNode) {\n const b = c.getRangeBounds(a[0].startRef, a[0].endRef);\n return FormulaValue.number(b.endRow - b.startRow + 1);\n }\n const v = a[0]!.evaluate(c);\n return v.isArray ? FormulaValue.number(v.arrayVal.rows) : FormulaValue.one;\n}\n\nfunction columns(a: Args, c: Ctx): FormulaValue {\n if (a[0] instanceof RangeReferenceNode) {\n const b = c.getRangeBounds(a[0].startRef, a[0].endRef);\n return FormulaValue.number(b.endCol - b.startCol + 1);\n }\n const v = a[0]!.evaluate(c);\n return v.isArray ? FormulaValue.number(v.arrayVal.columns) : FormulaValue.one;\n}\n\n// INDIRECT(ref_text, [a1]) — resolves a reference given as text. Volatile: the\n// dependency graph cannot see through it, so the recalc engine recomputes it\n// every pass.\nfunction indirect(a: Args, c: Ctx): FormulaValue {\n const s = FormulaHelper.evalString(a[0]!, c);\n if (!s.ok) return s.error;\n let a1 = true;\n if (a.length > 1) {\n const v = a[1]!.evaluate(c);\n if (v.isError) return v;\n a1 = v.isBlank ? true : v.coerceToBool().booleanValue;\n }\n\n const text = s.value.trim();\n if (text === '') return FormulaValue.errorRef;\n\n // Split off an optional sheet qualifier (\"Sheet1!\" or \"'My Sheet'!\").\n let sheet: string | undefined;\n let body = text;\n const bang = text.lastIndexOf('!');\n if (bang >= 0) {\n sheet = text.slice(0, bang).replace(/^'|'$/g, '');\n body = text.slice(bang + 1);\n }\n\n const colon = body.indexOf(':');\n try {\n if (colon >= 0) {\n const start = toA1(body.slice(0, colon), a1, c);\n const end = toA1(body.slice(colon + 1), a1, c);\n if (start === null || end === null) return FormulaValue.errorRef;\n return sheet !== undefined\n ? c.getSheetRangeValues(sheet, start, end)\n : c.getRangeValues(start, end);\n }\n const cell = toA1(body, a1, c);\n if (cell === null) return FormulaValue.errorRef;\n return sheet !== undefined ? c.getSheetCellValue(sheet, cell) : c.getCellValue(cell);\n } catch {\n return FormulaValue.errorRef;\n }\n}\n\n/** Normalises a single reference (A1 or R1C1) to a plain A1 string, or null. */\nfunction toA1(ref: string, a1: boolean, c: Ctx): string | null {\n const r = ref.trim();\n if (a1) {\n try {\n const { row, column } = parseCellRef(r);\n return cellRefFromRowCol(row, column);\n } catch {\n return null;\n }\n }\n // R1C1 — absolute R{n}C{n} or relative R[{d}]C[{d}] (relative to formula cell).\n const m = /^R(\\[-?\\d+\\]|\\d+)?C(\\[-?\\d+\\]|\\d+)?$/i.exec(r);\n if (!m) return null;\n const axis = (part: string | undefined, base: number): number | null => {\n if (part === undefined) return base; // bare R or C → same row/col\n if (part.startsWith('[')) return base + parseInt(part.slice(1, -1), 10); // relative\n return parseInt(part, 10); // absolute\n };\n const row = axis(m[1], c.formulaRow || 1);\n const col = axis(m[2], c.formulaCol || 1);\n if (row === null || col === null || row < 1 || col < 1) return null;\n return cellRefFromRowCol(row, col);\n}\n\nfunction offset(a: Args, c: Ctx): FormulaValue {\n const baseNode = a[0]!;\n let baseRef: string;\n if (baseNode instanceof CellReferenceNode) baseRef = baseNode.reference;\n else if (baseNode instanceof RangeReferenceNode) baseRef = baseNode.startRef;\n else return FormulaValue.errorValue;\n\n const base = parseCellRef(baseRef);\n\n const ro = FormulaHelper.evalDouble(a[1]!, c); if (!ro.ok) return ro.error;\n const co = FormulaHelper.evalDouble(a[2]!, c); if (!co.ok) return co.error;\n\n const newRow = base.row + Math.round(ro.value);\n const newCol = base.column + Math.round(co.value);\n if (newRow < 1 || newCol < 1) return FormulaValue.errorRef;\n\n let height = 1, width = 1;\n if (a.length > 3) { const h = FormulaHelper.evalDouble(a[3]!, c); if (!h.ok) return h.error; height = Math.round(h.value); }\n if (a.length > 4) { const w = FormulaHelper.evalDouble(a[4]!, c); if (!w.ok) return w.error; width = Math.round(w.value); }\n\n if (height === 1 && width === 1) return c.getCellValue(cellRefFromRowCol(newRow, newCol));\n\n return c.getRangeValues(\n cellRefFromRowCol(newRow, newCol),\n cellRefFromRowCol(newRow + height - 1, newCol + width - 1),\n );\n}\n","/**\n * Statistical Excel functions.\n * Port of TVE.PureDocs.Excel.Formulas.StatisticalFunctions (C#)\n */\nimport { FormulaValue } from '../formula-value.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerStatistical(r: FunctionRegistry): void {\n r.register('MEDIAN', median, 1);\n r.register('MODE', mode, 1);\n r.register('MODE.SNGL', mode, 1);\n r.register('STDEV', stdev, 1);\n r.register('STDEV.S', stdev, 1);\n r.register('STDEVP', stdevp, 1);\n r.register('STDEV.P', stdevp, 1);\n r.register('VAR', var_, 1);\n r.register('VAR.S', var_, 1);\n r.register('VARP', varp, 1);\n r.register('VAR.P', varp, 1);\n r.register('LARGE', large, 2, 2);\n r.register('SMALL', small, 2, 2);\n r.register('RANK', rank, 2, 3);\n r.register('RANK.EQ', rank, 2, 3);\n r.register('PERCENTILE', percentile, 2, 2);\n r.register('PERCENTILE.INC', percentile, 2, 2);\n r.register('MAXIFS', maxIfs, 3);\n r.register('MINIFS', minIfs, 3);\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction variance(nums: number[], population: boolean): number {\n const mean = nums.reduce((s, n) => s + n, 0) / nums.length;\n const sumSq = nums.reduce((s, n) => s + (n - mean) ** 2, 0);\n return sumSq / (population ? nums.length : nums.length - 1);\n}\n\nfunction numsFromArray(v: FormulaValue): number[] {\n if (v.isArray) {\n return [...v.arrayVal.values()]\n .filter(i => i.isNumber)\n .map(i => i.numberValue);\n }\n return v.isNumber ? [v.numberValue] : [];\n}\n\nfunction num(a: Args, c: Ctx, i: number): { ok: true; n: number } | { ok: false; e: FormulaValue } {\n const r = FormulaHelper.evalDouble(a[i]!, c);\n return r.ok ? { ok: true, n: r.value } : { ok: false, e: r.error };\n}\n\n// ── Implementations ──────────────────────────────────────────────────────────\n\nfunction median(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length === 0) return FormulaValue.errorNum;\n const sorted = [...r.values].sort((a, b) => a - b);\n const mid = sorted.length >> 1;\n return FormulaValue.number(\n sorted.length % 2 === 0 ? (sorted[mid - 1]! + sorted[mid]!) / 2 : sorted[mid]!,\n );\n}\n\nfunction mode(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length === 0) return FormulaValue.errorNA;\n const freq = new Map<number, number>();\n let maxCnt = 0;\n for (const n of r.values) {\n const cnt = (freq.get(n) ?? 0) + 1;\n freq.set(n, cnt);\n if (cnt > maxCnt) maxCnt = cnt;\n }\n if (maxCnt === 1) return FormulaValue.errorNA;\n for (const n of r.values) {\n if ((freq.get(n) ?? 0) === maxCnt) return FormulaValue.number(n);\n }\n return FormulaValue.errorNA;\n}\n\nfunction stdev(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length < 2) return FormulaValue.errorDiv0;\n return FormulaValue.number(Math.sqrt(variance(r.values, false)));\n}\n\nfunction stdevp(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length === 0) return FormulaValue.errorDiv0;\n return FormulaValue.number(Math.sqrt(variance(r.values, true)));\n}\n\nfunction var_(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length < 2) return FormulaValue.errorDiv0;\n return FormulaValue.number(variance(r.values, false));\n}\n\nfunction varp(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length === 0) return FormulaValue.errorDiv0;\n return FormulaValue.number(variance(r.values, true));\n}\n\nfunction large(a: Args, c: Ctx): FormulaValue {\n const arrV = a[0]!.evaluate(c); if (arrV.isError) return arrV;\n const kv = num(a, c, 1); if (!kv.ok) return kv.e;\n const nums = numsFromArray(arrV).sort((a, b) => b - a);\n const k = Math.round(kv.n);\n if (k < 1 || k > nums.length) return FormulaValue.errorNum;\n return FormulaValue.number(nums[k - 1]!);\n}\n\nfunction small(a: Args, c: Ctx): FormulaValue {\n const arrV = a[0]!.evaluate(c); if (arrV.isError) return arrV;\n const kv = num(a, c, 1); if (!kv.ok) return kv.e;\n const nums = numsFromArray(arrV).sort((a, b) => a - b);\n const k = Math.round(kv.n);\n if (k < 1 || k > nums.length) return FormulaValue.errorNum;\n return FormulaValue.number(nums[k - 1]!);\n}\n\nfunction rank(a: Args, c: Ctx): FormulaValue {\n const nv = FormulaHelper.evalDouble(a[0]!, c); if (!nv.ok) return nv.error;\n const arrV = a[1]!.evaluate(c); if (arrV.isError) return arrV;\n let order = 0;\n if (a.length > 2) { const ov = num(a, c, 2); if (!ov.ok) return ov.e; order = Math.round(ov.n); }\n const nums = numsFromArray(arrV).sort((a, b) => order === 0 ? b - a : a - b);\n const idx = nums.indexOf(nv.value);\n return idx < 0 ? FormulaValue.errorNA : FormulaValue.number(idx + 1);\n}\n\nfunction percentile(a: Args, c: Ctx): FormulaValue {\n const arrV = a[0]!.evaluate(c); if (arrV.isError) return arrV;\n const kv = FormulaHelper.evalDouble(a[1]!, c); if (!kv.ok) return kv.error;\n if (kv.value < 0 || kv.value > 1) return FormulaValue.errorNum;\n const nums = numsFromArray(arrV).sort((a, b) => a - b);\n if (nums.length === 0) return FormulaValue.errorNum;\n const n = (nums.length - 1) * kv.value;\n const lo = Math.floor(n), hi = Math.ceil(n);\n if (lo === hi) return FormulaValue.number(nums[lo]!);\n return FormulaValue.number(nums[lo]! + (nums[hi]! - nums[lo]!) * (n - lo));\n}\n\nfunction maxIfs(a: Args, c: Ctx): FormulaValue {\n return ifsAggregate(a, c, 'max');\n}\n\nfunction minIfs(a: Args, c: Ctx): FormulaValue {\n return ifsAggregate(a, c, 'min');\n}\n\nfunction ifsAggregate(a: Args, c: Ctx, mode: 'max' | 'min'): FormulaValue {\n if (a.length < 3 || (a.length - 1) % 2 !== 0) return FormulaValue.errorValue;\n const mainRange = a[0]!.evaluate(c); if (mainRange.isError) return mainRange;\n if (!mainRange.isArray) return FormulaValue.errorValue;\n\n const arr = mainRange.arrayVal;\n const len = arr.length;\n const mask = new Uint8Array(len).fill(1);\n\n for (let p = 1; p + 1 < a.length; p += 2) {\n const cr = a[p]!.evaluate(c); if (cr.isError) return cr;\n const criteria = a[p + 1]!.evaluate(c).asText();\n const crArr = cr.isArray ? cr.arrayVal : null;\n for (let i = 0; i < len; i++) {\n if (!mask[i]) continue;\n const cv = crArr ? crArr.getFlat(i) : cr;\n if (!FormulaHelper.matchesCriteria(cv, criteria)) mask[i] = 0;\n }\n }\n\n let result = mode === 'max' ? -Infinity : Infinity;\n let found = false;\n for (let i = 0; i < len; i++) {\n if (!mask[i]) continue;\n const r = arr.getFlat(i).tryAsDouble();\n if (!r.ok) continue;\n if (mode === 'max' ? r.value > result : r.value < result) { result = r.value; found = true; }\n }\n return found ? FormulaValue.number(result) : FormulaValue.zero;\n}\n","/**\n * Information Excel functions (IS*, TYPE, N, ERROR.TYPE, etc.).\n * Port of TVE.PureDocs.Excel.Formulas.InfoFunctions (C#)\n */\nimport { FormulaValue, FormulaError } from '../formula-value.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerInfo(r: FunctionRegistry): void {\n r.register('ISBLANK', isBlank, 1, 1);\n r.register('ISNUMBER', isNumber, 1, 1);\n r.register('ISTEXT', isText, 1, 1);\n r.register('ISERROR', isError, 1, 1);\n r.register('ISERR', isErr, 1, 1);\n r.register('ISLOGICAL', isLogical, 1, 1);\n r.register('ISNA', isNa, 1, 1);\n r.register('ISNONTEXT', isNonText, 1, 1);\n r.register('NA', na, 0, 0);\n r.register('TYPE', type_, 1, 1);\n r.register('N', n_, 1, 1);\n r.register('ISODD', isOdd, 1, 1);\n r.register('ISEVEN', isEven, 1, 1);\n r.register('ERROR.TYPE', errorType, 1, 1);\n}\n\nfunction isBlank(a: Args, c: Ctx): FormulaValue { return FormulaValue.boolean(a[0]!.evaluate(c).isBlank); }\nfunction isNumber(a: Args, c: Ctx): FormulaValue { return FormulaValue.boolean(a[0]!.evaluate(c).isNumber); }\nfunction isText(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n return FormulaValue.boolean(v.isText && v.textValue.length > 0);\n}\nfunction isError(a: Args, c: Ctx): FormulaValue { return FormulaValue.boolean(a[0]!.evaluate(c).isError); }\nfunction isErr(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n return FormulaValue.boolean(v.isError && v.errorCode !== FormulaError.NA);\n}\nfunction isLogical(a: Args, c: Ctx): FormulaValue { return FormulaValue.boolean(a[0]!.evaluate(c).isBoolean); }\nfunction isNa(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n return FormulaValue.boolean(v.isError && v.errorCode === FormulaError.NA);\n}\nfunction isNonText(a: Args, c: Ctx): FormulaValue { return FormulaValue.boolean(!a[0]!.evaluate(c).isText); }\nfunction na(): FormulaValue { return FormulaValue.errorNA; }\n\nfunction type_(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n const t = v.isNumber || v.isBlank ? 1\n : v.isText ? 2\n : v.isBoolean ? 4\n : v.isError ? 16\n : v.isArray ? 64 : 1;\n return FormulaValue.number(t);\n}\n\nfunction n_(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n if (v.isNumber) return v;\n if (v.isBoolean) return FormulaValue.number(v.booleanValue ? 1 : 0);\n return FormulaValue.zero;\n}\n\nfunction isOdd(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c); if (!r.ok) return r.error;\n return FormulaValue.boolean(Math.abs(Math.trunc(r.value)) % 2 === 1);\n}\n\nfunction isEven(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c); if (!r.ok) return r.error;\n return FormulaValue.boolean(Math.trunc(r.value) % 2 === 0);\n}\n\nfunction errorType(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n if (!v.isError) return FormulaValue.errorNA;\n const map: Partial<Record<FormulaError, number>> = {\n [FormulaError.Null]: 1,\n [FormulaError.Div0]: 2,\n [FormulaError.Value]: 3,\n [FormulaError.Ref]: 4,\n [FormulaError.Name]: 5,\n [FormulaError.Num]: 6,\n [FormulaError.NA]: 7,\n };\n return FormulaValue.number(map[v.errorCode] ?? 7);\n}\n","/**\n * Financial Excel functions: PMT, FV, PV, NPV, IRR, RATE, NPER, XNPV, XIRR,\n * IPMT, PPMT.\n *\n * Sign conventions follow Excel: money you receive is positive, money you pay\n * is negative. `type` is 0 for end-of-period payments (default) or 1 for\n * beginning-of-period.\n */\nimport { FormulaValue } from '../formula-value.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerFinance(r: FunctionRegistry): void {\n r.register('PMT', pmt, 3, 5);\n r.register('FV', fv, 3, 5);\n r.register('PV', pv, 3, 5);\n r.register('NPV', npv, 2);\n r.register('IRR', irr, 1, 2);\n r.register('RATE', rate, 3, 6);\n r.register('NPER', nper, 3, 5);\n r.register('XNPV', xnpv, 3, 3);\n r.register('XIRR', xirr, 2, 3);\n r.register('IPMT', ipmt, 4, 6);\n r.register('PPMT', ppmt, 4, 6);\n}\n\n// ── Shared time-value-of-money kernels (used by PMT/FV/IPMT/PPMT) ─────────────\n\n/** Level payment for an annuity. Mirrors Excel PMT. */\nfunction pmtValue(r: number, n: number, pv: number, fv: number, type: number): number {\n if (r === 0) return -(pv + fv) / n;\n const pow = Math.pow(1 + r, n);\n let payment = (-fv - pv * pow) * r / (pow - 1);\n if (type === 1) payment /= (1 + r);\n return payment;\n}\n\n/** Future value after `n` periods. Mirrors Excel FV. */\nfunction fvValue(r: number, n: number, pmt: number, pv: number, type: number): number {\n if (r === 0) return -(pv + pmt * n);\n const pow = Math.pow(1 + r, n);\n return -(pv * pow + pmt * (1 + r * type) * (pow - 1) / r);\n}\n\n/** Reads argument `idx` as a number, defaulting when the argument is absent. */\nfunction arg(a: Args, c: Ctx, idx: number, dflt: number): { ok: true; n: number } | { ok: false; e: FormulaValue } {\n if (idx >= a.length) return { ok: true, n: dflt };\n const r = FormulaHelper.evalDouble(a[idx]!, c);\n return r.ok ? { ok: true, n: r.value } : { ok: false, e: r.error };\n}\n\nfunction pmt(a: Args, c: Ctx): FormulaValue {\n const rate = arg(a, c, 0, 0); if (!rate.ok) return rate.e;\n const nper = arg(a, c, 1, 0); if (!nper.ok) return nper.e;\n const pvv = arg(a, c, 2, 0); if (!pvv.ok) return pvv.e;\n const fvv = arg(a, c, 3, 0); if (!fvv.ok) return fvv.e;\n const type = arg(a, c, 4, 0); if (!type.ok) return type.e;\n\n const r = rate.n, n = nper.n, present = pvv.n, future = fvv.n, t = type.n;\n if (n === 0) return FormulaValue.errorNum;\n return FormulaValue.number(pmtValue(r, n, present, future, t));\n}\n\nfunction fv(a: Args, c: Ctx): FormulaValue {\n const rate = arg(a, c, 0, 0); if (!rate.ok) return rate.e;\n const nper = arg(a, c, 1, 0); if (!nper.ok) return nper.e;\n const pmtv = arg(a, c, 2, 0); if (!pmtv.ok) return pmtv.e;\n const pvv = arg(a, c, 3, 0); if (!pvv.ok) return pvv.e;\n const type = arg(a, c, 4, 0); if (!type.ok) return type.e;\n\n const r = rate.n, n = nper.n, payment = pmtv.n, present = pvv.n, t = type.n;\n return FormulaValue.number(fvValue(r, n, payment, present, t));\n}\n\nfunction pv(a: Args, c: Ctx): FormulaValue {\n const rate = arg(a, c, 0, 0); if (!rate.ok) return rate.e;\n const nper = arg(a, c, 1, 0); if (!nper.ok) return nper.e;\n const pmtv = arg(a, c, 2, 0); if (!pmtv.ok) return pmtv.e;\n const fvv = arg(a, c, 3, 0); if (!fvv.ok) return fvv.e;\n const type = arg(a, c, 4, 0); if (!type.ok) return type.e;\n\n const r = rate.n, n = nper.n, payment = pmtv.n, future = fvv.n, t = type.n;\n if (r === 0) return FormulaValue.number(-(future + payment * n));\n\n const pow = Math.pow(1 + r, n);\n return FormulaValue.number(-(future + payment * (1 + r * t) * (pow - 1) / r) / pow);\n}\n\nfunction npv(a: Args, c: Ctx): FormulaValue {\n const rate = FormulaHelper.evalDouble(a[0]!, c);\n if (!rate.ok) return rate.error;\n if (rate.value === -1) return FormulaValue.errorDiv0;\n\n const flows = FormulaHelper.collectNumbers(a.slice(1), c);\n if (!flows.ok) return flows.error;\n\n let total = 0;\n for (let i = 0; i < flows.values.length; i++) {\n total += flows.values[i]! / Math.pow(1 + rate.value, i + 1);\n }\n return FormulaValue.number(total);\n}\n\nfunction irr(a: Args, c: Ctx): FormulaValue {\n const flowsRes = FormulaHelper.collectNumbers([a[0]!], c);\n if (!flowsRes.ok) return flowsRes.error;\n const flows = flowsRes.values;\n if (flows.length < 2) return FormulaValue.errorNum;\n\n let guess = 0.1;\n if (a.length > 1) {\n const g = FormulaHelper.evalDouble(a[1]!, c);\n if (!g.ok) return g.error;\n guess = g.value;\n }\n\n const npvAt = (rate: number): number => {\n let sum = 0;\n for (let i = 0; i < flows.length; i++) sum += flows[i]! / Math.pow(1 + rate, i);\n return sum;\n };\n\n // Newton-Raphson with a numeric derivative; bounded iterations.\n let rate = guess;\n for (let iter = 0; iter < 100; iter++) {\n const f = npvAt(rate);\n if (Math.abs(f) < 1e-7) return FormulaValue.number(rate);\n const h = 1e-6;\n const deriv = (npvAt(rate + h) - f) / h;\n if (deriv === 0) break;\n const next = rate - f / deriv;\n if (!isFinite(next) || next <= -1) break;\n if (Math.abs(next - rate) < 1e-9) { rate = next; break; }\n rate = next;\n }\n if (Math.abs(npvAt(rate)) < 1e-6) return FormulaValue.number(rate);\n return FormulaValue.errorNum;\n}\n\n/**\n * Time-value-of-money residual: the present value of a stream that should\n * equal zero at the true rate. Shared by RATE (root-finding) so its Newton\n * iteration and the closed forms above stay consistent.\n * pv·(1+r)^n + pmt·(1+r·type)·((1+r)^n − 1)/r + fv\n */\nfunction tvm(r: number, n: number, pmt: number, pv: number, fv: number, type: number): number {\n if (r === 0) return pv + pmt * n + fv;\n const pow = Math.pow(1 + r, n);\n return pv * pow + pmt * (1 + r * type) * (pow - 1) / r + fv;\n}\n\nfunction rate(a: Args, c: Ctx): FormulaValue {\n const nper = arg(a, c, 0, 0); if (!nper.ok) return nper.e;\n const pmtv = arg(a, c, 1, 0); if (!pmtv.ok) return pmtv.e;\n const pvv = arg(a, c, 2, 0); if (!pvv.ok) return pvv.e;\n const fvv = arg(a, c, 3, 0); if (!fvv.ok) return fvv.e;\n const type = arg(a, c, 4, 0); if (!type.ok) return type.e;\n const gs = arg(a, c, 5, 0.1); if (!gs.ok) return gs.e;\n\n const n = nper.n, pmt = pmtv.n, pv = pvv.n, fv = fvv.n, t = type.n;\n if (n === 0) return FormulaValue.errorNum;\n\n // Newton-Raphson with a numeric derivative; Excel's own default guess is 10%.\n let r = gs.n;\n for (let iter = 0; iter < 100; iter++) {\n const f = tvm(r, n, pmt, pv, fv, t);\n if (Math.abs(f) < 1e-8) return FormulaValue.number(r);\n const h = 1e-6;\n const deriv = (tvm(r + h, n, pmt, pv, fv, t) - f) / h;\n if (deriv === 0) break;\n const next = r - f / deriv;\n if (!isFinite(next) || next <= -1) break;\n if (Math.abs(next - r) < 1e-10) { r = next; break; }\n r = next;\n }\n if (Math.abs(tvm(r, n, pmt, pv, fv, t)) < 1e-6) return FormulaValue.number(r);\n return FormulaValue.errorNum;\n}\n\nfunction nper(a: Args, c: Ctx): FormulaValue {\n const rate = arg(a, c, 0, 0); if (!rate.ok) return rate.e;\n const pmtv = arg(a, c, 1, 0); if (!pmtv.ok) return pmtv.e;\n const pvv = arg(a, c, 2, 0); if (!pvv.ok) return pvv.e;\n const fvv = arg(a, c, 3, 0); if (!fvv.ok) return fvv.e;\n const type = arg(a, c, 4, 0); if (!type.ok) return type.e;\n\n const r = rate.n, pmt = pmtv.n, pv = pvv.n, fv = fvv.n, t = type.n;\n\n if (r === 0) {\n if (pmt === 0) return FormulaValue.errorNum;\n return FormulaValue.number(-(pv + fv) / pmt);\n }\n // Closed form: n = ln((pmt·(1+r·t) − fv·r)/(pmt·(1+r·t) + pv·r)) / ln(1+r)\n const adj = pmt * (1 + r * t);\n const num = adj - fv * r;\n const den = adj + pv * r;\n if (den === 0 || num / den <= 0) return FormulaValue.errorNum;\n const result = Math.log(num / den) / Math.log(1 + r);\n if (!isFinite(result)) return FormulaValue.errorNum;\n return FormulaValue.number(result);\n}\n\n/**\n * IPMT / PPMT — split the level annuity payment for a single period `per` into\n * its interest and principal parts. IPMT is the balance at the start of the\n * period times the rate; PPMT is the remainder of the payment. Both are O(1)\n * closed forms (no per-period loop), reusing the shared PMT/FV kernels.\n */\nfunction interestForPeriod(r: number, per: number, n: number, pv: number, fv: number, t: number): number {\n const pay = pmtValue(r, n, pv, fv, t);\n // Outstanding balance at the start of period `per` = FV after (per-1) periods.\n // For beginning-of-period annuities the first period accrues no interest, and\n // subsequent periods discount the accrued interest by one period.\n if (t === 1) {\n if (per === 1) return 0;\n return fvValue(r, per - 2, pay, pv, 1) * r / (1 + r);\n }\n return fvValue(r, per - 1, pay, pv, 0) * r;\n}\n\nfunction ipmt(a: Args, c: Ctx): FormulaValue {\n const rate = arg(a, c, 0, 0); if (!rate.ok) return rate.e;\n const perv = arg(a, c, 1, 0); if (!perv.ok) return perv.e;\n const nper = arg(a, c, 2, 0); if (!nper.ok) return nper.e;\n const pvv = arg(a, c, 3, 0); if (!pvv.ok) return pvv.e;\n const fvv = arg(a, c, 4, 0); if (!fvv.ok) return fvv.e;\n const type = arg(a, c, 5, 0); if (!type.ok) return type.e;\n\n const r = rate.n, per = perv.n, n = nper.n, pv = pvv.n, fv = fvv.n, t = type.n;\n if (n === 0 || per < 1 || per > n) return FormulaValue.errorNum;\n return FormulaValue.number(interestForPeriod(r, per, n, pv, fv, t));\n}\n\nfunction ppmt(a: Args, c: Ctx): FormulaValue {\n const rate = arg(a, c, 0, 0); if (!rate.ok) return rate.e;\n const perv = arg(a, c, 1, 0); if (!perv.ok) return perv.e;\n const nper = arg(a, c, 2, 0); if (!nper.ok) return nper.e;\n const pvv = arg(a, c, 3, 0); if (!pvv.ok) return pvv.e;\n const fvv = arg(a, c, 4, 0); if (!fvv.ok) return fvv.e;\n const type = arg(a, c, 5, 0); if (!type.ok) return type.e;\n\n const r = rate.n, per = perv.n, n = nper.n, pv = pvv.n, fv = fvv.n, t = type.n;\n if (n === 0 || per < 1 || per > n) return FormulaValue.errorNum;\n const pay = pmtValue(r, n, pv, fv, t);\n return FormulaValue.number(pay - interestForPeriod(r, per, n, pv, fv, t));\n}\n\n/**\n * Reads a node as a flat list of numbers in row-major order, keeping positional\n * alignment (blanks count as 0, unlike collectNumbers which drops them). Used to\n * pair cash flows with their dates for XNPV/XIRR.\n */\nfunction flatNumbers(\n node: FormulaNode,\n c: Ctx,\n): { ok: true; values: number[] } | { ok: false; e: FormulaValue } {\n const v = node.evaluate(c);\n if (v.isError) return { ok: false, e: v };\n const out: number[] = [];\n const push = (item: FormulaValue): FormulaValue | null => {\n if (item.isError) return item;\n const d = item.tryAsDouble();\n if (!d.ok) return FormulaValue.errorValue;\n out.push(d.value);\n return null;\n };\n if (v.isArray) {\n for (const item of v.arrayVal.values()) {\n const err = push(item);\n if (err) return { ok: false, e: err };\n }\n } else {\n const err = push(v);\n if (err) return { ok: false, e: err };\n }\n return { ok: true, values: out };\n}\n\n/** Discounted value of dated cash flows: Σ vᵢ / (1+rate)^((dateᵢ − date₀)/365). */\nfunction xnpvAt(rate: number, values: number[], days: number[]): number {\n let sum = 0;\n for (let i = 0; i < values.length; i++) {\n sum += values[i]! / Math.pow(1 + rate, days[i]! / 365);\n }\n return sum;\n}\n\nfunction xnpv(a: Args, c: Ctx): FormulaValue {\n const rateRes = FormulaHelper.evalDouble(a[0]!, c);\n if (!rateRes.ok) return rateRes.error;\n const rate = rateRes.value;\n if (rate <= -1) return FormulaValue.errorNum;\n\n const valsRes = flatNumbers(a[1]!, c); if (!valsRes.ok) return valsRes.e;\n const datesRes = flatNumbers(a[2]!, c); if (!datesRes.ok) return datesRes.e;\n const values = valsRes.values;\n const dates = datesRes.values;\n if (values.length === 0 || values.length !== dates.length) return FormulaValue.errorNum;\n\n const base = Math.trunc(dates[0]!);\n const days = dates.map(d => Math.trunc(d) - base);\n if (days.some(d => d < 0)) return FormulaValue.errorNum;\n\n return FormulaValue.number(xnpvAt(rate, values, days));\n}\n\nfunction xirr(a: Args, c: Ctx): FormulaValue {\n const valsRes = flatNumbers(a[0]!, c); if (!valsRes.ok) return valsRes.e;\n const datesRes = flatNumbers(a[1]!, c); if (!datesRes.ok) return datesRes.e;\n const values = valsRes.values;\n const dates = datesRes.values;\n if (values.length < 2 || values.length !== dates.length) return FormulaValue.errorNum;\n\n let guess = 0.1;\n if (a.length > 2) {\n const g = FormulaHelper.evalDouble(a[2]!, c);\n if (!g.ok) return g.error;\n guess = g.value;\n }\n\n const base = Math.trunc(dates[0]!);\n const days = dates.map(d => Math.trunc(d) - base);\n if (days.some(d => d < 0)) return FormulaValue.errorNum;\n\n // Analytic derivative: f'(r) = Σ −(dᵢ/365)·vᵢ / (1+r)^(dᵢ/365 + 1).\n const derivAt = (rate: number): number => {\n let sum = 0;\n for (let i = 0; i < values.length; i++) {\n const e = days[i]! / 365;\n sum += -e * values[i]! / Math.pow(1 + rate, e + 1);\n }\n return sum;\n };\n\n let rate = guess;\n for (let iter = 0; iter < 100; iter++) {\n const f = xnpvAt(rate, values, days);\n if (Math.abs(f) < 1e-7) return FormulaValue.number(rate);\n const deriv = derivAt(rate);\n if (deriv === 0) break;\n const next = rate - f / deriv;\n if (!isFinite(next) || next <= -1) break;\n if (Math.abs(next - rate) < 1e-9) { rate = next; break; }\n rate = next;\n }\n if (Math.abs(xnpvAt(rate, values, days)) < 1e-6) return FormulaValue.number(rate);\n return FormulaValue.errorNum;\n}\n","/**\n * Meta / language functions: LET (and later LAMBDA and its helpers).\n *\n * These are not ordinary value functions — they manipulate names and scopes,\n * so they inspect their argument AST nodes directly rather than only their\n * evaluated values.\n */\nimport { FormulaValue, ArrayValue, TailCall, type LambdaLike } from '../formula-value.js';\n\n/** Safety cap on trampoline iterations (guards a non-terminating tail loop). */\nconst MAX_TAIL_ITERATIONS = 10_000_000;\nimport { type FunctionRegistry } from '../function-registry.js';\nimport { NamedRangeNode, type FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerMeta(r: FunctionRegistry): void {\n r.register('LET', let_, 3);\n r.register('LAMBDA', lambda_, 1);\n r.register('MAP', map_, 2);\n r.register('REDUCE', reduce_, 3, 3);\n r.register('SCAN', scan_, 3, 3);\n r.register('BYROW', byRow, 2, 2);\n r.register('BYCOL', byCol, 2, 2);\n}\n\nconst asArray = (v: FormulaValue): ArrayValue =>\n v.isArray ? v.arrayVal : ArrayValue.fromScalar(v);\n\n/**\n * LET(name1, value1, [name2, value2, ...], calculation)\n *\n * Binds each name to its value in a fresh lexical scope, then evaluates the\n * final calculation. Later bindings may reference earlier ones. Names are\n * ordinary identifiers, which the parser represents as NamedRangeNode.\n */\nfunction let_(a: Args, c: Ctx): FormulaValue {\n // Need an odd count ≥ 3: pairs of (name, value) followed by one calculation.\n if (a.length < 3 || a.length % 2 === 0) return FormulaValue.errorValue;\n\n const bindings = new Map<string, FormulaValue>();\n c.pushScope(bindings);\n try {\n for (let i = 0; i < a.length - 1; i += 2) {\n const nameNode = a[i]!;\n if (!(nameNode instanceof NamedRangeNode)) return FormulaValue.errorValue;\n const value = a[i + 1]!.evaluate(c); // may reference names bound earlier\n if (value.isError) return value;\n bindings.set(nameNode.name.toUpperCase(), value);\n }\n return a[a.length - 1]!.evaluate(c);\n } finally {\n c.popScope();\n }\n}\n\n/**\n * LAMBDA(param1, ..., paramN, calculation)\n *\n * Produces a callable value. When invoked, each parameter is bound to its\n * argument in a fresh scope on the defining context and the calculation is\n * evaluated. Usable inline — LAMBDA(x,x+1)(5) — or via a defined name.\n */\nfunction lambda_(a: Args, c: Ctx): FormulaValue {\n const paramNodes = a.slice(0, -1);\n const body = a[a.length - 1]!;\n const params: string[] = [];\n for (const p of paramNodes) {\n if (!(p instanceof NamedRangeNode)) return FormulaValue.errorValue;\n params.push(p.name.toUpperCase());\n }\n const ctx = c; // capture defining context\n\n const lambda: LambdaLike = {\n arity: params.length,\n\n // One tail-aware evaluation of the body: binds params, then evaluates in\n // tail mode so a self/other tail call surfaces as a TailCall.\n step(args: FormulaValue[]): FormulaValue | TailCall {\n const bindings = new Map<string, FormulaValue>();\n params.forEach((p, i) => bindings.set(p, args[i] ?? FormulaValue.blank));\n ctx.pushScope(bindings);\n try {\n return body.evaluateTail(ctx);\n } finally {\n ctx.popScope();\n }\n },\n\n // Run to completion. Tail calls iterate here (O(1) stack); only non-tail\n // recursion re-enters call() and is bounded by the recursion guard.\n call(args: FormulaValue[]): FormulaValue {\n const guard = ctx.recursionGuard;\n if (guard) {\n if (guard.depth >= guard.max) return FormulaValue.errorNum; // too deep → #NUM!\n guard.depth++;\n }\n try {\n let current: LambdaLike = lambda;\n let currentArgs = args;\n for (let iter = 0; ; iter++) {\n if (iter > MAX_TAIL_ITERATIONS) return FormulaValue.errorNum;\n const r = current.step ? current.step(currentArgs) : current.call(currentArgs);\n if (r instanceof TailCall) {\n current = r.lambda;\n currentArgs = r.args;\n continue;\n }\n return r;\n }\n } finally {\n if (guard) guard.depth--;\n }\n },\n };\n\n return FormulaValue.lambda(lambda);\n}\n\n/** Resolves the trailing lambda argument. */\nfunction lambdaArg(node: FormulaNode, c: Ctx): { ok: true; fn: LambdaLike } | { ok: false; e: FormulaValue } {\n const v = node.evaluate(c);\n if (v.isError) return { ok: false, e: v };\n if (!v.isLambda) return { ok: false, e: FormulaValue.errorValue };\n return { ok: true, fn: v.lambdaVal };\n}\n\n// MAP(array1, [array2, ...], lambda) — element-wise map over one or more arrays.\nfunction map_(a: Args, c: Ctx): FormulaValue {\n const fn = lambdaArg(a[a.length - 1]!, c); if (!fn.ok) return fn.e;\n const arrays = a.slice(0, -1).map(n => asArray(n.evaluate(c)));\n if (arrays.length === 0) return FormulaValue.errorValue;\n const rows = arrays[0]!.rows, cols = arrays[0]!.columns;\n const out = new ArrayValue(rows, cols);\n for (let r = 0; r < rows; r++) {\n for (let col = 0; col < cols; col++) {\n out.set(r, col, fn.fn.call(arrays.map(ar => ar.get(r, col))));\n }\n }\n return FormulaValue.array(out);\n}\n\n// REDUCE(initial, array, lambda(acc, value)) — fold to a single value.\nfunction reduce_(a: Args, c: Ctx): FormulaValue {\n let acc = a[0]!.evaluate(c);\n if (acc.isError) return acc;\n const arr = asArray(a[1]!.evaluate(c));\n const fn = lambdaArg(a[2]!, c); if (!fn.ok) return fn.e;\n for (const v of arr.values()) {\n acc = fn.fn.call([acc, v]);\n if (acc.isError) return acc;\n }\n return acc;\n}\n\n// SCAN(initial, array, lambda(acc, value)) — running fold; returns an array.\nfunction scan_(a: Args, c: Ctx): FormulaValue {\n let acc = a[0]!.evaluate(c);\n if (acc.isError) return acc;\n const arr = asArray(a[1]!.evaluate(c));\n const fn = lambdaArg(a[2]!, c); if (!fn.ok) return fn.e;\n const out = new ArrayValue(arr.rows, arr.columns);\n for (let r = 0; r < arr.rows; r++) {\n for (let col = 0; col < arr.columns; col++) {\n acc = fn.fn.call([acc, arr.get(r, col)]);\n out.set(r, col, acc);\n }\n }\n return FormulaValue.array(out);\n}\n\n// BYROW(array, lambda(row)) — apply lambda to each row → column vector.\nfunction byRow(a: Args, c: Ctx): FormulaValue {\n const arr = asArray(a[0]!.evaluate(c));\n const fn = lambdaArg(a[1]!, c); if (!fn.ok) return fn.e;\n const out = new ArrayValue(arr.rows, 1);\n for (let r = 0; r < arr.rows; r++) {\n const row = new ArrayValue(1, arr.columns);\n for (let col = 0; col < arr.columns; col++) row.set(0, col, arr.get(r, col));\n out.set(r, 0, fn.fn.call([FormulaValue.array(row)]));\n }\n return FormulaValue.array(out);\n}\n\n// BYCOL(array, lambda(col)) — apply lambda to each column → row vector.\nfunction byCol(a: Args, c: Ctx): FormulaValue {\n const arr = asArray(a[0]!.evaluate(c));\n const fn = lambdaArg(a[1]!, c); if (!fn.ok) return fn.e;\n const out = new ArrayValue(1, arr.columns);\n for (let col = 0; col < arr.columns; col++) {\n const column = new ArrayValue(arr.rows, 1);\n for (let r = 0; r < arr.rows; r++) column.set(r, 0, arr.get(r, col));\n out.set(0, col, fn.fn.call([FormulaValue.array(column)]));\n }\n return FormulaValue.array(out);\n}\n","/**\n * SUBTOTAL and AGGREGATE — aggregates with visibility/nesting awareness.\n *\n * Both can skip rows hidden in the sheet and ignore nested SUBTOTAL/AGGREGATE\n * cells inside their ranges. That requires reference-level information (which\n * cell each value comes from, whether its row is hidden, what formula it holds),\n * so these functions inspect their argument nodes rather than only values, and\n * read the worksheet's optional isRowHidden/getCellFormula hooks.\n */\nimport { cellRefFromRowCol } from '@devmm/puredocs-excel';\nimport { FormulaValue } from '../formula-value.js';\nimport { type FunctionRegistry } from '../function-registry.js';\nimport { RangeReferenceNode, type FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerAggregate(r: FunctionRegistry): void {\n r.register('SUBTOTAL', subtotal, 2);\n r.register('AGGREGATE', aggregate, 3);\n}\n\ninterface CollectOptions {\n excludeHidden: boolean;\n /** Regex of formula names to treat as \"nested\" and skip, or null. */\n nestedPattern: RegExp | null;\n /** Skip cells whose evaluated value is an error (AGGREGATE option 6/7). */\n ignoreErrors: boolean;\n}\n\n/**\n * Collects the included values from the reference/value arguments starting at\n * `startIdx`, honouring hidden-row and nested-formula exclusions for cells that\n * come from same-sheet ranges. Returns the flat list of values, or an error.\n */\nfunction collectValues(\n a: Args,\n c: Ctx,\n startIdx: number,\n opts: CollectOptions,\n): { ok: true; values: FormulaValue[] } | { ok: false; error: FormulaValue } {\n const out: FormulaValue[] = [];\n const ws = c.worksheet;\n\n for (let i = startIdx; i < a.length; i++) {\n const node = a[i]!;\n if (node instanceof RangeReferenceNode) {\n const b = c.getRangeBounds(node.startRef, node.endRef);\n for (let row = b.startRow; row <= b.endRow; row++) {\n if (opts.excludeHidden && ws.isRowHidden?.(row)) continue;\n for (let col = b.startCol; col <= b.endCol; col++) {\n const ref = cellRefFromRowCol(row, col);\n if (opts.nestedPattern) {\n const f = ws.getCellFormula?.(ref);\n if (f && opts.nestedPattern.test(f)) continue; // skip nested SUBTOTAL/AGGREGATE\n }\n const v = c.getCellValue(ref);\n if (v.isError) {\n if (opts.ignoreErrors) continue;\n return { ok: false, error: v };\n }\n out.push(v);\n }\n }\n } else {\n const v = node.evaluate(c);\n if (v.isError) {\n if (opts.ignoreErrors) continue;\n return { ok: false, error: v };\n }\n if (v.isArray) {\n for (const item of v.arrayVal.values()) {\n if (item.isError) { if (opts.ignoreErrors) continue; return { ok: false, error: item }; }\n out.push(item);\n }\n } else {\n out.push(v);\n }\n }\n }\n return { ok: true, values: out };\n}\n\n/** Applies aggregate selector 1-11 (SUBTOTAL) / 1-19 (AGGREGATE) to values. */\nfunction applyAggregate(fn: number, values: FormulaValue[], extra?: number): FormulaValue {\n const nums: number[] = [];\n let countA = 0;\n for (const v of values) {\n if (!v.isBlank) countA++;\n const r = v.tryAsDouble();\n if (r.ok && !v.isText && !v.isBlank) nums.push(r.value);\n }\n\n const sum = () => nums.reduce((s, n) => s + n, 0);\n const avg = () => (nums.length ? sum() / nums.length : NaN);\n const variance = (sample: boolean): number => {\n const n = nums.length;\n if (sample ? n < 2 : n < 1) return NaN;\n const m = avg();\n const ss = nums.reduce((s, x) => s + (x - m) ** 2, 0);\n return ss / (sample ? n - 1 : n);\n };\n const sorted = () => [...nums].sort((x, y) => x - y);\n\n switch (fn) {\n case 1: return isNaN(avg()) ? FormulaValue.errorDiv0 : FormulaValue.number(avg());\n case 2: return FormulaValue.number(nums.length); // COUNT\n case 3: return FormulaValue.number(countA); // COUNTA\n case 4: return nums.length ? FormulaValue.number(Math.max(...nums)) : FormulaValue.zero;\n case 5: return nums.length ? FormulaValue.number(Math.min(...nums)) : FormulaValue.zero;\n case 6: return FormulaValue.number(nums.reduce((p, n) => p * n, 1)); // PRODUCT\n case 7: { const v = variance(true); return isNaN(v) ? FormulaValue.errorDiv0 : FormulaValue.number(Math.sqrt(v)); } // STDEV.S\n case 8: { const v = variance(false); return isNaN(v) ? FormulaValue.errorDiv0 : FormulaValue.number(Math.sqrt(v)); } // STDEV.P\n case 9: return FormulaValue.number(sum()); // SUM\n case 10: { const v = variance(true); return isNaN(v) ? FormulaValue.errorDiv0 : FormulaValue.number(v); } // VAR.S\n case 11: { const v = variance(false); return isNaN(v) ? FormulaValue.errorDiv0 : FormulaValue.number(v); } // VAR.P\n // AGGREGATE-only selectors:\n case 12: { const s = sorted(); const m = s.length; if (!m) return FormulaValue.errorNum;\n const mid = Math.floor(m / 2); return FormulaValue.number(m % 2 ? s[mid]! : (s[mid - 1]! + s[mid]!) / 2); } // MEDIAN\n case 14: { const s = sorted(); const k = Math.round(extra ?? 0); // LARGE\n return k >= 1 && k <= s.length ? FormulaValue.number(s[s.length - k]!) : FormulaValue.errorNum; }\n case 15: { const s = sorted(); const k = Math.round(extra ?? 0); // SMALL\n return k >= 1 && k <= s.length ? FormulaValue.number(s[k - 1]!) : FormulaValue.errorNum; }\n default: return FormulaValue.errorValue;\n }\n}\n\nfunction subtotal(a: Args, c: Ctx): FormulaValue {\n const fnVal = a[0]!.evaluate(c);\n if (fnVal.isError) return fnVal;\n const raw = fnVal.tryAsDouble();\n if (!raw.ok) return FormulaValue.errorValue;\n const code = Math.round(raw.value);\n const excludeHidden = code >= 101 && code <= 111;\n const fn = excludeHidden ? code - 100 : code;\n if (fn < 1 || fn > 11) return FormulaValue.errorValue;\n\n const collected = collectValues(a, c, 1, {\n excludeHidden,\n nestedPattern: /^\\s*SUBTOTAL\\s*\\(/i,\n ignoreErrors: false,\n });\n if (!collected.ok) return collected.error;\n return applyAggregate(fn, collected.values);\n}\n\nfunction aggregate(a: Args, c: Ctx): FormulaValue {\n const fnVal = a[0]!.evaluate(c);\n if (fnVal.isError) return fnVal;\n const optVal = a[1]!.evaluate(c);\n if (optVal.isError) return optVal;\n const fnR = fnVal.tryAsDouble();\n const optR = optVal.tryAsDouble();\n if (!fnR.ok || !optR.ok) return FormulaValue.errorValue;\n\n const fn = Math.round(fnR.value);\n const option = Math.round(optR.value);\n if (fn < 1 || fn > 19) return FormulaValue.errorValue;\n\n // option: 0/1 ignore nested SUBTOTAL/AGGREGATE; 2/3 also ignore errors;\n // 4 nothing; 5 ignore hidden rows; 6 ignore errors; 7 ignore hidden + errors.\n const excludeHidden = option === 1 || option === 3 || option === 5 || option === 7;\n const ignoreErrors = option === 2 || option === 3 || option === 6 || option === 7;\n const ignoreNested = option <= 3 || option === 5 || option === 7;\n\n // LARGE(14)/SMALL(15) take a k argument as the last value argument.\n let extra: number | undefined;\n let endIdx = a.length;\n if (fn === 14 || fn === 15) {\n const kVal = a[a.length - 1]!.evaluate(c);\n const kR = kVal.tryAsDouble();\n if (!kR.ok) return FormulaValue.errorValue;\n extra = kR.value;\n endIdx = a.length - 1;\n }\n\n const collected = collectValues(a.slice(0, endIdx), c, 2, {\n excludeHidden,\n nestedPattern: ignoreNested ? /^\\s*(SUBTOTAL|AGGREGATE)\\s*\\(/i : null,\n ignoreErrors,\n });\n if (!collected.ok) return collected.error;\n return applyAggregate(fn, collected.values, extra);\n}\n","/**\n * Dynamic-array functions (Excel 365): TRANSPOSE, SEQUENCE, UNIQUE, SORT,\n * FILTER, MMULT, TEXTSPLIT, VSTACK, HSTACK, TOCOL, TOROW.\n *\n * Each returns a FormulaValue array; the recalc engine spills it across a block\n * of cells. In a bare evaluateFormula call (no recalc engine) the array is\n * returned as-is and callers may read its top-left with implicit intersection.\n */\nimport { FormulaValue, ArrayValue, FormulaError } from '../formula-value.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerArray(r: FunctionRegistry): void {\n r.register('TRANSPOSE', transpose, 1, 1);\n r.register('SEQUENCE', sequence, 1, 4);\n r.register('UNIQUE', unique, 1, 3);\n r.register('SORT', sort, 1, 4);\n r.register('SORTBY', sortBy, 2);\n r.register('FILTER', filter, 2, 3);\n r.register('MMULT', mmult, 2, 2);\n r.register('TEXTSPLIT', textSplit, 2, 6);\n r.register('VSTACK', vstack, 1);\n r.register('HSTACK', hstack, 1);\n r.register('TOCOL', toCol, 1, 3);\n r.register('TOROW', toRow, 1, 3);\n}\n\n/** Excel grid limits — guard against runaway allocations from bad formulas. */\nconst MAX_ROWS = 1048576;\nconst MAX_COLS = 16384;\n\nconst asArray = (v: FormulaValue): ArrayValue =>\n v.isArray ? v.arrayVal : ArrayValue.fromScalar(v);\n\nfunction fromRows(rows: FormulaValue[][]): FormulaValue {\n const nr = rows.length;\n const nc = nr > 0 ? rows[0]!.length : 0;\n const arr = new ArrayValue(nr, nc);\n for (let r = 0; r < nr; r++) for (let c = 0; c < nc; c++) arr.set(r, c, rows[r]![c]!);\n return FormulaValue.array(arr);\n}\n\nfunction toRows(arr: ArrayValue): FormulaValue[][] {\n const rows: FormulaValue[][] = [];\n for (let r = 0; r < arr.rows; r++) {\n const row: FormulaValue[] = [];\n for (let c = 0; c < arr.columns; c++) row.push(arr.get(r, c));\n rows.push(row);\n }\n return rows;\n}\n\nconst num = (a: Args, c: Ctx, i: number, dflt: number): { ok: true; n: number } | { ok: false; e: FormulaValue } => {\n if (i >= a.length) return { ok: true, n: dflt };\n const r = FormulaHelper.evalDouble(a[i]!, c);\n return r.ok ? { ok: true, n: r.value } : { ok: false, e: r.error };\n};\n\nfunction transpose(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n if (v.isError) return v;\n return FormulaValue.array(asArray(v).transpose());\n}\n\nfunction sequence(a: Args, c: Ctx): FormulaValue {\n const rows = num(a, c, 0, 1); if (!rows.ok) return rows.e;\n const cols = num(a, c, 1, 1); if (!cols.ok) return cols.e;\n const start = num(a, c, 2, 1); if (!start.ok) return start.e;\n const step = num(a, c, 3, 1); if (!step.ok) return step.e;\n const R = Math.trunc(rows.n), C = Math.trunc(cols.n);\n if (R < 1 || C < 1) return FormulaValue.errorValue;\n const arr = new ArrayValue(R, C);\n for (let r = 0; r < R; r++) {\n for (let col = 0; col < C; col++) {\n arr.set(r, col, FormulaValue.number(start.n + (r * C + col) * step.n));\n }\n }\n return FormulaValue.array(arr);\n}\n\n/**\n * Canonical dedup key for one cell. Two cells that UNIQUE must treat as the same\n * yield the same string; distinct classes yield distinct strings. A kind prefix\n * prevents cross-type collisions (number 1 vs text \"1\" vs boolean TRUE).\n *\n * Deliberate deviations from FormulaValue.areEqual (which is a *comparison*\n * helper, not a dedup rule, and is not transitive):\n * • numbers use exact equality, not the 1e-10 fuzz — matches Excel UNIQUE and\n * restores transitivity (a fuzz-based key cannot have a canonical form);\n * • blank is its own class, never merged with 0 / \"\" / FALSE (Excel keeps an\n * empty cell and a 0 as distinct rows);\n * • errors dedupe by error code, so #N/A ≡ #N/A (areEqual returns false for\n * every error pair, which would leave error rows never deduplicated).\n */\nfunction cellKey(v: FormulaValue): string {\n switch (v.kind) {\n case 'number': return 'n' + (v.numberValue === 0 ? '0' : String(v.numberValue));\n case 'text': return 't' + v.textValue.toUpperCase(); // case-insensitive\n case 'boolean': return v.booleanValue ? 'b1' : 'b0';\n case 'blank': return 'B';\n case 'error': return 'e' + v.errorCode;\n default: return 'x'; // array/lambda never occur as a scalar cell\n }\n}\n\n/**\n * UNIQUE(array, [by_col], [exactly_once]).\n *\n * Single pass over the rows into a Map keyed by a canonical row key (length-\n * prefixed per cell so [\"a\",\"b\"] ≠ [\"ab\",\"\"]). O(n·k) time / O(u·k) memory\n * (u = distinct rows), replacing the previous O(n²·k) pairwise scan. Output\n * order follows first appearance; `exactly_once` filters on the per-key count\n * accumulated in the same pass — no second O(n²) counting sweep.\n */\nfunction unique(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c); if (v.isError) return v;\n const byCol = a.length > 1 ? a[1]!.evaluate(c).coerceToBool().booleanValue : false;\n const exactlyOnce = a.length > 2 ? a[2]!.evaluate(c).coerceToBool().booleanValue : false;\n\n const base = byCol ? asArray(v).transpose() : asArray(v);\n const map = new Map<string, { cells: FormulaValue[]; count: number }>();\n const order: string[] = [];\n for (let r = 0; r < base.rows; r++) {\n const cells: FormulaValue[] = new Array(base.columns);\n let key = '';\n for (let col = 0; col < base.columns; col++) {\n const cell = base.get(r, col);\n cells[col] = cell;\n const k = cellKey(cell);\n key += k.length + ':' + k;\n }\n const hit = map.get(key);\n if (hit) hit.count++;\n else { map.set(key, { cells, count: 1 }); order.push(key); }\n }\n\n const result: FormulaValue[][] = [];\n for (const key of order) {\n const e = map.get(key)!;\n if (exactlyOnce && e.count > 1) continue;\n result.push(e.cells);\n }\n if (result.length === 0) return FormulaValue.error(FormulaError.Calc);\n const out = fromRows(result);\n return byCol ? FormulaValue.array(out.arrayVal.transpose()) : out;\n}\n\n/**\n * Reads an argument as a vector of numbers. `sort_index` and `sort_order` are\n * scalar in the common case but may be array constants — `SORT(x,{3,1},{1,1})`\n * sorts by column 3, then by column 1 — so both shapes resolve to one vector and\n * the caller has a single path to handle.\n */\nconst numVector = (\n a: Args, c: Ctx, i: number, dflt: number,\n): { ok: true; v: number[] } | { ok: false; e: FormulaValue } => {\n if (i >= a.length) return { ok: true, v: [dflt] };\n const val = a[i]!.evaluate(c);\n if (val.isError) return { ok: false, e: val };\n\n const out: number[] = [];\n for (const item of val.isArray ? val.arrayVal.values() : [val]) {\n if (item.isBlank) continue; // a padded array constant contributes no key\n const d = item.tryAsDouble();\n if (!d.ok) return { ok: false, e: FormulaValue.errorValue };\n out.push(d.value);\n }\n return out.length > 0 ? { ok: true, v: out } : { ok: true, v: [dflt] };\n};\n\n/**\n * SORT(array, [sort_index], [sort_order], [by_col])\n *\n * sort_index may name several columns, in which case each is a tie-breaker for\n * the one before it. The rows are ordered by a single comparator walking the key\n * list, not by repeated passes: one O(n log n) sort regardless of key count, and\n * the data array is copied exactly once at the end.\n */\nfunction sort(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c); if (v.isError) return v;\n const indices = numVector(a, c, 1, 1); if (!indices.ok) return indices.e;\n const orders = numVector(a, c, 2, 1); if (!orders.ok) return orders.e;\n const byCol = a.length > 3 ? a[3]!.evaluate(c).coerceToBool().booleanValue : false;\n\n // Excel pairs the two lists positionally; a lone sort_order applies to every\n // key. Any other length mismatch is #VALUE!, not a guess.\n if (orders.v.length !== 1 && orders.v.length !== indices.v.length) {\n return FormulaValue.errorValue;\n }\n\n const base = byCol ? asArray(v).transpose() : asArray(v);\n const rows = toRows(base);\n\n const keys = indices.v.map((n, i) => ({\n col: Math.trunc(n) - 1,\n dir: (orders.v.length === 1 ? orders.v[0]! : orders.v[i]!) < 0 ? -1 : 1,\n }));\n const width = rows.length > 0 ? rows[0]!.length : 0;\n if (rows.length > 0 && keys.some(k => k.col < 0 || k.col >= width)) {\n return FormulaValue.errorValue;\n }\n\n const sorted = rows\n .map((r, i) => ({ r, i }))\n .sort((x, y) => {\n for (const k of keys) {\n const cmp = FormulaValue.compare(x.r[k.col]!, y.r[k.col]!) * k.dir;\n if (cmp !== 0) return cmp;\n }\n return x.i - y.i; // stable\n })\n .map(o => o.r);\n\n const out = fromRows(sorted);\n return byCol ? FormulaValue.array(out.arrayVal.transpose()) : out;\n}\n\n/**\n * SORTBY(array, by_array1, [sort_order1], [by_array2, sort_order2], ...)\n *\n * Sorts `array` by one or more parallel key vectors without reordering `array`\n * itself in place: we sort a permutation of indices (O(n log n), stable) and\n * materialise the result once. Keys are read into flat vectors up front — only\n * the (small) key columns are copied, never the potentially large data array,\n * which keeps peak memory proportional to the keys plus a single output copy.\n */\nfunction sortBy(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c); if (v.isError) return v;\n const data = asArray(v);\n\n // Parse the trailing (by_array, [sort_order]) groups. sort_order is optional\n // per group; we treat a scalar-numeric argument following a key as its order.\n const keys: { vals: FormulaValue[]; dir: number }[] = [];\n let i = 1;\n while (i < a.length) {\n const byVal = a[i]!.evaluate(c); if (byVal.isError) return byVal;\n i++;\n let dir = 1;\n if (i < a.length) {\n const maybeOrder = a[i]!.evaluate(c);\n if (maybeOrder.isError) return maybeOrder;\n if (!maybeOrder.isArray && maybeOrder.isNumeric) {\n const d = maybeOrder.tryAsDouble();\n if (d.ok) { dir = d.value < 0 ? -1 : 1; i++; }\n }\n }\n keys.push({ vals: [...asArray(byVal).values()], dir });\n }\n if (keys.length === 0) return FormulaValue.errorValue;\n\n // Axis: keys aligned to rows sort rows; keys aligned to columns sort columns.\n const n = keys[0]!.vals.length;\n if (keys.some(k => k.vals.length !== n)) return FormulaValue.errorValue;\n const byRow = n === data.rows;\n const byColumn = !byRow && n === data.columns;\n if (!byRow && !byColumn) return FormulaValue.errorValue;\n\n const perm = Array.from({ length: n }, (_, k) => k);\n perm.sort((x, y) => {\n for (const key of keys) {\n const cmp = FormulaValue.compare(key.vals[x]!, key.vals[y]!) * key.dir;\n if (cmp !== 0) return cmp;\n }\n return x - y; // stable\n });\n\n const out = new ArrayValue(data.rows, data.columns);\n if (byRow) {\n for (let r = 0; r < data.rows; r++) {\n const src = perm[r]!;\n for (let col = 0; col < data.columns; col++) out.set(r, col, data.get(src, col));\n }\n } else {\n for (let col = 0; col < data.columns; col++) {\n const src = perm[col]!;\n for (let r = 0; r < data.rows; r++) out.set(r, col, data.get(r, src));\n }\n }\n return FormulaValue.array(out);\n}\n\nfunction filter(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c); if (v.isError) return v;\n const inc = a[1]!.evaluate(c); if (inc.isError) return inc;\n const arr = asArray(v);\n const incArr = asArray(inc);\n\n // include is a column mask (per row) or a row mask (per column).\n const perRow = incArr.rows === arr.rows && incArr.columns === 1;\n const perCol = incArr.columns === arr.columns && incArr.rows === 1;\n if (!perRow && !perCol) return FormulaValue.errorValue;\n\n const keptRows: FormulaValue[][] = [];\n if (perRow) {\n for (let r = 0; r < arr.rows; r++) {\n if (!incArr.get(r, 0).coerceToBool().booleanValue) continue;\n const row: FormulaValue[] = [];\n for (let col = 0; col < arr.columns; col++) row.push(arr.get(r, col));\n keptRows.push(row);\n }\n } else {\n // Keep columns; build rows from kept columns.\n const keepCols: number[] = [];\n for (let col = 0; col < arr.columns; col++) {\n if (incArr.get(0, col).coerceToBool().booleanValue) keepCols.push(col);\n }\n for (let r = 0; r < arr.rows; r++) {\n keptRows.push(keepCols.map(col => arr.get(r, col)));\n }\n if (keepCols.length === 0) keptRows.length = 0;\n }\n\n if (keptRows.length === 0 || (keptRows[0] && keptRows[0].length === 0)) {\n return a.length > 2 ? a[2]!.evaluate(c) : FormulaValue.error(FormulaError.Calc);\n }\n return fromRows(keptRows);\n}\n\nfunction mmult(a: Args, c: Ctx): FormulaValue {\n const av = a[0]!.evaluate(c); if (av.isError) return av;\n const bv = a[1]!.evaluate(c); if (bv.isError) return bv;\n const A = asArray(av), B = asArray(bv);\n if (A.columns !== B.rows) return FormulaValue.errorValue;\n\n const out = new ArrayValue(A.rows, B.columns);\n for (let i = 0; i < A.rows; i++) {\n for (let j = 0; j < B.columns; j++) {\n let sum = 0;\n for (let k = 0; k < A.columns; k++) {\n const x = A.get(i, k).tryAsDouble();\n const y = B.get(k, j).tryAsDouble();\n if (!x.ok || !y.ok) return FormulaValue.errorValue;\n sum += x.value * y.value;\n }\n out.set(i, j, FormulaValue.number(sum));\n }\n }\n return FormulaValue.array(out);\n}\n\nfunction textSplit(a: Args, c: Ctx): FormulaValue {\n const t = FormulaHelper.evalString(a[0]!, c); if (!t.ok) return t.error;\n const colD = FormulaHelper.evalString(a[1]!, c); if (!colD.ok) return colD.error;\n let rowD = '';\n if (a.length > 2) {\n const rd = a[2]!.evaluate(c);\n if (rd.isError) return rd;\n if (!rd.isBlank) { const r = FormulaHelper.evalString(a[2]!, c); if (!r.ok) return r.error; rowD = r.value; }\n }\n\n const split = (s: string, d: string): string[] => (d === '' ? [s] : s.split(d));\n const lines = rowD ? split(t.value, rowD) : [t.value];\n const grid = lines.map(line => split(line, colD.value));\n const width = grid.reduce((m, r) => Math.max(m, r.length), 0);\n\n const rows: FormulaValue[][] = grid.map(r => {\n const row: FormulaValue[] = [];\n for (let i = 0; i < width; i++) row.push(FormulaValue.text(r[i] ?? ''));\n return row;\n });\n return fromRows(rows);\n}\n\n/**\n * VSTACK(array1, [array2], ...) — stack arrays vertically. The result width is\n * the widest input; shorter rows are padded with #N/A (Excel behaviour). Two\n * passes: size first, then copy element-by-element into a single output buffer\n * via `get`/`set` — inputs are never re-materialised, so peak memory is one\n * output array regardless of how large the inputs are.\n */\nfunction vstack(a: Args, c: Ctx): FormulaValue {\n // Errors are embedded as cell values (Excel behaviour), not propagated — a\n // downstream TOCOL(..,2) can then drop them.\n const parts: ArrayValue[] = [];\n let totalRows = 0, maxCols = 0;\n for (const node of a) {\n const arr = asArray(node.evaluate(c));\n parts.push(arr);\n totalRows += arr.rows;\n if (arr.columns > maxCols) maxCols = arr.columns;\n }\n if (totalRows > MAX_ROWS || maxCols > MAX_COLS) return FormulaValue.errorNum;\n\n const out = new ArrayValue(totalRows, maxCols);\n let rowOff = 0;\n for (const arr of parts) {\n for (let r = 0; r < arr.rows; r++) {\n for (let col = 0; col < maxCols; col++) {\n out.set(rowOff + r, col, col < arr.columns ? arr.get(r, col) : FormulaValue.errorNA);\n }\n }\n rowOff += arr.rows;\n }\n return FormulaValue.array(out);\n}\n\n/**\n * HSTACK(array1, [array2], ...) — stack arrays horizontally. Result height is\n * the tallest input; shorter columns are padded with #N/A.\n */\nfunction hstack(a: Args, c: Ctx): FormulaValue {\n const parts: ArrayValue[] = [];\n let totalCols = 0, maxRows = 0;\n for (const node of a) {\n const arr = asArray(node.evaluate(c));\n parts.push(arr);\n totalCols += arr.columns;\n if (arr.rows > maxRows) maxRows = arr.rows;\n }\n if (maxRows > MAX_ROWS || totalCols > MAX_COLS) return FormulaValue.errorNum;\n\n const out = new ArrayValue(maxRows, totalCols);\n let colOff = 0;\n for (const arr of parts) {\n for (let col = 0; col < arr.columns; col++) {\n for (let r = 0; r < maxRows; r++) {\n out.set(r, colOff + col, r < arr.rows ? arr.get(r, col) : FormulaValue.errorNA);\n }\n }\n colOff += arr.columns;\n }\n return FormulaValue.array(out);\n}\n\n/** Shared flatten for TOCOL/TOROW: walks the array in scan order, applying the\n * `ignore` filter, and returns the surviving values in order. Streams through\n * `get` without building an intermediate index array. */\nfunction flatten(a: Args, c: Ctx): { ok: true; values: FormulaValue[] } | { ok: false; e: FormulaValue } {\n const arr = asArray(a[0]!.evaluate(c));\n const ig = num(a, c, 1, 0); if (!ig.ok) return { ok: false, e: ig.e };\n const ignore = Math.trunc(ig.n); // bit 1 = skip blanks, bit 2 = skip errors\n const byCol = a.length > 2 ? a[2]!.evaluate(c).coerceToBool().booleanValue : false;\n\n const skip = (x: FormulaValue) =>\n (((ignore & 1) !== 0) && x.isBlank) || (((ignore & 2) !== 0) && x.isError);\n\n const values: FormulaValue[] = [];\n if (byCol) {\n for (let col = 0; col < arr.columns; col++)\n for (let r = 0; r < arr.rows; r++) { const x = arr.get(r, col); if (!skip(x)) values.push(x); }\n } else {\n for (let r = 0; r < arr.rows; r++)\n for (let col = 0; col < arr.columns; col++) { const x = arr.get(r, col); if (!skip(x)) values.push(x); }\n }\n return { ok: true, values };\n}\n\n/** TOCOL(array, [ignore], [scan_by_column]) — flatten to a single column. */\nfunction toCol(a: Args, c: Ctx): FormulaValue {\n const f = flatten(a, c); if (!f.ok) return f.e;\n if (f.values.length === 0) return FormulaValue.errorNA;\n const out = new ArrayValue(f.values.length, 1);\n for (let i = 0; i < f.values.length; i++) out.set(i, 0, f.values[i]!);\n return FormulaValue.array(out);\n}\n\n/** TOROW(array, [ignore], [scan_by_column]) — flatten to a single row. */\nfunction toRow(a: Args, c: Ctx): FormulaValue {\n const f = flatten(a, c); if (!f.ok) return f.e;\n if (f.values.length === 0) return FormulaValue.errorNA;\n const out = new ArrayValue(1, f.values.length);\n for (let i = 0; i < f.values.length; i++) out.set(0, i, f.values[i]!);\n return FormulaValue.array(out);\n}\n","/**\n * Central registry of all supported Excel functions.\n * Port of TVE.PureDocs.Excel.Formulas.FunctionRegistry (C#)\n */\nimport { FormulaValue } from './formula-value.js';\nimport type { FormulaNode } from './formula-node.js';\nimport type { FormulaContext } from './formula-context.js';\nimport { registerMath } from './functions/math-functions.js';\nimport { registerText } from './functions/text-functions.js';\nimport { registerLogical } from './functions/logical-functions.js';\nimport { registerDate } from './functions/date-functions.js';\nimport { registerLookup } from './functions/lookup-functions.js';\nimport { registerStatistical } from './functions/statistical-functions.js';\nimport { registerInfo } from './functions/info-functions.js';\nimport { registerFinance } from './functions/finance-functions.js';\nimport { registerMeta } from './functions/meta-functions.js';\nimport { registerAggregate } from './functions/aggregate-functions.js';\nimport { registerArray } from './functions/array-functions.js';\n\nexport type FormulaFunction = (args: FormulaNode[], ctx: FormulaContext) => FormulaValue;\n\nexport interface FunctionDef {\n readonly name: string;\n readonly minArgs: number;\n readonly maxArgs: number; // -1 = unlimited\n readonly isVolatile: boolean;\n readonly handler: FormulaFunction;\n}\n\nexport class FunctionRegistry {\n static #default: FunctionRegistry | undefined;\n\n /** Lazily-created default registry with all built-in functions registered. */\n static get default(): FunctionRegistry {\n if (!FunctionRegistry.#default) {\n FunctionRegistry.#default = new FunctionRegistry();\n FunctionRegistry.#default.#registerBuiltIns();\n }\n return FunctionRegistry.#default;\n }\n\n readonly #functions = new Map<string, FunctionDef>();\n\n /** Registers a function. Name is normalised to UPPERCASE. */\n register(\n name: string,\n handler: FormulaFunction,\n minArgs = 0,\n maxArgs = -1,\n isVolatile = false,\n ): void {\n this.#functions.set(name.toUpperCase(), {\n name: name.toUpperCase(), minArgs, maxArgs, isVolatile, handler,\n });\n }\n\n /** Executes a function by name with argument validation. */\n execute(name: string, args: FormulaNode[], ctx: FormulaContext): FormulaValue {\n const def = this.#functions.get(name.toUpperCase());\n if (!def) return FormulaValue.errorName;\n\n if (args.length < def.minArgs) return FormulaValue.errorValue;\n if (def.maxArgs >= 0 && args.length > def.maxArgs) return FormulaValue.errorValue;\n\n try {\n return def.handler(args, ctx);\n } catch {\n return FormulaValue.errorValue;\n }\n }\n\n /** Returns true if the named function is volatile (NOW, RAND, etc.). */\n isVolatile(name: string): boolean {\n return this.#functions.get(name.toUpperCase())?.isVolatile ?? false;\n }\n\n /** Returns true if the function is registered. */\n has(name: string): boolean {\n return this.#functions.has(name.toUpperCase());\n }\n\n #registerBuiltIns(): void {\n // Static imports keep registration synchronous and deterministic.\n // The circular import (registry ↔ function modules) is safe because the\n // register* bindings are only invoked here at call time, never during\n // module evaluation.\n registerMath(this);\n registerText(this);\n registerLogical(this);\n registerDate(this);\n registerLookup(this);\n registerStatistical(this);\n registerInfo(this);\n registerFinance(this);\n registerMeta(this);\n registerAggregate(this);\n registerArray(this);\n }\n}\n\n// ── FormulaHelper — shared utilities used by function implementations ─────────\n\nexport namespace FormulaHelper {\n /** Evaluates a node and coerces to number, propagating errors. */\n export function evalDouble(\n node: FormulaNode,\n ctx: FormulaContext,\n ): { ok: true; value: number } | { ok: false; error: FormulaValue } {\n const v = node.evaluate(ctx);\n if (v.isError) return { ok: false, error: v };\n const r = v.tryAsDouble();\n if (!r.ok) return { ok: false, error: FormulaValue.errorValue };\n return { ok: true, value: r.value };\n }\n\n /** Evaluates a node and coerces to string, propagating errors. */\n export function evalString(\n node: FormulaNode,\n ctx: FormulaContext,\n ): { ok: true; value: string } | { ok: false; error: FormulaValue } {\n const v = node.evaluate(ctx);\n if (v.isError) return { ok: false, error: v };\n return { ok: true, value: v.asText() };\n }\n\n /**\n * Collects numbers from all args (expanding arrays, skipping blanks/text).\n * Returns false + error value if any arg is an error.\n */\n export function collectNumbers(\n args: FormulaNode[],\n ctx: FormulaContext,\n ): { ok: true; values: number[] } | { ok: false; error: FormulaValue } {\n const nums: number[] = [];\n for (const arg of args) {\n const v = arg.evaluate(ctx);\n if (v.isError) return { ok: false, error: v };\n if (v.isArray) {\n for (const item of v.arrayVal.values()) {\n if (item.isBlank || item.isText) continue;\n if (item.isError) return { ok: false, error: item };\n const r = item.tryAsDouble();\n if (r.ok) nums.push(r.value);\n }\n } else if (!v.isBlank && !v.isText) {\n const r = v.tryAsDouble();\n if (!r.ok) return { ok: false, error: FormulaValue.errorValue };\n nums.push(r.value);\n }\n }\n return { ok: true, values: nums };\n }\n\n /** Flattens all args into FormulaValue array (expanding arrays). */\n export function flattenArgs(\n args: FormulaNode[],\n ctx: FormulaContext,\n ): FormulaValue[] {\n const result: FormulaValue[] = [];\n for (const arg of args) {\n const v = arg.evaluate(ctx);\n if (v.isArray) {\n for (const item of v.arrayVal.values()) result.push(item);\n } else {\n result.push(v);\n }\n }\n return result;\n }\n\n /**\n * A criteria string analysed once, so testing it against N values does not\n * re-parse it N times.\n *\n * `kind` is what lets a caller index instead of scan: `equalsNumber` and\n * `equalsText` are the two shapes whose matching positions can be looked up,\n * and they are the overwhelming majority in real files (`SUMIFS(H:H, W:W, W282)`).\n * Everything else — comparisons, wildcards — only gets the compiled `test`.\n */\n export interface CompiledCriteria {\n readonly kind: 'equalsNumber' | 'equalsText' | 'compareNumber' | 'other';\n /** For `equalsNumber` and `compareNumber`: the number compared against. */\n readonly number?: number;\n /** For `equalsText`: the criterion, upper-cased (matching is case-insensitive). */\n readonly text?: string;\n /** For `compareNumber`: which comparison. */\n readonly op?: '>' | '>=' | '<' | '<=';\n readonly test: (value: FormulaValue) => boolean;\n }\n\n /**\n * Compiles a criteria string into a reusable predicate.\n *\n * Same semantics as {@link matchesCriteria} — that function is now this one\n * applied immediately — but the parsing, the number conversion and any wildcard\n * RegExp happen once instead of once per cell. A SUMIFS filled down 291 rows\n * over a 291-cell range was doing that 84 000 times.\n */\n export function compileCriteria(criteria: string): CompiledCriteria {\n const trimmed = criteria.trim();\n\n // Comparison operator prefix\n const opMatch = /^(>=|<=|<>|>|<|=)(.*)$/.exec(trimmed);\n if (opMatch) {\n const op = opMatch[1]!;\n const rhs = opMatch[2]!;\n const rhsVal = parseFloat(rhs);\n const rhsNum = isNaN(rhsVal) ? null : rhsVal;\n const rhsValue = rhsNum !== null ? FormulaValue.number(rhsNum) : FormulaValue.text(rhs);\n\n if (op === '=') {\n return rhsNum !== null\n ? numberEquality(rhsNum)\n : textEquality(rhs);\n }\n if (op === '<>') {\n // The complement of an equality is almost the whole range, so there is\n // nothing to gain from a list of positions here.\n return { kind: 'other', test: v => !FormulaValue.areEqual(v, rhsValue) };\n }\n const wanted = op === '>' ? (c: number) => c > 0\n : op === '>=' ? (c: number) => c >= 0\n : op === '<' ? (c: number) => c < 0\n : (c: number) => c <= 0;\n const test = (v: FormulaValue): boolean => wanted(FormulaValue.compare(v, rhsValue));\n\n // A numeric right-hand side is the indexable case: `compare` ranks by class\n // first (number/blank < text < boolean), so every text value gets the same\n // verdict, every boolean gets the same verdict, and only the numbers form an\n // interval. Against a *text* right-hand side, text values compare\n // lexicographically one by one, with no such uniformity — those stay on the\n // scan path.\n return rhsNum !== null\n ? { kind: 'compareNumber', number: rhsNum, op: op as '>' | '>=' | '<' | '<=', test }\n : { kind: 'other', test };\n }\n\n // Wildcard string matching — the RegExp is built once, not per value.\n if (trimmed.includes('*') || trimmed.includes('?')) {\n const pattern = wildcardToRegex(trimmed);\n return { kind: 'other', test: v => pattern.test(v.asText()) };\n }\n\n // Exact match\n const num = parseFloat(trimmed);\n return isNaN(num) ? textEquality(trimmed) : numberEquality(num);\n }\n\n /**\n * Equality against a number, with Excel's semantics: only a numeric cell can\n * match, plus a blank one when the criterion is (within tolerance of) zero.\n */\n function numberEquality(n: number): CompiledCriteria {\n const target = FormulaValue.number(n);\n return { kind: 'equalsNumber', number: n, test: v => FormulaValue.areEqual(v, target) };\n }\n\n /**\n * Equality against text: case-insensitive comparison of the value's *display*\n * text, so `\"5\"` as a criterion here would also match the number 5 — which is\n * why a numeric-looking criterion never reaches this branch.\n */\n function textEquality(s: string): CompiledCriteria {\n const upper = s.toUpperCase();\n return { kind: 'equalsText', text: upper, test: v => v.asText().toUpperCase() === upper };\n }\n\n /** Matches a criteria string (e.g. \">5\", \"=hello\", \"*partial*\") against a value. */\n export function matchesCriteria(value: FormulaValue, criteria: string): boolean {\n return compileCriteria(criteria).test(value);\n }\n\n function wildcardToRegex(pattern: string): RegExp {\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n return new RegExp(`^${escaped}$`, 'i');\n }\n}\n","/**\n * Evaluation context — resolves cell/range values, dispatches functions.\n * Port of TVE.PureDocs.Excel.Formulas.FormulaContext (C#)\n */\nimport { parseCellRef, cellRefFromRowCol } from '@devmm/puredocs-excel';\nimport { FormulaValue, ArrayValue } from './formula-value.js';\nimport { FunctionRegistry } from './function-registry.js';\nimport type { RangeCache } from './range-cache.js';\nimport type { FormulaNode } from './formula-node.js';\n\n// Forward declaration to avoid circular import\nexport interface WorksheetLike {\n getCellValue(reference: string): unknown;\n name: string;\n /**\n * Optional: value of a cell by 1-based row/column. Range reads use this when\n * present, which saves building — and re-parsing — one reference string per\n * cell. Implementations that resolve values lazily inside getCellValue should\n * leave it undefined to keep that path.\n */\n getCellValueAt?(row: number, column: number): unknown;\n /**\n * Optional: the populated extent of the sheet — the highest 1-based row and\n * column that hold a cell (0 when empty). Used to bound whole-column and\n * whole-row references (`A:A`, `1:1`), which Excel evaluates over the used\n * range rather than all 1,048,576 rows.\n */\n readonly usedBounds?: { rowCount: number; columnCount: number };\n /** Optional: whether a 1-based row is hidden (used by SUBTOTAL/AGGREGATE). */\n isRowHidden?(row: number): boolean;\n /** Optional: formula text of a cell (used by SUBTOTAL to skip nested calls). */\n getCellFormula?(reference: string): string | null;\n /** Optional: spill range (e.g. \"A1:A3\") of a dynamic-array anchor, for A1#. */\n getSpillRange?(reference: string): string | null;\n}\n\nexport interface WorkbookLike {\n worksheets: readonly WorksheetLike[];\n getWorksheet(name: string): WorksheetLike;\n /**\n * Optional resolver for defined names (named ranges). Returns the refers-to\n * expression (without leading '='), following Excel scoping: a name scoped to\n * `sheetName` wins over the workbook-global name. When this method is absent\n * (or returns undefined), named-range references evaluate to #NAME?.\n *\n * @devmm/puredocs-excel's Workbook implements this.\n */\n getDefinedName?(name: string, sheetName?: string): string | undefined;\n}\n\nexport class FormulaContext {\n readonly #sheet: WorksheetLike;\n readonly #functions: FunctionRegistry;\n readonly #evaluating: Set<string>;\n\n /** Row of the formula cell (for @ implicit intersection). */\n formulaRow: number;\n /** Column of the formula cell (for @ implicit intersection). */\n formulaCol: number;\n\n /** Optional workbook reference for cross-sheet references. */\n workbook?: WorkbookLike;\n\n /**\n * Optional memo for range reads, supplied by whoever owns the write side —\n * the recalculation engine, which invalidates it as it writes results. Left\n * undefined for one-shot evaluation, where a stale entry could otherwise\n * outlive a caller's direct edit to the model.\n */\n rangeCache?: RangeCache;\n\n /**\n * Optional named-range resolver, installed by the evaluator when the workbook\n * exposes getDefinedName. Given a name, returns its evaluated value. Left\n * undefined when no resolver is available, in which case named ranges are\n * #NAME? (unchanged legacy behaviour).\n */\n nameResolver?: (name: string) => FormulaValue;\n\n /**\n * Shared recursion budget for LAMBDA calls, threaded across all contexts in a\n * single evaluation. Guards non-tail recursion (which grows the JS stack);\n * tail recursion is trampolined and does not count against it.\n */\n recursionGuard?: { depth: number; max: number };\n\n /**\n * Lexical scope stack for LET/LAMBDA local names. Each frame maps an\n * upper-cased local name to its value. Names resolve innermost-first and take\n * precedence over workbook defined names.\n */\n readonly #scopes: Array<Map<string, FormulaValue>> = [];\n\n /** Pushes a new binding frame (used by LET/LAMBDA). */\n pushScope(bindings: Map<string, FormulaValue>): void {\n this.#scopes.push(bindings);\n }\n\n /** Pops the innermost binding frame. */\n popScope(): void {\n this.#scopes.pop();\n }\n\n #lookupScope(name: string): FormulaValue | undefined {\n if (this.#scopes.length === 0) return undefined;\n const key = name.toUpperCase();\n for (let i = this.#scopes.length - 1; i >= 0; i--) {\n const v = this.#scopes[i]!.get(key);\n if (v !== undefined) return v;\n }\n return undefined;\n }\n\n constructor(\n sheet: WorksheetLike,\n formulaRow = 0,\n formulaCol = 0,\n evaluating?: Set<string>,\n registry?: FunctionRegistry,\n ) {\n this.#sheet = sheet;\n this.formulaRow = formulaRow;\n this.formulaCol = formulaCol;\n this.#evaluating = evaluating ?? new Set<string>();\n this.#functions = registry ?? FunctionRegistry.default;\n }\n\n get worksheet(): WorksheetLike { return this.#sheet; }\n\n // ── Cell/Range resolution ─────────────────────────────────────────────────\n\n getCellValue(cellReference: string): FormulaValue {\n const norm = cellReference.replace(/\\$/g, '').toUpperCase();\n\n // Circular reference detection\n if (this.#evaluating.has(norm)) return FormulaValue.errorRef;\n this.#evaluating.add(norm);\n\n try {\n const raw = this.#sheet.getCellValue(cellReference);\n return FormulaValue.fromObjectSync(raw);\n } finally {\n this.#evaluating.delete(norm);\n }\n }\n\n getRangeValues(startRef: string, endRef: string): FormulaValue {\n const s = parseCellRef(startRef);\n const e = parseCellRef(endRef);\n return this.getRangeValuesByIndex(s.row, s.column, e.row, e.column);\n }\n\n /**\n * Resolves a rectangle already known in coordinates. Split out from\n * {@link getRangeValues} because whole-column references and the range memo\n * both work in numbers, and formatting them back into `A1` strings only to\n * re-parse them is measurable at range scale.\n */\n getRangeValuesByIndex(\n startRow: number,\n startCol: number,\n endRow: number,\n endCol: number,\n ): FormulaValue {\n const rows = endRow - startRow + 1;\n const cols = endCol - startCol + 1;\n\n // A single cell is cheaper to read than to memo, and the cache would fill\n // with entries that never see a second hit.\n const cache = rows * cols > 1 ? this.rangeCache : undefined;\n const sheetKey = cache ? this.#sheet.name.toUpperCase() : '';\n if (cache) {\n const hit = cache.get(sheetKey, startRow, startCol, endRow, endCol);\n if (hit !== undefined) return hit;\n }\n\n const arr = new ArrayValue(rows, cols);\n // Fast path: the sheet can address cells by coordinate, so no per-cell\n // reference string is built and the circular-reference guard — which cannot\n // fire on a plain value read — is skipped.\n const at = this.#sheet.getCellValueAt;\n if (at) {\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n arr.set(r, c, FormulaValue.fromObjectSync(at.call(this.#sheet, startRow + r, startCol + c)));\n }\n }\n } else {\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const ref = cellRefFromRowCol(startRow + r, startCol + c);\n arr.set(r, c, this.getCellValue(ref));\n }\n }\n }\n\n const value = FormulaValue.array(arr);\n if (cache && rows > 0 && cols > 0) {\n cache.set(sheetKey, startRow, startCol, endRow, endCol, value, rows * cols);\n }\n return value;\n }\n\n /**\n * Resolves a whole-column (`A:A`) or whole-row (`1:1`) reference, bounded by\n * the sheet's used range the way Excel does. Without a bound this would\n * materialise a million-cell array for a sheet with twelve rows in it.\n *\n * A sheet that cannot report its extent yields `#REF!` rather than a guess:\n * silently reading nothing would make SUM(A:A) return 0 on a full column.\n */\n getFullRangeValues(\n startCol: number | null,\n endCol: number | null,\n startRow: number | null,\n endRow: number | null,\n ): FormulaValue {\n const bounds = this.#sheet.usedBounds;\n if (!bounds) return FormulaValue.errorRef;\n if (bounds.rowCount === 0 || bounds.columnCount === 0) return FormulaValue.blank;\n\n const r0 = startRow ?? 1;\n const r1 = endRow ?? bounds.rowCount;\n const c0 = startCol ?? 1;\n const c1 = endCol ?? bounds.columnCount;\n // Clamp to the used range: the unbounded dimension follows it, and the\n // bounded one may still point past the data.\n const lastRow = Math.min(r1, bounds.rowCount);\n const lastCol = Math.min(c1, bounds.columnCount);\n if (lastRow < r0 || lastCol < c0) return FormulaValue.blank;\n\n return this.getRangeValuesByIndex(r0, c0, lastRow, lastCol);\n }\n\n getSheetCellValue(sheetName: string, cellReference: string): FormulaValue {\n if (!this.workbook) return FormulaValue.errorRef;\n try {\n return this.#forSheet(sheetName).getCellValue(cellReference);\n } catch {\n return FormulaValue.errorRef;\n }\n }\n\n getSheetRangeValues(sheetName: string, startRef: string, endRef: string): FormulaValue {\n if (!this.workbook) return FormulaValue.errorRef;\n try {\n return this.#forSheet(sheetName).getRangeValues(startRef, endRef);\n } catch {\n return FormulaValue.errorRef;\n }\n }\n\n /** Whole-column/whole-row reference qualified by a sheet name. */\n getSheetFullRangeValues(\n sheetName: string,\n startCol: number | null,\n endCol: number | null,\n startRow: number | null,\n endRow: number | null,\n ): FormulaValue {\n if (!this.workbook) return FormulaValue.errorRef;\n try {\n return this.#forSheet(sheetName).getFullRangeValues(startCol, endCol, startRow, endRow);\n } catch {\n return FormulaValue.errorRef;\n }\n }\n\n /**\n * A sibling context bound to another sheet, sharing this one's circular-\n * reference guard and range memo. These contexts only read values — they\n * never evaluate an AST — so the name resolver and recursion budget are\n * deliberately not carried over; passing them would suggest a scoping\n * relationship that does not exist. The memo, on the other hand, must be\n * carried: cross-sheet ranges are the most expensive reads in a workbook.\n */\n #forSheet(sheetName: string): FormulaContext {\n const sheet = this.workbook!.getWorksheet(sheetName);\n const ctx = new FormulaContext(sheet, this.formulaRow, this.formulaCol, this.#evaluating, this.#functions);\n ctx.workbook = this.workbook;\n ctx.rangeCache = this.rangeCache;\n return ctx;\n }\n\n resolveNamedRange(name: string): FormulaValue {\n // LET/LAMBDA locals shadow everything else.\n const scoped = this.#lookupScope(name);\n if (scoped !== undefined) return scoped;\n // Otherwise delegate to the evaluator-installed nameResolver, which looks\n // the name up on the workbook and evaluates its refers-to expression.\n // Absent a resolver, a named reference is #NAME? (legacy behaviour).\n return this.nameResolver ? this.nameResolver(name) : FormulaValue.errorName;\n }\n\n /**\n * Resolves a spill-range reference (A1#) to the array spilling from the anchor\n * cell. Requires the worksheet to expose getSpillRange; otherwise #REF!.\n */\n resolveSpillRange(anchorRef: string): FormulaValue {\n const spillRef = this.#sheet.getSpillRange?.(anchorRef);\n if (!spillRef) return FormulaValue.errorRef;\n const colon = spillRef.indexOf(':');\n if (colon < 0) return this.getCellValue(spillRef);\n return this.getRangeValues(spillRef.slice(0, colon), spillRef.slice(colon + 1));\n }\n\n getRangeBounds(startRef: string, endRef: string): { startRow: number; startCol: number; endRow: number; endCol: number } {\n const s = parseCellRef(startRef);\n const e = parseCellRef(endRef);\n return { startRow: s.row, startCol: s.column, endRow: e.row, endCol: e.column };\n }\n\n // ── Function dispatch ─────────────────────────────────────────────────────\n\n /** True if a built-in function with this name is registered. */\n hasFunction(name: string): boolean {\n return this.#functions.has(name);\n }\n\n evaluateFunction(name: string, args: FormulaNode[]): FormulaValue {\n // A call to an unregistered name may be a call to a named LAMBDA.\n if (!this.#functions.has(name)) {\n const named = this.resolveNamedRange(name);\n if (named.isLambda) {\n return named.lambdaVal.call(args.map(a => a.evaluate(this)));\n }\n }\n return this.#functions.execute(name, args, this);\n }\n}\n","/**\n * Least-Recently-Used cache using JavaScript Map insertion-order semantics.\n * Port of TVE.PureDocs.Excel.Formulas.LruCache<TKey, TValue> (C#)\n *\n * JS Map maintains insertion order, so LRU eviction is simply:\n * delete oldest key = map.keys().next().value\n * move to end = delete + re-insert\n *\n * This is simpler and faster than the C# LinkedList + Dictionary approach.\n */\nexport class LruCache<K, V> {\n readonly #map: Map<K, V>;\n #capacity: number;\n\n #hits = 0;\n #misses = 0;\n #evictions = 0;\n\n constructor(capacity: number) {\n if (capacity <= 0) throw new RangeError('LruCache capacity must be > 0.');\n this.#capacity = capacity;\n this.#map = new Map();\n }\n\n get capacity(): number { return this.#capacity; }\n get size(): number { return this.#map.size; }\n get hits(): number { return this.#hits; }\n get misses(): number { return this.#misses; }\n get evictions():number { return this.#evictions; }\n get hitRate(): number {\n const total = this.#hits + this.#misses;\n return total === 0 ? 0 : this.#hits / total;\n }\n\n /**\n * Returns the value for key, or undefined if not present.\n * Moves the accessed key to the \"most recently used\" end.\n */\n get(key: K): V | undefined {\n const value = this.#map.get(key);\n if (value === undefined) {\n this.#misses++;\n return undefined;\n }\n // Move to end (most recently used)\n this.#map.delete(key);\n this.#map.set(key, value);\n this.#hits++;\n return value;\n }\n\n /**\n * Inserts or updates a key-value pair.\n * Evicts the least-recently-used entry if over capacity.\n */\n set(key: K, value: V): void {\n if (this.#map.has(key)) {\n // Update: remove and re-insert to move to end\n this.#map.delete(key);\n } else if (this.#map.size >= this.#capacity) {\n // Evict oldest (first key in Map)\n const oldest = this.#map.keys().next().value as K;\n this.#map.delete(oldest);\n this.#evictions++;\n }\n this.#map.set(key, value);\n }\n\n /** Removes a key from the cache. Returns true if it existed. */\n delete(key: K): boolean {\n return this.#map.delete(key);\n }\n\n /** Returns true if the key is present (does NOT update LRU order). */\n has(key: K): boolean {\n return this.#map.has(key);\n }\n\n /** Removes all entries and resets statistics. */\n clear(): void {\n this.#map.clear();\n this.#hits = this.#misses = this.#evictions = 0;\n }\n\n /** Resizes the cache, evicting oldest entries if necessary. */\n resize(newCapacity: number): void {\n if (newCapacity <= 0) throw new RangeError('Capacity must be > 0.');\n this.#capacity = newCapacity;\n while (this.#map.size > newCapacity) {\n const oldest = this.#map.keys().next().value as K;\n this.#map.delete(oldest);\n this.#evictions++;\n }\n }\n}\n","/**\n * Main entry point for formula evaluation.\n * Port of TVE.PureDocs.Excel.Formulas.FormulaEvaluator (C#)\n *\n * Includes LRU cache for parsed ASTs to avoid re-parsing identical formulas.\n */\nimport { FormulaLexer } from './formula-lexer.js';\nimport { FormulaParser } from './formula-parser.js';\nimport { FormulaContext, type WorksheetLike, type WorkbookLike } from './formula-context.js';\nimport { FormulaValue } from './formula-value.js';\nimport { LruCache } from './lru-cache.js';\nimport type { RangeCache } from './range-cache.js';\nimport type { FormulaNode } from './formula-node.js';\n\nconst DEFAULT_CACHE_CAPACITY = 10_000;\n\n// Global AST cache shared across all evaluations (formula text → AST)\nconst astCache = new LruCache<string, FormulaNode>(DEFAULT_CACHE_CAPACITY);\n\n/**\n * Parses a formula string to an AST, with LRU caching.\n */\nexport function parseFormula(formula: string): FormulaNode {\n const stripped = formula.startsWith('=') ? formula.slice(1) : formula;\n const cached = astCache.get(stripped);\n if (cached !== undefined) return cached;\n\n const ast = parseFormulaUncached(stripped);\n astCache.set(stripped, ast);\n return ast;\n}\n\n/**\n * Parses a formula without consulting or populating the shared AST cache.\n *\n * For callers that keep the AST themselves — the recalculation engine holds one\n * per registered formula — the cache is pure overhead: it would evict entries\n * that are still live elsewhere once a workbook has more formulas than its\n * capacity, paying eviction cost and retaining memory for no hits.\n */\nexport function parseFormulaUncached(formula: string): FormulaNode {\n const stripped = formula.startsWith('=') ? formula.slice(1) : formula;\n const tokens = new FormulaLexer(stripped).tokenize();\n return new FormulaParser(tokens).parse();\n}\n\n/** Default cap on non-tail LAMBDA recursion depth (JS stack safety). */\nconst DEFAULT_LAMBDA_DEPTH = 1024;\n\ninterface BuildContextOptions {\n workbook?: WorkbookLike;\n formulaRow?: number;\n formulaCol?: number;\n /** Shared cell-evaluation guard (circular cell reference detection). */\n evaluating?: Set<string>;\n /** Shared named-range-resolution guard (circular name detection). */\n resolvingNames?: Set<string>;\n /** Shared cache of resolved names within one top-level evaluation. */\n resolvedNames?: Map<string, FormulaValue>;\n /** Shared recursion budget for LAMBDA calls. */\n recursionGuard?: { depth: number; max: number };\n /** Optional range memo, owned and invalidated by the caller. */\n rangeCache?: RangeCache;\n}\n\n/**\n * Builds a FormulaContext, wiring the named-range resolver when the workbook\n * exposes getDefinedName. The evaluation and name-resolution guard sets, the\n * resolved-name cache, and the recursion guard are threaded into child contexts.\n */\nfunction buildContext(sheet: WorksheetLike, opts: BuildContextOptions): FormulaContext {\n const evaluating = opts.evaluating ?? new Set<string>();\n const ctx = new FormulaContext(\n sheet,\n opts.formulaRow ?? 0,\n opts.formulaCol ?? 0,\n evaluating,\n );\n ctx.recursionGuard = opts.recursionGuard ?? { depth: 0, max: DEFAULT_LAMBDA_DEPTH };\n ctx.rangeCache = opts.rangeCache;\n\n const wb = opts.workbook;\n if (wb) {\n ctx.workbook = wb;\n if (typeof wb.getDefinedName === 'function') {\n const resolving = opts.resolvingNames ?? new Set<string>();\n const resolved = opts.resolvedNames ?? new Map<string, FormulaValue>();\n const guard = ctx.recursionGuard;\n ctx.nameResolver = (name: string) =>\n resolveName(name, sheet, wb, evaluating, resolving, resolved, guard);\n }\n }\n return ctx;\n}\n\n/**\n * Resolves a named range by looking up its refers-to expression on the workbook\n * (scoped to the referencing sheet) and evaluating it. Results are cached per\n * top-level evaluation so recursive named lambdas don't re-parse each call, and\n * name→name cycles are guarded.\n */\nfunction resolveName(\n name: string,\n sheet: WorksheetLike,\n workbook: WorkbookLike,\n evaluating: Set<string>,\n resolving: Set<string>,\n resolved: Map<string, FormulaValue>,\n recursionGuard: { depth: number; max: number },\n): FormulaValue {\n const key = `${sheet.name} ${name.toUpperCase()}`;\n const cached = resolved.get(key);\n if (cached !== undefined) return cached;\n\n if (resolving.has(key)) return FormulaValue.errorRef; // circular name definition\n const refersTo = workbook.getDefinedName!(name, sheet.name);\n if (refersTo == null || refersTo === '') return FormulaValue.errorName;\n\n resolving.add(key);\n try {\n const ast = parseFormula(refersTo);\n const ctx = buildContext(sheet, {\n workbook, evaluating, resolvingNames: resolving, resolvedNames: resolved, recursionGuard,\n });\n const value = ast.evaluate(ctx);\n // Cache only pure lambdas — they are stable closures. Other values may read\n // cells and are cheap to recompute; caching them risks subtle staleness.\n if (value.isLambda) resolved.set(key, value);\n return value;\n } catch {\n return FormulaValue.errorName;\n } finally {\n resolving.delete(key);\n }\n}\n\n/**\n * Evaluates a formula string against a worksheet.\n * Mirrors FormulaEvaluator.Evaluate() in C#.\n */\nexport function evaluateFormula(\n formula: string,\n sheet: WorksheetLike,\n options?: {\n workbook?: WorkbookLike;\n formulaRow?: number;\n formulaCol?: number;\n },\n): FormulaValue {\n if (!formula) return FormulaValue.blank;\n\n try {\n return evaluateAst(parseFormula(formula), sheet, options);\n } catch {\n return FormulaValue.errorValue;\n }\n}\n\n/**\n * Evaluates an already-parsed formula. Callers that hold onto an AST — such as\n * the recalculation engine, which parses each formula once when it is\n * registered — should use this so repeated evaluation never depends on the\n * global AST cache still holding the entry.\n */\nexport function evaluateAst(\n ast: FormulaNode,\n sheet: WorksheetLike,\n options?: {\n workbook?: WorkbookLike;\n formulaRow?: number;\n formulaCol?: number;\n /**\n * Range memo shared across evaluations. Only pass one if you invalidate it\n * on every write to the model — {@link RecalcEngine} does.\n */\n rangeCache?: RangeCache;\n },\n): FormulaValue {\n try {\n const ctx = buildContext(sheet, {\n workbook: options?.workbook,\n formulaRow: options?.formulaRow,\n formulaCol: options?.formulaCol,\n rangeCache: options?.rangeCache,\n });\n return ast.evaluate(ctx);\n } catch {\n return FormulaValue.errorValue;\n }\n}\n\n// ── Cache management ──────────────────────────────────────────────────────────\n\nexport function clearAstCache(): void {\n astCache.clear();\n}\n\nexport function getAstCacheStats(): { size: number; hits: number; misses: number; hitRate: number } {\n return {\n size: astCache.size,\n hits: astCache.hits,\n misses: astCache.misses,\n hitRate: astCache.hitRate,\n };\n}\n\nexport function setAstCacheCapacity(capacity: number): void {\n astCache.resize(capacity);\n}\n","/**\n * Memo for range reads: `(sheet, rectangle) → array value`.\n *\n * Why this exists. A range reference is resolved by materialising an ArrayValue\n * and reading every cell in the rectangle. The dominant pattern in real\n * workbooks is many formulas reading the *same* range — a SUMIFS filled down\n * 291 rows reads its two 291-cell ranges 291 times each — so the same rectangle\n * is rebuilt over and over. Memoising it turns O(formulas × range) into\n * O(distinct ranges × range) for the read side, which is the difference between\n * a recalculation that finishes and one that does not.\n *\n * Why invalidation is per-rectangle rather than per-sheet. During a recalc pass\n * the engine writes a computed value after every formula, so a sheet-wide\n * generation counter would invalidate the whole cache thousands of times per\n * pass and never hit. Instead each cached rectangle is filed into a coarse tile\n * grid (same shape as {@link DependencyIndex}), and a write only drops the\n * rectangles that actually contain the written cell — writes to a column of\n * results leave the input ranges cached.\n *\n * Safety. Cached values are shared, not copied, so a reader must not mutate the\n * ArrayValue it receives. Every built-in function builds its own result array;\n * none writes into an argument.\n */\nimport type { FormulaValue } from './formula-value.js';\n\nconst TILE_ROWS = 64;\nconst TILE_COLS = 64;\n/** Above this many tiles a rectangle is filed sheet-wide instead. */\nconst MAX_TILES_PER_RANGE = 32;\n/** Default ceiling on cached cells, ≈ a few MB of references. */\nconst DEFAULT_MAX_CELLS = 2_000_000;\n\nexport class RangeCache {\n /** `SHEET r0 c0 r1 c1` → the memoised array value. Insertion-ordered (FIFO eviction). */\n readonly #entries = new Map<string, FormulaValue>();\n /** `sheet tr tc` → entry keys whose rectangle overlaps that tile. */\n readonly #tiles = new Map<string, Set<string>>();\n /** sheet → entry keys whose rectangle is too broad to tile. */\n readonly #wide = new Map<string, Set<string>>();\n /** entry key → buckets it was filed under, for cheap removal. */\n readonly #placements = new Map<string, string[]>();\n /** entry key → its area, so eviction can give the budget back. */\n readonly #sizes = new Map<string, number>();\n /** Number of cells across all cached rectangles, kept under {@link #maxCells}. */\n #cells = 0;\n readonly #maxCells: number;\n\n hits = 0;\n misses = 0;\n\n constructor(maxCells: number = DEFAULT_MAX_CELLS) {\n this.#maxCells = maxCells;\n }\n\n get size(): number { return this.#entries.size; }\n get cachedCells(): number { return this.#cells; }\n\n static key(sheet: string, r0: number, c0: number, r1: number, c1: number): string {\n return `${sheet} ${r0} ${c0} ${r1} ${c1}`;\n }\n\n get(sheet: string, r0: number, c0: number, r1: number, c1: number): FormulaValue | undefined {\n const hit = this.#entries.get(RangeCache.key(sheet, r0, c0, r1, c1));\n if (hit === undefined) this.misses++; else this.hits++;\n return hit;\n }\n\n /** Memoises a rectangle's value. `cells` is its area, for the budget. */\n set(\n sheet: string,\n r0: number, c0: number, r1: number, c1: number,\n value: FormulaValue,\n cells: number,\n ): void {\n if (cells <= 0 || cells > this.#maxCells) return; // never worth evicting everything for one range\n\n const key = RangeCache.key(sheet, r0, c0, r1, c1);\n if (this.#entries.has(key)) this.#drop(key);\n\n this.#entries.set(key, value);\n this.#cells += cells;\n\n const buckets: string[] = [];\n const tileRow0 = (r0 / TILE_ROWS) | 0, tileRow1 = (r1 / TILE_ROWS) | 0;\n const tileCol0 = (c0 / TILE_COLS) | 0, tileCol1 = (c1 / TILE_COLS) | 0;\n const tileCount = (tileRow1 - tileRow0 + 1) * (tileCol1 - tileCol0 + 1);\n\n if (tileCount > MAX_TILES_PER_RANGE) {\n this.#fileIn(this.#wide, sheet, key, buckets, `w ${sheet}`);\n } else {\n for (let tr = tileRow0; tr <= tileRow1; tr++) {\n for (let tc = tileCol0; tc <= tileCol1; tc++) {\n const bucket = `${sheet} ${tr} ${tc}`;\n this.#fileIn(this.#tiles, bucket, key, buckets, `t ${bucket}`);\n }\n }\n }\n this.#placements.set(key, buckets);\n this.#sizes.set(key, cells);\n\n // FIFO eviction: the oldest rectangles are the least likely to be the one\n // the current fill-down is hammering.\n if (this.#cells > this.#maxCells) {\n for (const oldest of this.#entries.keys()) {\n if (this.#cells <= this.#maxCells) break;\n if (oldest === key) continue; // never evict what we just inserted\n this.#drop(oldest);\n }\n }\n }\n\n /** Drops every cached rectangle containing the given cell. */\n invalidateCell(sheet: string, row: number, col: number): void {\n const tile = this.#tiles.get(`${sheet} ${(row / TILE_ROWS) | 0} ${(col / TILE_COLS) | 0}`);\n if (tile) {\n // A tile is coarser than a rectangle, so confirm before dropping — a\n // false drop is only a lost hit, but confirming is nearly free.\n for (const key of [...tile]) {\n if (RangeCache.#contains(key, sheet, row, col)) this.#drop(key);\n }\n }\n const wide = this.#wide.get(sheet);\n if (wide) {\n for (const key of [...wide]) {\n if (RangeCache.#contains(key, sheet, row, col)) this.#drop(key);\n }\n }\n }\n\n clear(): void {\n this.#entries.clear();\n this.#tiles.clear();\n this.#wide.clear();\n this.#placements.clear();\n this.#sizes.clear();\n this.#cells = 0;\n }\n\n static #contains(key: string, sheet: string, row: number, col: number): boolean {\n const parts = key.split(' ');\n // The sheet name itself may contain spaces, so read the rectangle off the end.\n const n = parts.length;\n const c1 = +parts[n - 1]!, r1 = +parts[n - 2]!, c0 = +parts[n - 3]!, r0 = +parts[n - 4]!;\n if (parts.slice(0, n - 4).join(' ') !== sheet) return false;\n return row >= r0 && row <= r1 && col >= c0 && col <= c1;\n }\n\n #drop(key: string): void {\n if (!this.#entries.delete(key)) return;\n this.#cells -= this.#sizes.get(key) ?? 0;\n this.#sizes.delete(key);\n const buckets = this.#placements.get(key);\n if (buckets) {\n for (const bucket of buckets) {\n const store = bucket.charCodeAt(0) === 119 /* 'w' */ ? this.#wide : this.#tiles;\n const bucketKey = bucket.slice(2);\n const set = store.get(bucketKey);\n if (!set) continue;\n set.delete(key);\n if (set.size === 0) store.delete(bucketKey);\n }\n this.#placements.delete(key);\n }\n }\n\n #fileIn(\n store: Map<string, Set<string>>,\n bucketKey: string,\n entryKey: string,\n buckets: string[],\n bucketId: string,\n ): void {\n let set = store.get(bucketKey);\n if (!set) { set = new Set(); store.set(bucketKey, set); }\n if (set.has(entryKey)) return;\n set.add(entryKey);\n buckets.push(bucketId);\n }\n}\n","/**\n * Static precedent extraction from a parsed formula AST.\n *\n * Walks the AST and collects the cell/range references a formula reads\n * (its precedents), plus whether the formula is volatile (contains a volatile\n * function such as NOW/RAND/OFFSET/INDIRECT). The dependency graph is built\n * from these precedents; volatile formulas are always recalculated because\n * their real precedents cannot be known statically (e.g. INDIRECT/OFFSET\n * compute a reference at run time).\n */\nimport { parseCellRef, EXCEL_MAX_ROWS, EXCEL_MAX_COLUMNS } from '@devmm/puredocs-excel';\nimport { FunctionRegistry } from './function-registry.js';\nimport { parseFormula } from './formula-evaluator.js';\nimport {\n FormulaNode,\n CellReferenceNode,\n RangeReferenceNode,\n SheetCellReferenceNode,\n SheetRangeReferenceNode,\n FullRangeReferenceNode,\n NamedRangeNode,\n SpillReferenceNode,\n FunctionCallNode,\n BinaryOpNode,\n UnaryOpNode,\n ImplicitIntersectionNode,\n} from './formula-node.js';\n\n/** A rectangular precedent region on a specific sheet (1-based, inclusive). */\nexport interface PrecedentRef {\n /** Upper-cased sheet name. */\n readonly sheet: string;\n readonly startRow: number;\n readonly startCol: number;\n readonly endRow: number;\n readonly endCol: number;\n}\n\nexport interface ExtractResult {\n readonly refs: PrecedentRef[];\n readonly volatile: boolean;\n}\n\n/** Resolves a defined name to its refers-to expression, for name expansion. */\nexport type NameResolver = (name: string, sheet: string) => string | undefined;\n\n/**\n * Extracts the precedents and volatility of a formula AST.\n *\n * @param ast The parsed formula.\n * @param formulaSheet Upper-cased name of the sheet the formula lives on;\n * unqualified references resolve against it.\n * @param registry Function registry used to test volatility.\n * @param resolveName Optional resolver so NamedRangeNode precedents expand to\n * the references inside their refers-to expression.\n */\nexport function extractReferences(\n ast: FormulaNode,\n formulaSheet: string,\n registry: FunctionRegistry = FunctionRegistry.default,\n resolveName?: NameResolver,\n): ExtractResult {\n const refs: PrecedentRef[] = [];\n let volatile = false;\n const seenNames = new Set<string>();\n\n const cell = (sheet: string, ref: string): PrecedentRef => {\n const { row, column } = parseCellRef(ref);\n return { sheet: sheet.toUpperCase(), startRow: row, startCol: column, endRow: row, endCol: column };\n };\n const range = (sheet: string, startRef: string, endRef: string): PrecedentRef => {\n const s = parseCellRef(startRef);\n const e = parseCellRef(endRef);\n return {\n sheet: sheet.toUpperCase(),\n startRow: Math.min(s.row, e.row),\n startCol: Math.min(s.column, e.column),\n endRow: Math.max(s.row, e.row),\n endCol: Math.max(s.column, e.column),\n };\n };\n\n const walk = (node: FormulaNode): void => {\n if (node instanceof CellReferenceNode) {\n refs.push(cell(formulaSheet, node.reference));\n } else if (node instanceof RangeReferenceNode) {\n refs.push(range(formulaSheet, node.startRef, node.endRef));\n } else if (node instanceof SheetCellReferenceNode) {\n refs.push(cell(node.sheetName, node.cellReference));\n } else if (node instanceof SheetRangeReferenceNode) {\n refs.push(range(node.sheetName, node.startRef, node.endRef));\n } else if (node instanceof FullRangeReferenceNode) {\n // The precedent rectangle spans the whole open dimension, not just the\n // currently-used part of it: a formula reading A:A must recompute when a\n // value appears *below* today's last row, which is exactly the case the\n // used-range bound would miss.\n refs.push({\n sheet: (node.sheetName ?? formulaSheet).toUpperCase(),\n startRow: node.startRow ?? 1,\n endRow: node.endRow ?? EXCEL_MAX_ROWS,\n startCol: node.startCol ?? 1,\n endCol: node.endCol ?? EXCEL_MAX_COLUMNS,\n });\n } else if (node instanceof NamedRangeNode) {\n expandName(node.name);\n } else if (node instanceof SpillReferenceNode) {\n // A1# co-changes with its anchor; depending on the anchor cell suffices\n // to retrigger this formula whenever the spilling formula recomputes.\n refs.push(cell(formulaSheet, node.anchorRef));\n } else if (node instanceof FunctionCallNode) {\n if (registry.isVolatile(node.functionName)) volatile = true;\n for (const arg of node.args) walk(arg);\n } else if (node instanceof BinaryOpNode) {\n walk(node.left);\n walk(node.right);\n } else if (node instanceof UnaryOpNode) {\n walk(node.operand);\n } else if (node instanceof ImplicitIntersectionNode) {\n walk(node.inner);\n }\n // Literal nodes have no precedents.\n };\n\n const expandName = (name: string): void => {\n if (!resolveName) return;\n const key = name.toUpperCase();\n if (seenNames.has(key)) return; // guard against name → name cycles\n seenNames.add(key);\n const refersTo = resolveName(name, formulaSheet);\n if (!refersTo) return;\n try {\n walk(parseFormula(refersTo));\n } catch {\n /* ignore unparseable refers-to */\n }\n };\n\n walk(ast);\n return { refs, volatile };\n}\n\n/** True if the 1-based cell (sheet,row,col) falls inside a precedent region. */\nexport function refContains(ref: PrecedentRef, sheet: string, row: number, col: number): boolean {\n return (\n ref.sheet === sheet &&\n row >= ref.startRow && row <= ref.endRow &&\n col >= ref.startCol && col <= ref.endCol\n );\n}\n","/**\n * Reverse-dependency index: given a cell, which registered formulas read it?\n *\n * Without an index the only way to answer that is to test every formula's\n * precedent rectangles, which makes a single edit O(F) and a full recalc O(F²).\n * Since precedents are rectangles rather than points, they are bucketed, and a\n * query only inspects the buckets that can contain the cell.\n *\n * The bucketing rule, and why it is shaped this way. A formula's input is almost\n * always a *tall, narrow* rectangle: one column, or a few adjacent ones, running\n * down a block of rows (`$H$4:$H$294`, `A:A`). Two earlier attempts both went\n * quadratic on exactly that shape:\n *\n * - Tiling both dimensions at 64×64 buries the selective dimension. The input\n * columns and the result column of a table sit within a few of each other, so\n * they land in one 64-wide tile, and \"who reads this cell?\" answers \"every\n * formula in the table\".\n * - Treating anything too tall to tile as sheet-wide has the same effect for a\n * different reason: a whole column is 16 384 tiles tall, so every such formula\n * ends up in one list that every query scans.\n *\n * So the rule is: **exact resolution on the narrow dimension, tile resolution on\n * the broad one.** A column range is filed under its column (exactly) crossed\n * with the row tiles it spans; a row range the other way round; a rectangle\n * that is compact in both is tiled in both; one that is broad in both — rare,\n * and genuinely unselective — goes to a per-sheet list.\n *\n * Buckets over-approximate by at most one tile in the broad dimension, so\n * callers still confirm each candidate with {@link refContains}.\n */\nimport { refContains, type PrecedentRef } from './recalc-references.js';\n\nconst TILE_ROWS = 64;\nconst TILE_COLS = 64;\n/** Above this many tiles a dimension is not enumerated at tile resolution. */\nconst MAX_TILES_PER_REF = 32;\n/**\n * A span this narrow is enumerated exactly, one bucket per column (or row).\n * Comfortably covers what real formulas read — a handful of adjacent columns.\n */\nconst MAX_EXACT_SPAN = 16;\n/** Ceiling on buckets per rectangle, so registration stays cheap. */\nconst MAX_BUCKETS_PER_REF = 64;\n\nconst tileOfRow = (row: number): number => (row / TILE_ROWS) | 0;\nconst tileOfCol = (col: number): number => (col / TILE_COLS) | 0;\n\nexport class DependencyIndex {\n /**\n * All buckets in one map, keyed by a discriminating prefix:\n *\n * `t s tr tc` rectangle compact in both dimensions\n * `c s col tr` narrow columns, row tiles (the common case)\n * `C s col` narrow columns, every row (`A:A`)\n * `r s row tc` narrow rows, column tiles\n * `R s row` narrow rows, every column (`1:1`)\n * `w s` broad in both dimensions\n */\n readonly #buckets = new Map<string, Set<string>>();\n /** formula key → the buckets it was filed under, for cheap removal. */\n readonly #placements = new Map<string, string[]>();\n\n /** Registers (or re-registers) a formula's precedent rectangles. */\n add(formulaKey: string, refs: readonly PrecedentRef[]): void {\n this.remove(formulaKey);\n if (refs.length === 0) return;\n\n const buckets: string[] = [];\n for (const ref of refs) {\n const rowSpan = ref.endRow - ref.startRow + 1;\n const colSpan = ref.endCol - ref.startCol + 1;\n const rowTile0 = tileOfRow(ref.startRow), rowTile1 = tileOfRow(ref.endRow);\n const colTile0 = tileOfCol(ref.startCol), colTile1 = tileOfCol(ref.endCol);\n const rowTiles = rowTile1 - rowTile0 + 1;\n const colTiles = colTile1 - colTile0 + 1;\n\n // Narrow in columns — the usual shape. File under each exact column,\n // crossed with the row tiles when that stays cheap.\n if (colSpan <= MAX_EXACT_SPAN && colSpan <= rowSpan) {\n if (colSpan * rowTiles <= MAX_BUCKETS_PER_REF && rowTiles <= MAX_TILES_PER_REF) {\n for (let col = ref.startCol; col <= ref.endCol; col++) {\n for (let tr = rowTile0; tr <= rowTile1; tr++) {\n this.#file(`c ${ref.sheet} ${col} ${tr}`, formulaKey, buckets);\n }\n }\n } else {\n for (let col = ref.startCol; col <= ref.endCol; col++) {\n this.#file(`C ${ref.sheet} ${col}`, formulaKey, buckets);\n }\n }\n continue;\n }\n\n // Narrow in rows — the transpose of the above.\n if (rowSpan <= MAX_EXACT_SPAN) {\n if (rowSpan * colTiles <= MAX_BUCKETS_PER_REF && colTiles <= MAX_TILES_PER_REF) {\n for (let row = ref.startRow; row <= ref.endRow; row++) {\n for (let tc = colTile0; tc <= colTile1; tc++) {\n this.#file(`r ${ref.sheet} ${row} ${tc}`, formulaKey, buckets);\n }\n }\n } else {\n for (let row = ref.startRow; row <= ref.endRow; row++) {\n this.#file(`R ${ref.sheet} ${row}`, formulaKey, buckets);\n }\n }\n continue;\n }\n\n // Compact in both dimensions: tile both.\n if (rowTiles * colTiles <= MAX_TILES_PER_REF) {\n for (let tr = rowTile0; tr <= rowTile1; tr++) {\n for (let tc = colTile0; tc <= colTile1; tc++) {\n this.#file(`t ${ref.sheet} ${tr} ${tc}`, formulaKey, buckets);\n }\n }\n continue;\n }\n\n // Broad both ways — nothing selective left to index on.\n this.#file(`w ${ref.sheet}`, formulaKey, buckets);\n }\n this.#placements.set(formulaKey, buckets);\n }\n\n /** Forgets a formula. */\n remove(formulaKey: string): void {\n const buckets = this.#placements.get(formulaKey);\n if (!buckets) return;\n for (const bucket of buckets) {\n const set = this.#buckets.get(bucket);\n if (!set) continue;\n set.delete(formulaKey);\n if (set.size === 0) this.#buckets.delete(bucket);\n }\n this.#placements.delete(formulaKey);\n }\n\n /** Drops every registration. */\n clear(): void {\n this.#buckets.clear();\n this.#placements.clear();\n }\n\n /**\n * Calls `visit` with the key of each formula that *may* read the given cell.\n * Callers still confirm with {@link refContains}: buckets are coarser than\n * rectangles in the broad dimension, so this over-approximates.\n *\n * A fixed six lookups, whatever the workbook contains.\n */\n candidates(sheet: string, row: number, col: number, visit: (formulaKey: string) => void): void {\n const tr = tileOfRow(row);\n const tc = tileOfCol(col);\n this.#visit(`c ${sheet} ${col} ${tr}`, visit);\n this.#visit(`C ${sheet} ${col}`, visit);\n this.#visit(`r ${sheet} ${row} ${tc}`, visit);\n this.#visit(`R ${sheet} ${row}`, visit);\n this.#visit(`t ${sheet} ${tr} ${tc}`, visit);\n this.#visit(`w ${sheet}`, visit);\n }\n\n #visit(bucket: string, visit: (formulaKey: string) => void): void {\n const set = this.#buckets.get(bucket);\n if (set) for (const key of set) visit(key);\n }\n\n #file(bucket: string, formulaKey: string, buckets: string[]): void {\n let set = this.#buckets.get(bucket);\n if (!set) { set = new Set(); this.#buckets.set(bucket, set); }\n if (set.has(formulaKey)) return; // several refs can share one bucket\n set.add(formulaKey);\n buckets.push(bucket);\n }\n}\n\nexport { refContains };\n","/**\n * Workbook-level recalculation engine: dependency graph + topological recalc.\n *\n * The formula evaluator (evaluateFormula) is a pure function — it computes one\n * formula and reads precedent values from the model, but it does not track which\n * cells depend on which, nor write results back. This engine is the missing\n * stateful layer:\n *\n * 1. Register formulas with setCellFormula(); their precedents are extracted\n * from the AST (see recalc-references.ts).\n * 2. When an input cell changes, only the dependent formulas are recomputed,\n * in dependency (topological) order, and written back to the model.\n * 3. Volatile formulas (NOW/RAND/OFFSET/INDIRECT/…) are always recomputed,\n * since their true precedents cannot be known statically.\n * 4. Circular references are detected at the graph level and marked #REF!.\n *\n * The engine talks to storage through the small RecalcModel interface, so it is\n * independent of the core Workbook class (though it adapts to one trivially).\n */\nimport {\n parseCellRef,\n cellRefFromRowCol,\n shiftIndex,\n shiftSpan,\n shiftFormulaRefs,\n EXCEL_MAX_ROWS,\n EXCEL_MAX_COLUMNS,\n type RefShift,\n} from '@devmm/puredocs-excel';\nimport { FormulaValue, FormulaError } from './formula-value.js';\nimport { FunctionRegistry } from './function-registry.js';\nimport { evaluateAst, parseFormulaUncached } from './formula-evaluator.js';\nimport type { FormulaNode } from './formula-node.js';\nimport type { WorksheetLike, WorkbookLike } from './formula-context.js';\nimport { extractReferences, refContains, type PrecedentRef } from './recalc-references.js';\nimport { DependencyIndex } from './dependency-index.js';\nimport { RangeCache } from './range-cache.js';\n\n// ── Core Workbook adapter ──────────────────────────────────────────────────────\n\ninterface CoreCellLike {\n setComputedValue(value: unknown): unknown;\n setFormula(formula: string): unknown;\n setArrayRef(spillRef: string | null): unknown;\n clear(): void;\n}\ninterface CoreSheetLike {\n getCellValue(ref: string): unknown;\n getCellValueAt?(row: number, column: number): unknown;\n readonly usedBounds?: { rowCount: number; columnCount: number };\n getCell(ref: string): CoreCellLike;\n getCellFormula?(ref: string): string | null;\n getSpillRange?(ref: string): string | null;\n isRowHidden?(row: number): boolean;\n}\ninterface CoreWorkbookLike {\n getWorksheet(name: string): CoreSheetLike;\n getDefinedName(name: string, sheet?: string): string | undefined;\n}\n\n/**\n * Adapts a @devmm/puredocs-excel Workbook to a RecalcModel so the engine can\n * read cell values and write computed results back into the document (via\n * Cell.setComputedValue, which preserves the formula). Named ranges defined on\n * the workbook are resolved automatically.\n */\nexport function createWorkbookRecalcModel(workbook: CoreWorkbookLike): RecalcModel {\n return {\n getCellValue: (sheet, ref) => workbook.getWorksheet(sheet).getCellValue(ref),\n // Falls back to the reference-string read rather than reporting \"no value\":\n // an older core without getCellValueAt must still return the real value,\n // because a silent undefined here reads as a blank cell.\n getCellValueAt: (sheet, row, column) => {\n const ws = workbook.getWorksheet(sheet);\n return ws.getCellValueAt\n ? ws.getCellValueAt(row, column)\n : ws.getCellValue(cellRefFromRowCol(row, column));\n },\n getUsedBounds: sheet => workbook.getWorksheet(sheet).usedBounds,\n setCellValue: (sheet, ref, value) => { workbook.getWorksheet(sheet).getCell(ref).setComputedValue(value); },\n setCellFormula: (sheet, ref, formula) => { workbook.getWorksheet(sheet).getCell(ref).setFormula(formula); },\n clearCell: (sheet, ref) => { workbook.getWorksheet(sheet).getCell(ref).clear(); },\n setCellArrayRef: (sheet, ref, spillRef) => { workbook.getWorksheet(sheet).getCell(ref).setArrayRef(spillRef); },\n getCellFormula: (sheet, ref) => workbook.getWorksheet(sheet).getCellFormula?.(ref) ?? null,\n getSpillRange: (sheet, ref) => workbook.getWorksheet(sheet).getSpillRange?.(ref) ?? null,\n isRowHidden: (sheet, row) => workbook.getWorksheet(sheet).isRowHidden?.(row) ?? false,\n getDefinedName: (name, sheet) => workbook.getDefinedName(name, sheet),\n };\n}\n\n/** Minimal storage abstraction the engine reads inputs from and writes results to. */\nexport interface RecalcModel {\n /** Current value of a cell (raw input value, or last computed value). */\n getCellValue(sheet: string, ref: string): unknown;\n /**\n * Optional: value of a cell by 1-based row/column. Range reads prefer this —\n * it saves building and re-parsing a reference string per cell, which at\n * range scale is tens of millions of strings per recalculation. Must return\n * the same value `getCellValue` would for that coordinate.\n */\n getCellValueAt?(sheet: string, row: number, column: number): unknown;\n /**\n * Optional: the sheet's populated extent, used to bound whole-column (`A:A`)\n * and whole-row (`1:1`) references. Without it those references are `#REF!`,\n * since guessing a bound would silently change what SUM(A:A) adds up.\n */\n getUsedBounds?(sheet: string): { rowCount: number; columnCount: number } | undefined;\n /** Store a computed formula result. Must NOT clear the cell's formula. */\n setCellValue(sheet: string, ref: string, value: unknown): void;\n /**\n * Optional: persist a formula string on a cell so it serialises with the\n * document. When present, the engine calls it from setCellFormula so the\n * model stays the source of truth for the formula text.\n */\n setCellFormula?(sheet: string, ref: string, formula: string): void;\n /** Optional: clear a cell (value + formula) — used by clearCellFormula. */\n clearCell?(sheet: string, ref: string): void;\n /** Optional: mark/unmark a cell as a dynamic-array anchor with its spill range. */\n setCellArrayRef?(sheet: string, ref: string, spillRef: string | null): void;\n /** Optional: formula text of a cell (lets SUBTOTAL skip nested calls). */\n getCellFormula?(sheet: string, ref: string): string | null;\n /** Optional: spill range of a dynamic-array anchor (enables A1#). */\n getSpillRange?(sheet: string, ref: string): string | null;\n /** Optional: whether a 1-based row is hidden (SUBTOTAL/AGGREGATE). */\n isRowHidden?(sheet: string, row: number): boolean;\n /** Optional defined-name resolver (enables named ranges in formulas). */\n getDefinedName?(name: string, sheet?: string): string | undefined;\n}\n\n/** One recomputed cell, in evaluation order. */\nexport interface RecalcResult {\n readonly sheet: string;\n readonly ref: string;\n /** The written JS value (null/number/string/boolean). For a dynamic array,\n * this is the anchor's top-left value. */\n readonly value: unknown;\n /** True when the cell is part of a circular reference. */\n readonly circular?: boolean;\n /** For a dynamic-array anchor: the spilled block size (rows × cols). */\n readonly spill?: { rows: number; cols: number };\n}\n\ninterface FormulaEntry {\n sheet: string; // upper-cased key (for graph/containment)\n sheetName: string; // original casing (for model I/O)\n ref: string; // normalised (no '$', upper-cased)\n /** Precomputed `SHEET!REF` map key — rebuilding it is pure string churn. */\n key: string;\n row: number;\n col: number;\n formula: string; // without leading '='\n /**\n * Parsed form of `formula`, kept for the lifetime of the registration so\n * repeated evaluation never re-parses and never depends on the global AST\n * cache still holding this text. Cleared when the text is rewritten.\n */\n ast?: FormulaNode;\n refs: PrecedentRef[];\n volatile: boolean;\n}\n\n/** A cell coordinate with its upper-cased sheet key. */\ninterface CellRC { sheet: string; row: number; col: number }\n\nconst normSheet = (s: string): string => s.toUpperCase();\nconst normRef = (r: string): string => r.replace(/\\$/g, '').toUpperCase();\nconst keyOf = (sheet: string, ref: string): string => `${normSheet(sheet)}!${normRef(ref)}`;\n\n/** Splits a \"SHEET!REF\" key back into its parts (sheet upper-cased). */\nfunction parseKey(key: string): { sheet: string; ref: string; row: number; col: number } {\n const bang = key.indexOf('!');\n const sheet = key.slice(0, bang);\n const ref = key.slice(bang + 1);\n const { row, column } = parseCellRef(ref);\n return { sheet, ref, row, col: column };\n}\n\nexport class RecalcEngine {\n readonly #model: RecalcModel;\n readonly #registry: FunctionRegistry;\n #formulas = new Map<string, FormulaEntry>();\n /** upper-cased sheet key → original casing, for case-correct model I/O. */\n readonly #sheetNames = new Map<string, string>();\n /** anchor cellKey → set of spilled (non-anchor) cellKeys it currently owns. */\n #spills = new Map<string, Set<string>>();\n /** spilled cellKey → the anchor cellKey that owns it. */\n readonly #spillOwner = new Map<string, string>();\n /**\n * Reverse dependency index, so finding the formulas that read a cell does not\n * mean testing every registered formula.\n */\n readonly #dependents = new DependencyIndex();\n /**\n * Keys of the volatile formulas. Maintained incrementally: scanning every\n * formula for volatility on each edit is O(F) per keystroke on its own.\n */\n readonly #volatiles = new Set<string>();\n /** Memoised per-sheet adapters — these are stateless w.r.t. the formula. */\n readonly #sheetLikes = new Map<string, WorksheetLike>();\n #workbookLike?: WorkbookLike;\n /**\n * Memo for range reads. The engine owns it because it owns the writes: every\n * value written goes through {@link #writeCell}, which drops the cached\n * rectangles containing that cell. Nothing else may write to the model behind\n * the engine's back without calling {@link onCellChanged} — that was already\n * true for dependency tracking, and now also keeps this memo honest.\n */\n readonly #rangeCache = new RangeCache();\n\n constructor(model: RecalcModel, registry: FunctionRegistry = FunctionRegistry.default) {\n this.#model = model;\n this.#registry = registry;\n }\n\n /**\n * The single write path into the model. Writing a value invalidates the\n * cached rectangles that contain the cell, so a formula evaluated later in the\n * same pass cannot read a pre-write copy of a range. Coordinates are passed in\n * where the caller already knows them, to avoid re-parsing the reference.\n */\n #writeCell(sheetName: string, ref: string, value: unknown, row?: number, col?: number): void {\n this.#model.setCellValue(sheetName, ref, value);\n if (row === undefined || col === undefined) {\n const parsed = parseCellRef(ref);\n row = parsed.row;\n col = parsed.column;\n }\n this.#rangeCache.invalidateCell(normSheet(sheetName), row, col);\n }\n\n /** Registers an entry in the map, the reverse index and the volatile set. */\n #register(entry: FormulaEntry): void {\n this.#formulas.set(entry.key, entry);\n this.#dependents.add(entry.key, entry.refs);\n if (entry.volatile) this.#volatiles.add(entry.key);\n else this.#volatiles.delete(entry.key);\n }\n\n #unregister(key: string): void {\n this.#formulas.delete(key);\n this.#dependents.remove(key);\n this.#volatiles.delete(key);\n }\n\n #rememberSheet(name: string): void {\n this.#sheetNames.set(normSheet(name), name);\n }\n\n // ── Registration ─────────────────────────────────────────────────────────────\n\n /**\n * Registers (or replaces) a formula for a cell and recalculates that cell and\n * everything downstream of it. Returns the recomputed cells in the order they\n * were evaluated. The leading '=' of the formula is optional.\n */\n setCellFormula(sheet: string, ref: string, formula: string): RecalcResult[] {\n if (!formula) throw new Error('Formula cannot be empty.');\n const text = formula.startsWith('=') ? formula.slice(1) : formula;\n const s = normSheet(sheet);\n const r = normRef(ref);\n const { row, column } = parseCellRef(r);\n\n const ast = parseFormulaUncached(text);\n const { refs, volatile } = extractReferences(\n ast,\n s,\n this.#registry,\n this.#model.getDefinedName ? (n, sh) => this.#model.getDefinedName!(n, sh) : undefined,\n );\n\n this.#rememberSheet(sheet);\n const key = keyOf(s, r);\n this.#register({\n sheet: s, sheetName: sheet, ref: r, key, row, col: column, formula: text, ast, refs, volatile,\n });\n\n // Persist the formula text on the model (source of truth for serialisation)\n // before evaluating; the computed value is written back during recalc.\n // Setting a formula also clears the cell's cached value, so any range that\n // covered it must be re-read.\n this.#model.setCellFormula?.(sheet, r, text);\n this.#rangeCache.invalidateCell(s, row, column);\n\n // Recompute this cell and its dependents.\n return this.#recalcFrom([{ sheet: s, row, col: column }], key);\n }\n\n /**\n * Indexes many formulas **without evaluating anything**.\n *\n * This is the path for loading a workbook. `setCellFormula` is built for an\n * edit: it recalculates the new cell and everything downstream of it, which is\n * right for one keystroke and quadratic for a file — registering N formulas one\n * by one evaluates the whole workbook N times. Here the formulas are only\n * parsed and filed into the dependency index; call {@link recalcAll} once\n * afterwards, or nothing at all if the cached values from the file will do.\n *\n * The model is deliberately **not** written to. These formulas are assumed to\n * be the ones the model already holds (they came from the file), and persisting\n * them again would clear each cell's cached value — leaving every formula cell\n * blank until a full recalculation had run. Use `setCellFormula` for formulas\n * the user is actually introducing.\n *\n * A formula that fails to parse is reported rather than thrown: one unsupported\n * construct in a large workbook should not abort the load.\n */\n registerBulk(\n entries: Iterable<{ sheet: string; ref: string; formula: string }>,\n ): { registered: number; failed: Array<{ sheet: string; ref: string; error: string }> } {\n const resolveName = this.#model.getDefinedName\n ? (n: string, sh?: string) => this.#model.getDefinedName!(n, sh)\n : undefined;\n\n let registered = 0;\n const failed: Array<{ sheet: string; ref: string; error: string }> = [];\n\n for (const entry of entries) {\n const { sheet, ref, formula } = entry;\n if (!formula) continue;\n const text = formula.startsWith('=') ? formula.slice(1) : formula;\n const s = normSheet(sheet);\n const r = normRef(ref);\n\n try {\n const { row, column } = parseCellRef(r);\n const ast = parseFormulaUncached(text);\n const { refs, volatile } = extractReferences(ast, s, this.#registry, resolveName);\n this.#rememberSheet(sheet);\n this.#register({\n sheet: s, sheetName: sheet, ref: r, key: keyOf(s, r),\n row, col: column, formula: text, ast, refs, volatile,\n });\n registered++;\n } catch (err) {\n failed.push({ sheet, ref, error: err instanceof Error ? err.message : String(err) });\n }\n }\n\n // Registrations change which cells are read, not what they hold; but a\n // formula cell's own value is now owned by the engine, so drop the memo\n // rather than reason about which rectangles are affected.\n if (registered > 0) this.#rangeCache.clear();\n\n return { registered, failed };\n }\n\n /**\n * Removes a formula from a cell and recalculates its dependents (which may now\n * read a plain input value instead). Returns the recomputed dependent cells.\n */\n clearCellFormula(sheet: string, ref: string): RecalcResult[] {\n const s = normSheet(sheet);\n const r = normRef(ref);\n const key = keyOf(s, r);\n if (!this.#formulas.has(key)) return [];\n this.#unregister(key);\n this.#model.clearCell?.(sheet, r);\n const { row, column } = parseCellRef(r);\n this.#rangeCache.invalidateCell(s, row, column);\n return this.#recalcFrom([{ sheet: s, row, col: column }]);\n }\n\n /**\n * Writes a raw input value to a cell and recalculates every formula that\n * depends on it. Use this for non-formula edits so dependents stay current.\n */\n setCellValue(sheet: string, ref: string, value: unknown): RecalcResult[] {\n this.#rememberSheet(sheet);\n const s = normSheet(sheet);\n const r = normRef(ref);\n const { row, column } = parseCellRef(r);\n this.#writeCell(sheet, r, value, row, column);\n return this.#recalcFrom([{ sheet: s, row, col: column }]);\n }\n\n /**\n * Signals that a cell changed by some external means (the model was already\n * updated) and recalculates its dependents.\n */\n onCellChanged(sheet: string, ref: string): RecalcResult[] {\n this.#rememberSheet(sheet);\n const s = normSheet(sheet);\n const r = normRef(ref);\n const { row, column } = parseCellRef(r);\n // The write happened outside the engine, so the memo has to be told.\n this.#rangeCache.invalidateCell(s, row, column);\n return this.#recalcFrom([{ sheet: s, row, col: column }]);\n }\n\n /**\n * Recalculates every registered formula.\n *\n * By default the order is derived here, with a topological sort over the\n * dependency index. `order` — typically `workbook.calcChain` — supplies one\n * instead, so the sort is not needed.\n *\n * **A supplied order is verified, not trusted.** Evaluating in a stale order\n * makes a formula read a precedent that has not been computed yet, and the\n * result is a plausible wrong number with nothing to distinguish it from a\n * right one. In a calculation engine that is the worst failure available, so\n * this checks as it goes: after each formula is written, the dependency index\n * says who reads it, and any reader that was already evaluated is an inversion.\n * On the first inversion the ordered attempt is abandoned and the whole\n * recalculation is redone through the sorted path, whose result is returned;\n * `onOrderConflict`, if given, is told which pair conflicted.\n *\n * The verification costs about what the sort it replaces costs, so `order` is\n * worth roughly nothing now (measured at ~9% of a full recalculation on a\n * 2 000-formula workbook, after the dependency index stopped being the\n * bottleneck). It is kept because reading an order Excel already computed is a\n * reasonable thing to want; prefer plain `recalcAll()` unless you have measured\n * a reason not to.\n *\n * Registered formulas the order does not mention are evaluated afterwards\n * through the sorted path, and a dynamic array that spills still triggers the\n * usual fixpoint, so neither silently misses cells.\n */\n recalcAll(options?: {\n order?: ReadonlyArray<{ sheet: string; ref: string }>;\n /** Called when the supplied order turned out to be invalid and was discarded. */\n onOrderConflict?: (conflict: { dependent: string; precedent: string }) => void;\n }): RecalcResult[] {\n const order = options?.order;\n if (!order || order.length === 0) {\n return this.#evaluatePass([...this.#formulas.values()]).results;\n }\n\n const attempt = this.#recalcInOrder(order);\n if (attempt.conflict) {\n options?.onOrderConflict?.(attempt.conflict);\n // Every registered formula is re-evaluated, so anything the abandoned\n // attempt wrote is overwritten with a value computed in a valid order.\n return this.#evaluatePass([...this.#formulas.values()]).results;\n }\n return attempt.results;\n }\n\n /**\n * One pass in a caller-supplied order, watching for inversions.\n *\n * The check is the mirror image of the topological sort: instead of asking\n * \"which of my precedents come first?\", it asks, of each formula just\n * evaluated, \"has anything that reads me already run?\". The dependency index\n * answers that directly, and one positive answer is enough to know the order\n * cannot be trusted.\n */\n #recalcInOrder(order: ReadonlyArray<{ sheet: string; ref: string }>): {\n results: RecalcResult[];\n conflict?: { dependent: string; precedent: string };\n } {\n const results: RecalcResult[] = [];\n const changed: CellRC[] = [];\n const done = new Set<string>();\n let spilled = false;\n\n for (const { sheet, ref } of order) {\n const key = keyOf(sheet, ref);\n if (done.has(key)) continue;\n const entry = this.#formulas.get(key);\n if (!entry) continue; // the order mentions a cell we hold no formula for\n done.add(key);\n\n const written = this.#writeResult(entry);\n results.push(written.result);\n changed.push(...written.changed);\n if (written.result.spill) spilled = true;\n\n // Anything that reads this cell must not have been evaluated yet.\n let conflict: { dependent: string; precedent: string } | undefined;\n this.#forEachDirectDependent({ sheet: entry.sheet, row: entry.row, col: entry.col }, dep => {\n if (conflict || dep.key === entry.key) return;\n if (done.has(dep.key)) conflict = { dependent: dep.key, precedent: entry.key };\n });\n if (conflict) return { results: [], conflict };\n }\n\n const rest = [...this.#formulas.values()].filter(e => !done.has(e.key));\n if (rest.length > 0) {\n const pass = this.#evaluatePass(rest);\n results.push(...pass.results);\n changed.push(...pass.changed);\n }\n\n // A spill writes cells the graph could not know about in advance; those may\n // have dependents of their own.\n if (spilled) {\n const evaluated = new Set(done);\n results.push(...this.#runFixpoint(this.#dependentClosure(changed, evaluated), evaluated));\n }\n\n return { results };\n }\n\n /** The precedents recorded for a formula cell (mainly for tests/inspection). */\n getPrecedents(sheet: string, ref: string): readonly PrecedentRef[] {\n return this.#formulas.get(keyOf(sheet, ref))?.refs ?? [];\n }\n\n // ── Structural edits ─────────────────────────────────────────────────────────\n\n /**\n * Tells the engine rows were inserted on a sheet. Call AFTER the\n * corresponding `Worksheet.insertRows` (the model must already reflect the\n * edit). The dependency graph is translated in place — registrations,\n * formula text and spill bookkeeping all move — and only volatile formulas\n * are recomputed, because a pure translation changes no values.\n *\n * @example\n * ws.insertRows(3, 2);\n * engine.onRowsInserted('S1', 3, 2);\n */\n onRowsInserted(sheet: string, at: number, count = 1): RecalcResult[] {\n return this.#applyShift({ dim: 'row', kind: 'insert', at, count, sheetName: sheet });\n }\n\n /**\n * Tells the engine rows were deleted on a sheet. Call AFTER the\n * corresponding `Worksheet.deleteRows`. Registrations inside the deleted\n * band are dropped; the rest of the graph is translated, and only formulas\n * whose precedents touched the deleted band (plus their dependents and\n * volatiles) are recomputed.\n */\n onRowsDeleted(sheet: string, at: number, count = 1): RecalcResult[] {\n return this.#applyShift({ dim: 'row', kind: 'delete', at, count, sheetName: sheet });\n }\n\n /** Column counterpart to {@link onRowsInserted}. */\n onColumnsInserted(sheet: string, at: number, count = 1): RecalcResult[] {\n return this.#applyShift({ dim: 'col', kind: 'insert', at, count, sheetName: sheet });\n }\n\n /** Column counterpart to {@link onRowsDeleted}. */\n onColumnsDeleted(sheet: string, at: number, count = 1): RecalcResult[] {\n return this.#applyShift({ dim: 'col', kind: 'delete', at, count, sheetName: sheet });\n }\n\n #applyShift(shift: RefShift): RecalcResult[] {\n const editedSheet = normSheet(shift.sheetName);\n const isRowShift = shift.dim === 'row';\n const bandEnd = shift.at + shift.count - 1;\n\n const rekeyed: FormulaEntry[] = [];\n const needsRecalc = new Set<string>();\n\n for (const e of this.#formulas.values()) {\n // Translate the registration's own position on the edited sheet.\n let row = e.row;\n let col = e.col;\n if (e.sheet === editedSheet) {\n const shifted = shiftIndex(isRowShift ? row : col, shift);\n if (shifted === null) continue; // the formula cell itself was deleted\n if (isRowShift) row = shifted; else col = shifted;\n }\n\n // Did a pre-shift precedent rectangle touch the deleted band? Those\n // formulas lost a precedent value and must be recomputed; a pure\n // translation must not be.\n const touchedBand = shift.kind === 'delete' && e.refs.some(r =>\n r.sheet === editedSheet && (isRowShift\n ? r.endRow >= shift.at && r.startRow <= bandEnd\n : r.endCol >= shift.at && r.startCol <= bandEnd));\n\n const rewritten = shiftFormulaRefs(e.formula, shift, e.sheetName);\n const moved = row !== e.row || col !== e.col;\n const ref = moved ? cellRefFromRowCol(row, col) : e.ref;\n const key = moved ? keyOf(e.sheet, ref) : e.key;\n\n rekeyed.push({\n ...e,\n ref,\n key,\n row,\n col,\n formula: rewritten.changed ? rewritten.text : e.formula,\n // A rewritten formula's cached AST no longer matches its text; it is\n // re-parsed lazily, and only if the cell is actually evaluated again.\n ast: rewritten.changed ? undefined : e.ast,\n refs: this.#shiftPrecedents(e.refs, shift, editedSheet),\n // Volatility is a property of which *functions* a formula calls, and\n // rewriting references cannot change that.\n });\n if (touchedBand || rewritten.hasRefError) needsRecalc.add(key);\n }\n\n // Rebuild the map and the reverse index from the translated entries.\n this.#formulas = new Map();\n this.#dependents.clear();\n this.#volatiles.clear();\n for (const e of rekeyed) this.#register(e);\n\n this.#shiftSpillBookkeeping(shift, editedSheet);\n\n // Every rectangle on the edited sheet moved (and cross-sheet rectangles\n // pointing into it were rewritten), so no cached rectangle can be trusted.\n this.#rangeCache.clear();\n\n // Seed the fixpoint: affected formulas (delete only) plus volatiles.\n const pending = new Map<string, FormulaEntry>();\n for (const k of needsRecalc) {\n const e = this.#formulas.get(k);\n if (e) pending.set(k, e);\n }\n for (const e of this.#formulas.values()) {\n if (e.volatile) pending.set(e.key, e);\n }\n return this.#runFixpoint(pending, new Set());\n }\n\n /**\n * Translates precedent rectangles across a structural edit.\n *\n * This is arithmetic rather than a re-parse of the rewritten formula, and the\n * two are equivalent by construction: `shiftFormulaRefs` derives the new\n * reference text by calling `shiftSpan`/`shiftIndex` on exactly these numbers,\n * so applying the same functions to the stored rectangle yields the same\n * region. A rectangle that is entirely deleted disappears, matching the\n * `#REF!` the text rewrite produces.\n */\n #shiftPrecedents(\n refs: readonly PrecedentRef[],\n shift: RefShift,\n editedSheet: string,\n ): PrecedentRef[] {\n const out: PrecedentRef[] = [];\n for (const r of refs) {\n if (r.sheet !== editedSheet) { out.push(r); continue; }\n\n if (shift.dim === 'row') {\n const span = shiftSpan(r.startRow, r.endRow, shift);\n if (!span) continue; // region deleted → the formula now reads #REF!\n out.push({\n sheet: r.sheet,\n startRow: span.start,\n endRow: Math.min(span.end, EXCEL_MAX_ROWS),\n startCol: r.startCol,\n endCol: r.endCol,\n });\n } else {\n const span = shiftSpan(r.startCol, r.endCol, shift);\n if (!span) continue;\n out.push({\n sheet: r.sheet,\n startRow: r.startRow,\n endRow: r.endRow,\n startCol: span.start,\n endCol: Math.min(span.end, EXCEL_MAX_COLUMNS),\n });\n }\n }\n return out;\n }\n\n /** Translates spill ownership across a structural edit on `editedSheet`. */\n #shiftSpillBookkeeping(shift: RefShift, editedSheet: string): void {\n const shiftCellKey = (key: string): string | null => {\n const { sheet, row, col } = parseKey(key);\n if (sheet !== editedSheet) return key;\n const r = shift.dim === 'row' ? shiftIndex(row, shift) : row;\n const c = shift.dim === 'col' ? shiftIndex(col, shift) : col;\n if (r === null || c === null) return null;\n return keyOf(sheet, cellRefFromRowCol(r, c));\n };\n\n const newSpills = new Map<string, Set<string>>();\n this.#spillOwner.clear();\n\n for (const [anchor, members] of this.#spills) {\n const newAnchor = shiftCellKey(anchor);\n if (newAnchor === null) {\n // The anchor was deleted — clear its surviving spilled values.\n for (const m of members) {\n const shifted = shiftCellKey(m);\n if (!shifted) continue;\n const cell = parseKey(shifted);\n this.#writeCell(this.#sheetNames.get(cell.sheet) ?? cell.sheet, cell.ref, null, cell.row, cell.col);\n }\n continue;\n }\n const newMembers = new Set<string>();\n for (const m of members) {\n const shifted = shiftCellKey(m);\n if (!shifted) continue;\n newMembers.add(shifted);\n this.#spillOwner.set(shifted, newAnchor);\n }\n newSpills.set(newAnchor, newMembers);\n }\n\n this.#spills = newSpills;\n }\n\n // ── Internals ────────────────────────────────────────────────────────────────\n\n /**\n * Recomputes formulas affected by the given changed cells, to a fixpoint.\n *\n * A single topological pass is not enough once dynamic arrays exist: a\n * formula that spills changes cells the graph could not know about until the\n * array was computed, and those cells may have their own dependents. So we\n * evaluate a pass, collect every cell whose value actually changed (formula\n * outputs plus spilled/cleared cells), then recompute the dependents of those\n * cells, repeating until nothing new is affected (bounded for safety).\n */\n #recalcFrom(\n seeds: CellRC[],\n includeKey?: string,\n ): RecalcResult[] {\n const results: RecalcResult[] = [];\n const evaluated = new Set<string>();\n\n // First wave: dependents of the seed cells, plus volatiles, plus a\n // freshly-set formula cell.\n let pending = this.#dependentClosure(seeds, evaluated);\n this.#addVolatiles(pending);\n if (includeKey) {\n const self = this.#formulas.get(includeKey);\n if (self) pending.set(includeKey, self);\n }\n\n results.push(...this.#runFixpoint(pending, evaluated));\n return results;\n }\n\n /** Evaluates `pending` entries to a fixpoint, following spill-induced changes. */\n #runFixpoint(pending: Map<string, FormulaEntry>, evaluated: Set<string>): RecalcResult[] {\n const results: RecalcResult[] = [];\n let guard = 0;\n const maxIterations = this.#formulas.size + 8;\n while (pending.size > 0 && guard++ <= maxIterations) {\n const { results: passResults, changed } = this.#evaluatePass([...pending.values()]);\n results.push(...passResults);\n for (const k of pending.keys()) evaluated.add(k);\n pending = this.#dependentClosure(changed, evaluated);\n }\n return results;\n }\n\n /** Adds every volatile formula to a pending set. */\n #addVolatiles(pending: Map<string, FormulaEntry>): void {\n for (const key of this.#volatiles) {\n const e = this.#formulas.get(key);\n if (e) pending.set(key, e);\n }\n }\n\n /**\n * Formula entries (not yet evaluated) whose precedents include one of the\n * cells, transitively. The queue is walked with a head index — Array.shift()\n * is O(n) per dequeue, which turns a long dependency chain quadratic.\n */\n #dependentClosure(cells: CellRC[], evaluated: Set<string>): Map<string, FormulaEntry> {\n const out = new Map<string, FormulaEntry>();\n const queue: CellRC[] = [...cells];\n for (let head = 0; head < queue.length; head++) {\n const cell = queue[head]!;\n this.#forEachDirectDependent(cell, dep => {\n if (out.has(dep.key) || evaluated.has(dep.key)) return;\n out.set(dep.key, dep);\n queue.push({ sheet: dep.sheet, row: dep.row, col: dep.col });\n });\n }\n return out;\n }\n\n /**\n * Visits the formula entries whose precedents include the given cell, via the\n * reverse index. The index over-approximates (it buckets rectangles into\n * tiles), so each candidate is still confirmed against its real rectangles.\n */\n #forEachDirectDependent(cell: CellRC, visit: (entry: FormulaEntry) => void): void {\n this.#dependents.candidates(cell.sheet, cell.row, cell.col, key => {\n const e = this.#formulas.get(key);\n if (!e) return;\n for (const ref of e.refs) {\n if (refContains(ref, cell.sheet, cell.row, cell.col)) { visit(e); return; }\n }\n });\n }\n\n /**\n * Topologically sorts the given entries and evaluates them, writing results\n * (scalars or spilled arrays) back to the model. Returns the results and the\n * flat list of cells whose value changed. Entries left in a cycle are #REF!.\n */\n #evaluatePass(entries: FormulaEntry[]): { results: RecalcResult[]; changed: CellRC[] } {\n const inSet = new Map<string, FormulaEntry>();\n for (const e of entries) inSet.set(e.key, e);\n\n // Build edges precedent → dependent, restricted to entries in this pass.\n // Driven from the reverse index: asking \"who reads this cell\" for each pass\n // member is O(candidates), where testing every pair would be O(n²).\n const indegree = new Map<string, number>();\n const dependents = new Map<string, string[]>();\n for (const k of inSet.keys()) { indegree.set(k, 0); dependents.set(k, []); }\n\n for (const pe of entries) {\n const seen = new Set<string>();\n this.#forEachDirectDependent({ sheet: pe.sheet, row: pe.row, col: pe.col }, dep => {\n if (dep.key === pe.key || !inSet.has(dep.key) || seen.has(dep.key)) return;\n seen.add(dep.key);\n dependents.get(pe.key)!.push(dep.key);\n indegree.set(dep.key, indegree.get(dep.key)! + 1);\n });\n }\n\n // Kahn topological sort. The ready list is drained with a head index, since\n // Array.shift() would be O(n) per step.\n const ready: string[] = [];\n for (const [k, d] of indegree) if (d === 0) ready.push(k);\n const order: string[] = [];\n for (let head = 0; head < ready.length; head++) {\n const k = ready[head]!;\n order.push(k);\n for (const d of dependents.get(k)!) {\n const left = indegree.get(d)! - 1;\n indegree.set(d, left);\n if (left === 0) ready.push(d);\n }\n }\n\n const results: RecalcResult[] = [];\n const changed: CellRC[] = [];\n const emitted = new Set(order);\n\n for (const k of order) {\n const e = inSet.get(k)!;\n const { result, changed: c } = this.#writeResult(e);\n results.push(result);\n changed.push(...c);\n }\n\n // Anything not emitted is in a circular reference.\n for (const [k, e] of inSet) {\n if (emitted.has(k)) continue;\n this.#clearSpill(e.key, changed);\n const value = FormulaValue.errorRef.toObject();\n this.#writeCell(e.sheetName, e.ref, value, e.row, e.col);\n changed.push({ sheet: e.sheet, row: e.row, col: e.col });\n results.push({ sheet: e.sheetName, ref: e.ref, value, circular: true });\n }\n\n return { results, changed };\n }\n\n /**\n * Evaluates one formula and writes its result. Scalars go to the anchor cell.\n * Arrays spill across a block anchored at the formula cell: on a collision\n * with existing content the anchor becomes #SPILL! and nothing spills; when\n * an array shrinks, previously-spilled cells it no longer covers are cleared.\n */\n #writeResult(e: FormulaEntry): { result: RecalcResult; changed: CellRC[] } {\n const anchorKey = e.key;\n const fv = this.#evaluateFormulaValue(e);\n const changed: CellRC[] = [];\n const prevSpill = this.#spills.get(anchorKey) ?? new Set<string>();\n\n if (!fv.isArray) {\n this.#clearSpill(anchorKey, changed);\n this.#model.setCellArrayRef?.(e.sheetName, e.ref, null);\n const value = fv.toObject();\n this.#writeCell(e.sheetName, e.ref, value, e.row, e.col);\n changed.push({ sheet: e.sheet, row: e.row, col: e.col });\n return { result: { sheet: e.sheetName, ref: e.ref, value }, changed };\n }\n\n const arr = fv.arrayVal;\n const rows = arr.rows, cols = arr.columns;\n\n // Collision check for every non-anchor cell in the target block.\n let collides = false;\n for (let dr = 0; dr < rows && !collides; dr++) {\n for (let dc = 0; dc < cols && !collides; dc++) {\n if (dr === 0 && dc === 0) continue;\n const r = e.row + dr, c = e.col + dc;\n const cellKey = keyOf(e.sheet, cellRefFromRowCol(r, c));\n if (this.#isOccupied(cellKey, e.sheetName, cellRefFromRowCol(r, c), anchorKey, prevSpill)) {\n collides = true;\n }\n }\n }\n\n if (collides) {\n this.#clearSpill(anchorKey, changed);\n this.#model.setCellArrayRef?.(e.sheetName, e.ref, null);\n const value = FormulaValue.error(FormulaError.Spill).toObject(); // '#SPILL!'\n this.#writeCell(e.sheetName, e.ref, value, e.row, e.col);\n changed.push({ sheet: e.sheet, row: e.row, col: e.col });\n return { result: { sheet: e.sheetName, ref: e.ref, value }, changed };\n }\n\n // Write the block; track newly-owned spill cells.\n const newSpill = new Set<string>();\n for (let dr = 0; dr < rows; dr++) {\n for (let dc = 0; dc < cols; dc++) {\n const r = e.row + dr, c = e.col + dc;\n const ref = cellRefFromRowCol(r, c);\n this.#writeCell(e.sheetName, ref, arr.get(dr, dc).toObject(), r, c);\n changed.push({ sheet: e.sheet, row: r, col: c });\n if (dr !== 0 || dc !== 0) {\n const cellKey = keyOf(e.sheet, ref);\n newSpill.add(cellKey);\n this.#spillOwner.set(cellKey, anchorKey);\n }\n }\n }\n\n // Clear previously-spilled cells no longer covered.\n for (const oldKey of prevSpill) {\n if (newSpill.has(oldKey)) continue;\n const cell = parseKey(oldKey);\n this.#writeCell(this.#sheetNames.get(cell.sheet) ?? cell.sheet, cell.ref, null, cell.row, cell.col);\n this.#spillOwner.delete(oldKey);\n changed.push({ sheet: cell.sheet, row: cell.row, col: cell.col });\n }\n\n this.#spills.set(anchorKey, newSpill);\n // Mark the anchor as a dynamic-array formula spanning the written block.\n const spillRef = `${e.ref}:${cellRefFromRowCol(e.row + rows - 1, e.col + cols - 1)}`;\n this.#model.setCellArrayRef?.(e.sheetName, e.ref, spillRef);\n return {\n result: { sheet: e.sheetName, ref: e.ref, value: arr.get(0, 0).toObject(), spill: { rows, cols } },\n changed,\n };\n }\n\n /** Whether a target cell already holds content that blocks a spill. */\n #isOccupied(\n cellKey: string,\n sheetName: string,\n ref: string,\n anchorKey: string,\n prevSpill: Set<string>,\n ): boolean {\n // Another formula living in the target block blocks the spill.\n if (this.#formulas.has(cellKey) && cellKey !== anchorKey) return true;\n // Owned by a different anchor's spill → collision.\n const owner = this.#spillOwner.get(cellKey);\n if (owner && owner !== anchorKey) return true;\n // Our own previous spill cell → free to reuse.\n if (prevSpill.has(cellKey)) return false;\n // A literal value already there → collision.\n const v = this.#model.getCellValue(sheetName, ref);\n return v !== null && v !== undefined && v !== '';\n }\n\n /** Clears an anchor's spilled cells (not the anchor itself) and forgets them. */\n #clearSpill(anchorKey: string, changed: CellRC[]): void {\n const spill = this.#spills.get(anchorKey);\n if (!spill) return;\n for (const cellKey of spill) {\n const cell = parseKey(cellKey);\n this.#writeCell(this.#sheetNames.get(cell.sheet) ?? cell.sheet, cell.ref, null, cell.row, cell.col);\n this.#spillOwner.delete(cellKey);\n changed.push({ sheet: cell.sheet, row: cell.row, col: cell.col });\n }\n this.#spills.delete(anchorKey);\n }\n\n #evaluateFormulaValue(e: FormulaEntry): FormulaValue {\n if (!e.ast) {\n // Only reachable after a structural rewrite invalidated the cached AST.\n try {\n e.ast = parseFormulaUncached(e.formula);\n } catch {\n return FormulaValue.errorValue;\n }\n }\n return evaluateAst(e.ast, this.#sheetLike(e.sheetName), {\n workbook: this.#buildWorkbookLike(),\n formulaRow: e.row,\n formulaCol: e.col,\n rangeCache: this.#rangeCache,\n });\n }\n\n /**\n * Per-sheet evaluator adapter. Memoised: these hold no per-formula state, and\n * rebuilding one (with its four closures) for every formula evaluated made a\n * full recalc allocate several objects per cell.\n */\n #sheetLike(sheetName: string): WorksheetLike {\n let cached = this.#sheetLikes.get(sheetName);\n if (!cached) {\n cached = this.#buildSheetLike(sheetName);\n this.#sheetLikes.set(sheetName, cached);\n }\n return cached;\n }\n\n #buildSheetLike(sheetName: string): WorksheetLike {\n const model = this.#model;\n return {\n name: sheetName,\n getCellValue: (ref: string) => this.#model.getCellValue(sheetName, ref),\n getCellValueAt: model.getCellValueAt\n ? (row: number, column: number) => model.getCellValueAt!(sheetName, row, column)\n : undefined,\n // A getter, not a snapshot: the extent grows as formulas write results,\n // and a whole-column reference read later in the same pass must see it.\n get usedBounds() {\n return model.getUsedBounds?.(sheetName);\n },\n isRowHidden: this.#model.isRowHidden\n ? (row: number) => this.#model.isRowHidden!(sheetName, row)\n : undefined,\n getCellFormula: this.#model.getCellFormula\n ? (ref: string) => this.#model.getCellFormula!(sheetName, ref)\n : undefined,\n getSpillRange: this.#model.getSpillRange\n ? (ref: string) => this.#model.getSpillRange!(sheetName, ref)\n : undefined,\n };\n }\n\n #buildWorkbookLike(): WorkbookLike {\n if (this.#workbookLike) return this.#workbookLike;\n const self = this;\n return (this.#workbookLike = {\n get worksheets(): readonly WorksheetLike[] {\n return [...self.#sheetNames.values()].map(n => self.#sheetLike(n));\n },\n getWorksheet: (name: string) => self.#sheetLike(name),\n getDefinedName: this.#model.getDefinedName\n ? (name: string, sheet?: string) => this.#model.getDefinedName!(name, sheet)\n : undefined,\n });\n }\n}\n"]}