@vertaaux/cli 0.3.0 → 0.3.1
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/node_modules/@vertaaux/tui/dist/index.cjs +1157 -0
- package/node_modules/@vertaaux/tui/dist/index.cjs.map +1 -0
- package/node_modules/@vertaaux/tui/dist/index.d.cts +609 -0
- package/node_modules/@vertaaux/tui/dist/index.d.ts +609 -0
- package/node_modules/@vertaaux/tui/dist/index.js +1100 -0
- package/node_modules/@vertaaux/tui/dist/index.js.map +1 -0
- package/node_modules/@vertaaux/tui/package.json +64 -0
- package/package.json +4 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ansi.ts","../src/theme.ts","../src/detect.ts","../src/primitives/text.ts","../src/primitives/box.ts","../src/primitives/table.ts","../src/primitives/spinner.ts","../src/primitives/progress.ts","../src/primitives/list.ts","../src/primitives/diff.ts","../src/dashboard/state.ts","../src/dashboard/frame.ts","../src/layout/alternate.ts","../src/layout/inline.ts","../src/layout/renderer.ts","../src/dashboard/keyboard.ts"],"names":["bold","dim","text","label","formatElapsed"],"mappings":";;;;;;;;;;AAOA,IAAM,GAAA,GAAM,MAAA;AACZ,IAAM,GAAA,GAAM,GAAG,GAAG,CAAA,CAAA,CAAA;AAIX,IAAM,MAAA,GAAS;AAAA;AAAA,EAEpB,EAAA,EAAI,CAAC,GAAA,EAAa,GAAA,KAAgB,GAAG,GAAG,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAA;AAAA;AAAA,EAErD,IAAA,EAAM,GAAG,GAAG,CAAA,CAAA,CAAA;AAAA;AAAA,EAEZ,IAAI,CAAC,CAAA,GAAI,MAAM,CAAA,EAAG,GAAG,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA;AAAA,EAEzB,MAAM,CAAC,CAAA,GAAI,MAAM,CAAA,EAAG,GAAG,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA;AAAA,EAE3B,QAAQ,CAAC,CAAA,KAAc,CAAA,EAAG,GAAG,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA;AAAA,EAEjC,IAAA,EAAM,GAAG,GAAG,CAAA,IAAA,CAAA;AAAA;AAAA,EAEZ,IAAA,EAAM,GAAG,GAAG,CAAA,IAAA,CAAA;AAAA;AAAA,EAEZ,IAAA,EAAM,GAAG,GAAG,CAAA,CAAA,CAAA;AAAA;AAAA,EAEZ,OAAA,EAAS,GAAG,GAAG,CAAA,CAAA;AACjB;AAIO,IAAM,MAAA,GAAS;AAAA;AAAA,EAEpB,KAAA,EAAO,GAAG,GAAG,CAAA,EAAA,CAAA;AAAA;AAAA,EAEb,SAAA,EAAW,GAAG,GAAG,CAAA,CAAA,CAAA;AAAA;AAAA,EAEjB,SAAA,EAAW,GAAG,GAAG,CAAA,CAAA,CAAA;AAAA;AAAA,EAEjB,aAAA,EAAe,GAAG,GAAG,CAAA,EAAA,CAAA;AAAA;AAAA,EAErB,QAAA,EAAU,GAAG,GAAG,CAAA,MAAA,CAAA;AAAA;AAAA,EAEhB,OAAA,EAAS,GAAG,GAAG,CAAA,MAAA;AACjB;AAIO,IAAM,KAAA,GAAQ;AAAA;AAAA,EAEnB,KAAA,EAAO,GAAG,GAAG,CAAA,EAAA;AACf;AAIO,IAAM,OAAA,GAAU;AAAA,EACrB,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,QAAA;AAAA;AAAA,IACT,QAAA,EAAU,QAAA;AAAA;AAAA,IACV,UAAA,EAAY,QAAA;AAAA;AAAA,IACZ,WAAA,EAAa,QAAA;AAAA;AAAA,IACb,UAAA,EAAY,QAAA;AAAA;AAAA,IACZ,QAAA,EAAU;AAAA;AAAA,GACZ;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,QAAA;AAAA;AAAA,IACT,QAAA,EAAU,QAAA;AAAA;AAAA,IACV,UAAA,EAAY,QAAA;AAAA;AAAA,IACZ,WAAA,EAAa,QAAA;AAAA;AAAA,IACb,UAAA,EAAY,QAAA;AAAA;AAAA,IACZ,QAAA,EAAU;AAAA;AAAA,GACZ;AAAA,EACA,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,QAAA;AAAA;AAAA,IACT,QAAA,EAAU,QAAA;AAAA;AAAA,IACV,UAAA,EAAY,QAAA;AAAA;AAAA,IACZ,WAAA,EAAa,QAAA;AAAA;AAAA,IACb,UAAA,EAAY,QAAA;AAAA;AAAA,IACZ,QAAA,EAAU;AAAA;AAAA,GACZ;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,QAAA;AAAA;AAAA,IACT,QAAA,EAAU,QAAA;AAAA;AAAA,IACV,UAAA,EAAY,QAAA;AAAA;AAAA,IACZ,WAAA,EAAa,QAAA;AAAA;AAAA,IACb,UAAA,EAAY,QAAA;AAAA;AAAA,IACZ,QAAA,EAAU;AAAA;AAAA;AAEd;AAiBO,SAAS,UAAU,GAAA,EAAqB;AAE7C,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,iCAAA,EAAmC,EAAE,CAAA;AAC1D;AAGO,SAAS,cAAc,GAAA,EAAqB;AACjD,EAAA,OAAO,SAAA,CAAU,GAAG,CAAA,CAAE,MAAA;AACxB;AAGO,SAAS,MAAA,CAAO,KAAa,KAAA,EAAuB;AACzD,EAAA,MAAM,OAAA,GAAU,cAAc,GAAG,CAAA;AACjC,EAAA,IAAI,OAAA,IAAW,OAAO,OAAO,GAAA;AAC7B,EAAA,OAAO,GAAA,GAAM,GAAA,CAAI,MAAA,CAAO,KAAA,GAAQ,OAAO,CAAA;AACzC;AAGO,SAAS,QAAA,CAAS,KAAa,KAAA,EAAuB;AAC3D,EAAA,MAAM,OAAA,GAAU,cAAc,GAAG,CAAA;AACjC,EAAA,IAAI,OAAA,IAAW,OAAO,OAAO,GAAA;AAC7B,EAAA,OAAO,GAAA,CAAI,MAAA,CAAO,KAAA,GAAQ,OAAO,CAAA,GAAI,GAAA;AACvC;AAGO,SAAS,MAAA,CAAO,KAAa,KAAA,EAAuB;AACzD,EAAA,MAAM,OAAA,GAAU,cAAc,GAAG,CAAA;AACjC,EAAA,IAAI,OAAA,IAAW,OAAO,OAAO,GAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAA,CAAO,KAAA,GAAQ,WAAW,CAAC,CAAA;AAC7C,EAAA,MAAM,KAAA,GAAQ,QAAQ,OAAA,GAAU,IAAA;AAChC,EAAA,OAAO,IAAI,MAAA,CAAO,IAAI,IAAI,GAAA,GAAM,GAAA,CAAI,OAAO,KAAK,CAAA;AAClD;AAGO,SAAS,QAAA,CAAS,KAAa,QAAA,EAA0B;AAC9D,EAAA,IAAI,QAAA,IAAY,GAAG,OAAO,EAAA;AAC1B,EAAA,MAAM,QAAA,GAAW,UAAU,GAAG,CAAA;AAC9B,EAAA,IAAI,QAAA,CAAS,MAAA,IAAU,QAAA,EAAU,OAAO,GAAA;AACxC,EAAA,IAAI,YAAY,CAAA,EAAG,OAAO,QAAA,CAAS,KAAA,CAAM,GAAG,QAAQ,CAAA;AACpD,EAAA,OAAO,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,QAAA,GAAW,CAAC,CAAA,GAAI,QAAA;AAC3C;AC1IO,IAAM,KAAA,GAAQ;AAAA,EACnB,IAAA,EAAM,SAAA;AAAA,EACN,SAAA,EAAW,SAAA;AAAA,EACX,IAAA,EAAM,SAAA;AAAA,EACN,IAAA,EAAM,SAAA;AAAA,EACN,IAAA,EAAM;AACR;AAGO,IAAM,QAAA,GAAW,CAAC,KAAA,CAAM,IAAA,EAAM,MAAM,SAAA,EAAW,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,IAAI;AAIrE,IAAM,QAAA,GAAW;AAAA,EACtB,QAAA,EAAU,SAAA;AAAA,EACV,KAAA,EAAO,SAAA;AAAA,EACP,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU,SAAA;AAAA,EACV,KAAA,EAAO,SAAA;AAAA,EACP,IAAA,EAAM;AACR;AAKO,IAAM,cAAA,GAAyC;AAAA,EACpD,QAAA,EAAU,UAAA;AAAA,EACV,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU,UAAA;AAAA,EACV,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM;AACR;AAGO,IAAM,aAAA,GAAwC;AAAA,EACnD,QAAA,EAAU,CAAA;AAAA,EACV,KAAA,EAAO,CAAA;AAAA,EACP,OAAA,EAAS,CAAA;AAAA,EACT,OAAA,EAAS,CAAA;AAAA,EACT,KAAA,EAAO,CAAA;AAAA,EACP,QAAA,EAAU,CAAA;AAAA,EACV,IAAA,EAAM;AACR;AAKA,IAAM,gBAAA,GAAmB;AAAA,EACvB,EAAE,GAAA,EAAK,EAAA,EAAI,KAAA,EAAO,SAAA,EAAU;AAAA;AAAA,EAC5B,EAAE,GAAA,EAAK,EAAA,EAAI,KAAA,EAAO,SAAA,EAAU;AAAA;AAAA,EAC5B,EAAE,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,SAAA;AAAU;AAC7B,CAAA;AAKO,SAAS,WAAW,KAAA,EAAuB;AAChD,EAAA,KAAA,MAAW,EAAE,GAAA,EAAK,KAAA,EAAM,IAAK,gBAAA,EAAkB;AAC7C,IAAA,IAAI,KAAA,IAAS,KAAK,OAAO,KAAA;AAAA,EAC3B;AACA,EAAA,OAAO,gBAAA,CAAiB,gBAAA,CAAiB,MAAA,GAAS,CAAC,CAAA,CAAE,KAAA;AACvD;AAIO,IAAM,MAAA,GAAS;AAAA,EACpB,OAAA,EAAS,SAAA;AAAA,EACT,KAAA,EAAO,SAAA;AAAA,EACP,OAAA,EAAS,SAAA;AAAA,EACT,IAAA,EAAM,SAAA;AAAA,EACN,KAAA,EAAO,SAAA;AAAA,EACP,QAAQ,KAAA,CAAM;AAChB;AAIA,IAAI,aAAA,GAAgB,IAAA;AAGb,SAAS,gBAAgB,OAAA,EAAwB;AACtD,EAAA,aAAA,GAAgB,OAAA;AAClB;AAGO,SAAS,cAAA,GAA0B;AACxC,EAAA,OAAO,aAAA;AACT;AAGO,SAAS,QAAA,CAAS,MAAc,GAAA,EAAqB;AAC1D,EAAA,IAAI,CAAC,eAAe,OAAO,IAAA;AAC3B,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,CAAE,IAAI,CAAA;AAC5B;AAGO,SAAS,SAAA,CAAU,MAAc,GAAA,EAAqB;AAC3D,EAAA,IAAI,CAAC,eAAe,OAAO,IAAA;AAC3B,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AACjC;AAGO,SAAS,IAAI,IAAA,EAAsB;AACxC,EAAA,IAAI,CAAC,eAAe,OAAO,IAAA;AAC3B,EAAA,OAAO,KAAA,CAAM,IAAI,IAAI,CAAA;AACvB;AAGO,SAAS,KAAK,IAAA,EAAsB;AACzC,EAAA,IAAI,CAAC,eAAe,OAAO,IAAA;AAC3B,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAGO,SAAS,aAAA,CAAc,IAAA,EAAc,MAAA,GAA4B,QAAA,EAAkB;AACxF,EAAA,IAAI,CAAC,eAAe,OAAO,IAAA;AAC3B,EAAA,MAAM,aAAa,MAAA,CAAO,MAAA;AAC1B,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,IAAI,GAAA,GAAM,CAAA;AAEV,EAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,IAAA,IAAI,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,IAAA,EAAM;AACjC,MAAA,MAAA,IAAU,MAAM,GAAA,CAAI,MAAA,CAAO,MAAM,UAAU,CAAC,EAAE,IAAI,CAAA;AAClD,MAAA,GAAA,EAAA;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAA,IAAU,IAAA;AAAA,IACZ;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;ACvIO,SAAS,IAAA,GAAgB;AAC9B,EAAA,OAAO,OAAA;AAAA,IACL,OAAA,CAAQ,GAAA,CAAI,EAAA,IACZ,OAAA,CAAQ,GAAA,CAAI,0BACZ,OAAA,CAAQ,GAAA,CAAI,YAAA,IACZ,OAAA,CAAQ,GAAA,CAAI,cAAA,IACZ,QAAQ,GAAA,CAAI,SAAA,IACZ,OAAA,CAAQ,GAAA,CAAI,QAAA,IACZ,OAAA,CAAQ,GAAA,CAAI,WAAA,IACZ,OAAA,CAAQ,GAAA,CAAI,MAAA,IACZ,OAAA,CAAQ,GAAA,CAAI;AAAA,GACd;AACF;AAGO,SAAS,KAAA,GAAiB;AAC/B,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA;AACrC;AAGO,SAAS,WAAA,GAAuB;AACrC,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA;AACrC;AAGO,SAAS,UAAA,GAAsB;AACpC,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA;AACpC;AAOO,SAAS,cAAA,GAA0B;AACxC,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,MAAA,EAAW,OAAO,KAAA;AAC/C,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,WAAA,KAAgB,MAAA,EAAW,OAAO,IAAA;AAClD,EAAA,IAAI,IAAA,IAAQ,OAAO,KAAA;AACnB,EAAA,OAAO,KAAA,EAAM;AACf;AAGO,SAAS,gBAAA,GAA2B;AACzC,EAAA,OAAO,OAAA,CAAQ,OAAO,OAAA,IAAW,EAAA;AACnC;AAGO,SAAS,iBAAA,GAA4B;AAC1C,EAAA,OAAO,OAAA,CAAQ,OAAO,IAAA,IAAQ,EAAA;AAChC;AAGO,SAAS,eAAA,GAA2B;AACzC,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,IAAA,KAAS,MAAA,EAAQ,OAAO,KAAA;AACxC,EAAA,IAAI,OAAA,CAAQ,aAAa,OAAA,EAAS;AAChC,IAAA,OAAO,QAAQ,OAAA,CAAQ,GAAA,CAAI,UAAA,IAAc,OAAA,CAAQ,IAAI,YAAY,CAAA;AAAA,EACnE;AACA,EAAA,OAAO,IAAA;AACT;;;AClEA,IAAA,YAAA,GAAA;AAAA,QAAA,CAAA,YAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA,KAAAA;AAAA,EAAA,GAAA,EAAA,MAAAC,IAAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,EAAA,EAAA,MAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,OAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAqBO,SAAS,QAAQ,IAAA,EAAsB;AAC5C,EAAA,OAAO,SAAA,CAAU,IAAA,EAAM,KAAA,CAAM,IAAI,CAAA;AACnC;AAGO,SAAS,WAAW,IAAA,EAAsB;AAC/C,EAAA,OAAO,SAAA,CAAU,IAAA,EAAM,KAAA,CAAM,IAAI,CAAA;AACnC;AAGO,SAAS,MAAM,IAAA,EAAsB;AAC1C,EAAA,OAAO,KAAU,IAAI,CAAA;AACvB;AAGO,SAASA,KAAI,IAAA,EAAsB;AACxC,EAAA,OAAO,IAAS,IAAI,CAAA;AACtB;AAGO,SAASD,MAAK,IAAA,EAAsB;AACzC,EAAA,OAAO,KAAU,IAAI,CAAA;AACvB;AAGO,SAAS,KAAK,IAAA,EAAsB;AACzC,EAAA,IAAI,CAAC,cAAA,EAAe,EAAG,OAAO,IAAA;AAC9B,EAAA,OAAO,QAAA,CAAS,CAAA,OAAA,EAAU,IAAI,CAAA,QAAA,CAAA,EAAY,OAAO,IAAI,CAAA;AACvD;AAGO,SAAS,cAAc,KAAA,EAAuB;AACnD,EAAA,MAAM,UAAA,GAAa,MAAM,WAAA,EAAY;AACrC,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,UAAU,CAAA,IAAK,MAAM,WAAA,EAAY;AACrE,EAAA,MAAM,GAAA,GAAM,QAAA,CAAgB,UAA0C,CAAA,IAAK,MAAA,CAAO,KAAA;AAClF,EAAA,OAAO,SAAA,CAAU,cAAc,GAAG,CAAA;AACpC;AAGO,SAAS,WAAW,KAAA,EAAuB;AAChD,EAAA,MAAM,GAAA,GAAM,WAAW,KAAK,CAAA;AAC5B,EAAA,OAAO,SAAA,CAAU,MAAA,CAAO,KAAK,CAAA,EAAG,GAAG,CAAA;AACrC;AAGO,SAAS,QAAQ,IAAA,EAAsB;AAC5C,EAAA,OAAO,QAAA,CAAS,IAAA,EAAM,MAAA,CAAO,OAAO,CAAA;AACtC;AAGO,SAAS,MAAM,IAAA,EAAsB;AAC1C,EAAA,OAAO,QAAA,CAAS,IAAA,EAAM,MAAA,CAAO,KAAK,CAAA;AACpC;AAGO,SAAS,QAAQ,IAAA,EAAsB;AAC5C,EAAA,OAAO,QAAA,CAAS,IAAA,EAAM,MAAA,CAAO,OAAO,CAAA;AACtC;AAGO,SAAS,KAAK,IAAA,EAAsB;AACzC,EAAA,OAAO,QAAA,CAAS,IAAA,EAAM,MAAA,CAAO,IAAI,CAAA;AACnC;AAGO,SAAS,QAAA,CAAS,KAAa,KAAA,EAAuB;AAC3D,EAAA,OAAO,CAAA,EAAG,IAAA,CAAU,GAAG,CAAC,KAAK,KAAK,CAAA,CAAA;AACpC;AAGO,SAAS,EAAA,CAAG,KAAA,EAAe,IAAA,GAAO,QAAA,EAAkB;AACzD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAC9B,EAAA,OAAO,IAAS,IAAI,CAAA;AACtB;AAGO,SAAS,UAAU,MAAA,EAA8D;AACtF,EAAA,MAAM,GAAA,GAAuD;AAAA,IAC3D,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAU,GAAA,EAAK,OAAO,OAAA,EAAQ;AAAA;AAAA,IAC9C,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAU,GAAA,EAAK,OAAO,KAAA,EAAM;AAAA;AAAA,IAC5C,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAU,GAAA,EAAK,OAAO,OAAA,EAAQ;AAAA;AAAA,IAC9C,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAU,GAAA,EAAK,OAAO,KAAA,EAAM;AAAA;AAAA,IAC5C,QAAQ,EAAE,MAAA,EAAQ,QAAA,EAAU,GAAA,EAAK,MAAM,IAAA;AAAK;AAAA,GAC9C;AACA,EAAA,MAAM,EAAE,MAAA,EAAQ,GAAA,KAAQ,GAAA,CAAI,MAAM,KAAK,GAAA,CAAI,IAAA;AAC3C,EAAA,OAAO,QAAA,CAAS,QAAQ,GAAG,CAAA;AAC7B;;;ACtEO,SAAS,GAAA,CAAI,OAAA,EAAiB,IAAA,GAAmB,EAAC,EAAW;AAClE,EAAA,MAAM;AAAA,IACJ,MAAA,GAAS,SAAA;AAAA,IACT,OAAA,GAAU,CAAA;AAAA,IACV,QAAA,GAAW,CAAA;AAAA,IACX,KAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA,EAAO,UAAA;AAAA,IACP,cAAc,KAAA,CAAM,IAAA;AAAA,IACpB,aAAa,KAAA,CAAM;AAAA,GACrB,GAAI,IAAA;AAEJ,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,OAAO,cAAA,CAAe,SAAS,OAAO,CAAA;AAAA,EACxC;AAEA,EAAA,MAAM,KAAA,GAAQ,QAAQ,MAAM,CAAA;AAC5B,EAAA,MAAM,YAAY,UAAA,IAAc,IAAA,CAAK,GAAA,CAAI,gBAAA,IAAoB,GAAG,CAAA;AAEhE,EAAA,MAAM,UAAA,GAAa,SAAA,GAAY,CAAA,GAAI,OAAA,GAAU,CAAA;AAE7C,EAAA,MAAM,EAAA,GAAK,CAAC,EAAA,KAAe,QAAA,CAAS,IAAI,WAAW,CAAA;AACnD,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,OAAA,EAAS,UAAU,CAAA;AAC3C,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,MAAA,CAAO,OAAO,CAAA;AAC9B,EAAA,MAAM,SAAmB,EAAC;AAG1B,EAAA,MAAA,CAAO,KAAK,eAAA,CAAgB,KAAA,EAAO,WAAW,KAAA,EAAO,UAAA,EAAY,WAAW,CAAC,CAAA;AAG7E,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,IAAA,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,QAAQ,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,SAAA,GAAY,CAAC,CAAA,GAAI,EAAA,CAAG,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAA,EACjF;AAGA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,MAAA,GAAS,GAAA,GAAM,MAAA,CAAO,IAAA,EAAM,UAAU,CAAA,GAAI,GAAA;AAChD,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,KAAA,CAAM,QAAQ,IAAI,MAAA,GAAS,EAAA,CAAG,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAA,EAC9D;AAGA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,IAAA,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,QAAQ,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,SAAA,GAAY,CAAC,CAAA,GAAI,EAAA,CAAG,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAA,EACjF;AAGA,EAAA,MAAA,CAAO,KAAK,kBAAA,CAAmB,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,WAAW,CAAC,CAAA;AAEvE,EAAA,OAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AACzB;AAEA,SAAS,cAAA,CAAe,SAAiB,OAAA,EAAyB;AAChE,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,MAAA,CAAO,OAAO,CAAA;AAC9B,EAAA,OAAO,OAAA,CACJ,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,IAAA,KAAS,GAAA,GAAM,IAAA,GAAO,GAAG,CAAA,CAC9B,IAAA,CAAK,IAAI,CAAA;AACd;AAEA,SAAS,eAAA,CACP,KAAA,EACA,KAAA,EACA,KAAA,EACA,YACA,WAAA,EACQ;AACR,EAAA,MAAM,EAAA,GAAK,CAAC,EAAA,KAAe,QAAA,CAAS,IAAI,WAAW,CAAA;AACnD,EAAA,MAAM,OAAO,KAAA,GAAQ,CAAA;AAErB,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,QAAA,GAAW,cAAA,EAAe,GAC5B,CAAA,CAAA,EAAI,QAAA,CAAS,OAAO,UAAU,CAAC,CAAA,CAAA,CAAA,GAC/B,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA;AACb,IAAA,MAAM,YAAA,GAAe,cAAc,QAAQ,CAAA;AAC3C,IAAA,MAAM,QAAA,GAAW,CAAA;AACjB,IAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,GAAO,WAAW,YAAY,CAAA;AAC5D,IAAA,OACE,EAAA,CAAG,MAAM,OAAO,CAAA,GAChB,GAAG,KAAA,CAAM,UAAA,CAAW,OAAO,QAAQ,CAAC,IACpC,QAAA,GACA,EAAA,CAAG,MAAM,UAAA,CAAW,MAAA,CAAO,SAAS,CAAC,CAAA,GACrC,EAAA,CAAG,KAAA,CAAM,QAAQ,CAAA;AAAA,EAErB;AAEA,EAAA,OAAO,EAAA,CAAG,KAAA,CAAM,OAAO,CAAA,GAAI,EAAA,CAAG,KAAA,CAAM,UAAA,CAAW,MAAA,CAAO,IAAI,CAAC,CAAA,GAAI,EAAA,CAAG,MAAM,QAAQ,CAAA;AAClF;AAEA,SAAS,kBAAA,CACP,KAAA,EACA,KAAA,EACA,QAAA,EACA,WAAA,EACQ;AACR,EAAA,MAAM,EAAA,GAAK,CAAC,EAAA,KAAe,QAAA,CAAS,IAAI,WAAW,CAAA;AACnD,EAAA,MAAM,OAAO,KAAA,GAAQ,CAAA;AAErB,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,MAAA,GAAS,CAAA,CAAA,EAAI,GAAA,CAAI,QAAQ,CAAC,CAAA,CAAA,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,cAAc,MAAM,CAAA;AACvC,IAAA,MAAM,SAAA,GAAY,CAAA;AAClB,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,GAAO,YAAY,UAAU,CAAA;AAC1D,IAAA,OACE,EAAA,CAAG,MAAM,UAAU,CAAA,GACnB,GAAG,KAAA,CAAM,UAAA,CAAW,OAAO,QAAQ,CAAC,IACpC,MAAA,GACA,EAAA,CAAG,MAAM,UAAA,CAAW,MAAA,CAAO,SAAS,CAAC,CAAA,GACrC,EAAA,CAAG,KAAA,CAAM,WAAW,CAAA;AAAA,EAExB;AAEA,EAAA,OAAO,EAAA,CAAG,KAAA,CAAM,UAAU,CAAA,GAAI,EAAA,CAAG,KAAA,CAAM,UAAA,CAAW,MAAA,CAAO,IAAI,CAAC,CAAA,GAAI,EAAA,CAAG,MAAM,WAAW,CAAA;AACxF;AAGA,SAAS,SAAA,CAAU,MAAc,QAAA,EAA4B;AAC3D,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,EAAG;AACtC,IAAA,IAAI,OAAA,CAAQ,UAAU,QAAA,EAAU;AAC9B,MAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AACnB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA;AAC/B,IAAA,IAAI,OAAA,GAAU,EAAA;AAEd,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ,WAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,UAAU,QAAA,EAAU;AACvD,QAAA,OAAA,IAAW,GAAA,GAAM,IAAA;AAAA,MACnB,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AACnB,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;ACjJO,SAAS,WAAA,CACd,IAAA,EACA,OAAA,EACA,IAAA,GAAqB,EAAC,EACd;AACR,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAE9B,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,gBAAA,EAAiB;AACnD,EAAA,MAAM,SAAA,GAAY,qBAAA,CAAsB,IAAA,EAAM,OAAA,EAAS,QAAQ,CAAA;AAC/D,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,IAAI,KAAK,UAAA,EAAY;AACnB,IAAA,KAAA,CAAM,KAAK,GAAA,CAAI,CAAA,aAAA,EAAM,KAAK,UAAU,CAAA,CAAA,EAAI,SAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG,QAAA,GAAW,KAAK,UAAA,CAAW,MAAA,GAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AAAA,EAC3G;AAGA,EAAA,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,SAAS,CAAC,CAAA;AAC9C,EAAA,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAC,CAAA;AAGrC,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,KAAA,CAAM,IAAA,CAAK,aAAA,CAAc,GAAA,EAAK,OAAA,EAAS,SAAS,CAAC,CAAA;AACjD,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAC,CAAA;AAAA,IACvC;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,qBAAA,CACP,IAAA,EACA,OAAA,EACA,QAAA,EACU;AACV,EAAA,MAAM,GAAA,GAAM,CAAA;AACZ,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,SAAA,GAAY,CAAA;AAGhB,EAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,IAAA,IAAI,IAAI,KAAA,EAAO;AACb,MAAA,MAAA,CAAO,IAAA,CAAK,IAAI,KAAK,CAAA;AACrB,MAAA,UAAA,IAAc,GAAA,CAAI,KAAA;AAAA,IACpB,CAAA,MAAO;AAEL,MAAA,MAAM,SAAA,GAAY,IAAI,KAAA,CAAM,MAAA;AAC5B,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ;AAC3C,QAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,IAAK,EAAA;AAC5B,QAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,GAAA,CAAI,MAAM,CAAA;AAAA,MACjC,GAAG,SAAS,CAAA;AACZ,MAAA,MAAA,CAAO,KAAK,UAAU,CAAA;AACtB,MAAA,SAAA,EAAA;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,IAAA,GAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAK,GAAA;AACpC,EAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,IAAA;AAGxD,EAAA,IAAI,WAAA,GAAc,QAAA,IAAY,SAAA,GAAY,CAAA,EAAG;AAC3C,IAAA,MAAM,SAAA,GAAY,WAAW,UAAA,GAAa,IAAA;AAC1C,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAC,OAAA,CAAQ,CAAC,CAAA,CAAE,KAAK,CAAA;AAC5D,IAAA,MAAM,SAAA,GAAY,WAAW,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAEtD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,IAAI,CAAC,OAAA,CAAQ,CAAC,CAAA,CAAE,KAAA,EAAO;AACrB,QAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAO,MAAA,CAAO,CAAC,CAAA,GAAI,SAAA,GAAa,SAAS,CAAC,CAAA;AAAA,MACzE;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAA,CAAgB,SAAmB,MAAA,EAA0B;AACpE,EAAA,MAAM,QAAQ,OAAA,CAAQ,GAAA;AAAA,IAAI,CAAC,GAAA,EAAK,CAAA,KAC9B,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,EAAO,MAAA,CAAO,CAAC,CAAA,EAAG,GAAA,CAAI,KAAA,IAAS,MAAM,CAAC;AAAA,GAC3D;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,gBAAgB,MAAA,EAA0B;AACjD,EAAA,OAAO,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,QAAA,CAAI,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,cAAI,CAAC,CAAA;AACxD;AAEA,SAAS,aAAA,CACP,GAAA,EACA,OAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAK,CAAA,KAAM;AACpC,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,IAAK,EAAA;AAC5B,IAAA,MAAM,SAAA,GAAY,QAAA,CAAY,GAAA,EAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,UAAU,SAAA,EAAW,MAAA,CAAO,CAAC,CAAA,EAAG,GAAA,CAAI,SAAS,MAAM,CAAA;AACnE,IAAA,OAAO,GAAA,CAAI,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,GAAI,OAAA;AAAA,EAC1C,CAAC,CAAA;AACD,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,SAAA,CAAU,IAAA,EAAc,KAAA,EAAe,KAAA,EAA4C;AAC1F,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,OAAA;AACH,MAAA,OAAO,QAAA,CAAS,MAAM,KAAK,CAAA;AAAA,IAC7B,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,OAAA,GAAU,cAAc,IAAI,CAAA;AAClC,MAAA,IAAI,OAAA,IAAW,OAAO,OAAO,IAAA;AAC7B,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAA,CAAO,KAAA,GAAQ,WAAW,CAAC,CAAA;AAC7C,MAAA,MAAM,KAAA,GAAQ,QAAQ,OAAA,GAAU,IAAA;AAChC,MAAA,OAAO,IAAI,MAAA,CAAO,IAAI,IAAI,IAAA,GAAO,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,IACnD;AAAA,IACA;AACE,MAAA,OAAO,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA;AAE/B;;;AC/IA,IAAM,cAAA,GAAiB,CAAC,QAAA,EAAK,QAAA,EAAK,UAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAG,CAAA;AAC9D,IAAM,cAAA,GAAiB,EAAA;AA6BhB,SAAS,aAAA,CACd,IAAA,EACA,MAAA,GAAgC,OAAA,CAAQ,MAAA,EACvB;AACjB,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,WAAA,GAAc,IAAA;AAClB,EAAA,IAAI,YAAA,GAAe,EAAA;AACnB,EAAA,IAAI,KAAA,GAA+C,IAAA;AACnD,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,MAAM,UAAU,KAAA,EAAM;AAEtB,EAAA,SAAS,MAAA,GAAe;AACtB,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,KAAA,GAAQ,cAAA,EAAe,GACzB,QAAA,CAAS,cAAA,CAAe,UAAU,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,GAC/C,cAAA,CAAe,UAAU,CAAA;AAE7B,IAAA,MAAM,WAAW,YAAA,GAAe,GAAA,CAAI,CAAA,EAAA,EAAK,YAAY,GAAG,CAAA,GAAI,EAAA;AAC5D,IAAA,MAAM,OAAO,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,WAAW,GAAG,QAAQ,CAAA,CAAA;AAE/C,IAAA,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,SAAA,GAAY,IAAA,GAAO,IAAI,CAAA;AAC3C,IAAA,UAAA,GAAA,CAAc,UAAA,GAAa,KAAK,cAAA,CAAe,MAAA;AAAA,EACjD;AAEA,EAAA,SAAS,SAAA,GAAkB;AACzB,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,SAAA,GAAY,IAAI,CAAA;AAAA,EACtC;AAEA,EAAA,SAAS,cAAA,CAAe,QAAgBE,KAAAA,EAAoB;AAC1D,IAAA,SAAA,EAAU;AACV,IAAA,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,CAAA,EAAIA,KAAI;AAAA,CAAI,CAAA;AAAA,EACpC;AAEA,EAAA,MAAM,QAAA,GAA4B;AAAA,IAChC,IAAI,SAAA,GAAY;AACd,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IAEA,KAAA,GAAQ;AACN,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,UAAA,GAAa,CAAA;AACb,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAA,EAAO;AACP,QAAA,KAAA,GAAQ,WAAA,CAAY,QAAQ,cAAc,CAAA;AAAA,MAC5C;AAAA,IACF,CAAA;AAAA,IAEA,IAAA,GAAO;AACL,MAAA,OAAA,GAAU,KAAA;AACV,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,aAAA,CAAc,KAAK,CAAA;AACnB,QAAA,KAAA,GAAQ,IAAA;AAAA,MACV;AACA,MAAA,SAAA,EAAU;AAAA,IACZ,CAAA;AAAA,IAEA,QAAQA,KAAAA,EAAc;AACpB,MAAA,WAAA,GAAcA,KAAAA;AAAA,IAChB,CAAA;AAAA,IAEA,SAAS,KAAA,EAAe;AACtB,MAAA,YAAA,GAAe,KAAA;AAAA,IACjB,CAAA;AAAA,IAEA,QAAQA,KAAAA,EAAc;AACpB,MAAA,QAAA,CAAS,IAAA,EAAK;AACd,MAAA,MAAM,MAAM,cAAA,EAAe,GAAI,QAAA,CAAS,QAAA,EAAK,SAAS,CAAA,GAAI,QAAA;AAC1D,MAAA,cAAA,CAAe,KAAKA,KAAI,CAAA;AAAA,IAC1B,CAAA;AAAA,IAEA,KAAKA,KAAAA,EAAc;AACjB,MAAA,QAAA,CAAS,IAAA,EAAK;AACd,MAAA,MAAM,MAAM,cAAA,EAAe,GAAI,QAAA,CAAS,QAAA,EAAK,SAAS,CAAA,GAAI,QAAA;AAC1D,MAAA,cAAA,CAAe,KAAKA,KAAI,CAAA;AAAA,IAC1B,CAAA;AAAA,IAEA,KAAKA,KAAAA,EAAc;AACjB,MAAA,QAAA,CAAS,IAAA,EAAK;AACd,MAAA,MAAM,MAAM,cAAA,EAAe,GAAI,QAAA,CAAS,QAAA,EAAK,SAAS,CAAA,GAAI,QAAA;AAC1D,MAAA,cAAA,CAAe,KAAKA,KAAI,CAAA;AAAA,IAC1B,CAAA;AAAA,IAEA,KAAKA,KAAAA,EAAc;AACjB,MAAA,QAAA,CAAS,IAAA,EAAK;AACd,MAAA,MAAM,MAAM,cAAA,EAAe,GAAI,QAAA,CAAS,QAAA,EAAK,SAAS,CAAA,GAAI,QAAA;AAC1D,MAAA,cAAA,CAAe,KAAKA,KAAI,CAAA;AAAA,IAC1B;AAAA,GACF;AAEA,EAAA,OAAO,QAAA;AACT;;;AC3HA,IAAM,SAAA,GAAY,QAAA;AAClB,IAAM,UAAA,GAAa,QAAA;AA6BZ,SAAS,kBAAkB,IAAA,EAAuC;AACvE,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,OAAAC,MAAAA,GAAQ,EAAA;AAAA,IACR,KAAA,EAAO,UAAA;AAAA,IACP,QAAQ,KAAA,CAAM,IAAA;AAAA,IACd,SAAS,OAAA,CAAQ;AAAA,GACnB,GAAI,IAAA;AAEJ,EAAA,MAAM,UAAU,KAAA,EAAM;AACtB,EAAA,IAAI,SAAA,GAAY,KAAK,GAAA,EAAI;AAEzB,EAAA,SAAS,SAAA,CAAU,SAAiB,QAAA,EAA2B;AAC7D,IAAA,MAAM,GAAA,GAAM,QAAQ,CAAA,GAAI,IAAA,CAAK,IAAI,OAAA,GAAU,KAAA,EAAO,CAAC,CAAA,GAAI,CAAA;AACvD,IAAA,MAAM,SAAS,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,GAAG,CAAC,CAAA,CAAA,CAAA;AAEvC,IAAA,MAAM,SAAA,GAAY,QAAA,IAAY,UAAA,IAAc,IAAA,CAAK,GAAA,CAAI,IAAI,gBAAA,EAAiB,IAAKA,MAAAA,CAAM,MAAA,GAAS,EAAA,CAAG,CAAA;AACjG,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,SAAS,CAAA;AACzC,IAAA,MAAM,QAAQ,SAAA,GAAY,MAAA;AAE1B,IAAA,MAAM,GAAA,GAAM,gBAAe,GACvB,QAAA,CAAS,UAAU,MAAA,CAAO,MAAM,CAAA,EAAG,KAAK,CAAA,GAAI,GAAA,CAAI,WAAW,MAAA,CAAO,KAAK,CAAC,CAAA,GACxE,SAAA,CAAU,OAAO,MAAM,CAAA,GAAI,UAAA,CAAW,MAAA,CAAO,KAAK,CAAA;AAEtD,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,OAAA,EAAS,KAAA,EAAO,SAAS,CAAA;AAC/C,IAAA,MAAM,QAAA,GAAWA,MAAAA,GAAQ,MAAA,CAAOA,MAAAA,EAAO,EAAE,CAAA,GAAI,EAAA;AAE7C,IAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,MAAM,CAAA,EAAG,GAAA,GAAM,CAAA,CAAA,EAAI,GAAA,CAAI,GAAG,CAAC,KAAK,EAAE,CAAA,CAAA;AAAA,EAChE;AAEA,EAAA,OAAO;AAAA,IACL,OAAO,OAAA,EAAiB;AACtB,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,MAAM,IAAA,GAAO,UAAU,OAAO,CAAA;AAC9B,MAAA,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,SAAA,GAAY,IAAA,GAAO,IAAI,CAAA;AAAA,IAC7C,CAAA;AAAA,IAEA,SAAS,OAAA,EAAkB;AACzB,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,SAAA,GAAY,IAAI,CAAA;AACpC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAM,MAAM,cAAA,EAAe,GAAI,QAAA,CAAS,QAAA,EAAK,SAAS,CAAA,GAAI,QAAA;AAC1D,QAAA,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,OAAO;AAAA,CAAI,CAAA;AAAA,MACpC;AAAA,IACF,CAAA;AAAA,IAEA,KAAK,OAAA,EAAkB;AACrB,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,SAAA,GAAY,IAAI,CAAA;AACpC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAM,MAAM,cAAA,EAAe,GAAI,QAAA,CAAS,QAAA,EAAK,SAAS,CAAA,GAAI,QAAA;AAC1D,QAAA,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,OAAO;AAAA,CAAI,CAAA;AAAA,MACpC;AAAA,IACF,CAAA;AAAA,IAEA,MAAA,CAAO,SAAiB,QAAA,EAA2B;AACjD,MAAA,OAAO,SAAA,CAAU,SAAS,QAAQ,CAAA;AAAA,IACpC;AAAA,GACF;AACF;AAEA,SAAS,SAAA,CAAU,OAAA,EAAiB,KAAA,EAAe,SAAA,EAA2B;AAC5E,EAAA,IAAI,OAAA,IAAW,CAAA,IAAK,KAAA,IAAS,CAAA,EAAG,OAAO,EAAA;AACvC,EAAA,MAAM,OAAA,GAAA,CAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,IAAa,GAAA;AAC3C,EAAA,MAAM,OAAO,OAAA,GAAU,OAAA;AACvB,EAAA,MAAM,SAAA,GAAA,CAAa,QAAQ,OAAA,IAAW,IAAA;AACtC,EAAA,IAAI,aAAa,CAAA,IAAK,CAAC,QAAA,CAAS,SAAS,GAAG,OAAO,EAAA;AACnD,EAAA,IAAI,YAAY,EAAA,EAAI,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,SAAS,CAAC,CAAA,CAAA,CAAA;AACnD,EAAA,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,IAAA,CAAK,SAAA,GAAY,EAAE,CAAC,CAAA,CAAA,CAAA;AACtC;AA2BO,SAAS,mBAAA,CAAoB,IAAA,GAA6B,EAAC,EAAkB;AAClF,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,OAAA,CAAQ,MAAA;AACtC,EAAA,MAAM,IAAA,uBAAkG,GAAA,EAAI;AAC5G,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,OAAO;AAAA,IACL,GAAA,CAAI,IAAY,OAAA,EAA6C;AAC3D,MAAA,MAAM,MAAM,iBAAA,CAAkB,EAAE,GAAG,OAAA,EAAS,QAAQ,CAAA;AACpD,MAAA,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,GAAA,EAAK,OAAA,EAAS,CAAA,EAAG,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,CAAA;AAAA,IAC1E,CAAA;AAAA,IAEA,MAAA,CAAO,IAAY,OAAA,EAAiB;AAClC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACzB,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,KAAA,CAAM,OAAA,GAAU,OAAA;AAAA,MAClB;AAAA,IACF,CAAA;AAAA,IAEA,SAAS,EAAA,EAAY;AACnB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACzB,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,KAAA,CAAM,UAAU,KAAA,CAAM,KAAA;AACtB,QAAA,KAAA,CAAM,SAAA,GAAY,IAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAAA,IAEA,SAAA,GAAoB;AAClB,MAAA,MAAM,QAAkB,EAAC;AACzB,MAAA,KAAA,MAAW,GAAG,KAAK,CAAA,IAAK,IAAA,EAAM;AAC5B,QAAA,KAAA,CAAM,KAAK,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,MAC5C;AACA,MAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACxB,CAAA;AAAA,IAEA,IAAA,GAAO;AACL,MAAA,IAAI,CAAC,OAAM,EAAG;AAEd,MAAA,IAAI,aAAa,CAAA,EAAG;AAClB,QAAA,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,EAAA,CAAG,UAAU,CAAC,CAAA;AAAA,MACpC;AACA,MAAA,MAAM,QAAkB,EAAC;AACzB,MAAA,KAAA,MAAW,GAAG,KAAK,CAAA,IAAK,IAAA,EAAM;AAC5B,QAAA,KAAA,CAAM,IAAA,CAAK,OAAO,SAAA,GAAY,KAAA,CAAM,IAAI,MAAA,CAAO,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,MAC/D;AACA,MAAA,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,IAAI,IAAI,IAAI,CAAA;AACpC,MAAA,UAAA,GAAa,KAAA,CAAM,MAAA;AAAA,IACrB,CAAA;AAAA,IAEA,KAAA,GAAQ;AACN,MAAA,IAAI,CAAC,KAAA,EAAM,IAAK,UAAA,KAAe,CAAA,EAAG;AAClC,MAAA,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,EAAA,CAAG,UAAU,CAAC,CAAA;AAClC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACnC,QAAA,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,SAAA,GAAY,IAAI,CAAA;AAAA,MACtC;AACA,MAAA,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,EAAA,CAAG,UAAU,CAAC,CAAA;AAClC,MAAA,UAAA,GAAa,CAAA;AAAA,IACf;AAAA,GACF;AACF;;;AC9KO,SAAS,UAAA,CAAW,KAAA,EAAiB,IAAA,GAAoB,EAAC,EAAW;AAC1E,EAAA,MAAM,EAAE,OAAA,GAAU,KAAA,EAAO,SAAS,CAAA,EAAG,MAAA,GAAS,UAAI,GAAI,IAAA;AACtD,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AAE9B,EAAA,OAAO,KAAA,CACJ,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,KAAM;AAChB,IAAA,MAAM,MAAA,GAAS,OAAA,GAAU,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA,CAAA,CAAA,GAAM,CAAA,EAAG,GAAG,CAAA,EAAG,MAAM,CAAA,CAAA;AAC5D,IAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,EAC1B,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AACd;AAsBO,SAAS,WAAW,IAAA,EAAgB,MAAA,GAAS,IAAI,MAAA,GAAS,IAAA,EAAM,SAAS,IAAA,EAAc;AAC5F,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,KAAA,CAAM,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,EACvB,CAAA,MAAO;AACL,IAAA,MAAM,SAAA,GAAY,SAAS,qBAAA,GAAS,qBAAA;AACpC,IAAA,KAAA,CAAM,KAAK,MAAA,GAAS,GAAA,CAAI,SAAS,CAAA,GAAI,KAAK,KAAK,CAAA;AAAA,EACjD;AAEA,EAAA,IAAI,IAAA,CAAK,QAAA,IAAY,CAAC,IAAA,CAAK,SAAA,EAAW;AACpC,IAAA,MAAM,cAAc,MAAA,GAAS,EAAA,GAAK,UAAU,MAAA,GAAS,MAAA,GAAS,IAAI,WAAM,CAAA,CAAA;AAExE,IAAA,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AACtC,MAAA,MAAM,WAAA,GAAc,KAAA,KAAU,IAAA,CAAK,QAAA,CAAU,MAAA,GAAS,CAAA;AACtD,MAAA,KAAA,CAAM,KAAK,UAAA,CAAW,KAAA,EAAO,WAAA,EAAa,WAAA,EAAa,KAAK,CAAC,CAAA;AAAA,IAC/D,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAgBO,SAAS,iBAAA,CACd,MAAA,EACA,IAAA,GAAoB,EAAC,EACb;AACR,EAAA,MAAM,OAAA,GAAU,MAAA,YAAkB,GAAA,GAAM,CAAC,GAAG,MAAA,CAAO,OAAA,EAAS,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA;AACrF,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,KAAA,MAAW,CAAC,UAAA,EAAY,KAAK,CAAA,IAAK,OAAA,EAAS;AACzC,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAExB,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,CAAA,aAAA,EAAM,UAAU,CAAA,EAAA,EAAK,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA,CAAE,CAAA;AACzE,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,KAAA,EAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAA,CAAS,IAAA,CAAK,MAAA,IAAU,CAAA,IAAK,CAAA,EAAG,CAAA;AAC1E,IAAA,QAAA,CAAS,IAAA,CAAK,GAAG,MAAM;AAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAAA,EACpC;AAEA,EAAA,OAAO,QAAA,CAAS,KAAK,MAAM,CAAA;AAC7B;;;AC7EO,SAAS,UAAA,CAAW,KAAA,EAAmB,IAAA,GAAoB,EAAC,EAAW;AAC5E,EAAA,MAAM,EAAE,IAAA,GAAO,SAAA,EAAU,GAAI,IAAA;AAE7B,EAAA,IAAI,SAAS,cAAA,EAAgB;AAC3B,IAAA,OAAO,gBAAA,CAAiB,OAAO,IAAI,CAAA;AAAA,EACrC;AAEA,EAAA,OAAO,cAAc,KAAK,CAAA;AAC5B;AAEA,SAAS,cAAc,KAAA,EAA2B;AAChD,EAAA,OAAO,KAAA,CACJ,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,IAAA,QAAQ,KAAK,IAAA;AAAM,MACjB,KAAK,QAAA;AACH,QAAA,OAAO,GAAA,CAAI,KAAK,OAAO,CAAA;AAAA,MACzB,KAAK,KAAA;AACH,QAAA,OAAO,SAAS,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA,CAAA,EAAI,OAAO,OAAO,CAAA;AAAA,MACrD,KAAK,QAAA;AACH,QAAA,OAAO,SAAS,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA,CAAA,EAAI,OAAO,KAAK,CAAA;AAAA,MACnD,KAAK,SAAA;AACH,QAAA,OAAO,GAAA,CAAI,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AAAA;AAClC,EACF,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AACd;AAEA,SAAS,gBAAA,CAAiB,OAAmB,IAAA,EAA2B;AACtE,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,gBAAA,EAAiB;AACnD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAA,CAAO,QAAA,GAAW,KAAK,CAAC,CAAA;AAE/C,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,MAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAO,CAAC,CAAA;AAC3B,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,IACf,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACjC,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,YAAA,CAAa,IAAA,CAAK,SAAS,SAAS,CAAA,EAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AACvE,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,IACf,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,KAAA,EAAO;AAC9B,MAAA,IAAA,CAAK,KAAK,EAAE,CAAA;AACZ,MAAA,KAAA,CAAM,IAAA,CAAK,SAAS,YAAA,CAAa,IAAA,CAAK,SAAS,SAAS,CAAA,EAAG,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,IAC5E,CAAA,MAAO;AACL,MAAA,MAAM,MAAM,GAAA,CAAI,YAAA,CAAa,IAAA,CAAK,OAAA,EAAS,SAAS,CAAC,CAAA;AACrD,MAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AACb,MAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,IAChB;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,IAAA,EAAM,KAAA,EAAO,SAAS,CAAA;AAErD,EAAA,OAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AACzB;AAEA,SAAS,eAAA,CAAgB,IAAA,EAAgB,KAAA,EAAiB,SAAA,EAA6B;AACrF,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,GAAA,GAAM,IAAI,UAAK,CAAA;AACrB,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,IAAI,EAAA,GAAK,CAAA;AAET,EAAA,OAAO,EAAA,GAAK,IAAA,CAAK,MAAA,IAAU,EAAA,GAAK,MAAM,MAAA,EAAQ;AAC5C,IAAA,MAAM,IAAI,EAAA,GAAK,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,EAAE,CAAA,GAAI,EAAA;AACxC,IAAA,MAAM,IAAI,EAAA,GAAK,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,EAAE,CAAA,GAAI,EAAA;AAG1C,IAAA,IAAI,CAAA,KAAM,EAAA,IAAM,CAAA,KAAM,EAAA,EAAI;AACxB,MAAA,EAAA,EAAA;AACA,MAAA,EAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,CAAA,KAAM,EAAA,IAAM,CAAA,KAAM,EAAA,EAAI;AACxB,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAAG,SAAS,IAAI,GAAA,GAAM,MAAA,CAAO,EAAA,EAAI,SAAS,CAAC,CAAA;AAC9D,MAAA,EAAA,EAAA;AACA,MAAA,EAAA,EAAA;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAA,KAAM,EAAA,IAAM,CAAA,KAAM,EAAA,EAAI;AACxB,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,EAAA,EAAI,SAAS,IAAI,GAAA,GAAM,MAAA,CAAO,CAAA,EAAG,SAAS,CAAC,CAAA;AAC9D,MAAA,EAAA,EAAA;AACA,MAAA,EAAA,EAAA;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAAG,SAAS,IAAI,GAAA,GAAM,MAAA,CAAO,CAAA,EAAG,SAAS,CAAC,CAAA;AAC7D,IAAA,EAAA,EAAA;AACA,IAAA,EAAA,EAAA;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAA,CAAa,MAAc,QAAA,EAA0B;AAC5D,EAAA,IAAI,IAAA,CAAK,MAAA,IAAU,QAAA,EAAU,OAAO,IAAA;AACpC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,QAAA,GAAW,CAAC,CAAA,GAAI,QAAA;AACvC;AAKO,SAAS,UAAU,QAAA,EAA8B;AACtD,EAAA,MAAM,QAAoB,EAAC;AAE3B,EAAA,KAAA,MAAW,GAAA,IAAO,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,EAAG;AACtC,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,IAAK,IAAI,UAAA,CAAW,KAAK,CAAA,IAAK,GAAA,CAAI,WAAW,KAAK,CAAA,IAAK,GAAA,CAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AACrG,MAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,KAAK,CAAA;AAAA,IAC7C,CAAA,MAAA,IAAW,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AAC9B,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,SAAS,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,EAAG,CAAA;AAAA,IACnD,CAAA,MAAA,IAAW,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AAC9B,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,EAAG,CAAA;AAAA,IACtD,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,GAAI,KAAK,CAAA;AAAA,IACnF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;;;ACjJO,IAAM,UAAA,GAAa;AAAA,EACxB,UAAA,EAAY,YAAA;AAAA,EACZ,QAAA,EAAU,UAAA;AAAA,EACV,SAAA,EAAW,WAAA;AAAA,EACX,OAAA,EAAS,SAAA;AAAA,EACT,IAAA,EAAM,MAAA;AAAA,EACN,MAAA,EAAQ;AACV;AAKO,IAAM,WAAA,GAAgC;AAAA,EAC3C,UAAA,CAAW,UAAA;AAAA,EACX,UAAA,CAAW,QAAA;AAAA,EACX,UAAA,CAAW,SAAA;AAAA,EACX,UAAA,CAAW,OAAA;AAAA,EACX,UAAA,CAAW;AACb;AAGO,SAAS,WAAW,KAAA,EAAuB;AAChD,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,OAAA,CAAQ,KAAuB,CAAA;AACvD,EAAA,OAAO,GAAA,IAAO,IAAI,GAAA,GAAM,CAAA;AAC1B;AAGO,SAAS,UAAA,GAAqB;AACnC,EAAA,OAAO,YAAY,MAAA,GAAS,CAAA;AAC9B;;;ACdO,SAAS,WAAA,CAAY,KAAA,EAAuB,KAAA,EAAe,OAAA,EAAyB;AACzF,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,GAAG,EAAE,CAAA;AAGzC,EAAA,MAAM,IAAA,GAAO,UAAA,iBAAW,IAAI,IAAA,EAAM,CAAA;AAElC,EAAA,QAAA,CAAS,IAAA;AAAA,IACP,IAAI,MAAA,CAAO,KAAA,CAAM,GAAA,EAAK,UAAA,GAAa,MAAM,IAAA,CAAK,MAAA,GAAS,EAAE,CAAA,GAAI,GAAG,GAAA,CAAI,OAAO,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI;AAAA,MAC5F,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAO,CAAA,cAAA,CAAA;AAAA,MACP,QAAA,EAAU,IAAA;AAAA,MACV,OAAO,UAAA,GAAa,CAAA;AAAA,MACpB,aAAa,KAAA,CAAM,IAAA;AAAA,MACnB,YAAY,KAAA,CAAM;AAAA,KACnB;AAAA,GACH;AAGA,EAAA,MAAM,eAAA,GAAkB,UAAA,CAAc,KAAA,CAAM,KAAK,CAAA;AACjD,EAAA,MAAM,SAAA,GAAY,YAAY,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CACtC,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACb,IAAA,IAAI,CAAA,GAAI,eAAA,EAAiB,OAAO,SAAA,CAAU,MAAM,CAAA;AAChD,IAAA,IAAI,CAAA,KAAM,eAAA,EAAiB,OAAO,SAAA,CAAU,QAAQ,CAAA;AACpD,IAAA,OAAO,UAAU,MAAM,CAAA;AAAA,EACzB,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AAEV,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AACnC,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,UAAA,GAAa,CAAA,GAAI,GAAA,CAAI,CAAA,EAAA,EAAK,KAAA,CAAM,UAAU,CAAA,CAAA,EAAI,KAAA,CAAM,UAAU,CAAA,CAAA,CAAG,CAAA,GAAI,EAAA;AAC5F,EAAA,QAAA,CAAS,KAAK,CAAA,SAAA,EAAY,UAAU,UAAU,SAAS,CAAA,EAAG,QAAQ,CAAA,CAAE,CAAA;AAGpE,EAAA,QAAA,CAAS,KAAK,EAAE,CAAA;AAChB,EAAA,MAAM,WAAW,UAAA,GAAa,EAAA;AAC9B,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAEhD,EAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,IAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,IAAK,CAAA;AACxC,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA,IAAK,GAAA;AACpC,MAAA,MAAM,GAAA,GAAM,QAAQ,CAAA,GAAI,IAAA,CAAK,IAAI,OAAA,GAAU,KAAA,EAAO,CAAC,CAAA,GAAI,CAAA;AACvD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,QAAQ,CAAA;AACxC,MAAA,MAAM,QAAQ,QAAA,GAAW,MAAA;AAEzB,MAAA,MAAM,OAAA,GAAU,gBAAe,GAC3B,QAAA,CAAS,SAAI,MAAA,CAAO,MAAM,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,GAAI,IAAI,QAAA,CAAI,MAAA,CAAO,KAAK,CAAC,CAAA,GAChE,QAAA,CAAI,OAAO,MAAM,CAAA,GAAI,QAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AAEzC,MAAA,MAAM,SAAS,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,GAAG,CAAC,CAAA,CAAA,CAAA;AACvC,MAAA,MAAMA,MAAAA,GAAQ,MAAA,CAAO,UAAA,CAAW,IAAI,GAAG,EAAE,CAAA;AACzC,MAAA,QAAA,CAAS,KAAK,CAAA,EAAA,EAAKA,MAAK,GAAG,OAAO,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AAAA,IAChD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,4BAA4B,CAAC,CAAA;AAAA,EACjD;AAGA,EAAA,QAAA,CAAS,KAAK,EAAE,CAAA;AAChB,EAAA,MAAM,WAAW,CAAA,cAAA,EAAiB,IAAA,CAAK,OAAO,KAAA,CAAM,UAAU,CAAC,CAAC,CAAA,CAAA;AAChE,EAAA,MAAM,WAAW,KAAA,CAAM,YAAA,KAAiB,IAAA,GACpC,CAAA,eAAA,EAAkB,SAAS,MAAA,CAAO,KAAA,CAAM,YAAY,CAAA,EAAG,WAAW,KAAA,CAAM,YAAY,CAAC,CAAC,CAAA,CAAA,GACtF,IAAI,WAAW,CAAA;AACnB,EAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAA,EAAK,QAAQ,CAAA,IAAA,EAAO,QAAQ,CAAA,CAAE,CAAA;AAG5C,EAAA,QAAA,CAAS,KAAK,EAAE,CAAA;AAChB,EAAA,MAAM,IAAA,GAAO,IAAI,wBAAwB,CAAA;AACzC,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,aAAA,CAAc,KAAA,CAAM,OAAO,CAAC,CAAA;AAChD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAA,GAAa,cAAc,IAAI,CAAA,GAAI,aAAA,CAAc,OAAO,CAAC,CAAA;AACvF,EAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAA,EAAK,IAAI,CAAA,EAAG,GAAA,CAAI,OAAO,SAAS,CAAC,CAAA,EAAG,OAAO,CAAA,CAAE,CAAA;AAE3D,EAAA,OAAO,QAAA,CAAS,KAAK,IAAI,CAAA;AAC3B;AAEA,SAAS,WAAW,IAAA,EAAoB;AACtC,EAAA,MAAM,CAAA,GAAI,OAAO,IAAA,CAAK,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACjD,EAAA,MAAM,CAAA,GAAI,OAAO,IAAA,CAAK,UAAA,EAAY,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,OAAO,IAAA,CAAK,UAAA,EAAY,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACnD,EAAA,OAAO,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC,CAAA,CAAA;AACvB;AAEA,SAAS,cAAc,EAAA,EAAoB;AACzC,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAA;AACtC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,EAAE,CAAA;AACtC,EAAA,MAAM,OAAO,SAAA,GAAY,EAAA;AACzB,EAAA,OAAO,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,OAAO,IAAI,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,QAAA,CAAA;AAC1E;AAEA,SAAS,WAAW,GAAA,EAAqB;AACvC,EAAA,OAAO,GAAA,CAAI,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AAClD;;;AC/FO,IAAM,0BAAN,MAAkD;AAAA,EAC/C,MAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EAElB,WAAA,CAAY,MAAA,GAAgC,OAAA,CAAQ,MAAA,EAAQ;AAC1D,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,OAAO,KAAA,EAA6B;AAClC,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,QAAA,GAAW,OAAO,IAAI,CAAA;AAC/C,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,IACjB;AAEA,IAAA,MAAM,QAAQ,gBAAA,EAAiB;AAC/B,IAAe,iBAAA;AACf,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAA,EAAO,KAAa,CAAA;AAE9C,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,QAAQ,KAAK,CAAA;AAAA,EACtD;AAAA,EAEA,OAAO,MAAA,EAA6B;AAClC,IAAA,IAAA,CAAK,OAAA,EAAQ;AAGb,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA;AACzC,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,OAAA,GAAU,IAAI,CAAA;AAAA,EAClC;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,IAAA,GAAO,OAAO,OAAO,CAAA;AAC9C,MAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,IACjB;AAAA,EACF;AAAA,EAEQ,cAAc,MAAA,EAA+B;AACnD,IAAA,MAAM,MAAA,GAAS,OAAO,MAAA,GAClB,QAAA,CAAS,UAAU,SAAS,CAAA,GAC5B,QAAA,CAAS,QAAA,EAAU,SAAS,CAAA;AAEhC,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,YAAY,GAAG,MAAA,CAAO,YAAA,IAAgB,EAAA,GAAK,SAAA,GAAY,SAAS,CAAA;AAExG,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,CAAA,EAAG,IAAA,CAAK,gBAAgB,CAAC,WAAM,MAAM,CAAA,CAAA;AAAA,MACrC,GAAG,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA,EAAI,OAAO,GAAG,CAAA,CAAA;AAAA,MAC5B,GAAG,GAAA,CAAI,QAAQ,CAAC,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,EAAA,EAAK,MAAA,CAAO,UAAU,CAAA,UAAA,EAAaC,cAAAA,CAAc,OAAO,OAAO,CAAC,EAAE,CAAC,CAAA;AAAA,KACzG;AAEA,IAAA,MAAM,aAAa,MAAA,CAAO,OAAA,CAAQ,OAAO,MAAM,CAAA,CAC5C,IAAI,CAAC,CAAC,KAAK,KAAK,CAAA,KAAM,KAAK,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA,CAC1C,KAAK,IAAI,CAAA;AAEZ,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,UAAU,CAAC,CAAA;AAAA,IAC5B;AAEA,IAAA,OAAO,IAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG,EAAE,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO,UAAA,EAAY,OAAO,IAAA,CAAK,GAAA,CAAI,kBAAiB,EAAG,EAAE,GAAG,CAAA;AAAA,EAChH;AACF;AAEA,SAASA,eAAc,EAAA,EAAoB;AACzC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAA;AACjC,EAAA,IAAI,IAAA,GAAO,EAAA,EAAI,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,CAAA;AAC7B,EAAA,OAAO,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,GAAO,EAAE,CAAC,CAAA,EAAA,EAAK,OAAO,EAAE,CAAA,CAAA,CAAA;AAC/C;;;ACrEO,IAAM,iBAAN,MAAyC;AAAA,EACtC,MAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EAEpB,WAAA,CAAY,MAAA,GAAgC,OAAA,CAAQ,MAAA,EAAQ;AAC1D,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,OAAO,KAAA,EAA6B;AAElC,IAAA,IAAI,KAAA,CAAM,KAAA,KAAU,IAAA,CAAK,SAAA,EAAW;AAClC,MAAA,IAAA,CAAK,YAAY,KAAA,CAAM,KAAA;AACvB,MAAA,MAAM,KAAK,SAAA,EAAU;AACrB,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,UAAA,GAAa,CAAA,GAChC,CAAA,EAAA,EAAK,MAAM,UAAU,CAAA,CAAA,EAAI,KAAA,CAAM,UAAU,CAAA,CAAA,CAAA,GACzC,EAAA;AAEJ,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,GAAG,GAAA,CAAI,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAM,KAAK,CAAC,GAAG,GAAA,CAAI,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAK,KAAA,CAAM,UAAU,SAAS,CAAC;AAAA;AAAA,OACxF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,MAAA,EAA6B;AAClC,IAAA,MAAM,KAAK,SAAA,EAAU;AACrB,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,GAClB,cAAA,KAAmB,QAAA,CAAS,QAAA,EAAU,SAAS,CAAA,GAAI,WACnD,cAAA,EAAe,GAAI,QAAA,CAAS,QAAA,EAAU,SAAS,CAAA,GAAI,QAAA;AAEvD,IAAA,MAAM,OAAA,GAAUA,cAAAA,CAAc,MAAA,CAAO,OAAO,CAAA;AAE5C,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACV,GAAG,GAAA,CAAI,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,gBAAgB,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA,OAAA,EACrC,MAAA,CAAO,YAAY,CAAA,QAAA,EAAW,MAAA,CAAO,UAAU,CAAA,CAAA,EAAI,GAAA,CAAI,OAAO,CAAC;AAAA;AAAA,KAC1E;AAAA,EACF;AAAA,EAEA,OAAA,GAAgB;AAAA,EAEhB;AACF;AAEA,SAAS,SAAA,GAAoB;AAC3B,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,OAAO,IAAI,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,CAAC,CAAA,CAAA,EAAI,KAAK,GAAA,CAAI,UAAA,EAAY,CAAC,CAAA,CAAA,CAAA;AACrF;AAEA,SAAS,KAAK,CAAA,EAAmB;AAC/B,EAAA,OAAO,IAAI,EAAA,GAAK,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,GAAK,OAAO,CAAC,CAAA;AACpC;AAEA,SAASA,eAAc,EAAA,EAAoB;AACzC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAA;AACjC,EAAA,IAAI,IAAA,GAAO,EAAA,EAAI,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,CAAA;AAC9B,EAAA,OAAO,CAAA,CAAA,EAAI,KAAK,KAAA,CAAM,IAAA,GAAO,EAAE,CAAC,CAAA,EAAA,EAAK,OAAO,EAAE,CAAA,EAAA,CAAA;AAChD;;;ACdO,SAAS,cAAA,CACd,IAAA,GAAqB,MAAA,EACrB,MAAA,GAAgC,QAAQ,MAAA,EAC9B;AACV,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,IAAA,GAAO,KAAA,EAAM,IAAK,CAAC,IAAA,KAAS,WAAA,GAAc,QAAA;AAAA,EAC5C;AAEA,EAAA,IAAI,SAAS,WAAA,EAAa;AACxB,IAAA,OAAO,IAAI,wBAAwB,MAAM,CAAA;AAAA,EAC3C;AAEA,EAAA,OAAO,IAAI,eAAe,MAAM,CAAA;AAClC;ACxCO,SAAS,qBAAA,CACd,KAAA,GAA2B,OAAA,CAAQ,KAAA,EAClB;AACjB,EAAA,MAAM,OAAA,GAAU,IAAI,YAAA,EAAa;AACjC,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,UAAA,GAAa,KAAA;AAEjB,EAAA,SAAS,OAAO,IAAA,EAAoB;AAClC,IAAA,MAAM,GAAA,GAAM,KAAK,QAAA,EAAS;AAG1B,IAAA,IAAI,QAAQ,GAAA,EAAQ;AAClB,MAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,QAAQ,GAAA,CAAI,aAAY;AAAG,MACzB,KAAK,GAAA;AACH,QAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AACnB,QAAA;AAAA,MACF,KAAK,GAAA;AACH,QAAA,OAAA,CAAQ,KAAK,SAAS,CAAA;AACtB,QAAA;AAAA;AACJ,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,GAAQ;AACN,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,IAAI,CAAC,KAAA,CAAM,KAAA,IAAS,OAAO,KAAA,CAAM,eAAe,UAAA,EAAY;AAE5D,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,UAAA,GAAa,KAAA,CAAM,KAAA;AACnB,MAAA,KAAA,CAAM,WAAW,IAAI,CAAA;AACrB,MAAA,KAAA,CAAM,MAAA,EAAO;AACb,MAAA,KAAA,CAAM,EAAA,CAAG,QAAQ,MAAM,CAAA;AAAA,IACzB,CAAA;AAAA,IAEA,OAAA,GAAU;AACR,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,OAAA,GAAU,KAAA;AACV,MAAA,KAAA,CAAM,cAAA,CAAe,QAAQ,MAAM,CAAA;AACnC,MAAA,IAAI,KAAA,CAAM,KAAA,IAAS,OAAO,KAAA,CAAM,eAAe,UAAA,EAAY;AACzD,QAAA,KAAA,CAAM,WAAW,UAAU,CAAA;AAAA,MAC7B;AACA,MAAA,KAAA,CAAM,KAAA,EAAM;AAAA,IACd,CAAA;AAAA,IAEA,EAAA,CAAG,OAAsB,OAAA,EAAqB;AAC5C,MAAA,OAAA,CAAQ,EAAA,CAAG,OAAO,OAAO,CAAA;AAAA,IAC3B;AAAA,GACF;AACF","file":"index.js","sourcesContent":["/**\n * Raw ANSI escape sequences for terminal control.\n *\n * No dependencies — pure string constants and functions.\n * Used by renderers and primitives for direct terminal manipulation.\n */\n\nconst ESC = \"\\x1b\";\nconst CSI = `${ESC}[`;\n\n// ── Cursor movement ──────────────────────────────────────────────\n\nexport const cursor = {\n /** Move cursor to row, col (1-indexed) */\n to: (row: number, col: number) => `${CSI}${row};${col}H`,\n /** Move cursor to top-left */\n home: `${CSI}H`,\n /** Move cursor up N lines */\n up: (n = 1) => `${CSI}${n}A`,\n /** Move cursor down N lines */\n down: (n = 1) => `${CSI}${n}B`,\n /** Move cursor to column N (1-indexed) */\n column: (n: number) => `${CSI}${n}G`,\n /** Hide cursor */\n hide: `${CSI}?25l`,\n /** Show cursor */\n show: `${CSI}?25h`,\n /** Save cursor position */\n save: `${ESC}7`,\n /** Restore cursor position */\n restore: `${ESC}8`,\n} as const;\n\n// ── Screen control ───────────────────────────────────────────────\n\nexport const screen = {\n /** Clear entire screen */\n clear: `${CSI}2J`,\n /** Clear from cursor to end of screen */\n clearDown: `${CSI}J`,\n /** Clear from cursor to end of line */\n clearLine: `${CSI}K`,\n /** Clear entire line */\n clearFullLine: `${CSI}2K`,\n /** Enter alternate screen buffer (preserves scrollback) */\n altEnter: `${CSI}?1049h`,\n /** Exit alternate screen buffer */\n altExit: `${CSI}?1049l`,\n} as const;\n\n// ── Style reset ──────────────────────────────────────────────────\n\nexport const style = {\n /** Reset all attributes */\n reset: `${CSI}0m`,\n} as const;\n\n// ── Box drawing characters ───────────────────────────────────────\n\nexport const borders = {\n single: {\n topLeft: \"\\u250C\", // ┌\n topRight: \"\\u2510\", // ┐\n bottomLeft: \"\\u2514\", // └\n bottomRight: \"\\u2518\", // ┘\n horizontal: \"\\u2500\", // ─\n vertical: \"\\u2502\", // │\n },\n double: {\n topLeft: \"\\u2554\", // ╔\n topRight: \"\\u2557\", // ╗\n bottomLeft: \"\\u255A\", // ╚\n bottomRight: \"\\u255D\", // ╝\n horizontal: \"\\u2550\", // ═\n vertical: \"\\u2551\", // ║\n },\n rounded: {\n topLeft: \"\\u256D\", // ╭\n topRight: \"\\u256E\", // ╮\n bottomLeft: \"\\u2570\", // ╰\n bottomRight: \"\\u256F\", // ╯\n horizontal: \"\\u2500\", // ─\n vertical: \"\\u2502\", // │\n },\n heavy: {\n topLeft: \"\\u250F\", // ┏\n topRight: \"\\u2513\", // ┓\n bottomLeft: \"\\u2517\", // ┗\n bottomRight: \"\\u251B\", // ┛\n horizontal: \"\\u2501\", // ━\n vertical: \"\\u2503\", // ┃\n },\n} as const;\n\nexport type BorderStyle = keyof typeof borders;\n\n/** Common type for any border character set */\nexport interface BorderChars {\n readonly topLeft: string;\n readonly topRight: string;\n readonly bottomLeft: string;\n readonly bottomRight: string;\n readonly horizontal: string;\n readonly vertical: string;\n}\n\n// ── Utility ──────────────────────────────────────────────────────\n\n/** Strip all ANSI escape sequences from a string */\nexport function stripAnsi(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/\\x1b\\[[0-9;]*[A-Za-z]|\\x1b[78]/g, \"\");\n}\n\n/** Get visible character width of a string (excluding ANSI codes) */\nexport function visibleLength(str: string): number {\n return stripAnsi(str).length;\n}\n\n/** Pad string to visible width, accounting for ANSI codes */\nexport function padEnd(str: string, width: number): string {\n const visible = visibleLength(str);\n if (visible >= width) return str;\n return str + \" \".repeat(width - visible);\n}\n\n/** Pad string to visible width from left */\nexport function padStart(str: string, width: number): string {\n const visible = visibleLength(str);\n if (visible >= width) return str;\n return \" \".repeat(width - visible) + str;\n}\n\n/** Center string within width, accounting for ANSI codes */\nexport function center(str: string, width: number): string {\n const visible = visibleLength(str);\n if (visible >= width) return str;\n const left = Math.floor((width - visible) / 2);\n const right = width - visible - left;\n return \" \".repeat(left) + str + \" \".repeat(right);\n}\n\n/** Truncate string to visible width, adding ellipsis */\nexport function truncate(str: string, maxWidth: number): string {\n if (maxWidth <= 0) return \"\";\n const stripped = stripAnsi(str);\n if (stripped.length <= maxWidth) return str;\n if (maxWidth <= 3) return stripped.slice(0, maxWidth);\n return stripped.slice(0, maxWidth - 1) + \"\\u2026\"; // …\n}\n","/**\n * VertaaUX brand theme for terminal output.\n *\n * Defines the color palette, severity colors, score gradients,\n * and semantic tokens used across all TUI primitives.\n */\n\nimport chalk from \"chalk\";\n\n// ── Brand palette ────────────────────────────────────────────────\n\nexport const brand = {\n lime: \"#78FFB4\",\n tealLight: \"#6BEEBD\",\n teal: \"#5EDDC6\",\n cyan: \"#51CCCE\",\n dark: \"#0A0F1A\",\n} as const;\n\n/** Gradient stops from lime → cyan (for banner, headers, accents) */\nexport const gradient = [brand.lime, brand.tealLight, brand.teal, brand.cyan] as const;\n\n// ── Severity palette ─────────────────────────────────────────────\n\nexport const severity = {\n critical: \"#FF6B6B\",\n error: \"#FF6B6B\",\n serious: \"#FFD93D\",\n warning: \"#FFD93D\",\n moderate: \"#6BCEFF\",\n minor: \"#6BCEFF\",\n info: \"#888888\",\n} as const;\n\nexport type SeverityLevel = keyof typeof severity;\n\n/** Severity display labels */\nexport const severityLabels: Record<string, string> = {\n critical: \"CRITICAL\",\n error: \"ERROR\",\n serious: \"SERIOUS\",\n warning: \"WARNING\",\n moderate: \"MODERATE\",\n minor: \"MINOR\",\n info: \"INFO\",\n};\n\n/** Severity sort order (highest first) */\nexport const severityOrder: Record<string, number> = {\n critical: 0,\n error: 1,\n serious: 2,\n warning: 3,\n minor: 4,\n moderate: 5,\n info: 6,\n};\n\n// ── Score colors ─────────────────────────────────────────────────\n\n/** Score thresholds and their corresponding colors */\nconst SCORE_THRESHOLDS = [\n { min: 90, color: \"#4ADE80\" }, // Green — excellent\n { min: 70, color: \"#FACC15\" }, // Yellow — needs work\n { min: 0, color: \"#F87171\" }, // Red — poor\n] as const;\n\n/**\n * Get hex color for a score value (0-100).\n */\nexport function scoreColor(score: number): string {\n for (const { min, color } of SCORE_THRESHOLDS) {\n if (score >= min) return color;\n }\n return SCORE_THRESHOLDS[SCORE_THRESHOLDS.length - 1].color;\n}\n\n// ── Semantic tokens ──────────────────────────────────────────────\n\nexport const tokens = {\n success: \"#4ADE80\",\n error: \"#F87171\",\n warning: \"#FACC15\",\n info: \"#6BCEFF\",\n muted: \"#6B7280\",\n accent: brand.lime,\n} as const;\n\n// ── Color application helpers ────────────────────────────────────\n\nlet _colorEnabled = true;\n\n/** Set whether color output is enabled (call early, based on detect.ts) */\nexport function setColorEnabled(enabled: boolean): void {\n _colorEnabled = enabled;\n}\n\n/** Check if color is currently enabled */\nexport function isColorEnabled(): boolean {\n return _colorEnabled;\n}\n\n/** Apply hex color to text (respects color-enabled state) */\nexport function colorize(text: string, hex: string): string {\n if (!_colorEnabled) return text;\n return chalk.hex(hex)(text);\n}\n\n/** Apply bold + hex color */\nexport function boldColor(text: string, hex: string): string {\n if (!_colorEnabled) return text;\n return chalk.hex(hex).bold(text);\n}\n\n/** Apply dim styling */\nexport function dim(text: string): string {\n if (!_colorEnabled) return text;\n return chalk.dim(text);\n}\n\n/** Apply bold styling */\nexport function bold(text: string): string {\n if (!_colorEnabled) return text;\n return chalk.bold(text);\n}\n\n/** Apply gradient across text characters */\nexport function applyGradient(text: string, colors: readonly string[] = gradient): string {\n if (!_colorEnabled) return text;\n const colorCount = colors.length;\n let result = \"\";\n let idx = 0;\n\n for (const char of text) {\n if (char !== \" \" && char !== \"\\n\") {\n result += chalk.hex(colors[idx % colorCount])(char);\n idx++;\n } else {\n result += char;\n }\n }\n\n return result;\n}\n","/**\n * Environment detection for terminal capabilities.\n *\n * Standalone implementations (no CLI dependency) that detect\n * TTY, CI, color support, and terminal dimensions.\n */\n\n/** Check if running in a CI environment. */\nexport function isCI(): boolean {\n return Boolean(\n process.env.CI ||\n process.env.CONTINUOUS_INTEGRATION ||\n process.env.BUILD_NUMBER ||\n process.env.GITHUB_ACTIONS ||\n process.env.GITLAB_CI ||\n process.env.CIRCLECI ||\n process.env.JENKINS_URL ||\n process.env.TRAVIS ||\n process.env.BUILDKITE\n );\n}\n\n/** Check if stderr is a TTY (used for UI output). */\nexport function isTTY(): boolean {\n return Boolean(process.stderr.isTTY);\n}\n\n/** Check if stdout is a TTY (used for data output detection). */\nexport function isStdoutTTY(): boolean {\n return Boolean(process.stdout.isTTY);\n}\n\n/** Check if stdin is a TTY (used for keyboard input detection). */\nexport function isStdinTTY(): boolean {\n return Boolean(process.stdin.isTTY);\n}\n\n/**\n * Determine if colors should be used.\n *\n * Priority: NO_COLOR > FORCE_COLOR > CI (off) > TTY detection\n */\nexport function shouldUseColor(): boolean {\n if (process.env.NO_COLOR !== undefined) return false;\n if (process.env.FORCE_COLOR !== undefined) return true;\n if (isCI()) return false;\n return isTTY();\n}\n\n/** Get terminal width from stderr (where UI renders). Falls back to 80. */\nexport function getTerminalWidth(): number {\n return process.stderr.columns || 80;\n}\n\n/** Get terminal height from stderr. Falls back to 24. */\nexport function getTerminalHeight(): number {\n return process.stderr.rows || 24;\n}\n\n/** Check if terminal supports Unicode (not dumb terminal). */\nexport function supportsUnicode(): boolean {\n if (process.env.TERM === \"dumb\") return false;\n if (process.platform === \"win32\") {\n return Boolean(process.env.WT_SESSION || process.env.TERM_PROGRAM);\n }\n return true;\n}\n","/**\n * Text styling primitives for terminal output.\n *\n * Semantic text functions for headings, labels, badges, and emphasis.\n * All respect the color-enabled state from theme.ts.\n */\n\nimport {\n colorize,\n boldColor,\n dim as dimColor,\n bold as boldStyle,\n isColorEnabled,\n severity as severityPalette,\n severityLabels,\n scoreColor,\n brand,\n tokens,\n} from \"../theme.js\";\n\n/** Render a section heading with brand accent */\nexport function heading(text: string): string {\n return boldColor(text, brand.lime);\n}\n\n/** Render a sub-heading */\nexport function subheading(text: string): string {\n return boldColor(text, brand.teal);\n}\n\n/** Render a label (key in key-value pairs) */\nexport function label(text: string): string {\n return boldStyle(text);\n}\n\n/** Render dimmed/muted text */\nexport function dim(text: string): string {\n return dimColor(text);\n}\n\n/** Render bold text */\nexport function bold(text: string): string {\n return boldStyle(text);\n}\n\n/** Render a clickable-looking link (underlined cyan) */\nexport function link(text: string): string {\n if (!isColorEnabled()) return text;\n return colorize(`\\x1b[4m${text}\\x1b[24m`, tokens.info);\n}\n\n/** Render severity badge: colored, bold, uppercase label */\nexport function severityBadge(level: string): string {\n const normalized = level.toLowerCase();\n const displayLabel = severityLabels[normalized] || level.toUpperCase();\n const hex = severityPalette[normalized as keyof typeof severityPalette] || tokens.muted;\n return boldColor(displayLabel, hex);\n}\n\n/** Render score badge: color-coded number */\nexport function scoreBadge(score: number): string {\n const hex = scoreColor(score);\n return boldColor(String(score), hex);\n}\n\n/** Render success text */\nexport function success(text: string): string {\n return colorize(text, tokens.success);\n}\n\n/** Render error text */\nexport function error(text: string): string {\n return colorize(text, tokens.error);\n}\n\n/** Render warning text */\nexport function warning(text: string): string {\n return colorize(text, tokens.warning);\n}\n\n/** Render info text */\nexport function info(text: string): string {\n return colorize(text, tokens.info);\n}\n\n/** Render a key: value pair with styled label */\nexport function keyValue(key: string, value: string): string {\n return `${boldStyle(key)}: ${value}`;\n}\n\n/** Render a horizontal rule that spans the terminal width */\nexport function hr(width: number, char = \"\\u2500\"): string {\n const line = char.repeat(width);\n return dimColor(line);\n}\n\n/** Render a status indicator dot */\nexport function statusDot(status: \"pass\" | \"fail\" | \"warn\" | \"skip\" | \"active\"): string {\n const map: Record<string, { symbol: string; hex: string }> = {\n pass: { symbol: \"\\u25CF\", hex: tokens.success }, // ●\n fail: { symbol: \"\\u25CF\", hex: tokens.error }, // ●\n warn: { symbol: \"\\u25CF\", hex: tokens.warning }, // ●\n skip: { symbol: \"\\u25CB\", hex: tokens.muted }, // ○\n active: { symbol: \"\\u25CF\", hex: brand.lime }, // ●\n };\n const { symbol, hex } = map[status] || map.skip;\n return colorize(symbol, hex);\n}\n","/**\n * Box primitive for bordered terminal output.\n *\n * Renders content inside a Unicode box with optional title, subtitle,\n * padding, and multiple border styles.\n */\n\nimport { borders, type BorderStyle, type BorderChars, padEnd, visibleLength } from \"../ansi.js\";\nimport { colorize, dim, brand, isColorEnabled } from \"../theme.js\";\nimport { getTerminalWidth } from \"../detect.js\";\n\nexport interface BoxOptions {\n /** Border style: single, double, rounded, heavy, none */\n border?: BorderStyle | \"none\";\n /** Inner padding (number of spaces on each side) */\n padding?: number;\n /** Vertical padding (blank lines above/below content) */\n paddingY?: number;\n /** Title displayed on the top border */\n title?: string;\n /** Subtitle displayed on the bottom border */\n subtitle?: string;\n /** Fixed width (defaults to terminal width - 2) */\n width?: number;\n /** Border color hex (defaults to brand.teal) */\n borderColor?: string;\n /** Title color hex (defaults to brand.lime) */\n titleColor?: string;\n}\n\n/**\n * Render content inside a bordered box.\n *\n * @param content - Text content (can be multi-line)\n * @param opts - Box options\n * @returns Rendered box string\n */\nexport function box(content: string, opts: BoxOptions = {}): string {\n const {\n border = \"rounded\",\n padding = 1,\n paddingY = 0,\n title,\n subtitle,\n width: fixedWidth,\n borderColor = brand.teal,\n titleColor = brand.lime,\n } = opts;\n\n if (border === \"none\") {\n return renderNoBorder(content, padding);\n }\n\n const chars = borders[border];\n const termWidth = fixedWidth || Math.min(getTerminalWidth(), 100);\n // Inner width = total - 2 borders - 2*padding\n const innerWidth = termWidth - 2 - padding * 2;\n\n const bc = (ch: string) => colorize(ch, borderColor);\n const lines = wrapLines(content, innerWidth);\n const pad = \" \".repeat(padding);\n const result: string[] = [];\n\n // Top border\n result.push(renderTopBorder(chars, termWidth, title, titleColor, borderColor));\n\n // Vertical padding\n for (let i = 0; i < paddingY; i++) {\n result.push(bc(chars.vertical) + \" \".repeat(termWidth - 2) + bc(chars.vertical));\n }\n\n // Content lines\n for (const line of lines) {\n const padded = pad + padEnd(line, innerWidth) + pad;\n result.push(bc(chars.vertical) + padded + bc(chars.vertical));\n }\n\n // Vertical padding\n for (let i = 0; i < paddingY; i++) {\n result.push(bc(chars.vertical) + \" \".repeat(termWidth - 2) + bc(chars.vertical));\n }\n\n // Bottom border\n result.push(renderBottomBorder(chars, termWidth, subtitle, borderColor));\n\n return result.join(\"\\n\");\n}\n\nfunction renderNoBorder(content: string, padding: number): string {\n const pad = \" \".repeat(padding);\n return content\n .split(\"\\n\")\n .map((line) => pad + line + pad)\n .join(\"\\n\");\n}\n\nfunction renderTopBorder(\n chars: BorderChars,\n width: number,\n title: string | undefined,\n titleColor: string,\n borderColor: string,\n): string {\n const bc = (ch: string) => colorize(ch, borderColor);\n const hLen = width - 2; // Total horizontal chars\n\n if (title) {\n const titleStr = isColorEnabled()\n ? ` ${colorize(title, titleColor)} `\n : ` ${title} `;\n const titleVisible = visibleLength(titleStr);\n const leftDash = 1; // One dash after corner\n const rightDash = Math.max(0, hLen - leftDash - titleVisible);\n return (\n bc(chars.topLeft) +\n bc(chars.horizontal.repeat(leftDash)) +\n titleStr +\n bc(chars.horizontal.repeat(rightDash)) +\n bc(chars.topRight)\n );\n }\n\n return bc(chars.topLeft) + bc(chars.horizontal.repeat(hLen)) + bc(chars.topRight);\n}\n\nfunction renderBottomBorder(\n chars: BorderChars,\n width: number,\n subtitle: string | undefined,\n borderColor: string,\n): string {\n const bc = (ch: string) => colorize(ch, borderColor);\n const hLen = width - 2;\n\n if (subtitle) {\n const subStr = ` ${dim(subtitle)} `;\n const subVisible = visibleLength(subStr);\n const rightDash = 1;\n const leftDash = Math.max(0, hLen - rightDash - subVisible);\n return (\n bc(chars.bottomLeft) +\n bc(chars.horizontal.repeat(leftDash)) +\n subStr +\n bc(chars.horizontal.repeat(rightDash)) +\n bc(chars.bottomRight)\n );\n }\n\n return bc(chars.bottomLeft) + bc(chars.horizontal.repeat(hLen)) + bc(chars.bottomRight);\n}\n\n/** Wrap text into lines that fit within maxWidth */\nfunction wrapLines(text: string, maxWidth: number): string[] {\n const result: string[] = [];\n\n for (const rawLine of text.split(\"\\n\")) {\n if (rawLine.length <= maxWidth) {\n result.push(rawLine);\n continue;\n }\n\n // Word-wrap long lines\n const words = rawLine.split(\" \");\n let current = \"\";\n\n for (const word of words) {\n if (current.length === 0) {\n current = word;\n } else if (current.length + 1 + word.length <= maxWidth) {\n current += \" \" + word;\n } else {\n result.push(current);\n current = word;\n }\n }\n\n if (current.length > 0) {\n result.push(current);\n }\n }\n\n return result;\n}\n","/**\n * Table primitive for terminal output.\n *\n * Renders aligned, color-coded tables with auto-width,\n * group headers, and terminal-width-aware truncation.\n * No external table library — pure string rendering.\n */\n\nimport { padEnd, padStart, visibleLength, truncate as truncateStr } from \"../ansi.js\";\nimport { dim, bold } from \"../theme.js\";\nimport { getTerminalWidth } from \"../detect.js\";\n\nexport interface Column {\n /** Data key to read from row objects */\n key: string;\n /** Column header label */\n label: string;\n /** Fixed width (characters). If omitted, auto-calculated. */\n width?: number;\n /** Text alignment */\n align?: \"left\" | \"right\" | \"center\";\n /** Custom color function for cell values */\n color?: (value: string) => string;\n}\n\nexport interface TableOptions {\n /** Maximum total width (defaults to terminal width) */\n maxWidth?: number;\n /** Show borders between rows */\n rowBorders?: boolean;\n /** Group header styling */\n groupLabel?: string;\n}\n\n/**\n * Render a data table from rows and column definitions.\n */\nexport function renderTable(\n rows: Record<string, string>[],\n columns: Column[],\n opts: TableOptions = {},\n): string {\n if (rows.length === 0) return \"\";\n\n const maxWidth = opts.maxWidth || getTerminalWidth();\n const colWidths = calculateColumnWidths(rows, columns, maxWidth);\n const lines: string[] = [];\n\n // Group header\n if (opts.groupLabel) {\n lines.push(dim(`── ${opts.groupLabel} ${\"─\".repeat(Math.max(0, maxWidth - opts.groupLabel.length - 4))}`));\n }\n\n // Header\n lines.push(renderHeaderRow(columns, colWidths));\n lines.push(renderSeparator(colWidths));\n\n // Data rows\n for (const row of rows) {\n lines.push(renderDataRow(row, columns, colWidths));\n if (opts.rowBorders) {\n lines.push(renderSeparator(colWidths));\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction calculateColumnWidths(\n rows: Record<string, string>[],\n columns: Column[],\n maxWidth: number,\n): number[] {\n const GAP = 2; // Space between columns\n const widths: number[] = [];\n let fixedTotal = 0;\n let autoCount = 0;\n\n // First pass: fixed widths and content-based maximums\n for (const col of columns) {\n if (col.width) {\n widths.push(col.width);\n fixedTotal += col.width;\n } else {\n // Calculate based on content\n const headerLen = col.label.length;\n const maxContent = rows.reduce((max, row) => {\n const val = row[col.key] || \"\";\n return Math.max(max, val.length);\n }, headerLen);\n widths.push(maxContent);\n autoCount++;\n }\n }\n\n // Total with gaps\n const gaps = (columns.length - 1) * GAP;\n const totalNeeded = widths.reduce((s, w) => s + w, 0) + gaps;\n\n // Shrink auto columns if over budget\n if (totalNeeded > maxWidth && autoCount > 0) {\n const available = maxWidth - fixedTotal - gaps;\n const autoWidths = widths.filter((_, i) => !columns[i].width);\n const autoTotal = autoWidths.reduce((s, w) => s + w, 0);\n\n for (let i = 0; i < widths.length; i++) {\n if (!columns[i].width) {\n widths[i] = Math.max(8, Math.floor((widths[i] / autoTotal) * available));\n }\n }\n }\n\n return widths;\n}\n\nfunction renderHeaderRow(columns: Column[], widths: number[]): string {\n const cells = columns.map((col, i) =>\n bold(alignCell(col.label, widths[i], col.align || \"left\"))\n );\n return cells.join(\" \");\n}\n\nfunction renderSeparator(widths: number[]): string {\n return dim(widths.map((w) => \"─\".repeat(w)).join(\"──\"));\n}\n\nfunction renderDataRow(\n row: Record<string, string>,\n columns: Column[],\n widths: number[],\n): string {\n const cells = columns.map((col, i) => {\n const raw = row[col.key] || \"\";\n const truncated = truncateStr(raw, widths[i]);\n const aligned = alignCell(truncated, widths[i], col.align || \"left\");\n return col.color ? col.color(aligned) : aligned;\n });\n return cells.join(\" \");\n}\n\nfunction alignCell(text: string, width: number, align: \"left\" | \"right\" | \"center\"): string {\n switch (align) {\n case \"right\":\n return padStart(text, width);\n case \"center\": {\n const visible = visibleLength(text);\n if (visible >= width) return text;\n const left = Math.floor((width - visible) / 2);\n const right = width - visible - left;\n return \" \".repeat(left) + text + \" \".repeat(right);\n }\n default:\n return padEnd(text, width);\n }\n}\n","/**\n * Spinner primitive for terminal progress indication.\n *\n * Renders an animated spinner with text to stderr.\n * Writes ONLY to stderr — never pollutes stdout.\n */\n\nimport { screen } from \"../ansi.js\";\nimport { colorize, dim, brand, isColorEnabled } from \"../theme.js\";\nimport { isTTY } from \"../detect.js\";\n\nconst BRAILLE_FRAMES = [\"⡿\", \"⣟\", \"⣯\", \"⣷\", \"⣾\", \"⣽\", \"⣻\", \"⢿\"];\nconst FRAME_INTERVAL = 80;\n\nexport interface SpinnerInstance {\n /** Start the spinner animation */\n start(): void;\n /** Stop the spinner and clear the line */\n stop(): void;\n /** Update the display text */\n setText(text: string): void;\n /** Show phase label alongside text */\n setPhase(phase: string): void;\n /** Stop with success indicator */\n succeed(text: string): void;\n /** Stop with failure indicator */\n fail(text: string): void;\n /** Stop with warning indicator */\n warn(text: string): void;\n /** Stop with info indicator */\n info(text: string): void;\n /** Whether the spinner is currently running */\n isRunning: boolean;\n}\n\n/**\n * Create a new spinner instance.\n *\n * @param text - Initial text to display\n * @param output - Writable stream (defaults to process.stderr)\n */\nexport function createSpinner(\n text: string,\n output: NodeJS.WritableStream = process.stderr,\n): SpinnerInstance {\n let frameIndex = 0;\n let currentText = text;\n let currentPhase = \"\";\n let timer: ReturnType<typeof setInterval> | null = null;\n let running = false;\n const enabled = isTTY();\n\n function render(): void {\n if (!enabled) return;\n\n const frame = isColorEnabled()\n ? colorize(BRAILLE_FRAMES[frameIndex], brand.lime)\n : BRAILLE_FRAMES[frameIndex];\n\n const phaseStr = currentPhase ? dim(` [${currentPhase}]`) : \"\";\n const line = `${frame} ${currentText}${phaseStr}`;\n\n output.write(screen.clearLine + \"\\r\" + line);\n frameIndex = (frameIndex + 1) % BRAILLE_FRAMES.length;\n }\n\n function clearLine(): void {\n if (!enabled) return;\n output.write(screen.clearLine + \"\\r\");\n }\n\n function writeFinalLine(symbol: string, text: string): void {\n clearLine();\n output.write(`${symbol} ${text}\\n`);\n }\n\n const instance: SpinnerInstance = {\n get isRunning() {\n return running;\n },\n\n start() {\n if (running) return;\n running = true;\n frameIndex = 0;\n if (enabled) {\n render();\n timer = setInterval(render, FRAME_INTERVAL);\n }\n },\n\n stop() {\n running = false;\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n clearLine();\n },\n\n setText(text: string) {\n currentText = text;\n },\n\n setPhase(phase: string) {\n currentPhase = phase;\n },\n\n succeed(text: string) {\n instance.stop();\n const sym = isColorEnabled() ? colorize(\"✓\", \"#4ADE80\") : \"✓\";\n writeFinalLine(sym, text);\n },\n\n fail(text: string) {\n instance.stop();\n const sym = isColorEnabled() ? colorize(\"✗\", \"#F87171\") : \"✗\";\n writeFinalLine(sym, text);\n },\n\n warn(text: string) {\n instance.stop();\n const sym = isColorEnabled() ? colorize(\"⚠\", \"#FACC15\") : \"⚠\";\n writeFinalLine(sym, text);\n },\n\n info(text: string) {\n instance.stop();\n const sym = isColorEnabled() ? colorize(\"ℹ\", \"#6BCEFF\") : \"ℹ\";\n writeFinalLine(sym, text);\n },\n };\n\n return instance;\n}\n","/**\n * Progress bar primitive for terminal output.\n *\n * Single bars and multi-bar stacks with percentage, ETA,\n * and brand-colored fill. Writes to stderr only.\n */\n\nimport { cursor, screen, padEnd } from \"../ansi.js\";\nimport { colorize, dim, brand, isColorEnabled } from \"../theme.js\";\nimport { isTTY, getTerminalWidth } from \"../detect.js\";\n\nconst FILL_CHAR = \"█\";\nconst EMPTY_CHAR = \"░\";\n\nexport interface ProgressBarOptions {\n /** Total number of steps */\n total: number;\n /** Label displayed before the bar */\n label?: string;\n /** Bar width in characters (defaults to auto) */\n width?: number;\n /** Color hex for the filled portion */\n color?: string;\n /** Writable stream (defaults to stderr) */\n output?: NodeJS.WritableStream;\n}\n\nexport interface ProgressBar {\n /** Update progress to a new value */\n update(current: number): void;\n /** Complete the bar at 100% */\n complete(message?: string): void;\n /** Fail the bar with error indicator */\n fail(message?: string): void;\n /** Get the current rendered bar string (for embedding in frames) */\n render(current: number, barWidth?: number): string;\n}\n\n/**\n * Create a progress bar.\n */\nexport function createProgressBar(opts: ProgressBarOptions): ProgressBar {\n const {\n total,\n label = \"\",\n width: fixedWidth,\n color = brand.lime,\n output = process.stderr,\n } = opts;\n\n const enabled = isTTY();\n let startTime = Date.now();\n\n function renderBar(current: number, barWidth?: number): string {\n const pct = total > 0 ? Math.min(current / total, 1) : 0;\n const pctStr = `${Math.round(pct * 100)}%`;\n\n const termWidth = barWidth || fixedWidth || Math.max(20, getTerminalWidth() - (label.length + 12));\n const filled = Math.round(pct * termWidth);\n const empty = termWidth - filled;\n\n const bar = isColorEnabled()\n ? colorize(FILL_CHAR.repeat(filled), color) + dim(EMPTY_CHAR.repeat(empty))\n : FILL_CHAR.repeat(filled) + EMPTY_CHAR.repeat(empty);\n\n const eta = formatETA(current, total, startTime);\n const labelStr = label ? padEnd(label, 16) : \"\";\n\n return `${labelStr}${bar} ${pctStr}${eta ? ` ${dim(eta)}` : \"\"}`;\n }\n\n return {\n update(current: number) {\n if (!enabled) return;\n const line = renderBar(current);\n output.write(screen.clearLine + \"\\r\" + line);\n },\n\n complete(message?: string) {\n if (!enabled) return;\n output.write(screen.clearLine + \"\\r\");\n if (message) {\n const sym = isColorEnabled() ? colorize(\"✓\", \"#4ADE80\") : \"✓\";\n output.write(`${sym} ${message}\\n`);\n }\n },\n\n fail(message?: string) {\n if (!enabled) return;\n output.write(screen.clearLine + \"\\r\");\n if (message) {\n const sym = isColorEnabled() ? colorize(\"✗\", \"#F87171\") : \"✗\";\n output.write(`${sym} ${message}\\n`);\n }\n },\n\n render(current: number, barWidth?: number): string {\n return renderBar(current, barWidth);\n },\n };\n}\n\nfunction formatETA(current: number, total: number, startTime: number): string {\n if (current <= 0 || total <= 0) return \"\";\n const elapsed = (Date.now() - startTime) / 1000;\n const rate = current / elapsed;\n const remaining = (total - current) / rate;\n if (remaining <= 0 || !isFinite(remaining)) return \"\";\n if (remaining < 60) return `~${Math.ceil(remaining)}s`;\n return `~${Math.ceil(remaining / 60)}m`;\n}\n\n// ── Multi-progress ───────────────────────────────────────────────\n\nexport interface MultiProgressOptions {\n /** Writable stream (defaults to stderr) */\n output?: NodeJS.WritableStream;\n}\n\nexport interface MultiProgress {\n /** Add a named progress bar */\n add(id: string, opts: Omit<ProgressBarOptions, \"output\">): void;\n /** Update a specific bar */\n update(id: string, current: number): void;\n /** Mark a bar as complete */\n complete(id: string): void;\n /** Render all bars (returns multi-line string for dashboard embedding) */\n renderAll(): string;\n /** Write all bars to output (in-place update) */\n draw(): void;\n /** Clear all bar lines from terminal */\n clear(): void;\n}\n\n/**\n * Create a multi-progress bar stack.\n */\nexport function createMultiProgress(opts: MultiProgressOptions = {}): MultiProgress {\n const output = opts.output || process.stderr;\n const bars: Map<string, { bar: ProgressBar; current: number; total: number; completed: boolean }> = new Map();\n let drawnLines = 0;\n\n return {\n add(id: string, barOpts: Omit<ProgressBarOptions, \"output\">) {\n const bar = createProgressBar({ ...barOpts, output });\n bars.set(id, { bar, current: 0, total: barOpts.total, completed: false });\n },\n\n update(id: string, current: number) {\n const entry = bars.get(id);\n if (entry) {\n entry.current = current;\n }\n },\n\n complete(id: string) {\n const entry = bars.get(id);\n if (entry) {\n entry.current = entry.total;\n entry.completed = true;\n }\n },\n\n renderAll(): string {\n const lines: string[] = [];\n for (const [, entry] of bars) {\n lines.push(entry.bar.render(entry.current));\n }\n return lines.join(\"\\n\");\n },\n\n draw() {\n if (!isTTY()) return;\n // Move cursor up to overwrite previous render\n if (drawnLines > 0) {\n output.write(cursor.up(drawnLines));\n }\n const lines: string[] = [];\n for (const [, entry] of bars) {\n lines.push(screen.clearLine + entry.bar.render(entry.current));\n }\n output.write(lines.join(\"\\n\") + \"\\n\");\n drawnLines = lines.length;\n },\n\n clear() {\n if (!isTTY() || drawnLines === 0) return;\n output.write(cursor.up(drawnLines));\n for (let i = 0; i < drawnLines; i++) {\n output.write(screen.clearLine + \"\\n\");\n }\n output.write(cursor.up(drawnLines));\n drawnLines = 0;\n },\n };\n}\n","/**\n * List and tree primitive for terminal output.\n *\n * Renders ordered/unordered lists and tree structures\n * with Unicode connectors and configurable indentation.\n */\n\nimport { dim } from \"../theme.js\";\n\nexport interface ListOptions {\n /** Ordered (numbered) or unordered (bullet) */\n ordered?: boolean;\n /** Indentation level (for nesting) */\n indent?: number;\n /** Bullet character for unordered lists */\n bullet?: string;\n}\n\n/**\n * Render a flat list of items.\n */\nexport function renderList(items: string[], opts: ListOptions = {}): string {\n const { ordered = false, indent = 0, bullet = \"•\" } = opts;\n const pad = \" \".repeat(indent);\n\n return items\n .map((item, i) => {\n const prefix = ordered ? `${pad}${i + 1}.` : `${pad}${bullet}`;\n return `${prefix} ${item}`;\n })\n .join(\"\\n\");\n}\n\n// ── Tree rendering ───────────────────────────────────────────────\n\nexport interface TreeNode {\n label: string;\n children?: TreeNode[];\n /** Whether this node's children should be collapsed (hidden) */\n collapsed?: boolean;\n}\n\n/**\n * Render a tree structure with Unicode box-drawing connectors.\n *\n * ```\n * Root\n * ├── Child 1\n * │ ├── Grandchild A\n * │ └── Grandchild B\n * └── Child 2\n * ```\n */\nexport function renderTree(node: TreeNode, prefix = \"\", isLast = true, isRoot = true): string {\n const lines: string[] = [];\n\n if (isRoot) {\n lines.push(node.label);\n } else {\n const connector = isLast ? \"└── \" : \"├── \";\n lines.push(prefix + dim(connector) + node.label);\n }\n\n if (node.children && !node.collapsed) {\n const childPrefix = isRoot ? \"\" : prefix + (isLast ? \" \" : dim(\"│ \"));\n\n node.children.forEach((child, index) => {\n const childIsLast = index === node.children!.length - 1;\n lines.push(renderTree(child, childPrefix, childIsLast, false));\n });\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Render a grouped list with section headers.\n *\n * ```\n * ── Critical (3) ──────────\n * • Issue 1\n * • Issue 2\n * • Issue 3\n *\n * ── Warning (5) ───────────\n * • Issue 4\n * ...\n * ```\n */\nexport function renderGroupedList(\n groups: Map<string, string[]> | Record<string, string[]>,\n opts: ListOptions = {},\n): string {\n const entries = groups instanceof Map ? [...groups.entries()] : Object.entries(groups);\n const sections: string[] = [];\n\n for (const [groupLabel, items] of entries) {\n if (items.length === 0) continue;\n\n const header = dim(`── ${groupLabel} (${items.length}) ${\"─\".repeat(20)}`);\n const list = renderList(items, { ...opts, indent: (opts.indent || 0) + 1 });\n sections.push(`${header}\\n${list}`);\n }\n\n return sections.join(\"\\n\\n\");\n}\n","/**\n * Diff rendering primitive for terminal output.\n *\n * Displays unified or side-by-side diffs with\n * colored additions/deletions.\n */\n\nimport { colorize, dim, tokens } from \"../theme.js\";\nimport { padEnd } from \"../ansi.js\";\nimport { getTerminalWidth } from \"../detect.js\";\n\nexport type DiffMode = \"unified\" | \"side-by-side\";\n\nexport interface DiffLine {\n type: \"add\" | \"remove\" | \"context\" | \"header\";\n content: string;\n lineNum?: number;\n}\n\nexport interface DiffOptions {\n mode?: DiffMode;\n context?: number;\n maxWidth?: number;\n}\n\n/**\n * Render a unified diff from structured diff lines.\n */\nexport function renderDiff(lines: DiffLine[], opts: DiffOptions = {}): string {\n const { mode = \"unified\" } = opts;\n\n if (mode === \"side-by-side\") {\n return renderSideBySide(lines, opts);\n }\n\n return renderUnified(lines);\n}\n\nfunction renderUnified(lines: DiffLine[]): string {\n return lines\n .map((line) => {\n switch (line.type) {\n case \"header\":\n return dim(line.content);\n case \"add\":\n return colorize(`+ ${line.content}`, tokens.success);\n case \"remove\":\n return colorize(`- ${line.content}`, tokens.error);\n case \"context\":\n return dim(` ${line.content}`);\n }\n })\n .join(\"\\n\");\n}\n\nfunction renderSideBySide(lines: DiffLine[], opts: DiffOptions): string {\n const maxWidth = opts.maxWidth || getTerminalWidth();\n const halfWidth = Math.floor((maxWidth - 3) / 2); // 3 for separator \" │ \"\n\n const left: string[] = [];\n const right: string[] = [];\n\n for (const line of lines) {\n if (line.type === \"header\") {\n left.push(dim(line.content));\n right.push(\"\");\n } else if (line.type === \"remove\") {\n left.push(colorize(truncateLine(line.content, halfWidth), tokens.error));\n right.push(\"\");\n } else if (line.type === \"add\") {\n left.push(\"\");\n right.push(colorize(truncateLine(line.content, halfWidth), tokens.success));\n } else {\n const ctx = dim(truncateLine(line.content, halfWidth));\n left.push(ctx);\n right.push(ctx);\n }\n }\n\n // Pair up: merge empty entries\n const merged = mergeSideBySide(left, right, halfWidth);\n\n return merged.join(\"\\n\");\n}\n\nfunction mergeSideBySide(left: string[], right: string[], halfWidth: number): string[] {\n const result: string[] = [];\n const sep = dim(\" │ \");\n let li = 0;\n let ri = 0;\n\n while (li < left.length || ri < right.length) {\n const l = li < left.length ? left[li] : \"\";\n const r = ri < right.length ? right[ri] : \"\";\n\n // Skip if both empty\n if (l === \"\" && r === \"\") {\n li++;\n ri++;\n continue;\n }\n\n // If left has content and right is empty, pair with next right that has content\n if (l !== \"\" && r === \"\") {\n result.push(padEnd(l, halfWidth) + sep + padEnd(\"\", halfWidth));\n li++;\n ri++;\n continue;\n }\n\n if (l === \"\" && r !== \"\") {\n result.push(padEnd(\"\", halfWidth) + sep + padEnd(r, halfWidth));\n li++;\n ri++;\n continue;\n }\n\n result.push(padEnd(l, halfWidth) + sep + padEnd(r, halfWidth));\n li++;\n ri++;\n }\n\n return result;\n}\n\nfunction truncateLine(text: string, maxWidth: number): string {\n if (text.length <= maxWidth) return text;\n return text.slice(0, maxWidth - 1) + \"…\";\n}\n\n/**\n * Parse a unified diff string into structured DiffLine array.\n */\nexport function parseDiff(diffText: string): DiffLine[] {\n const lines: DiffLine[] = [];\n\n for (const raw of diffText.split(\"\\n\")) {\n if (raw.startsWith(\"@@\") || raw.startsWith(\"---\") || raw.startsWith(\"+++\") || raw.startsWith(\"diff \")) {\n lines.push({ type: \"header\", content: raw });\n } else if (raw.startsWith(\"+\")) {\n lines.push({ type: \"add\", content: raw.slice(1) });\n } else if (raw.startsWith(\"-\")) {\n lines.push({ type: \"remove\", content: raw.slice(1) });\n } else {\n lines.push({ type: \"context\", content: raw.startsWith(\" \") ? raw.slice(1) : raw });\n }\n }\n\n return lines;\n}\n","/**\n * Dashboard state types and phase definitions.\n */\n\nexport const AuditPhase = {\n Connecting: \"Connecting\",\n Crawling: \"Crawling\",\n Analyzing: \"Analyzing\",\n Scoring: \"Scoring\",\n Done: \"Done\",\n Failed: \"Failed\",\n} as const;\n\nexport type AuditPhaseName = (typeof AuditPhase)[keyof typeof AuditPhase];\n\n/** Ordered phases for progress indication */\nexport const PHASE_ORDER: AuditPhaseName[] = [\n AuditPhase.Connecting,\n AuditPhase.Crawling,\n AuditPhase.Analyzing,\n AuditPhase.Scoring,\n AuditPhase.Done,\n];\n\n/** Get the index of a phase in the ordered sequence */\nexport function phaseIndex(phase: string): number {\n const idx = PHASE_ORDER.indexOf(phase as AuditPhaseName);\n return idx >= 0 ? idx : 0;\n}\n\n/** Get the total number of actionable phases (excluding Done) */\nexport function phaseTotal(): number {\n return PHASE_ORDER.length - 1; // Exclude \"Done\"\n}\n","/**\n * Dashboard frame renderer — pure function.\n *\n * Takes dashboard state + terminal dimensions, returns a string\n * representing the full screen content. No side effects.\n */\n\nimport type { DashboardState } from \"../layout/renderer.js\";\nimport { padEnd, visibleLength } from \"../ansi.js\";\nimport { box } from \"../primitives/box.js\";\nimport { colorize, dim, bold, brand, isColorEnabled, scoreColor } from \"../theme.js\";\nimport { statusDot } from \"../primitives/text.js\";\nimport { PHASE_ORDER, phaseIndex as getPhaseIndex } from \"./state.js\";\n\n/**\n * Render a complete dashboard frame.\n *\n * Pure function — no I/O, no side effects, fully testable.\n */\nexport function renderFrame(state: DashboardState, width: number, _height: number): string {\n const sections: string[] = [];\n const innerWidth = Math.min(width - 4, 96); // Constrain for readability\n\n // ── Header box ─────────────────────────────────────────────\n const time = formatTime(new Date());\n\n sections.push(\n box(padEnd(state.url, innerWidth - state.mode.length - 14) + `${dim(\"mode:\")} ${state.mode}`, {\n border: \"rounded\",\n title: `VertaaUX Audit`,\n subtitle: time,\n width: innerWidth + 4,\n borderColor: brand.teal,\n titleColor: brand.lime,\n })\n );\n\n // ── Phase indicator ────────────────────────────────────────\n const currentPhaseIdx = getPhaseIndex(state.phase);\n const phaseDots = PHASE_ORDER.slice(0, -1) // Exclude Done from dots\n .map((_, i) => {\n if (i < currentPhaseIdx) return statusDot(\"pass\");\n if (i === currentPhaseIdx) return statusDot(\"active\");\n return statusDot(\"skip\");\n })\n .join(\"\");\n\n const phaseLabel = bold(state.phase);\n const phasePct = state.phaseTotal > 0 ? dim(` (${state.phaseIndex}/${state.phaseTotal})`) : \"\";\n sections.push(` Phase: ${phaseLabel} ${phaseDots}${phasePct}`);\n\n // ── Progress bars ──────────────────────────────────────────\n sections.push(\"\");\n const barWidth = innerWidth - 22; // Label(16) + pct(6)\n const analyzerNames = Object.keys(state.progress);\n\n if (analyzerNames.length > 0) {\n for (const name of analyzerNames) {\n const current = state.progress[name] || 0;\n const total = state.totals[name] || 100;\n const pct = total > 0 ? Math.min(current / total, 1) : 0;\n const filled = Math.round(pct * barWidth);\n const empty = barWidth - filled;\n\n const fillStr = isColorEnabled()\n ? colorize(\"█\".repeat(filled), brand.lime) + dim(\"░\".repeat(empty))\n : \"█\".repeat(filled) + \"░\".repeat(empty);\n\n const pctStr = `${Math.round(pct * 100)}%`;\n const label = padEnd(capitalize(name), 16);\n sections.push(` ${label}${fillStr} ${pctStr}`);\n }\n } else {\n sections.push(dim(\" Waiting for analyzers...\"));\n }\n\n // ── Stats ──────────────────────────────────────────────────\n sections.push(\"\");\n const issueStr = `Issues found: ${bold(String(state.issueCount))}`;\n const scoreStr = state.scorePreview !== null\n ? `Score preview: ${colorize(String(state.scorePreview), scoreColor(state.scorePreview))}`\n : dim(\"Score: --\");\n sections.push(` ${issueStr} ${scoreStr}`);\n\n // ── Footer ─────────────────────────────────────────────────\n sections.push(\"\");\n const keys = dim(\"[q] abort [v] verbose\");\n const elapsed = dim(formatElapsed(state.elapsed));\n const footerPad = Math.max(0, innerWidth - visibleLength(keys) - visibleLength(elapsed));\n sections.push(` ${keys}${\" \".repeat(footerPad)}${elapsed}`);\n\n return sections.join(\"\\n\");\n}\n\nfunction formatTime(date: Date): string {\n const h = String(date.getHours()).padStart(2, \"0\");\n const m = String(date.getMinutes()).padStart(2, \"0\");\n const s = String(date.getSeconds()).padStart(2, \"0\");\n return `${h}:${m}:${s}`;\n}\n\nfunction formatElapsed(ms: number): string {\n const totalSecs = Math.floor(ms / 1000);\n const mins = Math.floor(totalSecs / 60);\n const secs = totalSecs % 60;\n return `${String(mins).padStart(2, \"0\")}:${String(secs).padStart(2, \"0\")} elapsed`;\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","/**\n * Alternate screen renderer for interactive TTY.\n *\n * Takes over the terminal with a full-screen dashboard.\n * Uses the alternate screen buffer to preserve scrollback.\n * On dispose, restores the original terminal.\n */\n\nimport { cursor, screen } from \"../ansi.js\";\nimport { renderFrame } from \"../dashboard/frame.js\";\nimport type { Renderer, DashboardState, SummaryResult } from \"./renderer.js\";\nimport { getTerminalWidth, getTerminalHeight } from \"../detect.js\";\nimport { bold, dim, colorize } from \"../theme.js\";\nimport { box } from \"../primitives/box.js\";\n\nexport class AlternateScreenRenderer implements Renderer {\n private output: NodeJS.WritableStream;\n private entered = false;\n\n constructor(output: NodeJS.WritableStream = process.stderr) {\n this.output = output;\n }\n\n update(state: DashboardState): void {\n if (!this.entered) {\n this.output.write(screen.altEnter + cursor.hide);\n this.entered = true;\n }\n\n const width = getTerminalWidth();\n const height = getTerminalHeight();\n const frame = renderFrame(state, width, height);\n\n this.output.write(cursor.home + screen.clear + frame);\n }\n\n finish(result: SummaryResult): void {\n this.dispose();\n\n // Write summary to stderr after exiting alternate screen\n const summary = this.renderSummary(result);\n this.output.write(summary + \"\\n\");\n }\n\n dispose(): void {\n if (this.entered) {\n this.output.write(cursor.show + screen.altExit);\n this.entered = false;\n }\n }\n\n private renderSummary(result: SummaryResult): string {\n const status = result.passed\n ? colorize(\"PASSED\", \"#4ADE80\")\n : colorize(\"FAILED\", \"#F87171\");\n\n const scoreStr = colorize(String(result.overallScore), result.overallScore >= 70 ? \"#4ADE80\" : \"#F87171\");\n\n const lines = [\n `${bold(\"Audit Complete\")} — ${status}`,\n `${dim(\"URL:\")} ${result.url}`,\n `${dim(\"Score:\")} ${scoreStr} ${dim(`| ${result.issueCount} issues | ${formatElapsed(result.elapsed)}`)}`,\n ];\n\n const categories = Object.entries(result.scores)\n .map(([cat, score]) => ` ${cat}: ${score}`)\n .join(\"\\n\");\n\n if (categories) {\n lines.push(dim(categories));\n }\n\n return box(lines.join(\"\\n\"), { border: \"rounded\", title: \"VertaaUX\", width: Math.min(getTerminalWidth(), 80) });\n }\n}\n\nfunction formatElapsed(ms: number): string {\n const secs = Math.round(ms / 1000);\n if (secs < 60) return `${secs}s`;\n return `${Math.floor(secs / 60)}m ${secs % 60}s`;\n}\n","/**\n * Inline renderer for CI/piped environments.\n *\n * Writes timestamped, non-interactive log lines to stderr.\n * No cursor movement, no ANSI escape sequences beyond color.\n * Compatible with log aggregation tools.\n */\n\nimport type { Renderer, DashboardState, SummaryResult } from \"./renderer.js\";\nimport { dim, colorize, bold, isColorEnabled } from \"../theme.js\";\n\nexport class InlineRenderer implements Renderer {\n private output: NodeJS.WritableStream;\n private lastPhase = \"\";\n\n constructor(output: NodeJS.WritableStream = process.stderr) {\n this.output = output;\n }\n\n update(state: DashboardState): void {\n // Only write when phase changes to avoid log spam\n if (state.phase !== this.lastPhase) {\n this.lastPhase = state.phase;\n const ts = timestamp();\n const phasePct = state.phaseTotal > 0\n ? ` (${state.phaseIndex}/${state.phaseTotal})`\n : \"\";\n\n this.output.write(\n `${dim(ts)} ${bold(state.phase)}${dim(phasePct)} ${dim(`| ${state.issueCount} issues`)}\\n`\n );\n }\n }\n\n finish(result: SummaryResult): void {\n const ts = timestamp();\n const status = result.passed\n ? isColorEnabled() ? colorize(\"PASSED\", \"#4ADE80\") : \"PASSED\"\n : isColorEnabled() ? colorize(\"FAILED\", \"#F87171\") : \"FAILED\";\n\n const elapsed = formatElapsed(result.elapsed);\n\n this.output.write(\n `${dim(ts)} ${bold(\"Audit Complete\")} ${status} ` +\n `score=${result.overallScore} issues=${result.issueCount} ${dim(elapsed)}\\n`\n );\n }\n\n dispose(): void {\n // No cleanup needed for inline renderer\n }\n}\n\nfunction timestamp(): string {\n const now = new Date();\n return `[${pad2(now.getHours())}:${pad2(now.getMinutes())}:${pad2(now.getSeconds())}]`;\n}\n\nfunction pad2(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n\nfunction formatElapsed(ms: number): string {\n const secs = Math.round(ms / 1000);\n if (secs < 60) return `(${secs}s)`;\n return `(${Math.floor(secs / 60)}m ${secs % 60}s)`;\n}\n","/**\n * Renderer interface and factory for terminal output.\n *\n * Two rendering modes:\n * - AlternateScreenRenderer: Full terminal takeover (TTY)\n * - InlineRenderer: Timestamped log lines (CI/piped)\n */\n\nimport { isCI, isTTY } from \"../detect.js\";\nimport { AlternateScreenRenderer } from \"./alternate.js\";\nimport { InlineRenderer } from \"./inline.js\";\n\nexport interface DashboardState {\n phase: string;\n phaseIndex: number;\n phaseTotal: number;\n url: string;\n mode: string;\n progress: Record<string, number>;\n totals: Record<string, number>;\n issueCount: number;\n scorePreview: number | null;\n verbose: boolean;\n elapsed: number;\n}\n\nexport interface SummaryResult {\n url: string;\n mode: string;\n overallScore: number;\n scores: Record<string, number>;\n issueCount: number;\n passed: boolean;\n elapsed: number;\n}\n\nexport interface Renderer {\n /** Update the display with new state */\n update(state: DashboardState): void;\n /** Show final summary and clean up */\n finish(result: SummaryResult): void;\n /** Clean up resources (keyboard, alternate screen, etc.) */\n dispose(): void;\n}\n\nexport type RendererMode = \"alternate\" | \"inline\" | \"auto\";\n\n/**\n * Create a renderer based on mode or auto-detection.\n *\n * auto: alternate in interactive TTY, inline in CI/piped\n */\nexport function createRenderer(\n mode: RendererMode = \"auto\",\n output: NodeJS.WritableStream = process.stderr,\n): Renderer {\n if (mode === \"auto\") {\n mode = isTTY() && !isCI() ? \"alternate\" : \"inline\";\n }\n\n if (mode === \"alternate\") {\n return new AlternateScreenRenderer(output);\n }\n\n return new InlineRenderer(output);\n}\n","/**\n * Keyboard handler for dashboard interaction.\n *\n * Listens for keypresses in raw mode and emits semantic events.\n * Only works in TTY — gracefully no-ops in non-TTY environments.\n */\n\nimport { EventEmitter } from \"node:events\";\n\nexport type KeyboardEvent = \"quit\" | \"verbose\";\n\nexport interface KeyboardHandler {\n /** Start listening for keypresses */\n start(): void;\n /** Stop listening and restore terminal state */\n dispose(): void;\n /** Register an event handler */\n on(event: KeyboardEvent, handler: () => void): void;\n}\n\n/**\n * Create a keyboard handler.\n *\n * @param stdin - Input stream (defaults to process.stdin, injectable for testing)\n */\nexport function createKeyboardHandler(\n stdin: NodeJS.ReadStream = process.stdin,\n): KeyboardHandler {\n const emitter = new EventEmitter();\n let started = false;\n let wasRawMode = false;\n\n function onData(data: Buffer): void {\n const key = data.toString();\n\n // Ctrl+C\n if (key === \"\\x03\") {\n emitter.emit(\"quit\");\n return;\n }\n\n switch (key.toLowerCase()) {\n case \"q\":\n emitter.emit(\"quit\");\n break;\n case \"v\":\n emitter.emit(\"verbose\");\n break;\n }\n }\n\n return {\n start() {\n if (started) return;\n if (!stdin.isTTY || typeof stdin.setRawMode !== \"function\") return;\n\n started = true;\n wasRawMode = stdin.isRaw;\n stdin.setRawMode(true);\n stdin.resume();\n stdin.on(\"data\", onData);\n },\n\n dispose() {\n if (!started) return;\n started = false;\n stdin.removeListener(\"data\", onData);\n if (stdin.isTTY && typeof stdin.setRawMode === \"function\") {\n stdin.setRawMode(wasRawMode);\n }\n stdin.pause();\n },\n\n on(event: KeyboardEvent, handler: () => void) {\n emitter.on(event, handler);\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@vertaaux/tui",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Terminal UI primitives for VertaaUX — boxes, tables, spinners, progress bars, and dashboard rendering",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"default": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"require": {
|
|
16
|
+
"types": "./dist/index.d.cts",
|
|
17
|
+
"default": "./dist/index.cjs"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"README.md"
|
|
24
|
+
],
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsup",
|
|
27
|
+
"dev": "tsup --watch",
|
|
28
|
+
"typecheck": "tsc --noEmit",
|
|
29
|
+
"test": "vitest run",
|
|
30
|
+
"test:watch": "vitest",
|
|
31
|
+
"clean": "rm -rf dist"
|
|
32
|
+
},
|
|
33
|
+
"keywords": [
|
|
34
|
+
"vertaaux",
|
|
35
|
+
"tui",
|
|
36
|
+
"terminal",
|
|
37
|
+
"cli",
|
|
38
|
+
"ansi",
|
|
39
|
+
"spinner",
|
|
40
|
+
"progress",
|
|
41
|
+
"table",
|
|
42
|
+
"dashboard"
|
|
43
|
+
],
|
|
44
|
+
"author": "VertaaUX",
|
|
45
|
+
"license": "MIT",
|
|
46
|
+
"repository": {
|
|
47
|
+
"type": "git",
|
|
48
|
+
"url": "https://github.com/vertaaux/vertaa.git",
|
|
49
|
+
"directory": "packages/tui"
|
|
50
|
+
},
|
|
51
|
+
"homepage": "https://vertaaux.ai/developer-docs",
|
|
52
|
+
"engines": {
|
|
53
|
+
"node": ">=18"
|
|
54
|
+
},
|
|
55
|
+
"peerDependencies": {
|
|
56
|
+
"chalk": "^5.0.0"
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"chalk": "^5.4.1",
|
|
60
|
+
"tsup": "^8.0.0",
|
|
61
|
+
"typescript": "^5.0.0",
|
|
62
|
+
"vitest": "^3.0.0"
|
|
63
|
+
}
|
|
64
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vertaaux/cli",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Run automated UX audits, accessibility checks, and performance analysis from the terminal or CI pipelines. Supports policy gating, SARIF output, and multi-page crawling. See https://github.com/PetriLahdelma/vertaa/tree/main/cli#readme for full docs.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -35,6 +35,9 @@
|
|
|
35
35
|
"engines": {
|
|
36
36
|
"node": ">=18"
|
|
37
37
|
},
|
|
38
|
+
"bundleDependencies": [
|
|
39
|
+
"@vertaaux/tui"
|
|
40
|
+
],
|
|
38
41
|
"scripts": {
|
|
39
42
|
"build": "tsc",
|
|
40
43
|
"dev": "tsc -w",
|