loomlarge 0.1.6 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/engines/three/AnimationThree.ts","../src/presets/cc4.ts","../src/engines/three/LoomLargeThree.ts","../src/physics/HairPhysics.ts"],"names":["Clock"],"mappings":";;;;;;;;;;;AAsBA,IAAM,aAAA,GAAgB,CAAC,CAAA,KAAe,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,EAAA,GAAA,CAAM,CAAA,GAAI,CAAA,GAAI,CAAA,IAAK,CAAA;AAExE,IAAM,iBAAN,MAA0C;AAAA,EAA1C,WAAA,GAAA;AACL,IAAA,aAAA,CAAA,IAAA,EAAQ,aAAA,sBAAkB,GAAA,EAAwB,CAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOlD,KAAK,SAAA,EAAyB;AAC5B,IAAA,IAAI,aAAa,CAAA,EAAG;AAEpB,IAAA,MAAM,YAAsB,EAAC;AAE7B,IAAA,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA,EAAG,GAAA,KAAQ;AAEnC,MAAA,IAAI,EAAE,MAAA,EAAQ;AAEd,MAAA,CAAA,CAAE,OAAA,IAAW,SAAA;AACb,MAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,EAAE,OAAA,GAAU,CAAA,CAAE,UAAU,CAAG,CAAA;AACrD,MAAA,MAAM,aAAA,GAAgB,CAAA,CAAE,MAAA,CAAO,QAAQ,CAAA;AAGvC,MAAA,MAAM,QAAQ,CAAA,CAAE,IAAA,GAAA,CAAQ,CAAA,CAAE,EAAA,GAAK,EAAE,IAAA,IAAQ,aAAA;AACzC,MAAA,CAAA,CAAE,MAAM,KAAK,CAAA;AAGb,MAAA,IAAI,YAAY,CAAA,EAAK;AACnB,QAAA,SAAA,CAAU,KAAK,GAAG,CAAA;AAClB,QAAA,CAAA,CAAE,OAAA,IAAU;AAAA,MACd;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,SAAA,CAAU,QAAQ,CAAA,GAAA,KAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cACE,GAAA,EACA,IAAA,EACA,IACA,UAAA,EACA,KAAA,EACA,SAAgC,aAAA,EACd;AAElB,IAAA,MAAM,cAAc,UAAA,GAAa,GAAA;AAGjC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AACzC,IAAA,IAAI,UAAU,OAAA,EAAS;AACrB,MAAA,QAAA,CAAS,OAAA,EAAQ;AAAA,IACnB;AAGA,IAAA,IAAI,eAAe,CAAA,IAAK,IAAA,CAAK,IAAI,EAAA,GAAK,IAAI,IAAI,IAAA,EAAM;AAClD,MAAA,KAAA,CAAM,EAAE,CAAA;AACR,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,QAAQ,OAAA,EAAQ;AAAA,QACzB,OAAO,MAAM;AAAA,QAAC,CAAA;AAAA,QACd,QAAQ,MAAM;AAAA,QAAC,CAAA;AAAA,QACf,QAAQ,MAAM;AAAA,QAAC;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AAC7C,MAAA,MAAM,aAAA,GAA4B;AAAA,QAChC,GAAA;AAAA,QACA,IAAA;AAAA,QACA,EAAA;AAAA,QACA,QAAA,EAAU,WAAA;AAAA,QACV,OAAA,EAAS,CAAA;AAAA,QACT,KAAA;AAAA,QACA,MAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA,EAAQ;AAAA,OACV;AACA,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,aAAa,CAAA;AAAA,IACzC,CAAC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,OAAO,MAAM;AACX,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAClC,QAAA,IAAI,CAAA,IAAK,MAAA,GAAS,IAAA;AAAA,MACpB,CAAA;AAAA,MACA,QAAQ,MAAM;AACZ,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAClC,QAAA,IAAI,CAAA,IAAK,MAAA,GAAS,KAAA;AAAA,MACpB,CAAA;AAAA,MACA,QAAQ,MAAM;AACZ,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAClC,QAAA,IAAI,CAAA,EAAG;AACL,UAAA,CAAA,CAAE,OAAA,IAAU;AACZ,UAAA,IAAA,CAAK,WAAA,CAAY,OAAO,GAAG,CAAA;AAAA,QAC7B;AAAA,MACF;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAGA,gBAAA,GAAyB;AACvB,IAAA,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,CAAA;AAC3C,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,EACzB;AAAA;AAAA,EAGA,wBAAA,GAAmC;AACjC,IAAA,OAAO,KAAK,WAAA,CAAY,IAAA;AAAA,EAC1B;AACF;;;AC3HO,IAAM,YAAA,GAAyC;AAAA;AAAA,EAEpD,CAAA,EAAG,CAAC,oBAAA,EAAqB,oBAAoB,CAAA;AAAA,EAC7C,CAAA,EAAG,CAAC,oBAAA,EAAqB,oBAAoB,CAAA;AAAA,EAC7C,CAAA,EAAG,CAAC,aAAA,EAAc,aAAa,CAAA;AAAA;AAAA,EAG/B,CAAA,EAAG,CAAC,YAAA,EAAa,YAAY,CAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,eAAA,EAAgB,eAAe,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,cAAA,EAAe,cAAc,CAAA;AAAA,EACjC,EAAA,EAAI,CAAC,aAAA,EAAc,aAAa,CAAA;AAAA,EAChC,EAAA,EAAI,CAAC,aAAA,EAAc,aAAa,CAAA;AAAA;AAAA;AAAA,EAGhC,CAAA,EAAG,CAAC,cAAA,EAAe,cAAc,CAAA;AAAA,EACjC,EAAA,EAAI,CAAC,cAAA,EAAe,cAAc,CAAA;AAAA;AAAA,EAGlC,CAAA,EAAI,CAAC,eAAA,EAAgB,eAAA,EAAgB,aAAa,CAAA;AAAA,EAClD,EAAA,EAAI,CAAC,cAAA,EAAe,cAAc,CAAA;AAAA;AAAA,EAClC,EAAA,EAAI,CAAC,kBAAA,EAAmB,kBAAkB,CAAA;AAAA;AAAA,EAC1C,EAAA,EAAI,CAAC,eAAA,EAAgB,eAAe,CAAA;AAAA,EACpC,EAAA,EAAI,CAAC,gBAAA,EAAiB,gBAAgB,CAAA;AAAA;AAAA,EACtC,EAAA,EAAI,CAAC,eAAA,EAAgB,eAAe,CAAA;AAAA,EACpC,EAAA,EAAI,CAAC,eAAA,EAAgB,eAAe,CAAA;AAAA,EACpC,EAAA,EAAI,CAAC,oBAAA,EAAqB,oBAAoB,CAAA;AAAA,EAC9C,EAAA,EAAI,CAAC,mBAAmB,CAAA;AAAA,EACxB,EAAA,EAAI,CAAC,cAAc,CAAA;AAAA,EACnB,EAAA,EAAI,CAAC,iBAAA,EAAkB,iBAAiB,CAAA;AAAA,EACxC,EAAA,EAAI,CAAC,cAAc,CAAA;AAAA,EACnB,EAAA,EAAI,CAAC,eAAA,EAAgB,eAAe,CAAA;AAAA,EACpC,EAAA,EAAI,CAAC,eAAA,EAAgB,eAAe,CAAA;AAAA,EACpC,EAAA,EAAI,CAAC,UAAU,CAAA;AAAA;AAAA,EACf,EAAA,EAAI,CAAC,UAAU,CAAA;AAAA;AAAA,EACf,EAAA,EAAI,CAAC,UAAU,CAAA;AAAA;AAAA,EACf,EAAA,EAAI,CAAC,qBAAA,EAAsB,qBAAqB,CAAA;AAAA,EAChD,EAAA,EAAI,CAAC,qBAAqB,CAAA;AAAA;AAAA;AAAA,EAG1B,EAAA,EAAI,CAAC,YAAY,CAAA;AAAA,EACjB,EAAA,EAAI,CAAC,gBAAA,EAAiB,gBAAgB,CAAA;AAAA,EACtC,EAAA,EAAI,CAAC,WAAW,CAAA;AAAA;AAAA,EAChB,EAAA,EAAI,CAAC,aAAa,CAAA;AAAA;AAAA,EAClB,EAAA,EAAI,CAAC,UAAU,CAAA;AAAA;AAAA,EACf,EAAA,EAAI,CAAC,UAAU,CAAA;AAAA;AAAA,EACf,IAAI,EAAC;AAAA;AAAA,EACL,IAAI,EAAC;AAAA;AAAA;AAAA,EAEL,EAAA,EAAI,CAAC,eAAe,CAAA;AAAA,EACpB,EAAA,EAAI,CAAC,aAAa,CAAA;AAAA,EAClB,EAAA,EAAI,CAAC,aAAa,CAAA;AAAA,EAClB,EAAA,EAAI,CAAC,eAAe,CAAA;AAAA,EACpB,EAAA,EAAI,CAAC,iBAAiB,CAAA;AAAA;AAAA,EAGtB,EAAA,EAAI,CAAC,aAAa,CAAA;AAAA,EAClB,EAAA,EAAI,CAAC,OAAO,CAAA;AAAA;AAAA,EACZ,IAAI,EAAC;AAAA;AAAA,EACL,EAAA,EAAI,CAAC,OAAO,CAAA;AAAA;AAAA;AAAA,EAGZ,EAAA,EAAI,CAAC,aAAa,CAAA;AAAA;AAAA,EAClB,EAAA,EAAI,CAAC,aAAa,CAAA;AAAA;AAAA,EAClB,EAAA,EAAI,CAAC,cAAc,CAAA;AAAA;AAAA,EACnB,EAAA,EAAI,CAAC,gBAAgB,CAAA;AAAA,EACrB,EAAA,EAAI,CAAC,aAAa,CAAA;AAAA,EAClB,EAAA,EAAI,CAAC,aAAa,CAAA;AAAA;AAAA,EAGlB,EAAA,EAAI,CAAC,cAAA,EAAe,cAAc,CAAA;AAAA,EAClC,EAAA,EAAI,CAAC,cAAA,EAAe,cAAc,CAAA;AAAA,EAClC,EAAA,EAAI,CAAC,eAAA,EAAgB,eAAe,CAAA;AAAA,EACpC,EAAA,EAAI,CAAC,iBAAA,EAAkB,iBAAiB,CAAA;AAAA;AAAA,EAExC,EAAA,EAAI,CAAC,cAAc,CAAA;AAAA,EACnB,EAAA,EAAI,CAAC,cAAc,CAAA;AAAA,EACnB,EAAA,EAAI,CAAC,eAAe,CAAA;AAAA,EACpB,EAAA,EAAI,CAAC,iBAAiB,CAAA;AAAA;AAAA,EAEtB,EAAA,EAAI,CAAC,cAAc,CAAA;AAAA,EACnB,EAAA,EAAI,CAAC,cAAc,CAAA;AAAA,EACnB,EAAA,EAAI,CAAC,eAAe,CAAA;AAAA,EACpB,EAAA,EAAI,CAAC,iBAAiB,CAAA;AAAA;AAAA;AAAA,EAItB,EAAA,EAAI,CAAC,YAAA,EAAc,YAAY,CAAA;AAAA,EAC/B,EAAA,EAAI,CAAC,YAAA,EAAc,YAAY,CAAA;AAAA,EAC/B,EAAA,EAAI,CAAC,kBAAA,EAAoB,kBAAkB,CAAA;AAAA,EAC3C,EAAA,EAAI,CAAC,mBAAA,EAAqB,mBAAmB,CAAA;AAAA,EAC7C,EAAA,EAAI,CAAC,kBAAA,EAAoB,kBAAkB,CAAA;AAAA,EAC3C,EAAA,EAAI,CAAC,kBAAA,EAAoB,kBAAkB,CAAA;AAAA,EAC3C,EAAA,EAAI,CAAC,mBAAA,EAAqB,mBAAmB,CAAA;AAAA,EAC7C,EAAA,EAAI,CAAC,kBAAA,EAAoB,kBAAkB,CAAA;AAAA,EAC3C,EAAA,EAAI,CAAC,kBAAA,EAAoB,kBAAkB,CAAA;AAAA,EAC3C,EAAA,EAAI,CAAC,kBAAA,EAAoB,kBAAkB,CAAA;AAAA,EAC3C,EAAA,EAAI,CAAC,yBAAA,EAA2B,yBAAyB,CAAA;AAAA,EACzD,EAAA,EAAI,CAAC,0BAAA,EAA4B,0BAA0B,CAAA;AAAA,EAC3D,EAAA,EAAI,CAAC,yBAAA,EAA2B,yBAAyB,CAAA;AAAA,EACzD,EAAA,EAAI,CAAC,0BAAA,EAA4B,0BAA0B,CAAA;AAAA,EAC3D,EAAA,EAAI,CAAC,wBAAA,EAA0B,wBAAwB,CAAA;AAAA,EACvD,EAAA,EAAI,CAAC,yBAAA,EAA2B,yBAAyB,CAAA;AAAA,EACzD,EAAA,EAAI,CAAC,wBAAA,EAA0B,wBAAwB,CAAA;AAAA,EACvD,EAAA,EAAI,CAAC,yBAAA,EAA2B,yBAAyB,CAAA;AAAA,EACzD,EAAA,EAAI,CAAC,wBAAA,EAA0B,wBAAwB,CAAA;AAAA,EACvD,EAAA,EAAI,CAAC,yBAAA,EAA2B,yBAAyB,CAAA;AAAA,EACzD,GAAA,EAAK,CAAC,wBAAA,EAA0B,wBAAwB,CAAA;AAAA,EACxD,GAAA,EAAK,CAAC,yBAAA,EAA2B,yBAAyB,CAAA;AAAA,EAC1D,GAAA,EAAK,CAAC,iBAAA,EAAmB,iBAAiB;AAC5C;AAMO,IAAM,WAAA,GAAwB;AAAA,EACnC,IAAA;AAAA,EAAK,IAAA;AAAA,EAAK,IAAA;AAAA,EAAK,IAAA;AAAA,EAAK,IAAA;AAAA,EAAK,MAAA;AAAA,EAAO,KAAA;AAAA,EAAM,MAAA;AAAA,EAAO,KAAA;AAAA,EAAM,IAAA;AAAA,EAAK,SAAA;AAAA,EAAU,OAAA;AAAA,EAAQ,UAAA;AAAA,EAAW,IAAA;AAAA,EAAK;AAC5F;AAMO,IAAM,mBAAA,GAAqD;AAAA;AAAA;AAAA,EAGhE,EAAA,EAAI;AAAA,IACF,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,MAAM,KAAA,EAAO,CAAA,EAAG,YAAY,EAAA;AAAG;AAAA,GAC1D;AAAA,EACA,EAAA,EAAI;AAAA,IACF,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,MAAM,KAAA,EAAO,EAAA,EAAI,YAAY,EAAA;AAAG;AAAA,GAC3D;AAAA,EACA,EAAA,EAAI;AAAA,IACF,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,MAAM,KAAA,EAAO,EAAA,EAAI,YAAY,EAAA;AAAG;AAAA,GAC3D;AAAA,EACA,EAAA,EAAI;AAAA,IACF,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,MAAM,KAAA,EAAO,CAAA,EAAG,YAAY,EAAA;AAAG;AAAA,GAC1D;AAAA,EACA,EAAA,EAAI;AAAA,IACF,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,MAAM,KAAA,EAAO,EAAA,EAAI,YAAY,EAAA;AAAG;AAAA,GAC3D;AAAA,EACA,EAAA,EAAI;AAAA,IACF,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,MAAM,KAAA,EAAO,CAAA,EAAG,YAAY,EAAA;AAAG;AAAA,GAC1D;AAAA;AAAA,EAEA,EAAA,EAAI;AAAA,IACF,EAAE,MAAM,OAAA,EAAS,OAAA,EAAS,MAAM,KAAA,EAAO,CAAA,EAAG,YAAY,EAAA,EAAG;AAAA;AAAA,IACzD,EAAE,MAAM,OAAA,EAAS,OAAA,EAAS,MAAM,KAAA,EAAO,CAAA,EAAG,YAAY,EAAA;AAAG,GAC3D;AAAA,EACA,EAAA,EAAI;AAAA,IACF,EAAE,MAAM,OAAA,EAAS,OAAA,EAAS,MAAM,KAAA,EAAO,EAAA,EAAI,YAAY,EAAA,EAAG;AAAA;AAAA,IAC1D,EAAE,MAAM,OAAA,EAAS,OAAA,EAAS,MAAM,KAAA,EAAO,EAAA,EAAI,YAAY,EAAA;AAAG,GAC5D;AAAA,EACA,EAAA,EAAI;AAAA,IACF,EAAE,MAAM,OAAA,EAAS,OAAA,EAAS,MAAM,KAAA,EAAO,EAAA,EAAI,YAAY,EAAA,EAAG;AAAA,IAC1D,EAAE,MAAM,OAAA,EAAS,OAAA,EAAS,MAAM,KAAA,EAAO,EAAA,EAAI,YAAY,EAAA;AAAG,GAC5D;AAAA,EACA,EAAA,EAAI;AAAA,IACF,EAAE,MAAM,OAAA,EAAS,OAAA,EAAS,MAAM,KAAA,EAAO,CAAA,EAAG,YAAY,EAAA,EAAG;AAAA,IACzD,EAAE,MAAM,OAAA,EAAS,OAAA,EAAS,MAAM,KAAA,EAAO,CAAA,EAAG,YAAY,EAAA;AAAG,GAC3D;AAAA;AAAA,EAEA,EAAA,EAAI,CAAE,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,EAAA,EAAI,UAAA,EAAY,EAAA,EAAK,CAAA;AAAA,EAClE,EAAA,EAAI,CAAE,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,KAAA,EAAQ,CAAA,EAAG,UAAA,EAAY,EAAA,EAAK,CAAA;AAAA,EAClE,EAAA,EAAI,CAAE,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,EAAA,EAAI,UAAA,EAAY,EAAA,EAAK,CAAA;AAAA,EAClE,EAAA,EAAI,CAAE,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,KAAA,EAAQ,CAAA,EAAG,UAAA,EAAY,EAAA,EAAK,CAAA;AAAA;AAAA,EAElE,EAAA,EAAI,CAAE,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,EAAA,EAAI,UAAA,EAAY,EAAA,EAAK,CAAA;AAAA,EAClE,EAAA,EAAI,CAAE,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,KAAA,EAAQ,CAAA,EAAG,UAAA,EAAY,EAAA,EAAK,CAAA;AAAA,EAClE,EAAA,EAAI,CAAE,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,EAAA,EAAI,UAAA,EAAY,EAAA,EAAK,CAAA;AAAA,EAClE,EAAA,EAAI,CAAE,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,KAAA,EAAQ,CAAA,EAAG,UAAA,EAAY,EAAA,EAAK,CAAA;AAAA;AAAA,EAGlE,CAAA,EAAG;AAAA;AAAA,IACD,EAAE,MAAM,KAAA,EAAO,OAAA,EAAS,MAAM,KAAA,EAAO,CAAA,EAAG,YAAY,CAAA;AAAE;AAAA,GACxD;AAAA,EACA,EAAA,EAAI;AAAA;AAAA,IACF,EAAE,MAAM,KAAA,EAAO,OAAA,EAAS,MAAM,KAAA,EAAO,CAAA,EAAG,YAAY,IAAA;AAAK;AAAA,GAC3D;AAAA,EACA,EAAA,EAAI;AAAA,IACF,EAAE,MAAM,KAAA,EAAO,OAAA,EAAS,MAAM,KAAA,EAAO,CAAA,EAAG,YAAY,EAAA;AAAG;AAAA,GACzD;AAAA,EACA,EAAA,EAAI;AAAA;AAAA,IACF,EAAE,MAAM,KAAA,EAAO,OAAA,EAAS,MAAM,KAAA,EAAO,CAAA,EAAG,YAAY,EAAA;AAAG;AAAA,GACzD;AAAA,EACA,EAAA,EAAI;AAAA,IACF,EAAE,MAAM,KAAA,EAAO,OAAA,EAAS,MAAM,KAAA,EAAO,EAAA,EAAI,UAAU,IAAA;AAAK;AAAA,GAC1D;AAAA,EACA,EAAA,EAAI;AAAA;AAAA,IACF,EAAE,MAAM,KAAA,EAAO,OAAA,EAAS,MAAM,KAAA,EAAO,EAAA,EAAI,YAAY,CAAA;AAAE,GACzD;AAAA,EACA,EAAA,EAAI;AAAA;AAAA,IACF,EAAE,MAAM,KAAA,EAAO,OAAA,EAAS,MAAM,KAAA,EAAO,CAAA,EAAG,YAAY,CAAA;AAAE,GACxD;AAAA;AAAA,EAGA,EAAA,EAAI;AAAA,IACF,EAAE,MAAM,QAAA,EAAU,OAAA,EAAS,MAAM,KAAA,EAAO,EAAA,EAAI,UAAU,IAAA;AAAM,GAC9D;AAAA,EACA,EAAA,EAAI;AAAA;AAAA,IACF,EAAE,MAAM,QAAA,EAAU,OAAA,EAAS,MAAM,KAAA,EAAO,EAAA,EAAI,YAAY,EAAA;AAAG,GAC7D;AAAA,EACA,EAAA,EAAI;AAAA;AAAA,IACF,EAAE,MAAM,QAAA,EAAU,OAAA,EAAS,MAAM,KAAA,EAAO,CAAA,EAAG,YAAY,EAAA;AAAG,GAC5D;AAAA,EACA,EAAA,EAAI;AAAA;AAAA,IACF,EAAE,MAAM,QAAA,EAAU,OAAA,EAAS,MAAM,KAAA,EAAO,EAAA,EAAI,YAAY,EAAA;AAAG,GAC7D;AAAA,EACA,EAAA,EAAI;AAAA;AAAA,IACF,EAAE,MAAM,QAAA,EAAU,OAAA,EAAS,MAAM,KAAA,EAAO,CAAA,EAAG,YAAY,EAAA;AAAG,GAC5D;AAAA,EACA,EAAA,EAAI;AAAA;AAAA,IACF,EAAE,MAAM,QAAA,EAAU,OAAA,EAAS,MAAM,KAAA,EAAO,EAAA,EAAI,YAAY,EAAA;AAAG,GAC7D;AAAA,EACA,EAAA,EAAI;AAAA;AAAA,IACF,EAAE,MAAM,QAAA,EAAU,OAAA,EAAS,MAAM,KAAA,EAAO,CAAA,EAAG,YAAY,EAAA;AAAG;AAE9D;AAOO,IAAM,SAAA,GAAY,CAAC,EAAA,KACxB,CAAC,EAAE,YAAA,CAAa,EAAE,CAAA,EAAG,MAAA,IAAU,mBAAA,CAAoB,EAAE,CAAA,EAAG,MAAA;AAGnD,IAAM,kBAAA,GAAqB,CAAC,IAAA,KAA0B;AAC3D,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAI,CAAA,IAAK,EAAC;AAEpC,EAAA,OAAO,KAAK,IAAA,CAAK,CAAA,CAAA,KAAK,+BAAA,CAAgC,IAAA,CAAK,CAAC,CAAC,CAAA;AAC/D;AAMO,IAAM,mBAAA,GAA2C;AAAA,EACtD;AAAA,IACE,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO,EAAE,GAAA,EAAK,CAAC,IAAI,EAAA,EAAI,EAAE,CAAA,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA;AAAA,IACvC,GAAA,EAAK,EAAE,GAAA,EAAK,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,QAAA,EAAU,EAAA,EAAG;AAAA;AAAA,IAC7D,IAAA,EAAM;AAAA;AAAA,GACR;AAAA,EACA;AAAA,IACE,IAAA,EAAM,MAAA;AAAA,IACN,KAAA,EAAO,EAAE,GAAA,EAAK,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,QAAA,EAAU,EAAA,EAAG;AAAA;AAAA,IAC/D,GAAA,EAAK,EAAE,GAAA,EAAK,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,QAAA,EAAU,EAAA,EAAG;AAAA;AAAA,IAC7D,IAAA,EAAM,EAAE,GAAA,EAAK,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,QAAA,EAAU,EAAA;AAAG;AAAA,GAChE;AAAA,EACA;AAAA,IACE,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO,EAAE,GAAA,EAAK,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,QAAA,EAAU,EAAA,EAAG;AAAA;AAAA,IAC/D,GAAA,EAAK,EAAE,GAAA,EAAK,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,QAAA,EAAU,EAAA,EAAG;AAAA;AAAA,IAC7D,IAAA,EAAM;AAAA;AAAA,GACR;AAAA,EACA;AAAA,IACE,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO,EAAE,GAAA,EAAK,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,QAAA,EAAU,EAAA,EAAG;AAAA;AAAA,IAC/D,GAAA,EAAK,EAAE,GAAA,EAAK,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,QAAA,EAAU,EAAA,EAAG;AAAA;AAAA,IAC7D,IAAA,EAAM;AAAA;AAAA,GACR;AAAA,EACA;AAAA,IACE,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,EAAE,GAAA,EAAK,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,QAAA,EAAU,EAAA,EAAG;AAAA;AAAA,IAC/D,GAAA,EAAK,EAAE,GAAA,EAAK,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,QAAA,EAAU,EAAA,EAAG;AAAA;AAAA,IAC7D,IAAA,EAAM,EAAE,GAAA,EAAK,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,QAAA,EAAU,EAAA;AAAG;AAAA;AAElE;AAWO,IAAM,mBAAA,GAKR;AAAA;AAAA,EAEH,EAAA,EAAI,EAAE,MAAA,EAAQ,EAAA,EAAI,YAAY,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC/D,EAAA,EAAI,EAAE,MAAA,EAAQ,EAAA,EAAI,YAAY,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,OAAA,EAAQ;AAAA;AAAA,EAEhE,EAAA,EAAI,EAAE,MAAA,EAAQ,EAAA,EAAI,YAAY,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,OAAA,EAAQ;AAAA,EACjE,EAAA,EAAI,EAAE,MAAA,EAAQ,EAAA,EAAI,YAAY,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,OAAA,EAAQ;AAAA;AAAA,EAElE,EAAA,EAAI,EAAE,MAAA,EAAQ,EAAA,EAAI,YAAY,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,MAAA,EAAO;AAAA,EAC9D,EAAA,EAAI,EAAE,MAAA,EAAQ,EAAA,EAAI,YAAY,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,MAAA,EAAO;AAAA;AAAA,EAE/D,EAAA,EAAI,EAAE,MAAA,EAAQ,EAAA,EAAI,YAAY,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,MAAA,EAAO;AAAA,EAChE,EAAA,EAAI,EAAE,MAAA,EAAQ,EAAA,EAAI,YAAY,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,MAAA,EAAO;AAAA;AAAA,EAEjE,EAAA,EAAI,EAAE,MAAA,EAAQ,EAAA,EAAI,YAAY,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAO;AAAA,EAC/D,EAAA,EAAI,EAAE,MAAA,EAAQ,EAAA,EAAI,YAAY,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAO;AAAA;AAAA,EAEhE,EAAA,EAAI,EAAE,MAAA,EAAQ,EAAA,EAAI,YAAY,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAM;AAAA,EAC7D,EAAA,EAAI,EAAE,MAAA,EAAQ,EAAA,EAAI,YAAY,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAM;AAAA;AAAA,EAE9D,EAAA,EAAI,EAAE,MAAA,EAAQ,EAAA,EAAI,YAAY,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,QAAA,EAAS;AAAA,EAChE,EAAA,EAAI,EAAE,MAAA,EAAQ,EAAA,EAAI,YAAY,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,QAAA,EAAS;AAAA;AAAA,EAEjE,EAAA,EAAI,EAAE,MAAA,EAAQ,EAAA,EAAI,YAAY,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,QAAA,EAAS;AAAA,EAClE,EAAA,EAAI,EAAE,MAAA,EAAQ,EAAA,EAAI,YAAY,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,QAAA,EAAS;AAAA;AAAA,EAEnE,EAAA,EAAI,EAAE,MAAA,EAAQ,EAAA,EAAI,YAAY,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAS;AAAA,EACjE,EAAA,EAAI,EAAE,MAAA,EAAQ,EAAA,EAAI,YAAY,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAS;AAAA;AAAA,EAElE,EAAA,EAAI,EAAE,MAAA,EAAQ,EAAA,EAAI,YAAY,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,QAAA,EAAS;AAAA;AAAA,EAChE,EAAA,EAAI,EAAE,MAAA,EAAQ,EAAA,EAAI,YAAY,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,QAAA,EAAS;AAAA,EACjE,EAAA,EAAI,EAAE,MAAA,EAAQ,EAAA,EAAI,YAAY,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,QAAA,EAAS;AAAA;AAAA,EACnE,EAAA,EAAI,EAAE,MAAA,EAAQ,EAAA,EAAI,YAAY,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,QAAA;AAC3D;AAOO,IAAM,gBAAA,GAA2C;AAAA,EACtD,OAAA,EAAS,wBAAA;AAAA,EACT,OAAA,EAAS,sBAAA;AAAA,EACT,OAAA,EAAS,wBAAA;AAAA,EACT,OAAA,EAAS,sBAAA;AAAA,EACT,OAAA,EAAS,kBAAA;AAAA,EACT,OAAA,EAAS,uBAAA;AAAA,EACT,OAAA,EAAS,wBAAA;AAAA,EACT,OAAA,EAAS,0BAAA;AAAA,EACT,OAAA,EAAS,oBAAA;AAAA,EACT,OAAA,EAAS,qBAAA;AAAA,EACT,OAAA,EAAS;AACX;AAOO,IAAM,cAAA,GAAiB;AAAA,EAC5B,KAAA,EAAO,eAAA;AAAA,EACP,KAAA,EAAO,eAAA;AAAA,EACP,IAAA,EAAM,cAAA;AAAA,EACN,IAAA,EAAM,qBAAA;AAAA,EACN,UAAA,EAAY,qBAAA;AAAA,EACZ,GAAA,EAAK,iBAAA;AAAA,EACL,MAAA,EAAQ;AACV;AAEO,IAAM,kBAAA,GAAqB;AAAA,EAChC,IAAA,EAAM,aAAA;AAAA,EACN,KAAA,EAAO;AACT;AAMO,IAAM,OAAA,GAAkC;AAAA;AAAA,EAE7C,GAAA,EAAM,EAAE,EAAA,EAAG,GAAA,EAAM,MAAK,mBAAA,EAAsB,aAAA,EAAc,2BAAA,EAA6B,KAAA,EAAM,CAAC,gDAAgD,CAAA,EAAG,QAAA,EAAS,OAAA,EAAS,UAAS,UAAA,EAAW;AAAA,EACvL,GAAA,EAAM,EAAE,EAAA,EAAG,GAAA,EAAM,MAAK,mBAAA,EAAsB,aAAA,EAAc,4BAAA,EAA8B,KAAA,EAAM,CAAC,gDAAgD,CAAA,EAAG,QAAA,EAAS,OAAA,EAAS,UAAS,UAAA,EAAW;AAAA,EACxL,GAAA,EAAM,EAAE,EAAA,EAAG,GAAA,EAAM,MAAK,cAAA,EAAqB,aAAA,EAAc,iCAAA,EAAmC,KAAA,EAAM,CAAC,qDAAqD,CAAA,EAAG,QAAA,EAAS,OAAA,EAAS,UAAS,UAAA,EAAW;AAAA;AAAA,EAGjM,GAAA,EAAM,EAAE,EAAA,EAAG,GAAA,EAAM,MAAK,kBAAA,EAAqB,aAAA,EAAc,8BAAA,EAAgC,KAAA,EAAM,CAAC,4DAA4D,CAAA,EAAG,QAAA,EAAS,OAAA,EAAS,UAAS,SAAA,EAAU;AAAA,EACpM,GAAA,EAAM,EAAE,EAAA,EAAG,GAAA,EAAM,MAAK,cAAA,EAAqB,aAAA,EAAc,oCAAA,EAAsC,KAAA,EAAM,CAAC,iDAAiD,CAAA,EAAG,QAAA,EAAS,OAAA,EAAS,UAAS,QAAA,EAAS;AAAA,EAC9L,GAAA,EAAM,EAAE,EAAA,EAAG,GAAA,EAAM,MAAK,eAAA,EAAqB,aAAA,EAAc,sCAAA,EAAwC,KAAA,EAAM,CAAC,iDAAiD,CAAA,EAAG,QAAA,EAAS,OAAA,EAAS,UAAS,SAAA,EAAU;AAAA,EACjM,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,aAAA,EAAqB,aAAA,EAAc,mBAAA,EAAqB,KAAA,EAAM,CAAC,wDAAwD,CAAA,EAAG,QAAA,EAAS,OAAA,EAAS,UAAS,SAAA,EAAU;AAAA,EACrL,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,OAAA,EAAqB,aAAA,EAAc,mBAAA,EAAqB,KAAA,EAAM,CAAC,wDAAwD,CAAA,EAAG,QAAA,EAAS,OAAA,EAAS,UAAS,SAAA,EAAU;AAAA,EACrL,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,gBAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,MAAA,EAAO;AAAA,EAC7E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,iBAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,MAAA,EAAO;AAAA,EAC7E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,SAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,MAAA,EAAO;AAAA,EAC7E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,WAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,MAAA,EAAO;AAAA,EAC7E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,oBAAA,EAAuB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,MAAA,EAAO;AAAA,EAC/E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,qBAAA,EAAuB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,MAAA,EAAO;AAAA,EAC/E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,kBAAA,EAAuB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,MAAA,EAAO;AAAA,EAC/E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,oBAAA,EAAuB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,MAAA,EAAO;AAAA,EAC/E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,qBAAA,EAAuB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,MAAA,EAAO;AAAA,EAC/E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,sBAAA,EAAuB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,MAAA,EAAO;AAAA,EAC/E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,mBAAA,EAAuB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,MAAA,EAAO;AAAA,EAC/E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,qBAAA,EAAuB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,MAAA,EAAO;AAAA;AAAA,EAG/E,GAAA,EAAM,EAAE,EAAA,EAAG,GAAA,EAAM,MAAK,eAAA,EAAqB,aAAA,EAAc,uCAAA,EAAyC,KAAA,EAAM,CAAC,qEAAqE,CAAA,EAAG,QAAA,EAAS,OAAA,EAAS,UAAS,MAAA,EAAO;AAAA,EACnN,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,YAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,QAAA,EAAS;AAAA;AAAA,EAG/E,GAAA,EAAM,EAAE,EAAA,EAAG,GAAA,EAAM,MAAK,wBAAA,EAA0B,aAAA,EAAc,kBAAA,EAAoB,KAAA,EAAM,CAAC,gDAAgD,CAAA,EAAG,QAAA,EAAS,OAAA,EAAS,UAAS,OAAA,EAAQ;AAAA,EAC/K,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,kBAAA,EAAqB,aAAA,EAAc,0BAAA,EAA4B,KAAA,EAAM,CAAC,wDAAwD,CAAA,EAAG,QAAA,EAAS,OAAA,EAAS,UAAS,OAAA,EAAQ;AAAA,EAC1L,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,qBAAA,EAAuB,aAAA,EAAc,mBAAA,EAAqB,KAAA,EAAM,CAAC,iDAAiD,CAAA,EAAG,QAAA,EAAS,OAAA,EAAS,UAAS,QAAA,EAAS;AAAA,EAC/K,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,mBAAA,EAAqB,aAAA,EAAc,mBAAA,EAAqB,KAAA,EAAM,CAAC,iDAAiD,CAAA,EAAG,QAAA,EAAS,OAAA,EAAS,UAAS,OAAA,EAAQ;AAAA,EAC5K,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,kBAAA,EAAqB,aAAA,EAAc,qBAAA,EAAuB,KAAA,EAAM,CAAC,mDAAmD,CAAA,EAAG,QAAA,EAAS,OAAA,EAAS,UAAS,OAAA,EAAQ;AAAA,EAChL,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,SAAA,EAAqB,aAAA,EAAc,YAAA,EAAc,KAAA,EAAM,CAAC,0CAA0C,CAAA,EAAG,QAAA,EAAS,OAAA,EAAS,UAAS,QAAA,EAAS;AAAA,EAC/J,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,sBAAA,EAAwB,aAAA,EAAc,uBAAA,EAAyB,KAAA,EAAM,CAAC,qDAAqD,CAAA,EAAG,QAAA,EAAS,OAAA,EAAS,UAAS,OAAA,EAAQ;AAAA,EACvL,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,qBAAA,EAAuB,aAAA,EAAc,4BAAA,EAA8B,KAAA,EAAM,CAAC,0DAA0D,CAAA,EAAG,QAAA,EAAS,OAAA,EAAS,UAAS,OAAA,EAAQ;AAAA,EAChM,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,aAAA,EAAqB,aAAA,EAAc,UAAA,EAAY,KAAA,EAAM,CAAC,wCAAwC,CAAA,EAAG,QAAA,EAAS,OAAA,EAAS,UAAS,MAAA,EAAO;AAAA,EACzJ,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,YAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,OAAA,EAAQ;AAAA,EAC9E,MAAM,EAAE,EAAA,EAAG,IAAA,EAAM,IAAA,EAAK,iBAAqB,aAAA,EAAc,qBAAA,EAAuB,KAAA,EAAM,CAAC,0CAAyC,wCAAwC,CAAA,EAAG,QAAA,EAAS,OAAA,EAAS,UAAS,OAAA,EAAQ;AAAA,EAC9M,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,cAAA,EAAqB,aAAA,EAAc,kBAAA,EAAoB,KAAA,EAAM,CAAC,gDAAgD,CAAA,EAAG,QAAA,EAAS,OAAA,EAAS,UAAS,OAAA,EAAQ;AAAA,EAC1K,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,IAAA,EAAK,eAAA,EAAqB,aAAA,EAAc,kBAAA,EAAoB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,OAAA,EAAQ;AAAA,EAChH,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,IAAA,EAAK,aAAA,EAAqB,aAAA,EAAc,kBAAA,EAAoB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,OAAA,EAAQ;AAAA,EAChH,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,WAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,OAAA,EAAQ;AAAA,EAC9E,MAAM,EAAE,EAAA,EAAG,IAAA,EAAM,IAAA,EAAK,iBAAqB,aAAA,EAAc,wBAAA,EAA0B,KAAA,EAAM,CAAC,gDAA+C,gDAAgD,CAAA,EAAG,QAAA,EAAS,OAAA,EAAS,UAAS,OAAA,EAAQ;AAAA,EAC/N,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,IAAA,EAAK,UAAA,EAAqB,aAAA,EAAc,kBAAA,EAAoB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,OAAA,EAAQ;AAAA;AAAA,EAGhH,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,aAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,QAAA,EAAS;AAAA,EAC/E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,cAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,QAAA,EAAS;AAAA,EAC/E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,WAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,QAAA,EAAS;AAAA,EAC/E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,aAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,QAAA,EAAS;AAAA,EAC/E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,aAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,QAAA,EAAS;AAAA,EAC/E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,cAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,QAAA,EAAS;AAAA,EAC/E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,kBAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,QAAA,EAAS;AAAA,EAC/E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,mBAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,QAAA,EAAS;AAAA;AAAA,EAE/E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,eAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,QAAA,EAAS;AAAA,EAC/E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,aAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,QAAA,EAAS;AAAA,EAC/E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,aAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,QAAA,EAAS;AAAA,EAC/E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,eAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,QAAA,EAAS;AAAA,EAC/E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,iBAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,QAAA,EAAS;AAAA;AAAA,EAG/E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,UAAA,EAAqB,aAAA,EAAc,6BAAA,EAA+B,KAAA,EAAM,CAAC,+CAA+C,CAAA,EAAG,QAAA,EAAS,OAAA,EAAS,UAAS,KAAA,EAAM;AAAA,EAClL,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,YAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA,EAC5E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,UAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA,EAC5E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,IAAA,EAAK,cAAA,EAAqB,aAAA,EAAc,uBAAA,EAAyB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA,EACnH,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,IAAA,EAAK,UAAA,EAAqB,aAAA,EAAc,kBAAA,EAAoB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,OAAA,EAAQ;AAAA,EAChH,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,WAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA;AAAA,EAG5E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,gBAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,MAAA,EAAO;AAAA,EAC7E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,iBAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,MAAA,EAAO;AAAA,EAC7E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,SAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,MAAA,EAAO;AAAA,EAC7E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,WAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,MAAA,EAAO;AAAA,EAC7E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,gBAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,MAAA,EAAO;AAAA,EAC7E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,iBAAA,EAAqB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,MAAA,EAAO;AAAA;AAAA,EAG7E,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,WAAA,EAA0B,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA,EACjF,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,WAAA,EAA0B,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA,EACjF,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,iBAAA,EAA0B,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA,EACjF,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,kBAAA,EAA0B,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA,EACjF,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,iBAAA,EAA0B,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA,EACjF,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,iBAAA,EAA0B,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA,EACjF,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,kBAAA,EAA0B,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA,EACjF,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,iBAAA,EAA0B,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA,EACjF,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,iBAAA,EAA0B,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA,EACjF,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,iBAAA,EAA0B,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA,EACjF,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,wBAAA,EAA0B,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA,EACjF,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,yBAAA,EAA0B,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA,EACjF,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,wBAAA,EAA0B,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA,EACjF,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,yBAAA,EAA0B,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA,EACjF,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,uBAAA,EAA0B,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA,EACjF,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,wBAAA,EAA0B,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA,EACjF,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,uBAAA,EAA0B,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA,EACjF,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,wBAAA,EAA0B,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA,EACjF,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,uBAAA,EAA0B,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA,EACjF,IAAA,EAAM,EAAE,EAAA,EAAG,IAAA,EAAM,MAAK,wBAAA,EAA0B,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA,EACjF,KAAA,EAAO,EAAE,EAAA,EAAG,KAAA,EAAO,MAAK,uBAAA,EAAyB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA,EAClF,KAAA,EAAO,EAAE,EAAA,EAAG,KAAA,EAAO,MAAK,wBAAA,EAAyB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA,EAAM;AAAA,EAClF,KAAA,EAAO,EAAE,EAAA,EAAG,KAAA,EAAO,MAAK,gBAAA,EAAyB,QAAA,EAAS,OAAA,EAAS,QAAA,EAAS,KAAA;AAC9E;AAOO,IAAM,eAAA,GAA0C;AAAA,EACrD,EAAA,EAAI,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA;AAAA,EACjD,EAAA,EAAI,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA;AAAA,EAC/B,EAAA,EAAI,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA,EAAK,EAAA,EAAI,GAAA;AAAA;AAAA,EACtB,EAAA,EAAI,GAAA;AAAA,EAAK,EAAA,EAAI;AAAA;AACf;AA6BO,IAAM,UAAA,GAA0C;AAAA;AAAA,EAErD,gBAAA,EAAkB,EAAE,QAAA,EAAU,MAAA,EAAQ,YAAY,EAAA,EAAG;AAAA,EACrD,gBAAA,EAAkB,EAAE,QAAA,EAAU,MAAA,EAAQ,YAAY,EAAA,EAAG;AAAA,EACrD,gBAAA,EAAkB,EAAE,QAAA,EAAU,MAAA,EAAQ,YAAY,EAAA,EAAG;AAAA,EACrD,gBAAA,EAAkB,EAAE,QAAA,EAAU,MAAA,EAAQ,YAAY,EAAA,EAAG;AAAA,EACrD,gBAAA,EAAkB,EAAE,QAAA,EAAU,MAAA,EAAQ,YAAY,EAAA,EAAG;AAAA,EACrD,gBAAA,EAAkB,EAAE,QAAA,EAAU,MAAA,EAAQ,YAAY,EAAA,EAAG;AAAA;AAAA,EAErD,aAAA,EAAe,EAAE,QAAA,EAAU,KAAA,EAAO,UAAA,EAAY,GAAG,QAAA,EAAU,EAAE,WAAA,EAAa,GAAA,EAAI,EAAE;AAAA,EAChF,eAAA,EAAiB,EAAE,QAAA,EAAU,KAAA,EAAO,UAAA,EAAY,GAAG,QAAA,EAAU,EAAE,WAAA,EAAa,GAAA,EAAI,EAAE;AAAA,EAClF,eAAA,EAAiB,EAAE,QAAA,EAAU,KAAA,EAAO,UAAA,EAAY,GAAG,QAAA,EAAU,EAAE,WAAA,EAAa,GAAA,EAAI,EAAE;AAAA,EAClF,eAAA,EAAiB,EAAE,QAAA,EAAU,KAAA,EAAO,UAAA,EAAY,GAAG,QAAA,EAAU,EAAE,WAAA,EAAa,GAAA,EAAI,EAAE;AAAA,EAClF,eAAA,EAAiB,EAAE,QAAA,EAAU,KAAA,EAAO,UAAA,EAAY,GAAG,QAAA,EAAU,EAAE,WAAA,EAAa,GAAA,EAAI,EAAE;AAAA;AAAA,EAElF,wBAAA,EAA0B,EAAE,QAAA,EAAU,cAAA,EAAgB,YAAY,EAAA,EAAI,QAAA,EAAU,EAAE,WAAA,EAAa,CAAA,EAAG,aAAa,IAAA,EAAM,OAAA,EAAS,GAAG,UAAA,EAAY,IAAA,EAAM,WAAW,IAAA,EAAM,QAAA,EAAU,UAAS,EAAE;AAAA,EACzL,wBAAA,EAA0B,EAAE,QAAA,EAAU,cAAA,EAAgB,YAAY,EAAA,EAAI,QAAA,EAAU,EAAE,WAAA,EAAa,CAAA,EAAG,aAAa,IAAA,EAAM,OAAA,EAAS,GAAG,UAAA,EAAY,IAAA,EAAM,WAAW,IAAA,EAAM,QAAA,EAAU,UAAS,EAAE;AAAA;AAAA,EAEzL,oBAAA,EAAsB,EAAE,QAAA,EAAU,UAAA,EAAY,UAAA,EAAY,IAAI,QAAA,EAAU,EAAE,WAAA,EAAa,CAAA,EAAE,EAAE;AAAA,EAC3F,oBAAA,EAAsB,EAAE,QAAA,EAAU,UAAA,EAAY,UAAA,EAAY,IAAI,QAAA,EAAU,EAAE,WAAA,EAAa,CAAA,EAAE,EAAE;AAAA;AAAA,EAE3F,gBAAA,EAAkB,EAAE,QAAA,EAAU,QAAA,EAAU,UAAA,EAAY,GAAG,QAAA,EAAU,EAAE,WAAA,EAAa,GAAA,EAAI,EAAE;AAAA,EACtF,kBAAA,EAAoB,EAAE,QAAA,EAAU,QAAA,EAAU,UAAA,EAAY,GAAG,QAAA,EAAU,EAAE,WAAA,EAAa,GAAA,EAAI,EAAE;AAAA;AAAA,EAExF,iBAAA,EAAmB,EAAE,QAAA,EAAU,OAAA,EAAS,YAAY,CAAA,EAAE;AAAA,EACtD,iBAAA,EAAmB,EAAE,QAAA,EAAU,OAAA,EAAS,YAAY,CAAA,EAAE;AAAA;AAAA,EAEtD,gBAAA,EAAkB,EAAE,QAAA,EAAU,QAAA,EAAU,YAAY,EAAA,EAAG;AAAA;AAAA,EAEvD,cAAA,EAAgB,EAAE,QAAA,EAAU,SAAA,EAAW,UAAA,EAAY,IAAI,QAAA,EAAU,EAAE,WAAA,EAAa,CAAA,EAAE,EAAE;AAAA,EACpF,cAAA,EAAgB,EAAE,QAAA,EAAU,SAAA,EAAW,UAAA,EAAY,IAAI,QAAA,EAAU,EAAE,WAAA,EAAa,CAAA,EAAE,EAAE;AAAA;AAAA,EAEpF,kBAAA,EAAoB,EAAE,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,IAAI,QAAA,EAAU,EAAE,WAAA,EAAa,EAAA,EAAG,EAAE;AAAA,EACtF,kBAAA,EAAoB,EAAE,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,IAAI,QAAA,EAAU,EAAE,WAAA,EAAa,EAAA,EAAG;AACtF;AASO,IAAM,aAAA,GAAiD;AAAA;AAAA,EAE5D,IAAA,EAAM,CAAC,gBAAA,EAAkB,cAAA,EAAgB,cAAc,CAAA;AAAA,EACvD,MAAA,EAAQ,CAAC,gBAAgB,CAAA;AAAA,EACzB,GAAA,EAAK,CAAC,wBAAA,EAA0B,wBAAwB,CAAA;AAAA,EACxD,QAAA,EAAU,CAAC,oBAAA,EAAsB,oBAAoB,CAAA;AAAA,EACrD,MAAA,EAAQ,CAAC,gBAAgB,CAAA;AAAA,EACzB,IAAA,EAAM,CAAC,kBAAA,EAAoB,kBAAkB;AAC/C;AAMO,IAAM,UAAA,GAA8B;AAAA,EACzC,UAAA,EAAY,YAAA;AAAA,EACZ,SAAA,EAAW,mBAAA;AAAA,EACX,SAAA,EAAW,cAAA;AAAA,EACX,WAAA,EAAa,aAAA;AAAA,EACb,UAAA,EAAY,WAAA;AAAA,EACZ,aAAA,EAAe,eAAA;AAAA,EACf,MAAA,EAAQ,OAAA;AAAA,EACR,YAAA,EAAc;AAChB;;;ACtjBA,IAAM,OAAA,GAAU,CAAC,CAAA,KAAe,CAAA,GAAI,KAAK,EAAA,GAAM,GAAA;AAE/C,SAAS,QAAQ,CAAA,EAAW;AAC1B,EAAA,OAAO,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AACjC;AAcO,IAAM,eAAA,GAAN,MAAM,eAAA,CAAoC;AAAA,EA4C/C,WAAA,CAAY,MAAA,GAA0B,EAAC,EAAG,SAAA,EAAuB;AA1CjE;AAAA,IAAA,aAAA,CAAA,IAAA,EAAQ,QAAA,CAAA;AAGR;AAAA,IAAA,aAAA,CAAA,IAAA,EAAQ,WAAA,CAAA;AAGR;AAAA,IAAA,aAAA,CAAA,IAAA,EAAQ,YAAmC,EAAC,CAAA;AAC5C,IAAA,aAAA,CAAA,IAAA,EAAQ,UAAA,EAAW,KAAA,CAAA;AACnB,IAAA,aAAA,CAAA,IAAA,EAAQ,qBAAA,sBAA0B,GAAA,EAAY,CAAA;AAG9C;AAAA,IAAA,aAAA,CAAA,IAAA,EAAQ,aAA4B,EAAC,CAAA;AACrC,IAAA,aAAA,CAAA,IAAA,EAAQ,uBAAA,sBAA4B,GAAA,EAAY,CAAA;AAChD,IAAA,aAAA,CAAA,IAAA,EAAQ,UAAA,EAAW,KAAA,CAAA;AACnB,IAAA,aAAA,CAAA,IAAA,EAAQ,gBAAoE,EAAC,CAAA;AAG7E;AAAA,IAAA,aAAA,CAAA,IAAA,EAAQ,UAAA,EAA4B,IAAA,CAAA;AACpC,IAAA,aAAA,CAAA,IAAA,EAAQ,UAAqB,EAAC,CAAA;AAC9B,IAAA,aAAA,CAAA,IAAA,EAAQ,OAAA,EAA6B,IAAA,CAAA;AACrC,IAAA,aAAA,CAAA,IAAA,EAAQ,YAAA,sBAAiB,GAAA,EAAsB,CAAA;AAC/C,IAAA,aAAA,CAAA,IAAA,EAAQ,YAAA,sBAAiB,GAAA,EAA+C,CAAA;AAGxE;AAAA,IAAA,aAAA,CAAA,IAAA,EAAQ,SAAuB,EAAC,CAAA;AAChC,IAAA,aAAA,CAAA,IAAA,EAAQ,cAAqC,EAAC,CAAA;AAG9C;AAAA,IAAA,aAAA,CAAA,IAAA,EAAQ,gBAAyB,IAAI,KAAA,CAAM,EAAE,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA;AAGrD;AAAA,IAAA,aAAA,CAAA,IAAA,EAAQ,OAAA,EAAQ,IAAIA,WAAA,EAAM,CAAA;AAC1B,IAAA,aAAA,CAAA,IAAA,EAAQ,OAAA,EAAuB,IAAA,CAAA;AAC/B,IAAA,aAAA,CAAA,IAAA,EAAQ,SAAA,EAAU,KAAA,CAAA;AAUhB,IAAA,IAAA,CAAK,MAAA,GAAS,OAAO,UAAA,IAAc,UAAA;AACnC,IAAA,IAAA,CAAK,UAAA,GAAa,EAAE,GAAG,IAAA,CAAK,OAAO,aAAA,EAAc;AACjD,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA,IAAa,IAAI,cAAA,EAAe;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,OAAA,EAA6B;AACnC,IAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,OAAA;AAE1B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAGtB,IAAA,KAAA,CAAM,QAAA,CAAS,CAAC,GAAA,KAAa;AAC3B,MAAA,IAAI,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,IAAA,EAAM;AAC1B,QAAA,MAAM,OAAO,GAAA,CAAI,qBAAA;AACjB,QAAA,IAAI,MAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,IAAA,CAAK,SAAS,CAAA,EAAG;AAC1C,UAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,GAAG,CAAA;AAAA,QACnC;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa,QAAQ,EAAC;AACxD,IAAA,MAAM,WAAA,GAAc,OAAO,IAAA,CAAK,CAAC,MAAM,aAAA,CAAc,QAAA,CAAS,CAAA,CAAE,IAAI,CAAC,CAAA;AACrE,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,IAAA,CAAK,QAAA,GAAW,WAAA;AAAA,IAClB,CAAA,MAAO;AACL,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM;AACnC,QAAA,MAAM,OAAO,CAAA,CAAE,qBAAA;AACf,QAAA,OAAO,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,aAAA,IAAiB,IAAA;AAAA,MAC9D,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,WAAW,SAAA,IAAa,IAAA;AAAA,IAC/B;AAGA,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AACpC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,oBAAoB,KAAA,EAAM;AAC/B,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AAAA,EAEA,OAAO,YAAA,EAA4B;AACjC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,gBAAgB,CAAC,CAAA;AAC/C,IAAA,IAAI,SAAA,IAAa,CAAA,IAAK,IAAA,CAAK,QAAA,EAAU;AAErC,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,SAAS,CAAA;AAC7B,IAAA,IAAA,CAAK,sBAAA,EAAuB;AAAA,EAC9B;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,OAAA,EAAS;AAClB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AAEjB,IAAA,MAAM,OAAO,MAAM;AACjB,MAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,QAAA,EAAS;AAC/B,MAAA,IAAA,CAAK,OAAO,EAAE,CAAA;AACd,MAAA,IAAA,CAAK,KAAA,GAAQ,sBAAsB,IAAI,CAAA;AAAA,IACzC,CAAA;AAEA,IAAA,IAAA,CAAK,KAAA,GAAQ,sBAAsB,IAAI,CAAA;AAAA,EACzC;AAAA;AAAA,EAGA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAI,IAAA,CAAK,UAAU,IAAA,EAAM;AACvB,MAAA,oBAAA,CAAqB,KAAK,KAAK,CAAA;AAC/B,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,IACf;AACA,IAAA,IAAA,CAAK,MAAM,IAAA,EAAK;AAAA,EAClB;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,IAAA,EAAK;AACV,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,IAAA,CAAK,SAAS,EAAC;AACf,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,QAAQ,EAAC;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAMA,KAAA,CAAM,EAAA,EAAqB,CAAA,EAAW,OAAA,EAAwB;AAC5D,IAAA,IAAI,OAAO,OAAO,QAAA,EAAU;AAC1B,MAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,CAAM,gBAAgB,CAAA;AACvC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,EAAA,GAAK,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AAC1B,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAY;AAClC,QAAA,MAAM,WAAA,GAAc,IAAA,KAAS,GAAA,GAAM,EAAA,GAAK,CAAA;AACxC,QAAA,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,CAAA,EAAG,WAAW,CAAA;AAC7B,QAAA;AAAA,MACF;AACA,MAAA,MAAM,CAAA,GAAI,OAAO,EAAE,CAAA;AACnB,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,EAAG;AACpB,QAAA,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA;AAAA,MAC1B;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA,GAAI,CAAA;AAEpB,IAAA,MAAM,OAAO,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,EAAE,KAAK,EAAC;AAC5C,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,MAAM,SAAA,GAAY,KAAK,SAAA,CAAU,EAAE,IAAI,IAAA,CAAK,cAAA,CAAe,EAAE,CAAA,GAAI,CAAA;AACjE,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,CAAC,CAAA,GAAI,SAAA;AAC1B,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,iBAAA,CAAkB,EAAE,CAAA;AAE3C,MAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,CAAC,MAAM,kBAAA,CAAmB,IAAA,CAAK,CAAC,CAAC,CAAA;AAC9D,MAAA,MAAM,SAAA,GAAY,KAAK,MAAA,CAAO,CAAC,MAAM,mBAAA,CAAoB,IAAA,CAAK,CAAC,CAAC,CAAA;AAChE,MAAA,MAAM,UAAA,GAAa,KAAK,MAAA,CAAO,CAAC,MAAM,CAAC,iCAAA,CAAkC,IAAA,CAAK,CAAC,CAAC,CAAA;AAEhF,MAAA,MAAM,EAAE,MAAM,OAAA,EAAS,KAAA,EAAO,UAAS,GAAI,IAAA,CAAK,iBAAA,CAAkB,IAAA,EAAM,OAAO,CAAA;AAE/E,MAAA,IAAI,QAAA,CAAS,MAAA,IAAU,SAAA,CAAU,MAAA,EAAQ;AACvC,QAAA,KAAA,MAAW,KAAK,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,SAAS,SAAS,CAAA;AAC7D,QAAA,KAAA,MAAW,KAAK,SAAA,EAAW,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,UAAU,SAAS,CAAA;AAAA,MACjE,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,IAAA,CAAK,GAAG,IAAI,CAAA;AAAA,MACzB;AAEA,MAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,QAAA,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,IAAA,EAAM,SAAS,CAAA;AAAA,MAClC;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,EAAE,CAAA;AACzC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,IAAI,OAAA,CAAQ,YAAY,IAAA,IAAQ,OAAA,CAAQ,YAAY,IAAA,IAAQ,OAAA,CAAQ,YAAY,IAAA,EAAM;AACpF,UAAA,MAAM,IAAA,GAAO,QAAQ,OAAA,KAAY,IAAA,GAAO,UAAU,OAAA,CAAQ,OAAA,KAAY,OAAO,KAAA,GAAQ,MAAA;AACrF,UAAA,IAAA,CAAK,kBAAA,CAAmB,QAAQ,IAAA,EAAM,IAAA,EAAM,IAAI,OAAA,CAAQ,KAAA,EAAO,OAAA,CAAQ,UAAA,IAAc,CAAC,CAAA;AAAA,QACxF,CAAA,MAAA,IAAW,QAAQ,OAAA,KAAY,IAAA,IAAQ,QAAQ,OAAA,KAAY,IAAA,IAAQ,OAAA,CAAQ,OAAA,KAAY,IAAA,EAAM;AAC3F,UAAA,IAAI,OAAA,CAAQ,aAAa,MAAA,EAAW;AAClC,YAAA,IAAA,CAAK,qBAAA,CAAsB,QAAQ,IAAA,EAAM,OAAA,CAAQ,SAAS,CAAA,GAAI,OAAA,CAAQ,KAAA,EAAO,OAAA,CAAQ,QAAQ,CAAA;AAAA,UAC/F;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAA,CAAa,EAAA,EAAqB,EAAA,EAAY,UAAA,GAAa,KAAK,OAAA,EAAoC;AAClG,IAAA,MAAM,KAAA,GAAQ,OAAO,EAAA,KAAO,QAAA,GAAW,MAAA,CAAO,GAAG,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAC,CAAA,GAAI,EAAA;AAC1E,IAAA,MAAM,MAAA,GAAS,QAAQ,EAAE,CAAA;AAEzB,IAAA,MAAM,YAAY,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,KAAK,KAAK,EAAC;AACpD,IAAA,MAAM,WAAW,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,KAAK,KAAK,EAAC;AAElD,IAAA,MAAM,SAAA,GAAY,KAAK,SAAA,CAAU,KAAK,IAAI,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA,GAAI,CAAA;AACvE,IAAA,MAAM,OAAO,MAAA,GAAS,SAAA;AAEtB,IAAA,MAAM,EAAE,MAAM,OAAA,EAAS,KAAA,EAAO,UAAS,GAAI,IAAA,CAAK,iBAAA,CAAkB,IAAA,EAAM,OAAO,CAAA;AAE/E,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,GAAI,MAAA;AAEvB,IAAA,MAAM,UAA8B,EAAC;AACrC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA;AAE9C,IAAA,MAAM,QAAA,GAAW,UAAU,MAAA,CAAO,CAAC,MAAM,aAAA,CAAc,IAAA,CAAK,CAAC,CAAC,CAAA;AAC9D,IAAA,MAAM,SAAA,GAAY,UAAU,MAAA,CAAO,CAAC,MAAM,cAAA,CAAe,IAAA,CAAK,CAAC,CAAC,CAAA;AAChE,IAAA,MAAM,UAAA,GAAa,UAAU,MAAA,CAAO,CAAC,MAAM,CAAC,wBAAA,CAAyB,IAAA,CAAK,CAAC,CAAC,CAAA;AAE5E,IAAA,IAAI,QAAA,CAAS,MAAA,IAAU,SAAA,CAAU,MAAA,EAAQ;AACvC,MAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,QAAA,OAAA,CAAQ,KAAK,IAAA,CAAK,eAAA,CAAgB,GAAG,OAAA,EAAS,UAAA,EAAY,SAAS,CAAC,CAAA;AAAA,MACtE;AACA,MAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,QAAA,OAAA,CAAQ,KAAK,IAAA,CAAK,eAAA,CAAgB,GAAG,QAAA,EAAU,UAAA,EAAY,SAAS,CAAC,CAAA;AAAA,MACvE;AAAA,IACF,CAAA,MAAO;AACL,MAAA,UAAA,CAAW,IAAA,CAAK,GAAG,SAAS,CAAA;AAAA,IAC9B;AAEA,IAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,MAAA,OAAA,CAAQ,KAAK,IAAA,CAAK,eAAA,CAAgB,GAAG,IAAA,EAAM,UAAA,EAAY,SAAS,CAAC,CAAA;AAAA,IACnE;AAEA,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI,OAAA,CAAQ,YAAY,IAAA,IAAQ,OAAA,CAAQ,YAAY,IAAA,IAAQ,OAAA,CAAQ,YAAY,IAAA,EAAM;AACpF,QAAA,MAAM,IAAA,GAAO,QAAQ,OAAA,KAAY,IAAA,GAAO,UAAU,OAAA,CAAQ,OAAA,KAAY,OAAO,KAAA,GAAQ,MAAA;AACrF,QAAA,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,sBAAA,CAAuB,OAAA,CAAQ,IAAA,EAAM,IAAA,EAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,EAAO,OAAA,CAAQ,UAAA,IAAc,CAAA,EAAG,UAAU,CAAC,CAAA;AAAA,MAC3H,CAAA,MAAA,IAAW,QAAQ,OAAA,KAAY,IAAA,IAAQ,QAAQ,OAAA,KAAY,IAAA,IAAQ,OAAA,CAAQ,OAAA,KAAY,IAAA,EAAM;AAC3F,QAAA,IAAI,OAAA,CAAQ,aAAa,MAAA,EAAW;AAClC,UAAA,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,yBAAA,CAA0B,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,OAAA,EAAS,MAAA,GAAS,OAAA,CAAQ,KAAA,EAAO,OAAA,CAAQ,QAAA,EAAU,UAAU,CAAC,CAAA;AAAA,QAClI;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,eAAe,OAAO,CAAA;AAAA,EACpC;AAAA,EAEA,MAAM,EAAA,EAAoB;AACxB,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA,IAAK,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAMA,QAAA,CAAS,GAAA,EAAa,CAAA,EAAW,SAAA,EAA4B;AAC3D,IAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,IAAA,MAAM,eAAe,SAAA,IAAa,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa,QAAQ,EAAC;AAEpE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AACtC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,KAAA,MAAW,UAAU,MAAA,EAAQ;AAC3B,QAAA,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA,GAAI,GAAA;AAAA,MAC5B;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAA6C,EAAC;AAEpD,IAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,MAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA;AACrC,QAAA,IAAI,CAAC,IAAA,EAAM;AACX,QAAA,MAAM,OAAO,IAAA,CAAK,qBAAA;AAClB,QAAA,MAAM,OAAO,IAAA,CAAK,qBAAA;AAClB,QAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM;AACpB,QAAA,MAAM,GAAA,GAAM,KAAK,GAAG,CAAA;AACpB,QAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,UAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,EAAK,CAAA;AAC1B,UAAA,IAAA,CAAK,GAAG,CAAA,GAAI,GAAA;AAAA,QACd;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,MAAA,EAAQ;AAC9B,QAAA,MAAM,OAAO,IAAA,CAAK,qBAAA;AAClB,QAAA,MAAM,OAAO,IAAA,CAAK,qBAAA;AAClB,QAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM;AACpB,QAAA,MAAM,GAAA,GAAM,KAAK,GAAG,CAAA;AACpB,QAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,UAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,EAAK,CAAA;AAC1B,UAAA,IAAA,CAAK,GAAG,CAAA,GAAI,GAAA;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,eAAA,CAAgB,GAAA,EAAa,EAAA,EAAY,UAAA,GAAa,KAAK,SAAA,EAAwC;AACjG,IAAA,MAAM,aAAA,GAAgB,SAAS,GAAG,CAAA,CAAA;AAClC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,CAAc,GAAG,CAAA;AACnC,IAAA,MAAM,MAAA,GAAS,QAAQ,EAAE,CAAA;AACzB,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,aAAA,EAAe,MAAM,MAAA,EAAQ,UAAA,EAAY,CAAC,KAAA,KAAU,IAAA,CAAK,QAAA,CAAS,GAAA,EAAK,KAAA,EAAO,SAAS,CAAC,CAAA;AAAA,EAC9H;AAAA;AAAA;AAAA;AAAA,EAMA,SAAA,CAAU,WAAA,EAAqB,KAAA,EAAe,QAAA,GAAW,CAAA,EAAW;AAClE,IAAA,IAAI,cAAc,CAAA,IAAK,WAAA,IAAe,IAAA,CAAK,MAAA,CAAO,WAAW,MAAA,EAAQ;AAErE,IAAA,MAAM,GAAA,GAAM,QAAQ,KAAK,CAAA;AACzB,IAAA,IAAA,CAAK,YAAA,CAAa,WAAW,CAAA,GAAI,GAAA;AAEjC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,WAAW,CAAA;AACnD,IAAA,IAAA,CAAK,QAAA,CAAS,UAAU,GAAG,CAAA;AAE3B,IAAA,MAAM,SAAA,GAAY,eAAA,CAAe,kBAAA,CAAmB,WAAW,IAAI,GAAA,GAAM,QAAA;AACzE,IAAA,IAAI,IAAA,CAAK,IAAI,QAAQ,CAAA,GAAI,QAAQ,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,GAAI,IAAA,EAAM;AAC3D,MAAA,IAAA,CAAK,kBAAA,CAAmB,KAAA,EAAO,MAAA,EAAQ,SAAA,EAAW,gBAAe,eAAe,CAAA;AAAA,IAClF;AAAA,EACF;AAAA,EAEA,iBAAiB,WAAA,EAAqB,EAAA,EAAY,UAAA,GAAa,EAAA,EAAI,WAAW,CAAA,EAAuB;AACnG,IAAA,IAAI,cAAc,CAAA,IAAK,WAAA,IAAe,IAAA,CAAK,MAAA,CAAO,WAAW,MAAA,EAAQ;AACnE,MAAA,OAAO,EAAE,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAQ,EAAG,OAAO,MAAM;AAAA,MAAC,CAAA,EAAG,QAAQ,MAAM;AAAA,MAAC,CAAA,EAAG,QAAQ,MAAM;AAAA,MAAC,CAAA,EAAE;AAAA,IAC3F;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,WAAW,CAAA;AACnD,IAAA,MAAM,MAAA,GAAS,QAAQ,EAAE,CAAA;AACzB,IAAA,IAAA,CAAK,YAAA,CAAa,WAAW,CAAA,GAAI,MAAA;AAEjC,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,QAAA,EAAU,QAAQ,UAAU,CAAA;AAErE,IAAA,MAAM,SAAA,GAAY,eAAA,CAAe,kBAAA,CAAmB,WAAW,IAAI,MAAA,GAAS,QAAA;AAC5E,IAAA,IAAI,IAAA,CAAK,IAAI,QAAQ,CAAA,IAAK,QAAQ,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,IAAK,IAAA,EAAM;AAC7D,MAAA,OAAO,WAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,sBAAA,CAAuB,KAAA,EAAO,QAAQ,SAAA,EAAW,eAAA,CAAe,iBAAiB,UAAU,CAAA;AAClH,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,CAAC,WAAA,EAAa,SAAS,CAAC,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAMA,cAAA,CAAe,IAAY,MAAA,EAAsB;AAC/C,IAAA,IAAA,CAAK,UAAA,CAAW,EAAE,CAAA,GAAI,OAAA,CAAQ,MAAM,CAAA;AACpC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA,IAAK,CAAA;AAC/B,IAAA,IAAI,CAAA,GAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAE3B,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,EAAE,CAAA;AAC7C,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,KAAA,MAAW,WAAW,YAAA,EAAc;AAClC,QAAA,IAAA,CAAK,qBAAA,CAAsB,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,eAAe,EAAA,EAAoB;AACjC,IAAA,OAAO,IAAA,CAAK,WAAW,EAAE,CAAA,IAAK,KAAK,MAAA,CAAO,aAAA,GAAgB,EAAE,CAAA,IAAK,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAMA,KAAA,GAAc;AAAE,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EAAM;AAAA,EACtC,MAAA,GAAe;AAAE,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EAAO;AAAA,EACxC,SAAA,GAAqB;AAAE,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EAAU;AAAA,EAC7C,gBAAA,GAAyB;AAAE,IAAA,IAAA,CAAK,UAAU,gBAAA,EAAiB;AAAA,EAAG;AAAA,EAC9D,wBAAA,GAAmC;AAAE,IAAA,OAAO,IAAA,CAAK,UAAU,wBAAA,EAAyB;AAAA,EAAG;AAAA,EAEvF,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,WAAW,EAAC;AACjB,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAEtB,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,MAAA,EAAQ;AAC3B,MAAA,MAAM,OAAO,CAAA,CAAE,qBAAA;AACf,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,QAAA,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA;AAAA,MACZ;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,OAAO,IAAA,CAAK,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC3C,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,KAAA,CAAM,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,OAAc,CAAA;AAC5C,MAAA,KAAA,CAAM,GAAA,CAAI,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAAA,IAC1C,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAMA,WAAA,GAA0B;AACxB,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,OAAO,EAAC;AACzB,IAAA,MAAM,SAAqB,EAAC;AAC5B,IAAA,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,CAAC,GAAA,KAAa;AAChC,MAAA,IAAI,IAAI,MAAA,EAAQ;AACd,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,UAAA,EAAY,GAAA,CAAI,qBAAA,EAAuB,MAAA,IAAU;AAAA,SAClD,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,cAAA,CAAe,UAAkB,OAAA,EAAwB;AACvD,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACjB,IAAA,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,CAAC,GAAA,KAAa;AAChC,MAAA,IAAI,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,IAAA,KAAS,QAAA,EAAU;AACvC,QAAA,GAAA,CAAI,OAAA,GAAU,OAAA;AAAA,MAChB;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,QAAA,EAAiC;AAC7C,IAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AACd,IAAA,IAAA,CAAK,UAAA,GAAa,EAAE,GAAG,QAAA,CAAS,aAAA,EAAc;AAAA,EAChD;AAAA,EAEA,aAAA,GAAiC;AAAE,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAAQ;AAAA;AAAA;AAAA;AAAA,EAM/C,iBAAA,CAAkB,MAAc,OAAA,EAAmD;AACzF,IAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,GAAA,CAAI,CAAA,EAAG,OAAA,IAAW,CAAC,CAAC,CAAA;AAChD,IAAA,IAAI,MAAM,CAAA,EAAG,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,OAAO,IAAA,EAAK;AAC9C,IAAA,IAAI,CAAA,GAAI,GAAG,OAAO,EAAE,MAAM,IAAA,EAAM,KAAA,EAAO,IAAA,IAAQ,CAAA,GAAI,CAAA,CAAA,EAAG;AACtD,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,IAAQ,CAAA,GAAI,CAAA,CAAA,EAAI,OAAO,IAAA,EAAK;AAAA,EAC7C;AAAA,EAEQ,kBAAkB,IAAA,EAAwB;AAChD,IAAA,MAAM,OAAO,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,IAAI,CAAC,CAAA;AAC9C,IAAA,IAAI,CAAC,MAAM,QAAA,EAAU,OAAO,KAAK,MAAA,CAAO,WAAA,EAAa,QAAQ,EAAC;AAC9D,IAAA,QAAQ,KAAK,QAAA;AAAU,MACrB,KAAK,QAAA;AAAU,QAAA,OAAO,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa,MAAA,IAAU,EAAC;AAAA,MAC1D,KAAK,KAAA;AAAO,QAAA,OAAO,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa,GAAA,IAAO,EAAC;AAAA,MACpD;AAAS,QAAA,OAAO,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa,IAAA,IAAQ,EAAC;AAAA;AACpD,EACF;AAAA,EAEQ,cAAc,GAAA,EAAqB;AACzC,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,IAAA,GAAO,KAAK,QAAA,CAAS,qBAAA;AAC3B,MAAA,MAAM,IAAA,GAAO,KAAK,QAAA,CAAS,qBAAA;AAC3B,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,MAAM,GAAA,GAAM,KAAK,GAAG,CAAA;AACpB,QAAA,IAAI,GAAA,KAAQ,MAAA,EAAW,OAAO,IAAA,CAAK,GAAG,CAAA,IAAK,CAAA;AAAA,MAC7C;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,MAAA,EAAQ;AAC9B,MAAA,MAAM,OAAO,IAAA,CAAK,qBAAA;AAClB,MAAA,MAAM,OAAO,IAAA,CAAK,qBAAA;AAClB,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM;AACpB,MAAA,MAAM,GAAA,GAAM,KAAK,GAAG,CAAA;AACpB,MAAA,IAAI,GAAA,KAAQ,MAAA,EAAW,OAAO,IAAA,CAAK,GAAG,CAAA,IAAK,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEQ,UAAU,EAAA,EAAqB;AACrC,IAAA,OAAO,CAAC,EAAE,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,EAAE,CAAA,EAAG,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,EAAE,CAAA,EAAG,MAAA,CAAA;AAAA,EAC7E;AAAA,EAEQ,iBAAA,GAA0B;AAChC,IAAA,MAAM,QAAA,GAAW,EAAE,KAAA,EAAO,CAAA,EAAG,YAAY,CAAA,EAAE;AAC3C,IAAA,IAAA,CAAK,YAAY,EAAC;AAClB,IAAA,IAAA,CAAK,sBAAsB,KAAA,EAAM;AAEjC,IAAA,MAAM,cAAc,KAAA,CAAM,IAAA;AAAA,MACxB,IAAI,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,KAAK,MAAA,CAAO,SAAS,CAAA,CAAE,IAAA,GAAO,GAAA,CAAI,CAAC,OAAA,KAAY,OAAA,CAAQ,IAAI,CAAC;AAAA,KACpF;AAEA,IAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,MAAA,IAAA,CAAK,UAAU,IAAI,CAAA,GAAI,EAAE,KAAA,EAAO,EAAE,GAAG,QAAA,EAAS,EAAG,GAAA,EAAK,EAAE,GAAG,QAAA,EAAS,EAAG,MAAM,EAAE,GAAG,UAAS,EAAE;AAC7F,MAAA,IAAA,CAAK,qBAAA,CAAsB,IAAI,IAAI,CAAA;AAAA,IACrC;AAAA,EACF;AAAA,EAEQ,kBAAA,CAAmB,OAAA,EAAiB,IAAA,EAAgC,KAAA,EAAe,UAAA,EAA0B;AACnH,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,EAAG;AAC9B,IAAA,IAAA,CAAK,UAAU,OAAO,CAAA,CAAE,IAAI,CAAA,GAAI,EAAE,OAAO,IAAA,CAAK,GAAA,CAAI,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,KAAK,CAAC,GAAG,UAAA,EAAY,OAAA,CAAQ,UAAU,CAAA,EAAE;AAC3G,IAAA,IAAA,CAAK,qBAAA,CAAsB,IAAI,OAAO,CAAA;AAAA,EACxC;AAAA,EAEQ,qBAAA,CAAsB,OAAA,EAAiB,OAAA,EAA6B,KAAA,EAAe,QAAA,EAAwB;AACjH,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,OAAO,GAAG,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA,GAAI,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AACjF,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAC/C,IAAA,MAAM,SAAS,OAAA,GAAU,QAAA;AACzB,IAAA,IAAI,YAAY,IAAA,EAAM,IAAA,CAAK,YAAA,CAAa,OAAO,EAAE,CAAA,GAAI,MAAA;AAAA,SAAA,IAC5C,YAAY,IAAA,EAAM,IAAA,CAAK,YAAA,CAAa,OAAO,EAAE,CAAA,GAAI,MAAA;AAAA,SACrD,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA,CAAE,CAAA,GAAI,MAAA;AACpC,IAAA,IAAA,CAAK,qBAAA,CAAsB,IAAI,OAAO,CAAA;AAAA,EACxC;AAAA,EAEQ,uBAAuB,OAAA,EAAiB,IAAA,EAAgC,EAAA,EAAY,UAAA,EAAoB,aAAa,GAAA,EAAuB;AAClJ,IAAA,MAAM,aAAA,GAAgB,CAAA,KAAA,EAAQ,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAC7C,IAAA,MAAM,OAAO,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,GAAI,IAAI,GAAG,KAAA,IAAS,CAAA;AACvD,IAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,GAAA,CAAI,CAAA,EAAG,EAAE,CAAC,CAAA;AAC3C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,aAAA,EAAe,MAAM,MAAA,EAAQ,UAAA,EAAY,CAAC,KAAA,KAAU,KAAK,kBAAA,CAAmB,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,UAAU,CAAC,CAAA;AAAA,EACnJ;AAAA,EAEQ,0BAA0B,OAAA,EAAiB,OAAA,EAA6B,EAAA,EAAY,QAAA,EAAkB,aAAa,GAAA,EAAuB;AAChJ,IAAA,MAAM,aAAA,GAAgB,CAAA,MAAA,EAAS,OAAO,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AACjD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA,IAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AACjE,IAAA,MAAM,aAAA,GAAgB,YAAY,IAAA,GAAO,OAAA,CAAQ,IAAI,OAAA,KAAY,IAAA,GAAO,OAAA,CAAQ,CAAA,GAAI,OAAA,CAAQ,CAAA;AAC5F,IAAA,MAAM,IAAA,GAAO,QAAA,KAAa,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,aAAA,GAAgB,QAAQ,CAAC,CAAA,GAAI,CAAA;AACpF,IAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,GAAA,CAAI,CAAA,EAAG,EAAE,CAAC,CAAA;AAC3C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,aAAA,EAAe,MAAM,MAAA,EAAQ,UAAA,EAAY,CAAC,KAAA,KAAU,KAAK,qBAAA,CAAsB,OAAA,EAAS,OAAA,EAAS,KAAA,EAAO,QAAQ,CAAC,CAAA;AAAA,EACvJ;AAAA,EAEQ,sBAAA,GAA+B;AACrC,IAAA,IAAI,IAAA,CAAK,qBAAA,CAAsB,IAAA,KAAS,CAAA,EAAG;AAC3C,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,qBAAA,EAAuB;AAChD,MAAA,IAAA,CAAK,uBAAuB,OAAkB,CAAA;AAAA,IAChD;AACA,IAAA,IAAA,CAAK,sBAAsB,KAAA,EAAM;AAAA,EACnC;AAAA,EAEQ,uBAAuB,OAAA,EAAwB;AACrD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,IAAA,CAAK,KAAA,EAAO;AACzB,MAAA,IAAI,CAAC,SAAS,IAAA,CAAK,QAAA,IAAY,CAAC,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,OAAO,CAAA,EAAG;AACrE,QAAA,IAAA,CAAK,mBAAA,CAAoB,IAAI,OAAO,CAAA;AAAA,MACtC;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAS,SAAA,EAAU,GAAI,KAAA;AACpC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AACvC,IAAA,IAAI,CAAC,QAAA,EAAU;AAEf,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,UAAA,GAAa,SAAS,GAAA,CAAI,KAAA;AACtD,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,UAAA,GAAa,SAAS,KAAA,CAAM,KAAA;AAC5D,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,IAAA,CAAK,UAAA,GAAa,SAAS,IAAA,CAAK,KAAA;AAEzD,IAAA,GAAA,CAAI,QAAA,CAAS,KAAK,OAAc,CAAA;AAChC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA;AACnC,IAAA,IAAI,CAAA,EAAG;AACL,MAAA,GAAA,CAAI,QAAA,CAAS,KAAK,CAAA,CAAE,CAAA;AACpB,MAAA,GAAA,CAAI,QAAA,CAAS,KAAK,CAAA,CAAE,CAAA;AACpB,MAAA,GAAA,CAAI,QAAA,CAAS,KAAK,CAAA,CAAE,CAAA;AAAA,IACtB;AAEA,IAAA,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,SAAA,CAAU,CAAA,GAAI,QAAA,EAAU,SAAA,CAAU,CAAA,GAAI,MAAA,EAAQ,SAAA,CAAU,CAAA,GAAI,OAAA,EAAS,SAAA,CAAU,KAAK,CAAA;AACrG,IAAA,GAAA,CAAI,kBAAkB,KAAK,CAAA;AAC3B,IAAA,IAAA,CAAK,KAAA,CAAM,kBAAkB,IAAI,CAAA;AAAA,EACnC;AAAA,EAEQ,aAAa,IAAA,EAAmC;AACtD,IAAA,MAAM,WAA0B,EAAC;AAEjC,IAAA,MAAM,QAAA,GAAW,CAAC,GAAA,MAAwB;AAAA,MACxC,GAAA;AAAA,MACA,OAAA,EAAS,EAAE,CAAA,EAAG,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,SAAS,CAAA,EAAE;AAAA,MACnE,QAAA,EAAU,GAAA,CAAI,UAAA,CAAW,KAAA,EAAM;AAAA,MAC/B,WAAW,EAAE,CAAA,EAAG,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAG,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,GAAG,GAAA,CAAI,QAAA,CAAS,GAAG,KAAA,EAAO,GAAA,CAAI,SAAS,KAAA;AAAM,KAClG,CAAA;AAEA,IAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAAmD;AACnE,MAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,MAAA,OAAO,IAAA,CAAK,gBAAgB,IAAI,CAAA;AAAA,IAClC,CAAA;AAEA,IAAA,KAAA,MAAW,CAAC,KAAK,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,EAAG;AACnE,MAAA,MAAM,IAAA,GAAO,SAAS,QAAQ,CAAA;AAC9B,MAAA,IAAI,IAAA,EAAM,QAAA,CAAS,GAAG,CAAA,GAAI,SAAS,IAAI,CAAA;AAAA,IACzC;AAEA,IAAA,IAAI,CAAC,QAAA,CAAS,KAAA,IAAS,IAAA,CAAK,OAAO,YAAA,EAAc;AAC/C,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,aAAa,IAAI,CAAA;AACnD,MAAA,IAAI,IAAA,EAAM,QAAA,CAAS,KAAA,GAAQ,QAAA,CAAS,IAAI,CAAA;AAAA,IAC1C;AACA,IAAA,IAAI,CAAC,QAAA,CAAS,KAAA,IAAS,IAAA,CAAK,OAAO,YAAA,EAAc;AAC/C,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,aAAa,KAAK,CAAA;AACpD,MAAA,IAAI,IAAA,EAAM,QAAA,CAAS,KAAA,GAAQ,QAAA,CAAS,IAAI,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,eAAe,OAAA,EAA+C;AACpE,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,EAAE,SAAS,OAAA,CAAQ,OAAA,EAAQ,EAAG,KAAA,EAAO,MAAM;AAAA,IAAC,CAAA,EAAG,QAAQ,MAAM;AAAA,IAAC,CAAA,EAAG,QAAQ,MAAM;AAAA,IAAC,CAAA,EAAE;AACnH,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,QAAQ,CAAC,CAAA;AAC1C,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAC,CAAA,CAAE,IAAA,CAAK,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,MACjE,KAAA,EAAO,MAAM,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA;AAAA,MAC7C,MAAA,EAAQ,MAAM,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAA;AAAA,MAC/C,MAAA,EAAQ,MAAM,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ;AAAA,KACjD;AAAA,EACF;AACF,CAAA;AAAA;AAzjBE,aAAA,CAtCW,iBAsCa,oBAAA,EAA+B;AAAA,EACrD,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,GAAA;AAAA,EAAM,IAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,IAAA;AAAA,EAChD,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,GAAA;AAAA,EAAM;AAChC,CAAA,CAAA;AACA,aAAA,CA1CW,iBA0Ca,iBAAA,EAAkB,EAAA,CAAA;AA1CrC,IAAM,cAAA,GAAN;AAomBA,SAAS,mBAAmB,IAAA,EAAgC;AACjE,EAAA,MAAM,SAAqB,EAAC;AAC5B,EAAA,IAAA,CAAK,QAAA,CAAS,CAAC,GAAA,KAAa;AAC1B,IAAA,IAAI,IAAI,MAAA,EAAQ;AACd,MAAA,IAAI,KAAA,CAAM,QAAQ,GAAA,CAAI,qBAAqB,KAAK,GAAA,CAAI,qBAAA,CAAsB,SAAS,CAAA,EAAG;AACpF,QAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,MACjB;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,MAAA;AACT;;;ACjlBO,IAAM,2BAAA,GAAiD;AAAA,EAC5D,IAAA,EAAM,CAAA;AAAA,EACN,SAAA,EAAW,EAAA;AAAA,EACX,OAAA,EAAS,GAAA;AAAA,EACT,OAAA,EAAS,GAAA;AAAA,EACT,aAAA,EAAe,GAAA;AAAA,EACf,WAAA,EAAa,KAAA;AAAA,EACb,YAAA,EAAc,CAAA;AAAA,EACd,cAAA,EAAgB,CAAA;AAAA,EAChB,cAAA,EAAgB,CAAA;AAAA,EAChB,cAAA,EAAgB,GAAA;AAAA,EAChB,aAAA,EAAe;AACjB;AAEO,IAAM,cAAN,MAAkB;AAAA,EASvB,WAAA,CAAY,MAAA,GAAqC,EAAC,EAAG;AARrD,IAAA,aAAA,CAAA,IAAA,EAAQ,QAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,OAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,MAAA,EAAe,CAAA,CAAA;AAGvB;AAAA,IAAA,aAAA,CAAA,IAAA,EAAQ,aAAA,EAAsB,CAAA,CAAA;AAC9B,IAAA,aAAA,CAAA,IAAA,EAAQ,eAAA,EAAwB,CAAA,CAAA;AAG9B,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAG,2BAAA,EAA6B,GAAG,MAAA,EAAO;AAC1D,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAE;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAA,CAAO,IAAY,SAAA,EAAuC;AACxD,IAAA,IAAI,EAAA,IAAM,CAAA,IAAK,EAAA,GAAK,GAAA,EAAK;AAEvB,MAAA,OAAO,KAAK,kBAAA,EAAmB;AAAA,IACjC;AAEA,IAAA,IAAA,CAAK,IAAA,IAAQ,EAAA;AAEb,IAAA,MAAM,EAAE,MAAM,SAAA,EAAW,OAAA,EAAS,SAAS,aAAA,EAAe,WAAA,KAAgB,IAAA,CAAK,MAAA;AAG/E,IAAA,MAAM,UAAA,GAAa,UAAU,WAAA,KAAgB,CAAA,GACzC,UAAU,WAAA,GAAA,CACT,SAAA,CAAU,GAAA,GAAM,IAAA,CAAK,WAAA,IAAe,EAAA;AACzC,IAAA,MAAM,YAAA,GAAe,UAAU,aAAA,KAAkB,CAAA,GAC7C,UAAU,aAAA,GAAA,CACT,SAAA,CAAU,KAAA,GAAQ,IAAA,CAAK,aAAA,IAAiB,EAAA;AAE7C,IAAA,IAAA,CAAK,cAAc,SAAA,CAAU,GAAA;AAC7B,IAAA,IAAA,CAAK,gBAAgB,SAAA,CAAU,KAAA;AAK/B,IAAA,MAAM,QAAA,GAAW,CAAC,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,CAAA;AACzC,IAAA,MAAM,QAAA,GAAW,CAAC,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,CAAA;AAGzC,IAAA,MAAM,MAAA,GAAS,CAAC,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,EAAA;AACrC,IAAA,MAAM,MAAA,GAAS,CAAC,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,EAAA;AAKrC,IAAA,MAAM,YAAY,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,KAAK,CAAA,GAAI,GAAA;AAIxD,IAAA,MAAM,SAAA,GAAY,CAAC,UAAA,GAAa,aAAA,GAAgB,IAAA,GAAO,CAAA;AACvD,IAAA,MAAM,SAAA,GAAY,CAAC,YAAA,GAAe,aAAA,GAAgB,IAAA,GAAO,CAAA;AAGzD,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI,WAAA,IAAe,IAAA,CAAK,MAAA,CAAO,YAAA,GAAe,CAAA,EAAG;AAC/C,MAAA,MAAM,EAAE,YAAA,EAAc,cAAA,EAAgB,gBAAgB,cAAA,EAAgB,aAAA,KAAkB,IAAA,CAAK,MAAA;AAG7F,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,GAAO,aAAA,GAAgB,KAAK,EAAA,GAAK,CAAA;AACxD,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AAG1C,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,IAAA,GAAO,aAAA,GAAgB,GAAA;AACpD,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,eAAe,CAAA,GAAI,cAAA;AAE/C,MAAA,MAAA,GAAS,eAAe,cAAA,IAAkB,GAAA,GAAM,GAAA,GAAM,eAAA,CAAA,GAAmB,aAAc,CAAC,cAAA;AACxF,MAAA,MAAA,GAAS,YAAA,GAAe,cAAA,IAAkB,GAAA,GAAM,GAAA,GAAM,mBAAmB,UAAA,GAAa,cAAA;AAAA,IACxF;AAIA,IAAA,MAAM,OAAA,GAAU,QAAA,GAAW,MAAA,GAAS,SAAA,GAAY,MAAA;AAChD,IAAA,MAAM,OAAA,GAAU,QAAA,GAAW,MAAA,GAAS,SAAA,GAAY,SAAA,GAAY,MAAA;AAG5D,IAAA,MAAM,KAAK,OAAA,GAAU,IAAA;AACrB,IAAA,MAAM,KAAK,OAAA,GAAU,IAAA;AAGrB,IAAA,IAAA,CAAK,KAAA,CAAM,MAAM,EAAA,GAAK,EAAA;AACtB,IAAA,IAAA,CAAK,KAAA,CAAM,MAAM,EAAA,GAAK,EAAA;AAGtB,IAAA,MAAM,MAAA,GAAS,EAAA;AACf,IAAA,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAC,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,EAAE,CAAC,CAAA;AACjE,IAAA,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAC,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,EAAE,CAAC,CAAA;AAGjE,IAAA,IAAA,CAAK,KAAA,CAAM,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA;AAChC,IAAA,IAAA,CAAK,KAAA,CAAM,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA;AAGhC,IAAA,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AACrD,IAAA,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAErD,IAAA,OAAO,KAAK,kBAAA,EAAmB;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kBAAA,GAAsC;AAC5C,IAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAE,GAAI,IAAA,CAAK,KAAA;AAQtB,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAClC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AAClC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AAKlC,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAClC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AAClC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AAElC,IAAA,OAAO;AAAA,MACL,WAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAA6B;AAC3B,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,MAAA,EAA0C;AAClD,IAAA,IAAA,CAAK,SAAS,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,MAAA,EAAO;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAA+B;AAC7B,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,MAAA,EAAO;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAE;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,CAAA;AACZ,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AACnB,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AAAA,EACvB;AACF","file":"index.cjs","sourcesContent":["/**\n * AnimationThree - Lerp-based animation system\n *\n * Default implementation of the Animation interface.\n * Uses simple lerp interpolation with easing functions.\n */\n\nimport type { TransitionHandle } from '../../core/types';\nimport type { Animation } from '../../interfaces/Animation';\n\ntype Transition = {\n key: string;\n from: number;\n to: number;\n duration: number; // seconds\n elapsed: number; // seconds\n apply: (value: number) => void;\n easing: (t: number) => number;\n resolve?: () => void; // Called when transition completes\n paused: boolean; // Individual pause state\n};\n\nconst easeInOutQuad = (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t);\n\nexport class AnimationThree implements Animation {\n private transitions = new Map<string, Transition>();\n\n /**\n * Tick all active transitions by dt seconds.\n * Applies eased interpolation and removes completed transitions.\n * Respects individual transition pause state.\n */\n tick(dtSeconds: number): void {\n if (dtSeconds <= 0) return;\n\n const completed: string[] = [];\n\n this.transitions.forEach((t, key) => {\n // Skip paused transitions\n if (t.paused) return;\n\n t.elapsed += dtSeconds;\n const progress = Math.min(t.elapsed / t.duration, 1.0);\n const easedProgress = t.easing(progress);\n\n // Interpolate and apply\n const value = t.from + (t.to - t.from) * easedProgress;\n t.apply(value);\n\n // Check completion\n if (progress >= 1.0) {\n completed.push(key);\n t.resolve?.();\n }\n });\n\n // Remove completed transitions\n completed.forEach(key => this.transitions.delete(key));\n }\n\n /**\n * Add or replace a transition for the given key.\n * If a transition with the same key exists, it is cancelled and replaced.\n * @returns TransitionHandle with { promise, pause, resume, cancel }\n */\n addTransition(\n key: string,\n from: number,\n to: number,\n durationMs: number,\n apply: (value: number) => void,\n easing: (t: number) => number = easeInOutQuad\n ): TransitionHandle {\n // Convert to seconds once here - all callers pass milliseconds\n const durationSec = durationMs / 1000;\n\n // Cancel existing transition for this key\n const existing = this.transitions.get(key);\n if (existing?.resolve) {\n existing.resolve(); // Resolve immediately (cancelled)\n }\n\n // Instant transition if duration is 0 or values are equal\n if (durationSec <= 0 || Math.abs(to - from) < 1e-6) {\n apply(to);\n return {\n promise: Promise.resolve(),\n pause: () => {},\n resume: () => {},\n cancel: () => {},\n };\n }\n\n const promise = new Promise<void>((resolve) => {\n const transitionObj: Transition = {\n key,\n from,\n to,\n duration: durationSec,\n elapsed: 0,\n apply,\n easing,\n resolve,\n paused: false,\n };\n this.transitions.set(key, transitionObj);\n });\n\n return {\n promise,\n pause: () => {\n const t = this.transitions.get(key);\n if (t) t.paused = true;\n },\n resume: () => {\n const t = this.transitions.get(key);\n if (t) t.paused = false;\n },\n cancel: () => {\n const t = this.transitions.get(key);\n if (t) {\n t.resolve?.();\n this.transitions.delete(key);\n }\n },\n };\n }\n\n /** Clear all running transitions. */\n clearTransitions(): void {\n this.transitions.forEach(t => t.resolve?.());\n this.transitions.clear();\n }\n\n /** Get count of active transitions. */\n getActiveTransitionCount(): number {\n return this.transitions.size;\n }\n}\n","/**\n * CC4 Preset - Character Creator 4 AU Mappings\n *\n * Complete FACS Action Unit to morph target and bone mappings for CC4 rigs.\n * This includes all the composite rotations, continuum pairs, mesh classifications,\n * and AU metadata that we painstakingly worked through.\n */\n\nimport type { AUMappingConfig } from '../mappings/types';\nimport type { BoneBinding, AUInfo, CompositeRotation } from '../core/types';\n\n// ============================================================================\n// AU TO MORPHS - Maps AU IDs to morph target names\n// ============================================================================\n\nexport const AU_TO_MORPHS: Record<number, string[]> = {\n // Brows / Forehead\n 1: ['Brow_Raise_Inner_L','Brow_Raise_Inner_R'],\n 2: ['Brow_Raise_Outer_L','Brow_Raise_Outer_R'],\n 4: ['Brow_Drop_L','Brow_Drop_R'],\n\n // Eyes / Lids\n 5: ['Eye_Wide_L','Eye_Wide_R'],\n 6: ['Cheek_Raise_L','Cheek_Raise_R'],\n 7: ['Eye_Squint_L','Eye_Squint_R'],\n 43: ['Eye_Blink_L','Eye_Blink_R'],\n 45: ['Eye_Blink_L','Eye_Blink_R'], // Blink alias\n\n // Nose / Midface\n 9: ['Nose_Sneer_L','Nose_Sneer_R'],\n 34: ['Cheek_Puff_L','Cheek_Puff_R'],\n\n // Mouth / Lips\n 8: ['Mouth_Press_L','Mouth_Press_R','Mouth_Close'],\n 10: ['Nose_Sneer_L','Nose_Sneer_R'], // Upper Lip Raiser (levator labii superioris) - raises upper lip in disgust/sneer\n 11: ['Mouth_Up_Upper_L','Mouth_Up_Upper_R'], // Nasolabial Deepener (zygomaticus minor) - no dedicated morph\n 12: ['Mouth_Smile_L','Mouth_Smile_R'],\n 13: ['Mouth_Dimple_L','Mouth_Dimple_R'], // Sharp Lip Puller (levator anguli oris) - pulls lip corners up\n 14: ['Mouth_Press_L','Mouth_Press_R'],\n 15: ['Mouth_Frown_L','Mouth_Frown_R'],\n 16: ['Mouth_Down_Lower_L','Mouth_Down_Lower_R'],\n 17: ['Mouth_Shrug_Lower'],\n 18: ['Mouth_Pucker'],\n 20: ['Mouth_Stretch_L','Mouth_Stretch_R'],\n 22: ['Mouth_Funnel'],\n 23: ['Mouth_Press_L','Mouth_Press_R'],\n 24: ['Mouth_Press_L','Mouth_Press_R'],\n 25: ['Jaw_Open'], // Lips Part - small jaw open with morph\n 26: ['Jaw_Open'], // Jaw Drop - mixed: bone rotation + Jaw_Open morph\n 27: ['Jaw_Open'], // Mouth Stretch - larger jaw open with morph\n 28: ['Mouth_Roll_In_Upper','Mouth_Roll_In_Lower'],\n 32: ['Mouth_Roll_In_Lower'], // Lip Bite - using roll in lower as approximation\n\n // Tongue\n 19: ['Tongue_Out'],\n 36: ['Tongue_Bulge_L','Tongue_Bulge_R'],\n 37: ['Tongue_Up'], // Tongue Up - morph + bone rotation\n 38: ['Tongue_Down'], // Tongue Down - morph + bone rotation\n 39: ['Tongue_L'], // Tongue Left - morph + bone rotation\n 40: ['Tongue_R'], // Tongue Right - morph + bone rotation\n 41: [], // Tongue Tilt Left - BONE ONLY\n 42: [], // Tongue Tilt Right - BONE ONLY\n // Extended tongue morphs (CC4-specific)\n 73: ['Tongue_Narrow'],\n 74: ['Tongue_Wide'],\n 75: ['Tongue_Roll'],\n 76: ['Tongue_Tip_Up'],\n 77: ['Tongue_Tip_Down'],\n\n // Jaw\n 29: ['Jaw_Forward'],\n 30: ['Jaw_L'], // Jaw Left - mixed: bone rotation + Jaw_L morph\n 31: [], // Jaw Clencher (masseter/temporalis) - no dedicated CC4 morph\n 35: ['Jaw_R'], // Jaw Right - mixed: bone rotation + Jaw_R morph\n\n // Head position (M51-M56 in FACS notation)\n 51: ['Head_Turn_L'], // Head turn left\n 52: ['Head_Turn_R'], // Head turn right\n 53: ['Head_Turn_Up'], // Head up\n 54: ['Head_Turn_Down'],\n 55: ['Head_Tilt_L'],\n 56: ['Head_Tilt_R'],\n\n // Eye Direction (convenience)\n 61: ['Eye_L_Look_L','Eye_R_Look_L'],\n 62: ['Eye_L_Look_R','Eye_R_Look_R'],\n 63: ['Eye_L_Look_Up','Eye_R_Look_Up'],\n 64: ['Eye_L_Look_Down','Eye_R_Look_Down'],\n // Single-eye controls (Left eye)\n 65: ['Eye_L_Look_L'],\n 66: ['Eye_L_Look_R'],\n 67: ['Eye_L_Look_Up'],\n 68: ['Eye_L_Look_Down'],\n // Single-eye controls (Right eye)\n 69: ['Eye_R_Look_L'],\n 70: ['Eye_R_Look_R'],\n 71: ['Eye_R_Look_Up'],\n 72: ['Eye_R_Look_Down'],\n\n // Eye morphs (CC_Base_Eye meshes)\n // EO morphs control the shadow/depth around the eyes\n 80: ['EO Bulge L', 'EO Bulge R'],\n 81: ['EO Depth L', 'EO Depth R'],\n 82: ['EO Inner Depth L', 'EO Inner Depth R'],\n 83: ['EO Inner Height L', 'EO Inner Height R'],\n 84: ['EO Inner Width L', 'EO Inner Width R'],\n 85: ['EO Outer Depth L', 'EO Outer Depth R'],\n 86: ['EO Outer Height L', 'EO Outer Height R'],\n 87: ['EO Outer Width L', 'EO Outer Width R'],\n 88: ['EO Upper Depth L', 'EO Upper Depth R'],\n 89: ['EO Lower Depth L', 'EO Lower Depth R'],\n 90: ['EO Center Upper Depth L', 'EO Center Upper Depth R'],\n 91: ['EO Center Upper Height L', 'EO Center Upper Height R'],\n 92: ['EO Center Lower Depth L', 'EO Center Lower Depth R'],\n 93: ['EO Center Lower Height L', 'EO Center Lower Height R'],\n 94: ['EO Inner Upper Depth L', 'EO Inner Upper Depth R'],\n 95: ['EO Inner Upper Height L', 'EO Inner Upper Height R'],\n 96: ['EO Inner Lower Depth L', 'EO Inner Lower Depth R'],\n 97: ['EO Inner Lower Height L', 'EO Inner Lower Height R'],\n 98: ['EO Outer Upper Depth L', 'EO Outer Upper Depth R'],\n 99: ['EO Outer Upper Height L', 'EO Outer Upper Height R'],\n 100: ['EO Outer Lower Depth L', 'EO Outer Lower Depth R'],\n 101: ['EO Outer Lower Height L', 'EO Outer Lower Height R'],\n 102: ['EO Duct Depth L', 'EO Duct Depth R'],\n};\n\n// ============================================================================\n// VISEME KEYS - Lip-sync phoneme targets\n// ============================================================================\n\nexport const VISEME_KEYS: string[] = [\n 'EE','Er','IH','Ah','Oh','W_OO','S_Z','Ch_J','F_V','TH','T_L_D_N','B_M_P','K_G_H_NG','AE','R'\n];\n\n// ============================================================================\n// BONE BINDINGS - AU to bone rotation/translation mappings\n// ============================================================================\n\nexport const BONE_AU_TO_BINDINGS: Record<number, BoneBinding[]> = {\n // Head turn and tilt (M51-M56) - use HEAD bone only (NECK should not rotate with head)\n // Three.js Y rotation: positive = counter-clockwise from above = head turns LEFT (character POV)\n 51: [\n { node: 'HEAD', channel: 'ry', scale: 1, maxDegrees: 30 }, // Head turn left\n ],\n 52: [\n { node: 'HEAD', channel: 'ry', scale: -1, maxDegrees: 30 }, // Head turn right\n ],\n 53: [\n { node: 'HEAD', channel: 'rx', scale: -1, maxDegrees: 20 }, // Head up\n ],\n 54: [\n { node: 'HEAD', channel: 'rx', scale: 1, maxDegrees: 20 }, // Head down\n ],\n 55: [\n { node: 'HEAD', channel: 'rz', scale: -1, maxDegrees: 15 }, // Head tilt left\n ],\n 56: [\n { node: 'HEAD', channel: 'rz', scale: 1, maxDegrees: 15 }, // Head tilt right\n ],\n // Eyes horizontal (yaw) - CC4 rigs use rz for horizontal eye rotation\n 61: [\n { node: 'EYE_L', channel: 'rz', scale: 1, maxDegrees: 32 }, // Eyes look left\n { node: 'EYE_R', channel: 'rz', scale: 1, maxDegrees: 32 },\n ],\n 62: [\n { node: 'EYE_L', channel: 'rz', scale: -1, maxDegrees: 32 }, // Eyes look right\n { node: 'EYE_R', channel: 'rz', scale: -1, maxDegrees: 32 },\n ],\n 63: [\n { node: 'EYE_L', channel: 'rx', scale: -1, maxDegrees: 32 },\n { node: 'EYE_R', channel: 'rx', scale: -1, maxDegrees: 32 },\n ],\n 64: [\n { node: 'EYE_L', channel: 'rx', scale: 1, maxDegrees: 32 },\n { node: 'EYE_R', channel: 'rx', scale: 1, maxDegrees: 32 },\n ],\n // Single-eye (Left) — horizontal (rz for CC4) and vertical (rx)\n 65: [ { node: 'EYE_L', channel: 'rz', scale: -1, maxDegrees: 15 } ],\n 66: [ { node: 'EYE_L', channel: 'rz', scale: 1, maxDegrees: 15 } ],\n 67: [ { node: 'EYE_L', channel: 'rx', scale: -1, maxDegrees: 12 } ],\n 68: [ { node: 'EYE_L', channel: 'rx', scale: 1, maxDegrees: 12 } ],\n // Single-eye (Right) — horizontal (rz for CC4) and vertical (rx)\n 69: [ { node: 'EYE_R', channel: 'rz', scale: -1, maxDegrees: 15 } ],\n 70: [ { node: 'EYE_R', channel: 'rz', scale: 1, maxDegrees: 15 } ],\n 71: [ { node: 'EYE_R', channel: 'rx', scale: -1, maxDegrees: 12 } ],\n 72: [ { node: 'EYE_R', channel: 'rx', scale: 1, maxDegrees: 12 } ],\n\n // Jaw / Mouth\n 8: [ // Lips Toward Each Other - slight jaw open helps sell the lip press\n { node: 'JAW', channel: 'rz', scale: 1, maxDegrees: 8 }, // Small downward rotation (jaw opening slightly)\n ],\n 25: [ // Lips Part — small jaw open\n { node: 'JAW', channel: 'rz', scale: 1, maxDegrees: 5.84 }, // 73% of 8\n ],\n 26: [\n { node: 'JAW', channel: 'rz', scale: 1, maxDegrees: 28 }, // 73% of 20\n ],\n 27: [ // Mouth Stretch — larger jaw open\n { node: 'JAW', channel: 'rz', scale: 1, maxDegrees: 32 }, // 73% of 25\n ],\n 29: [\n { node: 'JAW', channel: 'tz', scale: -1, maxUnits: 0.02 }, // Negative for forward thrust\n ],\n 30: [ // Jaw Left\n { node: 'JAW', channel: 'ry', scale: -1, maxDegrees: 5 },\n ],\n 35: [ // Jaw Right\n { node: 'JAW', channel: 'ry', scale: 1, maxDegrees: 5 },\n ],\n\n // Tongue\n 19: [\n { node: 'TONGUE', channel: 'tz', scale: -1, maxUnits: 0.008 },\n ],\n 37: [ // Tongue Up\n { node: 'TONGUE', channel: 'rz', scale: -1, maxDegrees: 45 },\n ],\n 38: [ // Tongue Down\n { node: 'TONGUE', channel: 'rz', scale: 1, maxDegrees: 45 },\n ],\n 39: [ // Tongue Left\n { node: 'TONGUE', channel: 'ry', scale: -1, maxDegrees: 10 },\n ],\n 40: [ // Tongue Right\n { node: 'TONGUE', channel: 'ry', scale: 1, maxDegrees: 10 },\n ],\n 41: [ // Tongue Tilt Left\n { node: 'TONGUE', channel: 'rx', scale: -1, maxDegrees: 20 },\n ],\n 42: [ // Tongue Tilt Right\n { node: 'TONGUE', channel: 'rx', scale: 1, maxDegrees: 20 },\n ],\n};\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/** Check if an AU has both morphs and bones (can blend between them) */\nexport const isMixedAU = (id: number): boolean =>\n !!(AU_TO_MORPHS[id]?.length && BONE_AU_TO_BINDINGS[id]?.length);\n\n/** Check if an AU has separate left/right morphs */\nexport const hasLeftRightMorphs = (auId: number): boolean => {\n const keys = AU_TO_MORPHS[auId] || [];\n // Match: _L, _R, Left, Right, or \" L\"/\" R\" (space+letter) at end of string\n return keys.some(k => /_L$|_R$| L$| R$|Left$|Right$/i.test(k));\n};\n\n// ============================================================================\n// COMPOSITE ROTATIONS - Unified rotation control for bones\n// ============================================================================\n\nexport const COMPOSITE_ROTATIONS: CompositeRotation[] = [\n {\n node: 'JAW',\n pitch: { aus: [25, 26, 27], axis: 'rz' }, // Jaw drop (opens mouth downward)\n yaw: { aus: [30, 35], axis: 'ry', negative: 30, positive: 35 }, // Jaw lateral (left/right)\n roll: null // Jaw doesn't have roll\n },\n {\n node: 'HEAD',\n pitch: { aus: [54, 53], axis: 'rx', negative: 54, positive: 53 }, // Head down/up\n yaw: { aus: [51, 52], axis: 'ry', negative: 51, positive: 52 }, // Head turn left/right\n roll: { aus: [55, 56], axis: 'rz', negative: 55, positive: 56 } // Head tilt left/right\n },\n {\n node: 'EYE_L',\n pitch: { aus: [64, 63], axis: 'rx', negative: 64, positive: 63 }, // Eyes down/up\n yaw: { aus: [61, 62], axis: 'rz', negative: 61, positive: 62 }, // Eyes left/right (rz for CC4)\n roll: null // Eyes don't have roll\n },\n {\n node: 'EYE_R',\n pitch: { aus: [64, 63], axis: 'rx', negative: 64, positive: 63 }, // Eyes down/up\n yaw: { aus: [61, 62], axis: 'rz', negative: 61, positive: 62 }, // Eyes left/right (rz for CC4)\n roll: null // Eyes don't have roll\n },\n {\n node: 'TONGUE',\n pitch: { aus: [38, 37], axis: 'rz', negative: 38, positive: 37 }, // Tongue down/up\n yaw: { aus: [39, 40], axis: 'ry', negative: 39, positive: 40 }, // Tongue left/right\n roll: { aus: [41, 42], axis: 'rx', negative: 41, positive: 42 } // Tongue tilt left/right\n }\n];\n\n// ============================================================================\n// CONTINUUM PAIRS - Bidirectional AU pair mappings\n// ============================================================================\n\n/**\n * Continuum pair mappings - precomputed from COMPOSITE_ROTATIONS\n * Maps AU ID to its continuum partner info for bidirectional axes\n * (e.g., AU 51 \"Head Left\" is paired with AU 52 \"Head Right\")\n */\nexport const CONTINUUM_PAIRS_MAP: Record<number, {\n pairId: number;\n isNegative: boolean;\n axis: 'pitch' | 'yaw' | 'roll';\n node: 'JAW' | 'HEAD' | 'EYE_L' | 'EYE_R' | 'TONGUE';\n}> = {\n // Eyes horizontal (yaw) - both eyes share same AUs\n 61: { pairId: 62, isNegative: true, axis: 'yaw', node: 'EYE_L' },\n 62: { pairId: 61, isNegative: false, axis: 'yaw', node: 'EYE_L' },\n // Eyes vertical (pitch)\n 64: { pairId: 63, isNegative: true, axis: 'pitch', node: 'EYE_L' },\n 63: { pairId: 64, isNegative: false, axis: 'pitch', node: 'EYE_L' },\n // Head yaw (turn left/right)\n 51: { pairId: 52, isNegative: true, axis: 'yaw', node: 'HEAD' },\n 52: { pairId: 51, isNegative: false, axis: 'yaw', node: 'HEAD' },\n // Head pitch (up/down)\n 54: { pairId: 53, isNegative: true, axis: 'pitch', node: 'HEAD' },\n 53: { pairId: 54, isNegative: false, axis: 'pitch', node: 'HEAD' },\n // Head roll (tilt left/right)\n 55: { pairId: 56, isNegative: true, axis: 'roll', node: 'HEAD' },\n 56: { pairId: 55, isNegative: false, axis: 'roll', node: 'HEAD' },\n // Jaw yaw (left/right)\n 30: { pairId: 35, isNegative: true, axis: 'yaw', node: 'JAW' },\n 35: { pairId: 30, isNegative: false, axis: 'yaw', node: 'JAW' },\n // Tongue yaw (left/right)\n 39: { pairId: 40, isNegative: true, axis: 'yaw', node: 'TONGUE' },\n 40: { pairId: 39, isNegative: false, axis: 'yaw', node: 'TONGUE' },\n // Tongue pitch (up/down)\n 38: { pairId: 37, isNegative: true, axis: 'pitch', node: 'TONGUE' },\n 37: { pairId: 38, isNegative: false, axis: 'pitch', node: 'TONGUE' },\n // Tongue roll (tilt left/right)\n 41: { pairId: 42, isNegative: true, axis: 'roll', node: 'TONGUE' },\n 42: { pairId: 41, isNegative: false, axis: 'roll', node: 'TONGUE' },\n // Extended tongue morphs (continuum pairs)\n 73: { pairId: 74, isNegative: true, axis: 'yaw', node: 'TONGUE' }, // Tongue Narrow/Wide\n 74: { pairId: 73, isNegative: false, axis: 'yaw', node: 'TONGUE' },\n 76: { pairId: 77, isNegative: false, axis: 'pitch', node: 'TONGUE' }, // Tongue Tip Up/Down\n 77: { pairId: 76, isNegative: true, axis: 'pitch', node: 'TONGUE' },\n};\n\n/**\n * Human-readable labels for continuum pairs\n * Key format: \"negativeAU-positiveAU\"\n * Used by UI components (ContinuumSlider, AUSection) to display friendly axis names\n */\nexport const CONTINUUM_LABELS: Record<string, string> = {\n '61-62': 'Eyes — Horizontal',\n '64-63': 'Eyes — Vertical',\n '51-52': 'Head — Horizontal',\n '54-53': 'Head — Vertical',\n '55-56': 'Head — Tilt',\n '30-35': 'Jaw — Horizontal',\n '38-37': 'Tongue — Vertical',\n '39-40': 'Tongue — Horizontal',\n '41-42': 'Tongue — Tilt',\n '73-74': 'Tongue — Width',\n '76-77': 'Tongue Tip — Vertical',\n};\n\n// ============================================================================\n// BONE NODE NAMES - CC4-specific skeleton hierarchy\n// ============================================================================\n\n// Canonical CC4 bone + mesh names. Since we only target CC4 rigs now, the mapping is explicit.\nexport const CC4_BONE_NODES = {\n EYE_L: 'CC_Base_L_Eye',\n EYE_R: 'CC_Base_R_Eye',\n HEAD: 'CC_Base_Head',\n NECK: 'CC_Base_NeckTwist01',\n NECK_TWIST: 'CC_Base_NeckTwist02',\n JAW: 'CC_Base_JawRoot',\n TONGUE: 'CC_Base_Tongue01'\n} as const;\n\nexport const CC4_EYE_MESH_NODES = {\n LEFT: 'CC_Base_Eye',\n RIGHT: 'CC_Base_Eye_1'\n} as const;\n\n// ============================================================================\n// AU INFO - Metadata for each Action Unit\n// ============================================================================\n\nexport const AU_INFO: Record<string, AUInfo> = {\n // Forehead / Brow (Upper)\n '1': { id:'1', name:'Inner Brow Raiser', muscularBasis:'frontalis (pars medialis)', links:['https://en.wikipedia.org/wiki/Frontalis_muscle'], faceArea:'Upper', facePart:'Forehead' },\n '2': { id:'2', name:'Outer Brow Raiser', muscularBasis:'frontalis (pars lateralis)', links:['https://en.wikipedia.org/wiki/Frontalis_muscle'], faceArea:'Upper', facePart:'Forehead' },\n '4': { id:'4', name:'Brow Lowerer', muscularBasis:'corrugator/depressor supercilii', links:['https://en.wikipedia.org/wiki/Corrugator_supercilii'], faceArea:'Upper', facePart:'Forehead' },\n\n // Eyelids / Eyes (Upper)\n '5': { id:'5', name:'Upper Lid Raiser', muscularBasis:'levator palpebrae superioris', links:['https://en.wikipedia.org/wiki/Levator_palpebrae_superioris'], faceArea:'Upper', facePart:'Eyelids' },\n '6': { id:'6', name:'Cheek Raiser', muscularBasis:'orbicularis oculi (pars orbitalis)', links:['https://en.wikipedia.org/wiki/Orbicularis_oculi'], faceArea:'Upper', facePart:'Cheeks' },\n '7': { id:'7', name:'Lid Tightener', muscularBasis:'orbicularis oculi (pars palpebralis)', links:['https://en.wikipedia.org/wiki/Orbicularis_oculi'], faceArea:'Upper', facePart:'Eyelids' },\n '43': { id:'43', name:'Eyes Closed', muscularBasis:'orbicularis oculi', links:['https://en.wikipedia.org/wiki/Orbicularis_oculi_muscle'], faceArea:'Upper', facePart:'Eyelids' },\n '45': { id:'45', name:'Blink', muscularBasis:'orbicularis oculi', links:['https://en.wikipedia.org/wiki/Orbicularis_oculi_muscle'], faceArea:'Upper', facePart:'Eyelids' },\n '61': { id:'61', name:'Eyes Turn Left', faceArea:'Upper', facePart:'Eyes' },\n '62': { id:'62', name:'Eyes Turn Right', faceArea:'Upper', facePart:'Eyes' },\n '63': { id:'63', name:'Eyes Up', faceArea:'Upper', facePart:'Eyes' },\n '64': { id:'64', name:'Eyes Down', faceArea:'Upper', facePart:'Eyes' },\n '65': { id:'65', name:'Left Eye Look Left', faceArea:'Upper', facePart:'Eyes' },\n '66': { id:'66', name:'Left Eye Look Right', faceArea:'Upper', facePart:'Eyes' },\n '67': { id:'67', name:'Left Eye Look Up', faceArea:'Upper', facePart:'Eyes' },\n '68': { id:'68', name:'Left Eye Look Down', faceArea:'Upper', facePart:'Eyes' },\n '69': { id:'69', name:'Right Eye Look Left', faceArea:'Upper', facePart:'Eyes' },\n '70': { id:'70', name:'Right Eye Look Right',faceArea:'Upper', facePart:'Eyes' },\n '71': { id:'71', name:'Right Eye Look Up', faceArea:'Upper', facePart:'Eyes' },\n '72': { id:'72', name:'Right Eye Look Down', faceArea:'Upper', facePart:'Eyes' },\n\n // Nose / Cheeks\n '9': { id:'9', name:'Nose Wrinkler', muscularBasis:'levator labii superioris alaeque nasi', links:['https://en.wikipedia.org/wiki/Levator_labii_superioris_alaeque_nasi'], faceArea:'Upper', facePart:'Nose' },\n '34': { id:'34', name:'Cheek Puff', faceArea:'Lower', facePart:'Cheeks' },\n\n // Mouth (Lower)\n '8': { id:'8', name:'Lips Toward Each Other', muscularBasis:'orbicularis oris', links:['https://en.wikipedia.org/wiki/Orbicularis_oris'], faceArea:'Lower', facePart:'Mouth' },\n '10': { id:'10', name:'Upper Lip Raiser', muscularBasis:'levator labii superioris', links:['https://en.wikipedia.org/wiki/Levator_labii_superioris'], faceArea:'Lower', facePart:'Mouth' },\n '11': { id:'11', name:'Nasolabial Deepener', muscularBasis:'zygomaticus minor', links:['https://en.wikipedia.org/wiki/Zygomaticus_minor'], faceArea:'Lower', facePart:'Cheeks' },\n '12': { id:'12', name:'Lip Corner Puller', muscularBasis:'zygomaticus major', links:['https://en.wikipedia.org/wiki/Zygomaticus_major'], faceArea:'Lower', facePart:'Mouth' },\n '13': { id:'13', name:'Sharp Lip Puller', muscularBasis:'levator anguli oris', links:['https://en.wikipedia.org/wiki/Levator_anguli_oris'], faceArea:'Lower', facePart:'Mouth' },\n '14': { id:'14', name:'Dimpler', muscularBasis:'buccinator', links:['https://en.wikipedia.org/wiki/Buccinator'], faceArea:'Lower', facePart:'Cheeks' },\n '15': { id:'15', name:'Lip Corner Depressor', muscularBasis:'depressor anguli oris', links:['https://en.wikipedia.org/wiki/Depressor_anguli_oris'], faceArea:'Lower', facePart:'Mouth' },\n '16': { id:'16', name:'Lower Lip Depressor', muscularBasis:'depressor labii inferioris', links:['https://en.wikipedia.org/wiki/Depressor_labii_inferioris'], faceArea:'Lower', facePart:'Mouth' },\n '17': { id:'17', name:'Chin Raiser', muscularBasis:'mentalis', links:['https://en.wikipedia.org/wiki/Mentalis'], faceArea:'Lower', facePart:'Chin' },\n '18': { id:'18', name:'Lip Pucker', faceArea:'Lower', facePart:'Mouth' },\n '20': { id:'20', name:'Lip Stretcher', muscularBasis:'risorius + platysma', links:['https://en.wikipedia.org/wiki/Risorius','https://en.wikipedia.org/wiki/Platysma'], faceArea:'Lower', facePart:'Mouth' },\n '22': { id:'22', name:'Lip Funneler', muscularBasis:'orbicularis oris', links:['https://en.wikipedia.org/wiki/Orbicularis_oris'], faceArea:'Lower', facePart:'Mouth' },\n '23': { id:'23', name:'Lip Tightener', muscularBasis:'orbicularis oris', faceArea:'Lower', facePart:'Mouth' },\n '24': { id:'24', name:'Lip Presser', muscularBasis:'orbicularis oris', faceArea:'Lower', facePart:'Mouth' },\n '25': { id:'25', name:'Lips Part', faceArea:'Lower', facePart:'Mouth' },\n '27': { id:'27', name:'Mouth Stretch', muscularBasis:'pterygoids + digastric', links:['https://en.wikipedia.org/wiki/Pterygoid_bone','https://en.wikipedia.org/wiki/Digastric_muscle'], faceArea:'Lower', facePart:'Mouth' },\n '28': { id:'28', name:'Lip Suck', muscularBasis:'orbicularis oris', faceArea:'Lower', facePart:'Mouth' },\n\n // Tongue (Lower)\n '19': { id:'19', name:'Tongue Show', faceArea:'Lower', facePart:'Tongue' },\n '36': { id:'36', name:'Tongue Bulge', faceArea:'Lower', facePart:'Tongue' },\n '37': { id:'37', name:'Tongue Up', faceArea:'Lower', facePart:'Tongue' },\n '38': { id:'38', name:'Tongue Down', faceArea:'Lower', facePart:'Tongue' },\n '39': { id:'39', name:'Tongue Left', faceArea:'Lower', facePart:'Tongue' },\n '40': { id:'40', name:'Tongue Right', faceArea:'Lower', facePart:'Tongue' },\n '41': { id:'41', name:'Tongue Tilt Left', faceArea:'Lower', facePart:'Tongue' },\n '42': { id:'42', name:'Tongue Tilt Right', faceArea:'Lower', facePart:'Tongue' },\n // Extended tongue controls (CC4-specific morphs)\n '73': { id:'73', name:'Tongue Narrow', faceArea:'Lower', facePart:'Tongue' },\n '74': { id:'74', name:'Tongue Wide', faceArea:'Lower', facePart:'Tongue' },\n '75': { id:'75', name:'Tongue Roll', faceArea:'Lower', facePart:'Tongue' },\n '76': { id:'76', name:'Tongue Tip Up', faceArea:'Lower', facePart:'Tongue' },\n '77': { id:'77', name:'Tongue Tip Down', faceArea:'Lower', facePart:'Tongue' },\n\n // Jaw (Lower)\n '26': { id:'26', name:'Jaw Drop', muscularBasis:'masseter (relax temporalis)', links:['https://en.wikipedia.org/wiki/Masseter_muscle'], faceArea:'Lower', facePart:'Jaw' },\n '29': { id:'29', name:'Jaw Thrust', faceArea:'Lower', facePart:'Jaw' },\n '30': { id:'30', name:'Jaw Left', faceArea:'Lower', facePart:'Jaw' },\n '31': { id:'31', name:'Jaw Clencher', muscularBasis:'masseter + temporalis', faceArea:'Lower', facePart:'Jaw' },\n '32': { id:'32', name:'Lip Bite', muscularBasis:'orbicularis oris', faceArea:'Lower', facePart:'Mouth' },\n '35': { id:'35', name:'Jaw Right', faceArea:'Lower', facePart:'Jaw' },\n\n // Head position (M51-M56 in FACS notation)\n '51': { id:'51', name:'Head Turn Left', faceArea:'Upper', facePart:'Head' },\n '52': { id:'52', name:'Head Turn Right', faceArea:'Upper', facePart:'Head' },\n '53': { id:'53', name:'Head Up', faceArea:'Upper', facePart:'Head' },\n '54': { id:'54', name:'Head Down', faceArea:'Upper', facePart:'Head' },\n '55': { id:'55', name:'Head Tilt Left', faceArea:'Upper', facePart:'Head' },\n '56': { id:'56', name:'Head Tilt Right', faceArea:'Upper', facePart:'Head' },\n\n // Eye (Upper) - EO morphs applied to CC_Base_Eye meshes\n '80': { id:'80', name:'Eye Bulge', faceArea:'Upper', facePart:'Eye' },\n '81': { id:'81', name:'Eye Depth', faceArea:'Upper', facePart:'Eye' },\n '82': { id:'82', name:'Eye Inner Depth', faceArea:'Upper', facePart:'Eye' },\n '83': { id:'83', name:'Eye Inner Height', faceArea:'Upper', facePart:'Eye' },\n '84': { id:'84', name:'Eye Inner Width', faceArea:'Upper', facePart:'Eye' },\n '85': { id:'85', name:'Eye Outer Depth', faceArea:'Upper', facePart:'Eye' },\n '86': { id:'86', name:'Eye Outer Height', faceArea:'Upper', facePart:'Eye' },\n '87': { id:'87', name:'Eye Outer Width', faceArea:'Upper', facePart:'Eye' },\n '88': { id:'88', name:'Eye Upper Depth', faceArea:'Upper', facePart:'Eye' },\n '89': { id:'89', name:'Eye Lower Depth', faceArea:'Upper', facePart:'Eye' },\n '90': { id:'90', name:'Eye Center Upper Depth', faceArea:'Upper', facePart:'Eye' },\n '91': { id:'91', name:'Eye Center Upper Height',faceArea:'Upper', facePart:'Eye' },\n '92': { id:'92', name:'Eye Center Lower Depth', faceArea:'Upper', facePart:'Eye' },\n '93': { id:'93', name:'Eye Center Lower Height',faceArea:'Upper', facePart:'Eye' },\n '94': { id:'94', name:'Eye Inner Upper Depth', faceArea:'Upper', facePart:'Eye' },\n '95': { id:'95', name:'Eye Inner Upper Height', faceArea:'Upper', facePart:'Eye' },\n '96': { id:'96', name:'Eye Inner Lower Depth', faceArea:'Upper', facePart:'Eye' },\n '97': { id:'97', name:'Eye Inner Lower Height', faceArea:'Upper', facePart:'Eye' },\n '98': { id:'98', name:'Eye Outer Upper Depth', faceArea:'Upper', facePart:'Eye' },\n '99': { id:'99', name:'Eye Outer Upper Height', faceArea:'Upper', facePart:'Eye' },\n '100': { id:'100', name:'Eye Outer Lower Depth', faceArea:'Upper', facePart:'Eye' },\n '101': { id:'101', name:'Eye Outer Lower Height',faceArea:'Upper', facePart:'Eye' },\n '102': { id:'102', name:'Eye Duct Depth', faceArea:'Upper', facePart:'Eye' },\n};\n\n// ============================================================================\n// MIX DEFAULTS - Morph/bone blend weights\n// ============================================================================\n\n/** Default mix weights (0 = morph only, 1 = bone only) */\nexport const AU_MIX_DEFAULTS: Record<number, number> = {\n 31: 0.7, 32: 0.7, 33: 0.7, 54: 0.7, 55: 0.7, 56: 0.7, // head\n 61: 0.5, 62: 0.5, 63: 0.5, 64: 0.5, // eyes\n 25: 0.5, 26: 0.5, 27: 0.5, // jaw open (lips part, jaw drop, mouth stretch)\n 30: 0.5, 35: 0.5, // jaw left/right\n};\n\n// ============================================================================\n// CC4 MESH CLASSIFICATION\n// ============================================================================\n\nexport type MeshCategory = 'body' | 'eye' | 'eyeOcclusion' | 'tearLine' | 'teeth' | 'tongue' | 'hair' | 'eyebrow' | 'cornea' | 'eyelash';\n\n/** Blending mode names (matches Three.js constants) */\nexport type BlendingMode = 'Normal' | 'Additive' | 'Subtractive' | 'Multiply' | 'None';\n\n/** Material settings for mesh rendering */\nexport interface MeshMaterialSettings {\n renderOrder?: number;\n transparent?: boolean;\n opacity?: number;\n depthWrite?: boolean;\n depthTest?: boolean;\n blending?: BlendingMode;\n}\n\n/** Mesh info including category, morph count, and optional material settings */\nexport interface CC4MeshInfo {\n category: MeshCategory;\n morphCount: number;\n material?: MeshMaterialSettings;\n}\n\n/** Exact mesh name -> category mapping from the character GLB */\nexport const CC4_MESHES: Record<string, CC4MeshInfo> = {\n // Body (6 meshes, 80 morphs each) - default render order 0\n 'CC_Base_Body_1': { category: 'body', morphCount: 80 },\n 'CC_Base_Body_2': { category: 'body', morphCount: 80 },\n 'CC_Base_Body_3': { category: 'body', morphCount: 80 },\n 'CC_Base_Body_4': { category: 'body', morphCount: 80 },\n 'CC_Base_Body_5': { category: 'body', morphCount: 80 },\n 'CC_Base_Body_6': { category: 'body', morphCount: 80 },\n // Eyes (bone-driven, no morphs) - render first (behind everything)\n 'CC_Base_Eye': { category: 'eye', morphCount: 0, material: { renderOrder: -10 } },\n 'CC_Base_Eye_1': { category: 'eye', morphCount: 0, material: { renderOrder: -10 } },\n 'CC_Base_Eye_2': { category: 'eye', morphCount: 0, material: { renderOrder: -10 } },\n 'CC_Base_Eye_3': { category: 'eye', morphCount: 0, material: { renderOrder: -10 } },\n 'CC_Base_Eye_4': { category: 'eye', morphCount: 0, material: { renderOrder: -10 } },\n // Eye occlusion (94 morphs each) - render on top of eyes with transparency support\n 'CC_Base_EyeOcclusion_1': { category: 'eyeOcclusion', morphCount: 94, material: { renderOrder: 2, transparent: true, opacity: 1, depthWrite: true, depthTest: true, blending: 'Normal' } },\n 'CC_Base_EyeOcclusion_2': { category: 'eyeOcclusion', morphCount: 94, material: { renderOrder: 2, transparent: true, opacity: 1, depthWrite: true, depthTest: true, blending: 'Normal' } },\n // Tear lines (90 morphs each) - on top of eyes/face\n 'CC_Base_TearLine_1': { category: 'tearLine', morphCount: 90, material: { renderOrder: 2 } },\n 'CC_Base_TearLine_2': { category: 'tearLine', morphCount: 90, material: { renderOrder: 2 } },\n // Cornea (no morphs) - render first with eyes\n 'CC_Base_Cornea': { category: 'cornea', morphCount: 0, material: { renderOrder: -10 } },\n 'CC_Base_Cornea_1': { category: 'cornea', morphCount: 0, material: { renderOrder: -10 } },\n // Teeth (no morphs, follow jaw bone) - default render order\n 'CC_Base_Teeth_1': { category: 'teeth', morphCount: 0 },\n 'CC_Base_Teeth_2': { category: 'teeth', morphCount: 0 },\n // Tongue (23 morphs) - default render order\n 'CC_Base_Tongue': { category: 'tongue', morphCount: 23 },\n // Eyebrows (91 morphs each) - above face\n 'Male_Bushy_1': { category: 'eyebrow', morphCount: 91, material: { renderOrder: 5 } },\n 'Male_Bushy_2': { category: 'eyebrow', morphCount: 91, material: { renderOrder: 5 } },\n // Hair (14 styling morphs each) - render last (on top of everything)\n 'Side_part_wavy_1': { category: 'hair', morphCount: 14, material: { renderOrder: 10 } },\n 'Side_part_wavy_2': { category: 'hair', morphCount: 14, material: { renderOrder: 10 } },\n};\n\n// ============================================================================\n// MORPH TO MESH MAPPING\n// ============================================================================\n\nexport type MorphCategory = 'face' | 'viseme' | 'eye' | 'tearLine' | 'tongue' | 'hair';\n\n/** Which mesh each morph category applies to */\nexport const MORPH_TO_MESH: Record<MorphCategory, string[]> = {\n // Face/AU morphs affect the main face mesh and both eyebrow meshes.\n face: ['CC_Base_Body_1', 'Male_Bushy_1', 'Male_Bushy_2'],\n viseme: ['CC_Base_Body_1'],\n eye: ['CC_Base_EyeOcclusion_1', 'CC_Base_EyeOcclusion_2'],\n tearLine: ['CC_Base_TearLine_1', 'CC_Base_TearLine_2'],\n tongue: ['CC_Base_Tongue'],\n hair: ['Side_part_wavy_1', 'Side_part_wavy_2'],\n};\n\n// ============================================================================\n// CC4_PRESET - Main export for AUMappingConfig\n// ============================================================================\n\nexport const CC4_PRESET: AUMappingConfig = {\n auToMorphs: AU_TO_MORPHS,\n auToBones: BONE_AU_TO_BINDINGS,\n boneNodes: CC4_BONE_NODES,\n morphToMesh: MORPH_TO_MESH,\n visemeKeys: VISEME_KEYS,\n auMixDefaults: AU_MIX_DEFAULTS,\n auInfo: AU_INFO,\n eyeMeshNodes: CC4_EYE_MESH_NODES,\n};\n\nexport default CC4_PRESET;\n","/**\n * LoomLargeThree - Three.js Implementation\n *\n * Default implementation of the LoomLarge interface for Three.js.\n * Controls 3D character facial animation using Action Units (AUs),\n * morph targets, visemes, and bone transformations.\n */\n\nimport { Clock } from 'three';\nimport type {\n LoomLarge,\n LoomMesh,\n LoomObject3D,\n ReadyPayload,\n LoomLargeConfig,\n MeshInfo,\n} from '../../interfaces/LoomLarge';\nimport type { Animation } from '../../interfaces/Animation';\nimport type { TransitionHandle, BoneKey, RotationsState } from '../../core/types';\nimport type { AUMappingConfig } from '../../mappings/types';\nimport { AnimationThree } from './AnimationThree';\nimport { CC4_PRESET } from '../../presets/cc4';\n\nconst deg2rad = (d: number) => (d * Math.PI) / 180;\n\nfunction clamp01(x: number) {\n return x < 0 ? 0 : x > 1 ? 1 : x;\n}\n\n/**\n * NodeBase - internal bone snapshot\n */\ninterface NodeBase {\n obj: LoomObject3D;\n basePos: { x: number; y: number; z: number };\n baseQuat: any;\n baseEuler: { x: number; y: number; z: number; order: string };\n}\n\ntype ResolvedBones = Partial<Record<string, NodeBase>>;\n\nexport class LoomLargeThree implements LoomLarge {\n // Configuration\n private config: AUMappingConfig;\n\n // Animation system (injectable)\n private animation: Animation;\n\n // State\n private auValues: Record<number, number> = {};\n private rigReady = false;\n private missingBoneWarnings = new Set<string>();\n\n // Rotation state\n private rotations: RotationsState = {};\n private pendingCompositeNodes = new Set<string>();\n private isPaused = false;\n private translations: Record<string, { x: number; y: number; z: number }> = {};\n\n // Mesh references\n private faceMesh: LoomMesh | null = null;\n private meshes: LoomMesh[] = [];\n private model: LoomObject3D | null = null;\n private meshByName = new Map<string, LoomMesh>();\n private morphCache = new Map<string, { infl: number[]; idx: number }[]>();\n\n // Bones\n private bones: ResolvedBones = {};\n private mixWeights: Record<number, number> = {};\n\n // Viseme state\n private visemeValues: number[] = new Array(15).fill(0);\n\n // Internal RAF loop\n private clock = new Clock();\n private rafId: number | null = null;\n private running = false;\n\n // Viseme jaw amounts\n private static readonly VISEME_JAW_AMOUNTS: number[] = [\n 0.15, 0.35, 0.25, 0.70, 0.55, 0.30, 0.10, 0.20, 0.08,\n 0.12, 0.18, 0.02, 0.25, 0.60, 0.40,\n ];\n private static readonly JAW_MAX_DEGREES = 28;\n\n constructor(config: LoomLargeConfig = {}, animation?: Animation) {\n this.config = config.auMappings || CC4_PRESET;\n this.mixWeights = { ...this.config.auMixDefaults };\n this.animation = animation || new AnimationThree();\n }\n\n // ============================================================================\n // PUBLIC API\n // ============================================================================\n\n onReady(payload: ReadyPayload): void {\n const { meshes, model } = payload;\n\n this.meshes = meshes;\n this.model = model;\n this.meshByName.clear();\n this.morphCache.clear();\n\n // Build mesh lookup\n model.traverse((obj: any) => {\n if (obj.isMesh && obj.name) {\n const infl = obj.morphTargetInfluences;\n if (Array.isArray(infl) && infl.length > 0) {\n this.meshByName.set(obj.name, obj);\n }\n }\n });\n\n // Find primary face mesh\n const faceMeshNames = this.config.morphToMesh?.face || [];\n const defaultFace = meshes.find((m) => faceMeshNames.includes(m.name));\n if (defaultFace) {\n this.faceMesh = defaultFace;\n } else {\n const candidate = meshes.find((m) => {\n const dict = m.morphTargetDictionary;\n return dict && typeof dict === 'object' && 'Brow_Drop_L' in dict;\n });\n this.faceMesh = candidate || null;\n }\n\n // Resolve bones\n this.bones = this.resolveBones(model);\n this.rigReady = true;\n this.missingBoneWarnings.clear();\n this.initBoneRotations();\n }\n\n update(deltaSeconds: number): void {\n const dtSeconds = Math.max(0, deltaSeconds || 0);\n if (dtSeconds <= 0 || this.isPaused) return;\n\n this.animation.tick(dtSeconds);\n this.flushPendingComposites();\n }\n\n /** Start the internal RAF loop */\n start(): void {\n if (this.running) return;\n this.running = true;\n this.clock.start();\n\n const tick = () => {\n if (!this.running) return;\n const dt = this.clock.getDelta();\n this.update(dt);\n this.rafId = requestAnimationFrame(tick);\n };\n\n this.rafId = requestAnimationFrame(tick);\n }\n\n /** Stop the internal RAF loop */\n stop(): void {\n this.running = false;\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n this.clock.stop();\n }\n\n dispose(): void {\n this.stop();\n this.clearTransitions();\n this.meshes = [];\n this.model = null;\n this.bones = {};\n }\n\n // ============================================================================\n // AU CONTROL\n // ============================================================================\n\n setAU(id: number | string, v: number, balance?: number): void {\n if (typeof id === 'string') {\n const match = id.match(/^(\\d+)([LR])$/i);\n if (match) {\n const au = Number(match[1]);\n const side = match[2].toUpperCase() as 'L' | 'R';\n const sideBalance = side === 'L' ? -1 : 1;\n this.setAU(au, v, sideBalance);\n return;\n }\n const n = Number(id);\n if (!Number.isNaN(n)) {\n this.setAU(n, v, balance);\n }\n return;\n }\n\n this.auValues[id] = v;\n\n const keys = this.config.auToMorphs[id] || [];\n if (keys.length) {\n const mixWeight = this.isMixedAU(id) ? this.getAUMixWeight(id) : 1.0;\n const base = clamp01(v) * mixWeight;\n const meshNames = this.getMeshNamesForAU(id);\n\n const leftKeys = keys.filter((k) => /(_L$| L$|Left$)/i.test(k));\n const rightKeys = keys.filter((k) => /(_R$| R$|Right$)/i.test(k));\n const centerKeys = keys.filter((k) => !/(_L$| L$|Left$|_R$| R$|Right$)/i.test(k));\n\n const { left: leftVal, right: rightVal } = this.computeSideValues(base, balance);\n\n if (leftKeys.length || rightKeys.length) {\n for (const k of leftKeys) this.setMorph(k, leftVal, meshNames);\n for (const k of rightKeys) this.setMorph(k, rightVal, meshNames);\n } else {\n centerKeys.push(...keys);\n }\n\n for (const k of centerKeys) {\n this.setMorph(k, base, meshNames);\n }\n }\n\n const bindings = this.config.auToBones[id];\n if (bindings) {\n for (const binding of bindings) {\n if (binding.channel === 'rx' || binding.channel === 'ry' || binding.channel === 'rz') {\n const axis = binding.channel === 'rx' ? 'pitch' : binding.channel === 'ry' ? 'yaw' : 'roll';\n this.updateBoneRotation(binding.node, axis, v * binding.scale, binding.maxDegrees ?? 0);\n } else if (binding.channel === 'tx' || binding.channel === 'ty' || binding.channel === 'tz') {\n if (binding.maxUnits !== undefined) {\n this.updateBoneTranslation(binding.node, binding.channel, v * binding.scale, binding.maxUnits);\n }\n }\n }\n }\n }\n\n transitionAU(id: number | string, to: number, durationMs = 200, balance?: number): TransitionHandle {\n const numId = typeof id === 'string' ? Number(id.replace(/[^\\d]/g, '')) : id;\n const target = clamp01(to);\n\n const morphKeys = this.config.auToMorphs[numId] || [];\n const bindings = this.config.auToBones[numId] || [];\n\n const mixWeight = this.isMixedAU(numId) ? this.getAUMixWeight(numId) : 1.0;\n const base = target * mixWeight;\n\n const { left: leftVal, right: rightVal } = this.computeSideValues(base, balance);\n\n this.auValues[numId] = target;\n\n const handles: TransitionHandle[] = [];\n const meshNames = this.getMeshNamesForAU(numId);\n\n const leftKeys = morphKeys.filter((k) => /(_L$|Left$)/.test(k));\n const rightKeys = morphKeys.filter((k) => /(_R$|Right$)/.test(k));\n const centerKeys = morphKeys.filter((k) => !/(_L$|Left$|_R$|Right$)/.test(k));\n\n if (leftKeys.length || rightKeys.length) {\n for (const k of leftKeys) {\n handles.push(this.transitionMorph(k, leftVal, durationMs, meshNames));\n }\n for (const k of rightKeys) {\n handles.push(this.transitionMorph(k, rightVal, durationMs, meshNames));\n }\n } else {\n centerKeys.push(...morphKeys);\n }\n\n for (const k of centerKeys) {\n handles.push(this.transitionMorph(k, base, durationMs, meshNames));\n }\n\n for (const binding of bindings) {\n if (binding.channel === 'rx' || binding.channel === 'ry' || binding.channel === 'rz') {\n const axis = binding.channel === 'rx' ? 'pitch' : binding.channel === 'ry' ? 'yaw' : 'roll';\n handles.push(this.transitionBoneRotation(binding.node, axis, target * binding.scale, binding.maxDegrees ?? 0, durationMs));\n } else if (binding.channel === 'tx' || binding.channel === 'ty' || binding.channel === 'tz') {\n if (binding.maxUnits !== undefined) {\n handles.push(this.transitionBoneTranslation(binding.node, binding.channel, target * binding.scale, binding.maxUnits, durationMs));\n }\n }\n }\n\n return this.combineHandles(handles);\n }\n\n getAU(id: number): number {\n return this.auValues[id] ?? 0;\n }\n\n // ============================================================================\n // MORPH CONTROL\n // ============================================================================\n\n setMorph(key: string, v: number, meshNames?: string[]): void {\n const val = clamp01(v);\n const targetMeshes = meshNames || this.config.morphToMesh?.face || [];\n\n const cached = this.morphCache.get(key);\n if (cached) {\n for (const target of cached) {\n target.infl[target.idx] = val;\n }\n return;\n }\n\n const targets: { infl: number[]; idx: number }[] = [];\n\n if (targetMeshes.length) {\n for (const name of targetMeshes) {\n const mesh = this.meshByName.get(name);\n if (!mesh) continue;\n const dict = mesh.morphTargetDictionary;\n const infl = mesh.morphTargetInfluences;\n if (!dict || !infl) continue;\n const idx = dict[key];\n if (idx !== undefined) {\n targets.push({ infl, idx });\n infl[idx] = val;\n }\n }\n } else {\n for (const mesh of this.meshes) {\n const dict = mesh.morphTargetDictionary;\n const infl = mesh.morphTargetInfluences;\n if (!dict || !infl) continue;\n const idx = dict[key];\n if (idx !== undefined) {\n targets.push({ infl, idx });\n infl[idx] = val;\n }\n }\n }\n\n if (targets.length > 0) {\n this.morphCache.set(key, targets);\n }\n }\n\n transitionMorph(key: string, to: number, durationMs = 120, meshNames?: string[]): TransitionHandle {\n const transitionKey = `morph_${key}`;\n const from = this.getMorphValue(key);\n const target = clamp01(to);\n return this.animation.addTransition(transitionKey, from, target, durationMs, (value) => this.setMorph(key, value, meshNames));\n }\n\n // ============================================================================\n // VISEME CONTROL\n // ============================================================================\n\n setViseme(visemeIndex: number, value: number, jawScale = 1.0): void {\n if (visemeIndex < 0 || visemeIndex >= this.config.visemeKeys.length) return;\n\n const val = clamp01(value);\n this.visemeValues[visemeIndex] = val;\n\n const morphKey = this.config.visemeKeys[visemeIndex];\n this.setMorph(morphKey, val);\n\n const jawAmount = LoomLargeThree.VISEME_JAW_AMOUNTS[visemeIndex] * val * jawScale;\n if (Math.abs(jawScale) > 1e-6 && Math.abs(jawAmount) > 1e-6) {\n this.updateBoneRotation('JAW', 'roll', jawAmount, LoomLargeThree.JAW_MAX_DEGREES);\n }\n }\n\n transitionViseme(visemeIndex: number, to: number, durationMs = 80, jawScale = 1.0): TransitionHandle {\n if (visemeIndex < 0 || visemeIndex >= this.config.visemeKeys.length) {\n return { promise: Promise.resolve(), pause: () => {}, resume: () => {}, cancel: () => {} };\n }\n\n const morphKey = this.config.visemeKeys[visemeIndex];\n const target = clamp01(to);\n this.visemeValues[visemeIndex] = target;\n\n const morphHandle = this.transitionMorph(morphKey, target, durationMs);\n\n const jawAmount = LoomLargeThree.VISEME_JAW_AMOUNTS[visemeIndex] * target * jawScale;\n if (Math.abs(jawScale) <= 1e-6 || Math.abs(jawAmount) <= 1e-6) {\n return morphHandle;\n }\n\n const jawHandle = this.transitionBoneRotation('JAW', 'roll', jawAmount, LoomLargeThree.JAW_MAX_DEGREES, durationMs);\n return this.combineHandles([morphHandle, jawHandle]);\n }\n\n // ============================================================================\n // MIX WEIGHT CONTROL\n // ============================================================================\n\n setAUMixWeight(id: number, weight: number): void {\n this.mixWeights[id] = clamp01(weight);\n const v = this.auValues[id] ?? 0;\n if (v > 0) this.setAU(id, v);\n\n const boneBindings = this.config.auToBones[id];\n if (boneBindings) {\n for (const binding of boneBindings) {\n this.pendingCompositeNodes.add(binding.node);\n }\n }\n }\n\n getAUMixWeight(id: number): number {\n return this.mixWeights[id] ?? this.config.auMixDefaults?.[id] ?? 1.0;\n }\n\n // ============================================================================\n // PLAYBACK CONTROL\n // ============================================================================\n\n pause(): void { this.isPaused = true; }\n resume(): void { this.isPaused = false; }\n getPaused(): boolean { return this.isPaused; }\n clearTransitions(): void { this.animation.clearTransitions(); }\n getActiveTransitionCount(): number { return this.animation.getActiveTransitionCount(); }\n\n resetToNeutral(): void {\n this.auValues = {};\n this.initBoneRotations();\n this.clearTransitions();\n\n for (const m of this.meshes) {\n const infl = m.morphTargetInfluences;\n if (!infl) continue;\n for (let i = 0; i < infl.length; i++) {\n infl[i] = 0;\n }\n }\n\n Object.values(this.bones).forEach((entry) => {\n if (!entry) return;\n entry.obj.position.copy(entry.basePos as any);\n entry.obj.quaternion.copy(entry.baseQuat);\n });\n }\n\n // ============================================================================\n // MESH CONTROL\n // ============================================================================\n\n getMeshList(): MeshInfo[] {\n if (!this.model) return [];\n const result: MeshInfo[] = [];\n this.model.traverse((obj: any) => {\n if (obj.isMesh) {\n result.push({\n name: obj.name,\n visible: obj.visible,\n morphCount: obj.morphTargetInfluences?.length || 0,\n });\n }\n });\n return result;\n }\n\n setMeshVisible(meshName: string, visible: boolean): void {\n if (!this.model) return;\n this.model.traverse((obj: any) => {\n if (obj.isMesh && obj.name === meshName) {\n obj.visible = visible;\n }\n });\n }\n\n // ============================================================================\n // CONFIGURATION\n // ============================================================================\n\n setAUMappings(mappings: AUMappingConfig): void {\n this.config = mappings;\n this.mixWeights = { ...mappings.auMixDefaults };\n }\n\n getAUMappings(): AUMappingConfig { return this.config; }\n\n // ============================================================================\n // PRIVATE METHODS\n // ============================================================================\n\n private computeSideValues(base: number, balance?: number): { left: number; right: number } {\n const b = Math.max(-1, Math.min(1, balance ?? 0));\n if (b === 0) return { left: base, right: base };\n if (b < 0) return { left: base, right: base * (1 + b) };\n return { left: base * (1 - b), right: base };\n }\n\n private getMeshNamesForAU(auId: number): string[] {\n const info = this.config.auInfo?.[String(auId)];\n if (!info?.facePart) return this.config.morphToMesh?.face || [];\n switch (info.facePart) {\n case 'Tongue': return this.config.morphToMesh?.tongue || [];\n case 'Eye': return this.config.morphToMesh?.eye || [];\n default: return this.config.morphToMesh?.face || [];\n }\n }\n\n private getMorphValue(key: string): number {\n if (this.faceMesh) {\n const dict = this.faceMesh.morphTargetDictionary;\n const infl = this.faceMesh.morphTargetInfluences;\n if (dict && infl) {\n const idx = dict[key];\n if (idx !== undefined) return infl[idx] ?? 0;\n }\n return 0;\n }\n for (const mesh of this.meshes) {\n const dict = mesh.morphTargetDictionary;\n const infl = mesh.morphTargetInfluences;\n if (!dict || !infl) continue;\n const idx = dict[key];\n if (idx !== undefined) return infl[idx] ?? 0;\n }\n return 0;\n }\n\n private isMixedAU(id: number): boolean {\n return !!(this.config.auToMorphs[id]?.length && this.config.auToBones[id]?.length);\n }\n\n private initBoneRotations(): void {\n const zeroAxis = { value: 0, maxRadians: 0 };\n this.rotations = {};\n this.pendingCompositeNodes.clear();\n\n const allBoneKeys = Array.from(\n new Set(Object.values(this.config.auToBones).flat().map((binding) => binding.node))\n );\n\n for (const node of allBoneKeys) {\n this.rotations[node] = { pitch: { ...zeroAxis }, yaw: { ...zeroAxis }, roll: { ...zeroAxis } };\n this.pendingCompositeNodes.add(node);\n }\n }\n\n private updateBoneRotation(nodeKey: string, axis: 'pitch' | 'yaw' | 'roll', value: number, maxDegrees: number): void {\n if (!this.rotations[nodeKey]) return;\n this.rotations[nodeKey][axis] = { value: Math.max(-1, Math.min(1, value)), maxRadians: deg2rad(maxDegrees) };\n this.pendingCompositeNodes.add(nodeKey);\n }\n\n private updateBoneTranslation(nodeKey: string, channel: 'tx' | 'ty' | 'tz', value: number, maxUnits: number): void {\n if (!this.translations[nodeKey]) this.translations[nodeKey] = { x: 0, y: 0, z: 0 };\n const clamped = Math.max(-1, Math.min(1, value));\n const offset = clamped * maxUnits;\n if (channel === 'tx') this.translations[nodeKey].x = offset;\n else if (channel === 'ty') this.translations[nodeKey].y = offset;\n else this.translations[nodeKey].z = offset;\n this.pendingCompositeNodes.add(nodeKey);\n }\n\n private transitionBoneRotation(nodeKey: string, axis: 'pitch' | 'yaw' | 'roll', to: number, maxDegrees: number, durationMs = 200): TransitionHandle {\n const transitionKey = `bone_${nodeKey}_${axis}`;\n const from = this.rotations[nodeKey]?.[axis]?.value ?? 0;\n const target = Math.max(-1, Math.min(1, to));\n return this.animation.addTransition(transitionKey, from, target, durationMs, (value) => this.updateBoneRotation(nodeKey, axis, value, maxDegrees));\n }\n\n private transitionBoneTranslation(nodeKey: string, channel: 'tx' | 'ty' | 'tz', to: number, maxUnits: number, durationMs = 200): TransitionHandle {\n const transitionKey = `boneT_${nodeKey}_${channel}`;\n const current = this.translations[nodeKey] || { x: 0, y: 0, z: 0 };\n const currentOffset = channel === 'tx' ? current.x : channel === 'ty' ? current.y : current.z;\n const from = maxUnits !== 0 ? Math.max(-1, Math.min(1, currentOffset / maxUnits)) : 0;\n const target = Math.max(-1, Math.min(1, to));\n return this.animation.addTransition(transitionKey, from, target, durationMs, (value) => this.updateBoneTranslation(nodeKey, channel, value, maxUnits));\n }\n\n private flushPendingComposites(): void {\n if (this.pendingCompositeNodes.size === 0) return;\n for (const nodeKey of this.pendingCompositeNodes) {\n this.applyCompositeRotation(nodeKey as BoneKey);\n }\n this.pendingCompositeNodes.clear();\n }\n\n private applyCompositeRotation(nodeKey: BoneKey): void {\n const entry = this.bones[nodeKey];\n if (!entry || !this.model) {\n if (!entry && this.rigReady && !this.missingBoneWarnings.has(nodeKey)) {\n this.missingBoneWarnings.add(nodeKey);\n }\n return;\n }\n\n const { obj, basePos, baseEuler } = entry;\n const rotState = this.rotations[nodeKey];\n if (!rotState) return;\n\n const yawRad = rotState.yaw.maxRadians * rotState.yaw.value;\n const pitchRad = rotState.pitch.maxRadians * rotState.pitch.value;\n const rollRad = rotState.roll.maxRadians * rotState.roll.value;\n\n obj.position.copy(basePos as any);\n const t = this.translations[nodeKey];\n if (t) {\n obj.position.x += t.x;\n obj.position.y += t.y;\n obj.position.z += t.z;\n }\n\n obj.rotation.set(baseEuler.x + pitchRad, baseEuler.y + yawRad, baseEuler.z + rollRad, baseEuler.order);\n obj.updateMatrixWorld(false);\n this.model.updateMatrixWorld(true);\n }\n\n private resolveBones(root: LoomObject3D): ResolvedBones {\n const resolved: ResolvedBones = {};\n\n const snapshot = (obj: any): NodeBase => ({\n obj,\n basePos: { x: obj.position.x, y: obj.position.y, z: obj.position.z },\n baseQuat: obj.quaternion.clone(),\n baseEuler: { x: obj.rotation.x, y: obj.rotation.y, z: obj.rotation.z, order: obj.rotation.order },\n });\n\n const findNode = (name?: string | null): LoomObject3D | undefined => {\n if (!name) return undefined;\n return root.getObjectByName(name);\n };\n\n for (const [key, nodeName] of Object.entries(this.config.boneNodes)) {\n const node = findNode(nodeName);\n if (node) resolved[key] = snapshot(node);\n }\n\n if (!resolved.EYE_L && this.config.eyeMeshNodes) {\n const node = findNode(this.config.eyeMeshNodes.LEFT);\n if (node) resolved.EYE_L = snapshot(node);\n }\n if (!resolved.EYE_R && this.config.eyeMeshNodes) {\n const node = findNode(this.config.eyeMeshNodes.RIGHT);\n if (node) resolved.EYE_R = snapshot(node);\n }\n\n return resolved;\n }\n\n private combineHandles(handles: TransitionHandle[]): TransitionHandle {\n if (handles.length === 0) return { promise: Promise.resolve(), pause: () => {}, resume: () => {}, cancel: () => {} };\n if (handles.length === 1) return handles[0];\n return {\n promise: Promise.all(handles.map((h) => h.promise)).then(() => {}),\n pause: () => handles.forEach((h) => h.pause()),\n resume: () => handles.forEach((h) => h.resume()),\n cancel: () => handles.forEach((h) => h.cancel()),\n };\n }\n}\n\n/**\n * Helper function to collect meshes with morph targets from a scene.\n */\nexport function collectMorphMeshes(root: LoomObject3D): LoomMesh[] {\n const meshes: LoomMesh[] = [];\n root.traverse((obj: any) => {\n if (obj.isMesh) {\n if (Array.isArray(obj.morphTargetInfluences) && obj.morphTargetInfluences.length > 0) {\n meshes.push(obj);\n }\n }\n });\n return meshes;\n}\n","/**\n * HairPhysics - Spring-damper pendulum simulation for hair movement\n *\n * This is a pure physics simulation class with no Three.js dependencies.\n * It outputs normalized morph values (0-1) that can be applied to hair meshes\n * via EngineThree.setMorph() or transitionMorph().\n *\n * Physics model:\n * - Hair is modeled as a damped pendulum affected by:\n * - Gravity (constant downward force based on head orientation)\n * - Head velocity (inertia causes hair to lag behind head movement)\n * - Wind (oscillating force with turbulence)\n * - Spring restoration (hair returns to rest position)\n * - Damping (air resistance)\n */\n\nexport interface HairPhysicsConfig {\n // Spring-damper parameters\n mass: number; // Hair mass (affects inertia), default 1.0\n stiffness: number; // Spring stiffness (restoration force), default 15\n damping: number; // Damping coefficient (air resistance), default 0.8\n\n // Gravity\n gravity: number; // Gravity strength, default 9.8\n\n // Head influence\n headInfluence: number; // How much head movement affects hair (0-1), default 0.5\n\n // Wind simulation\n windEnabled: boolean;\n windStrength: number; // Wind force magnitude, default 0\n windDirectionX: number; // Wind direction X component (-1 to 1), default 1\n windDirectionZ: number; // Wind direction Z component (-1 to 1), default 0\n windTurbulence: number; // Random variation in wind, default 0.2\n windFrequency: number; // Oscillation frequency in Hz, default 0.5\n}\n\nexport interface HairPhysicsState {\n // Current pendulum position (normalized -1 to 1)\n x: number; // Left/right swing\n z: number; // Front/back swing\n\n // Current velocity\n vx: number;\n vz: number;\n}\n\nexport interface HairMorphOutput {\n // Left side morphs (0-1)\n L_Hair_Left: number;\n L_Hair_Right: number;\n L_Hair_Front: number;\n\n // Right side morphs (0-1)\n R_Hair_Left: number;\n R_Hair_Right: number;\n R_Hair_Front: number;\n}\n\nexport interface HeadState {\n // Head rotation in radians\n yaw: number; // Left/right rotation\n pitch: number; // Up/down rotation\n roll: number; // Tilt\n\n // Head angular velocity (radians/sec) - for inertia\n yawVelocity: number;\n pitchVelocity: number;\n}\n\nexport const DEFAULT_HAIR_PHYSICS_CONFIG: HairPhysicsConfig = {\n mass: 1.0,\n stiffness: 15,\n damping: 0.8,\n gravity: 9.8,\n headInfluence: 0.5,\n windEnabled: false,\n windStrength: 0,\n windDirectionX: 1,\n windDirectionZ: 0,\n windTurbulence: 0.2,\n windFrequency: 0.5,\n};\n\nexport class HairPhysics {\n private config: HairPhysicsConfig;\n private state: HairPhysicsState;\n private time: number = 0;\n\n // Previous head state for velocity calculation\n private prevHeadYaw: number = 0;\n private prevHeadPitch: number = 0;\n\n constructor(config: Partial<HairPhysicsConfig> = {}) {\n this.config = { ...DEFAULT_HAIR_PHYSICS_CONFIG, ...config };\n this.state = { x: 0, z: 0, vx: 0, vz: 0 };\n }\n\n /**\n * Update physics simulation\n * @param dt Delta time in seconds\n * @param headState Current head orientation and velocity\n * @returns Morph values to apply to hair meshes\n */\n update(dt: number, headState: HeadState): HairMorphOutput {\n if (dt <= 0 || dt > 0.1) {\n // Skip bad delta times (prevent explosion on tab switch)\n return this.computeMorphOutput();\n }\n\n this.time += dt;\n\n const { mass, stiffness, damping, gravity, headInfluence, windEnabled } = this.config;\n\n // Calculate head angular velocity if not provided\n const headYawVel = headState.yawVelocity !== 0\n ? headState.yawVelocity\n : (headState.yaw - this.prevHeadYaw) / dt;\n const headPitchVel = headState.pitchVelocity !== 0\n ? headState.pitchVelocity\n : (headState.pitch - this.prevHeadPitch) / dt;\n\n this.prevHeadYaw = headState.yaw;\n this.prevHeadPitch = headState.pitch;\n\n // === Forces ===\n\n // 1. Spring restoration force (pulls hair back to center)\n const springFx = -stiffness * this.state.x;\n const springFz = -stiffness * this.state.z;\n\n // 2. Damping force (air resistance)\n const dampFx = -damping * this.state.vx;\n const dampFz = -damping * this.state.vz;\n\n // 3. Gravity effect based on head pitch\n // When head tilts forward (positive pitch), hair swings forward\n // When head tilts back, hair swings back\n const gravityFz = gravity * Math.sin(headState.pitch) * 0.1;\n\n // 4. Head rotation inertia (hair lags behind head movement)\n // When head turns right (positive yaw velocity), hair swings left relative to head\n const inertiaFx = -headYawVel * headInfluence * mass * 2;\n const inertiaFz = -headPitchVel * headInfluence * mass * 2;\n\n // 5. Wind force\n let windFx = 0;\n let windFz = 0;\n if (windEnabled && this.config.windStrength > 0) {\n const { windStrength, windDirectionX, windDirectionZ, windTurbulence, windFrequency } = this.config;\n\n // Base oscillating wind\n const windPhase = this.time * windFrequency * Math.PI * 2;\n const windOscillation = Math.sin(windPhase);\n\n // Add turbulence (perpendicular to wind direction)\n const turbulencePhase = this.time * windFrequency * 3.7; // Different frequency for variation\n const turbulence = Math.sin(turbulencePhase) * windTurbulence;\n\n windFx = windStrength * windDirectionX * (0.5 + 0.5 * windOscillation) + turbulence * (-windDirectionZ);\n windFz = windStrength * windDirectionZ * (0.5 + 0.5 * windOscillation) + turbulence * windDirectionX;\n }\n\n // === Integration (Semi-implicit Euler) ===\n\n const totalFx = springFx + dampFx + inertiaFx + windFx;\n const totalFz = springFz + dampFz + gravityFz + inertiaFz + windFz;\n\n // Acceleration = Force / Mass\n const ax = totalFx / mass;\n const az = totalFz / mass;\n\n // Update velocity\n this.state.vx += ax * dt;\n this.state.vz += az * dt;\n\n // Clamp velocity to prevent instability\n const maxVel = 10;\n this.state.vx = Math.max(-maxVel, Math.min(maxVel, this.state.vx));\n this.state.vz = Math.max(-maxVel, Math.min(maxVel, this.state.vz));\n\n // Update position\n this.state.x += this.state.vx * dt;\n this.state.z += this.state.vz * dt;\n\n // Clamp position to valid range\n this.state.x = Math.max(-1, Math.min(1, this.state.x));\n this.state.z = Math.max(-1, Math.min(1, this.state.z));\n\n return this.computeMorphOutput();\n }\n\n /**\n * Convert physics state to morph target values\n * Maps pendulum position to left/right/front morphs for both sides\n */\n private computeMorphOutput(): HairMorphOutput {\n const { x, z } = this.state;\n\n // X axis: negative = swing left, positive = swing right\n // Z axis: negative = swing back, positive = swing forward\n\n // Left side of hair\n // When hair swings left (x < 0), L_Hair_Left increases\n // When hair swings right (x > 0), L_Hair_Right increases\n const L_Hair_Left = Math.max(0, -x);\n const L_Hair_Right = Math.max(0, x);\n const L_Hair_Front = Math.max(0, z);\n\n // Right side mirrors left side behavior\n // When hair swings left (x < 0), R_Hair_Left increases\n // When hair swings right (x > 0), R_Hair_Right increases\n const R_Hair_Left = Math.max(0, -x);\n const R_Hair_Right = Math.max(0, x);\n const R_Hair_Front = Math.max(0, z);\n\n return {\n L_Hair_Left,\n L_Hair_Right,\n L_Hair_Front,\n R_Hair_Left,\n R_Hair_Right,\n R_Hair_Front,\n };\n }\n\n /**\n * Get current physics state (for debugging/UI)\n */\n getState(): HairPhysicsState {\n return { ...this.state };\n }\n\n /**\n * Update configuration\n */\n setConfig(config: Partial<HairPhysicsConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Get current configuration\n */\n getConfig(): HairPhysicsConfig {\n return { ...this.config };\n }\n\n /**\n * Reset physics state to rest position\n */\n reset(): void {\n this.state = { x: 0, z: 0, vx: 0, vz: 0 };\n this.time = 0;\n this.prevHeadYaw = 0;\n this.prevHeadPitch = 0;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/engines/three/AnimationThree.ts","../src/presets/cc4.ts","../src/engines/three/LoomLargeThree.ts","../src/physics/HairPhysics.ts"],"names":["Clock"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * AnimationThree - Lerp-based animation system\n *\n * Default implementation of the Animation interface.\n * Uses simple lerp interpolation with easing functions.\n */\n\nimport type { TransitionHandle } from '../../core/types';\nimport type { Animation } from '../../interfaces/Animation';\n\ntype Transition = {\n key: string;\n from: number;\n to: number;\n duration: number; // seconds\n elapsed: number; // seconds\n apply: (value: number) => void;\n easing: (t: number) => number;\n resolve?: () => void; // Called when transition completes\n paused: boolean; // Individual pause state\n};\n\nconst easeInOutQuad = (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t);\n\nexport class AnimationThree implements Animation {\n private transitions = new Map<string, Transition>();\n\n /**\n * Tick all active transitions by dt seconds.\n * Applies eased interpolation and removes completed transitions.\n * Respects individual transition pause state.\n */\n tick(dtSeconds: number): void {\n if (dtSeconds <= 0) return;\n\n const completed: string[] = [];\n\n this.transitions.forEach((t, key) => {\n // Skip paused transitions\n if (t.paused) return;\n\n t.elapsed += dtSeconds;\n const progress = Math.min(t.elapsed / t.duration, 1.0);\n const easedProgress = t.easing(progress);\n\n // Interpolate and apply\n const value = t.from + (t.to - t.from) * easedProgress;\n t.apply(value);\n\n // Check completion\n if (progress >= 1.0) {\n completed.push(key);\n t.resolve?.();\n }\n });\n\n // Remove completed transitions\n completed.forEach(key => this.transitions.delete(key));\n }\n\n /**\n * Add or replace a transition for the given key.\n * If a transition with the same key exists, it is cancelled and replaced.\n * @returns TransitionHandle with { promise, pause, resume, cancel }\n */\n addTransition(\n key: string,\n from: number,\n to: number,\n durationMs: number,\n apply: (value: number) => void,\n easing: (t: number) => number = easeInOutQuad\n ): TransitionHandle {\n // Convert to seconds once here - all callers pass milliseconds\n const durationSec = durationMs / 1000;\n\n // Cancel existing transition for this key\n const existing = this.transitions.get(key);\n if (existing?.resolve) {\n existing.resolve(); // Resolve immediately (cancelled)\n }\n\n // Instant transition if duration is 0 or values are equal\n if (durationSec <= 0 || Math.abs(to - from) < 1e-6) {\n apply(to);\n return {\n promise: Promise.resolve(),\n pause: () => {},\n resume: () => {},\n cancel: () => {},\n };\n }\n\n const promise = new Promise<void>((resolve) => {\n const transitionObj: Transition = {\n key,\n from,\n to,\n duration: durationSec,\n elapsed: 0,\n apply,\n easing,\n resolve,\n paused: false,\n };\n this.transitions.set(key, transitionObj);\n });\n\n return {\n promise,\n pause: () => {\n const t = this.transitions.get(key);\n if (t) t.paused = true;\n },\n resume: () => {\n const t = this.transitions.get(key);\n if (t) t.paused = false;\n },\n cancel: () => {\n const t = this.transitions.get(key);\n if (t) {\n t.resolve?.();\n this.transitions.delete(key);\n }\n },\n };\n }\n\n /** Clear all running transitions. */\n clearTransitions(): void {\n this.transitions.forEach(t => t.resolve?.());\n this.transitions.clear();\n }\n\n /** Get count of active transitions. */\n getActiveTransitionCount(): number {\n return this.transitions.size;\n }\n}\n","/**\n * CC4 Preset - Character Creator 4 AU Mappings\n *\n * Complete FACS Action Unit to morph target and bone mappings for CC4 rigs.\n * This includes all the composite rotations, continuum pairs, mesh classifications,\n * and AU metadata that we painstakingly worked through.\n */\n\nimport type { AUMappingConfig } from '../mappings/types';\nimport type { BoneBinding, AUInfo, CompositeRotation } from '../core/types';\n\n// ============================================================================\n// AU TO MORPHS - Maps AU IDs to morph target names\n// ============================================================================\n\nexport const AU_TO_MORPHS: Record<number, string[]> = {\n // Brows / Forehead\n 1: ['Brow_Raise_Inner_L','Brow_Raise_Inner_R'],\n 2: ['Brow_Raise_Outer_L','Brow_Raise_Outer_R'],\n 4: ['Brow_Drop_L','Brow_Drop_R'],\n\n // Eyes / Lids\n 5: ['Eye_Wide_L','Eye_Wide_R'],\n 6: ['Cheek_Raise_L','Cheek_Raise_R'],\n 7: ['Eye_Squint_L','Eye_Squint_R'],\n 43: ['Eye_Blink_L','Eye_Blink_R'],\n 45: ['Eye_Blink_L','Eye_Blink_R'], // Blink alias\n\n // Nose / Midface\n 9: ['Nose_Sneer_L','Nose_Sneer_R'],\n 34: ['Cheek_Puff_L','Cheek_Puff_R'],\n\n // Mouth / Lips\n 8: ['Mouth_Press_L','Mouth_Press_R','Mouth_Close'],\n 10: ['Nose_Sneer_L','Nose_Sneer_R'], // Upper Lip Raiser (levator labii superioris) - raises upper lip in disgust/sneer\n 11: ['Mouth_Up_Upper_L','Mouth_Up_Upper_R'], // Nasolabial Deepener (zygomaticus minor) - no dedicated morph\n 12: ['Mouth_Smile_L','Mouth_Smile_R'],\n 13: ['Mouth_Dimple_L','Mouth_Dimple_R'], // Sharp Lip Puller (levator anguli oris) - pulls lip corners up\n 14: ['Mouth_Press_L','Mouth_Press_R'],\n 15: ['Mouth_Frown_L','Mouth_Frown_R'],\n 16: ['Mouth_Down_Lower_L','Mouth_Down_Lower_R'],\n 17: ['Mouth_Shrug_Lower'],\n 18: ['Mouth_Pucker'],\n 20: ['Mouth_Stretch_L','Mouth_Stretch_R'],\n 22: ['Mouth_Funnel'],\n 23: ['Mouth_Press_L','Mouth_Press_R'],\n 24: ['Mouth_Press_L','Mouth_Press_R'],\n 25: ['Jaw_Open'], // Lips Part - small jaw open with morph\n 26: ['Jaw_Open'], // Jaw Drop - mixed: bone rotation + Jaw_Open morph\n 27: ['Jaw_Open'], // Mouth Stretch - larger jaw open with morph\n 28: ['Mouth_Roll_In_Upper','Mouth_Roll_In_Lower'],\n 32: ['Mouth_Roll_In_Lower'], // Lip Bite - using roll in lower as approximation\n\n // Tongue\n 19: ['Tongue_Out'],\n 36: ['Tongue_Bulge_L','Tongue_Bulge_R'],\n 37: ['Tongue_Up'], // Tongue Up - morph + bone rotation\n 38: ['Tongue_Down'], // Tongue Down - morph + bone rotation\n 39: ['Tongue_L'], // Tongue Left - morph + bone rotation\n 40: ['Tongue_R'], // Tongue Right - morph + bone rotation\n 41: [], // Tongue Tilt Left - BONE ONLY\n 42: [], // Tongue Tilt Right - BONE ONLY\n // Extended tongue morphs (CC4-specific)\n 73: ['Tongue_Narrow'],\n 74: ['Tongue_Wide'],\n 75: ['Tongue_Roll'],\n 76: ['Tongue_Tip_Up'],\n 77: ['Tongue_Tip_Down'],\n\n // Jaw\n 29: ['Jaw_Forward'],\n 30: ['Jaw_L'], // Jaw Left - mixed: bone rotation + Jaw_L morph\n 31: [], // Jaw Clencher (masseter/temporalis) - no dedicated CC4 morph\n 35: ['Jaw_R'], // Jaw Right - mixed: bone rotation + Jaw_R morph\n\n // Head position (M51-M56 in FACS notation)\n 51: ['Head_Turn_L'], // Head turn left\n 52: ['Head_Turn_R'], // Head turn right\n 53: ['Head_Turn_Up'], // Head up\n 54: ['Head_Turn_Down'],\n 55: ['Head_Tilt_L'],\n 56: ['Head_Tilt_R'],\n\n // Eye Direction (convenience)\n 61: ['Eye_L_Look_L','Eye_R_Look_L'],\n 62: ['Eye_L_Look_R','Eye_R_Look_R'],\n 63: ['Eye_L_Look_Up','Eye_R_Look_Up'],\n 64: ['Eye_L_Look_Down','Eye_R_Look_Down'],\n // Single-eye controls (Left eye)\n 65: ['Eye_L_Look_L'],\n 66: ['Eye_L_Look_R'],\n 67: ['Eye_L_Look_Up'],\n 68: ['Eye_L_Look_Down'],\n // Single-eye controls (Right eye)\n 69: ['Eye_R_Look_L'],\n 70: ['Eye_R_Look_R'],\n 71: ['Eye_R_Look_Up'],\n 72: ['Eye_R_Look_Down'],\n\n // Eye morphs (CC_Base_Eye meshes)\n // EO morphs control the shadow/depth around the eyes\n 80: ['EO Bulge L', 'EO Bulge R'],\n 81: ['EO Depth L', 'EO Depth R'],\n 82: ['EO Inner Depth L', 'EO Inner Depth R'],\n 83: ['EO Inner Height L', 'EO Inner Height R'],\n 84: ['EO Inner Width L', 'EO Inner Width R'],\n 85: ['EO Outer Depth L', 'EO Outer Depth R'],\n 86: ['EO Outer Height L', 'EO Outer Height R'],\n 87: ['EO Outer Width L', 'EO Outer Width R'],\n 88: ['EO Upper Depth L', 'EO Upper Depth R'],\n 89: ['EO Lower Depth L', 'EO Lower Depth R'],\n 90: ['EO Center Upper Depth L', 'EO Center Upper Depth R'],\n 91: ['EO Center Upper Height L', 'EO Center Upper Height R'],\n 92: ['EO Center Lower Depth L', 'EO Center Lower Depth R'],\n 93: ['EO Center Lower Height L', 'EO Center Lower Height R'],\n 94: ['EO Inner Upper Depth L', 'EO Inner Upper Depth R'],\n 95: ['EO Inner Upper Height L', 'EO Inner Upper Height R'],\n 96: ['EO Inner Lower Depth L', 'EO Inner Lower Depth R'],\n 97: ['EO Inner Lower Height L', 'EO Inner Lower Height R'],\n 98: ['EO Outer Upper Depth L', 'EO Outer Upper Depth R'],\n 99: ['EO Outer Upper Height L', 'EO Outer Upper Height R'],\n 100: ['EO Outer Lower Depth L', 'EO Outer Lower Depth R'],\n 101: ['EO Outer Lower Height L', 'EO Outer Lower Height R'],\n 102: ['EO Duct Depth L', 'EO Duct Depth R'],\n};\n\n// ============================================================================\n// VISEME KEYS - Lip-sync phoneme targets\n// ============================================================================\n\nexport const VISEME_KEYS: string[] = [\n 'EE','Er','IH','Ah','Oh','W_OO','S_Z','Ch_J','F_V','TH','T_L_D_N','B_M_P','K_G_H_NG','AE','R'\n];\n\n// ============================================================================\n// BONE BINDINGS - AU to bone rotation/translation mappings\n// ============================================================================\n\nexport const BONE_AU_TO_BINDINGS: Record<number, BoneBinding[]> = {\n // Head turn and tilt (M51-M56) - use HEAD bone only (NECK should not rotate with head)\n // Three.js Y rotation: positive = counter-clockwise from above = head turns LEFT (character POV)\n 51: [\n { node: 'HEAD', channel: 'ry', scale: 1, maxDegrees: 30 }, // Head turn left\n ],\n 52: [\n { node: 'HEAD', channel: 'ry', scale: -1, maxDegrees: 30 }, // Head turn right\n ],\n 53: [\n { node: 'HEAD', channel: 'rx', scale: -1, maxDegrees: 20 }, // Head up\n ],\n 54: [\n { node: 'HEAD', channel: 'rx', scale: 1, maxDegrees: 20 }, // Head down\n ],\n 55: [\n { node: 'HEAD', channel: 'rz', scale: -1, maxDegrees: 15 }, // Head tilt left\n ],\n 56: [\n { node: 'HEAD', channel: 'rz', scale: 1, maxDegrees: 15 }, // Head tilt right\n ],\n // Eyes horizontal (yaw) - CC4 rigs use rz for horizontal eye rotation\n 61: [\n { node: 'EYE_L', channel: 'rz', scale: 1, maxDegrees: 32 }, // Eyes look left\n { node: 'EYE_R', channel: 'rz', scale: 1, maxDegrees: 32 },\n ],\n 62: [\n { node: 'EYE_L', channel: 'rz', scale: -1, maxDegrees: 32 }, // Eyes look right\n { node: 'EYE_R', channel: 'rz', scale: -1, maxDegrees: 32 },\n ],\n 63: [\n { node: 'EYE_L', channel: 'rx', scale: -1, maxDegrees: 32 },\n { node: 'EYE_R', channel: 'rx', scale: -1, maxDegrees: 32 },\n ],\n 64: [\n { node: 'EYE_L', channel: 'rx', scale: 1, maxDegrees: 32 },\n { node: 'EYE_R', channel: 'rx', scale: 1, maxDegrees: 32 },\n ],\n // Single-eye (Left) — horizontal (rz for CC4) and vertical (rx)\n 65: [ { node: 'EYE_L', channel: 'rz', scale: -1, maxDegrees: 15 } ],\n 66: [ { node: 'EYE_L', channel: 'rz', scale: 1, maxDegrees: 15 } ],\n 67: [ { node: 'EYE_L', channel: 'rx', scale: -1, maxDegrees: 12 } ],\n 68: [ { node: 'EYE_L', channel: 'rx', scale: 1, maxDegrees: 12 } ],\n // Single-eye (Right) — horizontal (rz for CC4) and vertical (rx)\n 69: [ { node: 'EYE_R', channel: 'rz', scale: -1, maxDegrees: 15 } ],\n 70: [ { node: 'EYE_R', channel: 'rz', scale: 1, maxDegrees: 15 } ],\n 71: [ { node: 'EYE_R', channel: 'rx', scale: -1, maxDegrees: 12 } ],\n 72: [ { node: 'EYE_R', channel: 'rx', scale: 1, maxDegrees: 12 } ],\n\n // Jaw / Mouth\n 8: [ // Lips Toward Each Other - slight jaw open helps sell the lip press\n { node: 'JAW', channel: 'rz', scale: 1, maxDegrees: 8 }, // Small downward rotation (jaw opening slightly)\n ],\n 25: [ // Lips Part — small jaw open\n { node: 'JAW', channel: 'rz', scale: 1, maxDegrees: 5.84 }, // 73% of 8\n ],\n 26: [\n { node: 'JAW', channel: 'rz', scale: 1, maxDegrees: 28 }, // 73% of 20\n ],\n 27: [ // Mouth Stretch — larger jaw open\n { node: 'JAW', channel: 'rz', scale: 1, maxDegrees: 32 }, // 73% of 25\n ],\n 29: [\n { node: 'JAW', channel: 'tz', scale: -1, maxUnits: 0.02 }, // Negative for forward thrust\n ],\n 30: [ // Jaw Left\n { node: 'JAW', channel: 'ry', scale: -1, maxDegrees: 5 },\n ],\n 35: [ // Jaw Right\n { node: 'JAW', channel: 'ry', scale: 1, maxDegrees: 5 },\n ],\n\n // Tongue\n 19: [\n { node: 'TONGUE', channel: 'tz', scale: -1, maxUnits: 0.008 },\n ],\n 37: [ // Tongue Up\n { node: 'TONGUE', channel: 'rz', scale: -1, maxDegrees: 45 },\n ],\n 38: [ // Tongue Down\n { node: 'TONGUE', channel: 'rz', scale: 1, maxDegrees: 45 },\n ],\n 39: [ // Tongue Left\n { node: 'TONGUE', channel: 'ry', scale: -1, maxDegrees: 10 },\n ],\n 40: [ // Tongue Right\n { node: 'TONGUE', channel: 'ry', scale: 1, maxDegrees: 10 },\n ],\n 41: [ // Tongue Tilt Left\n { node: 'TONGUE', channel: 'rx', scale: -1, maxDegrees: 20 },\n ],\n 42: [ // Tongue Tilt Right\n { node: 'TONGUE', channel: 'rx', scale: 1, maxDegrees: 20 },\n ],\n};\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/** Check if an AU has both morphs and bones (can blend between them) */\nexport const isMixedAU = (id: number): boolean =>\n !!(AU_TO_MORPHS[id]?.length && BONE_AU_TO_BINDINGS[id]?.length);\n\n/** Check if an AU has separate left/right morphs */\nexport const hasLeftRightMorphs = (auId: number): boolean => {\n const keys = AU_TO_MORPHS[auId] || [];\n // Match: _L, _R, Left, Right, or \" L\"/\" R\" (space+letter) at end of string\n return keys.some(k => /_L$|_R$| L$| R$|Left$|Right$/i.test(k));\n};\n\n// ============================================================================\n// COMPOSITE ROTATIONS - Unified rotation control for bones\n// ============================================================================\n\nexport const COMPOSITE_ROTATIONS: CompositeRotation[] = [\n {\n node: 'JAW',\n pitch: { aus: [25, 26, 27], axis: 'rz' }, // Jaw drop (opens mouth downward)\n yaw: { aus: [30, 35], axis: 'ry', negative: 30, positive: 35 }, // Jaw lateral (left/right)\n roll: null // Jaw doesn't have roll\n },\n {\n node: 'HEAD',\n pitch: { aus: [54, 53], axis: 'rx', negative: 54, positive: 53 }, // Head down/up\n yaw: { aus: [51, 52], axis: 'ry', negative: 51, positive: 52 }, // Head turn left/right\n roll: { aus: [55, 56], axis: 'rz', negative: 55, positive: 56 } // Head tilt left/right\n },\n {\n node: 'EYE_L',\n pitch: { aus: [64, 63], axis: 'rx', negative: 64, positive: 63 }, // Eyes down/up\n yaw: { aus: [61, 62], axis: 'rz', negative: 61, positive: 62 }, // Eyes left/right (rz for CC4)\n roll: null // Eyes don't have roll\n },\n {\n node: 'EYE_R',\n pitch: { aus: [64, 63], axis: 'rx', negative: 64, positive: 63 }, // Eyes down/up\n yaw: { aus: [61, 62], axis: 'rz', negative: 61, positive: 62 }, // Eyes left/right (rz for CC4)\n roll: null // Eyes don't have roll\n },\n {\n node: 'TONGUE',\n pitch: { aus: [38, 37], axis: 'rz', negative: 38, positive: 37 }, // Tongue down/up\n yaw: { aus: [39, 40], axis: 'ry', negative: 39, positive: 40 }, // Tongue left/right\n roll: { aus: [41, 42], axis: 'rx', negative: 41, positive: 42 } // Tongue tilt left/right\n }\n];\n\n// ============================================================================\n// CONTINUUM PAIRS - Bidirectional AU pair mappings\n// ============================================================================\n\n/**\n * Continuum pair mappings - precomputed from COMPOSITE_ROTATIONS\n * Maps AU ID to its continuum partner info for bidirectional axes\n * (e.g., AU 51 \"Head Left\" is paired with AU 52 \"Head Right\")\n */\nexport const CONTINUUM_PAIRS_MAP: Record<number, {\n pairId: number;\n isNegative: boolean;\n axis: 'pitch' | 'yaw' | 'roll';\n node: 'JAW' | 'HEAD' | 'EYE_L' | 'EYE_R' | 'TONGUE';\n}> = {\n // Eyes horizontal (yaw) - both eyes share same AUs\n 61: { pairId: 62, isNegative: true, axis: 'yaw', node: 'EYE_L' },\n 62: { pairId: 61, isNegative: false, axis: 'yaw', node: 'EYE_L' },\n // Eyes vertical (pitch)\n 64: { pairId: 63, isNegative: true, axis: 'pitch', node: 'EYE_L' },\n 63: { pairId: 64, isNegative: false, axis: 'pitch', node: 'EYE_L' },\n // Head yaw (turn left/right)\n 51: { pairId: 52, isNegative: true, axis: 'yaw', node: 'HEAD' },\n 52: { pairId: 51, isNegative: false, axis: 'yaw', node: 'HEAD' },\n // Head pitch (up/down)\n 54: { pairId: 53, isNegative: true, axis: 'pitch', node: 'HEAD' },\n 53: { pairId: 54, isNegative: false, axis: 'pitch', node: 'HEAD' },\n // Head roll (tilt left/right)\n 55: { pairId: 56, isNegative: true, axis: 'roll', node: 'HEAD' },\n 56: { pairId: 55, isNegative: false, axis: 'roll', node: 'HEAD' },\n // Jaw yaw (left/right)\n 30: { pairId: 35, isNegative: true, axis: 'yaw', node: 'JAW' },\n 35: { pairId: 30, isNegative: false, axis: 'yaw', node: 'JAW' },\n // Tongue yaw (left/right)\n 39: { pairId: 40, isNegative: true, axis: 'yaw', node: 'TONGUE' },\n 40: { pairId: 39, isNegative: false, axis: 'yaw', node: 'TONGUE' },\n // Tongue pitch (up/down)\n 38: { pairId: 37, isNegative: true, axis: 'pitch', node: 'TONGUE' },\n 37: { pairId: 38, isNegative: false, axis: 'pitch', node: 'TONGUE' },\n // Tongue roll (tilt left/right)\n 41: { pairId: 42, isNegative: true, axis: 'roll', node: 'TONGUE' },\n 42: { pairId: 41, isNegative: false, axis: 'roll', node: 'TONGUE' },\n // Extended tongue morphs (continuum pairs)\n 73: { pairId: 74, isNegative: true, axis: 'yaw', node: 'TONGUE' }, // Tongue Narrow/Wide\n 74: { pairId: 73, isNegative: false, axis: 'yaw', node: 'TONGUE' },\n 76: { pairId: 77, isNegative: false, axis: 'pitch', node: 'TONGUE' }, // Tongue Tip Up/Down\n 77: { pairId: 76, isNegative: true, axis: 'pitch', node: 'TONGUE' },\n};\n\n/**\n * Human-readable labels for continuum pairs\n * Key format: \"negativeAU-positiveAU\"\n * Used by UI components (ContinuumSlider, AUSection) to display friendly axis names\n */\nexport const CONTINUUM_LABELS: Record<string, string> = {\n '61-62': 'Eyes — Horizontal',\n '64-63': 'Eyes — Vertical',\n '51-52': 'Head — Horizontal',\n '54-53': 'Head — Vertical',\n '55-56': 'Head — Tilt',\n '30-35': 'Jaw — Horizontal',\n '38-37': 'Tongue — Vertical',\n '39-40': 'Tongue — Horizontal',\n '41-42': 'Tongue — Tilt',\n '73-74': 'Tongue — Width',\n '76-77': 'Tongue Tip — Vertical',\n};\n\n// ============================================================================\n// BONE NODE NAMES - CC4-specific skeleton hierarchy\n// ============================================================================\n\n// Canonical CC4 bone + mesh names. Since we only target CC4 rigs now, the mapping is explicit.\nexport const CC4_BONE_NODES = {\n EYE_L: 'CC_Base_L_Eye',\n EYE_R: 'CC_Base_R_Eye',\n HEAD: 'CC_Base_Head',\n NECK: 'CC_Base_NeckTwist01',\n NECK_TWIST: 'CC_Base_NeckTwist02',\n JAW: 'CC_Base_JawRoot',\n TONGUE: 'CC_Base_Tongue01'\n} as const;\n\nexport const CC4_EYE_MESH_NODES = {\n LEFT: 'CC_Base_Eye',\n RIGHT: 'CC_Base_Eye_1'\n} as const;\n\n// ============================================================================\n// AU INFO - Metadata for each Action Unit\n// ============================================================================\n\nexport const AU_INFO: Record<string, AUInfo> = {\n // Forehead / Brow (Upper)\n '1': { id:'1', name:'Inner Brow Raiser', muscularBasis:'frontalis (pars medialis)', links:['https://en.wikipedia.org/wiki/Frontalis_muscle'], faceArea:'Upper', facePart:'Forehead' },\n '2': { id:'2', name:'Outer Brow Raiser', muscularBasis:'frontalis (pars lateralis)', links:['https://en.wikipedia.org/wiki/Frontalis_muscle'], faceArea:'Upper', facePart:'Forehead' },\n '4': { id:'4', name:'Brow Lowerer', muscularBasis:'corrugator/depressor supercilii', links:['https://en.wikipedia.org/wiki/Corrugator_supercilii'], faceArea:'Upper', facePart:'Forehead' },\n\n // Eyelids / Eyes (Upper)\n '5': { id:'5', name:'Upper Lid Raiser', muscularBasis:'levator palpebrae superioris', links:['https://en.wikipedia.org/wiki/Levator_palpebrae_superioris'], faceArea:'Upper', facePart:'Eyelids' },\n '6': { id:'6', name:'Cheek Raiser', muscularBasis:'orbicularis oculi (pars orbitalis)', links:['https://en.wikipedia.org/wiki/Orbicularis_oculi'], faceArea:'Upper', facePart:'Cheeks' },\n '7': { id:'7', name:'Lid Tightener', muscularBasis:'orbicularis oculi (pars palpebralis)', links:['https://en.wikipedia.org/wiki/Orbicularis_oculi'], faceArea:'Upper', facePart:'Eyelids' },\n '43': { id:'43', name:'Eyes Closed', muscularBasis:'orbicularis oculi', links:['https://en.wikipedia.org/wiki/Orbicularis_oculi_muscle'], faceArea:'Upper', facePart:'Eyelids' },\n '45': { id:'45', name:'Blink', muscularBasis:'orbicularis oculi', links:['https://en.wikipedia.org/wiki/Orbicularis_oculi_muscle'], faceArea:'Upper', facePart:'Eyelids' },\n '61': { id:'61', name:'Eyes Turn Left', faceArea:'Upper', facePart:'Eyes' },\n '62': { id:'62', name:'Eyes Turn Right', faceArea:'Upper', facePart:'Eyes' },\n '63': { id:'63', name:'Eyes Up', faceArea:'Upper', facePart:'Eyes' },\n '64': { id:'64', name:'Eyes Down', faceArea:'Upper', facePart:'Eyes' },\n '65': { id:'65', name:'Left Eye Look Left', faceArea:'Upper', facePart:'Eyes' },\n '66': { id:'66', name:'Left Eye Look Right', faceArea:'Upper', facePart:'Eyes' },\n '67': { id:'67', name:'Left Eye Look Up', faceArea:'Upper', facePart:'Eyes' },\n '68': { id:'68', name:'Left Eye Look Down', faceArea:'Upper', facePart:'Eyes' },\n '69': { id:'69', name:'Right Eye Look Left', faceArea:'Upper', facePart:'Eyes' },\n '70': { id:'70', name:'Right Eye Look Right',faceArea:'Upper', facePart:'Eyes' },\n '71': { id:'71', name:'Right Eye Look Up', faceArea:'Upper', facePart:'Eyes' },\n '72': { id:'72', name:'Right Eye Look Down', faceArea:'Upper', facePart:'Eyes' },\n\n // Nose / Cheeks\n '9': { id:'9', name:'Nose Wrinkler', muscularBasis:'levator labii superioris alaeque nasi', links:['https://en.wikipedia.org/wiki/Levator_labii_superioris_alaeque_nasi'], faceArea:'Upper', facePart:'Nose' },\n '34': { id:'34', name:'Cheek Puff', faceArea:'Lower', facePart:'Cheeks' },\n\n // Mouth (Lower)\n '8': { id:'8', name:'Lips Toward Each Other', muscularBasis:'orbicularis oris', links:['https://en.wikipedia.org/wiki/Orbicularis_oris'], faceArea:'Lower', facePart:'Mouth' },\n '10': { id:'10', name:'Upper Lip Raiser', muscularBasis:'levator labii superioris', links:['https://en.wikipedia.org/wiki/Levator_labii_superioris'], faceArea:'Lower', facePart:'Mouth' },\n '11': { id:'11', name:'Nasolabial Deepener', muscularBasis:'zygomaticus minor', links:['https://en.wikipedia.org/wiki/Zygomaticus_minor'], faceArea:'Lower', facePart:'Cheeks' },\n '12': { id:'12', name:'Lip Corner Puller', muscularBasis:'zygomaticus major', links:['https://en.wikipedia.org/wiki/Zygomaticus_major'], faceArea:'Lower', facePart:'Mouth' },\n '13': { id:'13', name:'Sharp Lip Puller', muscularBasis:'levator anguli oris', links:['https://en.wikipedia.org/wiki/Levator_anguli_oris'], faceArea:'Lower', facePart:'Mouth' },\n '14': { id:'14', name:'Dimpler', muscularBasis:'buccinator', links:['https://en.wikipedia.org/wiki/Buccinator'], faceArea:'Lower', facePart:'Cheeks' },\n '15': { id:'15', name:'Lip Corner Depressor', muscularBasis:'depressor anguli oris', links:['https://en.wikipedia.org/wiki/Depressor_anguli_oris'], faceArea:'Lower', facePart:'Mouth' },\n '16': { id:'16', name:'Lower Lip Depressor', muscularBasis:'depressor labii inferioris', links:['https://en.wikipedia.org/wiki/Depressor_labii_inferioris'], faceArea:'Lower', facePart:'Mouth' },\n '17': { id:'17', name:'Chin Raiser', muscularBasis:'mentalis', links:['https://en.wikipedia.org/wiki/Mentalis'], faceArea:'Lower', facePart:'Chin' },\n '18': { id:'18', name:'Lip Pucker', faceArea:'Lower', facePart:'Mouth' },\n '20': { id:'20', name:'Lip Stretcher', muscularBasis:'risorius + platysma', links:['https://en.wikipedia.org/wiki/Risorius','https://en.wikipedia.org/wiki/Platysma'], faceArea:'Lower', facePart:'Mouth' },\n '22': { id:'22', name:'Lip Funneler', muscularBasis:'orbicularis oris', links:['https://en.wikipedia.org/wiki/Orbicularis_oris'], faceArea:'Lower', facePart:'Mouth' },\n '23': { id:'23', name:'Lip Tightener', muscularBasis:'orbicularis oris', faceArea:'Lower', facePart:'Mouth' },\n '24': { id:'24', name:'Lip Presser', muscularBasis:'orbicularis oris', faceArea:'Lower', facePart:'Mouth' },\n '25': { id:'25', name:'Lips Part', faceArea:'Lower', facePart:'Mouth' },\n '27': { id:'27', name:'Mouth Stretch', muscularBasis:'pterygoids + digastric', links:['https://en.wikipedia.org/wiki/Pterygoid_bone','https://en.wikipedia.org/wiki/Digastric_muscle'], faceArea:'Lower', facePart:'Mouth' },\n '28': { id:'28', name:'Lip Suck', muscularBasis:'orbicularis oris', faceArea:'Lower', facePart:'Mouth' },\n\n // Tongue (Lower)\n '19': { id:'19', name:'Tongue Show', faceArea:'Lower', facePart:'Tongue' },\n '36': { id:'36', name:'Tongue Bulge', faceArea:'Lower', facePart:'Tongue' },\n '37': { id:'37', name:'Tongue Up', faceArea:'Lower', facePart:'Tongue' },\n '38': { id:'38', name:'Tongue Down', faceArea:'Lower', facePart:'Tongue' },\n '39': { id:'39', name:'Tongue Left', faceArea:'Lower', facePart:'Tongue' },\n '40': { id:'40', name:'Tongue Right', faceArea:'Lower', facePart:'Tongue' },\n '41': { id:'41', name:'Tongue Tilt Left', faceArea:'Lower', facePart:'Tongue' },\n '42': { id:'42', name:'Tongue Tilt Right', faceArea:'Lower', facePart:'Tongue' },\n // Extended tongue controls (CC4-specific morphs)\n '73': { id:'73', name:'Tongue Narrow', faceArea:'Lower', facePart:'Tongue' },\n '74': { id:'74', name:'Tongue Wide', faceArea:'Lower', facePart:'Tongue' },\n '75': { id:'75', name:'Tongue Roll', faceArea:'Lower', facePart:'Tongue' },\n '76': { id:'76', name:'Tongue Tip Up', faceArea:'Lower', facePart:'Tongue' },\n '77': { id:'77', name:'Tongue Tip Down', faceArea:'Lower', facePart:'Tongue' },\n\n // Jaw (Lower)\n '26': { id:'26', name:'Jaw Drop', muscularBasis:'masseter (relax temporalis)', links:['https://en.wikipedia.org/wiki/Masseter_muscle'], faceArea:'Lower', facePart:'Jaw' },\n '29': { id:'29', name:'Jaw Thrust', faceArea:'Lower', facePart:'Jaw' },\n '30': { id:'30', name:'Jaw Left', faceArea:'Lower', facePart:'Jaw' },\n '31': { id:'31', name:'Jaw Clencher', muscularBasis:'masseter + temporalis', faceArea:'Lower', facePart:'Jaw' },\n '32': { id:'32', name:'Lip Bite', muscularBasis:'orbicularis oris', faceArea:'Lower', facePart:'Mouth' },\n '35': { id:'35', name:'Jaw Right', faceArea:'Lower', facePart:'Jaw' },\n\n // Head position (M51-M56 in FACS notation)\n '51': { id:'51', name:'Head Turn Left', faceArea:'Upper', facePart:'Head' },\n '52': { id:'52', name:'Head Turn Right', faceArea:'Upper', facePart:'Head' },\n '53': { id:'53', name:'Head Up', faceArea:'Upper', facePart:'Head' },\n '54': { id:'54', name:'Head Down', faceArea:'Upper', facePart:'Head' },\n '55': { id:'55', name:'Head Tilt Left', faceArea:'Upper', facePart:'Head' },\n '56': { id:'56', name:'Head Tilt Right', faceArea:'Upper', facePart:'Head' },\n\n // Eye (Upper) - EO morphs applied to CC_Base_Eye meshes\n '80': { id:'80', name:'Eye Bulge', faceArea:'Upper', facePart:'Eye' },\n '81': { id:'81', name:'Eye Depth', faceArea:'Upper', facePart:'Eye' },\n '82': { id:'82', name:'Eye Inner Depth', faceArea:'Upper', facePart:'Eye' },\n '83': { id:'83', name:'Eye Inner Height', faceArea:'Upper', facePart:'Eye' },\n '84': { id:'84', name:'Eye Inner Width', faceArea:'Upper', facePart:'Eye' },\n '85': { id:'85', name:'Eye Outer Depth', faceArea:'Upper', facePart:'Eye' },\n '86': { id:'86', name:'Eye Outer Height', faceArea:'Upper', facePart:'Eye' },\n '87': { id:'87', name:'Eye Outer Width', faceArea:'Upper', facePart:'Eye' },\n '88': { id:'88', name:'Eye Upper Depth', faceArea:'Upper', facePart:'Eye' },\n '89': { id:'89', name:'Eye Lower Depth', faceArea:'Upper', facePart:'Eye' },\n '90': { id:'90', name:'Eye Center Upper Depth', faceArea:'Upper', facePart:'Eye' },\n '91': { id:'91', name:'Eye Center Upper Height',faceArea:'Upper', facePart:'Eye' },\n '92': { id:'92', name:'Eye Center Lower Depth', faceArea:'Upper', facePart:'Eye' },\n '93': { id:'93', name:'Eye Center Lower Height',faceArea:'Upper', facePart:'Eye' },\n '94': { id:'94', name:'Eye Inner Upper Depth', faceArea:'Upper', facePart:'Eye' },\n '95': { id:'95', name:'Eye Inner Upper Height', faceArea:'Upper', facePart:'Eye' },\n '96': { id:'96', name:'Eye Inner Lower Depth', faceArea:'Upper', facePart:'Eye' },\n '97': { id:'97', name:'Eye Inner Lower Height', faceArea:'Upper', facePart:'Eye' },\n '98': { id:'98', name:'Eye Outer Upper Depth', faceArea:'Upper', facePart:'Eye' },\n '99': { id:'99', name:'Eye Outer Upper Height', faceArea:'Upper', facePart:'Eye' },\n '100': { id:'100', name:'Eye Outer Lower Depth', faceArea:'Upper', facePart:'Eye' },\n '101': { id:'101', name:'Eye Outer Lower Height',faceArea:'Upper', facePart:'Eye' },\n '102': { id:'102', name:'Eye Duct Depth', faceArea:'Upper', facePart:'Eye' },\n};\n\n// ============================================================================\n// MIX DEFAULTS - Morph/bone blend weights\n// ============================================================================\n\n/** Default mix weights (0 = morph only, 1 = bone only) */\nexport const AU_MIX_DEFAULTS: Record<number, number> = {\n 31: 0.7, 32: 0.7, 33: 0.7, 54: 0.7, 55: 0.7, 56: 0.7, // head\n 61: 0.5, 62: 0.5, 63: 0.5, 64: 0.5, // eyes\n 25: 0.5, 26: 0.5, 27: 0.5, // jaw open (lips part, jaw drop, mouth stretch)\n 30: 0.5, 35: 0.5, // jaw left/right\n};\n\n// ============================================================================\n// CC4 MESH CLASSIFICATION\n// ============================================================================\n\nexport type MeshCategory = 'body' | 'eye' | 'eyeOcclusion' | 'tearLine' | 'teeth' | 'tongue' | 'hair' | 'eyebrow' | 'cornea' | 'eyelash';\n\n/** Blending mode names (matches Three.js constants) */\nexport type BlendingMode = 'Normal' | 'Additive' | 'Subtractive' | 'Multiply' | 'None';\n\n/** Material settings for mesh rendering */\nexport interface MeshMaterialSettings {\n renderOrder?: number;\n transparent?: boolean;\n opacity?: number;\n depthWrite?: boolean;\n depthTest?: boolean;\n blending?: BlendingMode;\n}\n\n/** Mesh info including category, morph count, and optional material settings */\nexport interface CC4MeshInfo {\n category: MeshCategory;\n morphCount: number;\n material?: MeshMaterialSettings;\n}\n\n/** Exact mesh name -> category mapping from the character GLB */\nexport const CC4_MESHES: Record<string, CC4MeshInfo> = {\n // Body (6 meshes, 80 morphs each) - default render order 0\n 'CC_Base_Body_1': { category: 'body', morphCount: 80 },\n 'CC_Base_Body_2': { category: 'body', morphCount: 80 },\n 'CC_Base_Body_3': { category: 'body', morphCount: 80 },\n 'CC_Base_Body_4': { category: 'body', morphCount: 80 },\n 'CC_Base_Body_5': { category: 'body', morphCount: 80 },\n 'CC_Base_Body_6': { category: 'body', morphCount: 80 },\n // Eyes (bone-driven, no morphs) - render first (behind everything)\n 'CC_Base_Eye': { category: 'eye', morphCount: 0, material: { renderOrder: -10 } },\n 'CC_Base_Eye_1': { category: 'eye', morphCount: 0, material: { renderOrder: -10 } },\n 'CC_Base_Eye_2': { category: 'eye', morphCount: 0, material: { renderOrder: -10 } },\n 'CC_Base_Eye_3': { category: 'eye', morphCount: 0, material: { renderOrder: -10 } },\n 'CC_Base_Eye_4': { category: 'eye', morphCount: 0, material: { renderOrder: -10 } },\n // Eye occlusion (94 morphs each) - render on top of eyes with transparency support\n 'CC_Base_EyeOcclusion_1': { category: 'eyeOcclusion', morphCount: 94, material: { renderOrder: 2, transparent: true, opacity: 1, depthWrite: true, depthTest: true, blending: 'Normal' } },\n 'CC_Base_EyeOcclusion_2': { category: 'eyeOcclusion', morphCount: 94, material: { renderOrder: 2, transparent: true, opacity: 1, depthWrite: true, depthTest: true, blending: 'Normal' } },\n // Tear lines (90 morphs each) - on top of eyes/face\n 'CC_Base_TearLine_1': { category: 'tearLine', morphCount: 90, material: { renderOrder: 2 } },\n 'CC_Base_TearLine_2': { category: 'tearLine', morphCount: 90, material: { renderOrder: 2 } },\n // Cornea (no morphs) - render first with eyes\n 'CC_Base_Cornea': { category: 'cornea', morphCount: 0, material: { renderOrder: -10 } },\n 'CC_Base_Cornea_1': { category: 'cornea', morphCount: 0, material: { renderOrder: -10 } },\n // Teeth (no morphs, follow jaw bone) - default render order\n 'CC_Base_Teeth_1': { category: 'teeth', morphCount: 0 },\n 'CC_Base_Teeth_2': { category: 'teeth', morphCount: 0 },\n // Tongue (23 morphs) - default render order\n 'CC_Base_Tongue': { category: 'tongue', morphCount: 23 },\n // Eyebrows (91 morphs each) - above face\n 'Male_Bushy_1': { category: 'eyebrow', morphCount: 91, material: { renderOrder: 5 } },\n 'Male_Bushy_2': { category: 'eyebrow', morphCount: 91, material: { renderOrder: 5 } },\n // Hair (14 styling morphs each) - render last (on top of everything)\n 'Side_part_wavy_1': { category: 'hair', morphCount: 14, material: { renderOrder: 10 } },\n 'Side_part_wavy_2': { category: 'hair', morphCount: 14, material: { renderOrder: 10 } },\n};\n\n// ============================================================================\n// MORPH TO MESH MAPPING\n// ============================================================================\n\nexport type MorphCategory = 'face' | 'viseme' | 'eye' | 'tearLine' | 'tongue' | 'hair';\n\n/** Which mesh each morph category applies to */\nexport const MORPH_TO_MESH: Record<MorphCategory, string[]> = {\n // Face/AU morphs affect the main face mesh and both eyebrow meshes.\n face: ['CC_Base_Body_1', 'Male_Bushy_1', 'Male_Bushy_2'],\n viseme: ['CC_Base_Body_1'],\n eye: ['CC_Base_EyeOcclusion_1', 'CC_Base_EyeOcclusion_2'],\n tearLine: ['CC_Base_TearLine_1', 'CC_Base_TearLine_2'],\n tongue: ['CC_Base_Tongue'],\n hair: ['Side_part_wavy_1', 'Side_part_wavy_2'],\n};\n\n// ============================================================================\n// CC4_PRESET - Main export for AUMappingConfig\n// ============================================================================\n\nexport const CC4_PRESET: AUMappingConfig = {\n auToMorphs: AU_TO_MORPHS,\n auToBones: BONE_AU_TO_BINDINGS,\n boneNodes: CC4_BONE_NODES,\n morphToMesh: MORPH_TO_MESH,\n visemeKeys: VISEME_KEYS,\n auMixDefaults: AU_MIX_DEFAULTS,\n auInfo: AU_INFO,\n eyeMeshNodes: CC4_EYE_MESH_NODES,\n};\n\nexport default CC4_PRESET;\n","/**\n * LoomLargeThree - Three.js Implementation\n *\n * Default implementation of the LoomLarge interface for Three.js.\n * Controls 3D character facial animation using Action Units (AUs),\n * morph targets, visemes, and bone transformations.\n */\n\nimport { Clock } from 'three';\nimport type {\n LoomLarge,\n LoomMesh,\n LoomObject3D,\n ReadyPayload,\n LoomLargeConfig,\n MeshInfo,\n} from '../../interfaces/LoomLarge';\nimport type { Animation } from '../../interfaces/Animation';\nimport type { TransitionHandle, BoneKey, RotationsState } from '../../core/types';\nimport type { AUMappingConfig } from '../../mappings/types';\nimport { AnimationThree } from './AnimationThree';\nimport { CC4_PRESET, CC4_MESHES } from '../../presets/cc4';\n\nconst deg2rad = (d: number) => (d * Math.PI) / 180;\n\nfunction clamp01(x: number) {\n return x < 0 ? 0 : x > 1 ? 1 : x;\n}\n\n/**\n * NodeBase - internal bone snapshot\n */\ninterface NodeBase {\n obj: LoomObject3D;\n basePos: { x: number; y: number; z: number };\n baseQuat: any;\n baseEuler: { x: number; y: number; z: number; order: string };\n}\n\ntype ResolvedBones = Partial<Record<string, NodeBase>>;\n\nexport class LoomLargeThree implements LoomLarge {\n // Configuration\n private config: AUMappingConfig;\n\n // Animation system (injectable)\n private animation: Animation;\n\n // State\n private auValues: Record<number, number> = {};\n private rigReady = false;\n private missingBoneWarnings = new Set<string>();\n\n // Rotation state\n private rotations: RotationsState = {};\n private pendingCompositeNodes = new Set<string>();\n private isPaused = false;\n private translations: Record<string, { x: number; y: number; z: number }> = {};\n\n // Mesh references\n private faceMesh: LoomMesh | null = null;\n private meshes: LoomMesh[] = [];\n private model: LoomObject3D | null = null;\n private meshByName = new Map<string, LoomMesh>();\n private morphCache = new Map<string, { infl: number[]; idx: number }[]>();\n\n // Bones\n private bones: ResolvedBones = {};\n private mixWeights: Record<number, number> = {};\n\n // Viseme state\n private visemeValues: number[] = new Array(15).fill(0);\n\n // Internal RAF loop\n private clock = new Clock();\n private rafId: number | null = null;\n private running = false;\n\n // Viseme jaw amounts\n private static readonly VISEME_JAW_AMOUNTS: number[] = [\n 0.15, 0.35, 0.25, 0.70, 0.55, 0.30, 0.10, 0.20, 0.08,\n 0.12, 0.18, 0.02, 0.25, 0.60, 0.40,\n ];\n private static readonly JAW_MAX_DEGREES = 28;\n\n constructor(config: LoomLargeConfig = {}, animation?: Animation) {\n this.config = config.auMappings || CC4_PRESET;\n this.mixWeights = { ...this.config.auMixDefaults };\n this.animation = animation || new AnimationThree();\n }\n\n // ============================================================================\n // PUBLIC API\n // ============================================================================\n\n onReady(payload: ReadyPayload): void {\n const { meshes, model } = payload;\n\n this.meshes = meshes;\n this.model = model;\n this.meshByName.clear();\n this.morphCache.clear();\n\n // Build mesh lookup\n model.traverse((obj: any) => {\n if (obj.isMesh && obj.name) {\n const infl = obj.morphTargetInfluences;\n if (Array.isArray(infl) && infl.length > 0) {\n this.meshByName.set(obj.name, obj);\n }\n }\n });\n\n // Find primary face mesh\n const faceMeshNames = this.config.morphToMesh?.face || [];\n const defaultFace = meshes.find((m) => faceMeshNames.includes(m.name));\n if (defaultFace) {\n this.faceMesh = defaultFace;\n } else {\n const candidate = meshes.find((m) => {\n const dict = m.morphTargetDictionary;\n return dict && typeof dict === 'object' && 'Brow_Drop_L' in dict;\n });\n this.faceMesh = candidate || null;\n }\n\n // Resolve bones\n this.bones = this.resolveBones(model);\n this.rigReady = true;\n this.missingBoneWarnings.clear();\n this.initBoneRotations();\n\n // Apply render order and material settings from CC4_MESHES\n this.applyMeshMaterialSettings(model);\n }\n\n update(deltaSeconds: number): void {\n const dtSeconds = Math.max(0, deltaSeconds || 0);\n if (dtSeconds <= 0 || this.isPaused) return;\n\n this.animation.tick(dtSeconds);\n this.flushPendingComposites();\n }\n\n /** Start the internal RAF loop */\n start(): void {\n if (this.running) return;\n this.running = true;\n this.clock.start();\n\n const tick = () => {\n if (!this.running) return;\n const dt = this.clock.getDelta();\n this.update(dt);\n this.rafId = requestAnimationFrame(tick);\n };\n\n this.rafId = requestAnimationFrame(tick);\n }\n\n /** Stop the internal RAF loop */\n stop(): void {\n this.running = false;\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n this.clock.stop();\n }\n\n dispose(): void {\n this.stop();\n this.clearTransitions();\n this.meshes = [];\n this.model = null;\n this.bones = {};\n }\n\n // ============================================================================\n // AU CONTROL\n // ============================================================================\n\n setAU(id: number | string, v: number, balance?: number): void {\n if (typeof id === 'string') {\n const match = id.match(/^(\\d+)([LR])$/i);\n if (match) {\n const au = Number(match[1]);\n const side = match[2].toUpperCase() as 'L' | 'R';\n const sideBalance = side === 'L' ? -1 : 1;\n this.setAU(au, v, sideBalance);\n return;\n }\n const n = Number(id);\n if (!Number.isNaN(n)) {\n this.setAU(n, v, balance);\n }\n return;\n }\n\n this.auValues[id] = v;\n\n const keys = this.config.auToMorphs[id] || [];\n if (keys.length) {\n const mixWeight = this.isMixedAU(id) ? this.getAUMixWeight(id) : 1.0;\n const base = clamp01(v) * mixWeight;\n const meshNames = this.getMeshNamesForAU(id);\n\n const leftKeys = keys.filter((k) => /(_L$| L$|Left$)/i.test(k));\n const rightKeys = keys.filter((k) => /(_R$| R$|Right$)/i.test(k));\n const centerKeys = keys.filter((k) => !/(_L$| L$|Left$|_R$| R$|Right$)/i.test(k));\n\n const { left: leftVal, right: rightVal } = this.computeSideValues(base, balance);\n\n if (leftKeys.length || rightKeys.length) {\n for (const k of leftKeys) this.setMorph(k, leftVal, meshNames);\n for (const k of rightKeys) this.setMorph(k, rightVal, meshNames);\n } else {\n centerKeys.push(...keys);\n }\n\n for (const k of centerKeys) {\n this.setMorph(k, base, meshNames);\n }\n }\n\n const bindings = this.config.auToBones[id];\n if (bindings) {\n for (const binding of bindings) {\n if (binding.channel === 'rx' || binding.channel === 'ry' || binding.channel === 'rz') {\n const axis = binding.channel === 'rx' ? 'pitch' : binding.channel === 'ry' ? 'yaw' : 'roll';\n this.updateBoneRotation(binding.node, axis, v * binding.scale, binding.maxDegrees ?? 0);\n } else if (binding.channel === 'tx' || binding.channel === 'ty' || binding.channel === 'tz') {\n if (binding.maxUnits !== undefined) {\n this.updateBoneTranslation(binding.node, binding.channel, v * binding.scale, binding.maxUnits);\n }\n }\n }\n }\n }\n\n transitionAU(id: number | string, to: number, durationMs = 200, balance?: number): TransitionHandle {\n const numId = typeof id === 'string' ? Number(id.replace(/[^\\d]/g, '')) : id;\n const target = clamp01(to);\n\n const morphKeys = this.config.auToMorphs[numId] || [];\n const bindings = this.config.auToBones[numId] || [];\n\n const mixWeight = this.isMixedAU(numId) ? this.getAUMixWeight(numId) : 1.0;\n const base = target * mixWeight;\n\n const { left: leftVal, right: rightVal } = this.computeSideValues(base, balance);\n\n this.auValues[numId] = target;\n\n const handles: TransitionHandle[] = [];\n const meshNames = this.getMeshNamesForAU(numId);\n\n const leftKeys = morphKeys.filter((k) => /(_L$|Left$)/.test(k));\n const rightKeys = morphKeys.filter((k) => /(_R$|Right$)/.test(k));\n const centerKeys = morphKeys.filter((k) => !/(_L$|Left$|_R$|Right$)/.test(k));\n\n if (leftKeys.length || rightKeys.length) {\n for (const k of leftKeys) {\n handles.push(this.transitionMorph(k, leftVal, durationMs, meshNames));\n }\n for (const k of rightKeys) {\n handles.push(this.transitionMorph(k, rightVal, durationMs, meshNames));\n }\n } else {\n centerKeys.push(...morphKeys);\n }\n\n for (const k of centerKeys) {\n handles.push(this.transitionMorph(k, base, durationMs, meshNames));\n }\n\n for (const binding of bindings) {\n if (binding.channel === 'rx' || binding.channel === 'ry' || binding.channel === 'rz') {\n const axis = binding.channel === 'rx' ? 'pitch' : binding.channel === 'ry' ? 'yaw' : 'roll';\n handles.push(this.transitionBoneRotation(binding.node, axis, target * binding.scale, binding.maxDegrees ?? 0, durationMs));\n } else if (binding.channel === 'tx' || binding.channel === 'ty' || binding.channel === 'tz') {\n if (binding.maxUnits !== undefined) {\n handles.push(this.transitionBoneTranslation(binding.node, binding.channel, target * binding.scale, binding.maxUnits, durationMs));\n }\n }\n }\n\n return this.combineHandles(handles);\n }\n\n getAU(id: number): number {\n return this.auValues[id] ?? 0;\n }\n\n // ============================================================================\n // MORPH CONTROL\n // ============================================================================\n\n setMorph(key: string, v: number, meshNames?: string[]): void {\n const val = clamp01(v);\n const targetMeshes = meshNames || this.config.morphToMesh?.face || [];\n\n const cached = this.morphCache.get(key);\n if (cached) {\n for (const target of cached) {\n target.infl[target.idx] = val;\n }\n return;\n }\n\n const targets: { infl: number[]; idx: number }[] = [];\n\n if (targetMeshes.length) {\n for (const name of targetMeshes) {\n const mesh = this.meshByName.get(name);\n if (!mesh) continue;\n const dict = mesh.morphTargetDictionary;\n const infl = mesh.morphTargetInfluences;\n if (!dict || !infl) continue;\n const idx = dict[key];\n if (idx !== undefined) {\n targets.push({ infl, idx });\n infl[idx] = val;\n }\n }\n } else {\n for (const mesh of this.meshes) {\n const dict = mesh.morphTargetDictionary;\n const infl = mesh.morphTargetInfluences;\n if (!dict || !infl) continue;\n const idx = dict[key];\n if (idx !== undefined) {\n targets.push({ infl, idx });\n infl[idx] = val;\n }\n }\n }\n\n if (targets.length > 0) {\n this.morphCache.set(key, targets);\n }\n }\n\n transitionMorph(key: string, to: number, durationMs = 120, meshNames?: string[]): TransitionHandle {\n const transitionKey = `morph_${key}`;\n const from = this.getMorphValue(key);\n const target = clamp01(to);\n return this.animation.addTransition(transitionKey, from, target, durationMs, (value) => this.setMorph(key, value, meshNames));\n }\n\n // ============================================================================\n // VISEME CONTROL\n // ============================================================================\n\n setViseme(visemeIndex: number, value: number, jawScale = 1.0): void {\n if (visemeIndex < 0 || visemeIndex >= this.config.visemeKeys.length) return;\n\n const val = clamp01(value);\n this.visemeValues[visemeIndex] = val;\n\n const morphKey = this.config.visemeKeys[visemeIndex];\n this.setMorph(morphKey, val);\n\n const jawAmount = LoomLargeThree.VISEME_JAW_AMOUNTS[visemeIndex] * val * jawScale;\n if (Math.abs(jawScale) > 1e-6 && Math.abs(jawAmount) > 1e-6) {\n this.updateBoneRotation('JAW', 'roll', jawAmount, LoomLargeThree.JAW_MAX_DEGREES);\n }\n }\n\n transitionViseme(visemeIndex: number, to: number, durationMs = 80, jawScale = 1.0): TransitionHandle {\n if (visemeIndex < 0 || visemeIndex >= this.config.visemeKeys.length) {\n return { promise: Promise.resolve(), pause: () => {}, resume: () => {}, cancel: () => {} };\n }\n\n const morphKey = this.config.visemeKeys[visemeIndex];\n const target = clamp01(to);\n this.visemeValues[visemeIndex] = target;\n\n const morphHandle = this.transitionMorph(morphKey, target, durationMs);\n\n const jawAmount = LoomLargeThree.VISEME_JAW_AMOUNTS[visemeIndex] * target * jawScale;\n if (Math.abs(jawScale) <= 1e-6 || Math.abs(jawAmount) <= 1e-6) {\n return morphHandle;\n }\n\n const jawHandle = this.transitionBoneRotation('JAW', 'roll', jawAmount, LoomLargeThree.JAW_MAX_DEGREES, durationMs);\n return this.combineHandles([morphHandle, jawHandle]);\n }\n\n // ============================================================================\n // MIX WEIGHT CONTROL\n // ============================================================================\n\n setAUMixWeight(id: number, weight: number): void {\n this.mixWeights[id] = clamp01(weight);\n const v = this.auValues[id] ?? 0;\n if (v > 0) this.setAU(id, v);\n\n const boneBindings = this.config.auToBones[id];\n if (boneBindings) {\n for (const binding of boneBindings) {\n this.pendingCompositeNodes.add(binding.node);\n }\n }\n }\n\n getAUMixWeight(id: number): number {\n return this.mixWeights[id] ?? this.config.auMixDefaults?.[id] ?? 1.0;\n }\n\n // ============================================================================\n // PLAYBACK CONTROL\n // ============================================================================\n\n pause(): void { this.isPaused = true; }\n resume(): void { this.isPaused = false; }\n getPaused(): boolean { return this.isPaused; }\n clearTransitions(): void { this.animation.clearTransitions(); }\n getActiveTransitionCount(): number { return this.animation.getActiveTransitionCount(); }\n\n resetToNeutral(): void {\n this.auValues = {};\n this.initBoneRotations();\n this.clearTransitions();\n\n for (const m of this.meshes) {\n const infl = m.morphTargetInfluences;\n if (!infl) continue;\n for (let i = 0; i < infl.length; i++) {\n infl[i] = 0;\n }\n }\n\n Object.values(this.bones).forEach((entry) => {\n if (!entry) return;\n entry.obj.position.copy(entry.basePos as any);\n entry.obj.quaternion.copy(entry.baseQuat);\n });\n }\n\n // ============================================================================\n // MESH CONTROL\n // ============================================================================\n\n getMeshList(): MeshInfo[] {\n if (!this.model) return [];\n const result: MeshInfo[] = [];\n this.model.traverse((obj: any) => {\n if (obj.isMesh) {\n result.push({\n name: obj.name,\n visible: obj.visible,\n morphCount: obj.morphTargetInfluences?.length || 0,\n });\n }\n });\n return result;\n }\n\n setMeshVisible(meshName: string, visible: boolean): void {\n if (!this.model) return;\n this.model.traverse((obj: any) => {\n if (obj.isMesh && obj.name === meshName) {\n obj.visible = visible;\n }\n });\n }\n\n // ============================================================================\n // CONFIGURATION\n // ============================================================================\n\n setAUMappings(mappings: AUMappingConfig): void {\n this.config = mappings;\n this.mixWeights = { ...mappings.auMixDefaults };\n }\n\n getAUMappings(): AUMappingConfig { return this.config; }\n\n // ============================================================================\n // PRIVATE METHODS\n // ============================================================================\n\n private computeSideValues(base: number, balance?: number): { left: number; right: number } {\n const b = Math.max(-1, Math.min(1, balance ?? 0));\n if (b === 0) return { left: base, right: base };\n if (b < 0) return { left: base, right: base * (1 + b) };\n return { left: base * (1 - b), right: base };\n }\n\n private getMeshNamesForAU(auId: number): string[] {\n const info = this.config.auInfo?.[String(auId)];\n if (!info?.facePart) return this.config.morphToMesh?.face || [];\n switch (info.facePart) {\n case 'Tongue': return this.config.morphToMesh?.tongue || [];\n case 'Eye': return this.config.morphToMesh?.eye || [];\n default: return this.config.morphToMesh?.face || [];\n }\n }\n\n private getMorphValue(key: string): number {\n if (this.faceMesh) {\n const dict = this.faceMesh.morphTargetDictionary;\n const infl = this.faceMesh.morphTargetInfluences;\n if (dict && infl) {\n const idx = dict[key];\n if (idx !== undefined) return infl[idx] ?? 0;\n }\n return 0;\n }\n for (const mesh of this.meshes) {\n const dict = mesh.morphTargetDictionary;\n const infl = mesh.morphTargetInfluences;\n if (!dict || !infl) continue;\n const idx = dict[key];\n if (idx !== undefined) return infl[idx] ?? 0;\n }\n return 0;\n }\n\n private isMixedAU(id: number): boolean {\n return !!(this.config.auToMorphs[id]?.length && this.config.auToBones[id]?.length);\n }\n\n private initBoneRotations(): void {\n const zeroAxis = { value: 0, maxRadians: 0 };\n this.rotations = {};\n this.pendingCompositeNodes.clear();\n\n const allBoneKeys = Array.from(\n new Set(Object.values(this.config.auToBones).flat().map((binding) => binding.node))\n );\n\n for (const node of allBoneKeys) {\n this.rotations[node] = { pitch: { ...zeroAxis }, yaw: { ...zeroAxis }, roll: { ...zeroAxis } };\n this.pendingCompositeNodes.add(node);\n }\n }\n\n private updateBoneRotation(nodeKey: string, axis: 'pitch' | 'yaw' | 'roll', value: number, maxDegrees: number): void {\n if (!this.rotations[nodeKey]) return;\n this.rotations[nodeKey][axis] = { value: Math.max(-1, Math.min(1, value)), maxRadians: deg2rad(maxDegrees) };\n this.pendingCompositeNodes.add(nodeKey);\n }\n\n private updateBoneTranslation(nodeKey: string, channel: 'tx' | 'ty' | 'tz', value: number, maxUnits: number): void {\n if (!this.translations[nodeKey]) this.translations[nodeKey] = { x: 0, y: 0, z: 0 };\n const clamped = Math.max(-1, Math.min(1, value));\n const offset = clamped * maxUnits;\n if (channel === 'tx') this.translations[nodeKey].x = offset;\n else if (channel === 'ty') this.translations[nodeKey].y = offset;\n else this.translations[nodeKey].z = offset;\n this.pendingCompositeNodes.add(nodeKey);\n }\n\n private transitionBoneRotation(nodeKey: string, axis: 'pitch' | 'yaw' | 'roll', to: number, maxDegrees: number, durationMs = 200): TransitionHandle {\n const transitionKey = `bone_${nodeKey}_${axis}`;\n const from = this.rotations[nodeKey]?.[axis]?.value ?? 0;\n const target = Math.max(-1, Math.min(1, to));\n return this.animation.addTransition(transitionKey, from, target, durationMs, (value) => this.updateBoneRotation(nodeKey, axis, value, maxDegrees));\n }\n\n private transitionBoneTranslation(nodeKey: string, channel: 'tx' | 'ty' | 'tz', to: number, maxUnits: number, durationMs = 200): TransitionHandle {\n const transitionKey = `boneT_${nodeKey}_${channel}`;\n const current = this.translations[nodeKey] || { x: 0, y: 0, z: 0 };\n const currentOffset = channel === 'tx' ? current.x : channel === 'ty' ? current.y : current.z;\n const from = maxUnits !== 0 ? Math.max(-1, Math.min(1, currentOffset / maxUnits)) : 0;\n const target = Math.max(-1, Math.min(1, to));\n return this.animation.addTransition(transitionKey, from, target, durationMs, (value) => this.updateBoneTranslation(nodeKey, channel, value, maxUnits));\n }\n\n private flushPendingComposites(): void {\n if (this.pendingCompositeNodes.size === 0) return;\n for (const nodeKey of this.pendingCompositeNodes) {\n this.applyCompositeRotation(nodeKey as BoneKey);\n }\n this.pendingCompositeNodes.clear();\n }\n\n private applyCompositeRotation(nodeKey: BoneKey): void {\n const entry = this.bones[nodeKey];\n if (!entry || !this.model) {\n if (!entry && this.rigReady && !this.missingBoneWarnings.has(nodeKey)) {\n this.missingBoneWarnings.add(nodeKey);\n }\n return;\n }\n\n const { obj, basePos, baseEuler } = entry;\n const rotState = this.rotations[nodeKey];\n if (!rotState) return;\n\n const yawRad = rotState.yaw.maxRadians * rotState.yaw.value;\n const pitchRad = rotState.pitch.maxRadians * rotState.pitch.value;\n const rollRad = rotState.roll.maxRadians * rotState.roll.value;\n\n obj.position.copy(basePos as any);\n const t = this.translations[nodeKey];\n if (t) {\n obj.position.x += t.x;\n obj.position.y += t.y;\n obj.position.z += t.z;\n }\n\n obj.rotation.set(baseEuler.x + pitchRad, baseEuler.y + yawRad, baseEuler.z + rollRad, baseEuler.order);\n obj.updateMatrixWorld(false);\n this.model.updateMatrixWorld(true);\n }\n\n private resolveBones(root: LoomObject3D): ResolvedBones {\n const resolved: ResolvedBones = {};\n\n const snapshot = (obj: any): NodeBase => ({\n obj,\n basePos: { x: obj.position.x, y: obj.position.y, z: obj.position.z },\n baseQuat: obj.quaternion.clone(),\n baseEuler: { x: obj.rotation.x, y: obj.rotation.y, z: obj.rotation.z, order: obj.rotation.order },\n });\n\n const findNode = (name?: string | null): LoomObject3D | undefined => {\n if (!name) return undefined;\n return root.getObjectByName(name);\n };\n\n for (const [key, nodeName] of Object.entries(this.config.boneNodes)) {\n const node = findNode(nodeName);\n if (node) resolved[key] = snapshot(node);\n }\n\n if (!resolved.EYE_L && this.config.eyeMeshNodes) {\n const node = findNode(this.config.eyeMeshNodes.LEFT);\n if (node) resolved.EYE_L = snapshot(node);\n }\n if (!resolved.EYE_R && this.config.eyeMeshNodes) {\n const node = findNode(this.config.eyeMeshNodes.RIGHT);\n if (node) resolved.EYE_R = snapshot(node);\n }\n\n return resolved;\n }\n\n private combineHandles(handles: TransitionHandle[]): TransitionHandle {\n if (handles.length === 0) return { promise: Promise.resolve(), pause: () => {}, resume: () => {}, cancel: () => {} };\n if (handles.length === 1) return handles[0];\n return {\n promise: Promise.all(handles.map((h) => h.promise)).then(() => {}),\n pause: () => handles.forEach((h) => h.pause()),\n resume: () => handles.forEach((h) => h.resume()),\n cancel: () => handles.forEach((h) => h.cancel()),\n };\n }\n\n /**\n * Apply render order and material settings from CC4_MESHES to all meshes.\n * This ensures proper layering (e.g., hair renders on top of eyebrows).\n */\n private applyMeshMaterialSettings(root: LoomObject3D): void {\n root.traverse((obj: any) => {\n if (!obj.isMesh || !obj.name) return;\n\n const meshInfo = CC4_MESHES[obj.name];\n if (!meshInfo?.material) return;\n\n const settings = meshInfo.material;\n\n // Apply renderOrder to the mesh itself\n if (typeof settings.renderOrder === 'number') {\n obj.renderOrder = settings.renderOrder;\n }\n\n // Apply material settings if the mesh has a material\n if (obj.material) {\n if (typeof settings.transparent === 'boolean') {\n obj.material.transparent = settings.transparent;\n }\n if (typeof settings.opacity === 'number') {\n obj.material.opacity = settings.opacity;\n }\n if (typeof settings.depthWrite === 'boolean') {\n obj.material.depthWrite = settings.depthWrite;\n }\n if (typeof settings.depthTest === 'boolean') {\n obj.material.depthTest = settings.depthTest;\n }\n }\n });\n }\n}\n\n/**\n * Helper function to collect meshes with morph targets from a scene.\n */\nexport function collectMorphMeshes(root: LoomObject3D): LoomMesh[] {\n const meshes: LoomMesh[] = [];\n root.traverse((obj: any) => {\n if (obj.isMesh) {\n if (Array.isArray(obj.morphTargetInfluences) && obj.morphTargetInfluences.length > 0) {\n meshes.push(obj);\n }\n }\n });\n return meshes;\n}\n","/**\n * HairPhysics - Spring-damper pendulum simulation for hair movement\n *\n * This is a pure physics simulation class with no Three.js dependencies.\n * It outputs normalized morph values (0-1) that can be applied to hair meshes\n * via EngineThree.setMorph() or transitionMorph().\n *\n * Physics model:\n * - Hair is modeled as a damped pendulum affected by:\n * - Gravity (constant downward force based on head orientation)\n * - Head velocity (inertia causes hair to lag behind head movement)\n * - Wind (oscillating force with turbulence)\n * - Spring restoration (hair returns to rest position)\n * - Damping (air resistance)\n */\n\nexport interface HairPhysicsConfig {\n // Spring-damper parameters\n mass: number; // Hair mass (affects inertia), default 1.0\n stiffness: number; // Spring stiffness (restoration force), default 15\n damping: number; // Damping coefficient (air resistance), default 0.8\n\n // Gravity\n gravity: number; // Gravity strength, default 9.8\n\n // Head influence\n headInfluence: number; // How much head movement affects hair (0-1), default 0.5\n\n // Wind simulation\n windEnabled: boolean;\n windStrength: number; // Wind force magnitude, default 0\n windDirectionX: number; // Wind direction X component (-1 to 1), default 1\n windDirectionZ: number; // Wind direction Z component (-1 to 1), default 0\n windTurbulence: number; // Random variation in wind, default 0.2\n windFrequency: number; // Oscillation frequency in Hz, default 0.5\n}\n\nexport interface HairPhysicsState {\n // Current pendulum position (normalized -1 to 1)\n x: number; // Left/right swing\n z: number; // Front/back swing\n\n // Current velocity\n vx: number;\n vz: number;\n}\n\nexport interface HairMorphOutput {\n // Left side morphs (0-1)\n L_Hair_Left: number;\n L_Hair_Right: number;\n L_Hair_Front: number;\n\n // Right side morphs (0-1)\n R_Hair_Left: number;\n R_Hair_Right: number;\n R_Hair_Front: number;\n}\n\nexport interface HeadState {\n // Head rotation in radians\n yaw: number; // Left/right rotation\n pitch: number; // Up/down rotation\n roll: number; // Tilt\n\n // Head angular velocity (radians/sec) - for inertia\n yawVelocity: number;\n pitchVelocity: number;\n}\n\nexport const DEFAULT_HAIR_PHYSICS_CONFIG: HairPhysicsConfig = {\n mass: 1.0,\n stiffness: 15,\n damping: 0.8,\n gravity: 9.8,\n headInfluence: 0.5,\n windEnabled: false,\n windStrength: 0,\n windDirectionX: 1,\n windDirectionZ: 0,\n windTurbulence: 0.2,\n windFrequency: 0.5,\n};\n\nexport class HairPhysics {\n private config: HairPhysicsConfig;\n private state: HairPhysicsState;\n private time: number = 0;\n\n // Previous head state for velocity calculation\n private prevHeadYaw: number = 0;\n private prevHeadPitch: number = 0;\n\n constructor(config: Partial<HairPhysicsConfig> = {}) {\n this.config = { ...DEFAULT_HAIR_PHYSICS_CONFIG, ...config };\n this.state = { x: 0, z: 0, vx: 0, vz: 0 };\n }\n\n /**\n * Update physics simulation\n * @param dt Delta time in seconds\n * @param headState Current head orientation and velocity\n * @returns Morph values to apply to hair meshes\n */\n update(dt: number, headState: HeadState): HairMorphOutput {\n if (dt <= 0 || dt > 0.1) {\n // Skip bad delta times (prevent explosion on tab switch)\n return this.computeMorphOutput();\n }\n\n this.time += dt;\n\n const { mass, stiffness, damping, gravity, headInfluence, windEnabled } = this.config;\n\n // Calculate head angular velocity if not provided\n const headYawVel = headState.yawVelocity !== 0\n ? headState.yawVelocity\n : (headState.yaw - this.prevHeadYaw) / dt;\n const headPitchVel = headState.pitchVelocity !== 0\n ? headState.pitchVelocity\n : (headState.pitch - this.prevHeadPitch) / dt;\n\n this.prevHeadYaw = headState.yaw;\n this.prevHeadPitch = headState.pitch;\n\n // === Forces ===\n\n // 1. Spring restoration force (pulls hair back to center)\n const springFx = -stiffness * this.state.x;\n const springFz = -stiffness * this.state.z;\n\n // 2. Damping force (air resistance)\n const dampFx = -damping * this.state.vx;\n const dampFz = -damping * this.state.vz;\n\n // 3. Gravity effect based on head pitch\n // When head tilts forward (positive pitch), hair swings forward\n // When head tilts back, hair swings back\n const gravityFz = gravity * Math.sin(headState.pitch) * 0.1;\n\n // 4. Head rotation inertia (hair lags behind head movement)\n // When head turns right (positive yaw velocity), hair swings left relative to head\n const inertiaFx = -headYawVel * headInfluence * mass * 2;\n const inertiaFz = -headPitchVel * headInfluence * mass * 2;\n\n // 5. Wind force\n let windFx = 0;\n let windFz = 0;\n if (windEnabled && this.config.windStrength > 0) {\n const { windStrength, windDirectionX, windDirectionZ, windTurbulence, windFrequency } = this.config;\n\n // Base oscillating wind\n const windPhase = this.time * windFrequency * Math.PI * 2;\n const windOscillation = Math.sin(windPhase);\n\n // Add turbulence (perpendicular to wind direction)\n const turbulencePhase = this.time * windFrequency * 3.7; // Different frequency for variation\n const turbulence = Math.sin(turbulencePhase) * windTurbulence;\n\n windFx = windStrength * windDirectionX * (0.5 + 0.5 * windOscillation) + turbulence * (-windDirectionZ);\n windFz = windStrength * windDirectionZ * (0.5 + 0.5 * windOscillation) + turbulence * windDirectionX;\n }\n\n // === Integration (Semi-implicit Euler) ===\n\n const totalFx = springFx + dampFx + inertiaFx + windFx;\n const totalFz = springFz + dampFz + gravityFz + inertiaFz + windFz;\n\n // Acceleration = Force / Mass\n const ax = totalFx / mass;\n const az = totalFz / mass;\n\n // Update velocity\n this.state.vx += ax * dt;\n this.state.vz += az * dt;\n\n // Clamp velocity to prevent instability\n const maxVel = 10;\n this.state.vx = Math.max(-maxVel, Math.min(maxVel, this.state.vx));\n this.state.vz = Math.max(-maxVel, Math.min(maxVel, this.state.vz));\n\n // Update position\n this.state.x += this.state.vx * dt;\n this.state.z += this.state.vz * dt;\n\n // Clamp position to valid range\n this.state.x = Math.max(-1, Math.min(1, this.state.x));\n this.state.z = Math.max(-1, Math.min(1, this.state.z));\n\n return this.computeMorphOutput();\n }\n\n /**\n * Convert physics state to morph target values\n * Maps pendulum position to left/right/front morphs for both sides\n */\n private computeMorphOutput(): HairMorphOutput {\n const { x, z } = this.state;\n\n // X axis: negative = swing left, positive = swing right\n // Z axis: negative = swing back, positive = swing forward\n\n // Left side of hair\n // When hair swings left (x < 0), L_Hair_Left increases\n // When hair swings right (x > 0), L_Hair_Right increases\n const L_Hair_Left = Math.max(0, -x);\n const L_Hair_Right = Math.max(0, x);\n const L_Hair_Front = Math.max(0, z);\n\n // Right side mirrors left side behavior\n // When hair swings left (x < 0), R_Hair_Left increases\n // When hair swings right (x > 0), R_Hair_Right increases\n const R_Hair_Left = Math.max(0, -x);\n const R_Hair_Right = Math.max(0, x);\n const R_Hair_Front = Math.max(0, z);\n\n return {\n L_Hair_Left,\n L_Hair_Right,\n L_Hair_Front,\n R_Hair_Left,\n R_Hair_Right,\n R_Hair_Front,\n };\n }\n\n /**\n * Get current physics state (for debugging/UI)\n */\n getState(): HairPhysicsState {\n return { ...this.state };\n }\n\n /**\n * Update configuration\n */\n setConfig(config: Partial<HairPhysicsConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Get current configuration\n */\n getConfig(): HairPhysicsConfig {\n return { ...this.config };\n }\n\n /**\n * Reset physics state to rest position\n */\n reset(): void {\n this.state = { x: 0, z: 0, vx: 0, vz: 0 };\n this.time = 0;\n this.prevHeadYaw = 0;\n this.prevHeadPitch = 0;\n }\n}\n"]}