veo-sdk 0.6.3 → 0.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugins/builder/block-drop-target.ts","../src/plugins/builder/bridge-protocol.ts","../src/plugins/builder/builder-chrome.ts","../src/plugins/builder/builder-panel.ts","../src/plugins/builder/design-manipulator.ts","../src/plugins/builder/interactive-elements.ts","../src/plugins/builder/element-picker.ts","../src/plugins/builder/builder-mode.ts","../src/plugins/builder/builder-session.ts"],"names":["el","MIN_W","MIN_H","clamp","blocksRect","rect","EDGE"],"mappings":";;;;AAsBO,IAAM,cAAA,GAAiB;AA8CvB,SAAS,sBAAsB,OAAA,EAA+C;AACnF,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,MAAA,EAAO,GAAI,OAAA;AACpC,EAAA,MAAM,MAAM,IAAA,CAAK,aAAA;AACjB,EAAA,IAAI,IAAA,GAA2B,IAAA;AAC/B,EAAA,IAAI,IAAA,GAAwB,IAAA;AAE5B,EAAA,MAAM,YAAY,MAChB,IAAA,CAAK,UAAA,EAAY,aAAA,CAA2B,oBAAoB,CAAA,IAAK,IAAA;AAGvE,EAAA,MAAM,gBAAgB,CAAC,SAAA,KACrB,MAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,CAAE,MAAA;AAAA,IAC7B,CAACA,GAAAA,KAA0BA,GAAAA,YAAc,WAAA,IAAeA,GAAAA,CAAG,QAAQ,MAAA,KAAW;AAAA,GAChF;AAEF,EAAA,MAAM,WAAW,MAAY;AAC3B,IAAA,IAAA,EAAM,MAAA,EAAO;AACb,IAAA,IAAA,GAAO,IAAA;AACP,IAAA,IAAA,GAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,EAAA,KAAuB;AACvC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAA,GAAO,GAAA,CAAI,cAAc,KAAK,CAAA;AAE9B,MAAA,IAAA,CAAK,MAAM,OAAA,GACT,oJAAA;AAEF,MAAA,IAAA,CAAK,UAAA,EAAY,YAAY,IAAI,CAAA;AAAA,IACnC;AACA,IAAA,IAAA,CAAK,MAAM,IAAA,GAAO,CAAA,EAAG,EAAA,CAAG,IAAA,CAAK,OAAO,CAAC,CAAA,EAAA,CAAA;AACrC,IAAA,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,GAAG,EAAA,CAAG,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AACpD,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,EAAA,CAAG,IAAI,GAAG,CAAA,EAAA,CAAA;AAAA,EAChC,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAA8B;AACjD,IAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,EAAc,KAAA;AAClC,IAAA,OAAO,CAAC,CAAC,KAAA,IAAS,KAAA,CAAM,KAAK,KAAK,CAAA,CAAE,SAAS,cAAc,CAAA;AAAA,EAC7D,CAAA;AAGA,EAAA,MAAM,OAAA,GAAU,EAAA;AAGhB,EAAA,MAAM,MAAA,GAAS,CAAC,OAAA,KAAqC;AACnD,IAAA,MAAM,YAAY,SAAA,EAAU;AAC5B,IAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AACvB,IAAA,MAAM,IAAA,GAAO,UAAU,qBAAA,EAAsB;AAC7C,IAAA,MAAM,IAAA,GAAO,cAAc,SAAS,CAAA;AACpC,IAAA,IAAI,WAAA,GAA6B,IAAA;AACjC,IAAA,IAAI,CAAA,GAAI,KAAK,MAAA,KAAW,CAAA,GAAI,KAAK,GAAA,GAAM,IAAA,CAAK,SAAS,CAAA,GAAI,CAAA;AACzD,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,CAAA,GAAI,IAAI,qBAAA,EAAsB;AACpC,MAAA,IAAI,OAAA,GAAU,CAAA,CAAE,GAAA,GAAM,CAAA,CAAE,SAAS,CAAA,EAAG;AAClC,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA;AACrC,QAAA,WAAA,GAAc,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,GAAI,GAAA,GAAM,IAAA;AAC3C,QAAA,CAAA,GAAI,CAAA,CAAE,GAAA;AACN,QAAA;AAAA,MACF;AACA,MAAA,CAAA,GAAI,CAAA,CAAE,MAAA;AAAA,IACR;AACA,IAAA,OAAO,EAAE,WAAA,EAAa,CAAA,EAAG,IAAA,EAAK;AAAA,EAChC,CAAA;AAGA,EAAA,MAAM,cAAc,CAAC,CAAA,EAAW,GAAW,IAAA,KACzC,CAAA,IAAK,KAAK,IAAA,GAAO,OAAA,IACjB,KAAK,IAAA,CAAK,KAAA,GAAQ,WAClB,CAAA,IAAK,IAAA,CAAK,MAAM,OAAA,IAChB,CAAA,IAAK,KAAK,MAAA,GAAS,OAAA;AAErB,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,EAAW,CAAA,KAAuB;AACjD,IAAA,MAAM,EAAA,GAAK,OAAO,CAAC,CAAA;AACnB,IAAA,IAAI,CAAC,MAAM,CAAC,WAAA,CAAY,GAAG,CAAA,EAAG,EAAA,CAAG,IAAI,CAAA,EAAG;AACtC,MAAA,QAAA,EAAS;AACT,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAA,GAAO,EAAA;AACP,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,EAAW,CAAA,KAAqD;AAC9E,IAAA,MAAM,EAAA,GAAK,OAAO,CAAC,CAAA;AACnB,IAAA,QAAA,EAAS;AACT,IAAA,IAAI,CAAC,MAAM,CAAC,WAAA,CAAY,GAAG,CAAA,EAAG,EAAA,CAAG,IAAI,CAAA,EAAG,OAAO,IAAA;AAC/C,IAAA,OAAO,EAAE,WAAA,EAAa,EAAA,CAAG,WAAA,EAAY;AAAA,EACvC,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,KAA2B;AAC7C,IAAA,IAAI,CAAC,WAAA,CAAY,KAAK,CAAA,EAAG;AACzB,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA;AAC/B,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,IAAI,KAAA,CAAM,YAAA,EAAc,KAAA,CAAM,YAAA,CAAa,UAAA,GAAa,MAAA;AACxD,IAAA,IAAA,GAAO,EAAA;AACP,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAA2B;AAC9C,IAAA,IAAI,CAAC,WAAA,CAAY,KAAK,CAAA,EAAG;AACzB,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,EAAc,OAAA,CAAQ,cAAc,CAAA,IAAK,EAAA;AACjE,IAAA,MAAM,EAAA,GAAK,IAAA,IAAQ,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA;AACvC,IAAA,QAAA,EAAS;AACT,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,EAAA,EAAI;AACvB,IAAA,MAAA,CAAO,EAAE,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,EAAA,CAAG,aAAa,CAAA;AAAA,EAC9D,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAA2B;AAG9C,IAAA,MAAM,KAAK,KAAA,CAAM,aAAA;AACjB,IAAA,IAAI,cAAc,IAAA,KAAS,EAAA,KAAO,QAAQ,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA,CAAA,EAAI;AAC9D,IAAA,QAAA,EAAS;AAAA,EACX,CAAA;AAEA,EAAA,IAAA,CAAK,gBAAA,CAAiB,YAAY,UAAU,CAAA;AAC5C,EAAA,IAAA,CAAK,gBAAA,CAAiB,QAAQ,WAAW,CAAA;AACzC,EAAA,IAAA,CAAK,gBAAA,CAAiB,aAAa,WAAW,CAAA;AAE9C,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA,EAAa,QAAA;AAAA,IACb,MAAA,GAAe;AACb,MAAA,IAAA,CAAK,mBAAA,CAAoB,YAAY,UAAU,CAAA;AAC/C,MAAA,IAAA,CAAK,mBAAA,CAAoB,QAAQ,WAAW,CAAA;AAC5C,MAAA,IAAA,CAAK,mBAAA,CAAoB,aAAa,WAAW,CAAA;AACjD,MAAA,QAAA,EAAS;AAAA,IACX;AAAA,GACF;AACF;;;ACzLO,IAAM,kBAAA,GAAqB,aAAA;;;ACK3B,IAAM,eAAA,GAAkB,EAAA;AACxB,IAAM,cAAA,GAAiB,GAAA;AA0B9B,IAAM,KAAA,GAAQ;AAAA,EACZ,IAAA,EAAM,wHAAA;AAAA,EACN,OAAA,EACE,yUAAA;AAAA,EACF,MAAA,EACE,sIAAA;AAAA,EACF,GAAA,EAAK,iYAAA;AAAA,EACL,GAAA,EAAK,mVAAA;AAAA,EACL,WAAA,EACE,uFAAA;AAAA,EACF,SAAA,EACE,uFAAA;AAAA,EACF,IAAA,EAAM,mFAAA;AAAA,EACN,MAAA,EACE,6TAAA;AAAA,EACF,IAAA,EAAM,2SAAA;AAAA,EACN,KAAA,EACE,0dAAA;AAAA,EACF,MAAA,EACE,iPAAA;AAAA,EACF,OAAA,EACE;AACJ,CAAA;AAEA,SAAS,GAAA,CAAI,IAAA,EAA0B,IAAA,GAAO,EAAA,EAAY;AACxD,EAAA,OACE,kDAAkD,IAAI,CAAA,UAAA,EAAa,IAAI,CAAA,8FAAA,EACI,KAAA,CAAM,IAAI,CAAC,CAAA,MAAA,CAAA;AAE1F;AAGA,SAAS,UAAU,GAAA,EAA4B;AAC7C,EAAA,IAAI,CAAC,KAAK,OAAO,EAAA;AACjB,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,GAAG,CAAA;AACtB,EAAA,IAAI,OAAO,KAAA,CAAM,CAAA,CAAE,OAAA,EAAS,GAAG,OAAO,EAAA;AACtC,EAAA,OAAO,CAAA,CAAE,kBAAA,CAAmB,IAAA,EAAM,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,OAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA;AACvF;AAEA,SAAS,EAAA,CACP,GAAA,EACA,SAAA,EACA,IAAA,EAC0B;AAC1B,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,EAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,EAAA,IAAI,IAAA,KAAS,MAAA,EAAW,IAAA,CAAK,SAAA,GAAY,IAAA;AACzC,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,UAAA,CAAW,IAAA,EAA0B,KAAA,EAAe,SAAA,GAAY,EAAA,EAAuB;AAC9F,EAAA,MAAM,CAAA,GAAI,EAAA,CAAG,QAAA,EAAU,CAAA,YAAA,EAAe,SAAS,GAAG,IAAA,EAAK,EAAG,GAAA,CAAI,IAAI,CAAC,CAAA;AACnE,EAAA,CAAA,CAAE,IAAA,GAAO,QAAA;AACT,EAAA,CAAA,CAAE,KAAA,GAAQ,KAAA;AACV,EAAA,CAAA,CAAE,YAAA,CAAa,cAAc,KAAK,CAAA;AAClC,EAAA,OAAO,CAAA;AACT;AAGO,SAAS,oBAAoB,IAAA,EAAiD;AACnF,EAAA,IAAI,CAAC,SAAA,EAAU,IAAK,CAAC,aAAY,EAAG;AAClC,IAAA,OAAO;AAAA,MACL,UAAU,MAAM;AAAA,MAAC,CAAA;AAAA,MACjB,QAAQ,MAAM,CAAA;AAAA,MACd,MAAM,MAAM,KAAA;AAAA,MACZ,YAAY,MAAM;AAAA,MAAC,CAAA;AAAA,MACnB,WAAW,MAAM;AAAA,MAAC,CAAA;AAAA,MAClB,gBAAgB,MAAM;AAAA,MAAC,CAAA;AAAA,MACvB,UAAU,MAAM;AAAA,MAAC;AAAA,KACnB;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,EAAA,IAAA,CAAK,YAAA,CAAa,2BAA2B,EAAE,CAAA;AAC/C,EAAA,IAAA,CAAK,YAAA,CAAa,mBAAmB,EAAE,CAAA;AACvC,EAAA,MAAM,SAAS,IAAA,CAAK,YAAA,CAAa,EAAE,IAAA,EAAM,QAAQ,CAAA;AACjD,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,WAAA,GAAc,UAAA;AAEpB,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,EAAO,YAAY,CAAA;AAGnC,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,KAAA,EAAO,QAAQ,CAAA;AACjC,EAAA,MAAM,QAAQ,EAAA,CAAG,KAAA,EAAO,gBAAgB,GAAA,CAAI,MAAA,EAAQ,EAAE,CAAC,CAAA;AACvD,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,KAAA,EAAO,aAAa,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,EAAA,CAAG,MAAA,EAAQ,eAAe,CAAA;AAC3C,EAAA,QAAA,CAAS,MAAA,GAAS,IAAA;AAClB,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,MAAA,EAAQ,YAAY,CAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,GAAG,KAAA,EAAO,YAAA,EAAc,GAAG,GAAA,CAAI,SAAA,EAAW,EAAE,CAAC,CAAA,aAAA,CAAe,CAAA;AAC1E,EAAC,KAAA,CAAM,aAAA,CAAc,MAAM,CAAA,CAAkB,cAAc,IAAA,CAAK,QAAA;AAChE,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,EAAO,aAAa,CAAA;AACpC,EAAA,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,KAAK,KAAK,CAAA;AAE/C,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,EAAO,cAAc,CAAA;AACtC,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,QAAA,EAAU,sBAAsB,CAAA;AAC3D,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,KAAA,EAAO,mBAAmB,CAAA;AACvD,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,KAAA,EAAO,cAAc,CAAA;AAChD,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,QAAA,EAAU,aAAA,EAAe,OAAO,CAAA;AAChD,EAAA,IAAA,CAAK,IAAA,GAAO,QAAA;AACZ,EAAA,MAAM,SAAA,GAAY,EAAA,CAAG,KAAA,EAAO,aAAa,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,QAAA,EAAU,kBAAA,EAAoB,sBAAsB,CAAA;AACpE,EAAA,IAAA,CAAK,IAAA,GAAO,QAAA;AACZ,EAAA,MAAM,WAAW,EAAA,CAAG,QAAA,EAAU,oBAAoB,GAAA,CAAI,aAAA,EAAe,EAAE,CAAC,CAAA;AACxE,EAAA,QAAA,CAAS,IAAA,GAAO,QAAA;AAChB,EAAA,QAAA,CAAS,KAAA,GAAQ,6BAAA;AACjB,EAAA,QAAA,CAAS,YAAA,CAAa,cAAc,6BAA0B,CAAA;AAC9D,EAAA,MAAM,QAAA,GAAW,EAAA,CAAG,KAAA,EAAO,aAAa,CAAA;AACxC,EAAA,MAAM,QAAA,GAAW,EAAA,CAAG,QAAA,EAAU,kBAAA,EAAoB,iBAAiB,CAAA;AACnE,EAAA,QAAA,CAAS,IAAA,GAAO,QAAA;AAChB,EAAA,QAAA,CAAS,OAAO,QAAQ,CAAA;AACxB,EAAA,QAAA,CAAS,MAAA,GAAS,IAAA;AAClB,EAAA,SAAA,CAAU,MAAA,CAAO,IAAA,EAAM,QAAA,EAAU,QAAQ,CAAA;AACzC,EAAA,KAAA,CAAM,MAAA,CAAO,SAAS,SAAA,EAAW,OAAA,EAAS,GAAG,MAAA,EAAQ,aAAa,CAAA,EAAG,IAAA,EAAM,SAAS,CAAA;AACpF,EAAA,MAAA,CAAO,MAAA,CAAO,MAAM,KAAK,CAAA;AAGzB,EAAA,MAAM,QAAA,GAAW,EAAA,CAAG,KAAA,EAAO,WAAW,CAAA;AACtC,EAAA,MAAM,SAAA,GAAY,EAAA,CAAG,KAAA,EAAO,gBAAgB,CAAA;AAC5C,EAAA,QAAA,CAAS,OAAO,SAAS,CAAA;AAEzB,EAAA,MAAM,UAAA,GAAa,EAAA,CAAG,QAAA,EAAU,kBAAkB,CAAA;AAClD,EAAA,UAAA,CAAW,IAAA,GAAO,QAAA;AAElB,EAAA,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,QAAA,EAAU,UAAU,CAAA;AAGxC,EAAA,MAAM,WAAA,GAAc,EAAA,CAAG,KAAA,EAAO,kBAAkB,CAAA;AAChD,EAAA,MAAM,YAAA,GAAe,EAAA;AAAA,IACnB,MAAA;AAAA,IACA,mBAAA;AAAA,IACA,CAAA,EAAG,GAAA,CAAI,KAAA,EAAO,EAAE,CAAC,CAAA,qCAAA;AAAA,GACnB;AACA,EAAA,MAAM,WAAA,GAAc,EAAA,CAAG,QAAA,EAAU,kBAAA,EAAoB,OAAO,CAAA;AAC5D,EAAA,WAAA,CAAY,IAAA,GAAO,QAAA;AACnB,EAAA,WAAA,CAAY,MAAA,CAAO,cAAc,WAAW,CAAA;AAC5C,EAAA,WAAA,CAAY,MAAA,GAAS,IAAA;AAErB,EAAA,MAAA,CAAO,MAAA,CAAO,KAAA,EAAO,IAAA,EAAM,WAAW,CAAA;AACtC,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAG9B,EAAA,MAAM,OAAO,QAAA,CAAS,eAAA;AACtB,EAAA,MAAM,aAAA,GAAgB,KAAK,KAAA,CAAM,SAAA;AACjC,EAAA,MAAM,gBAAA,GAAmB,KAAK,KAAA,CAAM,YAAA;AACpC,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,IAAA,GAAmB,KAAA;AACvB,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,QAAA,GAAyC,IAAA;AAC7C,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,MAAM,MAAA,GAAS,MAAc,eAAA,IAAmB,SAAA,IAAa,UAAU,CAAA,GAAI,cAAA,CAAA;AAC3E,EAAA,MAAM,cAAc,MAAY;AAC9B,IAAA,MAAM,CAAA,GAAI,SAAA,IAAa,QAAA,GAAW,CAAA,GAAI,MAAA,EAAO;AAC7C,IAAA,IAAA,CAAK,MAAM,SAAA,GAAY,IAAA,KAAS,KAAA,GAAQ,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA,GAAO,aAAA;AACnD,IAAA,IAAA,CAAK,MAAM,YAAA,GAAe,IAAA,KAAS,QAAA,GAAW,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA,GAAO,gBAAA;AACzD,IAAA,IAAA,CAAK,MAAM,WAAA,CAAY,gBAAA,EAAkB,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAA,CAAI,CAAA;AACxD,IAAA,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,WAAA,EAAa,IAAA,KAAS,QAAQ,CAAA;AACpD,IAAA,QAAA,CAAS,SAAS,SAAA,IAAa,OAAA;AAC/B,IAAA,UAAA,CAAW,MAAA,GAAS,OAAA;AAEpB,IAAA,OAAA,CAAQ,MAAA,GAAS,OAAA;AACjB,IAAA,SAAA,CAAU,MAAA,GAAS,OAAA;AACnB,IAAA,SAAA,CAAU,KAAA,GAAQ,UAAU,kBAAA,GAAqB,mBAAA;AACjD,IAAA,MAAM,IAAA,GAAO,IAAA,KAAS,KAAA,GAAQ,WAAA,GAAc,aAAA;AAC5C,IAAA,MAAM,UAAA,GAAa,IAAA,KAAS,KAAA,GAAQ,aAAA,GAAgB,WAAA;AACpD,IAAA,UAAA,CAAW,SAAA,GAAY,CAAA,MAAA,EAAS,SAAA,GAAY,eAAA,GAAkB,eAAe,CAAA,OAAA,EAAU,GAAA;AAAA,MACrF,YAAY,UAAA,GAAa,IAAA;AAAA,MACzB;AAAA,KACD,CAAA,CAAA;AACD,IAAA,OAAA,CAAQ,KAAA,GAAQ,IAAA,KAAS,KAAA,GAAQ,sBAAA,GAAyB,uBAAA;AAC1D,IAAA,OAAA,CAAQ,YAAA,CAAa,YAAA,EAAc,OAAA,CAAQ,KAAK,CAAA;AAChD,IAAA,QAAA,GAAW,CAAC,CAAA;AAAA,EACd,CAAA;AACA,EAAA,MAAM,UAAA,GAAa,CAAC,EAAA,KAAsB;AACxC,IAAA,SAAA,GAAY,EAAA;AACZ,IAAA,IAAA,CAAK,SAAS,EAAA,IAAM,QAAA;AACpB,IAAA,WAAA,CAAY,SAAS,CAAC,EAAA;AACtB,IAAA,WAAA,EAAY;AAAA,EACd,CAAA;AACA,EAAA,MAAM,SAAA,GAAY,CAAC,EAAA,KAAsB;AACvC,IAAA,QAAA,GAAW,EAAA;AACX,IAAA,IAAA,CAAK,SAAS,EAAA,IAAM,SAAA;AACpB,IAAA,WAAA,EAAY;AAAA,EACd,CAAA;AACA,EAAA,UAAA,CAAW,gBAAA,CAAiB,SAAS,MAAM;AACzC,IAAA,SAAA,GAAY,CAAC,SAAA;AACb,IAAA,WAAA,EAAY;AAAA,EACd,CAAC,CAAA;AAGD,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KAA0B,IAAA,CAAK,SAAS,CAAC,CAAA;AACtD,EAAA,OAAA,CAAQ,gBAAA,CAAiB,SAAS,MAAM;AACtC,IAAA,IAAA,GAAO,IAAA,KAAS,QAAQ,QAAA,GAAW,KAAA;AACnC,IAAA,WAAA,EAAY;AACZ,IAAA,GAAA,CAAI,EAAE,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAA;AAAA,EACxC,CAAC,CAAA;AACD,EAAA,SAAA,CAAU,gBAAA,CAAiB,SAAS,MAAM,GAAA,CAAI,EAAE,MAAA,EAAQ,YAAA,EAAc,CAAC,CAAA;AACvE,EAAA,OAAA,CAAQ,gBAAA,CAAiB,SAAS,MAAM,GAAA,CAAI,EAAE,MAAA,EAAQ,SAAA,EAAW,CAAC,CAAA;AAClE,EAAA,WAAA,CAAY,gBAAA,CAAiB,SAAS,MAAM,GAAA,CAAI,EAAE,MAAA,EAAQ,cAAA,EAAgB,CAAC,CAAA;AAC3E,EAAA,IAAA,CAAK,gBAAA,CAAiB,SAAS,MAAM,GAAA,CAAI,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAC,CAAA;AAC5D,EAAA,IAAA,CAAK,gBAAA,CAAiB,OAAA,EAAS,MAAM,GAAA,CAAI,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,CAAC,CAAA;AACzE,EAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACxC,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,QAAA,CAAS,MAAA,GAAS,CAAC,QAAA,CAAS,MAAA;AAAA,EAC9B,CAAC,CAAA;AACD,EAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,MAAM;AACvC,IAAA,QAAA,CAAS,MAAA,GAAS,IAAA;AAClB,IAAA,GAAA,CAAI,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,MAAM,CAAA;AAAA,EACpC,CAAC,CAAA;AACD,EAAA,MAAM,YAAY,MAAY;AAC5B,IAAA,QAAA,CAAS,MAAA,GAAS,IAAA;AAAA,EACpB,CAAA;AACA,EAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,SAAS,CAAA;AAG5C,EAAA,IAAI,OAAA,GAAoC,IAAA;AACxC,EAAA,MAAM,SAAS,MAAY;AACzB,IAAA,MAAM,CAAA,GAAI,OAAA;AACV,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,MAAM,WAAA,GAAc,EAAE,OAAA,KAAY,SAAA;AAClC,IAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,MAAA,OAAA,GAAU,WAAA;AACV,MAAA,WAAA,EAAY;AAAA,IACd;AACA,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAA,CAAE,SAAS,CAAA;AAClC,IAAA,MAAA,CAAO,cAAc,OAAA,GACjB,CAAA,CAAE,UAAU,IAAA,EAAK,IAAK,iBACtB,CAAA,EAAG,CAAA,CAAE,SAAA,CAAU,IAAA,MAAU,YAAY,CAAA,EAAG,OAAO,CAAA,MAAA,EAAM,IAAI,KAAK,EAAE,CAAA,CAAA;AACpE,IAAA,IAAI,EAAE,MAAA,EAAQ;AACZ,MAAA,QAAA,CAAS,MAAA,GAAS,KAAA;AAClB,MAAA,QAAA,CAAS,WAAA,GAAc,EAAE,MAAA,CAAO,KAAA;AAChC,MAAA,QAAA,CAAS,OAAA,CAAQ,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,IAAA;AACjC,MAAA,QAAA,CAAS,KAAA,GAAQ,6DAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,MAAA,GAAS,IAAA;AAAA,IACpB;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,EAAE,MAAA,GACf,CAAA,EAAG,IAAI,SAAA,EAAW,EAAE,CAAC,CAAA,4BAAA,CAAA,GACrB,sBAAA;AACJ,IAAA,IAAA,CAAK,WAAW,CAAA,CAAE,MAAA;AAClB,IAAA,QAAA,CAAS,WAAW,CAAA,CAAE,MAAA;AAEtB,IAAA,SAAA,CAAU,eAAA,EAAgB;AAC1B,IAAA,MAAM,UAAA,GAAa,SAAS,GAAA,CAAI,QAAA,EAAU,EAAE,CAAA,EAAG,eAAA,EAAc,CAAA,CAAE,OAAA,KAAY,YAAY,CAAA;AACvF,IAAA,UAAA,CAAW,gBAAA,CAAiB,SAAS,MAAM,GAAA,CAAI,EAAE,MAAA,EAAQ,mBAAA,EAAqB,CAAC,CAAA;AAC/E,IAAA,SAAA,CAAU,OAAO,UAAU,CAAA;AAC3B,IAAA,CAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,CAAC,EAAA,EAAI,CAAA,KAAM;AACzB,MAAA,MAAM,KAAA,GACJ,EAAA,CAAG,YAAA,KAAiB,QAAA,GAChB,qEAAA,GACA,oDAAA;AAEN,MAAA,MAAM,UAAA,GACJ,CAAA,CAAE,OAAA,KAAY,MAAA,IACd,EAAE,OAAA,KAAY,OAAA,IACd,CAAA,CAAE,OAAA,KAAY,WAAA,IACd,CAAA,CAAE,OAAA,KAAY,KAAA,IACd,EAAE,OAAA,KAAY,WAAA;AAChB,MAAA,MAAM,IAAA,GAAO,SAAS,KAAA,EAAO,EAAA,CAAG,OAAO,UAAA,IAAc,CAAA,CAAE,eAAe,CAAA,EAAG;AAAA;AAAA,QAEvE,SAAA,EAAW,IAAA;AAAA,QACX,MAAA,EAAQ,MAAM,GAAA,CAAI,EAAE,QAAQ,aAAA,EAAe,KAAA,EAAO,GAAG,CAAA;AAAA,QACrD,WAAA,EAAa,MAAM,GAAA,CAAI,EAAE,QAAQ,gBAAA,EAAkB,KAAA,EAAO,GAAG,CAAA;AAAA,QAC7D,QAAA,EAAU,MAAM,GAAA,CAAI,EAAE,QAAQ,aAAA,EAAe,KAAA,EAAO,GAAG;AAAA,OACxD,CAAA;AACD,MAAA,SAAA,CAAU,OAAO,IAAI,CAAA;AAAA,IACvB,CAAC,CAAA;AACD,IAAA,MAAM,GAAA,GAAM,GAAG,QAAA,EAAU,cAAA,EAAgB,GAAG,GAAA,CAAI,MAAA,EAAQ,EAAE,CAAC,CAAA,yBAAA,CAA2B,CAAA;AACtF,IAAA,GAAA,CAAI,IAAA,GAAO,QAAA;AACX,IAAA,GAAA,CAAI,gBAAA,CAAiB,SAAS,MAAM,GAAA,CAAI,EAAE,MAAA,EAAQ,UAAA,EAAY,CAAC,CAAA;AAC/D,IAAA,SAAA,CAAU,OAAO,GAAG,CAAA;AAAA,EACtB,CAAA;AAEA,EAAA,WAAA,EAAY;AAEZ,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,MAAA,OAAA,GAAU,KAAA;AACV,MAAA,MAAA,EAAO;AAAA,IACT,CAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAM,MAAM,IAAA;AAAA,IACZ,UAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAA,EAAgB,CAAC,EAAA,KAAO;AACtB,MAAA,QAAA,GAAW,EAAA;AAAA,IACb,CAAA;AAAA,IACA,UAAU,MAAM;AACd,MAAA,QAAA,CAAS,mBAAA,CAAoB,SAAS,SAAS,CAAA;AAC/C,MAAA,IAAA,CAAK,MAAM,SAAA,GAAY,aAAA;AACvB,MAAA,IAAA,CAAK,MAAM,YAAA,GAAe,gBAAA;AAC1B,MAAA,IAAA,CAAK,MAAA,EAAO;AAAA,IACd;AAAA,GACF;AACF;AAeA,SAAS,QAAA,CACP,KAAA,EACA,KAAA,EACA,MAAA,EACA,OAAA,EACa;AACb,EAAA,MAAM,GAAA,GAAM,CAAA,QAAA,EAAW,MAAA,GAAS,YAAA,GAAe,EAAE,CAAA,CAAA;AACjD,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,CAAA,GAAI,EAAA;AAAA,MACR,QAAA;AAAA,MACA,GAAA;AAAA,MACA,6BAA6B,KAAK,CAAA,0CAAA;AAAA,KACpC;AACA,IAAA,CAAA,CAAE,IAAA,GAAO,QAAA;AACT,IAAC,CAAA,CAAE,aAAA,CAAc,iBAAiB,CAAA,CAAkB,WAAA,GAAc,KAAA;AAClE,IAAA,CAAA,CAAE,YAAA,CAAa,cAAA,EAAgB,MAAA,GAAS,MAAA,GAAS,OAAO,CAAA;AACxD,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,EAAA;AAAA,IACX,KAAA;AAAA,IACA,GAAA;AAAA,IACA,6BAA6B,KAAK,CAAA,yKAAA,EAGgF,GAAA,CAAI,OAAA,EAAS,EAAE,CAAC,CAAA,yHAAA,EACb,GAAA,CAAI,MAAA,EAAQ,EAAE,CAAC,CAAA,4FAAA,EAGnF,GAAA,CAAI,QAAA,EAAU,EAAE,CAAC,CAAA,kFAAA;AAAA,GAGpE;AACA,EAAC,IAAA,CAAK,aAAA,CAAc,iBAAiB,CAAA,CAAkB,WAAA,GAAc,KAAA;AACrE,EAAA,IAAA,CAAK,YAAA,CAAa,cAAA,EAAgB,MAAA,GAAS,MAAA,GAAS,OAAO,CAAA;AAC3D,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,kBAAkB,CAAA;AACpD,EAAA,MAAA,CAAO,QAAA,GAAW,CAAC,OAAA,CAAQ,SAAA;AAC3B,EAAA,IAAI,CAAC,OAAA,CAAQ,SAAA,EAAW,MAAA,CAAO,KAAA,GAAQ,sCAAA;AACvC,EAAA,MAAM,EAAA,GAAK,CAAC,GAAA,EAAa,EAAA,KAAyB;AAChD,IAAA,IAAA,CAAK,cAAc,GAAG,CAAA,EAAG,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACxD,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,EAAA,EAAG;AAAA,IACL,CAAC,CAAA;AAAA,EACH,CAAA;AACA,EAAA,EAAA,CAAG,gBAAA,EAAkB,QAAQ,MAAM,CAAA;AACnC,EAAA,EAAA,CAAG,qBAAA,EAAuB,QAAQ,WAAW,CAAA;AAC7C,EAAA,EAAA,CAAG,kBAAA,EAAoB,QAAQ,QAAQ,CAAA;AACvC,EAAA,IAAA,CAAK,gBAAA,CAAiB,OAAA,EAAS,OAAA,CAAQ,MAAM,CAAA;AAC7C,EAAA,OAAO,IAAA;AACT;AAEA,IAAM,UAAA,GAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iFAAA,EAegE,kBAAkB,cAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EAcvG,eAAe,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EAgDf,cAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0DAAA,EA6CkC,kBAAkB,cAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;;;ACjgB5F,IAAM,kBAAA,GAAqB,gBAAA;AAC3B,IAAM,OAAA,GAAU,GAAA;AAChB,IAAM,OAAA,GAAU,GAAA;AAChB,IAAM,KAAA,GAAQ,GAAA;AACd,IAAM,KAAA,GAAQ,GAAA;AACd,IAAM,MAAA,GAAS,EAAA;AAEf,IAAM,QAAA,GAAW,EAAA;AAwCV,SAAS,mBAAmB,IAAA,EAA+C;AAChF,EAAA,IAAI,CAAC,SAAA,EAAU,IAAK,CAAC,aAAY,EAAG;AAClC,IAAA,OAAO;AAAA,MACL,QAAQ,MAAM,IAAA;AAAA,MACd,WAAW,MAAM,IAAA;AAAA,MACjB,UAAU,MAAM;AAAA,MAAC,CAAA;AAAA,MACjB,UAAU,MAAM;AAAA,MAAC,CAAA;AAAA,MACjB,YAAY,MAAM;AAAA,MAAC,CAAA;AAAA,MACnB,WAAW,MAAM,KAAA;AAAA,MACjB,cAAc,MAAM;AAAA,MAAC,CAAA;AAAA,MACrB,SAAS,MAAM;AAAA,MAAC;AAAA,KAClB;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,cAAc,IAAI,CAAA;AAEnC,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,EAAA,IAAA,CAAK,YAAA,CAAa,0BAA0B,EAAE,CAAA;AAC9C,EAAA,MAAM,SAAS,IAAA,CAAK,YAAA,CAAa,EAAE,IAAA,EAAM,QAAQ,CAAA;AAEjD,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,WAAA,GAAc,SAAA;AAEpB,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,EAAA,IAAA,CAAK,SAAA,GAAY,WAAA;AACjB,EAAA,IAAI,SAAA,GAAY,KAAK,SAAA,IAAa,CAAA;AAElC,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,IAAI,MAAM,SAAA,GAAY,MAAA;AACtB,EAAA,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA;AACzB,EAAA,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA;AACvB,EAAA,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,OAAO,CAAA,EAAA,CAAA;AAC7B,EAAA,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAO,CAAA,EAAA,CAAA;AAI9B,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,EAAA,MAAA,CAAO,SAAA,GAAY,kBAAA;AACnB,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,EAAA,IAAA,CAAK,SAAA,GAAY,gBAAA;AACjB,EAAA,IAAA,CAAK,YAAA,CAAa,eAAe,MAAM,CAAA;AACvC,EAAA,IAAA,CAAK,WAAA,GAAc,cAAA;AACnB,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC3C,EAAA,KAAA,CAAM,SAAA,GAAY,iBAAA;AAClB,EAAA,KAAA,CAAM,WAAA,GAAc,oBAAA;AACpB,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,EAAA,OAAA,CAAQ,SAAA,GAAY,mBAAA;AACpB,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,WAAA,EAAa,yBAAyB,CAAA;AACjE,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,WAAA,EAAa,WAAW,CAAA;AACrD,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,UAAA,EAAY,WAAW,CAAA;AACpD,EAAA,OAAA,CAAQ,MAAA,CAAO,MAAA,EAAQ,QAAA,EAAU,QAAQ,CAAA;AACzC,EAAA,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,KAAA,EAAO,OAAO,CAAA;AAElC,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,SAAA,GAAY,iBAAA;AACnB,EAAA,MAAA,CAAO,KAAA,GAAQ,eAAA;AACf,EAAA,MAAA,CAAO,GAAA,GAAM,QAAA;AAEb,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC/C,EAAA,UAAA,CAAW,SAAA,GAAY,kBAAA;AACvB,EAAA,UAAA,CAAW,YAAA,CAAa,eAAe,MAAM,CAAA;AAE7C,EAAA,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,MAAA,EAAQ,UAAU,CAAA;AACtC,EAAA,MAAA,CAAO,MAAA,CAAO,OAAO,IAAI,CAAA;AACzB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAG9B,EAAA,IAAI,OAAA,GAAU,IAAA;AACd,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,OAAA,GAAsE,IAAA;AAC1E,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAwB;AAC1C,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,IAAA,CAAK,KAAA,CAAM,UAAU,IAAA,IAAQ,EAAE,UAAU,CAAC,MAAA,CAAO,UAAU,EAAA,GAAK,MAAA;AAAA,EAClE,CAAA;AACA,EAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,MAAM,UAAA,CAAW,KAAK,CAAC,CAAA;AAI1D,EAAA,IAAI,cAAA,GAAkD,IAAA;AACtD,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAAyD;AACxE,IAAA,IAAI,SAAA,IAAc,MAAA,IAAU,CAAC,MAAA,CAAO,MAAA,EAAS;AAC7C,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAI,CAAC,gBAAgB,cAAA,GAAiB,EAAE,GAAG,IAAA,CAAK,WAAA,EAAa,CAAA,EAAG,IAAA,CAAK,YAAA,EAAa;AAClF,MAAA,IAAA,CAAK,MAAM,SAAA,GAAY,GAAA;AACvB,MAAA,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,KAAA,CAAM,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,UAAA,GAAa,MAAA,GAAS,CAAC,CAAC,CAAA,EAAA,CAAA;AAC1F,MAAA,IAAA,CAAK,MAAM,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,MAAM,IAAA,CAAK,MAAM,CAAA,GAAI,QAAA,EAAU,WAAW,EAAA,EAAI,MAAA,CAAO,WAAA,GAAc,GAAA,GAAM,MAAM,CAAC,CAAA,EAAA,CAAA;AAAA,IACpH,WAAW,cAAA,EAAgB;AACzB,MAAA,IAAA,CAAK,MAAM,SAAA,GAAY,EAAA;AACvB,MAAA,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,cAAA,CAAe,CAAC,CAAA,EAAA,CAAA;AACtC,MAAA,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,cAAA,CAAe,CAAC,CAAA,EAAA,CAAA;AACvC,MAAA,cAAA,GAAiB,IAAA;AAAA,IACnB;AAAA,EACF,CAAA;AACA,EAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,MAAM;AACvC,IAAA,SAAA,GAAY,CAAC,SAAA;AACb,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAA,GAAU,EAAE,MAAM,GAAA,EAAK,CAAA,EAAG,KAAK,WAAA,EAAa,CAAA,EAAG,KAAK,YAAA,EAAa;AACjE,MAAA,IAAA,GAAO,MAAA;AACP,MAAA,GAAA,GAAM,SAAA,GAAY,MAAA;AAClB,MAAA,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA;AACzB,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA;AACvB,MAAA,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,OAAO,MAAA,CAAO,UAAA,GAAa,MAAA,GAAS,CAAC,CAAC,CAAA,EAAA,CAAA;AACrE,MAAA,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,OAAO,MAAA,CAAO,WAAA,GAAc,GAAA,GAAM,MAAM,CAAC,CAAA,EAAA,CAAA;AACzE,MAAA,QAAA,CAAS,KAAA,GAAQ,WAAA;AAAA,IACnB,WAAW,OAAA,EAAS;AAClB,MAAA,IAAA,GAAO,OAAA,CAAQ,IAAA;AACf,MAAA,GAAA,GAAM,OAAA,CAAQ,GAAA;AACd,MAAA,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA;AACzB,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA;AACvB,MAAA,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,EAAA,CAAA;AAC/B,MAAA,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,EAAA,CAAA;AAChC,MAAA,QAAA,CAAS,KAAA,GAAQ,WAAA;AAAA,IACnB;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,IAAI,MAAA,GAAwB,IAAA;AAC5B,EAAA,IAAI,SAAA;AAEJ,EAAA,MAAM,WAAW,MAAY;AAC3B,IAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,MAAA,aAAA,CAAc,SAAS,CAAA;AACvB,MAAA,SAAA,GAAY,MAAA;AAAA,IACd;AAAA,EACF,CAAA;AAEA,EAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,MAAM;AACrC,IAAA,MAAM,MAAM,MAAA,CAAO,IAAA;AAAA,MACjB,QAAA;AAAA,MACA,YAAA;AAAA,MACA,CAAA,YAAA,EAAe,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,WAAW,CAAC,CAAA,QAAA,EAAW,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,YAAY,CAAA,GAAI,EAAE,CAAA;AAAA,KAC1F;AACA,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,MAAA,GAAS,GAAA;AACT,IAAA,IAAA,CAAK,MAAM,OAAA,GAAU,MAAA;AACrB,IAAA,SAAA,GAAY,YAAY,MAAM;AAC5B,MAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,QAAA,QAAA,EAAS;AACT,QAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,MACf;AAAA,IACF,GAAG,GAAG,CAAA;AAAA,EACR,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAM;AAC1C,IAAA,IAAK,CAAA,CAAE,MAAA,EAAwB,OAAA,CAAQ,gBAAgB,CAAA,EAAG;AAC1D,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,MAAM,KAAK,CAAA,CAAE,OAAA;AACb,IAAA,MAAM,KAAK,CAAA,CAAE,OAAA;AACb,IAAA,MAAM,EAAA,GAAK,IAAA;AACX,IAAA,MAAM,EAAA,GAAK,GAAA;AACX,IAAA,MAAA,CAAO,MAAM,aAAA,GAAgB,MAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,CAAC,EAAA,KAAyB;AACrC,MAAA,IAAA,GAAO,KAAA,CAAM,EAAA,IAAM,EAAA,CAAG,OAAA,GAAU,EAAA,CAAA,EAAK,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,UAAA,GAAa,IAAA,CAAK,WAAW,CAAC,CAAA;AACzF,MAAA,GAAA,GAAM,KAAA,CAAM,EAAA,IAAM,EAAA,CAAG,OAAA,GAAU,EAAA,CAAA,EAAK,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,MAAA,CAAO,WAAA,GAAc,EAAE,CAAC,CAAA;AAC3F,MAAA,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA;AACzB,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA;AAAA,IACzB,CAAA;AACA,IAAA,MAAM,KAAK,MAAY;AACrB,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,IAAI,CAAA;AAC5C,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,EAAE,CAAA;AACxC,MAAA,MAAA,CAAO,MAAM,aAAA,GAAgB,EAAA;AAAA,IAC/B,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,IAAI,CAAA;AACzC,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,EAAE,CAAA;AAAA,EACvC,CAAC,CAAA;AAGD,EAAA,UAAA,CAAW,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAM;AAC9C,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,MAAM,KAAK,CAAA,CAAE,OAAA;AACb,IAAA,MAAM,KAAK,CAAA,CAAE,OAAA;AACb,IAAA,MAAM,KAAK,IAAA,CAAK,WAAA;AAChB,IAAA,MAAM,KAAK,IAAA,CAAK,YAAA;AAChB,IAAA,MAAA,CAAO,MAAM,aAAA,GAAgB,MAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,CAAC,EAAA,KAAyB;AACrC,MAAA,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,KAAA,CAAM,EAAA,IAAM,EAAA,CAAG,OAAA,GAAU,EAAA,CAAA,EAAK,KAAA,EAAO,MAAA,CAAO,UAAU,CAAC,CAAA,EAAA,CAAA;AAC7E,MAAA,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,EAAA,IAAM,EAAA,CAAG,OAAA,GAAU,EAAA,CAAA,EAAK,KAAA,EAAO,MAAA,CAAO,WAAW,CAAC,CAAA,EAAA,CAAA;AAAA,IACjF,CAAA;AACA,IAAA,MAAM,KAAK,MAAY;AACrB,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,IAAI,CAAA;AAC5C,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,EAAE,CAAA;AACxC,MAAA,MAAA,CAAO,MAAM,aAAA,GAAgB,EAAA;AAAA,IAC/B,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,IAAI,CAAA;AACzC,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,EAAE,CAAA;AAAA,EACvC,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,QAAQ,MAAO,MAAA,IAAU,CAAC,MAAA,CAAO,MAAA,GAAS,SAAS,MAAA,CAAO,aAAA;AAAA,IAC1D,SAAA,EAAW,MAAO,MAAA,IAAU,CAAC,OAAO,MAAA,GAAS,IAAA,GAAO,OAAO,qBAAA,EAAsB;AAAA,IACjF,UAAU,MAAM;AACd,MAAA,QAAA,EAAS;AACT,MAAA,IAAI,MAAA,IAAU,CAAC,MAAA,CAAO,MAAA,SAAe,KAAA,EAAM;AAC3C,MAAA,IAAA,CAAK,MAAA,EAAO;AAAA,IACd,CAAA;AAAA,IACA,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,MAAA,KAAA,CAAM,WAAA,GAAc,CAAA;AAAA,IACtB,CAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAW,MAAM,OAAA;AAAA,IACjB,YAAA,EAAc,CAAC,EAAA,KAAO;AACpB,MAAA,SAAA,GAAY,EAAA;AACZ,MAAA,IAAI,GAAA,GAAM,YAAY,MAAA,EAAQ;AAC5B,QAAA,GAAA,GAAM,SAAA,GAAY,MAAA;AAClB,QAAA,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA;AAAA,MACzB;AAAA,IACF;AAAA,GACF;AACF;AAEA,IAAM,WAAA,GACJ,kNAAA;AACF,IAAM,WAAA,GACJ,kNAAA;AACF,IAAM,UAAA,GAAa,qEAAA;AAEnB,SAAS,WAAA,CAAY,UAAkB,KAAA,EAAkC;AACvE,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACzC,EAAA,CAAA,CAAE,SAAA,GAAY,eAAA;AACd,EAAA,CAAA,CAAE,IAAA,GAAO,QAAA;AACT,EAAA,CAAA,CAAE,KAAA,GAAQ,KAAA;AACV,EAAA,CAAA,CAAE,YAAA,CAAa,cAAc,KAAK,CAAA;AAClC,EAAA,CAAA,CAAE,SAAA,GACA,8JAC2E,QAAQ,CAAA,MAAA,CAAA;AACrF,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,KAAA,CAAM,CAAA,EAAW,GAAA,EAAa,GAAA,EAAqB;AAC1D,EAAA,OAAO,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG,GAAG,GAAG,GAAG,CAAA;AACvC;AAEA,SAAS,cAAc,IAAA,EAAmC;AACxD,EAAA,MAAM,IAAA,GAAO,KAAK,SAAA,IAAa,kBAAA;AAC/B,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,IAAA,EAAM,KAAK,eAAe,CAAA;AAC9C,EAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,IAAA,CAAK,KAAK,CAAA;AAC3C,EAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,QAAA,EAAU,IAAA,CAAK,SAAS,CAAA;AAC7C,EAAA,IAAI,KAAK,KAAA,EAAO,GAAA,CAAI,aAAa,GAAA,CAAI,UAAA,EAAY,KAAK,KAAK,CAAA;AAC3D,EAAA,OAAO,IAAI,QAAA,EAAS;AACtB;AAEA,IAAM,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA,aAAA,EAIH,KAAK,mBAAmB,KAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8CAAA,EAWI,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;;;AC9QxD,IAAMC,MAAAA,GAAQ,GAAA;AACd,IAAM,KAAA,GAAQ,GAAA;AACd,IAAMC,MAAAA,GAAQ,GAAA;AACd,IAAM,KAAA,GAAQ,GAAA;AAEd,IAAM,IAAA,GAAO,CAAA;AAGb,IAAM,WAAA,GAA2B,CAAC,GAAA,EAAK,GAAA,EAAK,KAAK,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AAE5E,IAAM,eAAA,GAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAA,EAyBF,OAAO,CAAC,CAAA,UAAA,EAAa,IAAI,CAAA,WAAA,EAAc,IAAI,eAAe,IAAI,CAAA;AAAA,uBAAA,EAC3D,OAAO,CAAC,CAAA,UAAA,EAAa,IAAI,CAAA,WAAA,EAAc,IAAI,eAAe,IAAI,CAAA;AAAA,sBAAA,EAC/D,OAAO,CAAC,CAAA,SAAA,EAAY,IAAI,CAAA,YAAA,EAAe,IAAI,cAAc,IAAI,CAAA;AAAA,qBAAA,EAC9D,OAAO,CAAC,CAAA,SAAA,EAAY,IAAI,CAAA,YAAA,EAAe,IAAI,cAAc,IAAI,CAAA;AAAA,oBAAA,EAC9D,IAAA,GAAO,CAAC,CAAA,YAAA,EAAe,IAAA,GAAO,CAAC,cAAc,IAAA,GAAO,GAAG,CAAA,YAAA,EAAe,IAAA,GAAO,GAAG,CAAA;AAAA,oBAAA,EAChF,IAAA,GAAO,CAAC,CAAA,WAAA,EAAc,IAAA,GAAO,CAAC,cAAc,IAAA,GAAO,GAAG,CAAA,YAAA,EAAe,IAAA,GAAO,GAAG,CAAA;AAAA,uBAAA,EAC5E,IAAA,GAAO,CAAC,CAAA,YAAA,EAAe,IAAA,GAAO,CAAC,cAAc,IAAA,GAAO,GAAG,CAAA,YAAA,EAAe,IAAA,GAAO,GAAG,CAAA;AAAA,uBAAA,EAChF,IAAA,GAAO,CAAC,CAAA,WAAA,EAAc,IAAA,GAAO,CAAC,cAAc,IAAA,GAAO,GAAG,CAAA,YAAA,EAAe,IAAA,GAAO,GAAG,CAAA;AAAA;AAAA;AAAA,CAAA;AAKxG,SAASC,MAAAA,CAAM,CAAA,EAAW,GAAA,EAAa,GAAA,EAAqB;AAC1D,EAAA,OAAO,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG,GAAG,GAAG,GAAG,CAAA;AACvC;AAEA,SAAS,OAAO,CAAA,EAAmB;AACjC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAI,CAAA,GAAI,GAAA;AAChC;AAGA,SAAS,cAAc,MAAA,EAAqC;AAC1D,EAAA,OAAO,OAAA;AAAA,IACL,MAAA,YAAkB,OAAA,IAAW,MAAA,CAAO,OAAA,CAAQ,2CAA2C;AAAA,GACzF;AACF;AAOO,SAAS,wBACd,IAAA,EACgC;AAChC,EAAA,MAAM,MAAA,GAAS,KAAK,IAAA,CAAK,UAAA;AACzB,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,aAAA,CAA2B,iBAAiB,CAAA;AAChE,EAAA,IAAI,IAAA,EAAM,OAAO,WAAA,CAAY,IAAA,EAAM,QAAQ,IAAI,CAAA;AAE/C,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,aAAA,CAA2B,aAAa,CAAA;AAG9D,EAAA,IAAI,UAAU,CAAC,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,qBAAqB,CAAA,EAAG;AAC/D,IAAA,OAAO,YAAA,CAAa,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AAAA,EAC1C;AAEA,EAAA,OAAO,IAAA;AACT;AAIA,SAAS,WAAA,CACP,IAAA,EACA,MAAA,EACA,IAAA,EACgC;AAChC,EAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,cAAA,KAAmB,GAAA,EAAK,OAAO,IAAA;AAChD,EAAA,IAAA,CAAK,QAAQ,cAAA,GAAiB,GAAA;AAC9B,EAAA,IAAA,CAAK,SAAA,CAAU,IAAI,cAAc,CAAA;AAEjC,EAAA,MAAM,MAAM,IAAA,CAAK,aAAA;AACjB,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,aAAA,CAAc,OAAO,CAAA;AACvC,EAAA,KAAA,CAAM,WAAA,GAAc,eAAA;AACpB,EAAA,MAAA,CAAO,YAAY,KAAK,CAAA;AAExB,EAAA,MAAM,UAAyB,EAAC;AAChC,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACjC,IAAA,CAAA,CAAE,SAAA,GAAY,0BAA0B,GAAG,CAAA,CAAA;AAC3C,IAAA,CAAA,CAAE,QAAQ,MAAA,GAAS,GAAA;AACnB,IAAA,IAAA,CAAK,YAAY,CAAC,CAAA;AAClB,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,QAAA,GAAW,KAAA;AAGf,EAAA,IAAI,QAA8B,EAAC;AAEnC,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAkE;AACjF,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,IAAI,CAAA,CAAE,EAAA,KAAO,MAAA,EAAW,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,aAAA,EAAe,CAAA,EAAG,CAAA,CAAE,EAAA,GAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AAC9E,IAAA,IAAI,CAAA,CAAE,EAAA,KAAO,MAAA,EAAW,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,aAAA,EAAe,CAAA,EAAG,CAAA,CAAE,EAAA,GAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AAC9E,IAAA,IAAI,CAAA,CAAE,CAAA,KAAM,MAAA,EAAW,IAAA,CAAK,KAAA,CAAM,YAAY,aAAA,EAAe,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAA,CAAI,CAAA;AACvE,IAAA,IAAI,CAAA,CAAE,CAAA,KAAM,MAAA,EAAW,IAAA,CAAK,KAAA,CAAM,YAAY,aAAA,EAAe,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,EACzE,CAAA;AAMA,EAAA,MAAM,YAAA,GAAe,CACnB,CAAA,EACA,KAAA,KACS;AACT,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,QAAA,GAAW,IAAA;AACX,IAAA,KAAA,GAAQ,EAAC;AACT,IAAA,MAAM,KAAA,GAAQ,KAAK,qBAAA,EAAsB;AACzC,IAAA,MAAM,KAAK,CAAA,CAAE,OAAA;AACb,IAAA,MAAM,KAAK,CAAA,CAAE,OAAA;AACb,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,IAAI,MAAA,GAA4B,IAAA;AAEhC,IAAA,MAAM,QAAQ,MAAY;AACxB,MAAA,GAAA,GAAM,CAAA;AACN,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,OAAA,GAAU,IAAI,MAAA,CAAO,OAAA,GAAU,IAAI,KAAK,CAAA;AAClE,MAAA,KAAA,GAAQ,EAAE,GAAG,KAAA,EAAO,GAAG,IAAA,EAAK;AAC5B,MAAA,OAAA,CAAQ;AAAA,QACN,GAAI,KAAK,IAAA,KAAS,MAAA,GAAY,EAAE,EAAA,EAAI,IAAA,CAAK,IAAA,EAAK,GAAI,EAAC;AAAA,QACnD,GAAI,KAAK,IAAA,KAAS,MAAA,GAAY,EAAE,EAAA,EAAI,IAAA,CAAK,IAAA,EAAK,GAAI,EAAC;AAAA,QACnD,GAAI,KAAK,KAAA,KAAU,MAAA,GAAY,EAAE,CAAA,EAAG,IAAA,CAAK,KAAA,EAAM,GAAI,EAAC;AAAA,QACpD,GAAI,KAAK,MAAA,KAAW,MAAA,GAAY,EAAE,CAAA,EAAG,IAAA,CAAK,MAAA,EAAO,GAAI;AAAC,OACvD,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,MAAM,IAAA,GAAO,CAAC,EAAA,KAAyB;AACrC,MAAA,MAAA,GAAS,EAAA;AAET,MAAA,IAAI,OAAO,MAAA,CAAO,qBAAA,KAA0B,UAAA,EAAY,KAAA,EAAM;AAAA,WAAA,IACrD,CAAC,GAAA,EAAK,GAAA,GAAM,MAAA,CAAO,sBAAsB,KAAK,CAAA;AAAA,IACzD,CAAA;AACA,IAAA,MAAM,KAAK,MAAY;AACrB,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,IAAI,CAAA;AAC5C,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,EAAE,CAAA;AACxC,MAAA,IAAI,GAAA,EAAK,MAAA,CAAO,oBAAA,CAAqB,GAAG,CAAA;AACxC,MAAA,KAAA,EAAM;AACN,MAAA,QAAA,GAAW,KAAA;AACX,MAAA,IAAI,OAAO,IAAA,CAAK,KAAK,EAAE,MAAA,GAAS,CAAA,IAAK,CAAC,QAAA,EAAU;AAC9C,QAAA,IAAA,CAAK,SAAS,EAAE,SAAA,EAAW,KAAK,SAAA,EAAW,KAAA,EAAO,OAAO,CAAA;AAAA,MAC3D;AACA,MAAA,IAAA,CAAK,YAAA,IAAe;AAAA,IACtB,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,IAAI,CAAA;AACzC,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,EAAE,CAAA;AAAA,EACvC,CAAA;AAGA,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,EAAc,CAAA,KAAsB;AACnD,IAAA,MAAM,IAAA,GAAO,OAAO,UAAA,GAAa,CAAA;AACjC,IAAA,OAAO,IAAA,IAAQ,IAAI,GAAA,GAAM,MAAA,CAAOA,OAAM,IAAA,GAAO,IAAA,EAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,EAC1D,CAAA;AACA,EAAA,MAAM,OAAA,GAAU,CAAC,GAAA,EAAa,CAAA,KAAsB;AAClD,IAAA,MAAM,IAAA,GAAO,OAAO,WAAA,GAAc,CAAA;AAClC,IAAA,OAAO,IAAA,IAAQ,IAAI,GAAA,GAAM,MAAA,CAAOA,OAAM,GAAA,GAAM,IAAA,EAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,EACzD,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAwB;AAC1C,IAAA,IAAI,aAAA,CAAc,CAAA,CAAE,MAAM,CAAA,EAAG;AAC7B,IAAA,IAAI,EAAE,MAAA,YAAkB,OAAA,IAAW,EAAE,MAAA,CAAO,OAAA,CAAQ,iBAAiB,CAAA,EAAG;AACxE,IAAA,YAAA,CAAa,CAAA,EAAG,CAAC,EAAA,EAAI,EAAA,EAAI,KAAA,MAAW;AAAA,MAClC,MAAM,OAAA,CAAQ,KAAA,CAAM,IAAA,GAAO,EAAA,EAAI,MAAM,KAAK,CAAA;AAAA,MAC1C,MAAM,OAAA,CAAQ,KAAA,CAAM,GAAA,GAAM,EAAA,EAAI,MAAM,MAAM;AAAA,KAC5C,CAAE,CAAA;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAwB;AAC5C,IAAA,MAAM,GAAA,GAAO,CAAA,CAAE,aAAA,CAA8B,OAAA,CAAQ,MAAA;AACrD,IAAA,YAAA,CAAa,CAAA,EAAG,CAAC,EAAA,EAAI,EAAA,EAAI,KAAA,KAAU;AACjC,MAAA,MAAM,MAA4B,EAAC;AACnC,MAAA,IAAI,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,MAAO,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAMA,MAAAA,CAAM,KAAA,CAAM,KAAA,GAAQ,EAAA,EAAIF,MAAAA,EAAO,KAAK,CAAC,CAAA;AACnF,MAAA,IAAI,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAG;AACrB,QAAA,GAAA,CAAI,KAAA,GAAQ,KAAK,KAAA,CAAME,MAAAA,CAAM,MAAM,KAAA,GAAQ,EAAA,EAAIF,MAAAA,EAAO,KAAK,CAAC,CAAA;AAE5D,QAAA,GAAA,CAAI,OAAO,OAAA,CAAQ,KAAA,CAAM,QAAQ,GAAA,CAAI,KAAA,EAAO,IAAI,KAAK,CAAA;AAAA,MACvD;AACA,MAAA,IAAI,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,MAAO,MAAA,GAAS,IAAA,CAAK,KAAA,CAAME,MAAAA,CAAM,KAAA,CAAM,MAAA,GAAS,EAAA,EAAID,MAAAA,EAAO,KAAK,CAAC,CAAA;AACrF,MAAA,IAAI,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAG;AACrB,QAAA,GAAA,CAAI,MAAA,GAAS,KAAK,KAAA,CAAMC,MAAAA,CAAM,MAAM,MAAA,GAAS,EAAA,EAAID,MAAAA,EAAO,KAAK,CAAC,CAAA;AAC9D,QAAA,GAAA,CAAI,OAAO,OAAA,CAAQ,KAAA,CAAM,SAAS,GAAA,CAAI,MAAA,EAAQ,IAAI,MAAM,CAAA;AAAA,MAC1D;AACA,MAAA,OAAO,GAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,IAAA,CAAK,gBAAA,CAAiB,aAAa,UAAU,CAAA;AAC7C,EAAA,KAAA,MAAW,CAAA,IAAK,OAAA,EAAS,CAAA,CAAE,gBAAA,CAAiB,aAAa,YAAY,CAAA;AAErE,EAAA,OAAO;AAAA,IACL,YAAY,MAAM,QAAA;AAAA,IAClB,QAAQ,MAAM;AACZ,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,IAAA,CAAK,mBAAA,CAAoB,aAAa,UAAU,CAAA;AAChD,MAAA,KAAA,MAAW,CAAA,IAAK,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO;AAClC,MAAA,KAAA,CAAM,MAAA,EAAO;AACb,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,cAAc,CAAA;AACpC,MAAA,OAAO,KAAK,OAAA,CAAQ,cAAA;AAAA,IACtB;AAAA,GACF;AACF;AAIA,SAAS,YAAA,CACP,IAAA,EACA,MAAA,EACA,MAAA,EACgC;AAChC,EAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,cAAA,KAAmB,GAAA,EAAK,OAAO,IAAA;AAClD,EAAA,MAAA,CAAO,QAAQ,cAAA,GAAiB,GAAA;AAChC,EAAA,MAAA,CAAO,SAAA,CAAU,IAAI,gBAAgB,CAAA;AAErC,EAAA,MAAM,MAAM,MAAA,CAAO,aAAA;AACnB,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,aAAA,CAAc,OAAO,CAAA;AACvC,EAAA,KAAA,CAAM,WAAA,GAAc,eAAA;AACpB,EAAA,MAAA,CAAO,YAAY,KAAK,CAAA;AAExB,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,QAAA,GAAW,KAAA;AAEf,EAAA,MAAM,aAAa,MACjB,MAAA,CAAO,UAAU,QAAA,CAAS,mBAAmB,IAAI,QAAA,GAAW,KAAA;AAE9D,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAwB;AACtC,IAAA,IAAI,aAAA,CAAc,CAAA,CAAE,MAAM,CAAA,EAAG;AAC7B,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,QAAA,GAAW,IAAA;AACX,IAAA,MAAM,WAAW,UAAA,EAAW;AAC5B,IAAA,IAAI,OAAA,GAAU,QAAA;AAEd,IAAA,MAAM,IAAA,GAAO,CAAC,EAAA,KAAyB;AAErC,MAAA,MAAM,OAAO,EAAA,CAAG,OAAA,GAAU,MAAA,CAAO,WAAA,GAAc,IAAI,KAAA,GAAQ,QAAA;AAC3D,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,MAAA,CAAO,SAAA,CAAU,MAAA,CAAO,gBAAA,EAAkB,mBAAmB,CAAA;AAC7D,QAAA,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,CAAA,WAAA,EAAc,IAAI,CAAA,CAAE,CAAA;AAAA,MAC3C;AAAA,IACF,CAAA;AACA,IAAA,MAAM,KAAK,MAAY;AACrB,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,IAAI,CAAA;AAC5C,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,EAAE,CAAA;AACxC,MAAA,QAAA,GAAW,KAAA;AACX,MAAA,IAAI,OAAA,KAAY,QAAA,IAAY,CAAC,QAAA,EAAU;AACrC,QAAA,IAAA,CAAK,QAAA,CAAS,EAAE,SAAA,EAAW,IAAA,CAAK,SAAA,EAAW,OAAO,EAAE,QAAA,EAAU,OAAA,EAAQ,EAAG,CAAA;AAAA,MAC3E;AACA,MAAA,IAAA,CAAK,YAAA,IAAe;AAAA,IACtB,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,IAAI,CAAA;AACzC,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,EAAE,CAAA;AAAA,EACvC,CAAA;AAEA,EAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,MAAM,CAAA;AAE3C,EAAA,OAAO;AAAA,IACL,YAAY,MAAM,QAAA;AAAA,IAClB,QAAQ,MAAM;AACZ,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,MAAM,CAAA;AAC9C,MAAA,KAAA,CAAM,MAAA,EAAO;AACb,MAAA,MAAA,CAAO,SAAA,CAAU,OAAO,gBAAgB,CAAA;AACxC,MAAA,OAAO,OAAO,OAAA,CAAQ,cAAA;AAAA,IACxB;AAAA,GACF;AACF;;;AC9UA,IAAM,iBAAA,GAAoB;AAAA,EACxB,QAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,kBAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA;AAGO,IAAM,oBAAA,GAAuB;AAAA,EAClC,QAAA;AAAA,EACA,SAAA;AAAA,EACA,4BAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,0BAAA;AAAA,EACA,WAAA;AAAA,EACA,gBAAA;AAAA,EACA,GAAG,iBAAA,CAAkB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,OAAA,EAAU,CAAC,CAAA,EAAA,CAAI;AACjD,CAAA,CAAE,KAAK,IAAI;AAGJ,SAAS,qBAAqB,OAAA,EAA2B;AAC9D,EAAA,IAAI;AACF,IAAA,OAAO,OAAA,CAAQ,QAAQ,oBAAoB,CAAA;AAAA,EAC7C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAOO,SAAS,mBAAmB,OAAA,EAAkC;AACnE,EAAA,IAAI;AACF,IAAA,OAAO,OAAA,CAAQ,QAAQ,oBAAoB,CAAA;AAAA,EAC7C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAQA,IAAM,QAAA,GAAW,2EAAA;AAOV,SAAS,gBAAA,CAAiB,OAAA,EAAkB,GAAA,GAAM,GAAA,EAAa;AACpE,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,KAAA,CACZ,GAAA,IAAO,EAAA,EAAI,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AAC9D,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA;AACtC,EAAA,IAAI,IAAA,EAAM,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,GAAG,CAAA;AAClC,EAAA,MAAM,QAAA,GACJ,KAAA,CAAM,OAAA,CAAQ,YAAA,CAAa,YAAY,CAAC,CAAA,IAAK,KAAA,CAAM,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAC,CAAA;AAClF,EAAA,OAAO,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAC9B;;;ACpEA,IAAM,QAAA,GAAW,UAAA;AACjB,IAAM,gBAAA,GAAmB,iBAAA;AACzB,IAAM,qBAAA,GAAwB,CAAA;AAyC9B,IAAM,aAAA,GAAgB;AAAA;AAAA;AAAA;AAAA,WAAA,EAIT,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAUR,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAiBR,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA4BrB,IAAM,SAAA,GACJ,yZAAA;AAWF,IAAM,gBAAN,MAAoB;AAAA,EAApB,WAAA,GAAA;AACE,IAAA,IAAA,CAAQ,IAAA,GAA2B,IAAA;AACnC,IAAA,IAAA,CAAQ,GAAA,GAA0B,IAAA;AAClC,IAAA,IAAA,CAAQ,KAAA,GAA4B,IAAA;AACpC,IAAA,IAAA,CAAQ,OAAA,GAA0B,IAAA;AAClC,IAAA,IAAA,CAAQ,YAAA,GAAe,qBAAA;AACvB,IAAA,IAAA,CAAQ,IAAA,GAA6B,IAAA;AACrC,IAAA,IAAA,CAAQ,MAAA,GAA8C,IAAA;AACtD,IAAA,IAAA,CAAQ,QAAA,GAAgC,IAAA;AAqGxC,IAAA,IAAA,CAAQ,MAAA,GAAS,CAAC,KAAA,KAA4B;AAC5C,MAAA,IAAI,EAAE,MAAM,MAAA,YAAkB,OAAA,CAAA,IAAY,KAAK,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA,EAAG;AACpE,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,MAAM,CAAA;AAC9C,MAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,MAAA,IAAI,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAAA,gBAClB,OAAA,EAAQ;AAAA,IACpB,CAAA;AAEA,IAAA,IAAA,CAAQ,OAAA,GAAU,CAAC,KAAA,KAA4B;AAE7C,MAAA,IAAI,MAAM,MAAA,EAAQ;AAClB,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA,EAAG;AAG9B,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,MAAA,KAAA,CAAM,wBAAA,EAAyB;AAE/B,MAAA,MAAM,SAAS,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,aAAA,CAAc,MAAM,MAAM,CAAA;AAC9D,MAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AACnC,MAAA,MAAM,KAAK,IAAA,CAAK,MAAA;AAChB,MAAA,IAAA,CAAK,IAAA,EAAK;AACV,MAAA,EAAA,GAAK,MAAM,CAAA;AAAA,IACb,CAAA;AAEA,IAAA,IAAA,CAAQ,KAAA,GAAQ,CAAC,KAAA,KAA+B;AAC9C,MAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC5B,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,MAAA,MAAM,KAAK,IAAA,CAAK,QAAA;AAChB,MAAA,IAAA,CAAK,IAAA,EAAK;AACV,MAAA,EAAA,IAAK;AAAA,IACP,CAAA;AAGA;AAAA,IAAA,IAAA,CAAQ,OAAA,GAAU,CAAC,KAAA,KAA4B;AAC7C,MAAA,IAAI,MAAM,MAAA,IAAU,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA,EAAG;AAC9C,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,KAAA,CAAM,eAAA,EAAgB;AAAA,IACxB,CAAA;AAEA,IAAA,IAAA,CAAQ,aAAa,MAAY;AAC/B,MAAA,IAAI,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,IAC1C,CAAA;AAAA,EAAA;AAAA,EAhJA,MAAM,OAAA,EAAqC;AACzC,IAAA,IAAA,CAAK,IAAA,EAAK;AAEV,IAAA,IAAA,CAAK,YAAA,GAAe,QAAQ,YAAA,IAAgB,qBAAA;AAC5C,IAAA,IAAA,CAAK,IAAA,GAAO,QAAQ,IAAA,IAAQ,IAAA;AAC5B,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,QAAA,IAAY,IAAA;AAEpC,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,YAAA,CAAa,kBAAkB,EAAE,CAAA;AACtC,IAAA,MAAM,SAAS,IAAA,CAAK,YAAA,CAAa,EAAE,IAAA,EAAM,QAAQ,CAAA;AAEjD,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,IAAA,KAAA,CAAM,WAAA,GAAc,aAAA;AAEpB,IAAA,IAAA,CAAK,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACvC,IAAA,IAAA,CAAK,IAAI,SAAA,GAAY,cAAA;AACrB,IAAA,IAAA,CAAK,GAAA,CAAI,MAAM,OAAA,GAAU,MAAA;AAEzB,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,MAAM,SAAA,GAAY,gBAAA;AACvB,IAAA,IAAA,CAAK,KAAA,CAAM,MAAM,OAAA,GAAU,MAAA;AAG3B,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,SAAA,GAAY,eAAA;AACjB,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,IAAA,IAAA,CAAK,SAAA,GAAY,oBAAA;AACjB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,SAAA,GAAY,oBAAA;AACjB,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC3C,IAAA,KAAA,CAAM,SAAA,GAAY,qBAAA;AAClB,IAAA,KAAA,CAAM,WAAA,GAAc,QAAQ,IAAA,IAAQ,2DAAA;AACpC,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AACzC,IAAA,GAAA,CAAI,SAAA,GAAY,mBAAA;AAChB,IAAA,GAAA,CAAI,WAAA,GACF,QAAQ,OAAA,IAAW,uEAAA;AACrB,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,GAAG,CAAA;AACtB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,SAAA,GAAY,iBAAA;AACnB,IAAA,MAAA,CAAO,IAAA,GAAO,QAAA;AACd,IAAA,MAAA,CAAO,WAAA,GAAc,UAAA;AACrB,IAAA,MAAA,CAAO,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACtC,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,MAAM,KAAK,IAAA,CAAK,QAAA;AAChB,MAAA,IAAA,CAAK,IAAA,EAAK;AACV,MAAA,EAAA,IAAK;AAAA,IACP,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAE9B,IAAA,MAAA,CAAO,OAAO,KAAA,EAAO,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,OAAO,IAAI,CAAA;AAC/C,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAEZ,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAA,EAAa,IAAA,CAAK,MAAA,EAAQ,IAAI,CAAA;AACxD,IAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AACrD,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAA,EAAa,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AACzD,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AACvD,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,IAAA,CAAK,KAAA,EAAO,IAAI,CAAA;AACrD,IAAA,MAAA,CAAO,gBAAA,CAAiB,QAAA,EAAU,IAAA,CAAK,UAAA,EAAY,IAAI,CAAA;AACvD,IAAA,MAAA,CAAO,gBAAA,CAAiB,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AAAA,EACnD;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,IAAA,CAAK,MAAA,EAAQ,IAAI,CAAA;AAC3D,IAAA,QAAA,CAAS,mBAAA,CAAoB,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AACxD,IAAA,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAC5D,IAAA,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAC1D,IAAA,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,IAAA,CAAK,KAAA,EAAO,IAAI,CAAA;AACxD,IAAA,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,IAAA,CAAK,UAAA,EAAY,IAAI,CAAA;AAC1D,IAAA,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AAEpD,IAAA,IAAI,IAAA,CAAK,MAAM,UAAA,EAAY,IAAA,CAAK,KAAK,UAAA,CAAW,WAAA,CAAY,KAAK,IAAI,CAAA;AACrE,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,GAAA,GAAM,IAAA;AACX,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EAClB;AAAA;AAAA,EAGQ,cAAc,MAAA,EAA4C;AAChE,IAAA,IAAI,EAAE,MAAA,YAAkB,OAAA,CAAA,IAAY,KAAK,KAAA,CAAM,MAAM,GAAG,OAAO,IAAA;AAC/D,IAAA,OAAO,IAAA,CAAK,IAAA,KAAS,aAAA,GAAgB,kBAAA,CAAmB,MAAM,CAAA,GAAI,MAAA;AAAA,EACpE;AAAA,EAEQ,OAAA,GAAgB;AACtB,IAAA,IAAI,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,MAAM,OAAA,GAAU,MAAA;AACvC,IAAA,IAAI,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,MAAM,OAAA,GAAU,MAAA;AAAA,EAC7C;AAAA;AAAA,EAGQ,MAAM,MAAA,EAAqC;AACjD,IAAA,OAAO,MAAA,YAAkB,QAAQ,IAAA,CAAK,IAAA,KAAS,QAAQ,IAAA,CAAK,IAAA,CAAK,SAAS,MAAM,CAAA;AAAA,EAClF;AAAA;AAAA,EAkDQ,KAAK,OAAA,EAAwB;AACnC,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,IAAO,CAAC,KAAK,KAAA,EAAO;AAC9B,IAAA,MAAM,IAAA,GAAO,QAAQ,qBAAA,EAAsB;AAE3C,IAAA,IAAA,CAAK,GAAA,CAAI,MAAM,OAAA,GAAU,OAAA;AACzB,IAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,KAAK,GAAG,CAAA,EAAA,CAAA;AAChC,IAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,KAAK,IAAI,CAAA,EAAA,CAAA;AAClC,IAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,KAAK,KAAK,CAAA,EAAA,CAAA;AACpC,IAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,KAAK,MAAM,CAAA,EAAA,CAAA;AAEtC,IAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,OAAA,EAAS,CAAC,CAAA;AAC7C,IAAA,IAAA,CAAK,MAAM,WAAA,GAAc,EAAA;AACzB,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,IAAA,GAAA,CAAI,SAAA,GAAY,cAAA;AAChB,IAAA,GAAA,CAAI,WAAA,GAAc,QAAA;AAClB,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,IAAA,GAAA,CAAI,SAAA,GAAY,cAAA;AAChB,IAAA,GAAA,CAAI,WAAA,GAAc,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA,MAAA,EAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA;AACxE,IAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,GAAA,EAAK,GAAG,CAAA;AAG1B,IAAA,IAAA,CAAK,KAAA,CAAM,MAAM,OAAA,GAAU,OAAA;AAC3B,IAAA,MAAM,OAAA,GAAU,EAAA;AAChB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,UAAU,MAAA,CAAO,WAAA;AACtD,IAAA,IAAA,CAAK,MAAM,KAAA,CAAM,GAAA,GAAM,UAAA,GACnB,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,GAAM,UAAU,CAAC,CAAC,OACtC,CAAA,EAAG,IAAA,CAAK,SAAS,CAAC,CAAA,EAAA,CAAA;AACtB,IAAA,IAAA,CAAK,KAAA,CAAM,MAAM,IAAA,GAAO,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA,CAAA;AAAA,EACnD;AAAA,EAEQ,SAAS,OAAA,EAAiC;AAChD,IAAA,MAAM,IAAA,GAAO,QAAQ,qBAAA,EAAsB;AAC3C,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,iBAAA,CAAkB,OAAA,EAAS,IAAA,CAAK,YAAY,CAAA;AAAA,MACtD,aAAA,EAAe,iBAAA,CAAkB,OAAA,EAAS,CAAC,CAAA;AAAA,MAC3C,GAAA,EAAK,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY;AAAA,MACjC,EAAA,EAAI,QAAQ,EAAA,IAAM,IAAA;AAAA,MAClB,OAAA,EAAS,mBAAmB,OAAO,CAAA;AAAA,MACnC,IAAA,EAAM,iBAAiB,OAAO,CAAA;AAAA,MAC9B,IAAA,EAAM;AAAA,QACJ,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,QACvB,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAAA,QACtB,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAAA,QAC5B,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAM;AAAA;AAChC,KACF;AAAA,EACF;AACF,CAAA;AAEA,IAAI,YAAA,GAAqC,IAAA;AAkBlC,SAAS,mBAAmB,OAAA,EAAoD;AACrF,EAAA,IAAI,CAAC,aAAY,EAAG;AAClB,IAAA,OAAO,EAAE,MAAM,MAAM;AAAA,IAAC,CAAA,EAAE;AAAA,EAC1B;AACA,EAAA,IAAI,CAAC,YAAA,EAAc,YAAA,GAAe,IAAI,aAAA,EAAc;AACpD,EAAA,YAAA,CAAa,MAAM,OAAO,CAAA;AAC1B,EAAA,OAAO,EAAE,IAAA,EAAM,MAAM,YAAA,EAAc,MAAK,EAAE;AAC5C;AAGO,SAAS,iBAAA,GAA0B;AACxC,EAAA,YAAA,EAAc,IAAA,EAAK;AACrB;;;AC7SA,IAAM,mBAAA,GAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAoCrB,SAAS,eAAA,GAA4C;AAC1D,EAAA,IAAI,CAAC,SAAA,EAAU,IAAK,CAAC,WAAA,IAAe,OAAO,IAAA;AAI3C,EAAA,MAAM,MAAM,qBAAA,EAAsB;AAClC,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,EAAA,MAAM,eAAA,GAAkB,sBAAA,CAAuB,GAAA,CAAI,MAAM,CAAA;AACzD,EAAA,IAAI,CAAC,iBAAiB,OAAO,IAAA;AAE7B,EAAA,IAAI,MAAA,GAAqC,IAAA;AACzC,EAAA,IAAI,KAAA,GAAmC,IAAA;AAEvC,EAAA,IAAI,MAAA,GAAqC,IAAA;AACzC,EAAA,IAAI,YAAA,GAA8B,IAAA;AAClC,EAAA,IAAI,WAAA,GAA8C,IAAA;AAClD,EAAA,IAAI,UAAA,GAA2C,IAAA;AAE/C,EAAA,IAAI,SAAA,GAAiC,IAAA;AAErC,EAAA,IAAI,QAAA,GAAkC,IAAA;AAEtC,EAAA,IAAI,eAAA,GAAiC,IAAA;AAErC,EAAA,IAAI,SAAA,GAAgC,IAAA;AAEpC,EAAA,IAAI,gBAAA,GAAmB,CAAA;AAEvB,EAAA,IAAI,cAAA,GAAsE,IAAA;AAE1E,EAAA,IAAI,WAAA,GAAmE,IAAA;AAEvE,EAAA,IAAI,WAAA,GAAc,KAAA;AAElB,EAAA,IAAI,cAAA,GAAsC,IAAA;AAE1C,EAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,IAAI,YAAA,GAAqD,IAAA;AAMzD,EAAA,IAAI,gBAAA,GAAmB,KAAA;AAEvB,EAAA,IAAI,eAAA,GAAkB,IAAA;AACtB,EAAA,MAAM,SAAA,GAAY,MAAsB,KAAA,GAAQ,KAAA,CAAM,QAAO,GAAI,YAAA;AAEjE,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAA8B;AAC1C,IAAA,SAAA,EAAU,EAAG,YAAY,EAAE,MAAA,EAAQ,oBAAoB,KAAA,EAAO,GAAG,KAAA,EAAM,EAAG,eAAe,CAAA;AAAA,EAC3F,CAAA;AAQA,EAAA,MAAM,WAAA,GAAc,CAClB,GAAA,KAC8B;AAC9B,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,UAAA;AACxB,IAAA,OAAO,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,cAAA,IAAkB,CAAC,CAAA;AAAA,EAC9C,CAAA;AACA,EAAA,MAAM,kBAAA,GAAqB,CAAC,GAAA,KAC1B,eAAA,CAAgB,WAAA,CAAY,GAAG,CAAA,EAAG,YAAA,EAAc,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA;AAEtE,EAAA,MAAM,iBAAA,GAAoB,CAAC,OAAA,KACzB,IAAA,CAAK,EAAE,IAAA,EAAM,gBAAA,EAAkB,SAAS,CAAA;AAE1C,EAAA,MAAM,qBAAqB,MAAY;AACrC,IAAA,WAAA,EAAa,MAAA,EAAO;AACpB,IAAA,WAAA,GAAc,IAAA;AACd,IAAA,UAAA,EAAY,MAAA,EAAO;AACnB,IAAA,UAAA,GAAa,IAAA;AACb,IAAA,SAAA,IAAY;AACZ,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,QAAA,IAAW;AACX,IAAA,QAAA,GAAW,IAAA;AACX,IAAA,UAAA,GAAa,IAAA;AACb,IAAA,SAAA,GAAY,KAAA;AACZ,IAAA,QAAA,EAAU,MAAA,EAAO;AACjB,IAAA,QAAA,GAAW,IAAA;AAIX,IAAA,YAAA,GAAe,IAAA;AAAA,EACjB,CAAA;AAEA,EAAA,MAAM,kBAAkB,MAAY;AAClC,IAAA,kBAAA,EAAmB;AACnB,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,iBAAA,EAAkB;AAAA,EACpB,CAAA;AAQA,EAAA,MAAM,SAAA,GAAY,CAAA;AAClB,EAAA,MAAM,WAAA,GAAc,CAAA;AACpB,EAAA,MAAM,SAAA,GAAY,EAAA;AAElB,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,MAAA,EACE,oTAAA;AAAA,IACF,IAAA,EAAM,+XAAA;AAAA,IACN,KAAA,EACE;AAAA,GACJ;AACA,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,IAAA,EAAM,4LAAA;AAAA,IACN,KAAA,EACE;AAAA,GACJ;AAOA,EAAA,MAAM,WAAA,GAAc,CAAC,MAAA,EAAqB,OAAA,KAAuD;AAC/F,IAAA,KAAA,MAAW,GAAA,IAAO,WAAA,CAAY,MAAM,CAAA,EAAG;AACrC,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AAC3C,QAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA;AACzB,QAAA,IAAI,CAAC,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,QAAA,KAAa,OAAO,CAAA,EAAG;AAC3D,QAAA,OAAO,EAAE,MAAM,CAAA,GAAI,CAAA,EAAG,OAAO,CAAA,GAAI,GAAA,CAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAE;AAAA,MAC1D;AAAA,IACF;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,EACrC,CAAA;AAGA,EAAA,IAAI,gBAA6B,EAAC;AAOlC,EAAA,IAAI,UAAA,GAA4B,IAAA;AAChC,EAAA,IAAI,aAAA,GAA+B,IAAA;AACnC,EAAA,IAAI,QAAA,GAAgC,IAAA;AAEpC,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,IAAI,YAAA,GAAoD,IAAA;AAExD,EAAA,IAAI,YAAA,GAAoE,IAAA;AAGxE,EAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAA4C;AAC/D,IAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAClB,IAAA,MAAM,EAAE,MAAA,EAAQ,GAAG,IAAA,EAAK,GAAI,IAAA;AAC5B,IAAA,OAAO,KAAK,SAAA,CAAU;AAAA,MACpB,IAAA;AAAA,MACA,SAAS,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM;AAChC,QAAA,MAAM,EAAE,MAAM,EAAA,EAAI,IAAA,EAAM,IAAI,KAAA,EAAO,EAAA,EAAI,GAAG,IAAA,EAAK,GAAI,CAAA;AACnD,QAAA,OAAO,IAAA;AAAA,MACT,CAAC;AAAA,KACF,CAAA;AAAA,EACH,CAAA;AASA,EAAA,MAAM,eAAA,GAAkB,CAAC,GAAA,KAA+D;AACtF,IAAA,MAAM,IAAA,GAAO,YAAA;AACb,IAAA,IAAI,CAAC,QAAQ,GAAA,CAAI,KAAA,CAAM,cAAc,WAAA,IAAe,IAAA,CAAK,KAAA,CAAM,SAAA,KAAc,WAAA,EAAa;AACxF,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,cAAA,IAAkB,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,cAAA,IAAkB,CAAA,MAAO,KAAK,OAAO,KAAA;AAErD,IAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAChB,IAAA,CAAK,SAAA,CAAU,EAAE,GAAG,CAAA,EAAG,UAAA,EAAY,MAAA,EAAW,CAAA;AAChD,IAAA,IAAI,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA,KAAM,QAAA,CAAS,IAAI,KAAK,CAAA,IAAK,IAAA,CAAK,QAAA,KAAa,GAAA,CAAI,QAAA;AACxE,MAAA,OAAO,KAAA;AACT,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAA2B,kBAAkB,CAAA;AACnE,IAAA,MAAM,IAAA,GAAO,IAAA,GAAO,WAAA,CAAY,IAAI,CAAA,GAAI,IAAA;AACxC,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM,OAAO,KAAA;AAC3B,IAAA,MAAM,QAAA,GAAY,IAAA,CAAK,KAAA,CAAM,UAAA,CAA0C,GAAG,CAAA;AAC1E,IAAA,MAAM,QAAA,GAAY,GAAA,CAAI,KAAA,CAAM,UAAA,CAA0C,GAAG,CAAA;AACzE,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU,OAAO,KAAA;AACnC,IAAA,IAAI,YAAY,QAAQ,CAAA,KAAM,WAAA,CAAY,QAAQ,GAAG,OAAO,KAAA;AAC5D,IAAA,MAAM,MAAM,IAAA,CAAK,aAAA;AACjB,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,MAAA,IAAU,EAAC;AACvC,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,MAAA,IAAU,EAAC;AACvC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC1C,MAAA,MAAM,CAAA,GAAI,WAAW,CAAC,CAAA;AACtB,MAAA,MAAM,CAAA,GAAI,WAAW,CAAC,CAAA;AACtB,MAAA,IACE,EAAE,IAAA,KAAS,CAAA,CAAE,IAAA,IACb,CAAA,CAAE,SAAS,CAAA,CAAE,IAAA,IACb,IAAA,CAAK,SAAA,CAAU,EAAE,KAAK,CAAA,KAAM,KAAK,SAAA,CAAU,CAAA,CAAE,KAAK,CAAA,EAClD;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,CAAA,CAAE,QAAA,EAAU,OAAO,KAAA;AACxB,MAAA,MAAM,OAAO,IAAA,CAAK,aAAA,CAA2B,CAAA,oBAAA,EAAuB,CAAA,CAAE,QAAQ,CAAA,EAAA,CAAI,CAAA;AAClF,MAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,MAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU;AAEvB,QAAA,IAAA,CAAK,WAAA,GAAc,CAAA,CAAE,IAAA,EAAM,IAAA,EAAK,IAAK,IAAA;AACrC,QAAA,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAC5B,QAAA,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,0BAAA,EAA4B,qBAAqB,CAAA;AACvE,QAAA,MAAM,EAAA,GAAM,CAAA,CAAE,KAAA,IAAS,EAAC;AACxB,QAAA,IAAI,EAAA,CAAG,MAAA,KAAW,WAAA,IAAe,EAAA,CAAG,WAAW,MAAA,EAAQ;AACrD,UAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,CAAA,eAAA,EAAkB,EAAA,CAAG,MAAM,CAAA,CAAE,CAAA;AAAA,QAClD;AACA,QAAA,IAAI,OAAO,EAAA,CAAG,SAAA,KAAc,YAAY,EAAA,CAAG,SAAA,CAAU,MAAK,EAAG;AAC3D,UAAA,IAAA,CAAK,YAAA,CAAa,YAAA,EAAc,EAAA,CAAG,SAAA,CAAU,MAAM,CAAA;AAAA,QACrD,CAAA,MAAO,IAAA,CAAK,eAAA,CAAgB,YAAY,CAAA;AACxC,QAAA,eAAA,CAAgB,IAAA,EAAM,CAAA,CAAE,KAAA,EAAO,QAAQ,CAAA;AACvC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,EAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,IAAA,KAAS,QAAQ,OAAO,KAAA;AACnD,MAAA,MAAM,KAAA,GACJ,kBAAkB,CAAA,EAAG,GAAA,EAAK,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA,IAAA,CAC1C,MAAM;AACL,QAAA,MAAMF,GAAAA,GAAK,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AAClC,QAAAA,IAAG,SAAA,GAAY,uBAAA;AACf,QAAAA,GAAAA,CAAG,cACD,CAAA,CAAE,IAAA,KAAS,UACP,kBAAA,GACA,CAAA,CAAE,IAAA,KAAS,OAAA,GACT,uCAAA,GACA,iBAAA;AACR,QAAA,OAAOA,GAAAA;AAAA,MACT,CAAA,GAAG;AACL,MAAA,KAAA,CAAM,QAAQ,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,QAAA,IAAY,OAAO,CAAC,CAAA;AAC1D,MAAA,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAA,CAAE,QAAA;AAC7B,MAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,IACxB;AACA,IAAA,YAAA,GAAe,GAAA;AACf,IAAA,aAAA,GAAgB,UAAA;AAEhB,IAAA,mBAAA,CAAoB,MAAM,GAAG,CAAA;AAC7B,IAAA,cAAA,CAAe,IAAA,EAAM,KAAK,UAAU,CAAA;AACpC,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAGA,EAAA,MAAM,cAAc,CAAC,IAAA,KACnB,KAAK,UAAA,EAAY,aAAA,CAA2B,WAAW,CAAA,IAAK,IAAA;AAG9D,EAAA,MAAM,mBAAA,GAAsB,CAAC,IAAA,KAA4B;AACvD,IAAA,MAAM,IAAA,GAAO,YAAY,IAAI,CAAA;AAC7B,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,KAAA,MAAWA,GAAAA,IAAM,IAAA,CAAK,gBAAA,CAAiB,sBAAsB,CAAA,EAAG;AAC9D,MAAAA,GAAAA,CAAG,SAAA,CAAU,MAAA,CAAO,qBAAqB,CAAA;AAAA,IAC3C;AACA,IAAA,IAAA,CAAK,aAAA,CAAc,oBAAoB,CAAA,EAAG,MAAA,EAAO;AACjD,IAAA,IAAA,CAAK,aAAA,CAAc,kBAAkB,CAAA,EAAG,MAAA,EAAO;AAAA,EACjD,CAAA;AAOA,EAAA,MAAM,mBAAA,GAAsB,CAAC,IAAA,EAAmB,SAAA,KAA4B;AAC1E,IAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,IAAA,MAAM,IAAA,GAAO,YAAY,IAAI,CAAA;AAC7B,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAMA,MAAK,eAAA,GACP,IAAA,CAAK,cAA2B,CAAA,oBAAA,EAAuB,eAAe,IAAI,CAAA,GAC1E,IAAA;AACJ,IAAA,IAAI,CAACA,GAAAA,IAAM,CAAC,eAAA,EAAiB;AAC3B,MAAA,eAAA,CAAgB,MAAM,SAAS,CAAA;AAC/B,MAAA;AAAA,IACF;AACA,IAAAA,GAAAA,CAAG,SAAA,CAAU,GAAA,CAAI,qBAAqB,CAAA;AACtC,IAAA,MAAM,MAAM,IAAA,CAAK,aAAA;AAMjB,IAAA,MAAM,EAAA,GAAK,iBAAiB,IAAI,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,WAAW,CAAA,IAAK,CAAA;AAClD,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,UAAU,CAAA,IAAK,CAAA;AACjD,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,YAAY,CAAA,IAAK,CAAA;AACnD,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,aAAa,CAAA,IAAK,CAAA;AACpD,IAAA,MAAM,SAASA,GAAAA,CAAG,aAAA;AAClB,IAAA,MAAM,QAAQ,MAAA,EAAQ,SAAA,CAAU,QAAA,CAAS,SAAS,IAAI,MAAA,GAAS,IAAA;AAC/D,IAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,KAAA,CAAM,UAAA,GAAa,IAAA;AACxC,IAAA,MAAM,OAAO,KAAA,GAAQ,KAAA,CAAM,aAAa,KAAA,CAAM,WAAA,GAAc,KAAK,WAAA,GAAc,IAAA;AAC/E,IAAA,MAAM,IAAA,GAAO,IAAA;AACb,IAAA,MAAM,IAAA,GAAO,KAAK,YAAA,GAAe,IAAA;AAGjC,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,IAAA,EAAMA,GAAAA,CAAG,aAAa,SAAS,CAAA;AACnD,IAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,IAAA,EAAMA,IAAG,UAAA,GAAaA,GAAAA,CAAG,cAAc,SAAS,CAAA;AACpE,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,EAAE,CAAA;AAC9B,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,IAAA,EAAMA,GAAAA,CAAG,YAAY,SAAS,CAAA;AAClD,IAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,IAAA,EAAMA,IAAG,SAAA,GAAYA,GAAAA,CAAG,eAAe,SAAS,CAAA;AACpE,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,KAAK,EAAE,CAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACrC,IAAA,KAAA,CAAM,SAAA,GAAY,iBAAA;AAClB,IAAA,KAAA,CAAM,YAAA,CAAa,2BAA2B,EAAE,CAAA;AAChD,IAAA,KAAA,CAAM,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,EAAE,CAAA,EAAA,CAAA;AACxB,IAAA,KAAA,CAAM,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,EAAE,CAAA,EAAA,CAAA;AACvB,IAAA,KAAA,CAAM,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,EAAE,CAAA,EAAA,CAAA;AACzB,IAAA,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,EAAE,CAAA,EAAA,CAAA;AAC1B,IAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AACtB,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACnC,IAAA,GAAA,CAAI,SAAA,GAAY,mBAAA;AAChB,IAAA,GAAA,CAAI,YAAA,CAAa,2BAA2B,EAAE,CAAA;AAC9C,IAAA,MAAM,OAAA,GAAU,eAAA;AAChB,IAAA,MAAM,KAAK,CAAC,MAAA,EAA4B,KAAA,EAAe,IAAA,EAAc,UAAU,IAAA,KAAe;AAC5F,MAAA,MAAM,CAAA,GAAI,GAAA,CAAI,aAAA,CAAc,QAAQ,CAAA;AACpC,MAAA,CAAA,CAAE,IAAA,GAAO,QAAA;AACT,MAAA,CAAA,CAAE,KAAA,GAAQ,KAAA;AACV,MAAA,CAAA,CAAE,YAAA,CAAa,cAAc,KAAK,CAAA;AAClC,MAAA,CAAA,CAAE,SAAA,GAAY,qBAAqB,MAAM,CAAA,CAAA;AACzC,MAAA,CAAA,CAAE,SAAA,GAAY,IAAA;AACd,MAAA,CAAA,CAAE,WAAW,CAAC,OAAA;AACd,MAAA,CAAA,CAAE,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACjC,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,IAAA,CAAK,EAAE,MAAM,cAAA,EAAgB,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,EAAS,MAAA,EAAO,EAAG,CAAA;AAAA,MACxE,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,YAAY,CAAC,CAAA;AAAA,IACnB,CAAA;AACA,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,aAAA,EAAe,OAAO,CAAA;AAC9C,IAAA,EAAA,CAAG,MAAA,EAAQ,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAChC,IAAA,EAAA,CAAG,WAAA,EAAa,UAAA,EAAY,IAAA,CAAK,IAAI,CAAA;AACrC,IAAA,EAAA,CAAG,QAAA,EAAU,UAAA,EAAY,IAAA,CAAK,KAAK,CAAA;AAEnC,IAAA,EAAA,CAAG,WAAA,EAAa,sBAAA,EAAwB,SAAA,CAAU,IAAA,EAAM,IAAI,IAAI,CAAA;AAChE,IAAA,EAAA,CAAG,YAAA,EAAc,oBAAA,EAAsB,SAAA,CAAU,KAAA,EAAO,IAAI,KAAK,CAAA;AAIjE,IAAA,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,WAAA,GAAc,EAAE,CAAC,CAAA,EAAA,CAAA;AACvD,IAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AACpB,IAAA,MAAM,IAAA,GAAO,IAAI,YAAA,IAAgB,SAAA;AAGjC,IAAA,GAAA,CAAI,OAAA,CAAQ,WAAA,GAAc,MAAA,CAAO,EAAA,GAAK,OAAO,CAAC,CAAA;AAC9C,IAAA,GAAA,CAAI,OAAA,CAAQ,WAAA,GAAc,MAAA,CAAO,EAAA,GAAK,CAAC,CAAA;AACvC,IAAA,GAAA,CAAI,KAAA,CAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,WAAA;AAE5B,IAAA,eAAA,CAAgB,MAAM,SAAS,CAAA;AAAA,EACjC,CAAA;AAGA,EAAA,MAAM,UAAA,GAAa,CAACA,GAAAA,MAAqB;AAAA,IACvC,MAAMA,GAAAA,CAAG,UAAA;AAAA,IACT,KAAKA,GAAAA,CAAG,SAAA;AAAA,IACR,KAAA,EAAOA,GAAAA,CAAG,UAAA,GAAaA,GAAAA,CAAG,WAAA;AAAA,IAC1B,MAAA,EAAQA,GAAAA,CAAG,SAAA,GAAYA,GAAAA,CAAG;AAAA,GAC5B,CAAA;AACA,EAAA,MAAM,aAAa,CACjB,CAAA,EACA,MACY,CAAA,CAAE,IAAA,GAAO,EAAE,KAAA,IAAS,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,SAAS,CAAA,CAAE,GAAA,GAAM,EAAE,MAAA,IAAU,CAAA,CAAE,MAAM,CAAA,CAAE,MAAA;AAWpF,EAAA,MAAM,sBAAA,GAAyB,CAAC,IAAA,KAA4B;AAC1D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAA2B,mBAAmB,CAAA;AACnE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAA2B,oBAAoB,CAAA;AACrE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAA2B,kBAAkB,CAAA;AACjE,IAAA,IAAI,QAAA,EAAU,QAAQ,WAAA,EAAa;AACjC,MAAA,QAAA,CAAS,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,QAAA,CAAS,QAAQ,WAAW,CAAA,EAAA,CAAA;AACpD,MAAA,IAAI,OAAA,IAAW,WAAW,UAAA,CAAW,QAAQ,GAAG,UAAA,CAAW,OAAO,CAAC,CAAA,EAAG;AACpE,QAAA,QAAA,CAAS,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,QAAA,CAAS,QAAQ,WAAW,CAAA,EAAA,CAAA;AAAA,MACtD;AAAA,IACF;AACA,IAAA,IAAI,MAAA,EAAQ,QAAQ,QAAA,EAAU;AAC5B,MAAA,MAAA,CAAO,MAAM,IAAA,GAAO,EAAA;AACpB,MAAA,MAAA,CAAO,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,MAAA,CAAO,QAAQ,QAAQ,CAAA,EAAA,CAAA;AAC/C,MAAA,MAAA,CAAO,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,MAAA,CAAO,QAAQ,WAAW,CAAA,EAAA,CAAA;AAChD,MAAA,MAAM,MAAA,GAAS,CAAC,OAAA,EAAS,QAAQ,CAAA,CAAE,OAAO,CAAC,CAAA,KAAwB,CAAC,CAAC,CAAC,CAAA;AACtE,MAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA,EAAG,UAAA,CAAW,CAAC,CAAC,CAAC,CAAA;AACtF,MAAA,IAAI,SAAQ,EAAG;AACb,QAAA,MAAA,CAAO,MAAM,KAAA,GAAQ,EAAA;AACrB,QAAA,MAAA,CAAO,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,MAAA,CAAO,QAAQ,OAAO,CAAA,EAAA,CAAA;AAAA,MAC/C;AACA,MAAA,IAAI,OAAA,MAAa,QAAA,EAAU;AAGzB,QAAA,MAAA,CAAO,MAAM,IAAA,GAAO,EAAA;AACpB,QAAA,MAAA,CAAO,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,MAAA,CAAO,QAAQ,QAAQ,CAAA,EAAA,CAAA;AAC/C,QAAA,MAAA,CAAO,MAAM,GAAA,GAAM,CAAA,EAAG,WAAW,QAAQ,CAAA,CAAE,SAAS,CAAC,CAAA,EAAA,CAAA;AAAA,MACvD;AAAA,IACF;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,MAAA,GAAS,CAACA,GAAAA,MAAqB;AAAA,IACnC,MAAMA,GAAAA,CAAG,UAAA;AAAA,IACT,KAAKA,GAAAA,CAAG,SAAA;AAAA,IACR,KAAA,EAAOA,GAAAA,CAAG,UAAA,GAAaA,GAAAA,CAAG,WAAA;AAAA,IAC1B,MAAA,EAAQA,GAAAA,CAAG,SAAA,GAAYA,GAAAA,CAAG;AAAA,GAC5B,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAC,EAAA,KACb,EAAA,CAAG,MAAA,KAAW,CAAA,GACV,IAAA,GACA,EAAA,CAAG,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,IACrB,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,EAAE,IAAI,CAAA;AAAA,IAC/B,KAAK,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,EAAE,GAAG,CAAA;AAAA,IAC5B,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,KAAA,EAAO,EAAE,KAAK,CAAA;AAAA,IAClC,QAAQ,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAA,EAAQ,EAAE,MAAM;AAAA,GACvC,CAAE,CAAA;AAqBR,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,EAAmB,MAAA,KAAwB;AAC7D,IAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KACZ,CAAA,CAAE,QAAA,GAAW,IAAA,CAAK,aAAA,CAA2B,CAAA,oBAAA,EAAuB,CAAA,CAAE,QAAQ,CAAA,EAAA,CAAI,CAAA,GAAI,IAAA;AACxF,IAAA,MAAM,EAAA,GAAK,iBAAiB,IAAI,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,WAAW,CAAA,IAAK,CAAA;AAClD,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,YAAY,CAAA,IAAK,CAAA;AACnD,IAAA,MAAM,WAAA,GAAc,IAAA;AACpB,IAAA,MAAM,YAAA,GAAe,KAAK,WAAA,GAAc,IAAA;AACxC,IAAA,MAAM,OAAO,WAAA,CAAY,MAAM,CAAA,CAC5B,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAA,CACjB,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,QAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,MAAA,CACf,GAAA,CAAI,CAAC,EAAE,KAAA,EAAM,MAAO,EAAE,OAAO,EAAA,EAAI,IAAA,CAAK,KAAK,CAAA,GAAI,CAAA,CAC/C,MAAA;AAAA,UACC,CAAC,MAAkD,CAAC,CAAC,EAAE,EAAA,IAAM,CAAC,CAAC,CAAA,CAAE,KAAA,CAAM;AAAA,SACzE;AACF,QAAA,MAAMI,WAAAA,GAAa,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC,CAAC,CAAA;AACvD,QAAA,IAAI,CAACA,aAAY,OAAO,IAAA;AACxB,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,EAAG,EAAA,CAAG,aAAA;AAC3B,QAAA,MAAMC,KAAAA,GAAO,OAAO,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA,GAAID,WAAAA;AACpE,QAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAAC,KAAAA,EAAK;AAAA,MACvB,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAkC,MAAM,IAAI,CAAA;AACvD,MAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AACnD,MAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AACxB,MAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA,EAAG,MAAM,CAAC,CAAA,EAAG,GAAG,aAAA,EAAe,aAAA;AACtD,MAAA,MAAM,IAAA,GAAO,KAAA,EAAO,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA,GAC5C,MAAA,CAAO,KAAK,CAAA,GACZ,EAAE,GAAG,UAAA,EAAY,IAAA,EAAM,WAAA,EAAa,OAAO,YAAA,EAAa;AAC5D,MAAA,MAAM,KAAK,OAAA,CAAQ,CAAC,GAAG,KAAA,CAAM,CAAC,GAAG,KAAA,CAAM,QAAA;AACvC,MAAA,OAAO,EAAE,EAAA,EAAI,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,SAAS,IAAA,EAAK;AAAA,IAC3C,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAkC,MAAM,IAAI,CAAA;AACvD,IAAA,OAAO,EAAE,MAAM,OAAA,EAAS,EAAE,MAAM,WAAA,EAAa,KAAA,EAAO,cAAa,EAAE;AAAA,EACrE,CAAA;AAGA,EAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,KAA4B;AAClD,IAAA,IAAA,CAAK,aAAA,CAAc,gBAAgB,CAAA,EAAG,MAAA,EAAO;AAC7C,IAAA,IAAA,CAAK,aAAA,CAAc,kBAAkB,CAAA,EAAG,MAAA,EAAO;AAAA,EACjD,CAAA;AAQA,EAAA,MAAM,eAAA,GAAkB,CAAC,IAAA,EAAmB,SAAA,KAA4B;AACtE,IAAA,MAAM,IAAA,GAAO,YAAY,IAAI,CAAA;AAC7B,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,sBAAA,CAAuB,IAAI,CAAA;AAC3B,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,UAAA,CAAW,MAAM,aAAa,CAAA;AAC/C,IAAA,MAAM,aAAA,GAAgB,kBAClB,IAAA,CAAK,IAAA;AAAA,MAAK,CAAC,CAAA,KACT,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,QAAA,KAAa,eAAe,CAAC;AAAA,KACjF,GACA,MAAA;AACJ,IAAA,MAAM,MAAA,GAAA,CACH,gBAAgB,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,aAAa,CAAA,GAAI,WAC5D,aAAA,KACC,UAAA,GAAa,KAAK,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,UAAU,CAAA,GAAI,MAAA,CAAA;AACxD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,MAAM,IAAA,CAAK,aAAA;AACjB,IAAA,MAAM,EAAA,GAAK,iBAAiB,IAAI,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,UAAU,CAAA,IAAK,CAAA;AACjD,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,aAAa,CAAA,IAAK,CAAA;AACpD,IAAA,MAAM,GAAA,GAAM,CAAA;AACZ,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,GAAG,MAAA,CAAO,IAAA,CAAK,OAAO,GAAG,CAAA;AAC7C,IAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,IAAA,CAAK,aAAa,MAAA,CAAO,IAAA,CAAK,QAAQ,GAAG,CAAA;AAC7D,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAC1E,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA;AAAA,MACd,KAAK,GAAA,CAAI,IAAA,CAAK,eAAe,IAAA,EAAM,MAAA,CAAO,KAAK,MAAM,CAAA;AAAA,MACrD,MAAA,CAAO,KAAK,MAAA,GAAS;AAAA,KACvB;AACA,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACrC,IAAA,KAAA,CAAM,SAAA,GAAY,eAAA;AAClB,IAAA,KAAA,CAAM,YAAA,CAAa,2BAA2B,EAAE,CAAA;AAChD,IAAA,KAAA,CAAM,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,EAAE,CAAA,EAAA,CAAA;AACxB,IAAA,KAAA,CAAM,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,EAAE,CAAA,EAAA,CAAA;AACvB,IAAA,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,EAAA,GAAK,EAAE,CAAC,CAAA,EAAA,CAAA;AAC3C,IAAA,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,EAAA,GAAK,EAAE,CAAC,CAAA,EAAA,CAAA;AAC5C,IAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AACtB,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACnC,IAAA,GAAA,CAAI,SAAA,GAAY,iBAAA;AAChB,IAAA,GAAA,CAAI,YAAA,CAAa,2BAA2B,EAAE,CAAA;AAC9C,IAAA,MAAM,UAAU,MAAA,CAAO,EAAA;AACvB,IAAA,MAAM,EAAA,GAAK,CAAC,MAAA,EAA0B,KAAA,EAAe,MAAc,IAAA,KAAwB;AACzF,MAAA,MAAM,CAAA,GAAI,GAAA,CAAI,aAAA,CAAc,QAAQ,CAAA;AACpC,MAAA,CAAA,CAAE,IAAA,GAAO,QAAA;AACT,MAAA,CAAA,CAAE,KAAA,GAAQ,KAAA;AACV,MAAA,CAAA,CAAE,YAAA,CAAa,cAAc,KAAK,CAAA;AAClC,MAAA,CAAA,CAAE,SAAA,GAAY,mBAAmB,MAAM,CAAA,CAAA;AACvC,MAAA,CAAA,CAAE,SAAA,GAAY,IAAA;AACd,MAAA,IAAI,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,IAAI,CAAA;AACvB,MAAA,CAAA,CAAE,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACjC,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,IAAA,CAAK,EAAE,MAAM,YAAA,EAAc,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,EAAS,MAAA,EAAO,EAAG,CAAA;AAAA,MACtE,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,YAAY,CAAC,CAAA;AAAA,IACnB,CAAA;AACA,IAAA,EAAA,CAAG,MAAA,EAAQ,aAAA,EAAe,IAAA,CAAK,MAAA,EAAQ,aAAa,CAAA;AACpD,IAAA,EAAA,CAAG,WAAA,EAAa,eAAA,EAAiB,IAAA,CAAK,IAAI,CAAA;AAC1C,IAAA,EAAA,CAAG,QAAA,EAAU,eAAA,EAAiB,IAAA,CAAK,KAAK,CAAA;AACxC,IAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AAGpB,IAAA,GAAA,CAAI,OAAA,CAAQ,WAAW,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,WAAA,GAAc,EAAE,CAAC,CAAA;AAChE,IAAA,GAAA,CAAI,OAAA,CAAQ,OAAA,GAAU,MAAA,CAAO,EAAE,CAAA;AAC/B,IAAA,GAAA,CAAI,OAAA,CAAQ,WAAA,GAAc,MAAA,CAAO,EAAA,GAAK,CAAC,CAAA;AACvC,IAAA,sBAAA,CAAuB,IAAI,CAAA;AAAA,EAC7B,CAAA;AAQA,EAAA,MAAM,gBAAA,GAAmB,CAAC,IAAA,EAAmB,SAAA,KAA4B;AACvE,IAAA,MAAM,IAAA,GAAO,YAAY,IAAI,CAAA;AAC7B,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAA,CAAK,aAAA,CAAc,iBAAiB,CAAA,EAAG,MAAA,EAAO;AAC9C,IAAA,IAAA,CAAK,aAAA,CAAc,mBAAmB,CAAA,EAAG,MAAA,EAAO;AAChD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,sBAAA,CAAuB,IAAI,CAAA;AAC3B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAM,IAAA,CAAK,aAAA;AACjB,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACrC,IAAA,KAAA,CAAM,SAAA,GAAY,gBAAA;AAClB,IAAA,KAAA,CAAM,YAAA,CAAa,2BAA2B,EAAE,CAAA;AAChD,IAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AACtB,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACnC,IAAA,GAAA,CAAI,SAAA,GAAY,kBAAA;AAChB,IAAA,GAAA,CAAI,YAAA,CAAa,2BAA2B,EAAE,CAAA;AAC9C,IAAA,MAAM,EAAA,GAAK,CAAC,MAAA,EAA2B,KAAA,EAAe,MAAA,KAA0B;AAC9E,MAAA,MAAM,CAAA,GAAI,GAAA,CAAI,aAAA,CAAc,QAAQ,CAAA;AACpC,MAAA,CAAA,CAAE,IAAA,GAAO,QAAA;AACT,MAAA,CAAA,CAAE,YAAY,CAAA,iBAAA,EAAoB,MAAM,CAAA,EAAG,MAAA,GAAS,eAAe,EAAE,CAAA,CAAA;AACrE,MAAA,CAAA,CAAE,YAAA,CAAa,cAAA,EAAgB,MAAA,GAAS,MAAA,GAAS,OAAO,CAAA;AACxD,MAAA,CAAA,CAAE,WAAA,GAAc,KAAA;AAChB,MAAA,CAAA,CAAE,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACjC,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,IAAA,CAAK,EAAE,MAAM,aAAA,EAAe,OAAA,EAAS,EAAE,SAAA,EAAW,MAAA,IAAU,CAAA;AAAA,MAC9D,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,YAAY,CAAC,CAAA;AAAA,IACnB,CAAA;AACA,IAAA,EAAA,CAAG,gBAAA,EAAkB,mBAAA,EAAqB,YAAA,KAAiB,MAAM,CAAA;AACjE,IAAA,EAAA,CAAG,WAAA,EAAa,cAAA,EAAgB,YAAA,KAAiB,WAAW,CAAA;AAC5D,IAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AAEpB,IAAA,GAAA,CAAI,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,CAAC,IAAA,CAAK,OAAO,GAAA,CAAI,YAAA,IAAgB,EAAA,IAAM,CAAC,CAAC,CAAA,EAAA,CAAA;AAC5D,IAAA,sBAAA,CAAuB,IAAI,CAAA;AAAA,EAC7B,CAAA;AAQA,EAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,EAAmB,SAAA,KAAoC;AAC7E,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAwB;AACtC,MAAA,MAAM,IAAA,GAAO,YAAY,IAAI,CAAA;AAC7B,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,MAAM,QAAA,GAAW,CAAA,CACd,YAAA,EAAa,CACb,IAAA;AAAA,QACC,CAAC,CAAA,KACC,CAAA,YAAa,OAAA,KACZ,CAAA,CAAE,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA,IAAK,CAAA,CAAE,SAAA,CAAU,QAAA,CAAS,kBAAkB,CAAA;AAAA,OAChF;AACF,MAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,QAAA,SAAA,GAAY,QAAA;AACZ,QAAA,gBAAA,CAAiB,MAAM,SAAS,CAAA;AAAA,MAClC;AACA,MAAA,IACE,CAAA,CACG,YAAA,EAAa,CACb,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,YAAa,OAAA,IAAW,CAAA,CAAE,SAAA,CAAU,QAAA,CAAS,iBAAiB,CAAC,CAAA,EAC9E;AACA,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,KAAK,qBAAA,EAAsB;AACxC,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,OAAO,IAAA,CAAK,UAAA;AACvC,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,MAAM,IAAA,CAAK,SAAA;AAItC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,aAAA,CAA2B,kBAAkB,CAAA;AAC9D,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,MAAM,GAAA,GAAM,EAAA;AACZ,QAAA,IACE,KAAK,GAAA,CAAI,UAAA,GAAa,OACtB,CAAA,IAAK,GAAA,CAAI,aAAa,GAAA,CAAI,WAAA,GAAc,OACxC,CAAA,IAAK,GAAA,CAAI,YAAY,EAAA,IACrB,CAAA,IAAK,IAAI,SAAA,GAAY,GAAA,CAAI,eAAe,GAAA,EACxC;AACA,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,MAAM,GAAA,GAAM,CAAA;AACZ,MAAA,MAAM,GAAA,GAAM,UAAA,CAAW,IAAA,EAAM,aAAa,EAAE,IAAA,CAAK,IAAA;AAAA,QAC/C,CAAC,MACC,CAAA,IAAK,CAAA,CAAE,KAAK,IAAA,GAAO,GAAA,IACnB,KAAK,CAAA,CAAE,IAAA,CAAK,QAAQ,GAAA,IACpB,CAAA,IAAK,EAAE,IAAA,CAAK,GAAA,GAAM,OAClB,CAAA,IAAK,CAAA,CAAE,KAAK,MAAA,GAAS;AAAA,OACzB;AACA,MAAA,MAAM,IAAA,GAAO,KAAK,EAAA,IAAM,IAAA;AACxB,MAAA,IAAI,SAAS,UAAA,EAAY;AACzB,MAAA,UAAA,GAAa,IAAA;AACb,MAAA,eAAA,CAAgB,MAAM,SAAS,CAAA;AAAA,IACjC,CAAA;AACA,IAAA,MAAM,UAAU,MAAY;AAC1B,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA,gBAAA,CAAiB,MAAM,SAAS,CAAA;AAAA,MAClC;AACA,MAAA,IAAI,eAAe,IAAA,EAAM;AACzB,MAAA,UAAA,GAAa,IAAA;AACb,MAAA,eAAA,CAAgB,MAAM,SAAS,CAAA;AAAA,IACjC,CAAA;AACA,IAAA,IAAA,CAAK,gBAAA,CAAiB,aAAa,MAAM,CAAA;AACzC,IAAA,IAAA,CAAK,gBAAA,CAAiB,cAAc,OAAO,CAAA;AAC3C,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,mBAAA,CAAoB,aAAa,MAAM,CAAA;AAC5C,MAAA,IAAA,CAAK,mBAAA,CAAoB,cAAc,OAAO,CAAA;AAAA,IAChD,CAAA;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,EAAmB,SAAA,EAAmB,MAAA,KAA8B;AAC1F,IAAA,MAAM,IAAA,GAAO,YAAY,IAAI,CAAA;AAC7B,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,KAAA,MAAW,KAAK,IAAA,CAAK,gBAAA,CAAiB,UAAU,CAAA,IAAK,MAAA,EAAO;AAC5D,IAAA,MAAM,MAAM,IAAA,CAAK,aAAA;AACjB,IAAA,MAAM,GAAA,GAAM,EAAA;AACZ,IAAA,MAAMC,KAAAA,GAAO,CAAA;AAEb,IAAA,MAAM,IAAA,GAAO,CACX,IAAA,EACA,CAAA,EACA,GACA,CAAA,EACA,CAAA,EACA,KAAA,EACA,OAAA,EACA,MAAA,KACS;AACT,MAAA,MAAM,CAAA,GAAI,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACjC,MAAA,CAAA,CAAE,SAAA,GAAY,oBAAoB,IAAI,CAAA,CAAA;AACtC,MAAA,CAAA,CAAE,YAAA,CAAa,2BAA2B,EAAE,CAAA;AAC5C,MAAA,CAAA,CAAE,QAAQ,YAAA,GAAe,MAAA;AACzB,MAAA,CAAA,CAAE,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA;AACnB,MAAA,CAAA,CAAE,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA;AAClB,MAAA,CAAA,CAAE,MAAM,KAAA,GAAQ,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAA,EAAA,CAAA;AACnC,MAAA,CAAA,CAAE,MAAM,MAAA,GAAS,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAA,EAAA,CAAA;AACpC,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,aAAA,CAAc,GAAG,CAAA;AAClC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,aAAA,CAAc,QAAQ,CAAA;AACtC,MAAA,GAAA,CAAI,IAAA,GAAO,QAAA;AACX,MAAA,GAAA,CAAI,KAAA,GAAQ,KAAA;AACZ,MAAA,GAAA,CAAI,YAAA,CAAa,cAAc,KAAK,CAAA;AACpC,MAAA,GAAA,CAAI,WAAA,GAAc,GAAA;AAClB,MAAA,GAAA,CAAI,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACnC,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,IAAA,CAAK,EAAE,MAAM,cAAA,EAAgB,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,EAAS,MAAA,EAAO,EAAG,CAAA;AAAA,MACxE,CAAC,CAAA;AACD,MAAA,CAAA,CAAE,MAAA,CAAO,MAAM,GAAG,CAAA;AAClB,MAAA,IAAA,CAAK,YAAY,CAAC,CAAA;AAAA,IACpB,CAAA;AAEA,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,UAAA,CAAW,MAAM,MAAM,CAAA;AACjD,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACvB,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,IAAA;AAGnC,IAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM;AACvB,MAAA,MAAM,KAAA,GAAQ,IAAI,OAAA,CAAQ,CAAC,GAAG,KAAA,CAAM,CAAC,GAAG,KAAA,CAAM,QAAA;AAC9C,MAAA,IAAI,MAAM,CAAA,EAAG;AACX,QAAA,IAAA;AAAA,UACE,GAAA;AAAA,UACA,OAAA,CAAQ,IAAA;AAAA,UACR,GAAA,CAAI,IAAA,CAAK,GAAA,GAAMA,KAAAA,GAAO,GAAA;AAAA,UACtB,EAAA;AAAA,UACA,GAAA;AAAA,UACA,cAAA;AAAA,UACA,KAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AACvB,QAAA,MAAM,CAAA,GAAA,CAAK,KAAK,IAAA,CAAK,MAAA,GAAS,IAAI,IAAA,CAAK,GAAA,IAAO,IAAI,GAAA,GAAM,CAAA;AACxD,QAAA,IAAA,CAAK,GAAA,EAAK,QAAQ,IAAA,EAAM,CAAA,EAAG,IAAI,GAAA,EAAK,cAAA,EAAgB,OAAO,YAAY,CAAA;AAAA,MACzE;AACA,MAAA,IAAI,CAAA,KAAM,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AACzB,QAAA,IAAA;AAAA,UACE,GAAA;AAAA,UACA,OAAA,CAAQ,IAAA;AAAA,UACR,GAAA,CAAI,KAAK,MAAA,GAASA,KAAAA;AAAA,UAClB,EAAA;AAAA,UACA,GAAA;AAAA,UACA,cAAA;AAAA,UACA,KAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,IAAA,CAAK,MAAA,GAAS,IAAI,IAAA,CAAK,GAAA;AACtC,MAAA,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM;AAC9B,QAAA,MAAM,EAAA,GAAK,GAAA,CAAI,KAAA,CAAM,CAAC,GAAG,KAAA,CAAM,QAAA;AAC/B,QAAA,IAAI,MAAM,CAAA,EAAG;AACX,UAAA,IAAA;AAAA,YACE,GAAA;AAAA,YACA,GAAA,CAAI,IAAA,CAAK,IAAA,GAAOA,KAAAA,GAAO,GAAA;AAAA,YACvB,IAAI,IAAA,CAAK,GAAA;AAAA,YACT,GAAA;AAAA,YACA,EAAA;AAAA,YACA,iBAAA;AAAA,YACA,EAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA;AAC9B,UAAA,MAAM,CAAA,GAAA,CAAK,KAAK,IAAA,CAAK,KAAA,GAAQ,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAI,GAAA,GAAM,CAAA;AACxD,UAAA,IAAA,CAAK,GAAA,EAAK,GAAG,GAAA,CAAI,IAAA,CAAK,KAAK,GAAA,EAAK,EAAA,EAAI,iBAAA,EAAmB,EAAA,EAAI,YAAY,CAAA;AAAA,QACzE;AACA,QAAA,IAAI,CAAA,KAAM,GAAA,CAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AAChC,UAAA,IAAA;AAAA,YACE,GAAA;AAAA,YACA,GAAA,CAAI,KAAK,KAAA,GAAQA,KAAAA;AAAA,YACjB,IAAI,IAAA,CAAK,GAAA;AAAA,YACT,GAAA;AAAA,YACA,EAAA;AAAA,YACA,iBAAA;AAAA,YACA,EAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAIA,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,KAAA,MAAW,GAAA,IAAO,IAAI,OAAA,EAAS;AAC7B,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,IAAA,CAAK,KAAA,GAAQ,IAAI,IAAA,CAAK,IAAA;AACpC,QAAA,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,EAAA,EAAI,CAAA,KAAM;AAC3B,UAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAC5B,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,MAAM,CAAA,GAAI,MAAA,CAAO,EAAA,CAAG,EAAE,CAAA;AACtB,YAAA,MAAM,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AACxB,YAAA,MAAM,KAAK,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,GAAA,IAAO,IAAI,GAAA,GAAM,CAAA;AACzC,YAAA,IAAA;AAAA,cACE,GAAA;AAAA,cACA,IAAI,IAAA,CAAK,IAAA;AAAA,cACT,CAAA;AAAA,cACA,CAAA;AAAA,cACA,GAAA;AAAA,cACA,gBAAA;AAAA,cACA,GAAG,KAAA,CAAM,QAAA;AAAA,cACT;AAAA,aACF;AAAA,UACF,CAAA,MAAA,IAAW,GAAA,CAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAK,GAAA,CAAI,IAAA,CAAK,MAAA,GAAS,GAAA,CAAI,IAAA,CAAK,MAAA,GAAS,GAAA,EAAK;AAC5E,YAAA,IAAA;AAAA,cACE,GAAA;AAAA,cACA,IAAI,IAAA,CAAK,IAAA;AAAA,cACT,GAAA,CAAI,KAAK,MAAA,GAASA,KAAAA;AAAA,cAClB,CAAA;AAAA,cACA,GAAA;AAAA,cACA,gBAAA;AAAA,cACA,GAAG,KAAA,CAAM,QAAA;AAAA,cACT;AAAA,aACF;AAAA,UACF;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAA;AAWA,EAAA,MAAM,eAAA,GAAkB,CAAC,IAAA,EAAmB,SAAA,KAAoC;AAC9E,IAAA,IAAI,MAAA,GAA0C,IAAA;AAC9C,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAwB;AACtC,MAAA,MAAA,GAAS,EAAE,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,CAAA,EAAG,EAAE,OAAA,EAAQ;AAAA,IACxC,CAAA;AACA,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAwB;AACvC,MAAA,MAAM,IAAA,GAAO,EAAE,YAAA,EAAa;AAC5B,MAAA,IACE,IAAA,CAAK,IAAA;AAAA,QACH,CAAC,MACC,CAAA,YAAa,OAAA,KACZ,EAAE,SAAA,CAAU,QAAA,CAAS,mBAAmB,CAAA,IACvC,CAAA,CAAE,SAAA,CAAU,SAAS,iBAAiB,CAAA,IACtC,EAAE,SAAA,CAAU,QAAA,CAAS,kBAAkB,CAAA,IACvC,CAAA,CAAE,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA;AAAA,OACpC,EACA;AACA,QAAA;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,YAAa,OAAA,IAAW,CAAA,CAAE,SAAA,CAAU,QAAA,CAAS,UAAU,CAAC,CAAA;AACxF,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,IAAI,MAAA,IAAU,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAA,EAAG,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA,EAAG;AAC1E,MAAA,MAAM,UAAU,IAAA,CAAK,IAAA;AAAA,QACnB,CAAC,CAAA,KAAwB,CAAA,YAAa,eAAe,CAAC,CAAC,EAAE,OAAA,CAAQ;AAAA,OACnE;AACA,MAAA,IAAI,OAAA,EAAS;AAEX,QAAA,IAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,YAAa,WAAW,CAAA,CAAE,OAAA,CAAQ,WAAW,CAAC,CAAA,EAAG;AACpE,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,QACpB;AACA,QAAA,eAAA,GAAkB,OAAA,CAAQ,QAAQ,UAAA,IAAc,IAAA;AAChD,QAAA,mBAAA,CAAoB,MAAM,SAAS,CAAA;AACnC,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,IAAA,CAAK,EAAE,MAAM,eAAA,EAAiB,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,EAAS,eAAA,EAAgB,EAAG,CAAA;AAAA,QAClF;AACA,QAAA;AAAA,MACF;AACA,MAAA,MAAM,cAAc,IAAA,CAAK,IAAA;AAAA,QACvB,CAAC,CAAA,KACC,CAAA,YAAa,OAAA,IACb,CAAA,CAAE,QAAQ,8DAA8D;AAAA,OAC5E;AACA,MAAA,IAAI,WAAA,EAAa;AACjB,MAAA,eAAA,GAAkB,IAAA;AAClB,MAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,MAAA,eAAA,CAAgB,MAAM,SAAS,CAAA;AAC/B,MAAA,IAAA,CAAK,EAAE,IAAA,EAAM,cAAA,EAAgB,SAAS,EAAE,SAAA,IAAa,CAAA;AAAA,IACvD,CAAA;AACA,IAAA,IAAA,CAAK,gBAAA,CAAiB,WAAA,EAAa,MAAA,EAAQ,IAAI,CAAA;AAC/C,IAAA,IAAA,CAAK,gBAAA,CAAiB,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AAC5C,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,mBAAA,CAAoB,WAAA,EAAa,MAAA,EAAQ,IAAI,CAAA;AAClD,MAAA,IAAA,CAAK,mBAAA,CAAoB,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AAAA,IACjD,CAAA;AAAA,EACF,CAAA;AAcA,EAAA,MAAM,cAAA,GAAiB,CAAC,SAAA,EAAmB,OAAA,KAA2C;AACpF,IAAA,MAAM,QAAQ,KAAA,CAAM,IAAA;AAAA,MAClB,SAAS,gBAAA,CAA8B,CAAA,CAAA,EAAI,cAAc,CAAA,EAAA,EAAK,OAAO,CAAA,EAAA,CAAI;AAAA,KAC3E;AACA,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,IAAA,MAAM,GAAA,GAAM,QAAA;AACZ,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACnC,IAAA,GAAA,CAAI,YAAA,CAAa,2BAA2B,EAAE,CAAA;AAC9C,IAAA,GAAA,CAAI,MAAM,OAAA,GAAU,kEAAA;AACpB,IAAA,GAAA,CAAI,MAAM,OAAA,GAAU,MAAA;AACpB,IAAA,MAAM,SAAS,GAAA,CAAI,YAAA,CAAa,EAAE,IAAA,EAAM,QAAQ,CAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,aAAA,CAAc,OAAO,CAAA;AACvC,IAAA,KAAA,CAAM,WAAA,GAAc,YAAA;AACpB,IAAA,MAAA,CAAO,YAAY,KAAK,CAAA;AACxB,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACrC,IAAA,KAAA,CAAM,SAAA,GAAY,iBAAA;AAClB,IAAA,KAAA,CAAM,MAAM,QAAA,GAAW,OAAA;AACvB,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACnC,IAAA,GAAA,CAAI,SAAA,GAAY,mBAAA;AAChB,IAAA,GAAA,CAAI,MAAM,QAAA,GAAW,OAAA;AACrB,IAAA,MAAM,KAAK,CAAC,MAAA,EAA4B,KAAA,EAAe,IAAA,EAAc,UAAU,IAAA,KAAe;AAC5F,MAAA,MAAM,CAAA,GAAI,GAAA,CAAI,aAAA,CAAc,QAAQ,CAAA;AACpC,MAAA,CAAA,CAAE,IAAA,GAAO,QAAA;AACT,MAAA,CAAA,CAAE,KAAA,GAAQ,KAAA;AACV,MAAA,CAAA,CAAE,YAAA,CAAa,cAAc,KAAK,CAAA;AAClC,MAAA,CAAA,CAAE,SAAA,GAAY,qBAAqB,MAAM,CAAA,CAAA;AACzC,MAAA,CAAA,CAAE,SAAA,GAAY,IAAA;AACd,MAAA,CAAA,CAAE,WAAW,CAAC,OAAA;AACd,MAAA,CAAA,CAAE,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACjC,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,IAAA,CAAK,EAAE,MAAM,cAAA,EAAgB,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,EAAS,MAAA,EAAO,EAAG,CAAA;AAAA,MACxE,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,YAAY,CAAC,CAAA;AAAA,IACnB,CAAA;AACA,IAAA,EAAA,CAAG,MAAA,EAAQ,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAChC,IAAA,EAAA,CAAG,WAAA,EAAa,UAAA,EAAY,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAC5C,IAAA,EAAA,CAAG,QAAA,EAAU,UAAA,EAAY,IAAA,CAAK,KAAK,CAAA;AACnC,IAAA,EAAA,CAAG,WAAA,EAAa,sBAAA,EAAwB,SAAA,CAAU,IAAA,EAAM,KAAK,CAAA;AAC7D,IAAA,EAAA,CAAG,YAAA,EAAc,oBAAA,EAAsB,SAAA,CAAU,KAAA,EAAO,KAAK,CAAA;AAC7D,IAAA,KAAA,CAAM,MAAM,OAAA,GAAU,MAAA;AACtB,IAAA,GAAA,CAAI,MAAM,OAAA,GAAU,MAAA;AAGpB,IAAA,MAAM,GAAA,GAAM,EAAA;AACZ,IAAA,MAAMA,KAAAA,GAAO,CAAA;AACb,IAAA,MAAM,GAAA,GAAM,CAAC,IAAA,EAAiB,KAAA,EAAe,MAAA,KAA2C;AACtF,MAAA,MAAM,CAAA,GAAI,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACjC,MAAA,CAAA,CAAE,SAAA,GAAY,oBAAoB,IAAI,CAAA,CAAA;AACtC,MAAA,CAAA,CAAE,MAAM,QAAA,GAAW,OAAA;AACnB,MAAA,CAAA,CAAE,QAAQ,YAAA,GAAe,MAAA;AACzB,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,aAAA,CAAc,GAAG,CAAA;AAClC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,aAAA,CAAc,QAAQ,CAAA;AACtC,MAAA,GAAA,CAAI,IAAA,GAAO,QAAA;AACX,MAAA,GAAA,CAAI,KAAA,GAAQ,KAAA;AACZ,MAAA,GAAA,CAAI,YAAA,CAAa,cAAc,KAAK,CAAA;AACpC,MAAA,GAAA,CAAI,WAAA,GAAc,GAAA;AAClB,MAAA,GAAA,CAAI,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACnC,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,IAAA,CAAK,EAAE,MAAM,cAAA,EAAgB,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,EAAS,MAAA,EAAO,EAAG,CAAA;AAAA,MACxE,CAAC,CAAA;AACD,MAAA,CAAA,CAAE,MAAA,CAAO,MAAM,GAAG,CAAA;AAClB,MAAA,OAAO,CAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,cAAA,EAAgB,YAAY,CAAA;AAAA,MAC1C,MAAA,EAAQ,GAAA,CAAI,GAAA,EAAK,cAAA,EAAgB,WAAW,CAAA;AAAA,MAC5C,IAAA,EAAM,GAAA,CAAI,GAAA,EAAK,iBAAA,EAAmB,YAAY,CAAA;AAAA,MAC9C,KAAA,EAAO,GAAA,CAAI,GAAA,EAAK,iBAAA,EAAmB,WAAW;AAAA,KAChD;AACA,IAAA,MAAA,CAAO,MAAA,CAAO,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,KAAK,MAAA,EAAQ,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,KAAK,CAAA;AACtE,IAAA,GAAA,CAAI,IAAA,CAAK,YAAY,GAAG,CAAA;AACxB,IAAA,GAAA,CAAI,MAAM,OAAA,GAAU,EAAA;AAEpB,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,MAAM,QAAQ,CAACN,GAAAA,EAAiB,CAAA,EAAW,CAAA,EAAW,GAAW,CAAA,KAAoB;AACnF,MAAAA,GAAAA,CAAG,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA;AACpB,MAAAA,GAAAA,CAAG,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA;AACnB,MAAAA,GAAAA,CAAG,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA;AACrB,MAAAA,GAAAA,CAAG,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA;AAAA,IACxB,CAAA;AACA,IAAA,MAAM,aAAa,MAAY;AAC7B,MAAA,MAAM,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAC9C,MAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACvB,MAAA,IAAI,IAAI,MAAA,CAAO,iBAAA;AACf,MAAA,IAAI,IAAI,MAAA,CAAO,iBAAA;AACf,MAAA,IAAI,IAAI,MAAA,CAAO,iBAAA;AACf,MAAA,IAAI,IAAI,MAAA,CAAO,iBAAA;AACf,MAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,QAAA,MAAM,EAAA,GAAK,EAAE,qBAAA,EAAsB;AACnC,QAAA,IAAI,EAAA,CAAG,KAAA,KAAU,CAAA,IAAK,EAAA,CAAG,WAAW,CAAA,EAAG;AACvC,QAAA,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,EAAA,CAAG,IAAI,CAAA;AACvB,QAAA,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,EAAA,CAAG,GAAG,CAAA;AACtB,QAAA,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,EAAA,CAAG,KAAK,CAAA;AACxB,QAAA,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,EAAA,CAAG,MAAM,CAAA;AAAA,MAC3B;AACA,MAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG;AACzB,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EAAG,CAAA,GAAIM,QAAO,GAAA,EAAK,CAAA,GAAI,GAAG,GAAG,CAAA;AAC7C,MAAA,KAAA,CAAM,KAAK,MAAA,EAAQ,CAAA,EAAG,IAAIA,KAAAA,EAAM,CAAA,GAAI,GAAG,GAAG,CAAA;AAC1C,MAAA,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,GAAIA,KAAAA,GAAO,KAAK,CAAA,EAAG,GAAA,EAAK,IAAI,CAAC,CAAA;AAC9C,MAAA,KAAA,CAAM,KAAK,KAAA,EAAO,CAAA,GAAIA,OAAM,CAAA,EAAG,GAAA,EAAK,IAAI,CAAC,CAAA;AACzC,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,KAAA,CAAM,OAAO,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAC/B,MAAA,MAAM,EAAA,GAAK,IAAI,YAAA,IAAgB,SAAA;AAC/B,MAAA,MAAM,KAAK,GAAA,CAAI,WAAA;AACf,MAAA,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,GAAI,EAAE,CAAC,CAAA,EAAA,CAAA;AACvC,MAAA,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,GAAI,EAAA,GAAK,CAAC,CAAC,CAAA,EAAA,CAAA;AAAA,IAC5C,CAAA;AACA,IAAA,MAAM,MAAA,GAAS,CAAC,EAAA,KAA4B;AAC1C,MAAA,OAAA,GAAU,EAAA,KAAO,OAAA;AACjB,MAAA,KAAA,CAAM,KAAA,CAAM,OAAA,GAAU,OAAA,GAAU,EAAA,GAAK,MAAA;AACrC,MAAA,GAAA,CAAI,KAAA,CAAM,OAAA,GAAU,OAAA,GAAU,EAAA,GAAK,MAAA;AACnC,MAAA,UAAA,EAAW;AAAA,IACb,CAAA;AACA,IAAA,UAAA,EAAW;AACX,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAwB;AACvC,MAAA,MAAM,IAAA,GAAO,EAAE,YAAA,EAAa;AAC5B,MAAA,IAAI,CAAC,MAAM,IAAA,CAAK,CAAC,MAAM,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AAE1C,MAAA,IAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,YAAa,WAAW,CAAA,CAAE,OAAA,CAAQ,WAAW,CAAC,CAAA,EAAG;AACpE,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,MACpB;AACA,MAAA,eAAA,GAAkB,OAAA;AAClB,MAAA,MAAA,CAAO,OAAO,CAAA;AACd,MAAA,IAAA,CAAK,EAAE,MAAM,eAAA,EAAiB,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,IAAW,CAAA;AAAA,IACjE,CAAA;AACA,IAAA,GAAA,CAAI,gBAAA,CAAiB,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AAC3C,IAAA,MAAA,CAAO,gBAAA,CAAiB,QAAA,EAAU,UAAA,EAAY,IAAI,CAAA;AAClD,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,UAAU,CAAA;AAC5C,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,QAAQ,MAAM;AACZ,QAAA,GAAA,CAAI,mBAAA,CAAoB,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AAC9C,QAAA,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,UAAA,EAAY,IAAI,CAAA;AACrD,QAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,UAAU,CAAA;AAC/C,QAAA,GAAA,CAAI,MAAA,EAAO;AAAA,MACb;AAAA,KACF;AAAA,EACF,CAAA;AAMA,EAAA,MAAM,iBAAA,GAAoB,CAAC,GAAA,KAA4D;AAMrF,IAAA,MAAM,OAAA,GAAU,CAAC,GAAA,CAAI,YAAA;AACrB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,oBAAA,EAAqB;AACrB,MAAA,kBAAA,EAAmB;AACnB,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,gBAAA,GAAmB,KAAA;AAAA,IACrB;AACA,IAAA,WAAA,GAAc,UAAU,EAAE,GAAG,GAAA,EAAK,YAAA,EAAc,MAAK,GAAI,GAAA;AACzD,IAAA,IAAI,CAAC,kBAAA,CAAmB,GAAG,CAAA,EAAG;AAC5B,MAAA,kBAAA,EAAmB;AACnB,MAAA,eAAA,EAAgB;AAChB,MAAA,iBAAA,CAAkB;AAAA,QAChB,KAAA,EAAO,eAAA;AAAA,QACP,OAAA,EAAS,WAAA,CAAY,GAAG,CAAA,EAAG,cAAc,OAAA,IAAW;AAAA,OACrD,CAAA;AACD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,KAAA,CAAM,eAAA,EAAiB,OAAA;AAC3C,IAAA,IAAI,CAAC,OAAA,IAAW,WAAA,IAAe,WAAW,CAAC,eAAA,CAAgB,OAAO,CAAA,EAAG;AACnE,MAAA,kBAAA,EAAmB;AACnB,MAAA,eAAA,EAAgB;AAChB,MAAA,iBAAA,CAAkB,EAAE,KAAA,EAAO,iBAAA,EAAmB,OAAA,EAA0C,CAAA;AACxF,MAAA;AAAA,IACF;AACA,IAAA,YAAA,CAAa,WAAW,CAAA;AAAA,EAC1B,CAAA;AAEA,EAAA,MAAM,uBAAuB,MAAY;AACvC,IAAA,cAAA,IAAiB;AACjB,IAAA,cAAA,GAAiB,IAAA;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,qBAAqB,MAAY;AACrC,IAAA,IAAI,YAAA,eAA2B,YAAY,CAAA;AAC3C,IAAA,YAAA,GAAe,IAAA;AAAA,EACjB,CAAA;AAMA,EAAA,MAAM,iBAAA,GAAoB,CAAC,QAAA,EAAkB,OAAA,KAA2C;AACtF,IAAA,oBAAA,EAAqB;AACrB,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAmB;AACjC,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,IAAI,EAAE,kBAAkB,OAAA,CAAA,EAAU;AAClC,MAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,sEAAsE,CAAA,EAAG;AAC1F,QAAA;AAAA,MACF;AACA,MAAA,IAAI;AACF,QAAA,IAAI,CAAC,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAAA,MACjC,CAAA,CAAA,MAAQ;AACN,QAAA;AAAA,MACF;AACA,MAAA,oBAAA,EAAqB;AACrB,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,gBAAA,GAAmB,KAAA;AACnB,MAAA,IAAI,WAAA,oBAA+B,WAAW,CAAA;AAAA,IAChD,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,MAAA,EAAQ,IAAI,CAAA;AAC/C,IAAA,IAAI,YAAY,UAAA,EAAY,QAAA,CAAS,gBAAA,CAAiB,WAAA,EAAa,QAAQ,IAAI,CAAA;AAC/E,IAAA,cAAA,GAAiB,MAAM;AACrB,MAAA,QAAA,CAAS,mBAAA,CAAoB,OAAA,EAAS,MAAA,EAAQ,IAAI,CAAA;AAClD,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,MAAA,EAAQ,IAAI,CAAA;AAAA,IACxD,CAAA;AACA,IAAA,iBAAA,CAAkB,EAAE,KAAA,EAAO,iBAAA,EAAmB,OAAA,EAAS,UAAU,CAAA;AAAA,EACnE,CAAA;AAOA,EAAA,MAAM,eAAA,GAAkB,CAAC,OAAA,KAA0B;AACjD,IAAA,kBAAA,EAAmB;AACnB,IAAA,YAAA,GAAe,WAAW,MAAM;AAC9B,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,IAAI,WAAA,oBAA+B,WAAW,CAAA;AAAA,IAChD,GAAG,OAAO,CAAA;AACV,IAAA,iBAAA,CAAkB,EAAE,KAAA,EAAO,eAAA,EAAiB,OAAA,EAAS,CAAA;AAAA,EACvD,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,GAAA,KAA4D;AAIhF,IAAA,IAAI,IAAI,QAAA,IAAY,CAAC,WAAA,IAAe,eAAA,CAAgB,GAAG,CAAA,EAAG;AACxD,MAAA,gBAAA,GAAmB,GAAA,CAAI,MAAM,cAAA,IAAkB,CAAA;AAC/C,MAAA;AAAA,IACF;AACA,IAAA,kBAAA,EAAmB;AACnB,IAAA,gBAAA,GAAmB,GAAA,CAAI,MAAM,cAAA,IAAkB,CAAA;AAI/C,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,eAAA;AACxB,IAAA,MAAM,OAAO,KAAA,EAAO,OAAA;AACpB,IAAA,MAAM,GAAA,GAAM,KAAA,EAAO,QAAA,EAAU,IAAA,EAAK;AAKlC,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,YAAA,IAAgB,CAAC,YAAA,IAAgB,WAAA;AAIlD,IAAA,MAAM,cAAA,GAAA,CACH,SAAS,UAAA,IAAc,IAAA,KAAS,gBAChC,CAAC,qBAAA,CAAsB,KAAK,CAAA,IAAK,gBAAA,CAAA;AACpC,IAAA,IAAI,IAAA,IAAQ,kBAAkB,GAAA,EAAK;AACjC,MAAA,kBAAA,EAAmB;AACnB,MAAA,iBAAA,EAAkB;AAClB,MAAA,iBAAA,CAAkB,KAAK,IAAI,CAAA;AAC3B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,kBAAkB,KAAK,CAAA;AACvC,IAAA,IAAI,IAAA,IAAQ,UAAU,CAAA,EAAG;AACvB,MAAA,oBAAA,EAAqB;AACrB,MAAA,iBAAA,EAAkB;AAElB,MAAA,IAAI,CAAC,YAAA,EAAc,eAAA,CAAgB,OAAO,CAAA;AAC1C,MAAA;AAAA,IACF;AACA,IAAA,oBAAA,EAAqB;AACrB,IAAA,kBAAA,EAAmB;AACnB,IAAA,MAAM,gBAAgB,sBAAA,EAAuB;AAC7C,IAAA,MAAM,SAAS,YAAA,CAAa;AAAA,MAC1B,GAAG,GAAA,CAAI,KAAA;AAAA,MACP,GAAI,aAAA,GAAgB,EAAE,aAAA,KAAkB,EAAC;AAAA,MACzC,UAAU,MAAM;AAEd,QAAA,kBAAA,EAAmB;AACnB,QAAA,YAAA,GAAe,IAAA;AACf,QAAA,YAAA,GAAe,KAAA;AACf,QAAA,gBAAA,GAAmB,IAAA;AAKnB,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,MAAM,CAAA,GAAI,aAAa,KAAA,CAAM,eAAA;AAC7B,UAAA,MAAM,IAAI,CAAA,EAAG,OAAA;AACb,UAAA,MAAM,QAAA,GAAW,CAAA,EAAG,QAAA,EAAU,IAAA,EAAK;AACnC,UAAA,IAAA,CAAK,MAAM,UAAA,IAAc,CAAA,KAAM,eAAe,QAAA,EAAU,iBAAA,CAAkB,UAAU,CAAC,CAAA;AAAA,QACvF;AAAA,MACF;AAAA,KACD,CAAA;AACD,IAAA,IAAI,IAAI,YAAA,EAAc,iBAAA,CAAkB,EAAE,KAAA,EAAO,SAAS,CAAA;AAE1D,IAAA,IAAI,CAAC,GAAA,CAAI,QAAA,IAAY,WAAA,EAAa;AAClC,IAAA,KAAK,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,CAAC,MAAA,KAAW;AACjC,MAAA,IAAI,CAAC,OAAO,QAAA,EAAU;AACtB,MAAA,MAAM,IAAA,GAAO,OAAO,IAAA,EAAK;AACzB,MAAA,IAAI,CAAC,IAAA,EAAM;AAGT,QAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,cAAA,IAAkB,CAAA;AACxC,QAAA,MAAM,OAAQ,GAAA,CAAI,KAAA,CAAM,WAA0C,GAAG,CAAA,EAAG,SAAS,CAAC,CAAA;AAClF,QAAA,IAAI,IAAA,EAAM,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,QAAA,EAAU;AAC1C,UAAA,QAAA,GAAW,cAAA,CAAe,GAAA,EAAK,IAAA,CAAK,QAAQ,CAAA;AAC5C,UAAA,QAAA,EAAU,OAAO,eAAe,CAAA;AAAA,QAClC;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,SAAA,CAAU,IAAI,aAAa,CAAA;AAChC,MAAA,YAAA,GAAe,GAAA;AACf,MAAA,SAAA,GAAY,eAAA,CAAgB,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,kBAAkB,CAAC,CAAA;AAC/D,MAAA,MAAM,UAAA,GACH,GAAA,CAAI,KAAA,CAAM,UAAA,CAA0C,GAAA,CAAI,MAAM,cAAA,IAAkB,CAAC,CAAA,EAC9E,MAAA,IAAU,EAAC;AACjB,MAAA,aAAA,GAAgB,UAAA;AAChB,MAAA,mBAAA,CAAoB,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,cAAA,IAAkB,CAAC,CAAA;AACvD,MAAA,cAAA,CAAe,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,cAAA,IAAkB,GAAG,UAAU,CAAA;AAC9D,MAAA,QAAA,GAAW,cAAA,CAAe,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,kBAAkB,CAAC,CAAA;AAC7D,MAAA,WAAA,GAAc,uBAAA,CAAwB;AAAA,QACpC,IAAA;AAAA,QACA,SAAA,EAAW,IAAI,KAAA,CAAM,SAAA;AAAA,QACrB,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,cAAA,IAAkB,CAAA;AAAA,QACvC,QAAA,EAAU,CAAC,OAAA,KAAY,IAAA,CAAK,EAAE,IAAA,EAAM,gBAAA,EAAkB,SAAS,CAAA;AAAA,QAC/D,cAAc,MAAM;AAClB,UAAA,IAAI,CAAC,cAAA,EAAgB;AACrB,UAAA,MAAM,MAAA,GAAS,cAAA;AACf,UAAA,cAAA,GAAiB,IAAA;AACjB,UAAA,iBAAA,CAAkB,MAAM,CAAA;AAAA,QAC1B;AAAA,OACD,CAAA;AAED,MAAA,UAAA,GAAa,qBAAA,CAAsB;AAAA,QACjC,IAAA;AAAA,QACA,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,cAAA,IAAkB,CAAA;AAAA,QACvC,MAAA,EAAQ,CAAC,OAAA,KAAY,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,SAAS;AAAA,OAC7D,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,gBAAgB,MAAY;AAChC,IAAA,SAAA,EAAW,MAAA,EAAO;AAClB,IAAA,SAAA,GAAY,IAAA;AAAA,EACd,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,EAAW,CAAA,EAAW,KAAA,KAAwB;AACnE,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,SAAA,GAAY,QAAA,CAAS,cAAc,KAAK,CAAA;AACxC,MAAA,SAAA,CAAU,MAAM,OAAA,GACd,6OAAA;AAGF,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,SAAS,CAAA;AAAA,IACrC;AACA,IAAA,SAAA,CAAU,WAAA,GAAc,KAAA;AACxB,IAAA,SAAA,CAAU,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,CAAA,GAAI,EAAE,CAAA,EAAA,CAAA;AAChC,IAAA,SAAA,CAAU,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,CAAA,GAAI,EAAE,CAAA,EAAA,CAAA;AAAA,EACjC,CAAA;AAMA,EAAA,MAAM,eAAA,GAAkB,CAAC,GAAA,KAA+D;AACtF,IAAA,MAAM,IAAA,GAAO,OAAO,SAAA,EAAU;AAC9B,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,UAAA,EAAY;AACxB,MAAA,IAAI,GAAA,CAAI,KAAA,KAAU,MAAA,EAAQ,aAAA,EAAc;AACxC,MAAA,UAAA,EAAY,WAAA,EAAY;AACxB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,GAAO,GAAA,CAAI,CAAA;AAC1B,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAA;AACzB,IAAA,IAAI,GAAA,CAAI,UAAU,MAAA,EAAQ;AACxB,MAAA,aAAA,CAAc,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,KAAA,IAAS,IAAI,SAAS,CAAA;AAC9C,MAAA,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAC,CAAA;AACvB,MAAA;AAAA,IACF;AACA,IAAA,aAAA,EAAc;AACd,IAAA,IAAI,GAAA,CAAI,UAAU,QAAA,EAAU;AAC1B,MAAA,UAAA,CAAW,WAAA,EAAY;AACvB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA;AACrC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,CAAK;AAAA,QACH,IAAA,EAAM,eAAA;AAAA,QACN,OAAA,EAAS,EAAE,SAAA,EAAW,gBAAA,EAAkB,WAAW,GAAA,CAAI,SAAA,EAAW,GAAG,MAAA;AAAO,OAC7E,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,GAAA,KAA8B;AACnD,IAAA,QAAQ,IAAI,IAAA;AAAM,MAChB,KAAK,aAAA;AAGH,QAAA,IAAA,CAAK,MAAA,GAAS,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,MAAK,GAAI,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AACjE,QAAA;AAAA,MACF,KAAK,cAAA;AACH,QAAA,MAAA,EAAQ,QAAA,CAAS,IAAI,KAAK,CAAA;AAC1B,QAAA,IAAI,YAAA,KAAiB,GAAA,CAAI,KAAA,CAAM,OAAA,EAAS;AACtC,UAAA,YAAA,GAAe,IAAI,KAAA,CAAM,OAAA;AAEzB,UAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAA2B,kBAAkB,CAAA;AAChE,UAAA,IAAI,KAAK,SAAA,IAAa,CAAC,WAAA,EAAa,gBAAA,CAAiB,GAAG,gBAAgB,CAAA;AAAA,QAC1E;AACA,QAAA,KAAA,EAAO,QAAA;AAAA,UACL,IAAI,KAAA,CAAM,UAAA,KACP,GAAA,CAAI,KAAA,CAAM,YAAY,YAAA,GACnB,0BAAA,GACA,GAAA,CAAI,KAAA,CAAM,YAAY,OAAA,GACpB,kBAAA,GACA,IAAI,KAAA,CAAM,OAAA,KAAY,WACpB,+BAAA,GACA,GAAA,CAAI,KAAA,CAAM,OAAA,KAAY,QACpB,aAAA,GACA,GAAA,CAAI,KAAA,CAAM,UAAA,GACR,eAAY,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA,CAAA,GAC/B,IAAI,KAAA,CAAM,KAAA,CAAM,IAAI,KAAA,CAAM,UAAU,GAAG,KAAA,IAAS,MAAA;AAAA,SACjE;AACA,QAAA;AAAA,MACF,KAAK,kBAAA;AACH,QAAA,KAAA,EAAO,UAAA,CAAW,IAAI,OAAO,CAAA;AAC7B,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,KAAA,EAAO,OAAA,CAAQ,IAAI,IAAI,CAAA;AACvB,QAAA;AAAA,MACF,KAAK,cAAA,EAAgB;AACnB,QAAA,MAAA,EAAQ,IAAA,EAAK;AAGb,QAAA,MAAM,aAAA,GAAgB,KAAA,EAAO,SAAA,EAAU,IAAK,KAAA;AAC5C,QAAA,IAAI,aAAA,EAAe,KAAA,EAAO,UAAA,CAAW,KAAK,CAAA;AAC1C,QAAA,MAAA,EAAQ,UAAU,IAAI,CAAA;AAGtB,QAAA,MAAM,gBAAA,GAAmB,WAAA;AACzB,QAAA,IAAI,gBAAA,EAAkB;AACpB,UAAA,kBAAA,EAAmB;AACnB,UAAA,iBAAA,EAAkB;AAAA,QACpB;AACA,QAAA,MAAM,eAAe,MAAY;AAC/B,UAAA,MAAA,EAAQ,UAAU,KAAK,CAAA;AACvB,UAAA,IAAI,aAAA,EAAe,KAAA,EAAO,UAAA,CAAW,IAAI,CAAA;AACzC,UAAA,IAAI,gBAAA,IAAoB,gBAAgB,gBAAA,EAAkB;AACxD,YAAA,iBAAA,CAAkB,gBAAgB,CAAA;AAAA,UACpC;AAAA,QACF,CAAA;AACA,QAAA,MAAA,GAAS,kBAAA,CAAmB;AAAA,UAC1B,MAAA,EAAQ,CAAC,OAAA,KAAY;AACnB,YAAA,MAAA,GAAS,IAAA;AACT,YAAA,YAAA,EAAa;AACb,YAAA,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,CAAA;AAAA,UAClC,CAAA;AAAA,UACA,UAAU,MAAM;AACd,YAAA,MAAA,GAAS,IAAA;AACT,YAAA,YAAA,EAAa;AACb,YAAA,IAAA,CAAK,EAAE,IAAA,EAAM,gBAAA,EAAkB,CAAA;AAAA,UACjC,CAAA;AAAA,UACA,GAAI,IAAI,YAAA,KAAiB,MAAA,GAAY,EAAE,YAAA,EAAc,GAAA,CAAI,YAAA,EAAa,GAAI,EAAC;AAAA,UAC3E,GAAI,IAAI,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAK,GAAI,EAAC;AAAA,UACnD,GAAI,IAAI,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAK,GAAI;AAAC,SACpD,CAAA;AACD,QAAA;AAAA,MACF;AAAA,MACA,KAAK,aAAA;AACH,QAAA,MAAA,EAAQ,IAAA,EAAK;AACb,QAAA,MAAA,GAAS,IAAA;AACT,QAAA,MAAA,EAAQ,UAAU,KAAK,CAAA;AACvB,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,IAAA,CAAK,EAAE,MAAM,WAAA,EAAa,OAAA,EAAS,SAAS,GAAA,CAAI,SAAS,GAAG,CAAA;AAC5D,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,YAAA,CAAa,IAAI,QAAQ,CAAA;AACzB,QAAA;AAAA,MACF,KAAK,mBAAA;AACH,QAAA,gBAAA,CAAiB,IAAI,OAAO,CAAA;AAC5B,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,IAAI,CAAC,IAAI,KAAA,EAAO;AAGhB,QAAA,IAAI,WAAA,EAAa,UAAA,EAAW,EAAG,cAAA,GAAiB,GAAA;AAAA,+BACzB,GAAG,CAAA;AAC1B,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,eAAA,CAAgB,GAAG,CAAA;AACnB,QAAA;AAAA,MACF,KAAK,cAAA,EAAgB;AACnB,QAAA,eAAA,GAAkB,GAAA,CAAI,OAAA;AACtB,QAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAA2B,kBAAkB,CAAA;AAChE,QAAA,IAAI,CAAA,IAAK,CAAC,WAAA,EAAa,mBAAA,CAAoB,GAAG,gBAAgB,CAAA;AAC9D,QAAA,IAAI,CAAC,WAAA,EAAa,QAAA,EAAU,MAAA,CAAO,IAAI,OAAO,CAAA;AAC9C,QAAA;AAAA,MACF;AAAA,MACA,KAAK,YAAA,EAAc;AACjB,QAAA,aAAA,GAAgB,GAAA,CAAI,OAAA;AACpB,QAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAA2B,kBAAkB,CAAA;AAChE,QAAA,IAAI,CAAA,IAAK,CAAC,WAAA,EAAa,eAAA,CAAgB,GAAG,gBAAgB,CAAA;AAC1D,QAAA;AAAA,MACF;AAAA,MACA,KAAK,eAAA;AACH,QAAA,kBAAA,EAAmB;AACnB,QAAA,aAAA,EAAc;AACd,QAAA,cAAA,GAAiB,IAAA;AACjB,QAAA,WAAA,GAAc,IAAA;AACd,QAAA,oBAAA,EAAqB;AACrB,QAAA,kBAAA,EAAmB;AACnB,QAAA,YAAA,GAAe,KAAA;AACf,QAAA,gBAAA,GAAmB,KAAA;AACnB,QAAA,iBAAA,EAAkB;AAClB,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,QAAA,EAAS;AACT,QAAA;AAAA;AACJ,EACF,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAA8B;AAC/C,IAAA,IAAI,KAAA,CAAM,WAAW,eAAA,EAAiB;AACtC,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,WAAW,kBAAA,IAAsB,IAAA,CAAK,UAAU,KAAA,EAAO;AACzE,IAAA,aAAA,CAAc,IAAsB,CAAA;AAAA,EACtC,CAAA;AAEA,EAAA,MAAM,aAAa,MAAY,IAAA,CAAK,EAAE,IAAA,EAAM,UAAU,CAAA;AAItD,EAAA,MAAM,QAAQ,MAAY;AACxB,IAAA,IAAI,eAAe,CAAC,WAAA,EAAa,UAAA,EAAW,oBAAqB,WAAW,CAAA;AAAA,EAC9E,CAAA;AACA,EAAA,MAAM,QAAA,GAAW,OAAO,OAAA,CAAQ,SAAA;AAChC,EAAA,MAAM,WAAA,GAAc,OAAO,OAAA,CAAQ,YAAA;AACnC,EAAA,MAAM,oBAAoB,MAAY;AACpC,IAAA,MAAA,CAAO,OAAA,CAAQ,SAAA,GAAY,SAAS,SAAA,CAAA,GAA4B,IAAA,EAAM;AACpE,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,IAAwC,CAAA;AACvE,MAAA,KAAA,EAAM;AACN,MAAA,OAAO,CAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAA,CAAO,OAAA,CAAQ,YAAA,GAAe,SAAS,YAAA,CAAA,GAA+B,IAAA,EAAM;AAC1E,MAAA,MAAM,CAAA,GAAI,WAAA,CAAY,KAAA,CAAM,IAAA,EAAM,IAA2C,CAAA;AAC7E,MAAA,KAAA,EAAM;AACN,MAAA,OAAO,CAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,KAAK,CAAA;AACzC,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,KAAK,CAAA;AAAA,EAC7C,CAAA;AACA,EAAA,MAAM,mBAAmB,MAAY;AACnC,IAAA,MAAA,CAAO,QAAQ,SAAA,GAAY,QAAA;AAC3B,IAAA,MAAA,CAAO,QAAQ,YAAA,GAAe,WAAA;AAC9B,IAAA,MAAA,CAAO,mBAAA,CAAoB,YAAY,KAAK,CAAA;AAC5C,IAAA,MAAA,CAAO,mBAAA,CAAoB,cAAc,KAAK,CAAA;AAAA,EAChD,CAAA;AAEA,EAAA,MAAM,WAAW,MAAY;AAC3B,IAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAC/C,IAAA,MAAA,CAAO,mBAAA,CAAoB,YAAY,UAAU,CAAA;AACjD,IAAA,gBAAA,EAAiB;AACjB,IAAA,MAAA,EAAQ,IAAA,EAAK;AACb,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,kBAAA,EAAmB;AACnB,IAAA,aAAA,EAAc;AACd,IAAA,cAAA,GAAiB,IAAA;AACjB,IAAA,oBAAA,EAAqB;AACrB,IAAA,kBAAA,EAAmB;AACnB,IAAA,iBAAA,EAAkB;AAClB,IAAA,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,CAAA;AACvB,IAAA,KAAA,EAAO,QAAA,EAAS;AAChB,IAAA,KAAA,GAAQ,IAAA;AACR,IAAA,YAAA,EAAc,MAAA,EAAO;AACrB,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,YAAA,EAAc,MAAA,EAAO;AACrB,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,IAAI,eAAA,EAAiB,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,iBAAiB,IAAI,CAAA;AAClF,IAAA,eAAA,GAAkB,IAAA;AAClB,IAAA,MAAA,EAAQ,QAAA,EAAS;AACjB,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,iBAAA,EAAkB;AAAA,EACpB,CAAA;AAQA,EAAA,MAAM,QAAA,GAAW,CAAC,SAAA,KAAkC;AAClD,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,MAAA,CAAO,CAAC,GAAA,KAAQ;AACxC,MAAA,IAAI;AACF,QAAA,OAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA,KAAM,IAAA;AAAA,MACzC,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF,CAAC,CAAA;AACD,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAa;AACnC,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,MAAA,IAAI;AACF,QAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,gBAAA,CAAiB,GAAG,CAAC,CAAA,EAAG,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA;AAAA,MAC7E,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,MAAM,aAA4B,EAAC;AACnC,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,gBAAA,CAAiB,oBAAoB,CAAA;AAC5D,IAAA,KAAA,MAAW,OAAA,IAAW,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EAAG;AACvC,MAAA,IAAI,UAAA,CAAW,UAAU,GAAA,EAAK;AAC9B,MAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,sEAAsE,CAAA,EAAG;AAC3F,QAAA;AAAA,MACF;AACA,MAAA,IAAI,OAAA,CAAQ,cAAA,EAAe,CAAE,MAAA,KAAW,CAAA,EAAG;AAE3C,MAAA,IAAI,MAAA,GAAS,KAAA;AACb,MAAA,KAAA,IAAS,CAAA,GAAoB,OAAA,EAAS,CAAA,EAAG,CAAA,GAAI,EAAE,aAAA,EAAe;AAC5D,QAAA,IAAI,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,EAAG;AACpB,UAAA,MAAA,GAAS,IAAA;AACT,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAI,MAAA,EAAQ;AACZ,MAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,OAAA,EAAS,CAAC,CAAA;AAC7C,MAAA,IAAI,CAAC,QAAA,IAAY,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,EAAG;AACrC,MAAA,IAAA,CAAK,IAAI,QAAQ,CAAA;AACjB,MAAA,UAAA,CAAW,IAAA,CAAK;AAAA,QACd,QAAA;AAAA,QACA,aAAA,EAAe,iBAAA,CAAkB,OAAA,EAAS,CAAC,CAAA;AAAA,QAC3C,GAAA,EAAK,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY;AAAA,QACjC,EAAA,EAAI,QAAQ,EAAA,IAAM,IAAA;AAAA,QAClB,OAAA,EAAS,mBAAmB,OAAO,CAAA;AAAA,QACnC,IAAA,EAAM,iBAAiB,OAAO;AAAA,OAC/B,CAAA;AAAA,IACH;AACA,IAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAK,GAAI,MAAA,CAAO,QAAA;AAElC,IAAA,MAAM,SAAA,GAAY,QAAQ,IAAA,CAAK,IAAI,IAAI,CAAA,EAAG,QAAQ,CAAA,EAAG,IAAI,CAAA,CAAA,GAAK,QAAA;AAC9D,IAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,SAAA,EAAW,YAAY,OAAA,EAAQ;AAAA,EAC9D,CAAA;AAOA,EAAA,IAAI,YAAA,GAAmC,IAAA;AACvC,EAAA,IAAI,eAAA,GAAuD,IAAA;AAC3D,EAAA,MAAM,oBAAoB,MAAY;AACpC,IAAA,IAAI,CAAC,YAAA,EAAc;AACnB,IAAA,YAAA,CAAa,MAAA,EAAO;AACpB,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,IAAI,eAAA,EAAiB,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,iBAAiB,IAAI,CAAA;AAClF,IAAA,eAAA,GAAkB,IAAA;AAClB,IAAA,KAAA,EAAO,WAAW,IAAI,CAAA;AACtB,IAAA,IAAA,CAAK,EAAE,IAAA,EAAM,qBAAA,EAAuB,CAAA;AAAA,EACtC,CAAA;AACA,EAAA,MAAM,gBAAA,GAAmB,CAAC,IAAA,KAAiC;AACzD,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,YAAA,CAAa,MAAA,EAAO;AACpB,MAAA,YAAA,GAAe,IAAA;AAAA,IACjB;AACA,IAAA,KAAA,EAAO,WAAW,KAAK,CAAA;AACvB,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,YAAA,CAAa,2BAA2B,EAAE,CAAA;AAC/C,IAAA,IAAA,CAAK,YAAA,CAAa,yBAAyB,EAAE,CAAA;AAC7C,IAAA,MAAM,SAAS,IAAA,CAAK,YAAA,CAAa,EAAE,IAAA,EAAM,QAAQ,CAAA;AACjD,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,IAAA,KAAA,CAAM,WAAA,GAAc,mBAAA;AACpB,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC7C,IAAA,QAAA,CAAS,SAAA,GAAY,sBAAA;AACrB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,IAAA,MAAA,CAAO,SAAA,GAAY,aAAA;AACnB,IAAA,MAAA,CAAO,YAAA,CAAa,QAAQ,QAAQ,CAAA;AACpC,IAAA,MAAA,CAAO,YAAA,CAAa,cAAc,MAAM,CAAA;AACxC,IAAA,MAAA,CAAO,YAAA,CAAa,YAAA,EAAc,IAAA,CAAK,KAAK,CAAA;AAC5C,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,IAAA,KAAA,CAAM,SAAA,GAAY,mBAAA;AAClB,IAAA,KAAA,CAAM,SAAA,GACJ,0LAAA;AACF,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AACzC,IAAA,KAAA,CAAM,SAAA,GAAY,mBAAA;AAClB,IAAA,KAAA,CAAM,cAAc,IAAA,CAAK,KAAA;AACzB,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AAC1C,IAAA,OAAA,CAAQ,SAAA,GAAY,iBAAA;AACpB,IAAA,OAAA,CAAQ,cAAc,IAAA,CAAK,OAAA;AAC3B,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AACxC,IAAA,IAAA,CAAK,SAAA,GAAY,kBAAA;AACjB,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,IAAA,EAAM;AACzB,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,MAAA,GAAA,CAAI,SAAA,GAAY,iBAAA;AAChB,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AACtC,MAAA,EAAA,CAAG,cAAc,CAAA,CAAE,KAAA;AACnB,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AACtC,MAAA,EAAA,CAAG,cAAc,CAAA,CAAE,KAAA;AACnB,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AAAA,IACtB;AACA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,IAAA,GAAO,QAAA;AACd,IAAA,MAAA,CAAO,SAAA,GAAY,iBAAA;AACnB,IAAA,MAAA,CAAO,WAAA,GAAc,KAAK,WAAA,IAAe,OAAA;AACzC,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,iBAAiB,CAAA;AAClD,IAAA,MAAA,CAAO,MAAA,CAAO,KAAA,EAAO,KAAA,EAAO,OAAO,CAAA;AACnC,IAAA,IAAI,KAAK,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,MAAA,CAAO,YAAY,IAAI,CAAA;AACjD,IAAA,MAAA,CAAO,YAAY,MAAM,CAAA;AACzB,IAAA,MAAA,CAAO,MAAA,CAAO,KAAA,EAAO,QAAA,EAAU,MAAM,CAAA;AACrC,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,eAAA,GAAkB,CAAC,CAAA,KAA2B;AAC5C,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACxB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,iBAAA,EAAkB;AAAA,IACpB,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,eAAA,EAAiB,IAAI,CAAA;AAC1D,IAAA,MAAA,CAAO,KAAA,EAAM;AAAA,EACf,CAAA;AAGA,EAAA,IAAI,YAAA,GAAmC,IAAA;AACvC,EAAA,MAAM,YAAA,GAAe,CAAC,QAAA,KAAkC;AACtD,IAAA,YAAA,EAAc,MAAA,EAAO;AACrB,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,IAAI,MAAA,GAAyB,IAAA;AAC7B,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,QAAA,CAAS,cAAc,QAAQ,CAAA;AAAA,IAC1C,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,CAAA,GAAI,OAAO,qBAAA,EAAsB;AACvC,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,IAAA,GAAA,CAAI,YAAA,CAAa,2BAA2B,EAAE,CAAA;AAC9C,IAAA,GAAA,CAAI,MAAM,OAAA,GACR,CAAA,oBAAA,EAAuB,CAAA,CAAE,IAAA,GAAO,CAAC,CAAA,OAAA,EAAU,CAAA,CAAE,GAAA,GAAM,CAAC,YAAY,CAAA,CAAE,KAAA,GAAQ,CAAC,CAAA,UAAA,EAAa,CAAA,CAAE,SAAS,CAAC,CAAA,qHAAA,CAAA;AAEtG,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,GAAG,CAAA;AAC7B,IAAA,YAAA,GAAe,GAAA;AAAA,EACjB,CAAA;AAGA,EAAA,IAAI,IAAI,KAAA,EAAO;AAIb,IAAA,MAAA,GAAS,mBAAA,CAAoB;AAAA,MAC3B,QAAA,EAAU,OAAO,QAAA,CAAS,QAAA;AAAA,MAC1B,QAAA,EAAU,CAAC,MAAA,KAAW;AACpB,QAAA,QAAQ,OAAO,MAAA;AAAQ;AAAA,UAErB,KAAK,MAAA;AACH,YAAA,KAAA,EAAO,YAAA,CAAa,OAAO,QAAA,KAAa,KAAA,GAAS,QAAQ,MAAA,EAAO,IAAK,IAAK,CAAC,CAAA;AAC3E,YAAA;AAAA,UACF,KAAK,YAAA;AACH,YAAA,KAAA,EAAO,WAAW,IAAI,CAAA;AACtB,YAAA;AAAA,UACF,KAAK,SAAA;AACH,YAAA,IAAI,WAAA,EAAa;AACjB,YAAA,WAAA,GAAc,IAAA;AAEd,YAAA,YAAA,GAAe,KAAA;AACf,YAAA,gBAAA,GAAmB,KAAA;AACnB,YAAA,eAAA,GAAkB,KAAA,EAAO,WAAU,IAAK,IAAA;AACxC,YAAA,KAAA,EAAO,WAAW,KAAK,CAAA;AACvB,YAAA,MAAA,EAAQ,WAAW,IAAI,CAAA;AACvB,YAAA,IAAI,WAAA,oBAA+B,WAAW,CAAA;AAC9C,YAAA;AAAA,UACF,KAAK,cAAA;AACH,YAAA,IAAI,CAAC,WAAA,EAAa;AAClB,YAAA,WAAA,GAAc,KAAA;AACd,YAAA,oBAAA,EAAqB;AACrB,YAAA,kBAAA,EAAmB;AACnB,YAAA,MAAA,EAAQ,WAAW,KAAK,CAAA;AACxB,YAAA,KAAA,EAAO,WAAW,eAAe,CAAA;AACjC,YAAA,IAAI,WAAA,oBAA+B,WAAW,CAAA;AAC9C,YAAA;AAAA,UACF,KAAK,mBAAA;AAAA,UACL,KAAK,aAAA;AAAA,UACL,KAAK,UAAA;AACH,YAAA,KAAA,EAAO,WAAW,IAAI,CAAA;AACtB,YAAA;AAAA;AAEJ,QAAA,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAA,EAAS,QAAQ,CAAA;AAAA,MACjD;AAAA,KACD,CAAA;AACD,IAAA,KAAA,GAAQ,kBAAA,CAAmB;AAAA,MACzB,eAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA,EAAW,OAAO,QAAA,CAAS,MAAA;AAAA,MAC3B,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,OAAA,EAAS,MAAM,QAAA,EAAS;AAAA,MACxB,SAAA,EAAW,OAAO,MAAA;AAAO,KAC1B,CAAA;AACD,IAAA,MAAA,CAAO,cAAA,CAAe,CAAC,CAAA,KAAM,KAAA,EAAO,YAAA,CAAa,MAAA,EAAQ,IAAA,EAAK,KAAM,KAAA,GAAQ,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,EACpF,CAAA,MAAO;AACL,IAAA,YAAA,GAAe,aAAA,EAAc;AAC7B,IAAA,IAAI,CAAC,cAAc,OAAO,IAAA;AAAA,EAC5B;AAEA,EAAA,MAAM,WAAW,MAAY;AAC3B,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC5C,IAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,UAAU,CAAA;AAC9C,IAAA,iBAAA,EAAkB;AAGlB,IAAA,IAAI,CAAC,GAAA,CAAI,KAAA,OAAY,EAAE,IAAA,EAAM,SAAS,CAAA;AAAA,EACxC,CAAA;AAUA,EAAA,MAAM,MAAO,MAAA,CACV,YAAA;AACH,EAAA,IAAI,CAAC,GAAA,CAAI,KAAA,IAAS,GAAA,EAAK,MAAA,IAAU,KAAK,MAAA,EAAQ;AAC5C,IAAA,KAAK,kBAAA,CAAmB,IAAI,MAAA,EAAQ,GAAA,CAAI,QAAQ,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,EAAA,KAAO;AAClE,MAAA,IAAI,IAAI,QAAA,EAAS;AAAA,WAAA,IACR,MAAA,CAAO,OAAA,EAAS,OAAA,CAAQ,IAAA,CAAK,4DAAoD,CAAA;AAAA,IAC5F,CAAC,CAAA;AAAA,EACH,CAAA,MAAO;AACL,IAAA,QAAA,EAAS;AAAA,EACX;AAEA,EAAA,OAAO,EAAE,QAAA,EAAS;AACpB;AAQA,eAAe,kBAAA,CAAmB,MAAA,EAAgB,MAAA,EAAgB,KAAA,EAAiC;AACjG,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,CAAA,EAAG,MAAA,CAAO,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA,kBAAA,CAAA;AACzC,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAC3B,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAoB,aAAa,MAAA,EAAO;AAAA,MACnE,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAO;AAAA,KAC/B,CAAA;AACD,IAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,IAAA;AACpB,IAAA,MAAM,OAAQ,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC/C,IAAA,OAAO,MAAM,KAAA,KAAU,KAAA;AAAA,EACzB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAGA,SAAS,aAAA,GAA+B;AACtC,EAAA,IAAI,OAAO,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,MAAA,SAAe,MAAA,CAAO,MAAA;AAC7D,EAAA,IAAI,OAAO,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,MAAA,SAAe,MAAA,CAAO,MAAA;AAC7D,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,uBAAuB,UAAA,EAA0C;AAExE,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,IAAI;AACF,MAAA,OAAO,IAAI,GAAA,CAAI,UAAU,CAAA,CAAE,MAAA;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,EAAY,IAAK,QAAA,CAAS,QAAA,EAAU;AACtC,IAAA,IAAI;AACF,MAAA,OAAO,IAAI,GAAA,CAAI,QAAA,CAAS,QAAQ,CAAA,CAAE,MAAA;AAAA,IACpC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAUA,SAAS,sBAAA,GAEK;AACZ,EAAA,MAAM,MAAO,MAAA,CACV,YAAA;AACH,EAAA,IAAI,CAAC,GAAA,EAAK,MAAA,IAAU,CAAC,GAAA,EAAK,QAAQ,OAAO,MAAA;AACzC,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC5C,EAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,EAAA,OAAO,OAAO,QAAA,KAAa;AACzB,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB;AAAA,MACjC,SAAA,EAAW,aAAA;AAAA,MACX,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA;AAAA,MAC3B,kBAAA,EAAoB;AAAA,KACrB,CAAA;AACD,IAAA,MAAM,MAAM,MAAM,KAAA,CAAM,GAAG,MAAM,CAAA,oBAAA,EAAuB,MAAM,CAAA,CAAA,EAAI;AAAA,MAChE,OAAA,EAAS,EAAE,WAAA,EAAa,MAAA;AAAO,KAChC,CAAA;AACD,IAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,EAAC;AACrB,IAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,IAAA,OAAO,IAAA,CAAK,SAAS,EAAC;AAAA,EACxB,CAAA;AACF;;;ACv1DA,IAAM,gBAAA,GAAmB,6BAAA;AACzB,IAAM,aAAA,GAAgB,GAAA;AAEf,SAAS,qBAAqB,OAAA,EAAgD;AACnF,EAAA,IAAI,CAAC,SAAA,EAAU,EAAG,OAAO,WAAA,EAAY;AAErC,EAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,eAAA,IAAmB,MAAA,CAAO,QAAA,CAAS,MAAA;AACnE,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,OAAA,CAAQ,MAAM,CAAA;AAC3C,EAAA,MAAM,MAAM,WAAA,CAAY,OAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,OAAO,eAAe,CAAA;AAEtE,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,IAAA;AAC/B,EAAA,MAAM,WAAW,KAAA,KAAU,IAAA;AAE3B,EAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,EAAA,IAAI,QAAA,EAAU;AAEZ,IAAA,KAAA,CAAO,GAAA,GAAM,GAAA;AAAA,EACf,CAAA,MAAO;AACL,IAAA,KAAA,GAAQ,MAAA,CAAO,IAAA;AAAA,MACb,GAAA;AAAA,MACA,QAAQ,UAAA,IAAc,aAAA;AAAA,MACtB,QAAQ,cAAA,IAAkB;AAAA,KAC5B;AAAA,EACF;AAGA,EAAA,MAAM,YAAA,GAAe,MAAsB,QAAA,GAAY,KAAA,EAAO,iBAAiB,IAAA,GAAQ,KAAA;AAEvF,EAAA,MAAM,IAAA,GAAO,CAAC,OAAA,KAAkC;AAC9C,IAAA,MAAM,IAAI,YAAA,EAAa;AACvB,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,IAAI,CAAC,QAAA,IAAY,KAAA,EAAO,MAAA,EAAQ;AAChC,IAAA,CAAA,CAAE,WAAA;AAAA,MACA,EAAE,MAAA,EAAQ,kBAAA,EAAoB,OAAO,OAAA,CAAQ,KAAA,EAAO,GAAG,OAAA,EAAQ;AAAA,MAC/D,SAAA,IAAa;AAAA,KACf;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,SAAA;AAEJ,EAAA,MAAM,UAAU,MAAY;AAC1B,IAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAC/C,IAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,MAAA,aAAA,CAAc,SAAS,CAAA;AACvB,MAAA,SAAA,GAAY,MAAA;AAAA,IACd;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAA8B;AAC/C,IAAA,IAAI,SAAA,IAAa,KAAA,CAAM,MAAA,KAAW,SAAA,EAAW;AAC7C,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AAMnB,IAAA,IAAI,CAAC,QAAQ,IAAA,CAAK,MAAA,KAAW,sBAAsB,IAAA,CAAK,KAAA,KAAU,QAAQ,KAAA,EAAO;AAEjF,IAAA,QAAQ,KAAK,IAAA;AAAM,MACjB,KAAK,OAAA;AACH,QAAA,OAAA,CAAQ,OAAA,IAAU;AAClB,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,IAAI,IAAA,CAAK,OAAA,EAAS,OAAA,CAAQ,QAAA,GAAW,KAAK,OAAwB,CAAA;AAClE,QAAA;AAAA,MACF,KAAK,gBAAA;AACH,QAAA,OAAA,CAAQ,WAAA,IAAc;AACtB,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,OAAA,EAAQ;AACR,QAAA,OAAA,CAAQ,QAAA,IAAW;AACnB,QAAA;AAAA;AACJ,EACF,CAAA;AAEA,EAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAI5C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,SAAA,GAAY,YAAY,MAAM;AAC5B,MAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,QAAA,OAAA,EAAQ;AACR,QAAA,OAAA,CAAQ,QAAA,IAAW;AAAA,MACrB;AAAA,IACF,GAAG,aAAa,CAAA;AAAA,EAClB;AAEA,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,CAAC,CAAA,KACZ,IAAA,CAAK;AAAA,MACH,IAAA,EAAM,cAAA;AAAA,MACN,GAAI,GAAG,YAAA,KAAiB,MAAA,GAAY,EAAE,YAAA,EAAc,CAAA,CAAE,YAAA,EAAa,GAAI,EAAC;AAAA,MACxE,GAAI,GAAG,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAK,GAAI;AAAC,KACjD,CAAA;AAAA,IACH,YAAY,MAAM,IAAA,CAAK,EAAE,IAAA,EAAM,eAAe,CAAA;AAAA,IAC9C,OAAA,EAAS,CAAC,KAAA,KAAU,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,EAAW,OAAO,CAAA;AAAA,IACnD,cAAc,MAAM,IAAA,CAAK,EAAE,IAAA,EAAM,iBAAiB,CAAA;AAAA,IAClD,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAY,CAAA;AACzB,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,IAAI,KAAA,QAAa,GAAA,GAAM,aAAA;AAAA,MACzB,CAAA,MAAA,IAAW,KAAA,IAAS,CAAC,KAAA,CAAM,MAAA,EAAQ;AACjC,QAAA,KAAA,CAAM,KAAA,EAAM;AAAA,MACd;AACA,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,GACF;AACF;AAEA,SAAS,WAAA,CAAY,MAAA,EAAgB,KAAA,EAAe,eAAA,EAAiC;AACnF,EAAA,IAAI;AACF,IAAA,MAAM,IAAI,IAAI,GAAA,CAAI,MAAA,EAAQ,MAAA,CAAO,SAAS,IAAI,CAAA;AAC9C,IAAA,CAAA,CAAE,YAAA,CAAa,GAAA,CAAI,mBAAA,EAAqB,KAAK,CAAA;AAC7C,IAAA,CAAA,CAAE,YAAA,CAAa,GAAA,CAAI,oBAAA,EAAsB,eAAe,CAAA;AACxD,IAAA,OAAO,EAAE,QAAA,EAAS;AAAA,EACpB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEA,SAAS,WAAW,GAAA,EAA4B;AAC9C,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,CAAE,MAAA;AAAA,EAC5C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,WAAA,GAA8B;AACrC,EAAA,OAAO;AAAA,IACL,aAAa,MAAM;AAAA,IAAC,CAAA;AAAA,IACpB,YAAY,MAAM;AAAA,IAAC,CAAA;AAAA,IACnB,SAAS,MAAM;AAAA,IAAC,CAAA;AAAA,IAChB,cAAc,MAAM;AAAA,IAAC,CAAA;AAAA,IACrB,OAAO,MAAM;AAAA,IAAC;AAAA,GAChB;AACF","file":"chunk-DU6I4ZU2.mjs","sourcesContent":["/**\n * Drop-target de bloques sobre la preview (editor in-app).\n *\n * El autor arrastra un bloque de la paleta del panel (iframe del dashboard) y\n * lo suelta SOBRE la guía pintada en la app. El drag & drop HTML5 cruza\n * iframes de forma nativa, así que acá solo escuchamos `dragover`/`drop` en el\n * host de la guía, mostramos una línea de inserción entre bloques y avisamos\n * dónde cayó (el panel inserta el bloque en su estado y re-previsualiza).\n *\n * Contrato con el panel: el MIME `application/x-veo-block`. El `dragstart` de\n * la paleta lo setea con el tipo de bloque; durante `dragover` solo los TYPES\n * del dataTransfer son visibles (el valor recién se puede leer en el `drop`) —\n * alcanza para filtrar drags ajenos.\n *\n * La posición se expresa como `beforeIndex`: índice del bloque del paso ANTES\n * del cual insertar (`null` = al final). Los renderers estampan\n * `data-veo-idx` en cada elemento top-level con el índice ORIGINAL dentro de\n * `step.blocks[]` (una fila de botones agrupados lleva el del primero), así el\n * índice sobrevive a bloques filtrados u ocultos (p.ej. botones en pasos de\n * tour).\n */\n\nexport const VEO_BLOCK_MIME = 'application/x-veo-block';\n\n/** Dónde soltó el autor un bloque nuevo. */\nexport interface BlockDropPayload {\n stepIndex: number;\n /** Tipo de bloque arrastrado (title/text/button/image — lo valida el panel). */\n blockType: string;\n /** Índice del bloque ANTES del cual insertar; `null` = al final. */\n beforeIndex: number | null;\n}\n\nexport interface BlockDropTargetHandle {\n /**\n * Drag por POINTER (el camino principal): el panel manda las coordenadas del\n * puntero ya convertidas a la página de la app. Muestra/mueve la línea de\n * inserción; devuelve `true` si el punto está sobre la guía.\n */\n hoverAt(x: number, y: number): boolean;\n /**\n * Suelta en esas coordenadas: devuelve el punto de inserción, o `null` si el\n * puntero no estaba sobre la guía (el drop se descarta). Siempre borra la línea.\n */\n dropAt(x: number, y: number): { beforeIndex: number | null } | null;\n /** Cancela el hover (borra la línea sin soltar). */\n cancelHover(): void;\n detach(): void;\n}\n\ninterface AttachOptions {\n host: HTMLElement;\n stepIndex: number;\n onDrop: (payload: BlockDropPayload) => void;\n}\n\n/** Punto de inserción calculado bajo el cursor. */\ninterface DropSpot {\n beforeIndex: number | null;\n /** Coordenada Y (viewport) de la línea indicadora. */\n y: number;\n rect: DOMRect;\n}\n\n/**\n * Adjunta el drop-target al host de la guía en preview. Devuelve un handle\n * para desmontarlo (cambio de preview / cierre del editor).\n */\nexport function attachBlockDropTarget(options: AttachOptions): BlockDropTargetHandle {\n const { host, stepIndex, onDrop } = options;\n const doc = host.ownerDocument;\n let line: HTMLElement | null = null;\n let spot: DropSpot | null = null;\n\n const contentEl = (): HTMLElement | null =>\n host.shadowRoot?.querySelector<HTMLElement>('.veo-guide-content') ?? null;\n\n /** Hijos top-level que representan bloques (estampados por los renderers). */\n const blockChildren = (container: HTMLElement): HTMLElement[] =>\n Array.from(container.children).filter(\n (el): el is HTMLElement => el instanceof HTMLElement && el.dataset.veoIdx !== undefined,\n );\n\n const hideLine = (): void => {\n line?.remove();\n line = null;\n spot = null;\n };\n\n const showLine = (at: DropSpot): void => {\n if (!line) {\n line = doc.createElement('div');\n // Inline (no hay hoja de estilos del builder en el shadow de la guía).\n line.style.cssText =\n 'position:fixed;height:3px;border-radius:2px;background:#FF5B35;' +\n 'box-shadow:0 0 0 1px rgba(255,255,255,0.65);pointer-events:none;z-index:2147483647;';\n host.shadowRoot?.appendChild(line);\n }\n line.style.left = `${at.rect.left + 4}px`;\n line.style.width = `${Math.max(0, at.rect.width - 8)}px`;\n line.style.top = `${at.y - 1.5}px`;\n };\n\n const isBlockDrag = (event: DragEvent): boolean => {\n const types = event.dataTransfer?.types;\n return !!types && Array.from(types).includes(VEO_BLOCK_MIME);\n };\n\n /** Margen alrededor del contenido dentro del cual el drop sigue activo. */\n const NEAR_PX = 48;\n\n /** Boundary de inserción más cercano al cursor (por el eje Y). */\n const locate = (clientY: number): DropSpot | null => {\n const container = contentEl();\n if (!container) return null;\n const rect = container.getBoundingClientRect();\n const kids = blockChildren(container);\n let beforeIndex: number | null = null;\n let y = kids.length === 0 ? rect.top + rect.height / 2 : 0;\n for (const kid of kids) {\n const r = kid.getBoundingClientRect();\n if (clientY < r.top + r.height / 2) {\n const idx = Number(kid.dataset.veoIdx);\n beforeIndex = Number.isFinite(idx) ? idx : null;\n y = r.top;\n break;\n }\n y = r.bottom; // el cursor quedó debajo: candidato \"después del último\"\n }\n return { beforeIndex, y, rect };\n };\n\n /** ¿El punto está sobre (o cerca de) el contenido de la guía? */\n const overContent = (x: number, y: number, rect: DOMRect): boolean =>\n x >= rect.left - NEAR_PX &&\n x <= rect.right + NEAR_PX &&\n y >= rect.top - NEAR_PX &&\n y <= rect.bottom + NEAR_PX;\n\n const hoverAt = (x: number, y: number): boolean => {\n const at = locate(y);\n if (!at || !overContent(x, y, at.rect)) {\n hideLine();\n return false;\n }\n spot = at;\n showLine(at);\n return true;\n };\n\n const dropAt = (x: number, y: number): { beforeIndex: number | null } | null => {\n const at = locate(y);\n hideLine();\n if (!at || !overContent(x, y, at.rect)) return null;\n return { beforeIndex: at.beforeIndex };\n };\n\n const onDragOver = (event: DragEvent): void => {\n if (!isBlockDrag(event)) return;\n const at = locate(event.clientY);\n if (!at) return;\n event.preventDefault(); // habilita el drop\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'copy';\n spot = at;\n showLine(at);\n };\n\n const onDropEvent = (event: DragEvent): void => {\n if (!isBlockDrag(event)) return;\n event.preventDefault();\n const blockType = event.dataTransfer?.getData(VEO_BLOCK_MIME) ?? '';\n const at = spot ?? locate(event.clientY);\n hideLine();\n if (!blockType || !at) return;\n onDrop({ stepIndex, blockType, beforeIndex: at.beforeIndex });\n };\n\n const onDragLeave = (event: DragEvent): void => {\n // Solo al salir del host de verdad (los cruces internos del shadow se\n // re-targetean al host y no llegan acá).\n const to = event.relatedTarget;\n if (to instanceof Node && (to === host || host.contains(to))) return;\n hideLine();\n };\n\n host.addEventListener('dragover', onDragOver);\n host.addEventListener('drop', onDropEvent);\n host.addEventListener('dragleave', onDragLeave);\n\n return {\n hoverAt,\n dropAt,\n cancelHover: hideLine,\n detach(): void {\n host.removeEventListener('dragover', onDragOver);\n host.removeEventListener('drop', onDropEvent);\n host.removeEventListener('dragleave', onDragLeave);\n hideLine();\n },\n };\n}\n","/**\n * Contrato de mensajes del puente builder (app del cliente ↔ dashboard).\n * Ambos lados validan `event.origin` y que `token` coincida antes de actuar.\n *\n * Flujo:\n * 1. El dashboard abre la app con `?veoBuilder=<token>&veoBuilderOrigin=<origen>`.\n * 2. La app (veo-builder.js) postea `ready` a la ventana que la abrió.\n * 3. El dashboard manda comandos (`start-picker`, `preview`, …).\n * 4. La app responde con eventos (`picked`, `pick-cancelled`, …).\n */\nimport type { PreviewGuideInput } from '../guides/guide-preview';\nimport type { BlockDropPayload } from './block-drop-target';\nimport type { DesignPatch } from './design-manipulator';\nimport type { PickedElement } from './element-picker';\n\nexport const VEO_BUILDER_SOURCE = 'veo-builder';\n// Los nombres de los query params viven en el core (`builder-token.ts`), única\n// fuente de verdad compartida con el loader y el gate del runtime de guías.\nexport { BUILDER_ORIGIN_PARAM, BUILDER_TOKEN_PARAM } from '../../core/builder-token';\n\n/**\n * Estado que el panel (editor) publica para que el SDK pinte el \"chrome\" del\n * editor (topbar + fila de pasos) ENCIMA de la app. El panel es la única fuente\n * de verdad; el chrome solo lo refleja y devuelve `chrome-action`s.\n */\nexport interface EditorChromeState {\n /**\n * `tagging` = «Modo tagging» (panel de features): solo la topbar, con ese\n * título y sin fila de pasos, vista previa ni Guardar (cada tag se guarda al\n * crearse). Default `guide` = editor de guías.\n */\n variant?: 'guide' | 'tagging';\n /** Título del header de la tarjeta; si falta, el SDK lo deriva de la sección. */\n panelTitle?: string;\n guideName: string;\n /** ISO de creación (null = guía nueva sin guardar). */\n createdAt: string | null;\n steps: Array<{ id: string; label: string; presentation: 'floating' | 'inline' }>;\n activeStep: number;\n /**\n * Qué muestra el panel. `step`, `block`, `add-block`, `row` y `structure`\n * son vistas del paso activo (la fila de pasos lo marca); las pestañas del\n * contenedor se «encienden» solo con `step` (contenedor) y `structure`.\n */\n section: 'activation' | 'step' | 'badge' | 'target' | 'block' | 'add-block' | 'row' | 'structure';\n /** Editando un bloque del paso: su nombre («Encuesta Texto abierto») para el título del panel. */\n blockLabel?: string | null;\n saving: boolean;\n dirty: boolean;\n /**\n * Estado de publicación de la guía, para que el autor vea en la barra si lo\n * que edita está Activa/Borrador/etc. (sin esto, guardar una guía en borrador\n * y no verla en la app era un misterio). `tone` elige el color del chip.\n */\n status?: { label: string; tone: 'live' | 'testing' | 'review' | 'draft' | 'paused' } | null;\n}\n\n/**\n * Qué está haciendo la preview en la app. El SDK lo publica cada vez que\n * evalúa un comando `preview` con `honorTrigger`, para que el panel explique\n * por qué la guía no se ve (retraso, elemento objetivo, otra página, otro\n * dispositivo) en vez de parecer rota.\n */\nexport type PreviewStatus =\n | { state: 'shown' }\n | { state: 'waiting-delay'; delayMs: number }\n | { state: 'waiting-trigger'; trigger: 'on_click' | 'on_hover'; selector: string }\n | { state: 'page-mismatch'; pattern: string }\n | { state: 'device-mismatch'; devices: 'desktop' | 'mobile' };\n\n/** Acciones que el usuario dispara en el chrome (barras) y el panel ejecuta. */\n/** Bloque de la preview: paso + id local del panel (`StepBlock.editorId`). */\nexport interface BlockRef {\n stepIndex: number;\n blockId: string;\n}\nexport type BlockToolbarAction =\n | 'edit'\n | 'duplicate'\n | 'remove'\n /** Mover: arriba/abajo dentro de su columna, izquierda/derecha entre columnas de su fila. */\n | 'move-up'\n | 'move-down'\n | 'move-left'\n | 'move-right';\n/** Barra de la FILA (hover o fila del bloque seleccionado): editar / duplicar / eliminar. */\nexport type RowToolbarAction = 'edit' | 'duplicate' | 'remove';\n/** Pestañas sobre el CONTENEDOR (hover): editar el paso o abrir la estructura de filas. */\nexport type CardToolbarAction = 'edit-container' | 'edit-rows';\nexport type BlockLayoutAction =\n | 'row-before'\n | 'row-after'\n | 'col-before'\n | 'col-after'\n /** Bloque apilado en la MISMA celda (fila+columna), antes/después del bloque. */\n | 'stack-before'\n | 'stack-after';\n\nexport type ChromeAction =\n | { action: 'select-activation' }\n | { action: 'select-step'; index: number }\n | { action: 'add-step' }\n /** Hover sobre la tarjeta de un paso: duplicar (se inserta después) o eliminar. */\n | { action: 'duplicate-step'; index: number }\n | { action: 'remove-step'; index: number }\n | { action: 'save'; exit: boolean }\n | { action: 'exit' }\n // Las tres siguientes las resuelve el SDK solo (no llegan al panel):\n // barra arriba/abajo, volver a mostrar la tarjeta y modo vista previa.\n | { action: 'dock'; position: 'top' | 'bottom' }\n | { action: 'show-panel' }\n | { action: 'preview' }\n | { action: 'exit-preview' };\n\n/** Eventos que la app del cliente envía al dashboard. */\nexport type BuilderEvent =\n // `chrome: true` → el SDK pinta el chrome del editor (barras); el panel debe\n // ocultar su propia cabecera/pasos/guardado y publicar `editor-state`.\n | { type: 'ready'; chrome?: boolean }\n | { type: 'chrome-action'; payload: ChromeAction }\n | { type: 'picked'; payload: PickedElement }\n | { type: 'pick-cancelled' }\n // Manipulación directa: el autor arrastró/redimensionó la guía en la app;\n // el panel mergea `payload.style` sobre el `style` del paso indicado.\n | { type: 'design-updated'; payload: DesignPatch }\n // Drag & drop de bloques: el autor soltó un bloque de la paleta SOBRE la\n // guía en preview; el panel lo inserta en `step.blocks[]` en esa posición.\n | { type: 'block-dropped'; payload: BlockDropPayload }\n /** Clic simple (sin arrastre) sobre la tarjeta de la preview: el panel abre «Agregar bloque». */\n | { type: 'card-clicked'; payload: { stepIndex: number } }\n /** Clic sobre un bloque de la preview: se selecciona en la app y el panel abre su editor. */\n | { type: 'block-clicked'; payload: BlockRef }\n /** Barra del bloque seleccionado: editar / duplicar / eliminar. */\n | { type: 'block-action'; payload: BlockRef & { action: BlockToolbarAction } }\n /** «+» en los bordes del bloque seleccionado: agregar fila arriba/abajo o columna izq/der. */\n | { type: 'block-layout'; payload: BlockRef & { action: BlockLayoutAction } }\n /** Barra de una fila: `blockId` = primer bloque de la fila (la fila no tiene id propio). */\n | { type: 'row-action'; payload: BlockRef & { action: RowToolbarAction } }\n /** Pestañas del contenedor (hover sobre la tarjeta): editar contenedor / editar filas. */\n | { type: 'card-action'; payload: { stepIndex: number; action: CardToolbarAction } }\n // Estado de la preview (ver `PreviewStatus`).\n | { type: 'preview-status'; payload: PreviewStatus }\n /** Respuesta a `scan-page`: elementos clickeables de la página y qué selectores dados existen en ella. */\n | { type: 'page-scan'; payload: PageScan }\n /** El autor cerró el modal de `show-confirmation`. */\n | { type: 'confirmation-closed' }\n | { type: 'closed' };\n\n/**\n * Modal de confirmación que el SDK pinta CENTRADO sobre la app del cliente\n * (mock «Feature tagueada»): check verde, título, mensaje, filas\n * label/valor y un botón que lo cierra. Mientras está abierto el panel se\n * oculta; al cerrarlo el SDK postea `confirmation-closed`.\n */\nexport interface ConfirmationCard {\n title: string;\n message: string;\n rows: Array<{ label: string; value: string }>;\n /** Texto del botón. Default «Listo». */\n buttonLabel?: string;\n}\n\n/** Un elemento clickeable de la página (candidato a feature), sin `rect`. */\nexport type PageElement = Omit<PickedElement, 'rect'>;\n\nexport interface PageScan {\n /** `location.pathname`: el mismo valor que `$page_path` de autocapture (restricción «Solo en esta página»). */\n pagePath: string;\n /**\n * Ruta «humana» de la app: en apps con hash routing (`/#/settings`) incluye\n * el hash; si no, es igual a `pagePath`. Para mostrar y para la foto del\n * elemento, NO para contar (autocapture no lleva el hash).\n */\n routePath: string;\n /** Elementos clickeables visibles que NO matchean ninguno de los `selectors` pedidos. */\n candidates: PageElement[];\n /** De los `selectors` pedidos, cuáles existen en esta página. */\n present: string[];\n}\n\n/** Comandos que el dashboard/panel envía a la app del cliente. */\nexport type BuilderCommand =\n /** `only: 'interactive'` (features): solo botones/enlaces/campos/formularios… (ver `ElementPickerOptions.only`). */\n | { type: 'start-picker'; maxAncestors?: number; hint?: string; only?: 'interactive' }\n | { type: 'stop-picker' }\n /** Panel de features: inventario de la página actual (ver `PageScan`). */\n | { type: 'scan-page'; selectors: string[] }\n /** Resalta (o deja de resaltar) un elemento por selector, sin entrar en modo picker. */\n | { type: 'highlight'; selector: string | null }\n /** Modal de confirmación centrado sobre la app (ver `ConfirmationCard`). */\n | { type: 'show-confirmation'; payload: ConfirmationCard }\n // `editable: true` (editor in-app) adjunta drag/resize sobre la preview.\n // `honorTrigger: true`: si la guía se dispara por elemento objetivo\n // (activationRules on_click/on_hover + selector), la preview ESPERA a esa\n // interacción en la app en vez de pintarse de una.\n // `honorTrigger` también respeta «retrasar la aparición» (delayMs) y el\n // filtro de dispositivo, publicando `preview-status` con lo que está pasando.\n | { type: 'preview'; guide: PreviewGuideInput; editable?: boolean; honorTrigger?: boolean }\n // Drag de un bloque de la paleta POR POINTER (el DnD HTML5 no cruza bien el\n // iframe del panel): el panel captura el puntero y streamea sus coordenadas\n // RELATIVAS AL IFRAME; la app las convierte con el rect del panel, mueve la\n // línea de inserción y en `drop` responde con el evento `block-dropped`.\n | {\n type: 'block-drag';\n phase: 'move' | 'drop' | 'cancel';\n x: number;\n y: number;\n blockType: string;\n label?: string;\n }\n | { type: 'close-preview' }\n /** El panel selecciona (o deselecciona con null) un bloque en la app. */\n | { type: 'select-block'; blockId: string | null }\n /** El panel edita una fila: se marca en la app (por el id de un bloque de esa fila). */\n | { type: 'select-row'; blockId: string | null }\n | { type: 'teardown' }\n // Chrome del editor: el panel publica su estado (nombre, pasos, sección…).\n | { type: 'editor-state'; state: EditorChromeState }\n // El panel pide ocultarse/mostrarse (botón «Cerrar» del contenido).\n | { type: 'panel-visibility'; visible: boolean }\n /** Tamaño compacto del panel (alto = contenido); `null` restaura el tamaño previo. */\n | { type: 'panel-size'; size: { width: number; height: number } | null }\n // Modo panel inyectado: el panel avisa que cargó y está listo para recibir\n // eventos; la app responde con `ready`. Resuelve la carrera de que el iframe\n // del panel todavía no tenga su listener cuando la app postea `ready`.\n | { type: 'panel-ready' };\n\n/** Sobre común: todo mensaje del puente lleva `source` + `token`. */\nexport interface BuilderEnvelope {\n source: typeof VEO_BUILDER_SOURCE;\n token: string;\n}\n\nexport type BuilderEventMessage = BuilderEnvelope & BuilderEvent;\nexport type BuilderCommandMessage = BuilderEnvelope & BuilderCommand;\n","/**\n * \"Chrome\" del editor in-app (mock Figma 2026-09): dos barras FIJAS arriba de la\n * app del cliente, dibujadas por el SDK (sin iframe):\n *\n * 1. Topbar oscura: logo · «Nombre · fecha» · app · [barra arriba/abajo]\n * [mostrar editor] [vista previa] · Salir · Guardar ▾ (Guardar y salir).\n * Vista previa: se esconden barras y tarjeta y queda una píldora\n * «Estás en vista previa | Salir» para volver al editor.\n * 2. Fila de pasos: tarjeta «Activación» + una tarjeta por paso + «Agregar\n * paso», con la píldora «Ocultar/Mostrar pasos» colgando al centro. Al\n * pasar el mouse por un paso aparece una capa oscura con «Editar»,\n * duplicar y eliminar (se pueden eliminar todos los pasos).\n *\n * La app se EMPUJA (`margin-top`/`margin-bottom` en <html>, según dónde esté\n * la barra) para que las barras no tapen nada. El chrome NO tiene estado propio: refleja el `EditorChromeState`\n * que publica el panel y devuelve `ChromeAction`s; el panel decide.\n */\nimport { hasDocument, hasWindow } from '../../utils/safe-env';\nimport type { ChromeAction, EditorChromeState } from './bridge-protocol';\n\nexport const CHROME_TOPBAR_H = 64;\nexport const CHROME_STEPS_H = 128;\n\nexport interface BuilderChromeOptions {\n /** Nombre de la app (origen) que se muestra junto al nombre de la guía. */\n appLabel: string;\n onAction: (action: ChromeAction) => void;\n}\n\nexport type ChromeDock = 'top' | 'bottom';\n\nexport interface BuilderChromeHandle {\n /** Refresca las barras con el estado publicado por el panel. */\n setState(state: EditorChromeState): void;\n /** Alto total ocupado hoy (topbar + pasos si están visibles). */\n height(): number;\n /** Dónde está anclada la barra. */\n dock(): ChromeDock;\n /** Modo vista previa: oculta las barras y muestra la píldora para salir. */\n setPreview(on: boolean): void;\n /** Oculta las barras SIN píldora (mientras dura el picker de elementos). */\n setHidden(on: boolean): void;\n /** Se llama cuando cambia el alto (colapsar/expandir pasos). */\n onHeightChange(cb: (h: number) => void): void;\n teardown(): void;\n}\n\nconst ICONS = {\n bolt: '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m3.75 13.5 10.5-11.25L12 10.5h8.25L9.75 21.75 12 13.5H3.75Z\"/>',\n desktop:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 17.25v1.007a3 3 0 0 1-.879 2.122L7.5 21h9l-.621-.621A3 3 0 0 1 15 18.257V17.25m6-12V15a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 15V5.25m18 0A2.25 2.25 0 0 0 18.75 3H5.25A2.25 2.25 0 0 0 3 5.25m18 0V12a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 12V5.25\"/>',\n updown:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3 7.5 7.5 3m0 0L12 7.5M7.5 3v13.5m13.5 0L16.5 21m0 0L12 16.5m4.5 4.5V7.5\"/>',\n map: '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 6.75V15m6-6v8.25m.503 3.498 4.875-2.437c.381-.19.622-.58.622-1.006V4.82c0-.836-.88-1.38-1.628-1.006l-3.869 1.934c-.317.159-.69.159-1.006 0L9.503 3.252a1.125 1.125 0 0 0-1.006 0L3.622 5.689C3.24 5.88 3 6.27 3 6.695V19.18c0 .836.88 1.38 1.628 1.006l3.869-1.934c.317-.159.69-.159 1.006 0l4.994 2.497c.317.158.69.158 1.006 0Z\"/>',\n eye: '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M2.036 12.322a1.012 1.012 0 0 1 0-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178Z\"/><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z\"/>',\n chevronDown:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m19.5 8.25-7.5 7.5-7.5-7.5\"/>',\n chevronUp:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m4.5 15.75 7.5-7.5 7.5 7.5\"/>',\n plus: '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 4.5v15m7.5-7.5h-15\"/>',\n pencil:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L10.582 16.07a4.5 4.5 0 0 1-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 0 1 1.13-1.897l8.932-8.931Zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0 1 15.75 21H5.25A2.25 2.25 0 0 1 3 18.75V8.25A2.25 2.25 0 0 1 5.25 6H10\"/>',\n copy: '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 0 0-2.25-2.25H6A2.25 2.25 0 0 0 3.75 6v8.25A2.25 2.25 0 0 0 6 16.5h2.25m8.25-8.25H18a2.25 2.25 0 0 1 2.25 2.25V18A2.25 2.25 0 0 1 18 20.25h-7.5A2.25 2.25 0 0 1 8.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 0 0-2.25 2.25v6\"/>',\n trash:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0\"/>',\n cursor:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15.042 21.672 13.684 16.6m0 0-2.51 2.225.569-9.47 5.227 7.917-3.286-.672ZM12 2.25V4.5m5.834.166-1.591 1.591M20.25 10.5H18M7.757 14.743l-1.59 1.59M6 10.5H3.75m4.007-4.243-1.59-1.59\"/>',\n spinner:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182\"/>',\n};\n\nfunction svg(name: keyof typeof ICONS, size = 20): string {\n return (\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" ` +\n `fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" aria-hidden=\"true\">${ICONS[name]}</svg>`\n );\n}\n\n/** «19 ago» (fecha corta, locale es). */\nfunction shortDate(iso: string | null): string {\n if (!iso) return '';\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return '';\n return d.toLocaleDateString('es', { day: 'numeric', month: 'short' }).replace('.', '');\n}\n\nfunction el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className: string,\n html?: string,\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n node.className = className;\n if (html !== undefined) node.innerHTML = html;\n return node;\n}\n\nfunction iconButton(name: keyof typeof ICONS, title: string, className = ''): HTMLButtonElement {\n const b = el('button', `veo-tb-icon ${className}`.trim(), svg(name));\n b.type = 'button';\n b.title = title;\n b.setAttribute('aria-label', title);\n return b;\n}\n\n/** Inyecta el chrome del editor. Devuelve el handle (o uno inerte sin DOM). */\nexport function injectBuilderChrome(opts: BuilderChromeOptions): BuilderChromeHandle {\n if (!hasWindow() || !hasDocument()) {\n return {\n setState: () => {},\n height: () => 0,\n dock: () => 'top',\n setPreview: () => {},\n setHidden: () => {},\n onHeightChange: () => {},\n teardown: () => {},\n };\n }\n\n const host = document.createElement('div');\n host.setAttribute('data-veo-builder-chrome', '');\n host.setAttribute('data-veo-ignore', '');\n const shadow = host.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n style.textContent = CHROME_CSS;\n\n const root = el('div', 'veo-chrome');\n\n // ── Topbar ──\n const topbar = el('div', 'veo-tb');\n const brand = el('div', 'veo-tb-brand', svg('bolt', 18));\n const nameEl = el('div', 'veo-tb-name');\n const statusEl = el('span', 'veo-tb-status');\n statusEl.hidden = true;\n const sep = el('span', 'veo-tb-sep');\n const appEl = el('div', 'veo-tb-app', `${svg('desktop', 16)}<span></span>`);\n (appEl.querySelector('span') as HTMLElement).textContent = opts.appLabel;\n const left = el('div', 'veo-tb-left');\n left.append(brand, nameEl, statusEl, sep, appEl);\n\n const right = el('div', 'veo-tb-right');\n const dockBtn = iconButton('updown', 'Mover la barra abajo');\n const showPanel = iconButton('map', 'Mostrar el editor');\n const preview = iconButton('eye', 'Vista previa');\n const exit = el('button', 'veo-tb-text', 'Salir');\n exit.type = 'button';\n const saveGroup = el('div', 'veo-tb-save');\n const save = el('button', 'veo-tb-save-main', '<span>Guardar</span>');\n save.type = 'button';\n const saveMore = el('button', 'veo-tb-save-more', svg('chevronDown', 16));\n saveMore.type = 'button';\n saveMore.title = 'Más opciones de guardado';\n saveMore.setAttribute('aria-label', 'Más opciones de guardado');\n const saveMenu = el('div', 'veo-tb-menu');\n const saveExit = el('button', 'veo-tb-menu-item', 'Guardar y salir');\n saveExit.type = 'button';\n saveMenu.append(saveExit);\n saveMenu.hidden = true;\n saveGroup.append(save, saveMore, saveMenu);\n right.append(dockBtn, showPanel, preview, el('span', 'veo-tb-vsep'), exit, saveGroup);\n topbar.append(left, right);\n\n // ── Fila de pasos ──\n const stepsBar = el('div', 'veo-steps');\n const stepsList = el('div', 'veo-steps-list');\n stepsBar.append(stepsList);\n\n const togglePill = el('button', 'veo-steps-toggle');\n togglePill.type = 'button';\n\n root.append(topbar, stepsBar, togglePill);\n\n // Píldora de vista previa (solo visible en ese modo).\n const previewPill = el('div', 'veo-preview-pill');\n const previewLabel = el(\n 'span',\n 'veo-preview-label',\n `${svg('eye', 18)}<span>Estás en vista previa</span>`,\n );\n const previewExit = el('button', 'veo-preview-exit', 'Salir');\n previewExit.type = 'button';\n previewPill.append(previewLabel, previewExit);\n previewPill.hidden = true;\n\n shadow.append(style, root, previewPill);\n document.body.appendChild(host);\n\n // ── Empujar la app (arriba o abajo según el anclaje) ──\n const html = document.documentElement;\n const prevMarginTop = html.style.marginTop;\n const prevMarginBottom = html.style.marginBottom;\n let collapsed = false;\n let dock: ChromeDock = 'top';\n let previewOn = false;\n let hiddenOn = false;\n let heightCb: ((h: number) => void) | null = null;\n let tagging = false;\n const height = (): number => CHROME_TOPBAR_H + (collapsed || tagging ? 0 : CHROME_STEPS_H);\n const applyHeight = (): void => {\n const h = previewOn || hiddenOn ? 0 : height();\n html.style.marginTop = dock === 'top' ? `${h}px` : prevMarginTop;\n html.style.marginBottom = dock === 'bottom' ? `${h}px` : prevMarginBottom;\n root.style.setProperty('--veo-chrome-h', `${height()}px`);\n root.classList.toggle('is-bottom', dock === 'bottom');\n stepsBar.hidden = collapsed || tagging;\n togglePill.hidden = tagging;\n // Modo tagging: sin vista previa ni Guardar (cada tag se guarda al crearse).\n preview.hidden = tagging;\n saveGroup.hidden = tagging;\n showPanel.title = tagging ? 'Mostrar el panel' : 'Mostrar el editor';\n const open = dock === 'top' ? 'chevronUp' : 'chevronDown';\n const closedIcon = dock === 'top' ? 'chevronDown' : 'chevronUp';\n togglePill.innerHTML = `<span>${collapsed ? 'Mostrar pasos' : 'Ocultar pasos'}</span>${svg(\n collapsed ? closedIcon : open,\n 16,\n )}`;\n dockBtn.title = dock === 'top' ? 'Mover la barra abajo' : 'Mover la barra arriba';\n dockBtn.setAttribute('aria-label', dockBtn.title);\n heightCb?.(h);\n };\n const setPreview = (on: boolean): void => {\n previewOn = on;\n root.hidden = on || hiddenOn;\n previewPill.hidden = !on;\n applyHeight();\n };\n const setHidden = (on: boolean): void => {\n hiddenOn = on;\n root.hidden = on || previewOn;\n applyHeight();\n };\n togglePill.addEventListener('click', () => {\n collapsed = !collapsed;\n applyHeight();\n });\n\n // ── Acciones ──\n const act = (a: ChromeAction): void => opts.onAction(a);\n dockBtn.addEventListener('click', () => {\n dock = dock === 'top' ? 'bottom' : 'top';\n applyHeight();\n act({ action: 'dock', position: dock });\n });\n showPanel.addEventListener('click', () => act({ action: 'show-panel' }));\n preview.addEventListener('click', () => act({ action: 'preview' }));\n previewExit.addEventListener('click', () => act({ action: 'exit-preview' }));\n exit.addEventListener('click', () => act({ action: 'exit' }));\n save.addEventListener('click', () => act({ action: 'save', exit: false }));\n saveMore.addEventListener('click', (e) => {\n e.stopPropagation();\n saveMenu.hidden = !saveMenu.hidden;\n });\n saveExit.addEventListener('click', () => {\n saveMenu.hidden = true;\n act({ action: 'save', exit: true });\n });\n const closeMenu = (): void => {\n saveMenu.hidden = true;\n };\n document.addEventListener('click', closeMenu);\n\n // ── Render de estado ──\n let current: EditorChromeState | null = null;\n const render = (): void => {\n const s = current;\n if (!s) return;\n const nextTagging = s.variant === 'tagging';\n if (nextTagging !== tagging) {\n tagging = nextTagging;\n applyHeight();\n }\n const date = shortDate(s.createdAt);\n nameEl.textContent = tagging\n ? s.guideName.trim() || 'Modo tagging'\n : `${s.guideName.trim() || 'Sin nombre'}${date ? ` · ${date}` : ''}`;\n if (s.status) {\n statusEl.hidden = false;\n statusEl.textContent = s.status.label;\n statusEl.dataset.tone = s.status.tone;\n statusEl.title = 'Estado de la guía (se cambia desde la lista de guías)';\n } else {\n statusEl.hidden = true;\n }\n save.innerHTML = s.saving\n ? `${svg('spinner', 16)}<span>Guardando…</span>`\n : '<span>Guardar</span>';\n save.disabled = s.saving;\n saveExit.disabled = s.saving;\n\n stepsList.replaceChildren();\n const activation = stepCard(svg('cursor', 22), 'Activación', s.section === 'activation');\n activation.addEventListener('click', () => act({ action: 'select-activation' }));\n stepsList.append(activation);\n s.steps.forEach((st, i) => {\n const thumb =\n st.presentation === 'inline'\n ? '<div class=\"veo-thumb veo-thumb-inline\"><i></i><i></i><i></i></div>'\n : '<div class=\"veo-thumb\"><i></i><i></i><b></b></div>';\n // «Estructura» es una vista del paso activo: la fila de pasos lo sigue marcando.\n const isStepView =\n s.section === 'step' ||\n s.section === 'block' ||\n s.section === 'add-block' ||\n s.section === 'row' ||\n s.section === 'structure';\n const card = stepCard(thumb, st.label, isStepView && s.activeStep === i, {\n // Se pueden borrar TODOS los pasos (el panel vuelve a Activación).\n canRemove: true,\n onEdit: () => act({ action: 'select-step', index: i }),\n onDuplicate: () => act({ action: 'duplicate-step', index: i }),\n onRemove: () => act({ action: 'remove-step', index: i }),\n });\n stepsList.append(card);\n });\n const add = el('button', 'veo-step-add', `${svg('plus', 18)}<span>Agregar paso</span>`);\n add.type = 'button';\n add.addEventListener('click', () => act({ action: 'add-step' }));\n stepsList.append(add);\n };\n\n applyHeight();\n\n return {\n setState: (state) => {\n current = state;\n render();\n },\n height,\n dock: () => dock,\n setPreview,\n setHidden,\n onHeightChange: (cb) => {\n heightCb = cb;\n },\n teardown: () => {\n document.removeEventListener('click', closeMenu);\n html.style.marginTop = prevMarginTop;\n html.style.marginBottom = prevMarginBottom;\n host.remove();\n },\n };\n}\n\ninterface StepCardActions {\n canRemove: boolean;\n onEdit: () => void;\n onDuplicate: () => void;\n onRemove: () => void;\n}\n\n/**\n * Tarjeta de la fila de pasos. Sin `actions` es un botón simple (Activación).\n * Con `actions` es un paso: al pasar el mouse (o enfocar) aparece la capa\n * oscura con «Editar», duplicar y eliminar. Un clic en cualquier parte de la\n * tarjeta que no sea un botón de la capa también edita.\n */\nfunction stepCard(\n inner: string,\n label: string,\n active: boolean,\n actions?: StepCardActions,\n): HTMLElement {\n const cls = `veo-step${active ? ' is-active' : ''}`;\n if (!actions) {\n const b = el(\n 'button',\n cls,\n `<div class=\"veo-step-box\">${inner}</div><span class=\"veo-step-label\"></span>`,\n );\n b.type = 'button';\n (b.querySelector('.veo-step-label') as HTMLElement).textContent = label;\n b.setAttribute('aria-pressed', active ? 'true' : 'false');\n return b;\n }\n const card = el(\n 'div',\n cls,\n `<div class=\"veo-step-box\">${inner}` +\n '<div class=\"veo-step-hover\">' +\n '<div class=\"veo-step-hover-top\">' +\n `<button type=\"button\" class=\"veo-step-icon veo-step-remove\" title=\"Eliminar paso\" aria-label=\"Eliminar paso\">${svg('trash', 14)}</button>` +\n `<button type=\"button\" class=\"veo-step-icon veo-step-duplicate\" title=\"Duplicar paso\" aria-label=\"Duplicar paso\">${svg('copy', 14)}</button>` +\n '</div>' +\n '<div class=\"veo-step-hover-main\">' +\n `<button type=\"button\" class=\"veo-step-edit\">${svg('pencil', 14)}<span>Editar</span></button>` +\n '</div>' +\n '</div></div><span class=\"veo-step-label\"></span>',\n );\n (card.querySelector('.veo-step-label') as HTMLElement).textContent = label;\n card.setAttribute('aria-current', active ? 'step' : 'false');\n const remove = card.querySelector('.veo-step-remove') as HTMLButtonElement;\n remove.disabled = !actions.canRemove;\n if (!actions.canRemove) remove.title = 'La guía necesita al menos un paso';\n const on = (sel: string, fn: () => void): void => {\n card.querySelector(sel)?.addEventListener('click', (e) => {\n e.stopPropagation();\n fn();\n });\n };\n on('.veo-step-edit', actions.onEdit);\n on('.veo-step-duplicate', actions.onDuplicate);\n on('.veo-step-remove', actions.onRemove);\n card.addEventListener('click', actions.onEdit);\n return card;\n}\n\nconst CHROME_CSS = `\n:host { all: initial; }\n.veo-chrome {\n position: fixed; top: 0; left: 0; right: 0;\n display: flex; flex-direction: column;\n z-index: 2147483646;\n font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif;\n font-size: 14px; color: #1c1917;\n}\n.veo-chrome[hidden] { display: none; }\n/* Modo tagging oculta controles por atributo: gana a los display de sus clases. */\n.veo-chrome [hidden], .veo-steps-toggle[hidden] { display: none !important; }\n.veo-chrome.is-bottom { top: auto; bottom: 0; flex-direction: column-reverse; }\n.veo-chrome.is-bottom .veo-tb-menu { top: auto; bottom: calc(100% + 8px); }\n.veo-chrome.is-bottom .veo-steps { border-bottom: 0; border-top: 1px solid #d6cfc8; }\n.veo-chrome.is-bottom .veo-steps-toggle { top: auto; bottom: var(--veo-chrome-h, ${CHROME_TOPBAR_H + CHROME_STEPS_H}px); transform: translate(-50%, 50%); }\n.veo-preview-pill {\n position: fixed; top: 28px; left: 50%; transform: translateX(-50%);\n z-index: 2147483646;\n display: inline-flex; align-items: center; gap: 12px;\n background: #2b2623; color: #fff; border-radius: 999px; padding: 12px 20px;\n font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif; font-size: 15px; font-weight: 500;\n box-shadow: 0 8px 24px rgba(0,0,0,0.3);\n}\n.veo-preview-pill[hidden] { display: none; }\n.veo-preview-label { display: inline-flex; align-items: center; gap: 10px; padding-right: 12px; border-right: 1px solid rgba(255,255,255,0.3); }\n.veo-preview-exit { border: 0; background: transparent; color: #fff; font: inherit; cursor: pointer; padding: 0 2px; }\n.veo-preview-exit:hover { text-decoration: underline; }\n.veo-tb {\n height: ${CHROME_TOPBAR_H}px; box-sizing: border-box;\n display: flex; align-items: center; justify-content: space-between;\n padding: 0 20px; gap: 16px;\n background: #2b2623; color: #fff;\n}\n.veo-tb-left, .veo-tb-right { display: flex; align-items: center; gap: 12px; min-width: 0; }\n.veo-tb-brand {\n width: 36px; height: 36px; border-radius: 999px; background: #b74d00;\n display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto;\n}\n.veo-tb-name { font-weight: 700; font-size: 16px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.veo-tb-status { display: inline-flex; align-items: center; padding: 2px 8px; border-radius: 999px; font-size: 11px; font-weight: 600; letter-spacing: 0.02em; white-space: nowrap; background: rgba(255,255,255,0.18); color: #fff; }\n.veo-tb-status[data-tone=\"live\"] { background: #16a34a; }\n.veo-tb-status[data-tone=\"testing\"] { background: #b45309; }\n.veo-tb-status[data-tone=\"review\"] { background: #7c3aed; }\n.veo-tb-status[data-tone=\"draft\"] { background: #0f766e; }\n.veo-tb-status[data-tone=\"paused\"] { background: rgba(255,255,255,0.28); }\n.veo-tb-sep { width: 1px; height: 24px; background: rgba(255,255,255,0.25); }\n.veo-tb-vsep { width: 1px; height: 28px; background: rgba(255,255,255,0.25); margin: 0 4px; }\n.veo-tb-app { display: inline-flex; align-items: center; gap: 8px; color: rgba(255,255,255,0.85); white-space: nowrap; }\n.veo-tb-icon {\n width: 42px; height: 42px; border-radius: 10px; border: 0;\n background: rgba(255,255,255,0.12); color: #fff; cursor: pointer;\n display: inline-flex; align-items: center; justify-content: center;\n}\n.veo-tb-icon:hover { background: rgba(255,255,255,0.22); }\n.veo-tb-text { border: 0; background: transparent; color: #fff; font: inherit; font-size: 15px; cursor: pointer; padding: 8px 6px; }\n.veo-tb-text:hover { text-decoration: underline; }\n.veo-tb-save { position: relative; display: inline-flex; border-radius: 10px; overflow: visible; }\n.veo-tb-save-main, .veo-tb-save-more {\n border: 0; background: #b74d00; color: #fff; font: inherit; font-weight: 600; font-size: 15px;\n cursor: pointer; display: inline-flex; align-items: center; gap: 8px; height: 42px;\n}\n.veo-tb-save-main { padding: 0 8px 0 18px; border-radius: 10px 0 0 10px; }\n.veo-tb-save-more { padding: 0 12px 0 6px; border-radius: 0 10px 10px 0; }\n.veo-tb-save-main:hover, .veo-tb-save-more:hover { background: #953c00; }\n.veo-tb-save-main:disabled { opacity: 0.7; cursor: default; }\n.veo-tb-menu {\n position: absolute; right: 0; top: calc(100% + 8px); min-width: 220px;\n background: #fff; color: #1c1917; border-radius: 12px; padding: 6px;\n box-shadow: 0 12px 32px rgba(0,0,0,0.22);\n}\n.veo-tb-menu-item {\n display: block; width: 100%; text-align: left; border: 0; background: transparent;\n font: inherit; font-size: 15px; padding: 10px 14px; border-radius: 8px; cursor: pointer;\n}\n.veo-tb-menu-item:hover { background: #f5efe9; }\n.veo-steps {\n height: ${CHROME_STEPS_H}px; box-sizing: border-box;\n background: #e7e1dc; border-bottom: 1px solid #d6cfc8;\n padding: 16px 28px 0; overflow-x: auto;\n}\n.veo-steps[hidden] { display: none; }\n.veo-steps-list { display: flex; align-items: flex-start; gap: 20px; }\n.veo-step { border: 0; background: transparent; padding: 0; cursor: pointer; font: inherit; display: flex; flex-direction: column; align-items: center; gap: 8px; flex: 0 0 auto; }\n.veo-step-box {\n position: relative; overflow: hidden;\n width: 116px; height: 64px; border-radius: 10px; background: #fff; border: 2px solid transparent;\n display: flex; align-items: center; justify-content: center; color: #2b2623;\n box-shadow: 0 1px 2px rgba(0,0,0,0.06);\n}\n/* Capa de acciones del paso: aparece al pasar el mouse o al enfocar un botón. */\n.veo-step-hover {\n position: absolute; inset: 0; background: #2b2623; border-radius: 8px;\n display: flex; flex-direction: column; padding: 3px 4px 6px; box-sizing: border-box;\n opacity: 0; transition: opacity 120ms ease-out;\n}\n.veo-step:hover .veo-step-hover, .veo-step:focus-within .veo-step-hover { opacity: 1; }\n.veo-step-hover-top { display: flex; justify-content: space-between; align-items: center; }\n.veo-step-hover-main { flex: 1; display: flex; align-items: center; justify-content: center; }\n.veo-step-icon {\n border: 0; background: transparent; color: #fff; cursor: pointer; padding: 0;\n width: 20px; height: 20px; border-radius: 5px; display: inline-flex; align-items: center; justify-content: center;\n}\n.veo-step-icon:hover { background: rgba(255,255,255,0.14); }\n.veo-step-icon:disabled { opacity: 0.35; cursor: default; background: transparent; }\n.veo-step-edit {\n width: 100%; margin: 0 6px; border: 0; background: #dbeefc; color: #1d6fb8; font: inherit; font-size: 13px; font-weight: 600;\n border-radius: 6px; padding: 5px 10px; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; gap: 6px;\n}\n.veo-step-edit:hover { background: #cbe4f9; }\n.veo-step.is-active .veo-step-box { border-color: #b74d00; }\n.veo-step-label { font-size: 13px; color: #6b635d; }\n.veo-step.is-active .veo-step-label { color: #2b2623; font-weight: 600; }\n.veo-thumb { width: 72px; height: 36px; border: 1.5px solid #c9c2bb; border-radius: 6px; padding: 6px 7px; box-sizing: border-box; display: flex; flex-direction: column; gap: 4px; }\n.veo-thumb i { display: block; height: 3px; border-radius: 2px; background: #2b2623; width: 70%; }\n.veo-thumb i + i { width: 45%; background: #c9c2bb; }\n.veo-thumb b { display: block; height: 6px; width: 24px; border-radius: 2px; background: #b74d00; align-self: flex-end; }\n.veo-thumb-inline { border-style: dashed; }\n.veo-thumb-inline i { width: 100%; }\n.veo-step-add { border: 0; background: transparent; font: inherit; font-size: 15px; color: #6b635d; cursor: pointer; display: inline-flex; align-items: center; gap: 8px; height: 64px; padding: 0 8px; }\n.veo-step-add:hover { color: #2b2623; }\n.veo-steps-toggle {\n position: absolute; left: 50%; top: var(--veo-chrome-h, ${CHROME_TOPBAR_H + CHROME_STEPS_H}px);\n transform: translate(-50%, -50%);\n border: 0; background: #2b2623; color: #fff; font: inherit; font-size: 14px; font-weight: 500;\n border-radius: 999px; padding: 10px 18px; cursor: pointer;\n display: inline-flex; align-items: center; gap: 8px;\n box-shadow: 0 6px 18px rgba(0,0,0,0.25);\n}\n`;\n","/**\n * Modo \"panel inyectado\" (editor en la pestaña de la app).\n *\n * La app es la pestaña top-level (login real) y el editor de Veo se inyecta\n * ENCIMA como una tarjeta flotante **arrastrable y redimensionable** (un iframe\n * al dashboard). Además se puede **sacar a una ventana independiente** del\n * navegador (\"pop-out\").\n *\n * El panel corre en el origen del dashboard (sesión de Veo para guardar guías) y\n * habla con la app (`window.parent` si está anclado, `window.opener` si está en\n * ventana aparte) por el puente postMessage. Este módulo inyecta/gestiona el\n * panel y expone su ventana destino.\n */\nimport { hasDocument, hasWindow } from '../../utils/safe-env';\n\nconst DEFAULT_PANEL_PATH = '/guides/design';\nconst PANEL_W = 484;\nconst PANEL_H = 660;\nconst MIN_W = 320;\nconst MIN_H = 320;\nconst MARGIN = 16;\n/** Alto del header propio del panel (drag + acciones). */\nconst HEADER_H = 52;\n\nexport interface BuilderPanelOptions {\n dashboardOrigin: string;\n token: string;\n appOrigin: string;\n guide: string | null;\n panelPath: string | null;\n onClose: () => void;\n /** Alto ocupado arriba por el chrome del editor (el panel arranca debajo). */\n topOffset?: number;\n}\n\nexport interface BuilderPanelHandle {\n /** Ventana destino de los mensajes: el iframe anclado o la ventana pop-out. */\n target(): Window | null;\n /**\n * Rect del IFRAME del panel en coordenadas de la página de la app, o `null`\n * si el editor está en pop-out (ventana aparte: no hay mapeo de coordenadas).\n * Lo usa el drag de bloques para convertir el puntero panel → página.\n */\n frameRect(): DOMRect | null;\n /** Quita el panel del DOM (y cierra la ventana pop-out si hay). */\n teardown(): void;\n /** Título del header (lo publica el editor: «Ajustes de activación», «Paso 1»…). */\n setTitle(title: string): void;\n /** Muestra/oculta la tarjeta (el estado del editor se conserva en el iframe). */\n setVisible(visible: boolean): void;\n isVisible(): boolean;\n /** Reposiciona el tope mínimo cuando el chrome cambia de alto. */\n setTopOffset(px: number): void;\n /**\n * Tamaño COMPACTO pedido por el editor (p. ej. «Estructura», un popover\n * chico): `height` es el alto del contenido, el header se suma acá. `null`\n * restaura el tamaño que tenía. Se ignora maximizado o en pop-out.\n */\n setSize(size: { width: number; height: number } | null): void;\n}\n\n/** Inyecta el panel del editor (arrastrable, redimensionable, pop-out). */\nexport function injectBuilderPanel(opts: BuilderPanelOptions): BuilderPanelHandle {\n if (!hasWindow() || !hasDocument()) {\n return {\n target: () => null,\n frameRect: () => null,\n teardown: () => {},\n setTitle: () => {},\n setVisible: () => {},\n isVisible: () => false,\n setTopOffset: () => {},\n setSize: () => {},\n };\n }\n\n const panelUrl = buildPanelUrl(opts);\n\n const host = document.createElement('div');\n host.setAttribute('data-veo-builder-panel', '');\n const shadow = host.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = PANEL_CSS;\n\n const card = document.createElement('div');\n card.className = 'veo-panel';\n let topOffset = opts.topOffset ?? 0;\n // Mock: la tarjeta arranca a la IZQUIERDA, justo debajo del chrome.\n let left = 40;\n let top = topOffset + MARGIN;\n card.style.left = `${left}px`;\n card.style.top = `${top}px`;\n card.style.width = `${PANEL_W}px`;\n card.style.height = `${PANEL_H}px`;\n\n // Header (mock 2026-09): grip «···» arriba al centro, título a la izquierda y\n // a la derecha pop-out · maximizar · minimizar.\n const header = document.createElement('div');\n header.className = 'veo-panel-header';\n const grip = document.createElement('span');\n grip.className = 'veo-panel-grip';\n grip.setAttribute('aria-hidden', 'true');\n grip.textContent = '···';\n const title = document.createElement('span');\n title.className = 'veo-panel-title';\n title.textContent = 'OnUser · Editor';\n const actions = document.createElement('div');\n actions.className = 'veo-panel-actions';\n const popout = panelButton(ICON_POPOUT, 'Abrir en ventana aparte');\n const maximize = panelButton(ICON_EXPAND, 'Maximizar');\n const minimize = panelButton(ICON_MINUS, 'Minimizar');\n actions.append(popout, maximize, minimize);\n header.append(grip, title, actions);\n\n const iframe = document.createElement('iframe');\n iframe.className = 'veo-panel-frame';\n iframe.title = 'Editor de Veo';\n iframe.src = panelUrl;\n\n const resizeGrip = document.createElement('div');\n resizeGrip.className = 'veo-panel-resize';\n resizeGrip.setAttribute('aria-hidden', 'true');\n\n card.append(header, iframe, resizeGrip);\n shadow.append(style, card);\n document.body.appendChild(host);\n\n // ── Minimizar / maximizar ───────────────────────────────────────────────\n let visible = true;\n let maximized = false;\n let restore: { left: number; top: number; w: number; h: number } | null = null;\n const setVisible = (next: boolean): void => {\n visible = next;\n card.style.display = next && !(popped && !popped.closed) ? '' : 'none';\n };\n minimize.addEventListener('click', () => setVisible(false));\n // Tamaño compacto (ver BuilderPanelHandle.setSize): recuerda el tamaño previo\n // la primera vez y lo restaura con `null`. Levanta el alto mínimo mientras\n // dura, para que un popover chico pueda ser chico de verdad.\n let compactRestore: { w: number; h: number } | null = null;\n const setSize = (size: { width: number; height: number } | null): void => {\n if (maximized || (popped && !popped.closed)) return;\n if (size) {\n if (!compactRestore) compactRestore = { w: card.offsetWidth, h: card.offsetHeight };\n card.style.minHeight = '0';\n card.style.width = `${clamp(Math.round(size.width), MIN_W, window.innerWidth - MARGIN * 2)}px`;\n card.style.height = `${clamp(Math.round(size.height) + HEADER_H, HEADER_H + 80, window.innerHeight - top - MARGIN)}px`;\n } else if (compactRestore) {\n card.style.minHeight = '';\n card.style.width = `${compactRestore.w}px`;\n card.style.height = `${compactRestore.h}px`;\n compactRestore = null;\n }\n };\n maximize.addEventListener('click', () => {\n maximized = !maximized;\n if (maximized) {\n restore = { left, top, w: card.offsetWidth, h: card.offsetHeight };\n left = MARGIN;\n top = topOffset + MARGIN;\n card.style.left = `${left}px`;\n card.style.top = `${top}px`;\n card.style.width = `${Math.max(MIN_W, window.innerWidth - MARGIN * 2)}px`;\n card.style.height = `${Math.max(MIN_H, window.innerHeight - top - MARGIN)}px`;\n maximize.title = 'Restaurar';\n } else if (restore) {\n left = restore.left;\n top = restore.top;\n card.style.left = `${left}px`;\n card.style.top = `${top}px`;\n card.style.width = `${restore.w}px`;\n card.style.height = `${restore.h}px`;\n maximize.title = 'Maximizar';\n }\n });\n\n // ── Pop-out: sacar el editor a una ventana independiente ────────────────\n let popped: Window | null = null;\n let pollTimer: ReturnType<typeof setInterval> | undefined;\n\n const stopPoll = (): void => {\n if (pollTimer !== undefined) {\n clearInterval(pollTimer);\n pollTimer = undefined;\n }\n };\n\n popout.addEventListener('click', () => {\n const win = window.open(\n panelUrl,\n 'veo-editor',\n `popup,width=${Math.round(card.offsetWidth)},height=${Math.round(card.offsetHeight) + 60}`,\n );\n if (!win) return; // bloqueado por el navegador\n popped = win;\n card.style.display = 'none'; // el editor ahora vive en la ventana aparte\n pollTimer = setInterval(() => {\n if (popped?.closed) {\n stopPoll();\n opts.onClose(); // cerrar la ventana = salir del modo editor\n }\n }, 600);\n });\n\n // ── Arrastre por el header ──────────────────────────────────────────────\n header.addEventListener('mousedown', (e) => {\n if ((e.target as HTMLElement)?.closest('.veo-panel-btn')) return;\n e.preventDefault();\n const sx = e.clientX;\n const sy = e.clientY;\n const ol = left;\n const ot = top;\n iframe.style.pointerEvents = 'none';\n const move = (ev: MouseEvent): void => {\n left = clamp(ol + (ev.clientX - sx), 0, Math.max(0, window.innerWidth - card.offsetWidth));\n top = clamp(ot + (ev.clientY - sy), topOffset, Math.max(topOffset, window.innerHeight - 40));\n card.style.left = `${left}px`;\n card.style.top = `${top}px`;\n };\n const up = (): void => {\n window.removeEventListener('mousemove', move);\n window.removeEventListener('mouseup', up);\n iframe.style.pointerEvents = '';\n };\n window.addEventListener('mousemove', move);\n window.addEventListener('mouseup', up);\n });\n\n // ── Redimensionar por el grip (esquina inferior derecha) ────────────────\n resizeGrip.addEventListener('mousedown', (e) => {\n e.preventDefault();\n e.stopPropagation();\n const sx = e.clientX;\n const sy = e.clientY;\n const sw = card.offsetWidth;\n const sh = card.offsetHeight;\n iframe.style.pointerEvents = 'none';\n const move = (ev: MouseEvent): void => {\n card.style.width = `${clamp(sw + (ev.clientX - sx), MIN_W, window.innerWidth)}px`;\n card.style.height = `${clamp(sh + (ev.clientY - sy), MIN_H, window.innerHeight)}px`;\n };\n const up = (): void => {\n window.removeEventListener('mousemove', move);\n window.removeEventListener('mouseup', up);\n iframe.style.pointerEvents = '';\n };\n window.addEventListener('mousemove', move);\n window.addEventListener('mouseup', up);\n });\n\n return {\n target: () => (popped && !popped.closed ? popped : iframe.contentWindow),\n frameRect: () => (popped && !popped.closed ? null : iframe.getBoundingClientRect()),\n teardown: () => {\n stopPoll();\n if (popped && !popped.closed) popped.close();\n host.remove();\n },\n setTitle: (t) => {\n title.textContent = t;\n },\n setVisible,\n setSize,\n isVisible: () => visible,\n setTopOffset: (px) => {\n topOffset = px;\n if (top < topOffset + MARGIN) {\n top = topOffset + MARGIN;\n card.style.top = `${top}px`;\n }\n },\n };\n}\n\nconst ICON_POPOUT =\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m6.75 7.5 3 2.25-3 2.25m4.5 0h3m-9 8.25h13.5A2.25 2.25 0 0 0 21 18V6a2.25 2.25 0 0 0-2.25-2.25H5.25A2.25 2.25 0 0 0 3 6v12a2.25 2.25 0 0 0 2.25 2.25Z\"/>';\nconst ICON_EXPAND =\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15\"/>';\nconst ICON_MINUS = '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M5 12h14\"/>';\n\nfunction panelButton(iconPath: string, label: string): HTMLButtonElement {\n const b = document.createElement('button');\n b.className = 'veo-panel-btn';\n b.type = 'button';\n b.title = label;\n b.setAttribute('aria-label', label);\n b.innerHTML =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" ' +\n `fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" aria-hidden=\"true\">${iconPath}</svg>`;\n return b;\n}\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.min(Math.max(v, min), max);\n}\n\nfunction buildPanelUrl(opts: BuilderPanelOptions): string {\n const path = opts.panelPath ?? DEFAULT_PANEL_PATH;\n const url = new URL(path, opts.dashboardOrigin);\n url.searchParams.set('veoToken', opts.token);\n url.searchParams.set('veoApp', opts.appOrigin);\n if (opts.guide) url.searchParams.set('veoGuide', opts.guide);\n return url.toString();\n}\n\nconst PANEL_CSS = `\n:host { all: initial; }\n.veo-panel {\n position: fixed;\n min-width: ${MIN_W}px; min-height: ${MIN_H}px;\n max-width: 96vw; max-height: 94vh;\n display: flex; flex-direction: column;\n background: #fff;\n border-radius: 14px;\n box-shadow: 0 12px 40px rgba(0,0,0,0.22);\n overflow: hidden;\n z-index: 2147483647;\n font-family: system-ui, -apple-system, sans-serif;\n}\n.veo-panel-header {\n position: relative; flex: 0 0 auto; height: ${HEADER_H}px; box-sizing: border-box;\n display: flex; align-items: center; justify-content: space-between;\n padding: 10px 14px 0 22px;\n background: #fbf8f5; color: #1c1917; border-bottom: 1px solid #e8e2dc;\n font-size: 17px; font-weight: 700;\n cursor: grab;\n}\n.veo-panel-header:active { cursor: grabbing; }\n.veo-panel-grip {\n position: absolute; top: 0; left: 50%; transform: translateX(-50%);\n color: #b5aca4; font-size: 14px; letter-spacing: 1px; line-height: 12px;\n}\n.veo-panel-title { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.veo-panel-actions { display: flex; gap: 2px; }\n.veo-panel-btn {\n border: 0; background: transparent; color: #4b4540;\n cursor: pointer; line-height: 1; display: inline-flex; align-items: center;\n padding: 6px; border-radius: 8px;\n}\n.veo-panel-btn:hover { background: rgba(0,0,0,0.06); color: #1c1917; }\n.veo-panel-frame { flex: 1 1 auto; width: 100%; border: 0; background: #fff; }\n.veo-panel-resize {\n position: absolute; right: 0; bottom: 0;\n width: 16px; height: 16px;\n cursor: nwse-resize;\n background:\n linear-gradient(135deg, transparent 50%, rgba(0,0,0,0.25) 50%, rgba(0,0,0,0.25) 60%,\n transparent 60%, transparent 72%, rgba(0,0,0,0.25) 72%, rgba(0,0,0,0.25) 82%, transparent 82%);\n}\n`;\n","/**\n * Manipulación DIRECTA del diseño en modo editor: arrastrar la tarjeta de una\n * modal para posicionarla, redimensionarla desde bordes/esquinas, y arrastrar\n * un banner para alternar top/bottom. Vive en el bundle builder (veo-builder.js)\n * — el runtime de guías no carga nada de esto.\n *\n * Funciona como DECORATOR: se adjunta DESPUÉS del render sobre el shadow root\n * abierto del host de la guía (no toca los renderers). Durante el gesto aplica\n * las variables CSS localmente (feedback a 60fps, sin postMessage); al soltar\n * (`pointerup`) emite UN `onCommit(patch)` con los valores finales, que el\n * builder-mode postea al panel como `design-updated`. El panel actualiza su\n * estado y re-manda `preview` — que entra por el update in-place con las\n * MISMAS variables → no hay loop ni parpadeo.\n *\n * Geometría del modal (ver styles.ts): la card usa `left: posX%` +\n * `translate(-posX%)`, o sea `cardLeft = posX * (viewportW - cardW)` →\n * `posX = cardLeft / (viewportW - cardW)`. Mismo modelo que serializa el\n * dashboard (`style.posX/posY` en 0..1) y consume `applyDesignVars`.\n */\nimport type { GuideType } from '../guides/types';\n\n/** Merge superficial sobre `step.style` del paso activo (lo aplica el panel). */\nexport interface DesignPatch {\n stepIndex: number;\n style: {\n posX?: number;\n posY?: number;\n width?: number;\n height?: number;\n position?: 'top' | 'bottom';\n };\n}\n\nexport interface DesignManipulatorOptions {\n /** Host de la guía (de `PreviewHandle.host()`), con shadow root abierto. */\n host: HTMLElement;\n guideType: GuideType;\n stepIndex: number;\n /** Se emite UNA vez por gesto, al soltar. */\n onCommit: (patch: DesignPatch) => void;\n /** Fin de cualquier gesto (con o sin cambios). Para aplicar previews encolados. */\n onGestureEnd?: () => void;\n}\n\nexport interface DesignManipulatorHandle {\n /** `true` mientras hay un gesto de drag/resize en curso. */\n isDragging(): boolean;\n /** Remueve handles, estilos y listeners. Idempotente. */\n detach(): void;\n}\n\nconst MIN_W = 220;\nconst MAX_W = 720;\nconst MIN_H = 120;\nconst MAX_H = 900;\n/** Zonas de agarre de los bordes (px). */\nconst EDGE = 8;\n\ntype ResizeDir = 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw';\nconst RESIZE_DIRS: ResizeDir[] = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'];\n\nconst MANIPULATOR_CSS = `\n.veo-mnp-card {\n outline: 1.5px dashed rgba(255, 91, 53, 0.75);\n outline-offset: 2px;\n}\n.veo-mnp-card:hover { cursor: move; }\n.veo-mnp-handle {\n position: absolute;\n z-index: 10;\n background: transparent;\n}\n.veo-mnp-handle::after {\n content: '';\n position: absolute;\n width: 8px; height: 8px;\n background: #fff;\n border: 1.5px solid rgba(255, 91, 53, 0.9);\n border-radius: 2px;\n top: 50%; left: 50%;\n transform: translate(-50%, -50%);\n opacity: 0;\n transition: opacity 100ms ease;\n}\n.veo-mnp-card:hover .veo-mnp-handle::after,\n.veo-mnp-handle:hover::after { opacity: 1; }\n.veo-mnp-n { top: -${EDGE / 2}px; left: ${EDGE}px; right: ${EDGE}px; height: ${EDGE}px; cursor: ns-resize; }\n.veo-mnp-s { bottom: -${EDGE / 2}px; left: ${EDGE}px; right: ${EDGE}px; height: ${EDGE}px; cursor: ns-resize; }\n.veo-mnp-e { right: -${EDGE / 2}px; top: ${EDGE}px; bottom: ${EDGE}px; width: ${EDGE}px; cursor: ew-resize; }\n.veo-mnp-w { left: -${EDGE / 2}px; top: ${EDGE}px; bottom: ${EDGE}px; width: ${EDGE}px; cursor: ew-resize; }\n.veo-mnp-ne { top: -${EDGE / 2}px; right: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nesw-resize; }\n.veo-mnp-nw { top: -${EDGE / 2}px; left: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nwse-resize; }\n.veo-mnp-se { bottom: -${EDGE / 2}px; right: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nwse-resize; }\n.veo-mnp-sw { bottom: -${EDGE / 2}px; left: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nesw-resize; }\n.veo-mnp-banner { outline: 1.5px dashed rgba(255, 91, 53, 0.75); outline-offset: -2px; cursor: grab; }\n.veo-mnp-banner:active { cursor: grabbing; }\n`;\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.min(Math.max(v, min), max);\n}\n\nfunction round3(v: number): number {\n return Math.round(v * 1000) / 1000;\n}\n\n/** true si el mousedown cayó sobre algo interactivo (no iniciar drag ahí). */\nfunction isInteractive(target: EventTarget | null): boolean {\n return Boolean(\n target instanceof Element && target.closest('button, a, input, textarea, select, label'),\n );\n}\n\n/**\n * Adjunta la manipulación directa al host de una guía montada. Devuelve el\n * handle, o `null` si el tipo de guía no la soporta o el DOM esperado no está.\n * Idempotente: si la card ya está decorada, no re-adjunta.\n */\nexport function attachDesignManipulator(\n opts: DesignManipulatorOptions,\n): DesignManipulatorHandle | null {\n const shadow = opts.host.shadowRoot;\n if (!shadow) return null;\n\n const card = shadow.querySelector<HTMLElement>('.veo-modal-card');\n if (card) return attachModal(opts, shadow, card);\n\n const banner = shadow.querySelector<HTMLElement>('.veo-banner');\n // El banner embebido se posiciona con prepend/append en el contenedor: su\n // top/bottom se cambia desde el panel (remonta). Solo el fijo se arrastra.\n if (banner && !banner.classList.contains('veo-banner-embedded')) {\n return attachBanner(opts, shadow, banner);\n }\n\n return null;\n}\n\n// ── Modal: drag libre + resize por 8 handles ────────────────────────────────\n\nfunction attachModal(\n opts: DesignManipulatorOptions,\n shadow: ShadowRoot,\n card: HTMLElement,\n): DesignManipulatorHandle | null {\n if (card.dataset.veoManipulated === '1') return null;\n card.dataset.veoManipulated = '1';\n card.classList.add('veo-mnp-card');\n\n const doc = card.ownerDocument;\n const style = doc.createElement('style');\n style.textContent = MANIPULATOR_CSS;\n shadow.appendChild(style);\n\n const handles: HTMLElement[] = [];\n for (const dir of RESIZE_DIRS) {\n const h = doc.createElement('div');\n h.className = `veo-mnp-handle veo-mnp-${dir}`;\n h.dataset.veoDir = dir;\n card.appendChild(h);\n handles.push(h);\n }\n\n let dragging = false;\n let detached = false;\n\n /** Últimos valores aplicados durante el gesto (para el commit del up). */\n let patch: DesignPatch['style'] = {};\n\n const setVars = (v: { px?: number; py?: number; w?: number; h?: number }): void => {\n const host = opts.host;\n if (v.px !== undefined) host.style.setProperty('--veo-pos-x', `${v.px * 100}%`);\n if (v.py !== undefined) host.style.setProperty('--veo-pos-y', `${v.py * 100}%`);\n if (v.w !== undefined) host.style.setProperty('--veo-width', `${v.w}px`);\n if (v.h !== undefined) host.style.setProperty('--veo-min-h', `${v.h}px`);\n };\n\n /**\n * Un gesto genérico: guarda el rect inicial, traduce cada mousemove a\n * variables CSS (rAF-throttled) y al soltar emite el commit acumulado.\n */\n const startGesture = (\n e: MouseEvent,\n apply: (dx: number, dy: number, start: DOMRect) => DesignPatch['style'],\n ): void => {\n e.preventDefault();\n e.stopPropagation();\n dragging = true;\n patch = {};\n const start = card.getBoundingClientRect();\n const sx = e.clientX;\n const sy = e.clientY;\n let raf = 0;\n let lastEv: MouseEvent | null = null;\n\n const flush = (): void => {\n raf = 0;\n if (!lastEv) return;\n const next = apply(lastEv.clientX - sx, lastEv.clientY - sy, start);\n patch = { ...patch, ...next };\n setVars({\n ...(next.posX !== undefined ? { px: next.posX } : {}),\n ...(next.posY !== undefined ? { py: next.posY } : {}),\n ...(next.width !== undefined ? { w: next.width } : {}),\n ...(next.height !== undefined ? { h: next.height } : {}),\n });\n };\n\n const move = (ev: MouseEvent): void => {\n lastEv = ev;\n // rAF-throttle del feedback; fallback síncrono si el entorno no tiene rAF.\n if (typeof window.requestAnimationFrame !== 'function') flush();\n else if (!raf) raf = window.requestAnimationFrame(flush);\n };\n const up = (): void => {\n window.removeEventListener('mousemove', move);\n window.removeEventListener('mouseup', up);\n if (raf) window.cancelAnimationFrame(raf);\n flush();\n dragging = false;\n if (Object.keys(patch).length > 0 && !detached) {\n opts.onCommit({ stepIndex: opts.stepIndex, style: patch });\n }\n opts.onGestureEnd?.();\n };\n window.addEventListener('mousemove', move);\n window.addEventListener('mouseup', up);\n };\n\n /** posX para que el borde izquierdo quede en `left` con ancho `w`. */\n const posXFor = (left: number, w: number): number => {\n const span = window.innerWidth - w;\n return span <= 0 ? 0.5 : round3(clamp(left / span, 0, 1));\n };\n const posYFor = (top: number, h: number): number => {\n const span = window.innerHeight - h;\n return span <= 0 ? 0.5 : round3(clamp(top / span, 0, 1));\n };\n\n const onCardDown = (e: MouseEvent): void => {\n if (isInteractive(e.target)) return;\n if (e.target instanceof Element && e.target.closest('.veo-mnp-handle')) return;\n startGesture(e, (dx, dy, start) => ({\n posX: posXFor(start.left + dx, start.width),\n posY: posYFor(start.top + dy, start.height),\n }));\n };\n\n const onHandleDown = (e: MouseEvent): void => {\n const dir = (e.currentTarget as HTMLElement).dataset.veoDir as ResizeDir;\n startGesture(e, (dx, dy, start) => {\n const out: DesignPatch['style'] = {};\n if (dir.includes('e')) out.width = Math.round(clamp(start.width + dx, MIN_W, MAX_W));\n if (dir.includes('w')) {\n out.width = Math.round(clamp(start.width - dx, MIN_W, MAX_W));\n // El borde derecho queda fijo: la card se re-ancla donde corresponde.\n out.posX = posXFor(start.right - out.width, out.width);\n }\n if (dir.includes('s')) out.height = Math.round(clamp(start.height + dy, MIN_H, MAX_H));\n if (dir.includes('n')) {\n out.height = Math.round(clamp(start.height - dy, MIN_H, MAX_H));\n out.posY = posYFor(start.bottom - out.height, out.height);\n }\n return out;\n });\n };\n\n card.addEventListener('mousedown', onCardDown);\n for (const h of handles) h.addEventListener('mousedown', onHandleDown);\n\n return {\n isDragging: () => dragging,\n detach: () => {\n if (detached) return;\n detached = true;\n card.removeEventListener('mousedown', onCardDown);\n for (const h of handles) h.remove();\n style.remove();\n card.classList.remove('veo-mnp-card');\n delete card.dataset.veoManipulated;\n },\n };\n}\n\n// ── Banner fijo: drag vertical con snap top/bottom ──────────────────────────\n\nfunction attachBanner(\n opts: DesignManipulatorOptions,\n shadow: ShadowRoot,\n banner: HTMLElement,\n): DesignManipulatorHandle | null {\n if (banner.dataset.veoManipulated === '1') return null;\n banner.dataset.veoManipulated = '1';\n banner.classList.add('veo-mnp-banner');\n\n const doc = banner.ownerDocument;\n const style = doc.createElement('style');\n style.textContent = MANIPULATOR_CSS;\n shadow.appendChild(style);\n\n let dragging = false;\n let detached = false;\n\n const positionOf = (): 'top' | 'bottom' =>\n banner.classList.contains('veo-banner-bottom') ? 'bottom' : 'top';\n\n const onDown = (e: MouseEvent): void => {\n if (isInteractive(e.target)) return;\n e.preventDefault();\n dragging = true;\n const startPos = positionOf();\n let current = startPos;\n\n const move = (ev: MouseEvent): void => {\n // Snap: la mitad del viewport decide top/bottom, con feedback en vivo.\n const next = ev.clientY < window.innerHeight / 2 ? 'top' : 'bottom';\n if (next !== current) {\n current = next;\n banner.classList.remove('veo-banner-top', 'veo-banner-bottom');\n banner.classList.add(`veo-banner-${next}`);\n }\n };\n const up = (): void => {\n window.removeEventListener('mousemove', move);\n window.removeEventListener('mouseup', up);\n dragging = false;\n if (current !== startPos && !detached) {\n opts.onCommit({ stepIndex: opts.stepIndex, style: { position: current } });\n }\n opts.onGestureEnd?.();\n };\n window.addEventListener('mousemove', move);\n window.addEventListener('mouseup', up);\n };\n\n banner.addEventListener('mousedown', onDown);\n\n return {\n isDragging: () => dragging,\n detach: () => {\n if (detached) return;\n detached = true;\n banner.removeEventListener('mousedown', onDown);\n style.remove();\n banner.classList.remove('veo-mnp-banner');\n delete banner.dataset.veoManipulated;\n },\n };\n}\n","/**\n * Qué cuenta como \"elemento interactivo\" para el tagueo de features: los\n * controles sobre los que un usuario actúa (botones, enlaces, campos,\n * formularios, controles ARIA…). Un `div` o `span` a secas no lo es: taguear\n * eso no mide ninguna acción y además rara vez genera eventos de autocapture\n * (ver `findMeaningfulAncestor` en `autocapture/dom-listener.ts`, que sube\n * hasta el mismo tipo de elementos antes de emitir `$autocapture`).\n *\n * Lo usan el picker (modo `only: 'interactive'`: al pasar el mouse sobre un\n * `<span>` dentro de un botón se resalta el botón) y `scan-page` (inventario\n * de candidatos a feature de la página).\n */\n\nconst INTERACTIVE_ROLES = [\n 'button',\n 'link',\n 'tab',\n 'menuitem',\n 'menuitemcheckbox',\n 'menuitemradio',\n 'checkbox',\n 'radio',\n 'switch',\n 'option',\n 'combobox',\n 'textbox',\n 'searchbox',\n 'slider',\n 'spinbutton',\n];\n\n/** Selector CSS de los elementos interactivos (para `querySelectorAll`/`closest`). */\nexport const INTERACTIVE_SELECTOR = [\n 'button',\n 'a[href]',\n 'input:not([type=\"hidden\"])',\n 'select',\n 'textarea',\n 'form',\n 'summary',\n '[contenteditable=\"true\"]',\n '[onclick]',\n '[data-veo-tag]',\n ...INTERACTIVE_ROLES.map((r) => `[role=\"${r}\"]`),\n].join(', ');\n\n/** ¿El elemento es interactivo por sí mismo? */\nexport function isInteractiveElement(element: Element): boolean {\n try {\n return element.matches(INTERACTIVE_SELECTOR);\n } catch {\n return false;\n }\n}\n\n/**\n * El elemento interactivo más cercano: el propio elemento o su ancestro\n * interactivo más próximo (`<span>` dentro de `<button>` → el botón).\n * `null` si no hay ninguno (zona no interactiva de la página).\n */\nexport function closestInteractive(element: Element): Element | null {\n try {\n return element.closest(INTERACTIVE_SELECTOR);\n } catch {\n return null;\n }\n}\n\n/**\n * Emojis y pictogramas (⚙️ 👥 ✅ …) + sus acompañantes invisibles: selectores\n * de variante (U+FE0F), ZWJ (U+200D), modificadores de tono y el «combinador»\n * de teclas (U+20E3). Es lo que la gente pone como icono dentro del texto de\n * un botón o link y no forma parte del nombre de la acción.\n */\nconst EMOJI_RE = /\\p{Extended_Pictographic}|\\p{Emoji_Modifier}|\\u{FE0F}|\\u{200D}|\\u{20E3}/gu;\n\n/**\n * Texto \"humano\" de un elemento para nombrar una feature: sin emojis ni\n * iconos, con los espacios colapsados y recortado a `max`. Si el elemento no\n * tiene texto (botón de solo icono), usa `aria-label` o `title`.\n */\nexport function elementLabelText(element: Element, max = 120): string {\n const clean = (raw: string | null | undefined): string =>\n (raw ?? '').replace(EMOJI_RE, '').replace(/\\s+/g, ' ').trim();\n const text = clean(element.textContent);\n if (text) return text.slice(0, max);\n const fallback =\n clean(element.getAttribute('aria-label')) || clean(element.getAttribute('title'));\n return fallback.slice(0, max);\n}\n","/**\n * Element picker — el \"inspeccionar\" del navegador, pero del SDK. Corre\n * DENTRO de la app del cliente (no en el dashboard: son orígenes distintos\n * y el dashboard no puede leer el DOM de la app). Resalta el elemento bajo\n * el cursor, muestra su selector + dimensiones, y al hacer click captura un\n * selector CSS estable reutilizando `buildSelectorPath` del autocapture.\n *\n * Es la base del builder no-code: el dashboard abre la app del cliente en\n * modo builder, el usuario \"pincha\" un elemento y el selector resultante se\n * usa como ancla de un tooltip/walkthrough. El puente con el dashboard\n * (postMessage) es la fase siguiente; aquí exponemos el primitivo\n * `startElementPicker(onPick)`.\n *\n * No usa `innerHTML` — todo por `textContent`/DOM, igual que los renderers.\n */\n\nimport { hasDocument } from '../../utils/safe-env';\nimport { buildSelectorPath, filterHumanClasses } from '../autocapture/selector-builder';\nimport { closestInteractive, elementLabelText } from './interactive-elements';\n\n/** z-index por encima de las guías (2147483640) para tapar también una preview. */\nconst PICKER_Z = 2147483646;\nconst PICKER_HOST_ATTR = 'data-veo-picker';\nconst DEFAULT_MAX_ANCESTORS = 5;\n\n/** Datos del elemento elegido que se entregan al caller. */\nexport interface PickedElement {\n /** Selector CSS estable con ancestros (lo que se guarda como ancla). */\n selector: string;\n /** Selector corto solo del elemento (tag + id/atributo/clases). */\n shortSelector: string;\n tag: string;\n id: string | null;\n classes: string[];\n text: string;\n rect: { x: number; y: number; width: number; height: number };\n}\n\nexport interface ElementPickerOptions {\n /** Llamado al hacer click en un elemento. El picker se cierra tras esto. */\n onPick: (picked: PickedElement) => void;\n /** Llamado al cancelar (Esc). El picker se cierra. */\n onCancel?: () => void;\n /** Niveles de ancestros del selector. Default 5 (igual que autocapture). */\n maxAncestors?: number;\n /** Título del banner superior. Default en español. */\n hint?: string;\n /** Subtítulo del banner (default: cómo abrir menús con Alt + clic). */\n subhint?: string;\n /**\n * `'interactive'`: solo se pueden elegir elementos interactivos (botones,\n * enlaces, campos, formularios, controles ARIA…); al pasar sobre un hijo\n * (p. ej. el `<span>` de un botón) se resalta el control que lo contiene, y\n * sobre zonas no interactivas no se resalta ni se puede elegir nada.\n * Default: cualquier elemento (anclas de guías).\n */\n only?: 'interactive';\n}\n\nexport interface ElementPickerHandle {\n /** Cierra el picker sin elegir nada. Idempotente. */\n stop(): void;\n}\n\nconst PICKER_STYLES = `\n:host { all: initial; }\n.veo-pick-box {\n position: fixed;\n z-index: ${PICKER_Z};\n pointer-events: none;\n box-sizing: border-box;\n background: transparent;\n border: 3px dashed #b74d00;\n border-radius: 8px;\n transition: top 60ms ease-out, left 60ms ease-out, width 60ms ease-out, height 60ms ease-out;\n}\n.veo-pick-label {\n position: fixed;\n z-index: ${PICKER_Z};\n pointer-events: none;\n max-width: 360px;\n background: #2b2623;\n color: #f5efe9;\n font: 12px/1.45 ui-monospace, SFMono-Regular, Menlo, monospace;\n padding: 6px 9px;\n border-radius: 6px;\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.35);\n}\n.veo-pick-label .veo-pick-sel { color: #ffd1ad; word-break: break-all; }\n.veo-pick-label .veo-pick-dim { color: #c9c2bb; margin-top: 3px; }\n.veo-pick-hint {\n position: fixed;\n top: 28px;\n left: 50%;\n transform: translateX(-50%);\n z-index: ${PICKER_Z};\n pointer-events: none;\n display: flex; align-items: center; gap: 16px;\n max-width: min(760px, calc(100vw - 32px));\n background: #2b2623;\n color: #fff;\n font: 15px/1.4 -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n padding: 14px 18px 14px 16px;\n border-radius: 14px;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n}\n.veo-pick-hint-icon {\n flex: 0 0 auto; width: 44px; height: 44px; border-radius: 999px;\n background: rgba(255,255,255,0.12);\n display: inline-flex; align-items: center; justify-content: center;\n}\n.veo-pick-hint-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; }\n.veo-pick-hint-title { font-weight: 700; }\n.veo-pick-hint-sub { font-size: 13px; color: rgba(255,255,255,0.75); }\n.veo-pick-cancel {\n flex: 0 0 auto; pointer-events: auto;\n border: 0; border-radius: 10px; padding: 12px 18px;\n background: rgba(255,255,255,0.14); color: #fff;\n font: inherit; font-weight: 600; cursor: pointer;\n}\n.veo-pick-cancel:hover { background: rgba(255,255,255,0.24); }\n`;\n\nconst HINT_ICON =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" ' +\n 'stroke=\"currentColor\" stroke-width=\"1.6\" aria-hidden=\"true\"><path stroke-linecap=\"round\" ' +\n 'stroke-linejoin=\"round\" d=\"M7.5 3.75H6A2.25 2.25 0 0 0 3.75 6v1.5M16.5 3.75H18A2.25 2.25 0 0 1 ' +\n '20.25 6v1.5m0 9V18A2.25 2.25 0 0 1 18 20.25h-1.5m-9 0H6A2.25 2.25 0 0 1 3.75 18v-1.5M15 12a3 3 ' +\n '0 1 1-6 0 3 3 0 0 1 6 0Z\"/></svg>';\n\n/**\n * Controla un picker activo. Singleton a nivel de módulo: empezar otro\n * cierra el anterior. Los listeners van en fase de captura para poder\n * cancelar el click ANTES de que la app del cliente reaccione.\n */\nclass ElementPicker {\n private host: HTMLElement | null = null;\n private box: HTMLElement | null = null;\n private label: HTMLElement | null = null;\n private current: Element | null = null;\n private maxAncestors = DEFAULT_MAX_ANCESTORS;\n private only: 'interactive' | null = null;\n private onPick: ((p: PickedElement) => void) | null = null;\n private onCancel: (() => void) | null = null;\n\n start(options: ElementPickerOptions): void {\n this.stop(); // solo un picker a la vez\n\n this.maxAncestors = options.maxAncestors ?? DEFAULT_MAX_ANCESTORS;\n this.only = options.only ?? null;\n this.onPick = options.onPick;\n this.onCancel = options.onCancel ?? null;\n\n const host = document.createElement('div');\n host.setAttribute(PICKER_HOST_ATTR, '');\n const shadow = host.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = PICKER_STYLES;\n\n this.box = document.createElement('div');\n this.box.className = 'veo-pick-box';\n this.box.style.display = 'none';\n\n this.label = document.createElement('div');\n this.label.className = 'veo-pick-label';\n this.label.style.display = 'none';\n\n // Banner (mock 2026-09): icono · título + subtítulo · Cancelar.\n const hint = document.createElement('div');\n hint.className = 'veo-pick-hint';\n const icon = document.createElement('span');\n icon.className = 'veo-pick-hint-icon';\n icon.innerHTML = HINT_ICON;\n const text = document.createElement('div');\n text.className = 'veo-pick-hint-text';\n const title = document.createElement('span');\n title.className = 'veo-pick-hint-title';\n title.textContent = options.hint ?? 'Selecciona un elemento existente para colocar la guía.';\n const sub = document.createElement('span');\n sub.className = 'veo-pick-hint-sub';\n sub.textContent =\n options.subhint ?? 'Usa Alt + clic u Opción + clic para abrir menús y desplegables.';\n text.append(title, sub);\n const cancel = document.createElement('button');\n cancel.className = 'veo-pick-cancel';\n cancel.type = 'button';\n cancel.textContent = 'Cancelar';\n cancel.addEventListener('click', (e) => {\n e.stopPropagation();\n const cb = this.onCancel;\n this.stop();\n cb?.();\n });\n hint.append(icon, text, cancel);\n\n shadow.append(style, this.box, this.label, hint);\n document.body.appendChild(host);\n this.host = host;\n\n document.addEventListener('mousemove', this.onMove, true);\n document.addEventListener('click', this.onClick, true);\n document.addEventListener('mousedown', this.swallow, true);\n document.addEventListener('mouseup', this.swallow, true);\n document.addEventListener('keydown', this.onKey, true);\n window.addEventListener('scroll', this.reposition, true);\n window.addEventListener('resize', this.reposition);\n }\n\n stop(): void {\n document.removeEventListener('mousemove', this.onMove, true);\n document.removeEventListener('click', this.onClick, true);\n document.removeEventListener('mousedown', this.swallow, true);\n document.removeEventListener('mouseup', this.swallow, true);\n document.removeEventListener('keydown', this.onKey, true);\n window.removeEventListener('scroll', this.reposition, true);\n window.removeEventListener('resize', this.reposition);\n\n if (this.host?.parentNode) this.host.parentNode.removeChild(this.host);\n this.host = null;\n this.box = null;\n this.label = null;\n this.current = null;\n this.only = null;\n this.onPick = null;\n this.onCancel = null;\n }\n\n /** Elemento que se elegiría para el nodo bajo el cursor (o null si no hay). */\n private resolveTarget(target: EventTarget | null): Element | null {\n if (!(target instanceof Element) || this.isOwn(target)) return null;\n return this.only === 'interactive' ? closestInteractive(target) : target;\n }\n\n private hideBox(): void {\n if (this.box) this.box.style.display = 'none';\n if (this.label) this.label.style.display = 'none';\n }\n\n /** ¿Es un nodo de nuestro propio overlay? (no debe ser seleccionable). */\n private isOwn(target: EventTarget | null): boolean {\n return target instanceof Node && this.host !== null && this.host.contains(target);\n }\n\n private onMove = (event: MouseEvent): void => {\n if (!(event.target instanceof Element) || this.isOwn(event.target)) return;\n const target = this.resolveTarget(event.target);\n this.current = target;\n if (target) this.draw(target);\n else this.hideBox(); // zona no interactiva: nada que elegir\n };\n\n private onClick = (event: MouseEvent): void => {\n // Alt/Opción + clic: pasa a la app (abrir menús/desplegables) sin seleccionar.\n if (event.altKey) return;\n if (this.isOwn(event.target)) return;\n\n // Evitar que la app reaccione al click de selección.\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n const target = this.current ?? this.resolveTarget(event.target);\n if (!target) return; // nada elegible bajo el cursor: el picker sigue abierto\n\n const picked = this.describe(target);\n const cb = this.onPick;\n this.stop();\n cb?.(picked);\n };\n\n private onKey = (event: KeyboardEvent): void => {\n if (event.key !== 'Escape') return;\n event.preventDefault();\n event.stopPropagation();\n const cb = this.onCancel;\n this.stop();\n cb?.();\n };\n\n /** Traga mousedown/mouseup durante el picking (evita focus/active de la app). */\n private swallow = (event: MouseEvent): void => {\n if (event.altKey || this.isOwn(event.target)) return;\n event.preventDefault();\n event.stopPropagation();\n };\n\n private reposition = (): void => {\n if (this.current) this.draw(this.current);\n };\n\n /** Dibuja el recuadro de resalte y la etiqueta sobre el elemento dado. */\n private draw(element: Element): void {\n if (!this.box || !this.label) return;\n const rect = element.getBoundingClientRect();\n\n this.box.style.display = 'block';\n this.box.style.top = `${rect.top}px`;\n this.box.style.left = `${rect.left}px`;\n this.box.style.width = `${rect.width}px`;\n this.box.style.height = `${rect.height}px`;\n\n const shortSel = buildSelectorPath(element, 0);\n this.label.textContent = '';\n const sel = document.createElement('div');\n sel.className = 'veo-pick-sel';\n sel.textContent = shortSel;\n const dim = document.createElement('div');\n dim.className = 'veo-pick-dim';\n dim.textContent = `${Math.round(rect.width)} × ${Math.round(rect.height)}`;\n this.label.append(sel, dim);\n\n // Etiqueta debajo del recuadro; si no hay espacio, arriba.\n this.label.style.display = 'block';\n const LABEL_H = 48;\n const placeAbove = rect.bottom + 8 + LABEL_H > window.innerHeight;\n this.label.style.top = placeAbove\n ? `${Math.max(8, rect.top - LABEL_H - 8)}px`\n : `${rect.bottom + 8}px`;\n this.label.style.left = `${Math.max(8, rect.left)}px`;\n }\n\n private describe(element: Element): PickedElement {\n const rect = element.getBoundingClientRect();\n return {\n selector: buildSelectorPath(element, this.maxAncestors),\n shortSelector: buildSelectorPath(element, 0),\n tag: element.tagName.toLowerCase(),\n id: element.id || null,\n classes: filterHumanClasses(element),\n text: elementLabelText(element),\n rect: {\n x: Math.round(rect.left),\n y: Math.round(rect.top),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n },\n };\n }\n}\n\nlet activePicker: ElementPicker | null = null;\n\n/**\n * Inicia el modo de selección de elementos (inspector). Resalta lo que está\n * bajo el cursor y, al hacer click, entrega un selector CSS estable.\n * Devuelve un handle con `stop()`. Iniciar otro picker cierra el anterior.\n *\n * @example\n * ```ts\n * import { startElementPicker } from '@veo/sdk';\n *\n * const picker = startElementPicker({\n * onPick: ({ selector }) => console.log('elegido:', selector),\n * onCancel: () => console.log('cancelado'),\n * });\n * // picker.stop() para abortar manualmente.\n * ```\n */\nexport function startElementPicker(options: ElementPickerOptions): ElementPickerHandle {\n if (!hasDocument()) {\n return { stop: () => {} };\n }\n if (!activePicker) activePicker = new ElementPicker();\n activePicker.start(options);\n return { stop: () => activePicker?.stop() };\n}\n\n/** Cierra el picker activo, si lo hay. Idempotente. */\nexport function stopElementPicker(): void {\n activePicker?.stop();\n}\n","/**\n * Lado APP del puente builder. Corre dentro de la app del cliente (vía\n * veo-builder.js). Si el contexto trae `?veoBuilder=<token>`, se conecta con el\n * editor de Veo, atiende comandos y devuelve el elemento elegido.\n *\n * Dos transportes:\n * - **iframe/popup** (`resolveTarget` = opener/parent): el dashboard es la\n * ventana principal y embebe/abre la app; le hablamos a esa ventana.\n * - **panel inyectado** (`ctx.panel`): la app es top-level (login real) y NOSOTROS\n * inyectamos el panel del editor encima (iframe al dashboard); le hablamos a\n * ese iframe. Es el modo sin adaptación por app.\n *\n * Seguridad: solo acepta mensajes cuyo `origin` coincida con el del dashboard\n * (`veoBuilderOrigin` / `document.referrer`) y cuyo `token` coincida.\n */\nimport {\n type BuilderClientContext,\n clearBuilderToken,\n resolveBuilderContext,\n} from '../../core/builder-token';\nimport { hasDocument, hasWindow } from '../../utils/safe-env';\nimport { buildSelectorPath, filterHumanClasses } from '../autocapture/selector-builder';\nimport { isDeviceAllowed } from '../guides/activation-devices';\nimport { activationDelayMs, isAutomaticActivation } from '../guides/activation-rules';\nimport { applyBlockStyle, buildContentBlock } from '../guides/block-builder';\nimport { RAW_BLOCK_ATTR } from '../guides/code-block';\nimport { closeGuidePreview, previewGuide } from '../guides/guide-preview';\nimport { groupLayout } from '../guides/layout';\nimport { GUIDE_STYLES } from '../guides/styles';\nimport type { CompositeStep, StepBlock } from '../guides/types';\nimport { stepMatchesPage } from '../guides/url-match';\nimport { attachBlockDropTarget, type BlockDropTargetHandle } from './block-drop-target';\nimport {\n type BlockLayoutAction,\n type BlockToolbarAction,\n type BuilderCommand,\n type BuilderEvent,\n type CardToolbarAction,\n type ConfirmationCard,\n type EditorChromeState,\n type PageElement,\n type PageScan,\n type PreviewStatus,\n type RowToolbarAction,\n VEO_BUILDER_SOURCE,\n} from './bridge-protocol';\nimport { type BuilderChromeHandle, injectBuilderChrome } from './builder-chrome';\nimport { type BuilderPanelHandle, injectBuilderPanel } from './builder-panel';\nimport { attachDesignManipulator, type DesignManipulatorHandle } from './design-manipulator';\nimport { type ElementPickerHandle, startElementPicker } from './element-picker';\nimport { elementLabelText, INTERACTIVE_SELECTOR } from './interactive-elements';\n\nexport interface BuilderModeHandle {\n /** Desconecta el puente y limpia picker/preview/panel. */\n teardown(): void;\n}\n\n/** Selección del bloque code crudo (ver `attachRawBlock`). */\ninterface RawBlockHandle {\n /** Resalta el bloque si `id` es el suyo; con otro id (o null) lo oculta. */\n select(id: string | null): void;\n detach(): void;\n}\n\n/**\n * Inicializa el modo builder si hay contexto (URL o persistido). Devuelve un\n * handle, o `null` si no estamos en modo builder o no hay canal con el editor.\n * Es seguro llamarla siempre.\n */\n/** Estilos del modal de confirmación (shadow DOM, tokens OnUser: coral #b74d00, success #e6f6df/#406a31). */\nconst CONFIRMATION_STYLES = `\n:host { all: initial; }\n.veo-confirm-backdrop {\n position: fixed; inset: 0; z-index: 2147483645;\n background: rgba(20, 16, 14, 0.45);\n}\n.veo-confirm {\n position: fixed; left: 50%; top: 50%; transform: translate(-50%, -50%);\n z-index: 2147483646; box-sizing: border-box;\n width: min(432px, calc(100vw - 32px)); padding: 28px 24px 24px;\n border-radius: 16px; background: #fff; color: #1d1917;\n box-shadow: 0 24px 64px rgba(0,0,0,0.28);\n font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif;\n text-align: center;\n}\n.veo-confirm-check {\n width: 64px; height: 64px; margin: 0 auto; border-radius: 50%;\n background: #e6f6df; color: #2f9a4e; display: flex; align-items: center; justify-content: center;\n}\n.veo-confirm-check svg { width: 30px; height: 30px; }\n.veo-confirm-title { margin: 18px 0 0; font-size: 17px; font-weight: 600; }\n.veo-confirm-msg { margin: 8px 0 0; font-size: 13px; color: #6b6461; }\n.veo-confirm-rows {\n margin: 18px 0 0; padding: 12px 14px; border-radius: 12px; background: #f6f2ef; text-align: left;\n}\n.veo-confirm-row { display: flex; justify-content: space-between; gap: 16px; font-size: 13px; padding: 4px 0; }\n.veo-confirm-row dt { color: #6b6461; margin: 0; }\n.veo-confirm-row dd { margin: 0; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.veo-confirm-btn {\n display: block; width: 100%; margin-top: 18px; height: 44px; border: 0; border-radius: 10px;\n background: #b74d00; color: #fff; font: inherit; font-size: 15px; font-weight: 600; cursor: pointer;\n}\n.veo-confirm-btn:hover { background: #953c00; }\n.veo-confirm-btn:focus-visible { outline: 3px solid rgba(183,77,0,0.35); outline-offset: 2px; }\n`;\n\nexport function initBuilderMode(): BuilderModeHandle | null {\n if (!hasWindow() || !hasDocument()) return null;\n\n // Contexto de la URL o de sessionStorage: sobrevive al redirect del guard de\n // auth (que suele tirar el query string) y a un login en la misma pestaña.\n const ctx = resolveBuilderContext();\n if (!ctx) return null;\n\n const token = ctx.token;\n const dashboardOrigin = resolveDashboardOrigin(ctx.origin);\n if (!dashboardOrigin) return null;\n\n let picker: ElementPickerHandle | null = null;\n let panel: BuilderPanelHandle | null = null;\n /** Barras del editor (topbar + pasos) sobre la app; solo en modo panel. */\n let chrome: BuilderChromeHandle | null = null;\n let staticTarget: Window | null = null;\n let manipulator: DesignManipulatorHandle | null = null;\n let dropTarget: BlockDropTargetHandle | null = null;\n /** Detach del listener de clic simple sobre la tarjeta (→ «Agregar bloque»). */\n let cardClick: (() => void) | null = null;\n /** Selección del bloque code CRUDO (inline de un solo bloque code, sin tarjeta). */\n let rawBlock: RawBlockHandle | null = null;\n /** Bloque seleccionado en la app (id local del panel); sobrevive a los re-renders. */\n let selectedBlockId: string | null = null;\n /** Fantasma que sigue el cursor durante el drag de un bloque de la paleta. */\n let dragGhost: HTMLElement | null = null;\n /** Paso mostrado por la preview activa (destino de los drops de bloque). */\n let previewStepIndex = 0;\n /** Preview que llegó DURANTE un drag: se aplica al terminar el gesto. */\n let pendingPreview: Extract<BuilderCommand, { type: 'preview' }> | null = null;\n /** Último comando de preview: se re-evalúa al navegar (targeting por-página). */\n let lastPreview: Extract<BuilderCommand, { type: 'preview' }> | null = null;\n /** Modo vista previa (ojo de la topbar): guía sin editor ni barras. */\n let previewMode = false;\n /** Disparador por elemento objetivo armado para la preview (click/hover). */\n let previewTrigger: (() => void) | null = null;\n /** Ya se disparó: las siguientes previews se pintan directo hasta que se cierre. */\n let previewFired = false;\n /** «Retrasar la aparición» en curso para la preview (timer de delayMs). */\n let previewDelay: ReturnType<typeof setTimeout> | null = null;\n /**\n * El autor cerró la guía con ✕. Con Automático + Elemento objetivo la guía ya\n * arrancó sola; tras cerrarla debe esperar la interacción con el elemento\n * (como el runtime), no repintarse al instante.\n */\n let previewDismissed = false;\n /** Si la tarjeta estaba visible al entrar en vista previa (se restaura al salir). */\n let panelWasVisible = true;\n const getTarget = (): Window | null => (panel ? panel.target() : staticTarget);\n\n const post = (event: BuilderEvent): void => {\n getTarget()?.postMessage({ source: VEO_BUILDER_SOURCE, token, ...event }, dashboardOrigin);\n };\n\n /**\n * ¿El paso que se está previsualizando aplica a la URL ACTUAL? El editor debe\n * reflejar el targeting por-página real: si el paso apunta a otra página, la\n * preview NO se muestra (igual que el runtime). `sitewide`/sin pageLocation →\n * siempre true, así el editado normal no se ve afectado.\n */\n const previewStep = (\n cmd: Extract<BuilderCommand, { type: 'preview' }>,\n ): CompositeStep | undefined => {\n const steps = cmd.guide.guideSteps as unknown as CompositeStep[] | undefined;\n return steps?.[cmd.guide.startStepIndex ?? 0];\n };\n const previewMatchesPage = (cmd: Extract<BuilderCommand, { type: 'preview' }>): boolean =>\n stepMatchesPage(previewStep(cmd)?.pageLocation, window.location.href);\n\n const postPreviewStatus = (payload: PreviewStatus): void =>\n post({ type: 'preview-status', payload });\n\n const detachPreviewTools = (): void => {\n manipulator?.detach();\n manipulator = null;\n dropTarget?.detach();\n dropTarget = null;\n cardClick?.();\n cardClick = null;\n rowHover?.();\n rowHover = null;\n hoverRowId = null;\n hoverCard = false;\n rawBlock?.detach();\n rawBlock = null;\n // Sin herramientas no hay preview «editable» pintada: el próximo comando\n // igual no debe parchearse en el lugar (saltaría el enganche de clics,\n // marcos y hover, p. ej. al salir de vista previa). Se repinta completo.\n shownPreview = null;\n };\n\n const withholdPreview = (): void => {\n detachPreviewTools();\n shownPreview = null;\n closeGuidePreview();\n };\n\n /**\n * Marco de selección: aire alrededor del bloque (el «tamaño por defecto» al\n * seleccionar) y hueco de la barra. Sin alto mínimo: un marco más alto que\n * el bloque se montaba sobre los bloques vecinos.\n */\n /** Aire del marco alrededor del bloque (los bloques ya no llevan padding propio). */\n const FRAME_PAD = 4;\n const FRAME_MIN_H = 0;\n const TOOLBAR_H = 30;\n\n const ICON = {\n pencil:\n '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125\"/></svg>',\n copy: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M16.5 8.25V6a2.25 2.25 0 0 0-2.25-2.25H6A2.25 2.25 0 0 0 3.75 6v8.25A2.25 2.25 0 0 0 6 16.5h2.25m8.25-8.25H18a2.25 2.25 0 0 1 2.25 2.25V18A2.25 2.25 0 0 1 18 20.25h-7.5A2.25 2.25 0 0 1 8.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 0 0-2.25 2.25v6\"/></svg>',\n trash:\n '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0\"/></svg>',\n };\n const ICON_MOVE = {\n left: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19.5 12h-15m0 0 6.75 6.75M4.5 12l6.75-6.75\"/></svg>',\n right:\n '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4.5 12h15m0 0-6.75-6.75M19.5 12l-6.75 6.75\"/></svg>',\n };\n\n /**\n * Qué movimientos admite un bloque DENTRO de su fila (espejo de\n * `moveBlockByLayout` del panel): izquierda/derecha si la fila tiene una\n * columna a ese lado.\n */\n const moveAbility = (blocks: StepBlock[], blockId: string): { left: boolean; right: boolean } => {\n for (const row of groupLayout(blocks)) {\n for (let c = 0; c < row.columns.length; c++) {\n const col = row.columns[c] as (typeof row.columns)[number];\n if (!col.blocks.some((b) => b.block.editorId === blockId)) continue;\n return { left: c > 0, right: c < row.columns.length - 1 };\n }\n }\n return { left: false, right: false };\n };\n\n /** Bloques del paso mostrado (preview), para calcular disponibilidad de mover. */\n let previewBlocks: StepBlock[] = [];\n /**\n * Editor de fila. Una fila no tiene id propio: se identifica por el `editorId`\n * de su PRIMER bloque. `hoverRowId` = fila bajo el mouse; `selectedRowId` = la\n * que el panel está editando (`select-row`). El marco/barra de fila se pinta\n * para la fila editada, si no la del bloque seleccionado, si no la del hover.\n */\n let hoverRowId: string | null = null;\n let selectedRowId: string | null = null;\n let rowHover: (() => void) | null = null;\n /** Hover sobre el contenedor (tarjeta): contorno + pestañas «Editar contenedor / filas». */\n let hoverCard = false;\n /** Sección que muestra el panel (del último `editor-state`): marca la pestaña activa. */\n let panelSection: EditorChromeState['section'] | null = null;\n /** Comando cuya preview está pintada ahora (base del parche en el lugar). */\n let shownPreview: Extract<BuilderCommand, { type: 'preview' }> | null = null;\n\n /** Firma estructural de un paso: todo salvo texto/html/estilo de cada bloque. */\n const structureOf = (step: CompositeStep | undefined): string => {\n if (!step) return '';\n const { blocks, ...rest } = step;\n return JSON.stringify({\n rest,\n blocks: (blocks ?? []).map((b) => {\n const { text: _t, html: _h, style: _s, ...keep } = b as StepBlock;\n return keep;\n }),\n });\n };\n\n /**\n * Parche en el lugar (edición): si el paso mostrado tiene la MISMA estructura\n * que el nuevo (bloques, layout, diseño del contenedor, acciones), solo se\n * reconstruyen los nodos de los bloques cuyo texto/html/estilo cambió. Así\n * escribir no repinta (ni hace parpadear) toda la tarjeta. Devuelve false si\n * hay que repintar entera.\n */\n const tryPatchPreview = (cmd: Extract<BuilderCommand, { type: 'preview' }>): boolean => {\n const prev = shownPreview;\n if (!prev || cmd.guide.guideType !== 'composite' || prev.guide.guideType !== 'composite') {\n return false;\n }\n const idx = cmd.guide.startStepIndex ?? 0;\n if ((prev.guide.startStepIndex ?? 0) !== idx) return false;\n // Lo que no es el paso (activación, badge abierto, etc.) también debe ser igual.\n const guideSig = (g: typeof cmd.guide): string =>\n JSON.stringify({ ...g, guideSteps: undefined });\n if (guideSig(prev.guide) !== guideSig(cmd.guide) || prev.editable !== cmd.editable)\n return false;\n const host = document.querySelector<HTMLElement>('[data-veo-guide]');\n const card = host ? previewCard(host) : null;\n if (!host || !card) return false;\n const prevStep = (prev.guide.guideSteps as unknown as CompositeStep[])[idx];\n const nextStep = (cmd.guide.guideSteps as unknown as CompositeStep[])[idx];\n if (!prevStep || !nextStep) return false;\n if (structureOf(prevStep) !== structureOf(nextStep)) return false;\n const doc = card.ownerDocument;\n const prevBlocks = prevStep.blocks ?? [];\n const nextBlocks = nextStep.blocks ?? [];\n for (let i = 0; i < nextBlocks.length; i++) {\n const a = prevBlocks[i] as StepBlock;\n const b = nextBlocks[i] as StepBlock;\n if (\n a.text === b.text &&\n a.html === b.html &&\n JSON.stringify(a.style) === JSON.stringify(b.style)\n ) {\n continue;\n }\n if (!b.editorId) return false;\n const node = card.querySelector<HTMLElement>(`[data-veo-block-id=\"${b.editorId}\"]`);\n if (!node) return false;\n if (b.type === 'button') {\n // Texto, preset y estilos; la acción no cambió (está en la estructura).\n node.textContent = b.text?.trim() || 'OK';\n node.removeAttribute('style');\n node.classList.remove('veo-guide-cta--secondary', 'veo-guide-cta--link');\n const st = (b.style ?? {}) as Record<string, unknown>;\n if (st.preset === 'secondary' || st.preset === 'link') {\n node.classList.add(`veo-guide-cta--${st.preset}`);\n }\n if (typeof st.ariaLabel === 'string' && st.ariaLabel.trim()) {\n node.setAttribute('aria-label', st.ariaLabel.trim());\n } else node.removeAttribute('aria-label');\n applyBlockStyle(node, b.style, 'button');\n continue;\n }\n if (b.type === 'code' || b.type === 'form') return false;\n const fresh =\n buildContentBlock(b, doc, { editing: true }) ??\n (() => {\n const el = doc.createElement('div');\n el.className = 'veo-block-placeholder';\n el.textContent =\n b.type === 'image'\n ? 'Imagen (sin URL)'\n : b.type === 'video'\n ? 'Video (elige proveedor y pega la URL)'\n : 'Bloque vacío';\n return el;\n })();\n fresh.dataset.veoBlock = node.dataset.veoBlock ?? String(i);\n fresh.dataset.veoBlockId = b.editorId;\n node.replaceWith(fresh);\n }\n shownPreview = cmd;\n previewBlocks = nextBlocks;\n // La geometría pudo cambiar (más/menos texto): marco, barra y huecos.\n applyBlockHighlight(host, idx);\n renderGapZones(host, idx, nextBlocks);\n return true;\n };\n\n /** Card de la preview activa (shadow root del host). */\n const previewCard = (host: HTMLElement): HTMLElement | null =>\n host.shadowRoot?.querySelector<HTMLElement>('.veo-card') ?? null;\n\n /** Quita el resaltado y la barra del bloque seleccionado (sin tocar el estado). */\n const clearBlockHighlight = (host: HTMLElement): void => {\n const card = previewCard(host);\n if (!card) return;\n for (const el of card.querySelectorAll('.veo-block--selected')) {\n el.classList.remove('veo-block--selected');\n }\n card.querySelector('.veo-block-toolbar')?.remove();\n card.querySelector('.veo-block-frame')?.remove();\n };\n\n /**\n * Resalta el bloque `selectedBlockId` en la preview y le cuelga la barra\n * (editar / duplicar / eliminar) sobre su borde superior derecho. Se llama\n * al seleccionar y tras cada re-render (cada edición repinta la card).\n */\n const applyBlockHighlight = (host: HTMLElement, stepIndex: number): void => {\n clearBlockHighlight(host);\n const card = previewCard(host);\n if (!card) return;\n const el = selectedBlockId\n ? card.querySelector<HTMLElement>(`[data-veo-block-id=\"${selectedBlockId}\"]`)\n : null;\n if (!el || !selectedBlockId) {\n renderRowChrome(host, stepIndex);\n return;\n }\n el.classList.add('veo-block--selected');\n const doc = card.ownerDocument;\n // Marco de selección: rodea al bloque con aire (FRAME_PAD) y tiene un alto\n // cómodo por defecto (FRAME_MIN_H) para que los controles no se pisen con\n // bloques de una línea. Es solo visual: NO cambia el tamaño del bloque.\n // El marco lleva aire alrededor del bloque y se recorta a la caja de su\n // contenedor (columna o contenido de la card), nunca más allá.\n const cs = getComputedStyle(card);\n const padL = Number.parseFloat(cs.paddingLeft) || 0;\n const padT = Number.parseFloat(cs.paddingTop) || 0;\n const padR = Number.parseFloat(cs.paddingRight) || 0;\n const padB = Number.parseFloat(cs.paddingBottom) || 0;\n const parent = el.parentElement;\n const inCol = parent?.classList.contains('veo-col') ? parent : null;\n const boxL = inCol ? inCol.offsetLeft : padL;\n const boxR = inCol ? inCol.offsetLeft + inCol.offsetWidth : card.clientWidth - padR;\n const boxT = padT;\n const boxB = card.clientHeight - padB;\n // La separación entre bloques/filas (BLOCK_GAP en el CSS) deja lugar para\n // el aire del marco Y la línea «+» del hueco sin que se pisen.\n const fx = Math.max(boxL, el.offsetLeft - FRAME_PAD);\n const fr = Math.min(boxR, el.offsetLeft + el.offsetWidth + FRAME_PAD);\n const fw = Math.max(0, fr - fx);\n const fy = Math.max(boxT, el.offsetTop - FRAME_PAD);\n const fb = Math.min(boxB, el.offsetTop + el.offsetHeight + FRAME_PAD);\n const fh = Math.max(FRAME_MIN_H, fb - fy);\n const frame = doc.createElement('div');\n frame.className = 'veo-block-frame';\n frame.setAttribute('data-veo-builder-chrome', '');\n frame.style.left = `${fx}px`;\n frame.style.top = `${fy}px`;\n frame.style.width = `${fw}px`;\n frame.style.height = `${fh}px`;\n card.appendChild(frame);\n const bar = doc.createElement('div');\n bar.className = 'veo-block-toolbar';\n bar.setAttribute('data-veo-builder-chrome', '');\n const blockId = selectedBlockId;\n const mk = (action: BlockToolbarAction, label: string, icon: string, enabled = true): void => {\n const b = doc.createElement('button');\n b.type = 'button';\n b.title = label;\n b.setAttribute('aria-label', label);\n b.className = `veo-block-toolbar-${action}`;\n b.innerHTML = icon;\n b.disabled = !enabled;\n b.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n post({ type: 'block-action', payload: { stepIndex, blockId, action } });\n });\n bar.appendChild(b);\n };\n const can = moveAbility(previewBlocks, blockId);\n mk('edit', 'Editar', ICON.pencil);\n mk('duplicate', 'Duplicar', ICON.copy);\n mk('remove', 'Eliminar', ICON.trash);\n // Sin «Subir/Bajar»: la barra solo mueve entre columnas (mock).\n mk('move-left', 'Mover a la izquierda', ICON_MOVE.left, can.left);\n mk('move-right', 'Mover a la derecha', ICON_MOVE.right, can.right);\n // Barra: justo encima del BLOQUE seleccionado, alineada a su borde derecho\n // (esquina superior derecha del bloque). Se mide su alto real una vez en\n // el DOM para pegarla al marco.\n bar.style.right = `${Math.max(0, card.clientWidth - fr)}px`;\n card.appendChild(bar);\n const barH = bar.offsetHeight || TOOLBAR_H;\n // Posición preferida: encima del bloque; alternativa: debajo (si choca con\n // las pestañas del contenedor). Las guarda para `resolveToolbarOverlaps`.\n bar.dataset.veoTopAbove = String(fy - barH - 6);\n bar.dataset.veoTopBelow = String(fb + 6);\n bar.style.top = bar.dataset.veoTopAbove;\n // La fila del bloque seleccionado también muestra su marco y su barra.\n renderRowChrome(host, stepIndex);\n };\n\n /** Rect (coordenadas de la card) de un elemento de chrome posicionado. */\n const chromeRect = (el: HTMLElement) => ({\n left: el.offsetLeft,\n top: el.offsetTop,\n right: el.offsetLeft + el.offsetWidth,\n bottom: el.offsetTop + el.offsetHeight,\n });\n const intersects = (\n a: ReturnType<typeof chromeRect>,\n b: ReturnType<typeof chromeRect>,\n ): boolean => a.left < b.right && b.left < a.right && a.top < b.bottom && b.top < a.bottom;\n\n /**\n * Las tres barras (contenedor, bloque, fila) nunca se tapan entre sí:\n * 1. la del bloque va encima del bloque; si choca con las pestañas del\n * contenedor, pasa debajo del bloque;\n * 2. la de la fila va abajo a la derecha de la fila; si choca con la del\n * bloque, se corre a la izquierda de la fila; si aún choca, se apila\n * debajo de la barra del bloque.\n * Se llama cada vez que se pinta cualquiera de las tres.\n */\n const resolveToolbarOverlaps = (card: HTMLElement): void => {\n const cardBar = card.querySelector<HTMLElement>('.veo-card-toolbar');\n const blockBar = card.querySelector<HTMLElement>('.veo-block-toolbar');\n const rowBar = card.querySelector<HTMLElement>('.veo-row-toolbar');\n if (blockBar?.dataset.veoTopAbove) {\n blockBar.style.top = `${blockBar.dataset.veoTopAbove}px`;\n if (cardBar && intersects(chromeRect(blockBar), chromeRect(cardBar))) {\n blockBar.style.top = `${blockBar.dataset.veoTopBelow}px`;\n }\n }\n if (rowBar?.dataset.veoRight) {\n rowBar.style.left = '';\n rowBar.style.right = `${rowBar.dataset.veoRight}px`;\n rowBar.style.top = `${rowBar.dataset.veoTopBelow}px`;\n const others = [cardBar, blockBar].filter((b): b is HTMLElement => !!b);\n const clashes = () => others.some((o) => intersects(chromeRect(rowBar), chromeRect(o)));\n if (clashes()) {\n rowBar.style.right = '';\n rowBar.style.left = `${rowBar.dataset.veoLeft}px`;\n }\n if (clashes() && blockBar) {\n // Último recurso: apilada justo debajo de la barra del bloque (misma\n // alineación derecha). Una debajo de la otra no se cruzan nunca.\n rowBar.style.left = '';\n rowBar.style.right = `${rowBar.dataset.veoRight}px`;\n rowBar.style.top = `${chromeRect(blockBar).bottom + 6}px`;\n }\n }\n };\n\n /** Rect de un elemento relativo a la card (offsetParent = card, que es relative). */\n const rectOf = (el: HTMLElement) => ({\n left: el.offsetLeft,\n top: el.offsetTop,\n right: el.offsetLeft + el.offsetWidth,\n bottom: el.offsetTop + el.offsetHeight,\n });\n type Rect = ReturnType<typeof rectOf>;\n const union = (rs: Rect[]): Rect | null =>\n rs.length === 0\n ? null\n : rs.reduce((acc, r) => ({\n left: Math.min(acc.left, r.left),\n top: Math.min(acc.top, r.top),\n right: Math.max(acc.right, r.right),\n bottom: Math.max(acc.bottom, r.bottom),\n }));\n\n /**\n * Huecos «+» (mock): al pasar el mouse por el espacio ENTRE elementos aparece\n * una línea azul con un «+»:\n * - horizontal a lo ancho del contenido, entre filas (o arriba/abajo de\n * todas) → nueva FILA;\n * - vertical a lo alto de la fila, entre columnas (o en sus bordes) → nueva\n * COLUMNA en esa fila;\n * - horizontal a lo ancho de la columna, entre bloques apilados → nuevo\n * BLOQUE dentro de esa columna.\n * La estructura sale de `groupLayout` sobre los bloques de la preview (con\n * `editorId`) y la geometría de los nodos etiquetados.\n */\n /**\n * Geometría real de filas y columnas de la card: los bloques miden su\n * contenido, así que sale de sus contenedores (.veo-col / .veo-row) y, en\n * filas de una sola columna sin envoltorio, del ancho del contenido de la\n * card. Cada fila lleva `id` = editorId de su primer bloque (las filas no\n * tienen id propio) y su número de fila del layout.\n */\n const layoutRows = (card: HTMLElement, blocks: StepBlock[]) => {\n const elOf = (b: StepBlock): HTMLElement | null =>\n b.editorId ? card.querySelector<HTMLElement>(`[data-veo-block-id=\"${b.editorId}\"]`) : null;\n const cs = getComputedStyle(card);\n const padL = Number.parseFloat(cs.paddingLeft) || 0;\n const padR = Number.parseFloat(cs.paddingRight) || 0;\n const contentLeft = padL;\n const contentRight = card.clientWidth - padR;\n const rows = groupLayout(blocks)\n .map((row) => {\n const columns = row.columns\n .map((col) => {\n const items = col.blocks\n .map(({ block }) => ({ block, el: elOf(block) }))\n .filter(\n (x): x is { block: StepBlock; el: HTMLElement } => !!x.el && !!x.block.editorId,\n );\n const blocksRect = union(items.map((x) => rectOf(x.el)));\n if (!blocksRect) return null;\n const colEl = items[0]?.el.parentElement;\n const rect = colEl?.classList.contains('veo-col') ? rectOf(colEl) : blocksRect;\n return { items, rect };\n })\n .filter((c): c is NonNullable<typeof c> => c !== null);\n const blocksRect = union(columns.map((c) => c.rect));\n if (!blocksRect) return null;\n const rowEl = columns[0]?.items[0]?.el.parentElement?.parentElement;\n const rect = rowEl?.classList.contains('veo-row')\n ? rectOf(rowEl)\n : { ...blocksRect, left: contentLeft, right: contentRight };\n const id = columns[0]?.items[0]?.block.editorId as string;\n return { id, row: row.row, columns, rect };\n })\n .filter((r): r is NonNullable<typeof r> => r !== null);\n return { rows, content: { left: contentLeft, right: contentRight } };\n };\n\n /** Quita el marco y la barra de fila (sin tocar el estado). */\n const clearRowChrome = (card: HTMLElement): void => {\n card.querySelector('.veo-row-frame')?.remove();\n card.querySelector('.veo-row-toolbar')?.remove();\n };\n\n /**\n * Marco + barra de FILA (mock): al pasar el mouse por una fila aparece su\n * contorno y, bajo su esquina derecha, «Editar fila | duplicar». También se\n * muestra para la fila del bloque seleccionado y para la fila que el panel\n * está editando. La barra postea `row-action` con el primer bloque de la fila.\n */\n const renderRowChrome = (host: HTMLElement, stepIndex: number): void => {\n const card = previewCard(host);\n if (!card) return;\n clearRowChrome(card);\n resolveToolbarOverlaps(card);\n const { rows } = layoutRows(card, previewBlocks);\n const rowOfSelected = selectedBlockId\n ? rows.find((r) =>\n r.columns.some((c) => c.items.some((i) => i.block.editorId === selectedBlockId)),\n )\n : undefined;\n const target =\n (selectedRowId ? rows.find((r) => r.id === selectedRowId) : undefined) ??\n rowOfSelected ??\n (hoverRowId ? rows.find((r) => r.id === hoverRowId) : undefined);\n if (!target) return;\n const doc = card.ownerDocument;\n const cs = getComputedStyle(card);\n const padT = Number.parseFloat(cs.paddingTop) || 0;\n const padB = Number.parseFloat(cs.paddingBottom) || 0;\n const PAD = 6; // el marco de fila rodea al marco del bloque\n const fx = Math.max(0, target.rect.left - PAD);\n const fr = Math.min(card.clientWidth, target.rect.right + PAD);\n const fy = Math.max(Math.min(padT, target.rect.top), target.rect.top - PAD);\n const fb = Math.min(\n Math.max(card.clientHeight - padB, target.rect.bottom),\n target.rect.bottom + PAD,\n );\n const frame = doc.createElement('div');\n frame.className = 'veo-row-frame';\n frame.setAttribute('data-veo-builder-chrome', '');\n frame.style.left = `${fx}px`;\n frame.style.top = `${fy}px`;\n frame.style.width = `${Math.max(0, fr - fx)}px`;\n frame.style.height = `${Math.max(0, fb - fy)}px`;\n card.appendChild(frame);\n const bar = doc.createElement('div');\n bar.className = 'veo-row-toolbar';\n bar.setAttribute('data-veo-builder-chrome', '');\n const blockId = target.id;\n const mk = (action: RowToolbarAction, label: string, icon: string, text?: string): void => {\n const b = doc.createElement('button');\n b.type = 'button';\n b.title = label;\n b.setAttribute('aria-label', label);\n b.className = `veo-row-toolbar-${action}`;\n b.innerHTML = icon;\n if (text) b.append(text);\n b.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n post({ type: 'row-action', payload: { stepIndex, blockId, action } });\n });\n bar.appendChild(b);\n };\n mk('edit', 'Editar fila', ICON.pencil, 'Editar fila');\n mk('duplicate', 'Duplicar fila', ICON.copy);\n mk('remove', 'Eliminar fila', ICON.trash);\n card.appendChild(bar);\n // Posición preferida: abajo a la derecha de la fila. Alternativas (si choca\n // con otra barra): a la izquierda, y si no, apilada bajo la barra del bloque.\n bar.dataset.veoRight = String(Math.max(0, card.clientWidth - fr));\n bar.dataset.veoLeft = String(fx);\n bar.dataset.veoTopBelow = String(fb + 6);\n resolveToolbarOverlaps(card);\n };\n\n /**\n * Contorno + pestañas del CONTENEDOR (mock): al pasar el mouse por la tarjeta\n * se marca su borde y aparecen, centradas sobre el borde superior, «Editar\n * contenedor» (abre el paso en el panel) y «Editar filas» (abre la\n * estructura de filas y bloques). Postean `card-action`.\n */\n const renderCardChrome = (host: HTMLElement, stepIndex: number): void => {\n const card = previewCard(host);\n if (!card) return;\n card.querySelector('.veo-card-frame')?.remove();\n card.querySelector('.veo-card-toolbar')?.remove();\n if (!hoverCard) {\n resolveToolbarOverlaps(card);\n return;\n }\n const doc = card.ownerDocument;\n const frame = doc.createElement('div');\n frame.className = 'veo-card-frame';\n frame.setAttribute('data-veo-builder-chrome', '');\n card.appendChild(frame);\n const bar = doc.createElement('div');\n bar.className = 'veo-card-toolbar';\n bar.setAttribute('data-veo-builder-chrome', '');\n const mk = (action: CardToolbarAction, label: string, active: boolean): void => {\n const b = doc.createElement('button');\n b.type = 'button';\n b.className = `veo-card-toolbar-${action}${active ? ' is-active' : ''}`;\n b.setAttribute('aria-pressed', active ? 'true' : 'false');\n b.textContent = label;\n b.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n post({ type: 'card-action', payload: { stepIndex, action } });\n });\n bar.appendChild(b);\n };\n mk('edit-container', 'Editar contenedor', panelSection === 'step');\n mk('edit-rows', 'Editar filas', panelSection === 'structure');\n card.appendChild(bar);\n // A caballo del borde superior de la tarjeta (mitad afuera, mitad adentro).\n bar.style.top = `${-Math.round((bar.offsetHeight || 34) / 2)}px`;\n resolveToolbarOverlaps(card);\n };\n\n /**\n * Hover de filas: al mover el mouse sobre la card se calcula qué fila está\n * debajo (geometría de `layoutRows`) y se pinta su marco/barra. Salir de la\n * card (o de todas las filas) lo quita; pasar a la barra de la fila lo\n * conserva. Una fila seleccionada/editada tiene prioridad (ver renderRowChrome).\n */\n const attachRowHover = (host: HTMLElement, stepIndex: number): (() => void) => {\n const onMove = (e: MouseEvent): void => {\n const card = previewCard(host);\n if (!card) return;\n // Contenedor: el puntero está sobre la tarjeta o sobre sus pestañas.\n const overCard = e\n .composedPath()\n .some(\n (n) =>\n n instanceof Element &&\n (n.classList.contains('veo-card') || n.classList.contains('veo-card-toolbar')),\n );\n if (overCard !== hoverCard) {\n hoverCard = overCard;\n renderCardChrome(host, stepIndex);\n }\n if (\n e\n .composedPath()\n .some((n) => n instanceof Element && n.classList.contains('veo-row-toolbar'))\n ) {\n return; // sobre la barra de la fila: se mantiene\n }\n const rect = card.getBoundingClientRect();\n const x = e.clientX - rect.left - card.clientLeft;\n const y = e.clientY - rect.top - card.clientTop;\n // Camino hacia la barra: la barra cuelga 6px bajo la fila y puede tapar\n // la fila siguiente. Mientras el puntero esté en la franja que va del\n // borde de la fila a la barra (con aire), se conserva la fila actual.\n const bar = card.querySelector<HTMLElement>('.veo-row-toolbar');\n if (bar) {\n const AIR = 10;\n if (\n x >= bar.offsetLeft - AIR &&\n x <= bar.offsetLeft + bar.offsetWidth + AIR &&\n y >= bar.offsetTop - 14 &&\n y <= bar.offsetTop + bar.offsetHeight + AIR\n ) {\n return;\n }\n }\n const TOL = 6;\n const hit = layoutRows(card, previewBlocks).rows.find(\n (r) =>\n x >= r.rect.left - TOL &&\n x <= r.rect.right + TOL &&\n y >= r.rect.top - TOL &&\n y <= r.rect.bottom + TOL,\n );\n const next = hit?.id ?? null;\n if (next === hoverRowId) return;\n hoverRowId = next;\n renderRowChrome(host, stepIndex);\n };\n const onLeave = (): void => {\n if (hoverCard) {\n hoverCard = false;\n renderCardChrome(host, stepIndex);\n }\n if (hoverRowId === null) return;\n hoverRowId = null;\n renderRowChrome(host, stepIndex);\n };\n host.addEventListener('mousemove', onMove);\n host.addEventListener('mouseleave', onLeave);\n return () => {\n host.removeEventListener('mousemove', onMove);\n host.removeEventListener('mouseleave', onLeave);\n };\n };\n\n const renderGapZones = (host: HTMLElement, stepIndex: number, blocks: StepBlock[]): void => {\n const card = previewCard(host);\n if (!card) return;\n for (const z of card.querySelectorAll('.veo-gap')) z.remove();\n const doc = card.ownerDocument;\n const GAP = 18; // grosor de la zona de hover\n const EDGE = 4; // separación de las líneas de borde respecto al contenido\n\n const zone = (\n kind: 'h' | 'v',\n x: number,\n y: number,\n w: number,\n h: number,\n label: string,\n blockId: string,\n action: BlockLayoutAction,\n ): void => {\n const z = doc.createElement('div');\n z.className = `veo-gap veo-gap--${kind}`;\n z.setAttribute('data-veo-builder-chrome', '');\n z.dataset.veoGapAction = action;\n z.style.left = `${x}px`;\n z.style.top = `${y}px`;\n z.style.width = `${Math.max(w, GAP)}px`;\n z.style.height = `${Math.max(h, GAP)}px`;\n const line = doc.createElement('i');\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.title = label;\n btn.setAttribute('aria-label', label);\n btn.textContent = '+';\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n post({ type: 'block-layout', payload: { stepIndex, blockId, action } });\n });\n z.append(line, btn);\n card.appendChild(z);\n };\n\n const { rows, content } = layoutRows(card, blocks);\n if (rows.length === 0) return;\n const cw = content.right - content.left;\n\n // Filas: arriba de la primera, entre filas, debajo de la última.\n rows.forEach((row, k) => {\n const first = row.columns[0]?.items[0]?.block.editorId as string;\n if (k === 0) {\n zone(\n 'h',\n content.left,\n row.rect.top - EDGE - GAP,\n cw,\n GAP,\n 'Agregar fila',\n first,\n 'row-before',\n );\n } else {\n const prev = rows[k - 1] as (typeof rows)[number];\n const y = (prev.rect.bottom + row.rect.top) / 2 - GAP / 2;\n zone('h', content.left, y, cw, GAP, 'Agregar fila', first, 'row-before');\n }\n if (k === rows.length - 1) {\n zone(\n 'h',\n content.left,\n row.rect.bottom + EDGE,\n cw,\n GAP,\n 'Agregar fila',\n first,\n 'row-after',\n );\n }\n });\n\n // Columnas: borde izquierdo, entre columnas, borde derecho (por fila).\n for (const row of rows) {\n const rh = row.rect.bottom - row.rect.top;\n row.columns.forEach((col, j) => {\n const id = col.items[0]?.block.editorId as string;\n if (j === 0) {\n zone(\n 'v',\n row.rect.left - EDGE - GAP,\n row.rect.top,\n GAP,\n rh,\n 'Agregar columna',\n id,\n 'col-before',\n );\n } else {\n const prev = row.columns[j - 1] as (typeof row.columns)[number];\n const x = (prev.rect.right + col.rect.left) / 2 - GAP / 2;\n zone('v', x, row.rect.top, GAP, rh, 'Agregar columna', id, 'col-before');\n }\n if (j === row.columns.length - 1) {\n zone(\n 'v',\n row.rect.right + EDGE,\n row.rect.top,\n GAP,\n rh,\n 'Agregar columna',\n id,\n 'col-after',\n );\n }\n });\n }\n\n // Bloques apilados dentro de una columna: entre bloques; y debajo del último\n // si la columna es más baja que su fila (hay hueco para apilar).\n for (const row of rows) {\n for (const col of row.columns) {\n const w = col.rect.right - col.rect.left;\n col.items.forEach((it, i) => {\n const next = col.items[i + 1];\n if (next) {\n const a = rectOf(it.el);\n const b = rectOf(next.el);\n const y = (a.bottom + b.top) / 2 - GAP / 2;\n zone(\n 'h',\n col.rect.left,\n y,\n w,\n GAP,\n 'Agregar bloque',\n it.block.editorId as string,\n 'stack-after',\n );\n } else if (row.columns.length > 1 && col.rect.bottom < row.rect.bottom - GAP) {\n zone(\n 'h',\n col.rect.left,\n col.rect.bottom + EDGE,\n w,\n GAP,\n 'Agregar bloque',\n it.block.editorId as string,\n 'stack-after',\n );\n }\n });\n }\n }\n };\n\n /**\n * Clics sobre la preview (modo edición). Se captura en el host para ganar a\n * los listeners de los bloques (un botón de la guía NO ejecuta su acción al\n * editarlo). Un arrastre (manipulador) también termina en `click` y se\n * descarta por distancia.\n * - sobre un bloque → se selecciona y el panel abre su editor;\n * - sobre la tarjeta (fuera de bloques) → se deselecciona y el panel abre\n * «Agregar bloque».\n */\n const attachCardClick = (host: HTMLElement, stepIndex: number): (() => void) => {\n let downAt: { x: number; y: number } | null = null;\n const onDown = (e: MouseEvent): void => {\n downAt = { x: e.clientX, y: e.clientY };\n };\n const onClick = (e: MouseEvent): void => {\n const path = e.composedPath();\n if (\n path.some(\n (n) =>\n n instanceof Element &&\n (n.classList.contains('veo-block-toolbar') ||\n n.classList.contains('veo-row-toolbar') ||\n n.classList.contains('veo-card-toolbar') ||\n n.classList.contains('veo-gap')),\n )\n ) {\n return; // las barras y los huecos «+» manejan sus propios clics\n }\n const inCard = path.some((n) => n instanceof Element && n.classList.contains('veo-card'));\n if (!inCard) return;\n if (downAt && Math.hypot(e.clientX - downAt.x, e.clientY - downAt.y) > 4) return;\n const blockEl = path.find(\n (n): n is HTMLElement => n instanceof HTMLElement && !!n.dataset.veoBlockId,\n );\n if (blockEl) {\n // Botones/enlaces del bloque no ejecutan su acción mientras se edita.\n if (path.some((n) => n instanceof Element && n.matches('button, a'))) {\n e.preventDefault();\n e.stopPropagation();\n }\n selectedBlockId = blockEl.dataset.veoBlockId ?? null;\n applyBlockHighlight(host, stepIndex);\n if (selectedBlockId) {\n post({ type: 'block-clicked', payload: { stepIndex, blockId: selectedBlockId } });\n }\n return;\n }\n const interactive = path.some(\n (n) =>\n n instanceof Element &&\n n.matches('button, a, input, textarea, select, label, [contenteditable]'),\n );\n if (interactive) return;\n selectedBlockId = null;\n clearBlockHighlight(host);\n renderRowChrome(host, stepIndex);\n post({ type: 'card-clicked', payload: { stepIndex } });\n };\n host.addEventListener('mousedown', onDown, true);\n host.addEventListener('click', onClick, true);\n return () => {\n host.removeEventListener('mousedown', onDown, true);\n host.removeEventListener('click', onClick, true);\n };\n };\n\n /**\n * Bloque code CRUDO: una guía inline cuyo único bloque es code se inyecta tal\n * cual en el DOM real (sin host, shadow ni tarjeta) para duplicar un elemento\n * nativo. No hay `.veo-card` a la que colgarle el clic ni el marco, así que\n * el editor lo selecciona aparte: un clic sobre cualquiera de sus elementos\n * (marcados con `data-veo-raw-block`) lo resalta con un marco FIJO sobre su\n * caja real y una barra (Editar / Eliminar; duplicar y mover no aplican: es\n * el único bloque del paso). Los enlaces/botones del HTML no ejecutan su\n * acción mientras se edita, igual que en la tarjeta. Alrededor lleva los\n * mismos huecos «+» que la tarjeta (fila arriba/abajo, columna izq/der):\n * agregar un bloque convierte el paso en tarjeta normal con todo el editor.\n */\n const attachRawBlock = (stepIndex: number, blockId: string): RawBlockHandle | null => {\n const nodes = Array.from(\n document.querySelectorAll<HTMLElement>(`[${RAW_BLOCK_ATTR}=\"${blockId}\"]`),\n );\n if (nodes.length === 0) return null;\n const doc = document;\n const box = doc.createElement('div');\n box.setAttribute('data-veo-builder-chrome', '');\n box.style.cssText = 'position:fixed;left:0;top:0;width:0;height:0;z-index:2147483646;';\n box.style.display = 'none';\n const shadow = box.attachShadow({ mode: 'open' });\n const style = doc.createElement('style');\n style.textContent = GUIDE_STYLES;\n shadow.appendChild(style);\n const frame = doc.createElement('div');\n frame.className = 'veo-block-frame';\n frame.style.position = 'fixed';\n const bar = doc.createElement('div');\n bar.className = 'veo-block-toolbar';\n bar.style.position = 'fixed';\n const mk = (action: BlockToolbarAction, label: string, icon: string, enabled = true): void => {\n const b = doc.createElement('button');\n b.type = 'button';\n b.title = label;\n b.setAttribute('aria-label', label);\n b.className = `veo-block-toolbar-${action}`;\n b.innerHTML = icon;\n b.disabled = !enabled;\n b.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n post({ type: 'block-action', payload: { stepIndex, blockId, action } });\n });\n bar.appendChild(b);\n };\n mk('edit', 'Editar', ICON.pencil);\n mk('duplicate', 'Duplicar', ICON.copy, false);\n mk('remove', 'Eliminar', ICON.trash);\n mk('move-left', 'Mover a la izquierda', ICON_MOVE.left, false);\n mk('move-right', 'Mover a la derecha', ICON_MOVE.right, false);\n frame.style.display = 'none';\n bar.style.display = 'none';\n // Huecos «+» (siempre visibles al hover, sin selección): misma geometría\n // que `renderGapZones` pero fijos sobre la caja real del bloque crudo.\n const GAP = 18;\n const EDGE = 4;\n const gap = (kind: 'h' | 'v', label: string, action: BlockLayoutAction): HTMLElement => {\n const z = doc.createElement('div');\n z.className = `veo-gap veo-gap--${kind}`;\n z.style.position = 'fixed';\n z.dataset.veoGapAction = action;\n const line = doc.createElement('i');\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.title = label;\n btn.setAttribute('aria-label', label);\n btn.textContent = '+';\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n post({ type: 'block-layout', payload: { stepIndex, blockId, action } });\n });\n z.append(line, btn);\n return z;\n };\n const gaps = {\n top: gap('h', 'Agregar fila', 'row-before'),\n bottom: gap('h', 'Agregar fila', 'row-after'),\n left: gap('v', 'Agregar columna', 'col-before'),\n right: gap('v', 'Agregar columna', 'col-after'),\n };\n shadow.append(frame, bar, gaps.top, gaps.bottom, gaps.left, gaps.right);\n doc.body.appendChild(box);\n box.style.display = '';\n\n let visible = false;\n const place = (el: HTMLElement, x: number, y: number, w: number, h: number): void => {\n el.style.left = `${x}px`;\n el.style.top = `${y}px`;\n el.style.width = `${w}px`;\n el.style.height = `${h}px`;\n };\n const reposition = (): void => {\n const live = nodes.filter((n) => n.isConnected);\n if (live.length === 0) return;\n let l = Number.POSITIVE_INFINITY;\n let t = Number.POSITIVE_INFINITY;\n let r = Number.NEGATIVE_INFINITY;\n let b = Number.NEGATIVE_INFINITY;\n for (const n of live) {\n const rc = n.getBoundingClientRect();\n if (rc.width === 0 && rc.height === 0) continue;\n l = Math.min(l, rc.left);\n t = Math.min(t, rc.top);\n r = Math.max(r, rc.right);\n b = Math.max(b, rc.bottom);\n }\n if (!Number.isFinite(l)) return;\n place(gaps.top, l, t - EDGE - GAP, r - l, GAP);\n place(gaps.bottom, l, b + EDGE, r - l, GAP);\n place(gaps.left, l - EDGE - GAP, t, GAP, b - t);\n place(gaps.right, r + EDGE, t, GAP, b - t);\n if (!visible) return;\n place(frame, l, t, r - l, b - t);\n const bh = bar.offsetHeight || TOOLBAR_H;\n const bw = bar.offsetWidth;\n bar.style.left = `${Math.max(0, r - bw)}px`;\n bar.style.top = `${Math.max(0, t - bh - 6)}px`;\n };\n const select = (id: string | null): void => {\n visible = id === blockId;\n frame.style.display = visible ? '' : 'none';\n bar.style.display = visible ? '' : 'none';\n reposition();\n };\n reposition();\n const onClick = (e: MouseEvent): void => {\n const path = e.composedPath();\n if (!nodes.some((n) => path.includes(n))) return;\n // Botones/enlaces del HTML no ejecutan su acción mientras se edita.\n if (path.some((n) => n instanceof Element && n.matches('button, a'))) {\n e.preventDefault();\n e.stopPropagation();\n }\n selectedBlockId = blockId;\n select(blockId);\n post({ type: 'block-clicked', payload: { stepIndex, blockId } });\n };\n doc.addEventListener('click', onClick, true);\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n return {\n select,\n detach: () => {\n doc.removeEventListener('click', onClick, true);\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n box.remove();\n },\n };\n };\n\n /**\n * Aplica la preview respetando el targeting de página y (con `honorTrigger`)\n * el dispositivo; si no aplica, la cierra y le cuenta al panel por qué.\n */\n const applyPreviewGated = (cmd: Extract<BuilderCommand, { type: 'preview' }>): void => {\n // «Mostrar ahora» (honorTrigger:false) es un disparo manual: cuenta como si\n // el elemento objetivo/retraso ya se hubiera cumplido. Lo que se recuerda\n // para re-aplicar (cerrar con ✕, navegar, entrar/salir de vista previa) es\n // la versión que SÍ honra la activación; si se guardara tal cual, al cerrar\n // la guía se repintaría al instante y no habría forma de quitarla.\n const showNow = !cmd.honorTrigger;\n if (showNow) {\n disarmPreviewTrigger();\n cancelPreviewDelay();\n previewFired = true;\n previewDismissed = false;\n }\n lastPreview = showNow ? { ...cmd, honorTrigger: true } : cmd;\n if (!previewMatchesPage(cmd)) {\n cancelPreviewDelay();\n withholdPreview();\n postPreviewStatus({\n state: 'page-mismatch',\n pattern: previewStep(cmd)?.pageLocation?.pattern ?? '',\n });\n return;\n }\n const devices = cmd.guide.activationRules?.devices;\n if (!showNow && previewMode && devices && !isDeviceAllowed(devices)) {\n cancelPreviewDelay();\n withholdPreview();\n postPreviewStatus({ state: 'device-mismatch', devices: devices as 'desktop' | 'mobile' });\n return;\n }\n applyPreview(lastPreview);\n };\n\n const disarmPreviewTrigger = (): void => {\n previewTrigger?.();\n previewTrigger = null;\n };\n\n const cancelPreviewDelay = (): void => {\n if (previewDelay) clearTimeout(previewDelay);\n previewDelay = null;\n };\n\n /**\n * Elemento objetivo: arma un listener delegado (click, y hover si aplica)\n * sobre `selector`; al disparar, pinta la preview. Ignora nuestros overlays.\n */\n const armPreviewTrigger = (selector: string, trigger: 'on_click' | 'on_hover'): void => {\n disarmPreviewTrigger();\n const onFire = (e: Event): void => {\n const target = e.target;\n if (!(target instanceof Element)) return;\n if (target.closest('[data-veo-builder-chrome],[data-veo-builder-panel],[data-veo-picker]')) {\n return;\n }\n try {\n if (!target.closest(selector)) return;\n } catch {\n return;\n }\n disarmPreviewTrigger();\n previewFired = true;\n previewDismissed = false;\n if (lastPreview) applyPreviewGated(lastPreview);\n };\n document.addEventListener('click', onFire, true);\n if (trigger === 'on_hover') document.addEventListener('mouseover', onFire, true);\n previewTrigger = () => {\n document.removeEventListener('click', onFire, true);\n document.removeEventListener('mouseover', onFire, true);\n };\n postPreviewStatus({ state: 'waiting-trigger', trigger, selector });\n };\n\n /**\n * «Retrasar la aparición»: la preview espera `delayMs` como el runtime. Al\n * cumplirse se pinta y las siguientes previews (cada edición) van directo\n * hasta que el autor la cierre con ✕ — si no, cada tecla reiniciaría la espera.\n */\n const armPreviewDelay = (delayMs: number): void => {\n cancelPreviewDelay();\n previewDelay = setTimeout(() => {\n previewDelay = null;\n previewFired = true;\n if (lastPreview) applyPreviewGated(lastPreview);\n }, delayMs);\n postPreviewStatus({ state: 'waiting-delay', delayMs });\n };\n\n const applyPreview = (cmd: Extract<BuilderCommand, { type: 'preview' }>): void => {\n // Edición: si solo cambió el contenido/estilo de algún bloque (misma\n // estructura), se parchea en el lugar sin repintar la tarjeta entera ni\n // tocar los listeners (manipulador, clics, huecos).\n if (cmd.editable && !previewMode && tryPatchPreview(cmd)) {\n previewStepIndex = cmd.guide.startStepIndex ?? 0;\n return;\n }\n detachPreviewTools();\n previewStepIndex = cmd.guide.startStepIndex ?? 0;\n\n // Elemento objetivo: hasta que el autor haga clic/hover en el elemento, la\n // preview no se pinta (como en el runtime). Tras cerrarla, se re-arma.\n const rules = cmd.guide.activationRules;\n const trig = rules?.trigger;\n const sel = rules?.selector?.trim();\n // La activación (elemento objetivo, retraso, dispositivo) se respeta SOLO\n // en vista previa («como la ve el usuario»). Mientras se edita, la tarjeta\n // se pinta siempre al instante: si no, un paso nuevo no aparecía hasta\n // hacer clic en el elemento objetivo o cumplir el retraso.\n const gate = cmd.honorTrigger && !previewFired && previewMode;\n // Elemento objetivo: esperar la interacción, salvo que la guía arranque sola\n // (Automático, `autoShow`) y el autor aún no la haya cerrado. Tras cerrarla\n // con ✕, el elemento objetivo es lo que la vuelve a abrir (como el runtime).\n const waitsForTarget =\n (trig === 'on_click' || trig === 'on_hover') &&\n (!isAutomaticActivation(rules) || previewDismissed);\n if (gate && waitsForTarget && sel) {\n cancelPreviewDelay();\n closeGuidePreview();\n armPreviewTrigger(sel, trig);\n return;\n }\n const delayMs = activationDelayMs(rules);\n if (gate && delayMs > 0) {\n disarmPreviewTrigger();\n closeGuidePreview();\n // Si ya hay una espera corriendo (el autor sigue editando) no se reinicia.\n if (!previewDelay) armPreviewDelay(delayMs);\n return;\n }\n disarmPreviewTrigger();\n cancelPreviewDelay();\n const fetchProgress = previewProgressFetcher();\n const handle = previewGuide({\n ...cmd.guide,\n ...(fetchProgress ? { fetchProgress } : {}),\n onClosed: () => {\n // El autor cerró la guía con ✕.\n detachPreviewTools();\n shownPreview = null;\n previewFired = false;\n previewDismissed = true;\n // Vista previa («como la ve el usuario»): un cierre es un cierre. La\n // guía no se repinta sola; si tiene elemento objetivo, ese clic/hover\n // la vuelve a abrir (como el runtime). En modo edición también se\n // queda cerrada: la próxima edición o selección de paso la repinta.\n if (previewMode) {\n const r = lastPreview?.guide.activationRules;\n const t = r?.trigger;\n const selector = r?.selector?.trim();\n if ((t === 'on_click' || t === 'on_hover') && selector) armPreviewTrigger(selector, t);\n }\n },\n });\n if (cmd.honorTrigger) postPreviewStatus({ state: 'shown' });\n // En vista previa la guía se ve como la vería el usuario: sin drag/resize.\n if (!cmd.editable || previewMode) return;\n void handle.ready.then((result) => {\n if (!result.rendered) return;\n const host = handle.host();\n if (!host) {\n // Inline de un solo bloque code: HTML CRUDA en el DOM real, sin host ni\n // tarjeta. Se selecciona con un marco propio sobre los elementos crudos.\n const idx = cmd.guide.startStepIndex ?? 0;\n const only = (cmd.guide.guideSteps as unknown as CompositeStep[])[idx]?.blocks?.[0];\n if (only?.type === 'code' && only.editorId) {\n rawBlock = attachRawBlock(idx, only.editorId);\n rawBlock?.select(selectedBlockId);\n }\n return;\n }\n // Sin animación de entrada mientras se edita (evita el parpadeo).\n host.classList.add('veo-no-anim');\n shownPreview = cmd;\n cardClick = attachCardClick(host, cmd.guide.startStepIndex ?? 0);\n const stepBlocks =\n (cmd.guide.guideSteps as unknown as CompositeStep[])[cmd.guide.startStepIndex ?? 0]\n ?.blocks ?? [];\n previewBlocks = stepBlocks;\n applyBlockHighlight(host, cmd.guide.startStepIndex ?? 0);\n renderGapZones(host, cmd.guide.startStepIndex ?? 0, stepBlocks);\n rowHover = attachRowHover(host, cmd.guide.startStepIndex ?? 0);\n manipulator = attachDesignManipulator({\n host,\n guideType: cmd.guide.guideType,\n stepIndex: cmd.guide.startStepIndex ?? 0,\n onCommit: (payload) => post({ type: 'design-updated', payload }),\n onGestureEnd: () => {\n if (!pendingPreview) return;\n const queued = pendingPreview;\n pendingPreview = null;\n applyPreviewGated(queued);\n },\n });\n // Paleta → guía: soltar un bloque del panel sobre la preview lo inserta.\n dropTarget = attachBlockDropTarget({\n host,\n stepIndex: cmd.guide.startStepIndex ?? 0,\n onDrop: (payload) => post({ type: 'block-dropped', payload }),\n });\n });\n };\n\n const hideDragGhost = (): void => {\n dragGhost?.remove();\n dragGhost = null;\n };\n\n const moveDragGhost = (x: number, y: number, label: string): void => {\n if (!dragGhost) {\n dragGhost = document.createElement('div');\n dragGhost.style.cssText =\n 'position:fixed;padding:4px 10px;border-radius:999px;background:#1c1917;color:#fff;' +\n 'font:12px/1.4 system-ui,sans-serif;box-shadow:0 4px 14px rgba(0,0,0,0.35);' +\n 'border:1px solid rgba(255,255,255,0.25);pointer-events:none;z-index:2147483647;';\n document.body.appendChild(dragGhost);\n }\n dragGhost.textContent = label;\n dragGhost.style.left = `${x + 14}px`;\n dragGhost.style.top = `${y + 12}px`;\n };\n\n /**\n * Drag de bloque por pointer: coords relativas al iframe del panel → página.\n * En pop-out no hay mapeo (otra ventana) — se ignora.\n */\n const handleBlockDrag = (cmd: Extract<BuilderCommand, { type: 'block-drag' }>): void => {\n const rect = panel?.frameRect();\n if (!rect || !dropTarget) {\n if (cmd.phase !== 'move') hideDragGhost();\n dropTarget?.cancelHover();\n return;\n }\n const x = rect.left + cmd.x;\n const y = rect.top + cmd.y;\n if (cmd.phase === 'move') {\n moveDragGhost(x, y, cmd.label || cmd.blockType);\n dropTarget.hoverAt(x, y);\n return;\n }\n hideDragGhost();\n if (cmd.phase === 'cancel') {\n dropTarget.cancelHover();\n return;\n }\n const spotAt = dropTarget.dropAt(x, y);\n if (spotAt) {\n post({\n type: 'block-dropped',\n payload: { stepIndex: previewStepIndex, blockType: cmd.blockType, ...spotAt },\n });\n }\n };\n\n const handleCommand = (cmd: BuilderCommand): void => {\n switch (cmd.type) {\n case 'panel-ready':\n // El panel cargó y ya escucha → recién ahora le mandamos `ready`. Con\n // `chrome: true` el panel sabe que las barras las pinta el SDK.\n post(chrome ? { type: 'ready', chrome: true } : { type: 'ready' });\n break;\n case 'editor-state':\n chrome?.setState(cmd.state);\n if (panelSection !== cmd.state.section) {\n panelSection = cmd.state.section;\n // La pestaña activa del contenedor cambia con la sección del panel.\n const h = document.querySelector<HTMLElement>('[data-veo-guide]');\n if (h && hoverCard && !previewMode) renderCardChrome(h, previewStepIndex);\n }\n panel?.setTitle(\n cmd.state.panelTitle ??\n (cmd.state.section === 'activation'\n ? 'Ajustes de activación'\n : cmd.state.section === 'badge'\n ? 'Ajustes de badge'\n : cmd.state.section === 'target'\n ? 'Ajustes del elemento objetivo'\n : cmd.state.section === 'row'\n ? 'Editar fila'\n : cmd.state.blockLabel\n ? `Editor · ${cmd.state.blockLabel}`\n : (cmd.state.steps[cmd.state.activeStep]?.label ?? 'Paso')),\n );\n break;\n case 'panel-visibility':\n panel?.setVisible(cmd.visible);\n break;\n case 'panel-size':\n panel?.setSize(cmd.size);\n break;\n case 'start-picker': {\n picker?.stop();\n // Para elegir con comodidad se esconde TODO (barras + tarjeta) mientras\n // dura el picker; vuelve como estaba al terminar (elegir o cancelar).\n const panelWasShown = panel?.isVisible() ?? false;\n if (panelWasShown) panel?.setVisible(false);\n chrome?.setHidden(true);\n // La guía en preview también estorba (tapa elementos): se cierra y se\n // re-pinta al terminar, con el mismo comando que la mostró.\n const previewToRestore = lastPreview;\n if (previewToRestore) {\n detachPreviewTools();\n closeGuidePreview();\n }\n const restorePanel = (): void => {\n chrome?.setHidden(false);\n if (panelWasShown) panel?.setVisible(true);\n if (previewToRestore && lastPreview === previewToRestore) {\n applyPreviewGated(previewToRestore);\n }\n };\n picker = startElementPicker({\n onPick: (payload) => {\n picker = null;\n restorePanel();\n post({ type: 'picked', payload });\n },\n onCancel: () => {\n picker = null;\n restorePanel();\n post({ type: 'pick-cancelled' });\n },\n ...(cmd.maxAncestors !== undefined ? { maxAncestors: cmd.maxAncestors } : {}),\n ...(cmd.hint !== undefined ? { hint: cmd.hint } : {}),\n ...(cmd.only !== undefined ? { only: cmd.only } : {}),\n });\n break;\n }\n case 'stop-picker':\n picker?.stop();\n picker = null;\n chrome?.setHidden(false);\n break;\n case 'scan-page':\n post({ type: 'page-scan', payload: scanPage(cmd.selectors) });\n break;\n case 'highlight':\n setHighlight(cmd.selector);\n break;\n case 'show-confirmation':\n showConfirmation(cmd.payload);\n break;\n case 'preview':\n if (!cmd.guide) break;\n // Mientras hay un drag en curso, no remontar la preview debajo del\n // mouse del autor: se encola el ÚLTIMO comando y se aplica al soltar.\n if (manipulator?.isDragging()) pendingPreview = cmd;\n else applyPreviewGated(cmd);\n break;\n case 'block-drag':\n handleBlockDrag(cmd);\n break;\n case 'select-block': {\n selectedBlockId = cmd.blockId;\n const h = document.querySelector<HTMLElement>('[data-veo-guide]');\n if (h && !previewMode) applyBlockHighlight(h, previewStepIndex);\n if (!previewMode) rawBlock?.select(cmd.blockId);\n break;\n }\n case 'select-row': {\n selectedRowId = cmd.blockId;\n const h = document.querySelector<HTMLElement>('[data-veo-guide]');\n if (h && !previewMode) renderRowChrome(h, previewStepIndex);\n break;\n }\n case 'close-preview':\n detachPreviewTools();\n hideDragGhost();\n pendingPreview = null;\n lastPreview = null;\n disarmPreviewTrigger();\n cancelPreviewDelay();\n previewFired = false;\n previewDismissed = false;\n closeGuidePreview();\n break;\n case 'teardown':\n teardown();\n break;\n }\n };\n\n const onMessage = (event: MessageEvent): void => {\n if (event.origin !== dashboardOrigin) return;\n const data = event.data as { source?: unknown; token?: unknown } | null;\n if (!data || data.source !== VEO_BUILDER_SOURCE || data.token !== token) return;\n handleCommand(data as BuilderCommand);\n };\n\n const onPageHide = (): void => post({ type: 'closed' });\n\n // ── Watcher de navegación (SPA): al cambiar de página, re-evalúa la preview\n // contra su targeting por-página (aparece/desaparece como en el runtime). ──\n const onNav = (): void => {\n if (lastPreview && !manipulator?.isDragging()) applyPreviewGated(lastPreview);\n };\n const origPush = window.history.pushState;\n const origReplace = window.history.replaceState;\n const installNavWatcher = (): void => {\n window.history.pushState = function pushState(this: History, ...args) {\n const r = origPush.apply(this, args as Parameters<History['pushState']>);\n onNav();\n return r;\n };\n window.history.replaceState = function replaceState(this: History, ...args) {\n const r = origReplace.apply(this, args as Parameters<History['replaceState']>);\n onNav();\n return r;\n };\n window.addEventListener('popstate', onNav);\n window.addEventListener('hashchange', onNav);\n };\n const removeNavWatcher = (): void => {\n window.history.pushState = origPush;\n window.history.replaceState = origReplace;\n window.removeEventListener('popstate', onNav);\n window.removeEventListener('hashchange', onNav);\n };\n\n const teardown = (): void => {\n window.removeEventListener('message', onMessage);\n window.removeEventListener('pagehide', onPageHide);\n removeNavWatcher();\n picker?.stop();\n picker = null;\n detachPreviewTools();\n hideDragGhost();\n pendingPreview = null;\n disarmPreviewTrigger();\n cancelPreviewDelay();\n closeGuidePreview();\n post({ type: 'closed' }); // avisar al editor ANTES de sacar el panel\n panel?.teardown();\n panel = null;\n highlightBox?.remove();\n highlightBox = null;\n confirmation?.remove();\n confirmation = null;\n if (confirmationKey) document.removeEventListener('keydown', confirmationKey, true);\n confirmationKey = null;\n chrome?.teardown();\n chrome = null;\n clearBuilderToken(); // salir del modo builder: no re-activar en la próxima carga\n };\n\n /**\n * Inventario de la página para el panel de features: elementos interactivos\n * (`INTERACTIVE_SELECTOR`: botones, enlaces, campos, formularios, controles\n * ARIA…) visibles, fuera del chrome/panel de OnUser, que no matchean ninguna\n * feature ya tagueada; y cuáles de los selectores dados existen en la página.\n */\n const scanPage = (selectors: string[]): PageScan => {\n const present = selectors.filter((sel) => {\n try {\n return document.querySelector(sel) !== null;\n } catch {\n return false;\n }\n });\n const taggedEls = new Set<Element>();\n for (const sel of present) {\n try {\n for (const e of Array.from(document.querySelectorAll(sel))) taggedEls.add(e);\n } catch {\n // selector inválido: ya filtrado arriba\n }\n }\n const seen = new Set<string>();\n const candidates: PageElement[] = [];\n const nodes = document.querySelectorAll(INTERACTIVE_SELECTOR);\n for (const element of Array.from(nodes)) {\n if (candidates.length >= 200) break;\n if (element.closest('[data-veo-builder-chrome],[data-veo-builder-panel],[data-veo-picker]')) {\n continue;\n }\n if (element.getClientRects().length === 0) continue;\n // Ya tagueado (él o un ancestro con feature): no es candidato.\n let tagged = false;\n for (let n: Element | null = element; n; n = n.parentElement) {\n if (taggedEls.has(n)) {\n tagged = true;\n break;\n }\n }\n if (tagged) continue;\n const selector = buildSelectorPath(element, 5);\n if (!selector || seen.has(selector)) continue;\n seen.add(selector);\n candidates.push({\n selector,\n shortSelector: buildSelectorPath(element, 0),\n tag: element.tagName.toLowerCase(),\n id: element.id || null,\n classes: filterHumanClasses(element),\n text: elementLabelText(element),\n });\n }\n const { pathname, hash } = window.location;\n // Hash routing (`#/ruta`): la ruta visible incluye el hash.\n const routePath = /^#\\/./.test(hash) ? `${pathname}${hash}` : pathname;\n return { pagePath: pathname, routePath, candidates, present };\n };\n\n /**\n * Modal de confirmación centrado sobre la app (mock «Feature tagueada»):\n * backdrop + tarjeta con check verde, título, mensaje, filas y botón. El\n * panel se oculta mientras está abierto y vuelve al cerrarlo (botón o Esc).\n */\n let confirmation: HTMLElement | null = null;\n let confirmationKey: ((e: KeyboardEvent) => void) | null = null;\n const closeConfirmation = (): void => {\n if (!confirmation) return;\n confirmation.remove();\n confirmation = null;\n if (confirmationKey) document.removeEventListener('keydown', confirmationKey, true);\n confirmationKey = null;\n panel?.setVisible(true);\n post({ type: 'confirmation-closed' });\n };\n const showConfirmation = (card: ConfirmationCard): void => {\n if (confirmation) {\n confirmation.remove();\n confirmation = null;\n }\n panel?.setVisible(false);\n const host = document.createElement('div');\n host.setAttribute('data-veo-builder-chrome', '');\n host.setAttribute('data-veo-confirmation', '');\n const shadow = host.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n style.textContent = CONFIRMATION_STYLES;\n const backdrop = document.createElement('div');\n backdrop.className = 'veo-confirm-backdrop';\n const dialog = document.createElement('div');\n dialog.className = 'veo-confirm';\n dialog.setAttribute('role', 'dialog');\n dialog.setAttribute('aria-modal', 'true');\n dialog.setAttribute('aria-label', card.title);\n const badge = document.createElement('div');\n badge.className = 'veo-confirm-check';\n badge.innerHTML =\n '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12.5l4.5 4.5L19 7.5\"/></svg>';\n const title = document.createElement('h2');\n title.className = 'veo-confirm-title';\n title.textContent = card.title;\n const message = document.createElement('p');\n message.className = 'veo-confirm-msg';\n message.textContent = card.message;\n const rows = document.createElement('dl');\n rows.className = 'veo-confirm-rows';\n for (const r of card.rows) {\n const row = document.createElement('div');\n row.className = 'veo-confirm-row';\n const dt = document.createElement('dt');\n dt.textContent = r.label;\n const dd = document.createElement('dd');\n dd.textContent = r.value;\n row.append(dt, dd);\n rows.appendChild(row);\n }\n const button = document.createElement('button');\n button.type = 'button';\n button.className = 'veo-confirm-btn';\n button.textContent = card.buttonLabel ?? 'Listo';\n button.addEventListener('click', closeConfirmation);\n dialog.append(badge, title, message);\n if (card.rows.length > 0) dialog.appendChild(rows);\n dialog.appendChild(button);\n shadow.append(style, backdrop, dialog);\n document.body.appendChild(host);\n confirmation = host;\n confirmationKey = (e: KeyboardEvent): void => {\n if (e.key !== 'Escape') return;\n e.preventDefault();\n e.stopPropagation();\n closeConfirmation();\n };\n document.addEventListener('keydown', confirmationKey, true);\n button.focus();\n };\n\n /** Marco de resalte sobre un elemento (hover en la lista del panel). */\n let highlightBox: HTMLElement | null = null;\n const setHighlight = (selector: string | null): void => {\n highlightBox?.remove();\n highlightBox = null;\n if (!selector) return;\n let target: Element | null = null;\n try {\n target = document.querySelector(selector);\n } catch {\n return;\n }\n if (!target) return;\n const r = target.getBoundingClientRect();\n const box = document.createElement('div');\n box.setAttribute('data-veo-builder-chrome', '');\n box.style.cssText =\n `position:fixed;left:${r.left - 3}px;top:${r.top - 3}px;width:${r.width + 6}px;height:${r.height + 6}px;` +\n 'border:2px solid #FF5B35;border-radius:6px;background:rgba(255,91,53,0.10);pointer-events:none;z-index:2147483646;';\n document.body.appendChild(box);\n highlightBox = box;\n };\n\n // Transporte: panel inyectado (app top-level) o iframe/popup (embebida).\n if (ctx.panel) {\n // Chrome (barras) primero: el panel arranca debajo. Las acciones de las\n // barras van al panel como eventos `chrome-action`; seleccionar algo\n // vuelve a mostrar la tarjeta si estaba minimizada.\n chrome = injectBuilderChrome({\n appLabel: window.location.hostname,\n onAction: (action) => {\n switch (action.action) {\n // Controles que resuelve el SDK solo (no van al panel).\n case 'dock':\n panel?.setTopOffset(action.position === 'top' ? (chrome?.height() ?? 0) : 0);\n return;\n case 'show-panel':\n panel?.setVisible(true);\n return;\n case 'preview':\n if (previewMode) return;\n previewMode = true;\n // La activación se evalúa desde cero al entrar en vista previa.\n previewFired = false;\n previewDismissed = false;\n panelWasVisible = panel?.isVisible() ?? true;\n panel?.setVisible(false);\n chrome?.setPreview(true);\n if (lastPreview) applyPreviewGated(lastPreview);\n return;\n case 'exit-preview':\n if (!previewMode) return;\n previewMode = false;\n disarmPreviewTrigger();\n cancelPreviewDelay();\n chrome?.setPreview(false);\n panel?.setVisible(panelWasVisible);\n if (lastPreview) applyPreviewGated(lastPreview);\n return;\n case 'select-activation':\n case 'select-step':\n case 'add-step':\n panel?.setVisible(true);\n break;\n }\n post({ type: 'chrome-action', payload: action });\n },\n });\n panel = injectBuilderPanel({\n dashboardOrigin,\n token,\n appOrigin: window.location.origin,\n guide: ctx.guide,\n panelPath: ctx.panelPath,\n onClose: () => teardown(),\n topOffset: chrome.height(),\n });\n chrome.onHeightChange((h) => panel?.setTopOffset(chrome?.dock() === 'top' ? h : 0));\n } else {\n staticTarget = resolveTarget();\n if (!staticTarget) return null;\n }\n\n const activate = (): void => {\n window.addEventListener('message', onMessage);\n window.addEventListener('pagehide', onPageHide);\n installNavWatcher();\n // Panel: esperamos el `panel-ready` del iframe para postear `ready` (todavía\n // puede no tener su listener). iframe/popup: el opener ya escucha → posteamos ya.\n if (!ctx.panel) post({ type: 'ready' });\n };\n\n // Modo panel inyectado: la seguridad ya la da la sesión AUTENTICADA del\n // dashboard (el panel es un iframe del dashboard con Clerk) — el token es solo\n // correlación. Activamos directo, SIN verify: el verify contra el backend\n // podría fallar por expiración del token durante el login (que tarda), dejando\n // el panel para siempre en \"conectando…\".\n //\n // Modo iframe/popup (embebido): verificamos el token firmado antes de activar\n // (si `init()` dejó la config). Solo bloquea si el backend dice {valid:false}.\n const cfg = (window as unknown as { __veoBuilder?: { apiKey?: string; apiUrl?: string } })\n .__veoBuilder;\n if (!ctx.panel && cfg?.apiKey && cfg?.apiUrl) {\n void verifyBuilderToken(cfg.apiUrl, cfg.apiKey, token).then((ok) => {\n if (ok) activate();\n else if (window.console) console.warn('[veo] token de builder inválido — modo no activado');\n });\n } else {\n activate();\n }\n\n return { teardown };\n}\n\n/**\n * Verifica el token con el backend. Solo devuelve `false` (no activar) cuando el\n * backend responde explícitamente `{valid:false}` (token forjado/expirado/de\n * otro workspace). Ante 404/red caída/errores transitorios devuelve `true`\n * (best-effort) para no brickear el modo builder.\n */\nasync function verifyBuilderToken(apiUrl: string, apiKey: string, token: string): Promise<boolean> {\n try {\n const url = `${apiUrl.replace(/\\/+$/, '')}/v1/builder/verify`;\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-Api-Key': apiKey },\n body: JSON.stringify({ token }),\n });\n if (!res.ok) return true; // no pudimos verificar → best-effort\n const data = (await res.json().catch(() => null)) as { valid?: unknown } | null;\n return data?.valid !== false;\n } catch {\n return true; // red caída / sin backend → best-effort\n }\n}\n\n/** Ventana con la que hablar en modo iframe/popup: el opener o el parent. */\nfunction resolveTarget(): Window | null {\n if (window.opener && window.opener !== window) return window.opener as Window;\n if (window.parent && window.parent !== window) return window.parent;\n return null;\n}\n\nfunction resolveDashboardOrigin(originHint: string | null): string | null {\n // Origen de la URL o persistido en el primer arranque (antes del redirect).\n if (originHint) {\n try {\n return new URL(originHint).origin;\n } catch {\n return null;\n }\n }\n // Fallback: el referrer. Poco fiable tras un redirect same-origin (apunta a la\n // propia app), por eso el origen persistido va primero.\n if (hasDocument() && document.referrer) {\n try {\n return new URL(document.referrer).origin;\n } catch {\n return null;\n }\n }\n return null;\n}\n\n// Tipo re-exportado para consumidores que tipan el contexto.\nexport type { BuilderClientContext };\n\n/**\n * Lista de tareas en la preview del editor: progreso con un usuario de\n * preview (nombres y pasos reales de las guías publicadas, progreso 0). Solo\n * si `init()` dejó apiKey/apiUrl en `window.__veoBuilder`.\n */\nfunction previewProgressFetcher():\n | ((guideIds: string[]) => Promise<import('../guides/types').GuideProgressItem[]>)\n | undefined {\n const cfg = (window as unknown as { __veoBuilder?: { apiKey?: string; apiUrl?: string } })\n .__veoBuilder;\n if (!cfg?.apiKey || !cfg?.apiUrl) return undefined;\n const apiUrl = cfg.apiUrl.replace(/\\/+$/, '');\n const apiKey = cfg.apiKey;\n return async (guideIds) => {\n const params = new URLSearchParams({\n endUserId: 'veo_preview',\n guideIds: guideIds.join(','),\n includeUnpublished: '1',\n });\n const res = await fetch(`${apiUrl}/v1/guides/progress?${params}`, {\n headers: { 'X-Api-Key': apiKey },\n });\n if (!res.ok) return [];\n const data = (await res.json()) as { items?: import('../guides/types').GuideProgressItem[] };\n return data.items ?? [];\n };\n}\n","/**\n * Lado DASHBOARD del puente builder. Abre la app del cliente en un popup,\n * en modo builder, y expone una API para pedirle que seleccione un elemento\n * o previsualice una guía. Pensado para importarse en el dashboard\n * (`import { createBuilderSession } from '@veo/sdk/builder'`).\n *\n * Seguridad: solo procesa mensajes cuyo `origin` sea el de la app y cuyo\n * `token` coincida con el de esta sesión.\n */\nimport { hasWindow } from '../../utils/safe-env';\nimport type { PreviewGuideInput } from '../guides/guide-preview';\nimport {\n BUILDER_ORIGIN_PARAM,\n BUILDER_TOKEN_PARAM,\n type BuilderCommand,\n VEO_BUILDER_SOURCE,\n} from './bridge-protocol';\nimport type { PickedElement } from './element-picker';\n\nexport interface BuilderSessionOptions {\n /** URL de la app del cliente a abrir en modo builder. */\n appUrl: string;\n /** Token de la sesión (idealmente emitido/firmado por el backend). */\n token: string;\n /** Origen al que la app debe responder. Default: `location.origin`. */\n dashboardOrigin?: string;\n /** La app está lista y escuchando comandos. */\n onReady?: () => void;\n /** El usuario eligió un elemento. */\n onPicked?: (picked: PickedElement) => void;\n /** El usuario canceló la selección (Esc). */\n onCancelled?: () => void;\n /** La app cerró el modo builder (o el popup se cerró). */\n onClosed?: () => void;\n /**\n * Si se pasa, la app se embebe en este `<iframe>` (modo estudio in-app) en\n * lugar de abrirse en un popup. El lado app ya habla con `window.parent`,\n * así que el puente funciona igual. La sesión setea el `src` del iframe.\n */\n frame?: HTMLIFrameElement;\n /** Nombre de la ventana popup. Default: `veo-builder`. */\n windowName?: string;\n /** Features del popup. Default: ventana de ~1280×860. */\n windowFeatures?: string;\n}\n\nexport interface BuilderSession {\n /** Pide a la app que entre en modo selección de elemento. */\n startPicker(options?: { maxAncestors?: number; hint?: string }): void;\n /** Cancela la selección en curso. */\n stopPicker(): void;\n /** Pide a la app que previsualice una guía. */\n preview(guide: PreviewGuideInput): void;\n /** Cierra la preview activa en la app. */\n closePreview(): void;\n /** Cierra el popup y desconecta el puente. */\n close(): void;\n}\n\nconst DEFAULT_FEATURES = 'popup,width=1280,height=860';\nconst POPUP_POLL_MS = 600;\n\nexport function createBuilderSession(options: BuilderSessionOptions): BuilderSession {\n if (!hasWindow()) return noopSession();\n\n const dashboardOrigin = options.dashboardOrigin ?? window.location.origin;\n const appOrigin = safeOrigin(options.appUrl);\n const url = buildAppUrl(options.appUrl, options.token, dashboardOrigin);\n\n const frame = options.frame ?? null;\n const useFrame = frame !== null;\n\n let popup: Window | null = null;\n if (useFrame) {\n // biome-ignore lint/style/noNonNullAssertion: useFrame garantiza frame\n frame!.src = url;\n } else {\n popup = window.open(\n url,\n options.windowName ?? 'veo-builder',\n options.windowFeatures ?? DEFAULT_FEATURES,\n );\n }\n\n /** Ventana destino de los comandos: el popup o el contentWindow del iframe. */\n const targetWindow = (): Window | null => (useFrame ? (frame?.contentWindow ?? null) : popup);\n\n const post = (command: BuilderCommand): void => {\n const w = targetWindow();\n if (!w) return;\n if (!useFrame && popup?.closed) return;\n w.postMessage(\n { source: VEO_BUILDER_SOURCE, token: options.token, ...command },\n appOrigin ?? '*',\n );\n };\n\n let pollTimer: ReturnType<typeof setInterval> | undefined;\n\n const cleanup = (): void => {\n window.removeEventListener('message', onMessage);\n if (pollTimer !== undefined) {\n clearInterval(pollTimer);\n pollTimer = undefined;\n }\n };\n\n const onMessage = (event: MessageEvent): void => {\n if (appOrigin && event.origin !== appOrigin) return;\n const data = event.data as {\n source?: unknown;\n token?: unknown;\n type?: unknown;\n payload?: unknown;\n } | null;\n if (!data || data.source !== VEO_BUILDER_SOURCE || data.token !== options.token) return;\n\n switch (data.type) {\n case 'ready':\n options.onReady?.();\n break;\n case 'picked':\n if (data.payload) options.onPicked?.(data.payload as PickedElement);\n break;\n case 'pick-cancelled':\n options.onCancelled?.();\n break;\n case 'closed':\n cleanup();\n options.onClosed?.();\n break;\n }\n };\n\n window.addEventListener('message', onMessage);\n\n // Detectar cierre manual del popup (el usuario cierra la ventana). En modo\n // iframe el ciclo de vida lo controla el dashboard (no hay nada que pollear).\n if (!useFrame) {\n pollTimer = setInterval(() => {\n if (popup?.closed) {\n cleanup();\n options.onClosed?.();\n }\n }, POPUP_POLL_MS);\n }\n\n return {\n startPicker: (o) =>\n post({\n type: 'start-picker',\n ...(o?.maxAncestors !== undefined ? { maxAncestors: o.maxAncestors } : {}),\n ...(o?.hint !== undefined ? { hint: o.hint } : {}),\n }),\n stopPicker: () => post({ type: 'stop-picker' }),\n preview: (guide) => post({ type: 'preview', guide }),\n closePreview: () => post({ type: 'close-preview' }),\n close: () => {\n post({ type: 'teardown' });\n if (useFrame) {\n if (frame) frame.src = 'about:blank';\n } else if (popup && !popup.closed) {\n popup.close();\n }\n cleanup();\n },\n };\n}\n\nfunction buildAppUrl(appUrl: string, token: string, dashboardOrigin: string): string {\n try {\n const u = new URL(appUrl, window.location.href);\n u.searchParams.set(BUILDER_TOKEN_PARAM, token);\n u.searchParams.set(BUILDER_ORIGIN_PARAM, dashboardOrigin);\n return u.toString();\n } catch {\n return appUrl;\n }\n}\n\nfunction safeOrigin(url: string): string | null {\n try {\n return new URL(url, window.location.href).origin;\n } catch {\n return null;\n }\n}\n\nfunction noopSession(): BuilderSession {\n return {\n startPicker: () => {},\n stopPicker: () => {},\n preview: () => {},\n closePreview: () => {},\n close: () => {},\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/plugins/builder/block-drop-target.ts","../src/plugins/builder/bridge-protocol.ts","../src/plugins/builder/builder-chrome.ts","../src/plugins/builder/builder-panel.ts","../src/plugins/builder/design-manipulator.ts","../src/plugins/builder/interactive-elements.ts","../src/plugins/builder/element-picker.ts","../src/plugins/builder/builder-mode.ts","../src/plugins/builder/builder-session.ts"],"names":["el","MIN_W","MIN_H","clamp","blocksRect","rect","EDGE"],"mappings":";;;;AAsBO,IAAM,cAAA,GAAiB;AA8CvB,SAAS,sBAAsB,OAAA,EAA+C;AACnF,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,MAAA,EAAO,GAAI,OAAA;AACpC,EAAA,MAAM,MAAM,IAAA,CAAK,aAAA;AACjB,EAAA,IAAI,IAAA,GAA2B,IAAA;AAC/B,EAAA,IAAI,IAAA,GAAwB,IAAA;AAE5B,EAAA,MAAM,YAAY,MAChB,IAAA,CAAK,UAAA,EAAY,aAAA,CAA2B,oBAAoB,CAAA,IAAK,IAAA;AAGvE,EAAA,MAAM,gBAAgB,CAAC,SAAA,KACrB,MAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,CAAE,MAAA;AAAA,IAC7B,CAACA,GAAAA,KAA0BA,GAAAA,YAAc,WAAA,IAAeA,GAAAA,CAAG,QAAQ,MAAA,KAAW;AAAA,GAChF;AAEF,EAAA,MAAM,WAAW,MAAY;AAC3B,IAAA,IAAA,EAAM,MAAA,EAAO;AACb,IAAA,IAAA,GAAO,IAAA;AACP,IAAA,IAAA,GAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,EAAA,KAAuB;AACvC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAA,GAAO,GAAA,CAAI,cAAc,KAAK,CAAA;AAE9B,MAAA,IAAA,CAAK,MAAM,OAAA,GACT,oJAAA;AAEF,MAAA,IAAA,CAAK,UAAA,EAAY,YAAY,IAAI,CAAA;AAAA,IACnC;AACA,IAAA,IAAA,CAAK,MAAM,IAAA,GAAO,CAAA,EAAG,EAAA,CAAG,IAAA,CAAK,OAAO,CAAC,CAAA,EAAA,CAAA;AACrC,IAAA,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,GAAG,EAAA,CAAG,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AACpD,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,EAAA,CAAG,IAAI,GAAG,CAAA,EAAA,CAAA;AAAA,EAChC,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAA8B;AACjD,IAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,EAAc,KAAA;AAClC,IAAA,OAAO,CAAC,CAAC,KAAA,IAAS,KAAA,CAAM,KAAK,KAAK,CAAA,CAAE,SAAS,cAAc,CAAA;AAAA,EAC7D,CAAA;AAGA,EAAA,MAAM,OAAA,GAAU,EAAA;AAGhB,EAAA,MAAM,MAAA,GAAS,CAAC,OAAA,KAAqC;AACnD,IAAA,MAAM,YAAY,SAAA,EAAU;AAC5B,IAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AACvB,IAAA,MAAM,IAAA,GAAO,UAAU,qBAAA,EAAsB;AAC7C,IAAA,MAAM,IAAA,GAAO,cAAc,SAAS,CAAA;AACpC,IAAA,IAAI,WAAA,GAA6B,IAAA;AACjC,IAAA,IAAI,CAAA,GAAI,KAAK,MAAA,KAAW,CAAA,GAAI,KAAK,GAAA,GAAM,IAAA,CAAK,SAAS,CAAA,GAAI,CAAA;AACzD,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,CAAA,GAAI,IAAI,qBAAA,EAAsB;AACpC,MAAA,IAAI,OAAA,GAAU,CAAA,CAAE,GAAA,GAAM,CAAA,CAAE,SAAS,CAAA,EAAG;AAClC,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA;AACrC,QAAA,WAAA,GAAc,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,GAAI,GAAA,GAAM,IAAA;AAC3C,QAAA,CAAA,GAAI,CAAA,CAAE,GAAA;AACN,QAAA;AAAA,MACF;AACA,MAAA,CAAA,GAAI,CAAA,CAAE,MAAA;AAAA,IACR;AACA,IAAA,OAAO,EAAE,WAAA,EAAa,CAAA,EAAG,IAAA,EAAK;AAAA,EAChC,CAAA;AAGA,EAAA,MAAM,cAAc,CAAC,CAAA,EAAW,GAAW,IAAA,KACzC,CAAA,IAAK,KAAK,IAAA,GAAO,OAAA,IACjB,KAAK,IAAA,CAAK,KAAA,GAAQ,WAClB,CAAA,IAAK,IAAA,CAAK,MAAM,OAAA,IAChB,CAAA,IAAK,KAAK,MAAA,GAAS,OAAA;AAErB,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,EAAW,CAAA,KAAuB;AACjD,IAAA,MAAM,EAAA,GAAK,OAAO,CAAC,CAAA;AACnB,IAAA,IAAI,CAAC,MAAM,CAAC,WAAA,CAAY,GAAG,CAAA,EAAG,EAAA,CAAG,IAAI,CAAA,EAAG;AACtC,MAAA,QAAA,EAAS;AACT,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAA,GAAO,EAAA;AACP,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,EAAW,CAAA,KAAqD;AAC9E,IAAA,MAAM,EAAA,GAAK,OAAO,CAAC,CAAA;AACnB,IAAA,QAAA,EAAS;AACT,IAAA,IAAI,CAAC,MAAM,CAAC,WAAA,CAAY,GAAG,CAAA,EAAG,EAAA,CAAG,IAAI,CAAA,EAAG,OAAO,IAAA;AAC/C,IAAA,OAAO,EAAE,WAAA,EAAa,EAAA,CAAG,WAAA,EAAY;AAAA,EACvC,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,KAA2B;AAC7C,IAAA,IAAI,CAAC,WAAA,CAAY,KAAK,CAAA,EAAG;AACzB,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA;AAC/B,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,IAAI,KAAA,CAAM,YAAA,EAAc,KAAA,CAAM,YAAA,CAAa,UAAA,GAAa,MAAA;AACxD,IAAA,IAAA,GAAO,EAAA;AACP,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAA2B;AAC9C,IAAA,IAAI,CAAC,WAAA,CAAY,KAAK,CAAA,EAAG;AACzB,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,EAAc,OAAA,CAAQ,cAAc,CAAA,IAAK,EAAA;AACjE,IAAA,MAAM,EAAA,GAAK,IAAA,IAAQ,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA;AACvC,IAAA,QAAA,EAAS;AACT,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,EAAA,EAAI;AACvB,IAAA,MAAA,CAAO,EAAE,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,EAAA,CAAG,aAAa,CAAA;AAAA,EAC9D,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAA2B;AAG9C,IAAA,MAAM,KAAK,KAAA,CAAM,aAAA;AACjB,IAAA,IAAI,cAAc,IAAA,KAAS,EAAA,KAAO,QAAQ,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA,CAAA,EAAI;AAC9D,IAAA,QAAA,EAAS;AAAA,EACX,CAAA;AAEA,EAAA,IAAA,CAAK,gBAAA,CAAiB,YAAY,UAAU,CAAA;AAC5C,EAAA,IAAA,CAAK,gBAAA,CAAiB,QAAQ,WAAW,CAAA;AACzC,EAAA,IAAA,CAAK,gBAAA,CAAiB,aAAa,WAAW,CAAA;AAE9C,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA,EAAa,QAAA;AAAA,IACb,MAAA,GAAe;AACb,MAAA,IAAA,CAAK,mBAAA,CAAoB,YAAY,UAAU,CAAA;AAC/C,MAAA,IAAA,CAAK,mBAAA,CAAoB,QAAQ,WAAW,CAAA;AAC5C,MAAA,IAAA,CAAK,mBAAA,CAAoB,aAAa,WAAW,CAAA;AACjD,MAAA,QAAA,EAAS;AAAA,IACX;AAAA,GACF;AACF;;;ACzLO,IAAM,kBAAA,GAAqB,aAAA;;;ACK3B,IAAM,eAAA,GAAkB,EAAA;AACxB,IAAM,cAAA,GAAiB,GAAA;AA0B9B,IAAM,KAAA,GAAQ;AAAA,EACZ,IAAA,EAAM,wHAAA;AAAA,EACN,OAAA,EACE,yUAAA;AAAA,EACF,MAAA,EACE,sIAAA;AAAA,EACF,GAAA,EAAK,iYAAA;AAAA,EACL,GAAA,EAAK,mVAAA;AAAA,EACL,WAAA,EACE,uFAAA;AAAA,EACF,SAAA,EACE,uFAAA;AAAA,EACF,IAAA,EAAM,mFAAA;AAAA,EACN,MAAA,EACE,6TAAA;AAAA,EACF,IAAA,EAAM,2SAAA;AAAA,EACN,KAAA,EACE,0dAAA;AAAA,EACF,MAAA,EACE,iPAAA;AAAA,EACF,OAAA,EACE;AACJ,CAAA;AAEA,SAAS,GAAA,CAAI,IAAA,EAA0B,IAAA,GAAO,EAAA,EAAY;AACxD,EAAA,OACE,kDAAkD,IAAI,CAAA,UAAA,EAAa,IAAI,CAAA,8FAAA,EACI,KAAA,CAAM,IAAI,CAAC,CAAA,MAAA,CAAA;AAE1F;AAGA,SAAS,UAAU,GAAA,EAA4B;AAC7C,EAAA,IAAI,CAAC,KAAK,OAAO,EAAA;AACjB,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,GAAG,CAAA;AACtB,EAAA,IAAI,OAAO,KAAA,CAAM,CAAA,CAAE,OAAA,EAAS,GAAG,OAAO,EAAA;AACtC,EAAA,OAAO,CAAA,CAAE,kBAAA,CAAmB,IAAA,EAAM,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,OAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA;AACvF;AAEA,SAAS,EAAA,CACP,GAAA,EACA,SAAA,EACA,IAAA,EAC0B;AAC1B,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,EAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,EAAA,IAAI,IAAA,KAAS,MAAA,EAAW,IAAA,CAAK,SAAA,GAAY,IAAA;AACzC,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,UAAA,CAAW,IAAA,EAA0B,KAAA,EAAe,SAAA,GAAY,EAAA,EAAuB;AAC9F,EAAA,MAAM,CAAA,GAAI,EAAA,CAAG,QAAA,EAAU,CAAA,YAAA,EAAe,SAAS,GAAG,IAAA,EAAK,EAAG,GAAA,CAAI,IAAI,CAAC,CAAA;AACnE,EAAA,CAAA,CAAE,IAAA,GAAO,QAAA;AACT,EAAA,CAAA,CAAE,KAAA,GAAQ,KAAA;AACV,EAAA,CAAA,CAAE,YAAA,CAAa,cAAc,KAAK,CAAA;AAClC,EAAA,OAAO,CAAA;AACT;AAGO,SAAS,oBAAoB,IAAA,EAAiD;AACnF,EAAA,IAAI,CAAC,SAAA,EAAU,IAAK,CAAC,aAAY,EAAG;AAClC,IAAA,OAAO;AAAA,MACL,UAAU,MAAM;AAAA,MAAC,CAAA;AAAA,MACjB,QAAQ,MAAM,CAAA;AAAA,MACd,MAAM,MAAM,KAAA;AAAA,MACZ,YAAY,MAAM;AAAA,MAAC,CAAA;AAAA,MACnB,WAAW,MAAM;AAAA,MAAC,CAAA;AAAA,MAClB,gBAAgB,MAAM;AAAA,MAAC,CAAA;AAAA,MACvB,UAAU,MAAM;AAAA,MAAC;AAAA,KACnB;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,EAAA,IAAA,CAAK,YAAA,CAAa,2BAA2B,EAAE,CAAA;AAC/C,EAAA,IAAA,CAAK,YAAA,CAAa,mBAAmB,EAAE,CAAA;AACvC,EAAA,MAAM,SAAS,IAAA,CAAK,YAAA,CAAa,EAAE,IAAA,EAAM,QAAQ,CAAA;AACjD,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,WAAA,GAAc,UAAA;AAEpB,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,EAAO,YAAY,CAAA;AAGnC,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,KAAA,EAAO,QAAQ,CAAA;AACjC,EAAA,MAAM,QAAQ,EAAA,CAAG,KAAA,EAAO,gBAAgB,GAAA,CAAI,MAAA,EAAQ,EAAE,CAAC,CAAA;AACvD,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,KAAA,EAAO,aAAa,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,EAAA,CAAG,MAAA,EAAQ,eAAe,CAAA;AAC3C,EAAA,QAAA,CAAS,MAAA,GAAS,IAAA;AAClB,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,MAAA,EAAQ,YAAY,CAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,GAAG,KAAA,EAAO,YAAA,EAAc,GAAG,GAAA,CAAI,SAAA,EAAW,EAAE,CAAC,CAAA,aAAA,CAAe,CAAA;AAC1E,EAAC,KAAA,CAAM,aAAA,CAAc,MAAM,CAAA,CAAkB,cAAc,IAAA,CAAK,QAAA;AAChE,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,EAAO,aAAa,CAAA;AACpC,EAAA,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,KAAK,KAAK,CAAA;AAE/C,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,EAAO,cAAc,CAAA;AACtC,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,QAAA,EAAU,sBAAsB,CAAA;AAC3D,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,KAAA,EAAO,mBAAmB,CAAA;AACvD,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,KAAA,EAAO,cAAc,CAAA;AAChD,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,QAAA,EAAU,aAAA,EAAe,OAAO,CAAA;AAChD,EAAA,IAAA,CAAK,IAAA,GAAO,QAAA;AACZ,EAAA,MAAM,SAAA,GAAY,EAAA,CAAG,KAAA,EAAO,aAAa,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,QAAA,EAAU,kBAAA,EAAoB,sBAAsB,CAAA;AACpE,EAAA,IAAA,CAAK,IAAA,GAAO,QAAA;AACZ,EAAA,MAAM,WAAW,EAAA,CAAG,QAAA,EAAU,oBAAoB,GAAA,CAAI,aAAA,EAAe,EAAE,CAAC,CAAA;AACxE,EAAA,QAAA,CAAS,IAAA,GAAO,QAAA;AAChB,EAAA,QAAA,CAAS,KAAA,GAAQ,6BAAA;AACjB,EAAA,QAAA,CAAS,YAAA,CAAa,cAAc,6BAA0B,CAAA;AAC9D,EAAA,MAAM,QAAA,GAAW,EAAA,CAAG,KAAA,EAAO,aAAa,CAAA;AACxC,EAAA,MAAM,QAAA,GAAW,EAAA,CAAG,QAAA,EAAU,kBAAA,EAAoB,iBAAiB,CAAA;AACnE,EAAA,QAAA,CAAS,IAAA,GAAO,QAAA;AAChB,EAAA,QAAA,CAAS,OAAO,QAAQ,CAAA;AACxB,EAAA,QAAA,CAAS,MAAA,GAAS,IAAA;AAClB,EAAA,SAAA,CAAU,MAAA,CAAO,IAAA,EAAM,QAAA,EAAU,QAAQ,CAAA;AACzC,EAAA,KAAA,CAAM,MAAA,CAAO,SAAS,SAAA,EAAW,OAAA,EAAS,GAAG,MAAA,EAAQ,aAAa,CAAA,EAAG,IAAA,EAAM,SAAS,CAAA;AACpF,EAAA,MAAA,CAAO,MAAA,CAAO,MAAM,KAAK,CAAA;AAGzB,EAAA,MAAM,QAAA,GAAW,EAAA,CAAG,KAAA,EAAO,WAAW,CAAA;AACtC,EAAA,MAAM,SAAA,GAAY,EAAA,CAAG,KAAA,EAAO,gBAAgB,CAAA;AAC5C,EAAA,QAAA,CAAS,OAAO,SAAS,CAAA;AAEzB,EAAA,MAAM,UAAA,GAAa,EAAA,CAAG,QAAA,EAAU,kBAAkB,CAAA;AAClD,EAAA,UAAA,CAAW,IAAA,GAAO,QAAA;AAElB,EAAA,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,QAAA,EAAU,UAAU,CAAA;AAGxC,EAAA,MAAM,WAAA,GAAc,EAAA,CAAG,KAAA,EAAO,kBAAkB,CAAA;AAChD,EAAA,MAAM,YAAA,GAAe,EAAA;AAAA,IACnB,MAAA;AAAA,IACA,mBAAA;AAAA,IACA,CAAA,EAAG,GAAA,CAAI,KAAA,EAAO,EAAE,CAAC,CAAA,qCAAA;AAAA,GACnB;AACA,EAAA,MAAM,WAAA,GAAc,EAAA,CAAG,QAAA,EAAU,kBAAA,EAAoB,OAAO,CAAA;AAC5D,EAAA,WAAA,CAAY,IAAA,GAAO,QAAA;AACnB,EAAA,WAAA,CAAY,MAAA,CAAO,cAAc,WAAW,CAAA;AAC5C,EAAA,WAAA,CAAY,MAAA,GAAS,IAAA;AAErB,EAAA,MAAA,CAAO,MAAA,CAAO,KAAA,EAAO,IAAA,EAAM,WAAW,CAAA;AACtC,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAG9B,EAAA,MAAM,OAAO,QAAA,CAAS,eAAA;AACtB,EAAA,MAAM,aAAA,GAAgB,KAAK,KAAA,CAAM,SAAA;AACjC,EAAA,MAAM,gBAAA,GAAmB,KAAK,KAAA,CAAM,YAAA;AACpC,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,IAAA,GAAmB,KAAA;AACvB,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,QAAA,GAAyC,IAAA;AAC7C,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,MAAM,MAAA,GAAS,MAAc,eAAA,IAAmB,SAAA,IAAa,UAAU,CAAA,GAAI,cAAA,CAAA;AAC3E,EAAA,MAAM,cAAc,MAAY;AAC9B,IAAA,MAAM,CAAA,GAAI,SAAA,IAAa,QAAA,GAAW,CAAA,GAAI,MAAA,EAAO;AAC7C,IAAA,IAAA,CAAK,MAAM,SAAA,GAAY,IAAA,KAAS,KAAA,GAAQ,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA,GAAO,aAAA;AACnD,IAAA,IAAA,CAAK,MAAM,YAAA,GAAe,IAAA,KAAS,QAAA,GAAW,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA,GAAO,gBAAA;AACzD,IAAA,IAAA,CAAK,MAAM,WAAA,CAAY,gBAAA,EAAkB,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAA,CAAI,CAAA;AACxD,IAAA,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,WAAA,EAAa,IAAA,KAAS,QAAQ,CAAA;AACpD,IAAA,QAAA,CAAS,SAAS,SAAA,IAAa,OAAA;AAC/B,IAAA,UAAA,CAAW,MAAA,GAAS,OAAA;AAEpB,IAAA,OAAA,CAAQ,MAAA,GAAS,OAAA;AACjB,IAAA,SAAA,CAAU,MAAA,GAAS,OAAA;AACnB,IAAA,SAAA,CAAU,KAAA,GAAQ,UAAU,kBAAA,GAAqB,mBAAA;AACjD,IAAA,MAAM,IAAA,GAAO,IAAA,KAAS,KAAA,GAAQ,WAAA,GAAc,aAAA;AAC5C,IAAA,MAAM,UAAA,GAAa,IAAA,KAAS,KAAA,GAAQ,aAAA,GAAgB,WAAA;AACpD,IAAA,UAAA,CAAW,SAAA,GAAY,CAAA,MAAA,EAAS,SAAA,GAAY,eAAA,GAAkB,eAAe,CAAA,OAAA,EAAU,GAAA;AAAA,MACrF,YAAY,UAAA,GAAa,IAAA;AAAA,MACzB;AAAA,KACD,CAAA,CAAA;AACD,IAAA,OAAA,CAAQ,KAAA,GAAQ,IAAA,KAAS,KAAA,GAAQ,sBAAA,GAAyB,uBAAA;AAC1D,IAAA,OAAA,CAAQ,YAAA,CAAa,YAAA,EAAc,OAAA,CAAQ,KAAK,CAAA;AAChD,IAAA,QAAA,GAAW,CAAC,CAAA;AAAA,EACd,CAAA;AACA,EAAA,MAAM,UAAA,GAAa,CAAC,EAAA,KAAsB;AACxC,IAAA,SAAA,GAAY,EAAA;AACZ,IAAA,IAAA,CAAK,SAAS,EAAA,IAAM,QAAA;AACpB,IAAA,WAAA,CAAY,SAAS,CAAC,EAAA;AACtB,IAAA,WAAA,EAAY;AAAA,EACd,CAAA;AACA,EAAA,MAAM,SAAA,GAAY,CAAC,EAAA,KAAsB;AACvC,IAAA,QAAA,GAAW,EAAA;AACX,IAAA,IAAA,CAAK,SAAS,EAAA,IAAM,SAAA;AACpB,IAAA,WAAA,EAAY;AAAA,EACd,CAAA;AACA,EAAA,UAAA,CAAW,gBAAA,CAAiB,SAAS,MAAM;AACzC,IAAA,SAAA,GAAY,CAAC,SAAA;AACb,IAAA,WAAA,EAAY;AAAA,EACd,CAAC,CAAA;AAGD,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KAA0B,IAAA,CAAK,SAAS,CAAC,CAAA;AACtD,EAAA,OAAA,CAAQ,gBAAA,CAAiB,SAAS,MAAM;AACtC,IAAA,IAAA,GAAO,IAAA,KAAS,QAAQ,QAAA,GAAW,KAAA;AACnC,IAAA,WAAA,EAAY;AACZ,IAAA,GAAA,CAAI,EAAE,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAA;AAAA,EACxC,CAAC,CAAA;AACD,EAAA,SAAA,CAAU,gBAAA,CAAiB,SAAS,MAAM,GAAA,CAAI,EAAE,MAAA,EAAQ,YAAA,EAAc,CAAC,CAAA;AACvE,EAAA,OAAA,CAAQ,gBAAA,CAAiB,SAAS,MAAM,GAAA,CAAI,EAAE,MAAA,EAAQ,SAAA,EAAW,CAAC,CAAA;AAClE,EAAA,WAAA,CAAY,gBAAA,CAAiB,SAAS,MAAM,GAAA,CAAI,EAAE,MAAA,EAAQ,cAAA,EAAgB,CAAC,CAAA;AAC3E,EAAA,IAAA,CAAK,gBAAA,CAAiB,SAAS,MAAM,GAAA,CAAI,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAC,CAAA;AAC5D,EAAA,IAAA,CAAK,gBAAA,CAAiB,OAAA,EAAS,MAAM,GAAA,CAAI,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,CAAC,CAAA;AACzE,EAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACxC,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,QAAA,CAAS,MAAA,GAAS,CAAC,QAAA,CAAS,MAAA;AAAA,EAC9B,CAAC,CAAA;AACD,EAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,MAAM;AACvC,IAAA,QAAA,CAAS,MAAA,GAAS,IAAA;AAClB,IAAA,GAAA,CAAI,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,MAAM,CAAA;AAAA,EACpC,CAAC,CAAA;AACD,EAAA,MAAM,YAAY,MAAY;AAC5B,IAAA,QAAA,CAAS,MAAA,GAAS,IAAA;AAAA,EACpB,CAAA;AACA,EAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,SAAS,CAAA;AAG5C,EAAA,IAAI,OAAA,GAAoC,IAAA;AACxC,EAAA,MAAM,SAAS,MAAY;AACzB,IAAA,MAAM,CAAA,GAAI,OAAA;AACV,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,MAAM,WAAA,GAAc,EAAE,OAAA,KAAY,SAAA;AAClC,IAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,MAAA,OAAA,GAAU,WAAA;AACV,MAAA,WAAA,EAAY;AAAA,IACd;AACA,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAA,CAAE,SAAS,CAAA;AAClC,IAAA,MAAA,CAAO,cAAc,OAAA,GACjB,CAAA,CAAE,UAAU,IAAA,EAAK,IAAK,iBACtB,CAAA,EAAG,CAAA,CAAE,SAAA,CAAU,IAAA,MAAU,YAAY,CAAA,EAAG,OAAO,CAAA,MAAA,EAAM,IAAI,KAAK,EAAE,CAAA,CAAA;AACpE,IAAA,IAAI,EAAE,MAAA,EAAQ;AACZ,MAAA,QAAA,CAAS,MAAA,GAAS,KAAA;AAClB,MAAA,QAAA,CAAS,WAAA,GAAc,EAAE,MAAA,CAAO,KAAA;AAChC,MAAA,QAAA,CAAS,OAAA,CAAQ,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,IAAA;AACjC,MAAA,QAAA,CAAS,KAAA,GAAQ,6DAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,MAAA,GAAS,IAAA;AAAA,IACpB;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,EAAE,MAAA,GACf,CAAA,EAAG,IAAI,SAAA,EAAW,EAAE,CAAC,CAAA,4BAAA,CAAA,GACrB,sBAAA;AACJ,IAAA,IAAA,CAAK,WAAW,CAAA,CAAE,MAAA;AAClB,IAAA,QAAA,CAAS,WAAW,CAAA,CAAE,MAAA;AAEtB,IAAA,SAAA,CAAU,eAAA,EAAgB;AAC1B,IAAA,MAAM,UAAA,GAAa,SAAS,GAAA,CAAI,QAAA,EAAU,EAAE,CAAA,EAAG,eAAA,EAAc,CAAA,CAAE,OAAA,KAAY,YAAY,CAAA;AACvF,IAAA,UAAA,CAAW,gBAAA,CAAiB,SAAS,MAAM,GAAA,CAAI,EAAE,MAAA,EAAQ,mBAAA,EAAqB,CAAC,CAAA;AAC/E,IAAA,SAAA,CAAU,OAAO,UAAU,CAAA;AAC3B,IAAA,CAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,CAAC,EAAA,EAAI,CAAA,KAAM;AACzB,MAAA,MAAM,KAAA,GACJ,EAAA,CAAG,YAAA,KAAiB,QAAA,GAChB,qEAAA,GACA,oDAAA;AAEN,MAAA,MAAM,UAAA,GACJ,CAAA,CAAE,OAAA,KAAY,MAAA,IACd,EAAE,OAAA,KAAY,OAAA,IACd,CAAA,CAAE,OAAA,KAAY,WAAA,IACd,CAAA,CAAE,OAAA,KAAY,KAAA,IACd,EAAE,OAAA,KAAY,WAAA;AAChB,MAAA,MAAM,IAAA,GAAO,SAAS,KAAA,EAAO,EAAA,CAAG,OAAO,UAAA,IAAc,CAAA,CAAE,eAAe,CAAA,EAAG;AAAA;AAAA,QAEvE,SAAA,EAAW,IAAA;AAAA,QACX,MAAA,EAAQ,MAAM,GAAA,CAAI,EAAE,QAAQ,aAAA,EAAe,KAAA,EAAO,GAAG,CAAA;AAAA,QACrD,WAAA,EAAa,MAAM,GAAA,CAAI,EAAE,QAAQ,gBAAA,EAAkB,KAAA,EAAO,GAAG,CAAA;AAAA,QAC7D,QAAA,EAAU,MAAM,GAAA,CAAI,EAAE,QAAQ,aAAA,EAAe,KAAA,EAAO,GAAG;AAAA,OACxD,CAAA;AACD,MAAA,SAAA,CAAU,OAAO,IAAI,CAAA;AAAA,IACvB,CAAC,CAAA;AACD,IAAA,MAAM,GAAA,GAAM,GAAG,QAAA,EAAU,cAAA,EAAgB,GAAG,GAAA,CAAI,MAAA,EAAQ,EAAE,CAAC,CAAA,yBAAA,CAA2B,CAAA;AACtF,IAAA,GAAA,CAAI,IAAA,GAAO,QAAA;AACX,IAAA,GAAA,CAAI,gBAAA,CAAiB,SAAS,MAAM,GAAA,CAAI,EAAE,MAAA,EAAQ,UAAA,EAAY,CAAC,CAAA;AAC/D,IAAA,SAAA,CAAU,OAAO,GAAG,CAAA;AAAA,EACtB,CAAA;AAEA,EAAA,WAAA,EAAY;AAEZ,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,MAAA,OAAA,GAAU,KAAA;AACV,MAAA,MAAA,EAAO;AAAA,IACT,CAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAM,MAAM,IAAA;AAAA,IACZ,UAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAA,EAAgB,CAAC,EAAA,KAAO;AACtB,MAAA,QAAA,GAAW,EAAA;AAAA,IACb,CAAA;AAAA,IACA,UAAU,MAAM;AACd,MAAA,QAAA,CAAS,mBAAA,CAAoB,SAAS,SAAS,CAAA;AAC/C,MAAA,IAAA,CAAK,MAAM,SAAA,GAAY,aAAA;AACvB,MAAA,IAAA,CAAK,MAAM,YAAA,GAAe,gBAAA;AAC1B,MAAA,IAAA,CAAK,MAAA,EAAO;AAAA,IACd;AAAA,GACF;AACF;AAeA,SAAS,QAAA,CACP,KAAA,EACA,KAAA,EACA,MAAA,EACA,OAAA,EACa;AACb,EAAA,MAAM,GAAA,GAAM,CAAA,QAAA,EAAW,MAAA,GAAS,YAAA,GAAe,EAAE,CAAA,CAAA;AACjD,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,CAAA,GAAI,EAAA;AAAA,MACR,QAAA;AAAA,MACA,GAAA;AAAA,MACA,6BAA6B,KAAK,CAAA,0CAAA;AAAA,KACpC;AACA,IAAA,CAAA,CAAE,IAAA,GAAO,QAAA;AACT,IAAC,CAAA,CAAE,aAAA,CAAc,iBAAiB,CAAA,CAAkB,WAAA,GAAc,KAAA;AAClE,IAAA,CAAA,CAAE,YAAA,CAAa,cAAA,EAAgB,MAAA,GAAS,MAAA,GAAS,OAAO,CAAA;AACxD,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,EAAA;AAAA,IACX,KAAA;AAAA,IACA,GAAA;AAAA,IACA,6BAA6B,KAAK,CAAA,yKAAA,EAGgF,GAAA,CAAI,OAAA,EAAS,EAAE,CAAC,CAAA,yHAAA,EACb,GAAA,CAAI,MAAA,EAAQ,EAAE,CAAC,CAAA,4FAAA,EAGnF,GAAA,CAAI,QAAA,EAAU,EAAE,CAAC,CAAA,kFAAA;AAAA,GAGpE;AACA,EAAC,IAAA,CAAK,aAAA,CAAc,iBAAiB,CAAA,CAAkB,WAAA,GAAc,KAAA;AACrE,EAAA,IAAA,CAAK,YAAA,CAAa,cAAA,EAAgB,MAAA,GAAS,MAAA,GAAS,OAAO,CAAA;AAC3D,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,kBAAkB,CAAA;AACpD,EAAA,MAAA,CAAO,QAAA,GAAW,CAAC,OAAA,CAAQ,SAAA;AAC3B,EAAA,IAAI,CAAC,OAAA,CAAQ,SAAA,EAAW,MAAA,CAAO,KAAA,GAAQ,sCAAA;AACvC,EAAA,MAAM,EAAA,GAAK,CAAC,GAAA,EAAa,EAAA,KAAyB;AAChD,IAAA,IAAA,CAAK,cAAc,GAAG,CAAA,EAAG,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACxD,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,EAAA,EAAG;AAAA,IACL,CAAC,CAAA;AAAA,EACH,CAAA;AACA,EAAA,EAAA,CAAG,gBAAA,EAAkB,QAAQ,MAAM,CAAA;AACnC,EAAA,EAAA,CAAG,qBAAA,EAAuB,QAAQ,WAAW,CAAA;AAC7C,EAAA,EAAA,CAAG,kBAAA,EAAoB,QAAQ,QAAQ,CAAA;AACvC,EAAA,IAAA,CAAK,gBAAA,CAAiB,OAAA,EAAS,OAAA,CAAQ,MAAM,CAAA;AAC7C,EAAA,OAAO,IAAA;AACT;AAEA,IAAM,UAAA,GAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iFAAA,EAegE,kBAAkB,cAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EAcvG,eAAe,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EAgDf,cAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0DAAA,EA6CkC,kBAAkB,cAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;;;ACjgB5F,IAAM,kBAAA,GAAqB,gBAAA;AAC3B,IAAM,OAAA,GAAU,GAAA;AAChB,IAAM,OAAA,GAAU,GAAA;AAChB,IAAM,KAAA,GAAQ,GAAA;AACd,IAAM,KAAA,GAAQ,GAAA;AACd,IAAM,MAAA,GAAS,EAAA;AAEf,IAAM,QAAA,GAAW,EAAA;AAwCV,SAAS,mBAAmB,IAAA,EAA+C;AAChF,EAAA,IAAI,CAAC,SAAA,EAAU,IAAK,CAAC,aAAY,EAAG;AAClC,IAAA,OAAO;AAAA,MACL,QAAQ,MAAM,IAAA;AAAA,MACd,WAAW,MAAM,IAAA;AAAA,MACjB,UAAU,MAAM;AAAA,MAAC,CAAA;AAAA,MACjB,UAAU,MAAM;AAAA,MAAC,CAAA;AAAA,MACjB,YAAY,MAAM;AAAA,MAAC,CAAA;AAAA,MACnB,WAAW,MAAM,KAAA;AAAA,MACjB,cAAc,MAAM;AAAA,MAAC,CAAA;AAAA,MACrB,SAAS,MAAM;AAAA,MAAC;AAAA,KAClB;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,cAAc,IAAI,CAAA;AAEnC,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,EAAA,IAAA,CAAK,YAAA,CAAa,0BAA0B,EAAE,CAAA;AAC9C,EAAA,MAAM,SAAS,IAAA,CAAK,YAAA,CAAa,EAAE,IAAA,EAAM,QAAQ,CAAA;AAEjD,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,WAAA,GAAc,SAAA;AAEpB,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,EAAA,IAAA,CAAK,SAAA,GAAY,WAAA;AACjB,EAAA,IAAI,SAAA,GAAY,KAAK,SAAA,IAAa,CAAA;AAElC,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,IAAI,MAAM,SAAA,GAAY,MAAA;AACtB,EAAA,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA;AACzB,EAAA,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA;AACvB,EAAA,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,OAAO,CAAA,EAAA,CAAA;AAC7B,EAAA,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAO,CAAA,EAAA,CAAA;AAI9B,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,EAAA,MAAA,CAAO,SAAA,GAAY,kBAAA;AACnB,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,EAAA,IAAA,CAAK,SAAA,GAAY,gBAAA;AACjB,EAAA,IAAA,CAAK,YAAA,CAAa,eAAe,MAAM,CAAA;AACvC,EAAA,IAAA,CAAK,WAAA,GAAc,cAAA;AACnB,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC3C,EAAA,KAAA,CAAM,SAAA,GAAY,iBAAA;AAClB,EAAA,KAAA,CAAM,WAAA,GAAc,oBAAA;AACpB,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,EAAA,OAAA,CAAQ,SAAA,GAAY,mBAAA;AACpB,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,WAAA,EAAa,yBAAyB,CAAA;AACjE,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,WAAA,EAAa,WAAW,CAAA;AACrD,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,UAAA,EAAY,WAAW,CAAA;AACpD,EAAA,OAAA,CAAQ,MAAA,CAAO,MAAA,EAAQ,QAAA,EAAU,QAAQ,CAAA;AACzC,EAAA,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,KAAA,EAAO,OAAO,CAAA;AAElC,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,SAAA,GAAY,iBAAA;AACnB,EAAA,MAAA,CAAO,KAAA,GAAQ,eAAA;AACf,EAAA,MAAA,CAAO,GAAA,GAAM,QAAA;AAEb,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC/C,EAAA,UAAA,CAAW,SAAA,GAAY,kBAAA;AACvB,EAAA,UAAA,CAAW,YAAA,CAAa,eAAe,MAAM,CAAA;AAE7C,EAAA,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,MAAA,EAAQ,UAAU,CAAA;AACtC,EAAA,MAAA,CAAO,MAAA,CAAO,OAAO,IAAI,CAAA;AACzB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAG9B,EAAA,IAAI,OAAA,GAAU,IAAA;AACd,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,OAAA,GAAsE,IAAA;AAC1E,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAwB;AAC1C,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,IAAA,CAAK,KAAA,CAAM,UAAU,IAAA,IAAQ,EAAE,UAAU,CAAC,MAAA,CAAO,UAAU,EAAA,GAAK,MAAA;AAAA,EAClE,CAAA;AACA,EAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,MAAM,UAAA,CAAW,KAAK,CAAC,CAAA;AAI1D,EAAA,IAAI,cAAA,GAAkD,IAAA;AACtD,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAAyD;AACxE,IAAA,IAAI,SAAA,IAAc,MAAA,IAAU,CAAC,MAAA,CAAO,MAAA,EAAS;AAC7C,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAI,CAAC,gBAAgB,cAAA,GAAiB,EAAE,GAAG,IAAA,CAAK,WAAA,EAAa,CAAA,EAAG,IAAA,CAAK,YAAA,EAAa;AAClF,MAAA,IAAA,CAAK,MAAM,SAAA,GAAY,GAAA;AACvB,MAAA,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,KAAA,CAAM,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,UAAA,GAAa,MAAA,GAAS,CAAC,CAAC,CAAA,EAAA,CAAA;AAC1F,MAAA,IAAA,CAAK,MAAM,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,MAAM,IAAA,CAAK,MAAM,CAAA,GAAI,QAAA,EAAU,WAAW,EAAA,EAAI,MAAA,CAAO,WAAA,GAAc,GAAA,GAAM,MAAM,CAAC,CAAA,EAAA,CAAA;AAAA,IACpH,WAAW,cAAA,EAAgB;AACzB,MAAA,IAAA,CAAK,MAAM,SAAA,GAAY,EAAA;AACvB,MAAA,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,cAAA,CAAe,CAAC,CAAA,EAAA,CAAA;AACtC,MAAA,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,cAAA,CAAe,CAAC,CAAA,EAAA,CAAA;AACvC,MAAA,cAAA,GAAiB,IAAA;AAAA,IACnB;AAAA,EACF,CAAA;AACA,EAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,MAAM;AACvC,IAAA,SAAA,GAAY,CAAC,SAAA;AACb,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAA,GAAU,EAAE,MAAM,GAAA,EAAK,CAAA,EAAG,KAAK,WAAA,EAAa,CAAA,EAAG,KAAK,YAAA,EAAa;AACjE,MAAA,IAAA,GAAO,MAAA;AACP,MAAA,GAAA,GAAM,SAAA,GAAY,MAAA;AAClB,MAAA,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA;AACzB,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA;AACvB,MAAA,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,OAAO,MAAA,CAAO,UAAA,GAAa,MAAA,GAAS,CAAC,CAAC,CAAA,EAAA,CAAA;AACrE,MAAA,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,OAAO,MAAA,CAAO,WAAA,GAAc,GAAA,GAAM,MAAM,CAAC,CAAA,EAAA,CAAA;AACzE,MAAA,QAAA,CAAS,KAAA,GAAQ,WAAA;AAAA,IACnB,WAAW,OAAA,EAAS;AAClB,MAAA,IAAA,GAAO,OAAA,CAAQ,IAAA;AACf,MAAA,GAAA,GAAM,OAAA,CAAQ,GAAA;AACd,MAAA,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA;AACzB,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA;AACvB,MAAA,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,EAAA,CAAA;AAC/B,MAAA,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,EAAA,CAAA;AAChC,MAAA,QAAA,CAAS,KAAA,GAAQ,WAAA;AAAA,IACnB;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,IAAI,MAAA,GAAwB,IAAA;AAC5B,EAAA,IAAI,SAAA;AAEJ,EAAA,MAAM,WAAW,MAAY;AAC3B,IAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,MAAA,aAAA,CAAc,SAAS,CAAA;AACvB,MAAA,SAAA,GAAY,MAAA;AAAA,IACd;AAAA,EACF,CAAA;AAEA,EAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,MAAM;AACrC,IAAA,MAAM,MAAM,MAAA,CAAO,IAAA;AAAA,MACjB,QAAA;AAAA,MACA,YAAA;AAAA,MACA,CAAA,YAAA,EAAe,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,WAAW,CAAC,CAAA,QAAA,EAAW,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,YAAY,CAAA,GAAI,EAAE,CAAA;AAAA,KAC1F;AACA,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,MAAA,GAAS,GAAA;AACT,IAAA,IAAA,CAAK,MAAM,OAAA,GAAU,MAAA;AACrB,IAAA,SAAA,GAAY,YAAY,MAAM;AAC5B,MAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,QAAA,QAAA,EAAS;AACT,QAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,MACf;AAAA,IACF,GAAG,GAAG,CAAA;AAAA,EACR,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAM;AAC1C,IAAA,IAAK,CAAA,CAAE,MAAA,EAAwB,OAAA,CAAQ,gBAAgB,CAAA,EAAG;AAC1D,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,MAAM,KAAK,CAAA,CAAE,OAAA;AACb,IAAA,MAAM,KAAK,CAAA,CAAE,OAAA;AACb,IAAA,MAAM,EAAA,GAAK,IAAA;AACX,IAAA,MAAM,EAAA,GAAK,GAAA;AACX,IAAA,MAAA,CAAO,MAAM,aAAA,GAAgB,MAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,CAAC,EAAA,KAAyB;AACrC,MAAA,IAAA,GAAO,KAAA,CAAM,EAAA,IAAM,EAAA,CAAG,OAAA,GAAU,EAAA,CAAA,EAAK,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,UAAA,GAAa,IAAA,CAAK,WAAW,CAAC,CAAA;AACzF,MAAA,GAAA,GAAM,KAAA,CAAM,EAAA,IAAM,EAAA,CAAG,OAAA,GAAU,EAAA,CAAA,EAAK,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,MAAA,CAAO,WAAA,GAAc,EAAE,CAAC,CAAA;AAC3F,MAAA,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA;AACzB,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA;AAAA,IACzB,CAAA;AACA,IAAA,MAAM,KAAK,MAAY;AACrB,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,IAAI,CAAA;AAC5C,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,EAAE,CAAA;AACxC,MAAA,MAAA,CAAO,MAAM,aAAA,GAAgB,EAAA;AAAA,IAC/B,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,IAAI,CAAA;AACzC,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,EAAE,CAAA;AAAA,EACvC,CAAC,CAAA;AAGD,EAAA,UAAA,CAAW,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAM;AAC9C,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,MAAM,KAAK,CAAA,CAAE,OAAA;AACb,IAAA,MAAM,KAAK,CAAA,CAAE,OAAA;AACb,IAAA,MAAM,KAAK,IAAA,CAAK,WAAA;AAChB,IAAA,MAAM,KAAK,IAAA,CAAK,YAAA;AAChB,IAAA,MAAA,CAAO,MAAM,aAAA,GAAgB,MAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,CAAC,EAAA,KAAyB;AACrC,MAAA,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,KAAA,CAAM,EAAA,IAAM,EAAA,CAAG,OAAA,GAAU,EAAA,CAAA,EAAK,KAAA,EAAO,MAAA,CAAO,UAAU,CAAC,CAAA,EAAA,CAAA;AAC7E,MAAA,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,EAAA,IAAM,EAAA,CAAG,OAAA,GAAU,EAAA,CAAA,EAAK,KAAA,EAAO,MAAA,CAAO,WAAW,CAAC,CAAA,EAAA,CAAA;AAAA,IACjF,CAAA;AACA,IAAA,MAAM,KAAK,MAAY;AACrB,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,IAAI,CAAA;AAC5C,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,EAAE,CAAA;AACxC,MAAA,MAAA,CAAO,MAAM,aAAA,GAAgB,EAAA;AAAA,IAC/B,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,IAAI,CAAA;AACzC,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,EAAE,CAAA;AAAA,EACvC,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,QAAQ,MAAO,MAAA,IAAU,CAAC,MAAA,CAAO,MAAA,GAAS,SAAS,MAAA,CAAO,aAAA;AAAA,IAC1D,SAAA,EAAW,MAAO,MAAA,IAAU,CAAC,OAAO,MAAA,GAAS,IAAA,GAAO,OAAO,qBAAA,EAAsB;AAAA,IACjF,UAAU,MAAM;AACd,MAAA,QAAA,EAAS;AACT,MAAA,IAAI,MAAA,IAAU,CAAC,MAAA,CAAO,MAAA,SAAe,KAAA,EAAM;AAC3C,MAAA,IAAA,CAAK,MAAA,EAAO;AAAA,IACd,CAAA;AAAA,IACA,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,MAAA,KAAA,CAAM,WAAA,GAAc,CAAA;AAAA,IACtB,CAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAW,MAAM,OAAA;AAAA,IACjB,YAAA,EAAc,CAAC,EAAA,KAAO;AACpB,MAAA,SAAA,GAAY,EAAA;AACZ,MAAA,IAAI,GAAA,GAAM,YAAY,MAAA,EAAQ;AAC5B,QAAA,GAAA,GAAM,SAAA,GAAY,MAAA;AAClB,QAAA,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA;AAAA,MACzB;AAAA,IACF;AAAA,GACF;AACF;AAEA,IAAM,WAAA,GACJ,kNAAA;AACF,IAAM,WAAA,GACJ,kNAAA;AACF,IAAM,UAAA,GAAa,qEAAA;AAEnB,SAAS,WAAA,CAAY,UAAkB,KAAA,EAAkC;AACvE,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACzC,EAAA,CAAA,CAAE,SAAA,GAAY,eAAA;AACd,EAAA,CAAA,CAAE,IAAA,GAAO,QAAA;AACT,EAAA,CAAA,CAAE,KAAA,GAAQ,KAAA;AACV,EAAA,CAAA,CAAE,YAAA,CAAa,cAAc,KAAK,CAAA;AAClC,EAAA,CAAA,CAAE,SAAA,GACA,8JAC2E,QAAQ,CAAA,MAAA,CAAA;AACrF,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,KAAA,CAAM,CAAA,EAAW,GAAA,EAAa,GAAA,EAAqB;AAC1D,EAAA,OAAO,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG,GAAG,GAAG,GAAG,CAAA;AACvC;AAEA,SAAS,cAAc,IAAA,EAAmC;AACxD,EAAA,MAAM,IAAA,GAAO,KAAK,SAAA,IAAa,kBAAA;AAC/B,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,IAAA,EAAM,KAAK,eAAe,CAAA;AAC9C,EAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,IAAA,CAAK,KAAK,CAAA;AAC3C,EAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,QAAA,EAAU,IAAA,CAAK,SAAS,CAAA;AAC7C,EAAA,IAAI,KAAK,KAAA,EAAO,GAAA,CAAI,aAAa,GAAA,CAAI,UAAA,EAAY,KAAK,KAAK,CAAA;AAC3D,EAAA,OAAO,IAAI,QAAA,EAAS;AACtB;AAEA,IAAM,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA,aAAA,EAIH,KAAK,mBAAmB,KAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8CAAA,EAWI,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;;;AC9QxD,IAAMC,MAAAA,GAAQ,GAAA;AACd,IAAM,KAAA,GAAQ,GAAA;AACd,IAAMC,MAAAA,GAAQ,GAAA;AACd,IAAM,KAAA,GAAQ,GAAA;AAEd,IAAM,IAAA,GAAO,CAAA;AAGb,IAAM,WAAA,GAA2B,CAAC,GAAA,EAAK,GAAA,EAAK,KAAK,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AAE5E,IAAM,eAAA,GAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAA,EAyBF,OAAO,CAAC,CAAA,UAAA,EAAa,IAAI,CAAA,WAAA,EAAc,IAAI,eAAe,IAAI,CAAA;AAAA,uBAAA,EAC3D,OAAO,CAAC,CAAA,UAAA,EAAa,IAAI,CAAA,WAAA,EAAc,IAAI,eAAe,IAAI,CAAA;AAAA,sBAAA,EAC/D,OAAO,CAAC,CAAA,SAAA,EAAY,IAAI,CAAA,YAAA,EAAe,IAAI,cAAc,IAAI,CAAA;AAAA,qBAAA,EAC9D,OAAO,CAAC,CAAA,SAAA,EAAY,IAAI,CAAA,YAAA,EAAe,IAAI,cAAc,IAAI,CAAA;AAAA,oBAAA,EAC9D,IAAA,GAAO,CAAC,CAAA,YAAA,EAAe,IAAA,GAAO,CAAC,cAAc,IAAA,GAAO,GAAG,CAAA,YAAA,EAAe,IAAA,GAAO,GAAG,CAAA;AAAA,oBAAA,EAChF,IAAA,GAAO,CAAC,CAAA,WAAA,EAAc,IAAA,GAAO,CAAC,cAAc,IAAA,GAAO,GAAG,CAAA,YAAA,EAAe,IAAA,GAAO,GAAG,CAAA;AAAA,uBAAA,EAC5E,IAAA,GAAO,CAAC,CAAA,YAAA,EAAe,IAAA,GAAO,CAAC,cAAc,IAAA,GAAO,GAAG,CAAA,YAAA,EAAe,IAAA,GAAO,GAAG,CAAA;AAAA,uBAAA,EAChF,IAAA,GAAO,CAAC,CAAA,WAAA,EAAc,IAAA,GAAO,CAAC,cAAc,IAAA,GAAO,GAAG,CAAA,YAAA,EAAe,IAAA,GAAO,GAAG,CAAA;AAAA;AAAA;AAAA,CAAA;AAKxG,SAASC,MAAAA,CAAM,CAAA,EAAW,GAAA,EAAa,GAAA,EAAqB;AAC1D,EAAA,OAAO,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG,GAAG,GAAG,GAAG,CAAA;AACvC;AAEA,SAAS,OAAO,CAAA,EAAmB;AACjC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAI,CAAA,GAAI,GAAA;AAChC;AAGA,SAAS,cAAc,MAAA,EAAqC;AAC1D,EAAA,OAAO,OAAA;AAAA,IACL,MAAA,YAAkB,OAAA,IAAW,MAAA,CAAO,OAAA,CAAQ,2CAA2C;AAAA,GACzF;AACF;AAOO,SAAS,wBACd,IAAA,EACgC;AAChC,EAAA,MAAM,MAAA,GAAS,KAAK,IAAA,CAAK,UAAA;AACzB,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,aAAA,CAA2B,iBAAiB,CAAA;AAChE,EAAA,IAAI,IAAA,EAAM,OAAO,WAAA,CAAY,IAAA,EAAM,QAAQ,IAAI,CAAA;AAE/C,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,aAAA,CAA2B,aAAa,CAAA;AAG9D,EAAA,IAAI,UAAU,CAAC,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,qBAAqB,CAAA,EAAG;AAC/D,IAAA,OAAO,YAAA,CAAa,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AAAA,EAC1C;AAEA,EAAA,OAAO,IAAA;AACT;AAIA,SAAS,WAAA,CACP,IAAA,EACA,MAAA,EACA,IAAA,EACgC;AAChC,EAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,cAAA,KAAmB,GAAA,EAAK,OAAO,IAAA;AAChD,EAAA,IAAA,CAAK,QAAQ,cAAA,GAAiB,GAAA;AAC9B,EAAA,IAAA,CAAK,SAAA,CAAU,IAAI,cAAc,CAAA;AAEjC,EAAA,MAAM,MAAM,IAAA,CAAK,aAAA;AACjB,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,aAAA,CAAc,OAAO,CAAA;AACvC,EAAA,KAAA,CAAM,WAAA,GAAc,eAAA;AACpB,EAAA,MAAA,CAAO,YAAY,KAAK,CAAA;AAExB,EAAA,MAAM,UAAyB,EAAC;AAChC,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACjC,IAAA,CAAA,CAAE,SAAA,GAAY,0BAA0B,GAAG,CAAA,CAAA;AAC3C,IAAA,CAAA,CAAE,QAAQ,MAAA,GAAS,GAAA;AACnB,IAAA,IAAA,CAAK,YAAY,CAAC,CAAA;AAClB,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,QAAA,GAAW,KAAA;AAGf,EAAA,IAAI,QAA8B,EAAC;AAEnC,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAkE;AACjF,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,IAAI,CAAA,CAAE,EAAA,KAAO,MAAA,EAAW,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,aAAA,EAAe,CAAA,EAAG,CAAA,CAAE,EAAA,GAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AAC9E,IAAA,IAAI,CAAA,CAAE,EAAA,KAAO,MAAA,EAAW,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,aAAA,EAAe,CAAA,EAAG,CAAA,CAAE,EAAA,GAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AAC9E,IAAA,IAAI,CAAA,CAAE,CAAA,KAAM,MAAA,EAAW,IAAA,CAAK,KAAA,CAAM,YAAY,aAAA,EAAe,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAA,CAAI,CAAA;AACvE,IAAA,IAAI,CAAA,CAAE,CAAA,KAAM,MAAA,EAAW,IAAA,CAAK,KAAA,CAAM,YAAY,aAAA,EAAe,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,EACzE,CAAA;AAMA,EAAA,MAAM,YAAA,GAAe,CACnB,CAAA,EACA,KAAA,KACS;AACT,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,QAAA,GAAW,IAAA;AACX,IAAA,KAAA,GAAQ,EAAC;AACT,IAAA,MAAM,KAAA,GAAQ,KAAK,qBAAA,EAAsB;AACzC,IAAA,MAAM,KAAK,CAAA,CAAE,OAAA;AACb,IAAA,MAAM,KAAK,CAAA,CAAE,OAAA;AACb,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,IAAI,MAAA,GAA4B,IAAA;AAEhC,IAAA,MAAM,QAAQ,MAAY;AACxB,MAAA,GAAA,GAAM,CAAA;AACN,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,OAAA,GAAU,IAAI,MAAA,CAAO,OAAA,GAAU,IAAI,KAAK,CAAA;AAClE,MAAA,KAAA,GAAQ,EAAE,GAAG,KAAA,EAAO,GAAG,IAAA,EAAK;AAC5B,MAAA,OAAA,CAAQ;AAAA,QACN,GAAI,KAAK,IAAA,KAAS,MAAA,GAAY,EAAE,EAAA,EAAI,IAAA,CAAK,IAAA,EAAK,GAAI,EAAC;AAAA,QACnD,GAAI,KAAK,IAAA,KAAS,MAAA,GAAY,EAAE,EAAA,EAAI,IAAA,CAAK,IAAA,EAAK,GAAI,EAAC;AAAA,QACnD,GAAI,KAAK,KAAA,KAAU,MAAA,GAAY,EAAE,CAAA,EAAG,IAAA,CAAK,KAAA,EAAM,GAAI,EAAC;AAAA,QACpD,GAAI,KAAK,MAAA,KAAW,MAAA,GAAY,EAAE,CAAA,EAAG,IAAA,CAAK,MAAA,EAAO,GAAI;AAAC,OACvD,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,MAAM,IAAA,GAAO,CAAC,EAAA,KAAyB;AACrC,MAAA,MAAA,GAAS,EAAA;AAET,MAAA,IAAI,OAAO,MAAA,CAAO,qBAAA,KAA0B,UAAA,EAAY,KAAA,EAAM;AAAA,WAAA,IACrD,CAAC,GAAA,EAAK,GAAA,GAAM,MAAA,CAAO,sBAAsB,KAAK,CAAA;AAAA,IACzD,CAAA;AACA,IAAA,MAAM,KAAK,MAAY;AACrB,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,IAAI,CAAA;AAC5C,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,EAAE,CAAA;AACxC,MAAA,IAAI,GAAA,EAAK,MAAA,CAAO,oBAAA,CAAqB,GAAG,CAAA;AACxC,MAAA,KAAA,EAAM;AACN,MAAA,QAAA,GAAW,KAAA;AACX,MAAA,IAAI,OAAO,IAAA,CAAK,KAAK,EAAE,MAAA,GAAS,CAAA,IAAK,CAAC,QAAA,EAAU;AAC9C,QAAA,IAAA,CAAK,SAAS,EAAE,SAAA,EAAW,KAAK,SAAA,EAAW,KAAA,EAAO,OAAO,CAAA;AAAA,MAC3D;AACA,MAAA,IAAA,CAAK,YAAA,IAAe;AAAA,IACtB,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,IAAI,CAAA;AACzC,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,EAAE,CAAA;AAAA,EACvC,CAAA;AAGA,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,EAAc,CAAA,KAAsB;AACnD,IAAA,MAAM,IAAA,GAAO,OAAO,UAAA,GAAa,CAAA;AACjC,IAAA,OAAO,IAAA,IAAQ,IAAI,GAAA,GAAM,MAAA,CAAOA,OAAM,IAAA,GAAO,IAAA,EAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,EAC1D,CAAA;AACA,EAAA,MAAM,OAAA,GAAU,CAAC,GAAA,EAAa,CAAA,KAAsB;AAClD,IAAA,MAAM,IAAA,GAAO,OAAO,WAAA,GAAc,CAAA;AAClC,IAAA,OAAO,IAAA,IAAQ,IAAI,GAAA,GAAM,MAAA,CAAOA,OAAM,GAAA,GAAM,IAAA,EAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,EACzD,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAwB;AAC1C,IAAA,IAAI,aAAA,CAAc,CAAA,CAAE,MAAM,CAAA,EAAG;AAC7B,IAAA,IAAI,EAAE,MAAA,YAAkB,OAAA,IAAW,EAAE,MAAA,CAAO,OAAA,CAAQ,iBAAiB,CAAA,EAAG;AACxE,IAAA,YAAA,CAAa,CAAA,EAAG,CAAC,EAAA,EAAI,EAAA,EAAI,KAAA,MAAW;AAAA,MAClC,MAAM,OAAA,CAAQ,KAAA,CAAM,IAAA,GAAO,EAAA,EAAI,MAAM,KAAK,CAAA;AAAA,MAC1C,MAAM,OAAA,CAAQ,KAAA,CAAM,GAAA,GAAM,EAAA,EAAI,MAAM,MAAM;AAAA,KAC5C,CAAE,CAAA;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAwB;AAC5C,IAAA,MAAM,GAAA,GAAO,CAAA,CAAE,aAAA,CAA8B,OAAA,CAAQ,MAAA;AACrD,IAAA,YAAA,CAAa,CAAA,EAAG,CAAC,EAAA,EAAI,EAAA,EAAI,KAAA,KAAU;AACjC,MAAA,MAAM,MAA4B,EAAC;AACnC,MAAA,IAAI,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,MAAO,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAMA,MAAAA,CAAM,KAAA,CAAM,KAAA,GAAQ,EAAA,EAAIF,MAAAA,EAAO,KAAK,CAAC,CAAA;AACnF,MAAA,IAAI,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAG;AACrB,QAAA,GAAA,CAAI,KAAA,GAAQ,KAAK,KAAA,CAAME,MAAAA,CAAM,MAAM,KAAA,GAAQ,EAAA,EAAIF,MAAAA,EAAO,KAAK,CAAC,CAAA;AAE5D,QAAA,GAAA,CAAI,OAAO,OAAA,CAAQ,KAAA,CAAM,QAAQ,GAAA,CAAI,KAAA,EAAO,IAAI,KAAK,CAAA;AAAA,MACvD;AACA,MAAA,IAAI,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,MAAO,MAAA,GAAS,IAAA,CAAK,KAAA,CAAME,MAAAA,CAAM,KAAA,CAAM,MAAA,GAAS,EAAA,EAAID,MAAAA,EAAO,KAAK,CAAC,CAAA;AACrF,MAAA,IAAI,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAG;AACrB,QAAA,GAAA,CAAI,MAAA,GAAS,KAAK,KAAA,CAAMC,MAAAA,CAAM,MAAM,MAAA,GAAS,EAAA,EAAID,MAAAA,EAAO,KAAK,CAAC,CAAA;AAC9D,QAAA,GAAA,CAAI,OAAO,OAAA,CAAQ,KAAA,CAAM,SAAS,GAAA,CAAI,MAAA,EAAQ,IAAI,MAAM,CAAA;AAAA,MAC1D;AACA,MAAA,OAAO,GAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,IAAA,CAAK,gBAAA,CAAiB,aAAa,UAAU,CAAA;AAC7C,EAAA,KAAA,MAAW,CAAA,IAAK,OAAA,EAAS,CAAA,CAAE,gBAAA,CAAiB,aAAa,YAAY,CAAA;AAErE,EAAA,OAAO;AAAA,IACL,YAAY,MAAM,QAAA;AAAA,IAClB,QAAQ,MAAM;AACZ,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,IAAA,CAAK,mBAAA,CAAoB,aAAa,UAAU,CAAA;AAChD,MAAA,KAAA,MAAW,CAAA,IAAK,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO;AAClC,MAAA,KAAA,CAAM,MAAA,EAAO;AACb,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,cAAc,CAAA;AACpC,MAAA,OAAO,KAAK,OAAA,CAAQ,cAAA;AAAA,IACtB;AAAA,GACF;AACF;AAIA,SAAS,YAAA,CACP,IAAA,EACA,MAAA,EACA,MAAA,EACgC;AAChC,EAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,cAAA,KAAmB,GAAA,EAAK,OAAO,IAAA;AAClD,EAAA,MAAA,CAAO,QAAQ,cAAA,GAAiB,GAAA;AAChC,EAAA,MAAA,CAAO,SAAA,CAAU,IAAI,gBAAgB,CAAA;AAErC,EAAA,MAAM,MAAM,MAAA,CAAO,aAAA;AACnB,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,aAAA,CAAc,OAAO,CAAA;AACvC,EAAA,KAAA,CAAM,WAAA,GAAc,eAAA;AACpB,EAAA,MAAA,CAAO,YAAY,KAAK,CAAA;AAExB,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,QAAA,GAAW,KAAA;AAEf,EAAA,MAAM,aAAa,MACjB,MAAA,CAAO,UAAU,QAAA,CAAS,mBAAmB,IAAI,QAAA,GAAW,KAAA;AAE9D,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAwB;AACtC,IAAA,IAAI,aAAA,CAAc,CAAA,CAAE,MAAM,CAAA,EAAG;AAC7B,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,QAAA,GAAW,IAAA;AACX,IAAA,MAAM,WAAW,UAAA,EAAW;AAC5B,IAAA,IAAI,OAAA,GAAU,QAAA;AAEd,IAAA,MAAM,IAAA,GAAO,CAAC,EAAA,KAAyB;AAErC,MAAA,MAAM,OAAO,EAAA,CAAG,OAAA,GAAU,MAAA,CAAO,WAAA,GAAc,IAAI,KAAA,GAAQ,QAAA;AAC3D,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,MAAA,CAAO,SAAA,CAAU,MAAA,CAAO,gBAAA,EAAkB,mBAAmB,CAAA;AAC7D,QAAA,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,CAAA,WAAA,EAAc,IAAI,CAAA,CAAE,CAAA;AAAA,MAC3C;AAAA,IACF,CAAA;AACA,IAAA,MAAM,KAAK,MAAY;AACrB,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,IAAI,CAAA;AAC5C,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,EAAE,CAAA;AACxC,MAAA,QAAA,GAAW,KAAA;AACX,MAAA,IAAI,OAAA,KAAY,QAAA,IAAY,CAAC,QAAA,EAAU;AACrC,QAAA,IAAA,CAAK,QAAA,CAAS,EAAE,SAAA,EAAW,IAAA,CAAK,SAAA,EAAW,OAAO,EAAE,QAAA,EAAU,OAAA,EAAQ,EAAG,CAAA;AAAA,MAC3E;AACA,MAAA,IAAA,CAAK,YAAA,IAAe;AAAA,IACtB,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,IAAI,CAAA;AACzC,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,EAAE,CAAA;AAAA,EACvC,CAAA;AAEA,EAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,MAAM,CAAA;AAE3C,EAAA,OAAO;AAAA,IACL,YAAY,MAAM,QAAA;AAAA,IAClB,QAAQ,MAAM;AACZ,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,MAAM,CAAA;AAC9C,MAAA,KAAA,CAAM,MAAA,EAAO;AACb,MAAA,MAAA,CAAO,SAAA,CAAU,OAAO,gBAAgB,CAAA;AACxC,MAAA,OAAO,OAAO,OAAA,CAAQ,cAAA;AAAA,IACxB;AAAA,GACF;AACF;;;AC9UA,IAAM,iBAAA,GAAoB;AAAA,EACxB,QAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,kBAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA;AAGO,IAAM,oBAAA,GAAuB;AAAA,EAClC,QAAA;AAAA,EACA,SAAA;AAAA,EACA,4BAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,0BAAA;AAAA,EACA,WAAA;AAAA,EACA,gBAAA;AAAA,EACA,GAAG,iBAAA,CAAkB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,OAAA,EAAU,CAAC,CAAA,EAAA,CAAI;AACjD,CAAA,CAAE,KAAK,IAAI;AAGJ,SAAS,qBAAqB,OAAA,EAA2B;AAC9D,EAAA,IAAI;AACF,IAAA,OAAO,OAAA,CAAQ,QAAQ,oBAAoB,CAAA;AAAA,EAC7C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAOO,SAAS,mBAAmB,OAAA,EAAkC;AACnE,EAAA,IAAI;AACF,IAAA,OAAO,OAAA,CAAQ,QAAQ,oBAAoB,CAAA;AAAA,EAC7C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAQA,IAAM,QAAA,GAAW,2EAAA;AAOV,SAAS,gBAAA,CAAiB,OAAA,EAAkB,GAAA,GAAM,GAAA,EAAa;AACpE,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,KAAA,CACZ,GAAA,IAAO,EAAA,EAAI,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AAC9D,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA;AACtC,EAAA,IAAI,IAAA,EAAM,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,GAAG,CAAA;AAClC,EAAA,MAAM,QAAA,GACJ,KAAA,CAAM,OAAA,CAAQ,YAAA,CAAa,YAAY,CAAC,CAAA,IAAK,KAAA,CAAM,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAC,CAAA;AAClF,EAAA,OAAO,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAC9B;;;ACpEA,IAAM,QAAA,GAAW,UAAA;AACjB,IAAM,gBAAA,GAAmB,iBAAA;AACzB,IAAM,qBAAA,GAAwB,CAAA;AAyC9B,IAAM,aAAA,GAAgB;AAAA;AAAA;AAAA;AAAA,WAAA,EAIT,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAUR,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAiBR,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA4BrB,IAAM,SAAA,GACJ,yZAAA;AAWF,IAAM,gBAAN,MAAoB;AAAA,EAApB,WAAA,GAAA;AACE,IAAA,IAAA,CAAQ,IAAA,GAA2B,IAAA;AACnC,IAAA,IAAA,CAAQ,GAAA,GAA0B,IAAA;AAClC,IAAA,IAAA,CAAQ,KAAA,GAA4B,IAAA;AACpC,IAAA,IAAA,CAAQ,OAAA,GAA0B,IAAA;AAClC,IAAA,IAAA,CAAQ,YAAA,GAAe,qBAAA;AACvB,IAAA,IAAA,CAAQ,IAAA,GAA6B,IAAA;AACrC,IAAA,IAAA,CAAQ,MAAA,GAA8C,IAAA;AACtD,IAAA,IAAA,CAAQ,QAAA,GAAgC,IAAA;AAqGxC,IAAA,IAAA,CAAQ,MAAA,GAAS,CAAC,KAAA,KAA4B;AAC5C,MAAA,IAAI,EAAE,MAAM,MAAA,YAAkB,OAAA,CAAA,IAAY,KAAK,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA,EAAG;AACpE,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,MAAM,CAAA;AAC9C,MAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,MAAA,IAAI,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAAA,gBAClB,OAAA,EAAQ;AAAA,IACpB,CAAA;AAEA,IAAA,IAAA,CAAQ,OAAA,GAAU,CAAC,KAAA,KAA4B;AAE7C,MAAA,IAAI,MAAM,MAAA,EAAQ;AAClB,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA,EAAG;AAG9B,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,MAAA,KAAA,CAAM,wBAAA,EAAyB;AAE/B,MAAA,MAAM,SAAS,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,aAAA,CAAc,MAAM,MAAM,CAAA;AAC9D,MAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AACnC,MAAA,MAAM,KAAK,IAAA,CAAK,MAAA;AAChB,MAAA,IAAA,CAAK,IAAA,EAAK;AACV,MAAA,EAAA,GAAK,MAAM,CAAA;AAAA,IACb,CAAA;AAEA,IAAA,IAAA,CAAQ,KAAA,GAAQ,CAAC,KAAA,KAA+B;AAC9C,MAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC5B,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,MAAA,MAAM,KAAK,IAAA,CAAK,QAAA;AAChB,MAAA,IAAA,CAAK,IAAA,EAAK;AACV,MAAA,EAAA,IAAK;AAAA,IACP,CAAA;AAGA;AAAA,IAAA,IAAA,CAAQ,OAAA,GAAU,CAAC,KAAA,KAA4B;AAC7C,MAAA,IAAI,MAAM,MAAA,IAAU,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA,EAAG;AAC9C,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,KAAA,CAAM,eAAA,EAAgB;AAAA,IACxB,CAAA;AAEA,IAAA,IAAA,CAAQ,aAAa,MAAY;AAC/B,MAAA,IAAI,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,IAC1C,CAAA;AAAA,EAAA;AAAA,EAhJA,MAAM,OAAA,EAAqC;AACzC,IAAA,IAAA,CAAK,IAAA,EAAK;AAEV,IAAA,IAAA,CAAK,YAAA,GAAe,QAAQ,YAAA,IAAgB,qBAAA;AAC5C,IAAA,IAAA,CAAK,IAAA,GAAO,QAAQ,IAAA,IAAQ,IAAA;AAC5B,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,QAAA,IAAY,IAAA;AAEpC,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,YAAA,CAAa,kBAAkB,EAAE,CAAA;AACtC,IAAA,MAAM,SAAS,IAAA,CAAK,YAAA,CAAa,EAAE,IAAA,EAAM,QAAQ,CAAA;AAEjD,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,IAAA,KAAA,CAAM,WAAA,GAAc,aAAA;AAEpB,IAAA,IAAA,CAAK,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACvC,IAAA,IAAA,CAAK,IAAI,SAAA,GAAY,cAAA;AACrB,IAAA,IAAA,CAAK,GAAA,CAAI,MAAM,OAAA,GAAU,MAAA;AAEzB,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,MAAM,SAAA,GAAY,gBAAA;AACvB,IAAA,IAAA,CAAK,KAAA,CAAM,MAAM,OAAA,GAAU,MAAA;AAG3B,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,SAAA,GAAY,eAAA;AACjB,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,IAAA,IAAA,CAAK,SAAA,GAAY,oBAAA;AACjB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,SAAA,GAAY,oBAAA;AACjB,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC3C,IAAA,KAAA,CAAM,SAAA,GAAY,qBAAA;AAClB,IAAA,KAAA,CAAM,WAAA,GAAc,QAAQ,IAAA,IAAQ,2DAAA;AACpC,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AACzC,IAAA,GAAA,CAAI,SAAA,GAAY,mBAAA;AAChB,IAAA,GAAA,CAAI,WAAA,GACF,QAAQ,OAAA,IAAW,uEAAA;AACrB,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,GAAG,CAAA;AACtB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,SAAA,GAAY,iBAAA;AACnB,IAAA,MAAA,CAAO,IAAA,GAAO,QAAA;AACd,IAAA,MAAA,CAAO,WAAA,GAAc,UAAA;AACrB,IAAA,MAAA,CAAO,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACtC,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,MAAM,KAAK,IAAA,CAAK,QAAA;AAChB,MAAA,IAAA,CAAK,IAAA,EAAK;AACV,MAAA,EAAA,IAAK;AAAA,IACP,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAE9B,IAAA,MAAA,CAAO,OAAO,KAAA,EAAO,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,OAAO,IAAI,CAAA;AAC/C,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAEZ,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAA,EAAa,IAAA,CAAK,MAAA,EAAQ,IAAI,CAAA;AACxD,IAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AACrD,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAA,EAAa,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AACzD,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AACvD,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,IAAA,CAAK,KAAA,EAAO,IAAI,CAAA;AACrD,IAAA,MAAA,CAAO,gBAAA,CAAiB,QAAA,EAAU,IAAA,CAAK,UAAA,EAAY,IAAI,CAAA;AACvD,IAAA,MAAA,CAAO,gBAAA,CAAiB,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AAAA,EACnD;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,IAAA,CAAK,MAAA,EAAQ,IAAI,CAAA;AAC3D,IAAA,QAAA,CAAS,mBAAA,CAAoB,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AACxD,IAAA,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAC5D,IAAA,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAC1D,IAAA,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,IAAA,CAAK,KAAA,EAAO,IAAI,CAAA;AACxD,IAAA,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,IAAA,CAAK,UAAA,EAAY,IAAI,CAAA;AAC1D,IAAA,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AAEpD,IAAA,IAAI,IAAA,CAAK,MAAM,UAAA,EAAY,IAAA,CAAK,KAAK,UAAA,CAAW,WAAA,CAAY,KAAK,IAAI,CAAA;AACrE,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,GAAA,GAAM,IAAA;AACX,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EAClB;AAAA;AAAA,EAGQ,cAAc,MAAA,EAA4C;AAChE,IAAA,IAAI,EAAE,MAAA,YAAkB,OAAA,CAAA,IAAY,KAAK,KAAA,CAAM,MAAM,GAAG,OAAO,IAAA;AAC/D,IAAA,OAAO,IAAA,CAAK,IAAA,KAAS,aAAA,GAAgB,kBAAA,CAAmB,MAAM,CAAA,GAAI,MAAA;AAAA,EACpE;AAAA,EAEQ,OAAA,GAAgB;AACtB,IAAA,IAAI,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,MAAM,OAAA,GAAU,MAAA;AACvC,IAAA,IAAI,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,MAAM,OAAA,GAAU,MAAA;AAAA,EAC7C;AAAA;AAAA,EAGQ,MAAM,MAAA,EAAqC;AACjD,IAAA,OAAO,MAAA,YAAkB,QAAQ,IAAA,CAAK,IAAA,KAAS,QAAQ,IAAA,CAAK,IAAA,CAAK,SAAS,MAAM,CAAA;AAAA,EAClF;AAAA;AAAA,EAkDQ,KAAK,OAAA,EAAwB;AACnC,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,IAAO,CAAC,KAAK,KAAA,EAAO;AAC9B,IAAA,MAAM,IAAA,GAAO,QAAQ,qBAAA,EAAsB;AAE3C,IAAA,IAAA,CAAK,GAAA,CAAI,MAAM,OAAA,GAAU,OAAA;AACzB,IAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,KAAK,GAAG,CAAA,EAAA,CAAA;AAChC,IAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,KAAK,IAAI,CAAA,EAAA,CAAA;AAClC,IAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,KAAK,KAAK,CAAA,EAAA,CAAA;AACpC,IAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,KAAK,MAAM,CAAA,EAAA,CAAA;AAEtC,IAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,OAAA,EAAS,CAAC,CAAA;AAC7C,IAAA,IAAA,CAAK,MAAM,WAAA,GAAc,EAAA;AACzB,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,IAAA,GAAA,CAAI,SAAA,GAAY,cAAA;AAChB,IAAA,GAAA,CAAI,WAAA,GAAc,QAAA;AAClB,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,IAAA,GAAA,CAAI,SAAA,GAAY,cAAA;AAChB,IAAA,GAAA,CAAI,WAAA,GAAc,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA,MAAA,EAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA;AACxE,IAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,GAAA,EAAK,GAAG,CAAA;AAG1B,IAAA,IAAA,CAAK,KAAA,CAAM,MAAM,OAAA,GAAU,OAAA;AAC3B,IAAA,MAAM,OAAA,GAAU,EAAA;AAChB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,UAAU,MAAA,CAAO,WAAA;AACtD,IAAA,IAAA,CAAK,MAAM,KAAA,CAAM,GAAA,GAAM,UAAA,GACnB,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,GAAM,UAAU,CAAC,CAAC,OACtC,CAAA,EAAG,IAAA,CAAK,SAAS,CAAC,CAAA,EAAA,CAAA;AACtB,IAAA,IAAA,CAAK,KAAA,CAAM,MAAM,IAAA,GAAO,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA,CAAA;AAAA,EACnD;AAAA,EAEQ,SAAS,OAAA,EAAiC;AAChD,IAAA,MAAM,IAAA,GAAO,QAAQ,qBAAA,EAAsB;AAC3C,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,iBAAA,CAAkB,OAAA,EAAS,IAAA,CAAK,YAAY,CAAA;AAAA,MACtD,aAAA,EAAe,iBAAA,CAAkB,OAAA,EAAS,CAAC,CAAA;AAAA,MAC3C,GAAA,EAAK,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY;AAAA,MACjC,EAAA,EAAI,QAAQ,EAAA,IAAM,IAAA;AAAA,MAClB,OAAA,EAAS,mBAAmB,OAAO,CAAA;AAAA,MACnC,IAAA,EAAM,iBAAiB,OAAO,CAAA;AAAA,MAC9B,IAAA,EAAM;AAAA,QACJ,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,QACvB,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAAA,QACtB,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAAA,QAC5B,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAM;AAAA;AAChC,KACF;AAAA,EACF;AACF,CAAA;AAEA,IAAI,YAAA,GAAqC,IAAA;AAkBlC,SAAS,mBAAmB,OAAA,EAAoD;AACrF,EAAA,IAAI,CAAC,aAAY,EAAG;AAClB,IAAA,OAAO,EAAE,MAAM,MAAM;AAAA,IAAC,CAAA,EAAE;AAAA,EAC1B;AACA,EAAA,IAAI,CAAC,YAAA,EAAc,YAAA,GAAe,IAAI,aAAA,EAAc;AACpD,EAAA,YAAA,CAAa,MAAM,OAAO,CAAA;AAC1B,EAAA,OAAO,EAAE,IAAA,EAAM,MAAM,YAAA,EAAc,MAAK,EAAE;AAC5C;AAGO,SAAS,iBAAA,GAA0B;AACxC,EAAA,YAAA,EAAc,IAAA,EAAK;AACrB;;;AC7SA,IAAM,mBAAA,GAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAoCrB,SAAS,eAAA,GAA4C;AAC1D,EAAA,IAAI,CAAC,SAAA,EAAU,IAAK,CAAC,WAAA,IAAe,OAAO,IAAA;AAI3C,EAAA,MAAM,MAAM,qBAAA,EAAsB;AAClC,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,EAAA,MAAM,eAAA,GAAkB,sBAAA,CAAuB,GAAA,CAAI,MAAM,CAAA;AACzD,EAAA,IAAI,CAAC,iBAAiB,OAAO,IAAA;AAE7B,EAAA,IAAI,MAAA,GAAqC,IAAA;AACzC,EAAA,IAAI,KAAA,GAAmC,IAAA;AAEvC,EAAA,IAAI,MAAA,GAAqC,IAAA;AACzC,EAAA,IAAI,YAAA,GAA8B,IAAA;AAClC,EAAA,IAAI,WAAA,GAA8C,IAAA;AAClD,EAAA,IAAI,UAAA,GAA2C,IAAA;AAE/C,EAAA,IAAI,SAAA,GAAiC,IAAA;AAErC,EAAA,IAAI,QAAA,GAAkC,IAAA;AAEtC,EAAA,IAAI,eAAA,GAAiC,IAAA;AAErC,EAAA,IAAI,SAAA,GAAgC,IAAA;AAEpC,EAAA,IAAI,gBAAA,GAAmB,CAAA;AAEvB,EAAA,IAAI,cAAA,GAAsE,IAAA;AAE1E,EAAA,IAAI,WAAA,GAAmE,IAAA;AAEvE,EAAA,IAAI,WAAA,GAAc,KAAA;AAElB,EAAA,IAAI,cAAA,GAAsC,IAAA;AAE1C,EAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,IAAI,YAAA,GAAqD,IAAA;AAMzD,EAAA,IAAI,gBAAA,GAAmB,KAAA;AAEvB,EAAA,IAAI,eAAA,GAAkB,IAAA;AACtB,EAAA,MAAM,SAAA,GAAY,MAAsB,KAAA,GAAQ,KAAA,CAAM,QAAO,GAAI,YAAA;AAEjE,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAA8B;AAC1C,IAAA,SAAA,EAAU,EAAG,YAAY,EAAE,MAAA,EAAQ,oBAAoB,KAAA,EAAO,GAAG,KAAA,EAAM,EAAG,eAAe,CAAA;AAAA,EAC3F,CAAA;AAQA,EAAA,MAAM,WAAA,GAAc,CAClB,GAAA,KAC8B;AAC9B,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,UAAA;AACxB,IAAA,OAAO,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,cAAA,IAAkB,CAAC,CAAA;AAAA,EAC9C,CAAA;AACA,EAAA,MAAM,kBAAA,GAAqB,CAAC,GAAA,KAC1B,eAAA,CAAgB,WAAA,CAAY,GAAG,CAAA,EAAG,YAAA,EAAc,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA;AAEtE,EAAA,MAAM,iBAAA,GAAoB,CAAC,OAAA,KACzB,IAAA,CAAK,EAAE,IAAA,EAAM,gBAAA,EAAkB,SAAS,CAAA;AAE1C,EAAA,MAAM,qBAAqB,MAAY;AACrC,IAAA,WAAA,EAAa,MAAA,EAAO;AACpB,IAAA,WAAA,GAAc,IAAA;AACd,IAAA,UAAA,EAAY,MAAA,EAAO;AACnB,IAAA,UAAA,GAAa,IAAA;AACb,IAAA,SAAA,IAAY;AACZ,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,QAAA,IAAW;AACX,IAAA,QAAA,GAAW,IAAA;AACX,IAAA,UAAA,GAAa,IAAA;AACb,IAAA,SAAA,GAAY,KAAA;AACZ,IAAA,QAAA,EAAU,MAAA,EAAO;AACjB,IAAA,QAAA,GAAW,IAAA;AAIX,IAAA,YAAA,GAAe,IAAA;AAAA,EACjB,CAAA;AAEA,EAAA,MAAM,kBAAkB,MAAY;AAClC,IAAA,kBAAA,EAAmB;AACnB,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,iBAAA,EAAkB;AAAA,EACpB,CAAA;AAQA,EAAA,MAAM,SAAA,GAAY,CAAA;AAClB,EAAA,MAAM,WAAA,GAAc,CAAA;AACpB,EAAA,MAAM,SAAA,GAAY,EAAA;AAElB,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,MAAA,EACE,oTAAA;AAAA,IACF,IAAA,EAAM,+XAAA;AAAA,IACN,KAAA,EACE;AAAA,GACJ;AACA,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,IAAA,EAAM,4LAAA;AAAA,IACN,KAAA,EACE;AAAA,GACJ;AAOA,EAAA,MAAM,WAAA,GAAc,CAAC,MAAA,EAAqB,OAAA,KAAuD;AAC/F,IAAA,KAAA,MAAW,GAAA,IAAO,WAAA,CAAY,MAAM,CAAA,EAAG;AACrC,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AAC3C,QAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA;AACzB,QAAA,IAAI,CAAC,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,QAAA,KAAa,OAAO,CAAA,EAAG;AAC3D,QAAA,OAAO,EAAE,MAAM,CAAA,GAAI,CAAA,EAAG,OAAO,CAAA,GAAI,GAAA,CAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAE;AAAA,MAC1D;AAAA,IACF;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,EACrC,CAAA;AAGA,EAAA,IAAI,gBAA6B,EAAC;AAOlC,EAAA,IAAI,UAAA,GAA4B,IAAA;AAChC,EAAA,IAAI,aAAA,GAA+B,IAAA;AACnC,EAAA,IAAI,QAAA,GAAgC,IAAA;AAEpC,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,IAAI,YAAA,GAAoD,IAAA;AAExD,EAAA,IAAI,YAAA,GAAoE,IAAA;AAGxE,EAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAA4C;AAC/D,IAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAClB,IAAA,MAAM,EAAE,MAAA,EAAQ,GAAG,IAAA,EAAK,GAAI,IAAA;AAC5B,IAAA,OAAO,KAAK,SAAA,CAAU;AAAA,MACpB,IAAA;AAAA,MACA,SAAS,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM;AAChC,QAAA,MAAM,EAAE,MAAM,EAAA,EAAI,IAAA,EAAM,IAAI,KAAA,EAAO,EAAA,EAAI,GAAG,IAAA,EAAK,GAAI,CAAA;AACnD,QAAA,OAAO,IAAA;AAAA,MACT,CAAC;AAAA,KACF,CAAA;AAAA,EACH,CAAA;AASA,EAAA,MAAM,eAAA,GAAkB,CAAC,GAAA,KAA+D;AACtF,IAAA,MAAM,IAAA,GAAO,YAAA;AACb,IAAA,IAAI,CAAC,QAAQ,GAAA,CAAI,KAAA,CAAM,cAAc,WAAA,IAAe,IAAA,CAAK,KAAA,CAAM,SAAA,KAAc,WAAA,EAAa;AACxF,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,cAAA,IAAkB,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,cAAA,IAAkB,CAAA,MAAO,KAAK,OAAO,KAAA;AAErD,IAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAChB,IAAA,CAAK,SAAA,CAAU,EAAE,GAAG,CAAA,EAAG,UAAA,EAAY,MAAA,EAAW,CAAA;AAChD,IAAA,IAAI,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA,KAAM,QAAA,CAAS,IAAI,KAAK,CAAA,IAAK,IAAA,CAAK,QAAA,KAAa,GAAA,CAAI,QAAA;AACxE,MAAA,OAAO,KAAA;AACT,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAA2B,kBAAkB,CAAA;AACnE,IAAA,MAAM,IAAA,GAAO,IAAA,GAAO,WAAA,CAAY,IAAI,CAAA,GAAI,IAAA;AACxC,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM,OAAO,KAAA;AAC3B,IAAA,MAAM,QAAA,GAAY,IAAA,CAAK,KAAA,CAAM,UAAA,CAA0C,GAAG,CAAA;AAC1E,IAAA,MAAM,QAAA,GAAY,GAAA,CAAI,KAAA,CAAM,UAAA,CAA0C,GAAG,CAAA;AACzE,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU,OAAO,KAAA;AACnC,IAAA,IAAI,YAAY,QAAQ,CAAA,KAAM,WAAA,CAAY,QAAQ,GAAG,OAAO,KAAA;AAC5D,IAAA,MAAM,MAAM,IAAA,CAAK,aAAA;AACjB,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,MAAA,IAAU,EAAC;AACvC,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,MAAA,IAAU,EAAC;AACvC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC1C,MAAA,MAAM,CAAA,GAAI,WAAW,CAAC,CAAA;AACtB,MAAA,MAAM,CAAA,GAAI,WAAW,CAAC,CAAA;AACtB,MAAA,IACE,EAAE,IAAA,KAAS,CAAA,CAAE,IAAA,IACb,CAAA,CAAE,SAAS,CAAA,CAAE,IAAA,IACb,IAAA,CAAK,SAAA,CAAU,EAAE,KAAK,CAAA,KAAM,KAAK,SAAA,CAAU,CAAA,CAAE,KAAK,CAAA,EAClD;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,CAAA,CAAE,QAAA,EAAU,OAAO,KAAA;AACxB,MAAA,MAAM,OAAO,IAAA,CAAK,aAAA,CAA2B,CAAA,oBAAA,EAAuB,CAAA,CAAE,QAAQ,CAAA,EAAA,CAAI,CAAA;AAClF,MAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,MAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU;AAEvB,QAAA,IAAA,CAAK,WAAA,GAAc,CAAA,CAAE,IAAA,EAAM,IAAA,EAAK,IAAK,IAAA;AACrC,QAAA,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAC5B,QAAA,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,0BAAA,EAA4B,qBAAqB,CAAA;AACvE,QAAA,MAAM,EAAA,GAAM,CAAA,CAAE,KAAA,IAAS,EAAC;AACxB,QAAA,IAAI,EAAA,CAAG,MAAA,KAAW,WAAA,IAAe,EAAA,CAAG,WAAW,MAAA,EAAQ;AACrD,UAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,CAAA,eAAA,EAAkB,EAAA,CAAG,MAAM,CAAA,CAAE,CAAA;AAAA,QAClD;AACA,QAAA,IAAI,OAAO,EAAA,CAAG,SAAA,KAAc,YAAY,EAAA,CAAG,SAAA,CAAU,MAAK,EAAG;AAC3D,UAAA,IAAA,CAAK,YAAA,CAAa,YAAA,EAAc,EAAA,CAAG,SAAA,CAAU,MAAM,CAAA;AAAA,QACrD,CAAA,MAAO,IAAA,CAAK,eAAA,CAAgB,YAAY,CAAA;AACxC,QAAA,eAAA,CAAgB,IAAA,EAAM,CAAA,CAAE,KAAA,EAAO,QAAQ,CAAA;AACvC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,EAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,IAAA,KAAS,QAAQ,OAAO,KAAA;AACnD,MAAA,MAAM,KAAA,GACJ,kBAAkB,CAAA,EAAG,GAAA,EAAK,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA,IAAA,CAC1C,MAAM;AACL,QAAA,MAAMF,GAAAA,GAAK,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AAClC,QAAAA,IAAG,SAAA,GAAY,uBAAA;AACf,QAAAA,GAAAA,CAAG,cACD,CAAA,CAAE,IAAA,KAAS,UACP,kBAAA,GACA,CAAA,CAAE,IAAA,KAAS,OAAA,GACT,uCAAA,GACA,iBAAA;AACR,QAAA,OAAOA,GAAAA;AAAA,MACT,CAAA,GAAG;AACL,MAAA,KAAA,CAAM,QAAQ,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,QAAA,IAAY,OAAO,CAAC,CAAA;AAC1D,MAAA,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAA,CAAE,QAAA;AAC7B,MAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,IACxB;AACA,IAAA,YAAA,GAAe,GAAA;AACf,IAAA,aAAA,GAAgB,UAAA;AAEhB,IAAA,mBAAA,CAAoB,MAAM,GAAG,CAAA;AAC7B,IAAA,cAAA,CAAe,IAAA,EAAM,KAAK,UAAU,CAAA;AACpC,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAGA,EAAA,MAAM,cAAc,CAAC,IAAA,KACnB,KAAK,UAAA,EAAY,aAAA,CAA2B,WAAW,CAAA,IAAK,IAAA;AAG9D,EAAA,MAAM,mBAAA,GAAsB,CAAC,IAAA,KAA4B;AACvD,IAAA,MAAM,IAAA,GAAO,YAAY,IAAI,CAAA;AAC7B,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,KAAA,MAAWA,GAAAA,IAAM,IAAA,CAAK,gBAAA,CAAiB,sBAAsB,CAAA,EAAG;AAC9D,MAAAA,GAAAA,CAAG,SAAA,CAAU,MAAA,CAAO,qBAAqB,CAAA;AAAA,IAC3C;AACA,IAAA,IAAA,CAAK,aAAA,CAAc,oBAAoB,CAAA,EAAG,MAAA,EAAO;AACjD,IAAA,IAAA,CAAK,aAAA,CAAc,kBAAkB,CAAA,EAAG,MAAA,EAAO;AAAA,EACjD,CAAA;AAOA,EAAA,MAAM,mBAAA,GAAsB,CAAC,IAAA,EAAmB,SAAA,KAA4B;AAC1E,IAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,IAAA,MAAM,IAAA,GAAO,YAAY,IAAI,CAAA;AAC7B,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAMA,MAAK,eAAA,GACP,IAAA,CAAK,cAA2B,CAAA,oBAAA,EAAuB,eAAe,IAAI,CAAA,GAC1E,IAAA;AACJ,IAAA,IAAI,CAACA,GAAAA,IAAM,CAAC,eAAA,EAAiB;AAC3B,MAAA,eAAA,CAAgB,MAAM,SAAS,CAAA;AAC/B,MAAA;AAAA,IACF;AACA,IAAAA,GAAAA,CAAG,SAAA,CAAU,GAAA,CAAI,qBAAqB,CAAA;AACtC,IAAA,MAAM,MAAM,IAAA,CAAK,aAAA;AAMjB,IAAA,MAAM,EAAA,GAAK,iBAAiB,IAAI,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,WAAW,CAAA,IAAK,CAAA;AAClD,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,UAAU,CAAA,IAAK,CAAA;AACjD,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,YAAY,CAAA,IAAK,CAAA;AACnD,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,aAAa,CAAA,IAAK,CAAA;AACpD,IAAA,MAAM,SAASA,GAAAA,CAAG,aAAA;AAClB,IAAA,MAAM,QAAQ,MAAA,EAAQ,SAAA,CAAU,QAAA,CAAS,SAAS,IAAI,MAAA,GAAS,IAAA;AAC/D,IAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,KAAA,CAAM,UAAA,GAAa,IAAA;AACxC,IAAA,MAAM,OAAO,KAAA,GAAQ,KAAA,CAAM,aAAa,KAAA,CAAM,WAAA,GAAc,KAAK,WAAA,GAAc,IAAA;AAC/E,IAAA,MAAM,IAAA,GAAO,IAAA;AACb,IAAA,MAAM,IAAA,GAAO,KAAK,YAAA,GAAe,IAAA;AAGjC,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,IAAA,EAAMA,GAAAA,CAAG,aAAa,SAAS,CAAA;AACnD,IAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,IAAA,EAAMA,IAAG,UAAA,GAAaA,GAAAA,CAAG,cAAc,SAAS,CAAA;AACpE,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,EAAE,CAAA;AAC9B,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,IAAA,EAAMA,GAAAA,CAAG,YAAY,SAAS,CAAA;AAClD,IAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,IAAA,EAAMA,IAAG,SAAA,GAAYA,GAAAA,CAAG,eAAe,SAAS,CAAA;AACpE,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,KAAK,EAAE,CAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACrC,IAAA,KAAA,CAAM,SAAA,GAAY,iBAAA;AAClB,IAAA,KAAA,CAAM,YAAA,CAAa,2BAA2B,EAAE,CAAA;AAChD,IAAA,KAAA,CAAM,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,EAAE,CAAA,EAAA,CAAA;AACxB,IAAA,KAAA,CAAM,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,EAAE,CAAA,EAAA,CAAA;AACvB,IAAA,KAAA,CAAM,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,EAAE,CAAA,EAAA,CAAA;AACzB,IAAA,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,EAAE,CAAA,EAAA,CAAA;AAC1B,IAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AACtB,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACnC,IAAA,GAAA,CAAI,SAAA,GAAY,mBAAA;AAChB,IAAA,GAAA,CAAI,YAAA,CAAa,2BAA2B,EAAE,CAAA;AAC9C,IAAA,MAAM,OAAA,GAAU,eAAA;AAChB,IAAA,MAAM,KAAK,CAAC,MAAA,EAA4B,KAAA,EAAe,IAAA,EAAc,UAAU,IAAA,KAAe;AAC5F,MAAA,MAAM,CAAA,GAAI,GAAA,CAAI,aAAA,CAAc,QAAQ,CAAA;AACpC,MAAA,CAAA,CAAE,IAAA,GAAO,QAAA;AACT,MAAA,CAAA,CAAE,KAAA,GAAQ,KAAA;AACV,MAAA,CAAA,CAAE,YAAA,CAAa,cAAc,KAAK,CAAA;AAClC,MAAA,CAAA,CAAE,SAAA,GAAY,qBAAqB,MAAM,CAAA,CAAA;AACzC,MAAA,CAAA,CAAE,SAAA,GAAY,IAAA;AACd,MAAA,CAAA,CAAE,WAAW,CAAC,OAAA;AACd,MAAA,CAAA,CAAE,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACjC,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,IAAA,CAAK,EAAE,MAAM,cAAA,EAAgB,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,EAAS,MAAA,EAAO,EAAG,CAAA;AAAA,MACxE,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,YAAY,CAAC,CAAA;AAAA,IACnB,CAAA;AACA,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,aAAA,EAAe,OAAO,CAAA;AAC9C,IAAA,EAAA,CAAG,MAAA,EAAQ,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAChC,IAAA,EAAA,CAAG,WAAA,EAAa,UAAA,EAAY,IAAA,CAAK,IAAI,CAAA;AACrC,IAAA,EAAA,CAAG,QAAA,EAAU,UAAA,EAAY,IAAA,CAAK,KAAK,CAAA;AAEnC,IAAA,EAAA,CAAG,WAAA,EAAa,sBAAA,EAAwB,SAAA,CAAU,IAAA,EAAM,IAAI,IAAI,CAAA;AAChE,IAAA,EAAA,CAAG,YAAA,EAAc,oBAAA,EAAsB,SAAA,CAAU,KAAA,EAAO,IAAI,KAAK,CAAA;AAIjE,IAAA,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,WAAA,GAAc,EAAE,CAAC,CAAA,EAAA,CAAA;AACvD,IAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AACpB,IAAA,MAAM,IAAA,GAAO,IAAI,YAAA,IAAgB,SAAA;AAGjC,IAAA,GAAA,CAAI,OAAA,CAAQ,WAAA,GAAc,MAAA,CAAO,EAAA,GAAK,OAAO,CAAC,CAAA;AAC9C,IAAA,GAAA,CAAI,OAAA,CAAQ,WAAA,GAAc,MAAA,CAAO,EAAA,GAAK,CAAC,CAAA;AACvC,IAAA,GAAA,CAAI,KAAA,CAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,WAAA;AAE5B,IAAA,eAAA,CAAgB,MAAM,SAAS,CAAA;AAAA,EACjC,CAAA;AAGA,EAAA,MAAM,UAAA,GAAa,CAACA,GAAAA,MAAqB;AAAA,IACvC,MAAMA,GAAAA,CAAG,UAAA;AAAA,IACT,KAAKA,GAAAA,CAAG,SAAA;AAAA,IACR,KAAA,EAAOA,GAAAA,CAAG,UAAA,GAAaA,GAAAA,CAAG,WAAA;AAAA,IAC1B,MAAA,EAAQA,GAAAA,CAAG,SAAA,GAAYA,GAAAA,CAAG;AAAA,GAC5B,CAAA;AACA,EAAA,MAAM,aAAa,CACjB,CAAA,EACA,MACY,CAAA,CAAE,IAAA,GAAO,EAAE,KAAA,IAAS,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,SAAS,CAAA,CAAE,GAAA,GAAM,EAAE,MAAA,IAAU,CAAA,CAAE,MAAM,CAAA,CAAE,MAAA;AAWpF,EAAA,MAAM,sBAAA,GAAyB,CAAC,IAAA,KAA4B;AAC1D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAA2B,mBAAmB,CAAA;AACnE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAA2B,oBAAoB,CAAA;AACrE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAA2B,kBAAkB,CAAA;AACjE,IAAA,IAAI,QAAA,EAAU,QAAQ,WAAA,EAAa;AACjC,MAAA,QAAA,CAAS,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,QAAA,CAAS,QAAQ,WAAW,CAAA,EAAA,CAAA;AACpD,MAAA,IAAI,OAAA,IAAW,WAAW,UAAA,CAAW,QAAQ,GAAG,UAAA,CAAW,OAAO,CAAC,CAAA,EAAG;AACpE,QAAA,QAAA,CAAS,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,QAAA,CAAS,QAAQ,WAAW,CAAA,EAAA,CAAA;AAAA,MACtD;AAAA,IACF;AACA,IAAA,IAAI,MAAA,EAAQ,QAAQ,QAAA,EAAU;AAC5B,MAAA,MAAA,CAAO,MAAM,IAAA,GAAO,EAAA;AACpB,MAAA,MAAA,CAAO,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,MAAA,CAAO,QAAQ,QAAQ,CAAA,EAAA,CAAA;AAC/C,MAAA,MAAA,CAAO,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,MAAA,CAAO,QAAQ,WAAW,CAAA,EAAA,CAAA;AAChD,MAAA,MAAM,MAAA,GAAS,CAAC,OAAA,EAAS,QAAQ,CAAA,CAAE,OAAO,CAAC,CAAA,KAAwB,CAAC,CAAC,CAAC,CAAA;AACtE,MAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA,EAAG,UAAA,CAAW,CAAC,CAAC,CAAC,CAAA;AACtF,MAAA,IAAI,SAAQ,EAAG;AACb,QAAA,MAAA,CAAO,MAAM,KAAA,GAAQ,EAAA;AACrB,QAAA,MAAA,CAAO,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,MAAA,CAAO,QAAQ,OAAO,CAAA,EAAA,CAAA;AAAA,MAC/C;AACA,MAAA,IAAI,OAAA,MAAa,QAAA,EAAU;AAGzB,QAAA,MAAA,CAAO,MAAM,IAAA,GAAO,EAAA;AACpB,QAAA,MAAA,CAAO,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,MAAA,CAAO,QAAQ,QAAQ,CAAA,EAAA,CAAA;AAC/C,QAAA,MAAA,CAAO,MAAM,GAAA,GAAM,CAAA,EAAG,WAAW,QAAQ,CAAA,CAAE,SAAS,CAAC,CAAA,EAAA,CAAA;AAAA,MACvD;AAAA,IACF;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,MAAA,GAAS,CAACA,GAAAA,MAAqB;AAAA,IACnC,MAAMA,GAAAA,CAAG,UAAA;AAAA,IACT,KAAKA,GAAAA,CAAG,SAAA;AAAA,IACR,KAAA,EAAOA,GAAAA,CAAG,UAAA,GAAaA,GAAAA,CAAG,WAAA;AAAA,IAC1B,MAAA,EAAQA,GAAAA,CAAG,SAAA,GAAYA,GAAAA,CAAG;AAAA,GAC5B,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAC,EAAA,KACb,EAAA,CAAG,MAAA,KAAW,CAAA,GACV,IAAA,GACA,EAAA,CAAG,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,IACrB,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,EAAE,IAAI,CAAA;AAAA,IAC/B,KAAK,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,EAAE,GAAG,CAAA;AAAA,IAC5B,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,KAAA,EAAO,EAAE,KAAK,CAAA;AAAA,IAClC,QAAQ,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAA,EAAQ,EAAE,MAAM;AAAA,GACvC,CAAE,CAAA;AAqBR,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,EAAmB,MAAA,KAAwB;AAC7D,IAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KACZ,CAAA,CAAE,QAAA,GAAW,IAAA,CAAK,aAAA,CAA2B,CAAA,oBAAA,EAAuB,CAAA,CAAE,QAAQ,CAAA,EAAA,CAAI,CAAA,GAAI,IAAA;AACxF,IAAA,MAAM,EAAA,GAAK,iBAAiB,IAAI,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,WAAW,CAAA,IAAK,CAAA;AAClD,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,YAAY,CAAA,IAAK,CAAA;AACnD,IAAA,MAAM,WAAA,GAAc,IAAA;AACpB,IAAA,MAAM,YAAA,GAAe,KAAK,WAAA,GAAc,IAAA;AACxC,IAAA,MAAM,OAAO,WAAA,CAAY,MAAM,CAAA,CAC5B,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAA,CACjB,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,QAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,MAAA,CACf,GAAA,CAAI,CAAC,EAAE,KAAA,EAAM,MAAO,EAAE,OAAO,EAAA,EAAI,IAAA,CAAK,KAAK,CAAA,GAAI,CAAA,CAC/C,MAAA;AAAA,UACC,CAAC,MAAkD,CAAC,CAAC,EAAE,EAAA,IAAM,CAAC,CAAC,CAAA,CAAE,KAAA,CAAM;AAAA,SACzE;AACF,QAAA,MAAMI,WAAAA,GAAa,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC,CAAC,CAAA;AACvD,QAAA,IAAI,CAACA,aAAY,OAAO,IAAA;AACxB,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,EAAG,EAAA,CAAG,aAAA;AAC3B,QAAA,MAAMC,KAAAA,GAAO,OAAO,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA,GAAID,WAAAA;AACpE,QAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAAC,KAAAA,EAAK;AAAA,MACvB,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAkC,MAAM,IAAI,CAAA;AACvD,MAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AACnD,MAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AACxB,MAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA,EAAG,MAAM,CAAC,CAAA,EAAG,GAAG,aAAA,EAAe,aAAA;AACtD,MAAA,MAAM,IAAA,GAAO,KAAA,EAAO,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA,GAC5C,MAAA,CAAO,KAAK,CAAA,GACZ,EAAE,GAAG,UAAA,EAAY,IAAA,EAAM,WAAA,EAAa,OAAO,YAAA,EAAa;AAC5D,MAAA,MAAM,KAAK,OAAA,CAAQ,CAAC,GAAG,KAAA,CAAM,CAAC,GAAG,KAAA,CAAM,QAAA;AACvC,MAAA,OAAO,EAAE,EAAA,EAAI,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,SAAS,IAAA,EAAK;AAAA,IAC3C,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAkC,MAAM,IAAI,CAAA;AACvD,IAAA,OAAO,EAAE,MAAM,OAAA,EAAS,EAAE,MAAM,WAAA,EAAa,KAAA,EAAO,cAAa,EAAE;AAAA,EACrE,CAAA;AAGA,EAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,KAA4B;AAClD,IAAA,IAAA,CAAK,aAAA,CAAc,gBAAgB,CAAA,EAAG,MAAA,EAAO;AAC7C,IAAA,IAAA,CAAK,aAAA,CAAc,kBAAkB,CAAA,EAAG,MAAA,EAAO;AAAA,EACjD,CAAA;AAQA,EAAA,MAAM,eAAA,GAAkB,CAAC,IAAA,EAAmB,SAAA,KAA4B;AACtE,IAAA,MAAM,IAAA,GAAO,YAAY,IAAI,CAAA;AAC7B,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,sBAAA,CAAuB,IAAI,CAAA;AAC3B,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,UAAA,CAAW,MAAM,aAAa,CAAA;AAC/C,IAAA,MAAM,aAAA,GAAgB,kBAClB,IAAA,CAAK,IAAA;AAAA,MAAK,CAAC,CAAA,KACT,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,QAAA,KAAa,eAAe,CAAC;AAAA,KACjF,GACA,MAAA;AACJ,IAAA,MAAM,MAAA,GAAA,CACH,gBAAgB,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,aAAa,CAAA,GAAI,WAC5D,aAAA,KACC,UAAA,GAAa,KAAK,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,UAAU,CAAA,GAAI,MAAA,CAAA;AACxD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,MAAM,IAAA,CAAK,aAAA;AACjB,IAAA,MAAM,EAAA,GAAK,iBAAiB,IAAI,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,UAAU,CAAA,IAAK,CAAA;AACjD,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,aAAa,CAAA,IAAK,CAAA;AACpD,IAAA,MAAM,GAAA,GAAM,CAAA;AACZ,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,GAAG,MAAA,CAAO,IAAA,CAAK,OAAO,GAAG,CAAA;AAC7C,IAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,IAAA,CAAK,aAAa,MAAA,CAAO,IAAA,CAAK,QAAQ,GAAG,CAAA;AAC7D,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAC1E,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA;AAAA,MACd,KAAK,GAAA,CAAI,IAAA,CAAK,eAAe,IAAA,EAAM,MAAA,CAAO,KAAK,MAAM,CAAA;AAAA,MACrD,MAAA,CAAO,KAAK,MAAA,GAAS;AAAA,KACvB;AACA,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACrC,IAAA,KAAA,CAAM,SAAA,GAAY,eAAA;AAClB,IAAA,KAAA,CAAM,YAAA,CAAa,2BAA2B,EAAE,CAAA;AAChD,IAAA,KAAA,CAAM,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,EAAE,CAAA,EAAA,CAAA;AACxB,IAAA,KAAA,CAAM,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,EAAE,CAAA,EAAA,CAAA;AACvB,IAAA,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,EAAA,GAAK,EAAE,CAAC,CAAA,EAAA,CAAA;AAC3C,IAAA,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,EAAA,GAAK,EAAE,CAAC,CAAA,EAAA,CAAA;AAC5C,IAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AACtB,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACnC,IAAA,GAAA,CAAI,SAAA,GAAY,iBAAA;AAChB,IAAA,GAAA,CAAI,YAAA,CAAa,2BAA2B,EAAE,CAAA;AAC9C,IAAA,MAAM,UAAU,MAAA,CAAO,EAAA;AACvB,IAAA,MAAM,EAAA,GAAK,CAAC,MAAA,EAA0B,KAAA,EAAe,MAAc,IAAA,KAAwB;AACzF,MAAA,MAAM,CAAA,GAAI,GAAA,CAAI,aAAA,CAAc,QAAQ,CAAA;AACpC,MAAA,CAAA,CAAE,IAAA,GAAO,QAAA;AACT,MAAA,CAAA,CAAE,KAAA,GAAQ,KAAA;AACV,MAAA,CAAA,CAAE,YAAA,CAAa,cAAc,KAAK,CAAA;AAClC,MAAA,CAAA,CAAE,SAAA,GAAY,mBAAmB,MAAM,CAAA,CAAA;AACvC,MAAA,CAAA,CAAE,SAAA,GAAY,IAAA;AACd,MAAA,IAAI,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,IAAI,CAAA;AACvB,MAAA,CAAA,CAAE,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACjC,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,IAAA,CAAK,EAAE,MAAM,YAAA,EAAc,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,EAAS,MAAA,EAAO,EAAG,CAAA;AAAA,MACtE,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,YAAY,CAAC,CAAA;AAAA,IACnB,CAAA;AACA,IAAA,EAAA,CAAG,MAAA,EAAQ,aAAA,EAAe,IAAA,CAAK,MAAA,EAAQ,aAAa,CAAA;AACpD,IAAA,EAAA,CAAG,WAAA,EAAa,eAAA,EAAiB,IAAA,CAAK,IAAI,CAAA;AAC1C,IAAA,EAAA,CAAG,QAAA,EAAU,eAAA,EAAiB,IAAA,CAAK,KAAK,CAAA;AACxC,IAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AAGpB,IAAA,GAAA,CAAI,OAAA,CAAQ,WAAW,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,WAAA,GAAc,EAAE,CAAC,CAAA;AAChE,IAAA,GAAA,CAAI,OAAA,CAAQ,OAAA,GAAU,MAAA,CAAO,EAAE,CAAA;AAC/B,IAAA,GAAA,CAAI,OAAA,CAAQ,WAAA,GAAc,MAAA,CAAO,EAAA,GAAK,CAAC,CAAA;AACvC,IAAA,sBAAA,CAAuB,IAAI,CAAA;AAAA,EAC7B,CAAA;AAQA,EAAA,MAAM,gBAAA,GAAmB,CAAC,IAAA,EAAmB,SAAA,KAA4B;AACvE,IAAA,MAAM,IAAA,GAAO,YAAY,IAAI,CAAA;AAC7B,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAA,CAAK,aAAA,CAAc,iBAAiB,CAAA,EAAG,MAAA,EAAO;AAC9C,IAAA,IAAA,CAAK,aAAA,CAAc,mBAAmB,CAAA,EAAG,MAAA,EAAO;AAChD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,sBAAA,CAAuB,IAAI,CAAA;AAC3B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAM,IAAA,CAAK,aAAA;AACjB,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACrC,IAAA,KAAA,CAAM,SAAA,GAAY,gBAAA;AAClB,IAAA,KAAA,CAAM,YAAA,CAAa,2BAA2B,EAAE,CAAA;AAChD,IAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AACtB,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACnC,IAAA,GAAA,CAAI,SAAA,GAAY,kBAAA;AAChB,IAAA,GAAA,CAAI,YAAA,CAAa,2BAA2B,EAAE,CAAA;AAC9C,IAAA,MAAM,EAAA,GAAK,CAAC,MAAA,EAA2B,KAAA,EAAe,MAAA,KAA0B;AAC9E,MAAA,MAAM,CAAA,GAAI,GAAA,CAAI,aAAA,CAAc,QAAQ,CAAA;AACpC,MAAA,CAAA,CAAE,IAAA,GAAO,QAAA;AACT,MAAA,CAAA,CAAE,YAAY,CAAA,iBAAA,EAAoB,MAAM,CAAA,EAAG,MAAA,GAAS,eAAe,EAAE,CAAA,CAAA;AACrE,MAAA,CAAA,CAAE,YAAA,CAAa,cAAA,EAAgB,MAAA,GAAS,MAAA,GAAS,OAAO,CAAA;AACxD,MAAA,CAAA,CAAE,WAAA,GAAc,KAAA;AAChB,MAAA,CAAA,CAAE,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACjC,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,IAAA,CAAK,EAAE,MAAM,aAAA,EAAe,OAAA,EAAS,EAAE,SAAA,EAAW,MAAA,IAAU,CAAA;AAAA,MAC9D,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,YAAY,CAAC,CAAA;AAAA,IACnB,CAAA;AACA,IAAA,EAAA,CAAG,gBAAA,EAAkB,mBAAA,EAAqB,YAAA,KAAiB,MAAM,CAAA;AACjE,IAAA,EAAA,CAAG,WAAA,EAAa,cAAA,EAAgB,YAAA,KAAiB,WAAW,CAAA;AAC5D,IAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AAEpB,IAAA,GAAA,CAAI,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,CAAC,IAAA,CAAK,OAAO,GAAA,CAAI,YAAA,IAAgB,EAAA,IAAM,CAAC,CAAC,CAAA,EAAA,CAAA;AAC5D,IAAA,sBAAA,CAAuB,IAAI,CAAA;AAAA,EAC7B,CAAA;AAQA,EAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,EAAmB,SAAA,KAAoC;AAC7E,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAwB;AACtC,MAAA,MAAM,IAAA,GAAO,YAAY,IAAI,CAAA;AAC7B,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,MAAM,QAAA,GAAW,CAAA,CACd,YAAA,EAAa,CACb,IAAA;AAAA,QACC,CAAC,CAAA,KACC,CAAA,YAAa,OAAA,KACZ,CAAA,CAAE,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA,IAAK,CAAA,CAAE,SAAA,CAAU,QAAA,CAAS,kBAAkB,CAAA;AAAA,OAChF;AACF,MAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,QAAA,SAAA,GAAY,QAAA;AACZ,QAAA,gBAAA,CAAiB,MAAM,SAAS,CAAA;AAAA,MAClC;AACA,MAAA,IACE,CAAA,CACG,YAAA,EAAa,CACb,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,YAAa,OAAA,IAAW,CAAA,CAAE,SAAA,CAAU,QAAA,CAAS,iBAAiB,CAAC,CAAA,EAC9E;AACA,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,KAAK,qBAAA,EAAsB;AACxC,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,OAAO,IAAA,CAAK,UAAA;AACvC,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,MAAM,IAAA,CAAK,SAAA;AAItC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,aAAA,CAA2B,kBAAkB,CAAA;AAC9D,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,MAAM,GAAA,GAAM,EAAA;AACZ,QAAA,IACE,KAAK,GAAA,CAAI,UAAA,GAAa,OACtB,CAAA,IAAK,GAAA,CAAI,aAAa,GAAA,CAAI,WAAA,GAAc,OACxC,CAAA,IAAK,GAAA,CAAI,YAAY,EAAA,IACrB,CAAA,IAAK,IAAI,SAAA,GAAY,GAAA,CAAI,eAAe,GAAA,EACxC;AACA,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,MAAM,GAAA,GAAM,CAAA;AACZ,MAAA,MAAM,GAAA,GAAM,UAAA,CAAW,IAAA,EAAM,aAAa,EAAE,IAAA,CAAK,IAAA;AAAA,QAC/C,CAAC,MACC,CAAA,IAAK,CAAA,CAAE,KAAK,IAAA,GAAO,GAAA,IACnB,KAAK,CAAA,CAAE,IAAA,CAAK,QAAQ,GAAA,IACpB,CAAA,IAAK,EAAE,IAAA,CAAK,GAAA,GAAM,OAClB,CAAA,IAAK,CAAA,CAAE,KAAK,MAAA,GAAS;AAAA,OACzB;AACA,MAAA,MAAM,IAAA,GAAO,KAAK,EAAA,IAAM,IAAA;AACxB,MAAA,IAAI,SAAS,UAAA,EAAY;AACzB,MAAA,UAAA,GAAa,IAAA;AACb,MAAA,eAAA,CAAgB,MAAM,SAAS,CAAA;AAAA,IACjC,CAAA;AACA,IAAA,MAAM,UAAU,MAAY;AAC1B,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA,gBAAA,CAAiB,MAAM,SAAS,CAAA;AAAA,MAClC;AACA,MAAA,IAAI,eAAe,IAAA,EAAM;AACzB,MAAA,UAAA,GAAa,IAAA;AACb,MAAA,eAAA,CAAgB,MAAM,SAAS,CAAA;AAAA,IACjC,CAAA;AACA,IAAA,IAAA,CAAK,gBAAA,CAAiB,aAAa,MAAM,CAAA;AACzC,IAAA,IAAA,CAAK,gBAAA,CAAiB,cAAc,OAAO,CAAA;AAC3C,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,mBAAA,CAAoB,aAAa,MAAM,CAAA;AAC5C,MAAA,IAAA,CAAK,mBAAA,CAAoB,cAAc,OAAO,CAAA;AAAA,IAChD,CAAA;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,EAAmB,SAAA,EAAmB,MAAA,KAA8B;AAC1F,IAAA,MAAM,IAAA,GAAO,YAAY,IAAI,CAAA;AAC7B,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,KAAA,MAAW,KAAK,IAAA,CAAK,gBAAA,CAAiB,UAAU,CAAA,IAAK,MAAA,EAAO;AAC5D,IAAA,MAAM,MAAM,IAAA,CAAK,aAAA;AACjB,IAAA,MAAM,GAAA,GAAM,EAAA;AACZ,IAAA,MAAMC,KAAAA,GAAO,CAAA;AAEb,IAAA,MAAM,IAAA,GAAO,CACX,IAAA,EACA,CAAA,EACA,GACA,CAAA,EACA,CAAA,EACA,KAAA,EACA,OAAA,EACA,MAAA,KACS;AACT,MAAA,MAAM,CAAA,GAAI,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACjC,MAAA,CAAA,CAAE,SAAA,GAAY,oBAAoB,IAAI,CAAA,CAAA;AACtC,MAAA,CAAA,CAAE,YAAA,CAAa,2BAA2B,EAAE,CAAA;AAC5C,MAAA,CAAA,CAAE,QAAQ,YAAA,GAAe,MAAA;AACzB,MAAA,CAAA,CAAE,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA;AACnB,MAAA,CAAA,CAAE,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA;AAClB,MAAA,CAAA,CAAE,MAAM,KAAA,GAAQ,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAA,EAAA,CAAA;AACnC,MAAA,CAAA,CAAE,MAAM,MAAA,GAAS,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAA,EAAA,CAAA;AACpC,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,aAAA,CAAc,GAAG,CAAA;AAClC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,aAAA,CAAc,QAAQ,CAAA;AACtC,MAAA,GAAA,CAAI,IAAA,GAAO,QAAA;AACX,MAAA,GAAA,CAAI,KAAA,GAAQ,KAAA;AACZ,MAAA,GAAA,CAAI,YAAA,CAAa,cAAc,KAAK,CAAA;AACpC,MAAA,GAAA,CAAI,WAAA,GAAc,GAAA;AAClB,MAAA,GAAA,CAAI,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACnC,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,IAAA,CAAK,EAAE,MAAM,cAAA,EAAgB,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,EAAS,MAAA,EAAO,EAAG,CAAA;AAAA,MACxE,CAAC,CAAA;AACD,MAAA,CAAA,CAAE,MAAA,CAAO,MAAM,GAAG,CAAA;AAClB,MAAA,IAAA,CAAK,YAAY,CAAC,CAAA;AAAA,IACpB,CAAA;AAEA,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,UAAA,CAAW,MAAM,MAAM,CAAA;AACjD,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACvB,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,IAAA;AAGnC,IAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM;AACvB,MAAA,MAAM,KAAA,GAAQ,IAAI,OAAA,CAAQ,CAAC,GAAG,KAAA,CAAM,CAAC,GAAG,KAAA,CAAM,QAAA;AAC9C,MAAA,IAAI,MAAM,CAAA,EAAG;AACX,QAAA,IAAA;AAAA,UACE,GAAA;AAAA,UACA,OAAA,CAAQ,IAAA;AAAA,UACR,GAAA,CAAI,IAAA,CAAK,GAAA,GAAMA,KAAAA,GAAO,GAAA;AAAA,UACtB,EAAA;AAAA,UACA,GAAA;AAAA,UACA,cAAA;AAAA,UACA,KAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AACvB,QAAA,MAAM,CAAA,GAAA,CAAK,KAAK,IAAA,CAAK,MAAA,GAAS,IAAI,IAAA,CAAK,GAAA,IAAO,IAAI,GAAA,GAAM,CAAA;AACxD,QAAA,IAAA,CAAK,GAAA,EAAK,QAAQ,IAAA,EAAM,CAAA,EAAG,IAAI,GAAA,EAAK,cAAA,EAAgB,OAAO,YAAY,CAAA;AAAA,MACzE;AACA,MAAA,IAAI,CAAA,KAAM,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AACzB,QAAA,IAAA;AAAA,UACE,GAAA;AAAA,UACA,OAAA,CAAQ,IAAA;AAAA,UACR,GAAA,CAAI,KAAK,MAAA,GAASA,KAAAA;AAAA,UAClB,EAAA;AAAA,UACA,GAAA;AAAA,UACA,cAAA;AAAA,UACA,KAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,IAAA,CAAK,MAAA,GAAS,IAAI,IAAA,CAAK,GAAA;AACtC,MAAA,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM;AAC9B,QAAA,MAAM,EAAA,GAAK,GAAA,CAAI,KAAA,CAAM,CAAC,GAAG,KAAA,CAAM,QAAA;AAC/B,QAAA,IAAI,MAAM,CAAA,EAAG;AACX,UAAA,IAAA;AAAA,YACE,GAAA;AAAA,YACA,GAAA,CAAI,IAAA,CAAK,IAAA,GAAOA,KAAAA,GAAO,GAAA;AAAA,YACvB,IAAI,IAAA,CAAK,GAAA;AAAA,YACT,GAAA;AAAA,YACA,EAAA;AAAA,YACA,iBAAA;AAAA,YACA,EAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA;AAC9B,UAAA,MAAM,CAAA,GAAA,CAAK,KAAK,IAAA,CAAK,KAAA,GAAQ,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAI,GAAA,GAAM,CAAA;AACxD,UAAA,IAAA,CAAK,GAAA,EAAK,GAAG,GAAA,CAAI,IAAA,CAAK,KAAK,GAAA,EAAK,EAAA,EAAI,iBAAA,EAAmB,EAAA,EAAI,YAAY,CAAA;AAAA,QACzE;AACA,QAAA,IAAI,CAAA,KAAM,GAAA,CAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AAChC,UAAA,IAAA;AAAA,YACE,GAAA;AAAA,YACA,GAAA,CAAI,KAAK,KAAA,GAAQA,KAAAA;AAAA,YACjB,IAAI,IAAA,CAAK,GAAA;AAAA,YACT,GAAA;AAAA,YACA,EAAA;AAAA,YACA,iBAAA;AAAA,YACA,EAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAIA,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,KAAA,MAAW,GAAA,IAAO,IAAI,OAAA,EAAS;AAC7B,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,IAAA,CAAK,KAAA,GAAQ,IAAI,IAAA,CAAK,IAAA;AACpC,QAAA,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,EAAA,EAAI,CAAA,KAAM;AAC3B,UAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAC5B,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,MAAM,CAAA,GAAI,MAAA,CAAO,EAAA,CAAG,EAAE,CAAA;AACtB,YAAA,MAAM,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AACxB,YAAA,MAAM,KAAK,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,GAAA,IAAO,IAAI,GAAA,GAAM,CAAA;AACzC,YAAA,IAAA;AAAA,cACE,GAAA;AAAA,cACA,IAAI,IAAA,CAAK,IAAA;AAAA,cACT,CAAA;AAAA,cACA,CAAA;AAAA,cACA,GAAA;AAAA,cACA,gBAAA;AAAA,cACA,GAAG,KAAA,CAAM,QAAA;AAAA,cACT;AAAA,aACF;AAAA,UACF,CAAA,MAAA,IAAW,GAAA,CAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAK,GAAA,CAAI,IAAA,CAAK,MAAA,GAAS,GAAA,CAAI,IAAA,CAAK,MAAA,GAAS,GAAA,EAAK;AAC5E,YAAA,IAAA;AAAA,cACE,GAAA;AAAA,cACA,IAAI,IAAA,CAAK,IAAA;AAAA,cACT,GAAA,CAAI,KAAK,MAAA,GAASA,KAAAA;AAAA,cAClB,CAAA;AAAA,cACA,GAAA;AAAA,cACA,gBAAA;AAAA,cACA,GAAG,KAAA,CAAM,QAAA;AAAA,cACT;AAAA,aACF;AAAA,UACF;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAA;AAWA,EAAA,MAAM,eAAA,GAAkB,CAAC,IAAA,EAAmB,SAAA,KAAoC;AAC9E,IAAA,IAAI,MAAA,GAA0C,IAAA;AAC9C,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAwB;AACtC,MAAA,MAAA,GAAS,EAAE,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,CAAA,EAAG,EAAE,OAAA,EAAQ;AAAA,IACxC,CAAA;AACA,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAwB;AACvC,MAAA,MAAM,IAAA,GAAO,EAAE,YAAA,EAAa;AAC5B,MAAA,IACE,IAAA,CAAK,IAAA;AAAA,QACH,CAAC,MACC,CAAA,YAAa,OAAA,KACZ,EAAE,SAAA,CAAU,QAAA,CAAS,mBAAmB,CAAA,IACvC,CAAA,CAAE,SAAA,CAAU,SAAS,iBAAiB,CAAA,IACtC,EAAE,SAAA,CAAU,QAAA,CAAS,kBAAkB,CAAA,IACvC,CAAA,CAAE,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA;AAAA,OACpC,EACA;AACA,QAAA;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,YAAa,OAAA,IAAW,CAAA,CAAE,SAAA,CAAU,QAAA,CAAS,UAAU,CAAC,CAAA;AACxF,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,IAAI,MAAA,IAAU,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAA,EAAG,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA,EAAG;AAC1E,MAAA,MAAM,UAAU,IAAA,CAAK,IAAA;AAAA,QACnB,CAAC,CAAA,KAAwB,CAAA,YAAa,eAAe,CAAC,CAAC,EAAE,OAAA,CAAQ;AAAA,OACnE;AACA,MAAA,IAAI,OAAA,EAAS;AAEX,QAAA,IAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,YAAa,WAAW,CAAA,CAAE,OAAA,CAAQ,WAAW,CAAC,CAAA,EAAG;AACpE,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,QACpB;AACA,QAAA,eAAA,GAAkB,OAAA,CAAQ,QAAQ,UAAA,IAAc,IAAA;AAChD,QAAA,mBAAA,CAAoB,MAAM,SAAS,CAAA;AACnC,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,IAAA,CAAK,EAAE,MAAM,eAAA,EAAiB,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,EAAS,eAAA,EAAgB,EAAG,CAAA;AAAA,QAClF;AACA,QAAA;AAAA,MACF;AACA,MAAA,MAAM,cAAc,IAAA,CAAK,IAAA;AAAA,QACvB,CAAC,CAAA,KACC,CAAA,YAAa,OAAA,IACb,CAAA,CAAE,QAAQ,8DAA8D;AAAA,OAC5E;AACA,MAAA,IAAI,WAAA,EAAa;AACjB,MAAA,eAAA,GAAkB,IAAA;AAClB,MAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,MAAA,eAAA,CAAgB,MAAM,SAAS,CAAA;AAC/B,MAAA,IAAA,CAAK,EAAE,IAAA,EAAM,cAAA,EAAgB,SAAS,EAAE,SAAA,IAAa,CAAA;AAAA,IACvD,CAAA;AACA,IAAA,IAAA,CAAK,gBAAA,CAAiB,WAAA,EAAa,MAAA,EAAQ,IAAI,CAAA;AAC/C,IAAA,IAAA,CAAK,gBAAA,CAAiB,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AAC5C,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,mBAAA,CAAoB,WAAA,EAAa,MAAA,EAAQ,IAAI,CAAA;AAClD,MAAA,IAAA,CAAK,mBAAA,CAAoB,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AAAA,IACjD,CAAA;AAAA,EACF,CAAA;AAcA,EAAA,MAAM,cAAA,GAAiB,CAAC,SAAA,EAAmB,OAAA,KAA2C;AACpF,IAAA,MAAM,QAAQ,KAAA,CAAM,IAAA;AAAA,MAClB,SAAS,gBAAA,CAA8B,CAAA,CAAA,EAAI,cAAc,CAAA,EAAA,EAAK,OAAO,CAAA,EAAA,CAAI;AAAA,KAC3E;AACA,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,IAAA,MAAM,GAAA,GAAM,QAAA;AACZ,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACnC,IAAA,GAAA,CAAI,YAAA,CAAa,2BAA2B,EAAE,CAAA;AAC9C,IAAA,GAAA,CAAI,MAAM,OAAA,GAAU,kEAAA;AACpB,IAAA,GAAA,CAAI,MAAM,OAAA,GAAU,MAAA;AACpB,IAAA,MAAM,SAAS,GAAA,CAAI,YAAA,CAAa,EAAE,IAAA,EAAM,QAAQ,CAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,aAAA,CAAc,OAAO,CAAA;AACvC,IAAA,KAAA,CAAM,WAAA,GAAc,YAAA;AACpB,IAAA,MAAA,CAAO,YAAY,KAAK,CAAA;AACxB,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACrC,IAAA,KAAA,CAAM,SAAA,GAAY,iBAAA;AAClB,IAAA,KAAA,CAAM,MAAM,QAAA,GAAW,OAAA;AACvB,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACnC,IAAA,GAAA,CAAI,SAAA,GAAY,mBAAA;AAChB,IAAA,GAAA,CAAI,MAAM,QAAA,GAAW,OAAA;AACrB,IAAA,MAAM,KAAK,CAAC,MAAA,EAA4B,KAAA,EAAe,IAAA,EAAc,UAAU,IAAA,KAAe;AAC5F,MAAA,MAAM,CAAA,GAAI,GAAA,CAAI,aAAA,CAAc,QAAQ,CAAA;AACpC,MAAA,CAAA,CAAE,IAAA,GAAO,QAAA;AACT,MAAA,CAAA,CAAE,KAAA,GAAQ,KAAA;AACV,MAAA,CAAA,CAAE,YAAA,CAAa,cAAc,KAAK,CAAA;AAClC,MAAA,CAAA,CAAE,SAAA,GAAY,qBAAqB,MAAM,CAAA,CAAA;AACzC,MAAA,CAAA,CAAE,SAAA,GAAY,IAAA;AACd,MAAA,CAAA,CAAE,WAAW,CAAC,OAAA;AACd,MAAA,CAAA,CAAE,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACjC,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,IAAA,CAAK,EAAE,MAAM,cAAA,EAAgB,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,EAAS,MAAA,EAAO,EAAG,CAAA;AAAA,MACxE,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,YAAY,CAAC,CAAA;AAAA,IACnB,CAAA;AACA,IAAA,EAAA,CAAG,MAAA,EAAQ,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAChC,IAAA,EAAA,CAAG,WAAA,EAAa,UAAA,EAAY,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAC5C,IAAA,EAAA,CAAG,QAAA,EAAU,UAAA,EAAY,IAAA,CAAK,KAAK,CAAA;AACnC,IAAA,EAAA,CAAG,WAAA,EAAa,sBAAA,EAAwB,SAAA,CAAU,IAAA,EAAM,KAAK,CAAA;AAC7D,IAAA,EAAA,CAAG,YAAA,EAAc,oBAAA,EAAsB,SAAA,CAAU,KAAA,EAAO,KAAK,CAAA;AAC7D,IAAA,KAAA,CAAM,MAAM,OAAA,GAAU,MAAA;AACtB,IAAA,GAAA,CAAI,MAAM,OAAA,GAAU,MAAA;AAGpB,IAAA,MAAM,GAAA,GAAM,EAAA;AACZ,IAAA,MAAMA,KAAAA,GAAO,CAAA;AACb,IAAA,MAAM,GAAA,GAAM,CAAC,IAAA,EAAiB,KAAA,EAAe,MAAA,KAA2C;AACtF,MAAA,MAAM,CAAA,GAAI,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACjC,MAAA,CAAA,CAAE,SAAA,GAAY,oBAAoB,IAAI,CAAA,CAAA;AACtC,MAAA,CAAA,CAAE,MAAM,QAAA,GAAW,OAAA;AACnB,MAAA,CAAA,CAAE,QAAQ,YAAA,GAAe,MAAA;AACzB,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,aAAA,CAAc,GAAG,CAAA;AAClC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,aAAA,CAAc,QAAQ,CAAA;AACtC,MAAA,GAAA,CAAI,IAAA,GAAO,QAAA;AACX,MAAA,GAAA,CAAI,KAAA,GAAQ,KAAA;AACZ,MAAA,GAAA,CAAI,YAAA,CAAa,cAAc,KAAK,CAAA;AACpC,MAAA,GAAA,CAAI,WAAA,GAAc,GAAA;AAClB,MAAA,GAAA,CAAI,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACnC,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,IAAA,CAAK,EAAE,MAAM,cAAA,EAAgB,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,EAAS,MAAA,EAAO,EAAG,CAAA;AAAA,MACxE,CAAC,CAAA;AACD,MAAA,CAAA,CAAE,MAAA,CAAO,MAAM,GAAG,CAAA;AAClB,MAAA,OAAO,CAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,cAAA,EAAgB,YAAY,CAAA;AAAA,MAC1C,MAAA,EAAQ,GAAA,CAAI,GAAA,EAAK,cAAA,EAAgB,WAAW,CAAA;AAAA,MAC5C,IAAA,EAAM,GAAA,CAAI,GAAA,EAAK,iBAAA,EAAmB,YAAY,CAAA;AAAA,MAC9C,KAAA,EAAO,GAAA,CAAI,GAAA,EAAK,iBAAA,EAAmB,WAAW;AAAA,KAChD;AACA,IAAA,MAAA,CAAO,MAAA,CAAO,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,KAAK,MAAA,EAAQ,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,KAAK,CAAA;AACtE,IAAA,GAAA,CAAI,IAAA,CAAK,YAAY,GAAG,CAAA;AACxB,IAAA,GAAA,CAAI,MAAM,OAAA,GAAU,EAAA;AAEpB,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,MAAM,QAAQ,CAACN,GAAAA,EAAiB,CAAA,EAAW,CAAA,EAAW,GAAW,CAAA,KAAoB;AACnF,MAAAA,GAAAA,CAAG,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA;AACpB,MAAAA,GAAAA,CAAG,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA;AACnB,MAAAA,GAAAA,CAAG,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA;AACrB,MAAAA,GAAAA,CAAG,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA;AAAA,IACxB,CAAA;AACA,IAAA,MAAM,aAAa,MAAY;AAC7B,MAAA,MAAM,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAC9C,MAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACvB,MAAA,IAAI,IAAI,MAAA,CAAO,iBAAA;AACf,MAAA,IAAI,IAAI,MAAA,CAAO,iBAAA;AACf,MAAA,IAAI,IAAI,MAAA,CAAO,iBAAA;AACf,MAAA,IAAI,IAAI,MAAA,CAAO,iBAAA;AACf,MAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,QAAA,MAAM,EAAA,GAAK,EAAE,qBAAA,EAAsB;AACnC,QAAA,IAAI,EAAA,CAAG,KAAA,KAAU,CAAA,IAAK,EAAA,CAAG,WAAW,CAAA,EAAG;AACvC,QAAA,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,EAAA,CAAG,IAAI,CAAA;AACvB,QAAA,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,EAAA,CAAG,GAAG,CAAA;AACtB,QAAA,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,EAAA,CAAG,KAAK,CAAA;AACxB,QAAA,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,EAAA,CAAG,MAAM,CAAA;AAAA,MAC3B;AACA,MAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG;AACzB,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EAAG,CAAA,GAAIM,QAAO,GAAA,EAAK,CAAA,GAAI,GAAG,GAAG,CAAA;AAC7C,MAAA,KAAA,CAAM,KAAK,MAAA,EAAQ,CAAA,EAAG,IAAIA,KAAAA,EAAM,CAAA,GAAI,GAAG,GAAG,CAAA;AAC1C,MAAA,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,GAAIA,KAAAA,GAAO,KAAK,CAAA,EAAG,GAAA,EAAK,IAAI,CAAC,CAAA;AAC9C,MAAA,KAAA,CAAM,KAAK,KAAA,EAAO,CAAA,GAAIA,OAAM,CAAA,EAAG,GAAA,EAAK,IAAI,CAAC,CAAA;AACzC,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,KAAA,CAAM,OAAO,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAC/B,MAAA,MAAM,EAAA,GAAK,IAAI,YAAA,IAAgB,SAAA;AAC/B,MAAA,MAAM,KAAK,GAAA,CAAI,WAAA;AACf,MAAA,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,GAAI,EAAE,CAAC,CAAA,EAAA,CAAA;AACvC,MAAA,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,GAAI,EAAA,GAAK,CAAC,CAAC,CAAA,EAAA,CAAA;AAAA,IAC5C,CAAA;AACA,IAAA,MAAM,MAAA,GAAS,CAAC,EAAA,KAA4B;AAC1C,MAAA,OAAA,GAAU,EAAA,KAAO,OAAA;AACjB,MAAA,KAAA,CAAM,KAAA,CAAM,OAAA,GAAU,OAAA,GAAU,EAAA,GAAK,MAAA;AACrC,MAAA,GAAA,CAAI,KAAA,CAAM,OAAA,GAAU,OAAA,GAAU,EAAA,GAAK,MAAA;AACnC,MAAA,UAAA,EAAW;AAAA,IACb,CAAA;AACA,IAAA,UAAA,EAAW;AACX,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAwB;AACvC,MAAA,MAAM,IAAA,GAAO,EAAE,YAAA,EAAa;AAC5B,MAAA,IAAI,CAAC,MAAM,IAAA,CAAK,CAAC,MAAM,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AAE1C,MAAA,IAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,YAAa,WAAW,CAAA,CAAE,OAAA,CAAQ,WAAW,CAAC,CAAA,EAAG;AACpE,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,MACpB;AACA,MAAA,eAAA,GAAkB,OAAA;AAClB,MAAA,MAAA,CAAO,OAAO,CAAA;AACd,MAAA,IAAA,CAAK,EAAE,MAAM,eAAA,EAAiB,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,IAAW,CAAA;AAAA,IACjE,CAAA;AACA,IAAA,GAAA,CAAI,gBAAA,CAAiB,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AAC3C,IAAA,MAAA,CAAO,gBAAA,CAAiB,QAAA,EAAU,UAAA,EAAY,IAAI,CAAA;AAClD,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,UAAU,CAAA;AAC5C,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,QAAQ,MAAM;AACZ,QAAA,GAAA,CAAI,mBAAA,CAAoB,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AAC9C,QAAA,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,UAAA,EAAY,IAAI,CAAA;AACrD,QAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,UAAU,CAAA;AAC/C,QAAA,GAAA,CAAI,MAAA,EAAO;AAAA,MACb;AAAA,KACF;AAAA,EACF,CAAA;AAMA,EAAA,MAAM,iBAAA,GAAoB,CAAC,GAAA,KAA4D;AAMrF,IAAA,MAAM,OAAA,GAAU,CAAC,GAAA,CAAI,YAAA;AACrB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,oBAAA,EAAqB;AACrB,MAAA,kBAAA,EAAmB;AACnB,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,gBAAA,GAAmB,KAAA;AAAA,IACrB;AACA,IAAA,WAAA,GAAc,UAAU,EAAE,GAAG,GAAA,EAAK,YAAA,EAAc,MAAK,GAAI,GAAA;AACzD,IAAA,IAAI,CAAC,kBAAA,CAAmB,GAAG,CAAA,EAAG;AAC5B,MAAA,kBAAA,EAAmB;AACnB,MAAA,eAAA,EAAgB;AAChB,MAAA,iBAAA,CAAkB;AAAA,QAChB,KAAA,EAAO,eAAA;AAAA,QACP,OAAA,EAAS,WAAA,CAAY,GAAG,CAAA,EAAG,cAAc,OAAA,IAAW;AAAA,OACrD,CAAA;AACD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,KAAA,CAAM,eAAA,EAAiB,OAAA;AAC3C,IAAA,IAAI,CAAC,OAAA,IAAW,WAAA,IAAe,WAAW,CAAC,eAAA,CAAgB,OAAO,CAAA,EAAG;AACnE,MAAA,kBAAA,EAAmB;AACnB,MAAA,eAAA,EAAgB;AAChB,MAAA,iBAAA,CAAkB,EAAE,KAAA,EAAO,iBAAA,EAAmB,OAAA,EAA0C,CAAA;AACxF,MAAA;AAAA,IACF;AACA,IAAA,YAAA,CAAa,WAAW,CAAA;AAAA,EAC1B,CAAA;AAEA,EAAA,MAAM,uBAAuB,MAAY;AACvC,IAAA,cAAA,IAAiB;AACjB,IAAA,cAAA,GAAiB,IAAA;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,qBAAqB,MAAY;AACrC,IAAA,IAAI,YAAA,eAA2B,YAAY,CAAA;AAC3C,IAAA,YAAA,GAAe,IAAA;AAAA,EACjB,CAAA;AAMA,EAAA,MAAM,iBAAA,GAAoB,CAAC,QAAA,EAAkB,OAAA,KAA2C;AACtF,IAAA,oBAAA,EAAqB;AACrB,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAmB;AACjC,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,IAAI,EAAE,kBAAkB,OAAA,CAAA,EAAU;AAClC,MAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,sEAAsE,CAAA,EAAG;AAC1F,QAAA;AAAA,MACF;AACA,MAAA,IAAI;AACF,QAAA,IAAI,CAAC,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAAA,MACjC,CAAA,CAAA,MAAQ;AACN,QAAA;AAAA,MACF;AACA,MAAA,oBAAA,EAAqB;AACrB,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,gBAAA,GAAmB,KAAA;AACnB,MAAA,IAAI,WAAA,oBAA+B,WAAW,CAAA;AAAA,IAChD,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,MAAA,EAAQ,IAAI,CAAA;AAC/C,IAAA,IAAI,YAAY,UAAA,EAAY,QAAA,CAAS,gBAAA,CAAiB,WAAA,EAAa,QAAQ,IAAI,CAAA;AAC/E,IAAA,cAAA,GAAiB,MAAM;AACrB,MAAA,QAAA,CAAS,mBAAA,CAAoB,OAAA,EAAS,MAAA,EAAQ,IAAI,CAAA;AAClD,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,MAAA,EAAQ,IAAI,CAAA;AAAA,IACxD,CAAA;AACA,IAAA,iBAAA,CAAkB,EAAE,KAAA,EAAO,iBAAA,EAAmB,OAAA,EAAS,UAAU,CAAA;AAAA,EACnE,CAAA;AAOA,EAAA,MAAM,eAAA,GAAkB,CAAC,OAAA,KAA0B;AACjD,IAAA,kBAAA,EAAmB;AACnB,IAAA,YAAA,GAAe,WAAW,MAAM;AAC9B,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,IAAI,WAAA,oBAA+B,WAAW,CAAA;AAAA,IAChD,GAAG,OAAO,CAAA;AACV,IAAA,iBAAA,CAAkB,EAAE,KAAA,EAAO,eAAA,EAAiB,OAAA,EAAS,CAAA;AAAA,EACvD,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,GAAA,KAA4D;AAIhF,IAAA,IAAI,IAAI,QAAA,IAAY,CAAC,WAAA,IAAe,eAAA,CAAgB,GAAG,CAAA,EAAG;AACxD,MAAA,gBAAA,GAAmB,GAAA,CAAI,MAAM,cAAA,IAAkB,CAAA;AAC/C,MAAA;AAAA,IACF;AACA,IAAA,kBAAA,EAAmB;AACnB,IAAA,gBAAA,GAAmB,GAAA,CAAI,MAAM,cAAA,IAAkB,CAAA;AAI/C,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,eAAA;AACxB,IAAA,MAAM,OAAO,KAAA,EAAO,OAAA;AACpB,IAAA,MAAM,GAAA,GAAM,KAAA,EAAO,QAAA,EAAU,IAAA,EAAK;AAKlC,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,YAAA,IAAgB,CAAC,YAAA,IAAgB,WAAA;AAIlD,IAAA,MAAM,cAAA,GAAA,CACH,SAAS,UAAA,IAAc,IAAA,KAAS,gBAChC,CAAC,qBAAA,CAAsB,KAAK,CAAA,IAAK,gBAAA,CAAA;AACpC,IAAA,IAAI,IAAA,IAAQ,kBAAkB,GAAA,EAAK;AACjC,MAAA,kBAAA,EAAmB;AACnB,MAAA,iBAAA,EAAkB;AAClB,MAAA,iBAAA,CAAkB,KAAK,IAAI,CAAA;AAC3B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,kBAAkB,KAAK,CAAA;AACvC,IAAA,IAAI,IAAA,IAAQ,UAAU,CAAA,EAAG;AACvB,MAAA,oBAAA,EAAqB;AACrB,MAAA,iBAAA,EAAkB;AAElB,MAAA,IAAI,CAAC,YAAA,EAAc,eAAA,CAAgB,OAAO,CAAA;AAC1C,MAAA;AAAA,IACF;AACA,IAAA,oBAAA,EAAqB;AACrB,IAAA,kBAAA,EAAmB;AACnB,IAAA,MAAM,gBAAgB,sBAAA,EAAuB;AAC7C,IAAA,MAAM,SAAS,YAAA,CAAa;AAAA,MAC1B,GAAG,GAAA,CAAI,KAAA;AAAA,MACP,GAAI,aAAA,GAAgB,EAAE,aAAA,KAAkB,EAAC;AAAA,MACzC,UAAU,MAAM;AAEd,QAAA,kBAAA,EAAmB;AACnB,QAAA,YAAA,GAAe,IAAA;AACf,QAAA,YAAA,GAAe,KAAA;AACf,QAAA,gBAAA,GAAmB,IAAA;AAKnB,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,MAAM,CAAA,GAAI,aAAa,KAAA,CAAM,eAAA;AAC7B,UAAA,MAAM,IAAI,CAAA,EAAG,OAAA;AACb,UAAA,MAAM,QAAA,GAAW,CAAA,EAAG,QAAA,EAAU,IAAA,EAAK;AACnC,UAAA,IAAA,CAAK,MAAM,UAAA,IAAc,CAAA,KAAM,eAAe,QAAA,EAAU,iBAAA,CAAkB,UAAU,CAAC,CAAA;AAAA,QACvF;AAAA,MACF;AAAA,KACD,CAAA;AACD,IAAA,IAAI,IAAI,YAAA,EAAc,iBAAA,CAAkB,EAAE,KAAA,EAAO,SAAS,CAAA;AAE1D,IAAA,IAAI,CAAC,GAAA,CAAI,QAAA,IAAY,WAAA,EAAa;AAClC,IAAA,KAAK,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,CAAC,MAAA,KAAW;AACjC,MAAA,IAAI,CAAC,OAAO,QAAA,EAAU;AACtB,MAAA,MAAM,IAAA,GAAO,OAAO,IAAA,EAAK;AACzB,MAAA,IAAI,CAAC,IAAA,EAAM;AAGT,QAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,cAAA,IAAkB,CAAA;AACxC,QAAA,MAAM,OAAQ,GAAA,CAAI,KAAA,CAAM,WAA0C,GAAG,CAAA,EAAG,SAAS,CAAC,CAAA;AAClF,QAAA,IAAI,IAAA,EAAM,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,QAAA,EAAU;AAC1C,UAAA,QAAA,GAAW,cAAA,CAAe,GAAA,EAAK,IAAA,CAAK,QAAQ,CAAA;AAC5C,UAAA,QAAA,EAAU,OAAO,eAAe,CAAA;AAAA,QAClC;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,SAAA,CAAU,IAAI,aAAa,CAAA;AAChC,MAAA,YAAA,GAAe,GAAA;AACf,MAAA,SAAA,GAAY,eAAA,CAAgB,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,kBAAkB,CAAC,CAAA;AAC/D,MAAA,MAAM,UAAA,GACH,GAAA,CAAI,KAAA,CAAM,UAAA,CAA0C,GAAA,CAAI,MAAM,cAAA,IAAkB,CAAC,CAAA,EAC9E,MAAA,IAAU,EAAC;AACjB,MAAA,aAAA,GAAgB,UAAA;AAChB,MAAA,mBAAA,CAAoB,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,cAAA,IAAkB,CAAC,CAAA;AACvD,MAAA,cAAA,CAAe,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,cAAA,IAAkB,GAAG,UAAU,CAAA;AAC9D,MAAA,QAAA,GAAW,cAAA,CAAe,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,kBAAkB,CAAC,CAAA;AAC7D,MAAA,WAAA,GAAc,uBAAA,CAAwB;AAAA,QACpC,IAAA;AAAA,QACA,SAAA,EAAW,IAAI,KAAA,CAAM,SAAA;AAAA,QACrB,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,cAAA,IAAkB,CAAA;AAAA,QACvC,QAAA,EAAU,CAAC,OAAA,KAAY,IAAA,CAAK,EAAE,IAAA,EAAM,gBAAA,EAAkB,SAAS,CAAA;AAAA,QAC/D,cAAc,MAAM;AAClB,UAAA,IAAI,CAAC,cAAA,EAAgB;AACrB,UAAA,MAAM,MAAA,GAAS,cAAA;AACf,UAAA,cAAA,GAAiB,IAAA;AACjB,UAAA,iBAAA,CAAkB,MAAM,CAAA;AAAA,QAC1B;AAAA,OACD,CAAA;AAED,MAAA,UAAA,GAAa,qBAAA,CAAsB;AAAA,QACjC,IAAA;AAAA,QACA,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,cAAA,IAAkB,CAAA;AAAA,QACvC,MAAA,EAAQ,CAAC,OAAA,KAAY,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,SAAS;AAAA,OAC7D,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,gBAAgB,MAAY;AAChC,IAAA,SAAA,EAAW,MAAA,EAAO;AAClB,IAAA,SAAA,GAAY,IAAA;AAAA,EACd,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,EAAW,CAAA,EAAW,KAAA,KAAwB;AACnE,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,SAAA,GAAY,QAAA,CAAS,cAAc,KAAK,CAAA;AACxC,MAAA,SAAA,CAAU,MAAM,OAAA,GACd,6OAAA;AAGF,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,SAAS,CAAA;AAAA,IACrC;AACA,IAAA,SAAA,CAAU,WAAA,GAAc,KAAA;AACxB,IAAA,SAAA,CAAU,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,CAAA,GAAI,EAAE,CAAA,EAAA,CAAA;AAChC,IAAA,SAAA,CAAU,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,CAAA,GAAI,EAAE,CAAA,EAAA,CAAA;AAAA,EACjC,CAAA;AAMA,EAAA,MAAM,eAAA,GAAkB,CAAC,GAAA,KAA+D;AACtF,IAAA,MAAM,IAAA,GAAO,OAAO,SAAA,EAAU;AAC9B,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,UAAA,EAAY;AACxB,MAAA,IAAI,GAAA,CAAI,KAAA,KAAU,MAAA,EAAQ,aAAA,EAAc;AACxC,MAAA,UAAA,EAAY,WAAA,EAAY;AACxB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,GAAO,GAAA,CAAI,CAAA;AAC1B,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAA;AACzB,IAAA,IAAI,GAAA,CAAI,UAAU,MAAA,EAAQ;AACxB,MAAA,aAAA,CAAc,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,KAAA,IAAS,IAAI,SAAS,CAAA;AAC9C,MAAA,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAC,CAAA;AACvB,MAAA;AAAA,IACF;AACA,IAAA,aAAA,EAAc;AACd,IAAA,IAAI,GAAA,CAAI,UAAU,QAAA,EAAU;AAC1B,MAAA,UAAA,CAAW,WAAA,EAAY;AACvB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA;AACrC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,CAAK;AAAA,QACH,IAAA,EAAM,eAAA;AAAA,QACN,OAAA,EAAS,EAAE,SAAA,EAAW,gBAAA,EAAkB,WAAW,GAAA,CAAI,SAAA,EAAW,GAAG,MAAA;AAAO,OAC7E,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,GAAA,KAA8B;AACnD,IAAA,QAAQ,IAAI,IAAA;AAAM,MAChB,KAAK,aAAA;AAGH,QAAA,IAAA,CAAK,MAAA,GAAS,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,MAAK,GAAI,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AACjE,QAAA;AAAA,MACF,KAAK,cAAA;AACH,QAAA,MAAA,EAAQ,QAAA,CAAS,IAAI,KAAK,CAAA;AAC1B,QAAA,IAAI,YAAA,KAAiB,GAAA,CAAI,KAAA,CAAM,OAAA,EAAS;AACtC,UAAA,YAAA,GAAe,IAAI,KAAA,CAAM,OAAA;AAEzB,UAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAA2B,kBAAkB,CAAA;AAChE,UAAA,IAAI,KAAK,SAAA,IAAa,CAAC,WAAA,EAAa,gBAAA,CAAiB,GAAG,gBAAgB,CAAA;AAAA,QAC1E;AACA,QAAA,KAAA,EAAO,QAAA;AAAA,UACL,IAAI,KAAA,CAAM,UAAA,KACP,GAAA,CAAI,KAAA,CAAM,YAAY,YAAA,GACnB,0BAAA,GACA,GAAA,CAAI,KAAA,CAAM,YAAY,OAAA,GACpB,kBAAA,GACA,IAAI,KAAA,CAAM,OAAA,KAAY,WACpB,+BAAA,GACA,GAAA,CAAI,KAAA,CAAM,OAAA,KAAY,QACpB,aAAA,GACA,GAAA,CAAI,KAAA,CAAM,UAAA,GACR,eAAY,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA,CAAA,GAC/B,IAAI,KAAA,CAAM,KAAA,CAAM,IAAI,KAAA,CAAM,UAAU,GAAG,KAAA,IAAS,MAAA;AAAA,SACjE;AACA,QAAA;AAAA,MACF,KAAK,kBAAA;AACH,QAAA,KAAA,EAAO,UAAA,CAAW,IAAI,OAAO,CAAA;AAC7B,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,KAAA,EAAO,OAAA,CAAQ,IAAI,IAAI,CAAA;AACvB,QAAA;AAAA,MACF,KAAK,cAAA,EAAgB;AACnB,QAAA,MAAA,EAAQ,IAAA,EAAK;AAGb,QAAA,MAAM,aAAA,GAAgB,KAAA,EAAO,SAAA,EAAU,IAAK,KAAA;AAC5C,QAAA,IAAI,aAAA,EAAe,KAAA,EAAO,UAAA,CAAW,KAAK,CAAA;AAC1C,QAAA,MAAA,EAAQ,UAAU,IAAI,CAAA;AAGtB,QAAA,MAAM,gBAAA,GAAmB,WAAA;AACzB,QAAA,IAAI,gBAAA,EAAkB;AACpB,UAAA,kBAAA,EAAmB;AACnB,UAAA,iBAAA,EAAkB;AAAA,QACpB;AACA,QAAA,MAAM,eAAe,MAAY;AAC/B,UAAA,MAAA,EAAQ,UAAU,KAAK,CAAA;AACvB,UAAA,IAAI,aAAA,EAAe,KAAA,EAAO,UAAA,CAAW,IAAI,CAAA;AACzC,UAAA,IAAI,gBAAA,IAAoB,gBAAgB,gBAAA,EAAkB;AACxD,YAAA,iBAAA,CAAkB,gBAAgB,CAAA;AAAA,UACpC;AAAA,QACF,CAAA;AACA,QAAA,MAAA,GAAS,kBAAA,CAAmB;AAAA,UAC1B,MAAA,EAAQ,CAAC,OAAA,KAAY;AACnB,YAAA,MAAA,GAAS,IAAA;AACT,YAAA,YAAA,EAAa;AACb,YAAA,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,CAAA;AAAA,UAClC,CAAA;AAAA,UACA,UAAU,MAAM;AACd,YAAA,MAAA,GAAS,IAAA;AACT,YAAA,YAAA,EAAa;AACb,YAAA,IAAA,CAAK,EAAE,IAAA,EAAM,gBAAA,EAAkB,CAAA;AAAA,UACjC,CAAA;AAAA,UACA,GAAI,IAAI,YAAA,KAAiB,MAAA,GAAY,EAAE,YAAA,EAAc,GAAA,CAAI,YAAA,EAAa,GAAI,EAAC;AAAA,UAC3E,GAAI,IAAI,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAK,GAAI,EAAC;AAAA,UACnD,GAAI,IAAI,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAK,GAAI;AAAC,SACpD,CAAA;AACD,QAAA;AAAA,MACF;AAAA,MACA,KAAK,aAAA;AACH,QAAA,MAAA,EAAQ,IAAA,EAAK;AACb,QAAA,MAAA,GAAS,IAAA;AACT,QAAA,MAAA,EAAQ,UAAU,KAAK,CAAA;AACvB,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,IAAA,CAAK,EAAE,MAAM,WAAA,EAAa,OAAA,EAAS,SAAS,GAAA,CAAI,SAAS,GAAG,CAAA;AAC5D,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,YAAA,CAAa,IAAI,QAAQ,CAAA;AACzB,QAAA;AAAA,MACF,KAAK,mBAAA;AACH,QAAA,gBAAA,CAAiB,IAAI,OAAO,CAAA;AAC5B,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,IAAI,CAAC,IAAI,KAAA,EAAO;AAGhB,QAAA,IAAI,WAAA,EAAa,UAAA,EAAW,EAAG,cAAA,GAAiB,GAAA;AAAA,+BACzB,GAAG,CAAA;AAC1B,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,eAAA,CAAgB,GAAG,CAAA;AACnB,QAAA;AAAA,MACF,KAAK,cAAA,EAAgB;AACnB,QAAA,eAAA,GAAkB,GAAA,CAAI,OAAA;AACtB,QAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAA2B,kBAAkB,CAAA;AAChE,QAAA,IAAI,CAAA,IAAK,CAAC,WAAA,EAAa,mBAAA,CAAoB,GAAG,gBAAgB,CAAA;AAC9D,QAAA,IAAI,CAAC,WAAA,EAAa,QAAA,EAAU,MAAA,CAAO,IAAI,OAAO,CAAA;AAC9C,QAAA;AAAA,MACF;AAAA,MACA,KAAK,YAAA,EAAc;AACjB,QAAA,aAAA,GAAgB,GAAA,CAAI,OAAA;AACpB,QAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAA2B,kBAAkB,CAAA;AAChE,QAAA,IAAI,CAAA,IAAK,CAAC,WAAA,EAAa,eAAA,CAAgB,GAAG,gBAAgB,CAAA;AAC1D,QAAA;AAAA,MACF;AAAA,MACA,KAAK,eAAA;AACH,QAAA,kBAAA,EAAmB;AACnB,QAAA,aAAA,EAAc;AACd,QAAA,cAAA,GAAiB,IAAA;AACjB,QAAA,WAAA,GAAc,IAAA;AACd,QAAA,oBAAA,EAAqB;AACrB,QAAA,kBAAA,EAAmB;AACnB,QAAA,YAAA,GAAe,KAAA;AACf,QAAA,gBAAA,GAAmB,KAAA;AACnB,QAAA,iBAAA,EAAkB;AAClB,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,QAAA,EAAS;AACT,QAAA;AAAA;AACJ,EACF,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAA8B;AAC/C,IAAA,IAAI,KAAA,CAAM,WAAW,eAAA,EAAiB;AACtC,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,WAAW,kBAAA,IAAsB,IAAA,CAAK,UAAU,KAAA,EAAO;AACzE,IAAA,aAAA,CAAc,IAAsB,CAAA;AAAA,EACtC,CAAA;AAEA,EAAA,MAAM,aAAa,MAAY,IAAA,CAAK,EAAE,IAAA,EAAM,UAAU,CAAA;AAItD,EAAA,MAAM,QAAQ,MAAY;AACxB,IAAA,IAAI,eAAe,CAAC,WAAA,EAAa,UAAA,EAAW,oBAAqB,WAAW,CAAA;AAAA,EAC9E,CAAA;AACA,EAAA,MAAM,QAAA,GAAW,OAAO,OAAA,CAAQ,SAAA;AAChC,EAAA,MAAM,WAAA,GAAc,OAAO,OAAA,CAAQ,YAAA;AACnC,EAAA,MAAM,oBAAoB,MAAY;AACpC,IAAA,MAAA,CAAO,OAAA,CAAQ,SAAA,GAAY,SAAS,SAAA,CAAA,GAA4B,IAAA,EAAM;AACpE,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,IAAwC,CAAA;AACvE,MAAA,KAAA,EAAM;AACN,MAAA,OAAO,CAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAA,CAAO,OAAA,CAAQ,YAAA,GAAe,SAAS,YAAA,CAAA,GAA+B,IAAA,EAAM;AAC1E,MAAA,MAAM,CAAA,GAAI,WAAA,CAAY,KAAA,CAAM,IAAA,EAAM,IAA2C,CAAA;AAC7E,MAAA,KAAA,EAAM;AACN,MAAA,OAAO,CAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,KAAK,CAAA;AACzC,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,KAAK,CAAA;AAAA,EAC7C,CAAA;AACA,EAAA,MAAM,mBAAmB,MAAY;AACnC,IAAA,MAAA,CAAO,QAAQ,SAAA,GAAY,QAAA;AAC3B,IAAA,MAAA,CAAO,QAAQ,YAAA,GAAe,WAAA;AAC9B,IAAA,MAAA,CAAO,mBAAA,CAAoB,YAAY,KAAK,CAAA;AAC5C,IAAA,MAAA,CAAO,mBAAA,CAAoB,cAAc,KAAK,CAAA;AAAA,EAChD,CAAA;AAEA,EAAA,MAAM,WAAW,MAAY;AAC3B,IAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAC/C,IAAA,MAAA,CAAO,mBAAA,CAAoB,YAAY,UAAU,CAAA;AACjD,IAAA,gBAAA,EAAiB;AACjB,IAAA,MAAA,EAAQ,IAAA,EAAK;AACb,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,kBAAA,EAAmB;AACnB,IAAA,aAAA,EAAc;AACd,IAAA,cAAA,GAAiB,IAAA;AACjB,IAAA,oBAAA,EAAqB;AACrB,IAAA,kBAAA,EAAmB;AACnB,IAAA,iBAAA,EAAkB;AAClB,IAAA,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,CAAA;AACvB,IAAA,KAAA,EAAO,QAAA,EAAS;AAChB,IAAA,KAAA,GAAQ,IAAA;AACR,IAAA,YAAA,EAAc,MAAA,EAAO;AACrB,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,YAAA,EAAc,MAAA,EAAO;AACrB,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,IAAI,eAAA,EAAiB,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,iBAAiB,IAAI,CAAA;AAClF,IAAA,eAAA,GAAkB,IAAA;AAClB,IAAA,MAAA,EAAQ,QAAA,EAAS;AACjB,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,iBAAA,EAAkB;AAAA,EACpB,CAAA;AAQA,EAAA,MAAM,QAAA,GAAW,CAAC,SAAA,KAAkC;AAClD,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,MAAA,CAAO,CAAC,GAAA,KAAQ;AACxC,MAAA,IAAI;AACF,QAAA,OAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA,KAAM,IAAA;AAAA,MACzC,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF,CAAC,CAAA;AACD,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAa;AACnC,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,MAAA,IAAI;AACF,QAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,gBAAA,CAAiB,GAAG,CAAC,CAAA,EAAG,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA;AAAA,MAC7E,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,MAAM,aAA4B,EAAC;AACnC,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,gBAAA,CAAiB,oBAAoB,CAAA;AAC5D,IAAA,KAAA,MAAW,OAAA,IAAW,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EAAG;AACvC,MAAA,IAAI,UAAA,CAAW,UAAU,GAAA,EAAK;AAC9B,MAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,sEAAsE,CAAA,EAAG;AAC3F,QAAA;AAAA,MACF;AACA,MAAA,IAAI,OAAA,CAAQ,cAAA,EAAe,CAAE,MAAA,KAAW,CAAA,EAAG;AAE3C,MAAA,IAAI,MAAA,GAAS,KAAA;AACb,MAAA,KAAA,IAAS,CAAA,GAAoB,OAAA,EAAS,CAAA,EAAG,CAAA,GAAI,EAAE,aAAA,EAAe;AAC5D,QAAA,IAAI,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,EAAG;AACpB,UAAA,MAAA,GAAS,IAAA;AACT,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAI,MAAA,EAAQ;AACZ,MAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,OAAA,EAAS,CAAC,CAAA;AAC7C,MAAA,IAAI,CAAC,QAAA,IAAY,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,EAAG;AACrC,MAAA,IAAA,CAAK,IAAI,QAAQ,CAAA;AACjB,MAAA,UAAA,CAAW,IAAA,CAAK;AAAA,QACd,QAAA;AAAA,QACA,aAAA,EAAe,iBAAA,CAAkB,OAAA,EAAS,CAAC,CAAA;AAAA,QAC3C,GAAA,EAAK,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY;AAAA,QACjC,EAAA,EAAI,QAAQ,EAAA,IAAM,IAAA;AAAA,QAClB,OAAA,EAAS,mBAAmB,OAAO,CAAA;AAAA,QACnC,IAAA,EAAM,iBAAiB,OAAO;AAAA,OAC/B,CAAA;AAAA,IACH;AACA,IAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAK,GAAI,MAAA,CAAO,QAAA;AAElC,IAAA,MAAM,SAAA,GAAY,QAAQ,IAAA,CAAK,IAAI,IAAI,CAAA,EAAG,QAAQ,CAAA,EAAG,IAAI,CAAA,CAAA,GAAK,QAAA;AAC9D,IAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,SAAA,EAAW,YAAY,OAAA,EAAQ;AAAA,EAC9D,CAAA;AAOA,EAAA,IAAI,YAAA,GAAmC,IAAA;AACvC,EAAA,IAAI,eAAA,GAAuD,IAAA;AAC3D,EAAA,MAAM,oBAAoB,MAAY;AACpC,IAAA,IAAI,CAAC,YAAA,EAAc;AACnB,IAAA,YAAA,CAAa,MAAA,EAAO;AACpB,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,IAAI,eAAA,EAAiB,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,iBAAiB,IAAI,CAAA;AAClF,IAAA,eAAA,GAAkB,IAAA;AAClB,IAAA,KAAA,EAAO,WAAW,IAAI,CAAA;AACtB,IAAA,IAAA,CAAK,EAAE,IAAA,EAAM,qBAAA,EAAuB,CAAA;AAAA,EACtC,CAAA;AACA,EAAA,MAAM,gBAAA,GAAmB,CAAC,IAAA,KAAiC;AACzD,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,YAAA,CAAa,MAAA,EAAO;AACpB,MAAA,YAAA,GAAe,IAAA;AAAA,IACjB;AACA,IAAA,KAAA,EAAO,WAAW,KAAK,CAAA;AACvB,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,YAAA,CAAa,2BAA2B,EAAE,CAAA;AAC/C,IAAA,IAAA,CAAK,YAAA,CAAa,yBAAyB,EAAE,CAAA;AAC7C,IAAA,MAAM,SAAS,IAAA,CAAK,YAAA,CAAa,EAAE,IAAA,EAAM,QAAQ,CAAA;AACjD,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,IAAA,KAAA,CAAM,WAAA,GAAc,mBAAA;AACpB,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC7C,IAAA,QAAA,CAAS,SAAA,GAAY,sBAAA;AACrB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,IAAA,MAAA,CAAO,SAAA,GAAY,aAAA;AACnB,IAAA,MAAA,CAAO,YAAA,CAAa,QAAQ,QAAQ,CAAA;AACpC,IAAA,MAAA,CAAO,YAAA,CAAa,cAAc,MAAM,CAAA;AACxC,IAAA,MAAA,CAAO,YAAA,CAAa,YAAA,EAAc,IAAA,CAAK,KAAK,CAAA;AAC5C,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,IAAA,KAAA,CAAM,SAAA,GAAY,mBAAA;AAClB,IAAA,KAAA,CAAM,SAAA,GACJ,0LAAA;AACF,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AACzC,IAAA,KAAA,CAAM,SAAA,GAAY,mBAAA;AAClB,IAAA,KAAA,CAAM,cAAc,IAAA,CAAK,KAAA;AACzB,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AAC1C,IAAA,OAAA,CAAQ,SAAA,GAAY,iBAAA;AACpB,IAAA,OAAA,CAAQ,cAAc,IAAA,CAAK,OAAA;AAC3B,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AACxC,IAAA,IAAA,CAAK,SAAA,GAAY,kBAAA;AACjB,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,IAAA,EAAM;AACzB,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,MAAA,GAAA,CAAI,SAAA,GAAY,iBAAA;AAChB,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AACtC,MAAA,EAAA,CAAG,cAAc,CAAA,CAAE,KAAA;AACnB,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AACtC,MAAA,EAAA,CAAG,cAAc,CAAA,CAAE,KAAA;AACnB,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AAAA,IACtB;AACA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,IAAA,GAAO,QAAA;AACd,IAAA,MAAA,CAAO,SAAA,GAAY,iBAAA;AACnB,IAAA,MAAA,CAAO,WAAA,GAAc,KAAK,WAAA,IAAe,OAAA;AACzC,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,iBAAiB,CAAA;AAClD,IAAA,MAAA,CAAO,MAAA,CAAO,KAAA,EAAO,KAAA,EAAO,OAAO,CAAA;AACnC,IAAA,IAAI,KAAK,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,MAAA,CAAO,YAAY,IAAI,CAAA;AACjD,IAAA,MAAA,CAAO,YAAY,MAAM,CAAA;AACzB,IAAA,MAAA,CAAO,MAAA,CAAO,KAAA,EAAO,QAAA,EAAU,MAAM,CAAA;AACrC,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,eAAA,GAAkB,CAAC,CAAA,KAA2B;AAC5C,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACxB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,iBAAA,EAAkB;AAAA,IACpB,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,eAAA,EAAiB,IAAI,CAAA;AAC1D,IAAA,MAAA,CAAO,KAAA,EAAM;AAAA,EACf,CAAA;AAGA,EAAA,IAAI,YAAA,GAAmC,IAAA;AACvC,EAAA,MAAM,YAAA,GAAe,CAAC,QAAA,KAAkC;AACtD,IAAA,YAAA,EAAc,MAAA,EAAO;AACrB,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,IAAI,MAAA,GAAyB,IAAA;AAC7B,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,QAAA,CAAS,cAAc,QAAQ,CAAA;AAAA,IAC1C,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,CAAA,GAAI,OAAO,qBAAA,EAAsB;AACvC,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,IAAA,GAAA,CAAI,YAAA,CAAa,2BAA2B,EAAE,CAAA;AAC9C,IAAA,GAAA,CAAI,MAAM,OAAA,GACR,CAAA,oBAAA,EAAuB,CAAA,CAAE,IAAA,GAAO,CAAC,CAAA,OAAA,EAAU,CAAA,CAAE,GAAA,GAAM,CAAC,YAAY,CAAA,CAAE,KAAA,GAAQ,CAAC,CAAA,UAAA,EAAa,CAAA,CAAE,SAAS,CAAC,CAAA,qHAAA,CAAA;AAEtG,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,GAAG,CAAA;AAC7B,IAAA,YAAA,GAAe,GAAA;AAAA,EACjB,CAAA;AAGA,EAAA,IAAI,IAAI,KAAA,EAAO;AAIb,IAAA,MAAA,GAAS,mBAAA,CAAoB;AAAA,MAC3B,QAAA,EAAU,OAAO,QAAA,CAAS,QAAA;AAAA,MAC1B,QAAA,EAAU,CAAC,MAAA,KAAW;AACpB,QAAA,QAAQ,OAAO,MAAA;AAAQ;AAAA,UAErB,KAAK,MAAA;AACH,YAAA,KAAA,EAAO,YAAA,CAAa,OAAO,QAAA,KAAa,KAAA,GAAS,QAAQ,MAAA,EAAO,IAAK,IAAK,CAAC,CAAA;AAC3E,YAAA;AAAA,UACF,KAAK,YAAA;AACH,YAAA,KAAA,EAAO,WAAW,IAAI,CAAA;AACtB,YAAA;AAAA,UACF,KAAK,SAAA;AACH,YAAA,IAAI,WAAA,EAAa;AACjB,YAAA,WAAA,GAAc,IAAA;AAEd,YAAA,YAAA,GAAe,KAAA;AACf,YAAA,gBAAA,GAAmB,KAAA;AACnB,YAAA,eAAA,GAAkB,KAAA,EAAO,WAAU,IAAK,IAAA;AACxC,YAAA,KAAA,EAAO,WAAW,KAAK,CAAA;AACvB,YAAA,MAAA,EAAQ,WAAW,IAAI,CAAA;AACvB,YAAA,IAAI,WAAA,oBAA+B,WAAW,CAAA;AAC9C,YAAA;AAAA,UACF,KAAK,cAAA;AACH,YAAA,IAAI,CAAC,WAAA,EAAa;AAClB,YAAA,WAAA,GAAc,KAAA;AACd,YAAA,oBAAA,EAAqB;AACrB,YAAA,kBAAA,EAAmB;AACnB,YAAA,MAAA,EAAQ,WAAW,KAAK,CAAA;AACxB,YAAA,KAAA,EAAO,WAAW,eAAe,CAAA;AACjC,YAAA,IAAI,WAAA,oBAA+B,WAAW,CAAA;AAC9C,YAAA;AAAA,UACF,KAAK,mBAAA;AAAA,UACL,KAAK,aAAA;AAAA,UACL,KAAK,UAAA;AACH,YAAA,KAAA,EAAO,WAAW,IAAI,CAAA;AACtB,YAAA;AAAA;AAEJ,QAAA,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAA,EAAS,QAAQ,CAAA;AAAA,MACjD;AAAA,KACD,CAAA;AACD,IAAA,KAAA,GAAQ,kBAAA,CAAmB;AAAA,MACzB,eAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA,EAAW,OAAO,QAAA,CAAS,MAAA;AAAA,MAC3B,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,OAAA,EAAS,MAAM,QAAA,EAAS;AAAA,MACxB,SAAA,EAAW,OAAO,MAAA;AAAO,KAC1B,CAAA;AACD,IAAA,MAAA,CAAO,cAAA,CAAe,CAAC,CAAA,KAAM,KAAA,EAAO,YAAA,CAAa,MAAA,EAAQ,IAAA,EAAK,KAAM,KAAA,GAAQ,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,EACpF,CAAA,MAAO;AACL,IAAA,YAAA,GAAe,aAAA,EAAc;AAC7B,IAAA,IAAI,CAAC,cAAc,OAAO,IAAA;AAAA,EAC5B;AAEA,EAAA,MAAM,WAAW,MAAY;AAC3B,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC5C,IAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,UAAU,CAAA;AAC9C,IAAA,iBAAA,EAAkB;AAGlB,IAAA,IAAI,CAAC,GAAA,CAAI,KAAA,OAAY,EAAE,IAAA,EAAM,SAAS,CAAA;AAAA,EACxC,CAAA;AAUA,EAAA,MAAM,MAAO,MAAA,CACV,YAAA;AACH,EAAA,IAAI,CAAC,GAAA,CAAI,KAAA,IAAS,GAAA,EAAK,MAAA,IAAU,KAAK,MAAA,EAAQ;AAC5C,IAAA,KAAK,kBAAA,CAAmB,IAAI,MAAA,EAAQ,GAAA,CAAI,QAAQ,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,EAAA,KAAO;AAClE,MAAA,IAAI,IAAI,QAAA,EAAS;AAAA,WAAA,IACR,MAAA,CAAO,OAAA,EAAS,OAAA,CAAQ,IAAA,CAAK,4DAAoD,CAAA;AAAA,IAC5F,CAAC,CAAA;AAAA,EACH,CAAA,MAAO;AACL,IAAA,QAAA,EAAS;AAAA,EACX;AAEA,EAAA,OAAO,EAAE,QAAA,EAAS;AACpB;AAQA,eAAe,kBAAA,CAAmB,MAAA,EAAgB,MAAA,EAAgB,KAAA,EAAiC;AACjG,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,CAAA,EAAG,MAAA,CAAO,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA,kBAAA,CAAA;AACzC,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAC3B,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAoB,aAAa,MAAA,EAAO;AAAA,MACnE,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAO;AAAA,KAC/B,CAAA;AACD,IAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,IAAA;AACpB,IAAA,MAAM,OAAQ,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC/C,IAAA,OAAO,MAAM,KAAA,KAAU,KAAA;AAAA,EACzB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAGA,SAAS,aAAA,GAA+B;AACtC,EAAA,IAAI,OAAO,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,MAAA,SAAe,MAAA,CAAO,MAAA;AAC7D,EAAA,IAAI,OAAO,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,MAAA,SAAe,MAAA,CAAO,MAAA;AAC7D,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,uBAAuB,UAAA,EAA0C;AAExE,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,IAAI;AACF,MAAA,OAAO,IAAI,GAAA,CAAI,UAAU,CAAA,CAAE,MAAA;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,EAAY,IAAK,QAAA,CAAS,QAAA,EAAU;AACtC,IAAA,IAAI;AACF,MAAA,OAAO,IAAI,GAAA,CAAI,QAAA,CAAS,QAAQ,CAAA,CAAE,MAAA;AAAA,IACpC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAUA,SAAS,sBAAA,GAEK;AACZ,EAAA,MAAM,MAAO,MAAA,CACV,YAAA;AACH,EAAA,IAAI,CAAC,GAAA,EAAK,MAAA,IAAU,CAAC,GAAA,EAAK,QAAQ,OAAO,MAAA;AACzC,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC5C,EAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,EAAA,OAAO,OAAO,QAAA,KAAa;AACzB,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB;AAAA,MACjC,SAAA,EAAW,aAAA;AAAA,MACX,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA;AAAA,MAC3B,kBAAA,EAAoB;AAAA,KACrB,CAAA;AACD,IAAA,MAAM,MAAM,MAAM,KAAA,CAAM,GAAG,MAAM,CAAA,oBAAA,EAAuB,MAAM,CAAA,CAAA,EAAI;AAAA,MAChE,OAAA,EAAS,EAAE,WAAA,EAAa,MAAA;AAAO,KAChC,CAAA;AACD,IAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,EAAC;AACrB,IAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,IAAA,OAAO,IAAA,CAAK,SAAS,EAAC;AAAA,EACxB,CAAA;AACF;;;ACv1DA,IAAM,gBAAA,GAAmB,6BAAA;AACzB,IAAM,aAAA,GAAgB,GAAA;AAEf,SAAS,qBAAqB,OAAA,EAAgD;AACnF,EAAA,IAAI,CAAC,SAAA,EAAU,EAAG,OAAO,WAAA,EAAY;AAErC,EAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,eAAA,IAAmB,MAAA,CAAO,QAAA,CAAS,MAAA;AACnE,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,OAAA,CAAQ,MAAM,CAAA;AAC3C,EAAA,MAAM,MAAM,WAAA,CAAY,OAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,OAAO,eAAe,CAAA;AAEtE,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,IAAA;AAC/B,EAAA,MAAM,WAAW,KAAA,KAAU,IAAA;AAE3B,EAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,EAAA,IAAI,QAAA,EAAU;AAEZ,IAAA,KAAA,CAAO,GAAA,GAAM,GAAA;AAAA,EACf,CAAA,MAAO;AACL,IAAA,KAAA,GAAQ,MAAA,CAAO,IAAA;AAAA,MACb,GAAA;AAAA,MACA,QAAQ,UAAA,IAAc,aAAA;AAAA,MACtB,QAAQ,cAAA,IAAkB;AAAA,KAC5B;AAAA,EACF;AAGA,EAAA,MAAM,YAAA,GAAe,MAAsB,QAAA,GAAY,KAAA,EAAO,iBAAiB,IAAA,GAAQ,KAAA;AAEvF,EAAA,MAAM,IAAA,GAAO,CAAC,OAAA,KAAkC;AAC9C,IAAA,MAAM,IAAI,YAAA,EAAa;AACvB,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,IAAI,CAAC,QAAA,IAAY,KAAA,EAAO,MAAA,EAAQ;AAChC,IAAA,CAAA,CAAE,WAAA;AAAA,MACA,EAAE,MAAA,EAAQ,kBAAA,EAAoB,OAAO,OAAA,CAAQ,KAAA,EAAO,GAAG,OAAA,EAAQ;AAAA,MAC/D,SAAA,IAAa;AAAA,KACf;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,SAAA;AAEJ,EAAA,MAAM,UAAU,MAAY;AAC1B,IAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAC/C,IAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,MAAA,aAAA,CAAc,SAAS,CAAA;AACvB,MAAA,SAAA,GAAY,MAAA;AAAA,IACd;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAA8B;AAC/C,IAAA,IAAI,SAAA,IAAa,KAAA,CAAM,MAAA,KAAW,SAAA,EAAW;AAC7C,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AAMnB,IAAA,IAAI,CAAC,QAAQ,IAAA,CAAK,MAAA,KAAW,sBAAsB,IAAA,CAAK,KAAA,KAAU,QAAQ,KAAA,EAAO;AAEjF,IAAA,QAAQ,KAAK,IAAA;AAAM,MACjB,KAAK,OAAA;AACH,QAAA,OAAA,CAAQ,OAAA,IAAU;AAClB,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,IAAI,IAAA,CAAK,OAAA,EAAS,OAAA,CAAQ,QAAA,GAAW,KAAK,OAAwB,CAAA;AAClE,QAAA;AAAA,MACF,KAAK,gBAAA;AACH,QAAA,OAAA,CAAQ,WAAA,IAAc;AACtB,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,OAAA,EAAQ;AACR,QAAA,OAAA,CAAQ,QAAA,IAAW;AACnB,QAAA;AAAA;AACJ,EACF,CAAA;AAEA,EAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAI5C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,SAAA,GAAY,YAAY,MAAM;AAC5B,MAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,QAAA,OAAA,EAAQ;AACR,QAAA,OAAA,CAAQ,QAAA,IAAW;AAAA,MACrB;AAAA,IACF,GAAG,aAAa,CAAA;AAAA,EAClB;AAEA,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,CAAC,CAAA,KACZ,IAAA,CAAK;AAAA,MACH,IAAA,EAAM,cAAA;AAAA,MACN,GAAI,GAAG,YAAA,KAAiB,MAAA,GAAY,EAAE,YAAA,EAAc,CAAA,CAAE,YAAA,EAAa,GAAI,EAAC;AAAA,MACxE,GAAI,GAAG,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAK,GAAI;AAAC,KACjD,CAAA;AAAA,IACH,YAAY,MAAM,IAAA,CAAK,EAAE,IAAA,EAAM,eAAe,CAAA;AAAA,IAC9C,OAAA,EAAS,CAAC,KAAA,KAAU,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,EAAW,OAAO,CAAA;AAAA,IACnD,cAAc,MAAM,IAAA,CAAK,EAAE,IAAA,EAAM,iBAAiB,CAAA;AAAA,IAClD,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAY,CAAA;AACzB,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,IAAI,KAAA,QAAa,GAAA,GAAM,aAAA;AAAA,MACzB,CAAA,MAAA,IAAW,KAAA,IAAS,CAAC,KAAA,CAAM,MAAA,EAAQ;AACjC,QAAA,KAAA,CAAM,KAAA,EAAM;AAAA,MACd;AACA,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,GACF;AACF;AAEA,SAAS,WAAA,CAAY,MAAA,EAAgB,KAAA,EAAe,eAAA,EAAiC;AACnF,EAAA,IAAI;AACF,IAAA,MAAM,IAAI,IAAI,GAAA,CAAI,MAAA,EAAQ,MAAA,CAAO,SAAS,IAAI,CAAA;AAC9C,IAAA,CAAA,CAAE,YAAA,CAAa,GAAA,CAAI,mBAAA,EAAqB,KAAK,CAAA;AAC7C,IAAA,CAAA,CAAE,YAAA,CAAa,GAAA,CAAI,oBAAA,EAAsB,eAAe,CAAA;AACxD,IAAA,OAAO,EAAE,QAAA,EAAS;AAAA,EACpB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEA,SAAS,WAAW,GAAA,EAA4B;AAC9C,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,CAAE,MAAA;AAAA,EAC5C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,WAAA,GAA8B;AACrC,EAAA,OAAO;AAAA,IACL,aAAa,MAAM;AAAA,IAAC,CAAA;AAAA,IACpB,YAAY,MAAM;AAAA,IAAC,CAAA;AAAA,IACnB,SAAS,MAAM;AAAA,IAAC,CAAA;AAAA,IAChB,cAAc,MAAM;AAAA,IAAC,CAAA;AAAA,IACrB,OAAO,MAAM;AAAA,IAAC;AAAA,GAChB;AACF","file":"chunk-YEKCBVNJ.mjs","sourcesContent":["/**\n * Drop-target de bloques sobre la preview (editor in-app).\n *\n * El autor arrastra un bloque de la paleta del panel (iframe del dashboard) y\n * lo suelta SOBRE la guía pintada en la app. El drag & drop HTML5 cruza\n * iframes de forma nativa, así que acá solo escuchamos `dragover`/`drop` en el\n * host de la guía, mostramos una línea de inserción entre bloques y avisamos\n * dónde cayó (el panel inserta el bloque en su estado y re-previsualiza).\n *\n * Contrato con el panel: el MIME `application/x-veo-block`. El `dragstart` de\n * la paleta lo setea con el tipo de bloque; durante `dragover` solo los TYPES\n * del dataTransfer son visibles (el valor recién se puede leer en el `drop`) —\n * alcanza para filtrar drags ajenos.\n *\n * La posición se expresa como `beforeIndex`: índice del bloque del paso ANTES\n * del cual insertar (`null` = al final). Los renderers estampan\n * `data-veo-idx` en cada elemento top-level con el índice ORIGINAL dentro de\n * `step.blocks[]` (una fila de botones agrupados lleva el del primero), así el\n * índice sobrevive a bloques filtrados u ocultos (p.ej. botones en pasos de\n * tour).\n */\n\nexport const VEO_BLOCK_MIME = 'application/x-veo-block';\n\n/** Dónde soltó el autor un bloque nuevo. */\nexport interface BlockDropPayload {\n stepIndex: number;\n /** Tipo de bloque arrastrado (title/text/button/image — lo valida el panel). */\n blockType: string;\n /** Índice del bloque ANTES del cual insertar; `null` = al final. */\n beforeIndex: number | null;\n}\n\nexport interface BlockDropTargetHandle {\n /**\n * Drag por POINTER (el camino principal): el panel manda las coordenadas del\n * puntero ya convertidas a la página de la app. Muestra/mueve la línea de\n * inserción; devuelve `true` si el punto está sobre la guía.\n */\n hoverAt(x: number, y: number): boolean;\n /**\n * Suelta en esas coordenadas: devuelve el punto de inserción, o `null` si el\n * puntero no estaba sobre la guía (el drop se descarta). Siempre borra la línea.\n */\n dropAt(x: number, y: number): { beforeIndex: number | null } | null;\n /** Cancela el hover (borra la línea sin soltar). */\n cancelHover(): void;\n detach(): void;\n}\n\ninterface AttachOptions {\n host: HTMLElement;\n stepIndex: number;\n onDrop: (payload: BlockDropPayload) => void;\n}\n\n/** Punto de inserción calculado bajo el cursor. */\ninterface DropSpot {\n beforeIndex: number | null;\n /** Coordenada Y (viewport) de la línea indicadora. */\n y: number;\n rect: DOMRect;\n}\n\n/**\n * Adjunta el drop-target al host de la guía en preview. Devuelve un handle\n * para desmontarlo (cambio de preview / cierre del editor).\n */\nexport function attachBlockDropTarget(options: AttachOptions): BlockDropTargetHandle {\n const { host, stepIndex, onDrop } = options;\n const doc = host.ownerDocument;\n let line: HTMLElement | null = null;\n let spot: DropSpot | null = null;\n\n const contentEl = (): HTMLElement | null =>\n host.shadowRoot?.querySelector<HTMLElement>('.veo-guide-content') ?? null;\n\n /** Hijos top-level que representan bloques (estampados por los renderers). */\n const blockChildren = (container: HTMLElement): HTMLElement[] =>\n Array.from(container.children).filter(\n (el): el is HTMLElement => el instanceof HTMLElement && el.dataset.veoIdx !== undefined,\n );\n\n const hideLine = (): void => {\n line?.remove();\n line = null;\n spot = null;\n };\n\n const showLine = (at: DropSpot): void => {\n if (!line) {\n line = doc.createElement('div');\n // Inline (no hay hoja de estilos del builder en el shadow de la guía).\n line.style.cssText =\n 'position:fixed;height:3px;border-radius:2px;background:#FF5B35;' +\n 'box-shadow:0 0 0 1px rgba(255,255,255,0.65);pointer-events:none;z-index:2147483647;';\n host.shadowRoot?.appendChild(line);\n }\n line.style.left = `${at.rect.left + 4}px`;\n line.style.width = `${Math.max(0, at.rect.width - 8)}px`;\n line.style.top = `${at.y - 1.5}px`;\n };\n\n const isBlockDrag = (event: DragEvent): boolean => {\n const types = event.dataTransfer?.types;\n return !!types && Array.from(types).includes(VEO_BLOCK_MIME);\n };\n\n /** Margen alrededor del contenido dentro del cual el drop sigue activo. */\n const NEAR_PX = 48;\n\n /** Boundary de inserción más cercano al cursor (por el eje Y). */\n const locate = (clientY: number): DropSpot | null => {\n const container = contentEl();\n if (!container) return null;\n const rect = container.getBoundingClientRect();\n const kids = blockChildren(container);\n let beforeIndex: number | null = null;\n let y = kids.length === 0 ? rect.top + rect.height / 2 : 0;\n for (const kid of kids) {\n const r = kid.getBoundingClientRect();\n if (clientY < r.top + r.height / 2) {\n const idx = Number(kid.dataset.veoIdx);\n beforeIndex = Number.isFinite(idx) ? idx : null;\n y = r.top;\n break;\n }\n y = r.bottom; // el cursor quedó debajo: candidato \"después del último\"\n }\n return { beforeIndex, y, rect };\n };\n\n /** ¿El punto está sobre (o cerca de) el contenido de la guía? */\n const overContent = (x: number, y: number, rect: DOMRect): boolean =>\n x >= rect.left - NEAR_PX &&\n x <= rect.right + NEAR_PX &&\n y >= rect.top - NEAR_PX &&\n y <= rect.bottom + NEAR_PX;\n\n const hoverAt = (x: number, y: number): boolean => {\n const at = locate(y);\n if (!at || !overContent(x, y, at.rect)) {\n hideLine();\n return false;\n }\n spot = at;\n showLine(at);\n return true;\n };\n\n const dropAt = (x: number, y: number): { beforeIndex: number | null } | null => {\n const at = locate(y);\n hideLine();\n if (!at || !overContent(x, y, at.rect)) return null;\n return { beforeIndex: at.beforeIndex };\n };\n\n const onDragOver = (event: DragEvent): void => {\n if (!isBlockDrag(event)) return;\n const at = locate(event.clientY);\n if (!at) return;\n event.preventDefault(); // habilita el drop\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'copy';\n spot = at;\n showLine(at);\n };\n\n const onDropEvent = (event: DragEvent): void => {\n if (!isBlockDrag(event)) return;\n event.preventDefault();\n const blockType = event.dataTransfer?.getData(VEO_BLOCK_MIME) ?? '';\n const at = spot ?? locate(event.clientY);\n hideLine();\n if (!blockType || !at) return;\n onDrop({ stepIndex, blockType, beforeIndex: at.beforeIndex });\n };\n\n const onDragLeave = (event: DragEvent): void => {\n // Solo al salir del host de verdad (los cruces internos del shadow se\n // re-targetean al host y no llegan acá).\n const to = event.relatedTarget;\n if (to instanceof Node && (to === host || host.contains(to))) return;\n hideLine();\n };\n\n host.addEventListener('dragover', onDragOver);\n host.addEventListener('drop', onDropEvent);\n host.addEventListener('dragleave', onDragLeave);\n\n return {\n hoverAt,\n dropAt,\n cancelHover: hideLine,\n detach(): void {\n host.removeEventListener('dragover', onDragOver);\n host.removeEventListener('drop', onDropEvent);\n host.removeEventListener('dragleave', onDragLeave);\n hideLine();\n },\n };\n}\n","/**\n * Contrato de mensajes del puente builder (app del cliente ↔ dashboard).\n * Ambos lados validan `event.origin` y que `token` coincida antes de actuar.\n *\n * Flujo:\n * 1. El dashboard abre la app con `?veoBuilder=<token>&veoBuilderOrigin=<origen>`.\n * 2. La app (veo-builder.js) postea `ready` a la ventana que la abrió.\n * 3. El dashboard manda comandos (`start-picker`, `preview`, …).\n * 4. La app responde con eventos (`picked`, `pick-cancelled`, …).\n */\nimport type { PreviewGuideInput } from '../guides/guide-preview';\nimport type { BlockDropPayload } from './block-drop-target';\nimport type { DesignPatch } from './design-manipulator';\nimport type { PickedElement } from './element-picker';\n\nexport const VEO_BUILDER_SOURCE = 'veo-builder';\n// Los nombres de los query params viven en el core (`builder-token.ts`), única\n// fuente de verdad compartida con el loader y el gate del runtime de guías.\nexport { BUILDER_ORIGIN_PARAM, BUILDER_TOKEN_PARAM } from '../../core/builder-token';\n\n/**\n * Estado que el panel (editor) publica para que el SDK pinte el \"chrome\" del\n * editor (topbar + fila de pasos) ENCIMA de la app. El panel es la única fuente\n * de verdad; el chrome solo lo refleja y devuelve `chrome-action`s.\n */\nexport interface EditorChromeState {\n /**\n * `tagging` = «Modo tagging» (panel de features): solo la topbar, con ese\n * título y sin fila de pasos, vista previa ni Guardar (cada tag se guarda al\n * crearse). Default `guide` = editor de guías.\n */\n variant?: 'guide' | 'tagging';\n /** Título del header de la tarjeta; si falta, el SDK lo deriva de la sección. */\n panelTitle?: string;\n guideName: string;\n /** ISO de creación (null = guía nueva sin guardar). */\n createdAt: string | null;\n steps: Array<{ id: string; label: string; presentation: 'floating' | 'inline' }>;\n activeStep: number;\n /**\n * Qué muestra el panel. `step`, `block`, `add-block`, `row` y `structure`\n * son vistas del paso activo (la fila de pasos lo marca); las pestañas del\n * contenedor se «encienden» solo con `step` (contenedor) y `structure`.\n */\n section: 'activation' | 'step' | 'badge' | 'target' | 'block' | 'add-block' | 'row' | 'structure';\n /** Editando un bloque del paso: su nombre («Encuesta Texto abierto») para el título del panel. */\n blockLabel?: string | null;\n saving: boolean;\n dirty: boolean;\n /**\n * Estado de publicación de la guía, para que el autor vea en la barra si lo\n * que edita está Activa/Borrador/etc. (sin esto, guardar una guía en borrador\n * y no verla en la app era un misterio). `tone` elige el color del chip.\n */\n status?: { label: string; tone: 'live' | 'testing' | 'review' | 'draft' | 'paused' } | null;\n}\n\n/**\n * Qué está haciendo la preview en la app. El SDK lo publica cada vez que\n * evalúa un comando `preview` con `honorTrigger`, para que el panel explique\n * por qué la guía no se ve (retraso, elemento objetivo, otra página, otro\n * dispositivo) en vez de parecer rota.\n */\nexport type PreviewStatus =\n | { state: 'shown' }\n | { state: 'waiting-delay'; delayMs: number }\n | { state: 'waiting-trigger'; trigger: 'on_click' | 'on_hover'; selector: string }\n | { state: 'page-mismatch'; pattern: string }\n | { state: 'device-mismatch'; devices: 'desktop' | 'mobile' };\n\n/** Acciones que el usuario dispara en el chrome (barras) y el panel ejecuta. */\n/** Bloque de la preview: paso + id local del panel (`StepBlock.editorId`). */\nexport interface BlockRef {\n stepIndex: number;\n blockId: string;\n}\nexport type BlockToolbarAction =\n | 'edit'\n | 'duplicate'\n | 'remove'\n /** Mover: arriba/abajo dentro de su columna, izquierda/derecha entre columnas de su fila. */\n | 'move-up'\n | 'move-down'\n | 'move-left'\n | 'move-right';\n/** Barra de la FILA (hover o fila del bloque seleccionado): editar / duplicar / eliminar. */\nexport type RowToolbarAction = 'edit' | 'duplicate' | 'remove';\n/** Pestañas sobre el CONTENEDOR (hover): editar el paso o abrir la estructura de filas. */\nexport type CardToolbarAction = 'edit-container' | 'edit-rows';\nexport type BlockLayoutAction =\n | 'row-before'\n | 'row-after'\n | 'col-before'\n | 'col-after'\n /** Bloque apilado en la MISMA celda (fila+columna), antes/después del bloque. */\n | 'stack-before'\n | 'stack-after';\n\nexport type ChromeAction =\n | { action: 'select-activation' }\n | { action: 'select-step'; index: number }\n | { action: 'add-step' }\n /** Hover sobre la tarjeta de un paso: duplicar (se inserta después) o eliminar. */\n | { action: 'duplicate-step'; index: number }\n | { action: 'remove-step'; index: number }\n | { action: 'save'; exit: boolean }\n | { action: 'exit' }\n // Las tres siguientes las resuelve el SDK solo (no llegan al panel):\n // barra arriba/abajo, volver a mostrar la tarjeta y modo vista previa.\n | { action: 'dock'; position: 'top' | 'bottom' }\n | { action: 'show-panel' }\n | { action: 'preview' }\n | { action: 'exit-preview' };\n\n/** Eventos que la app del cliente envía al dashboard. */\nexport type BuilderEvent =\n // `chrome: true` → el SDK pinta el chrome del editor (barras); el panel debe\n // ocultar su propia cabecera/pasos/guardado y publicar `editor-state`.\n | { type: 'ready'; chrome?: boolean }\n | { type: 'chrome-action'; payload: ChromeAction }\n | { type: 'picked'; payload: PickedElement }\n | { type: 'pick-cancelled' }\n // Manipulación directa: el autor arrastró/redimensionó la guía en la app;\n // el panel mergea `payload.style` sobre el `style` del paso indicado.\n | { type: 'design-updated'; payload: DesignPatch }\n // Drag & drop de bloques: el autor soltó un bloque de la paleta SOBRE la\n // guía en preview; el panel lo inserta en `step.blocks[]` en esa posición.\n | { type: 'block-dropped'; payload: BlockDropPayload }\n /** Clic simple (sin arrastre) sobre la tarjeta de la preview: el panel abre «Agregar bloque». */\n | { type: 'card-clicked'; payload: { stepIndex: number } }\n /** Clic sobre un bloque de la preview: se selecciona en la app y el panel abre su editor. */\n | { type: 'block-clicked'; payload: BlockRef }\n /** Barra del bloque seleccionado: editar / duplicar / eliminar. */\n | { type: 'block-action'; payload: BlockRef & { action: BlockToolbarAction } }\n /** «+» en los bordes del bloque seleccionado: agregar fila arriba/abajo o columna izq/der. */\n | { type: 'block-layout'; payload: BlockRef & { action: BlockLayoutAction } }\n /** Barra de una fila: `blockId` = primer bloque de la fila (la fila no tiene id propio). */\n | { type: 'row-action'; payload: BlockRef & { action: RowToolbarAction } }\n /** Pestañas del contenedor (hover sobre la tarjeta): editar contenedor / editar filas. */\n | { type: 'card-action'; payload: { stepIndex: number; action: CardToolbarAction } }\n // Estado de la preview (ver `PreviewStatus`).\n | { type: 'preview-status'; payload: PreviewStatus }\n /** Respuesta a `scan-page`: elementos clickeables de la página y qué selectores dados existen en ella. */\n | { type: 'page-scan'; payload: PageScan }\n /** El autor cerró el modal de `show-confirmation`. */\n | { type: 'confirmation-closed' }\n | { type: 'closed' };\n\n/**\n * Modal de confirmación que el SDK pinta CENTRADO sobre la app del cliente\n * (mock «Feature tagueada»): check verde, título, mensaje, filas\n * label/valor y un botón que lo cierra. Mientras está abierto el panel se\n * oculta; al cerrarlo el SDK postea `confirmation-closed`.\n */\nexport interface ConfirmationCard {\n title: string;\n message: string;\n rows: Array<{ label: string; value: string }>;\n /** Texto del botón. Default «Listo». */\n buttonLabel?: string;\n}\n\n/** Un elemento clickeable de la página (candidato a feature), sin `rect`. */\nexport type PageElement = Omit<PickedElement, 'rect'>;\n\nexport interface PageScan {\n /** `location.pathname`: el mismo valor que `$page_path` de autocapture (restricción «Solo en esta página»). */\n pagePath: string;\n /**\n * Ruta «humana» de la app: en apps con hash routing (`/#/settings`) incluye\n * el hash; si no, es igual a `pagePath`. Para mostrar y para la foto del\n * elemento, NO para contar (autocapture no lleva el hash).\n */\n routePath: string;\n /** Elementos clickeables visibles que NO matchean ninguno de los `selectors` pedidos. */\n candidates: PageElement[];\n /** De los `selectors` pedidos, cuáles existen en esta página. */\n present: string[];\n}\n\n/** Comandos que el dashboard/panel envía a la app del cliente. */\nexport type BuilderCommand =\n /** `only: 'interactive'` (features): solo botones/enlaces/campos/formularios… (ver `ElementPickerOptions.only`). */\n | { type: 'start-picker'; maxAncestors?: number; hint?: string; only?: 'interactive' }\n | { type: 'stop-picker' }\n /** Panel de features: inventario de la página actual (ver `PageScan`). */\n | { type: 'scan-page'; selectors: string[] }\n /** Resalta (o deja de resaltar) un elemento por selector, sin entrar en modo picker. */\n | { type: 'highlight'; selector: string | null }\n /** Modal de confirmación centrado sobre la app (ver `ConfirmationCard`). */\n | { type: 'show-confirmation'; payload: ConfirmationCard }\n // `editable: true` (editor in-app) adjunta drag/resize sobre la preview.\n // `honorTrigger: true`: si la guía se dispara por elemento objetivo\n // (activationRules on_click/on_hover + selector), la preview ESPERA a esa\n // interacción en la app en vez de pintarse de una.\n // `honorTrigger` también respeta «retrasar la aparición» (delayMs) y el\n // filtro de dispositivo, publicando `preview-status` con lo que está pasando.\n | { type: 'preview'; guide: PreviewGuideInput; editable?: boolean; honorTrigger?: boolean }\n // Drag de un bloque de la paleta POR POINTER (el DnD HTML5 no cruza bien el\n // iframe del panel): el panel captura el puntero y streamea sus coordenadas\n // RELATIVAS AL IFRAME; la app las convierte con el rect del panel, mueve la\n // línea de inserción y en `drop` responde con el evento `block-dropped`.\n | {\n type: 'block-drag';\n phase: 'move' | 'drop' | 'cancel';\n x: number;\n y: number;\n blockType: string;\n label?: string;\n }\n | { type: 'close-preview' }\n /** El panel selecciona (o deselecciona con null) un bloque en la app. */\n | { type: 'select-block'; blockId: string | null }\n /** El panel edita una fila: se marca en la app (por el id de un bloque de esa fila). */\n | { type: 'select-row'; blockId: string | null }\n | { type: 'teardown' }\n // Chrome del editor: el panel publica su estado (nombre, pasos, sección…).\n | { type: 'editor-state'; state: EditorChromeState }\n // El panel pide ocultarse/mostrarse (botón «Cerrar» del contenido).\n | { type: 'panel-visibility'; visible: boolean }\n /** Tamaño compacto del panel (alto = contenido); `null` restaura el tamaño previo. */\n | { type: 'panel-size'; size: { width: number; height: number } | null }\n // Modo panel inyectado: el panel avisa que cargó y está listo para recibir\n // eventos; la app responde con `ready`. Resuelve la carrera de que el iframe\n // del panel todavía no tenga su listener cuando la app postea `ready`.\n | { type: 'panel-ready' };\n\n/** Sobre común: todo mensaje del puente lleva `source` + `token`. */\nexport interface BuilderEnvelope {\n source: typeof VEO_BUILDER_SOURCE;\n token: string;\n}\n\nexport type BuilderEventMessage = BuilderEnvelope & BuilderEvent;\nexport type BuilderCommandMessage = BuilderEnvelope & BuilderCommand;\n","/**\n * \"Chrome\" del editor in-app (mock Figma 2026-09): dos barras FIJAS arriba de la\n * app del cliente, dibujadas por el SDK (sin iframe):\n *\n * 1. Topbar oscura: logo · «Nombre · fecha» · app · [barra arriba/abajo]\n * [mostrar editor] [vista previa] · Salir · Guardar ▾ (Guardar y salir).\n * Vista previa: se esconden barras y tarjeta y queda una píldora\n * «Estás en vista previa | Salir» para volver al editor.\n * 2. Fila de pasos: tarjeta «Activación» + una tarjeta por paso + «Agregar\n * paso», con la píldora «Ocultar/Mostrar pasos» colgando al centro. Al\n * pasar el mouse por un paso aparece una capa oscura con «Editar»,\n * duplicar y eliminar (se pueden eliminar todos los pasos).\n *\n * La app se EMPUJA (`margin-top`/`margin-bottom` en <html>, según dónde esté\n * la barra) para que las barras no tapen nada. El chrome NO tiene estado propio: refleja el `EditorChromeState`\n * que publica el panel y devuelve `ChromeAction`s; el panel decide.\n */\nimport { hasDocument, hasWindow } from '../../utils/safe-env';\nimport type { ChromeAction, EditorChromeState } from './bridge-protocol';\n\nexport const CHROME_TOPBAR_H = 64;\nexport const CHROME_STEPS_H = 128;\n\nexport interface BuilderChromeOptions {\n /** Nombre de la app (origen) que se muestra junto al nombre de la guía. */\n appLabel: string;\n onAction: (action: ChromeAction) => void;\n}\n\nexport type ChromeDock = 'top' | 'bottom';\n\nexport interface BuilderChromeHandle {\n /** Refresca las barras con el estado publicado por el panel. */\n setState(state: EditorChromeState): void;\n /** Alto total ocupado hoy (topbar + pasos si están visibles). */\n height(): number;\n /** Dónde está anclada la barra. */\n dock(): ChromeDock;\n /** Modo vista previa: oculta las barras y muestra la píldora para salir. */\n setPreview(on: boolean): void;\n /** Oculta las barras SIN píldora (mientras dura el picker de elementos). */\n setHidden(on: boolean): void;\n /** Se llama cuando cambia el alto (colapsar/expandir pasos). */\n onHeightChange(cb: (h: number) => void): void;\n teardown(): void;\n}\n\nconst ICONS = {\n bolt: '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m3.75 13.5 10.5-11.25L12 10.5h8.25L9.75 21.75 12 13.5H3.75Z\"/>',\n desktop:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 17.25v1.007a3 3 0 0 1-.879 2.122L7.5 21h9l-.621-.621A3 3 0 0 1 15 18.257V17.25m6-12V15a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 15V5.25m18 0A2.25 2.25 0 0 0 18.75 3H5.25A2.25 2.25 0 0 0 3 5.25m18 0V12a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 12V5.25\"/>',\n updown:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3 7.5 7.5 3m0 0L12 7.5M7.5 3v13.5m13.5 0L16.5 21m0 0L12 16.5m4.5 4.5V7.5\"/>',\n map: '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 6.75V15m6-6v8.25m.503 3.498 4.875-2.437c.381-.19.622-.58.622-1.006V4.82c0-.836-.88-1.38-1.628-1.006l-3.869 1.934c-.317.159-.69.159-1.006 0L9.503 3.252a1.125 1.125 0 0 0-1.006 0L3.622 5.689C3.24 5.88 3 6.27 3 6.695V19.18c0 .836.88 1.38 1.628 1.006l3.869-1.934c.317-.159.69-.159 1.006 0l4.994 2.497c.317.158.69.158 1.006 0Z\"/>',\n eye: '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M2.036 12.322a1.012 1.012 0 0 1 0-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178Z\"/><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z\"/>',\n chevronDown:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m19.5 8.25-7.5 7.5-7.5-7.5\"/>',\n chevronUp:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m4.5 15.75 7.5-7.5 7.5 7.5\"/>',\n plus: '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 4.5v15m7.5-7.5h-15\"/>',\n pencil:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L10.582 16.07a4.5 4.5 0 0 1-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 0 1 1.13-1.897l8.932-8.931Zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0 1 15.75 21H5.25A2.25 2.25 0 0 1 3 18.75V8.25A2.25 2.25 0 0 1 5.25 6H10\"/>',\n copy: '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 0 0-2.25-2.25H6A2.25 2.25 0 0 0 3.75 6v8.25A2.25 2.25 0 0 0 6 16.5h2.25m8.25-8.25H18a2.25 2.25 0 0 1 2.25 2.25V18A2.25 2.25 0 0 1 18 20.25h-7.5A2.25 2.25 0 0 1 8.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 0 0-2.25 2.25v6\"/>',\n trash:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0\"/>',\n cursor:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15.042 21.672 13.684 16.6m0 0-2.51 2.225.569-9.47 5.227 7.917-3.286-.672ZM12 2.25V4.5m5.834.166-1.591 1.591M20.25 10.5H18M7.757 14.743l-1.59 1.59M6 10.5H3.75m4.007-4.243-1.59-1.59\"/>',\n spinner:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182\"/>',\n};\n\nfunction svg(name: keyof typeof ICONS, size = 20): string {\n return (\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" ` +\n `fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" aria-hidden=\"true\">${ICONS[name]}</svg>`\n );\n}\n\n/** «19 ago» (fecha corta, locale es). */\nfunction shortDate(iso: string | null): string {\n if (!iso) return '';\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return '';\n return d.toLocaleDateString('es', { day: 'numeric', month: 'short' }).replace('.', '');\n}\n\nfunction el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className: string,\n html?: string,\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n node.className = className;\n if (html !== undefined) node.innerHTML = html;\n return node;\n}\n\nfunction iconButton(name: keyof typeof ICONS, title: string, className = ''): HTMLButtonElement {\n const b = el('button', `veo-tb-icon ${className}`.trim(), svg(name));\n b.type = 'button';\n b.title = title;\n b.setAttribute('aria-label', title);\n return b;\n}\n\n/** Inyecta el chrome del editor. Devuelve el handle (o uno inerte sin DOM). */\nexport function injectBuilderChrome(opts: BuilderChromeOptions): BuilderChromeHandle {\n if (!hasWindow() || !hasDocument()) {\n return {\n setState: () => {},\n height: () => 0,\n dock: () => 'top',\n setPreview: () => {},\n setHidden: () => {},\n onHeightChange: () => {},\n teardown: () => {},\n };\n }\n\n const host = document.createElement('div');\n host.setAttribute('data-veo-builder-chrome', '');\n host.setAttribute('data-veo-ignore', '');\n const shadow = host.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n style.textContent = CHROME_CSS;\n\n const root = el('div', 'veo-chrome');\n\n // ── Topbar ──\n const topbar = el('div', 'veo-tb');\n const brand = el('div', 'veo-tb-brand', svg('bolt', 18));\n const nameEl = el('div', 'veo-tb-name');\n const statusEl = el('span', 'veo-tb-status');\n statusEl.hidden = true;\n const sep = el('span', 'veo-tb-sep');\n const appEl = el('div', 'veo-tb-app', `${svg('desktop', 16)}<span></span>`);\n (appEl.querySelector('span') as HTMLElement).textContent = opts.appLabel;\n const left = el('div', 'veo-tb-left');\n left.append(brand, nameEl, statusEl, sep, appEl);\n\n const right = el('div', 'veo-tb-right');\n const dockBtn = iconButton('updown', 'Mover la barra abajo');\n const showPanel = iconButton('map', 'Mostrar el editor');\n const preview = iconButton('eye', 'Vista previa');\n const exit = el('button', 'veo-tb-text', 'Salir');\n exit.type = 'button';\n const saveGroup = el('div', 'veo-tb-save');\n const save = el('button', 'veo-tb-save-main', '<span>Guardar</span>');\n save.type = 'button';\n const saveMore = el('button', 'veo-tb-save-more', svg('chevronDown', 16));\n saveMore.type = 'button';\n saveMore.title = 'Más opciones de guardado';\n saveMore.setAttribute('aria-label', 'Más opciones de guardado');\n const saveMenu = el('div', 'veo-tb-menu');\n const saveExit = el('button', 'veo-tb-menu-item', 'Guardar y salir');\n saveExit.type = 'button';\n saveMenu.append(saveExit);\n saveMenu.hidden = true;\n saveGroup.append(save, saveMore, saveMenu);\n right.append(dockBtn, showPanel, preview, el('span', 'veo-tb-vsep'), exit, saveGroup);\n topbar.append(left, right);\n\n // ── Fila de pasos ──\n const stepsBar = el('div', 'veo-steps');\n const stepsList = el('div', 'veo-steps-list');\n stepsBar.append(stepsList);\n\n const togglePill = el('button', 'veo-steps-toggle');\n togglePill.type = 'button';\n\n root.append(topbar, stepsBar, togglePill);\n\n // Píldora de vista previa (solo visible en ese modo).\n const previewPill = el('div', 'veo-preview-pill');\n const previewLabel = el(\n 'span',\n 'veo-preview-label',\n `${svg('eye', 18)}<span>Estás en vista previa</span>`,\n );\n const previewExit = el('button', 'veo-preview-exit', 'Salir');\n previewExit.type = 'button';\n previewPill.append(previewLabel, previewExit);\n previewPill.hidden = true;\n\n shadow.append(style, root, previewPill);\n document.body.appendChild(host);\n\n // ── Empujar la app (arriba o abajo según el anclaje) ──\n const html = document.documentElement;\n const prevMarginTop = html.style.marginTop;\n const prevMarginBottom = html.style.marginBottom;\n let collapsed = false;\n let dock: ChromeDock = 'top';\n let previewOn = false;\n let hiddenOn = false;\n let heightCb: ((h: number) => void) | null = null;\n let tagging = false;\n const height = (): number => CHROME_TOPBAR_H + (collapsed || tagging ? 0 : CHROME_STEPS_H);\n const applyHeight = (): void => {\n const h = previewOn || hiddenOn ? 0 : height();\n html.style.marginTop = dock === 'top' ? `${h}px` : prevMarginTop;\n html.style.marginBottom = dock === 'bottom' ? `${h}px` : prevMarginBottom;\n root.style.setProperty('--veo-chrome-h', `${height()}px`);\n root.classList.toggle('is-bottom', dock === 'bottom');\n stepsBar.hidden = collapsed || tagging;\n togglePill.hidden = tagging;\n // Modo tagging: sin vista previa ni Guardar (cada tag se guarda al crearse).\n preview.hidden = tagging;\n saveGroup.hidden = tagging;\n showPanel.title = tagging ? 'Mostrar el panel' : 'Mostrar el editor';\n const open = dock === 'top' ? 'chevronUp' : 'chevronDown';\n const closedIcon = dock === 'top' ? 'chevronDown' : 'chevronUp';\n togglePill.innerHTML = `<span>${collapsed ? 'Mostrar pasos' : 'Ocultar pasos'}</span>${svg(\n collapsed ? closedIcon : open,\n 16,\n )}`;\n dockBtn.title = dock === 'top' ? 'Mover la barra abajo' : 'Mover la barra arriba';\n dockBtn.setAttribute('aria-label', dockBtn.title);\n heightCb?.(h);\n };\n const setPreview = (on: boolean): void => {\n previewOn = on;\n root.hidden = on || hiddenOn;\n previewPill.hidden = !on;\n applyHeight();\n };\n const setHidden = (on: boolean): void => {\n hiddenOn = on;\n root.hidden = on || previewOn;\n applyHeight();\n };\n togglePill.addEventListener('click', () => {\n collapsed = !collapsed;\n applyHeight();\n });\n\n // ── Acciones ──\n const act = (a: ChromeAction): void => opts.onAction(a);\n dockBtn.addEventListener('click', () => {\n dock = dock === 'top' ? 'bottom' : 'top';\n applyHeight();\n act({ action: 'dock', position: dock });\n });\n showPanel.addEventListener('click', () => act({ action: 'show-panel' }));\n preview.addEventListener('click', () => act({ action: 'preview' }));\n previewExit.addEventListener('click', () => act({ action: 'exit-preview' }));\n exit.addEventListener('click', () => act({ action: 'exit' }));\n save.addEventListener('click', () => act({ action: 'save', exit: false }));\n saveMore.addEventListener('click', (e) => {\n e.stopPropagation();\n saveMenu.hidden = !saveMenu.hidden;\n });\n saveExit.addEventListener('click', () => {\n saveMenu.hidden = true;\n act({ action: 'save', exit: true });\n });\n const closeMenu = (): void => {\n saveMenu.hidden = true;\n };\n document.addEventListener('click', closeMenu);\n\n // ── Render de estado ──\n let current: EditorChromeState | null = null;\n const render = (): void => {\n const s = current;\n if (!s) return;\n const nextTagging = s.variant === 'tagging';\n if (nextTagging !== tagging) {\n tagging = nextTagging;\n applyHeight();\n }\n const date = shortDate(s.createdAt);\n nameEl.textContent = tagging\n ? s.guideName.trim() || 'Modo tagging'\n : `${s.guideName.trim() || 'Sin nombre'}${date ? ` · ${date}` : ''}`;\n if (s.status) {\n statusEl.hidden = false;\n statusEl.textContent = s.status.label;\n statusEl.dataset.tone = s.status.tone;\n statusEl.title = 'Estado de la guía (se cambia desde la lista de guías)';\n } else {\n statusEl.hidden = true;\n }\n save.innerHTML = s.saving\n ? `${svg('spinner', 16)}<span>Guardando…</span>`\n : '<span>Guardar</span>';\n save.disabled = s.saving;\n saveExit.disabled = s.saving;\n\n stepsList.replaceChildren();\n const activation = stepCard(svg('cursor', 22), 'Activación', s.section === 'activation');\n activation.addEventListener('click', () => act({ action: 'select-activation' }));\n stepsList.append(activation);\n s.steps.forEach((st, i) => {\n const thumb =\n st.presentation === 'inline'\n ? '<div class=\"veo-thumb veo-thumb-inline\"><i></i><i></i><i></i></div>'\n : '<div class=\"veo-thumb\"><i></i><i></i><b></b></div>';\n // «Estructura» es una vista del paso activo: la fila de pasos lo sigue marcando.\n const isStepView =\n s.section === 'step' ||\n s.section === 'block' ||\n s.section === 'add-block' ||\n s.section === 'row' ||\n s.section === 'structure';\n const card = stepCard(thumb, st.label, isStepView && s.activeStep === i, {\n // Se pueden borrar TODOS los pasos (el panel vuelve a Activación).\n canRemove: true,\n onEdit: () => act({ action: 'select-step', index: i }),\n onDuplicate: () => act({ action: 'duplicate-step', index: i }),\n onRemove: () => act({ action: 'remove-step', index: i }),\n });\n stepsList.append(card);\n });\n const add = el('button', 'veo-step-add', `${svg('plus', 18)}<span>Agregar paso</span>`);\n add.type = 'button';\n add.addEventListener('click', () => act({ action: 'add-step' }));\n stepsList.append(add);\n };\n\n applyHeight();\n\n return {\n setState: (state) => {\n current = state;\n render();\n },\n height,\n dock: () => dock,\n setPreview,\n setHidden,\n onHeightChange: (cb) => {\n heightCb = cb;\n },\n teardown: () => {\n document.removeEventListener('click', closeMenu);\n html.style.marginTop = prevMarginTop;\n html.style.marginBottom = prevMarginBottom;\n host.remove();\n },\n };\n}\n\ninterface StepCardActions {\n canRemove: boolean;\n onEdit: () => void;\n onDuplicate: () => void;\n onRemove: () => void;\n}\n\n/**\n * Tarjeta de la fila de pasos. Sin `actions` es un botón simple (Activación).\n * Con `actions` es un paso: al pasar el mouse (o enfocar) aparece la capa\n * oscura con «Editar», duplicar y eliminar. Un clic en cualquier parte de la\n * tarjeta que no sea un botón de la capa también edita.\n */\nfunction stepCard(\n inner: string,\n label: string,\n active: boolean,\n actions?: StepCardActions,\n): HTMLElement {\n const cls = `veo-step${active ? ' is-active' : ''}`;\n if (!actions) {\n const b = el(\n 'button',\n cls,\n `<div class=\"veo-step-box\">${inner}</div><span class=\"veo-step-label\"></span>`,\n );\n b.type = 'button';\n (b.querySelector('.veo-step-label') as HTMLElement).textContent = label;\n b.setAttribute('aria-pressed', active ? 'true' : 'false');\n return b;\n }\n const card = el(\n 'div',\n cls,\n `<div class=\"veo-step-box\">${inner}` +\n '<div class=\"veo-step-hover\">' +\n '<div class=\"veo-step-hover-top\">' +\n `<button type=\"button\" class=\"veo-step-icon veo-step-remove\" title=\"Eliminar paso\" aria-label=\"Eliminar paso\">${svg('trash', 14)}</button>` +\n `<button type=\"button\" class=\"veo-step-icon veo-step-duplicate\" title=\"Duplicar paso\" aria-label=\"Duplicar paso\">${svg('copy', 14)}</button>` +\n '</div>' +\n '<div class=\"veo-step-hover-main\">' +\n `<button type=\"button\" class=\"veo-step-edit\">${svg('pencil', 14)}<span>Editar</span></button>` +\n '</div>' +\n '</div></div><span class=\"veo-step-label\"></span>',\n );\n (card.querySelector('.veo-step-label') as HTMLElement).textContent = label;\n card.setAttribute('aria-current', active ? 'step' : 'false');\n const remove = card.querySelector('.veo-step-remove') as HTMLButtonElement;\n remove.disabled = !actions.canRemove;\n if (!actions.canRemove) remove.title = 'La guía necesita al menos un paso';\n const on = (sel: string, fn: () => void): void => {\n card.querySelector(sel)?.addEventListener('click', (e) => {\n e.stopPropagation();\n fn();\n });\n };\n on('.veo-step-edit', actions.onEdit);\n on('.veo-step-duplicate', actions.onDuplicate);\n on('.veo-step-remove', actions.onRemove);\n card.addEventListener('click', actions.onEdit);\n return card;\n}\n\nconst CHROME_CSS = `\n:host { all: initial; }\n.veo-chrome {\n position: fixed; top: 0; left: 0; right: 0;\n display: flex; flex-direction: column;\n z-index: 2147483646;\n font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif;\n font-size: 14px; color: #1c1917;\n}\n.veo-chrome[hidden] { display: none; }\n/* Modo tagging oculta controles por atributo: gana a los display de sus clases. */\n.veo-chrome [hidden], .veo-steps-toggle[hidden] { display: none !important; }\n.veo-chrome.is-bottom { top: auto; bottom: 0; flex-direction: column-reverse; }\n.veo-chrome.is-bottom .veo-tb-menu { top: auto; bottom: calc(100% + 8px); }\n.veo-chrome.is-bottom .veo-steps { border-bottom: 0; border-top: 1px solid #d6cfc8; }\n.veo-chrome.is-bottom .veo-steps-toggle { top: auto; bottom: var(--veo-chrome-h, ${CHROME_TOPBAR_H + CHROME_STEPS_H}px); transform: translate(-50%, 50%); }\n.veo-preview-pill {\n position: fixed; top: 28px; left: 50%; transform: translateX(-50%);\n z-index: 2147483646;\n display: inline-flex; align-items: center; gap: 12px;\n background: #2b2623; color: #fff; border-radius: 999px; padding: 12px 20px;\n font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif; font-size: 15px; font-weight: 500;\n box-shadow: 0 8px 24px rgba(0,0,0,0.3);\n}\n.veo-preview-pill[hidden] { display: none; }\n.veo-preview-label { display: inline-flex; align-items: center; gap: 10px; padding-right: 12px; border-right: 1px solid rgba(255,255,255,0.3); }\n.veo-preview-exit { border: 0; background: transparent; color: #fff; font: inherit; cursor: pointer; padding: 0 2px; }\n.veo-preview-exit:hover { text-decoration: underline; }\n.veo-tb {\n height: ${CHROME_TOPBAR_H}px; box-sizing: border-box;\n display: flex; align-items: center; justify-content: space-between;\n padding: 0 20px; gap: 16px;\n background: #2b2623; color: #fff;\n}\n.veo-tb-left, .veo-tb-right { display: flex; align-items: center; gap: 12px; min-width: 0; }\n.veo-tb-brand {\n width: 36px; height: 36px; border-radius: 999px; background: #b74d00;\n display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto;\n}\n.veo-tb-name { font-weight: 700; font-size: 16px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.veo-tb-status { display: inline-flex; align-items: center; padding: 2px 8px; border-radius: 999px; font-size: 11px; font-weight: 600; letter-spacing: 0.02em; white-space: nowrap; background: rgba(255,255,255,0.18); color: #fff; }\n.veo-tb-status[data-tone=\"live\"] { background: #16a34a; }\n.veo-tb-status[data-tone=\"testing\"] { background: #b45309; }\n.veo-tb-status[data-tone=\"review\"] { background: #7c3aed; }\n.veo-tb-status[data-tone=\"draft\"] { background: #0f766e; }\n.veo-tb-status[data-tone=\"paused\"] { background: rgba(255,255,255,0.28); }\n.veo-tb-sep { width: 1px; height: 24px; background: rgba(255,255,255,0.25); }\n.veo-tb-vsep { width: 1px; height: 28px; background: rgba(255,255,255,0.25); margin: 0 4px; }\n.veo-tb-app { display: inline-flex; align-items: center; gap: 8px; color: rgba(255,255,255,0.85); white-space: nowrap; }\n.veo-tb-icon {\n width: 42px; height: 42px; border-radius: 10px; border: 0;\n background: rgba(255,255,255,0.12); color: #fff; cursor: pointer;\n display: inline-flex; align-items: center; justify-content: center;\n}\n.veo-tb-icon:hover { background: rgba(255,255,255,0.22); }\n.veo-tb-text { border: 0; background: transparent; color: #fff; font: inherit; font-size: 15px; cursor: pointer; padding: 8px 6px; }\n.veo-tb-text:hover { text-decoration: underline; }\n.veo-tb-save { position: relative; display: inline-flex; border-radius: 10px; overflow: visible; }\n.veo-tb-save-main, .veo-tb-save-more {\n border: 0; background: #b74d00; color: #fff; font: inherit; font-weight: 600; font-size: 15px;\n cursor: pointer; display: inline-flex; align-items: center; gap: 8px; height: 42px;\n}\n.veo-tb-save-main { padding: 0 8px 0 18px; border-radius: 10px 0 0 10px; }\n.veo-tb-save-more { padding: 0 12px 0 6px; border-radius: 0 10px 10px 0; }\n.veo-tb-save-main:hover, .veo-tb-save-more:hover { background: #953c00; }\n.veo-tb-save-main:disabled { opacity: 0.7; cursor: default; }\n.veo-tb-menu {\n position: absolute; right: 0; top: calc(100% + 8px); min-width: 220px;\n background: #fff; color: #1c1917; border-radius: 12px; padding: 6px;\n box-shadow: 0 12px 32px rgba(0,0,0,0.22);\n}\n.veo-tb-menu-item {\n display: block; width: 100%; text-align: left; border: 0; background: transparent;\n font: inherit; font-size: 15px; padding: 10px 14px; border-radius: 8px; cursor: pointer;\n}\n.veo-tb-menu-item:hover { background: #f5efe9; }\n.veo-steps {\n height: ${CHROME_STEPS_H}px; box-sizing: border-box;\n background: #e7e1dc; border-bottom: 1px solid #d6cfc8;\n padding: 16px 28px 0; overflow-x: auto;\n}\n.veo-steps[hidden] { display: none; }\n.veo-steps-list { display: flex; align-items: flex-start; gap: 20px; }\n.veo-step { border: 0; background: transparent; padding: 0; cursor: pointer; font: inherit; display: flex; flex-direction: column; align-items: center; gap: 8px; flex: 0 0 auto; }\n.veo-step-box {\n position: relative; overflow: hidden;\n width: 116px; height: 64px; border-radius: 10px; background: #fff; border: 2px solid transparent;\n display: flex; align-items: center; justify-content: center; color: #2b2623;\n box-shadow: 0 1px 2px rgba(0,0,0,0.06);\n}\n/* Capa de acciones del paso: aparece al pasar el mouse o al enfocar un botón. */\n.veo-step-hover {\n position: absolute; inset: 0; background: #2b2623; border-radius: 8px;\n display: flex; flex-direction: column; padding: 3px 4px 6px; box-sizing: border-box;\n opacity: 0; transition: opacity 120ms ease-out;\n}\n.veo-step:hover .veo-step-hover, .veo-step:focus-within .veo-step-hover { opacity: 1; }\n.veo-step-hover-top { display: flex; justify-content: space-between; align-items: center; }\n.veo-step-hover-main { flex: 1; display: flex; align-items: center; justify-content: center; }\n.veo-step-icon {\n border: 0; background: transparent; color: #fff; cursor: pointer; padding: 0;\n width: 20px; height: 20px; border-radius: 5px; display: inline-flex; align-items: center; justify-content: center;\n}\n.veo-step-icon:hover { background: rgba(255,255,255,0.14); }\n.veo-step-icon:disabled { opacity: 0.35; cursor: default; background: transparent; }\n.veo-step-edit {\n width: 100%; margin: 0 6px; border: 0; background: #dbeefc; color: #1d6fb8; font: inherit; font-size: 13px; font-weight: 600;\n border-radius: 6px; padding: 5px 10px; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; gap: 6px;\n}\n.veo-step-edit:hover { background: #cbe4f9; }\n.veo-step.is-active .veo-step-box { border-color: #b74d00; }\n.veo-step-label { font-size: 13px; color: #6b635d; }\n.veo-step.is-active .veo-step-label { color: #2b2623; font-weight: 600; }\n.veo-thumb { width: 72px; height: 36px; border: 1.5px solid #c9c2bb; border-radius: 6px; padding: 6px 7px; box-sizing: border-box; display: flex; flex-direction: column; gap: 4px; }\n.veo-thumb i { display: block; height: 3px; border-radius: 2px; background: #2b2623; width: 70%; }\n.veo-thumb i + i { width: 45%; background: #c9c2bb; }\n.veo-thumb b { display: block; height: 6px; width: 24px; border-radius: 2px; background: #b74d00; align-self: flex-end; }\n.veo-thumb-inline { border-style: dashed; }\n.veo-thumb-inline i { width: 100%; }\n.veo-step-add { border: 0; background: transparent; font: inherit; font-size: 15px; color: #6b635d; cursor: pointer; display: inline-flex; align-items: center; gap: 8px; height: 64px; padding: 0 8px; }\n.veo-step-add:hover { color: #2b2623; }\n.veo-steps-toggle {\n position: absolute; left: 50%; top: var(--veo-chrome-h, ${CHROME_TOPBAR_H + CHROME_STEPS_H}px);\n transform: translate(-50%, -50%);\n border: 0; background: #2b2623; color: #fff; font: inherit; font-size: 14px; font-weight: 500;\n border-radius: 999px; padding: 10px 18px; cursor: pointer;\n display: inline-flex; align-items: center; gap: 8px;\n box-shadow: 0 6px 18px rgba(0,0,0,0.25);\n}\n`;\n","/**\n * Modo \"panel inyectado\" (editor en la pestaña de la app).\n *\n * La app es la pestaña top-level (login real) y el editor de Veo se inyecta\n * ENCIMA como una tarjeta flotante **arrastrable y redimensionable** (un iframe\n * al dashboard). Además se puede **sacar a una ventana independiente** del\n * navegador (\"pop-out\").\n *\n * El panel corre en el origen del dashboard (sesión de Veo para guardar guías) y\n * habla con la app (`window.parent` si está anclado, `window.opener` si está en\n * ventana aparte) por el puente postMessage. Este módulo inyecta/gestiona el\n * panel y expone su ventana destino.\n */\nimport { hasDocument, hasWindow } from '../../utils/safe-env';\n\nconst DEFAULT_PANEL_PATH = '/guides/design';\nconst PANEL_W = 484;\nconst PANEL_H = 660;\nconst MIN_W = 320;\nconst MIN_H = 320;\nconst MARGIN = 16;\n/** Alto del header propio del panel (drag + acciones). */\nconst HEADER_H = 52;\n\nexport interface BuilderPanelOptions {\n dashboardOrigin: string;\n token: string;\n appOrigin: string;\n guide: string | null;\n panelPath: string | null;\n onClose: () => void;\n /** Alto ocupado arriba por el chrome del editor (el panel arranca debajo). */\n topOffset?: number;\n}\n\nexport interface BuilderPanelHandle {\n /** Ventana destino de los mensajes: el iframe anclado o la ventana pop-out. */\n target(): Window | null;\n /**\n * Rect del IFRAME del panel en coordenadas de la página de la app, o `null`\n * si el editor está en pop-out (ventana aparte: no hay mapeo de coordenadas).\n * Lo usa el drag de bloques para convertir el puntero panel → página.\n */\n frameRect(): DOMRect | null;\n /** Quita el panel del DOM (y cierra la ventana pop-out si hay). */\n teardown(): void;\n /** Título del header (lo publica el editor: «Ajustes de activación», «Paso 1»…). */\n setTitle(title: string): void;\n /** Muestra/oculta la tarjeta (el estado del editor se conserva en el iframe). */\n setVisible(visible: boolean): void;\n isVisible(): boolean;\n /** Reposiciona el tope mínimo cuando el chrome cambia de alto. */\n setTopOffset(px: number): void;\n /**\n * Tamaño COMPACTO pedido por el editor (p. ej. «Estructura», un popover\n * chico): `height` es el alto del contenido, el header se suma acá. `null`\n * restaura el tamaño que tenía. Se ignora maximizado o en pop-out.\n */\n setSize(size: { width: number; height: number } | null): void;\n}\n\n/** Inyecta el panel del editor (arrastrable, redimensionable, pop-out). */\nexport function injectBuilderPanel(opts: BuilderPanelOptions): BuilderPanelHandle {\n if (!hasWindow() || !hasDocument()) {\n return {\n target: () => null,\n frameRect: () => null,\n teardown: () => {},\n setTitle: () => {},\n setVisible: () => {},\n isVisible: () => false,\n setTopOffset: () => {},\n setSize: () => {},\n };\n }\n\n const panelUrl = buildPanelUrl(opts);\n\n const host = document.createElement('div');\n host.setAttribute('data-veo-builder-panel', '');\n const shadow = host.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = PANEL_CSS;\n\n const card = document.createElement('div');\n card.className = 'veo-panel';\n let topOffset = opts.topOffset ?? 0;\n // Mock: la tarjeta arranca a la IZQUIERDA, justo debajo del chrome.\n let left = 40;\n let top = topOffset + MARGIN;\n card.style.left = `${left}px`;\n card.style.top = `${top}px`;\n card.style.width = `${PANEL_W}px`;\n card.style.height = `${PANEL_H}px`;\n\n // Header (mock 2026-09): grip «···» arriba al centro, título a la izquierda y\n // a la derecha pop-out · maximizar · minimizar.\n const header = document.createElement('div');\n header.className = 'veo-panel-header';\n const grip = document.createElement('span');\n grip.className = 'veo-panel-grip';\n grip.setAttribute('aria-hidden', 'true');\n grip.textContent = '···';\n const title = document.createElement('span');\n title.className = 'veo-panel-title';\n title.textContent = 'OnUser · Editor';\n const actions = document.createElement('div');\n actions.className = 'veo-panel-actions';\n const popout = panelButton(ICON_POPOUT, 'Abrir en ventana aparte');\n const maximize = panelButton(ICON_EXPAND, 'Maximizar');\n const minimize = panelButton(ICON_MINUS, 'Minimizar');\n actions.append(popout, maximize, minimize);\n header.append(grip, title, actions);\n\n const iframe = document.createElement('iframe');\n iframe.className = 'veo-panel-frame';\n iframe.title = 'Editor de Veo';\n iframe.src = panelUrl;\n\n const resizeGrip = document.createElement('div');\n resizeGrip.className = 'veo-panel-resize';\n resizeGrip.setAttribute('aria-hidden', 'true');\n\n card.append(header, iframe, resizeGrip);\n shadow.append(style, card);\n document.body.appendChild(host);\n\n // ── Minimizar / maximizar ───────────────────────────────────────────────\n let visible = true;\n let maximized = false;\n let restore: { left: number; top: number; w: number; h: number } | null = null;\n const setVisible = (next: boolean): void => {\n visible = next;\n card.style.display = next && !(popped && !popped.closed) ? '' : 'none';\n };\n minimize.addEventListener('click', () => setVisible(false));\n // Tamaño compacto (ver BuilderPanelHandle.setSize): recuerda el tamaño previo\n // la primera vez y lo restaura con `null`. Levanta el alto mínimo mientras\n // dura, para que un popover chico pueda ser chico de verdad.\n let compactRestore: { w: number; h: number } | null = null;\n const setSize = (size: { width: number; height: number } | null): void => {\n if (maximized || (popped && !popped.closed)) return;\n if (size) {\n if (!compactRestore) compactRestore = { w: card.offsetWidth, h: card.offsetHeight };\n card.style.minHeight = '0';\n card.style.width = `${clamp(Math.round(size.width), MIN_W, window.innerWidth - MARGIN * 2)}px`;\n card.style.height = `${clamp(Math.round(size.height) + HEADER_H, HEADER_H + 80, window.innerHeight - top - MARGIN)}px`;\n } else if (compactRestore) {\n card.style.minHeight = '';\n card.style.width = `${compactRestore.w}px`;\n card.style.height = `${compactRestore.h}px`;\n compactRestore = null;\n }\n };\n maximize.addEventListener('click', () => {\n maximized = !maximized;\n if (maximized) {\n restore = { left, top, w: card.offsetWidth, h: card.offsetHeight };\n left = MARGIN;\n top = topOffset + MARGIN;\n card.style.left = `${left}px`;\n card.style.top = `${top}px`;\n card.style.width = `${Math.max(MIN_W, window.innerWidth - MARGIN * 2)}px`;\n card.style.height = `${Math.max(MIN_H, window.innerHeight - top - MARGIN)}px`;\n maximize.title = 'Restaurar';\n } else if (restore) {\n left = restore.left;\n top = restore.top;\n card.style.left = `${left}px`;\n card.style.top = `${top}px`;\n card.style.width = `${restore.w}px`;\n card.style.height = `${restore.h}px`;\n maximize.title = 'Maximizar';\n }\n });\n\n // ── Pop-out: sacar el editor a una ventana independiente ────────────────\n let popped: Window | null = null;\n let pollTimer: ReturnType<typeof setInterval> | undefined;\n\n const stopPoll = (): void => {\n if (pollTimer !== undefined) {\n clearInterval(pollTimer);\n pollTimer = undefined;\n }\n };\n\n popout.addEventListener('click', () => {\n const win = window.open(\n panelUrl,\n 'veo-editor',\n `popup,width=${Math.round(card.offsetWidth)},height=${Math.round(card.offsetHeight) + 60}`,\n );\n if (!win) return; // bloqueado por el navegador\n popped = win;\n card.style.display = 'none'; // el editor ahora vive en la ventana aparte\n pollTimer = setInterval(() => {\n if (popped?.closed) {\n stopPoll();\n opts.onClose(); // cerrar la ventana = salir del modo editor\n }\n }, 600);\n });\n\n // ── Arrastre por el header ──────────────────────────────────────────────\n header.addEventListener('mousedown', (e) => {\n if ((e.target as HTMLElement)?.closest('.veo-panel-btn')) return;\n e.preventDefault();\n const sx = e.clientX;\n const sy = e.clientY;\n const ol = left;\n const ot = top;\n iframe.style.pointerEvents = 'none';\n const move = (ev: MouseEvent): void => {\n left = clamp(ol + (ev.clientX - sx), 0, Math.max(0, window.innerWidth - card.offsetWidth));\n top = clamp(ot + (ev.clientY - sy), topOffset, Math.max(topOffset, window.innerHeight - 40));\n card.style.left = `${left}px`;\n card.style.top = `${top}px`;\n };\n const up = (): void => {\n window.removeEventListener('mousemove', move);\n window.removeEventListener('mouseup', up);\n iframe.style.pointerEvents = '';\n };\n window.addEventListener('mousemove', move);\n window.addEventListener('mouseup', up);\n });\n\n // ── Redimensionar por el grip (esquina inferior derecha) ────────────────\n resizeGrip.addEventListener('mousedown', (e) => {\n e.preventDefault();\n e.stopPropagation();\n const sx = e.clientX;\n const sy = e.clientY;\n const sw = card.offsetWidth;\n const sh = card.offsetHeight;\n iframe.style.pointerEvents = 'none';\n const move = (ev: MouseEvent): void => {\n card.style.width = `${clamp(sw + (ev.clientX - sx), MIN_W, window.innerWidth)}px`;\n card.style.height = `${clamp(sh + (ev.clientY - sy), MIN_H, window.innerHeight)}px`;\n };\n const up = (): void => {\n window.removeEventListener('mousemove', move);\n window.removeEventListener('mouseup', up);\n iframe.style.pointerEvents = '';\n };\n window.addEventListener('mousemove', move);\n window.addEventListener('mouseup', up);\n });\n\n return {\n target: () => (popped && !popped.closed ? popped : iframe.contentWindow),\n frameRect: () => (popped && !popped.closed ? null : iframe.getBoundingClientRect()),\n teardown: () => {\n stopPoll();\n if (popped && !popped.closed) popped.close();\n host.remove();\n },\n setTitle: (t) => {\n title.textContent = t;\n },\n setVisible,\n setSize,\n isVisible: () => visible,\n setTopOffset: (px) => {\n topOffset = px;\n if (top < topOffset + MARGIN) {\n top = topOffset + MARGIN;\n card.style.top = `${top}px`;\n }\n },\n };\n}\n\nconst ICON_POPOUT =\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m6.75 7.5 3 2.25-3 2.25m4.5 0h3m-9 8.25h13.5A2.25 2.25 0 0 0 21 18V6a2.25 2.25 0 0 0-2.25-2.25H5.25A2.25 2.25 0 0 0 3 6v12a2.25 2.25 0 0 0 2.25 2.25Z\"/>';\nconst ICON_EXPAND =\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15\"/>';\nconst ICON_MINUS = '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M5 12h14\"/>';\n\nfunction panelButton(iconPath: string, label: string): HTMLButtonElement {\n const b = document.createElement('button');\n b.className = 'veo-panel-btn';\n b.type = 'button';\n b.title = label;\n b.setAttribute('aria-label', label);\n b.innerHTML =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" ' +\n `fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" aria-hidden=\"true\">${iconPath}</svg>`;\n return b;\n}\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.min(Math.max(v, min), max);\n}\n\nfunction buildPanelUrl(opts: BuilderPanelOptions): string {\n const path = opts.panelPath ?? DEFAULT_PANEL_PATH;\n const url = new URL(path, opts.dashboardOrigin);\n url.searchParams.set('veoToken', opts.token);\n url.searchParams.set('veoApp', opts.appOrigin);\n if (opts.guide) url.searchParams.set('veoGuide', opts.guide);\n return url.toString();\n}\n\nconst PANEL_CSS = `\n:host { all: initial; }\n.veo-panel {\n position: fixed;\n min-width: ${MIN_W}px; min-height: ${MIN_H}px;\n max-width: 96vw; max-height: 94vh;\n display: flex; flex-direction: column;\n background: #fff;\n border-radius: 14px;\n box-shadow: 0 12px 40px rgba(0,0,0,0.22);\n overflow: hidden;\n z-index: 2147483647;\n font-family: system-ui, -apple-system, sans-serif;\n}\n.veo-panel-header {\n position: relative; flex: 0 0 auto; height: ${HEADER_H}px; box-sizing: border-box;\n display: flex; align-items: center; justify-content: space-between;\n padding: 10px 14px 0 22px;\n background: #fbf8f5; color: #1c1917; border-bottom: 1px solid #e8e2dc;\n font-size: 17px; font-weight: 700;\n cursor: grab;\n}\n.veo-panel-header:active { cursor: grabbing; }\n.veo-panel-grip {\n position: absolute; top: 0; left: 50%; transform: translateX(-50%);\n color: #b5aca4; font-size: 14px; letter-spacing: 1px; line-height: 12px;\n}\n.veo-panel-title { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.veo-panel-actions { display: flex; gap: 2px; }\n.veo-panel-btn {\n border: 0; background: transparent; color: #4b4540;\n cursor: pointer; line-height: 1; display: inline-flex; align-items: center;\n padding: 6px; border-radius: 8px;\n}\n.veo-panel-btn:hover { background: rgba(0,0,0,0.06); color: #1c1917; }\n.veo-panel-frame { flex: 1 1 auto; width: 100%; border: 0; background: #fff; }\n.veo-panel-resize {\n position: absolute; right: 0; bottom: 0;\n width: 16px; height: 16px;\n cursor: nwse-resize;\n background:\n linear-gradient(135deg, transparent 50%, rgba(0,0,0,0.25) 50%, rgba(0,0,0,0.25) 60%,\n transparent 60%, transparent 72%, rgba(0,0,0,0.25) 72%, rgba(0,0,0,0.25) 82%, transparent 82%);\n}\n`;\n","/**\n * Manipulación DIRECTA del diseño en modo editor: arrastrar la tarjeta de una\n * modal para posicionarla, redimensionarla desde bordes/esquinas, y arrastrar\n * un banner para alternar top/bottom. Vive en el bundle builder (veo-builder.js)\n * — el runtime de guías no carga nada de esto.\n *\n * Funciona como DECORATOR: se adjunta DESPUÉS del render sobre el shadow root\n * abierto del host de la guía (no toca los renderers). Durante el gesto aplica\n * las variables CSS localmente (feedback a 60fps, sin postMessage); al soltar\n * (`pointerup`) emite UN `onCommit(patch)` con los valores finales, que el\n * builder-mode postea al panel como `design-updated`. El panel actualiza su\n * estado y re-manda `preview` — que entra por el update in-place con las\n * MISMAS variables → no hay loop ni parpadeo.\n *\n * Geometría del modal (ver styles.ts): la card usa `left: posX%` +\n * `translate(-posX%)`, o sea `cardLeft = posX * (viewportW - cardW)` →\n * `posX = cardLeft / (viewportW - cardW)`. Mismo modelo que serializa el\n * dashboard (`style.posX/posY` en 0..1) y consume `applyDesignVars`.\n */\nimport type { GuideType } from '../guides/types';\n\n/** Merge superficial sobre `step.style` del paso activo (lo aplica el panel). */\nexport interface DesignPatch {\n stepIndex: number;\n style: {\n posX?: number;\n posY?: number;\n width?: number;\n height?: number;\n position?: 'top' | 'bottom';\n };\n}\n\nexport interface DesignManipulatorOptions {\n /** Host de la guía (de `PreviewHandle.host()`), con shadow root abierto. */\n host: HTMLElement;\n guideType: GuideType;\n stepIndex: number;\n /** Se emite UNA vez por gesto, al soltar. */\n onCommit: (patch: DesignPatch) => void;\n /** Fin de cualquier gesto (con o sin cambios). Para aplicar previews encolados. */\n onGestureEnd?: () => void;\n}\n\nexport interface DesignManipulatorHandle {\n /** `true` mientras hay un gesto de drag/resize en curso. */\n isDragging(): boolean;\n /** Remueve handles, estilos y listeners. Idempotente. */\n detach(): void;\n}\n\nconst MIN_W = 220;\nconst MAX_W = 720;\nconst MIN_H = 120;\nconst MAX_H = 900;\n/** Zonas de agarre de los bordes (px). */\nconst EDGE = 8;\n\ntype ResizeDir = 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw';\nconst RESIZE_DIRS: ResizeDir[] = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'];\n\nconst MANIPULATOR_CSS = `\n.veo-mnp-card {\n outline: 1.5px dashed rgba(255, 91, 53, 0.75);\n outline-offset: 2px;\n}\n.veo-mnp-card:hover { cursor: move; }\n.veo-mnp-handle {\n position: absolute;\n z-index: 10;\n background: transparent;\n}\n.veo-mnp-handle::after {\n content: '';\n position: absolute;\n width: 8px; height: 8px;\n background: #fff;\n border: 1.5px solid rgba(255, 91, 53, 0.9);\n border-radius: 2px;\n top: 50%; left: 50%;\n transform: translate(-50%, -50%);\n opacity: 0;\n transition: opacity 100ms ease;\n}\n.veo-mnp-card:hover .veo-mnp-handle::after,\n.veo-mnp-handle:hover::after { opacity: 1; }\n.veo-mnp-n { top: -${EDGE / 2}px; left: ${EDGE}px; right: ${EDGE}px; height: ${EDGE}px; cursor: ns-resize; }\n.veo-mnp-s { bottom: -${EDGE / 2}px; left: ${EDGE}px; right: ${EDGE}px; height: ${EDGE}px; cursor: ns-resize; }\n.veo-mnp-e { right: -${EDGE / 2}px; top: ${EDGE}px; bottom: ${EDGE}px; width: ${EDGE}px; cursor: ew-resize; }\n.veo-mnp-w { left: -${EDGE / 2}px; top: ${EDGE}px; bottom: ${EDGE}px; width: ${EDGE}px; cursor: ew-resize; }\n.veo-mnp-ne { top: -${EDGE / 2}px; right: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nesw-resize; }\n.veo-mnp-nw { top: -${EDGE / 2}px; left: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nwse-resize; }\n.veo-mnp-se { bottom: -${EDGE / 2}px; right: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nwse-resize; }\n.veo-mnp-sw { bottom: -${EDGE / 2}px; left: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nesw-resize; }\n.veo-mnp-banner { outline: 1.5px dashed rgba(255, 91, 53, 0.75); outline-offset: -2px; cursor: grab; }\n.veo-mnp-banner:active { cursor: grabbing; }\n`;\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.min(Math.max(v, min), max);\n}\n\nfunction round3(v: number): number {\n return Math.round(v * 1000) / 1000;\n}\n\n/** true si el mousedown cayó sobre algo interactivo (no iniciar drag ahí). */\nfunction isInteractive(target: EventTarget | null): boolean {\n return Boolean(\n target instanceof Element && target.closest('button, a, input, textarea, select, label'),\n );\n}\n\n/**\n * Adjunta la manipulación directa al host de una guía montada. Devuelve el\n * handle, o `null` si el tipo de guía no la soporta o el DOM esperado no está.\n * Idempotente: si la card ya está decorada, no re-adjunta.\n */\nexport function attachDesignManipulator(\n opts: DesignManipulatorOptions,\n): DesignManipulatorHandle | null {\n const shadow = opts.host.shadowRoot;\n if (!shadow) return null;\n\n const card = shadow.querySelector<HTMLElement>('.veo-modal-card');\n if (card) return attachModal(opts, shadow, card);\n\n const banner = shadow.querySelector<HTMLElement>('.veo-banner');\n // El banner embebido se posiciona con prepend/append en el contenedor: su\n // top/bottom se cambia desde el panel (remonta). Solo el fijo se arrastra.\n if (banner && !banner.classList.contains('veo-banner-embedded')) {\n return attachBanner(opts, shadow, banner);\n }\n\n return null;\n}\n\n// ── Modal: drag libre + resize por 8 handles ────────────────────────────────\n\nfunction attachModal(\n opts: DesignManipulatorOptions,\n shadow: ShadowRoot,\n card: HTMLElement,\n): DesignManipulatorHandle | null {\n if (card.dataset.veoManipulated === '1') return null;\n card.dataset.veoManipulated = '1';\n card.classList.add('veo-mnp-card');\n\n const doc = card.ownerDocument;\n const style = doc.createElement('style');\n style.textContent = MANIPULATOR_CSS;\n shadow.appendChild(style);\n\n const handles: HTMLElement[] = [];\n for (const dir of RESIZE_DIRS) {\n const h = doc.createElement('div');\n h.className = `veo-mnp-handle veo-mnp-${dir}`;\n h.dataset.veoDir = dir;\n card.appendChild(h);\n handles.push(h);\n }\n\n let dragging = false;\n let detached = false;\n\n /** Últimos valores aplicados durante el gesto (para el commit del up). */\n let patch: DesignPatch['style'] = {};\n\n const setVars = (v: { px?: number; py?: number; w?: number; h?: number }): void => {\n const host = opts.host;\n if (v.px !== undefined) host.style.setProperty('--veo-pos-x', `${v.px * 100}%`);\n if (v.py !== undefined) host.style.setProperty('--veo-pos-y', `${v.py * 100}%`);\n if (v.w !== undefined) host.style.setProperty('--veo-width', `${v.w}px`);\n if (v.h !== undefined) host.style.setProperty('--veo-min-h', `${v.h}px`);\n };\n\n /**\n * Un gesto genérico: guarda el rect inicial, traduce cada mousemove a\n * variables CSS (rAF-throttled) y al soltar emite el commit acumulado.\n */\n const startGesture = (\n e: MouseEvent,\n apply: (dx: number, dy: number, start: DOMRect) => DesignPatch['style'],\n ): void => {\n e.preventDefault();\n e.stopPropagation();\n dragging = true;\n patch = {};\n const start = card.getBoundingClientRect();\n const sx = e.clientX;\n const sy = e.clientY;\n let raf = 0;\n let lastEv: MouseEvent | null = null;\n\n const flush = (): void => {\n raf = 0;\n if (!lastEv) return;\n const next = apply(lastEv.clientX - sx, lastEv.clientY - sy, start);\n patch = { ...patch, ...next };\n setVars({\n ...(next.posX !== undefined ? { px: next.posX } : {}),\n ...(next.posY !== undefined ? { py: next.posY } : {}),\n ...(next.width !== undefined ? { w: next.width } : {}),\n ...(next.height !== undefined ? { h: next.height } : {}),\n });\n };\n\n const move = (ev: MouseEvent): void => {\n lastEv = ev;\n // rAF-throttle del feedback; fallback síncrono si el entorno no tiene rAF.\n if (typeof window.requestAnimationFrame !== 'function') flush();\n else if (!raf) raf = window.requestAnimationFrame(flush);\n };\n const up = (): void => {\n window.removeEventListener('mousemove', move);\n window.removeEventListener('mouseup', up);\n if (raf) window.cancelAnimationFrame(raf);\n flush();\n dragging = false;\n if (Object.keys(patch).length > 0 && !detached) {\n opts.onCommit({ stepIndex: opts.stepIndex, style: patch });\n }\n opts.onGestureEnd?.();\n };\n window.addEventListener('mousemove', move);\n window.addEventListener('mouseup', up);\n };\n\n /** posX para que el borde izquierdo quede en `left` con ancho `w`. */\n const posXFor = (left: number, w: number): number => {\n const span = window.innerWidth - w;\n return span <= 0 ? 0.5 : round3(clamp(left / span, 0, 1));\n };\n const posYFor = (top: number, h: number): number => {\n const span = window.innerHeight - h;\n return span <= 0 ? 0.5 : round3(clamp(top / span, 0, 1));\n };\n\n const onCardDown = (e: MouseEvent): void => {\n if (isInteractive(e.target)) return;\n if (e.target instanceof Element && e.target.closest('.veo-mnp-handle')) return;\n startGesture(e, (dx, dy, start) => ({\n posX: posXFor(start.left + dx, start.width),\n posY: posYFor(start.top + dy, start.height),\n }));\n };\n\n const onHandleDown = (e: MouseEvent): void => {\n const dir = (e.currentTarget as HTMLElement).dataset.veoDir as ResizeDir;\n startGesture(e, (dx, dy, start) => {\n const out: DesignPatch['style'] = {};\n if (dir.includes('e')) out.width = Math.round(clamp(start.width + dx, MIN_W, MAX_W));\n if (dir.includes('w')) {\n out.width = Math.round(clamp(start.width - dx, MIN_W, MAX_W));\n // El borde derecho queda fijo: la card se re-ancla donde corresponde.\n out.posX = posXFor(start.right - out.width, out.width);\n }\n if (dir.includes('s')) out.height = Math.round(clamp(start.height + dy, MIN_H, MAX_H));\n if (dir.includes('n')) {\n out.height = Math.round(clamp(start.height - dy, MIN_H, MAX_H));\n out.posY = posYFor(start.bottom - out.height, out.height);\n }\n return out;\n });\n };\n\n card.addEventListener('mousedown', onCardDown);\n for (const h of handles) h.addEventListener('mousedown', onHandleDown);\n\n return {\n isDragging: () => dragging,\n detach: () => {\n if (detached) return;\n detached = true;\n card.removeEventListener('mousedown', onCardDown);\n for (const h of handles) h.remove();\n style.remove();\n card.classList.remove('veo-mnp-card');\n delete card.dataset.veoManipulated;\n },\n };\n}\n\n// ── Banner fijo: drag vertical con snap top/bottom ──────────────────────────\n\nfunction attachBanner(\n opts: DesignManipulatorOptions,\n shadow: ShadowRoot,\n banner: HTMLElement,\n): DesignManipulatorHandle | null {\n if (banner.dataset.veoManipulated === '1') return null;\n banner.dataset.veoManipulated = '1';\n banner.classList.add('veo-mnp-banner');\n\n const doc = banner.ownerDocument;\n const style = doc.createElement('style');\n style.textContent = MANIPULATOR_CSS;\n shadow.appendChild(style);\n\n let dragging = false;\n let detached = false;\n\n const positionOf = (): 'top' | 'bottom' =>\n banner.classList.contains('veo-banner-bottom') ? 'bottom' : 'top';\n\n const onDown = (e: MouseEvent): void => {\n if (isInteractive(e.target)) return;\n e.preventDefault();\n dragging = true;\n const startPos = positionOf();\n let current = startPos;\n\n const move = (ev: MouseEvent): void => {\n // Snap: la mitad del viewport decide top/bottom, con feedback en vivo.\n const next = ev.clientY < window.innerHeight / 2 ? 'top' : 'bottom';\n if (next !== current) {\n current = next;\n banner.classList.remove('veo-banner-top', 'veo-banner-bottom');\n banner.classList.add(`veo-banner-${next}`);\n }\n };\n const up = (): void => {\n window.removeEventListener('mousemove', move);\n window.removeEventListener('mouseup', up);\n dragging = false;\n if (current !== startPos && !detached) {\n opts.onCommit({ stepIndex: opts.stepIndex, style: { position: current } });\n }\n opts.onGestureEnd?.();\n };\n window.addEventListener('mousemove', move);\n window.addEventListener('mouseup', up);\n };\n\n banner.addEventListener('mousedown', onDown);\n\n return {\n isDragging: () => dragging,\n detach: () => {\n if (detached) return;\n detached = true;\n banner.removeEventListener('mousedown', onDown);\n style.remove();\n banner.classList.remove('veo-mnp-banner');\n delete banner.dataset.veoManipulated;\n },\n };\n}\n","/**\n * Qué cuenta como \"elemento interactivo\" para el tagueo de features: los\n * controles sobre los que un usuario actúa (botones, enlaces, campos,\n * formularios, controles ARIA…). Un `div` o `span` a secas no lo es: taguear\n * eso no mide ninguna acción y además rara vez genera eventos de autocapture\n * (ver `findMeaningfulAncestor` en `autocapture/dom-listener.ts`, que sube\n * hasta el mismo tipo de elementos antes de emitir `$autocapture`).\n *\n * Lo usan el picker (modo `only: 'interactive'`: al pasar el mouse sobre un\n * `<span>` dentro de un botón se resalta el botón) y `scan-page` (inventario\n * de candidatos a feature de la página).\n */\n\nconst INTERACTIVE_ROLES = [\n 'button',\n 'link',\n 'tab',\n 'menuitem',\n 'menuitemcheckbox',\n 'menuitemradio',\n 'checkbox',\n 'radio',\n 'switch',\n 'option',\n 'combobox',\n 'textbox',\n 'searchbox',\n 'slider',\n 'spinbutton',\n];\n\n/** Selector CSS de los elementos interactivos (para `querySelectorAll`/`closest`). */\nexport const INTERACTIVE_SELECTOR = [\n 'button',\n 'a[href]',\n 'input:not([type=\"hidden\"])',\n 'select',\n 'textarea',\n 'form',\n 'summary',\n '[contenteditable=\"true\"]',\n '[onclick]',\n '[data-veo-tag]',\n ...INTERACTIVE_ROLES.map((r) => `[role=\"${r}\"]`),\n].join(', ');\n\n/** ¿El elemento es interactivo por sí mismo? */\nexport function isInteractiveElement(element: Element): boolean {\n try {\n return element.matches(INTERACTIVE_SELECTOR);\n } catch {\n return false;\n }\n}\n\n/**\n * El elemento interactivo más cercano: el propio elemento o su ancestro\n * interactivo más próximo (`<span>` dentro de `<button>` → el botón).\n * `null` si no hay ninguno (zona no interactiva de la página).\n */\nexport function closestInteractive(element: Element): Element | null {\n try {\n return element.closest(INTERACTIVE_SELECTOR);\n } catch {\n return null;\n }\n}\n\n/**\n * Emojis y pictogramas (⚙️ 👥 ✅ …) + sus acompañantes invisibles: selectores\n * de variante (U+FE0F), ZWJ (U+200D), modificadores de tono y el «combinador»\n * de teclas (U+20E3). Es lo que la gente pone como icono dentro del texto de\n * un botón o link y no forma parte del nombre de la acción.\n */\nconst EMOJI_RE = /\\p{Extended_Pictographic}|\\p{Emoji_Modifier}|\\u{FE0F}|\\u{200D}|\\u{20E3}/gu;\n\n/**\n * Texto \"humano\" de un elemento para nombrar una feature: sin emojis ni\n * iconos, con los espacios colapsados y recortado a `max`. Si el elemento no\n * tiene texto (botón de solo icono), usa `aria-label` o `title`.\n */\nexport function elementLabelText(element: Element, max = 120): string {\n const clean = (raw: string | null | undefined): string =>\n (raw ?? '').replace(EMOJI_RE, '').replace(/\\s+/g, ' ').trim();\n const text = clean(element.textContent);\n if (text) return text.slice(0, max);\n const fallback =\n clean(element.getAttribute('aria-label')) || clean(element.getAttribute('title'));\n return fallback.slice(0, max);\n}\n","/**\n * Element picker — el \"inspeccionar\" del navegador, pero del SDK. Corre\n * DENTRO de la app del cliente (no en el dashboard: son orígenes distintos\n * y el dashboard no puede leer el DOM de la app). Resalta el elemento bajo\n * el cursor, muestra su selector + dimensiones, y al hacer click captura un\n * selector CSS estable reutilizando `buildSelectorPath` del autocapture.\n *\n * Es la base del builder no-code: el dashboard abre la app del cliente en\n * modo builder, el usuario \"pincha\" un elemento y el selector resultante se\n * usa como ancla de un tooltip/walkthrough. El puente con el dashboard\n * (postMessage) es la fase siguiente; aquí exponemos el primitivo\n * `startElementPicker(onPick)`.\n *\n * No usa `innerHTML` — todo por `textContent`/DOM, igual que los renderers.\n */\n\nimport { hasDocument } from '../../utils/safe-env';\nimport { buildSelectorPath, filterHumanClasses } from '../autocapture/selector-builder';\nimport { closestInteractive, elementLabelText } from './interactive-elements';\n\n/** z-index por encima de las guías (2147483640) para tapar también una preview. */\nconst PICKER_Z = 2147483646;\nconst PICKER_HOST_ATTR = 'data-veo-picker';\nconst DEFAULT_MAX_ANCESTORS = 5;\n\n/** Datos del elemento elegido que se entregan al caller. */\nexport interface PickedElement {\n /** Selector CSS estable con ancestros (lo que se guarda como ancla). */\n selector: string;\n /** Selector corto solo del elemento (tag + id/atributo/clases). */\n shortSelector: string;\n tag: string;\n id: string | null;\n classes: string[];\n text: string;\n rect: { x: number; y: number; width: number; height: number };\n}\n\nexport interface ElementPickerOptions {\n /** Llamado al hacer click en un elemento. El picker se cierra tras esto. */\n onPick: (picked: PickedElement) => void;\n /** Llamado al cancelar (Esc). El picker se cierra. */\n onCancel?: () => void;\n /** Niveles de ancestros del selector. Default 5 (igual que autocapture). */\n maxAncestors?: number;\n /** Título del banner superior. Default en español. */\n hint?: string;\n /** Subtítulo del banner (default: cómo abrir menús con Alt + clic). */\n subhint?: string;\n /**\n * `'interactive'`: solo se pueden elegir elementos interactivos (botones,\n * enlaces, campos, formularios, controles ARIA…); al pasar sobre un hijo\n * (p. ej. el `<span>` de un botón) se resalta el control que lo contiene, y\n * sobre zonas no interactivas no se resalta ni se puede elegir nada.\n * Default: cualquier elemento (anclas de guías).\n */\n only?: 'interactive';\n}\n\nexport interface ElementPickerHandle {\n /** Cierra el picker sin elegir nada. Idempotente. */\n stop(): void;\n}\n\nconst PICKER_STYLES = `\n:host { all: initial; }\n.veo-pick-box {\n position: fixed;\n z-index: ${PICKER_Z};\n pointer-events: none;\n box-sizing: border-box;\n background: transparent;\n border: 3px dashed #b74d00;\n border-radius: 8px;\n transition: top 60ms ease-out, left 60ms ease-out, width 60ms ease-out, height 60ms ease-out;\n}\n.veo-pick-label {\n position: fixed;\n z-index: ${PICKER_Z};\n pointer-events: none;\n max-width: 360px;\n background: #2b2623;\n color: #f5efe9;\n font: 12px/1.45 ui-monospace, SFMono-Regular, Menlo, monospace;\n padding: 6px 9px;\n border-radius: 6px;\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.35);\n}\n.veo-pick-label .veo-pick-sel { color: #ffd1ad; word-break: break-all; }\n.veo-pick-label .veo-pick-dim { color: #c9c2bb; margin-top: 3px; }\n.veo-pick-hint {\n position: fixed;\n top: 28px;\n left: 50%;\n transform: translateX(-50%);\n z-index: ${PICKER_Z};\n pointer-events: none;\n display: flex; align-items: center; gap: 16px;\n max-width: min(760px, calc(100vw - 32px));\n background: #2b2623;\n color: #fff;\n font: 15px/1.4 -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n padding: 14px 18px 14px 16px;\n border-radius: 14px;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n}\n.veo-pick-hint-icon {\n flex: 0 0 auto; width: 44px; height: 44px; border-radius: 999px;\n background: rgba(255,255,255,0.12);\n display: inline-flex; align-items: center; justify-content: center;\n}\n.veo-pick-hint-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; }\n.veo-pick-hint-title { font-weight: 700; }\n.veo-pick-hint-sub { font-size: 13px; color: rgba(255,255,255,0.75); }\n.veo-pick-cancel {\n flex: 0 0 auto; pointer-events: auto;\n border: 0; border-radius: 10px; padding: 12px 18px;\n background: rgba(255,255,255,0.14); color: #fff;\n font: inherit; font-weight: 600; cursor: pointer;\n}\n.veo-pick-cancel:hover { background: rgba(255,255,255,0.24); }\n`;\n\nconst HINT_ICON =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" ' +\n 'stroke=\"currentColor\" stroke-width=\"1.6\" aria-hidden=\"true\"><path stroke-linecap=\"round\" ' +\n 'stroke-linejoin=\"round\" d=\"M7.5 3.75H6A2.25 2.25 0 0 0 3.75 6v1.5M16.5 3.75H18A2.25 2.25 0 0 1 ' +\n '20.25 6v1.5m0 9V18A2.25 2.25 0 0 1 18 20.25h-1.5m-9 0H6A2.25 2.25 0 0 1 3.75 18v-1.5M15 12a3 3 ' +\n '0 1 1-6 0 3 3 0 0 1 6 0Z\"/></svg>';\n\n/**\n * Controla un picker activo. Singleton a nivel de módulo: empezar otro\n * cierra el anterior. Los listeners van en fase de captura para poder\n * cancelar el click ANTES de que la app del cliente reaccione.\n */\nclass ElementPicker {\n private host: HTMLElement | null = null;\n private box: HTMLElement | null = null;\n private label: HTMLElement | null = null;\n private current: Element | null = null;\n private maxAncestors = DEFAULT_MAX_ANCESTORS;\n private only: 'interactive' | null = null;\n private onPick: ((p: PickedElement) => void) | null = null;\n private onCancel: (() => void) | null = null;\n\n start(options: ElementPickerOptions): void {\n this.stop(); // solo un picker a la vez\n\n this.maxAncestors = options.maxAncestors ?? DEFAULT_MAX_ANCESTORS;\n this.only = options.only ?? null;\n this.onPick = options.onPick;\n this.onCancel = options.onCancel ?? null;\n\n const host = document.createElement('div');\n host.setAttribute(PICKER_HOST_ATTR, '');\n const shadow = host.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = PICKER_STYLES;\n\n this.box = document.createElement('div');\n this.box.className = 'veo-pick-box';\n this.box.style.display = 'none';\n\n this.label = document.createElement('div');\n this.label.className = 'veo-pick-label';\n this.label.style.display = 'none';\n\n // Banner (mock 2026-09): icono · título + subtítulo · Cancelar.\n const hint = document.createElement('div');\n hint.className = 'veo-pick-hint';\n const icon = document.createElement('span');\n icon.className = 'veo-pick-hint-icon';\n icon.innerHTML = HINT_ICON;\n const text = document.createElement('div');\n text.className = 'veo-pick-hint-text';\n const title = document.createElement('span');\n title.className = 'veo-pick-hint-title';\n title.textContent = options.hint ?? 'Selecciona un elemento existente para colocar la guía.';\n const sub = document.createElement('span');\n sub.className = 'veo-pick-hint-sub';\n sub.textContent =\n options.subhint ?? 'Usa Alt + clic u Opción + clic para abrir menús y desplegables.';\n text.append(title, sub);\n const cancel = document.createElement('button');\n cancel.className = 'veo-pick-cancel';\n cancel.type = 'button';\n cancel.textContent = 'Cancelar';\n cancel.addEventListener('click', (e) => {\n e.stopPropagation();\n const cb = this.onCancel;\n this.stop();\n cb?.();\n });\n hint.append(icon, text, cancel);\n\n shadow.append(style, this.box, this.label, hint);\n document.body.appendChild(host);\n this.host = host;\n\n document.addEventListener('mousemove', this.onMove, true);\n document.addEventListener('click', this.onClick, true);\n document.addEventListener('mousedown', this.swallow, true);\n document.addEventListener('mouseup', this.swallow, true);\n document.addEventListener('keydown', this.onKey, true);\n window.addEventListener('scroll', this.reposition, true);\n window.addEventListener('resize', this.reposition);\n }\n\n stop(): void {\n document.removeEventListener('mousemove', this.onMove, true);\n document.removeEventListener('click', this.onClick, true);\n document.removeEventListener('mousedown', this.swallow, true);\n document.removeEventListener('mouseup', this.swallow, true);\n document.removeEventListener('keydown', this.onKey, true);\n window.removeEventListener('scroll', this.reposition, true);\n window.removeEventListener('resize', this.reposition);\n\n if (this.host?.parentNode) this.host.parentNode.removeChild(this.host);\n this.host = null;\n this.box = null;\n this.label = null;\n this.current = null;\n this.only = null;\n this.onPick = null;\n this.onCancel = null;\n }\n\n /** Elemento que se elegiría para el nodo bajo el cursor (o null si no hay). */\n private resolveTarget(target: EventTarget | null): Element | null {\n if (!(target instanceof Element) || this.isOwn(target)) return null;\n return this.only === 'interactive' ? closestInteractive(target) : target;\n }\n\n private hideBox(): void {\n if (this.box) this.box.style.display = 'none';\n if (this.label) this.label.style.display = 'none';\n }\n\n /** ¿Es un nodo de nuestro propio overlay? (no debe ser seleccionable). */\n private isOwn(target: EventTarget | null): boolean {\n return target instanceof Node && this.host !== null && this.host.contains(target);\n }\n\n private onMove = (event: MouseEvent): void => {\n if (!(event.target instanceof Element) || this.isOwn(event.target)) return;\n const target = this.resolveTarget(event.target);\n this.current = target;\n if (target) this.draw(target);\n else this.hideBox(); // zona no interactiva: nada que elegir\n };\n\n private onClick = (event: MouseEvent): void => {\n // Alt/Opción + clic: pasa a la app (abrir menús/desplegables) sin seleccionar.\n if (event.altKey) return;\n if (this.isOwn(event.target)) return;\n\n // Evitar que la app reaccione al click de selección.\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n const target = this.current ?? this.resolveTarget(event.target);\n if (!target) return; // nada elegible bajo el cursor: el picker sigue abierto\n\n const picked = this.describe(target);\n const cb = this.onPick;\n this.stop();\n cb?.(picked);\n };\n\n private onKey = (event: KeyboardEvent): void => {\n if (event.key !== 'Escape') return;\n event.preventDefault();\n event.stopPropagation();\n const cb = this.onCancel;\n this.stop();\n cb?.();\n };\n\n /** Traga mousedown/mouseup durante el picking (evita focus/active de la app). */\n private swallow = (event: MouseEvent): void => {\n if (event.altKey || this.isOwn(event.target)) return;\n event.preventDefault();\n event.stopPropagation();\n };\n\n private reposition = (): void => {\n if (this.current) this.draw(this.current);\n };\n\n /** Dibuja el recuadro de resalte y la etiqueta sobre el elemento dado. */\n private draw(element: Element): void {\n if (!this.box || !this.label) return;\n const rect = element.getBoundingClientRect();\n\n this.box.style.display = 'block';\n this.box.style.top = `${rect.top}px`;\n this.box.style.left = `${rect.left}px`;\n this.box.style.width = `${rect.width}px`;\n this.box.style.height = `${rect.height}px`;\n\n const shortSel = buildSelectorPath(element, 0);\n this.label.textContent = '';\n const sel = document.createElement('div');\n sel.className = 'veo-pick-sel';\n sel.textContent = shortSel;\n const dim = document.createElement('div');\n dim.className = 'veo-pick-dim';\n dim.textContent = `${Math.round(rect.width)} × ${Math.round(rect.height)}`;\n this.label.append(sel, dim);\n\n // Etiqueta debajo del recuadro; si no hay espacio, arriba.\n this.label.style.display = 'block';\n const LABEL_H = 48;\n const placeAbove = rect.bottom + 8 + LABEL_H > window.innerHeight;\n this.label.style.top = placeAbove\n ? `${Math.max(8, rect.top - LABEL_H - 8)}px`\n : `${rect.bottom + 8}px`;\n this.label.style.left = `${Math.max(8, rect.left)}px`;\n }\n\n private describe(element: Element): PickedElement {\n const rect = element.getBoundingClientRect();\n return {\n selector: buildSelectorPath(element, this.maxAncestors),\n shortSelector: buildSelectorPath(element, 0),\n tag: element.tagName.toLowerCase(),\n id: element.id || null,\n classes: filterHumanClasses(element),\n text: elementLabelText(element),\n rect: {\n x: Math.round(rect.left),\n y: Math.round(rect.top),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n },\n };\n }\n}\n\nlet activePicker: ElementPicker | null = null;\n\n/**\n * Inicia el modo de selección de elementos (inspector). Resalta lo que está\n * bajo el cursor y, al hacer click, entrega un selector CSS estable.\n * Devuelve un handle con `stop()`. Iniciar otro picker cierra el anterior.\n *\n * @example\n * ```ts\n * import { startElementPicker } from '@veo/sdk';\n *\n * const picker = startElementPicker({\n * onPick: ({ selector }) => console.log('elegido:', selector),\n * onCancel: () => console.log('cancelado'),\n * });\n * // picker.stop() para abortar manualmente.\n * ```\n */\nexport function startElementPicker(options: ElementPickerOptions): ElementPickerHandle {\n if (!hasDocument()) {\n return { stop: () => {} };\n }\n if (!activePicker) activePicker = new ElementPicker();\n activePicker.start(options);\n return { stop: () => activePicker?.stop() };\n}\n\n/** Cierra el picker activo, si lo hay. Idempotente. */\nexport function stopElementPicker(): void {\n activePicker?.stop();\n}\n","/**\n * Lado APP del puente builder. Corre dentro de la app del cliente (vía\n * veo-builder.js). Si el contexto trae `?veoBuilder=<token>`, se conecta con el\n * editor de Veo, atiende comandos y devuelve el elemento elegido.\n *\n * Dos transportes:\n * - **iframe/popup** (`resolveTarget` = opener/parent): el dashboard es la\n * ventana principal y embebe/abre la app; le hablamos a esa ventana.\n * - **panel inyectado** (`ctx.panel`): la app es top-level (login real) y NOSOTROS\n * inyectamos el panel del editor encima (iframe al dashboard); le hablamos a\n * ese iframe. Es el modo sin adaptación por app.\n *\n * Seguridad: solo acepta mensajes cuyo `origin` coincida con el del dashboard\n * (`veoBuilderOrigin` / `document.referrer`) y cuyo `token` coincida.\n */\nimport {\n type BuilderClientContext,\n clearBuilderToken,\n resolveBuilderContext,\n} from '../../core/builder-token';\nimport { hasDocument, hasWindow } from '../../utils/safe-env';\nimport { buildSelectorPath, filterHumanClasses } from '../autocapture/selector-builder';\nimport { isDeviceAllowed } from '../guides/activation-devices';\nimport { activationDelayMs, isAutomaticActivation } from '../guides/activation-rules';\nimport { applyBlockStyle, buildContentBlock } from '../guides/block-builder';\nimport { RAW_BLOCK_ATTR } from '../guides/code-block';\nimport { closeGuidePreview, previewGuide } from '../guides/guide-preview';\nimport { groupLayout } from '../guides/layout';\nimport { GUIDE_STYLES } from '../guides/styles';\nimport type { CompositeStep, StepBlock } from '../guides/types';\nimport { stepMatchesPage } from '../guides/url-match';\nimport { attachBlockDropTarget, type BlockDropTargetHandle } from './block-drop-target';\nimport {\n type BlockLayoutAction,\n type BlockToolbarAction,\n type BuilderCommand,\n type BuilderEvent,\n type CardToolbarAction,\n type ConfirmationCard,\n type EditorChromeState,\n type PageElement,\n type PageScan,\n type PreviewStatus,\n type RowToolbarAction,\n VEO_BUILDER_SOURCE,\n} from './bridge-protocol';\nimport { type BuilderChromeHandle, injectBuilderChrome } from './builder-chrome';\nimport { type BuilderPanelHandle, injectBuilderPanel } from './builder-panel';\nimport { attachDesignManipulator, type DesignManipulatorHandle } from './design-manipulator';\nimport { type ElementPickerHandle, startElementPicker } from './element-picker';\nimport { elementLabelText, INTERACTIVE_SELECTOR } from './interactive-elements';\n\nexport interface BuilderModeHandle {\n /** Desconecta el puente y limpia picker/preview/panel. */\n teardown(): void;\n}\n\n/** Selección del bloque code crudo (ver `attachRawBlock`). */\ninterface RawBlockHandle {\n /** Resalta el bloque si `id` es el suyo; con otro id (o null) lo oculta. */\n select(id: string | null): void;\n detach(): void;\n}\n\n/**\n * Inicializa el modo builder si hay contexto (URL o persistido). Devuelve un\n * handle, o `null` si no estamos en modo builder o no hay canal con el editor.\n * Es seguro llamarla siempre.\n */\n/** Estilos del modal de confirmación (shadow DOM, tokens OnUser: coral #b74d00, success #e6f6df/#406a31). */\nconst CONFIRMATION_STYLES = `\n:host { all: initial; }\n.veo-confirm-backdrop {\n position: fixed; inset: 0; z-index: 2147483645;\n background: rgba(20, 16, 14, 0.45);\n}\n.veo-confirm {\n position: fixed; left: 50%; top: 50%; transform: translate(-50%, -50%);\n z-index: 2147483646; box-sizing: border-box;\n width: min(432px, calc(100vw - 32px)); padding: 28px 24px 24px;\n border-radius: 16px; background: #fff; color: #1d1917;\n box-shadow: 0 24px 64px rgba(0,0,0,0.28);\n font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif;\n text-align: center;\n}\n.veo-confirm-check {\n width: 64px; height: 64px; margin: 0 auto; border-radius: 50%;\n background: #e6f6df; color: #2f9a4e; display: flex; align-items: center; justify-content: center;\n}\n.veo-confirm-check svg { width: 30px; height: 30px; }\n.veo-confirm-title { margin: 18px 0 0; font-size: 17px; font-weight: 600; }\n.veo-confirm-msg { margin: 8px 0 0; font-size: 13px; color: #6b6461; }\n.veo-confirm-rows {\n margin: 18px 0 0; padding: 12px 14px; border-radius: 12px; background: #f6f2ef; text-align: left;\n}\n.veo-confirm-row { display: flex; justify-content: space-between; gap: 16px; font-size: 13px; padding: 4px 0; }\n.veo-confirm-row dt { color: #6b6461; margin: 0; }\n.veo-confirm-row dd { margin: 0; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.veo-confirm-btn {\n display: block; width: 100%; margin-top: 18px; height: 44px; border: 0; border-radius: 10px;\n background: #b74d00; color: #fff; font: inherit; font-size: 15px; font-weight: 600; cursor: pointer;\n}\n.veo-confirm-btn:hover { background: #953c00; }\n.veo-confirm-btn:focus-visible { outline: 3px solid rgba(183,77,0,0.35); outline-offset: 2px; }\n`;\n\nexport function initBuilderMode(): BuilderModeHandle | null {\n if (!hasWindow() || !hasDocument()) return null;\n\n // Contexto de la URL o de sessionStorage: sobrevive al redirect del guard de\n // auth (que suele tirar el query string) y a un login en la misma pestaña.\n const ctx = resolveBuilderContext();\n if (!ctx) return null;\n\n const token = ctx.token;\n const dashboardOrigin = resolveDashboardOrigin(ctx.origin);\n if (!dashboardOrigin) return null;\n\n let picker: ElementPickerHandle | null = null;\n let panel: BuilderPanelHandle | null = null;\n /** Barras del editor (topbar + pasos) sobre la app; solo en modo panel. */\n let chrome: BuilderChromeHandle | null = null;\n let staticTarget: Window | null = null;\n let manipulator: DesignManipulatorHandle | null = null;\n let dropTarget: BlockDropTargetHandle | null = null;\n /** Detach del listener de clic simple sobre la tarjeta (→ «Agregar bloque»). */\n let cardClick: (() => void) | null = null;\n /** Selección del bloque code CRUDO (inline de un solo bloque code, sin tarjeta). */\n let rawBlock: RawBlockHandle | null = null;\n /** Bloque seleccionado en la app (id local del panel); sobrevive a los re-renders. */\n let selectedBlockId: string | null = null;\n /** Fantasma que sigue el cursor durante el drag de un bloque de la paleta. */\n let dragGhost: HTMLElement | null = null;\n /** Paso mostrado por la preview activa (destino de los drops de bloque). */\n let previewStepIndex = 0;\n /** Preview que llegó DURANTE un drag: se aplica al terminar el gesto. */\n let pendingPreview: Extract<BuilderCommand, { type: 'preview' }> | null = null;\n /** Último comando de preview: se re-evalúa al navegar (targeting por-página). */\n let lastPreview: Extract<BuilderCommand, { type: 'preview' }> | null = null;\n /** Modo vista previa (ojo de la topbar): guía sin editor ni barras. */\n let previewMode = false;\n /** Disparador por elemento objetivo armado para la preview (click/hover). */\n let previewTrigger: (() => void) | null = null;\n /** Ya se disparó: las siguientes previews se pintan directo hasta que se cierre. */\n let previewFired = false;\n /** «Retrasar la aparición» en curso para la preview (timer de delayMs). */\n let previewDelay: ReturnType<typeof setTimeout> | null = null;\n /**\n * El autor cerró la guía con ✕. Con Automático + Elemento objetivo la guía ya\n * arrancó sola; tras cerrarla debe esperar la interacción con el elemento\n * (como el runtime), no repintarse al instante.\n */\n let previewDismissed = false;\n /** Si la tarjeta estaba visible al entrar en vista previa (se restaura al salir). */\n let panelWasVisible = true;\n const getTarget = (): Window | null => (panel ? panel.target() : staticTarget);\n\n const post = (event: BuilderEvent): void => {\n getTarget()?.postMessage({ source: VEO_BUILDER_SOURCE, token, ...event }, dashboardOrigin);\n };\n\n /**\n * ¿El paso que se está previsualizando aplica a la URL ACTUAL? El editor debe\n * reflejar el targeting por-página real: si el paso apunta a otra página, la\n * preview NO se muestra (igual que el runtime). `sitewide`/sin pageLocation →\n * siempre true, así el editado normal no se ve afectado.\n */\n const previewStep = (\n cmd: Extract<BuilderCommand, { type: 'preview' }>,\n ): CompositeStep | undefined => {\n const steps = cmd.guide.guideSteps as unknown as CompositeStep[] | undefined;\n return steps?.[cmd.guide.startStepIndex ?? 0];\n };\n const previewMatchesPage = (cmd: Extract<BuilderCommand, { type: 'preview' }>): boolean =>\n stepMatchesPage(previewStep(cmd)?.pageLocation, window.location.href);\n\n const postPreviewStatus = (payload: PreviewStatus): void =>\n post({ type: 'preview-status', payload });\n\n const detachPreviewTools = (): void => {\n manipulator?.detach();\n manipulator = null;\n dropTarget?.detach();\n dropTarget = null;\n cardClick?.();\n cardClick = null;\n rowHover?.();\n rowHover = null;\n hoverRowId = null;\n hoverCard = false;\n rawBlock?.detach();\n rawBlock = null;\n // Sin herramientas no hay preview «editable» pintada: el próximo comando\n // igual no debe parchearse en el lugar (saltaría el enganche de clics,\n // marcos y hover, p. ej. al salir de vista previa). Se repinta completo.\n shownPreview = null;\n };\n\n const withholdPreview = (): void => {\n detachPreviewTools();\n shownPreview = null;\n closeGuidePreview();\n };\n\n /**\n * Marco de selección: aire alrededor del bloque (el «tamaño por defecto» al\n * seleccionar) y hueco de la barra. Sin alto mínimo: un marco más alto que\n * el bloque se montaba sobre los bloques vecinos.\n */\n /** Aire del marco alrededor del bloque (los bloques ya no llevan padding propio). */\n const FRAME_PAD = 4;\n const FRAME_MIN_H = 0;\n const TOOLBAR_H = 30;\n\n const ICON = {\n pencil:\n '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125\"/></svg>',\n copy: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M16.5 8.25V6a2.25 2.25 0 0 0-2.25-2.25H6A2.25 2.25 0 0 0 3.75 6v8.25A2.25 2.25 0 0 0 6 16.5h2.25m8.25-8.25H18a2.25 2.25 0 0 1 2.25 2.25V18A2.25 2.25 0 0 1 18 20.25h-7.5A2.25 2.25 0 0 1 8.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 0 0-2.25 2.25v6\"/></svg>',\n trash:\n '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0\"/></svg>',\n };\n const ICON_MOVE = {\n left: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19.5 12h-15m0 0 6.75 6.75M4.5 12l6.75-6.75\"/></svg>',\n right:\n '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4.5 12h15m0 0-6.75-6.75M19.5 12l-6.75 6.75\"/></svg>',\n };\n\n /**\n * Qué movimientos admite un bloque DENTRO de su fila (espejo de\n * `moveBlockByLayout` del panel): izquierda/derecha si la fila tiene una\n * columna a ese lado.\n */\n const moveAbility = (blocks: StepBlock[], blockId: string): { left: boolean; right: boolean } => {\n for (const row of groupLayout(blocks)) {\n for (let c = 0; c < row.columns.length; c++) {\n const col = row.columns[c] as (typeof row.columns)[number];\n if (!col.blocks.some((b) => b.block.editorId === blockId)) continue;\n return { left: c > 0, right: c < row.columns.length - 1 };\n }\n }\n return { left: false, right: false };\n };\n\n /** Bloques del paso mostrado (preview), para calcular disponibilidad de mover. */\n let previewBlocks: StepBlock[] = [];\n /**\n * Editor de fila. Una fila no tiene id propio: se identifica por el `editorId`\n * de su PRIMER bloque. `hoverRowId` = fila bajo el mouse; `selectedRowId` = la\n * que el panel está editando (`select-row`). El marco/barra de fila se pinta\n * para la fila editada, si no la del bloque seleccionado, si no la del hover.\n */\n let hoverRowId: string | null = null;\n let selectedRowId: string | null = null;\n let rowHover: (() => void) | null = null;\n /** Hover sobre el contenedor (tarjeta): contorno + pestañas «Editar contenedor / filas». */\n let hoverCard = false;\n /** Sección que muestra el panel (del último `editor-state`): marca la pestaña activa. */\n let panelSection: EditorChromeState['section'] | null = null;\n /** Comando cuya preview está pintada ahora (base del parche en el lugar). */\n let shownPreview: Extract<BuilderCommand, { type: 'preview' }> | null = null;\n\n /** Firma estructural de un paso: todo salvo texto/html/estilo de cada bloque. */\n const structureOf = (step: CompositeStep | undefined): string => {\n if (!step) return '';\n const { blocks, ...rest } = step;\n return JSON.stringify({\n rest,\n blocks: (blocks ?? []).map((b) => {\n const { text: _t, html: _h, style: _s, ...keep } = b as StepBlock;\n return keep;\n }),\n });\n };\n\n /**\n * Parche en el lugar (edición): si el paso mostrado tiene la MISMA estructura\n * que el nuevo (bloques, layout, diseño del contenedor, acciones), solo se\n * reconstruyen los nodos de los bloques cuyo texto/html/estilo cambió. Así\n * escribir no repinta (ni hace parpadear) toda la tarjeta. Devuelve false si\n * hay que repintar entera.\n */\n const tryPatchPreview = (cmd: Extract<BuilderCommand, { type: 'preview' }>): boolean => {\n const prev = shownPreview;\n if (!prev || cmd.guide.guideType !== 'composite' || prev.guide.guideType !== 'composite') {\n return false;\n }\n const idx = cmd.guide.startStepIndex ?? 0;\n if ((prev.guide.startStepIndex ?? 0) !== idx) return false;\n // Lo que no es el paso (activación, badge abierto, etc.) también debe ser igual.\n const guideSig = (g: typeof cmd.guide): string =>\n JSON.stringify({ ...g, guideSteps: undefined });\n if (guideSig(prev.guide) !== guideSig(cmd.guide) || prev.editable !== cmd.editable)\n return false;\n const host = document.querySelector<HTMLElement>('[data-veo-guide]');\n const card = host ? previewCard(host) : null;\n if (!host || !card) return false;\n const prevStep = (prev.guide.guideSteps as unknown as CompositeStep[])[idx];\n const nextStep = (cmd.guide.guideSteps as unknown as CompositeStep[])[idx];\n if (!prevStep || !nextStep) return false;\n if (structureOf(prevStep) !== structureOf(nextStep)) return false;\n const doc = card.ownerDocument;\n const prevBlocks = prevStep.blocks ?? [];\n const nextBlocks = nextStep.blocks ?? [];\n for (let i = 0; i < nextBlocks.length; i++) {\n const a = prevBlocks[i] as StepBlock;\n const b = nextBlocks[i] as StepBlock;\n if (\n a.text === b.text &&\n a.html === b.html &&\n JSON.stringify(a.style) === JSON.stringify(b.style)\n ) {\n continue;\n }\n if (!b.editorId) return false;\n const node = card.querySelector<HTMLElement>(`[data-veo-block-id=\"${b.editorId}\"]`);\n if (!node) return false;\n if (b.type === 'button') {\n // Texto, preset y estilos; la acción no cambió (está en la estructura).\n node.textContent = b.text?.trim() || 'OK';\n node.removeAttribute('style');\n node.classList.remove('veo-guide-cta--secondary', 'veo-guide-cta--link');\n const st = (b.style ?? {}) as Record<string, unknown>;\n if (st.preset === 'secondary' || st.preset === 'link') {\n node.classList.add(`veo-guide-cta--${st.preset}`);\n }\n if (typeof st.ariaLabel === 'string' && st.ariaLabel.trim()) {\n node.setAttribute('aria-label', st.ariaLabel.trim());\n } else node.removeAttribute('aria-label');\n applyBlockStyle(node, b.style, 'button');\n continue;\n }\n if (b.type === 'code' || b.type === 'form') return false;\n const fresh =\n buildContentBlock(b, doc, { editing: true }) ??\n (() => {\n const el = doc.createElement('div');\n el.className = 'veo-block-placeholder';\n el.textContent =\n b.type === 'image'\n ? 'Imagen (sin URL)'\n : b.type === 'video'\n ? 'Video (elige proveedor y pega la URL)'\n : 'Bloque vacío';\n return el;\n })();\n fresh.dataset.veoBlock = node.dataset.veoBlock ?? String(i);\n fresh.dataset.veoBlockId = b.editorId;\n node.replaceWith(fresh);\n }\n shownPreview = cmd;\n previewBlocks = nextBlocks;\n // La geometría pudo cambiar (más/menos texto): marco, barra y huecos.\n applyBlockHighlight(host, idx);\n renderGapZones(host, idx, nextBlocks);\n return true;\n };\n\n /** Card de la preview activa (shadow root del host). */\n const previewCard = (host: HTMLElement): HTMLElement | null =>\n host.shadowRoot?.querySelector<HTMLElement>('.veo-card') ?? null;\n\n /** Quita el resaltado y la barra del bloque seleccionado (sin tocar el estado). */\n const clearBlockHighlight = (host: HTMLElement): void => {\n const card = previewCard(host);\n if (!card) return;\n for (const el of card.querySelectorAll('.veo-block--selected')) {\n el.classList.remove('veo-block--selected');\n }\n card.querySelector('.veo-block-toolbar')?.remove();\n card.querySelector('.veo-block-frame')?.remove();\n };\n\n /**\n * Resalta el bloque `selectedBlockId` en la preview y le cuelga la barra\n * (editar / duplicar / eliminar) sobre su borde superior derecho. Se llama\n * al seleccionar y tras cada re-render (cada edición repinta la card).\n */\n const applyBlockHighlight = (host: HTMLElement, stepIndex: number): void => {\n clearBlockHighlight(host);\n const card = previewCard(host);\n if (!card) return;\n const el = selectedBlockId\n ? card.querySelector<HTMLElement>(`[data-veo-block-id=\"${selectedBlockId}\"]`)\n : null;\n if (!el || !selectedBlockId) {\n renderRowChrome(host, stepIndex);\n return;\n }\n el.classList.add('veo-block--selected');\n const doc = card.ownerDocument;\n // Marco de selección: rodea al bloque con aire (FRAME_PAD) y tiene un alto\n // cómodo por defecto (FRAME_MIN_H) para que los controles no se pisen con\n // bloques de una línea. Es solo visual: NO cambia el tamaño del bloque.\n // El marco lleva aire alrededor del bloque y se recorta a la caja de su\n // contenedor (columna o contenido de la card), nunca más allá.\n const cs = getComputedStyle(card);\n const padL = Number.parseFloat(cs.paddingLeft) || 0;\n const padT = Number.parseFloat(cs.paddingTop) || 0;\n const padR = Number.parseFloat(cs.paddingRight) || 0;\n const padB = Number.parseFloat(cs.paddingBottom) || 0;\n const parent = el.parentElement;\n const inCol = parent?.classList.contains('veo-col') ? parent : null;\n const boxL = inCol ? inCol.offsetLeft : padL;\n const boxR = inCol ? inCol.offsetLeft + inCol.offsetWidth : card.clientWidth - padR;\n const boxT = padT;\n const boxB = card.clientHeight - padB;\n // La separación entre bloques/filas (BLOCK_GAP en el CSS) deja lugar para\n // el aire del marco Y la línea «+» del hueco sin que se pisen.\n const fx = Math.max(boxL, el.offsetLeft - FRAME_PAD);\n const fr = Math.min(boxR, el.offsetLeft + el.offsetWidth + FRAME_PAD);\n const fw = Math.max(0, fr - fx);\n const fy = Math.max(boxT, el.offsetTop - FRAME_PAD);\n const fb = Math.min(boxB, el.offsetTop + el.offsetHeight + FRAME_PAD);\n const fh = Math.max(FRAME_MIN_H, fb - fy);\n const frame = doc.createElement('div');\n frame.className = 'veo-block-frame';\n frame.setAttribute('data-veo-builder-chrome', '');\n frame.style.left = `${fx}px`;\n frame.style.top = `${fy}px`;\n frame.style.width = `${fw}px`;\n frame.style.height = `${fh}px`;\n card.appendChild(frame);\n const bar = doc.createElement('div');\n bar.className = 'veo-block-toolbar';\n bar.setAttribute('data-veo-builder-chrome', '');\n const blockId = selectedBlockId;\n const mk = (action: BlockToolbarAction, label: string, icon: string, enabled = true): void => {\n const b = doc.createElement('button');\n b.type = 'button';\n b.title = label;\n b.setAttribute('aria-label', label);\n b.className = `veo-block-toolbar-${action}`;\n b.innerHTML = icon;\n b.disabled = !enabled;\n b.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n post({ type: 'block-action', payload: { stepIndex, blockId, action } });\n });\n bar.appendChild(b);\n };\n const can = moveAbility(previewBlocks, blockId);\n mk('edit', 'Editar', ICON.pencil);\n mk('duplicate', 'Duplicar', ICON.copy);\n mk('remove', 'Eliminar', ICON.trash);\n // Sin «Subir/Bajar»: la barra solo mueve entre columnas (mock).\n mk('move-left', 'Mover a la izquierda', ICON_MOVE.left, can.left);\n mk('move-right', 'Mover a la derecha', ICON_MOVE.right, can.right);\n // Barra: justo encima del BLOQUE seleccionado, alineada a su borde derecho\n // (esquina superior derecha del bloque). Se mide su alto real una vez en\n // el DOM para pegarla al marco.\n bar.style.right = `${Math.max(0, card.clientWidth - fr)}px`;\n card.appendChild(bar);\n const barH = bar.offsetHeight || TOOLBAR_H;\n // Posición preferida: encima del bloque; alternativa: debajo (si choca con\n // las pestañas del contenedor). Las guarda para `resolveToolbarOverlaps`.\n bar.dataset.veoTopAbove = String(fy - barH - 6);\n bar.dataset.veoTopBelow = String(fb + 6);\n bar.style.top = bar.dataset.veoTopAbove;\n // La fila del bloque seleccionado también muestra su marco y su barra.\n renderRowChrome(host, stepIndex);\n };\n\n /** Rect (coordenadas de la card) de un elemento de chrome posicionado. */\n const chromeRect = (el: HTMLElement) => ({\n left: el.offsetLeft,\n top: el.offsetTop,\n right: el.offsetLeft + el.offsetWidth,\n bottom: el.offsetTop + el.offsetHeight,\n });\n const intersects = (\n a: ReturnType<typeof chromeRect>,\n b: ReturnType<typeof chromeRect>,\n ): boolean => a.left < b.right && b.left < a.right && a.top < b.bottom && b.top < a.bottom;\n\n /**\n * Las tres barras (contenedor, bloque, fila) nunca se tapan entre sí:\n * 1. la del bloque va encima del bloque; si choca con las pestañas del\n * contenedor, pasa debajo del bloque;\n * 2. la de la fila va abajo a la derecha de la fila; si choca con la del\n * bloque, se corre a la izquierda de la fila; si aún choca, se apila\n * debajo de la barra del bloque.\n * Se llama cada vez que se pinta cualquiera de las tres.\n */\n const resolveToolbarOverlaps = (card: HTMLElement): void => {\n const cardBar = card.querySelector<HTMLElement>('.veo-card-toolbar');\n const blockBar = card.querySelector<HTMLElement>('.veo-block-toolbar');\n const rowBar = card.querySelector<HTMLElement>('.veo-row-toolbar');\n if (blockBar?.dataset.veoTopAbove) {\n blockBar.style.top = `${blockBar.dataset.veoTopAbove}px`;\n if (cardBar && intersects(chromeRect(blockBar), chromeRect(cardBar))) {\n blockBar.style.top = `${blockBar.dataset.veoTopBelow}px`;\n }\n }\n if (rowBar?.dataset.veoRight) {\n rowBar.style.left = '';\n rowBar.style.right = `${rowBar.dataset.veoRight}px`;\n rowBar.style.top = `${rowBar.dataset.veoTopBelow}px`;\n const others = [cardBar, blockBar].filter((b): b is HTMLElement => !!b);\n const clashes = () => others.some((o) => intersects(chromeRect(rowBar), chromeRect(o)));\n if (clashes()) {\n rowBar.style.right = '';\n rowBar.style.left = `${rowBar.dataset.veoLeft}px`;\n }\n if (clashes() && blockBar) {\n // Último recurso: apilada justo debajo de la barra del bloque (misma\n // alineación derecha). Una debajo de la otra no se cruzan nunca.\n rowBar.style.left = '';\n rowBar.style.right = `${rowBar.dataset.veoRight}px`;\n rowBar.style.top = `${chromeRect(blockBar).bottom + 6}px`;\n }\n }\n };\n\n /** Rect de un elemento relativo a la card (offsetParent = card, que es relative). */\n const rectOf = (el: HTMLElement) => ({\n left: el.offsetLeft,\n top: el.offsetTop,\n right: el.offsetLeft + el.offsetWidth,\n bottom: el.offsetTop + el.offsetHeight,\n });\n type Rect = ReturnType<typeof rectOf>;\n const union = (rs: Rect[]): Rect | null =>\n rs.length === 0\n ? null\n : rs.reduce((acc, r) => ({\n left: Math.min(acc.left, r.left),\n top: Math.min(acc.top, r.top),\n right: Math.max(acc.right, r.right),\n bottom: Math.max(acc.bottom, r.bottom),\n }));\n\n /**\n * Huecos «+» (mock): al pasar el mouse por el espacio ENTRE elementos aparece\n * una línea azul con un «+»:\n * - horizontal a lo ancho del contenido, entre filas (o arriba/abajo de\n * todas) → nueva FILA;\n * - vertical a lo alto de la fila, entre columnas (o en sus bordes) → nueva\n * COLUMNA en esa fila;\n * - horizontal a lo ancho de la columna, entre bloques apilados → nuevo\n * BLOQUE dentro de esa columna.\n * La estructura sale de `groupLayout` sobre los bloques de la preview (con\n * `editorId`) y la geometría de los nodos etiquetados.\n */\n /**\n * Geometría real de filas y columnas de la card: los bloques miden su\n * contenido, así que sale de sus contenedores (.veo-col / .veo-row) y, en\n * filas de una sola columna sin envoltorio, del ancho del contenido de la\n * card. Cada fila lleva `id` = editorId de su primer bloque (las filas no\n * tienen id propio) y su número de fila del layout.\n */\n const layoutRows = (card: HTMLElement, blocks: StepBlock[]) => {\n const elOf = (b: StepBlock): HTMLElement | null =>\n b.editorId ? card.querySelector<HTMLElement>(`[data-veo-block-id=\"${b.editorId}\"]`) : null;\n const cs = getComputedStyle(card);\n const padL = Number.parseFloat(cs.paddingLeft) || 0;\n const padR = Number.parseFloat(cs.paddingRight) || 0;\n const contentLeft = padL;\n const contentRight = card.clientWidth - padR;\n const rows = groupLayout(blocks)\n .map((row) => {\n const columns = row.columns\n .map((col) => {\n const items = col.blocks\n .map(({ block }) => ({ block, el: elOf(block) }))\n .filter(\n (x): x is { block: StepBlock; el: HTMLElement } => !!x.el && !!x.block.editorId,\n );\n const blocksRect = union(items.map((x) => rectOf(x.el)));\n if (!blocksRect) return null;\n const colEl = items[0]?.el.parentElement;\n const rect = colEl?.classList.contains('veo-col') ? rectOf(colEl) : blocksRect;\n return { items, rect };\n })\n .filter((c): c is NonNullable<typeof c> => c !== null);\n const blocksRect = union(columns.map((c) => c.rect));\n if (!blocksRect) return null;\n const rowEl = columns[0]?.items[0]?.el.parentElement?.parentElement;\n const rect = rowEl?.classList.contains('veo-row')\n ? rectOf(rowEl)\n : { ...blocksRect, left: contentLeft, right: contentRight };\n const id = columns[0]?.items[0]?.block.editorId as string;\n return { id, row: row.row, columns, rect };\n })\n .filter((r): r is NonNullable<typeof r> => r !== null);\n return { rows, content: { left: contentLeft, right: contentRight } };\n };\n\n /** Quita el marco y la barra de fila (sin tocar el estado). */\n const clearRowChrome = (card: HTMLElement): void => {\n card.querySelector('.veo-row-frame')?.remove();\n card.querySelector('.veo-row-toolbar')?.remove();\n };\n\n /**\n * Marco + barra de FILA (mock): al pasar el mouse por una fila aparece su\n * contorno y, bajo su esquina derecha, «Editar fila | duplicar». También se\n * muestra para la fila del bloque seleccionado y para la fila que el panel\n * está editando. La barra postea `row-action` con el primer bloque de la fila.\n */\n const renderRowChrome = (host: HTMLElement, stepIndex: number): void => {\n const card = previewCard(host);\n if (!card) return;\n clearRowChrome(card);\n resolveToolbarOverlaps(card);\n const { rows } = layoutRows(card, previewBlocks);\n const rowOfSelected = selectedBlockId\n ? rows.find((r) =>\n r.columns.some((c) => c.items.some((i) => i.block.editorId === selectedBlockId)),\n )\n : undefined;\n const target =\n (selectedRowId ? rows.find((r) => r.id === selectedRowId) : undefined) ??\n rowOfSelected ??\n (hoverRowId ? rows.find((r) => r.id === hoverRowId) : undefined);\n if (!target) return;\n const doc = card.ownerDocument;\n const cs = getComputedStyle(card);\n const padT = Number.parseFloat(cs.paddingTop) || 0;\n const padB = Number.parseFloat(cs.paddingBottom) || 0;\n const PAD = 6; // el marco de fila rodea al marco del bloque\n const fx = Math.max(0, target.rect.left - PAD);\n const fr = Math.min(card.clientWidth, target.rect.right + PAD);\n const fy = Math.max(Math.min(padT, target.rect.top), target.rect.top - PAD);\n const fb = Math.min(\n Math.max(card.clientHeight - padB, target.rect.bottom),\n target.rect.bottom + PAD,\n );\n const frame = doc.createElement('div');\n frame.className = 'veo-row-frame';\n frame.setAttribute('data-veo-builder-chrome', '');\n frame.style.left = `${fx}px`;\n frame.style.top = `${fy}px`;\n frame.style.width = `${Math.max(0, fr - fx)}px`;\n frame.style.height = `${Math.max(0, fb - fy)}px`;\n card.appendChild(frame);\n const bar = doc.createElement('div');\n bar.className = 'veo-row-toolbar';\n bar.setAttribute('data-veo-builder-chrome', '');\n const blockId = target.id;\n const mk = (action: RowToolbarAction, label: string, icon: string, text?: string): void => {\n const b = doc.createElement('button');\n b.type = 'button';\n b.title = label;\n b.setAttribute('aria-label', label);\n b.className = `veo-row-toolbar-${action}`;\n b.innerHTML = icon;\n if (text) b.append(text);\n b.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n post({ type: 'row-action', payload: { stepIndex, blockId, action } });\n });\n bar.appendChild(b);\n };\n mk('edit', 'Editar fila', ICON.pencil, 'Editar fila');\n mk('duplicate', 'Duplicar fila', ICON.copy);\n mk('remove', 'Eliminar fila', ICON.trash);\n card.appendChild(bar);\n // Posición preferida: abajo a la derecha de la fila. Alternativas (si choca\n // con otra barra): a la izquierda, y si no, apilada bajo la barra del bloque.\n bar.dataset.veoRight = String(Math.max(0, card.clientWidth - fr));\n bar.dataset.veoLeft = String(fx);\n bar.dataset.veoTopBelow = String(fb + 6);\n resolveToolbarOverlaps(card);\n };\n\n /**\n * Contorno + pestañas del CONTENEDOR (mock): al pasar el mouse por la tarjeta\n * se marca su borde y aparecen, centradas sobre el borde superior, «Editar\n * contenedor» (abre el paso en el panel) y «Editar filas» (abre la\n * estructura de filas y bloques). Postean `card-action`.\n */\n const renderCardChrome = (host: HTMLElement, stepIndex: number): void => {\n const card = previewCard(host);\n if (!card) return;\n card.querySelector('.veo-card-frame')?.remove();\n card.querySelector('.veo-card-toolbar')?.remove();\n if (!hoverCard) {\n resolveToolbarOverlaps(card);\n return;\n }\n const doc = card.ownerDocument;\n const frame = doc.createElement('div');\n frame.className = 'veo-card-frame';\n frame.setAttribute('data-veo-builder-chrome', '');\n card.appendChild(frame);\n const bar = doc.createElement('div');\n bar.className = 'veo-card-toolbar';\n bar.setAttribute('data-veo-builder-chrome', '');\n const mk = (action: CardToolbarAction, label: string, active: boolean): void => {\n const b = doc.createElement('button');\n b.type = 'button';\n b.className = `veo-card-toolbar-${action}${active ? ' is-active' : ''}`;\n b.setAttribute('aria-pressed', active ? 'true' : 'false');\n b.textContent = label;\n b.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n post({ type: 'card-action', payload: { stepIndex, action } });\n });\n bar.appendChild(b);\n };\n mk('edit-container', 'Editar contenedor', panelSection === 'step');\n mk('edit-rows', 'Editar filas', panelSection === 'structure');\n card.appendChild(bar);\n // A caballo del borde superior de la tarjeta (mitad afuera, mitad adentro).\n bar.style.top = `${-Math.round((bar.offsetHeight || 34) / 2)}px`;\n resolveToolbarOverlaps(card);\n };\n\n /**\n * Hover de filas: al mover el mouse sobre la card se calcula qué fila está\n * debajo (geometría de `layoutRows`) y se pinta su marco/barra. Salir de la\n * card (o de todas las filas) lo quita; pasar a la barra de la fila lo\n * conserva. Una fila seleccionada/editada tiene prioridad (ver renderRowChrome).\n */\n const attachRowHover = (host: HTMLElement, stepIndex: number): (() => void) => {\n const onMove = (e: MouseEvent): void => {\n const card = previewCard(host);\n if (!card) return;\n // Contenedor: el puntero está sobre la tarjeta o sobre sus pestañas.\n const overCard = e\n .composedPath()\n .some(\n (n) =>\n n instanceof Element &&\n (n.classList.contains('veo-card') || n.classList.contains('veo-card-toolbar')),\n );\n if (overCard !== hoverCard) {\n hoverCard = overCard;\n renderCardChrome(host, stepIndex);\n }\n if (\n e\n .composedPath()\n .some((n) => n instanceof Element && n.classList.contains('veo-row-toolbar'))\n ) {\n return; // sobre la barra de la fila: se mantiene\n }\n const rect = card.getBoundingClientRect();\n const x = e.clientX - rect.left - card.clientLeft;\n const y = e.clientY - rect.top - card.clientTop;\n // Camino hacia la barra: la barra cuelga 6px bajo la fila y puede tapar\n // la fila siguiente. Mientras el puntero esté en la franja que va del\n // borde de la fila a la barra (con aire), se conserva la fila actual.\n const bar = card.querySelector<HTMLElement>('.veo-row-toolbar');\n if (bar) {\n const AIR = 10;\n if (\n x >= bar.offsetLeft - AIR &&\n x <= bar.offsetLeft + bar.offsetWidth + AIR &&\n y >= bar.offsetTop - 14 &&\n y <= bar.offsetTop + bar.offsetHeight + AIR\n ) {\n return;\n }\n }\n const TOL = 6;\n const hit = layoutRows(card, previewBlocks).rows.find(\n (r) =>\n x >= r.rect.left - TOL &&\n x <= r.rect.right + TOL &&\n y >= r.rect.top - TOL &&\n y <= r.rect.bottom + TOL,\n );\n const next = hit?.id ?? null;\n if (next === hoverRowId) return;\n hoverRowId = next;\n renderRowChrome(host, stepIndex);\n };\n const onLeave = (): void => {\n if (hoverCard) {\n hoverCard = false;\n renderCardChrome(host, stepIndex);\n }\n if (hoverRowId === null) return;\n hoverRowId = null;\n renderRowChrome(host, stepIndex);\n };\n host.addEventListener('mousemove', onMove);\n host.addEventListener('mouseleave', onLeave);\n return () => {\n host.removeEventListener('mousemove', onMove);\n host.removeEventListener('mouseleave', onLeave);\n };\n };\n\n const renderGapZones = (host: HTMLElement, stepIndex: number, blocks: StepBlock[]): void => {\n const card = previewCard(host);\n if (!card) return;\n for (const z of card.querySelectorAll('.veo-gap')) z.remove();\n const doc = card.ownerDocument;\n const GAP = 18; // grosor de la zona de hover\n const EDGE = 4; // separación de las líneas de borde respecto al contenido\n\n const zone = (\n kind: 'h' | 'v',\n x: number,\n y: number,\n w: number,\n h: number,\n label: string,\n blockId: string,\n action: BlockLayoutAction,\n ): void => {\n const z = doc.createElement('div');\n z.className = `veo-gap veo-gap--${kind}`;\n z.setAttribute('data-veo-builder-chrome', '');\n z.dataset.veoGapAction = action;\n z.style.left = `${x}px`;\n z.style.top = `${y}px`;\n z.style.width = `${Math.max(w, GAP)}px`;\n z.style.height = `${Math.max(h, GAP)}px`;\n const line = doc.createElement('i');\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.title = label;\n btn.setAttribute('aria-label', label);\n btn.textContent = '+';\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n post({ type: 'block-layout', payload: { stepIndex, blockId, action } });\n });\n z.append(line, btn);\n card.appendChild(z);\n };\n\n const { rows, content } = layoutRows(card, blocks);\n if (rows.length === 0) return;\n const cw = content.right - content.left;\n\n // Filas: arriba de la primera, entre filas, debajo de la última.\n rows.forEach((row, k) => {\n const first = row.columns[0]?.items[0]?.block.editorId as string;\n if (k === 0) {\n zone(\n 'h',\n content.left,\n row.rect.top - EDGE - GAP,\n cw,\n GAP,\n 'Agregar fila',\n first,\n 'row-before',\n );\n } else {\n const prev = rows[k - 1] as (typeof rows)[number];\n const y = (prev.rect.bottom + row.rect.top) / 2 - GAP / 2;\n zone('h', content.left, y, cw, GAP, 'Agregar fila', first, 'row-before');\n }\n if (k === rows.length - 1) {\n zone(\n 'h',\n content.left,\n row.rect.bottom + EDGE,\n cw,\n GAP,\n 'Agregar fila',\n first,\n 'row-after',\n );\n }\n });\n\n // Columnas: borde izquierdo, entre columnas, borde derecho (por fila).\n for (const row of rows) {\n const rh = row.rect.bottom - row.rect.top;\n row.columns.forEach((col, j) => {\n const id = col.items[0]?.block.editorId as string;\n if (j === 0) {\n zone(\n 'v',\n row.rect.left - EDGE - GAP,\n row.rect.top,\n GAP,\n rh,\n 'Agregar columna',\n id,\n 'col-before',\n );\n } else {\n const prev = row.columns[j - 1] as (typeof row.columns)[number];\n const x = (prev.rect.right + col.rect.left) / 2 - GAP / 2;\n zone('v', x, row.rect.top, GAP, rh, 'Agregar columna', id, 'col-before');\n }\n if (j === row.columns.length - 1) {\n zone(\n 'v',\n row.rect.right + EDGE,\n row.rect.top,\n GAP,\n rh,\n 'Agregar columna',\n id,\n 'col-after',\n );\n }\n });\n }\n\n // Bloques apilados dentro de una columna: entre bloques; y debajo del último\n // si la columna es más baja que su fila (hay hueco para apilar).\n for (const row of rows) {\n for (const col of row.columns) {\n const w = col.rect.right - col.rect.left;\n col.items.forEach((it, i) => {\n const next = col.items[i + 1];\n if (next) {\n const a = rectOf(it.el);\n const b = rectOf(next.el);\n const y = (a.bottom + b.top) / 2 - GAP / 2;\n zone(\n 'h',\n col.rect.left,\n y,\n w,\n GAP,\n 'Agregar bloque',\n it.block.editorId as string,\n 'stack-after',\n );\n } else if (row.columns.length > 1 && col.rect.bottom < row.rect.bottom - GAP) {\n zone(\n 'h',\n col.rect.left,\n col.rect.bottom + EDGE,\n w,\n GAP,\n 'Agregar bloque',\n it.block.editorId as string,\n 'stack-after',\n );\n }\n });\n }\n }\n };\n\n /**\n * Clics sobre la preview (modo edición). Se captura en el host para ganar a\n * los listeners de los bloques (un botón de la guía NO ejecuta su acción al\n * editarlo). Un arrastre (manipulador) también termina en `click` y se\n * descarta por distancia.\n * - sobre un bloque → se selecciona y el panel abre su editor;\n * - sobre la tarjeta (fuera de bloques) → se deselecciona y el panel abre\n * «Agregar bloque».\n */\n const attachCardClick = (host: HTMLElement, stepIndex: number): (() => void) => {\n let downAt: { x: number; y: number } | null = null;\n const onDown = (e: MouseEvent): void => {\n downAt = { x: e.clientX, y: e.clientY };\n };\n const onClick = (e: MouseEvent): void => {\n const path = e.composedPath();\n if (\n path.some(\n (n) =>\n n instanceof Element &&\n (n.classList.contains('veo-block-toolbar') ||\n n.classList.contains('veo-row-toolbar') ||\n n.classList.contains('veo-card-toolbar') ||\n n.classList.contains('veo-gap')),\n )\n ) {\n return; // las barras y los huecos «+» manejan sus propios clics\n }\n const inCard = path.some((n) => n instanceof Element && n.classList.contains('veo-card'));\n if (!inCard) return;\n if (downAt && Math.hypot(e.clientX - downAt.x, e.clientY - downAt.y) > 4) return;\n const blockEl = path.find(\n (n): n is HTMLElement => n instanceof HTMLElement && !!n.dataset.veoBlockId,\n );\n if (blockEl) {\n // Botones/enlaces del bloque no ejecutan su acción mientras se edita.\n if (path.some((n) => n instanceof Element && n.matches('button, a'))) {\n e.preventDefault();\n e.stopPropagation();\n }\n selectedBlockId = blockEl.dataset.veoBlockId ?? null;\n applyBlockHighlight(host, stepIndex);\n if (selectedBlockId) {\n post({ type: 'block-clicked', payload: { stepIndex, blockId: selectedBlockId } });\n }\n return;\n }\n const interactive = path.some(\n (n) =>\n n instanceof Element &&\n n.matches('button, a, input, textarea, select, label, [contenteditable]'),\n );\n if (interactive) return;\n selectedBlockId = null;\n clearBlockHighlight(host);\n renderRowChrome(host, stepIndex);\n post({ type: 'card-clicked', payload: { stepIndex } });\n };\n host.addEventListener('mousedown', onDown, true);\n host.addEventListener('click', onClick, true);\n return () => {\n host.removeEventListener('mousedown', onDown, true);\n host.removeEventListener('click', onClick, true);\n };\n };\n\n /**\n * Bloque code CRUDO: una guía inline cuyo único bloque es code se inyecta tal\n * cual en el DOM real (sin host, shadow ni tarjeta) para duplicar un elemento\n * nativo. No hay `.veo-card` a la que colgarle el clic ni el marco, así que\n * el editor lo selecciona aparte: un clic sobre cualquiera de sus elementos\n * (marcados con `data-veo-raw-block`) lo resalta con un marco FIJO sobre su\n * caja real y una barra (Editar / Eliminar; duplicar y mover no aplican: es\n * el único bloque del paso). Los enlaces/botones del HTML no ejecutan su\n * acción mientras se edita, igual que en la tarjeta. Alrededor lleva los\n * mismos huecos «+» que la tarjeta (fila arriba/abajo, columna izq/der):\n * agregar un bloque convierte el paso en tarjeta normal con todo el editor.\n */\n const attachRawBlock = (stepIndex: number, blockId: string): RawBlockHandle | null => {\n const nodes = Array.from(\n document.querySelectorAll<HTMLElement>(`[${RAW_BLOCK_ATTR}=\"${blockId}\"]`),\n );\n if (nodes.length === 0) return null;\n const doc = document;\n const box = doc.createElement('div');\n box.setAttribute('data-veo-builder-chrome', '');\n box.style.cssText = 'position:fixed;left:0;top:0;width:0;height:0;z-index:2147483646;';\n box.style.display = 'none';\n const shadow = box.attachShadow({ mode: 'open' });\n const style = doc.createElement('style');\n style.textContent = GUIDE_STYLES;\n shadow.appendChild(style);\n const frame = doc.createElement('div');\n frame.className = 'veo-block-frame';\n frame.style.position = 'fixed';\n const bar = doc.createElement('div');\n bar.className = 'veo-block-toolbar';\n bar.style.position = 'fixed';\n const mk = (action: BlockToolbarAction, label: string, icon: string, enabled = true): void => {\n const b = doc.createElement('button');\n b.type = 'button';\n b.title = label;\n b.setAttribute('aria-label', label);\n b.className = `veo-block-toolbar-${action}`;\n b.innerHTML = icon;\n b.disabled = !enabled;\n b.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n post({ type: 'block-action', payload: { stepIndex, blockId, action } });\n });\n bar.appendChild(b);\n };\n mk('edit', 'Editar', ICON.pencil);\n mk('duplicate', 'Duplicar', ICON.copy, false);\n mk('remove', 'Eliminar', ICON.trash);\n mk('move-left', 'Mover a la izquierda', ICON_MOVE.left, false);\n mk('move-right', 'Mover a la derecha', ICON_MOVE.right, false);\n frame.style.display = 'none';\n bar.style.display = 'none';\n // Huecos «+» (siempre visibles al hover, sin selección): misma geometría\n // que `renderGapZones` pero fijos sobre la caja real del bloque crudo.\n const GAP = 18;\n const EDGE = 4;\n const gap = (kind: 'h' | 'v', label: string, action: BlockLayoutAction): HTMLElement => {\n const z = doc.createElement('div');\n z.className = `veo-gap veo-gap--${kind}`;\n z.style.position = 'fixed';\n z.dataset.veoGapAction = action;\n const line = doc.createElement('i');\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.title = label;\n btn.setAttribute('aria-label', label);\n btn.textContent = '+';\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n post({ type: 'block-layout', payload: { stepIndex, blockId, action } });\n });\n z.append(line, btn);\n return z;\n };\n const gaps = {\n top: gap('h', 'Agregar fila', 'row-before'),\n bottom: gap('h', 'Agregar fila', 'row-after'),\n left: gap('v', 'Agregar columna', 'col-before'),\n right: gap('v', 'Agregar columna', 'col-after'),\n };\n shadow.append(frame, bar, gaps.top, gaps.bottom, gaps.left, gaps.right);\n doc.body.appendChild(box);\n box.style.display = '';\n\n let visible = false;\n const place = (el: HTMLElement, x: number, y: number, w: number, h: number): void => {\n el.style.left = `${x}px`;\n el.style.top = `${y}px`;\n el.style.width = `${w}px`;\n el.style.height = `${h}px`;\n };\n const reposition = (): void => {\n const live = nodes.filter((n) => n.isConnected);\n if (live.length === 0) return;\n let l = Number.POSITIVE_INFINITY;\n let t = Number.POSITIVE_INFINITY;\n let r = Number.NEGATIVE_INFINITY;\n let b = Number.NEGATIVE_INFINITY;\n for (const n of live) {\n const rc = n.getBoundingClientRect();\n if (rc.width === 0 && rc.height === 0) continue;\n l = Math.min(l, rc.left);\n t = Math.min(t, rc.top);\n r = Math.max(r, rc.right);\n b = Math.max(b, rc.bottom);\n }\n if (!Number.isFinite(l)) return;\n place(gaps.top, l, t - EDGE - GAP, r - l, GAP);\n place(gaps.bottom, l, b + EDGE, r - l, GAP);\n place(gaps.left, l - EDGE - GAP, t, GAP, b - t);\n place(gaps.right, r + EDGE, t, GAP, b - t);\n if (!visible) return;\n place(frame, l, t, r - l, b - t);\n const bh = bar.offsetHeight || TOOLBAR_H;\n const bw = bar.offsetWidth;\n bar.style.left = `${Math.max(0, r - bw)}px`;\n bar.style.top = `${Math.max(0, t - bh - 6)}px`;\n };\n const select = (id: string | null): void => {\n visible = id === blockId;\n frame.style.display = visible ? '' : 'none';\n bar.style.display = visible ? '' : 'none';\n reposition();\n };\n reposition();\n const onClick = (e: MouseEvent): void => {\n const path = e.composedPath();\n if (!nodes.some((n) => path.includes(n))) return;\n // Botones/enlaces del HTML no ejecutan su acción mientras se edita.\n if (path.some((n) => n instanceof Element && n.matches('button, a'))) {\n e.preventDefault();\n e.stopPropagation();\n }\n selectedBlockId = blockId;\n select(blockId);\n post({ type: 'block-clicked', payload: { stepIndex, blockId } });\n };\n doc.addEventListener('click', onClick, true);\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n return {\n select,\n detach: () => {\n doc.removeEventListener('click', onClick, true);\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n box.remove();\n },\n };\n };\n\n /**\n * Aplica la preview respetando el targeting de página y (con `honorTrigger`)\n * el dispositivo; si no aplica, la cierra y le cuenta al panel por qué.\n */\n const applyPreviewGated = (cmd: Extract<BuilderCommand, { type: 'preview' }>): void => {\n // «Mostrar ahora» (honorTrigger:false) es un disparo manual: cuenta como si\n // el elemento objetivo/retraso ya se hubiera cumplido. Lo que se recuerda\n // para re-aplicar (cerrar con ✕, navegar, entrar/salir de vista previa) es\n // la versión que SÍ honra la activación; si se guardara tal cual, al cerrar\n // la guía se repintaría al instante y no habría forma de quitarla.\n const showNow = !cmd.honorTrigger;\n if (showNow) {\n disarmPreviewTrigger();\n cancelPreviewDelay();\n previewFired = true;\n previewDismissed = false;\n }\n lastPreview = showNow ? { ...cmd, honorTrigger: true } : cmd;\n if (!previewMatchesPage(cmd)) {\n cancelPreviewDelay();\n withholdPreview();\n postPreviewStatus({\n state: 'page-mismatch',\n pattern: previewStep(cmd)?.pageLocation?.pattern ?? '',\n });\n return;\n }\n const devices = cmd.guide.activationRules?.devices;\n if (!showNow && previewMode && devices && !isDeviceAllowed(devices)) {\n cancelPreviewDelay();\n withholdPreview();\n postPreviewStatus({ state: 'device-mismatch', devices: devices as 'desktop' | 'mobile' });\n return;\n }\n applyPreview(lastPreview);\n };\n\n const disarmPreviewTrigger = (): void => {\n previewTrigger?.();\n previewTrigger = null;\n };\n\n const cancelPreviewDelay = (): void => {\n if (previewDelay) clearTimeout(previewDelay);\n previewDelay = null;\n };\n\n /**\n * Elemento objetivo: arma un listener delegado (click, y hover si aplica)\n * sobre `selector`; al disparar, pinta la preview. Ignora nuestros overlays.\n */\n const armPreviewTrigger = (selector: string, trigger: 'on_click' | 'on_hover'): void => {\n disarmPreviewTrigger();\n const onFire = (e: Event): void => {\n const target = e.target;\n if (!(target instanceof Element)) return;\n if (target.closest('[data-veo-builder-chrome],[data-veo-builder-panel],[data-veo-picker]')) {\n return;\n }\n try {\n if (!target.closest(selector)) return;\n } catch {\n return;\n }\n disarmPreviewTrigger();\n previewFired = true;\n previewDismissed = false;\n if (lastPreview) applyPreviewGated(lastPreview);\n };\n document.addEventListener('click', onFire, true);\n if (trigger === 'on_hover') document.addEventListener('mouseover', onFire, true);\n previewTrigger = () => {\n document.removeEventListener('click', onFire, true);\n document.removeEventListener('mouseover', onFire, true);\n };\n postPreviewStatus({ state: 'waiting-trigger', trigger, selector });\n };\n\n /**\n * «Retrasar la aparición»: la preview espera `delayMs` como el runtime. Al\n * cumplirse se pinta y las siguientes previews (cada edición) van directo\n * hasta que el autor la cierre con ✕ — si no, cada tecla reiniciaría la espera.\n */\n const armPreviewDelay = (delayMs: number): void => {\n cancelPreviewDelay();\n previewDelay = setTimeout(() => {\n previewDelay = null;\n previewFired = true;\n if (lastPreview) applyPreviewGated(lastPreview);\n }, delayMs);\n postPreviewStatus({ state: 'waiting-delay', delayMs });\n };\n\n const applyPreview = (cmd: Extract<BuilderCommand, { type: 'preview' }>): void => {\n // Edición: si solo cambió el contenido/estilo de algún bloque (misma\n // estructura), se parchea en el lugar sin repintar la tarjeta entera ni\n // tocar los listeners (manipulador, clics, huecos).\n if (cmd.editable && !previewMode && tryPatchPreview(cmd)) {\n previewStepIndex = cmd.guide.startStepIndex ?? 0;\n return;\n }\n detachPreviewTools();\n previewStepIndex = cmd.guide.startStepIndex ?? 0;\n\n // Elemento objetivo: hasta que el autor haga clic/hover en el elemento, la\n // preview no se pinta (como en el runtime). Tras cerrarla, se re-arma.\n const rules = cmd.guide.activationRules;\n const trig = rules?.trigger;\n const sel = rules?.selector?.trim();\n // La activación (elemento objetivo, retraso, dispositivo) se respeta SOLO\n // en vista previa («como la ve el usuario»). Mientras se edita, la tarjeta\n // se pinta siempre al instante: si no, un paso nuevo no aparecía hasta\n // hacer clic en el elemento objetivo o cumplir el retraso.\n const gate = cmd.honorTrigger && !previewFired && previewMode;\n // Elemento objetivo: esperar la interacción, salvo que la guía arranque sola\n // (Automático, `autoShow`) y el autor aún no la haya cerrado. Tras cerrarla\n // con ✕, el elemento objetivo es lo que la vuelve a abrir (como el runtime).\n const waitsForTarget =\n (trig === 'on_click' || trig === 'on_hover') &&\n (!isAutomaticActivation(rules) || previewDismissed);\n if (gate && waitsForTarget && sel) {\n cancelPreviewDelay();\n closeGuidePreview();\n armPreviewTrigger(sel, trig);\n return;\n }\n const delayMs = activationDelayMs(rules);\n if (gate && delayMs > 0) {\n disarmPreviewTrigger();\n closeGuidePreview();\n // Si ya hay una espera corriendo (el autor sigue editando) no se reinicia.\n if (!previewDelay) armPreviewDelay(delayMs);\n return;\n }\n disarmPreviewTrigger();\n cancelPreviewDelay();\n const fetchProgress = previewProgressFetcher();\n const handle = previewGuide({\n ...cmd.guide,\n ...(fetchProgress ? { fetchProgress } : {}),\n onClosed: () => {\n // El autor cerró la guía con ✕.\n detachPreviewTools();\n shownPreview = null;\n previewFired = false;\n previewDismissed = true;\n // Vista previa («como la ve el usuario»): un cierre es un cierre. La\n // guía no se repinta sola; si tiene elemento objetivo, ese clic/hover\n // la vuelve a abrir (como el runtime). En modo edición también se\n // queda cerrada: la próxima edición o selección de paso la repinta.\n if (previewMode) {\n const r = lastPreview?.guide.activationRules;\n const t = r?.trigger;\n const selector = r?.selector?.trim();\n if ((t === 'on_click' || t === 'on_hover') && selector) armPreviewTrigger(selector, t);\n }\n },\n });\n if (cmd.honorTrigger) postPreviewStatus({ state: 'shown' });\n // En vista previa la guía se ve como la vería el usuario: sin drag/resize.\n if (!cmd.editable || previewMode) return;\n void handle.ready.then((result) => {\n if (!result.rendered) return;\n const host = handle.host();\n if (!host) {\n // Inline de un solo bloque code: HTML CRUDA en el DOM real, sin host ni\n // tarjeta. Se selecciona con un marco propio sobre los elementos crudos.\n const idx = cmd.guide.startStepIndex ?? 0;\n const only = (cmd.guide.guideSteps as unknown as CompositeStep[])[idx]?.blocks?.[0];\n if (only?.type === 'code' && only.editorId) {\n rawBlock = attachRawBlock(idx, only.editorId);\n rawBlock?.select(selectedBlockId);\n }\n return;\n }\n // Sin animación de entrada mientras se edita (evita el parpadeo).\n host.classList.add('veo-no-anim');\n shownPreview = cmd;\n cardClick = attachCardClick(host, cmd.guide.startStepIndex ?? 0);\n const stepBlocks =\n (cmd.guide.guideSteps as unknown as CompositeStep[])[cmd.guide.startStepIndex ?? 0]\n ?.blocks ?? [];\n previewBlocks = stepBlocks;\n applyBlockHighlight(host, cmd.guide.startStepIndex ?? 0);\n renderGapZones(host, cmd.guide.startStepIndex ?? 0, stepBlocks);\n rowHover = attachRowHover(host, cmd.guide.startStepIndex ?? 0);\n manipulator = attachDesignManipulator({\n host,\n guideType: cmd.guide.guideType,\n stepIndex: cmd.guide.startStepIndex ?? 0,\n onCommit: (payload) => post({ type: 'design-updated', payload }),\n onGestureEnd: () => {\n if (!pendingPreview) return;\n const queued = pendingPreview;\n pendingPreview = null;\n applyPreviewGated(queued);\n },\n });\n // Paleta → guía: soltar un bloque del panel sobre la preview lo inserta.\n dropTarget = attachBlockDropTarget({\n host,\n stepIndex: cmd.guide.startStepIndex ?? 0,\n onDrop: (payload) => post({ type: 'block-dropped', payload }),\n });\n });\n };\n\n const hideDragGhost = (): void => {\n dragGhost?.remove();\n dragGhost = null;\n };\n\n const moveDragGhost = (x: number, y: number, label: string): void => {\n if (!dragGhost) {\n dragGhost = document.createElement('div');\n dragGhost.style.cssText =\n 'position:fixed;padding:4px 10px;border-radius:999px;background:#1c1917;color:#fff;' +\n 'font:12px/1.4 system-ui,sans-serif;box-shadow:0 4px 14px rgba(0,0,0,0.35);' +\n 'border:1px solid rgba(255,255,255,0.25);pointer-events:none;z-index:2147483647;';\n document.body.appendChild(dragGhost);\n }\n dragGhost.textContent = label;\n dragGhost.style.left = `${x + 14}px`;\n dragGhost.style.top = `${y + 12}px`;\n };\n\n /**\n * Drag de bloque por pointer: coords relativas al iframe del panel → página.\n * En pop-out no hay mapeo (otra ventana) — se ignora.\n */\n const handleBlockDrag = (cmd: Extract<BuilderCommand, { type: 'block-drag' }>): void => {\n const rect = panel?.frameRect();\n if (!rect || !dropTarget) {\n if (cmd.phase !== 'move') hideDragGhost();\n dropTarget?.cancelHover();\n return;\n }\n const x = rect.left + cmd.x;\n const y = rect.top + cmd.y;\n if (cmd.phase === 'move') {\n moveDragGhost(x, y, cmd.label || cmd.blockType);\n dropTarget.hoverAt(x, y);\n return;\n }\n hideDragGhost();\n if (cmd.phase === 'cancel') {\n dropTarget.cancelHover();\n return;\n }\n const spotAt = dropTarget.dropAt(x, y);\n if (spotAt) {\n post({\n type: 'block-dropped',\n payload: { stepIndex: previewStepIndex, blockType: cmd.blockType, ...spotAt },\n });\n }\n };\n\n const handleCommand = (cmd: BuilderCommand): void => {\n switch (cmd.type) {\n case 'panel-ready':\n // El panel cargó y ya escucha → recién ahora le mandamos `ready`. Con\n // `chrome: true` el panel sabe que las barras las pinta el SDK.\n post(chrome ? { type: 'ready', chrome: true } : { type: 'ready' });\n break;\n case 'editor-state':\n chrome?.setState(cmd.state);\n if (panelSection !== cmd.state.section) {\n panelSection = cmd.state.section;\n // La pestaña activa del contenedor cambia con la sección del panel.\n const h = document.querySelector<HTMLElement>('[data-veo-guide]');\n if (h && hoverCard && !previewMode) renderCardChrome(h, previewStepIndex);\n }\n panel?.setTitle(\n cmd.state.panelTitle ??\n (cmd.state.section === 'activation'\n ? 'Ajustes de activación'\n : cmd.state.section === 'badge'\n ? 'Ajustes de badge'\n : cmd.state.section === 'target'\n ? 'Ajustes del elemento objetivo'\n : cmd.state.section === 'row'\n ? 'Editar fila'\n : cmd.state.blockLabel\n ? `Editor · ${cmd.state.blockLabel}`\n : (cmd.state.steps[cmd.state.activeStep]?.label ?? 'Paso')),\n );\n break;\n case 'panel-visibility':\n panel?.setVisible(cmd.visible);\n break;\n case 'panel-size':\n panel?.setSize(cmd.size);\n break;\n case 'start-picker': {\n picker?.stop();\n // Para elegir con comodidad se esconde TODO (barras + tarjeta) mientras\n // dura el picker; vuelve como estaba al terminar (elegir o cancelar).\n const panelWasShown = panel?.isVisible() ?? false;\n if (panelWasShown) panel?.setVisible(false);\n chrome?.setHidden(true);\n // La guía en preview también estorba (tapa elementos): se cierra y se\n // re-pinta al terminar, con el mismo comando que la mostró.\n const previewToRestore = lastPreview;\n if (previewToRestore) {\n detachPreviewTools();\n closeGuidePreview();\n }\n const restorePanel = (): void => {\n chrome?.setHidden(false);\n if (panelWasShown) panel?.setVisible(true);\n if (previewToRestore && lastPreview === previewToRestore) {\n applyPreviewGated(previewToRestore);\n }\n };\n picker = startElementPicker({\n onPick: (payload) => {\n picker = null;\n restorePanel();\n post({ type: 'picked', payload });\n },\n onCancel: () => {\n picker = null;\n restorePanel();\n post({ type: 'pick-cancelled' });\n },\n ...(cmd.maxAncestors !== undefined ? { maxAncestors: cmd.maxAncestors } : {}),\n ...(cmd.hint !== undefined ? { hint: cmd.hint } : {}),\n ...(cmd.only !== undefined ? { only: cmd.only } : {}),\n });\n break;\n }\n case 'stop-picker':\n picker?.stop();\n picker = null;\n chrome?.setHidden(false);\n break;\n case 'scan-page':\n post({ type: 'page-scan', payload: scanPage(cmd.selectors) });\n break;\n case 'highlight':\n setHighlight(cmd.selector);\n break;\n case 'show-confirmation':\n showConfirmation(cmd.payload);\n break;\n case 'preview':\n if (!cmd.guide) break;\n // Mientras hay un drag en curso, no remontar la preview debajo del\n // mouse del autor: se encola el ÚLTIMO comando y se aplica al soltar.\n if (manipulator?.isDragging()) pendingPreview = cmd;\n else applyPreviewGated(cmd);\n break;\n case 'block-drag':\n handleBlockDrag(cmd);\n break;\n case 'select-block': {\n selectedBlockId = cmd.blockId;\n const h = document.querySelector<HTMLElement>('[data-veo-guide]');\n if (h && !previewMode) applyBlockHighlight(h, previewStepIndex);\n if (!previewMode) rawBlock?.select(cmd.blockId);\n break;\n }\n case 'select-row': {\n selectedRowId = cmd.blockId;\n const h = document.querySelector<HTMLElement>('[data-veo-guide]');\n if (h && !previewMode) renderRowChrome(h, previewStepIndex);\n break;\n }\n case 'close-preview':\n detachPreviewTools();\n hideDragGhost();\n pendingPreview = null;\n lastPreview = null;\n disarmPreviewTrigger();\n cancelPreviewDelay();\n previewFired = false;\n previewDismissed = false;\n closeGuidePreview();\n break;\n case 'teardown':\n teardown();\n break;\n }\n };\n\n const onMessage = (event: MessageEvent): void => {\n if (event.origin !== dashboardOrigin) return;\n const data = event.data as { source?: unknown; token?: unknown } | null;\n if (!data || data.source !== VEO_BUILDER_SOURCE || data.token !== token) return;\n handleCommand(data as BuilderCommand);\n };\n\n const onPageHide = (): void => post({ type: 'closed' });\n\n // ── Watcher de navegación (SPA): al cambiar de página, re-evalúa la preview\n // contra su targeting por-página (aparece/desaparece como en el runtime). ──\n const onNav = (): void => {\n if (lastPreview && !manipulator?.isDragging()) applyPreviewGated(lastPreview);\n };\n const origPush = window.history.pushState;\n const origReplace = window.history.replaceState;\n const installNavWatcher = (): void => {\n window.history.pushState = function pushState(this: History, ...args) {\n const r = origPush.apply(this, args as Parameters<History['pushState']>);\n onNav();\n return r;\n };\n window.history.replaceState = function replaceState(this: History, ...args) {\n const r = origReplace.apply(this, args as Parameters<History['replaceState']>);\n onNav();\n return r;\n };\n window.addEventListener('popstate', onNav);\n window.addEventListener('hashchange', onNav);\n };\n const removeNavWatcher = (): void => {\n window.history.pushState = origPush;\n window.history.replaceState = origReplace;\n window.removeEventListener('popstate', onNav);\n window.removeEventListener('hashchange', onNav);\n };\n\n const teardown = (): void => {\n window.removeEventListener('message', onMessage);\n window.removeEventListener('pagehide', onPageHide);\n removeNavWatcher();\n picker?.stop();\n picker = null;\n detachPreviewTools();\n hideDragGhost();\n pendingPreview = null;\n disarmPreviewTrigger();\n cancelPreviewDelay();\n closeGuidePreview();\n post({ type: 'closed' }); // avisar al editor ANTES de sacar el panel\n panel?.teardown();\n panel = null;\n highlightBox?.remove();\n highlightBox = null;\n confirmation?.remove();\n confirmation = null;\n if (confirmationKey) document.removeEventListener('keydown', confirmationKey, true);\n confirmationKey = null;\n chrome?.teardown();\n chrome = null;\n clearBuilderToken(); // salir del modo builder: no re-activar en la próxima carga\n };\n\n /**\n * Inventario de la página para el panel de features: elementos interactivos\n * (`INTERACTIVE_SELECTOR`: botones, enlaces, campos, formularios, controles\n * ARIA…) visibles, fuera del chrome/panel de OnUser, que no matchean ninguna\n * feature ya tagueada; y cuáles de los selectores dados existen en la página.\n */\n const scanPage = (selectors: string[]): PageScan => {\n const present = selectors.filter((sel) => {\n try {\n return document.querySelector(sel) !== null;\n } catch {\n return false;\n }\n });\n const taggedEls = new Set<Element>();\n for (const sel of present) {\n try {\n for (const e of Array.from(document.querySelectorAll(sel))) taggedEls.add(e);\n } catch {\n // selector inválido: ya filtrado arriba\n }\n }\n const seen = new Set<string>();\n const candidates: PageElement[] = [];\n const nodes = document.querySelectorAll(INTERACTIVE_SELECTOR);\n for (const element of Array.from(nodes)) {\n if (candidates.length >= 200) break;\n if (element.closest('[data-veo-builder-chrome],[data-veo-builder-panel],[data-veo-picker]')) {\n continue;\n }\n if (element.getClientRects().length === 0) continue;\n // Ya tagueado (él o un ancestro con feature): no es candidato.\n let tagged = false;\n for (let n: Element | null = element; n; n = n.parentElement) {\n if (taggedEls.has(n)) {\n tagged = true;\n break;\n }\n }\n if (tagged) continue;\n const selector = buildSelectorPath(element, 5);\n if (!selector || seen.has(selector)) continue;\n seen.add(selector);\n candidates.push({\n selector,\n shortSelector: buildSelectorPath(element, 0),\n tag: element.tagName.toLowerCase(),\n id: element.id || null,\n classes: filterHumanClasses(element),\n text: elementLabelText(element),\n });\n }\n const { pathname, hash } = window.location;\n // Hash routing (`#/ruta`): la ruta visible incluye el hash.\n const routePath = /^#\\/./.test(hash) ? `${pathname}${hash}` : pathname;\n return { pagePath: pathname, routePath, candidates, present };\n };\n\n /**\n * Modal de confirmación centrado sobre la app (mock «Feature tagueada»):\n * backdrop + tarjeta con check verde, título, mensaje, filas y botón. El\n * panel se oculta mientras está abierto y vuelve al cerrarlo (botón o Esc).\n */\n let confirmation: HTMLElement | null = null;\n let confirmationKey: ((e: KeyboardEvent) => void) | null = null;\n const closeConfirmation = (): void => {\n if (!confirmation) return;\n confirmation.remove();\n confirmation = null;\n if (confirmationKey) document.removeEventListener('keydown', confirmationKey, true);\n confirmationKey = null;\n panel?.setVisible(true);\n post({ type: 'confirmation-closed' });\n };\n const showConfirmation = (card: ConfirmationCard): void => {\n if (confirmation) {\n confirmation.remove();\n confirmation = null;\n }\n panel?.setVisible(false);\n const host = document.createElement('div');\n host.setAttribute('data-veo-builder-chrome', '');\n host.setAttribute('data-veo-confirmation', '');\n const shadow = host.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n style.textContent = CONFIRMATION_STYLES;\n const backdrop = document.createElement('div');\n backdrop.className = 'veo-confirm-backdrop';\n const dialog = document.createElement('div');\n dialog.className = 'veo-confirm';\n dialog.setAttribute('role', 'dialog');\n dialog.setAttribute('aria-modal', 'true');\n dialog.setAttribute('aria-label', card.title);\n const badge = document.createElement('div');\n badge.className = 'veo-confirm-check';\n badge.innerHTML =\n '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12.5l4.5 4.5L19 7.5\"/></svg>';\n const title = document.createElement('h2');\n title.className = 'veo-confirm-title';\n title.textContent = card.title;\n const message = document.createElement('p');\n message.className = 'veo-confirm-msg';\n message.textContent = card.message;\n const rows = document.createElement('dl');\n rows.className = 'veo-confirm-rows';\n for (const r of card.rows) {\n const row = document.createElement('div');\n row.className = 'veo-confirm-row';\n const dt = document.createElement('dt');\n dt.textContent = r.label;\n const dd = document.createElement('dd');\n dd.textContent = r.value;\n row.append(dt, dd);\n rows.appendChild(row);\n }\n const button = document.createElement('button');\n button.type = 'button';\n button.className = 'veo-confirm-btn';\n button.textContent = card.buttonLabel ?? 'Listo';\n button.addEventListener('click', closeConfirmation);\n dialog.append(badge, title, message);\n if (card.rows.length > 0) dialog.appendChild(rows);\n dialog.appendChild(button);\n shadow.append(style, backdrop, dialog);\n document.body.appendChild(host);\n confirmation = host;\n confirmationKey = (e: KeyboardEvent): void => {\n if (e.key !== 'Escape') return;\n e.preventDefault();\n e.stopPropagation();\n closeConfirmation();\n };\n document.addEventListener('keydown', confirmationKey, true);\n button.focus();\n };\n\n /** Marco de resalte sobre un elemento (hover en la lista del panel). */\n let highlightBox: HTMLElement | null = null;\n const setHighlight = (selector: string | null): void => {\n highlightBox?.remove();\n highlightBox = null;\n if (!selector) return;\n let target: Element | null = null;\n try {\n target = document.querySelector(selector);\n } catch {\n return;\n }\n if (!target) return;\n const r = target.getBoundingClientRect();\n const box = document.createElement('div');\n box.setAttribute('data-veo-builder-chrome', '');\n box.style.cssText =\n `position:fixed;left:${r.left - 3}px;top:${r.top - 3}px;width:${r.width + 6}px;height:${r.height + 6}px;` +\n 'border:2px solid #FF5B35;border-radius:6px;background:rgba(255,91,53,0.10);pointer-events:none;z-index:2147483646;';\n document.body.appendChild(box);\n highlightBox = box;\n };\n\n // Transporte: panel inyectado (app top-level) o iframe/popup (embebida).\n if (ctx.panel) {\n // Chrome (barras) primero: el panel arranca debajo. Las acciones de las\n // barras van al panel como eventos `chrome-action`; seleccionar algo\n // vuelve a mostrar la tarjeta si estaba minimizada.\n chrome = injectBuilderChrome({\n appLabel: window.location.hostname,\n onAction: (action) => {\n switch (action.action) {\n // Controles que resuelve el SDK solo (no van al panel).\n case 'dock':\n panel?.setTopOffset(action.position === 'top' ? (chrome?.height() ?? 0) : 0);\n return;\n case 'show-panel':\n panel?.setVisible(true);\n return;\n case 'preview':\n if (previewMode) return;\n previewMode = true;\n // La activación se evalúa desde cero al entrar en vista previa.\n previewFired = false;\n previewDismissed = false;\n panelWasVisible = panel?.isVisible() ?? true;\n panel?.setVisible(false);\n chrome?.setPreview(true);\n if (lastPreview) applyPreviewGated(lastPreview);\n return;\n case 'exit-preview':\n if (!previewMode) return;\n previewMode = false;\n disarmPreviewTrigger();\n cancelPreviewDelay();\n chrome?.setPreview(false);\n panel?.setVisible(panelWasVisible);\n if (lastPreview) applyPreviewGated(lastPreview);\n return;\n case 'select-activation':\n case 'select-step':\n case 'add-step':\n panel?.setVisible(true);\n break;\n }\n post({ type: 'chrome-action', payload: action });\n },\n });\n panel = injectBuilderPanel({\n dashboardOrigin,\n token,\n appOrigin: window.location.origin,\n guide: ctx.guide,\n panelPath: ctx.panelPath,\n onClose: () => teardown(),\n topOffset: chrome.height(),\n });\n chrome.onHeightChange((h) => panel?.setTopOffset(chrome?.dock() === 'top' ? h : 0));\n } else {\n staticTarget = resolveTarget();\n if (!staticTarget) return null;\n }\n\n const activate = (): void => {\n window.addEventListener('message', onMessage);\n window.addEventListener('pagehide', onPageHide);\n installNavWatcher();\n // Panel: esperamos el `panel-ready` del iframe para postear `ready` (todavía\n // puede no tener su listener). iframe/popup: el opener ya escucha → posteamos ya.\n if (!ctx.panel) post({ type: 'ready' });\n };\n\n // Modo panel inyectado: la seguridad ya la da la sesión AUTENTICADA del\n // dashboard (el panel es un iframe del dashboard con Clerk) — el token es solo\n // correlación. Activamos directo, SIN verify: el verify contra el backend\n // podría fallar por expiración del token durante el login (que tarda), dejando\n // el panel para siempre en \"conectando…\".\n //\n // Modo iframe/popup (embebido): verificamos el token firmado antes de activar\n // (si `init()` dejó la config). Solo bloquea si el backend dice {valid:false}.\n const cfg = (window as unknown as { __veoBuilder?: { apiKey?: string; apiUrl?: string } })\n .__veoBuilder;\n if (!ctx.panel && cfg?.apiKey && cfg?.apiUrl) {\n void verifyBuilderToken(cfg.apiUrl, cfg.apiKey, token).then((ok) => {\n if (ok) activate();\n else if (window.console) console.warn('[veo] token de builder inválido — modo no activado');\n });\n } else {\n activate();\n }\n\n return { teardown };\n}\n\n/**\n * Verifica el token con el backend. Solo devuelve `false` (no activar) cuando el\n * backend responde explícitamente `{valid:false}` (token forjado/expirado/de\n * otro workspace). Ante 404/red caída/errores transitorios devuelve `true`\n * (best-effort) para no brickear el modo builder.\n */\nasync function verifyBuilderToken(apiUrl: string, apiKey: string, token: string): Promise<boolean> {\n try {\n const url = `${apiUrl.replace(/\\/+$/, '')}/v1/builder/verify`;\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-Api-Key': apiKey },\n body: JSON.stringify({ token }),\n });\n if (!res.ok) return true; // no pudimos verificar → best-effort\n const data = (await res.json().catch(() => null)) as { valid?: unknown } | null;\n return data?.valid !== false;\n } catch {\n return true; // red caída / sin backend → best-effort\n }\n}\n\n/** Ventana con la que hablar en modo iframe/popup: el opener o el parent. */\nfunction resolveTarget(): Window | null {\n if (window.opener && window.opener !== window) return window.opener as Window;\n if (window.parent && window.parent !== window) return window.parent;\n return null;\n}\n\nfunction resolveDashboardOrigin(originHint: string | null): string | null {\n // Origen de la URL o persistido en el primer arranque (antes del redirect).\n if (originHint) {\n try {\n return new URL(originHint).origin;\n } catch {\n return null;\n }\n }\n // Fallback: el referrer. Poco fiable tras un redirect same-origin (apunta a la\n // propia app), por eso el origen persistido va primero.\n if (hasDocument() && document.referrer) {\n try {\n return new URL(document.referrer).origin;\n } catch {\n return null;\n }\n }\n return null;\n}\n\n// Tipo re-exportado para consumidores que tipan el contexto.\nexport type { BuilderClientContext };\n\n/**\n * Lista de tareas en la preview del editor: progreso con un usuario de\n * preview (nombres y pasos reales de las guías publicadas, progreso 0). Solo\n * si `init()` dejó apiKey/apiUrl en `window.__veoBuilder`.\n */\nfunction previewProgressFetcher():\n | ((guideIds: string[]) => Promise<import('../guides/types').GuideProgressItem[]>)\n | undefined {\n const cfg = (window as unknown as { __veoBuilder?: { apiKey?: string; apiUrl?: string } })\n .__veoBuilder;\n if (!cfg?.apiKey || !cfg?.apiUrl) return undefined;\n const apiUrl = cfg.apiUrl.replace(/\\/+$/, '');\n const apiKey = cfg.apiKey;\n return async (guideIds) => {\n const params = new URLSearchParams({\n endUserId: 'veo_preview',\n guideIds: guideIds.join(','),\n includeUnpublished: '1',\n });\n const res = await fetch(`${apiUrl}/v1/guides/progress?${params}`, {\n headers: { 'X-Api-Key': apiKey },\n });\n if (!res.ok) return [];\n const data = (await res.json()) as { items?: import('../guides/types').GuideProgressItem[] };\n return data.items ?? [];\n };\n}\n","/**\n * Lado DASHBOARD del puente builder. Abre la app del cliente en un popup,\n * en modo builder, y expone una API para pedirle que seleccione un elemento\n * o previsualice una guía. Pensado para importarse en el dashboard\n * (`import { createBuilderSession } from '@veo/sdk/builder'`).\n *\n * Seguridad: solo procesa mensajes cuyo `origin` sea el de la app y cuyo\n * `token` coincida con el de esta sesión.\n */\nimport { hasWindow } from '../../utils/safe-env';\nimport type { PreviewGuideInput } from '../guides/guide-preview';\nimport {\n BUILDER_ORIGIN_PARAM,\n BUILDER_TOKEN_PARAM,\n type BuilderCommand,\n VEO_BUILDER_SOURCE,\n} from './bridge-protocol';\nimport type { PickedElement } from './element-picker';\n\nexport interface BuilderSessionOptions {\n /** URL de la app del cliente a abrir en modo builder. */\n appUrl: string;\n /** Token de la sesión (idealmente emitido/firmado por el backend). */\n token: string;\n /** Origen al que la app debe responder. Default: `location.origin`. */\n dashboardOrigin?: string;\n /** La app está lista y escuchando comandos. */\n onReady?: () => void;\n /** El usuario eligió un elemento. */\n onPicked?: (picked: PickedElement) => void;\n /** El usuario canceló la selección (Esc). */\n onCancelled?: () => void;\n /** La app cerró el modo builder (o el popup se cerró). */\n onClosed?: () => void;\n /**\n * Si se pasa, la app se embebe en este `<iframe>` (modo estudio in-app) en\n * lugar de abrirse en un popup. El lado app ya habla con `window.parent`,\n * así que el puente funciona igual. La sesión setea el `src` del iframe.\n */\n frame?: HTMLIFrameElement;\n /** Nombre de la ventana popup. Default: `veo-builder`. */\n windowName?: string;\n /** Features del popup. Default: ventana de ~1280×860. */\n windowFeatures?: string;\n}\n\nexport interface BuilderSession {\n /** Pide a la app que entre en modo selección de elemento. */\n startPicker(options?: { maxAncestors?: number; hint?: string }): void;\n /** Cancela la selección en curso. */\n stopPicker(): void;\n /** Pide a la app que previsualice una guía. */\n preview(guide: PreviewGuideInput): void;\n /** Cierra la preview activa en la app. */\n closePreview(): void;\n /** Cierra el popup y desconecta el puente. */\n close(): void;\n}\n\nconst DEFAULT_FEATURES = 'popup,width=1280,height=860';\nconst POPUP_POLL_MS = 600;\n\nexport function createBuilderSession(options: BuilderSessionOptions): BuilderSession {\n if (!hasWindow()) return noopSession();\n\n const dashboardOrigin = options.dashboardOrigin ?? window.location.origin;\n const appOrigin = safeOrigin(options.appUrl);\n const url = buildAppUrl(options.appUrl, options.token, dashboardOrigin);\n\n const frame = options.frame ?? null;\n const useFrame = frame !== null;\n\n let popup: Window | null = null;\n if (useFrame) {\n // biome-ignore lint/style/noNonNullAssertion: useFrame garantiza frame\n frame!.src = url;\n } else {\n popup = window.open(\n url,\n options.windowName ?? 'veo-builder',\n options.windowFeatures ?? DEFAULT_FEATURES,\n );\n }\n\n /** Ventana destino de los comandos: el popup o el contentWindow del iframe. */\n const targetWindow = (): Window | null => (useFrame ? (frame?.contentWindow ?? null) : popup);\n\n const post = (command: BuilderCommand): void => {\n const w = targetWindow();\n if (!w) return;\n if (!useFrame && popup?.closed) return;\n w.postMessage(\n { source: VEO_BUILDER_SOURCE, token: options.token, ...command },\n appOrigin ?? '*',\n );\n };\n\n let pollTimer: ReturnType<typeof setInterval> | undefined;\n\n const cleanup = (): void => {\n window.removeEventListener('message', onMessage);\n if (pollTimer !== undefined) {\n clearInterval(pollTimer);\n pollTimer = undefined;\n }\n };\n\n const onMessage = (event: MessageEvent): void => {\n if (appOrigin && event.origin !== appOrigin) return;\n const data = event.data as {\n source?: unknown;\n token?: unknown;\n type?: unknown;\n payload?: unknown;\n } | null;\n if (!data || data.source !== VEO_BUILDER_SOURCE || data.token !== options.token) return;\n\n switch (data.type) {\n case 'ready':\n options.onReady?.();\n break;\n case 'picked':\n if (data.payload) options.onPicked?.(data.payload as PickedElement);\n break;\n case 'pick-cancelled':\n options.onCancelled?.();\n break;\n case 'closed':\n cleanup();\n options.onClosed?.();\n break;\n }\n };\n\n window.addEventListener('message', onMessage);\n\n // Detectar cierre manual del popup (el usuario cierra la ventana). En modo\n // iframe el ciclo de vida lo controla el dashboard (no hay nada que pollear).\n if (!useFrame) {\n pollTimer = setInterval(() => {\n if (popup?.closed) {\n cleanup();\n options.onClosed?.();\n }\n }, POPUP_POLL_MS);\n }\n\n return {\n startPicker: (o) =>\n post({\n type: 'start-picker',\n ...(o?.maxAncestors !== undefined ? { maxAncestors: o.maxAncestors } : {}),\n ...(o?.hint !== undefined ? { hint: o.hint } : {}),\n }),\n stopPicker: () => post({ type: 'stop-picker' }),\n preview: (guide) => post({ type: 'preview', guide }),\n closePreview: () => post({ type: 'close-preview' }),\n close: () => {\n post({ type: 'teardown' });\n if (useFrame) {\n if (frame) frame.src = 'about:blank';\n } else if (popup && !popup.closed) {\n popup.close();\n }\n cleanup();\n },\n };\n}\n\nfunction buildAppUrl(appUrl: string, token: string, dashboardOrigin: string): string {\n try {\n const u = new URL(appUrl, window.location.href);\n u.searchParams.set(BUILDER_TOKEN_PARAM, token);\n u.searchParams.set(BUILDER_ORIGIN_PARAM, dashboardOrigin);\n return u.toString();\n } catch {\n return appUrl;\n }\n}\n\nfunction safeOrigin(url: string): string | null {\n try {\n return new URL(url, window.location.href).origin;\n } catch {\n return null;\n }\n}\n\nfunction noopSession(): BuilderSession {\n return {\n startPicker: () => {},\n stopPicker: () => {},\n preview: () => {},\n closePreview: () => {},\n close: () => {},\n };\n}\n"]}