shape-morph 0.1.0
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/LICENSE +21 -0
- package/README.md +142 -0
- package/dist/index.cjs +1758 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +219 -0
- package/dist/index.d.ts +219 -0
- package/dist/index.js +1735 -0
- package/dist/index.js.map +1 -0
- package/dist/react/index.cjs +1808 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.cts +216 -0
- package/dist/react/index.d.ts +216 -0
- package/dist/react/index.js +1804 -0
- package/dist/react/index.js.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/utils.ts","../src/core/cubic.ts","../src/core/polygon.ts","../src/core/material-shapes.ts","../src/core/morph.ts","../src/output/clip-path.ts","../src/output/svg-path.ts"],"names":["square"],"mappings":";AAEO,IAAM,eAAA,GAAkB;AACxB,IAAM,YAAA,GAAe;AACrB,IAAM,sBAAA,GAAyB;AAC/B,IAAM,UAAU,IAAA,CAAK;AACrB,IAAM,KAAA,GAAQ,IAAI,IAAA,CAAK;AAOvB,SAAS,EAAA,CAAG,GAAW,CAAA,EAAkB;AAC9C,EAAA,OAAO,EAAE,GAAG,CAAA,EAAE;AAChB;AAEO,SAAS,WAAW,CAAA,EAAkB;AAC3C,EAAA,OAAO,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AACxC;AAMO,SAAS,YAAY,CAAA,EAAiB;AAC3C,EAAA,MAAM,CAAA,GAAI,WAAW,CAAC,CAAA;AACtB,EAAA,OAAO,EAAE,GAAG,CAAA,CAAE,CAAA,GAAI,GAAG,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAE;AAClC;AAEO,SAAS,KAAA,CAAM,GAAU,CAAA,EAAkB;AAChD,EAAA,OAAO,EAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AAC7B;AAEO,SAAS,WAAA,CAAY,GAAU,CAAA,EAAmB;AACvD,EAAA,OAAO,EAAE,CAAA,GAAI,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,GAAI,CAAA;AACjC;AAEO,SAAS,WAAW,CAAA,EAAiB;AAC1C,EAAA,OAAO,EAAE,CAAA,EAAG,CAAC,EAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAE;AAC3B;AAEO,SAAS,KAAA,CAAM,GAAU,CAAA,EAAiB;AAC/C,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,EAAE;AACtC;AAEO,SAAS,KAAA,CAAM,GAAU,CAAA,EAAiB;AAC/C,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,EAAE;AACtC;AAEO,SAAS,KAAA,CAAM,GAAU,CAAA,EAAkB;AAChD,EAAA,OAAO,EAAE,GAAG,CAAA,CAAE,CAAA,GAAI,GAAG,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAE;AAClC;AAEO,SAAS,KAAA,CAAM,GAAU,CAAA,EAAkB;AAChD,EAAA,OAAO,EAAE,GAAG,CAAA,CAAE,CAAA,GAAI,GAAG,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAE;AAClC;AAEO,SAAS,QAAA,CAAS,GAAW,CAAA,EAAmB;AACrD,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,CAAA,GAAI,IAAI,CAAC,CAAA;AAChC;AAEO,SAAS,eAAA,CAAgB,GAAW,CAAA,EAAmB;AAC5D,EAAA,OAAO,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AACrB;AAEO,SAAS,eAAA,CAAgB,GAAW,CAAA,EAAkB;AAC3D,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,CAAC,CAAA;AACvB,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,EAAE;AAC9B;AAEO,SAAS,qBAAqB,YAAA,EAA6B;AAChE,EAAA,OAAO,EAAE,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,YAAY,GAAG,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,YAAY,CAAA,EAAE;AAChE;AAEO,SAAS,iBAAA,CACd,QACA,YAAA,EACA,MAAA,GAAgB,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE,EACtB;AACP,EAAA,MAAM,CAAA,GAAI,qBAAqB,YAAY,CAAA;AAC3C,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,MAAA,GAAS,MAAA,CAAO,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,MAAA,GAAS,MAAA,CAAO,CAAA,EAAE;AAClE;AAEO,SAAS,WAAA,CACd,KAAA,EACA,IAAA,EACA,QAAA,EACQ;AACR,EAAA,OAAA,CAAQ,CAAA,GAAI,QAAA,IAAY,KAAA,GAAQ,QAAA,GAAW,IAAA;AAC7C;AAEO,SAAS,gBAAA,CACd,KAAA,EACA,IAAA,EACA,QAAA,EACO;AACP,EAAA,OAAO;AAAA,IACL,GAAG,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,GAAG,QAAQ,CAAA;AAAA,IACxC,GAAG,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,GAAG,QAAQ;AAAA,GAC1C;AACF;AAEO,SAAS,cAAA,CAAe,KAAa,GAAA,EAAqB;AAC/D,EAAA,OAAA,CAAS,GAAA,GAAM,MAAO,GAAA,IAAO,GAAA;AAC/B;AAkBO,SAAS,MAAA,CAAO,QAAA,EAAiB,OAAA,EAAgB,IAAA,EAAsB;AAC5E,EAAA,OAAO,WAAA,CAAY,MAAM,OAAA,EAAS,QAAQ,GAAG,KAAA,CAAM,IAAA,EAAM,OAAO,CAAC,CAAA;AACnE;AAEO,SAAS,OAAO,CAAA,EAAmB;AACxC,EAAA,OAAO,CAAA,GAAI,CAAA;AACb;;;ACjHA,SAAS,aAAA,CAAc,CAAA,EAAW,CAAA,EAAW,CAAA,EAAqB;AAChE,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,eAAA;AAC9B,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,IAAI,MAAM,CAAA,EAAG;AACX,MAAA,MAAM,CAAA,GAAK,CAAA,GAAI,CAAA,IAAM,EAAA,GAAK,CAAA,CAAA;AAC1B,MAAA,IAAI,CAAA,IAAK,CAAA,IAAK,CAAA,IAAK,CAAA,EAAG;AACpB,QAAA,OAAO,CAAC,CAAC,CAAA;AAAA,MACX;AAAA,IACF;AACA,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAM,YAAA,GAAe,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA;AACrC,EAAA,IAAI,eAAe,CAAA,EAAG;AACpB,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA;AACpC,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,CAAC,CAAA,GAAI,KAAA,KAAU,CAAA,GAAI,CAAA,CAAA,EAAA,CAAK,CAAC,CAAA,GAAI,KAAA,KAAU,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG;AAChE,IAAA,IAAI,CAAA,IAAK,CAAA,IAAK,CAAA,IAAK,CAAA,EAAG;AACpB,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAEO,IAAM,KAAA,GAAN,MAAM,MAAA,CAAM;AAAA,EACR,MAAA;AAAA,EAaT,WAAA,CACE,GACA,CAAA,EACA,CAAA,EACA,GACA,CAAA,EACA,CAAA,EACA,GACA,CAAA,EACA;AACA,IAAA,IAAI,aAAa,YAAA,EAAc;AAC7B,MAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,MAAA,GAAS,IAAI,YAAA,CAAa;AAAA,QAC7B,CAAA;AAAA,QACA,CAAA;AAAA,QACA,CAAA;AAAA,QACA,CAAA;AAAA,QACA,CAAA;AAAA,QACA,CAAA;AAAA,QACA,CAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,IAAI,QAAA,GAAmB;AACrB,IAAA,OAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EACtB;AAAA,EACA,IAAI,QAAA,GAAmB;AACrB,IAAA,OAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EACtB;AAAA,EACA,IAAI,SAAA,GAAoB;AACtB,IAAA,OAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EACtB;AAAA,EACA,IAAI,SAAA,GAAoB;AACtB,IAAA,OAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EACtB;AAAA,EACA,IAAI,SAAA,GAAoB;AACtB,IAAA,OAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EACtB;AAAA,EACA,IAAI,SAAA,GAAoB;AACtB,IAAA,OAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EACtB;AAAA,EACA,IAAI,QAAA,GAAmB;AACrB,IAAA,OAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EACtB;AAAA,EACA,IAAI,QAAA,GAAmB;AACrB,IAAA,OAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EACtB;AAAA,EAEA,aAAa,CAAA,EAAkB;AAC7B,IAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,IAAA,OAAO,EAAA;AAAA,MACL,IAAA,CAAK,YAAY,CAAA,GAAI,CAAA,GAAI,KACvB,IAAA,CAAK,SAAA,IAAa,IAAI,CAAA,GAAI,CAAA,GAAI,KAC9B,IAAA,CAAK,SAAA,IAAa,IAAI,CAAA,GAAI,CAAA,GAAI,KAC9B,IAAA,CAAK,QAAA,IAAY,IAAI,CAAA,GAAI,CAAA,CAAA;AAAA,MAC3B,IAAA,CAAK,YAAY,CAAA,GAAI,CAAA,GAAI,KACvB,IAAA,CAAK,SAAA,IAAa,IAAI,CAAA,GAAI,CAAA,GAAI,KAC9B,IAAA,CAAK,SAAA,IAAa,IAAI,CAAA,GAAI,CAAA,GAAI,KAC9B,IAAA,CAAK,QAAA,IAAY,IAAI,CAAA,GAAI,CAAA;AAAA,KAC7B;AAAA,EACF;AAAA,EAEA,UAAA,GAAsB;AACpB,IAAA,OACE,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,QAAA,GAAW,KAAK,QAAQ,CAAA,GAAI,eAAA,IAC1C,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,QAAQ,CAAA,GAAI,eAAA;AAAA,EAE9C;AAAA,EAEA,SAAS,IAAA,EAAsB;AAC7B,IAAA,MAAM,UAAA,GAAa,EAAA,CAAG,IAAA,CAAK,QAAA,EAAU,KAAK,QAAQ,CAAA;AAClD,IAAA,MAAM,UAAA,GAAa,EAAA,CAAG,IAAA,CAAK,QAAA,EAAU,KAAK,QAAQ,CAAA;AAClD,IAAA,MAAM,UAAA,GAAa,EAAA,CAAG,IAAA,CAAK,QAAA,EAAU,KAAK,QAAQ,CAAA;AAClD,IAAA,OAAO,MAAA,CAAS,UAAA,EAAY,UAAA,EAAY,UAAU,CAAA;AAAA,EACpD;AAAA,EAEA,MAAM,CAAA,EAA2B;AAC/B,IAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,YAAA,CAAa,CAAC,CAAA;AAC/B,IAAA,OAAO;AAAA,MACL,IAAI,MAAA;AAAA,QACF,IAAA,CAAK,QAAA;AAAA,QACL,IAAA,CAAK,QAAA;AAAA,QACL,IAAA,CAAK,QAAA,GAAW,CAAA,GAAI,IAAA,CAAK,SAAA,GAAY,CAAA;AAAA,QACrC,IAAA,CAAK,QAAA,GAAW,CAAA,GAAI,IAAA,CAAK,SAAA,GAAY,CAAA;AAAA,QACrC,IAAA,CAAK,QAAA,IAAY,CAAA,GAAI,CAAA,CAAA,GACnB,IAAA,CAAK,SAAA,IAAa,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA,GAC1B,IAAA,CAAK,SAAA,IAAa,CAAA,GAAI,CAAA,CAAA;AAAA,QACxB,IAAA,CAAK,QAAA,IAAY,CAAA,GAAI,CAAA,CAAA,GACnB,IAAA,CAAK,SAAA,IAAa,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA,GAC1B,IAAA,CAAK,SAAA,IAAa,CAAA,GAAI,CAAA,CAAA;AAAA,QACxB,GAAA,CAAI,CAAA;AAAA,QACJ,GAAA,CAAI;AAAA,OACN;AAAA,MACA,IAAI,MAAA;AAAA,QACF,GAAA,CAAI,CAAA;AAAA,QACJ,GAAA,CAAI,CAAA;AAAA,QACJ,IAAA,CAAK,SAAA,IAAa,CAAA,GAAI,CAAA,CAAA,GACpB,IAAA,CAAK,SAAA,IAAa,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA,GAC1B,IAAA,CAAK,QAAA,IAAY,CAAA,GAAI,CAAA,CAAA;AAAA,QACvB,IAAA,CAAK,SAAA,IAAa,CAAA,GAAI,CAAA,CAAA,GACpB,IAAA,CAAK,SAAA,IAAa,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA,GAC1B,IAAA,CAAK,QAAA,IAAY,CAAA,GAAI,CAAA,CAAA;AAAA,QACvB,IAAA,CAAK,SAAA,GAAY,CAAA,GAAI,IAAA,CAAK,QAAA,GAAW,CAAA;AAAA,QACrC,IAAA,CAAK,SAAA,GAAY,CAAA,GAAI,IAAA,CAAK,QAAA,GAAW,CAAA;AAAA,QACrC,IAAA,CAAK,QAAA;AAAA,QACL,IAAA,CAAK;AAAA;AACP,KACF;AAAA,EACF;AAAA,EAEA,OAAA,GAAiB;AACf,IAAA,OAAO,IAAI,MAAA;AAAA,MACT,IAAA,CAAK,QAAA;AAAA,MACL,IAAA,CAAK,QAAA;AAAA,MACL,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK,QAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA,EAEA,YAAY,CAAA,EAA2C;AACrD,IAAA,MAAM,SAAA,GAAY,IAAI,YAAA,CAAa,CAAC,CAAA;AACpC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,KAAK,CAAA,EAAG;AAC7B,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,CAAC,GAAG,IAAA,CAAK,MAAA,CAAO,CAAA,GAAI,CAAC,CAAC,CAAA;AAC9C,MAAA,SAAA,CAAU,CAAC,IAAI,CAAA,CAAE,CAAA;AACjB,MAAA,SAAA,CAAU,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA,CAAE,CAAA;AAAA,IACvB;AACA,IAAA,OAAO,IAAI,OAAM,SAAS,CAAA;AAAA,EAC5B;AAAA,EAEA,eAAA,CAAgB,cAAc,IAAA,EAAwC;AACpE,IAAA,IAAI,IAAA,CAAK,YAAW,EAAG;AACrB,MAAA,OAAO,CAAC,KAAK,QAAA,EAAU,IAAA,CAAK,UAAU,IAAA,CAAK,QAAA,EAAU,KAAK,QAAQ,CAAA;AAAA,IACpE;AAEA,IAAA,IAAI,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,QAAA,EAAU,KAAK,QAAQ,CAAA;AAChD,IAAA,IAAI,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,QAAA,EAAU,KAAK,QAAQ,CAAA;AAChD,IAAA,IAAI,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,QAAA,EAAU,KAAK,QAAQ,CAAA;AAChD,IAAA,IAAI,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,QAAA,EAAU,KAAK,QAAQ,CAAA;AAEhD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAO;AAAA,QACL,IAAA,CAAK,IAAI,IAAA,EAAM,IAAA,CAAK,IAAI,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,QACvD,IAAA,CAAK,IAAI,IAAA,EAAM,IAAA,CAAK,IAAI,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,QACvD,IAAA,CAAK,IAAI,IAAA,EAAM,IAAA,CAAK,IAAI,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,QACvD,IAAA,CAAK,IAAI,IAAA,EAAM,IAAA,CAAK,IAAI,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,SAAS,CAAC;AAAA,OACzD;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,CAAC,KAAK,QAAA,GAAW,CAAA,GAAI,KAAK,SAAA,GAAY,CAAA,GAAI,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,QAAA;AAAA,MAChE,IAAI,IAAA,CAAK,QAAA,GAAW,IAAI,IAAA,CAAK,SAAA,GAAY,IAAI,IAAA,CAAK,SAAA;AAAA,MAClD,CAAC,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK;AAAA,KACxB;AAEA,IAAA,KAAA,MAAW,CAAA,IAAK,aAAA,CAAc,GAAG,OAAO,CAAA,EAAG;AACzC,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,YAAA,CAAa,CAAC,CAAA,CAAE,CAAA;AAC/B,MAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AACvB,MAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AAAA,IACzB;AAEA,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,CAAC,KAAK,QAAA,GAAW,CAAA,GAAI,KAAK,SAAA,GAAY,CAAA,GAAI,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,QAAA;AAAA,MAChE,IAAI,IAAA,CAAK,QAAA,GAAW,IAAI,IAAA,CAAK,SAAA,GAAY,IAAI,IAAA,CAAK,SAAA;AAAA,MAClD,CAAC,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK;AAAA,KACxB;AAEA,IAAA,KAAA,MAAW,CAAA,IAAK,aAAA,CAAc,GAAG,OAAO,CAAA,EAAG;AACzC,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,YAAA,CAAa,CAAC,CAAA,CAAE,CAAA;AAC/B,MAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AACvB,MAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AAAA,IACzB;AAEA,IAAA,OAAO,CAAC,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AAAA,EAChC;AAAA,EAEA,OAAO,YAAA,CAAa,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAmB;AACzE,IAAA,OAAO,IAAI,MAAA;AAAA,MACT,EAAA;AAAA,MACA,EAAA;AAAA,MACA,WAAA,CAAY,EAAA,EAAI,EAAA,EAAI,CAAA,GAAI,CAAC,CAAA;AAAA,MACzB,WAAA,CAAY,EAAA,EAAI,EAAA,EAAI,CAAA,GAAI,CAAC,CAAA;AAAA,MACzB,WAAA,CAAY,EAAA,EAAI,EAAA,EAAI,CAAA,GAAI,CAAC,CAAA;AAAA,MACzB,WAAA,CAAY,EAAA,EAAI,EAAA,EAAI,CAAA,GAAI,CAAC,CAAA;AAAA,MACzB,EAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,OAAO,WAAA,CACL,OAAA,EACA,SACA,EAAA,EACA,EAAA,EACA,IACA,EAAA,EACO;AACP,IAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,EAAA,GAAK,OAAA,EAAS,KAAK,OAAO,CAAA;AACtD,IAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,EAAA,GAAK,OAAA,EAAS,KAAK,OAAO,CAAA;AACtD,IAAA,MAAM,SAAA,GAAY,WAAW,GAAG,CAAA;AAChC,IAAA,MAAM,SAAA,GAAY,WAAW,GAAG,CAAA;AAChC,IAAA,MAAM,SAAA,GACJ,UAAU,CAAA,IAAK,EAAA,GAAK,WAAW,SAAA,CAAU,CAAA,IAAK,KAAK,OAAA,CAAA,IAAY,CAAA;AACjE,IAAA,MAAM,OAAO,GAAA,CAAI,CAAA,GAAI,IAAI,CAAA,GAAI,GAAA,CAAI,IAAI,GAAA,CAAI,CAAA;AACzC,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,OAAO,MAAA,CAAM,YAAA,CAAa,EAAA,EAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AAAA,IAC1C;AACA,IAAA,MAAM,CAAA,GACF,QAAA,CAAS,EAAA,GAAK,OAAA,EAAS,EAAA,GAAK,OAAO,CAAA,GACnC,CAAA,IACC,IAAA,CAAK,IAAA,CAAK,CAAA,IAAK,CAAA,GAAI,KAAK,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,IAAA,GAAO,IAAI,MACrD,CAAA,IAAK,CAAA,GAAI,IAAA,CAAA,CAAA,IACX,SAAA,GAAY,CAAA,GAAI,EAAA,CAAA;AACnB,IAAA,OAAO,IAAI,MAAA;AAAA,MACT,EAAA;AAAA,MACA,EAAA;AAAA,MACA,EAAA,GAAK,UAAU,CAAA,GAAI,CAAA;AAAA,MACnB,EAAA,GAAK,UAAU,CAAA,GAAI,CAAA;AAAA,MACnB,EAAA,GAAK,UAAU,CAAA,GAAI,CAAA;AAAA,MACnB,EAAA,GAAK,UAAU,CAAA,GAAI,CAAA;AAAA,MACnB,EAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,OAAO,KAAA,CAAM,EAAA,EAAY,EAAA,EAAmB;AAC1C,IAAA,OAAO,IAAI,OAAM,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AAAA,EACjD;AACF;AA8GO,SAAS,kBAAA,CACd,GACA,SAAA,EACS;AACT,EAAA,MAAM,SAAA,GAAY,EAAE,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,CAAY,SAAS,CAAC,CAAA;AAC9D,EAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ;AACrB,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAU;AAAA,EAC3C;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,QAAQ,SAAA,EAAW,MAAA,EAAQ,EAAE,MAAA,EAAO;AAC/D;;;AC5XO,IAAM,SAAA,GAA4B,EAAE,MAAA,EAAQ,CAAA,EAAG,WAAW,CAAA;AAE1D,SAAS,cAAA,CAAe,MAAA,EAAgB,SAAA,GAAY,CAAA,EAAmB;AAC5E,EAAA,OAAO,EAAE,QAAQ,SAAA,EAAU;AAC7B;AAEO,IAAM,cAAA,GAAN,MAAM,eAAA,CAAe;AAAA,EACjB,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EAET,WAAA,CAAY,UAAqB,MAAA,EAAe;AAC9C,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAA,GAAS,cAAA,CAAe,QAAA,EAAU,MAAM,CAAA;AAAA,EAC/C;AAAA,EAEA,IAAI,OAAA,GAAkB;AACpB,IAAA,OAAO,KAAK,MAAA,CAAO,CAAA;AAAA,EACrB;AAAA,EACA,IAAI,OAAA,GAAkB;AACpB,IAAA,OAAO,KAAK,MAAA,CAAO,CAAA;AAAA,EACrB;AAAA,EAEA,YAAY,CAAA,EAAoD;AAC9D,IAAA,MAAM,YAAY,CAAA,CAAE,IAAA,CAAK,OAAO,CAAA,EAAG,IAAA,CAAK,OAAO,CAAC,CAAA;AAChD,IAAA,MAAM,WAAA,GAAc,KAAK,QAAA,CAAS,GAAA;AAAA,MAAI,CAAC,IAAA,KACrC,kBAAA,CAAmB,IAAA,EAAM,CAAC;AAAA,KAC5B;AACA,IAAA,OAAO,IAAI,eAAA,CAAe,WAAA,EAAa,SAAS,CAAA;AAAA,EAClD;AAAA,EAEA,UAAA,GAA6B;AAC3B,IAAA,MAAM,MAAA,GAAS,KAAK,eAAA,EAAgB;AACpC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,CAAC,CAAA,GAAI,OAAO,CAAC,CAAA;AAClC,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,CAAC,CAAA,GAAI,OAAO,CAAC,CAAA;AACnC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,MAAM,CAAA;AACnC,IAAA,MAAM,OAAA,GAAA,CAAW,IAAA,GAAO,KAAA,IAAS,CAAA,GAAI,OAAO,CAAC,CAAA;AAC7C,IAAA,MAAM,OAAA,GAAA,CAAW,IAAA,GAAO,MAAA,IAAU,CAAA,GAAI,OAAO,CAAC,CAAA;AAC9C,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,MAAY,CAAC,GAAG,CAAA,KAC1B,EAAA,CAAA,CAAI,IAAI,OAAA,IAAW,IAAA,EAAA,CAAO,CAAA,GAAI,OAAA,IAAW,IAAI;AAAA,KAC/C;AAAA,EACF;AAAA,EAEA,eAAA,CAAgB,cAAc,IAAA,EAAwC;AACpE,IAAA,IAAI,OAAO,MAAA,CAAO,SAAA;AAClB,IAAA,IAAI,OAAO,MAAA,CAAO,SAAA;AAClB,IAAA,IAAI,IAAA,GAAO,CAAC,MAAA,CAAO,SAAA;AACnB,IAAA,IAAI,IAAA,GAAO,CAAC,MAAA,CAAO,SAAA;AACnB,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,EAAQ;AAC/B,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,eAAA,CAAgB,WAAW,CAAA;AAC3C,MAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,CAAC,CAAC,CAAA;AAC1B,MAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,CAAC,CAAC,CAAA;AAC1B,MAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,CAAC,CAAC,CAAA;AAC1B,MAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,IAC5B;AACA,IAAA,OAAO,CAAC,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AAAA,EAChC;AAAA,EAEA,kBAAA,GAAuD;AACrD,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,EAAQ;AAC/B,MAAA,MAAM,UAAA,GAAa,eAAA;AAAA,QACjB,KAAA,CAAM,WAAW,IAAA,CAAK,OAAA;AAAA,QACtB,KAAA,CAAM,WAAW,IAAA,CAAK;AAAA,OACxB;AACA,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,YAAA,CAAa,GAAG,CAAA;AAClC,MAAA,MAAM,OAAA,GAAU,eAAA;AAAA,QACd,GAAA,CAAI,IAAI,IAAA,CAAK,OAAA;AAAA,QACb,GAAA,CAAI,IAAI,IAAA,CAAK;AAAA,OACf;AACA,MAAA,SAAA,GAAY,KAAK,GAAA,CAAI,SAAA,EAAW,KAAK,GAAA,CAAI,UAAA,EAAY,OAAO,CAAC,CAAA;AAAA,IAC/D;AACA,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA;AAC7B,IAAA,OAAO;AAAA,MACL,KAAK,OAAA,GAAU,CAAA;AAAA,MACf,KAAK,OAAA,GAAU,CAAA;AAAA,MACf,KAAK,OAAA,GAAU,CAAA;AAAA,MACf,KAAK,OAAA,GAAU;AAAA,KACjB;AAAA,EACF;AACF;AAGA,SAAS,oBAAA,CACP,QAAA,EACA,KAAA,EACA,UAAA,EACA,QAAA,EACgB;AAChB,EAAA,IAAI,KAAA,KAAU,KAAK,QAAA,EAAU;AAC3B,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,KAAU,SAAS,MAAA,EAAQ;AAC7B,IAAA,OAAO,UAAA;AAAA,EACT;AACA,EAAA,OAAO,QAAA,CAAS,KAAK,CAAA,CAAE,MAAA;AACzB;AAEA,SAAS,YAAA,CACP,OACA,KAAA,EACM;AACN,EAAA,IAAI,KAAA,CAAM,YAAW,EAAG;AACtB,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,MAAM,SAAA,GAA0B,IAAI,YAAA,CAAa,KAAA,CAAM,KAAK,MAAM,CAAA;AAClE,MAAA,SAAA,CAAU,CAAC,IAAI,KAAA,CAAM,QAAA;AACrB,MAAA,SAAA,CAAU,CAAC,IAAI,KAAA,CAAM,QAAA;AACrB,MAAA,KAAA,CAAM,IAAA,GAAO,IAAI,KAAA,CAAM,SAAS,CAAA;AAAA,IAClC;AACA,IAAA;AAAA,EACF;AACA,EAAA,IAAI,MAAM,IAAA,EAAM;AACd,IAAA,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAAA,EAC9B;AACA,EAAA,KAAA,CAAM,IAAA,GAAO,KAAA;AACb,EAAA,IAAI,CAAC,MAAM,KAAA,EAAO;AAChB,IAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AAAA,EAChB;AACF;AAEA,SAAS,cAAA,CAAe,UAAqB,MAAA,EAAwB;AACnE,EAAA,IAAI,UAAA,GAA6B,IAAA;AACjC,EAAA,IAAI,QAAA,GAA2B,IAAA;AAE/B,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,IAAK,QAAA,CAAS,CAAC,CAAA,CAAE,MAAA,CAAO,WAAW,CAAA,EAAG;AAC1D,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,CAAC,CAAA,CAAE,OAAO,CAAC,CAAA;AACxC,IAAA,MAAM,CAAC,KAAA,EAAO,GAAG,CAAA,GAAI,WAAA,CAAY,MAAM,GAAG,CAAA;AAC1C,IAAA,UAAA,GAAa,CAAC,QAAA,CAAS,CAAC,EAAE,MAAA,CAAO,CAAC,GAAG,KAAK,CAAA;AAC1C,IAAA,QAAA,GAAW,CAAC,GAAA,EAAK,QAAA,CAAS,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,EACxC;AAEA,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,KAAA,EAAO,IAAA;AAAA,IACP,IAAA,EAAM,IAAA;AAAA,IACN,QAAQ;AAAC,GACX;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACzC,IAAA,MAAM,aAAA,GAAgB,oBAAA;AAAA,MACpB,QAAA;AAAA,MACA,CAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AACjC,MAAA,YAAA,CAAa,OAAO,KAAK,CAAA;AAAA,IAC3B;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,KAAA,EAAO;AAC7B,IAAA,KAAA,CAAM,MAAA,CAAO,IAAA;AAAA,MACX,IAAI,KAAA;AAAA,QACF,MAAM,IAAA,CAAK,QAAA;AAAA,QACX,MAAM,IAAA,CAAK,QAAA;AAAA,QACX,MAAM,IAAA,CAAK,SAAA;AAAA,QACX,MAAM,IAAA,CAAK,SAAA;AAAA,QACX,MAAM,IAAA,CAAK,SAAA;AAAA,QACX,MAAM,IAAA,CAAK,SAAA;AAAA,QACX,MAAM,KAAA,CAAM,QAAA;AAAA,QACZ,MAAM,KAAA,CAAM;AAAA;AACd,KACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,MAAA,CAAO,KAAK,KAAA,CAAM,KAAA,CAAM,OAAO,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,EACnD;AAEA,EAAA,OAAO,KAAA,CAAM,MAAA;AACf;AAEA,IAAM,gBAAN,MAAoB;AAAA,EAClB,EAAA;AAAA,EACA,EAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,MAAA,GAAgB,EAAA,CAAG,CAAA,EAAG,CAAC,CAAA;AAAA,EACvB,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EAEA,WAAA,CAAY,EAAA,EAAW,EAAA,EAAW,EAAA,EAAW,QAAA,EAA0B;AACrE,IAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AACV,IAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AACV,IAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AACV,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AACxB,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AACxB,IAAA,MAAM,GAAA,GAAM,WAAW,GAAG,CAAA;AAC1B,IAAA,MAAM,GAAA,GAAM,WAAW,GAAG,CAAA;AAE1B,IAAA,IAAI,GAAA,GAAM,CAAA,IAAK,GAAA,GAAM,CAAA,EAAG;AACtB,MAAA,IAAA,CAAK,EAAA,GAAK,KAAA,CAAM,GAAA,EAAK,GAAG,CAAA;AACxB,MAAA,IAAA,CAAK,EAAA,GAAK,KAAA,CAAM,GAAA,EAAK,GAAG,CAAA;AACxB,MAAA,IAAA,CAAK,eAAe,QAAA,CAAS,MAAA;AAC7B,MAAA,IAAA,CAAK,YAAY,QAAA,CAAS,SAAA;AAC1B,MAAA,IAAA,CAAK,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACtC,MAAA,IAAA,CAAK,WAAW,IAAA,CAAK,IAAA,CAAK,IAAI,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAC,CAAA;AACnD,MAAA,IAAA,CAAK,gBAAA,GACH,IAAA,CAAK,QAAA,GAAW,IAAA,GACX,IAAA,CAAK,gBAAgB,IAAA,CAAK,QAAA,GAAW,CAAA,CAAA,GAAM,IAAA,CAAK,QAAA,GACjD,CAAA;AAAA,IACR,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,EAAA,GAAK,EAAA,CAAG,CAAA,EAAG,CAAC,CAAA;AACjB,MAAA,IAAA,CAAK,EAAA,GAAK,EAAA,CAAG,CAAA,EAAG,CAAC,CAAA;AACjB,MAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,MAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,MAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,MAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,MAAA,IAAA,CAAK,gBAAA,GAAmB,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,IAAI,WAAA,GAAsB;AACxB,IAAA,OAAA,CAAQ,CAAA,GAAI,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,gBAAA;AAAA,EACrC;AAAA,EAEQ,8BAA8B,UAAA,EAA4B;AAChE,IAAA,IAAI,UAAA,GAAa,KAAK,WAAA,EAAa;AACjC,MAAA,OAAO,IAAA,CAAK,SAAA;AAAA,IACd;AACA,IAAA,IAAI,UAAA,GAAa,KAAK,gBAAA,EAAkB;AACtC,MAAA,OACG,KAAK,SAAA,IAAa,UAAA,GAAa,KAAK,gBAAA,CAAA,IACpC,IAAA,CAAK,cAAc,IAAA,CAAK,gBAAA,CAAA;AAAA,IAE7B;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEQ,gBAAA,CACN,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACc;AACd,IAAA,MAAM,SAAA,GAAY,WAAW,EAAE,CAAA;AAC/B,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,EAAA,EAAI,SAAS,CAAA;AAC/B,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,eAAA,EAAiB;AACnC,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AACzB,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,EAAM,SAAS,CAAA;AACjC,IAAA,IAAI,IAAA,CAAK,IAAI,GAAG,CAAA,GAAI,kBAAkB,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACnD,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAI,GAAA,GAAM,GAAA;AAChB,IAAA,OAAO,KAAA,CAAM,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,CAAC,CAAC,CAAA;AAAA,EAC/B;AAAA,EAEQ,oBAAA,CACN,gBACA,qBAAA,EACA,MAAA,EACA,WACA,yBAAA,EACA,8BAAA,EACA,cACA,OAAA,EACO;AACP,IAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,KAAA,CAAM,SAAA,EAAW,MAAM,CAAC,CAAA;AAC1D,IAAA,MAAM,UAAA,GAAa,KAAA;AAAA,MACjB,MAAA;AAAA,MACA,KAAA,CAAM,aAAA,EAAe,cAAA,IAAkB,CAAA,GAAI,qBAAA,CAAsB;AAAA,KACnE;AACA,IAAA,MAAM,CAAA,GAAI,gBAAA;AAAA,MACR,yBAAA;AAAA,MACA,KAAA;AAAA,QACE,KAAA,CAAM,2BAA2B,8BAA8B,CAAA;AAAA,QAC/D;AAAA,OACF;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,QAAA,GAAW,KAAA;AAAA,MACf,YAAA;AAAA,MACA,KAAA;AAAA,QACE,eAAA,CAAgB,EAAE,CAAA,GAAI,YAAA,CAAa,GAAG,CAAA,CAAE,CAAA,GAAI,aAAa,CAAC,CAAA;AAAA,QAC1D;AAAA;AACF,KACF;AACA,IAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,KAAA,CAAM,QAAA,EAAU,YAAY,CAAC,CAAA;AAC9D,IAAA,MAAM,YACJ,IAAA,CAAK,gBAAA;AAAA,MACH,SAAA;AAAA,MACA,aAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF,IAAK,yBAAA;AACP,IAAA,MAAM,WAAA,GAAc,MAAM,KAAA,CAAM,UAAA,EAAY,MAAM,SAAA,EAAW,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA;AACnE,IAAA,OAAO,IAAI,KAAA;AAAA,MACT,UAAA,CAAW,CAAA;AAAA,MACX,UAAA,CAAW,CAAA;AAAA,MACX,WAAA,CAAY,CAAA;AAAA,MACZ,WAAA,CAAY,CAAA;AAAA,MACZ,SAAA,CAAU,CAAA;AAAA,MACV,SAAA,CAAU,CAAA;AAAA,MACV,QAAA,CAAS,CAAA;AAAA,MACT,QAAA,CAAS;AAAA,KACX;AAAA,EACF;AAAA,EAEA,SAAA,CAAU,WAAA,EAAqB,WAAA,GAAsB,WAAA,EAAsB;AACzE,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,WAAW,CAAA;AACpD,IAAA,IACE,KAAK,gBAAA,GAAmB,eAAA,IACxB,aAAa,eAAA,IACb,IAAA,CAAK,eAAe,eAAA,EACpB;AACA,MAAA,IAAA,CAAK,SAAS,IAAA,CAAK,EAAA;AACnB,MAAA,OAAO,CAAC,KAAA,CAAM,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA,EAAG,IAAA,CAAK,EAAA,CAAG,CAAA,EAAG,KAAK,EAAA,CAAG,CAAA,EAAG,IAAA,CAAK,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,IACxE;AAEA,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,KAAK,gBAAgB,CAAA;AACjE,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,6BAAA,CAA8B,WAAW,CAAA;AACvE,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,6BAAA,CAA8B,WAAW,CAAA;AACvE,IAAA,MAAM,OAAA,GACJ,IAAA,CAAK,YAAA,IAAgB,cAAA,GAAiB,IAAA,CAAK,gBAAA,CAAA;AAC7C,IAAA,MAAM,cAAA,GAAiB,KAAK,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,GAAI,MAAA,CAAO,cAAc,CAAC,CAAA;AACzE,IAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,IAAA,CAAK,IAAI,IAAA,CAAK,EAAE,GAAG,CAAC,CAAA;AAChD,IAAA,MAAM,WAAA,GAAc,YAAY,OAAO,CAAA;AACvC,IAAA,IAAA,CAAK,SAAS,KAAA,CAAM,IAAA,CAAK,IAAI,KAAA,CAAM,WAAA,EAAa,cAAc,CAAC,CAAA;AAC/D,IAAA,MAAM,mBAAA,GAAsB,MAAM,IAAA,CAAK,EAAA,EAAI,MAAM,IAAA,CAAK,EAAA,EAAI,cAAc,CAAC,CAAA;AACzE,IAAA,MAAM,mBAAA,GAAsB,MAAM,IAAA,CAAK,EAAA,EAAI,MAAM,IAAA,CAAK,EAAA,EAAI,cAAc,CAAC,CAAA;AAEzE,IAAA,MAAM,YAAY,IAAA,CAAK,oBAAA;AAAA,MACrB,cAAA;AAAA,MACA,gBAAA;AAAA,MACA,IAAA,CAAK,EAAA;AAAA,MACL,IAAA,CAAK,EAAA;AAAA,MACL,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA,IAAA,CAAK,MAAA;AAAA,MACL;AAAA,KACF;AACA,IAAA,MAAM,YAAY,IAAA,CAAK,oBAAA;AAAA,MACrB,cAAA;AAAA,MACA,gBAAA;AAAA,MACA,IAAA,CAAK,EAAA;AAAA,MACL,IAAA,CAAK,EAAA;AAAA,MACL,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA,IAAA,CAAK,MAAA;AAAA,MACL;AAAA,MACA,OAAA,EAAQ;AAEV,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA,KAAA,CAAM,WAAA;AAAA,QACJ,KAAK,MAAA,CAAO,CAAA;AAAA,QACZ,KAAK,MAAA,CAAO,CAAA;AAAA,QACZ,SAAA,CAAU,QAAA;AAAA,QACV,SAAA,CAAU,QAAA;AAAA,QACV,SAAA,CAAU,QAAA;AAAA,QACV,SAAA,CAAU;AAAA,OACZ;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF,CAAA;AAEA,SAAS,gBAAgB,QAAA,EAA2B;AAClD,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,MAAA,EAAQ,KAAK,CAAA,EAAG;AAC3C,IAAA,EAAA,IAAM,SAAS,CAAC,CAAA;AAChB,IAAA,EAAA,IAAM,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,EACtB;AACA,EAAA,MAAM,CAAA,GAAI,SAAS,MAAA,GAAS,CAAA;AAC5B,EAAA,OAAO,EAAA,CAAG,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAC,CAAA;AAC1B;AAEA,SAAS,oBAAA,CACP,WAAA,EACA,MAAA,EACA,OAAA,EACA,OAAA,EACU;AACV,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,EAAa,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,CAAA,GAAI,iBAAA;AAAA,MACR,MAAA;AAAA,MACC,OAAA,GAAU,cAAe,CAAA,GAAI,CAAA;AAAA,MAC9B,EAAA,CAAG,SAAS,OAAO;AAAA,KACrB;AACA,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AAAA,EACtB;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,yBAAA,CACd,QAAA,EACA,QAAA,GAA2B,SAAA,EAC3B,iBAAA,GAA6C,IAAA,EAC7C,OAAA,GAAkB,MAAA,CAAO,SAAA,EACzB,OAAA,GAAkB,MAAA,CAAO,SAAA,EACT;AAChB,EAAA,MAAM,CAAA,GAAI,SAAS,MAAA,GAAS,CAAA;AAC5B,EAAA,MAAM,iBAAkC,EAAC;AAEzC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,WAAA,GAAc,iBAAA,GAAoB,CAAC,CAAA,IAAK,QAAA;AAC9C,IAAA,MAAM,SAAA,GAAA,CAAc,CAAA,GAAI,CAAA,GAAI,CAAA,IAAK,CAAA,GAAK,CAAA;AACtC,IAAA,MAAM,SAAA,GAAA,CAAc,CAAA,GAAI,CAAA,IAAK,CAAA,GAAK,CAAA;AAClC,IAAA,cAAA,CAAe,IAAA;AAAA,MACb,IAAI,aAAA;AAAA,QACF,GAAG,QAAA,CAAS,SAAS,GAAG,QAAA,CAAS,SAAA,GAAY,CAAC,CAAC,CAAA;AAAA,QAC/C,EAAA,CAAG,SAAS,CAAA,GAAI,CAAC,GAAG,QAAA,CAAS,CAAA,GAAI,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,QACvC,GAAG,QAAA,CAAS,SAAS,GAAG,QAAA,CAAS,SAAA,GAAY,CAAC,CAAC,CAAA;AAAA,QAC/C;AAAA;AACF,KACF;AAAA,EACF;AAGA,EAAA,MAAM,aAAiC,EAAC;AACxC,EAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,EAAA,EAAA,EAAM;AAC7B,IAAA,MAAM,gBAAA,GACJ,eAAe,EAAE,CAAA,CAAE,mBACnB,cAAA,CAAA,CAAgB,EAAA,GAAK,CAAA,IAAK,CAAC,CAAA,CAAE,gBAAA;AAC/B,IAAA,MAAM,WAAA,GACJ,eAAe,EAAE,CAAA,CAAE,cAAc,cAAA,CAAA,CAAgB,EAAA,GAAK,CAAA,IAAK,CAAC,CAAA,CAAE,WAAA;AAChE,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,EAAA,GAAK,CAAC,CAAA;AAC5B,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,EAAA,GAAK,CAAA,GAAI,CAAC,CAAA;AAChC,IAAA,MAAM,QAAA,GAAW,QAAA,CAAA,CAAW,EAAA,GAAK,CAAA,IAAK,IAAK,CAAC,CAAA;AAC5C,IAAA,MAAM,WAAW,QAAA,CAAA,CAAW,EAAA,GAAK,CAAA,IAAK,CAAA,GAAK,IAAI,CAAC,CAAA;AAChD,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,IAAA,GAAO,QAAA,EAAU,OAAO,QAAQ,CAAA;AAE1D,IAAA,IAAI,mBAAmB,QAAA,EAAU;AAC/B,MAAA,UAAA,CAAW,IAAA,CAAK,CAAC,QAAA,GAAW,gBAAA,EAAkB,CAAC,CAAC,CAAA;AAAA,IAClD,CAAA,MAAA,IAAW,cAAc,QAAA,EAAU;AACjC,MAAA,UAAA,CAAW,IAAA,CAAK;AAAA,QACd,CAAA;AAAA,QAAA,CACC,QAAA,GAAW,qBAAqB,WAAA,GAAc,gBAAA;AAAA,OAChD,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,MAAM,UAAqB,EAAC;AAC5B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,cAAwB,EAAC;AAC/B,IAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,IAAS,CAAA,EAAG,KAAA,EAAA,EAAS;AACvC,MAAA,MAAM,CAAC,eAAe,QAAQ,CAAA,GAAI,YAAY,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,KAAA,IAAS,CAAC,CAAA;AACpE,MAAA,WAAA,CAAY,IAAA;AAAA,QACV,cAAA,CAAe,CAAC,CAAA,CAAE,gBAAA,GAAmB,aAAA,GAAA,CAClC,cAAA,CAAe,CAAC,CAAA,CAAE,WAAA,GAAc,cAAA,CAAe,CAAC,CAAA,CAAE,gBAAA,IACjD;AAAA,OACN;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,cAAA,CAAe,CAAC,CAAA,CAAE,SAAA,CAAU,WAAA,CAAY,CAAC,CAAA,EAAG,WAAA,CAAY,CAAC,CAAC,CAAC,CAAA;AAAA,EAC1E;AAEA,EAAA,MAAM,eAA0B,EAAC;AACjC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,YAAA,GAAA,CAAgB,CAAA,GAAI,CAAA,GAAI,CAAA,IAAK,CAAA;AACnC,IAAA,MAAM,YAAA,GAAA,CAAgB,IAAI,CAAA,IAAK,CAAA;AAC/B,IAAA,MAAM,UAAA,GAAa,EAAA,CAAG,QAAA,CAAS,CAAA,GAAI,CAAC,GAAG,QAAA,CAAS,CAAA,GAAI,CAAA,GAAI,CAAC,CAAC,CAAA;AAC1D,IAAA,MAAM,UAAA,GAAa,EAAA;AAAA,MACjB,QAAA,CAAS,eAAe,CAAC,CAAA;AAAA,MACzB,QAAA,CAAS,YAAA,GAAe,CAAA,GAAI,CAAC;AAAA,KAC/B;AACA,IAAA,MAAM,UAAA,GAAa,EAAA;AAAA,MACjB,QAAA,CAAS,eAAe,CAAC,CAAA;AAAA,MACzB,QAAA,CAAS,YAAA,GAAe,CAAA,GAAI,CAAC;AAAA,KAC/B;AACA,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,UAAA,EAAY,UAAA,EAAY,UAAU,CAAA;AAC5D,IAAA,YAAA,CAAa,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,QAAQ,CAAC,CAAA,EAAG,MAAA,EAAQ,QAAA,EAAU,CAAA;AAC1E,IAAA,YAAA,CAAa,IAAA,CAAK;AAAA,MAChB,IAAA,EAAM,MAAA;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,KAAA,CAAM,YAAA;AAAA,UACJ,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CAAE,QAAA;AAAA,UAClC,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CAAE,QAAA;AAAA,UAClC,SAAS,CAAA,GAAI,CAAA,IAAK,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,QAAA;AAAA,UACxB,SAAS,CAAA,GAAI,CAAA,IAAK,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE;AAAA;AAC1B;AACF,KACD,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,MAAA,GACJ,OAAA,KAAY,MAAA,CAAO,SAAA,IAAa,OAAA,KAAY,MAAA,CAAO,SAAA,GAC/C,eAAA,CAAgB,QAAQ,CAAA,GACxB,EAAA,CAAG,OAAA,EAAS,OAAO,CAAA;AAEzB,EAAA,OAAO,IAAI,cAAA,CAAe,YAAA,EAAc,MAAM,CAAA;AAChD;AAEA,SAAS,QAAA,CAAS,IAAA,EAAa,IAAA,EAAa,IAAA,EAAsB;AAChE,EAAA,MAAM,EAAA,GAAK,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAC3B,EAAA,MAAM,EAAA,GAAK,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAC3B,EAAA,OAAO,GAAG,CAAA,GAAI,EAAA,CAAG,IAAI,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA;AACrC;AAEO,SAAS,aAAA,CACd,WAAA,EACA,MAAA,GAAS,CAAA,EACT,OAAA,GAAU,CAAA,EACV,OAAA,GAAU,CAAA,EACV,QAAA,GAA2B,SAAA,EAC3B,iBAAA,GAA6C,IAAA,EAC7B;AAChB,EAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,WAAA,EAAa,MAAA,EAAQ,SAAS,OAAO,CAAA;AAC3E,EAAA,OAAO,yBAAA;AAAA,IACL,QAAA;AAAA,IACA,QAAA;AAAA,IACA,iBAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,YAAA,CACd,cAAc,CAAA,EACd,MAAA,GAAS,GACT,OAAA,GAAU,CAAA,EACV,UAAU,CAAA,EACM;AAChB,EAAA,MAAM,QAAQ,OAAA,GAAU,WAAA;AACxB,EAAA,MAAM,aAAA,GAAgB,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAC7C,EAAA,OAAO,aAAA;AAAA,IACL,WAAA;AAAA,IACA,aAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,eAAe,MAAM;AAAA,GACvB;AACF;AAEO,SAAS,eAAA,CACd,KAAA,GAAQ,CAAA,EACR,MAAA,GAAS,CAAA,EACT,QAAA,GAA2B,SAAA,EAC3B,iBAAA,GAA6C,IAAA,EAC7C,OAAA,GAAU,CAAA,EACV,OAAA,GAAU,CAAA,EACM;AAChB,EAAA,MAAM,IAAA,GAAO,UAAU,KAAA,GAAQ,CAAA;AAC/B,EAAA,MAAM,GAAA,GAAM,UAAU,MAAA,GAAS,CAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,UAAU,KAAA,GAAQ,CAAA;AAChC,EAAA,MAAM,MAAA,GAAS,UAAU,MAAA,GAAS,CAAA;AAClC,EAAA,OAAO,yBAAA;AAAA,IACL,CAAC,OAAO,MAAA,EAAQ,IAAA,EAAM,QAAQ,IAAA,EAAM,GAAA,EAAK,OAAO,GAAG,CAAA;AAAA,IACnD,QAAA;AAAA,IACA,iBAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,wBAAA,CACP,oBAAA,EACA,MAAA,EACA,WAAA,EACA,SACA,OAAA,EACU;AACV,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,oBAAA,EAAsB,CAAA,EAAA,EAAK;AAC7C,IAAA,IAAI,IAAI,iBAAA,CAAkB,MAAA,EAAS,OAAA,GAAU,oBAAA,GAAwB,IAAI,CAAC,CAAA;AAC1E,IAAA,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA,GAAI,OAAA,EAAS,CAAA,CAAE,IAAI,OAAO,CAAA;AACxC,IAAA,CAAA,GAAI,iBAAA;AAAA,MACF,WAAA;AAAA,MACC,OAAA,GAAU,oBAAA,IAAyB,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,KAC9C;AACA,IAAA,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA,GAAI,OAAA,EAAS,CAAA,CAAE,IAAI,OAAO,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,UAAA,CACd,oBAAA,EACA,MAAA,GAAS,CAAA,EACT,cAAc,GAAA,EACd,QAAA,GAA2B,SAAA,EAC3B,aAAA,GAAuC,MACvC,iBAAA,GAA6C,IAAA,EAC7C,OAAA,GAAU,CAAA,EACV,UAAU,CAAA,EACM;AAChB,EAAA,IAAI,UAAA,GAAa,iBAAA;AACjB,EAAA,IAAI,CAAC,cAAc,aAAA,EAAe;AAChC,IAAA,UAAA,GAAa,EAAC;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,oBAAA,EAAsB,CAAA,EAAA,EAAK;AAC7C,MAAA,UAAA,CAAW,IAAA,CAAK,UAAU,aAAa,CAAA;AAAA,IACzC;AAAA,EACF;AACA,EAAA,MAAM,QAAA,GAAW,wBAAA;AAAA,IACf,oBAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,OAAO,yBAAA;AAAA,IACL,QAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACnmBA,SAAS,GAAA,CAAI,CAAA,EAAW,CAAA,EAAW,CAAA,GAAoB,SAAA,EAAwB;AAC7E,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AACnB;AAEA,SAAS,YAAA,CAAa,GAAW,CAAA,EAAmB;AAClD,EAAA,OAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,IAAI,GAAA,GAAO,OAAA;AACpC;AAEA,SAAS,UAAU,OAAA,EAAyB;AAC1C,EAAA,OAAQ,OAAA,GAAU,MAAO,CAAA,GAAI,OAAA;AAC/B;AAEA,SAAS,UAAA,CAAW,GAAW,CAAA,EAAmB;AAChD,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,CAAA,GAAI,IAAI,CAAC,CAAA;AAChC;AAEA,SAAS,cACP,EAAA,EACA,EAAA,EACA,OACA,EAAA,GAAK,CAAA,EACL,KAAK,CAAA,EACa;AAClB,EAAA,MAAM,CAAA,GAAI,UAAU,KAAK,CAAA;AACzB,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,OAAO;AAAA,IACL,EAAA,GAAK,KAAK,GAAA,CAAI,CAAC,IAAI,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,EAAA;AAAA,IACtC,EAAA,GAAK,KAAK,GAAA,CAAI,CAAC,IAAI,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI;AAAA,GACxC;AACF;AAEA,SAAS,gBAAA,CACP,MAAA,EACA,IAAA,EACA,OAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,CAAE,CAAA,GAAI,OAAA,EAAS,CAAA,CAAE,CAAA,GAAI,OAAO,CAAC,CAAA;AAC3E,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,UAAA,CAAW,CAAA,CAAE,CAAA,GAAI,OAAA,EAAS,CAAA,CAAE,CAAA,GAAI,OAAO,CAAC,CAAA;AAC5E,EAAA,MAAM,aAAa,IAAA,GAAO,CAAA;AAC1B,EAAA,MAAM,eAAe,GAAA,GAAM,UAAA;AAC3B,EAAA,MAAM,SAAwB,EAAC;AAE/B,EAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,UAAA,EAAY,EAAA,EAAA,EAAM;AACtC,IAAA,MAAM,QAAA,GAAW,KAAK,CAAA,KAAM,CAAA;AAC5B,IAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,MAAA,CAAO,QAAQ,KAAA,EAAA,EAAS;AAClD,MAAA,MAAM,CAAA,GAAI,QAAA,GAAW,MAAA,CAAO,MAAA,GAAS,IAAI,KAAA,GAAQ,KAAA;AACjD,MAAA,IAAI,CAAA,GAAI,CAAA,IAAK,CAAC,QAAA,EAAU;AACtB,QAAA,MAAM,WAAA,GAAc,QAAA,GAChB,YAAA,GAAe,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,GACvC,MAAA,CAAO,CAAC,CAAA;AACZ,QAAA,MAAM,CAAA,GAAI,SAAA,CAAU,YAAA,GAAe,EAAA,GAAK,WAAW,CAAA;AACnD,QAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,SAAA,CAAU,CAAC,CAAA,GAAI,OAAA;AAC5C,QAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,SAAA,CAAU,CAAC,CAAA,GAAI,OAAA;AAC5C,QAAA,MAAA,CAAO,IAAA,CAAK,IAAI,MAAA,EAAQ,MAAA,EAAQ,OAAO,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAA,CACP,MAAA,EACA,IAAA,EACA,OAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,KAAK,MAAA,CAAO,MAAA;AAClB,EAAA,MAAM,SAAwB,EAAC;AAC/B,EAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,EAAA,GAAK,MAAM,EAAA,EAAA,EAAM;AACrC,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,EAAA,GAAK,EAAE,CAAA;AAC/B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,aAAA;AAAA,MACf,QAAA,CAAS,CAAA;AAAA,MACT,QAAA,CAAS,CAAA;AAAA,MACT,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAE,KAAK,GAAA,GAAM,IAAA,CAAA;AAAA,MAC7B,OAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAA,CAAO,KAAK,GAAA,CAAI,EAAA,EAAI,EAAA,EAAI,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,QAAA,CACP,MAAA,EACA,IAAA,EACA,OAAA,EACA,SACA,SAAA,EACe;AACf,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO,gBAAA,CAAiB,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,OAAO,CAAA;AAAA,EACxD;AACA,EAAA,OAAO,eAAA,CAAgB,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,OAAO,CAAA;AACvD;AAEA,SAAS,aAAA,CACP,QACA,IAAA,EACA,OAAA,GAAU,KACV,OAAA,GAAU,GAAA,EACV,YAAY,KAAA,EACI;AAChB,EAAA,MAAM,eAAe,QAAA,CAAS,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,SAAS,SAAS,CAAA;AACvE,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,aAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,KAAK,YAAA,EAAc;AAC5B,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AACtB,IAAA,UAAA,CAAW,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,yBAAA;AAAA,IACL,QAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,aAAA,CACP,SACA,OAAA,EACgB;AAChB,EAAA,MAAM,GAAA,GAAM,UAAU,OAAO,CAAA;AAC7B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AACxB,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AACxB,EAAA,OAAO,OAAA,CAAQ,WAAA,CAAY,CAAC,CAAA,EAAG,CAAA,MAAO;AAAA,IACpC,CAAA,EAAG,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,GAAA;AAAA,IACjB,CAAA,EAAG,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI;AAAA,GACnB,CAAE,CAAA;AACJ;AAIA,IAAM,GAAA,GAAM,eAAe,IAAI,CAAA;AAC/B,IAAM,GAAA,GAAM,eAAe,GAAG,CAAA;AAC9B,IAAM,GAAA,GAAM,eAAe,GAAG,CAAA;AAC9B,IAAM,GAAA,GAAM,eAAe,GAAG,CAAA;AAC9B,IAAM,IAAA,GAAO,eAAe,CAAC,CAAA;AAI7B,SAAS,MAAA,GAAyB;AAChC,EAAA,OAAO,aAAa,EAAE,CAAA;AACxB;AAEA,SAASA,OAAAA,GAAyB;AAChC,EAAA,OAAO,eAAA,CAAgB,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAClC;AAEA,SAAS,OAAA,GAA0B;AACjC,EAAA,OAAO,aAAA;AAAA,IACL;AAAA,MACE,IAAI,KAAA,EAAO,IAAA,EAAM,cAAA,CAAe,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,MAC7C,IAAI,MAAA,EAAQ,KAAA,EAAO,cAAA,CAAe,KAAA,EAAO,KAAK,CAAC;AAAA,KACjD;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,IAAA,GAAuB;AAC9B,EAAA,OAAO,aAAA;AAAA,IACL,yBAAA;AAAA;AAAA,MAAA,CAEG,MAAM;AACL,QAAA,MAAM,CAAA,GAAI,CAAA;AACV,QAAA,MAAM,QAAkB,EAAC;AACzB,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,UAAA,MAAM,KAAA,GAAS,OAAA,GAAU,CAAA,GAAK,CAAA,GAAI,CAAA;AAClC,UAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,GAAG,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,CAAC,CAAA;AAAA,QACrD;AACA,QAAA,OAAO,KAAA;AAAA,MACT,CAAA,GAAG;AAAA,MACH,SAAA;AAAA,MACA,CAAC,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK,GAAG,CAAA;AAAA,MACrB,CAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,GAAA,GAAsB;AAC7B,EAAA,OAAO,aAAA;AAAA,IACL;AAAA,MACE,IAAI,KAAA,EAAO,CAAA,EAAK,cAAA,CAAe,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,MAC5C,GAAA,CAAI,CAAA,EAAK,CAAA,EAAK,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,MACnC,GAAA,CAAI,CAAA,EAAK,KAAA,EAAQ,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,MACtC,GAAA,CAAI,KAAA,EAAO,IAAA,EAAM,cAAA,CAAe,KAAK,CAAC;AAAA,KACxC;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,KAAA,GAAwB;AAC/B,EAAA,OAAO,aAAA;AAAA,IACL;AAAA,MACE,GAAA,CAAI,GAAA,EAAK,KAAA,EAAO,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,MACrC,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,MACvC,IAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,KAAA,EAAO,CAAG,CAAC,CAAA;AAAA,MAC5C,GAAA,CAAI,KAAA,EAAO,IAAA,EAAM,cAAA,CAAe,KAAK,CAAC;AAAA,KACxC;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,UAAA,GAA6B;AACpC,EAAA,OAAO,eAAA,CAAgB,KAAK,CAAA,EAAG,SAAA,EAAW,CAAC,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,IAAI,CAAC,CAAA;AAClE;AAEA,SAAS,IAAA,GAAuB;AAC9B,EAAA,MAAM,MAAA,GAAS,YAAA,EAAa,CAAE,WAAA,CAAY,CAAC,CAAA,EAAG,CAAA,MAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,IAAA,EAAK,CAAE,CAAA;AACxE,EAAA,OAAO,aAAA,CAAc,QAAQ,GAAG,CAAA;AAClC;AAEA,SAAS,IAAA,GAAuB;AAC9B,EAAA,OAAO,aAAA;AAAA,IACL;AAAA,MACE,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,MACvC,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,MAChB,GAAA,CAAI,CAAA,EAAK,KAAA,EAAO,cAAA,CAAe,CAAG,CAAC;AAAA,KACrC;AAAA,IACA,CAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,QAAA,GAA2B;AAClC,EAAA,OAAO,aAAA;AAAA,IACL,yBAAA;AAAA,MAAA,CACG,MAAM;AACL,QAAA,MAAM,QAAkB,EAAC;AACzB,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,UAAA,KAAA,CAAM,IAAA;AAAA,YACJ,IAAA,CAAK,GAAA,CAAK,OAAA,GAAU,CAAA,GAAK,IAAI,CAAC,CAAA;AAAA,YAC9B,IAAA,CAAK,GAAA,CAAK,OAAA,GAAU,CAAA,GAAK,IAAI,CAAC;AAAA,WAChC;AAAA,QACF;AACA,QAAA,OAAO,KAAA;AAAA,MACT,CAAA,GAAG;AAAA,MACH,GAAA;AAAA,MACA,IAAA;AAAA,MACA,CAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,OAAA,GAA0B;AACjC,EAAA,OAAO,aAAA;AAAA,IACL;AAAA,MACE,IAAI,GAAA,EAAK,KAAA,EAAO,cAAA,CAAe,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,MAC5C,GAAA,CAAI,IAAA,EAAM,GAAA,EAAK,cAAA,CAAe,KAAK,CAAC;AAAA,KACtC;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,SAAA,GAA4B;AACnC,EAAA,OAAO,aAAA;AAAA,IACL;AAAA,MACE,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,MACvC,GAAA,CAAI,KAAA,EAAO,GAAA,EAAK,cAAA,CAAe,IAAI,CAAC,CAAA;AAAA,MACpC,GAAA,CAAI,IAAA,EAAM,KAAA,EAAO,cAAA,CAAe,KAAK,CAAC;AAAA,KACxC;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,QAAA,GAA2B;AAClC,EAAA,OAAO,aAAA;AAAA,IACL;AAAA,MACE,GAAA,CAAI,GAAA,EAAK,KAAA,EAAQ,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,MACtC,GAAA,CAAI,IAAA,EAAM,KAAA,EAAO,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,MACtC,GAAA,CAAI,KAAA,EAAO,IAAA,EAAM,cAAA,CAAe,KAAK,CAAC;AAAA,KACxC;AAAA,IACA,CAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,GAAA,GAAsB;AAC7B,EAAA,OAAO,aAAA;AAAA,IACL;AAAA,MACE,IAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,MAC9C,GAAA,CAAI,KAAA,EAAQ,KAAA,EAAO,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,MACxC,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,MACvC,GAAA,CAAI,KAAA,EAAO,CAAA,EAAK,cAAA,CAAe,KAAK,CAAC;AAAA,KACvC;AAAA,IACA,CAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,KAAA,GAAwB;AAC/B,EAAA,OAAO,UAAA,CAAW,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA;AAClC;AAEA,SAAS,SAAA,GAA4B;AACnC,EAAA,OAAO,aAAA;AAAA,IACL;AAAA,MACE,GAAA,CAAI,GAAA,EAAK,IAAA,EAAM,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,MACpC,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,KAAK,CAAC;AAAA,KACzC;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,OAAA,GAA0B;AACjC,EAAA,OAAO,aAAA;AAAA,IACL;AAAA,MACE,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,MACvC,GAAA,CAAI,GAAA,EAAK,KAAA,EAAO,cAAA,CAAe,KAAK,CAAC;AAAA,KACvC;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,OAAA,GAA0B;AACjC,EAAA,OAAO,aAAA;AAAA,IACL;AAAA,MACE,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,MACvC,GAAA,CAAI,GAAA,EAAK,KAAA,EAAO,cAAA,CAAe,KAAK,CAAC;AAAA,KACvC;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,OAAA,GAA0B;AACjC,EAAA,OAAO,cAAc,UAAA,CAAW,CAAA,EAAG,GAAG,IAAA,EAAM,GAAG,GAAG,GAAG,CAAA;AACvD;AAEA,SAAS,OAAA,GAA0B;AACjC,EAAA,OAAO,cAAc,UAAA,CAAW,CAAA,EAAG,GAAG,GAAA,EAAK,GAAG,GAAG,GAAG,CAAA;AACtD;AAEA,SAAS,QAAA,GAA2B;AAClC,EAAA,OAAO,cAAc,UAAA,CAAW,EAAA,EAAI,GAAG,GAAA,EAAK,GAAG,GAAG,GAAG,CAAA;AACvD;AAEA,SAAS,QAAA,GAA2B;AAClC,EAAA,OAAO,aAAA;AAAA,IACL;AAAA,MACE,GAAA,CAAI,GAAA,EAAK,CAAA,EAAG,cAAA,CAAe,CAAG,CAAC,CAAA;AAAA,MAC/B,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,cAAA,CAAe,CAAG,CAAC,CAAA;AAAA,MAC7B,IAAI,CAAA,EAAG,IAAA,EAAM,cAAA,CAAe,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,MACzC,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,KAAK,CAAC;AAAA,KACzC;AAAA,IACA,CAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,OAAA,GAA0B;AACjC,EAAA,OAAO,aAAA;AAAA,IACL,CAAC,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA,EAAG,GAAA,CAAI,KAAA,EAAO,MAAA,EAAQ,cAAA,CAAe,KAAK,CAAC,CAAC,CAAA;AAAA,IAC3D,CAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,OAAA,GAA0B;AACjC,EAAA,OAAO,aAAA;AAAA,IACL,CAAC,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA,EAAG,GAAA,CAAI,KAAA,EAAO,MAAA,EAAQ,cAAA,CAAe,KAAK,CAAC,CAAC,CAAA;AAAA,IAC3D;AAAA,GACF;AACF;AAEA,SAAS,KAAA,GAAwB;AAC/B,EAAA,OAAO,aAAA;AAAA,IACL;AAAA,MACE,GAAA,CAAI,GAAA,EAAK,KAAA,EAAQ,cAAA,CAAe,IAAK,CAAC,CAAA;AAAA,MACtC,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,IAAK,CAAC;AAAA,KACzC;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,SAAA,GAA4B;AACnC,EAAA,OAAO,aAAA;AAAA,IACL;AAAA,MACE,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,MACvC,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,KAAK,CAAC;AAAA,KACzC;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,IAAA,GAAuB;AAC9B,EAAA,OAAO,aAAA;AAAA,IACL;AAAA,MACE,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,IAAK,CAAC,CAAA;AAAA,MACvC,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,cAAA,CAAe,IAAK,CAAC;AAAA,KACxC;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,QAAA,GAA2B;AAClC,EAAA,OAAO,aAAA;AAAA,IACL;AAAA,MACE,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,MAChB,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,MACvC,IAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,KAAA,EAAO,CAAG,CAAC,CAAA;AAAA,MAC5C,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,KAAK,CAAC;AAAA,KACzC;AAAA,IACA,EAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,MAAA,GAAyB;AAChC,EAAA,OAAO,aAAA;AAAA,IACL;AAAA,MACE,GAAA,CAAI,MAAM,KAAK,CAAA;AAAA,MACf,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,MACvC,GAAA,CAAI,KAAA,EAAO,IAAA,EAAO,cAAA,CAAe,KAAK,CAAC;AAAA,KACzC;AAAA,IACA,CAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,KAAA,GAAwB;AAC/B,EAAA,MAAM,IAAA,GAAO,aAAA;AAAA,IACX;AAAA,MACE,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,MACd,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,MACvC,GAAA,CAAI,IAAA,EAAM,MAAA,EAAQ,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,MACvC,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,MACvC,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,MAChB,GAAA,CAAI,KAAA,EAAO,IAAA,EAAO,cAAA,CAAe,IAAI,CAAC,CAAA;AAAA,MACtC,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,IAAI,CAAC,CAAA;AAAA,MACtC,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,IAAI,CAAC,CAAA;AAAA,MACtC,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,MAChB,GAAA,CAAI,IAAA,EAAM,KAAA,EAAO,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,MACtC,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,KAAK,CAAC;AAAA,KACzC;AAAA,IACA,CAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,OAAO,IAAA,CAAK,WAAA,CAAY,CAAC,CAAA,EAAG,CAAA,MAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,KAAA,EAAM,CAAE,CAAA;AACzD;AAEA,SAAS,YAAA,GAA+B;AACtC,EAAA,OAAO,aAAA;AAAA,IACL;AAAA,MACE,GAAA,CAAI,IAAA,EAAM,IAAA,EAAM,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,MACrC,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,MAChB,GAAA,CAAI,CAAA,EAAK,KAAA,EAAO,cAAA,CAAe,KAAK,CAAC;AAAA,KACvC;AAAA,IACA,CAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,WAAA,GAA8B;AACrC,EAAA,OAAO,aAAA;AAAA,IACL;AAAA,MACE,GAAA,CAAI,KAAK,CAAG,CAAA;AAAA,MACZ,GAAA,CAAI,OAAO,CAAG,CAAA;AAAA,MACd,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,MAChB,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,MAChB,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,MAChB,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,MAChB,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,MAChB,GAAA,CAAI,GAAK,KAAK;AAAA,KAChB;AAAA,IACA,CAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,aAAA,GAAgC;AACvC,EAAA,OAAO,aAAA;AAAA,IACL;AAAA,MACE,GAAA,CAAI,MAAM,GAAG,CAAA;AAAA,MACb,GAAA,CAAI,OAAO,CAAG,CAAA;AAAA,MACd,GAAA,CAAI,OAAO,CAAG,CAAA;AAAA,MACd,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,MAChB,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,MAChB,GAAA,CAAI,OAAO,IAAI,CAAA;AAAA,MACf,GAAA,CAAI,MAAM,IAAI,CAAA;AAAA,MACd,GAAA,CAAI,MAAM,KAAK,CAAA;AAAA,MACf,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,MAChB,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,MAChB,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,MAChB,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,MAChB,GAAA,CAAI,OAAO,KAAK;AAAA,KAClB;AAAA,IACA,CAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,GAAA,GAAsB;AAC7B,EAAA,OAAO,aAAA;AAAA,IACL;AAAA,MACE,GAAA,CAAI,OAAO,GAAG,CAAA;AAAA,MACd,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,CAAC,CAAC,CAAA;AAAA,MACnC,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,CAAC,CAAC,CAAA;AAAA,MACnC,GAAA,CAAI,KAAA,EAAO,CAAA,EAAK,cAAA,CAAe,CAAC,CAAC;AAAA,KACnC;AAAA,IACA,CAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,KAAA,GAAwB;AAC/B,EAAA,OAAO,aAAA;AAAA,IACL;AAAA,MACE,GAAA,CAAI,GAAA,EAAK,KAAA,EAAO,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,MACrC,GAAA,CAAI,KAAA,EAAO,MAAA,EAAQ,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,MACxC,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,CAAG,CAAC,CAAA;AAAA,MACrC,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,cAAA,CAAe,KAAK,CAAC;AAAA,KACzC;AAAA,IACA,CAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAIA,IAAM,cAAA,GAAiB;AAAA,EACrB,MAAA,EAAQ,MAAA;AAAA,EACR,MAAA,EAAQA,OAAAA;AAAA,EACR,OAAA,EAAS,OAAA;AAAA,EACT,IAAA,EAAM,IAAA;AAAA,EACN,GAAA,EAAK,GAAA;AAAA,EACL,KAAA,EAAO,KAAA;AAAA,EACP,UAAA,EAAY,UAAA;AAAA,EACZ,IAAA,EAAM,IAAA;AAAA,EACN,IAAA,EAAM,IAAA;AAAA,EACN,QAAA,EAAU,QAAA;AAAA,EACV,OAAA,EAAS,OAAA;AAAA,EACT,SAAA,EAAW,SAAA;AAAA,EACX,QAAA,EAAU,QAAA;AAAA,EACV,GAAA,EAAK,GAAA;AAAA,EACL,KAAA,EAAO,KAAA;AAAA,EACP,SAAA,EAAW,SAAA;AAAA,EACX,YAAA,EAAc,OAAA;AAAA,EACd,YAAA,EAAc,OAAA;AAAA,EACd,YAAA,EAAc,OAAA;AAAA,EACd,YAAA,EAAc,OAAA;AAAA,EACd,aAAA,EAAe,QAAA;AAAA,EACf,QAAA,EAAU,QAAA;AAAA,EACV,WAAA,EAAa,OAAA;AAAA,EACb,WAAA,EAAa,OAAA;AAAA,EACb,KAAA,EAAO,KAAA;AAAA,EACP,SAAA,EAAW,SAAA;AAAA,EACX,IAAA,EAAM,IAAA;AAAA,EACN,QAAA,EAAU,QAAA;AAAA,EACV,MAAA,EAAQ,MAAA;AAAA,EACR,KAAA,EAAO,KAAA;AAAA,EACP,YAAA,EAAc,YAAA;AAAA,EACd,WAAA,EAAa,WAAA;AAAA,EACb,aAAA,EAAe,aAAA;AAAA,EACf,GAAA,EAAK,GAAA;AAAA,EACL,KAAA,EAAO;AACT,CAAA;AAIO,IAAM,aAA0B,MAAA,CAAO,IAAA;AAAA,EAC5C;AACF;AAEA,IAAM,KAAA,uBAAY,GAAA,EAA+B;AAE1C,SAAS,SAAS,IAAA,EAAiC;AACxD,EAAA,IAAI,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAC1B,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,OAAA,GAAU,eAAe,IAAI,CAAA;AACnC,IAAA,KAAA,GAAQ,OAAA,GAAU,UAAA,EAAW;AAC7B,IAAA,KAAA,CAAM,GAAA,CAAI,MAAM,KAAK,CAAA;AAAA,EACvB;AACA,EAAA,OAAO,KAAA;AACT;;;AC/lBA,IAAM,iBAAN,MAAyC;AAAA,EACtB,QAAA,GAAW,CAAA;AAAA,EAE5B,aAAa,CAAA,EAAkB;AAC7B,IAAA,OAAO,KAAK,iBAAA,CAAkB,CAAA,EAAG,MAAA,CAAO,iBAAiB,EAAE,CAAC,CAAA;AAAA,EAC9D;AAAA,EAEA,iBAAA,CAAkB,GAAU,CAAA,EAAmB;AAC7C,IAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,CAAA,EAAG,CAAC,EAAE,CAAC,CAAA;AAAA,EACvC;AAAA,EAEQ,iBAAA,CAAkB,OAAc,SAAA,EAAqC;AAC3E,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,SAAA,GAAY,SAAA;AAChB,IAAA,IAAI,IAAA,GAAc,EAAA,CAAG,KAAA,CAAM,QAAA,EAAU,MAAM,QAAQ,CAAA;AAEnD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,IAAA,CAAK,UAAU,CAAA,EAAA,EAAK;AACvC,MAAA,MAAM,QAAA,GAAW,IAAI,IAAA,CAAK,QAAA;AAC1B,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,YAAA,CAAa,QAAQ,CAAA;AACzC,MAAA,MAAM,OAAA,GAAU,UAAA,CAAW,KAAA,CAAM,KAAA,EAAO,IAAI,CAAC,CAAA;AAE7C,MAAA,IAAI,WAAW,SAAA,EAAW;AACxB,QAAA,OAAO;AAAA,UACL,QAAA,GAAA,CAAY,CAAA,GAAM,SAAA,GAAY,OAAA,IAAW,IAAA,CAAK,QAAA;AAAA,UAC9C;AAAA,SACF;AAAA,MACF;AACA,MAAA,SAAA,IAAa,OAAA;AACb,MAAA,KAAA,IAAS,OAAA;AACT,MAAA,IAAA,GAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,CAAC,GAAK,KAAK,CAAA;AAAA,EACpB;AACF,CAAA;AAsBA,SAAS,0BAAA,CACP,EAAA,EACA,kBAAA,EACA,QAAA,EACgC;AAChC,EAAA,MAAM,UAAU,IAAA,CAAK,GAAA;AAAA,IACnB,EAAA,CAAG,oBAAA;AAAA,IACH,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,kBAAA,EAAoB,kBAAkB;AAAA,GACpD;AACA,EAAA,MAAM,mBAAA,GAAsB,EAAA,CAAG,kBAAA,GAAqB,EAAA,CAAG,oBAAA;AACvD,EAAA,MAAM,iBAAA,GAAoB,UAAU,EAAA,CAAG,oBAAA;AACvC,EAAA,MAAM,mBAAmB,iBAAA,GAAoB,mBAAA;AAC7C,EAAA,MAAM,IAAI,QAAA,CAAS,iBAAA;AAAA,IACjB,EAAA,CAAG,KAAA;AAAA,IACH,mBAAmB,EAAA,CAAG;AAAA,GACxB;AAEA,EAAA,MAAM,CAAC,EAAA,EAAI,EAAE,IAAI,EAAA,CAAG,KAAA,CAAM,MAAM,CAAC,CAAA;AACjC,EAAA,OAAO;AAAA,IACL;AAAA,MACE,KAAA,EAAO,EAAA;AAAA,MACP,sBAAsB,EAAA,CAAG,oBAAA;AAAA,MACzB,kBAAA,EAAoB,OAAA;AAAA,MACpB,YAAA,EAAc,QAAA,CAAS,YAAA,CAAa,EAAE;AAAA,KACxC;AAAA,IACA;AAAA,MACE,KAAA,EAAO,EAAA;AAAA,MACP,oBAAA,EAAsB,OAAA;AAAA,MACtB,oBAAoB,EAAA,CAAG,kBAAA;AAAA,MACvB,YAAA,EAAc,QAAA,CAAS,YAAA,CAAa,EAAE;AAAA;AACxC,GACF;AACF;AAEA,SAAS,cAAA,CACP,UACA,OAAA,EACiB;AACjB,EAAA,MAAM,SAAkB,EAAC;AACzB,EAAA,MAAM,iBAAsC,EAAC;AAE7C,EAAA,KAAA,MAAW,OAAA,IAAW,QAAQ,QAAA,EAAU;AACtC,IAAA,KAAA,IAAS,aAAa,CAAA,EAAG,UAAA,GAAa,OAAA,CAAQ,MAAA,CAAO,QAAQ,UAAA,EAAA,EAAc;AACzE,MAAA,IACE,OAAA,CAAQ,IAAA,KAAS,QAAA,IACjB,UAAA,KAAe,IAAA,CAAK,MAAM,OAAA,CAAQ,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,EACnD;AACA,QAAA,cAAA,CAAe,IAAA,CAAK,CAAC,OAAA,EAAS,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,MAC9C;AACA,MAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAC,CAAA;AAAA,IACxC;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAqB,CAAC,CAAC,CAAA;AAC7B,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,YAAA,CAAa,KAAK,CAAA;AACrC,IAAA,UAAA,IAAc,CAAA;AACd,IAAA,QAAA,CAAS,KAAK,UAAU,CAAA;AAAA,EAC1B;AACA,EAAA,MAAM,YAAA,GAAe,UAAA;AAErB,EAAA,MAAM,kBAAkB,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,IAAI,YAAY,CAAA;AAE5D,EAAA,MAAM,WAAkC,cAAA,CAAe,GAAA;AAAA,IACrD,CAAC,CAAC,OAAA,EAAS,EAAE,CAAA,MAAO;AAAA,MAClB,QAAA,EAAU,cAAA;AAAA,QAAA,CACP,gBAAgB,EAAE,CAAA,GAAI,eAAA,CAAgB,EAAA,GAAK,CAAC,CAAA,IAAK,CAAA;AAAA,QAClD;AAAA,OACF;AAAA,MACA;AAAA,KACF;AAAA,GACF;AAGA,EAAA,MAAM,iBAAkC,EAAC;AACzC,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,IAAI,gBAAgB,CAAA,GAAI,CAAC,IAAI,eAAA,CAAgB,CAAC,IAAI,eAAA,EAAiB;AACjE,MAAA,cAAA,CAAe,IAAA,CAAK;AAAA,QAClB,KAAA,EAAO,OAAO,CAAC,CAAA;AAAA,QACf,oBAAA,EAAsB,aAAA;AAAA,QACtB,kBAAA,EAAoB,eAAA,CAAgB,CAAA,GAAI,CAAC,CAAA;AAAA,QACzC,YAAA,EAAc,QAAA,CAAS,YAAA,CAAa,MAAA,CAAO,CAAC,CAAC;AAAA,OAC9C,CAAA;AACD,MAAA,aAAA,GAAgB,eAAA,CAAgB,IAAI,CAAC,CAAA;AAAA,IACvC;AAAA,EACF;AAEA,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,EAAA,CAAG,EAAE,CAAA;AACzC,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,YAAA,CAAa,kBAAA,GAAqB,CAAA;AAAA,EACpC;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,cAAA,EAAgB,QAAA,EAAU,QAAA,EAAS;AACtD;AAEA,SAAS,WAAA,CACP,IACA,YAAA,EACiB;AACjB,EAAA,IAAI,eAAe,eAAA,EAAiB;AAClC,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAS,EAAA,CAAG,MAAA;AAClB,EAAA,IAAI,cAAc,MAAA,CAAO,SAAA;AAAA,IACvB,CAAC,CAAA,KACC,YAAA,IAAgB,CAAA,CAAE,oBAAA,IAClB,gBAAgB,CAAA,CAAE;AAAA,GACtB;AACA,EAAA,IAAI,gBAAgB,EAAA,EAAI;AACtB,IAAA,WAAA,GAAc,OAAO,MAAA,GAAS,CAAA;AAAA,EAChC;AAEA,EAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,0BAAA;AAAA,IACf,OAAO,WAAW,CAAA;AAAA,IAClB,YAAA;AAAA,IACA,EAAA,CAAG;AAAA,GACL;AAEA,EAAA,MAAM,SAAA,GAAqB,CAAC,EAAA,CAAG,KAAK,CAAA;AACpC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,SAAA,CAAU,KAAK,MAAA,CAAA,CAAQ,CAAA,GAAI,eAAe,MAAA,CAAO,MAAM,EAAE,KAAK,CAAA;AAAA,EAChE;AACA,EAAA,SAAA,CAAU,IAAA,CAAK,GAAG,KAAK,CAAA;AAGvB,EAAA,MAAM,qBAA+B,EAAC;AACtC,EAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,MAAA,CAAO,MAAA,GAAS,GAAG,KAAA,EAAA,EAAS;AACtD,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,kBAAA,CAAmB,KAAK,CAAC,CAAA;AAAA,IAC3B,CAAA,MAAA,IAAW,KAAA,KAAU,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AACtC,MAAA,kBAAA,CAAmB,KAAK,CAAC,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,MAAM,UAAA,GAAA,CAAc,WAAA,GAAc,KAAA,GAAQ,CAAA,IAAK,MAAA,CAAO,MAAA;AACtD,MAAA,kBAAA,CAAmB,IAAA;AAAA,QACjB,eAAe,MAAA,CAAO,UAAU,CAAA,CAAE,kBAAA,GAAqB,cAAc,CAAC;AAAA,OACxE;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAqC,EAAA,CAAG,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACjE,QAAA,EAAU,cAAA,CAAe,CAAA,CAAE,QAAA,GAAW,cAAc,CAAC,CAAA;AAAA,IACrD,SAAS,CAAA,CAAE;AAAA,GACb,CAAE,CAAA;AAEF,EAAA,MAAM,iBAAkC,EAAC;AACzC,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,IAAA,IAAI,mBAAmB,CAAA,GAAI,CAAC,IAAI,kBAAA,CAAmB,CAAC,IAAI,eAAA,EAAiB;AACvE,MAAA,cAAA,CAAe,IAAA,CAAK;AAAA,QAClB,KAAA,EAAO,UAAU,CAAC,CAAA;AAAA,QAClB,oBAAA,EAAsB,aAAA;AAAA,QACtB,kBAAA,EAAoB,kBAAA,CAAmB,CAAA,GAAI,CAAC,CAAA;AAAA,QAC5C,cAAc,EAAA,CAAG,QAAA,CAAS,YAAA,CAAa,SAAA,CAAU,CAAC,CAAC;AAAA,OACpD,CAAA;AACD,MAAA,aAAA,GAAgB,kBAAA,CAAmB,IAAI,CAAC,CAAA;AAAA,IAC1C;AAAA,EACF;AACA,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,EAAA,CAAG,EAAE,CAAA;AACpC,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,kBAAA,GAAqB,CAAA;AAAA,EAC/B;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,cAAA;AAAA,IACR,QAAA,EAAU,WAAA;AAAA,IACV,UAAU,EAAA,CAAG;AAAA,GACf;AACF;AAIA,SAAS,eAAA,CAAgB,QAAA,EAAkB,IAAA,EAAc,EAAA,EAAqB;AAC5E,EAAA,IAAI,MAAM,IAAA,EAAM;AACd,IAAA,OAAO,QAAA,IAAY,QAAQ,QAAA,IAAY,EAAA;AAAA,EACzC;AACA,EAAA,OAAO,QAAA,IAAY,QAAQ,QAAA,IAAY,EAAA;AACzC;AAEA,SAAS,gBAAA,CAAiB,IAAY,EAAA,EAAoB;AACxD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA;AAC1B,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AAC1B;AAEA,SAAS,SAAA,CAAU,OAAA,EAAmB,OAAA,EAAmB,CAAA,EAAmB;AAC1E,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,IAAI,eAAA,CAAgB,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,EAAG,OAAA,CAAA,CAAS,CAAA,GAAI,CAAA,IAAK,OAAA,CAAQ,MAAM,CAAC,CAAA,EAAG;AACrE,MAAA,aAAA,GAAgB,CAAA;AAChB,MAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAM,WAAA,GAAA,CAAe,aAAA,GAAgB,CAAA,IAAK,OAAA,CAAQ,MAAA;AAClD,EAAA,MAAM,QAAA,GAAW,cAAA;AAAA,IACf,OAAA,CAAQ,WAAW,CAAA,GAAI,OAAA,CAAQ,aAAa,CAAA;AAAA,IAC5C;AAAA,GACF;AACA,EAAA,MAAM,QAAA,GAAW,cAAA;AAAA,IACf,OAAA,CAAQ,WAAW,CAAA,GAAI,OAAA,CAAQ,aAAa,CAAA;AAAA,IAC5C;AAAA,GACF;AACA,EAAA,MAAM,QAAA,GACJ,QAAA,GAAW,IAAA,GACP,GAAA,GACA,cAAA,CAAe,IAAI,OAAA,CAAQ,aAAa,CAAA,EAAG,CAAC,CAAA,GAAI,QAAA;AACtD,EAAA,OAAO,eAAe,OAAA,CAAQ,aAAa,CAAA,GAAI,QAAA,GAAW,UAAU,CAAC,CAAA;AACvE;AAEA,IAAM,YAAA,GAAN,MAAM,aAAA,CAAa;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EAEjB,YAAY,QAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,eAAe,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAC,CAAA;AAC5C,IAAA,IAAA,CAAK,eAAe,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,EAC9C;AAAA,EAEA,IAAI,CAAA,EAAmB;AACrB,IAAA,OAAO,SAAA,CAAU,IAAA,CAAK,YAAA,EAAc,IAAA,CAAK,cAAc,CAAC,CAAA;AAAA,EAC1D;AAAA,EAEA,QAAQ,CAAA,EAAmB;AACzB,IAAA,OAAO,SAAA,CAAU,IAAA,CAAK,YAAA,EAAc,IAAA,CAAK,cAAc,CAAC,CAAA;AAAA,EAC1D;AAAA,EAEA,OAAO,QAAA,GAAW,IAAI,aAAA,CAAa;AAAA,IACjC,CAAC,GAAG,CAAC,CAAA;AAAA,IACL,CAAC,KAAK,GAAG;AAAA,GACV,CAAA;AACH,CAAA;AAIA,SAAS,2BAA2B,CAAA,EAAmB;AACrD,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA;AACxB,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,EAAA,CAAG,EAAE,CAAA,IAAK,KAAA;AAChC,EAAA,OAAO,EAAA;AAAA,IAAA,CACJ,KAAA,CAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,CAAA;AAAA,IAAA,CAClC,KAAA,CAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY;AAAA,GACrC;AACF;AAEA,SAAS,kBAAA,CAAmB,IAAa,EAAA,EAAqB;AAC5D,EAAA,IAAI,EAAA,CAAG,SAAS,QAAA,IAAY,EAAA,CAAG,SAAS,QAAA,IAAY,EAAA,CAAG,MAAA,KAAW,EAAA,CAAG,MAAA,EAAQ;AAC3E,IAAA,OAAO,MAAA,CAAO,SAAA;AAAA,EAChB;AACA,EAAA,MAAM,EAAA,GAAK,2BAA2B,EAAE,CAAA;AACxC,EAAA,MAAM,EAAA,GAAK,2BAA2B,EAAE,CAAA;AACxC,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AACtB,EAAA,OAAO,EAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AAC7B;AAEA,SAAS,kBAAA,CACP,WACA,SAAA,EAC0E;AAC1E,EAAA,MAAM,SAIA,EAAC;AACP,EAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,IAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,MAAA,MAAM,CAAA,GAAI,kBAAA,CAAmB,EAAA,CAAG,OAAA,EAAS,GAAG,OAAO,CAAA;AACnD,MAAA,IAAI,CAAA,KAAM,OAAO,SAAA,EAAW;AAC1B,QAAA,MAAA,CAAO,KAAK,EAAE,QAAA,EAAU,CAAA,EAAG,EAAA,EAAI,IAAI,CAAA;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,QAAA,GAAW,EAAE,QAAQ,CAAA;AAC7C,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,gBAAA,CACP,OAAA,EACA,cAAA,EACA,EAAA,EACA,EAAA,EACS;AACT,EAAA,MAAM,IAAI,OAAA,CAAQ,MAAA;AAClB,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,CAAC,SAAS,OAAO,CAAA,GAAI,SAAS,cAAA,GAAiB,CAAA,GAAI,KAAK,CAAC,CAAA;AAC/D,EAAA,MAAM,CAAC,MAAA,EAAQ,MAAM,CAAA,GAAI,OAAA,CAAQ,iBAAiB,CAAC,CAAA;AAEnD,EAAA,IACE,iBAAiB,EAAA,EAAI,OAAO,IAAI,eAAA,IAChC,gBAAA,CAAiB,IAAI,MAAM,CAAA,GAAI,mBAC/B,gBAAA,CAAiB,EAAA,EAAI,OAAO,CAAA,GAAI,eAAA,IAChC,iBAAiB,EAAA,EAAI,MAAM,IAAI,eAAA,EAC/B;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,CAAA,IAAK,CAAA,IAAK,eAAA,CAAgB,EAAA,EAAI,SAAS,MAAM,CAAA;AACtD;AAEA,SAAS,SAAA,CACP,WACA,SAAA,EACoB;AACpB,EAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,SAAA,EAAW,SAAS,CAAA;AAE1D,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,OAAO;AAAA,MACL,CAAC,GAAG,CAAC,CAAA;AAAA,MACL,CAAC,KAAK,GAAG;AAAA,KACX;AAAA,EACF;AAEA,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,MAAM,EAAA,GAAK,WAAW,CAAC,CAAA;AACvB,IAAA,OAAO;AAAA,MACL,CAAC,EAAA,CAAG,EAAA,CAAG,QAAA,EAAU,EAAA,CAAG,GAAG,QAAQ,CAAA;AAAA,MAC/B,CAAA,CAAE,EAAA,CAAG,EAAA,CAAG,QAAA,GAAW,GAAA,IAAO,IAAI,EAAA,CAAG,EAAA,CAAG,QAAA,GAAW,GAAA,IAAO,CAAC;AAAA,KACzD;AAAA,EACF;AAEA,EAAA,MAAM,UAA8B,EAAC;AACrC,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAyB;AAC5C,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAyB;AAE5C,EAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,IAAA,IAAI,MAAA,CAAO,IAAI,EAAA,CAAG,EAAE,KAAK,MAAA,CAAO,GAAA,CAAI,EAAA,CAAG,EAAE,CAAA,EAAG;AAC1C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,MAAA,IAAI,QAAQ,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA,CAAG,GAAG,QAAA,EAAU;AAClC,QAAA,cAAA,GAAiB,CAAA,GAAI,CAAA;AAAA,MACvB;AAAA,IACF;AAEA,IAAA,IACE,CAAC,gBAAA,CAAiB,OAAA,EAAS,cAAA,EAAgB,EAAA,CAAG,GAAG,QAAA,EAAU,EAAA,CAAG,EAAA,CAAG,QAAQ,CAAA,EACzE;AACA,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,MAAA,CAAO,cAAA,EAAgB,CAAA,EAAG,CAAC,EAAA,CAAG,GAAG,QAAA,EAAU,EAAA,CAAG,EAAA,CAAG,QAAQ,CAAC,CAAA;AAClE,IAAA,MAAA,CAAO,GAAA,CAAI,GAAG,EAAE,CAAA;AAChB,IAAA,MAAA,CAAO,GAAA,CAAI,GAAG,EAAE,CAAA;AAAA,EAClB;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,aAAA,CACP,WACA,SAAA,EACc;AACd,EAAA,MAAM,SAAA,GAAY,UAAU,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAA,CAAQ,SAAS,QAAQ,CAAA;AACrE,EAAA,MAAM,SAAA,GAAY,UAAU,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAA,CAAQ,SAAS,QAAQ,CAAA;AACrE,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,SAAA,EAAW,SAAS,CAAA;AAC9C,EAAA,OAAO,IAAI,aAAa,OAAO,CAAA;AACjC;AAEO,IAAM,QAAN,MAAY;AAAA,EACA,UAAA;AAAA,EAEjB,WAAA,CAAY,OAAuB,GAAA,EAAqB;AACtD,IAAA,IAAA,CAAK,UAAA,GAAa,aAAA,CAAc,KAAA,EAAO,GAAG,CAAA;AAAA,EAC5C;AAAA,EAEA,SAAS,QAAA,EAA2B;AAClC,IAAA,MAAM,SAAkB,EAAC;AACzB,IAAA,IAAI,UAAA,GAA2B,IAAA;AAC/B,IAAA,IAAI,SAAA,GAA0B,IAAA;AAE9B,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,KAAK,UAAA,EAAY;AACpC,MAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa,CAAC,CAAA;AACjC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,QAAA,MAAA,CAAO,CAAC,CAAA,GAAI,WAAA,CAAY,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,EAAG,QAAQ,CAAA;AAAA,MAC5D;AACA,MAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAM,CAAA;AAC9B,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,UAAA,GAAa,KAAA;AAAA,MACf;AACA,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AAAA,MACvB;AACA,MAAA,SAAA,GAAY,KAAA;AAAA,IACd;AAEA,IAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,IAAI,KAAA;AAAA,UACF,SAAA,CAAU,QAAA;AAAA,UACV,SAAA,CAAU,QAAA;AAAA,UACV,SAAA,CAAU,SAAA;AAAA,UACV,SAAA,CAAU,SAAA;AAAA,UACV,SAAA,CAAU,SAAA;AAAA,UACV,SAAA,CAAU,SAAA;AAAA,UACV,UAAA,CAAW,QAAA;AAAA,UACX,UAAA,CAAW;AAAA;AACb,OACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEA,SAAS,aAAA,CACP,IACA,EAAA,EACkB;AAClB,EAAA,MAAM,QAAA,GAAW,IAAI,cAAA,EAAe;AACpC,EAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,QAAA,EAAU,EAAE,CAAA;AACpD,EAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,QAAA,EAAU,EAAE,CAAA;AAEpD,EAAA,MAAM,YAAA,GAAe,aAAA;AAAA,IACnB,gBAAA,CAAiB,QAAA;AAAA,IACjB,gBAAA,CAAiB;AAAA,GACnB;AAEA,EAAA,MAAM,gBAAA,GAAmB,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA;AAE3C,EAAA,MAAM,GAAA,GAAM,gBAAA;AACZ,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,gBAAA,EAAkB,gBAAgB,CAAA;AAE1D,EAAA,MAAM,MAAwB,EAAC;AAC/B,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,IAAI,EAAA,GAA2B,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,CAAA,IAAK,IAAA;AACnD,EAAA,IAAI,EAAA,GAA2B,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,CAAA,IAAK,IAAA;AAEnD,EAAA,OAAO,EAAA,KAAO,IAAA,IAAQ,EAAA,KAAO,IAAA,EAAM;AACjC,IAAA,MAAM,MAAM,EAAA,KAAO,GAAA,CAAI,MAAA,CAAO,MAAA,GAAS,IAAI,EAAA,CAAG,kBAAA;AAC9C,IAAA,MAAM,MACJ,EAAA,KAAO,GAAA,CAAI,MAAA,CAAO,MAAA,GACd,IACA,YAAA,CAAa,OAAA;AAAA,MACX,cAAA,CAAe,EAAA,CAAG,kBAAA,GAAqB,gBAAA,EAAkB,CAAC;AAAA,KAC5D;AAEN,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA;AAE9B,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,GAAA,GAAM,OAAO,YAAA,EAAc;AAC7B,MAAA,MAAM,CAAC,CAAA,EAAG,CAAC,IAAI,0BAAA,CAA2B,EAAA,EAAI,MAAM,QAAQ,CAAA;AAC5D,MAAA,IAAA,GAAO,CAAA;AACP,MAAA,KAAA,GAAQ,CAAA;AAAA,IACV,CAAA,MAAO;AACL,MAAA,IAAA,GAAO,EAAA;AACP,MAAA,KAAA,GAAQ,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,CAAA,IAAK,IAAA;AAAA,IAC9B;AAEA,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,GAAA,GAAM,OAAO,YAAA,EAAc;AAC7B,MAAA,MAAM,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,0BAAA;AAAA,QACb,EAAA;AAAA,QACA,eAAe,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,GAAI,kBAAkB,CAAC,CAAA;AAAA,QAC3D;AAAA,OACF;AACA,MAAA,IAAA,GAAO,CAAA;AACP,MAAA,KAAA,GAAQ,CAAA;AAAA,IACV,CAAA,MAAO;AACL,MAAA,IAAA,GAAO,EAAA;AACP,MAAA,KAAA,GAAQ,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,CAAA,IAAK,IAAA;AAAA,IAC9B;AAEA,IAAA,GAAA,CAAI,KAAK,CAAC,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AACjC,IAAA,EAAA,GAAK,KAAA;AACL,IAAA,EAAA,GAAK,KAAA;AAAA,EACP;AAEA,EAAA,OAAO,GAAA;AACT;;;AC7hBO,SAAS,cAAA,CAAe,MAAA,EAAiB,IAAA,GAAO,GAAA,EAAa;AAClE,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,MAAM,CAAA,GAAI,IAAA;AACV,EAAA,IAAI,IAAI,CAAA,CAAA,EAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,GAAW,GAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAA,CAAK,OAAO,CAAC,CAAA,CAAE,WAAW,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAEtF,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,CAAA,IAAK,KAAK,CAAA,CAAE,SAAA,GAAY,GAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAA,CAAK,CAAA,CAAE,SAAA,GAAY,CAAA,EAAG,QAAQ,CAAC,CAAC,KAAK,CAAA,CAAE,SAAA,GAAY,GAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAA,CAAK,EAAE,SAAA,GAAY,CAAA,EAAG,QAAQ,CAAC,CAAC,KAAK,CAAA,CAAE,QAAA,GAAW,GAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAA,CAAK,CAAA,CAAE,WAAW,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,EACrM;AAEA,EAAA,CAAA,IAAK,GAAA;AACL,EAAA,OAAO,SAAS,CAAC,CAAA,EAAA,CAAA;AACnB;AAuBO,SAAS,iBAAA,CACd,MAAA,EACA,eAAA,GAAkB,CAAA,EACV;AACR,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAO,gBAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,eAAA,EAAiB,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,IAAI,CAAA,GAAI,eAAA;AACd,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,YAAA,CAAa,CAAC,CAAA;AAClC,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,CAAA,EAAA,CAAI,KAAA,CAAM,CAAA,GAAI,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,EAAA,CAAM,KAAA,CAAM,CAAA,GAAI,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,OAC9D;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,CAAA,QAAA,EAAW,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AACpC;AAwBO,SAAS,WAAA,CACd,KAAA,EACA,GAAA,EACA,eAAA,GAAkB,CAAA,EACA;AAClB,EAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA;AAClC,EAAA,OAAO;AAAA,IACL,iBAAA,CAAkB,KAAA,CAAM,QAAA,CAAS,CAAC,GAAG,eAAe,CAAA;AAAA,IACpD,iBAAA,CAAkB,KAAA,CAAM,QAAA,CAAS,CAAC,GAAG,eAAe;AAAA,GACtD;AACF;;;AC1FO,SAAS,OAAA,CAAQ,MAAA,EAAiB,IAAA,GAAO,GAAA,EAAa;AAC3D,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,CAAA,GAAI,IAAA;AACV,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,GAAW,GAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAA,CAAK,OAAO,CAAC,CAAA,CAAE,WAAW,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,GAChF;AAEA,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,KAAK,CAAA,CAAE,SAAA,GAAY,GAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAA,CAAK,CAAA,CAAE,SAAA,GAAY,CAAA,EAAG,QAAQ,CAAC,CAAC,KAAK,CAAA,CAAE,SAAA,GAAY,GAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAA,CAAK,EAAE,SAAA,GAAY,CAAA,EAAG,QAAQ,CAAC,CAAC,KAAK,CAAA,CAAE,QAAA,GAAW,GAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAA,CAAK,CAAA,CAAE,WAAW,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,KAChM;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AACd,EAAA,OAAO,KAAA,CAAM,KAAK,EAAE,CAAA;AACtB;AAKO,SAAS,SAAA,CAAU,OAAA,EAAyB,IAAA,GAAO,GAAA,EAAa;AACrE,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,IAAI,CAAA;AACrC","file":"index.js","sourcesContent":["// Ported from AOSP androidx.graphics.shapes\n\nexport const distanceEpsilon = 1e-4;\nexport const angleEpsilon = 1e-6;\nexport const relaxedDistanceEpsilon = 5e-3;\nexport const floatPi = Math.PI;\nexport const twoPi = 2 * Math.PI;\n\nexport interface Point {\n x: number;\n y: number;\n}\n\nexport function pt(x: number, y: number): Point {\n return { x, y };\n}\n\nexport function ptDistance(p: Point): number {\n return Math.sqrt(p.x * p.x + p.y * p.y);\n}\n\nexport function ptDistanceSquared(p: Point): number {\n return p.x * p.x + p.y * p.y;\n}\n\nexport function ptDirection(p: Point): Point {\n const d = ptDistance(p);\n return { x: p.x / d, y: p.y / d };\n}\n\nexport function ptDot(a: Point, b: Point): number {\n return a.x * b.x + a.y * b.y;\n}\n\nexport function ptClockwise(a: Point, b: Point): boolean {\n return a.x * b.y - a.y * b.x > 0;\n}\n\nexport function ptRotate90(p: Point): Point {\n return { x: -p.y, y: p.x };\n}\n\nexport function ptSub(a: Point, b: Point): Point {\n return { x: a.x - b.x, y: a.y - b.y };\n}\n\nexport function ptAdd(a: Point, b: Point): Point {\n return { x: a.x + b.x, y: a.y + b.y };\n}\n\nexport function ptMul(p: Point, s: number): Point {\n return { x: p.x * s, y: p.y * s };\n}\n\nexport function ptDiv(p: Point, s: number): Point {\n return { x: p.x / s, y: p.y / s };\n}\n\nexport function distance(x: number, y: number): number {\n return Math.sqrt(x * x + y * y);\n}\n\nexport function distanceSquared(x: number, y: number): number {\n return x * x + y * y;\n}\n\nexport function directionVector(x: number, y: number): Point {\n const d = distance(x, y);\n return { x: x / d, y: y / d };\n}\n\nexport function directionVectorAngle(angleRadians: number): Point {\n return { x: Math.cos(angleRadians), y: Math.sin(angleRadians) };\n}\n\nexport function radialToCartesian(\n radius: number,\n angleRadians: number,\n center: Point = { x: 0, y: 0 }\n): Point {\n const d = directionVectorAngle(angleRadians);\n return { x: d.x * radius + center.x, y: d.y * radius + center.y };\n}\n\nexport function interpolate(\n start: number,\n stop: number,\n fraction: number\n): number {\n return (1 - fraction) * start + fraction * stop;\n}\n\nexport function interpolatePoint(\n start: Point,\n stop: Point,\n fraction: number\n): Point {\n return {\n x: interpolate(start.x, stop.x, fraction),\n y: interpolate(start.y, stop.y, fraction),\n };\n}\n\nexport function positiveModulo(num: number, mod: number): number {\n return ((num % mod) + mod) % mod;\n}\n\nexport function collinearIsh(\n aX: number,\n aY: number,\n bX: number,\n bY: number,\n cX: number,\n cY: number,\n tolerance: number = distanceEpsilon\n): boolean {\n const ab = ptRotate90({ x: bX - aX, y: bY - aY });\n const ac: Point = { x: cX - aX, y: cY - aY };\n const dotProduct = Math.abs(ptDot(ab, ac));\n const relativeTolerance = tolerance * ptDistance(ab) * ptDistance(ac);\n return dotProduct < tolerance || dotProduct < relativeTolerance;\n}\n\nexport function convex(previous: Point, current: Point, next: Point): boolean {\n return ptClockwise(ptSub(current, previous), ptSub(next, current));\n}\n\nexport function square(x: number): number {\n return x * x;\n}\n\nexport function findMinimum(\n v0: number,\n v1: number,\n tolerance: number,\n f: (value: number) => number\n): number {\n let a = v0;\n let b = v1;\n while (b - a > tolerance) {\n const c1 = (2 * a + b) / 3;\n const c2 = (2 * b + a) / 3;\n if (f(c1) < f(c2)) {\n b = c2;\n } else {\n a = c1;\n }\n }\n return (a + b) / 2;\n}\n","// Ported from AOSP androidx.graphics.shapes.Cubic\n\nimport {\n collinearIsh,\n directionVector,\n distance,\n distanceEpsilon,\n interpolate,\n convex as isConvex,\n type Point,\n pt,\n ptRotate90,\n relaxedDistanceEpsilon,\n} from \"./utils\";\n\n// find t-values where the cubic derivative is zero for one axis\nfunction axisExtremaTs(a: number, b: number, c: number): number[] {\n const zeroIsh = Math.abs(a) < distanceEpsilon;\n if (zeroIsh) {\n if (b !== 0) {\n const t = (2 * c) / (-2 * b);\n if (t >= 0 && t <= 1) {\n return [t];\n }\n }\n return [];\n }\n const discriminant = b * b - 4 * a * c;\n if (discriminant < 0) {\n return [];\n }\n const sqrtD = Math.sqrt(discriminant);\n const results: number[] = [];\n for (const t of [(-b + sqrtD) / (2 * a), (-b - sqrtD) / (2 * a)]) {\n if (t >= 0 && t <= 1) {\n results.push(t);\n }\n }\n return results;\n}\n\nexport class Cubic {\n readonly points: Float64Array;\n\n constructor(points: Float64Array);\n constructor(\n ax0: number,\n ay0: number,\n cx0: number,\n cy0: number,\n cx1: number,\n cy1: number,\n ax1: number,\n ay1: number\n );\n constructor(\n a: Float64Array | number,\n b?: number,\n c?: number,\n d?: number,\n e?: number,\n f?: number,\n g?: number,\n h?: number\n ) {\n if (a instanceof Float64Array) {\n this.points = a;\n } else {\n this.points = new Float64Array([\n a,\n b as number,\n c as number,\n d as number,\n e as number,\n f as number,\n g as number,\n h as number,\n ]);\n }\n }\n\n get anchor0X(): number {\n return this.points[0];\n }\n get anchor0Y(): number {\n return this.points[1];\n }\n get control0X(): number {\n return this.points[2];\n }\n get control0Y(): number {\n return this.points[3];\n }\n get control1X(): number {\n return this.points[4];\n }\n get control1Y(): number {\n return this.points[5];\n }\n get anchor1X(): number {\n return this.points[6];\n }\n get anchor1Y(): number {\n return this.points[7];\n }\n\n pointOnCurve(t: number): Point {\n const u = 1 - t;\n return pt(\n this.anchor0X * (u * u * u) +\n this.control0X * (3 * t * u * u) +\n this.control1X * (3 * t * t * u) +\n this.anchor1X * (t * t * t),\n this.anchor0Y * (u * u * u) +\n this.control0Y * (3 * t * u * u) +\n this.control1Y * (3 * t * t * u) +\n this.anchor1Y * (t * t * t)\n );\n }\n\n zeroLength(): boolean {\n return (\n Math.abs(this.anchor0X - this.anchor1X) < distanceEpsilon &&\n Math.abs(this.anchor0Y - this.anchor1Y) < distanceEpsilon\n );\n }\n\n convexTo(next: Cubic): boolean {\n const prevVertex = pt(this.anchor0X, this.anchor0Y);\n const currVertex = pt(this.anchor1X, this.anchor1Y);\n const nextVertex = pt(next.anchor1X, next.anchor1Y);\n return isConvex(prevVertex, currVertex, nextVertex);\n }\n\n split(t: number): [Cubic, Cubic] {\n const u = 1 - t;\n const poc = this.pointOnCurve(t);\n return [\n new Cubic(\n this.anchor0X,\n this.anchor0Y,\n this.anchor0X * u + this.control0X * t,\n this.anchor0Y * u + this.control0Y * t,\n this.anchor0X * (u * u) +\n this.control0X * (2 * u * t) +\n this.control1X * (t * t),\n this.anchor0Y * (u * u) +\n this.control0Y * (2 * u * t) +\n this.control1Y * (t * t),\n poc.x,\n poc.y\n ),\n new Cubic(\n poc.x,\n poc.y,\n this.control0X * (u * u) +\n this.control1X * (2 * u * t) +\n this.anchor1X * (t * t),\n this.control0Y * (u * u) +\n this.control1Y * (2 * u * t) +\n this.anchor1Y * (t * t),\n this.control1X * u + this.anchor1X * t,\n this.control1Y * u + this.anchor1Y * t,\n this.anchor1X,\n this.anchor1Y\n ),\n ];\n }\n\n reverse(): Cubic {\n return new Cubic(\n this.anchor1X,\n this.anchor1Y,\n this.control1X,\n this.control1Y,\n this.control0X,\n this.control0Y,\n this.anchor0X,\n this.anchor0Y\n );\n }\n\n transformed(f: (x: number, y: number) => Point): Cubic {\n const newPoints = new Float64Array(8);\n for (let i = 0; i < 8; i += 2) {\n const r = f(this.points[i], this.points[i + 1]);\n newPoints[i] = r.x;\n newPoints[i + 1] = r.y;\n }\n return new Cubic(newPoints);\n }\n\n calculateBounds(approximate = true): [number, number, number, number] {\n if (this.zeroLength()) {\n return [this.anchor0X, this.anchor0Y, this.anchor0X, this.anchor0Y];\n }\n\n let minX = Math.min(this.anchor0X, this.anchor1X);\n let minY = Math.min(this.anchor0Y, this.anchor1Y);\n let maxX = Math.max(this.anchor0X, this.anchor1X);\n let maxY = Math.max(this.anchor0Y, this.anchor1Y);\n\n if (approximate) {\n return [\n Math.min(minX, Math.min(this.control0X, this.control1X)),\n Math.min(minY, Math.min(this.control0Y, this.control1Y)),\n Math.max(maxX, Math.max(this.control0X, this.control1X)),\n Math.max(maxY, Math.max(this.control0Y, this.control1Y)),\n ];\n }\n\n const xCoeffs = [\n -this.anchor0X + 3 * this.control0X - 3 * this.control1X + this.anchor1X,\n 2 * this.anchor0X - 4 * this.control0X + 2 * this.control1X,\n -this.anchor0X + this.control0X,\n ] as const;\n\n for (const t of axisExtremaTs(...xCoeffs)) {\n const v = this.pointOnCurve(t).x;\n minX = Math.min(minX, v);\n maxX = Math.max(maxX, v);\n }\n\n const yCoeffs = [\n -this.anchor0Y + 3 * this.control0Y - 3 * this.control1Y + this.anchor1Y,\n 2 * this.anchor0Y - 4 * this.control0Y + 2 * this.control1Y,\n -this.anchor0Y + this.control0Y,\n ] as const;\n\n for (const t of axisExtremaTs(...yCoeffs)) {\n const v = this.pointOnCurve(t).y;\n minY = Math.min(minY, v);\n maxY = Math.max(maxY, v);\n }\n\n return [minX, minY, maxX, maxY];\n }\n\n static straightLine(x0: number, y0: number, x1: number, y1: number): Cubic {\n return new Cubic(\n x0,\n y0,\n interpolate(x0, x1, 1 / 3),\n interpolate(y0, y1, 1 / 3),\n interpolate(x0, x1, 2 / 3),\n interpolate(y0, y1, 2 / 3),\n x1,\n y1\n );\n }\n\n static circularArc(\n centerX: number,\n centerY: number,\n x0: number,\n y0: number,\n x1: number,\n y1: number\n ): Cubic {\n const p0d = directionVector(x0 - centerX, y0 - centerY);\n const p1d = directionVector(x1 - centerX, y1 - centerY);\n const rotatedP0 = ptRotate90(p0d);\n const rotatedP1 = ptRotate90(p1d);\n const clockwise =\n rotatedP0.x * (x1 - centerX) + rotatedP0.y * (y1 - centerY) >= 0;\n const cosa = p0d.x * p1d.x + p0d.y * p1d.y;\n if (cosa > 0.999) {\n return Cubic.straightLine(x0, y0, x1, y1);\n }\n const k =\n ((distance(x0 - centerX, y0 - centerY) *\n 4 *\n (Math.sqrt(2 * (1 - cosa)) - Math.sqrt(1 - cosa * cosa))) /\n (3 * (1 - cosa))) *\n (clockwise ? 1 : -1);\n return new Cubic(\n x0,\n y0,\n x0 + rotatedP0.x * k,\n y0 + rotatedP0.y * k,\n x1 - rotatedP1.x * k,\n y1 - rotatedP1.y * k,\n x1,\n y1\n );\n }\n\n static empty(x0: number, y0: number): Cubic {\n return new Cubic(x0, y0, x0, y0, x0, y0, x0, y0);\n }\n}\n\n// feature detection helpers ported from FeatureDetector.kt\n\nexport function straightIsh(c: Cubic): boolean {\n return (\n !c.zeroLength() &&\n collinearIsh(\n c.anchor0X,\n c.anchor0Y,\n c.anchor1X,\n c.anchor1Y,\n c.control0X,\n c.control0Y,\n relaxedDistanceEpsilon\n ) &&\n collinearIsh(\n c.anchor0X,\n c.anchor0Y,\n c.anchor1X,\n c.anchor1Y,\n c.control1X,\n c.control1Y,\n relaxedDistanceEpsilon\n )\n );\n}\n\nexport function smoothesIntoIsh(c: Cubic, next: Cubic): boolean {\n return collinearIsh(\n c.control1X,\n c.control1Y,\n next.control0X,\n next.control0Y,\n c.anchor1X,\n c.anchor1Y,\n relaxedDistanceEpsilon\n );\n}\n\nexport function alignsIshWith(c: Cubic, next: Cubic): boolean {\n return (\n (straightIsh(c) && straightIsh(next) && smoothesIntoIsh(c, next)) ||\n c.zeroLength() ||\n next.zeroLength()\n );\n}\n\nfunction extendCubic(a: Cubic, b: Cubic): Cubic {\n if (a.zeroLength()) {\n return new Cubic(\n a.anchor0X,\n a.anchor0Y,\n b.control0X,\n b.control0Y,\n b.control1X,\n b.control1Y,\n b.anchor1X,\n b.anchor1Y\n );\n }\n return new Cubic(\n a.anchor0X,\n a.anchor0Y,\n a.control0X,\n a.control0Y,\n a.control1X,\n a.control1Y,\n b.anchor1X,\n b.anchor1Y\n );\n}\n\nexport function cubicAsFeature(c: Cubic, next: Cubic): Feature {\n if (straightIsh(c)) {\n return { type: \"edge\", cubics: [c] };\n }\n return { type: \"corner\", cubics: [c], convex: c.convexTo(next) };\n}\n\nexport function detectFeatures(cubics: Cubic[]): Feature[] {\n if (cubics.length === 0) {\n return [];\n }\n const result: Feature[] = [];\n let current = cubics[0];\n\n for (let i = 0; i < cubics.length; i++) {\n const next = cubics[(i + 1) % cubics.length];\n if (i < cubics.length - 1 && alignsIshWith(current, next)) {\n current = extendCubic(current, next);\n continue;\n }\n result.push(cubicAsFeature(current, next));\n if (!smoothesIntoIsh(current, next)) {\n result.push(\n cubicAsFeature(Cubic.empty(current.anchor1X, current.anchor1Y), next)\n );\n }\n current = next;\n }\n return result;\n}\n\n// feature types\n\nexport type Feature =\n | { type: \"edge\"; cubics: Cubic[] }\n | { type: \"corner\"; cubics: Cubic[]; convex: boolean };\n\nexport function featureTransformed(\n f: Feature,\n transform: (x: number, y: number) => Point\n): Feature {\n const newCubics = f.cubics.map((c) => c.transformed(transform));\n if (f.type === \"edge\") {\n return { type: \"edge\", cubics: newCubics };\n }\n return { type: \"corner\", cubics: newCubics, convex: f.convex };\n}\n\nexport function featureReversed(f: Feature): Feature {\n const reversedCubics = [...f.cubics].reverse().map((c) => c.reverse());\n if (f.type === \"edge\") {\n return { type: \"edge\", cubics: reversedCubics };\n }\n return { type: \"corner\", cubics: reversedCubics, convex: !f.convex };\n}\n","// Ported from AOSP androidx.graphics.shapes.RoundedPolygon\n\nimport { Cubic, type Feature, featureTransformed } from \"./cubic\";\nimport {\n directionVector,\n distance,\n distanceEpsilon,\n distanceSquared,\n floatPi,\n interpolatePoint,\n type Point,\n pt,\n ptAdd,\n ptDirection,\n ptDistance,\n ptDiv,\n ptDot,\n ptMul,\n ptRotate90,\n ptSub,\n radialToCartesian,\n square,\n} from \"./utils\";\n\nexport interface CornerRounding {\n radius: number;\n smoothing: number;\n}\n\nexport const unrounded: CornerRounding = { radius: 0, smoothing: 0 };\n\nexport function cornerRounding(radius: number, smoothing = 0): CornerRounding {\n return { radius, smoothing };\n}\n\nexport class RoundedPolygon {\n readonly features: Feature[];\n readonly center: Point;\n readonly cubics: Cubic[];\n\n constructor(features: Feature[], center: Point) {\n this.features = features;\n this.center = center;\n this.cubics = buildCubicList(features, center);\n }\n\n get centerX(): number {\n return this.center.x;\n }\n get centerY(): number {\n return this.center.y;\n }\n\n transformed(f: (x: number, y: number) => Point): RoundedPolygon {\n const newCenter = f(this.center.x, this.center.y);\n const newFeatures = this.features.map((feat) =>\n featureTransformed(feat, f)\n );\n return new RoundedPolygon(newFeatures, newCenter);\n }\n\n normalized(): RoundedPolygon {\n const bounds = this.calculateBounds();\n const width = bounds[2] - bounds[0];\n const height = bounds[3] - bounds[1];\n const side = Math.max(width, height);\n const offsetX = (side - width) / 2 - bounds[0];\n const offsetY = (side - height) / 2 - bounds[1];\n return this.transformed((x, y) =>\n pt((x + offsetX) / side, (y + offsetY) / side)\n );\n }\n\n calculateBounds(approximate = true): [number, number, number, number] {\n let minX = Number.MAX_VALUE;\n let minY = Number.MAX_VALUE;\n let maxX = -Number.MAX_VALUE;\n let maxY = -Number.MAX_VALUE;\n for (const cubic of this.cubics) {\n const b = cubic.calculateBounds(approximate);\n minX = Math.min(minX, b[0]);\n minY = Math.min(minY, b[1]);\n maxX = Math.max(maxX, b[2]);\n maxY = Math.max(maxY, b[3]);\n }\n return [minX, minY, maxX, maxY];\n }\n\n calculateMaxBounds(): [number, number, number, number] {\n let maxDistSq = 0;\n for (const cubic of this.cubics) {\n const anchorDist = distanceSquared(\n cubic.anchor0X - this.centerX,\n cubic.anchor0Y - this.centerY\n );\n const mid = cubic.pointOnCurve(0.5);\n const midDist = distanceSquared(\n mid.x - this.centerX,\n mid.y - this.centerY\n );\n maxDistSq = Math.max(maxDistSq, Math.max(anchorDist, midDist));\n }\n const d = Math.sqrt(maxDistSq);\n return [\n this.centerX - d,\n this.centerY - d,\n this.centerX + d,\n this.centerY + d,\n ];\n }\n}\n\n// resolve which cubics to process for a given iteration index\nfunction resolveFeatureCubics(\n features: Feature[],\n index: number,\n splitStart: Cubic[] | null,\n splitEnd: Cubic[] | null\n): Cubic[] | null {\n if (index === 0 && splitEnd) {\n return splitEnd;\n }\n if (index === features.length) {\n return splitStart;\n }\n return features[index].cubics;\n}\n\nfunction processCubic(\n cubic: Cubic,\n state: { first: Cubic | null; last: Cubic | null; result: Cubic[] }\n): void {\n if (cubic.zeroLength()) {\n if (state.last) {\n const newPoints: Float64Array = new Float64Array(state.last.points);\n newPoints[6] = cubic.anchor1X;\n newPoints[7] = cubic.anchor1Y;\n state.last = new Cubic(newPoints);\n }\n return;\n }\n if (state.last) {\n state.result.push(state.last);\n }\n state.last = cubic;\n if (!state.first) {\n state.first = cubic;\n }\n}\n\nfunction buildCubicList(features: Feature[], center: Point): Cubic[] {\n let splitStart: Cubic[] | null = null;\n let splitEnd: Cubic[] | null = null;\n\n if (features.length > 0 && features[0].cubics.length === 3) {\n const centerCubic = features[0].cubics[1];\n const [start, end] = centerCubic.split(0.5);\n splitStart = [features[0].cubics[0], start];\n splitEnd = [end, features[0].cubics[2]];\n }\n\n const state = {\n first: null as Cubic | null,\n last: null as Cubic | null,\n result: [] as Cubic[],\n };\n\n for (let i = 0; i <= features.length; i++) {\n const featureCubics = resolveFeatureCubics(\n features,\n i,\n splitStart,\n splitEnd\n );\n if (!featureCubics) {\n break;\n }\n for (const cubic of featureCubics) {\n processCubic(cubic, state);\n }\n }\n\n if (state.last && state.first) {\n state.result.push(\n new Cubic(\n state.last.anchor0X,\n state.last.anchor0Y,\n state.last.control0X,\n state.last.control0Y,\n state.last.control1X,\n state.last.control1Y,\n state.first.anchor0X,\n state.first.anchor0Y\n )\n );\n } else {\n state.result.push(Cubic.empty(center.x, center.y));\n }\n\n return state.result;\n}\n\nclass RoundedCorner {\n d1: Point;\n d2: Point;\n cornerRadius: number;\n smoothing: number;\n cosAngle: number;\n sinAngle: number;\n expectedRoundCut: number;\n center: Point = pt(0, 0);\n p0: Point;\n p1: Point;\n p2: Point;\n\n constructor(p0: Point, p1: Point, p2: Point, rounding: CornerRounding) {\n this.p0 = p0;\n this.p1 = p1;\n this.p2 = p2;\n const v01 = ptSub(p0, p1);\n const v21 = ptSub(p2, p1);\n const d01 = ptDistance(v01);\n const d21 = ptDistance(v21);\n\n if (d01 > 0 && d21 > 0) {\n this.d1 = ptDiv(v01, d01);\n this.d2 = ptDiv(v21, d21);\n this.cornerRadius = rounding.radius;\n this.smoothing = rounding.smoothing;\n this.cosAngle = ptDot(this.d1, this.d2);\n this.sinAngle = Math.sqrt(1 - square(this.cosAngle));\n this.expectedRoundCut =\n this.sinAngle > 1e-3\n ? (this.cornerRadius * (this.cosAngle + 1)) / this.sinAngle\n : 0;\n } else {\n this.d1 = pt(0, 0);\n this.d2 = pt(0, 0);\n this.cornerRadius = 0;\n this.smoothing = 0;\n this.cosAngle = 0;\n this.sinAngle = 0;\n this.expectedRoundCut = 0;\n }\n }\n\n get expectedCut(): number {\n return (1 + this.smoothing) * this.expectedRoundCut;\n }\n\n private calculateActualSmoothingValue(allowedCut: number): number {\n if (allowedCut > this.expectedCut) {\n return this.smoothing;\n }\n if (allowedCut > this.expectedRoundCut) {\n return (\n (this.smoothing * (allowedCut - this.expectedRoundCut)) /\n (this.expectedCut - this.expectedRoundCut)\n );\n }\n return 0;\n }\n\n private lineIntersection(\n p0: Point,\n d0: Point,\n p1: Point,\n d1: Point\n ): Point | null {\n const rotatedD1 = ptRotate90(d1);\n const den = ptDot(d0, rotatedD1);\n if (Math.abs(den) < distanceEpsilon) {\n return null;\n }\n const diff = ptSub(p1, p0);\n const num = ptDot(diff, rotatedD1);\n if (Math.abs(den) < distanceEpsilon * Math.abs(num)) {\n return null;\n }\n const k = num / den;\n return ptAdd(p0, ptMul(d0, k));\n }\n\n private computeFlankingCurve(\n actualRoundCut: number,\n actualSmoothingValues: number,\n corner: Point,\n sideStart: Point,\n circleSegmentIntersection: Point,\n otherCircleSegmentIntersection: Point,\n circleCenter: Point,\n actualR: number\n ): Cubic {\n const sideDirection = ptDirection(ptSub(sideStart, corner));\n const curveStart = ptAdd(\n corner,\n ptMul(sideDirection, actualRoundCut * (1 + actualSmoothingValues))\n );\n const p = interpolatePoint(\n circleSegmentIntersection,\n ptDiv(\n ptAdd(circleSegmentIntersection, otherCircleSegmentIntersection),\n 2\n ),\n actualSmoothingValues\n );\n const curveEnd = ptAdd(\n circleCenter,\n ptMul(\n directionVector(p.x - circleCenter.x, p.y - circleCenter.y),\n actualR\n )\n );\n const circleTangent = ptRotate90(ptSub(curveEnd, circleCenter));\n const anchorEnd =\n this.lineIntersection(\n sideStart,\n sideDirection,\n curveEnd,\n circleTangent\n ) ?? circleSegmentIntersection;\n const anchorStart = ptDiv(ptAdd(curveStart, ptMul(anchorEnd, 2)), 3);\n return new Cubic(\n curveStart.x,\n curveStart.y,\n anchorStart.x,\n anchorStart.y,\n anchorEnd.x,\n anchorEnd.y,\n curveEnd.x,\n curveEnd.y\n );\n }\n\n getCubics(allowedCut0: number, allowedCut1: number = allowedCut0): Cubic[] {\n const allowedCut = Math.min(allowedCut0, allowedCut1);\n if (\n this.expectedRoundCut < distanceEpsilon ||\n allowedCut < distanceEpsilon ||\n this.cornerRadius < distanceEpsilon\n ) {\n this.center = this.p1;\n return [Cubic.straightLine(this.p1.x, this.p1.y, this.p1.x, this.p1.y)];\n }\n\n const actualRoundCut = Math.min(allowedCut, this.expectedRoundCut);\n const actualSmoothing0 = this.calculateActualSmoothingValue(allowedCut0);\n const actualSmoothing1 = this.calculateActualSmoothingValue(allowedCut1);\n const actualR =\n this.cornerRadius * (actualRoundCut / this.expectedRoundCut);\n const centerDistance = Math.sqrt(square(actualR) + square(actualRoundCut));\n const halfDir = ptDiv(ptAdd(this.d1, this.d2), 2);\n const halfDirNorm = ptDirection(halfDir);\n this.center = ptAdd(this.p1, ptMul(halfDirNorm, centerDistance));\n const circleIntersection0 = ptAdd(this.p1, ptMul(this.d1, actualRoundCut));\n const circleIntersection2 = ptAdd(this.p1, ptMul(this.d2, actualRoundCut));\n\n const flanking0 = this.computeFlankingCurve(\n actualRoundCut,\n actualSmoothing0,\n this.p1,\n this.p0,\n circleIntersection0,\n circleIntersection2,\n this.center,\n actualR\n );\n const flanking2 = this.computeFlankingCurve(\n actualRoundCut,\n actualSmoothing1,\n this.p1,\n this.p2,\n circleIntersection2,\n circleIntersection0,\n this.center,\n actualR\n ).reverse();\n\n return [\n flanking0,\n Cubic.circularArc(\n this.center.x,\n this.center.y,\n flanking0.anchor1X,\n flanking0.anchor1Y,\n flanking2.anchor0X,\n flanking2.anchor0Y\n ),\n flanking2,\n ];\n }\n}\n\nfunction calculateCenter(vertices: number[]): Point {\n let cx = 0;\n let cy = 0;\n for (let i = 0; i < vertices.length; i += 2) {\n cx += vertices[i];\n cy += vertices[i + 1];\n }\n const n = vertices.length / 2;\n return pt(cx / n, cy / n);\n}\n\nfunction verticesFromNumVerts(\n numVertices: number,\n radius: number,\n centerX: number,\n centerY: number\n): number[] {\n const result: number[] = [];\n for (let i = 0; i < numVertices; i++) {\n const v = radialToCartesian(\n radius,\n (floatPi / numVertices) * 2 * i,\n pt(centerX, centerY)\n );\n result.push(v.x, v.y);\n }\n return result;\n}\n\nexport function createPolygonFromVertices(\n vertices: number[],\n rounding: CornerRounding = unrounded,\n perVertexRounding: CornerRounding[] | null = null,\n centerX: number = Number.MIN_VALUE,\n centerY: number = Number.MIN_VALUE\n): RoundedPolygon {\n const n = vertices.length / 2;\n const roundedCorners: RoundedCorner[] = [];\n\n for (let i = 0; i < n; i++) {\n const vtxRounding = perVertexRounding?.[i] ?? rounding;\n const prevIndex = ((i + n - 1) % n) * 2;\n const nextIndex = ((i + 1) % n) * 2;\n roundedCorners.push(\n new RoundedCorner(\n pt(vertices[prevIndex], vertices[prevIndex + 1]),\n pt(vertices[i * 2], vertices[i * 2 + 1]),\n pt(vertices[nextIndex], vertices[nextIndex + 1]),\n vtxRounding\n )\n );\n }\n\n // calc cut adjustments\n const cutAdjusts: [number, number][] = [];\n for (let ix = 0; ix < n; ix++) {\n const expectedRoundCut =\n roundedCorners[ix].expectedRoundCut +\n roundedCorners[(ix + 1) % n].expectedRoundCut;\n const expectedCut =\n roundedCorners[ix].expectedCut + roundedCorners[(ix + 1) % n].expectedCut;\n const vtxX = vertices[ix * 2];\n const vtxY = vertices[ix * 2 + 1];\n const nextVtxX = vertices[((ix + 1) % n) * 2];\n const nextVtxY = vertices[((ix + 1) % n) * 2 + 1];\n const sideSize = distance(vtxX - nextVtxX, vtxY - nextVtxY);\n\n if (expectedRoundCut > sideSize) {\n cutAdjusts.push([sideSize / expectedRoundCut, 0]);\n } else if (expectedCut > sideSize) {\n cutAdjusts.push([\n 1,\n (sideSize - expectedRoundCut) / (expectedCut - expectedRoundCut),\n ]);\n } else {\n cutAdjusts.push([1, 1]);\n }\n }\n\n const corners: Cubic[][] = [];\n for (let i = 0; i < n; i++) {\n const allowedCuts: number[] = [];\n for (let delta = 0; delta <= 1; delta++) {\n const [roundCutRatio, cutRatio] = cutAdjusts[(i + n - 1 + delta) % n];\n allowedCuts.push(\n roundedCorners[i].expectedRoundCut * roundCutRatio +\n (roundedCorners[i].expectedCut - roundedCorners[i].expectedRoundCut) *\n cutRatio\n );\n }\n corners.push(roundedCorners[i].getCubics(allowedCuts[0], allowedCuts[1]));\n }\n\n const tempFeatures: Feature[] = [];\n for (let i = 0; i < n; i++) {\n const prevVtxIndex = (i + n - 1) % n;\n const nextVtxIndex = (i + 1) % n;\n const currVertex = pt(vertices[i * 2], vertices[i * 2 + 1]);\n const prevVertex = pt(\n vertices[prevVtxIndex * 2],\n vertices[prevVtxIndex * 2 + 1]\n );\n const nextVertex = pt(\n vertices[nextVtxIndex * 2],\n vertices[nextVtxIndex * 2 + 1]\n );\n const isConvex = convexFn(prevVertex, currVertex, nextVertex);\n tempFeatures.push({ type: \"corner\", cubics: corners[i], convex: isConvex });\n tempFeatures.push({\n type: \"edge\",\n cubics: [\n Cubic.straightLine(\n corners[i][corners[i].length - 1].anchor1X,\n corners[i][corners[i].length - 1].anchor1Y,\n corners[(i + 1) % n][0].anchor0X,\n corners[(i + 1) % n][0].anchor0Y\n ),\n ],\n });\n }\n\n const center =\n centerX === Number.MIN_VALUE || centerY === Number.MIN_VALUE\n ? calculateCenter(vertices)\n : pt(centerX, centerY);\n\n return new RoundedPolygon(tempFeatures, center);\n}\n\nfunction convexFn(prev: Point, curr: Point, next: Point): boolean {\n const v1 = ptSub(curr, prev);\n const v2 = ptSub(next, curr);\n return v1.x * v2.y - v1.y * v2.x > 0;\n}\n\nexport function createPolygon(\n numVertices: number,\n radius = 1,\n centerX = 0,\n centerY = 0,\n rounding: CornerRounding = unrounded,\n perVertexRounding: CornerRounding[] | null = null\n): RoundedPolygon {\n const vertices = verticesFromNumVerts(numVertices, radius, centerX, centerY);\n return createPolygonFromVertices(\n vertices,\n rounding,\n perVertexRounding,\n centerX,\n centerY\n );\n}\n\nexport function createCircle(\n numVertices = 8,\n radius = 1,\n centerX = 0,\n centerY = 0\n): RoundedPolygon {\n const theta = floatPi / numVertices;\n const polygonRadius = radius / Math.cos(theta);\n return createPolygon(\n numVertices,\n polygonRadius,\n centerX,\n centerY,\n cornerRounding(radius)\n );\n}\n\nexport function createRectangle(\n width = 2,\n height = 2,\n rounding: CornerRounding = unrounded,\n perVertexRounding: CornerRounding[] | null = null,\n centerX = 0,\n centerY = 0\n): RoundedPolygon {\n const left = centerX - width / 2;\n const top = centerY - height / 2;\n const right = centerX + width / 2;\n const bottom = centerY + height / 2;\n return createPolygonFromVertices(\n [right, bottom, left, bottom, left, top, right, top],\n rounding,\n perVertexRounding,\n centerX,\n centerY\n );\n}\n\nfunction starVerticesFromNumVerts(\n numVerticesPerRadius: number,\n radius: number,\n innerRadius: number,\n centerX: number,\n centerY: number\n): number[] {\n const result: number[] = [];\n for (let i = 0; i < numVerticesPerRadius; i++) {\n let v = radialToCartesian(radius, (floatPi / numVerticesPerRadius) * 2 * i);\n result.push(v.x + centerX, v.y + centerY);\n v = radialToCartesian(\n innerRadius,\n (floatPi / numVerticesPerRadius) * (2 * i + 1)\n );\n result.push(v.x + centerX, v.y + centerY);\n }\n return result;\n}\n\nexport function createStar(\n numVerticesPerRadius: number,\n radius = 1,\n innerRadius = 0.5,\n rounding: CornerRounding = unrounded,\n innerRounding: CornerRounding | null = null,\n perVertexRounding: CornerRounding[] | null = null,\n centerX = 0,\n centerY = 0\n): RoundedPolygon {\n let pvRounding = perVertexRounding;\n if (!pvRounding && innerRounding) {\n pvRounding = [];\n for (let i = 0; i < numVerticesPerRadius; i++) {\n pvRounding.push(rounding, innerRounding);\n }\n }\n const vertices = starVerticesFromNumVerts(\n numVerticesPerRadius,\n radius,\n innerRadius,\n centerX,\n centerY\n );\n return createPolygonFromVertices(\n vertices,\n rounding,\n pvRounding,\n centerX,\n centerY\n );\n}\n","// Ported from AOSP MaterialShapes.kt\n\n// all 37 Material Design 3 predefined shapes\n\nimport {\n type CornerRounding,\n cornerRounding,\n createCircle,\n createPolygonFromVertices,\n createRectangle,\n createStar,\n type RoundedPolygon,\n unrounded,\n} from \"./polygon\";\nimport { floatPi } from \"./utils\";\n\n// helpers\n\ninterface PointNRound {\n x: number;\n y: number;\n r: CornerRounding;\n}\n\nfunction pnr(x: number, y: number, r: CornerRounding = unrounded): PointNRound {\n return { x, y, r };\n}\n\nfunction angleDegrees(x: number, y: number): number {\n return (Math.atan2(y, x) * 180) / floatPi;\n}\n\nfunction toRadians(degrees: number): number {\n return (degrees / 360) * 2 * floatPi;\n}\n\nfunction distancePt(x: number, y: number): number {\n return Math.sqrt(x * x + y * y);\n}\n\nfunction rotateDegrees(\n px: number,\n py: number,\n angle: number,\n cx = 0,\n cy = 0\n): [number, number] {\n const a = toRadians(angle);\n const ox = px - cx;\n const oy = py - cy;\n return [\n ox * Math.cos(a) - oy * Math.sin(a) + cx,\n ox * Math.sin(a) + oy * Math.cos(a) + cy,\n ];\n}\n\nfunction doRepeatMirrored(\n points: PointNRound[],\n reps: number,\n centerX: number,\n centerY: number\n): PointNRound[] {\n const angles = points.map((p) => angleDegrees(p.x - centerX, p.y - centerY));\n const distances = points.map((p) => distancePt(p.x - centerX, p.y - centerY));\n const actualReps = reps * 2;\n const sectionAngle = 360 / actualReps;\n const result: PointNRound[] = [];\n\n for (let it = 0; it < actualReps; it++) {\n const mirrored = it % 2 !== 0;\n for (let index = 0; index < points.length; index++) {\n const i = mirrored ? points.length - 1 - index : index;\n if (i > 0 || !mirrored) {\n const angleOffset = mirrored\n ? sectionAngle - angles[i] + 2 * angles[0]\n : angles[i];\n const a = toRadians(sectionAngle * it + angleOffset);\n const finalX = Math.cos(a) * distances[i] + centerX;\n const finalY = Math.sin(a) * distances[i] + centerY;\n result.push(pnr(finalX, finalY, points[i].r));\n }\n }\n }\n return result;\n}\n\nfunction doRepeatRotated(\n points: PointNRound[],\n reps: number,\n centerX: number,\n centerY: number\n): PointNRound[] {\n const np = points.length;\n const result: PointNRound[] = [];\n for (let it = 0; it < np * reps; it++) {\n const srcPoint = points[it % np];\n const [rx, ry] = rotateDegrees(\n srcPoint.x,\n srcPoint.y,\n Math.floor(it / np) * (360 / reps),\n centerX,\n centerY\n );\n result.push(pnr(rx, ry, srcPoint.r));\n }\n return result;\n}\n\nfunction doRepeat(\n points: PointNRound[],\n reps: number,\n centerX: number,\n centerY: number,\n mirroring: boolean\n): PointNRound[] {\n if (mirroring) {\n return doRepeatMirrored(points, reps, centerX, centerY);\n }\n return doRepeatRotated(points, reps, centerX, centerY);\n}\n\nfunction customPolygon(\n points: PointNRound[],\n reps: number,\n centerX = 0.5,\n centerY = 0.5,\n mirroring = false\n): RoundedPolygon {\n const actualPoints = doRepeat(points, reps, centerX, centerY, mirroring);\n const vertices: number[] = [];\n const pvRounding: CornerRounding[] = [];\n for (const p of actualPoints) {\n vertices.push(p.x, p.y);\n pvRounding.push(p.r);\n }\n return createPolygonFromVertices(\n vertices,\n unrounded,\n pvRounding,\n centerX,\n centerY\n );\n}\n\nfunction rotatePolygon(\n polygon: RoundedPolygon,\n degrees: number\n): RoundedPolygon {\n const rad = toRadians(degrees);\n const cos = Math.cos(rad);\n const sin = Math.sin(rad);\n return polygon.transformed((x, y) => ({\n x: x * cos - y * sin,\n y: x * sin + y * cos,\n }));\n}\n\n// shared rounding values\n\nconst r15 = cornerRounding(0.15);\nconst r20 = cornerRounding(0.2);\nconst r30 = cornerRounding(0.3);\nconst r50 = cornerRounding(0.5);\nconst r100 = cornerRounding(1);\n\n// shape factory func\n\nfunction circle(): RoundedPolygon {\n return createCircle(10);\n}\n\nfunction square(): RoundedPolygon {\n return createRectangle(1, 1, r30);\n}\n\nfunction slanted(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.926, 0.97, cornerRounding(0.189, 0.811)),\n pnr(-0.021, 0.967, cornerRounding(0.187, 0.057)),\n ],\n 2\n );\n}\n\nfunction arch(): RoundedPolygon {\n return rotatePolygon(\n createPolygonFromVertices(\n // 4 vertices for a square, manually positioning\n (() => {\n const r = 1;\n const verts: number[] = [];\n for (let i = 0; i < 4; i++) {\n const angle = (floatPi / 4) * 2 * i;\n verts.push(Math.cos(angle) * r, Math.sin(angle) * r);\n }\n return verts;\n })(),\n unrounded,\n [r100, r100, r20, r20],\n 0,\n 0\n ),\n -135\n );\n}\n\nfunction fan(): RoundedPolygon {\n return customPolygon(\n [\n pnr(1.004, 1.0, cornerRounding(0.148, 0.417)),\n pnr(0.0, 1.0, cornerRounding(0.151)),\n pnr(0.0, -0.003, cornerRounding(0.148)),\n pnr(0.978, 0.02, cornerRounding(0.803)),\n ],\n 1\n );\n}\n\nfunction arrow(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.5, 0.892, cornerRounding(0.313)),\n pnr(-0.216, 1.05, cornerRounding(0.207)),\n pnr(0.499, -0.16, cornerRounding(0.215, 1.0)),\n pnr(1.225, 1.06, cornerRounding(0.211)),\n ],\n 1\n );\n}\n\nfunction semiCircle(): RoundedPolygon {\n return createRectangle(1.6, 1, unrounded, [r20, r20, r100, r100]);\n}\n\nfunction oval(): RoundedPolygon {\n const scaled = createCircle().transformed((x, y) => ({ x, y: y * 0.64 }));\n return rotatePolygon(scaled, -45);\n}\n\nfunction pill(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.961, 0.039, cornerRounding(0.426)),\n pnr(1.001, 0.428),\n pnr(1.0, 0.609, cornerRounding(1.0)),\n ],\n 2,\n 0.5,\n 0.5,\n true\n );\n}\n\nfunction triangle(): RoundedPolygon {\n return rotatePolygon(\n createPolygonFromVertices(\n (() => {\n const verts: number[] = [];\n for (let i = 0; i < 3; i++) {\n verts.push(\n Math.cos((floatPi / 3) * 2 * i),\n Math.sin((floatPi / 3) * 2 * i)\n );\n }\n return verts;\n })(),\n r20,\n null,\n 0,\n 0\n ),\n -90\n );\n}\n\nfunction diamond(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.5, 1.096, cornerRounding(0.151, 0.524)),\n pnr(0.04, 0.5, cornerRounding(0.159)),\n ],\n 2\n );\n}\n\nfunction clamShell(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.171, 0.841, cornerRounding(0.159)),\n pnr(-0.02, 0.5, cornerRounding(0.14)),\n pnr(0.17, 0.159, cornerRounding(0.159)),\n ],\n 2\n );\n}\n\nfunction pentagon(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.5, -0.009, cornerRounding(0.172)),\n pnr(1.03, 0.365, cornerRounding(0.164)),\n pnr(0.828, 0.97, cornerRounding(0.169)),\n ],\n 1,\n 0.5,\n 0.5,\n true\n );\n}\n\nfunction gem(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.499, 1.023, cornerRounding(0.241, 0.778)),\n pnr(-0.005, 0.792, cornerRounding(0.208)),\n pnr(0.073, 0.258, cornerRounding(0.228)),\n pnr(0.433, 0.0, cornerRounding(0.491)),\n ],\n 1,\n 0.5,\n 0.5,\n true\n );\n}\n\nfunction sunny(): RoundedPolygon {\n return createStar(8, 1, 0.8, r15);\n}\n\nfunction verySunny(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.5, 1.08, cornerRounding(0.085)),\n pnr(0.358, 0.843, cornerRounding(0.085)),\n ],\n 8\n );\n}\n\nfunction cookie4(): RoundedPolygon {\n return customPolygon(\n [\n pnr(1.237, 1.236, cornerRounding(0.258)),\n pnr(0.5, 0.918, cornerRounding(0.233)),\n ],\n 4\n );\n}\n\nfunction cookie6(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.723, 0.884, cornerRounding(0.394)),\n pnr(0.5, 1.099, cornerRounding(0.398)),\n ],\n 6\n );\n}\n\nfunction cookie7(): RoundedPolygon {\n return rotatePolygon(createStar(7, 1, 0.75, r50), -90);\n}\n\nfunction cookie9(): RoundedPolygon {\n return rotatePolygon(createStar(9, 1, 0.8, r50), -90);\n}\n\nfunction cookie12(): RoundedPolygon {\n return rotatePolygon(createStar(12, 1, 0.8, r50), -90);\n}\n\nfunction ghostish(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.5, 0, cornerRounding(1.0)),\n pnr(1, 0, cornerRounding(1.0)),\n pnr(1, 1.14, cornerRounding(0.254, 0.106)),\n pnr(0.575, 0.906, cornerRounding(0.253)),\n ],\n 1,\n 0.5,\n 0.5,\n true\n );\n}\n\nfunction clover4(): RoundedPolygon {\n return customPolygon(\n [pnr(0.5, 0.074), pnr(0.725, -0.099, cornerRounding(0.476))],\n 4,\n 0.5,\n 0.5,\n true\n );\n}\n\nfunction clover8(): RoundedPolygon {\n return customPolygon(\n [pnr(0.5, 0.036), pnr(0.758, -0.101, cornerRounding(0.209))],\n 8\n );\n}\n\nfunction burst(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.5, -0.006, cornerRounding(0.006)),\n pnr(0.592, 0.158, cornerRounding(0.006)),\n ],\n 12\n );\n}\n\nfunction softBurst(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.193, 0.277, cornerRounding(0.053)),\n pnr(0.176, 0.055, cornerRounding(0.053)),\n ],\n 10\n );\n}\n\nfunction boom(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.457, 0.296, cornerRounding(0.007)),\n pnr(0.5, -0.051, cornerRounding(0.007)),\n ],\n 15\n );\n}\n\nfunction softBoom(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.733, 0.454),\n pnr(0.839, 0.437, cornerRounding(0.532)),\n pnr(0.949, 0.449, cornerRounding(0.439, 1.0)),\n pnr(0.998, 0.478, cornerRounding(0.174)),\n ],\n 16,\n 0.5,\n 0.5,\n true\n );\n}\n\nfunction flower(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.37, 0.187),\n pnr(0.416, 0.049, cornerRounding(0.381)),\n pnr(0.479, 0.001, cornerRounding(0.095)),\n ],\n 8,\n 0.5,\n 0.5,\n true\n );\n}\n\nfunction puffy(): RoundedPolygon {\n const base = customPolygon(\n [\n pnr(0.5, 0.053),\n pnr(0.545, -0.04, cornerRounding(0.405)),\n pnr(0.67, -0.035, cornerRounding(0.426)),\n pnr(0.717, 0.066, cornerRounding(0.574)),\n pnr(0.722, 0.128),\n pnr(0.777, 0.002, cornerRounding(0.36)),\n pnr(0.914, 0.149, cornerRounding(0.66)),\n pnr(0.926, 0.289, cornerRounding(0.66)),\n pnr(0.881, 0.346),\n pnr(0.94, 0.344, cornerRounding(0.126)),\n pnr(1.003, 0.437, cornerRounding(0.255)),\n ],\n 2,\n 0.5,\n 0.5,\n true\n );\n return base.transformed((x, y) => ({ x, y: y * 0.742 }));\n}\n\nfunction puffyDiamond(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.87, 0.13, cornerRounding(0.146)),\n pnr(0.818, 0.357),\n pnr(1.0, 0.332, cornerRounding(0.853)),\n ],\n 4,\n 0.5,\n 0.5,\n true\n );\n}\n\nfunction pixelCircle(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.5, 0.0),\n pnr(0.704, 0.0),\n pnr(0.704, 0.065),\n pnr(0.843, 0.065),\n pnr(0.843, 0.148),\n pnr(0.926, 0.148),\n pnr(0.926, 0.296),\n pnr(1.0, 0.296),\n ],\n 2,\n 0.5,\n 0.5,\n true\n );\n}\n\nfunction pixelTriangle(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.11, 0.5),\n pnr(0.113, 0.0),\n pnr(0.287, 0.0),\n pnr(0.287, 0.087),\n pnr(0.421, 0.087),\n pnr(0.421, 0.17),\n pnr(0.56, 0.17),\n pnr(0.56, 0.265),\n pnr(0.674, 0.265),\n pnr(0.675, 0.344),\n pnr(0.789, 0.344),\n pnr(0.789, 0.439),\n pnr(0.888, 0.439),\n ],\n 1,\n 0.5,\n 0.5,\n true\n );\n}\n\nfunction bun(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.796, 0.5),\n pnr(0.853, 0.518, cornerRounding(1)),\n pnr(0.992, 0.631, cornerRounding(1)),\n pnr(0.968, 1.0, cornerRounding(1)),\n ],\n 2,\n 0.5,\n 0.5,\n true\n );\n}\n\nfunction heart(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.5, 0.268, cornerRounding(0.016)),\n pnr(0.792, -0.066, cornerRounding(0.958)),\n pnr(1.064, 0.276, cornerRounding(1.0)),\n pnr(0.501, 0.946, cornerRounding(0.129)),\n ],\n 1,\n 0.5,\n 0.5,\n true\n );\n}\n\ntype ShapeFactory = () => RoundedPolygon;\n\nconst shapeFactories = {\n Circle: circle,\n Square: square,\n Slanted: slanted,\n Arch: arch,\n Fan: fan,\n Arrow: arrow,\n SemiCircle: semiCircle,\n Oval: oval,\n Pill: pill,\n Triangle: triangle,\n Diamond: diamond,\n ClamShell: clamShell,\n Pentagon: pentagon,\n Gem: gem,\n Sunny: sunny,\n VerySunny: verySunny,\n Cookie4Sided: cookie4,\n Cookie6Sided: cookie6,\n Cookie7Sided: cookie7,\n Cookie9Sided: cookie9,\n Cookie12Sided: cookie12,\n Ghostish: ghostish,\n Clover4Leaf: clover4,\n Clover8Leaf: clover8,\n Burst: burst,\n SoftBurst: softBurst,\n Boom: boom,\n SoftBoom: softBoom,\n Flower: flower,\n Puffy: puffy,\n PuffyDiamond: puffyDiamond,\n PixelCircle: pixelCircle,\n PixelTriangle: pixelTriangle,\n Bun: bun,\n Heart: heart,\n} satisfies Record<string, ShapeFactory>;\n\nexport type ShapeName = keyof typeof shapeFactories;\n\nexport const shapeNames: ShapeName[] = Object.keys(\n shapeFactories\n) as ShapeName[];\n\nconst cache = new Map<ShapeName, RoundedPolygon>();\n\nexport function getShape(name: ShapeName): RoundedPolygon {\n let shape = cache.get(name);\n if (!shape) {\n const factory = shapeFactories[name];\n shape = factory().normalized();\n cache.set(name, shape);\n }\n return shape;\n}\n","// Ported from AOSP androidx.graphics.shapes.Morph\n\nimport { Cubic, type Feature } from \"./cubic\";\nimport type { RoundedPolygon } from \"./polygon\";\nimport {\n angleEpsilon,\n distanceEpsilon,\n interpolate,\n type Point,\n positiveModulo,\n pt,\n ptDistance,\n ptSub,\n} from \"./utils\";\n\n// measurer\n\ninterface Measurer {\n measureCubic(c: Cubic): number;\n findCubicCutPoint(c: Cubic, m: number): number;\n}\n\nclass LengthMeasurer implements Measurer {\n private readonly segments = 3;\n\n measureCubic(c: Cubic): number {\n return this.closestProgressTo(c, Number.POSITIVE_INFINITY)[1];\n }\n\n findCubicCutPoint(c: Cubic, m: number): number {\n return this.closestProgressTo(c, m)[0];\n }\n\n private closestProgressTo(cubic: Cubic, threshold: number): [number, number] {\n let total = 0;\n let remainder = threshold;\n let prev: Point = pt(cubic.anchor0X, cubic.anchor0Y);\n\n for (let i = 1; i <= this.segments; i++) {\n const progress = i / this.segments;\n const point = cubic.pointOnCurve(progress);\n const segment = ptDistance(ptSub(point, prev));\n\n if (segment >= remainder) {\n return [\n progress - (1.0 - remainder / segment) / this.segments,\n threshold,\n ];\n }\n remainder -= segment;\n total += segment;\n prev = point;\n }\n return [1.0, total];\n }\n}\n\n// measured polygon\n\ninterface ProgressableFeature {\n progress: number;\n feature: Feature;\n}\n\ninterface MeasuredCubic {\n cubic: Cubic;\n startOutlineProgress: number;\n endOutlineProgress: number;\n measuredSize: number;\n}\n\ninterface MeasuredPolygon {\n cubics: MeasuredCubic[];\n features: ProgressableFeature[];\n measurer: Measurer;\n}\n\nfunction cutMeasuredCubicAtProgress(\n mc: MeasuredCubic,\n cutOutlineProgress: number,\n measurer: Measurer\n): [MeasuredCubic, MeasuredCubic] {\n const bounded = Math.max(\n mc.startOutlineProgress,\n Math.min(mc.endOutlineProgress, cutOutlineProgress)\n );\n const outlineProgressSize = mc.endOutlineProgress - mc.startOutlineProgress;\n const progressFromStart = bounded - mc.startOutlineProgress;\n const relativeProgress = progressFromStart / outlineProgressSize;\n const t = measurer.findCubicCutPoint(\n mc.cubic,\n relativeProgress * mc.measuredSize\n );\n\n const [c1, c2] = mc.cubic.split(t);\n return [\n {\n cubic: c1,\n startOutlineProgress: mc.startOutlineProgress,\n endOutlineProgress: bounded,\n measuredSize: measurer.measureCubic(c1),\n },\n {\n cubic: c2,\n startOutlineProgress: bounded,\n endOutlineProgress: mc.endOutlineProgress,\n measuredSize: measurer.measureCubic(c2),\n },\n ];\n}\n\nfunction measurePolygon(\n measurer: Measurer,\n polygon: RoundedPolygon\n): MeasuredPolygon {\n const cubics: Cubic[] = [];\n const featureToCubic: [Feature, number][] = [];\n\n for (const feature of polygon.features) {\n for (let cubicIndex = 0; cubicIndex < feature.cubics.length; cubicIndex++) {\n if (\n feature.type === \"corner\" &&\n cubicIndex === Math.floor(feature.cubics.length / 2)\n ) {\n featureToCubic.push([feature, cubics.length]);\n }\n cubics.push(feature.cubics[cubicIndex]);\n }\n }\n\n const measures: number[] = [0];\n let cumulative = 0;\n for (const cubic of cubics) {\n const m = measurer.measureCubic(cubic);\n cumulative += m;\n measures.push(cumulative);\n }\n const totalMeasure = cumulative;\n\n const outlineProgress = measures.map((m) => m / totalMeasure);\n\n const features: ProgressableFeature[] = featureToCubic.map(\n ([feature, ix]) => ({\n progress: positiveModulo(\n (outlineProgress[ix] + outlineProgress[ix + 1]) / 2,\n 1\n ),\n feature,\n })\n );\n\n // build measured cubics, filtering empty ones\n const measuredCubics: MeasuredCubic[] = [];\n let startProgress = 0;\n for (let i = 0; i < cubics.length; i++) {\n if (outlineProgress[i + 1] - outlineProgress[i] > distanceEpsilon) {\n measuredCubics.push({\n cubic: cubics[i],\n startOutlineProgress: startProgress,\n endOutlineProgress: outlineProgress[i + 1],\n measuredSize: measurer.measureCubic(cubics[i]),\n });\n startProgress = outlineProgress[i + 1];\n }\n }\n // ensure last ends at 1\n const lastMeasured = measuredCubics.at(-1);\n if (lastMeasured) {\n lastMeasured.endOutlineProgress = 1;\n }\n\n return { cubics: measuredCubics, features, measurer };\n}\n\nfunction cutAndShift(\n mp: MeasuredPolygon,\n cuttingPoint: number\n): MeasuredPolygon {\n if (cuttingPoint < distanceEpsilon) {\n return mp;\n }\n\n const cubics = mp.cubics;\n let targetIndex = cubics.findIndex(\n (c) =>\n cuttingPoint >= c.startOutlineProgress &&\n cuttingPoint <= c.endOutlineProgress\n );\n if (targetIndex === -1) {\n targetIndex = cubics.length - 1;\n }\n\n const [b1, b2] = cutMeasuredCubicAtProgress(\n cubics[targetIndex],\n cuttingPoint,\n mp.measurer\n );\n\n const retCubics: Cubic[] = [b2.cubic];\n for (let i = 1; i < cubics.length; i++) {\n retCubics.push(cubics[(i + targetIndex) % cubics.length].cubic);\n }\n retCubics.push(b1.cubic);\n\n // build outline progress\n const retOutlineProgress: number[] = [];\n for (let index = 0; index < cubics.length + 2; index++) {\n if (index === 0) {\n retOutlineProgress.push(0);\n } else if (index === cubics.length + 1) {\n retOutlineProgress.push(1);\n } else {\n const cubicIndex = (targetIndex + index - 1) % cubics.length;\n retOutlineProgress.push(\n positiveModulo(cubics[cubicIndex].endOutlineProgress - cuttingPoint, 1)\n );\n }\n }\n\n // shift features\n const newFeatures: ProgressableFeature[] = mp.features.map((f) => ({\n progress: positiveModulo(f.progress - cuttingPoint, 1),\n feature: f.feature,\n }));\n\n const measuredCubics: MeasuredCubic[] = [];\n let startProgress = 0;\n for (let i = 0; i < retCubics.length; i++) {\n if (retOutlineProgress[i + 1] - retOutlineProgress[i] > distanceEpsilon) {\n measuredCubics.push({\n cubic: retCubics[i],\n startOutlineProgress: startProgress,\n endOutlineProgress: retOutlineProgress[i + 1],\n measuredSize: mp.measurer.measureCubic(retCubics[i]),\n });\n startProgress = retOutlineProgress[i + 1];\n }\n }\n const lastCut = measuredCubics.at(-1);\n if (lastCut) {\n lastCut.endOutlineProgress = 1;\n }\n\n return {\n cubics: measuredCubics,\n features: newFeatures,\n measurer: mp.measurer,\n };\n}\n\n// float mapping / double mapper\n\nfunction progressInRange(progress: number, from: number, to: number): boolean {\n if (to >= from) {\n return progress >= from && progress <= to;\n }\n return progress >= from || progress <= to;\n}\n\nfunction progressDistance(p1: number, p2: number): number {\n const d = Math.abs(p1 - p2);\n return Math.min(d, 1 - d);\n}\n\nfunction linearMap(xValues: number[], yValues: number[], x: number): number {\n let segStartIndex = 0;\n for (let i = 0; i < xValues.length; i++) {\n if (progressInRange(x, xValues[i], xValues[(i + 1) % xValues.length])) {\n segStartIndex = i;\n break;\n }\n }\n const segEndIndex = (segStartIndex + 1) % xValues.length;\n const segSizeX = positiveModulo(\n xValues[segEndIndex] - xValues[segStartIndex],\n 1\n );\n const segSizeY = positiveModulo(\n yValues[segEndIndex] - yValues[segStartIndex],\n 1\n );\n const posInSeg =\n segSizeX < 0.001\n ? 0.5\n : positiveModulo(x - xValues[segStartIndex], 1) / segSizeX;\n return positiveModulo(yValues[segStartIndex] + segSizeY * posInSeg, 1);\n}\n\nclass DoubleMapper {\n private readonly sourceValues: number[];\n private readonly targetValues: number[];\n\n constructor(mappings: [number, number][]) {\n this.sourceValues = mappings.map((m) => m[0]);\n this.targetValues = mappings.map((m) => m[1]);\n }\n\n map(x: number): number {\n return linearMap(this.sourceValues, this.targetValues, x);\n }\n\n mapBack(x: number): number {\n return linearMap(this.targetValues, this.sourceValues, x);\n }\n\n static Identity = new DoubleMapper([\n [0, 0],\n [0.5, 0.5],\n ]);\n}\n\n// feature mapping\n\nfunction featureRepresentativePoint(f: Feature): Point {\n const first = f.cubics[0];\n const last = f.cubics.at(-1) ?? first;\n return pt(\n (first.anchor0X + last.anchor1X) / 2,\n (first.anchor0Y + last.anchor1Y) / 2\n );\n}\n\nfunction featureDistSquared(f1: Feature, f2: Feature): number {\n if (f1.type === \"corner\" && f2.type === \"corner\" && f1.convex !== f2.convex) {\n return Number.MAX_VALUE;\n }\n const p1 = featureRepresentativePoint(f1);\n const p2 = featureRepresentativePoint(f2);\n const d = ptSub(p1, p2);\n return d.x * d.x + d.y * d.y;\n}\n\nfunction buildCandidateList(\n features1: ProgressableFeature[],\n features2: ProgressableFeature[]\n): { distance: number; f1: ProgressableFeature; f2: ProgressableFeature }[] {\n const result: {\n distance: number;\n f1: ProgressableFeature;\n f2: ProgressableFeature;\n }[] = [];\n for (const f1 of features1) {\n for (const f2 of features2) {\n const d = featureDistSquared(f1.feature, f2.feature);\n if (d !== Number.MAX_VALUE) {\n result.push({ distance: d, f1, f2 });\n }\n }\n }\n result.sort((a, b) => a.distance - b.distance);\n return result;\n}\n\nfunction canInsertMapping(\n mapping: [number, number][],\n insertionIndex: number,\n p1: number,\n p2: number\n): boolean {\n const n = mapping.length;\n if (n === 0) {\n return true;\n }\n const [before1, before2] = mapping[(insertionIndex + n - 1) % n];\n const [after1, after2] = mapping[insertionIndex % n];\n\n if (\n progressDistance(p1, before1) < distanceEpsilon ||\n progressDistance(p1, after1) < distanceEpsilon ||\n progressDistance(p2, before2) < distanceEpsilon ||\n progressDistance(p2, after2) < distanceEpsilon\n ) {\n return false;\n }\n\n return n <= 1 || progressInRange(p2, before2, after2);\n}\n\nfunction doMapping(\n features1: ProgressableFeature[],\n features2: ProgressableFeature[]\n): [number, number][] {\n const candidates = buildCandidateList(features1, features2);\n\n if (candidates.length === 0) {\n return [\n [0, 0],\n [0.5, 0.5],\n ];\n }\n\n if (candidates.length === 1) {\n const dv = candidates[0];\n return [\n [dv.f1.progress, dv.f2.progress],\n [(dv.f1.progress + 0.5) % 1, (dv.f2.progress + 0.5) % 1],\n ];\n }\n\n const mapping: [number, number][] = [];\n const usedF1 = new Set<ProgressableFeature>();\n const usedF2 = new Set<ProgressableFeature>();\n\n for (const dv of candidates) {\n if (usedF1.has(dv.f1) || usedF2.has(dv.f2)) {\n continue;\n }\n\n let insertionIndex = 0;\n for (let i = 0; i < mapping.length; i++) {\n if (mapping[i][0] < dv.f1.progress) {\n insertionIndex = i + 1;\n }\n }\n\n if (\n !canInsertMapping(mapping, insertionIndex, dv.f1.progress, dv.f2.progress)\n ) {\n continue;\n }\n\n mapping.splice(insertionIndex, 0, [dv.f1.progress, dv.f2.progress]);\n usedF1.add(dv.f1);\n usedF2.add(dv.f2);\n }\n\n return mapping;\n}\n\nfunction featureMapper(\n features1: ProgressableFeature[],\n features2: ProgressableFeature[]\n): DoubleMapper {\n const filtered1 = features1.filter((f) => f.feature.type === \"corner\");\n const filtered2 = features2.filter((f) => f.feature.type === \"corner\");\n const mapping = doMapping(filtered1, filtered2);\n return new DoubleMapper(mapping);\n}\n\nexport class Morph {\n private readonly morphMatch: [Cubic, Cubic][];\n\n constructor(start: RoundedPolygon, end: RoundedPolygon) {\n this.morphMatch = matchPolygons(start, end);\n }\n\n asCubics(progress: number): Cubic[] {\n const result: Cubic[] = [];\n let firstCubic: Cubic | null = null;\n let lastCubic: Cubic | null = null;\n\n for (const [a, b] of this.morphMatch) {\n const points = new Float64Array(8);\n for (let j = 0; j < 8; j++) {\n points[j] = interpolate(a.points[j], b.points[j], progress);\n }\n const cubic = new Cubic(points);\n if (!firstCubic) {\n firstCubic = cubic;\n }\n if (lastCubic) {\n result.push(lastCubic);\n }\n lastCubic = cubic;\n }\n\n if (lastCubic && firstCubic) {\n result.push(\n new Cubic(\n lastCubic.anchor0X,\n lastCubic.anchor0Y,\n lastCubic.control0X,\n lastCubic.control0Y,\n lastCubic.control1X,\n lastCubic.control1Y,\n firstCubic.anchor0X,\n firstCubic.anchor0Y\n )\n );\n }\n\n return result;\n }\n}\n\nfunction matchPolygons(\n p1: RoundedPolygon,\n p2: RoundedPolygon\n): [Cubic, Cubic][] {\n const measurer = new LengthMeasurer();\n const measuredPolygon1 = measurePolygon(measurer, p1);\n const measuredPolygon2 = measurePolygon(measurer, p2);\n\n const doubleMapper = featureMapper(\n measuredPolygon1.features,\n measuredPolygon2.features\n );\n\n const polygon2CutPoint = doubleMapper.map(0);\n\n const bs1 = measuredPolygon1;\n const bs2 = cutAndShift(measuredPolygon2, polygon2CutPoint);\n\n const ret: [Cubic, Cubic][] = [];\n let i1 = 0;\n let i2 = 0;\n let b1: MeasuredCubic | null = bs1.cubics[i1++] ?? null;\n let b2: MeasuredCubic | null = bs2.cubics[i2++] ?? null;\n\n while (b1 !== null && b2 !== null) {\n const b1a = i1 === bs1.cubics.length ? 1 : b1.endOutlineProgress;\n const b2a =\n i2 === bs2.cubics.length\n ? 1\n : doubleMapper.mapBack(\n positiveModulo(b2.endOutlineProgress + polygon2CutPoint, 1)\n );\n\n const minb = Math.min(b1a, b2a);\n\n let seg1: MeasuredCubic;\n let newb1: MeasuredCubic | null;\n if (b1a > minb + angleEpsilon) {\n const [s, n] = cutMeasuredCubicAtProgress(b1, minb, measurer);\n seg1 = s;\n newb1 = n;\n } else {\n seg1 = b1;\n newb1 = bs1.cubics[i1++] ?? null;\n }\n\n let seg2: MeasuredCubic;\n let newb2: MeasuredCubic | null;\n if (b2a > minb + angleEpsilon) {\n const [s, n] = cutMeasuredCubicAtProgress(\n b2,\n positiveModulo(doubleMapper.map(minb) - polygon2CutPoint, 1),\n measurer\n );\n seg2 = s;\n newb2 = n;\n } else {\n seg2 = b2;\n newb2 = bs2.cubics[i2++] ?? null;\n }\n\n ret.push([seg1.cubic, seg2.cubic]);\n b1 = newb1;\n b2 = newb2;\n }\n\n return ret;\n}\n","import type { Cubic } from \"../core/cubic\";\nimport { Morph } from \"../core/morph\";\nimport type { RoundedPolygon } from \"../core/polygon\";\n\n/**\n * Convert cubics to a CSS `clip-path: path(\"...\")` value.\n *\n * Uses SVG path syntax inside clip-path. Note that CSS cannot\n * transition between different `path()` values — use `toClipPathPolygon`\n * for animatable shapes.\n */\nexport function toClipPathPath(cubics: Cubic[], size = 100): string {\n if (cubics.length === 0) {\n return 'path(\"\")';\n }\n\n const s = size;\n let d = `M${(cubics[0].anchor0X * s).toFixed(2)},${(cubics[0].anchor0Y * s).toFixed(2)}`;\n\n for (const c of cubics) {\n d += `C${(c.control0X * s).toFixed(2)},${(c.control0Y * s).toFixed(2)} ${(c.control1X * s).toFixed(2)},${(c.control1Y * s).toFixed(2)} ${(c.anchor1X * s).toFixed(2)},${(c.anchor1Y * s).toFixed(2)}`;\n }\n\n d += \"Z\";\n return `path(\"${d}\")`;\n}\n\n/**\n * Sample points along cubic bezier curves to produce a\n * CSS `clip-path: polygon(...)` value using percentage coordinates.\n *\n * This is the key function for CSS transitions with Tailwind.\n * CSS can transition between `polygon()` values that have the same\n * number of vertices. By using a fixed `samplesPerCubic`, all shapes\n * from the same `Morph` produce polygons with identical vertex counts,\n * enabling pure-CSS morphing:\n *\n * ```\n * const morph = new Morph(getShape('Circle'), getShape('Heart'));\n * const start = toClipPathPolygon(morph.asCubics(0));\n * const end = toClipPathPolygon(morph.asCubics(1));\n * // Both have the same vertex count → CSS can transition between them\n * ```\n *\n * @param cubics - Array of Cubic bezier curves (normalized 0–1)\n * @param samplesPerCubic - Points to sample per cubic segment (default 4)\n * @returns CSS `polygon(...)` string with percentage coordinates\n */\nexport function toClipPathPolygon(\n cubics: Cubic[],\n samplesPerCubic = 4\n): string {\n if (cubics.length === 0) {\n return \"polygon(0% 0%)\";\n }\n\n const points: string[] = [];\n\n for (const cubic of cubics) {\n for (let i = 0; i < samplesPerCubic; i++) {\n const t = i / samplesPerCubic;\n const point = cubic.pointOnCurve(t);\n points.push(\n `${(point.x * 100).toFixed(2)}% ${(point.y * 100).toFixed(2)}%`\n );\n }\n }\n\n return `polygon(${points.join(\",\")})`;\n}\n\n/**\n * Pre-compute a pair of `polygon()` strings from two shapes that are\n * guaranteed to have the same vertex count. This enables pure-CSS\n * transitions between the two shapes.\n *\n * The `Morph` class internally aligns both shapes so they have the same\n * number of cubic segments. Evaluating at progress 0 and 1 gives two\n * cubic arrays with identical segment counts, which produce polygon\n * strings with identical vertex counts when sampled.\n *\n * ```tsx\n * const [from, to] = toMorphPair(getShape('Circle'), getShape('Heart'));\n * // Use as: style={{ clipPath: from }}\n * // Hover: style={{ clipPath: to }}\n * // With: transition: clip-path 500ms ease\n * ```\n *\n * @param start - The starting shape\n * @param end - The ending shape\n * @param samplesPerCubic - Points to sample per cubic segment (default 4)\n * @returns A tuple of [startPolygon, endPolygon] CSS `polygon()` strings\n */\nexport function toMorphPair(\n start: RoundedPolygon,\n end: RoundedPolygon,\n samplesPerCubic = 4\n): [string, string] {\n const morph = new Morph(start, end);\n return [\n toClipPathPolygon(morph.asCubics(0), samplesPerCubic),\n toClipPathPolygon(morph.asCubics(1), samplesPerCubic),\n ];\n}\n","import type { Cubic } from \"../core/cubic\";\nimport type { RoundedPolygon } from \"../core/polygon\";\n\n/**\n * Convert an array of Cubics to an SVG path `d` attribute string.\n *\n * Each Cubic stores four points: anchor0 (start), control0, control1,\n * anchor1 (end). These map to the SVG cubic bezier command:\n * C control0X,control0Y control1X,control1Y anchor1X,anchor1Y\n *\n * Shapes from `getShape()` are normalized to 0–1 coordinates.\n * The `size` parameter scales them to pixel/viewBox space.\n */\nexport function toPathD(cubics: Cubic[], size = 100): string {\n if (cubics.length === 0) {\n return \"\";\n }\n\n const s = size;\n const parts: string[] = [\n `M${(cubics[0].anchor0X * s).toFixed(2)},${(cubics[0].anchor0Y * s).toFixed(2)}`,\n ];\n\n for (const c of cubics) {\n parts.push(\n `C${(c.control0X * s).toFixed(2)},${(c.control0Y * s).toFixed(2)} ${(c.control1X * s).toFixed(2)},${(c.control1Y * s).toFixed(2)} ${(c.anchor1X * s).toFixed(2)},${(c.anchor1Y * s).toFixed(2)}`\n );\n }\n\n parts.push(\"Z\");\n return parts.join(\"\");\n}\n\n/**\n * Convert a RoundedPolygon to an SVG path `d` attribute string.\n */\nexport function toSvgPath(polygon: RoundedPolygon, size = 100): string {\n return toPathD(polygon.cubics, size);\n}\n"]}
|