neogestify-ui-components 1.2.21 → 2.0.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.
Files changed (52) hide show
  1. package/README.md +393 -2
  2. package/dist/components/VenueMapEditor/index.d.mts +202 -0
  3. package/dist/components/VenueMapEditor/index.d.ts +202 -0
  4. package/dist/components/VenueMapEditor/index.js +2684 -0
  5. package/dist/components/VenueMapEditor/index.js.map +1 -0
  6. package/dist/components/VenueMapEditor/index.mjs +2676 -0
  7. package/dist/components/VenueMapEditor/index.mjs.map +1 -0
  8. package/dist/components/alerts/index.js.map +1 -1
  9. package/dist/components/alerts/index.mjs.map +1 -1
  10. package/dist/components/html/index.d.mts +2 -0
  11. package/dist/components/html/index.d.ts +2 -0
  12. package/dist/components/html/index.js +24 -58
  13. package/dist/components/html/index.js.map +1 -1
  14. package/dist/components/html/index.mjs +24 -58
  15. package/dist/components/html/index.mjs.map +1 -1
  16. package/dist/components/icons/index.d.mts +18 -2
  17. package/dist/components/icons/index.d.ts +18 -2
  18. package/dist/components/icons/index.js +97 -11
  19. package/dist/components/icons/index.js.map +1 -1
  20. package/dist/components/icons/index.mjs +82 -12
  21. package/dist/components/icons/index.mjs.map +1 -1
  22. package/dist/context/theme/index.js.map +1 -1
  23. package/dist/context/theme/index.mjs.map +1 -1
  24. package/dist/index.d.mts +2 -1
  25. package/dist/index.d.ts +2 -1
  26. package/dist/index.js +2734 -69
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.mjs +2713 -71
  29. package/dist/index.mjs.map +1 -1
  30. package/package.json +9 -4
  31. package/src/components/VenueMapEditor/VenueMapEditor.tsx +851 -0
  32. package/src/components/VenueMapEditor/VenueMapViewer.tsx +13 -0
  33. package/src/components/VenueMapEditor/components/Artboard.tsx +405 -0
  34. package/src/components/VenueMapEditor/components/EditorCanvas.tsx +472 -0
  35. package/src/components/VenueMapEditor/components/ElementNode.tsx +357 -0
  36. package/src/components/VenueMapEditor/components/FloorTabs.tsx +137 -0
  37. package/src/components/VenueMapEditor/components/GridOverlay.tsx +67 -0
  38. package/src/components/VenueMapEditor/components/PropertiesPanel.tsx +198 -0
  39. package/src/components/VenueMapEditor/components/Toolbar.tsx +254 -0
  40. package/src/components/VenueMapEditor/components/WallLayer.tsx +117 -0
  41. package/src/components/VenueMapEditor/hooks/useDrag.ts +79 -0
  42. package/src/components/VenueMapEditor/hooks/useHistory.ts +74 -0
  43. package/src/components/VenueMapEditor/hooks/usePanZoom.ts +114 -0
  44. package/src/components/VenueMapEditor/hooks/useSelection.ts +42 -0
  45. package/src/components/VenueMapEditor/index.ts +34 -0
  46. package/src/components/VenueMapEditor/types.ts +173 -0
  47. package/src/components/VenueMapEditor/utils/idGen.ts +2 -0
  48. package/src/components/VenueMapEditor/utils/snapUtils.ts +38 -0
  49. package/src/components/VenueMapEditor/utils/wallGeometry.ts +83 -0
  50. package/src/components/html/Input.tsx +48 -80
  51. package/src/components/icons/icons.tsx +153 -14
  52. package/src/index.ts +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/icons/icons.tsx","../../../src/components/VenueMapEditor/components/Toolbar.tsx","../../../src/components/VenueMapEditor/hooks/usePanZoom.ts","../../../src/components/VenueMapEditor/utils/snapUtils.ts","../../../src/components/VenueMapEditor/utils/wallGeometry.ts","../../../src/components/VenueMapEditor/components/GridOverlay.tsx","../../../src/components/VenueMapEditor/hooks/useDrag.ts","../../../src/components/VenueMapEditor/components/Artboard.tsx","../../../src/components/VenueMapEditor/components/WallLayer.tsx","../../../src/components/VenueMapEditor/components/ElementNode.tsx","../../../src/components/VenueMapEditor/components/EditorCanvas.tsx","../../../src/components/VenueMapEditor/components/PropertiesPanel.tsx","../../../src/components/VenueMapEditor/components/FloorTabs.tsx","../../../src/components/VenueMapEditor/hooks/useHistory.ts","../../../src/components/VenueMapEditor/hooks/useSelection.ts","../../../src/components/VenueMapEditor/utils/idGen.ts","../../../src/components/VenueMapEditor/VenueMapEditor.tsx","../../../src/components/VenueMapEditor/VenueMapViewer.tsx"],"names":["jsx","jsxs","Fragment","useRef","useCallback","HANDLE_CURSORS","MIN_SIZE","onMove","useState","panX","panY","zoom","dist","el","useEffect","a","b"],"mappings":";;;;AAmiBO,SAAS,UAAA,CAAW,EAAE,SAAA,EAAU,EAAU;AAC/C,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAsB,IAAA,EAAK,cAAA,EAClD,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,iCAAA,EAAkC,CAAA,EAC5C,CAAA;AAEJ;AAEO,SAAS,QAAA,CAAS,EAAE,SAAA,EAAU,EAAU;AAC7C,EAAA,4BACG,KAAA,EAAA,EAAI,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAsB,MAAK,cAAA,EAClD,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAE,wHAAA,EAAyH,CAAA;AAAA,oBACjI,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,8GAAA,EAA+G;AAAA,GAAA,EACzH,CAAA;AAEJ;AAEO,SAAS,QAAA,CAAS,EAAE,SAAA,EAAU,EAAU;AAC7C,EAAA,2BACG,KAAA,EAAA,EAAI,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAsB,MAAK,cAAA,EAClD,QAAA,kBAAA,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,QAAA,EAAS,SAAA;AAAA,MACT,CAAA,EAAE,sDAAA;AAAA,MACF,QAAA,EAAS,SAAA;AAAA,MACT,OAAA,EAAS;AAAA;AAAA,GACX,EACF,CAAA;AAEJ;AAEO,SAAS,UAAA,CAAW,EAAE,SAAA,EAAU,EAAU;AAC/C,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAsB,IAAA,EAAK,cAAA,EAClD,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,+OAAA,EAAgP,CAAA,EAC1P,CAAA;AAEJ;AAEO,SAAS,WAAA,CAAY,EAAE,SAAA,EAAU,EAAU;AAChD,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAsB,IAAA,EAAK,cAAA,EAClD,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,qLAAA,EAAsL,CAAA,EAChM,CAAA;AAEJ;AAEO,SAAS,SAAA,CAAU,EAAE,SAAA,EAAU,EAAU;AAC9C,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAsB,IAAA,EAAK,cAAA,EAClD,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,oLAAA,EAAqL,CAAA,EAC/L,CAAA;AAEJ;AAEO,SAAS,QAAA,CAAS,EAAE,SAAA,EAAU,EAAU;AAC7C,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAsB,IAAA,EAAK,cAAA,EAClD,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sLAAA,EAAuL,CAAA,EACjM,CAAA;AAEJ;AAEO,SAAS,QAAA,CAAS,EAAE,SAAA,EAAU,EAAU;AAC7C,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAsB,IAAA,EAAK,cAAA,EAClD,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0LAAA,EAA2L,CAAA,EACrM,CAAA;AAEJ;AAEO,SAAS,SAAA,CAAU,EAAE,SAAA,EAAU,EAAU;AAC9C,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAsB,IAAA,EAAK,cAAA,EAClD,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gVAAA,EAAiV,CAAA,EAC3V,CAAA;AAEJ;AAEO,SAAS,SAAA,CAAU,EAAE,SAAA,EAAU,EAAU;AAC9C,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAsB,IAAA,EAAK,cAAA,EAClD,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0QAAA,EAA2Q,CAAA,EACrR,CAAA;AAEJ;AAWO,SAAS,QAAA,CAAS,EAAE,SAAA,EAAU,EAAU;AAC7C,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAsB,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAEpH,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,WAAA,EAAY,GAAA,EAAI,CAAA,EAAE,kBAAA,EAAmB,CAAA;AAAA,oBAC3C,GAAA,CAAC,MAAA,EAAA,EAAK,WAAA,EAAY,GAAA,EAAI,GAAE,kBAAA,EAAmB;AAAA,GAAA,EAC7C,CAAA;AAEJ;AAEO,SAAS,YAAA,CAAa,EAAE,SAAA,EAAU,EAAU;AACjD,EAAA,4BACG,KAAA,EAAA,EAAI,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAsB,MAAK,cAAA,EAClD,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAE,6HAAA,EAA6H,CAAA;AAAA,oBACrI,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,8HAAA,EAA8H;AAAA,GAAA,EACxI,CAAA;AAEJ;AAEO,SAAS,UAAA,CAAW,EAAE,SAAA,EAAU,EAAU;AAC/C,EAAA,4BACG,KAAA,EAAA,EAAI,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAsB,MAAK,cAAA,EAClD,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAE,6HAAA,EAA6H,CAAA;AAAA,oBACrI,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,6HAAA,EAA6H;AAAA,GAAA,EACvI,CAAA;AAEJ;AAeO,SAAS,UAAA,CAAW,EAAE,SAAA,EAAU,EAAU;AAC/C,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAsB,IAAA,EAAK,cAAA,EAClD,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,kUAAA,EAAkU,CAAA,EAC5U,CAAA;AAEJ;AC/pBA,SAAS,WAAW,EAAE,MAAA,EAAQ,UAAU,KAAA,EAAO,OAAA,EAAS,UAAS,EAAoB;AACnF,EAAA,uBACEA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA,EAAW;AAAA,QACT,oHAAA;AAAA,QACA,SACI,gDAAA,GACA;AAAA,OACN,CAAE,KAAK,GAAG,CAAA;AAAA,MAET;AAAA;AAAA,GACH;AAEJ;AAEA,SAAS,GAAA,GAAM;AACb,EAAA,uBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,CAAA;AACrD;AA6CA,SAAS,QAAA,CAAS,EAAE,OAAA,EAAS,MAAA,EAAQ,SAAQ,EAAkB;AAC7D,EAAA,uBACEC,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,OAAA;AAAA,MACA,SAAA,EAAW;AAAA,QACT,gGAAA;AAAA,QACA,SACI,sDAAA,GACA;AAAA,OACN,CAAE,KAAK,GAAG,CAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,iCAAA;AAAA,YACV,KAAA,EAAO,EAAE,UAAA,EAAY,OAAA,CAAQ,OAAO,MAAA,EAAQ,CAAA,UAAA,EAAa,OAAA,CAAQ,WAAW,CAAA,CAAA;AAAG;AAAA,SACjF;AAAA,QACC,OAAA,CAAQ;AAAA;AAAA;AAAA,GACX;AAEJ;AAIO,SAAS,OAAA,CAAQ;AAAA,EACtB,IAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,uBAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAAiB;AACf,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qEAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EAEb,QAAA,EAAA;AAAA,sBAAAD,IAAC,UAAA,EAAA,EAAW,KAAA,EAAM,iBAAA,EAAkB,MAAA,EAAQ,SAAS,QAAA,EAAU,OAAA,EAAS,MAAM,YAAA,CAAa,QAAQ,CAAA,EACjG,QAAA,kBAAAA,IAAC,UAAA,EAAA,EAAW,SAAA,EAAU,WAAU,CAAA,EAClC,CAAA;AAAA,sBACAA,GAAAA,CAAC,UAAA,EAAA,EAAW,OAAM,eAAA,EAAgB,MAAA,EAAQ,SAAS,KAAA,EAAO,OAAA,EAAS,MAAM,YAAA,CAAa,KAAK,CAAA,EACzF,QAAA,kBAAAA,IAAC,QAAA,EAAA,EAAS,SAAA,EAAU,WAAU,CAAA,EAChC,CAAA;AAAA,sBACAA,GAAAA,CAAC,UAAA,EAAA,EAAW,OAAM,mBAAA,EAAoB,MAAA,EAAQ,SAAS,MAAA,EAAQ,OAAA,EAAS,MAAM,YAAA,CAAa,MAAM,CAAA,EAC/F,QAAA,kBAAAA,IAAC,QAAA,EAAA,EAAS,SAAA,EAAU,WAAU,CAAA,EAChC,CAAA;AAAA,sBACAA,GAAAA,CAAC,UAAA,EAAA,EAAW,OAAM,sBAAA,EAAuB,MAAA,EAAQ,SAAS,OAAA,EAAS,OAAA,EAAS,MAAM,YAAA,CAAa,OAAO,CAAA,EACpG,QAAA,kBAAAA,IAAC,SAAA,EAAA,EAAU,SAAA,EAAU,WAAU,CAAA,EACjC,CAAA;AAAA,sBACAA,GAAAA,CAAC,UAAA,EAAA,EAAW,OAAM,YAAA,EAAa,MAAA,EAAQ,SAAS,OAAA,EAAS,OAAA,EAAS,MAAM,YAAA,CAAa,OAAO,CAAA,EAC1F,QAAA,kBAAAA,IAAC,SAAA,EAAA,EAAU,SAAA,EAAU,WAAU,CAAA,EACjC,CAAA;AAAA,sBAEAA,IAAC,GAAA,EAAA,EAAI,CAAA;AAAA,sBAGLA,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAM,qBAAoB,QAAA,EAAU,CAAC,OAAA,EAAS,OAAA,EAAS,QACjE,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,WAAU,CAAA,EAChC,CAAA;AAAA,sBACAA,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAM,oBAAmB,QAAA,EAAU,CAAC,OAAA,EAAS,OAAA,EAAS,QAChE,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,WAAU,CAAA,EAChC,CAAA;AAAA,sBAEAA,IAAC,GAAA,EAAA,EAAI,CAAA;AAAA,sBAGLA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,WAAW,uBAAA,GAAuB,uBAAA;AAAA,UACzC,MAAA,EAAQ,QAAA;AAAA,UACR,OAAA,EAAS,YAAA;AAAA,UAET,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,OAChC;AAAA,sBAEAA,IAAC,GAAA,EAAA,EAAI,CAAA;AAAA,sBAGLA,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAM,aAAA,EAAc,OAAA,EAAS,QAAA,EACvC,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,SAAA,EAAU,CAAA,EAClC,CAAA;AAAA,sBACAC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kEAAA,EACb,QAAA,EAAA;AAAA,QAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,QAAE;AAAA,OAAA,EAC1B,CAAA;AAAA,sBACAD,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAM,YAAA,EAAa,OAAA,EAAS,SAAA,EACtC,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU,CAAA,EACnC,CAAA;AAAA,sBACAA,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAM,mBAAA,EAAoB,OAAA,EAAS,WAAA,EAC7C,QAAA,kBAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU,CAAA,EACjC,CAAA;AAAA,sBAEAA,IAAC,GAAA,EAAA,EAAI,CAAA;AAAA,sBAGLA,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAM,sBAAqB,OAAA,EAAS,MAAM,WAAA,IAAc,EAClE,QAAA,kBAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,WAAU,CAAA,EACpC,CAAA;AAAA,sBACAA,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAM,sBAAqB,OAAA,EAAS,MAAM,WAAA,IAAc,EAClE,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,WAAU,CAAA,EAClC,CAAA;AAAA,sBAGAA,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAM,2CAAuC,OAAA,EAAS,MAAM,aAAA,IAAgB,EACtF,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,WAAU,CAAA,EAClC,CAAA;AAAA,MAEC,SAAA,KAAc,MAAA,oBACbC,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAD,IAAC,GAAA,EAAA,EAAI,CAAA;AAAA,wBACLA,IAAC,UAAA,EAAA,EAAW,KAAA,EAAO,cAAc,SAAA,GAAY,yBAAA,GAAyB,yBAAsB,OAAA,EAAS,MAAM,qBAAoB,EAC7H,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAuB,QAAA,EAAA,SAAA,KAAc,SAAA,GAAY,MAAA,GAAS,MAAA,EAAO,CAAA,EACnF;AAAA,OAAA,EACF;AAAA,KAAA,EAEJ,CAAA;AAAA,IAGC,SAAS,OAAA,oBACRA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gFAAA,EACZ,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,OAAO,EAAA,qBACzBC,IAAAA,CAAC,KAAA,EAAA,EAAmB,WAAU,4BAAA,EAE3B,QAAA,EAAA;AAAA,MAAA,EAAA,GAAK,CAAA,oBACJD,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qCAAA,EAAsC,CAAA;AAAA,sBAGvDC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sEAAA,EACb,gBAAM,IAAA,EACT,CAAA;AAAA,QACC,CAAC,KAAA,CAAM,MAAA,IAAU,oBAAA,oBAChBA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,CAAA,gBAAA,EAAmB,KAAA,CAAM,IAAI,CAAA,CAAA,CAAA;AAAA,YACpC,OAAA,EAAS,MAAM,oBAAA,CAAqB,KAAA,CAAM,EAAE,CAAA;AAAA,YAC5C,SAAA,EAAU,iFAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EAEJ,CAAA;AAAA,sBAEAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCACZ,QAAA,EAAA,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAA,OAAA,qBACfA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,OAAA;AAAA,UACA,MAAA,EAAQ,sBAAsB,OAAA,CAAQ,EAAA;AAAA,UACtC,OAAA,EAAS,MAAM,uBAAA,CAAwB,OAAA,CAAQ,EAAE;AAAA,SAAA;AAAA,QAH5C,OAAA,CAAQ;AAAA,OAKhB,CAAA,EACH;AAAA,KAAA,EAAA,EA9BQ,KAAA,CAAM,EA+BhB,CACD,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACpPA,IAAM,QAAA,GAAW,GAAA;AACjB,IAAM,QAAA,GAAW,EAAA;AACjB,IAAM,WAAA,GAAc,GAAA;AAEb,SAAS,UAAA,CAAW,WAAA,GAAc,CAAA,EAAG,YAAA,GAAe,KAAA,EAAO;AAChE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAA,CAAuB;AAAA,IAC/C,IAAA,EAAM,EAAA;AAAA,IACN,IAAA,EAAM,EAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACP,CAAA;AAGD,EAAA,MAAM,YAAA,GAAe,OAAO,KAAK,CAAA;AACjC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,aAAa,MAAA,CAAO,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAGxC,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,CAAC,CAAA,KAAsC;AAKrE,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,cAAc,CAAA,GAAI,WAAA;AAIhD,IAAA,MAAM,QAAQ,CAAA,CAAE,aAAA;AAChB,IAAA,MAAM,IAAA,GAAO,MAAM,qBAAA,EAAsB;AACzC,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,IAAA;AAChC,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,GAAA;AAEhC,IAAA,QAAA,CAAS,CAAA,IAAA,KAAQ;AACf,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,IAAA,CAAK,IAAI,QAAA,EAAU,IAAA,CAAK,IAAA,GAAO,MAAM,CAAC,CAAA;AAEzE,MAAA,MAAM,OAAA,GAAA,CAAW,MAAA,GAAS,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA;AAC5C,MAAA,MAAM,OAAA,GAAA,CAAW,MAAA,GAAS,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA;AAC5C,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,SAAS,OAAA,GAAU,OAAA;AAAA,QACzB,IAAA,EAAM,SAAS,OAAA,GAAU,OAAA;AAAA,QACzB,IAAA,EAAM;AAAA,OACR;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,CAAC,CAAA,KAAsC;AACzE,IAAA,MAAM,KAAA,GAAQ,eAAgB,CAAA,CAAE,MAAA,KAAW,KAAK,CAAA,CAAE,MAAA,KAAW,CAAA,GAAK,CAAA,CAAE,MAAA,KAAW,CAAA;AAC/E,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,UAAA,CAAW,UAAU,EAAE,CAAA,EAAG,EAAE,OAAA,EAAS,CAAA,EAAG,EAAE,OAAA,EAAQ;AAAA,EACpD,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,CAAC,CAAA,KAAsC;AACzE,IAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AAC3B,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,CAAA;AAC1C,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,CAAA;AAC1C,IAAA,UAAA,CAAW,UAAU,EAAE,CAAA,EAAG,EAAE,OAAA,EAAS,CAAA,EAAG,EAAE,OAAA,EAAQ;AAClD,IAAA,QAAA,CAAS,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,EAAA,EAAI,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,EAAA,EAAG,CAAE,CAAA;AAAA,EAC5E,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,CAAC,EAAA,KAAuC;AAClE,IAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AAC3B,IAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AACvB,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAA,GAAmB,YAAY,MAAM;AACzC,IAAA,IAAI,aAAa,OAAA,EAAS;AACxB,MAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AACvB,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,CAAC,MAAA,EAAgB,IAAa,EAAA,KAAgB;AACvE,IAAA,QAAA,CAAS,CAAA,IAAA,KAAQ;AACf,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,IAAA,CAAK,IAAI,QAAA,EAAU,IAAA,CAAK,IAAA,GAAO,MAAM,CAAC,CAAA;AACzE,MAAA,IAAI,EAAA,KAAO,MAAA,IAAa,EAAA,KAAO,MAAA,EAAW;AACxC,QAAA,MAAM,OAAA,GAAA,CAAW,EAAA,GAAK,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA;AACxC,QAAA,MAAM,OAAA,GAAA,CAAW,EAAA,GAAK,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA;AACxC,QAAA,OAAO,EAAE,IAAA,EAAM,EAAA,GAAK,OAAA,GAAU,OAAA,EAAS,MAAM,EAAA,GAAK,OAAA,GAAU,OAAA,EAAS,IAAA,EAAM,OAAA,EAAQ;AAAA,MACrF;AACA,MAAA,OAAO,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,IAClC,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAY,YAAY,MAAM;AAClC,IAAA,QAAA,CAAS,EAAE,IAAA,EAAM,EAAA,EAAI,MAAM,EAAA,EAAI,IAAA,EAAM,GAAG,CAAA;AAAA,EAC1C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA,EAAe,OAAA;AAAA,IACf,gBAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACF;;;AChHO,IAAM,UAAA,GAAa,CAAC,KAAA,EAAe,QAAA,KACxC,KAAK,KAAA,CAAM,KAAA,GAAQ,QAAQ,CAAA,GAAI;AAG1B,IAAM,SAAA,GAAY,CACvB,CAAA,EACA,CAAA,EACA,UACA,OAAA,MAC8B;AAAA,EAC9B,CAAA,EAAG,OAAA,GAAU,UAAA,CAAW,CAAA,EAAG,QAAQ,CAAA,GAAI,CAAA;AAAA,EACvC,CAAA,EAAG,OAAA,GAAU,UAAA,CAAW,CAAA,EAAG,QAAQ,CAAA,GAAI;AACzC,CAAA;AAMO,IAAM,eAAA,GAAkB,CAC7B,CAAA,EACA,CAAA,EACA,OACA,SAAA,KACgD;AAChD,EAAA,IAAI,IAAA,GAAoD,IAAA;AACxD,EAAA,IAAI,QAAA,GAAW,SAAA;AAEf,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAC,CAAA;AAC9C,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,IAAA,GAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;;;ACjCA,SAAS,KAAK,CAAA,EAAe;AAC3B,EAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC/B,EAAA,OAAO,MAAM,KAAA,GAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE,GAAI,EAAE,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA,EAAK,CAAA,EAAG,CAAA,CAAE,IAAI,GAAA,EAAI;AACrE;AAGA,SAAS,KAAK,CAAA,EAAe;AAAE,EAAA,OAAO,EAAE,CAAA,EAAG,CAAC,EAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAE;AAAG;AAE3D,SAAS,GAAA,CAAI,GAAS,CAAA,EAAe;AAAE,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,EAAE;AAAG;AAE9E,SAAS,KAAA,CAAM,GAAS,CAAA,EAAiB;AAAE,EAAA,OAAO,EAAE,GAAG,CAAA,CAAE,CAAA,GAAI,GAAG,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAE;AAAG;AAM9E,SAAS,aAAA,CAAc,EAAA,EAAU,EAAA,EAAU,EAAA,EAAU,EAAA,EAAuB;AAC1E,EAAA,MAAM,MAAM,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,GAAI,EAAA,CAAG,IAAI,EAAA,CAAG,CAAA;AACpC,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,MAAM,OAAO,IAAA;AACjC,EAAA,MAAM,EAAA,GAAK,GAAG,CAAA,GAAI,EAAA,CAAG,GAAG,EAAA,GAAK,EAAA,CAAG,IAAI,EAAA,CAAG,CAAA;AACvC,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,IAAK,GAAA;AACpC,EAAA,OAAO,EAAE,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,CAAA,GAAI,EAAA,CAAG,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,CAAA,GAAI,EAAA,CAAG,CAAA,EAAE;AAClD;AAcO,SAAS,gBACd,EAAA,EAAY,EAAA,EACZ,IAAY,EAAA,EACZ,SAAA,EACA,WACA,SAAA,EACQ;AACR,EAAA,MAAM,GAAA,GAAM,KAAK,EAAE,CAAA,EAAG,KAAK,EAAA,EAAI,CAAA,EAAG,EAAA,GAAK,EAAA,EAAI,CAAA;AAC3C,EAAA,MAAM,CAAA,GAAM,KAAK,GAAG,CAAA;AACpB,EAAA,MAAM,IAAM,SAAA,GAAY,CAAA;AACxB,EAAA,MAAM,CAAA,GAAU,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAC/B,EAAA,MAAM,CAAA,GAAU,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAG/B,EAAA,IAAI,KAAK,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,CAAA,EAAI,CAAC,CAAC,CAAA;AAC5B,EAAA,IAAI,KAAK,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAC5B,EAAA,IAAI,KAAK,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,CAAA,EAAI,CAAC,CAAC,CAAA;AAC5B,EAAA,IAAI,KAAK,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAI5B,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,EAAA,GAAK,KAAK,SAAS,CAAA;AACzB,IAAA,MAAM,KAAK,aAAA,CAAc,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,GAAI,CAAC,CAAC,CAAA,EAAG,GAAA,EAAK,IAAI,CAAA,EAAG,KAAA,CAAM,IAAK,CAAC,CAAC,GAAG,SAAS,CAAA;AACpF,IAAA,MAAM,KAAK,aAAA,CAAc,GAAA,CAAI,GAAG,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAC,GAAG,GAAA,EAAK,GAAA,CAAI,GAAG,KAAA,CAAM,EAAA,EAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAAA;AACpF,IAAA,IAAI,IAAI,EAAA,GAAK,EAAA;AACb,IAAA,IAAI,IAAI,EAAA,GAAK,EAAA;AAAA,EACf;AAIA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,EAAA,GAAK,KAAK,SAAS,CAAA;AACzB,IAAA,MAAM,KAAK,aAAA,CAAc,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,GAAI,CAAC,CAAC,CAAA,EAAG,GAAA,EAAK,IAAI,CAAA,EAAG,KAAA,CAAM,IAAK,CAAC,CAAC,GAAG,SAAS,CAAA;AACpF,IAAA,MAAM,KAAK,aAAA,CAAc,GAAA,CAAI,GAAG,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAC,GAAG,GAAA,EAAK,GAAA,CAAI,GAAG,KAAA,CAAM,EAAA,EAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAAA;AACpF,IAAA,IAAI,IAAI,EAAA,GAAK,EAAA;AACb,IAAA,IAAI,IAAI,EAAA,GAAK,EAAA;AAAA,EACf;AAEA,EAAA,OAAO,CAAA,EAAA,EAAK,GAAG,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,CAAA,GAAA,EAAM,EAAA,CAAG,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,CAAC,CAAA,GAAA,EAAM,EAAA,CAAG,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,CAAC,MAAM,EAAA,CAAG,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,CAAC,CAAA,EAAA,CAAA;AAChF;ACjEO,SAAS,WAAA,CAAY,EAAE,QAAA,EAAS,EAAqB;AAC1D,EAAA,MAAM,YAAY,QAAA,GAAW,CAAA;AAE7B,EAAA,uBACEC,IAAAA,CAAAC,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAD,KAAC,MAAA,EAAA,EAEC,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAG,gBAAA;AAAA,UACH,KAAA,EAAO,QAAA;AAAA,UACP,MAAA,EAAQ,QAAA;AAAA,UACR,YAAA,EAAa,gBAAA;AAAA,UAEb,QAAA,kBAAAA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,CAAA,EAAG,CAAA,EAAA,EAAK,QAAQ,CAAA,WAAA,EAAc,QAAQ,CAAA,CAAA;AAAA,cACtC,IAAA,EAAK,MAAA;AAAA,cACL,MAAA,EAAO,SAAA;AAAA,cACP,WAAA,EAAa;AAAA;AAAA;AACf;AAAA,OACF;AAAA,sBAGAC,IAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAG,gBAAA;AAAA,UACH,KAAA,EAAO,SAAA;AAAA,UACP,MAAA,EAAQ,SAAA;AAAA,UACR,YAAA,EAAa,gBAAA;AAAA,UAEb,QAAA,EAAA;AAAA,4BAAAD,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO,SAAA;AAAA,gBACP,MAAA,EAAQ,SAAA;AAAA,gBACR,IAAA,EAAK;AAAA;AAAA,aACP;AAAA,4BACAA,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,CAAA,EAAG,CAAA,EAAA,EAAK,SAAS,CAAA,WAAA,EAAc,SAAS,CAAA,CAAA;AAAA,gBACxC,IAAA,EAAK,MAAA;AAAA,gBACL,MAAA,EAAO,SAAA;AAAA,gBACP,WAAA,EAAa;AAAA;AAAA;AACf;AAAA;AAAA;AACF,KAAA,EACF,CAAA;AAAA,oBAEAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAG,IAAA;AAAA,QACH,CAAA,EAAG,IAAA;AAAA,QACH,KAAA,EAAO,GAAA;AAAA,QACP,MAAA,EAAQ,GAAA;AAAA,QACR,IAAA,EAAK;AAAA;AAAA;AACP,GAAA,EACF,CAAA;AAEJ;AC5CO,SAAS,OAAA,CACd,MAAA,EACA,UAAA,EACA,SAAA,EACA;AAEA,EAAA,MAAM,KAAA,GAAQG,OAAO,SAAS,CAAA;AAC9B,EAAA,KAAA,CAAM,OAAA,GAAU,SAAA;AAEhB,EAAA,MAAM,aAAaA,MAAAA,CAAO,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAGxC,EAAA,MAAM,QAAA,GAAWC,WAAAA;AAAA,IACf,CAAC,SAAiB,OAAA,KAA8C;AAC9D,MAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAS,qBAAA,MAA2B,EAAE,IAAA,EAAM,CAAA,EAAG,GAAA,EAAK,CAAA,EAAE;AAC1E,MAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,KAAS,UAAA,CAAW,OAAA;AACxC,MAAA,OAAO;AAAA,QACL,CAAA,EAAA,CAAI,OAAA,GAAU,IAAA,CAAK,IAAA,GAAO,IAAA,IAAQ,IAAA;AAAA,QAClC,CAAA,EAAA,CAAI,OAAA,GAAU,IAAA,CAAK,GAAA,GAAM,IAAA,IAAQ;AAAA,OACnC;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAQ,UAAU;AAAA,GACrB;AAEA,EAAA,MAAM,eAAA,GAAkBA,WAAAA;AAAA,IACtB,CAAC,CAAA,KAAuB;AACtB,MAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AACpB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,CAAA,CAAE,cAAA,EAAe;AAEjB,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,CAAA,CAAE,OAAA,EAAS,EAAE,OAAO,CAAA;AAC5C,MAAA,UAAA,CAAW,OAAA,GAAU,MAAA;AACrB,MAAA,KAAA,CAAM,OAAA,CAAQ,WAAA,GAAc,MAAA,CAAO,CAAA,EAAG,OAAO,CAAC,CAAA;AAE9C,MAAA,MAAM,MAAA,GAAS,CAAC,EAAA,KAAmB;AACjC,QAAA,MAAM,CAAA,GAAI,QAAA,CAAS,EAAA,CAAG,OAAA,EAAS,GAAG,OAAO,CAAA;AACzC,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,UAAA,CAAW,OAAA,CAAQ,CAAA;AACpC,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,UAAA,CAAW,OAAA,CAAQ,CAAA;AACpC,QAAA,UAAA,CAAW,OAAA,GAAU,CAAA;AACrB,QAAA,KAAA,CAAM,QAAQ,UAAA,CAAW,EAAA,EAAI,IAAI,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,MAC3C,CAAA;AAEA,MAAA,MAAM,IAAA,GAAO,CAAC,EAAA,KAAmB;AAC/B,QAAA,MAAM,CAAA,GAAI,QAAA,CAAS,EAAA,CAAG,OAAA,EAAS,GAAG,OAAO,CAAA;AACzC,QAAA,KAAA,CAAM,OAAA,CAAQ,SAAA,GAAY,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAClC,QAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,MAAM,CAAA;AAC9C,QAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,IAAI,CAAA;AAAA,MAC5C,CAAA;AAEA,MAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,MAAM,CAAA;AAC3C,MAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,IAAI,CAAA;AAAA,IACzC,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,OAAO,EAAE,eAAA,EAAgB;AAC3B;AClEA,IAAM,cAAA,GAA6C;AAAA,EACjD,EAAA,EAAI,aAAA;AAAA,EACJ,EAAA,EAAI,aAAA;AAAA,EACJ,EAAA,EAAI,aAAA;AAAA,EACJ,EAAA,EAAI,aAAA;AAAA,EACJ,CAAA,EAAG,WAAA;AAAA,EACH,CAAA,EAAG,WAAA;AAAA,EACH,CAAA,EAAG,WAAA;AAAA,EACH,CAAA,EAAG;AACL,CAAA;AAEA,IAAM,QAAA,GAAW,EAAA;AACjB,IAAM,SAAA,GAAY,CAAA;AAiBlB,SAAS,gBAAA,CACP,IAAA,EACA,MAAA,EACA,EAAA,EACA,EAAA,EACW;AACX,EAAA,MAAM,EAAA,GAAK,KAAK,CAAA,IAAK,CAAA;AACrB,EAAA,MAAM,EAAA,GAAK,KAAK,CAAA,IAAK,CAAA;AACrB,EAAA,MAAM,EAAA,GAAK,KAAK,KAAA,IAAS,GAAA;AACzB,EAAA,MAAM,EAAA,GAAK,KAAK,MAAA,IAAU,GAAA;AAE1B,EAAA,MAAM,QAAQ,EAAA,GAAK,EAAA;AACnB,EAAA,MAAM,SAAS,EAAA,GAAK,EAAA;AAEpB,EAAA,IAAI,KAAK,EAAA,EAAI,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,IAAI,EAAA,GAAK,EAAA;AAEpC,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,IAAA;AACH,MAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,EAAA,GAAK,EAAE,CAAA;AAC/B,MAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,EAAA,GAAK,EAAE,CAAA;AAC/B,MAAA,EAAA,GAAK,KAAA,GAAQ,EAAA;AACb,MAAA,EAAA,GAAK,MAAA,GAAS,EAAA;AACd,MAAA;AAAA,IACF,KAAK,GAAA;AACH,MAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,EAAA,GAAK,EAAE,CAAA;AAC/B,MAAA,EAAA,GAAK,MAAA,GAAS,EAAA;AACd,MAAA;AAAA,IACF,KAAK,IAAA;AACH,MAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,EAAA,GAAK,EAAE,CAAA;AAC/B,MAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,EAAA,GAAK,EAAE,CAAA;AAC/B,MAAA,EAAA,GAAK,MAAA,GAAS,EAAA;AACd,MAAA;AAAA,IACF,KAAK,GAAA;AACH,MAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,EAAA,GAAK,EAAE,CAAA;AAC/B,MAAA;AAAA,IACF,KAAK,IAAA;AACH,MAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,EAAA,GAAK,EAAE,CAAA;AAC/B,MAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,EAAA,GAAK,EAAE,CAAA;AAC/B,MAAA;AAAA,IACF,KAAK,GAAA;AACH,MAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,EAAA,GAAK,EAAE,CAAA;AAC/B,MAAA;AAAA,IACF,KAAK,IAAA;AACH,MAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,EAAA,GAAK,EAAE,CAAA;AAC/B,MAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,EAAA,GAAK,EAAE,CAAA;AAC/B,MAAA,EAAA,GAAK,KAAA,GAAQ,EAAA;AACb,MAAA;AAAA,IACF,KAAK,GAAA;AACH,MAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,EAAA,GAAK,EAAE,CAAA;AAC/B,MAAA,EAAA,GAAK,KAAA,GAAQ,EAAA;AACb,MAAA;AAAA;AAGJ,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG;AACxD;AAeA,SAAS,eAAA,CAAgB;AAAA,EACvB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,EAAyB;AACvB,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,IAAU,EAAC;AAC5B,EAAA,MAAM,OAAA,GAAUD,OAAO,IAAI,CAAA;AAC3B,EAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAElB,EAAA,MAAM,YAAA,GAAeA,OAAsB,IAAI,CAAA;AAC/C,EAAA,MAAM,WAAA,GAAcA,MAAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA;AAEzD,EAAA,MAAM,EAAE,eAAA,EAAiB,gBAAA,EAAiB,GAAI,OAAA,CAAQ,QAAQ,UAAA,EAAY;AAAA,IACxE,WAAA,EAAa,CAAC,EAAA,EAAI,EAAA,KAAO;AACvB,MAAA,MAAM,MAAM,YAAA,CAAa,OAAA;AACzB,MAAA,IAAI,QAAQ,IAAA,EAAM;AAClB,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,MAAA,IAAU,EAAC;AAC9C,MAAA,WAAA,CAAY,OAAA,GAAU,EAAE,EAAA,EAAI,UAAA,CAAW,GAAG,CAAA,CAAE,CAAC,CAAA,EAAG,EAAA,EAAI,WAAW,GAAG,CAAA,CAAE,CAAC,CAAA,EAAG,IAAI,EAAA,EAAG;AAAA,IACjF,CAAA;AAAA,IACA,UAAA,EAAY,CAAC,GAAA,EAAK,GAAA,EAAK,SAAS,OAAA,KAAY;AAC1C,MAAA,MAAM,MAAM,YAAA,CAAa,OAAA;AACzB,MAAA,IAAI,QAAQ,IAAA,EAAM;AAClB,MAAA,MAAM,EAAE,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,KAAO,WAAA,CAAY,OAAA;AACvC,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,GAAU,EAAA,CAAA;AAC7B,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,GAAU,EAAA,CAAA;AAC7B,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,MAAA,IAAU,EAAC;AAC9C,MAAA,MAAM,SAAS,UAAA,CAAW,GAAA;AAAA,QAAI,CAAC,GAAG,CAAA,KAChC,CAAA,KAAM,MAAM,CAAC,IAAA,EAAM,IAAI,CAAA,GAAI;AAAA,OAC7B;AACA,MAAA,MAAM,UAAqB,EAAE,GAAG,OAAA,CAAQ,OAAA,EAAS,QAAQ,MAAA,EAAO;AAChE,MAAA,QAAA,CAAS,OAAO,CAAA;AAAA,IAClB,CAAA;AAAA,IACA,WAAW,MAAM;AACf,MAAA,cAAA,GAAiB,QAAQ,OAAO,CAAA;AAChC,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AAAA,IACzB;AAAA,GACD,CAAA;AAED,EAAA,MAAM,eAAA,GAAkBC,WAAAA;AAAA,IACtB,CAAC,GAAoB,GAAA,KAAgB;AACnC,MAAA,YAAA,CAAa,OAAA,GAAU,GAAA;AACvB,MAAA,gBAAA,CAAiB,CAAC,CAAA;AAAA,IACpB,CAAA;AAAA,IACA,CAAC,gBAAgB;AAAA,GACnB;AAEA,EAAA,MAAM,EAAE,eAAA,EAAiB,cAAA,EAAe,GAAI,OAAA,CAAQ,QAAQ,UAAA,EAAY;AAAA,IACtE,UAAA,EAAY,CAAC,EAAA,EAAI,EAAA,KAAO;AACtB,MAAA,MAAA,GAAS,IAAI,EAAE,CAAA;AAAA,IACjB;AAAA,GACD,CAAA;AAED,EAAA,MAAM,kBAAA,GAAqBA,WAAAA;AAAA,IACzB,CAAC,GAAoB,GAAA,KAAgB;AACnC,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,MAAA,IAAU,EAAC;AAC9C,MAAA,IAAI,UAAA,CAAW,UAAU,CAAA,EAAG;AAC5B,MAAA,MAAM,SAAS,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,MAAM,GAAG,CAAA;AACpD,MAAA,MAAM,UAAqB,EAAE,GAAG,OAAA,CAAQ,OAAA,EAAS,QAAQ,MAAA,EAAO;AAChE,MAAA,QAAA,CAAS,OAAO,CAAA;AAChB,MAAA,cAAA,GAAiB,OAAO,CAAA;AAAA,IAC1B,CAAA;AAAA,IACA,CAAC,UAAU,cAAc;AAAA,GAC3B;AAEA,EAAA,MAAM,eAAA,GAAkBA,WAAAA;AAAA,IACtB,CAAC,GAAoB,cAAA,KAA2B;AAC9C,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,MAAA,IAAU,EAAC;AAC9C,MAAA,MAAM,CAAA,GAAI,WAAW,cAAc,CAAA;AACnC,MAAA,MAAM,CAAA,GAAI,UAAA,CAAA,CAAY,cAAA,GAAiB,CAAA,IAAK,WAAW,MAAM,CAAA;AAC7D,MAAA,MAAM,GAAA,GAAwB,CAAA,CAAE,CAAA,CAAE,CAAC,IAAI,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,EAAA,CAAI,EAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,KAAK,CAAC,CAAA;AACnE,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,GAAG,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,iBAAiB,CAAC,CAAA;AAAA,QACzC,GAAA;AAAA,QACA,GAAG,UAAA,CAAW,KAAA,CAAM,cAAA,GAAiB,CAAC;AAAA,OACxC;AACA,MAAA,MAAM,UAAqB,EAAE,GAAG,OAAA,CAAQ,OAAA,EAAS,QAAQ,MAAA,EAAO;AAChE,MAAA,QAAA,CAAS,OAAO,CAAA;AAChB,MAAA,cAAA,GAAiB,OAAO,CAAA;AAAA,IAC1B,CAAA;AAAA,IACA,CAAC,UAAU,cAAc;AAAA,GAC3B;AAEA,EAAA,IAAI,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAE3B,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AAC3D,EAAA,MAAM,KAAK,SAAA,GAAY,IAAA;AACvB,EAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AACjB,EAAA,MAAM,OAAO,CAAA,EAAG,CAAA,GAAI,IAAI,CAAA,CAAA,EAAI,IAAI,IAAI,CAAA,CAAA;AAEpC,EAAA,uBACEH,KAAC,GAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,MAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,qBAAA,EAAsB,CAAA,EAAE,KAAA,EAAM,CAAA,EAAE,KAAA,EAAM,KAAA,EAAM,MAAA,EAAO,MAAA,EAAO,MAAA,EACnE,QAAA,kBAAAA,GAAAA,CAAC,cAAA,EAAA,EAAa,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,GAAI,IAAA,EAAM,YAAA,EAAc,CAAA,GAAI,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,GACjF,CAAA,EACF,CAAA;AAAA,oBAGAA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAK,SAAA;AAAA,QACL,MAAA,EAAO,MAAA;AAAA,QACP,MAAA,EAAO;AAAA;AAAA,KACT;AAAA,oBAGAA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAK,aAAA;AAAA,QACL,MAAA,EAAO,SAAA;AAAA,QACP,WAAA,EAAa,EAAA;AAAA,QACb,eAAA,EAAiB,IAAA;AAAA,QACjB,KAAA,EAAO,EAAE,MAAA,EAAQ,QAAA,GAAW,YAAY,MAAA,EAAO;AAAA,QAC/C,WAAA,EAAa,WAAW,MAAA,GAAY;AAAA;AAAA,KACtC;AAAA,IAEC,CAAC,QAAA,oBACAC,IAAAA,CAAAC,UAAA,EAEG,QAAA,EAAA;AAAA,MAAA,GAAA,CAAI,IAAI,CAAC,CAAC,EAAA,EAAI,EAAE,GAAG,CAAA,KAAM;AACxB,QAAA,MAAM,CAAC,IAAI,EAAE,CAAA,GAAI,KAAK,CAAA,GAAI,CAAA,IAAK,IAAI,MAAM,CAAA;AACzC,QAAA,MAAM,EAAA,GAAA,CAAM,KAAK,EAAA,IAAM,CAAA;AACvB,QAAA,MAAM,EAAA,GAAA,CAAM,KAAK,EAAA,IAAM,CAAA;AACvB,QAAA,uBACEF,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YAEC,CAAA,EAAG,KAAK,EAAA,GAAK,IAAA;AAAA,YACb,CAAA,EAAG,KAAK,EAAA,GAAK,IAAA;AAAA,YACb,OAAO,EAAA,GAAK,GAAA;AAAA,YACZ,QAAQ,EAAA,GAAK,GAAA;AAAA,YACb,IAAA,EAAK,OAAA;AAAA,YACL,MAAA,EAAO,SAAA;AAAA,YACP,WAAA,EAAa,EAAA;AAAA,YACb,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,CAAA,aAAA,CAAA,EAAiB,eAAA,EAAiB,CAAA,EAAG,EAAE,CAAA,GAAA,EAAM,EAAE,CAAA,EAAA,CAAA,EAAK;AAAA,YACxF,OAAA,EAAS,CAAA,CAAA,KAAK,eAAA,CAAgB,CAAA,EAAG,CAAC;AAAA,WAAA;AAAA,UAT7B,OAAO,CAAC,CAAA;AAAA,SAUf;AAAA,MAEJ,CAAC,CAAA;AAAA,MAGA,GAAA,CAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA,EAAG,sBAClBA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UAEC,GAAG,EAAA,GAAK,EAAA;AAAA,UACR,GAAG,EAAA,GAAK,EAAA;AAAA,UACR,OAAO,EAAA,GAAK,CAAA;AAAA,UACZ,QAAQ,EAAA,GAAK,CAAA;AAAA,UACb,IAAI,CAAA,GAAI,IAAA;AAAA,UACR,IAAA,EAAK,OAAA;AAAA,UACL,MAAA,EAAO,SAAA;AAAA,UACP,WAAA,EAAa,EAAA;AAAA,UACb,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA,EAAO;AAAA,UACxB,WAAA,EAAa,CAAA,CAAA,KAAK,eAAA,CAAgB,CAAA,EAAG,CAAC,CAAA;AAAA,UACtC,aAAA,EAAe,CAAA,CAAA,KAAK,kBAAA,CAAmB,CAAA,EAAG,CAAC;AAAA,SAAA;AAAA,QAXtC,KAAK,CAAC,CAAA;AAAA,OAad;AAAA,KAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAKA,SAAS,YAAA,CAAa;AAAA,EACpB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,EAAkB;AAChB,EAAA,MAAM,YAAA,GAAeG,OAA0B,IAAI,CAAA;AACnD,EAAA,MAAM,OAAA,GAAUA,OAAO,IAAI,CAAA;AAC3B,EAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAElB,EAAA,MAAM,EAAE,eAAA,EAAiB,gBAAA,EAAiB,GAAI,OAAA,CAAQ,QAAQ,UAAA,EAAY;AAAA,IACxE,UAAA,EAAY,CAAC,EAAA,EAAI,EAAA,KAAO;AACtB,MAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AAC3B,MAAA,QAAA,CAAS,iBAAiB,OAAA,CAAQ,OAAA,EAAS,aAAa,OAAA,EAAS,EAAA,EAAI,EAAE,CAAC,CAAA;AAAA,IAC1E,CAAA;AAAA,IACA,WAAW,MAAM;AACf,MAAA,cAAA,GAAiB,QAAQ,OAAO,CAAA;AAChC,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AAAA,IACzB;AAAA,GACD,CAAA;AAED,EAAA,MAAM,eAAA,GAAkBC,WAAAA;AAAA,IACtB,CAAC,GAAoB,IAAA,KAAqB;AACxC,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,MAAA,gBAAA,CAAiB,CAAC,CAAA;AAAA,IACpB,CAAA;AAAA,IACA,CAAC,gBAAgB;AAAA,GACnB;AAEA,EAAA,MAAM,EAAE,eAAA,EAAiB,cAAA,EAAe,GAAI,OAAA,CAAQ,QAAQ,UAAA,EAAY;AAAA,IACtE,UAAA,EAAY,CAAC,EAAA,EAAI,EAAA,KAAO;AACtB,MAAA,MAAA,GAAS,IAAI,EAAE,CAAA;AAAA,IACjB;AAAA,GACD,CAAA;AAED,EAAA,MAAM,EAAA,GAAK,KAAK,CAAA,IAAK,CAAA;AACrB,EAAA,MAAM,EAAA,GAAK,KAAK,CAAA,IAAK,CAAA;AACrB,EAAA,MAAM,EAAA,GAAK,KAAK,KAAA,IAAS,GAAA;AACzB,EAAA,MAAM,EAAA,GAAK,KAAK,MAAA,IAAU,GAAA;AAE1B,EAAA,MAAM,KAAK,SAAA,GAAY,IAAA;AACvB,EAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AACjB,EAAA,MAAM,OAAO,CAAA,EAAG,CAAA,GAAI,IAAI,CAAA,CAAA,EAAI,IAAI,IAAI,CAAA,CAAA;AAEpC,EAAA,MAAM,OAAA,GAA+D;AAAA,IACnE,EAAE,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,EAAA,EAAW,IAAI,EAAA,EAAG;AAAA,IACpC,EAAE,MAAM,GAAA,EAAM,EAAA,EAAI,KAAK,EAAA,GAAG,CAAA,EAAG,IAAI,EAAA,EAAG;AAAA,IACpC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAI,EAAA,GAAK,EAAA,EAAM,IAAI,EAAA,EAAG;AAAA,IACpC,EAAE,MAAM,GAAA,EAAM,EAAA,EAAI,KAAK,EAAA,EAAM,EAAA,EAAI,EAAA,GAAK,EAAA,GAAG,CAAA,EAAE;AAAA,IAC3C,EAAE,MAAM,IAAA,EAAM,EAAA,EAAI,KAAK,EAAA,EAAM,EAAA,EAAI,KAAK,EAAA,EAAG;AAAA,IACzC,EAAE,MAAM,GAAA,EAAM,EAAA,EAAI,KAAK,EAAA,GAAG,CAAA,EAAG,EAAA,EAAI,EAAA,GAAK,EAAA,EAAG;AAAA,IACzC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAI,EAAA,EAAW,EAAA,EAAI,KAAK,EAAA,EAAG;AAAA,IACzC,EAAE,MAAM,GAAA,EAAM,EAAA,EAAI,IAAW,EAAA,EAAI,EAAA,GAAK,KAAG,CAAA;AAAE,GAC7C;AAEA,EAAA,uBACEH,KAAC,GAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,MAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,YAAO,EAAA,EAAG,qBAAA,EAAsB,CAAA,EAAE,KAAA,EAAM,GAAE,KAAA,EAAM,KAAA,EAAM,MAAA,EAAO,MAAA,EAAO,QACnE,QAAA,kBAAAA,GAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,CAAA;AAAA,QACJ,IAAI,CAAA,GAAI,IAAA;AAAA,QACR,cAAc,CAAA,GAAI,IAAA;AAAA,QAClB,YAAA,EAAc;AAAA;AAAA,OAElB,CAAA,EACF,CAAA;AAAA,oBAEAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAG,EAAA;AAAA,QACH,CAAA,EAAG,EAAA;AAAA,QACH,KAAA,EAAO,EAAA;AAAA,QACP,MAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAK,SAAA;AAAA,QACL,MAAA,EAAO,MAAA;AAAA,QACP,MAAA,EAAO;AAAA;AAAA,KACT;AAAA,oBAEAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAG,EAAA;AAAA,QACH,CAAA,EAAG,EAAA;AAAA,QACH,KAAA,EAAO,EAAA;AAAA,QACP,MAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAK,aAAA;AAAA,QACL,MAAA,EAAO,SAAA;AAAA,QACP,WAAA,EAAa,EAAA;AAAA,QACb,eAAA,EAAiB,IAAA;AAAA,QACjB,KAAA,EAAO,EAAE,MAAA,EAAQ,QAAA,GAAW,YAAY,MAAA,EAAO;AAAA,QAC/C,WAAA,EAAa,WAAW,MAAA,GAAY;AAAA;AAAA,KACtC;AAAA,IAEC,CAAC,QAAA,IACA,OAAA,CAAQ,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,EAAA,EAAI,EAAA,EAAG,qBAC1BA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QAEC,GAAG,EAAA,GAAK,EAAA;AAAA,QACR,GAAG,EAAA,GAAK,EAAA;AAAA,QACR,OAAO,EAAA,GAAK,CAAA;AAAA,QACZ,QAAQ,EAAA,GAAK,CAAA;AAAA,QACb,IAAI,CAAA,GAAI,IAAA;AAAA,QACR,IAAA,EAAK,OAAA;AAAA,QACL,MAAA,EAAO,SAAA;AAAA,QACP,WAAA,EAAa,EAAA;AAAA,QACb,KAAA,EAAO,EAAE,MAAA,EAAQ,cAAA,CAAe,IAAI,CAAA,EAAE;AAAA,QACtC,WAAA,EAAa,CAAA,CAAA,KAAK,eAAA,CAAgB,CAAA,EAAG,IAAI;AAAA,OAAA;AAAA,MAVpC;AAAA,KAYR;AAAA,GAAA,EACL,CAAA;AAEJ;AAIO,SAAS,SAAS,KAAA,EAAsB;AAC7C,EAAA,IAAI,KAAA,CAAM,IAAA,CAAK,KAAA,KAAU,SAAA,EAAW;AAClC,IAAA,uBAAOA,GAAAA,CAAC,eAAA,EAAA,EAAiB,GAAG,KAAA,EAAO,CAAA;AAAA,EACrC;AACA,EAAA,uBAAOA,GAAAA,CAAC,YAAA,EAAA,EAAc,GAAG,KAAA,EAAO,CAAA;AAClC;ACpYA,SAAS,QAAQ,CAAA,EAAe;AAC9B,EAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC/B,EAAA,OAAO,MAAM,KAAA,GAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE,GAAI,EAAE,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA,EAAK,CAAA,EAAG,CAAA,CAAE,IAAI,GAAA,EAAI;AACrE;AAIO,SAAS,UAAU,EAAE,KAAA,EAAO,OAAO,IAAA,EAAM,IAAA,EAAM,cAAa,EAAmB;AACpF,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,IAAK,KAAA,CAAM,MAAA,KAAW,GAAG,OAAO,IAAA;AAGrD,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAsB,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AAGnE,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAC1C,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO,SAAA,CAAU,IAAI,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA;AAC7C,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA,EAAG,KAAK,IAAI,CAAA;AACtC,IAAA,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA,EAAG,KAAK,IAAI,CAAA;AAAA,EACxC;AAGA,EAAA,MAAM,KAAQ,IAAA,GAAO,IAAA;AACrB,EAAA,MAAM,UAAU,IAAA,KAAS,OAAA;AAEzB,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,KAAQ;AAC9B,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA;AACtC,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,EAAO,OAAO,IAAA;AAG7B,IAAA,MAAM,QAAA,GAAA,CAAY,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA,IAAK,EAAC,EAAG,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,EAAA,KAAO,KAAK,EAAE,CAAA;AACjF,IAAA,IAAI,SAAA,GAAyB,IAAA;AAC7B,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,MAAM,EAAA,GAAK,SAAS,CAAC,CAAA;AACrB,MAAA,MAAM,UAAU,EAAA,CAAG,OAAA,KAAY,KAAK,OAAA,GAAU,EAAA,CAAG,UAAU,EAAA,CAAG,OAAA;AAC9D,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AACjC,MAAA,IAAI,KAAA,EAAO,SAAA,GAAY,OAAA,CAAQ,EAAE,GAAG,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,CAAA,EAAG,CAAA,EAAG,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,GAAG,CAAA;AAAA,IAC/E;AAGA,IAAA,MAAM,QAAA,GAAA,CAAY,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA,IAAK,EAAC,EAAG,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,EAAA,KAAO,KAAK,EAAE,CAAA;AACjF,IAAA,IAAI,SAAA,GAAyB,IAAA;AAC7B,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,MAAM,EAAA,GAAK,SAAS,CAAC,CAAA;AACrB,MAAA,MAAM,UAAU,EAAA,CAAG,OAAA,KAAY,KAAK,OAAA,GAAU,EAAA,CAAG,UAAU,EAAA,CAAG,OAAA;AAC9D,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AACjC,MAAA,IAAI,KAAA,EAAO,SAAA,GAAY,OAAA,CAAQ,EAAE,GAAG,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,CAAA,EAAG,CAAA,EAAG,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,GAAG,CAAA;AAAA,IAC/E;AAEA,IAAA,MAAM,IAAA,GAAO,eAAA;AAAA,MACX,KAAA,CAAM,CAAA;AAAA,MAAG,KAAA,CAAM,CAAA;AAAA,MAAG,KAAA,CAAM,CAAA;AAAA,MAAG,KAAA,CAAM,CAAA;AAAA,MACjC,IAAA,CAAK,SAAA;AAAA,MAAW,SAAA;AAAA,MAAW;AAAA,KAC7B;AACA,IAAA,OAAO,EAAE,MAAM,IAAA,EAAK;AAAA,EACtB,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAkC,MAAM,IAAI,CAAA;AAEvD,EAAA,uBACEC,KAAC,GAAA,EAAA,EAEE,QAAA,EAAA;AAAA,IAAA,KAAA,CAAM,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,MAAK,qBACvBA,KAAC,GAAA,EAAA,EAEC,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,CAAA,EAAG,IAAA;AAAA,UACH,IAAA,EAAK,SAAA;AAAA,UACL,MAAA,EAAO,SAAA;AAAA,UACP,WAAA,EAAa,EAAA;AAAA,UACb,cAAA,EAAe,OAAA;AAAA,UACf,KAAA,EAAO,EAAE,aAAA,EAAe,MAAA;AAAO;AAAA,OACjC;AAAA,MAEC,2BACCA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,CAAA,EAAG,IAAA;AAAA,UACH,IAAA,EAAK,aAAA;AAAA,UACL,MAAA,EAAO,aAAA;AAAA,UACP,aAAa,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,SAAA,EAAW,EAAE,CAAA,GAAI,IAAA;AAAA,UAC5C,KAAA,EAAO,EAAE,MAAA,EAAQ,WAAA,EAAa,eAAe,KAAA,EAAM;AAAA,UACnD,OAAA,EAAS,MAAM,YAAA,GAAe,IAAA,CAAK,EAAE;AAAA;AAAA;AACvC,KAAA,EAAA,EAnBI,IAAA,CAAK,EAqBb,CACD,CAAA;AAAA,IAGA,IAAA,KAAS,MAAA,IAAU,KAAA,CAAM,GAAA,CAAI,0BAC5BA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAI,IAAA,CAAK,CAAA;AAAA,QACT,IAAI,IAAA,CAAK,CAAA;AAAA,QACT,GAAG,CAAA,GAAI,IAAA;AAAA,QACP,IAAA,EAAK,SAAA;AAAA,QACL,MAAA,EAAO,OAAA;AAAA,QACP,aAAa,GAAA,GAAM,IAAA;AAAA,QACnB,KAAA,EAAO,EAAE,aAAA,EAAe,MAAA;AAAO,OAAA;AAAA,MAP1B,IAAA,CAAK;AAAA,KASb;AAAA,GAAA,EACH,CAAA;AAEJ;AC3GA,SAAS,SAAA,CAAU,CAAA,EAAW,CAAA,EAAW,CAAA,EAAW,CAAA,EAAmB;AACrE,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,GAAA,EAAK,IAAI,GAAG,CAAA;AACvC,EAAA,MAAM,QAAQ,CAAA,GAAI,IAAA;AAClB,EAAA,MAAM,EAAA,GAAK,CAAA,GAAA,CAAK,CAAA,GAAI,KAAA,IAAS,CAAA;AAC7B,EAAA,MAAM,EAAA,GAAK,CAAA,GAAA,CAAK,CAAA,GAAI,KAAA,IAAS,CAAA;AAC7B,EAAA,OAAO;AAAA,IACL,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA;AAAA,IACZ,CAAA,EAAA,EAAK,CAAA,GAAI,CAAA,GAAI,KAAK,IAAI,EAAE,CAAA,CAAA;AAAA,IACxB,CAAA,EAAA,EAAK,CAAA,GAAI,CAAA,GAAI,KAAK,IAAI,CAAC,CAAA,CAAA;AAAA,IACvB,KAAK,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAA,GAAI,IAAI,CAAC,CAAA,CAAA;AAAA,IACvB,KAAK,CAAA,GAAI,CAAA,GAAI,KAAK,CAAA,CAAA,EAAI,IAAI,CAAC,CAAA,CAAA;AAAA,IAC3B,CAAA,EAAA,EAAK,CAAA,GAAI,CAAA,GAAI,KAAK,IAAI,EAAE,CAAA,CAAA;AAAA,IACxB,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA;AAAA,IACZ;AAAA,GACF,CAAE,KAAK,GAAG,CAAA;AACZ;AAMA,IAAMK,eAAAA,GAA6C;AAAA,EACjD,EAAA,EAAI,aAAA;AAAA,EAAe,EAAA,EAAI,aAAA;AAAA,EACvB,EAAA,EAAI,aAAA;AAAA,EAAe,EAAA,EAAI,aAAA;AAAA,EACvB,CAAA,EAAG,WAAA;AAAA,EAAe,CAAA,EAAG,WAAA;AAAA,EACrB,CAAA,EAAG,WAAA;AAAA,EAAe,CAAA,EAAG;AACvB,CAAA;AAEA,IAAMC,SAAAA,GAAW,EAAA;AAGjB,SAAS,WAAA,CAAY,EAAA,EAAY,EAAA,EAAY,GAAA,EAA+B;AAC1E,EAAA,MAAM,CAAA,GAAI,CAAC,GAAA,IAAO,IAAA,CAAK,EAAA,GAAK,GAAA,CAAA;AAC5B,EAAA,OAAO,CAAC,KAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,EAAA,GAAK,KAAK,GAAA,CAAI,CAAC,GAAG,EAAA,GAAK,IAAA,CAAK,IAAI,CAAC,CAAA,GAAI,KAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AAClF;AA4BO,SAAS,WAAA,CAAY;AAAA,EAC1B,OAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,GAAG,MAAA,EAAQ,CAAA,EAAG,UAAS,GAAI,OAAA;AAChD,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACnB,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AAEnB,EAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AACjB,EAAA,MAAM,KAAK,CAAA,GAAI,IAAA;AACf,EAAA,MAAM,YAAY,EAAA,GAAK,IAAA;AACvB,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,IAAA,EAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AAGjE,EAAA,MAAM,QAAA,GAAWH,MAAAA,CAAO,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,CAAA;AAChE,EAAA,MAAM,cAAcA,MAAAA,CAAO,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAEzC,EAAA,MAAM,EAAE,eAAA,EAAiB,cAAA,EAAe,GAAI,OAAA,CAAQ,QAAQ,UAAA,EAAY;AAAA,IACtE,WAAA,EAAa,CAAC,EAAA,EAAI,EAAA,KAAO;AACvB,MAAA,QAAA,CAAS,OAAA,GAAU,EAAE,GAAA,EAAK,OAAA,CAAQ,CAAA,EAAG,GAAA,EAAK,OAAA,CAAQ,CAAA,EAAG,MAAA,EAAQ,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG;AAC5E,MAAA,WAAA,CAAY,UAAU,EAAE,CAAA,EAAG,QAAQ,CAAA,EAAG,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA,IACrD,CAAA;AAAA,IACA,UAAA,EAAY,CAAC,GAAA,EAAK,GAAA,EAAK,SAAS,OAAA,KAAY;AAC1C,MAAA,IAAI,KAAK,QAAA,CAAS,OAAA,CAAQ,GAAA,IAAO,OAAA,GAAU,SAAS,OAAA,CAAQ,MAAA,CAAA;AAC5D,MAAA,IAAI,KAAK,QAAA,CAAS,OAAA,CAAQ,GAAA,IAAO,OAAA,GAAU,SAAS,OAAA,CAAQ,MAAA,CAAA;AAC5D,MAAA,IAAI,WAAA,EAAa;AAAE,QAAA,EAAA,GAAK,UAAA,CAAW,IAAI,QAAQ,CAAA;AAAG,QAAA,EAAA,GAAK,UAAA,CAAW,IAAI,QAAQ,CAAA;AAAA,MAAG;AACjF,MAAA,WAAA,CAAY,OAAA,GAAU,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AACrC,MAAA,MAAA,CAAO,IAAI,EAAE,CAAA;AAAA,IACf,CAAA;AAAA,IACA,WAAW,MAAM;AACf,MAAA,YAAA,CAAa,WAAA,CAAY,OAAA,CAAQ,CAAA,EAAG,WAAA,CAAY,QAAQ,CAAC,CAAA;AAAA,IAC3D;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,YAAA,GAAeA,OAA0B,IAAI,CAAA;AACnD,EAAA,MAAM,SAAA,GAAYA,MAAAA,CAAO,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,MAAA,EAAQ,GAAG,CAAA;AACzE,EAAA,MAAM,cAAA,GAAiBA,MAAAA,CAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA;AAExD,EAAA,MAAM,EAAE,eAAA,EAAiB,gBAAA,EAAiB,GAAI,OAAA,CAAQ,QAAQ,UAAA,EAAY;AAAA,IACxE,WAAA,EAAa,CAAC,EAAA,EAAI,EAAA,KAAO;AACvB,MAAA,SAAA,CAAU,UAAU,EAAE,CAAA,EAAG,OAAA,CAAQ,CAAA,EAAG,GAAG,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,OAAA,CAAQ,OAAO,CAAA,EAAG,OAAA,CAAQ,QAAQ,MAAA,EAAQ,EAAA,EAAI,QAAQ,EAAA,EAAG;AAC9G,MAAA,cAAA,CAAe,OAAA,GAAU,EAAE,CAAA,EAAG,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,OAAA,CAAQ,KAAA,EAAO,CAAA,EAAG,QAAQ,MAAA,EAAO;AAAA,IAC7F,CAAA;AAAA,IACA,UAAA,EAAY,CAAC,GAAA,EAAK,GAAA,EAAK,SAAS,OAAA,KAAY;AAC1C,MAAA,MAAM,OAAO,YAAA,CAAa,OAAA;AAC1B,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,OAAA,GAAU,OAAA,GAAU,SAAA,CAAU,OAAA,CAAQ,MAAA;AAC5C,MAAA,MAAM,OAAA,GAAU,OAAA,GAAU,SAAA,CAAU,OAAA,CAAQ,MAAA;AAC5C,MAAA,MAAM,CAAC,GAAA,EAAK,GAAG,IAAI,WAAA,CAAY,OAAA,EAAS,SAAS,QAAQ,CAAA;AACzD,MAAA,MAAM,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,GAAG,GAAA,EAAK,CAAA,EAAG,EAAA,EAAG,GAAI,SAAA,CAAU,OAAA;AAClD,MAAA,MAAM,QAAQ,EAAA,GAAK,GAAA;AACnB,MAAA,MAAM,SAAS,EAAA,GAAK,EAAA;AAEpB,MAAA,IAAI,KAAK,EAAA,EAAI,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACrC,MAAA,QAAQ,IAAA;AAAM,QACZ,KAAK,IAAA;AAAM,UAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAIG,SAAAA,EAAU,GAAA,GAAM,GAAG,CAAA;AAAG,UAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAIA,SAAAA,EAAU,EAAA,GAAK,GAAG,CAAA;AAAG,UAAA,EAAA,GAAK,KAAA,GAAQ,EAAA;AAAI,UAAA,EAAA,GAAK,MAAA,GAAS,EAAA;AAAI,UAAA;AAAA,QACrH,KAAK,GAAA;AAAM,UAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAIA,SAAAA,EAAU,EAAA,GAAK,GAAG,CAAA;AAAG,UAAA,EAAA,GAAK,MAAA,GAAS,EAAA;AAAI,UAAA;AAAA,QAChE,KAAK,IAAA;AAAM,UAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAIA,SAAAA,EAAU,GAAA,GAAM,GAAG,CAAA;AAAG,UAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAIA,SAAAA,EAAU,EAAA,GAAK,GAAG,CAAA;AAAG,UAAA,EAAA,GAAK,MAAA,GAAS,EAAA;AAAI,UAAA;AAAA,QACpG,KAAK,GAAA;AAAM,UAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAIA,SAAAA,EAAU,GAAA,GAAM,GAAG,CAAA;AAAG,UAAA;AAAA,QAC/C,KAAK,IAAA;AAAM,UAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAIA,SAAAA,EAAU,GAAA,GAAM,GAAG,CAAA;AAAG,UAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAIA,SAAAA,EAAU,EAAA,GAAK,GAAG,CAAA;AAAG,UAAA;AAAA,QAClF,KAAK,GAAA;AAAM,UAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAIA,SAAAA,EAAU,EAAA,GAAK,GAAG,CAAA;AAAG,UAAA;AAAA,QAC9C,KAAK,IAAA;AAAM,UAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAIA,SAAAA,EAAU,GAAA,GAAM,GAAG,CAAA;AAAG,UAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAIA,SAAAA,EAAU,EAAA,GAAK,GAAG,CAAA;AAAG,UAAA,EAAA,GAAK,KAAA,GAAQ,EAAA;AAAI,UAAA;AAAA,QACnG,KAAK,GAAA;AAAM,UAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAIA,SAAAA,EAAU,GAAA,GAAM,GAAG,CAAA;AAAG,UAAA,EAAA,GAAK,KAAA,GAAQ,EAAA;AAAI,UAAA;AAAA;AAElE,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,EAAA,GAAK,KAAK,GAAA,CAAIA,SAAAA,EAAU,UAAA,CAAW,EAAA,EAAI,QAAQ,CAAC,CAAA;AAChD,QAAA,EAAA,GAAK,KAAK,GAAA,CAAIA,SAAAA,EAAU,UAAA,CAAW,EAAA,EAAI,QAAQ,CAAC,CAAA;AAAA,MAClD;AACA,MAAA,cAAA,CAAe,OAAA,GAAU,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAG;AACtD,MAAA,QAAA,CAAS,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AAAA,IACzB,CAAA;AAAA,IACA,WAAW,MAAM;AACf,MAAA,MAAM,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAG,GAAI,cAAA,CAAe,OAAA;AACtD,MAAA,cAAA,CAAe,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AAC7B,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AAAA,IACzB;AAAA,GACD,CAAA;AAED,EAAA,MAAM,eAAA,GAAkBF,WAAAA;AAAA,IACtB,CAAC,GAAoB,IAAA,KAAqB;AACxC,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,MAAA,gBAAA,CAAiB,CAAC,CAAA;AAAA,IACpB,CAAA;AAAA,IACA,CAAC,gBAAgB;AAAA,GACnB;AAGA,EAAA,MAAM,QAAA,GAAWD,MAAAA,CAAO,EAAE,WAAA,EAAa,GAAG,CAAA;AAE1C,EAAA,MAAM,gBAAA,GAAmBC,WAAAA;AAAA,IACvB,CAAC,CAAA,KAAuB;AACtB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,EAAS,qBAAA,EAAsB;AACtD,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,CAAA,KAAM,UAAA,CAAW,OAAA;AAC3C,MAAA,MAAM,GAAA,GAAA,CAAO,CAAA,CAAE,OAAA,GAAU,OAAA,CAAQ,OAAO,IAAA,IAAQ,CAAA;AAChD,MAAA,MAAM,GAAA,GAAA,CAAO,CAAA,CAAE,OAAA,GAAU,OAAA,CAAQ,MAAM,IAAA,IAAQ,CAAA;AAC/C,MAAA,MAAM,SAAA,GAAY,KAAK,KAAA,CAAM,GAAA,GAAM,IAAI,GAAA,GAAM,EAAE,CAAA,IAAK,GAAA,GAAM,IAAA,CAAK,EAAA,CAAA;AAC/D,MAAA,QAAA,CAAS,OAAA,CAAQ,WAAA,GAAc,OAAA,CAAQ,QAAA,GAAW,SAAA;AAIlD,MAAA,IAAI,aAAa,OAAA,CAAQ,QAAA;AAEzB,MAAA,MAAMG,OAAAA,GAAS,CAAC,EAAA,KAAmB;AACjC,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,EAAS,qBAAA,EAAsB;AACnD,QAAA,IAAI,CAAC,IAAA,EAAM;AACX,QAAA,MAAM,EAAE,MAAM,EAAA,EAAI,IAAA,EAAM,IAAI,IAAA,EAAM,EAAA,KAAO,UAAA,CAAW,OAAA;AACpD,QAAA,MAAM,GAAA,GAAA,CAAO,EAAA,CAAG,OAAA,GAAU,IAAA,CAAK,OAAO,EAAA,IAAM,EAAA;AAC5C,QAAA,MAAM,GAAA,GAAA,CAAO,EAAA,CAAG,OAAA,GAAU,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA;AAC3C,QAAA,IAAI,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,EAAA,EAAI,GAAA,GAAM,EAAE,CAAA,IAAK,GAAA,GAAM,IAAA,CAAK,EAAA,CAAA,GAAM,QAAA,CAAS,OAAA,CAAQ,WAAA;AACjF,QAAA,IAAI,GAAG,QAAA,EAAU,MAAA,GAAS,KAAK,KAAA,CAAM,MAAA,GAAS,EAAE,CAAA,GAAI,EAAA;AACpD,QAAA,UAAA,GAAa,MAAA;AACb,QAAA,QAAA,CAAS,MAAM,CAAA;AAAA,MACjB,CAAA;AAEA,MAAA,MAAM,OAAO,MAAM;AACjB,QAAA,cAAA,CAAe,UAAU,CAAA;AACzB,QAAA,MAAA,CAAO,mBAAA,CAAoB,aAAaA,OAAM,CAAA;AAC9C,QAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,IAAI,CAAA;AAAA,MAC5C,CAAA;AAEA,MAAA,MAAA,CAAO,gBAAA,CAAiB,aAAaA,OAAM,CAAA;AAC3C,MAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,IAAI,CAAA;AAAA,IACzC,CAAA;AAAA,IACA,CAAC,IAAI,EAAA,EAAI,OAAA,CAAQ,UAAU,UAAA,EAAY,MAAA,EAAQ,UAAU,cAAc;AAAA,GACzE;AAGA,EAAA,MAAM,eAAA,GAAkBH,WAAAA;AAAA,IACtB,CAAC,CAAA,KAAuB;AACtB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,IAAI,aAAA,EAAe;AAAE,QAAA,aAAA,EAAc;AAAG,QAAA;AAAA,MAAQ;AAC9C,MAAA,IAAI,SAAS,OAAA,EAAS;AAAE,QAAA,QAAA,EAAS;AAAG,QAAA;AAAA,MAAQ;AAC5C,MAAA,IAAI,SAAS,QAAA,EAAU;AAAE,QAAA,QAAA,CAAS,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,IAAW,EAAE,QAAQ,CAAA;AAAA,MAAG;AAAA,IAC3E,CAAA;AAAA,IACA,CAAC,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,aAAa;AAAA,GAC1C;AAGA,EAAA,MAAM,SAAA,GAAY,cAAc,OAAA,CAAQ,KAAA;AACxC,EAAA,MAAM,UAAA,GAAa,gBAAgB,SAAA,GAAY,IAAA,KAAS,UAAU,WAAA,GAAc,IAAA,KAAS,WAAW,MAAA,GAAS,SAAA;AAI7G,EAAA,MAAM,aAAa,OAAA,CAAQ,KAAA,KAAU,MAAA,IAAU,OAAA,CAAQ,WAClD,MAAM;AACL,IAAA,MAAM,KAAA,GAAA,CAAS,QAAQ,OAAA,IAAW,aAAA,EAAe,MAAM,QAAQ,CAAA,CAAE,IAAI,MAAM,CAAA;AAC3E,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,CAAC,CAAA,IAAK,GAAA;AACvB,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,CAAC,CAAA,IAAK,GAAA;AACvB,IAAA,MAAM,MAAA,GAAS,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,CAAA;AACjC,IAAA,MAAM,MAAA,GAAS,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,CAAA;AAEjC,IAAA,MAAM,QAAA,GAAW,KAAK,IAAA,CAAK,IAAA,CAAK,IAAI,MAAA,GAAS,MAAM,CAAC,CAAA,IAAK,CAAA;AACzD,IAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAa,KAAK,QAAA,EAAS;AAAA,EACtD,IAAG,GACH,IAAA;AAEJ,EAAA,MAAM,OAAA,GAA+D;AAAA,IACnE,EAAE,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,CAAA,EAAQ,IAAI,CAAA,EAAE;AAAA,IAChC,EAAE,MAAM,GAAA,EAAM,EAAA,EAAI,IAAE,CAAA,GAAE,CAAA,EAAI,IAAI,CAAA,EAAE;AAAA,IAChC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA,GAAE,CAAA,EAAM,IAAI,CAAA,EAAE;AAAA,IAChC,EAAE,MAAM,GAAA,EAAM,EAAA,EAAI,IAAE,CAAA,EAAM,EAAA,EAAI,CAAA,GAAE,CAAA,GAAE,CAAA,EAAE;AAAA,IACpC,EAAE,MAAM,IAAA,EAAM,EAAA,EAAI,IAAE,CAAA,EAAM,EAAA,EAAI,IAAE,CAAA,EAAE;AAAA,IAClC,EAAE,MAAM,GAAA,EAAM,EAAA,EAAI,IAAE,CAAA,GAAE,CAAA,EAAI,EAAA,EAAI,CAAA,GAAE,CAAA,EAAE;AAAA,IAClC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA,EAAQ,EAAA,EAAI,IAAE,CAAA,EAAE;AAAA,IAClC,EAAE,MAAM,GAAA,EAAM,EAAA,EAAI,GAAQ,EAAA,EAAI,CAAA,GAAE,IAAE,CAAA;AAAE,GACtC;AAEA,EAAA,uBACEH,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,CAAA,OAAA,EAAU,QAAQ,CAAA,EAAA,EAAK,EAAE,CAAA,EAAA,EAAK,EAAE,CAAA,CAAA,CAAA,EAE3C,QAAA,EAAA;AAAA,IAAA,OAAA,CAAQ,KAAA,KAAU,0BACjBD,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA;AAAA,QAAM,CAAA;AAAA,QAAM,KAAA,EAAO,CAAA;AAAA,QAAG,MAAA,EAAQ,CAAA;AAAA,QAC9B,IAAA,EAAM,SAAA;AAAA,QACN,MAAA,EAAQ,UAAA,GAAa,SAAA,GAAY,OAAA,CAAQ,WAAA;AAAA,QACzC,WAAA,EAAa,UAAA,GAAa,EAAA,GAAK,GAAA,GAAM,EAAA;AAAA,QACrC,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA,EAAW;AAAA,QAC5B,WAAA,EAAa,IAAA,KAAS,QAAA,IAAY,CAAC,gBAAgB,cAAA,GAAiB,MAAA;AAAA,QACpE,OAAA,EAAS;AAAA;AAAA,KACX;AAAA,IAED,OAAA,CAAQ,KAAA,KAAU,QAAA,oBACjBA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,EAAA;AAAA,QAAQ,EAAA;AAAA,QAAQ,IAAI,CAAA,GAAI,CAAA;AAAA,QAAG,IAAI,CAAA,GAAI,CAAA;AAAA,QACnC,IAAA,EAAM,SAAA;AAAA,QACN,MAAA,EAAQ,UAAA,GAAa,SAAA,GAAY,OAAA,CAAQ,WAAA;AAAA,QACzC,WAAA,EAAa,UAAA,GAAa,EAAA,GAAK,GAAA,GAAM,EAAA;AAAA,QACrC,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA,EAAW;AAAA,QAC5B,WAAA,EAAa,IAAA,KAAS,QAAA,IAAY,CAAC,gBAAgB,cAAA,GAAiB,MAAA;AAAA,QACpE,OAAA,EAAS;AAAA;AAAA,KACX;AAAA,IAED,OAAA,CAAQ,KAAA,KAAU,OAAA,oBACjBA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAG,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,QACvB,IAAA,EAAM,SAAA;AAAA,QACN,MAAA,EAAQ,UAAA,GAAa,SAAA,GAAY,OAAA,CAAQ,WAAA;AAAA,QACzC,WAAA,EAAa,UAAA,GAAa,EAAA,GAAK,GAAA,GAAM,EAAA;AAAA,QACrC,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA,EAAW;AAAA,QAC5B,WAAA,EAAa,IAAA,KAAS,QAAA,IAAY,CAAC,gBAAgB,cAAA,GAAiB,MAAA;AAAA,QACpE,OAAA,EAAS;AAAA;AAAA,KACX;AAAA,IAED,OAAA,CAAQ,UAAU,MAAA,IAAU,UAAA,IAAc,QAAQ,OAAA,oBACjDA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAW,aAAa,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,QAAA,EAAW,UAAA,CAAW,MAAM,CAAA,EAAA,EAAK,UAAA,CAAW,MAAM,CAAA,CAAA,CAAA,EAClF,QAAA,kBAAAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAG,OAAA,CAAQ,OAAA;AAAA,QACX,IAAA,EAAM,SAAA;AAAA,QACN,MAAA,EAAQ,UAAA,GAAa,SAAA,GAAY,OAAA,CAAQ,WAAA;AAAA,QACzC,WAAA,EAAa,UAAA,GAAa,UAAA,CAAW,WAAA,GAAc,MAAM,UAAA,CAAW,WAAA;AAAA,QACpE,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA,EAAW;AAAA,QAC5B,WAAA,EAAa,IAAA,KAAS,QAAA,IAAY,CAAC,gBAAgB,cAAA,GAAiB,MAAA;AAAA,QACpE,OAAA,EAAS;AAAA;AAAA,KACX,EACF,CAAA;AAAA,IAAA,CAIA,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,KAAA,qBACzBA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAG,EAAA;AAAA,QAAI,CAAA,EAAG,EAAA;AAAA,QACV,UAAA,EAAW,QAAA;AAAA,QACX,gBAAA,EAAiB,SAAA;AAAA,QACjB,QAAA;AAAA,QACA,MAAM,OAAA,CAAQ,WAAA;AAAA,QACd,KAAA,EAAO,EAAE,aAAA,EAAe,MAAA,EAAQ,YAAY,MAAA,EAAO;AAAA,QAElD,QAAA,EAAA,OAAA,CAAQ,SAAS,OAAA,CAAQ;AAAA;AAAA,KAC5B;AAAA,IAID,cAAc,IAAA,KAAS,QAAA,oBACtBC,IAAAA,CAAAC,UAAA,EAEE,QAAA,EAAA;AAAA,sBAAAF,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAI,EAAA;AAAA,UAAI,EAAA,EAAI,CAAA;AAAA,UACZ,EAAA,EAAI,EAAA;AAAA,UAAI,IAAI,CAAA,GAAI,SAAA;AAAA,UAChB,MAAA,EAAO,SAAA;AAAA,UAAU,WAAA,EAAa,EAAA;AAAA,UAC9B,KAAA,EAAO,EAAE,aAAA,EAAe,MAAA;AAAO;AAAA,OACjC;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,EAAA;AAAA,UAAQ,IAAI,CAAA,GAAI,SAAA;AAAA,UAAW,GAAG,EAAA,GAAK,GAAA;AAAA,UACnC,IAAA,EAAK,OAAA;AAAA,UAAQ,MAAA,EAAO,SAAA;AAAA,UAAU,WAAA,EAAa,EAAA;AAAA,UAC3C,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA,EAAO;AAAA,UACxB,WAAA,EAAa;AAAA;AAAA,OACf;AAAA,MAGC,OAAA,CAAQ,IAAI,CAAC,EAAE,MAAM,EAAA,EAAI,EAAA,uBACxBA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UAEC,GAAG,EAAA,GAAK,EAAA;AAAA,UAAI,GAAG,EAAA,GAAK,EAAA;AAAA,UACpB,OAAO,EAAA,GAAK,CAAA;AAAA,UAAG,QAAQ,EAAA,GAAK,CAAA;AAAA,UAC5B,IAAI,CAAA,GAAI,IAAA;AAAA,UACR,IAAA,EAAK,OAAA;AAAA,UAAQ,MAAA,EAAO,SAAA;AAAA,UAAU,WAAA,EAAa,EAAA;AAAA,UAC3C,KAAA,EAAO,EAAE,MAAA,EAAQK,eAAAA,CAAe,IAAI,CAAA,EAAE;AAAA,UACtC,WAAA,EAAa,CAAA,CAAA,KAAK,eAAA,CAAgB,CAAA,EAAG,IAAI;AAAA,SAAA;AAAA,QANpC;AAAA,OAQR;AAAA,KAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACtVA,IAAM,OAAA,GAAoB,EAAA;AAC1B,IAAM,iBAAA,GAAoB,CAAA;AAI1B,SAAS,WAAA,CAAY,CAAA,EAAW,CAAA,EAAW,KAAA,EAAuB;AAChE,EAAA,MAAM,EAAE,MAAK,GAAI,KAAA;AACjB,EAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAQ;AACzB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,IAAK,CAAA,EAAG,KAAK,IAAA,CAAK,CAAA,IAAK,CAAA,EAAG,EAAA,GAAK,IAAA,CAAK,KAAA,IAAS,CAAA,EAAG,EAAA,GAAK,KAAK,MAAA,IAAU,CAAA;AACpF,IAAA,OAAO,CAAA,IAAK,MAAM,CAAA,IAAK,EAAA,GAAK,MAAM,CAAA,IAAK,EAAA,IAAM,KAAK,EAAA,GAAK,EAAA;AAAA,EACzD;AACA,EAAA,IAAI,IAAA,CAAK,UAAU,SAAA,EAAW;AAC5B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,IAAU,EAAC;AAC5B,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,GAAS,GAAG,CAAA,GAAI,GAAA,CAAI,MAAA,EAAQ,CAAA,GAAI,CAAA,EAAA,EAAK;AAC3D,MAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA;AACzC,MAAA,IAAK,EAAA,GAAK,CAAA,KAAQ,EAAA,GAAK,CAAA,IAAM,CAAA,GAAA,CAAK,EAAA,GAAK,EAAA,KAAO,CAAA,GAAI,EAAA,CAAA,IAAO,EAAA,GAAK,EAAA,CAAA,GAAM,EAAA,WAAa,CAAC,MAAA;AAAA,IACpF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAMA,SAAS,cAAA,CAAe,GAAc,CAAA,EAAuB;AAC3D,EAAA,OAAO,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,IAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,GAAI,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA;AAChF;AAsDO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,kBAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,oBAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,MAAA,GAASF,OAAsB,IAAI,CAAA;AAEzC,EAAA,MAAM;AAAA,IACJ,KAAA,EAAO,OAAA;AAAA,IAAS,SAAA;AAAA,IAChB,WAAA;AAAA,IAAa,eAAA,EAAiB,kBAAA;AAAA,IAC9B,eAAA,EAAiB,kBAAA;AAAA,IACjB,aAAA,EAAe,gBAAA;AAAA,IACf,gBAAA;AAAA,IACA,MAAA;AAAA,IAAQ;AAAA,GACV,GAAI,UAAA,CAAW,CAAA,EAAG,IAAA,KAAS,KAAK,CAAA;AAEhC,EAAA,MAAM,UAAA,GAAaA,OAAqB,OAAO,CAAA;AAC/C,EAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AAGrB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIK,SAA2B,IAAI,CAAA;AACzD,EAAA,MAAM,UAAA,GAAaL,OAA0C,IAAI,CAAA;AAGjE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIK,SAA0B,IAAI,CAAA;AAG9D,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAA,KAAS,MAAA,EAAQ,WAAA,CAAY,IAAI,CAAA;AAAA,EACvC,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAGT,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,gBAAA,GAAmB,MAAM,CAAA;AACzB,IAAA,mBAAA,GAAsB,SAAS,CAAA;AAAA,EAEjC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AAAE,IAAA,YAAA,GAAe,QAAQ,IAAI,CAAA;AAAA,EAAG,CAAA,EAAG,CAAC,OAAA,CAAQ,IAAA,EAAM,YAAY,CAAC,CAAA;AAG/E,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAK,MAAA,CAAO,OAAA;AAClB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAkB,CAAA,CAAE,cAAA,EAAe;AACpD,IAAA,EAAA,CAAG,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,OAAA,EAAS,OAAO,CAAA;AACxD,IAAA,OAAO,MAAM,EAAA,CAAG,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AAAA,EACtD,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,QAAA,GAAWJ,WAAAA,CAAY,CAAC,OAAA,EAAiB,OAAA,KAAoB;AACjE,IAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAS,qBAAA,MAA2B,EAAE,IAAA,EAAM,CAAA,EAAG,GAAA,EAAK,CAAA,EAAE;AAC1E,IAAA,MAAM,EAAE,MAAAK,KAAAA,EAAM,IAAA,EAAAC,OAAM,IAAA,EAAAC,KAAAA,KAAS,UAAA,CAAW,OAAA;AACxC,IAAA,OAAO,EAAE,CAAA,EAAA,CAAI,OAAA,GAAU,IAAA,CAAK,IAAA,GAAOF,KAAAA,IAAQE,KAAAA,EAAM,CAAA,EAAA,CAAI,OAAA,GAAU,IAAA,CAAK,GAAA,GAAMD,KAAAA,IAAQC,KAAAA,EAAK;AAAA,EACzF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,YAAA,GAAeP,WAAAA,CAAY,CAC/B,EAAA,EAAY,IACZ,SAAA,KACoB;AACpB,IAAA,MAAM,SAAA,GAAY,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,IAAA;AAC/C,IAAA,MAAM,UAAA,GAAa,SAAA,GACf,KAAA,CAAM,SAAA,CAAU,MAAA,CAAO,OAAK,CAAA,CAAE,EAAA,KAAO,SAAS,CAAA,GAC9C,KAAA,CAAM,SAAA;AACV,IAAA,OAAO,eAAA,CAAgB,EAAA,EAAI,EAAA,EAAI,UAAA,EAAY,SAAS,CAAA;AAAA,EACtD,CAAA,EAAG,CAAC,KAAA,CAAM,SAAS,CAAC,CAAA;AAGpB,EAAA,MAAM,kBAAA,GAAqBA,WAAAA,CAAY,CAAC,CAAA,KAAsC;AAC5E,IAAA,IAAI,EAAE,MAAA,KAAW,CAAA,IAAM,EAAE,MAAA,KAAW,CAAA,IAAK,SAAS,KAAA,EAAQ;AACxD,MAAA,kBAAA,CAAmB,CAAC,CAAA;AACpB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AAEpB,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,CAAA,CAAE,OAAA,EAAS,EAAE,OAAO,CAAA;AACzC,IAAA,MAAM,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAG,GAAI,SAAA,CAAU,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,CAAA,EAAG,QAAA,EAAU,WAAW,CAAA;AAGtE,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,IAAI,CAAC,QAAA,EAAU;AAEb,QAAA,IAAI,CAAC,WAAA,CAAY,EAAA,EAAI,EAAA,EAAI,KAAK,CAAA,EAAG;AACjC,QAAA,MAAM,QAAA,GAAW,YAAA,CAAa,EAAA,EAAI,EAAA,EAAI,IAAI,CAAA;AAC1C,QAAA,MAAM,EAAA,GAAK,QAAA,GAAW,QAAA,CAAS,CAAA,GAAI,EAAA;AACnC,QAAA,MAAM,EAAA,GAAK,QAAA,GAAW,QAAA,CAAS,CAAA,GAAI,EAAA;AACnC,QAAA,WAAA,CAAY;AAAA,UACV,MAAA,EAAQ,EAAA;AAAA,UAAI,MAAA,EAAQ,EAAA;AAAA,UACpB,aAAA,EAAe,QAAA;AAAA,UACf,QAAA,EAAU,EAAA;AAAA,UAAI,QAAA,EAAU,EAAA;AAAA,UACxB,WAAA,EAAa;AAAA,SACd,CAAA;AAAA,MACH,CAAA,MAAO;AAGL,QAAA,MAAM,WAAW,YAAA,CAAa,EAAA,EAAI,IAAI,QAAA,CAAS,aAAA,EAAe,MAAM,IAAI,CAAA;AACxE,QAAA,IAAI,EAAA,EAAY,EAAA;AAChB,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,EAAA,GAAK,QAAA,CAAS,CAAA;AAAG,UAAA,EAAA,GAAK,QAAA,CAAS,CAAA;AAAA,QACjC,CAAA,MAAO;AACL,UAAA,MAAM,EAAE,MAAK,GAAI,KAAA;AACjB,UAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAQ;AACzB,YAAA,MAAM,KAAK,IAAA,CAAK,CAAA,IAAK,CAAA,EAAG,EAAA,GAAK,KAAK,CAAA,IAAK,CAAA;AACvC,YAAA,MAAM,KAAK,IAAA,CAAK,KAAA,IAAS,CAAA,EAAG,EAAA,GAAK,KAAK,MAAA,IAAU,CAAA;AAChD,YAAA,EAAA,GAAK,IAAA,CAAK,IAAI,EAAA,EAAI,IAAA,CAAK,IAAI,EAAA,GAAK,EAAA,EAAI,EAAE,CAAC,CAAA;AACvC,YAAA,EAAA,GAAK,IAAA,CAAK,IAAI,EAAA,EAAI,IAAA,CAAK,IAAI,EAAA,GAAK,EAAA,EAAI,EAAE,CAAC,CAAA;AAAA,UACzC,CAAA,MAAA,IAAW,IAAA,CAAK,KAAA,KAAU,SAAA,EAAW;AACnC,YAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,IAAU,EAAC;AAC5B,YAAA,IAAI,WAAA,CAAY,EAAA,EAAI,EAAA,EAAI,KAAK,CAAA,EAAG;AAC9B,cAAA,EAAA,GAAK,EAAA;AAAI,cAAA,EAAA,GAAK,EAAA;AAAA,YAChB,CAAA,MAAO;AAEL,cAAA,IAAI,QAAA,GAAW,QAAA;AACf,cAAA,EAAA,GAAK,EAAA;AAAI,cAAA,EAAA,GAAK,EAAA;AACd,cAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,GAAS,GAAG,CAAA,GAAI,GAAA,CAAI,MAAA,EAAQ,CAAA,GAAI,CAAA,EAAA,EAAK;AAC3D,gBAAA,MAAM,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,EAAG,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA;AAC7C,gBAAA,MAAM,EAAA,GAAK,GAAA,GAAM,GAAA,EAAK,EAAA,GAAK,GAAA,GAAM,GAAA;AACjC,gBAAA,MAAM,IAAA,GAAO,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC5B,gBAAA,MAAM,IAAI,IAAA,GAAO,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,OAAO,EAAA,GAAA,CAAM,EAAA,GAAK,OAAO,EAAA,IAAM,IAAI,CAAC,CAAA,GAAI,CAAA;AAC5F,gBAAA,MAAM,KAAK,GAAA,GAAM,CAAA,GAAI,EAAA,EAAI,EAAA,GAAK,MAAM,CAAA,GAAI,EAAA;AACxC,gBAAA,MAAMQ,KAAAA,GAAAA,CAAQ,EAAA,GAAK,EAAA,KAAO,CAAA,GAAA,CAAK,KAAK,EAAA,KAAO,CAAA;AAC3C,gBAAA,IAAIA,QAAO,QAAA,EAAU;AAAE,kBAAA,QAAA,GAAWA,KAAAA;AAAM,kBAAA,EAAA,GAAK,EAAA;AAAI,kBAAA,EAAA,GAAK,EAAA;AAAA,gBAAI;AAAA,cAC5D;AAAA,YACF;AAAA,UACF,CAAA,MAAO;AACL,YAAA,EAAA,GAAK,EAAA;AAAI,YAAA,EAAA,GAAK,EAAA;AAAA,UAChB;AAAA,QACF;AAGA,QAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,EAAA,GAAK,SAAS,MAAA,EAAQ,EAAA,GAAK,SAAS,MAAM,CAAA;AAClE,QAAA,IAAI,OAAO,CAAA,EAAG;AACZ,UAAA,SAAA;AAAA,YACE,QAAA,CAAS,MAAA;AAAA,YAAQ,QAAA,CAAS,MAAA;AAAA,YAC1B,EAAA;AAAA,YAAI,EAAA;AAAA,YACJ,QAAA,CAAS,eAAe,EAAA,IAAM,IAAA;AAAA,YAC9B,UAAU,EAAA,IAAM;AAAA,WAClB;AAAA,QACF;AAGA,QAAA,WAAA,CAAY;AAAA,UACV,MAAA,EAAQ,EAAA;AAAA,UAAI,MAAA,EAAQ,EAAA;AAAA,UACpB,aAAA,EAAe,QAAA;AAAA,UACf,QAAA,EAAU,EAAA;AAAA,UAAI,QAAA,EAAU,EAAA;AAAA,UACxB,WAAA,EAAa;AAAA,SACd,CAAA;AAAA,MACH;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,cAAA,CAAe,IAAI,EAAE,CAAA;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,UAAA,CAAW,OAAA,GAAU,EAAE,EAAA,EAAI,EAAA,EAAG;AAC9B,MAAA,QAAA,CAAS,EAAE,GAAG,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA;AAAA,IACvC;AAAA,EACF,CAAA,EAAG;AAAA,IAAC,kBAAA;AAAA,IAAoB,IAAA;AAAA,IAAM,QAAA;AAAA,IAAU,QAAA;AAAA,IAAU,WAAA;AAAA,IAC9C,QAAA;AAAA,IAAU,YAAA;AAAA,IAAc,SAAA;AAAA,IAAW;AAAA,GAAe,CAAA;AAEtD,EAAA,MAAM,kBAAA,GAAqBR,WAAAA,CAAY,CAAC,CAAA,KAAsC;AAC5E,IAAA,kBAAA,CAAmB,CAAC,CAAA;AAEpB,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,CAAA,CAAE,OAAA,EAAS,EAAE,OAAO,CAAA;AACzC,IAAA,MAAM,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAG,GAAI,SAAA,CAAU,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,CAAA,EAAG,QAAA,EAAU,WAAW,CAAA;AAEtE,IAAA,IAAI,IAAA,KAAS,UAAU,QAAA,EAAU;AAC/B,MAAA,MAAM,WAAW,YAAA,CAAa,EAAA,EAAI,IAAI,QAAA,CAAS,aAAA,EAAe,MAAM,IAAI,CAAA;AACxE,MAAA,WAAA;AAAA,QAAY,CAAA,IAAA,KAAQ,IAAA,GAChB,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,QAAA,EAAU,EAAA,EAAI,WAAA,EAAa,QAAA,EAAS,GAC7D;AAAA,OACJ;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,KAAS,QAAA,IAAY,UAAA,CAAW,OAAA,EAAS;AAC3C,MAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,UAAA,CAAW,QAAQ,EAAE,CAAA;AAC7C,MAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,UAAA,CAAW,QAAQ,EAAE,CAAA;AAC7C,MAAA,QAAA,CAAS,EAAE,GAAG,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI,EAAA,GAAK,UAAA,CAAW,QAAQ,EAAE,CAAA,EAAG,GAAG,IAAA,CAAK,GAAA,CAAI,KAAK,UAAA,CAAW,OAAA,CAAQ,EAAE,CAAA,EAAG,CAAA;AAAA,IAC7G;AAAA,EACF,CAAA,EAAG,CAAC,kBAAA,EAAoB,IAAA,EAAM,UAAU,QAAA,EAAU,WAAA,EAAa,QAAA,EAAU,YAAY,CAAC,CAAA;AAEtF,EAAA,MAAM,gBAAA,GAAmBA,WAAAA,CAAY,CAAC,CAAA,KAAsC;AAC1E,IAAA,gBAAA,CAAiB,CAAC,CAAA;AAElB,IAAA,IAAI,UAAA,CAAW,WAAW,KAAA,EAAO;AAC/B,MAAA,IAAI,KAAA,CAAM,IAAI,CAAA,GAAI,OAAA,CAAQ,QAAQ,KAAA,CAAM,CAAA,GAAI,CAAA,GAAI,OAAA,CAAQ,IAAA,EAAM;AAC5D,QAAA,MAAM,GAAA,GAAM,KAAA,CAAM,QAAA,CACf,MAAA,CAAO,CAAA,EAAA,KAAM,cAAA,CAAe,KAAA,EAAO,EAAE,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,GAAG,CAAA,EAAG,EAAA,CAAG,KAAA,EAAO,CAAA,EAAG,EAAA,CAAG,MAAA,EAAQ,CAAC,CAAA,CACnF,GAAA,CAAI,CAAA,EAAA,KAAM,EAAA,CAAG,EAAE,CAAA;AAClB,QAAA,IAAI,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,WAAA,CAAY,GAAG,CAAA;AAAA,aAAA,IAC1B,CAAC,CAAA,CAAE,OAAA,IAAW,CAAC,CAAA,CAAE,SAAS,gBAAA,EAAiB;AAAA,MACtD,CAAA,MAAO;AACL,QAAA,IAAI,CAAC,CAAA,CAAE,OAAA,IAAW,CAAC,CAAA,CAAE,SAAS,gBAAA,EAAiB;AAAA,MACjD;AACA,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf;AAAA,EACF,CAAA,EAAG,CAAC,gBAAA,EAAkB,KAAA,EAAO,OAAA,CAAQ,MAAM,KAAA,CAAM,QAAA,EAAU,WAAA,EAAa,gBAAgB,CAAC,CAAA;AAEzF,EAAA,MAAM,iBAAA,GAAoBA,WAAAA,CAAY,CAAC,CAAA,KAAsC;AAC3E,IAAA,CAAA,CAAE,cAAA,EAAe;AAEjB,IAAA,IAAI,IAAA,KAAS,MAAA,EAAQ,WAAA,CAAY,IAAI,CAAA;AAAA,EACvC,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAGT,EAAA,MAAM,MAAA,GAAS,SAAA,GAAY,UAAA,GACvB,IAAA,KAAS,QAAW,MAAA,GACpB,IAAA,KAAS,MAAA,GAAW,WAAA,GACpB,IAAA,KAAS,OAAA,GAAW,WAAA,GACpB,IAAA,KAAS,UAAW,WAAA,GACpB,SAAA;AAEJ,EAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAK,GAAI,OAAA;AAG7B,EAAA,MAAM,WAAA,GAAc,aAAa,MAAM;AACrC,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,WAAA,EAAa,CAAA,IAAK,QAAA,CAAS,QAAA;AAC/C,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,WAAA,EAAa,CAAA,IAAK,QAAA,CAAS,QAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,EAAA,GAAK,SAAS,MAAA,EAAQ,EAAA,GAAK,SAAS,MAAM,CAAA;AAClE,IAAA,OAAO,IAAA,GAAO,CAAA,GACV,eAAA,CAAgB,QAAA,CAAS,MAAA,EAAQ,QAAA,CAAS,MAAA,EAAQ,EAAA,EAAI,EAAA,EAAI,iBAAA,EAAmB,IAAA,EAAM,IAAI,CAAA,GACvF,IAAA;AAAA,EACN,CAAA,GAAG;AAEH,EAAA,uBACEJ,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,MAAA;AAAA,MACL,SAAA,EAAU,wCAAA;AAAA,MACV,KAAA,EAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAQ;AAAA,MAClC,OAAA,EAAS,WAAA;AAAA,MACT,WAAA,EAAa,kBAAA;AAAA,MACb,WAAA,EAAa,kBAAA;AAAA,MACb,SAAA,EAAW,gBAAA;AAAA,MACX,YAAA,EAAc,gBAAA;AAAA,MACd,aAAA,EAAe,iBAAA;AAAA,MAEf,QAAA,kBAAAC,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,CAAA,UAAA,EAAa,IAAI,CAAA,EAAA,EAAK,IAAI,CAAA,QAAA,EAAW,IAAI,CAAA,CAAA,CAAA,EAErD,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAG,IAAA,EAAQ,CAAA,EAAG,IAAA,EAAQ,KAAA,EAAO,GAAA,EAAQ,MAAA,EAAQ,GAAA,EAAQ,IAAA,EAAK,SAAA,EAAU,CAAA;AAAA,QAGzE,QAAA,oBAAYA,GAAAA,CAAC,WAAA,EAAA,EAAY,QAAA,EAAoB,CAAA;AAAA,wBAG9CA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,MAAM,KAAA,CAAM,IAAA;AAAA,YACZ,UAAU,CAAA,IAAA,KAAQ,YAAA,CAAa,EAAE,GAAG,KAAA,EAAO,MAAM,CAAA;AAAA,YACjD,MAAA,EAAQ,UAAA;AAAA,YACR,gBAAgB,CAAA,IAAA,KAAQ,kBAAA,GAAqB,EAAE,GAAG,KAAA,EAAO,MAAM,CAAA;AAAA,YAC/D,MAAA;AAAA,YACA,UAAA;AAAA,YACA,IAAA;AAAA,YACA,QAAA,EAAU,YAAY,IAAA,KAAS;AAAA;AAAA,SACjC;AAAA,wBAGAA,GAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,OAAO,KAAA,CAAM,SAAA;AAAA,YACb,OAAO,KAAA,CAAM,KAAA;AAAA,YACb,IAAA;AAAA,YACA,IAAA;AAAA,YACA;AAAA;AAAA,SACF;AAAA,QAGC,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,CAAA,EAAA,KAAM;AACxB,UAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,GAAA,CAAI,EAAA,CAAG,IAAI,CAAA;AAC3C,UAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,UAAA,uBACEA,GAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cAEC,OAAA,EAAS,EAAA;AAAA,cACT,OAAA;AAAA,cACA,UAAA,EAAY,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,EAAE,CAAA;AAAA,cACjC,IAAA;AAAA,cACA,IAAA;AAAA,cACA,MAAA;AAAA,cACA,UAAA;AAAA,cACA,WAAA;AAAA,cACA,QAAA;AAAA,cACA,UAAA,EAAY,SAAA,EAAW,GAAA,CAAI,EAAA,CAAG,EAAE,CAAA;AAAA,cAChC,QAAA,EAAU,CAAA,KAAA,KAAS,eAAA,CAAgB,EAAA,CAAG,IAAI,KAAK,CAAA;AAAA,cAC/C,MAAA,EAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,cAAc,EAAA,CAAG,EAAA,EAAI,GAAG,CAAC,CAAA;AAAA,cAC3C,YAAA,EAAc,CAAC,CAAA,EAAG,CAAA,KAAM,aAAa,EAAA,CAAG,EAAA,EAAI,GAAG,CAAC,CAAA;AAAA,cAChD,QAAA,EAAU,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,KAAM,eAAA,CAAgB,EAAA,CAAG,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAA,cAC3D,cAAA,EAAgB,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,KAAM,cAAA,CAAe,EAAA,CAAG,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAA,cAChE,QAAA,EAAU,CAAA,CAAA,KAAK,eAAA,CAAgB,EAAA,CAAG,IAAI,CAAC,CAAA;AAAA,cACvC,cAAA,EAAgB,CAAA,CAAA,KAAK,cAAA,CAAe,EAAA,CAAG,IAAI,CAAC,CAAA;AAAA,cAC5C,QAAA,EAAU,MAAM,eAAA,CAAgB,EAAA,CAAG,EAAE,CAAA;AAAA,cACrC,eAAe,oBAAA,GAAuB,MAAM,oBAAA,CAAqB,EAAA,CAAG,EAAE,CAAA,GAAI;AAAA,aAAA;AAAA,YAnBrE,EAAA,CAAG;AAAA,WAoBV;AAAA,QAEJ,CAAC,CAAA;AAAA,QAGA,SAAS,KAAA,CAAM,CAAA,GAAI,KAAK,KAAA,CAAM,CAAA,GAAI,qBACjCA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,GAAG,KAAA,CAAM,CAAA;AAAA,YAAG,GAAG,KAAA,CAAM,CAAA;AAAA,YAAG,OAAO,KAAA,CAAM,CAAA;AAAA,YAAG,QAAQ,KAAA,CAAM,CAAA;AAAA,YACtD,IAAA,EAAK,uBAAA;AAAA,YACL,MAAA,EAAO,SAAA;AAAA,YACP,aAAa,CAAA,GAAI,IAAA;AAAA,YACjB,iBAAiB,CAAA,EAAG,CAAA,GAAI,IAAI,CAAA,CAAA,EAAI,IAAI,IAAI,CAAA,CAAA;AAAA,YACxC,KAAA,EAAO,EAAE,aAAA,EAAe,MAAA;AAAO;AAAA,SACjC;AAAA,QAID,QAAA,oBACCC,IAAAA,CAAAC,QAAAA,EAAA,EAEG,QAAA,EAAA;AAAA,UAAA,WAAA,oBACCF,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,CAAA,EAAG,WAAA;AAAA,cACH,IAAA,EAAK,SAAA;AAAA,cACL,WAAA,EAAa,IAAA;AAAA,cACb,MAAA,EAAO,SAAA;AAAA,cACP,aAAa,CAAA,GAAI,IAAA;AAAA,cACjB,iBAAiB,CAAA,EAAG,CAAA,GAAI,IAAI,CAAA,CAAA,EAAI,IAAI,IAAI,CAAA,CAAA;AAAA,cACxC,KAAA,EAAO,EAAE,aAAA,EAAe,MAAA;AAAO;AAAA,WACjC;AAAA,0BAGFA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAI,QAAA,CAAS,MAAA;AAAA,cAAQ,IAAI,QAAA,CAAS,MAAA;AAAA,cAClC,GAAG,CAAA,GAAI,IAAA;AAAA,cACP,IAAA,EAAK,SAAA;AAAA,cAAU,MAAA,EAAO,OAAA;AAAA,cAAQ,aAAa,GAAA,GAAM,IAAA;AAAA,cACjD,KAAA,EAAO,EAAE,aAAA,EAAe,MAAA;AAAO;AAAA,WACjC;AAAA,UAEC,QAAA,CAAS,+BACRA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI,SAAS,WAAA,CAAY,CAAA;AAAA,cAAG,EAAA,EAAI,SAAS,WAAA,CAAY,CAAA;AAAA,cACrD,GAAG,CAAA,GAAI,IAAA;AAAA,cACP,IAAA,EAAK,MAAA;AAAA,cAAO,MAAA,EAAO,SAAA;AAAA,cAAU,aAAa,CAAA,GAAI,IAAA;AAAA,cAC9C,KAAA,EAAO,EAAE,aAAA,EAAe,MAAA;AAAO;AAAA;AACjC,SAAA,EAEJ;AAAA,OAAA,EAEJ;AAAA;AAAA,GACF;AAEJ;ACjcA,SAAS,SAAS,EAAE,KAAA,EAAO,OAAO,QAAA,EAAU,IAAA,GAAO,GAAE,EAAkB;AACrE,EAAA,uBACEC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,uBAAA,EACf,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gEAAA,EACb,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,oBACAA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAAA,QACvB,IAAA;AAAA,QACA,UAAU,CAAA,CAAA,KAAK,QAAA,CAAS,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QAC9C,SAAA,EAAU;AAAA;AAAA;AACZ,GAAA,EACF,CAAA;AAEJ;AAIO,SAAS,eAAA,CAAgB;AAAA,EAC9B,QAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,QAAQ,QAAA,CAAS,MAAA;AAEvB,EAAA,MAAM,iBAAA,GAAoBI,WAAAA;AAAA,IACxB,CAAC,EAAA,EAAY,CAAA,KAAqC,cAAc,EAAA,EAAI,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,IAClF,CAAC,aAAa;AAAA,GAChB;AAEA,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA;AAGxB,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,MAAM,MAAM,QAAA,CAAS,GAAA,CAAI,CAAAS,GAAAA,KAAMA,IAAG,EAAE,CAAA;AACpC,IAAA,uBACEZ,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kGAAA,EAAmG,QAAA,EAAA,aAAA,EAElH,CAAA;AAAA,sBACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wEAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mCAAA,EAAqC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBAC3DA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAAyB,QAAA,EAAA,yBAAA,EAAuB;AAAA,OAAA,EAClE,CAAA;AAAA,sBACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,WAAA,CAAY,GAAG,CAAA;AAAA,YAC9B,SAAA,EAAU,+GAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,QAAA,CAAS,GAAG,CAAA;AAAA,YAC3B,SAAA,EAAU,oHAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,MAAM,EAAA,GAAK,SAAS,CAAC,CAAA;AACrB,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,EAAA,CAAG,IAAI,CAAA;AAEpC,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAA8E;AAC7F,IAAA,gBAAA;AAAA,MACE,EAAA,CAAG,EAAA;AAAA,MACH,KAAA,CAAM,KAAK,EAAA,CAAG,CAAA;AAAA,MACd,KAAA,CAAM,KAAK,EAAA,CAAG,CAAA;AAAA,MACd,KAAA,CAAM,KAAK,EAAA,CAAG,KAAA;AAAA,MACd,KAAA,CAAM,KAAK,EAAA,CAAG,MAAA;AAAA,MACd,KAAA,CAAM,KAAK,EAAA,CAAG;AAAA,KAChB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gFAAA,EAEb,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kGAAA,EAAmG,QAAA,EAAA,aAAA,EAElH,CAAA;AAAA,oBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EAEZ,QAAA,EAAA;AAAA,MAAA,OAAA,oBACCA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,wCAAA;AAAA,YACV,OAAO,EAAE,UAAA,EAAY,QAAQ,KAAA,EAAO,WAAA,EAAa,QAAQ,WAAA;AAAY;AAAA,SACvE;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6CAAA,EAA+C,kBAAQ,KAAA,EAAM;AAAA,OAAA,EAC/E,CAAA;AAAA,sBAIFC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,uBAAA,EACf,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gEAAA,EAAiE,QAAA,EAAA,UAAA,EAEjF,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,MAAA;AAAA,YACL,KAAA,EAAO,GAAG,KAAA,IAAS,EAAA;AAAA,YACnB,WAAA,EAAa,SAAS,KAAA,IAAS,EAAA;AAAA,YAC/B,QAAA,EAAU,CAAA,CAAA,KAAK,iBAAA,CAAkB,EAAA,CAAG,IAAI,CAAC,CAAA;AAAA,YACzC,SAAA,EAAU;AAAA;AAAA;AACZ,OAAA,EACF,CAAA;AAAA,sBAGAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,GAAA,EAAI,OAAO,EAAA,CAAG,CAAA,EAAG,QAAA,EAAU,CAAA,CAAA,KAAK,OAAA,CAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA;AAAA,wBACnEA,GAAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,KAAI,KAAA,EAAO,EAAA,CAAG,CAAA,EAAG,QAAA,EAAU,OAAK,OAAA,CAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG;AAAA,OAAA,EACrE,CAAA;AAAA,sBAGAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,IAAC,QAAA,EAAA,EAAS,KAAA,EAAM,SAAQ,KAAA,EAAO,EAAA,CAAG,OAAQ,QAAA,EAAU,CAAA,CAAA,KAAK,OAAA,CAAQ,EAAE,GAAG,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA;AAAA,wBACzFA,GAAAA,CAAC,QAAA,EAAA,EAAS,OAAM,MAAA,EAAQ,KAAA,EAAO,GAAG,MAAA,EAAQ,QAAA,EAAU,OAAK,OAAA,CAAQ,EAAE,GAAG,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA,EAAG,CAAA,EAAG;AAAA,OAAA,EAC3F,CAAA;AAAA,sBAGAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,IAAC,QAAA,EAAA,EAAS,KAAA,EAAM,kBAAA,EAAa,KAAA,EAAO,GAAG,QAAA,EAAU,QAAA,EAAU,CAAA,CAAA,KAAK,OAAA,CAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,MAAM,EAAA,EAAI,CAAA;AAAA,wBAC7FC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,uBAAA,EACf,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gEAAA,EAAiE,QAAA,EAAA,MAAA,EAEjF,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAS,MAAM,OAAA,CAAQ,EAAE,CAAA,EAAG,GAAG,CAAA;AAAA,cAC/B,SAAA,EAAU,wGAAA;AAAA,cACX,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,MAGC,EAAA,CAAG,QAAA,IAAY,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,QAAQ,CAAA,CAAE,MAAA,GAAS,CAAA,oBAChDC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gEAAA,EAAiE,QAAA,EAAA,UAAA,EAEjF,CAAA;AAAA,QACC,MAAA,CAAO,OAAA,CAAQ,EAAA,CAAG,QAAQ,EAAE,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,qBACrCC,IAAAA,CAAC,KAAA,EAAA,EAAY,WAAU,6CAAA,EACrB,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,QAAA,EAAA,CAAA,EAAE,CAAA;AAAA,0BAC9BA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,8BAAA,EAAgC,QAAA,EAAA,MAAA,CAAO,CAAC,CAAA,EAAE;AAAA,SAAA,EAAA,EAFlD,CAGV,CACD;AAAA,OAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAGAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,SAAS,MAAM,WAAA,CAAY,CAAC,EAAA,CAAG,EAAE,CAAC,CAAA;AAAA,UAClC,SAAA,EAAU,+GAAA;AAAA,UACX,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,SAAS,MAAM,QAAA,CAAS,CAAC,EAAA,CAAG,EAAE,CAAC,CAAA;AAAA,UAC/B,SAAA,EAAU,oHAAA;AAAA,UACX,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACtLO,SAAS,SAAA,CAAU;AAAA,EACxB,MAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIQ,SAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,EAAE,CAAA;AAC7C,EAAA,MAAM,QAAA,GAAWL,OAAyB,IAAI,CAAA;AAE9C,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,EAAM,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAK,CAAA;AAE9D,EAAA,MAAM,YAAA,GAAeC,WAAAA,CAAY,CAAC,KAAA,KAAiB;AACjD,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,YAAA,CAAa,MAAM,EAAE,CAAA;AACrB,IAAA,YAAA,CAAa,MAAM,IAAI,CAAA;AACvB,IAAA,UAAA,CAAW,MAAM,QAAA,CAAS,OAAA,EAAS,MAAA,IAAU,CAAC,CAAA;AAAA,EAChD,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,UAAA,GAAaA,YAAY,MAAM;AACnC,IAAA,IAAI,SAAA,IAAa,SAAA,CAAU,IAAA,EAAK,EAAG;AACjC,MAAA,QAAA,CAAS,SAAA,EAAW,SAAA,CAAU,IAAA,EAAM,CAAA;AAAA,IACtC;AACA,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,SAAA,EAAW,SAAA,EAAW,QAAQ,CAAC,CAAA;AAEnC,EAAA,MAAM,UAAA,GAAaA,YAAY,MAAM;AACnC,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgBA,WAAAA,CAAY,CAAC,CAAA,KAAuC;AACxE,IAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AAAE,MAAA,CAAA,CAAE,cAAA,EAAe;AAAG,MAAA,UAAA,EAAW;AAAA,IAAG;AAC3D,IAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AAAE,MAAA,CAAA,CAAE,cAAA,EAAe;AAAG,MAAA,UAAA,EAAW;AAAA,IAAG;AAAA,EAC9D,CAAA,EAAG,CAAC,UAAA,EAAY,UAAU,CAAC,CAAA;AAE3B,EAAA,uBACEH,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iGAAA,EACZ,QAAA,EAAA;AAAA,IAAA,MAAA,CAAO,IAAI,CAAA,KAAA,KAAS;AACnB,MAAA,MAAM,QAAA,GAAW,MAAM,EAAA,KAAO,aAAA;AAC9B,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AAChC,MAAA,MAAM,cAAc,GAAA,GAAM,CAAA;AAC1B,MAAA,MAAM,YAAA,GAAe,GAAA,GAAM,MAAA,CAAO,MAAA,GAAS,CAAA;AAE3C,MAAA,uBACEA,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAW;AAAA,YACT,iFAAA;AAAA,YACA,WACI,sDAAA,GACA;AAAA,WACN,CAAE,KAAK,GAAG,CAAA;AAAA,UACV,SAAS,MAAM,CAAC,QAAA,IAAY,QAAA,CAAS,MAAM,EAAE,CAAA;AAAA,UAE5C,QAAA,EAAA;AAAA,YAAA,CAAC,QAAA,IAAY,QAAA,IAAY,WAAA,oBACxBD,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,yDAAA;AAAA,gBACV,SAAS,CAAA,CAAA,KAAK;AAAE,kBAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,kBAAA,SAAA,CAAU,KAAA,CAAM,IAAI,MAAM,CAAA;AAAA,gBAAG,CAAA;AAAA,gBAClE,KAAA,EAAM,sBAAA;AAAA,gBACP,QAAA,EAAA;AAAA;AAAA,aAED;AAAA,YAGD,SAAA,KAAc,KAAA,CAAM,EAAA,mBACnBA,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,GAAA,EAAK,QAAA;AAAA,gBACL,KAAA,EAAO,SAAA;AAAA,gBACP,QAAA,EAAU,CAAA,CAAA,KAAK,YAAA,CAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBAC1C,MAAA,EAAQ,UAAA;AAAA,gBACR,SAAA,EAAW,aAAA;AAAA,gBACX,OAAA,EAAS,CAAA,CAAA,KAAK,CAAA,CAAE,eAAA,EAAgB;AAAA,gBAChC,SAAA,EAAU;AAAA;AAAA,gCAGZA,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,eAAe,CAAA,CAAA,KAAK;AAAE,kBAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,kBAAA,YAAA,CAAa,KAAK,CAAA;AAAA,gBAAG,CAAA;AAAA,gBAChE,SAAA,EAAU,aAAA;AAAA,gBAET,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA,aACT;AAAA,YAGD,CAAC,QAAA,IAAY,QAAA,IAAY,YAAA,oBACxBA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,yDAAA;AAAA,gBACV,SAAS,CAAA,CAAA,KAAK;AAAE,kBAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,kBAAA,SAAA,CAAU,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,gBAAG,CAAA;AAAA,gBACnE,KAAA,EAAM,oBAAA;AAAA,gBACP,QAAA,EAAA;AAAA;AAAA,aAED;AAAA,YAGD,CAAC,QAAA,IAAY,MAAA,CAAO,MAAA,GAAS,qBAC5BA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,uDAAA;AAAA,gBACV,SAAS,CAAA,CAAA,KAAK;AAAE,kBAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,kBAAA,QAAA,CAAS,MAAM,EAAE,CAAA;AAAA,gBAAG,CAAA;AAAA,gBACzD,KAAA,EAAM,iBAAA;AAAA,gBACP,QAAA,EAAA;AAAA;AAAA;AAED;AAAA,SAAA;AAAA,QAvDG,KAAA,CAAM;AAAA,OAyDb;AAAA,IAEJ,CAAC,CAAA;AAAA,IAEA,CAAC,4BACAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,4KAAA;AAAA,QACV,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAM,kBAAA;AAAA,QACP,QAAA,EAAA;AAAA;AAAA;AAED,GAAA,EAEJ,CAAA;AAEJ;ACrHO,SAAS,WAAW,OAAA,EAAmB;AAC5C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIQ,QAAAA,CAAuB;AAAA,IACnD,MAAM,EAAC;AAAA,IACP,OAAA,EAAS,OAAA;AAAA,IACT,QAAQ;AAAC,GACV,CAAA;AAGD,EAAA,MAAM,IAAA,GAAOJ,WAAAA,CAAY,CAAC,IAAA,KAAmB;AAC3C,IAAA,UAAA,CAAW,CAAA,CAAA,MAAM;AAAA,MACf,IAAA,EAAM,CAAC,GAAG,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,GAAkB,CAAA,EAAG,CAAA,CAAE,OAAO,CAAA;AAAA,MACrD,OAAA,EAAS,IAAA;AAAA,MACT,QAAQ;AAAC,KACX,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,OAAA,GAAUA,WAAAA,CAAY,CAAC,IAAA,KAAmB;AAC9C,IAAA,UAAA,CAAW,QAAM,EAAE,GAAG,CAAA,EAAG,OAAA,EAAS,MAAK,CAAE,CAAA;AAAA,EAC3C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,IAAA,GAAOA,YAAY,MAAM;AAC7B,IAAA,UAAA,CAAW,CAAA,CAAA,KAAK;AACd,MAAA,IAAI,CAAA,CAAE,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAChC,MAAA,MAAM,WAAW,CAAA,CAAE,IAAA,CAAK,CAAA,CAAE,IAAA,CAAK,SAAS,CAAC,CAAA;AACzC,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,GAAG,EAAE,CAAA;AAAA,QACxB,OAAA,EAAS,QAAA;AAAA,QACT,QAAQ,CAAC,CAAA,CAAE,OAAA,EAAS,GAAG,EAAE,MAAM;AAAA,OACjC;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,IAAA,GAAOA,YAAY,MAAM;AAC7B,IAAA,UAAA,CAAW,CAAA,CAAA,KAAK;AACd,MAAA,IAAI,CAAA,CAAE,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAClC,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA;AACvB,MAAA,OAAO;AAAA,QACL,MAAM,CAAC,GAAG,CAAA,CAAE,IAAA,EAAM,EAAE,OAAO,CAAA;AAAA,QAC3B,OAAA,EAAS,IAAA;AAAA,QACT,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,KAAA,CAAM,CAAC;AAAA,OAC1B;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,KAAK,OAAA,CAAQ,OAAA;AAAA,IACb,OAAA,EAAS,OAAA,CAAQ,IAAA,CAAK,MAAA,GAAS,CAAA;AAAA,IAC/B,OAAA,EAAS,OAAA,CAAQ,MAAA,CAAO,MAAA,GAAS,CAAA;AAAA,IACjC,IAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF;AACF;AC/DO,SAAS,YAAA,GAAe;AAC7B,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,IAAII,QAAAA,iBAA8B,IAAI,KAAK,CAAA;AAE7E,EAAA,MAAM,MAAA,GAASJ,WAAAA,CAAY,CAAC,EAAA,EAAY,QAAQ,KAAA,KAAU;AACxD,IAAA,cAAA,CAAe,CAAA,IAAA,KAAQ;AACrB,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,QAAA,IAAI,KAAK,GAAA,CAAI,EAAE,CAAA,EAAG,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,aAC3B,IAAA,CAAK,IAAI,EAAE,CAAA;AAChB,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,IAAI,KAAK,IAAA,KAAS,CAAA,IAAK,KAAK,GAAA,CAAI,EAAE,GAAG,OAAO,IAAA;AAC5C,MAAA,uBAAO,IAAI,GAAA,CAAI,CAAC,EAAE,CAAC,CAAA;AAAA,IACrB,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAYA,WAAAA,CAAY,CAAC,GAAA,KAAkB;AAC/C,IAAA,cAAA,CAAe,IAAI,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,EAC7B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQA,YAAY,MAAM;AAC9B,IAAA,cAAA,CAAe,UAAS,IAAA,CAAK,IAAA,KAAS,IAAI,IAAA,mBAAO,IAAI,KAAM,CAAA;AAAA,EAC7D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAaA,WAAAA;AAAA,IACjB,CAAC,EAAA,KAAe,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AAAA,IAClC,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,OAAO,EAAE,WAAA,EAAa,MAAA,EAAQ,SAAA,EAAW,OAAO,UAAA,EAAW;AAC7D;;;ACxCO,IAAM,KAAA,GAAQ,MAAc,MAAA,CAAO,UAAA;ACyB1C,SAAS,cAAA,CAAe,EAAA,EAAY,EAAA,EAAY,GAAA,EAAkC;AAChF,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,GAAS,GAAG,CAAA,GAAI,GAAA,CAAI,MAAA,EAAQ,CAAA,GAAI,CAAA,EAAA,EAAK;AAC3D,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA;AACzC,IAAA,IAAK,EAAA,GAAK,EAAA,KAAS,EAAA,GAAK,EAAA,IAAO,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,KAAO,EAAA,GAAK,EAAA,CAAA,IAAO,EAAA,GAAK,EAAA,CAAA,GAAM,EAAA,WAAa,CAAC,MAAA;AAAA,EACxF;AACA,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,mBAAA,CAAoB,EAAA,EAAY,EAAA,EAAY,GAAA,EAAmD;AACtG,EAAA,IAAI,QAAA,GAAW,QAAA,EAAU,EAAA,GAAK,GAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAA,EAAG,EAAA,GAAK,GAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAA;AACtD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,GAAS,GAAG,CAAA,GAAI,GAAA,CAAI,MAAA,EAAQ,CAAA,GAAI,CAAA,EAAA,EAAK;AAC3D,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,EAAG,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA;AAC3C,IAAA,MAAM,EAAA,GAAK,GAAA,GAAM,EAAA,EAAI,EAAA,GAAK,GAAA,GAAM,EAAA;AAChC,IAAA,MAAM,IAAA,GAAO,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC5B,IAAA,MAAM,IAAI,IAAA,GAAO,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,MAAM,EAAA,GAAA,CAAM,EAAA,GAAK,MAAM,EAAA,IAAM,IAAI,CAAC,CAAA,GAAI,CAAA;AAC1F,IAAA,MAAM,KAAK,EAAA,GAAK,CAAA,GAAI,EAAA,EAAI,EAAA,GAAK,KAAK,CAAA,GAAI,EAAA;AACtC,IAAA,MAAM,IAAA,GAAA,CAAQ,EAAA,GAAK,EAAA,KAAO,CAAA,GAAA,CAAK,KAAK,EAAA,KAAO,CAAA;AAC3C,IAAA,IAAI,OAAO,QAAA,EAAU;AAAE,MAAA,QAAA,GAAW,IAAA;AAAM,MAAA,EAAA,GAAK,EAAA;AAAI,MAAA,EAAA,GAAK,EAAA;AAAA,IAAI;AAAA,EAC5D;AACA,EAAA,OAAO,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAG;AACxB;AAEA,SAAS,YAAA,CACP,CAAA,EAAW,CAAA,EACX,CAAA,EAAW,GACX,IAAA,EAC0B;AAI1B,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AACvB,EAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AACf,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACnB,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AAEnB,EAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAQ;AACzB,IAAA,MAAM,EAAA,GAAK,KAAK,CAAA,IAAK,CAAA;AACrB,IAAA,MAAM,EAAA,GAAK,KAAK,CAAA,IAAK,CAAA;AACrB,IAAA,MAAM,EAAA,GAAK,KAAK,KAAA,IAAS,CAAA;AACzB,IAAA,MAAM,EAAA,GAAK,KAAK,MAAA,IAAU,CAAA;AAC1B,IAAA,MAAM,MAAM,EAAA,IAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,KAAK,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,KAAK,EAAA,EAAI,EAAE,CAAC,CAAA,GAAI,KAAK,EAAA,GAAK,CAAA;AAChF,IAAA,MAAM,MAAM,EAAA,IAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,KAAK,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,KAAK,EAAA,EAAI,EAAE,CAAC,CAAA,GAAI,KAAK,EAAA,GAAK,CAAA;AAChF,IAAA,OAAO,EAAE,GAAG,GAAA,GAAM,CAAA,GAAI,GAAG,CAAA,EAAG,GAAA,GAAM,IAAI,CAAA,EAAE;AAAA,EAC1C;AACA,EAAA,IAAI,IAAA,CAAK,UAAU,SAAA,EAAW;AAC5B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,IAAU,EAAC;AAC5B,IAAA,IAAI,IAAI,MAAA,GAAS,CAAA,EAAG,OAAO,EAAE,GAAG,CAAA,EAAE;AAClC,IAAA,IAAI,cAAA,CAAe,IAAI,EAAA,EAAI,GAAG,GAAG,OAAO,EAAE,GAAG,CAAA,EAAE;AAC/C,IAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA;AAC/C,IAAA,OAAO,EAAE,CAAA,EAAG,OAAA,CAAQ,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,EAAG,OAAA,CAAQ,CAAA,GAAI,CAAA,GAAI,CAAA,EAAE;AAAA,EACtD;AACA,EAAA,OAAO,EAAE,GAAG,CAAA,EAAE;AAChB;AAEA,SAAS,gBAAA,GAA6B;AACpC,EAAA,OAAO;AAAA,IACL,IAAI,KAAA,EAAM;AAAA,IACV,IAAA,EAAM,YAAA;AAAA,IACN,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,IAAI,KAAA,EAAM;AAAA,QACV,IAAA,EAAM,UAAA;AAAA,QACN,KAAA,EAAO,CAAA;AAAA,QACP,IAAA,EAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,GAAA,EAAI;AAAA,QAC7D,WAAW,EAAC;AAAA,QACZ,OAAO,EAAC;AAAA,QACR,UAAU;AAAC;AACb;AACF,GACF;AACF;AAEA,IAAM,mBAAA,GAAoC,EAAE,EAAA,EAAI,WAAA,EAAa,MAAM,EAAA,EAAI,YAAA,EAAc,EAAC,EAAE;AAExF,SAAS,WAAA,CAAY,KAAe,YAAA,EAA+B;AACjE,EAAA,OAAO;AAAA,IACL,GAAG,GAAA;AAAA,IACH,MAAA,EAAQ,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAM,EAAE,EAAA,KAAO,YAAA,CAAa,EAAA,GAAK,YAAA,GAAe,CAAE;AAAA,GAC3E;AACF;AAEA,SAAS,cAAc,IAAA,EAA4B;AACjD,EAAA,MAAM,EAAA,GAAK,KAAK,CAAA,IAAK,CAAA;AACrB,EAAA,MAAM,EAAA,GAAK,KAAK,CAAA,IAAK,CAAA;AACrB,EAAA,MAAM,EAAA,GAAK,KAAK,KAAA,IAAS,GAAA;AACzB,EAAA,MAAM,EAAA,GAAK,KAAK,MAAA,IAAU,GAAA;AAC1B,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,CAAC,IAAI,EAAE,CAAA;AAAA,MACP,CAAC,EAAA,GAAK,EAAA,EAAI,EAAE,CAAA;AAAA,MACZ,CAAC,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAE,CAAA;AAAA,MACjB,CAAC,EAAA,EAAI,EAAA,GAAK,EAAE;AAAA;AACd,GACF;AACF;AAEA,SAAS,cAAc,IAAA,EAA4B;AACjD,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,IAAU,EAAC;AAC5B,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,GAAA,EAAK,QAAQ,GAAA,EAAI;AACpF,EAAA,MAAM,KAAK,GAAA,CAAI,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,CAAC,CAAC,CAAA;AAC5B,EAAA,MAAM,KAAK,GAAA,CAAI,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,CAAC,CAAC,CAAA;AAC5B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,EAAE,CAAA;AAC3B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,EAAE,CAAA;AAC3B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,EAAE,CAAA;AAC3B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,EAAE,CAAA;AAC3B,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,MAAA;AAAA,IACP,CAAA,EAAG,IAAA;AAAA,IACH,CAAA,EAAG,IAAA;AAAA,IACH,OAAO,IAAA,GAAO,IAAA;AAAA,IACd,QAAQ,IAAA,GAAO;AAAA,GACjB;AACF;AAIO,SAAS,cAAA,CAAe;AAAA,EAC7B,YAAA,GAAe,mBAAA;AAAA,EACf,UAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ,MAAA;AAAA,EACR,MAAA,GAAS,OAAA;AAAA,EACT,QAAA,GAAW,EAAA;AAAA,EACX,UAAU,YAAA,GAAe,IAAA;AAAA,EACzB,YAAY,WAAA,GAAc,KAAA;AAAA,EAC1B,QAAA,GAAW,KAAA;AAAA,EACX,KAAA,GAAQ,KAAA;AAAA,EACR,aAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,aAAA,GAAgBD,MAAAA,CAAiB,UAAA,IAAc,gBAAA,EAAkB,CAAA;AAEvE,EAAA,MAAM,EAAE,KAAK,OAAA,EAAS,OAAA,EAAS,MAAM,OAAA,EAAS,IAAA,EAAM,MAAK,GAAI,UAAA;AAAA,IAC3D,aAAA,CAAc;AAAA,GAChB;AACA,EAAA,MAAM,EAAE,WAAA,EAAa,MAAA,EAAQ,WAAW,KAAA,EAAO,cAAA,KAAmB,YAAA,EAAa;AAE/E,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIK,QAAAA;AAAA,IACxC,MAAM,aAAA,CAAc,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAG,EAAA,IAAM;AAAA,GAC/C;AACA,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAmB,QAAQ,CAAA;AACnD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,YAAY,CAAA;AACrD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAS,CAAC,CAAA;AAClC,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAE9E,EAAA,MAAM,SAAA,GAAYL,MAAAA,CAAiC,MAAM,MAAS,CAAA;AAClE,EAAA,MAAM,YAAA,GAAeA,MAAAA,CAAmB,MAAM,MAAS,CAAA;AACvD,EAAA,MAAM,cAAA,GAAiBA,OAAyB,IAAI,CAAA;AACpD,EAAA,MAAM,eAAA,GAAkBA,OAAyB,IAAI,CAAA;AAGrD,EAAA,MAAM,aAAA,GAAgBC,YAAY,MAAM;AACtC,IAAA,MAAM,CAAA,GAAI,IAAI,GAAA,CAAI,YAAA,CAAa,YAAA,CAAa,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AAC/D,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,SAAA,IAAa,EAAC;AAC/B,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,EAAG;AACvC,MAAA,KAAA,MAAW,CAAA,IAAK,MAAM,OAAA,EAAS;AAC7B,QAAA,IAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAA,CAAE,EAAE,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AAAA,MACjC;AAAA,IACF;AACA,IAAA,OAAO,CAAA;AAAA,EACT,CAAA,EAAG,CAAC,YAAA,EAAc,GAAA,CAAI,SAAS,CAAC,CAAA;AAEhC,EAAA,MAAM,eAAA,GAAkBD,MAAAA,CAAO,aAAA,EAAe,CAAA;AAC9C,EAAAW,UAAU,MAAM;AACd,IAAA,eAAA,CAAgB,UAAU,aAAA,EAAc;AAAA,EAC1C,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAGlB,EAAA,MAAM,aAAA,GAAgB,QAAwB,MAAM;AAClD,IAAA,MAAM,SAAyB,EAAC;AAEhC,IAAA,IAAI,YAAA,CAAa,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AACxC,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,EAAA,EAAI,YAAA,CAAa,EAAA,EAAI,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,KAAA,EAAO,YAAA,CAAa,YAAA,EAAc,MAAA,EAAQ,MAAM,CAAA;AAAA,IAC9G;AACA,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,SAAA,IAAa,EAAC;AAC/B,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,EAAA,EAAI,GAAA,EAAK,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,KAAA,EAAO,KAAA,CAAM,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,IAChF;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,YAAA,EAAc,GAAA,CAAI,SAAS,CAAC,CAAA;AAGhC,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,iBAAA,EAAmB;AACvB,IAAA,MAAM,SAAA,GAAY,aAAA,CAAc,CAAC,CAAA,EAAG,MAAM,CAAC,CAAA;AAC3C,IAAA,IAAI,SAAA,EAAW,oBAAA,CAAqB,SAAA,CAAU,EAAE,CAAA;AAAA,EAClD,CAAA,EAAG,CAAC,aAAA,EAAe,iBAAiB,CAAC,CAAA;AAMrC,EAAA,MAAM,cAAA,GAAiBX,OAA6B,MAAS,CAAA;AAC7D,EAAA,MAAM,WAAA,GAAcA,OAAO,UAAU,CAAA;AAErC,EAAAW,UAAU,MAAM;AACd,IAAA,cAAA,CAAe,OAAA,GAAU,GAAA;AACzB,IAAA,QAAA,GAAW,GAAG,CAAA;AAAA,EAChB,CAAA,EAAG,CAAC,GAAA,EAAK,QAAQ,CAAC,CAAA;AAElB,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,IAAI,UAAA,KAAe,YAAY,OAAA,EAAS;AACxC,IAAA,WAAA,CAAY,OAAA,GAAU,UAAA;AACtB,IAAA,IAAI,UAAA,KAAe,eAAe,OAAA,EAAS;AAC3C,IAAA,IAAA,CAAK,UAAU,CAAA;AACf,IAAA,gBAAA,CAAiB,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,EAAE,CAAA;AAAA,EACjD,CAAA,EAAG,CAAC,UAAA,EAAY,IAAI,CAAC,CAAA;AAErB,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,EAAA,KAAO,aAAa,CAAA,IAAK,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA;AAEhF,EAAA,MAAM,YAAA,GAAeV,WAAAA;AAAA,IACnB,CAAC,KAAA,KAAiB,OAAA,CAAQ,WAAA,CAAY,GAAA,EAAK,KAAK,CAAC,CAAA;AAAA,IACjD,CAAC,KAAK,OAAO;AAAA,GACf;AAEA,EAAA,MAAM,SAAA,GAAYA,WAAAA;AAAA,IAChB,CAAC,KAAA,KAAiB,IAAA,CAAK,WAAA,CAAY,GAAA,EAAK,KAAK,CAAC,CAAA;AAAA,IAC9C,CAAC,KAAK,IAAI;AAAA,GACZ;AAGA,EAAA,MAAM,gBAAA,GAAmBA,WAAAA;AAAA,IACvB,CAAC,YAAA,KAAwB,YAAA,CAAa,YAAY,CAAA;AAAA,IAClD,CAAC,YAAY;AAAA,GACf;AAGA,EAAA,MAAM,sBAAA,GAAyBA,WAAAA;AAAA,IAC7B,CAAC,YAAA,KAAwB,SAAA,CAAU,YAAY,CAAA;AAAA,IAC/C,CAAC,SAAS;AAAA,GACZ;AAGA,EAAA,MAAM,cAAA,GAAiBA,WAAAA;AAAA,IACrB,CAAC,IAAY,EAAA,KAAe;AAC1B,MAAA,IAAI,CAAC,WAAA,EAAa;AAClB,MAAA,MAAM,OAAO,WAAA,CAAY,IAAA;AACzB,MAAA,MAAM,UAAqB,IAAA,CAAK,KAAA,KAAU,SAAA,GACtC,EAAE,GAAG,IAAA,EAAM,MAAA,EAAA,CAAS,IAAA,CAAK,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAC,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAqB,CAAA,EAAE,GAC7F,EAAE,GAAG,IAAA,EAAM,CAAA,EAAA,CAAI,IAAA,CAAK,KAAK,CAAA,IAAK,EAAA,EAAI,IAAI,IAAA,CAAK,CAAA,IAAK,KAAK,EAAA,EAAG;AAC5D,MAAA,YAAA,CAAa;AAAA,QACX,GAAG,WAAA;AAAA,QACH,IAAA,EAAM,OAAA;AAAA,QACN,WAAW,WAAA,CAAY,SAAA,CAAU,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,IAAI,EAAA,EAAI,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,IAAG,CAAE,CAAA;AAAA,QAC9E,UAAU,WAAA,CAAY,QAAA,CAAS,GAAA,CAAI,CAAA,EAAA,MAAO,EAAE,GAAG,EAAA,EAAI,CAAA,EAAG,EAAA,CAAG,IAAI,EAAA,EAAI,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,IAAG,CAAE;AAAA,OACjF,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,aAAa,YAAY;AAAA,GAC5B;AAGA,EAAA,MAAM,qBAAA,GAAwBA,YAAY,MAAM;AAC9C,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,MAAM,EAAE,MAAK,GAAI,WAAA;AACjB,IAAA,MAAM,OAAA,GAAqB,KAAK,KAAA,KAAU,SAAA,GACtC,cAAc,IAAI,CAAA,GAClB,cAAc,IAAI,CAAA;AACtB,IAAA,SAAA,CAAU,EAAE,GAAG,WAAA,EAAa,IAAA,EAAM,SAAS,CAAA;AAAA,EAC7C,CAAA,EAAG,CAAC,WAAA,EAAa,SAAS,CAAC,CAAA;AAI3B,EAAA,MAAM,cAAA,GAAiBA,YAAY,MAAM;AACvC,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,KAAK,GAAG,EAAE,CAAA;AACrE,IAAA,MAAM,QAAA,GAAkB;AAAA,MACtB,IAAI,KAAA,EAAM;AAAA,MACV,IAAA,EAAM,CAAA,OAAA,EAAU,GAAA,CAAI,MAAA,CAAO,SAAS,CAAC,CAAA,CAAA;AAAA,MACrC,OAAO,QAAA,GAAW,CAAA;AAAA,MAClB,IAAA,EAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,GAAA,EAAI;AAAA,MAC7D,WAAW,EAAC;AAAA,MACZ,OAAO,EAAC;AAAA,MACR,UAAU;AAAC,KACb;AACA,IAAA,MAAM,MAAA,GAAmB,EAAE,GAAG,GAAA,EAAK,MAAA,EAAQ,CAAC,GAAG,GAAA,CAAI,MAAA,EAAQ,QAAQ,CAAA,EAAE;AACrE,IAAA,IAAA,CAAK,MAAM,CAAA;AACX,IAAA,gBAAA,CAAiB,SAAS,EAAE,CAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,GAAA,EAAK,IAAI,CAAC,CAAA;AAEd,EAAA,MAAM,iBAAA,GAAoBA,WAAAA;AAAA,IACxB,CAAC,IAAY,IAAA,KAAiB;AAC5B,MAAA,MAAM,QAAQ,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,EAAE,CAAA;AAC9C,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,IAAA,CAAK,YAAY,GAAA,EAAK,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA;AAAA,IAC3C,CAAA;AAAA,IACA,CAAC,KAAK,IAAI;AAAA,GACZ;AAEA,EAAA,MAAM,iBAAA,GAAoBA,WAAAA;AAAA,IACxB,CAAC,EAAA,KAAe;AACd,MAAA,IAAI,GAAA,CAAI,MAAA,CAAO,MAAA,IAAU,CAAA,EAAG;AAC5B,MAAA,MAAM,YAAY,GAAA,CAAI,MAAA,CAAO,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,EAAE,CAAA;AACpD,MAAA,MAAM,MAAA,GAAmB,EAAE,GAAG,GAAA,EAAK,QAAQ,SAAA,EAAU;AACrD,MAAA,IAAA,CAAK,MAAM,CAAA;AACX,MAAA,IAAI,kBAAkB,EAAA,EAAI;AACxB,QAAA,gBAAA,CAAiB,SAAA,CAAU,CAAC,CAAA,EAAG,EAAA,IAAM,EAAE,CAAA;AAAA,MACzC;AAAA,IACF,CAAA;AAAA,IACA,CAAC,GAAA,EAAK,IAAA,EAAM,aAAa;AAAA,GAC3B;AAEA,EAAA,MAAM,kBAAA,GAAqBA,WAAAA;AAAA,IACzB,CAAC,IAAY,SAAA,KAAgC;AAC3C,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,KAAA,EAAM,CAAE,IAAA,CAAK,CAACW,EAAAA,EAAGC,EAAAA,KAAMD,EAAAA,CAAE,KAAA,GAAQC,EAAAA,CAAE,KAAK,CAAA;AAClE,MAAA,MAAM,MAAM,MAAA,CAAO,SAAA,CAAU,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,EAAE,CAAA;AAC7C,MAAA,IAAI,MAAM,CAAA,EAAG;AACb,MAAA,MAAM,OAAA,GAAU,SAAA,KAAc,MAAA,GAAS,GAAA,GAAM,IAAI,GAAA,GAAM,CAAA;AACvD,MAAA,IAAI,OAAA,GAAU,CAAA,IAAK,OAAA,IAAW,MAAA,CAAO,MAAA,EAAQ;AAC7C,MAAA,MAAM,CAAA,GAAI,OAAO,GAAG,CAAA;AACpB,MAAA,MAAM,CAAA,GAAI,OAAO,OAAO,CAAA;AACxB,MAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK;AACxC,QAAA,IAAI,CAAA,CAAE,EAAA,KAAO,CAAA,CAAE,EAAA,EAAI,OAAO,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM;AACjD,QAAA,IAAI,CAAA,CAAE,EAAA,KAAO,CAAA,CAAE,EAAA,EAAI,OAAO,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM;AACjD,QAAA,OAAO,CAAA;AAAA,MACT,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,EAAE,GAAG,GAAA,EAAK,MAAA,EAAQ,eAAe,CAAA;AAAA,IACxC,CAAA;AAAA,IACA,CAAC,KAAK,IAAI;AAAA,GACZ;AAIA,EAAA,MAAM,eAAA,GAAkBZ,YAAY,MAAM;AACxC,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,KAAK,SAAA,CAAU,GAAA,EAAK,IAAA,EAAM,CAAC,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,oBAAoB,CAAA;AAClF,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,IAAA,CAAA,CAAE,QAAA,GAAW,CAAA,EAAG,GAAA,CAAI,IAAA,IAAQ,MAAM,CAAA,KAAA,CAAA;AAClC,IAAA,CAAA,CAAE,KAAA,EAAM;AACR,IAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,EACzB,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,EAAA,MAAM,eAAA,GAAkBA,WAAAA;AAAA,IACtB,CAAC,IAAA,KAAe;AACd,MAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,MAAA,MAAA,CAAO,SAAS,CAAA,CAAA,KAAK;AACnB,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,QAAQ,MAAgB,CAAA;AACpD,UAAA,IAAA,CAAK,MAAM,CAAA;AACX,UAAA,gBAAA,CAAiB,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,EAAE,CAAA;AAAA,QAC7C,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF,CAAA;AACA,MAAA,MAAA,CAAO,WAAW,IAAI,CAAA;AAAA,IACxB,CAAA;AAAA,IACA,CAAC,IAAI;AAAA,GACP;AAEA,EAAA,MAAM,iBAAA,GAAoBA,WAAAA;AAAA,IACxB,CAAC,IAAA,KAAe;AACd,MAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,MAAA,MAAA,CAAO,SAAS,CAAA,CAAA,KAAK;AACnB,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,QAAQ,MAAgB,CAAA;AAEpD,UAAA,MAAM,MAAA,GAAyB,EAAE,GAAI,GAAA,CAAI,aAAa,EAAC,EAAI,GAAG,MAAA,EAAO;AACrE,UAAA,IAAA,CAAK,EAAE,GAAG,GAAA,EAAK,SAAA,EAAW,QAAQ,CAAA;AAAA,QACpC,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF,CAAA;AACA,MAAA,MAAA,CAAO,WAAW,IAAI,CAAA;AAAA,IACxB,CAAA;AAAA,IACA,CAAC,KAAK,IAAI;AAAA,GACZ;AAEA,EAAA,MAAM,wBAAA,GAA2BA,WAAAA;AAAA,IAC/B,CAAC,OAAA,KAAoB;AACnB,MAAA,MAAM,OAAO,EAAE,GAAI,GAAA,CAAI,SAAA,IAAa,EAAC,EAAG;AACxC,MAAA,OAAO,KAAK,OAAO,CAAA;AACnB,MAAA,IAAA,CAAK,EAAE,GAAG,GAAA,EAAK,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,IAAA,GAAO,MAAA,EAAW,CAAA;AAAA,IAC7E,CAAA;AAAA,IACA,CAAC,KAAK,IAAI;AAAA,GACZ;AAIA,EAAA,MAAM,sBAAA,GAAyB,CAAA;AAE/B,EAAA,MAAM,aAAA,GAAgBA,WAAAA;AAAA,IACpB,CAAC,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EACpC,aAA4B,SAAA,KAA6B;AACxD,MAAA,IAAI,CAAC,WAAA,EAAa;AAClB,MAAA,MAAM,KAAA,GAAoB,CAAC,GAAG,WAAA,CAAY,SAAS,CAAA;AAEnD,MAAA,IAAI,OAAA;AACJ,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,OAAA,GAAU,WAAA;AAAA,MACZ,CAAA,MAAO;AACL,QAAA,MAAM,CAAA,GAAc,EAAE,EAAA,EAAI,KAAA,IAAS,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAChD,QAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACZ,QAAA,OAAA,GAAU,CAAA,CAAE,EAAA;AAAA,MACd;AAEA,MAAA,IAAI,OAAA;AACJ,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,OAAA,GAAU,SAAA;AAAA,MACZ,CAAA,MAAO;AACL,QAAA,MAAM,CAAA,GAAc,EAAE,EAAA,EAAI,KAAA,IAAS,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAChD,QAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACZ,QAAA,OAAA,GAAU,CAAA,CAAE,EAAA;AAAA,MACd;AAEA,MAAA,MAAM,OAAA,GAAgB;AAAA,QACpB,IAAI,KAAA,EAAM;AAAA,QACV,OAAA;AAAA,QACA,OAAA;AAAA,QACA,SAAA,EAAW,sBAAA;AAAA,QACX,QAAA,EAAU;AAAA,OACZ;AAEA,MAAA,SAAA,CAAU,EAAE,GAAG,WAAA,EAAa,SAAA,EAAW,KAAA,EAAO,KAAA,EAAO,CAAC,GAAG,WAAA,CAAY,KAAA,EAAO,OAAO,CAAA,EAAG,CAAA;AAAA,IACxF,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,SAAA,EAAW,sBAAsB;AAAA,GACjD;AAEA,EAAA,MAAM,gBAAA,GAAmBA,WAAAA;AAAA,IACvB,CAAC,MAAA,KAAmB;AAClB,MAAA,IAAI,CAAC,WAAA,EAAa;AAClB,MAAA,MAAM,iBAAiB,WAAA,CAAY,KAAA,CAAM,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,MAAM,CAAA;AACpE,MAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,cAAA,CAAe,OAAA,CAAQ,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,OAAO,CAAC,CAAC,CAAA;AAC/E,MAAA,MAAM,cAAA,GAAiB,YAAY,SAAA,CAAU,MAAA,CAAO,OAAK,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AAC9E,MAAA,SAAA,CAAU,EAAE,GAAG,WAAA,EAAa,OAAO,cAAA,EAAgB,SAAA,EAAW,gBAAgB,CAAA;AAAA,IAChF,CAAA;AAAA,IACA,CAAC,aAAa,SAAS;AAAA,GACzB;AAIA,EAAA,MAAM,iBAAA,GAAoBA,WAAAA;AAAA,IACxB,CAAC,EAAA,EAAY,CAAA,EAAW,CAAA,KAAc;AACpC,MAAA,IAAI,CAAC,WAAA,EAAa;AAClB,MAAA,MAAM,KAAK,WAAA,CAAY,QAAA,CAAS,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,EAAE,CAAA;AACrD,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,MAAM,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,IAAG,GAAI,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,KAAA,EAAO,EAAA,CAAG,MAAA,EAAQ,YAAY,IAAI,CAAA;AACjF,MAAA,YAAA,CAAa;AAAA,QACX,GAAG,WAAA;AAAA,QACH,UAAU,WAAA,CAAY,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,EAAA,KAAO,EAAA,GAAK,EAAE,GAAG,GAAG,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,KAAO,CAAC;AAAA,OACjF,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,aAAa,YAAY;AAAA,GAC5B;AAEA,EAAA,MAAM,gBAAA,GAAmBA,WAAAA;AAAA,IACvB,CAAC,EAAA,EAAY,CAAA,EAAW,CAAA,KAAc;AACpC,MAAA,IAAI,CAAC,WAAA,EAAa;AAClB,MAAA,MAAM,KAAK,WAAA,CAAY,QAAA,CAAS,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,EAAE,CAAA;AACrD,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,MAAM,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,IAAG,GAAI,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,KAAA,EAAO,EAAA,CAAG,MAAA,EAAQ,YAAY,IAAI,CAAA;AACjF,MAAA,SAAA,CAAU;AAAA,QACR,GAAG,WAAA;AAAA,QACH,UAAU,WAAA,CAAY,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,EAAA,KAAO,EAAA,GAAK,EAAE,GAAG,GAAG,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,KAAO,CAAC;AAAA,OACjF,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,aAAa,SAAS;AAAA,GACzB;AAEA,EAAA,MAAM,mBAAA,GAAsBA,WAAAA;AAAA,IAC1B,CAAC,EAAA,EAAY,CAAA,EAAW,CAAA,EAAW,GAAW,CAAA,KAAc;AAC1D,MAAA,IAAI,CAAC,WAAA,EAAa;AAClB,MAAA,YAAA,CAAa;AAAA,QACX,GAAG,WAAA;AAAA,QACH,QAAA,EAAU,YAAY,QAAA,CAAS,GAAA;AAAA,UAAI,CAAA,EAAA,KACjC,EAAA,CAAG,EAAA,KAAO,EAAA,GAAK,EAAE,GAAG,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,GAAE,GAAI;AAAA;AACxD,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,aAAa,YAAY;AAAA,GAC5B;AAEA,EAAA,MAAM,kBAAA,GAAqBA,WAAAA;AAAA,IACzB,CAAC,EAAA,EAAY,CAAA,EAAW,CAAA,EAAW,GAAW,CAAA,KAAc;AAC1D,MAAA,IAAI,CAAC,WAAA,EAAa;AAClB,MAAA,SAAA,CAAU;AAAA,QACR,GAAG,WAAA;AAAA,QACH,QAAA,EAAU,YAAY,QAAA,CAAS,GAAA;AAAA,UAAI,CAAA,EAAA,KACjC,EAAA,CAAG,EAAA,KAAO,EAAA,GAAK,EAAE,GAAG,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,GAAE,GAAI;AAAA;AACxD,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,aAAa,SAAS;AAAA,GACzB;AAEA,EAAA,MAAM,mBAAA,GAAsBA,WAAAA;AAAA,IAC1B,CAAC,IAAY,QAAA,KAAqB;AAChC,MAAA,IAAI,CAAC,WAAA,EAAa;AAClB,MAAA,YAAA,CAAa;AAAA,QACX,GAAG,WAAA;AAAA,QACH,QAAA,EAAU,YAAY,QAAA,CAAS,GAAA;AAAA,UAAI,CAAA,EAAA,KACjC,GAAG,EAAA,KAAO,EAAA,GAAK,EAAE,GAAG,EAAA,EAAI,UAAS,GAAI;AAAA;AACvC,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,aAAa,YAAY;AAAA,GAC5B;AAEA,EAAA,MAAM,kBAAA,GAAqBA,WAAAA;AAAA,IACzB,CAAC,IAAY,QAAA,KAAqB;AAChC,MAAA,IAAI,CAAC,WAAA,EAAa;AAClB,MAAA,SAAA,CAAU;AAAA,QACR,GAAG,WAAA;AAAA,QACH,QAAA,EAAU,YAAY,QAAA,CAAS,GAAA;AAAA,UAAI,CAAA,EAAA,KACjC,GAAG,EAAA,KAAO,EAAA,GAAK,EAAE,GAAG,EAAA,EAAI,UAAS,GAAI;AAAA;AACvC,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,aAAa,SAAS;AAAA,GACzB;AAEA,EAAA,MAAM,mBAAA,GAAsBA,WAAAA;AAAA,IAC1B,CAAC,EAAA,KAAe;AACd,MAAA,IAAI,CAAC,WAAA,EAAa;AAClB,MAAA,cAAA,EAAe;AACf,MAAA,SAAA,CAAU;AAAA,QACR,GAAG,WAAA;AAAA,QACH,UAAU,WAAA,CAAY,QAAA,CAAS,OAAO,CAAA,EAAA,KAAM,EAAA,CAAG,OAAO,EAAE;AAAA,OACzD,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,SAAA,EAAW,cAAc;AAAA,GACzC;AAEA,EAAA,MAAM,oBAAA,GAAuBA,WAAAA;AAAA,IAC3B,CAAC,GAAA,KAAkB;AACjB,MAAA,IAAI,CAAC,WAAA,EAAa;AAClB,MAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,GAAG,CAAA;AACzB,MAAA,cAAA,EAAe;AACf,MAAA,SAAA,CAAU;AAAA,QACR,GAAG,WAAA;AAAA,QACH,QAAA,EAAU,WAAA,CAAY,QAAA,CAAS,MAAA,CAAO,CAAA,EAAA,KAAM,CAAC,KAAA,CAAM,GAAA,CAAI,EAAA,CAAG,EAAE,CAAC;AAAA,OAC9D,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,SAAA,EAAW,cAAc;AAAA,GACzC;AAEA,EAAA,MAAM,uBAAA,GAA0BA,WAAAA;AAAA,IAC9B,CAAC,GAAA,KAAkB;AACjB,MAAA,IAAI,CAAC,WAAA,EAAa;AAClB,MAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,GAAG,CAAA;AACzB,MAAA,MAAM,MAAA,GAAuB,WAAA,CAAY,QAAA,CACtC,MAAA,CAAO,CAAA,EAAA,KAAM,KAAA,CAAM,GAAA,CAAI,EAAA,CAAG,EAAE,CAAC,CAAA,CAC7B,GAAA,CAAI,CAAA,EAAA,MAAO,EAAE,GAAG,EAAA,EAAI,EAAA,EAAI,KAAA,EAAM,EAAG,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,EAAA,EAAG,CAAE,CAAA;AACjE,MAAA,MAAM,QAAA,GAAW,EAAE,GAAG,WAAA,EAAa,QAAA,EAAU,CAAC,GAAG,WAAA,CAAY,QAAA,EAAU,GAAG,MAAM,CAAA,EAAE;AAClF,MAAA,SAAA,CAAU,QAAQ,CAAA;AAClB,MAAA,SAAA,CAAU,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,EAAE,CAAC,CAAA;AAAA,IACjC,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,SAAA,EAAW,SAAS;AAAA,GACpC;AAEA,EAAA,MAAM,kBAAA,GAAqBA,WAAAA;AAAA,IACzB,CAAC,SAAiB,OAAA,KAAoB;AACpC,MAAA,IAAI,CAAC,WAAA,IAAe,CAAC,iBAAA,EAAmB;AACxC,MAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,OAAA,CAAQ,GAAA,CAAI,iBAAiB,CAAA;AAC7D,MAAA,IAAI,CAAC,OAAA,EAAS;AAEd,MAAA,MAAM,EAAE,MAAK,GAAI,WAAA;AACjB,MAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAQ;AACzB,QAAA,MAAM,KAAK,IAAA,CAAK,CAAA,IAAK,CAAA,EAAG,EAAA,GAAK,KAAK,CAAA,IAAK,CAAA;AACvC,QAAA,MAAM,KAAK,IAAA,CAAK,KAAA,IAAS,CAAA,EAAG,EAAA,GAAK,KAAK,MAAA,IAAU,CAAA;AAChD,QAAA,IAAI,OAAA,GAAU,MAAM,OAAA,GAAU,EAAA,GAAK,MAAM,OAAA,GAAU,EAAA,IAAM,OAAA,GAAU,EAAA,GAAK,EAAA,EAAI;AAAA,MAC9E,CAAA,MAAA,IAAW,IAAA,CAAK,KAAA,KAAU,SAAA,EAAW;AACnC,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,IAAU,EAAC;AAC5B,QAAA,IAAI,GAAA,CAAI,UAAU,CAAA,IAAK,CAAC,eAAe,OAAA,EAAS,OAAA,EAAS,GAAG,CAAA,EAAG;AAAA,MACjE;AAEA,MAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAE,GAAI,YAAA;AAAA,QACf,OAAA,GAAU,QAAQ,YAAA,GAAe,CAAA;AAAA,QACjC,OAAA,GAAU,QAAQ,aAAA,GAAgB,CAAA;AAAA,QAClC,OAAA,CAAQ,YAAA;AAAA,QACR,OAAA,CAAQ,aAAA;AAAA,QACR;AAAA,OACF;AAEA,MAAA,MAAM,KAAA,GAAoB;AAAA,QACxB,IAAI,KAAA,EAAM;AAAA,QACV,IAAA,EAAM,iBAAA;AAAA,QACN,CAAA;AAAA,QACA,CAAA;AAAA,QACA,OAAO,OAAA,CAAQ,YAAA;AAAA,QACf,QAAQ,OAAA,CAAQ,aAAA;AAAA,QAChB,QAAA,EAAU;AAAA,OACZ;AACA,MAAA,SAAA,CAAU,EAAE,GAAG,WAAA,EAAa,QAAA,EAAU,CAAC,GAAG,WAAA,CAAY,QAAA,EAAU,KAAK,CAAA,EAAG,CAAA;AACxE,MAAA,MAAA,CAAO,KAAA,CAAM,IAAI,KAAK,CAAA;AAAA,IACxB,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,iBAAA,EAAmB,SAAA,EAAW,MAAM;AAAA,GACpD;AAEA,EAAA,MAAM,iBAAA,GAAoBA,WAAAA;AAAA,IACxB,CAAC,IAAY,KAAA,KAAkB;AAC7B,MAAA,IAAI,CAAC,WAAA,EAAa;AAClB,MAAA,SAAA,CAAU;AAAA,QACR,GAAG,WAAA;AAAA,QACH,QAAA,EAAU,YAAY,QAAA,CAAS,GAAA;AAAA,UAAI,CAAA,EAAA,KACjC,GAAG,EAAA,KAAO,EAAA,GAAK,EAAE,GAAG,EAAA,EAAI,OAAM,GAAI;AAAA;AACpC,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,aAAa,SAAS;AAAA,GACzB;AAEA,EAAA,MAAM,oBAAA,GAAuBA,WAAAA;AAAA,IAC3B,CAAC,EAAA,EAAY,CAAA,EAAW,CAAA,EAAW,CAAA,EAAW,GAAW,CAAA,KAAc;AACrE,MAAA,IAAI,CAAC,WAAA,EAAa;AAClB,MAAA,SAAA,CAAU;AAAA,QACR,GAAG,WAAA;AAAA,QACH,QAAA,EAAU,YAAY,QAAA,CAAS,GAAA;AAAA,UAAI,CAAA,EAAA,KACjC,EAAA,CAAG,EAAA,KAAO,EAAA,GAAK,EAAE,GAAG,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,QAAA,EAAU,GAAE,GAAI;AAAA;AACrE,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,aAAa,SAAS;AAAA,GACzB;AAGA,EAAA,MAAM,wBAAA,GAA2BA,WAAAA;AAAA,IAC/B,CAAC,EAAA,KAAe;AACd,MAAA,MAAM,KAAK,WAAA,EAAa,QAAA,CAAS,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,EAAE,CAAA;AACtD,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,MAAM,WAAA,GAAc,kBAAA,GAAqB,EAAA,CAAG,IAAI,CAAA;AAChD,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,WAAA,CAAY,EAAE,CAAA;AAAA,MAChB,CAAA,MAAO;AACL,QAAA,cAAA,GAAiB,EAAE,CAAA;AAAA,MACrB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,cAAA,EAAgB,kBAAkB;AAAA,GAClD;AAEA,EAAA,MAAM,iBAAA,GAAoB,CAAC,EAAE,cAAA,IAAkB,kBAAA,CAAA;AAG/C,EAAA,MAAM,SAAA,GAAY,QAAQ,MAAM;AAC9B,IAAA,MAAM,CAAA,uBAAQ,GAAA,EAAoB;AAClC,IAAA,CAAC,aAAA,IAAiB,EAAC,EAAG,OAAA,CAAQ,CAAA,CAAA,KAAK;AACjC,MAAA,IAAI,EAAE,MAAA,KAAW,UAAA,IAAc,GAAA,CAAI,CAAA,CAAE,WAAW,SAAS,CAAA;AAAA,WAAA,IAChD,EAAE,MAAA,KAAW,UAAA,IAAc,GAAA,CAAI,CAAA,CAAE,WAAW,SAAS,CAAA;AAAA,WAAA,IACrD,EAAE,MAAA,KAAW,UAAA,IAAc,GAAA,CAAI,CAAA,CAAE,WAAW,SAAS,CAAA;AAAA,IAChE,CAAC,CAAA;AACD,IAAA,OAAO,CAAA;AAAA,EACT,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAGlB,EAAA,MAAM,gBAAA,GAAmB,WAAA,GACrB,WAAA,CAAY,QAAA,CAAS,MAAA,CAAO,CAAA,EAAA,KAAM,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,EAAE,CAAC,CAAA,GACxD,EAAC;AAGL,EAAAU,UAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,MAAM,GAAA,GAAO,EAAE,MAAA,CAAuB,OAAA;AACtC,MAAA,IAAI,GAAA,KAAQ,OAAA,IAAW,GAAA,KAAQ,UAAA,EAAY;AAE3C,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA;AAE5B,MAAA,IAAI,IAAA,IAAQ,CAAA,CAAE,GAAA,KAAQ,GAAA,EAAK;AAAE,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,IAAA,EAAK;AAAG,QAAA;AAAA,MAAQ;AACjE,MAAA,IAAI,SAAS,CAAA,CAAE,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,QAAQ,GAAA,CAAA,EAAM;AAAE,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,IAAA,EAAK;AAAG,QAAA;AAAA,MAAQ;AACpF,MAAA,IAAI,SAAS,CAAA,CAAE,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,QAAQ,GAAA,CAAA,EAAM;AAC5C,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAI,YAAY,IAAA,GAAO,CAAA,0BAA2B,CAAC,GAAG,WAAW,CAAC,CAAA;AAClE,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,CAAA,CAAE,QAAQ,WAAA,EAAa;AAC/C,QAAA,IAAI,YAAY,IAAA,GAAO,CAAA,uBAAwB,CAAC,GAAG,WAAW,CAAC,CAAA;AAC/D,QAAA;AAAA,MACF;AAEA,MAAA,QAAQ,EAAE,GAAA;AAAK,QACb,KAAK,GAAA;AAAA,QAAK,KAAK,GAAA;AAAK,UAAA,OAAA,CAAQ,QAAQ,CAAA;AAAG,UAAA;AAAA,QACvC,KAAK,GAAA;AAAA,QAAK,KAAK,GAAA;AAAK,UAAA,OAAA,CAAQ,KAAK,CAAA;AAAG,UAAA;AAAA,QACpC,KAAK,GAAA;AAAA,QAAK,KAAK,GAAA;AAAK,UAAA,OAAA,CAAQ,MAAM,CAAA;AAAG,UAAA;AAAA,QACrC,KAAK,GAAA;AAAA,QAAK,KAAK,GAAA;AAAK,UAAA,OAAA,CAAQ,OAAO,CAAA;AAAG,UAAA;AAAA,QACtC,KAAK,GAAA;AAAA,QAAK,KAAK,GAAA;AAAK,UAAA,OAAA,CAAQ,OAAO,CAAA;AAAG,UAAA;AAAA,QACtC,KAAK,QAAA;AAAU,UAAA,OAAA,CAAQ,QAAQ,CAAA;AAAG,UAAA;AAAA,QAClC,KAAK,GAAA;AAAA,QAAK,KAAK,GAAA;AAAK,UAAA,SAAA,CAAU,QAAQ,GAAG,CAAA;AAAG,UAAA;AAAA,QAC5C,KAAK,GAAA;AAAA,QAAK,KAAK,GAAA;AAAK,UAAA,SAAA,CAAU,OAAA,CAAQ,IAAI,GAAG,CAAA;AAAG,UAAA;AAAA;AAClD,IACF,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,KAAK,CAAA;AACxC,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC1D,GAAG,CAAC,IAAA,EAAM,MAAM,WAAA,EAAa,uBAAA,EAAyB,oBAAoB,CAAC,CAAA;AAG3E,EAAA,MAAM,oBAAoB,QAAA,IAAY,KAAA;AACtC,EAAA,MAAM,aAAA,GAA0B,QAAQ,KAAA,GAAQ,IAAA;AAGhD,EAAA,MAAM,cAAA,GAAgC;AAAA,IACpC,KAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,QAAA,EAAU,QAAA;AAAA,IACV,MAAA,EAAQ,mBAAA;AAAA,IACR,YAAA,EAAc,QAAA;AAAA,IACd,UAAA,EAAY,MAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AAEA,EAAA,MAAM,eAAA,GAAyC,aAAa,IAAA,CAAK,KAAA;AAEjE,EAAA,uBACEb,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,cAAA,EAEV,QAAA,EAAA;AAAA,oBAAAD,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,cAAA;AAAA,QACL,IAAA,EAAK,MAAA;AAAA,QACL,MAAA,EAAO,OAAA;AAAA,QACP,SAAA,EAAU,QAAA;AAAA,QACV,UAAU,CAAA,CAAA,KAAK;AACb,UAAA,MAAM,CAAA,GAAI,CAAA,CAAE,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AAC5B,UAAA,IAAI,CAAA,kBAAmB,CAAC,CAAA;AACxB,UAAA,CAAA,CAAE,OAAO,KAAA,GAAQ,EAAA;AAAA,QACnB;AAAA;AAAA,KACF;AAAA,oBACAA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,eAAA;AAAA,QACL,IAAA,EAAK,MAAA;AAAA,QACL,MAAA,EAAO,OAAA;AAAA,QACP,SAAA,EAAU,QAAA;AAAA,QACV,UAAU,CAAA,CAAA,KAAK;AACb,UAAA,MAAM,CAAA,GAAI,CAAA,CAAE,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AAC5B,UAAA,IAAI,CAAA,oBAAqB,CAAC,CAAA;AAC1B,UAAA,CAAA,CAAE,OAAO,KAAA,GAAQ,EAAA;AAAA,QACnB;AAAA;AAAA,KACF;AAAA,IAGC,CAAC,qCACAA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,cAAc,CAAA,CAAA,KAAK;AAAE,UAAA,OAAA,CAAQ,CAAC,CAAA;AAAG,UAAA,IAAI,CAAA,KAAM,SAAS,cAAA,EAAe;AAAA,QAAG,CAAA;AAAA,QACtE,QAAA;AAAA,QACA,YAAA,EAAc,MAAM,WAAA,CAAY,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA;AAAA,QACvC,IAAA;AAAA,QACA,QAAA,EAAU,MAAM,SAAA,CAAU,OAAA,CAAQ,GAAG,CAAA;AAAA,QACrC,SAAA,EAAW,MAAM,SAAA,CAAU,OAAA,CAAQ,IAAI,GAAG,CAAA;AAAA,QAC1C,WAAA,EAAa,MAAM,YAAA,CAAa,OAAA,EAAQ;AAAA,QACxC,OAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA,EAAQ,IAAA;AAAA,QACR,MAAA,EAAQ,IAAA;AAAA,QACR,aAAA;AAAA,QACA,iBAAA;AAAA,QACA,uBAAA,EAAyB,oBAAA;AAAA,QACzB,SAAA,EAAW,eAAA;AAAA,QACX,iBAAA,EAAmB,qBAAA;AAAA,QACnB,WAAA,EAAa,eAAA;AAAA,QACb,WAAA,EAAa,MAAM,cAAA,CAAe,OAAA,EAAS,KAAA,EAAM;AAAA,QACjD,aAAA,EAAe,MAAM,eAAA,CAAgB,OAAA,EAAS,KAAA,EAAM;AAAA,QACpD,oBAAA,EAAsB;AAAA;AAAA,KACxB;AAAA,oBAIFA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,aAAA;AAAA,QACA,QAAA,EAAU,iBAAA;AAAA,QACV,QAAA,EAAU,gBAAA;AAAA,QACV,KAAA,EAAO,cAAA;AAAA,QACP,QAAA,EAAU,iBAAA;AAAA,QACV,QAAA,EAAU,iBAAA;AAAA,QACV,SAAA,EAAW;AAAA;AAAA,KACb;AAAA,oBAGAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,yCACCA,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UAEC,KAAA,EAAO,WAAA;AAAA,UACP,IAAA,EAAM,aAAA;AAAA,UACN,QAAA;AAAA,UACA,QAAA;AAAA,UACA,QAAA,EAAU,iBAAA;AAAA,UACV,WAAA;AAAA,UACA,iBAAiB,eAAA,CAAgB,OAAA;AAAA,UACjC,WAAA;AAAA,UACA,SAAA;AAAA,UACA,YAAA,EAAc,gBAAA;AAAA,UACd,UAAA,EAAY,cAAA;AAAA,UACZ,kBAAA,EAAoB,sBAAA;AAAA,UACpB,eAAA,EAAiB,MAAA;AAAA,UACjB,WAAA,EAAa,SAAA;AAAA,UACb,gBAAA,EAAkB,cAAA;AAAA,UAClB,aAAA,EAAe,iBAAA;AAAA,UACf,YAAA,EAAc,gBAAA;AAAA,UACd,eAAA,EAAiB,mBAAA;AAAA,UACjB,cAAA,EAAgB,kBAAA;AAAA,UAChB,eAAA,EAAiB,mBAAA;AAAA,UACjB,cAAA,EAAgB,kBAAA;AAAA,UAChB,eAAA,EAAiB,mBAAA;AAAA,UACjB,cAAA,EAAgB,kBAAA;AAAA,UAChB,SAAA,EAAW,aAAA;AAAA,UACX,YAAA,EAAc,gBAAA;AAAA,UACd,oBAAA,EAAsB,oBAAoB,wBAAA,GAA2B,MAAA;AAAA,UACrE,YAAA,EAAc,OAAA;AAAA,UACd,kBAAkB,CAAA,EAAA,KAAM;AAAE,YAAA,SAAA,CAAU,OAAA,GAAU,EAAA;AAAA,UAAI,CAAA;AAAA,UAClD,qBAAqB,CAAA,EAAA,KAAM;AAAE,YAAA,YAAA,CAAa,OAAA,GAAU,EAAA;AAAA,UAAI;AAAA,SAAA;AAAA,QA7BnD,WAAA,CAAY;AAAA,OA8BnB,EAEJ,CAAA;AAAA,MAGC,CAAC,iBAAA,IAAqB,gBAAA,CAAiB,MAAA,GAAS,qBAC/CA,GAAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAU,gBAAA;AAAA,UACV,UAAU,eAAA,CAAgB,OAAA;AAAA,UAC1B,aAAA,EAAe,iBAAA;AAAA,UACf,gBAAA,EAAkB,oBAAA;AAAA,UAClB,QAAA,EAAU,oBAAA;AAAA,UACV,WAAA,EAAa;AAAA;AAAA;AACf,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AC/0BO,SAAS,eAAe,EAAE,aAAA,EAAe,cAAA,EAAgB,GAAG,MAAK,EAAwB;AAC9F,EAAA,uBACEA,GAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,KAAA,EAAO,IAAA;AAAA,MACP,aAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ","file":"index.mjs","sourcesContent":["import type { Props } from \"../../types/types\";\n\n// Spinner de carga animado\nexport function SpinnerIcon({ className = \"\" }: { className?: string }) {\n return (\n <svg className={`animate-spin h-8 w-8 text-indigo-600 mx-auto mb-4 ${className}`} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8v4a4 4 0 00-4 4H4z\"></path>\n </svg>\n );\n}\n\nexport function AnimateSpin({ className }: Props) {\n return (\n <svg\n className={`animate-spin ${className}`} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"\n >\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path className=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n )\n}\nexport function GearIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n )\n}\n\nexport function CheckIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )\n}\n\nexport function BackIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 19l-7-7m0 0l7-7m-7 7h18\" />\n </svg>\n )\n}\n\nexport function NotFoundIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\n </svg>\n )\n}\n\nexport function BoxIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4\" />\n </svg>\n )\n}\n\nexport function ChartIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z\"\n />\n </svg>\n )\n}\n\nexport function UsersIcon({ className }: Props) {\n return (\n <svg className={className} xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M12 2a5 5 0 1 0 5 5a5 5 0 0 0-5-5m0 8a3 3 0 1 1 3-3a3 3 0 0 1-3 3m9 11v-1a7 7 0 0 0-7-7h-4a7 7 0 0 0-7 7v1h2v-1a5 5 0 0 1 5-5h4a5 5 0 0 1 5 5v1z\" />\n </svg>\n )\n}\n\nexport function DocumentIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n )\n}\n\nexport function LogoutIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1\"\n />\n </svg>\n )\n}\n\nexport function HomeIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6\"\n />\n </svg>\n )\n}\n\nexport function BuildingIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4\"\n />\n </svg>\n )\n}\n\nexport function CashIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M17 9V7a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2m2 4h10a2 2 0 002-2v-6a2 2 0 00-2-2H9a2 2 0 00-2 2v6a2 2 0 002 2zm7-5a2 2 0 11-4 0 2 2 0 014 0z\"\n />\n </svg>\n )\n}\n\nexport function MenuIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 6h16M4 12h16M4 18h16\"\n />\n </svg>\n )\n}\n\nexport function CloseIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n )\n}\n\nexport function AddIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n </svg>\n )\n}\n\nexport function SearchIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"m21 21-6-6m2-5a7 7 0 1 1-14 0 7 7 0 0 1 14 0Z\"\n />\n </svg>\n )\n}\n\nexport function SaveIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 7H5a2 2 0 00-2 2v9a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-3m-1 4l-3 3m0 0l-3-3m3 3V4\"\n />\n </svg>\n )\n}\n\nexport function CancelIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n )\n}\n\nexport function DeleteIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n )\n}\n\nexport function EditIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\"\n />\n </svg>\n )\n}\n\nexport function CategorieIcon({ className }: Props) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={className} viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M11.15 3.4L7.43 9.48c-.41.66.07 1.52.85 1.52h7.43c.78 0 1.26-.86.85-1.52L12.85 3.4a.993.993 0 0 0-1.7 0\" /><circle cx=\"17.5\" cy=\"17.5\" r=\"4.5\" fill=\"currentColor\" /><path fill=\"currentColor\" d=\"M4 21.5h6c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1\" /></svg>\n )\n}\n\nexport function FolderIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z\"\n />\n </svg>\n )\n}\n\nexport function ArrowIcon({ className }: Props) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={className} viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M17.77 3.77L16 2L6 12l10 10l1.77-1.77L9.54 12z\" /></svg>\n )\n}\n\nexport function FilterIcon({ className }: Props) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={className} viewBox=\"0 0 24 24\"><path fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M11.36 20.213L9 21v-8.5L4.52 7.572A2 2 0 0 1 4 6.227V4h16v2.172a2 2 0 0 1-.586 1.414L15 12m0 6a3 3 0 1 0 6 0a3 3 0 1 0-6 0m5.2 2.2L22 22\" /></svg>\n )\n}\n\nexport function QuestionIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n}\n\nexport function LocationIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n )\n}\n\nexport function CalendarIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n )\n}\n\nexport function InfoIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n}\n\nexport function MoonIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z\" />\n </svg>\n )\n}\n\nexport function SunIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z\" />\n </svg>\n )\n}\n\nexport function CamaraIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 13a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n )\n}\n\nexport function ArrowLeftIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n )\n}\n\nexport function ArrowRightIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n )\n}\n\nexport function TrashIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n )\n}\n\nexport function MinusIcon({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M20 12H4\" />\n </svg>\n );\n}\n\nexport function MoneyIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n}\n\nexport function PercentIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 7h6m0 10v-3m-3 3h.01M9 17h.01M9 14h.01M12 14h.01M15 11h.01M12 11h.01M9 11h.01M7 21h10a2 2 0 002-2V5a2 2 0 00-2-2H7a2 2 0 00-2 2v14a2 2 0 002 2z\" />\n </svg>\n )\n}\n\nexport function StackIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 7h16M4 12h16M4 17h16\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 3v18M17 3v18\" />\n </svg>\n )\n}\n\nexport function ClockIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n}\n\nexport function CheckCircleIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n}\n\nexport function CajasIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z\" />\n </svg>\n )\n}\n\nexport function PrinterIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M17 17h2a2 2 0 002-2v-4a2 2 0 00-2-2H5a2 2 0 00-2 2v4a2 2 0 002 2h2m2 4h6a2 2 0 002-2v-4a2 2 0 00-2-2H9a2 2 0 00-2 2v4a2 2 0 002 2zm8-12V5a2 2 0 00-2-2H9a2 2 0 00-2 2v4h10z\" />\n </svg>\n )\n}\n\nexport function NetworkIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-2-4h.01M17 16h.01\" />\n </svg>\n )\n}\n\nexport function TestIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z\" />\n </svg>\n )\n}\n\nexport function FacturacionIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 6l4 4\" />\n <text x=\"12\" y=\"16\" fontSize=\"8\" fill=\"currentColor\" textAnchor=\"middle\">$</text>\n </svg>\n )\n}\n\nexport function WhatsAppIcon({ className }: Props) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"currentColor\" className={className} viewBox=\"0 0 24 24\"><path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52s.198-.298.298-.497c.099-.198.05-.371-.025-.52s-.669-1.612-.916-2.207c-.242-.579-.487-.5-.669-.51a13 13 0 0 0-.57-.01c-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074s2.096 3.2 5.077 4.487c.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413s.248-1.289.173-1.413c-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 0 1-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 0 1-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.82 9.82 0 0 1 2.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.82 11.82 0 0 0 12.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.9 11.9 0 0 0 5.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.82 11.82 0 0 0-3.478-8.413\" /></svg>\n )\n}\n\nexport function ArchiveIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4\" />\n </svg>\n )\n}\n\nexport function CopyIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" />\n </svg>\n )\n}\n\nexport function PasteIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\" />\n </svg>\n )\n}\n\nexport function RestaurantMenuIcon({ className }: Props) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={className} viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M6 22q-.825 0-1.412-.587T4 20v-2q-.425 0-.712-.288T3 17t.288-.712T4 16v-3q-.425 0-.712-.288T3 12t.288-.712T4 11V8q-.425 0-.712-.288T3 7t.288-.712T4 6V4q0-.825.588-1.412T6 2h12q.825 0 1.413.588T20 4v16q0 .825-.587 1.413T18 22zm0-2h12V4H6v2q.425 0 .713.288T7 7t-.288.713T6 8v3q.425 0 .713.288T7 12t-.288.713T6 13v3q.425 0 .713.288T7 17t-.288.713T6 18zm3.5-7v3.25q0 .325.213.538t.537.212.538-.213.212-.537V13q.65-.175 1.075-.712t.425-1.213V7.5q0-.2-.15-.35T12 7t-.35.15-.15.35v3.275h-.75V7.5q0-.2-.15-.35T10.25 7t-.35.15-.15.35v3.275H9V7.5q0-.2-.15-.35T8.5 7t-.35.15T8 7.5v3.575q0 .675.425 1.213T9.5 13m5.5 0v3.25q0 .325.213.538t.537.212.538-.213.212-.537V7.575q0-.275-.187-.425T15.825 7q-.325 0-.712.175t-.738.525q-.425.425-.65.963T13.5 9.825V12q0 .425.288.713T14.5 13zm-9 7V4z\" /></svg>\n )\n}\n\nexport function CloudIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 15a4 4 0 004 4h9a5 5 0 10-.1-9.999 5.002 5.002 0 10-9.78 2.096A4.001 4.001 0 003 15z\" />\n </svg>\n )\n}\n\nexport function ShieldIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z\" />\n </svg>\n )\n}\n\nexport function BarsChartsIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z\" />\n </svg>\n )\n}\n\nexport function LightingIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n )\n}\n\nexport function LifeGuardIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M18.364 5.636l-3.536 3.536m0 5.656l3.536 3.536M9.172 9.172L5.636 5.636m3.536 9.192l-3.536 3.536M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-5 0a4 4 0 11-8 0 4 4 0 018 0z\" />\n </svg>\n )\n}\n\nexport function MonitorIcon({ className }: Props) {\n return (\n <svg className={className} xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M4 18q-.825 0-1.412-.587T2 16V5q0-.825.588-1.412T4 3h16q.825 0 1.413.588T22 5v11q0 .825-.587 1.413T20 18h-3l.7.7q.15.15.225.338t.075.387V20q0 .425-.288.712T17 21H7q-.425 0-.712-.288T6 20v-.575q0-.2.075-.387T6.3 18.7L7 18zm0-2h16V5H4zm0 0V5z\" />\n </svg>\n )\n}\n\nexport function TruckIcon({ className }: Props) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M8.25 18.75a1.5 1.5 0 0 1-3 0m3 0a1.5 1.5 0 0 0-3 0m3 0h6m-9 0H3.375a1.125 1.125 0 0 1-1.125-1.125V14.25m17.25 4.5a1.5 1.5 0 0 1-3 0m3 0a1.5 1.5 0 0 0-3 0m3 0h1.125c.621 0 1.129-.504 1.09-1.124a17.902 17.902 0 0 0-3.213-9.193 2.056 2.056 0 0 0-1.58-.86H14.25M16.5 18.75h-2.25m0-11.177v-.958c0-.568-.422-1.048-.987-1.106a48.554 48.554 0 0 0-10.026 0 1.106 1.106 0 0 0-.987 1.106v7.635m12-6.677v6.677m0 4.5v-4.5m0 0h-12\" />\n </svg>\n )\n}\n\nexport function IconCursor({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M2 1l12 5.5-5.5 1.5L7 13.5 2 1z\" />\n </svg>\n );\n}\n\nexport function IconHand({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M8 1a1 1 0 011 1v4.586l1.293-1.293a1 1 0 111.414 1.414L8 10.414 4.293 6.707a1 1 0 111.414-1.414L7 6.586V2a1 1 0 011-1z\" />\n <path d=\"M3 8a1 1 0 011-1h.5V4.5a1 1 0 012 0V7h1V3.5a1 1 0 012 0V7h1V4.5a1 1 0 012 0V9a5 5 0 01-5 5H6A3 3 0 013 11V8z\" />\n </svg>\n );\n}\n\nexport function IconGrid({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path\n fillRule=\"evenodd\"\n d=\"M1 1h6v6H1V1zm8 0h6v6H9V1zM1 9h6v6H1V9zm8 0h6v6H9V9z\"\n clipRule=\"evenodd\"\n opacity={0.7}\n />\n </svg>\n );\n}\n\nexport function IconZoomIn({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M6.5 1a5.5 5.5 0 104.39 8.803l3.154 3.153a.75.75 0 001.06-1.06l-3.153-3.154A5.5 5.5 0 006.5 1zM2.5 6.5a4 4 0 118 0 4 4 0 01-8 0zM6 4.75a.75.75 0 011.5 0V6h1.25a.75.75 0 010 1.5H7.5v1.25a.75.75 0 01-1.5 0V7.5H4.75a.75.75 0 010-1.5H6V4.75z\" />\n </svg>\n );\n}\n\nexport function IconZoomOut({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M6.5 1a5.5 5.5 0 104.39 8.803l3.154 3.153a.75.75 0 001.06-1.06l-3.153-3.154A5.5 5.5 0 006.5 1zM2.5 6.5a4 4 0 118 0 4 4 0 01-8 0zM4.75 6a.75.75 0 000 1.5h3.5a.75.75 0 000-1.5h-3.5z\" />\n </svg>\n );\n}\n\nexport function IconReset({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M8 1a7 7 0 100 14A7 7 0 008 1zm0 1.5a5.5 5.5 0 110 11 5.5 5.5 0 010-11zM8 4a.75.75 0 01.75.75v3.19l1.28 1.28a.75.75 0 01-1.06 1.06l-1.5-1.5A.75.75 0 017.25 8V4.75A.75.75 0 018 4z\" />\n </svg>\n );\n}\n\nexport function IconUndo({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M2.5 5.5A.5.5 0 013 5h5a5 5 0 110 10H3a.5.5 0 010-1h5a4 4 0 100-8H3.707l1.647 1.646a.5.5 0 01-.708.708l-2.5-2.5a.5.5 0 010-.708l2.5-2.5a.5.5 0 01.708.708L3.207 5H3a.5.5 0 01-.5-.5z\" />\n </svg>\n );\n}\n\nexport function IconRedo({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M13.5 5.5A.5.5 0 0113 5H8a4 4 0 100 8h5a.5.5 0 010 1H8A5 5 0 118 5h4.293l-1.647-1.646a.5.5 0 01.708-.708l2.5 2.5a.5.5 0 010 .708l-2.5 2.5a.5.5 0 01-.708-.708L12.793 6H13a.5.5 0 01.5.5z\" />\n </svg>\n );\n}\n\nexport function IconPlace({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M2 2a.5.5 0 01.5-.5h2a.5.5 0 010 1H3v1.5a.5.5 0 01-1 0V2zm11 0a.5.5 0 00-.5-.5h-2a.5.5 0 000 1H12v1.5a.5.5 0 001 0V2zM2 14a.5.5 0 00.5.5h2a.5.5 0 000-1H3v-1.5a.5.5 0 00-1 0V14zm11 0a.5.5 0 01-.5.5h-2a.5.5 0 010-1H12v-1.5a.5.5 0 011 0V14zM8 4.5a.5.5 0 000 1V7H6.5a.5.5 0 000 1H8v1.5a.5.5 0 001 0V8h1.5a.5.5 0 000-1H9V5.5a.5.5 0 00-1 0z\" />\n </svg>\n );\n}\n\nexport function IconErase({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M8.086 2.207a2 2 0 012.828 0l2.879 2.878a2 2 0 010 2.83l-7.513 7.51A2 2 0 014.872 16H2.4a1 1 0 01-.966-.741L.8 13.2a2 2 0 01.5-1.946l7.786-9.047zM7.586 5L5 7.586 8.414 11 11 8.414 7.586 5zM6 12L4 10l-1.5 1.5a1 1 0 000 1.414l.587.587A1 1 0 003.793 15H5l1-1-1-1 1-1z\" />\n </svg>\n );\n}\n\nexport function IconDuplicate({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M4 2a2 2 0 00-2 2v8a2 2 0 002 2h8a2 2 0 002-2V4a2 2 0 00-2-2H4zm0 1h8a1 1 0 011 1v8a1 1 0 01-1 1H4a1 1 0 01-1-1V4a1 1 0 011-1z\" />\n <path d=\"M2 5H1a1 1 0 00-1 1v8a1 1 0 001 1h8a1 1 0 001-1v-1H9v1H1V6h1V5z\" />\n </svg>\n );\n}\n\nexport function IconWall({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {/* Two parallel lines forming a wall corner — represents wall cross-section */}\n <path strokeWidth=\"2\" d=\"M3 14 L3 2 L14 2\" />\n <path strokeWidth=\"2\" d=\"M6 14 L6 5 L14 5\" />\n </svg>\n );\n}\n\nexport function IconDownload({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M.5 9.9a.5.5 0 01.5.5v2.5a1 1 0 001 1h12a1 1 0 001-1v-2.5a.5.5 0 011 0v2.5a2 2 0 01-2 2H2a2 2 0 01-2-2v-2.5a.5.5 0 01.5-.5z\"/>\n <path d=\"M7.646 11.854a.5.5 0 00.708 0l3-3a.5.5 0 00-.708-.708L8.5 10.293V1.5a.5.5 0 00-1 0v8.793L5.354 8.146a.5.5 0 10-.708.708l3 3z\"/>\n </svg>\n );\n}\n\nexport function IconUpload({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M.5 9.9a.5.5 0 01.5.5v2.5a1 1 0 001 1h12a1 1 0 001-1v-2.5a.5.5 0 011 0v2.5a2 2 0 01-2 2H2a2 2 0 01-2-2v-2.5a.5.5 0 01.5-.5z\"/>\n <path d=\"M7.646 1.146a.5.5 0 01.708 0l3 3a.5.5 0 01-.708.708L8.5 2.707V11.5a.5.5 0 01-1 0V2.707L5.354 4.854a.5.5 0 11-.708-.708l3-3z\"/>\n </svg>\n );\n}\n\nexport function IconPolygon({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"none\" stroke=\"currentColor\" strokeLinejoin=\"round\">\n <path strokeWidth=\"1.5\" d=\"M8 2 L14 6 L12 13 L4 13 L2 6 Z\"/>\n <circle cx=\"8\" cy=\"2\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\"/>\n <circle cx=\"14\" cy=\"6\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\"/>\n <circle cx=\"12\" cy=\"13\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\"/>\n <circle cx=\"4\" cy=\"13\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\"/>\n <circle cx=\"2\" cy=\"6\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\"/>\n </svg>\n );\n}\n\nexport function IconLayers({ className }: Props) {\n return (\n <svg viewBox=\"0 0 16 16\" className={className} fill=\"currentColor\">\n <path d=\"M8.235 1.559a.5.5 0 0 0-.47 0l-7.5 4a.5.5 0 0 0 0 .882L3.188 8 .265 9.559a.5.5 0 0 0 0 .882l7.5 4a.5.5 0 0 0 .47 0l7.5-4a.5.5 0 0 0 0-.882L12.813 8l2.922-1.559a.5.5 0 0 0 0-.882l-7.5-4zm3.515 7.008L14.438 10 8 13.433 1.562 10 4.25 8.567l3.515 1.874a.5.5 0 0 0 .47 0l3.515-1.874zM8 9.433 1.562 6 8 2.567 14.438 6 8 9.433z\"/>\n </svg>\n );\n}","import type { ReactNode } from 'react';\nimport {\n IconCursor, IconGrid, IconHand, IconReset, IconZoomIn, IconZoomOut,\n IconUndo, IconRedo, IconPlace, IconErase, IconWall,\n IconDownload, IconUpload, IconLayers,\n} from '../../icons';\nimport type { ToolMode, ElementTypeDef, AreaShape } from '../types';\n\n// ─── ToolButton ───────────────────────────────────────────────────────────────\n\ninterface ToolButtonProps {\n active?: boolean;\n disabled?: boolean;\n title: string;\n onClick: () => void;\n children: ReactNode;\n}\n\nfunction ToolButton({ active, disabled, title, onClick, children }: ToolButtonProps) {\n return (\n <button\n title={title}\n onClick={onClick}\n disabled={disabled}\n className={[\n 'flex items-center justify-center w-8 h-8 rounded transition-colors disabled:opacity-30 disabled:cursor-not-allowed',\n active\n ? 'bg-blue-100 text-blue-700 ring-1 ring-blue-400'\n : 'text-slate-600 hover:bg-slate-100 hover:text-slate-800',\n ].join(' ')}\n >\n {children}\n </button>\n );\n}\n\nfunction Sep() {\n return <div className=\"w-px h-6 bg-slate-200 mx-1\" />;\n}\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\nexport interface PaletteGroup {\n id: string;\n name: string;\n /** True for the built-in domain config group; false for imported library groups. */\n isBase?: boolean;\n types: ElementTypeDef[];\n}\n\ninterface ToolbarProps {\n tool: ToolMode;\n onToolChange: (tool: ToolMode) => void;\n showGrid: boolean;\n onToggleGrid: () => void;\n zoom: number;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onResetView: () => void;\n canUndo: boolean;\n canRedo: boolean;\n onUndo: () => void;\n onRedo: () => void;\n /** All element groups: base config group + any imported library groups. */\n paletteGroups: PaletteGroup[];\n activePlaceTypeId: string | null;\n onActivePlaceTypeChange: (id: string) => void;\n areaShape?: AreaShape;\n onToggleAreaShape?: () => void;\n onExportMap?: () => void;\n onImportMap?: () => void;\n onLoadLibrary?: () => void;\n onRemoveLibraryGroup?: (groupId: string) => void;\n}\n\n// ─── TypeChip ─────────────────────────────────────────────────────────────────\n\ninterface TypeChipProps {\n typeDef: ElementTypeDef;\n active: boolean;\n onClick: () => void;\n}\n\nfunction TypeChip({ typeDef, active, onClick }: TypeChipProps) {\n return (\n <button\n title={typeDef.label}\n onClick={onClick}\n className={[\n 'flex items-center gap-1.5 px-2 py-1 rounded border text-xs whitespace-nowrap transition-colors',\n active\n ? 'border-blue-400 bg-blue-50 text-blue-700 font-medium'\n : 'border-slate-200 bg-white text-slate-600 hover:border-slate-300 hover:bg-slate-50',\n ].join(' ')}\n >\n <span\n className=\"w-2.5 h-2.5 rounded-sm shrink-0\"\n style={{ background: typeDef.color, border: `1px solid ${typeDef.strokeColor}` }}\n />\n {typeDef.label}\n </button>\n );\n}\n\n// ─── Toolbar ─────────────────────────────────────────────────────────────────\n\nexport function Toolbar({\n tool,\n onToolChange,\n showGrid,\n onToggleGrid,\n zoom,\n onZoomIn,\n onZoomOut,\n onResetView,\n canUndo,\n canRedo,\n onUndo,\n onRedo,\n paletteGroups,\n activePlaceTypeId,\n onActivePlaceTypeChange,\n areaShape,\n onToggleAreaShape,\n onExportMap,\n onImportMap,\n onLoadLibrary,\n onRemoveLibraryGroup,\n}: ToolbarProps) {\n return (\n <div className=\"flex flex-col bg-white border-b border-slate-200 shadow-sm shrink-0\">\n {/* ── Main row ── */}\n <div className=\"flex items-center gap-0.5 px-2 py-1.5\">\n {/* Selection tools */}\n <ToolButton title=\"Seleccionar (V)\" active={tool === 'SELECT'} onClick={() => onToolChange('SELECT')}>\n <IconCursor className=\"w-4 h-4\" />\n </ToolButton>\n <ToolButton title=\"Desplazar (H)\" active={tool === 'PAN'} onClick={() => onToolChange('PAN')}>\n <IconHand className=\"w-4 h-4\" />\n </ToolButton>\n <ToolButton title=\"Dibujar pared (W)\" active={tool === 'WALL'} onClick={() => onToolChange('WALL')}>\n <IconWall className=\"w-4 h-4\" />\n </ToolButton>\n <ToolButton title=\"Colocar elemento (P)\" active={tool === 'PLACE'} onClick={() => onToolChange('PLACE')}>\n <IconPlace className=\"w-4 h-4\" />\n </ToolButton>\n <ToolButton title=\"Borrar (E)\" active={tool === 'ERASE'} onClick={() => onToolChange('ERASE')}>\n <IconErase className=\"w-4 h-4\" />\n </ToolButton>\n\n <Sep />\n\n {/* History */}\n <ToolButton title=\"Deshacer (Ctrl+Z)\" disabled={!canUndo} onClick={onUndo}>\n <IconUndo className=\"w-4 h-4\" />\n </ToolButton>\n <ToolButton title=\"Rehacer (Ctrl+Y)\" disabled={!canRedo} onClick={onRedo}>\n <IconRedo className=\"w-4 h-4\" />\n </ToolButton>\n\n <Sep />\n\n {/* View */}\n <ToolButton\n title={showGrid ? 'Ocultar cuadrícula' : 'Mostrar cuadrícula'}\n active={showGrid}\n onClick={onToggleGrid}\n >\n <IconGrid className=\"w-4 h-4\" />\n </ToolButton>\n\n <Sep />\n\n {/* Zoom */}\n <ToolButton title=\"Acercar (+)\" onClick={onZoomIn}>\n <IconZoomIn className=\"w-4 h-4\" />\n </ToolButton>\n <span className=\"text-xs text-slate-500 w-10 text-center tabular-nums select-none\">\n {Math.round(zoom * 100)}%\n </span>\n <ToolButton title=\"Alejar (-)\" onClick={onZoomOut}>\n <IconZoomOut className=\"w-4 h-4\" />\n </ToolButton>\n <ToolButton title=\"Restablecer vista\" onClick={onResetView}>\n <IconReset className=\"w-4 h-4\" />\n </ToolButton>\n\n <Sep />\n\n {/* Map export / import */}\n <ToolButton title=\"Exportar mapa JSON\" onClick={() => onExportMap?.()}>\n <IconDownload className=\"w-4 h-4\" />\n </ToolButton>\n <ToolButton title=\"Importar mapa JSON\" onClick={() => onImportMap?.()}>\n <IconUpload className=\"w-4 h-4\" />\n </ToolButton>\n\n {/* Element library import */}\n <ToolButton title=\"Cargar librería de elementos (.json)\" onClick={() => onLoadLibrary?.()}>\n <IconLayers className=\"w-4 h-4\" />\n </ToolButton>\n\n {areaShape !== undefined && (\n <>\n <Sep />\n <ToolButton title={areaShape === 'polygon' ? 'Cambiar a rectángulo' : 'Cambiar a polígono'} onClick={() => onToggleAreaShape?.()}>\n <span className=\"text-xs font-medium\">{areaShape === 'polygon' ? 'Poly' : 'Rect'}</span>\n </ToolButton>\n </>\n )}\n </div>\n\n {/* ── Element palette (only when PLACE is active) ── */}\n {tool === 'PLACE' && (\n <div className=\"flex items-stretch gap-0 border-t border-slate-100 bg-slate-50 overflow-x-auto\">\n {paletteGroups.map((group, gi) => (\n <div key={group.id} className=\"flex items-center shrink-0\">\n {/* Group divider (not before the first group) */}\n {gi > 0 && (\n <div className=\"w-px self-stretch bg-slate-200 mx-1\" />\n )}\n {/* Group label + optional remove button */}\n <div className=\"flex items-center gap-0.5 px-1.5 shrink-0\">\n <span className=\"text-[10px] text-slate-400 font-medium whitespace-nowrap select-none\">\n {group.name}\n </span>\n {!group.isBase && onRemoveLibraryGroup && (\n <button\n title={`Eliminar grupo \"${group.name}\"`}\n onClick={() => onRemoveLibraryGroup(group.id)}\n className=\"text-slate-300 hover:text-red-400 leading-none text-xs ml-0.5 transition-colors\"\n >\n ×\n </button>\n )}\n </div>\n {/* Chips */}\n <div className=\"flex items-center gap-1 px-1 py-1.5\">\n {group.types.map(typeDef => (\n <TypeChip\n key={typeDef.id}\n typeDef={typeDef}\n active={activePlaceTypeId === typeDef.id}\n onClick={() => onActivePlaceTypeChange(typeDef.id)}\n />\n ))}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { useState, useCallback, useRef } from 'react';\nimport type { WheelEvent as ReactWheelEvent, MouseEvent as ReactMouseEvent } from 'react';\n\nexport interface PanZoomState {\n panX: number;\n panY: number;\n zoom: number;\n}\n\nconst ZOOM_MIN = 0.1;\nconst ZOOM_MAX = 10;\nconst ZOOM_FACTOR = 1.1;\n\nexport function usePanZoom(initialZoom = 1, leftClickPan = false) {\n const [state, setState] = useState<PanZoomState>({\n panX: 80,\n panY: 80,\n zoom: initialZoom,\n });\n\n /** Track whether a middle-click pan is in progress (ref = no re-render). */\n const isPanningRef = useRef(false);\n const [isPanning, setIsPanning] = useState(false);\n const lastPosRef = useRef({ x: 0, y: 0 });\n\n // ── Wheel zoom ──────────────────────────────────────────────────────────────\n const handleWheel = useCallback((e: ReactWheelEvent<SVGSVGElement>) => {\n // NOTE: e.preventDefault() is intentionally NOT called here.\n // React registers synthetic wheel events as passive, so calling preventDefault\n // would throw a warning and be ignored. The non-passive native listener added\n // in EditorCanvas handles scroll prevention instead.\n const factor = e.deltaY < 0 ? ZOOM_FACTOR : 1 / ZOOM_FACTOR;\n\n // Read all event values NOW — before setState — because e.currentTarget\n // is nulled out by React after the event handler returns (event pooling).\n const svgEl = e.currentTarget as SVGSVGElement;\n const rect = svgEl.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n setState(prev => {\n const newZoom = Math.max(ZOOM_MIN, Math.min(ZOOM_MAX, prev.zoom * factor));\n // Keep the canvas point under the cursor fixed.\n const canvasX = (mouseX - prev.panX) / prev.zoom;\n const canvasY = (mouseY - prev.panY) / prev.zoom;\n return {\n panX: mouseX - canvasX * newZoom,\n panY: mouseY - canvasY * newZoom,\n zoom: newZoom,\n };\n });\n }, []);\n\n // ── Pan (middle-click, or left-click when leftClickPan=true) ────────────────\n const handleMouseDown = useCallback((e: ReactMouseEvent<SVGSVGElement>) => {\n const valid = leftClickPan ? (e.button === 0 || e.button === 1) : e.button === 1;\n if (!valid) return;\n e.preventDefault();\n isPanningRef.current = true;\n setIsPanning(true);\n lastPosRef.current = { x: e.clientX, y: e.clientY };\n }, [leftClickPan]);\n\n const handleMouseMove = useCallback((e: ReactMouseEvent<SVGSVGElement>) => {\n if (!isPanningRef.current) return;\n const dx = e.clientX - lastPosRef.current.x;\n const dy = e.clientY - lastPosRef.current.y;\n lastPosRef.current = { x: e.clientX, y: e.clientY };\n setState(prev => ({ ...prev, panX: prev.panX + dx, panY: prev.panY + dy }));\n }, []);\n\n const stopPan = useCallback((_e: ReactMouseEvent<SVGSVGElement>) => {\n if (!isPanningRef.current) return;\n isPanningRef.current = false;\n setIsPanning(false);\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n if (isPanningRef.current) {\n isPanningRef.current = false;\n setIsPanning(false);\n }\n }, []);\n\n // ── Programmatic zoom ───────────────────────────────────────────────────────\n const zoomBy = useCallback((factor: number, cx?: number, cy?: number) => {\n setState(prev => {\n const newZoom = Math.max(ZOOM_MIN, Math.min(ZOOM_MAX, prev.zoom * factor));\n if (cx !== undefined && cy !== undefined) {\n const canvasX = (cx - prev.panX) / prev.zoom;\n const canvasY = (cy - prev.panY) / prev.zoom;\n return { panX: cx - canvasX * newZoom, panY: cy - canvasY * newZoom, zoom: newZoom };\n }\n return { ...prev, zoom: newZoom };\n });\n }, []);\n\n const resetView = useCallback(() => {\n setState({ panX: 80, panY: 80, zoom: 1 });\n }, []);\n\n return {\n state,\n setState,\n isPanning,\n handleWheel,\n handleMouseDown,\n handleMouseMove,\n handleMouseUp: stopPan,\n handleMouseLeave,\n zoomBy,\n resetView,\n };\n}\n","/** Snap a single value to the nearest grid line. */\nexport const snapToGrid = (value: number, gridSize: number): number =>\n Math.round(value / gridSize) * gridSize;\n\n/** Snap a 2-D point to the grid if `enabled`, otherwise return it unchanged. */\nexport const snapPoint = (\n x: number,\n y: number,\n gridSize: number,\n enabled: boolean,\n): { x: number; y: number } => ({\n x: enabled ? snapToGrid(x, gridSize) : x,\n y: enabled ? snapToGrid(y, gridSize) : y,\n});\n\n/**\n * Find the closest WallNode within `threshold` canvas units.\n * Returns the node's id and position, or null when nothing is close enough.\n */\nexport const findNearestNode = (\n x: number,\n y: number,\n nodes: Array<{ id: string; x: number; y: number }>,\n threshold: number,\n): { id: string; x: number; y: number } | null => {\n let best: { id: string; x: number; y: number } | null = null;\n let bestDist = threshold;\n\n for (const node of nodes) {\n const dist = Math.hypot(node.x - x, node.y - y);\n if (dist < bestDist) {\n bestDist = dist;\n best = node;\n }\n }\n\n return best;\n};\n","// ─── Vector math ─────────────────────────────────────────────────────────────\n\ntype Vec2 = { x: number; y: number };\n\nfunction norm(v: Vec2): Vec2 {\n const len = Math.hypot(v.x, v.y);\n return len < 1e-10 ? { x: 1, y: 0 } : { x: v.x / len, y: v.y / len };\n}\n\n/** 90° CCW rotation (left-normal of a forward direction). */\nfunction perp(v: Vec2): Vec2 { return { x: -v.y, y: v.x }; }\n\nfunction add(a: Vec2, b: Vec2): Vec2 { return { x: a.x + b.x, y: a.y + b.y }; }\n\nfunction scale(v: Vec2, s: number): Vec2 { return { x: v.x * s, y: v.y * s }; }\n\n/**\n * Intersect two infinite lines: p1 + s·d1 and p2 + t·d2.\n * Returns null when the lines are parallel.\n */\nfunction lineIntersect(p1: Vec2, d1: Vec2, p2: Vec2, d2: Vec2): Vec2 | null {\n const det = d1.x * d2.y - d1.y * d2.x;\n if (Math.abs(det) < 1e-8) return null;\n const dx = p2.x - p1.x, dy = p2.y - p1.y;\n const s = (dx * d2.y - dy * d2.x) / det;\n return { x: p1.x + s * d1.x, y: p1.y + s * d1.y };\n}\n\n// ─── Wall polygon ─────────────────────────────────────────────────────────────\n\n/**\n * Compute the closed SVG path for a single wall segment (ax,ay)→(bx,by).\n *\n * Miter joints are applied at either end when an adjacent wall direction is\n * provided (exactly one other wall sharing that node). With no adjacent wall\n * the end cap is a flat (square) termination.\n *\n * @param adjDirAtA - normalised direction of the OTHER wall leaving nodeA\n * @param adjDirAtB - normalised direction of the OTHER wall leaving nodeB\n */\nexport function wallSegmentPath(\n ax: number, ay: number,\n bx: number, by: number,\n thickness: number,\n adjDirAtA: Vec2 | null,\n adjDirAtB: Vec2 | null,\n): string {\n const dir = norm({ x: bx - ax, y: by - ay });\n const n = perp(dir);\n const h = thickness / 2;\n const A: Vec2 = { x: ax, y: ay };\n const B: Vec2 = { x: bx, y: by };\n\n // Default (un-mitered) corners\n let lA = add(A, scale(n, h));\n let rA = add(A, scale(n, -h));\n let lB = add(B, scale(n, h));\n let rB = add(B, scale(n, -h));\n\n // Miter at A:\n // Intersect [left-of-W at A going in dir] with [left-of-W2 at A going in adjDirAtA]\n if (adjDirAtA) {\n const n2 = perp(adjDirAtA);\n const mL = lineIntersect(add(A, scale(n, h)), dir, add(A, scale(n2, h)), adjDirAtA);\n const mR = lineIntersect(add(A, scale(n, -h)), dir, add(A, scale(n2, -h)), adjDirAtA);\n if (mL) lA = mL;\n if (mR) rA = mR;\n }\n\n // Miter at B:\n // Intersect [left-of-W at B going in dir] with [left-of-W2 at B going in adjDirAtB]\n if (adjDirAtB) {\n const n2 = perp(adjDirAtB);\n const mL = lineIntersect(add(B, scale(n, h)), dir, add(B, scale(n2, h)), adjDirAtB);\n const mR = lineIntersect(add(B, scale(n, -h)), dir, add(B, scale(n2, -h)), adjDirAtB);\n if (mL) lB = mL;\n if (mR) rB = mR;\n }\n\n return `M ${lA.x} ${lA.y} L ${lB.x} ${lB.y} L ${rB.x} ${rB.y} L ${rA.x} ${rA.y} Z`;\n}\n\nexport type { Vec2 };\n","interface GridOverlayProps {\n gridSize: number;\n}\n\n/**\n * Infinite grid rendered as SVG `<pattern>` tiles.\n *\n * Two tiers:\n * - Minor lines every `gridSize` units (very light)\n * - Major lines every `5 × gridSize` units (slightly darker)\n *\n * Because both patterns use `patternUnits=\"userSpaceOnUse\"` and the component\n * is rendered inside a `<g transform=\"translate scale\">`, the grid automatically\n * scales and pans with the canvas.\n */\nexport function GridOverlay({ gridSize }: GridOverlayProps) {\n const majorSize = gridSize * 5;\n\n return (\n <>\n <defs>\n {/* Minor grid */}\n <pattern\n id=\"vme-grid-minor\"\n width={gridSize}\n height={gridSize}\n patternUnits=\"userSpaceOnUse\"\n >\n <path\n d={`M ${gridSize} 0 L 0 0 0 ${gridSize}`}\n fill=\"none\"\n stroke=\"#e2e8f0\"\n strokeWidth={0.5}\n />\n </pattern>\n\n {/* Major grid — tiles the minor pattern, then overlays thicker lines */}\n <pattern\n id=\"vme-grid-major\"\n width={majorSize}\n height={majorSize}\n patternUnits=\"userSpaceOnUse\"\n >\n <rect\n width={majorSize}\n height={majorSize}\n fill=\"url(#vme-grid-minor)\"\n />\n <path\n d={`M ${majorSize} 0 L 0 0 0 ${majorSize}`}\n fill=\"none\"\n stroke=\"#cbd5e1\"\n strokeWidth={1}\n />\n </pattern>\n </defs>\n\n <rect\n x={-50000}\n y={-50000}\n width={100000}\n height={100000}\n fill=\"url(#vme-grid-major)\"\n />\n </>\n );\n}\n","import { useRef, useCallback } from 'react';\nimport type { MouseEvent as ReactMouseEvent, RefObject } from 'react';\nimport type { PanZoomState } from './usePanZoom';\n\n/** A ref whose current value is always a live PanZoomState (never null). */\ntype PanZoomRef = { current: PanZoomState };\n\nexport interface DragCallbacks {\n onDragStart?: (canvasX: number, canvasY: number) => void;\n onDragMove: (dx: number, dy: number, canvasX: number, canvasY: number) => void;\n onDragEnd?: (canvasX: number, canvasY: number) => void;\n}\n\n/**\n * Generic SVG drag hook.\n *\n * Converts raw clientX/Y into canvas coordinates using the current pan/zoom,\n * then fires `onDragMove` with the delta since the last frame.\n *\n * Uses window-level listeners so that the drag continues even when the cursor\n * leaves the SVG element.\n */\nexport function useDrag(\n svgRef: RefObject<SVGSVGElement | null>,\n panZoomRef: PanZoomRef,\n callbacks: DragCallbacks,\n) {\n // Keep callbacks in a ref so window listeners always call the latest version.\n const cbRef = useRef(callbacks);\n cbRef.current = callbacks;\n\n const lastCanvas = useRef({ x: 0, y: 0 });\n\n /** Convert a screen position (clientX, clientY) to canvas coordinates. */\n const toCanvas = useCallback(\n (clientX: number, clientY: number): { x: number; y: number } => {\n const rect = svgRef.current?.getBoundingClientRect() ?? { left: 0, top: 0 };\n const { panX, panY, zoom } = panZoomRef.current;\n return {\n x: (clientX - rect.left - panX) / zoom,\n y: (clientY - rect.top - panY) / zoom,\n };\n },\n [svgRef, panZoomRef],\n );\n\n const handleMouseDown = useCallback(\n (e: ReactMouseEvent) => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n\n const canvas = toCanvas(e.clientX, e.clientY);\n lastCanvas.current = canvas;\n cbRef.current.onDragStart?.(canvas.x, canvas.y);\n\n const onMove = (ev: MouseEvent) => {\n const c = toCanvas(ev.clientX, ev.clientY);\n const dx = c.x - lastCanvas.current.x;\n const dy = c.y - lastCanvas.current.y;\n lastCanvas.current = c;\n cbRef.current.onDragMove(dx, dy, c.x, c.y);\n };\n\n const onUp = (ev: MouseEvent) => {\n const c = toCanvas(ev.clientX, ev.clientY);\n cbRef.current.onDragEnd?.(c.x, c.y);\n window.removeEventListener('mousemove', onMove);\n window.removeEventListener('mouseup', onUp);\n };\n\n window.addEventListener('mousemove', onMove);\n window.addEventListener('mouseup', onUp);\n },\n [toCanvas],\n );\n\n return { handleMouseDown };\n}\n","import { useRef, useCallback } from 'react';\nimport type { RefObject, MouseEvent as ReactMouseEvent } from 'react';\nimport type { FloorArea } from '../types';\nimport type { PanZoomState } from '../hooks/usePanZoom';\nimport { useDrag } from '../hooks/useDrag';\n\ntype PanZoomRef = { current: PanZoomState };\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\ntype HandleType = 'nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w';\n\nconst HANDLE_CURSORS: Record<HandleType, string> = {\n nw: 'nwse-resize',\n ne: 'nesw-resize',\n se: 'nwse-resize',\n sw: 'nesw-resize',\n n: 'ns-resize',\n s: 'ns-resize',\n e: 'ew-resize',\n w: 'ew-resize',\n};\n\nconst MIN_SIZE = 50;\nconst HANDLE_PX = 8;\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\ninterface ArtboardProps {\n area: FloorArea;\n onResize: (area: FloorArea) => void;\n onMove?: (dx: number, dy: number) => void;\n onResizeCommit?: (area: FloorArea) => void;\n svgRef: RefObject<SVGSVGElement | null>;\n panZoomRef: PanZoomRef;\n zoom: number;\n readOnly?: boolean;\n}\n\n// ─── Geometry helper ──────────────────────────────────────────────────────────\n\nfunction applyHandleDelta(\n area: FloorArea,\n handle: HandleType,\n dx: number,\n dy: number,\n): FloorArea {\n const ax = area.x ?? 0;\n const ay = area.y ?? 0;\n const aw = area.width ?? 400;\n const ah = area.height ?? 300;\n\n const right = ax + aw;\n const bottom = ay + ah;\n\n let nx = ax, ny = ay, nw = aw, nh = ah;\n\n switch (handle) {\n case 'nw':\n nw = Math.max(MIN_SIZE, aw - dx);\n nh = Math.max(MIN_SIZE, ah - dy);\n nx = right - nw;\n ny = bottom - nh;\n break;\n case 'n':\n nh = Math.max(MIN_SIZE, ah - dy);\n ny = bottom - nh;\n break;\n case 'ne':\n nw = Math.max(MIN_SIZE, aw + dx);\n nh = Math.max(MIN_SIZE, ah - dy);\n ny = bottom - nh;\n break;\n case 'e':\n nw = Math.max(MIN_SIZE, aw + dx);\n break;\n case 'se':\n nw = Math.max(MIN_SIZE, aw + dx);\n nh = Math.max(MIN_SIZE, ah + dy);\n break;\n case 's':\n nh = Math.max(MIN_SIZE, ah + dy);\n break;\n case 'sw':\n nw = Math.max(MIN_SIZE, aw - dx);\n nh = Math.max(MIN_SIZE, ah + dy);\n nx = right - nw;\n break;\n case 'w':\n nw = Math.max(MIN_SIZE, aw - dx);\n nx = right - nw;\n break;\n }\n\n return { ...area, x: nx, y: ny, width: nw, height: nh };\n}\n\n// ─── PolygonArtboard ──────────────────────────────────────────────────────────\n\ninterface PolygonArtboardProps {\n area: FloorArea;\n onResize: (area: FloorArea) => void;\n onMove?: (dx: number, dy: number) => void;\n onResizeCommit?: (area: FloorArea) => void;\n svgRef: RefObject<SVGSVGElement | null>;\n panZoomRef: PanZoomRef;\n zoom: number;\n readOnly?: boolean;\n}\n\nfunction PolygonArtboard({\n area,\n onResize,\n onMove,\n onResizeCommit,\n svgRef,\n panZoomRef,\n zoom,\n readOnly = false,\n}: PolygonArtboardProps) {\n const pts = area.points ?? [];\n const areaRef = useRef(area);\n areaRef.current = area;\n\n const activeVertex = useRef<number | null>(null);\n const vertexStart = useRef({ vx: 0, vy: 0, mx: 0, my: 0 });\n\n const { handleMouseDown: handleVertexDown } = useDrag(svgRef, panZoomRef, {\n onDragStart: (mx, my) => {\n const idx = activeVertex.current;\n if (idx === null) return;\n const currentPts = areaRef.current.points ?? [];\n vertexStart.current = { vx: currentPts[idx][0], vy: currentPts[idx][1], mx, my };\n },\n onDragMove: (_dx, _dy, canvasX, canvasY) => {\n const idx = activeVertex.current;\n if (idx === null) return;\n const { vx, vy, mx, my } = vertexStart.current;\n const newX = vx + (canvasX - mx);\n const newY = vy + (canvasY - my);\n const currentPts = areaRef.current.points ?? [];\n const newPts = currentPts.map((p, i): [number, number] =>\n i === idx ? [newX, newY] : p,\n );\n const newArea: FloorArea = { ...areaRef.current, points: newPts };\n onResize(newArea);\n },\n onDragEnd: () => {\n onResizeCommit?.(areaRef.current);\n activeVertex.current = null;\n },\n });\n\n const startVertexDrag = useCallback(\n (e: ReactMouseEvent, idx: number) => {\n activeVertex.current = idx;\n handleVertexDown(e);\n },\n [handleVertexDown],\n );\n\n const { handleMouseDown: handleBodyDown } = useDrag(svgRef, panZoomRef, {\n onDragMove: (dx, dy) => {\n onMove?.(dx, dy);\n },\n });\n\n const handleDeleteVertex = useCallback(\n (e: ReactMouseEvent, idx: number) => {\n e.stopPropagation();\n const currentPts = areaRef.current.points ?? [];\n if (currentPts.length <= 3) return;\n const newPts = currentPts.filter((_, i) => i !== idx);\n const newArea: FloorArea = { ...areaRef.current, points: newPts };\n onResize(newArea);\n onResizeCommit?.(newArea);\n },\n [onResize, onResizeCommit],\n );\n\n const handleAddVertex = useCallback(\n (e: ReactMouseEvent, insertAfterIdx: number) => {\n e.stopPropagation();\n const currentPts = areaRef.current.points ?? [];\n const a = currentPts[insertAfterIdx];\n const b = currentPts[(insertAfterIdx + 1) % currentPts.length];\n const mid: [number, number] = [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];\n const newPts = [\n ...currentPts.slice(0, insertAfterIdx + 1),\n mid,\n ...currentPts.slice(insertAfterIdx + 1),\n ];\n const newArea: FloorArea = { ...areaRef.current, points: newPts };\n onResize(newArea);\n onResizeCommit?.(newArea);\n },\n [onResize, onResizeCommit],\n );\n\n if (pts.length < 3) return null;\n\n const pointsStr = pts.map(([x, y]) => `${x},${y}`).join(' ');\n const hs = HANDLE_PX / zoom;\n const sw = 1.5 / zoom;\n const dash = `${6 / zoom},${3 / zoom}`;\n\n return (\n <g>\n <defs>\n <filter id=\"vme-artboard-shadow\" x=\"-4%\" y=\"-4%\" width=\"108%\" height=\"108%\">\n <feDropShadow dx={0} dy={3 / zoom} stdDeviation={6 / zoom} floodOpacity={0.12} />\n </filter>\n </defs>\n\n {/* Shadow polygon */}\n <polygon\n points={pointsStr}\n fill=\"#fafaf9\"\n stroke=\"none\"\n filter=\"url(#vme-artboard-shadow)\"\n />\n\n {/* Body drag target (dashed border) */}\n <polygon\n points={pointsStr}\n fill=\"transparent\"\n stroke=\"#94a3b8\"\n strokeWidth={sw}\n strokeDasharray={dash}\n style={{ cursor: readOnly ? 'default' : 'move' }}\n onMouseDown={readOnly ? undefined : handleBodyDown}\n />\n\n {!readOnly && (\n <>\n {/* Edge midpoint diamond handles — click to add vertex */}\n {pts.map(([ax, ay], i) => {\n const [bx, by] = pts[(i + 1) % pts.length];\n const mx = (ax + bx) / 2;\n const my = (ay + by) / 2;\n return (\n <rect\n key={`mid-${i}`}\n x={mx - hs * 0.75}\n y={my - hs * 0.75}\n width={hs * 1.5}\n height={hs * 1.5}\n fill=\"white\"\n stroke=\"#94a3b8\"\n strokeWidth={sw}\n style={{ cursor: 'copy', transform: `rotate(45deg)`, transformOrigin: `${mx}px ${my}px` }}\n onClick={e => handleAddVertex(e, i)}\n />\n );\n })}\n\n {/* Vertex square handles */}\n {pts.map(([vx, vy], i) => (\n <rect\n key={`v-${i}`}\n x={vx - hs}\n y={vy - hs}\n width={hs * 2}\n height={hs * 2}\n rx={1 / zoom}\n fill=\"white\"\n stroke=\"#3b82f6\"\n strokeWidth={sw}\n style={{ cursor: 'move' }}\n onMouseDown={e => startVertexDrag(e, i)}\n onDoubleClick={e => handleDeleteVertex(e, i)}\n />\n ))}\n </>\n )}\n </g>\n );\n}\n\n// ─── RectArtboard ─────────────────────────────────────────────────────────────\n// Extracted so all hooks are at the top level of a single component (Rules of Hooks).\n\nfunction RectArtboard({\n area,\n onResize,\n onMove,\n onResizeCommit,\n svgRef,\n panZoomRef,\n zoom,\n readOnly = false,\n}: ArtboardProps) {\n const activeHandle = useRef<HandleType | null>(null);\n const areaRef = useRef(area);\n areaRef.current = area;\n\n const { handleMouseDown: handleHandleDown } = useDrag(svgRef, panZoomRef, {\n onDragMove: (dx, dy) => {\n if (!activeHandle.current) return;\n onResize(applyHandleDelta(areaRef.current, activeHandle.current, dx, dy));\n },\n onDragEnd: () => {\n onResizeCommit?.(areaRef.current);\n activeHandle.current = null;\n },\n });\n\n const startHandleDrag = useCallback(\n (e: ReactMouseEvent, type: HandleType) => {\n activeHandle.current = type;\n handleHandleDown(e);\n },\n [handleHandleDown],\n );\n\n const { handleMouseDown: handleBodyDown } = useDrag(svgRef, panZoomRef, {\n onDragMove: (dx, dy) => {\n onMove?.(dx, dy);\n },\n });\n\n const ax = area.x ?? 0;\n const ay = area.y ?? 0;\n const aw = area.width ?? 400;\n const ah = area.height ?? 300;\n\n const hs = HANDLE_PX / zoom;\n const sw = 1.5 / zoom;\n const dash = `${6 / zoom},${3 / zoom}`;\n\n const handles: Array<{ type: HandleType; cx: number; cy: number }> = [\n { type: 'nw', cx: ax, cy: ay },\n { type: 'n', cx: ax + aw/2, cy: ay },\n { type: 'ne', cx: ax + aw, cy: ay },\n { type: 'e', cx: ax + aw, cy: ay + ah/2 },\n { type: 'se', cx: ax + aw, cy: ay + ah },\n { type: 's', cx: ax + aw/2, cy: ay + ah },\n { type: 'sw', cx: ax, cy: ay + ah },\n { type: 'w', cx: ax, cy: ay + ah/2 },\n ];\n\n return (\n <g>\n <defs>\n <filter id=\"vme-artboard-shadow\" x=\"-4%\" y=\"-4%\" width=\"108%\" height=\"108%\">\n <feDropShadow\n dx={0}\n dy={3 / zoom}\n stdDeviation={6 / zoom}\n floodOpacity={0.12}\n />\n </filter>\n </defs>\n\n <rect\n x={ax}\n y={ay}\n width={aw}\n height={ah}\n fill=\"#fafaf9\"\n stroke=\"none\"\n filter=\"url(#vme-artboard-shadow)\"\n />\n\n <rect\n x={ax}\n y={ay}\n width={aw}\n height={ah}\n fill=\"transparent\"\n stroke=\"#94a3b8\"\n strokeWidth={sw}\n strokeDasharray={dash}\n style={{ cursor: readOnly ? 'default' : 'move' }}\n onMouseDown={readOnly ? undefined : handleBodyDown}\n />\n\n {!readOnly &&\n handles.map(({ type, cx, cy }) => (\n <rect\n key={type}\n x={cx - hs}\n y={cy - hs}\n width={hs * 2}\n height={hs * 2}\n rx={1 / zoom}\n fill=\"white\"\n stroke=\"#3b82f6\"\n strokeWidth={sw}\n style={{ cursor: HANDLE_CURSORS[type] }}\n onMouseDown={e => startHandleDrag(e, type)}\n />\n ))}\n </g>\n );\n}\n\n// ─── Artboard (router) ────────────────────────────────────────────────────────\n\nexport function Artboard(props: ArtboardProps) {\n if (props.area.shape === 'polygon') {\n return <PolygonArtboard {...props} />;\n }\n return <RectArtboard {...props} />;\n}\n","import type { WallNode, Wall, ToolMode } from '../types';\nimport { wallSegmentPath } from '../utils/wallGeometry';\nimport type { Vec2 } from '../utils/wallGeometry';\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\ninterface WallLayerProps {\n nodes: WallNode[];\n walls: Wall[];\n zoom: number;\n tool: ToolMode;\n onDeleteWall?: (id: string) => void;\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction vecNorm(v: Vec2): Vec2 {\n const len = Math.hypot(v.x, v.y);\n return len < 1e-10 ? { x: 1, y: 0 } : { x: v.x / len, y: v.y / len };\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function WallLayer({ nodes, walls, zoom, tool, onDeleteWall }: WallLayerProps) {\n if (walls.length === 0 && nodes.length === 0) return null;\n\n // ── Build lookup maps ──────────────────────────────────────────────────────\n const nodeMap = new Map<string, WallNode>(nodes.map(n => [n.id, n]));\n\n // nodeId → list of walls that touch it\n const nodeWalls = new Map<string, Wall[]>();\n for (const n of nodes) nodeWalls.set(n.id, []);\n for (const wall of walls) {\n nodeWalls.get(wall.nodeAId)?.push(wall);\n nodeWalls.get(wall.nodeBId)?.push(wall);\n }\n\n // ── Compute per-wall paths with miter ─────────────────────────────────────\n const sw = 0.75 / zoom;\n const isErase = tool === 'ERASE';\n\n const items = walls.map(wall => {\n const nodeA = nodeMap.get(wall.nodeAId);\n const nodeB = nodeMap.get(wall.nodeBId);\n if (!nodeA || !nodeB) return null;\n\n // Adjacent-wall direction at nodeA (only when exactly 1 other wall present)\n const wallsAtA = (nodeWalls.get(wall.nodeAId) ?? []).filter(w => w.id !== wall.id);\n let adjDirAtA: Vec2 | null = null;\n if (wallsAtA.length === 1) {\n const w2 = wallsAtA[0];\n const otherId = w2.nodeAId === wall.nodeAId ? w2.nodeBId : w2.nodeAId;\n const other = nodeMap.get(otherId);\n if (other) adjDirAtA = vecNorm({ x: other.x - nodeA.x, y: other.y - nodeA.y });\n }\n\n // Adjacent-wall direction at nodeB\n const wallsAtB = (nodeWalls.get(wall.nodeBId) ?? []).filter(w => w.id !== wall.id);\n let adjDirAtB: Vec2 | null = null;\n if (wallsAtB.length === 1) {\n const w2 = wallsAtB[0];\n const otherId = w2.nodeAId === wall.nodeBId ? w2.nodeBId : w2.nodeAId;\n const other = nodeMap.get(otherId);\n if (other) adjDirAtB = vecNorm({ x: other.x - nodeB.x, y: other.y - nodeB.y });\n }\n\n const path = wallSegmentPath(\n nodeA.x, nodeA.y, nodeB.x, nodeB.y,\n wall.thickness, adjDirAtA, adjDirAtB,\n );\n return { wall, path };\n }).filter((x): x is NonNullable<typeof x> => x !== null);\n\n return (\n <g>\n {/* ── Wall fills ── */}\n {items.map(({ wall, path }) => (\n <g key={wall.id}>\n {/* Visible fill */}\n <path\n d={path}\n fill=\"#475569\"\n stroke=\"#1e293b\"\n strokeWidth={sw}\n strokeLinejoin=\"miter\"\n style={{ pointerEvents: 'none' }}\n />\n {/* Wide invisible hit area for erasing */}\n {isErase && (\n <path\n d={path}\n fill=\"transparent\"\n stroke=\"transparent\"\n strokeWidth={Math.max(wall.thickness, 16) / zoom}\n style={{ cursor: 'crosshair', pointerEvents: 'all' }}\n onClick={() => onDeleteWall?.(wall.id)}\n />\n )}\n </g>\n ))}\n\n {/* ── Node dots (visible in WALL mode to show the graph) ── */}\n {tool === 'WALL' && nodes.map(node => (\n <circle\n key={node.id}\n cx={node.x}\n cy={node.y}\n r={4 / zoom}\n fill=\"#3b82f6\"\n stroke=\"white\"\n strokeWidth={1.5 / zoom}\n style={{ pointerEvents: 'none' }}\n />\n ))}\n </g>\n );\n}\n","import { useRef, useCallback } from 'react';\nimport type { RefObject, MouseEvent as ReactMouseEvent } from 'react';\nimport type { MapElement, ElementTypeDef, ToolMode } from '../types';\nimport type { PanZoomState } from '../hooks/usePanZoom';\nimport { useDrag } from '../hooks/useDrag';\nimport { snapToGrid } from '../utils/snapUtils';\n\n// ─── Arrow shape ──────────────────────────────────────────────────────────────\n\nfunction arrowPath(x: number, y: number, w: number, h: number): string {\n const headW = Math.min(w * 0.4, h * 0.9);\n const tailH = h * 0.45;\n const yt = y + (h - tailH) / 2;\n const yb = y + (h + tailH) / 2;\n return [\n `M ${x} ${yt}`,\n `L ${x + w - headW} ${yt}`,\n `L ${x + w - headW} ${y}`,\n `L ${x + w} ${y + h / 2}`,\n `L ${x + w - headW} ${y + h}`,\n `L ${x + w - headW} ${yb}`,\n `L ${x} ${yb}`,\n 'Z',\n ].join(' ');\n}\n\n// ─── Resize-handle geometry ───────────────────────────────────────────────────\n\ntype HandleType = 'nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w';\n\nconst HANDLE_CURSORS: Record<HandleType, string> = {\n nw: 'nwse-resize', ne: 'nesw-resize',\n se: 'nwse-resize', sw: 'nesw-resize',\n n: 'ns-resize', s: 'ns-resize',\n e: 'ew-resize', w: 'ew-resize',\n};\n\nconst MIN_SIZE = 10;\n\n/** Rotate a vector (dx, dy) by -θ (degrees) to map canvas delta → local delta. */\nfunction rotateDelta(dx: number, dy: number, deg: number): [number, number] {\n const r = -deg * (Math.PI / 180);\n return [dx * Math.cos(r) - dy * Math.sin(r), dx * Math.sin(r) + dy * Math.cos(r)];\n}\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\ninterface ElementNodeProps {\n element: MapElement;\n typeDef: ElementTypeDef;\n isSelected: boolean;\n tool: ToolMode;\n zoom: number;\n svgRef: RefObject<SVGSVGElement | null>;\n panZoomRef: { current: PanZoomState };\n snapEnabled: boolean;\n gridSize: number;\n statusFill?: string;\n onSelect: (multi: boolean) => void;\n onMove: (x: number, y: number) => void;\n onMoveCommit: (x: number, y: number) => void;\n onResize: (x: number, y: number, w: number, h: number) => void;\n onResizeCommit: (x: number, y: number, w: number, h: number) => void;\n onRotate: (rotation: number) => void;\n onRotateCommit: (rotation: number) => void;\n onDelete: () => void;\n onViewerClick?: () => void;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function ElementNode({\n element,\n typeDef,\n isSelected,\n tool,\n zoom,\n svgRef,\n panZoomRef,\n snapEnabled,\n gridSize,\n statusFill,\n onSelect,\n onMove,\n onMoveCommit,\n onResize,\n onResizeCommit,\n onRotate,\n onRotateCommit,\n onDelete,\n onViewerClick,\n}: ElementNodeProps) {\n const { x, y, width: w, height: h, rotation } = element;\n const cx = x + w / 2;\n const cy = y + h / 2;\n\n const sw = 1.5 / zoom;\n const hs = 7 / zoom; // handle half-size\n const rotOffset = 22 / zoom; // rotate handle distance above bbox\n const fontSize = Math.max(9 / zoom, Math.min(13 / zoom, h * 0.35));\n\n // ── Move drag ───────────────────────────────────────────────────────────────\n const startPos = useRef({ elX: 0, elY: 0, mouseX: 0, mouseY: 0 });\n const lastMovePos = useRef({ x: 0, y: 0 });\n\n const { handleMouseDown: handleBodyDown } = useDrag(svgRef, panZoomRef, {\n onDragStart: (mx, my) => {\n startPos.current = { elX: element.x, elY: element.y, mouseX: mx, mouseY: my };\n lastMovePos.current = { x: element.x, y: element.y };\n },\n onDragMove: (_dx, _dy, canvasX, canvasY) => {\n let nx = startPos.current.elX + (canvasX - startPos.current.mouseX);\n let ny = startPos.current.elY + (canvasY - startPos.current.mouseY);\n if (snapEnabled) { nx = snapToGrid(nx, gridSize); ny = snapToGrid(ny, gridSize); }\n lastMovePos.current = { x: nx, y: ny };\n onMove(nx, ny);\n },\n onDragEnd: () => {\n onMoveCommit(lastMovePos.current.x, lastMovePos.current.y);\n },\n });\n\n // ── Resize drag ─────────────────────────────────────────────────────────────\n const activeHandle = useRef<HandleType | null>(null);\n const startGeom = useRef({ x: 0, y: 0, w: 0, h: 0, mouseX: 0, mouseY: 0 });\n const lastResizeGeom = useRef({ x: 0, y: 0, w: 0, h: 0 });\n\n const { handleMouseDown: handleHandleDown } = useDrag(svgRef, panZoomRef, {\n onDragStart: (mx, my) => {\n startGeom.current = { x: element.x, y: element.y, w: element.width, h: element.height, mouseX: mx, mouseY: my };\n lastResizeGeom.current = { x: element.x, y: element.y, w: element.width, h: element.height };\n },\n onDragMove: (_dx, _dy, canvasX, canvasY) => {\n const type = activeHandle.current;\n if (!type) return;\n const totalDx = canvasX - startGeom.current.mouseX;\n const totalDy = canvasY - startGeom.current.mouseY;\n const [ldx, ldy] = rotateDelta(totalDx, totalDy, rotation);\n const { x: sx, y: sy, w: sw_, h: sh } = startGeom.current;\n const right = sx + sw_;\n const bottom = sy + sh;\n\n let nx = sx, ny = sy, nw = sw_, nh = sh;\n switch (type) {\n case 'nw': nw = Math.max(MIN_SIZE, sw_ - ldx); nh = Math.max(MIN_SIZE, sh - ldy); nx = right - nw; ny = bottom - nh; break;\n case 'n': nh = Math.max(MIN_SIZE, sh - ldy); ny = bottom - nh; break;\n case 'ne': nw = Math.max(MIN_SIZE, sw_ + ldx); nh = Math.max(MIN_SIZE, sh - ldy); ny = bottom - nh; break;\n case 'e': nw = Math.max(MIN_SIZE, sw_ + ldx); break;\n case 'se': nw = Math.max(MIN_SIZE, sw_ + ldx); nh = Math.max(MIN_SIZE, sh + ldy); break;\n case 's': nh = Math.max(MIN_SIZE, sh + ldy); break;\n case 'sw': nw = Math.max(MIN_SIZE, sw_ - ldx); nh = Math.max(MIN_SIZE, sh + ldy); nx = right - nw; break;\n case 'w': nw = Math.max(MIN_SIZE, sw_ - ldx); nx = right - nw; break;\n }\n if (snapEnabled) {\n nw = Math.max(MIN_SIZE, snapToGrid(nw, gridSize));\n nh = Math.max(MIN_SIZE, snapToGrid(nh, gridSize));\n }\n lastResizeGeom.current = { x: nx, y: ny, w: nw, h: nh };\n onResize(nx, ny, nw, nh);\n },\n onDragEnd: () => {\n const { x: rx, y: ry, w: rw, h: rh } = lastResizeGeom.current;\n onResizeCommit(rx, ry, rw, rh);\n activeHandle.current = null;\n },\n });\n\n const startHandleDrag = useCallback(\n (e: ReactMouseEvent, type: HandleType) => {\n activeHandle.current = type;\n handleHandleDown(e);\n },\n [handleHandleDown],\n );\n\n // ── Rotate drag ─────────────────────────────────────────────────────────────\n const rotStart = useRef({ angleOffset: 0 });\n\n const handleRotateDown = useCallback(\n (e: ReactMouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n const svgRect = svgRef.current?.getBoundingClientRect();\n if (!svgRect) return;\n const { panX, panY, zoom: z } = panZoomRef.current;\n const mcx = (e.clientX - svgRect.left - panX) / z;\n const mcy = (e.clientY - svgRect.top - panY) / z;\n const initAngle = Math.atan2(mcy - cy, mcx - cx) * (180 / Math.PI);\n rotStart.current.angleOffset = element.rotation - initAngle;\n\n // Track the live rotation so onUp always commits the final value,\n // not the stale element.rotation captured in the useCallback closure.\n let currentRot = element.rotation;\n\n const onMove = (ev: MouseEvent) => {\n const rect = svgRef.current?.getBoundingClientRect();\n if (!rect) return;\n const { panX: px, panY: py, zoom: z2 } = panZoomRef.current;\n const mx2 = (ev.clientX - rect.left - px) / z2;\n const my2 = (ev.clientY - rect.top - py) / z2;\n let newRot = Math.atan2(my2 - cy, mx2 - cx) * (180 / Math.PI) + rotStart.current.angleOffset;\n if (ev.shiftKey) newRot = Math.round(newRot / 15) * 15;\n currentRot = newRot;\n onRotate(newRot);\n };\n\n const onUp = () => {\n onRotateCommit(currentRot);\n window.removeEventListener('mousemove', onMove);\n window.removeEventListener('mouseup', onUp);\n };\n\n window.addEventListener('mousemove', onMove);\n window.addEventListener('mouseup', onUp);\n },\n [cx, cy, element.rotation, panZoomRef, svgRef, onRotate, onRotateCommit],\n );\n\n // ── Body click (select / erase) ─────────────────────────────────────────────\n const handleBodyClick = useCallback(\n (e: ReactMouseEvent) => {\n e.stopPropagation();\n if (onViewerClick) { onViewerClick(); return; }\n if (tool === 'ERASE') { onDelete(); return; }\n if (tool === 'SELECT') { onSelect(e.ctrlKey || e.metaKey || e.shiftKey); }\n },\n [tool, onDelete, onSelect, onViewerClick],\n );\n\n // ── Derived ─────────────────────────────────────────────────────────────────\n const fillColor = statusFill ?? typeDef.color;\n const bodyCursor = onViewerClick ? 'pointer' : tool === 'ERASE' ? 'crosshair' : tool === 'SELECT' ? 'move' : 'default';\n\n // ── Custom SVG path geometry ─────────────────────────────────────────────────\n // Parse the viewBox to get the coordinate space the path was designed in.\n const customPath = typeDef.shape === 'path' && typeDef.svgPath\n ? (() => {\n const parts = (typeDef.viewBox ?? '0 0 100 100').split(/[\\s,]+/).map(Number);\n const vw = parts[2] ?? 100;\n const vh = parts[3] ?? 100;\n const scaleX = vw > 0 ? w / vw : 1;\n const scaleY = vh > 0 ? h / vh : 1;\n // Compensate stroke so it renders as ~sw in canvas units regardless of shape scale\n const avgScale = Math.sqrt(Math.abs(scaleX * scaleY)) || 1;\n return { scaleX, scaleY, strokeWidth: sw / avgScale };\n })()\n : null;\n\n const handles: Array<{ type: HandleType; hx: number; hy: number }> = [\n { type: 'nw', hx: x, hy: y },\n { type: 'n', hx: x+w/2, hy: y },\n { type: 'ne', hx: x+w, hy: y },\n { type: 'e', hx: x+w, hy: y+h/2 },\n { type: 'se', hx: x+w, hy: y+h },\n { type: 's', hx: x+w/2, hy: y+h },\n { type: 'sw', hx: x, hy: y+h },\n { type: 'w', hx: x, hy: y+h/2 },\n ];\n\n return (\n <g transform={`rotate(${rotation}, ${cx}, ${cy})`}>\n {/* ── Shape ── */}\n {typeDef.shape === 'rect' && (\n <rect\n x={x} y={y} width={w} height={h}\n fill={fillColor}\n stroke={isSelected ? '#3b82f6' : typeDef.strokeColor}\n strokeWidth={isSelected ? sw * 1.5 : sw}\n style={{ cursor: bodyCursor }}\n onMouseDown={tool === 'SELECT' && !onViewerClick ? handleBodyDown : undefined}\n onClick={handleBodyClick}\n />\n )}\n {typeDef.shape === 'circle' && (\n <ellipse\n cx={cx} cy={cy} rx={w / 2} ry={h / 2}\n fill={fillColor}\n stroke={isSelected ? '#3b82f6' : typeDef.strokeColor}\n strokeWidth={isSelected ? sw * 1.5 : sw}\n style={{ cursor: bodyCursor }}\n onMouseDown={tool === 'SELECT' && !onViewerClick ? handleBodyDown : undefined}\n onClick={handleBodyClick}\n />\n )}\n {typeDef.shape === 'arrow' && (\n <path\n d={arrowPath(x, y, w, h)}\n fill={fillColor}\n stroke={isSelected ? '#3b82f6' : typeDef.strokeColor}\n strokeWidth={isSelected ? sw * 1.5 : sw}\n style={{ cursor: bodyCursor }}\n onMouseDown={tool === 'SELECT' && !onViewerClick ? handleBodyDown : undefined}\n onClick={handleBodyClick}\n />\n )}\n {typeDef.shape === 'path' && customPath && typeDef.svgPath && (\n <g transform={`translate(${x}, ${y}) scale(${customPath.scaleX}, ${customPath.scaleY})`}>\n <path\n d={typeDef.svgPath}\n fill={fillColor}\n stroke={isSelected ? '#3b82f6' : typeDef.strokeColor}\n strokeWidth={isSelected ? customPath.strokeWidth * 1.5 : customPath.strokeWidth}\n style={{ cursor: bodyCursor }}\n onMouseDown={tool === 'SELECT' && !onViewerClick ? handleBodyDown : undefined}\n onClick={handleBodyClick}\n />\n </g>\n )}\n\n {/* ── Label ── */}\n {(element.label ?? typeDef.label) && (\n <text\n x={cx} y={cy}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n fontSize={fontSize}\n fill={typeDef.strokeColor}\n style={{ pointerEvents: 'none', userSelect: 'none' }}\n >\n {element.label ?? typeDef.label}\n </text>\n )}\n\n {/* ── Selection overlays ── */}\n {isSelected && tool === 'SELECT' && (\n <>\n {/* Rotate line + handle */}\n <line\n x1={cx} y1={y}\n x2={cx} y2={y - rotOffset}\n stroke=\"#3b82f6\" strokeWidth={sw}\n style={{ pointerEvents: 'none' }}\n />\n <circle\n cx={cx} cy={y - rotOffset} r={hs * 0.8}\n fill=\"white\" stroke=\"#3b82f6\" strokeWidth={sw}\n style={{ cursor: 'grab' }}\n onMouseDown={handleRotateDown}\n />\n\n {/* Resize handles */}\n {handles.map(({ type, hx, hy }) => (\n <rect\n key={type}\n x={hx - hs} y={hy - hs}\n width={hs * 2} height={hs * 2}\n rx={1 / zoom}\n fill=\"white\" stroke=\"#3b82f6\" strokeWidth={sw}\n style={{ cursor: HANDLE_CURSORS[type] }}\n onMouseDown={e => startHandleDrag(e, type)}\n />\n ))}\n </>\n )}\n </g>\n );\n}\n","import { useRef, useEffect, useState, useCallback } from 'react';\nimport type { MouseEvent as ReactMouseEvent } from 'react';\nimport type { Floor, WallNode, ElementTypeDef, ToolMode } from '../types';\nimport type { PanZoomState } from '../hooks/usePanZoom';\nimport { usePanZoom } from '../hooks/usePanZoom';\nimport { findNearestNode, snapPoint } from '../utils/snapUtils';\nimport { wallSegmentPath } from '../utils/wallGeometry';\nimport { GridOverlay } from './GridOverlay';\nimport { Artboard } from './Artboard';\nimport { WallLayer } from './WallLayer';\nimport { ElementNode } from './ElementNode';\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\nconst SNAP_PX = 10; // screen pixels for wall-node snap\nconst DEFAULT_THICKNESS = 8; // canvas units\n\n// ─── Floor bounds ─────────────────────────────────────────────────────────────\n\nfunction insideFloor(x: number, y: number, floor: Floor): boolean {\n const { area } = floor;\n if (area.shape === 'rect') {\n const ax = area.x ?? 0, ay = area.y ?? 0, aw = area.width ?? 0, ah = area.height ?? 0;\n return x >= ax && x <= ax + aw && y >= ay && y <= ay + ah;\n }\n if (area.shape === 'polygon') {\n const pts = area.points ?? [];\n let inside = false;\n for (let i = 0, j = pts.length - 1; i < pts.length; j = i++) {\n const [xi, yi] = pts[i], [xj, yj] = pts[j];\n if ((yi > y) !== (yj > y) && x < (xj - xi) * (y - yi) / (yj - yi) + xi) inside = !inside;\n }\n return inside;\n }\n return true;\n}\n\n// ─── Lasso ────────────────────────────────────────────────────────────────────\n\ninterface LassoRect { x: number; y: number; w: number; h: number }\n\nfunction rectsIntersect(a: LassoRect, b: LassoRect): boolean {\n return a.x < b.x + b.w && a.x + a.w > b.x && a.y < b.y + b.h && a.y + a.h > b.y;\n}\n\n// ─── Wall-draw state ──────────────────────────────────────────────────────────\n\ninterface WallDraw {\n /** Fixed start point (snapped or free). */\n startX: number;\n startY: number;\n /** Non-null when startX/Y snapped to an existing node. */\n snapStartNode: WallNode | null;\n /** Current cursor position in canvas coords. */\n previewX: number;\n previewY: number;\n /** Non-null when cursor is snapping to an existing end node. */\n snapEndNode: WallNode | null;\n}\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\ninterface EditorCanvasProps {\n floor: Floor;\n tool: ToolMode;\n gridSize: number;\n showGrid: boolean;\n readOnly: boolean;\n snapEnabled: boolean;\n elementTypeDefs: Map<string, ElementTypeDef>;\n selectedIds: ReadonlySet<string>;\n statusMap?: Map<string, string>;\n onAreaResize: (floor: Floor) => void;\n onAreaMove: (dx: number, dy: number) => void;\n onAreaResizeCommit?: (floor: Floor) => void;\n onSelectElement: (id: string, multi: boolean) => void;\n onSelectSet: (ids: string[]) => void;\n onClearSelection: () => void;\n onMoveElement: (id: string, x: number, y: number) => void;\n onMoveCommit: (id: string, x: number, y: number) => void;\n onResizeElement: (id: string, x: number, y: number, w: number, h: number) => void;\n onResizeCommit: (id: string, x: number, y: number, w: number, h: number) => void;\n onRotateElement: (id: string, rotation: number) => void;\n onRotateCommit: (id: string, rotation: number) => void;\n onDeleteElement: (id: string) => void;\n onPlaceElement: (canvasX: number, canvasY: number) => void;\n onAddWall?: (x1: number, y1: number, x2: number, y2: number,\n snapStartId: string | null, snapEndId: string | null) => void;\n onDeleteWall?: (wallId: string) => void;\n onViewerElementClick?: (id: string) => void;\n onZoomChange?: (zoom: number) => void;\n onRegisterZoomBy?: (fn: (factor: number) => void) => void;\n onRegisterResetView?: (fn: () => void) => void;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function EditorCanvas({\n floor,\n tool,\n gridSize,\n showGrid,\n readOnly,\n snapEnabled,\n elementTypeDefs,\n selectedIds,\n statusMap,\n onAreaResize,\n onAreaMove,\n onAreaResizeCommit,\n onSelectElement,\n onSelectSet,\n onClearSelection,\n onMoveElement,\n onMoveCommit,\n onResizeElement,\n onResizeCommit,\n onRotateElement,\n onRotateCommit,\n onDeleteElement,\n onPlaceElement,\n onAddWall,\n onDeleteWall,\n onViewerElementClick,\n onZoomChange,\n onRegisterZoomBy,\n onRegisterResetView,\n}: EditorCanvasProps) {\n const svgRef = useRef<SVGSVGElement>(null);\n\n const {\n state: panZoom, isPanning,\n handleWheel, handleMouseDown: handlePanMouseDown,\n handleMouseMove: handlePanMouseMove,\n handleMouseUp: handlePanMouseUp,\n handleMouseLeave,\n zoomBy, resetView,\n } = usePanZoom(1, tool === 'PAN');\n\n const panZoomRef = useRef<PanZoomState>(panZoom);\n panZoomRef.current = panZoom;\n\n // ── Lasso state ─────────────────────────────────────────────────────────────\n const [lasso, setLasso] = useState<LassoRect | null>(null);\n const lassoStart = useRef<{ cx: number; cy: number } | null>(null);\n\n // ── Wall draw state ──────────────────────────────────────────────────────────\n const [wallDraw, setWallDraw] = useState<WallDraw | null>(null);\n\n // Cancel wall draw when switching away from WALL tool\n useEffect(() => {\n if (tool !== 'WALL') setWallDraw(null);\n }, [tool]);\n\n // ── Expose callbacks ────────────────────────────────────────────────────────\n useEffect(() => {\n onRegisterZoomBy?.(zoomBy);\n onRegisterResetView?.(resetView);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => { onZoomChange?.(panZoom.zoom); }, [panZoom.zoom, onZoomChange]);\n\n // ── Prevent passive wheel ───────────────────────────────────────────────────\n useEffect(() => {\n const el = svgRef.current;\n if (!el) return;\n const prevent = (e: WheelEvent) => e.preventDefault();\n el.addEventListener('wheel', prevent, { passive: false });\n return () => el.removeEventListener('wheel', prevent);\n }, []);\n\n // ── Coordinate helper ───────────────────────────────────────────────────────\n const toCanvas = useCallback((clientX: number, clientY: number) => {\n const rect = svgRef.current?.getBoundingClientRect() ?? { left: 0, top: 0 };\n const { panX, panY, zoom } = panZoomRef.current;\n return { x: (clientX - rect.left - panX) / zoom, y: (clientY - rect.top - panY) / zoom };\n }, []);\n\n // ── Wall snap helper ─────────────────────────────────────────────────────────\n const findSnapNode = useCallback((\n cx: number, cy: number,\n excludeId?: string | null,\n ): WallNode | null => {\n const threshold = SNAP_PX / panZoomRef.current.zoom;\n const candidates = excludeId\n ? floor.wallNodes.filter(n => n.id !== excludeId)\n : floor.wallNodes;\n return findNearestNode(cx, cy, candidates, threshold) as WallNode | null;\n }, [floor.wallNodes]);\n\n // ── SVG mouse events ─────────────────────────────────────────────────────────\n const handleSvgMouseDown = useCallback((e: ReactMouseEvent<SVGSVGElement>) => {\n if (e.button === 1 || (e.button === 0 && tool === 'PAN')) {\n handlePanMouseDown(e);\n return;\n }\n if (e.button !== 0) return;\n\n const raw = toCanvas(e.clientX, e.clientY);\n const { x: cx, y: cy } = snapPoint(raw.x, raw.y, gridSize, snapEnabled);\n\n // ── WALL mode ──\n if (tool === 'WALL') {\n if (!wallDraw) {\n // First click: reject if outside floor\n if (!insideFloor(cx, cy, floor)) return;\n const snapNode = findSnapNode(cx, cy, null);\n const sx = snapNode ? snapNode.x : cx;\n const sy = snapNode ? snapNode.y : cy;\n setWallDraw({\n startX: sx, startY: sy,\n snapStartNode: snapNode,\n previewX: cx, previewY: cy,\n snapEndNode: null,\n });\n } else {\n // Second click: complete the wall\n // Snapped node is always a valid existing point; free point is clamped to floor\n const snapNode = findSnapNode(cx, cy, wallDraw.snapStartNode?.id ?? null);\n let ex: number, ey: number;\n if (snapNode) {\n ex = snapNode.x; ey = snapNode.y;\n } else {\n const { area } = floor;\n if (area.shape === 'rect') {\n const ax = area.x ?? 0, ay = area.y ?? 0;\n const aw = area.width ?? 0, ah = area.height ?? 0;\n ex = Math.max(ax, Math.min(ax + aw, cx));\n ey = Math.max(ay, Math.min(ay + ah, cy));\n } else if (area.shape === 'polygon') {\n const pts = area.points ?? [];\n if (insideFloor(cx, cy, floor)) {\n ex = cx; ey = cy;\n } else {\n // Clamp to nearest point on polygon perimeter\n let bestDist = Infinity;\n ex = cx; ey = cy;\n for (let i = 0, j = pts.length - 1; i < pts.length; j = i++) {\n const [ax2, ay2] = pts[j], [bx2, by2] = pts[i];\n const dx = bx2 - ax2, dy = by2 - ay2;\n const len2 = dx * dx + dy * dy;\n const t = len2 > 0 ? Math.max(0, Math.min(1, ((cx - ax2) * dx + (cy - ay2) * dy) / len2)) : 0;\n const nx = ax2 + t * dx, ny = ay2 + t * dy;\n const dist = (cx - nx) ** 2 + (cy - ny) ** 2;\n if (dist < bestDist) { bestDist = dist; ex = nx; ey = ny; }\n }\n }\n } else {\n ex = cx; ey = cy;\n }\n }\n\n // Ignore zero-length walls\n const dist = Math.hypot(ex - wallDraw.startX, ey - wallDraw.startY);\n if (dist > 2) {\n onAddWall?.(\n wallDraw.startX, wallDraw.startY,\n ex, ey,\n wallDraw.snapStartNode?.id ?? null,\n snapNode?.id ?? null,\n );\n }\n\n // Chain: start next wall from end point\n setWallDraw({\n startX: ex, startY: ey,\n snapStartNode: snapNode,\n previewX: cx, previewY: cy,\n snapEndNode: null,\n });\n }\n return;\n }\n\n if (tool === 'PLACE') {\n onPlaceElement(cx, cy);\n return;\n }\n\n if (tool === 'SELECT') {\n lassoStart.current = { cx, cy };\n setLasso({ x: cx, y: cy, w: 0, h: 0 });\n }\n }, [handlePanMouseDown, tool, toCanvas, gridSize, snapEnabled,\n wallDraw, findSnapNode, onAddWall, onPlaceElement]);\n\n const handleSvgMouseMove = useCallback((e: ReactMouseEvent<SVGSVGElement>) => {\n handlePanMouseMove(e);\n\n const raw = toCanvas(e.clientX, e.clientY);\n const { x: cx, y: cy } = snapPoint(raw.x, raw.y, gridSize, snapEnabled);\n\n if (tool === 'WALL' && wallDraw) {\n const snapNode = findSnapNode(cx, cy, wallDraw.snapStartNode?.id ?? null);\n setWallDraw(prev => prev\n ? { ...prev, previewX: cx, previewY: cy, snapEndNode: snapNode }\n : null,\n );\n return;\n }\n\n if (tool === 'SELECT' && lassoStart.current) {\n const lx = Math.min(cx, lassoStart.current.cx);\n const ly = Math.min(cy, lassoStart.current.cy);\n setLasso({ x: lx, y: ly, w: Math.abs(cx - lassoStart.current.cx), h: Math.abs(cy - lassoStart.current.cy) });\n }\n }, [handlePanMouseMove, tool, toCanvas, gridSize, snapEnabled, wallDraw, findSnapNode]);\n\n const handleSvgMouseUp = useCallback((e: ReactMouseEvent<SVGSVGElement>) => {\n handlePanMouseUp(e);\n\n if (lassoStart.current && lasso) {\n if (lasso.w > 4 / panZoom.zoom || lasso.h > 4 / panZoom.zoom) {\n const ids = floor.elements\n .filter(el => rectsIntersect(lasso, { x: el.x, y: el.y, w: el.width, h: el.height }))\n .map(el => el.id);\n if (ids.length > 0) onSelectSet(ids);\n else if (!e.ctrlKey && !e.metaKey) onClearSelection();\n } else {\n if (!e.ctrlKey && !e.metaKey) onClearSelection();\n }\n lassoStart.current = null;\n setLasso(null);\n }\n }, [handlePanMouseUp, lasso, panZoom.zoom, floor.elements, onSelectSet, onClearSelection]);\n\n const handleContextMenu = useCallback((e: ReactMouseEvent<SVGSVGElement>) => {\n e.preventDefault();\n // Right-click cancels in-progress wall drawing\n if (tool === 'WALL') setWallDraw(null);\n }, [tool]);\n\n // ── Derived ──────────────────────────────────────────────────────────────────\n const cursor = isPanning ? 'grabbing'\n : tool === 'PAN' ? 'grab'\n : tool === 'WALL' ? 'crosshair'\n : tool === 'PLACE' ? 'crosshair'\n : tool === 'ERASE' ? 'crosshair'\n : 'default';\n\n const { panX, panY, zoom } = panZoom;\n\n // Preview wall path (while drawing)\n const previewPath = wallDraw && (() => {\n const ex = wallDraw.snapEndNode?.x ?? wallDraw.previewX;\n const ey = wallDraw.snapEndNode?.y ?? wallDraw.previewY;\n const dist = Math.hypot(ex - wallDraw.startX, ey - wallDraw.startY);\n return dist > 2\n ? wallSegmentPath(wallDraw.startX, wallDraw.startY, ex, ey, DEFAULT_THICKNESS, null, null)\n : null;\n })();\n\n return (\n <svg\n ref={svgRef}\n className=\"w-full h-full select-none outline-none\"\n style={{ cursor, display: 'block' }}\n onWheel={handleWheel}\n onMouseDown={handleSvgMouseDown}\n onMouseMove={handleSvgMouseMove}\n onMouseUp={handleSvgMouseUp}\n onMouseLeave={handleMouseLeave}\n onContextMenu={handleContextMenu}\n >\n <g transform={`translate(${panX}, ${panY}) scale(${zoom})`}>\n {/* Canvas background */}\n <rect x={-50000} y={-50000} width={100000} height={100000} fill=\"#f1f5f9\" />\n\n {/* Grid */}\n {showGrid && <GridOverlay gridSize={gridSize} />}\n\n {/* Artboard */}\n <Artboard\n area={floor.area}\n onResize={area => onAreaResize({ ...floor, area })}\n onMove={onAreaMove}\n onResizeCommit={area => onAreaResizeCommit?.({ ...floor, area })}\n svgRef={svgRef}\n panZoomRef={panZoomRef}\n zoom={zoom}\n readOnly={readOnly || tool !== 'SELECT'}\n />\n\n {/* Walls */}\n <WallLayer\n nodes={floor.wallNodes}\n walls={floor.walls}\n zoom={zoom}\n tool={tool}\n onDeleteWall={onDeleteWall}\n />\n\n {/* Elements */}\n {floor.elements.map(el => {\n const typeDef = elementTypeDefs.get(el.type);\n if (!typeDef) return null;\n return (\n <ElementNode\n key={el.id}\n element={el}\n typeDef={typeDef}\n isSelected={selectedIds.has(el.id)}\n tool={tool}\n zoom={zoom}\n svgRef={svgRef}\n panZoomRef={panZoomRef}\n snapEnabled={snapEnabled}\n gridSize={gridSize}\n statusFill={statusMap?.get(el.id)}\n onSelect={multi => onSelectElement(el.id, multi)}\n onMove={(x, y) => onMoveElement(el.id, x, y)}\n onMoveCommit={(x, y) => onMoveCommit(el.id, x, y)}\n onResize={(x, y, w, h) => onResizeElement(el.id, x, y, w, h)}\n onResizeCommit={(x, y, w, h) => onResizeCommit(el.id, x, y, w, h)}\n onRotate={r => onRotateElement(el.id, r)}\n onRotateCommit={r => onRotateCommit(el.id, r)}\n onDelete={() => onDeleteElement(el.id)}\n onViewerClick={onViewerElementClick ? () => onViewerElementClick(el.id) : undefined}\n />\n );\n })}\n\n {/* Lasso rectangle */}\n {lasso && lasso.w > 0 && lasso.h > 0 && (\n <rect\n x={lasso.x} y={lasso.y} width={lasso.w} height={lasso.h}\n fill=\"rgba(59,130,246,0.06)\"\n stroke=\"#3b82f6\"\n strokeWidth={1 / zoom}\n strokeDasharray={`${4 / zoom},${2 / zoom}`}\n style={{ pointerEvents: 'none' }}\n />\n )}\n\n {/* ── Wall draw preview ── */}\n {wallDraw && (\n <>\n {/* Preview wall body */}\n {previewPath && (\n <path\n d={previewPath}\n fill=\"#94a3b8\"\n fillOpacity={0.45}\n stroke=\"#3b82f6\"\n strokeWidth={1 / zoom}\n strokeDasharray={`${5 / zoom},${3 / zoom}`}\n style={{ pointerEvents: 'none' }}\n />\n )}\n {/* Start node anchor */}\n <circle\n cx={wallDraw.startX} cy={wallDraw.startY}\n r={5 / zoom}\n fill=\"#3b82f6\" stroke=\"white\" strokeWidth={1.5 / zoom}\n style={{ pointerEvents: 'none' }}\n />\n {/* Snap ring around the nearest end node */}\n {wallDraw.snapEndNode && (\n <circle\n cx={wallDraw.snapEndNode.x} cy={wallDraw.snapEndNode.y}\n r={9 / zoom}\n fill=\"none\" stroke=\"#3b82f6\" strokeWidth={2 / zoom}\n style={{ pointerEvents: 'none' }}\n />\n )}\n </>\n )}\n </g>\n </svg>\n );\n}\n","import { useCallback } from 'react';\nimport type { ChangeEvent } from 'react';\nimport type { MapElement, ElementTypeDef } from '../types';\n\ninterface PropertiesPanelProps {\n elements: MapElement[];\n typeDefs: Map<string, ElementTypeDef>;\n onChangeLabel: (id: string, label: string) => void;\n onChangeGeometry: (id: string, x: number, y: number, w: number, h: number, r: number) => void;\n onDelete: (ids: string[]) => void;\n onDuplicate: (ids: string[]) => void;\n}\n\n// ─── Small numeric field ──────────────────────────────────────────────────────\n\ninterface NumFieldProps {\n label: string;\n value: number;\n onChange: (v: number) => void;\n step?: number;\n}\n\nfunction NumField({ label, value, onChange, step = 1 }: NumFieldProps) {\n return (\n <label className=\"flex flex-col gap-0.5\">\n <span className=\"text-[10px] font-medium text-slate-400 uppercase tracking-wide\">\n {label}\n </span>\n <input\n type=\"number\"\n value={Math.round(value)}\n step={step}\n onChange={e => onChange(Number(e.target.value))}\n className=\"w-full border border-slate-200 rounded px-1.5 py-1 text-xs text-slate-700 focus:outline-none focus:ring-1 focus:ring-blue-400 bg-white\"\n />\n </label>\n );\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function PropertiesPanel({\n elements,\n typeDefs,\n onChangeLabel,\n onChangeGeometry,\n onDelete,\n onDuplicate,\n}: PropertiesPanelProps) {\n const count = elements.length;\n\n const handleLabelChange = useCallback(\n (id: string, e: ChangeEvent<HTMLInputElement>) => onChangeLabel(id, e.target.value),\n [onChangeLabel],\n );\n\n if (count === 0) return null;\n\n // ── Multi-selection ───────────────────────────────────────────────────────\n if (count > 1) {\n const ids = elements.map(el => el.id);\n return (\n <div className=\"w-56 shrink-0 border-l border-slate-200 bg-white flex flex-col\">\n <div className=\"px-3 py-2 border-b border-slate-100 text-xs font-semibold text-slate-500 uppercase tracking-wide\">\n Propiedades\n </div>\n <div className=\"flex-1 flex flex-col items-center justify-center gap-3 p-4 text-center\">\n <span className=\"text-2xl font-bold text-slate-700\">{count}</span>\n <span className=\"text-xs text-slate-400\">elementos seleccionados</span>\n </div>\n <div className=\"px-3 pb-3 flex flex-col gap-2\">\n <button\n onClick={() => onDuplicate(ids)}\n className=\"w-full text-xs px-3 py-1.5 rounded border border-slate-200 text-slate-600 hover:bg-slate-50 transition-colors\"\n >\n Duplicar selección\n </button>\n <button\n onClick={() => onDelete(ids)}\n className=\"w-full text-xs px-3 py-1.5 rounded bg-red-50 border border-red-200 text-red-600 hover:bg-red-100 transition-colors\"\n >\n Eliminar selección\n </button>\n </div>\n </div>\n );\n }\n\n // ── Single selection ──────────────────────────────────────────────────────\n const el = elements[0];\n const typeDef = typeDefs.get(el.type);\n\n const setGeom = (patch: Partial<{ x: number; y: number; w: number; h: number; r: number }>) => {\n onChangeGeometry(\n el.id,\n patch.x ?? el.x,\n patch.y ?? el.y,\n patch.w ?? el.width,\n patch.h ?? el.height,\n patch.r ?? el.rotation,\n );\n };\n\n return (\n <div className=\"w-56 shrink-0 border-l border-slate-200 bg-white flex flex-col overflow-y-auto\">\n {/* Header */}\n <div className=\"px-3 py-2 border-b border-slate-100 text-xs font-semibold text-slate-500 uppercase tracking-wide\">\n Propiedades\n </div>\n\n <div className=\"flex-1 flex flex-col gap-4 p-3\">\n {/* Type badge */}\n {typeDef && (\n <div className=\"flex items-center gap-2\">\n <span\n className=\"w-3.5 h-3.5 rounded-sm shrink-0 border\"\n style={{ background: typeDef.color, borderColor: typeDef.strokeColor }}\n />\n <span className=\"text-xs font-medium text-slate-700 truncate\">{typeDef.label}</span>\n </div>\n )}\n\n {/* Label */}\n <label className=\"flex flex-col gap-0.5\">\n <span className=\"text-[10px] font-medium text-slate-400 uppercase tracking-wide\">\n Etiqueta\n </span>\n <input\n type=\"text\"\n value={el.label ?? ''}\n placeholder={typeDef?.label ?? ''}\n onChange={e => handleLabelChange(el.id, e)}\n className=\"w-full border border-slate-200 rounded px-1.5 py-1 text-xs text-slate-700 focus:outline-none focus:ring-1 focus:ring-blue-400 bg-white\"\n />\n </label>\n\n {/* Position */}\n <div className=\"grid grid-cols-2 gap-2\">\n <NumField label=\"X\" value={el.x} onChange={v => setGeom({ x: v })} />\n <NumField label=\"Y\" value={el.y} onChange={v => setGeom({ y: v })} />\n </div>\n\n {/* Size */}\n <div className=\"grid grid-cols-2 gap-2\">\n <NumField label=\"Ancho\" value={el.width} onChange={v => setGeom({ w: Math.max(1, v) })} />\n <NumField label=\"Alto\" value={el.height} onChange={v => setGeom({ h: Math.max(1, v) })} />\n </div>\n\n {/* Rotation */}\n <div className=\"grid grid-cols-2 gap-2\">\n <NumField label=\"Rotación °\" value={el.rotation} onChange={v => setGeom({ r: v })} step={15} />\n <label className=\"flex flex-col gap-0.5\">\n <span className=\"text-[10px] font-medium text-slate-400 uppercase tracking-wide\">\n &nbsp;\n </span>\n <button\n onClick={() => setGeom({ r: 0 })}\n className=\"border border-slate-200 rounded px-1.5 py-1 text-xs text-slate-500 hover:bg-slate-50 transition-colors\"\n >\n Resetear\n </button>\n </label>\n </div>\n\n {/* Metadata (read-only key/value list) */}\n {el.metadata && Object.keys(el.metadata).length > 0 && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[10px] font-medium text-slate-400 uppercase tracking-wide\">\n Metadata\n </span>\n {Object.entries(el.metadata).map(([k, v]) => (\n <div key={k} className=\"flex justify-between text-xs text-slate-500\">\n <span className=\"truncate\">{k}</span>\n <span className=\"ml-2 text-slate-400 truncate\">{String(v)}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"px-3 pb-3 flex flex-col gap-2 border-t border-slate-100 pt-3\">\n <button\n onClick={() => onDuplicate([el.id])}\n className=\"w-full text-xs px-3 py-1.5 rounded border border-slate-200 text-slate-600 hover:bg-slate-50 transition-colors\"\n >\n Duplicar (Ctrl+D)\n </button>\n <button\n onClick={() => onDelete([el.id])}\n className=\"w-full text-xs px-3 py-1.5 rounded bg-red-50 border border-red-200 text-red-600 hover:bg-red-100 transition-colors\"\n >\n Eliminar\n </button>\n </div>\n </div>\n );\n}\n","import { useState, useRef, useCallback } from 'react';\nimport type { KeyboardEvent } from 'react';\nimport type { Floor } from '../types';\n\ninterface FloorTabsProps {\n floors: Floor[];\n activeFloorId: string;\n readOnly: boolean;\n onSelect: (id: string) => void;\n onAdd: () => void;\n onRename: (id: string, name: string) => void;\n onDelete: (id: string) => void;\n onReorder: (id: string, direction: 'left' | 'right') => void;\n}\n\nexport function FloorTabs({\n floors,\n activeFloorId,\n readOnly,\n onSelect,\n onAdd,\n onRename,\n onDelete,\n onReorder,\n}: FloorTabsProps) {\n const [editingId, setEditingId] = useState<string | null>(null);\n const [editValue, setEditValue] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n\n const sorted = floors.slice().sort((a, b) => a.order - b.order);\n\n const startEditing = useCallback((floor: Floor) => {\n if (readOnly) return;\n setEditingId(floor.id);\n setEditValue(floor.name);\n setTimeout(() => inputRef.current?.select(), 0);\n }, [readOnly]);\n\n const commitEdit = useCallback(() => {\n if (editingId && editValue.trim()) {\n onRename(editingId, editValue.trim());\n }\n setEditingId(null);\n }, [editingId, editValue, onRename]);\n\n const cancelEdit = useCallback(() => {\n setEditingId(null);\n }, []);\n\n const handleKeyDown = useCallback((e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') { e.preventDefault(); commitEdit(); }\n if (e.key === 'Escape') { e.preventDefault(); cancelEdit(); }\n }, [commitEdit, cancelEdit]);\n\n return (\n <div className=\"flex items-center gap-1 px-2 py-1 border-b border-slate-200 bg-slate-50 text-xs overflow-x-auto\">\n {sorted.map(floor => {\n const isActive = floor.id === activeFloorId;\n const idx = sorted.indexOf(floor);\n const canMoveLeft = idx > 0;\n const canMoveRight = idx < sorted.length - 1;\n\n return (\n <div\n key={floor.id}\n className={[\n 'flex items-center gap-0.5 px-2 py-1 rounded-t border transition-colors shrink-0',\n isActive\n ? 'bg-white border-slate-300 text-slate-800 font-medium'\n : 'border-transparent text-slate-500 hover:text-slate-700 cursor-pointer',\n ].join(' ')}\n onClick={() => !isActive && onSelect(floor.id)}\n >\n {!readOnly && isActive && canMoveLeft && (\n <button\n className=\"text-slate-400 hover:text-slate-700 px-0.5 leading-none\"\n onClick={e => { e.stopPropagation(); onReorder(floor.id, 'left'); }}\n title=\"Mover a la izquierda\"\n >\n ◀\n </button>\n )}\n\n {editingId === floor.id ? (\n <input\n ref={inputRef}\n value={editValue}\n onChange={e => setEditValue(e.target.value)}\n onBlur={commitEdit}\n onKeyDown={handleKeyDown}\n onClick={e => e.stopPropagation()}\n className=\"w-24 border border-blue-400 rounded px-1 text-xs outline-none\"\n />\n ) : (\n <span\n onDoubleClick={e => { e.stopPropagation(); startEditing(floor); }}\n className=\"select-none\"\n >\n {floor.name}\n </span>\n )}\n\n {!readOnly && isActive && canMoveRight && (\n <button\n className=\"text-slate-400 hover:text-slate-700 px-0.5 leading-none\"\n onClick={e => { e.stopPropagation(); onReorder(floor.id, 'right'); }}\n title=\"Mover a la derecha\"\n >\n ▶\n </button>\n )}\n\n {!readOnly && floors.length > 1 && (\n <button\n className=\"text-slate-400 hover:text-red-500 px-0.5 leading-none\"\n onClick={e => { e.stopPropagation(); onDelete(floor.id); }}\n title=\"Eliminar planta\"\n >\n ×\n </button>\n )}\n </div>\n );\n })}\n\n {!readOnly && (\n <button\n className=\"flex items-center justify-center w-6 h-6 rounded border border-dashed border-slate-300 text-slate-400 hover:border-blue-400 hover:text-blue-500 transition-colors shrink-0\"\n onClick={onAdd}\n title=\"Añadir planta\"\n >\n +\n </button>\n )}\n </div>\n );\n}\n","import { useState, useCallback } from 'react';\nimport type { VenueMap } from '../types';\n\nconst MAX_HISTORY = 50;\n\ninterface HistoryState {\n past: VenueMap[];\n present: VenueMap;\n future: VenueMap[];\n}\n\n/**\n * Undo/redo stack for VenueMap snapshots.\n *\n * - `push(next)` : commit a new state (clears redo stack)\n * - `undo()` : step back one snapshot\n * - `redo()` : step forward one snapshot\n * - `replace(next)`: update present WITHOUT pushing to history (e.g. live-drag)\n */\nexport function useHistory(initial: VenueMap) {\n const [history, setHistory] = useState<HistoryState>({\n past: [],\n present: initial,\n future: [],\n });\n\n /** Commit a new state — adds present to `past`, clears `future`. */\n const push = useCallback((next: VenueMap) => {\n setHistory(h => ({\n past: [...h.past.slice(-(MAX_HISTORY - 1)), h.present],\n present: next,\n future: [],\n }));\n }, []);\n\n /** Update present WITHOUT touching the undo stack (for live dragging). */\n const replace = useCallback((next: VenueMap) => {\n setHistory(h => ({ ...h, present: next }));\n }, []);\n\n const undo = useCallback(() => {\n setHistory(h => {\n if (h.past.length === 0) return h;\n const previous = h.past[h.past.length - 1];\n return {\n past: h.past.slice(0, -1),\n present: previous,\n future: [h.present, ...h.future],\n };\n });\n }, []);\n\n const redo = useCallback(() => {\n setHistory(h => {\n if (h.future.length === 0) return h;\n const next = h.future[0];\n return {\n past: [...h.past, h.present],\n present: next,\n future: h.future.slice(1),\n };\n });\n }, []);\n\n return {\n map: history.present,\n canUndo: history.past.length > 0,\n canRedo: history.future.length > 0,\n push,\n replace,\n undo,\n redo,\n };\n}\n","import { useState, useCallback } from 'react';\n\n/**\n * Selection state for map elements.\n *\n * - `select(id, multi)` : select an element; if `multi`, toggle it\n * - `selectSet(ids)` : replace selection with a set of ids\n * - `clear()` : deselect everything\n * - `isSelected(id)` : check membership\n */\nexport function useSelection() {\n const [selectedIds, setSelectedIds] = useState<ReadonlySet<string>>(new Set());\n\n const select = useCallback((id: string, multi = false) => {\n setSelectedIds(prev => {\n if (multi) {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n }\n // Single select: only switch if not already the sole selection\n if (prev.size === 1 && prev.has(id)) return prev;\n return new Set([id]);\n });\n }, []);\n\n const selectSet = useCallback((ids: string[]) => {\n setSelectedIds(new Set(ids));\n }, []);\n\n const clear = useCallback(() => {\n setSelectedIds(prev => (prev.size === 0 ? prev : new Set()));\n }, []);\n\n const isSelected = useCallback(\n (id: string) => selectedIds.has(id),\n [selectedIds],\n );\n\n return { selectedIds, select, selectSet, clear, isSelected };\n}\n","/** Generates a globally-unique id using the Web Crypto API. */\nexport const genId = (): string => crypto.randomUUID();\n","import { useState, useCallback, useEffect, useRef, useMemo } from 'react';\nimport type { CSSProperties } from 'react';\nimport type {\n VenueMapEditorProps,\n VenueMap,\n Floor,\n MapElement,\n WallNode,\n Wall,\n ToolMode,\n FloorArea,\n AreaShape,\n ElementLibrary,\n DomainConfig,\n} from './types';\nimport { Toolbar } from './components/Toolbar';\nimport type { PaletteGroup } from './components/Toolbar';\nimport { EditorCanvas } from './components/EditorCanvas';\nimport { PropertiesPanel } from './components/PropertiesPanel';\nimport { FloorTabs } from './components/FloorTabs';\nimport { useHistory } from './hooks/useHistory';\nimport { useSelection } from './hooks/useSelection';\nimport { genId } from './utils/idGen';\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction pointInPolygon(px: number, py: number, pts: [number, number][]): boolean {\n let inside = false;\n for (let i = 0, j = pts.length - 1; i < pts.length; j = i++) {\n const [xi, yi] = pts[i], [xj, yj] = pts[j];\n if ((yi > py) !== (yj > py) && px < (xj - xi) * (py - yi) / (yj - yi) + xi) inside = !inside;\n }\n return inside;\n}\n\n/** Returns the nearest point on the polygon perimeter to (px, py). */\nfunction clampPointToPolygon(px: number, py: number, pts: [number, number][]): { x: number; y: number } {\n let bestDist = Infinity, bx = pts[0][0], by = pts[0][1];\n for (let i = 0, j = pts.length - 1; i < pts.length; j = i++) {\n const [ax, ay] = pts[j], [bex, bey] = pts[i];\n const dx = bex - ax, dy = bey - ay;\n const len2 = dx * dx + dy * dy;\n const t = len2 > 0 ? Math.max(0, Math.min(1, ((px - ax) * dx + (py - ay) * dy) / len2)) : 0;\n const nx = ax + t * dx, ny = ay + t * dy;\n const dist = (px - nx) ** 2 + (py - ny) ** 2;\n if (dist < bestDist) { bestDist = dist; bx = nx; by = ny; }\n }\n return { x: bx, y: by };\n}\n\nfunction clampToFloor(\n x: number, y: number,\n w: number, h: number,\n area: FloorArea,\n): { x: number; y: number } {\n // Use a square hitbox of side = min(w, h) centered on the element.\n // Custom shapes (e.g. SVG paths) rarely fill their full bounding box,\n // so this avoids over-constraining them to the floor bounds.\n const s = Math.min(w, h);\n const hs = s / 2;\n const cx = x + w / 2;\n const cy = y + h / 2;\n\n if (area.shape === 'rect') {\n const ax = area.x ?? 0;\n const ay = area.y ?? 0;\n const aw = area.width ?? 0;\n const ah = area.height ?? 0;\n const ncx = aw >= s ? Math.max(ax + hs, Math.min(ax + aw - hs, cx)) : ax + aw / 2;\n const ncy = ah >= s ? Math.max(ay + hs, Math.min(ay + ah - hs, cy)) : ay + ah / 2;\n return { x: ncx - w / 2, y: ncy - h / 2 };\n }\n if (area.shape === 'polygon') {\n const pts = area.points ?? [];\n if (pts.length < 3) return { x, y };\n if (pointInPolygon(cx, cy, pts)) return { x, y };\n const clamped = clampPointToPolygon(cx, cy, pts);\n return { x: clamped.x - w / 2, y: clamped.y - h / 2 };\n }\n return { x, y };\n}\n\nfunction createDefaultMap(): VenueMap {\n return {\n id: genId(),\n name: 'Nuevo mapa',\n floors: [\n {\n id: genId(),\n name: 'Planta 1',\n order: 0,\n area: { shape: 'rect', x: 60, y: 60, width: 600, height: 400 },\n wallNodes: [],\n walls: [],\n elements: [],\n },\n ],\n };\n}\n\nconst EMPTY_DOMAIN_CONFIG: DomainConfig = { id: '__empty__', name: '', elementTypes: [] };\n\nfunction updateFloor(map: VenueMap, updatedFloor: Floor): VenueMap {\n return {\n ...map,\n floors: map.floors.map(f => (f.id === updatedFloor.id ? updatedFloor : f)),\n };\n}\n\nfunction rectToPolygon(area: FloorArea): FloorArea {\n const ax = area.x ?? 0;\n const ay = area.y ?? 0;\n const aw = area.width ?? 400;\n const ah = area.height ?? 300;\n return {\n shape: 'polygon',\n points: [\n [ax, ay],\n [ax + aw, ay],\n [ax + aw, ay + ah],\n [ax, ay + ah],\n ],\n };\n}\n\nfunction polygonToRect(area: FloorArea): FloorArea {\n const pts = area.points ?? [];\n if (pts.length === 0) return { shape: 'rect', x: 60, y: 60, width: 400, height: 300 };\n const xs = pts.map(p => p[0]);\n const ys = pts.map(p => p[1]);\n const minX = Math.min(...xs);\n const minY = Math.min(...ys);\n const maxX = Math.max(...xs);\n const maxY = Math.max(...ys);\n return {\n shape: 'rect',\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function VenueMapEditor({\n domainConfig = EMPTY_DOMAIN_CONFIG,\n initialMap,\n onChange,\n width = '100%',\n height = '600px',\n gridSize = 20,\n showGrid: showGridProp = true,\n snapToGrid: snapEnabled = false,\n readOnly = false,\n fixed = false,\n elementStatus,\n onElementClick,\n onElementTypeClick,\n}: VenueMapEditorProps) {\n const initialMapRef = useRef<VenueMap>(initialMap ?? createDefaultMap());\n\n const { map, canUndo, canRedo, push, replace, undo, redo } = useHistory(\n initialMapRef.current,\n );\n const { selectedIds, select, selectSet, clear: clearSelection } = useSelection();\n\n const [activeFloorId, setActiveFloorId] = useState<string>(\n () => initialMapRef.current.floors[0]?.id ?? '',\n );\n const [tool, setTool] = useState<ToolMode>('SELECT');\n const [showGrid, setShowGrid] = useState(showGridProp);\n const [zoom, setZoom] = useState(1);\n const [activePlaceTypeId, setActivePlaceTypeId] = useState<string | null>(null);\n\n const zoomByRef = useRef<(factor: number) => void>(() => undefined);\n const resetViewRef = useRef<() => void>(() => undefined);\n const importInputRef = useRef<HTMLInputElement>(null);\n const libraryInputRef = useRef<HTMLInputElement>(null);\n\n // ── elementTypeDefs: base config + library types in the map ─────────────\n const buildTypeDefs = useCallback(() => {\n const m = new Map(domainConfig.elementTypes.map(t => [t.id, t]));\n const libs = map.libraries ?? {};\n for (const group of Object.values(libs)) {\n for (const t of group.objects) {\n if (!m.has(t.id)) m.set(t.id, t); // base config wins on ID collision\n }\n }\n return m;\n }, [domainConfig, map.libraries]);\n\n const elementTypeDefs = useRef(buildTypeDefs());\n useEffect(() => {\n elementTypeDefs.current = buildTypeDefs();\n }, [buildTypeDefs]);\n\n // ── Palette groups: base group + imported library groups ─────────────────\n const paletteGroups = useMemo<PaletteGroup[]>(() => {\n const groups: PaletteGroup[] = [];\n // Only include the built-in group when it has at least one type\n if (domainConfig.elementTypes.length > 0) {\n groups.push({ id: domainConfig.id, name: domainConfig.name, types: domainConfig.elementTypes, isBase: true });\n }\n const libs = map.libraries ?? {};\n for (const [gid, group] of Object.entries(libs)) {\n groups.push({ id: gid, name: group.name, types: group.objects, isBase: false });\n }\n return groups;\n }, [domainConfig, map.libraries]);\n\n // Auto-select first available element type when nothing is selected\n useEffect(() => {\n if (activePlaceTypeId) return;\n const firstType = paletteGroups[0]?.types[0];\n if (firstType) setActivePlaceTypeId(firstType.id);\n }, [paletteGroups, activePlaceTypeId]);\n\n // ── Controlled map sync (feedback-loop-safe) ─────────────────────────────\n // Track the last map we emitted so we can distinguish \"external\" prop changes\n // from echoes of our own onChange calls. Without this, storing onChange output\n // in parent state and passing it back as initialMap would cause an infinite loop.\n const lastEmittedMap = useRef<VenueMap | undefined>(undefined);\n const prevInitial = useRef(initialMap);\n\n useEffect(() => {\n lastEmittedMap.current = map;\n onChange?.(map);\n }, [map, onChange]);\n\n useEffect(() => {\n if (!initialMap) return;\n if (initialMap === prevInitial.current) return; // same reference, nothing to do\n prevInitial.current = initialMap;\n if (initialMap === lastEmittedMap.current) return; // echo of our own onChange, skip\n push(initialMap);\n setActiveFloorId(initialMap.floors[0]?.id ?? '');\n }, [initialMap, push]);\n\n const activeFloor = map.floors.find(f => f.id === activeFloorId) ?? map.floors[0];\n\n const replaceFloor = useCallback(\n (floor: Floor) => replace(updateFloor(map, floor)),\n [map, replace],\n );\n\n const pushFloor = useCallback(\n (floor: Floor) => push(updateFloor(map, floor)),\n [map, push],\n );\n\n // ── Area resize (handle drag) ────────────────────────────────────────────\n const handleAreaResize = useCallback(\n (updatedFloor: Floor) => replaceFloor(updatedFloor),\n [replaceFloor],\n );\n\n // ── Area resize commit (push to history) ─────────────────────────────────\n const handleAreaResizeCommit = useCallback(\n (updatedFloor: Floor) => pushFloor(updatedFloor),\n [pushFloor],\n );\n\n // ── Area move (body drag) ────────────────────────────────────────────────\n const handleAreaMove = useCallback(\n (dx: number, dy: number) => {\n if (!activeFloor) return;\n const area = activeFloor.area;\n const newArea: FloorArea = area.shape === 'polygon'\n ? { ...area, points: (area.points ?? []).map(([x, y]) => [x + dx, y + dy] as [number, number]) }\n : { ...area, x: (area.x ?? 0) + dx, y: (area.y ?? 0) + dy };\n replaceFloor({\n ...activeFloor,\n area: newArea,\n wallNodes: activeFloor.wallNodes.map(n => ({ ...n, x: n.x + dx, y: n.y + dy })),\n elements: activeFloor.elements.map(el => ({ ...el, x: el.x + dx, y: el.y + dy })),\n });\n },\n [activeFloor, replaceFloor],\n );\n\n // ── Area shape toggle ────────────────────────────────────────────────────\n const handleToggleAreaShape = useCallback(() => {\n if (!activeFloor) return;\n const { area } = activeFloor;\n const newArea: FloorArea = area.shape === 'polygon'\n ? polygonToRect(area)\n : rectToPolygon(area);\n pushFloor({ ...activeFloor, area: newArea });\n }, [activeFloor, pushFloor]);\n\n // ── Floor operations ─────────────────────────────────────────────────────\n\n const handleAddFloor = useCallback(() => {\n const maxOrder = map.floors.reduce((m, f) => Math.max(m, f.order), -1);\n const newFloor: Floor = {\n id: genId(),\n name: `Planta ${map.floors.length + 1}`,\n order: maxOrder + 1,\n area: { shape: 'rect', x: 60, y: 60, width: 600, height: 400 },\n wallNodes: [],\n walls: [],\n elements: [],\n };\n const newMap: VenueMap = { ...map, floors: [...map.floors, newFloor] };\n push(newMap);\n setActiveFloorId(newFloor.id);\n }, [map, push]);\n\n const handleRenameFloor = useCallback(\n (id: string, name: string) => {\n const floor = map.floors.find(f => f.id === id);\n if (!floor) return;\n push(updateFloor(map, { ...floor, name }));\n },\n [map, push],\n );\n\n const handleDeleteFloor = useCallback(\n (id: string) => {\n if (map.floors.length <= 1) return;\n const remaining = map.floors.filter(f => f.id !== id);\n const newMap: VenueMap = { ...map, floors: remaining };\n push(newMap);\n if (activeFloorId === id) {\n setActiveFloorId(remaining[0]?.id ?? '');\n }\n },\n [map, push, activeFloorId],\n );\n\n const handleReorderFloor = useCallback(\n (id: string, direction: 'left' | 'right') => {\n const sorted = map.floors.slice().sort((a, b) => a.order - b.order);\n const idx = sorted.findIndex(f => f.id === id);\n if (idx < 0) return;\n const swapIdx = direction === 'left' ? idx - 1 : idx + 1;\n if (swapIdx < 0 || swapIdx >= sorted.length) return;\n const a = sorted[idx];\n const b = sorted[swapIdx];\n const updatedFloors = map.floors.map(f => {\n if (f.id === a.id) return { ...f, order: b.order };\n if (f.id === b.id) return { ...f, order: a.order };\n return f;\n });\n push({ ...map, floors: updatedFloors });\n },\n [map, push],\n );\n\n // ── Export / Import ──────────────────────────────────────────────────────\n\n const handleExportMap = useCallback(() => {\n const blob = new Blob([JSON.stringify(map, null, 2)], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${map.name || 'mapa'}.json`;\n a.click();\n URL.revokeObjectURL(url);\n }, [map]);\n\n const handleImportMap = useCallback(\n (file: File) => {\n const reader = new FileReader();\n reader.onload = e => {\n try {\n const parsed = JSON.parse(e.target?.result as string) as VenueMap;\n push(parsed);\n setActiveFloorId(parsed.floors[0]?.id ?? '');\n } catch {\n // ignore parse errors\n }\n };\n reader.readAsText(file);\n },\n [push],\n );\n\n const handleLoadLibrary = useCallback(\n (file: File) => {\n const reader = new FileReader();\n reader.onload = e => {\n try {\n const parsed = JSON.parse(e.target?.result as string) as ElementLibrary;\n // Merge into map.libraries (imported groups extend, not replace, existing ones)\n const merged: ElementLibrary = { ...(map.libraries ?? {}), ...parsed };\n push({ ...map, libraries: merged });\n } catch {\n // ignore parse errors\n }\n };\n reader.readAsText(file);\n },\n [map, push],\n );\n\n const handleRemoveLibraryGroup = useCallback(\n (groupId: string) => {\n const libs = { ...(map.libraries ?? {}) };\n delete libs[groupId];\n push({ ...map, libraries: Object.keys(libs).length > 0 ? libs : undefined });\n },\n [map, push],\n );\n\n // ── Wall operations ──────────────────────────────────────────────────────\n\n const DEFAULT_WALL_THICKNESS = 8;\n\n const handleAddWall = useCallback(\n (x1: number, y1: number, x2: number, y2: number,\n snapStartId: string | null, snapEndId: string | null) => {\n if (!activeFloor) return;\n const nodes: WallNode[] = [...activeFloor.wallNodes];\n\n let nodeAId: string;\n if (snapStartId) {\n nodeAId = snapStartId;\n } else {\n const n: WallNode = { id: genId(), x: x1, y: y1 };\n nodes.push(n);\n nodeAId = n.id;\n }\n\n let nodeBId: string;\n if (snapEndId) {\n nodeBId = snapEndId;\n } else {\n const n: WallNode = { id: genId(), x: x2, y: y2 };\n nodes.push(n);\n nodeBId = n.id;\n }\n\n const newWall: Wall = {\n id: genId(),\n nodeAId,\n nodeBId,\n thickness: DEFAULT_WALL_THICKNESS,\n material: 'concrete',\n };\n\n pushFloor({ ...activeFloor, wallNodes: nodes, walls: [...activeFloor.walls, newWall] });\n },\n [activeFloor, pushFloor, DEFAULT_WALL_THICKNESS],\n );\n\n const handleDeleteWall = useCallback(\n (wallId: string) => {\n if (!activeFloor) return;\n const remainingWalls = activeFloor.walls.filter(w => w.id !== wallId);\n const usedNodeIds = new Set(remainingWalls.flatMap(w => [w.nodeAId, w.nodeBId]));\n const remainingNodes = activeFloor.wallNodes.filter(n => usedNodeIds.has(n.id));\n pushFloor({ ...activeFloor, walls: remainingWalls, wallNodes: remainingNodes });\n },\n [activeFloor, pushFloor],\n );\n\n // ── Element operations ───────────────────────────────────────────────────\n\n const handleMoveElement = useCallback(\n (id: string, x: number, y: number) => {\n if (!activeFloor) return;\n const el = activeFloor.elements.find(e => e.id === id);\n if (!el) return;\n const { x: cx, y: cy } = clampToFloor(x, y, el.width, el.height, activeFloor.area);\n replaceFloor({\n ...activeFloor,\n elements: activeFloor.elements.map(e => e.id === id ? { ...e, x: cx, y: cy } : e),\n });\n },\n [activeFloor, replaceFloor],\n );\n\n const handleMoveCommit = useCallback(\n (id: string, x: number, y: number) => {\n if (!activeFloor) return;\n const el = activeFloor.elements.find(e => e.id === id);\n if (!el) return;\n const { x: cx, y: cy } = clampToFloor(x, y, el.width, el.height, activeFloor.area);\n pushFloor({\n ...activeFloor,\n elements: activeFloor.elements.map(e => e.id === id ? { ...e, x: cx, y: cy } : e),\n });\n },\n [activeFloor, pushFloor],\n );\n\n const handleResizeElement = useCallback(\n (id: string, x: number, y: number, w: number, h: number) => {\n if (!activeFloor) return;\n replaceFloor({\n ...activeFloor,\n elements: activeFloor.elements.map(el =>\n el.id === id ? { ...el, x, y, width: w, height: h } : el,\n ),\n });\n },\n [activeFloor, replaceFloor],\n );\n\n const handleResizeCommit = useCallback(\n (id: string, x: number, y: number, w: number, h: number) => {\n if (!activeFloor) return;\n pushFloor({\n ...activeFloor,\n elements: activeFloor.elements.map(el =>\n el.id === id ? { ...el, x, y, width: w, height: h } : el,\n ),\n });\n },\n [activeFloor, pushFloor],\n );\n\n const handleRotateElement = useCallback(\n (id: string, rotation: number) => {\n if (!activeFloor) return;\n replaceFloor({\n ...activeFloor,\n elements: activeFloor.elements.map(el =>\n el.id === id ? { ...el, rotation } : el,\n ),\n });\n },\n [activeFloor, replaceFloor],\n );\n\n const handleRotateCommit = useCallback(\n (id: string, rotation: number) => {\n if (!activeFloor) return;\n pushFloor({\n ...activeFloor,\n elements: activeFloor.elements.map(el =>\n el.id === id ? { ...el, rotation } : el,\n ),\n });\n },\n [activeFloor, pushFloor],\n );\n\n const handleDeleteElement = useCallback(\n (id: string) => {\n if (!activeFloor) return;\n clearSelection();\n pushFloor({\n ...activeFloor,\n elements: activeFloor.elements.filter(el => el.id !== id),\n });\n },\n [activeFloor, pushFloor, clearSelection],\n );\n\n const handleDeleteElements = useCallback(\n (ids: string[]) => {\n if (!activeFloor) return;\n const idSet = new Set(ids);\n clearSelection();\n pushFloor({\n ...activeFloor,\n elements: activeFloor.elements.filter(el => !idSet.has(el.id)),\n });\n },\n [activeFloor, pushFloor, clearSelection],\n );\n\n const handleDuplicateElements = useCallback(\n (ids: string[]) => {\n if (!activeFloor) return;\n const idSet = new Set(ids);\n const copies: MapElement[] = activeFloor.elements\n .filter(el => idSet.has(el.id))\n .map(el => ({ ...el, id: genId(), x: el.x + 20, y: el.y + 20 }));\n const newFloor = { ...activeFloor, elements: [...activeFloor.elements, ...copies] };\n pushFloor(newFloor);\n selectSet(copies.map(c => c.id));\n },\n [activeFloor, pushFloor, selectSet],\n );\n\n const handlePlaceElement = useCallback(\n (canvasX: number, canvasY: number) => {\n if (!activeFloor || !activePlaceTypeId) return;\n const typeDef = elementTypeDefs.current.get(activePlaceTypeId);\n if (!typeDef) return;\n\n const { area } = activeFloor;\n if (area.shape === 'rect') {\n const ax = area.x ?? 0, ay = area.y ?? 0;\n const aw = area.width ?? 0, ah = area.height ?? 0;\n if (canvasX < ax || canvasX > ax + aw || canvasY < ay || canvasY > ay + ah) return;\n } else if (area.shape === 'polygon') {\n const pts = area.points ?? [];\n if (pts.length >= 3 && !pointInPolygon(canvasX, canvasY, pts)) return;\n }\n\n const { x, y } = clampToFloor(\n canvasX - typeDef.defaultWidth / 2,\n canvasY - typeDef.defaultHeight / 2,\n typeDef.defaultWidth,\n typeDef.defaultHeight,\n area,\n );\n\n const newEl: MapElement = {\n id: genId(),\n type: activePlaceTypeId,\n x,\n y,\n width: typeDef.defaultWidth,\n height: typeDef.defaultHeight,\n rotation: 0,\n };\n pushFloor({ ...activeFloor, elements: [...activeFloor.elements, newEl] });\n select(newEl.id, false);\n },\n [activeFloor, activePlaceTypeId, pushFloor, select],\n );\n\n const handleChangeLabel = useCallback(\n (id: string, label: string) => {\n if (!activeFloor) return;\n pushFloor({\n ...activeFloor,\n elements: activeFloor.elements.map(el =>\n el.id === id ? { ...el, label } : el,\n ),\n });\n },\n [activeFloor, pushFloor],\n );\n\n const handleChangeGeometry = useCallback(\n (id: string, x: number, y: number, w: number, h: number, r: number) => {\n if (!activeFloor) return;\n pushFloor({\n ...activeFloor,\n elements: activeFloor.elements.map(el =>\n el.id === id ? { ...el, x, y, width: w, height: h, rotation: r } : el,\n ),\n });\n },\n [activeFloor, pushFloor],\n );\n\n // ── Viewer element click (type-specific handler → generic fallback) ─────\n const handleViewerElementClick = useCallback(\n (id: string) => {\n const el = activeFloor?.elements.find(e => e.id === id);\n if (!el) return;\n const typeHandler = onElementTypeClick?.[el.type];\n if (typeHandler) {\n typeHandler(el);\n } else {\n onElementClick?.(el);\n }\n },\n [activeFloor, onElementClick, onElementTypeClick],\n );\n\n const hasViewerHandlers = !!(onElementClick || onElementTypeClick);\n\n // ── Status map ───────────────────────────────────────────────────────────\n const statusMap = useMemo(() => {\n const m = new Map<string, string>();\n (elementStatus ?? []).forEach(s => {\n if (s.status === 'occupied') m.set(s.elementId, '#fca5a5');\n else if (s.status === 'reserved') m.set(s.elementId, '#fde68a');\n else if (s.status === 'disabled') m.set(s.elementId, '#d1d5db');\n });\n return m;\n }, [elementStatus]);\n\n // ── Selected elements ────────────────────────────────────────────────────\n const selectedElements = activeFloor\n ? activeFloor.elements.filter(el => selectedIds.has(el.id))\n : [];\n\n // ── Keyboard shortcuts ───────────────────────────────────────────────────\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const tag = (e.target as HTMLElement).tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA') return;\n\n const ctrl = e.ctrlKey || e.metaKey;\n\n if (ctrl && e.key === 'z') { e.preventDefault(); undo(); return; }\n if (ctrl && (e.key === 'y' || e.key === 'Y')) { e.preventDefault(); redo(); return; }\n if (ctrl && (e.key === 'd' || e.key === 'D')) {\n e.preventDefault();\n if (selectedIds.size > 0) handleDuplicateElements([...selectedIds]);\n return;\n }\n\n if (e.key === 'Delete' || e.key === 'Backspace') {\n if (selectedIds.size > 0) handleDeleteElements([...selectedIds]);\n return;\n }\n\n switch (e.key) {\n case 'v': case 'V': setTool('SELECT'); break;\n case 'h': case 'H': setTool('PAN'); break;\n case 'w': case 'W': setTool('WALL'); break;\n case 'p': case 'P': setTool('PLACE'); break;\n case 'e': case 'E': setTool('ERASE'); break;\n case 'Escape': setTool('SELECT'); break;\n case '+': case '=': zoomByRef.current(1.2); break;\n case '-': case '_': zoomByRef.current(1 / 1.2); break;\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [undo, redo, selectedIds, handleDuplicateElements, handleDeleteElements]);\n\n // ── Fixed / read-only derived state ─────────────────────────────────────\n const effectiveReadOnly = readOnly || fixed;\n const effectiveTool: ToolMode = fixed ? 'PAN' : tool;\n\n // ── Container style ──────────────────────────────────────────────────────\n const containerStyle: CSSProperties = {\n width,\n height,\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n border: '1px solid #e2e8f0',\n borderRadius: '0.5rem',\n background: '#fff',\n fontFamily: 'system-ui, sans-serif',\n };\n\n const activeAreaShape: AreaShape | undefined = activeFloor?.area.shape;\n\n return (\n <div style={containerStyle}>\n {/* Hidden file inputs */}\n <input\n ref={importInputRef}\n type=\"file\"\n accept=\".json\"\n className=\"hidden\"\n onChange={e => {\n const f = e.target.files?.[0];\n if (f) handleImportMap(f);\n e.target.value = '';\n }}\n />\n <input\n ref={libraryInputRef}\n type=\"file\"\n accept=\".json\"\n className=\"hidden\"\n onChange={e => {\n const f = e.target.files?.[0];\n if (f) handleLoadLibrary(f);\n e.target.value = '';\n }}\n />\n\n {/* Toolbar */}\n {!effectiveReadOnly && (\n <Toolbar\n tool={tool}\n onToolChange={t => { setTool(t); if (t !== 'PLACE') clearSelection(); }}\n showGrid={showGrid}\n onToggleGrid={() => setShowGrid(g => !g)}\n zoom={zoom}\n onZoomIn={() => zoomByRef.current(1.2)}\n onZoomOut={() => zoomByRef.current(1 / 1.2)}\n onResetView={() => resetViewRef.current()}\n canUndo={canUndo}\n canRedo={canRedo}\n onUndo={undo}\n onRedo={redo}\n paletteGroups={paletteGroups}\n activePlaceTypeId={activePlaceTypeId}\n onActivePlaceTypeChange={setActivePlaceTypeId}\n areaShape={activeAreaShape}\n onToggleAreaShape={handleToggleAreaShape}\n onExportMap={handleExportMap}\n onImportMap={() => importInputRef.current?.click()}\n onLoadLibrary={() => libraryInputRef.current?.click()}\n onRemoveLibraryGroup={handleRemoveLibraryGroup}\n />\n )}\n\n {/* Floor tabs */}\n <FloorTabs\n floors={map.floors}\n activeFloorId={activeFloorId}\n readOnly={effectiveReadOnly}\n onSelect={setActiveFloorId}\n onAdd={handleAddFloor}\n onRename={handleRenameFloor}\n onDelete={handleDeleteFloor}\n onReorder={handleReorderFloor}\n />\n\n {/* Canvas + Properties panel */}\n <div className=\"flex flex-1 min-h-0\">\n <div className=\"flex-1 min-w-0 relative\">\n {activeFloor && (\n <EditorCanvas\n key={activeFloor.id}\n floor={activeFloor}\n tool={effectiveTool}\n gridSize={gridSize}\n showGrid={showGrid}\n readOnly={effectiveReadOnly}\n snapEnabled={snapEnabled}\n elementTypeDefs={elementTypeDefs.current}\n selectedIds={selectedIds}\n statusMap={statusMap}\n onAreaResize={handleAreaResize}\n onAreaMove={handleAreaMove}\n onAreaResizeCommit={handleAreaResizeCommit}\n onSelectElement={select}\n onSelectSet={selectSet}\n onClearSelection={clearSelection}\n onMoveElement={handleMoveElement}\n onMoveCommit={handleMoveCommit}\n onResizeElement={handleResizeElement}\n onResizeCommit={handleResizeCommit}\n onRotateElement={handleRotateElement}\n onRotateCommit={handleRotateCommit}\n onDeleteElement={handleDeleteElement}\n onPlaceElement={handlePlaceElement}\n onAddWall={handleAddWall}\n onDeleteWall={handleDeleteWall}\n onViewerElementClick={hasViewerHandlers ? handleViewerElementClick : undefined}\n onZoomChange={setZoom}\n onRegisterZoomBy={fn => { zoomByRef.current = fn; }}\n onRegisterResetView={fn => { resetViewRef.current = fn; }}\n />\n )}\n </div>\n\n {/* Properties panel */}\n {!effectiveReadOnly && selectedElements.length > 0 && (\n <PropertiesPanel\n elements={selectedElements}\n typeDefs={elementTypeDefs.current}\n onChangeLabel={handleChangeLabel}\n onChangeGeometry={handleChangeGeometry}\n onDelete={handleDeleteElements}\n onDuplicate={handleDuplicateElements}\n />\n )}\n </div>\n </div>\n );\n}\n","import { VenueMapEditor } from './VenueMapEditor';\nimport type { VenueMapViewerProps } from './types';\n\nexport function VenueMapViewer({ elementStatus, onElementClick, ...rest }: VenueMapViewerProps) {\n return (\n <VenueMapEditor\n {...rest}\n fixed={true}\n elementStatus={elementStatus}\n onElementClick={onElementClick}\n />\n );\n}\n"]}