{"version":3,"sources":["jsdelivr-header.js","/gh/OZO-Verbindzorg/ozo-scripts@1.9.23/main.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,CCDA,WACE,aAIA,MAAM,EACG,6DADH,EAEI,8DAFJ,EAGS,6EAHT,EAIW,iFAJX,EAKU,+EALV,EAOO,iEAPP,EAQK,qEAIL,EAAgB,CAAC,EAEvB,SAAS,EAAW,GAWlB,OAVK,EAAc,KACjB,EAAc,GAAO,IAAI,QAAQ,CAAC,EAAS,KACzC,MAAM,EAAS,SAAS,cAAc,UACtC,EAAO,IAAM,EACb,EAAO,OAAQ,EACf,EAAO,OAAS,EAChB,EAAO,QAAU,EACjB,SAAS,KAAK,YAAY,MAGvB,EAAc,EACvB,CAKA,SAAS,IACF,OAAO,MAAS,OAAO,eAC5B,EAAW,GAAY,KAAK,KAC1B,MAAM,EAAQ,IAAI,MAAM,CACtB,KAAM,GACN,gBAAiB,EACjB,mBAAoB,WACpB,gBAAgB,EAChB,aAAa,IAEf,EAAM,GAAG,SAAU,cAAc,QACjC,KAAK,OAAO,IAAK,IACf,EAAM,IAAW,IAAP,KAEZ,KAAK,OAAO,aAAa,GACzB,OAAO,MAAQ,GAEnB,CAGA,SAAS,IACP,MAAM,EAAO,QAAO,IAAI,MAAO,eAC/B,SAAS,iBAAiB,sBAAsB,QAAS,IACvD,EAAG,YAAc,GAErB,CAGA,SAAS,IACH,SAAS,cAAc,2BAA2B,EAAW,GAC7D,SAAS,cAAc,6BAA6B,EAAW,GAC/D,SAAS,cAAc,4BAA4B,EAAW,EACpE,CAIA,MAAM,EAAY,CAChB,MAAO,uCACP,KAAM,6CAGR,SAAS,IACP,MAAM,EAAS,CAAC,cAAe,cAAe,UAAW,aAAc,SAAU,SACjF,IAAI,GAAU,EACd,SAAS,IACH,IACJ,GAAU,EACV,EAAO,QAAS,GAAS,OAAO,oBAAoB,EAAM,IAC1D,EAAW,EAAU,KAAO,iBAAiB,KAAK,KAC5C,OAAO,UAAU,OAAO,SAAS,KAAK,KAE9C,CACA,EAAO,QAAS,GAAS,OAAO,iBAAiB,EAAM,EAAO,CAAE,SAAS,IAC3E,CAMA,SAAS,IACP,SAAS,iBAAiB,eAAe,QAAS,IAChD,MAAM,EAAQ,EAAM,uBACf,IACL,EAAM,iBAAiB,QAAS,IAAM,EAAM,UAAU,IAAI,UAC1D,EAAM,iBAAiB,OAAQ,KACxB,EAAM,OAAO,EAAM,UAAU,OAAO,aAG/C,CAGA,MAAM,EAAU,CACd,YAAa,CACX,cAAe,OACf,MAAO,IACP,aAAc,GACd,YAAY,EACZ,SAAU,CAAE,SAAS,GACrB,WAAY,CAAE,OAAQ,eAAgB,OAAQ,iBAEhD,SAAU,CACR,cAAe,OACf,gBAAgB,EAChB,MAAM,EACN,MAAO,IACP,aAAc,GACd,eAAe,EACf,gBAAgB,EAChB,SAAU,CAAE,MAAO,EAAG,sBAAsB,EAAO,mBAAmB,GACtE,SAAU,CAAE,SAAS,IAEvB,WAAY,CACV,cAAe,EACf,MAAO,IACP,aAAc,GACd,SAAU,CAAE,SAAS,GACrB,YAAa,CACX,IAAK,CAAE,cAAe,IAAK,gBAAgB,GAC3C,IAAK,CAAE,gBAAgB,KAG3B,QAAS,CACP,cAAe,OACf,MAAO,IACP,aAAc,GACd,YAAY,EACZ,SAAU,CAAE,SAAS,GACrB,WAAY,CAAE,OAAQ,eAAgB,OAAQ,kBAclD,SAAS,IACP,MAAM,EAAU,OAAO,KAAK,GAAS,OAAQ,GAAa,SAAS,cAAc,IAC5E,EAAQ,QACb,EAAW,GAAa,KAAK,KAE3B,EAAQ,QAAS,GAAa,IAAI,OAAO,EAAU,CAAE,KAAM,CAAE,UAAW,eAAiB,EAAQ,OAErG,CAIA,SAAS,IACP,MAAM,EAAS,IAAI,SAAS,iBAAiB,cAC7C,IAAK,EAAO,OAAQ,OAEpB,MAAM,EAAe,GAAuB,oBAAb,EAAM,GAC/B,EAAS,CAAC,EAAM,IACpB,SAAS,eAAe,GAAG,KAAQ,EAAM,QACxC,EAAY,GAAS,SAAS,eAAe,GAAG,WAAgB,MAGnE,SAAS,EAAK,GACZ,EAAM,QACN,EAAM,OAAQ,EACT,EAAY,KAAQ,EAAM,YAAc,EAC/C,CAGA,SAAS,EAAM,GACb,EAAK,GACL,MAAM,EAAc,SAAS,eAAe,SAAS,EAAM,MACvD,GAAa,EAAY,OAC/B,CA2BA,EAAO,QAAQ,GACf,EAAO,QAxBP,SAAgB,GACd,MAAM,EAAU,EAAM,iBAAiB,eAClC,EAAQ,UACR,EAAM,aAAa,WAAa,EAAM,iBAAiB,SAC5D,EAAQ,QAAS,IACf,EAAO,QAAQ,IAAM,EAAO,aAAa,OACzC,EAAO,gBAAgB,SAEzB,EAAM,gBAAgB,YACtB,EAAM,QAAU,OAChB,EAAM,QACR,GAeA,EAAO,QAAS,IACd,MAAM,EAAa,EAAO,OAAQ,GAC5B,EAAc,EAAO,QAAS,GAChC,GACF,EAAW,iBAAiB,QAAS,KACnC,EAAO,QAAS,IACV,IAAU,GAAO,EAAM,KAnBnC,SAAsB,GACpB,MAAM,EAAU,EAAM,iBAAiB,oBAClC,EAAQ,SACb,EAAQ,QAAS,IACf,EAAO,aAAa,MAAO,EAAO,QAAQ,KAC1C,EAAO,gBAAgB,cAEzB,EAAM,OACR,CAaM,CAAa,GACb,EAAM,OAAQ,EACd,EAAM,SAGN,GAAa,EAAY,iBAAiB,QAAS,IAAM,EAAK,KAEtE,CAIA,SAAS,IACP,IAAK,SAAS,cAAc,eAAgB,OAC5C,MAAM,EAAM,KACV,SAAS,iBAAiB,2CAA2C,QAAS,IACxE,EAAK,YAAY,QAAQ,EAAK,gBAAgB,iBAGtD,IACA,OAAO,QAAU,OAAO,SAAW,GACnC,OAAO,QAAQ,KAAK,EACtB,CAGA,SAAS,IACP,IAAK,SAAS,cAAc,+CAAgD,OAC5E,MAAM,EAAQ,IAAI,gBAAgB,OAAO,SAAS,QAAQ,IAAI,SACzD,GAML,SAAS,iBAAiB,sBAAsB,QAAS,IACvD,EAAG,YAAc,IAEnB,SAAS,iBAAiB,gDAAgD,QAAS,IAC5E,EAAG,QAAO,EAAG,MAAQ,MAT1B,SAAS,iBAAiB,2BAA2B,QAAS,IAC5D,EAAG,MAAM,QAAU,QAUzB,CAIA,SAAS,IACP,MAAM,EAAO,SAAS,cAAc,aACpC,IAAK,EAAM,OACX,MAAM,GAAS,IAAI,gBAAgB,SAAS,QAAQ,IAAI,UAAY,IAAI,OAClE,EAAO,EAAK,cAAc,kBAC1B,EAAU,EAAK,cAAc,sBAC7B,EAAU,EAAK,cAAc,mBAC7B,EAAY,EAAK,cAAc,qBAC/B,EAAU,EAAK,cAAc,2BAC7B,EAAS,EAAK,cAAc,0BAGlC,GAFI,GAAS,EAAQ,SACjB,GAAQ,EAAO,UACd,EAAqD,YAA5C,EAAK,aAAa,gBAAiB,QACjD,EAAK,aAAa,gBAAiB,WAEnC,MAAM,EAAQ,IAAO,GAAK,IAAI,cAAc,UAAU,OAAO,QAAQ,SAAU,IACzE,EAAO,IAAI,IAAI,CAAC,KAAM,MAAO,MAAO,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,KAAM,KAAM,OAAQ,KAAM,MAAO,MAAO,OAAQ,MAAO,MAAO,MAAO,KAAM,KAAM,MAAO,QACjK,EAAQ,EAAK,GAAO,MAAM,iBAAiB,OAAQ,GAAM,EAAE,OAAS,IAAM,EAAK,IAAI,IACpF,EAAM,QAAQ,EAAM,KAAK,EAAK,IACnC,MAAM,EAAO,GAAM,EAAE,QAAQ,UAAY,IAAO,CAAE,IAAK,QAAS,IAAK,OAAQ,IAAK,OAAQ,IAAK,UAAW,KACpG,EAAU,IAAI,OAAO,IAAM,EAAM,IAAK,GAAM,EAAE,QAAQ,sBAAuB,SAAS,KAAK,KAAO,IAAK,MAGvG,EAAS,CAAE,KAAM,WAAY,KAAM,WAAY,KAAM,aAAc,KAAM,kBAC/E,SAAS,EAAW,GAClB,MAAM,EAAI,EAAK,QAAQ,MAAO,KAAO,IAC/B,EAAI,EAAE,MAAM,oBAClB,GAAI,EAAG,CACL,MAAM,EAAI,EAAE,GACZ,MAAI,oCAAoC,KAAK,GAAW,CAAE,MAAO,OAAQ,IAAK,gBAAiB,IAAK,UAC1F,cAAN,EAA0B,CAAE,MAAO,OAAQ,IAAK,YAAa,IAAK,eAC5D,gBAAN,EAA4B,CAAE,MAAO,OAAQ,IAAK,cAAe,IAAK,SAChE,kBAAN,EAA8B,CAAE,MAAO,OAAQ,IAAK,gBAAiB,IAAK,IACvE,CAAE,MAAO,OAAQ,IAAK,mBAAoB,IAAK,GACxD,CACA,MAAI,mBAAmB,KAAK,GAAW,CAAE,MAAO,OAAQ,IAAK,WAAY,IAAK,WACpE,gBAAN,EAA4B,CAAE,MAAO,OAAQ,IAAK,aAAc,IAAK,WACrE,sCAAsC,KAAK,GAAW,CAAE,MAAO,OAAQ,IAAK,iBAAkB,IAAK,WAChG,CAAE,MAAO,OAAQ,IAAW,MAAN,EAAY,OAAS,WAAY,IAAK,UACrE,CAQA,SAAS,EAAS,GAChB,EAAI,iBAAiB,4PAA4P,QAAS,GAAM,EAAE,UAClS,MAAM,EAAO,EAAI,cAAc,SAAW,EAAI,cAAc,kBAAoB,EAAI,KAGpF,OADA,EAAK,iBAAiB,uDAAuD,QAAS,GAAO,EAAG,OAAO,EAAI,eAAe,UAClH,EAAK,aAAe,IAAI,QAAQ,OAAQ,KAC7C,QAAQ,yBAA0B,OAClC,QAAQ,cAAe,MACvB,QAAQ,UAAW,IAAI,MAC5B,CACA,SAAS,EAAQ,GACf,MAAM,EAAI,EAAK,GAET,EAAO,GAEb,GADA,EAAM,QAAS,IAAQ,IAAI,EAAI,EAAE,QAAQ,GAAI,KAAO,GAAK,GAAK,EAAK,OAAS,IAAM,EAAK,KAAK,GAAI,EAAI,EAAE,QAAQ,EAAG,EAAI,EAAE,WAClH,EAAK,OAAQ,MAAO,GACzB,EAAK,KAAK,CAAC,EAAG,IAAM,EAAI,GACxB,MAAM,EAAU,IACd,MAAM,EAAK,EAAK,YAAY,KAAM,EAAK,GACjC,EAAI,EAAK,EAAI,EAAI,EAAK,EACtB,EAAK,EAAK,QAAQ,KAAM,GAC9B,MAAO,CAAC,EAAG,EAAK,EAAI,EAAK,OAAS,EAAK,IAEzC,IAAI,EAAK,EAAK,KAAM,IAAQ,MAAO,EAAG,GAAK,EAAO,GAAI,OAAO,EAAI,GAAK,UAC3D,IAAP,IAAkB,EAAK,EAAK,IAChC,IAAK,GAAS,EAAO,GACjB,EAAK,EAAQ,MAAK,EAAQ,EAAK,QAAQ,IAAK,EAAK,IAAM,GAC3D,IAAI,EAAM,EAAK,MAAM,EAAO,EAAQ,KAEpC,OADI,EAAQ,IAAM,EAAK,SAAQ,EAAM,EAAI,QAAQ,UAAW,IAAM,KAC3D,EAAI,GAAK,QAAQ,EAAS,kBACnC,CACA,MAAM,EAAQ,WACd,eAAe,EAAU,GACvB,IAAM,MAAM,EAAI,eAAe,QAAQ,EAAQ,GAAM,GAAI,EAAG,OAAO,KAAK,MAAM,EAAI,CAAE,MAAO,GAAI,CAC/F,MAAM,QAAa,MAAM,EAAK,CAAE,YAAa,gBAAiB,KAAM,GAAO,EAAE,GAAK,EAAE,OAAS,IACvF,GAAM,IAAI,WAAY,gBAAgB,EAAM,aAE5C,EAAO,CAAE,MADD,EAAI,cAAc,6BAA+B,CAAC,GAAG,SAAW,GACzD,KAAM,EAAS,GAAK,MAAM,EAAG,MAClD,IAAM,eAAe,QAAQ,EAAQ,EAAK,KAAK,UAAU,GAAQ,CAAE,MAAO,GAAI,CAC9E,OAAO,CACT,CAGA,MAAM,EAAO,IAAI,IACX,EAAQ,IAAI,EAAK,iBAAiB,wBAAwB,IAAK,IACnE,MAAM,EAAI,EAAK,cAAc,WAC7B,IAAK,EAAG,OAAO,KACf,MACM,EADM,IAAI,IAAI,EAAE,aAAa,QAAS,SAAS,QACpC,SACjB,OAAI,EAAK,IAAI,IAAS,yCAAyC,KAAK,GAAc,MAClF,EAAK,IAAI,GACF,CAAE,OAAM,OAzDG,EAyDe,EAAE,aAAe,GAxDpC,EAAE,MAAM,YAAY,IAAK,GAAM,EAAE,QAAQ,OAAQ,GAAM,IAAM,yBAAyB,KAAK,IAC5F,IAAM,EAAE,QAuDkC,IAAK,EAAW,KAzDtD,IAAC,IA0DjB,OAAO,SAEV,EAAM,KAAK,CAAC,EAAG,KAAO,EAAM,KAAM,GAAM,EAAK,EAAE,OAAO,SAAS,IAAM,EAAI,IAAM,EAAM,KAAM,GAAM,EAAK,EAAE,OAAO,SAAS,IAAM,EAAI,IAyBlI,EAAM,QAtBN,SAAkB,EAAG,GACnB,IAAI,EACA,EAAS,EAAO,EAAQ,WAAU,IAEpC,EAAO,SAAS,cAAc,KAC9B,EAAK,UAAY,qWACjB,EAAK,UAAY,WAEnB,EAAK,gBAAgB,yBACrB,EAAK,aAAa,OAAQ,EAAE,MAC5B,EAAK,MAAM,YAAY,MAAO,GAC9B,EAAK,QAAQ,MAAQ,EAAE,IAAI,MAC3B,MAAM,EAAM,EAAK,cAAc,WA5EjB,IAAC,EA6Ef,EAAI,YAAc,EAAE,IAAI,IACpB,EAAE,IAAI,KAAK,EAAI,UAAU,IAAI,EAAE,IAAI,KACvC,EAAK,cAAc,aAAa,aA/EjB,EA+EuC,EAAE,KA/EhC,CAAC,qBAAqB,OAAO,EAAK,MAAM,KAAK,OAAO,UAAU,KAAK,QAgF3F,EAAK,cAAc,kBAAkB,YAAc,EAAE,MACrD,EAAK,UAAU,IAAI,cACnB,EAAK,cAAc,iBAAiB,YAAc,SAClD,EAAK,YAAY,GACjB,EAAE,KAAO,CACX,GAgHI,EAAM,QAAQ,EAAK,aAAa,gBAAiB,WA5DrD,iBACE,IAAI,EAAM,QAeJ,QAAQ,IAAI,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,GAAG,IAdrC,iBACE,KAAO,EAAM,EAAM,QAAQ,CACzB,MAAM,EAAI,EAAM,KAChB,IACE,MAAM,QAAU,EAAU,EAAE,MACtB,EAAI,EAAQ,EAAE,MACpB,IAAK,IAAM,EAAM,KAAM,GAAM,EAAK,EAAE,MAAQ,IAAM,EAAE,MAAM,SAAS,IAAK,CAAE,EAAE,KAAK,SAAU,EAAE,MAAO,EAAM,QAAU,CACpH,EAAE,KAAK,cAAc,iBAAiB,UAAY,GAAK,EAAI,EAAE,KAC/D,CAAE,MAAO,GACP,EAAE,KAAK,cAAc,iBAAiB,YAAc,EACtD,CACA,EAAE,KAAK,UAAU,OAAO,aAC1B,CACF,GAEF,CA6CA,GACG,KAAK,IAAO,EAAM,KAAM,IAAO,EAAE,MAAQ,EA/G5C,iBACE,IAAK,EAAS,OAAO,EACrB,MAAM,QAAa,MAAM,OAAQ,CAAE,YAAa,gBAAiB,KAAM,GAAO,EAAE,GAAK,EAAE,OAAS,IAAK,MAAM,IAAM,IAC3G,GAAM,IAAI,WAAY,gBAAgB,EAAM,aAC5C,EAAO,GACP,EAAQ,IAAI,IAuClB,OAtCA,EAAI,iBAAiB,gBAAgB,QAAS,IAC5C,MAAM,EAAM,EAAG,cAAc,oBACvB,EAAM,EAAG,cAAc,kBAC7B,IAAK,IAAQ,EAAK,OAClB,MAAM,EAAI,EAAI,YAAY,QAAQ,OAAQ,KAAK,OAC/C,GAAI,EAAM,IAAI,GAAI,OAClB,EAAM,IAAI,GACV,MAAM,EAAK,EAAK,GAAI,EAAK,EAAK,EAAI,aAClC,IAAI,EAAQ,EAEZ,GADA,EAAM,QAAS,IAAY,EAAG,SAAS,KAAI,GAAS,GAAO,EAAG,SAAS,KAAI,GAAS,MAC/E,EAAO,OACZ,MAAM,EAAM,EAAG,QAAQ,cACjB,EAAM,GAAO,EAAI,uBACjB,EAAI,GAAO,EAAI,cAAc,SACnC,EAAK,KAAK,CAAE,IAAG,MAAK,QAAO,MAAO,EAAI,EAAE,YAAY,OAAS,OAE/D,EAAK,KAAK,CAAC,EAAG,IAAM,EAAE,MAAQ,EAAE,OAChC,EAAK,MAAM,EAAG,GAAG,QAAS,IACxB,IAAI,EACA,EAAQ,EAAI,EAAO,WAAU,IAE/B,EAAI,SAAS,cAAc,WAC3B,EAAE,UAAY,cACd,EAAE,UAAY,yMAEhB,EAAE,gBAAgB,wBAClB,EAAE,MAAO,EACT,EAAE,cAAc,iBAAiB,YAAc,EAAE,MACjD,EAAE,cAAc,iBAAiB,UAAY,EAAI,EAAE,GAAG,QAAQ,EAAS,mBACvE,MAAM,EAAI,EAAE,cAAc,aAC1B,EAAE,UAAY,GAEd,KADY,EAAE,IAAI,cAAc,gBAAkB,EAAE,KAC5C,YAAY,QAAS,GAAM,EAAE,YAAY,SAAS,WAAW,GAAG,KACxE,EAAE,iBAAiB,KAAK,QAAS,IAAa,EAAE,YAAY,QAAQ,cAAe,KAAK,EAAE,WAC1F,EAAE,iBAAiB,WAAW,QAAS,IAAY,WAAW,KAAK,EAAE,aAAa,WAAa,EAAE,KAAK,SAAS,SAAS,QAAO,EAAE,OAAS,YAC1I,EAAQ,YAAY,KAElB,EAAK,QAAQ,EAAK,aAAa,kBAAmB,IAC/C,KAAK,IAAI,EAAK,OAAQ,EAC/B,CAkEgD,GAAU,MAAM,IAAM,IACnE,KAAM,GA7CT,SAAgB,GACd,MAAM,EAAO,EAAM,OAAQ,IAAO,EAAE,MAC9B,EAAQ,EAAK,OACnB,IAAK,IAAU,EAGb,OAFA,EAAK,aAAa,gBAAiB,cAC/B,IAAS,EAAQ,YAAc,KAGrC,EAAK,aAAa,gBAAiB,WACnC,MAAM,EAAQ,GACV,GAAO,EAAM,KAAK,WAAa,EAAQ,cAA0B,IAAV,EAAc,SAAW,aAChF,GAAM,EAAM,KAAK,WAAa,EAAO,cAAyB,IAAT,EAAa,WAAa,eAC/E,IAAS,EAAQ,UAAY,EAAM,KAAK,QAAU,aACtD,MAAM,EAAY,EAAK,cAAc,mBAGrC,GAFI,GAAW,EAAU,gBAAgB,gBAAiB,IAErD,EAAW,OAChB,EAAU,UAAY,GACtB,MAAM,EAAS,CAAC,EAChB,EAAK,QAAS,IAAQ,EAAO,EAAE,IAAI,QAAU,EAAO,EAAE,IAAI,QAAU,GAAK,IACzE,MAAM,EAAO,OAAO,KAAK,GAAQ,OAAQ,GAAM,EAAO,IACtD,GAAI,EAAK,OAAS,EAAG,OACrB,MAAM,EAAO,GACP,EAAK,CAAC,EAAK,EAAO,KACtB,MAAM,EAAI,SAAS,cAAc,UACjC,EAAE,KAAO,SACT,EAAE,UAAY,YACd,EAAE,UAAY,EAAI,GAAS,8BAAgC,EAAI,UAC/D,EAAE,aAAa,eAAwB,QAAR,EAAgB,OAAS,SACxD,EAAE,iBAAiB,QAAS,KAC1B,EAAK,QAAS,GAAM,EAAE,aAAa,eAAgB,IAAM,EAAI,OAAS,UACtE,EAAK,QAAS,IAAQ,EAAE,KAAK,OAAiB,QAAR,GAAiB,EAAE,IAAI,QAAU,IACvE,EAAK,gBAAgB,mBAA4B,QAAR,KAE3C,EAAK,KAAK,GACV,EAAU,YAAY,IAExB,EAAG,MAAO,QAAS,GACnB,EAAK,QAAS,GAAM,EAAG,EAAG,EAAO,GAAI,EAAO,IAC9C,CAMkB,CAAO,GAC3B,CAIA,SAAS,IACP,MAAM,EAAM,SAAS,cAAc,uBACnC,IAAK,EAAK,OACV,MAAM,EAAO,EAAI,cAAc,qBACzB,EAAO,EAAI,cAAc,qBAC/B,IAAK,IAAS,EAAM,OACpB,MAAM,EAAI,KAAM,EAAI,IAAK,EAAI,QAEvB,EAAU,GAChB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAG,IAAK,CAC1B,MAAM,GAAM,IAAU,GAAJ,GAAU,KAAK,GAAK,IAAK,EAAK,EAAK,KAAK,GAAK,EACzD,EAAK,CAAC,EAAI,EAAI,KAAK,IAAI,GAAK,EAAI,EAAI,KAAK,IAAI,IAC7C,EAAK,CAAC,EAAI,EAAI,KAAK,IAAI,GAAK,EAAI,EAAI,KAAK,IAAI,IAC9C,GAAG,EAAQ,KAAK,GACrB,EAAQ,KAAK,CAAC,EAAG,GAAK,EAAI,KAAK,IAAI,GAAK,EAAG,GAAK,EAAI,KAAK,IAAI,IAAM,CAAC,EAAG,GAAK,EAAI,KAAK,IAAI,GAAK,EAAG,GAAK,EAAI,KAAK,IAAI,IAAM,EAC3H,CAEA,MAAM,EAAO,EAAQ,IAAI,EAAE,EAAG,MAAS,MAAM,EAAI,KAAO,EAAI,GAAK,EAAI,IAAM,EAAI,KAAK,OAAS,EAAG,MAAO,CAAC,EAAG,KACrG,EAAK,GAAM,EAAE,QAAQ,GAerB,EAAS,OAAO,WAAW,oCAAoC,QACrE,IAAI,EAAI,EAAG,EAAO,EAAG,EAAK,EAAG,EAAQ,EAAG,EAAM,EAC9C,MAAM,EAAQ,IAAQ,EAAK,aAAa,IAhB1B,CAAC,IACb,MAAM,EAAI,EAAQ,IAAI,CAAC,EAAG,IAAM,CAAC,EAAE,IAAM,EAAK,GAAG,GAAK,EAAE,IAAM,EAAG,EAAE,IAAM,EAAK,GAAG,GAAK,EAAE,IAAM,IAC9F,IAAI,EAAI,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,GAAG,MACjC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAE,OAAQ,GAAK,EAAG,GAAK,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,EAAI,GAAG,OAAO,EAAE,EAAE,EAAI,GAAG,OAAO,EAAE,EAAE,EAAI,GAAG,OAAO,EAAE,EAAE,EAAI,GAAG,MAC5I,OAAO,GAYoC,CAAM,IAAK,EAAK,aAAa,IAT5D,CAAC,IACb,MAAM,EAAK,MAAQ,GAAK,MAAQ,EAAG,EAAK,EAClC,GAAO,GAAK,GAAK,GAAK,KAAK,GAAK,IAAK,GAAO,KAAO,KAAO,KAAO,GAAK,EACtE,EAAK,KAAK,IAAI,GAAO,EAAK,EAAK,KAAK,IAAI,GAAO,EACrD,MAAO,IAAI,EAAE,EAAK,MAAO,EAAE,EAAK,MAAO,EAAE,EAAK,MAAO,EAAE,EAAK,MAKiB,CAAM,KAErF,SAAS,EAAK,GACP,IAAO,EAAQ,GACpB,MAAM,EAAI,KAAK,KAAK,EAAM,GAAS,IAAK,GAP7B,IAAC,EAQZ,EAAI,GAAQ,EAAK,KARL,EAQkB,GARP,GAAM,EAAI,EAAI,EAAI,EAAI,EAAI,KAAK,KAAK,EAAI,EAAI,EAAG,GAAK,GAS3E,EAAK,GACM,EAAP,EAAI,EAAS,sBAAsB,GAAkB,CAC3D,CAPA,EAAK,GAgBL,IAAI,iBARS,KACX,MAAM,EAAwE,SAA/D,SAAS,gBAAgB,aAAa,qBAAkC,EAAI,EAC3F,GAAI,IAAW,IAAO,GAAO,IAAM,EAAnC,CAEA,GADA,EAAK,EACD,EAA2B,OAAjB,EAAI,OAAI,EAAK,GAC3B,EAAO,EAAG,EAAQ,EACb,IAAK,EAAM,sBAAsB,GAJY,IAMzB,QAAQ,SAAS,gBAAiB,CAAE,YAAY,EAAM,gBAAiB,CAAC,sBACrG,CAOA,SAAS,IACP,MAAM,EAAU,SAAS,cAAc,YACvC,IAAK,IAAY,OAAO,KAAM,OAC9B,MAAM,EAAO,SAAS,gBAGtB,IAAI,EAAQ,OAAO,QACf,EAAS,EACT,GAAS,EAEb,MAAM,EAAS,IAC8B,SAA3C,EAAQ,aAAa,mBACsB,SAA3C,EAAK,aAAa,wBAChB,EAAQ,cAAc,0BAK1B,SAAS,IACP,KAAK,aAAa,GAClB,KAAK,IAAI,EAAS,CAAE,WAAY,aAClC,CAEA,SAAS,EAAU,GACjB,GAAI,IAAS,EAAQ,OAErB,GADA,EAAS,GACJ,EAQH,YAPA,KAAK,GAAG,EAAS,CACf,EAAG,EACH,SAAU,GACV,KAAM,aACN,WAAW,EACX,WAAY,IAKhB,MAAM,EAAW,EAAQ,wBAAwB,OAAS,KAAK,YAAY,EAAS,KAAO,GAC3F,KAAK,GAAG,EAAS,CAAE,GAAI,EAAU,SAAU,IAAM,KAAM,YAAa,WAAW,GACjF,CAwBA,OAAO,iBAAiB,SAtBxB,WACE,MAAM,EAAI,KAAK,IAAI,OAAO,QAAS,GAC7B,EAAQ,EAAI,EAElB,OADA,EAAQ,EACJ,KACF,EAAS,OACT,KAGE,EA7CU,IA8CZ,EAAS,OACT,GAAU,SAGP,IAED,EAAQ,GAAM,EAAS,IAAG,EAAS,GACvC,GAAU,EACN,EAvDY,GAuDQ,GAAU,GACzB,GAxDO,IAwDc,GAAU,IAC1C,EAE4C,CAAE,SAAS,IAEvD,MAAM,EAAa,KACZ,MACL,GAAS,EACT,MAEF,IAAI,iBAAiB,GAAY,QAAQ,EAAS,CAChD,YAAY,EACZ,SAAS,EACT,gBAAiB,CAAC,iBAAkB,mBAEtC,IAAI,iBAAiB,GAAY,QAAQ,EAAM,CAAE,YAAY,EAAM,gBAAiB,CAAC,sBACvF,CAGA,SAAS,IACP,MAAM,EACK,GADL,EAEO,GAFP,EAGQ,GAHR,EAIK,IAJL,EAKQ,GALR,EAMS,GANT,EAOO,IAPP,EAQQ,IAKR,EAAW,SAAS,cAAc,oBAClC,EAAU,SAAS,cAAc,mBACjC,EAAc,SAAS,cAAc,2BACrC,EAAgB,SAAS,cAAc,6BAEvC,GADS,SAAS,cAAc,sBACrB,SAAS,cAAc,yBAClC,EAAU,IAAI,SAAS,iBAAiB,2BACxC,EAAS,IAAI,SAAS,iBAAiB,uBACvC,EAAS,SAAS,cAAc,wBAChC,EAAU,SAAS,cAAc,sBACjC,EAAO,SAAS,cAAc,qBAC7B,EAAS,EAAS,GAAW,CAAC,MAAO,MAAO,OAAO,IACvD,GAAO,SAAS,cAAc,sBAAsB,QAGvD,KAAK,GAAa,GAAY,GAAgB,GAAkB,GAAa,GAAW,GAAS,QAE7F,GAAS,EAAK,YAAY,QAAW,EAAK,aAAa,eAAe,EAAK,aAAa,aAAc,YAE1G,MAAM,EAAQ,CACZ,QAAQ,EACR,YAAa,KACb,kBAAmB,EACnB,SAAU,OAAO,YAAc,IAC/B,gBAAgB,EAChB,kBAAmB,KACnB,WAAY,KACZ,WAAY,KACZ,GAAI,KACJ,SAAU,KACV,cAAe,MAGX,EAAY,GAAS,SAAS,cAAc,sBAAsB,OAClE,EAAa,GAAS,SAAS,cAAc,0BAA0B,OACvE,EAAW,GAAO,EAAG,iBAAiB,oBACtC,EAAc,IAAM,EAAQ,iBAAiB,wBAC7C,EAAY,GAAS,EAAQ,QAAQ,EAAU,IAC/C,EAAW,GAAO,GAAK,EAAI,EAAI,CAAE,OAAQ,GAqB/C,SAAS,EAAO,GACV,EAAM,KACR,EAAM,GAAK,OACX,EAAM,GAAO,KAEjB,CAEA,SAAS,IACP,EAAO,MACP,KAAK,aAAa,GAClB,KAAK,aAAa,GAClB,EAAO,QAAS,IACd,KAAK,aAAa,GAClB,KAAK,aAAa,EAAQ,KAE9B,CAEA,SAAS,IACP,EAAO,YACP,KAAK,aAAa,CAAC,EAAS,EAAS,EAAS,GAChD,CAEA,SAAS,IACP,EAAO,iBACP,KAAK,aAAa,KAClB,KAAK,aAAa,CAAC,EAAS,IAC5B,EAAO,QAAS,IACd,KAAK,aAAa,GAClB,KAAK,aAAa,EAAQ,KAE9B,CAEA,SAAS,IACP,EAAQ,QAAS,GAAM,EAAE,aAAa,gBAAiB,SACzD,CAEA,SAAS,IACP,EAAO,QAAS,IACd,KAAK,IAAI,EAAG,CACV,WAAY,SACZ,QAAS,EACT,cAAe,OACf,EAAG,EACH,EAAG,EACH,SAAU,IAEZ,KAAK,IAAI,EAAQ,GAAI,CAAE,UAAW,EAAG,EAAG,EAAG,EAAG,EAAG,SAAU,MAE7D,KAAK,IAAI,EAAe,CAAE,OAAQ,EAAG,WAAY,cACjD,KAAK,IAAI,EAAU,CAAE,UAAW,IAChC,EAAS,aAAa,iBAAkB,SACxC,GACF,CAEA,SAAS,IACP,EAAO,QAAS,IACd,KAAK,IAAI,EAAG,CAAE,UAAW,EAAG,SAAU,EAAG,WAAY,UAAW,cAAe,SAC/E,KAAK,IAAI,EAAQ,GAAI,CAAE,SAAU,GAAI,UAAW,MAElD,KAAK,IAAI,IAAe,CAAE,SAAU,EAAG,EAAG,EAAG,UAAW,IACxD,KAAK,IAAI,EAAS,CAAE,UAAW,EAAG,EAAG,IACrC,KAAK,IAAI,EAAS,CAAE,UAAW,IAC/B,KAAK,IAAI,EAAM,CAAE,UAAW,IAC5B,KAAK,IAAI,EAAe,CAAE,WAAY,WACtC,KAAK,IAAI,EAAU,CAAE,UAAW,GAClC,CAEA,SAAS,EAAa,GACpB,MAAM,EAAK,EAAS,GACpB,IAAK,EAAI,OAAO,EAChB,MAAM,EAAI,EAAG,MACP,EAAO,CAAC,EAAE,WAAY,EAAE,QAAS,EAAE,eACzC,OAAO,OAAO,EAAG,CAAE,WAAY,UAAW,QAAS,IAAK,cAAe,SACvE,MAAM,EAAI,EAAG,wBAAwB,OAErC,OADC,EAAE,WAAY,EAAE,QAAS,EAAE,eAAiB,EACtC,CACT,CAEA,SAAS,EAAa,GACpB,GAAI,EAAM,QAAU,EAAM,cAAgB,EAAW,OACrD,GAAI,EAAM,OAAQ,OA0DpB,SAAqB,EAAU,GAC7B,MAAM,EAAM,EAAS,GAAU,EAAS,GAAY,GAAK,EACnD,EAAS,EAAS,GACtB,EAAO,EAAS,GAClB,IAAK,IAAW,EAAM,OACtB,MAAM,EAAW,EAAQ,GACvB,EAAS,EAAQ,GACb,EAAW,EAAa,GAC9B,IAAK,EAAU,OACf,IAEA,EAAO,QAAS,IACd,KAAK,IAAI,EAAG,CAAE,WAAY,SAAU,QAAS,EAAG,cAAe,OAAQ,SAAU,IACjF,KAAK,IAAI,EAAQ,GAAI,CAAE,UAAW,EAAG,EAAG,EAAG,EAAG,MAEhD,KAAK,IAAI,EAAQ,CAAE,WAAY,UAAW,QAAS,EAAG,cAAe,OAAQ,EAAG,IAC5E,EAAS,QAAQ,KAAK,IAAI,EAAU,CAAE,UAAW,EAAG,EAAG,EAAG,EAAG,IACjE,KAAK,IAAI,EAAU,CAAE,UAAW,IAChC,MAAM,EAAW,EAAU,GAC3B,EAAM,YAAc,EACpB,EAAM,iBAAmB,EAAS,GAClC,IACI,GAAU,EAAS,aAAa,gBAAiB,QACrD,MAAM,GAAc,GAAP,EACX,EAAY,GAAN,EACF,EAAK,KAAK,WAChB,EAAM,GAAK,EACP,EAAS,QAAQ,EAAG,GAAG,EAAU,CACnC,UAAW,EACX,EAAG,EACH,SAAU,EACV,KAAM,aACL,GACH,EAAG,IAAI,EAAQ,CAAE,WAAY,SAAU,QAAS,EAAG,cAAe,OAAQ,SAAU,GAAK,GAErF,EAAS,QAAQ,EAAG,IAAI,EAAU,CAAE,EAAG,GAAK,GAChD,EAAG,GAAG,EAAe,CAAE,OAAQ,EAAU,SAAU,EAAa,KAAM,cAAgB,KACtF,EAAG,IAAI,EAAM,CAAE,WAAY,UAAW,QAAS,EAAG,cAAe,OAAQ,SAAU,GACnE,GADwE,GAEpF,EAAO,QACT,EAAG,OAAO,EAAQ,CAAE,UAAW,EAAG,EAAG,GAAO,CACxC,UAAW,EACX,EAAG,EACH,SAAU,EACV,QAAS,EAAQ,EAAO,QACxB,KAAM,cAES,GAAjB,EAGN,CA5G2B,CAAY,EAAM,YAAa,GACxD,MAAM,EAAS,EAAa,GAC5B,IAAK,EAAQ,OACb,IACA,IACA,MAAM,EAAK,EAAS,GACd,EAAO,EAAQ,GACf,EAAS,EAAU,GACzB,EAAM,QAAS,EACf,EAAM,YAAc,EACpB,EAAM,iBAAmB,EAAS,GAClC,EAAS,aAAa,iBAAkB,QACpC,GAAQ,EAAO,aAAa,gBAAiB,QACjD,KAAK,IAAI,EAAe,CAAE,OAAQ,IAClC,MAAM,EAAK,KAAK,WAChB,EAAM,GAAK,EACX,EAAG,GAAG,EAAU,CAAE,UAAW,EAAG,SAAU,EAAgB,KAAM,cAAgB,GAChF,EAAG,GAAG,EAAe,CAAE,SAAQ,SAAU,EAAe,KAAM,cAAgB,GAC9E,EAAG,IAAI,EAAI,CAAE,WAAY,UAAW,QAAS,EAAG,cAAe,QAAU,KACrE,EAAK,QACP,EAAG,OAAO,EAAM,CAAE,UAAW,EAAG,EAAG,GAAK,CACpC,UAAW,EACX,EAAG,EACH,SAAU,EACV,QAAS,EAAQ,EAAK,QACtB,KAAM,cAER,GAGN,CAEA,SAAS,IACP,IAAK,EAAM,OAAQ,OACnB,MAAM,EAAK,EAAS,EAAM,aACpB,EAAO,EAAK,EAAQ,GAAM,GAChC,IACA,MAAM,EAAK,KAAK,SAAS,CACvB,UAAA,GACE,EAAM,QAAS,EACf,EAAM,YAAc,KACpB,EAAM,kBAAoB,EAC1B,EAAM,GAAK,KACX,GACF,IAEF,EAAM,GAAK,EACP,EAAK,QAAQ,EAAG,GAAG,EAAM,CAC3B,UAAW,EACX,GAAI,EACJ,SAA2B,GAAjB,EACV,KAAM,aACL,GACH,EAAG,GAAG,EAAe,CAAE,OAAQ,EAAG,SAAU,EAAgB,KAAM,aAAe,KACjF,EAAG,GAAG,EAAU,CAAE,UAAW,EAAG,SAAU,EAAiB,KAAM,cAAgB,GAC7E,GAAI,EAAG,IAAI,EAAI,CAAE,WAAY,SAAU,QAAS,EAAG,cAAe,QACxE,CAsDA,SAAS,EAAkB,GACzB,GAAI,EAAM,SAAU,OACpB,MAAM,EAAO,EAAE,cAAc,aAAa,wBACrC,IACL,aAAa,EAAM,YACnB,EAAM,WAAa,KACnB,aAAa,EAAM,YACnB,EAAM,WAAa,WAAW,IAAM,EAAa,GAAO,EAAM,OAAS,EAnQrD,KAoQpB,CAEA,SAAS,IACH,EAAM,WACV,aAAa,EAAM,YACnB,EAAM,WAAa,KACnB,EAAM,WAAa,WAAW,EAzQZ,KA0QpB,CA+BA,SAAS,EAAe,GACtB,WAAW,KACT,MAAM,EAAK,EAAS,GACpB,IAAK,EAAI,OACT,MAAM,EAAO,EAAG,cAAc,KACzB,IACL,KAAK,IAAI,EAAM,CAAE,WAAY,YAC7B,EAAK,UACJ,GACL,CAEA,SAAS,EAAsB,GAC7B,GAAI,EAAM,SAAU,OACpB,MAAM,EAAO,EAAE,cAAc,aAAa,wBAC1C,GAAc,UAAV,EAAE,KAA6B,MAAV,EAAE,IAOzB,OANA,EAAE,sBACE,EAAM,QAAU,EAAM,cAAgB,EAAM,KAE9C,EAAa,GACb,EAAe,KASnB,GALc,cAAV,EAAE,MACJ,EAAE,iBACG,EAAM,QAAU,EAAM,cAAgB,GAAM,EAAa,GAC9D,EAAe,IAEH,QAAV,EAAE,MAAkB,EAAE,UAAY,EAAM,QAAU,EAAM,cAAgB,EAAM,CAChF,EAAE,iBACF,MAAM,EAAO,EAAS,IAAO,cAAc,KACvC,GAAM,EAAK,OACjB,CACF,CAEA,SAAS,EAAqB,GAC5B,GAAI,EAAM,WAAa,EAAM,OAAQ,OACrC,MAAM,EAAK,EAAS,EAAM,aAC1B,IAAK,EAAI,OACT,MAAM,EAAQ,IAAI,EAAG,iBAAiB,MAChC,EAAM,EAAM,QAAQ,SAAS,eAKnC,GAJc,cAAV,EAAE,MACJ,EAAE,iBACF,GAAO,EAAM,GAAK,EAAM,QAAQ,SAEpB,YAAV,EAAE,IAEJ,GADA,EAAE,iBACE,GAAO,EAAG,CAAE,MAAM,EAAI,EAAU,EAAM,aAAkB,GAAG,EAAE,OAAS,MACrE,EAAM,EAAM,GAAG,QAEtB,GAAc,QAAV,EAAE,MAAkB,EAAE,UAAY,IAAQ,EAAM,OAAS,EAAG,CAC9D,EAAE,iBACF,MAAM,EAAS,EAAQ,QAAQ,EAAU,EAAM,cACzC,EAAO,EAAS,EAAQ,OAAS,EAAI,EAAQ,EAAS,GAAK,KACjE,IACI,GAAM,EAAK,OACjB,CACA,GAAc,QAAV,EAAE,KAAiB,EAAE,UAAoB,IAAR,EAAW,CAC9C,EAAE,iBACF,MAAM,EAAI,EAAU,EAAM,aACtB,GAAG,EAAE,OACX,CACF,CAEA,SAAS,EAAc,GACrB,MAAM,EAAK,KAAK,SAAS,CAAE,SAAU,CAAE,KAAM,kBAc7C,OAbI,GACF,EAAG,GAAG,EAAS,CAAE,EAAG,WAAY,SAAU,KAAQ,GAClD,EAAG,GAAG,EAAS,CAAE,EAAG,YAAa,SAAU,KAAQ,GACnD,EAAG,GAAG,EAAS,CAAE,UAAW,EAAG,SAAU,IAAO,IAChD,EAAG,GAAG,EAAS,CAAE,SAAU,GAAI,SAAU,IAAO,KAChD,EAAG,GAAG,EAAS,CAAE,UAAW,GAAI,SAAU,IAAO,OAEjD,EAAG,GAAG,EAAS,CAAE,SAAU,EAAG,SAAU,IAAO,GAC/C,EAAG,GAAG,EAAS,CAAE,SAAU,EAAG,SAAU,IAAO,GAC/C,EAAG,GAAG,EAAS,CAAE,EAAG,EAAG,SAAU,KAAQ,KACzC,EAAG,GAAG,EAAS,CAAE,EAAG,EAAG,SAAU,KAAQ,KACzC,EAAG,GAAG,EAAS,CAAE,UAAW,EAAG,SAAU,IAAO,MAE3C,CACT,CA0BA,SAAS,IACP,MAAM,EAAW,EAAM,kBACjB,EAAU,EAAW,EAAS,GAAY,KAChD,IACA,IACA,EAAS,aAAa,iBAAkB,SACxC,EAAM,gBAAiB,EACvB,EAAM,kBAAoB,KAC1B,EAAO,aAAa,gBAAiB,SACrC,MAAM,EAAK,KAAK,SAAS,CACvB,UAAA,GACE,SAAS,KAAK,MAAM,SAAW,GAC/B,EAAM,SAAW,KACjB,GACF,IAEF,EAAM,SAAW,EACjB,EAAG,IAAI,GAAc,GAAQ,GAEzB,GAAY,IACd,EAAG,GAAG,EAAS,CAAE,UAAW,EAAG,SAAU,GAAK,KAAM,gBAAkB,KACtE,EAAG,GAAG,EAAS,CAAE,UAAW,EAAG,SAAU,GAAK,KAAM,aAAe,MAGrE,EAAG,GAAG,EAAS,CAAE,UAAW,EAAG,SAAU,GAAK,KAAM,gBAAkB,IACxE,CAuCA,SAAS,IACP,IAAK,EAAM,kBAAmB,OAC9B,MAAM,EAAK,EAAS,EAAM,mBAC1B,IAAK,EAAI,OACT,IACA,MAAM,EAAW,IACX,EAAY,EAAQ,GACpB,EAAK,KAAK,SAAS,CACvB,UAAA,GACE,EAAM,kBAAoB,KAC1B,EAAM,cAAgB,IACxB,IAEF,EAAM,cAAgB,EAElB,EAAU,QACZ,EAAG,GAAG,EAAI,CACR,SAAU,GACV,UAAW,EACX,SAAU,GACV,QAAS,IACT,KAAM,aACL,GAGL,EAAG,IAAI,EAAI,CAAE,UAAW,EAAG,cAAe,QAAU,KAEpD,EAAG,GAAG,EAAS,CAAE,UAAW,EAAG,SAAU,GAAK,KAAM,aAAe,GACnE,EAAG,GAAG,EAAM,CAAE,UAAW,EAAG,SAAU,IAAM,KAAM,cAAgB,KAE9D,EAAS,QACX,EAAG,OAAO,EAAU,CAAE,UAAW,GAAI,UAAW,GAAK,CACjD,SAAU,EACV,UAAW,EACX,SAAU,IACV,QAAS,IACT,KAAM,cAER,IAGN,CAEA,SAAS,EAAkB,GACzB,IAAK,EAAM,WAAa,EAAM,eAAgB,OAC9C,MAAM,EAAO,EAAE,cAAc,aAAa,wBACtC,IACF,EAAE,iBApFN,SAAyB,GACvB,MAAM,EAAK,EAAS,GACpB,IAAK,EAAI,OACT,IACA,EAAM,kBAAoB,EAC1B,MAAM,EAAW,IACX,EAAY,EAAQ,GACpB,EAAK,KAAK,WAChB,EAAM,cAAgB,EAElB,EAAS,QACX,EAAG,GAAG,EAAU,CACd,UAAW,GACX,UAAW,EACX,SAAU,IACV,QAAS,IACT,KAAM,aACL,GAGL,EAAG,GAAG,EAAM,CAAE,UAAW,EAAG,SAAU,GAAK,KAAM,aAAe,GAChE,EAAG,GAAG,EAAS,CAAE,UAAW,EAAG,SAAU,IAAM,KAAM,gBAAkB,KAEvE,EAAG,IAAI,EAAI,CAAE,UAAW,EAAG,SAAU,EAAG,cAAe,QAAU,IAC7D,EAAU,QACZ,EAAG,OAAO,EAAW,CAAE,SAAU,EAAG,UAAW,GAAK,CAChD,SAAU,EACV,UAAW,EACX,SAAU,GACV,QAAS,EAAQ,EAAU,QAC3B,KAAM,cAER,IAGN,CAkDI,CAAgB,GAEpB,CAEA,IAAI,EAAc,KACd,EAAY,OAAO,WAyCvB,EAAQ,QAAS,IACf,EAAI,iBAAiB,aAAc,GACnC,EAAI,iBAAiB,aAAc,GACnC,EAAI,iBAAiB,UAAW,GAChC,EAAI,iBAAiB,QAAS,KAEhC,EAAY,iBAAiB,aA3S7B,WACM,EAAM,WACV,aAAa,EAAM,YACnB,EAAM,WAAa,KACrB,GAwSA,EAAY,iBAAiB,aAtS7B,WACM,EAAM,WACV,EAAM,WAAa,WAAW,EApRZ,KAqRpB,GAoSA,EAAO,QAAS,GAAM,EAAE,iBAAiB,UAAW,IACpD,EAAS,iBAAiB,QAAS,GACnC,SAAS,iBAAiB,UApS1B,SAAsB,GACpB,GAAc,WAAV,EAAE,IACN,GAAI,EAAM,SACR,EAAM,kBAAoB,IAAqB,EAAM,gBAAkB,SAGzE,GAAI,EAAM,OAAQ,CAChB,MAAM,EAAI,EAAU,EAAM,aAC1B,IACI,GAAG,EAAE,OACX,CACF,GA0RA,SAAS,iBAAiB,QAxR1B,SAAwB,IAClB,EAAM,UAAa,EAAM,SACxB,EAAE,OAAO,QAAQ,qBAAqB,IAC7C,GAsRA,EAAO,iBAAiB,QAAS,IAAM,EAAM,eAAiB,IAlM9D,WACE,IACA,EAAM,gBAAiB,EACvB,EAAS,aAAa,iBAAkB,QACxC,EAAO,aAAa,gBAAiB,QACrC,SAAS,KAAK,MAAM,SAAW,SAC/B,MAAM,EAAQ,IACR,EAAK,KAAK,WAChB,EAAM,SAAW,EACjB,EAAG,IAAI,GAAc,GAAO,GAC5B,EAAG,GAAG,EAAS,CAAE,UAAW,EAAG,SAAU,GAAK,KAAM,cAAgB,GAChE,EAAM,QACR,EAAG,OAAO,EAAO,CAAE,UAAW,EAAG,EAAG,IAAM,CACtC,UAAW,EACX,EAAG,EACH,SAAU,GACV,QAAS,IACT,KAAM,cAER,IAGN,CA6KE,IACF,EAAQ,iBAAiB,QAAS,GAClC,OAAO,iBAAiB,SAtDxB,WACE,MAAM,EAAI,OAAO,WACb,IAAM,IACV,EAAY,EACZ,aAAa,GACb,EAAc,WAAW,KACvB,MAAM,EAAM,EAAM,SAClB,EAAM,SAAW,OAAO,YAAc,IAClC,IAAQ,EAAM,WAChB,IACA,IACA,KAAK,IAAI,EAAS,CAAE,WAAY,QAChC,KAAK,IAAI,IAAe,CAAE,WAAY,QACtC,KAAK,IAAI,EAAS,CAAE,UAAW,IAC/B,KAAK,IAAI,EAAM,CAAE,WAAY,QAC7B,KAAK,IAAI,CAAC,EAAS,EAAS,GAAU,CAAE,SAAU,EAAG,EAAG,EAAG,UAAW,IACtE,EAAO,QAAS,IACd,KAAK,IAAI,EAAG,CAAE,WAAY,QAC1B,KAAK,IAAI,EAAQ,GAAI,CAAE,WAAY,UAErC,EAAO,aAAa,gBAAiB,SACrC,EAAM,gBAAiB,EACvB,EAAM,kBAAoB,KAC1B,SAAS,KAAK,MAAM,SAAW,GAC/B,MAEG,GAAO,EAAM,WAChB,IACA,EAAM,QAAS,EACf,EAAM,YAAc,KACpB,EAAM,kBAAoB,EAhf9B,aAAa,EAAM,YACnB,aAAa,EAAM,YACnB,EAAM,WAAa,EAAM,WAAa,KAgflC,EAAS,aAAa,iBAAkB,SACxC,IACA,MAED,KACL,GAmBA,EAAM,SAAW,IAAgB,GACnC,CAGA,SAAS,IACP,MAAM,EAAO,IAAI,SAAS,iBAAiB,2BAC3C,IAAK,EAAK,OAAQ,OAElB,MAAM,EAAO,OAAO,qBAAuB,CAAE,GAAO,WAAW,EAAI,MAC7D,EAAO,IAAM,EAAK,IAAM,EAAK,QAAS,IAC1C,EAAI,QAAU,QACV,EAAI,QAAQ,EAAI,SAAS,MAAM,WAET,aAAxB,SAAS,WAA2B,IACnC,OAAO,iBAAiB,OAAQ,EAAM,CAAE,MAAM,GACrD,CAGA,SAAS,IACP,MAAM,EAAI,SAAS,gBACjB,EAAI,SAAS,cAAc,oBAC3B,EAAI,SAAS,cAAc,wBAC3B,EAAI,SAAS,cAAc,uBAC7B,IAAK,IAAM,EAAG,OACd,MAAM,EAAI,EAAE,cAAc,YACxB,EAAS,IAA8C,SAAxC,EAAE,aAAa,qBAchC,SAAS,IAbS,GAA0C,SAArC,EAAE,aAAa,mBAcrB,SAAS,cAAc,IAAI,cAAc,UAAW,CACjE,IAAK,SACL,SAAS,KAEX,EAAE,aAAa,oBAAqB,QACpC,EAAE,aAAa,gBAAiB,QAC5B,GAAG,WAAW,IAAM,EAAE,QAAS,IACrC,CAEA,SAAS,EAAM,GACb,EAAE,gBAAgB,qBAClB,EAAE,aAAa,gBAAiB,SAC5B,GAAG,EAAE,OACX,CA1BA,EAAE,aAAa,gBAAiB,SAEd,WAAd,EAAE,UACJ,EAAE,aAAa,OAAQ,UAClB,EAAE,aAAa,aAAa,EAAE,aAAa,WAAY,KAC5D,EAAE,iBAAiB,UAAW,IACd,UAAV,EAAE,KAA6B,MAAV,EAAE,MAC3B,EAAE,iBACF,IAAW,EAAM,GAAK,QAmB1B,SAAS,iBAAiB,QAAS,IACjC,MAAM,EAA6B,IAAtB,EAAE,OAAO,SAAiB,EAAE,OAAS,EAAE,OAAO,cAC3D,GAAK,EACL,OAAI,EAAK,QAAQ,yBACf,EAAE,sBACF,IAAW,EAAM,GAAK,WAGnB,MACD,IAAS,GACR,EAAK,QAAQ,wBADA,EAAM,OAG1B,SAAS,iBAAiB,UAAW,IAAqB,WAAV,EAAE,KAAoB,KAAU,EAAM,IACxF,CAGA,SAAS,IACO,SAAS,iBAAiB,wBAClC,QAAS,IACb,MAAM,EAAO,EAAc,cAAc,QACzC,IAAK,EAAM,OACX,MAAM,EAAiB,EAAK,iBAAiB,mBAGvC,EAAa,EAAK,cAAc,iBAChC,EAAkB,EAAa,EAAW,cAAc,wBAC5D,KAmBF,SAAS,IACP,IAAI,GAAW,EACX,EAAoB,KAyBxB,OAxBA,EAAe,QAAQ,SAAU,GAC/B,MAAM,EAAQ,EAAW,cAAc,2BACjC,EAAkB,EAAW,cAAc,2BACjD,GAAK,GAAU,EAAf,CAEA,GADI,IAAO,EAAM,qBAAsB,GACnC,EAAiB,CACnB,EAAgB,qBAAsB,EACvB,EAAgB,iBAC7B,+CACK,QAAQ,SAAU,GACvB,EAAM,qBAAsB,CAC9B,EACF,CACA,EAAkB,GACb,EAAQ,KACX,GAAW,EACN,IACH,EAAoB,GAAS,EAAgB,cAAc,UAdzB,CAiBxC,IACK,GAAY,GACf,EAAkB,QAEb,CACT,CAEA,SAAS,EAAQ,GACf,MAAM,EAAkB,EAAW,cAAc,2BACjD,GAAI,EAAiB,CACnB,MAAM,EAAS,EAAgB,iBAC7B,+CACI,EAAgB,EAAgB,iBAAiB,iBACjD,EAAM,SAAS,EAAgB,aAAa,SAAW,EACvD,EAAM,SAAS,EAAgB,aAAa,SAAW,EAAO,OAC9D,EAAe,EAAc,OACnC,MAAuB,UAAnB,EAAO,GAAG,KACL,GAAgB,EAED,IAAlB,EAAO,OACF,EAAO,GAAG,QAEV,GAAgB,GAAO,GAAgB,CAGpD,CAAO,CACL,MAAM,EAAQ,EAAW,cAAc,2BACvC,IAAK,EAAO,OAAO,EACnB,IAAI,GAAQ,EACZ,MAAM,EAAM,SAAS,EAAM,aAAa,SAAW,EAC7C,EAAM,SAAS,EAAM,aAAa,SAAW,IAC7C,EAAQ,EAAM,MAAM,OACpB,EAAS,EAAM,OACrB,GAAoC,WAAhC,EAAM,QAAQ,cAEJ,KAAV,GACU,aAAV,GACU,SAAV,GACU,UAAV,IAEA,GAAQ,QAEL,GAAmB,UAAf,EAAM,KAAkB,CAEjC,EADqB,6BACA,KAAK,EAC5B,MACM,EAAM,aAAa,QAAU,EAAS,IAAK,GAAQ,GACnD,EAAM,aAAa,QAAU,EAAS,IAAK,GAAQ,GAEzD,OAAO,CACT,CACF,CAEA,SAAS,EAAkB,GACzB,MAAM,EAAkB,EAAW,cAAc,2BACjD,GAAI,EAAiB,CACnB,MAAM,EAAS,EAAgB,iBAC7B,+CACoB,EAAgB,iBAAiB,iBACrC,OAAS,EACzB,EAAW,UAAU,IAAI,cAEzB,EAAW,UAAU,OAAO,cAG9B,GADc,EAAQ,GAEpB,EAAW,UAAU,IAAI,eACzB,EAAW,UAAU,OAAO,iBACvB,CACL,EAAW,UAAU,OAAO,eACM,MAAM,KAAK,GAAQ,KAAK,GAAS,EAChE,qBAED,EAAW,UAAU,IAAI,aAEzB,EAAW,UAAU,OAAO,YAEhC,CACF,KAAO,CACL,MAAM,EAAQ,EAAW,cAAc,2BACvC,IAAK,EAAO,OACE,EAAM,MAAM,OAExB,EAAW,UAAU,IAAI,cAEzB,EAAW,UAAU,OAAO,cAEhB,EAAQ,IAEpB,EAAW,UAAU,IAAI,eACzB,EAAW,UAAU,OAAO,eAE5B,EAAW,UAAU,OAAO,eACxB,EAAM,oBACR,EAAW,UAAU,IAAI,aAEzB,EAAW,UAAU,OAAO,aAGlC,CACF,CA5IA,EAAe,QAAQ,SAAU,GAC/B,MAAM,EAAS,EAAW,cAAc,UACxC,GAAI,EAAQ,CACM,EAAO,iBAAiB,UAChC,QAAQ,SAAU,GAEL,KAAjB,EAAO,OACU,aAAjB,EAAO,OACU,SAAjB,EAAO,OACU,UAAjB,EAAO,OAEP,EAAO,aAAa,WAAY,WAEpC,EACF,CACF,GA8HA,EAAe,QAAQ,SAAU,GAC/B,MAAM,EAAQ,EAAW,cAAc,2BACjC,EAAkB,EAAW,cAAc,2BACjD,GAAI,EAAiB,CACJ,EAAgB,iBAC7B,+CACK,QAAQ,SAAU,GACvB,EAAM,qBAAsB,EAC5B,EAAM,iBAAiB,SAAU,WAC/B,sBAAsB,WACpB,IAAK,EAAM,oBAAqB,CACT,EAAgB,iBACnC,iBAAiB,SACP,SAAS,EAAgB,aAAa,SAAW,KAE3D,EAAM,qBAAsB,EAEhC,CACI,EAAM,qBACR,EAAkB,EAEtB,EACF,GACA,EAAM,iBAAiB,OAAQ,WAC7B,EAAM,qBAAsB,EAC5B,EAAkB,EACpB,EACF,EACF,MAAW,IACT,EAAM,qBAAsB,EACQ,WAAhC,EAAM,QAAQ,cAChB,EAAM,iBAAiB,SAAU,WAC/B,EAAM,qBAAsB,EAC5B,EAAkB,EACpB,IAEA,EAAM,iBAAiB,QAAS,WAC9B,MACM,EADQ,EAAM,MAAM,OACL,OACf,EAAM,SAAS,EAAM,aAAa,SAAW,EAC7C,EAAM,SAAS,EAAM,aAAa,SAAW,IAC9C,EAAM,sBACU,UAAf,EAAM,KACJ,EAAQ,KAAa,EAAM,qBAAsB,IAGlD,EAAM,aAAa,QAAU,GAAU,GACvC,EAAM,aAAa,QAAU,GAAU,KAExC,EAAM,qBAAsB,IAI9B,EAAM,qBACR,EAAkB,EAEtB,GACA,EAAM,iBAAiB,OAAQ,WAC7B,EAAM,qBAAsB,EAC5B,EAAkB,EACpB,IAGN,GAGA,EAAK,WAAa,EAGb,GAAe,IACpB,EAAW,iBAAiB,QAAS,WAC/B,KACF,EAAK,cAAc,EAEvB,GACA,EAAK,iBAAiB,UAAW,SAAU,GACvB,UAAd,EAAM,KAA4C,aAAzB,EAAM,OAAO,UACxC,EAAM,iBACF,KACF,EAAK,cAAc,GAGzB,KAEJ,CAGA,SAAS,IAEP,MAAM,EAAY,uEAuId,SAAS,cAAc,yBApI3B,SAAsB,GACpB,GAAI,OAAO,OAAS,OAAO,MAAM,OAE/B,YADA,IAGF,MAAM,EAAW,SAAS,cAAc,eAAe,OACvD,GAAI,EAEF,YADA,EAAS,iBAAiB,OAAQ,EAAU,CAAE,MAAM,IAGtD,MAAM,EAAS,SAAS,cAAc,UACtC,EAAO,IAAM,EACb,EAAO,OAAS,EAChB,SAAS,KAAK,YAAY,EAC5B,CAuHE,CArHF,WAEE,MAAM,EAAe,SAAS,iBAAiB,wBAC1C,EAAa,QAElB,EAAa,QAAQ,SAAU,EAAc,GAE3C,GAAI,EAAa,aAAa,oBAAqB,OACnD,EAAa,aAAa,mBAAoB,QAG9C,MAAM,EAAe,EAAa,aAAa,uBAC/C,IAAK,EAAc,OACnB,MAAM,EAAS,EAAa,cAAc,UAC1C,IAAK,EAAQ,OAEb,MAAM,EACJ,kCAAkC,uDACpC,EAAO,aAAa,MAAO,GAE3B,EAAO,aAAa,QAAS,oBAC7B,EAAO,aAAa,cAAe,QACnC,EAAO,aAAa,WAAY,MAGhC,MAAM,EAAe,kBAAoB,EACzC,EAAa,aAAa,KAAM,GAEhC,MAAM,EAAS,IAAI,MAAM,OAAO,GAgBhC,SAAS,IACP,EAAa,aAAa,uBAAwB,QAClD,EAAa,aAAa,qBAAsB,QAChD,EAAO,MACT,CAEA,SAAS,IACP,EAAO,OACT,CAlBA,EAAO,GAAG,OAAQ,WAChB,EAAa,aAAa,oBAAqB,OACjD,GAGA,EAAO,GAAG,QAAS,WACjB,EAAa,aAAa,qBAAsB,QAClD,GAeA,IAAI,EAAY,KAChB,IAAK,IAAI,EAAK,EAAc,GAAM,IAAO,SAAS,KAAM,EAAK,EAAG,cAC9D,GAAsC,UAAlC,iBAAiB,GAAI,SAAsB,CAC7C,EAAY,EACZ,KACF,CAEF,IAAI,EAAY,KACZ,GAAc,EASlB,SAAS,IACP,GAAc,EACd,MAAM,EATR,WAEE,GAAI,EAAW,OAAO,OAAO,QAAU,OAAO,YAC9C,MAAM,EAAO,EAAa,wBAC1B,OAAO,EAAK,IAAM,OAAO,aAAe,EAAK,OAAS,CACxD,CAIiB,GACX,IAAW,IACf,EAAY,EACZ,EAAS,IAAoB,IAC/B,CAEA,SAAS,IACH,IACJ,GAAc,EACd,sBAAsB,GACxB,CAGyD,UAArD,EAAa,aAAa,uBAC5B,EAAO,QAC6D,UAA3D,EAAa,aAAa,+BACnC,IACA,OAAO,iBAAiB,SAAU,EAAsB,CAAE,SAAS,KAIrE,MAAM,EAAU,EAAa,cAAc,+BACvC,GACF,EAAQ,iBAAiB,QAAS,GAIpC,MAAM,EAAW,EAAa,cAAc,gCACxC,GACF,EAAS,iBAAiB,QAAS,WACjC,IAEyD,SAArD,EAAa,aAAa,yBAC5B,EAAa,aAAa,4BAA6B,QACvD,OAAO,oBAAoB,SAAU,GAEzC,EAEJ,EACF,EAKF,CAIA,IAAI,GAAgB,IAEpB,SAAS,IACP,SAAU,OAAO,QAAS,OAAO,MAAM,cAAgB,YAAY,MAAQ,EAAe,GAC5F,CAGA,SAAS,IACP,MAAM,EAAQ,SAAS,iBAAiB,oBACxC,IAAK,EAAM,OAAQ,OAEnB,MAIM,EAAO,CAAC,GAAI,GAAI,GAAI,GAAI,IAExB,EAAe,OAAO,WAAW,oCAAoC,QAqB3E,EAAM,QAAQ,IACZ,MAAM,EAAO,EAAK,cAAc,oBAChC,IAAK,EAAM,OAEX,MAAM,EAAM,WAAW,EAAK,aAAa,mBACvC,GACI,EAAQ,WAAW,EAAK,aAAa,qBACzC,IACI,EAnCE,MAmCU,EAAK,OAAS,GAG1B,EAAS,EAAK,IAAI,CAAC,EAAG,IAAU,IAAJ,GAC5B,EAAQ,EAAK,IAAI,CAAC,EAAG,IAAM,GAAK,EAAI,EAAI,KAAQ,MAEtD,SAAS,EAAO,GACd,MAAM,EAAS,EAAK,IAAI,CAAC,EAAG,IAAM,CAChC,KAAK,MAAM,EAAI,GACf,EAAI,KAAK,IAAI,EAAO,EAAQ,EAAM,GAAK,EAAO,IAAM,IAEtD,EAAK,aAAa,IArCtB,SAAmB,GACjB,IAAI,EAAI,IAAI,EAAO,GAAG,MAAM,EAAO,GAAG,KACtC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAO,OAAS,EAAG,IAAK,CAC1C,MAAM,EAAK,EAAO,EAAI,IAAM,EAAO,GAC7B,EAAK,EAAO,GACZ,EAAK,EAAO,EAAI,GAChB,EAAK,EAAO,EAAI,IAAM,EACtB,EAAO,EAAG,IAAM,EAAG,GAAK,EAAG,IAAM,EACjC,EAAO,EAAG,IAAM,EAAG,GAAK,EAAG,IAAM,EACjC,EAAO,EAAG,IAAM,EAAG,GAAK,EAAG,IAAM,EACjC,EAAO,EAAG,IAAM,EAAG,GAAK,EAAG,IAAM,EACvC,GACE,KAAK,EAAK,QAAQ,MAAM,EAAK,QAAQ,MAAM,EAAK,QAAQ,MAAM,EAAK,QAAQ,MAAM,EAAG,MAAM,EAAG,GAAG,QAAQ,IAC5G,CAEA,OADA,GAAK,sBACE,CACT,CAqB2B,CAAU,GACnC,CAIA,GADA,EAAO,GACH,EAAc,OAElB,IAAI,GAAU,EACV,EAAQ,EACR,EAAO,EAGX,SAAS,EAAK,GACZ,IAAK,EAAS,OACd,MAAM,EAAK,EAAO,KAAK,IAAI,EAAM,EAAM,KAAO,EAC9C,EAAO,EACF,MACH,GAAS,EAAK,IACd,EAAO,IAET,sBAAsB,EACxB,CAGiB,IAAI,qBAAqB,IACxC,EAAQ,QAAQ,IACV,EAAM,iBAAmB,GAC3B,GAAU,EACV,sBAAsB,IACZ,EAAM,iBAChB,GAAU,OAIP,QAAQ,IAErB,CA5FA,OAAO,iBAAiB,SAAU,KAAQ,EAAe,YAAY,OAAU,CAAE,SAAS,IAmG1F,MAAM,EAAc,CAClB,UAAW,CACT,EAAG,CAAC,MAAQ,OAAS,MAAQ,MAAQ,OAAS,OAAS,OAAS,KAAO,MAAQ,OAAS,OAAS,OAAS,MAC1G,IAAK,CAAC,MAAQ,MAAQ,MAAQ,QAEhC,aAAc,CACZ,EAAG,CAAC,MAAQ,MAAQ,MAAQ,OAAS,OAAS,MAAQ,MAAQ,MAAQ,OAAS,MAAQ,MAAQ,OAAS,MACxG,IAAK,CAAC,IAAM,MAAQ,MAAQ,QAE9B,MAAS,CACP,EAAG,CAAC,MAAQ,OAAS,MAAQ,OAAS,OAAS,MAAQ,MAAQ,OAAS,KAAQ,MAAQ,OAAS,MAAS,OAC1G,IAAK,CAAC,MAAQ,MAAQ,MAAQ,SAIlC,SAAS,IACP,MAAM,EAAQ,SAAS,iBAAiB,qBACxC,IAAK,EAAM,OAAQ,OAEnB,MACM,EAAe,OAAO,WAAW,oCAAoC,QAkB3E,MAAM,EAAS,OAAO,WAAW,sBAEjC,EAAM,QAAS,IAEb,MAAM,EAAO,KACX,MAAM,EAAY,EAAG,aAAa,0BAC5B,EAAM,GAAa,EAAO,SAAW,EAAY,GAAa,EAClE,EAAG,aAAa,mBAClB,OAAO,EAAY,IAErB,IAAK,IAAQ,OAEb,MAAM,EAAM,WAAW,EAAG,aAAa,mBAAqB,IACtD,EAAQ,WAAW,EAAG,aAAa,qBAAuB,GAChE,IAAI,EAAI,EAAI,EAAI,EAAI,EAAG,EAAW,EAAQ,EAE1C,MAAM,EAAS,IACb,IAAI,EAAI,EAAE,GACV,IAAK,IAAI,EAAI,EAAG,GAAK,EAAW,IAC9B,GAAK,EAAE,EAAI,EAAI,GAAK,KAAK,IAAI,EAAI,GAAK,EAAE,EAAI,GAAK,KAAK,IAAI,EAAI,GAEhE,OAAO,GAEH,EAAW,KACf,MAAM,EAAQ,KACb,EAAI,EAAI,EAAI,GAAM,EAAM,IACzB,EAAI,EAAM,EACV,GAAa,EAAE,OAAS,GAAK,EAI7B,MAAM,EAAW,EAAG,aAAa,2BAKjC,GAJA,EAAS,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,WAClB,OAAb,GAAqB,EAAO,QAAU,EAAW,EAAG,aAAa,sBAC9D,IACL,EAAM,KACF,EAAQ,CACV,IAAI,EAAK,IAAU,GAAM,IAAU,EAAK,IAAU,GAAM,IACxD,IAAK,IAAI,EAAI,EAAG,EAzDR,GAyDmB,IAAK,CAC9B,MAAM,EAAK,EA1DL,GA0DkB,KAAK,GAAK,EAC5B,EAAI,EAAM,GACV,EAAI,EAAK,EAAI,KAAK,IAAI,GAAK,EAC3B,EAAI,EAAK,EAAI,KAAK,IAAI,GAAK,EACjC,EAAK,KAAK,IAAI,EAAI,GAAI,EAAK,KAAK,IAAI,EAAI,GACxC,EAAK,KAAK,IAAI,EAAI,GAAI,EAAK,KAAK,IAAI,EAAI,EAC1C,CACA,EAAM,CAAE,IAAK,EAAK,GAAM,EAAG,IAAK,EAAK,GAAM,EAAG,IAAK,EAAK,GAAM,EAAG,IAAK,EAAK,GAAM,EACnF,GAEF,IACA,MAAM,EAAuB,IAAhB,KAAK,SAClB,IAAI,EAAQ,EAAG,YACX,EAAS,EAAG,aACZ,EAAW,EAEf,SAAS,EAAO,GACd,EAAW,EACX,MAAM,EAAI,EAAO,EAAQ,EACnB,EAAM,GACZ,IAAK,IAAI,EAAI,EAAG,EA9EN,GA8EiB,IAAK,CAC9B,MAAM,EAAK,EA/EH,GA+EgB,KAAK,GAAK,EAClC,IAAI,EAAI,EAAM,GAEd,GAAK,EAAE,GAAK,GACkB,GAA5B,KAAK,IAAI,EAAI,EAAQ,GAAJ,GACiB,GAAlC,KAAK,IAAI,EAAI,EAAQ,GAAJ,EAAU,KACO,IAAlC,KAAK,IAAI,EAAI,EAAQ,GAAJ,EAAU,MAE7B,IAAI,EAAI,EAAK,EAAI,KAAK,IAAI,GAAK,EAC3B,EAAI,EAAK,EAAI,KAAK,IAAI,GAAK,EAC/B,GAAI,EAAK,CAEP,MAAM,EAAI,KAAK,IAAI,GACb,EAAI,KAAK,IAAI,GACb,EAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,GAAI,GAAK,KAAK,IAAI,KAAK,IAAI,GAAI,IAAK,EAAI,GAC7E,GAAK,GAAU,EAAI,GAAK,EAAI,GAAK,EAAI,EAAI,GACzC,GAAK,GAAU,EAAI,GAAK,EAAI,GAAK,EAAI,EAAI,EAC3C,CACA,EAAI,KAAK,CAAC,EAAI,EAAO,EAAI,GAC3B,CACA,EAAG,MAAM,SAAW,SA/FxB,SAA0B,GACxB,MAAM,EAAK,GAAM,EAAE,QAAQ,GACrB,EAAI,EAAI,OACd,IAAI,GAAM,EAAI,EAAI,GAAG,GAAK,EAAI,GAAG,IAAM,EACnC,GAAM,EAAI,EAAI,GAAG,GAAK,EAAI,GAAG,IAAM,EACnC,EAAI,IAAI,EAAE,MAAO,EAAE,KACvB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAG,IAAK,CAC1B,MAAM,EAAO,GAAK,EAAI,GAAK,GAC3B,GAAM,EAAI,GAAG,GAAK,EAAK,IAAM,EAC7B,GAAM,EAAI,GAAG,GAAK,EAAK,IAAM,EAC7B,GAAK,IAAI,EAAE,EAAI,GAAG,OAAO,EAAE,EAAI,GAAG,OAAO,EAAE,MAAO,EAAE,IACtD,CACA,OAAO,EAAI,GACb,CAkFiC,CAAiB,MAChD,CAiBA,GAdA,EAAG,MAAM,gBAAkB,OAC3B,EAAG,MAAM,UAAY,OACrB,EAAO,GAEP,IAAI,eAAe,KACjB,EAAQ,EAAG,YACX,EAAS,EAAG,aACZ,EAAO,KACN,QAAQ,GACX,EAAO,iBAAiB,SAAU,KAChC,IACA,EAAO,KAGL,EAAc,OAElB,IAAI,GAAU,EACV,EAAQ,EACR,EAAO,EAGX,SAAS,EAAK,GACZ,IAAK,EAAS,OACd,MAAM,EAAK,EAAO,KAAK,IAAI,EAAM,EAAM,KAAO,EAC9C,EAAO,EACF,MACH,GAAS,EAAK,IACd,EAAO,IAET,sBAAsB,EACxB,CAGA,IAAI,qBAAsB,IACxB,EAAQ,QAAS,IACX,EAAM,iBAAmB,GAC3B,GAAU,EACV,sBAAsB,IACZ,EAAM,iBAChB,GAAU,OAGb,QAAQ,IAEf,CAEA,SAAS,IACP,IAAK,SAAS,cAAc,yBAA0B,OACtD,MAAM,EAAuB,OAAO,WAAW,oCAAoC,QAC7E,EAAW,4BACX,EAAe,IAAI,QAGnB,EACM,EADN,EAEE,aAFF,EAGY,GAHZ,EAIU,IAJV,EAKY,GALZ,EAMQ,aANR,EAOU,UAPV,EAQU,OARV,EASS,EAoFf,OAhFA,SAAS,iBAAiB,yBAAyB,QAAQ,IACzD,GAAI,EAAM,aAAa,GAAW,OAClC,EAAM,aAAa,EAAU,IAE7B,MAAM,EAAW,MAAM,KAAK,EAAM,iBAAiB,4BACnD,IAAK,EAAS,QAAU,EAAsB,OAE9C,MAAM,EAAe,EAAM,aAAa,gCAAkC,EAEpE,EAAe,EAAM,aAAa,gCAAkC,EAEpE,EAAiB,WAAW,EAAM,aAAa,2BAA6B,EAG5E,EAAc,EAAS,IAAI,IAC/B,MAAM,EAAe,EAAG,YAAY,OAC9B,EAAmB,EAAG,aAAa,uBACnC,EAAa,WAAW,EAAG,aAAa,yBAA2B,EACnE,EAAW,WAAW,EAAG,aAAa,4BAA8B,EAEpE,EAAO,EAAmB,GAEhC,IAAI,EAAW,EAAc,GAC7B,EAAW,EAAe,EAAU,GACpC,EAAW,EAAmB,EAAU,GAExC,MAAM,EAoLV,SAAoB,EAAI,EAAkB,EAAY,GACpD,GAAI,EAAG,aAAa,sBAClB,MAAiD,UAA1C,EAAG,aAAa,sBAEzB,IAAK,EAAkB,OAAO,EAC9B,MAAM,EAAW,KAAK,MAAM,KAAK,IAAI,IAC/B,EAA+B,IAAb,EAAiB,EAAI,OAAO,GAAU,OACxD,EAAgB,EAAS,OAAO,GAAgB,UAAX,EAAE,MAAkB,OAC/D,OAAO,EAAkB,CAC3B,CA7LiB,CAAW,EAAI,EAAkB,EAAY,IACpD,QAAE,EAAO,UAAE,GAAc,EAAe,EAAI,EAAU,EAAM,GAE5D,EAAW,WAAW,iBAAiB,GAAI,UAOjD,MAAO,CAAE,KAAI,UAAS,WAAU,OAAM,WANnB,EAAU,IAAI,IAC/B,MAAM,EAAU,EAAS,YAAc,EAEvC,OADA,KAAK,IAAI,EAAU,CAAE,MAAO,EAAG,SAAU,WAClC,CAAE,GAAI,EAAU,aAGyB,kBAG9C,EA8RR,SAA2B,EAAO,GAChC,MAAM,EAAM,IAAI,GAChB,MAAc,UAAV,EAA0B,EAAI,UACpB,WAAV,EAIN,SAAsB,GACpB,IAAK,IAAI,EAAI,EAAI,OAAS,EAAG,EAAI,EAAG,IAAK,CACvC,MAAM,EAAI,KAAK,MAAM,KAAK,UAAY,EAAI,KACzC,EAAI,GAAI,EAAI,IAAM,CAAC,EAAI,GAAI,EAAI,GAClC,CACA,OAAO,CACT,CAViC,CAAa,GACrC,CACT,CAnSkB,CAAkB,EAAa,GAEzC,EAAK,KAAK,SAAS,CACvB,cAAe,CACb,QAAS,EACT,MAAO,EACP,MAAM,GAER,UAAA,GACE,EAAY,QAAQ,EAAG,KAAI,eAAc,WACvC,EAAe,EAAI,IAEvB,IAGF,EAAQ,QAAQ,CAAC,EAAM,KACrB,MAAM,QAAE,EAAO,SAAE,EAAQ,KAAE,EAAI,WAAE,GAAe,EAC1C,EAAS,EAAW,EAE1B,EAAW,QAAQ,EAAG,KAAI,cACxB,EAAG,GAAG,EAAI,CACR,MAAO,EAAU,KACjB,QAAS,EACT,SAAU,EACV,KAAM,GACL,KAGL,EAAQ,QAAQ,EAAG,SAAQ,aAAa,KACtC,MAAM,EAAc,EAAQ,OAAS,EAAI,EACzC,EAAG,GAAG,EAAQ,CACZ,GAAI,EAAY,EAAO,KACvB,WACA,KAAM,EACN,SAAS,GACR,EAAS,EAAc,SAMzB,SAAwB,EAAI,EAAS,EAAU,CAAC,GACrD,MAAM,EAAc,EAAG,YAAY,OACnC,GAAI,IAAgB,EAAS,OAE7B,MAAM,EAAW,EAAQ,UAAY,EAC/B,EAAO,EAAQ,MAAQ,EACvB,EAAO,EAAmB,GAG1B,EAAW,EAAa,IAAI,GAC9B,IACF,EAAS,OACT,KAAK,IAAI,EAAI,CAAE,WAAY,oBAI7B,MAAM,EAAW,WAAW,iBAAiB,GAAI,UAC3C,EAAa,EAAG,wBAAwB,MAAQ,EAIhD,EADgB,EAAc,GAEjC,OAAO,GAAgB,UAAX,EAAE,MACd,IAAI,GAAK,EAAE,MACX,KAAK,IACF,EAAa,SAAS,EAAgB,KAAO,EAEnD,IAAI,EAAW,EAAc,GAC7B,EAAW,EAAe,EAAU,GACpC,EAAW,EAAmB,EAAU,GACxC,MAAM,QAAE,EAAO,UAAE,GAAc,EAAe,EAAI,EAAU,GAAM,GAG5D,EAAa,EAAG,wBAAwB,MAAQ,EAChD,EAAe,KAAK,IAAI,EAAa,GAAc,IAGrD,GACF,KAAK,IAAI,EAAI,CAAE,MAAO,EAAa,KAAM,SAAU,WAGrD,MAAM,EAAK,KAAK,SAAS,CACvB,UAAA,GACE,EAAe,EAAI,GACnB,EAAa,OAAO,EACtB,IAEF,EAAa,IAAI,EAAI,GAGjB,GACF,EAAG,GAAG,EAAI,CACR,MAAO,EAAa,KACpB,SAAU,EACV,KAAM,GACL,GAIL,EAAU,QAAQ,IACoC,WAAhD,EAAS,aAAa,uBACxB,EAAG,GAAG,EAAU,CAAE,QAAS,EAAG,SAAU,IAAO,KAKnD,EAAQ,QAAQ,EAAG,SAAQ,aAAa,KACtC,MAAM,EAAc,EAAQ,OAAS,EAAI,EACzC,EAAG,GAAG,EAAQ,CACZ,GAAI,EAAY,EAAO,KACvB,WACA,OACA,SAAS,GACR,EAAc,IAErB,EAGA,SAAS,EAAmB,GAC1B,MAAM,EAAK,iBAAiB,GACtB,EAAK,EAAG,WACd,MAAW,WAAP,EAAwB,IACrB,WAAW,GAAM,WAAW,EAAG,SACxC,CAEA,SAAS,EAAc,GACrB,MAAO,IAAI,GAAM,IAAI,IAAQ,CAC3B,KAAM,KAAK,KAAK,GAAQ,QAAU,SAClC,SAEJ,CAEA,SAAS,EAAe,EAAU,GAChC,MAAM,EAAa,EAAS,OAAO,GAAgB,UAAX,EAAE,MACpC,EAAS,OAAO,KAAK,MAAM,KAAK,IAAI,KACvC,SAAS,EAAW,OAAQ,KAC5B,OAAO,EAAW,QACrB,IAAI,EAAK,EACT,OAAO,EAAS,IAAI,GACP,UAAX,EAAE,KAAmB,IAAK,EAAG,WAAY,SAAS,EAAO,KAAO,KAChE,EAEJ,CAEA,SAAS,EAAmB,EAAU,GACpC,MAAM,EAAc,EAAS,OAAO,GAAgB,UAAX,EAAE,MAAkB,OACvD,EAAW,KAAK,MAAM,KAAK,IAAI,IAC/B,EAA+B,IAAb,EAAiB,EAAI,OAAO,GAAU,OACxD,EAAe,KAAK,IAAI,EAAG,EAAc,GAC/C,GAAqB,IAAjB,EAAoB,OAAO,EAC/B,IAAI,EAAa,EACb,GAAiB,EACjB,GAAkB,EACtB,OAAO,EAAS,IAAI,IAClB,GAAiB,UAAb,EAAI,KAAkB,CACxB,GAAiB,EACjB,MAAM,EAAS,EAAa,EAG5B,OAFA,EAAkB,EAClB,IACO,IAAK,EAAK,SACnB,CACA,MAAM,EAAS,GAAkB,EACjC,MAAO,IAAK,EAAK,WAErB,CAaA,SAAS,EAAe,EAAI,EAAU,EAAM,GAC1C,EAAG,UAAY,GACf,EAAG,MAAM,OAAS,GAClB,MAAM,EAAU,GACV,EAAY,GACZ,EAAa,GAAK,EAsCxB,OArCA,EAAS,QAAQ,IACf,GAAiB,WAAb,EAAI,KAAmB,CACzB,MAAM,EAAO,SAAS,cAAc,QAUpC,OATA,EAAK,aAAa,qBAAsB,UACxC,EAAK,MAAM,OAAS,EAAO,KAC3B,EAAK,MAAM,WAAa,EACxB,EAAK,YAAc,EAAI,KACvB,EAAG,YAAY,QACX,GAAQ,EAAI,SACd,KAAK,IAAI,EAAM,CAAE,QAAS,IAC1B,EAAU,KAAK,IAGnB,CACA,MAAM,EAAO,SAAS,cAAc,QACpC,EAAK,aAAa,qBAAsB,QACxC,EAAK,MAAM,OAAS,EAAO,KAC3B,EAAK,MAAM,WAAa,EACxB,MAAM,EAAS,SAAS,cAAc,QACtC,EAAO,aAAa,qBAAsB,UAC1C,EAAO,MAAM,WAAa,EAE1B,MAAM,EAAS,GACf,IAAK,IAAI,EAAI,EAAG,EAAI,EAAY,IAC9B,EAAO,KAAK,EAAI,IAElB,EAAO,YAAc,EAAO,KAAK,MACjC,EAAK,YAAY,GACjB,EAAG,YAAY,GACf,MAAM,EAAa,EAAI,YAAc,EAC/B,EAAW,GAAQ,EAAI,OAC7B,KAAK,IAAI,EAAQ,CAAE,EAAG,EAAW,EAAO,MAAQ,EAAa,EAAO,OACpE,MAAM,EAAW,SAAS,EAAI,KAAM,IAC9B,EAAY,EAAW,EAAa,EAAW,GAAK,EAC1D,EAAQ,KAAK,CAAE,SAAQ,cACnB,GAAU,EAAU,KAAK,KAExB,CAAE,UAAS,YACpB,CAEA,SAAS,EAAe,EAAI,GAC1B,EAAG,MAAM,SAAW,GACpB,EAAG,MAAM,OAAS,GAGlB,MAAM,EAAS,IAAI,GAAc,OAAO,GAAK,KAAK,KAAK,IACvD,IAAI,EAAK,EAET,EAAG,iBAAiB,+BAA+B,QAAQ,IACzD,MAAM,EAAS,EAAK,cAAc,iCAC9B,GAAQ,EAAO,SACnB,EAAK,YAAc,EAAO,MAAS,GACnC,EAAK,MAAM,QAAU,GACrB,EAAK,MAAM,SAAW,KAGxB,EAAG,iBAAiB,iCAAiC,QAAQ,IAC3D,EAAK,MAAM,QAAU,IAEzB,CAyDF,CAGA,SAAS,IACP,SAAS,iBAAiB,4BAA4B,QAAS,IAE7D,MACM,EAAW,CAGf,CAAC,IAAK,EAAG,GAAG,GACZ,CAAC,IAAK,IAAM,GAAG,GACf,CAAC,IAAK,GAAK,KAAM,GACjB,CAAC,EAAG,GAAK,KAAM,IAaX,EAAc,IAAM,EAAS,KAAK,EAAE,KAAS,YAAc,GAAK,MAAM,GAE5E,EAAU,sBAAsB,OAChC,EAAU,qBAAqB,OAE3B,EAAU,kBAAkB,KAAK,OAAO,OAAO,EAAU,kBACzD,EAAU,oBAAoB,OAAO,oBAAoB,SAAU,EACpE,oBAEH,MAAM,EAAO,EAAU,cAAc,4BACrC,IAAK,EAAM,OAEX,MAAM,EAAY,IAAI,EAAK,iBAAiB,6BAA6B,IAAK,GAAS,EACpF,WAAU,IACb,IAAK,EAAU,OAAQ,OAEvB,MAAM,EAA2D,YAA3C,EAAU,QAAQ,qBAAqC,GAAK,EAC5E,EAAO,KAAK,YAAY,EAAM,IAAK,MACnC,EAAuB,EAAV,KAAK,GAExB,IAAI,EAAQ,GACR,EAAY,EACd,EAAa,EACb,EAAe,EACf,EAAS,EACT,EAAe,EACb,EAAQ,EACV,EAAc,EACd,EAAY,EACV,GAAW,EACb,GAAa,GACV,EAAY,EAAW,GAAQ,IAGpC,MAAM,EAAiB,IAAM,EApCT,IAoCwB,YAE5C,SAAS,IACP,MAAM,EAAW,SAAS,yBAC1B,EAAU,QAAS,GAAS,EAAS,YAAY,EAAK,WAAU,KAChE,EAAK,YAAY,EACnB,CAEA,SAAS,IACP,EAAK,UAAY,GAEjB,IACA,IAEA,MAAM,EAAa,IAAI,EAAK,iBAAiB,6BAC7C,EAAY,EAAW,EAAU,QAAQ,WAAa,EAAW,GAAG,WAEpE,IAAK,IAAI,EAAI,EAAG,EAAI,KAAK,IAAI,EAAG,KAAK,KAAK,EAAU,YAAc,GAAa,GAAI,IACjF,IAGF,EAAQ,IAAI,EAAK,iBAAiB,6BAElC,MAAM,EAAgB,EAAW,MAAM,EAAG,EAAU,QACpD,EAAe,EAAc,OAAO,CAAC,EAAK,IAAS,EAAM,EAAK,YAAa,GAAK,EAC7E,OACH,EAAa,EAA+B,EAAxB,EAAU,YAC5B,KAAK,IAAI,EAAU,YAjEF,GAiEe,GAA+B,EAEjE,IAAI,EAAY,EAEhB,IAAK,MAAM,KAAQ,EACjB,EAAK,GAAK,EAAK,WACf,EAAK,OAAS,EAAK,YACnB,EAAK,QAAU,EAAK,aACpB,EAAK,MAAQ,KAAK,YAAY,EAAM,IAAK,MACzC,EAAY,KAAK,IAAI,EAAW,EAAK,SAGvC,EAAe,GAAa,KAAK,IA/ErB,IA+EkC,GAC9C,GACF,CAEA,SAAS,IACP,IAAK,IAAc,EAAY,OAE/B,MAAM,EAAI,KAAK,MAAM,MAAM,EAAW,EAAG,GACnC,EAvFM,GACI,GAsFc,EAAQ,GAChC,EAAc,EAAS,EAAa,EArFzB,EAsFX,EAAiB,EAAU,YAEjC,EAAK,GAEL,IAAK,MAAM,KAAQ,EAAO,CACxB,MAAM,EAAQ,EAAK,GAAK,EACxB,KAAI,EAAQ,EAAK,OAAS,GAAK,EAAQ,GAIvC,GAAI,EAAM,CACR,MAAM,IAAU,EAAQ,EAAK,OAAS,GAAK,EAAiB,IAAO,KAAK,GAAK,EAC7E,EAAK,OAAO,EAAI,EAAI,KAAK,IAAI,IAAU,EAAK,QAAU,EACxD,KAAO,CACL,MAAM,EAAQ,EAAQ,EAAa,EAAa,EAChD,EAAK,MAAM,KAAK,IAAI,GAAS,EAAK,QAAU,EAC9C,CACF,CACF,CAEA,SAAS,EAAK,EAAG,GACf,IAAK,IAAa,EAAW,OAG7B,MAAM,EAAO,EAlHE,GAHE,IAsHjB,IAAU,EAAc,GAAS,EACjC,IAAgB,EAAI,GAAe,EAEnC,GAnIgB,IAmIM,EAAa,EAAQ,EAAY,EAAY,IACnE,GACF,CAEA,EAAU,qBAAuB,SAAS,OAAO,CAC/C,OAAQ,EACR,KAAM,gBACN,UAAU,EACV,UAAY,IACV,IAAK,IAAa,EAAK,OAAQ,OAE/B,GAAa,EACb,EAAU,MAAM,OAAS,WACzB,EAAY,EAAK,OAAS,EAAI,GAAK,EAEnC,MAAM,EAAa,KAAK,IAAI,EAAK,QAAU,EAAe,IAvI5C,GAwId,EAAc,KAAK,IAAI,EAAI,EAvIV,KAyInB,UAAW,KACT,GAAa,EACb,EAAU,MAAM,OAAS,UAI7B,EAAU,oBAAsB,cAAc,OAAO,CACnD,QAAS,EACT,MAAO,IAAM,QAAQ,eACrB,IAAK,IAAM,WAAW,YACtB,qBAAqB,EACrB,SAAW,GAAS,EAAW,EAAK,SACpC,SAAW,IACL,IAEJ,EAA+B,IAAnB,EAAK,WAAmB,EAAgB,EAEpD,EAAc,KAAK,IAAI,EAAa,EA7JpB,KA6JwB,KAAK,IAAI,EAAK,oBAK1D,IACA,cAAc,UAEd,EAAW,EAAU,oBAAoB,UAAY,cAAc,aAAa,GAChF,EAAU,iBAAmB,EAC7B,KAAK,OAAO,IAAI,GAEhB,EAAU,mBAUd,SAA+B,EAAI,GACjC,IACE,EADE,EAAO,WAEX,OAAO,YAAa,GAClB,aAAa,GACb,EAAQ,WAAW,KACb,aAAe,IACjB,EAAO,WACP,EAAG,MAAM,KAAM,KAEhB,EACL,CACF,CAtBmC,CAAsB,MAClD,EAAY,EAAW,GAAQ,IAChC,IACA,cAAc,WACb,KAEH,OAAO,iBAAiB,SAAU,EAAU,qBAEhD,CAoBA,IAAI,EAAc,EAElB,SAAS,IACP,SAAS,iBAAiB,kBAAkB,QAAS,IACnD,MAAM,EAAO,IAAI,EAAK,iBAAiB,kBACjC,EAAS,IAAI,EAAK,iBAAiB,wBACzC,IAAK,EAAK,QAAU,EAAK,SAAW,EAAO,OAAQ,OAEnD,MAAM,EAAW,SAAS,EAAK,aAAa,oBAAqB,KAAO,IAClE,GAAY,OAAO,WAAW,oCAAoC,QAClE,EAAO,EAAK,IAAK,GAAQ,EAAI,cAAc,8BAC3C,EAAS,cAAa,EAC5B,IAAI,EAAU,EACV,EAAU,EACV,EAAO,EACP,GAAU,EACV,GAAS,EACT,GAAU,EACV,GAAU,EAUd,SAAS,EAAK,GACZ,MAAM,EAAO,EACb,GAAW,EAAQ,EAAK,QAAU,EAAK,OACvC,EAAU,EACV,EAAK,QAAQ,CAAC,EAAK,KACjB,MAAM,EAAS,IAAM,EACrB,EAAI,aAAa,gBAAiB,OAAO,IACzC,EAAI,SAAW,EAAS,GAAK,EACzB,EAAK,KAAI,EAAK,GAAG,MAAM,UAAY,UAAU,IAAW,EAAW,EAAI,QAE7E,EAAO,QAAQ,CAAC,EAAO,KACrB,IAAI,EAAQ,SACR,IAAM,EAAS,EAAQ,SAClB,IAAM,IAAM,EAAQ,QAC7B,EAAM,aAAa,aAAc,GACjC,EAAM,aAAa,cAAe,OAAO,IAAM,KAEnD,CAEA,SAAS,EAAK,GACZ,IAAK,EAEH,YADA,GAAU,GAGZ,MAAM,EAAK,EAAO,KAAK,IAAI,EAAM,EAAM,KAAO,EAC9C,EAAO,EACF,GAAY,GAAY,SAAS,SACpC,GAAW,EACP,EAAK,KAAU,EAAK,GAAS,MAAM,UAAY,UAAU,KAAK,IAAI,EAAU,EAAU,OACtF,GAAW,GAAU,EAAK,EAAU,IAE1C,sBAAsB,EACxB,CAvCA,EAAK,QAAQ,CAAC,EAAK,KACjB,EAAI,GAAK,GAAG,SAAc,EAAI,IAC9B,EAAO,GAAG,GAAK,GAAG,WAAgB,EAAI,IACtC,EAAI,aAAa,gBAAiB,EAAO,GAAG,IAC5C,EAAO,GAAG,aAAa,kBAAmB,EAAI,MA4ChD,EAAK,QAAQ,CAAC,EAAK,KACjB,EAAI,iBAAiB,QAAU,IAC7B,EAAE,iBACE,IAAM,GAAS,EAAK,OAK5B,EAAK,iBAAiB,UAAY,IAChC,IAAK,EAAE,OAAO,QAAQ,iBAAkB,OACxC,MAAM,EAAO,CAAE,WAAY,EAAG,UAAW,EAAG,WAAY,EAAG,SAAU,GACrE,IAAI,EAAO,KACP,EAAE,OAAO,EAAM,EAAO,EAAU,EAAK,EAAE,KACxB,SAAV,EAAE,IAAgB,EAAO,EACf,QAAV,EAAE,MAAe,EAAO,EAAK,OAAS,GAClC,OAAT,IACJ,EAAE,iBACF,EAAK,GACL,EAAK,GAAS,WAIhB,EAAK,iBAAiB,wBAAwB,QAAS,IACrD,EAAK,iBAAiB,aAAc,KAAQ,GAAU,IACtD,EAAK,iBAAiB,aAAc,KAAQ,GAAU,MAGxD,EAAK,iBAAiB,UAAY,IAAQ,EAAU,EAAE,OAAO,QAAQ,oBACrE,EAAK,iBAAiB,WAAa,IAC5B,EAAK,SAAS,EAAE,iBAAgB,GAAU,KAGjD,IAAI,qBAAsB,IACxB,EAAS,EAAQ,GAAG,eAChB,IAxCA,GAAY,IAChB,GAAU,EACV,EAAO,EACP,sBAAsB,KAsCrB,CAAE,UAAW,MAAQ,QAAQ,GAEhC,EAAK,aAAa,gBAAiB,IACnC,EAAK,IAET,CAMA,SAAS,EAAe,EAAO,GAC7B,IAAI,EACJ,EAAQ,KAAK,MAAM,QAAQ,GAC3B,EAAS,GAAU,CAAC,EACpB,MAAM,EAAM,KAAK,QAAQ,KACvB,IAI4G,EAG1G,EAKgC,EAZ9B,EAAW,EAAO,SAAU,EAAY,EAC1C,EAAK,KAAK,SAAS,CAAC,OAAQ,EAAO,OAAQ,SAAU,GAAY,WAAa,IAAI,EAAI,EAAG,eAAoB,IAAc,IAAK,EAAY,EAAG,EAAS,EAAM,GAAI,GAAM,EAAG,OAAQ,EAAO,OAAQ,SAAU,CAAC,KAAM,QAAS,kBAAmB,IAAM,EAAG,UAAU,EAAG,UAA4B,IAAhB,EAAG,cACpR,EAAS,EAAM,OAAQ,EAAS,EAAM,GAAG,WAAY,EAAQ,GAAI,EAAS,GAAI,EAAc,GAAI,EAAY,GAAI,EAAW,EAAG,GAAe,EAAO,EAAS,EAAO,OAAQ,EAAwC,KAArB,EAAO,OAAS,GAC/M,GAAuB,IAAhB,EAAO,KAAiB,GAAK,EAAI,KAAK,MAAM,KAAK,EAAO,MAAQ,GAAI,EAAa,EACxF,GAAuB,IAAX,EAAkB,EAAM,GAAG,WAAa,KAAK,MAAM,QAAQ,GAAQ,IAAM,EAAM,GAAG,WAE9F,EAAiB,KAAQ,IAA4C,EAAxC,EAAK,EAAU,wBAA6B,EAAM,QAAQ,CAAC,EAAI,KAAQ,EAAO,GAAK,WAAW,KAAK,YAAY,EAAI,QAAS,OAAQ,EAAU,GAAK,EAAK,WAAW,KAAK,YAAY,EAAI,IAAK,OAAS,EAAO,GAAK,IAAM,KAAK,YAAY,EAAI,aAAc,EAAK,EAAG,wBAAyB,EAAY,GAAK,EAAG,MAAQ,EAAI,EAAG,MAAQ,EAAG,MAAO,EAAK,IAAQ,KAAK,IAAI,EAAO,CAAE,SAAU,GAAK,EAAU,KAAO,EADvZ,EAAM,EAAO,GAAG,WAAa,EAAU,EAAO,GAAK,IAAM,EAAO,EAAO,GAAK,EAAS,EAAY,GAAK,EAAM,EAAO,GAAG,YAAc,KAAK,YAAY,EAAM,EAAO,GAAI,WAAa,WAAW,EAAO,eAAiB,IAG5O,EAAkB,KAAQ,EAAa,EAAS,EAAG,YAAc,EAAU,YAAc,GAAK,EAAa,EAAG,GAAU,EAAM,QAAQ,CAAC,EAAG,KAAQ,EAAM,GAAK,EAAS,EAAG,OAAO,QAAU,GAAK,EAAG,WAAa,EAAO,GAAK,EAAI,EAAa,MAC5O,EAAa,CAAC,EAAQ,EAAO,KAAW,IAAkD,EAA9C,EAAI,EAAO,OAAQ,EAAU,KAAM,EAAQ,EAAM,KAAO,KAAO,EAAI,KAAK,IAAI,EAAO,GAAK,GAAY,EAAI,EAAO,IAAK,EAAI,EAAO,GAAS,EAAI,IAAW,EAAU,EAAG,EAAQ,GAAO,OAAO,GACtO,EAAmB,KAAQ,IAAI,EAAG,EAAM,EAAM,EAAiB,EAA4B,IAAZ,EAAG,QAAc,EAAI,EAAG,EAAI,EAAQ,IAAO,EAAO,EAAM,GAAI,EAAO,EAAU,GAAK,IAAM,EAAO,GAAI,EAAkB,EAAK,WAAa,EAAO,EAAS,EAAY,GAAI,EAAiB,EAAkB,EAAO,GAAK,KAAK,YAAY,EAAM,UAAW,EAAG,GAAG,EAAM,CAAC,SAAU,GAAM,EAAO,GAAkB,EAAO,GAAK,KAAM,SAAU,EAAiB,GAAkB,GAAG,OAAO,EAAM,CAAC,SAAU,GAAM,EAAO,EAAiB,GAAc,EAAO,GAAK,MAAO,CAAC,SAAU,EAAU,GAAI,UAAW,EAAO,EAAiB,EAAa,GAAQ,EAAiB,iBAAiB,GAAQ,EAAiB,GAAiB,IAAI,QAAU,EAAG,EAAkB,GAAkB,EAAM,GAAK,EAAkB,EAAmB,EAAW,KAAK,MAAM,KAAK,EAAG,EAAG,aACzzB,EAAW,IAAW,IAAI,EAAW,EAAG,WAAY,EAAG,SAAS,GAAG,GAAO,IAAkB,GAAQ,IAAoB,IAAmB,GAAQ,EAAG,UAAY,EAAG,KAAK,EAAM,IAAW,GAAQ,EAAG,SAAS,GAAU,IACzN,EAAW,IAAM,GAAQ,GAE3B,SAAS,EAAQ,EAAO,GAAQ,EAAO,GAAQ,CAAC,EAAI,KAAK,IAAI,EAAQ,GAAY,EAAS,IAAO,GAAS,EAAQ,GAAY,EAAS,GAAS,IAAI,EAAW,KAAK,MAAM,KAAK,EAAG,EAAQ,GAAQ,EAAO,EAAM,GAAwR,OAAzQ,EAAO,EAAG,QAAW,EAAQ,GAAY,IAAU,IAAY,GAAQ,EAAG,YAAc,EAAQ,EAAW,GAAK,KAAU,EAAO,GAAK,EAAO,EAAG,cAAc,EAAK,UAAY,CAAC,KAAM,IAAa,EAAW,EAAU,EAAK,WAAY,EAAM,KAAK,aAAa,GAAiC,IAAlB,EAAK,SAAiB,EAAG,KAAK,EAAS,IAAS,EAAG,QAAQ,EAAM,EAAO,CAStjB,GAVA,KAAK,IAAI,EAAO,CAAC,EAAG,IAAK,IAAkB,IAAoB,IAAmB,OAAO,iBAAiB,SAAU,GAEpH,EAAG,QAAU,CAAC,EAAO,IAAS,EAAQ,EAAO,GAC7C,EAAG,aAAe,IAAgB,IAAI,EAAQ,EAAW,EAAO,EAAG,OAAQ,EAAG,YAAyE,OAAxD,IAAc,EAAW,EAAO,GAAe,GAAgB,GAC9J,EAAG,QAAU,IAAM,EAAe,EAAG,cAAa,GAAQ,EAC1D,EAAG,KAAO,GAAQ,EAAQ,EAAG,UAAU,EAAG,GAC1C,EAAG,SAAW,GAAQ,EAAQ,EAAG,UAAU,EAAG,GAC9C,EAAG,MAAQ,EACX,EAAG,SAAS,GAAG,GAAM,SAAS,GAAG,GAC7B,EAAO,WAAY,EAAG,KAAK,oBAAqB,EAAG,WACnD,EAAO,WAAmC,mBAAhB,UAA4B,CACxD,EAAQ,SAAS,cAAc,OAC/B,IAAkC,EAAO,EAAe,EAAqB,EAAU,EAAa,EAAhG,EAAO,KAAK,MAAM,KAAK,EAAG,GAC5B,EAAQ,IAAM,EAAG,SAAS,EAAK,GAAiB,EAAU,OAAS,EAAU,GAAK,IAClF,EAAY,IAAM,EAAG,cAAa,GACpC,EAAY,UAAU,OAAO,EAAO,CAClC,QAAS,EAAM,GAAG,WAAY,KAAM,IAAK,gBAAgB,EACzD,WAAA,GAAgB,IAAI,EAAI,KAAK,EAAG,KAAK,aAAa,GAAK,GAAc,EAAG,SAAU,EAAG,QAAS,EAAgB,EAAG,WAAY,IAAW,EAAQ,EAAI,EAAY,EAAe,GAAiB,EAAS,EAAG,KAAK,IAAI,EAAO,CAAC,EAAG,GAAiB,GAAS,EAC1P,OAAQ,EAAO,cAAe,EAAO,mBAAoB,EAAG,SAAS,EACrE,IAAA,CAAK,GAAS,GAAI,KAAK,IAAI,GAAiB,EAAQ,KAAK,GAAK,GAAM,OAAO,EAAW,EAAc,IAAI,GAAS,EAAQ,EAAS,EAAG,WAAY,EAAc,EAAS,GAAwE,EAAtD,EAAM,EAAW,EAAO,EAAa,EAAG,aAA+B,EAAuJ,OAA1I,KAAK,IAAI,GAAO,EAAG,WAAa,IAAM,GAAO,EAAM,EAAI,EAAG,YAAc,EAAG,YAAa,GAAY,EAAO,GAAO,EAAG,YAAc,EAAc,CAAU,EACza,SAAA,GAAc,IAAa,EAAU,aAAe,GAAe,EAAO,EAC1E,gBAAiB,KAAQ,IAAa,GAAc,EAAG,UACtD,GACH,EAAG,UAAY,CACjB,CAEA,OADA,EAAG,cAAa,GAAO,EAAY,EAAU,GAAY,EAAS,EAAM,GAAW,GAAW,EAAW,EAClG,IAAM,OAAO,oBAAoB,SAAU,KAMpD,OAJA,EAAS,QAAU,KACb,EAAS,WAAW,EAAS,UAAU,OAC3C,EAAI,UAEC,CACT,CAUA,SAAS,IACP,MAAM,EAAQ,SAAS,iBAAiB,0BACxC,IAAK,EAAM,SAAW,OAAO,KAAM,OACnC,MAAM,EAAe,OAAO,WAAW,oCAAoC,QAGrE,EAAU,CACd,OAAO,UAAY,KAAO,EAAW,GACrC,OAAO,cAAgB,KAAO,EAAW,IAE3C,QAAQ,WAAW,GAAS,KAAK,KAC/B,CAAC,YAAa,iBAAiB,QAAS,IAClC,OAAO,IAAO,KAAK,eAAe,OAAO,MAE/C,EAAM,QAAS,GAInB,SAA6B,EAAM,GACjC,MAAM,EAAU,EAAK,QAAQ,YAAc,SAAS,KAC9C,EAAQ,EAAK,cAAc,mBAC3B,EAAY,IAAI,EAAK,iBAAiB,oBACtC,EAAW,EAAK,cAAc,kBAC9B,EAAc,GAAY,EAAS,cAAc,iBACjD,EAAU,IAAI,EAAQ,iBAAiB,qBACvC,EAAa,EAAQ,OAAS,EAAQ,GAAG,cAAgB,KAC/D,IAAK,IAAU,EAAU,SAAW,EAAa,OAC7C,GAAY,EAAW,MAAM,YAAY,iBAAkB,EAAQ,QAIvE,IAAI,EAAe,EACnB,SAAS,IACP,MAAM,EAAS,EAAQ,GACvB,IAAK,IAAe,EAAQ,OAC5B,MACM,GADS,EAAW,UAAU,SAAS,gBACzB,EAAW,cAAc,iBACzC,IAAI,EAAG,MAAM,WAAa,QAC9B,EAAW,MAAM,YAAY,aAAc,GAAG,EAAO,gBACrD,EAAW,MAAM,YAAY,aAAc,GAAG,EAAO,iBACrD,EAAW,UAAU,IAAI,eACrB,IACG,EAAG,YACR,EAAG,MAAM,WAAa,GAE1B,CACA,GAAI,GAAc,OAAO,eAAgB,CACvC,MAAM,EAAS,IAAI,eAAe,IAAM,KACxC,CAAC,KAAe,GAAS,QAAS,GAAO,EAAO,QAAQ,GAC1D,CAEA,MAAM,EAAU,WAAW,EAAK,aAAa,qBACvC,EAA4C,KAAhC,MAAM,GAAW,EAAI,GACjC,EAAW,EAAW,IAAM,EAC5B,EAAO,CAAE,KAAM,SAAU,SAAU,EAAe,EAAI,MAC5D,EAAY,SACZ,EAAM,MAAM,eAAiB,aAE7B,IAAI,EAAS,GACT,EAAQ,GACR,EAAW,KACX,EAAO,GACP,EAAO,KACP,GAAU,EACV,GAAW,EACX,EAAU,EACV,EAAO,EACP,GAAU,EACV,GAAS,EACT,GAAO,EACP,GAAU,EACV,GAAW,EAKf,SAAS,IACP,MAAM,EAAK,iBAAiB,GACtB,EAAK,WAAW,EAAG,aAAe,EAClC,EAAK,WAAW,EAAG,cAAgB,EACnC,EAAI,EAAQ,wBACZ,EAAI,EAAM,wBACV,EAAO,EAAK,EAAE,KAAO,EAAE,KACvB,EAAQ,EAAK,EAAE,MAAQ,EAAE,MAC3B,KAAK,IAAI,EAAO,GAAM,KAAK,EAAM,MAAM,WAAa,GAAG,OACvD,KAAK,IAAI,EAAQ,GAAM,KAAK,EAAM,MAAM,YAAc,GAAG,MAC/D,CAEA,SAAS,EAAK,EAAG,GACf,MAAM,EAAK,EAAK,IAAM,EAAK,GAAG,cAAc,sBACxC,IAAI,EAAG,MAAM,UAAY,UAAU,KACzC,CAGA,SAAS,EAAU,IACjB,GAAc,EAAY,EAAM,OAAU,EAAM,QAAU,EAAM,UAC9C,IAClB,EAAU,EACV,EAAS,EAAY,EAAO,OAC5B,EAAU,EACV,EAAM,QAAQ,CAAC,EAAI,IAAM,EAAG,aAAa,iBAAkB,OAAO,IAAM,KACxE,EAAO,QAAQ,CAAC,EAAO,KACrB,MAAM,EAAK,IAAM,EACjB,EAAM,aAAa,cAAe,QAAQ,IAC1C,EAAM,iBAAiB,aAAa,QAAS,IAAS,EAAG,SAAW,EAAK,GAAK,MAEhF,EAAK,QAAQ,CAAC,EAAK,KACjB,EAAI,aAAa,eAAgB,OAAO,IAAM,IAC9C,EAAK,EAAG,IAAM,GAAW,EAAe,EAAJ,KAExC,CAIA,SAAS,EAAM,GACR,IACL,EAAU,GACV,GAAY,EACZ,EAAK,QAAQ,EAAW,IAAK,EAAM,WAAY,KAAQ,GAAW,KACpE,CAGA,SAAS,EAAK,GACZ,IAAK,EAAM,OACX,IAAI,EAAO,EACX,MAAM,EAAM,EAAM,OAClB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,GAAK,EAAO,OAAQ,CACjC,KAAK,IAAI,KAAK,IAAI,EAAI,GAAU,EAAM,KAAK,IAAI,EAAI,IAClD,KAAK,IAAI,KAAK,IAAI,EAAO,GAAU,EAAM,KAAK,IAAI,EAAO,MACxD,EAAO,EACrB,CACA,EAAM,EACR,CAIA,SAAS,IACP,MAAM,EAAM,WAAW,iBAAiB,GAAO,YAAc,EACvD,EAAQ,EAAO,OAAO,CAAC,EAAK,IAAM,EAAM,EAAE,YAAc,EAAK,IAAM,EACnE,EAAS,KAAK,OAAO,EAAO,IAAK,GAAM,EAAE,cAC/C,OAAO,KAAK,IAAI,EAAG,KAAK,MAAM,EAAQ,YAAc,GAAU,GAChE,CAEA,SAAS,IACP,EAAM,iBAAiB,mBAAmB,QAAS,GAAM,EAAE,SAC7D,CAEA,IAAI,EAAS,EAET,EAAY,EAGhB,SAAS,EAAU,EAAU,GAE3B,MAAM,EAAc,EAAQ,UAAW,GAAM,EAAE,aAAa,oBAAsB,GAC9E,GAAc,GAAe,IAC/B,EAAW,MAAM,YAAY,kBAAmB,GAChD,EAAe,EACf,KAEF,EAAQ,QAAQ,CAAC,EAAG,KAClB,EAAE,aAAa,gBAAiB,OAAO,IAAM,IAC7C,EAAE,SAAW,IAAM,EAAc,GAAK,IAGxC,MAAM,IAAU,EAChB,IAAK,GAAW,IAAiB,EAAM,QAErC,YADA,EAAa,GAGf,GAAO,EACP,MAAM,EAAU,CAAE,SAAU,IAAK,OAAQ,UAAW,KAAM,YAEpD,EAAO,CAAC,EAAO,GAAU,IAAK,GAClC,EAAG,QAAQ,CAAC,CAAE,QAAS,iBAAiB,GAAI,SAAW,CAAE,QAAS,IAAM,IAC1E,IAAI,GAAU,EACd,MAAM,EAAO,KACX,GAAI,GAAW,IAAU,EAAW,OACpC,GAAU,EAEV,CAAC,EAAO,GAAU,QAAS,GAAO,EAAG,gBAAgB,QAAS,GAAS,EAAK,WAC5E,EAAa,GACb,MAAM,EAAS,CAAE,SAAU,IAAK,OAAQ,kCACxC,CAAC,EAAO,GAAU,QAAS,GAAO,EAAG,QAAQ,CAAC,CAAE,QAAS,GAAK,CAAE,QAAS,IAAM,IAC/E,EAAO,EAAK,QAAQ,WAAa,EAAK,SAAS,SAAS,gBAE1D,EAAK,GAAG,SAAS,KAAK,GAAM,MAAM,QAClC,WAAW,EAAM,IACnB,CAEA,SAAS,EAAa,EAAK,GA4BzB,GA3BI,GAAM,EAAK,UACf,EAAO,KACP,IACA,EAAW,EACX,EAAS,EAAU,OAAQ,GAAM,EAAE,aAAa,sBAAwB,GACnE,EAAO,SAAQ,EAAS,GAE7B,EAAU,QAAS,IACjB,EAAE,MAAM,WAAa,OACrB,EAAE,QAAU,EAAO,SAAS,GAC5B,EAAE,gBAAgB,oBAEpB,EAAS,kBACT,EAAO,EAAO,IAAI,CAAC,EAAO,KACxB,MAAM,EAAM,EAAY,WAAU,GAIlC,OAHA,EAAI,aAAa,aAAc,YAAY,EAAI,SAAS,EAAO,UAC/D,EAAI,iBAAiB,QAAS,IAAM,EAAK,IACzC,EAAS,YAAY,GACd,IAET,EAAS,OAAS,EAAO,OAAS,EAClC,GAAU,EACV,GAAW,EACX,EAAQ,EACR,EAAM,MAAM,WAAa,GACzB,EAAM,MAAM,YAAc,GAC1B,EAAM,MAAM,eAAiB,EAAO,OAAS,EAAI,aAAe,SAC5D,EAAO,OAAS,EAAG,CACrB,EAAS,IACT,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,IAAK,CAC/B,MAAM,EAAS,EAAO,IAAK,IACzB,MAAM,EAAI,EAAE,WAAU,GAItB,OAHA,EAAE,aAAa,gBAAiB,IAChC,EAAE,aAAa,cAAe,QAC9B,EAAE,iBAAiB,aAAa,QAAS,IAAS,EAAG,UAAY,IAC1D,IAET,EAAM,UAAU,GAChB,EAAQ,EAAM,OAAO,EACvB,CACA,IACA,GAAW,EACX,EAAO,EAAe,EAAO,CAC3B,QAAQ,EACR,WAAW,EACX,OAAQ,EACR,aAAc,WAAW,iBAAiB,GAAO,YAAc,EAC/D,SAAU,CAAC,EAAI,KAAa,GAAU,EAAU,MAElD,EAAK,QAAQ,GAAW,EAAG,CAAE,SAAU,IACnC,EAAK,YAEP,EAAK,UAAU,iBAAiB,QAAS,KAAQ,GAAW,IAC5D,EAAK,UAAU,iBAAiB,YAAa,KAC3C,GAAU,EACV,GAAO,EACP,EAAK,aAAa,mBAAoB,MAExC,EAAK,UAAU,iBAAiB,UAAW,KACzC,EAAK,gBAAgB,oBACrB,EAAO,EAAK,QAAQ,YAG1B,CACA,EAAU,GAAW,GAChB,EAAM,YACX,EAAU,QAAS,IAAQ,EAAE,MAAM,WAAa,IAClD,CAEA,SAAS,EAAK,GACZ,IAAK,EAEH,YADA,GAAU,GAGZ,MAAM,EAAK,EAAO,KAAK,IAAI,EAAM,EAAM,KAAO,EAC9C,EAAO,GACF,IAAS,SAAS,QAAU,EAAO,OAAS,IAC/C,GAAW,EACX,EAAK,EAAQ,KAAK,IAAI,EAAU,EAAU,IACtC,GAAW,IACb,EAAU,EACV,EAAM,EAAU,KAGpB,sBAAsB,EACxB,CAEA,SAAS,KACH,GAAY,IAChB,GAAU,EACV,EAAO,EACP,sBAAsB,GACxB,CAIA,EAAM,iBAAiB,QAAU,IAC/B,GAAI,EAIF,OAHA,GAAU,EACV,EAAE,sBACF,EAAE,kBAGJ,MAAM,EAAI,EAAM,QAAQ,EAAE,OAAO,QAAQ,qBAC9B,IAAP,GAAY,IAAM,IACtB,EAAE,iBACF,EAAE,kBACF,EAAM,MACL,GACH,EAAM,iBAAiB,cAAe,KAAQ,GAAU,IAExD,EAAQ,QAAQ,CAAC,EAAG,KAClB,EAAE,iBAAiB,QAAU,IAC3B,EAAE,iBACsC,SAApC,EAAE,aAAa,kBACnB,EAAU,EAAE,aAAa,mBAAmB,KAG9C,EAAE,iBAAiB,UAAY,IAC7B,MAAM,EAAgB,eAAV,EAAE,IAAuB,EAAc,cAAV,EAAE,KAAuB,EAAI,EACtE,IAAK,EAAK,OACV,EAAE,iBACF,MAAM,EAAO,GAAS,EAAI,EAAM,EAAQ,QAAU,EAAQ,QAC1D,EAAU,EAAK,aAAa,mBAAmB,GAC/C,EAAK,YAIT,EAAK,iBAAiB,eAAgB,KAAQ,GAAO,IACrD,EAAK,iBAAiB,eAAgB,KAAQ,GAAO,IACrD,EAAK,iBAAiB,UAAW,KAAQ,GAAO,IAChD,EAAK,iBAAiB,WAAa,IAC5B,EAAK,SAAS,EAAE,iBAAgB,GAAO,KAK9C,OAAO,iBAAiB,SAAU,KAC3B,IACD,MAAmB,EAAQ,EAAa,EAAU,GACjD,OAEP,IAAI,qBAAsB,IACxB,EAAS,EAAQ,GAAG,eAChB,GAAQ,MACX,QAAQ,GAEX,EAAK,aAAa,gBAAiB,IAEnC,MAAM,GAAe,EAAK,aAAa,kBAAoB,IAAI,OAAO,cAChE,EACJ,EAAQ,KAAM,GAAM,GAAe,EAAE,aAAa,oBAAsB,IACxE,EAAQ,KAAM,GAA0C,SAApC,EAAE,aAAa,mBACnC,EAAQ,GACV,EAAU,EAAQ,EAAM,aAAa,kBAAoB,KAC3D,CA5U4B,CAAoB,EAAM,KAEtD,CA+UA,SAAS,IACP,SAAS,iBAAiB,6BAA6B,QAAS,IAC9D,MAAM,EAA4E,SAA5D,EAAU,aAAa,iCAE7C,SAAS,EAAU,EAAM,GACvB,EAAK,aAAa,wBAAyB,EAAO,SAAW,cAC7D,MAAM,EAAS,EAAK,cAAc,2BAC9B,GAAQ,EAAO,aAAa,gBAAiB,OAAO,GAC1D,CAIA,EAAU,aAAa,uBAAwB,MAC/C,sBAAsB,IAAM,sBAAsB,KAChD,EAAU,aAAa,uBAAwB,WAGjD,EAAU,iBAAiB,QAAU,IACnC,MAAM,EAAS,EAAM,OAAO,QAAQ,2BACpC,IAAK,EAAQ,OACb,MAAM,EAAO,EAAO,QAAQ,2BAC5B,IAAK,EAAM,OACX,MAAM,EAA0D,WAA/C,EAAK,aAAa,yBACnC,EAAU,GAAO,GACb,IAAkB,GACpB,EAAU,iBAAiB,oCAAoC,QAAS,IAClE,IAAY,GAAM,EAAU,GAAS,QAKnD,CAiBA,SAAS,IAEP,IADgB,SAAS,iBAAiB,uCAC7B,OAAQ,OAErB,IAAI,EAAS,KACT,EAAQ,KACR,EAAa,KAwBjB,SAAS,IACP,EAAM,UAAY,GACd,OAAO,OAAO,OAAO,MAAM,QAC3B,IACF,EAAW,QACX,EAAa,KAEjB,CAEA,SAAS,IACP,IACI,EAAO,MAAM,EAAO,OAC1B,CAEA,SAAS,EAAK,GACZ,MAAM,EAtDV,SAAuB,GACrB,MAAM,GAAK,GAAS,IAAI,OAClB,EAAQ,sFAAsF,KAAK,GACzG,GAAI,EAAO,MAAO,kCAAkC,EAAM,kDAC1D,MAAM,EAAK,yDAAyD,KAAK,IAAM,gBAAgB,KAAK,GACpG,OAAI,EAAW,0CAA0C,EAAG,sBACrD,IACT,CA+CgB,CAAc,EAAO,aAAa,kBAC9C,IAAK,EAAK,OACL,IAtCL,EAAS,SAAS,cAAc,UAChC,EAAO,UAAY,kBACnB,EAAO,aAAa,aAAc,SAClC,EAAO,UACL,yTAGF,EAAQ,EAAO,cAAc,0BAE7B,EAAO,cAAc,0BAA0B,iBAAiB,QAAS,GAEzE,EAAO,iBAAiB,QAAU,IAC5B,EAAE,SAAW,GAAQ,MAG3B,EAAO,iBAAiB,SAAU,GAClC,EAAO,iBAAiB,QAAS,GACjC,SAAS,KAAK,YAAY,IAsB1B,EAAa,EAEb,MAAM,EAAS,SAAS,cAAc,UACtC,EAAO,IAAM,EACb,EAAO,MAAQ,EAAO,aAAa,eAAiB,QACpD,EAAO,MAAQ,2CACf,EAAO,aAAa,kBAAmB,IACvC,EAAM,gBAAgB,GAGtB,MAAM,EAAQ,mDAAmD,KAAK,EAAO,aAAa,qBAAuB,IAC7G,IAAU,EAAM,GAAK,IAAM,EAAM,GAAK,GACxC,EAAM,MAAM,YAAc,GAAG,EAAM,QAAQ,EAAM,KACjD,EAAM,MAAM,MAAQ,2CAA2C,EAAM,QAAQ,EAAM,SAEnF,EAAM,MAAM,YAAc,GAC1B,EAAM,MAAM,MAAQ,IAGlB,OAAO,OAAO,OAAO,MAAM,OAC/B,EAAO,WACT,CAGA,SAAS,iBAAiB,QAAU,IAClC,MAAM,EAAS,EAAE,OAAO,QAAQ,uCAC3B,IACL,EAAE,iBACF,EAAK,KAET,CASA,MAEM,EACK,SADL,EAEK,6CAFL,EAGU,6BAHV,EAIS,wBAJT,EAKG,sEAGH,EAAqB,6BAGrB,EAAmB,OAAO,SAAS,OAAS,cAGlD,IAAI,GAAqB,EAOzB,SAAS,IACP,MAAM,EAAQ,SAAS,iBAAiB,uBACxC,EAAW,UAAU,EAAM,iCAC3B,EAAM,QAAQ,CAAC,EAAM,KACnB,MAAM,EAAO,EAAK,cAAc,uBAChC,IAAK,GAAQ,EAAK,UAAW,OAC7B,EAAK,WAAY,EAEjB,MAAM,EAAS,IAAI,IAAI,EAAK,aAAa,UAAW,OAAO,SAAS,MAC9D,EAAU,EAAK,cAAc,0BAC7B,EAAQ,EAAK,cAAc,wBAC3B,EAAY,EAAQ,EAAM,cAAc,8BAAgC,EAAQ,KAChF,EAAQ,EAAK,cAAc,wBAC3B,EAAY,EAAQ,EAAM,YAAc,GACxC,EAAW,EAAK,cAAc,aAC9B,EAAS,EAAK,iBAAiB,uBAC/B,EAAW,KAAK,MACtB,IAAI,GAAO,EAGX,EAAK,iBAAiB,UAAW,IAAM,EAAe,EAAO,QAAQ,MAAM,QAAW,CAAE,MAAM,IAG9F,MAAM,EAAQ,SAAS,cAAc,UACrC,EAAM,KAAO,gBAAkB,EAC/B,EAAM,MAAQ,UACd,EAAM,UAAY,EAClB,EAAM,aAAa,cAAe,QAClC,EAAM,MAAM,QAAU,iEACtB,EAAK,YAAY,GAGjB,IAAI,GAAa,EACb,EAAqB,EAUzB,SAAS,IACP,EAAO,QAAS,IACd,MAAM,EAAO,EAAM,QAAQ,qBACvB,GAAM,EAAK,aAAa,eAAgB,EAAM,QAAU,OAAS,UAEzE,CAIA,SAAS,EAAO,GACT,IACL,EAAG,MAAM,QAAU,QACf,OAAO,MAAM,KAAK,OAAO,EAAI,CAAE,QAAS,EAAG,EAAG,GAAK,CACrD,QAAS,EACT,EAAG,EACH,SAAU,GACV,KAAM,eAEV,CAEA,SAAS,EAAK,GACR,IAAI,EAAG,MAAM,QAAU,OAC7B,CAEA,SAAS,EAAW,GAClB,EAAO,EACH,IAAO,EAAM,YAAc,EAAY,EAAuB,GAClE,EAAK,aAAa,YAAa,EAAY,OAAS,SACpD,EAAK,aAAa,qBAAsB,EAAY,UAAY,OAClE,CAEA,SAAS,IACP,EAAK,QACL,IACA,EAAK,GACL,EAAK,GACL,EAAO,GACP,EAAK,aAAa,qBAAsB,UAC1C,CAEA,SAAS,EAAU,GACb,IAAW,EAAU,YAAc,GAAW,GAClD,EAAO,GACP,EAAK,aAAa,qBAAsB,QAC1C,CArDA,CAAC,UAAW,QAAS,WAAW,QAAS,IACvC,EAAK,iBAAiB,EAAO,KACtB,EAAE,WAAc,EAAE,QAA4B,WAAlB,EAAE,OAAO,OAC1C,GAAa,EACR,IAAoB,EAAqB,KAAK,YAWvD,EAAO,QAAS,GAAU,EAAM,iBAAiB,SAAU,IAC3D,IAwCA,MAAM,EAAa,EAAK,cAAc,sCACtC,IAAI,GAAe,EACnB,SAAS,IACP,MAAM,GAAW,GAA2C,KAA5B,EAAW,MAAM,QAAiB,EAAW,gBACvE,GAAU,EAAK,cAAc,0BAA4B,EAAK,cAAc,+BAClF,OAAI,GAAW,EAAe,GAC1B,EAAgB,EAChB,EAAe,EACZ,CACT,CAEA,CAAC,QAAS,UAAU,QAAS,GAAS,EAAK,iBAAiB,EAAM,KAChE,IAAK,EAAc,OACnB,MAAM,EAAO,IACT,EACF,EAAU,IAEV,GAAe,EACf,EAAK,GACL,EAAK,aAAa,qBAAsB,YAK5C,EAAK,iBAAiB,SAAU,MAAO,IAGrC,GAFA,EAAE,iBACF,EAAE,4BACE,EAAJ,CAKA,GAJA,EAAK,GACL,GAAe,EAGgB,mBAApB,EAAK,aAA8B,EAAK,aAIjD,OAHA,EAAW,oDACX,EAAU,KAAiB,QAC3B,GAAe,GAKjB,GAAI,GAAY,EAAS,MACvB,QADF,CAKA,GAAW,GACX,IACE,MAAM,QAiBd,eAA6B,EAAM,EAAO,EAAQ,GAChD,MAAM,EAAU,EAAK,cAAc,mBAC7B,EAAO,EAAK,cAAc,mBAEhC,EAAgB,EAAM,OAAQ,GAC9B,EAAgB,EAAM,kBAAmB,OAAO,KAAK,MAAQ,EAAQ,WACrE,EAAgB,EAAM,kBAAmB,IACzC,EAAgB,EAAM,gBAAiB,IAGvC,MAAM,QA2DR,eAAmC,EAAQ,EAAS,EAAM,GACxD,IAAK,IAAY,EAAM,OAAO,KAC9B,MAAM,EAAM,IAAI,IAAI,EAAoB,EAAO,QAC/C,EAAI,aAAa,IAAI,IAAK,GAC1B,EAAI,aAAa,IAAI,IAAK,GAC1B,EAAI,aAAa,IAAI,IAAK,KAC1B,EAAI,aAAa,IAAI,IAAK,GAC1B,IACE,MAAM,QAAY,MAAM,EAAK,CAC3B,YAAa,OACb,QAAS,CAAE,OAAQ,sBAErB,IAAK,EAAI,GAAI,OAAO,KACpB,MAAM,QAAa,EAAI,OAEvB,OADA,EAAW,QAAS,GAAQ,EAAK,MAAQ,YAAc,OAAQ,GAAQ,EAAK,WACrE,GAAQ,EAAK,MAAQ,EAAO,IACrC,CAAE,MAAO,GAEP,OADA,EAAW,gBAAiB,GACrB,IACT,CACF,CA/EsB,CAAoB,EAAQ,GAAW,EAAQ,MAAO,GAAQ,EAAK,MA+CzF,SAA0B,GACxB,MAAM,EAAM,OAAO,WAAa,CAAC,EAC3B,KAAc,EAAI,YAAmD,IAAtC,EAAI,UAAU,QAAQ,YAAsB,OAAO,QACxF,MAAO,CACL,EAAQ,WAAa,EAAI,EACzB,EAAqB,EAAI,EACzB,EAAI,UAAY,EAAI,EACpB,EAAW,EAAI,EACf,KAAK,IAAI,EAAQ,mBAAqB,KAAK,MAAQ,EAAQ,mBAAqB,EAAG,UACnF,KAAK,IACT,CAxDI,CAAiB,IACnB,GAAI,IACF,EAAgB,EAAM,kBAAmB,EAAM,OAC3C,EAAM,WAAW,CACnB,MAAM,QAiFZ,eAA+B,EAAW,GACxC,UACQ,EAAe,EACvB,CAAE,MAAO,GACP,OAAO,IACT,CACA,OAAK,OAAO,WACL,IAAI,QAAS,IAClB,OAAO,WAAW,MAAM,EAAU,KAAM,EAAU,WAAY,EAAS,CAAE,MAAO,QAFnD,IAIjC,CA3F6B,CAAgB,EAAM,UAAW,EAAO,QAC3D,GAAU,EAAgB,EAAM,gBAAiB,EACvD,CAIF,OAFA,EAAW,YAAa,OAAO,YAAY,IAAI,SAAS,KAEjD,IAAI,QAAS,IAClB,MAAM,EAAQ,WAAW,KACvB,EAAM,oBAAoB,OAAQ,GAClC,GAAQ,IACP,MAEH,SAAS,IACP,aAAa,GAEb,IAAI,GAAa,EACjB,IACE,EAAa,EAAM,cAAc,SAAS,SAAW,OAAO,SAAS,MACvE,CAAE,MAAO,GAAM,CACf,EAAW,EAAa,iCACtB,0CACF,EAAQ,EACV,CAEA,EAAM,iBAAiB,OAAQ,EAAQ,CAAE,MAAM,IAC/C,EAAK,aAAa,SAAU,EAAM,MAClC,EAAK,UAET,CA5DyB,CAAc,EAAM,EAAO,EAAQ,CAClD,WACA,aACA,uBAEF,GAAW,GACP,EAAI,IACH,GACP,CAAE,MAAO,GACP,EAAW,oBAAqB,GAChC,GAAW,GACX,GACF,CAhBA,CAhBgB,IAiCf,IAEP,CA+CA,SAAS,EAAgB,EAAM,EAAM,GACnC,IAAI,EAAQ,EAAK,cAAc,eAAe,OACzC,IACH,EAAQ,SAAS,cAAc,SAC/B,EAAM,KAAO,SACb,EAAM,KAAO,EACb,EAAK,YAAY,IAEnB,EAAM,MAAQ,CAChB,CAqCA,SAAS,EAAe,GACtB,OAAI,OAAO,WAAmB,QAAQ,UAC/B,EAAW,EAnQK,mCAoQzB,CAcA,SAAS,KAAc,GA7RD,KA+RtB,CAWA,SAAS,IACP,MAAM,EAAO,SAAS,cAAc,mBAEpC,GAAK,IAAQ,EAAK,aAAa,mBAAoB,EAAK,cAAc,cACjE,OAAO,MAAS,OAAO,cAA5B,CACA,IACI,EAAI,IAAK,EAAI,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,GAAI,EAAK,IAAK,EAAK,IAAc,EAAK,KACjF,EAAM,UACN,EAAI,CACN,OAAQ,CAAE,GAAI,UAAW,GAAI,UAAW,MAAO,UAAW,IAAK,WAC/D,IAAK,CAAE,GAAI,UAAW,GAAI,UAAW,MAAO,UAAW,IAAK,WAC5D,IAAK,CAAE,GAAI,UAAW,GAAI,UAAW,MAAO,UAAW,IAAK,WAC5D,GAAI,CAAE,GAAI,UAAW,GAAI,UAAW,MAAO,UAAW,IAAK,YAKzD,EAAQ,CACV,CAAE,EAAG,SAAU,EAAG,SAAU,EAAG,CAAC,IAAK,KAAM,EAAG,CAAC,IAAK,KAAM,KAAM,GAAI,IAAK,GACzE,CAAE,EAAG,eAAgB,EAAG,SAAU,EAAG,CAAC,IAAK,KAAM,EAAG,CAAC,IAAK,KAAM,IAAK,GAAI,IAAK,GAC9E,CAAE,EAAG,WAAY,EAAG,MAAO,EAAG,CAAC,IAAK,KAAM,EAAG,CAAC,IAAK,KAAM,KAAM,IAC/D,CAAE,EAAG,MAAO,EAAG,MAAO,EAAG,CAAC,IAAK,KAAM,EAAG,CAAC,IAAK,KAAM,KAAM,GAAI,IAAK,GACnE,CAAE,EAAG,WAAY,EAAG,MAAO,EAAG,CAAC,IAAK,KAAM,EAAG,CAAC,IAAK,KAAM,KAAM,IAAK,IAAK,GACzE,CAAE,EAAG,WAAY,EAAG,MAAO,EAAG,CAAC,GAAI,KAAM,EAAG,CAAC,IAAK,KAAM,IAAK,KAC7D,CAAE,EAAG,aAAc,EAAG,MAAO,EAAG,CAAC,IAAK,KAAM,EAAG,CAAC,IAAK,KAAM,IAAK,IAAK,IAAK,GAC1E,CAAE,EAAG,MAAO,EAAG,MAAO,EAAG,CAAC,IAAK,KAAM,EAAG,CAAC,IAAK,KAAM,IAAK,GAAI,IAAK,GAClE,CAAE,EAAG,SAAU,EAAG,MAAO,EAAG,CAAC,IAAK,IAAK,EAAG,CAAC,IAAK,KAAM,IAAK,GAAI,IAAK,GACpE,CAAE,EAAG,aAAc,EAAG,KAAM,EAAG,CAAC,IAAK,KAAM,EAAG,CAAC,IAAK,KAAM,IAAK,IAAK,KAAM,IAGxE,EAAI,GACR,EAAM,QAAQ,SAAU,GAAK,EAAE,EAAI,CAAC,GAAM,EAAE,EAAE,GAAK,GAAM,EAAG,GAAM,EAAE,EAAE,GAAK,GAAM,EAAI,GACrF,IAAI,EAAQ,CACV,CAAC,EAAG,uCACJ,CAAC,EAAG,+BACJ,CAAC,EAAG,qCACJ,CAAC,EAAG,8CACJ,CAAC,EAAG,kCACJ,CAAC,EAAG,8BACJ,CAAC,EAAG,oCACJ,CAAC,EAAG,wCACJ,CAAC,EAAG,mDAEF,EAAQ,CAAC,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,CAAC,EAAG,IAErG,EAAS,CACX,CAAE,EAAG,SAAU,EAAG,mBAAoB,EAAG,CAAC,IAAS,KAAU,EAAG,CAAC,GAAI,EAAG,EAAG,GAAI,EAAG,CAAC,GAAI,EAAG,EAAG,GAAI,EAAG,EAAE,GAAI,GAAI,GAAI,IAClH,CAAE,EAAG,MAAO,EAAG,gBAAiB,EAAG,CAAC,EAAI,KAAU,EAAG,CAAC,EAAG,EAAG,EAAG,GAAI,EAAG,CAAC,EAAG,GAAI,EAAG,GAAI,EAAG,CAAC,GAAI,GAAI,EAAG,IACpG,CAAE,EAAG,MAAO,EAAG,YAAa,EAAG,CAAC,IAAS,GAAK,EAAG,EAAE,GAAI,EAAG,EAAG,GAAI,EAAG,CAAC,EAAG,EAAG,EAAG,IAAK,EAAG,EAAE,EAAG,GAAI,EAAG,IAClG,CAAE,EAAG,KAAM,EAAG,cAAe,EAAG,CAAC,EAAI,GAAK,EAAG,EAAE,EAAG,EAAG,EAAG,GAAI,EAAG,CAAC,EAAG,EAAG,GAAI,GAAI,EAAG,CAAC,EAAG,GAAI,GAAI,KAG3F,EAAO,CACT,OAAQ,qsBACR,IAAK,kJACL,IAAK,0bACL,GAAI,0XAqBF,EAAO,GAmCP,EAAM,CAAC,EAAE,GAAI,GAAI,EAAE,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAE,GAAI,IAAK,EAAG,GAAI,EAAG,IAAK,CAAC,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,CAAC,EAAG,EAAG,EAAG,EAAG,GAAI,IAuU9G,KAAK,eAAe,eAnSpB,SAAe,GACb,IAAI,EAAQ,EAAK,cAAc,mBAC3B,EAAQ,EAAK,cAAc,mBAC3B,EAAU,EAAK,iBAAiB,kBACpC,GAAK,GAAU,KAAS,EAAQ,OAAS,GAAzC,CACA,IAAI,EAAS,OAAO,WAAW,oCAAoC,QAE/D,EAAK,OAAO,WAAW,sBAE3B,EAAM,UAAY,GAClB,IAAI,EAAI,EAAI,MAAO,CAAE,QAAS,WAAmB,EAAG,MAAS,eAAgB,UAAW,SAAW,GAC/F,EAAO,EAAI,OAAQ,CAAC,EAAG,GAC3B,EAAI,SAAU,CAAE,EAAG,GAAM,EAAI,WAAY,CAAE,GAAI,YAAc,IAC7D,IAAI,EAAK,EAAI,iBAAkB,CAAE,GAAI,UAAY,GACjD,EAAI,OAAQ,CAAE,OAAQ,IAAK,aAAc,OAAQ,eAAgB,OAAS,GAC1E,EAAI,OAAQ,CAAE,OAAQ,IAAK,aAAc,OAAQ,eAAgB,KAAO,GAExE,IAAI,EAAO,EAAI,SAAU,CAAE,GAAI,EAAI,GAAI,EAAI,EAAG,IAAK,KAAM,eAAgB,QAAS,GAAK,GACnF,EAAS,EAAI,IAAK,CAAE,KAAM,OAAQ,OAAQ,UAAW,eAAgB,IAAK,iBAAkB,QAAS,mBAAoB,OAAS,GAClI,EAAQ,EAAM,IAAI,SAAU,GAC9B,MAAO,CAAE,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,IAAK,EAAU,EAAG,GAAI,EAAG,IAAK,GAAI,EAAI,OAAQ,CAAC,EAAG,GACjF,GACI,EAAU,EAAI,IAAK,CAAC,EAAG,GACvB,EAAS,EAAO,IAAI,SAAU,GAChC,IAAI,EAAI,EAAI,IAAK,CAAE,QAAS,GAAK,GAEjC,OADA,EAAI,OAAQ,CAAE,EAAG,EAAU,EAAE,EAAG,EAAE,GAAI,KAAM,EAAE,EAAE,GAAG,MAAO,OAAQ,UAAW,eAAgB,EAAG,kBAAmB,SAAW,GACvH,CAAE,EAAG,EAAG,EAAG,EACpB,GACI,EAAS,EAAI,IAAK,CAAE,KAAM,OAAQ,OAAQ,UAAW,eAAgB,KAAO,GAC5E,EAAQ,CAAC,EAAI,SAAU,CAAE,GAAI,EAAI,GAAI,EAAI,QAAS,GAAK,GAAS,EAAI,SAAU,CAAE,GAAI,EAAI,GAAI,EAAI,QAAS,GAAK,IAC9G,EAAS,EAAI,IAAK,CAAE,KAAM,OAAQ,eAAgB,EAAG,iBAAkB,QAAS,mBAAoB,OAAS,GAC7G,EAAQ,EAAI,IAAK,CAAC,EAAG,GACrB,EAAO,EAAI,IAAK,CAAE,QAAS,GAAK,GAChC,EAAU,EAAI,OAAQ,CAAE,KAAM,OAAQ,OAAQ,EAAK,eAAgB,KAAO,GAC9E,EAAI,OAAQ,CAAE,cAAe,SAAU,EAAG,GAAI,KAAM,EAAK,MAAS,oBAAsB,GAAM,YAAc,MAC5G,IAAI,EAAS,EAAI,IAAK,CAAC,EAAG,GACtB,EAAS,EAAI,IAAK,CAAC,EAAG,GAEtB,EAAQ,EAAM,IAAI,SAAU,EAAG,GACjC,IAAI,EAAI,EAAE,EAAE,GAAI,EAAI,EAAI,IAAK,CAAC,EAAG,GAAS,EAAM,KAAK,GAAK,IACtD,EAAO,EAAI,SAAU,CAAE,EAAG,GAAQ,KAAM,OAAQ,OAAQ,EAAE,GAAI,eAAgB,IAAK,QAAS,GAAK,GACrG,EAAI,SAAU,CAAE,EAAG,EAAI,KAAM,EAAE,IAAM,GACrC,IAAI,EAAK,EAAI,IAAK,CAAE,YAAa,kBAAoB,GAIrD,OAHA,EAAI,SAAU,CAAE,IAAK,EAAG,EAAG,IAAK,KAAM,EAAE,IAAM,GAC9C,EAAI,UAAW,CAAE,GAAI,GAAI,GAAI,GAAI,GAAI,KAAM,KAAM,EAAE,IAAM,GAElD,CACL,EAAG,EAAG,EAAG,EAAG,KAAM,EAAM,IAAK,EAAI,KAFxB,EAAI,OAAQ,CAAE,EAAG,EAAK,EAAE,GAAI,KAAM,EAAE,GAAI,UAAW,kCAAmC,QAAS,GAAK,GAEhE,KAAM,EAAI,OAAQ,CAAE,OAAQ,EAAE,IAAM,GACjF,KAAM,CAAC,EAAI,SAAU,CAAE,EAAG,IAAK,KAAM,EAAE,GAAI,QAAS,GAAK,GAAQ,EAAI,SAAU,CAAE,EAAG,IAAK,KAAM,EAAE,GAAI,QAAS,GAAK,IACnH,KAAM,CAAC,EAAK,IAAM,EAAI,KAAK,IAAI,EAAE,IAAM,GAAM,EAAK,IAAU,KAAK,IAAI,EAAE,IAAM,IAC7E,GAAI,CAAC,GAAM,EAAE,EAAE,GAAK,GAAM,EAAI,GAAM,EAAE,EAAE,GAAK,GAAM,GACnD,IAAK,EAAE,EAAE,QAAS,EAAG,EAAG,GAAQ,KAAJ,EAE5B,GAAI,KAAK,IAAI,EAAE,IAAM,IAAQ,IAEjC,GACI,EAAQ,CAAC,EAAG,GAAG,IAAI,WACrB,IAAI,EAAI,EAAI,IAAK,CAAE,QAAS,GAAK,GACjC,EAAI,OAAQ,CAAE,EAAG,4FAA6F,KAAM,OAAQ,OAAQ,EAAK,eAAgB,IAAK,kBAAmB,SAAW,GAC5L,EAAE,EAAG,EAAG,GAAG,QAAQ,SAAU,GAAK,EAAI,SAAU,CAAE,GAAI,EAAG,IAAK,EAAG,EAAG,IAAK,KAAM,GAAO,EAAI,GAC1F,IAAI,EAAI,EAAI,OAAQ,CAAE,cAAe,SAAU,KAAM,EAAK,MAAS,aAAc,QAAS,GAAK,GAE/F,OADA,EAAE,YAAc,IACT,CAAE,EAAG,EAAG,EAAG,EACpB,GAEI,EAAK,EAAI,mBAAoB,GAC7B,EAAQ,EAAM,IAAI,SAAU,GAAK,OAAO,EAAI,iBAAmB,EAAE,EAAE,IAAM,UAAY,IAAK,EAAI,EAAE,EAAE,EAAI,GACtG,EAAU,EAAO,IAAI,SAAU,GAAK,OAAO,EAAI,kBAAmB,EAAI,EAAE,EAAE,EAAI,GAC9E,EAAW,EAAI,iBAAkB,GACjC,EAAQ,EAAM,IAAI,SAAU,GAAK,MAAO,CAAE,EAAG,EAAE,GAAI,GAAI,EAAI,gBAAiB,EAAU,EAAE,IAAO,GAC/F,EAAI,CAAE,MAAO,EAAG,MAAO,EAAG,IAAK,EAAG,OAAQ,EAAG,OAAQ,EAAG,IAAK,EAAG,MAAO,EAAG,KAAM,GA4HhF,EAAK,KAAK,SAAS,CAAE,QAAQ,EAAM,SAAU,CAAE,KAAM,UAEzD,EAAG,GAAG,EAAG,CAAE,MAAO,EAAG,SAAU,IAAM,KAAM,aAAe,KACvD,GAAG,EAAG,CAAE,MAAO,EAAG,SAAU,IAAM,KAAM,gBAAkB,KAC1D,GAAG,EAAG,CAAE,IAAK,EAAG,SAAU,KAAQ,KAClC,GAAG,EAAG,CAAE,OAAQ,EAAG,SAAU,IAAM,KAAM,aAAe,IACxD,GAAG,EAAG,CAAE,OAAQ,EAAG,SAAU,IAAM,KAAM,gBAAkB,KAC3D,GAAG,EAAG,CAAE,IAAK,EAAG,SAAU,KAAQ,KAClC,GAAG,EAAG,CAAE,MAAO,EAAG,SAAU,IAAO,KACnC,GAAG,EAAG,CAAE,KAAM,EAAG,SAAU,KAAQ,IACnC,GAAG,CAAE,EAAG,GAAK,CAAE,EAAG,EAAG,SAAU,KAAQ,KAE1C,IAAI,IAAO,EASX,GAAU,GAED,KAAK,aACX,IAAI,CAAE,KAAM,qBAAsB,IAAK,sBAAwB,SAAU,GAE1E,IAAI,EAAM,EAAK,cAAc,oBAC7B,GAAI,EAAI,WAAW,KACjB,cAAc,OAAO,CACnB,QAAS,EAAQ,GAAI,MAAO,gBAAiB,WAAY,EAAQ,GAAI,IAAK,gBAAiB,UAAW,EAAI,MAAO,GACjH,SAAU,SAAU,GAAQ,GAAU,EAAK,SAAW,QAEnD,CAIL,IAAI,EAAM,CAAC,CAAC,IAAM,KAAO,CAAC,GAAK,MAC3B,EAAO,WAET,IAAI,EAAK,EAAM,EAAI,cAAgB,WAAW,iBAAiB,GAAK,MAAQ,GAAK,EACjF,MAAO,OAAS,KAAK,MAAM,KAAK,IAAI,EAAK,GAAyB,IAArB,OAAO,cAAuB,IAC7E,EACI,EAAO,GACP,EAAO,WACT,KAAI,EAAK,OAAS,GAAlB,CACA,IAAI,EAAI,EAAK,GAAG,SAAU,EAAI,EAAK,GAAG,SAClC,EAAI,EAAI,EAAI,EAAK,EAAI,GAAG,GAAI,EAAI,GAAG,GAAI,GAAK,GAAK,EAAI,GAAM,EAAK,EAAI,GAAG,GAAI,EAAI,GAAG,GAAI,GAC1F,GAAU,GACV,KAAK,GAAG,EAAI,CAAE,KAAM,EAAG,SAAU,GAAK,KAAM,aAAc,WAAW,GAJ1C,CAK7B,EACA,CAAC,EAAG,GAAG,QAAQ,SAAU,GACvB,EAAK,KAAK,cAAc,OAAO,CAC7B,QAAS,EAAQ,GAAG,mBAAqB,EAAQ,GAAI,MAAO,UAAW,IAAK,EAC5E,SAAU,EAAM,UAAW,IAE/B,GACA,GACF,CAGA,IAAI,EAAM,EACV,SAAS,IACP,EAAM,EAEN,IADA,IAAI,EAAK,EAAM,EAAI,wBAAwB,OAAS,EAAG,EAAK,OAAO,YAC1D,EAAI,EAAG,EAAI,EAAQ,OAAQ,IAAK,CACvC,IAAI,EAAK,EAAQ,GACjB,GAAK,EAAG,kBAAR,CACA,IAAI,EAAI,EAAG,kBAAkB,wBAAwB,IAAK,EAAI,EAAG,iBAAiB,wBAAwB,OACtG,EAAI,EAAI,WAAW,IACnB,KAAK,IAAI,GAAO,EAAI,EAAK,IAAM,KAAM,GAAY,IAAL,EAAY,IAAW,IAAL,KAC9D,KAAK,IAAI,GAAO,EAAS,IAAL,IAAmB,GAAL,IAAY,GAAY,IAAL,EAAY,IAAW,GAAL,KAC3E,EAAG,MAAM,WAAa,OACtB,EAAG,MAAM,SAAW,IAAO,IAAO,GAAG,QAAQ,EANV,CAOrC,CACF,CACA,SAAS,IAAkB,IAAK,EAAM,sBAAsB,GAAO,CAInE,OAHA,OAAO,iBAAiB,SAAU,EAAU,CAAE,SAAS,IACvD,OAAO,iBAAiB,SAAU,GAClC,IACO,WACL,OAAO,oBAAoB,SAAU,GACrC,OAAO,oBAAoB,SAAU,GACrC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,OAAQ,IAAO,EAAQ,GAAG,MAAM,QAAU,GAAI,EAAQ,GAAG,MAAM,WAAa,EAC1G,CACF,GAEA,IAAI,IAAU,EACd,IAAI,qBAAqB,SAAU,GACjC,IAAI,EAAM,EAAG,GAAG,eACZ,IAAQ,IAAS,KAAK,OAAO,IAAI,KAChC,GAAO,IAAS,KAAK,OAAO,OAAO,IACxC,GAAU,CACZ,EAAG,CAAE,WAAY,UAAW,QAAQ,GACpC,KACA,EAAK,aAAa,gBAAiB,IACnC,OAAO,iBAAiB,OAAQ,WAAc,cAAc,SAAW,EA7RrB,CAoElD,SAAS,KACP,IAAI,EAAI,EAAS,EAAI,YAAY,MAAQ,IAAM,EAAK,EAAE,MAAO,EAAK,EAAE,OAChE,EAAK,EAAG,QAnE2C,GAmE1B,GAAM,EAAI,GAAM,EAC7C,EAAE,aAAa,UAAW,KAAO,EAAE,GAAM,IAAM,EAAI,IAAM,GAEzD,EAAM,QAAQ,SAAU,EAAG,GACzB,IAAI,EAAI,EAAE,EAAG,EAAI,EAAM,EAAM,EAAE,EAAG,EAAE,GAAI,GAAK,EAAE,KAAM,GAAK,EAAkB,GAAV,EAAI,GAAe,IAAL,EAAW,IACvF,EAAI,EAAE,GAAK,KAAK,IAAQ,GAAJ,EAAU,EAAE,IAAM,EAAsC,GAA/B,KAAK,IAAQ,IAAJ,EAAiB,EAAP,EAAE,IAAgB,EAAE,MACpF,EAAI,EAAE,GAAK,KAAK,IAAQ,GAAJ,EAAiB,IAAP,EAAE,IAAY,EAC5C,EAAM,GAAM,EAAI,GAChB,GAAM,EAAI,IAAO,IAAQ,GAAK,EAAI,GAAK,IAAQ,EAAE,IAAM,KAAO,GAClE,EAAE,IAAM,CAAC,EAAG,GACZ,EAAE,EAAI,EACN,EAAE,EAAE,aAAa,YAAa,aAAe,EAAE,GAAK,IAAM,EAAE,GAAK,WAAa,EAAG,QAAQ,GAAK,KAC9F,IAAI,EAAK,EAAE,KAAO,EAAW,IAAL,GAAY,EAAE,IAAM,EAAI,EAAY,IAAN,GAAa,EACnE,EAAE,GAAK,EACP,EAAE,EAAE,aAAa,UAAW,EAAG,QAAQ,IAEvC,IAAI,EAAK,EAAY,IAAN,EAAY,IAC3B,EAAE,IAAI,aAAa,WAAY,EAAI,GAAI,QAAQ,IAC/C,EAAE,KAAK,aAAa,UAAW,EAAG,QAAQ,IAC1C,IAAI,GAAM,EAAM,EAAS,IAAL,GAAY,EAAW,IAAL,EAAW,MAAQ,EACrD,EAAO,EAAE,GAAK,EAAK,EAAG,EAAM,EAAK,EAAK,EAC1C,EAAM,GAAG,MAAM,QAAU,QAAU,EAAE,EAAI,EAAI,KAAO,SAAW,GAAG,EAAI,EAAK,EAAM,EAAI,EAAM,GAAQ,EAAI,KAAO,8BAAgC,GAAG,IAAM,GAAQ,cAAgB,EAAG,QAAQ,EAC5L,GAEA,EAAM,QAAQ,SAAU,EAAG,GACzB,IAAI,EAAK,EAAgB,KAAV,EAAE,MAAgB,EAAI,EAAK,KAC1C,GAAI,GAAM,EAA+C,OAA1C,EAAE,GAAG,aAAa,IAAK,SAAK,EAAE,IAAM,MACnD,IAAI,EAAO,EAAE,IAAI,OAAS,EACtB,EAAI,EAAE,IAAI,IAAI,SAAU,EAAG,GAC7B,OAAU,IAAN,EAAgB,EAAM,EAAE,GAAG,IAC3B,IAAM,EAAa,EAAM,EAAE,GAAG,IAC3B,CAAC,EAAE,GAAuC,IAAlC,KAAK,IAAQ,IAAJ,EAAc,IAAJ,EAAU,GAAU,EAAE,GAAwC,IAAnC,KAAK,IAAQ,KAAJ,EAAe,IAAJ,EAAU,GAC7F,GACA,EAAE,IApKR,SAAiB,EAAG,GAClB,GAAI,GAAM,EAAG,OAAO,EACpB,IAAI,EAAI,GAAM,EAAE,OAAS,GAAI,EAAI,KAAK,MAAM,GAAI,EAAM,EAAE,MAAM,EAAG,EAAI,GAErE,OADI,EAAI,GAAG,EAAI,KAAK,EAAM,EAAE,GAAI,EAAE,EAAI,GAAI,EAAI,IACvC,EAAI,OAAS,EAAI,EAAM,CAAC,EAAE,GAAI,EAAE,GACzC,CA+Jc,CAAQ,EAAG,GACnB,EAAE,GAAG,aAAa,IA/KxB,SAAe,GAEb,IADA,IAAI,EAAI,IAAM,EAAE,EAAE,GAAG,IAAM,IAAM,EAAE,EAAE,GAAG,IAC/B,EAAI,EAAG,EAAI,EAAE,OAAS,EAAG,IAAK,CACrC,IAAI,EAAK,EAAE,EAAI,IAAM,EAAE,GAAI,EAAK,EAAE,GAAI,EAAK,EAAE,EAAI,GAAI,EAAK,EAAE,EAAI,IAAM,EACtE,GAAK,IAAM,EAAE,EAAG,IAAM,EAAG,GAAK,EAAG,IAAM,GAAK,IAAM,EAAE,EAAG,IAAM,EAAG,GAAK,EAAG,IAAM,GAAK,IACjF,EAAE,EAAG,IAAM,EAAG,GAAK,EAAG,IAAM,GAAK,IAAM,EAAE,EAAG,IAAM,EAAG,GAAK,EAAG,IAAM,GAAK,IAAM,EAAE,EAAG,IAAM,IAAM,EAAE,EAAG,GACxG,CACA,OAAO,CACT,CAuK6B,CAAM,EAAE,MAC/B,EAAE,GAAG,aAAa,UAAW,EAAW,EAAL,GAAQ,QAAQ,GACrD,GACA,EAAO,aAAa,oBAAqB,EAAO,IAAJ,IAG5C,IAAI,EAAK,EAAS,EAAI,EAAwB,GAAjB,EAAE,MAAQ,KACvC,EAAM,QAAQ,SAAU,EAAI,GAC1B,IAAI,EAAQ,IAAJ,EAAW,EAAI,EAAG,EAAI,EAAI,EAAG,EAAI,GAAuB,EAAhB,KAAK,MAAM,GAAa,EAAJ,GAAS,EAAM,QACnF,IAAK,IAAO,EAAE,IAAyE,OAAlE,EAAG,EAAE,aAAa,UAAW,QAAI,EAAG,EAAE,aAAa,UAAW,GACnF,IAAI,EAzKV,SAAiB,EAAG,GAClB,IAAI,EAAI,EAAE,OAAS,EAAG,EAAI,EAAM,GAAK,EAAG,EAAI,KAAK,IAAI,KAAK,MAAM,GAAI,EAAI,GACxE,OAAO,EAAM,EAAE,GAAI,EAAE,EAAI,GAAI,EAAI,EACnC,CAsKe,CAAQ,EAAE,IAAK,IAAO,KAAK,IAAI,EAAG,KACvC,EAAI,EAAI,IAAO,EAAI,IAAO,EAAI,GAAM,EAAI,EAAI,IAAO,GAAK,EAAI,IAAO,IAAO,EAC1E,EAAK,EAAI,IAAO,EAAI,EAAI,KAAQ,EAAI,KAAQ,GAAM,EAAI,GAAM,GAAK,EAAI,KAAQ,IAAO,EACxF,EAAG,EAAE,aAAa,YAAa,aAAe,EAAE,EAAG,IAAM,IAAM,EAAE,EAAG,GAAK,GAAK,KAC9E,EAAG,EAAE,aAAa,WAAY,EAAI,GAAI,QAAQ,IAC9C,EAAG,EAAE,aAAa,IAAK,EAAE,EAAG,KAC5B,EAAG,EAAE,aAAa,IAAK,EAAE,EAAG,GAAK,GAA6B,GAAxB,KAAK,IAAI,EAAG,EAAI,OACtD,EAAG,EAAE,aAAa,WAAY,EAAI,EAAI,EAAK,GAAI,QAAQ,GACzD,GAGA,IAAI,EAAS,KAAK,MAAM,EAAI,KAAO,EAAM,OACzC,EAAS,MAAM,QAAU,EAAwB,GAAjB,EAAE,MAAQ,KAAU,QAAQ,GAC5D,EAAM,QAAQ,SAAU,EAAG,GACzB,IAAI,EAAI,EAAM,EAAE,GAAI,EAAI,EAAE,IAAI,GAAI,EAAI,EAAE,IAAI,GAAI,EAAQ,EAAI,IACxD,EAAK,EAAI,IAAM,OAAS,EAAI,IAAM,OAAS,OAC/C,EAAE,GAAG,MAAM,KAAO,EAAE,EAAI,EAAI,KAAO,IACnC,EAAE,GAAG,MAAM,IAAM,IAAI,EAAQ,EAAI,EAAK,EAAE,EAAI,GAAK,EAAI,EAAK,EAAE,EAAI,IAAM,GAAM,EAAI,KAAO,IACvF,EAAE,GAAG,MAAM,YAAY,OAAQ,GAC/B,EAAE,GAAG,MAAM,YAAY,SAAiB,SAAP,EAAgB,MAAe,SAAP,EAAgB,MAAQ,OACjF,EAAE,GAAG,UAAU,OAAO,WAAY,GAClC,EAAE,GAAG,UAAU,OAAO,QAAS,IAAM,EACvC,GAEA,EAAO,QAAQ,SAAU,EAAG,GAC1B,IAAI,EAAI,EAAE,EAAG,EAAI,GAAS,EAAE,IAAU,GAAJ,GAAW,IAAM,EAAK,EAAE,OAAS,EAAE,OACjE,EAAK,GAAM,EAAE,EAAE,GAAK,GAAS,GAAM,EAAc,IAAT,EAAE,EAAE,IAAY,EAAI,GAAI,EAAK,GAAM,EAAE,EAAE,GAAK,GAAS,GAAM,EAAc,IAAT,EAAE,EAAE,IAAY,EAAI,GAChI,EAAK,EAAK,EAAI,EAAI,GAClB,EAAK,EAAK,EAAI,EAAI,GAA8B,IAAxB,KAAK,IAAQ,GAAJ,EAAU,GAAW,EAAM,IAAM,EAAI,GACtE,IAAI,EAAM,EAAE,GAAK,EAAI,GAAW,IAAN,EAAE,EAAU,EAAI,GAAM,GAAM,GAAM,IAAM,EAAI,GAAM,GAAM,EAClF,EAAE,EAAE,aAAa,YAAa,aAAe,EAAE,GAAM,IAAM,EAAE,GAAM,YAAc,EAAE,GAAO,WAAa,EAAG,QAAQ,GAAK,eAAzF,eAC9B,EAAE,EAAE,aAAa,WAAY,EAAU,IAAJ,IAAY,EAAI,IAAK,QAAQ,IAChE,IAAI,EAAK,EAAc,IAAR,EAAE,IAAY,MAAQ,EAAI,EAAiB,EAAX,EAAE,SACjD,EAAQ,GAAG,MAAM,QAAU,QAAU,EAAE,EAAK,EAAI,KAAO,SAAW,GAAG,EAAK,EAAK,GAAK,GAAM,EAAI,KAAO,aAAe,EAAG,QAAQ,GAAK,UAAY,EAAE,EAAE,GAAG,GACzJ,GAEA,IAAI,EAAK,KAAK,IAAI,EAAQ,EAAE,KAAM,MAClC,EAAK,aAAa,UAAW,EAAc,EAAR,EAAE,KAAS,QAAQ,IACtD,EAAK,aAAa,YAAa,6BAA6C,EAAK,GAAG,QAAQ,GAAK,KACjG,EAAQ,aAAa,IA5KzB,SAAkB,EAAG,GAEnB,IADA,IAAY,EAAM,GACT,EAAI,EAAG,EADR,GACe,IAAK,CAC1B,IAAI,EAAI,EAFF,GAEU,KAAK,GAAK,EACtB,EAAK,GAAK,EAAI,KAAQ,KAAK,IAAI,EAAI,EAAQ,IAAJ,GAAW,KAAQ,KAAK,IAAI,EAAI,EAAQ,GAAJ,GAAW,IAAO,KAAK,IAAI,EAAI,EAAQ,GAAJ,IAClH,EAAI,KAAK,CAAC,KAAK,IAAI,GAAK,EAAI,KAAK,IAAI,GAAK,GAC5C,CACA,IAAI,EAAI,EAAM,EAAI,IAAQ,EAAI,GAAI,IAAM,EAAI,IAAM,EAAE,EAAE,IAAM,IAAM,EAAE,EAAE,IACtE,IAAK,EAAI,EAAG,EAPJ,GAOW,IACjB,EAAI,EAAM,EAAI,GAAI,GAAK,EAAI,GARrB,IAQ8B,IACpC,GAAK,IAAM,EAAE,EAAI,GAAG,IAAM,IAAM,EAAE,EAAI,GAAG,IAAM,IAAM,EAAE,EAAE,IAAM,IAAM,EAAE,EAAE,IAE3E,OAAO,EAAI,GACb,CA+J8B,CA3S8C,GA2SjC,IACvC,EAAK,aAAa,WAAoB,GAAR,EAAE,KAAW,QAAQ,IACnD,EAAM,QAAQ,SAAU,EAAG,GACzB,IAAI,GAAS,GAAJ,EAAc,GAAJ,GAAW,EAC9B,EAAE,aAAa,IAAK,GA/SkD,GA+StC,IAAJ,GAAW,IACvC,EAAE,aAAa,WAAsB,IAAT,EAAI,GAAW,EAAE,MAAM,QAAQ,GAC7D,GAGA,EAAM,QAAQ,SAAU,EAAG,GACzB,IAAI,EAAK,EAAgB,IAAV,EAAE,MAAkB,IAAJ,GAE/B,GADA,EAAE,KAAK,aAAa,WAAY,EAAE,MAAQ,IAAO,GAAM,KAAK,IAAQ,EAAJ,EAAQ,KAAK,QAAQ,IACjF,GAAM,EAIR,OAHA,EAAE,KAAK,aAAa,IAAK,IACzB,EAAE,KAAK,GAAG,aAAa,UAAW,QAClC,EAAE,KAAK,GAAG,aAAa,UAAW,GAGpC,IAAI,EAAK,EAAE,IAAI,GAAK,EAAI,EAAK,EAAE,IAAI,GAAK,EAAI,EAAI,KAAK,MAAM,EAAI,GAAK,EAAK,EAAK,EAAG,EAAK,EAAK,EACvF,EAAK,CAAC,EAAU,KAAL,EAAmB,EAAU,KAAL,GACnC,EAAK,CAAC,EAAE,IAAI,GAAK,GAAM,EAAK,EAAE,EAAI,GAAI,EAAE,IAAI,GAAK,GAAM,EAAK,EAAE,EAAI,IAClE,EAAO,EAAI,EAAI,IAAM,GAAI,EAAK,EAAE,EAAG,GAAK,EAAG,IAAM,EAAI,EAAK,GAAO,EAAG,GAAK,EAAG,IAAM,EAAI,EAAK,GAC3F,EAAK,EAAM,EAAI,EAAI,GAAK,EAAK,EAAM,EAAI,EAAM,EAAI,EAAI,GAAK,GAC9D,EAAE,KAAK,aAAa,IAAK,IAAM,EAAE,EAAG,IAAM,IAAM,EAAE,EAAG,IAAM,IAAM,EAAE,EAAG,IAAM,IAAM,EAAE,EAAG,IAAM,IAAM,EAAE,EAAG,IAAM,IAAM,EAAE,EAAG,KACzH,EAAE,KAAK,aAAa,UAAW,OAC/B,EAAE,KAAK,QAAQ,SAAU,EAAG,GAC1B,IAAI,GAAS,IAAJ,EAAe,IAAJ,EAAe,GAAJ,GAAW,EACtC,EAAI,IAAG,EAAI,EAAI,GACnB,IAAI,EAAI,EAAM,EAAM,EAAI,EAAI,GAAI,EAAM,EAAI,EAAI,GAAI,GAClD,EAAE,aAAa,KAAM,EAAE,EAAE,KACzB,EAAE,aAAa,KAAM,EAAE,EAAE,KACzB,EAAE,aAAa,WAAY,KAAK,IAAI,KAAK,GAAK,GAAK,EAAE,MAAQ,GAAM,EAAI,EAAI,IAAI,QAAQ,GACzF,EACF,GACA,EAAO,aAAa,oBAAqB,EAAO,IAAJ,GAC9C,CAeA,SAAS,GAAU,GACjB,IAAI,EAAI,EAAI,IAAO,EAAI,EAAI,IAAO,EAAI,EACtC,GAAI,IAAM,GAAV,CACA,GAAM,EACN,IAAK,IAAI,EAAI,EAAG,EAAI,EAAG,IACrB,EAAQ,GAAG,UAAU,OAAO,YAAa,IAAM,EAH5B,CAKvB,CA4EF,CAEA,CAAM,EApb2C,CAuDjD,SAAS,EAAM,GAAK,OAAO,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,CAAG,CACtD,SAAS,EAAK,EAAG,EAAG,GAAK,OAAO,GAAK,EAAI,GAAK,CAAG,CACjD,SAAS,EAAM,EAAG,EAAG,GAAK,MAAO,CAAC,EAAK,EAAE,GAAI,EAAE,GAAI,GAAI,EAAK,EAAE,GAAI,EAAE,GAAI,GAAK,CAC7E,SAAS,EAAE,GAAK,OAAO,KAAK,MAAU,GAAJ,GAAU,EAAI,CAChD,SAAS,EAAQ,GAAuB,OAAO,EAAI,KAA7B,EAAI,EAAM,GAAK,GAAwB,EAAI,EAAI,IAAM,EAAI,CAAG,CAClF,SAAS,EAAI,EAAK,EAAO,GACvB,IAAI,EAAI,SAAS,gBA5DV,6BA4D8B,GACrC,IAAK,IAAI,KAAK,EAAO,EAAE,aAAa,EAAG,EAAM,IAE7C,OADI,GAAQ,EAAO,YAAY,GACxB,CACT,CACA,SAAS,EAAI,EAAK,EAAQ,GACxB,IAAI,EAAI,SAAS,cAAc,OAI/B,OAHA,EAAE,UAAY,EACV,IAAM,EAAE,YAAc,GAC1B,EAAO,YAAY,GACZ,CACT,CAEA,SAAS,EAAI,EAAG,GAAyC,OAAO,GAAK,EAAI,KAApD,EAAe,MAAP,EAAgB,YAAyC,GAAK,UAAY,CAwBvG,SAAS,EAAU,EAAG,GACpB,IAAI,EAAI,EAAM,GAAG,EAAG,EAAI,EAAM,GAAG,EAAG,EAAI,CAAC,EAAK,GAAK,IAAK,KAAO,EAAG,EAAK,GAAK,GAAI,IAAM,GACtF,SAAS,EAAI,EAAG,EAAG,EAAG,GACpB,IAAI,EAAI,EAAM,EAAG,EAAG,GAAI,EAAK,EAAE,GAAK,EAAE,GAAI,EAAK,EAAE,GAAK,EAAE,GAAI,EAAI,KAAK,MAAM,EAAI,IAAO,EAAG,EAAI,GAAK,EAAG,GACrG,MAAO,CAAC,EAAE,GAAK,EAAK,EAAI,EAAG,EAAE,GAAK,EAAK,EAAI,EAC7C,CACA,MAAO,CAAC,EAAG,EAAI,EAAG,EAAG,IAAM,IAAK,EAAG,EAAI,EAAG,EAAG,IAAM,IAAK,EAC1D,CAIA,SAAS,EAAK,EAAG,EAAG,GAClB,IAAK,EAAG,MAAO,IAAM,EACrB,IAAI,EAAI,KAAK,MAAM,EAAE,GAAK,EAAE,GAAI,EAAE,GAAK,EAAE,IAAK,GAAM,EAAE,GAAK,EAAE,IAAM,EAAG,GAAM,EAAE,GAAK,EAAE,IAAM,EACvF,GAAM,EAAE,GAAK,EAAE,IAAM,EAAG,GAAM,EAAE,GAAK,EAAE,IAAM,EAAG,EAAK,EAAK,EAAG,GAAM,EAAK,EAC5E,SAAS,EAAG,EAAI,GAAM,OAAO,EAAE,EAAK,EAAK,EAAK,EAAK,GAAM,IAAM,EAAE,EAAK,EAAK,EAAK,EAAK,EAAK,CAE1F,IADA,IAAI,EAAI,IAAM,EAAG,EAAI,GAAG,GAAI,EAAI,GAAG,IAC1B,EAAI,EAAG,EAAI,EAAI,OAAQ,IAAK,CACnC,IAAI,EAAI,EAAI,GACZ,GAAK,IAAM,EAAG,EAAE,GAAI,EAAE,IAAM,IAAM,EAAG,EAAE,GAAI,EAAE,IAAM,IAAM,EAAG,EAAE,GAAI,EAAE,GACtE,CACA,OAAO,EAAI,IAAM,CACnB,CACA,SAAS,EAAU,EAAG,GACpB,SAAS,EAAI,EAAG,EAAG,GAAK,OAAO,EAAI,IAAM,EAAI,IAAM,EAAI,UAAY,EAAI,IAAM,EAAI,EAAI,CACrF,MAAO,IAAM,EAAE,GAAK,KAAO,EAAK,CAAC,EAAE,GAAI,GAAI,CAAC,EAAK,EAAE,GAAI,GAAI,EAAE,IAAM,EAAI,EAAE,GAAI,EAAI,EAAE,IACjF,EAAK,CAAC,EAAI,EAAE,IAAK,CAAC,EAAI,EAAK,EAAE,IAAK,EAAE,IAAM,EAAI,EAAE,GAAI,EAAK,EAAE,GAAI,GAC/D,EAAK,CAAC,EAAK,EAAE,GAAI,GAAK,CAAC,EAAE,GAAI,GAAK,EAAE,IAAM,EAAI,EAAE,GAAI,EAAG,EAAK,EAAE,IAC9D,EAAK,CAAC,EAAG,EAAK,EAAE,IAAK,CAAC,EAAG,EAAE,IAAK,EAAE,IAAM,EAAI,EAAE,GAAI,EAAE,GAAI,GAAK,GACjE,CAsTF,CAKA,SAAS,KAKP,SAAS,EAAU,GACjB,EAAK,iBAAiB,cAAc,QAAQ,SAAU,GACpD,IAAI,EAAO,EAAE,cAAc,QACvB,EAAQ,EAAE,iBAAiB,iBAC3B,EAAO,EAAE,cAAc,sBACvB,GAAO,EAAE,aAAa,aAAe,EAAG,GAAM,EAAE,aAAa,YAAc,EAC3E,EAAM,IAAS,EAAE,aAAa,aAAe,GAAK,EAClD,EAAK,EACT,EAAM,QAAQ,SAAU,GAAK,EAAK,KAAK,IAAI,EAAI,EAAE,wBAA0B,GACtE,EAAM,SAAQ,GAAM,EAAK,aAAa,SAAiB,EAAN,GACtD,IAAI,EAAI,KAAK,KAAW,EAAN,EAAU,EAAK,EAAM,GAAK,GAAM,EAAE,aAAa,UAAW,EAAO,EAAE,aAAa,YAC9F,EAAa,QAAT,EAAiB,EAAK,EAAa,WAAT,EAAoB,EAAK,EAAI,EAAI,EAC/D,EAAK,GAAK,EAAK,aAAa,KAChC,EAAK,aAAa,IAAK,GACvB,EAAK,aAAa,QAAS,GAC3B,IAAI,GAAM,EAAK,aAAa,OAAQ,EAAK,aAAa,UAAY,EAC9D,GAAM,EAAK,aAAa,YAAa,cAAgB,EAAI,GAAO,IAAM,EAAK,KAC/E,EAAM,QAAQ,SAAU,GAAK,EAAE,aAAa,IAAK,EAAI,EAAM,EAAK,EAAM,GAEjE,EAAM,QAAQ,EAAE,iBAAiB,mBAAmB,QAAQ,SAAU,GAAK,EAAE,aAAa,MAAO,EAAE,aAAa,MAAQ,EAAK,EACpI,GAEA,IAAI,EAAK,EAAK,cAAc,iBAAkB,EAAQ,EAAK,cAAc,mBACrE,GAAM,GAAO,EAAM,aAAa,YAAa,eAAiB,EAAG,aAAa,KAAO,GAAK,MAAQ,EAAG,aAAa,OAAQ,EAAG,aAAa,WAAa,IAC7J,CA5BK,OAAO,MAAS,OAAO,gBAiG5B,KAAK,eAAe,eACpB,SAAS,iBAAiB,iBAAiB,QAAS,IAC9C,EAAK,aAAa,sBAAwB,EAAK,cAAc,eACjE,EAAK,aAAa,oBAAqB,IAtEzC,SAAe,GACb,IAAI,EAAS,OAAO,WAAW,oCAAoC,QASnE,GARA,EAAU,GACN,SAAS,OAAS,SAAS,MAAM,OAAO,SAAS,MAAM,MAAM,KAAK,WAAc,EAAU,EAAO,GAGrG,IAAI,qBAAqB,SAAU,GACjC,EAAK,UAAU,OAAO,UAAW,EAAG,GAAG,eACzC,EAAG,CAAE,WAAY,SAAU,QAAQ,IAE/B,EAAJ,CAGA,KAAK,IAAI,EAAK,iBAAiB,gBAAiB,CAAE,UAAW,IAC7D,cAAc,MAAM,EAAK,iBAAiB,gBAAiB,CACzD,MAAO,UACP,MAAM,EACN,QAAS,SAAU,GACjB,KAAK,OAAO,EAAO,CAAE,EAAG,GAAI,UAAW,GAAK,CAAE,EAAG,EAAG,UAAW,EAAG,SAAU,GAAK,KAAM,aAAc,QAAS,IAAM,WAAW,GACjI,IAYF,IAAI,EAAK,EAAK,cAAc,kBAC5B,GAAI,EAAI,CACN,IAAI,EAAQ,EAAG,iBAAiB,cAC5B,EAAS,EAAG,iBAAiB,eAC7B,EAAM,KAAK,SAAS,CAAE,QAAS,EAAG,QAAQ,IAC9C,EAAG,iBAAiB,aAAa,QAAQ,SAAU,EAAK,GACtD,IAAI,EAAI,GAAU,IAAJ,EACd,EAAI,OAAO,EAAM,GAAI,CAAE,iBAAkB,GAAK,CAAE,iBAAkB,EAAG,SAAU,GAAK,KAAM,gBAAkB,GACzG,OAAO,EAAI,cAAc,YAAa,CAAE,MAAO,EAAG,gBAAiB,WAAa,CAAE,MAAO,EAAG,SAAU,GAAK,KAAM,iBAAmB,EAAI,IACxI,OAAO,EAAI,cAAc,eAAgB,CAAE,MAAO,EAAG,gBAAiB,WAAa,CAAE,MAAO,EAAG,SAAU,IAAM,KAAM,eAAiB,EAAI,KAC1I,OAAO,EAAO,GAAI,CAAE,UAAW,EAAG,EAAG,GAAK,CAAE,UAAW,EAAG,EAAG,EAAG,SAAU,IAAM,KAAM,cAAgB,EAAI,KAC1G,GAAG,EAAO,GAAI,CAAE,UAAW,EAAG,GAAI,EAAG,SAAU,GAAK,KAAM,aAAe,EAAI,IAClF,GACA,EAAI,GAAG,EAAG,iBAAiB,qCAAsC,CAAE,UAAW,EAAG,SAAU,IAAO,GAC/F,GAAG,CAAC,EAAG,CAAE,SAAU,KACtB,EAAY,EAAI,EAClB,CAIA,IAAI,EAAK,EAAK,cAAc,kBAC5B,GAAI,EAAI,CACN,IAAI,EAAK,EAAG,cAAc,YAAa,EAAS,EAAG,cAAc,gBAC7D,EAAK,EAAG,cAAc,YAAa,EAAQ,EAAG,cAAc,eAAgB,EAAO,EAAG,cAAc,cACpG,EAAM,KAAK,SAAS,CAAE,QAAS,EAAG,QAAQ,IAC9C,EAAI,OAAO,EAAM,CAAE,MAAO,EAAG,gBAAiB,WAAa,CAAE,MAAO,IAAM,SAAU,IAAM,MAAM,EAAM,OAAQ,GAAK,IAChH,OAAO,EAAI,CAAE,UAAW,EAAG,EAAG,IAAM,CAAE,UAAW,EAAG,EAAG,EAAG,SAAU,IAAM,KAAM,iBAAmB,IACnG,OAAO,EAAQ,CAAE,UAAW,EAAG,MAAO,GAAK,gBAAiB,YAAc,CAAE,UAAW,EAAG,MAAO,EAAG,SAAU,IAAO,KACrH,GAAG,EAAQ,CAAE,UAAW,EAAG,SAAU,IAAO,KAC5C,OAAO,EAAI,CAAE,UAAW,EAAG,EAAG,IAAM,CAAE,UAAW,EAAG,EAAG,EAAG,SAAU,IAAM,KAAM,iBAAmB,MAClG,GAAO,EAAI,OAAO,EAAO,CAAE,MAAO,EAAG,gBAAiB,WAAa,CAAE,MAAO,EAAG,SAAU,IAAM,KAAM,eAAiB,KAC1H,EAAI,GAAG,EAAQ,CAAC,EAAI,EAAI,GAAS,CAAC,EAAI,GAAK,CAAE,UAAW,EAAG,SAAU,IAAO,KACzE,GAAG,CAAC,EAAG,CAAE,SAAU,KACtB,EAAY,EAAI,EAClB,CAvDkB,CAalB,SAAS,EAAY,EAAI,GACvB,cAAc,OAAO,CACnB,QAAS,EAAI,MAAO,aAAc,IAAK,aACvC,SAAU,SAAU,GAAQ,EAAK,SAAW,EAAG,OAAS,EAAG,OAAS,GAExE,CAsCF,CAKE,CAAM,MAEV,CAMA,SAAS,KACP,IAAI,EACI,sKADJ,EAEK,wMAFL,EAGM,8NAHN,EAIK,kRAJL,EAKK,kPALL,EAMI,2MANJ,EAOK,iKAIT,SAAS,EAAI,GAEX,OADA,EAAI,SAAS,GAAK,KAAK,IAAI,EAAG,KAAK,MAAM,IAAM,EACxC,KAAK,MAAM,EAAI,IAAM,IAAM,OAAO,EAAI,IAAI,SAAS,EAAG,IAC/D,CAEA,SAAS,EAAM,GACb,IAAI,EAAM,EAAK,aAAa,YAC5B,GAAK,EAAL,CACA,IAGI,EAAK,EAAQ,EAAO,EAAM,EAAM,EAAK,EAAQ,EAAM,EAAM,EAAS,EAAS,EAAW,EAHtF,EAAS,EAAK,aAAa,gBAAkB,GAC7C,EAAQ,EAAK,aAAa,eAAiB,QAC3C,EAAS,OAAO,WAAW,oCAAoC,QAE/D,GAAY,EAAO,GAAO,EA0P9B,EAAK,iBAAiB,QA3CtB,WACM,IACJ,GAAO,EACF,GAAK,IACN,OAAO,OAAO,OAAO,MAAM,OAC/B,EAAI,YACJ,EAAK,UAAU,IAAI,aACnB,sBAAsB,WAAc,EAAI,UAAU,IAAI,UAAY,GAClE,GAAK,EAAO,WACV,GAAO,EACH,OAAO,MAAM,KAAK,IAAI,EAAQ,CAAE,WAAY,cAC5C,EAAM,QAAO,EAAM,YAAc,GACrC,EAAM,OAAO,MAAM,WAAc,EAAO,aAAa,cAAe,SAAW,EACjF,GACA,EAAI,cAAc,oBAAoB,MAAM,CAAE,eAAe,IAC/D,EAnOgB,CAOhB,SAAS,IAuCP,SAAS,EAAO,GACd,EAAO,aAAa,cAAe,GACnC,IAAI,EAAgB,YAAN,GAAyB,YAAN,EACjC,EAAQ,aAAa,aAAc,EAAU,WAAa,YAC1D,EAAI,cAAc,kBAAkB,aAAa,aAAoB,UAAN,EAAgB,mBAAqB,YAC1F,YAAN,GAAiB,GACvB,CAyCA,SAAS,IAAa,GAAY,EAAO,EAAO,UAAU,OAAO,eAAiB,EArFlF,EAAM,SAAS,cAAc,WACzB,UAAY,YAChB,EAAI,aAAa,aAAc,GAC/B,EAAI,UACF,wGAC8E,EAD9E,oIAIC,EAAS,6CAA+C,EAAS,KAAO,IAJzE,0FAM0B,EAAY,iCAAmC,EANzE,+MAU0B,EAAY,gCAAkC,EAVxE,khBAiB2B,EAAa,gCAAkC,EAjB1E,4GAkB8F,EAlB9F,8BAoBF,EAAS,EAAI,cAAc,qBAC3B,EAAQ,EAAI,cAAc,SAC1B,EAAO,EAAI,cAAc,mBACzB,EAAO,EAAI,cAAc,mBACzB,EAAM,EAAI,cAAc,kBACxB,EAAS,EAAI,cAAc,qBAC3B,EAAO,EAAI,cAAc,kBACzB,EAAO,EAAI,cAAc,kBACzB,EAAU,EAAI,cAAc,qBAC5B,EAAU,EAAI,cAAc,qBACxB,IAAQ,EAAM,OAAS,GAC3B,EAAM,IAAM,EAUZ,EAAM,iBAAiB,OAAQ,WAAc,EAAO,WAuGpD,qBAAqB,GACrB,SAAU,IACR,IACK,EAAM,QAAW,EAAM,QAAO,EAAM,sBAAsB,GAChE,CAHD,EAxGwE,GACxE,EAAM,iBAAiB,UAAW,WAAc,EAAO,WAAY,GAAY,GAC/E,EAAM,iBAAiB,UAAW,WAAmB,EAAM,QAAQ,EAAO,UAAY,GACtF,EAAM,iBAAiB,QAAS,WAAmB,EAAM,OAAO,EAAO,UAAW,qBAAqB,GAAM,GAAU,GACvH,EAAM,iBAAiB,QAAS,WAAc,EAAO,SAAU,qBAAqB,GAAM,GAAU,GACpG,EAAM,iBAAiB,iBAAkB,WACvC,EAAK,YAAc,EAAI,EAAM,UAC7B,EAAK,aAAa,gBAAiB,KAAK,MAAM,EAAM,WACpD,GACF,GACA,EAAM,iBAAiB,aAAc,GACrC,EAAM,iBAAiB,WAAY,GACnC,EAAM,iBAAiB,eAAgB,WACrC,EAAO,gBAAgB,aAAc,EAAM,OAC3C,EAAQ,aAAa,aAAc,EAAM,MAAQ,aAAe,aAClE,GAGA,EAAO,iBAAiB,QAAS,SAAU,GACzC,IAAI,EAAM,EAAE,OAAO,QAAQ,UACvB,GAAwC,SAAjC,EAAI,aAAa,YAA0B,EAAM,OAAS,EAAM,MACvE,GAAwC,SAAjC,EAAI,aAAa,YAA0B,IAClD,EAAE,OAAO,QAAQ,qBACjB,GAAQ,EAAE,OAAO,QAAQ,mBAAmB,GAClD,GACA,EAAO,iBAAiB,WAAY,SAAU,GACvC,EAAE,OAAO,QAAQ,mBAAmB,GAC3C,GACA,CAAC,cAAe,cAAe,WAAW,QAAQ,SAAU,GAC1D,EAAO,iBAAiB,EAAM,WAAc,IAAgB,GAAY,EAC1E,GAGA,EAAK,iBAAiB,cAAe,SAAU,GAC7C,GAAY,EACZ,EAAK,kBAAkB,EAAE,WACzB,EAAO,UAAU,IAAI,gBACrB,EAAO,EAAK,EAAE,SAChB,GACA,EAAK,iBAAiB,cAAe,SAAU,GAAS,GAAW,EAAO,EAAK,EAAE,SAAW,GAE5F,EAAK,iBAAiB,YAAa,GACnC,EAAK,iBAAiB,gBAAiB,GACvC,EAAK,iBAAiB,UAAW,SAAU,GACzC,IAAI,EAAI,EAAE,IACV,GAAU,cAAN,GAA2B,cAAN,EAAmB,GAAM,QAC7C,GAAU,eAAN,GAA4B,YAAN,EAAiB,EAAK,QAChD,GAAU,SAAN,EAAc,EAAM,YAAc,MACtC,IAAU,QAAN,EACJ,OADiB,EAAM,YAAc,EAAM,UAAY,CACjD,CACX,EAAE,iBACF,EAAE,iBACJ,GAGA,EAAI,iBAAiB,UAAW,SAAU,GACxC,IAAI,EAAE,OAAO,QAAQ,WAAwB,MAAV,EAAE,KAAyB,UAAV,EAAE,IAAtD,CACA,IAAI,EAAI,EAAE,IAAI,cACd,GAAU,MAAN,GAAmB,MAAN,EAAW,SACvB,GAAU,cAAN,EAAmB,GAAM,QAC7B,GAAU,eAAN,EAAoB,EAAK,QAC7B,GAAU,MAAN,EAAW,EAAM,OAAS,EAAM,UACpC,IAAU,MAAN,EACJ,OADe,GACT,CACX,EAAE,iBACF,IACA,GAV8E,CAWhF,GAEA,EAAI,cAAc,oBAAoB,iBAAiB,QAAS,GAChE,EAAI,iBAAiB,QAAS,SAAU,IAAS,EAAE,SAAW,GAAO,EAAE,OAAO,UAAU,SAAS,oBAAmB,GAAS,GAE7H,EAAI,iBAAiB,SAAU,SAAU,GAAK,EAAE,iBAAkB,GAAS,GAC3E,SAAS,KAAK,YAAY,EAC5B,CAEA,SAAS,EAAK,GACZ,IA1IW,EA0IP,EAAI,EAAK,wBACb,OA3IW,GA2IG,EAAI,EAAE,MAAQ,EAAE,OA3IH,EAAI,EAAI,EAAI,EAAI,EAAI,CA4IjD,CACA,SAAS,EAAO,GACT,EAAM,WACX,EAAM,YAAc,EAAI,EAAM,SAC9B,IACF,CACA,SAAS,EAAK,GACP,EAAM,WACX,EAAM,YAAc,KAAK,IAAI,EAAM,SAAU,KAAK,IAAI,EAAG,EAAM,YAAc,IAC7E,IACF,CACA,SAAS,IACP,IAAI,EAAI,EAAM,UAAY,EAAG,EAAI,EAAM,aAAe,EAAG,EAAI,EAAI,EAAI,EAAI,EACzE,EAAK,MAAM,UAAY,UAAY,EAAI,IACvC,EAAO,MAAM,KAAY,IAAJ,EAAW,IAChC,EAAK,YAAc,EAAI,GACvB,EAAK,aAAa,gBAAiB,KAAK,MAAM,IAC9C,EAAK,aAAa,iBAAkB,EAAI,GAAK,QAAU,EAAI,GAC7D,CACA,SAAS,IACF,EAAM,UAAa,EAAM,SAAS,SACvC,EAAI,MAAM,UAAY,UAAa,EAAM,SAAS,IAAI,EAAM,SAAS,OAAS,GAAK,EAAM,SAAY,IACvG,CAQA,SAAS,IACH,EAAM,QAAU,EAAM,MACxB,EAAM,OAAO,MAAM,WAAc,EAAO,aAAa,cAAe,SAAW,GAE/E,EAAM,OAEV,CACA,SAAS,IACP,aAAa,GACb,EAAO,UAAU,OAAO,UAC1B,CACA,SAAS,IACP,aAAa,GACT,EAAM,QAAU,IAEpB,EAAY,WAAW,WACrB,IAAI,EAAI,SAAS,cACb,EAAgB,GAAK,EAAO,SAAS,IAAM,EAAE,QAAQ,kBACpD,EAAM,QAAW,GAAc,GAAe,EAAO,UAAU,IAAI,UAC1E,EAAG,MACL,CAGA,SAAS,IAAW,OAAO,SAAS,oBAAsB,GAAU,SAAS,0BAA4B,CAAQ,CACjH,SAAS,IACH,KACD,SAAS,gBAAkB,SAAS,sBAAsB,KAAK,UACvD,EAAO,kBAChB,EAAO,oBACE,EAAO,wBAChB,EAAO,0BACE,EAAM,uBACf,EAAM,uBAEV,CAGA,SAAS,EAAK,EAAQ,GACpB,IAAI,EAAI,EAAK,wBAAyB,EAAI,EAAO,wBAC7C,EAAO,CAAE,EAAG,EAAE,KAAO,EAAE,KAAM,EAAG,EAAE,IAAM,EAAE,IAAK,OAAQ,EAAE,MAAQ,EAAE,MAAO,OAAQ,EAAE,OAAS,EAAE,QAC/F,EAAM,CAAE,EAAG,EAAG,EAAG,EAAG,OAAQ,EAAG,OAAQ,IACvC,GAAW,OAAO,KACtB,KAAK,OAAO,EAAQ,EAAS,EAAM,EAAM,OAAO,OAAO,CAAC,EAAG,EAAS,EAAO,EAAK,CAC9E,SAAU,EAAS,GAAM,IACzB,KAAM,EAAS,eAAiB,WAChC,gBAAiB,MACjB,WAAY,KALgB,GAOhC,CAmBA,SAAS,IACP,IAAI,GAAS,GAAQ,EAAI,KAAzB,CACA,GAAO,EACP,EAAM,QACN,aAAa,GACb,IAAI,EAAS,WACX,EAAI,UAAU,OAAO,WACrB,EAAI,QACA,OAAO,MAAM,KAAK,IAAI,EAAQ,CAAE,WAAY,cAChD,EAAK,UAAU,OAAO,aAClB,OAAO,OAAO,OAAO,MAAM,QAC/B,EAAK,MAAM,CAAE,eAAe,IAC5B,GAAO,CACT,EACI,EAAK,WACP,EAAI,UAAU,OAAO,WACrB,GAAK,EAAM,EACb,EACI,MACD,SAAS,gBAAkB,SAAS,sBAAsB,KAAK,UAChE,WAAW,EAAI,MAEf,GArBmC,CAuBvC,CAGF,CACA,SAAS,iBAAiB,mBAAmB,QAAS,IAChD,EAAK,aAAa,wBAA0B,EAAK,QAAQ,eAC7D,EAAK,aAAa,sBAAuB,IACzC,EAAM,KAEV,CAMA,SAAS,KACP,SAAS,iBAAiB,eAAe,QAAS,IAChD,GAAI,EAAK,aAAa,oBAAsB,EAAK,QAAQ,aAAc,OACvE,EAAK,aAAa,kBAAmB,IACrC,MAAM,EAAQ,IAAI,EAAK,iBAAiB,eAElC,EAAU,CAAC,EAAM,EAAM,KAC3B,MAAM,EAAM,EAAK,cAAc,iBAC/B,EAAK,UAAU,OAAO,UAAW,GAC7B,GAAK,EAAI,aAAa,gBAAiB,EAAO,OAAS,SACvD,GAAQ,GACV,WAAW,KACT,MAAM,EAAQ,EAAK,cAAc,eAC7B,GAAO,EAAM,SAChB,MAIP,EAAM,QAAS,IACb,MAAM,EAAM,EAAK,cAAc,iBACzB,EAAO,EAAK,cAAc,cAC3B,IACL,EAAI,aAAa,gBAAiB,SAC9B,GAAQ,EAAK,IAAI,EAAI,aAAa,gBAAiB,EAAK,IAC5D,EAAI,iBAAiB,QAAU,IAC7B,MAAM,GAAQ,EAAK,UAAU,SAAS,WACtC,EAAM,QAAS,IACT,IAAM,GAAM,EAAQ,GAAG,KAG7B,EAAQ,EAAM,EAAM,GAAqB,IAAb,EAAE,aAIlC,SAAS,iBAAiB,QAAU,IAC7B,EAAE,OAAO,QAAQ,eAAe,EAAM,QAAS,GAAM,EAAQ,GAAG,MAEvE,SAAS,iBAAiB,UAAY,IACpC,GAAc,WAAV,EAAE,IAAkB,OACxB,MAAM,EAAO,EAAK,cAAc,sBAC3B,IACL,EAAQ,GAAM,GACd,EAAK,cAAc,iBAAiB,YAG1C,CAjpCA,CAAC,cAAe,YAAa,YAAa,cAAc,QAAS,IAC/D,SAAS,iBAAiB,EAAO,IAC3B,EAAE,YAAW,GAAqB,IACrC,CAAE,SAAS,MAupChB,MAAM,GAAS,CAAC,EAAI,IAAK,EAAI,KAAK,EAAI,IAAI,WAAa,CAAC,IAAI,KAAK,KAAO,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAK,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAK,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CA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","file":"/gh/OZO-Verbindzorg/ozo-scripts@1.9.23/main.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.48.0.\n * Original file: /gh/OZO-Verbindzorg/ozo-scripts@1.9.23/main.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","// OZOverbindzorg — main.js\n// Alle maatwerkcode van ozoverbindzorg.nl in één bestand (vervangt Slater-project 9398).\n// - Elk onderdeel start alleen als zijn element op de pagina staat.\n// - Bibliotheken die maar op een paar pagina's nodig zijn (Swiper, Finsweet, Vimeo) laden alleen daar.\n// - GSAP, ScrollTrigger en Observer komen van Webflow zelf (Site settings → GSAP).\n(function () {\n  'use strict';\n\n  // ---------- Hulpfuncties ----------\n\n  const LIBS = {\n    lenis: 'https://cdn.jsdelivr.net/npm/lenis@1.1.1/dist/lenis.min.js',\n    swiper: 'https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js',\n    fsAccordion: 'https://cdn.jsdelivr.net/npm/@finsweet/attributes-accordion@1/accordion.js',\n    fsNumbercount: 'https://cdn.jsdelivr.net/npm/@finsweet/attributes-numbercount@1/numbercount.js',\n    fsFormsubmit: 'https://cdn.jsdelivr.net/npm/@finsweet/attributes-formsubmit@1/formsubmit.js',\n    splitText: 'https://cdn.jsdelivr.net/npm/gsap@3.15.0/dist/SplitText.min.js',\n    draggable: 'https://cdn.jsdelivr.net/npm/gsap@3.15.0/dist/Draggable.min.js',\n    inertia: 'https://cdn.jsdelivr.net/npm/gsap@3.15.0/dist/InertiaPlugin.min.js'\n  };\n\n  // Laadt een extern script één keer; geeft een Promise terug\n  const loadedScripts = {};\n\n  function loadScript(src) {\n    if (!loadedScripts[src]) {\n      loadedScripts[src] = new Promise((resolve, reject) => {\n        const script = document.createElement('script');\n        script.src = src;\n        script.async = true;\n        script.onload = resolve;\n        script.onerror = reject;\n        document.head.appendChild(script);\n      });\n    }\n    return loadedScripts[src];\n  }\n\n  // ---------- Hele site ----------\n\n  // Smooth scroll, gekoppeld aan ScrollTrigger\n  function initLenis() {\n    if (!window.gsap || !window.ScrollTrigger) return;\n    loadScript(LIBS.lenis).then(() => {\n      const lenis = new Lenis({\n        lerp: 0.1,\n        wheelMultiplier: 1,\n        gestureOrientation: 'vertical',\n        normalizeWheel: false,\n        smoothTouch: false\n      });\n      lenis.on('scroll', ScrollTrigger.update);\n      gsap.ticker.add((time) => {\n        lenis.raf(time * 1000);\n      });\n      gsap.ticker.lagSmoothing(0);\n      window.lenis = lenis;\n    });\n  }\n\n  // Huidig jaar in de footer: [copyright=\"year\"]\n  function initCopyrightYear() {\n    const year = String(new Date().getFullYear());\n    document.querySelectorAll('[copyright=\"year\"]').forEach((el) => {\n      el.textContent = year;\n    });\n  }\n\n  // Finsweet Attributes, alleen op pagina's die ze gebruiken\n  function initFinsweet() {\n    if (document.querySelector('[fs-accordion-element]')) loadScript(LIBS.fsAccordion);\n    if (document.querySelector('[fs-numbercount-element]')) loadScript(LIBS.fsNumbercount);\n    if (document.querySelector('[fs-formsubmit-element]')) loadScript(LIBS.fsFormsubmit);\n  }\n\n  // Freshchat (helpdesk-chat): pas laden bij de eerste interactie (scrollen, muis, toets, aanraking).\n  // Scheelt een zwaar script en cookies van derden bij het openen van elke pagina.\n  const FRESHCHAT = {\n    token: '89de7861-1a35-4cd5-92d4-c65af78e3c63',\n    host: 'https://ozoverbindzorg-help.freshchat.com'\n  };\n\n  function initFreshchat() {\n    const events = ['pointerdown', 'pointermove', 'keydown', 'touchstart', 'scroll', 'wheel'];\n    let started = false;\n    function start() {\n      if (started) return;\n      started = true;\n      events.forEach((type) => window.removeEventListener(type, start));\n      loadScript(FRESHCHAT.host + '/js/widget.js').then(() => {\n        if (window.fcWidget) window.fcWidget.init(FRESHCHAT);\n      });\n    }\n    events.forEach((type) => window.addEventListener(type, start, { passive: true }));\n  }\n\n  // ---------- Oude site (pagina's die nog niet vernieuwd zijn) ----------\n\n  // Floating labels: label krijgt .float zolang het veld focus of een waarde heeft\n  // (zelfde gedrag als CodeCrumbs floating-form-labels 0.1.1)\n  function initFloatLabels() {\n    document.querySelectorAll('.form_input').forEach((input) => {\n      const label = input.previousElementSibling;\n      if (!label) return;\n      input.addEventListener('focus', () => label.classList.add('float'));\n      input.addEventListener('blur', () => {\n        if (!input.value) label.classList.remove('float');\n      });\n    });\n  }\n\n  // Sliders (Swiper). Swiper wordt alleen geladen als er een slider op de pagina staat.\n  const SLIDERS = {\n    '#examples': {\n      slidesPerView: 'auto',\n      speed: 400,\n      spaceBetween: 12,\n      grabCursor: true,\n      keyboard: { enabled: true },\n      navigation: { nextEl: '.swiper-next', prevEl: '.swiper-prev' }\n    },\n    '#logos': {\n      slidesPerView: 'auto',\n      centeredSlides: true,\n      loop: true,\n      speed: 4000,\n      spaceBetween: 28,\n      simulateTouch: false,\n      allowTouchMove: false,\n      autoplay: { delay: 0, disableOnInteraction: false, pauseOnMouseEnter: false },\n      keyboard: { enabled: false }\n    },\n    '#reviews': {\n      slidesPerView: 3,\n      speed: 400,\n      spaceBetween: 28,\n      keyboard: { enabled: false },\n      breakpoints: {\n        320: { slidesPerView: 1.1, centeredSlides: false },\n        992: { allowTouchMove: false }\n      }\n    },\n    '#team': {\n      slidesPerView: 'auto',\n      speed: 400,\n      spaceBetween: 24,\n      grabCursor: true,\n      keyboard: { enabled: true },\n      navigation: { nextEl: '.swiper-next', prevEl: '.swiper-prev' }\n    }\n    // '#vacatures' (/werken-bij) was in Slater alleen gekoppeld aan vacature-detailpagina's, waar hij\n    // niet staat, en is dus nooit actief geweest. Aanzetten = deze config terugzetten:\n    // '#vacatures': {\n    //   slidesPerView: 'auto',\n    //   speed: 400,\n    //   spaceBetween: 24,\n    //   grabCursor: true,\n    //   keyboard: { enabled: true },\n    //   navigation: { nextEl: '.swiper-next', prevEl: '.swiper-prev' }\n    // }\n  };\n\n  function initSliders() {\n    const present = Object.keys(SLIDERS).filter((selector) => document.querySelector(selector));\n    if (!present.length) return;\n    loadScript(LIBS.swiper).then(() => {\n      // slideRole 'listitem': de Webflow-lijst (role=\"list\") houdt geldige lijst-items (toegankelijkheid)\n      present.forEach((selector) => new Swiper(selector, { a11y: { slideRole: 'listitem' }, ...SLIDERS[selector] }));\n    });\n  }\n\n  // Video's met eigen knoppen: #play-<id> en #pause-<id> bij <video id=\"<id>\">.\n  // De explainer-video (#explainer-video) gebruikt #play-video en #pause-video.\n  function initVideoButtons() {\n    const videos = [...document.querySelectorAll('video[id]')];\n    if (!videos.length) return;\n\n    const isExplainer = (video) => video.id === 'explainer-video';\n    const button = (kind, video) =>\n      document.getElementById(`${kind}-${video.id}`) ||\n      (isExplainer(video) ? document.getElementById(`${kind}-video`) : null);\n\n    // Pauzeren, dempen en (behalve de explainer) terug naar het begin\n    function stop(video) {\n      video.pause();\n      video.muted = true;\n      if (!isExplainer(video)) video.currentTime = 0;\n    }\n\n    // Stoppen + de eigen pauzeknop \"klikken\", zodat de Webflow-interactie (icoon) meekomt\n    function reset(video) {\n      stop(video);\n      const pauseButton = document.getElementById(`pause-${video.id}`);\n      if (pauseButton) pauseButton.click();\n    }\n\n    // Een gepauzeerde video hoeft niet te downloaden: bron weghalen tot er op play wordt geklikt.\n    // Alleen bij video's met een poster of die niet zichtbaar zijn, zodat er in beeld niets verandert.\n    function unload(video) {\n      const sources = video.querySelectorAll('source[src]');\n      if (!sources.length) return;\n      if (!video.getAttribute('poster') && video.getClientRects().length) return;\n      sources.forEach((source) => {\n        source.dataset.src = source.getAttribute('src');\n        source.removeAttribute('src');\n      });\n      video.removeAttribute('autoplay');\n      video.preload = 'none';\n      video.load();\n    }\n\n    function ensureLoaded(video) {\n      const pending = video.querySelectorAll('source[data-src]');\n      if (!pending.length) return;\n      pending.forEach((source) => {\n        source.setAttribute('src', source.dataset.src);\n        source.removeAttribute('data-src');\n      });\n      video.load();\n    }\n\n    videos.forEach(reset);\n    videos.forEach(unload);\n\n    videos.forEach((video) => {\n      const playButton = button('play', video);\n      const pauseButton = button('pause', video);\n      if (playButton) {\n        playButton.addEventListener('click', () => {\n          videos.forEach((other) => {\n            if (other !== video) reset(other);\n          });\n          ensureLoaded(video);\n          video.muted = false;\n          video.play();\n        });\n      }\n      if (pauseButton) pauseButton.addEventListener('click', () => stop(video));\n    });\n  }\n\n  // Webflow-lightboxen krijgen aria-label=\"open lightbox\", ook als de link zichtbare tekst heeft.\n  // Dan wijkt de voorgelezen naam af van wat je ziet: label weghalen zodat de tekst telt.\n  function initLightboxLabels() {\n    if (!document.querySelector('.w-lightbox')) return;\n    const fix = () => {\n      document.querySelectorAll('.w-lightbox[aria-label=\"open lightbox\"]').forEach((link) => {\n        if (link.textContent.trim()) link.removeAttribute('aria-label');\n      });\n    };\n    fix();\n    window.Webflow = window.Webflow || [];\n    window.Webflow.push(fix);\n  }\n\n  // Zoekpagina: zoekterm uit de URL tonen en het zoekveld vooraf invullen\n  function initSearchTerm() {\n    if (!document.querySelector('[data-search-term], [data-search-term-wrap]')) return;\n    const query = new URLSearchParams(window.location.search).get('query');\n    if (!query) {\n      document.querySelectorAll('[data-search-term-wrap]').forEach((el) => {\n        el.style.display = 'none';\n      });\n      return;\n    }\n    document.querySelectorAll('[data-search-term]').forEach((el) => {\n      el.textContent = query;\n    });\n    document.querySelectorAll('.w-input[type=\"search\"], input[name=\"query\"]').forEach((el) => {\n      if (!el.value) el.value = query;\n    });\n  }\n\n  // Zoekpagina: Webflow-resultaten als OZO-kaarten, echte snippets (zonder menu/footer-tekst),\n  // valse treffers (term alleen in menu/footer) eruit, FAQ-antwoorden als vangnet, filters en lege staat.\n  function initSearchPage() {\n    const root = document.querySelector('[data-sr]');\n    if (!root) return;\n    const query = (new URLSearchParams(location.search).get('query') || '').trim();\n    const list = root.querySelector('[data-sr-list]');\n    const faqList = root.querySelector('[data-sr-faq-list]');\n    const countEl = root.querySelector('[data-sr-count]');\n    const filtersEl = root.querySelector('[data-sr-filters]');\n    const tplCard = root.querySelector('[data-sr-card-template]');\n    const tplFaq = root.querySelector('[data-sr-faq-template]');\n    if (tplCard) tplCard.remove();\n    if (tplFaq) tplFaq.remove();\n    if (!query) { root.setAttribute('data-sr-state', 'idle'); return; }\n    root.setAttribute('data-sr-state', 'loading');\n\n    const norm = (s) => (s || '').toLowerCase().normalize('NFD').replace(/[̀-ͯ]/g, '');\n    const STOP = new Set(['de', 'het', 'een', 'en', 'of', 'van', 'in', 'op', 'te', 'ik', 'je', 'mijn', 'is', 'wat', 'hoe', 'voor', 'met', 'aan', 'bij', 'om', 'er', 'die', 'dat']);\n    const terms = norm(query).split(/[^a-z0-9@.-]+/).filter((t) => t.length > 1 && !STOP.has(t));\n    if (!terms.length) terms.push(norm(query));\n    const esc = (s) => s.replace(/[&<>\"]/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;' }[c]));\n    const reTerms = new RegExp('(' + terms.map((t) => t.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('|') + ')', 'gi');\n\n    // Categorie per pad\n    const GROUPS = { voor: 'Voor wie', over: 'Over OZO', werk: 'Werken bij', hulp: 'Hulp & contact' };\n    function categorize(path) {\n      const p = path.replace(/\\/$/, '') || '/';\n      const m = p.match(/^\\/voor\\/([^/]+)/);\n      if (m) {\n        const s = m[1];\n        if (/ouderenzorg|ggz|sociaal|jeugdzorg/.test(s)) return { group: 'voor', tag: 'Professionals', mod: 'is-pro' };\n        if (s === 'gemeenten') return { group: 'voor', tag: 'Gemeenten', mod: 'is-gemeente' };\n        if (s === 'it-partners') return { group: 'voor', tag: 'IT-partners', mod: 'is-it' };\n        if (s === 'mantelzorgers') return { group: 'voor', tag: 'Mantelzorgers', mod: '' };\n        return { group: 'voor', tag: 'Cliënt & familie', mod: '' };\n      }\n      if (/^\\/werken-bij\\/./.test(p)) return { group: 'werk', tag: 'Vacature', mod: 'is-werk' };\n      if (p === '/werken-bij') return { group: 'werk', tag: 'Werken bij', mod: 'is-werk' };\n      if (/^\\/(faq|contact|privacy-veiligheid)/.test(p)) return { group: 'hulp', tag: 'Hulp & contact', mod: 'is-hulp' };\n      return { group: 'over', tag: p === '/' ? 'Home' : 'Over OZO', mod: 'is-over' };\n    }\n    const crumbOf = (path) => ['ozoverbindzorg.nl'].concat(path.split('/').filter(Boolean)).join(' › ');\n    const cleanTitle = (t) => {\n      const parts = t.split(/\\s+\\|\\s+/).map((x) => x.trim()).filter((x) => x && !/^OZO( ?Verbindzorg)?$/i.test(x));\n      return parts[0] || t.trim();\n    };\n\n    // Hoofdtekst van een pagina, zonder menu, zoekpaneel, footer, cookiebanner en scripts\n    function mainText(doc) {\n      doc.querySelectorAll('script,style,noscript,svg,nav,.mega-nav_wrap,[data-search-panel],.footer_v2,footer,[fs-cc],.fs-cc-banner_component,.fs-cc-prefs_component,.w-embed,[aria-hidden=\"true\"],.w-condition-invisible,[class*=\"testimonial\"],.dg-filter,[data-hpg2],.logo_balls').forEach((n) => n.remove());\n      const main = doc.querySelector('main') || doc.querySelector('.main-wrapper') || doc.body;\n      // Elk blok (kop, alinea, knop) als losse zin afsluiten, zodat snippets netjes beginnen\n      main.querySelectorAll('p,h1,h2,h3,h4,h5,h6,li,div,dt,dd,td,th,label,button').forEach((el) => el.append(doc.createTextNode(' ¶ ')));\n      return (main.textContent || '').replace(/\\s+/g, ' ')\n        .replace(/([.!?:…;,])\\s*(¶\\s*)+/g, '$1 ')\n        .replace(/\\s*(¶\\s*)+/g, '. ')\n        .replace(/^[.\\s]+/, '').trim();\n    }\n    function snippet(text) {\n      const n = norm(text);\n      // Alle treffers; kies de eerste in een echte zin (geen los label zoals een tab of knop)\n      const hits = [];\n      terms.forEach((t) => { let i = n.indexOf(t); while (i > -1 && hits.length < 60) { hits.push(i); i = n.indexOf(t, i + t.length); } });\n      if (!hits.length) return '';\n      hits.sort((a, b) => a - b);\n      const bounds = (at) => {\n        const s0 = text.lastIndexOf('. ', at - 1);\n        const s = s0 < 0 ? 0 : s0 + 2;\n        const e0 = text.indexOf('. ', at);\n        return [s, e0 < 0 ? text.length : e0 + 1];\n      };\n      let at = hits.find((h) => { const [s, e] = bounds(h); return e - s >= 50; });\n      if (at === undefined) at = hits[0];\n      let [start] = bounds(at);\n      if (at - start > 120) start = text.indexOf(' ', at - 90) + 1;\n      let out = text.slice(start, start + 220);\n      if (start + 220 < text.length) out = out.replace(/\\s+\\S*$/, '') + '…';\n      return esc(out).replace(reTerms, '<mark>$1</mark>');\n    }\n    const CACHE = 'sr-page:';\n    async function fetchPage(url) {\n      try { const c = sessionStorage.getItem(CACHE + url); if (c) return JSON.parse(c); } catch (e) {}\n      const html = await fetch(url, { credentials: 'same-origin' }).then((r) => (r.ok ? r.text() : ''));\n      const doc = new DOMParser().parseFromString(html, 'text/html');\n      const desc = (doc.querySelector('meta[name=\"description\"]') || {}).content || '';\n      const data = { desc, text: mainText(doc).slice(0, 30000) };\n      try { sessionStorage.setItem(CACHE + url, JSON.stringify(data)); } catch (e) {}\n      return data;\n    }\n\n    // 1. Webflow-resultaten uitlezen\n    const seen = new Set();\n    const pages = [...root.querySelectorAll('.search-result-item')].map((item) => {\n      const a = item.querySelector('a[href]');\n      if (!a) return null;\n      const url = new URL(a.getAttribute('href'), location.origin);\n      const path = url.pathname;\n      if (seen.has(path) || /^\\/(search|bedankt|old|testpage)(\\/|$)/.test(path)) return null;\n      seen.add(path);\n      return { path, title: cleanTitle(a.textContent || ''), cat: categorize(path) };\n    }).filter(Boolean);\n    // Titel-treffers eerst\n    pages.sort((a, b) => (terms.some((t) => norm(b.title).includes(t)) ? 1 : 0) - (terms.some((t) => norm(a.title).includes(t)) ? 1 : 0));\n\n    // 2. Kaarten tekenen (snippet laadt erna)\n    function makeCard(p, i) {\n      let card;\n      if (tplCard) card = tplCard.cloneNode(true);\n      else {\n        card = document.createElement('a');\n        card.innerHTML = '<div><div class=\"sr-card_top\"><span class=\"sr-tag\"></span><span class=\"sr-crumb\"></span></div><h3 class=\"sr-card_title\"></h3><p class=\"sr-card_text\"></p></div><div class=\"sr-card_arrow\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M13 6l6 6-6 6\"/></svg></div>';\n        card.className = 'sr-card';\n      }\n      card.removeAttribute('data-sr-card-template');\n      card.setAttribute('href', p.path);\n      card.style.setProperty('--i', i);\n      card.dataset.group = p.cat.group;\n      const tag = card.querySelector('.sr-tag');\n      tag.textContent = p.cat.tag;\n      if (p.cat.mod) tag.classList.add(p.cat.mod);\n      card.querySelector('.sr-crumb').textContent = crumbOf(p.path);\n      card.querySelector('.sr-card_title').textContent = p.title;\n      card.classList.add('is-loading');\n      card.querySelector('.sr-card_text').textContent = 'Laden…';\n      list.appendChild(card);\n      p.card = card;\n    }\n    pages.forEach(makeCard);\n\n    // 3. FAQ ophalen en scoren\n    async function loadFaq() {\n      if (!faqList) return 0;\n      const html = await fetch('/faq', { credentials: 'same-origin' }).then((r) => (r.ok ? r.text() : '')).catch(() => '');\n      const doc = new DOMParser().parseFromString(html, 'text/html');\n      const hits = [];\n      const qSeen = new Set();\n      doc.querySelectorAll('.dg-faq_item').forEach((it) => {\n        const qEl = it.querySelector('.dg-faq_question');\n        const aEl = it.querySelector('.dg-faq_answer');\n        if (!qEl || !aEl) return;\n        const q = qEl.textContent.replace(/\\s+/g, ' ').trim();\n        if (qSeen.has(q)) return;\n        qSeen.add(q);\n        const nq = norm(q), na = norm(aEl.textContent);\n        let score = 0;\n        terms.forEach((t) => { if (nq.includes(t)) score += 3; if (na.includes(t)) score += 1; });\n        if (!score) return;\n        const grp = it.closest('.faq_group');\n        const top = grp && grp.previousElementSibling;\n        const g = top && top.querySelector('h2,h3');\n        hits.push({ q, aEl, score, group: g ? g.textContent.trim() : '' });\n      });\n      hits.sort((a, b) => b.score - a.score);\n      hits.slice(0, 4).forEach((h) => {\n        let d;\n        if (tplFaq) d = tplFaq.cloneNode(true);\n        else {\n          d = document.createElement('details');\n          d.className = 'sr-faq_item';\n          d.innerHTML = '<summary class=\"sr-faq_q\"><span><span class=\"sr-faq_group\"></span><span class=\"sr-faq_qtext\"></span></span><span class=\"sr-faq_plus\" aria-hidden=\"true\"></span></summary><div class=\"sr-faq_a\"></div>';\n        }\n        d.removeAttribute('data-sr-faq-template');\n        d.open = false;\n        d.querySelector('.sr-faq_group').textContent = h.group;\n        d.querySelector('.sr-faq_qtext').innerHTML = esc(h.q).replace(reTerms, '<mark>$1</mark>');\n        const a = d.querySelector('.sr-faq_a');\n        a.innerHTML = '';\n        const src = h.aEl.querySelector('.w-richtext') || h.aEl;\n        [...src.childNodes].forEach((n) => a.appendChild(document.importNode(n, true)));\n        a.querySelectorAll('p').forEach((p) => { if (!p.textContent.replace(/[\\s\\u200d]/g, '')) p.remove(); });\n        a.querySelectorAll('a[href]').forEach((l) => { if (/^https?:/.test(l.getAttribute('href')) && !l.href.includes(location.host)) l.target = '_blank'; });\n        faqList.appendChild(d);\n      });\n      if (hits.length) root.setAttribute('data-sr-has-faq', '');\n      return Math.min(hits.length, 4);\n    }\n\n    // 4. Snippets + valse treffers wegfilteren\n    async function enrich() {\n      let idx = 0;\n      async function worker() {\n        while (idx < pages.length) {\n          const p = pages[idx++];\n          try {\n            const d = await fetchPage(p.path);\n            const s = snippet(d.text);\n            if (!s && !terms.some((t) => norm(p.title + ' ' + d.desc).includes(t))) { p.card.remove(); p.gone = true; continue; }\n            p.card.querySelector('.sr-card_text').innerHTML = s || esc(d.desc);\n          } catch (e) {\n            p.card.querySelector('.sr-card_text').textContent = '';\n          }\n          p.card.classList.remove('is-loading');\n        }\n      }\n      await Promise.all([1, 2, 3, 4, 5, 6].map(worker));\n    }\n\n    function render(faqN) {\n      const live = pages.filter((p) => !p.gone);\n      const total = live.length;\n      if (!total && !faqN) {\n        root.setAttribute('data-sr-state', 'empty');\n        if (countEl) countEl.textContent = '';\n        return;\n      }\n      root.setAttribute('data-sr-state', 'results');\n      const parts = [];\n      if (total) parts.push('<strong>' + total + '</strong> ' + (total === 1 ? 'pagina' : \"pagina's\"));\n      if (faqN) parts.push('<strong>' + faqN + '</strong> ' + (faqN === 1 ? 'antwoord' : 'antwoorden'));\n      if (countEl) countEl.innerHTML = parts.join(' en ') + ' gevonden';\n      const pagesWrap = root.querySelector('[data-sr-pages]');\n      if (pagesWrap) pagesWrap.toggleAttribute('data-sr-none', !total);\n      // Filters\n      if (!filtersEl) return;\n      filtersEl.innerHTML = '';\n      const counts = {};\n      live.forEach((p) => { counts[p.cat.group] = (counts[p.cat.group] || 0) + 1; });\n      const keys = Object.keys(GROUPS).filter((k) => counts[k]);\n      if (keys.length < 2) return;\n      const btns = [];\n      const mk = (key, label, n) => {\n        const b = document.createElement('button');\n        b.type = 'button';\n        b.className = 'sr-filter';\n        b.innerHTML = esc(label) + ' <span class=\"sr-filter_n\">' + n + '</span>';\n        b.setAttribute('aria-pressed', key === 'all' ? 'true' : 'false');\n        b.addEventListener('click', () => {\n          btns.forEach((x) => x.setAttribute('aria-pressed', x === b ? 'true' : 'false'));\n          live.forEach((p) => { p.card.hidden = key !== 'all' && p.cat.group !== key; });\n          root.toggleAttribute('data-sr-filtered', key !== 'all');\n        });\n        btns.push(b);\n        filtersEl.appendChild(b);\n      };\n      mk('all', 'Alles', total);\n      keys.forEach((k) => mk(k, GROUPS[k], counts[k]));\n    }\n\n    if (pages.length) root.setAttribute('data-sr-state', 'results');\n    // Veelgestelde vragen alleen als vangnet: pas tonen als geen enkele pagina overblijft\n    enrich()\n      .then(() => (pages.some((p) => !p.gone) ? 0 : loadFaq().catch(() => 0)))\n      .then((faqN) => render(faqN));\n  }\n\n  // Zoekicoon: vergrootglas morpht naar een kruisje (ring plat tot de ene streep, steel zwaait\n  // naar de andere). Eén SVG met [data-search-morph]; volgt data-search-state op <html>.\n  function initSearchIconMorph() {\n    const svg = document.querySelector('[data-search-morph]');\n    if (!svg) return;\n    const ring = svg.querySelector('[data-morph-ring]');\n    const stem = svg.querySelector('[data-morph-stem]');\n    if (!ring || !stem) return;\n    const C = 10.5, R = 6.5, K = 0.5523 * R;\n    // Cirkel als 4 bezier-bogen vanaf linksboven (225°), met de klok mee\n    const ringPts = [];\n    for (let i = 0; i < 4; i++) {\n      const a0 = (225 + i * 90) * Math.PI / 180, a1 = a0 + Math.PI / 2;\n      const p0 = [C + R * Math.cos(a0), C + R * Math.sin(a0)];\n      const p1 = [C + R * Math.cos(a1), C + R * Math.sin(a1)];\n      if (!i) ringPts.push(p0);\n      ringPts.push([p0[0] - K * Math.sin(a0), p0[1] + K * Math.cos(a0)], [p1[0] + K * Math.sin(a1), p1[1] - K * Math.cos(a1)], p1);\n    }\n    // Doel: elk punt geprojecteerd op de diagonaal (5,5)-(19,19)\n    const flat = ringPts.map(([x, y]) => { const s = 12 + ((x + y) / 2 - C) / (R / Math.SQRT2) * 7; return [s, s]; });\n    const f = (v) => v.toFixed(2);\n    const ringD = (t) => {\n      const p = ringPts.map((q, i) => [q[0] + (flat[i][0] - q[0]) * t, q[1] + (flat[i][1] - q[1]) * t]);\n      let d = `M${f(p[0][0])} ${f(p[0][1])}`;\n      for (let i = 1; i < p.length; i += 3) d += `C${f(p[i][0])} ${f(p[i][1])} ${f(p[i + 1][0])} ${f(p[i + 1][1])} ${f(p[i + 2][0])} ${f(p[i + 2][1])}`;\n      return d;\n    };\n    // Steel: midden, hoek en lengte gaan van de handgreep naar de tweede streep van het kruis\n    const stemD = (t) => {\n      const cx = 17.8 + (12 - 17.8) * t, cy = cx;\n      const ang = (45 + 90 * t) * Math.PI / 180, len = (6.2 + (19.8 - 6.2) * t) / 2;\n      const dx = Math.cos(ang) * len, dy = Math.sin(ang) * len;\n      return `M${f(cx - dx)} ${f(cy - dy)}L${f(cx + dx)} ${f(cy + dy)}`;\n    };\n    const ease = (x) => (x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2);\n    const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n    let t = 0, from = 0, to = 0, start = 0, raf = 0;\n    const draw = (v) => { ring.setAttribute('d', ringD(v)); stem.setAttribute('d', stemD(v)); };\n    draw(0);\n    function step(now) {\n      if (!start) start = now;\n      const p = Math.min((now - start) / 420, 1);\n      t = from + (to - from) * ease(p);\n      draw(t);\n      if (p < 1) raf = requestAnimationFrame(step); else raf = 0;\n    }\n    const sync = () => {\n      const target = document.documentElement.getAttribute('data-search-state') === 'open' ? 1 : 0;\n      if (target === to && (raf || t === target)) return;\n      to = target;\n      if (reduce) { t = to; draw(t); return; }\n      from = t; start = 0;\n      if (!raf) raf = requestAnimationFrame(step);\n    };\n    new MutationObserver(sync).observe(document.documentElement, { attributes: true, attributeFilter: ['data-search-state'] });\n  }\n\n  // ---------- Nieuwe site ----------\n\n  // Menu verbergen bij naar beneden scrollen, terug bij omhoog scrollen (desktop én mobiel).\n  // De afstand wordt gemeten op het moment zelf (geen vaste -150px), en het menu verdwijnt nooit\n  // als het mobiele menu, een dropdown of de zoekbalk open is, of als je bovenaan de pagina staat.\n  function initNavScroll() {\n    const navMenu = document.querySelector('#NAVMENU');\n    if (!navMenu || !window.gsap) return;\n    const root = document.documentElement;\n    const threshold = 12; // zoveel px in één richting scrollen voordat het menu reageert\n    const topZone = 80; // bovenaan de pagina altijd zichtbaar\n    let lastY = window.scrollY;\n    let travel = 0;\n    let hidden = false;\n\n    const isBusy = () =>\n      navMenu.getAttribute('data-menu-open') === 'true' ||\n      root.getAttribute('data-search-state') === 'open' ||\n      !!navMenu.querySelector('[aria-expanded=\"true\"]');\n\n    // Let op: een transform op #NAVMENU maakt het menu zelf het kader voor het (fixed) mobiele\n    // menu en de zoekbalk erin, waardoor die worden afgekapt. Daarom de transform helemaal\n    // weghalen zodra het menu terug is, en meteen als het menu, een dropdown of zoeken opengaat.\n    function clearShift() {\n      gsap.killTweensOf(navMenu);\n      gsap.set(navMenu, { clearProps: 'transform' });\n    }\n\n    function setHidden(hide) {\n      if (hide === hidden) return;\n      hidden = hide;\n      if (!hide) {\n        gsap.to(navMenu, {\n          y: 0,\n          duration: 0.6,\n          ease: 'power3.out',\n          overwrite: true,\n          onComplete: clearShift\n        });\n        return;\n      }\n      // Gemeten zonder de huidige verschuiving, ook als de vorige animatie nog loopt\n      const distance = navMenu.getBoundingClientRect().bottom - gsap.getProperty(navMenu, 'y') + 10;\n      gsap.to(navMenu, { y: -distance, duration: 0.45, ease: 'power2.in', overwrite: true });\n    }\n\n    function onScroll() {\n      const y = Math.max(window.scrollY, 0);\n      const delta = y - lastY;\n      lastY = y;\n      if (isBusy()) {\n        travel = 0;\n        showIfBusy();\n        return;\n      }\n      if (y < topZone) {\n        travel = 0;\n        setHidden(false);\n        return;\n      }\n      if (!delta) return;\n      // Andere richting: opnieuw tellen\n      if (delta > 0 !== travel > 0) travel = 0;\n      travel += delta;\n      if (travel > threshold) setHidden(true);\n      else if (travel < -threshold) setHidden(false);\n    }\n\n    window.addEventListener('scroll', onScroll, { passive: true });\n    // Gaat het menu, een dropdown of zoeken open terwijl de balk weg is: meteen terughalen\n    const showIfBusy = () => {\n      if (!isBusy()) return;\n      hidden = false;\n      clearShift(); // direct, zonder animatie: anders is het menu tijdens het terugschuiven afgekapt\n    };\n    new MutationObserver(showIfBusy).observe(navMenu, {\n      attributes: true,\n      subtree: true,\n      attributeFilter: ['data-menu-open', 'aria-expanded']\n    });\n    new MutationObserver(showIfBusy).observe(root, { attributes: true, attributeFilter: ['data-search-state'] });\n  }\n\n\n  function initMegaNavDirectionalHover() {\n    const DUR = {\n      bgMorph: 0.4,\n      contentIn: 0.3,\n      contentOut: 0.2,\n      stagger: 0.25,\n      backdropIn: 0.3,\n      backdropOut: 0.2,\n      openScale: 0.35,\n      closeScale: 0.25,\n    };\n    const HOVER_ENTER = 120;\n    const HOVER_LEAVE = 150;\n    // DOM references\n    const menuWrap = document.querySelector(\"[data-menu-wrap]\");\n    const navList = document.querySelector(\"[data-nav-list]\");\n    const dropWrapper = document.querySelector(\"[data-dropdown-wrapper]\");\n    const dropContainer = document.querySelector(\"[data-dropdown-container]\");\n    const dropBg = document.querySelector(\"[data-dropdown-bg]\");\n    const backdrop = document.querySelector(\"[data-menu-backdrop]\");\n    const toggles = [...document.querySelectorAll(\"[data-dropdown-toggle]\")];\n    const panels = [...document.querySelectorAll(\"[data-nav-content]\")];\n    const burger = document.querySelector(\"[data-burger-toggle]\");\n    const backBtn = document.querySelector(\"[data-mobile-back]\");\n    const logo = document.querySelector(\"[data-menu-logo]\");\n    const [lineTop, lineMid, lineBot] = [\"top\", \"mid\", \"bot\"].map(\n      (id) => document.querySelector(`[data-burger-line='${id}']`)\n    );\n    // Alleen op pagina's met het nieuwe menu\n    if (!menuWrap || !navList || !dropWrapper || !dropContainer || !backdrop || !burger || !backBtn) return;\n    // Logo-link zonder tekst: naam voor schermlezers\n    if (logo && !logo.textContent.trim() && !logo.getAttribute(\"aria-label\")) logo.setAttribute(\"aria-label\", \"OZO home\");\n    // State\n    const state = {\n      isOpen: false,\n      activePanel: null,\n      activePanelIndex: -1,\n      isMobile: window.innerWidth <= 991,\n      mobileMenuOpen: false,\n      mobilePanelActive: null,\n      hoverTimer: null,\n      leaveTimer: null,\n      tl: null,\n      mobileTl: null,\n      mobilePanelTl: null,\n    };\n    // Helpers\n    const getPanel = (name) => document.querySelector(`[data-nav-content=\"${name}\"]`);\n    const getToggle = (name) => document.querySelector(`[data-dropdown-toggle=\"${name}\"]`);\n    const getFade = (el) => el.querySelectorAll(\"[data-menu-fade]\");\n    const getNavItems = () => navList.querySelectorAll(\"[data-nav-list-item]\");\n    const getIndex = (name) => toggles.indexOf(getToggle(name));\n    const stagger = (n) => (n <= 1 ? 0 : { amount: DUR.stagger });\n    const ICON_SEL = \".mega-nav__bar-link-icon.is--dropdown\";\n    const getIcon = (name) => getToggle(name)?.querySelector(ICON_SEL);\n\n    function spinIcon(tl, name, open, at = 0) {\n      const icon = getIcon(name);\n      if (!icon) return;\n      tl.to(icon, {\n        rotate: open ? 180 : 0,\n        duration: open ? DUR.openScale : DUR.closeScale,\n        ease: open ? \"power3.out\" : \"power2.in\",\n        overwrite: \"auto\",\n      }, at);\n    }\n\n    function clearTimers() {\n      clearTimeout(state.hoverTimer);\n      clearTimeout(state.leaveTimer);\n      state.hoverTimer = state.leaveTimer = null;\n    }\n\n    function killTl(key) {\n      if (state[key]) {\n        state[key].kill();\n        state[key] = null;\n      }\n    }\n\n    function killDropdown() {\n      killTl(\"tl\");\n      gsap.killTweensOf(dropContainer);\n      gsap.killTweensOf(backdrop);\n      panels.forEach((p) => {\n        gsap.killTweensOf(p);\n        gsap.killTweensOf(getFade(p));\n      });\n    }\n\n    function killMobile() {\n      killTl(\"mobileTl\");\n      gsap.killTweensOf([navList, lineTop, lineMid, lineBot]);\n    }\n\n    function killMobilePanel() {\n      killTl(\"mobilePanelTl\");\n      gsap.killTweensOf(getNavItems());\n      gsap.killTweensOf([backBtn, logo]);\n      panels.forEach((p) => {\n        gsap.killTweensOf(p);\n        gsap.killTweensOf(getFade(p));\n      });\n    }\n\n    function resetToggles() {\n      toggles.forEach((t) => t.setAttribute(\"aria-expanded\", \"false\"));\n    }\n\n    function resetDesktop() {\n      panels.forEach((p) => {\n        gsap.set(p, {\n          visibility: \"hidden\",\n          opacity: 0,\n          pointerEvents: \"none\",\n          x: 0,\n          y: 0,\n          xPercent: 0\n        });\n        gsap.set(getFade(p), { autoAlpha: 0, x: 0, y: 0, xPercent: 0 });\n      });\n      gsap.set(dropContainer, { height: 0, clearProps: \"transform\" });\n      gsap.set(backdrop, { autoAlpha: 0 });\n      menuWrap.setAttribute(\"data-menu-open\", \"false\");\n      resetToggles();\n    }\n\n    function setupMobile() {\n      panels.forEach((p) => {\n        gsap.set(p, { autoAlpha: 0, xPercent: 0, visibility: \"visible\", pointerEvents: \"none\" });\n        gsap.set(getFade(p), { xPercent: 20, autoAlpha: 0 });\n      });\n      gsap.set(getNavItems(), { xPercent: 0, y: 0, autoAlpha: 1 });\n      gsap.set(navList, { autoAlpha: 0, x: 0 });\n      gsap.set(backBtn, { autoAlpha: 0 });\n      gsap.set(logo, { autoAlpha: 1 });\n      gsap.set(dropContainer, { clearProps: \"height\" });\n      gsap.set(backdrop, { autoAlpha: 0 });\n    }\n\n    function measurePanel(name) {\n      const el = getPanel(name);\n      if (!el) return 0;\n      const s = el.style;\n      const prev = [s.visibility, s.opacity, s.pointerEvents];\n      Object.assign(s, { visibility: \"visible\", opacity: \"0\", pointerEvents: \"none\" });\n      const h = el.getBoundingClientRect().height;\n      [s.visibility, s.opacity, s.pointerEvents] = prev;\n      return h;\n    }\n    // DESKTOP — open dropdown (first open)\n    function openDropdown(panelName) {\n      if (state.isOpen && state.activePanel === panelName) return;\n      if (state.isOpen) return switchPanel(state.activePanel, panelName);\n      const height = measurePanel(panelName);\n      if (!height) return;\n      killDropdown();\n      resetDesktop();\n      const el = getPanel(panelName);\n      const fade = getFade(el);\n      const toggle = getToggle(panelName);\n      state.isOpen = true;\n      state.activePanel = panelName;\n      state.activePanelIndex = getIndex(panelName);\n      menuWrap.setAttribute(\"data-menu-open\", \"true\");\n      if (toggle) toggle.setAttribute(\"aria-expanded\", \"true\");\n      gsap.set(dropContainer, { height: 0 });\n      const tl = gsap.timeline();\n      state.tl = tl;\n      tl.to(backdrop, { autoAlpha: 1, duration: DUR.backdropIn, ease: \"power2.out\" }, 0);\n      tl.to(dropContainer, { height, duration: DUR.openScale, ease: \"power3.out\" }, 0);\n      tl.set(el, { visibility: \"visible\", opacity: 1, pointerEvents: \"auto\" }, 0.05);\n      if (fade.length) {\n        tl.fromTo(fade, { autoAlpha: 0, y: 8 }, {\n            autoAlpha: 1,\n            y: 0,\n            duration: DUR.contentIn,\n            stagger: stagger(fade.length),\n            ease: \"power3.out\"\n          },\n          0.1\n        );\n      }\n    }\n    // DESKTOP — close dropdown\n    function closeDropdown() {\n      if (!state.isOpen) return;\n      const el = getPanel(state.activePanel);\n      const fade = el ? getFade(el) : [];\n      killDropdown();\n      const tl = gsap.timeline({\n        onComplete() {\n          state.isOpen = false;\n          state.activePanel = null;\n          state.activePanelIndex = -1;\n          state.tl = null;\n          resetDesktop();\n        },\n      });\n      state.tl = tl;\n      if (fade.length) tl.to(fade, {\n        autoAlpha: 0,\n        y: -4,\n        duration: DUR.contentOut * 0.7,\n        ease: \"power2.in\"\n      }, 0);\n      tl.to(dropContainer, { height: 0, duration: DUR.closeScale, ease: \"power2.in\" }, 0.05);\n      tl.to(backdrop, { autoAlpha: 0, duration: DUR.backdropOut, ease: \"power2.out\" }, 0);\n      if (el) tl.set(el, { visibility: \"hidden\", opacity: 0, pointerEvents: \"none\" });\n    }\n    // DESKTOP — switch panel (directional)\n    function switchPanel(fromName, toName) {\n      const dir = getIndex(toName) > getIndex(fromName) ? 1 : -1;\n      const fromEl = getPanel(fromName),\n        toEl = getPanel(toName);\n      if (!fromEl || !toEl) return;\n      const fromFade = getFade(fromEl),\n        toFade = getFade(toEl);\n      const toHeight = measurePanel(toName);\n      if (!toHeight) return;\n      killDropdown();\n      // Reset all panels, then restore fromEl as visible\n      panels.forEach((p) => {\n        gsap.set(p, { visibility: \"hidden\", opacity: 0, pointerEvents: \"none\", xPercent: 0 });\n        gsap.set(getFade(p), { autoAlpha: 0, x: 0, y: 0 });\n      });\n      gsap.set(fromEl, { visibility: \"visible\", opacity: 1, pointerEvents: \"auto\", x: 0 });\n      if (fromFade.length) gsap.set(fromFade, { autoAlpha: 1, x: 0, y: 0 });\n      gsap.set(backdrop, { autoAlpha: 1 });\n      const toToggle = getToggle(toName);\n      state.activePanel = toName;\n      state.activePanelIndex = getIndex(toName);\n      resetToggles();\n      if (toToggle) toToggle.setAttribute(\"aria-expanded\", \"true\");\n      const xOut = dir * -30,\n        xIn = dir * 30;\n      const tl = gsap.timeline();\n      state.tl = tl;\n      if (fromFade.length) tl.to(fromFade, {\n        autoAlpha: 0,\n        x: xOut,\n        duration: DUR.contentOut,\n        ease: \"power2.in\"\n      }, 0);\n      tl.set(fromEl, { visibility: \"hidden\", opacity: 0, pointerEvents: \"none\", xPercent: 0 }, DUR\n        .contentOut);\n      if (fromFade.length) tl.set(fromFade, { x: 0 }, DUR.contentOut);\n      tl.to(dropContainer, { height: toHeight, duration: DUR.bgMorph, ease: \"power3.out\" }, 0.05);\n      tl.set(toEl, { visibility: \"visible\", opacity: 1, pointerEvents: \"auto\", xPercent: 0 }, DUR\n        .contentOut * 0.5);\n      if (toFade.length) {\n        tl.fromTo(toFade, { autoAlpha: 0, x: xIn }, {\n            autoAlpha: 1,\n            x: 0,\n            duration: DUR.contentIn,\n            stagger: stagger(toFade.length),\n            ease: \"power3.out\"\n          },\n          DUR.contentOut * 0.6\n        );\n      }\n    }\n    // DESKTOP — hover intent\n    function handleToggleEnter(e) {\n      if (state.isMobile) return;\n      const name = e.currentTarget.getAttribute(\"data-dropdown-toggle\");\n      if (!name) return;\n      clearTimeout(state.leaveTimer);\n      state.leaveTimer = null;\n      clearTimeout(state.hoverTimer);\n      state.hoverTimer = setTimeout(() => openDropdown(name), state.isOpen ? 0 : HOVER_ENTER);\n    }\n\n    function handleToggleLeave() {\n      if (state.isMobile) return;\n      clearTimeout(state.hoverTimer);\n      state.hoverTimer = null;\n      state.leaveTimer = setTimeout(closeDropdown, HOVER_LEAVE);\n    }\n\n    function handleWrapperEnter() {\n      if (state.isMobile) return;\n      clearTimeout(state.leaveTimer);\n      state.leaveTimer = null;\n    }\n\n    function handleWrapperLeave() {\n      if (state.isMobile) return;\n      state.leaveTimer = setTimeout(closeDropdown, HOVER_LEAVE);\n    }\n    // DESKTOP — close behaviors\n    function handleEscape(e) {\n      if (e.key !== \"Escape\") return;\n      if (state.isMobile) {\n        state.mobilePanelActive ? closeMobilePanel() : state.mobileMenuOpen && closeMobileMenu();\n        return;\n      }\n      if (state.isOpen) {\n        const t = getToggle(state.activePanel);\n        closeDropdown();\n        if (t) t.focus();\n      }\n    }\n\n    function handleDocClick(e) {\n      if (state.isMobile || !state.isOpen) return;\n      if (!e.target.closest(\"[data-menu-wrap]\")) closeDropdown();\n    }\n    // DESKTOP — keyboard navigation\n    function focusFirstLink(panelName) {\n      setTimeout(() => {\n        const el = getPanel(panelName);\n        if (!el) return;\n        const link = el.querySelector(\"a\");\n        if (!link) return;\n        gsap.set(link, { visibility: \"visible\" });\n        link.focus();\n      }, 80);\n    }\n\n    function handleKeydownOnToggle(e) {\n      if (state.isMobile) return;\n      const name = e.currentTarget.getAttribute(\"data-dropdown-toggle\");\n      if (e.key === \"Enter\" || e.key === \" \") {\n        e.preventDefault();\n        if (state.isOpen && state.activePanel === name) closeDropdown();\n        else {\n          openDropdown(name);\n          focusFirstLink(name);\n        }\n        return;\n      }\n      if (e.key === \"ArrowDown\") {\n        e.preventDefault();\n        if (!state.isOpen || state.activePanel !== name) openDropdown(name);\n        focusFirstLink(name);\n      }\n      if (e.key === \"Tab\" && !e.shiftKey && state.isOpen && state.activePanel === name) {\n        e.preventDefault();\n        const link = getPanel(name)?.querySelector(\"a\");\n        if (link) link.focus();\n      }\n    }\n\n    function handleKeydownInPanel(e) {\n      if (state.isMobile || !state.isOpen) return;\n      const el = getPanel(state.activePanel);\n      if (!el) return;\n      const links = [...el.querySelectorAll(\"a\")];\n      const idx = links.indexOf(document.activeElement);\n      if (e.key === \"ArrowDown\") {\n        e.preventDefault();\n        links[(idx + 1) % links.length].focus();\n      }\n      if (e.key === \"ArrowUp\") {\n        e.preventDefault();\n        if (idx <= 0) { const t = getToggle(state.activePanel); if (t) t.focus(); }\n        else links[idx - 1].focus();\n      }\n      if (e.key === \"Tab\" && !e.shiftKey && idx === links.length - 1) {\n        e.preventDefault();\n        const curIdx = toggles.indexOf(getToggle(state.activePanel));\n        const next = curIdx < toggles.length - 1 ? toggles[curIdx + 1] : null;\n        closeDropdown();\n        if (next) next.focus();\n      }\n      if (e.key === \"Tab\" && e.shiftKey && idx === 0) {\n        e.preventDefault();\n        const t = getToggle(state.activePanel);\n        if (t) t.focus();\n      }\n    }\n    // MOBILE — burger animation\n    function animateBurger(toX) {\n      const tl = gsap.timeline({ defaults: { ease: \"power2.inOut\" } });\n      if (toX) {\n        tl.to(lineTop, { y: \"0.3125em\", duration: 0.15 }, 0);\n        tl.to(lineBot, { y: \"-0.3125em\", duration: 0.15 }, 0);\n        tl.to(lineMid, { autoAlpha: 0, duration: 0.1 }, 0.1);\n        tl.to(lineTop, { rotation: 45, duration: 0.2 }, 0.15);\n        tl.to(lineBot, { rotation: -45, duration: 0.2 }, 0.15);\n      } else {\n        tl.to(lineTop, { rotation: 0, duration: 0.2 }, 0);\n        tl.to(lineBot, { rotation: 0, duration: 0.2 }, 0);\n        tl.to(lineTop, { y: 0, duration: 0.15 }, 0.15);\n        tl.to(lineBot, { y: 0, duration: 0.15 }, 0.15);\n        tl.to(lineMid, { autoAlpha: 1, duration: 0.1 }, 0.15);\n      }\n      return tl;\n    }\n    // MOBILE — open/close menu\n    function openMobileMenu() {\n      killMobile();\n      state.mobileMenuOpen = true;\n      menuWrap.setAttribute(\"data-menu-open\", \"true\");\n      burger.setAttribute(\"aria-expanded\", \"true\");\n      document.body.style.overflow = \"hidden\";\n      const items = getNavItems();\n      const tl = gsap.timeline();\n      state.mobileTl = tl;\n      tl.add(animateBurger(true), 0);\n      tl.to(navList, { autoAlpha: 1, duration: 0.3, ease: \"power2.out\" }, 0);\n      if (items.length) {\n        tl.fromTo(items, { autoAlpha: 0, y: 12 }, {\n            autoAlpha: 1,\n            y: 0,\n            duration: 0.3,\n            stagger: 0.04,\n            ease: \"power3.out\"\n          },\n          0.15\n        );\n      }\n    }\n\n    function closeMobileMenu() {\n      const hadPanel = state.mobilePanelActive;\n      const panelEl = hadPanel ? getPanel(hadPanel) : null;\n      killMobile();\n      killMobilePanel();\n      menuWrap.setAttribute(\"data-menu-open\", \"false\");\n      state.mobileMenuOpen = false;\n      state.mobilePanelActive = null;\n      burger.setAttribute(\"aria-expanded\", \"false\");\n      const tl = gsap.timeline({\n        onComplete() {\n          document.body.style.overflow = \"\";\n          state.mobileTl = null;\n          setupMobile();\n        },\n      });\n      state.mobileTl = tl;\n      tl.add(animateBurger(false), 0);\n      // If a panel was open, fade it out with the close — no snap reset\n      if (hadPanel && panelEl) {\n        tl.to(panelEl, { autoAlpha: 0, duration: 0.3, ease: \"power2.inOut\" }, 0.05);\n        tl.to(backBtn, { autoAlpha: 0, duration: 0.2, ease: \"power2.in\" }, 0.05);\n      }\n      // Fade out the nav list container\n      tl.to(navList, { autoAlpha: 0, duration: 0.3, ease: \"power2.inOut\" }, 0.05);\n    }\n    // MOBILE — slide-over panels \n    function openMobilePanel(panelName) {\n      const el = getPanel(panelName);\n      if (!el) return;\n      killMobilePanel();\n      state.mobilePanelActive = panelName;\n      const navItems = getNavItems();\n      const panelFade = getFade(el);\n      const tl = gsap.timeline();\n      state.mobilePanelTl = tl;\n      // Fade out each nav item to the left\n      if (navItems.length) {\n        tl.to(navItems, {\n          xPercent: -10,\n          autoAlpha: 0,\n          duration: 0.35,\n          stagger: 0.03,\n          ease: \"power2.in\",\n        }, 0);\n      }\n      // Logo → back button swap\n      tl.to(logo, { autoAlpha: 0, duration: 0.2, ease: \"power2.in\" }, 0);\n      tl.to(backBtn, { autoAlpha: 1, duration: 0.25, ease: \"power2.inOut\" }, 0.15);\n      // Show panel container, then fade in its items from the right\n      tl.set(el, { autoAlpha: 1, xPercent: 0, pointerEvents: \"auto\" }, 0.2);\n      if (panelFade.length) {\n        tl.fromTo(panelFade, { xPercent: 8, autoAlpha: 0 }, {\n            xPercent: 0,\n            autoAlpha: 1,\n            duration: 0.3,\n            stagger: stagger(panelFade.length),\n            ease: \"power3.out\"\n          },\n          0.25\n        );\n      }\n    }\n\n    function closeMobilePanel() {\n      if (!state.mobilePanelActive) return;\n      const el = getPanel(state.mobilePanelActive);\n      if (!el) return;\n      killMobilePanel();\n      const navItems = getNavItems();\n      const panelFade = getFade(el);\n      const tl = gsap.timeline({\n        onComplete() {\n          state.mobilePanelActive = null;\n          state.mobilePanelTl = null;\n        },\n      });\n      state.mobilePanelTl = tl;\n      // Fade out panel items to the right\n      if (panelFade.length) {\n        tl.to(el, {\n          xPercent: 20,\n          autoAlpha: 0,\n          duration: 0.3,\n          stagger: 0.02,\n          ease: \"power2.in\",\n        }, 0);\n      }\n      // Hide panel\n      tl.set(el, { autoAlpha: 0, pointerEvents: \"none\" }, 0.25);\n      // Back → logo swap\n      tl.to(backBtn, { autoAlpha: 0, duration: 0.2, ease: \"power2.in\" }, 0);\n      tl.to(logo, { autoAlpha: 1, duration: 0.25, ease: \"power2.out\" }, 0.15);\n      // Fade nav items back in from center\n      if (navItems.length) {\n        tl.fromTo(navItems, { xPercent: -20, autoAlpha: 0 }, {\n            xPercent: 0,\n            autoAlpha: 1,\n            duration: 0.35,\n            stagger: 0.03,\n            ease: \"power3.out\"\n          },\n          0.25\n        );\n      }\n    }\n\n    function handleToggleClick(e) {\n      if (!state.isMobile || !state.mobileMenuOpen) return;\n      const name = e.currentTarget.getAttribute(\"data-dropdown-toggle\");\n      if (name) {\n        e.preventDefault();\n        openMobilePanel(name);\n      }\n    }\n    // RESIZE\n    let resizeTimer = null;\n    let lastWidth = window.innerWidth;\n\n    function handleResize() {\n      const w = window.innerWidth;\n      if (w === lastWidth) return;\n      lastWidth = w;\n      clearTimeout(resizeTimer);\n      resizeTimer = setTimeout(() => {\n        const was = state.isMobile;\n        state.isMobile = window.innerWidth <= 991;\n        if (was && !state.isMobile) {\n          killMobile();\n          killMobilePanel();\n          gsap.set(navList, { clearProps: \"all\" });\n          gsap.set(getNavItems(), { clearProps: \"all\" });\n          gsap.set(backBtn, { autoAlpha: 0 });\n          gsap.set(logo, { clearProps: \"all\" });\n          gsap.set([lineTop, lineMid, lineBot], { rotation: 0, y: 0, autoAlpha: 1 });\n          panels.forEach((p) => {\n            gsap.set(p, { clearProps: \"all\" });\n            gsap.set(getFade(p), { clearProps: \"all\" });\n          });\n          burger.setAttribute(\"aria-expanded\", \"false\");\n          state.mobileMenuOpen = false;\n          state.mobilePanelActive = null;\n          document.body.style.overflow = \"\";\n          resetDesktop();\n        }\n        if (!was && state.isMobile) {\n          killDropdown();\n          state.isOpen = false;\n          state.activePanel = null;\n          state.activePanelIndex = -1;\n          clearTimers();\n          menuWrap.setAttribute(\"data-menu-open\", \"false\");\n          resetToggles();\n          setupMobile();\n        }\n      }, 150);\n    }\n    // EVENT BINDING\n    toggles.forEach((btn) => {\n      btn.addEventListener(\"mouseenter\", handleToggleEnter);\n      btn.addEventListener(\"mouseleave\", handleToggleLeave);\n      btn.addEventListener(\"keydown\", handleKeydownOnToggle);\n      btn.addEventListener(\"click\", handleToggleClick);\n    });\n    dropWrapper.addEventListener(\"mouseenter\", handleWrapperEnter);\n    dropWrapper.addEventListener(\"mouseleave\", handleWrapperLeave);\n    panels.forEach((p) => p.addEventListener(\"keydown\", handleKeydownInPanel));\n    backdrop.addEventListener(\"click\", closeDropdown);\n    document.addEventListener(\"keydown\", handleEscape);\n    document.addEventListener(\"click\", handleDocClick);\n    burger.addEventListener(\"click\", () => state.mobileMenuOpen ? closeMobileMenu() :\n      openMobileMenu());\n    backBtn.addEventListener(\"click\", closeMobilePanel);\n    window.addEventListener(\"resize\", handleResize);\n    // INIT\n    state.isMobile ? setupMobile() : resetDesktop();\n  }\n\n  // Menufoto's alvast ophalen en uitpakken, zodat het menu de eerste keer ook soepel openklapt\n  function initMegaNavImages() {\n    const imgs = [...document.querySelectorAll('[data-nav-content] img')];\n    if (!imgs.length) return;\n    // Na het laden van de pagina, als de browser tijd heeft\n    const idle = window.requestIdleCallback || ((fn) => setTimeout(fn, 200));\n    const warm = () => idle(() => imgs.forEach((img) => {\n      img.loading = 'eager';\n      if (img.decode) img.decode().catch(() => {});\n    }));\n    if (document.readyState === 'complete') warm();\n    else window.addEventListener('load', warm, { once: true });\n  }\n\n  // Search toggle\n  function initSearchToggle() {\n    const r = document.documentElement,\n      w = document.querySelector(\"[data-menu-wrap]\"),\n      t = document.querySelector(\"[data-search-toggle]\"),\n      p = document.querySelector(\"[data-search-panel]\");\n    if (!t || !p) return;\n    const i = p.querySelector(\".w-input\"),\n      isOpen = () => r.getAttribute(\"data-search-state\") === \"open\",\n      navOpen = () => w && w.getAttribute(\"data-menu-open\") === \"true\";\n    t.setAttribute(\"aria-expanded\", \"false\");\n    // Toggle is een div: knop-rol + toetsenbord, anders is aria-expanded niet toegestaan\n    if (t.tagName !== \"BUTTON\") {\n      t.setAttribute(\"role\", \"button\");\n      if (!t.hasAttribute(\"tabindex\")) t.setAttribute(\"tabindex\", \"0\");\n      t.addEventListener(\"keydown\", e => {\n        if (e.key !== \"Enter\" && e.key !== \" \") return;\n        e.preventDefault();\n        isOpen() ? close(0) : open();\n      });\n    }\n\n    function open() {\n      if (navOpen()) document.dispatchEvent(new KeyboardEvent(\"keydown\", {\n        key: \"Escape\",\n        bubbles: true\n      }));\n      r.setAttribute(\"data-search-state\", \"open\");\n      t.setAttribute(\"aria-expanded\", \"true\");\n      if (i) setTimeout(() => i.focus(), 120);\n    }\n\n    function close(f) {\n      r.removeAttribute(\"data-search-state\");\n      t.setAttribute(\"aria-expanded\", \"false\");\n      if (f) t.focus();\n    }\n    document.addEventListener(\"click\", e => {\n      const node = e.target.nodeType === 1 ? e.target : e.target.parentElement;\n      if (!node) return;\n      if (node.closest(\"[data-search-toggle]\")) {\n        e.preventDefault();\n        isOpen() ? close(0) : open();\n        return;\n      }\n      if (!isOpen()) return;\n      if (node === p) { close(0); return; }\n      if (!node.closest(\"[data-search-panel]\")) close(0);\n    });\n    document.addEventListener(\"keydown\", e => { if (e.key === \"Escape\" && isOpen()) close(1); });\n  }\n\n  // Form interactions\n  function initAdvancedFormValidation() {\n    const forms = document.querySelectorAll('[data-form-validate]');\n    forms.forEach((formContainer) => {\n      const form = formContainer.querySelector('form');\n      if (!form) return;\n      const validateFields = form.querySelectorAll('[data-validate]');\n      // Webflow-forms gebruiken [data-submit] + input[type=submit].\n      // Custom forms (zoals Laposta) hebben die niet: dan alleen veldvalidatie + form.__validate.\n      const dataSubmit = form.querySelector('[data-submit]');\n      const realSubmitInput = dataSubmit ? dataSubmit.querySelector('input[type=\"submit\"]') :\n        null;\n      // Disable select options with invalid values on page load\n      validateFields.forEach(function (fieldGroup) {\n        const select = fieldGroup.querySelector('select');\n        if (select) {\n          const options = select.querySelectorAll('option');\n          options.forEach(function (option) {\n            if (\n              option.value === '' ||\n              option.value === 'disabled' ||\n              option.value === 'null' ||\n              option.value === 'false'\n            ) {\n              option.setAttribute('disabled', 'disabled');\n            }\n          });\n        }\n      });\n\n      function validateAndStartLiveValidationForAll() {\n        let allValid = true;\n        let firstInvalidField = null;\n        validateFields.forEach(function (fieldGroup) {\n          const input = fieldGroup.querySelector('input, textarea, select');\n          const radioCheckGroup = fieldGroup.querySelector('[data-radiocheck-group]');\n          if (!input && !radioCheckGroup) return;\n          if (input) input.__validationStarted = true;\n          if (radioCheckGroup) {\n            radioCheckGroup.__validationStarted = true;\n            const inputs = radioCheckGroup.querySelectorAll(\n              'input[type=\"radio\"], input[type=\"checkbox\"]');\n            inputs.forEach(function (input) {\n              input.__validationStarted = true;\n            });\n          }\n          updateFieldStatus(fieldGroup);\n          if (!isValid(fieldGroup)) {\n            allValid = false;\n            if (!firstInvalidField) {\n              firstInvalidField = input || radioCheckGroup.querySelector('input');\n            }\n          }\n        });\n        if (!allValid && firstInvalidField) {\n          firstInvalidField.focus();\n        }\n        return allValid;\n      }\n\n      function isValid(fieldGroup) {\n        const radioCheckGroup = fieldGroup.querySelector('[data-radiocheck-group]');\n        if (radioCheckGroup) {\n          const inputs = radioCheckGroup.querySelectorAll(\n            'input[type=\"radio\"], input[type=\"checkbox\"]');\n          const checkedInputs = radioCheckGroup.querySelectorAll('input:checked');\n          const min = parseInt(radioCheckGroup.getAttribute('min')) || 1;\n          const max = parseInt(radioCheckGroup.getAttribute('max')) || inputs.length;\n          const checkedCount = checkedInputs.length;\n          if (inputs[0].type === 'radio') {\n            return checkedCount >= 1;\n          } else {\n            if (inputs.length === 1) {\n              return inputs[0].checked;\n            } else {\n              return checkedCount >= min && checkedCount <= max;\n            }\n          }\n        } else {\n          const input = fieldGroup.querySelector('input, textarea, select');\n          if (!input) return false;\n          let valid = true;\n          const min = parseInt(input.getAttribute('min')) || 0;\n          const max = parseInt(input.getAttribute('max')) || Infinity;\n          const value = input.value.trim();\n          const length = value.length;\n          if (input.tagName.toLowerCase() === 'select') {\n            if (\n              value === '' ||\n              value === 'disabled' ||\n              value === 'null' ||\n              value === 'false'\n            ) {\n              valid = false;\n            }\n          } else if (input.type === 'email') {\n            const emailPattern = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n            valid = emailPattern.test(value);\n          } else {\n            if (input.hasAttribute('min') && length < min) valid = false;\n            if (input.hasAttribute('max') && length > max) valid = false;\n          }\n          return valid;\n        }\n      }\n\n      function updateFieldStatus(fieldGroup) {\n        const radioCheckGroup = fieldGroup.querySelector('[data-radiocheck-group]');\n        if (radioCheckGroup) {\n          const inputs = radioCheckGroup.querySelectorAll(\n            'input[type=\"radio\"], input[type=\"checkbox\"]');\n          const checkedInputs = radioCheckGroup.querySelectorAll('input:checked');\n          if (checkedInputs.length > 0) {\n            fieldGroup.classList.add('is--filled');\n          } else {\n            fieldGroup.classList.remove('is--filled');\n          }\n          const valid = isValid(fieldGroup);\n          if (valid) {\n            fieldGroup.classList.add('is--success');\n            fieldGroup.classList.remove('is--error');\n          } else {\n            fieldGroup.classList.remove('is--success');\n            const anyInputValidationStarted = Array.from(inputs).some(input => input\n              .__validationStarted);\n            if (anyInputValidationStarted) {\n              fieldGroup.classList.add('is--error');\n            } else {\n              fieldGroup.classList.remove('is--error');\n            }\n          }\n        } else {\n          const input = fieldGroup.querySelector('input, textarea, select');\n          if (!input) return;\n          const value = input.value.trim();\n          if (value) {\n            fieldGroup.classList.add('is--filled');\n          } else {\n            fieldGroup.classList.remove('is--filled');\n          }\n          const valid = isValid(fieldGroup);\n          if (valid) {\n            fieldGroup.classList.add('is--success');\n            fieldGroup.classList.remove('is--error');\n          } else {\n            fieldGroup.classList.remove('is--success');\n            if (input.__validationStarted) {\n              fieldGroup.classList.add('is--error');\n            } else {\n              fieldGroup.classList.remove('is--error');\n            }\n          }\n        }\n      }\n      validateFields.forEach(function (fieldGroup) {\n        const input = fieldGroup.querySelector('input, textarea, select');\n        const radioCheckGroup = fieldGroup.querySelector('[data-radiocheck-group]');\n        if (radioCheckGroup) {\n          const inputs = radioCheckGroup.querySelectorAll(\n            'input[type=\"radio\"], input[type=\"checkbox\"]');\n          inputs.forEach(function (input) {\n            input.__validationStarted = false;\n            input.addEventListener('change', function () {\n              requestAnimationFrame(function () {\n                if (!input.__validationStarted) {\n                  const checkedCount = radioCheckGroup.querySelectorAll(\n                    'input:checked').length;\n                  const min = parseInt(radioCheckGroup.getAttribute('min')) || 1;\n                  if (checkedCount >= min) {\n                    input.__validationStarted = true;\n                  }\n                }\n                if (input.__validationStarted) {\n                  updateFieldStatus(fieldGroup);\n                }\n              });\n            });\n            input.addEventListener('blur', function () {\n              input.__validationStarted = true;\n              updateFieldStatus(fieldGroup);\n            });\n          });\n        } else if (input) {\n          input.__validationStarted = false;\n          if (input.tagName.toLowerCase() === 'select') {\n            input.addEventListener('change', function () {\n              input.__validationStarted = true;\n              updateFieldStatus(fieldGroup);\n            });\n          } else {\n            input.addEventListener('input', function () {\n              const value = input.value.trim();\n              const length = value.length;\n              const min = parseInt(input.getAttribute('min')) || 0;\n              const max = parseInt(input.getAttribute('max')) || Infinity;\n              if (!input.__validationStarted) {\n                if (input.type === 'email') {\n                  if (isValid(fieldGroup)) input.__validationStarted = true;\n                } else {\n                  if (\n                    (input.hasAttribute('min') && length >= min) ||\n                    (input.hasAttribute('max') && length <= max)\n                  ) {\n                    input.__validationStarted = true;\n                  }\n                }\n              }\n              if (input.__validationStarted) {\n                updateFieldStatus(fieldGroup);\n              }\n            });\n            input.addEventListener('blur', function () {\n              input.__validationStarted = true;\n              updateFieldStatus(fieldGroup);\n            });\n          }\n        }\n      });\n\n      // Validator beschikbaar maken voor custom submit handlers (Laposta)\n      form.__validate = validateAndStartLiveValidationForAll;\n\n      // Alleen Webflow-forms: submit via [data-submit] + echte input[type=submit]\n      if (!dataSubmit || !realSubmitInput) return;\n      dataSubmit.addEventListener('click', function () {\n        if (validateAndStartLiveValidationForAll()) {\n          form.requestSubmit(realSubmitInput);\n        }\n      });\n      form.addEventListener('keydown', function (event) {\n        if (event.key === 'Enter' && event.target.tagName !== 'TEXTAREA') {\n          event.preventDefault();\n          if (validateAndStartLiveValidationForAll()) {\n            form.requestSubmit(realSubmitInput);\n          }\n        }\n      });\n    });\n  }\n\n  // Vimeo background video\n  function initVimeoBackground() {\n    // Officiële Vimeo Player SDK via jsDelivr (vaste versie): zelfde API, maar geen cookies van player.vimeo.com\n    const VIMEO_SDK = \"https://cdn.jsdelivr.net/npm/@vimeo/player@2.30.4/dist/player.min.js\";\n\n    // Load Vimeo Player SDK if it isn't on the page yet\n    function loadVimeoSDK(callback) {\n      if (window.Vimeo && window.Vimeo.Player) {\n        callback();\n        return;\n      }\n      const existing = document.querySelector(`script[src=\"${VIMEO_SDK}\"]`);\n      if (existing) {\n        existing.addEventListener(\"load\", callback, { once: true });\n        return;\n      }\n      const script = document.createElement(\"script\");\n      script.src = VIMEO_SDK;\n      script.onload = callback;\n      document.head.appendChild(script);\n    }\n\n    function initVimeoBGVideo() {\n      // Select all elements that have [data-vimeo-bg-init]\n      const vimeoPlayers = document.querySelectorAll(\"[data-vimeo-bg-init]\");\n      if (!vimeoPlayers.length) return;\n\n      vimeoPlayers.forEach(function (vimeoElement, index) {\n        // Prevent double init\n        if (vimeoElement.hasAttribute(\"data-vimeo-ready\")) return;\n        vimeoElement.setAttribute(\"data-vimeo-ready\", \"true\");\n\n        // Add Vimeo URL ID to the iframe [src]\n        const vimeoVideoID = vimeoElement.getAttribute(\"data-vimeo-video-id\");\n        if (!vimeoVideoID) return;\n        const iframe = vimeoElement.querySelector(\"iframe\");\n        if (!iframe) return;\n        // dnt=1: Vimeo zet geen tracking-cookies\n        const vimeoVideoURL =\n          `https://player.vimeo.com/video/${vimeoVideoID}?api=1&background=1&autoplay=0&loop=1&muted=1&dnt=1`;\n        iframe.setAttribute(\"src\", vimeoVideoURL);\n        // Decoratieve achtergrondvideo: titel voor de iframe, maar niet voorlezen of focussen\n        iframe.setAttribute(\"title\", \"Achtergrondvideo\");\n        iframe.setAttribute(\"aria-hidden\", \"true\");\n        iframe.setAttribute(\"tabindex\", \"-1\");\n\n        // Assign an ID to each element\n        const videoIndexID = \"vimeo-bg-index-\" + index;\n        vimeoElement.setAttribute(\"id\", videoIndexID);\n\n        const player = new Vimeo.Player(videoIndexID);\n\n        // Formaat: de video vult de container via CSS (Site settings → Head, \".vimeo-bg\"),\n        // niet meer via meten in JavaScript. Meten na het laden liet de hero verspringen (layout shift).\n\n        // Loaded\n        player.on(\"play\", function () {\n          vimeoElement.setAttribute(\"data-vimeo-loaded\", \"true\");\n        });\n\n        // Paused\n        player.on(\"pause\", function () {\n          vimeoElement.setAttribute(\"data-vimeo-playing\", \"false\");\n        });\n\n        // Play / pause\n        function vimeoPlayerPlay() {\n          vimeoElement.setAttribute(\"data-vimeo-activated\", \"true\");\n          vimeoElement.setAttribute(\"data-vimeo-playing\", \"true\");\n          player.play();\n        }\n\n        function vimeoPlayerPause() {\n          player.pause();\n        }\n\n        // Scroll-based autoplay: alleen iets doen als de zichtbaarheid verandert, hooguit één keer\n        // per frame. Eerder ging bij elke scroll-tik een play() naar de iframe, wat op mobiel haperde.\n        let fixedHost = null;\n        for (let el = vimeoElement; el && el !== document.body; el = el.parentElement) {\n          if (getComputedStyle(el).position === \"fixed\") {\n            fixedHost = el;\n            break;\n          }\n        }\n        let wasInView = null;\n        let checkQueued = false;\n\n        function isInView() {\n          // Een vaste hero staat altijd 'in beeld'; hij is weg zodra je er een schermhoogte voorbij bent\n          if (fixedHost) return window.scrollY < window.innerHeight;\n          const rect = vimeoElement.getBoundingClientRect();\n          return rect.top < window.innerHeight && rect.bottom > 0;\n        }\n\n        function checkVisibility() {\n          checkQueued = false;\n          const inView = isInView();\n          if (inView === wasInView) return;\n          wasInView = inView;\n          inView ? vimeoPlayerPlay() : vimeoPlayerPause();\n        }\n\n        function queueVisibilityCheck() {\n          if (checkQueued) return;\n          checkQueued = true;\n          requestAnimationFrame(checkVisibility);\n        }\n\n        // Autoplay\n        if (vimeoElement.getAttribute(\"data-vimeo-autoplay\") === \"false\") {\n          player.pause();\n        } else if (vimeoElement.getAttribute(\"data-vimeo-paused-by-user\") === \"false\") {\n          checkVisibility();\n          window.addEventListener(\"scroll\", queueVisibilityCheck, { passive: true });\n        }\n\n        // Click: Play\n        const playBtn = vimeoElement.querySelector('[data-vimeo-control=\"play\"]');\n        if (playBtn) {\n          playBtn.addEventListener(\"click\", vimeoPlayerPlay);\n        }\n\n        // Click: Pause\n        const pauseBtn = vimeoElement.querySelector('[data-vimeo-control=\"pause\"]');\n        if (pauseBtn) {\n          pauseBtn.addEventListener(\"click\", function () {\n            vimeoPlayerPause();\n            // If paused by user => kill the scroll-based autoplay\n            if (vimeoElement.getAttribute(\"data-vimeo-autoplay\") === \"true\") {\n              vimeoElement.setAttribute(\"data-vimeo-paused-by-user\", \"true\");\n              window.removeEventListener(\"scroll\", queueVisibilityCheck);\n            }\n          });\n        }\n      });\n    }\n\n    if (document.querySelector(\"[data-vimeo-bg-init]\")) {\n      loadVimeoSDK(initVimeoBGVideo);\n    }\n  }\n\n  // Scrolt de pagina nu? Lenis meldt alleen zijn eigen scroll: bij touch en de scrollbalk blijft\n  // isScrolling meestal false, dus tellen de native scroll-events ook mee (tot 150 ms na de laatste).\n  let lastScrollAt = -Infinity;\n  window.addEventListener('scroll', () => { lastScrollAt = performance.now(); }, { passive: true });\n  function pageIsScrolling() {\n    return !!(window.lenis && window.lenis.isScrolling) || performance.now() - lastScrollAt < 150;\n  }\n\n  // Hero wave: subtiele, organisch bewegende golf\n  function initHeroWave() {\n    const waves = document.querySelectorAll(\"[data-hero-wave]\");\n    if (!waves.length) return;\n\n    const W = 1440; // viewBox breedte\n    const H = 120; // viewBox hoogte\n\n    // Basisvorm van de bovenrand (y vanaf boven): links hoog, midden laag, rechts iets hoger\n    const BASE = [20, 55, 95, 70, 40];\n\n    const reduceMotion = window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n\n    // Vloeiende curve door alle punten (Catmull-Rom naar cubic bezier)\n    function buildPath(points) {\n      let d = `M${points[0][0]},${points[0][1]}`;\n      for (let i = 0; i < points.length - 1; i++) {\n        const p0 = points[i - 1] || points[i];\n        const p1 = points[i];\n        const p2 = points[i + 1];\n        const p3 = points[i + 2] || p2;\n        const cp1x = p1[0] + (p2[0] - p0[0]) / 6;\n        const cp1y = p1[1] + (p2[1] - p0[1]) / 6;\n        const cp2x = p2[0] - (p3[0] - p1[0]) / 6;\n        const cp2y = p2[1] - (p3[1] - p1[1]) / 6;\n        d +=\n          ` C${cp1x.toFixed(1)},${cp1y.toFixed(1)} ${cp2x.toFixed(1)},${cp2y.toFixed(1)} ${p2[0]},${p2[1].toFixed(1)}`;\n      }\n      d += ` L${W},${H} L0,${H} Z`;\n      return d;\n    }\n\n    waves.forEach(wave => {\n      const path = wave.querySelector(\"[data-wave-path]\");\n      if (!path) return;\n\n      const amp = parseFloat(wave.getAttribute(\"data-wave-amp\")) ||\n        10; // uitslag in viewBox-units\n      const speed = parseFloat(wave.getAttribute(\"data-wave-speed\")) ||\n        0.35; // lager = rustiger\n      const step = W / (BASE.length - 1);\n\n      // Elk punt krijgt een eigen fase en snelheid, zodat het nooit synchroon beweegt\n      const phases = BASE.map((_, i) => i * 1.7);\n      const rates = BASE.map((_, i) => 1 + (i % 2 ? 0.23 : -0.17));\n\n      function render(time) {\n        const points = BASE.map((y, i) => [\n          Math.round(i * step),\n          y + Math.sin(time * speed * rates[i] + phases[i]) * amp\n        ]);\n        path.setAttribute(\"d\", buildPath(points));\n      }\n\n      // Statische vorm bij reduced motion\n      render(0);\n      if (reduceMotion) return;\n\n      let running = false;\n      let clock = 0; // seconden; staat stil tijdens scrollen, daarna gaat de vorm verder waar hij was\n      let last = 0;\n\n      // Tijdens scrollen niet tekenen: het vormen per frame kost de scroll zijn soepelheid\n      function tick(now) {\n        if (!running) return;\n        const dt = last ? Math.min(now - last, 100) : 0;\n        last = now;\n        if (!pageIsScrolling()) {\n          clock += dt / 1000;\n          render(clock);\n        }\n        requestAnimationFrame(tick);\n      }\n\n      // Alleen animeren als de golf in beeld is\n      const observer = new IntersectionObserver(entries => {\n        entries.forEach(entry => {\n          if (entry.isIntersecting && !running) {\n            running = true;\n            requestAnimationFrame(tick);\n          } else if (!entry.isIntersecting) {\n            running = false;\n          }\n        });\n      });\n      observer.observe(wave);\n    });\n  }\n\n  // Bewegende blobs (zoals de golven): [data-blob-morph=\"hero-bg|hero-photo|video\"] krijgt een\n  // gladde vorm als clip-path die langzaam meebeweegt. Vormen: straal per hoek (h) uit de\n  // Figma-vormen, geschaald naar het element (aff). data-blob-amp (uitslag, standaard 0.04) en\n  // data-blob-speed (standaard 0.5) regelen de beweging; data-blob-square(-mobile) maakt hem vierkanter. In de Designer en zonder JS toont de\n  // mask uit Webflow dezelfde vorm stil; dit script zet die mask uit zodra het overneemt.\n  const BLOB_SHAPES = {\n    'hero-bg': {\n      h: [0.5773, 0.0303, -0.0186, 0.0836, 0.0265, -0.0074, -0.0645, -0.008, 0.0031, 0.0022, -0.0185, -0.0045, -0.0009],\n      aff: [0.6827, 0.4928, 0.9458, 0.4703]\n    },\n    'hero-photo': {\n      h: [0.5047, 0.0025, 0.0029, 0.0375, -0.0534, -0.0571, 0.0058, 0.0022, 0.0028, -0.0084, 0.0114, 0.0028, -0.0001],\n      aff: [0.85, 0.5546, 0.9409, 0.5245]\n    },\n    'video': {\n      h: [0.4675, 0.0041, -0.0275, 0.0039, -0.0599, -0.0273, 0.0461, 0.0076, -0.0006, 0.0111, 0.0064, -0.0002, -0.0034],\n      aff: [0.9427, 0.5317, 0.9672, 0.5806]\n    }\n  };\n\n  function initBlobMorph() {\n    const blobs = document.querySelectorAll('[data-blob-morph]');\n    if (!blobs.length) return;\n\n    const STEPS = 72; // punten rond de omtrek\n    const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n    // Vloeiende gesloten vorm: kwadratische bochten via de middens tussen de punten\n    function smoothClosedPath(pts) {\n      const f = (v) => v.toFixed(1);\n      const n = pts.length;\n      let mx = (pts[n - 1][0] + pts[0][0]) / 2;\n      let my = (pts[n - 1][1] + pts[0][1]) / 2;\n      let d = `M${f(mx)},${f(my)}`;\n      for (let i = 0; i < n; i++) {\n        const next = pts[(i + 1) % n];\n        mx = (pts[i][0] + next[0]) / 2;\n        my = (pts[i][1] + next[1]) / 2;\n        d += `Q${f(pts[i][0])},${f(pts[i][1])} ${f(mx)},${f(my)}`;\n      }\n      return d + 'Z';\n    }\n\n    const mobile = window.matchMedia('(max-width: 767px)');\n\n    blobs.forEach((el) => {\n      // Optioneel een andere vorm op mobiel: data-blob-morph-mobile=\"hero-bg\"\n      const pick = () => {\n        const mobileKey = el.getAttribute('data-blob-morph-mobile');\n        const key = mobileKey && mobile.matches && BLOB_SHAPES[mobileKey] ? mobileKey :\n          el.getAttribute('data-blob-morph');\n        return BLOB_SHAPES[key];\n      };\n      if (!pick()) return;\n\n      const amp = parseFloat(el.getAttribute('data-blob-amp')) || 0.04;\n      const speed = parseFloat(el.getAttribute('data-blob-speed')) || 0.5;\n      let ax, bx, ay, by, h, harmonics, square, box;\n      // Straal van de basisvorm (zonder beweging) op hoek a\n      const baseR = (a) => {\n        let r = h[0];\n        for (let k = 1; k <= harmonics; k++) {\n          r += h[2 * k - 1] * Math.cos(k * a) + h[2 * k] * Math.sin(k * a);\n        }\n        return r;\n      };\n      const useShape = () => {\n        const shape = pick();\n        [ax, bx, ay, by] = shape.aff;\n        h = shape.h;\n        harmonics = (h.length - 1) / 2;\n        // Vierkanter maken: data-blob-square (0 = vorm uit Figma, 1 = afgeronde rechthoek),\n        // op mobiel eventueel data-blob-square-mobile. Trekt de vorm naar een afgeronde\n        // rechthoek binnen hetzelfde kader.\n        const sqMobile = el.getAttribute('data-blob-square-mobile');\n        square = Math.min(1, Math.max(0, parseFloat(\n          sqMobile !== null && mobile.matches ? sqMobile : el.getAttribute('data-blob-square')\n        ) || 0));\n        box = null;\n        if (square) {\n          let x0 = Infinity, x1 = -Infinity, y0 = Infinity, y1 = -Infinity;\n          for (let n = 0; n < STEPS; n++) {\n            const a = (n / STEPS) * Math.PI * 2;\n            const r = baseR(a);\n            const x = ax * r * Math.cos(a) + bx;\n            const y = ay * r * Math.sin(a) + by;\n            x0 = Math.min(x0, x); x1 = Math.max(x1, x);\n            y0 = Math.min(y0, y); y1 = Math.max(y1, y);\n          }\n          box = { cx: (x0 + x1) / 2, cy: (y0 + y1) / 2, rx: (x1 - x0) / 2, ry: (y1 - y0) / 2 };\n        }\n      };\n      useShape();\n      const seed = Math.random() * 100; // elke blob beweegt anders\n      let width = el.offsetWidth;\n      let height = el.offsetHeight;\n      let lastTime = 0;\n\n      function render(time) {\n        lastTime = time;\n        const t = time * speed + seed;\n        const pts = [];\n        for (let n = 0; n < STEPS; n++) {\n          const a = (n / STEPS) * Math.PI * 2;\n          let r = baseR(a);\n          // Zachte golven die rond de vorm lopen (2, 3 en 4 bulten)\n          r += h[0] * amp * (\n            Math.sin(2 * a + t * 0.9) * 0.6 +\n            Math.sin(3 * a - t * 0.7 + 1.3) * 0.3 +\n            Math.sin(4 * a + t * 0.5 + 2.1) * 0.15\n          );\n          let x = ax * r * Math.cos(a) + bx;\n          let y = ay * r * Math.sin(a) + by;\n          if (box) {\n            // Punt op een afgeronde rechthoek (superellips, exponent 3) onder dezelfde hoek\n            const c = Math.cos(a);\n            const s = Math.sin(a);\n            const k = Math.pow(Math.pow(Math.abs(c), 3) + Math.pow(Math.abs(s), 3), -1 / 3);\n            x += square * (box.cx + box.rx * c * k - x);\n            y += square * (box.cy + box.ry * s * k - y);\n          }\n          pts.push([x * width, y * height]);\n        }\n        el.style.clipPath = `path('${smoothClosedPath(pts)}')`;\n      }\n\n      // De script-vorm vervangt de stilstaande mask uit Webflow\n      el.style.webkitMaskImage = 'none';\n      el.style.maskImage = 'none';\n      render(0);\n\n      new ResizeObserver(() => {\n        width = el.offsetWidth;\n        height = el.offsetHeight;\n        render(lastTime);\n      }).observe(el);\n      mobile.addEventListener('change', () => {\n        useShape();\n        render(lastTime);\n      });\n\n      if (reduceMotion) return;\n\n      let running = false;\n      let clock = 0; // seconden; staat stil tijdens scrollen, daarna gaat de vorm verder waar hij was\n      let last = 0;\n\n      // Tijdens scrollen niet tekenen: het vormen per frame kost de scroll zijn soepelheid\n      function tick(now) {\n        if (!running) return;\n        const dt = last ? Math.min(now - last, 100) : 0;\n        last = now;\n        if (!pageIsScrolling()) {\n          clock += dt / 1000;\n          render(clock);\n        }\n        requestAnimationFrame(tick);\n      }\n\n      // Alleen animeren als de blob in beeld is\n      new IntersectionObserver((entries) => {\n        entries.forEach((entry) => {\n          if (entry.isIntersecting && !running) {\n            running = true;\n            requestAnimationFrame(tick);\n          } else if (!entry.isIntersecting) {\n            running = false;\n          }\n        });\n      }).observe(el);\n    });\n  }\n\n  function initNumberOdometer() {\n    if (!document.querySelector('[data-odometer-group]')) return\n    const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches\n    const initFlag = 'data-odometer-initialized'\n    const activeTweens = new WeakMap()\n\n    // Configuration\n    const defaults = {\n      duration: 1,\n      ease: 'power3.out',\n      elementStagger: 0.1,\n      digitStagger: 0.04,\n      revealDuration: 0.5,\n      revealEase: 'power2.out',\n      triggerStart: 'top 80%',\n      staggerOrder: 'left',\n      digitCycles: 2\n    }\n\n    // Scroll-triggered groups\n    document.querySelectorAll('[data-odometer-group]').forEach(group => {\n      if (group.hasAttribute(initFlag)) return\n      group.setAttribute(initFlag, '')\n\n      const elements = Array.from(group.querySelectorAll('[data-odometer-element]'))\n      if (!elements.length || prefersReducedMotion) return\n\n      const staggerOrder = group.getAttribute('data-odometer-stagger-order') || defaults\n        .staggerOrder\n      const triggerStart = group.getAttribute('data-odometer-trigger-start') || defaults\n        .triggerStart\n      const elementStagger = parseFloat(group.getAttribute('data-odometer-stagger')) || defaults\n        .elementStagger\n\n      const elementData = elements.map(el => {\n        const originalText = el.textContent.trim()\n        const hasExplicitStart = el.hasAttribute('data-odometer-start')\n        const startValue = parseFloat(el.getAttribute('data-odometer-start')) || 0\n        const duration = parseFloat(el.getAttribute('data-odometer-duration')) || defaults\n          .duration\n        const step = getLineHeightRatio(el)\n\n        let segments = parseSegments(originalText)\n        segments = mapStartDigits(segments, startValue)\n        segments = markHiddenSegments(segments, startValue)\n\n        const grow = shouldGrow(el, hasExplicitStart, startValue, segments)\n        const { rollers, revealEls } = buildRollerDOM(el, segments, step, grow)\n\n        const fontSize = parseFloat(getComputedStyle(el).fontSize)\n        const revealData = revealEls.map(revealEl => {\n          const widthEm = revealEl.offsetWidth / fontSize\n          gsap.set(revealEl, { width: 0, overflow: 'hidden' })\n          return { el: revealEl, widthEm }\n        })\n\n        return { el, rollers, duration, step, revealData, originalText }\n      })\n\n      const ordered = applyStaggerOrder(elementData, staggerOrder)\n\n      const tl = gsap.timeline({\n        scrollTrigger: {\n          trigger: group,\n          start: triggerStart,\n          once: true\n        },\n        onComplete() {\n          elementData.forEach(({ el, originalText, step }) => {\n            cleanupElement(el, originalText)\n          })\n        }\n      })\n\n      ordered.forEach((data, orderIdx) => {\n        const { rollers, duration, step, revealData } = data\n        const offset = orderIdx * elementStagger\n\n        revealData.forEach(({ el, widthEm }) => {\n          tl.to(el, {\n            width: widthEm + 'em',\n            opacity: 1,\n            duration: defaults.revealDuration,\n            ease: defaults.revealEase\n          }, offset)\n        })\n\n        rollers.forEach(({ roller, targetPos }, digitIdx) => {\n          const reversedIdx = rollers.length - 1 - digitIdx\n          tl.to(roller, {\n            y: -targetPos * step + 'em',\n            duration,\n            ease: defaults.ease,\n            force3D: true\n          }, offset + reversedIdx * defaults.digitStagger)\n        })\n      })\n    })\n\n    // Programmatic update (optional add-on)\n    return function updateOdometer(el, newText, options = {}) {\n      const currentText = el.textContent.trim()\n      if (currentText === newText) return\n\n      const duration = options.duration || defaults.duration\n      const ease = options.ease || defaults.ease\n      const step = getLineHeightRatio(el)\n\n      // Kill any running animation and clear its inline style locks\n      const existing = activeTweens.get(el)\n      if (existing) {\n        existing.kill()\n        gsap.set(el, { clearProps: 'width,overflow' })\n      }\n\n      // Measure current width before rebuilding (in em for responsive scaling)\n      const fontSize = parseFloat(getComputedStyle(el).fontSize)\n      const oldWidthEm = el.getBoundingClientRect().width / fontSize\n\n      // Parse current text as start, new text as end\n      const startSegments = parseSegments(currentText)\n      const startDigitsStr = startSegments\n        .filter(s => s.type === 'digit')\n        .map(s => s.char)\n        .join('')\n      const startValue = parseInt(startDigitsStr, 10) || 0\n\n      let segments = parseSegments(newText)\n      segments = mapStartDigits(segments, startValue)\n      segments = markHiddenSegments(segments, startValue)\n      const { rollers, revealEls } = buildRollerDOM(el, segments, step, true)\n\n      // Measure new natural width (in em)\n      const newWidthEm = el.getBoundingClientRect().width / fontSize\n      const widthChanged = Math.abs(oldWidthEm - newWidthEm) > 0.01\n\n      // Lock to old width for smooth transition\n      if (widthChanged) {\n        gsap.set(el, { width: oldWidthEm + 'em', overflow: 'hidden' })\n      }\n\n      const tl = gsap.timeline({\n        onComplete() {\n          cleanupElement(el, newText)\n          activeTweens.delete(el)\n        }\n      })\n      activeTweens.set(el, tl)\n\n      // Animate element width\n      if (widthChanged) {\n        tl.to(el, {\n          width: newWidthEm + 'em',\n          duration: defaults.revealDuration,\n          ease: defaults.revealEase\n        }, 0)\n      }\n\n      // Fade in hidden statics\n      revealEls.forEach(revealEl => {\n        if (revealEl.getAttribute('data-odometer-part') === 'static') {\n          tl.to(revealEl, { opacity: 1, duration: 0.2 }, 0)\n        }\n      })\n\n      // Roll digits\n      rollers.forEach(({ roller, targetPos }, digitIdx) => {\n        const reversedIdx = rollers.length - 1 - digitIdx\n        tl.to(roller, {\n          y: -targetPos * step + 'em',\n          duration,\n          ease,\n          force3D: true\n        }, reversedIdx * defaults.digitStagger)\n      })\n    }\n\n    // Helpers\n    function getLineHeightRatio(el) {\n      const cs = getComputedStyle(el)\n      const lh = cs.lineHeight\n      if (lh === 'normal') return 1.2\n      return parseFloat(lh) / parseFloat(cs.fontSize)\n    }\n\n    function parseSegments(text) {\n      return [...text].map(char => ({\n        type: /\\d/.test(char) ? 'digit' : 'static',\n        char\n      }))\n    }\n\n    function mapStartDigits(segments, startValue) {\n      const digitSlots = segments.filter(s => s.type === 'digit')\n      const padded = String(Math.floor(Math.abs(startValue)))\n        .padStart(digitSlots.length, '0')\n        .slice(-digitSlots.length)\n      let di = 0\n      return segments.map(s =>\n        s.type === 'digit' ? { ...s, startDigit: parseInt(padded[di++], 10) } :\n        s\n      )\n    }\n\n    function markHiddenSegments(segments, startValue) {\n      const totalDigits = segments.filter(s => s.type === 'digit').length\n      const absStart = Math.floor(Math.abs(startValue))\n      const startDigitCount = absStart === 0 ? 1 : String(absStart).length\n      const leadingZeros = Math.max(0, totalDigits - startDigitCount)\n      if (leadingZeros === 0) return segments\n      let digitsSeen = 0\n      let firstDigitSeen = false\n      let prevDigitHidden = false\n      return segments.map(seg => {\n        if (seg.type === 'digit') {\n          firstDigitSeen = true\n          const hidden = digitsSeen < leadingZeros\n          prevDigitHidden = hidden\n          digitsSeen++\n          return { ...seg, hidden }\n        }\n        const hidden = firstDigitSeen && prevDigitHidden\n        return { ...seg, hidden }\n      })\n    }\n\n    function shouldGrow(el, hasExplicitStart, startValue, segments) {\n      if (el.hasAttribute('data-odometer-grow')) {\n        return el.getAttribute('data-odometer-grow') !== 'false'\n      }\n      if (!hasExplicitStart) return false\n      const absStart = Math.floor(Math.abs(startValue))\n      const startDigitCount = absStart === 0 ? 1 : String(absStart).length\n      const endDigitCount = segments.filter(s => s.type === 'digit').length\n      return startDigitCount < endDigitCount\n    }\n\n    function buildRollerDOM(el, segments, step, grow) {\n      el.innerHTML = ''\n      el.style.height = ''\n      const rollers = []\n      const revealEls = []\n      const totalCells = 10 * defaults.digitCycles\n      segments.forEach(seg => {\n        if (seg.type === 'static') {\n          const span = document.createElement('span')\n          span.setAttribute('data-odometer-part', 'static')\n          span.style.height = step + 'em'\n          span.style.lineHeight = step\n          span.textContent = seg.char\n          el.appendChild(span)\n          if (grow && seg.hidden) {\n            gsap.set(span, { opacity: 0 })\n            revealEls.push(span)\n          }\n          return\n        }\n        const mask = document.createElement('span')\n        mask.setAttribute('data-odometer-part', 'mask')\n        mask.style.height = step + 'em'\n        mask.style.lineHeight = step\n        const roller = document.createElement('span')\n        roller.setAttribute('data-odometer-part', 'roller')\n        roller.style.lineHeight = step\n\n        const digits = []\n        for (let d = 0; d < totalCells; d++) {\n          digits.push(d % 10)\n        }\n        roller.textContent = digits.join('\\n')\n        mask.appendChild(roller)\n        el.appendChild(mask)\n        const startDigit = seg.startDigit || 0\n        const isReveal = grow && seg.hidden\n        gsap.set(roller, { y: isReveal ? step + 'em' : -startDigit * step + 'em' })\n        const endDigit = parseInt(seg.char, 10)\n        const targetPos = endDigit > startDigit ? endDigit : 10 + endDigit\n        rollers.push({ roller, targetPos })\n        if (isReveal) revealEls.push(mask)\n      })\n      return { rollers, revealEls }\n    }\n\n    function cleanupElement(el, originalText) {\n      el.style.overflow = ''\n      el.style.height = ''\n\n      // Remove rollers, set final digit, clear inline bloat (but preserve width)\n      const digits = [...originalText].filter(c => /\\d/.test(c))\n      let di = 0\n\n      el.querySelectorAll('[data-odometer-part=\"mask\"]').forEach(mask => {\n        const roller = mask.querySelector('[data-odometer-part=\"roller\"]')\n        if (roller) roller.remove()\n        mask.textContent = digits[di++] || ''\n        mask.style.opacity = ''\n        mask.style.overflow = ''\n      })\n\n      el.querySelectorAll('[data-odometer-part=\"static\"]').forEach(stat => {\n        stat.style.opacity = ''\n      })\n    }\n\n    function recalcOnResize() {\n      document.querySelectorAll('[data-odometer-element]').forEach(el => {\n        // Force-complete any running programmatic animation\n        const running = activeTweens.get(el)\n        if (running) {\n          running.progress(1)\n          activeTweens.delete(el)\n        }\n\n        const hasRollers = el.querySelector('[data-odometer-part=\"roller\"]')\n\n        if (hasRollers) {\n          // Pre-triggered: recalculate step-based inline styles\n          const step = getLineHeightRatio(el)\n          el.querySelectorAll('[data-odometer-part=\"mask\"]').forEach(mask => {\n            mask.style.height = step + 'em'\n            mask.style.lineHeight = step\n          })\n          el.querySelectorAll('[data-odometer-part=\"roller\"]').forEach(roller => {\n            roller.style.lineHeight = step\n          })\n          el.querySelectorAll('[data-odometer-part=\"static\"]').forEach(stat => {\n            stat.style.lineHeight = step\n          })\n        }\n        // Completed elements: width is em-based, scales automatically, don't touch\n      })\n      ScrollTrigger.refresh()\n    }\n\n    let resizeTimer\n    let lastWidth = window.innerWidth\n    window.addEventListener('resize', () => {\n      clearTimeout(resizeTimer)\n      resizeTimer = setTimeout(() => {\n        if (window.innerWidth === lastWidth) return\n        lastWidth = window.innerWidth\n        recalcOnResize()\n      }, 250)\n    })\n\n    function applyStaggerOrder(items, order) {\n      const arr = [...items]\n      if (order === 'right') return arr.reverse()\n      if (order === 'random') return shuffleArray(arr)\n      return arr\n    }\n\n    function shuffleArray(arr) {\n      for (let i = arr.length - 1; i > 0; i--) {\n        const j = Math.floor(Math.random() * (i + 1));\n        [arr[i], arr[j]] = [arr[j], arr[i]]\n      }\n      return arr\n    }\n  }\n\n\n  function initWavyMarquee() {\n    document.querySelectorAll('[data-wavy-marquee-init]').forEach((container) => {\n      // ---------- Instellingen ----------\n      const autoSpeed = 100; // basissnelheid (px per seconde)\n      const viewport = [\n        // [min-breedte, snelheid-schaal, golflengte-schaal, boog]\n        // Boog (mobiel): één boog over de schermbreedte, hoog in het midden en laag aan beide randen\n        [992, 1, 1, false],\n        [768, 0.75, 1, false],\n        [480, 0.6, 0.75, true],\n        [0, 0.5, 0.75, true]\n      ];\n      const scrollSpeed = 0.004; // hoeveel scrollen versnelt (lager = rustiger)\n      const scrollEase = 0.05; // hoe vloeiend de scroll-boost in/uitfadet (lager = zachter)\n      const dragSpeed = 0.5; // hoeveel slepen versnelt\n      const maxDragSpeed = 75; // maximale versnelling bij slepen\n      const dragEase = 0.1; // hoe snel slepen uitfadet\n      const waveY = 0.5; // hoogte van de golf (t.o.v. itemhoogte)\n      const waveBoost = 0; // extra golfhoogte bij snelheid (0 = altijd even hoog)\n      const itemsPerWave = 10; // hoeveel items per golf (hoger = langere, rustigere golf)\n      const waveTravel = 0; // beweegt de golf zelf mee (0 = vaste baan)\n      const pauseBuffer = 0.25; // extra marge voor pauzeren, als deel van de schermhoogte\n\n      const getViewport = () => viewport.find(([min]) => innerWidth >= min).slice(1);\n\n      container._wavyMarqueeObserver?.kill();\n      container._wavyMarqueeTrigger?.kill();\n\n      if (container._wavyMarqueeTick) gsap.ticker.remove(container._wavyMarqueeTick);\n      if (container._wavyMarqueeResize) window.removeEventListener('resize', container\n        ._wavyMarqueeResize);\n\n      const list = container.querySelector('[data-wavy-marquee-list]');\n      if (!list) return;\n\n      const originals = [...list.querySelectorAll('[data-wavy-marquee-item]')].map((item) => item\n        .cloneNode(true));\n      if (!originals.length) return;\n\n      const baseDirection = container.dataset.wavyMarqueeDirection === 'flipped' ? 1 : -1;\n      const setX = gsap.quickSetter(list, 'x', 'px');\n      const fullCircle = Math.PI * 2;\n\n      let items = [];\n      let loopWidth = 0,\n        waveLength = 0,\n        averageWidth = 1,\n        travel = 0,\n        pausePadding = 0;\n      let speed = 1,\n        targetSpeed = 1,\n        direction = baseDirection;\n      let isActive = false,\n        isDragging = false;\n      let [speedScale, waveScale, arch] = getViewport();\n\n      // Marge boven/onder de container voordat de animatie pauzeert\n      const getPauseMargin = () => pausePadding + innerHeight * pauseBuffer;\n\n      function addBatch() {\n        const fragment = document.createDocumentFragment();\n        originals.forEach((item) => fragment.appendChild(item.cloneNode(true)));\n        list.appendChild(fragment);\n      }\n\n      function buildLoop() {\n        list.innerHTML = '';\n\n        addBatch();\n        addBatch();\n\n        const firstItems = [...list.querySelectorAll('[data-wavy-marquee-item]')];\n        loopWidth = firstItems[originals.length].offsetLeft - firstItems[0].offsetLeft;\n\n        for (let i = 2; i < Math.max(2, Math.ceil(container.offsetWidth / loopWidth) + 1); i++) {\n          addBatch();\n        }\n\n        items = [...list.querySelectorAll('[data-wavy-marquee-item]')];\n\n        const originalItems = firstItems.slice(0, originals.length);\n        averageWidth = originalItems.reduce((sum, item) => sum + item.offsetWidth, 0) / originals\n          .length;\n        waveLength = arch ? container.offsetWidth * 2 :\n          Math.max(container.offsetWidth, averageWidth * itemsPerWave) * waveScale;\n\n        let maxHeight = 0;\n\n        for (const item of items) {\n          item._x = item.offsetLeft;\n          item._width = item.offsetWidth;\n          item._height = item.offsetHeight;\n          item._setY = gsap.quickSetter(item, 'y', 'px');\n          maxHeight = Math.max(maxHeight, item._height);\n        }\n\n        pausePadding = maxHeight * (Math.abs(waveY) + 1);\n        render();\n      }\n\n      function render() {\n        if (!loopWidth || !waveLength) return;\n\n        const x = gsap.utils.wrap(-loopWidth, 0, travel);\n        const dynamicWaveY = waveY + (speed - 1) * waveBoost;\n        const phaseTravel = travel / waveLength * fullCircle * waveTravel;\n        const containerWidth = container.offsetWidth;\n\n        setX(x);\n\n        for (const item of items) {\n          const itemX = item._x + x;\n          if (itemX + item._width < 0 || itemX > containerWidth) continue;\n\n          // Boog rekent vanaf het midden van het item: top in het midden van het scherm,\n          // even laag aan beide randen (zelfde hoogteverschil als de golf)\n          if (arch) {\n            const phase = ((itemX + item._width / 2) / containerWidth - 0.5) * Math.PI + phaseTravel;\n            item._setY((1 - 2 * Math.cos(phase)) * item._height * dynamicWaveY);\n          } else {\n            const phase = itemX / waveLength * fullCircle + phaseTravel;\n            item._setY(Math.sin(phase) * item._height * dynamicWaveY);\n          }\n        }\n      }\n\n      function tick(_, deltaTime) {\n        if (!isActive || !loopWidth) return;\n\n        // Snelheid beweegt vloeiend naar de doel-snelheid, doel-snelheid zakt terug naar 1\n        const ease = isDragging ? dragEase : scrollEase;\n        speed += (targetSpeed - speed) * ease;\n        targetSpeed += (1 - targetSpeed) * ease;\n\n        travel += autoSpeed * speedScale * speed * direction * deltaTime / 1000;\n        render();\n      }\n\n      container._wavyMarqueeObserver = Observer.create({\n        target: container,\n        type: 'touch,pointer',\n        lockAxis: true,\n        onChangeX: (self) => {\n          if (!isActive || !self.deltaX) return;\n\n          isDragging = true;\n          container.style.cursor = 'grabbing';\n          direction = self.deltaX > 0 ? 1 : -1;\n\n          const dragAmount = Math.abs(self.deltaX) / averageWidth * 100 * dragSpeed;\n          targetSpeed = Math.min(1 + dragAmount, maxDragSpeed);\n        },\n        onRelease: () => {\n          isDragging = false;\n          container.style.cursor = 'grab';\n        }\n      });\n\n      container._wavyMarqueeTrigger = ScrollTrigger.create({\n        trigger: container,\n        start: () => `top-=${getPauseMargin()}px bottom`,\n        end: () => `bottom+=${getPauseMargin()}px top`,\n        invalidateOnRefresh: true,\n        onToggle: (self) => isActive = self.isActive,\n        onUpdate: (self) => {\n          if (isDragging) return;\n\n          direction = self.direction === 1 ? -baseDirection : baseDirection;\n          // Boost via targetSpeed, zodat het vloeiend in- en uitfadet\n          targetSpeed = Math.max(targetSpeed, 1 + Math.abs(self.getVelocity()) *\n            scrollSpeed);\n        }\n      });\n\n      buildLoop();\n      ScrollTrigger.refresh();\n\n      isActive = container._wavyMarqueeTrigger.isActive || ScrollTrigger.isInViewport(container);\n      container._wavyMarqueeTick = tick;\n      gsap.ticker.add(tick);\n\n      container._wavyMarqueeResize = debounceOnWidthChange(() => {\n        [speedScale, waveScale, arch] = getViewport();\n        buildLoop();\n        ScrollTrigger.refresh();\n      }, 150);\n\n      window.addEventListener('resize', container._wavyMarqueeResize);\n    });\n  }\n\n  function debounceOnWidthChange(fn, ms) {\n    let last = innerWidth,\n      timer;\n    return function (...args) {\n      clearTimeout(timer);\n      timer = setTimeout(() => {\n        if (innerWidth !== last) {\n          last = innerWidth;\n          fn.apply(this, args);\n        }\n      }, ms);\n    };\n  }\n\n  // Voordelen-tabs (doelgroeppagina's): [data-dg-tabs] met knoppen [data-dg-tab] en panelen\n  // [data-dg-tab-panel] in dezelfde volgorde. Wisselt vanzelf (data-dg-duration in ms, standaard\n  // 6000); de lijn onder de actieve tab loopt mee als timer. Pauzeert bij hover, focus en buiten\n  // beeld. Overgangen staan in Global CSS v2 (panelen krijgen data-state=\"active|past|future\").\n  let dgTabsCount = 0;\n\n  function initDgTabs() {\n    document.querySelectorAll('[data-dg-tabs]').forEach((root) => {\n      const tabs = [...root.querySelectorAll('[data-dg-tab]')];\n      const panels = [...root.querySelectorAll('[data-dg-tab-panel]')];\n      if (!tabs.length || tabs.length !== panels.length) return;\n\n      const duration = parseInt(root.getAttribute('data-dg-duration'), 10) || 6000;\n      const autoplay = !window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n      const bars = tabs.map((tab) => tab.querySelector('.dg-benefits_progress-bar'));\n      const prefix = `dg-tabs-${++dgTabsCount}`;\n      let current = 0;\n      let elapsed = 0;\n      let last = 0;\n      let running = false;\n      let inView = false;\n      let hovered = false;\n      let focused = false;\n\n      // Tabs en panelen aan elkaar koppelen voor schermlezers\n      tabs.forEach((tab, i) => {\n        tab.id = `${prefix}-tab-${i + 1}`;\n        panels[i].id = `${prefix}-panel-${i + 1}`;\n        tab.setAttribute('aria-controls', panels[i].id);\n        panels[i].setAttribute('aria-labelledby', tab.id);\n      });\n\n      function show(index) {\n        const prev = current;\n        current = (index + tabs.length) % tabs.length;\n        elapsed = 0;\n        tabs.forEach((tab, i) => {\n          const active = i === current;\n          tab.setAttribute('aria-selected', String(active));\n          tab.tabIndex = active ? 0 : -1;\n          if (bars[i]) bars[i].style.transform = `scaleX(${active && !autoplay ? 1 : 0})`;\n        });\n        panels.forEach((panel, i) => {\n          let state = 'future';\n          if (i === current) state = 'active';\n          else if (i === prev) state = 'past';\n          panel.setAttribute('data-state', state);\n          panel.setAttribute('aria-hidden', String(i !== current));\n        });\n      }\n\n      function tick(now) {\n        if (!inView) {\n          running = false;\n          return;\n        }\n        const dt = last ? Math.min(now - last, 100) : 0;\n        last = now;\n        if (!hovered && !focused && !document.hidden) {\n          elapsed += dt;\n          if (bars[current]) bars[current].style.transform = `scaleX(${Math.min(elapsed / duration, 1)})`;\n          if (elapsed >= duration) show(current + 1);\n        }\n        requestAnimationFrame(tick);\n      }\n\n      function start() {\n        if (running || !autoplay) return;\n        running = true;\n        last = 0;\n        requestAnimationFrame(tick);\n      }\n\n      tabs.forEach((tab, i) => {\n        tab.addEventListener('click', (e) => {\n          e.preventDefault();\n          if (i !== current) show(i);\n        });\n      });\n\n      // Pijltjestoetsen tussen de tabs (WAI-ARIA tabs)\n      root.addEventListener('keydown', (e) => {\n        if (!e.target.closest('[data-dg-tab]')) return;\n        const keys = { ArrowRight: 1, ArrowDown: 1, ArrowLeft: -1, ArrowUp: -1 };\n        let next = null;\n        if (e.key in keys) next = current + keys[e.key];\n        else if (e.key === 'Home') next = 0;\n        else if (e.key === 'End') next = tabs.length - 1;\n        if (next === null) return;\n        e.preventDefault();\n        show(next);\n        tabs[current].focus();\n      });\n\n      // Alleen pauzeren als de muis op de tekst van een paneel staat (niet op tabs of afbeelding)\n      root.querySelectorAll('.dg-benefits_content').forEach((text) => {\n        text.addEventListener('mouseenter', () => { hovered = true; });\n        text.addEventListener('mouseleave', () => { hovered = false; });\n      });\n      // Toetsenbordfocus pauzeert ook (een muisklik op een tab niet)\n      root.addEventListener('focusin', (e) => { focused = e.target.matches(':focus-visible'); });\n      root.addEventListener('focusout', (e) => {\n        if (!root.contains(e.relatedTarget)) focused = false;\n      });\n\n      new IntersectionObserver((entries) => {\n        inView = entries[0].isIntersecting;\n        if (inView) start();\n      }, { threshold: 0.25 }).observe(root);\n\n      root.setAttribute('data-dg-ready', '');\n      show(0);\n    });\n  }\n\n  // Naadloze rij (Osmo \"Draggable Infinite Slider\", de bekende GSAP horizontalLoop-helper).\n  // Elke kaart schuift los via xPercent op één tijdlijn; wat links uit beeld gaat, komt achteraan\n  // terug, dus geen klonen nodig. Twee aanvullingen op Osmo: dragClickables (slepen mag ook op de\n  // video-knop) en timeline.destroy() (alles terugzetten bij een filterwissel).\n  function horizontalLoop(items, config) {\n    let timeline;\n    items = gsap.utils.toArray(items);\n    config = config || {};\n    const ctx = gsap.context(() => {\n      let onChange = config.onChange, lastIndex = 0,\n        tl = gsap.timeline({repeat: config.repeat, onUpdate: onChange && function() { let i = tl.closestIndex(); if (lastIndex !== i) { lastIndex = i; onChange(items[i], i); } }, paused: config.paused, defaults: {ease: \"none\"}, onReverseComplete: () => tl.totalTime(tl.rawTime() + tl.duration() * 100)}),\n        length = items.length, startX = items[0].offsetLeft, times = [], widths = [], spaceBefore = [], xPercents = [], curIndex = 0, indexIsDirty = false, center = config.center, pixelsPerSecond = (config.speed || 1) * 100,\n        snap = config.snap === false ? v => v : gsap.utils.snap(config.snap || 1), timeOffset = 0,\n        container = center === true ? items[0].parentNode : gsap.utils.toArray(center)[0] || items[0].parentNode, totalWidth,\n        getTotalWidth = () => items[length-1].offsetLeft + xPercents[length-1] / 100 * widths[length-1] - startX + spaceBefore[0] + items[length-1].offsetWidth * gsap.getProperty(items[length-1], \"scaleX\") + (parseFloat(config.paddingRight) || 0),\n        populateWidths = () => { let b1 = container.getBoundingClientRect(), b2; items.forEach((el, i) => { widths[i] = parseFloat(gsap.getProperty(el, \"width\", \"px\")); xPercents[i] = snap(parseFloat(gsap.getProperty(el, \"x\", \"px\")) / widths[i] * 100 + gsap.getProperty(el, \"xPercent\")); b2 = el.getBoundingClientRect(); spaceBefore[i] = b2.left - (i ? b1.right : b1.left); b1 = b2; }); gsap.set(items, { xPercent: i => xPercents[i] }); totalWidth = getTotalWidth(); },\n        timeWrap,\n        populateOffsets = () => { timeOffset = center ? tl.duration() * (container.offsetWidth / 2) / totalWidth : 0; center && times.forEach((t, i) => { times[i] = timeWrap(tl.labels[\"label\" + i] + tl.duration() * widths[i] / 2 / totalWidth - timeOffset); }); },\n        getClosest = (values, value, wrap) => { let i = values.length, closest = 1e10, index = 0, d; while (i--) { d = Math.abs(values[i] - value); if (d > wrap / 2) { d = wrap - d; } if (d < closest) { closest = d; index = i; } } return index; },\n        populateTimeline = () => { let i, item, curX, distanceToStart, distanceToLoop; tl.clear(); for (i = 0; i < length; i++) { item = items[i]; curX = xPercents[i] / 100 * widths[i]; distanceToStart = item.offsetLeft + curX - startX + spaceBefore[0]; distanceToLoop = distanceToStart + widths[i] * gsap.getProperty(item, \"scaleX\"); tl.to(item, {xPercent: snap((curX - distanceToLoop) / widths[i] * 100), duration: distanceToLoop / pixelsPerSecond}, 0).fromTo(item, {xPercent: snap((curX - distanceToLoop + totalWidth) / widths[i] * 100)}, {xPercent: xPercents[i], duration: (curX - distanceToLoop + totalWidth - curX) / pixelsPerSecond, immediateRender: false}, distanceToLoop / pixelsPerSecond).add(\"label\" + i, distanceToStart / pixelsPerSecond); times[i] = distanceToStart / pixelsPerSecond; } timeWrap = gsap.utils.wrap(0, tl.duration()); },\n        refresh = (deep) => { let progress = tl.progress(); tl.progress(0, true); populateWidths(); deep && populateTimeline(); populateOffsets(); deep && tl.draggable ? tl.time(times[curIndex], true) : tl.progress(progress, true); },\n        onResize = () => refresh(true), proxy;\n      gsap.set(items, {x: 0}); populateWidths(); populateTimeline(); populateOffsets(); window.addEventListener(\"resize\", onResize);\n      function toIndex(index, vars) { vars = vars || {}; (Math.abs(index - curIndex) > length / 2) && (index += index > curIndex ? -length : length); let newIndex = gsap.utils.wrap(0, length, index), time = times[newIndex]; if (time > tl.time() !== index > curIndex && index !== curIndex) { time += tl.duration() * (index > curIndex ? 1 : -1); } if (time < 0 || time > tl.duration()) { vars.modifiers = {time: timeWrap}; } curIndex = newIndex; vars.overwrite = true; gsap.killTweensOf(proxy); return vars.duration === 0 ? tl.time(timeWrap(time)) : tl.tweenTo(time, vars); }\n      tl.toIndex = (index, vars) => toIndex(index, vars);\n      tl.closestIndex = setCurrent => { let index = getClosest(times, tl.time(), tl.duration()); if (setCurrent) { curIndex = index; indexIsDirty = false; } return index; };\n      tl.current = () => indexIsDirty ? tl.closestIndex(true) : curIndex;\n      tl.next = vars => toIndex(tl.current()+1, vars);\n      tl.previous = vars => toIndex(tl.current()-1, vars);\n      tl.times = times;\n      tl.progress(1, true).progress(0, true);\n      if (config.reversed) { tl.vars.onReverseComplete(); tl.reverse(); }\n      if (config.draggable && typeof(Draggable) === \"function\") {\n        proxy = document.createElement(\"div\");\n        let wrap = gsap.utils.wrap(0, 1), ratio, startProgress, draggable, dragSnap, lastSnap, initChangeX, wasPlaying,\n          align = () => tl.progress(wrap(startProgress + (draggable.startX - draggable.x) * ratio)),\n          syncIndex = () => tl.closestIndex(true);\n        draggable = Draggable.create(proxy, {\n          trigger: items[0].parentNode, type: \"x\", dragClickables: true,\n          onPressInit() { let x = this.x; gsap.killTweensOf(tl); wasPlaying = !tl.paused(); tl.pause(); startProgress = tl.progress(); refresh(); ratio = 1 / totalWidth; initChangeX = (startProgress / -ratio) - x; gsap.set(proxy, {x: startProgress / -ratio}); },\n          onDrag: align, onThrowUpdate: align, overshootTolerance: 0, inertia: true,\n          snap(value) { if (Math.abs(startProgress / -ratio - this.x) < 10) { return lastSnap + initChangeX } let time = -(value * ratio) * tl.duration(), wrappedTime = timeWrap(time), snapTime = times[getClosest(times, wrappedTime, tl.duration())], dif = snapTime - wrappedTime; Math.abs(dif) > tl.duration() / 2 && (dif += dif < 0 ? tl.duration() : -tl.duration()); lastSnap = (time + dif) / tl.duration() / -ratio; return lastSnap; },\n          onRelease() { syncIndex(); draggable.isThrowing && (indexIsDirty = true); },\n          onThrowComplete: () => { syncIndex(); wasPlaying && tl.play(); }\n        })[0];\n        tl.draggable = draggable;\n      }\n      tl.closestIndex(true); lastIndex = curIndex; onChange && onChange(items[curIndex], curIndex); timeline = tl;\n      return () => window.removeEventListener(\"resize\", onResize);\n    });\n    timeline.destroy = () => {\n      if (timeline.draggable) timeline.draggable.kill();\n      ctx.revert();\n    };\n    return timeline;\n  }\n\n  // Ervaringen-slider (doelgroeppagina's), dots naar Osmo \"Logo Card Testimonials\".\n  // [data-dg-testimonials] bevat een rij kaarten ([data-dg-track] > [data-dg-slide] met\n  // data-dg-category) en een bolletjes-rij ([data-dg-dots] met één voorbeeld-[data-dg-dot]).\n  // De filterknoppen [data-dg-filter] in dezelfde sectie tonen alleen die doelgroep; de rij wordt\n  // dan opnieuw opgebouwd met horizontalLoop (hierboven): oneindig, sleepbaar met inertie, de\n  // actieve kaart in het midden van de sectie. Het actieve bolletje loopt vol als timer\n  // (data-dg-autoplay in seconden, 0 = alleen klikken). Pauzeert bij hover, focus en buiten beeld.\n  // Geen tekst-animatie meer (te druk voor de doelgroep); alleen de zijkaarten vervagen (CSS).\n  function initDgTestimonials() {\n    const roots = document.querySelectorAll('[data-dg-testimonials]');\n    if (!roots.length || !window.gsap) return;\n    const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n    // Draggable + InertiaPlugin komen niet met Webflow mee; zonder slepen werkt de rij ook\n    const plugins = [\n      window.Draggable ? null : loadScript(LIBS.draggable),\n      window.InertiaPlugin ? null : loadScript(LIBS.inertia)\n    ];\n    Promise.allSettled(plugins).then(() => {\n      ['Draggable', 'InertiaPlugin'].forEach((name) => {\n        if (window[name]) gsap.registerPlugin(window[name]);\n      });\n      roots.forEach((root) => setupDgTestimonials(root, reduceMotion));\n    });\n  }\n\n  function setupDgTestimonials(root, reduceMotion) {\n    const section = root.closest('section') || document.body;\n    const track = root.querySelector('[data-dg-track]');\n    const allSlides = [...root.querySelectorAll('[data-dg-slide]')];\n    const dotsWrap = root.querySelector('[data-dg-dots]');\n    const dotTemplate = dotsWrap && dotsWrap.querySelector('[data-dg-dot]');\n    const filters = [...section.querySelectorAll('[data-dg-filter]')];\n    const filterWrap = filters.length ? filters[0].parentElement : null;\n    if (!track || !allSlides.length || !dotTemplate) return;\n    if (filterWrap) filterWrap.style.setProperty('--toggle-count', filters.length);\n\n    // Knoppen zijn zo breed als hun tekst: het blokje krijgt de plek en breedte van de actieve knop\n    // en rekt mee bij het wisselen (CSS: .dg-filter.is-measured)\n    let activeFilter = 0;\n    function placeToggle() {\n      const button = filters[activeFilter];\n      if (!filterWrap || !button) return;\n      const first = !filterWrap.classList.contains('is-measured');\n      const bg = first && filterWrap.querySelector('.dg-filter_bg');\n      if (bg) bg.style.transition = 'none';\n      filterWrap.style.setProperty('--toggle-x', `${button.offsetLeft}px`);\n      filterWrap.style.setProperty('--toggle-w', `${button.offsetWidth}px`);\n      filterWrap.classList.add('is-measured');\n      if (bg) {\n        void bg.offsetWidth;\n        bg.style.transition = '';\n      }\n    }\n    if (filterWrap && window.ResizeObserver) {\n      const resize = new ResizeObserver(() => placeToggle());\n      [filterWrap, ...filters].forEach((el) => resize.observe(el));\n    }\n\n    const seconds = parseFloat(root.getAttribute('data-dg-autoplay'));\n    const duration = (isNaN(seconds) ? 6 : seconds) * 1000;\n    const autoplay = duration > 0 && !reduceMotion;\n    const move = { ease: 'power3', duration: reduceMotion ? 0 : 0.725 };\n    dotTemplate.remove();\n    track.style.justifyContent = 'flex-start';\n\n    let slides = []; // echte kaarten van de gekozen doelgroep\n    let items = []; // wat in de loop zit: de kaarten, op brede schermen plus klonen\n    let category = null;\n    let dots = [];\n    let loop = null;\n    let active = -1; // index in slides (voor bolletjes en timer)\n    let current = -1; // index in items (de kaart in het midden)\n    let elapsed = 0;\n    let last = 0;\n    let running = false;\n    let inView = false;\n    let held = false;\n    let dragged = false;\n    let steering = false; // tijdens een klik/autoplay-beweging staat de actieve kaart al vast\n\n    // De rij loopt tot de randen van de sectie, zodat kaarten pas buiten beeld achteraan terugkomen.\n    // De negatieve marges staan al native op .dg-testimonials_track (per breakpoint); hier alleen\n    // bijsturen als die afwijken (bv. schuifbalk), zodat de rij na het laden niet verspringt (CLS).\n    function bleed() {\n      const cs = getComputedStyle(track);\n      const ml = parseFloat(cs.marginLeft) || 0;\n      const mr = parseFloat(cs.marginRight) || 0;\n      const s = section.getBoundingClientRect();\n      const t = track.getBoundingClientRect();\n      const left = ml + s.left - t.left;\n      const right = mr + t.right - s.right;\n      if (Math.abs(left - ml) > 0.5) track.style.marginLeft = `${left}px`;\n      if (Math.abs(right - mr) > 0.5) track.style.marginRight = `${right}px`;\n    }\n\n    function fill(i, value) {\n      const el = dots[i] && dots[i].querySelector('[data-dg-dot-fill]');\n      if (el) el.style.transform = `scaleX(${value})`;\n    }\n\n    // Vanuit de loop (ook tijdens slepen): actieve kaart, bolletjes en timer bijwerken\n    function setActive(itemIndex) {\n      itemIndex = ((itemIndex % items.length) + items.length) % items.length;\n      if (itemIndex === current) return;\n      current = itemIndex;\n      active = itemIndex % slides.length;\n      elapsed = 0;\n      items.forEach((el, i) => el.setAttribute('data-dg-active', String(i === current)));\n      slides.forEach((slide, i) => {\n        const on = i === active;\n        slide.setAttribute('aria-hidden', String(!on));\n        slide.querySelectorAll('a, button').forEach((el) => { el.tabIndex = on ? 0 : -1; });\n      });\n      dots.forEach((dot, i) => {\n        dot.setAttribute('aria-current', String(i === active));\n        fill(i, i === active && !autoplay ? 1 : 0);\n      });\n    }\n\n    // Klik, bolletje of autoplay: de doelkaart wordt meteen actief, zodat de blur gelijk met de\n    // beweging verschuift (niet halverwege omklapt)\n    function steer(itemIndex) {\n      if (!loop) return;\n      setActive(itemIndex);\n      steering = !reduceMotion;\n      loop.toIndex(itemIndex, { ...move, onComplete: () => { steering = false; } });\n    }\n\n    // Naar kaart i van de doelgroep: met klonen de dichtstbijzijnde kopie daarvan\n    function goTo(i) {\n      if (!loop) return;\n      let best = i;\n      const len = items.length;\n      for (let j = i; j < len; j += slides.length) {\n        const d = Math.min(Math.abs(j - current), len - Math.abs(j - current));\n        const bd = Math.min(Math.abs(best - current), len - Math.abs(best - current));\n        if (d < bd) best = j;\n      }\n      steer(best);\n    }\n\n    // Eén ronde kaarten moet breder zijn dan de sectie plus één kaart, anders komt er zichtbaar\n    // een kaart terug. Op heel brede schermen daarom extra rondes klonen (aria-hidden, niet bedienbaar).\n    function roundsNeeded() {\n      const gap = parseFloat(getComputedStyle(track).columnGap) || 0;\n      const round = slides.reduce((sum, s) => sum + s.offsetWidth + gap, 0) || 1;\n      const widest = Math.max(...slides.map((s) => s.offsetWidth));\n      return Math.max(1, Math.ceil((section.clientWidth + widest) / round));\n    }\n\n    function removeClones() {\n      track.querySelectorAll('[data-dg-clone]').forEach((c) => c.remove());\n    }\n\n    let rounds = 1;\n\n    let swapToken = 0;\n\n    // Wisselen van doelgroep: rij en bolletjes vervagen, kaarten wisselen onzichtbaar, dan weer in beeld\n    function setFilter(category, animate) {\n      // Schuivend blokje achter de actieve filter (naar Osmo \"Toggle Switch\")\n      const filterIndex = filters.findIndex((f) => f.getAttribute('data-dg-filter') === category);\n      if (filterWrap && filterIndex > -1) {\n        filterWrap.style.setProperty('--toggle-active', filterIndex);\n        activeFilter = filterIndex;\n        placeToggle();\n      }\n      filters.forEach((f, i) => {\n        f.setAttribute('aria-selected', String(i === filterIndex));\n        f.tabIndex = i === filterIndex ? 0 : -1;\n      });\n\n      const token = ++swapToken;\n      if (!animate || reduceMotion || !track.animate) {\n        showCategory(category);\n        return;\n      }\n      held = true;\n      const fadeOut = { duration: 250, easing: 'ease-in', fill: 'forwards' };\n      // Vanaf de huidige zichtbaarheid, zodat snel doorklikken niet verspringt\n      const outs = [track, dotsWrap].map((el) =>\n        el.animate([{ opacity: getComputedStyle(el).opacity }, { opacity: 0 }], fadeOut));\n      let swapped = false;\n      const swap = () => {\n        if (swapped || token !== swapToken) return; // al gedaan, of alweer een andere filter gekozen\n        swapped = true;\n        // Ook vervaging van eerdere klikken opruimen (die blijven anders op 0 staan)\n        [track, dotsWrap].forEach((el) => el.getAnimations().forEach((anim) => anim.cancel()));\n        showCategory(category);\n        const fadeIn = { duration: 450, easing: 'cubic-bezier(.22, .61, .36, 1)' };\n        [track, dotsWrap].forEach((el) => el.animate([{ opacity: 0 }, { opacity: 1 }], fadeIn));\n        held = root.matches(':hover') || root.contains(document.activeElement);\n      };\n      outs[0].finished.then(swap).catch(() => {});\n      setTimeout(swap, 320); // vangnet als de animatie niet afrondt (bv. tab op de achtergrond)\n    }\n\n    function showCategory(cat, startAt) {\n      if (loop) loop.destroy();\n      loop = null;\n      removeClones();\n      category = cat;\n      slides = allSlides.filter((s) => s.getAttribute('data-dg-category') === cat);\n      if (!slides.length) slides = allSlides;\n      // Zonder overgang wisselen, anders knippert de opacity/blur van de zijkaarten\n      allSlides.forEach((s) => {\n        s.style.transition = 'none';\n        s.hidden = !slides.includes(s);\n        s.removeAttribute('data-dg-active');\n      });\n      dotsWrap.replaceChildren();\n      dots = slides.map((slide, i) => {\n        const dot = dotTemplate.cloneNode(true);\n        dot.setAttribute('aria-label', `Ervaring ${i + 1} van ${slides.length}`);\n        dot.addEventListener('click', () => goTo(i));\n        dotsWrap.appendChild(dot);\n        return dot;\n      });\n      dotsWrap.hidden = slides.length < 2;\n      active = -1;\n      current = -1;\n      items = slides;\n      track.style.marginLeft = '';\n      track.style.marginRight = '';\n      track.style.justifyContent = slides.length > 1 ? 'flex-start' : 'center';\n      if (slides.length > 1) {\n        rounds = roundsNeeded();\n        for (let r = 1; r < rounds; r++) {\n          const copies = slides.map((s) => {\n            const c = s.cloneNode(true);\n            c.setAttribute('data-dg-clone', '');\n            c.setAttribute('aria-hidden', 'true');\n            c.querySelectorAll('a, button').forEach((el) => { el.tabIndex = -1; });\n            return c;\n          });\n          track.append(...copies);\n          items = items.concat(copies);\n        }\n        bleed();\n        steering = false;\n        loop = horizontalLoop(items, {\n          paused: true,\n          draggable: true,\n          center: section,\n          paddingRight: parseFloat(getComputedStyle(track).columnGap) || 0,\n          onChange: (el, i) => { if (!steering) setActive(i); }\n        });\n        loop.toIndex(startAt || 0, { duration: 0 });\n        if (loop.draggable) {\n          // Slepen neemt het over van een lopende klik-beweging\n          loop.draggable.addEventListener('press', () => { steering = false; });\n          loop.draggable.addEventListener('dragstart', () => {\n            dragged = true;\n            held = true;\n            root.setAttribute('data-dg-dragging', '');\n          });\n          loop.draggable.addEventListener('release', () => {\n            root.removeAttribute('data-dg-dragging');\n            held = root.matches(':hover');\n          });\n        }\n      }\n      setActive(startAt || 0);\n      void track.offsetWidth;\n      allSlides.forEach((s) => { s.style.transition = ''; });\n    }\n\n    function tick(now) {\n      if (!inView) {\n        running = false;\n        return;\n      }\n      const dt = last ? Math.min(now - last, 100) : 0;\n      last = now;\n      if (!held && !document.hidden && slides.length > 1) {\n        elapsed += dt;\n        fill(active, Math.min(elapsed / duration, 1));\n        if (elapsed >= duration) {\n          elapsed = 0;\n          steer(current + 1);\n        }\n      }\n      requestAnimationFrame(tick);\n    }\n\n    function start() {\n      if (running || !autoplay) return;\n      running = true;\n      last = 0;\n      requestAnimationFrame(tick);\n    }\n\n    // Klik op een kaart naast de actieve: eerst daarheen schuiven (niet meteen de video starten).\n    // Na slepen telt de klik niet.\n    track.addEventListener('click', (e) => {\n      if (dragged) {\n        dragged = false;\n        e.preventDefault();\n        e.stopPropagation();\n        return;\n      }\n      const i = items.indexOf(e.target.closest('[data-dg-slide]'));\n      if (i === -1 || i === current) return;\n      e.preventDefault();\n      e.stopPropagation();\n      steer(i);\n    }, true);\n    track.addEventListener('pointerdown', () => { dragged = false; });\n\n    filters.forEach((f, i) => {\n      f.addEventListener('click', (e) => {\n        e.preventDefault();\n        if (f.getAttribute('aria-selected') === 'true') return;\n        setFilter(f.getAttribute('data-dg-filter'), true);\n      });\n      // Pijltjes links/rechts tussen de filters\n      f.addEventListener('keydown', (e) => {\n        const dir = e.key === 'ArrowRight' ? 1 : e.key === 'ArrowLeft' ? -1 : 0;\n        if (!dir) return;\n        e.preventDefault();\n        const next = filters[(i + dir + filters.length) % filters.length];\n        setFilter(next.getAttribute('data-dg-filter'), true);\n        next.focus();\n      });\n    });\n\n    root.addEventListener('pointerenter', () => { held = true; });\n    root.addEventListener('pointerleave', () => { held = false; });\n    root.addEventListener('focusin', () => { held = true; });\n    root.addEventListener('focusout', (e) => {\n      if (!root.contains(e.relatedTarget)) held = false;\n    });\n\n    // Vóór de resize van de loop zelf (die meet daarna alles opnieuw)\n    // Breder geworden en te weinig kaarten: opnieuw opbouwen met klonen (op dezelfde kaart)\n    window.addEventListener('resize', () => {\n      if (!loop) return;\n      if (roundsNeeded() !== rounds) showCategory(category, active);\n      else bleed();\n    });\n    new IntersectionObserver((entries) => {\n      inView = entries[0].isIntersecting;\n      if (inView) start();\n    }).observe(root);\n\n    root.setAttribute('data-dg-ready', '');\n    // Startfilter: data-dg-start op de root (component-prop \"Start-filter\"), anders aria-selected, anders de eerste\n    const startFilter = (root.getAttribute('data-dg-start') || '').trim().toLowerCase();\n    const first =\n      filters.find((f) => startFilter && f.getAttribute('data-dg-filter') === startFilter) ||\n      filters.find((f) => f.getAttribute('aria-selected') === 'true') ||\n      filters[0];\n    setFilter(first ? first.getAttribute('data-dg-filter') : null);\n  }\n\n  // FAQ-accordeon (zoals op de Echo-site, naar Osmo \"Accordion CSS\"): [data-accordion-css-init]\n  // om de lijst, [data-accordion-status] per item, [data-accordion-toggle] op de knop.\n  // Openen/sluiten (hoogte-animatie) gebeurt in CSS; data-accordion-close-siblings=\"true\" = één tegelijk open.\n  function initAccordionCSS() {\n    document.querySelectorAll('[data-accordion-css-init]').forEach((accordion) => {\n      const closeSiblings = accordion.getAttribute('data-accordion-close-siblings') === 'true';\n\n      function setStatus(item, open) {\n        item.setAttribute('data-accordion-status', open ? 'active' : 'not-active');\n        const toggle = item.querySelector('[data-accordion-toggle]');\n        if (toggle) toggle.setAttribute('aria-expanded', String(open));\n      }\n\n      // Pas nu dicht: zonder JS (en in de Designer) staan alle antwoorden open.\n      // Eerst zonder overgang dichtklappen, een frame later de animaties aanzetten.\n      accordion.setAttribute('data-accordion-ready', 'on');\n      requestAnimationFrame(() => requestAnimationFrame(() => {\n        accordion.setAttribute('data-accordion-ready', 'live');\n      }));\n\n      accordion.addEventListener('click', (event) => {\n        const toggle = event.target.closest('[data-accordion-toggle]');\n        if (!toggle) return;\n        const item = toggle.closest('[data-accordion-status]');\n        if (!item) return;\n        const isActive = item.getAttribute('data-accordion-status') === 'active';\n        setStatus(item, !isActive);\n        if (closeSiblings && !isActive) {\n          accordion.querySelectorAll('[data-accordion-status=\"active\"]').forEach((sibling) => {\n            if (sibling !== item) setStatus(sibling, false);\n          });\n        }\n      });\n    });\n  }\n\n  // Video-popup (doelgroeppagina's): een knop met [data-dg-video-play] en data-vimeo-id=\"123456\"\n  // opent die Vimeo-video in een <dialog>. Een YouTube-ID of een Vimeo-/YouTube-link mag ook. Sluiten (Esc, kruisje of klik naast de video) haalt\n  // de iframe weg, zodat het geluid direct stopt. Opmaak staat in Global CSS v2 (.dg-video-dialog).\n  // Staande video's: data-vimeo-ratio=\"9/16\" op de knop (standaard 16/9).\n  // Vimeo-nummer, YouTube-ID (11 tekens) of een volledige link → embed-adres, anders null.\n  // dnt=1 en youtube-nocookie: geen tracking-cookies\n  function videoEmbedSrc(value) {\n    const v = (value || '').trim();\n    const vimeo = /^(?:https?:\\/\\/)?(?:www\\.|player\\.)?(?:vimeo\\.com\\/(?:video\\/)?)?(\\d+)(?:[/?#].*)?$/.exec(v);\n    if (vimeo) return `https://player.vimeo.com/video/${vimeo[1]}?autoplay=1&dnt=1&title=0&byline=0&portrait=0`;\n    const yt = /(?:youtu\\.be\\/|[?&]v=|\\/embed\\/|\\/shorts\\/)([\\w-]{11})/.exec(v) || /^([\\w-]{11})$/.exec(v);\n    if (yt) return `https://www.youtube-nocookie.com/embed/${yt[1]}?autoplay=1&rel=0`;\n    return null;\n  }\n\n  function initVideoPopup() {\n    const buttons = document.querySelectorAll('[data-dg-video-play][data-vimeo-id]');\n    if (!buttons.length) return;\n\n    let dialog = null;\n    let frame = null;\n    let lastButton = null;\n\n    function build() {\n      dialog = document.createElement('dialog');\n      dialog.className = 'dg-video-dialog';\n      dialog.setAttribute('aria-label', 'Video');\n      dialog.innerHTML =\n        '<button type=\"button\" class=\"dg-video-dialog_close\" aria-label=\"Video sluiten\">' +\n        '<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6L6 18\"/></svg>' +\n        '</button><div class=\"dg-video-dialog_frame\"></div>';\n      frame = dialog.querySelector('.dg-video-dialog_frame');\n\n      dialog.querySelector('.dg-video-dialog_close').addEventListener('click', close);\n      // Klik naast de video (op de achtergrond) sluit ook\n      dialog.addEventListener('click', (e) => {\n        if (e.target === dialog) close();\n      });\n      // Esc geeft eerst 'cancel'; 'close' als vangnet. Opruimen mag vaker gebeuren.\n      dialog.addEventListener('cancel', cleanup);\n      dialog.addEventListener('close', cleanup);\n      document.body.appendChild(dialog);\n    }\n\n    // Direct (niet pas op het close-event) de iframe weghalen, zodat het geluid meteen stopt\n    function cleanup() {\n      frame.innerHTML = '';\n      if (window.lenis) window.lenis.start();\n      if (lastButton) {\n        lastButton.focus();\n        lastButton = null;\n      }\n    }\n\n    function close() {\n      cleanup();\n      if (dialog.open) dialog.close();\n    }\n\n    function open(button) {\n      const src = videoEmbedSrc(button.getAttribute('data-vimeo-id'));\n      if (!src) return;\n      if (!dialog) build();\n      lastButton = button;\n\n      const iframe = document.createElement('iframe');\n      iframe.src = src;\n      iframe.title = button.getAttribute('aria-label') || 'Video';\n      iframe.allow = 'autoplay; fullscreen; picture-in-picture';\n      iframe.setAttribute('allowfullscreen', '');\n      frame.replaceChildren(iframe);\n\n      // Andere verhouding dan 16/9: frame zo groot mogelijk binnen het scherm (zelfde marges als de CSS)\n      const ratio = /^\\s*(\\d+(?:\\.\\d+)?)\\s*[/:]\\s*(\\d+(?:\\.\\d+)?)\\s*$/.exec(button.getAttribute('data-vimeo-ratio') || '');\n      if (ratio && +ratio[1] > 0 && +ratio[2] > 0) {\n        frame.style.aspectRatio = `${ratio[1]} / ${ratio[2]}`;\n        frame.style.width = `min(100%, 70rem, calc((100dvh - 9rem) * ${ratio[1]} / ${ratio[2]}))`;\n      } else {\n        frame.style.aspectRatio = '';\n        frame.style.width = '';\n      }\n\n      if (window.lenis) window.lenis.stop();\n      dialog.showModal();\n    }\n\n    // Via de document-klik, zodat ook gekloonde kaarten (ervaringen-slider) werken\n    document.addEventListener('click', (e) => {\n      const button = e.target.closest('[data-dg-video-play][data-vimeo-id]');\n      if (!button) return;\n      e.preventDefault();\n      open(button);\n    });\n  }\n\n\n  // Laposta: custom formulier ([data-laposta-wrap]) versturen zoals Laposta's eigen validate.js:\n  // eenmalig token + rekenpuzzel (spambeveiliging), dan een gewone formulierpost in een verborgen iframe.\n  // Laposta stuurt bij een gelukte aanmelding door naar \"next\" (een adres op onze eigen site);\n  // komt het iframe daar uit, dan tonen we [data-laposta-success], anders [data-laposta-error].\n  // Vervangt het oude iframe-script in Site settings → Footer.\n\n  const LAPOSTA_DEBUG = false; // op true zetten om de stappen in de console te zien\n\n  const LAPOSTA_TEXT = {\n    loading: 'Bezig…',\n    invalid: 'Vul je e-mailadres in en kies wie je bent.',\n    invalidEmail: 'Vul nog je e-mailadres in.',\n    invalidRole: 'Kies nog wie je bent.',\n    error: 'Er ging iets mis. Controleer je e-mailadres en probeer het opnieuw.'\n  };\n\n  const LAPOSTA_TOKEN_PATH = '/subscribe/check/token.php';\n  const LAPOSTA_POW_PATH = '/subscribe/check/pow.js?v=260827';\n  // Doorstuuradres na een gelukte aanmelding: klein bestand op de eigen site, alleen in het iframe\n  const LAPOSTA_NEXT_URL = window.location.origin + '/robots.txt';\n\n  // Muis- of touchactiviteit op de pagina (signaal voor Laposta's botcheck)\n  let lapostaPointerSeen = false;\n  ['pointerdown', 'mousedown', 'mousemove', 'touchstart'].forEach((type) => {\n    document.addEventListener(type, (e) => {\n      if (e.isTrusted) lapostaPointerSeen = true;\n    }, { passive: true });\n  });\n\n  function initLapostaForms() {\n    const wraps = document.querySelectorAll('[data-laposta-wrap]');\n    lapostaLog(`Klaar: ${wraps.length} formulier(en) gevonden`);\n    wraps.forEach((wrap, index) => {\n      const form = wrap.querySelector('[data-laposta-form]');\n      if (!form || form.__laposta) return;\n      form.__laposta = true;\n\n      const action = new URL(form.getAttribute('action'), window.location.href);\n      const success = wrap.querySelector('[data-laposta-success]');\n      const error = wrap.querySelector('[data-laposta-error]');\n      const errorText = error ? error.querySelector('[data-laposta-error-text]') || error : null;\n      const label = form.querySelector('[data-laposta-label]');\n      const labelText = label ? label.textContent : '';\n      const honeypot = form.querySelector('[data-hp]');\n      const radios = form.querySelectorAll('input[type=\"radio\"]');\n      const openedAt = Date.now();\n      let busy = false;\n\n      // Puzzelscript pas laden als iemand het formulier gebruikt (geen extra script + cookie bij elke paginaweergave)\n      form.addEventListener('focusin', () => loadLapostaPow(action.origin).catch(() => {}), { once: true });\n\n      // Verborgen iframe: het formulier post hierin, zodat de pagina blijft staan\n      const frame = document.createElement('iframe');\n      frame.name = 'laposta-post-' + index;\n      frame.title = 'Laposta';\n      frame.tabIndex = -1;\n      frame.setAttribute('aria-hidden', 'true');\n      frame.style.cssText = 'position:absolute;width:0;height:0;border:0;visibility:hidden;';\n      wrap.appendChild(frame);\n\n      // Interactie met het formulier (signaal voor Laposta's botcheck)\n      let interacted = false;\n      let firstInteractionAt = 0;\n      ['focusin', 'input', 'keydown'].forEach((type) => {\n        form.addEventListener(type, (e) => {\n          if (!e.isTrusted || (e.target && e.target.type === 'hidden')) return;\n          interacted = true;\n          if (!firstInteractionAt) firstInteractionAt = Date.now();\n        });\n      });\n\n      // Radio tiles: checked-state als attribuut, zodat styling altijd direct meekomt\n      function syncRadios() {\n        radios.forEach((radio) => {\n          const tile = radio.closest('.radiocheck-field');\n          if (tile) tile.setAttribute('data-checked', radio.checked ? 'true' : 'false');\n        });\n      }\n      radios.forEach((radio) => radio.addEventListener('change', syncRadios));\n      syncRadios();\n\n      function reveal(el) {\n        if (!el) return;\n        el.style.display = 'block';\n        if (window.gsap) gsap.fromTo(el, { opacity: 0, y: 8 }, {\n          opacity: 1,\n          y: 0,\n          duration: 0.4,\n          ease: 'power2.out'\n        });\n      }\n\n      function hide(el) {\n        if (el) el.style.display = 'none';\n      }\n\n      function setLoading(isLoading) {\n        busy = isLoading;\n        if (label) label.textContent = isLoading ? LAPOSTA_TEXT.loading : labelText;\n        form.setAttribute('aria-busy', isLoading ? 'true' : 'false');\n        wrap.setAttribute('data-laposta-state', isLoading ? 'loading' : 'idle');\n      }\n\n      function showSuccess() {\n        form.reset();\n        syncRadios();\n        hide(form);\n        hide(error);\n        reveal(success);\n        wrap.setAttribute('data-laposta-state', 'success');\n      }\n\n      function showError(message) {\n        if (errorText) errorText.textContent = message || LAPOSTA_TEXT.error;\n        reveal(error);\n        wrap.setAttribute('data-laposta-state', 'error');\n      }\n\n      // Melding noemt alleen wat nog ontbreekt: e-mail, rol of allebei\n      const emailInput = form.querySelector('input[type=\"email\"]:not([data-hp])');\n      let invalidShown = false;\n      function missingText() {\n        const emailOk = !emailInput || (emailInput.value.trim() !== '' && emailInput.checkValidity());\n        const roleOk = !form.querySelector('input[type=\"radio\"]') || !!form.querySelector('input[type=\"radio\"]:checked');\n        if (emailOk && roleOk) return '';\n        if (emailOk) return LAPOSTA_TEXT.invalidRole;\n        if (roleOk) return LAPOSTA_TEXT.invalidEmail;\n        return LAPOSTA_TEXT.invalid;\n      }\n      // Staat de melding er al, dan loopt hij mee met wat je invult (en verdwijnt als alles klopt)\n      ['input', 'change'].forEach((type) => form.addEventListener(type, () => {\n        if (!invalidShown) return;\n        const text = missingText();\n        if (text) {\n          showError(text);\n        } else {\n          invalidShown = false;\n          hide(error);\n          wrap.setAttribute('data-laposta-state', 'idle');\n        }\n      }));\n\n      // Capture + stopImmediatePropagation: oude submit-handlers (iframe-script) draaien niet mee\n      form.addEventListener('submit', async (e) => {\n        e.preventDefault();\n        e.stopImmediatePropagation();\n        if (busy) return;\n        hide(error);\n        invalidShown = false;\n\n        // Valideren via initAdvancedFormValidation (TESTCODE)\n        if (typeof form.__validate === 'function' && !form.__validate()) {\n          lapostaLog('Niet verstuurd: e-mail of rol niet goed ingevuld');\n          showError(missingText() || LAPOSTA_TEXT.invalid);\n          invalidShown = true;\n          return;\n        }\n\n        // Honeypot ingevuld = bot: doe alsof het gelukt is, niets versturen\n        if (honeypot && honeypot.value) {\n          showSuccess();\n          return;\n        }\n\n        setLoading(true);\n        try {\n          const ok = await sendToLaposta(form, frame, action, {\n            openedAt,\n            interacted,\n            firstInteractionAt\n          });\n          setLoading(false);\n          if (ok) showSuccess();\n          else showError();\n        } catch (err) {\n          lapostaLog('Versturen mislukt', err);\n          setLoading(false);\n          showError();\n        }\n      }, true);\n    });\n  }\n\n  async function sendToLaposta(form, frame, action, signals) {\n    const account = form.querySelector('input[name=\"a\"]');\n    const list = form.querySelector('input[name=\"l\"]');\n\n    setLapostaField(form, 'next', LAPOSTA_NEXT_URL);\n    setLapostaField(form, 'submit-duration', String(Date.now() - signals.openedAt));\n    setLapostaField(form, 'subscribe-token', '');\n    setLapostaField(form, 'subscribe-pow', '');\n\n    // Eenmalig token + rekenpuzzel, net als Laposta's validate.js\n    const token = await requestLapostaToken(action, account && account.value, list && list.value,\n      lapostaBehaviour(signals));\n    if (token) {\n      setLapostaField(form, 'subscribe-token', token.token);\n      if (token.challenge) {\n        const solution = await solveLapostaPow(token.challenge, action.origin);\n        if (solution) setLapostaField(form, 'subscribe-pow', solution);\n      }\n    }\n    lapostaLog('Verstuurt', Object.fromEntries(new FormData(form)));\n\n    return new Promise((resolve) => {\n      const timer = setTimeout(() => {\n        frame.removeEventListener('load', onLoad);\n        resolve(false);\n      }, 15000);\n\n      function onLoad() {\n        clearTimeout(timer);\n        // Doorgestuurd naar \"next\" (eigen domein) = gelukt; Laposta-pagina (ander domein) = fout\n        let landedHome = false;\n        try {\n          landedHome = frame.contentWindow.location.origin === window.location.origin;\n        } catch (err) {}\n        lapostaLog(landedHome ? 'Gelukt: doorgestuurd naar next' :\n          'Laposta toonde een eigen pagina (fout)');\n        resolve(landedHome);\n      }\n\n      frame.addEventListener('load', onLoad, { once: true });\n      form.setAttribute('target', frame.name);\n      form.submit(); // gewone post, triggert geen submit-event\n    });\n  }\n\n  function setLapostaField(form, name, value) {\n    let field = form.querySelector(`input[name=\"${name}\"]`);\n    if (!field) {\n      field = document.createElement('input');\n      field.type = 'hidden';\n      field.name = name;\n      form.appendChild(field);\n    }\n    field.value = value;\n  }\n\n  // Botcheck-signalen als \"i.p.w.c.t\", zoals validate.js ze meestuurt\n  function lapostaBehaviour(signals) {\n    const nav = window.navigator || {};\n    const headless = !!(nav.userAgent && nav.userAgent.indexOf('Chrome/') !== -1 && !window.chrome);\n    return [\n      signals.interacted ? 1 : 0,\n      lapostaPointerSeen ? 1 : 0,\n      nav.webdriver ? 1 : 0,\n      headless ? 1 : 0,\n      Math.min(signals.firstInteractionAt ? Date.now() - signals.firstInteractionAt : 0, 9999999)\n    ].join('.');\n  }\n\n  async function requestLapostaToken(action, account, list, behaviour) {\n    if (!account || !list) return null;\n    const url = new URL(LAPOSTA_TOKEN_PATH, action.origin);\n    url.searchParams.set('a', account);\n    url.searchParams.set('l', list);\n    url.searchParams.set('p', '1');\n    url.searchParams.set('b', behaviour);\n    try {\n      const res = await fetch(url, {\n        credentials: 'omit',\n        headers: { Accept: 'application/json' }\n      });\n      if (!res.ok) return null;\n      const json = await res.json();\n      lapostaLog('Token', json && json.token ? 'ontvangen' : 'geen', json && json.challenge);\n      return json && json.token ? json : null;\n    } catch (err) {\n      lapostaLog('Token mislukt', err);\n      return null;\n    }\n  }\n\n  function loadLapostaPow(origin) {\n    if (window.LapostaPow) return Promise.resolve();\n    return loadScript(origin + LAPOSTA_POW_PATH);\n  }\n\n  async function solveLapostaPow(challenge, origin) {\n    try {\n      await loadLapostaPow(origin);\n    } catch (err) {\n      return null;\n    }\n    if (!window.LapostaPow) return null;\n    return new Promise((resolve) => {\n      window.LapostaPow.solve(challenge.salt, challenge.difficulty, resolve, { maxMs: 8000 });\n    });\n  }\n\n  function lapostaLog(...args) {\n    if (LAPOSTA_DEBUG) console.log('[Laposta]', ...args);\n  }\n\n\n  // ---------- Homepage, Over ons en Onze missie ----------\n  // Voorheen script-embeds op de pagina's; nu staan HTML en stijl in Webflow (Global CSS v2 voor wat\n  // Webflow niet kan) en de code hier. Een sectie met nog een oude script-embed (.w-script) slaan we over.\n\n  // ---------- Homepage: het verhaal in 3 stappen (hp-story) ----------\n  // Een vast beeld dat meebeweegt met de tekst: 1 kriskras netwerk, 2 de puzzel valt in elkaar,\n  // 3 iedereen verbonden via OZO. Tekst en stappen staan in Webflow ([data-hp-story], [data-hp-step]);\n  // de tekening (SVG) komt in de lege [data-hp-stage]. Scroll-animatie met GSAP ScrollTrigger.\n  function initHpStory() {\n    const root = document.querySelector('[data-hp-story]');\n    // Een oude script-embed in de sectie regelt het zelf nog (overgang)\n    if (!root || root.hasAttribute('data-hp-ready') || root.querySelector('.w-script')) return;\n    if (!window.gsap || !window.ScrollTrigger) return;\n    var NS = 'http://www.w3.org/2000/svg';\n    var W = 640, H = 560, CX = 320, CY = 285, AR = 26, PW = 176, PH = 136, HR = 64, PZ = 1.22;\n    var INK = '#351b7c';\n    var T = {\n      client: { fg: '#7469e8', bg: '#dcd8fd', piece: '#e3defd', ink: '#5446c4' },\n      pro: { fg: '#2f7c7a', bg: '#b4e5e7', piece: '#a8e6e8', ink: '#1b6260' },\n      gem: { fg: '#f39a5e', bg: '#ffe0cc', piece: '#ffdcc6', ink: '#d0631f' },\n      it: { fg: '#d1b03a', bg: '#f8eda8', piece: '#f8eba3', ink: '#8a7108' }\n    };\n    // a = plek in stap 1, p = plek op de puzzel, ang = plek rond OZO (om de 36°, Cliënt bovenaan)\n    // Op de puzzel één poppetje per stuk: sub schuift naar de plek van de eerste van de groep en vervaagt,\n    // late (IT-partner) hoort niet bij de chaos en komt pas bij de puzzel in beeld\n    var NODES = [\n      { r: 'Cliënt', t: 'client', a: [320, 285], p: [232, 205], ang: -90, big: 1 },\n      { r: 'Mantelzorger', t: 'client', a: [548, 128], p: [232, 205], ang: 54, sub: 1 },\n      { r: 'Huisarts', t: 'pro', a: [128, 110], p: [408, 205], ang: -54 },\n      { r: 'GGZ', t: 'pro', a: [520, 470], p: [408, 205], ang: -18, sub: 1 },\n      { r: 'Apotheek', t: 'pro', a: [110, 455], p: [408, 205], ang: -126, sub: 1 },\n      { r: 'Gemeente', t: 'gem', a: [72, 270], p: [232, 341], ang: 198 },\n      { r: 'Ziekenhuis', t: 'pro', a: [300, 505], p: [408, 205], ang: 162, sub: 1 },\n      { r: 'VVT', t: 'pro', a: [578, 300], p: [408, 205], ang: 18, sub: 1 },\n      { r: 'School', t: 'pro', a: [320, 62], p: [408, 205], ang: 90, sub: 1 },\n      { r: 'IT-partner', t: 'it', a: [408, 341], p: [408, 341], ang: 126, late: 1 }\n    ];\n    // stap 1 (netwerk) en stap 3 (OZO in het midden) iets kleiner dan de puzzel\n    var K = 0.9;\n    NODES.forEach(function (n) { n.a = [CX + (n.a[0] - CX) * K, CY + (n.a[1] - CY) * K]; });\n    var PAINS = [\n      [1, 'Heeft iemand de huisarts al gebeld?'],\n      [0, 'Ik hoor alles pas achteraf.'],\n      [3, 'Weer twintig minuten in de wacht…'],\n      [8, 'Zijn de ouders/verzorgers al geïnformeerd?'],\n      [4, 'Klopt deze medicatielijst nog?'],\n      [5, 'Staat de inwoner centraal?'],\n      [2, 'Wie heeft het laatste overzicht?'],\n      [6, 'Wie neemt de nazorg over na ontslag?'],\n      [7, 'Is de overdracht uit het ziekenhuis al binnen?']\n    ];\n    var PAIRS = [[0, 3], [1, 4], [2, 6], [5, 1], [7, 2], [6, 0], [3, 5], [4, 7], [2, 1], [0, 5], [8, 4], [8, 7]];\n    // e = randen boven/rechts/onder/links: 0 recht, 1 nop naar buiten, -1 naar binnen\n    var PIECES = [\n      { t: 'client', l: 'Cliënt & familie', o: [CX - PW, CY - PH], e: [0, -1, 1, 0], c: [16, 0, 0, 0], d: [-1, -1], r: -16 },\n      { t: 'pro', l: 'Professionals', o: [CX, CY - PH], e: [0, 0, 1, 1], c: [0, 16, 0, 0], d: [1, -1], r: 14 },\n      { t: 'gem', l: 'Gemeenten', o: [CX - PW, CY], e: [-1, -1, 0, 0], c: [0, 0, 0, 16], d: [-1, 1], r: 12 },\n      { t: 'it', l: 'IT-partners', o: [CX, CY], e: [-1, 0, 0, 1], c: [0, 0, 16, 0], d: [1, 1], r: -12 }\n    ];\n    // Op de puzzel krijgt elk stuk een icoon (Material Symbols, viewBox 0 -960 960 960)\n    var ICON = {\n      client: 'M0-240v-63q0-43 44-70t116-27q13 0 25 .5t23 2.5q-14 21-21 44t-7 48v65H0Zm240 0v-65q0-32 17.5-58.5T307-410q32-20 76.5-30t96.5-10q53 0 97.5 10t76.5 30q32 20 49 46.5t17 58.5v65H240Zm540 0v-65q0-26-6.5-49T754-397q11-2 22.5-2.5t23.5-.5q72 0 116 26.5t44 70.5v63H780Zm-455-80h311q-10-20-55.5-35T480-370q-55 0-100.5 15T325-320ZM160-440q-33 0-56.5-23.5T80-520q0-34 23.5-57t56.5-23q34 0 57 23t23 57q0 33-23 56.5T160-440Zm640 0q-33 0-56.5-23.5T720-520q0-34 23.5-57t56.5-23q34 0 57 23t23 57q0 33-23 56.5T800-440Zm-320-40q-50 0-85-35t-35-85q0-51 35-85.5t85-34.5q51 0 85.5 34.5T600-600q0 50-34.5 85T480-480Zm0-80q17 0 28.5-11.5T520-600q0-17-11.5-28.5T480-640q-17 0-28.5 11.5T440-600q0 17 11.5 28.5T480-560Zm1 240Zm-1-280Z',\n      pro: 'M420-280h120v-100h100v-120H540v-100H420v100H320v120h100v100ZM160-120v-480l320-240 320 240v480H160Zm80-80h480v-360L480-740 240-560v360Zm240-270Z',\n      gem: 'M324-111.5Q251-143 197-197t-85.5-127Q80-397 80-480t31.5-156Q143-709 197-763t127-85.5Q397-880 480-880t156 31.5Q709-817 763-763t85.5 127Q880-563 880-480t-31.5 156Q817-251 763-197t-127 85.5Q563-80 480-80t-156-31.5ZM480-260q45-45 80-93 30-41 55-90t25-97q0-66-47-113t-113-47q-66 0-113 47t-47 113q0 48 25 97t55 90q35 48 80 93Zm-42.5-237.5Q420-515 420-540t17.5-42.5Q455-600 480-600t42.5 17.5Q540-565 540-540t-17.5 42.5Q505-480 480-480t-42.5-17.5Z',\n      it: 'M480-540ZM80-160v-80h400v80H80Zm120-120q-33 0-56.5-23.5T120-360v-360q0-33 23.5-56.5T200-800h560q33 0 56.5 23.5T840-720H200v360h280v80H200Zm600 40v-320H640v320h160Zm-180 80q-25 0-42.5-17.5T560-220v-360q0-25 17.5-42.5T620-640h200q25 0 42.5 17.5T880-580v360q0 25-17.5 42.5T820-160H620Zm100-300q13 0 21.5-9t8.5-21q0-13-8.5-21.5T720-520q-12 0-21 8.5t-9 21.5q0 12 9 21t21 9Zm0 60Z'\n    };\n\n    function clamp(v) { return v < 0 ? 0 : v > 1 ? 1 : v; }\n    function lerp(a, b, t) { return a + (b - a) * t; }\n    function lerp2(p, q, t) { return [lerp(p[0], q[0], t), lerp(p[1], q[1], t)]; }\n    function f(v) { return Math.round(v * 10) / 10; }\n    function backOut(x) { x = clamp(x) - 1; return 1 + 2.6 * x * x * x + 1.6 * x * x; }\n    function svg(tag, attrs, parent) {\n      var n = document.createElementNS(NS, tag);\n      for (var k in attrs) n.setAttribute(k, attrs[k]);\n      if (parent) parent.appendChild(n);\n      return n;\n    }\n    function div(cls, parent, text) {\n      var n = document.createElement('div');\n      n.className = cls;\n      if (text) n.textContent = text;\n      parent.appendChild(n);\n      return n;\n    }\n    var seed = 11;\n    function rnd(a, b) { seed = (seed * 16807) % 2147483647; return a + (b - a) * (seed - 1) / 2147483646; }\n\n    // Vloeiende lijn door alle punten (Catmull-Rom)\n    function curve(p) {\n      var d = 'M' + f(p[0][0]) + ',' + f(p[0][1]);\n      for (var i = 0; i < p.length - 1; i++) {\n        var p0 = p[i - 1] || p[i], p1 = p[i], p2 = p[i + 1], p3 = p[i + 2] || p2;\n        d += 'C' + f(p1[0] + (p2[0] - p0[0]) / 6) + ',' + f(p1[1] + (p2[1] - p0[1]) / 6) + ' ' +\n          f(p2[0] - (p3[0] - p1[0]) / 6) + ',' + f(p2[1] - (p3[1] - p1[1]) / 6) + ' ' + f(p2[0]) + ',' + f(p2[1]);\n      }\n      return d;\n    }\n    // Eerste deel (fractie fr) van een puntenreeks\n    function partial(p, fr) {\n      if (fr >= 1) return p;\n      var x = fr * (p.length - 1), i = Math.floor(x), out = p.slice(0, i + 1);\n      if (x > i) out.push(lerp2(p[i], p[i + 1], x - i));\n      return out.length > 1 ? out : [p[0], p[0]];\n    }\n    function pointAt(p, u) {\n      var n = p.length - 1, x = clamp(u) * n, i = Math.min(Math.floor(x), n - 1);\n      return lerp2(p[i], p[i + 1], x - i);\n    }\n    // Kriskras lijn van a naar b: een omweg via het midden\n    function chaosLine(a, b) {\n      var A = NODES[a].a, B = NODES[b].a, V = [CX + rnd(-100, 100) * K, CY + rnd(-80, 80) * K];\n      function jit(p, q, t, m) {\n        var x = lerp2(p, q, t), dx = q[0] - p[0], dy = q[1] - p[1], L = Math.hypot(dx, dy) || 1, o = rnd(-m, m);\n        return [x[0] - dy / L * o, x[1] + dx / L * o];\n      }\n      return [A, jit(A, V, 0.45, 35), V, jit(V, B, 0.55, 40), B];\n    }\n    // Puzzelstuk: rand met een echte nop (hals + bol), met de klok mee getekend.\n    // De noppen wijzen naar plekken zonder iconen of labels.\n    var TAB = [[-16, 0], [-9, 0, -7, 3, -8, 7], [-11, 14, -8, 22, 0, 22], [8, 22, 11, 14, 8, 7], [7, 3, 9, 0, 16, 0]];\n    function edge(P, Q, k) {\n      if (!k) return 'L' + Q;\n      var L = Math.hypot(Q[0] - P[0], Q[1] - P[1]), ux = (Q[0] - P[0]) / L, uy = (Q[1] - P[1]) / L;\n      var mx = (P[0] + Q[0]) / 2, my = (P[1] + Q[1]) / 2, nx = uy * k, ny = -ux * k;\n      function pt(du, dv) { return f(mx + ux * du + nx * dv) + ',' + f(my + uy * du + ny * dv); }\n      var d = 'L' + pt(TAB[0][0], TAB[0][1]);\n      for (var i = 1; i < TAB.length; i++) {\n        var c = TAB[i];\n        d += 'C' + pt(c[0], c[1]) + ' ' + pt(c[2], c[3]) + ' ' + pt(c[4], c[5]);\n      }\n      return d + 'L' + Q;\n    }\n    function piecePath(e, c) {\n      function arc(r, x, y) { return r ? 'A' + r + ',' + r + ' 0 0 1 ' + x + ',' + y : ''; }\n      return 'M' + c[0] + ',0' + edge([c[0], 0], [PW - c[1], 0], e[0]) + arc(c[1], PW, c[1]) +\n        edge([PW, c[1]], [PW, PH - c[2]], e[1]) + arc(c[2], PW - c[2], PH) +\n        edge([PW - c[2], PH], [c[3], PH], e[2]) + arc(c[3], 0, PH - c[3]) +\n        edge([0, PH - c[3]], [0, c[0]], e[3]) + arc(c[0], c[0], 0) + 'Z';\n    }\n    // Licht golvende cirkel rond OZO\n    function blobPath(r, t) {\n      var n = 40, pts = [];\n      for (var i = 0; i < n; i++) {\n        var a = i / n * Math.PI * 2;\n        var rr = r * (1 + 0.035 * Math.sin(3 * a + t * 1.1) + 0.025 * Math.sin(5 * a - t * 0.8) + 0.02 * Math.sin(2 * a + t * 0.6));\n        pts.push([Math.cos(a) * rr, Math.sin(a) * rr]);\n      }\n      var m = lerp2(pts[n - 1], pts[0], 0.5), d = 'M' + f(m[0]) + ',' + f(m[1]);\n      for (i = 0; i < n; i++) {\n        m = lerp2(pts[i], pts[(i + 1) % n], 0.5);\n        d += 'Q' + f(pts[i][0]) + ',' + f(pts[i][1]) + ' ' + f(m[0]) + ',' + f(m[1]);\n      }\n      return d + 'Z';\n    }\n\n    function setup(root) {\n      var stage = root.querySelector('[data-hp-stage]');\n      var steps = root.querySelector('[data-hp-steps]');\n      var stepEls = root.querySelectorAll('[data-hp-step]');\n      if (!stage || !steps || stepEls.length < 3) return;\n      var reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n      // Mobiel: tijdens de puzzel schuift het beeld omhoog, zodat de puzzel tegen de bovenkant staat\n      var mq = window.matchMedia('(max-width: 767px)'), LIFT = 50;\n\n      stage.innerHTML = '';\n      var s = svg('svg', { viewBox: '0 0 ' + W + ' ' + H, 'class': 'hp-story_svg', focusable: 'false' }, stage);\n      var defs = svg('defs', {}, s);\n      svg('circle', { r: AR }, svg('clipPath', { id: 'hpAvClip' }, defs));\n      var rg = svg('radialGradient', { id: 'hpGlow' }, defs);\n      svg('stop', { offset: '0', 'stop-color': '#fff', 'stop-opacity': '.95' }, rg);\n      svg('stop', { offset: '1', 'stop-color': '#fff', 'stop-opacity': '0' }, rg);\n\n      var glow = svg('circle', { cx: CX, cy: CY, r: 250, fill: 'url(#hpGlow)', opacity: 0 }, s);\n      var gChaos = svg('g', { fill: 'none', stroke: '#cdc7fa', 'stroke-width': 2.5, 'stroke-linecap': 'round', 'stroke-dasharray': '7 9' }, s);\n      var chaos = PAIRS.map(function (pr) {\n        return { a: pr[0], b: pr[1], pts: chaosLine(pr[0], pr[1]), el: svg('path', {}, gChaos) };\n      });\n      var gPieces = svg('g', {}, s);\n      var pieces = PIECES.map(function (p) {\n        var g = svg('g', { opacity: 0 }, gPieces);\n        svg('path', { d: piecePath(p.e, p.c), fill: T[p.t].piece, stroke: '#f6f1ee', 'stroke-width': 3, 'stroke-linejoin': 'round' }, g);\n        return { p: p, g: g };\n      });\n      var gRings = svg('g', { fill: 'none', stroke: '#c9c2f7', 'stroke-width': 1.5 }, s);\n      var rings = [svg('circle', { cx: CX, cy: CY, opacity: 0 }, gRings), svg('circle', { cx: CX, cy: CY, opacity: 0 }, gRings)];\n      var gLines = svg('g', { fill: 'none', 'stroke-width': 2, 'stroke-linecap': 'round', 'stroke-dasharray': '5 7' }, s);\n      var gDots = svg('g', {}, s);\n      var gHub = svg('g', { opacity: 0 }, s);\n      var hubBlob = svg('path', { fill: '#fff', stroke: INK, 'stroke-width': 2.5 }, gHub);\n      svg('text', { 'text-anchor': 'middle', y: 11, fill: INK, 'class': 'hp-story_hubtext' }, gHub).textContent = 'OZO';\n      var gChips = svg('g', {}, s);\n      var gNodes = svg('g', {}, s);\n\n      var nodes = NODES.map(function (n, i) {\n        var c = T[n.t], g = svg('g', {}, gNodes), rad = Math.PI / 180;\n        var halo = svg('circle', { r: AR + 6, fill: 'none', stroke: c.fg, 'stroke-width': 1.5, opacity: 0 }, g);\n        svg('circle', { r: AR, fill: c.bg }, g);\n        var cl = svg('g', { 'clip-path': 'url(#hpAvClip)' }, g);\n        svg('circle', { cy: -7, r: 9.5, fill: c.fg }, cl);\n        svg('ellipse', { cy: 21, rx: 17, ry: 13.5, fill: c.fg }, cl);\n        var icon = svg('path', { d: ICON[n.t], fill: c.fg, transform: 'scale(.036) translate(-480,480)', opacity: 0 }, g);\n        return {\n          n: n, g: g, halo: halo, fig: cl, icon: icon, line: svg('path', { stroke: c.fg }, gLines),\n          dots: [svg('circle', { r: 3.4, fill: c.fg, opacity: 0 }, gDots), svg('circle', { r: 3.4, fill: c.fg, opacity: 0 }, gDots)],\n          ring: [CX + 238 * K * Math.cos(n.ang * rad), CY + 200 * K * Math.sin(n.ang * rad)],\n          pz: [CX + (n.p[0] - CX) * PZ, CY + (n.p[1] - CY) * PZ],\n          pos: n.a.slice(), s: 1, ph: i * 1.37,\n          // In de ring (stap 3) staat het label van de bovenste helft boven het poppetje, zodat de lijn naar OZO er niet doorheen loopt\n          up: Math.sin(n.ang * rad) < -0.01\n        };\n      });\n      var chips = [0, 1].map(function () {\n        var g = svg('g', { opacity: 0 }, gChips);\n        svg('path', { d: 'M-9,-10H9A5,5 0 0 1 14,-5V3A5,5 0 0 1 9,8H-4L-9,13V8A5,5 0 0 1 -14,3V-5A5,5 0 0 1 -9,-10Z', fill: '#fff', stroke: INK, 'stroke-width': 1.4, 'stroke-linejoin': 'round' }, g);\n        [-6, 0, 6].forEach(function (x) { svg('circle', { cx: x, cy: -1, r: 1.6, fill: INK }, g); });\n        var q = svg('text', { 'text-anchor': 'middle', fill: INK, 'class': 'hp-story_q', opacity: 0 }, gChips);\n        q.textContent = '?';\n        return { g: g, q: q };\n      });\n\n      var ov = div('hp-story_overlay', stage);\n      var names = nodes.map(function (o) { return div('hp-story_name' + (o.n.big ? ' is-big' : ''), ov, o.n.r); });\n      var plabels = pieces.map(function (o) { return div('hp-story_plabel', ov, o.p.l); });\n      var painWrap = div('hp-story_pains', ov);\n      var pains = PAINS.map(function (p) { return { i: p[0], el: div('hp-story_pain', painWrap, p[1]) }; });\n      var S = { chaos: 1, toPuz: 0, puz: 0, puzOut: 0, toRing: 0, hub: 0, lines: 0, flow: 0 };\n\n      function render() {\n        var t = reduce ? 0 : performance.now() / 1000, e1 = S.toPuz, e2 = S.toRing;\n        var vy = mq.matches ? LIFT * e1 * (1 - e2) : 0;\n        s.setAttribute('viewBox', '0 ' + f(vy) + ' ' + W + ' ' + H);\n\n        nodes.forEach(function (o, i) {\n          var n = o.n, b = lerp2(lerp2(n.a, o.pz, e1), o.ring, e2), calm = (1 - e1) * 5 + e2 * 2.5 + 1.2;\n          var x = b[0] + Math.sin(t * 0.8 + o.ph) * calm + Math.sin(t * 3.3 + o.ph * 2) * 0.5 * S.chaos;\n          var y = b[1] + Math.cos(t * 0.7 + o.ph * 1.3) * calm;\n          var pzk = e1 * (1 - e2);\n          var sc = (1 - 0.12 * pzk) * (K + (1 - K) * pzk) * (n.big ? 1.15 : 1);\n          o.pos = [x, y];\n          o.s = sc;\n          o.g.setAttribute('transform', 'translate(' + f(x) + ',' + f(y) + ') scale(' + sc.toFixed(3) + ')');\n          var al = n.late ? clamp(e1 * 1.5) : n.sub ? 1 - clamp(pzk * 1.6) : 1;\n          o.al = al;\n          o.g.setAttribute('opacity', al.toFixed(2));\n          // Op de puzzel wordt het poppetje het icoon van de groep\n          var ic = clamp(pzk * 1.6 - 0.3);\n          o.fig.setAttribute('opacity', (1 - ic).toFixed(2));\n          o.icon.setAttribute('opacity', ic.toFixed(2));\n          var lo = (clamp(1 - e1 * 2.2) + clamp(e2 * 2.2 - 1.2)) * al;\n          var flip = o.up ? e2 : 0, off = AR * sc + 9;\n          names[i].style.cssText = 'left:' + f(x / W * 100) + '%;top:' + f((y - vy + off - 2 * off * flip) / H * 100) + '%;transform:translate(-50%,' + f(-100 * flip) + '%);opacity:' + lo.toFixed(2);\n        });\n\n        chaos.forEach(function (c, i) {\n          var fr = clamp(S.chaos * 1.35 - (i % 4) * 0.09);\n          if (fr <= 0) { c.el.setAttribute('d', ''); c.cur = null; return; }\n          var last = c.pts.length - 1;\n          var p = c.pts.map(function (q, k) {\n            if (k === 0) return nodes[c.a].pos;\n            if (k === last) return nodes[c.b].pos;\n            return [q[0] + Math.sin(t * 1.2 + k * 1.9 + i) * 1.5, q[1] + Math.cos(t * 1.05 + k * 1.3 + i) * 1.5];\n          });\n          c.cur = partial(p, fr);\n          c.el.setAttribute('d', curve(c.cur));\n          c.el.setAttribute('opacity', clamp(fr * 3).toFixed(2));\n        });\n        gChaos.setAttribute('stroke-dashoffset', f(-t * 14));\n\n        // Berichtjes die onderweg kwijtraken\n        var cm = reduce ? 0 : clamp((S.chaos - 0.6) * 3);\n        chips.forEach(function (ch, k) {\n          var v = t * 0.16 + k / 2, u = v % 1, c = chaos[(Math.floor(v) * 3 + k * 5) % chaos.length];\n          if (!cm || !c.cur) { ch.g.setAttribute('opacity', 0); ch.q.setAttribute('opacity', 0); return; }\n          var pt = pointAt(c.cur, 0.05 + Math.min(u, 0.5));\n          var o = u < 0.08 ? u / 0.08 : u < 0.5 ? 1 : u < 0.62 ? 1 - (u - 0.5) / 0.12 : 0;\n          var qo = u < 0.56 ? 0 : u < 0.66 ? (u - 0.56) / 0.1 : u < 0.9 ? 1 - (u - 0.66) / 0.24 : 0;\n          ch.g.setAttribute('transform', 'translate(' + f(pt[0]) + ',' + f(pt[1] - 4) + ')');\n          ch.g.setAttribute('opacity', (o * cm).toFixed(2));\n          ch.q.setAttribute('x', f(pt[0]));\n          ch.q.setAttribute('y', f(pt[1] - 18 - Math.max(0, u - 0.56) * 40));\n          ch.q.setAttribute('opacity', (k ? 0 : qo * cm).toFixed(2));\n        });\n\n        // Pijnpunten: steeds één tekstballon tegelijk\n        var active = Math.floor(t / 2.6) % pains.length;\n        painWrap.style.opacity = clamp((S.chaos - 0.6) * 3).toFixed(2);\n        pains.forEach(function (p, k) {\n          var o = nodes[p.i], x = o.pos[0], y = o.pos[1], below = y < 150;\n          var tx = x < 140 ? '-16%' : x > 500 ? '-84%' : '-50%';\n          p.el.style.left = f(x / W * 100) + '%';\n          p.el.style.top = f(((below ? y + AR * o.s + 30 : y - AR * o.s - 10) - vy) / H * 100) + '%';\n          p.el.style.setProperty('--tx', tx);\n          p.el.style.setProperty('--tail', tx === '-16%' ? '16%' : tx === '-84%' ? '84%' : '50%');\n          p.el.classList.toggle('is-below', below);\n          p.el.classList.toggle('is-on', k === active);\n        });\n\n        pieces.forEach(function (o, k) {\n          var p = o.p, e = backOut((S.puz - k * 0.1) / 0.7), eo = S.puzOut * S.puzOut;\n          var cx = CX + (p.o[0] + PW / 2 - CX) * PZ + p.d[0] * 150 * (1 - e), cy = CY + (p.o[1] + PH / 2 - CY) * PZ + p.d[1] * 110 * (1 - e);\n          cx = lerp(cx, CX, eo);\n          cy = lerp(cy, CY, eo) + Math.sin(t * 0.9 + k) * 1.5 * clamp(e) * (1 - eo);\n          var rot = p.r * (1 - e) - p.r * 2.5 * eo, sc = (0.7 + 0.3 * e) * (1 - 0.8 * eo) * PZ;\n          o.g.setAttribute('transform', 'translate(' + f(cx) + ',' + f(cy) + ') rotate(' + f(rot) + ') scale(' + sc.toFixed(3) + ') translate(' + (-PW / 2) + ',' + (-PH / 2) + ')');\n          o.g.setAttribute('opacity', (clamp(e * 1.5) * (1 - eo)).toFixed(3));\n          var lo = clamp(S.puz * 2.2 - 1.2) * (1 - clamp(S.puzOut * 3));\n          plabels[k].style.cssText = 'left:' + f(cx / W * 100) + '%;top:' + f((cy - vy + 40 * sc) / H * 100) + '%;opacity:' + lo.toFixed(2) + ';color:' + T[p.t].ink;\n        });\n\n        var hs = Math.max(backOut(S.hub), 0.001);\n        gHub.setAttribute('opacity', clamp(S.hub * 2).toFixed(2));\n        gHub.setAttribute('transform', 'translate(' + CX + ',' + CY + ') scale(' + (hs * K).toFixed(3) + ')');\n        hubBlob.setAttribute('d', blobPath(HR, t));\n        glow.setAttribute('opacity', (S.hub * 0.9).toFixed(2));\n        rings.forEach(function (r, k) {\n          var u = (t * 0.4 + k * 0.5) % 1;\n          r.setAttribute('r', f((HR + u * 120) * K));\n          r.setAttribute('opacity', ((1 - u) * 0.5 * S.flow).toFixed(3));\n        });\n\n        // Rustige lijnen van OZO naar iedereen, met informatie die heen en weer gaat\n        nodes.forEach(function (o, i) {\n          var fr = clamp(S.lines * 1.5 - i * 0.05);\n          o.halo.setAttribute('opacity', (S.flow * (0.25 + 0.2 * Math.sin(t * 2 + i))).toFixed(2));\n          if (fr <= 0) {\n            o.line.setAttribute('d', '');\n            o.dots[0].setAttribute('opacity', 0);\n            o.dots[1].setAttribute('opacity', 0);\n            return;\n          }\n          var dx = o.pos[0] - CX, dy = o.pos[1] - CY, L = Math.hypot(dx, dy), ux = dx / L, uy = dy / L;\n          var P0 = [CX + ux * (HR * K + 8), CY + uy * (HR * K + 8)];\n          var P2 = [o.pos[0] - ux * (AR * o.s + 8), o.pos[1] - uy * (AR * o.s + 8)];\n          var bend = i % 2 ? 14 : -14, P1 = [(P0[0] + P2[0]) / 2 - uy * bend, (P0[1] + P2[1]) / 2 + ux * bend];\n          var Q1 = lerp2(P0, P1, fr), Q2 = lerp2(Q1, lerp2(P1, P2, fr), fr);\n          o.line.setAttribute('d', 'M' + f(P0[0]) + ',' + f(P0[1]) + 'Q' + f(Q1[0]) + ',' + f(Q1[1]) + ' ' + f(Q2[0]) + ',' + f(Q2[1]));\n          o.line.setAttribute('opacity', '.75');\n          o.dots.forEach(function (d, k) {\n            var u = (t * 0.32 + i * 0.17 + k * 0.5) % 1;\n            if (i % 2) u = 1 - u;\n            var a = lerp2(lerp2(P0, P1, u), lerp2(P1, P2, u), u);\n            d.setAttribute('cx', f(a[0]));\n            d.setAttribute('cy', f(a[1]));\n            d.setAttribute('opacity', (Math.sin(Math.PI * u) * S.flow * (fr >= 1 ? 1 : 0)).toFixed(2));\n          });\n        });\n        gLines.setAttribute('stroke-dashoffset', f(-t * 12));\n      }\n\n      var tl = gsap.timeline({ paused: true, defaults: { ease: 'none' } });\n      // 0 = midden stap 1, 0.5 = midden stap 2, 1 = midden stap 3\n      tl.to(S, { chaos: 0, duration: 0.12, ease: 'power1.in' }, 0.13)\n        .to(S, { toPuz: 1, duration: 0.16, ease: 'power2.inOut' }, 0.18)\n        .to(S, { puz: 1, duration: 0.16 }, 0.19)\n        .to(S, { puzOut: 1, duration: 0.08, ease: 'power1.in' }, 0.6)\n        .to(S, { toRing: 1, duration: 0.15, ease: 'power2.inOut' }, 0.61)\n        .to(S, { hub: 1, duration: 0.09 }, 0.68)\n        .to(S, { lines: 1, duration: 0.1 }, 0.74)\n        .to(S, { flow: 1, duration: 0.06 }, 0.8)\n        .to({ x: 0 }, { x: 1, duration: 0.01 }, 0.99);\n\n      var cur = -1;\n      function setActive(p) {\n        var k = p < 0.25 ? 0 : p < 0.75 ? 1 : 2;\n        if (k === cur) return;\n        cur = k;\n        for (var i = 0; i < 3; i++) {\n          stepEls[i].classList.toggle('is-active', i === k);\n        }\n      }\n      setActive(0);\n\n      var mm = gsap.matchMedia();\n      mm.add({ desk: '(min-width: 768px)', mob: '(max-width: 767px)' }, function (ctx) {\n        // Desktop: tekst in het midden van het scherm. Mobiel: tekst onder het beeld.\n        var vis = root.querySelector('.hp-story_visual');\n        if (ctx.conditions.desk) {\n          ScrollTrigger.create({\n            trigger: stepEls[0], start: 'center center', endTrigger: stepEls[2], end: 'center center', animation: tl, scrub: 0.7,\n            onUpdate: function (self) { setActive(self.progress); }\n          });\n        } else {\n          // Mobiel: elke overgang hoort bij zijn eigen stap. Hij begint pas als het kopje van die stap\n          // (\"02 · Digitaal samen\", \"03 · De oplossing\") op 68% van het scherm staat en is klaar\n          // als het net onder het beeld staat, zodat beeld en tekst gelijk oplopen.\n          var SEG = [[0.13, 0.35], [0.6, 0.86]];\n          var land = function () {\n            // onderkant van het sticky beeld (top is negatief), plus een kleine marge\n            var vb = vis ? vis.offsetHeight + (parseFloat(getComputedStyle(vis).top) || 0) : 0;\n            return 'top ' + Math.round(Math.max(vb + 24, window.innerHeight * 0.35)) + 'px';\n          };\n          var segs = [];\n          var sync = function () {\n            if (segs.length < 2) return;\n            var a = segs[0].progress, b = segs[1].progress;\n            var t = b > 0 ? lerp(SEG[1][0], SEG[1][1], b) : a >= 1 ? 0.5 : lerp(SEG[0][0], SEG[0][1], a);\n            setActive(t);\n            gsap.to(tl, { time: t, duration: 0.7, ease: 'power3.out', overwrite: true });\n          };\n          [1, 2].forEach(function (i) {\n            segs.push(ScrollTrigger.create({\n              trigger: stepEls[i].firstElementChild || stepEls[i], start: 'top 68%', end: land,\n              onUpdate: sync, onRefresh: sync\n            }));\n          });\n          sync();\n        }\n        // De tekst vervaagt geleidelijk naar de randen, zonder sprong. Mobiel: onder het beeld en onderaan het scherm.\n        // Desktop: boven- en onderaan het scherm, zodat de stap naast de puzzel al leesbaar is voordat hij het midden bereikt.\n        var raf = 0;\n        function fade() {\n          raf = 0;\n          var vb = vis ? vis.getBoundingClientRect().bottom : 0, vh = window.innerHeight;\n          for (var i = 0; i < stepEls.length; i++) {\n            var el = stepEls[i];\n            if (!el.firstElementChild) continue;\n            var t = el.firstElementChild.getBoundingClientRect().top, b = el.lastElementChild.getBoundingClientRect().bottom;\n            var o = ctx.conditions.mob\n              ? Math.min(clamp((b - vb - 10) / 110), clamp((vh * 0.95 - t) / (vh * 0.35)))\n              : Math.min(clamp((b - vh * 0.12) / (vh * 0.2)), clamp((vh * 0.92 - t) / (vh * 0.3)));\n            el.style.transition = 'none';\n            el.style.opacity = (0.22 + 0.78 * o).toFixed(3);\n          }\n        }\n        function onScroll() { if (!raf) raf = requestAnimationFrame(fade); }\n        window.addEventListener('scroll', onScroll, { passive: true });\n        window.addEventListener('resize', onScroll);\n        fade();\n        return function () {\n          window.removeEventListener('scroll', onScroll);\n          window.removeEventListener('resize', onScroll);\n          for (var i = 0; i < stepEls.length; i++) { stepEls[i].style.opacity = ''; stepEls[i].style.transition = ''; }\n        };\n      });\n\n      var running = false;\n      new IntersectionObserver(function (es) {\n        var vis = es[0].isIntersecting;\n        if (vis && !running) gsap.ticker.add(render);\n        if (!vis && running) gsap.ticker.remove(render);\n        running = vis;\n      }, { rootMargin: '100px' }).observe(stage);\n      render();\n      root.setAttribute('data-hp-ready', '');\n      window.addEventListener('load', function () { ScrollTrigger.refresh(); });\n    }\n    gsap.registerPlugin(ScrollTrigger);\n    setup(root);\n  }\n\n  // ---------- Homepage en Onze missie: waarom OZO (hp-why) ----------\n  // Kaarten schuiven binnen; de illustraties (SVG-embeds in Webflow) bewegen alleen als ze in beeld zijn.\n  // 1: het netwerk rond de cliënt groeit, 3: een gesprekje op de telefoon. 2 en 4 lopen op CSS (Global CSS v2).\n  function initHpWhy() {\n    if (!window.gsap || !window.ScrollTrigger) return;\n\n    // Labels en tekstballonnen passend maken op de echte tekstbreedte (het lettertype van de site is breder\n    // dan een vaste schatting). [data-fit] = start | end | middle vanaf data-x; .fit-icon schuift mee.\n    function fitLabels(root) {\n      root.querySelectorAll('[data-fit]').forEach(function (g) {\n        var rect = g.querySelector('rect');\n        var texts = g.querySelectorAll(':scope > text');\n        var icon = g.querySelector(':scope > .fit-icon');\n        var pad = +g.getAttribute('data-pad') || 0, iw = +g.getAttribute('data-iw') || 0;\n        var gap = icon ? +(g.getAttribute('data-gap') || 6) : 0;\n        var tw = 0;\n        texts.forEach(function (t) { tw = Math.max(tw, t.getComputedTextLength()); });\n        if (!texts.length) tw = +rect.getAttribute('width') - pad * 2;\n        var w = Math.ceil(pad * 2 + iw + gap + tw), ax = +g.getAttribute('data-x'), mode = g.getAttribute('data-fit');\n        var x = mode === 'end' ? ax - w : mode === 'middle' ? ax - w / 2 : ax;\n        var dx = x - +rect.getAttribute('x');\n        rect.setAttribute('x', x);\n        rect.setAttribute('width', w);\n        var cy = +rect.getAttribute('y') + +rect.getAttribute('height') / 2;\n        if (icon) icon.setAttribute('transform', 'translate(' + (x + pad) + ' ' + cy + ')');\n        texts.forEach(function (t) { t.setAttribute('x', x + pad + iw + gap); });\n        // Losse onderdelen zonder tekst (typ-puntjes) schuiven mee met het vlak\n        if (!texts.length) g.querySelectorAll(':scope > circle').forEach(function (c) { c.setAttribute('cx', +c.getAttribute('cx') + dx); });\n      });\n      // Het hartje hangt aan de linkeronderhoek van het antwoord\n      var b2 = root.querySelector('.hpw3-b2 rect'), heart = root.querySelector('.hpw3-heart-pos');\n      if (b2 && heart) heart.setAttribute('transform', 'translate(' + (+b2.getAttribute('x') + 6) + ' ' + (+b2.getAttribute('y') + +b2.getAttribute('height')) + ')');\n    }\n\n    function setup(root) {\n      var reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n      fitLabels(root);\n      if (document.fonts && document.fonts.ready) document.fonts.ready.then(function () { fitLabels(root); });\n\n      // CSS-animaties lopen alleen als de sectie in beeld is\n      new IntersectionObserver(function (es) {\n        root.classList.toggle('is-live', es[0].isIntersecting);\n      }, { rootMargin: '60px' }).observe(root);\n\n      if (reduce) return;\n\n      // Kaarten schuiven rustig binnen (eerst verbergen, dan per groep binnenhalen)\n      gsap.set(root.querySelectorAll('.hp-why_card'), { autoAlpha: 0 });\n      ScrollTrigger.batch(root.querySelectorAll('.hp-why_card'), {\n        start: 'top 88%',\n        once: true,\n        onEnter: function (batch) {\n          gsap.fromTo(batch, { y: 48, autoAlpha: 0 }, { y: 0, autoAlpha: 1, duration: 0.9, ease: 'power3.out', stagger: 0.12, overwrite: true });\n        }\n      });\n\n      // Speelt een tijdlijn alleen af als de illustratie in beeld is\n      function whenVisible(el, tl) {\n        ScrollTrigger.create({\n          trigger: el, start: 'top bottom', end: 'bottom top',\n          onToggle: function (self) { self.isActive ? tl.play() : tl.pause(); }\n        });\n      }\n\n      // 1: één voor één sluit iemand aan op het netwerk van de cliënt\n      var s1 = root.querySelector('[data-hpw=\"1\"]');\n      if (s1) {\n        var lines = s1.querySelectorAll('.hpw1-line');\n        var toasts = s1.querySelectorAll('.hpw1-toast');\n        var tl1 = gsap.timeline({ repeat: -1, paused: true });\n        s1.querySelectorAll('.hpw1-sat').forEach(function (sat, i) {\n          var t = 0.4 + i * 1.3;\n          tl1.fromTo(lines[i], { strokeDashoffset: 1 }, { strokeDashoffset: 0, duration: 0.6, ease: 'power2.inOut' }, t)\n            .fromTo(sat.querySelector('.hpw1-av'), { scale: 0, transformOrigin: '50% 50%' }, { scale: 1, duration: 0.5, ease: 'back.out(2.2)' }, t + 0.4)\n            .fromTo(sat.querySelector('.hpw1-check'), { scale: 0, transformOrigin: '50% 50%' }, { scale: 1, duration: 0.35, ease: 'back.out(3)' }, t + 0.75)\n            .fromTo(toasts[i], { autoAlpha: 0, y: 8 }, { autoAlpha: 1, y: 0, duration: 0.35, ease: 'power2.out' }, t + 0.75)\n            .to(toasts[i], { autoAlpha: 0, y: -4, duration: 0.3, ease: 'power2.in' }, t + 1.9);\n        });\n        tl1.to(s1.querySelectorAll('.hpw1-line, .hpw1-av, .hpw1-check'), { autoAlpha: 0, duration: 0.5 }, 9)\n          .to({}, { duration: 0.6 });\n        whenVisible(s1, tl1);\n      }\n\n      // 3: een vraag, iemand typt, het antwoord komt binnen (het hartje is sinds 9 nov weg uit de tekening;\n      // staat het er nog in, dan speelt het gewoon mee)\n      var s3 = root.querySelector('[data-hpw=\"3\"]');\n      if (s3) {\n        var b1 = s3.querySelector('.hpw3-b1'), typing = s3.querySelector('.hpw3-typing');\n        var b2 = s3.querySelector('.hpw3-b2'), heart = s3.querySelector('.hpw3-heart'), send = s3.querySelector('.hpw3-send');\n        var tl3 = gsap.timeline({ repeat: -1, paused: true });\n        tl3.fromTo(send, { scale: 1, transformOrigin: '50% 50%' }, { scale: 0.85, duration: 0.15, yoyo: true, repeat: 1 }, 0.3)\n          .fromTo(b1, { autoAlpha: 0, y: 10 }, { autoAlpha: 1, y: 0, duration: 0.45, ease: 'back.out(1.6)' }, 0.5)\n          .fromTo(typing, { autoAlpha: 0, scale: 0.6, transformOrigin: '100% 50%' }, { autoAlpha: 1, scale: 1, duration: 0.3 }, 1.3)\n          .to(typing, { autoAlpha: 0, duration: 0.2 }, 2.5)\n          .fromTo(b2, { autoAlpha: 0, y: 10 }, { autoAlpha: 1, y: 0, duration: 0.45, ease: 'back.out(1.6)' }, 2.55);\n        if (heart) tl3.fromTo(heart, { scale: 0, transformOrigin: '50% 50%' }, { scale: 1, duration: 0.45, ease: 'back.out(3)' }, 3.4);\n        tl3.to(heart ? [b1, b2, heart] : [b1, b2], { autoAlpha: 0, duration: 0.4 }, 6.6)\n          .to({}, { duration: 0.5 });\n        whenVisible(s3, tl3);\n      }\n    }\n    gsap.registerPlugin(ScrollTrigger);\n    document.querySelectorAll('[data-hp-why]').forEach((root) => {\n      if (root.hasAttribute('data-hp-why-ready') || root.querySelector('.w-script')) return;\n      root.setAttribute('data-hp-why-ready', '');\n      setup(root);\n    });\n  }\n\n  // ---------- Homepage: videokaart met eigen speler (hp-video) ----------\n  // De kaart [data-hp-video] (Webflow, met data-src = mp4 en data-title) opent een eigen speler in een\n  // pop-up: een gewone <video> met onze eigen bediening (geen Vimeo-player). De kaart groeit uit tot\n  // de speler en krimpt bij sluiten terug. Stijl van de speler: Global CSS v2.\n  function initHpVideo() {\n    var ICON = {\n      play: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M8 5.6v12.8a1 1 0 0 0 1.52.85l10.4-6.4a1 1 0 0 0 0-1.7L9.52 4.75A1 1 0 0 0 8 5.6z\" fill=\"currentColor\"/></svg>',\n      pause: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><rect x=\"6\" y=\"5\" width=\"4.2\" height=\"14\" rx=\"1.3\" fill=\"currentColor\"/><rect x=\"13.8\" y=\"5\" width=\"4.2\" height=\"14\" rx=\"1.3\" fill=\"currentColor\"/></svg>',\n      replay: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M4.5 12a7.5 7.5 0 1 0 2.2-5.3\"/><path d=\"M4.5 4.5v3.8h3.8\"/></svg>',\n      sound: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M4 9.5h3.4L12 5.6v12.8l-4.6-3.9H4z\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M15.5 9.2a4 4 0 0 1 0 5.6M18.2 6.6a7.6 7.6 0 0 1 0 10.8\"/></svg>',\n      muted: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M4 9.5h3.4L12 5.6v12.8l-4.6-3.9H4z\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M16 9.5l5 5M21 9.5l-5 5\"/></svg>',\n      full: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M4 9V4h5M20 9V4h-5M4 15v5h5M20 15v5h-5\"/></svg>',\n      close: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6L6 18\"/></svg>'\n    };\n\n    function clamp(v) { return v < 0 ? 0 : v > 1 ? 1 : v; }\n    function fmt(s) {\n      s = isFinite(s) ? Math.max(0, Math.floor(s)) : 0;\n      return Math.floor(s / 60) + ':' + String(s % 60).padStart(2, '0');\n    }\n\n    function setup(card) {\n      var src = card.getAttribute('data-src');\n      if (!src) return;\n      var poster = card.getAttribute('data-poster') || '';\n      var title = card.getAttribute('data-title') || 'Video';\n      var reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n      var dlg, canvas, video, line, prog, buf, handle, tNow, tDur, muteBtn, playBtn, hideTimer, raf;\n      var scrubbing = false, busy = false;\n\n      function build() {\n        dlg = document.createElement('dialog');\n        dlg.className = 'hp-player';\n        dlg.setAttribute('aria-label', title);\n        dlg.innerHTML =\n          '<div class=\"hp-player_wrap\">' +\n          '<button type=\"button\" class=\"hp-player_close\" aria-label=\"Video sluiten\">' + ICON.close + '</button>' +\n          '<div class=\"hp-player_canvas\" data-status=\"idle\">' +\n          '<video class=\"hp-player_video\" playsinline preload=\"metadata\"></video>' +\n          (poster ? '<img class=\"hp-player_poster\" alt=\"\" src=\"' + poster + '\">' : '') +\n          '<button type=\"button\" class=\"hp-player_big\" aria-label=\"Afspelen\">' +\n          '<span class=\"i-play\">' + ICON.play + '</span><span class=\"i-replay\">' + ICON.replay + '</span></button>' +\n          '<span class=\"hp-player_spinner\" aria-hidden=\"true\"></span>' +\n          '<div class=\"hp-player_bar\">' +\n          '<button type=\"button\" class=\"hp-player_btn\" data-act=\"play\" aria-label=\"Afspelen\">' +\n          '<span class=\"i-play\">' + ICON.play + '</span><span class=\"i-pause\">' + ICON.pause + '</span></button>' +\n          '<span class=\"hp-player_t\" data-t=\"now\">0:00</span>' +\n          '<div class=\"hp-player_line\" role=\"slider\" tabindex=\"0\" aria-label=\"Tijdlijn\" aria-valuemin=\"0\" aria-valuemax=\"0\" aria-valuenow=\"0\" aria-valuetext=\"0:00\">' +\n          '<span class=\"hp-player_track\"><span class=\"hp-player_buf\"></span><span class=\"hp-player_prog\"></span></span>' +\n          '<span class=\"hp-player_handle\"></span></div>' +\n          '<span class=\"hp-player_t\" data-t=\"dur\">0:00</span>' +\n          '<button type=\"button\" class=\"hp-player_btn\" data-act=\"mute\" aria-label=\"Geluid uit\">' +\n          '<span class=\"i-sound\">' + ICON.sound + '</span><span class=\"i-muted\">' + ICON.muted + '</span></button>' +\n          '<button type=\"button\" class=\"hp-player_btn\" data-act=\"full\" aria-label=\"Volledig scherm\">' + ICON.full + '</button>' +\n          '</div></div></div>';\n        canvas = dlg.querySelector('.hp-player_canvas');\n        video = dlg.querySelector('video');\n        line = dlg.querySelector('.hp-player_line');\n        prog = dlg.querySelector('.hp-player_prog');\n        buf = dlg.querySelector('.hp-player_buf');\n        handle = dlg.querySelector('.hp-player_handle');\n        tNow = dlg.querySelector('[data-t=\"now\"]');\n        tDur = dlg.querySelector('[data-t=\"dur\"]');\n        muteBtn = dlg.querySelector('[data-act=\"mute\"]');\n        playBtn = dlg.querySelector('[data-act=\"play\"]');\n        if (poster) video.poster = poster;\n        video.src = src;\n\n        // Status van de speler: idle, loading, playing, paused of ended (CSS toont de juiste knoppen)\n        function status(s) {\n          canvas.setAttribute('data-status', s);\n          var playing = s === 'playing' || s === 'loading';\n          playBtn.setAttribute('aria-label', playing ? 'Pauzeren' : 'Afspelen');\n          dlg.querySelector('.hp-player_big').setAttribute('aria-label', s === 'ended' ? 'Opnieuw afspelen' : 'Afspelen');\n          if (s !== 'playing') showControls();\n        }\n        video.addEventListener('play', function () { status('loading'); loop(); });\n        video.addEventListener('playing', function () { status('playing'); hideSoon(); });\n        video.addEventListener('waiting', function () { if (!video.paused) status('loading'); });\n        video.addEventListener('pause', function () { if (!video.ended) status('paused'); cancelAnimationFrame(raf); render(); });\n        video.addEventListener('ended', function () { status('ended'); cancelAnimationFrame(raf); render(); });\n        video.addEventListener('loadedmetadata', function () {\n          tDur.textContent = fmt(video.duration);\n          line.setAttribute('aria-valuemax', Math.round(video.duration));\n          render();\n        });\n        video.addEventListener('timeupdate', render);\n        video.addEventListener('progress', renderBuffered);\n        video.addEventListener('volumechange', function () {\n          canvas.toggleAttribute('data-muted', video.muted);\n          muteBtn.setAttribute('aria-label', video.muted ? 'Geluid aan' : 'Geluid uit');\n        });\n\n        // Klik op het beeld: afspelen/pauzeren. Dubbelklik: volledig scherm.\n        canvas.addEventListener('click', function (e) {\n          var btn = e.target.closest('button');\n          if (btn && btn.getAttribute('data-act') === 'mute') { video.muted = !video.muted; return; }\n          if (btn && btn.getAttribute('data-act') === 'full') { toggleFull(); return; }\n          if (e.target.closest('.hp-player_line')) return;\n          if (btn || !e.target.closest('.hp-player_bar')) toggle();\n        });\n        canvas.addEventListener('dblclick', function (e) {\n          if (!e.target.closest('.hp-player_bar')) toggleFull();\n        });\n        ['pointermove', 'pointerdown', 'focusin'].forEach(function (type) {\n          canvas.addEventListener(type, function () { showControls(); hideSoon(); });\n        });\n\n        // Tijdlijn: slepen met muis of vinger, of met de pijltjestoetsen\n        line.addEventListener('pointerdown', function (e) {\n          scrubbing = true;\n          line.setPointerCapture(e.pointerId);\n          canvas.classList.add('is-scrubbing');\n          seekTo(frac(e.clientX));\n        });\n        line.addEventListener('pointermove', function (e) { if (scrubbing) seekTo(frac(e.clientX)); });\n        function endScrub() { scrubbing = false; canvas.classList.remove('is-scrubbing'); }\n        line.addEventListener('pointerup', endScrub);\n        line.addEventListener('pointercancel', endScrub);\n        line.addEventListener('keydown', function (e) {\n          var k = e.key;\n          if (k === 'ArrowLeft' || k === 'ArrowDown') skip(-5);\n          else if (k === 'ArrowRight' || k === 'ArrowUp') skip(5);\n          else if (k === 'Home') video.currentTime = 0;\n          else if (k === 'End') video.currentTime = video.duration || 0;\n          else return;\n          e.preventDefault();\n          e.stopPropagation();\n        });\n\n        // Sneltoetsen in de pop-up\n        dlg.addEventListener('keydown', function (e) {\n          if (e.target.closest('button') && (e.key === ' ' || e.key === 'Enter')) return;\n          var k = e.key.toLowerCase();\n          if (k === ' ' || k === 'k') toggle();\n          else if (k === 'arrowleft') skip(-5);\n          else if (k === 'arrowright') skip(5);\n          else if (k === 'm') video.muted = !video.muted;\n          else if (k === 'f') toggleFull();\n          else return;\n          e.preventDefault();\n          showControls();\n          hideSoon();\n        });\n\n        dlg.querySelector('.hp-player_close').addEventListener('click', close);\n        dlg.addEventListener('click', function (e) { if (e.target === dlg || e.target.classList.contains('hp-player_wrap')) close(); });\n        // Esc: eerst onze eigen sluit-animatie in plaats van direct dicht\n        dlg.addEventListener('cancel', function (e) { e.preventDefault(); close(); });\n        document.body.appendChild(dlg);\n      }\n\n      function frac(x) {\n        var r = line.getBoundingClientRect();\n        return clamp((x - r.left) / r.width);\n      }\n      function seekTo(f) {\n        if (!video.duration) return;\n        video.currentTime = f * video.duration;\n        render();\n      }\n      function skip(s) {\n        if (!video.duration) return;\n        video.currentTime = Math.min(video.duration, Math.max(0, video.currentTime + s));\n        render();\n      }\n      function render() {\n        var d = video.duration || 0, t = video.currentTime || 0, f = d ? t / d : 0;\n        prog.style.transform = 'scaleX(' + f + ')';\n        handle.style.left = (f * 100) + '%';\n        tNow.textContent = fmt(t);\n        line.setAttribute('aria-valuenow', Math.round(t));\n        line.setAttribute('aria-valuetext', fmt(t) + ' van ' + fmt(d));\n      }\n      function renderBuffered() {\n        if (!video.duration || !video.buffered.length) return;\n        buf.style.transform = 'scaleX(' + (video.buffered.end(video.buffered.length - 1) / video.duration) + ')';\n      }\n      function loop() {\n        cancelAnimationFrame(raf);\n        (function step() {\n          render();\n          if (!video.paused && !video.ended) raf = requestAnimationFrame(step);\n        })();\n      }\n      function toggle() {\n        if (video.paused || video.ended) {\n          video.play().catch(function () { canvas.setAttribute('data-status', 'paused'); });\n        } else {\n          video.pause();\n        }\n      }\n      function showControls() {\n        clearTimeout(hideTimer);\n        canvas.classList.remove('is-idle');\n      }\n      function hideSoon() {\n        clearTimeout(hideTimer);\n        if (video.paused || scrubbing) return;\n        // Bediening verdwijnt na even stilstaan, behalve als iemand met het toetsenbord in de balk zit\n        hideTimer = setTimeout(function () {\n          var a = document.activeElement;\n          var keyboardInBar = a && canvas.contains(a) && a.matches(':focus-visible');\n          if (!video.paused && !scrubbing && !keyboardInBar) canvas.classList.add('is-idle');\n        }, 2400);\n      }\n\n      // Volledig scherm op de hele speler (met onze bediening); iPhone gebruikt de eigen video-weergave\n      function isFull() { return document.fullscreenElement === canvas || document.webkitFullscreenElement === canvas; }\n      function toggleFull() {\n        if (isFull()) {\n          (document.exitFullscreen || document.webkitExitFullscreen).call(document);\n        } else if (canvas.requestFullscreen) {\n          canvas.requestFullscreen();\n        } else if (canvas.webkitRequestFullscreen) {\n          canvas.webkitRequestFullscreen();\n        } else if (video.webkitEnterFullscreen) {\n          video.webkitEnterFullscreen();\n        }\n      }\n\n      // De kaart groeit uit tot de speler (FLIP) en krimpt bij sluiten terug\n      function flip(toCard, done) {\n        var a = card.getBoundingClientRect(), b = canvas.getBoundingClientRect();\n        var from = { x: a.left - b.left, y: a.top - b.top, scaleX: a.width / b.width, scaleY: a.height / b.height };\n        var end = { x: 0, y: 0, scaleX: 1, scaleY: 1 };\n        if (reduce || !window.gsap) { done(); return; }\n        gsap.fromTo(canvas, toCard ? end : from, Object.assign({}, toCard ? from : end, {\n          duration: toCard ? 0.5 : 0.65,\n          ease: toCard ? 'power3.inOut' : 'expo.out',\n          transformOrigin: '0 0',\n          onComplete: done\n        }));\n      }\n\n      function open() {\n        if (busy) return;\n        busy = true;\n        if (!dlg) build();\n        if (window.lenis) window.lenis.stop();\n        dlg.showModal();\n        card.classList.add('is-lifted');\n        requestAnimationFrame(function () { dlg.classList.add('is-open'); });\n        flip(false, function () {\n          busy = false;\n          if (window.gsap) gsap.set(canvas, { clearProps: 'transform' });\n          if (video.ended) video.currentTime = 0;\n          video.play().catch(function () { canvas.setAttribute('data-status', 'paused'); });\n        });\n        dlg.querySelector('.hp-player_close').focus({ preventScroll: true });\n      }\n\n      function close() {\n        if (busy || !dlg || !dlg.open) return;\n        busy = true;\n        video.pause();\n        clearTimeout(hideTimer);\n        var finish = function () {\n          dlg.classList.remove('is-open');\n          dlg.close();\n          if (window.gsap) gsap.set(canvas, { clearProps: 'transform' });\n          card.classList.remove('is-lifted');\n          if (window.lenis) window.lenis.start();\n          card.focus({ preventScroll: true });\n          busy = false;\n        };\n        var go = function () {\n          dlg.classList.remove('is-open');\n          flip(true, finish);\n        };\n        if (isFull()) {\n          (document.exitFullscreen || document.webkitExitFullscreen).call(document);\n          setTimeout(go, 250);\n        } else {\n          go();\n        }\n      }\n\n      card.addEventListener('click', open);\n    }\n    document.querySelectorAll('[data-hp-video]').forEach((card) => {\n      if (card.hasAttribute('data-hp-video-ready') || card.closest('.w-script')) return;\n      card.setAttribute('data-hp-video-ready', '');\n      setup(card);\n    });\n  }\n\n  // ---------- Ga verder als: kaarten met keuzemenu (hp-go) ----------\n  // Homepage, Over ons en Onze missie ([data-hpg2], Webflow). Cliënt & familie en Professional\n  // (.hpg2-card) openen een menu in de kaart (mobiel: uitklapper eronder); Gemeenten en IT-partner\n  // zijn gewone links. Eén kaart tegelijk open; klikken ernaast of Escape sluit.\n  function initHpGo() {\n    document.querySelectorAll('[data-hpg2]').forEach((grid) => {\n      if (grid.hasAttribute('data-hpg2-ready') || grid.closest('.w-script')) return;\n      grid.setAttribute('data-hpg2-ready', '');\n      const cards = [...grid.querySelectorAll('.hpg2-card')];\n\n      const setOpen = (card, open, focusFirst) => {\n        const btn = card.querySelector('.hpg2-trigger');\n        card.classList.toggle('is-open', open);\n        if (btn) btn.setAttribute('aria-expanded', open ? 'true' : 'false');\n        if (open && focusFirst) {\n          setTimeout(() => {\n            const first = card.querySelector('a.hpg2-item');\n            if (first) first.focus();\n          }, 150);\n        }\n      };\n\n      cards.forEach((card) => {\n        const btn = card.querySelector('.hpg2-trigger');\n        const menu = card.querySelector('.hpg2-menu');\n        if (!btn) return;\n        btn.setAttribute('aria-expanded', 'false');\n        if (menu && menu.id) btn.setAttribute('aria-controls', menu.id);\n        btn.addEventListener('click', (e) => {\n          const open = !card.classList.contains('is-open');\n          cards.forEach((c) => {\n            if (c !== card) setOpen(c, false);\n          });\n          // Met het toetsenbord (e.detail 0) gaat de focus naar de eerste link\n          setOpen(card, open, open && e.detail === 0);\n        });\n      });\n\n      document.addEventListener('click', (e) => {\n        if (!e.target.closest('.hpg2-card')) cards.forEach((c) => setOpen(c, false));\n      });\n      document.addEventListener('keydown', (e) => {\n        if (e.key !== 'Escape') return;\n        const open = grid.querySelector('.hpg2-card.is-open');\n        if (!open) return;\n        setOpen(open, false);\n        open.querySelector('.hpg2-trigger').focus();\n      });\n    });\n  }\n\n  // ---------- Over ons: kaart van Nederland, van 2012 tot nu (oo-map) ----------\n  // Het netwerk groeit vanuit Luttenberg (2012) via 2018 naar nu, met \"berichtjes\" over de lijnen.\n  // Kaart, label, tekstblokken (.oo-map_txt) en stappen staan in Webflow ([data-oo-map]); de puntjes\n  // en lijnen (SVG) maakt dit script. Per tekstblok: data-count = aantal puntjes, data-hold = ms tot\n  // de volgende stap. Speelt af als de kaart voor 60% in beeld is, en opnieuw na helemaal uit beeld.\n\n  // Puntjesraster van Nederland (uit world-atlas, home/over-ons/nl-dots.js), Luttenberg en straal\n  const OO_MAP = {\"w\":1000,\"h\":1144,\"r\":9.2,\"luttenberg\":[785,455],\"dots\":[[623,0],[887,0],[491,33],[679,33],[717,33],[755,33],[792,33],[830,33],[868,33],[906,33],[434,65],[585,65],[623,65],[660,65],[698,65],[736,65],[774,65],[811,65],[849,65],[887,65],[925,65],[962,65],[566,98],[604,98],[642,98],[679,98],[717,98],[755,98],[792,98],[830,98],[868,98],[906,98],[943,98],[981,98],[396,131],[547,131],[585,131],[623,131],[660,131],[698,131],[736,131],[774,131],[811,131],[849,131],[887,131],[925,131],[962,131],[1000,131],[377,163],[528,163],[566,163],[604,163],[642,163],[679,163],[717,163],[755,163],[792,163],[830,163],[868,163],[906,163],[943,163],[981,163],[358,196],[472,196],[509,196],[547,196],[585,196],[623,196],[660,196],[698,196],[736,196],[774,196],[811,196],[849,196],[887,196],[925,196],[962,196],[1000,196],[415,229],[453,229],[491,229],[528,229],[566,229],[604,229],[642,229],[679,229],[717,229],[755,229],[792,229],[830,229],[868,229],[906,229],[943,229],[981,229],[358,261],[396,261],[434,261],[472,261],[509,261],[547,261],[585,261],[623,261],[660,261],[698,261],[736,261],[774,261],[811,261],[849,261],[887,261],[925,261],[962,261],[340,294],[377,294],[415,294],[453,294],[491,294],[528,294],[566,294],[604,294],[642,294],[679,294],[717,294],[755,294],[792,294],[830,294],[868,294],[906,294],[943,294],[358,327],[396,327],[434,327],[472,327],[509,327],[547,327],[585,327],[623,327],[660,327],[698,327],[736,327],[774,327],[811,327],[849,327],[887,327],[925,327],[962,327],[340,359],[377,359],[415,359],[453,359],[491,359],[528,359],[566,359],[604,359],[642,359],[679,359],[717,359],[755,359],[792,359],[830,359],[868,359],[321,392],[358,392],[396,392],[434,392],[472,392],[509,392],[547,392],[585,392],[623,392],[660,392],[698,392],[736,392],[774,392],[811,392],[849,392],[340,425],[377,425],[415,425],[453,425],[491,425],[528,425],[566,425],[604,425],[642,425],[679,425],[717,425],[755,425],[792,425],[830,425],[868,425],[321,458],[358,458],[396,458],[434,458],[472,458],[509,458],[547,458],[585,458],[623,458],[660,458],[698,458],[736,458],[774,458],[811,458],[849,458],[887,458],[925,458],[962,458],[302,490],[340,490],[377,490],[415,490],[453,490],[491,490],[528,490],[566,490],[604,490],[642,490],[679,490],[717,490],[755,490],[792,490],[830,490],[868,490],[906,490],[943,490],[283,523],[321,523],[358,523],[396,523],[434,523],[472,523],[509,523],[547,523],[585,523],[623,523],[660,523],[698,523],[736,523],[774,523],[811,523],[849,523],[887,523],[925,523],[962,523],[264,556],[302,556],[340,556],[377,556],[415,556],[453,556],[491,556],[528,556],[566,556],[604,556],[642,556],[679,556],[717,556],[755,556],[792,556],[830,556],[868,556],[906,556],[245,588],[283,588],[321,588],[358,588],[396,588],[434,588],[472,588],[509,588],[547,588],[585,588],[623,588],[660,588],[698,588],[736,588],[774,588],[811,588],[849,588],[887,588],[226,621],[264,621],[302,621],[340,621],[377,621],[415,621],[453,621],[491,621],[528,621],[566,621],[604,621],[642,621],[679,621],[717,621],[755,621],[792,621],[830,621],[868,621],[170,654],[208,654],[245,654],[283,654],[321,654],[358,654],[396,654],[434,654],[472,654],[509,654],[547,654],[585,654],[623,654],[660,654],[698,654],[736,654],[774,654],[811,654],[849,654],[887,654],[189,686],[226,686],[264,686],[302,686],[340,686],[377,686],[415,686],[453,686],[491,686],[528,686],[566,686],[604,686],[642,686],[679,686],[717,686],[755,686],[792,686],[830,686],[132,719],[170,719],[208,719],[245,719],[283,719],[321,719],[358,719],[396,719],[434,719],[472,719],[509,719],[547,719],[585,719],[623,719],[660,719],[75,752],[113,752],[151,752],[189,752],[226,752],[264,752],[302,752],[340,752],[377,752],[415,752],[453,752],[491,752],[528,752],[566,752],[604,752],[642,752],[679,752],[132,784],[170,784],[208,784],[245,784],[283,784],[321,784],[358,784],[396,784],[434,784],[472,784],[509,784],[547,784],[585,784],[623,784],[660,784],[698,784],[38,817],[75,817],[113,817],[189,817],[226,817],[264,817],[302,817],[340,817],[377,817],[415,817],[453,817],[491,817],[528,817],[566,817],[604,817],[642,817],[679,817],[717,817],[57,850],[94,850],[132,850],[170,850],[245,850],[283,850],[321,850],[358,850],[396,850],[434,850],[472,850],[509,850],[547,850],[585,850],[623,850],[660,850],[698,850],[736,850],[113,882],[189,882],[226,882],[302,882],[377,882],[415,882],[453,882],[491,882],[528,882],[566,882],[604,882],[642,882],[679,882],[717,882],[19,915],[57,915],[94,915],[132,915],[170,915],[208,915],[472,915],[509,915],[547,915],[585,915],[623,915],[660,915],[698,915],[736,915],[0,948],[113,948],[151,948],[189,948],[491,948],[528,948],[566,948],[604,948],[642,948],[679,948],[717,948],[623,980],[660,980],[698,980],[679,1013],[642,1078],[623,1111],[660,1111],[698,1111],[604,1144],[642,1144],[679,1144]]};\n  const OO_MAP_STAGES = [{ count: 7, hold: 5000 }, { count: 48, hold: 5000 }, { count: 150, hold: 0 }];\n\n  function initOoMap() {\n    document.querySelectorAll('[data-oo-map]').forEach((root) => {\n      if (root.dataset.ooReady || root.closest('.w-script')) return;\n      root.dataset.ooReady = '1';\n      setupOoMap(root);\n    });\n  }\n\n  function setupOoMap(root) {\n    var NS = 'http://www.w3.org/2000/svg';\n    var MAP = OO_MAP;\n    var reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n    // De SVG (puntjes, lijnen, berichtjes) komt vóór het label in .oo-map_stage\n    var mapStage = root.querySelector('.oo-map_stage');\n    var svg = mapStage.querySelector('svg');\n    if (!svg) {\n      svg = document.createElementNS(NS, 'svg');\n      svg.setAttribute('class', 'oo-map_svg');\n      svg.setAttribute('viewBox', '-40 -40 1080 1224');\n      svg.setAttribute('aria-hidden', 'true');\n      ['oo-map_lines', 'oo-map_dots', 'oo-map_msgs'].forEach(function (c) {\n        var g = document.createElementNS(NS, 'g');\n        g.setAttribute('class', c);\n        svg.appendChild(g);\n      });\n      mapStage.insertBefore(svg, mapStage.firstChild);\n    }\n    var gLines = svg.querySelector('.oo-map_lines'), gDots = svg.querySelector('.oo-map_dots'), gMsgs = svg.querySelector('.oo-map_msgs');\n    // De tekstblokken per stap staan in Webflow; aantal puntjes en wachttijd uit data-count / data-hold\n    var txts = [].slice.call(root.querySelectorAll('.oo-map_txt'));\n    var STAGES = txts.map(function (t, i) {\n      var d = OO_MAP_STAGES[i] || OO_MAP_STAGES[OO_MAP_STAGES.length - 1];\n      return {\n        count: parseInt(t.getAttribute('data-count'), 10) || d.count,\n        hold: t.hasAttribute('data-hold') ? parseInt(t.getAttribute('data-hold'), 10) || 0 : d.hold\n      };\n    });\n    if (!STAGES.length) return;\n    STAGES[STAGES.length - 1].hold = 0;\n    var steps = [].slice.call(root.querySelectorAll('.oo-map_step'));\n    var pin = root.querySelector('.oo-map_pin');\n    var L = MAP.luttenberg, R = MAP.r;\n\n    // Vaste 'toeval'-reeks, zodat de spreiding bij elk bezoek hetzelfde is\n    var seed = 7;\n    function rnd() { seed = (seed * 16807) % 2147483647; return seed / 2147483647; }\n\n    // Het thuispuntje is het puntje dat het dichtst bij Luttenberg ligt\n    var home = 0, best = Infinity;\n    MAP.dots.forEach(function (d, i) { var dd = (d[0] - L[0]) * (d[0] - L[0]) + (d[1] - L[1]) * (d[1] - L[1]); if (dd < best) { best = dd; home = i; } });\n    var H = MAP.dots[home];\n\n    // Volgorde van groeien: afstand tot thuis met wat ruis, plus een paar vroege sprongen naar andere regio's\n    var order = MAP.dots.map(function (d, i) {\n      var dist = Math.hypot(d[0] - H[0], d[1] - H[1]);\n      var t = i === home ? -1 : dist * (0.35 + rnd() * 1.3);\n      if (i !== home && rnd() < 0.12) t *= 0.3;\n      if (dist < R * 8) t = dist * 0.05; // 2012: eerst de mensen vlak rond Luttenberg\n      return { i: i, t: t };\n    }).sort(function (a, b) { return a.t - b.t; }).map(function (o) { return o.i; });\n\n    // Elk nieuw puntje verbindt met het dichtstbijzijnde puntje dat al aan staat\n    var parent = {};\n    order.forEach(function (idx, k) {\n      if (!k) return;\n      var d = MAP.dots[idx], bi = order[0], bd = Infinity;\n      for (var j = 0; j < k; j++) {\n        var e = MAP.dots[order[j]], dd = (d[0] - e[0]) * (d[0] - e[0]) + (d[1] - e[1]) * (d[1] - e[1]);\n        if (dd < bd) { bd = dd; bi = order[j]; }\n      }\n      parent[idx] = bi;\n    });\n\n    var dotEls = [], lineEls = {}, rank = {};\n    order.forEach(function (idx, k) { rank[idx] = k; });\n    MAP.dots.forEach(function (d, i) {\n      var c = document.createElementNS(NS, 'circle');\n      c.setAttribute('cx', d[0]); c.setAttribute('cy', d[1]); c.setAttribute('r', R);\n      c.setAttribute('class', 'oo-map_dot');\n      gDots.appendChild(c); dotEls[i] = c;\n      if (parent[i] !== undefined) {\n        var p = MAP.dots[parent[i]], l = document.createElementNS(NS, 'line');\n        l.setAttribute('x1', p[0]); l.setAttribute('y1', p[1]); l.setAttribute('x2', d[0]); l.setAttribute('y2', d[1]);\n        l.setAttribute('pathLength', '1'); l.setAttribute('class', 'oo-map_line');\n        gLines.appendChild(l); lineEls[i] = l;\n      }\n    });\n    // Thuis: twee pulserende ringen met een puntje erop\n    [2, 1].forEach(function (n) {\n      var ring = document.createElementNS(NS, 'circle');\n      ring.setAttribute('cx', H[0]); ring.setAttribute('cy', H[1]); ring.setAttribute('r', R * 2);\n      ring.setAttribute('class', 'oo-map_ring' + (n === 2 ? ' is-2' : ''));\n      gMsgs.appendChild(ring);\n    });\n    var hc = document.createElementNS(NS, 'circle');\n    hc.setAttribute('cx', H[0]); hc.setAttribute('cy', H[1]); hc.setAttribute('r', R * 1.45); hc.setAttribute('class', 'oo-map_home');\n    gMsgs.appendChild(hc);\n    pin.style.left = ((H[0] + 40) / 1080 * 100) + '%';\n    pin.style.top = ((H[1] + 40) / 1224 * 100) + '%';\n\n    var lit = 0, stage = -1, timer = null, playing = false, msgTimer = null;\n\n    var pending = [];\n    function turn(idx, on, animate) {\n      dotEls[idx].classList.toggle('is-instant', !animate);\n      dotEls[idx].classList.toggle('is-on', on);\n      if (lineEls[idx]) { lineEls[idx].classList.toggle('is-instant', !animate); lineEls[idx].classList.toggle('is-on', on); }\n    }\n    function light(count, animate) {\n      pending.forEach(clearTimeout); pending = [];\n      var from = lit, span = Math.max(1, count - from);\n      order.forEach(function (idx, k) {\n        if (k >= count) { turn(idx, false, false); return; }\n        if (k < from) { turn(idx, true, false); return; }\n        if (!animate) { turn(idx, true, false); return; }\n        pending.push(setTimeout(turn, Math.round((k - from) / span * 2200), idx, true, true));\n      });\n      lit = count;\n    }\n\n    function setText(n) {\n      txts.forEach(function (t, k) {\n        t.classList.toggle('is-active', k === n);\n        t.setAttribute('aria-hidden', k === n ? 'false' : 'true');\n      });\n    }\n\n    function setSteps(n, holdMs) {\n      steps.forEach(function (li, k) {\n        li.classList.toggle('is-active', k === n);\n        li.classList.toggle('is-past', k < n);\n        var f = li.querySelector('.oo-map_fill');\n        f.style.transition = 'none';\n        f.style.transform = k < n ? 'scaleX(1)' : 'scaleX(0)';\n        if (k === n) {\n          void f.offsetWidth;\n          if (holdMs) { f.style.transition = 'transform ' + holdMs + 'ms linear'; f.style.transform = 'scaleX(1)'; }\n          else f.style.transform = 'scaleX(1)';\n        }\n      });\n    }\n\n    function go(n, animate) {\n      clearTimeout(timer);\n      var s = STAGES[n];\n      if (n !== stage) setText(n);\n      stage = n;\n      light(s.count, animate);\n      setSteps(n, playing && animate ? s.hold : 0);\n      if (playing && s.hold) timer = setTimeout(function () { go(n + 1, true); }, s.hold);\n      else playing = false;\n    }\n\n    // Kleine berichtjes die over het netwerk reizen zodra het gegroeid is\n    function sendMessage() {\n      if (document.hidden || lit < 8) return;\n      var k = 1 + Math.floor(rnd() * (lit - 1)), idx = order[k], line = lineEls[idx];\n      if (!line) return;\n      var a = MAP.dots[parent[idx]], b = MAP.dots[idx];\n      if (rnd() < 0.5) { var t = a; a = b; b = t; }\n      var m = document.createElementNS(NS, 'circle');\n      m.setAttribute('r', R * 0.55); m.setAttribute('class', 'oo-map_msg');\n      gMsgs.insertBefore(m, gMsgs.firstChild);\n      var t0 = performance.now(), dur = 900;\n      (function step(now) {\n        var p = Math.min(1, (now - t0) / dur), e = p < .5 ? 2 * p * p : 1 - Math.pow(-2 * p + 2, 2) / 2;\n        m.setAttribute('cx', a[0] + (b[0] - a[0]) * e); m.setAttribute('cy', a[1] + (b[1] - a[1]) * e);\n        m.setAttribute('opacity', p < .15 ? p / .15 : p > .85 ? (1 - p) / .15 : 1);\n        if (p < 1) requestAnimationFrame(step); else m.remove();\n      })(t0);\n    }\n\n    var started = false;\n    steps.forEach(function (li, k) {\n      li.querySelector('button').addEventListener('click', function () { started = true; playing = !reduce; go(k, !reduce); });\n    });\n\n    if (reduce) { go(STAGES.length - 1, false); return; }\n\n    // Terug naar 2012, zodat het hele verhaal bij een volgend bezoek opnieuw speelt\n    function reset() {\n      clearTimeout(timer); pending.forEach(clearTimeout); pending = [];\n      playing = false; started = false; stage = -1; lit = 0;\n      order.forEach(function (idx) { turn(idx, false, false); });\n      setText(0);\n      setSteps(-1, 0);\n    }\n\n    // Afspelen als de kaart voor 60% in beeld is; terugzetten als hij helemaal uit beeld is\n    var io = new IntersectionObserver(function (entries) {\n      entries.forEach(function (en) {\n        if (en.isIntersecting) {\n          if (!msgTimer) msgTimer = setInterval(sendMessage, 420);\n          if (!started && en.intersectionRatio >= 0.6) { started = true; playing = true; go(0, true); }\n        } else {\n          if (msgTimer) { clearInterval(msgTimer); msgTimer = null; }\n          if (started) reset();\n        }\n      });\n    }, { threshold: [0, 0.6] });\n    io.observe(root);\n  }\n\n  // ---------- Start ----------\n\n  function init() {\n    if (window.gsap && window.Observer && window.ScrollTrigger) {\n      gsap.registerPlugin(Observer, ScrollTrigger);\n    }\n\n    // Elk onderdeel apart: een fout in het ene stopt de rest niet (namen blijven leesbaar na minify)\n    const parts = {\n      initLenis,\n      initCopyrightYear,\n      initFinsweet,\n      initFreshchat,\n      initFloatLabels,\n      initSliders,\n      initVideoButtons,\n      initLightboxLabels,\n      initSearchTerm,\n      initNavScroll,\n      initMegaNavDirectionalHover,\n      initMegaNavImages,\n      initSearchToggle,\n      initSearchIconMorph,\n      initSearchPage,\n      initAdvancedFormValidation,\n      initVimeoBackground,\n      initHeroWave,\n      initBlobMorph,\n      initNumberOdometer,\n      initWavyMarquee,\n      initDgTabs,\n      initDgTestimonials,\n      initAccordionCSS,\n      initVideoPopup,\n      initLapostaForms,\n      initHpStory,\n      initHpWhy,\n      initHpVideo,\n      initHpGo,\n      initOoMap,\n    };\n    Object.keys(parts).forEach((name) => {\n      try {\n        parts[name]();\n      } catch (err) {\n        console.error('[OZO] ' + name, err);\n      }\n    });\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n"]}