three-usd-robot 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +136 -35
- package/dist/AssetResolver-CpIJNgWZ.d.ts +29 -0
- package/dist/{ThreeUsdRobot-Deoh7zam.d.ts → ThreeUsdRobot-CajXJqYU.d.ts} +1 -1
- package/dist/ThreeUsdRobotLoader-DrMMLzo-.d.ts +67 -0
- package/dist/{buildKinematicTree-CZjBMA1I.d.ts → buildKinematicTree-wtZPzy0B.d.ts} +53 -16
- package/dist/{chunk-FYVZ7YPW.js → chunk-4MEZM763.js} +3153 -2618
- package/dist/chunk-4MEZM763.js.map +1 -0
- package/dist/chunk-JZMCABQO.js +864 -0
- package/dist/chunk-JZMCABQO.js.map +1 -0
- package/dist/chunk-YVWSO27W.js +709 -0
- package/dist/chunk-YVWSO27W.js.map +1 -0
- package/dist/core.d.ts +297 -134
- package/dist/core.js +2 -1
- package/dist/extras.d.ts +2 -2
- package/dist/helpers.d.ts +2 -2
- package/dist/index.d.ts +229 -83
- package/dist/index.js +271 -631
- package/dist/index.js.map +1 -1
- package/dist/react.d.ts +72 -0
- package/dist/react.js +92 -0
- package/dist/react.js.map +1 -0
- package/package.json +22 -1
- package/dist/chunk-FYVZ7YPW.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/version.ts","../src/export/exportRobot.ts","../src/export/GeometryProvider.ts","../src/export/writeUsdz.ts","../src/robot/RobotValidator.ts"],"names":["attr"],"mappings":";;;;AACO,IAAM,YAAA,GAAe;AAGrB,IAAM,OAAA,GAAU;;;ACqDvB,IAAM,sBAAA,GAAyB,sBAAA;AAsB/B,IAAM,oBAAA,GAAkD;AAAA,EACtD,KAAA,EAAO,mBAAA;AAAA,EACP,QAAA,EAAU,sBAAA;AAAA,EACV,UAAA,EAAY,sBAAA;AAAA,EACZ,SAAA,EAAW;AACb,CAAA;AAGO,SAAS,eAAA,CACd,IAAA,EACA,OAAA,GAA8B,EAAC,EACrB;AACV,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAc,OAAA,CAAQ,SAAS,CAAC,CAAA;AAC9C,EAAA,MAAM,OAAO,kBAAA,CAAmB,IAAA,EAAM,EAAE,MAAA,EAAQ,MAAM,CAAA;AAEtD,EAAA,MAAM,YAAY,YAAA,CAAa,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,QAAQ,OAAO,CAAA;AAGxE,EAAA,MAAM,KAAA,GAAQ,cAAc,IAAI,CAAA;AAChC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAC1C,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,EAAG,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,KAAA,CAAM,GAAA,EAAK,CAAA,MAAA,EAAS,GAAG,GAAG,CAAC,CAAA;AACzF,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAC3C,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA,EAAG,UAAA,CAAW,GAAA,CAAI,GAAA,EAAK,KAAA,CAAM,GAAA,EAAK,CAAA,OAAA,EAAU,GAAG,GAAG,CAAC,CAAA;AAC5F,EAAA,MAAM,QAAA,GAAW,CAAC,GAAA,KAAgB,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI,SAAA,CAAU,GAAA,CAAI,GAAG,CAAC,CAAA,CAAA;AAKrE,EAAA,MAAM,aAAA,GAAgB,CAAC,GAAA,KAAgB,IAAA,CAAK,MAAM,GAAG,CAAA,EAAG,kBAAkB,SAAA,EAAU;AACpF,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAkB;AAC1C,EAAA,KAAA,MAAW,GAAA,IAAO,KAAK,KAAA,EAAO;AAC5B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC3B,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,IAAA,IAAQ,IAAA,CAAK,kBAAkB,IAAA,EAAM;AACvD,MAAA,MAAM,YAAY,IAAA,CAAK,SAAA,GAAY,KAAK,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,GAAI,MAAA;AACjE,MAAA,WAAA,CAAY,GAAA;AAAA,QACV,GAAA;AAAA,QACA,SAAA,GACI,QAAA,CAAS,SAAA,CAAU,WAAA,EAAa,MAAA,CAAO,UAAU,WAAW,CAAC,CAAA,GAC7D,aAAA,CAAc,GAAG;AAAA,OACvB;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA;AAC5C,IAAA,MAAM,cAAc,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,MAAM,KAAK,SAAA,EAAU;AAC9D,IAAA,WAAA,CAAY,GAAA;AAAA,MACV,GAAA;AAAA,MACA,QAAA,CAAS,SAAS,WAAA,EAAa,KAAA,CAAM,WAAW,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,WAAW,CAAC;AAAA,KAC9E;AAAA,EACF;AACA,EAAA,KAAA,MAAW,GAAA,IAAO,KAAK,aAAA,EAAe,WAAA,CAAY,IAAI,GAAA,EAAK,aAAA,CAAc,GAAG,CAAC,CAAA;AAI7E,EAAA,MAAM,oBAAoB,IAAI,GAAA,CAAI,IAAA,CAAK,iBAAA,IAAqB,EAAE,CAAA;AAG9D,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAA0B;AACnD,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAA4B;AAClD,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAmC;AAChE,EAAA,KAAA,MAAW,CAAC,KAAK,IAAI,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AACpD,IAAA,MAAM,SAAS,OAAA,CAAQ,QAAA,GAAW,GAAA,EAAK,IAAI,KAAK,EAAC;AACjD,IAAA,YAAA,CAAa,GAAA,CAAI,KAAK,MAAM,CAAA;AAC5B,IAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,MAAA,IAAI,IAAA,CAAK,YAAY,CAAC,SAAA,CAAU,IAAI,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG;AACvD,QAAA,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,KAAK,QAAQ,CAAA;AAAA,MACjD;AACA,MAAA,IAAI,IAAA,CAAK,mBAAmB,CAAC,gBAAA,CAAiB,IAAI,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA,EAAG;AAC5E,QAAA,gBAAA,CAAiB,GAAA,CAAI,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,KAAK,eAAe,CAAA;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAM,YAAY,SAAA,CAAU,IAAA,GAAO,CAAA,GAAI,KAAA,CAAM,OAAO,CAAA,GAAI,MAAA;AACxD,EAAA,MAAM,gBAAgB,aAAA,EAAc;AACpC,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAoB;AAC9C,EAAA,KAAA,MAAW,IAAA,IAAQ,UAAU,IAAA,EAAK,gBAAiB,GAAA,CAAI,IAAA,EAAM,aAAA,CAAc,IAAI,CAAC,CAAA;AAChF,EAAA,MAAM,YAAA,GAAe,CAAC,IAAA,KACpB,SAAA,GAAY,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI,aAAA,CAAc,GAAA,CAAI,IAAI,CAAC,CAAA,CAAA,GAAK,MAAA;AAExE,EAAA,MAAM,mBAAmB,gBAAA,CAAiB,IAAA,GAAO,CAAA,GAAI,KAAA,CAAM,kBAAkB,CAAA,GAAI,MAAA;AACjF,EAAA,MAAM,uBAAuB,aAAA,EAAc;AAC3C,EAAA,MAAM,oBAAA,uBAA2B,GAAA,EAAoB;AACrD,EAAA,KAAA,MAAW,IAAA,IAAQ,gBAAA,CAAiB,IAAA,EAAK,EAAG;AAC1C,IAAA,oBAAA,CAAqB,GAAA,CAAI,IAAA,EAAM,oBAAA,CAAqB,IAAI,CAAC,CAAA;AAAA,EAC3D;AACA,EAAA,MAAM,mBAAA,GAAsB,CAAC,IAAA,KAC3B,gBAAA,GACI,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI,gBAAgB,CAAA,CAAA,EAAI,oBAAA,CAAqB,GAAA,CAAI,IAAI,CAAC,CAAA,CAAA,GACnE,MAAA;AAEN,EAAA,MAAM,KAAA,GAAQ,QAAQ,gBAAA,KAAqB,IAAA;AAC3C,EAAA,MAAM,WAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,CAAC,KAAK,IAAI,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AACpD,IAAA,MAAM,UAAA,GAAa,CAAC,cAAc,CAAA;AAClC,IAAA,IAAI,kBAAkB,GAAA,CAAI,GAAG,CAAA,EAAG,UAAA,CAAW,KAAK,qBAAqB,CAAA;AACrE,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,UAAA,CAAW,IAAA,CAAK,QAAQ,CAAA;AAC3C,IAAA,IAAI,KAAA,EAAO,UAAA,CAAW,IAAA,CAAK,cAAc,CAAA;AACzC,IAAA,MAAM,gBAAgB,iBAAA,CAAkB,GAAA,CAAI,GAAG,CAAA,GAAI,QAAQ,qBAAA,GAAwB,MAAA;AACnF,IAAA,IAAI,aAAA,KAAkB,MAAA,EAAW,UAAA,CAAW,IAAA,CAAK,sBAAsB,CAAA;AACvE,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,aAAA,CAAc;AAAA,QACZ,IAAA,EAAM,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAAA,QACvB,KAAA,EAAO,WAAA,CAAY,GAAA,CAAI,GAAG,KAAK,SAAA,EAAU;AAAA,QACzC,UAAA;AAAA,QACA,MAAA,EAAQ,YAAA,CAAa,GAAA,CAAI,GAAG,KAAK,EAAC;AAAA,QAClC,YAAA;AAAA,QACA,mBAAA;AAAA,QACA,IAAA;AAAA,QACA,GAAI,KAAK,QAAA,GAAW,EAAE,UAAU,IAAA,CAAK,QAAA,KAAa,EAAC;AAAA,QACnD,GAAI,aAAA,KAAkB,MAAA,GAAY,EAAE,aAAA,KAAkB;AAAC,OACxD;AAAA,KACH;AAAA,EACF;AACA,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AACtC,EAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,EAAG;AACtD,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA,IAAM,KAAA,CAAM,MAAA,KAAW,EAAA,IAAM,CAAC,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA,EAAI;AAClF,MAAA,IAAA,CAAK,CAAA,OAAA,EAAU,GAAG,CAAA,qCAAA,CAAuC,CAAA;AACzD,MAAA;AAAA,IACF;AACA,IAAA,aAAA,CAAc,IAAI,GAAG,CAAA;AACrB,IAAA,QAAA,CAAS,IAAA,CAAK,cAAA,CAAe,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAI,GAAA,EAAK,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,EACvF;AACA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,QAAA,CAAS,KAAK,cAAA,CAAe,SAAA,EAAW,SAAA,EAAW,aAAA,EAAe,YAAY,CAAC,CAAA;AAAA,EACjF;AACA,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,yBAAA,CAA0B,gBAAA,EAAkB,gBAAA,EAAkB,oBAAoB;AAAA,KACpF;AAAA,EACF;AAEA,EAAA,MAAM,iBAA2B,EAAC;AAClC,EAAA,MAAM,iBAAiC,EAAC;AACxC,EAAA,IAAI,iBAAA,CAAkB,SAAS,CAAA,EAAG;AAChC,IAAA,cAAA,CAAe,KAAK,qBAAqB,CAAA;AACzC,IAAA,IAAI,OAAA,CAAQ,0BAA0B,MAAA,EAAW;AAC/C,MAAA,cAAA,CAAe,KAAK,sBAAsB,CAAA;AAC1C,MAAA,cAAA,CAAe,IAAA;AAAA,QACb,IAAA,CAAK,yCAAA,EAA2C,MAAA,EAAQ,OAAA,CAAQ,qBAAqB;AAAA,OACvF;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,cAAA,CAAe,KAAK,eAAe,CAAA;AACnC,IAAA,MAAM,eAAe,CAAC,GAAG,KAAK,KAAA,EAAO,GAAG,KAAK,aAAa,CAAA;AAC1D,IAAA,MAAM,gBAA0B,EAAC;AACjC,IAAA,MAAM,SAAA,GAAY,CAAC,GAAA,KAAmC;AACpD,MAAA,IAAI,GAAA,IAAO,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,IAAK,CAAC,aAAA,CAAc,QAAA,CAAS,GAAG,CAAA,EAAG,aAAA,CAAc,IAAA,CAAK,GAAG,CAAA;AAAA,IAC3F,CAAA;AACA,IAAA,SAAA,CAAU,KAAK,SAAS,CAAA;AACxB,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,KAAA,EAAO,SAAA,CAAU,KAAK,KAAA,CAAM,OAAO,GAAG,aAAa,CAAA;AAC9E,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,UAAA,EAAY,SAAA,CAAU,QAAQ,CAAA;AAC1D,IAAA,KAAA,MAAW,YAAY,MAAA,CAAO,IAAA,CAAK,KAAK,MAAM,CAAA,YAAa,QAAQ,CAAA;AAEnE,IAAA,cAAA,CAAe,KAAK,GAAA,CAAI,0BAAA,EAA4B,aAAa,GAAA,CAAI,QAAQ,CAAC,CAAC,CAAA;AAC/E,IAAA,cAAA,CAAe,IAAA;AAAA,MACb,GAAA;AAAA,QACE,2BAAA;AAAA,QACA,aAAA,CAAc,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI,UAAA,CAAW,GAAA,CAAI,GAAG,CAAC,CAAA,CAAE;AAAA;AACnE,KACF;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAiB;AAAA,IACrB,SAAA,EAAW,KAAA;AAAA,IACX,QAAA,EAAU,OAAA;AAAA,IACV,IAAA,EAAM,SAAA;AAAA,IACN,QAAA,EAAU,eAAe,MAAA,GAAS,CAAA,GAAI,EAAE,UAAA,EAAY,cAAA,KAAmB,EAAC;AAAA,IACxE,UAAA,EAAY,cAAA;AAAA,IACZ,QAAA;AAAA,IACA,IAAA,EAAM;AAAA,GACR;AAEA,EAAA,MAAM,QAAA,GAAwB;AAAA,IAC5B,WAAA,EAAa,SAAA;AAAA,IACb,eAAe,IAAA,CAAK,aAAA;AAAA,IACpB,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,GAAI,KAAK,kBAAA,KAAuB,MAAA,GAC5B,EAAE,kBAAA,EAAoB,IAAA,CAAK,kBAAA,EAAmB,GAC9C,EAAC;AAAA,IACL,GAAI,KAAK,aAAA,KAAkB,MAAA,GAAY,EAAE,aAAA,EAAe,IAAA,CAAK,aAAA,EAAc,GAAI,EAAC;AAAA,IAChF,GAAI,KAAK,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,EAAa,IAAA,CAAK,WAAA,EAAY,GAAI;AAAC,GAC5E;AAEA,EAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,UAAU,KAAA,EAAO,CAAC,IAAI,CAAA,EAAE;AACnD;AAmBA,SAAS,cAAc,IAAA,EAA8B;AACnD,EAAA,MAAM,YAAY,aAAA,EAAc;AAChC,EAAA,MAAM,UAAA,GAA6B,cAAA,CAAe,IAAA,CAAK,KAAK,CAAA;AAC5D,EAAA,IAAI,IAAA,CAAK,QAAA,EAAU,UAAA,CAAW,IAAA,CAAK,GAAG,SAAA,CAAU,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AACpF,EAAA,IAAI,IAAA,CAAK,kBAAkB,MAAA,EAAW;AACpC,IAAA,UAAA,CAAW,KAAK,IAAA,CAAK,yCAAA,EAA2C,MAAA,EAAQ,IAAA,CAAK,aAAa,CAAC,CAAA;AAAA,EAC7F;AACA,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,KAAA;AAAA,IACX,QAAA,EAAU,OAAA;AAAA,IACV,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,QAAA,EAAU,EAAE,UAAA,EAAY,IAAA,CAAK,UAAA,EAAW;AAAA,IACxC,UAAA;AAAA,IACA,QAAA,EAAU,KAAK,MAAA,CAAO,GAAA;AAAA,MAAI,CAAC,IAAA,KACzB,aAAA,CAAc,IAAA,EAAM,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,YAAA,EAAc,IAAA,CAAK,mBAAmB;AAAA,KACvF;AAAA,IACA,IAAA,EAAM;AAAA,GACR;AACF;AASA,SAAS,SAAA,CACP,QAAA,EACA,QAAA,EACA,IAAA,EACgB;AAChB,EAAA,MAAM,MAAsB,EAAC;AAC7B,EAAA,IAAI,QAAA,CAAS,IAAA,KAAS,MAAA,EAAW,GAAA,CAAI,IAAA,CAAK,KAAK,cAAA,EAAgB,OAAA,EAAS,QAAA,CAAS,IAAI,CAAC,CAAA;AACtF,EAAA,IAAI,QAAA,CAAS,OAAA,KAAY,MAAA,EAAW,GAAA,CAAI,IAAA,CAAK,KAAK,iBAAA,EAAmB,OAAA,EAAS,QAAA,CAAS,OAAO,CAAC,CAAA;AAC/F,EAAA,IAAI,SAAS,YAAA,EAAc;AACzB,IAAA,GAAA,CAAI,KAAK,IAAA,CAAK,sBAAA,EAAwB,SAAA,EAAW,QAAA,CAAS,YAAY,CAAC,CAAA;AAAA,EACzE;AACA,EAAA,IAAI,SAAS,eAAA,EAAiB;AAC5B,IAAA,GAAA,CAAI,KAAK,IAAA,CAAK,yBAAA,EAA2B,QAAA,EAAU,QAAA,CAAS,eAAe,CAAC,CAAA;AAC5E,IAAA,GAAA,CAAI,IAAA,CAAK,KAAK,uBAAA,EAAyB,OAAA,EAAS,SAAS,aAAA,IAAiB,IAAA,CAAK,QAAA,EAAU,CAAC,CAAA;AAAA,EAC5F,CAAA,MAAA,IAAW,SAAS,aAAA,EAAe;AACjC,IAAA,IAAA,CAAK,CAAA,MAAA,EAAS,QAAQ,CAAA,gEAAA,CAAkE,CAAA;AAAA,EAC1F;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,aAAA,CACP,IAAA,EACA,IAAA,EACA,YAAA,EACA,mBAAA,EACU;AACV,EAAA,MAAM,aAA6B,EAAC;AACpC,EAAA,IAAI,IAAA,CAAK,WAAW,UAAA,CAAW,IAAA,CAAK,GAAG,cAAA,CAAe,IAAA,CAAK,SAAS,CAAC,CAAA;AACrE,EAAA,UAAA,CAAW,IAAA;AAAA,IACT,SAAA,CAAU,kBAAA,EAAoB,KAAA,EAAO,IAAA,CAAK,gBAAgB,CAAA;AAAA,IAC1D,SAAA,CAAU,mBAAA,EAAqB,KAAA,EAAO,IAAA,CAAK,iBAAiB,CAAA;AAAA,IAC5D,SAAA,CAAU,QAAA,EAAU,SAAA,EAAW,IAAA,CAAK,MAAM;AAAA,GAC5C;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,UAAA,CAAW,IAAA,CAAK,UAAU,SAAA,EAAW,UAAA,EAAY,IAAA,CAAK,OAAO,CAAC,CAAA;AAChF,EAAA,IAAI,KAAK,EAAA,EAAI;AACX,IAAA,UAAA,CAAW,IAAA,CAAK,SAAA,CAAU,aAAA,EAAe,YAAA,EAAc,IAAA,CAAK,IAAI,EAAE,aAAA,EAAe,QAAA,EAAU,CAAC,CAAA;AAAA,EAC9F;AACA,EAAA,IAAI,KAAK,YAAA,EAAc;AACrB,IAAA,UAAA,CAAW,IAAA,CAAK,UAAU,uBAAA,EAAyB,SAAA,EAAW,CAAC,IAAA,CAAK,YAAY,CAAC,CAAC,CAAA;AAAA,EACpF;AACA,EAAA,IAAI,IAAA,CAAK,aAAa,UAAA,CAAW,IAAA,CAAK,KAAK,aAAA,EAAe,MAAA,EAAQ,IAAI,CAAC,CAAA;AACvE,EAAA,UAAA,CAAW,IAAA,CAAK,YAAA,CAAa,mBAAA,EAAqB,MAAM,CAAC,CAAA;AAEzD,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,IAAI,IAAA,CAAK,SAAS,WAAA,EAAa;AAC7B,IAAA,UAAA,CAAW,KAAK,aAAa,CAAA;AAG7B,IAAA,UAAA,CAAW,IAAA,CAAK,YAAA,CAAa,SAAA,EAAW,OAAO,CAAC,CAAA;AAChD,IAAA,IAAI,KAAK,sBAAA,EAAwB;AAC/B,MAAA,UAAA,CAAW,KAAK,kBAAkB,CAAA;AAClC,MAAA,UAAA,CAAW,IAAA,CAAK,YAAA,CAAa,uBAAA,EAAyB,IAAA,CAAK,sBAAsB,CAAC,CAAA;AAAA,IACpF;AAAA,EACF;AACA,EAAA,MAAM,UAAU,IAAA,CAAK,QAAA,GAAW,aAAa,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,GAAI,MAAA;AACnE,EAAA,IAAI,OAAA,aAAoB,IAAA,CAAK,GAAA,CAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAA;AAC/D,EAAA,MAAM,cAAA,GACJ,IAAA,CAAK,IAAA,KAAS,WAAA,IAAe,IAAA,CAAK,kBAC9B,mBAAA,CAAoB,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA,GAC7C,MAAA;AACN,EAAA,IAAI,cAAA,aAA2B,IAAA,CAAK,GAAA,CAAI,4BAA4B,CAAC,cAAc,CAAC,CAAC,CAAA;AACrF,EAAA,IAAI,OAAA,IAAW,cAAA,EAAgB,UAAA,CAAW,IAAA,CAAK,oBAAoB,CAAA;AAEnE,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,KAAA;AAAA,IACX,QAAA,EAAU,MAAA;AAAA,IACV,IAAA;AAAA,IACA,UAAU,UAAA,CAAW,MAAA,GAAS,IAAI,EAAE,UAAA,KAAe,EAAC;AAAA,IACpD,UAAA;AAAA,IACA,UAAU,EAAC;AAAA,IACX,IAAA,EAAM;AAAA,GACR;AACF;AAOA,SAAS,yBAAA,CACP,SAAA,EACA,SAAA,EACA,KAAA,EACU;AACV,EAAA,MAAM,WAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,QAAQ,CAAA,IAAK,SAAA,EAAW;AACvC,IAAA,QAAA,CAAS,KAAK,wBAAA,CAAyB,KAAA,CAAM,IAAI,GAAG,CAAA,EAAI,QAAQ,CAAC,CAAA;AAAA,EACnE;AACA,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,KAAA;AAAA,IACX,QAAA,EAAU,OAAA;AAAA,IACV,IAAA,EAAM,SAAA;AAAA,IACN,UAAU,EAAC;AAAA,IACX,YAAY,EAAC;AAAA,IACb,QAAA;AAAA,IACA,IAAA,EAAM;AAAA,GACR;AACF;AAEA,SAAS,wBAAA,CAAyB,MAAc,QAAA,EAA2C;AACzF,EAAA,MAAM,aAA6B,EAAC;AACpC,EAAA,IAAI,QAAA,CAAS,mBAAmB,MAAA,EAAW;AACzC,IAAA,UAAA,CAAW,KAAK,IAAA,CAAK,wBAAA,EAA0B,OAAA,EAAS,QAAA,CAAS,cAAc,CAAC,CAAA;AAAA,EAClF;AACA,EAAA,IAAI,QAAA,CAAS,oBAAoB,MAAA,EAAW;AAC1C,IAAA,UAAA,CAAW,KAAK,IAAA,CAAK,yBAAA,EAA2B,OAAA,EAAS,QAAA,CAAS,eAAe,CAAC,CAAA;AAAA,EACpF;AACA,EAAA,IAAI,QAAA,CAAS,gBAAgB,MAAA,EAAW;AACtC,IAAA,UAAA,CAAW,KAAK,IAAA,CAAK,qBAAA,EAAuB,OAAA,EAAS,QAAA,CAAS,WAAW,CAAC,CAAA;AAAA,EAC5E;AACA,EAAA,IAAI,QAAA,CAAS,YAAY,MAAA,EAAW;AAClC,IAAA,UAAA,CAAW,KAAK,IAAA,CAAK,iBAAA,EAAmB,OAAA,EAAS,QAAA,CAAS,OAAO,CAAC,CAAA;AAAA,EACpE;AACA,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,KAAA;AAAA,IACX,QAAA,EAAU,UAAA;AAAA,IACV,IAAA;AAAA,IACA,QAAA,EAAU,EAAE,UAAA,EAAY,CAAC,oBAAoB,CAAA,EAAE;AAAA,IAC/C,UAAA;AAAA,IACA,UAAU,EAAC;AAAA,IACX,IAAA,EAAM;AAAA,GACR;AACF;AAOA,SAAS,cAAA,CACP,SAAA,EACA,SAAA,EACA,aAAA,EACA,YAAA,EACU;AACV,EAAA,MAAM,WAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,QAAQ,CAAA,IAAK,SAAA,EAAW;AACvC,IAAA,QAAA,CAAS,IAAA,CAAK,iBAAA,CAAkB,aAAA,CAAc,GAAA,CAAI,GAAG,GAAI,QAAA,EAAU,YAAA,CAAa,GAAG,CAAE,CAAC,CAAA;AAAA,EACxF;AACA,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,KAAA;AAAA,IACX,QAAA,EAAU,OAAA;AAAA,IACV,IAAA,EAAM,SAAA;AAAA,IACN,UAAU,EAAC;AAAA,IACX,YAAY,EAAC;AAAA,IACb,QAAA;AAAA,IACA,IAAA,EAAM;AAAA,GACR;AACF;AAGA,IAAM,cAAA,GAGF;AAAA,EACF,KAAA,EAAO;AAAA,IACL,KAAA,EAAO,qBAAA;AAAA,IACP,SAAA,EAAW,SAAA;AAAA,IACX,MAAA,EAAQ,aAAA;AAAA,IACR,UAAA,EAAY,QAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AAAA,EACA,QAAA,EAAU;AAAA,IACR,KAAA,EAAO,sBAAA;AAAA,IACP,SAAA,EAAW,SAAA;AAAA,IACX,MAAA,EAAQ,aAAA;AAAA,IACR,UAAA,EAAY,QAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,eAAA;AAAA,IACP,SAAA,EAAW,UAAA;AAAA,IACX,MAAA,EAAQ,aAAA;AAAA,IACR,UAAA,EAAY,QAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,gBAAA;AAAA,IACP,SAAA,EAAW,OAAA;AAAA,IACX,MAAA,EAAQ,WAAA;AAAA,IACR,UAAA,EAAY,OAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AAAA,EACA,SAAA,EAAW;AAAA,IACT,KAAA,EAAO,kBAAA;AAAA,IACP,SAAA,EAAW,OAAA;AAAA,IACX,MAAA,EAAQ,WAAA;AAAA,IACR,UAAA,EAAY,OAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AAAA,EACA,SAAA,EAAW;AAAA,IACT,KAAA,EAAO,iBAAA;AAAA,IACP,SAAA,EAAW,OAAA;AAAA,IACX,MAAA,EAAQ,WAAA;AAAA,IACR,UAAA,EAAY,OAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AAAA,EACA,SAAA,EAAW;AAAA,IACT,KAAA,EAAO,kBAAA;AAAA,IACP,SAAA,EAAW,OAAA;AAAA,IACX,MAAA,EAAQ,WAAA;AAAA,IACR,UAAA,EAAY,OAAA;AAAA,IACZ,UAAA,EAAY;AAAA;AAEhB,CAAA;AAEA,SAAS,iBAAA,CAAkB,IAAA,EAAc,QAAA,EAA0B,QAAA,EAA4B;AAC7F,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,QAAA,IAAY,EAAC;AACvC,EAAA,MAAM,WAAA,GAA8B,CAAC,YAAA,CAAa,SAAA,EAAW,mBAAmB,CAAC,CAAA;AAIjF,EAAA,MAAM,KAAA,GAAQ,CAAC,OAAA,EAAyB,KAAA,KAAqB;AAC3D,IAAA,MAAM,MAAA,GAAS,eAAe,OAAO,CAAA;AACrC,IAAA,MAAM,WAAA,GAAc,SAAS,OAAO,CAAA;AACpC,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,WAAA,KAAgB,MAAA,EAAW;AACtD,IAAA,MAAM,OAAO,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,WAAW,KAAK,CAAA;AACvD,IAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,MAAA,IAAA,CAAK,WAAA,GAAc,CAAC,CAAA,EAAG,QAAQ,IAAI,OAAO,CAAA,QAAA,EAAW,MAAA,CAAO,MAAM,CAAA,CAAE,CAAA;AAAA,IACtE;AACA,IAAA,WAAA,CAAY,KAAK,IAAI,CAAA;AAAA,EACvB,CAAA;AACA,EAAA,KAAA,CAAM,OAAA,EAAS,SAAS,YAAY,CAAA;AACpC,EAAA,KAAA,CAAM,WAAA,EAAa,SAAS,QAAQ,CAAA;AACpC,EAAA,KAAA,CAAM,WAAA,EAAa,SAAS,SAAS,CAAA;AACrC,EAAA,KAAA,CAAM,SAAA,EAAW,SAAS,OAAO,CAAA;AACjC,EAAA,KAAA,CAAM,UAAA,EAAY,SAAS,aAAa,CAAA;AACxC,EAAA,KAAA,CAAM,QAAQ,CAAA;AACd,EAAA,KAAA,CAAM,WAAW,CAAA;AACjB,EAAA,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,iBAAA,EAAmB,OAAA,EAAS,MAAS,CAAC,CAAA;AAE5D,EAAA,MAAM,QAAA,GAAuB,CAAC,UAAA,CAAW,gBAAA,EAAkB,WAAW,CAAC,CAAA;AACvE,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA;AAC9C,EAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,WAAW,UAAA,EAAY;AAAA,QACrB,YAAA,CAAa,WAAW,yBAAyB,CAAA;AAAA,QACjD,IAAA,CAAK,gBAAA,EAAkB,QAAA,EAAU,IAAI,CAAA;AAAA,QACrC,IAAA,CAAK,gBAAA,EAAkB,QAAA,EAAU,MAAS;AAAA,OAC3C;AAAA,KACH;AACA,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,IAAI,CAAA,IAAK,cAAA,EAAgB;AAC5C,MAAA,QAAA,CAAS,IAAA,CAAK,kBAAA,CAAmB,OAAA,EAAS,IAAA,EAAM,QAAQ,CAAC,CAAA;AAAA,IAC3D;AAAA,EACF;AAEA,EAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,iBAAA,EAAmB,OAAA,EAAS,MAAS,CAAA;AACjE,EAAA,cAAA,CAAe,WAAA,GAAc,CAAC,CAAA,EAAG,QAAQ,CAAA,+BAAA,CAAiC,CAAA;AAE1E,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,KAAA;AAAA,IACX,QAAA,EAAU,UAAA;AAAA,IACV,IAAA;AAAA,IACA,UAAU,EAAC;AAAA,IACX,UAAA,EAAY,CAAC,cAAc,CAAA;AAAA,IAC3B,QAAA;AAAA,IACA,IAAA,EAAM;AAAA,GACR;AACF;AAGA,SAAS,kBAAA,CAAmB,OAAA,EAAyB,IAAA,EAAc,QAAA,EAA4B;AAC7F,EAAA,MAAM,MAAA,GAAS,eAAe,OAAO,CAAA;AACrC,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,WAAA,EAAa,QAAA,EAAU,MAAS,CAAA;AAChD,EAAA,EAAA,CAAG,WAAA,GAAc,CAAC,CAAA,EAAG,QAAQ,CAAA,wBAAA,CAA0B,CAAA;AACvD,EAAA,OAAO,UAAA,CAAW,CAAA,EAAG,OAAO,CAAA,OAAA,CAAA,EAAW;AAAA,IACrC,YAAA,CAAa,WAAW,cAAc,CAAA;AAAA,IACtC,KAAK,aAAA,EAAe,OAAA,EAAS,IAAI,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,IAChD,YAAA,CAAa,yBAAA,EAA2B,MAAA,CAAO,UAAU,CAAA;AAAA,IACzD,EAAA;AAAA,IACA,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,MAAA,CAAO,YAAY,MAAS;AAAA,GACjD,CAAA;AACH;AAEA,SAAS,UAAA,CAAW,MAAc,UAAA,EAAsC;AACtE,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,KAAA;AAAA,IACX,QAAA,EAAU,QAAA;AAAA,IACV,IAAA;AAAA,IACA,UAAU,EAAC;AAAA,IACX,UAAA;AAAA,IACA,UAAU,EAAC;AAAA,IACX,IAAA,EAAM;AAAA,GACR;AACF;AAGA,SAAS,eAAe,CAAA,EAAyB;AAC/C,EAAA,OAAO;AAAA,IACL,IAAA,CAAK,mBAAA,EAAqB,UAAA,EAAY,WAAA,CAAY,CAAC,CAAC,CAAA;AAAA,IACpD,UAAU,cAAA,EAAgB,OAAA,EAAS,CAAC,mBAAmB,CAAA,EAAG,QAAW,SAAS;AAAA,GAChF;AACF;AAMA,SAAS,eACP,IAAA,EACA,GAAA,EACA,KAAA,EACA,QAAA,EACA,OACA,IAAA,EACU;AACV,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,KAAA,CAAM,IAAI,CAAA;AACpC,EAAA,MAAM,UAAU,IAAA,KAAS,SAAA;AACzB,EAAA,MAAM,aAA6B,EAAC;AACpC,EAAA,MAAM,aAAuB,EAAC;AAE9B,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,EAAA,EAAI,UAAA,CAAW,IAAA,CAAK,GAAA,CAAI,eAAA,EAAiB,CAAC,QAAA,CAAS,KAAA,CAAM,MAAM,CAAC,CAAC,CAAC,CAAA;AACvF,EAAA,UAAA,CAAW,IAAA,CAAK,IAAI,eAAA,EAAiB,CAAC,SAAS,KAAA,CAAM,KAAK,CAAC,CAAC,CAAC,CAAA;AAC7D,EAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS,UAAA,CAAW,KAAK,YAAA,CAAa,cAAA,EAAgB,KAAA,CAAM,IAAI,CAAC,CAAA;AACpF,EAAA,IAAI,KAAA,CAAM,UAAU,MAAA,EAAW;AAC7B,IAAA,UAAA,CAAW,IAAA,CAAK,KAAK,oBAAA,EAAsB,OAAA,EAAS,iBAAiB,OAAA,EAAS,KAAA,CAAM,KAAK,CAAC,CAAC,CAAA;AAAA,EAC7F;AACA,EAAA,IAAI,KAAA,CAAM,UAAU,MAAA,EAAW;AAC7B,IAAA,UAAA,CAAW,IAAA,CAAK,KAAK,oBAAA,EAAsB,OAAA,EAAS,iBAAiB,OAAA,EAAS,KAAA,CAAM,KAAK,CAAC,CAAC,CAAA;AAAA,EAC7F;AAEA,EAAA,KAAA,MAAW,KAAA,IAAS,CAAC,CAAA,EAAG,CAAC,CAAA,EAAY;AACnC,IAAA,MAAM,KAAA,GAAQ,KAAA,KAAU,CAAA,GAAI,KAAA,CAAM,cAAc,KAAA,CAAM,WAAA;AACtD,IAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAa,KAAA,EAAM,GAAI,eAAe,KAAK,CAAA;AAC7D,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,IAAA,CAAK,CAAA,OAAA,EAAU,GAAG,CAAA,aAAA,EAAgB,KAAK,CAAA,wCAAA,CAA0C,CAAA;AAAA,IACnF;AACA,IAAA,UAAA,CAAW,KAAK,IAAA,CAAK,CAAA,gBAAA,EAAmB,KAAK,CAAA,CAAA,EAAI,SAAA,EAAW,QAAQ,CAAC,CAAA;AACrE,IAAA,UAAA,CAAW,KAAK,IAAA,CAAK,CAAA,gBAAA,EAAmB,KAAK,CAAA,CAAA,EAAI,OAAA,EAAS,WAAW,CAAC,CAAA;AAAA,EACxE;AAGA,EAAA,IAAI,KAAA,CAAM,YAAA,KAAiB,MAAA,IAAa,KAAA,CAAM,YAAA,EAAc;AAC1D,IAAA,MAAM,KAAA,GAAQ,IAAA;AAAA,MACZ,SAAS,IAAI,CAAA,iBAAA,CAAA;AAAA,MACb,OAAA;AAAA,MACA,MAAM,YAAA,KAAiB,MAAA,GAAY,iBAAiB,OAAA,EAAS,KAAA,CAAM,YAAY,CAAA,GAAI;AAAA,KACrF;AACA,IAAA,IAAI,MAAM,YAAA,EAAc;AACtB,MAAA,KAAA,CAAM,cAAc,IAAI,GAAA;AAAA,QACtB,MAAM,YAAA,CAAa,KAAA,CAAM,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AAAA,UACrC,CAAA;AAAA,UACA,iBAAiB,OAAA,EAAS,KAAA,CAAM,aAAc,MAAA,CAAO,CAAC,KAAK,CAAC;AAAA,SAC7D;AAAA,OACH;AAAA,IACF;AACA,IAAA,UAAA,CAAW,KAAK,KAAK,CAAA;AACrB,IAAA,UAAA,CAAW,IAAA,CAAK,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAE,CAAA;AAAA,EAChD;AAEA,EAAA,IAAI,MAAM,KAAA,EAAO;AACf,IAAA,MAAM,IAAI,KAAA,CAAM,KAAA;AAChB,IAAA,IAAI,CAAA,CAAE,mBAAmB,MAAA,EAAW;AAClC,MAAA,UAAA,CAAW,IAAA;AAAA,QACT,IAAA;AAAA,UACE,SAAS,IAAI,CAAA,uBAAA,CAAA;AAAA,UACb,OAAA;AAAA,UACA,gBAAA,CAAiB,OAAA,EAAS,CAAA,CAAE,cAAc;AAAA;AAC5C,OACF;AAAA,IACF;AACA,IAAA,IAAI,CAAA,CAAE,cAAc,MAAA,EAAW;AAC7B,MAAA,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA,MAAA,EAAS,IAAI,sBAAsB,OAAA,EAAS,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,IAC/E;AACA,IAAA,IAAI,CAAA,CAAE,YAAY,MAAA,EAAW;AAC3B,MAAA,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA,MAAA,EAAS,IAAI,oBAAoB,OAAA,EAAS,CAAA,CAAE,OAAO,CAAC,CAAA;AAAA,IAC3E;AACA,IAAA,IAAI,CAAA,CAAE,aAAa,MAAA,EAAW;AAC5B,MAAA,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA,MAAA,EAAS,IAAI,qBAAqB,OAAA,EAAS,CAAA,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC7E;AACA,IAAA,UAAA,CAAW,IAAA,CAAK,CAAA,gBAAA,EAAmB,IAAI,CAAA,CAAE,CAAA;AAAA,EAC3C;AAEA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,UAAA,CAAW,KAAK,eAAe,CAAA;AAC/B,IAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,KAAS,WAAA,GAAc,OAAA,GAAU,KAAA;AACtD,MAAA,UAAA,CAAW,IAAA;AAAA,QACT,SAAA,CAAU,gCAAA,EAAkC,OAAA,EAAS,CAAC,CAAA,EAAG,MAAM,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC;AAAA,OACjF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,KAAA;AAAA,IACX,QAAA,EAAU,oBAAA,CAAqB,KAAA,CAAM,IAAI,CAAA;AAAA,IACzC,IAAA;AAAA,IACA,UAAU,UAAA,CAAW,MAAA,GAAS,IAAI,EAAE,UAAA,KAAe,EAAC;AAAA,IACpD,UAAA;AAAA,IACA,UAAU,EAAC;AAAA,IACX,IAAA,EAAM;AAAA,GACR;AACF;AAOA,SAAS,aAAa,GAAA,EAAqB;AACzC,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAA,CAAQ,gBAAA,EAAkB,GAAG,CAAA;AACjD,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,GAAA;AAC7C,EAAA,OAAO,SAAS,IAAA,CAAK,KAAK,CAAA,GAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,KAAA;AAC9C;AAGA,SAAS,cAAc,IAAA,EAAqE;AAC1F,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,OAAO,CAAC,KAAK,KAAA,KAAU;AACrB,IAAA,IAAI,IAAA,GAAO,aAAa,GAAG,CAAA;AAC3B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG,CAAA,EAAA,EAAK,IAAA,GAAO,CAAA,EAAG,YAAA,CAAa,GAAG,CAAC,IAAI,CAAC,CAAA,CAAA;AACrE,IAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AACb,IAAA,IAAI,IAAA,KAAS,OAAO,KAAA,IAAS,IAAA,OAAW,CAAA,EAAG,KAAK,CAAA,mBAAA,EAAsB,IAAI,CAAA,CAAA,CAAG,CAAA;AAC7E,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AACF;AAEA,SAAS,KACP,IAAA,EACA,QAAA,EACA,KAAA,EACA,QAAA,GAAwB,EAAC,EACV;AACf,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAA;AAAA,IACN,IAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA,EAAS,KAAA;AAAA,IACT,WAAA,EAAa,SAAA;AAAA,IACb,MAAA,EAAQ,KAAA;AAAA,IACR,GAAI,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,KAAU,EAAC;AAAA,IACvC,QAAA;AAAA,IACA,IAAA,EAAM;AAAA,GACR;AACF;AAEA,SAAS,SAAA,CACP,MACA,QAAA,EACA,KAAA,EACA,WAAwB,EAAC,EACzB,cAAqC,SAAA,EACtB;AACf,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAA;AAAA,IACN,IAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA,EAAS,IAAA;AAAA,IACT,WAAA;AAAA,IACA,MAAA,EAAQ,KAAA;AAAA,IACR,KAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA,EAAM;AAAA,GACR;AACF;AAEA,SAAS,YAAA,CAAa,MAAc,KAAA,EAA8B;AAChE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAA;AAAA,IACN,IAAA;AAAA,IACA,QAAA,EAAU,OAAA;AAAA,IACV,OAAA,EAAS,KAAA;AAAA,IACT,WAAA,EAAa,SAAA;AAAA,IACb,MAAA,EAAQ,KAAA;AAAA,IACR,KAAA;AAAA,IACA,UAAU,EAAC;AAAA,IACX,IAAA,EAAM;AAAA,GACR;AACF;AAEA,SAAS,GAAA,CAAI,MAAc,OAAA,EAAqC;AAC9D,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,cAAA;AAAA,IACN,IAAA;AAAA,IACA,MAAA,EAAQ,KAAA;AAAA,IACR,MAAA,EAAQ,UAAA;AAAA,IACR,OAAA;AAAA,IACA,UAAU,EAAC;AAAA,IACX,IAAA,EAAM;AAAA,GACR;AACF;;;ACtrBO,SAAS,sBAAsB,KAAA,EAAqC;AACzE,EAAA,OAAO,CAAC,UAAU,IAAA,KAAS;AACzB,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,aAAA,CAAc,IAAA,CAAK,QAAQ,CAAA;AAClD,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AAEvB,IAAA,MAAM,eAAe,IAAI,GAAA,CAAI,IAAA,CAAK,cAAA,IAAkB,EAAE,CAAA;AACtD,IAAA,MAAM,MAAoB,EAAC;AAC3B,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,WAAA,EAAa;AACnC,MAAA,IAAI,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,EAAO,QAAA,EAAU,MAAM,QAAQ,CAAA;AACrD,MAAA,IAAI,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AAAA,IACzB;AACA,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,cAAA,IAAkB,EAAC,EAAG;AAC5C,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,EAAO,QAAA,EAAU,MAAM,WAAW,CAAA;AACxD,MAAA,IAAI,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AAAA,IACzB;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AACF;AAEA,SAAS,QAAA,CACP,KAAA,EACA,QAAA,EACA,QAAA,EACA,IAAA,EACmB;AACnB,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,aAAA,CAAc,QAAQ,CAAA;AACzC,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,QAAQ,EAAE,GAAA,EAAI;AAC/C,EAAA,IAAI,CAAC,WAAA,CAAY,MAAM,KAAK,MAAA,CAAO,MAAA,KAAW,GAAG,OAAO,IAAA;AAExD,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,kBAAkB,EAAE,GAAA,EAAI;AACzD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,mBAAmB,EAAE,GAAA,EAAI;AAC3D,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,SAAS,EAAE,GAAA,EAAI;AACjD,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,YAAA,CAAa,aAAa,EAAE,GAAA,EAAI;AAChD,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,YAAA,CAAa,uBAAuB,EAAE,GAAA,EAAI;AAEpE,EAAA,MAAM,IAAA,GAAmB;AAAA,IACvB,IAAA,EAAM,KAAK,OAAA,EAAQ;AAAA,IACnB,IAAA;AAAA,IACA,MAAA,EAAQ,OAAO,KAAA,EAAM;AAAA,IACrB,kBAAkB,aAAA,CAAc,MAAM,IAAI,MAAA,CAAO,KAAA,KAAU,EAAC;AAAA,IAC5D,mBAAmB,aAAA,CAAc,OAAO,IAAI,OAAA,CAAQ,KAAA,KAAU;AAAC,GACjE;AACA,EAAA,IAAI,WAAA,CAAY,OAAO,CAAA,IAAK,OAAA,CAAQ,MAAA,KAAW,OAAO,MAAA,EAAQ,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,KAAA,EAAM;AAC3F,EAAA,IAAI,WAAA,CAAY,EAAE,CAAA,IAAK,EAAA,CAAG,MAAA,KAAW,OAAO,MAAA,EAAQ,IAAA,CAAK,EAAA,GAAK,EAAA,CAAG,KAAA,EAAM;AACvE,EAAA,IAAI,WAAA,CAAY,YAAY,CAAA,IAAK,YAAA,CAAa,CAAC,CAAA,EAAG,IAAA,CAAK,YAAA,GAAe,YAAA,CAAa,CAAC,CAAA;AACpF,EAAA,IAAI,IAAA,CAAK,aAAa,aAAa,CAAA,CAAE,KAAI,KAAM,IAAA,OAAW,WAAA,GAAc,IAAA;AAExE,EAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,QAAA,EAAU,IAAI,CAAA;AAClD,EAAA,IAAI,CAAC,UAAA,CAAW,SAAS,CAAA,OAAQ,SAAA,GAAY,SAAA;AAE7C,EAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,KAAA,EAAO,IAAI,CAAA;AAC9C,EAAA,IAAI,QAAA,OAAe,QAAA,GAAW,QAAA;AAE9B,EAAA,IAAI,SAAS,WAAA,EAAa;AACxB,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,YAAA,CAAa,uBAAuB,EAAE,GAAA,EAAI;AACrE,IAAA,IAAI,OAAO,aAAA,KAAkB,QAAA,IAAY,cAAA,CAAe,GAAA,CAAI,aAAa,CAAA,EAAG;AAC1E,MAAA,IAAA,CAAK,sBAAA,GAAyB,aAAA;AAAA,IAChC;AACA,IAAA,MAAM,eAAA,GAAkB,wBAAA,CAAyB,KAAA,EAAO,IAAI,CAAA;AAC5D,IAAA,IAAI,eAAA,OAAsB,eAAA,GAAkB,eAAA;AAAA,EAC9C;AACA,EAAA,OAAO,IAAA;AACT;AAEA,IAAM,cAAA,uBAA0C,GAAA,CAAI;AAAA,EAClD,MAAA;AAAA,EACA,YAAA;AAAA,EACA,qBAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGD,SAAS,wBAAA,CAAyB,OAAc,IAAA,EAA+C;AAC7F,EAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,IAAA,EAAM,0BAA0B,CAAA;AAClE,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,aAAA,CAAc,MAAM,CAAA;AAC/C,EAAA,IAAI,CAAC,cAAc,OAAO,MAAA;AAE1B,EAAA,MAAM,GAAA,GAA6B;AAAA,IACjC,IAAA,EAAM,OAAO,KAAA,CAAM,GAAG,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,GAAA,EAAI,IAAK;AAAA,GACnD;AACA,EAAA,MAAM,IAAA,GAAO,CAACA,KAAAA,KAAqC;AACjD,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,YAAA,CAAaA,KAAI,EAAE,GAAA,EAAI;AAC9C,IAAA,OAAO,OAAO,CAAA,KAAM,QAAA,GAAW,CAAA,GAAI,MAAA;AAAA,EACrC,CAAA;AACA,EAAA,MAAM,cAAA,GAAiB,KAAK,wBAAwB,CAAA;AACpD,EAAA,IAAI,cAAA,KAAmB,MAAA,EAAW,GAAA,CAAI,cAAA,GAAiB,cAAA;AACvD,EAAA,MAAM,eAAA,GAAkB,KAAK,yBAAyB,CAAA;AACtD,EAAA,IAAI,eAAA,KAAoB,MAAA,EAAW,GAAA,CAAI,eAAA,GAAkB,eAAA;AACzD,EAAA,MAAM,WAAA,GAAc,KAAK,qBAAqB,CAAA;AAC9C,EAAA,IAAI,WAAA,KAAgB,MAAA,EAAW,GAAA,CAAI,WAAA,GAAc,WAAA;AACjD,EAAA,MAAM,OAAA,GAAU,KAAK,iBAAiB,CAAA;AACtC,EAAA,IAAI,OAAA,KAAY,MAAA,EAAW,GAAA,CAAI,OAAA,GAAU,OAAA;AACzC,EAAA,OAAO,OAAO,IAAA,CAAK,GAAG,CAAA,CAAE,MAAA,GAAS,IAAI,GAAA,GAAM,MAAA;AAC7C;AAGA,SAAS,kBAAA,CAAmB,MAAY,OAAA,EAAqC;AAC3E,EAAA,IAAI,CAAA,GAAiB,IAAA;AACrB,EAAA,OAAO,CAAA,EAAG;AACR,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,eAAA,CAAgB,OAAO,EAAE,UAAA,EAAW;AACtD,IAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,OAAO,QAAQ,CAAC,CAAA;AACxC,IAAA,CAAA,GAAI,EAAE,SAAA,EAAU;AAAA,EAClB;AACA,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,iBAAA,CAAkB,OAAc,IAAA,EAAwC;AAC/E,EAAA,MAAM,KAAA,GAAQ,oBAAA,CAAqB,KAAA,EAAO,IAAI,CAAA;AAC9C,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,MAAM,WAA2B,EAAE,IAAA,EAAM,iBAAA,CAAkB,IAAI,KAAK,UAAA,EAAW;AAC/E,EAAA,IAAI,KAAA,CAAM,KAAA,EAAO,QAAA,CAAS,YAAA,GAAe,KAAA,CAAM,KAAA;AAC/C,EAAA,IAAI,KAAA,CAAM,SAAA,KAAc,MAAA,EAAW,QAAA,CAAS,WAAW,KAAA,CAAM,SAAA;AAC7D,EAAA,IAAI,KAAA,CAAM,SAAA,KAAc,MAAA,EAAW,QAAA,CAAS,YAAY,KAAA,CAAM,SAAA;AAC9D,EAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,EAAW,QAAA,CAAS,UAAU,KAAA,CAAM,OAAA;AAC1D,EAAA,IAAI,KAAA,CAAM,aAAA,EAAe,QAAA,CAAS,aAAA,GAAgB,KAAA,CAAM,aAAA;AAExD,EAAA,MAAM,WAAoD,EAAC;AAC3D,EAAA,IAAI,KAAA,CAAM,YAAA,EAAc,QAAA,CAAS,KAAA,GAAQ,MAAM,YAAA,CAAa,IAAA;AAC5D,EAAA,IAAI,KAAA,CAAM,cAAA,EAAgB,QAAA,CAAS,OAAA,GAAU,MAAM,cAAA,CAAe,IAAA;AAClE,EAAA,IAAI,KAAA,CAAM,aAAA,EAAe,QAAA,CAAS,MAAA,GAAS,MAAM,aAAA,CAAc,IAAA;AAC/D,EAAA,IAAI,KAAA,CAAM,gBAAA,EAAkB,QAAA,CAAS,SAAA,GAAY,MAAM,gBAAA,CAAiB,IAAA;AACxE,EAAA,IAAI,KAAA,CAAM,gBAAA,EAAkB,QAAA,CAAS,SAAA,GAAY,MAAM,gBAAA,CAAiB,IAAA;AACxE,EAAA,IAAI,KAAA,CAAM,gBAAA,EAAkB,QAAA,CAAS,SAAA,GAAY,MAAM,gBAAA,CAAiB,IAAA;AACxE,EAAA,IAAI,KAAA,CAAM,eAAA,EAAiB,QAAA,CAAS,QAAA,GAAW,MAAM,eAAA,CAAgB,IAAA;AACrE,EAAA,IAAI,OAAO,IAAA,CAAK,QAAQ,EAAE,MAAA,GAAS,CAAA,WAAY,QAAA,GAAW,QAAA;AAE1D,EAAA,OAAO,OAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAA,GAAS,IAAI,QAAA,GAAW,MAAA;AACvD;AAGA,SAAS,kBAAkB,IAAA,EAAgC;AACzD,EAAA,IAAI,CAAA,GAAiB,IAAA;AACrB,EAAA,OAAO,CAAA,EAAG;AACR,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,eAAA,CAAgB,kBAAkB,EAAE,UAAA,EAAW;AACjE,IAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,OAAO,OAAA,CAAQ,CAAC,CAAA,CAAG,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,EAAE,GAAA,EAAI;AAC1E,IAAA,CAAA,GAAI,EAAE,SAAA,EAAU;AAAA,EAClB;AACA,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,iBAAA,CAAkB,UAAgB,QAAA,EAAsB;AAC/D,EAAA,MAAM,QAAgB,EAAC;AACvB,EAAA,IAAI,CAAA,GAAiB,QAAA;AACrB,EAAA,MAAM,IAAA,GAAO,SAAS,OAAA,EAAQ;AAC9B,EAAA,OAAO,CAAA,IAAK,CAAA,CAAE,OAAA,EAAQ,KAAM,IAAA,EAAM;AAChC,IAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACZ,IAAA,CAAA,GAAI,EAAE,SAAA,EAAU;AAAA,EAClB;AACA,EAAA,KAAA,CAAM,OAAA,EAAQ;AAEd,EAAA,IAAI,IAAI,SAAA,EAAU;AAClB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,qBAAA,CAAsB,IAAI,EAAE,MAAM,CAAA;AAAA,EACpD;AACA,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,WAAW,CAAA,EAAkB;AACpC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,IAAA,IAAI,CAAA,CAAE,CAAC,CAAA,MAAO,CAAA,GAAI,MAAM,CAAA,GAAI,CAAA,GAAI,IAAI,OAAO,KAAA;AAAA,EAC7C;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,cAAc,CAAA,EAA2B;AAChD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAE,MAAM,CAAC,CAAA,KAAM,OAAO,CAAA,KAAM,QAAQ,CAAA;AACjE;AAEA,SAAS,YAAY,CAAA,EAAyB;AAC5C,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,EAAE,KAAA,CAAM,CAAC,CAAA,KAAM,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAE,WAAW,CAAC,CAAA;AAC9E;AAEA,SAAS,YAAY,CAAA,EAAyB;AAC5C,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,EAAE,KAAA,CAAM,CAAC,CAAA,KAAM,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAE,WAAW,CAAC,CAAA;AAC9E;ACzQA,IAAM,SAAA,GAAY,qBAAA;AAElB,IAAM,YAAA,GAAe,KAAA;AAErB,IAAM,iBAAA,GAAoB,EAAA;AAE1B,IAAM,iBAAA,GAAoB,CAAA;AAQnB,SAAS,UAAU,OAAA,EAA0D;AAClF,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AACjC,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,CAAC,MAAM,SAAA,CAAU,IAAA,CAAK,CAAC,CAAC,CAAA;AAChD,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,MAAM,qEAAqE,CAAA;AAAA,EACvF;AACA,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,EAAM,GAAG,KAAA,CAAM,OAAO,CAAC,CAAA,KAAM,CAAA,KAAM,IAAI,CAAC,CAAA;AAEzD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,IAAA,MAAM,GAAA,GAAM,QAAQ,IAAI,CAAA;AACxB,IAAA,MAAM,OAAO,OAAO,GAAA,KAAQ,QAAA,GAAW,OAAA,CAAQ,GAAG,CAAA,GAAI,GAAA;AACtD,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAI,CAAA,CAAE,MAAA;AAGjC,IAAA,MAAM,SAAA,GAAY,SAAS,iBAAA,GAAoB,UAAA;AAC/C,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,CAAA,EAAG;AAC1B,MAAA,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AACd,MAAA,MAAA,GAAS,YAAY,IAAA,CAAK,MAAA;AAAA,IAC5B,CAAA,MAAO;AAGL,MAAA,MAAM,SAAA,GAAa,EAAA,IAAO,SAAA,GAAY,iBAAA,GAAqB,EAAA,CAAA,GAAO,EAAA;AAClE,MAAA,KAAA,CAAM,IAAI,CAAA,GAAI,CAAC,IAAA,EAAM,EAAE,KAAA,EAAO,EAAE,CAAC,YAAY,GAAG,IAAI,UAAA,CAAW,SAAS,CAAA,IAAK,CAAA;AAC7E,MAAA,MAAA,GAAS,SAAA,GAAY,iBAAA,GAAoB,SAAA,GAAY,IAAA,CAAK,MAAA;AAAA,IAC5D;AAAA,EACF;AAEA,EAAA,OAAO,OAAA,CAAQ,KAAA,EAAO,EAAE,KAAA,EAAO,GAAG,CAAA;AACpC;;;ACxBO,SAAS,wBAAA,CACd,IAAA,EACA,OAAA,GAAgC,EAAC,EACd;AACnB,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,MAAM,GAAA,GAAM,CAAC,QAAA,EAA8B,IAAA,EAAc,SAAiB,OAAA,KACxE,MAAA,CAAO,KAAK,EAAE,QAAA,EAAU,MAAM,OAAA,EAAS,GAAI,YAAY,MAAA,GAAY,EAAE,SAAQ,GAAI,IAAK,CAAA;AAExF,EAAA,IAAI,OAAO,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,CAAE,WAAW,CAAA,EAAG;AACxC,IAAA,GAAA,CAAI,OAAA,EAAS,YAAY,oBAAoB,CAAA;AAAA,EAC/C;AAEA,EAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,EAAG;AACtD,IAAA,IAAI,KAAA,CAAM,WAAW,EAAA,IAAM,CAAC,KAAK,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA,EAAG;AACpD,MAAA,GAAA;AAAA,QACE,OAAA;AAAA,QACA,cAAA;AAAA,QACA,CAAA,OAAA,EAAU,GAAG,CAAA,6BAAA,EAAgC,KAAA,CAAM,MAAM,CAAA,CAAA,CAAA;AAAA,QACzD;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA,EAAG;AAC5B,MAAA,GAAA,CAAI,OAAA,EAAS,gBAAgB,CAAA,OAAA,EAAU,GAAG,+BAA+B,KAAA,CAAM,KAAK,KAAK,GAAG,CAAA;AAAA,IAC9F;AACA,IAAA,IAAI,KAAA,CAAM,UAAU,MAAA,IAAa,KAAA,CAAM,UAAU,MAAA,IAAa,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO;AACvF,MAAA,GAAA;AAAA,QACE,OAAA;AAAA,QACA,gBAAA;AAAA,QACA,UAAU,GAAG,CAAA,cAAA,EAAiB,MAAM,KAAK,CAAA,eAAA,EAAkB,MAAM,KAAK,CAAA,CAAA;AAAA,QACtE;AAAA,OACF;AAAA,IACF;AACA,IAAA,IACE,MAAM,YAAA,KAAiB,MAAA,KACrB,KAAA,CAAM,KAAA,KAAU,UAAa,KAAA,CAAM,YAAA,GAAe,KAAA,CAAM,KAAA,IACvD,MAAM,KAAA,KAAU,MAAA,IAAa,KAAA,CAAM,YAAA,GAAe,MAAM,KAAA,CAAA,EAC3D;AACA,MAAA,GAAA;AAAA,QACE,SAAA;AAAA,QACA,uBAAA;AAAA,QACA,CAAA,OAAA,EAAU,GAAG,CAAA,gBAAA,EAAmB,KAAA,CAAM,YAAY,CAAA,sBAAA,CAAA;AAAA,QAClD;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,CAAC,aAAA,EAAe,KAAA,CAAM,WAAW,CAAA;AAAA,MACjC,CAAC,aAAA,EAAe,KAAA,CAAM,WAAW;AAAA,KACnC;AACA,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,KAAK,CAAA,IAAK,MAAA,EAAQ;AACnC,MAAA,IAAI,CAAC,cAAA,CAAe,KAAK,CAAA,CAAE,KAAA,EAAO;AAChC,QAAA,GAAA;AAAA,UACE,SAAA;AAAA,UACA,iBAAA;AAAA,UACA,CAAA,OAAA,EAAU,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,qDAAA,CAAA;AAAA,UACvB;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,mBAAmB,IAAI,CAAA;AACpC,EAAA,KAAA,MAAW,QAAA,IAAY,KAAK,UAAA,EAAY;AACtC,IAAA,GAAA;AAAA,MACE,SAAA;AAAA,MACA,aAAA;AAAA,MACA,UAAU,QAAQ,CAAA,0DAAA,CAAA;AAAA,MAClB;AAAA,KACF;AAAA,EACF;AACA,EAAA,KAAA,MAAW,OAAA,IAAW,KAAK,aAAA,EAAe;AACxC,IAAA,GAAA;AAAA,MACE,SAAA;AAAA,MACA,eAAA;AAAA,MACA,CAAA,MAAA,EAAS,OAAO,CAAA,4BAAA,EAA+B,IAAA,CAAK,IAAI,CAAA,CAAA,CAAA;AAAA,MACxD;AAAA,KACF;AAAA,EACF;AACA,EAAA,IAAA,CAAK,IAAA,CAAK,qBAAqB,EAAC,EAAG,WAAW,CAAA,IAAK,CAAC,KAAK,SAAA,EAAW;AAClE,IAAA,GAAA;AAAA,MACE,SAAA;AAAA,MACA,sBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAC,KAAK,IAAI,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AACpD,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,IAAA,IAAI,CAAC,QAAA,IAAa,QAAA,CAAS,SAAS,MAAA,IAAa,QAAA,CAAS,YAAY,MAAA,EAAY;AAChF,MAAA,GAAA,CAAI,SAAA,EAAW,aAAA,EAAe,CAAA,MAAA,EAAS,GAAG,6CAA6C,GAAG,CAAA;AAAA,IAC5F;AACA,IAAA,IAAI,QAAA,EAAU,IAAA,KAAS,MAAA,IAAa,QAAA,CAAS,QAAQ,CAAA,EAAG;AACtD,MAAA,GAAA,CAAI,OAAA,EAAS,YAAY,CAAA,MAAA,EAAS,GAAG,2BAA2B,QAAA,CAAS,IAAI,IAAI,GAAG,CAAA;AAAA,IACtF;AACA,IAAA,IAAI,UAAU,eAAA,EAAiB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,EAAG;AACjD,MAAA,GAAA,CAAI,OAAA,EAAS,aAAA,EAAe,CAAA,MAAA,EAAS,GAAG,+CAA+C,GAAG,CAAA;AAAA,IAC5F;AACA,IAAA,IAAI,QAAA,EAAU,aAAA,IAAiB,CAAC,QAAA,CAAS,eAAA,EAAiB;AACxD,MAAA,GAAA;AAAA,QACE,SAAA;AAAA,QACA,iBAAA;AAAA,QACA,SAAS,GAAG,CAAA,mEAAA,CAAA;AAAA,QACZ;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,QAAA,CAAS,GAAA,EAAK,IAAI,CAAA;AACzC,MAAA,MAAM,aAAa,MAAA,CAAO,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,WAAW,CAAA;AACpE,MAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,QAAA,GAAA,CAAI,SAAA,EAAW,cAAA,EAAgB,CAAA,MAAA,EAAS,GAAG,+BAA+B,GAAG,CAAA;AAAA,MAC/E;AACA,MAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,QAAA,IAAI,CAAC,KAAK,sBAAA,EAAwB;AAChC,UAAA,GAAA;AAAA,YACE,SAAA;AAAA,YACA,yBAAA;AAAA,YACA,CAAA,MAAA,EAAS,GAAG,CAAA,kBAAA,EAAqB,IAAA,CAAK,IAAI,CAAA,8FAAA,CAAA;AAAA,YAC1C;AAAA,WACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,MAAO,CAAA,CAAE,QAAA,KAAa,CAAA,CAAE,QAAA,GAAW,CAAA,GAAI,CAAA,CAAE,QAAA,KAAa,OAAA,GAAU,KAAK,CAAE,CAAA;AAChG","file":"chunk-JZMCABQO.js","sourcesContent":["/** Package identity. Kept in one place so every entry point can re-export it. */\nexport const PACKAGE_NAME = \"three-usd-robot\";\n\n/** Library version. Replaced by the release tooling at publish time. */\nexport const VERSION = \"0.0.0\";\n","/**\n * Robot IR → USDA layer (M13).\n *\n * Builds a self-contained UsdPhysics robot layer from a {@link RobotDescription}:\n * one `Xform` prim per link placed at its **zero-pose** world transform\n * (folding joint frames root-down, `T_child = T_parent · frame0 · frame1⁻¹` —\n * see docs/export-design.md §4), one `Physics*Joint` prim per joint, and the\n * link meshes supplied by a {@link RobotGeometryProvider}. Initial joint values\n * author as `PhysicsJointStateAPI` opinions rather than being baked into link\n * transforms, so a re-import applies them exactly once. Values convert back\n * from SI to authored units (angular radians → degrees).\n */\n\nimport {\n type Mat4,\n decomposeRigid,\n identity4,\n invert,\n multiply,\n toUsdMatrix,\n} from \"../kinematics/transforms.js\";\nimport type {\n AttributeSpec,\n MetadataMap,\n PrimSpec,\n PropertySpec,\n RelationshipSpec,\n UsdValue,\n UsdaFile,\n} from \"../parser/ast.js\";\nimport { AssetPath, Quat } from \"../parser/ast.js\";\nimport type {\n JointDescription,\n JointType,\n LinkInertialDescription,\n RobotDescription,\n} from \"../robot/RobotDescription.js\";\nimport { buildKinematicTree } from \"../robot/buildKinematicTree.js\";\nimport { jointValueFromSI } from \"../robot/normalize.js\";\nimport {\n ARTICULATION_ROOT_API,\n COLLISION_API,\n MASS_API,\n MESH_COLLISION_API,\n PHYSICS_MATERIAL_API,\n RIGID_BODY_API,\n driveKindFor,\n} from \"../schemas/usdPhysics.js\";\nimport type {\n ExportMaterial,\n ExportMesh,\n ExportPhysicsMaterial,\n RobotGeometryProvider,\n TextureChannel,\n} from \"./GeometryProvider.js\";\n\n/** PhysX articulation tuning API (Isaac / Omniverse). */\nconst PHYSX_ARTICULATION_API = \"PhysxArticulationAPI\";\n\nexport type ExportRobotOptions = {\n /** Supplies each link's meshes; omit for a kinematics-only layer. */\n geometry?: RobotGeometryProvider;\n /** Root prim name; defaults to the (sanitized) robot name. */\n robotName?: string;\n /**\n * Author `physxArticulation:enabledSelfCollisions` on the articulation root\n * (M16). `false` is the common Isaac stabilizer for adjacent-link contact.\n */\n enabledSelfCollisions?: boolean;\n /**\n * Apply the Isaac Sim Robot Schema (M16): `IsaacRobotAPI` on the root with\n * ordered `isaac:physics:robotLinks` / `robotJoints` relationships,\n * `IsaacLinkAPI` per link, and `IsaacJointAPI` (+ DOF order) per joint.\n */\n isaacRobotSchema?: boolean;\n /** Receives non-fatal export diagnostics. */\n onWarn?: (message: string) => void;\n};\n\nconst JOINT_SCHEMA_BY_TYPE: Record<JointType, string> = {\n fixed: \"PhysicsFixedJoint\",\n revolute: \"PhysicsRevoluteJoint\",\n continuous: \"PhysicsRevoluteJoint\",\n prismatic: \"PhysicsPrismaticJoint\",\n};\n\n/** Serialize a robot IR into a single-layer USDA AST (pass to `serializeUsda`). */\nexport function exportRobotUsda(\n desc: RobotDescription,\n options: ExportRobotOptions = {},\n): UsdaFile {\n const warn = (m: string) => options.onWarn?.(m);\n const tree = buildKinematicTree(desc, { onWarn: warn });\n\n const robotName = sanitizeName(options.robotName ?? desc.name ?? \"robot\");\n\n // One flat sibling namespace under the root prim for links and joints.\n const alloc = nameAllocator(warn);\n const linkNames = new Map<string, string>();\n for (const key of Object.keys(desc.links)) linkNames.set(key, alloc(key, `link \"${key}\"`));\n const jointNames = new Map<string, string>();\n for (const key of Object.keys(desc.joints)) jointNames.set(key, alloc(key, `joint \"${key}\"`));\n const linkPath = (key: string) => `/${robotName}/${linkNames.get(key)}`;\n\n // Zero-pose world placement per link, folded root-down along the tree.\n // Links no joint chain reaches (floating root / isolated) keep their\n // authored stage placement when the IR carries one.\n const authoredWorld = (key: string) => desc.links[key]?.worldTransform ?? identity4();\n const worldByLink = new Map<string, Mat4>();\n for (const key of tree.order) {\n const node = tree.nodes[key]!;\n if (node.parent === null || node.jointToParent === null) {\n const rootJoint = tree.rootJoint ? desc.joints[tree.rootJoint] : undefined;\n worldByLink.set(\n key,\n rootJoint\n ? multiply(rootJoint.jointFrame0, invert(rootJoint.jointFrame1))\n : authoredWorld(key),\n );\n continue;\n }\n const joint = desc.joints[node.jointToParent]!;\n const parentWorld = worldByLink.get(node.parent) ?? identity4();\n worldByLink.set(\n key,\n multiply(multiply(parentWorld, joint.jointFrame0), invert(joint.jointFrame1)),\n );\n }\n for (const key of tree.isolatedLinks) worldByLink.set(key, authoredWorld(key));\n\n // Articulation root: preserve link-level APIs from the IR; otherwise apply it\n // on the container prim (never both — nested articulation roots are invalid).\n const articulationLinks = new Set(desc.articulationRoots ?? []);\n\n // Gather meshes once, then dedupe their (physics) materials by name.\n const meshesByLink = new Map<string, ExportMesh[]>();\n const materials = new Map<string, ExportMaterial>();\n const physicsMaterials = new Map<string, ExportPhysicsMaterial>();\n for (const [key, link] of Object.entries(desc.links)) {\n const meshes = options.geometry?.(key, link) ?? [];\n meshesByLink.set(key, meshes);\n for (const mesh of meshes) {\n if (mesh.material && !materials.has(mesh.material.name)) {\n materials.set(mesh.material.name, mesh.material);\n }\n if (mesh.physicsMaterial && !physicsMaterials.has(mesh.physicsMaterial.name)) {\n physicsMaterials.set(mesh.physicsMaterial.name, mesh.physicsMaterial);\n }\n }\n }\n const looksName = materials.size > 0 ? alloc(\"Looks\") : undefined;\n const materialAlloc = nameAllocator();\n const materialNames = new Map<string, string>();\n for (const name of materials.keys()) materialNames.set(name, materialAlloc(name));\n const materialPath = (name: string) =>\n looksName ? `/${robotName}/${looksName}/${materialNames.get(name)}` : undefined;\n\n const physicsScopeName = physicsMaterials.size > 0 ? alloc(\"PhysicsMaterials\") : undefined;\n const physicsMaterialAlloc = nameAllocator();\n const physicsMaterialNames = new Map<string, string>();\n for (const name of physicsMaterials.keys()) {\n physicsMaterialNames.set(name, physicsMaterialAlloc(name));\n }\n const physicsMaterialPath = (name: string) =>\n physicsScopeName\n ? `/${robotName}/${physicsScopeName}/${physicsMaterialNames.get(name)}`\n : undefined;\n\n const isaac = options.isaacRobotSchema === true;\n const children: PrimSpec[] = [];\n for (const [key, link] of Object.entries(desc.links)) {\n const apiSchemas = [RIGID_BODY_API];\n if (articulationLinks.has(key)) apiSchemas.push(ARTICULATION_ROOT_API);\n if (link.inertial) apiSchemas.push(MASS_API);\n if (isaac) apiSchemas.push(\"IsaacLinkAPI\");\n const selfCollision = articulationLinks.has(key) ? options.enabledSelfCollisions : undefined;\n if (selfCollision !== undefined) apiSchemas.push(PHYSX_ARTICULATION_API);\n children.push(\n buildLinkPrim({\n name: linkNames.get(key)!,\n world: worldByLink.get(key) ?? identity4(),\n apiSchemas,\n meshes: meshesByLink.get(key) ?? [],\n materialPath,\n physicsMaterialPath,\n warn,\n ...(link.inertial ? { inertial: link.inertial } : {}),\n ...(selfCollision !== undefined ? { selfCollision } : {}),\n }),\n );\n }\n const emittedJoints = new Set<string>();\n for (const [key, joint] of Object.entries(desc.joints)) {\n if (!desc.links[joint.child] || (joint.parent !== \"\" && !desc.links[joint.parent])) {\n warn(`joint \"${key}\" references an unknown link; skipped`);\n continue;\n }\n emittedJoints.add(key);\n children.push(buildJointPrim(jointNames.get(key)!, key, joint, linkPath, isaac, warn));\n }\n if (looksName) {\n children.push(buildLooksPrim(looksName, materials, materialNames, materialPath));\n }\n if (physicsScopeName) {\n children.push(\n buildPhysicsMaterialsPrim(physicsScopeName, physicsMaterials, physicsMaterialNames),\n );\n }\n\n const rootApiSchemas: string[] = [];\n const rootProperties: PropertySpec[] = [];\n if (articulationLinks.size === 0) {\n rootApiSchemas.push(ARTICULATION_ROOT_API);\n if (options.enabledSelfCollisions !== undefined) {\n rootApiSchemas.push(PHYSX_ARTICULATION_API);\n rootProperties.push(\n attr(\"physxArticulation:enabledSelfCollisions\", \"bool\", options.enabledSelfCollisions),\n );\n }\n }\n if (isaac) {\n rootApiSchemas.push(\"IsaacRobotAPI\");\n const orderedLinks = [...tree.order, ...tree.isolatedLinks];\n const orderedJoints: string[] = [];\n const pushJoint = (key: string | null | undefined) => {\n if (key && emittedJoints.has(key) && !orderedJoints.includes(key)) orderedJoints.push(key);\n };\n pushJoint(tree.rootJoint);\n for (const linkKey of tree.order) pushJoint(tree.nodes[linkKey]?.jointToParent);\n for (const jointKey of tree.loopJoints) pushJoint(jointKey);\n for (const jointKey of Object.keys(desc.joints)) pushJoint(jointKey);\n\n rootProperties.push(rel(\"isaac:physics:robotLinks\", orderedLinks.map(linkPath)));\n rootProperties.push(\n rel(\n \"isaac:physics:robotJoints\",\n orderedJoints.map((key) => `/${robotName}/${jointNames.get(key)}`),\n ),\n );\n }\n\n const root: PrimSpec = {\n specifier: \"def\",\n typeName: \"Xform\",\n name: robotName,\n metadata: rootApiSchemas.length > 0 ? { apiSchemas: rootApiSchemas } : {},\n properties: rootProperties,\n children,\n line: 0,\n };\n\n const metadata: MetadataMap = {\n defaultPrim: robotName,\n metersPerUnit: desc.metersPerUnit,\n upAxis: desc.upAxis,\n ...(desc.timeCodesPerSecond !== undefined\n ? { timeCodesPerSecond: desc.timeCodesPerSecond }\n : {}),\n ...(desc.startTimeCode !== undefined ? { startTimeCode: desc.startTimeCode } : {}),\n ...(desc.endTimeCode !== undefined ? { endTimeCode: desc.endTimeCode } : {}),\n };\n\n return { version: \"1.0\", metadata, prims: [root] };\n}\n\n// ---------------------------------------------------------------------------\n// Links & meshes\n// ---------------------------------------------------------------------------\n\ntype LinkPrimArgs = {\n name: string;\n world: Mat4;\n apiSchemas: string[];\n meshes: ExportMesh[];\n inertial?: LinkInertialDescription;\n /** `physxArticulation:enabledSelfCollisions` for link-level articulation roots. */\n selfCollision?: boolean;\n materialPath: (name: string) => string | undefined;\n physicsMaterialPath: (name: string) => string | undefined;\n warn: (message: string) => void;\n};\n\nfunction buildLinkPrim(args: LinkPrimArgs): PrimSpec {\n const meshAlloc = nameAllocator();\n const properties: PropertySpec[] = transformProps(args.world);\n if (args.inertial) properties.push(...massProps(args.inertial, args.name, args.warn));\n if (args.selfCollision !== undefined) {\n properties.push(attr(\"physxArticulation:enabledSelfCollisions\", \"bool\", args.selfCollision));\n }\n return {\n specifier: \"def\",\n typeName: \"Xform\",\n name: args.name,\n metadata: { apiSchemas: args.apiSchemas },\n properties,\n children: args.meshes.map((mesh) =>\n buildMeshPrim(mesh, meshAlloc(mesh.name), args.materialPath, args.physicsMaterialPath),\n ),\n line: 0,\n };\n}\n\n/**\n * `UsdPhysicsMassAPI` attributes for a link's mass properties. UsdPhysics\n * requires `diagonalInertia` and `principalAxes` to be authored together, so a\n * missing principal-axes frame is completed with the identity quaternion\n * (equivalent — the diagonal is then in the body frame) and axes without a\n * diagonal are dropped (meaningless alone).\n */\nfunction massProps(\n inertial: LinkInertialDescription,\n linkName: string,\n warn: (message: string) => void,\n): PropertySpec[] {\n const out: PropertySpec[] = [];\n if (inertial.mass !== undefined) out.push(attr(\"physics:mass\", \"float\", inertial.mass));\n if (inertial.density !== undefined) out.push(attr(\"physics:density\", \"float\", inertial.density));\n if (inertial.centerOfMass) {\n out.push(attr(\"physics:centerOfMass\", \"point3f\", inertial.centerOfMass));\n }\n if (inertial.diagonalInertia) {\n out.push(attr(\"physics:diagonalInertia\", \"float3\", inertial.diagonalInertia));\n out.push(attr(\"physics:principalAxes\", \"quatf\", inertial.principalAxes ?? Quat.identity()));\n } else if (inertial.principalAxes) {\n warn(`link \"${linkName}\": principalAxes without diagonalInertia is meaningless; dropped`);\n }\n return out;\n}\n\nfunction buildMeshPrim(\n mesh: ExportMesh,\n name: string,\n materialPath: (name: string) => string | undefined,\n physicsMaterialPath: (name: string) => string | undefined,\n): PrimSpec {\n const properties: PropertySpec[] = [];\n if (mesh.transform) properties.push(...transformProps(mesh.transform));\n properties.push(\n arrayAttr(\"faceVertexCounts\", \"int\", mesh.faceVertexCounts),\n arrayAttr(\"faceVertexIndices\", \"int\", mesh.faceVertexIndices),\n arrayAttr(\"points\", \"point3f\", mesh.points),\n );\n if (mesh.normals) properties.push(arrayAttr(\"normals\", \"normal3f\", mesh.normals));\n if (mesh.st) {\n properties.push(arrayAttr(\"primvars:st\", \"texCoord2f\", mesh.st, { interpolation: \"vertex\" }));\n }\n if (mesh.displayColor) {\n properties.push(arrayAttr(\"primvars:displayColor\", \"color3f\", [mesh.displayColor]));\n }\n if (mesh.doubleSided) properties.push(attr(\"doubleSided\", \"bool\", true));\n properties.push(uniformToken(\"subdivisionScheme\", \"none\"));\n\n const apiSchemas: string[] = [];\n if (mesh.kind === \"collision\") {\n apiSchemas.push(COLLISION_API);\n // `guide` keeps collision shapes out of the render pass (usdview, Isaac Sim,\n // and this package's own loader) while PhysX still collides with them.\n properties.push(uniformToken(\"purpose\", \"guide\"));\n if (mesh.collisionApproximation) {\n apiSchemas.push(MESH_COLLISION_API);\n properties.push(uniformToken(\"physics:approximation\", mesh.collisionApproximation));\n }\n }\n const binding = mesh.material ? materialPath(mesh.material.name) : undefined;\n if (binding) properties.push(rel(\"material:binding\", [binding]));\n const physicsBinding =\n mesh.kind === \"collision\" && mesh.physicsMaterial\n ? physicsMaterialPath(mesh.physicsMaterial.name)\n : undefined;\n if (physicsBinding) properties.push(rel(\"material:binding:physics\", [physicsBinding]));\n if (binding || physicsBinding) apiSchemas.push(\"MaterialBindingAPI\");\n\n return {\n specifier: \"def\",\n typeName: \"Mesh\",\n name,\n metadata: apiSchemas.length > 0 ? { apiSchemas } : {},\n properties,\n children: [],\n line: 0,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Physics materials\n// ---------------------------------------------------------------------------\n\n/** `Scope` holding one `PhysicsMaterialAPI` material per unique name. */\nfunction buildPhysicsMaterialsPrim(\n scopeName: string,\n materials: Map<string, ExportPhysicsMaterial>,\n names: Map<string, string>,\n): PrimSpec {\n const children: PrimSpec[] = [];\n for (const [key, material] of materials) {\n children.push(buildPhysicsMaterialPrim(names.get(key)!, material));\n }\n return {\n specifier: \"def\",\n typeName: \"Scope\",\n name: scopeName,\n metadata: {},\n properties: [],\n children,\n line: 0,\n };\n}\n\nfunction buildPhysicsMaterialPrim(name: string, material: ExportPhysicsMaterial): PrimSpec {\n const properties: PropertySpec[] = [];\n if (material.staticFriction !== undefined) {\n properties.push(attr(\"physics:staticFriction\", \"float\", material.staticFriction));\n }\n if (material.dynamicFriction !== undefined) {\n properties.push(attr(\"physics:dynamicFriction\", \"float\", material.dynamicFriction));\n }\n if (material.restitution !== undefined) {\n properties.push(attr(\"physics:restitution\", \"float\", material.restitution));\n }\n if (material.density !== undefined) {\n properties.push(attr(\"physics:density\", \"float\", material.density));\n }\n return {\n specifier: \"def\",\n typeName: \"Material\",\n name,\n metadata: { apiSchemas: [PHYSICS_MATERIAL_API] },\n properties,\n children: [],\n line: 0,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Materials\n// ---------------------------------------------------------------------------\n\n/** `Scope` holding one `Material` + `UsdPreviewSurface` shader per material. */\nfunction buildLooksPrim(\n looksName: string,\n materials: Map<string, ExportMaterial>,\n materialNames: Map<string, string>,\n materialPath: (name: string) => string | undefined,\n): PrimSpec {\n const children: PrimSpec[] = [];\n for (const [key, material] of materials) {\n children.push(buildMaterialPrim(materialNames.get(key)!, material, materialPath(key)!));\n }\n return {\n specifier: \"def\",\n typeName: \"Scope\",\n name: looksName,\n metadata: {},\n properties: [],\n children,\n line: 0,\n };\n}\n\n/** How each texture channel wires into `UsdPreviewSurface`. */\nconst TEXTURE_WIRING: Record<\n TextureChannel,\n { input: string; inputType: string; output: string; outputType: string; colorSpace: string }\n> = {\n color: {\n input: \"inputs:diffuseColor\",\n inputType: \"color3f\",\n output: \"outputs:rgb\",\n outputType: \"float3\",\n colorSpace: \"sRGB\",\n },\n emissive: {\n input: \"inputs:emissiveColor\",\n inputType: \"color3f\",\n output: \"outputs:rgb\",\n outputType: \"float3\",\n colorSpace: \"sRGB\",\n },\n normal: {\n input: \"inputs:normal\",\n inputType: \"normal3f\",\n output: \"outputs:rgb\",\n outputType: \"float3\",\n colorSpace: \"raw\",\n },\n opacity: {\n input: \"inputs:opacity\",\n inputType: \"float\",\n output: \"outputs:a\",\n outputType: \"float\",\n colorSpace: \"raw\",\n },\n roughness: {\n input: \"inputs:roughness\",\n inputType: \"float\",\n output: \"outputs:r\",\n outputType: \"float\",\n colorSpace: \"raw\",\n },\n metalness: {\n input: \"inputs:metallic\",\n inputType: \"float\",\n output: \"outputs:r\",\n outputType: \"float\",\n colorSpace: \"raw\",\n },\n occlusion: {\n input: \"inputs:occlusion\",\n inputType: \"float\",\n output: \"outputs:r\",\n outputType: \"float\",\n colorSpace: \"raw\",\n },\n};\n\nfunction buildMaterialPrim(name: string, material: ExportMaterial, selfPath: string): PrimSpec {\n const textures = material.textures ?? {};\n const shaderProps: PropertySpec[] = [uniformToken(\"info:id\", \"UsdPreviewSurface\")];\n\n // A surface input: constant value, texture connection, or both (the\n // connection wins per UsdShade; the constant stays for flat consumers).\n const input = (channel: TextureChannel, value?: UsdValue) => {\n const wiring = TEXTURE_WIRING[channel];\n const texturePath = textures[channel];\n if (value === undefined && texturePath === undefined) return;\n const spec = attr(wiring.input, wiring.inputType, value);\n if (texturePath !== undefined) {\n spec.connections = [`${selfPath}/${channel}Texture.${wiring.output}`];\n }\n shaderProps.push(spec);\n };\n input(\"color\", material.diffuseColor);\n input(\"metalness\", material.metallic);\n input(\"roughness\", material.roughness);\n input(\"opacity\", material.opacity);\n input(\"emissive\", material.emissiveColor);\n input(\"normal\");\n input(\"occlusion\");\n shaderProps.push(attr(\"outputs:surface\", \"token\", undefined));\n\n const children: PrimSpec[] = [shaderPrim(\"PreviewSurface\", shaderProps)];\n const textureEntries = Object.entries(textures) as [TextureChannel, string][];\n if (textureEntries.length > 0) {\n children.push(\n shaderPrim(\"stReader\", [\n uniformToken(\"info:id\", \"UsdPrimvarReader_float2\"),\n attr(\"inputs:varname\", \"string\", \"st\"),\n attr(\"outputs:result\", \"float2\", undefined),\n ]),\n );\n for (const [channel, path] of textureEntries) {\n children.push(buildUvTexturePrim(channel, path, selfPath));\n }\n }\n\n const surfaceConnect = attr(\"outputs:surface\", \"token\", undefined);\n surfaceConnect.connections = [`${selfPath}/PreviewSurface.outputs:surface`];\n\n return {\n specifier: \"def\",\n typeName: \"Material\",\n name,\n metadata: {},\n properties: [surfaceConnect],\n children,\n line: 0,\n };\n}\n\n/** `UsdUVTexture` node for one channel, fed by the material's `stReader`. */\nfunction buildUvTexturePrim(channel: TextureChannel, path: string, selfPath: string): PrimSpec {\n const wiring = TEXTURE_WIRING[channel];\n const st = attr(\"inputs:st\", \"float2\", undefined);\n st.connections = [`${selfPath}/stReader.outputs:result`];\n return shaderPrim(`${channel}Texture`, [\n uniformToken(\"info:id\", \"UsdUVTexture\"),\n attr(\"inputs:file\", \"asset\", new AssetPath(path)),\n uniformToken(\"inputs:sourceColorSpace\", wiring.colorSpace),\n st,\n attr(wiring.output, wiring.outputType, undefined),\n ]);\n}\n\nfunction shaderPrim(name: string, properties: PropertySpec[]): PrimSpec {\n return {\n specifier: \"def\",\n typeName: \"Shader\",\n name,\n metadata: {},\n properties,\n children: [],\n line: 0,\n };\n}\n\n/** `xformOp:transform` + `xformOpOrder` for an explicit matrix placement. */\nfunction transformProps(m: Mat4): PropertySpec[] {\n return [\n attr(\"xformOp:transform\", \"matrix4d\", toUsdMatrix(m)),\n arrayAttr(\"xformOpOrder\", \"token\", [\"xformOp:transform\"], undefined, \"uniform\"),\n ];\n}\n\n// ---------------------------------------------------------------------------\n// Joints\n// ---------------------------------------------------------------------------\n\nfunction buildJointPrim(\n name: string,\n key: string,\n joint: JointDescription,\n linkPath: (key: string) => string,\n isaac: boolean,\n warn: (m: string) => void,\n): PrimSpec {\n const kind = driveKindFor(joint.type);\n const angular = kind === \"angular\";\n const properties: PropertySpec[] = [];\n const apiSchemas: string[] = [];\n\n if (joint.parent !== \"\") properties.push(rel(\"physics:body0\", [linkPath(joint.parent)]));\n properties.push(rel(\"physics:body1\", [linkPath(joint.child)]));\n if (joint.type !== \"fixed\") properties.push(uniformToken(\"physics:axis\", joint.axis));\n if (joint.lower !== undefined) {\n properties.push(attr(\"physics:lowerLimit\", \"float\", jointValueFromSI(angular, joint.lower)));\n }\n if (joint.upper !== undefined) {\n properties.push(attr(\"physics:upperLimit\", \"float\", jointValueFromSI(angular, joint.upper)));\n }\n\n for (const index of [0, 1] as const) {\n const frame = index === 0 ? joint.jointFrame0 : joint.jointFrame1;\n const { position, orientation, rigid } = decomposeRigid(frame);\n if (!rigid) {\n warn(`joint \"${key}\": jointFrame${index} is not rigid; scale/shear was discarded`);\n }\n properties.push(attr(`physics:localPos${index}`, \"point3f\", position));\n properties.push(attr(`physics:localRot${index}`, \"quatf\", orientation));\n }\n\n // Joint state: the initial value and/or the sampled trajectory (SI → authored).\n if (joint.initialValue !== undefined || joint.valueSamples) {\n const state = attr(\n `state:${kind}:physics:position`,\n \"float\",\n joint.initialValue !== undefined ? jointValueFromSI(angular, joint.initialValue) : undefined,\n );\n if (joint.valueSamples) {\n state.timeSamples = new Map(\n joint.valueSamples.times.map((t, i) => [\n t,\n jointValueFromSI(angular, joint.valueSamples!.values[i] ?? 0),\n ]),\n );\n }\n properties.push(state);\n apiSchemas.push(`PhysicsJointStateAPI:${kind}`);\n }\n\n if (joint.drive) {\n const d = joint.drive;\n if (d.targetPosition !== undefined) {\n properties.push(\n attr(\n `drive:${kind}:physics:targetPosition`,\n \"float\",\n jointValueFromSI(angular, d.targetPosition),\n ),\n );\n }\n if (d.stiffness !== undefined) {\n properties.push(attr(`drive:${kind}:physics:stiffness`, \"float\", d.stiffness));\n }\n if (d.damping !== undefined) {\n properties.push(attr(`drive:${kind}:physics:damping`, \"float\", d.damping));\n }\n if (d.maxForce !== undefined) {\n properties.push(attr(`drive:${kind}:physics:maxForce`, \"float\", d.maxForce));\n }\n apiSchemas.push(`PhysicsDriveAPI:${kind}`);\n }\n\n if (isaac) {\n apiSchemas.push(\"IsaacJointAPI\");\n if (joint.type !== \"fixed\") {\n const prefix = joint.type === \"prismatic\" ? \"Trans\" : \"Rot\";\n properties.push(\n arrayAttr(\"isaac:physics:DofOffsetOpOrder\", \"token\", [`${prefix}${joint.axis}`]),\n );\n }\n }\n\n return {\n specifier: \"def\",\n typeName: JOINT_SCHEMA_BY_TYPE[joint.type],\n name,\n metadata: apiSchemas.length > 0 ? { apiSchemas } : {},\n properties,\n children: [],\n line: 0,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Naming & spec helpers\n// ---------------------------------------------------------------------------\n\n/** Make a valid USD identifier out of an arbitrary key (`/a/b c` → `_a_b_c`). */\nfunction sanitizeName(raw: string): string {\n const cleaned = raw.replace(/[^A-Za-z0-9_]/g, \"_\");\n const named = cleaned.length > 0 ? cleaned : \"_\";\n return /^[0-9]/.test(named) ? `_${named}` : named;\n}\n\n/** Allocates unique sanitized sibling names, warning when a name changes. */\nfunction nameAllocator(warn?: (m: string) => void): (raw: string, label?: string) => string {\n const used = new Set<string>();\n return (raw, label) => {\n let name = sanitizeName(raw);\n for (let i = 2; used.has(name); i++) name = `${sanitizeName(raw)}_${i}`;\n used.add(name);\n if (name !== raw && label && warn) warn(`${label} exported as prim \"${name}\"`);\n return name;\n };\n}\n\nfunction attr(\n name: string,\n typeName: string,\n value: UsdValue | undefined,\n metadata: MetadataMap = {},\n): AttributeSpec {\n return {\n kind: \"attribute\",\n name,\n typeName,\n isArray: false,\n variability: \"varying\",\n custom: false,\n ...(value !== undefined ? { value } : {}),\n metadata,\n line: 0,\n };\n}\n\nfunction arrayAttr(\n name: string,\n typeName: string,\n value: UsdValue[],\n metadata: MetadataMap = {},\n variability: \"varying\" | \"uniform\" = \"varying\",\n): AttributeSpec {\n return {\n kind: \"attribute\",\n name,\n typeName,\n isArray: true,\n variability,\n custom: false,\n value,\n metadata,\n line: 0,\n };\n}\n\nfunction uniformToken(name: string, value: string): AttributeSpec {\n return {\n kind: \"attribute\",\n name,\n typeName: \"token\",\n isArray: false,\n variability: \"uniform\",\n custom: false,\n value,\n metadata: {},\n line: 0,\n };\n}\n\nfunction rel(name: string, targets: string[]): RelationshipSpec {\n return {\n kind: \"relationship\",\n name,\n custom: false,\n listOp: \"explicit\",\n targets,\n metadata: {},\n line: 0,\n };\n}\n","/**\n * Geometry access for the robot exporter (M13).\n *\n * `exportRobotUsda` is geometry-agnostic: a {@link RobotGeometryProvider}\n * supplies each link's meshes as plain data. {@link stageGeometryProvider}\n * reads them back off a loaded {@link Stage} for round-trip export; the\n * Three.js authoring side (M14) supplies one backed by `BufferGeometry`.\n */\n\nimport { type Mat4, identity4, multiply } from \"../kinematics/transforms.js\";\nimport type { Vec2, Vec3 } from \"../parser/ast.js\";\nimport type { LinkDescription } from \"../robot/RobotDescription.js\";\nimport { resolveBoundMaterial } from \"../three/MaterialBinding.js\";\nimport type { Prim } from \"../usd/Prim.js\";\nimport type { Stage } from \"../usd/Stage.js\";\nimport { computeLocalTransform } from \"../usd/xformOps.js\";\n\n/** Texture channels a `UsdPreviewSurface` network can reference (M15). */\nexport type TextureChannel =\n | \"color\"\n | \"opacity\"\n | \"normal\"\n | \"roughness\"\n | \"metalness\"\n | \"occlusion\"\n | \"emissive\";\n\n/**\n * PBR parameters for a mesh, written as a `UsdPreviewSurface` material (M14).\n * `textures` holds per-channel image **asset paths** (M15) — emitted as a\n * `UsdUVTexture` + `UsdPrimvarReader_float2` network; sampler details\n * (wrap/scale/bias/transform) are not carried. Bundle the image bytes\n * themselves with `writeUsdz` under the same paths.\n */\nexport type ExportMaterial = {\n /** Material identity: meshes sharing a name share one Material prim. */\n name: string;\n diffuseColor?: Vec3;\n metallic?: number;\n roughness?: number;\n /** Sub-unit opacity renders as a translucent blend. */\n opacity?: number;\n emissiveColor?: Vec3;\n /** Per-channel texture asset paths. */\n textures?: Partial<Record<TextureChannel, string>>;\n};\n\n/** `UsdPhysicsMaterialAPI` parameters, bound via `material:binding:physics` (M16). */\nexport type ExportPhysicsMaterial = {\n /** Identity: meshes sharing a name share one physics-material prim. */\n name: string;\n staticFriction?: number;\n dynamicFriction?: number;\n restitution?: number;\n density?: number;\n};\n\n/** `physics:approximation` tokens of `UsdPhysicsMeshCollisionAPI`. */\nexport type CollisionApproximation =\n | \"none\"\n | \"convexHull\"\n | \"convexDecomposition\"\n | \"boundingSphere\"\n | \"boundingCube\"\n | \"meshSimplification\";\n\n/** One mesh of a link, as plain exportable data (stage units, link-relative). */\nexport type ExportMesh = {\n /** Prim-name hint; the exporter sanitizes and uniquifies it. */\n name: string;\n kind: \"visual\" | \"collision\";\n points: Vec3[];\n /** Authored polygon topology (not re-triangulated). */\n faceVertexCounts: number[];\n faceVertexIndices: number[];\n /** Per-vertex normals (only written when one per point). */\n normals?: Vec3[];\n /** `primvars:st` UVs, vertex interpolation (one per point). */\n st?: Vec2[];\n displayColor?: Vec3;\n doubleSided?: boolean;\n /** Transform relative to the link frame (column-major); identity when omitted. */\n transform?: Mat4;\n /** Bound material constants, if any. */\n material?: ExportMaterial;\n /** Collision approximation token (collision meshes only, M16). */\n collisionApproximation?: CollisionApproximation;\n /** Bound physics material (collision meshes only, M16). */\n physicsMaterial?: ExportPhysicsMaterial;\n};\n\n/** Supplies the meshes of a link for export. */\nexport type RobotGeometryProvider = (linkKey: string, link: LinkDescription) => ExportMesh[];\n\n/** Provider that reads each link's visual/collision Mesh prims from a stage. */\nexport function stageGeometryProvider(stage: Stage): RobotGeometryProvider {\n return (_linkKey, link) => {\n const linkPrim = stage.GetPrimAtPath(link.primPath);\n if (!linkPrim) return [];\n\n const collisionSet = new Set(link.collisionPrims ?? []);\n const out: ExportMesh[] = [];\n for (const path of link.visualPrims) {\n if (collisionSet.has(path)) continue;\n const mesh = readMesh(stage, linkPrim, path, \"visual\");\n if (mesh) out.push(mesh);\n }\n for (const path of link.collisionPrims ?? []) {\n const mesh = readMesh(stage, linkPrim, path, \"collision\");\n if (mesh) out.push(mesh);\n }\n return out;\n };\n}\n\nfunction readMesh(\n stage: Stage,\n linkPrim: Prim,\n meshPath: string,\n kind: \"visual\" | \"collision\",\n): ExportMesh | null {\n const prim = stage.GetPrimAtPath(meshPath);\n if (!prim) return null;\n\n const points = prim.GetAttribute(\"points\").Get();\n if (!isVec3Array(points) || points.length === 0) return null;\n\n const counts = prim.GetAttribute(\"faceVertexCounts\").Get();\n const indices = prim.GetAttribute(\"faceVertexIndices\").Get();\n const normals = prim.GetAttribute(\"normals\").Get();\n const st = prim.GetAttribute(\"primvars:st\").Get();\n const displayColor = prim.GetAttribute(\"primvars:displayColor\").Get();\n\n const mesh: ExportMesh = {\n name: prim.GetName(),\n kind,\n points: points.slice(),\n faceVertexCounts: isNumberArray(counts) ? counts.slice() : [],\n faceVertexIndices: isNumberArray(indices) ? indices.slice() : [],\n };\n if (isVec3Array(normals) && normals.length === points.length) mesh.normals = normals.slice();\n if (isVec2Array(st) && st.length === points.length) mesh.st = st.slice();\n if (isVec3Array(displayColor) && displayColor[0]) mesh.displayColor = displayColor[0];\n if (prim.GetAttribute(\"doubleSided\").Get() === true) mesh.doubleSided = true;\n\n const transform = relativeTransform(linkPrim, prim);\n if (!isIdentity(transform)) mesh.transform = transform;\n\n const material = readBoundMaterial(stage, prim);\n if (material) mesh.material = material;\n\n if (kind === \"collision\") {\n const approximation = prim.GetAttribute(\"physics:approximation\").Get();\n if (typeof approximation === \"string\" && APPROXIMATIONS.has(approximation)) {\n mesh.collisionApproximation = approximation as CollisionApproximation;\n }\n const physicsMaterial = readBoundPhysicsMaterial(stage, prim);\n if (physicsMaterial) mesh.physicsMaterial = physicsMaterial;\n }\n return mesh;\n}\n\nconst APPROXIMATIONS: ReadonlySet<string> = new Set([\n \"none\",\n \"convexHull\",\n \"convexDecomposition\",\n \"boundingSphere\",\n \"boundingCube\",\n \"meshSimplification\",\n]);\n\n/** `UsdPhysicsMaterialAPI` parameters bound via `material:binding:physics`. */\nfunction readBoundPhysicsMaterial(stage: Stage, prim: Prim): ExportPhysicsMaterial | undefined {\n const target = firstBindingTarget(prim, \"material:binding:physics\");\n if (!target) return undefined;\n const materialPrim = stage.GetPrimAtPath(target);\n if (!materialPrim) return undefined;\n\n const out: ExportPhysicsMaterial = {\n name: target.split(\"/\").filter(Boolean).pop() ?? \"PhysicsMaterial\",\n };\n const read = (attr: string): number | undefined => {\n const v = materialPrim.GetAttribute(attr).Get();\n return typeof v === \"number\" ? v : undefined;\n };\n const staticFriction = read(\"physics:staticFriction\");\n if (staticFriction !== undefined) out.staticFriction = staticFriction;\n const dynamicFriction = read(\"physics:dynamicFriction\");\n if (dynamicFriction !== undefined) out.dynamicFriction = dynamicFriction;\n const restitution = read(\"physics:restitution\");\n if (restitution !== undefined) out.restitution = restitution;\n const density = read(\"physics:density\");\n if (density !== undefined) out.density = density;\n return Object.keys(out).length > 1 ? out : undefined;\n}\n\n/** First target of `relName` on the prim or an ancestor. */\nfunction firstBindingTarget(prim: Prim, relName: string): string | undefined {\n let p: Prim | null = prim;\n while (p) {\n const targets = p.GetRelationship(relName).GetTargets();\n if (targets.length > 0) return targets[0];\n p = p.GetParent();\n }\n return undefined;\n}\n\n/** PBR constants + texture asset paths of the bound material. */\nfunction readBoundMaterial(stage: Stage, prim: Prim): ExportMaterial | undefined {\n const bound = resolveBoundMaterial(stage, prim);\n if (!bound) return undefined;\n const material: ExportMaterial = { name: boundMaterialName(prim) ?? \"Material\" };\n if (bound.color) material.diffuseColor = bound.color;\n if (bound.metalness !== undefined) material.metallic = bound.metalness;\n if (bound.roughness !== undefined) material.roughness = bound.roughness;\n if (bound.opacity !== undefined) material.opacity = bound.opacity;\n if (bound.emissiveColor) material.emissiveColor = bound.emissiveColor;\n\n const textures: Partial<Record<TextureChannel, string>> = {};\n if (bound.colorTexture) textures.color = bound.colorTexture.path;\n if (bound.opacityTexture) textures.opacity = bound.opacityTexture.path;\n if (bound.normalTexture) textures.normal = bound.normalTexture.path;\n if (bound.roughnessTexture) textures.roughness = bound.roughnessTexture.path;\n if (bound.metalnessTexture) textures.metalness = bound.metalnessTexture.path;\n if (bound.occlusionTexture) textures.occlusion = bound.occlusionTexture.path;\n if (bound.emissiveTexture) textures.emissive = bound.emissiveTexture.path;\n if (Object.keys(textures).length > 0) material.textures = textures;\n\n return Object.keys(material).length > 1 ? material : undefined;\n}\n\n/** Leaf name of the first `material:binding` target on the prim or an ancestor. */\nfunction boundMaterialName(prim: Prim): string | undefined {\n let p: Prim | null = prim;\n while (p) {\n const targets = p.GetRelationship(\"material:binding\").GetTargets();\n if (targets.length > 0) return targets[0]!.split(\"/\").filter(Boolean).pop();\n p = p.GetParent();\n }\n return undefined;\n}\n\n/** Accumulated local transform from `linkPrim` (exclusive) down to `meshPrim` (inclusive). */\nfunction relativeTransform(linkPrim: Prim, meshPrim: Prim): Mat4 {\n const chain: Prim[] = [];\n let p: Prim | null = meshPrim;\n const stop = linkPrim.GetPath();\n while (p && p.GetPath() !== stop) {\n chain.push(p);\n p = p.GetParent();\n }\n chain.reverse();\n\n let m = identity4();\n for (const prim of chain) {\n m = multiply(m, computeLocalTransform(prim).matrix);\n }\n return m;\n}\n\nfunction isIdentity(m: Mat4): boolean {\n for (let i = 0; i < 16; i++) {\n if (m[i] !== (i % 5 === 0 ? 1 : 0)) return false;\n }\n return true;\n}\n\nfunction isNumberArray(v: unknown): v is number[] {\n return Array.isArray(v) && v.every((n) => typeof n === \"number\");\n}\n\nfunction isVec3Array(v: unknown): v is Vec3[] {\n return Array.isArray(v) && v.every((e) => Array.isArray(e) && e.length === 3);\n}\n\nfunction isVec2Array(v: unknown): v is Vec2[] {\n return Array.isArray(v) && v.every((e) => Array.isArray(e) && e.length === 2);\n}\n","/**\n * USDZ package writer (M15) — the write-direction counterpart of `openUsdz`.\n *\n * A `.usdz` is a **stored** (uncompressed) zip whose entries' file data must\n * start on 64-byte boundaries; alignment is achieved with padding placed in a\n * local-header extra field (the fflate-sanctioned trick, as used by Three.js's\n * USDZExporter). The first entry is the package's root USD layer — `openUsdz`\n * and other USDZ readers open that one.\n */\n\nimport { type Zippable, strToU8, zipSync } from \"fflate\";\n\nconst USD_ENTRY = /\\.(usda|usdc|usd)$/i;\n/** Private extra-field id used purely as alignment padding. */\nconst PAD_EXTRA_ID = 12345;\n/** Bytes of a zip local file header before the name/extra fields. */\nconst LOCAL_HEADER_SIZE = 30;\n/** An extra field costs 4 header bytes (id + size) plus its data. */\nconst EXTRA_HEADER_SIZE = 4;\n\n/**\n * Pack entries into USDZ bytes. `entries` maps archive paths to file contents\n * (strings are UTF-8 encoded — pass the `serializeUsda` output directly). One\n * entry must be a USD layer (`.usda`/`.usdc`/`.usd`); the first such entry\n * becomes the package root and is moved to the front of the archive.\n */\nexport function writeUsdz(entries: Record<string, Uint8Array | string>): Uint8Array {\n const names = Object.keys(entries);\n const root = names.find((n) => USD_ENTRY.test(n));\n if (!root) {\n throw new Error(\"writeUsdz: entries must include a root USD layer (.usda/.usdc/.usd)\");\n }\n const ordered = [root, ...names.filter((n) => n !== root)];\n\n const files: Zippable = {};\n let offset = 0;\n for (const name of ordered) {\n const raw = entries[name]!;\n const data = typeof raw === \"string\" ? strToU8(raw) : raw;\n const nameLength = strToU8(name).length;\n\n // Where this entry's data would start without an extra field.\n const dataStart = offset + LOCAL_HEADER_SIZE + nameLength;\n if ((dataStart & 63) === 0) {\n files[name] = data;\n offset = dataStart + data.length;\n } else {\n // Pad so the data starts on the next 64-byte boundary past the 4-byte\n // extra-field header.\n const padLength = (64 - ((dataStart + EXTRA_HEADER_SIZE) & 63)) & 63;\n files[name] = [data, { extra: { [PAD_EXTRA_ID]: new Uint8Array(padLength) } }];\n offset = dataStart + EXTRA_HEADER_SIZE + padLength + data.length;\n }\n }\n\n return zipSync(files, { level: 0 });\n}\n","/**\n * Simulation-readiness checks for a {@link RobotDescription} (M16).\n *\n * Validates what Isaac Sim's Asset Validator cares about that is visible from\n * the IR (plus, optionally, the export geometry): graph connectivity, limit\n * sanity, mass properties, and collision setup. `error` issues break\n * simulation; `warning` issues are quality gaps a physics engine tolerates\n * but misbehaves on.\n */\n\nimport type { RobotGeometryProvider } from \"../export/GeometryProvider.js\";\nimport { decomposeRigid } from \"../kinematics/transforms.js\";\nimport type { RobotDescription } from \"./RobotDescription.js\";\nimport { buildKinematicTree } from \"./buildKinematicTree.js\";\n\nexport type ValidationSeverity = \"error\" | \"warning\";\n\nexport type ValidationIssue = {\n severity: ValidationSeverity;\n /** Stable machine-readable code (e.g. `unknown-link`, `no-collision`). */\n code: string;\n message: string;\n /** Link or joint key the issue refers to, when applicable. */\n subject?: string;\n};\n\nexport type ValidateRobotOptions = {\n /** Enables mesh-level checks (collision presence / approximation). */\n geometry?: RobotGeometryProvider;\n};\n\n/** Check a robot IR for simulation-readiness; returns errors first. */\nexport function validateRobotDescription(\n desc: RobotDescription,\n options: ValidateRobotOptions = {},\n): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n const add = (severity: ValidationSeverity, code: string, message: string, subject?: string) =>\n issues.push({ severity, code, message, ...(subject !== undefined ? { subject } : {}) });\n\n if (Object.keys(desc.links).length === 0) {\n add(\"error\", \"no-links\", \"robot has no links\");\n }\n\n for (const [key, joint] of Object.entries(desc.joints)) {\n if (joint.parent !== \"\" && !desc.links[joint.parent]) {\n add(\n \"error\",\n \"unknown-link\",\n `joint \"${key}\" references unknown parent \"${joint.parent}\"`,\n key,\n );\n }\n if (!desc.links[joint.child]) {\n add(\"error\", \"unknown-link\", `joint \"${key}\" references unknown child \"${joint.child}\"`, key);\n }\n if (joint.lower !== undefined && joint.upper !== undefined && joint.lower > joint.upper) {\n add(\n \"error\",\n \"invalid-limits\",\n `joint \"${key}\" lower limit ${joint.lower} exceeds upper ${joint.upper}`,\n key,\n );\n }\n if (\n joint.initialValue !== undefined &&\n ((joint.lower !== undefined && joint.initialValue < joint.lower) ||\n (joint.upper !== undefined && joint.initialValue > joint.upper))\n ) {\n add(\n \"warning\",\n \"initial-out-of-limits\",\n `joint \"${key}\" initial value ${joint.initialValue} is outside its limits`,\n key,\n );\n }\n const frames = [\n [\"jointFrame0\", joint.jointFrame0],\n [\"jointFrame1\", joint.jointFrame1],\n ] as const;\n for (const [label, frame] of frames) {\n if (!decomposeRigid(frame).rigid) {\n add(\n \"warning\",\n \"non-rigid-frame\",\n `joint \"${key}\" ${label} carries scale/shear/reflection (discarded on export)`,\n key,\n );\n }\n }\n }\n\n const tree = buildKinematicTree(desc);\n for (const jointKey of tree.loopJoints) {\n add(\n \"warning\",\n \"closed-loop\",\n `joint \"${jointKey}\" closes a kinematic loop (dropped from the spanning tree)`,\n jointKey,\n );\n }\n for (const linkKey of tree.isolatedLinks) {\n add(\n \"warning\",\n \"isolated-link\",\n `link \"${linkKey}\" is unreachable from root \"${tree.root}\"`,\n linkKey,\n );\n }\n if ((desc.articulationRoots ?? []).length === 0 && !tree.rootJoint) {\n add(\n \"warning\",\n \"no-articulation-root\",\n \"no ArticulationRootAPI link and no world-fixed joint — the base will float\",\n );\n }\n\n for (const [key, link] of Object.entries(desc.links)) {\n const inertial = link.inertial;\n if (!inertial || (inertial.mass === undefined && inertial.density === undefined)) {\n add(\"warning\", \"no-inertial\", `link \"${key}\" has no mass or density (PhysicsMassAPI)`, key);\n }\n if (inertial?.mass !== undefined && inertial.mass <= 0) {\n add(\"error\", \"bad-mass\", `link \"${key}\" has non-positive mass ${inertial.mass}`, key);\n }\n if (inertial?.diagonalInertia?.some((v) => v < 0)) {\n add(\"error\", \"bad-inertia\", `link \"${key}\" has a negative diagonal-inertia component`, key);\n }\n if (inertial?.principalAxes && !inertial.diagonalInertia) {\n add(\n \"warning\",\n \"inertia-pairing\",\n `link \"${key}\" authors principalAxes without diagonalInertia (dropped on export)`,\n key,\n );\n }\n\n if (options.geometry) {\n const meshes = options.geometry(key, link);\n const collisions = meshes.filter((mesh) => mesh.kind === \"collision\");\n if (collisions.length === 0) {\n add(\"warning\", \"no-collision\", `link \"${key}\" has no collision geometry`, key);\n }\n for (const mesh of collisions) {\n if (!mesh.collisionApproximation) {\n add(\n \"warning\",\n \"collision-approximation\",\n `link \"${key}\" collision mesh \"${mesh.name}\" has no physics:approximation (PhysX dynamic bodies need a convex or primitive approximation)`,\n key,\n );\n }\n }\n }\n }\n\n return issues.sort((a, b) => (a.severity === b.severity ? 0 : a.severity === \"error\" ? -1 : 1));\n}\n"]}
|