{"version":3,"file":"static/js/9.c80e1b4ccdc21c0a61a2.chunk.js","mappings":";2TA6BO,MAAMA,EAGTC,YAAmBC,GAQZ,KAAAC,YAAc,KAAcC,EAAAA,EAAAA,eAAc,mCAAoCC,KAAKH,aAMnF,KAAAI,mBAAqB,IAAc,mCAMnC,KAAAC,cAAgB,IAAiB,OAnBpCF,KAAKH,YAAcA,CACvB,EAoCGM,eAAeC,EAClBC,EACAC,GAGA,IAAKD,EAAMR,YAAYU,UACnB,MAAM,IAAIC,MAAM,0EAEpB,MACMC,SADkBC,EAAAA,EAAAA,cAAaJ,IACdG,KACjBE,QAAiBC,EAAAA,EAAAA,6BAA4B,IAAIC,EAAAA,wBAA2BP,GAE5EQ,EAAqC,GAG3C,QAAaC,IAATN,IAAuBO,EAAAA,gBAAgBC,YAAYN,GACnD,OAAOO,QAAQC,QAAQL,GAa3B,aAV4BM,EAAAA,oBAAAA,wBACxB,CACIC,cAAef,EACfgB,oBAAqBC,EAAAA,yBAAyBC,qCAAqClB,IAEvFK,EAASc,KAAIC,GAAWA,EAAQC,WAChC,CAAC,EAdgB,EAmBzB,EAM0DC,EAAAA,EAAAA,IAA2B,CACjFC,GAAI,6EACJC,OAAQ1B,EACRC,MAjDiB0B,GACV,IAAIpC,EAAqCoC,EAAUC,eAAenC,+CCnD7E,MA0DaoC,EAAsBC,IAC/B,MAAM,SAAEvB,EAAQ,UAAEwB,EAAS,eAAEC,GAAmBF,EAChD,OAAOE,EAtB4BC,EACnCC,EACA3B,EACAuB,KAEA,MAAMK,EAAsC,GAC5C,GAAID,GAAaA,EAAUE,OAAS,EAAG,CAEnC,MAAMC,GAAmBC,EAAAA,EAAAA,GAAkBJ,EAAW3B,EAAUuB,GACvC,OAArBO,GACAF,EAAWI,KAAKF,EAAiB,CAGzC,OAAOF,CAAU,EAUXF,CAA+BF,EAAWxB,EAAUuB,GA7D9BU,EAC5BT,EACAxB,EACAuB,KAEA,MAAMK,EAAsC,GAC5C,IAAK5B,GAAgC,IAApBA,EAAS6B,OAEtB,OADAN,EAAM5B,QAAQuC,UAAUC,MAAM,iDACvB,KAGX,MAAMC,EAAyBC,GAAsBC,IAAQD,GAAOE,GAAQA,EAAKC,qBAE3EC,GADsBJ,EACab,EADSc,IAAQD,GAAOE,GAAQA,EAAKG,gBAAlDL,MAE5B,MAAMM,EAA6B,GAqBnC,OAlBAC,OAAOC,QAAQJ,GAAeK,SAAQC,IAAwC,IAAtCC,EAAcC,GAAoBF,EAEtEN,EAAcO,GAAgBZ,EAAsBa,GACpDN,EAAeX,KAAKI,EAAsBa,GAAqB,IAInEL,OAAOM,KAAKP,GAAgBG,SAAQK,IAChC,MAAMxB,EAAYgB,EAAeQ,GACjCP,OAAOM,KAAKvB,GAAWmB,SAAQM,IAC3B,MAAMC,EAAW1B,EAAUyB,GACrBtB,GAAmBC,EAAAA,EAAAA,GAAkBsB,EAAUrD,EAAUuB,GACtC,OAArBO,GACAF,EAAWI,KAAKF,EAAkB,GAExC,IAGCF,CAAU,EA2BXK,CAAwBT,EAAWxB,EAAUuB,EAAM,gBCpDtD/B,eAAe8D,EAAiBC,GACnC,MAAMC,EAAgC,CAAC,EAavC,aAXMC,EAAAA,EAAAA,qCAAoC,IAAIC,EAAAA,iCAAiCH,EAAIlC,eAAenC,aAAcqE,GAC3GI,MAAKC,IACEA,IACAJ,EAAcI,iBAAmBA,EAAiB,IAGzDC,OAAM1B,IACHoB,EAAIrB,UAAU4B,UAAU3B,GACjB,CAAC,KAGTqB,CACX,skBCoFA,IAAMO,EAAN,cAAmBC,IAAAA,UAaf/E,YAAmBsC,GACf0C,MAAM1C,GAPF,KAAA2C,gCAA0C,EAE1C,KAAAC,YAAsB,EAEb,KAAAC,iBAA2B,uBA0P3B,KAAAC,mBAAsBC,IACnCjF,KAAKkF,SAAS,CACVC,qBAAsBnF,KAAKoF,MAAMD,qBACnC,EAMW,KAAAE,0BAA4B,KACzCrF,KAAKsF,sBAAsB,EA+dd,KAAAC,iBAAoBC,GAE7BA,GAAiB,CACbC,UAAW,CACPC,GAAI,CAAEC,EAAG,gBAAiBC,EAAG,EAAGC,EAAG,GACnCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCE,GAAI,CAAEJ,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,IAEzCG,UAAU,GASL,KAAAC,0BAA6BC,IAC1C,GAAIlG,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAAQ,CAC7B,MAAM/F,EAAQ,CACVgG,YAAa,CAACH,EAAiBI,OAAQC,aAE3CvG,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAChBI,gBAAgBnG,GAChBiE,MAAK,KACFtE,KAAKyG,eAAejC,OAAM1B,IACtB9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,0BAA0B,GACvD,IAELnC,OAAM1B,IACH9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,6BAA6B,GACzD,GASE,KAAAC,6BAA+B,CAACR,EAAsCS,KAC7D,UAAlBT,EAAOU,QAAsBD,GAC7B7G,KAAKiG,0BAA0BY,EAAU,EAWhC,KAAAE,uBAAyB,CAACC,EAA4BC,EAAkBC,MACrFC,EAAAA,EAAAA,IACInH,KAAK6E,+BACL7E,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OACrBpG,KAAKkC,MAAMW,UACX7C,KAAKkC,MAAMiE,KAAKxF,SAASyF,OACzBY,EACAC,GAEC3C,MAAM8C,IACH,GAAiC,aAA7BA,aAAgB,EAAhBA,EAAkBN,QAQlB,OAPA9G,KAAKyG,eAAejC,OAAM1B,IACtB9C,KAAKkC,MAAMW,UAAU6D,QAAS5D,EAAgBuE,SAC9CrH,KAAKkC,MAAMW,UAAU8D,MAAM,0BAA0B,IAEzD3G,KAAKkF,SAAS,CACVoC,gBAAiB,CAAC,KAEf,EAGX,IAAKC,EAAAA,iBAAiBC,kBAAkBJ,GAAmB,CAAC,IAADK,EAEvD,MAAMC,EAA0C,CAC5CpB,OAAQiB,EAAAA,iBAAiBC,kBAAkBR,EAAiBV,QAAU,IAAMU,EAAiBV,OAC7FqB,mBAAoB,CAChB,CACIC,aAAc5G,EAAAA,gBAAgBC,YAAYmG,EAAiBS,mBACrDT,EAAiBS,kBAAkB,GAAGD,aACtC,GACNE,iBAA+C,QAA/BL,EAAEL,EAAiBW,oBAAY,IAAAN,OAAA,EAA7BA,EAA+BK,oBAK7D9H,KAAKkF,SAAS,CACVoC,gBAAiB,CAAEU,uBAAwB,CAACN,KAC7C,CAGP,OAAO,CAAK,IAEflD,OAAM,KACI,KAGR,GAMM,KAAAyD,0BAA4B,KACrCjI,KAAK6E,iCAELjE,EAAAA,EAAAA,6BAA4B,IAAIC,EAAAA,wBAA2Bb,KAAKkC,MAAM5B,QAAQ4H,eACzE5D,MAAKnE,SAAYH,KAAKyG,iBACtBjC,OAAO1B,IACJ9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,EAAMuE,SACnCrH,KAAKkC,MAAMW,UAAU8D,MAAM,0BAA0B,GACtD,EAl1BX3G,KAAKmI,kBAAmBC,EAAAA,EAAAA,oBACpBpI,KAAKkC,MAAM5B,QAAQ+H,QAAQC,kBAC3BtI,KAAKkC,MAAMqG,aACXvI,KAAKkC,MAAMW,WAEf7C,KAAKwI,SAAUC,EAAAA,EAAAA,kBAAiB,QAASzI,KAAKmI,iBAAkB,IAChEnI,KAAKgF,mBAAqBhF,KAAKgF,mBAAmB0D,KAAK1I,MACvDA,KAAKqF,0BAA4BrF,KAAKqF,0BAA0BqD,KAAK1I,MAErEA,KAAKoF,MAAQ,CACTD,qBAAqB,EACrBhB,cAAe,CAAC,EAChBwE,aAAa,EACbC,0BAAsB7H,EACtBuG,gBAAiB,CAAC,EAE1B,CAKOnH,0BACHH,KAAK8E,YAAa,EAClB,MAAM,OACF+D,EACAvI,SAAS,cAAE4H,IACXlI,KAAKkC,MAQ4B,IAAD4G,GANpC9I,KAAK6E,qCACM7E,KAAK+I,2CAA+C/I,KAAKgJ,iCAChEhJ,KAAK6E,sCACC7E,KAAKyG,eAGXoC,EAAOI,2BACHjJ,KAAK8E,YAAyC,QAA/BgE,EAAI9I,KAAKkC,MAAMiE,KAAK1F,KAAK2F,cAAM,IAAA0C,GAA3BA,EAA6BrI,KAAKyI,WACrDlJ,KAAKkF,SAAS,CAAEf,oBAAqBF,EAAiBiE,MAG1DiB,EAAAA,EAAAA,KACI,SAAAC,EAAA,OAAiC,QAAjCA,EAAMpJ,KAAKkC,MAAMiE,KAAK1F,KAAK2F,cAAM,IAAAgD,OAAA,EAA3BA,EAA6B3I,KAAKyI,SAAS,IACjD/I,UACQH,KAAK8E,YACL9E,KAAKkF,SAAS,CAAEf,oBAAqBF,EAAiBiE,IAAkB,MAKxFiB,EAAAA,EAAAA,KACI,SAAAE,EAAA,OAAiC,QAAjCA,EAAMrJ,KAAKkC,MAAMiE,KAAK1F,KAAK2F,cAAM,IAAAiD,OAAA,EAA3BA,EAA6B5I,KAAKyI,SAAS,IACjD/I,UACI,GAAIH,KAAK8E,WAAY,CACjB,MAAMzE,EAAQ,IAAIV,EAAAA,qCAAqCuI,EAAclG,eAAenC,aACpFG,KAAKkF,SAAS,CAAE0D,2BAA4BxI,EAAiCC,EAAO6H,IAAkB,IAItH,CAKOoB,uBACHtJ,KAAK8E,YAAa,CACtB,CAQOyE,sBAAsBC,EAAkCC,GAC3D,OAAIzJ,KAAKoF,QAAUqE,GAAazJ,KAAKkC,MAAMiE,OAASqD,EAAUrD,IAIlE,CAGOuD,SAAM,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EACT,MACI5D,MACI1F,MAAQ2F,OAAQ3F,GAChBE,UAAYyF,OAAQzF,IAExBL,SACI+H,SACI2B,MAAM,gBAAEC,EAAe,UAAEC,KAEhC,UACDC,GACAnK,KAAKkC,MAEHkI,GAAmBC,EAAAA,EAAAA,IAAW,WAAYrK,KAAKkC,MAAM5B,QAAQ4H,gBAAkB,GAC/EoC,GAAoBD,EAAAA,EAAAA,IAAW,OAAQrK,KAAKkC,MAAM5B,QAAQ4H,gBAAkB,GAC5EqC,EAAcvK,KAAKwK,eAAeP,EAAiBG,EAAkBF,GAAa,IAClFO,EAAchK,GAAQA,EAAKA,KAAKyI,WAA4C,IAA/BzI,EAAKA,KAAKyI,UAAU1G,OACjEF,EAAYtC,KAAK0K,gBACjBC,EAA0D,QAArChB,EAAG3J,KAAKkC,MAAM5B,QAAQ+H,QAAQuC,eAAO,IAAAjB,OAAA,EAAlCA,EAAoCkB,sBAC5DC,GAAgCC,EAAAA,EAAAA,4BACd,QADwCnB,EAC5DnJ,aAAI,EAAJA,EAAMA,KAAKyI,iBAAS,IAAAU,EAAAA,EAAI,GACmB,QADjBC,EAC1B7J,KAAKkC,MAAMiE,KAAK6E,qBAAqB5E,cAAM,IAAAyD,EAAAA,EAAI,GAC/C7J,KAAKkC,MAAM5B,QAAQ4H,cACnBvH,QAAAA,EAAY,GACZgK,GAGEM,IACDH,SAAAA,EAA+BI,WAC9BJ,IAAkC9K,KAAKoF,MAAMuD,eAC9CrG,GAAYA,EAAU6I,MAAKtE,GAAYA,EAASoE,WAC/CG,EAAsE,QAAtCtB,EAAG9J,KAAKkC,MAAMiE,KAAKkF,aAAajF,cAAM,IAAA0D,OAAA,EAAnCA,EAAqCwB,MAC1ED,GAAsC,oEAAtBA,EAAaE,OAE3BC,EAAwBJ,aAAgC,EAAhCA,EAAkCK,WAE1D,aAAEJ,GAAiBrL,KAAKkC,MAAMiE,KAC9BuF,GACiB,QAAnB3B,EAAAsB,EAAajF,cAAM,IAAA2D,GAA4E,QAA5EA,EAAnBA,EAAqBuB,MAAMpI,GAHQ,2DAGeA,EAAKqI,cAAwC,IAAAxB,OAAA,EAA/FA,EAAiG0B,aAAa,EAC5GE,GAAmBC,EAAAA,EAAAA,IAAa5L,KAAKkC,MAAM5B,QAAQ+H,UACzDwD,EAAAA,EAAAA,mBAAkBF,GAClB,MAAMrI,EAAiB7C,SAAAA,EAAM2B,gBAAkBoJ,EAAwBxL,KAAK8L,oBAAsB,KAClG9L,KAAKwI,QAAQuD,cAAcC,MAAQC,EAAAA,kBAAkBC,SACrD,MAAMC,GAA6BC,EAAAA,EAAAA,wBAAuBpM,KAAKmI,iBAAkBnI,KAAKwI,SACtFxI,KAAKwI,QAAQuD,cAAcC,MAAQC,EAAAA,kBAAkBI,cACrD,MAAMC,GAA4BF,EAAAA,EAAAA,wBAAuBpM,KAAKmI,iBAAkBnI,KAAKwI,SACrFxI,KAAKwI,QAAQuD,cAAcC,MAAQC,EAAAA,kBAAkBM,eACrD,MAAMC,GAA2BJ,EAAAA,EAAAA,wBAAuBpM,KAAKmI,iBAAkBnI,KAAKwI,SAGpF,GAAIsC,IAAkCA,EAA8BI,QAAS,CACzE,GAAIM,GAA4C,OAAnBlI,EACzB,IAAK,MAAMmJ,KAAiBnJ,EACxBtD,KAAK0M,wCAAwCD,EAAe3B,GAIpE9K,KAAK0M,wCAAwCpK,EAAWwI,EAA+B,CAG3F,MAAM6B,EAASC,EAAAA,EAAA,GACR5M,KAAKkC,OAAK,IACb2K,UAAWC,IAAW,WACtBC,MAAOpI,IAAAA,cAAA,MAAIkI,UAAU,qBAAqB1C,EAAU6C,WACpDvM,KAAMT,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAC3B6G,iBAAkB,CAAEJ,UAAW,uBAC/BK,oBAAqB,CAAEL,UAAWpM,SAAAA,EAAM2B,eAAiB,8BAAgC,6BACzF+K,kBAAmB,CAAEN,UAAWpM,SAAAA,EAAM2B,eAAiB,6BAA+B,4BACtFD,UAAWG,EACXgB,iBACA8J,UAAWpN,KAAKqN,gBAChB9I,iBAAkBvE,KAAKsN,iBACvBhN,QAASN,KAAKkC,MAAM5B,QACpBiN,SAAUvN,KAAKkC,MAAMqL,SACrB1K,UAAW7C,KAAKkC,MAAMW,UACtBhB,GAAI7B,KAAKkC,MAAML,GACf2J,wBACAgC,2BAA4BrD,EAAUqD,2BACtCC,oBAAqBzM,EAAAA,gBAAgBC,YAAYR,aAAI,EAAJA,EAAMA,KAAKyI,WACxDzI,SAAAA,EAAM2B,eACFuC,IAAAA,cAAA,MAAIkI,UAAU,gCAAgC1C,EAAUuD,qBAExD/I,IAAAA,cAAA,MAAIkI,UAAU,8BAA8B1C,EAAUwD,mBAE1D,KACJC,sBAAuB5N,KAAK6N,4BAC5BC,wBAAyB9N,KAAK+N,8BAC9BC,2BAA6BvD,EAUzB,KATA9F,IAAAA,cAACsJ,EAAAA,OAAM1K,OAAA2K,OAAA,CACHC,SAAUlD,EACV4B,UAAU,yBACVuB,KAAM7D,EACNwC,MAAO5C,EAAUkE,qBACblC,GAEHhC,EAAUkE,qBAGnBC,sBACK7D,GAAgBR,IAAmBjK,KAAKkC,MAAM2G,OAAO0F,wBAUlD,KATA5J,IAAAA,cAACsJ,EAAAA,OAAM1K,OAAA2K,OAAA,CACHC,SAAUlD,EACV4B,UAAU,8BACVuB,KAAMhE,EACN2C,MAAO5C,EAAUqE,0BACblC,GAEHnC,EAAUqE,0BAGvBC,sBAAwBhE,EAAgD,KAAlCzK,KAAKkC,MAAMwM,MAAMC,eACvDC,8BAA+B,CAAE/B,UAAW,8CAC5CgC,qBACIlK,IAAAA,cAACsJ,EAAAA,OAAM1K,OAAA2K,OAAA,CACHrB,UAAU,gCACNL,EAAwB,CAC5B4B,KAAM9D,EACNyC,MAAO5C,EAAU2E,4BAEhB3E,EAAU2E,2BAGnBC,6BACI/O,KAAKgP,6BAA+BrO,EAChCgE,IAAAA,cAACsK,EAAAA,iCAAgC,CAC7BC,kCAAmClP,KAAKmP,2CAA2ChF,GACnFiF,mCAAoCpP,KAAKqP,0CAA0ClF,GACnFmF,yCAA0CtP,KAAKuP,kDAAkDpF,GACjGqF,uDAAwDxP,KAAKyP,gEACzDtF,GAEJuF,kCAAmCvF,EAAUuF,kCAC7CC,yCAA0CxF,EAAUwF,yCACpDrP,QAASN,KAAKkC,MAAM5B,QACpBuB,GAAI7B,KAAKkC,MAAML,GACf0L,SAAUvN,KAAKkC,MAAMqL,SACrBqC,oCAAqClE,IAAoC,EACzEmE,UAAWlE,EACXxF,KAAM,CACF2J,eAAgB9P,KAAKkC,MAAMiE,KAAK2J,eAAe1J,OAC/C9D,UAAWtC,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAAQ3F,KAAKyI,UAC7C6G,oBAAqB/P,KAAKkC,MAAMiE,KAAK4J,oBAAoB3J,UAGjE,KACR4J,qCAAsC,KACtCC,cACIjQ,KAAKkC,MAAMwM,MAAMuB,eAAiBjQ,KAAKkC,MAAMwM,MAAMuB,cAAczN,OAAS,EAAIxC,KAAKkC,MAAMwM,MAAMuB,cAAc,GAAK,KACtHC,uBAAwBlQ,KAAKiG,0BAC7BW,6BAA8B5G,KAAK4G,6BACnCuJ,iBAAkBxL,IAAAA,cAACyL,EAAAA,QAAO,CAACvD,UAAU,wCACrCwD,kBAAmD,WAAhCrQ,KAAKkC,MAAMiE,KAAK1F,KAAKqG,OAAsB9G,KAAKkC,MAAMiI,UAAUmG,wBAA0B,KAC7GC,eAAgBvQ,KAAKkC,MAAMiE,KAAK1F,KAAK2F,QAAUpG,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAAOoK,QAC3EC,mBAAoBzQ,KAAK0Q,uBAAuBpO,GAChD6F,iBAAkBnI,KAAKmI,mBAG3B,OAAOnI,KAAKkC,MAAMyO,WAAWhE,EACjC,CAuBQrH,uBACJtF,KAAKkF,SAAS,CACVC,qBAAqB,GAE7B,CAMQ6J,4BAAyB,IAAA4B,EAAAC,EAC7B,MAAMpQ,EAA2B,QAAvBmQ,EAAG5Q,KAAKkC,MAAMiE,KAAK1F,YAAI,IAAAmQ,OAAA,EAApBA,EAAsBxK,OACnC,OAAImB,EAAAA,iBAAiBC,kBAAkB/G,KAASA,EAAK2B,oBAKjD0O,EAAAA,EAAAA,IAAiB9Q,KAAKkC,MAAM5B,QAAQ4H,cAAclG,iBAClDhC,KAAKkC,MAAMiE,KAAK2J,eAAe1J,QAC/BpF,EAAAA,gBAAgBC,YAAqB,QAAV4P,EAACpQ,EAAKA,YAAI,IAAAoQ,OAAA,EAATA,EAAW3H,YACvClJ,KAAKkC,MAAMiE,KAAK4J,oBAAoB3J,OAM5C,CAMQkH,iBACJ,OACItN,KAAKkC,MAAM2G,OAAOI,0BAClB8H,EAAAA,EAAAA,GAAe,CACXlP,GAAI7B,KAAK+E,iBACTiM,mBAAoBhR,KAAKoF,MAAMD,oBAC/B8L,cAAejR,KAAKgF,mBACpBkM,mBAAoBlR,KAAKqF,0BACzB8L,WAAYnR,KAAKoF,MAAMjB,cAAcI,iBACrC4F,UAAW,CACPiH,uBAAwBpR,KAAKkC,MAAMiI,UAAUiH,uBAC7CC,kBAAmBrR,KAAKkC,MAAMiI,UAAUkH,kBACxCC,sBAAuBtR,KAAKkC,MAAMiI,UAAUmH,sBAC5CC,8BAA+BvR,KAAKkC,MAAMiI,UAAUoH,gCAIpE,CAOQ7E,wCACJpK,EACAkP,GAEA,MAAM,UAAErH,GAAcnK,KAAKkC,MAE3B,GACIlB,EAAAA,gBAAgBC,YAAYqB,KAC3BkP,EAAkCtG,SACnClK,EAAAA,gBAAgBC,YAAYuQ,EAAkCC,qBAE9D,IAAK,MAAMC,KAAsBF,EAAkCC,oBAAqB,CACpF,MAAMzN,EAAW1B,aAAS,EAATA,EAAWgJ,MAAKqG,IAAO,IAAAC,EAAA,OAAgB,QAAZA,EAAAD,EAAQxL,YAAI,IAAAyL,OAAA,EAAZA,EAAc/K,SAASgL,aAAcH,CAAkB,IAC/F1N,IACAA,EAASlB,MAAQqH,EAAU2H,uBAC3B9N,EAASiH,UAAW,EAAI,CAIxC,CAOQyF,uBAAuBpO,GAC3B,MAAMyP,EACDzP,GACGA,EACKb,KAAIoF,IAAW,IAAAmL,EAIZ,MAFmC,QAAbA,EAAAnL,EAASV,YAAI,IAAA6L,GAAS,QAATA,EAAbA,EAAetQ,eAAO,IAAAsQ,OAAA,EAAtBA,EAAwBC,iBAAkBC,EAAAA,oBAAoBC,UAE9DtL,EAAS/D,MAAO,CAAC,IAADsP,EAClC,MAAMC,EACFxL,EAASV,MAA6B,QAAzBiM,EAAIvL,EAASV,KAAKzE,eAAO,IAAA0Q,GAArBA,EAAuB7G,KAClC,GAAG1E,EAASV,KAAKzE,QAAQ6J,SAAS1E,EAAS/D,QAC3C+D,EAAS/D,MAEnB,OACI6B,IAAAA,cAAA,OAAKb,IAAKuO,EAAWxF,UAAU,mBAC1BwF,EACC,CAId,OAAO,IAAI,IAEdC,QAAQC,KAAgCA,KACjD,GAEJ,MAAO,CACHC,QAAS,CACLC,IAAKC,EAAAA,MACL7F,UAAW,YACX8F,OAAQZ,EAAUvP,OAAS,EAC3BoQ,MAAO,SACPC,WAAW,EACX,aAAc7S,KAAKkC,MAAMiI,UAAU2I,8BAEvCC,OACIpO,IAAAA,cAAA,OAAKkI,UAAU,oBAAmB,cAAa,QAC3ClI,IAAAA,cAAA,QAAMkI,UAAU,6BAChBlI,IAAAA,cAAA,YAAO3E,KAAKkC,MAAMiI,UAAU2I,+BAGpCE,OAAQjB,EAEhB,CAMQhE,8BACJ,MACI5H,MACI1F,MAAQ2F,OAAQ3F,IACnB,UACDoC,EAAS,UACTsH,GACAnK,KAAKkC,MAET,OAAOzB,SAAAA,EAAM2B,gBACP6Q,EAAAA,EAAAA,GAAe,CACXC,gBAAiB/I,EAAUgJ,iBAC3BC,aAAcjJ,EAAUiJ,aACxB3S,KAAMA,EAAKA,KACXH,QAASN,KAAKkC,MAAM5B,QACpBiN,SAAUvN,KAAKkC,MAAMqL,SACrB1K,YACAhB,GAAI7B,KAAKkC,MAAML,UAEnBd,CACV,CAMQ8M,4BAAyB,IAAAwF,EAAAC,EAAAC,EAC7B,MACIpN,MACI1F,MAAQ2F,OAAQ3F,GAAM,4BACtB+S,GACH,UACD3Q,EAAS,UACTsH,GACAnK,KAAKkC,MAEHuR,EAAuBzT,KAAKkC,MAAM5B,SAAWN,KAAKkC,MAAM5B,QAAQ+H,SAAWrI,KAAKkC,MAAM5B,QAAQ+H,QAAQuC,QAEtGS,EAAyB,QAAbgI,EAAGrT,KAAKkC,aAAK,IAAAmR,GAAM,QAANA,EAAVA,EAAYlN,YAAI,IAAAkN,OAAA,EAAhBA,EAAkBhI,aACjCqI,EAAoCrI,SAAoB,QAARiI,EAAZjI,EAAcjF,cAAM,IAAAkN,GAA2D,QAA3DA,EAApBA,EAAsBhI,MAAKpI,GAF/B,oEAEuCA,EAAKqI,cAAuC,IAAA+H,OAAA,EAA/EA,EACpC7H,UAEAkI,GAA+G,KAAjD,QAArCJ,EAAAvT,KAAKkC,MAAM5B,QAAQ+H,QAAQuL,IAAI/K,cAAM,IAAA0K,OAAA,EAArCA,EAAuCM,4CAEtE,OAAOJ,IAAwBzS,EAAAA,gBAAgBC,YAAYR,aAAI,EAAJA,EAAMA,KAAKyI,YAAezI,SAAAA,EAAM2B,oBAqBrFrB,GApBA+S,EAAAA,EAAAA,GAAa,CACTrT,KAAMA,EAAMA,KACZsT,cAAe5J,EAAU6J,oBACzBC,cAAe9J,EAAU+J,uBACzBC,iBAAkBhK,EAAUiK,aAC5BC,SAAUlK,EAAUmK,kBACpBpB,gBAAiB/I,EAAUoK,WAC3BC,oBAAqBrK,EAAUqK,oBAC/BlU,QAASN,KAAKkC,MAAM5B,QACpBiN,SAAUvN,KAAKkC,MAAMqL,SACrB1L,GAAI7B,KAAKkC,MAAML,GACf4S,mBAAoBtK,EAAUuK,sBAC9BC,SAAUxK,EAAUyK,UACpBnB,uBACAC,oCACAF,4BAA6BA,aAA2B,EAA3BA,EAA6BpN,OAC1DvD,YACAgS,qBAAsBpU,EAAMA,KAAKqU,qBACjCC,iBAAkBpB,GAGhC,CAMQtG,gBACJ,MACIlH,MACI1F,MAAQ2F,OAAQ3F,IACnB,UACD0J,GACAnK,KAAKkC,MAET,OACIzB,GACIkE,IAAAA,cAACqQ,EAAAA,mBAAkB,CACfvU,KAAMA,EACNwU,qBAAsB9K,EAAU8K,qBAChCC,qBAAsB/K,EAAU+K,qBAChCC,yBAA0BhL,EAAUgL,yBACpCC,4BAA6BjL,EAAUiL,4BACvCC,gBAAiB,IACjB7H,2BAA4BrD,EAAUqD,2BACtC8H,gBAAiBnL,EAAUmL,gBAC3BC,0BAA2BpL,EAAUoL,0BACrCC,8BAA+BrL,EAAUqL,8BACzCC,iCAAkCtL,EAAUsL,iCAC5CC,4BAA6BvL,EAAUwL,4BACvCrV,QAASN,KAAKkC,MAAM5B,QACpBuB,GAAI7B,KAAKkC,MAAML,GACf0L,SAAUvN,KAAKkC,MAAMqL,SACrBpH,KAAM,CAAC,EACPgC,iBAAkBnI,KAAKmI,kBAIvC,CAOQgH,2CAA2ChF,GAC/C,MAAO,CACHyL,yBAA0BzL,EAAUyL,yBAEpCC,wBAAyB1L,EAAU0L,wBACnCC,4BAA6B3L,EAAU2L,4BAEvCC,gCAAiC5L,EAAU4L,gCAC3CC,iCAAkC7L,EAAU6L,iCAC5CC,sCAAuC9L,EAAU8L,sCAEjDC,oBAAqB/L,EAAU+L,oBAC/BC,wBAAyBhM,EAAUgM,wBACnCC,cAAejM,EAAUiM,cAEjC,CAOQC,iDAAiDlM,GACrD,MAAO,CACHmM,4BAA6BnM,EAAUmM,4BACvCC,2BAA4BpM,EAAUoM,2BACtCC,0CAA2CrM,EAAUqM,0CACrDC,6CAA8CtM,EAAUsM,6CACxDC,0CAA2CvM,EAAUuM,0CACrDC,cAAexM,EAAUwM,cACzBC,kBAAmBzM,EAAUyM,kBAC7BC,iBAAkB1M,EAAU0M,iBAEpC,CAOQtH,kDAAkDpF,GACtD,MAAO,CACHmM,4BAA6BnM,EAAUmM,4BACvCC,2BAA4BpM,EAAUoM,2BACtCO,4CAA6C3M,EAAU2M,4CACvDC,+CAAgD5M,EAAU4M,+CAC1DC,4CAA6C7M,EAAU6M,4CACvDC,+CAAgD9M,EAAU8M,+CAC1DC,2CAA4C/M,EAAU+M,2CACtDC,qDAAsDhN,EAAUgN,qDAExE,CAOQ1H,gEACJtF,GAEA,MAAO,CACHiN,yBAA0BjN,EAAUiN,yBACpCC,8BAA+BlN,EAAUkN,8BACzCC,yBAA0BnN,EAAUmN,yBACpCC,+BAAgCpN,EAAUoN,+BAElD,CAOQlI,0CAA0ClF,GAC9C,MAAO,CACHqN,yBAA0BrN,EAAUsN,0BACpCC,wBAAyBvN,EAAUwN,mBACnCC,2BAA4BzN,EAAUyN,2BACtCC,yBAA0B1N,EAAU2N,+BAEpCC,yBAA0B5N,EAAU4N,yBAEpCC,yBAA0B7N,EAAU8N,8BACpCC,+BAAgC/N,EAAUgO,yCAElD,CAMQzN,gBAAa,IAAA0N,EAAAC,EAAAC,EACjB,MACInS,MACI1F,MAAQ2F,OAAQ3F,GAChB8X,WAAanS,OAAQmS,GACrBzI,gBAAkB1J,OAAQ0J,GAC1BC,qBAAuB3J,OAAQ2J,IAEnCzP,SACI+H,SAAWuC,SAAS,uBAAE4N,GAA2B,CAAEA,4BAAwBzX,KAC9E,OACD8H,EAAM,UACNhG,EAAS,UACTsH,EAAS,QACTsO,GACAzY,KAAKkC,MAEHsD,EAAgBxF,KAAKuF,iBAAiBsD,EAAOrD,eAE7C4F,EAAsE,QAAtCgN,EAAGpY,KAAKkC,MAAMiE,KAAKkF,aAAajF,cAAM,IAAAgS,OAAA,EAAnCA,EAAqC9M,MAC1ED,GAAsC,oEAAtBA,EAAaE,OAE3BC,EAAwBJ,aAAgC,EAAhCA,EAAkCK,UAE1DnE,EAAqDtH,KAAKoF,MAAMkC,gBACtE,IAAIoR,EAA0B,GAC1BD,GAAWlV,OAAOM,KAAK4U,GAASjW,OAAS,GAAKiW,EAAQxI,eAAiBwI,EAAQxI,cAAczN,OAAS,IACtGkW,EAAkBD,EAAQxI,cAAc,GAAGpO,IAE/C,MACM6J,GACiC,QAAnC2M,EAAArY,KAAKkC,MAAMiE,KAAKkF,aAAajF,cAAM,IAAAiS,GAA4E,QAA5EA,EAAnCA,EAAqC/M,MAAMpI,GAFR,2DAE+BA,EAAKqI,cAAwC,IAAA8M,OAAA,EAA/GA,EAAiH5M,aACjH,EACJ,OAAOzK,EAAAA,gBAAgBC,YAAYR,aAAI,EAAJA,EAAMA,KAAKyI,YACxCyP,EAAAA,EAAAA,GAAc,CACVxW,UAAW1B,EAAMA,KAAKyI,UACtB0P,sBAAuBF,EACvBpR,kBACA3G,SAAUX,KAAKkC,MAAMiE,KAAKxF,SAASyF,OACnC4E,qBAAsBhL,KAAKkC,MAAMiE,KAAK6E,qBAAqB5E,OAC3DyS,uBAAwB7Y,KAAKkC,MAAMiE,KAAK2S,gBAAgB1S,OACxD2S,SAAkC,QAA1BT,EAAEtY,KAAKkC,MAAMiE,KAAK4S,gBAAQ,IAAAT,OAAA,EAAxBA,EAA0BlS,OACpCZ,gBACAwT,oBAAqBhZ,KAAKkC,MAAM5B,QAAQsT,IAAI/K,OAAOoQ,mBAAoB,EACvEC,qBAAqBC,EAAAA,EAAAA,kCAAiCnZ,KAAKkC,MAAM5B,QAAQsT,IAAI/K,OAAOuQ,4BACpFC,sBAA8E,aAAvDrZ,KAAKkC,MAAM5B,QAAQsT,IAAI/K,OAAOyQ,qBACrDC,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzCjZ,QAASN,KAAKkC,MAAM5B,QACpBiN,SAAUvN,KAAKkC,MAAMqL,SACrB1L,GAAI7B,KAAKkC,MAAML,GACf2X,iCAAkChO,EAClCrB,UAAW,CACPsP,WAAYtP,EAAUuP,yBACtBC,YAAaxP,EAAUyP,0BACvBC,aAAc1P,EAAU2P,kCACxBC,YAAa5P,EAAU6P,0BACvBC,aAAc9P,EAAU+P,2BACxBC,sBAAuBhQ,EAAUiQ,oBACjCC,uBAAwBlQ,EAAUkQ,uBAClCC,yBAA0BnQ,EAAUmQ,yBACpCC,yBAA0BpQ,EAAUoQ,yBACpCC,mBAAoBrQ,EAAUqQ,mBAC9B5D,kBAAmBzM,EAAUyM,kBAC7BC,iBAAkB1M,EAAU0M,iBAC5B4D,oBAAqBtQ,EAAUuQ,gBAC/BC,0BAA2BxQ,EAAUwQ,0BACrCC,qBAAoBhO,EAAA,GACbzC,IAGXtH,YACAgY,wBAAyB1Q,EAAU0Q,wBACnCC,6BAA8B3Q,EAAU2Q,6BACxCC,iBAAkB5Q,EAAU6Q,qBAC5BC,WAAY9Q,EAAU+Q,uBACtBC,aAAchR,EAAUiR,oBACxBC,gBAAiBlR,EAAUmR,uBAC3BC,0BAA2Bvb,KAAKkC,MAAMiE,KAAKoV,0BAA0BnV,OACrEoV,eAAgBrR,EAAU2H,uBAC1B2J,kBAAmBtR,EAAUuR,8BAC7BC,qBAAsBxR,EAAUyR,6BAChCC,UAAW7b,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAChC0V,iBAAkB9b,KAAKkC,MAAMiE,KAAK2V,iBAAiB1V,OACnD8J,uBAAwBlQ,KAAKiG,0BAC7BW,6BAA8B5G,KAAK4G,6BACnCmV,sCAAuC/b,KAAK+G,uBAC5CiV,uBAAwBhc,KAAKiI,0BAC7BsQ,YACA0D,oBAAqB9R,EAAU8R,oBAC/BC,uBAAwB1D,EACxB2D,cAAetT,EAAOuT,qBACtBC,gCAAiCxT,EAAOwT,gCACxClU,iBAAkBnI,KAAKmI,iBACvBtD,+BAAgC7E,KAAK6E,+BAErCqK,kCAAmClP,KAAKmP,2CAA2ChF,GACnFiF,mCAAoCpP,KAAKqP,0CAA0ClF,GACnFmS,wCAAyCtc,KAAKqW,iDAAiDlM,GAC/FqF,uDAAwDxP,KAAKyP,gEACzDtF,GAGJoS,6BAA8BpS,EAAUoS,6BACxCC,gCAAiCrS,EAAUqS,gCAC3CC,0BAA2BtS,EAAUsS,0BACrCC,4BAA6BvS,EAAUuS,4BACvC5M,iBACAC,sBACA4M,oBAAqB3c,KAAKkC,MAAMiE,KAAK6E,qBACrC4E,oCAAqClE,IAAoC,IAE7E,IACV,CASQlB,eAAeP,EAA0BG,EAA0BF,GACvE,GAAID,EACA,OAAOG,EAGX,MAAMwS,GAAgBC,EAAAA,EAAAA,UAASzS,GAC/B,IAAI0S,EAAY1S,EAKhB,OAJI2S,EAAAA,GAASC,YAAcJ,IACvBE,EAAY,GAAGG,OAAOC,SAASC,SAAS/S,KAGrC,GAAGF,IAAaA,EAAUkT,SAAS,KAAa,IAAN,SAAeN,GACpE,CAkIQ3c,qBACJ,IAAKH,KAAK6E,+BAEN,OADA7E,KAAKkF,SAAS,CAAEoC,gBAAiB,CAAC,EAAGqB,aAAa,IAC3C0U,EAAAA,YAAYlc,UAGvB,MACIgF,MAAM,KAAE1F,GAAM,UACdoC,EAAS,QACTvC,GACAN,KAAKkC,MAEH2F,QAAyEyV,EAAAA,EAAAA,IAAkB7c,EAAMoC,EAAWvC,GAAS,GAE3H,GAAIuH,EAAmB,CACnB,MAAMqD,GAAWlK,EAAAA,gBAAgBC,YAAY4G,EAAkBG,wBAC/DhI,KAAKkF,SAAS,CACVoC,gBAAiBO,EACjBc,YAAauC,GACd,MAEHlL,KAAKkF,SAAS,CAAEoC,gBAAiB,CAAC,EAAGqB,aAAa,IAGtD,OAAO0U,EAAAA,YAAYlc,SACvB,CAMQhB,0CAAuC,IAAAod,EAC3C,MAAMC,QAAwBxd,KAAKkC,MAAMiE,KAAKkF,aAE9C,IAAK,IAADoS,EAKA,MADK,QAFDA,EAAAD,EAAgBlS,MACZD,GAAsC,oEAAtBA,EAAaE,cAChC,IAAAkS,OAAA,EAFDA,EAEGhS,aAAa,GAEhB,OAAO,CAKE,CAHf,MAAO3I,GAGL,OAFA9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,iCACpB,CAAM,CAOjB,KAJ+B6W,SAE9B,QAF6CD,EAAfC,EAAiBlS,MAC5CD,GAAsC,mDAAtBA,EAAaE,cAChC,IAAAgS,OAAA,EAF8BA,EAE5B9R,WAwBI,CAAC,IAADiS,EACH,MAAMC,QAA0B3d,KAAKkC,MAAMiE,KAAKwX,kBAChD,QAA+C,QAAxCD,EAAEC,aAAiB,EAAjBA,EAAmBC,2BAAmB,IAAAF,GAAAA,EAAW,CAxBlC,CAAC,IAADG,EACxB,MAAMC,EAA4D,QAArBD,EAAG7d,KAAKkC,MAAM5B,eAAO,IAAAud,GAAS,QAATA,EAAlBA,EAAoBxV,eAAO,IAAAwV,GAAK,QAALA,EAA3BA,EAA6BjK,WAAG,IAAAiK,GAAU,QAAVA,EAAhCA,EAAkCE,gBAAQ,IAAAF,OAAA,EAA1CA,EAA4CG,iCAC5F,GAAgD,SAA5CF,EACA,OAAO,EAGX,GAAgD,QAA5CA,EACA,OAAO,EAGX,IACI,MAAMG,QAAqBje,KAAKkC,MAAMiE,KAAK4J,oBAC3C,QACMkO,IAC4C,QAA5CH,GAAqDG,EAAaC,OACnB,QAA5CJ,IAAsDG,EAAaC,MAK/D,CAHf,MAAOpb,GAGL,OAFA9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,gCACpB,CAAM,CAAD,CAMxB,CAEQxG,uCAAoC,IAAAge,EACxC,MAAMX,QAAwBxd,KAAKkC,MAAMiE,KAAKkF,aAExC+S,EAAoCZ,SAEzC,QAFwDW,EAAfX,EAAiBlS,MACvDD,GAAsC,wEAAtBA,EAAaE,cAChC,IAAA4S,OAAA,EAFyCA,EAEvC1S,UAEH,OAAO2S,SAAAA,CACX,CAMQtS,oBAAiB,IAAAuS,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EACrB,MACIvY,MACI1F,MAAQ2F,OAAQ3F,GAChB8X,WAAanS,OAAQmS,GACrBzI,gBAAkB1J,OAAQ0J,GAC1BC,qBAAuB3J,OAAQ2J,IAEnCzP,SACI+H,SAAWuC,SAAS,uBAAE4N,GAA2B,CAAEA,4BAAwBzX,KAC9E,OACD8H,EAAM,UACNhG,EAAS,UACTsH,EAAS,QACTsO,GACAzY,KAAKkC,MAEHsD,EAAgBxF,KAAKuF,iBAAiBsD,EAAOrD,eAC7C8B,EAAqDtH,KAAKoF,MAAMkC,gBACtE,IAAIoR,EAA0B,GAC1BD,GAAWlV,OAAOM,KAAK4U,GAASjW,OAAS,GAAKiW,EAAQxI,eAAiBwI,EAAQxI,cAAczN,OAAS,IACtGkW,EAAkBD,EAAQxI,cAAc,GAAGpO,IAG/C,MAAMuJ,EAAsE,QAAtCiT,EAAGre,KAAKkC,MAAMiE,KAAKkF,aAAajF,cAAM,IAAAiY,OAAA,EAAnCA,EAAqC/S,MAC1ED,GAAsC,oEAAtBA,EAAaE,OAE3BC,EAAwBJ,aAAgC,EAAhCA,EAAkCK,WAC1D,aAAEJ,GAAiBrL,KAAKkC,MAAMiE,KAE9BuF,GACiB,QAAnB4S,EAAAjT,EAAajF,cAAM,IAAAkY,GAA4E,QAA5EA,EAAnBA,EAAqBhT,MAAMpI,GAFQ,2DAEeA,EAAKqI,cAAwC,IAAA+S,OAAA,EAA/FA,EAAiG7S,aAAa,EAClH,OAAOzL,KAAKkC,MAAMiE,KAAKxF,WAClBF,SAAAA,EAAM2B,gBAAkBpC,KAAKkC,MAAMiE,KAAKxF,SAASyF,SAClD3F,GACAA,EAAKA,KAAKyI,WACVzI,EAAKA,KAAKyI,UAAU1G,OAAS,GACc,QADb+b,EAC9Bve,KAAKkC,MAAMiE,KAAKqN,mCAA2B,IAAA+K,GAA3CA,EAA6CnY,OAC3CnE,EAAmB,CACfE,UAAW1B,EAAKA,KAAKyI,UACrB0P,sBAAuBF,EACvBpR,kBACA3G,SAAUX,KAAKkC,MAAMiE,KAAKxF,SAASyF,OACnC4E,qBAAsBhL,KAAKkC,MAAMiE,KAAK6E,qBAAqB5E,OAC3DyS,uBAAwB7Y,KAAKkC,MAAMiE,KAAK2S,gBAAgB1S,OACxD2S,SAAkC,QAA1ByF,EAAExe,KAAKkC,MAAMiE,KAAK4S,gBAAQ,IAAAyF,OAAA,EAAxBA,EAA0BpY,OACpCZ,gBACAwT,oBAAqBhZ,KAAKkC,MAAM5B,QAAQsT,IAAI/K,OAAOoQ,mBAAoB,EACvE7W,gBAAgB3B,aAAI,EAAJA,EAAM2B,kBAAkB,EACxC8W,qBAAqBC,EAAAA,EAAAA,kCAAiCnZ,KAAKkC,MAAM5B,QAAQsT,IAAI/K,OAAOuQ,4BACpFG,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzCjZ,QAASN,KAAKkC,MAAM5B,QACpBkZ,iCAAkChO,EAClC+B,SAAUvN,KAAKkC,MAAMqL,SACrB1L,GAAI7B,KAAKkC,MAAML,GACfsI,UAAW,CACPsP,WAAYtP,EAAUuP,yBACtBC,YAAaxP,EAAUyP,0BACvBC,aAAc1P,EAAU2P,kCACxBC,YAAa5P,EAAU6P,0BACvBC,aAAc9P,EAAU+P,2BACxBC,sBAAuBhQ,EAAUiQ,oBACjCC,uBAAwBlQ,EAAUkQ,uBAClCC,yBAA0BnQ,EAAUmQ,yBACpCC,yBAA0BpQ,EAAUoQ,yBACpCC,mBAAoBrQ,EAAUqQ,mBAC9B5D,kBAAmBzM,EAAUyM,kBAC7BC,iBAAkB1M,EAAU0M,iBAC5B4D,oBAAqBtQ,EAAUuQ,gBAC/BC,0BAA2BxQ,EAAUwQ,0BACrCC,qBAAoBhO,EAAA,GACbzC,IAGXtH,YACAgY,wBAAyB1Q,EAAU0Q,wBACnCC,6BAA8B3Q,EAAU2Q,6BACxCC,iBAAkB5Q,EAAU6Q,qBAC5BC,WAAY9Q,EAAU+Q,uBACtBC,aAAchR,EAAUiR,oBACxBC,gBAAiBlR,EAAUmR,uBAC3BC,0BAA2Bvb,KAAKkC,MAAMiE,KAAKoV,0BAA0BnV,OACrEoV,eAAgBrR,EAAU2H,uBAC1B2J,kBAAmBtR,EAAUuR,8BAC7BC,qBAAsBxR,EAAUyR,6BAChCC,UAAW7b,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAChC0V,iBAAkB9b,KAAKkC,MAAMiE,KAAK2V,iBAAiB1V,OACnD8J,uBAAwBlQ,KAAKiG,0BAC7BW,6BAA8B5G,KAAK4G,6BACnCmV,sCAAuC/b,KAAK+G,uBAC5CiV,uBAAwBhc,KAAKiI,0BAC7BsQ,YACA0D,oBAAqB9R,EAAU8R,oBAC/BC,uBAAwB1D,EACxB2D,cAAetT,EAAOuT,qBACtBC,gCAAiCxT,EAAOwT,gCACxClU,iBAAkBnI,KAAKmI,iBACvBtD,+BAAgC7E,KAAK6E,+BAErCqK,kCAAmClP,KAAKmP,2CAA2ChF,GACnFiF,mCAAoCpP,KAAKqP,0CAA0ClF,GACnFmS,wCAAyCtc,KAAKqW,iDAAiDlM,GAC/FqF,uDAAwDxP,KAAKyP,gEACzDtF,GAGJoS,6BAA8BpS,EAAUoS,6BACxCC,gCAAiCrS,EAAUqS,gCAC3CC,0BAA2BtS,EAAUsS,0BACrCC,4BAA6BvS,EAAUuS,4BACvC5M,iBACAC,sBACAyD,4BAAwE,QAA7CiL,EAAEze,KAAKkC,MAAMiE,KAAKqN,mCAA2B,IAAAiL,OAAA,EAA3CA,EAA6CrY,OAC1EiT,sBAA8E,aAAvDrZ,KAAKkC,MAAM5B,QAAQsT,IAAI/K,OAAOyQ,qBACrDqD,oBAAqB3c,KAAKkC,MAAMiE,KAAK6E,qBACrCpC,qBAAsB5I,KAAKoF,MAAMwD,uBAA8D,QAA1C8V,EAAI1e,KAAKkC,MAAMiE,KAAKwY,8BAAsB,IAAAD,OAAA,EAAtCA,EAAwCtY,QACjGwJ,oCAAqClE,IAAoC,IAE7E,IACV,GA9jCEhH,GAAIka,EAAAA,EAAAA,IAAA,CADTC,EAAAA,IACKna,GAikCN,yxBCrlCA,MAAMoa,UAAqBna,EAAAA,UA6BvB/E,YAAmBsC,GAA4C,IAAA6c,EAAArb,EAAAsb,EAC3Dpa,MAAM1C,GAAM6c,EAAA/e,KA7BC,KAAAif,kBAAiD,IAAIC,IAErD,KAAAC,2BAAqFxa,EAAAA,YACrF,KAAAya,OAAkCza,EAAAA,YAGlC,KAAA0a,4BAA8C,CAC3D5Z,UAAW,CACPC,GAAI,CAAEC,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCyZ,GAAI,CAAE3Z,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCE,GAAI,CAAEJ,EAAG,YAAaC,EAAG,EAAGC,EAAG,IAEnCG,UAAU,EACVuZ,iBAAiB,GAGJ,KAAAC,8BAAgD,CAC7D/Z,UAAW,CACPC,GAAI,CAAEC,EAAG,YAAaC,EAAG,IAAKC,EAAG,GACjCE,GAAI,CAAEJ,EAAG,YAAaC,EAAG,IAAKC,EAAG,IAErCG,UAAU,EACVuZ,iBAAiB,GA2MJ,KAAAE,UAAY,KACzBzf,KAAKkF,SAAS,CAAEwa,WAAW,GAAO,EAGrB,KAAAC,SAAW,KACxB3f,KAAKkF,SAAS,CAAEwa,WAAW,GAAQ,EAMtB,KAAAE,KAAO,KAEpB,IADAC,EAAAA,EAAAA,8BAC0B9e,IAAtBf,KAAK8f,aACL,OAGJ,MAAMC,EAAY/f,KAAK8f,aAAe,EAAI9f,KAAKoF,MAAM4a,YAAc,EACnEhgB,KAAKigB,UAAUF,GAEf/f,KAAKkgB,qBAAqB,EAMb,KAAAC,SAAW,MACxBN,EAAAA,EAAAA,yBACA,MAAMO,EAASpgB,KAAKoF,MAAMib,kBACpBN,EAAY/f,KAAKsgB,cAAiBF,EAASA,EAAO5d,OAAS,EAAI,EAAKxC,KAAKoF,MAAM4a,YAAc,EACnGhgB,KAAKigB,UAAUF,GACf/f,KAAKkgB,qBAAqB,EAGb,KAAAD,UAAalc,IAC1B,MAAM,SAAEwc,GAAavgB,KAAKkC,MAAM2G,OAC1B2X,EAAexgB,KAAKoF,MAAM4a,YAC1BS,EAAazgB,KAAKoF,MAAMib,kBACD,IAADK,EACwCC,EADpE,GAAIJ,GAAYE,EACZ,IAA0B,QAAtBC,EAAAD,EAAW,GAAG1c,YAAQ,IAAA2c,OAAA,EAAtBA,EAAwBE,kBAAmBC,EAAAA,UAAUC,MAClC,QAAnBH,EAAA3gB,KAAKof,OAAO2B,eAAO,IAAAJ,GAAnBA,EAAqBK,YAClB,GAAIP,EAAW,GAAGD,KAAgBI,iBAAmBC,EAAAA,UAAUC,MAAO,CAAC,IAADG,EACtD,QAAnBA,EAAAjhB,KAAKof,OAAO2B,eAAO,IAAAE,GAAnBA,EAAqBC,OAAQ,CAGrClhB,KAAKkF,SAAS,CAAE8a,YAAajc,GAAQ,EAiDjC,KAAAod,cAAgB,KAAmB,IAAAxX,EACvC,GAAI3J,KAAKkC,MAAM2G,OAAOuY,qBAAqD,QAAlCzX,EAAI3J,KAAKkC,MAAM5B,QAAQ+H,QAAQuL,WAAG,IAAAjK,GAAQ,QAARA,EAA9BA,EAAgCd,cAAM,IAAAc,GAAtCA,EAAwC0X,iBAAkB,CAAC,IAADC,EAAAC,EACnG,MAAMC,EAAsC,QAAhCF,EAAGthB,KAAKkC,MAAM2G,OAAO4Y,mBAAW,IAAAH,EAAAA,EAAA,cAC5C,IAAIlB,EAAuB,GACvBsB,EAAkC,GAC5B,gBAANF,GAAsCxhB,KAAKkC,MAAMiE,KAAKwb,iCAAiCvb,OACvFsb,EAAiB1hB,KAAKkC,MAAMiE,KAAKwb,iCAAiCvb,OACrD,cAANob,GAAoCxhB,KAAKkC,MAAMiE,KAAKub,eAAetb,SAC1Esb,EAAiB1hB,KAAKkC,MAAMiE,KAAKub,eAAetb,QAEpDga,EAASsB,EAAejgB,KAAImgB,IAAgB,IAAAC,EAAAhY,EACxC,MAAO,CACHiY,IAAsB,QAAnBD,EAAED,EAAcG,WAAG,IAAAF,EAAAA,EAAI,GAC1BG,SAASC,EAAAA,EAAAA,GACLjiB,KAAKkC,MAAM5B,QAAQ4H,cAAclG,eACjChC,KAAKkiB,sBACyB,QADJrY,EAC1B7J,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,cAAM,IAAAyD,OAAA,EAA9BA,EAAgC0B,KAChCqW,EAAcO,SAElBC,qBAAsBR,EAAcS,6BAC9B,CACIC,6BAA8B,aAElCvhB,EACT,IAEL,MAAMwhB,EAAwC,QAA3BhB,EAAGvhB,KAAKkC,MAAM2G,OAAOuX,cAAM,IAAAmB,EAAAA,EAAI,GAElD,MAAO,IAAIvhB,KAAKwiB,8BAA8BpC,MAAYmC,EAAe,CAE7E,MAAO,EAAE,EAiJI,KAAAE,yBAA2B,CAACC,EAAuB3e,EAAeyB,KAC/E,MAAMmd,EAAYD,EAAUC,UAC5B,GAAIA,EAAW,CAAC,IAADC,EACX,MAAMC,EAA0B7iB,KAAKkC,MAAM2G,OACrCia,EAAkB9iB,KAAKkC,MAAMiI,UAC7B4Y,EAAgC,CAAC,EACvCA,EAAcC,QAAUL,EAAU9gB,GAClCkhB,EAAchW,MAAQ4V,EAAU5V,MAChCgW,EAAcE,SAAWN,EAAUO,SAC/BP,EAAUQ,YACVJ,EAAcK,eAAiBT,EAAUQ,UAAUrB,KAEnC,QAApBc,EAAID,EAAUU,cAAM,IAAAT,GAAhBA,EAAkBU,mBAClBP,EAAcQ,sBAAwBZ,EAAUU,OAAOC,kBAE3D,MAAME,EAA+B,CAAEX,UAASY,SAAUV,GACpDW,EAAa,CACf7hB,GAAI,GAAG7B,KAAKkC,MAAML,sBAAsBkC,KAE5C,OACIY,EAAAA,cAACmc,EAAAA,GAAK,CAACjU,UAAU,2BAA2B8W,UAAW,CAAE7f,IAAK6e,EAAW3gB,eAAgBhC,KAAKkC,MAAM5B,QAAQ+H,UACxG1D,EAAAA,cAACif,EAAAA,OAAMrgB,OAAA2K,OAAA,CACH2V,IAAK7jB,KAAKof,OACV0E,WAAYN,EACZO,SAAU/jB,KAAKkC,MAAM5B,QAAQ+H,QAAQ2b,OAAOD,SAC5CjB,gBAAiBA,GACbY,IAEJ,CAGhB,OAAO1jB,KAAKikB,kBAAkBze,EAAc,EAG/B,KAAA0e,iBAAmB,SAChCC,EACA3e,EACAzB,GAAa,IAAAwP,EAAA,IACb6Q,EAAAC,UAAA7hB,OAAA,QAAAzB,IAAAsjB,UAAA,IAAAA,UAAA,GAA0B,OAE1B1f,EAAAA,cAAC2f,EAAAA,GAAK/gB,OAAA2K,OAAA,CACFlM,eAAgB+c,EAAK7c,MAAM5B,QAAQ4H,cAAclG,eACjD6K,UAAU,0BACNsX,EAAK,CACTI,YAA2C,QAA9BhR,EAAAwL,EAAK7c,MAAM5B,QAAQ+H,QAAQuL,WAAG,IAAAL,GAAQ,QAARA,EAA9BA,EAAgC1K,cAAM,IAAA0K,GAAtCA,EAAwC8N,iBAAmB,GAAe,IAAVtd,EAAcgb,EAAKyF,cAAgBL,EAAMrC,IACtHvI,aAAcwF,EAAK7c,MAAM5B,QAAQ+H,QAAQkR,aACzC/T,cAAeA,EACfif,oBAAoB,OACpB5iB,GAAI,GAAGkd,EAAK7c,MAAML,sBAAsBkC,IACxC2gB,sBAAuBN,EACvBO,oBAA+B,IAAV5gB,IACvB,EAGW,KAAA6gB,kBAAoB,CACjCT,EACA3e,EACAzB,EACA8gB,KAOO,CACHC,4BAA6B,CACzBrS,IAAK,KACL5F,UARQC,IACZ,mCACA+X,IAAwB9gB,EAAQ,0CAA4C,IAOxEghB,KAAM,MACNC,SAAU,EACVlhB,IAAKC,EACL,aAAcogB,EAAMnC,QACpB,gBAAiB6C,IAAwB9gB,EACzCkhB,QAASjlB,KAAKklB,0BAA0BnhB,GACxCohB,UAAWnlB,KAAKolB,4BAA4BrhB,IAEhDshB,QACI1gB,EAAAA,cAAC2f,EAAAA,GAAK/gB,OAAA2K,OAAA,CACFlM,eAAgBhC,KAAKkC,MAAM5B,QAAQ4H,cAAclG,eACjD6K,UAAU,+BACNsX,EAAK,CACTI,YAAuB,IAAVxgB,EAAc/D,KAAKwkB,cAAgBL,EAAMrC,IACtDvI,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzC/T,cAAeA,EACfif,oBAAoB,OACpBa,sBAAuBtlB,KAAKoF,MAAMmgB,wBAClCZ,oBAA+B,IAAV5gB,OAWpB,KAAAyhB,sBAAwB,CACrC9C,EACAld,EACAzB,EACA8gB,KAEA,MAAMY,EAAU3Y,IACZ,mCACA+X,IAAwB9gB,EAAQ,0CAA4C,IAG1E4e,EAAYD,EAAUC,UAC5B,IAAIwB,EASJ,OAPIA,EADAxB,SAAAA,EAAWQ,UACHR,EAAUQ,UAEV,CACJrB,IAAK,SAIN,CACHgD,4BAA6B,CACzBrS,IAAK,KACL5F,UAAW4Y,EACXV,KAAM,MACNC,SAAU,EACVlhB,IAAKC,EACL,aAAcogB,EAAMnC,QACpB,gBAAiB6C,IAAwB9gB,EACzCkhB,QAASjlB,KAAKklB,0BAA0BnhB,GACxCohB,UAAWnlB,KAAKolB,4BAA4BrhB,IAEhDshB,QACI1gB,EAAAA,cAAC2f,EAAAA,GAAK/gB,OAAA2K,OAAA,CACFlM,eAAgBhC,KAAKkC,MAAM5B,QAAQ4H,cAAclG,eACjD6K,UAAU,+BACNsX,EAAK,CACTI,YAAaJ,EAAMrC,IACnBvI,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzC/T,cAAeA,EACfif,oBAAoB,OACpBa,sBAAuBtlB,KAAKoF,MAAMmgB,wBAClCZ,oBAA+B,IAAV5gB,KAGhC,EAQY,KAAA2hB,YAAe3hB,GAAmB4hB,IAC/C3lB,KAAKif,kBAAkB2G,IAAI7hB,EAAO4hB,EAAO,EAG5B,KAAAP,4BAA+BrhB,GACpCkB,IACAA,EAAM4gB,QAAUC,EAAAA,SAASC,OAAS9gB,EAAM4gB,QAAUC,EAAAA,SAASE,QAC3D/gB,EAAMghB,iBAENjmB,KAAKigB,UAAUlc,GAAO,EAKjB,KAAAmhB,0BAA6BnhB,GAClCkB,IACJA,EAAMghB,iBAENjmB,KAAKigB,UAAUlc,EAAM,EA0LZ,KAAAmiB,sBAAwB,CAACxD,EAAuB3e,EAAeyB,KAC5E,MAAMmd,EAAYD,EAAUC,UAC5B,IAAIwB,EASJ,OAPIA,EADAxB,SAAAA,EAAWQ,UACHR,EAAUQ,UAEV,CACJrB,IAAK,SAKTnd,EAAAA,cAAA,OAAKkI,UAAU,yBACXlI,EAAAA,cAAC2f,EAAAA,GAAK/gB,OAAA2K,OAAA,CACFlM,eAAgBhC,KAAKkC,MAAM5B,QAAQ4H,cAAclG,eACjD6K,UAAU,gCACNsX,EAAK,CACTI,YAAaJ,EAAMrC,IACnBvI,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzC/T,cAAeA,EACfif,oBAAoB,OACpBa,sBAAuBtlB,KAAKoF,MAAMmgB,wBAClCZ,oBAA+B,IAAV5gB,KAEzBY,EAAAA,cAAA,OAAKkI,UAAU,wCAEXlI,EAAAA,cAAA,UACIoI,MAAO/M,KAAKkC,MAAMiI,UAAUgc,oBAC5BpB,KAAK,SACLlB,IAAK7jB,KAAKmf,2BACV8F,QAASjlB,KAAKomB,gBACdvZ,UAAU,4CAGhB,EA6DG,KAAAyT,YAAc,IAAiC,IAA3BtgB,KAAKoF,MAAM4a,YAE/B,KAAAF,WAAa,KAC1B,MAAMM,EAASpgB,KAAKoF,MAAMib,kBAC1B,OAAOD,GAAUpgB,KAAKoF,MAAM4a,cAAgBI,EAAO5d,OAAS,CAAC,EAGhD,KAAA4jB,gBAAkB,KAC/BpmB,KAAKqmB,cAAc,EAyBN,KAAAC,iBAAoBC,IACjC,MACIpgB,MACIzE,SAAW0E,OAAQ1E,IACtB,UACDyI,GACAnK,KAAKkC,MACT,IAAIme,EAAoBrgB,KAAKoF,MAAMib,mBAE9BA,GAAqB3e,IACtB2e,EAAoB,CAACrgB,KAAKwmB,uBAAuB9kB,KAErD,MAAM+kB,EAAgB,CAClBhU,IAAKiU,EAAAA,SACL7Z,UAAW,6BACX7J,MACIqd,GACAA,EAAkB5e,KAAI,CAACyB,EAAkBa,IACrC/D,KAAK2mB,6BAA6BJ,EAAUrjB,EAAMlD,KAAK4mB,qBAAsB7iB,GAAO,KAE5Fic,YAAahgB,KAAKoF,MAAM4a,YACxBJ,KAAM5f,KAAK4f,KACXO,SAAUngB,KAAKmgB,SACf0G,UAAU,EACVC,kBAAmB3c,EAAU4c,8BAC7BC,kBAAmB7c,EAAU8c,0BAC7BC,yBAA0BlnB,KAAKigB,UAC/BkH,uBAAuB,EACvBC,eAAe,EACfC,UAAU,EACVC,eAAgBtnB,KAAK2f,SACrB4H,gBAAiBvnB,KAAKyf,UACtB+H,wBAAyBxnB,KAAKoF,MAAMqiB,qBAElCC,EAAW/iB,EAAAA,cAAC+hB,EAAAA,SAAQnjB,OAAA2K,OAAA,GAAKuY,IAEzBkB,EAAyC,CAC3CC,YAAa5nB,KAAKoF,MAAMwiB,YACxBC,SAAU7nB,KAAKqmB,aACfyB,gBAAiBJ,EACjBK,WAAYjb,IAAW,0BAA2B,6BAEtD,OAAOkb,EAAAA,EAAAA,eAAcL,EAA4C,EAG7D,KAAAzF,oBAAsB,IACc,YAApCliB,KAAKkC,MAAM2G,OAAOof,cAn+BtBjoB,KAAKqmB,aAAermB,KAAKqmB,aAAa3d,KAAK1I,MAC3C,MAAMkoB,EAAqBloB,KAAKmhB,gBAChCnhB,KAAKoF,MAAQ,CACT4a,YAAa,EACbN,WAAW,EACXyI,eAAe,EACfP,aAAa,EACbQ,eAAe,EACf7C,0BAA2BvlB,KAAKkC,MAAM2G,OAAOuY,oBAC7Cf,kBAAmB6H,GAGvBloB,KAAK4mB,qBACoE,QADhDljB,EACW,QADXsb,EACrB9c,EAAM2G,OAAOwf,2BAAmB,IAAArJ,EAAAA,EAAI9c,EAAM2G,OAAOyf,4BAAoB,IAAA5kB,EAAAA,EAAI1D,KAAKqf,4BAElFrf,KAAKuoB,iBAAmBvoB,KAAKuoB,iBAAiB7f,KAAK1I,MACnDA,KAAKwoB,wBAA0BxoB,KAAKwoB,wBAAwB9f,KAAK1I,MACjEA,KAAKyoB,oBAAsBzoB,KAAKyoB,oBAAoB/f,KAAK1I,MACzDA,KAAK0oB,2BAA6B1oB,KAAK0oB,2BAA2BhgB,KAAK1I,MACvEA,KAAK2oB,yBAA2B3oB,KAAK2oB,yBAAyBjgB,KAAK1I,KACvE,CAEO4oB,WAEH,MAAgB,QADHA,EAAAA,EAAAA,UAAS,CAAEC,QAASC,EAAAA,YAAYC,SAAUzoB,QAASN,KAAKkC,MAAM5B,QAAQ+H,SAEvF,CAEOlI,0BAAuB,IAAA6oB,EAAAC,EAC1B,MAAMzH,EAAsC,QAAhCwH,EAAGhpB,KAAKkC,MAAM2G,OAAO4Y,mBAAW,IAAAuH,EAAAA,EAAA,cACtCE,EAA0ClpB,KAAKkC,MAAM2G,OAAOqgB,wCAElE,GADAlpB,KAAKmpB,kBAC8B,QAA/BF,EAACjpB,KAAKkC,MAAM5B,QAAQ+H,QAAQuL,WAAG,IAAAqV,GAAQ,QAARA,EAA9BA,EAAgCpgB,cAAM,IAAAogB,IAAtCA,EAAwC5H,mBAC/B,gBAANG,EACA,QAAqCzgB,IAAjCf,KAAKoF,MAAMib,mBAAmCrgB,KAAKkC,MAAMiE,KAAKwb,iCAAiCvb,OAAQ,CAAC,IAADgjB,EACvG,MAAMhJ,QAAeiJ,EAAAA,EAAAA,IACjBrpB,KAAKkC,MAAMiE,KAAKwb,iCAAiCvb,OACjDpG,KAAKkC,MAAM5B,QAAQ4H,cACqB,QADRkhB,EAChCppB,KAAKkC,MAAM2G,OAAOygB,8BAAsB,IAAAF,EAAAA,EAAIppB,KAAKwf,qCAE/Cxf,KAAKupB,WAAWnJ,EAAQ,MAC3B,QAAqCrf,IAAjCf,KAAKoF,MAAMib,mBAAmCrgB,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,OAAQ,CAAC,IAADojB,EACrF,MAAM9nB,EAAU1B,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,OAClCga,QAAeqJ,EAAAA,EAAAA,IACjB/nB,EAAQC,UACP3B,KAAKkC,MAAM5B,QAAQ+H,QAAQxI,YAAYU,UACxCP,KAAKkC,MAAM5B,QAAQ4H,cACqB,QADRshB,EAChCxpB,KAAKkC,MAAM2G,OAAOygB,8BAAsB,IAAAE,EAAAA,EAAIxpB,KAAKwf,8BACjD9d,EAAQgoB,sBAGN1pB,KAAKupB,WAAWnJ,EAAQ,YAExBpgB,KAAKupB,WAAW,IAgDlC,IA3CApgB,EAAAA,EAAAA,KACI,KAAK,IAAAwgB,EACD,MAAMjoB,EAAU1B,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,OACxC,OAAK1E,EAIAwnB,GAAkE,QAAvBS,EAACjoB,EAAQgoB,sBAAc,IAAAC,GAAtBA,EAAwBhoB,SAIlE,GAAGD,EAAQC,YAAYD,EAAQgoB,eAAe/nB,WAH1C,GAAGD,EAAQC,WAJX,IAOoD,IAEnExB,UACI,MAAMuB,EAAU1B,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,OACxC,IAAIga,EAAuB,GAC3B,GAAI1e,EAAS,CAAC,IAADkoB,EAUFC,EATP,GAA0B,QAA1BD,EAAI5pB,KAAKkC,MAAM5B,QAAQsT,WAAG,IAAAgW,GAAQ,QAARA,EAAtBA,EAAwB/gB,cAAM,IAAA+gB,GAA9BA,EAAgCvI,iBAChCjB,QAAe0J,EAAAA,EAAAA,IACXpoB,EAAQC,SACR3B,KAAKkiB,uBACJliB,KAAKkC,MAAM5B,QAAQ+H,QAAQxI,YAAYU,UACxCP,KAAKkC,MAAM5B,QAAQ4H,cACnBxG,EAAQ6J,KACR2d,EAA0CxnB,EAAQgoB,oBAAiB3oB,QAGvEqf,QAAeqJ,EAAAA,EAAAA,IACX/nB,EAAQC,UACP3B,KAAKkC,MAAM5B,QAAQ+H,QAAQxI,YAAYU,UACxCP,KAAKkC,MAAM5B,QAAQ4H,cACqB,QADR2hB,EAChC7pB,KAAKkC,MAAM2G,OAAOygB,8BAAsB,IAAAO,EAAAA,EAAI7pB,KAAKwf,8BACjD0J,EAA0CxnB,EAAQgoB,oBAAiB3oB,SAGrEf,KAAKupB,WAAWnJ,EAAQ,YAExBpgB,KAAKupB,WAAW,GAAI,GAGlC,CAAEQ,iBAAiB,IAGb,cAANvI,GAAoCxhB,KAAKkC,MAAMiE,KAAKub,eAAetb,OAAQ,CAAC,IAAD4jB,EAC3E,MAAM5J,QAAeiJ,EAAAA,EAAAA,IACjBrpB,KAAKkC,MAAMiE,KAAKub,eAAetb,OAC/BpG,KAAKkC,MAAM5B,QAAQ4H,cACqB,QADR8hB,EAChChqB,KAAKkC,MAAM2G,OAAOygB,8BAAsB,IAAAU,EAAAA,EAAIhqB,KAAKwf,qCAE/Cxf,KAAKupB,WAAWnJ,EAAQ,CAEtC,CAEO7W,sBAAsBC,EAAkDC,GAC3E,OAAIzJ,KAAKoF,QAAUqE,GAAazJ,KAAKkC,MAAMiE,OAASqD,EAAUrD,IAIlE,CAEOuD,SAAM,IAAAugB,EACT,MAAM,GAAEpoB,EAAE,OAAEgH,EAAM,UAAEsB,GAAcnK,KAAKkC,OAEjC,UAAE2K,EAAS,sBAAEsa,GAA0Bte,EAEvCqhB,EAAkD,aAA5BrhB,EAAOshB,sBAE7BC,EAA+BpqB,KAAK4oB,YAAc/f,EAAOwhB,kBAAmB,EAC5EC,EACc,WAAhBzhB,EAAO0hB,UAAgC,SAAoC,cAAhB1hB,EAAO0hB,UAAmC,YAAuB,GAE1HC,EAAqD,QAAhCP,EAAGjqB,KAAKkC,MAAM5B,QAAQsT,IAAI/K,cAAM,IAAAohB,OAAA,EAA7BA,EAA+BQ,qBACxB,IAADC,EAAhC1qB,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,SACxBpG,KAAKwkB,eAAgBmG,EAAAA,EAAAA,qBACjB3qB,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,OAAOwkB,OAC/B5qB,KAAKkC,MAAM5B,QAAQ+H,QAAQxI,YACG,QADQ6qB,EACtC1qB,KAAKkC,MAAM5B,QAAQ+H,QAAQuL,WAAG,IAAA8W,GAAQ,QAARA,EAA9BA,EAAgC7hB,cAAM,IAAA6hB,OAAA,EAAtCA,EAAwCrJ,mBAG5CmJ,GAAyBxqB,KAAKwkB,gBAC9BxkB,KAAKwkB,cAAgB,GAAGxkB,KAAKwkB,0BAA0BgG,KAG3D,MAAMK,EAA4B7qB,KAAK8qB,sBAAsBV,EAAqBE,GAC5ES,EAAqC/qB,KAAKgrB,iCAC1Cre,EAASC,EAAAA,EAAA,GACP5M,KAAKkC,OAA+C,IACxDkD,MAAOpF,KAAKoF,MACZ0Z,aAAc,CACVmM,YAAajrB,KAAKkC,MAClB2K,UAAWC,IAAW,qBAAoBod,EAAa,WAAa,IAAMrd,IAE9Eqe,MAAOd,EAAsBpqB,KAAKsmB,iBAAiBgE,GAAgB,KACnEa,eAAgBnrB,KAAKomB,gBACrBgF,uBAAwBprB,KAAKklB,0BAC7BmG,yBAA0BrrB,KAAKolB,4BAC/BkG,cAAe,CACX7Y,IAAKiU,EAAAA,SACL7Z,UAAW,6BACX7J,MAAO6nB,EAA0B7nB,MACjCgd,YAAahgB,KAAKoF,MAAM4a,YACxBJ,KAAM5f,KAAK4f,KACXO,SAAUngB,KAAKmgB,SACf0G,UAAU,EACVC,kBAAmB3c,EAAU4c,8BAC7BC,kBAAmB7c,EAAU8c,0BAC7BC,yBAA0BlnB,KAAKigB,UAC/BkH,uBAAiD,IAA1BA,EACvBoE,kBAAmBphB,EAAUqhB,kBAC7BlE,eAAgBtnB,KAAK2f,SACrB4H,gBAAiBvnB,KAAKyf,UACtB3b,IAAK+mB,EAA0BhnB,MAEnC4nB,WAAY,CACRC,yBAA0B,CAAE7e,UAAW,0CACvC8e,kCAAmC,CAC/BlZ,IAAKmZ,EAAAA,oBACL/e,UAAW,+BACXgf,SAAU3B,EACV4B,iBAAkB3hB,EAAU4c,8BAC5BgF,iBAAkB5hB,EAAU8c,0BAC5B+E,SAAUnqB,EACVoqB,YAAY,EACZnoB,IAAKooB,KAAKC,UAAUpB,EAAmClnB,OAE3Db,MAAO+nB,EAAmC/nB,SAIlD,OAAOhD,KAAKkC,MAAMyO,WAAWhE,EACjC,CAKOuT,sBACHlgB,KAAKkF,SAAS,CAAEijB,eAAe,GACnC,CAkDQ6C,iCACJ,MAAM3K,EAAoBrgB,KAAKoF,MAAMib,kBAC/BiJ,EAAyBtpB,KAAKkC,MAAM2G,OAAOygB,uBAC7CA,IACAA,EAAuB/J,iBAAkB,GAK7C,IAF6Bve,EAAAA,gBAAgBC,YAAYof,GAE9B,CACvB,GAAIrgB,KAAKoF,MAAMgnB,WAAY,CACvB,MAAMC,EAAa,EACnB,MAAO,CACHrpB,MAAO,CAAChD,KAAKssB,uBAAuBhD,EAAwB+C,EAAYrsB,KAAKoF,MAAM4a,cACnFnc,KAAM,CAAC,SACT,CAEN,MAAO,CAAEb,MAAO,GAAIa,KAAM,GAAK,CAGnC,MAAO,CACHb,MAAO,IAEAqd,EAAmB5e,KAAI,CAACyB,EAAkBa,IACrCb,EAAK0d,iBAAmBC,EAAAA,UAAUC,MAC3B9gB,KAAKwlB,sBACRtiB,EACAomB,QAAAA,EAA0BtpB,KAAKwf,8BAC/Bzb,EACA/D,KAAKoF,MAAM4a,aAGRhgB,KAAK4kB,kBACR1hB,EACAomB,QAAAA,EAA0BtpB,KAAKwf,8BAC/Bzb,EACA/D,KAAKoF,MAAM4a,gBAM3Bnc,KAAM,IAAIwc,EAAmB5e,KAAIyB,GAAQA,EAAK4e,OAEtD,CAmCQgJ,sBAAsBV,EAA8BE,GACxD,MAAMjK,EAAoBrgB,KAAKoF,MAAMib,kBAC/BiI,EAAuBtoB,KAAKkC,MAAM2G,OAAOyf,qBAC3CA,IACAA,EAAqB/I,iBAAkB,GAG3C,MAAMgN,EAAWnC,EAAsB,aAAeE,EAItD,OAF6BtpB,EAAAA,gBAAgBC,YAAYof,GASlD,CACHrd,MAAO,IAEAqd,EAAmB5e,KAAI,CAACyB,EAAkBa,IAClC/D,KAAK2mB,6BACR4F,EACArpB,EACAolB,QAAAA,EAAwBtoB,KAAKqf,4BAC7Btb,MAKZF,KAAM,IAAIwc,EAAmB5e,KAAIyB,GAAQA,EAAK4e,QAnB1C9hB,KAAKoF,MAAMgnB,WACJ,CAAEppB,MAAO,CAAChD,KAAKikB,kBAAkBqE,IAAwBzkB,KAAM,CAAC,UAEpE,CAAEb,MAAO,GAAIa,KAAM,GAkBlC,CAEQ1D,iBAAiBigB,GACrB,MAAMoM,EAAexsB,KAAKkC,MAAM2G,OAAOuX,QAAU,GAC3CqM,EAA2BzsB,KAAKwiB,8BAA8BpC,GAE/Dlf,QAAQwrB,IACTD,EAAWhrB,KAAItB,UACX,GAAIuiB,EAAU9B,iBAAmBC,EAAAA,UAAUC,OAAS4B,EAAUZ,IAC1D,IACI,MACMkB,EADM,IAAI2J,IAAIjK,EAAUZ,KACV8K,aAAaC,IAAI,QACjC7J,IACAN,EAAUC,gBAAkBmK,EAAAA,EAAAA,IAAwB9J,EAAShjB,KAAKkC,MAAM5B,QAAQ4H,eAItB,CAFhE,MAAOpF,GACD9C,KAAKkC,MAAMW,WACX7C,KAAKkC,MAAMW,UAAU8D,MAAM,+BAA+B,CAItE,OAAO+b,CAAS,KAEtBpe,MAAKoe,IACH,MAAMjC,EAAaiC,EAAUpQ,QAAOX,GAE5BA,EAAQiP,iBAAmBC,EAAAA,UAAUC,OACpCnP,EAAQiP,iBAAmBC,EAAAA,UAAUC,YAA+B/f,IAAtB4Q,EAAQgR,YAI/D3iB,KAAKkF,SAAS,CACVmb,kBAAmB,IAAII,KAAe+L,GACtCxM,YAAa,EACboM,WAAYW,KAAKC,MACjBzH,yBAAyB,GAC3B,IAGNvlB,KAAKkF,SAAS,CACVmb,kBAAmB,IAAIoM,KAAeD,GACtCxM,YAAa,EACboM,WAAYW,KAAKC,MACjBzH,yBAAyB,GAEjC,CAEQ4D,iBACJnpB,KAAKkF,SAAS,CACVkjB,eAAe,GAEvB,CAEQzB,6BACJ4F,EACAU,EACAznB,EACAzB,GAC0B,IAA1BqgB,EAAAC,UAAA7hB,OAAA,QAAAzB,IAAAsjB,UAAA,IAAAA,UAAA,GAEA,GAAI4I,EAAMrM,iBAAmBC,EAAAA,UAAUC,MACnC,OAAIsD,GAA0B,eAAbmI,EACN5nB,EAAAA,cAAAA,EAAAA,SAAA,KAAG3E,KAAKyiB,yBAAyBwK,EAAOlpB,EAAOyB,IAEnDb,EAAAA,cAAAA,EAAAA,SAAA,KAAG3E,KAAKkmB,sBAAsB+G,EAAOlpB,EAAOyB,IAEnD,GAAIxF,KAAK4oB,WACL,OAAIxE,EACOpkB,KAAKktB,8BAA8BD,EAAOjtB,KAAK4mB,qBAAsB7iB,GAEzE/D,KAAKmtB,6BAA6BF,EAAOznB,EAAezB,GAGnE,OAAQwoB,GACJ,IAAK,YACD,OAAOvsB,KAAKktB,8BAA8BD,EAAOjtB,KAAK4mB,qBAAsB7iB,GAEhF,IAAK,SACD,OAAO/D,KAAKotB,yBAAyBH,EAAOjtB,KAAK4mB,qBAAsB7iB,GAE3E,IAAK,aACD,OAAO/D,KAAKmtB,6BAA6BF,EAAOznB,EAAezB,GAKvE,OAAOY,EAAAA,cAAAA,EAAAA,SAAA,KAAG3E,KAAKkkB,iBAAiB+I,EAAOznB,EAAezB,EAAOqgB,GAErE,CAEQ5B,8BAA8BpC,GAAqB,IAAAiN,EAAAC,EAAAC,EAAAC,EACvD,MAAMC,EAAmF,QAA5DJ,EAAGrtB,KAAKkC,MAAM2G,OAAO6kB,+CAAuC,IAAAL,GAAAA,EACzF,IAAIM,EAAgBvN,QAAAA,EAAU,GAC9B,MAAMwN,GACDrmB,EAAAA,iBAAiBC,kBAAgD,QAA/B8lB,EAACttB,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,cAAM,IAAAknB,OAAA,EAA9BA,EAAgCO,mBACnEtmB,EAAAA,iBAAiBC,kBAAgD,QAA/B+lB,EAACvtB,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,cAAM,IAAAmnB,OAAA,EAA9BA,EAAgC7D,gBAClEoE,EAAuC,QAAjCN,EAAGxtB,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,cAAM,IAAAonB,OAAA,EAA9BA,EAAgC5C,OAU/C,OATI6C,GAA2BG,GAAoBE,IAC/CH,EAAgBA,EAAcrb,QAAOpP,IAAO,IAAA6qB,EAExC,QAD8D,QAA5BA,EAAG7qB,EAAKkf,4BAAoB,IAAA2L,OAAA,EAAzBA,EAA2BzL,6BAC5B,IAEnCthB,EAAAA,gBAAgBC,YAAY0sB,KAC7BA,EAAgBvN,QAAAA,EAAU,KAG3BuN,CACX,CAgLQP,yBAAyBjJ,EAAmB3e,EAA+BzB,GAAa,IAAAiqB,EAC5F,OACIrpB,EAAAA,cAAA,OACIkI,UAAW,mBAAkB7M,KAAKoF,MAAM+iB,cAAgB,SAAW,IACnEtE,IAAK7jB,KAAK0lB,YAAY3hB,GAAM,aACW,QADXiqB,EAChBhuB,KAAKkC,MAAM2G,OAAOolB,iBAAS,IAAAD,EAAAA,EAAIE,EAAAA,kBAE3CvpB,EAAAA,cAAC2f,EAAAA,GAAK/gB,OAAA2K,OAAA,CACFlM,eAAgBhC,KAAKkC,MAAM5B,QAAQ4H,cAAclG,eACjD6K,UAAU,0BACNsX,EAAK,CACTI,YAAuB,IAAVxgB,EAAc/D,KAAKwkB,cAAgBL,EAAMrC,IACtDvI,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzC/T,cAAeA,EACfif,oBAAoB,OACpBQ,QAASjlB,KAAKyoB,oBACd0F,YAAcnuB,KAAKoF,MAAM+iB,eAAiBnoB,KAAKwoB,8BAA4BznB,EAC3Ec,GAAI,GAAG7B,KAAKkC,MAAML,sBAAsBkC,IACxC2gB,uBAAqB,EACrBY,sBAAuBtlB,KAAKoF,MAAMmgB,0BAA4BvlB,KAAKkC,MAAM2G,OAAOwhB,gBAChF1F,oBAA+B,IAAV5gB,KAEzBY,EAAAA,cAAC2f,EAAAA,GAAK/gB,OAAA2K,OAAA,CACF6W,KAAK,eACL/iB,eAAgBhC,KAAKkC,MAAM5B,QAAQ4H,cAAclG,eACjD6K,UAAU,6BACNsX,EAAK,CACTI,YAAuB,IAAVxgB,EAAc/D,KAAKwkB,cAAgBL,EAAMrC,IACtDmD,QAASjlB,KAAKuoB,iBACdhP,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzC/T,cAAeA,EACfif,oBAAoB,OACpB5iB,GAAI,GAAG7B,KAAKkC,MAAML,aAAakC,IAC/BqqB,YAAcpuB,KAAKoF,MAAM+iB,eAAiBkG,EAAAA,iCAA+BttB,EACzE2jB,uBAAqB,EACrBY,sBAAuBtlB,KAAKoF,MAAMmgB,0BAA4BvlB,KAAKkC,MAAM2G,OAAOwhB,gBAChF1F,oBAA+B,IAAV5gB,KAIrC,CAEQykB,wBAAwBvjB,GAAyC,IAAAqpB,GACrEC,EAAAA,EAAAA,wBAAuBtpB,EAAkC,QAA7BqpB,EAAEtuB,KAAKkC,MAAM2G,OAAOolB,iBAAS,IAAAK,EAAAA,EAAIE,OAAON,EAAAA,kBACxE,CAEQO,kCAAkCxpB,GACtC,MAAMypB,EAAS1uB,KAAKoF,MAAMmgB,wBAA2BtgB,EAAMypB,OAA8BzpB,EAAM0pB,cACzFC,EAA+B,uBACrC,GAAK5uB,KAAKoF,MAAMqiB,oBAiBZiH,EAAOG,MAAMC,UAAY,GACzBJ,EAAOK,UAAUC,OAAOJ,GACxBF,EAAOO,cAAeJ,MAAMK,SAAW,GACvClvB,KAAKkF,SAAS,CACVuiB,qBAAqB,QArBQ,CAAC,IAAD0H,EACjC,MAAMC,EAASV,EAAOW,wBAChBpB,EAAYqB,OAAkC,QAA5BH,EAACnvB,KAAKkC,MAAM2G,OAAOolB,iBAAS,IAAAkB,EAAAA,EAAIjB,EAAAA,kBAElDqB,EAAYtqB,EAAMuqB,QAAUJ,EAAOK,KACnCC,EAAYzqB,EAAM0qB,QAAUP,EAAOQ,IACnCC,EAAkBN,EAAYtB,EAC9B6B,EAAkBJ,EAAYzB,EAEpCS,EAAOG,MAAMC,UAAY,SAASb,KAClCS,EAAOK,UAAUgB,IAAInB,GACrBF,EAAOO,cAAeJ,MAAMK,SAAW,OACvCR,EAAOO,cAAee,SAASH,EAAkBN,EAAWO,EAAkBJ,GAC9E1vB,KAAKkF,SAAS,CACVuiB,qBAAqB,GACtB,CASX,CAEQgB,oBAAoBxjB,GAAyC,IAAAgrB,EAC7DhT,OAAOiT,YAAc,IAErBlwB,KAAKyuB,kCAAkCxpB,KAG3CkrB,EAAAA,EAAAA,qBAAoBlrB,EAAkC,QAA7BgrB,EAAEjwB,KAAKkC,MAAM2G,OAAOolB,iBAAS,IAAAgC,EAAAA,EAAIzB,OAAON,EAAAA,mBACjEluB,KAAKkF,SAAS,CACVijB,eAAe,IAEvB,CAEQI,iBAAiBtjB,IACrBmrB,EAAAA,EAAAA,2BAA0BnrB,GAC1BjF,KAAKkF,SAAS,CACVijB,eAAe,GAEvB,CAEQO,2BAA2BzjB,GAC3BgY,OAAOiT,YAAc,IAErBlwB,KAAKyuB,kCAAkCxpB,KAI3CorB,EAAAA,EAAAA,qBAAoBprB,GAEpBjF,KAAKkF,SAAS,CACVijB,eAAe,IAEvB,CAEQQ,yBAAyB1jB,IAC7BqrB,EAAAA,EAAAA,yBAAwBrrB,GAExBjF,KAAKkF,SAAS,CACVijB,eAAe,GAEvB,CAEQ+E,8BAA8B/I,EAAmB3e,EAA+BzB,GAAa,IAAAwsB,EACjG,OACI5rB,EAAAA,cAAA,OAAKkI,UAAU,+BACXlI,EAAAA,cAAA,oBAC2C,QAD3C4rB,EACgBvwB,KAAKkC,MAAM2G,OAAOolB,iBAAS,IAAAsC,EAAAA,EAAIrC,EAAAA,iBAC3CrhB,UAAU,8BACVkY,KAAK,eACLyL,WAAYxwB,KAAK2oB,yBACjB1D,QAASjlB,KAAK2oB,yBACdyF,YAAcpuB,KAAKoF,MAAM+iB,eAAiBsI,EAAAA,+BAA6B1vB,IAE3E4D,EAAAA,cAAC2f,EAAAA,GAAK/gB,OAAA2K,OAAA,CACFlM,eAAgBhC,KAAKkC,MAAM5B,QAAQ4H,cAAclG,eACjD6K,UAAU,0BACNsX,EAAK,CACTI,YAAuB,IAAVxgB,EAAc/D,KAAKwkB,cAAgBL,EAAMrC,IACtDvI,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzC0L,QAASjlB,KAAK0oB,2BACdljB,cAAeA,EACfif,oBAAoB,OACpB0J,YAAcnuB,KAAKoF,MAAM+iB,eAAiBuI,EAAAA,gCAA8B3vB,EACxEc,GAAI,GAAG7B,KAAKkC,MAAML,sBAAsBkC,IACxC2gB,uBAAqB,EACrBY,sBAAuBtlB,KAAKoF,MAAMmgB,0BAA4BvlB,KAAKkC,MAAM2G,OAAOwhB,gBAChF1F,oBAA+B,IAAV5gB,KAIrC,CAEQopB,6BAA6BhJ,EAAmB3e,EAA+BzB,GACnF,OACIY,EAAAA,cAAA,OAAKkI,UAAU,yBACXlI,EAAAA,cAAC2f,EAAAA,GAAK/gB,OAAA2K,OAAA,CACFlM,eAAgBhC,KAAKkC,MAAM5B,QAAQ4H,cAAclG,eACjD6K,UAAU,0BACNsX,EAAK,CACTI,YAAuB,IAAVxgB,EAAc/D,KAAKwkB,cAAgBL,EAAMrC,IACtDvI,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzC/T,cAAeA,EACfif,oBAAoB,OACpBa,sBAAuBtlB,KAAKoF,MAAMmgB,wBAClCZ,oBAA+B,IAAV5gB,KAEzBY,EAAAA,cAAA,OAAKkI,UAAU,kCAEXlI,EAAAA,cAAA,KACIyJ,KAAK,sBACLrB,MAAO/M,KAAKkC,MAAMiI,UAAUgc,oBAC5BpB,KAAK,SACLlB,IAAK7jB,KAAKmf,2BACV8F,QAASjlB,KAAKomB,gBACdvZ,UAAU,kDAK9B,CA+CQ2Z,uBAAuB9kB,GAAsB,IAAAivB,EACjD,MAAO,CACH7O,IAA4B,QAAzB6O,EAAEjvB,EAAQkvB,uBAAe,IAAAD,EAAAA,EAAI,GAExC,CAEQ1M,kBAAkBze,GACtB,OACIb,EAAAA,cAAA,OAAKkI,UAAU,0BACXlI,EAAAA,cAAC2f,EAAAA,GAAK,CACFtiB,eAAgBhC,KAAKkC,MAAM5B,QAAQ4H,cAAclG,eACjD6K,UAAU,gCACViV,IAAI,QACJyC,YAAavkB,KAAKwkB,cAClBjL,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzC/T,cAAeA,QAAAA,EAAiBxF,KAAKqf,4BACrCoF,oBAAoB,UAIpC,CAEQ6H,uBACJ9mB,EACAzB,EACA8gB,GAMA,MAAO,CACHC,4BAA6B,CACzBrS,IAAK,KACL5F,UAPQC,IACZ,mCACA+X,IAAwB9gB,EAAQ,0CAA4C,IAMxEghB,KAAM,MACNC,SAAU,EACVlhB,IAAK,QACL,aAAc,GACd,gBAAiB+gB,IAAwB9gB,EACzCkhB,QAASjlB,KAAKklB,0BAA0BnhB,GACxCohB,UAAWnlB,KAAKolB,4BAA4BrhB,IAEhDshB,QACI1gB,EAAAA,cAAC2f,EAAAA,GAAK,CACFtiB,eAAgBhC,KAAKkC,MAAM5B,QAAQ4H,cAAclG,eACjD6K,UAAU,0CACViV,IAAI,QACJyC,YAAavkB,KAAKwkB,cAClBjL,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzC/T,cAAeA,QAAAA,EAAiBxF,KAAKwf,8BACrCiF,oBAAoB,UAIpC,CAaQ4B,eACJ,GAAIrmB,KAAKoF,MAAMwiB,YAAa,CAAC,IAADiJ,EACe,QAAvCA,EAAA7wB,KAAKmf,2BAA2B4B,eAAO,IAAA8P,GAAvCA,EAAyCC,QACzC,MAAMC,EAAY/wB,KAAKif,kBAAkB4N,IAAI7sB,KAAKoF,MAAM4a,aACxD,GAAI+Q,GAAaA,EAAUC,UAAYD,EAAUC,SAASxuB,QAAU,EAAG,CACnE,MAAM2hB,EAAQ4M,EAAUC,SAAS,GAAGC,cAAc,OAC9C9M,GACAA,EAAM+M,gBAAgB,QAAQ,CAGtClxB,KAAKkF,SAAS,CACVijB,eAAe,GAChB,CAEPnoB,KAAKkF,SAAS,CACVijB,eAAe,EACfP,aAAc5nB,KAAKoF,MAAMwiB,eAE7B/H,EAAAA,EAAAA,0BACAsR,EAAAA,EAAAA,2BACJ,EAwDJ,iHC7lCA,MAAMC,EAAmBA,CACrB9uB,EACA+uB,EACApkB,EACAgD,EACApB,EACAsB,EACAE,EACAE,IAEIF,EACO1L,EAAAA,cAAAA,EAAAA,SAAA,KAAG0L,GAEV/N,EACOA,EAAUb,KAAIuC,IAAW,IAAAstB,EAC5B,OACI3sB,EAAAA,cAAA,OAAKkI,UAAU,sBAAsB/I,IAAK,GAAsB,QAAtBwtB,EAAGttB,EAASutB,kBAAU,IAAAD,EAAAA,EAAI,MAAMvU,EAAAA,GAASC,UAAUzW,cACxFvC,EAAS6C,SACToJ,GAAiBjM,EAASwtB,cACvB7sB,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKlK,EAASwtB,cAAcE,gBAAiB1tB,EAASwtB,cAAcG,kBACzE,KACH3tB,EAAS4tB,mBACNjtB,EAAAA,cAAC8sB,EAAAA,KAAI,CAAC5kB,UAAU,gCACX7I,EAASgrB,OACThrB,EAAS6tB,cACT7tB,EAAS4tB,oBAGdjtB,EAAAA,cAAAA,EAAAA,SAAA,KACKX,EAASgrB,OACThrB,EAAS6tB,eAGhB,IAIXthB,EACH5L,EAAAA,cAAA,OAAKkI,UAAU,wBACXlI,EAAAA,cAAA,KAAGkI,UAAU,iBAAiBwkB,GAC7BxiB,GAGLlK,EAAAA,cAAAA,EAAAA,SAAA,KAAGwL,GA8HL2hB,EAA6BA,CAC/BC,EACAC,EACAC,EACAC,EACAluB,EACA2G,KACA,IAAAwnB,EAEA,IAAIC,EAOJ,OALAA,GAHmE,QAA9CD,EAAwBnuB,EAASwtB,qBAAa,IAAAW,OAAA,EAAtBA,EAAwBE,iBAGtCN,EAAaC,EACvCM,EAAAA,iBAAiBC,cAAc5nB,KAChCynB,EAAapuB,EAASmC,MAAQnC,EAASmC,KAAKU,SAASxD,eAAiBsH,EAAwBsnB,EAAoBG,GAIlHztB,EAAAA,cAAAA,EAAAA,SAAA,KACIA,EAAAA,cAAA,OAAKkI,UAAU,8CACXlI,EAAAA,cAAA,KAAGkI,UAAW,8CAA8CulB,EAAWI,uBACvE7tB,EAAAA,cAAA,KAAGkI,UAAW,8CAA8CulB,EAAWI,iBAAkBJ,GA/CvEK,EAACzuB,EAA+BkuB,KAAyB,IAAAQ,EAAAC,EAAAC,EACvF,MAAMP,EAA6D,QAA9CK,EAAwB1uB,EAASwtB,qBAAa,IAAAkB,OAAA,EAAtBA,EAAwBL,gBACrE,OACI1tB,EAAAA,cAAAA,EAAAA,SAAA,KACIA,EAAAA,cAAC8sB,EAAAA,KAAI,CAAC5kB,UAAU,oDACXwlB,EACG1tB,EAAAA,cAAA,KAAGkI,UAAU,uDACc,QADuC8lB,EAC7D3uB,EAASwtB,qBAAa,IAAAmB,OAAA,EAAtBA,EAAwBE,eACxBX,EACsB,QADTU,EACb5uB,EAASwtB,qBAAa,IAAAoB,OAAA,EAAtBA,EAAwBE,aAE7B,MAET,EAmCML,CAA0BzuB,EAAUkuB,IAE1C,EA4FX,EAxC4ChwB,IAAqB,IAAA6wB,EAAAC,EAhMtCC,EAwEA9hB,EAwHsC,OAC7DxM,EAAAA,cAAA,MAAApB,OAAA2K,OAAA,CAAKrB,UAAW3K,EAAM2K,UAAWhL,GAAIK,EAAML,IAAQK,EAAMgxB,uBAAuBhxB,IAC3EA,EAAM6K,QACK,QAAXgmB,EAAC7wB,EAAMzB,YAAI,IAAAsyB,GAAVA,EAAY3wB,iBAAkBF,EAAMqC,mBA3HnB4M,EA2HyDjP,EAAMqC,iBAzHlFI,EAAAA,cAAAA,EAAAA,SAAA,KACIA,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKiD,EAAWgiB,yBAChBhiB,EAAWiiB,iBACXjiB,EAAWkiB,oBACXliB,EAAWmiB,mBAsHnBpxB,EAAMsJ,sBA/CetJ,IACtBA,EAAMoB,gBAAkBtC,EAAAA,gBAAgBC,YAAYiB,EAAMoB,gBAEtDqB,EAAAA,cAAA,OAAKkI,UAAU,wBACV3K,EAAMoB,eAAe7B,KAAIU,IAAY,IAAAoxB,EAClC,OACI5uB,EAAAA,cAAA,OAAKb,IAAK3B,EAAU,GAAGovB,WAAY1kB,UAAU,+BACxCilB,EACG5vB,EAAMiI,UAAU4nB,WAChB7vB,EAAMiI,UAAU6nB,aAChB9vB,EAAMiI,UAAUqpB,kBAChBtxB,EAAMiI,UAAU+nB,cAChB/vB,EAAU,GACwC,QADtCoxB,EACZrxB,EAAM5B,QAAQ4H,cAAclG,eAAe4I,eAAO,IAAA2oB,OAAA,EAAlDA,EAAoD1oB,uBAEvDumB,EACGjvB,EACAD,EAAMiI,UAAUspB,cAChBvxB,EAAM+K,iBACN/K,EAAM+N,cACN/N,EAAM2M,qBACN3M,EAAMiO,iBACNjO,EAAMmO,kBACNnO,EAAMqO,gBAER,KAMnBrO,EAAMqO,eACT5L,EAAAA,cAAA,OAAKkI,UAAU,uBACXlI,EAAAA,cAAA,OAAKkI,UAAU,wBACXlI,EAAAA,cAAA,KAAGkI,UAAU,iBAAiB3K,EAAMiI,UAAUspB,eAC7CvxB,EAAM2M,uBAIflK,EAAAA,cAAAA,EAAAA,SAAA,KAAGzC,EAAMiO,kBASLujB,CAAqBxxB,GAErByC,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKhM,EAAM+K,kBACXmkB,EACGlvB,EAAMC,UACND,EAAMiI,UAAUspB,cAChBvxB,EAAM+K,iBACN/K,EAAM+N,cACN/N,EAAM2M,qBACN3M,EAAMiO,iBACNjO,EAAMmO,kBACNnO,EAAMqO,iBAIjBrO,EAAMuL,qBACH9I,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKhM,EAAMgL,qBACXhL,EAAMuL,oBACI,QAAVulB,EAAA9wB,EAAMzB,YAAI,IAAAuyB,GAAVA,EAAY5wB,eApMMuxB,EAC/BC,EACAzmB,EACAjL,IAEK0xB,EAKDjvB,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKf,GACLymB,EAAoBC,SACpBD,EAAoBE,SACpBF,EAAoBG,QACpBH,EAAoBrf,aARzBrS,EAAM5B,QAAQuC,UAAUC,MAAM,uDACvB,MA8LO6wB,CAA2BzxB,EAAM4L,wBAAyB5L,EAAMiL,kBAAmBjL,GA3KxE8xB,EAC7BC,EACA9mB,EACAjL,IAEK+xB,EAKDtvB,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKf,GACLjL,EAAMkL,UACN6mB,EAAkBC,SAClBD,EAAkBE,SAClBF,EAAkBG,YAClBH,EAAkBI,IAClBJ,EAAkBK,eAAiBL,EAAkBK,eAAiB,KACtEL,EAAkB1f,aAXvBrS,EAAM5B,QAAQuC,UAAUC,MAAM,qDACvB,MAqKOkxB,CAAyB9xB,EAAM0L,sBAAuB1L,EAAMiL,kBAAmBjL,IAzN1E+wB,EA0NQ/wB,EAAMuO,qBAzNlBzP,EAAAA,gBAAgBC,YAAYgyB,EAAUjgB,QAIrDrO,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK+kB,EAAUzgB,SACfygB,EAAUlgB,OACVkgB,EAAUjgB,QALR,KAyNE9Q,EAAM8L,2BACN9L,EAAMoM,sBACNpM,EAAMuM,uBAAyBzN,EAAAA,gBAAgBC,YAAYiB,EAAMuM,uBAC9D9J,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKhM,EAAM0M,+BAAgC1M,EAAMuM,uBACtD,KACHvM,EAAM2M,qBACN3M,EAAM6M,8BAGd7M,EAAM+N,cACL,2OCrQH9P,eAAeo0B,EAAgBrwB,EAAqB2X,GACvD,MAAM2Y,EAA8B,CAAC,EAE/B/zB,EAAOob,EAAUpb,KAuCvB,OAnCIA,GAAQA,EAAKyI,WAAazI,EAAKyI,UAAU1G,OAAS,IAAMqZ,EAAUzZ,uBAC5DxB,EAAAA,EAAAA,6BAA4B,IAAIC,EAAAA,wBAA2BqD,GAC5DI,MAAK3D,IACEA,IACA6zB,EAAa7zB,SAAWA,EAAS,IAGxC6D,OAAM1B,IAEH,MADAoB,EAAIrB,UAAU4B,UAAU3B,GAClB,IAAItC,MAAM,6EAA6E,UAG/Fi0B,EAAAA,EAAAA,mCAAkC,IAAIC,EAAAA,sCAAsCxwB,EAAIlC,eAAenC,aAAcqE,GAC9GI,MAAKqwB,IACEA,IACAH,EAAaxpB,qBAAuB2pB,EAAkB,IAG7DnwB,OAAM1B,IAEH,MADAoB,EAAIrB,UAAU4B,UAAU3B,GAClB,IAAItC,MAAM,6EAA6E,UAG/Fo0B,EAAAA,EAAAA,oCAAmC,IAAIC,EAAAA,uCAAuC3wB,EAAIlC,eAAenC,aAAcqE,GAChHI,MAAKwU,IACEA,IACA0b,EAAa1b,gBAAkBA,EAAgB,IAGtDtU,OAAM1B,IAEH,MADAoB,EAAIrB,UAAU4B,UAAU3B,GAClB,IAAItC,MAAM,6EAA6E,KAIlGg0B,CACX,skBCTA,IAAMM,EAAN,cAAuBnwB,IAAAA,UAenB/E,YAAYsC,GACR0C,MAAM1C,GAPF,KAAAwR,mCAA8C,EAgPrC,KAAAqhB,mBAAqB,CAAC5yB,EAAuB6yB,KAC1D,MAAMC,EAAoB,IAAI9yB,GAG9B,MAAa,eAAT6yB,EACOC,EAAMC,MAAK,CAACC,EAAOC,KAAK,IAAAC,EAAAC,EAAA,OAAsB,QAAjBD,EAACD,EAAMG,kBAAU,IAAAF,EAAAA,EAHpC,IAGiE,QAArBC,EAAKH,EAAMI,kBAAU,IAAAD,EAAAA,EAHjE,EAG0E,IAExFL,EAAMC,MAAK,CAACC,EAAOC,KAAK,IAAAI,EAAAC,EAAA,OAAsB,QAAjBD,EAACL,EAAMI,kBAAU,IAAAC,EAAAA,EALhC,IAK6D,QAArBC,EAAKL,EAAMG,kBAAU,IAAAE,EAAAA,EAL7D,EAKsE,GAAC,EA+D/E,KAAAC,kBAAqBlwB,GAE9BA,GAAiB,CACbC,UAAW,CACPC,GAAI,CAAEC,EAAG,gBAAiBC,EAAG,EAAGC,EAAG,GACnCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCE,GAAI,CAAEJ,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,IAEzCG,UAAU,GAKL,KAAA2vB,2BAA8BzvB,IAC3C,GAAIlG,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAAQ,CAC7B,MAAM/F,EAAQ,CACVgG,YAAa,CAACH,EAAiBI,OAAQC,aAE3CvG,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAAOI,gBAAgBnG,GAAOmE,OAAM1B,IACrD9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,6BAA6B,GACzD,GAnUP3G,KAAKoF,MAAQ,CACTovB,aAAc,CAAC,EACf7rB,aAAa,EACb9D,gCAAgC,GAEpC7E,KAAKmI,kBAAmBC,EAAAA,EAAAA,oBACpBpI,KAAKkC,MAAM5B,QAAQ+H,QAAQC,kBAC3BtI,KAAKkC,MAAMqG,aACXvI,KAAKkC,MAAMW,WAEf,MAAM+yB,GAAUntB,EAAAA,EAAAA,kBAAiBotB,EAAAA,GAAeC,SAAU91B,KAAKmI,iBAAkB8D,EAAAA,kBAAkBC,UACnGlM,KAAKmM,4BAA6BC,EAAAA,EAAAA,wBAAuBpM,KAAKmI,iBAAkBytB,GAEhFA,EAAQ7pB,cAAcC,MAAQC,EAAAA,kBAAkBI,cAChDrM,KAAKsM,2BAA4BF,EAAAA,EAAAA,wBAAuBpM,KAAKmI,iBAAkBytB,GAE/EA,EAAQ7pB,cAAcC,MAAQC,EAAAA,kBAAkB8pB,gBAChD/1B,KAAKg2B,2BAA4B5pB,EAAAA,EAAAA,wBAAuBpM,KAAKmI,iBAAkBytB,EACnF,CAEOz1B,0BAAuB,IAAA81B,EAC1B,MAAM31B,EAAUN,KAAKkC,MAAM5B,QAAQ4H,eAEnCiB,EAAAA,EAAAA,KACI,SAAAL,EAAA,OAAiC,QAAjCA,EAAM9I,KAAKkC,MAAMiE,KAAK1F,KAAK2F,cAAM,IAAA0C,OAAA,EAA3BA,EAA6BrI,KAAKyI,SAAS,IACjD/I,UACIH,KAAKkF,SAAS,CACVsvB,mBAAoBD,EAAgBj0B,EAASN,KAAKkC,MAAMiE,KAAK1F,KAAK2F,SACpE,UAGJpG,KAAKk2B,gCAEXl2B,KAAKkF,SAAS,CACV4W,iBAAkD,QAAlCma,EAAEj2B,KAAKkC,MAAMiE,KAAK2V,wBAAgB,IAAAma,OAAA,EAAhCA,EAAkC7vB,SAGxDpG,KAAKm2B,eACT,CAEOC,mBAAmBC,GACtBr2B,KAAKm2B,eACT,CAEO5sB,sBAAsBC,EAA0CC,GACnE,OAAIzJ,KAAKoF,QAAUqE,GAAazJ,KAAKkC,MAAMiE,OAASqD,EAAUrD,IAIlE,CAGOuD,SAAM,IAAAC,EAAAC,EAAA0sB,EAAAC,EAAAhY,EAAAzU,EACT,MAAM,GACFjI,EAAE,SACF0L,EACA1E,QAAQ,gBAAE2tB,EAAe,oBAAEC,GAC3Bn2B,SACI+H,SACI2B,MAAM,gBAAEC,EAAe,UAAEC,KAEhC,QACD5J,EAAO,UACP6J,GACAnK,KAAKkC,MAEHzB,EAAQT,KAAKkC,MAAMiE,KAAK1F,MAAQT,KAAKkC,MAAMiE,KAAK1F,KAAK2F,aAAWrF,EAChEqJ,GAAmBC,EAAAA,EAAAA,IAAW,WAAYrK,KAAKkC,MAAM5B,QAAQ4H,gBAAkB,GAC/EwuB,GAAUrsB,EAAAA,EAAAA,IAAW,OAAQrK,KAAKkC,MAAM5B,QAAQ4H,gBAAkB,GAClEqC,EAAcvK,KAAK22B,gBAAgB1sB,EAAiBG,EAAkBF,GAAa,IACnFO,EAAchK,GAAQA,EAAKA,KAAKyI,WAA4C,IAA/BzI,EAAKA,KAAKyI,UAAU1G,OAEjEo0B,GACFn2B,aAAI,EAAJA,EAAMo2B,uBAAwB72B,KAAKkC,MAAM5B,QAAQsT,IAAI/K,OAAOiuB,oBAAsBC,EAAAA,kBAAkBC,aAClG50B,EAAiB3B,aAAI,EAAJA,EAAM2B,eACvBuI,EAA0D,QAArChB,EAAG3J,KAAKkC,MAAM5B,QAAQ+H,QAAQuC,eAAO,IAAAjB,OAAA,EAAlCA,EAAoCkB,sBAC5DvI,EAAYtC,KAAK0K,gBACjBI,GAAgCC,EAAAA,EAAAA,4BACd,QADwCnB,EAC5DnJ,aAAI,EAAJA,EAAMA,KAAKyI,iBAAS,IAAAU,EAAAA,EAAI,GACoB,QADlB0sB,EAC1Bt2B,KAAKoF,MAAMovB,aAAaxpB,4BAAoB,IAAAsrB,EAAAA,EAAI,GAChDt2B,KAAKkC,MAAM5B,QAAQ4H,cACa,QADAquB,EAChCv2B,KAAKoF,MAAMovB,aAAa7zB,gBAAQ,IAAA41B,EAAAA,EAAI,GACpC5rB,GAEEM,IACDH,SAAAA,EAA+BI,WAC9BJ,IAAkC9K,KAAKoF,MAAMuD,eAC9CrG,GAAYA,EAAU6I,MAAKtE,GAAYA,EAASoE,WAC/CgsB,EAAgBj3B,KAAKkC,MAAMiE,KAAK1F,MAAwC,YAAhCT,KAAKkC,MAAMiE,KAAK1F,KAAKqG,QAAwB0vB,EACrFU,EAAmBz2B,SAAAA,EAAMy2B,iBAAmBz2B,EAAKy2B,iBAAmB,EACpEC,EAAqBhtB,EAAUitB,oBAAoBC,QAAQ,UAAWH,EAAiB3wB,YACvF+wB,EAAcntB,EAAUmtB,YACxBC,EAAgB,CAClB9kB,IAAK+kB,EAAAA,oBACLZ,qBACAa,UAAW,aACXC,WAAW,EACX7qB,UAAW,iCACX8qB,QAAS,QACTC,YAAa,SACblJ,OAAQ7sB,EACRg2B,uBAAuB,EACvBC,YAAapB,EACbqB,gBAAgB,GAIdC,EAASv3B,IAASA,EAAK2B,gBAAkB3B,EAAKA,KAAKw3B,kBAAgBl3B,EACnEm3B,EAAcF,EACd7tB,EAAUguB,uBAAuBd,QAAQ,UAAW/2B,EAAQ83B,iBAAiBC,eAAeL,IAC5F,GAENh4B,KAAKwT,4BAAyE,QAA9C+K,EAAGve,KAAKkC,MAAMiE,KAAKqN,mCAA2B,IAAA+K,OAAA,EAA3CA,EAA6CnY,OAChFpG,KAAK0T,kCAAgE,QAA/B5J,EAAG9J,KAAKkC,MAAMiE,KAAKkF,oBAAY,IAAAvB,GAAQ,QAARA,EAA5BA,EAA8B1D,cAAM,IAAA0D,GAE5E,QAF4EA,EAApCA,EAAsCwB,MAC3EgtB,GAHkC,oEAGvBA,EAAQ/sB,cACtB,IAAAzB,OAAA,EAFwCA,EAEtC2B,UAEH,MAAMkB,EAASC,EAAAA,EAAA,GACR5M,KAAKkC,OAAK,IACbq2B,SACI5zB,IAAAA,cAAC6zB,EAAAA,kBAAiB,CACdC,UAAWtuB,EAAUsuB,UACrBC,aAAcvuB,EAAUuuB,aACxBp4B,QAASA,EACTuB,GAAIA,EACJ0L,SAAUA,EACVpH,KAAM,CAAE1F,QACR0H,iBAAkBnI,KAAKmI,mBAG/BhG,UAAWG,EACXq2B,gBAAiB1B,EAAgBM,OAAgBx2B,EACjDkM,iBAAkB,CACdJ,UAAW,4BAEf+rB,gBAAiB,CACb/rB,UAAWC,IAAW,gBACtBjL,GAAI7B,KAAKkC,MAAML,IAEnBg3B,oBAAqB,CACjBhsB,UAAWC,IAAW,wBAM1BkB,2BACKvD,GAAgBrI,GAAoBq0B,IAAuBxsB,EAUxD,KATAtF,IAAAA,cAACsJ,EAAAA,OAAM1K,OAAA2K,OAAA,CACHC,SAAUlD,EACV4B,UAAU,6BACVuB,KAAM7D,EACNwC,MAAO5C,EAAUkE,qBACbrO,KAAKmM,4BAERhC,EAAUkE,qBAGvBC,uBACImoB,GAAwBhsB,GAAgBR,EAUpC,KATAtF,IAAAA,cAACsJ,EAAAA,OAAM1K,OAAA2K,OAAA,CACHC,SAAUlD,EACV4B,UAAU,kCACVuB,KAAMhE,EACN2C,MAAO5C,EAAUqE,0BACbxO,KAAKsM,2BAERnC,EAAUqE,0BAGvBsqB,eACIn0B,IAAAA,cAACsJ,EAAAA,OAAM1K,OAAA2K,OAAA,CACHrB,UAAU,6BACVuB,KAAMsoB,EACN3pB,MAAOoqB,GACHn3B,KAAKg2B,2BAERmB,GAGTnnB,qCAAsC,KACtCsnB,YAAa3yB,IAAAA,cAAA,QAAMkI,UAAU,8BAA8ByqB,GAC3DyB,WAAYp0B,IAAAA,cAAA,OAAKkI,UAAU,0BAA0BqrB,KAGzD,OAAOl4B,KAAKkC,MAAMyO,WAAWhE,EACjC,CAEQwpB,gBAAa,IAAA6C,EAAAC,EACjB,MACI9yB,MAAM,KAAE1F,IACRT,KAAKkC,MACHg3B,EAAwC,QAA7BF,EAAc,QAAdC,EAAGx4B,EAAK2F,cAAM,IAAA6yB,GAAM,QAANA,EAAXA,EAAax4B,YAAI,IAAAw4B,OAAA,EAAjBA,EAAmBE,eAAO,IAAAH,EAAAA,OAAIj4B,EAC9Cf,KAAKo5B,2BAA6BF,IAItCl5B,KAAKo5B,yBAA2BF,EAE5Bl5B,KAAKoF,MAAMP,gCACXyY,EAAAA,EAAAA,IAAkB7c,EAAMT,KAAKkC,MAAMW,UAAW7C,KAAKkC,MAAM5B,SACpDgE,MAAM8B,IACHpG,KAAKkF,SAAS,CAAEyD,aAAc3H,EAAAA,gBAAgBC,YAAYmF,aAAM,EAANA,EAAQ4B,yBAA0B,IAE/FxD,OAAM,KACHxE,KAAKkF,SAAS,CAAEyD,aAAa,GAAQ,IAG7C3I,KAAKkF,SAAS,CAAEyD,aAAa,IAErC,CAEQguB,gBAAgB1sB,EAA0BG,EAA0BF,GACxE,GAAID,EACA,OAAOG,EAGX,MAAMwS,GAAgBC,EAAAA,EAAAA,UAASzS,GAC/B,IAAI0S,EAAY1S,EAKhB,OAJIivB,EAAAA,GAAiBrc,YAAcJ,IAC/BE,EAAY,GAAGG,OAAOC,SAASC,SAAS/S,KAGrC,GAAGF,IAAaA,EAAUkT,SAAS,KAAa,IAAN,SAAeN,GACpE,CAkBQpS,gBAAa,IAAA4N,EACjB,MACIhY,SACI+H,SAAWuC,SAAS,uBAAE4N,GAA2B,CAAEA,4BAAwBzX,KAC9E,OACD8H,EAAM,UACNhG,EAAS,UACTsH,GACAnK,KAAKkC,MAEHsD,EAAgBxF,KAAK01B,kBAAkB7sB,EAAOrD,eAC9C/E,EAAOT,KAAKkC,MAAMiE,KAAK1F,MAAQT,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAI1D,OAAOpG,KAAKoF,MAAMovB,aAAa7zB,UAAYF,GAAQA,EAAKA,KAAKyI,WAAazI,EAAKA,KAAKyI,UAAU1G,OAAS,GACjG82B,EAAAA,EAAAA,GAAoB,CAChBn3B,UAAWnC,KAAK+0B,mBAAmBt0B,EAAKA,KAAKyI,UAAWL,EAAO0wB,oBAC/D54B,SAAUX,KAAKoF,MAAMovB,aAAa7zB,SAClCqK,qBAAsBhL,KAAKoF,MAAMovB,aAAaxpB,qBAC9C6N,uBAAwB7Y,KAAKoF,MAAMovB,aAAa1b,gBAChDtT,gBACAg0B,oBAAqBx5B,KAAKkC,MAAM5B,QAAQsT,IAAI/K,OAAO2wB,qBAAuB,EAC1ExgB,oBAAqBhZ,KAAKkC,MAAM5B,QAAQsT,IAAI/K,OAAOoQ,mBAAoB,EACvEC,qBAAqBC,EAAAA,EAAAA,kCAAiCnZ,KAAKkC,MAAM5B,QAAQsT,IAAI/K,OAAOuQ,4BACpFG,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzCjZ,QAASN,KAAKkC,MAAM5B,QACpBiN,SAAUvN,KAAKkC,MAAMqL,SACrB1L,GAAI7B,KAAKkC,MAAML,GACfsI,UAAW,CACPsP,WAAYtP,EAAUuP,yBACtBC,YAAaxP,EAAUyP,0BACvBC,aAAc1P,EAAU2P,kCACxBC,YAAa5P,EAAU6P,0BACvBG,sBAAuBhQ,EAAUiQ,oBACjCO,0BAA2BxQ,EAAUwQ,0BACrCN,uBAAwB,GACxBG,mBAAoB,GACpB5D,kBAAmB,GACnBC,iBAAkB,GAClB4D,oBAAqB,GACrBuX,aAAc7nB,EAAU6nB,cAE5BnvB,YACAkY,iBAAkB5Q,EAAU6Q,qBAC5BQ,eAAgB,GAChBC,kBAAmB,GACnBE,qBAAsB,GACtBE,UAAWpb,EACXqb,iBAAkB9b,KAAKoF,MAAM0W,iBAC7B5L,uBAAwBlQ,KAAK21B,2BAC7BzZ,uBAAwB1D,EACxBrQ,iBAAkBnI,KAAKmI,iBACvBqL,4BAA6BxT,KAAK0T,kCAAoC1T,KAAKwT,iCAA8BzS,EACzG8D,+BAAgC7E,KAAKoF,MAAMP,+BAC3CkU,SAAkC,QAA1BT,EAAEtY,KAAKkC,MAAMiE,KAAK4S,gBAAQ,IAAAT,OAAA,EAAxBA,EAA0BlS,SAExC,IACV,CA2BQjG,sCAAmC,IAAAsd,EAAAF,EACvC,MAAMC,QAAwBxd,KAAKkC,MAAMiE,KAAKkF,aAM9C,IAHImS,SAEC,QAFcC,EAAfD,EAAiBlS,MACbD,GAAsC,wEAAtBA,EAAaE,cAChC,IAAAkS,OAAA,EAFDA,EAEGhS,aAAa,EAGhB,YADAzL,KAAKkF,SAAS,CAAEL,gCAAgC,IAQpD,GAJ+B2Y,SAE9B,QAF6CD,EAAfC,EAAiBlS,MAC5CD,GAAsC,mDAAtBA,EAAaE,cAChC,IAAAgS,OAAA,EAF8BA,EAE5B9R,UAEyB,CAAC,IAADoS,EACxB,MAAMC,EAA4D,QAArBD,EAAG7d,KAAKkC,MAAM5B,eAAO,IAAAud,GAAS,QAATA,EAAlBA,EAAoBxV,eAAO,IAAAwV,GAAK,QAALA,EAA3BA,EAA6BjK,WAAG,IAAAiK,GAAU,QAAVA,EAAhCA,EAAkCE,gBAAQ,IAAAF,OAAA,EAA1CA,EAA4CG,iCAC5F,IAAKF,GAAuF,SAA5CA,EAE5C,YADA9d,KAAKkF,SAAS,CAAEL,gCAAgC,IAIpD,IAAK,IAADsZ,EACA,MAAMX,QAAwBxd,KAAKkC,MAAMiE,KAAKkF,aAK9C,MAHImS,SAEC,QAFcW,EAAfX,EAAiBlS,MACbD,GAAsC,oEAAtBA,EAAaE,cAChC,IAAA4S,OAAA,EAFDA,EAEG1S,aAAa,GAGhB,YADAzL,KAAKkF,SAAS,CAAEL,gCAAgC,GAO7C,CAJT,MAAO/B,GAIL,OAHA9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,qCAC3B3G,KAAKkF,SAAS,CAAEL,gCAAgC,GACzC,CAEqC,QAA5CiZ,EACA9d,KAAKkF,SAAS,CAAEL,gCAAgC,IAEhD7E,KAAKkC,MAAMiE,KAAK4J,oBACXzL,MAAK2Z,IACF,MAAM7X,IACA6X,IAC4C,QAA5CH,GAAqDG,EAAaC,OACnB,QAA5CJ,IAAsDG,EAAaC,OAC5Ele,KAAKkF,SAAS,CAAEL,+BAAgCuB,GAAS,IAE5D5B,OAAM1B,IACH9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,8BAA8B,GAC3D,KArCd,CAuCQ,IAAD+W,EACH,MAAMC,QAA0B3d,KAAKkC,MAAMiE,KAAKwX,kBAChD3d,KAAKkF,SAAS,CAAEL,iCAAwE,QAAxC6Y,EAAEC,aAAiB,EAAjBA,EAAmBC,2BAAmB,IAAAF,GAAAA,IACjF,CAEf,GApZEoX,GAAQlW,EAAAA,EAAAA,IAAA,CADbC,EAAAA,IACKiW,GAuZN,8FCndA,MAYM2E,EAAqBC,IACvB,MAAM,yBAAEhO,EAAwB,kCAAEC,EAAiC,MAAE3oB,GAAU02B,EAE/E,OACI/0B,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKwd,GACN/mB,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKyd,GAAoC3oB,GAASA,EAAMvB,IAAIk4B,IAC9D,EAITA,EAAwBxW,IAC1B,MAAM,4BAAE2B,EAA2B,QAAEO,GAAYlC,EAEjD,OAAOxe,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK4W,GAA8BO,EAAe,EAGlE,EA5B2DnjB,IACvD,MAAM,cAAEopB,EAAa,WAAEG,EAAU,aAAE3M,EAAY,MAAEoM,GAAUhpB,EAE3D,OACIyC,EAAAA,cAACi1B,EAAAA,OAAMr2B,OAAA2K,OAAA,GAAK4Q,GACRna,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKod,IACTJ,EACAuO,EAAkBhO,GACd,oICHV,MAAMoO,EAA4Dn2B,IAA+D,IAA9D,qBAAEo2B,EAAoB,MAAEC,EAAK,iBAAE5xB,EAAgB,QAAE6xB,GAASt2B,EAChI,MAAM8E,GAAUC,EAAAA,EAAAA,kBAAiB,QAASN,EAAmB8D,EAAAA,kBAAkBguB,kBACzEvW,GAAatX,EAAAA,EAAAA,wBAAuBjE,EAAmBK,GAC7D,OACI7D,EAAAA,cAAA,SAAApB,OAAA2K,OAAA,CAAQrB,UAAU,gCAA+B,aAAaitB,EAAsB7U,QAAS+U,GAAatW,GACtG/e,EAAAA,cAAA,QAAMkI,UAAU,uCAAsC,kBACjDktB,GAEA,aCLV,MAAMG,EAAgDx2B,IAA8D,IAA7D,MAAEy2B,EAAK,eAAEn4B,EAAc,aAAEo4B,EAAY,iBAAEjyB,GAAkBzE,EACnH,MAAM22B,EAAgBC,EAAkBH,EAAOhyB,GAC/C,OACIxD,EAAAA,cAAA,QAAMkI,UAAU,0BACXwtB,GAAiBA,EAAc73B,OAAS,EACrCmC,EAAAA,cAAC41B,EAAAA,GAAc,CAACJ,MAAOE,EAAe1W,UAAW,CAAEyW,eAAcp4B,oBACjE,KACD,EAITs4B,EAAoBA,CAACE,EAAwBryB,KAC/C,IAAKqyB,GAAgC,IAApBA,EAASh4B,OACtB,OAAO,KAEX,MAAM63B,EAAuC,GAoB7C,OAnBAG,EAAS/2B,SAAQ,CAACg3B,EAAM12B,KAEpB,MAAMyE,GAAUC,EAAAA,EAAAA,kBAAiB,QAASN,EAAkB,GAAI,IAC1DuyB,EAAWD,EAAKC,SAAWD,EAAKC,SAAW,GACjDlyB,EAAQuD,cAAcC,MAAQ0uB,EAC9B,MAAMhX,GAAatX,EAAAA,EAAAA,wBAAuBjE,EAAkBK,GACtDmyB,EAAoC,CACtCC,UAAWH,EAAKG,UAChB/tB,UAAW,wBACX6tB,SAAUD,EAAKC,SACfG,QAASJ,EAAKI,QAAQC,eACtBC,aAAcN,EAAKM,aACnBhW,KAAM,OACN3C,qBAAsBsB,EACtBuB,SAAS+V,EAAAA,EAAAA,kBAAiB7yB,EAAkBK,EAASkyB,IAEzDL,EAAc13B,KAAKg4B,EAAa,IAG7BN,CAAa,ECvCXY,EAA8Cv3B,IAA2C,IAA1C,KAAEw3B,EAAI,aAAEd,EAAY,eAAEp4B,GAAgB0B,EAC9F,OAAOiB,EAAAA,cAAC41B,EAAAA,GAAa,CAAC1tB,UAAU,wBAAwB4F,IAAI,OAAOyoB,KAAMA,EAAMvX,UAAW,CAAEwX,OAAQf,EAAcp4B,mBAAoB,ukBC0B1I,MAAMo5B,UAAoBz2B,EAAAA,cAA1B/E,cAAA,oBACW,KAAAwF,MAA2B,CAC9Bsa,WAAW,EACX2b,WAAW,EACXrb,YAAa,GAGA,KAAA7X,kBAAsCC,EAAAA,EAAAA,oBACnDpI,KAAKkC,MAAM5B,QAAQ+H,QAAQC,kBAC3BtI,KAAKkC,MAAMqG,aACXvI,KAAKkC,MAAMW,WAmER,KAAAy4B,iBAAoBr2B,IACnBjF,KAAKkC,MAAM2G,OAAO0yB,gBAAkBv7B,KAAKkC,MAAM2G,OAAO0yB,eAAe,KACrEv7B,KAAKkC,MAAM2G,OAAO0yB,eAAe,GAAGL,KAAOj2B,EAAMypB,OAAO8M,MAAM,EAI/D,KAAAC,qBAAwBC,GAAuBz2B,IAClD,GAAIjF,KAAKkC,MAAM2G,OAAO0yB,gBAAkBv7B,KAAKkC,MAAM2G,OAAO0yB,eAAe,GAAI,CACzE,MAAMpB,EAAQn6B,KAAKkC,MAAM2G,OAAO0yB,eAAe,GAAGpB,MAC9CA,IACAA,EAAMuB,GAAWhB,SAAWz1B,EAAMypB,OAAO8M,MAAK,GAKzC,KAAAG,MAAQ,KACrB,MAAM5b,EAAY/f,KAAK47B,cAAgB,EAAI57B,KAAKoF,MAAM4a,YAAc,EACpEhgB,KAAK67B,WAAW9b,EAAU,EAGb,KAAA+b,UAAY,KACzB,MAAM/b,EAAY/f,KAAK+7B,eACjB/7B,KAAKkC,MAAM2G,OAAO0yB,eACdv7B,KAAKkC,MAAM2G,OAAO0yB,eAAe/4B,OAAS,EAC1C,EACJxC,KAAKoF,MAAM4a,YAAc,EAC/BhgB,KAAK67B,WAAW9b,EAAU,EAGb,KAAA8b,WAAc93B,IACvB/D,KAAKoF,MAAMsa,WAGf1f,KAAKkF,SAAS,CAAE8a,YAAajc,GAAQ,EAGxB,KAAAg4B,aAAe,IAAiC,IAA3B/7B,KAAKoF,MAAM4a,YAEhC,KAAA4b,YAAc,IAC3B57B,KAAKkC,MAAM2G,OAAO0yB,gBAAkBv7B,KAAKoF,MAAM4a,cAAgBhgB,KAAKkC,MAAM2G,OAAO0yB,eAAe/4B,OAAS,EAE5F,KAAAw5B,WAAa,KAC1Bh8B,KAAKkF,SAAS,CAAEm2B,WAAW,GAAQ,CAE3C,CA5GW3xB,SACH,MAAM,eAAE6xB,EAAc,eAAEU,EAAc,SAAEpV,EAAQ,YAAEqV,EAAW,SAAE3b,EAAQ,UAAE1T,EAAY,IAAO7M,KAAKkC,MAAM2G,QACjG,qBAAEixB,EAAoB,iBAAEqC,EAAgB,WAAEC,EAAU,gBAAEC,GAAoBr8B,KAAKkC,MAAMiI,WACrF,UAAEkxB,EAAS,YAAErb,GAAgBhgB,KAAKoF,MAExC,IAAKi2B,EAED,OADAr7B,KAAKkC,MAAM5B,QAAQuC,UAAUC,MAAM,sDAC5B,KAGX,MAAM6J,EAASC,EAAAA,EAAA,GAGR5M,KAAKkC,OAAK,IACb2K,UAAWC,IAAW,kBAAmBD,GACzCwuB,YACAiB,UAAWt8B,KAAKg8B,WAChBO,YAAav8B,KAAKy7B,qBAClBe,WAAYx8B,KAAKs7B,iBAEjBmB,iBAAkB,CACd5vB,UAAWC,IAAW,kBAAmBD,GACzCoe,YAAajrB,KAAKkC,MAClB6iB,KAAM,SACN,aAAcsX,GAElBK,qBAAsB,CAClBjqB,IAAKwoB,GAET0B,sBAAuB,CACnBlqB,IAAKynB,EACL/xB,iBAAkBnI,KAAKmI,kBAE3By0B,aAAc,CAAE/vB,UAAW,4BAC3BgwB,gBAAiBT,EACjBb,iBACAvb,cACA8c,cAAe,CACXrqB,IAAKiU,EAAAA,SACL7Z,UAAW,4BACXmT,cACAJ,KAAM5f,KAAK27B,MACXxb,SAAUngB,KAAK87B,UACf5U,yBAA0BlnB,KAAK67B,WAC/BzU,cAAe8U,EACfrV,WACAqV,cACA3b,YAEJwc,YAAad,GACTt3B,EAAAA,cAACk1B,EAAsBt2B,OAAA2K,OAAA,GACf,CACA8rB,QAASh6B,KAAKg8B,WACdjC,MAAOoC,EACPrC,uBACA3xB,iBAAkBnI,KAAKmI,sBAMvC,OAAOnI,KAAKkC,MAAMyO,WAAWhE,EACjC,EAgDJ,uOC5GO,MAyCMqwB,EAAoE96B,IAAsD,IAAA+6B,EAAAC,EACnI,MACI/2B,MAAM,mBAAEg3B,IACRj7B,EAEJ,QAAmFnB,KAA/Eo8B,SAA0D,QAAxCF,EAAlBE,EAAoBC,wBAAwB,GAAGC,mBAAW,IAAAJ,OAAA,EAA1DA,EAA4DK,gBAC5D,OAAO,KAEX,MAAMr2B,EAAWk2B,EAAmBC,wBAAwB,GAAGG,gBAAgBC,SACzEC,EAAcv7B,EAAMiI,UAAUuzB,oCAC9BC,EAAkBz7B,EAAMiI,UAAUyzB,yCAClCC,EApDuB37B,KAAuD,IAAA47B,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EACpF,MAAO,CACHC,aAAwD,QAA5Cb,EAAE57B,EAAMiI,UAAUy0B,kCAA0B,IAAAd,EAAAA,EAAI,GAC5De,qBAAmE,QAA/Cd,EAAE77B,EAAMiI,UAAU20B,qCAA6B,IAAAf,EAAAA,EAAI,GACvEgB,uBAA4G,QAAtFf,EAAE97B,EAAMiI,UAAU60B,4EAAoE,IAAAhB,EAAAA,EAAI,GAChHiB,kBAA+D,QAA9ChB,EAAE/7B,EAAMiI,UAAU+0B,oCAA4B,IAAAjB,EAAAA,EAAI,GACnEkB,qBAA2E,QAAvDjB,EAAEh8B,EAAMiI,UAAUi1B,6CAAqC,IAAAlB,EAAAA,EAAI,GAC/EmB,sBAAyE,QAApDlB,EAAEj8B,EAAMiI,UAAUm1B,0CAAkC,IAAAnB,EAAAA,EAAI,GAC7EoB,kBAAkE,QAAjDnB,EAAEl8B,EAAMiI,UAAUq1B,uCAA+B,IAAApB,EAAAA,EAAI,GACtEznB,cAA4C,QAA/B0nB,EAAEn8B,EAAMiI,UAAUwM,qBAAa,IAAA0nB,EAAAA,EAAI,GAChDznB,kBAAoD,QAAnC0nB,EAAEp8B,EAAMiI,UAAUyM,yBAAiB,IAAA0nB,EAAAA,EAAI,GACxDznB,iBAAkD,QAAlC0nB,EAAEr8B,EAAMiI,UAAU0M,wBAAgB,IAAA0nB,EAAAA,EAAI,GACtDkB,kBAAoD,QAAnCjB,EAAEt8B,EAAMiI,UAAUs1B,yBAAiB,IAAAjB,EAAAA,EAAI,GACxDkB,0BAAsG,QAA7EjB,EAAEv8B,EAAMiI,UAAUw1B,mEAA2D,IAAAlB,EAAAA,EAAI,GAC1GmB,mCAAwH,QAAtFlB,EAAEx8B,EAAMiI,UAAU60B,4EAAoE,IAAAN,EAAAA,EAAI,GAC/H,EAqC0CmB,CAAiB39B,GAEtD49B,EA/BsBC,KAC5B,MAAMC,EAAsC,GAC5C,IAAK,MAAMC,KAAaF,EAAW3C,wBAAyB,CAAC,IAAD8C,EACxD,MACMC,EAAuB,CACzB3C,SAFayC,EAAU1C,gBAAgBC,UAIrC78B,EAAW,IAAIy/B,EAAAA,oBAAoBD,EAAgC,QAAvBD,EAAED,EAAU5C,mBAAW,IAAA6C,OAAA,EAArBA,EAAuB5C,gBAC3E0C,EAAar9B,KAAKhC,EAAU,CAEhC,OAAOq/B,CAAY,EAqBSK,CAAgBlD,GAC5C,OACIx4B,IAAAA,cAAC27B,EAAAA,mBAAkB,CACfC,cAAe9C,QAAAA,EAAe,GAC9BjiB,eAAe,GACfglB,oBAAqB7C,EACrB12B,SAAUA,EACVpF,GAAIK,EAAML,GACV0L,SAAUrL,EAAMqL,SAChBV,UAAW3K,EAAM2K,UACjB4zB,eAAep2B,EAAAA,EAAAA,IAAW,OAAQnI,EAAM5B,QAAQ4H,eAChD/B,KAAM,CAAEzE,QAAkE,QAA3Dw7B,EAAEC,EAAmBC,wBAAwB,GAAGC,mBAAW,IAAAH,OAAA,EAAzDA,EAA2DI,gBAC5Eh9B,QAAS4B,EAAM5B,QACfu9B,cAAeA,EACf6C,wBAfgC,EAgBhCC,qBAAsBb,EACtBc,QAAS1+B,EAAM0+B,SACjB,ECtDJC,EAAoC3+B,IACtC,MACIiE,MAAM,mBAAEg3B,GAAoB,QAC5B78B,EAAO,gBACPwgC,EAAe,UACf32B,EAAS,SACToD,GACArL,EAEJ,OACIyC,EAAAA,cAACq4B,EAA6B,CAC1BnwB,UAAW,GAAGi0B,qCACdj/B,GAJS,mBAKT0L,SAAUA,EACVpH,KAAM,CAAEg3B,sBACR78B,QAASA,EACT6J,UAAWA,EACXy2B,QAAUx6B,IAAgB,IAAA26B,EACK,QAA3BA,EAAI36B,EAAOgB,wBAAgB,IAAA25B,GAAc,QAAdA,EAAvBA,EAAyBh5B,oBAAY,IAAAg5B,GAArCA,EAAuCj5B,kBACvC5F,EAAM8+B,SAASC,eAAe76B,EAAOgB,iBAAiBW,aAAaD,iBAAkB,GAG/F,EASJo5B,EAAuBh/B,GAAuC,KAhDtCA,KAC1B,MACIiE,MAAM,mBAAEg3B,GAAoB,SAC5B6D,GACA9+B,GACE,kBAAEi/B,GAAsBH,EAE1B7D,GAAsBA,EAAmBiE,YAAYC,IACrDF,EAAkBhE,EAAmBiE,YAAYC,GAAI,EAyCzDC,CAAqBp/B,EAAM,sOC9ExB,MAAMq/B,UAA6B58B,EAAAA,UAStC/E,YAAmBsC,GAAiC,IAAAs/B,EAAAC,EAChD78B,MAAM1C,GAkBH,KAAAw/B,OAAUz8B,IACbA,EAAMghB,iBACNjmB,KAAK2hC,oBAAqB,EACtB3hC,KAAKkC,MAAM0/B,UACX5hC,KAAKkF,UAAS28B,IAAa,CAAOlvB,QAASkvB,EAAclvB,WACzD3S,KAAKkC,MAAM0/B,SAAS5hC,KAAKoF,QAEzBpF,KAAKkF,UAAS28B,IAAa,CAAOlvB,QAASkvB,EAAclvB,UAAW,EAxBxE3S,KAAK2hC,oBAAqB,EAC1B3hC,KAAKoF,MAAQ,CAAEuN,OAAmC,QAA7B6uB,EAAqB,QAArBC,EAAEv/B,EAAM4/B,qBAAa,IAAAL,OAAA,EAAnBA,EAAqB9uB,cAAM,IAAA6uB,GAAAA,GAClDxhC,KAAK+hC,kBAAoBj1B,IAAW,gBAAiB9M,KAAKkC,MAAM8/B,qBAAuBhiC,KAAKkC,MAAM8/B,qBAAuB,IACzH,MAAMC,EAAajiC,KAAKkC,MAAM+/B,WAAajiC,KAAKkC,MAAM+/B,WAAa,GAC/DjiC,KAAKkC,MAAMggC,gBACXliC,KAAKmiC,iBAAmBr1B,IAAW9M,KAAK+hC,kBAAmB/hC,KAAKkC,MAAMkgC,UAAYpiC,KAAKkC,MAAMkgC,UAAYH,GACzGjiC,KAAKqiC,kBAAoBriC,KAAKmiC,mBAE9BniC,KAAKmiC,iBAAmBr1B,IAAW9M,KAAK+hC,kBAAmB/hC,KAAKkC,MAAMkgC,UAAYpiC,KAAKkC,MAAMkgC,UAAY,IACzGpiC,KAAKqiC,kBAAoBv1B,IAAW9M,KAAK+hC,kBAAmBE,GAEpE,CAiBO14B,sBAAsBC,EAAuCC,GAChE,OAAIzJ,KAAKoF,QAAUqE,GAAazJ,KAAKkC,QAAUsH,CAInD,CAEOE,SACH,MAAMo4B,uWAAal1B,CAAA,GAAwB5M,KAAKkC,MAAM4/B,qBAGzB/gC,IAAzB+gC,EAAcnvB,QAAwB3S,KAAK2hC,sBAC3CG,EAAcnvB,OAAS3S,KAAKoF,MAAMuN,QAEtCmvB,EAAc9Q,SAAWhxB,KAAKkC,MAAM8uB,SACpC,MAAMsR,EAAcx1B,IAAW,SAAU9M,KAAKkC,MAAM2K,WAC9C01B,EAAwB,GAAGviC,KAAKkC,MAAM2K,UAAY7M,KAAKkC,MAAM2K,UAAY,aAE/E,OADA7M,KAAK2hC,oBAAqB,EAEtBh9B,EAAAA,cAAA,OAAKkI,UAAWy1B,GACZ39B,EAAAA,cAACsJ,EAAAA,OAAM1K,OAAA2K,OAAA,GACClO,KAAKkC,MAAMsgC,kBAAiB,CAChCvd,QAASjlB,KAAK0hC,OAAM,gBACLI,EAAcnvB,OAC7B8vB,OAAK,EACLt0B,SAAUnO,KAAKkC,MAAMwgC,WACrB71B,UAAW01B,EACX3vB,MAAM,cAEL5S,KAAK2iC,iCAAiCb,EAAcnvB,OAAQ2vB,IAEjE39B,EAAAA,cAACi+B,EAAAA,SAAQr/B,OAAA2K,OAAA,GAAK4zB,IAG1B,CAEQa,iCAAiCE,EAA0BP,GAC/D,MAAMQ,EAAwBh2B,IAC1B,qBACA9M,KAAKkC,MAAM6gC,sBAAwB/iC,KAAKkC,MAAM6gC,sBAAwB,IAEpEC,EAAqB,GAAGV,YACxBW,EAAyB,GAAGX,gBAClC,OACI39B,EAAAA,cAAAA,EAAAA,SAAA,KACIA,EAAAA,cAAA,MAAIkI,UAAWC,IAAWg2B,EAAuBE,IAAsBhjC,KAAKkC,MAAMghC,mBAClFv+B,EAAAA,cAAA,QAAMkI,UAAWC,IAAWg2B,EAAuBG,IAA0BjjC,KAAKkC,MAAMihC,uBACvFnjC,KAAKojC,qBAAqB,qBAAsBP,GAG7D,CAEQO,qBAAqBlmB,EAAkB2lB,GAC3C,IAAIQ,EAAaR,EAAkB7iC,KAAKmiC,iBAAmBniC,KAAKqiC,kBAEhE,OADAgB,EAAa,GAAGA,KAAcnmB,IACvBvY,EAAAA,cAAA,QAAMkI,UAAWw2B,GAC5B,EC7EJ,MAkBaC,EAA+BphC,IACxC,MAAM,gBACF4+B,EAAe,iBACfyC,EAAgB,kBAChBC,EAAiB,oBACjBC,EAAmB,SACnBC,EAAQ,YACRC,EAAW,YACXC,EAAW,oBACXC,EAAmB,kBACnBC,EAAiB,iBACjBC,EAAgB,mBAChBC,EAAkB,qBAClBC,EAAoB,kBACpBC,EAAiB,0BACjBC,GACAjiC,EAEEkiC,EApCqBF,IAAgDj/B,IAC3Ei/B,EAAkBj/B,EAAMypB,OAAO8M,OAAS,GAAG,EAmCrB6I,CAAsBH,GAEtCI,EA7BwBL,IAAmDh/B,IACjFg/B,EAAqBh/B,EAAMypB,OAAO8M,OAAS,GAAG,EA4BhB+I,CAAyBN,GAEjDO,EACF7/B,EAAAA,cAAA,OAAKkI,UAAW,GAAGi0B,gCACfn8B,EAAAA,cAAA,MAAIkI,UAAW,GAAGi0B,qCAAkD,aAAciD,GAC7EA,GAELp/B,EAAAA,cAAA,SACIkI,UAAW,GAAGi0B,qCACd2D,KAAK,OAAM,aACCV,EACZlgB,IAAK0f,EACLmB,SAAUN,KAKhBO,EACFhgC,EAAAA,cAAA,OAAKkI,UAAW,GAAGi0B,iCACfn8B,EAAAA,cAAA,MAAIkI,UAAW,GAAGi0B,sCAAmD,aAAcgD,GAC9EA,GAELn/B,EAAAA,cAAA,SACIkI,UAAW,GAAGi0B,sCACd8D,QAAQ,SACR/gB,IAAK2f,EACLkB,SAAUJ,EACVO,UAAWnB,EACXe,KAAK,SAAQ,YACH,SAAQ,aACNX,EAAiB,gBACdH,EAAW,gBACXC,EAAW,gBACXH,EAAoBx8B,YA2B/C,MAAO,CACHvF,QAAS8iC,EACTM,aAvBAngC,EAAAA,cAAA,OAAKkI,UAAW,GAAGi0B,4CACfn8B,EAAAA,cAACsJ,EAAAA,OAAM,CACHpB,UAAW,GAAGi0B,kDACd3yB,SAAU01B,EAAmB,aACjBG,EACZ/e,QAASkf,GAERH,IAiBT/8B,SAAU09B,EACVI,YAboBtB,EAAoBuB,aACxCrgC,EAAAA,cAAC+N,EAAAA,MAAK,CAACE,MAAO6wB,EAAoBuB,aAAaC,gBAAiBtyB,OAAQ8wB,EAAoBuB,aAAaryB,QACrGhO,EAAAA,cAAA,QAAMkI,UAAW42B,EAAoBuB,aAAaE,eAClDvgC,EAAAA,cAAA,YAAO8+B,EAAoBuB,aAAaG,mBAG5CpkC,EAQH,ECzIE,MAAMqkC,EAMTxlC,YAAmBylC,GACfrlC,KAAKqlC,YAAcA,EACnBrlC,KAAKslC,YAAa,CACtB,GAPA1mB,EAAAA,EAAAA,IAAA,CADC2mB,EAAAA,IAAU,iCC8Bf,MAAMC,EAAwFtjC,IAC1F,MAAM,UAAEiI,GAAcjI,EAChBujC,EAA4B,GAAGvjC,EAAM2K,qCAC3C,OACIlI,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,UACIA,IAAAA,cAAA,QAAMkI,UAAWC,IAAW,GAAG5K,EAAM2K,6BAEzClI,IAAAA,cAAA,UAAKwF,EAAUu7B,iCACf/gC,IAAAA,cAAA,UAAKwF,EAAUw7B,2BACfhhC,IAAAA,cAAA,MAAIkI,UAAW44B,GAA4Bt7B,EAAUy7B,6BACrDjhC,IAAAA,cAAA,UAAKwF,EAAU07B,iCACflhC,IAAAA,cAAA,MAAIkI,UAAW44B,GAA4Bt7B,EAAU27B,4BACrDnhC,IAAAA,cAAA,UAAKwF,EAAU47B,2BAChB,EASLC,EAAuF9jC,IACzF,MAAM,UAAEiI,GAAcjI,EACtB,OACIyC,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,MAAIkI,UAAWC,IAAW,GAAG5K,EAAM2K,4BACnClI,IAAAA,cAAA,UAAKwF,EAAUu7B,iCACf/gC,IAAAA,cAAA,WACD,EASEshC,EAAiF/jC,IAC1F,MAAMgkC,EAAe,GAAGhkC,EAAM2K,iBAE9B,IAAIs5B,EAOJ,OALIA,EADAjkC,EAAM0mB,SACQjkB,IAAAA,cAACqhC,EAAwCziC,OAAA2K,OAAA,GAAKhM,IAE9CyC,IAAAA,cAAC6gC,EAAyCjiC,OAAA2K,OAAA,GAAKhM,IAI7DyC,IAAAA,cAAA,SAAOkI,UAAW3K,EAAM2K,WACpBlI,IAAAA,cAAA,MAAIkI,UAAWq5B,GAAeC,GAC1B,EChCVC,EAAuC,CACzC3gC,UAAW,CACPC,GAAI,CAAEC,EAAG,gBAAiBC,EAAG,EAAGC,EAAG,GACnCE,GAAI,CAAEJ,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,IAEzCG,UAAU,EACVuZ,iBAAiB,GAQf8mB,EAAuFnkC,IAAuC,IAAAokC,EAAAC,EAAA5V,EAAA6V,EAChI,MAAM9kC,EAAoD,QAA7C4kC,EAAGpkC,EAAMiE,KAAKzE,QAAQ2jC,YAAYhI,mBAAW,IAAAiJ,OAAA,EAA1CA,EAA4ChJ,eACtDmJ,GAAmB9b,EAAAA,EAAAA,qBACrBjpB,aAAO,EAAPA,EAASkpB,OACT1oB,EAAM5B,QAAQ4H,cAAclG,eAAenC,YAClB,QAD6B0mC,EACtDrkC,EAAM5B,QAAQ+H,QAAQuL,WAAG,IAAA2yB,GAAQ,QAARA,EAAzBA,EAA2B19B,cAAM,IAAA09B,OAAA,EAAjCA,EAAmCllB,kBAGjCqlB,EAAqB,GAAGxkC,EAAM2K,qCAEpC,OACIlI,IAAAA,cAAA,OAAKkI,UAAW65B,GACZ/hC,IAAAA,cAAC2f,EAAAA,GAAK,CACFtiB,eAAgBE,EAAM5B,QAAQ4H,cAAclG,eAC5C6K,UAAW,GAAG65B,mBACd1kB,QAAStgB,aAAO,EAAPA,EAAS6J,KAClBuW,IAA6B,QAA1B6O,EAAEjvB,aAAO,EAAPA,EAASkvB,uBAAe,IAAAD,EAAAA,EAAI,GACjCpM,YAAakiB,EACbltB,aAAcrX,EAAM5B,QAAQ+H,QAAQkR,aACpC/T,cAAkC,QAArBghC,EAAEtkC,EAAMsD,qBAAa,IAAAghC,EAAAA,EAAIJ,EACtC3hB,oBAAoB,UAEtB,EAId,IAAIkiB,EAOJ,MA8CMC,EAAkBA,CACpBC,EAKAC,EACA5kC,IACE6kC,IACFF,EAAiBC,EAASC,EAAU7kC,IAC7B,GAUL8kC,EAAkBA,CACpBC,EACAC,EACAhlC,IACC,KACD+kC,EAAaC,EAA0BhlC,EAAM,EAQ3CilC,EACFjlC,IACoB,IAAAklC,EACpB,MACIj9B,WAAW,yCAAEk9B,EAAwC,oCAAEC,IACvDplC,EACER,EAAoD,QAA7C0lC,EAAGllC,EAAMiE,KAAKzE,QAAQ2jC,YAAYhI,mBAAW,IAAA+J,OAAA,EAA1CA,EAA4C9J,gBACrDiK,EAAmBC,IAAkBC,EAAAA,EAAAA,WAAS,GACrD,IAAIC,EAAa,GACjB,QAAgB3mC,IAAZW,EACA,OAAO,KAEN4wB,EAAAA,iBAAiBqV,mBAAmBjmC,EAAQ6J,OAAUhE,EAAAA,iBAAiBC,kBAAkB9F,EAAQC,YAClG+lC,GAAaE,EAAAA,EAAAA,uBAAsBlmC,EAAQ6J,KAAO7J,EAAQC,SAAUO,EAAM5B,QAAQ4H,gBAGtF,MAAM2/B,EAAqBljC,IAAAA,aAAkB,KACrCoY,EAAAA,GAASC,YACTC,OAAOC,SAAS9O,KAAOs5B,EAAW,GAEvC,CAACA,IAEEhG,EAAS/8B,IAAAA,aAAkB,KAC7B,MAAMmjC,GAA6BP,EAC/BO,GACInB,GACAA,GAAuB,GAE3Ba,EAAeM,GACfnB,EAAyBa,IAEzBb,OAAyB5lC,EACzBymC,EAAeM,GAA2B,GAE/C,CAACP,EAAmBC,IAEvB,GAAIlV,EAAAA,iBAAiBqV,mBAAmBD,GACpC,OAAO,KAGX,MAAM76B,EAAY,GAAG3K,EAAM2K,gCACrBk7B,EAA4B,GAAGl7B,uBAErC,OACIlI,IAAAA,cAAA,OAAKkI,UAAWA,GACZlI,IAAAA,cAACsJ,EAAAA,OAAM,CAACpB,UAAW,GAAGA,YAAqBoY,QAASyc,IACnD6F,GACG5iC,IAAAA,cAAA,OAAKkI,UAAWk7B,GACZpjC,IAAAA,cAACsJ,EAAAA,OAAM,CACHpB,UAAW,GAAGk7B,kBACd9iB,QAAS4iB,EAAkB,aACfR,GAEXC,GAEL3iC,IAAAA,cAACsJ,EAAAA,OAAM,CACHpB,UAAW,GAAG3K,EAAM2K,4BAA2B,aACnC3K,EAAMiI,UAAU69B,yCAE3B9lC,EAAMiI,UAAU69B,0CAI3B,EASDC,EAAsF/lC,IAAuC,IAAAgmC,EACtI,MAAMxmC,EAAoD,QAA7CwmC,EAAGhmC,EAAMiE,KAAKzE,QAAQ2jC,YAAYhI,mBAAW,IAAA6K,OAAA,EAA1CA,EAA4C5K,eACtDC,EAAkBr7B,EAAMiE,KAAKzE,QAAQ2jC,YAAY9H,iBACjD,IAAE4K,EAAG,IAAEC,EAAG,SAAEnhC,GAAa/E,EACzBujC,EAA4B,GAAGvjC,EAAM2K,gCAC3C,QAAgB9L,IAAZW,EAAuB,CAAC,IAAD2mC,EAAAC,EACvB,IAAIZ,EAAa,GAKjB,OAJKpV,EAAAA,iBAAiBqV,mBAAmBjmC,EAAQ6J,OAAUhE,EAAAA,iBAAiBC,kBAAkB9F,EAAQC,YAClG+lC,GAAaE,EAAAA,EAAAA,uBAAsBlmC,EAAQ6J,KAAO7J,EAAQC,SAAUO,EAAM5B,QAAQ4H,gBAIlFvD,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,UACIA,IAAAA,cAAC0hC,EAA2C9iC,OAAA2K,OAAA,GAAKhM,KAErDyC,IAAAA,cAAA,UAAKjD,EAAQkpB,QACbjmB,IAAAA,cAAA,UACIA,IAAAA,cAAA,OAAKkI,UAAW,GAAG3K,EAAM2K,2BACrBlI,IAAAA,cAAA,KAAGkI,UAAW,GAAG3K,EAAM2K,0BAA2BuB,KAAMs5B,GACnDhmC,EAAQ6J,MAEb5G,IAAAA,cAAA,QAAMkI,UAAW,GAAG3K,EAAM2K,iCACH,QADkCw7B,EACpD3mC,EAAQ6mC,kBAAU,IAAAF,OAAA,EAAlBA,EAAoB5mC,KAAI+mC,IAAS,IAAAC,EAAA,OAA4B,QAA5BA,EAAID,EAAUE,sBAAc,IAAAD,OAAA,EAAxBA,EAA0BE,KAAK,IAChEr2B,QAAOs2B,IAAmBtW,EAAAA,iBAAiBqV,mBAAmBiB,KAC9DC,KAAK3mC,EAAMiI,UAAU2+B,6CAItCnkC,IAAAA,cAAA,MAAIkI,UAAW44B,GApLHvjC,KACxB,MAAM,QAAE5B,EAAO,SAAEyoC,EAAQ,eAAEC,EAAc,UAAE7+B,GAAcjI,EACnD81B,EAAQ91B,EAAM81B,MAEpB,OAAIA,EAEIrzB,IAAAA,cAACskC,EAAAA,eAAc,CACXpnC,GAAIknC,EACJx7B,SAAUy7B,EACV7iC,KAAM,CAAE6xB,SACRnrB,UAAU,yCACV8J,cAAexM,EAAUwM,cACzBC,kBAAmBzM,EAAUyM,kBAC7BC,iBAAkB1M,EAAU0M,iBAC5BvW,QAASA,IAId,IAAI,EAkK4C4oC,CAAmBhnC,IAC9DyC,IAAAA,cAAA,UA3JazC,KACzB,MAAM81B,EAAQ91B,EAAM81B,MAEpB,OAAIA,EAEIrzB,IAAAA,cAAA,OAAKkI,UAAU,oDACVylB,EAAAA,iBAAiBC,cAAcrwB,EAAMq7B,gBAAgB4L,gBAAkBnR,EAAMmR,eAInF,IAAI,EAiJMC,CAAoBlnC,IACzByC,IAAAA,cAAA,MAAIkI,UAAW,GAAG3K,EAAM2K,+BACpBlI,IAAAA,cAAC0kC,EAAAA,oBAAmB,CAChBxnC,GAAI,sCAAsCH,EAAQC,YAAkC,QAA1B2mC,EAAI/K,EAAgBj3B,cAAM,IAAAgiC,EAAAA,EAAI,KACxFH,IAAKA,EACLC,IAAKA,EACLkB,aAAcriC,EACdoT,uBAAwBnY,EAAMiI,UAAUo/B,qCACxCjvB,yBAA0BpY,EAAMiI,UAAUq/B,uCAC1CjvB,yBAA0BrY,EAAMiI,UAAUs/B,uCAC1C3lC,IAAKy5B,EAAgBj3B,OACrBojC,WAAYhoC,EAAQioC,WACpBjF,SAAUkC,EAAgB1kC,EAAM0nC,UAAU/C,iBAAkBtJ,EAAgBj3B,OAAQpE,MAG5FyC,IAAAA,cAAA,UACIA,IAAAA,cAACsJ,EAAAA,OAAM,CACHpB,UAAW,GAAG3K,EAAM2K,4BAA2B,aACnC3K,EAAMiI,UAAU69B,wCAC5B/iB,QAAS+hB,EAAgB9kC,EAAM0nC,UAAU3C,aAAc/kC,EAAMiE,KAAKzE,QAASQ,MAGpF,CAIX,OAAO,IAAI,EAQF2nC,EAAqF3nC,IAAuC,IAAA4nC,EACrI,MAAMpoC,EAAoD,QAA7CooC,EAAG5nC,EAAMiE,KAAKzE,QAAQ2jC,YAAYhI,mBAAW,IAAAyM,OAAA,EAA1CA,EAA4CxM,eACtDC,EAAkBr7B,EAAMiE,KAAKzE,QAAQ2jC,YAAY9H,iBACjD,IAAE4K,EAAG,IAAEC,EAAG,SAAEnhC,GAAa/E,EACH,IAAD6nC,EAA3B,YAAgBhpC,IAAZW,EAEIiD,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,UACIA,IAAAA,cAAC0hC,EAA2C9iC,OAAA2K,OAAA,GAAKhM,KAErDyC,IAAAA,cAAA,UACIA,IAAAA,cAAA,OAAKkI,UAAW,GAAG3K,EAAM2K,2BACrBlI,IAAAA,cAAA,QAAMkI,UAAW,GAAG3K,EAAM2K,2BAA4BnL,EAAQC,UAC9DgD,IAAAA,cAAA,QAAMkI,UAAW,GAAG3K,EAAM2K,+BACtBlI,IAAAA,cAAC0kC,EAAAA,oBAAmB,CAChBxnC,GAAI,sCAAsCH,EAAQC,YAAkC,QAA1BooC,EAAIxM,EAAgBj3B,cAAM,IAAAyjC,EAAAA,EAAI,KACxF5B,IAAKA,EACLC,IAAKA,EACLkB,aAAcriC,EACdoT,uBAAwBnY,EAAMiI,UAAUo/B,qCACxCjvB,yBAA0BpY,EAAMiI,UAAUq/B,uCAC1CjvB,yBAA0BrY,EAAMiI,UAAUs/B,uCAC1C3lC,IAAKy5B,EAAgBj3B,OACrBojC,WAAYhoC,EAAQioC,WACpBjF,SAAUkC,EAAgB1kC,EAAM0nC,UAAU/C,iBAAkBtJ,EAAgBj3B,OAAQpE,QAKpGyC,IAAAA,cAAA,UACIA,IAAAA,cAACwiC,EAAwC5jC,OAAA2K,OAAA,GAAKhM,MAKvD,IAAI,EAQF8nC,EAA2E9nC,IACpF,MAAMgkC,EAAe,GAAGhkC,EAAM2K,iBAE9B,IAAIs5B,EAOJ,OALIA,EAHiG,QAAhFvd,EAAAA,EAAAA,UAAS,CAAEC,QAASC,EAAAA,YAAYC,SAAUzoB,QAAS4B,EAAM5B,QAAQ+H,UAGpE1D,IAAAA,cAACklC,EAAyCtmC,OAAA2K,OAAA,GAAKhM,IAE/CyC,IAAAA,cAACsjC,EAA0C1kC,OAAA2K,OAAA,GAAKhM,IAI9DyC,IAAAA,cAAA,SAAOkI,UAAW3K,EAAM2K,WACpBlI,IAAAA,cAAA,MAAIkI,UAAWq5B,GAAeC,GAC1B,ECpUH8D,EAAqE/nC,IAC9E,MAAO0mB,EAAUshB,GAAevlC,IAAAA,SAAezC,EAAMioC,cAC/CC,EAAyBloC,EAAMiE,KAAKikC,uBACpCC,EAAsCnoC,EAAMiE,KAAKkkC,oCAKjDC,EAAiBA,KACnBJ,EAAYhoC,EAAMioC,aAAa,EAG/BptB,EAAAA,GAASC,WACTC,OAAOstB,iBAAiB,SAAUD,GAGtC,MAAME,EAAkB,GAAGtoC,EAAM2K,oBAC3Bq5B,EAAe,GAAGhkC,EAAM2K,iBAE9B,OACIlI,IAAAA,cAAA,SAAOkI,UAAW3K,EAAM2K,WACpBlI,IAAAA,cAACshC,EAAkC,CAC/B3lC,QAAS4B,EAAM5B,QACfiN,SAAUrL,EAAMqL,SAChB1L,GAAI2oC,EACJ39B,UAAW29B,EACX5hB,SAAUA,EACVze,UAAWjI,EAAMiI,UACjBhE,KAAM,CAAC,IAEVikC,EAAuB3oC,KAAI,CAACgpC,EAAmB1mC,KAAS,IAAA2mC,EAAAC,EAAAC,EACrD,IAAI3jC,EAAWwjC,EAAkBpF,YAAY9H,gBAAgBC,SAC7D,MAAM97B,EAAU+oC,EAAkBpF,YAAYhI,YAC9C,IAAI8K,EAAc,EACdC,EAAc,GAClB,MAAMyC,EAAWnpC,SAAuB,QAAhBgpC,EAAPhpC,EAAS47B,sBAAc,IAAAoN,OAAA,EAAvBA,EAAyBI,SACtCT,IAAwC9iC,EAAAA,iBAAiBC,kBAAkBqjC,KACvEA,EAASE,iBAAmBF,EAASE,gBAAkB,IACvD5C,EAAM0C,EAASE,iBAEfF,EAASG,iBAAmBH,EAASG,gBAAkB,IACvD5C,EAAMyC,EAASG,iBAEnB/jC,EAAWgkC,KAAK7C,IAAInhC,EAAUkhC,IAElC,MAAMnQ,EAAiD,QAA5C2S,EAAGF,EAAkBpF,YAAYhI,mBAAW,IAAAsN,OAAA,EAAzCA,EAA2CO,aACzD,OACIvmC,IAAAA,cAACqlC,EAA+B,CAC5B1pC,QAAS4B,EAAM5B,QACfiN,SAAUrL,EAAMqL,SAChB1L,GAAI,GAAGqkC,KAAgBniC,IACvBD,IAA8C,QAA3C8mC,EAAEH,EAAkBpF,YAAYhI,mBAAW,IAAAuN,OAAA,EAAzCA,EAA2CtN,eAAe37B,SAC/DkL,UAAWq5B,EACX/7B,UAAWjI,EAAMiI,UACjBye,SAAUA,EACVoP,MAAOA,EACP+Q,SAAU7mC,EAAM6mC,SAChBC,eAAgB9mC,EAAM8mC,eACtBb,IAAKA,EACLC,IAAKA,EACLnhC,SAAUA,EACVlD,MAAOA,EACPyB,cAAetD,EAAMsD,cACrB+3B,gBAAiBkN,EAAkBpF,YAAY9H,gBAC/CqM,UAAW1nC,EAAMipC,UACjBhlC,KAAM,CACFzE,QAAS+oC,IAEf,IAGN,ylBCvBhB,MAAMW,UAAuBzmC,EAAAA,cA4GzB/E,YAAmBsC,GAAgD,IAAAkW,EAAAC,EAAAgG,EAAAgtB,EAAAC,EAAAC,EAC/D3mC,MAAM1C,GAxGO,KAAAspC,UAAoB,IAEpB,KAAAC,+BAAyC,EAEzC,KAAAC,eAAyB,SAEzB,KAAAC,oBAA8B,8BAU9B,KAAAC,sBAA6C,IAAIC,EAAAA,mBAAyB7rC,KAAKyrC,gCAExF,KAAAK,YAAwC,CAAC,EAEzC,KAAAC,uBAAsC,IAAIC,IAEjC,KAAAC,uBAAiC,yCAEjC,KAAAC,WAAqB,sBAK9B,KAAAC,sCAAgD,EAEhD,KAAAnjC,gCAA0C,EAE1C,KAAAojC,uCAAiD,EAExC,KAAAC,yBAAuD,CACpEC,oBAAsBC,IACdA,GACAvsC,KAAK+rC,uBAAuBhc,IAAIwc,EAAsB,EAS9DC,uBAAwBrsC,MAAOssC,EAA6BC,KAAmD,IAAAC,EAG3G,GAFA3sC,KAAK8rC,YAAYW,GAAuBC,EAEpC1sC,KAAK+rC,uBAAuBa,QAAqC,QAAjCD,EAAK3sC,KAAKoF,MAAMynC,yBAAiB,IAAAF,OAAA,EAA5BA,EAA8BnqC,QACnE,OAAOxC,KAAK4rC,sBACPkB,SAAQ3sC,SACEH,KAAK+sC,sBAEfvoC,OAAO1B,IAEJ,GAAIA,IAAUkqC,EAAAA,wBAAwBC,gCAClC,MAAM,IAAIzsC,MAAMsC,EAAO,GAE5B,EAUfoqC,gBAAiBA,CAACC,EAAuBhjC,IAC9BnK,KAAKotC,iBAAiBD,EAAehjC,GAOhDkjC,wBAA0BC,IACtBttC,KAAKkF,SAAS,CAAEooC,uBAAsB,GAI7B,KAAAC,4BAA2D,CAKxEtG,aAAe10B,IACXvS,KAAKwtC,wBAAwBj7B,EAAK8yB,YAAY,EASlDwB,iBAAkBA,CAAC4G,EAAuCxmC,IAC/CjH,KAAK0tC,mBAAmBD,EAAmBxmC,IA2RzC,KAAA0mC,mBAAqB,KAClC,MAAM,QAAErtC,EAAO,KAAE6F,EAAI,UAAEtD,EAAS,UAAEsH,GAAcnK,KAAKkC,OAC/C,mBAAEi7B,GAAuBh3B,EACb7F,EAAQ+H,QAAQ2B,KAAKC,iBAAmB3J,EAAQ+H,QAAQ2B,KAAK4jC,OAC9DzQ,GAAsBA,EAAmB/2B,OACtDynC,EAAAA,wBAAAA,YAAoC,CAAExsC,cAAef,EAAQ4H,eAAiBi1B,EAAmB/2B,OAAOg7B,aACnG98B,MAAK,KACF2Y,OAAOC,SAAS4wB,QAAQ,IAE3BtpC,OAAO1B,IACJD,EAAU6D,QAAQ,qDAClB7D,EAAUC,MAAMA,GAChB9C,KAAK+tC,mBACD5jC,EAAU6jC,0CACVhuC,KAAK0rC,eACL1rC,KAAK2rC,qBACL,EACH,IAGT9oC,EAAU6D,QAAQ,+EAAgF,EA8GzF,KAAAunC,mBAAsBC,MAE9BA,GAASA,EAAM1rC,OADG,KAEnBxC,KAAKkF,SAAS,CAAE+B,SAAU,EAAG4lC,kBAAmB,GAAIsB,qBAAiBptC,IACrEf,KAAK+tC,mBAAmB,GAAI,GAAI,IAAI,IAEpC/tC,KAAKouC,sBAELpuC,KAAKouC,qBAAqBC,SAG9B,MAAM,UAAExrC,EAAS,QAAEvC,GAAYN,KAAKkC,MAE/BowB,EAAAA,iBAAiBC,cAAc2b,GAgChCluC,KAAKkF,SAAS,CAAEipC,qBAAiBptC,EAAWutC,8BAA8B,KA/B1EtuC,KAAKouC,qBAAuBG,KAAS,MACjCC,EAAAA,EAAAA,eACI,IAAIC,EAAAA,mBACAnuC,EAAQ4H,cAAclG,eAAenC,YACrCquC,EACA5tC,EAAQ4H,cAAclG,eAAenC,YAAYU,WAErDP,KAAKkC,MAAM5B,QAAQ4H,eAElB5D,MAAKoqC,IACF1uC,KAAKkF,SAAS,CACVipC,gBAAiBO,aAAO,EAAPA,EAASC,QAC1B9B,kBAAmB6B,aAAO,EAAPA,EAASE,qBAC5BN,8BAA8B,IAE9BI,SAAAA,EAASC,SACT3uC,KAAK6uC,yBAAyBH,EAAQC,QAAS,IAGtDnqC,OAAO1B,IACJD,EAAU4B,UAAU3B,GACpBD,EAAU8D,MAAM,6BAA6B,GAC/C,GACP3G,KAAKwrC,WAERsD,YAAW,KAEP9uC,KAAKouC,sBAAsB,GA7BhB,GA+BfpuC,KAAKkF,SAAS,CAAEopC,8BAA8B,IAEoC,EAQzE,KAAAS,sBAAyBvT,IAAuB,IAAAwT,EAC7D,IAAIC,EAAe3f,OAAO4f,SAAS1T,EAAO,IAC1C,MAAM2T,EAAenvC,KAAKovC,eAAeruB,mBAAmBsuB,kBAAoBrvC,KAAKovC,eAAeruB,QAEpG,IAAIuuB,EAAkB,EAClBC,GAA+B,EACnC,GAAIvvC,KAAKmsC,uCAAyC5kC,EAAAA,iBAAiBC,kBAA4C,QAA3BwnC,EAAChvC,KAAKoF,MAAM+oC,uBAAe,IAAAa,OAAA,EAA1BA,EAA4BlE,UAAW,CAAC,IAAD0E,EACxH,MAAM3E,EAAW7qC,KAAKoF,MAAM+oC,gBAAiBrD,SAC7CwE,EAA2C,QAA5BE,EAAG3E,aAAQ,EAARA,EAAUE,uBAAe,IAAAyE,EAAAA,EAAI,EAC/C,MAAMC,EAAkBxE,KAAK7C,IAAI6G,EAAcK,GAC3CG,IAAoBR,IACpBM,GAAsB,GAE1BN,EAAeQ,CAAgB,CAGnCzvC,KAAKkF,SAAS,CAAE+B,SAAUgoC,IAAgB,KACtCV,KAAS,KACDgB,IAAwBjgB,OAAOogB,MAAM1vC,KAAKoF,MAAM6B,WAAakoC,IAC7DA,EAAaQ,aAAa,gBAAiBV,EAAa1oC,YACxD4oC,EAAa3T,MAAQyT,EAAa1oC,WAAW,GAjBnB,IAclCgoC,EAKmC,GACrC,EASW,KAAAnB,iBAAmB,CAACD,EAAuBhjC,KAA0D,IAAAylC,EAClH,MAAMlG,EAAuC,QAA7BkG,EAAG5vC,KAAKoF,MAAM+oC,uBAAe,IAAAyB,OAAA,EAA1BA,EAA4BjG,WAE/C,OAAQwD,GACJ,KAAK0C,EAAAA,qBAAqBC,MACtB,OAAO3lC,EAAUyP,0BACrB,KAAKi2B,EAAAA,qBAAqBE,cACtB,OAAO5lC,EAAU2P,kCACrB,KAAK+1B,EAAAA,qBAAqBG,KACtB,OAAO7lC,EAAUuP,yBACrB,KAAKm2B,EAAAA,qBAAqBI,MACtB,OAAOvG,EAAav/B,EAAU+P,2BAA6B/P,EAAU6P,0BACzE,QACI,MAAO,GAAG,EAOL,KAAA+yB,kBAAoB5sC,UACjC,MACIG,SAAS,cACL4H,EACAG,SACIxI,aAAa,UAAEU,MAGvBP,KAAKkC,OACH,kBAAE2qC,EAAiB,gBAAEsB,GAAoBnuC,KAAKoF,MAC9C8qC,EAAuBlvC,EAAAA,gBAAgBC,YAAY4rC,GACzD,IAAKsB,IAAoB+B,EACrB,OAGJ,MAAMC,EAAkBvjC,EAAA,GAAkC5M,KAAK8rC,aAI/D,GAHA9rC,KAAKkF,SAAS,CAAEooC,qBAAqB,IAGjCttC,KAAKoF,MAAMgrC,2BAA2BC,WAAY,CAElD,MAAMC,EAAoB1jC,EAAA,GAAQ5M,KAAKoF,MAAMgrC,4BAC7CE,EAAqBD,gBAAatvC,EAClCf,KAAKkF,SAAS,CAAEkrC,2BAA4BE,GAAwB,CAIxE,IAAK,MAAMC,KAAgBhtC,OAAOM,KAAKssC,GACnC,GAAInwC,KAAKoF,MAAMgrC,2BAA2BI,gBAAgBD,GAAe,CAErE,MAAME,EAAU7jC,EAAA,GAAQ5M,KAAKoF,MAAMgrC,4BACnCK,EAAWD,gBAAgBD,QAAgBxvC,EAE3Cf,KAAKkF,SAAS,CAAEkrC,2BAA4BK,GAAc,CAMlE,MAAMC,EAAmB7D,aAAiB,EAAjBA,EACnBprC,KAAI+mC,IAAY,IAAAmI,EACd,MAAO,CACHC,mBAAoBpI,EAAUoI,mBAC9BlI,eAC2F,QAD7EiI,EACV3wC,KAAK6wC,sBAAsBrI,EAAW2H,EAAmB3H,EAAUoI,4BAAoB,IAAAD,EAAAA,EAAInI,EAAUE,eACzGoI,oBAAqBtI,EAAUsI,oBAClC,IAEJx+B,QAAOk2B,GACGA,EAAUE,iBAMnBqI,EAAkB,IAAI7vC,SAA8Bf,UACtD,MAAM6wC,QAAmBC,EAAAA,EAAAA,oBACrB,IAAIC,EAAAA,qBACA/C,EAAgBtgB,gBAAkBsgB,EAAgBtgB,gBAAkBsgB,EAAgBxsC,SACpFpB,EACAmwC,OACA3vC,EACAf,KAAKkC,MAAM5B,QAAQ+H,SAEvBH,GAEA8oC,SACMG,EAAAA,EAAAA,iCACF,IAAIC,EAAAA,qCACAJ,EAAWnjB,gBAAkBmjB,EAAWnjB,gBAAkBmjB,EAAWrvC,SACrEpB,EACAmwC,EACA1wC,KAAKkC,MAAM5B,QAAQ+H,SAEvBH,GAIR/G,EAAQ6vC,EAAW,IAGjBK,QAAuBN,EAC7B/wC,KAAKkF,SAAS,CAAEipC,gBAAoC,OAAnBkD,EAA0BA,OAAiBtwC,GAAY,EAS3E,KAAA8vC,sBAAwB,CACrCS,EACAC,KAEA,GAAIA,GAAcD,EAAqBE,gBACnC,OAAOF,EAAqBE,gBAAgBlmC,MAAKk9B,GAAaA,EAAU7mC,YAAc4vC,GAG1E,EAUH,KAAAE,yBAA2B,CACxCC,EACAvnC,EACAu/B,KAEA,MAAMiI,EAAqBxnC,EAAUynC,qDAErC,OAAQF,GACJ,KAAK7B,EAAAA,qBAAqBC,MACtB,OAAO3lC,EAAU0nC,oDACrB,KAAKhC,EAAAA,qBAAqBE,cACtB,OAAO5lC,EAAU2nC,4DACrB,KAAKjC,EAAAA,qBAAqBG,KACtB,OAAO7lC,EAAU4nC,mDACrB,KAAKlC,EAAAA,qBAAqBI,MACtB,OAAOvG,EAAaiI,EAAqBxnC,EAAU6nC,oDACvD,QACI,MAAO,GAAG,EAUL,KAAA7b,cAAgB,CAACgY,EAAgClnC,KAA6B,IAAAgrC,EAE3F,MAAMC,EAA8C,QAA7BD,EAAG9D,EAAgB5F,kBAAU,IAAA0J,OAAA,EAA1BA,EAA4B3/B,QAClDk2B,KAAeA,EAAUE,gBAAkBF,EAAUE,eAAeC,SAGxE,GAAI3nC,EAAAA,gBAAgBC,YAAYixC,GAAoB,CAChD,MAAMnN,EAAc/kC,KAAKmyC,oBAAoBD,GAAmB,GAEhE,GAAIlyC,KAAKoF,MAAMgrC,2BAA2BI,gBAAiB,CAEvD,MAAMC,EAAU7jC,EAAA,GAAQ5M,KAAKoF,MAAMgrC,4BAInC,OAHAK,EAAWD,gBAAkBzL,EAE7B/kC,KAAKkF,SAAS,CAAEkrC,2BAA4BK,KACrC,CAAM,CAAD,CAIpB,GAAIxpC,GAdoB,EAcS,CAC7B,MAAMkD,EAAYnK,KAAKkC,MAAMiI,UAE7B,OADAnK,KAAK+tC,mBAAmB5jC,EAAUioC,oCAAqCpyC,KAAK0rC,eAAgB1rC,KAAK2rC,qBAAqB,IAC/G,CAAM,CAEjB,OAAO,CAAI,EA8BE,KAAA+B,mBAAqB,CAAC5G,EAA6B7/B,KAChE,MAAM,QAAE3G,EAAO,KAAE6F,EAAI,UAAEtD,GAAc7C,KAAKkC,OACpC,mBAAEi7B,GAAuBh3B,EAC/B,GAAIg3B,SAAAA,EAAoB/2B,OAAQ,CAC5B,MAAMisC,EAA8BlV,EAAmB/2B,OAAOg3B,wBAC9D,GAAIp8B,EAAAA,gBAAgBC,YAAYoxC,GAA8B,CAC1D,MAAMC,EAAiBD,EAA4BE,WAC9Ctd,GAAkCA,EAAMsI,gBAAgBj3B,SAAWwgC,IAElE0L,EAAkB5lC,EAAA,GAAQylC,EAA4BC,IAC5D,GAAID,EAA4BC,GAAgB/U,gBAAgBC,WAAav2B,EACzE,OAAO,EAEX,MAAMwrC,EAAmBD,EAAmBjV,gBAAgBC,SAC5DgV,EAAmBjV,gBAAgBC,SAAWv2B,EAC9C,MAAM,YAAEo2B,GAAyBmV,EAATjgC,GAAImgC,EAAAA,EAAAA,GAAKF,EAAkBG,GAEnD9E,EAAAA,wBAAAA,4BACI,CAAExsC,cAAef,EAAQ4H,eACzBi1B,EAAmB/2B,OAAOg7B,YAAYC,GACtC,CAAC9uB,EAAKgrB,kBAELj5B,MAAKsuC,IACF,GAAI5xC,EAAAA,gBAAgBC,YAAY2xC,GAAO,CACnC,MAAMC,EAAUD,EAAKtnC,MAAK2pB,GAASA,EAAM3uB,SAAWwgC,IACpDuL,EAA4BC,GAAgB/U,gBAAkBsV,EAC9D,MAAMC,EAAe,IAAIT,GACzBS,EAAaR,GAAkB,CAAEjV,cAAaE,gBAAiBsV,GAC/D,MAAME,EAAkBnmC,EAAAA,EAAA,GAAQuwB,EAAmB/2B,QAAM,IAAE4sC,iBAAkBF,IAK7E,OAJAxyC,EAAQ4H,cAAc+qC,OAClB,IAAIC,EAAAA,uBAAuB5yC,EAAQ4H,cAAclG,gBACjD+wC,IAEG,CAAK,CAGhB,OAAO,CAAK,IAEfvuC,OAAO1B,IACJD,EAAU6D,QAAQ,yDAClB7D,EAAUC,MAAMA,EAAMuE,SAItB,OAFAmrC,EAAmBjV,gBAAgBC,SAAWiV,EAC9CzyC,KAAK+tC,mBAFe,mCAEiB/tC,KAAK0rC,eAAgB1rC,KAAK2rC,qBAAqB,IAC7E,CAAK,GACb,CAEX,OAAO,CAAM,CAGjB,OAAO,CAAK,EAOC,KAAA6B,wBAA2Bj7B,IACxC,MAAM,QAAEjS,EAAO,KAAE6F,EAAI,UAAEtD,GAAc7C,KAAKkC,OACpC,mBAAEi7B,GAAuBh3B,EAE/B,GAAIg3B,SAAAA,EAAoB/2B,OAAQ,CACV9F,EAAQ+H,QAAQ2B,KAAKC,iBAAmB3J,EAAQ+H,QAAQ2B,KAAK4jC,MAE3EC,EAAAA,wBAAAA,4BACI,CAAExsC,cAAef,EAAQ4H,eACzBqK,EAAKgrB,gBAAgB4V,cACrB,CAAC5gC,EAAKgrB,kBAELj5B,MAAK,KACF2Y,OAAOC,SAAS4wB,QAAO,EAAM,IAEhCtpC,OAAO1B,IACJD,EAAU6D,QAAQ,gEAClB7D,EAAUC,MAAMA,EAAMuE,QAAQ,IAGtCxE,EAAU6D,QAAQ,yFAAyF,GAKtG,KAAA0sC,yCAA2C,KACxD,IAAIxjC,GAAsC,EACP,IAAD9F,EAA9B9J,KAAKkC,MAAMiE,KAAKkF,eAChBuE,GACuC,QAAnC9F,EAAA9J,KAAKkC,MAAMiE,KAAKkF,aAAajF,cAAM,IAAA0D,GAElC,QAFkCA,EAAnCA,EAAqCwB,MACjCgtB,GAA4B,2DAAjBA,EAAQ/sB,cACtB,IAAAzB,OAAA,EAFDA,EAEG2B,aAAa,GAExB,OAAOmE,CAAmC,EAM7B,KAAAyjC,0BAA4BlzC,UACzC,MACIG,SAAS,cAAE4H,GAAe,UAC1BiC,EAAS,UACTtH,GACA7C,KAAKkC,OACH,wCACFoxC,EAAuC,wCACvCC,EAAuC,wCACvCC,GACArpC,GACE,gBAAEgkC,EAAe,SAAElnC,EAAQ,cAAEwsC,GAAkBzzC,KAAKoF,MAEpDyK,GAAYjE,EAAAA,EAAAA,IAAa5L,KAAKkC,MAAM5B,QAAQ+H,SAIlD,GAFArI,KAAK+tC,mBAAmB,GAAI,GAAI,IAAI,QAEZhtC,IAApBotC,GAAiCnuC,KAAKm2B,cAAcgY,EAAiBlnC,GAAW,CAAC,IAADysC,EAKhF,GAJIphB,EAAAA,iBAAiBqV,mBAAmB8L,UAC9BzzC,KAAK2zC,qBAGXrhB,EAAAA,iBAAiBqV,mBAAmB3nC,KAAKoF,MAAMquC,eAE/C,YADAzzC,KAAK+tC,mBAAmBwF,EAAyCvzC,KAAK0rC,eAAgB1rC,KAAK2rC,qBAAqB,GAGpH,MAAMtrC,EAAQ,IAAIuzC,EAAAA,0BACd5zC,KAAKoF,MAAMquC,cACXtF,EAAgBxsC,SAChBsF,EACoC,QAD5BysC,EACRvF,EAAgB0F,4BAAoB,IAAAH,EAAAA,EAAI,KACxC1zC,KAAKozC,2CACLvjC,SAGEikC,EAAAA,EAAAA,4BAA2BzzC,EAAO6H,GACnC5D,MAAK8B,IACEA,EAAO+sC,gBACPnzC,KAAK+tC,mBAAmBuF,EAAyC,UAAW,gBAAgB,GAC5Fr2B,OAAOC,SAAS4wB,SAChB9tC,KAAKkF,SAAS,CAAC,GAAG,IAGzBV,OAAO1B,IACJD,EAAU8D,MAAM,iFACG,wDAAf7D,EAAMixC,KACN/zC,KAAK+tC,mBACDyF,EACAxzC,KAAK0rC,eACL1rC,KAAK2rC,qBACL,GAGJ3rC,KAAK+tC,mBACDwF,EACAvzC,KAAK0rC,eACL1rC,KAAK2rC,qBACL,EACF,GAEP,GAQP,KAAAgI,mBAAqBxzC,UACzB,MACIG,SAAS,cAAE4H,GAAe,UAC1BrF,EAAS,UACTsH,GACAnK,KAAKkC,OACH,cAAEuxC,GAAkBzzC,KAAKoF,OACzB,wCAAEmuC,GAA4CppC,EAEpD,GAAImoB,EAAAA,iBAAiBqV,mBAAmB8L,GAAgB,CACpD,MAAMpzC,EAAQ,IAAI2zC,EAAAA,uBAAuB,GAAIC,EAAAA,gBAAgBC,YAgB7D,aAdMC,EAAAA,EAAAA,mBAAkB9zC,EAAO6H,GAC1B5D,MAAK8B,GACGksB,EAAAA,iBAAiBqV,mBAAmBvhC,EAAOi7B,IAIzC,IAHHrhC,KAAKkF,SAAS,CAAEuuC,cAAertC,EAAOi7B,KAC/Bj7B,EAAOi7B,MAIrB78B,OAAO1B,IACJD,EAAU8D,MAAM,0EAChB9D,EAAUC,MAAMA,EAAMuE,SACtBrH,KAAK+tC,mBAAmBwF,EAAyCvzC,KAAK0rC,eAAgB1rC,KAAK2rC,qBAAqB,GACzG,MAER,EAAG,CAGd,OAAO8H,CAAa,EAUP,KAAA1F,mBAAqB,CAAC5I,EAAqBF,EAAyBC,EAAsBvyB,KACvG3S,KAAKkF,SAAS,CAEV8/B,aAAc,CACVG,cACAF,kBACAC,eACAvyB,WAEN,EAl5BF3S,KAAKo0C,kBAAoBzvC,EAAAA,YACzB3E,KAAKovC,eAAiBzqC,EAAAA,YAEtB3E,KAAKq0C,mBAAoBjsC,EAAAA,EAAAA,oBACrBpI,KAAKkC,MAAM5B,QAAQ+H,QAAQC,kBAC3BtI,KAAKkC,MAAMqG,aACXvI,KAAKkC,MAAMW,WAEf7C,KAAKoF,MAAQ,CACTkpC,8BAA8B,EAC9BnG,IAAK,EACLC,IAAK,GACLnhC,SAAU,EACVknC,qBAAiBptC,EACjB8rC,uBAAmB9rC,EACnBqvC,2BAA4B,CACxBI,gBAAiB,CAAC,GAEtB5nB,SAAU5oB,KAAK4oB,SACfjoB,SAAU,GACV2sC,qBAAqB,EACrBmG,cAAe,IAGnBzzC,KAAKs0C,yBAA2B,oCAChCt0C,KAAKu0C,kCAAoC,yCACzCv0C,KAAKw0C,8BAAgC,wCAErCx0C,KAAKmsC,qCAEc,QAFsB/zB,EACF,QADEC,EACrCrY,KAAKkC,MAAMiE,KAAKkF,aAAajF,cAAM,IAAAiS,GAAyF,QAAzFA,EAAnCA,EAAqC/M,MAAKD,GCnLa,oEDmLGA,EAAaE,cAAqD,IAAA8M,OAAA,EAA5HA,EACM5M,iBAAS,IAAA2M,GAAAA,EAEnBpY,KAAKgJ,+BAEc,QAFgBqV,EACI,QADJgtB,EAC/BrrC,KAAKkC,MAAMiE,KAAKkF,aAAajF,cAAM,IAAAilC,GAA6F,QAA7FA,EAAnCA,EAAqC//B,MAAKD,GCpLlD,wEDoLkEA,EAAaE,cAAyD,IAAA8/B,OAAA,EAAhIA,EACM5/B,iBAAS,IAAA4S,GAAAA,EAEnB,MAAMV,EAAoB3d,KAAKkC,MAAMiE,KAAKwX,kBAC1C3d,KAAKosC,sCAAsG,QAAjEd,EAAG3tB,SAAyB,QAAR4tB,EAAjB5tB,EAAmBvX,cAAM,IAAAmlC,OAAA,EAAzBA,EAA2BkJ,2CAAmC,IAAAnJ,GAAAA,CAC/G,CAEqB1iB,eAEjB,MAAgB,QADHA,EAAAA,EAAAA,UAAS,CAAEC,QAASC,EAAAA,YAAYC,SAAUzoB,QAASN,KAAKkC,MAAM5B,QAAQ+H,SAEvF,CAEOqB,SAAM,IAAAgrC,EAAAC,EACT,MAAM,KAAExuC,GAASnG,KAAKkC,MACtB,IAAKiE,EAAK4J,oBAAoB3J,OAC1B,OAAO,KAEX,MAAM+2B,EAAqBh3B,EAAKg3B,wBAEGp8B,KAA/Bo8B,aAAkB,EAAlBA,EAAoB/2B,SACpBpG,KAAKkF,SAAS,CACVvE,SAAUw8B,EAAmB/2B,OAAOg3B,wBACpCqW,cAAetW,EAAmB/2B,OAAOg7B,YAAYC,KAG7D,MAAM,UAAEx0B,EAAY,GAAE,YAAE+2B,GAAgB5jC,KAAKkC,MAAM2G,OAC7CoV,EAAeje,KAAKkC,MAAMiE,KAAK4J,oBAAoB3J,QACnD,4BACFwuC,EAA2B,gCAC3BC,EAA+B,wBAC/BC,EAAuB,wCACvBC,EAAuC,gCACvCC,EAA+B,wCAC/BC,EAAuC,gDACvCC,EAA+C,0CAC/CC,EAAyC,uCACzCC,EAAsC,wCACtCC,EAAuC,yCACvCC,EAAwC,gCACxCC,GACAv1C,KAAKkC,MAAMiI,UAETqrC,EAAiE,CACnEC,4BAA6BN,EAC7Bv7B,0BAA2Bq7B,EAC3Bn7B,kCAAmCo7B,EACnCx7B,yBAA0B07B,EAC1Bp7B,0BAA2Bq7B,EAC3Bn7B,2BAA4Bo7B,IAG1B,6BAAEhH,EAA4B,2BAAE8B,EAA0B,gBAAEjC,EAAe,kBAAEtB,GAAsB7sC,KAAKoF,MAExGolC,EAAkB,GAAGxqC,KAAKksC,qBAE1Bn5B,EACFpO,EAAAA,cAAA,OAAKkI,UAAW29B,GACZ7lC,EAAAA,cAAC+wC,EAAAA,QAAO,CAAC7oC,UAAW,GAAG29B,YAA2BtP,KAAMqa,KAI1D5oC,EAASC,EAAAA,EAAA,GACP5M,KAAKkC,OAAmD,IAE5DyzC,oBAAqB,CAAE9oC,UAAWC,IAAW,sBAAuBD,GAAYoe,YAAajrB,KAAKkC,OAClG06B,aAAc,CAAE/vB,UAAW,gCAC3B+oC,cAAe33B,aAAY,EAAZA,EAAcC,MAC7BnL,SACA8iC,QAAS,CACLhpC,UAAW,GAAG7M,KAAKksC,wBACnBz5B,IAAK,OAETqjC,OAAQ,CACJrjC,IAAK8uB,EACL10B,UAAW,GAAG7M,KAAKksC,qBACnBpK,cAAe,CAAEnvB,OAAQ3S,KAAKoF,MAAMkpC,8BACpCpL,kBAAmB0R,EACnBzR,sBAAuB0R,EACvB7yC,eAAgBhC,KAAKkC,MAAM5B,QAAQ+H,QACnCF,iBAAkBnI,KAAKq0C,mBAE3B0B,aAAc/1C,KAAKg2C,sBACnBC,mBAAoB,CAChBppC,UAAW,GAAG7M,KAAKs0C,4BAA4BhG,EAA+B,UAAY,aAE9F4H,iCAAkC,CAC9BrpC,UAAW7M,KAAKu0C,mCAEpB4B,6BAA8B,CAC1BtpC,UAAW7M,KAAKw0C,+BAEpB4B,KAAM9S,EAA4B,CAC9BC,iBAAkBvjC,KAAKo0C,kBACvB5Q,kBAAmBxjC,KAAKovC,eACxBvL,qBAAsBsK,EACtBnK,mBAAoB8Q,EACpB/Q,iBAAkBiR,EAClBlR,kBAAmBiR,EACnBrR,SAAU,GACVC,YAA2B,QAAhB+Q,EAAE10C,KAAKoF,MAAM+iC,WAAG,IAAAuM,EAAAA,EAAI,EAC/B9Q,YAA2B,QAAhB+Q,EAAE30C,KAAKoF,MAAMgjC,WAAG,IAAAuM,EAAAA,EAAI/Q,EAC/B9C,gBAAiB9gC,KAAKksC,WACtBzI,oBAAqBzjC,KAAKoF,MAC1B8+B,kBAAmBlkC,KAAKiuC,mBACxBhK,qBAAsBjkC,KAAK+uC,sBAC3B5K,0BAA2BnkC,KAAKqzC,4BAEpCgD,UACIlI,GAAmBtB,GACbyJ,EAAAA,EAAAA,qBACIt2C,KAAKisC,uBACLjsC,KAAKkC,MAAM5B,QACXN,KAAKkC,MAAMqG,aACXvI,KAAKkC,MAAMW,UACXsyC,EACAK,EACAx1C,KAAKqsC,yBACL8B,EACAtB,EACAuD,QAEJrvC,EACVutC,6BAA8BtuC,KAAKoF,MAAMkpC,6BACzCnE,aAAcnqC,KAAKoF,MAAMwjB,SACzB2tB,UAAWv1C,EAAAA,gBAAgBC,YAAYjB,KAAKoF,MAAMzE,UAAYX,KAAKw2C,4BAAyBz1C,EAC5F01C,aAAcz2C,KAAK02C,6BAA6BvZ,aAAkB,EAAlBA,EAAoB/2B,UAGxE,OAAOpG,KAAKkC,MAAMyO,WAAWhE,EACjC,CAEQ+pC,6BAA6BvZ,GACjC,MAAM,SAAE5vB,EAAQ,QAAEjN,EAAO,UAAE6J,GAAcnK,KAAKkC,OACxC,+BACFy0C,EAA8B,oCAC9BjZ,EAAmC,yCACnCE,EAAwC,4DACxC+B,EAA2D,qEAC3DX,EAAoE,2BACpEJ,EAA0B,8BAC1BE,EAA6B,6BAC7BI,EAA4B,sCAC5BE,EAAqC,mCACrCE,EAAkC,gCAClCE,EAA+B,kBAC/BC,EAAiB,kBACjB7oB,EAAiB,iBACjBC,EAAgB,cAChBF,GACAxM,EACJ,GAAInJ,EAAAA,gBAAgBC,YAAYk8B,aAAkB,EAAlBA,EAAoBC,yBAA0B,CAuC1E,MPlU8Bl7B,KACtC,MAAM,gBAAE4+B,EAAe,oBAAE2C,EAAmB,UAAEt5B,GAAcjI,GACtD,+BAAEy0C,GAAmCxsC,EAErCysC,EAAkBnT,EAAoBoT,gBACxClyC,EAAAA,cAAC+N,EAAAA,MAAK,CAACE,MAAO6wB,EAAoBoT,gBAAgB5R,gBAAiBtyB,OAAQ8wB,EAAoBoT,gBAAgBlkC,QAC3GhO,EAAAA,cAAA,QAAMkI,UAAW42B,EAAoBoT,gBAAgB3R,eACrDvgC,EAAAA,cAAA,YAAO8+B,EAAoBoT,gBAAgB1R,mBAG/CpkC,EAGJ,MAAO,CACH+1C,oBAAqBjW,EAAiC3+B,GACtDi/B,kBACIx8B,EAAAA,cAACsJ,EAAAA,OAAM,CAACpB,UAAW,GAAGi0B,mCAAkD7b,QAASic,EAAoBh/B,IAChGy0C,GAGT5R,YAAa6R,EAChB,EO6ScG,CAtCoD,CACvD5wC,KAAM,CAAEg3B,sBACR2D,gBAAiB9gC,KAAKksC,WACtBrqC,GAAI,mBACJ0L,WACAjN,UACA0gC,SAAU,CACNG,kBAAmBnhC,KAAK2tC,mBACxB1M,eAAiB55B,GACbrH,KAAKkF,SAAS,CACV2xC,gBAAiB,CACb1R,YAAa99B,EACb49B,gBAAiBjlC,KAAK0rC,eACtBxG,aAAcllC,KAAK2rC,oBACnBh5B,QAAQ,MAIxB8wB,oBAAqBzjC,KAAKoF,MAC1B+E,UAAW,CACPwsC,iCACAjZ,sCACAE,2CACA+B,8DACAX,uEACAJ,6BACAE,gCACAI,+BACAE,wCACAE,qCACAE,kCACAC,oBACA7oB,oBACAC,mBACAF,kBAIgD,CAE5D,OAAO,IACX,CAMQq/B,sBAEJ,IAAKh2C,KAAKkC,MAAM5B,QAAQsT,IAAI/K,OAAOmuC,sBAC/B,OAAO,KAGX,IAAKh2C,EAAAA,gBAAgBC,YAAYjB,KAAKkC,MAAMwM,MAAMuoC,mBAC9C,OAAO,KAGX,MAAMC,EAAiB,GAAGl3C,KAAKksC,4BAC/B,OACIvnC,EAAAA,cAAA,OAAKkI,UAAWqqC,GACXvyC,EAAAA,aAAmB3E,KAAKkC,MAAMwM,MAAMuoC,kBAAkB,GAA0B,CAC7EpK,kBAAmB7sC,KAAKoF,MAAMynC,oBAI9C,CAMQ2J,uBACJ,MAAMU,EAAiB,GAAGl3C,KAAKksC,4BAC/B,OAAOvnC,EAAAA,cAAA,OAAKkI,UAAWqqC,GAAiBl3C,KAAKm3C,uBAAuBn3C,KAAKksC,YAC7E,CAMQkL,8BACJ,MAEMC,EAFqCr3C,KAAKoF,MAAMzE,SAEUc,KAAKC,GAC1D,IAAI0jC,EAAsB1jC,KAGrC,OAAOV,EAAAA,gBAAgBs2C,YAAYD,EACvC,CAkCQF,uBAAuBtqC,GAC3B,MAAM0qC,EAAiB,GAAG1qC,gBAE1B,OACIlI,EAAAA,cAACslC,EAA4B,CACzBpoC,GAAI01C,EACJxO,SAAU/oC,KAAKkC,MAAML,GACrBmnC,eAAgBhpC,KAAKkC,MAAMqL,SAC3BA,SAAUvN,KAAKkC,MAAMqL,SACrBzJ,IAAKyzC,EACL1qC,UAAW0qC,EACXpxC,KAAM,CACFikC,uBAAwBpqC,KAAKo3C,8BAC7B/M,oCAAqCrqC,KAAKmsC,sCAE9C7rC,QAASN,KAAKkC,MAAM5B,QACpB6J,UAAWnK,KAAKkC,MAAMiI,UACtBggC,aAAcnqC,KAAKoF,MAAMwjB,SACzBuiB,UAAWnrC,KAAKutC,6BAG5B,CAEQsB,yBAAyBntC,GAC7B,MAAMymC,EAAcnoC,KAAKw3C,+BAA+Bx3C,KAAKmsC,qCAAsCzqC,GAC7F0mC,EAAcpoC,KAAKy3C,+BACrBz3C,KAAKgJ,gCAAkChJ,KAAKmsC,qCAC5CzqC,GAEJ,IAAIuF,EAAmBjH,KAAK03C,aACxB13C,KAAKmsC,qCACLnsC,KAAKosC,sCACL1qC,GAEJuF,EAAWgkC,KAAK7C,IAAInhC,EAAUkhC,GAE9BnoC,KAAKkF,SAAS,CACVijC,MACAC,MACAnhC,YAER,CAEQuwC,+BAA+BnN,EAA8C3oC,GAAsB,IAAAi2C,EACvG,OACItN,GACArqC,KAAK43C,2BADLvN,MAEA3oC,GAAiB,QAAVi2C,EAAPj2C,EAASopC,gBAAQ,IAAA6M,GAAjBA,EAAmB5M,iBACnBrpC,EAAQopC,SAASC,gBAAkB,EAE5BrpC,EAAQopC,SAASC,gBAGrB,CACX,CAEQ0M,+BAA+B5yC,EAAyCnD,GAAsB,IAAAm2C,EAClG,OACIhzC,GACA7E,KAAK43C,2BADL/yC,MAEAnD,GAAiB,QAAVm2C,EAAPn2C,EAASopC,gBAAQ,IAAA+M,GAAjBA,EAAmB7M,iBACnBtpC,EAAQopC,SAASE,gBAAkB,EAE5BtpC,EAAQopC,SAASE,gBAGrBhrC,KAAKkC,MAAM5B,QAAQsT,IAAI/K,OAAOuQ,0BACzC,CAOQw+B,0BAAuB,IAAAE,EAAAC,EAC3B,MAAMp6B,EAAoB3d,KAAKkC,MAAMiE,KAAKwX,kBAC1C,QAAuD,QAAhDm6B,EAAEn6B,SAAyB,QAARo6B,EAAjBp6B,EAAmBvX,cAAM,IAAA2xC,OAAA,EAAzBA,EAA2Bn6B,2BAAmB,IAAAk6B,GAAAA,EAC3D,CAEQJ,aACJrN,EACA2N,EACAt2C,GAAsB,IAAAu2C,EAEtB,IAAIC,EAAkB,EAEtB,OAAK7N,GAAwC2N,GAIzCt2C,SAAiB,QAAVu2C,EAAPv2C,EAASopC,gBAAQ,IAAAmN,GAAjBA,EAAmBE,iBAAmBz2C,EAAQopC,SAASqN,gBAAkB,IACzED,EAAkBx2C,EAAQopC,SAASqN,iBAGhCD,GAPIA,CAQf,CAwRQ/F,oBACJ/rC,EACAsjC,GAEA,IAAKtjC,EACD,MAAO,CAAC,EAEZ,MAAMgyC,EAA4D,CAAC,EAC7DjuC,EAAYnK,KAAKkC,MAAMiI,UAC7B,IAAK,MAAMq+B,KAAapiC,EACpBgyC,EAAW5P,EAAUoI,oBAAsB5wC,KAAKyxC,yBAAyBjJ,EAAUoI,mBAAoBzmC,EAAWu/B,GAEtH,OAAO0O,CACX,GA9oBUx5B,EAAAA,EAAAA,IAAA,CAATy5B,EAAAA,IAAQ,6BA62Bb,8TE3jCO,MAAMC,EAAiBp2C,IAC1B,MAmBMq2C,EAAgBlmB,IAClB,MAAM,0BAAE9W,EAAyB,QAAE7Z,EAAO,SAAEmF,EAAQ,UAAEgV,EAAS,sBAAEjD,GAA0B1W,EAE3F,GAAImwB,EAAiB,CACjB,IAAK9W,EACD,OAEJA,EACKi9B,WAAW,CACR32C,GAAI+W,EACJlX,UACA+2C,wBAAyB,CACrBC,cAAe7xC,EAAS1D,oBAE5B2V,gBAAiB5W,EAAM4W,gBACvB6/B,mBAAoBx4C,MAAOy4C,EAAiBC,IAlCzB14C,OAC/By4C,EACA/8B,EACAhV,EACAgyC,IAEKh9B,EAGEA,EACFi9B,6BAA6B,CAAEC,WAAYlyC,EAASP,OAAS4W,SAAU07B,EAAiBC,iBACxFv0C,MAAK8B,IACoB,YAAlBA,EAAOU,QACP5E,EAAM8Z,4BAGbxX,OAAM1B,QATA5B,QAAQC,UA4BI63C,CAA2BJ,EAAiB/8B,EAAWhV,EAAUgyC,KAG/Er0C,OAAM1B,YACR,CACH,IAAK+Y,EACD,OAEJhV,EAASxD,aAAe,GACxBwD,EAAS1D,mBAAqB,GAC9B0D,EAASoyC,gBAAkB,CAAC,EAC5Bp9B,EACKq9B,4BAA4B,CAAEH,WAAYlyC,EAASP,SACnDhC,MAAK8B,IACoB,YAAlBA,EAAOU,QACP5E,EAAM8Z,4BAGbxX,OAAM1B,UAIbq2C,EAAkBA,CAACC,EAAwCt9B,KAC7D,IAAKA,IAAqBs9B,GAAkD,IAA5Bt9B,EAAiBtZ,OAC7D,MAAO,GAGX,MAAM62C,EAAgBv9B,EAAiBxQ,MAAKstC,GACjCA,EAAgBF,gBAAkBU,IAG7C,OAAIC,EACOA,EAAcC,YAElBF,CAAkB,EAwF7B,GAAKl3C,EAAM4W,iBAAoB5W,EAAM4W,gBAAgBygC,gBAArD,CAIiF,IAAAC,EAAjF,GAAIt3C,EAAMsX,kCAAoCtX,EAAMsR,6BAChD,IAvByBimC,EACzBC,EACAC,KAEA,MAAM9mB,EAA2B,GASjC,OARA6mB,SAAAA,EAAwBj4C,KAAIm4C,IACxB,MAAMC,EAASF,aAAqB,EAArBA,EAAuBruC,MAAKwuC,GAAgBA,IAAiBF,EAASG,OAIrF,OAHIF,GACAhnB,EAAelwB,KAAKk3C,GAEjBhnB,CAAc,IAGlB7xB,EAAAA,gBAAgBC,YAAY4xB,EAAe,EAU7C4mB,CAAqBv3C,EAAM4W,gBAAgBygC,gBAAkD,QAAnCC,EAAEt3C,EAAMsR,mCAA2B,IAAAgmC,OAAA,EAAjCA,EAAmCQ,yBAChG,YAED,IACF93C,EAAMga,yBACNha,EAAM4W,gBAAgBygC,gBAAgBjuC,MAAK2uC,GAAUA,EAAOF,OAAS73C,EAAMga,yBAE5E,OAGJ,MAAO,CACH0tB,UAAW,CACPsQ,YAAa3B,GAEjB5mB,iBAxG0BwoB,EAC1Bn2C,EACAiX,EACAm/B,EACA/+B,EACAS,KAEA,MAAMgX,EAAcqmB,EAAgBn1C,EAASb,mBAAoB2Y,GAC3Du+B,IAAkBr2C,EAASb,mBAE3Bm3C,EAAejoB,GACV,KACHkmB,EAAalmB,EAAgB,EAIrC,OACI1tB,EAAAA,cAAAA,EAAAA,SAAA,KACIA,EAAAA,cAAA,SAAOkI,UAAU,iCACblI,EAAAA,cAAA,SACI9C,GAAI,6BAA6BmC,EAASsC,SAC1Cm+B,KAAK,QACLsP,KAAM,gBAAgB/vC,EAASsC,SAC/Bo+B,SAAU4V,GAAY,GACtB9e,MAAOvgB,EACPs/B,SAAUF,EAAa,gBACRA,EACfv2C,IAAK,GAAGE,EAASsC,kBAEpB2U,GAELtW,EAAAA,cAAA,SAAOkI,UAAU,qCACblI,EAAAA,cAAA,SACI9C,GAAI,+BAA+BmC,EAASsC,SAC5Cm+B,KAAK,QACLsP,KAAM,gBAAgB/vC,EAASsC,SAC/Bo+B,SAAU4V,GAAY,GACtB9e,MAAO4e,EACPG,QAASF,EAAa,eACRA,EACdv2C,IAAK,GAAGE,EAASsC,kBAEpB8zC,GAEJp2C,EAASb,mBACNwB,EAAAA,cAAA,OAAKkI,UAAU,qCACXlI,EAAAA,cAAA,QAAMkI,UAAU,2CAA2CimB,GAC3DnuB,EAAAA,cAAA,UAAQkI,UAAU,uCAAuCoY,QAASq1B,GAAY,IACzEj/B,IAGT,KACL,EAoDW8+B,CACdj4C,EAAM2E,SACN3E,EAAMs4C,WACNt4C,EAAMu4C,kBACNv4C,EAAMmZ,gBACNnZ,EAAM4Z,kBAEVgX,YAAaqmB,EAAgBj3C,EAAM2E,SAAS1D,mBAAoBjB,EAAM4Z,kBACtEuW,kBAAmBnwB,EAAM2E,SAAS1D,mBAClC0vB,eAzDuB6nB,EAACC,EAAkC7hC,KAA2C,IAAA8hC,EACrG,MAAMhB,EAAW9gC,SAAgC,QAAjB8hC,EAAf9hC,EAAiBygC,uBAAe,IAAAqB,OAAA,EAAhCA,EAAkCtvC,MAAK2uC,GAAUA,EAAOF,OAASY,EAAYz+B,yBAC9F,OAAO09B,aAAQ,EAARA,EAAUiB,WAAW,EAuDZH,CAAmBx4C,EAAOA,EAAM4W,iBAChD4Y,eAAgB,CACZ7kB,UAAW,mCAElB,ECqBCiuC,EAAgBA,CAClBj0C,EACAnF,EACAQ,EACA6B,EACAg3C,EACAnyC,KACqB,IAAA+uC,EAAAqD,EAAA3S,EAAA4S,EACrB,MAAM,cACFz1C,EAAa,aACb+T,EAAY,GACZ1X,EAAE,SACF0L,EAAQ,QACRjN,EAAO,UACP6J,EAAS,iBACT4Q,EAAgB,uBAChB7K,EAAsB,6BACtBtJ,EAA4B,6BAC5B2V,EAA4B,gCAC5BC,EAA+B,kCAC/BtN,EAAiC,mCACjCE,EAAkC,wCAClCkN,EAAuC,uDACvC9M,EAAsD,wBACtDqL,EAAuB,6BACvBC,EAA4B,eAC5BhL,EAAc,oBACdC,EAAmB,UACnBwI,EAAS,oBACT0D,EAAmB,sBACnBrD,EAAqB,UACrBsiC,GACAh5C,EAEE+H,EAAkB3J,EAAQ+H,QAAQ2B,KAAKC,gBACvCkxC,EAAiB5iC,GAAaA,EAAU/V,OAAS,GAAK+V,EAAU,GAAGhN,KAAOgN,EAAU,GAAGhN,KAAO0Q,EAC9Fm/B,GA5JNpiC,EA4J+D9W,EAAM8W,oBA3JrE2D,EA2J0Fo+B,EAxJrF/hC,GACA2D,GACAA,EAAoB0+B,0BACpB1+B,EAAoB2+B,oBACpB3+B,EAAoB0+B,yBAAyBE,kBAK3C5+B,EAAoB0+B,yBAAyBE,kBAHzC,GAXuBC,IAClCxiC,EACA2D,EA6JA,MAAMinB,EACFliC,GA/IwB+5C,EAC5BC,EACA1iC,EACAoiC,EACAv2C,EACA82C,KAEA,GAAI92C,EAAgC,CAChC,IAAI+2C,EAAmCD,EAQvC,OAJKA,IACDC,EAAmCF,GAAuB,IAGvD1iC,EACD4iC,EAAmCR,EAC/BQ,EACAR,EACJQ,EAEV,OAAI5iC,GACOoiC,EAA2BM,EAAsBN,EAErDM,CAAmB,EAuHtBD,CACIv5C,EAAMgX,oBACNhX,EAAM8W,oBACNoiC,EACAl5C,EAAM2C,gCACNnD,SAAiB,QAAVi2C,EAAPj2C,EAASopC,gBAAQ,IAAA6M,OAAA,EAAjBA,EAAmB3M,kBAAmB,GAK9C,IAAI6Q,GAAuBn6C,aAAO,EAAPA,EAASuQ,iBAAkBC,EAAAA,oBAAoBC,WAAatL,EAASi1C,cAEhG,GAAIZ,EAAW,CACX,MAAMa,EAAwBX,IACvBL,aAAwB,EAAxBA,EAA0BM,yBAAyBvK,uBACnDiK,aAAwB,EAAxBA,EAA0BM,yBAAyBvK,oBAAoBxlC,MAAM0wC,GAA6B,kBAAjBA,EAASC,OAEnGC,EAAqBH,GAAyBA,EAAsBpT,OAASoT,EAAsBpT,MAAMwT,YAE/G,IAAIC,EAAgB,GAEhBA,EADsBr7C,MAAtBm7C,EACgB,GAEAA,EAAmB31C,WAGvC,MAAM81C,EAAqBjB,IACpBL,aAAwB,EAAxBA,EAA0BM,yBAAyBvK,uBACnDiK,aAAwB,EAAxBA,EAA0BM,yBAAyBvK,oBAAoBxlC,MAAM0wC,GAA6B,mBAAjBA,EAASC,OACnGK,EAAwBD,GAAsBA,EAAmB1T,OAAS0T,EAAmB1T,MAAM4T,aACzG,IAAIC,EAAiB,EACQz7C,MAAzBu7C,IACAE,EAAiBF,GAGrB,IAAIG,EAAS,EACmB17C,MAA5Bq6C,IACAqB,EAASntB,OAAO8rB,KAGE,GAAlBoB,GAGIC,GAAUD,GAGW,IAAjBJ,KALRP,GAAuB,GAa/B,MAAMa,EAAen1C,EAAAA,iBAAiBC,kBAAkBo8B,QAClD7iC,EA3Ke47C,EACrBvB,EACAwB,EACA16C,EACA25C,EACA73C,EACA64C,KACoB,IAAAC,EACpB,MAAMC,EAA+B,GAGrC,GADuE,aAAb,QAAzBD,EAAA56C,EAAMya,2BAAmB,IAAAmgC,OAAA,EAAzBA,EAA2Bh2C,QAExD,OAGJ,IAAIi0C,EACJ,GAAI74C,EAAM8I,sBAAwBhK,EAAAA,gBAAgBC,YAAYiB,EAAM8I,wBAChE+vC,EAA2B74C,EAAM8I,qBAAqBM,MAAKqR,GACnDza,EAAMmX,sBACCsD,EAAoB0+B,yBAAyBxpC,YAAc7N,EAAS6N,UAG3E8K,EAAoB0+B,yBAAyBxpC,YAAc7N,EAAS6N,WACpE8K,EAAoBqgC,mBAAqBh5C,EAASi5C,mBAGzBl8C,IAA7Bg6C,GACA,OAIJ74C,EAAMia,eAAiBja,EAAM8W,sBAAwB6iC,IACjDT,GAA4B,EAC5B2B,EAAmBp6C,KAAKT,EAAMsZ,gBACvB4/B,EAA2BwB,IACD,IAA7BxB,EACA2B,EAAmBp6C,KAAKT,EAAMuZ,mBAE9BshC,EAAmBp6C,KAAKT,EAAMyZ,qBAAqB0b,QAAQ,YAAa+jB,EAAyB70C,eAM7G,MAAM22C,EAAiBh7C,EAAMoF,gBAAgBU,uBACvCm1C,EAAsBD,aAAc,EAAdA,EAAgB5qC,QAAOvO,GAASA,EAAMuC,SAAWu2C,IAC7E,QAA4B97C,IAAxBo8C,EACA,IAAK,MAAMC,KAAKD,EACRn8C,EAAAA,gBAAgBC,YAAYm8C,EAAEz1C,qBAC9By1C,EAAEz1C,mBAAmBlE,SAAQ45C,SACOt8C,IAA5Bs8C,EAAWz1C,cACXm1C,EAAmBp6C,KAAK06C,EAAWz1C,iBAOvD,OAAI5G,EAAAA,gBAAgBC,YAAY87C,GACrBA,EAAmBlU,KAAK,UADnC,CAIgB,EA8GV8T,CAAiBvB,EAA0Bv0C,EAAS22B,SAAWt7B,EAAO25C,EAAsBh1C,EAAUA,EAASP,QAE/Gg3C,EAvGoBC,EAACrtC,EAA8DrJ,IAAuB,KAChHqJ,EAAuBrJ,EAAS,EAsGH02C,CAAsBrtC,EAAwBrJ,GAErE+uB,GAAUntB,EAAAA,EAAAA,kBAAiBotB,EAAAA,GAAe2nB,eAAgBt7C,EAAMiG,iBAAmB4S,EAAkB,IACrG2I,GAAatX,EAAAA,EAAAA,wBAAuBlK,EAAMiG,iBAAmBytB,GAE7D6nB,EAAe1C,aAAwB,EAAxBA,EAA0B2C,gBACzCC,EAAgB5C,EAChB,gCAAuE,QAAvEC,EAAgCD,EAAyB6C,sBAAc,IAAA5C,OAAA,EAAvCA,EAAyCxoB,qBACzEzxB,EAGA88C,GAEF,YADAn8C,SAAmB,QAAZ2mC,EAAP3mC,EAAS6mC,kBAAU,IAAAF,GAA8E,QAA9EA,EAAnBA,EAAqB/8B,MAAKk9B,GAHL,IAGkBA,EAAUoI,4BAAgD,IAAAvI,GAAgB,QAAhBA,EAAjGA,EAAmGK,sBAAc,IAAAL,OAAA,EAAjHA,EAAmHM,OAGvH,IAAIjB,GACJ,GAAIhmC,GAGA,GAFAgmC,IAAaoW,EAAAA,EAAAA,mBAAkBp8C,EAASQ,EAAM5B,QAAQ4H,mBAAenH,GAEjEgc,EAAAA,GAASC,YAAalM,EAAAA,EAAAA,IAAiB5O,EAAM5B,QAAQ4H,cAAclG,gBAAiB,KAAA+7C,GACpF,MAAMC,EAAU,IAAIrxB,IAAI+a,GAAYzqB,OAAOC,SAAS9O,MACpD4vC,EAAQpxB,aAAahH,IAAI,YAAa,GAAqB,QAArBm4B,GAAGl3C,EAASo3C,iBAAS,IAAAF,GAAAA,GAAI,KAC/DrW,GAAasW,EAAQ5vC,WAGzBs5B,IAAawW,EAAAA,EAAAA,8BAA6Br3C,EAASg0C,aAAe,GAAI34C,EAAM5B,QAAQ4H,eAGxF,MAAO,CACH/B,KAAM,CACFzE,UACAmF,YAEJ0qB,WAAY1qB,EAASP,OACrBxD,MAAO45C,EACPzxC,WAAW4wC,IAAwB35C,EAAM8W,sBAAsBnS,EAAS22B,UAAaoG,QAAAA,EAAe,GACpG/8B,SACIlC,EAAAA,cAACw5C,EAAAA,sBAAqB,CAClBh4C,KAAM,CACFnC,SAAU6C,EACVgV,UAAW3Z,EAAM2Z,UACjBna,UACAqX,SAAU7W,EAAM6W,UAEpB6jC,gBAAiB/1C,EAAS22B,SAC1BoG,YAAaA,EACbwa,eAAevC,IAAwB35C,EAAM8W,sBAAsBoiC,GAA4B,EAC/F7hC,aAAcA,EACd/T,cAAeA,EACf3D,GAAIA,EACJ0L,SAAUA,EACVm6B,WAAYA,GACZpnC,QAASA,EACT6J,UAAWA,EACXrG,IAAK,GAAGC,KAAS2jC,KACjBxgC,UAAWnD,EACXs6C,oBAAqB92C,EAAAA,iBAAiBC,kBAAkB9F,GACxD48C,iBAAkBp8C,EAAM6Z,sCACxBwiC,gBAAiB78C,aAAO,EAAPA,EAASkvB,gBAC1B8rB,aAAcA,EACd8B,0BAA2Bf,EAC3BgB,wBAAyBd,EACzBe,iBAA8C,WAAb,QAAfzD,EAAA/4C,EAAM2Z,iBAAS,IAAAo/B,OAAA,EAAfA,EAAiBn0C,QACnCuV,gCAAiCna,EAAMma,gCACvClU,iBAAkBjG,EAAMiG,iBACxBqL,4BAA6BtR,EAAMsR,8BAG3Cge,cAAe9vB,EACT42C,EAAc,CACV1/B,wBACAiD,UAAW3Z,EAAM2Z,UACjBhV,WACAnF,UACA84C,WAAYt4C,EAAM+Y,WAClBw/B,kBAAmBv4C,EAAMiZ,aACzBE,gBAAiBnZ,EAAMmZ,gBACvBE,0BAA2BrZ,EAAMqZ,0BACjCO,iBAAkB5Z,EAAM4Z,iBACxBhD,gBAAiBlQ,EACjBsT,uBAC4C,KAAxCrV,EAASxD,aAAqCwD,EAASxD,aAAenB,EAAMga,uBAChF1C,iCAAkCtX,EAAMsX,iCACxChG,4BAA6BtR,EAAMsR,4BACnCwI,uBAAwB9Z,EAAM8Z,8BAElCjb,EACNiuB,OACIrqB,EAAAA,cAACsJ,EAAAA,OAAM1K,OAAA2K,OAAA,CAACrB,UAAU,6BAA6BoY,QAASq4B,EAAsBvwC,MAAOgO,GAAsB2I,GACtG3I,GAGT8W,cACI5nB,GAAmBvI,IAAYm8C,GAC3Bl5C,EAAAA,cAACg6C,EAAAA,uBAAsB,CACnB9xC,UAAU,iCACVgO,wBAAyBA,EACzBC,6BAA8BA,EAC9Bxa,QAASA,EACTuB,GAAIA,EACJiC,IAAK+C,EAASP,OACdiH,SAAUA,EACV4tC,eAAgBA,EAChBt0C,SAAUA,EACV+3C,gBAAc,EACdC,mBAAmB,EACnBC,kBAAkB,EAClBC,mBAAmB,EACnBC,SAAS,SACT74C,KAAM,CACFoS,YACA7W,WAEJu9C,UAAWr4C,SAGf7F,EAER6wB,mBACI3nB,GAAmB6F,GAAkBpO,EACjCiD,EAAAA,cAACu6C,EAAAA,4BAA2B,CACxBryC,UAAWC,IAAW,uCAAwC+wC,GAAwB,WAAa,IACnGthC,6BAA8BA,EAC9BC,gCAAiCA,EACjCtN,kCAAmCA,EACnCE,mCAAoCA,EACpCkN,wCAAyCA,EACzC9M,uDAAwDA,EACxDrJ,KAAM,CAAEzE,UAASuF,SAAUJ,EAAS22B,UAAY,EAAG1tB,iBAAgBC,uBACnEzP,QAASA,EACTs+C,gBAAc,EACdO,8BAA+BtB,GAC/BuB,cAAevB,GACfh8C,GAAIA,EACJ0L,SAAUA,EAEVwxC,mBAAoB78C,EAAM5B,QAAQsT,IAAI/K,OAAOw2C,iBAAkB,SAGnEt+C,EAEX,EAGQ2B,EAAoBA,CAC7BP,EACAxB,EACAuB,KAEA,MAAMK,EAAoC,GAiC1C,OA/BAJ,EAAUV,KAAI,CAACoF,EAAU9C,KACrB,IAAIrC,EAQAq5C,EAaAnyC,EAjBAlH,EAHAQ,EAAM2C,gCAGIy6C,EAAAA,EAAAA,mCAAkCz4C,EAASgL,UAAWlR,EAAUkG,EAASo2C,YAAa/6C,EAAM2Z,YAE5F0jC,EAAAA,EAAAA,uBAAsB14C,EAASgL,UAAWlR,GAGpDuB,EAAM8I,sBAAwBhK,EAAAA,gBAAgBC,YAAYiB,EAAM8I,wBAChE+vC,EAA2B74C,EAAM8I,qBAAqBM,MAAKqR,IAAsB,IAAA6iC,EAAAC,EAAAC,EAC5CC,EAAjC,OAAIz9C,EAAMmX,uBAC6C,QAA5CsmC,EAAAhjC,EAAoB0+B,gCAAwB,IAAAsE,OAAA,EAA5CA,EAA8C9tC,aAAchL,EAASgL,WAGhC,QAA5C2tC,EAAA7iC,EAAoB0+B,gCAAwB,IAAAmE,OAAA,EAA5CA,EAA8C3tC,aAAchL,EAASgL,YACjC,QAApC4tC,EAAA9iC,EAAoBqgC,wBAAgB,IAAAyC,OAAA,EAApCA,EAAsCG,kBAAsC,QAAzBF,EAAK74C,EAASo2C,mBAAW,IAAAyC,OAAA,EAApBA,EAAsBE,cAAa,UAMpE7+C,IAA/BmB,EAAM0G,sBAAsC5H,EAAAA,gBAAgBC,YAAYiB,EAAM0G,wBAC9EA,EAAuB1G,EAAM0G,qBAAqB0C,MAAKunB,GAC5CA,GAAkBA,EAAehhB,YAAchL,EAASgL,aAGvEtP,EAAWI,KAAKm4C,EAAcj0C,EAAUnF,EAASQ,EAAO6B,EAAOg3C,EAA0BnyC,GAAsB,IAG5GrG,CAAU,ECtdRN,EAAsBC,IAC/B,MAAM,SAAEvB,EAAQ,UAAEwB,EAAS,eAAEC,GAAmBF,EAChD,OAAOE,EAtB4BC,EACnCC,EACA3B,EACAuB,KAEA,MAAMK,EAAsC,GAC5C,GAAID,GAAaA,EAAUE,OAAS,EAAG,CAEnC,MAAMC,EAAmBC,EAAkBJ,EAAW3B,EAAUuB,GACvC,OAArBO,GACAF,EAAWI,KAAKF,GAGxB,OAAOF,CAAU,EAUXF,CAA+BF,EAAWxB,EAAUuB,GA7D9BU,EAC5BT,EACAxB,EACAuB,KAEA,MAAMK,EAAsC,GAC5C,IAAK5B,GAAgC,IAApBA,EAAS6B,OAEtB,OADAN,EAAM5B,QAAQuC,UAAUC,MAAM,iDACvB,KAGX,MAAMC,EAAyBC,GAAsBC,IAAQD,GAAOE,GAAQA,EAAKC,qBAE3EC,GADsBJ,EACab,EADSc,IAAQD,GAAOE,GAAQA,EAAKG,gBAAlDL,MAE5B,MAAMM,EAA6B,GAqBnC,OAlBAC,OAAOC,QAAQJ,GAAeK,SAAQC,IAAwC,IAAtCC,EAAcC,GAAoBF,EAEtEN,EAAcO,GAAgBZ,EAAsBa,GACpDN,EAAeX,KAAKI,EAAsBa,GAAqB,IAInEL,OAAOM,KAAKP,GAAgBG,SAAQK,IAChC,MAAMxB,EAAYgB,EAAeQ,GACjCP,OAAOM,KAAKvB,GAAWmB,SAAQM,IAC3B,MAAMC,EAAW1B,EAAUyB,GACrBtB,EAAmBC,EAAkBsB,EAAUrD,EAAUuB,GACtC,OAArBO,GACAF,EAAWI,KAAKF,KAEtB,IAGCF,CAAU,EA2BXK,CAAwBT,EAAWxB,EAAUuB,EAAM,ECpDtD/B,eAAe8D,EAAiBC,GACnC,MAAMC,EAAgC,CAAC,EAavC,aAXMC,EAAAA,EAAAA,qCAAoC,IAAIC,EAAAA,iCAAiCH,EAAIlC,eAAenC,aAAcqE,GAC3GI,MAAKC,IACEA,IACAJ,EAAcI,iBAAmBA,MAGxCC,OAAM1B,IACHoB,EAAIrB,UAAU4B,UAAU3B,GACjB,CAAC,KAGTqB,CACX,skBCmFA,IAAMO,EAAN,cAAmBC,IAAAA,UAaf/E,YAAmBsC,GACf0C,MAAM1C,GAPF,KAAA2C,gCAA0C,EAE1C,KAAAC,YAAsB,EAEb,KAAAC,iBAA2B,uBAuQ3B,KAAAC,mBAAsBC,IACnCjF,KAAKkF,SAAS,CACVC,qBAAsBnF,KAAKoF,MAAMD,qBACnC,EAMW,KAAAE,0BAA4B,KACzCrF,KAAKsF,sBAAsB,EA8ed,KAAAC,iBAAoBC,GAE7BA,GAAiB,CACbC,UAAW,CACPC,GAAI,CAAEC,EAAG,gBAAiBC,EAAG,EAAGC,EAAG,GACnCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCE,GAAI,CAAEJ,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,IAEzCG,UAAU,GASL,KAAAC,0BAA6BC,IAC1C,GAAIlG,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAAQ,CAC7B,MAAM/F,EAAQ,CACVgG,YAAa,CAACH,EAAiBI,OAAQC,aAE3CvG,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAChBI,gBAAgBnG,GAChBiE,MAAK,KACFtE,KAAKyG,eAAejC,OAAM1B,IACtB9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,0BAA0B,GACvD,IAELnC,OAAM1B,IACH9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,6BAA6B,MAUvD,KAAAC,6BAA+B,CAACR,EAAsCS,KAC7D,UAAlBT,EAAOU,QAAsBD,GAC7B7G,KAAKiG,0BAA0BY,IAWtB,KAAAE,uBAAyB,CAACC,EAA4BC,EAAkBC,MACrFC,EAAAA,EAAAA,IACInH,KAAK6E,+BACL7E,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OACrBpG,KAAKkC,MAAMW,UACX7C,KAAKkC,MAAMiE,KAAKxF,SAASyF,OACzBY,EACAC,GAEC3C,MAAM8C,IACH,GAAiC,aAA7BA,aAAgB,EAAhBA,EAAkBN,QAMlB,OALA9G,KAAKyG,eAAejC,OAAM1B,IACtB9C,KAAKkC,MAAMW,UAAU6D,QAAS5D,EAAgBuE,SAC9CrH,KAAKkC,MAAMW,UAAU8D,MAAM,0BAA0B,KAGlD,EAGX,IAAKY,EAAAA,iBAAiBC,kBAAkBJ,GAAmB,KAAAK,EAEvD,MAAMC,EAA0C,CAC5CpB,OAAQiB,EAAAA,iBAAiBC,kBAAkBR,EAAiBV,QAAU,IAAMU,EAAiBV,OAC7FqB,mBAAoB,CAChB,CACIC,aAAc5G,EAAAA,gBAAgBC,YAAYmG,EAAiBS,mBACrDT,EAAiBS,kBAAkB,GAAGD,aACtC,GACNE,iBAA+C,QAA/BL,EAAEL,EAAiBW,oBAAY,IAAAN,OAAA,EAA7BA,EAA+BK,oBAK7D9H,KAAKkF,SAAS,CACVoC,gBAAiB,CAAEU,uBAAwB,CAACN,MAIpD,OAAO,CAAK,IAEflD,OAAM,KACI,KAGR,GAMM,KAAAyD,0BAA4B,KACrCjI,KAAK6E,iCAELjE,EAAAA,EAAAA,6BAA4B,IAAIC,EAAAA,wBAA2Bb,KAAKkC,MAAM5B,QAAQ4H,eACzE5D,MAAKnE,SAAYH,KAAKyG,iBACtBjC,OAAO1B,IACJ9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,EAAMuE,SACnCrH,KAAKkC,MAAMW,UAAU8D,MAAM,0BAA0B,KA32BjE3G,KAAKmI,kBAAmBC,EAAAA,EAAAA,oBACpBpI,KAAKkC,MAAM5B,QAAQ+H,QAAQC,kBAC3BtI,KAAKkC,MAAMqG,aACXvI,KAAKkC,MAAMW,WAEf7C,KAAKwI,SAAUC,EAAAA,EAAAA,kBAAiB,QAASzI,KAAKmI,iBAAkB,IAChEnI,KAAKgF,mBAAqBhF,KAAKgF,mBAAmB0D,KAAK1I,MACvDA,KAAKqF,0BAA4BrF,KAAKqF,0BAA0BqD,KAAK1I,MAErEA,KAAKoF,MAAQ,CACTD,qBAAqB,EACrBhB,cAAe,CAAC,EAChBwE,aAAa,EACbC,0BAAsB7H,EACtBuG,gBAAiB,CAAC,EAE1B,CAKOnH,0BACHH,KAAK8E,YAAa,EAClB,MAAM,OACF+D,EACAvI,SAAS,cAAE4H,IACXlI,KAAKkC,MAO2B,IAAA4G,GALpC9I,KAAK6E,qCAAuC7E,KAAK+I,oCAC7C/I,KAAK6E,sCACC7E,KAAKyG,eAGXoC,EAAOI,2BACHjJ,KAAK8E,YAAyC,QAA/BgE,EAAI9I,KAAKkC,MAAMiE,KAAK1F,KAAK2F,cAAM,IAAA0C,GAA3BA,EAA6BrI,KAAKyI,WACrDlJ,KAAKkF,SAAS,CAAEf,oBAAqBF,EAAiBiE,MAG1DiB,EAAAA,EAAAA,KACI,SAAAC,EAAA,OAAiC,QAAjCA,EAAMpJ,KAAKkC,MAAMiE,KAAK1F,KAAK2F,cAAM,IAAAgD,OAAA,EAA3BA,EAA6B3I,KAAKyI,SAAS,IACjD/I,UACQH,KAAK8E,YACL9E,KAAKkF,SAAS,CAAEf,oBAAqBF,EAAiBiE,UAKtEiB,EAAAA,EAAAA,KACI,SAAAE,EAAA,OAAiC,QAAjCA,EAAMrJ,KAAKkC,MAAMiE,KAAK1F,KAAK2F,cAAM,IAAAiD,OAAA,EAA3BA,EAA6B5I,KAAKyI,SAAS,IACjD/I,UACI,GAAIH,KAAK8E,WAAY,CACjB,MAAMzE,EAAQ,IAAIV,EAAAA,qCAAqCuI,EAAclG,eAAenC,aACpFG,KAAKkF,SAAS,CAAE0D,2BAA4BxI,EAAAA,EAAAA,kCAAiCC,EAAO6H,QAIpG,CAKOoB,uBACHtJ,KAAK8E,YAAa,CACtB,CAQOyE,sBAAsBC,EAA4CC,GACrE,OAAIzJ,KAAKoF,QAAUqE,GAAazJ,KAAKkC,MAAMiE,OAASqD,EAAUrD,IAIlE,CAGOuD,SAAM,IAAAC,EAAAC,EAAAC,EAAAC,EACT,MACI3D,MACI1F,MAAQ2F,OAAQ3F,GAChBE,UAAYyF,OAAQzF,IAExBL,SACI+H,SACI2B,MAAM,gBAAEC,EAAe,UAAEC,KAEhC,UACDC,GACAnK,KAAKkC,MAEHkI,GAAmBC,EAAAA,EAAAA,IAAW,WAAYrK,KAAKkC,MAAM5B,QAAQ4H,gBAAkB,GAC/EoC,GAAoBD,EAAAA,EAAAA,IAAW,OAAQrK,KAAKkC,MAAM5B,QAAQ4H,gBAAkB,GAC5EqC,EAAcvK,KAAKwK,eAAeP,EAAiBG,EAAkBF,GAAa,IAClFO,EAAchK,GAAQA,EAAKA,KAAKyI,WAA4C,IAA/BzI,EAAKA,KAAKyI,UAAU1G,OACjEF,EAAYtC,KAAK0K,gBACjBC,EAA0D,QAArChB,EAAG3J,KAAKkC,MAAM5B,QAAQ+H,QAAQuC,eAAO,IAAAjB,OAAA,EAAlCA,EAAoCkB,sBAG5Dg1C,EAAgB7/C,KAAKkC,MAAMiE,KAAKsN,qBAAqBrN,QACpDpG,KAAKkC,MAAMiE,KAAKsN,qBAAqBrN,OAAO0qC,qBAC5C9wC,KAAKkC,MAAMiE,KAAKsN,qBAAqBrN,OAAQ0qC,oBAAoBxlC,MAAM0wC,GAA6B,cAAjBA,EAASC,MAEnG,IAAI6D,EAAYD,GAAiBA,EAAclX,OAASkX,EAAclX,MAAM4T,aAC3Dx7C,MAAb++C,IACAA,EAAY,GAGhB,MAAMh1C,ECjNR,SACFxI,EACAy9C,EACA73C,EACAvH,EACAgK,EACAuwC,GAEA,MAAM8E,EAAc,IAAI9gC,IAExB,IAAKhX,EAAclG,eAAe4R,IAAI/K,OAAOoQ,iBACzC,MAAO,CACH/N,SAAS,EACTuG,oBAAqB,IAG7B,MAAMA,EAAsB,GAC5B,IAAIvG,GAAU,EAEd,GAAIlK,EAAAA,gBAAgBC,YAAYqB,IAActB,EAAAA,gBAAgBC,YAAY8+C,GAAwB,CAE9F,IAAK,MAAM/7C,KAAY1B,EAEnB,GAAI0B,EAAS6N,YAAc7N,EAAS83C,gBAAkB93C,EAASi8C,eAC3D,GAAKD,EAAYE,IAAIl8C,EAAS6N,WAEvB,KAAAsuC,EAAAC,EACH,MAAMC,EAAmD,QAAtCF,EAAGH,EAAYnzB,IAAI7oB,EAAS6N,kBAAU,IAAAsuC,EAAAA,EAAI,EAC7DH,EAAYM,OAAOt8C,EAAS6N,WAC5BmuC,EAAYp6B,IAAI5hB,EAAS6N,UAAWwuC,GAAkC,QAArBD,EAAIp8C,EAASw5B,gBAAQ,IAAA4iB,EAAAA,EApBtD,QAesB,KAAAG,EACtCP,EAAYp6B,IAAI5hB,EAAS6N,UAA4B,QAAnB0uC,EAAEv8C,EAASw5B,gBAAQ,IAAA+iB,EAAAA,EAhBrC,GA0B5B,MAAMC,EAAyB,IAAIthC,IACnC,IAAK,MAAMvC,KAAuBojC,EAE1BpjC,EAAoB0+B,yBAAyBxpC,YAC5C2uC,EAAuBN,IAAIvjC,EAAoB0+B,yBAAyBxpC,YAEzE2uC,EAAuB56B,IAAIjJ,EAAoB0+B,yBAAyBxpC,UAAW8K,GAK3F,IAAK,MAAM8jC,KAAaC,MAAMC,KAAKX,EAAYn8C,QAAS,KAAA+8C,EAAAjB,EACpD,MAAMkB,EAAwC,QAA7BD,EAAGZ,EAAYnzB,IAAI4zB,UAAU,IAAAG,EAAAA,EAtCtB,EAuClBjkC,EAAsB6jC,EAAuB3zB,IAAI4zB,GACjD9rB,EAAmF,QAAlEgrB,EAAGhjC,aAAmB,EAAnBA,EAAqB0+B,yBAAyBE,yBAAiB,IAAAoE,EAAAA,OAAI5+C,EAGvFiD,EAAW1B,EAAUgJ,MAAKiH,GAAQA,EAAKV,YAAc4uC,IACrDK,EAAkBngD,aAAQ,EAARA,EAAU2K,MAAK5J,GAAWA,EAAQC,WAAa8+C,IACvE,IAAIM,GAAgB,EACC,IAAAC,EAAjBF,IACAC,IAA0C,QAAzBC,EAACF,EAAgBhW,gBAAQ,IAAAkW,IAAxBA,EAA0BC,mBAEhD,MAAMC,IACFl9C,UAAAA,EAAUX,cAA0C,KAA1BW,EAASX,eAAsBW,EAASX,eAAiBsH,EACvF,IAAIw2C,GAA4BJ,GAAiBG,EAEjD,GAAIhG,EAAW,CACX,MAAMa,EAAwBpnB,IACvBhY,aAAmB,EAAnBA,EAAqB0+B,yBAAyBvK,uBAC9Cn0B,aAAmB,EAAnBA,EAAqB0+B,yBAAyBvK,oBAAoBxlC,MAAM0wC,GAA6B,kBAAjBA,EAASC,OAE9FC,EAAqBH,GAAyBA,EAAsBpT,OAASoT,EAAsBpT,MAAMwT,YAE/G,IAAIC,EAAgB,GAEhBA,EADsBr7C,MAAtBm7C,EACgB,GAEAA,EAAmB31C,WAGvC,MAAM81C,EAAqB1nB,IACpBhY,aAAmB,EAAnBA,EAAqB0+B,yBAAyBvK,uBAC9Cn0B,aAAmB,EAAnBA,EAAqB0+B,yBAAyBvK,oBAAoBxlC,MAAM0wC,GAA6B,mBAAjBA,EAASC,OAC9FK,EAAwBD,GAAsBA,EAAmB1T,OAAS0T,EAAmB1T,MAAM4T,aACzG,IAAIC,EAAiB,EACQz7C,MAAzBu7C,IACAE,EAAiBF,GAGrB,IAAIG,EAAS,EACY17C,MAArB4zB,IACA8nB,EAASntB,OAAOqF,KAGE,GAAlB6nB,GAGIC,GAAUD,GAGW,IAAjBJ,KALR+E,GAA2B,GAa/BA,IAGCxkC,UAAAA,EAAqB2+B,oBAAuB3mB,GAAqBksB,EAAclsB,KAChFljB,EAAoB9O,KAAK89C,GACzBv1C,GAAU,IAItB,MAAO,CACHA,UACAuG,sBAER,CD4F8C1G,CACd,QADwCnB,EAC5DnJ,aAAI,EAAJA,EAAMA,KAAKyI,iBAAS,IAAAU,EAAAA,EAAI,GACmB,QADjBC,EAC1B7J,KAAKkC,MAAMiE,KAAK6E,qBAAqB5E,cAAM,IAAAyD,EAAAA,EAAI,GAC/C7J,KAAKkC,MAAM5B,QAAQ4H,cACnBvH,QAAAA,EAAY,GACZgK,EACAm1C,GAGJ,IAAI70C,IACCH,SAAAA,EAA+BI,UAChClL,KAAKohD,4CACHt2C,IAAkC9K,KAAKoF,MAAMuD,eAC9CrG,GAAYA,EAAU6I,MAAKtE,GAAYA,EAASoE,WAErD,MAAMG,EAAsE,QAAtCtB,EAAG9J,KAAKkC,MAAMiE,KAAKkF,aAAajF,cAAM,IAAA0D,OAAA,EAAnCA,EAAqCwB,MAC1ED,GAAsC,oEAAtBA,EAAaE,OAE3BC,EAAwBJ,aAAgC,EAAhCA,EAAkCK,UAC1DnI,EAAiB7C,SAAAA,EAAM2B,gBAAkBoJ,EAAwBxL,KAAK8L,oBAAsB,KAClG9L,KAAKwI,QAAQuD,cAAcC,MAAQC,EAAAA,kBAAkBC,SACrD,MAAMC,GAA6BC,EAAAA,EAAAA,wBAAuBpM,KAAKmI,iBAAkBnI,KAAKwI,SACtFxI,KAAKwI,QAAQuD,cAAcC,MAAQC,EAAAA,kBAAkBI,cACrD,MAAMC,GAA4BF,EAAAA,EAAAA,wBAAuBpM,KAAKmI,iBAAkBnI,KAAKwI,SACrFxI,KAAKwI,QAAQuD,cAAcC,MAAQC,EAAAA,kBAAkBM,eACrD,MAAMC,GAA2BJ,EAAAA,EAAAA,wBAAuBpM,KAAKmI,iBAAkBnI,KAAKwI,SAGpF,GAAIsC,IAAkCA,EAA8BI,QAAS,CACzE,GAAIM,GAA4C,OAAnBlI,EACzB,IAAK,MAAMmJ,KAAiBnJ,EACxBtD,KAAK0M,wCAAwCD,EAAe3B,GAIpE9K,KAAK0M,wCAAwCpK,EAAWwI,GAG5D,MAAM6B,EAASC,EAAAA,EAAA,GACR5M,KAAKkC,OAAK,IACb2K,UAAWC,IAAW,WACtBC,MAAOpI,IAAAA,cAAA,MAAIkI,UAAU,qBAAqB1C,EAAU6C,WACpDvM,KAAMT,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAC3B6G,iBAAkB,CAAEJ,UAAW,uBAC/BK,oBAAqB,CAAEL,UAAWpM,SAAAA,EAAM2B,eAAiB,8BAAgC,6BACzF+K,kBAAmB,CAAEN,UAAWpM,SAAAA,EAAM2B,eAAiB,6BAA+B,4BACtFD,UAAWG,EACXgB,iBACA8J,UAAWpN,KAAKqN,gBAChB9I,iBAAkBvE,KAAKsN,iBACvBhN,QAASN,KAAKkC,MAAM5B,QACpBiN,SAAUvN,KAAKkC,MAAMqL,SACrB1K,UAAW7C,KAAKkC,MAAMW,UACtBhB,GAAI7B,KAAKkC,MAAML,GACf2J,wBACAgC,2BAA4BrD,EAAUqD,2BACtCC,oBAAqBzM,EAAAA,gBAAgBC,YAAYR,aAAI,EAAJA,EAAMA,KAAKyI,WACxDzI,SAAAA,EAAM2B,eACFuC,IAAAA,cAAA,MAAIkI,UAAU,gCAAgC1C,EAAUuD,qBAExD/I,IAAAA,cAAA,MAAIkI,UAAU,8BAA8B1C,EAAUwD,mBAE1D,KACJC,sBAAuB5N,KAAK6N,4BAC5BC,wBAAyB9N,KAAK+N,8BAC9BC,2BAA6BvD,EAUzB,KATA9F,IAAAA,cAACsJ,EAAAA,OAAM1K,OAAA2K,OAAA,CACHC,SAAUlD,EACV4B,UAAU,yBACVuB,KAAM7D,EACNwC,MAAO5C,EAAUkE,qBACblC,GAEHhC,EAAUkE,qBAGnBC,sBACK7D,GAAgBR,IAAmBjK,KAAKkC,MAAM2G,OAAO0F,wBAUlD,KATA5J,IAAAA,cAACsJ,EAAAA,OAAM1K,OAAA2K,OAAA,CACHC,SAAUlD,EACV4B,UAAU,8BACVuB,KAAMhE,EACN2C,MAAO5C,EAAUqE,0BACblC,GAEHnC,EAAUqE,0BAGvBC,sBAAwBhE,EAAgD,KAAlCzK,KAAKkC,MAAMwM,MAAMC,eACvDC,8BAA+B,CAAE/B,UAAW,8CAC5CgC,qBACIlK,IAAAA,cAACsJ,EAAAA,OAAM1K,OAAA2K,OAAA,CACHrB,UAAU,gCACNL,EAAwB,CAC5B4B,KAAM9D,EACNyC,MAAO5C,EAAU2E,4BAEhB3E,EAAU2E,2BAGnBC,6BACI/O,KAAKgP,6BAA+BrO,EAChCgE,IAAAA,cAACsK,EAAAA,iCAAgC,CAC7BC,kCAAmClP,KAAKmP,2CAA2ChF,GACnFiF,mCAAoCpP,KAAKqP,0CAA0ClF,GACnFmF,yCAA0CtP,KAAKuP,kDAAkDpF,GACjGqF,uDAAwDxP,KAAKyP,gEACzDtF,GAEJuF,kCAAmCvF,EAAUuF,kCAC7CC,yCAA0CxF,EAAUwF,yCACpDrP,QAASN,KAAKkC,MAAM5B,QACpBuB,GAAI7B,KAAKkC,MAAML,GACf0L,SAAUvN,KAAKkC,MAAMqL,SACrBpH,KAAM,CACF2J,eAAgB9P,KAAKkC,MAAMiE,KAAK2J,eAAe1J,OAC/C9D,UAAWtC,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAAQ3F,KAAKyI,UAC7C6G,oBAAqB/P,KAAKkC,MAAMiE,KAAK4J,oBAAoB3J,UAGjE,KACR4J,qCAAsChQ,KAAKohD,0CACvCz8C,IAAAA,cAAA,QAAMkI,UAAU,uBACZlI,IAAAA,cAAA,QAAMkI,UAAU,sCAAqC,cAAa,SAClElI,IAAAA,cAAA,QAAMkI,UAAU,gCACZlI,IAAAA,cAAA,QAAMkI,UAAU,uCAAuC1C,EAAUk3C,2CAChEl3C,EAAUm3C,8CAGnB,KACJrxC,cACIjQ,KAAKkC,MAAMwM,MAAMuB,eAAiBjQ,KAAKkC,MAAMwM,MAAMuB,cAAczN,OAAS,EAAIxC,KAAKkC,MAAMwM,MAAMuB,cAAc,GAAK,KACtHC,uBAAwBlQ,KAAKiG,0BAC7BW,6BAA8B5G,KAAK4G,6BACnCuJ,iBAAkBxL,IAAAA,cAACyL,EAAAA,QAAO,CAACvD,UAAU,wCACrCwD,kBAAmD,WAAhCrQ,KAAKkC,MAAMiE,KAAK1F,KAAKqG,OAAsB9G,KAAKkC,MAAMiI,UAAUmG,wBAA0B,KAC7GC,eAAgBvQ,KAAKkC,MAAMiE,KAAK1F,KAAK2F,QAAUpG,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAAOoK,QAC3EC,mBAAoBzQ,KAAK0Q,uBAAuBpO,GAChD6F,iBAAkBnI,KAAKmI,mBAG3B,OAAOnI,KAAKkC,MAAMyO,WAAWhE,EACjC,CAuBQrH,uBACJtF,KAAKkF,SAAS,CACVC,qBAAqB,GAE7B,CAMQ6J,4BAAyB,IAAA4B,EAAAC,EAC7B,MAAMpQ,EAA2B,QAAvBmQ,EAAG5Q,KAAKkC,MAAMiE,KAAK1F,YAAI,IAAAmQ,OAAA,EAApBA,EAAsBxK,OACnC,OAAImB,EAAAA,iBAAiBC,kBAAkB/G,KAASA,EAAK2B,oBAKjD0O,EAAAA,EAAAA,IAAiB9Q,KAAKkC,MAAM5B,QAAQ4H,cAAclG,iBAClDhC,KAAKkC,MAAMiE,KAAK2J,eAAe1J,QAC/BpF,EAAAA,gBAAgBC,YAAqB,QAAV4P,EAACpQ,EAAKA,YAAI,IAAAoQ,OAAA,EAATA,EAAW3H,YACvClJ,KAAKkC,MAAMiE,KAAK4J,oBAAoB3J,OAM5C,CAMQkH,iBACJ,OACItN,KAAKkC,MAAM2G,OAAOI,yBEzZC/G,KAC3B,MAAM,GACFL,EAAE,mBACFmP,EAAkB,WAClBG,EACAhH,WAAW,kBAAEkH,EAAiB,sBAAEC,GAAuB,mBACvDJ,EAAkB,cAClBD,GACA/O,EAEJ,IAAKlB,EAAAA,gBAAgBC,YAAYkQ,GAC7B,OAGJ,MAAMowC,EAAU,GAAG1/C,UACbgL,EAAY,sBAClB,MAAO,CACHsmB,wBAAyB,CACrBtmB,UAAW,uBAEfumB,iBACIzuB,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,QAAMkI,UAAU,uBAChBlI,IAAAA,cAAA,gBAAQzC,EAAMiI,UAAUiH,yBAGhCiiB,oBACI1uB,IAAAA,cAAA,KAAGkI,UAAU,2BAA2BmY,SAAU,EAAGD,KAAK,OAAOE,QAAShU,GACrE,IACAI,EAAiB,IAAG,KAG7BiiB,gBACI3uB,IAAAA,cAACumB,EAAAA,MAAK,CAACvY,OAAQ3B,EAAoBnE,UAAW,GAAGA,IAAa60B,OAAQxwB,GAClEvM,IAAAA,cAAC68C,EAAAA,YAAW,CAAC30C,UAAW,GAAGA,oBAA6B60B,OAAQxwB,GAC5DvM,IAAAA,cAAA,MAAI9C,GAAI0/C,EAAS10C,UAAU,mCACtByE,IAGT3M,IAAAA,cAAC88C,EAAAA,UAAS,CAAC50C,UAAW,GAAGA,mBACrBlI,IAAAA,cAAA,UACKwM,EAAW1P,KAAIigD,IAAa,IAAAC,EACzB,OACIh9C,IAAAA,cAAA,MAAIkI,UAAU,iCAAiC/I,IAAK49C,EAAWp7C,QACtC,QAD4Cq7C,EAChED,EAAWE,iBAAS,IAAAD,OAAA,EAApBA,EAAsBE,UAAS,IAAG,IAClC,MAKrBl9C,IAAAA,cAACm9C,EAAAA,YAAW,CAACj1C,UAAW,GAAGA,uBAGtC,EFqWOkE,CAAe,CACXlP,GAAI7B,KAAK+E,iBACTiM,mBAAoBhR,KAAKoF,MAAMD,oBAC/B8L,cAAejR,KAAKgF,mBACpBkM,mBAAoBlR,KAAKqF,0BACzB8L,WAAYnR,KAAKoF,MAAMjB,cAAcI,iBACrC4F,UAAW,CACPiH,uBAAwBpR,KAAKkC,MAAMiI,UAAUiH,uBAC7CC,kBAAmBrR,KAAKkC,MAAMiI,UAAUkH,kBACxCC,sBAAuBtR,KAAKkC,MAAMiI,UAAUmH,sBAC5CC,8BAA+BvR,KAAKkC,MAAMiI,UAAUoH,gCAIpE,CAOQ7E,wCACJpK,EACAkP,GAEA,MAAM,UAAErH,GAAcnK,KAAKkC,MAE3B,GACIlB,EAAAA,gBAAgBC,YAAYqB,KAC3BkP,EAAkCtG,SACnClK,EAAAA,gBAAgBC,YAAYuQ,EAAkCC,qBAE9D,IAAK,MAAMC,KAAsBF,EAAkCC,oBAAqB,CACpF,MAAMzN,EAAW1B,aAAS,EAATA,EAAWgJ,MAAKqG,IAAO,IAAAC,EAAA,OAAgB,QAAZA,EAAAD,EAAQxL,YAAI,IAAAyL,OAAA,EAAZA,EAAc/K,SAASgL,aAAcH,CAAkB,IAC/F1N,IACAA,EAASlB,MAAQqH,EAAU2H,uBAC3B9N,EAASiH,UAAW,GAIpC,CAOQyF,uBAAuBpO,GAC3B,MAAMyP,EACDzP,GACGA,EACKb,KAAIoF,IAAW,IAAAmL,EAIZ,MAFmC,QAAbA,EAAAnL,EAASV,YAAI,IAAA6L,GAAS,QAATA,EAAbA,EAAetQ,eAAO,IAAAsQ,OAAA,EAAtBA,EAAwBC,iBAAkBC,EAAAA,oBAAoBC,UAE9DtL,EAAS/D,MAAO,KAAAsP,EAClC,MAAMC,EACFxL,EAASV,MAA6B,QAAzBiM,EAAIvL,EAASV,KAAKzE,eAAO,IAAA0Q,GAArBA,EAAuB7G,KAClC,GAAG1E,EAASV,KAAKzE,QAAQ6J,SAAS1E,EAAS/D,QAC3C+D,EAAS/D,MAEnB,OACI6B,IAAAA,cAAA,OAAKb,IAAKuO,EAAWxF,UAAU,mBAC1BwF,GAKb,OAAO,IAAI,IAEdC,QAAQC,KAAgCA,KACjD,GAEJ,MAAO,CACHC,QAAS,CACLC,IAAKC,EAAAA,MACL7F,UAAW,YACX8F,OAAQZ,EAAUvP,OAAS,EAC3BoQ,MAAO,SACPC,WAAW,EACX,aAAc7S,KAAKkC,MAAMiI,UAAU2I,8BAEvCC,OACIpO,IAAAA,cAAA,OAAKkI,UAAU,oBAAmB,cAAa,QAC3ClI,IAAAA,cAAA,QAAMkI,UAAU,6BAChBlI,IAAAA,cAAA,YAAO3E,KAAKkC,MAAMiI,UAAU2I,+BAGpCE,OAAQjB,EAEhB,CAEQqvC,0CACJ,IAAIW,EAAAA,EAAAA,IAAa/hD,KAAKkC,MAAM5B,QAAQ+H,SAAU,KAAA25C,EAC1C,MAAM/jC,EAAeje,KAAKkC,MAAMiE,KAAK4J,sBAA0D,QAAvCiyC,EAAIhiD,KAAKkC,MAAMiE,KAAK4J,2BAAmB,IAAAiyC,OAAA,EAAnCA,EAAqC57C,QACjG,SAAS6X,GAAkBA,EAAagkC,uBAAsD,IAA7BhkC,EAAaikC,aAGlF,OAAO,CACX,CAMQn0C,8BACJ,MACI5H,MACI1F,MAAQ2F,OAAQ3F,IACnB,UACDoC,EAAS,UACTsH,GACAnK,KAAKkC,MAET,OAAOzB,SAAAA,EAAM2B,gBACP6Q,EAAAA,EAAAA,GAAe,CACXC,gBAAiB/I,EAAUgJ,iBAC3BC,aAAcjJ,EAAUiJ,aACxB3S,KAAMA,EAAKA,KACXH,QAASN,KAAKkC,MAAM5B,QACpBiN,SAAUvN,KAAKkC,MAAMqL,SACrB1K,YACAhB,GAAI7B,KAAKkC,MAAML,UAEnBd,CACV,CAMQ8M,4BAAyB,IAAAwF,EAAAtJ,EAAAwJ,EAC7B,MACIpN,MACI1F,MAAQ2F,OAAQ3F,GAAM,4BACtB+S,GACH,UACD3Q,EAAS,UACTsH,GACAnK,KAAKkC,MAEHuR,EAAuBzT,KAAKkC,MAAM5B,SAAWN,KAAKkC,MAAM5B,QAAQ+H,SAAWrI,KAAKkC,MAAM5B,QAAQ+H,QAAQuC,QAEtGS,EAAyB,QAAbgI,EAAGrT,KAAKkC,aAAK,IAAAmR,GAAM,QAANA,EAAVA,EAAYlN,YAAI,IAAAkN,OAAA,EAAhBA,EAAkBhI,aACjCqI,EAAoCrI,SAAoB,QAARtB,EAAZsB,EAAcjF,cAAM,IAAA2D,GAA2D,QAA3DA,EAApBA,EAAsBuB,MAAKpI,GAF/B,oEAEuCA,EAAKqI,cAAuC,IAAAxB,OAAA,EAA/EA,EACpC0B,UAEAkI,GAA+G,KAAjD,QAArCJ,EAAAvT,KAAKkC,MAAM5B,QAAQ+H,QAAQuL,IAAI/K,cAAM,IAAA0K,OAAA,EAArCA,EAAuCM,4CAEtE,OAAOJ,IAAwBzS,EAAAA,gBAAgBC,YAAYR,aAAI,EAAJA,EAAMA,KAAKyI,YAAezI,SAAAA,EAAM2B,oBAqBrFrB,GApBA+S,EAAAA,EAAAA,GAAa,CACTrT,KAAMA,EAAMA,KACZsT,cAAe5J,EAAU6J,oBACzBC,cAAe9J,EAAU+J,uBACzBC,iBAAkBhK,EAAUiK,aAC5BC,SAAUlK,EAAUmK,kBACpBpB,gBAAiB/I,EAAUoK,WAC3BC,oBAAqBrK,EAAUqK,oBAC/BlU,QAASN,KAAKkC,MAAM5B,QACpBiN,SAAUvN,KAAKkC,MAAMqL,SACrB1L,GAAI7B,KAAKkC,MAAML,GACf4S,mBAAoBtK,EAAUuK,sBAC9BC,SAAUxK,EAAUyK,UACpBnB,uBACAC,oCACAF,4BAA6BA,aAA2B,EAA3BA,EAA6BpN,OAC1DvD,YACAgS,qBAAsBpU,EAAMA,KAAKqU,qBACjCC,iBAAkBpB,GAGhC,CAMQtG,gBACJ,MACIlH,MACI1F,MAAQ2F,OAAQ3F,IACnB,UACD0J,GACAnK,KAAKkC,MAET,OACIzB,GACIkE,IAAAA,cAACqQ,EAAAA,mBAAkB,CACfvU,KAAMA,EACNwU,qBAAsB9K,EAAU8K,qBAChCC,qBAAsB/K,EAAU+K,qBAChCC,yBAA0BhL,EAAUgL,yBACpCC,4BAA6BjL,EAAUiL,4BACvCC,gBAAiB,IACjB7H,2BAA4BrD,EAAUqD,2BACtC8H,gBAAiBnL,EAAUmL,gBAC3BC,0BAA2BpL,EAAUoL,0BACrCC,8BAA+BrL,EAAUqL,8BACzCC,iCAAkCtL,EAAUsL,iCAC5CC,4BAA6BvL,EAAUwL,4BACvCrV,QAASN,KAAKkC,MAAM5B,QACpBuB,GAAI7B,KAAKkC,MAAML,GACf0L,SAAUvN,KAAKkC,MAAMqL,SACrBpH,KAAM,CAAC,EACPgC,iBAAkBnI,KAAKmI,kBAIvC,CAOQgH,2CAA2ChF,GAC/C,MAAO,CACHyL,yBAA0BzL,EAAUyL,yBAEpCC,wBAAyB1L,EAAU0L,wBACnCC,4BAA6B3L,EAAU2L,4BAEvCC,gCAAiC5L,EAAU4L,gCAC3CC,iCAAkC7L,EAAU6L,iCAC5CC,sCAAuC9L,EAAU8L,sCAEjDC,oBAAqB/L,EAAU+L,oBAC/BC,wBAAyBhM,EAAUgM,wBACnCC,cAAejM,EAAUiM,cAEjC,CAOQC,iDAAiDlM,GACrD,MAAO,CACHmM,4BAA6BnM,EAAUmM,4BACvCC,2BAA4BpM,EAAUoM,2BACtCC,0CAA2CrM,EAAUqM,0CACrDC,6CAA8CtM,EAAUsM,6CACxDC,0CAA2CvM,EAAUuM,0CACrDC,cAAexM,EAAUwM,cACzBC,kBAAmBzM,EAAUyM,kBAC7BC,iBAAkB1M,EAAU0M,iBAEpC,CAOQtH,kDAAkDpF,GACtD,MAAO,CACHmM,4BAA6BnM,EAAUmM,4BACvCC,2BAA4BpM,EAAUoM,2BACtCO,4CAA6C3M,EAAU2M,4CACvDC,+CAAgD5M,EAAU4M,+CAC1DC,4CAA6C7M,EAAU6M,4CACvDC,+CAAgD9M,EAAU8M,+CAC1DC,2CAA4C/M,EAAU+M,2CACtDC,qDAAsDhN,EAAUgN,qDAExE,CAOQ1H,gEACJtF,GAEA,MAAO,CACHiN,yBAA0BjN,EAAUiN,yBACpCC,8BAA+BlN,EAAUkN,8BACzCC,yBAA0BnN,EAAUmN,yBACpCC,+BAAgCpN,EAAUoN,+BAElD,CAOQlI,0CAA0ClF,GAC9C,MAAO,CACHqN,yBAA0BrN,EAAUsN,0BACpCC,wBAAyBvN,EAAUwN,mBACnCC,2BAA4BzN,EAAUyN,2BACtCC,yBAA0B1N,EAAU2N,+BAEpCC,yBAA0B5N,EAAU4N,yBAEpCC,yBAA0B7N,EAAU8N,8BACpCC,+BAAgC/N,EAAUgO,yCAElD,CAMQzN,gBAAa,IAAA0N,EAAAE,EACjB,MACInS,MACI1F,MAAQ2F,OAAQ3F,GAChB8X,WAAanS,OAAQmS,GACrBzI,gBAAkB1J,OAAQ0J,GAC1BC,qBAAuB3J,OAAQ2J,IAEnCzP,SACI+H,SAAWuC,SAAS,uBAAE4N,GAA2B,CAAEA,4BAAwBzX,KAC9E,OACD8H,EAAM,UACNhG,EAAS,UACTsH,EAAS,QACTsO,GACAzY,KAAKkC,MAEHsD,EAAgBxF,KAAKuF,iBAAiBsD,EAAOrD,eAE7C4F,EAAsE,QAAtCgN,EAAGpY,KAAKkC,MAAMiE,KAAKkF,aAAajF,cAAM,IAAAgS,OAAA,EAAnCA,EAAqC9M,MAC1ED,GAAsC,oEAAtBA,EAAaE,OAE3BC,EAAwBJ,aAAgC,EAAhCA,EAAkCK,UAE1DnE,EAAqDtH,KAAKoF,MAAMkC,gBACtE,IAAIoR,EAA0B,GAC1BD,GAAWlV,OAAOM,KAAK4U,GAASjW,OAAS,GAAKiW,EAAQxI,eAAiBwI,EAAQxI,cAAczN,OAAS,IACtGkW,EAAkBD,EAAQxI,cAAc,GAAGpO,IAG/C,MAAMg+C,EAAgB7/C,KAAKkC,MAAMiE,KAAKsN,qBAAqBrN,QACxDpG,KAAKkC,MAAMiE,KAAKsN,qBAAqBrN,OAAO0qC,qBAC5C9wC,KAAKkC,MAAMiE,KAAKsN,qBAAqBrN,OAAQ0qC,oBAAoBxlC,MAAM0wC,GAA6B,cAAjBA,EAASC,MAE/F,IAAI6D,EAAYD,GAAiBA,EAAclX,OAASkX,EAAclX,MAAM4T,aAK5E,OAJiBx7C,MAAb++C,IACAA,EAAY,GAGT9+C,EAAAA,gBAAgBC,YAAYR,aAAI,EAAJA,EAAMA,KAAKyI,WHpPxBhH,KAC1B,MAAM,SAAEvB,EAAQ,UAAEwB,GAAcD,EAChC,OAAOQ,EAAkBP,EAAWxB,EAAUuB,EAAM,EGmP1CyW,CAAc,CACVxW,UAAW1B,EAAMA,KAAKyI,UACtB0P,sBAAuBF,EACvBpR,kBACA3G,SAAUX,KAAKkC,MAAMiE,KAAKxF,SAASyF,OACnC4E,qBAAsBhL,KAAKkC,MAAMiE,KAAK6E,qBAAqB5E,OAC3DyS,uBAAwB7Y,KAAKkC,MAAMiE,KAAK2S,gBAAgB1S,OACxD2S,SAAkC,QAA1BT,EAAEtY,KAAKkC,MAAMiE,KAAK4S,gBAAQ,IAAAT,OAAA,EAAxBA,EAA0BlS,OACpCZ,gBACAwT,oBAAqBhZ,KAAKkC,MAAM5B,QAAQsT,IAAI/K,OAAOoQ,mBAAoB,EACvEC,qBAAqBC,EAAAA,EAAAA,kCAAiCnZ,KAAKkC,MAAM5B,QAAQsT,IAAI/K,OAAOuQ,4BACpFC,sBAA8E,aAAvDrZ,KAAKkC,MAAM5B,QAAQsT,IAAI/K,OAAOyQ,qBACrDC,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzCjZ,QAASN,KAAKkC,MAAM5B,QACpBiN,SAAUvN,KAAKkC,MAAMqL,SACrB1L,GAAI7B,KAAKkC,MAAML,GACf2X,iCAAkChO,EAClCrB,UAAW,CACPsP,WAAY,QACZE,YAAaxP,EAAUyP,0BACvBC,aAAc1P,EAAU2P,kCACxBC,YAAa5P,EAAU6P,0BACvBC,aAAc9P,EAAU+P,2BACxBC,sBAAuBhQ,EAAUiQ,oBACjCC,uBAAwBlQ,EAAUkQ,uBAClCC,yBAA0BnQ,EAAUmQ,yBACpCC,yBAA0BpQ,EAAUoQ,yBACpCC,mBAAoBrQ,EAAUqQ,mBAC9B5D,kBAAmBzM,EAAUyM,kBAC7BC,iBAAkB1M,EAAU0M,iBAC5B4D,oBAAqBtQ,EAAUuQ,gBAC/BC,0BAA2BxQ,EAAUwQ,0BACrCC,qBAAoBhO,EAAA,GACbzC,IAGXtH,YACAgY,wBAAyB1Q,EAAU0Q,wBACnCC,6BAA8B3Q,EAAU2Q,6BACxCC,iBAAkB5Q,EAAU6Q,qBAC5BC,WAAY9Q,EAAU+Q,uBACtBC,aAAchR,EAAUiR,oBACxBC,gBAAiBlR,EAAUmR,uBAC3BC,0BAA2Bvb,KAAKkC,MAAMiE,KAAKoV,0BAA0BnV,OACrEoV,eAAgBrR,EAAU2H,uBAC1B2J,kBAAmBtR,EAAUuR,8BAC7BC,qBAAsBxR,EAAUyR,6BAChCC,UAAW7b,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAChC0V,iBAAkB9b,KAAKkC,MAAMiE,KAAK2V,iBAAiB1V,OACnD8J,uBAAwBlQ,KAAKiG,0BAC7BW,6BAA8B5G,KAAK4G,6BACnCmV,sCAAuC/b,KAAK+G,uBAC5CiV,uBAAwBhc,KAAKiI,0BAC7BsQ,YACA0D,oBAAqB9R,EAAU8R,oBAC/BC,uBAAwB1D,EACxB2D,cAAetT,EAAOuT,qBACtBC,gCAAiCxT,EAAOwT,gCACxClU,iBAAkBnI,KAAKmI,iBACvBtD,+BAAgC7E,KAAK6E,+BAErCqK,kCAAmClP,KAAKmP,2CAA2ChF,GACnFiF,mCAAoCpP,KAAKqP,0CAA0ClF,GACnFmS,wCAAyCtc,KAAKqW,iDAAiDlM,GAC/FqF,uDAAwDxP,KAAKyP,gEACzDtF,GAGJoS,6BAA8BpS,EAAUoS,6BACxCC,gCAAiCrS,EAAUqS,gCAC3CC,0BAA2BtS,EAAUsS,0BACrCC,4BAA6BvS,EAAUuS,4BACvC5M,iBACAC,sBACA4M,oBAAqB3c,KAAKkC,MAAMiE,KAAK6E,qBACrCkwC,UAAW4E,IAEf,IACV,CASQt1C,eAAeP,EAA0BG,EAA0BF,GACvE,GAAID,EACA,OAAOG,EAGX,MAAMwS,GAAgBC,EAAAA,EAAAA,UAASzS,GAC/B,IAAI0S,EAAY1S,EAKhB,OAJI2S,EAAAA,GAASC,YAAcJ,IACvBE,EAAY,GAAGG,OAAOC,SAASC,SAAS/S,KAGrC,GAAGF,IAAaA,EAAUkT,SAAS,KAAa,IAAN,SAAeN,GACpE,CAgIQ3c,qBACJ,MACIgG,MAAM,KAAE1F,GAAM,UACdoC,EAAS,QACTvC,GACAN,KAAKkC,MAEH2F,QAAyEyV,EAAAA,EAAAA,IAE3E7c,EACAoC,EACAvC,GACA,GAGEu/C,EAAgB7/C,KAAKkC,MAAMiE,KAAKsN,qBAAqBrN,QACxDpG,KAAKkC,MAAMiE,KAAKsN,qBAAqBrN,OAAO0qC,qBAC5C9wC,KAAKkC,MAAMiE,KAAKsN,qBAAqBrN,OAAQ0qC,oBAAoBxlC,MAAM0wC,GAA6B,cAAjBA,EAASC,MAE/F,IAAI6D,EAAYD,GAAiBA,EAAclX,OAASkX,EAAclX,MAAM4T,aAQ5E,GAPiBx7C,MAAb++C,IACAA,EAAY,GAEZA,GACA9/C,KAAKkF,SAAS,CAAEyD,aAAa,IAG7Bd,EAAmB,CACnB,MAAMqD,GAAWlK,EAAAA,gBAAgBC,YAAY4G,EAAkBG,wBAC/DhI,KAAKkF,SAAS,CACVoC,gBAAiBO,EACjBc,YAAauC,SAGjBlL,KAAKkF,SAAS,CAAEyD,aAAa,IAGjC,OAAO0U,EAAAA,YAAYlc,SACvB,CAMQhB,0CAAuC,IAAA0d,EAC3C,MAAMC,EAA4D,QAArBD,EAAG7d,KAAKkC,MAAM5B,eAAO,IAAAud,GAAS,QAATA,EAAlBA,EAAoBxV,eAAO,IAAAwV,GAAK,QAALA,EAA3BA,EAA6BjK,WAAG,IAAAiK,GAAU,QAAVA,EAAhCA,EAAkCE,gBAAQ,IAAAF,OAAA,EAA1CA,EAA4CG,iCAC5F,GAAgD,SAA5CF,EACA,OAAO,EAGX,IAAI,IAAAL,EACA,MAAMD,QAAwBxd,KAAKkC,MAAMiE,KAAKkF,aAK9C,MADK,QAFDoS,EAAAD,EAAgBlS,MACZD,GAAsC,oEAAtBA,EAAaE,cAChC,IAAAkS,OAAA,EAFDA,EAEGhS,aAAa,GAEhB,OAAO,EAEb,MAAO3I,GAGL,OAFA9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,iCACpB,EAGX,GAAgD,QAA5CmX,EACA,OAAO,EAEX,IACI,MAAMG,QAAqBje,KAAKkC,MAAMiE,KAAK4J,oBAC3C,QACMkO,IAC4C,QAA5CH,GAAqDG,EAAaC,OACnB,QAA5CJ,IAAsDG,EAAaC,OAE9E,MAAOpb,GAGL,OAFA9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,gCACpB,EAEf,CAMQmF,oBAAiB,IAAAuM,EAAAkG,EAAAC,EAAAC,EAAAC,EACrB,MACIvY,MACI1F,MAAQ2F,OAAQ3F,GAChB8X,WAAanS,OAAQmS,GACrBzI,gBAAkB1J,OAAQ0J,GAC1BC,qBAAuB3J,OAAQ2J,IAEnCzP,SACI+H,SAAWuC,SAAS,uBAAE4N,GAA2B,CAAEA,4BAAwBzX,KAC9E,OACD8H,EAAM,UACNhG,EAAS,UACTsH,EAAS,QACTsO,GACAzY,KAAKkC,MAEHsD,EAAgBxF,KAAKuF,iBAAiBsD,EAAOrD,eAC7C8B,EAAqDtH,KAAKoF,MAAMkC,gBACtE,IAAIoR,EAA0B,GAC1BD,GAAWlV,OAAOM,KAAK4U,GAASjW,OAAS,GAAKiW,EAAQxI,eAAiBwI,EAAQxI,cAAczN,OAAS,IACtGkW,EAAkBD,EAAQxI,cAAc,GAAGpO,IAG/C,MAAMuJ,EAAsE,QAAtCiN,EAAGrY,KAAKkC,MAAMiE,KAAKkF,aAAajF,cAAM,IAAAiS,OAAA,EAAnCA,EAAqC/M,MAC1ED,GAAsC,oEAAtBA,EAAaE,OAE3BC,EAAwBJ,aAAgC,EAAhCA,EAAkCK,UAEhE,OAAOzL,KAAKkC,MAAMiE,KAAKxF,WAClBF,SAAAA,EAAM2B,gBAAkBpC,KAAKkC,MAAMiE,KAAKxF,SAASyF,SAClD3F,GACAA,EAAKA,KAAKyI,WACVzI,EAAKA,KAAKyI,UAAU1G,OAAS,GACc,QADb+b,EAC9Bve,KAAKkC,MAAMiE,KAAKqN,mCAA2B,IAAA+K,GAA3CA,EAA6CnY,OAC3CnE,EAAmB,CACfE,UAAW1B,EAAKA,KAAKyI,UACrB0P,sBAAuBF,EACvBpR,kBACA3G,SAAUX,KAAKkC,MAAMiE,KAAKxF,SAASyF,OACnC4E,qBAAsBhL,KAAKkC,MAAMiE,KAAK6E,qBAAqB5E,OAC3DyS,uBAAwB7Y,KAAKkC,MAAMiE,KAAK2S,gBAAgB1S,OACxD2S,SAAkC,QAA1ByF,EAAExe,KAAKkC,MAAMiE,KAAK4S,gBAAQ,IAAAyF,OAAA,EAAxBA,EAA0BpY,OACpCZ,gBACAwT,oBAAqBhZ,KAAKkC,MAAM5B,QAAQsT,IAAI/K,OAAOoQ,mBAAoB,EACvE7W,gBAAgB3B,aAAI,EAAJA,EAAM2B,kBAAkB,EACxC8W,qBAAqBC,EAAAA,EAAAA,kCAAiCnZ,KAAKkC,MAAM5B,QAAQsT,IAAI/K,OAAOuQ,4BACpFG,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzCjZ,QAASN,KAAKkC,MAAM5B,QACpBkZ,iCAAkChO,EAClC+B,SAAUvN,KAAKkC,MAAMqL,SACrB1L,GAAI7B,KAAKkC,MAAML,GACfsI,UAAW,CACPsP,WAAYtP,EAAUuP,yBACtBC,YAAaxP,EAAUyP,0BACvBC,aAAc1P,EAAU2P,kCACxBC,YAAa5P,EAAU6P,0BACvBC,aAAc9P,EAAU+P,2BACxBC,sBAAuBhQ,EAAUiQ,oBACjCC,uBAAwBlQ,EAAUkQ,uBAClCC,yBAA0BnQ,EAAUmQ,yBACpCC,yBAA0BpQ,EAAUoQ,yBACpCC,mBAAoBrQ,EAAUqQ,mBAC9B5D,kBAAmBzM,EAAUyM,kBAC7BC,iBAAkB1M,EAAU0M,iBAC5B4D,oBAAqBtQ,EAAUuQ,gBAC/BC,0BAA2BxQ,EAAUwQ,0BACrCC,qBAAoBhO,EAAA,GACbzC,IAGXtH,YACAgY,wBAAyB1Q,EAAU0Q,wBACnCC,6BAA8B3Q,EAAU2Q,6BACxCC,iBAAkB5Q,EAAU6Q,qBAC5BC,WAAY9Q,EAAU+Q,uBACtBC,aAAchR,EAAUiR,oBACxBC,gBAAiBlR,EAAUmR,uBAC3BC,0BAA2Bvb,KAAKkC,MAAMiE,KAAKoV,0BAA0BnV,OACrEoV,eAAgBrR,EAAU2H,uBAC1B2J,kBAAmBtR,EAAUuR,8BAC7BC,qBAAsBxR,EAAUyR,6BAChCC,UAAW7b,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAChC0V,iBAAkB9b,KAAKkC,MAAMiE,KAAK2V,iBAAiB1V,OACnD8J,uBAAwBlQ,KAAKiG,0BAC7BW,6BAA8B5G,KAAK4G,6BACnCmV,sCAAuC/b,KAAK+G,uBAC5CiV,uBAAwBhc,KAAKiI,0BAC7BsQ,YACA0D,oBAAqB9R,EAAU8R,oBAC/BC,uBAAwB1D,EACxB2D,cAAetT,EAAOuT,qBACtBC,gCAAiCxT,EAAOwT,gCACxClU,iBAAkBnI,KAAKmI,iBACvBtD,+BAAgC7E,KAAK6E,+BAErCqK,kCAAmClP,KAAKmP,2CAA2ChF,GACnFiF,mCAAoCpP,KAAKqP,0CAA0ClF,GACnFmS,wCAAyCtc,KAAKqW,iDAAiDlM,GAC/FqF,uDAAwDxP,KAAKyP,gEACzDtF,GAGJoS,6BAA8BpS,EAAUoS,6BACxCC,gCAAiCrS,EAAUqS,gCAC3CC,0BAA2BtS,EAAUsS,0BACrCC,4BAA6BvS,EAAUuS,4BACvC5M,iBACAC,sBACAyD,4BAAwE,QAA7CiL,EAAEze,KAAKkC,MAAMiE,KAAKqN,mCAA2B,IAAAiL,OAAA,EAA3CA,EAA6CrY,OAC1EiT,sBAA8E,aAAvDrZ,KAAKkC,MAAM5B,QAAQsT,IAAI/K,OAAOyQ,qBACrDqD,oBAAqB3c,KAAKkC,MAAMiE,KAAK6E,qBACrCpC,qBAAsB5I,KAAKoF,MAAMwD,uBAA8D,QAA1C8V,EAAI1e,KAAKkC,MAAMiE,KAAKwY,8BAAsB,IAAAD,OAAA,EAAtCA,EAAwCtY,UAErG,IACV,GA5kCE1B,GAAIka,EAAAA,EAAAA,IAAA,CADTC,EAAAA,IACKna,GA+kCN,+LGjsCOvE,eAAespB,EAAsBg3B,EAAmBlgD,EAAmB2H,EAA+B1C,GAC7G,MAAM28C,EAAc,IAAIC,EAAAA,sCACpB3B,EACAlgD,GAGJ,OAAO8hD,EAAAA,EAAAA,qCAAoCF,EAAaj6C,GACnD5D,MAAKod,GACEA,EACOxgB,QAAQwrB,IAAIhL,EAAejgB,KAAKmgB,GAAkB0gC,EAA0B1gC,EAAepc,MAC7FlB,MAAKi+C,GACKA,EAAMjwC,QAAOkwC,GAAQA,EAAK,KAAI/gD,KAAI+gD,GAAQA,EAAK,OAI3D,KACRh+C,OAAM1B,IACLoF,EAAcrF,UAAU4B,UAAU3B,GAClCoF,EAAcrF,UAAU8D,MAAM,sDACvB,KAEnB,CAaAxG,eAAemiD,EAA0B1gC,EAA8Bpc,GAA6B,IAAAi9C,EAChG,MAAMC,EAAY,CACd5gC,IAAKF,EAAcG,KAAO,GAC1BC,QAASJ,EAAcO,SAAW,IAGhCwgC,GAA4C,QAAxBF,EAACj9C,EAAcC,iBAAS,IAAAg9C,OAAA,EAAvBA,EAAyB18C,GAAIJ,GAAI0xB,QAAQ,SAAU,IAE9E,GAAsB,KAAlBqrB,EAAU5gC,IACV,MAAO,CAAC4gC,GAAW,GAGvB,MAAME,EAAiB,GAAGF,EAAU5gC,OAAiB6gC,IAErD,OAAO,IAAIzhD,SAAgCC,IACvC,IACI,MAAM0hD,EAAO,IAAIC,eACjBD,EAAKE,KAAK,OAAQH,GAAgB,GAElCC,EAAKG,OAAS,KACV7hD,EAAQ,CAACuhD,EAA2B,MAAhBG,EAAK/7C,QAAkC,MAAhB+7C,EAAK/7C,QAAgB,EAGpE+7C,EAAKI,QAAU,KACX9hD,EAAQ,CAACuhD,GAAW,GAAO,EAG/BG,EAAKK,OACP,MAAOC,GACLhiD,EAAQ,CAACuhD,GAAW,OAGhC,skBCHA,MAAM5jC,UAAqBna,EAAAA,UAsBvB/E,YAAYsC,GACR0C,MAAM1C,GAtBF,KAAA+c,kBAAiD,IAAIC,IAC5C,KAAAG,4BAA8C,CAC3D5Z,UAAW,CACPC,GAAI,CAAEC,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCyZ,GAAI,CAAE3Z,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCE,GAAI,CAAEJ,EAAG,YAAaC,EAAG,EAAGC,EAAG,IAEnCG,UAAU,EACVuZ,iBAAiB,GAGJ,KAAAC,8BAAgD,CAC7D/Z,UAAW,CACPC,GAAI,CAAEC,EAAG,YAAaC,EAAG,IAAKC,EAAG,GACjCE,GAAI,CAAEJ,EAAG,YAAaC,EAAG,IAAKC,EAAG,IAErCG,UAAU,EACVuZ,iBAAiB,GA0Jb,KAAAE,UAAY,KAChBzf,KAAKkF,SAAS,CAAEwa,WAAW,GAAO,EAG9B,KAAAC,SAAW,KACf3f,KAAKkF,SAAS,CAAEwa,WAAW,GAAQ,EAG/B,KAAAE,KAAO,KACX,QAA0B7e,IAAtBf,KAAK8f,aACL,OAGJ,MAAMC,EAAY/f,KAAK8f,aAAe,EAAI9f,KAAKoF,MAAM4a,YAAc,EACnEhgB,KAAKigB,UAAUF,EAAU,EAGrB,KAAAI,SAAW,KACf,MAAMJ,EAAY/f,KAAKsgB,cACjBtgB,KAAKoF,MAAMib,kBACPrgB,KAAKoF,MAAMib,kBAAkB7d,OAAS,EACtC,EACJxC,KAAKoF,MAAM4a,YAAc,EAC/BhgB,KAAKigB,UAAUF,EAAU,EAGrB,KAAAE,UAAalc,IACjB/D,KAAKkF,SAAS,CAAE8a,YAAajc,GAAQ,EAejC,KAAAmgB,iBAAmB,CAACC,EAAmB3e,EAA+BzB,IAC1EY,EAAAA,cAAC2f,EAAAA,GAAK/gB,OAAA2K,OAAA,CACFrB,UAAU,0BACNsX,EAAK,CACT5K,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzC/T,cAAeA,EACfif,oBAAoB,UACpBM,KAAK,WACLljB,GAAI,GAAG7B,KAAKkC,MAAML,sBAAsBkC,OAIxC,KAAA6gB,kBAAoB,CAACT,EAAmB3e,EAA+BzB,EAAe8gB,KAMnF,CACHC,4BAA6B,CACzBrS,IAAK,KACL5F,UARQC,IACZ,mCACA+X,IAAwB9gB,EAAQ,0CAA4C,IAOxEghB,KAAM,MACNC,SAAU,EACVlhB,IAAKC,EACL,aAAcogB,EAAMnC,QACpB,gBAAiB6C,IAAwB9gB,EACzC,gBAAiB,GAAG/D,KAAKkC,MAAML,sBAAsBkC,IACrDkhB,QAASjlB,KAAKklB,0BAA0BnhB,GACxCohB,UAAWnlB,KAAKolB,4BAA4BrhB,IAEhDshB,QACI1gB,EAAAA,cAAC2f,EAAAA,GAAK/gB,OAAA2K,OAAA,CACFrB,UAAU,+BACNsX,EAAK,CACT5K,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzC/T,cAAeA,EACfif,oBAAoB,eAM5B,KAAAW,4BAA+BrhB,GAC3BkB,IACAA,EAAM4gB,QAAUC,EAAAA,SAASC,OAAS9gB,EAAM4gB,QAAUC,EAAAA,SAASE,QAC3D/gB,EAAMghB,iBAENjmB,KAAKigB,UAAUlc,KAKnB,KAAAmhB,0BAA6BnhB,GACzBkB,IACJA,EAAMghB,iBAENjmB,KAAKigB,UAAUlc,EAAM,EAuHrB,KAAAuc,YAAc,IAAiC,IAA3BtgB,KAAKoF,MAAM4a,YAE/B,KAAAF,WAAa,IAAM9f,KAAKoF,MAAMib,mBAAqBrgB,KAAKoF,MAAM4a,cAAgBhgB,KAAKoF,MAAMib,kBAAkB7d,OAAS,EAEpH,KAAA4jB,gBAAkB,KACtBpmB,KAAKqmB,cAAc,EAuBf,KAAAC,iBAAkBC,IACtB,MACIpgB,MACIzE,SAAW0E,OAAQ1E,IACtB,UACDyI,EAAS,OACTtB,GACA7I,KAAKkC,MACT,IAAIme,EAAoBrgB,KAAKoF,MAAMib,mBAE9BA,GAAqB3e,IACtB2e,EAAoB,CAACrgB,KAAKwmB,uBAAuB9kB,KAGrD,MAAM4mB,EAAuBzf,EAAOyf,qBACjCA,IACCA,EAAqB/I,iBAAkB,GAG3C,MAAMkH,EAAgB,CAClBhU,IAAKiU,EAAAA,SACL7Z,UAAW,6BACX7J,MACIqd,GACAA,EAAkB5e,KAAI,CAACyB,EAAkBa,IAAkB/D,KAAK2mB,6BAA6BJ,EAAUrjB,EAAMolB,GAAwBtoB,KAAKqf,4BAA6Btb,KAC3Kic,YAAahgB,KAAKoF,MAAM4a,YACxBJ,KAAM5f,KAAK4f,KACXO,SAAUngB,KAAKmgB,SACf0G,UAAU,EACVC,kBAAmB3c,EAAU4c,8BAC7BC,kBAAmB7c,EAAU8c,0BAC7BC,yBAA0BlnB,KAAKigB,UAC/BkH,uBAAuB,EACvBC,eAAe,EACfE,eAAgBtnB,KAAK2f,SACrB4H,gBAAiBvnB,KAAKyf,WAGpBiI,EAAW/iB,EAAAA,cAAC+hB,EAAAA,SAAQnjB,OAAA2K,OAAA,GAAMuY,IAE1BkB,EAAwC,CAC1CC,YAAY5nB,KAAKoF,MAAMwiB,YACvBC,SAAS7nB,KAAKqmB,aACdyB,gBAAiBJ,GAErB,OAAOM,EAAAA,EAAAA,eAAcL,EAA4C,EAxbjE3nB,KAAKqmB,aAAermB,KAAKqmB,aAAa3d,KAAK1I,MAC3CA,KAAKoF,MAAQ,CAAE4a,YAAa,EAAGN,WAAW,EAAOW,uBAAmBtf,EAAWonB,eAAe,EAAOP,aAAY,GAEjH5nB,KAAKuoB,iBAAmBvoB,KAAKuoB,iBAAiB7f,KAAK1I,MACnDA,KAAKwoB,wBAA0BxoB,KAAKwoB,wBAAwB9f,KAAK1I,MACjEA,KAAKyoB,oBAAsBzoB,KAAKyoB,oBAAoB/f,KAAK1I,MACzDA,KAAK0oB,2BAA6B1oB,KAAK0oB,2BAA2BhgB,KAAK1I,MACvEA,KAAK2oB,yBAA2B3oB,KAAK2oB,yBAAyBjgB,KAAK1I,KACvE,CAEOG,0BACH,MAAMqhB,EAASxhB,KAAKkC,MAAM2G,OAAO4Y,aAAeA,EAAAA,YAAY2hC,YACtD52B,EAAexsB,KAAKkC,MAAM2G,OAAOuX,QAAU,GA6BjD,GA3BIoB,IAAWC,EAAAA,YAAY2hC,cACvBj6C,EAAAA,EAAAA,KACI,IAAOnJ,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,OAASpG,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,OAAOzE,SAAW,OAClFxB,UACI,GAAIH,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,OAAQ,CAChC,MAAMga,QAAeqJ,EACjBzpB,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,OAAOzE,UAC9B3B,KAAKkC,MAAM5B,QAAQ+H,QAAQxI,YAAYU,UACxCP,KAAKkC,MAAM5B,QAAQ4H,cACnBlI,KAAKkC,MAAM2G,OAAOygB,wBAA0BtpB,KAAKwf,+BAErDxf,KAAKkF,SAAS,CACVmb,kBAAmB,IAAID,KAAWoM,GAClCxM,YAAa,EACboM,WAAYW,KAAKC,aAGrBhtB,KAAKkF,SAAS,CACVmb,kBAAmB,IAAImM,GACvBxM,YAAa,EACboM,WAAYW,KAAKC,WAOjCxL,IAAWC,EAAAA,YAAYg/B,WAAazgD,KAAKkC,MAAMiE,KAAKub,eAAetb,OAAQ,CAC3E,MAAMga,QD1GXjgB,eAAqCuhB,EAAiCxZ,EAA+B1C,GACxG,OAAOtE,QAAQwrB,IAAIhL,EAAejgB,KAAKmgB,GAAkB0gC,EAA0B1gC,EAAepc,MAC7FlB,MAAKi+C,GACKA,EAAMjwC,QAAOkwC,GAAQA,EAAK,KAAI/gD,KAAI+gD,GAAQA,EAAK,OACvDh+C,OAAM1B,IACLoF,EAAcrF,UAAU4B,UAAU3B,GAClCoF,EAAcrF,UAAU8D,MAAM,qCACvB,KAEnB,CCiGiC0iB,CACjBrpB,KAAKkC,MAAMiE,KAAKub,eAAetb,OAC/BpG,KAAKkC,MAAM5B,QAAQ4H,cACnBlI,KAAKkC,MAAM2G,OAAOygB,wBAA0BtpB,KAAKwf,+BAErDxf,KAAKkF,SAAS,CACVmb,kBAAmB,IAAID,KAAWoM,GAClCxM,YAAa,EACboM,WAAYW,KAAKC,aAElB,GAAIxL,IAAWC,EAAAA,YAAY2hC,aAAepjD,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,OAAQ,CAC7E,MAAMga,QAAeqJ,EACjBzpB,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,OAAOzE,UAC9B3B,KAAKkC,MAAM5B,QAAQ+H,QAAQxI,YAAYU,UACxCP,KAAKkC,MAAM5B,QAAQ4H,cACnBlI,KAAKkC,MAAM2G,OAAOygB,wBAA0BtpB,KAAKwf,+BAGrDxf,KAAKkF,SAAS,CACVmb,kBAAmB,IAAID,KAAWoM,GAClCxM,YAAa,EACboM,WAAYW,KAAKC,aAGrBhtB,KAAKkF,SAAS,CACVmb,kBAAmB,IAAImM,GACvBxM,YAAa,EACboM,WAAYW,KAAKC,OAG7B,CAEOtjB,SACH,MAAM,GACF7H,EAAE,OACFgH,EAAM,UACNsB,GACAnK,KAAKkC,MAEHme,EAAoBrgB,KAAKoF,MAAMib,mBAC/B,UAAExT,EAAS,sBAAEsa,GAA0Bte,EACvCyf,EAAuBzf,EAAOyf,qBACjCA,IACCA,EAAqB/I,iBAAkB,GAE3C,MAAM+J,EAAyBzgB,EAAOygB,uBACnCA,IACCA,EAAuB/J,iBAAkB,GAG7C,MAAM2K,EAAsBrhB,EAAOshB,wBAA0BA,EAAAA,sBAAsB0B,SAC7Ew3B,EAA0Bx6C,EAAOwhB,kBAAmB,EACpDC,EACFzhB,EAAO0hB,YAAcA,EAAAA,UAAU+4B,OACzB/4B,EAAAA,UAAU+4B,OACVz6C,EAAO0hB,YAAcA,EAAAA,UAAUgsB,UAC/BhsB,EAAAA,UAAUgsB,UACV,GACJhqB,EAAW82B,EAAkB,aAAc/4B,EAE3C3d,EAASC,EAAAA,EAAA,GACP5M,KAAKkC,OAAyD,IAClEkD,MAAOpF,KAAKoF,MACZ0Z,aAAc,CACVmM,YAAajrB,KAAKkC,MAClB2K,UAAWC,IAAW,qBAAoBod,EAAa,WAAa,IAAMrd,IAE9Eqe,MAAOm4B,EAAkBrjD,KAAKsmB,iBAAiBgE,GAAe,KAC9DgB,cAAe,CACX7Y,IAAKiU,EAAAA,SACL7Z,UAAW,6BACX7J,MACIqd,GACAA,EAAkB5e,KAAI,CAACyB,EAAkBa,IAAkB/D,KAAK2mB,6BAA6B4F,EAAUrpB,EAAMolB,GAAwBtoB,KAAKqf,4BAA6Btb,KAC3Kic,YAAahgB,KAAKoF,MAAM4a,YACxBJ,KAAM5f,KAAK4f,KACXO,SAAUngB,KAAKmgB,SACf0G,UAAU,EACVC,kBAAmB3c,EAAU4c,8BAC7BC,kBAAmB7c,EAAU8c,0BAC7BC,yBAA0BlnB,KAAKigB,UAC/BkH,uBAAiD,IAA1BA,EACvBG,eAAgBtnB,KAAK2f,SACrB4H,gBAAiBvnB,KAAKyf,UACtB3b,IAAK9D,KAAKoF,MAAMgnB,YAEpBX,WAAY,CACRC,yBAA0B,CAAE7e,UAAW,0CACvC8e,kCAAmC,CAC/BlZ,IAAKmZ,EAAAA,oBACL/e,UAAW,+BACXgf,SAAU3B,EACV4B,iBAAkB3hB,EAAU4c,8BAC5BgF,iBAAkB5hB,EAAU8c,0BAC5B+E,SAAUnqB,EACVoqB,YAAY,EACZnoB,IAAK9D,KAAKoF,MAAMgnB,YAEpBppB,MACIqd,GACAA,EAAkB5e,KAAI,CAACyB,EAAkBa,IAAkB/D,KAAK4kB,kBAAkB1hB,EAAMomB,GAA0BtpB,KAAKwf,8BAA+Bzb,EAAO/D,KAAKoF,MAAM4a,kBAIpL,OAAOhgB,KAAKkC,MAAMyO,WAAWhE,EACjC,CAgCQga,6BAA6B4F,EAAkBpI,EAAmB3e,EAA+BzB,GACrG,MAAiB,cAAbwoB,EACOvsB,KAAKktB,8BAA8B/I,EAAO3e,EAAezB,GAC5C,WAAbwoB,EACAvsB,KAAKotB,yBAAyBjJ,EAAO3e,EAAezB,GACvC,eAAbwoB,EACAvsB,KAAKmtB,6BAA6BhJ,EAAO3e,EAAezB,GAExDY,EAAAA,cAACA,EAAAA,SAAc,KAAE3E,KAAKkkB,iBAAiBC,EAAO3e,EAAezB,GAE5E,CA+DQqpB,yBAAyBjJ,EAAmB3e,EAA8BzB,GAC9E,OAEIY,EAAAA,cAAA,OAAKkI,UAAW,mBAAkB7M,KAAKoF,MAAM+iB,cAAgB,SAAW,IAAMtE,IAAK8B,GAAU3lB,KAAKif,kBAAkB2G,IAAI7hB,EAAO4hB,GAAQ,aAAc3lB,KAAKkC,MAAM2G,OAAOolB,WACnKtpB,EAAAA,cAAC2f,EAAAA,GAAK/gB,OAAA2K,OAAA,CACFrB,UAAU,0BACNsX,EAAK,CACT5K,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzC/T,cAAeA,EACfif,oBAAoB,UACpBM,KAAK,WACLE,QAASjlB,KAAKyoB,oBACd0F,YAAanuB,KAAKoF,MAAM+iB,eAAiBnoB,KAAKwoB,8BAA2BznB,EACzEc,GAAI,GAAG7B,KAAKkC,MAAML,sBAAsBkC,OAE5CY,EAAAA,cAAC2f,EAAAA,GAAK/gB,OAAA2K,OAAA,CACF6W,KAAK,eACLlY,UAAU,6BACNsX,EAAK,CACTc,QAASjlB,KAAKuoB,iBACdhP,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzC/T,cAAeA,EACfif,oBAAoB,UACpB5iB,GAAI,GAAG7B,KAAKkC,MAAML,aAAakC,IAC/BqqB,YAAapuB,KAAKoF,MAAM+iB,eAAiBkG,EAAAA,iCAA8BttB,KAIvF,CAEQynB,wBAAwBvjB,IAC5BspB,EAAAA,EAAAA,wBAAuBtpB,EAAOjF,KAAKkC,MAAM2G,OAAOolB,UACpD,CAEQxF,oBAAoBxjB,GACpBgY,OAAOiT,YAAc,OAIzBqzB,EAAAA,EAAAA,gBAAet+C,EAAOjF,KAAKkC,MAAM2G,OAAOolB,WACxCjuB,KAAKkF,SAAS,CACVijB,eAAe,IAEvB,CAEQI,iBAAiBtjB,IACrBmrB,EAAAA,EAAAA,2BAA0BnrB,GAC1BjF,KAAKkF,SAAS,CACVijB,eAAe,GAGvB,CAEQO,2BAA2BzjB,GAC3BgY,OAAOiT,YAAc,OAIzBG,EAAAA,EAAAA,qBAAoBprB,GAEpBjF,KAAKkF,SAAS,CACVijB,eAAe,IAEvB,CAEQQ,yBAAyB1jB,IAC7BqrB,EAAAA,EAAAA,yBAAwBrrB,GAExBjF,KAAKkF,SAAS,CACVijB,eAAe,GAEvB,CAEQ+E,8BAA8B/I,EAAmB3e,EAA8BzB,GACnF,OACIY,EAAAA,cAAA,OAAKkI,UAAU,+BACXlI,EAAAA,cAAA,OAAKkI,UAAU,8BAA8BkY,KAAK,eAAeyL,WAAYxwB,KAAK2oB,yBAA0B1D,QAASjlB,KAAK2oB,yBAA0ByF,YAAapuB,KAAKoF,MAAM+iB,eAAiBsI,EAAAA,+BAA4B1vB,IACzN4D,EAAAA,cAAC2f,EAAAA,GAAK/gB,OAAA2K,OAAA,CACFrB,UAAU,0BACNsX,EAAK,CACT5K,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzC0L,QAASjlB,KAAK0oB,2BACdljB,cAAeA,EACfif,oBAAoB,UACpB0J,YAAanuB,KAAKoF,MAAM+iB,eAAiBuI,EAAAA,gCAA6B3vB,EACtEc,GAAI,GAAG7B,KAAKkC,MAAML,sBAAsBkC,OAIxD,CAEQopB,6BAA6BhJ,EAAmB3e,EAA8BzB,GAClF,OACIY,EAAAA,cAAA,OAAKkI,UAAU,yBACXlI,EAAAA,cAAC2f,EAAAA,GAAK/gB,OAAA2K,OAAA,CACFrB,UAAU,0BACNsX,EAAK,CACT5K,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzC/T,cAAeA,EACfif,oBAAoB,UACpBM,KAAK,cAETpgB,EAAAA,cAAA,OAAKkI,UAAU,kCACXlI,EAAAA,cAAA,KAAGyJ,KAAK,sBAAsBrB,MAAO/M,KAAKkC,MAAMiI,UAAUgc,oBAAqBpB,KAAK,SAASE,QAASjlB,KAAKomB,gBAAiBvZ,UAAU,kDAItJ,CAEQ2Z,uBAAuB9kB,GAC3B,MAAO,CACHogB,IAAKpgB,EAAQkvB,iBAAmB,GAExC,CAUQvK,eACJ,GAAIrmB,KAAKoF,MAAMwiB,YAAa,CACxB,MAAMmJ,EAAY/wB,KAAKif,kBAAkB4N,IAAI7sB,KAAKoF,MAAM4a,aACxD,GAAI+Q,GAAaA,EAAUC,UAAYD,EAAUC,SAASxuB,QAAU,EAAG,CACnE,MAAM2hB,EAAQ4M,EAAUC,SAAS,GAAGC,cAAc,OAC9C9M,GACAA,EAAM+M,gBAAgB,SAG9BlxB,KAAKkF,SAAS,CACVijB,eAAe,IAGvBnoB,KAAKkF,SAAS,CACVijB,eAAe,EACfP,aAAc5nB,KAAKoF,MAAMwiB,eAE7B/H,EAAAA,EAAAA,wBACJ,EAmDJ,yEC/gBkB4B,EAKA8I,EAKAJ,EAKAlC,EChBNpH,yHA+BN,SAAUoB,EACZ3hB,EACA4hB,EACAshC,EACAC,GAAqB,IAAAC,EAErB,OAAKpjD,SAAY,QAALojD,EAAPpjD,EAASsT,WAAG,IAAA8vC,GAAQ,QAARA,EAAZA,EAAc76C,cAAM,IAAA66C,GAApBA,EAAsBriC,kBAGvBa,EACOuhC,EAHAD,CAMf,CC7BArjD,eAAewjD,EAA2B/hC,GACtC,MAAM8gC,EAAwB,CAC1B5gC,IAAKF,EAAcG,KAAO,GAC1BC,QAASJ,EAAcO,SAAW,IAMtC,OAJIP,EAAcS,+BACdqgC,EAAUtgC,qBAAuB,CAAEE,6BAA8B,SAG/C,KAAlBogC,EAAU5gC,IACH,CAAC4gC,GAAW,GAGhB,IAAIxhD,SAA+BC,IACtC,IACI,MAAM0hD,EAAO,IAAIC,eACjBD,EAAKE,KAAK,OAAQL,EAAU5gC,KAAM,GAElC+gC,EAAKtY,iBAAiB,QAAQ,KAC1BppC,EAAQ,CAACuhD,EAA2B,MAAhBG,EAAK/7C,QAAkC,MAAhB+7C,EAAK/7C,QAAgB,IAGpE+7C,EAAKtY,iBAAiB,SAAS,KAC3BppC,EAAQ,CAACuhD,GAAW,GAAO,IAG/BG,EAAKK,OACP,MAAAU,GACEziD,EAAQ,CAACuhD,GAAW,OAGhC,CAEOviD,eAAespB,EAClBg3B,EACAlgD,EACA2H,EACA1C,EACAurC,GAEA,MAAMlhC,GAAYjE,EAAAA,EAAAA,IAAa1D,EAAclG,gBACvCmgD,EAAc,IAAIC,EAAAA,sCAAsC3B,EAAWlgD,EAAWwwC,EAAiBlhC,GAErG,OAAOwyC,EAAAA,EAAAA,qCAAoCF,EAAaj6C,GACnD5D,MAAKod,GACEA,EACOxgB,QAAQwrB,IAAIhL,EAAejgB,KAAImgB,GAAiB+hC,EAA2B/hC,MAAiBtd,MAAKi+C,GAC7FA,EAAMjwC,QAAOkwC,GAAQA,EAAK,KAAI/gD,KAAI+gD,GAAQA,EAAK,OAIvD,KAEVh+C,OAAM1B,IACHoF,EAAcrF,UAAU4B,UAAU3B,GAClCoF,EAAcrF,UAAU8D,MAAM,sDACvB,KAEnB,CA6EOxG,eAAekpB,EAClB3H,EACAxZ,EACA1C,GAEA,OAAOtE,QAAQwrB,IAAIhL,EAAejgB,KAAImgB,GAAiB+hC,EAA2B/hC,MAC7Etd,MAAKi+C,GACKA,EAAMjwC,QAAOkwC,GAAQA,EAAK,KAAI/gD,KAAI+gD,GAAQA,EAAK,OAEzDh+C,OAAM1B,IACHoF,EAAcrF,UAAU4B,UAAU3B,GAClCoF,EAAcrF,UAAU8D,MAAM,qCACvB,KAEnB,ukBFnKA,SAAkB8a,GACdA,EAAA,0BACAA,EAAA,qBACH,CAHD,CAAkBA,IAAAA,EAAW,KAK7B,SAAkB8I,GACdA,EAAA,gBACAA,EAAA,qBACH,CAHD,CAAkBA,IAAAA,EAAS,KAK3B,SAAkBJ,GACdA,EAAA,oBACAA,EAAA,uBACH,CAHD,CAAkBA,IAAAA,EAAqB,KAKvC,SAAkBlC,GACdA,EAAA,kBACAA,EAAA,SACH,CAHD,CAAkBA,IAAAA,EAAa,KChB/B,SAAYpH,GAIRA,EAAAA,EAAA,eAIAA,EAAAA,EAAA,iBAIAA,EAAAA,EAAA,iBAIAA,EAAAA,EAAA,cACH,CAjBD,CAAYA,IAAAA,EAAS,KE2FrB,MAAM/B,UAAqBna,EAAAA,UAgCvB/E,YAAmBsC,GAAsD,IAAA6c,EAAArb,EAAAsb,EACrEpa,MAAM1C,GAAM6c,EAAA/e,KAhCC,KAAAif,kBAAiD,IAAIC,IAErD,KAAAC,2BAAqFxa,EAAAA,YACrF,KAAAya,OAAkCza,EAAAA,YAE3C,KAAAujB,mBAAmC,GAI1B,KAAA7I,4BAA8C,CAC3D5Z,UAAW,CACPC,GAAI,CAAEC,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCyZ,GAAI,CAAE3Z,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCE,GAAI,CAAEJ,EAAG,YAAaC,EAAG,EAAGC,EAAG,IAEnCG,UAAU,EACVuZ,iBAAiB,GAGJ,KAAAC,8BAAgD,CAC7D/Z,UAAW,CACPC,GAAI,CAAEC,EAAG,YAAaC,EAAG,IAAKC,EAAG,GACjCE,GAAI,CAAEJ,EAAG,YAAaC,EAAG,IAAKC,EAAG,IAErCG,UAAU,EACVuZ,iBAAiB,GA+NJ,KAAAE,UAAY,KACzBzf,KAAKkF,SAAS,CAAEwa,WAAW,GAAO,EAGrB,KAAAC,SAAW,KACxB3f,KAAKkF,SAAS,CAAEwa,WAAW,GAAQ,EAMtB,KAAAE,KAAO,KAEpB,IADAC,EAAAA,EAAAA,8BAC0B9e,IAAtBf,KAAK8f,aACL,OAGJ,MAAMC,EAAY/f,KAAK8f,aAAe,EAAI9f,KAAKoF,MAAM4a,YAAc,EACnEhgB,KAAKigB,UAAUF,GAEf/f,KAAKkgB,qBAAqB,EAMb,KAAAC,SAAW,MACxBN,EAAAA,EAAAA,yBACA,MAAMO,EAASpgB,KAAKoF,MAAMib,kBACpBN,EAAY/f,KAAKsgB,cAAiBF,EAASA,EAAO5d,OAAS,EAAI,EAAKxC,KAAKoF,MAAM4a,YAAc,EACnGhgB,KAAKigB,UAAUF,GACf/f,KAAKkgB,qBAAqB,EAGb,KAAAD,UAAalc,IAC1B,MAAM,SAAEwc,GAAavgB,KAAKkC,MAAM2G,OAC1B2X,EAAexgB,KAAKoF,MAAM4a,YAC1BS,EAAazgB,KAAKoF,MAAMib,kBACF,IAAAK,EACwCC,EADpE,GAAIJ,GAAYE,EACZ,IAA0B,QAAtBC,EAAAD,EAAW,GAAG1c,YAAQ,IAAA2c,OAAA,EAAtBA,EAAwBE,kBAAmBC,EAAAA,UAAUC,MAClC,QAAnBH,EAAA3gB,KAAKof,OAAO2B,eAAO,IAAAJ,GAAnBA,EAAqBK,YAClB,GAAIP,EAAW,GAAGD,KAAgBI,iBAAmBC,EAAAA,UAAUC,MAAO,KAAAG,EACtD,QAAnBA,EAAAjhB,KAAKof,OAAO2B,eAAO,IAAAE,GAAnBA,EAAqBC,QAG7BlhB,KAAKkF,SAAS,CAAE8a,YAAajc,GAAQ,EA+LxB,KAAA0e,yBAA2B,CAACC,EAAuB3e,EAAeyB,KAC/E,MAAMmd,EAAYD,EAAUC,UAC5B,GAAIA,EAAW,KAAAC,EACX,MAAMC,EAA0B7iB,KAAKkC,MAAM2G,OACrCia,EAAkB9iB,KAAKkC,MAAMiI,UAC7B4Y,EAAgC,CAAC,EACvCA,EAAcC,QAAUL,EAAU9gB,GAClCkhB,EAAchW,MAAQ4V,EAAU5V,MAChCgW,EAAcE,SAAWN,EAAUO,SAC/BP,EAAUQ,YACVJ,EAAcK,eAAiBT,EAAUQ,UAAUrB,KAEnC,QAApBc,EAAID,EAAUU,cAAM,IAAAT,GAAhBA,EAAkBU,mBAClBP,EAAcQ,sBAAwBZ,EAAUU,OAAOC,kBAE3D,MAAME,EAA+B,CAAEX,UAASY,SAAUV,GACpDW,EAAa,CACf7hB,GAAI,GAAG7B,KAAKkC,MAAML,sBAAsBkC,KAE5C,OACIY,EAAAA,cAACmc,EAAAA,GAAK,CAACjU,UAAU,2BAA2B8W,UAAW,CAAE7f,IAAK6e,EAAW3gB,eAAgBhC,KAAKkC,MAAM5B,QAAQ+H,UACxG1D,EAAAA,cAACif,EAAAA,OAAMrgB,OAAA2K,OAAA,CACH2V,IAAK7jB,KAAKof,OACV0E,WAAYN,EACZO,SAAU/jB,KAAKkC,MAAM5B,QAAQ+H,QAAQ2b,OAAOD,SAC5CjB,gBAAiBA,GACbY,KAKpB,OAAO1jB,KAAKikB,kBAAkBze,EAAc,EAG/B,KAAA0e,iBAAmB,SAChCC,EACA3e,EACAzB,GAAa,IACbqgB,EAAAC,UAAA7hB,OAAA,QAAAzB,IAAAsjB,UAAA,IAAAA,UAAA,GAA0B,OAE1B1f,EAAAA,cAAC2f,EAAAA,GAAK/gB,OAAA2K,OAAA,CACFlM,eAAgB+c,EAAK7c,MAAM5B,QAAQ4H,cAAclG,eACjD6K,UAAU,0BACNsX,EAAK,CACTI,YAAuB,IAAVxgB,EAAcgb,EAAKyF,cAAgBL,EAAMrC,IACtDvI,aAAcwF,EAAK7c,MAAM5B,QAAQ+H,QAAQkR,aACzC/T,cAAeA,EACfif,oBAAoB,OACpB5iB,GAAI,GAAGkd,EAAK7c,MAAML,sBAAsBkC,IACxC2gB,sBAAuBN,EACvBO,oBAA+B,IAAV5gB,IACvB,EAGW,KAAA6gB,kBAAoB,CACjCT,EACA3e,EACAzB,EACA8gB,KAOO,CACHC,4BAA6B,CACzBrS,IAAK,KACL5F,UARQC,IACZ,mCACA+X,IAAwB9gB,EAAQ,0CAA4C,IAOxEghB,KAAM,MACNC,SAAU,EACVlhB,IAAKC,EACL,aAAcogB,EAAMnC,QACpB,gBAAiB6C,IAAwB9gB,EACzCkhB,QAASjlB,KAAKklB,0BAA0BnhB,GACxCohB,UAAWnlB,KAAKolB,4BAA4BrhB,IAEhDshB,QACI1gB,EAAAA,cAAC2f,EAAAA,GAAK/gB,OAAA2K,OAAA,CACFlM,eAAgBhC,KAAKkC,MAAM5B,QAAQ4H,cAAclG,eACjD6K,UAAU,+BACNsX,EAAK,CACTI,YAAuB,IAAVxgB,EAAc/D,KAAKwkB,cAAgBL,EAAMrC,IACtDvI,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzC/T,cAAeA,EACfif,oBAAoB,OACpBa,sBAAuBtlB,KAAKoF,MAAMmgB,wBAClCZ,oBAA+B,IAAV5gB,OAWpB,KAAAyhB,sBAAwB,CACrC9C,EACAld,EACAzB,EACA8gB,KAEA,MAAMY,EAAU3Y,IACZ,mCACA+X,IAAwB9gB,EAAQ,0CAA4C,IAG1E4e,EAAYD,EAAUC,UAC5B,IAAIwB,EASJ,OAPIA,EADAxB,SAAAA,EAAWQ,UACHR,EAAUQ,UAEV,CACJrB,IAAK,SAIN,CACHgD,4BAA6B,CACzBrS,IAAK,KACL5F,UAAW4Y,EACXV,KAAM,MACNC,SAAU,EACVlhB,IAAKC,EACL,aAAcogB,EAAMnC,QACpB,gBAAiB6C,IAAwB9gB,EACzCkhB,QAASjlB,KAAKklB,0BAA0BnhB,GACxCohB,UAAWnlB,KAAKolB,4BAA4BrhB,IAEhDshB,QACI1gB,EAAAA,cAAC2f,EAAAA,GAAK/gB,OAAA2K,OAAA,CACFlM,eAAgBhC,KAAKkC,MAAM5B,QAAQ4H,cAAclG,eACjD6K,UAAU,+BACNsX,EAAK,CACTI,YAAaJ,EAAMrC,IACnBvI,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzC/T,cAAeA,EACfif,oBAAoB,OACpBa,sBAAuBtlB,KAAKoF,MAAMmgB,wBAClCZ,oBAA+B,IAAV5gB,KAGhC,EAQY,KAAA2hB,YAAe3hB,GAAmB4hB,IAC/C3lB,KAAKif,kBAAkB2G,IAAI7hB,EAAO4hB,EAAO,EAG5B,KAAAP,4BAA+BrhB,GACpCkB,IACAA,EAAM4gB,QAAUC,EAAAA,SAASC,OAAS9gB,EAAM4gB,QAAUC,EAAAA,SAASE,QAC3D/gB,EAAMghB,iBAENjmB,KAAKigB,UAAUlc,KAKV,KAAAmhB,0BAA6BnhB,GAClCkB,IACJA,EAAMghB,iBAENjmB,KAAKigB,UAAUlc,EAAM,EA0LZ,KAAAmiB,sBAAwB,CAACxD,EAAuB3e,EAAeyB,KAC5E,MAAMmd,EAAYD,EAAUC,UAC5B,IAAIwB,EASJ,OAPIA,EADAxB,SAAAA,EAAWQ,UACHR,EAAUQ,UAEV,CACJrB,IAAK,SAKTnd,EAAAA,cAAA,OAAKkI,UAAU,yBACXlI,EAAAA,cAAC2f,EAAAA,GAAK/gB,OAAA2K,OAAA,CACFlM,eAAgBhC,KAAKkC,MAAM5B,QAAQ4H,cAAclG,eACjD6K,UAAU,gCACNsX,EAAK,CACTI,YAAaJ,EAAMrC,IACnBvI,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzC/T,cAAeA,EACfif,oBAAoB,OACpBa,sBAAuBtlB,KAAKoF,MAAMmgB,wBAClCZ,oBAA+B,IAAV5gB,KAEzBY,EAAAA,cAAA,OAAKkI,UAAU,wCAEXlI,EAAAA,cAAA,UACIoI,MAAO/M,KAAKkC,MAAMiI,UAAUgc,oBAC5BpB,KAAK,SACLlB,IAAK7jB,KAAKmf,2BACV8F,QAASjlB,KAAKomB,gBACdvZ,UAAU,4CAGhB,EA2DG,KAAAyT,YAAc,IAAiC,IAA3BtgB,KAAKoF,MAAM4a,YAE/B,KAAAF,WAAa,KAC1B,MAAMM,EAASpgB,KAAKoF,MAAMib,kBAC1B,OAAOD,GAAUpgB,KAAKoF,MAAM4a,cAAgBI,EAAO5d,OAAS,CAAC,EAGhD,KAAA4jB,gBAAkB,KAC/BpmB,KAAKqmB,cAAc,EAyBN,KAAAC,iBAAoBC,IACjC,MACIpgB,MACIzE,SAAW0E,OAAQ1E,IACtB,UACDyI,GACAnK,KAAKkC,MACT,IAAIme,EAAoBrgB,KAAKoF,MAAMib,mBAE9BA,GAAqB3e,IACtB2e,EAAoB,CAACrgB,KAAKwmB,uBAAuB9kB,KAErD,MAAM+kB,EAAgB,CAClBhU,IAAKiU,EAAAA,SACL7Z,UAAW,6BACX7J,MACIqd,GACAA,EAAkB5e,KAAI,CAACyB,EAAkBa,IACrC/D,KAAK2mB,6BAA6BJ,EAAUrjB,EAAMlD,KAAK4mB,qBAAsB7iB,GAAO,KAE5Fic,YAAahgB,KAAKoF,MAAM4a,YACxBJ,KAAM5f,KAAK4f,KACXO,SAAUngB,KAAKmgB,SACf0G,UAAU,EACVC,kBAAmB3c,EAAU4c,8BAC7BC,kBAAmB7c,EAAU8c,0BAC7BC,yBAA0BlnB,KAAKigB,UAC/BkH,uBAAuB,EACvBC,eAAe,EACfC,UAAU,EACVC,eAAgBtnB,KAAK2f,SACrB4H,gBAAiBvnB,KAAKyf,UACtB+H,wBAAyBxnB,KAAKoF,MAAMqiB,qBAElCC,EAAW/iB,EAAAA,cAAC+hB,EAAAA,SAAQnjB,OAAA2K,OAAA,GAAKuY,IAEzBkB,EAAyC,CAC3CC,YAAa5nB,KAAKoF,MAAMwiB,YACxBC,SAAU7nB,KAAKqmB,aACfyB,gBAAiBJ,EACjBK,WAAYjb,IAAW,0BAA2B,6BAEtD,OAAOkb,EAAAA,EAAAA,eAAcL,EAA4C,EAG7D,KAAAzF,oBAAsB,IACc,YAApCliB,KAAKkC,MAAM2G,OAAOof,cAp9BtBjoB,KAAKqmB,aAAermB,KAAKqmB,aAAa3d,KAAK1I,MAC3CA,KAAKoF,MAAQ,CACT4a,YAAa,EACbN,WAAW,EACXyI,eAAe,EACfP,aAAa,EACbQ,eAAe,EACf7C,0BAA2BvlB,KAAKkC,MAAM2G,OAAOuY,qBAGjDphB,KAAK4mB,qBACoE,QADhDljB,EACW,QADXsb,EACrB9c,EAAM2G,OAAOwf,2BAAmB,IAAArJ,EAAAA,EAAI9c,EAAM2G,OAAOyf,4BAAoB,IAAA5kB,EAAAA,EAAI1D,KAAKqf,4BAElFrf,KAAKuoB,iBAAmBvoB,KAAKuoB,iBAAiB7f,KAAK1I,MACnDA,KAAKwoB,wBAA0BxoB,KAAKwoB,wBAAwB9f,KAAK1I,MACjEA,KAAKyoB,oBAAsBzoB,KAAKyoB,oBAAoB/f,KAAK1I,MACzDA,KAAK0oB,2BAA6B1oB,KAAK0oB,2BAA2BhgB,KAAK1I,MACvEA,KAAK2oB,yBAA2B3oB,KAAK2oB,yBAAyBjgB,KAAK1I,KACvE,CAEO4oB,WAEH,MAAgB,QADHA,EAAAA,EAAAA,UAAS,CAAEC,QAASC,EAAAA,YAAYC,SAAUzoB,QAASN,KAAKkC,MAAM5B,QAAQ+H,SAEvF,CAEOlI,0BAAuB,IAAAmhB,EAAA3X,EAC1B,MAAM6X,EAAsC,QAAhCF,EAAGthB,KAAKkC,MAAM2G,OAAO4Y,mBAAW,IAAAH,EAAAA,EAAIG,EAAY2hC,YACtDl6B,EAA0ClpB,KAAKkC,MAAM2G,OAAOqgB,wCAElE,GADAlpB,KAAKmpB,kBAC8B,QAA/Bxf,EAAC3J,KAAKkC,MAAM5B,QAAQ+H,QAAQuL,WAAG,IAAAjK,GAAQ,QAARA,EAA9BA,EAAgCd,cAAM,IAAAc,IAAtCA,EAAwC0X,mBACrCG,IAAWC,EAAY2hC,YACvB,QAAqCriD,IAAjCf,KAAKoF,MAAMib,mBAAmCrgB,KAAKkC,MAAMiE,KAAKwb,iCAAiCvb,OAAQ,KAAAgjB,EACvG,MAAMhJ,QAAeiJ,EACjBrpB,KAAKkC,MAAMiE,KAAKwb,iCAAiCvb,OACjDpG,KAAKkC,MAAM5B,QAAQ4H,cACqB,QADRkhB,EAChCppB,KAAKkC,MAAM2G,OAAOygB,8BAAsB,IAAAF,GAAIppB,KAAKwf,qCAE/Cxf,KAAKupB,WAAWnJ,QACnB,QAAqCrf,IAAjCf,KAAKoF,MAAMib,mBAAmCrgB,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,OAAQ,KAAAojB,EACrF,MAAM9nB,EAAU1B,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,OAClCga,QAAeqJ,EACjB/nB,EAAQC,UACP3B,KAAKkC,MAAM5B,QAAQ+H,QAAQxI,YAAYU,UACxCP,KAAKkC,MAAM5B,QAAQ4H,cACqB,QADRshB,EAChCxpB,KAAKkC,MAAM2G,OAAOygB,8BAAsB,IAAAE,GAAIxpB,KAAKwf,8BACjD9d,EAAQgoB,sBAGN1pB,KAAKupB,WAAWnJ,cAEhBpgB,KAAKupB,WAAW,IAgDlC,IA3CApgB,EAAAA,EAAAA,KACI,KAAK,IAAAwgB,EACD,MAAMjoB,EAAU1B,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,OACxC,OAAK1E,EAIAwnB,GAAkE,QAAvBS,EAACjoB,EAAQgoB,sBAAc,IAAAC,GAAtBA,EAAwBhoB,SAIlE,GAAGD,EAAQC,YAAYD,EAAQgoB,eAAe/nB,WAH1C,GAAGD,EAAQC,WAJX,IAOoD,IAEnExB,UACI,MAAMuB,EAAU1B,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,OACxC,IAAIga,EAAuB,GAC3B,GAAI1e,EAAS,KAAAkoB,EAUFC,EATP,GAA0B,QAA1BD,EAAI5pB,KAAKkC,MAAM5B,QAAQsT,WAAG,IAAAgW,GAAQ,QAARA,EAAtBA,EAAwB/gB,cAAM,IAAA+gB,GAA9BA,EAAgCvI,iBAChCjB,QDhHjBjgB,eACHsgD,EACAv+B,EACA3hB,EACA2H,EACAs7C,EACAzS,GAA+B,IAAA8S,EAE/B,MAAMh0C,GAAYjE,EAAAA,EAAAA,IAAa1D,EAAclG,gBAC7C,GAAgC,QAAhC6hD,EAAI37C,EAAclG,sBAAc,IAAA6hD,GAAQ,QAARA,EAA5BA,EAA8B7/B,cAAM,IAAA6/B,GAApCA,EAAsCC,UAAW,CACjD,MAAMhjD,QAAiBijD,EAAAA,EAAAA,IAAmB77C,EAAclG,eAAgB,iCAAkC,OAAQ,CAC9Gy+C,UAAWA,EACXlgD,UAAWA,EACXsP,UAAWA,IAEf,GAAwB,MAApB/O,EAASgG,OAET,OADAoB,EAAcrF,UAAU8D,MAAM,2EACvB,GAEX,MAAMq9C,EAAmBljD,aAAQ,EAARA,EAAUqF,KACnC,OAAI69C,EACOA,EAAiBviD,KAAImgB,IAAgB,IAAAC,EACxC,MAAO,CACHC,IAAsB,QAAnBD,EAAED,EAAcG,WAAG,IAAAF,EAAAA,EAAI,GAC1BG,QAASC,EAAW/Z,EAAclG,eAAgBkgB,EAAqBshC,EAAa5hC,EAAcO,SAClG8hC,aAAcriC,EAAcsiC,aAC5BtjC,eAAgBgB,EAAcuiC,eAC9B/hC,qBAAsBR,EAAcS,6BAC9B,CACIC,6BAA8B,aAElCvhB,EACT,IAGF,GAEX,MAAMohD,EAAc,IAAIC,EAAAA,sCAAsC3B,EAAWlgD,EAAWwwC,EAAiBlhC,GACrG,OAAOwyC,EAAAA,EAAAA,qCAAoCF,EAAaj6C,GACnD5D,MAAKod,GACEA,EACOA,EAAejgB,KAAImgB,IAAgB,IAAAwiC,EACtC,MAAO,CACHtiC,IAAsB,QAAnBsiC,EAAExiC,EAAcG,WAAG,IAAAqiC,EAAAA,EAAI,GAC1BpiC,QAASC,EAAW/Z,EAAclG,eAAgBkgB,EAAqBshC,EAAa5hC,EAAcO,SAClG8hC,aAAcriC,EAAcsiC,aAC5BtjC,eAAgBgB,EAAcuiC,eAC9B/hC,qBAAsBR,EAAcS,6BAC9B,CACIC,6BAA8B,aAElCvhB,EACT,IAGF,KAEVyD,OAAM1B,IACHoF,EAAcrF,UAAU4B,UAAU3B,GAClCoF,EAAcrF,UAAU8D,MAAM,sDACvB,KAEnB,CCkDuCmjB,CACXpoB,EAAQC,SACR3B,KAAKkiB,uBACJliB,KAAKkC,MAAM5B,QAAQ+H,QAAQxI,YAAYU,UACxCP,KAAKkC,MAAM5B,QAAQ4H,cACnBxG,EAAQ6J,KACR2d,EAA0CxnB,EAAQgoB,oBAAiB3oB,QAGvEqf,QAAeqJ,EACX/nB,EAAQC,UACP3B,KAAKkC,MAAM5B,QAAQ+H,QAAQxI,YAAYU,UACxCP,KAAKkC,MAAM5B,QAAQ4H,cACqB,QADR2hB,EAChC7pB,KAAKkC,MAAM2G,OAAOygB,8BAAsB,IAAAO,GAAI7pB,KAAKwf,8BACjD0J,EAA0CxnB,EAAQgoB,oBAAiB3oB,SAGrEf,KAAKupB,WAAWnJ,cAEhBpgB,KAAKupB,WAAW,MAG9B,CAAEQ,iBAAiB,IAGnBvI,IAAWC,EAAYg/B,WAAazgD,KAAKkC,MAAMiE,KAAKub,eAAetb,OAAQ,KAAA4jB,EAC3E,MAAM5J,QAAeiJ,EACjBrpB,KAAKkC,MAAMiE,KAAKub,eAAetb,OAC/BpG,KAAKkC,MAAM5B,QAAQ4H,cACqB,QADR8hB,EAChChqB,KAAKkC,MAAM2G,OAAOygB,8BAAsB,IAAAU,GAAIhqB,KAAKwf,qCAE/Cxf,KAAKupB,WAAWnJ,GAE9B,CAEO7W,sBAAsBC,EAA4DC,GACrF,OAAIzJ,KAAKoF,QAAUqE,GAAazJ,KAAKkC,MAAMiE,OAASqD,EAAUrD,IAIlE,CAEOuD,SAAM,IAAA6X,EAAA0I,EACT,MAAM,GAAEpoB,EAAE,OAAEgH,EAAM,UAAEsB,GAAcnK,KAAKkC,OAEjC,UAAE2K,EAAS,sBAAEsa,GAA0Bte,EAEvCqhB,EAAsBrhB,EAAOshB,wBAA0BA,EAAsB0B,SAE7EzB,EAA+BpqB,KAAK4oB,YAAc/f,EAAOwhB,kBAAmB,EAC5EC,EACFzhB,EAAO0hB,YAAcA,EAAU+4B,OAAS/4B,EAAU+4B,OAASz6C,EAAO0hB,YAAcA,EAAUgsB,UAAYhsB,EAAUgsB,UAAY,GACtH/0B,EAAsC,QAAhCD,EAAGvhB,KAAKkC,MAAM2G,OAAO4Y,mBAAW,IAAAF,EAAAA,EAAIE,EAAY2hC,YAE1D54B,EAAqD,QAAhCP,EAAGjqB,KAAKkC,MAAM5B,QAAQsT,IAAI/K,cAAM,IAAAohB,OAAA,EAA7BA,EAA+BQ,qBACzB,IAAAlX,EAAhCvT,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,SACxBpG,KAAKwkB,eAAgBmG,EAAAA,EAAAA,qBACjB3qB,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,OAAOwkB,OAC/B5qB,KAAKkC,MAAM5B,QAAQ+H,QAAQxI,YACG,QADQ0T,EACtCvT,KAAKkC,MAAM5B,QAAQ+H,QAAQuL,WAAG,IAAAL,GAAQ,QAARA,EAA9BA,EAAgC1K,cAAM,IAAA0K,OAAA,EAAtCA,EAAwC8N,mBAMhD,GAHImJ,GAAyBxqB,KAAKwkB,gBAC9BxkB,KAAKwkB,cAAgB,GAAGxkB,KAAKwkB,iBAAiBgG,KAE9CxqB,KAAKkC,MAAM2G,OAAOuY,sBAAwBphB,KAAKoF,MAAMib,mBAAqBrgB,KAAKoF,MAAMgjB,cAAe,KAAAY,EACpG,IAAI5I,EAAuB,GACvBsB,EAAkC,GAClCF,IAAWC,EAAY2hC,aAAepjD,KAAKkC,MAAMiE,KAAKwb,iCAAiCvb,OACvFsb,EAAiB1hB,KAAKkC,MAAMiE,KAAKwb,iCAAiCvb,OAC3Dob,IAAWC,EAAYg/B,WAAazgD,KAAKkC,MAAMiE,KAAKub,eAAetb,SAC1Esb,EAAiB1hB,KAAKkC,MAAMiE,KAAKub,eAAetb,QAEpDga,EAASsB,EAAejgB,KAAImgB,IAAgB,IAAAC,EAAAhY,EACxC,MAAO,CACHiY,IAAsB,QAAnBD,EAAED,EAAcG,WAAG,IAAAF,EAAAA,EAAI,GAC1BG,QAASC,EACLjiB,KAAKkC,MAAM5B,QAAQ4H,cAAclG,eACjChC,KAAKkiB,sBACyB,QADJrY,EAC1B7J,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,cAAM,IAAAyD,OAAA,EAA9BA,EAAgC0B,KAChCqW,EAAcO,SAErB,IAEL,MAAMI,EAAwC,QAA3ByG,EAAGhpB,KAAKkC,MAAM2G,OAAOuX,cAAM,IAAA4I,EAAAA,EAAI,GAClDhpB,KAAKkoB,mBAAqB,IAAIloB,KAAKwiB,8BAA8BpC,MAAYmC,GAEjF,MAAMsI,EAA4B7qB,KAAK8qB,sBAAsBV,EAAqBE,GAC5ES,EAAqC/qB,KAAKgrB,iCAC1Cre,EAASC,EAAAA,EAAA,GACP5M,KAAKkC,OAAyD,IAClEkD,MAAOpF,KAAKoF,MACZ0Z,aAAc,CACVmM,YAAajrB,KAAKkC,MAClB2K,UAAWC,IAAW,qBAAoBod,EAAa,WAAa,IAAMrd,IAE9Eqe,MAAOd,EAAsBpqB,KAAKsmB,iBAAiBgE,GAAgB,KACnEa,eAAgBnrB,KAAKomB,gBACrBgF,uBAAwBprB,KAAKklB,0BAC7BmG,yBAA0BrrB,KAAKolB,4BAC/BkG,cAAe,CACX7Y,IAAKiU,EAAAA,SACL7Z,UAAW,6BACX7J,MAAO6nB,EAA0B7nB,MACjCgd,YAAahgB,KAAKoF,MAAM4a,YACxBJ,KAAM5f,KAAK4f,KACXO,SAAUngB,KAAKmgB,SACf0G,UAAU,EACVC,kBAAmB3c,EAAU4c,8BAC7BC,kBAAmB7c,EAAU8c,0BAC7BC,yBAA0BlnB,KAAKigB,UAC/BkH,uBAAiD,IAA1BA,EACvBoE,kBAAmBphB,EAAUqhB,kBAC7BlE,eAAgBtnB,KAAK2f,SACrB4H,gBAAiBvnB,KAAKyf,UACtB3b,IAAK+mB,EAA0BhnB,MAEnC4nB,WAAY,CACRC,yBAA0B,CAAE7e,UAAW,0CACvC8e,kCAAmC,CAC/BlZ,IAAKmZ,EAAAA,oBACL/e,UAAW,+BACXgf,SAAU3B,EACV4B,iBAAkB3hB,EAAU4c,8BAC5BgF,iBAAkB5hB,EAAU8c,0BAC5B+E,SAAUnqB,EACVoqB,YAAY,EACZnoB,IAAKooB,KAAKC,UAAUpB,EAAmClnB,OAE3Db,MAAO+nB,EAAmC/nB,SAIlD,OAAOhD,KAAKkC,MAAMyO,WAAWhE,EACjC,CAKOuT,sBACHlgB,KAAKkF,SAAS,CAAEijB,eAAe,GACnC,CAkDQ6C,iCAA8B,IAAAq5B,EAClC,MAAMhkC,EAAgD,QAA/BgkC,EAAGrkD,KAAKoF,MAAMib,yBAAiB,IAAAgkC,EAAAA,EAAIrkD,KAAKkoB,mBACzDoB,EAAyBtpB,KAAKkC,MAAM2G,OAAOygB,uBAC7CA,IACAA,EAAuB/J,iBAAkB,GAK7C,IAF6Bve,EAAAA,gBAAgBC,YAAYof,GAE9B,CACvB,GAAIrgB,KAAKoF,MAAMgnB,WAAY,CACvB,MAAMC,EAAa,EACnB,MAAO,CACHrpB,MAAO,CAAChD,KAAKssB,uBAAuBhD,EAAwB+C,EAAYrsB,KAAKoF,MAAM4a,cACnFnc,KAAM,CAAC,UAGf,MAAO,CAAEb,MAAO,GAAIa,KAAM,IAG9B,MAAO,CACHb,MAAO,IAEAqd,EAAmB5e,KAAI,CAACyB,EAAkBa,IACrCb,EAAK0d,iBAAmBC,EAAAA,UAAUC,MAC3B9gB,KAAKwlB,sBACRtiB,EACAomB,QAAAA,EAA0BtpB,KAAKwf,8BAC/Bzb,EACA/D,KAAKoF,MAAM4a,aAGRhgB,KAAK4kB,kBACR1hB,EACAomB,QAAAA,EAA0BtpB,KAAKwf,8BAC/Bzb,EACA/D,KAAKoF,MAAM4a,gBAM3Bnc,KAAM,IAAIwc,EAAmB5e,KAAIyB,GAAQA,EAAK4e,OAEtD,CAEQgJ,sBAAsBV,EAA8BE,GAAoB,IAAAg6B,EAC5E,MAAMjkC,EAAgD,QAA/BikC,EAAGtkD,KAAKoF,MAAMib,yBAAiB,IAAAikC,EAAAA,EAAItkD,KAAKkoB,mBACzDI,EAAuBtoB,KAAKkC,MAAM2G,OAAOyf,qBAC3CA,IACAA,EAAqB/I,iBAAkB,GAG3C,MAAMgN,EAAWnC,EAAsB,aAAeE,EAItD,OAF6BtpB,EAAAA,gBAAgBC,YAAYof,GASlD,CACHrd,MAAO,IAEAqd,EAAmB5e,KAAI,CAACyB,EAAkBa,IAClC/D,KAAK2mB,6BACR4F,EACArpB,EACAolB,QAAAA,EAAwBtoB,KAAKqf,4BAC7Btb,MAKZF,KAAM,IAAIwc,EAAmB5e,KAAIyB,GAAQA,EAAK4e,QAnB1C9hB,KAAKoF,MAAMgnB,WACJ,CAAEppB,MAAO,CAAChD,KAAKikB,kBAAkBqE,IAAwBzkB,KAAM,CAAC,UAEpE,CAAEb,MAAO,GAAIa,KAAM,GAkBlC,CAEQ1D,iBAAiBigB,GACrB,MAAMoM,EAAexsB,KAAKkC,MAAM2G,OAAOuX,QAAU,GAC3CqM,EAA2BzsB,KAAKwiB,8BAA8BpC,GAE/Dlf,QAAQwrB,IACTD,EAAWhrB,KAAItB,UACX,GAAIuiB,EAAU9B,iBAAmBC,EAAAA,UAAUC,OAAS4B,EAAUZ,IAC1D,IACI,MACMkB,EADM,IAAI2J,IAAIjK,EAAUZ,KACV8K,aAAaC,IAAI,QACjC7J,IACAN,EAAUC,gBDrT/BxiB,eAAuC6iB,EAAiB9a,GAC3D,IAAIsb,EACJ,GAAIR,EAAS,CACT,MAAMliB,QAAiByjD,EAAAA,EAAAA,IAA6Br8C,EAAclG,eAAgB,CAACghB,IAEnF,GAAwB,MAApBliB,EAASgG,OAET,YADAoB,EAAcrF,UAAU8D,MAAM,6CAA6Cqc,KAI/E,MAAML,EAAY7hB,EAASqF,KACvBwc,GAAa3hB,EAAAA,gBAAgBC,YAAY0hB,KACzCa,EAAkBb,EAAU,IAGpC,OAAOa,CACX,CCqSwDsJ,CAAwB9J,EAAShjB,KAAKkC,MAAM5B,QAAQ4H,gBAEtF,MAAOpF,GACD9C,KAAKkC,MAAMW,WACX7C,KAAKkC,MAAMW,UAAU8D,MAAM,gCAIvC,OAAO+b,CAAS,KAEtBpe,MAAKoe,IACH,MAAMjC,EAAaiC,EAAUpQ,QAAOX,GAE5BA,EAAQiP,iBAAmBC,EAAAA,UAAUC,OACpCnP,EAAQiP,iBAAmBC,EAAAA,UAAUC,YAA+B/f,IAAtB4Q,EAAQgR,YAI/D3iB,KAAKkF,SAAS,CACVmb,kBAAmB,IAAII,KAAe+L,GACtCxM,YAAa,EACboM,WAAYW,KAAKC,MACjBzH,yBAAyB,GAC3B,IAGNvlB,KAAKkF,SAAS,CACVmb,kBAAmB,IAAIoM,KAAeD,GACtCxM,YAAa,EACboM,WAAYW,KAAKC,MACjBzH,yBAAyB,GAEjC,CAEQ4D,iBACJnpB,KAAKkF,SAAS,CACVkjB,eAAe,GAEvB,CAEQzB,6BACJ4F,EACAU,EACAznB,EACAzB,GAC0B,IAA1BqgB,EAAAC,UAAA7hB,OAAA,QAAAzB,IAAAsjB,UAAA,IAAAA,UAAA,GAEA,GAAI4I,EAAMrM,iBAAmBC,EAAAA,UAAUC,MACnC,OAAIsD,GAA0B,eAAbmI,EACN5nB,EAAAA,cAAAA,EAAAA,SAAA,KAAG3E,KAAKyiB,yBAAyBwK,EAAOlpB,EAAOyB,IAEnDb,EAAAA,cAAAA,EAAAA,SAAA,KAAG3E,KAAKkmB,sBAAsB+G,EAAOlpB,EAAOyB,IAEnD,GAAIxF,KAAK4oB,WACL,OAAIxE,EACOpkB,KAAKktB,8BAA8BD,EAAOjtB,KAAK4mB,qBAAsB7iB,GAEzE/D,KAAKmtB,6BAA6BF,EAAOznB,EAAezB,GAGnE,OAAQwoB,GACJ,IAAK,YACD,OAAOvsB,KAAKktB,8BAA8BD,EAAOjtB,KAAK4mB,qBAAsB7iB,GAEhF,IAAK,SACD,OAAO/D,KAAKotB,yBAAyBH,EAAOjtB,KAAK4mB,qBAAsB7iB,GAE3E,IAAK,aACD,OAAO/D,KAAKmtB,6BAA6BF,EAAOznB,EAAezB,GAKvE,OAAOY,EAAAA,cAAAA,EAAAA,SAAA,KAAG3E,KAAKkkB,iBAAiB+I,EAAOznB,EAAezB,EAAOqgB,GAErE,CAEQ5B,8BAA8BpC,GAAqB,IAAAiN,EAAAC,EAAAC,EAAAC,EACvD,MAAMC,EAAmF,QAA5DJ,EAAGrtB,KAAKkC,MAAM2G,OAAO6kB,+CAAuC,IAAAL,GAAAA,EACzF,IAAIM,EAAgBvN,QAAAA,EAAU,GAC9B,MAAMwN,GACDrmB,EAAAA,iBAAiBC,kBAAgD,QAA/B8lB,EAACttB,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,cAAM,IAAAknB,OAAA,EAA9BA,EAAgCO,mBACnEtmB,EAAAA,iBAAiBC,kBAAgD,QAA/B+lB,EAACvtB,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,cAAM,IAAAmnB,OAAA,EAA9BA,EAAgC7D,gBAClEoE,EAAuC,QAAjCN,EAAGxtB,KAAKkC,MAAMiE,KAAKzE,QAAQ0E,cAAM,IAAAonB,OAAA,EAA9BA,EAAgC5C,OAU/C,OATI6C,GAA2BG,GAAoBE,IAC/CH,EAAgBA,EAAcrb,QAAOpP,IAAO,IAAA6qB,EAExC,QAD8D,QAA5BA,EAAG7qB,EAAKkf,4BAAoB,IAAA2L,OAAA,EAAzBA,EAA2BzL,6BAC5B,IAEnCthB,EAAAA,gBAAgBC,YAAY0sB,KAC7BA,EAAgBvN,QAAAA,EAAU,KAG3BuN,CACX,CAgLQP,yBAAyBjJ,EAAmB3e,EAA+BzB,GAAa,IAAAiqB,EAC5F,OACIrpB,EAAAA,cAAA,OACIkI,UAAW,mBAAkB7M,KAAKoF,MAAM+iB,cAAgB,SAAW,IACnEtE,IAAK7jB,KAAK0lB,YAAY3hB,GAAM,aACW,QADXiqB,EAChBhuB,KAAKkC,MAAM2G,OAAOolB,iBAAS,IAAAD,EAAAA,EAAIE,EAAAA,kBAE3CvpB,EAAAA,cAAC2f,EAAAA,GAAK/gB,OAAA2K,OAAA,CACFlM,eAAgBhC,KAAKkC,MAAM5B,QAAQ4H,cAAclG,eACjD6K,UAAU,0BACNsX,EAAK,CACTI,YAAuB,IAAVxgB,EAAc/D,KAAKwkB,cAAgBL,EAAMrC,IACtDvI,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzC/T,cAAeA,EACfif,oBAAoB,OACpBQ,QAASjlB,KAAKyoB,oBACd0F,YAAcnuB,KAAKoF,MAAM+iB,eAAiBnoB,KAAKwoB,8BAA4BznB,EAC3Ec,GAAI,GAAG7B,KAAKkC,MAAML,sBAAsBkC,IACxC2gB,uBAAqB,EACrBY,sBAAuBtlB,KAAKoF,MAAMmgB,0BAA4BvlB,KAAKkC,MAAM2G,OAAOwhB,gBAChF1F,oBAA+B,IAAV5gB,KAEzBY,EAAAA,cAAC2f,EAAAA,GAAK/gB,OAAA2K,OAAA,CACF6W,KAAK,eACL/iB,eAAgBhC,KAAKkC,MAAM5B,QAAQ4H,cAAclG,eACjD6K,UAAU,6BACNsX,EAAK,CACTI,YAAuB,IAAVxgB,EAAc/D,KAAKwkB,cAAgBL,EAAMrC,IACtDmD,QAASjlB,KAAKuoB,iBACdhP,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzC/T,cAAeA,EACfif,oBAAoB,OACpB5iB,GAAI,GAAG7B,KAAKkC,MAAML,aAAakC,IAC/BqqB,YAAcpuB,KAAKoF,MAAM+iB,eAAiBkG,EAAAA,iCAA+BttB,EACzE2jB,uBAAqB,EACrBY,sBAAuBtlB,KAAKoF,MAAMmgB,0BAA4BvlB,KAAKkC,MAAM2G,OAAOwhB,gBAChF1F,oBAA+B,IAAV5gB,KAIrC,CAEQykB,wBAAwBvjB,GAAyC,IAAAqpB,GACrEC,EAAAA,EAAAA,wBAAuBtpB,EAAkC,QAA7BqpB,EAAEtuB,KAAKkC,MAAM2G,OAAOolB,iBAAS,IAAAK,EAAAA,EAAIE,OAAON,EAAAA,kBACxE,CAEQO,kCAAkCxpB,GACtC,MAAMypB,EAAS1uB,KAAKoF,MAAMmgB,wBAA2BtgB,EAAMypB,OAA8BzpB,EAAM0pB,cACzFC,EAA+B,uBACrC,GAAK5uB,KAAKoF,MAAMqiB,oBAiBZiH,EAAOG,MAAMC,UAAY,GACzBJ,EAAOK,UAAUC,OAAOJ,GACxBF,EAAOO,cAAeJ,MAAMK,SAAW,GACvClvB,KAAKkF,SAAS,CACVuiB,qBAAqB,QArBQ,KAAA0H,EACjC,MAAMC,EAASV,EAAOW,wBAChBpB,EAAYqB,OAAkC,QAA5BH,EAACnvB,KAAKkC,MAAM2G,OAAOolB,iBAAS,IAAAkB,EAAAA,EAAIjB,EAAAA,kBAElDqB,EAAYtqB,EAAMuqB,QAAUJ,EAAOK,KACnCC,EAAYzqB,EAAM0qB,QAAUP,EAAOQ,IACnCC,EAAkBN,EAAYtB,EAC9B6B,EAAkBJ,EAAYzB,EAEpCS,EAAOG,MAAMC,UAAY,SAASb,KAClCS,EAAOK,UAAUgB,IAAInB,GACrBF,EAAOO,cAAeJ,MAAMK,SAAW,OACvCR,EAAOO,cAAee,SAASH,EAAkBN,EAAWO,EAAkBJ,GAC9E1vB,KAAKkF,SAAS,CACVuiB,qBAAqB,IAUjC,CAEQgB,oBAAoBxjB,GAAyC,IAAAgrB,EAC7DhT,OAAOiT,YAAc,IAErBlwB,KAAKyuB,kCAAkCxpB,KAG3CkrB,EAAAA,EAAAA,qBAAoBlrB,EAAkC,QAA7BgrB,EAAEjwB,KAAKkC,MAAM2G,OAAOolB,iBAAS,IAAAgC,EAAAA,EAAIzB,OAAON,EAAAA,mBACjEluB,KAAKkF,SAAS,CACVijB,eAAe,IAEvB,CAEQI,iBAAiBtjB,IACrBmrB,EAAAA,EAAAA,2BAA0BnrB,GAC1BjF,KAAKkF,SAAS,CACVijB,eAAe,GAEvB,CAEQO,2BAA2BzjB,GAC3BgY,OAAOiT,YAAc,IAErBlwB,KAAKyuB,kCAAkCxpB,KAI3CorB,EAAAA,EAAAA,qBAAoBprB,GAEpBjF,KAAKkF,SAAS,CACVijB,eAAe,IAEvB,CAEQQ,yBAAyB1jB,IAC7BqrB,EAAAA,EAAAA,yBAAwBrrB,GAExBjF,KAAKkF,SAAS,CACVijB,eAAe,GAEvB,CAEQ+E,8BAA8B/I,EAAmB3e,EAA+BzB,GAAa,IAAAwsB,EACjG,OACI5rB,EAAAA,cAAA,OAAKkI,UAAU,+BACXlI,EAAAA,cAAA,oBAC2C,QAD3C4rB,EACgBvwB,KAAKkC,MAAM2G,OAAOolB,iBAAS,IAAAsC,EAAAA,EAAIrC,EAAAA,iBAC3CrhB,UAAU,8BACVkY,KAAK,eACLyL,WAAYxwB,KAAK2oB,yBACjB1D,QAASjlB,KAAK2oB,yBACdyF,YAAcpuB,KAAKoF,MAAM+iB,eAAiBsI,EAAAA,+BAA6B1vB,IAE3E4D,EAAAA,cAAC2f,EAAAA,GAAK/gB,OAAA2K,OAAA,CACFlM,eAAgBhC,KAAKkC,MAAM5B,QAAQ4H,cAAclG,eACjD6K,UAAU,0BACNsX,EAAK,CACTI,YAAuB,IAAVxgB,EAAc/D,KAAKwkB,cAAgBL,EAAMrC,IACtDvI,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzC0L,QAASjlB,KAAK0oB,2BACdljB,cAAeA,EACfif,oBAAoB,OACpB0J,YAAcnuB,KAAKoF,MAAM+iB,eAAiBuI,EAAAA,gCAA8B3vB,EACxEc,GAAI,GAAG7B,KAAKkC,MAAML,sBAAsBkC,IACxC2gB,uBAAqB,EACrBY,sBAAuBtlB,KAAKoF,MAAMmgB,0BAA4BvlB,KAAKkC,MAAM2G,OAAOwhB,gBAChF1F,oBAA+B,IAAV5gB,KAIrC,CAEQopB,6BAA6BhJ,EAAmB3e,EAA+BzB,GACnF,OACIY,EAAAA,cAAA,OAAKkI,UAAU,yBACXlI,EAAAA,cAAC2f,EAAAA,GAAK/gB,OAAA2K,OAAA,CACFlM,eAAgBhC,KAAKkC,MAAM5B,QAAQ4H,cAAclG,eACjD6K,UAAU,0BACNsX,EAAK,CACTI,YAAuB,IAAVxgB,EAAc/D,KAAKwkB,cAAgBL,EAAMrC,IACtDvI,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzC/T,cAAeA,EACfif,oBAAoB,OACpBa,sBAAuBtlB,KAAKoF,MAAMmgB,wBAClCZ,oBAA+B,IAAV5gB,KAEzBY,EAAAA,cAAA,OAAKkI,UAAU,kCAEXlI,EAAAA,cAAA,KACIyJ,KAAK,sBACLrB,MAAO/M,KAAKkC,MAAMiI,UAAUgc,oBAC5BpB,KAAK,SACLlB,IAAK7jB,KAAKmf,2BACV8F,QAASjlB,KAAKomB,gBACdvZ,UAAU,kDAK9B,CA+CQ2Z,uBAAuB9kB,GAAsB,IAAAivB,EACjD,MAAO,CACH7O,IAA4B,QAAzB6O,EAAEjvB,EAAQkvB,uBAAe,IAAAD,EAAAA,EAAI,GAExC,CAEQ1M,kBAAkBze,GACtB,OACIb,EAAAA,cAAA,OAAKkI,UAAU,0BACXlI,EAAAA,cAAC2f,EAAAA,GAAK,CACFtiB,eAAgBhC,KAAKkC,MAAM5B,QAAQ4H,cAAclG,eACjD6K,UAAU,gCACViV,IAAI,QACJvI,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzC/T,cAAeA,QAAAA,EAAiBxF,KAAKqf,4BACrCoF,oBAAoB,UAIpC,CAEQ6H,uBACJ9mB,EACAzB,EACA8gB,GAMA,MAAO,CACHC,4BAA6B,CACzBrS,IAAK,KACL5F,UAPQC,IACZ,mCACA+X,IAAwB9gB,EAAQ,0CAA4C,IAMxEghB,KAAM,MACNC,SAAU,EACVlhB,IAAK,QACL,aAAc,GACd,gBAAiB+gB,IAAwB9gB,EACzCkhB,QAASjlB,KAAKklB,0BAA0BnhB,GACxCohB,UAAWnlB,KAAKolB,4BAA4BrhB,IAEhDshB,QACI1gB,EAAAA,cAAC2f,EAAAA,GAAK,CACFtiB,eAAgBhC,KAAKkC,MAAM5B,QAAQ4H,cAAclG,eACjD6K,UAAU,0CACViV,IAAI,QACJvI,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzC/T,cAAeA,QAAAA,EAAiBxF,KAAKwf,8BACrCiF,oBAAoB,UAIpC,CAaQ4B,eACJ,GAAIrmB,KAAKoF,MAAMwiB,YAAa,KAAAiJ,EACe,QAAvCA,EAAA7wB,KAAKmf,2BAA2B4B,eAAO,IAAA8P,GAAvCA,EAAyCC,QACzC,MAAMC,EAAY/wB,KAAKif,kBAAkB4N,IAAI7sB,KAAKoF,MAAM4a,aACxD,GAAI+Q,GAAaA,EAAUC,UAAYD,EAAUC,SAASxuB,QAAU,EAAG,CACnE,MAAM2hB,EAAQ4M,EAAUC,SAAS,GAAGC,cAAc,OAC9C9M,GACAA,EAAM+M,gBAAgB,SAG9BlxB,KAAKkF,SAAS,CACVijB,eAAe,IAGvBnoB,KAAKkF,SAAS,CACVijB,eAAe,EACfP,aAAc5nB,KAAKoF,MAAMwiB,eAE7B/H,EAAAA,EAAAA,0BACAsR,EAAAA,EAAAA,2BACJ,EAwDJ,iHChlCA,MAAMC,EAAmBA,CACrB9uB,EACA+uB,EACApkB,EACAgD,EACApB,EACAsB,EACAE,EACAE,IAEIF,EACO1L,EAAAA,cAAAA,EAAAA,SAAA,KAAG0L,GAEV/N,EACOA,EAAUb,KAAIuC,IAAW,IAAAstB,EAC5B,OACI3sB,EAAAA,cAAA,OAAKkI,UAAU,sBAAsB/I,IAAK,GAAsB,QAAtBwtB,EAAGttB,EAASutB,kBAAU,IAAAD,EAAAA,EAAI,MAAMvU,EAAAA,GAASC,UAAUzW,cACxFvC,EAAS6C,SACToJ,GAAiBjM,EAASwtB,cACvB7sB,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKlK,EAASwtB,cAAcE,gBAAiB1tB,EAASwtB,cAAcG,kBACzE,KACH3tB,EAAS4tB,mBACNjtB,EAAAA,cAAC8sB,EAAAA,KAAI,CAAC5kB,UAAU,gCACX7I,EAASgrB,OACThrB,EAAS6tB,cACT7tB,EAAS4tB,oBAGdjtB,EAAAA,cAAAA,EAAAA,SAAA,KACKX,EAASgrB,OACThrB,EAAS6tB,eAGhB,IAIXthB,EACH5L,EAAAA,cAAA,OAAKkI,UAAU,wBACXlI,EAAAA,cAAA,KAAGkI,UAAU,iBAAiBwkB,GAC7BxiB,GAGLlK,EAAAA,cAAAA,EAAAA,SAAA,KAAGwL,GA6HL2hB,EAA6BA,CAC/BC,EACAC,EACAC,EACAC,EACAluB,EACA2G,KACA,IAAAwnB,EAEA,IAAIC,EAOJ,OALAA,GAHmE,QAA9CD,EAAwBnuB,EAASwtB,qBAAa,IAAAW,OAAA,EAAtBA,EAAwBE,iBAGtCN,EAAaC,EACvCM,EAAAA,iBAAiBC,cAAc5nB,KAChCynB,EAAapuB,EAASmC,MAAQnC,EAASmC,KAAKU,SAASxD,eAAiBsH,EAAwBsnB,EAAoBG,GAIlHztB,EAAAA,cAAAA,EAAAA,SAAA,KACIA,EAAAA,cAAA,OAAKkI,UAAU,8CACXlI,EAAAA,cAAA,KAAGkI,UAAW,8CAA8CulB,EAAWI,uBACvE7tB,EAAAA,cAAA,KAAGkI,UAAW,8CAA8CulB,EAAWI,iBAAkBJ,GA/CvEK,EAACzuB,EAA+BkuB,KAAyB,IAAAQ,EAAAC,EAAAC,EACvF,MAAMP,EAA6D,QAA9CK,EAAwB1uB,EAASwtB,qBAAa,IAAAkB,OAAA,EAAtBA,EAAwBL,gBACrE,OACI1tB,EAAAA,cAAAA,EAAAA,SAAA,KACIA,EAAAA,cAAC8sB,EAAAA,KAAI,CAAC5kB,UAAU,oDACXwlB,EACG1tB,EAAAA,cAAA,KAAGkI,UAAU,uDACc,QADuC8lB,EAC7D3uB,EAASwtB,qBAAa,IAAAmB,OAAA,EAAtBA,EAAwBE,eACxBX,EACsB,QADTU,EACb5uB,EAASwtB,qBAAa,IAAAoB,OAAA,EAAtBA,EAAwBE,aAE7B,MAET,EAmCML,CAA0BzuB,EAAUkuB,IAE1C,EA6FX,EAzC4ChwB,IAAqB,IAAA6wB,EAAAC,EA/LtCC,EAuEA9hB,EAwHsC,OAC7DxM,EAAAA,cAAA,MAAApB,OAAA2K,OAAA,CAAKrB,UAAW3K,EAAM2K,UAAWhL,GAAIK,EAAML,IAAQK,EAAMgxB,uBAAuBhxB,IAC3EA,EAAM8N,qCACN9N,EAAM6K,QACK,QAAXgmB,EAAC7wB,EAAMzB,YAAI,IAAAsyB,GAAVA,EAAY3wB,iBAAkBF,EAAMqC,mBA5HnB4M,EA4HyDjP,EAAMqC,iBA1HlFI,EAAAA,cAAAA,EAAAA,SAAA,KACIA,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKiD,EAAWgiB,yBAChBhiB,EAAWiiB,iBACXjiB,EAAWkiB,oBACXliB,EAAWmiB,mBAuHnBpxB,EAAMsJ,sBAhDetJ,IACtBA,EAAMoB,gBAAkBtC,EAAAA,gBAAgBC,YAAYiB,EAAMoB,gBAEtDqB,EAAAA,cAAA,OAAKkI,UAAU,wBACV3K,EAAMoB,eAAe7B,KAAIU,IAAY,IAAAoxB,EAClC,OACI5uB,EAAAA,cAAA,OAAKb,IAAK3B,EAAU,GAAGovB,WAAY1kB,UAAU,+BACxCilB,EACG5vB,EAAMiI,UAAU4nB,WAChB7vB,EAAMiI,UAAU6nB,aAChB9vB,EAAMiI,UAAUqpB,kBAChBtxB,EAAMiI,UAAU+nB,cAChB/vB,EAAU,GACwC,QADtCoxB,EACZrxB,EAAM5B,QAAQ4H,cAAclG,eAAe4I,eAAO,IAAA2oB,OAAA,EAAlDA,EAAoD1oB,uBAEvDumB,EACGjvB,EACAD,EAAMiI,UAAUspB,cAChBvxB,EAAM+K,iBACN/K,EAAM+N,cACN/N,EAAM2M,qBACN3M,EAAMiO,iBACNjO,EAAMmO,kBACNnO,EAAMqO,gBAER,KAMnBrO,EAAMqO,eACT5L,EAAAA,cAAA,OAAKkI,UAAU,uBACXlI,EAAAA,cAAA,OAAKkI,UAAU,wBACXlI,EAAAA,cAAA,KAAGkI,UAAU,iBAAiB3K,EAAMiI,UAAUspB,eAC7CvxB,EAAM2M,uBAIflK,EAAAA,cAAAA,EAAAA,SAAA,KAAGzC,EAAMiO,kBAULujB,CAAqBxxB,GAErByC,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKhM,EAAM+K,kBACXmkB,EACGlvB,EAAMC,UACND,EAAMiI,UAAUspB,cAChBvxB,EAAM+K,iBACN/K,EAAM+N,cACN/N,EAAM2M,qBACN3M,EAAMiO,iBACNjO,EAAMmO,kBACNnO,EAAMqO,iBAIjBrO,EAAMuL,qBACH9I,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKhM,EAAMgL,qBACXhL,EAAMuL,oBACI,QAAVulB,EAAA9wB,EAAMzB,YAAI,IAAAuyB,GAAVA,EAAY5wB,eArMMuxB,EAC/BC,EACAzmB,EACAjL,IAEK0xB,EAKDjvB,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKf,GACLymB,EAAoBC,SACpBD,EAAoBE,SACpBF,EAAoBG,QACpBH,EAAoBrf,aARzBrS,EAAM5B,QAAQuC,UAAUC,MAAM,uDACvB,MA+LO6wB,CAA2BzxB,EAAM4L,wBAAyB5L,EAAMiL,kBAAmBjL,GA5KxE8xB,EAC7BC,EACA9mB,EACAjL,IAEK+xB,EAKDtvB,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKf,GACLjL,EAAMkL,UACN6mB,EAAkBC,SAClBD,EAAkBE,SAClBF,EAAkBG,YAClBH,EAAkBI,IAClBJ,EAAkBK,eAAiBL,EAAkBK,eAAiB,KACtEL,EAAkB1f,aAXvBrS,EAAM5B,QAAQuC,UAAUC,MAAM,qDACvB,MAsKOkxB,CAAyB9xB,EAAM0L,sBAAuB1L,EAAMiL,kBAAmBjL,IAzN1E+wB,EA0NQ/wB,EAAMuO,qBAzNlBzP,EAAAA,gBAAgBC,YAAYgyB,EAAUjgB,QAIrDrO,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK+kB,EAAUzgB,SACf,2DAJE,KAyNEtQ,EAAM8L,2BACN9L,EAAMoM,sBACNpM,EAAMuM,uBAAyBzN,EAAAA,gBAAgBC,YAAYiB,EAAMuM,uBAC9D9J,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKhM,EAAM0M,+BAAgC1M,EAAMuM,uBACtD,KACHvM,EAAM2M,qBACN3M,EAAM6M,8BAGd7M,EAAM+N,cACL,sFCrSV,MAYMwpB,EAAqBC,IACvB,MAAM,yBAAEhO,EAAwB,kCAAEC,EAAiC,MAAE3oB,GAAU02B,EAE/E,OACI/0B,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKwd,GACN/mB,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKyd,GACL3oB,GAASA,EAAMvB,IAAIk4B,IAErB,EAITA,EAAwBxW,IAC1B,MAAM,4BAAE2B,EAA2B,QAAEO,GAAYlC,EAEjD,OACIxe,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK4W,GACLO,EACE,EAIf,EAlC2DnjB,IACvD,MAAM,cAACopB,EAAa,WAAEG,EAAU,aAAE3M,EAAY,MAAEoM,GAAShpB,EAEzD,OACIyC,EAAAA,cAACi1B,EAAAA,OAAMr2B,OAAA2K,OAAA,GAAK4Q,GACRna,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKod,IACTJ,EACAuO,EAAkBhO,GACd,8HCOjB,MAAM+4B,EAAuBrhC,IAEzB,MAAM,4BAAE2B,EAA2B,QAAEO,GAAYlC,EAEjD,OACIxe,IAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK4W,GACLO,EACE,EAaTo/B,EAA4BA,CAC9BtgC,EACA3e,EACAk/C,EACA7/B,EACA3iB,KACqC,IAAAyiD,EA6BrC,MAAO,CACH7/B,4BAA6B,CACzBrS,IAAK,KACL5F,UAnBQC,IACZ,mCACA+X,IAAwB6/B,EAAU,0CAA4C,IAkB1E3/B,KAAM,eACNjhB,IAAK4gD,GAETr/B,QACI1gB,IAAAA,cAAC8sB,EAAAA,KAAI,CAAC5kB,UAAU,yBACZlI,IAAAA,cAACsJ,EAAAA,OAAM,CACH8W,KAAK,MAAK,aACEZ,EAAMnC,QAAO,gBACV6C,IAAwB6/B,EAAO,gBAC/B,GAAGxiD,EAAML,sBAAsB6iD,IAC9C73C,UAAU,sCAEVsY,UAvBOlgB,IAjBPggB,IAAK2/B,EAAAC,EAkBb5/C,EAAM6/C,UAAYh/B,EAAAA,SAASC,QAC3B9gB,EAAMghB,iBAjBU,QAApB2+B,EAAA1iD,EAAMipB,sBAAc,IAAAy5B,GAApBA,EAAAG,KAAA7iD,GAE4B,QAA5B2iD,EAAA3iD,EAAMkpB,8BAAsB,IAAAy5B,GAA5BA,EAAAE,KAAA7iD,EAA+BwiD,GAC/BxiD,EAAMkD,MAAM4a,YAAc0kC,KAoCd//C,IAAAA,cAAC2f,EAAAA,GAAK/gB,OAAA2K,OAAA,CACF82C,cAAc,OACdhjD,eAAgBE,EAAM5B,QAAQ4H,cAAclG,eAC5C6K,UAAU,+BACNsX,EAAK,CACT5K,aAAcrX,EAAM5B,QAAQ+H,QAAQkR,aACpC/T,cAAkD,QAArCm/C,EAAEziD,EAAM2G,OAAOygB,8BAAsB,IAAAq7B,EAAAA,EAAIn/C,EACtDif,oBAAoB,YAavC,EASCwgC,EAAiCA,CAACz/C,EAA+BtD,KAAsE,IAAAgjD,EACzI,MAAO,CACHpgC,4BAA6B,CACzBrS,IAAK,KACL5F,UAAW,mCACXkY,KAAM,MACNC,SAAU,EACVlhB,IAAK,EACL,aAAc,GACd,iBAAiB,GAErBuhB,QACI1gB,IAAAA,cAAC2f,EAAAA,GAAK,CACFtiB,eAAgBE,EAAM5B,QAAQ4H,cAAclG,eAC5C6K,UAAU,0CACViV,IAAI,QACJvI,aAAcrX,EAAM5B,QAAQ+H,QAAQkR,aACpC/T,cAAkD,QAArC0/C,EAAEhjD,EAAM2G,OAAOygB,8BAAsB,IAAA47B,EAAAA,EAAI1/C,EACtDif,oBAAoB,UAG/B,EAiBCjF,EAAgD,CAClD/Z,UAAW,CACPC,GAAI,CAAEC,EAAG,6BAA8BC,EAAG,IAAKC,EAAG,KAClDs/C,GAAI,CAAEx/C,EAAG,6BAA8BC,EAAG,IAAKC,EAAG,MAEtDG,UAAU,EACVuZ,iBAAiB,GAmDrB,EAZ2Drd,IAEvD,MAAM,cAAEopB,EAAa,WAAEG,EAAU,aAAE3M,EAAY,MAAEoM,GAAUhpB,EAC3D,OACIyC,IAAAA,cAACi1B,EAAAA,OAAMr2B,OAAA2K,OAAA,GAAK4Q,GACRna,IAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKod,IACTJ,EApCYk6B,EACrB1rB,EACAx3B,KAGA,MAAM,yBAAEwpB,EAAwB,kCAAEC,GAAsC+N,GAClE,MAAEt0B,EAAK,WAAEqmB,GAAevpB,EACxBme,EA/BoBrd,IACnBA,aAAK,EAALA,EAAOvB,KAAIyB,IACP,CACH8e,QAAS9e,EAAKmiB,QAAQnjB,MAAM8f,QAC5BF,IAAK5e,EAAKmiB,QAAQnjB,MAAM4f,QA2BNujC,CAAqB55B,EAAWzoB,OAEpDA,EAENoC,EAAMgnB,aAAeprB,EAAAA,gBAAgBC,YAAYof,GAAqB,CAAC4kC,EAA+BzlC,EAA+Btd,IAEjIme,aAAiB,EAAjBA,EAAmB5e,KAAI,CAACyB,EAAkBrB,IAAe4iD,EAA0BvhD,EAC/Esc,EAA+B3d,EAAIuD,EAAM4a,YAAa9d,KAE9D,OACIyC,IAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKwd,GACN/mB,IAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKyd,GACL3oB,aAAK,EAALA,EAAOvB,IAAI+iD,IAEb,EAgBFY,CAAiB35B,EAAYvpB,GACzB,uKChLX,MAAOojD,UAAiB3gD,EAAAA,cAsB1B/E,YAAYsC,GACR0C,MAAM1C,GAtBF,KAAAqjD,eAAiC,IAAIC,EAAAA,EAAexlD,KAAKkC,MAAM5B,QAAQsT,IAAI/K,OAAO48C,yBAEnF,KAAArgD,MAAwB,CAC3BkC,gBAAiB,IAGb,KAAAo+C,iBAAoBr+C,GAGL,GAAGA,YAFFs+C,UAAU1oC,OAAOC,SAAS0oC,qBAC/B3oC,OAAOC,SAASC,SAK3B,KAAA0oC,WAAcx+C,IAClBrH,KAAKulD,eAAeO,MAAM9lD,KAAK0lD,iBAAiBr+C,GAAS,EAIrD,KAAAxC,gCAA0C,EAkL1C,KAAA6wB,kBAAqBlwB,GAClBA,GAAiB,CACpBC,UAAW,CACPC,GAAI,CAAEC,EAAG,gBAAiBC,EAAG,EAAGC,EAAG,GACnCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCE,GAAI,CAAEJ,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,IAEzCG,UAAU,GAIV,KAAA2vB,2BAA8BzvB,IAClC,GAAIlG,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAAQ,CAC7B,MAAM/F,EAAQ,CACVgG,YAAa,CAACH,EAAiBI,OAAQC,aAE3CvG,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAAOI,gBAAgBnG,GACvCiE,MAAK,KAAK,IAAAwE,EACP9I,KAAKm2B,gBACA3xB,OAAO1B,IACJ9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,0BAA0B,IAE7D,MAAMrE,EAAuC,QAA9BwG,EAAG9I,KAAKkC,MAAMiE,KAAK1F,KAAK2F,cAAM,IAAA0C,OAAA,EAA3BA,EAA6BrI,KAAKyI,UACjD5G,GAAkC,IAArBA,EAAUE,QAAgBF,EAAU6I,MAAKjI,GAAwB,aAAhBA,EAAK0nB,UAClE1N,SAAS4wB,YAGhBtpC,OAAO1B,IACJ9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,6BAA6B,MAKhE,KAAAo/C,8BAAgC,CAAC3/C,EAAsCS,KACrD,UAAlBT,EAAOU,QAAsBD,GAC7B7G,KAAK21B,2BAA2B9uB,IAIhC,KAAAm/C,wBAA0B,CAACh/C,EAA4BC,KAC3D,GAAIjH,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAAQ,CAC7B,MAAM/F,EAAQ,CACV04C,WAAY/xC,EAAiBV,OAAQC,WACrC0/C,YAAah/C,EACbmb,qBAAsB,CAAE8jC,oCAAqClmD,KAAK6E,iCAEtE7E,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAAO+/C,uBAAuB9lD,GAC9CiE,MAAM8B,GACmB,YAAlBA,EAAOU,SACP9G,KAAKm2B,gBAAgB3xB,OAAO1B,IACxB9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,0BAA0B,KAElD,KAIdnC,OAAO1B,IACJ9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,sCAAsC,IAI7E,OAAO,CAAK,EAGR,KAAAy/C,2BAA6B,KACjCpmD,KAAKm2B,gBAAgB3xB,OAAO1B,IACxB9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,0BAA0B,GACvD,EApPF3G,KAAKoxB,iBAAmBpxB,KAAKoxB,iBAAiB1oB,KAAK1I,KACvD,CAEOG,0BAIHH,KAAK6E,qCAAuC7E,KAAK+I,oCAC7C/I,KAAK6E,sCACC7E,KAAKm2B,gBAGfn2B,KAAK6lD,WAAW,sBACpB,CAEOn8C,SACH,OACI/E,EAAAA,cAAA,MAAApB,OAAA2K,OAAA,CAAKrB,UAAW7M,KAAKkC,MAAM2K,UAAWhL,GAAI7B,KAAKkC,MAAML,IAAQ7B,KAAKkC,MAAMgxB,uBAAuBlzB,KAAKkC,QAC/FlC,KAAKkC,MAAM6K,MACZpI,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKlO,KAAKkC,MAAM+K,kBAChBjN,KAAKoxB,oBAETpxB,KAAKkC,MAAMuL,qBACR9I,EAAAA,cAAE8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKlO,KAAKkC,MAAMgL,qBACjBlN,KAAKkC,MAAMuL,oBACXumB,EAAyBh0B,KAAKkC,MAAM0L,sBAAuB5N,KAAKkC,MAAMiL,kBAAmBnN,KAAKkC,OAC9FlC,KAAKoF,MAAMkC,gBAAgB9E,OAAS,EAAI6jD,EAAkBrmD,KAAKkC,MAAMuO,oBAAsB,KAC3F61C,EAAqBtmD,KAAKkC,OAC1BlC,KAAKkC,MAAM2G,OAAO09C,uBAAyB5hD,EAAAA,cAAA,OAAKkI,UAAU,wBAAwB7M,KAAKkC,MAAM2G,OAAO09C,wBAAgC,KACrI5hD,EAAAA,cAAA,OAAKkI,UAAW,wBACX7M,KAAKkC,MAAM8L,2BACXhO,KAAKkC,MAAM5B,QAAQ+H,SAAWrI,KAAKkC,MAAM5B,QAAQ+H,QAAQ2B,MAAQhK,KAAKkC,MAAM5B,QAAQ+H,QAAQ2B,KAAKC,gBAAkB,KAAOtF,EAAAA,cAAA,OAAKkI,UAAU,+BAA+B7M,KAAKkC,MAAMiI,UAAUq8C,SAC9L7hD,EAAAA,cAAA,OAAKkI,UAAW,oCA2WP1C,EA1WwBnK,KAAKkC,MAAMiI,UA4WhExF,EAAAA,cAACsJ,EAAAA,OAAM,CACHpB,UAAW,+BACXoY,QAASwhC,GAERt8C,EAAU2E,4BA/WU9O,KAAKkC,MAAMoM,yBAK3BtO,KAAKkC,MAAM+N,eAoW5B,IAAqC9F,CAjWjC,CAEQinB,mBACJ,MAAM,cAAEqC,GAAkBzzB,KAAKkC,MAAMiI,UAErC,GAAInK,KAAKkC,MAAMmO,kBACX,OAAO1L,EAAAA,cAAAA,EAAAA,SAAA,KAAG3E,KAAKkC,MAAMmO,mBAEzB,MAAM/N,EAAYtC,KAAK0K,gBACvB,OAAIpI,EACOA,EAAUb,KAAI,CAACuC,EAAUD,IAExBY,EAAAA,cAAA,OAAKkI,UAAU,sBAAsB/I,IAAKC,GACrCC,EAAS6C,SACT6/C,EAAkB1iD,EAAUhE,KAAKkC,MAAMiI,UAAWnK,KAAKkC,MAAM+N,eAC9DtL,EAAAA,cAAA,OAAKkI,UAAU,+BACV7I,EAAS6tB,cACT7tB,EAASgrB,WAMlBhvB,KAAKkC,MAAMqO,eAEX5L,EAAAA,cAAA,OAAKkI,UAAU,wBACXlI,EAAAA,cAAA,KAAGkI,UAAU,iBAAiB4mB,GAC7BzzB,KAAKkC,MAAM2M,sBAEhBlK,EAAAA,cAAAA,EAAAA,SAAA,KAAG3E,KAAKkC,MAAMiO,iBAG9B,CAEQzF,gBACJ,MACIvE,MACI1F,MAAQ2F,OAAQ3F,GAChB8X,WAAanS,OAAQmS,GACrBzI,gBAAkB1J,OAAQ0J,GAC1BC,qBAAuB3J,OAAQ2J,IAEnCzP,SACI+H,SACIuC,SAAS,uBACL4N,GACA,CAAEA,4BAAwBzX,KAGtC8H,OAAQA,EAAM,UACdhG,EAAS,UACTsH,EAAS,QACTsO,GACAzY,KAAKkC,MAEHsD,EAAgBxF,KAAK01B,kBAAkB7sB,EAAOrD,eAE9C8B,EAA+CtH,KAAKoF,MAAMkC,gBAChE,IAAIoR,EAA0B,GAI9B,OAHID,GAAWlV,OAAOM,KAAK4U,GAASjW,OAAS,GAAKiW,EAAQxI,eAAiBwI,EAAQxI,cAAczN,OAAS,IACtGkW,EAAkBD,EAAQxI,cAAc,GAAGpO,IAExC7B,KAAKkC,MAAMiE,KAAKxF,UAAYX,KAAKkC,MAAMiE,KAAKxF,SAASyF,QAAU3F,GAAQA,EAAKA,KAAKyI,WAAazI,EAAKA,KAAKyI,UAAU1G,OAAS,GAC9HmW,EAAAA,EAAAA,GAAc,CACVxW,UAAW1B,EAAKA,KAAKyI,UACrB0P,sBAAuBF,EACvBpR,gBAAiBA,EACjB3G,SAAUX,KAAKkC,MAAMiE,KAAKxF,SAASyF,OACnC4E,qBAAsBhL,KAAKkC,MAAMiE,KAAK6E,qBAAqB5E,OAC3DyS,uBAAwB7Y,KAAKkC,MAAMiE,KAAK2S,gBAAgB1S,OACxDZ,cAAeA,EACfwT,oBAAqBhZ,KAAKkC,MAAM5B,QAAQsT,IAAI/K,OAAOoQ,mBAAoB,EACvEC,oBAAqBlZ,KAAKkC,MAAM5B,QAAQsT,IAAI/K,OAAOuQ,2BACnDG,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzCjZ,QAASN,KAAKkC,MAAM5B,QACpBiN,SAAUvN,KAAKkC,MAAMqL,SACrB1L,GAAI7B,KAAKkC,MAAML,GACfsI,UAAW,CACPsP,WAAYtP,EAAUuP,yBACtBC,YAAa,UACbE,aAAc1P,EAAU2P,kCACxBC,YAAa5P,EAAU6P,0BACvBG,sBAAuBhQ,EAAUiQ,oBACjCC,uBAAwBlQ,EAAUkQ,uBAClCC,yBAA0BnQ,EAAUmQ,yBACpCC,yBAA0BpQ,EAAUoQ,yBACpCC,mBAAoBrQ,EAAUqQ,mBAC9B5D,kBAAmBzM,EAAUyM,kBAC7BC,iBAAkB1M,EAAU0M,iBAC5B4D,oBAAqBtQ,EAAUuQ,iBAEnC7X,UAAWA,EACXgY,wBAAyB1Q,EAAU0Q,wBACnCC,6BAA8B3Q,EAAU2Q,6BACxCC,iBAAkB5Q,EAAU6Q,qBAC5BC,WAAY9Q,EAAU+Q,uBACtBC,aAAchR,EAAUiR,oBACxBC,gBAAiBlR,EAAUmR,uBAC3BC,0BAA2Bvb,KAAKkC,MAAMiE,KAAKoV,0BAA0BnV,OACrEoV,eAAgBrR,EAAU2H,uBAC1B2J,kBAAmBtR,EAAUuR,8BAC7BC,qBAAsBxR,EAAUyR,6BAChCC,UAAW7b,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAChC0V,iBAAkB9b,KAAKkC,MAAMiE,KAAK2V,iBAAiB1V,OACnD8J,uBAAwBlQ,KAAK21B,2BAC7B/uB,6BAA8B5G,KAAK+lD,8BACnChqC,sCAAuC/b,KAAKgmD,wBAC5ChqC,uBAAwBhc,KAAKomD,2BAC7B7tC,UAAWA,EACX0D,oBAAqB9R,EAAU8R,oBAC/BC,uBAAwB1D,EACxB2D,cAAetT,EAAOuT,qBACtBC,gCAAiCxT,EAAOwT,gCACxClU,iBAAkBnI,KAAKkC,MAAMiG,iBAC7BtD,+BAAgC7E,KAAK6E,+BAErCqK,kCAAmClP,KAAKmP,2CAA2ChF,GACnFiF,mCAAoCpP,KAAKqP,0CAA0ClF,GACnFmS,wCAAyCtc,KAAKqW,iDAAiDlM,GAC/FqF,uDAAwDxP,KAAKyP,gEAAgEtF,GAE7HoS,6BAA8BpS,EAAUoS,6BACxCE,0BAA2BtS,EAAUsS,0BACrCC,4BAA6BvS,EAAUuS,4BACvC5M,eAAgBA,EAChBC,oBAAqBA,IAEzB,IACR,CAiFQ5P,0CAAuC,IAAA0d,EAC3C,MAAMC,EAA4D,QAArBD,EAAG7d,KAAKkC,MAAM5B,eAAO,IAAAud,GAAS,QAATA,EAAlBA,EAAoBxV,eAAO,IAAAwV,GAAK,QAALA,EAA3BA,EAA6BjK,WAAG,IAAAiK,GAAU,QAAVA,EAAhCA,EAAkCE,gBAAQ,IAAAF,OAAA,EAA1CA,EAA4CG,iCAC5F,GAAgD,SAA5CF,EACA,OAAO,EAGX,IAAI,IAAAL,EACA,MAAMD,QAAwBxd,KAAKkC,MAAMiE,KAAKkF,aAK9C,MADK,QAFDoS,EAAAD,EAAgBlS,MACZD,GAAsC,oEAAtBA,EAAaE,cAChC,IAAAkS,OAAA,EAFDA,EAEGhS,aAAa,GAEhB,OAAO,EAEb,MAAO3I,GAGL,OAFA9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,iCACpB,EAGX,GAAgD,QAA5CmX,EACA,OAAO,EAEX,IACI,MAAMG,QAAqBje,KAAKkC,MAAMiE,KAAK4J,oBAC3C,QACMkO,IAC4C,QAA5CH,GAAqDG,EAAaC,OACnB,QAA5CJ,IAAsDG,EAAaC,OAE9E,MAAOpb,GAGL,OAFA9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,gCACpB,EAEf,CAEQxG,sBAAyC,IAAAwmD,EAAA,IAArBC,IAAAviC,UAAA7hB,OAAA,QAAAzB,IAAAsjB,UAAA,KAAAA,UAAA,GACxB,IAAKrkB,KAAK6E,+BACN,OAAOwY,EAAAA,YAAYlc,UAGvB,MACIgF,MAAQ1F,KAAMA,IACdT,KAAKkC,MACT,IAAI2kD,EACJ,IACIA,QAAmBpmD,EACrB,MAAOqC,GAGL,OAFA9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,sBACpB0W,EAAAA,YAAYlc,UAEvB,MAAM+3B,EAA6B,QAAlBytB,EAAGE,EAAWpmD,YAAI,IAAAkmD,OAAA,EAAfA,EAAiBxtB,QACrC,IAAID,EA8BA,OADAl5B,KAAKkC,MAAMW,UAAU6D,QAAQ,uDACtB2W,EAAAA,YAAYlc,UA7BnB,IAAI,IAAA2lD,EACA,MAAMC,QAAoDC,EAAAA,EAAAA,0BAAyB,CAAE3lD,cAAerB,KAAKkC,MAAM5B,QAAQ4H,eAA2B,QAAZ4+C,EAAED,SAAU,IAAAC,GAAM,QAANA,EAAVA,EAAYrmD,YAAI,IAAAqmD,OAAA,EAAhBA,EAAkBzlB,GAAInI,GAE9J,OADAl5B,KAAKkF,SAAS,CAAEoC,gBAAiBy/C,EAAiBE,+BAAiC,KAC5E5pC,EAAAA,YAAYlc,UACrB,MAAO2B,GACL,GAAI8jD,GAAwB,2DAAf9jD,EAAMixC,KAAmE,CAClF,UACU8S,EAAWK,YAAY,CAAC,GAChC,MAAOC,GAGL,OAFAnnD,KAAKkC,MAAMW,UAAU6D,QAAQygD,GAC7BnnD,KAAKkC,MAAMW,UAAU8D,MAAM,0BACpB0W,EAAAA,YAAYlc,UAEvB,IAEI,aADMnB,KAAKm2B,eAAc,GAClB9Y,EAAAA,YAAYlc,UACrB,MAAOimD,GAGL,OAFApnD,KAAKkC,MAAMW,UAAU6D,QAAQ0gD,GAC7BpnD,KAAKkC,MAAMW,UAAU8D,MAAM,2BACpB0W,EAAAA,YAAYlc,WAM3B,OAFAnB,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,2BACpB0W,EAAAA,YAAYlc,UAM/B,CAEQgO,2CAA2ChF,GAC/C,MAAO,CACHyL,yBAA0BzL,EAAUyL,yBAEpCC,wBAAyB1L,EAAU0L,wBACnCC,4BAA6B3L,EAAU2L,4BAEvCC,gCAAiC5L,EAAU4L,gCAC3CC,iCAAkC7L,EAAU6L,iCAC5CC,sCAAuC9L,EAAU8L,sCAEjDC,oBAAqB/L,EAAU+L,oBAC/BC,wBAAyBhM,EAAUgM,wBACnCC,cAAejM,EAAUiM,cAEjC,CAEQC,iDAAiDlM,GACrD,MAAO,CACHmM,4BAA6BnM,EAAUmM,4BACvCC,2BAA4BpM,EAAUoM,2BACtCC,0CAA2CrM,EAAUqM,0CACrDC,6CAA8CtM,EAAUsM,6CACxDC,0CAA2CvM,EAAUuM,0CACrDC,cAAexM,EAAUwM,cACzBC,kBAAmBzM,EAAUyM,kBAC7BC,iBAAkB1M,EAAU0M,iBAEpC,CAEQpH,gEAAgEtF,GACpE,MAAO,CACHiN,yBAA0BjN,EAAUiN,yBACpCC,8BAA+BlN,EAAUkN,8BACzCC,yBAA0BnN,EAAUmN,yBACpCC,+BAAgCpN,EAAUoN,+BAElD,CAEQlI,0CAA0ClF,GAC9C,MAAO,CACHqN,yBAA0BrN,EAAUsN,0BACpCC,wBAAyBvN,EAAUwN,mBACnCC,2BAA4BzN,EAAUyN,2BACtCC,yBAA0B1N,EAAU2N,+BAEpCC,yBAA0B5N,EAAU4N,yBAEpCC,yBAA0B7N,EAAU8N,8BACpCC,+BAAgC/N,EAAUgO,yCAElD,EAEJ,UAaA,SAASsuC,IACLxpC,OAAOoqC,QAAQC,MACnB,CAEA,MAAMZ,EAAoBA,CAAC1iD,EAA+BmG,EAA2B8F,KACjF,IAAKjM,EAASwtB,gBAAkBvhB,EAC5B,OAAO,KAGX,MAAM,uBAAEiL,EAAsB,yBAAEqsC,EAAwB,oBAAEnsC,EAAmB,8BAAEosC,EAA6B,uBAAElsC,GAA2BnR,EAEnIkoB,EAAkBruB,EAASwtB,cAAca,gBAI/C,OACI1tB,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKlK,EAASwtB,cAAcE,gBAC7B/sB,EAAAA,cAAA,OAAKkI,UAAU,+BACVwlB,EAAkB1tB,EAAAA,cAAA,QAAMkI,UAAU,WAAW26C,GAAwC7iD,EAAAA,cAAA,QAAMkI,UAAU,QAAQ06C,IAG9Gl1B,GACA1tB,EAAAA,cAAA,OAAKkI,UAAU,oCACXlI,EAAAA,cAAA,QAAMkI,UAAU,0CAA0C7I,EAASwtB,cAAcsB,aACjFnuB,EAAAA,cAACsJ,EAAAA,OAAM,CAACpB,UAAU,mCAAmCoY,QAXhDhgB,GAAkDjB,EAASwtB,eAAiBxtB,EAASwtB,cAAcoY,UAAUsQ,aAAY,IAWlD5+B,IAGpF3W,EAAAA,cAACsJ,EAAAA,OAAM,CAACpB,UAAU,2BAA2BoY,QAfhChgB,GAAkDjB,EAASwtB,eAAiBxtB,EAASwtB,cAAcoY,UAAUsQ,aAAa7nB,IAenEA,EAAkBnX,EAAyBE,GAC5G,EAITirC,EAAqBpzB,GAClBA,GAAyC,IAA5BA,EAAUjgB,OAAOxQ,OAK/BmC,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK+kB,EAAUzgB,SAChB,2DALG,KAUT8zC,EAAwBpkD,IAA8D,IAAAulD,EAMxF,IAAIC,GALuBC,EAKSzlD,EAAMC,UALNylD,EAKiB,WAJ1CD,EAAIx8C,MAAK,SAAS08C,GAAU,IAAAC,EAC/B,OAAOF,KAAmB,QAAhBE,EAAKD,EAAO1hD,YAAI,IAAA2hD,GAAS,QAATA,EAAXA,EAAapmD,eAAO,IAAAomD,OAAA,EAApBA,EAAsBl9B,OACzC,KAHJ,IAA2B+8B,EAASC,EAMpC,IAAIG,GAAiC,QAAfN,EAAAvlD,EAAMC,iBAAS,IAAAslD,OAAA,EAAfA,EAAiBjlD,SAAU,EACjD,OAAGklD,GAAeK,EAAkB,EAE5BpjD,EAAAA,cAAA,OAAKkI,UAAU,iBACX3K,EAAM2G,OAAOm/C,sBAAwB,mHAItC,MAIf,SAASC,EAAmBC,GACxB,OAAOvjD,EAAAA,cAAA,OAAKkI,UAAU,qBAClBlI,EAAAA,cAAA,OAAKkI,UAAU,qBAAqBgiB,MAAO,CAACs5B,UAAW,UACnDxjD,EAAAA,cAAA,OAAKkI,UAAU,+BAA+BgiB,MAAO,CAACu5B,MAAM,GAAGF,SAG3E,CA4BA,MAAMl0B,EAA2BA,CAACC,EAAmD9mB,EAA+BjL,IAC3G+xB,EAIDtvB,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKf,GA/BlB,SAAuCjL,GAAsC,IAAAmmD,EAAAC,EACzE,MACMC,EAAW,IAEXC,EAAuC,QAA1BH,EAAInmD,EAAMiE,KAAK1F,KAAK2F,cAAM,IAAAiiD,GAAM,QAANA,EAAtBA,EAAwB5nD,YAAI,IAAA4nD,OAAA,EAA5BA,EAA8BpwB,YACrD,IAAK/1B,EAAM2G,OAAO4/C,eAAiBD,GAAgC,QAAnBF,EAAIpmD,EAAMC,iBAAS,IAAAmmD,GAAfA,EAAiBn9C,MAAKoH,IAAI,IAAAm2C,EAAA,MAAmC,cAAtB,QAATA,EAAAn2C,EAAKpM,YAAI,IAAAuiD,OAAA,EAATA,EAAW7hD,SAAS+jB,OAAqB,IACvH,OAAO,KAEX,IAAI+9B,EAAc1d,KAAK2d,MAAMJ,EAAcD,GAC3C,OAAGI,EAAc,EACNhkD,EAAAA,cAAA,OAAKkI,UAAU,YACjBo7C,EAAoBO,EAAcD,EAAYA,EAAW,KAC1D5jD,EAAAA,cAAA,OAAKkI,UAAU,2BAA2BgiB,MAAO,CAACg6B,aAAa,SAAO,0BAC3ClkD,EAAAA,cAAA,aAZhB,GAYkCgkD,GAAgB,4CAA0C1d,KAAK6d,KAAKP,EAAYC,EAAcD,GAAU,6BAA2B5jD,EAAAA,cAAA,aAZrK,IAYyL,aAIjMA,EAAAA,cAAA,OAAKkI,UAAU,YACjBo7C,EAAmBO,EAAgBD,EAAW,KAC/C5jD,EAAAA,cAAA,OAAKkI,UAAU,2BAA2BgiB,MAAO,CAACg6B,aAAa,SAAO,wBAC5C5d,KAAK6d,KAAKP,EAAYC,EAAcD,GAAU,iBAAe5jD,EAAAA,cAAA,aAnB5E,IAmBgG,wBAIvH,CAQaokD,CAA8B7mD,GAC9BA,EAAMkL,UAWnB,SAAyBlL,GAAsC,IAAA8mD,EAC3D,MAAMR,EAAuC,QAA1BQ,EAAI9mD,EAAMiE,KAAK1F,KAAK2F,cAAM,IAAA4iD,GAAM,QAANA,EAAtBA,EAAwBvoD,YAAI,IAAAuoD,OAAA,EAA5BA,EAA8BC,SACrD,OACItkD,EAAAA,cAAA,KAAGkI,UAAW,qCACV27C,GAAiBA,EAAgB,EACjC7jD,EAAAA,cAAAA,EAAAA,SAAA,KACQA,EAAAA,cAAA,QAAMkI,UAAU,4BAA4B3K,EAAMiI,UAAU++C,sBAC5DvkD,EAAAA,cAACskC,EAAAA,eAAc,CACX9iC,KAAM,CACF6xB,MAAO,CAAEmxB,wBAAyBX,IAEtC7xC,mBAAe5V,EACfT,QAAS4B,EAAM5B,QACfuB,GAAIK,EAAML,GACV0L,SAAUrL,EAAMqL,SAChBV,UAAW,8BAGnB,KAGhB,CA/Bau8C,CAAgBlnD,GAChB+xB,EAAkBK,eAAiBL,EAAkBK,eAAiB,KACtEL,EAAkBE,SAClBjyB,EAAM2G,OAAOwgD,YAAc,KAAOp1B,EAAkBI,IAsDjE,SAA0BnyB,GAAsC,IAAAonD,EAAAC,EAAAC,EAC5D,OACI7kD,EAAAA,cAAA,KAAGkI,UAAW,sCACVlI,EAAAA,cAAA,QAAMkI,UAAU,4BAA4B3K,EAAMiI,UAAUgJ,kBACrC,QAAtBm2C,EAAApnD,EAAMiE,KAAK1F,KAAK2F,cAAM,IAAAkjD,GAAM,QAANA,EAAtBA,EAAwB7oD,YAAI,IAAA6oD,GAA5BA,EAA8BrxB,aAA6D,KAAxB,QAAtBsxB,EAAArnD,EAAMiE,KAAK1F,KAAK2F,cAAM,IAAAmjD,GAAM,QAANA,EAAtBA,EAAwB9oD,YAAI,IAAA8oD,OAAA,EAA5BA,EAA8BtxB,aACxEtzB,EAAAA,cAACskC,EAAAA,eAAc,CACX9iC,KAAM,CACF6xB,MAAO,CAAEmxB,wBAA+C,QAAxBK,EAAEtnD,EAAMiE,KAAK1F,KAAK2F,cAAM,IAAAojD,GAAM,QAANA,EAAtBA,EAAwB/oD,YAAI,IAAA+oD,OAAA,EAA5BA,EAA8BvxB,cAEpEthB,cAAezU,EAAMiI,UAAUyK,UAC/BtU,QAAS4B,EAAM5B,QACfuB,GAAIK,EAAML,GACV0L,SAAUrL,EAAMqL,SAChBV,UAAW,6BAGXlI,EAAAA,cAAA,QAAMkI,UAAU,4BAA4B3K,EAAMiI,UAAUuK,uBAIhF,CAzEa+0C,CAAiBvnD,IAVf,8QCziBR,MAAMwnD,EAAmDhmD,IAAA,IAAC,cAAEimD,EAAa,MAAE5vB,EAAK,SAAE7c,GAAUxZ,EAAA,OAC/FiB,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKy7C,GACL5vB,EACA7c,EACE,EAGE0sC,EAAmDC,IAAA,IAAC,cAAEC,EAAa,MAAE/vB,GAAO8vB,EAAA,OACrFllD,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK47C,GACL/vB,EACE,EAGEgwB,EAAyCC,IAAA,IAAC,SAAEC,EAAQ,KAAE/mD,EAAI,cAAEgnD,EAAa,cAAEC,GAAeH,EAAA,OACnGrlD,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK+7C,GACL/mD,EACAgnD,GAAiBvlD,EAAAA,cAAC+kD,EAAsBnmD,OAAA2K,OAAA,GAAKg8C,IAC7CC,GAAiBxlD,EAAAA,cAACilD,EAAsBrmD,OAAA2K,OAAA,GAAKi8C,IAC3C,EAGEC,EAA2DC,IAAA,IAAC,sBAAEC,EAAqB,aAAEC,EAAY,QAAEC,EAAO,UAAEC,GAAWJ,EAAA,OAChI1lD,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKo8C,GACLE,EACD7lD,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKq8C,GACLE,EAAUhpD,KAAIipD,GACX/lD,EAAAA,cAAColD,EAAiBxmD,OAAA2K,OAAA,CAACpK,IAAK4mD,EAASpkD,QAAYokD,OAGlD,EAGEC,EAA2CC,IAAA,IAAC,UAAEC,EAAS,OAAEC,EAAM,QAAEN,EAAO,SAAEO,EAAQ,eAAEC,EAAc,aAAEC,EAAY,cAAEC,GAAeN,EAAA,OAC1IjmD,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK28C,GACNlmD,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK48C,GACLN,EACAO,GAEJC,GAAkBrmD,EAAAA,cAACylD,EAAsB7mD,OAAA2K,OAAA,GAAK88C,IAC9CE,GAAiBvmD,EAAAA,cAACylD,EAAsB7mD,OAAA2K,OAAA,GAAKg9C,IAC7CD,GAAgBtmD,EAAAA,cAACylD,EAAsB7mD,OAAA2K,OAAA,GAAK+8C,IAC1C,EA2HX,MAAMj3B,EAA4B9xB,IAAsE,IAAAipD,EACpG,MAAMC,EAAoF,SAA/D,QAAbD,EAAAjpD,EAAM5B,eAAO,IAAA6qD,GAAS,QAATA,EAAbA,EAAe9iD,eAAO,IAAA8iD,GAAK,QAALA,EAAtBA,EAAwBv3C,WAAG,IAAAu3C,GAAU,QAAVA,EAA3BA,EAA6BptC,gBAAQ,IAAAotC,OAAA,EAArCA,EAAuCntC,mCAC/C,aAACqtC,GAAiBnpD,EACxB,OAAKmpD,EAID1mD,EAAAA,cAAA,OAAKkI,UAAU,6BACdw+C,EAAab,QACd7lD,EAAAA,cAAA,OAAKkI,UAAU,4BACVw+C,EAAap2B,OACVtwB,EAAAA,cAAAA,EAAAA,SAAA,KACKymD,EAAQC,EAAap2B,MAAMf,SAkChD,SAAyBhyB,GAAyB,IAAAopD,EAC3Cp3B,EAAS,EACa,QAA1Bo3B,EAAAppD,EAAMiE,KAAKolD,SAASnlD,cAAM,IAAAklD,GAA6B,QAA7BA,EAA1BA,EAA4BE,aAAa/qD,KAAKyI,iBAAS,IAAAoiD,GAAvDA,EAAyD7nD,SAASP,IACjEgxB,GAAYhxB,EAAKuoD,MAASvoD,EAAKs6B,QAAS,IAExC,MAAMgrB,EAAgBt0B,EACtB,OACIvvB,EAAAA,cAAA,KAAGkI,UAAW,qCACV27C,GAAiBA,EAAgB,EACjC7jD,EAAAA,cAAAA,EAAAA,SAAA,KACQA,EAAAA,cAAA,QAAMkI,UAAU,4BAA4B3K,EAAMiI,UAAU4J,eAC5DpP,EAAAA,cAACskC,EAAAA,eAAc,CACX9iC,KAAM,CACF6xB,MAAO,CAAEmxB,wBAAyBX,IAEtC7xC,mBAAe5V,EACfT,QAAS4B,EAAM5B,QACfuB,GAAIK,EAAML,GACV0L,SAAUrL,EAAMqL,SAChBV,UAAW,8BAGnB,KAGhB,CA3D2Du8C,CAAgBlnD,GACtDkpD,EAAQ,KAAOC,EAAap2B,MAAMX,eAzEvD,SAAkCpyB,GAAyB,IAAAwpD,EACvD,MAAMC,EAAwC,QAA7BD,EAAGxpD,EAAMiE,KAAKolD,SAASnlD,cAAM,IAAAslD,OAAA,EAA1BA,EAA4BF,aAAa/qD,KAAKmrD,YAClE,IAAIC,EAAsB,EASI,IAAAC,EAA9B,OARGH,GACCA,EAAYloD,SAAQsoD,IAChB,GAAIA,EAAWC,WAAY,CACvB,MAAMC,EAA2BF,EAAWG,YAAcH,EAAWG,YAAc,EACnFL,GAAuBI,MAIR,GAAvBJ,EACyB,QAAzBC,EAAO5pD,EAAMmpD,oBAAY,IAAAS,GAAO,QAAPA,EAAlBA,EAAoB72B,aAAK,IAAA62B,OAAA,EAAzBA,EAA2B33B,SAIlCxvB,EAAAA,cAAA,KAAGkI,UAAW,oCACVg/C,GAAuBA,EAAsB,EAC7ClnD,EAAAA,cAAAA,EAAAA,SAAA,KACQA,EAAAA,cAAA,QAAMkI,UAAU,4BAA4B3K,EAAMiI,UAAU8J,eAC5DtP,EAAAA,cAACskC,EAAAA,eAAc,CACX9iC,KAAM,CACF6xB,MAAO,CAAEmxB,wBAAyB0C,IAEtCl1C,mBAAe5V,EACfT,QAAS4B,EAAM5B,QACfuB,GAAIK,EAAML,GACV0L,SAAUrL,EAAMqL,SAChBV,UAAW,8BAGnB,KAGhB,CAwCqBs/C,CAAyBjqD,GAtI9C,SAA6BA,GAAyB,IAAAkqD,EAAAC,EAAAC,EAAAC,EAAAC,EAClD,MAAMX,GAAgD,QAA1BO,EAAAlqD,EAAMiE,KAAKolD,SAASnlD,cAAM,IAAAgmD,OAAA,EAA1BA,EAA4BZ,aAAa/qD,KAAKgsD,gBAA0C,QAA9BJ,EAAInqD,EAAMiE,KAAKolD,SAASnlD,cAAM,IAAAimD,OAAA,EAA1BA,EAA4Bb,aAAa/qD,KAAKgsD,eAAgB,EAClJ/xC,GAA4C,QAA1B4xC,EAAApqD,EAAMiE,KAAKolD,SAASnlD,cAAM,IAAAkmD,OAAA,EAA1BA,EAA4Bd,aAAa/qD,KAAKisD,wBAAkD,QAA9BH,EAAIrqD,EAAMiE,KAAKolD,SAASnlD,cAAM,IAAAmmD,OAAA,EAA1BA,EAA4Bf,aAAa/qD,KAAKisD,uBAAwB,EAC9Jf,EAAwC,QAA7Ba,EAAGtqD,EAAMiE,KAAKolD,SAASnlD,cAAM,IAAAomD,OAAA,EAA1BA,EAA4BhB,aAAa/qD,KAAKmrD,YAElE,IAAIe,EAA8B,EAC9BC,EAA6B,EAC7BC,GAAmB,EACnBC,EAA4B,EAC5BC,EAA2B,EAC/B,MAAMC,EAAoB9qD,EAAM5B,QAAQsT,IAAI/K,OAAOmkD,kBAwBnD,OAtBGrB,GACCA,EAAYloD,SAAQsoD,IAChB,MAAME,EAA2BF,EAAWkB,iBAAmBlB,EAAWkB,iBAAmB,EACzFlB,EAAWmB,YAAcF,IACzBL,GAA+BV,GAE/BF,EAAWmB,YAAcF,IACzBD,GAA4Bd,MAOpCW,EAF2B,GAA5BG,GAAkCryC,GAAmBqyC,EAEvBryC,EAAkBiyC,EAGlBI,EAA2BJ,EAG5DE,EAAmBD,GAA8Bf,EACjDiB,EAA4BD,EAAmB,EAAIF,EAClB,GAA7BG,EACO,KAIPnoD,EAAAA,cAAA,KAAGkI,UAAW,yCACVigD,GAA6BA,EAA4B,EACzDnoD,EAAAA,cAAAA,EAAAA,SAAA,KACQA,EAAAA,cAAA,QAAMkI,UAAU,4BAA0B,iBAC1ClI,EAAAA,cAACskC,EAAAA,eAAc,CACX9iC,KAAM,CACF6xB,MAAO,CAAEmxB,wBAAyB2D,IAEtCn2C,mBAAe5V,EACfT,QAAS4B,EAAM5B,QACfuB,GAAIK,EAAML,GACV0L,SAAUrL,EAAMqL,SAChBV,UAAW,8BAGnB,KAGhB,CA8EqBsgD,CAAoBjrD,GAEpBA,EAAM2G,OAAOwgD,YAAc,KAAOgC,EAAap2B,MAAMZ,IAuD1E,SAA2BnyB,GAAyB,IAAAkrD,EAEhD,MAAMC,EAAuC,QAA7BD,EAAGlrD,EAAMiE,KAAKolD,SAASnlD,cAAM,IAAAgnD,OAAA,EAA1BA,EAA4B5B,aAAa/qD,KAAKw3B,YACjE,OACItzB,EAAAA,cAAA,KAAGkI,UAAW,uCACVwgD,GAAcA,EAAa,EAC3B1oD,EAAAA,cAAAA,EAAAA,SAAA,KACQA,EAAAA,cAAA,QAAMkI,UAAU,4BAA4B3K,EAAMiI,UAAUgJ,kBAC5DxO,EAAAA,cAACskC,EAAAA,eAAc,CACX9iC,KAAM,CACF6xB,MAAO,CAAEmxB,wBAAyBkE,IAEtC12C,mBAAe5V,EACfT,QAAS4B,EAAM5B,QACfuB,GAAIK,EAAML,GACV0L,SAAUrL,EAAMqL,SAChBV,UAAW,8BAGnB,KAGhB,CA5EqBygD,CAAkBprD,GAClBmpD,EAAap2B,MAAMlB,QACnBs3B,EAAap2B,MAAMnB,SACnBs3B,EAAQ,KAAOC,EAAap2B,MAAM1gB,WAClC62C,EAAO,KA9C5B,SAA6BlpD,GAAyB,IAAAqrD,EAElD,MAAMC,EAA2C,QAA7BD,EAAGrrD,EAAMiE,KAAKolD,SAASnlD,cAAM,IAAAmnD,OAAA,EAA1BA,EAA4B/B,aAAa/qD,KAAK+sD,eACrE,OACI7oD,EAAAA,cAAA,KAAGkI,UAAW,4CACT2gD,GAAkBA,EAAiB,EACpC7oD,EAAAA,cAAAA,EAAAA,SAAA,KACQA,EAAAA,cAAA,QAAMkI,UAAU,4BAA4B3K,EAAMiI,UAAUsjD,mBAC5D9oD,EAAAA,cAACskC,EAAAA,eAAc,CACX9iC,KAAM,CACF6xB,MAAO,CAAEmxB,wBAAyBqE,IAEtC72C,mBAAe5V,EACfT,QAAS4B,EAAM5B,QACfuB,GAAIK,EAAML,GACV0L,SAAUrL,EAAMqL,SAChBV,UAAW,8BAGnB,KAGhB,CAwBmC6gD,CAAoBxrD,KAUvD,SAAoCA,GAA8C,IAAAyrD,EAAAC,EAC9E,MAAMC,GAA2C,QAA1BF,EAAAzrD,EAAMiE,KAAKolD,SAASnlD,cAAM,IAAAunD,OAAA,EAA1BA,EAA4BnC,aAAa/qD,KAAKqtD,2BAA4B,EAC3FtF,IAA2C,QAA1BoF,EAAA1rD,EAAMiE,KAAKolD,SAASnlD,cAAM,IAAAwnD,OAAA,EAA1BA,EAA4BpC,aAAa/qD,KAAKstD,YAAa,GAAKF,EAEjFG,EAAqB9rD,EAAM2G,OAAOmlD,mBAExC,IAAKA,IAAuBxF,GAAiBA,GAAiBwF,EAC1D,OAAO,KAEX,OAAOrpD,EAAAA,cAAA,OAAKkI,UAAU,4BAA0B,wBACtBo+B,KAAK6d,KAAKkF,EAAqBxF,GAAc,WAAS7jD,EAAAA,cAAA,0BAEpF,CAlBSspD,CAA2B/rD,GAC3BgsD,EAAwBhsD,IAvBlB,IAwBL,EAmEV,MAAMgsD,EAA2BhsD,IAC7B,MAAM,UAAEisD,GAAcjsD,EAAM2G,OAE5B,OACIslD,GACIxpD,EAAAA,cAACoY,EAAAA,GAA0B,CACvBme,KAAMizB,EACNthD,UAAU,mCAEjB,EAwGT,EArGwE3K,IAAQ,IAAAksD,EAC5E,MAAM,QACFC,EAAO,cACPC,EAAa,YACbC,EAAW,cACXC,EAAa,UACbC,EAAS,UACTC,EAAS,iBACTC,EAAgB,UAChBC,EAAS,sBACTC,EAAqB,uBACrBC,EAAsB,wBACtBC,EAAuB,kBACvBC,EAAiB,QACjBC,EAAO,MACPC,EAAK,MACLniD,EAAK,WACLoiD,EAAU,UACV1E,EAAS,iBACT2E,EAAgB,mBAChBC,EAAkB,mBAClBC,GACAptD,EAEJ,IAAIqtD,GAAS,EACb,GAAGl2B,EAAAA,GAAiBrc,UAAW,CAC3B,MAAMwyC,EAAc7J,UAAU1oC,OAAOC,SAAS0oC,QACxC6J,EAA6B,IAAIC,gBAAgBF,GACvD,GAAuC,OAAnCC,EAAU5iC,IAAI,kBAA6B4iC,EAAUvP,IAAI,cAAe,CACxE,MAAMyP,EAAaF,EAAU5iC,IAAI,cAGV,aAFA4iC,EAAU5iC,IAAI,WAAa,YAEd8iC,IAChCJ,GAAS,IAKrB,MAAMnE,EAAoF,SAA/D,QAAbgD,EAAAlsD,EAAM5B,eAAO,IAAA8tD,GAAS,QAATA,EAAbA,EAAe/lD,eAAO,IAAA+lD,GAAK,QAALA,EAAtBA,EAAwBx6C,WAAG,IAAAw6C,GAAU,QAAVA,EAA3BA,EAA6BrwC,gBAAQ,IAAAqwC,OAAA,EAArCA,EAAuCpwC,kCASrD,OACIrZ,EAAAA,cAACi1B,EAAAA,OAAMr2B,OAAA2K,OAAA,GAAKogD,IACNE,GAAiB7pD,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKqgD,GAAcxhD,IACzCyhD,GACE7pD,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKugD,EAAS,CAAE5hD,UAAW,GAAG4hD,EAAU5hD,aAAa0iD,EAAS,kBAAoB,OAClFN,EAEGM,EACI5qD,EAAAA,cAAA,OAAKkI,UAAU,4BACXlI,EAAAA,cAAA,OAAKkI,UAAU,sCAEnB,KAEPqiD,EACAb,GACG1pD,EAAAA,cAAAA,EAAAA,SAAA,KACIA,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKwgD,GACLS,EACDxqD,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK6gD,GACLM,GAEL1qD,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKygD,GACLS,EACAE,GAEJlE,EA/BrBzmD,EAAAA,cAAA,OAAKkI,UAAU,oBACXlI,EAAAA,cAAA,iJA8BkD,MAEtCA,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK0gD,GACL56B,EAAyB9xB,GAC1ByC,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK2gD,GACNlqD,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK6gD,GACLM,GAEJD,EACAE,GAEJ7E,GAAa9lD,EAAAA,cAACgmD,EAAkBpnD,OAAA2K,OAAA,GAAKu8C,IACtC9lD,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK4gD,GACNnqD,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK6gD,GACLM,GAEJD,EACAE,MAOxBd,GAAiBQ,EACb,uKCzVX,MAAO1J,UAAiB3gD,EAAAA,cAsB1B/E,YAAYsC,GACR0C,MAAM1C,GAtBF,KAAAqjD,eAAiC,IAAIC,EAAAA,EAAexlD,KAAKkC,MAAM5B,QAAQsT,IAAI/K,OAAO48C,yBAEnF,KAAArgD,MAAwB,CAC3BkC,gBAAiB,IAGb,KAAAo+C,iBAAoBr+C,GAGL,GAAGA,YAFFs+C,UAAU1oC,OAAOC,SAAS0oC,qBAC/B3oC,OAAOC,SAASC,SAK3B,KAAA0oC,WAAcx+C,IAClBrH,KAAKulD,eAAeO,MAAM9lD,KAAK0lD,iBAAiBr+C,GAAS,EAIrD,KAAAxC,gCAA0C,EAkL1C,KAAA6wB,kBAAqBlwB,GAClBA,GAAiB,CACpBC,UAAW,CACPC,GAAI,CAAEC,EAAG,gBAAiBC,EAAG,EAAGC,EAAG,GACnCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCE,GAAI,CAAEJ,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,IAEzCG,UAAU,GAIV,KAAA2vB,2BAA8BzvB,IAClC,GAAIlG,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAAQ,CAC7B,MAAM/F,EAAQ,CACVgG,YAAa,CAACH,EAAiBI,OAAQC,aAE3CvG,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAAOI,gBAAgBnG,GACvCiE,MAAK,KACFtE,KAAKm2B,gBACA3xB,OAAO1B,IACJ9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,0BAA0B,GACvD,IAETnC,OAAO1B,IACJ9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,6BAA6B,MAKhE,KAAAo/C,8BAAgC,CAAC3/C,EAAsCS,KACrD,UAAlBT,EAAOU,QAAsBD,GAC7B7G,KAAK21B,2BAA2B9uB,IAIhC,KAAAm/C,wBAA0B,CAACh/C,EAA4BC,KAC3D,GAAIjH,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAAQ,CAC7B,MAAM/F,EAAQ,CACV04C,WAAY/xC,EAAiBV,OAAQC,WACrC0/C,YAAah/C,EACbmb,qBAAsB,CAAE8jC,oCAAqClmD,KAAK6E,iCAEtE7E,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAAO+/C,uBAAuB9lD,GAC9CiE,MAAM8B,GACmB,YAAlBA,EAAOU,SACP9G,KAAKm2B,gBAAgB3xB,OAAO1B,IACxB9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,0BAA0B,KAElD,KAIdnC,OAAO1B,IACJ9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,sCAAsC,IAI7E,OAAO,CAAK,EAGR,KAAAy/C,2BAA6B,KACjCpmD,KAAKm2B,gBAAgB3xB,OAAO1B,IACxB9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,0BAA0B,GACvD,EAhPF3G,KAAKoxB,iBAAmBpxB,KAAKoxB,iBAAiB1oB,KAAK1I,KACvD,CAEOG,0BAIHH,KAAK6E,qCAAuC7E,KAAK+I,oCAC7C/I,KAAK6E,sCACC7E,KAAKm2B,gBAGfn2B,KAAK6lD,WAAW,sBACpB,CAEOn8C,SACH,OACI/E,EAAAA,cAAA,MAAApB,OAAA2K,OAAA,CAAKrB,UAAW7M,KAAKkC,MAAM2K,UAAWhL,GAAI7B,KAAKkC,MAAML,IAAQ7B,KAAKkC,MAAMgxB,uBAAuBlzB,KAAKkC,QAC/FlC,KAAKkC,MAAM6K,MACZpI,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKlO,KAAKkC,MAAM+K,kBAChBjN,KAAKoxB,oBAETpxB,KAAKkC,MAAMuL,qBACR9I,EAAAA,cAAE8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKlO,KAAKkC,MAAMgL,qBACjBlN,KAAKkC,MAAMuL,oBACXumB,EAAyBh0B,KAAKkC,MAAM0L,sBAAuB5N,KAAKkC,MAAMiL,kBAAmBnN,KAAKkC,OAC9FlC,KAAKoF,MAAMkC,gBAAgB9E,OAAS,EAAI6jD,EAAkBrmD,KAAKkC,MAAMuO,oBAAsB,KAC3Fm/C,EAAsB5vD,KAAKkC,OAC3BlC,KAAKkC,MAAM2G,OAAO09C,uBAAyB5hD,EAAAA,cAAA,OAAKkI,UAAU,wBAAwB7M,KAAKkC,MAAM2G,OAAO09C,wBAAgC,KACrI5hD,EAAAA,cAAA,OAAKkI,UAAW,wBACX7M,KAAKkC,MAAM8L,2BACXhO,KAAKkC,MAAM5B,QAAQ+H,SAAWrI,KAAKkC,MAAM5B,QAAQ+H,QAAQ2B,MAAQhK,KAAKkC,MAAM5B,QAAQ+H,QAAQ2B,KAAKC,gBAAkB,KAAOtF,EAAAA,cAAA,OAAKkI,UAAU,+BAA+B7M,KAAKkC,MAAMiI,UAAUq8C,SAC9L7hD,EAAAA,cAAA,OAAKkI,UAAW,oCAuWP1C,EAtWwBnK,KAAKkC,MAAMiI,UAwWhExF,EAAAA,cAACsJ,EAAAA,OAAM,CACHpB,UAAW,+BACXoY,QAASwhC,GAERt8C,EAAU2E,4BA3WU9O,KAAKkC,MAAMoM,yBAK3BtO,KAAKkC,MAAM+N,eAgW5B,IAAqC9F,CA7VjC,CAEQinB,mBACJ,MAAM,cAAEqC,GAAkBzzB,KAAKkC,MAAMiI,UAErC,GAAInK,KAAKkC,MAAMmO,kBACX,OAAO1L,EAAAA,cAAAA,EAAAA,SAAA,KAAG3E,KAAKkC,MAAMmO,mBAEzB,MAAM/N,EAAYtC,KAAK0K,gBACvB,OAAIpI,EACOA,EAAUb,KAAI,CAACuC,EAAUD,IAExBY,EAAAA,cAAA,OAAKkI,UAAU,sBAAsB/I,IAAKC,GACrCC,EAAS6C,SACT6/C,EAAkB1iD,EAAUhE,KAAKkC,MAAMiI,UAAWnK,KAAKkC,MAAM+N,eAC9DtL,EAAAA,cAAA,OAAKkI,UAAU,+BACV7I,EAAS6tB,cACT7tB,EAASgrB,WAMlBhvB,KAAKkC,MAAMqO,eAEX5L,EAAAA,cAAA,OAAKkI,UAAU,wBACXlI,EAAAA,cAAA,KAAGkI,UAAU,iBAAiB4mB,GAC7BzzB,KAAKkC,MAAM2M,sBAEhBlK,EAAAA,cAAAA,EAAAA,SAAA,KAAG3E,KAAKkC,MAAMiO,iBAG9B,CAEQzF,gBACJ,MACIvE,MACI1F,MAAQ2F,OAAQ3F,GAChB8X,WAAanS,OAAQmS,GACrBzI,gBAAkB1J,OAAQ0J,GAC1BC,qBAAuB3J,OAAQ2J,IAEnCzP,SACI+H,SACIuC,SAAS,uBACL4N,GACA,CAAEA,4BAAwBzX,KAGtC8H,OAAQA,EAAM,UACdhG,EAAS,UACTsH,EAAS,QACTsO,GACAzY,KAAKkC,MAEHsD,EAAgBxF,KAAK01B,kBAAkB7sB,EAAOrD,eAE9C8B,EAA+CtH,KAAKoF,MAAMkC,gBAChE,IAAIoR,EAA0B,GAI9B,OAHID,GAAWlV,OAAOM,KAAK4U,GAASjW,OAAS,GAAKiW,EAAQxI,eAAiBwI,EAAQxI,cAAczN,OAAS,IACtGkW,EAAkBD,EAAQxI,cAAc,GAAGpO,IAExC7B,KAAKkC,MAAMiE,KAAKxF,UAAYX,KAAKkC,MAAMiE,KAAKxF,SAASyF,QAAU3F,GAAQA,EAAKA,KAAKyI,WAAazI,EAAKA,KAAKyI,UAAU1G,OAAS,GAC9HmW,EAAAA,EAAAA,GAAc,CACVxW,UAAW1B,EAAKA,KAAKyI,UACrB0P,sBAAuBF,EACvBpR,gBAAiBA,EACjB3G,SAAUX,KAAKkC,MAAMiE,KAAKxF,SAASyF,OACnC4E,qBAAsBhL,KAAKkC,MAAMiE,KAAK6E,qBAAqB5E,OAC3DyS,uBAAwB7Y,KAAKkC,MAAMiE,KAAK2S,gBAAgB1S,OACxDZ,cAAeA,EACfwT,oBAAqBhZ,KAAKkC,MAAM5B,QAAQsT,IAAI/K,OAAOoQ,mBAAoB,EACvEC,oBAAqBlZ,KAAKkC,MAAM5B,QAAQsT,IAAI/K,OAAOuQ,2BACnDG,aAAcvZ,KAAKkC,MAAM5B,QAAQ+H,QAAQkR,aACzCjZ,QAASN,KAAKkC,MAAM5B,QACpBiN,SAAUvN,KAAKkC,MAAMqL,SACrB1L,GAAI7B,KAAKkC,MAAML,GACfsI,UAAW,CACPsP,WAAY,QACZE,YAAa,UACbE,aAAc1P,EAAU2P,kCACxBC,YAAa5P,EAAU6P,0BACvBG,sBAAuBhQ,EAAUiQ,oBACjCC,uBAAwBlQ,EAAUkQ,uBAClCC,yBAA0BnQ,EAAUmQ,yBACpCC,yBAA0BpQ,EAAUoQ,yBACpCC,mBAAoBrQ,EAAUqQ,mBAC9B5D,kBAAmBzM,EAAUyM,kBAC7BC,iBAAkB1M,EAAU0M,iBAC5B4D,oBAAqBtQ,EAAUuQ,iBAEnC7X,UAAWA,EACXgY,wBAAyB1Q,EAAU0Q,wBACnCC,6BAA8B3Q,EAAU2Q,6BACxCC,iBAAkB5Q,EAAU6Q,qBAC5BC,WAAY9Q,EAAU+Q,uBACtBC,aAAchR,EAAUiR,oBACxBC,gBAAiBlR,EAAUmR,uBAC3BC,0BAA2Bvb,KAAKkC,MAAMiE,KAAKoV,0BAA0BnV,OACrEoV,eAAgBrR,EAAU2H,uBAC1B2J,kBAAmBtR,EAAUuR,8BAC7BC,qBAAsBxR,EAAUyR,6BAChCC,UAAW7b,KAAKkC,MAAMiE,KAAK1F,KAAK2F,OAChC0V,iBAAkB9b,KAAKkC,MAAMiE,KAAK2V,iBAAiB1V,OACnD8J,uBAAwBlQ,KAAK21B,2BAC7B/uB,6BAA8B5G,KAAK+lD,8BACnChqC,sCAAuC/b,KAAKgmD,wBAC5ChqC,uBAAwBhc,KAAKomD,2BAC7B7tC,UAAWA,EACX0D,oBAAqB9R,EAAU8R,oBAC/BC,uBAAwB1D,EACxB2D,cAAetT,EAAOuT,qBACtBC,gCAAiCxT,EAAOwT,gCACxClU,iBAAkBnI,KAAKkC,MAAMiG,iBAC7BtD,+BAAgC7E,KAAK6E,+BAErCqK,kCAAmClP,KAAKmP,2CAA2ChF,GACnFiF,mCAAoCpP,KAAKqP,0CAA0ClF,GACnFmS,wCAAyCtc,KAAKqW,iDAAiDlM,GAC/FqF,uDAAwDxP,KAAKyP,gEAAgEtF,GAE7HoS,6BAA8BpS,EAAUoS,6BACxCE,0BAA2BtS,EAAUsS,0BACrCC,4BAA6BvS,EAAUuS,4BACvC5M,eAAgBA,EAChBC,oBAAqBA,IAEzB,IACR,CA6EQ5P,0CAAuC,IAAA0d,EAC3C,MAAMC,EAA4D,QAArBD,EAAG7d,KAAKkC,MAAM5B,eAAO,IAAAud,GAAS,QAATA,EAAlBA,EAAoBxV,eAAO,IAAAwV,GAAK,QAALA,EAA3BA,EAA6BjK,WAAG,IAAAiK,GAAU,QAAVA,EAAhCA,EAAkCE,gBAAQ,IAAAF,OAAA,EAA1CA,EAA4CG,iCAC5F,GAAgD,SAA5CF,EACA,OAAO,EAGX,IAAI,IAAAL,EACA,MAAMD,QAAwBxd,KAAKkC,MAAMiE,KAAKkF,aAK9C,MADK,QAFDoS,EAAAD,EAAgBlS,MACZD,GAAsC,oEAAtBA,EAAaE,cAChC,IAAAkS,OAAA,EAFDA,EAEGhS,aAAa,GAEhB,OAAO,EAEb,MAAO3I,GAGL,OAFA9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,iCACpB,EAGX,GAAgD,QAA5CmX,EACA,OAAO,EAEX,IACI,MAAMG,QAAqBje,KAAKkC,MAAMiE,KAAK4J,oBAC3C,QACMkO,IAC4C,QAA5CH,GAAqDG,EAAaC,OACnB,QAA5CJ,IAAsDG,EAAaC,OAE9E,MAAOpb,GAGL,OAFA9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,gCACpB,EAEf,CAEQxG,sBAAyC,IAAAwmD,EAAA,IAArBC,IAAAviC,UAAA7hB,OAAA,QAAAzB,IAAAsjB,UAAA,KAAAA,UAAA,GACxB,IAAKrkB,KAAK6E,+BACN,OAAOwY,EAAAA,YAAYlc,UAGvB,MACIgF,MAAQ1F,KAAMA,IACdT,KAAKkC,MACT,IAAI2kD,EACJ,IACIA,QAAmBpmD,EACrB,MAAOqC,GAGL,OAFA9C,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,sBACpB0W,EAAAA,YAAYlc,UAEvB,MAAM+3B,EAA6B,QAAlBytB,EAAGE,EAAWpmD,YAAI,IAAAkmD,OAAA,EAAfA,EAAiBxtB,QACrC,IAAID,EA8BA,OADAl5B,KAAKkC,MAAMW,UAAU6D,QAAQ,uDACtB2W,EAAAA,YAAYlc,UA7BnB,IAAI,IAAA2lD,EACA,MAAMC,QAAoDC,EAAAA,EAAAA,0BAAyB,CAAE3lD,cAAerB,KAAKkC,MAAM5B,QAAQ4H,eAA2B,QAAZ4+C,EAAED,SAAU,IAAAC,GAAM,QAANA,EAAVA,EAAYrmD,YAAI,IAAAqmD,OAAA,EAAhBA,EAAkBzlB,GAAInI,GAE9J,OADAl5B,KAAKkF,SAAS,CAAEoC,gBAAiBy/C,EAAiBE,+BAAiC,KAC5E5pC,EAAAA,YAAYlc,UACrB,MAAO2B,GACL,GAAI8jD,GAAwB,2DAAf9jD,EAAMixC,KAAmE,CAClF,UACU8S,EAAWK,YAAY,CAAC,GAChC,MAAOC,GAGL,OAFAnnD,KAAKkC,MAAMW,UAAU6D,QAAQygD,GAC7BnnD,KAAKkC,MAAMW,UAAU8D,MAAM,0BACpB0W,EAAAA,YAAYlc,UAEvB,IAEI,aADMnB,KAAKm2B,eAAc,GAClB9Y,EAAAA,YAAYlc,UACrB,MAAOimD,GAGL,OAFApnD,KAAKkC,MAAMW,UAAU6D,QAAQ0gD,GAC7BpnD,KAAKkC,MAAMW,UAAU8D,MAAM,2BACpB0W,EAAAA,YAAYlc,WAM3B,OAFAnB,KAAKkC,MAAMW,UAAU6D,QAAQ5D,GAC7B9C,KAAKkC,MAAMW,UAAU8D,MAAM,2BACpB0W,EAAAA,YAAYlc,UAM/B,CAEQgO,2CAA2ChF,GAC/C,MAAO,CACHyL,yBAA0BzL,EAAUyL,yBAEpCC,wBAAyB1L,EAAU0L,wBACnCC,4BAA6B3L,EAAU2L,4BAEvCC,gCAAiC5L,EAAU4L,gCAC3CC,iCAAkC7L,EAAU6L,iCAC5CC,sCAAuC9L,EAAU8L,sCAEjDC,oBAAqB/L,EAAU+L,oBAC/BC,wBAAyBhM,EAAUgM,wBACnCC,cAAejM,EAAUiM,cAEjC,CAEQC,iDAAiDlM,GACrD,MAAO,CACHmM,4BAA6BnM,EAAUmM,4BACvCC,2BAA4BpM,EAAUoM,2BACtCC,0CAA2CrM,EAAUqM,0CACrDC,6CAA8CtM,EAAUsM,6CACxDC,0CAA2CvM,EAAUuM,0CACrDC,cAAexM,EAAUwM,cACzBC,kBAAmBzM,EAAUyM,kBAC7BC,iBAAkB1M,EAAU0M,iBAEpC,CAEQpH,gEAAgEtF,GACpE,MAAO,CACHiN,yBAA0BjN,EAAUiN,yBACpCC,8BAA+BlN,EAAUkN,8BACzCC,yBAA0BnN,EAAUmN,yBACpCC,+BAAgCpN,EAAUoN,+BAElD,CAEQlI,0CAA0ClF,GAC9C,MAAO,CACHqN,yBAA0BrN,EAAUsN,0BACpCC,wBAAyBvN,EAAUwN,mBACnCC,2BAA4BzN,EAAUyN,2BACtCC,yBAA0B1N,EAAU2N,+BAEpCC,yBAA0B5N,EAAU4N,yBAEpCC,yBAA0B7N,EAAU8N,8BACpCC,+BAAgC/N,EAAUgO,yCAElD,EAEJ,UAaA,SAASsuC,IACLxpC,OAAOoqC,QAAQC,MACnB,CAEA,MAAMZ,EAAoBA,CAAC1iD,EAA+BmG,EAA2B8F,KACjF,IAAKjM,EAASwtB,gBAAkBvhB,EAC5B,OAAO,KAGX,MAAM,uBAAEiL,EAAsB,yBAAEqsC,EAAwB,oBAAEnsC,EAAmB,8BAAEosC,EAA6B,uBAAElsC,GAA2BnR,EAEnIkoB,EAAkBruB,EAASwtB,cAAca,gBAI/C,OACI1tB,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKlK,EAASwtB,cAAcE,gBAC7B/sB,EAAAA,cAAA,OAAKkI,UAAU,+BACVwlB,EAAkB1tB,EAAAA,cAAA,QAAMkI,UAAU,WAAW26C,GAAwC7iD,EAAAA,cAAA,QAAMkI,UAAU,QAAQ06C,IAG9Gl1B,GACA1tB,EAAAA,cAAA,OAAKkI,UAAU,oCACXlI,EAAAA,cAAA,QAAMkI,UAAU,0CAA0C7I,EAASwtB,cAAcsB,aACjFnuB,EAAAA,cAACsJ,EAAAA,OAAM,CAACpB,UAAU,mCAAmCoY,QAXhDhgB,GAAkDjB,EAASwtB,eAAiBxtB,EAASwtB,cAAcoY,UAAUsQ,aAAY,IAWlD5+B,IAGpF3W,EAAAA,cAACsJ,EAAAA,OAAM,CAACpB,UAAU,2BAA2BoY,QAfhChgB,GAAkDjB,EAASwtB,eAAiBxtB,EAASwtB,cAAcoY,UAAUsQ,aAAa7nB,IAenEA,EAAkBnX,EAAyBE,GAC5G,EAITirC,EAAqBpzB,GAClBA,GAAyC,IAA5BA,EAAUjgB,OAAOxQ,OAI/BmC,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK+kB,EAAUzgB,SACf,2DAJE,KASTo9C,EAAyB1tD,IAAiC,IAAAmmD,EAAAW,EAAAM,EAAAC,EAAAC,EAC5D,MAAMhB,EAAuC,QAA1BH,EAAInmD,EAAMiE,KAAK1F,KAAK2F,cAAM,IAAAiiD,GAAM,QAANA,EAAtBA,EAAwB5nD,YAAI,IAAA4nD,OAAA,EAA5BA,EAA8BwH,gBAC/C,QAAExnD,GAAYnG,EAAM5B,QACpBwvD,EAASznD,GAAWA,EAAQxI,aAAewI,EAAQxI,YAAYkwD,IAC/DC,EAASF,GAAqB,SAAXA,EACzB,IAAIG,EAAe,IACnB,MAAMC,EAAgBhuD,EAAMiE,KAAK4J,oBAAoB3J,OAAQ+pD,kBAC7D,GAAGH,EACC,OAAOE,GACH,IAAK,UACDD,EAAe,KACf,MACJ,IAAK,UAGL,IAAK,UACDA,EAAe,IACf,MACJ,QACIA,EAAe,IAI3B,SAD2C,QAAtBjH,EAAA9mD,EAAMiE,KAAK1F,KAAK2F,cAAM,IAAA4iD,OAAA,EAAtBA,EAAwBvoD,QAA8B,QAA1B6oD,EAAIpnD,EAAMiE,KAAK1F,KAAK2F,cAAM,IAAAkjD,OAAA,EAAtBA,EAAwB7oD,KAAKyI,YAA+D,KAA5B,QAAtBqgD,EAAArnD,EAAMiE,KAAK1F,KAAK2F,cAAM,IAAAmjD,OAAA,EAAtBA,EAAwB9oD,KAAKyI,UAAU1G,SAAqE,cAA/B,QAAtBgnD,EAAAtnD,EAAMiE,KAAK1F,KAAK2F,cAAM,IAAAojD,OAAA,EAAtBA,EAAwB/oD,KAAKyI,UAAU,GAAG0hB,UAC1K49B,EAAgByH,EAE9BtrD,EAAAA,cAAA,OAAKkI,UAAU,wCACVlI,EAAAA,cAAA,+CAAuCsrD,EAAY,iDAIzD,IAAI,EAGTj8B,EAA2BA,CAACC,EAAmD9mB,EAA+BjL,KAA8D,IAAAipD,EAC9K,IAAKl3B,EACD,OAAO,KAEX,MAAMm3B,EAAoF,SAA/D,QAAbD,EAAAjpD,EAAM5B,eAAO,IAAA6qD,GAAS,QAATA,EAAbA,EAAe9iD,eAAO,IAAA8iD,GAAK,QAALA,EAAtBA,EAAwBv3C,WAAG,IAAAu3C,GAAU,QAAVA,EAA3BA,EAA6BptC,gBAAQ,IAAAotC,OAAA,EAArCA,EAAuCntC,kCACrD,OACIrZ,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKf,GACLi+C,EAAO,KAAOlpD,EAAMkL,UACpBg+C,EAAOn3B,EAAkBC,SAStC,SAAyBhyB,GAAsC,IAAAkuD,EAC3D,MAAM5H,EAAuC,QAA1B4H,EAAIluD,EAAMiE,KAAK1F,KAAK2F,cAAM,IAAAgqD,GAAM,QAANA,EAAtBA,EAAwB3vD,YAAI,IAAA2vD,OAAA,EAA5BA,EAA8BnH,SACrD,OACItkD,EAAAA,cAAA,KAAGkI,UAAW,qCACV27C,GAAiBA,EAAgB,EACjC7jD,EAAAA,cAAAA,EAAAA,SAAA,KACQA,EAAAA,cAAA,QAAMkI,UAAU,4BAA4B3K,EAAMiI,UAAU++C,sBAC5DvkD,EAAAA,cAACskC,EAAAA,eAAc,CACX9iC,KAAM,CACF6xB,MAAO,CAAEmxB,wBAAyBX,IAEtC7xC,mBAAe5V,EACfT,QAAS4B,EAAM5B,QACfuB,GAAIK,EAAML,GACV0L,SAAUrL,EAAMqL,SAChBV,UAAW,8BAGnB,KAGhB,CA9BiDu8C,CAAgBlnD,GACpDA,EAAM2G,OAAOwgD,YAAc,KA+BxC,SAAoBnnD,GAAsC,IAAAmuD,EAAAC,EAAAC,EACtD,MACMl8C,GADiBnS,EAAMzB,MAAQyB,EAAMzB,KAAKA,KAAK+sD,gBAAkB,GACrC,EAAGtrD,EAAMiI,UAAU+J,uBAAyBhS,EAAMiI,UAAUmK,kBAC9F,OACI3P,EAAAA,cAAA,KAAGkI,UAAW,sCACVlI,EAAAA,cAAA,QAAMkI,UAAU,4BAA4BwH,GACrB,QAAtBg8C,EAAAnuD,EAAMiE,KAAK1F,KAAK2F,cAAM,IAAAiqD,GAAM,QAANA,EAAtBA,EAAwB5vD,YAAI,IAAA4vD,GAA5BA,EAA8BG,YAAmC,QAAtBF,EAAApuD,EAAMiE,KAAK1F,KAAK2F,cAAM,IAAAkqD,GAAM,QAANA,EAAtBA,EAAwB7vD,YAAI,IAAA6vD,OAAA,EAA5BA,EAA8BE,WAAY,EAClF7rD,EAAAA,cAACskC,EAAAA,eAAc,CACX9iC,KAAM,CACF6xB,MAAO,CAAEmxB,wBAA+C,QAAxBoH,EAAEruD,EAAMiE,KAAK1F,KAAK2F,cAAM,IAAAmqD,GAAM,QAANA,EAAtBA,EAAwB9vD,YAAI,IAAA8vD,OAAA,EAA5BA,EAA8BC,YAEpE75C,cAAezU,EAAMiI,UAAUyK,UAC/BtU,QAAS4B,EAAM5B,QACfuB,GAAIK,EAAML,GACV0L,SAAUrL,EAAMqL,SAChBV,UAAW,6BAGXlI,EAAAA,cAAA,QAAMkI,UAAU,4BAA4B3K,EAAMiI,UAAUuK,uBAIhF,CArD+C+7C,CAAWvuD,GAC7CkpD,GAAsCn3B,EAAkBK,eAAhDL,EAAkBC,SAA4E,KACtGk3B,EAAO,KAqDpB,SAA0BlpD,GAAsC,IAAAwuD,EAAAC,EAAAC,EAC5D,OACIjsD,EAAAA,cAAA,KAAGkI,UAAW,sCACVlI,EAAAA,cAAA,QAAMkI,UAAU,4BAA4B3K,EAAMiI,UAAU0mD,gBACrC,QAAtBH,EAAAxuD,EAAMiE,KAAK1F,KAAK2F,cAAM,IAAAsqD,GAAM,QAANA,EAAtBA,EAAwBjwD,YAAI,IAAAiwD,GAA5BA,EAA8Bz4B,aAA6D,KAAxB,QAAtB04B,EAAAzuD,EAAMiE,KAAK1F,KAAK2F,cAAM,IAAAuqD,GAAM,QAANA,EAAtBA,EAAwBlwD,YAAI,IAAAkwD,OAAA,EAA5BA,EAA8B14B,aACxEtzB,EAAAA,cAACskC,EAAAA,eAAc,CACX9iC,KAAM,CACF6xB,MAAO,CAAEmxB,wBAA+C,QAAxByH,EAAE1uD,EAAMiE,KAAK1F,KAAK2F,cAAM,IAAAwqD,GAAM,QAANA,EAAtBA,EAAwBnwD,YAAI,IAAAmwD,OAAA,EAA5BA,EAA8B34B,cAEpEthB,cAAezU,EAAMiI,UAAUyK,UAC/BtU,QAAS4B,EAAM5B,QACfuB,GAAIK,EAAML,GACV0L,SAAUrL,EAAMqL,SAChBV,UAAW,6BAGXlI,EAAAA,cAAA,QAAMkI,UAAU,4BAA4B3K,EAAMiI,UAAUuK,uBAIhF,CAzE2B+0C,CAAiBvnD,GAC/BkpD,EAAO,KA0EpB,SAA6BlpD,GAAqB,IAAA4uD,EAE9C,MAAMC,EAAiD,QAAzBD,EAAG5uD,EAAMiE,KAAK1F,KAAK2F,cAAM,IAAA0qD,GAAM,QAANA,EAAtBA,EAAwBrwD,YAAI,IAAAqwD,OAAA,EAA5BA,EAA8BC,yBAC/D,OACIpsD,EAAAA,cAAA,KAAGkI,UAAW,yCACTkkD,GAA4BA,EAA2B,EACpDpsD,EAAAA,cAAAA,EAAAA,SAAA,KACIA,EAAAA,cAAA,QAAMkI,UAAU,4BAA4B3K,EAAMiI,UAAU6mD,cAC5DrsD,EAAAA,cAACskC,EAAAA,eAAc,CACX9iC,KAAM,CACF6xB,MAAO,CAAEmxB,wBAAyB4H,IAEtCp6C,cAAezU,EAAMiI,UAAUyK,UAC/BtU,QAAS4B,EAAM5B,QACfuB,GAAIK,EAAML,GACV0L,SAAUrL,EAAMqL,SAChBV,UAAW,8BAGnB,KAGhB,CAhG2B6gD,CAAoBxrD,GAChC,sFC7hBf,MAmCA,EAnBoDA,GAChDyC,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKhM,EAAM02B,gBAAqB12B,EAAMgxB,uBAAuBhxB,IAC7DA,EAAMq2B,WACNr2B,EAAMy2B,iBACHh0B,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKhM,EAAMy2B,iBACXz2B,EAAMo1B,YACNp1B,EAAM8N,qCACPrL,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKhM,EAAM+K,kBAvBPmkB,EAAC9uB,EAAuDJ,IACxEI,EAIEA,EAAUb,KAAI,CAACuC,EAAUD,IAExBY,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKhM,EAAM22B,oBAAmB,CAAE/0B,IAAKC,IACrCC,EAAS6C,SACT7C,EAASitD,cACTjtD,EAASgrB,WARlB9sB,EAAM5B,QAAQuC,UAAUC,MAAM,kDACvB,MAoBoCsuB,CAAiBlvB,EAAMC,UAAWD,IACpEA,EAAM62B,WACN72B,EAAM8L,2BACN9L,EAAMoM,sBACNpM,EAAM42B,qGC5BvB,MAmCA,EAnCyD52B,IACrD,MAAM,iBACFu6B,EAAgB,aAChBG,EAAY,YACZG,EAAW,eACXxB,EAAc,qBACdmB,EAAoB,sBACpBC,EAAqB,cACrBG,EAAa,gBACbD,EAAe,YACfN,EAAW,WACXC,GACAt6B,EAEEgvD,EACF31B,GACAA,EAAe95B,KAAI,CAAC4F,EAAStD,IAErBY,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK0uB,EAAY,CAAE94B,IAAKC,EAAK,YAAY,MAAMghB,KAAK,YACrDpgB,EAAAA,cAAA,QAAMkI,UAAU,WAAWgwB,GAC1Bx1B,EAAQ6zB,MAAQv2B,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKwuB,EAAoB,CAAExB,KAAM7zB,EAAQ6zB,KAAMjW,QAASuX,KAC7En1B,EAAQ8yB,OAAS9yB,EAAQ8yB,MAAM33B,OAAS,GACrCmC,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKyuB,EAAqB,CAAExC,MAAO9yB,EAAQ8yB,MAAOlV,QAASsX,QAMpF,OACI53B,EAAAA,cAACi1B,EAAAA,OAAMr2B,OAAA2K,OAAA,GAAKuuB,GACR93B,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK4uB,EAAa,CAAE95B,MAAOkuD,KAC/Bn0B,EACI,sFC1BjB,MAAMo0B,EAA2BC,IAC7B,MAAM,eAAEC,EAAc,oBAAEC,EAAmB,QAAE9G,EAAO,OAAEx3C,EAAM,OAAEu+C,GAAWH,EAEzE,OACIzsD,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKmjD,GACN1sD,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKojD,GAAsB9G,GAC/Bx3C,EACAu+C,EACE,EASTC,EAAmBnb,IACrB,QAAkBt1C,IAAds1C,EAAyB,CACzB,MAAM,eAAEgb,EAAc,UAAEI,GAAcpb,EAEtC,OAAO1xC,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKmjD,GAAiBI,EAAUhwD,IAAI0vD,GAAiC,CAErF,OAAO,IAAI,EA8Ff,EA7C+DjvD,IAC3D,MAAM,oBACFyzC,EAAmB,aACnB/Y,EAAY,KACZwZ,EAAI,mBACJH,EAAkB,OAClBH,EAAM,UACNO,EAAS,iCACTH,EAAgC,6BAChCC,EAA4B,aAC5BhM,EAAY,OACZp3B,EAAM,UACNwjC,EAAS,QACTV,EAAO,aACPY,GACAv0C,EAEJ,OACIyC,EAAAA,cAACi1B,EAAAA,OAAMr2B,OAAA2K,OAAA,GAAKynC,GACP5iC,EACA8iC,GACGlxC,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK2nC,GACLY,aAAY,EAAZA,EAAc1R,YACd0R,aAAY,EAAZA,EAAcK,oBACdL,aAAY,EAAZA,EAActV,mBAGvBx8B,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK4nC,GACNnxC,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK0uB,GAhEP80B,EACftb,EACAjM,EACAwnB,EACAC,EACAC,EACAxb,IAEOlM,EACHxlC,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKyjD,GACNhtD,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK0jD,GACLxb,EAAK10C,QACL8vD,EAAgBnb,GAChBD,EAAKnvC,SACNtC,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK2jD,GAA2Bzb,EAAKrR,aACzCqR,EAAKtR,eAIdngC,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAKyjD,GACNhtD,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK2jD,GAA2Bzb,EAAKrR,aAC1CpgC,EAAAA,cAAC8sB,EAAAA,KAAIluB,OAAA2K,OAAA,GAAK0jD,GACLxb,EAAK10C,QACL8vD,EAAgBnb,GAChBD,EAAKnvC,SACLmvC,EAAKtR,eAwCD4sB,CACGtb,EACAjM,EACA8L,EACAC,EACAC,EACAE,GAEHn0C,EAAM6zC,eAGdQ,EACI,yHC1FjB,MAAMub,UAAkBntD,EAAAA,UAEpB/E,YAAYsC,EAAwBkD,GAChCR,MAAM1C,GAoBF,KAAA6vD,eAAkB5O,IACtB,MAAMrgD,EAA2B,KAAnBqgD,EAAEz0B,OAAO8M,MAAe,GAAKx7B,KAAKoF,MAAMtC,MACtD9C,KAAKkF,SAAS,CACV8sD,oBAAqB7O,EAAEz0B,OAAO8M,MAAO14B,MAAOA,EAC5CmvD,WAAU9O,EAAEz0B,OAAO8M,OACrB,EAGE,KAAA02B,gBAAmBr2C,IACvB,IAAKA,IAAcA,EAAUpb,KACzB,OAEJ,MAAM0xD,EAAenyD,KAAKoF,MAAM4sD,oBAEhCn2C,EAAUu2C,aAAa,CAAEhlD,UAAW+kD,IAC/B7tD,MAAK8B,IACoB,YAAlBA,EAAOU,QAEP9G,KAAKkF,SAAS,CAAE8sD,oBAAqB,GAAIlvD,MAAO,GAAImvD,UAAU,IAC9DjyD,KAAKqyD,kBAAkBF,IACK,iBAArB/rD,EAAOksD,UACdtyD,KAAKkF,SAAS,CAAEpC,MAAO9C,KAAKkC,MAAMwT,8BAElC1V,KAAKkF,SAAS,CAAEpC,MAAO9C,KAAKkC,MAAMqT,+BAGzC/Q,OAAM1B,IACH9C,KAAKkF,SAAS,CAAEpC,MAAO9C,KAAKkC,MAAMsT,+BAAgC,GACpE,EA0CF,KAAA+8C,YAAc,CAACr9C,EAA8BC,EAAkC0G,IAK/ElX,EAAAA,cAAA,QAAM6tD,SAJSvtD,IAA6CA,EAAMghB,iBAAkBjmB,KAAKkyD,gBAAgBr2C,EAAU,EAIxFhP,UAAU,kCACjClI,EAAAA,cAAA,OAAKkI,UAAU,yBACXlI,EAAAA,cAAA,SACIkI,UAAU,4BAA2B,aACzBqI,EACZwvB,SAAU1kC,KAAK+xD,eACfv2B,MAAOx7B,KAAKoF,MAAM4sD,oBAClBS,YAAav9C,IAEjBvQ,EAAAA,cAACsJ,EAAAA,OAAM,CACHlB,MAAOoI,EACPtI,UAAU,gCACVoY,QAfShgB,IAA0CjF,KAAKkyD,gBAAgBr2C,EAAU,EAgBlF1N,UAAWnO,KAAKoF,MAAM6sD,UAErB98C,KAOb,KAAAu9C,iBAAmB,CAAC72C,EAAmC5W,KAC3D,IAAK4W,EACD,OAEJ,MAAM82C,EAAO1tD,EAAM0pB,cAAcikC,aAAa,eAAiB,GAC/D/2C,EAAUg3C,iBAAiB,CACvBC,WAAY,CACRH,KAGHruD,MAAK8B,IACoB,YAAlBA,EAAOU,QACP9G,KAAKkF,SAAS,CAAEpC,MAAO,QAG9B0B,OAAM,KACHxE,KAAKkF,SAAS,CAAEpC,MAAO9C,KAAKkC,MAAMuT,kCAAkC,GACtE,EAGF,KAAAs9C,mBAAqB,CAACJ,EAAc92C,KACxC,KAAKA,GAAcA,EAAUpb,MAASob,EAAUpb,KAAKyI,WAAiD,IAApC2S,EAAUpb,KAAKyI,UAAU1G,QAAiBmwD,GACxG,OAEJ,IAAIK,EAAiB,EACrB,IAAK,MAAMzgD,KAAQsJ,EAAUpb,KAAKyI,UAC9B,GAAIqJ,EAAK0gD,cACL,IAAK,MAAMC,KAAgB3gD,EAAK0gD,cACxBC,EAAaC,eAAiBR,IAC9BK,GAAkBE,EAAaE,cAK/C,OAAyB,EAAlBJ,CAAmB,EAGtB,KAAAK,wBAA2BnxD,IAC/B,KAAKA,EAAMzB,MAASyB,EAAMzB,KAAKA,MAASyB,EAAMzB,KAAKA,KAAK6yD,SAAapxD,EAAMzB,KAAKA,KAAK6yD,QAAQ9wD,OAAS,GAClG,OAGJ,MAAMkwD,EAAoBztD,IAA0CjF,KAAK0yD,iBAAiBxwD,EAAMzB,KAAMwE,EAAM,EAE5G,OACIN,EAAAA,cAAAA,EAAAA,SAAA,KACIA,EAAAA,cAAA,OAAKkI,UAAU,4BACXlI,EAAAA,cAAA,OAAKkI,UAAU,oCAAoC7M,KAAKkC,MAAMkT,6BAC9DzQ,EAAAA,cAACskC,EAAAA,eAAc,CACX9iC,KAAM,CACF6xB,MAAO,CACHmxB,wBAAyBjnD,EAAMzB,KAAKA,KAAK+sD,iBAIjDltD,QAAW4B,EAAM5B,QACjBuB,GAAMK,EAAML,GACZ0L,SAAYrL,EAAMqL,SAClBV,UAAa,oCAIhB3K,EAAMzB,KAAKA,KAAK6yD,QAAQ7xD,KAAK8xD,IAC1B,MAAM34B,EAAY14B,EAAMsL,4BAA6BgmD,EAAAA,EAAAA,QAAOtxD,EAAMsL,2BAA4BtL,EAAMoT,gBAAiBi+C,EAAOxZ,MAAQ,GAEpI,OACIp1C,EAAAA,cAAA,OAAKb,IAAKyvD,EAAOxZ,KAAMltC,UAAU,kCAC7BlI,EAAAA,cAAA,OAAKkI,UAAU,8BACV0mD,EAAOxZ,KAAI,KACRp1C,EAAAA,cAACskC,EAAAA,eAAc,CACX9iC,KAAM,CACF6xB,MAAO,CACHmxB,wBAAyBnpD,KAAK+yD,mBAAmBQ,EAAOxZ,MAAQ,GAAI73C,EAAMzB,QAIlFH,QAAW4B,EAAM5B,QACjBuB,GAAMK,EAAML,GACZ0L,SAAYrL,EAAMqL,SAClBV,UAAa,wCACf,KAEVlI,EAAAA,cAACsJ,EAAAA,OAAM,CACHlB,MAAO7K,EAAMoT,gBACbzI,UAAW,mCACXoY,QAASytC,EAAgB,aACba,EAAOxZ,KAAI,aACXnf,GAEX14B,EAAMoT,iBAET,IAInB,EAnNPtV,KAAKoF,MAAQ,CACTquD,gBAAgB,EAChBzB,oBAAqB,GACrBlvD,MAAO,GACPmvD,UAAU,EAElB,CAEOvoD,SACH,OACI/E,EAAAA,cAAA,WACIA,EAAAA,cAAA,OAAKkI,UAAU,0BAA0B7M,KAAKkC,MAAM+S,sBACnDjV,KAAKuyD,YAAYvyD,KAAKkC,MAAMgT,qBAAsBlV,KAAKkC,MAAMiT,yBAA0BnV,KAAKkC,MAAMzB,MACnGkE,EAAAA,cAAA,KAAGkI,UAAW7M,KAAKoF,MAAMtC,MAAQ,mBAAqB,GAAE,YAAW,aAAa9C,KAAKoF,MAAMtC,OAC1F9C,KAAKqzD,wBAAwBrzD,KAAKkC,OAG/C,CAiCQ/B,wBAAwBgyD,GAC5B,IAAIuB,EAAe,GACC,eAAjBvB,IACCuB,EAAe,cAEnB,MAAMhyD,QAAqCiyD,EAAAA,EAAAA,cACvC,CAAEtyD,cAAerB,KAAKkC,MAAM5B,QAAQ4H,eACpCgnC,SAASwkB,EAAc,IACvB1zD,KAAKkC,MAAM5B,QAAQ+H,QAAQxI,YAAYU,WAAWiE,OAAM1B,GAC7C,QACN,CAAEnB,SAAU,EAAGiyD,iBAAkB,EAAGC,UAAW,EAAGpI,MAAO,EAAGqI,cAAe,GAE9Ej4C,QAAkBnb,EAAAA,EAAAA,cAAaV,KAAKkC,MAAM5B,QAAQ4H,eAExD,GAAI2T,GAAaA,EAAUpb,MAAQob,EAAUpb,KAAKyI,UAAW,CACrD,MAAM6qD,EAAyB,CAC3BryD,QAASA,EACTsyD,MAAO,EAEP/6C,iBAAkBjZ,KAAKkC,MAAM5B,QAAQsT,IAAI/K,OAAOoQ,kBAKpD,IAAIg7C,GAAwB,QACtBp4C,EAAUq4C,iBAAiBH,GAC5BzvD,MAAKnE,UACoB,YAAlBiG,EAAOU,SACPmtD,GAAgB,EAChBh3C,OAAOC,SAAS4wB,aAGvBtpC,OAAM1B,IACHqxD,QAAQC,IAAItxD,EAAM,mBAAmB,IAE7CqxD,QAAQC,IAAIH,GAExB,EAiIJ,sqBCrNA,MAAMI,EAAyD3wD,IAS1D,IAT2D,MAC5Ds0B,EAAK,MACL+B,EAAK,QACLz5B,EAAO,GACPuB,EAAE,SACF0L,EAAQ,mBACRkH,EAAkB,SAClBE,EAAQ,SACR2/C,GACH5wD,EACG,OACIiB,EAAAA,cAAA,KAAGkI,UAAW,6BAA6BynD,KACvC3vD,EAAAA,cAAA,QAAMkI,UAAU,8BAA8BktB,GAC7C/B,GAAmB,IAAVA,EACNrzB,EAAAA,cAACskC,EAAAA,eAAc,CACX9iC,KAAM,CACF6xB,MAAO,CAAEmxB,wBAAyBnxB,IAEtCrhB,cAAehC,EACfrU,QAASA,EACTuB,GAAIA,EACJ0L,SAAUA,EACVV,UAAU,+BAGdlI,EAAAA,cAAA,QAAMkI,UAAU,8BAA8B4H,GAElD,EAIN8/C,EAA8BA,CAChCryD,EACA81B,EACA+B,EACAu6B,IAGI3vD,EAAAA,cAAC0vD,EAAkB,CACfr8B,MAAOA,EACP+B,MAAOA,EACPz5B,QAAS4B,EAAM5B,QACfuB,GAAIK,EAAML,GACV0L,SAAUrL,EAAMqL,SAChBkH,mBAAoBvS,EAAMuS,mBAC1BE,SAAUzS,EAAMyS,SAChB9R,UAAWX,EAAMW,UACjByxD,SAAUA,IAKhBE,EAA0BC,GACpBA,GAAiBA,EAAcC,eAAkB,EAYhDzhD,EAAkB/Q,IAC3B,MAAM,YAAE+1B,EAAW,UAAE/uB,GAAchH,EAAMzB,KACnCk0D,EAAezrD,aAAS,EAATA,EAAWoJ,QAAOtO,GAAYA,EAAS83C,gBACtDv5C,EAAmC,CACrCsxB,SAAU8gC,aAAY,EAAZA,EAAclzD,KAAKmzD,GAClBL,EACHryD,EACA0yD,EAAYC,eACZrB,EAAAA,EAAAA,QAAOtxD,EAAMkR,aAAcwhD,EAAYE,WACvC,aAGRvgD,WAAYggD,EAA4BryD,EAAO+1B,EAAa/1B,EAAMgR,gBAAiB,UAGvF,GAAIhR,EAAMuyD,cAAe,CACrB,MAAMM,EAzBiBC,EAACP,EAA+Bh0D,KAC3D,MAGMw0D,GAAsBR,EAAcS,iBAAmB,IAAIC,QAHzCC,CAACpB,EAAelgC,IAC7BkgC,GAASlgC,EAASuhC,SAAW,IAEiD,GACnFC,GAAU70D,EAAKw3B,aAAe,GAAKu8B,EAAuBC,GAChE,OAAOxpB,KAAK9C,IAAI8sB,EAAoBK,EAAO,EAmBhBN,CAAuB9yD,EAAMuyD,cAAevyD,EAAMzB,MACnEi0D,EAAgBF,EAAuBtyD,EAAMuyD,eAC7Cc,GAA4Bt9B,GAAe,GAAK88B,EAAiBL,EAEnEA,EAAgB,IAChBnyD,EAAWwxB,QAAUwgC,EAA4BryD,GAAQwyD,EAAexyD,EAAMszD,cAAgB,iBAAkB,YAGhHT,EAAiB,IACjBxyD,EAAWuxB,SAAWygC,EAClBryD,GACC6yD,EACD7yD,EAAMuzD,eAAiB,mBACvB,cAIRlzD,EAAWgS,WAAaggD,EAA2B3nD,EAAAA,EAAC,CAAD,EAC1C1K,GAAK,IAAEyS,cAAU5T,IACtBw0D,EACArzD,EAAMgR,gBACN,QACF,CAGN,OAAO3Q,CAAU,spBClFrB,MAAMmzD,EAAqDhyD,IAUtD,IAVuD,MACxDs0B,EAAK,MACL+B,EAAK,QACLz5B,EAAO,GACPuB,EAAE,SACF0L,EAAQ,mBACRkH,EAAkB,SAClBE,EAAQ,SACR2/C,EAAQ,cACRqB,GACHjyD,EACG,OACIiB,EAAAA,cAAA,KAAGkI,UAAW,2BAA2BynD,KACrC3vD,EAAAA,cAAA,QAAMkI,UAAU,4BAA4BktB,GAC3C/B,GAAmB,IAAVA,EACNrzB,EAAAA,cAACskC,EAAAA,eAAc,CACX9iC,KAAM,CACF6xB,MAAO,CAAEmxB,wBAAyBnxB,IAEtCrhB,cAAehC,EACfrU,QAASA,EACTuB,GAAIA,EACJ0L,SAAUA,EACVV,UAAU,2BACV+oD,aAAcD,IAGlBhxD,EAAAA,cAAA,QAAMkI,UAAU,4BAA4B4H,GAEhD,EAINohD,EAA4B,SAC9B3zD,EACA81B,EACAs8B,GAEiB,IADjBv6B,EAAA1V,UAAA7hB,OAAA,QAAAzB,IAAAsjB,UAAA,GAAAA,UAAA,GAAgB,GAEhB,OACI1f,EAAAA,cAAC+wD,EAAgB,CACb19B,MAAOA,EACP+B,MAAOA,EACPz5B,QAAS4B,EAAM5B,QACfuB,GAAIK,EAAML,GACV0L,SAAUrL,EAAMqL,SAChBkH,mBAAoBvS,EAAMuS,mBAC1BE,SAAUzS,EAAMyS,SAChB9R,UAAWX,EAAMW,UACjByxD,SAAUA,EACVqB,cAAezzD,EAAMuR,qBAAqBqiD,UAGtD,EAEMtB,EAA0BC,GACpBA,GAAiBA,EAAcC,eAAkB,EAmEvDqB,EAAkB,SACpBld,GAIA,IAAAmd,EAAA,IAHAC,EAAA5xC,UAAA7hB,OAAA,QAAAzB,IAAAsjB,UAAA,IAAAA,UAAA,GACA7Q,EAAgE6Q,UAAA7hB,OAAA,EAAA6hB,UAAA,QAAAtjB,EAChEm1D,EAA2B7xC,UAAA7hB,OAAA,EAAA6hB,UAAA,QAAAtjB,EAE3B,OAAKk1D,EAGEziD,SAAoD,QAAzBwiD,EAA3BxiD,EAA6BwmC,+BAAuB,IAAAgc,OAAA,EAApDA,EAAsD1qD,MAAK6qD,GAAMA,IAAOtd,IAFpEqd,CAGf,EAGapiD,EAAgB5R,IACzB,MAAM,eACF2tD,EAAc,yBAEduG,EAAwB,UACxB5F,EAAS,wBAET6F,EAAuB,eACvB7I,EAAiB,EAAC,YAClBv1B,EAAW,kBACXq+B,GACAp0D,EAAMzB,MAEJ,QAAE81D,EAAO,kBAAEC,EAAiB,kBAAEC,EAAiB,WAAEC,GA7E1BC,EAC7Bl2D,EACAgT,EACAD,EACAE,EACAmB,EACAE,KAEA,MAAMmH,EAAyBzI,GAAwBA,EAAqB+E,uBACtE7N,EAAwB8I,GAAwBA,EAAqB5I,sBAErE+rD,GADYn2D,EAAKyI,WAAa,IACJzH,KAAIuC,GAAYA,EAASX,eACnDwzD,OAAmD91D,IAA7BN,EAAKq2D,oBAAoCr2D,EAAKq2D,oBAAsB,EAC1FC,OAAqDh2D,IAA9BN,EAAKisD,qBAAqCjsD,EAAKisD,qBAAuB,EAOnG,IAAIgK,EAAiC,EAuBrC,OArBIA,OADyB31D,IAAzB8T,QAA2D9T,IAArBgU,EACzBtU,EAAKisD,qBAEL73C,IAAyBE,EAAmBgiD,EAAuBF,EAAsBp2D,EAAKisD,qBAmBxG,CACH6J,QAlBYK,EAAczrD,MAC1B0tC,KAEyB,KAAjBA,IACCA,IACGkd,EAAgBld,EAAcnlC,EAAmCF,EAA6B0I,IAC9F28B,IAAiBluC,MAa7B6rD,kBAVsBI,EAAczrD,MAAK0tC,KAAkBA,GAAgBA,IAAiBluC,IAW5F8rD,kBAVsBG,EAAczrD,MACpC0tC,KACMA,GACFA,IACIkd,EAAgBld,EAAcnlC,EAAmCF,EAA6B0I,IAClG28B,IAAiBluC,IAMrB+rD,aACmB,EA6B+CC,CAClEz0D,EAAMzB,KACNyB,EAAMuR,qBACNvR,EAAMsR,4BACNtR,EAAMwR,kCACNxR,EAAM2S,qBACN3S,EAAM6S,kBAGV,IAAIxS,EAEJ,QAAmCxB,IAA/BmB,EAAM2S,2BAAiE9T,IAA3BmB,EAAM6S,iBAClDxS,EAAa,CACT2xB,SAAU2hC,EAA0B3zD,EAAO2tD,EAAgB,YAAa3tD,EAAM6R,eAC9EsgB,IAAKwhC,EAA0B3zD,EAAOs0D,EAAoBhG,OAAYzvD,EAAW,aAAcmB,EAAMmS,UACrGE,WAAYshD,EAA0B3zD,EAAO+1B,EAAa,QAAS/1B,EAAMgR,iBACzEkhB,YACKkiC,GAAqBT,EAA0B3zD,EAAOo0D,EAAmB,gBAAiBp0D,EAAMiS,wBACjGpT,OAEL,CACH,MAAMi2D,OAA0Cj2D,IAAtBu1D,EAAkCA,EAAoB,EAC1EW,OAAsDl2D,IAA5Bs1D,EAAwCA,EAA0B,EAC5Fa,OAAqCn2D,IAAdyvD,GAA2BA,EAAY,EAM9D2G,EACFj1D,EAAM2S,uBAAyB3S,EAAM6S,iBAAmBiiD,EAAoBC,EAA0BD,EAEpGI,EAAuBl1D,EAAM2S,sBAAwB3S,EAAM6S,iBAAmBqhD,EAA2BvG,EAE/GttD,EAAa,CACT2xB,SAAU2hC,EAA0B3zD,EAAOk1D,EAAsB,YAAal1D,EAAM6R,eACpFsgB,IAAKnyB,EAAM6S,iBACL8gD,EACI3zD,EACAs0D,GAAqBU,EAAuB1G,OAAYzvD,EACxD,aACAmB,EAAMmS,UAEV,GACNE,WAAYshD,EAA0B3zD,EAAO+1B,EAAa,QAAS/1B,EAAMgR,iBACzEkhB,YACKkiC,GAAqBT,EAA0B3zD,EAAOi1D,EAAwB,gBAAiBj1D,EAAMiS,wBACtGpT,EACN,CAKN,GAHIw1D,IACAh0D,EAAW4xB,SAAW0hC,EAA0B3zD,EAAOu0D,EAAoBC,OAAa31D,EAAW,WAAYmB,EAAM+R,gBAErH/R,EAAMuyD,cAAe,CACrB,MAAMM,EA5IiBC,EAACP,EAA+Bh0D,KAC3D,MAGMw0D,GAAsBR,EAAcS,iBAAmB,IAAIC,QAHzCC,CAACpB,EAAelgC,IAC7BkgC,GAASlgC,EAASuhC,SAAW,IAEiD,GACnFC,GAAU70D,EAAKw3B,aAAe,GAAKu8B,EAAuBC,GAChE,OAAOxpB,KAAK9C,IAAI8sB,EAAoBK,EAAO,EAsIhBN,CAAuB9yD,EAAMuyD,cAAevyD,EAAMzB,MACnEi0D,EAAgBF,EAAuBtyD,EAAMuyD,eAC7C4C,GAlJ0B5C,EAkJ6BvyD,EAAMuyD,gBAjJ9CA,EAAc4C,uBAA0B,EAkJvD9B,GAA4Bt9B,GAAe,GAAK88B,EAAiBL,EAAgB2C,EAEnF3C,EAAgB,IAChBnyD,EAAWwxB,QAAU8hC,EAA0B3zD,GAAQwyD,EAAe,UAAWxyD,EAAMszD,cAAgB,mBAGvGT,EAAiB,IACjBxyD,EAAWuxB,SAAW+hC,EAA0B3zD,GAAQ6yD,EAAgB,YAAa7yD,EAAMuzD,eAAiB,qBAG5G4B,EAAwB,IACxB90D,EAAW+0D,gBAAkBzB,EACzB3zD,GACCm1D,EACD,yBACAn1D,EAAMq1D,sBAAwB,2BAItCh1D,EAAWgS,WAAashD,EAAyBjpD,EAAAA,EAAC,CAAD,EACxC1K,GAAK,IAAEyS,cAAU5T,IACtBw0D,EACA,QACArzD,EAAMgR,gBACR,CA3K8BuhD,MAkLpC,OAJIjH,EAAiB,IACjBjrD,EAAW+xB,eAAiBuhC,EAA0B3zD,GAAQsrD,EAAgB,kBAAmBtrD,EAAMsS,sBAGpGjS,CAAU,mECpSd,SAASg9C,EAAsBkB,EAA+B9/C,GACjE,QAAkBI,IAAd0/C,GAA2Bz/C,EAAAA,gBAAgBC,YAAYN,GACvD,OAAOA,EAAS2K,MAAK5J,GACV++C,IAAc/+C,EAAQC,UAKzC,CAUO,SAAS29C,EACZmB,EACA9/C,EACA62D,EACA37C,GAEA,MAAM47C,EAAuBD,QAAAA,EAAe37C,aAAS,EAATA,EAAWpb,KAAKw8C,YAE5D,QAAkBl8C,IAAd0/C,GAA2Bz/C,EAAAA,gBAAgBC,YAAYN,GACvD,OAAOA,EAAS2K,MAAK5J,IAAU,IAAAi2C,EAC3B,OAAO8I,IAAc/+C,EAAQC,WAA4B,QAAhBg2C,EAAAj2C,EAAQopC,gBAAQ,IAAA6M,OAAA,EAAhBA,EAAkB+f,uBAAwBD,CAAoB,GAKnH,sFCpBOt3D,eAAemd,EAClB7c,EACAoC,EACA80D,GAC2B,IAEvB9Q,EACA3tB,EAHJ0+B,IAAAvzC,UAAA7hB,OAAA,QAAAzB,IAAAsjB,UAAA,KAAAA,UAAA,GAIA,IACIwiC,QAAmBpmD,EACnBy4B,EAAc2tB,EAAWpmD,KAAK04B,OAID,CAH/B,MAAOr2B,GAGL,OAFAD,EAAU6D,QAAQ5D,GAClBD,EAAU8D,MAAM,uCACT0W,EAAAA,YAAYlc,SAAU,CAGjC,IAAI+3B,EAmCA,OADAr2B,EAAU6D,QAAQ,uDACX2W,EAAAA,YAAYlc,UAlCnB,IAAK,IAAD02D,EACA,MAAM9Q,QAAoD+Q,EAAAA,iBAAAA,yBACtD,CAAEz2D,cAAes2D,EAAazvD,cAAe6vD,YAAa,QAC1DlR,EAAWpmD,KAAK4gC,GAChBnI,GAGJ,aAAa7b,EAAAA,YAAYlc,QAAkD,QAA3C02D,EAAC9Q,EAAiBiR,iCAAyB,IAAAH,EAAAA,OAAI92D,EAuBlD,CAtB/B,MAAO+B,GAEL,GAAI80D,GAA8B,2DAAf90D,EAAMixC,KAAmE,CACxF,UACU8S,EAAWK,YAAY,CAAC,EAID,CAH/B,MAAOC,GAGL,OAFAtkD,EAAU6D,QAAQygD,GAClBtkD,EAAU8D,MAAM,0BACT0W,EAAAA,YAAYlc,SAAU,CAEjC,IAEI,aADMmc,EAAkB7c,EAAMoC,EAAW80D,GAAc,GAChDt6C,EAAAA,YAAYlc,SAIU,CAH/B,MAAOimD,GAGL,OAFAvkD,EAAU6D,QAAQ0gD,GAClBvkD,EAAU8D,MAAM,2BACT0W,EAAAA,YAAYlc,SAAU,CAAD,CAMpC,OAFA0B,EAAU6D,QAAQ5D,GAClBD,EAAU8D,MAAM,2BACT0W,EAAAA,YAAYlc,SAAU,CAMzC,CA2DOhB,eAAegH,EAClBtC,EACAgiD,EACAhkD,EACAlC,EACAs3D,EACAhxD,GAEA,GAAI4/C,EAAY,CACZ,IAAIqR,GAA0C,EAC9C,GAAIl3D,EAAAA,gBAAgBC,YAAYN,IAAakE,EAAgC,CAAC,IAADszD,EACzE,MAAMC,EAA6Cz3D,EAAS2K,MACvD5J,GAA2BA,EAAQC,WAAas2D,EAAiBpmD,YAEtEqmD,IAAmCE,KAA6C,QAAzBD,EAACC,EAAgBttB,gBAAQ,IAAAqtB,IAAxBA,EAA0BntB,gBAAe,MAEjGktB,GAAiC,EAGrC,MAAM73D,EAAQ,CACV04C,WAAYkf,EAAiB3xD,OAAQC,WACrC0/C,YAAah/C,EACbmb,qBAAsB,CAAE81C,mCAG5B,IACI,MAAMG,QAA4CxR,EAAWV,uBAAuB9lD,GACpF,aAAagd,EAAAA,YAAYlc,QAAQk3D,EAGsB,CAFzD,MAAOv1D,GACLD,EAAU6D,QAAS5D,EAAgBuE,SACnCxE,EAAU8D,MAAM,sCAAuC,CAAD,CAI9D,OAAO0W,EAAAA,YAAYlc,SACvB,mMCpCA,MAgHM25C,EAAgBA,CAClBj0C,EACAnF,EACAQ,EACA6B,EACAg3C,EACAnyC,KACqB,IAAA+uC,EAAAqD,EAAA3S,EAAA4S,EAAAqd,EACrB,MAAM,cACF9yD,EAAa,aACb+T,EAAY,GACZ1X,EAAE,SACF0L,EAAQ,QACRjN,EAAO,UACP6J,EAAS,iBACT4Q,EAAgB,uBAChB7K,EAAsB,6BACtBtJ,EAA4B,6BAC5B2V,EAA4B,gCAC5BC,EAA+B,kCAC/BtN,EAAiC,mCACjCE,EAAkC,wCAClCkN,EAAuC,uDACvC9M,EAAsD,wBACtDqL,EAAuB,6BACvBC,EAA4B,eAC5BhL,EAAc,oBACdC,EAAmB,UACnBwI,EAAS,oBACT0D,EAAmB,sBACnBrD,EAAqB,oCACrBhJ,GACA1N,EAEE+H,EAAkB3J,EAAQ+H,QAAQ2B,KAAKC,gBACvCkxC,EAAiB5iC,GAAaA,EAAU/V,OAAS,GAAK+V,EAAU,GAAGhN,KAAOgN,EAAU,GAAGhN,KAAO0Q,EAC9Fm/B,GAnJNpiC,EAmJ+D9W,EAAM8W,oBAlJrE2D,EAkJ0Fo+B,EA/IrF/hC,GACA2D,GACAA,EAAoB0+B,0BACpB1+B,EAAoB2+B,oBACpB3+B,EAAoB0+B,yBAAyBE,kBAK3C5+B,EAAoB0+B,yBAAyBE,kBAHzC,GAXuBC,IAClCxiC,EACA2D,EAoJA,MAAMinB,EACFliC,GAtIwB+5C,EAC5BC,EACA1iC,EACAoiC,EACAv2C,EACA82C,KAEA,GAAI92C,EAAgC,CAChC,IAAI+2C,EAAmCD,EAQvC,OAJKA,IACDC,EAAmCF,GAAuB,IAGvD1iC,EACD4iC,EAAmCR,EAC/BQ,EACAR,EACJQ,CAAiC,CAE3C,OAAI5iC,GACOoiC,EAA2BM,EAAsBN,EAErDM,CAAmB,EA8GtBD,CACIv5C,EAAMgX,oBACNhX,EAAM8W,oBACNoiC,EACAl5C,EAAM2C,gCACNnD,SAAiB,QAAVi2C,EAAPj2C,EAASopC,gBAAQ,IAAA6M,OAAA,EAAjBA,EAAmB3M,kBAAmB,GAIxC6Q,GAAuBn6C,aAAO,EAAPA,EAASuQ,iBAAkBC,EAAAA,oBAAoBC,WAAatL,EAASi1C,cAE5FY,EAAen1C,EAAAA,iBAAiBC,kBAAkBo8B,QAClD7iC,EAvHe47C,EACrBvB,EACAwB,EACA16C,EACA25C,EACA73C,EACA64C,EACA9B,KACoB,IAAA+B,EACpB,MAAMC,EAA+B,GAGrC,GADuE,aAAb,QAAzBD,EAAA56C,EAAMya,2BAAmB,IAAAmgC,OAAA,EAAzBA,EAA2Bh2C,QAExD,OAGJ,GAAI5E,EAAM8I,sBAAwBhK,EAAAA,gBAAgBC,YAAYiB,EAAM8I,4BAC/BjK,IAA7Bg6C,EAEA,OADAgC,EAAmBp6C,KAAKT,EAAMsZ,gBACvBuhC,EAAmBx2C,WAG9BrE,EAAMia,eAAiBja,EAAM8W,sBAAwB6iC,IACjDT,GAA4B,EAC5B2B,EAAmBp6C,KAAKT,EAAMsZ,gBACvB4/B,EAA2BwB,IACD,IAA7BxB,EACA2B,EAAmBp6C,KAAKT,EAAMuZ,mBAE9BshC,EAAmBp6C,KAAKT,EAAMyZ,qBAAqB0b,QAAQ,YAAa+jB,EAAyB70C,eAM7G,MAAM22C,EAAiBh7C,EAAMoF,gBAAgBU,uBACvCm1C,EAAsBD,aAAc,EAAdA,EAAgB5qC,QAAOvO,GAASA,EAAMuC,SAAWu2C,IAC7E,QAA4B97C,IAAxBo8C,EACA,IAAK,MAAMC,KAAKD,EACRn8C,EAAAA,gBAAgBC,YAAYm8C,EAAEz1C,qBAC9By1C,EAAEz1C,mBAAmBlE,SAAQ45C,SACOt8C,IAA5Bs8C,EAAWz1C,cACXm1C,EAAmBp6C,KAAK06C,EAAWz1C,aAAc,IAOrE,OAAI5G,EAAAA,gBAAgBC,YAAY87C,GACrBA,EAAmBlU,KAAK,UADnC,CAIgB,EAmEV8T,CACIvB,EACAv0C,EAAS22B,SACTt7B,EACA25C,EACAh1C,EACAA,EAASP,OACTy0C,GAGJuC,EApEoBC,EAACrtC,EAA8DrJ,IAAuB,KAChHqJ,EAAuBrJ,EAAS,EAmEH02C,CAAsBrtC,EAAwBrJ,GAErE+uB,GAAUntB,EAAAA,EAAAA,kBAAiBotB,EAAAA,GAAe2nB,eAAgBt7C,EAAMiG,iBAAmB4S,EAAkB,IACrG2I,GAAatX,EAAAA,EAAAA,wBAAuBlK,EAAMiG,iBAAmBytB,GAE7D6nB,EAAe1C,aAAwB,EAAxBA,EAA0B2C,gBACzCC,GAAgB5C,EAChB,gCAAuE,QAAvEC,EAAgCD,EAAyB6C,sBAAc,IAAA5C,OAAA,EAAvCA,EAAyCxoB,qBACzEzxB,EAGA88C,GAEF,YADAn8C,SAAmB,QAAZ2mC,EAAP3mC,EAAS6mC,kBAAU,IAAAF,GAA8E,QAA9EA,EAAnBA,EAAqB/8B,MAAKk9B,GAHL,IAGkBA,EAAUoI,4BAAgD,IAAAvI,GAAgB,QAAhBA,EAAjGA,EAAmGK,sBAAc,IAAAL,OAAA,EAAjHA,EAAmHM,OAGvH,IAAIjB,GACJ,GAAIhmC,GAGA,GAFAgmC,IAAaoW,EAAAA,EAAAA,mBAAkBp8C,EAASQ,EAAM5B,QAAQ4H,mBAAenH,GAEjEgc,EAAAA,GAASC,YAAalM,EAAAA,EAAAA,IAAiB5O,EAAM5B,QAAQ4H,cAAclG,gBAAiB,CAAC,IAAD+7C,GACpF,MAAMC,EAAU,IAAIrxB,IAAI+a,GAAYzqB,OAAOC,SAAS9O,MACpD4vC,EAAQpxB,aAAahH,IAAI,YAAa,GAAqB,QAArBm4B,GAAGl3C,EAASo3C,iBAAS,IAAAF,GAAAA,GAAI,KAC/DrW,GAAasW,EAAQ5vC,IAAK,OAG9Bs5B,IAAawW,EAAAA,EAAAA,8BAA6Br3C,EAASg0C,aAAe,GAAI34C,EAAM5B,QAAQ4H,eAGxF,MAAO,CACH/B,KAAM,CACFzE,UACAmF,YAEJ0qB,WAAY1qB,EAASP,OACrBxD,MAAO45C,EACPzxC,WACM4wC,IAAwB35C,EAAM8W,sBAAsBnS,EAAS22B,UAAaoG,QAAAA,EAAe,KACzFr8B,EAAAA,iBAAiBC,kBAAkBk1C,KAAkBpqB,EAAAA,iBAAiBC,cAAcmqB,GAC1F71C,SACIlC,EAAAA,cAACw5C,EAAAA,sBAAqB,CAClBh4C,KAAM,CACFnC,SAAU6C,EACVgV,UAAW3Z,EAAM2Z,UACjBna,UACAqX,SAAU7W,EAAM6W,UAEpB6jC,gBAAiB/1C,EAAS22B,SAC1BoG,YAAaA,EACbwa,eAAevC,IAAwB35C,EAAM8W,sBAAsBoiC,GAA4B,EAC/F7hC,aAAcA,EACd/T,cAAeA,EACf3D,GAAIA,EACJ0L,SAAUA,EACVm6B,WAAYA,GACZpnC,QAASA,EACT6J,UAAWA,EACXrG,IAAK,GAAGC,KAAS2jC,KACjBxgC,UAAWnD,EACXs6C,oBAAqB92C,EAAAA,iBAAiBC,kBAAkB9F,GACxD48C,iBAAkBp8C,EAAM6Z,sCACxBwiC,gBAAiB78C,aAAO,EAAPA,EAASkvB,gBAC1B8rB,aAAcA,EACd8B,0BAA2Bf,EAC3BgB,wBAAyBd,GACzBe,iBAA8C,WAAb,QAAfzD,EAAA/4C,EAAM2Z,iBAAS,IAAAo/B,OAAA,EAAfA,EAAiBn0C,QACnCuV,gCAAiCna,EAAMma,gCACvClU,iBAAkBjG,EAAMiG,iBACxBqL,4BAA6BtR,EAAMsR,4BACnCmiD,cAAsC,QAAzB2C,EAAEh4D,EAAQ+H,QAAQuC,eAAO,IAAA0tD,OAAA,EAAvBA,EAAyBxC,WAGhDtkC,cAAe9vB,GACT42C,EAAAA,EAAAA,GAAc,CACV1/B,wBACAiD,UAAW3Z,EAAM2Z,UACjBhV,WACAnF,UACA84C,WAAYt4C,EAAM+Y,WAClBw/B,kBAAmBv4C,EAAMiZ,aACzBE,gBAAiBnZ,EAAMmZ,gBACvBE,0BAA2BrZ,EAAMqZ,0BACjCO,iBAAkB5Z,EAAM4Z,iBACxBhD,gBAAiBlQ,EACjBsT,uBAC4C,KAAxCrV,EAASxD,aAAqCwD,EAASxD,aAAenB,EAAMga,uBAChF1C,iCAAkCtX,EAAMsX,iCACxChG,4BAA6BtR,EAAMsR,4BACnCwI,uBAAwB9Z,EAAM8Z,8BAElCjb,EACNiuB,OACIrqB,EAAAA,cAACsJ,EAAAA,OAAM1K,OAAA2K,OAAA,CAACrB,UAAU,6BAA6BoY,QAASq4B,EAAsBvwC,MAAOgO,GAAsB2I,GACtG3I,GAGT8W,cACI5nB,GAAmBvI,IAAYm8C,GAC3Bl5C,EAAAA,cAACg6C,EAAAA,uBAAsB,CACnB9xC,UAAU,iCACVgO,wBAAyBA,EACzBC,6BAA8BA,EAC9Bxa,QAASA,EACTuB,GAAIA,EACJiC,IAAK+C,EAASP,OACdiH,SAAUA,EACV4tC,eAAgBA,EAChBt0C,SAAUA,EACV+3C,gBAAc,EACdC,mBAAmB,EACnBC,kBAAkB,EAClBC,mBAAmB,EACnBC,SAAS,SACT74C,KAAM,CACFoS,YACA7W,WAEJu9C,UAAWr4C,SAGf7F,EAER6wB,mBACI3nB,GAAmB6F,GAAkBpO,EACjCiD,EAAAA,cAACu6C,EAAAA,4BAA2B,CACxBryC,UAAWC,IAAW,uCAAwC+wC,GAAwB,WAAa,IACnGthC,6BAA8BA,EAC9BC,gCAAiCA,EACjCtN,kCAAmCA,EACnCE,mCAAoCA,EACpCkN,wCAAyCA,EACzC9M,uDAAwDA,EACxDrJ,KAAM,CAAEzE,UAASuF,SAAUJ,EAAS22B,UAAY,EAAG1tB,iBAAgBC,uBACnEzP,QAASA,EACTs+C,gBAAc,EACdO,8BAA+BtB,GAC/BuB,cAAevB,GACfh8C,GAAIA,EACJ0L,SAAUA,EAEVwxC,mBAAoB78C,EAAM5B,QAAQsT,IAAI/K,OAAOw2C,iBAAkB,EAC/D75C,mBAAuCzE,IAAxBmB,EAAMsD,cAA8BtD,EAAMsD,mBAAgBzE,EACzE6O,oCAAqCA,IAAuC,EAC5EC,UAAWhJ,EAASo3C,iBAGxBl9C,EAEX,EAGQ2B,EAAoBA,CAC7BP,EACAxB,EACAuB,KAEA,MAAMK,EAAoC,GA0C1C,OAxCAJ,EAAUV,KAAI,CAACoF,EAAU9C,KACrB,IAAIrC,EAQAq5C,EAJAr5C,EAHAQ,EAAM2C,gCAGIy6C,EAAAA,EAAAA,GAAkCz4C,EAASgL,UAAWlR,EAAUkG,EAASo2C,YAAa/6C,EAAM2Z,YAE5F0jC,EAAAA,EAAAA,GAAsB14C,EAASgL,UAAWlR,GAKxD,MAAM43D,GAAeC,EAAAA,EAAAA,0BACjB3xD,EACA3E,EAAMsX,iCACNtX,EAAMsR,4BACNtR,EAAMga,wBAeV,IAAItT,EAbA1G,EAAM8I,sBAAwBhK,EAAAA,gBAAgBC,YAAYiB,EAAM8I,wBAChE+vC,EAA2B74C,EAAM8I,qBAAqBM,MAAKqR,IACJ,IAADgjC,EAAAH,EAAAE,EAAlD,OAAKx9C,EAAMmX,uBAAyBk/C,GAGgB,QAA5C5Y,EAAAhjC,EAAoB0+B,gCAAwB,IAAAsE,OAAA,EAA5CA,EAA8C9tC,aAAchL,EAASgL,YACjC,QAApC2tC,EAAA7iC,EAAoBqgC,wBAAgB,IAAAwC,OAAA,EAApCA,EAAsCI,kBAAsC,QAAzBF,EAAK74C,EAASo2C,mBAAW,IAAAyC,OAAA,EAApBA,EAAsBE,eAG/EjjC,EAAoB0+B,yBAAyBxpC,YAAchL,EAASgL,SAAS,UAKzD9Q,IAA/BmB,EAAM0G,sBAAsC5H,EAAAA,gBAAgBC,YAAYiB,EAAM0G,wBAC9EA,EAAuB1G,EAAM0G,qBAAqB0C,MAAKunB,GAC5CA,GAAkBA,EAAehhB,YAAchL,EAASgL,aAGvEtP,EAAWI,KAAKm4C,EAAcj0C,EAAUnF,EAASQ,EAAO6B,EAAOg3C,EAA0BnyC,GAAsB,IAG5GrG,CAAU,EAORoW,EAAiBzW,IAC1B,MAAM,SAAEvB,EAAQ,UAAEwB,GAAcD,EAChC,OAAOQ,EAAkBP,EAAWxB,EAAUuB,EAAM,uEC1djD,MAAMo2C,EAAiBp2C,IAC1B,MAmBMq2C,EAAgBlmB,IAClB,MAAM,0BAAE9W,EAAyB,QAAE7Z,EAAO,SAAEmF,EAAQ,UAAEgV,EAAS,sBAAEjD,GAA0B1W,EAE3F,GAAImwB,EAAiB,CACjB,IAAK9W,EACD,OAEJA,EACKi9B,WAAW,CACR32C,GAAI+W,EACJlX,UACA+2C,wBAAyB,CACrBC,cAAe7xC,EAAS1D,oBAE5B2V,gBAAiB5W,EAAM4W,gBACvB6/B,mBAAoBx4C,MAAOy4C,EAAiBC,IAlCzB14C,OAC/By4C,EACA/8B,EACAhV,EACAgyC,IAEKh9B,EAGEA,EACFi9B,6BAA6B,CAAEC,WAAYlyC,EAASP,OAAS4W,SAAU07B,EAAiBC,iBACxFv0C,MAAK8B,IACoB,YAAlBA,EAAOU,QACP5E,EAAM8Z,wBAAyB,IAGtCxX,OAAM1B,QATA5B,QAAQC,UA4BI63C,CAA2BJ,EAAiB/8B,EAAWhV,EAAUgyC,KAG/Er0C,OAAM1B,OAAa,KACrB,CACH,IAAK+Y,EACD,OAEJhV,EAASxD,aAAe,GACxBwD,EAAS1D,mBAAqB,GAC9B0D,EAASoyC,gBAAkB,CAAC,EAC5Bp9B,EACKq9B,4BAA4B,CAAEH,WAAYlyC,EAASP,SACnDhC,MAAK8B,IACoB,YAAlBA,EAAOU,QACP5E,EAAM8Z,wBAAyB,IAGtCxX,OAAM1B,OAAa,GAI1Bq2C,EAAkBA,CAACC,EAAwCt9B,KAC7D,IAAKA,IAAqBs9B,GAAkD,IAA5Bt9B,EAAiBtZ,OAC7D,MAAO,GAGX,MAAM62C,EAAgBv9B,EAAiBxQ,MAAKstC,GACjCA,EAAgBF,gBAAkBU,IAG7C,OAAIC,EACOA,EAAcC,YAElBF,CAAkB,EAwF7B,GAAKl3C,EAAM4W,iBAAoB5W,EAAM4W,gBAAgBygC,gBAArD,CAIkF,IAADC,EAAjF,GAAIt3C,EAAMsX,kCAAoCtX,EAAMsR,6BAChD,IAvByBimC,EACzBC,EACAC,KAEA,MAAM9mB,EAA2B,GASjC,OARA6mB,SAAAA,EAAwBj4C,KAAIm4C,IACxB,MAAMC,EAASF,aAAqB,EAArBA,EAAuBruC,MAAKwuC,GAAgBA,IAAiBF,EAASG,OAIrF,OAHIF,GACAhnB,EAAelwB,KAAKk3C,GAEjBhnB,CAAc,IAGlB7xB,EAAAA,gBAAgBC,YAAY4xB,EAAe,EAU7C4mB,CAAqBv3C,EAAM4W,gBAAgBygC,gBAAkD,QAAnCC,EAAEt3C,EAAMsR,mCAA2B,IAAAgmC,OAAA,EAAjCA,EAAmCQ,yBAChG,YAED,IACF93C,EAAMga,yBACNha,EAAM4W,gBAAgBygC,gBAAgBjuC,MAAK2uC,GAAUA,EAAOF,OAAS73C,EAAMga,yBAE5E,OAGJ,MAAO,CACH0tB,UAAW,CACPsQ,YAAa3B,GAEjB5mB,iBAxG0BwoB,EAC1Bn2C,EACAiX,EACAm/B,EACA/+B,EACAS,KAEA,MAAMgX,EAAcqmB,EAAgBn1C,EAASb,mBAAoB2Y,GAC3Du+B,IAAkBr2C,EAASb,mBAE3Bm3C,EAAejoB,GACV,KACHkmB,EAAalmB,EAAgB,EAIrC,OACI1tB,EAAAA,cAAAA,EAAAA,SAAA,KACIA,EAAAA,cAAA,SAAOkI,UAAU,iCACblI,EAAAA,cAAA,SACI9C,GAAI,6BAA6BmC,EAASsC,SAC1Cm+B,KAAK,QACLsP,KAAM,gBAAgB/vC,EAASsC,SAC/Bo+B,SAAU4V,GAAY,GACtB9e,MAAOvgB,EACPs/B,SAAUF,EAAa,gBACRA,EACfv2C,IAAK,GAAGE,EAASsC,kBAEpB2U,GAELtW,EAAAA,cAAA,SAAOkI,UAAU,qCACblI,EAAAA,cAAA,SACI9C,GAAI,+BAA+BmC,EAASsC,SAC5Cm+B,KAAK,QACLsP,KAAM,gBAAgB/vC,EAASsC,SAC/Bo+B,SAAU4V,GAAY,GACtB9e,MAAO4e,EACPG,QAASF,EAAa,eACRA,EACdv2C,IAAK,GAAGE,EAASsC,kBAEpB8zC,GAEJp2C,EAASb,mBACNwB,EAAAA,cAAA,OAAKkI,UAAU,qCACXlI,EAAAA,cAAA,QAAMkI,UAAU,2CAA2CimB,GAC3DnuB,EAAAA,cAAA,UAAQkI,UAAU,uCAAuCoY,QAASq1B,GAAY,IACzEj/B,IAGT,KACL,EAoDW8+B,CACdj4C,EAAM2E,SACN3E,EAAMs4C,WACNt4C,EAAMu4C,kBACNv4C,EAAMmZ,gBACNnZ,EAAM4Z,kBAEVgX,YAAaqmB,EAAgBj3C,EAAM2E,SAAS1D,mBAAoBjB,EAAM4Z,kBACtEuW,kBAAmBnwB,EAAM2E,SAAS1D,mBAClC0vB,eAzDuB6nB,EAACC,EAAkC7hC,KAA2C,IAAA8hC,EACrG,MAAMhB,EAAW9gC,SAAgC,QAAjB8hC,EAAf9hC,EAAiBygC,uBAAe,IAAAqB,OAAA,EAAhCA,EAAkCtvC,MAAK2uC,GAAUA,EAAOF,OAASY,EAAYz+B,yBAC9F,OAAO09B,aAAQ,EAARA,EAAUiB,WAAW,EAuDZH,CAAmBx4C,EAAOA,EAAM4W,iBAChD4Y,eAAgB,CACZ7kB,UAAW,kCA7BE,CA+BpB,+BCtOE,IAAKgU,EA+BL,SAASoB,EACZ3hB,EACA4hB,EACAshC,EACAC,GAAqB,IAAAC,EAErB,OAAKpjD,SAAY,QAALojD,EAAPpjD,EAASsT,WAAG,IAAA8vC,GAAQ,QAARA,EAAZA,EAAc76C,cAAM,IAAA66C,GAApBA,EAAsBriC,kBAGvBa,EACOuhC,EAHAD,CAMf,kBA5CA,SAAY3iC,GAIRA,EAAAA,EAAA,eAIAA,EAAAA,EAAA,iBAIAA,EAAAA,EAAA,iBAIAA,EAAAA,EAAA,cACH,CAjBD,CAAYA,IAAAA,EAAS,qHCerB1gB,eAAewjD,EAA2B/hC,GACtC,MAAM8gC,EAAwB,CAC1B5gC,IAAKF,EAAcG,KAAO,GAC1BC,QAASJ,EAAcO,SAAW,IAMtC,OAJIP,EAAcS,+BACdqgC,EAAUtgC,qBAAuB,CAAEE,6BAA8B,SAG/C,KAAlBogC,EAAU5gC,IACH,CAAC4gC,GAAW,GAGhB,IAAIxhD,SAA+BC,IACtC,IACI,MAAM0hD,EAAO,IAAIC,eACjBD,EAAKE,KAAK,OAAQL,EAAU5gC,KAAM,GAElC+gC,EAAKtY,iBAAiB,QAAQ,KAC1BppC,EAAQ,CAACuhD,EAA2B,MAAhBG,EAAK/7C,QAAkC,MAAhB+7C,EAAK/7C,QAAgB,IAGpE+7C,EAAKtY,iBAAiB,SAAS,KAC3BppC,EAAQ,CAACuhD,GAAW,GAAO,IAG/BG,EAAKK,MAEuB,CAD9B,MAAAU,GACEziD,EAAQ,CAACuhD,GAAW,GAAQ,IAGxC,CAEOviD,eAAespB,EAClBg3B,EACAlgD,EACA2H,EACA1C,EACAurC,GAEA,MAAMlhC,GAAYjE,EAAAA,EAAAA,IAAa1D,EAAclG,gBACvCmgD,EAAc,IAAIC,EAAAA,sCAAsC3B,EAAWlgD,EAAWwwC,EAAiBlhC,GAErG,OAAOwyC,EAAAA,EAAAA,qCAAoCF,EAAaj6C,GACnD5D,MAAKod,GACEA,EACOxgB,QAAQwrB,IAAIhL,EAAejgB,KAAImgB,GAAiB+hC,EAA2B/hC,MAAiBtd,MAAKi+C,GAC7FA,EAAMjwC,QAAOkwC,GAAQA,EAAK,KAAI/gD,KAAI+gD,GAAQA,EAAK,OAIvD,KAEVh+C,OAAM1B,IACHoF,EAAcrF,UAAU4B,UAAU3B,GAClCoF,EAAcrF,UAAU8D,MAAM,sDACvB,KAEnB,CAaOxG,eAAe2pB,EAClB22B,EACAv+B,EACA3hB,EACA2H,EACAs7C,EACAzS,GAA+B,IAAA8S,EAE/B,MAAMh0C,GAAYjE,EAAAA,EAAAA,IAAa1D,EAAclG,gBAC7C,GAAgC,QAAhC6hD,EAAI37C,EAAclG,sBAAc,IAAA6hD,GAAQ,QAARA,EAA5BA,EAA8B7/B,cAAM,IAAA6/B,GAApCA,EAAsCC,UAAW,CACjD,MAAMhjD,QAAiBijD,EAAAA,EAAAA,IAAmB77C,EAAclG,eAAgB,iCAAkC,OAAQ,CAC9Gy+C,UAAWA,EACXlgD,UAAWA,EACXsP,UAAWA,IAEf,GAAwB,MAApB/O,EAASgG,OAET,OADAoB,EAAcrF,UAAU8D,MAAM,2EACvB,GAEX,MAAMq9C,EAAmBljD,aAAQ,EAARA,EAAUqF,KACnC,OAAI69C,EACOA,EAAiBviD,KAAImgB,IAAgB,IAAAC,EACxC,MAAO,CACHC,IAAsB,QAAnBD,EAAED,EAAcG,WAAG,IAAAF,EAAAA,EAAI,GAC1BG,SAASC,EAAAA,EAAAA,GAAW/Z,EAAclG,eAAgBkgB,EAAqBshC,EAAa5hC,EAAcO,SAClG8hC,aAAcriC,EAAcsiC,aAC5BtjC,eAAgBgB,EAAcuiC,eAC9B/hC,qBAAsBR,EAAcS,6BAC9B,CACIC,6BAA8B,aAElCvhB,EACT,IAGF,EAAG,CAEd,MAAMohD,EAAc,IAAIC,EAAAA,sCAAsC3B,EAAWlgD,EAAWwwC,EAAiBlhC,GACrG,OAAOwyC,EAAAA,EAAAA,qCAAoCF,EAAaj6C,GACnD5D,MAAKod,GACEA,EACOA,EAAejgB,KAAImgB,IAAgB,IAAAwiC,EACtC,MAAO,CACHtiC,IAAsB,QAAnBsiC,EAAExiC,EAAcG,WAAG,IAAAqiC,EAAAA,EAAI,GAC1BpiC,SAASC,EAAAA,EAAAA,GAAW/Z,EAAclG,eAAgBkgB,EAAqBshC,EAAa5hC,EAAcO,SAClG8hC,aAAcriC,EAAcsiC,aAC5BtjC,eAAgBgB,EAAcuiC,eAC9B/hC,qBAAsBR,EAAcS,6BAC9B,CACIC,6BAA8B,aAElCvhB,EACT,IAGF,KAEVyD,OAAM1B,IACHoF,EAAcrF,UAAU4B,UAAU3B,GAClCoF,EAAcrF,UAAU8D,MAAM,sDACvB,KAEnB,CAEOxG,eAAekpB,EAClB3H,EACAxZ,EACA1C,GAEA,OAAOtE,QAAQwrB,IAAIhL,EAAejgB,KAAImgB,GAAiB+hC,EAA2B/hC,MAC7Etd,MAAKi+C,GACKA,EAAMjwC,QAAOkwC,GAAQA,EAAK,KAAI/gD,KAAI+gD,GAAQA,EAAK,OAEzDh+C,OAAM1B,IACHoF,EAAcrF,UAAU4B,UAAU3B,GAClCoF,EAAcrF,UAAU8D,MAAM,qCACvB,KAEnB,CAQOxG,eAAe2sB,EAAwB9J,EAAiB9a,GAC3D,IAAIsb,EACJ,GAAIR,EAAS,CACT,MAAMliB,QAAiByjD,EAAAA,EAAAA,IAA6Br8C,EAAclG,eAAgB,CAACghB,IAEnF,GAAwB,MAApBliB,EAASgG,OAET,YADAoB,EAAcrF,UAAU8D,MAAM,6CAA6Cqc,KAI/E,MAAML,EAAY7hB,EAASqF,KACvBwc,GAAa3hB,EAAAA,gBAAgBC,YAAY0hB,KACzCa,EAAkBb,EAAU,GAAE,CAGtC,OAAOa,CACX,6gBCxGA,MA8MMi1C,EAAqBA,CAACt2D,EAAuBxB,EAAuCuB,KACtF,MAAMK,EAAoC,GAE1C,OAAK5B,GAAgC,IAApBA,EAAS6B,QAK1BL,EAAUV,KAAI,CAACoF,EAAU9C,KACrB,MAAMrC,EAvNMg3D,EAACjY,EAA+B9/C,KAChD,QAAkBI,IAAd0/C,GAA2B9/C,EAC3B,OAAOA,EAAS2K,MAAK5J,GACV++C,IAAc/+C,EAAQC,UAGrB,EAiNI+2D,CAAY7xD,EAASgL,UAAWlR,GAChD,IAAIo6C,EAMA4d,EALAz2D,EAAM8I,sBAAwB9I,EAAM8I,qBAAqBxI,OAAS,IAClEu4C,EAA2B74C,EAAM8I,qBAAqBM,MAAMqR,IAAuB,IAAAgjC,EAC/E,OAAmD,QAA5CA,EAAAhjC,EAAoB0+B,gCAAwB,IAAAsE,OAAA,EAA5CA,EAA8C9tC,aAAehL,EAASgL,SAAS,KAI1F3P,EAAM2W,wBAA0B3W,EAAM2W,uBAAuBrW,OAAS,IACtEm2D,EAA6Bz2D,EAAM2W,uBAAuBvN,MAAMunB,GACrDA,GAAkBA,EAAehhB,YAAchL,EAASgL,aAGnEnQ,GACAa,EAAWI,KAxKDm4C,EAClBj0C,EACAnF,EACAQ,EACA6B,EACAg3C,EACA6d,KACwB,IAAAjhB,EAAAwT,EAAAtT,EAAAmD,EAAAC,EACxB,MAAM,cAAEz1C,EAAa,aAAE+T,EAAY,GAAE1X,EAAE,SAAE0L,EAAQ,QAAEjN,EAAO,UAAE6J,EAAS,iBAAE4Q,EAAgB,uBACnF7K,EAAsB,6BAAEtJ,EAA4B,6BAAE2V,EAA4B,kCAClFrN,EAAiC,mCAAEE,EAAkC,wCACrEkN,EAAuC,uDAAE9M,EAAsD,wBAC/FqL,EAAuB,6BAAEC,EAA4B,eAAEhL,EAAc,oBAAEC,EAAmB,UAC1FwI,EAAS,oBAAE0D,EAAmB,sBAAErD,GAA0B1W,EAExD+H,EAAkB3J,EAAQ+H,QAAQ2B,KAAKC,gBACvCkxC,EAAiB5iC,GAAaA,EAAU/V,OAAS,GAAK+V,EAAU,GAAGhN,KAAOgN,EAAU,GAAGhN,KAAO0Q,EAC9F2nB,EArEsB6X,EAACviC,EAA6BF,EAA8B2D,EAAoDk8C,KAC5I,MAAMC,EAAkBD,GAA0C3/C,EAElE,OAAIF,EACK2D,GAAwBA,EAAoB0+B,0BAA6B1+B,EAAoB2+B,oBAAuB3+B,EAAoB0+B,yBAAyBE,kBAG/J5+B,EAAoB0+B,yBAAyBE,kBAAoB5+B,EAAoB0+B,yBAAyBE,kBAAoBud,EAF9H,EAKRA,CAAe,EA2DFrd,CAChBv5C,EAAMgX,oBACNhX,EAAM8W,oBACN+hC,EACA74C,EAAM2C,+BAAiD,QAAnB8yC,EAAGj2C,EAAQopC,gBAAQ,IAAA6M,OAAA,EAAhBA,EAAkB3M,qBAAkBjqC,GAIzEg4D,EADmB,IACHr3D,EAAQuQ,cAGxB+mD,EADoF,SAA/D,QAAb7N,EAAAjpD,EAAM5B,eAAO,IAAA6qD,GAAS,QAATA,EAAbA,EAAe9iD,eAAO,IAAA8iD,GAAK,QAALA,EAAtBA,EAAwBv3C,WAAG,IAAAu3C,GAAU,QAAVA,EAA3BA,EAA6BptC,gBAAQ,IAAAotC,OAAA,EAArCA,EAAuCntC,oCACJ,QAAhB65B,EAAAn2C,EAAQopC,gBAAQ,IAAA+M,OAAA,EAAhBA,EAAkBohB,qBAA0B,EACvEvc,EApEeC,EAAC/Y,EAAqBgZ,EAAyB16C,EAA4BgF,EAAmB6xD,EAAwBC,KAE3I,MAAME,EAA8B,GAChCh3D,EAAMia,eACFja,EAAM8W,sBAAwB+/C,IAC1Bn1B,GAAe,EACfs1B,EAAkBv2D,KAAKT,EAAMsZ,gBACtBooB,EAAcgZ,IACD,IAAhBhZ,EACAs1B,EAAkBv2D,KAAKT,EAAMuZ,mBAE7By9C,EAAkBv2D,KAAKT,EAAMyZ,qBAAqB0b,QAAQ,YAAauM,EAAYr9B,eAKnG,MAAM4yD,EAAkB,qCAAqCH,IAe7D,GAZA92D,EAAMoF,gBACDgL,QAAO8qC,GAAKA,EAAEgc,YAAclyD,IAC5BzD,SAAQ25C,IAAI,IAAAic,EAAAC,EAAAC,EAEwC,4FAAtB,QAAvBF,EAAAjc,EAAEoc,6BAAqB,IAAAH,OAAA,EAAvBA,EAAyBI,kBACoB,8GAAtB,QAAvBH,EAAAlc,EAAEoc,6BAAqB,IAAAF,OAAA,EAAvBA,EAAyBG,iBACrBP,EAAkBv2D,KAAKw2D,GACG,QAA3BI,EAAInc,EAAEoc,6BAAqB,IAAAD,GAAvBA,EAAyB3xD,cAChCsxD,EAAkBv2D,KAAKy6C,EAAEoc,sBAAsB5xD,iBAIvDsxD,EAAkB12D,OAAS,EAC3B,OAAO02D,EAAkBrwB,KAAK,IAGlB,EAiCK8T,CAAiB/Y,EAAa/8B,EAAS22B,SAAWt7B,EAAO6B,EAAOg1D,EAAeC,GAG9FpjC,GAAUntB,EAAAA,EAAAA,kBAAiBotB,EAAAA,GAAe2nB,eAAgBt7C,EAAMiG,iBAAmB4S,EAAkB,IACrG2I,GAAatX,EAAAA,EAAAA,wBAAuBlK,EAAMiG,iBAAmBytB,GAE7D6nB,EAAe1C,aAAwB,EAAxBA,EAA0B2C,gBACzCC,EAAgB5C,EAA2B,gCAAuE,QAAvEC,EAAgCD,EAAyB6C,sBAAc,IAAA5C,OAAA,EAAvCA,EAAyCxoB,qBAAkBzxB,EAC5I,MAAO,CACHoF,KAAM,CACFzE,QAASA,EACTmF,SAAUA,GAEd/D,MAAO45C,EACP71C,SACIlC,EAAAA,cAACw5C,EAAAA,sBAAqB,CAClBh4C,KAAM,CACFnC,SAAU6C,EACVnF,QAASA,GAEbk7C,gBAAiB/1C,EAAS22B,SAC1BoG,YAAaA,EACbwa,eAAgB2a,IAAiB72D,EAAM8W,sBAAwB4qB,GAAe,EAC9ErqB,aAAcA,EACd/T,cAAeA,EACf3D,GAAIA,EACJ0L,SAAUA,EACVm6B,YAAYoW,EAAAA,EAAAA,mBAAkBp8C,EAASQ,EAAM5B,QAAQ4H,mBAAenH,GACpET,QAASA,EACT6J,UAAWA,EACXrG,IAAKC,EACLs6C,oBAAoB,EACpBC,iBAAkBp8C,EAAM6Z,sCACxBwiC,gBAAiB78C,EAAQkvB,gBACzB8rB,aAAcA,EACd8B,0BAA2Bf,EAC3BgB,wBAAyBd,EACzBe,iBAA8C,WAAb,QAAfzD,EAAA/4C,EAAM2Z,iBAAS,IAAAo/B,OAAA,EAAfA,EAAiBn0C,QACnCuV,gCAAiCna,EAAMma,gCACvClU,iBAAkBjG,EAAMiG,mBAEhCqpB,eACI8mB,EAAAA,EAAAA,eAAc,CACV1/B,sBAAuBA,EACvBiD,UAAW3Z,EAAM2Z,UACjBhV,SAAUA,EACVnF,QAASA,EACT84C,WAAYt4C,EAAM+Y,WAClBw/B,kBAAmBv4C,EAAMiZ,aACzBE,gBAAiBnZ,EAAMmZ,gBACvBE,0BAA2BrZ,EAAMqZ,0BACjCO,iBAAkB5Z,EAAM4Z,iBACxBhD,gBAAiB8/C,EACjB18C,uBAAwBha,EAAMga,uBAC9BF,uBAAwB9Z,EAAM8Z,yBAGtCgT,OACIrqB,EAAAA,cAACsJ,EAAAA,OAAM1K,OAAA2K,OAAA,CACHrB,UAAU,6BACVoY,QA1DkBhgB,IAA2CiL,EAAuBrJ,EAAS,EA2D7FkG,MAAOgO,GACH2I,GAEH3I,GAGT8W,cACI5nB,EACItF,EAAAA,cAACg6C,EAAAA,uBAAsB,CACnB9xC,UAAW,iCACXgO,wBAAyBA,EACzBC,6BAA8BA,EAC9Bxa,QAASA,EACTuB,GAAIA,EACJiC,IAAK+C,EAASP,OACdiH,SAAUA,EACV4tC,eAAgBA,EAChBt0C,SAAUA,EACV+3C,gBAAgB,EAChBC,mBAAmB,EACnBC,kBAAkB,EAClBC,mBAAmB,EACnB54C,KAAM,CACFoS,UAAWA,EACX7W,QAASA,GAEbu9C,UAAWr4C,SAGf7F,EAER6wB,mBAEI3nB,GAAmB6F,EAEfnL,EAAAA,cAACu6C,EAAAA,4BAA2B,CACxBryC,UAAW,uCACX0P,6BAA8BA,EAC9BrN,kCAAmCA,EACnCE,mCAAoCA,EACpCkN,wCAAyCA,EACzC9M,uDAAwDA,EACxDrJ,KAAM,CAAEzE,QAASA,EAASuF,SAAUJ,EAAS22B,UAAY,EAAG1tB,eAAgBA,EAAgBC,oBAAqBA,GACjHzP,QAASA,EACTs+C,gBAAgB,EAChBG,mBAAmB,EACnBl9C,GAAIA,EACJ0L,SAAUA,SAGdxM,EAEX,EA0BuB+5C,CAAcj0C,EAAUnF,EAASQ,EAAO6B,EAAOg3C,EAA0B4d,OAI1Fp2D,IAvBHL,EAAM5B,QAAQuC,UAAUC,MAAM,iDACvB,KAsBM,EAOR6V,EAAiBzW,IAC1B,MAAM,SAAEvB,EAAQ,UAAEwB,GAAcD,EAChC,OACIu2D,EAAmBt2D,EAAWxB,EAAUuB,EAAM,mFC7S/C,MAAM6O,EAAkB7O,IAC3B,MAAM,GACFL,EAAE,mBACFmP,EAAkB,WAClBG,EACAhH,WAAW,kBAAEkH,EAAiB,sBAAEC,GAAuB,mBACvDJ,EAAkB,cAClBD,GACA/O,EAEJ,IAAKlB,EAAAA,gBAAgBC,YAAYkQ,GAC7B,OAGJ,MAAMowC,EAAU,GAAG1/C,UACbgL,EAAY,sBAClB,MAAO,CACHsmB,wBAAyB,CACrBtmB,UAAW,uBAEfumB,iBACIzuB,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,QAAMkI,UAAU,uBAChBlI,IAAAA,cAAA,gBAAQzC,EAAMiI,UAAUiH,yBAGhCiiB,oBACI1uB,IAAAA,cAAA,KAAGkI,UAAU,2BAA2BmY,SAAU,EAAGD,KAAK,OAAOE,QAAShU,GACrE,IACAI,EAAiB,IAAG,KAG7BiiB,gBACI3uB,IAAAA,cAACumB,EAAAA,MAAK,CAACvY,OAAQ3B,EAAoBnE,UAAW,GAAGA,IAAa60B,OAAQxwB,GAClEvM,IAAAA,cAAC68C,EAAAA,YAAW,CAAC30C,UAAW,GAAGA,oBAA6B60B,OAAQxwB,GAC5DvM,IAAAA,cAAA,MAAI9C,GAAI0/C,EAAS10C,UAAU,mCACtByE,IAGT3M,IAAAA,cAAC88C,EAAAA,UAAS,CAAC50C,UAAW,GAAGA,mBACrBlI,IAAAA,cAAA,UACKwM,EAAW1P,KAAIigD,IAAa,IAAAC,EACzB,OACIh9C,IAAAA,cAAA,MAAIkI,UAAU,iCAAiC/I,IAAK49C,EAAWp7C,QACtC,QAD4Cq7C,EAChED,EAAWE,iBAAS,IAAAD,OAAA,EAApBA,EAAsBE,UAAS,IAAG,IAClC,MAKrBl9C,IAAAA,cAACm9C,EAAAA,YAAW,CAACj1C,UAAW,GAAGA,uBAGtC,0ICPL,MA8IM6sD,EAA0BA,CAAC11D,EAAuC9B,KACpE,IAAIy3D,EACJ,GAAI31D,GAAYA,EAASb,mBAAoB,CAAC,IAADy2D,EACzC,MAAM9mC,EAAcqmB,EAAgBn1C,EAASb,mBAAoBjB,EAAM4Z,kBAEvE,IAAI68C,EACAz2D,EAAM2W,wBAA0B3W,EAAM2W,uBAAuBrW,OAAS,IACtEm2D,EAA6Bz2D,EAAM2W,uBAAuBvN,MAAKunB,GACpDA,GAAkBA,EAAehhB,YAAc7N,EAAS6N,aAGvE,MAAM+nC,EAAqC,QAA7BggB,EAAGjB,SAA0B,IAAAiB,GAAiB,QAAjBA,EAA1BA,EAA4BrgB,uBAAe,IAAAqgB,OAAA,EAA3CA,EAA6CtuD,MAAK2uC,GAAUA,EAAOF,OAAS/1C,EAASX,eAChG6Z,EAAW08B,aAAQ,EAARA,EAAUiB,YAIvB8e,EADAz8C,EACmB,GAAGA,MAAa4V,IAEhB,GAAGA,GAAa,MAGvC6mC,EAAmBz3D,EAAMiI,UAAU6nB,aAEvC,OAAO2nC,CAAgB,EAGrBE,EAAuBA,CAAC71D,EAAuC9B,KACjE,GAAI8B,GAAYA,EAASb,mBAAoB,CACzC,MAAM2vB,EAAcqmB,EAAgBn1C,EAASb,mBAAoBjB,EAAM4Z,kBAEvE,GAAIgX,EACA,OACInuB,EAAAA,cAAA,OAAKkI,UAAU,+BACXlI,EAAAA,cAAA,QAAMkI,UAAU,WAAWimB,GACzB,CAKlB,OAAO,IAAI,EAGTqmB,EAAkBA,CAACC,EAAwCt9B,KAC7D,IAAKA,IAAqBs9B,GAAkD,IAA5Bt9B,EAAiBtZ,OAC7D,MAAO,GAGX,MAAM62C,EAAgBv9B,EAAiBxQ,MAAKstC,GACjCA,EAAgBF,gBAAkBU,IAG7C,OAAIC,EACOA,EAAcC,YAElBF,CAAkB,EAGvBqf,EAAqBA,CACvBt2D,EACAxB,EACAuB,KAEA,MAAMK,EAA6C,GAEnD,OAAK5B,GAAgC,IAApBA,EAAS6B,QAK1BL,EAAUV,KAAI,CAACoF,EAAU9C,KACrB,IAAIrC,EAQAq5C,EAMA4d,EAMU,IAAD3d,GAhBTt5C,EAHAQ,EAAM2C,gCAGIy6C,EAAAA,EAAAA,GAAkCz4C,EAASgL,UAAWlR,EAAUkG,EAASo2C,YAAa/6C,EAAM2Z,YAE5F0jC,EAAAA,EAAAA,GAAsB14C,EAASgL,UAAWlR,GAGpDuB,EAAM8I,sBAAwB9I,EAAM8I,qBAAqBxI,OAAS,IAClEu4C,EAA2B74C,EAAM8I,qBAAqBM,MAAKqR,IAAsB,IAAAgjC,EAC7E,OAAmD,QAA5CA,EAAAhjC,EAAoB0+B,gCAAwB,IAAAsE,OAAA,EAA5CA,EAA8C9tC,aAAehL,EAASgL,SAAS,KAI1F3P,EAAM2W,wBAA0B3W,EAAM2W,uBAAuBrW,OAAS,IACtEm2D,EAA6Bz2D,EAAM2W,uBAAuBvN,MAAKunB,GACpDA,GAAkBA,EAAehhB,YAAchL,EAASgL,aAGnEnQ,IACAa,EAAWI,KAhLDm4C,EAClBj0C,EACAnF,EACAQ,EACA6B,EACAg3C,EACA6d,KAC8B,IAAAjhB,EAC9B,MAAM,cAAEnyC,EAAa,aAAE+T,EAAY,GAAE1X,EAAE,SAAE0L,EAAQ,QAAEjN,EAAO,UAAE6J,EAAS,iBAAE4Q,EAAgB,uBAAE7K,GAA2BhO,EAE9Gk5C,GAlENpiC,EAmEI9W,EAAM8W,oBAlEVwgB,EAmEIt3B,EAAMs3B,oBAlEV7c,EAmEIo+B,EAjEA/hC,GAEK2D,IACAA,EAAoB4+B,mBACrB5+B,EAAoB4+B,mBAAqB,GACzC5+B,EAAoB4+B,mBAAqB/hB,EAElC,EAEJ7c,EAAoB4+B,kBAAoB/hB,EAG5C,GAjB2BgiB,IAClCxiC,EACAwgB,EACA7c,EAqEA,MAAMinB,EACFliC,GArDwB+5C,EAC5BC,EACA1iC,EACAoiC,EACAv2C,EACA82C,KAEA,GAAI92C,EAAgC,CAChC,IAAI+2C,EAAmCD,EAQvC,OAJKA,IACDC,EAAmCF,GAAuB,IAGvD1iC,EACD4iC,EAAmCR,EAC/BQ,EACAR,EACJQ,CAAiC,CAE3C,OAAI5iC,GACOoiC,EAA2BM,EAAsBN,EAErDM,CAAmB,EA6BtBD,CACIv5C,EAAMgX,oBACNhX,EAAM8W,oBACNoiC,EACAl5C,EAAM2C,gCACNnD,SAAiB,QAAVi2C,EAAPj2C,EAASopC,gBAAQ,IAAA6M,OAAA,EAAjBA,EAAmB3M,kBAAmB,GAIxC+tB,EAAgBr3D,EAAQuQ,gBAAkBC,EAAAA,oBAAoBC,QAE9DmrC,EA/BoBC,EAACrtC,EAA8DrJ,IAAuB,KAChHqJ,EAAuBrJ,EAAS,EA8BH02C,CAAsBrtC,EAAwBrJ,GACrE2B,GAAUC,EAAAA,EAAAA,kBAAiB,QAASvG,EAAMiG,iBAAmB8D,EAAAA,kBAAkB6tD,gBAC/EC,GAA0B3tD,EAAAA,EAAAA,wBAAuBlK,EAAMiG,iBAAmBK,GAEhF,IAAIk/B,GAAaoW,EAAAA,EAAAA,mBAAkBp8C,EAASQ,EAAM5B,QAAQ4H,mBAAenH,GACzE,GAAIgc,EAAAA,GAASC,YAAalM,EAAAA,EAAAA,IAAiB5O,EAAM5B,QAAQ4H,cAAclG,gBAAiB,CAAC,IAAD+7C,EACpF,MAAMC,EAAU,IAAIrxB,IAAI+a,EAAYzqB,OAAOC,SAAS9O,MACpD4vC,EAAQpxB,aAAahH,IAAI,YAAa,GAAqB,QAArBm4B,EAAGl3C,EAASo3C,iBAAS,IAAAF,EAAAA,EAAI,KAC/DrW,EAAasW,EAAQ5vC,IAAK,CAG9B,MAAO,CACHjI,KAAM,CACFzE,UACAmF,YAEJoE,WAAW8tD,IAAiB72D,EAAM8W,sBAAsBnS,EAAS22B,SAAYoG,EAC7E/8B,SACIlC,EAAAA,cAACw5C,EAAAA,sBAAqB,CAClBh4C,KAAM,CACFnC,SAAU6C,EACVnF,UACAqX,SAAU7W,EAAM6W,UAEpB6jC,gBAAiB/1C,EAAS22B,SAC1BoG,YAAaA,EACbwa,eAAe2a,IAAiB72D,EAAM8W,sBAAsBoiC,GAA4B,EACxF7hC,aAAcA,EACd/T,cAAeA,EACf3D,GAAIA,EACJ0L,SAAUA,EACVm6B,WAAYA,EACZpnC,QAASA,EACT6J,UAAWA,EACXrG,IAAK,GAAGC,KAAS2jC,IACjB2W,oBAAoB,EACpBE,gBAAiB78C,EAAQkvB,gBACzBgH,YAAY,UACZzvB,iBAAkBjG,EAAMiG,iBACxBqL,4BAA6BtR,EAAMsR,4BACnCwmD,iBAAkBN,EAAwB7yD,EAAU3E,KAG5D8sB,OACIrqB,EAAAA,cAACsJ,EAAAA,OAAM1K,OAAA2K,OAAA,CACHrB,UAAU,6BACVoY,QAASq4B,EACTvwC,MAAOgO,GACHg/C,GAEHh/C,GAGTk2C,cAAe4I,EAAqBhzD,EAAU3E,GACjD,EA+FW44C,CACIj0C,EACAnF,EACAQ,EACA6B,EACwB,QADnBi3C,EACLD,SAAwB,IAAAC,OAAA,EAAxBA,EAA0BK,0BAGhC,IAIH94C,IAvCHL,EAAM5B,QAAQuC,UAAUC,MAAM,kDACvB,KAsCM,EAORw2B,EAAuBp3B,IAChC,MAAM,SAAEvB,EAAQ,UAAEwB,GAAcD,EAChC,OAAOu2D,EAAmBt2D,EAAWxB,EAAUuB,EAAM","sources":["webpack://Citta2.0/./src/modules/cart/actions/get-pickup-options-for-cartlines.ts?acad","webpack://Citta2.0/./src/modules/cart/components/cart-line-groups.tsx?f076","webpack://Citta2.0/./src/modules/cart/utils/get-promotion-in-cart.ts?4195","webpack://Citta2.0/./src/modules/cart/cart.tsx?d4e4","webpack://Citta2.0/./src/modules/media-gallery/media-gallery.tsx?24d7","webpack://Citta2.0/./src/modules/cart/cart.view.tsx?d8c2","webpack://Citta2.0/./src/modules/cart-icon/utils/get-products-in-mini-cart.ts?3c15","webpack://Citta2.0/./src/modules/cart-icon/cart-icon.tsx?4ae8","webpack://Citta2.0/./src/modules/media-gallery/media-gallery.view.tsx?5061","webpack://Citta2.0/./src/modules/promo-banner/components/close-button.tsx?063b","webpack://Citta2.0/./src/modules/promo-banner/components/links.tsx?2587","webpack://Citta2.0/./src/modules/promo-banner/components/text.tsx?782b","webpack://Citta2.0/./src/modules/promo-banner/promo-banner.tsx?9ee9","webpack://Citta2.0/./src/modules/quick-order-grid/components/add-to-list/add-to-cart-selected-items.tsx?de21","webpack://Citta2.0/./src/modules/quick-order-grid/components/quick-order-grid-actions.tsx?ca97","webpack://Citta2.0/./src/modules/quick-order-grid/components/quick-order-grid-drawer.tsx?8701","webpack://Citta2.0/./src/modules/quick-order-grid/components/quick-order-grid-form.tsx?5cbb","webpack://Citta2.0/./src/modules/quick-order-grid/components/quick-order-grid-product.ts?187e","webpack://Citta2.0/./src/modules/quick-order-grid/components/quick-order-grid-table/components/quick-order-grid-table-header-component.tsx?69b3","webpack://Citta2.0/./src/modules/quick-order-grid/components/quick-order-grid-table/components/quick-order-grid-table-row-component.tsx?cd92","webpack://Citta2.0/./src/modules/quick-order-grid/components/quick-order-grid-table/quick-order-grid-table-component.tsx?7cbc","webpack://Citta2.0/./src/modules/quick-order-grid/quick-order-grid.tsx?fddf","webpack://Citta2.0/./src/modules/quick-order-grid/components/utilities.ts?1806","webpack://Citta2.0/./src/modules/citta-cart/components/citta-cart-pick-up-in-store.tsx?9701","webpack://Citta2.0/./src/modules/citta-cart/components/citta-cart-line-items.tsx?0f67","webpack://Citta2.0/./src/modules/citta-cart/components/citta-cart-line-groups.tsx?9a00","webpack://Citta2.0/./src/modules/citta-cart/utils/get-promotion-in-citta-cart.ts?15a5","webpack://Citta2.0/./src/modules/citta-cart/citta-cart.tsx?bb3f","webpack://Citta2.0/./src/modules/citta-cart/components/hso-validate-cartlines-inventory.tsx?97a2","webpack://Citta2.0/./src/modules/citta-cart/components/citta-cart-line-items-promotion.tsx?25f5","webpack://Citta2.0/./src/modules/citta-media-gallery/utils/get-valid-product-images.ts?8597","webpack://Citta2.0/./src/modules/citta-media-gallery/citta-media-gallery.tsx?192b","webpack://Citta2.0/./src/modules/super-media-gallery/super-media-gallery.props.autogenerated.ts?e220","webpack://Citta2.0/./src/modules/super-media-gallery/utils/helper.ts?b8ed","webpack://Citta2.0/./src/modules/super-media-gallery/utils/get-valid-product-images.ts?50a8","webpack://Citta2.0/./src/modules/super-media-gallery/super-media-gallery.tsx?4f69","webpack://Citta2.0/./src/modules/citta-cart/citta-cart.view.tsx?6edb","webpack://Citta2.0/./src/modules/citta-media-gallery/citta-media-gallery.view.tsx?a3eb","webpack://Citta2.0/./src/modules/super-media-gallery/super-media-gallery.view.tsx?4d69","webpack://Citta2.0/./src/themes/citta/views/cart.view.tsx?dc69","webpack://Citta2.0/./src/themes/citta/views/checkout.view.tsx?084a","webpack://Citta2.0/./src/themes/citta/views/citta-cart.view.tsx?d1fe","webpack://Citta2.0/./src/modules/cart-icon/cart-icon.view.tsx?f9dd","webpack://Citta2.0/./src/modules/promo-banner/promo-banner.view.tsx?7f77","webpack://Citta2.0/./src/modules/quick-order-grid/quick-order-grid.view.tsx?f941","webpack://Citta2.0/./src/themes/citta/views/components/promocode.component.tsx?26ab","webpack://Citta2.0/./src/invoice-summary-lineitem.tsx?5f61","webpack://Citta2.0/./src/order-summary-lineitem.tsx?8a98","webpack://Citta2.0/./src/Common/get-product.ts?0a21","webpack://Citta2.0/./src/validate-cart.ts?cd50","webpack://Citta2.0/./src/modules/cart/components/cart-line-items.tsx?f6b2","webpack://Citta2.0/./src/modules/cart/components/cart-pick-up-in-store.tsx?dca8","webpack://Citta2.0/./src/modules/media-gallery/utils/helper.ts?b895","webpack://Citta2.0/./src/modules/media-gallery/utils/get-valid-product-images.ts?a364","webpack://Citta2.0/./src/components/citta-cart/cart-line-items.tsx?5e8b","webpack://Citta2.0/./src/modules/cart/components/cart-line-items-promotion.tsx?80d9","webpack://Citta2.0/./src/modules/cart-icon/components/flyout-cart-line-items.tsx?f2c4"],"sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { getCartState } from '@msdyn365-commerce/global-state';\nimport { ProductDeliveryOptions, ProductsDataActions } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n ActiveCartProductsInput,\n QueryResultSettingsProxy,\n buildCacheKey,\n getActiveCartProductsAction\n} from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Input class for pickup delivery options for items in cart.\n */\nexport class ProductPickUpOptionsForCartLineItems implements IActionInput {\n public readonly apiSettings: ICommerceApiSettings;\n\n public constructor(apiSettings: ICommerceApiSettings) {\n this.apiSettings = apiSettings;\n }\n\n /**\n * Get Cache Key.\n * @returns - Cache key string.\n */\n public getCacheKey = (): string => buildCacheKey('ActiveCartLineItemsPickUpOptions', this.apiSettings);\n\n /**\n * Get Cachetype Name.\n * @returns - Cache name string.\n */\n public getCacheObjectType = (): string => 'ActiveCartLineItemsPickUpOptions';\n\n /**\n * Get Cachetype.\n * @returns - CacheType enum.\n */\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * CreateInput method for the GetPickUpOptionCartLineItems method.\n * @param inputData - The input data passed to the createInput method.\n * @returns - Input for data action.\n */\nconst createInput = (inputData: ICreateActionContext>) => {\n return new ProductPickUpOptionsForCartLineItems(inputData.requestContext.apiSettings);\n};\n\n/**\n * The action method for the GetPickUpOptionCartLineItems data action.\n * @param input - The action input.\n * @param context - The action context.\n * @returns - Order Template object.\n */\nexport async function getPickUpOptionsForCartLineItems(\n input: ProductPickUpOptionsForCartLineItems,\n context: IActionContext\n): Promise {\n // If no input is provided fail out\n if (!input.apiSettings.channelId) {\n throw new Error('[getPickUpOptionsForCartLineItems]No valid Input was provided, failing');\n }\n const cartState = await getCartState(context);\n const cart = cartState.cart;\n const products = await getActiveCartProductsAction(new ActiveCartProductsInput(), context);\n const filterOption = 4;\n const response: ProductDeliveryOptions[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- existing code.\n if (cart === undefined || !ArrayExtensions.hasElements(products)) {\n return Promise.resolve(response);\n }\n\n const pickupoptions = await ProductsDataActions.getDeliveryOptionsAsync(\n {\n callerContext: context,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context)\n },\n products.map(product => product.RecordId),\n {},\n filterOption\n );\n\n return pickupoptions;\n}\n\n/**\n * The GetPickupOptionCartLineItems Data Action\n * Returns pickup options.\n */\nexport const getPickUpOptionsForCartLineItemsDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-pickup-options-for-cartlines',\n action: getPickUpOptionsForCartLineItems as IAction,\n input: createInput\n});\n\nexport default getPickUpOptionsForCartLineItemsDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport groupBy from 'lodash/groupBy';\n\nimport { assembleCartlines, ICartLineItemsProps, ICartlinesViewProps } from './cart-line-items';\n\nconst _assembleGroupCartlines = (\n cartlines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: ICartLineItemsProps\n): ICartlinesViewProps[][] | null => {\n const reactNodes: ICartlinesViewProps[][] = [];\n if (!products || products.length === 0) {\n props.context.telemetry.error('Products content is empty, module wont render');\n return null;\n }\n\n const getGroupByStorePickup = (items: CartLine[]) => groupBy(items, item => item.FulfillmentStoreId);\n const getGroupByDelivery = (items: CartLine[]) => groupBy(items, item => item.DeliveryMode);\n const groupDelivery = getGroupByDelivery(cartlines);\n const cartLinesGroup: CartLine[] = [];\n\n // 1) Group by store and pick up mode\n Object.entries(groupDelivery).forEach(([deliveryType, groupByDeliveryType]) => {\n // @ts-expect-error\n groupDelivery[deliveryType] = getGroupByStorePickup(groupByDeliveryType);\n cartLinesGroup.push(getGroupByStorePickup(groupByDeliveryType));\n });\n\n // 2) Create cartlines group\n Object.keys(cartLinesGroup).forEach(key => {\n const cartLines = cartLinesGroup[key];\n Object.keys(cartLines).forEach(index => {\n const cartLine = cartLines[index];\n const carLineViewProps = assembleCartlines(cartLine, products, props);\n if (carLineViewProps !== null) {\n reactNodes.push(carLineViewProps);\n }\n });\n });\n\n return reactNodes;\n};\n\nconst _assembleGroupInvoiceCartlines = (\n cartLines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: ICartLineItemsProps\n): ICartlinesViewProps[][] | null => {\n const reactNodes: ICartlinesViewProps[][] = [];\n if (cartLines && cartLines.length > 0) {\n // Create invoice cartLines group\n const carLineViewProps = assembleCartlines(cartLines, products, props);\n if (carLineViewProps !== null) {\n reactNodes.push(carLineViewProps);\n }\n }\n return reactNodes;\n};\n\n/**\n * CartLine Group component.\n * @param props\n */\nexport const CartLineGroupItems = (props: ICartLineItemsProps) => {\n const { products, cartlines, hasInvoiceLine } = props;\n return hasInvoiceLine\n ? _assembleGroupInvoiceCartlines(cartlines, products, props)\n : _assembleGroupCartlines(cartlines, products, props);\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\nimport { getPromotionOptionsForCartLineItems, PromotionOptionsForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * IPromotionData entity interface.\n */\nexport interface IPromotionData {\n promotionOptions?: CartPromotionLine[];\n}\n\n/**\n * Calls the Retail API and returns a promotion data.\n * @param ctx\n */\nexport async function getPromotionData(ctx: IActionContext): Promise {\n const promotionData: IPromotionData = {};\n\n await getPromotionOptionsForCartLineItems(new PromotionOptionsForCartLineItems(ctx.requestContext.apiSettings), ctx)\n .then(promotionOptions => {\n if (promotionOptions) {\n promotionData.promotionOptions = promotionOptions;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n return {};\n });\n\n return promotionData;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n IAddToOrderTemplateDialogResources,\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources,\n ILinesAddedToOrderTemplateDialogResources,\n IOrderTemplateNameDialogResources,\n IWishlistActionSuccessResult,\n PromoCodeComponent,\n SaveCartToOrderTemplateComponent\n} from '@msdyn365-commerce/components';\nimport MsDyn365, { getCatalogId, getUrlSync, IImageSettings, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport { AsyncResult, CartLine, CartLineValidationResultsByLineId, LineValidationResult } from '@msdyn365-commerce/retail-proxy';\nimport { FeatureState, ProductDeliveryOptions, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { cartLineQuantityUpdatedAsync, validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\nimport { IInvoiceSummaryLines, InvoiceSummary } from '@msdyn365-commerce-modules/invoice-payment-summary';\nimport { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\nimport {\n ActiveCartProductsInput,\n ArrayExtensions,\n getActiveCartProductsAction,\n ICartLineInventoryValidationResult,\n ObjectExtensions,\n validateCartLinesInventory,\n ProductPickUpOptionsForCartLineItems,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Alert,\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n INodeProps,\n IPayLoad,\n ITelemetryContent,\n TelemetryConstant,\n Waiting,\n updateMaxQuantityForCartLineItem,\n urlCheck\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport React from 'react';\nimport { getPickUpOptionsForCartLineItems } from './actions/get-pickup-options-for-cartlines';\n\nimport { ICartData } from './cart.data';\nimport { ICartProps, ICartResources } from './cart.props.autogenerated';\nimport { CartLineGroupItems } from './components/cart-line-groups';\nimport { CartLineItems, ICartlinesViewProps } from './components/cart-line-items';\nimport { cartPromotions, ICartLineItemViewProps } from './components/cart-line-items-promotion';\nimport { getPromotionData, IPromotionData } from './utils/get-promotion-in-cart';\n\n/**\n * Cart view props interface.\n */\nexport interface ICartViewProps extends ICartProps {\n className: string;\n title?: React.ReactNode;\n CartlinesWrapper: INodeProps;\n cartlines?: ICartlinesViewProps[];\n cartLinesGroup?: ICartlinesViewProps[][];\n cart: ICartState | undefined;\n orderSummaryHeading: React.ReactNode;\n orderSummaryLineitems?: IOrderSummaryLines;\n invoiceSummaryLineitems?: IInvoiceSummaryLines;\n OrderSummaryWrapper: INodeProps;\n OrderSummaryItems: INodeProps;\n OrderSummaryErrors?: IOrderSummaryErrors;\n checkoutAsGuestButton: React.ReactNode;\n checkoutAsSignInUserButton: React.ReactNode;\n storeSelector?: React.ReactNode;\n expressCheckoutButton?: React.ReactNode[];\n ExpressCheckoutSectionWrapper: INodeProps;\n backToShoppingButton: React.ReactNode;\n waitingComponent: React.ReactNode;\n promotionOptions?: ICartLineItemViewProps;\n promoCode: React.ReactNode;\n cartLoadingStatus: string;\n cartDataResult: boolean;\n multiplePickUpEnabled?: boolean;\n createTemplateFromCartButton: React.ReactNode;\n telemetryContent?: ITelemetryContent;\n checkoutBlockedDueToUnavailableFunds?: React.ReactNode;\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\n}\n\n/**\n * Order summary errors interface.\n */\nexport interface IOrderSummaryErrors {\n Wrapper: INodeProps;\n header: React.ReactNode;\n errors: React.ReactNode[];\n}\n\n/**\n * Cart component state interface.\n */\ninterface ICartComponentState {\n showPromotionDialog: boolean;\n cartlinesErrors: CartLineValidationResultsByLineId;\n promotionData: IPromotionData;\n isCartValid: boolean;\n productPickUpOptions?: ProductDeliveryOptions[];\n}\n\n/**\n * Cart component.\n * @extends {React.PureComponent>}\n */\n@observer\nclass Cart extends React.Component> {\n public state: ICartComponentState;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly payLoad: IPayLoad;\n\n private isQuantityLimitsFeatureEnabled: boolean = false;\n\n private _isMounted: boolean = false;\n\n private readonly promotionPopupId: string = 'cart-promotion-popup';\n\n public constructor(props: ICartProps) {\n super(props);\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.payLoad = getPayloadObject('click', this.telemetryContent, '');\n this.promotionLinkClick = this.promotionLinkClick.bind(this);\n this.promotionCloseButtonclick = this.promotionCloseButtonclick.bind(this);\n\n this.state = {\n showPromotionDialog: false,\n promotionData: {},\n isCartValid: true,\n productPickUpOptions: undefined,\n cartlinesErrors: {}\n };\n }\n\n /**\n * Component did mount function.\n */\n public async componentDidMount(): Promise {\n this._isMounted = true;\n const {\n config,\n context: { actionContext }\n } = this.props;\n\n this.isQuantityLimitsFeatureEnabled =\n (await this.getOrderQuantityLimitsFeatureFlag()) || (await this._isChannelLimitsFeatureEnabled());\n if (this.isQuantityLimitsFeatureEnabled) {\n await this.validateCart();\n }\n\n if (config.showAvailablePromotions) {\n if (this._isMounted && this.props.data.cart.result?.cart.CartLines) {\n this.setState({ promotionData: await getPromotionData(actionContext) });\n }\n\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n if (this._isMounted) {\n this.setState({ promotionData: await getPromotionData(actionContext) });\n }\n }\n );\n }\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n if (this._isMounted) {\n const input = new ProductPickUpOptionsForCartLineItems(actionContext.requestContext.apiSettings);\n this.setState({ productPickUpOptions: await getPickUpOptionsForCartLineItems(input, actionContext) });\n }\n }\n );\n }\n\n /**\n * Component will unmount function.\n */\n public componentWillUnmount(): void {\n this._isMounted = false;\n }\n\n /**\n * Should component update function.\n * @param nextProps - Next props.\n * @param nextState - Next state.\n * @returns True if component should update, false otherwise.\n */\n public shouldComponentUpdate(nextProps: ICartProps, nextState: ICartComponentState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n /* eslint-disable complexity -- Disabling complexity for render method */\n public render(): JSX.Element | null {\n const {\n data: {\n cart: { result: cart },\n products: { result: products }\n },\n context: {\n request: {\n user: { isAuthenticated, signInUrl }\n }\n },\n resources\n } = this.props;\n\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\n const backToShoppingUrl = getUrlSync('home', this.props.context.actionContext) || '';\n const checkoutURL = this.getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\n const cartLines = this._getCartLines();\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\n const validInventoryAcrossCartLines = validateCartLinesInventory(\n cart?.cart.CartLines ?? [],\n this.props.data.productAvailabilites.result ?? [],\n this.props.context.actionContext,\n products ?? [],\n emailDeliveryModeCode\n );\n\n const hasError =\n !validInventoryAcrossCartLines?.isValid ||\n (!validInventoryAcrossCartLines && !this.state.isCartValid) ||\n (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n );\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const { featureState } = this.props.data;\n const isMultipleCatalogsFeatureEnabled =\n featureState.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled || false;\n const currentCatalogId = getCatalogId(this.props.context.request);\n validateCatalogId(currentCatalogId);\n const cartLinesGroup = cart?.hasInvoiceLine || multiplePickUpEnabled ? this.getCartLinesGroup() : null;\n this.payLoad.contentAction.etext = TelemetryConstant.Checkout;\n const checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.GuestCheckout;\n const checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.BackToShopping;\n const backtoShoppingAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n\n // If there's inventory issues across multiple cart lines then update the error and display as part of the order summary\n if (validInventoryAcrossCartLines && !validInventoryAcrossCartLines.isValid) {\n if (multiplePickUpEnabled && cartLinesGroup !== null) {\n for (const cartLineGroup of cartLinesGroup) {\n this._updateCartLineErrorForInvalidInventory(cartLineGroup, validInventoryAcrossCartLines);\n }\n }\n\n this._updateCartLineErrorForInvalidInventory(cartLines, validInventoryAcrossCartLines);\n }\n\n const viewProps = {\n ...this.props,\n className: classnames('ms-cart'),\n title:

{resources.cartTitle}

,\n cart: this.props.data.cart.result,\n CartlinesWrapper: { className: 'msc-cartline-wraper' },\n OrderSummaryWrapper: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary-wrapper' : 'msc-order-summary-wrapper' },\n OrderSummaryItems: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary__items' : 'msc-order-summary__items' },\n cartlines: cartLines,\n cartLinesGroup,\n promoCode: this._getPromoCode(),\n promotionOptions: this._getPromotions(),\n context: this.props.context,\n typeName: this.props.typeName,\n telemetry: this.props.telemetry,\n id: this.props.id,\n multiplePickUpEnabled,\n removePromoAriaLabelFormat: resources.removePromoAriaLabelFormat,\n orderSummaryHeading: ArrayExtensions.hasElements(cart?.cart.CartLines) ? (\n cart?.hasInvoiceLine ? (\n

{resources.invoiceSummaryTitle}

\n ) : (\n

{resources.orderSummaryTitle}

\n )\n ) : null,\n orderSummaryLineitems: this._getOrderSummaryLineItems(),\n invoiceSummaryLineitems: this._getInvoiceSummaryLineItems(),\n checkoutAsSignInUserButton: !isCartEmpty ? (\n \n {resources.checkoutButtonTitle}\n \n ) : null,\n checkoutAsGuestButton:\n !isCartEmpty && !isAuthenticated && this.props.config.showGuestCheckoutButton ? (\n \n {resources.guestCheckoutButtonTitle}\n \n ) : null,\n expressCheckoutButton: !isCartEmpty ? this.props.slots.paymentExpress : null,\n ExpressCheckoutSectionWrapper: { className: 'msc-express-payment-container-in-cart-page' },\n backToShoppingButton: (\n \n {resources.backToShoppingButtonTitle}\n \n ),\n createTemplateFromCartButton:\n this._displayAddCartToTemplate() && products ? (\n \n ) : null,\n checkoutBlockedDueToUnavailableFunds: null,\n storeSelector:\n this.props.slots.storeSelector && this.props.slots.storeSelector.length > 0 ? this.props.slots.storeSelector[0] : null,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n waitingComponent: ,\n cartLoadingStatus: this.props.data.cart.status === 'FAILED' ? this.props.resources.cartLoadingErrorMessage : null,\n cartDataResult: this.props.data.cart.result && this.props.data.cart.result.isEmpty,\n OrderSummaryErrors: this._getOrderSummaryErrors(cartLines),\n telemetryContent: this.telemetryContent\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n /* eslint-enable complexity -- Disabling complexity for render method */\n\n /**\n * Promotion click event handler.\n * @param event - The mouse event.\n */\n private readonly promotionLinkClick = (event: React.MouseEvent) => {\n this.setState({\n showPromotionDialog: !this.state.showPromotionDialog\n });\n };\n\n /**\n * Promotion close button click.\n */\n private readonly promotionCloseButtonclick = () => {\n this._hidePromotionDialog();\n };\n\n /**\n * Hide promotion dialog.\n */\n private _hidePromotionDialog(): void {\n this.setState({\n showPromotionDialog: false\n });\n }\n\n /**\n * Display add to cart template.\n * @returns True if should display, false otherwise.\n */\n private _displayAddCartToTemplate(): boolean {\n const cart = this.props.data.cart?.result;\n if (ObjectExtensions.isNullOrUndefined(cart) || cart.hasInvoiceLine) {\n return false;\n }\n\n if (\n isChannelTypeB2B(this.props.context.actionContext.requestContext) &&\n this.props.data.orderTemplates.result &&\n ArrayExtensions.hasElements(cart.cart?.CartLines) &&\n this.props.data.customerInformation.result\n ) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Get promotions.\n * @returns React node with the promotions.\n */\n private _getPromotions(): React.ReactNode {\n return (\n this.props.config.showAvailablePromotions &&\n cartPromotions({\n id: this.promotionPopupId,\n showPromotionPopup: this.state.showPromotionDialog,\n onSeeAllClick: this.promotionLinkClick,\n onCloseButtonClick: this.promotionCloseButtonclick,\n promotions: this.state.promotionData.promotionOptions,\n resources: {\n promotionStringHeading: this.props.resources.promotionStringHeading,\n promotionLinkText: this.props.resources.promotionLinkText,\n promotionPopupHeading: this.props.resources.promotionPopupHeading,\n promotionCloseButtonAriaLabel: this.props.resources.promotionCloseButtonAriaLabel\n }\n })\n );\n }\n\n /**\n * Add error message in cart line in case the quantity exceeds the current inventory.\n * @param cartLines - The cart lines.\n * @param cartLineInventoryValidationResult - The cart line inventory result.\n */\n private _updateCartLineErrorForInvalidInventory(\n cartLines: ICartlinesViewProps[] | null,\n cartLineInventoryValidationResult: ICartLineInventoryValidationResult\n ) {\n const { resources } = this.props;\n\n if (\n ArrayExtensions.hasElements(cartLines) &&\n !cartLineInventoryValidationResult.isValid &&\n ArrayExtensions.hasElements(cartLineInventoryValidationResult.productIdWithErrors)\n ) {\n for (const productIdWithError of cartLineInventoryValidationResult.productIdWithErrors) {\n const cartLine = cartLines?.find(element => element.data?.cartline.ProductId === productIdWithError);\n if (cartLine) {\n cartLine.error = resources.outOfStockErrorMessage;\n cartLine.hasError = true;\n }\n }\n }\n }\n\n /**\n * Get order summary errors.\n * @param cartLines - The cart lines.\n * @returns Order summary errors.\n */\n private _getOrderSummaryErrors(cartLines: ICartlinesViewProps[] | null): IOrderSummaryErrors | undefined {\n const allErrors =\n (cartLines &&\n cartLines\n .map(cartline => {\n // Check if the product is service or not by product type\n const isServiceItem = cartline.data?.product?.ItemTypeValue === ReleasedProductType.Service;\n\n if (!isServiceItem && cartline.error) {\n const fullError =\n cartline.data && cartline.data.product?.Name\n ? `${cartline.data.product.Name}: ${cartline.error}`\n : cartline.error;\n\n return (\n
\n {fullError}\n
\n );\n }\n\n return null;\n })\n .filter((line): line is JSX.Element => !!line)) ||\n [];\n\n return {\n Wrapper: {\n tag: Alert,\n className: 'msc-alert',\n isOpen: allErrors.length > 0,\n color: 'danger',\n assertive: true,\n 'aria-label': this.props.resources.outOfStockErrorMessageHeader\n },\n header: (\n \n ),\n errors: allErrors\n };\n }\n\n /**\n * Gets invoice summary line items.\n * @returns Invoice summary lines.\n */\n private _getInvoiceSummaryLineItems(): IInvoiceSummaryLines | undefined {\n const {\n data: {\n cart: { result: cart }\n },\n telemetry,\n resources\n } = this.props;\n\n return cart?.hasInvoiceLine\n ? InvoiceSummary({\n orderTotalLabel: resources.totalAmountLabel,\n invoiceLabel: resources.invoiceLabel,\n cart: cart.cart,\n context: this.props.context,\n typeName: this.props.typeName,\n telemetry,\n id: this.props.id\n })\n : undefined;\n }\n\n /**\n * Gets order summary line items.\n * @returns Order summary lines.\n */\n private _getOrderSummaryLineItems(): IOrderSummaryLines | undefined {\n const {\n data: {\n cart: { result: cart },\n channelDeliveryOptionConfig\n },\n telemetry,\n resources\n } = this.props;\n\n const channelConfiguration = this.props.context && this.props.context.request && this.props.context.request.channel;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const featureState = this.props?.data?.featureState;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)\n ?.IsEnabled;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n const isShowOrHideTaxEnabled = this.props.context.request.app.config?.isEnableShowOrHideSalesTaxECommerceEnabled === true;\n\n return channelConfiguration && ArrayExtensions.hasElements(cart?.cart.CartLines) && !cart?.hasInvoiceLine\n ? OrderSummary({\n cart: cart!.cart,\n subTotalLabel: resources.itemsWithCountLabel,\n shippingLabel: resources.estimatedShippingLabel,\n otherChargeLabel: resources.otherCharges,\n taxLabel: resources.estimatedTaxLabel,\n orderTotalLabel: resources.orderTotal,\n totalDiscountsLabel: resources.totalDiscountsLabel,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n toBeCalculatedText: resources.yetToBeCalculatedText,\n freeText: resources.priceFree,\n channelConfiguration,\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig: channelDeliveryOptionConfig?.result,\n telemetry,\n isTaxIncludedInPrice: cart!.cart.IsTaxIncludedInPrice,\n isShowTaxBreakup: isShowOrHideTaxEnabled\n })\n : undefined;\n }\n\n /**\n * Gets promo code.\n * @returns React node with the promo code.\n */\n private _getPromoCode(): React.ReactNode {\n const {\n data: {\n cart: { result: cart }\n },\n resources\n } = this.props;\n\n return (\n cart && (\n \n )\n );\n }\n\n /**\n * Generate add to order template dialog resources.\n * @param resources - The resources.\n * @returns IAddToOrderTemplateDialogResources.\n */\n private _generateAddToOrderTemplateDialogResources(resources: ICartResources): IAddToOrderTemplateDialogResources {\n return {\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\n\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\n\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\n\n selectTemplatesText: resources.selectTemplatesText,\n addToTemplateButtonText: resources.addToTemplateButtonText,\n lineItemsText: resources.lineItemsText\n };\n }\n\n /**\n * Generate item added to order template dialog resources.\n * @param resources - The resources.\n * @returns IItemAddedToOrderTemplateDialogResources.\n */\n private _generateItemAddedToOrderTemplateDialogResources(resources: ICartResources): IItemAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\n freePriceText: resources.freePriceText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText\n };\n }\n\n /**\n * Generate lines added to order template dialog resources.\n * @param resources - The resources.\n * @returns ILinesAddedToOrderTemplateDialogResources.\n */\n private _generateLinesAddedToOrderTemplateDialogResources(resources: ICartResources): ILinesAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n linesAddedToOrderTemplateHeaderItemsOneText: resources.linesAddedToOrderTemplateHeaderItemsOneText,\n linesAddedToOrderTemplateHeaderItemsFormatText: resources.linesAddedToOrderTemplateHeaderItemsFormatText,\n linesAddedToOrderTemplateHeaderLinesOneText: resources.linesAddedToOrderTemplateHeaderLinesOneText,\n linesAddedToOrderTemplateHeaderLinesFormatText: resources.linesAddedToOrderTemplateHeaderLinesFormatText,\n linesAddedToOrderTemplateHeaderMessageText: resources.linesAddedToOrderTemplateHeaderMessageText,\n linesAddedToOrderTemplateCustomPriceAlertMessageText: resources.linesAddedToOrderTemplateCustomPriceAlertMessageText\n };\n }\n\n /**\n * Generate duplicate items when adding to order template dialog resources.\n * @param resources - The resources.\n * @returns IDuplicateItemsWhenAddingToOrderTemplateDialogResources.\n */\n private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources: ICartResources\n ): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\n return {\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\n updateQuantityButtonText: resources.updateQuantityButtonText,\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\n };\n }\n\n /**\n * Generate order template name dialog resources.\n * @param resources - The resources.\n * @returns IOrderTemplateNameDialogResources.\n */\n private _generateOrderTemplateNameDialogResources(resources: ICartResources): IOrderTemplateNameDialogResources {\n return {\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\n orderTemplateTitleLabel: resources.orderTemplateTitle,\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\n orderTemplateDescription: resources.createOrderTemplateDescription,\n\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\n\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\n };\n }\n\n /**\n * Gets the cart lines view props.\n * @returns ICartlinesViewProps [].\n */\n private _getCartLines(): ICartlinesViewProps[] | null {\n const {\n data: {\n cart: { result: cart },\n wishlists: { result: wishlists },\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n context: {\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\n },\n config,\n telemetry,\n resources,\n modules\n } = this.props;\n\n const imageSettings = this.getImageSettings(config.imageSettings);\n\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n );\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\n\n const cartlinesErrors: CartLineValidationResultsByLineId = this.state.cartlinesErrors;\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const isMultipleCatalogsFeatureEnabled =\n this.props.data.featureState.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled ||\n false;\n return ArrayExtensions.hasElements(cart?.cart.CartLines)\n ? CartLineItems({\n cartlines: cart!.cart.CartLines,\n storeSelectorModuleId: storeSelectorId,\n cartlinesErrors,\n products: this.props.data.products.result,\n productAvailabilites: this.props.data.productAvailabilites.result,\n productDeliveryOptions: this.props.data.deliveryOptions.result,\n catalogs: this.props.data.catalogs?.result,\n imageSettings,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n retailMulitplePickupFeatureState: multiplePickUpEnabled,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n amountString: resources.productDimensionTypeAmount,\n quantityDisplayString: resources.quantityDisplayText,\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\n discountStringText: resources.discountStringText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n shippingChargesText: resources.shippingCharges,\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n priceEditorResources: {\n ...resources\n }\n },\n telemetry,\n addToWishlistButtonText: resources.addToWishlistButtonText,\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\n removeButtonText: resources.removeCartButtonText,\n shipItText: resources.shipInsteadDisplayText,\n pickitUpText: resources.pickItUpDisplayText,\n changeStoreText: resources.changeStoreDisplayText,\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\n outOfStockText: resources.outOfStockErrorMessage,\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\n cartState: this.props.data.cart.result,\n orgUnitLocations: this.props.data.orgUnitLocations.result,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\n wishlists,\n defaultWishlistName: resources.defaultWishlistName,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n includeErrors: config.showOutOfStockErrors,\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\n telemetryContent: this.telemetryContent,\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\n\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources\n ),\n\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\n orderTemplates,\n customerInformation,\n productAvailability: this.props.data.productAvailabilites,\n isMultipleCatalogFeatureEnabledInHq: isMultipleCatalogsFeatureEnabled || false\n })\n : null;\n }\n\n /**\n * Gets the checkout URL.\n * @param isAuthenticated - Is authenticated flag.\n * @param guestCheckoutUrl - Guest checkout URL.\n * @param signInUrl -The sign in URL.\n * @returns The checkout URL.\n */\n private getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\n if (isAuthenticated) {\n return guestCheckoutUrl;\n }\n\n const isAbsoluteUrl = urlCheck(guestCheckoutUrl);\n let returnURL = guestCheckoutUrl;\n if (MsDyn365.isBrowser && !isAbsoluteUrl) {\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\n }\n\n return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\n }\n\n /**\n * Gets the image settings.\n * @param imageSettings - Image settings.\n * @returns IImageSettings.\n */\n private readonly getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\n return (\n imageSettings || {\n viewports: {\n xs: { q: 'w=80&h=94&m=6', w: 0, h: 0 },\n sm: { q: 'w=148&h=174&m=6', w: 0, h: 0 },\n lg: { q: 'w=148&h=174&m=6', w: 0, h: 0 }\n },\n lazyload: true\n }\n );\n };\n\n /**\n * Remove item from cart handler.\n * @param cartlineToRemove - The cart line to remove.\n */\n private readonly removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\n if (this.props.data.cart.result) {\n const input = {\n cartLineIds: [cartlineToRemove.LineId!.toString()]\n };\n this.props.data.cart.result\n .removeCartLines(input)\n .then(() => {\n this.validateCart().catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n })\n .catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to Remove Cart Line');\n });\n }\n };\n\n /**\n * Move to wish list handler.\n * @param result - The wish list action success result.\n * @param cartline - The cart line.\n */\n private readonly moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\n if (result.status === 'ADDED' && cartline) {\n this.removeItemFromCartHandler(cartline);\n }\n };\n\n /**\n * Updates the cart line quantity.\n * @param cartlineToUpdate - The cart line.\n * @param quantity - The quantity.\n * @param lineIndex - The line index.\n * @returns True if the cart line was updated, false otherwise.\n */\n private readonly updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number, lineIndex?: number): boolean => {\n cartLineQuantityUpdatedAsync(\n this.isQuantityLimitsFeatureEnabled,\n this.props.data.cart.result,\n this.props.telemetry,\n this.props.data.products.result,\n cartlineToUpdate,\n quantity\n )\n .then((cartActionResult: ICartActionResult | undefined): boolean => {\n if (cartActionResult?.status === 'SUCCESS') {\n this.validateCart().catch(error => {\n this.props.telemetry.warning((error as Error).message);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n this.setState({\n cartlinesErrors: {}\n });\n return true;\n }\n\n if (!ObjectExtensions.isNullOrUndefined(cartActionResult)) {\n // Show update line error message.\n const lineUpdateFailure: LineValidationResult = {\n LineId: ObjectExtensions.isNullOrUndefined(cartlineToUpdate.LineId) ? '0' : cartlineToUpdate.LineId,\n ValidationFailures: [\n {\n ErrorContext: ArrayExtensions.hasElements(cartActionResult.validationResults)\n ? cartActionResult.validationResults[0].ErrorContext\n : '',\n LocalizedMessage: cartActionResult.errorDetails?.LocalizedMessage\n }\n ]\n };\n\n this.setState({\n cartlinesErrors: { ValidationResultsPairs: [lineUpdateFailure] }\n });\n }\n\n return false;\n })\n .catch(() => {\n return false;\n });\n\n return false;\n };\n\n /**\n * Fulfillment store id is updated.\n */\n private readonly fulfillmentStoreIdUpdated = () => {\n if (this.isQuantityLimitsFeatureEnabled) {\n // Refresh products (in props.data) based on latest cart.\n getActiveCartProductsAction(new ActiveCartProductsInput(), this.props.context.actionContext)\n .then(async () => this.validateCart())\n .catch((error: Error) => {\n this.props.telemetry.warning(error.message);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n }\n };\n\n /**\n * Validates cart.\n * @returns Void promise.\n */\n private async validateCart(): Promise {\n if (!this.isQuantityLimitsFeatureEnabled) {\n this.setState({ cartlinesErrors: {}, isCartValid: true });\n return AsyncResult.resolve();\n }\n\n const {\n data: { cart },\n telemetry,\n context\n } = this.props;\n\n const validationResults: CartLineValidationResultsByLineId | undefined = await validateCartAsync(cart, telemetry, context, true);\n\n if (validationResults) {\n const isValid = !ArrayExtensions.hasElements(validationResults.ValidationResultsPairs);\n this.setState({\n cartlinesErrors: validationResults,\n isCartValid: isValid\n });\n } else {\n this.setState({ cartlinesErrors: {}, isCartValid: true });\n }\n\n return AsyncResult.resolve();\n }\n\n /**\n * Get order quantity limit feature flag.\n * @returns True if flag is enabled, false otherwise.\n */\n private async getOrderQuantityLimitsFeatureFlag(): Promise {\n const featureStatuses = await this.props.data.featureState;\n\n try {\n const isQuantityLimitsFeatureEnabledInHq =\n featureStatuses.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n )?.IsEnabled || false;\n if (!isQuantityLimitsFeatureEnabledInHq) {\n return false;\n }\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get feature states');\n return false;\n }\n\n const useSiteBuilderSettings = featureStatuses?.find(\n featureState => featureState.Name === 'RevertToSiteBuilderOrderQuantityLimitsSettings'\n )?.IsEnabled;\n\n if (useSiteBuilderSettings) {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\n return false;\n }\n\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n return true;\n }\n\n try {\n const customerInfo = await this.props.data.customerInformation;\n return (\n !!customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\n );\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get customer info');\n return false;\n }\n } else {\n const cartConfiguration = await this.props.data.cartConfiguration;\n return !(cartConfiguration?.IgnoreOrderSettings ?? false);\n }\n }\n\n private async _isChannelLimitsFeatureEnabled(): Promise {\n const featureStatuses = await this.props.data.featureState;\n\n const isChannelLimitsFeatureEnabledInHq = featureStatuses?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\n )?.IsEnabled;\n\n return isChannelLimitsFeatureEnabledInHq ?? false;\n }\n\n /**\n * Gets the cart lines group.\n * @returns ICartlinesViewProps [][].\n */\n private getCartLinesGroup(): ICartlinesViewProps[][] | null {\n const {\n data: {\n cart: { result: cart },\n wishlists: { result: wishlists },\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n context: {\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\n },\n config,\n telemetry,\n resources,\n modules\n } = this.props;\n\n const imageSettings = this.getImageSettings(config.imageSettings);\n const cartlinesErrors: CartLineValidationResultsByLineId = this.state.cartlinesErrors;\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n );\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\n const { featureState } = this.props.data;\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const isMultipleCatalogsFeatureEnabled =\n featureState.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled || false;\n return this.props.data.products &&\n (cart?.hasInvoiceLine || this.props.data.products.result) &&\n cart &&\n cart.cart.CartLines &&\n cart.cart.CartLines.length > 0 &&\n this.props.data.channelDeliveryOptionConfig?.result\n ? CartLineGroupItems({\n cartlines: cart.cart.CartLines,\n storeSelectorModuleId: storeSelectorId,\n cartlinesErrors,\n products: this.props.data.products.result,\n productAvailabilites: this.props.data.productAvailabilites.result,\n productDeliveryOptions: this.props.data.deliveryOptions.result,\n catalogs: this.props.data.catalogs?.result,\n imageSettings,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n hasInvoiceLine: cart?.hasInvoiceLine || false,\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n retailMulitplePickupFeatureState: multiplePickUpEnabled,\n typeName: this.props.typeName,\n id: this.props.id,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n amountString: resources.productDimensionTypeAmount,\n quantityDisplayString: resources.quantityDisplayText,\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\n discountStringText: resources.discountStringText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n shippingChargesText: resources.shippingCharges,\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n priceEditorResources: {\n ...resources\n }\n },\n telemetry,\n addToWishlistButtonText: resources.addToWishlistButtonText,\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\n removeButtonText: resources.removeCartButtonText,\n shipItText: resources.shipInsteadDisplayText,\n pickitUpText: resources.pickItUpDisplayText,\n changeStoreText: resources.changeStoreDisplayText,\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\n outOfStockText: resources.outOfStockErrorMessage,\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\n cartState: this.props.data.cart.result,\n orgUnitLocations: this.props.data.orgUnitLocations.result,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\n wishlists,\n defaultWishlistName: resources.defaultWishlistName,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n includeErrors: config.showOutOfStockErrors,\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\n telemetryContent: this.telemetryContent,\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\n\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources\n ),\n\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\n orderTemplates,\n customerInformation,\n channelDeliveryOptionConfig: this.props.data.channelDeliveryOptionConfig?.result,\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\n productAvailability: this.props.data.productAvailabilites,\n productPickUpOptions: this.state.productPickUpOptions || this.props.data.cartLinesPickUpOptions?.result,\n isMultipleCatalogFeatureEnabledInHq: isMultipleCatalogsFeatureEnabled || false\n })\n : null;\n }\n}\n\nexport default Cart;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Carousel, ICarouselProps, Player, IPlayerData, IPlayerOptions, IVideoMetadata } from '@msdyn365-commerce/components';\nimport { IImageData, IImageSettings, Image, Video } from '@msdyn365-commerce/core';\nimport { MediaLocation, MediaType, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getFallbackImageUrl, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n defaultDataScale,\n IComponentNodeProps,\n ImagefullView,\n IModalViewProps,\n IModuleProps,\n inlineZoomImageOnHover,\n inlineZoomImageOnMouseMove,\n inlineZoomImageOnMouseOut,\n inlineZoomInitClick,\n INodeProps,\n ISingleSlideCarouselProps,\n isMobile,\n KeyCodes,\n NodeTag,\n onContainerZoomInit,\n onMouseMoveLensContainer,\n onMouseOutLensContainer,\n onMouseOverImageContainer,\n removeContainerZoomStyle,\n removeInlineZoomStyle,\n SingleSlideCarousel,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport * as React from 'react';\n\nimport { IMediaGalleryData } from './media-gallery.data';\nimport { imageSource, imageZoom, IMediaGalleryProps, thumbnailsOrientation } from './media-gallery.props.autogenerated';\nimport { getProductImages, getValidProductImages, getVideoMetadataFromApi, validateProductImages } from './utils';\nimport { getAltText, IMediaData } from './utils/helper';\n\n/**\n * IMediaGalleryState Interface.\n */\nexport interface IMediaGalleryState {\n animating: boolean;\n activeIndex: number;\n isImageZoomed: boolean;\n modalIsOpen: boolean;\n lastUpdate?: number;\n isMobileImageZoomed?: boolean;\n mediaGalleryItems?: IMediaData[];\n isInitialLoad?: boolean;\n shouldUseOptimizedImage?: boolean;\n}\n\n/**\n * IMediaGalleryThumbnailsViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailsViewProps {\n ThumbnailsContainerProps: INodeProps;\n SingleSlideCarouselComponentProps: INodeProps;\n items?: IMediaGalleryThumbnailItemViewProps[];\n}\n\n/**\n * IMediaGalleryThumbnailItemViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailItemViewProps {\n ThumbnailItemContainerProps: INodeProps;\n Picture: React.ReactElement;\n}\n\n/**\n * IMediaGalleryViewProps Interface.\n */\nexport interface IMediaGalleryViewProps extends IMediaGalleryProps {\n state: IMediaGalleryState;\n MediaGallery: IModuleProps;\n CarouselProps: INodeProps;\n Thumbnails: IMediaGalleryThumbnailsViewProps;\n Modal?: React.ReactElement | null;\n callbackToggle?(): void;\n callbackThumbnailClick?(index: number): void;\n callbackThumbnailKeyDown?(index: number): void;\n}\n\n/**\n * Props for carousel.\n */\ninterface IMediaGalleryCarouselItems {\n items: ItemType[];\n keys: (string | undefined)[];\n}\n\n/**\n * Media gallery component.\n */\nclass MediaGallery extends React.Component, IMediaGalleryState> {\n private readonly _inlineZoomDivRef: Map = new Map();\n\n private readonly fullScreenOverlayButtonRef: React.RefObject = React.createRef();\n private readonly player: React.RefObject = React.createRef();\n private fallbackImage?: string;\n\n private readonly defaultGalleryImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\n sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\n md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\n lg: { q: 'h=772&m=8', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly defaultThumbnailImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=100&m=8', w: 100, h: 0 },\n lg: { q: 'w=100&m=8', w: 100, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly _zoomedImageSettings: IImageSettings;\n\n public constructor(props: IMediaGalleryProps) {\n super(props);\n this._toggleModal = this._toggleModal.bind(this);\n const mediaGalleryImages = this.getImagesData();\n this.state = {\n activeIndex: 0,\n animating: false,\n isImageZoomed: false,\n modalIsOpen: false,\n isInitialLoad: true,\n shouldUseOptimizedImage: !!this.props.config.skipImageValidation,\n mediaGalleryItems: mediaGalleryImages\n };\n\n this._zoomedImageSettings =\n props.config.zoomedImageSettings ?? props.config.galleryImageSettings ?? this.defaultGalleryImageSettings;\n\n this._onImageMouseOut = this._onImageMouseOut.bind(this);\n this._inlineZoomImageOnHover = this._inlineZoomImageOnHover.bind(this);\n this._onInlineImageClick = this._onInlineImageClick.bind(this);\n this._onContainerZoomImageClick = this._onContainerZoomImageClick.bind(this);\n this._onMouseOutLensContainer = this._onMouseOutLensContainer.bind(this);\n }\n\n public isMobile(): boolean {\n const size = isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n return size === 'xs';\n }\n\n public async componentDidMount(): Promise {\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n const shouldUpdateOnPartialDimensionSelection = this.props.config.shouldUpdateOnPartialDimensionSelection;\n this._setRenderType();\n if (!this.props.context.request.app?.config?.OmniChannelMedia) {\n if (source === imageSource.pageContext) {\n if (this.state.mediaGalleryItems === undefined && this.props.data.mediaLocationsForSelectedVariant.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocationsForSelectedVariant.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n );\n await this._setImages(images);\n } else if (this.state.mediaGalleryItems === undefined && this.props.data.product.result) {\n const product = this.props.data.product.result;\n const images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n product.productVariant\n );\n\n await this._setImages(images);\n } else {\n await this._setImages([]);\n }\n }\n }\n\n reaction(\n () => {\n const product = this.props.data.product.result;\n if (!product) {\n return null;\n }\n\n if (!shouldUpdateOnPartialDimensionSelection || !product.productVariant?.RecordId) {\n return `${product.RecordId}`;\n }\n\n return `${product.RecordId}-${product.productVariant.RecordId}`;\n },\n async () => {\n const product = this.props.data.product.result;\n let images: IImageData[] = [];\n if (product) {\n if (this.props.context.app?.config?.OmniChannelMedia) {\n images = await getProductImages(\n product.RecordId,\n this.shouldUseCmsAltText(),\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n product.Name,\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\n );\n } else {\n images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\n );\n }\n await this._setImages(images);\n } else {\n await this._setImages([]);\n }\n },\n { fireImmediately: true }\n );\n\n if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocations.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n );\n await this._setImages(images);\n }\n }\n\n public shouldComponentUpdate(nextProps: IMediaGalleryProps, nextState: IMediaGalleryState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const { id, config, resources } = this.props;\n\n const { className, showPaginationTooltip } = config;\n\n const isVertical: boolean = config.thumbnailsOrientation === thumbnailsOrientation.vertical;\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- || is required.\n const isFullscreenAllowed: boolean = this.isMobile() || config.allowFullScreen || false;\n const zoomViewMode: string =\n config.imageZoom === imageZoom.inline ? imageZoom.inline : config.imageZoom === imageZoom.container ? imageZoom.container : '';\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = this.props.context.app.config?.placeholderImageName as string;\n if (this.props.data.product.result) {\n this.fallbackImage = getFallbackImageUrl(\n this.props.data.product.result.ItemId,\n this.props.context.request.apiSettings,\n this.props.context.request.app?.config?.OmniChannelMedia\n );\n }\n if (emptyPlaceHolderImage && this.fallbackImage) {\n this.fallbackImage = `${this.fallbackImage}&fallback=${emptyPlaceHolderImage}`;\n }\n\n const mediaGalleryCarouselItems = this._getMediaGalleryItems(isFullscreenAllowed, zoomViewMode);\n const mediaGalleryThumbnailCarouselItems = this._getMediaGalleryThumbnailItems();\n const viewProps: IMediaGalleryViewProps = {\n ...(this.props as IMediaGalleryProps),\n state: this.state,\n MediaGallery: {\n moduleProps: this.props,\n className: classnames(`ms-media-gallery ${isVertical ? 'vertical' : ''}`, className)\n },\n Modal: isFullscreenAllowed ? this.imageModalSlider(zoomViewMode) : null,\n callbackToggle: this.openModalDialog,\n callbackThumbnailClick: this._generateOnThumbnailClick,\n callbackThumbnailKeyDown: this._generateOnThumbnailKeyDown,\n CarouselProps: {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items: mediaGalleryCarouselItems.items,\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: showPaginationTooltip === true,\n indicatorAriaText: resources.ariaLabelForSlide,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n key: mediaGalleryCarouselItems.keys\n } as IComponentNodeProps,\n Thumbnails: {\n ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: 'ms-media-gallery__thumbnails',\n vertical: isVertical,\n flipperPrevLabel: resources.previousScreenshotFlipperText,\n flipperNextLabel: resources.nextScreenshotFlipperText,\n parentId: id,\n useTabList: true,\n key: JSON.stringify(mediaGalleryThumbnailCarouselItems.keys)\n } as IComponentNodeProps,\n items: mediaGalleryThumbnailCarouselItems.items\n }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Zoomed out image on previous/next click.\n */\n public updateZoomedInImage(): void {\n this.setState({ isImageZoomed: false });\n }\n\n private readonly onExiting = () => {\n this.setState({ animating: true });\n };\n\n private readonly onExited = () => {\n this.setState({ animating: false });\n };\n\n /**\n * On click next in carousel.\n */\n private readonly next = (): void => {\n removeInlineZoomStyle();\n if (this.isLastItem() === undefined) {\n return;\n }\n\n const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex + 1;\n this.goToIndex(nextIndex);\n\n this.updateZoomedInImage();\n };\n\n /**\n * On click previous in carousel.\n */\n private readonly previous = (): void => {\n removeInlineZoomStyle();\n const images = this.state.mediaGalleryItems;\n const nextIndex = this.isFirstItem() ? (images ? images.length - 1 : 0) : this.state.activeIndex - 1;\n this.goToIndex(nextIndex);\n this.updateZoomedInImage();\n };\n\n private readonly goToIndex = (index: number): void => {\n const { autoplay } = this.props.config;\n const currentIndex = this.state.activeIndex;\n const mediaItems = this.state.mediaGalleryItems;\n if (autoplay && mediaItems) {\n if (mediaItems[`${index}`]?.mediaTypeValue === MediaType.Video) {\n this.player.current?.play();\n } else if (mediaItems[`${currentIndex}`].mediaTypeValue === MediaType.Video) {\n this.player.current?.pause();\n }\n }\n this.setState({ activeIndex: index });\n };\n\n private _getMediaGalleryThumbnailItems(): IMediaGalleryCarouselItems {\n const mediaGalleryItems = this.state.mediaGalleryItems;\n const thumbnailImageSettings = this.props.config.thumbnailImageSettings;\n if (thumbnailImageSettings) {\n thumbnailImageSettings.cropFocalRegion = true;\n }\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n const defaultKey = 0;\n return {\n items: [this._getEmptyThumbnailItem(thumbnailImageSettings, defaultKey, this.state.activeIndex)],\n keys: ['empty']\n };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\n if (item.mediaTypeValue === MediaType.Video) {\n return this.getVideoThumbNailItem(\n item,\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n index,\n this.state.activeIndex\n );\n } else {\n return this._getThumbnailItem(\n item,\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n index,\n this.state.activeIndex\n );\n }\n })\n ],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private getImagesData = (): IImageData[] => {\n if (this.props.config.skipImageValidation || this.props.context.request.app?.config?.OmniChannelMedia) {\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n let images: IImageData[] = [];\n let mediaLocations: MediaLocation[] = [];\n if (source === imageSource.pageContext && this.props.data.mediaLocationsForSelectedVariant.result) {\n mediaLocations = this.props.data.mediaLocationsForSelectedVariant.result;\n } else if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n mediaLocations = this.props.data.mediaLocations.result;\n }\n images = mediaLocations.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(\n this.props.context.actionContext.requestContext,\n this.shouldUseCmsAltText(),\n this.props.data.product.result?.Name,\n mediaLocation.AltText\n ),\n additionalProperties: mediaLocation.IsApplicableForChildEntities\n ? {\n isApplicableForChildEntities: 'true'\n }\n : undefined\n };\n });\n const curatedImages = this.props.config.images ?? [];\n\n return [...this._filterMasterImageFromVariant(images), ...curatedImages];\n }\n return [];\n };\n\n private _getMediaGalleryItems(isFullscreenAllowed: boolean, zoomViewMode: string): IMediaGalleryCarouselItems {\n const mediaGalleryItems = this.state.mediaGalleryItems;\n const galleryImageSettings = this.props.config.galleryImageSettings;\n if (galleryImageSettings) {\n galleryImageSettings.cropFocalRegion = true;\n }\n\n const zoomView = isFullscreenAllowed ? 'fullscreen' : zoomViewMode;\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n return { items: [this._renderEmptyImage(galleryImageSettings)], keys: ['empty'] };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\n return this._renderCarouselItemImageView(\n zoomView,\n item,\n galleryImageSettings ?? this.defaultGalleryImageSettings,\n index\n );\n })\n ],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private async _setImages(images?: IMediaData[]): Promise {\n const curatedImage = this.props.config.images || [];\n const mediaToSet: IMediaData[] = this._filterMasterImageFromVariant(images);\n\n void Promise.all(\n mediaToSet.map(async mediaData => {\n if (mediaData.mediaTypeValue === MediaType.Video && mediaData.src) {\n try {\n const url = new URL(mediaData.src);\n const videoId = url.searchParams.get('CVID');\n if (videoId) {\n mediaData.videoData = await getVideoMetadataFromApi(videoId, this.props.context.actionContext);\n }\n } catch (error) {\n if (this.props.telemetry) {\n this.props.telemetry.debug('Error while fetching videoId');\n }\n }\n }\n return mediaData;\n })\n ).then(mediaData => {\n const mediaItems = mediaData.filter(element => {\n return (\n element.mediaTypeValue !== MediaType.Video ||\n (element.mediaTypeValue === MediaType.Video && element.videoData !== undefined)\n );\n });\n\n this.setState({\n mediaGalleryItems: [...mediaItems, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now(),\n shouldUseOptimizedImage: false\n });\n });\n\n this.setState({\n mediaGalleryItems: [...mediaToSet, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now(),\n shouldUseOptimizedImage: false\n });\n }\n\n private _setRenderType(): void {\n this.setState({\n isInitialLoad: false\n });\n }\n\n private _renderCarouselItemImageView(\n zoomView: string,\n media: IMediaData,\n imageSettings: IImageSettings,\n index: number,\n isInPopup: boolean = false\n ): React.ReactNode {\n if (media.mediaTypeValue === MediaType.Video) {\n if (isInPopup || zoomView !== 'fullscreen') {\n return <>{this._renderCarouselItemVideo(media, index, imageSettings)};\n }\n return <>{this._renderVideoThumbnail(media, index, imageSettings)};\n } else {\n if (this.isMobile()) {\n if (isInPopup) {\n return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\n }\n return this._renderImageFullScreenOnZoom(media, imageSettings, index);\n }\n\n switch (zoomView) {\n case 'container': {\n return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\n }\n case 'inline': {\n return this._renderImageInlineOnZoom(media, this._zoomedImageSettings, index);\n }\n case 'fullscreen': {\n return this._renderImageFullScreenOnZoom(media, imageSettings, index);\n }\n\n // No default\n }\n return <>{this._getCarouselItem(media, imageSettings, index, isInPopup)};\n }\n }\n\n private _filterMasterImageFromVariant(images?: IImageData[]): IImageData[] {\n const shouldHidePrimaryImages = this.props.config.shouldHideMasterProductImagesForVariant ?? true;\n let variantImages = images ?? [];\n const isVariantProduct =\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.MasterProductId) ||\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.productVariant);\n const itemId = this.props.data.product.result?.ItemId;\n if (shouldHidePrimaryImages && isVariantProduct && itemId) {\n variantImages = variantImages.filter(item => {\n const isApplicableForChildEntities = item.additionalProperties?.isApplicableForChildEntities;\n return !isApplicableForChildEntities;\n });\n if (!ArrayExtensions.hasElements(variantImages)) {\n variantImages = images ?? [];\n }\n }\n return variantImages;\n }\n\n private readonly _renderCarouselItemVideo = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\n const videoData = mediaData.videoData;\n if (videoData) {\n const options: IPlayerOptions = this.props.config as IPlayerOptions;\n const playerResources = this.props.resources;\n const videoMetaData: IVideoMetadata = {};\n videoMetaData.videoId = videoData.id;\n videoMetaData.title = videoData.title;\n videoMetaData.duration = videoData.playTime;\n if (videoData.thumbnail) {\n videoMetaData.posterframeUrl = videoData.thumbnail.src;\n }\n if (videoData._links?.binaryReferences) {\n videoMetaData.videoBinaryReferences = videoData._links.binaryReferences;\n }\n const videoPlayerData: IPlayerData = { options, metaData: videoMetaData };\n const attributes = {\n id: `${this.props.id}__carousel-item__${index}`\n };\n return (\n \n );\n }\n return this._renderEmptyImage(imageSettings);\n };\n\n private readonly _getCarouselItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n isInPopup: boolean = false\n ): React.ReactNode => (\n \n );\n\n private readonly _getThumbnailItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps => {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: index,\n 'aria-label': image.altText,\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n };\n\n /**\n * Gets the video thumbnail item to display media gallery.\n * @param props - The Media gallery view props from business layer.\n * @returns Return thumbnail view props which will be used to render video.\n */\n private readonly getVideoThumbNailItem = (\n mediaData: IMediaData,\n imageSettings: IImageSettings,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps => {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n const videoData = mediaData.videoData;\n let image: IImageData;\n if (videoData?.thumbnail) {\n image = videoData.thumbnail;\n } else {\n image = {\n src: 'empty'\n };\n }\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: index,\n 'aria-label': image.altText,\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n };\n\n /**\n * Ref Handler.\n * @param index -Remove item click function.\n * @returns Set inline zoom.\n */\n private readonly _refHandler = (index: number) => (divRef: HTMLDivElement) => {\n this._inlineZoomDivRef.set(index, divRef);\n };\n\n private readonly _generateOnThumbnailKeyDown = (index: number) => {\n return (event: React.KeyboardEvent) => {\n if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\n event.preventDefault();\n\n this.goToIndex(index);\n }\n };\n };\n\n private readonly _generateOnThumbnailClick = (index: number) => {\n return (event: React.MouseEvent) => {\n event.preventDefault();\n\n this.goToIndex(index);\n };\n };\n\n private _renderImageInlineOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n \n \n \n \n );\n }\n\n private _inlineZoomImageOnHover(event: React.MouseEvent): void {\n inlineZoomImageOnHover(event, this.props.config.dataScale ?? String(defaultDataScale));\n }\n\n private _handleMobileViewZoomedImageClick(event: React.MouseEvent) {\n const target = this.state.shouldUseOptimizedImage ? (event.target as HTMLImageElement) : event.currentTarget;\n const mobileZoomedInImageClassName = 'msc-mobile-zoomed-in';\n if (!this.state.isMobileImageZoomed) {\n const bounds = target.getBoundingClientRect();\n const dataScale = Number(this.props.config.dataScale ?? defaultDataScale);\n\n const positionX = event.clientX - bounds.left;\n const positionY = event.clientY - bounds.top;\n const scaledPositionX = positionX * dataScale;\n const scaledPositionY = positionY * dataScale;\n\n target.style.transform = `scale(${dataScale})`;\n target.classList.add(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = 'auto';\n target.parentElement!.scrollTo(scaledPositionX - positionX, scaledPositionY - positionY);\n this.setState({\n isMobileImageZoomed: true\n });\n } else {\n target.style.transform = '';\n target.classList.remove(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = '';\n this.setState({\n isMobileImageZoomed: false\n });\n }\n }\n\n private _onInlineImageClick(event: React.MouseEvent): void {\n if (window.innerWidth <= 768) {\n // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n inlineZoomInitClick(event, this.props.config.dataScale ?? String(defaultDataScale));\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onImageMouseOut(event: React.MouseEvent): void {\n inlineZoomImageOnMouseOut(event);\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _onContainerZoomImageClick(event: React.MouseEvent): void {\n if (window.innerWidth <= 768) {\n // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n\n onContainerZoomInit(event);\n\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onMouseOutLensContainer(event: React.MouseEvent): void {\n onMouseOutLensContainer(event);\n\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _renderImageInContainerOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n
\n \n \n
\n );\n }\n\n private _renderImageFullScreenOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n
\n \n
\n {}\n \n
\n
\n );\n }\n\n /**\n * Render the video thumbnail in full screen.\n * @param mediaData - Media Data.\n * @param index - Index\n * @param imageSettings - Image settings.\n * @returns - JSX.Element\n */\n private readonly _renderVideoThumbnail = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\n const videoData = mediaData.videoData;\n let image: IImageData;\n if (videoData?.thumbnail) {\n image = videoData.thumbnail;\n } else {\n image = {\n src: 'empty'\n };\n }\n\n return (\n
\n \n
\n {}\n \n
\n
\n );\n };\n\n private _mapProductToImageData(product: SimpleProduct): IImageData {\n return {\n src: product.PrimaryImageUrl ?? ''\n };\n }\n\n private _renderEmptyImage(imageSettings: IImageSettings | undefined): React.ReactNode {\n return (\n
\n \n
\n );\n }\n\n private _getEmptyThumbnailItem(\n imageSettings: IImageSettings | undefined,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: 'empty',\n 'aria-label': '',\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n }\n\n private readonly isFirstItem = () => this.state.activeIndex === 0;\n\n private readonly isLastItem = () => {\n const images = this.state.mediaGalleryItems;\n return images && this.state.activeIndex === images.length - 1;\n };\n\n private readonly openModalDialog = (): void => {\n this._toggleModal();\n };\n\n private _toggleModal(): void {\n if (this.state.modalIsOpen) {\n this.fullScreenOverlayButtonRef.current?.focus();\n const parentDiv = this._inlineZoomDivRef.get(this.state.activeIndex);\n if (parentDiv && parentDiv.children && parentDiv.children.length >= 2) {\n const image = parentDiv.children[1].querySelector('img');\n if (image) {\n image.removeAttribute('style');\n }\n }\n this.setState({\n isImageZoomed: false\n });\n }\n this.setState({\n isImageZoomed: false,\n modalIsOpen: !this.state.modalIsOpen\n });\n removeInlineZoomStyle();\n removeContainerZoomStyle();\n }\n\n private readonly imageModalSlider = (ZoomView: string): React.ReactElement => {\n const {\n data: {\n product: { result: product }\n },\n resources\n } = this.props;\n let mediaGalleryItems = this.state.mediaGalleryItems;\n\n if (!mediaGalleryItems && product) {\n mediaGalleryItems = [this._mapProductToImageData(product)];\n }\n const carouselprops = {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items:\n mediaGalleryItems &&\n mediaGalleryItems.map((item: IImageData, index: number) =>\n this._renderCarouselItemImageView(ZoomView, item, this._zoomedImageSettings, index, true)\n ),\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: true,\n hideIndicator: false,\n keyboard: false,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n isDisabledFunctionality: this.state.isMobileImageZoomed\n } as IComponentNodeProps;\n const carousel = ;\n\n const imageModalSliderProps: IModalViewProps = {\n modalIsOpen: this.state.modalIsOpen,\n ontoggle: this._toggleModal,\n galleryCarousel: carousel,\n classNames: classnames('ms-media-gallery__modal', 'msc-modal-input-required')\n };\n return ImagefullView(imageModalSliderProps) as React.ReactElement;\n };\n\n private shouldUseCmsAltText = (): boolean => {\n if (this.props.config.altTextSource === 'product') {\n return false;\n } else {\n return true;\n }\n };\n}\n\nexport default MediaGallery;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { IInvoiceSummaryLines } from '@msdyn365-commerce-modules/invoice-payment-summary';\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ICartViewProps, IOrderSummaryErrors } from './cart';\nimport { ICartlinesViewProps } from './components/cart-line-items';\nimport { ICartLineItemViewProps } from './components/cart-line-items-promotion';\n\nconst _renderCartlines = (\n cartLines: ICartlinesViewProps[] | undefined,\n cartEmptyText: string,\n CartlinesWrapper: INodeProps,\n storeSelector: React.ReactNode | undefined,\n backToShoppingButton: React.ReactNode,\n waitingComponent: React.ReactNode,\n cartLoadingStatus: string,\n cartDataResult: boolean\n): JSX.Element[] | JSX.Element => {\n if (cartLoadingStatus) {\n return <>{cartLoadingStatus};\n }\n if (cartLines) {\n return cartLines.map(cartLine => {\n return (\n
\n {cartLine.cartline}\n {storeSelector && cartLine.pickUpInStore ? (\n {cartLine.pickUpInStore.defaultComponent}\n ) : null}\n {cartLine.addToOrderTemplate ? (\n \n {cartLine.remove}\n {cartLine.addToWishlist}\n {cartLine.addToOrderTemplate}\n \n ) : (\n <>\n {cartLine.remove}\n {cartLine.addToWishlist}\n \n )}\n
\n );\n });\n }\n return cartDataResult ? (\n
\n

{cartEmptyText}

\n {backToShoppingButton}\n
\n ) : (\n <>{waitingComponent}\n );\n};\n\n/**\n * Method will render error block.\n * @param errorData -The order summary errors interface.\n * @returns Jsx element.\n */\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\n if (!errorData || !ArrayExtensions.hasElements(errorData.errors)) {\n return null;\n }\n return (\n \n {errorData.header}\n {errorData.errors}\n \n );\n};\n\n/**\n * Method will render invoice summary lines.\n * @param invoiceSummaryLines -The invoicesummary lines interface.\n * @param OrderSummaryItems -The order summary items props.\n * @param props -The cartview props.\n * @returns Jsx element.\n */\nconst _renderInvoiceSummarylines = (\n invoiceSummaryLines: IInvoiceSummaryLines | undefined,\n OrderSummaryItems: INodeProps,\n props: ICartViewProps\n): JSX.Element | null => {\n if (!invoiceSummaryLines) {\n props.context.telemetry.error('InvoiceSummary content is empty, module wont render');\n return null;\n }\n return (\n \n {invoiceSummaryLines.invoices}\n {invoiceSummaryLines.giftCard}\n {invoiceSummaryLines.loyalty}\n {invoiceSummaryLines.orderTotal}\n \n );\n};\n\n/**\n * Method will render order summary lines.\n * @param orderSummaryLines -The ordersummary lines interface.\n * @param OrderSummaryItems -The order summary items props.\n * @param props -The cartview props.\n * @returns Jsx element.\n */\nconst _renderOrderSummarylines = (\n orderSummaryLines: IOrderSummaryLines | undefined,\n OrderSummaryItems: INodeProps,\n props: ICartViewProps\n): JSX.Element | null => {\n if (!orderSummaryLines) {\n props.context.telemetry.error('OrderSummary content is empty, module wont render');\n return null;\n }\n return (\n \n {props.promoCode}\n {orderSummaryLines.subtotal}\n {orderSummaryLines.shipping}\n {orderSummaryLines.otherCharge}\n {orderSummaryLines.tax}\n {orderSummaryLines.totalDiscounts ? orderSummaryLines.totalDiscounts : null}\n {orderSummaryLines.orderTotal}\n \n );\n};\n\n/**\n * Method will render cart promotions.\n * @param promotions -The cartline item view props.\n * @returns Jsx element.\n */\nconst _renderPromotions = (promotions: ICartLineItemViewProps): JSX.Element | undefined => {\n return (\n <>\n \n {promotions.promotionMessage}\n {promotions.promotionSeeAllLink}\n {promotions.promotionDialog}\n \n \n );\n};\n\n/**\n * Method will render cartlines group title.\n * @param cartLine -The cartline view props.\n * @param titleSeparate -The title separate.\n * @returns Jsx element.\n */\nconst renderCartLinesGroupTitle = (cartLine: ICartlinesViewProps, titleSeparate: string) => {\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\n return (\n <>\n \n {isBopisSelected ? (\n

\n {cartLine.pickUpInStore?.deliveryOption}\n {titleSeparate}\n {cartLine.pickUpInStore?.orgUnitName}\n

\n ) : null}\n
\n \n );\n};\n\n/**\n * Method will render cartlines groups header title.\n * @param pickUpText -The pickup text for group.\n * @param shippingText -The shipping text for group.\n * @param emailShippingText -The email shipping text for group.\n * @param titleSeparate -The title separator.\n * @param cartLine -The cartline view props.\n * @param emailDeliveryModeCode -The email delivery code from channel.\n * @returns Jsx element.\n */\nconst renderCartLinesGroupHeader = (\n pickUpText: string,\n shippingText: string,\n emailShippingText: string,\n titleSeparate: string,\n cartLine: ICartlinesViewProps,\n emailDeliveryModeCode?: string\n) => {\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\n let groupTitle: string;\n\n groupTitle = isBopisSelected ? pickUpText : shippingText;\n if (!StringExtensions.isNullOrEmpty(emailDeliveryModeCode)) {\n groupTitle = cartLine.data && cartLine.data.cartline.DeliveryMode === emailDeliveryModeCode ? emailShippingText : groupTitle;\n }\n\n return (\n <>\n
\n

\n

{groupTitle}

\n {renderCartLinesGroupTitle(cartLine, titleSeparate)}\n
\n \n );\n};\n\n/**\n * Method will render cartlines in groups.\n * @param props -The cartline.\n * @returns Jsx element.\n */\nconst renderCartLinesGroup = (props: ICartViewProps): JSX.Element | undefined => {\n if (props.cartLinesGroup && ArrayExtensions.hasElements(props.cartLinesGroup)) {\n return (\n
\n {props.cartLinesGroup.map(cartlines => {\n return (\n
\n {renderCartLinesGroupHeader(\n props.resources.pickUpText,\n props.resources.shippingText,\n props.resources.emailshippingText,\n props.resources.titleSeparate,\n cartlines[0],\n props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode\n )}\n {_renderCartlines(\n cartlines,\n props.resources.emptyCartText,\n props.CartlinesWrapper,\n props.storeSelector,\n props.backToShoppingButton,\n props.waitingComponent,\n props.cartLoadingStatus,\n props.cartDataResult\n )}\n
\n );\n })}\n
\n );\n }\n return props.cartDataResult ? (\n
\n
\n

{props.resources.emptyCartText}

\n {props.backToShoppingButton}\n
\n
\n ) : (\n <>{props.waitingComponent}\n );\n};\n\nconst CartView: React.FC = (props: ICartViewProps) => (\n
\n {props.title}\n {!props.cart?.hasInvoiceLine && props.promotionOptions && _renderPromotions(props.promotionOptions)}\n {props.multiplePickUpEnabled ? (\n renderCartLinesGroup(props)\n ) : (\n \n {_renderCartlines(\n props.cartlines,\n props.resources.emptyCartText,\n props.CartlinesWrapper,\n props.storeSelector,\n props.backToShoppingButton,\n props.waitingComponent,\n props.cartLoadingStatus,\n props.cartDataResult\n )}\n \n )}\n {props.orderSummaryHeading && (\n \n {props.orderSummaryHeading}\n {props.cart?.hasInvoiceLine\n ? _renderInvoiceSummarylines(props.invoiceSummaryLineitems, props.OrderSummaryItems, props)\n : _renderOrderSummarylines(props.orderSummaryLineitems, props.OrderSummaryItems, props)}\n {_renderErrorBlock(props.OrderSummaryErrors)}\n {props.checkoutAsSignInUserButton}\n {props.checkoutAsGuestButton}\n {props.expressCheckoutButton && ArrayExtensions.hasElements(props.expressCheckoutButton) ? (\n {props.expressCheckoutButton}\n ) : null}\n {props.backToShoppingButton}\n {props.createTemplateFromCartButton}\n \n )}\n {props.storeSelector}\n
\n);\n\nexport default CartView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n ActiveCartProductsInput,\n getActiveCartProductsAction,\n getAvailabilitiesForCartLineItems,\n getDeliveryOptionsForCartLineItems,\n IProductInventoryInformation,\n ProductAvailabilitiesForCartLineItems,\n ProductDeliveryOptionsForCartLineItems\n} from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * IMiniCartData entity interface.\n */\nexport interface IMiniCartData {\n products?: SimpleProduct[];\n productAvailabilites?: IProductInventoryInformation[];\n deliveryOptions?: ProductDeliveryOptions[];\n}\n\nexport const createInput = () => {\n return new ActiveCartProductsInput();\n};\n\n/**\n * Calls the Retail API and returns a mini cart data.\n * @param ctx\n * @param cartState\n */\nexport async function getMiniCartData(ctx: IActionContext, cartState: ICartState): Promise {\n const miniCartData: IMiniCartData = {};\n\n const cart = cartState.cart;\n\n // If there are cart lines, make call to get products\n // If there are invocie linese, then there is no products, so don't make call to get products\n if (cart && cart.CartLines && cart.CartLines.length > 0 && !cartState.hasInvoiceLine) {\n await getActiveCartProductsAction(new ActiveCartProductsInput(), ctx)\n .then(products => {\n if (products) {\n miniCartData.products = products;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n\n await getAvailabilitiesForCartLineItems(new ProductAvailabilitiesForCartLineItems(ctx.requestContext.apiSettings), ctx)\n .then(availableQuantity => {\n if (availableQuantity) {\n miniCartData.productAvailabilites = availableQuantity;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n\n await getDeliveryOptionsForCartLineItems(new ProductDeliveryOptionsForCartLineItems(ctx.requestContext.apiSettings), ctx)\n .then(deliveryOptions => {\n if (deliveryOptions) {\n miniCartData.deliveryOptions = deliveryOptions;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n }\n\n return miniCartData;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AddToCartBehavior, CartIconComponent } from '@msdyn365-commerce/components';\nimport { getUrlSync, IDictionary, IImageSettings, msdyn365Commerce, TelemetryEvent } from '@msdyn365-commerce/core';\nimport {\n CartLine,\n ChannelDeliveryOptionConfiguration,\n CartLineValidationResultsByLineId,\n OrgUnitLocation\n} from '@msdyn365-commerce/retail-proxy';\nimport { validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\nimport { ArrayExtensions, validateCartLinesInventory } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n INodeProps,\n ITelemetryContent,\n TelemetryConstant,\n UncontrolledTooltip,\n updateMaxQuantityForCartLineItem,\n urlCheck\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport React from 'react';\n\nimport { ICartIconData } from './cart-icon.data';\nimport { cartLinesSortOrder, ICartIconProps } from './cart-icon.props.autogenerated';\nimport { FlyoutCartLineItems, IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\nimport { getMiniCartData, IMiniCartData } from './utils/get-products-in-mini-cart';\n\nexport interface IMiniCartState {\n miniCartData: IMiniCartData;\n orgUnitLocations?: OrgUnitLocation[];\n isQuantityLimitsFeatureEnabled: boolean;\n isCartValid: boolean;\n}\n\nexport interface ICartIconViewProps extends ICartIconProps {\n className: string;\n cartIcon: React.ReactNode;\n FlyoutContainer?: INodeProps;\n CartlinesWrapper: INodeProps;\n miniCartWrapper: INodeProps;\n miniCartItemWrapper: INodeProps;\n cartlines?: IFlyoutCartLineItemViewProps[];\n flyoutTitle: React.ReactNode;\n totalPrice: React.ReactNode;\n checkoutAsGuestButton?: React.ReactNode;\n checkoutAsSignInUserButton?: React.ReactNode;\n goToCartButton?: React.ReactNode;\n waitingComponent?: React.ReactNode;\n isCartLoading: boolean;\n checkoutBlockedDueToUnavailableFunds?: React.ReactNode;\n\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n}\n\n/**\n *\n * Cart component.\n * @extends {React.PureComponent>}\n */\n@observer\nclass CartIcon extends React.Component, IMiniCartState> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly checkoutBySignInAttributes: IDictionary | undefined;\n\n private readonly checkoutByGuestAttributes: IDictionary | undefined;\n\n private readonly viewShoppingBagAttributes: IDictionary | undefined;\n\n private retailMultiplePickUpOptionEnabled?: boolean = false;\n\n private channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n private lastValidatedCartVersion: number | undefined;\n\n constructor(props: ICartIconProps) {\n super(props);\n this.state = {\n miniCartData: {},\n isCartValid: true,\n isQuantityLimitsFeatureEnabled: false\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n const payload = getPayloadObject(TelemetryEvent.CheckOut, this.telemetryContent, TelemetryConstant.Checkout);\n this.checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n\n payload.contentAction.etext = TelemetryConstant.GuestCheckout;\n this.checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n\n payload.contentAction.etext = TelemetryConstant.ViewShoppingBag;\n this.viewShoppingBagAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n }\n\n public async componentDidMount(): Promise {\n const context = this.props.context.actionContext;\n\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n this.setState({\n miniCartData: await getMiniCartData(context, this.props.data.cart.result!)\n });\n }\n );\n await this._setQuantityLimitsFeatureFlag();\n\n this.setState({\n orgUnitLocations: this.props.data.orgUnitLocations?.result\n });\n\n this._validateCart();\n }\n\n public componentDidUpdate(prevProps: ICartIconProps): void {\n this._validateCart();\n }\n\n public shouldComponentUpdate(nextProps: ICartIconProps, nextState: IMiniCartState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n // eslint-disable-next-line complexity -- disabling the complexity for this method for now as its causing lot of other warnings\n public render(): JSX.Element | null {\n const {\n id,\n typeName,\n config: { enableHoverCart, isAnonymousCheckout },\n context: {\n request: {\n user: { isAuthenticated, signInUrl }\n }\n },\n context,\n resources\n } = this.props;\n\n const cart = (this.props.data.cart && this.props.data.cart.result) || undefined;\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\n const cartUrl = getUrlSync('cart', this.props.context.actionContext) || '';\n const checkoutURL = this._getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- check config.\n const shouldShowMiniCart =\n cart?.isProductAddedToCart && this.props.context.app.config.addToCartBehavior === AddToCartBehavior.showMiniCart;\n const hasInvoiceLine = cart?.hasInvoiceLine;\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\n const cartLines = this._getCartLines();\n const validInventoryAcrossCartLines = validateCartLinesInventory(\n cart?.cart.CartLines ?? [],\n this.state.miniCartData.productAvailabilites ?? [],\n this.props.context.actionContext,\n this.state.miniCartData.products ?? [],\n emailDeliveryModeCode\n );\n const hasError =\n !validInventoryAcrossCartLines?.isValid ||\n (!validInventoryAcrossCartLines && !this.state.isCartValid) ||\n (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\n const includeFlyout = this.props.data.cart && this.props.data.cart.status === 'SUCCESS' && enableHoverCart;\n const totalItemsInCart = cart?.totalItemsInCart ? cart.totalItemsInCart : 0;\n const goToCartButtonText = resources.goToCartButtonTitle.replace('{count}', totalItemsInCart.toString());\n const flyoutTitle = resources.flyoutTitle;\n const flyoutTooltip = {\n tag: UncontrolledTooltip,\n shouldShowMiniCart,\n placement: 'bottom-end',\n hideArrow: true,\n className: 'ms-cart-icon__flyout-container',\n trigger: 'hover',\n displayMode: 'FLYOUT',\n target: id,\n shouldShowCloseButton: true,\n cartPageUrl: cartUrl,\n hideAriaHidden: true\n };\n\n // If there are invoice lines, don't update mini cart price\n const price = (cart && !cart.hasInvoiceLine && cart.cart.TotalAmount) || undefined;\n const priceString = price\n ? resources.totalPriceFormatString.replace('{price}', context.cultureFormatter.formatCurrency(price))\n : '';\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n this.channelDeliveryOptionConfig = this.props.data.channelDeliveryOptionConfig?.result;\n this.retailMultiplePickUpOptionEnabled = this.props.data.featureState?.result?.find(\n feature => feature.Name === multiplePickupStoreSwitchName\n )?.IsEnabled;\n\n const viewProps = {\n ...this.props,\n cartIcon: (\n \n ),\n cartlines: cartLines,\n FlyoutContainer: includeFlyout ? flyoutTooltip : undefined,\n CartlinesWrapper: {\n className: 'ms-cart-icon__cart-lines'\n },\n miniCartWrapper: {\n className: classnames('ms-cart-icon'),\n id: this.props.id\n },\n miniCartItemWrapper: {\n className: classnames('msc-cart-lines-item')\n },\n\n // If there are invoice lines, don't update mini cart checkout button\n // Checkout button will display by default to maintain backward compatibility. When Anonymous user checkout is enabled &&\n // user is authenticated then we will show the checkout button otherwise we will show the guest checkout button.\n checkoutAsSignInUserButton:\n !isCartEmpty && !hasInvoiceLine && (!isAnonymousCheckout || isAuthenticated) ? (\n \n {resources.checkoutButtonTitle}\n \n ) : null,\n checkoutAsGuestButton:\n isAnonymousCheckout && !isCartEmpty && !isAuthenticated ? (\n \n {resources.guestCheckoutButtonTitle}\n \n ) : null,\n goToCartButton: (\n \n {goToCartButtonText}\n \n ),\n checkoutBlockedDueToUnavailableFunds: null,\n flyoutTitle: {flyoutTitle},\n totalPrice:
{priceString}
\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _validateCart(): void {\n const {\n data: { cart }\n } = this.props;\n const cartVersion = cart.result?.cart?.Version ?? undefined;\n if (this.lastValidatedCartVersion === cartVersion) {\n return;\n }\n\n this.lastValidatedCartVersion = cartVersion; // This field is populated to block concurrent requests\n\n if (this.state.isQuantityLimitsFeatureEnabled) {\n validateCartAsync(cart, this.props.telemetry, this.props.context)\n .then((result: CartLineValidationResultsByLineId | undefined) => {\n this.setState({ isCartValid: !ArrayExtensions.hasElements(result?.ValidationResultsPairs) });\n })\n .catch(() => {\n this.setState({ isCartValid: false });\n });\n } else {\n this.setState({ isCartValid: true });\n }\n }\n\n private _getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\n if (isAuthenticated) {\n return guestCheckoutUrl;\n }\n\n const isAbsoluteUrl = urlCheck(guestCheckoutUrl);\n let returnURL = guestCheckoutUrl;\n if (msdyn365Commerce.isBrowser && !isAbsoluteUrl) {\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\n }\n\n return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\n }\n\n /**\n * Sort cartline items.\n * @param cartlines - Cartlines to be sorted.\n * @param sortOrder - Ascending or descending.\n * @returns - Sorted cartlines.\n */\n private readonly getSortedCartLines = (cartlines: CartLine[], sortOrder?: cartLinesSortOrder): CartLine[] => {\n const lines: CartLine[] = [...cartlines];\n const zero: number = 0;\n\n if (sortOrder === cartLinesSortOrder.descending) {\n return lines.sort((item1, item2) => (item2.LineNumber ?? zero) - (item1.LineNumber ?? zero));\n }\n return lines.sort((item1, item2) => (item1.LineNumber ?? zero) - (item2.LineNumber ?? zero));\n };\n\n private _getCartLines(): IFlyoutCartLineItemViewProps[] | null {\n const {\n context: {\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\n },\n config,\n telemetry,\n resources\n } = this.props;\n\n const imageSettings = this._getImageSettings(config.imageSettings);\n const cart = this.props.data.cart && this.props.data.cart.result;\n\n // Cart-icon could be placed in each page\n // so we check cart content to reduce number of RS calls\n return this.state.miniCartData.products && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0\n ? FlyoutCartLineItems({\n cartlines: this.getSortedCartLines(cart.cart.CartLines, config.cartLinesSortOrder),\n products: this.state.miniCartData.products,\n productAvailabilites: this.state.miniCartData.productAvailabilites,\n productDeliveryOptions: this.state.miniCartData.deliveryOptions,\n imageSettings,\n outOfStockThreshold: this.props.context.app.config.outOfStockThreshold || 0,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n quantityDisplayString: resources.quantityDisplayText,\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n inputQuantityAriaLabel: '', // Not used\n discountStringText: '', // Not used\n originalPriceText: '',\n currentPriceText: '',\n shippingChargesText: '',\n shippingText: resources.shippingText\n },\n telemetry,\n removeButtonText: resources.removeCartButtonText,\n outOfStockText: '', // Not used\n outOfRangeOneText: '', // Not used\n outOfRangeFormatText: '', // Not used\n cartState: cart,\n orgUnitLocations: this.state.orgUnitLocations,\n removeItemClickHandler: this._removeItemFromCartHandler,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n telemetryContent: this.telemetryContent,\n channelDeliveryOptionConfig: this.retailMultiplePickUpOptionEnabled ? this.channelDeliveryOptionConfig : undefined,\n isQuantityLimitsFeatureEnabled: this.state.isQuantityLimitsFeatureEnabled,\n catalogs: this.props.data.catalogs?.result\n })\n : null;\n }\n\n private readonly _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\n return (\n imageSettings || {\n viewports: {\n xs: { q: 'w=80&h=94&m=6', w: 0, h: 0 },\n sm: { q: 'w=148&h=174&m=6', w: 0, h: 0 },\n lg: { q: 'w=148&h=174&m=6', w: 0, h: 0 }\n },\n lazyload: true\n }\n );\n };\n\n private readonly _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\n if (this.props.data.cart.result) {\n const input = {\n cartLineIds: [cartlineToRemove.LineId!.toString()]\n };\n this.props.data.cart.result.removeCartLines(input).catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to Remove Cart Line');\n });\n }\n };\n\n private async _setQuantityLimitsFeatureFlag(): Promise {\n const featureStatuses = await this.props.data.featureState;\n\n const isChannelQuantityLimitsFeatureEnabledInHq =\n featureStatuses?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\n )?.IsEnabled || false;\n if (isChannelQuantityLimitsFeatureEnabledInHq) {\n this.setState({ isQuantityLimitsFeatureEnabled: true });\n return;\n }\n\n const useSiteBuilderSettings = featureStatuses?.find(\n featureState => featureState.Name === 'RevertToSiteBuilderOrderQuantityLimitsSettings'\n )?.IsEnabled;\n\n if (useSiteBuilderSettings) {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (!defaultOrderQuantityLimitsFeatureConfig || defaultOrderQuantityLimitsFeatureConfig === 'none') {\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n\n try {\n const featureStatuses = await this.props.data.featureState;\n const isQuantityLimitsFeatureEnabledInHq =\n featureStatuses?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n )?.IsEnabled || false;\n if (!isQuantityLimitsFeatureEnabledInHq) {\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get feature states');\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n this.setState({ isQuantityLimitsFeatureEnabled: true });\n } else {\n this.props.data.customerInformation\n .then(customerInfo => {\n const result =\n !!customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b));\n this.setState({ isQuantityLimitsFeatureEnabled: result });\n })\n .catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get customer info');\n });\n }\n } else {\n const cartConfiguration = await this.props.data.cartConfiguration;\n this.setState({ isQuantityLimitsFeatureEnabled: !(cartConfiguration?.IgnoreOrderSettings ?? false) });\n return;\n }\n }\n}\n\nexport default CartIcon;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IMediaGalleryThumbnailItemViewProps, IMediaGalleryThumbnailsViewProps, IMediaGalleryViewProps } from '../..';\n\nconst MediaGalleryView: React.FC = props => {\n const { CarouselProps, Thumbnails, MediaGallery, Modal } = props;\n\n return (\n \n \n {Modal}\n {_renderThumbnails(Thumbnails)}\n \n );\n};\n\nconst _renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps): JSX.Element => {\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps, items } = thumbnails;\n\n return (\n \n {items && items.map(_renderThumbnailItem)}\n \n );\n};\n\nconst _renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\n const { ThumbnailItemContainerProps, Picture } = thumbnail;\n\n return {Picture};\n};\n\nexport default MediaGalleryView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IPromoBannerCloseButton {\n closeButtonAriaLabel?: string;\n label?: string;\n telemetryContent?: ITelemetryContent;\n onClose(): void;\n}\n\nexport const PromoBannerCloseButton: React.FC = ({ closeButtonAriaLabel, label, telemetryContent, onClose }) => {\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.PromoBannerClose);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n \n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ILinksData } from '../promo-banner.props.autogenerated';\n\nexport interface IPromoBannerLinks {\n links: ILinksData[];\n requestContext: Msdyn365.IRequestContext;\n telemetryContent: ITelemetryContent;\n onTextChange?(index: number): (event: Msdyn365.ContentEditableEvent) => void;\n}\n\nexport const PromoBannerLinks: React.FC = ({ links, requestContext, onTextChange, telemetryContent }) => {\n const editableLinks = _mapEditableLinks(links, telemetryContent);\n return (\n \n {editableLinks && editableLinks.length > 0 ? (\n \n ) : null}\n \n );\n};\n\nconst _mapEditableLinks = (linkdata: ILinksData[], telemetryContent: ITelemetryContent): Msdyn365.ILinksData[] | null => {\n if (!linkdata || linkdata.length === 0) {\n return null;\n }\n const editableLinks: Msdyn365.ILinksData[] = [];\n linkdata.forEach((link, index) => {\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent, '', '');\n const linkText = link.linkText ? link.linkText : '';\n payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(telemetryContent, payLoad);\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: link.ariaLabel,\n className: 'ms-promo-banner__link',\n linkText: link.linkText,\n linkUrl: link.linkUrl.destinationUrl,\n openInNewTab: link.openInNewTab,\n role: 'link',\n additionalProperties: attributes,\n onClick: onTelemetryClick(telemetryContent, payLoad, linkText)\n };\n editableLinks.push(editableLink);\n });\n\n return editableLinks;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport * as React from 'react';\n\nexport interface IPromoBannerText {\n text: string;\n requestContext: Msdyn365.IRequestContext;\n onTextChange(event: Msdyn365.ContentEditableEvent): void;\n}\n\nexport const PromoBannerText: React.FC = ({ text, onTextChange, requestContext }) => {\n return ;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Carousel } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { PromoBannerCloseButton, PromoBannerLinks, PromoBannerText } from './components';\nimport { IBannerMessagesData, IPromoBannerProps, IPromoBannerResources } from './promo-banner.props.autogenerated';\n\nexport interface IPromoBannerState {\n animating: boolean;\n isVisible: boolean;\n activeIndex: number;\n}\n\nexport interface IPromoBannerViewProps extends IPromoBannerProps<{}>, IPromoBannerState {\n promoBannerProps: IModuleProps;\n contentProps: INodeProps;\n bannerMessages: IBannerMessagesData[];\n promoBannerTextProps: INodeProps;\n promoBannerLinksProps: INodeProps;\n carouselProps: INodeProps;\n closeButton?: React.ReactNode;\n className: string;\n promoBannerText: string;\n resources: IPromoBannerResources;\n onDismiss(): void;\n handleText(): void;\n handleLinks(): void;\n}\n\n/**\n *\n * PromoBannerModule component.\n * @extends {React.PureComponent>}\n */\nclass PromoBanner extends React.PureComponent, IPromoBannerState> {\n public state: IPromoBannerState = {\n animating: false,\n isVisible: true,\n activeIndex: 0\n };\n\n private readonly telemetryContent: ITelemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n\n public render(): JSX.Element | null {\n const { bannerMessages, dismissEnabled, interval, hideFlipper, autoplay, className = '' } = this.props.config;\n const { closeButtonAriaLabel, closeButtonLabel, bannerText, bannerAriaLabel } = this.props.resources;\n const { isVisible, activeIndex } = this.state;\n\n if (!isVisible) {\n this.props.context.telemetry.error('Promo banner content is empty, module wont render.');\n return null;\n }\n\n const viewProps = {\n // Context for telemetry and raw data for C1 to do customization\n // Including computed data, state data and methods\n ...this.props,\n className: classnames('ms-promo-banner', className),\n isVisible, // State data\n onDismiss: this._onDismiss, // Methods\n handleLinks: this.handleLinkTextChange,\n handleText: this.handleTextChange,\n\n promoBannerProps: {\n className: classnames('ms-promo-banner', className),\n moduleProps: this.props,\n role: 'banner',\n 'aria-label': bannerAriaLabel\n },\n promoBannerTextProps: {\n tag: PromoBannerText\n },\n promoBannerLinksProps: {\n tag: PromoBannerLinks,\n telemetryContent: this.telemetryContent\n },\n contentProps: { className: 'ms-promo-banner__content' },\n promoBannerText: bannerText,\n bannerMessages,\n activeIndex,\n carouselProps: {\n tag: Carousel,\n className: 'ms-promo-banner__carousel',\n activeIndex,\n next: this._next,\n previous: this._previous,\n onIndicatorsClickHandler: this._goToIndex,\n hideIndicator: hideFlipper,\n interval,\n hideFlipper,\n autoplay\n },\n closeButton: dismissEnabled && (\n \n )\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleTextChange = (event: Msdyn365.ContentEditableEvent) => {\n if (this.props.config.bannerMessages && this.props.config.bannerMessages[0]) {\n this.props.config.bannerMessages[0].text = event.target.value;\n }\n };\n\n public handleLinkTextChange = (linkIndex: number) => (event: Msdyn365.ContentEditableEvent) => {\n if (this.props.config.bannerMessages && this.props.config.bannerMessages[1]) {\n const links = this.props.config.bannerMessages[1].links;\n if (links) {\n links[linkIndex].linkText = event.target.value;\n }\n }\n };\n\n private readonly _next = (): void => {\n const nextIndex = this._isLastItem() ? 0 : this.state.activeIndex + 1;\n this._goToIndex(nextIndex);\n };\n\n private readonly _previous = (): void => {\n const nextIndex = this._isFirstItem()\n ? this.props.config.bannerMessages\n ? this.props.config.bannerMessages.length - 1\n : 0\n : this.state.activeIndex - 1;\n this._goToIndex(nextIndex);\n };\n\n private readonly _goToIndex = (index: number): void => {\n if (this.state.animating) {\n return;\n }\n this.setState({ activeIndex: index });\n };\n\n private readonly _isFirstItem = () => this.state.activeIndex === 0;\n\n private readonly _isLastItem = () =>\n this.props.config.bannerMessages && this.state.activeIndex === this.props.config.bannerMessages.length - 1;\n\n private readonly _onDismiss = (): void => {\n this.setState({ isVisible: false });\n };\n}\n\nexport default PromoBanner;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AddToCartComponent, IAddToCartFailureResult, IAddToCartResources, OrderDetailsProduct } from '@msdyn365-commerce/components';\nimport { getUrlSync, IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport { SalesLine } from '@msdyn365-commerce/retail-proxy';\nimport { QuickOrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport React from 'react';\n\n/**\n * The data on which the component should operate.\n */\nexport interface IAddToCartSelectedData {\n quickOrderTemplate: QuickOrderTemplate | undefined;\n}\n\n/**\n * The resources needed to render a buy selected component.\n */\nexport interface IAddToCartSelectedResources {\n quickOrderGridBuySelectedButtonText?: string;\n quickOrderGridBuySelectedButtonAriaLabel?: string;\n quickOrderGridBuySelectedAddingToCartErrorNotificationTitle?: string;\n quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel?: string;\n quickOrderGridGoToCartText?: string;\n quickOrderGridDialogCloseText?: string;\n quickOrderGridSingleItemText?: string;\n quickOrderGridMultiLineItemFormatText?: string;\n quickOrderGridMultiLinesFormatText?: string;\n quickOrderGridHeaderMessageText?: string;\n addedQuantityText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n freePriceText?: string;\n}\n\n/**\n * Configuration of a buy selected component.\n */\nexport interface IAddToCartSelectedProps extends IComponentProps {\n className: string;\n context: ICoreContext;\n\n resources: IAddToCartSelectedResources;\n\n isIcon?: boolean;\n onError?(result: IAddToCartFailureResult): void;\n}\n\n/**\n * Get the dialog strings.\n * @param props - The buy selected props.\n * @returns The add to cart resources.\n */\nexport const getDialogStrings = (props: IAddToCartSelectedProps): IAddToCartResources => {\n return {\n goToCartText: props.resources.quickOrderGridGoToCartText ?? '',\n continueShoppingText: props.resources.quickOrderGridDialogCloseText ?? '',\n closeNotificationLabel: props.resources.quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel ?? '',\n headerItemOneText: props.resources.quickOrderGridSingleItemText ?? '',\n headerItemFormatText: props.resources.quickOrderGridMultiLineItemFormatText ?? '',\n headerLinesFormatText: props.resources.quickOrderGridMultiLinesFormatText ?? '',\n headerMessageText: props.resources.quickOrderGridHeaderMessageText ?? '',\n freePriceText: props.resources.freePriceText ?? '',\n originalPriceText: props.resources.originalPriceText ?? '',\n currentPriceText: props.resources.currentPriceText ?? '',\n addedQuantityText: props.resources.addedQuantityText ?? '',\n buyAgainNotificationTitle: props.resources.quickOrderGridBuySelectedAddingToCartErrorNotificationTitle ?? '',\n buyAgainNotificationCloseAriaLabel: props.resources.quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel ?? ''\n };\n};\n\n/**\n * Get the dialog strings.\n * @param quickOrder - The buy selected props.\n * @returns The add to cart resources.\n */\nexport const getOrderDetails = (quickOrder: QuickOrderTemplate): OrderDetailsProduct[] => {\n const orderDetails: OrderDetailsProduct[] = [];\n for (const quickLine of quickOrder.quickOrderTemplateLines) {\n const quantity = quickLine.productListLine.Quantity;\n const salesLine: SalesLine = {\n Quantity: quantity\n };\n const products = new OrderDetailsProduct(salesLine, quickLine.fullProduct?.ProductDetails);\n orderDetails.push(products);\n }\n return orderDetails;\n};\n\n/**\n * Renders a button which adds given products to the cart.\n * @param props - Configuration of the component.\n * @returns A react element or null if no products were given.\n */\nexport const AddToCartProductListComponent: React.FC = (props: IAddToCartSelectedProps): JSX.Element | null => {\n const {\n data: { quickOrderTemplate }\n } = props;\n\n if (quickOrderTemplate?.quickOrderTemplateLines[0].fullProduct?.ProductDetails === undefined) {\n return null;\n }\n const quantity = quickOrderTemplate.quickOrderTemplateLines[0].productListLine.Quantity;\n const buttonLabel = props.resources.quickOrderGridBuySelectedButtonText;\n const buttonAriaLabel = props.resources.quickOrderGridBuySelectedButtonAriaLabel;\n const dialogStrings: IAddToCartResources = getDialogStrings(props);\n const shouldSkipSiteSettings: boolean = true;\n const orderDetailProducts = getOrderDetails(quickOrderTemplate);\n return (\n \n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport { QuickOrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { AddToCartProductListComponent } from './add-to-list';\nimport { IQuickOrderGridActionsViewProps, IQuickOrderGridState } from './utilities';\n\n/**\n * Interface for quick order grid action data.\n */\nexport interface IQuickOrderGridActionsData {\n quickOrderTemplate: QuickOrderTemplate | undefined;\n}\n\n/**\n * Interface for quick order grid action props.\n */\nexport interface IQuickOrderGridActionsProps extends IComponentProps {\n context: ICoreContext;\n telemetryContent?: ITelemetryContent;\n moduleClassName: string;\n typeName: string;\n handlers: {\n removeProductList(productListId: string): void;\n onErrorMessage(message: string): void;\n };\n quickOrderGridState: IQuickOrderGridState;\n resources: {\n quickOrderGridDeleteButtonText: string;\n quickOrderGridBuySelectedButtonText?: string;\n quickOrderGridBuySelectedButtonAriaLabel?: string;\n quickOrderGridBuySelectedAddingToCartErrorNotificationTitle?: string;\n quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel?: string;\n quickOrderGridGoToCartText?: string;\n quickOrderGridDialogCloseText?: string;\n quickOrderGridSingleItemText?: string;\n quickOrderGridMultiLineItemFormatText?: string;\n quickOrderGridMultiLinesFormatText?: string;\n quickOrderGridHeaderMessageText?: string;\n addedQuantityText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n freePriceText?: string;\n };\n}\n\n/**\n * Remove ProductList Action.\n * @param props -Quick order grid action props.\n */\nconst removeQuickOrderList = (props: IQuickOrderGridActionsProps): void => {\n const {\n data: { quickOrderTemplate },\n handlers\n } = props;\n const { removeProductList } = handlers;\n // eslint-disable-next-line @typescript-eslint/prefer-optional-chain -- Need to check data.\n if (quickOrderTemplate && quickOrderTemplate.productList.Id) {\n removeProductList(quickOrderTemplate.productList.Id);\n }\n};\n\n/**\n * Get Addtobag Button.\n * @param props -Order template action props.\n * @returns QuickOrderGrid actions view props.\n */\nconst getQuickOrderGridAddToCartDialog = (props: IQuickOrderGridActionsProps): React.ReactNode => {\n const {\n data: { quickOrderTemplate },\n context,\n moduleClassName,\n resources,\n typeName\n } = props;\n const buttonId = 'quick-order-grid';\n return (\n {\n if (result.cartActionResult?.errorDetails?.LocalizedMessage) {\n props.handlers.onErrorMessage(result.cartActionResult.errorDetails.LocalizedMessage);\n }\n }}\n />\n );\n};\n\n/**\n * Remove Quick order grid action.\n * @param props -Quick order grid action props.\n * @returns Remove order template.\n */\nconst removeActionHandler = (props: IQuickOrderGridActionsProps) => () => {\n removeQuickOrderList(props);\n};\n\n/**\n * Quick order grid action view.\n * @param props -Quick Order Grid template action props.\n * @returns QuickOrderGrid actions view props.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention -- Name needs to be this.\nexport const QuickOrderGridActionsView = (props: IQuickOrderGridActionsProps): IQuickOrderGridActionsViewProps => {\n const { moduleClassName, quickOrderGridState, resources } = props;\n const { quickOrderGridDeleteButtonText } = resources;\n\n const userMessageNode = quickOrderGridState.topStateMessage ? (\n \n \n {quickOrderGridState.topStateMessage.messageText}\n \n ) : (\n undefined\n );\n\n return {\n addProductListToBag: getQuickOrderGridAddToCartDialog(props),\n removeProductList: (\n \n ),\n userMessage: userMessageNode\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button, Collapse, ICollapseProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IQuickOrderGridDrawerProps } from './quick-order-grid-drawer-props';\n\n/**\n * Interface for drawer state.\n */\nexport interface IQuickOrderGridDrawerState {\n isOpen: boolean;\n}\n\n/**\n * Placement of glyph.\n */\nexport type GlyphPlacement = 'start' | 'end';\n\n/**\n * Quick Order Grid Drawer - This is a full width uncontrolled collapse where the button glyph changes\n * when the drawer is open and closed.\n */\nexport class QuickOrderGridDrawer extends React.Component {\n private readonly _drawerOpenGlyph: string;\n\n private readonly _drawerCloseGlyph: string;\n\n private readonly _drawerGlyphClass: string;\n\n private _isManuallyToggled: boolean;\n\n public constructor(props: IQuickOrderGridDrawerProps) {\n super(props);\n this._isManuallyToggled = false;\n this.state = { isOpen: props.collapseProps?.isOpen ?? false };\n this._drawerGlyphClass = classnames('drawer__glyph', this.props.toggleGlyphClassName ? this.props.toggleGlyphClassName : '');\n const closeGlyph = this.props.closeGlyph ? this.props.closeGlyph : '';\n if (this.props.isAnimateGlyph) {\n this._drawerOpenGlyph = classnames(this._drawerGlyphClass, this.props.openGlyph ? this.props.openGlyph : closeGlyph);\n this._drawerCloseGlyph = this._drawerOpenGlyph;\n } else {\n this._drawerOpenGlyph = classnames(this._drawerGlyphClass, this.props.openGlyph ? this.props.openGlyph : '');\n this._drawerCloseGlyph = classnames(this._drawerGlyphClass, closeGlyph);\n }\n }\n\n /**\n * Method to call on click of drawer button.\n * @param event - Product DeliveryOption List.\n */\n public toggle = (event: React.MouseEvent | React.KeyboardEvent): void => {\n event.preventDefault();\n this._isManuallyToggled = true;\n if (this.props.onToggle) {\n this.setState(previousState => ({ isOpen: !previousState.isOpen }));\n this.props.onToggle(this.state);\n } else {\n this.setState(previousState => ({ isOpen: !previousState.isOpen }));\n }\n };\n\n public shouldComponentUpdate(nextProps: IQuickOrderGridDrawerProps, nextState: IQuickOrderGridDrawerState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const collapseProps: ICollapseProps = { ...this.props.collapseProps };\n\n // If the drawer is manually toggled by pressing the button, then we use the internal state\n if (collapseProps.isOpen === undefined || this._isManuallyToggled) {\n collapseProps.isOpen = this.state.isOpen;\n }\n collapseProps.children = this.props.children;\n const drawerClass = classnames('drawer', this.props.className);\n const drawerButtonClassName = `${this.props.className ? this.props.className : ''}__button`;\n this._isManuallyToggled = false;\n return (\n
\n \n {this._generateDrawerButtonInnerMarkup(collapseProps.isOpen, drawerClass)}\n \n \n
\n );\n }\n\n private _generateDrawerButtonInnerMarkup(isCollapseState: boolean, drawerClass: string): JSX.Element {\n const drawerButtonTextClass = classnames(\n 'drawer__buttontext',\n this.props.toggleButtonClassName ? this.props.toggleButtonClassName : ''\n );\n const headingDrawerClass = `${drawerClass}-heading`;\n const descriptionDrawerClass = `${drawerClass}-description`;\n return (\n <>\n

{this.props.moduleHeadingText}

\n {this.props.moduleDescriptionText}\n {this._generateGlyphMarkup('drawer__glyph__end', isCollapseState)}\n \n );\n }\n\n private _generateGlyphMarkup(location: string, isCollapseState: boolean): JSX.Element {\n let glyphClass = isCollapseState ? this._drawerOpenGlyph : this._drawerCloseGlyph;\n glyphClass = `${glyphClass} ${location}`;\n return ;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Alert, Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IQuickOrderGridState } from './utilities';\n\n/**\n * Interface quick order grid form props.\n */\nexport interface IQuickOrderGridFormProps {\n isAddtoListDisabled: boolean | undefined;\n productTextInput: React.RefObject;\n quantityTextInput: React.RefObject;\n maxChars: number;\n minQuantity?: number;\n maxQuantity?: number;\n moduleClassName: string;\n ariaLabelQuantity: string;\n ariaLabelProduct: string;\n ariaLabelAddtoCart: string;\n quickOrderGridState: IQuickOrderGridState;\n handleInputChange(query: string): void;\n handleQuantityChange(query: string): void;\n handleAddProductListClick(): Promise;\n}\n\n/**\n * Interface quick order grid form view props.\n */\nexport interface IQuickOrderGridFormViewProps {\n product: React.ReactNode;\n quantity: React.ReactNode;\n addToListBtn: React.ReactNode;\n userMessage?: React.ReactNode;\n}\n\n/**\n * On Input Change functionality.\n * @param handleInputChange -Input change function.\n * @returns Input change value.\n */\nconst onInputChangeFunction = (handleInputChange: (query: string) => void) => (event: React.ChangeEvent) => {\n handleInputChange(event.target.value || '');\n};\n\n/**\n * On Quantity Change functionality.\n * @param handleQuantityChange -Quantity change function.\n * @returns Quantity change value.\n */\nconst onQuantityChangeFunction = (handleQuantityChange: (query: string) => void) => (event: React.ChangeEvent) => {\n handleQuantityChange(event.target.value || '');\n};\n\n/**\n * Quick order grid form component.\n * @param props -Component form props.\n * @returns Quick order gridp view props..\n */\nexport const QuickOrderGridFormComponent = (props: IQuickOrderGridFormProps): IQuickOrderGridFormViewProps => {\n const {\n moduleClassName,\n productTextInput,\n quantityTextInput,\n quickOrderGridState,\n maxChars,\n minQuantity,\n maxQuantity,\n isAddtoListDisabled,\n ariaLabelQuantity,\n ariaLabelProduct,\n ariaLabelAddtoCart,\n handleQuantityChange,\n handleInputChange,\n handleAddProductListClick\n } = props;\n\n const onInputChange = onInputChangeFunction(handleInputChange);\n\n const onQuantityInputChange = onQuantityChangeFunction(handleQuantityChange);\n\n const productNode = (\n
\n

\n {ariaLabelProduct}\n

\n \n
\n );\n\n const quantityNode = (\n
\n

\n {ariaLabelQuantity}\n

\n \n
\n );\n\n const addToListNode = (\n
\n \n {ariaLabelAddtoCart}\n \n
\n );\n\n const userMessageNode = quickOrderGridState.stateMessage ? (\n \n \n {quickOrderGridState.stateMessage.messageText}\n \n ) : (\n undefined\n );\n\n return {\n product: productNode,\n addToListBtn: addToListNode,\n quantity: quantityNode,\n userMessage: userMessageNode\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { QuickOrderTemplateLine } from '@msdyn365-commerce-modules/retail-actions';\nimport { observable } from 'mobx';\n\n/**\n * Represents a product for quick order grid.\n */\nexport class QuickOrderGridProduct {\n @observable\n public isSelected: boolean;\n\n public readonly productLine: QuickOrderTemplateLine;\n\n public constructor(productLine: QuickOrderTemplateLine) {\n this.productLine = productLine;\n this.isSelected = false;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport classnames from 'classnames';\nimport React from 'react';\n\n/**\n * Interface for quick order grid table header resources.\n */\nexport interface IQuickOrderGridTableHeaderResources {\n quickOrderGridProductNumberText: string;\n quickOrderGridProductText: string;\n quickOrderGridUnitPriceText: string;\n quickOrderGridUnitOfMeasureText: string;\n quickOrderGridQuantityText: string;\n quickOrderGridActionsText: string;\n}\n\n/**\n * Interface for quick order grid table props.\n */\nexport interface IQuickOrderGridTableHeaderProps extends IComponentProps {\n context: ICoreContext;\n className: string;\n\n isMobile: boolean;\n resources: IQuickOrderGridTableHeaderResources;\n}\n\n/**\n * Interface for quick order grid table header component.\n */\nexport interface IQuickOrderGridTableHeaderComponent extends IComponent {}\n\n/**\n * Get the quick order grid header cells for desktop.\n * @param props -- The quick order grid table header props.\n * @returns The list of cells for quick order grid header component in desktop version.\n */\nconst QuickOrderGridDesktopHeaderCellsComponent: React.FC = (props: IQuickOrderGridTableHeaderProps) => {\n const { resources } = props;\n const columnWithNumberClassName = `${props.className}__row__column-with-number`;\n return (\n <>\n \n \n \n {resources.quickOrderGridProductNumberText}\n {resources.quickOrderGridProductText}\n {resources.quickOrderGridUnitPriceText}\n {resources.quickOrderGridUnitOfMeasureText}\n {resources.quickOrderGridQuantityText}\n {resources.quickOrderGridActionsText}\n \n );\n};\n\n/**\n * Get the quick order grid header cells for mobile.\n * @param props -- The quick order grid table header props.\n * @returns The quick order grid header component in desktop version.\n */\nconst QuickOrderGridMobileHeaderCellsComponent: React.FC = (props: IQuickOrderGridTableHeaderProps) => {\n const { resources } = props;\n return (\n <>\n \n {resources.quickOrderGridProductNumberText}\n \n \n );\n};\n\n/**\n * Quick order table header component.\n * @param props - Configuration of the component.\n * @returns React node with the header.\n */\nexport const QuickOrderGridTableHeaderComponent: React.FC = (props: IQuickOrderGridTableHeaderProps) => {\n const rowClassName = `${props.className}__row`;\n\n let headerCells: JSX.Element;\n if (props.isMobile) {\n headerCells = ;\n } else {\n headerCells = ;\n }\n\n return (\n \n {headerCells}\n \n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport MsDyn365, { IComponentProps, ICoreContext, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ProductListLine, ProductPrice } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl, getProductPageUrlSync, ObjectExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, IncrementalQuantity, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nimport { QuickOrderGridProduct } from '../../quick-order-grid-product';\nimport { IQuickOrderGridRowCallbacks } from '../../utilities';\n\n/**\n * Data required to render each quick order grid row.\n */\nexport interface IQuickOrderGridTableRowData {\n product: QuickOrderGridProduct;\n}\n\n/**\n * Resources for quick order grid table rows.\n */\nexport interface IQuickOrderGridTableRowResources {\n quickOrderGridQuantityMobileText: string;\n quickOrderGridProductDimensionsSeparator: string;\n quickOrderGridViewDetailsButtonText: string;\n quickOrderGridViewDetailsButtonAriaLabel: string;\n quickOrderGridRemoveItemButtonAriaLabel: string;\n quickOrderGridInputQuantityAriaLabel: string;\n quickOrderGridDecrementButtonAriaLabel: string;\n quickOrderGridIncrementButtonAriaLabel: string;\n originalPriceText: string;\n currentPriceText: string;\n freePriceText: string;\n}\n\n/**\n * Interface for quick order grid table props.\n */\nexport interface IQuickOrderGridTableRowProps extends IComponentProps {\n context: ICoreContext;\n className: string;\n productListLine: ProductListLine;\n price?: ProductPrice;\n moduleId: string;\n moduleTypeName: string;\n min: number;\n max: number;\n quantity: number;\n imageSettings?: IImageSettings;\n isMobile: boolean;\n resources: IQuickOrderGridTableRowResources;\n index: number;\n callbacks: IQuickOrderGridRowCallbacks;\n}\n\n/**\n * The default image settings for quick order grid table row.\n */\nconst defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=80&h=80&m=6', w: 0, h: 0 },\n lg: { q: 'w=147&h=147&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n};\n\n/**\n * Renders product image for quick order grid row.\n * @param props - Quick order table row props.\n * @returns React element.\n */\nconst QuickOrderGridTableRowProductImageComponent: React.FC = (props: IQuickOrderGridTableRowProps) => {\n const product = props.data.product.productLine.fullProduct?.ProductDetails;\n const fallbackImageUrl = getFallbackImageUrl(\n product?.ItemId,\n props.context.actionContext.requestContext.apiSettings,\n props.context.request.app?.config?.OmniChannelMedia\n );\n\n const containerClassName = `${props.className}__product-image-container`;\n\n return (\n
\n \n
\n );\n};\n\nlet setShowPreviousActions: React.Dispatch> | undefined;\n\n/**\n * Renders product price.\n * @param props - Props for price component.\n * @returns React element.\n */\nconst renderProductPrice = (props: IQuickOrderGridTableRowProps): JSX.Element | null => {\n const { context, moduleId, moduleTypeName, resources } = props;\n const price = props.price;\n\n if (price) {\n return (\n \n );\n }\n return null;\n};\n\n/**\n * Renders product price.\n * @param props - Props for price component.\n * @returns React element.\n */\nconst renderUnitOfMeasure = (props: IQuickOrderGridTableRowProps): JSX.Element | null => {\n const price = props.price;\n\n if (price) {\n return (\n
\n {StringExtensions.isNullOrEmpty(props.productListLine.UnitOfMeasure) || price.UnitOfMeasure}\n
\n );\n }\n return null;\n};\n\n/**\n * On Change function.\n * @param onChangeQuantity -On change quantity function.\n * @param itemKey -String.\n * @param props -Order template line props.\n * @returns Set change quantity.\n */\nconst onChangeHandler = (\n onChangeQuantity: (\n orderTemplateLineId: string | undefined,\n quantity: number,\n props?: IQuickOrderGridTableRowProps | undefined\n ) => boolean,\n itemKey: string | undefined,\n props: IQuickOrderGridTableRowProps\n) => (newValue: number) => {\n onChangeQuantity(itemKey, newValue, props);\n return true;\n};\n\n/**\n * On Change function.\n * @param onRemoveItem -On change quantity function.\n * @param quickOrderGridProductKey -QuickOrderGridp Product.\n * @param props -Order template line props.\n * @returns Set change quantity.\n */\nconst onRemoveHandler = (\n onRemoveItem: (quickOrderGridProduct: QuickOrderGridProduct, props?: IQuickOrderGridTableRowProps | undefined) => void,\n quickOrderGridProductKey: QuickOrderGridProduct,\n props: IQuickOrderGridTableRowProps\n) => () => {\n onRemoveItem(quickOrderGridProductKey, props);\n};\n\n/**\n * Renders actions popup for the mobile view.\n * @param props - Configuration for popup.\n * @returns A react node with actions..\n */\nconst QuickOrderGridExtraActionsPopupComponent: React.FC = (\n props: IQuickOrderGridTableRowProps\n): JSX.Element | null => {\n const {\n resources: { quickOrderGridViewDetailsButtonAriaLabel, quickOrderGridViewDetailsButtonText }\n } = props;\n const product = props.data.product.productLine.fullProduct?.ProductDetails;\n const [shouldShowActions, setShowActions] = useState(false);\n let productUrl = '';\n if (product === undefined) {\n return null;\n }\n if (!StringExtensions.isNullOrWhitespace(product.Name) && !ObjectExtensions.isNullOrUndefined(product.RecordId)) {\n productUrl = getProductPageUrlSync(product.Name!, product.RecordId, props.context.actionContext);\n }\n\n const onClickViewDetails = React.useCallback(() => {\n if (MsDyn365.isBrowser) {\n window.location.href = productUrl;\n }\n }, [productUrl]);\n\n const toggle = React.useCallback(() => {\n const shouldShowActionsNewValue = !shouldShowActions;\n if (shouldShowActionsNewValue) {\n if (setShowPreviousActions) {\n setShowPreviousActions(false);\n }\n setShowActions(shouldShowActionsNewValue);\n setShowPreviousActions = setShowActions;\n } else {\n setShowPreviousActions = undefined;\n setShowActions(shouldShowActionsNewValue);\n }\n }, [shouldShowActions, setShowActions]);\n\n if (StringExtensions.isNullOrWhitespace(productUrl)) {\n return null;\n }\n\n const className = `${props.className}__extra-actions-cell`;\n const actionsContainerClassName = `${className}__actions-container`;\n\n return (\n
\n \n \n {props.resources.quickOrderGridRemoveItemButtonAriaLabel}\n \n
\n )}\n \n );\n};\n\n/**\n * Renders quick order grid table rows for desktop view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of quick order grid rows for desktop view.\n */\nexport const QuickOrderGridDesktopTableRowCellComponent: React.FC = (props: IQuickOrderGridTableRowProps) => {\n const product = props.data.product.productLine.fullProduct?.ProductDetails;\n const productListLine = props.data.product.productLine.productListLine;\n const { min, max, quantity } = props;\n const columnWithNumberClassName = `${props.className}__column-with-number`;\n if (product !== undefined) {\n let productUrl = '';\n if (!StringExtensions.isNullOrWhitespace(product.Name) && !ObjectExtensions.isNullOrUndefined(product.RecordId)) {\n productUrl = getProductPageUrlSync(product.Name!, product.RecordId, props.context.actionContext);\n }\n\n return (\n <>\n \n \n \n {product.ItemId}\n \n
\n \n {product.Name}\n \n \n {product.Dimensions?.map(dimension => dimension.DimensionValue?.Value)\n .filter(dimensionValue => !StringExtensions.isNullOrWhitespace(dimensionValue))\n .join(props.resources.quickOrderGridProductDimensionsSeparator)}\n \n
\n \n {renderProductPrice(props)}\n {renderUnitOfMeasure(props)}\n \n \n \n \n \n \n \n );\n }\n\n return null;\n};\n\n/**\n * Renders rows for mobile view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of quick order grid rows for mobile view.\n */\nexport const QuickOrderGridMobileTableRowCellComponent: React.FC = (props: IQuickOrderGridTableRowProps) => {\n const product = props.data.product.productLine.fullProduct?.ProductDetails;\n const productListLine = props.data.product.productLine.productListLine;\n const { min, max, quantity } = props;\n if (product !== undefined) {\n return (\n <>\n \n \n \n \n
\n {product.RecordId}\n \n \n \n
\n \n \n \n \n \n );\n }\n return null;\n};\n\n/**\n * Quick order table row component.\n * @param props - Configuration of the component.\n * @returns React node for the row.\n */\nexport const QuickOrderGridTableRowComponent: React.FC = (props: IQuickOrderGridTableRowProps) => {\n const rowClassName = `${props.className}__row`;\n const isMobileView = isMobile({ variant: VariantType.Viewport, context: props.context.request }) === 'xs';\n let headerCells: JSX.Element;\n if (isMobileView) {\n headerCells = ;\n } else {\n headerCells = ;\n }\n\n return (\n \n {headerCells}\n \n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { IComponent, IComponentProps, ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport React from 'react';\n\nimport { ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { QuickOrderGridProduct } from '../quick-order-grid-product';\nimport { IQuickOrderGridRowCallbacks } from '../utilities';\nimport {\n IQuickOrderGridTableHeaderResources,\n IQuickOrderGridTableRowResources,\n QuickOrderGridTableHeaderComponent,\n QuickOrderGridTableRowComponent\n} from './components';\n\n/**\n * Quick order table data interface.\n */\ninterface IQuickOrderGridTableData {\n quickOrderGridProducts: QuickOrderGridProduct[];\n isOrderQuantityLimitsFeatureEnabled: boolean;\n}\n\n/**\n * Quick order table resources.\n */\nexport interface IQuickOrderGridTableResources extends IQuickOrderGridTableHeaderResources, IQuickOrderGridTableRowResources {}\n\n/**\n * Quick order table props.\n */\nexport interface IQuickOrderGridTableProps extends IComponentProps {\n context: ICoreContext;\n className: string;\n moduleId: string;\n moduleTypeName: string;\n\n resources: IQuickOrderGridTableResources;\n isMobileView: boolean;\n imageSettings?: IImageSettings;\n callBacks: IQuickOrderGridRowCallbacks;\n}\n\n/**\n * Quick order table component.\n */\nexport interface IQuickOrderGridTableComponent extends IComponent {}\n\n/**\n * The quick order table.\n * @param props -- The quick order table props.\n * @returns The quick order table element.\n */\nexport const QuickOrderGridTableComponent: React.FC = (props: IQuickOrderGridTableProps) => {\n const [isMobile, setIsMobile] = React.useState(props.isMobileView);\n const quickOrderGridProducts = props.data.quickOrderGridProducts;\n const isOrderQuantityLimitsFeatureEnabled = props.data.isOrderQuantityLimitsFeatureEnabled;\n\n /**\n * Update the view port.\n */\n const updateViewport = () => {\n setIsMobile(props.isMobileView);\n };\n\n if (MsDyn365.isBrowser) {\n window.addEventListener('resize', updateViewport);\n }\n\n const headerClassName = `${props.className}__header`;\n const rowClassName = `${props.className}__row`;\n\n return (\n \n \n {quickOrderGridProducts.map((quickOrderProduct, index) => {\n let quantity = quickOrderProduct.productLine.productListLine.Quantity!;\n const product = quickOrderProduct.productLine.fullProduct;\n let min: number = 1;\n let max: number = 10;\n const behavior = product?.ProductDetails?.Behavior;\n if (isOrderQuantityLimitsFeatureEnabled && !ObjectExtensions.isNullOrUndefined(behavior)) {\n if (behavior.MinimumQuantity && behavior.MinimumQuantity > 0) {\n min = behavior.MinimumQuantity;\n }\n if (behavior.MaximumQuantity && behavior.MaximumQuantity > 0) {\n max = behavior.MaximumQuantity;\n }\n quantity = Math.max(quantity, min);\n }\n const price = quickOrderProduct.productLine.fullProduct?.ProductPrice;\n return (\n \n );\n })}\n
\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n getProductConfigure,\n IProductDimensionCallbacks,\n IProductDimensionConfigureResources,\n IProductDimensionConfigureViewProps\n} from '@msdyn365-commerce/components';\nimport {\n ProductDimension,\n ProductDimensionType,\n ProductDimensionValue,\n ProductListsDataActions,\n ProductListType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n addItemToProductListAction,\n AddItemToProductListInput,\n ArrayExtensions,\n createProductList,\n CreateProductListInput,\n FinitePromiseQueue,\n FinitePromiseQueueError,\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getScanResult,\n GetScanResultInput,\n getSelectedVariant,\n IDimensionForSelectedVariant,\n IPromiseQueue,\n ObjectExtensions,\n QuickOrderTemplate,\n QuickOrderTemplateLine,\n SelectedVariantInput,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getTelemetryObject,\n Heading,\n IModuleProps,\n INodeProps,\n isMobile,\n ITelemetryContent,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { debounce } from 'lodash';\nimport { computed } from 'mobx';\nimport * as React from 'react';\n\nimport { getCatalogId } from '@msdyn365-commerce/core';\nimport { ActiveProductListInput } from './actions';\nimport {\n EcommerceQuantityLimitConfigurationsFeatureName,\n IQuickOrderGridActionsProps,\n IQuickOrderGridActionsViewProps,\n IQuickOrderGridRowCallbacks,\n IQuickOrderGridState,\n QuickOrderGridActionsView,\n QuickOrderGridDrawer,\n QuickOrderGridFormComponent,\n QuickOrderGridProduct,\n QuickOrderGridTableComponent,\n RetailDefaultOrderQuantityLimitsFeatureName\n} from './components';\nimport { IQuickOrderGridData } from './quick-order-grid.data';\nimport { IQuickOrderGridProps, IQuickOrderGridResources } from './quick-order-grid.props.autogenerated';\n\n/**\n * QuickOrder Grid View props.\n */\nexport interface IQuickOrderGridViewProps extends IQuickOrderGridProps {\n header: JSX.Element;\n actions?: INodeProps;\n isB2bCustomer?: boolean;\n isQuickOrderGridFormExpanded: boolean;\n contentProps: INodeProps;\n drawer: INodeProps;\n loading?: React.ReactNode;\n quickOrderGridForm: INodeProps;\n quickOrderGridFormProductContent: INodeProps;\n quickOrderGridFormMsgContent: INodeProps;\n quickOrderGridProps: IModuleProps;\n form: React.ReactNode;\n configure?: IProductDimensionConfigureViewProps;\n isMobileView: boolean;\n container?: JSX.Element;\n orderActions?: IQuickOrderGridActionsViewProps | null;\n bulkPurchase?: React.ReactNode;\n}\n\n/**\n * QuickOrder Grid View port.\n */\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * QuickOrderGrid component.\n * @extends {React.PureComponent>}\n */\nclass QuickOrderGrid extends React.PureComponent, IQuickOrderGridState> {\n private readonly _productTextInput: React.RefObject;\n\n private readonly _quantityInput: React.RefObject;\n\n private readonly _waitTime: number = 500;\n\n private readonly _dimensionUpdateQueueMaxLength: number = 2;\n\n private readonly _errorCssClass: string = 'danger';\n\n private readonly _errorCssGlyphClass: string = 'fas fa-exclamation-triangle';\n\n private readonly _quickOrderGridFormClass: string;\n\n private readonly _quickOrderGridFormProductContent: string;\n\n private readonly _quickOrderGridFormMsgContent: string;\n\n private readonly _telemetryContent: ITelemetryContent;\n\n private readonly _dimensionUpdateQueue: IPromiseQueue = new FinitePromiseQueue(this._dimensionUpdateQueueMaxLength);\n\n private _dimensions: { [id: number]: string } = {};\n\n private _initializedDimensions: Set = new Set();\n\n private readonly _cssClassNameConfigure: string = 'ms-quick-order_grid__content-form-main';\n\n private readonly _className: string = 'ms-quick-order-grid';\n\n // @ts-expect-error: Debouce needs to be used as type.\n private _cancellabelDebounce: debounce;\n\n private _isOrderQuantityLimitsFeatureEnabled: boolean = false;\n\n private _isChannelLimitsFeatureEnabled: boolean = false;\n\n private _applyDefaultOrderSettingsForCartLine: boolean = false;\n\n private readonly _quickOrderGridCallbacks: IProductDimensionCallbacks = {\n initializeDimension: (initializedDimension: string): void => {\n if (initializedDimension) {\n this._initializedDimensions.add(initializedDimension);\n }\n },\n /**\n * Get Dropdown name.\n * @param selectedDimensionId - Dimension type.\n * @param selectedDimensionValueId - Resources.\n * @returns Dropdown name.\n */\n dimensionSelectedAsync: async (selectedDimensionId: number, selectedDimensionValueId: string): Promise => {\n this._dimensions[selectedDimensionId] = selectedDimensionValueId;\n // Only trigger _updateDimensions when all dimensions are initialized\n if (this._initializedDimensions.size === this.state.productDimensions?.length) {\n return this._dimensionUpdateQueue\n .enqueue(async () => {\n return this._updateDimensions();\n })\n .catch((error: string) => {\n // Ignore discarded processes.\n if (error !== FinitePromiseQueueError.ProcessWasDiscardedFromTheQueue) {\n throw new Error(error);\n }\n });\n }\n },\n\n /**\n * Get Dropdown name.\n * @param dimensionType - Dimension type.\n * @param resources - Resources.\n * @returns Dropdown name.\n */\n getDropdownName: (dimensionType: number, resources: IProductDimensionConfigureResources): string => {\n return this._getDropdownName(dimensionType, resources);\n },\n\n /**\n * Method to call on dimension change.\n * @param isUpdatingDimension - Flag to update dimension.\n */\n changeUpdatingDimension: (isUpdatingDimension: boolean): void => {\n this.setState({ isUpdatingDimension });\n }\n };\n\n private readonly _quickOrderGridRowCallbacks: IQuickOrderGridRowCallbacks = {\n /**\n * Method to call remove button.\n * @param line - Grid row product.\n */\n onRemoveItem: (line: QuickOrderGridProduct): void => {\n this._removeItemRowFromTable(line.productLine);\n },\n\n /**\n * Method to call on change quantity button.\n * @param productListLineId - Grid row product list line id.\n * @param quantity - Product quantity.\n * @returns - Falg to get confirmation for action.\n */\n onChangeQuantity: (productListLineId: string | undefined, quantity: number): boolean => {\n return this._changeRowQuantity(productListLineId, quantity);\n }\n };\n\n public constructor(props: IQuickOrderGridProps) {\n super(props);\n this._productTextInput = React.createRef();\n this._quantityInput = React.createRef();\n\n this._telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.state = {\n isQuickOrderGridFormExpanded: false,\n min: 0,\n max: 10,\n quantity: 1,\n productResponse: undefined,\n productDimensions: undefined,\n productDimensionErrorState: {\n configureErrors: {}\n },\n isMobile: this.isMobile,\n products: [],\n isUpdatingDimension: false,\n productListId: ''\n };\n\n this._quickOrderGridFormClass = 'ms-quick-order-grid__content-form';\n this._quickOrderGridFormProductContent = 'ms-quick-order-grid__content-form-main';\n this._quickOrderGridFormMsgContent = 'ms-quick-order-grid__content-form-msg';\n\n this._isOrderQuantityLimitsFeatureEnabled =\n this.props.data.featureState.result?.find(featureState => featureState.Name === RetailDefaultOrderQuantityLimitsFeatureName)\n ?.IsEnabled ?? false;\n\n this._isChannelLimitsFeatureEnabled =\n this.props.data.featureState.result?.find(featureState => featureState.Name === EcommerceQuantityLimitConfigurationsFeatureName)\n ?.IsEnabled ?? false;\n\n const cartConfiguration = this.props.data.cartConfiguration;\n this._applyDefaultOrderSettingsForCartLine = cartConfiguration?.result?.ValidateDefaultOrderSettingsPerLine ?? false;\n }\n\n @computed public get isMobile(): boolean {\n const size = isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n return size === 'xs';\n }\n\n public render(): JSX.Element | null {\n const { data } = this.props;\n if (!data.customerInformation.result) {\n return null;\n }\n const quickOrderTemplate = data.quickOrderTemplate;\n\n if (quickOrderTemplate?.result !== undefined) {\n this.setState({\n products: quickOrderTemplate.result.quickOrderTemplateLines,\n productListId: quickOrderTemplate.result.productList.Id\n });\n }\n const { className = '', maxQuantity } = this.props.config;\n const customerInfo = this.props.data.customerInformation.result;\n const {\n quickOrderGridModuleHeading,\n quickOrderGridModuleDescription,\n quickOrderGridAddtogrid,\n quickOrderGridProductQuantityInputLabel,\n quickOrderGridProductInputLabel,\n quickOrderGridProductDimensionTypeColor,\n quickOrderGridProductDimensionTypeConfiguration,\n quickOrderGridSelectDimensionFormatString,\n quickOrderGridProductDimensionTypeSize,\n quickOrderGridProductDimensionTypeStyle,\n quickOrderGridProductDimensionTypeAmount,\n quickOrderGridModulePageHeading\n } = this.props.resources;\n\n const productConfigureResources: IProductDimensionConfigureResources = {\n selectDimensionFormatString: quickOrderGridSelectDimensionFormatString,\n productDimensionTypeColor: quickOrderGridProductDimensionTypeColor,\n productDimensionTypeConfiguration: quickOrderGridProductDimensionTypeConfiguration,\n productDimensionTypeSize: quickOrderGridProductDimensionTypeSize,\n productDimensionTypeStyle: quickOrderGridProductDimensionTypeStyle,\n productDimensionTypeAmount: quickOrderGridProductDimensionTypeAmount\n };\n\n const { isQuickOrderGridFormExpanded, productDimensionErrorState, productResponse, productDimensions } = this.state;\n\n const headerClassName = `${this._className}__header`;\n\n const header = (\n
\n \n
\n );\n\n const viewProps: IQuickOrderGridViewProps = {\n ...(this.props as IQuickOrderGridProps),\n\n quickOrderGridProps: { className: classnames('ms-quick-order-grid', className), moduleProps: this.props },\n contentProps: { className: 'ms-quick-order-grid__content' },\n isB2bCustomer: customerInfo?.IsB2b,\n header,\n actions: {\n className: `${this._className}-action-bar`,\n tag: 'div'\n },\n drawer: {\n tag: QuickOrderGridDrawer,\n className: `${this._className}__drawer`,\n collapseProps: { isOpen: this.state.isQuickOrderGridFormExpanded },\n moduleHeadingText: quickOrderGridModuleHeading,\n moduleDescriptionText: quickOrderGridModuleDescription,\n requestContext: this.props.context.request,\n telemetryContent: this._telemetryContent\n },\n bulkPurchase: this._renderBulkPurchase(),\n quickOrderGridForm: {\n className: `${this._quickOrderGridFormClass} ${isQuickOrderGridFormExpanded ? 'qo-show' : 'qo-hide'}`\n },\n quickOrderGridFormProductContent: {\n className: this._quickOrderGridFormProductContent\n },\n quickOrderGridFormMsgContent: {\n className: this._quickOrderGridFormMsgContent\n },\n form: QuickOrderGridFormComponent({\n productTextInput: this._productTextInput,\n quantityTextInput: this._quantityInput,\n isAddtoListDisabled: !productResponse,\n ariaLabelAddtoCart: quickOrderGridAddtogrid,\n ariaLabelProduct: quickOrderGridProductInputLabel,\n ariaLabelQuantity: quickOrderGridProductQuantityInputLabel,\n maxChars: 50,\n minQuantity: this.state.min ?? 0,\n maxQuantity: this.state.max ?? maxQuantity,\n moduleClassName: this._className,\n quickOrderGridState: this.state,\n handleInputChange: this._handleInputChange,\n handleQuantityChange: this._handleQuantityChange,\n handleAddProductListClick: this._addItemToProductListLine\n }),\n configure:\n productResponse && productDimensions\n ? getProductConfigure(\n this._cssClassNameConfigure,\n this.props.context,\n this.props.friendlyName,\n this.props.telemetry,\n quickOrderGridSelectDimensionFormatString,\n productConfigureResources,\n this._quickOrderGridCallbacks,\n productResponse,\n productDimensions,\n productDimensionErrorState\n )\n : undefined,\n isQuickOrderGridFormExpanded: this.state.isQuickOrderGridFormExpanded,\n isMobileView: this.state.isMobile,\n container: ArrayExtensions.hasElements(this.state.products) ? this._renderListContainer() : undefined,\n orderActions: this._renderQuickOrderGridActions(quickOrderTemplate?.result)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _renderQuickOrderGridActions(quickOrderTemplate: QuickOrderTemplate | undefined): IQuickOrderGridActionsViewProps | null {\n const { typeName, context, resources } = this.props;\n const {\n quickOrderGridDeleteButtonText,\n quickOrderGridBuySelectedButtonText,\n quickOrderGridBuySelectedButtonAriaLabel,\n quickOrderGridBuySelectedAddingToCartErrorNotificationTitle,\n quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel,\n quickOrderGridGoToCartText,\n quickOrderGridDialogCloseText,\n quickOrderGridSingleItemText,\n quickOrderGridMultiLineItemFormatText,\n quickOrderGridMultiLinesFormatText,\n quickOrderGridHeaderMessageText,\n addedQuantityText,\n originalPriceText,\n currentPriceText,\n freePriceText\n } = resources;\n if (ArrayExtensions.hasElements(quickOrderTemplate?.quickOrderTemplateLines)) {\n const quickOrderGridActions: IQuickOrderGridActionsProps = {\n data: { quickOrderTemplate },\n moduleClassName: this._className,\n id: 'quick-order-grid',\n typeName,\n context,\n handlers: {\n removeProductList: this._removeProductList,\n onErrorMessage: (message: string) =>\n this.setState({\n topStateMessage: {\n messageText: message,\n statusCssString: this._errorCssClass,\n messageGlyph: this._errorCssGlyphClass,\n isOpen: true\n }\n })\n },\n quickOrderGridState: this.state,\n resources: {\n quickOrderGridDeleteButtonText,\n quickOrderGridBuySelectedButtonText,\n quickOrderGridBuySelectedButtonAriaLabel,\n quickOrderGridBuySelectedAddingToCartErrorNotificationTitle,\n quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel,\n quickOrderGridGoToCartText,\n quickOrderGridDialogCloseText,\n quickOrderGridSingleItemText,\n quickOrderGridMultiLineItemFormatText,\n quickOrderGridMultiLinesFormatText,\n quickOrderGridHeaderMessageText,\n addedQuantityText,\n originalPriceText,\n currentPriceText,\n freePriceText\n }\n };\n\n return QuickOrderGridActionsView(quickOrderGridActions);\n }\n return null;\n }\n\n /**\n * Renders bulk purchase module.\n * @returns Bulk purchase module react node.\n */\n private _renderBulkPurchase(): React.ReactNode {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Temporary switch for the feature which is under development.\n if (!this.props.context.app.config.isBulkPurchaseEnabled) {\n return null;\n }\n\n if (!ArrayExtensions.hasElements(this.props.slots.bulkPurchaseSlots)) {\n return null;\n }\n\n const containerClass = `${this._className}__bulk-purchase`;\n return (\n
\n {React.cloneElement(this.props.slots.bulkPurchaseSlots[0] as React.ReactElement, {\n productDimensions: this.state.productDimensions\n })}\n
\n );\n }\n\n /**\n * Render list container.\n * @returns JSX element.\n */\n private _renderListContainer(): JSX.Element {\n const containerClass = `${this._className}__table-content`;\n return
{this._renderQuickOrderTable(this._className)}
;\n }\n\n /**\n * Initial the products on quick order.\n * @returns List of quick order products or undefined.\n */\n private _initQuickOrderGridProducts(): QuickOrderGridProduct[] {\n const products: QuickOrderTemplateLine[] = this.state.products;\n\n const quickOrderGridProduct: QuickOrderGridProduct[] = products.map((product: QuickOrderTemplateLine) => {\n return new QuickOrderGridProduct(product);\n });\n\n return ArrayExtensions.validValues(quickOrderGridProduct);\n }\n\n /**\n * Method to call on clear button.\n */\n private readonly _removeProductList = () => {\n const { context, data, telemetry, resources } = this.props;\n const { quickOrderTemplate } = data;\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && quickOrderTemplate && quickOrderTemplate.result) {\n ProductListsDataActions.deleteAsync({ callerContext: context.actionContext }, quickOrderTemplate.result.productList)\n .then(() => {\n window.location.reload();\n })\n .catch((error: string) => {\n telemetry.warning('[quick-order-grid] Unable to delete product list.');\n telemetry.error(error);\n this._updateStatusState(\n resources.quickOrderGridDeleteProductListFailedText,\n this._errorCssClass,\n this._errorCssGlyphClass,\n true\n );\n });\n } else {\n telemetry.warning('[quick-order-grid] Failed to delete product list. Product List was not found');\n }\n };\n\n /**\n * Initial the products on quick order.\n * @param className - Class name.\n * @returns JSX element.\n */\n private _renderQuickOrderTable(className: string): JSX.Element {\n const tableClassName = `${className}__table-list`;\n\n return (\n \n );\n }\n\n private _updateQuantitiesInState(product: SimpleProduct): void {\n const min: number = this._getMinQuantityForCartLineItem(this._isOrderQuantityLimitsFeatureEnabled, product);\n const max: number = this._getMaxQuantityForCartLineItem(\n this._isChannelLimitsFeatureEnabled || this._isOrderQuantityLimitsFeatureEnabled,\n product\n );\n let quantity: number = this._getQuantity(\n this._isOrderQuantityLimitsFeatureEnabled,\n this._applyDefaultOrderSettingsForCartLine,\n product\n );\n quantity = Math.max(quantity, min);\n\n this.setState({\n min,\n max,\n quantity\n });\n }\n\n private _getMinQuantityForCartLineItem(isOrderQuantityLimitsFeatureEnabled: boolean, product: SimpleProduct): number {\n if (\n isOrderQuantityLimitsFeatureEnabled &&\n this._getIgnoreOrderSettings() &&\n product?.Behavior?.MinimumQuantity &&\n product.Behavior.MinimumQuantity > 0\n ) {\n return product.Behavior.MinimumQuantity;\n }\n\n return 1;\n }\n\n private _getMaxQuantityForCartLineItem(isQuantityLimitsFeatureEnabled: boolean, product: SimpleProduct): number {\n if (\n isQuantityLimitsFeatureEnabled &&\n this._getIgnoreOrderSettings() &&\n product?.Behavior?.MaximumQuantity &&\n product.Behavior.MaximumQuantity > 0\n ) {\n return product.Behavior.MaximumQuantity;\n }\n\n return this.props.context.app.config.maxQuantityForCartLineItem;\n }\n\n /**\n * Retrieves the value of the IgnoreOrderSettings property from the cart configuration.\n * If the property is not present, it defaults to false.\n * @returns {boolean} The value of the IgnoreOrderSettings property.\n */\n private _getIgnoreOrderSettings(): boolean {\n const cartConfiguration = this.props.data.cartConfiguration;\n return !(cartConfiguration?.result?.IgnoreOrderSettings ?? false);\n }\n\n private _getQuantity(\n isOrderQuantityLimitsFeatureEnabled: boolean,\n applyDefaultOrderSettingsForCartLine: boolean,\n product: SimpleProduct\n ): number {\n let defaultQuantity = 1;\n\n if (!isOrderQuantityLimitsFeatureEnabled || !applyDefaultOrderSettingsForCartLine) {\n return defaultQuantity;\n }\n\n if (product?.Behavior?.DefaultQuantity && product.Behavior.DefaultQuantity > 0) {\n defaultQuantity = product.Behavior.DefaultQuantity;\n }\n\n return defaultQuantity;\n }\n\n /**\n * Method to called on product input change.\n * @param query - Product inventory info.\n */\n private readonly _handleInputChange = (query: string): void => {\n const queryMinLength = 4;\n if (!query || query.length > queryMinLength) {\n this.setState({ quantity: 0, productDimensions: [], productResponse: undefined });\n this._updateStatusState('', '', '', false);\n }\n if (this._cancellabelDebounce) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call -- existing code.\n this._cancellabelDebounce.cancel();\n }\n\n const { telemetry, context } = this.props;\n const zeroNumber = 0;\n if (!StringExtensions.isNullOrEmpty(query)) {\n this._cancellabelDebounce = debounce(() => {\n getScanResult(\n new GetScanResultInput(\n context.actionContext.requestContext.apiSettings,\n query,\n context.actionContext.requestContext.apiSettings.channelId\n ),\n this.props.context.actionContext\n )\n .then(results => {\n this.setState({\n productResponse: results?.Product,\n productDimensions: results?.ProductDimensionFull,\n isQuickOrderGridFormExpanded: true\n });\n if (results?.Product) {\n this._updateQuantitiesInState(results.Product);\n }\n })\n .catch((error: Error) => {\n telemetry.exception(error);\n telemetry.debug('Unable to get scan results');\n });\n }, this._waitTime);\n\n setTimeout(() => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call -- Existing code.\n this._cancellabelDebounce();\n }, zeroNumber);\n this.setState({ isQuickOrderGridFormExpanded: true });\n } else {\n this.setState({ productResponse: undefined, isQuickOrderGridFormExpanded: true });\n }\n };\n\n /**\n * Method to called on quantity change.\n * @param value - Quantity value.\n */\n private readonly _handleQuantityChange = (value: string): void => {\n let currentValue = Number.parseInt(value, 10);\n const inputElement = this._quantityInput.current instanceof HTMLInputElement && this._quantityInput.current;\n const quantityChangeDebounceTimeout = 200;\n let minimumQuantity = 0;\n let needToUpdateUIValue: boolean = false;\n if (this._isOrderQuantityLimitsFeatureEnabled && !ObjectExtensions.isNullOrUndefined(this.state.productResponse?.Behavior)) {\n const behavior = this.state.productResponse!.Behavior;\n minimumQuantity = behavior?.MinimumQuantity ?? 0;\n const newCurrentValue = Math.max(currentValue, minimumQuantity);\n if (newCurrentValue !== currentValue) {\n needToUpdateUIValue = true;\n }\n currentValue = newCurrentValue;\n }\n\n this.setState({ quantity: currentValue }, () => {\n debounce(() => {\n if (needToUpdateUIValue && !Number.isNaN(this.state.quantity) && inputElement) {\n inputElement.setAttribute('aria-valuenow', currentValue.toString());\n inputElement.value = currentValue.toString();\n }\n }, quantityChangeDebounceTimeout)();\n });\n };\n\n /**\n * Method to get dropdwon name.\n * @param dimensionType - Dimension Type.\n * @param resources - String resources.\n * @returns Dropdwon label.\n */\n private readonly _getDropdownName = (dimensionType: number, resources: IProductDimensionConfigureResources): string => {\n const isGiftCard = this.state.productResponse?.IsGiftCard;\n\n switch (dimensionType) {\n case ProductDimensionType.Color: // ProductDimensionType.Color\n return resources.productDimensionTypeColor;\n case ProductDimensionType.Configuration: // ProductDimensionType.Configuration\n return resources.productDimensionTypeConfiguration;\n case ProductDimensionType.Size: // ProductDimensionType.Size\n return resources.productDimensionTypeSize;\n case ProductDimensionType.Style: // ProductDimensionType.Style\n return isGiftCard ? resources.productDimensionTypeAmount : resources.productDimensionTypeStyle;\n default:\n return '';\n }\n };\n\n /**\n * Method to update dimension and product in UI.\n */\n private readonly _updateDimensions = async (): Promise => {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n }\n } = this.props;\n const { productDimensions, productResponse } = this.state;\n const hasProductDimensions = ArrayExtensions.hasElements(productDimensions);\n if (!productResponse || !hasProductDimensions) {\n return;\n }\n\n const dimensionsToUpdate: { [id: number]: string } = { ...this._dimensions };\n this.setState({ isUpdatingDimension: true });\n\n // Step 1: Update state to indicate which dimensions are selected\n if (this.state.productDimensionErrorState.otherError) {\n // eslint-disable-next-line react/no-access-state-in-setstate -- existing code.\n const clearOtherErrorState = { ...this.state.productDimensionErrorState };\n clearOtherErrorState.otherError = undefined;\n this.setState({ productDimensionErrorState: clearOtherErrorState });\n }\n\n // Step 2: Clear any errors indicating the dimension wasn't selected\n for (const dimensionKey of Object.keys(dimensionsToUpdate)) {\n if (this.state.productDimensionErrorState.configureErrors[dimensionKey]) {\n // eslint-disable-next-line react/no-access-state-in-setstate -- existing code.\n const errorState = { ...this.state.productDimensionErrorState };\n errorState.configureErrors[dimensionKey] = undefined;\n\n this.setState({ productDimensionErrorState: errorState });\n }\n }\n\n // Step 3, Build the actually selected dimensions, prioritizing the information in state\n // over the information in data\n const mappedDimensions = productDimensions\n ?.map(dimension => {\n return {\n DimensionTypeValue: dimension.DimensionTypeValue,\n DimensionValue:\n this._updateDimensionValue(dimension, dimensionsToUpdate[dimension.DimensionTypeValue]) ?? dimension.DimensionValue,\n ExtensionProperties: dimension.ExtensionProperties\n };\n })\n .filter(dimension => {\n return dimension.DimensionValue;\n });\n\n // Step 4. Use these dimensions hydrate the product. Wrap this in a promise\n // so that places like add to cart can await it\n // eslint-disable-next-line no-async-promise-executor -- existing code\n const selectedProduct = new Promise(async resolve => {\n const newProduct = await getSelectedVariant(\n new SelectedVariantInput(\n productResponse.MasterProductId ? productResponse.MasterProductId : productResponse.RecordId,\n channelId,\n mappedDimensions,\n undefined,\n this.props.context.request\n ),\n actionContext\n );\n if (newProduct) {\n await getDimensionsForSelectedVariant(\n new GetDimensionsForSelectedVariantInput(\n newProduct.MasterProductId ? newProduct.MasterProductId : newProduct.RecordId,\n channelId,\n mappedDimensions,\n this.props.context.request\n ),\n actionContext\n );\n }\n\n resolve(newProduct);\n });\n\n const variantProduct = await selectedProduct;\n this.setState({ productResponse: variantProduct !== null ? variantProduct : undefined });\n };\n\n /**\n * Method to get updated dimension value.\n * @param productDimensionFull - Product dimension full.\n * @param newValueId - New Dimension value.\n * @returns Dimension Value.\n */\n private readonly _updateDimensionValue = (\n productDimensionFull: IDimensionForSelectedVariant,\n newValueId: string | undefined\n ): ProductDimensionValue | undefined => {\n if (newValueId && productDimensionFull.DimensionValues) {\n return productDimensionFull.DimensionValues.find(dimension => dimension.RecordId === +newValueId);\n }\n\n return undefined;\n };\n\n /**\n * Method to get dropdwon name.\n * @param dimensionTypeValue - Dimension Type.\n * @param resources - String resources.\n * @param isGiftCard - Flag to check if its a giftcard product.\n * @returns Dropdwon error label.\n */\n private readonly _getDimensionErrorString = (\n dimensionTypeValue: number,\n resources: IQuickOrderGridResources,\n isGiftCard?: boolean\n ): string => {\n const amountErrorMessage = resources.quickOrderGridproductDimensionTypeAmountErrorMessage;\n\n switch (dimensionTypeValue) {\n case ProductDimensionType.Color: // ProductDimensionType.Color\n return resources.quickOrderGridproductDimensionTypeColorErrorMessage;\n case ProductDimensionType.Configuration: // ProductDimensionType.Configuration\n return resources.quickOrderGridproductDimensionTypeConfigurationErrorMessage;\n case ProductDimensionType.Size: // ProductDimensionType.Size\n return resources.quickOrderGridproductDimensionTypeSizeErrorMessage;\n case ProductDimensionType.Style: // ProductDimensionType.Style\n return isGiftCard ? amountErrorMessage : resources.quickOrderGridproductDimensionTypeStyleErrorMessage;\n default:\n return '';\n }\n };\n\n /**\n * Initial the products on quick order.\n * @param productResponse - Simple Product.\n * @param quantity - Product Quantity.\n * @returns Flag to validate productlistline.\n */\n private readonly _validateCart = (productResponse: SimpleProduct, quantity: number): boolean => {\n // eslint-disable-next-line @typescript-eslint/prefer-optional-chain -- existing code\n const missingDimensions = productResponse.Dimensions?.filter(\n dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value)\n );\n const minimumQuantity = 0;\n if (ArrayExtensions.hasElements(missingDimensions)) {\n const userMessage = this._getConfigureErrors(missingDimensions, false);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- existing code\n if (this.state.productDimensionErrorState.configureErrors) {\n // eslint-disable-next-line react/no-access-state-in-setstate -- existing code\n const errorState = { ...this.state.productDimensionErrorState };\n errorState.configureErrors = userMessage;\n\n this.setState({ productDimensionErrorState: errorState });\n return false;\n }\n }\n\n if (quantity <= minimumQuantity) {\n const resources = this.props.resources;\n this._updateStatusState(resources.quickOrderGridWrongQuantityErrorMsg, this._errorCssClass, this._errorCssGlyphClass, true);\n return false;\n }\n return true;\n };\n\n /**\n * Initial the products on quick order.\n * @param result - Simple Product.\n * @param isGiftCard - Product Quantity.\n * @returns Flag to validate cart.\n */\n private _getConfigureErrors(\n result: ProductDimension[] | undefined,\n isGiftCard?: boolean\n ): { [configureId: string]: string | undefined } {\n if (!result) {\n return {};\n }\n const dimensions: { [configureId: string]: string | undefined } = {};\n const resources = this.props.resources;\n for (const dimension of result) {\n dimensions[dimension.DimensionTypeValue] = this._getDimensionErrorString(dimension.DimensionTypeValue, resources, isGiftCard);\n }\n return dimensions;\n }\n\n /**\n * Method to call on quantity change in row.\n * @param itemKey - Product Key.\n * @param quantity - Product quantity.\n * @returns Flag to update status.\n */\n private readonly _changeRowQuantity = (itemKey: string | undefined, quantity: number): boolean => {\n const { context, data, telemetry } = this.props;\n const { quickOrderTemplate } = data;\n if (quickOrderTemplate?.result) {\n const quickOrderTemplateLinesData = quickOrderTemplate.result.quickOrderTemplateLines;\n if (ArrayExtensions.hasElements(quickOrderTemplateLinesData)) {\n const orderLineIndex = quickOrderTemplateLinesData.findIndex(\n (lines: QuickOrderTemplateLine) => lines.productListLine.LineId === itemKey\n );\n const newProductListLine = { ...quickOrderTemplateLinesData[orderLineIndex] };\n if (quickOrderTemplateLinesData[orderLineIndex].productListLine.Quantity === quantity) {\n return true;\n }\n const previousQuantity = newProductListLine.productListLine.Quantity;\n newProductListLine.productListLine.Quantity = quantity;\n const { fullProduct, ...line } = newProductListLine;\n\n ProductListsDataActions.updateProductListLinesAsync(\n { callerContext: context.actionContext },\n quickOrderTemplate.result.productList.Id,\n [line.productListLine]\n )\n .then(list => {\n if (ArrayExtensions.hasElements(list)) {\n const newLine = list.find(lines => lines.LineId === itemKey);\n quickOrderTemplateLinesData[orderLineIndex].productListLine = newLine!;\n const updatedLines = [...quickOrderTemplateLinesData];\n updatedLines[orderLineIndex] = { fullProduct, productListLine: newLine! };\n const updatedProductList = { ...quickOrderTemplate.result, ProductListLines: updatedLines };\n context.actionContext.update(\n new ActiveProductListInput(context.actionContext.requestContext),\n updatedProductList\n );\n return true;\n }\n\n return false;\n })\n .catch((error: Error) => {\n telemetry.warning('[quick-order-grid] Unable to update product quantity.');\n telemetry.error(error.message);\n const userMessage = 'Failed to update quantity value.';\n newProductListLine.productListLine.Quantity = previousQuantity;\n this._updateStatusState(userMessage, this._errorCssClass, this._errorCssGlyphClass, true);\n return false;\n });\n }\n return false;\n }\n\n return false;\n };\n\n /**\n * Method to call on remove item from table.\n * @param line - Order Template Line.\n */\n private readonly _removeItemRowFromTable = (line: QuickOrderTemplateLine): void => {\n const { context, data, telemetry } = this.props;\n const { quickOrderTemplate } = data;\n\n if (quickOrderTemplate?.result) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken) {\n ProductListsDataActions.removeProductListLinesAsync(\n { callerContext: context.actionContext },\n line.productListLine.ProductListId!,\n [line.productListLine]\n )\n .then(() => {\n window.location.reload(false);\n })\n .catch((error: Error) => {\n telemetry.warning('[quick-order-grid] Unable remove item from product list grid');\n telemetry.error(error.message);\n });\n } else {\n telemetry.warning('[quick-order-grid] Unable remove items from product list grid user token was not found');\n }\n }\n };\n\n private readonly _isChannelMultipleCatalogsFeatureEnabled = (): boolean => {\n let isMultipleCatalogFeatureEnabledInHq = false;\n if (this.props.data.featureState) {\n isMultipleCatalogFeatureEnabledInHq =\n this.props.data.featureState.result?.find(\n feature => feature.Name === 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature'\n )?.IsEnabled || false;\n }\n return isMultipleCatalogFeatureEnabledInHq;\n };\n\n /**\n * Method to call on add item from form.\n */\n private readonly _addItemToProductListLine = async (): Promise => {\n const {\n context: { actionContext },\n resources,\n telemetry\n } = this.props;\n const {\n quickOrderGridAddedToGridSuccessMessage,\n quickOrderGridAddedToGridFailureMessage,\n quickOrderGridAddedToGridDuplicateError\n } = resources;\n const { productResponse, quantity, productListId } = this.state;\n // get the current catalog id.\n const catalogId = getCatalogId(this.props.context.request);\n\n this._updateStatusState('', '', '', false);\n\n if (productResponse !== undefined && this._validateCart(productResponse, quantity)) {\n if (StringExtensions.isNullOrWhitespace(productListId)) {\n await this._createProductList();\n }\n\n if (StringExtensions.isNullOrWhitespace(this.state.productListId)) {\n this._updateStatusState(quickOrderGridAddedToGridFailureMessage, this._errorCssClass, this._errorCssGlyphClass, true);\n return;\n }\n const input = new AddItemToProductListInput(\n this.state.productListId,\n productResponse.RecordId,\n quantity,\n productResponse.DefaultUnitOfMeasure ?? 'ea',\n this._isChannelMultipleCatalogsFeatureEnabled(),\n catalogId\n );\n\n await addItemToProductListAction(input, actionContext)\n .then(result => {\n if (result.ProductListId) {\n this._updateStatusState(quickOrderGridAddedToGridSuccessMessage, 'success', 'fas fa-check', true);\n window.location.reload();\n this.setState({});\n }\n })\n .catch((error: Error) => {\n telemetry.debug('[quick-order-grid] Error trying to Update Grid Line from the quick order grid');\n if (error.name === 'Microsoft_Dynamics_Commerce_Runtime_DuplicateObject') {\n this._updateStatusState(\n quickOrderGridAddedToGridDuplicateError,\n this._errorCssClass,\n this._errorCssGlyphClass,\n true\n );\n } else {\n this._updateStatusState(\n quickOrderGridAddedToGridFailureMessage,\n this._errorCssClass,\n this._errorCssGlyphClass,\n true\n );\n }\n });\n }\n };\n\n /**\n * Method to create product list.\n * @returns - ProductListId.\n */\n private _createProductList = async (): Promise => {\n const {\n context: { actionContext },\n telemetry,\n resources\n } = this.props;\n const { productListId } = this.state;\n const { quickOrderGridAddedToGridFailureMessage } = resources;\n\n if (StringExtensions.isNullOrWhitespace(productListId)) {\n const input = new CreateProductListInput('', ProductListType.QuickOrder);\n\n await createProductList(input, actionContext)\n .then(result => {\n if (!StringExtensions.isNullOrWhitespace(result.Id)) {\n this.setState({ productListId: result.Id });\n return result.Id;\n }\n return '';\n })\n .catch((error: Error) => {\n telemetry.debug('[quick-order-grid] Error on creating productlist from quick order grid');\n telemetry.error(error.message);\n this._updateStatusState(quickOrderGridAddedToGridFailureMessage, this._errorCssClass, this._errorCssGlyphClass, true);\n return '';\n });\n return '';\n }\n\n return productListId;\n };\n\n /**\n * Method to create product list.\n * @param messageText - Message Text.\n * @param statusCssString - Css class names.\n * @param messageGlyph - Glyph string.\n * @param isOpen - Flag to show.\n */\n private readonly _updateStatusState = (messageText: string, statusCssString: string, messageGlyph: string, isOpen: boolean): void => {\n this.setState({\n // eslint-disable-next-line react/no-unused-state -- Showing user message in Form component.\n stateMessage: {\n messageText,\n statusCssString,\n messageGlyph,\n isOpen\n }\n });\n };\n}\nexport default QuickOrderGrid;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IErrorState } from '@msdyn365-commerce/components';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { IDimensionForSelectedVariant, OrderTemplateLine } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { QuickOrderGridProduct } from './quick-order-grid-product';\n\n/**\n * QuickOrderGrid state message Interface.\n */\nexport interface IQuickOrderGridStateMessage {\n isOpen: boolean;\n messageGlyph: string;\n messageText: string;\n statusCssString: string;\n}\n\n/**\n * QuickOrderGrid state Interface.\n */\nexport interface IQuickOrderGridState {\n isQuickOrderGridFormExpanded: boolean;\n isUpdatingDimension?: boolean;\n productResponse: SimpleProduct | undefined;\n productDimensions: IDimensionForSelectedVariant[] | undefined;\n min: number | undefined;\n max: number | undefined;\n quantity: number;\n stateMessage?: IQuickOrderGridStateMessage;\n topStateMessage?: IQuickOrderGridStateMessage;\n productDimensionErrorState: IErrorState;\n isMobile: boolean;\n products: OrderTemplateLine[];\n productListId: string;\n}\n\n/**\n * QuickOrder Grid Row view.\n */\nexport interface IQuickOrderGridRowViewModel extends OrderTemplateLine {\n isChecked: boolean;\n}\n\n/**\n * Interface for quick order callbacks.\n */\nexport interface IQuickOrderGridRowCallbacks {\n onRemoveItem(line: QuickOrderGridProduct): void;\n onChangeQuantity(orderTemplateLineId: string | undefined, quantity: number): boolean;\n}\n\n/**\n * Interface for quick order grid action view props.\n */\nexport interface IQuickOrderGridActionsViewProps {\n addProductListToBag: React.ReactNode;\n removeProductList?: React.ReactNode;\n userMessage?: React.ReactNode;\n}\n\nexport const RetailDefaultOrderQuantityLimitsFeatureName: string = 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature';\n\nexport const EcommerceQuantityLimitConfigurationsFeatureName: string =\n 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature';\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n CartLine,\r\n ChannelDeliveryOptionConfiguration,\r\n DeliveryOption,\r\n OrgUnitLocation,\r\n ProductDeliveryOptions,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface IPickUpInStoreViewProps {\r\n callbacks: {\r\n toggleBopis(isBopisSelected: boolean): void;\r\n };\r\n defaultComponent?: React.ReactNode;\r\n orgUnitName?: string;\r\n isBopisSelected: boolean;\r\n ContainerProps: INodeProps;\r\n deliveryOption?: string;\r\n}\r\n\r\nexport interface IPickUpInStoreProps {\r\n cartline: CartLine;\r\n product: SimpleProduct;\r\n shipitText: string;\r\n pickUpInStoreText: string;\r\n changeStoreText: string;\r\n cartState: ICartState | undefined;\r\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\r\n orgUnitLocations?: OrgUnitLocation[] | undefined;\r\n deliveryOptions?: ProductDeliveryOptions;\r\n pickupDeliveryModeCode?: string;\r\n storeSelectorModuleId?: string;\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n retailMulitplePickupFeatureState?: boolean;\r\n locationChangedHandler(): void;\r\n}\r\n\r\nexport const PickUpInStore = (props: IPickUpInStoreProps): IPickUpInStoreViewProps | undefined => {\r\n const _onLocationChangedCallback = async (\r\n orgUnitLocation: OrgUnitLocation,\r\n cartState: ICartState | undefined,\r\n cartline: CartLine,\r\n deliveryMode?: string\r\n ) => {\r\n if (!cartState) {\r\n return Promise.resolve();\r\n }\r\n return cartState\r\n .updateCartLinePickupLocation({ cartLineId: cartline.LineId!, location: orgUnitLocation, deliveryMode })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n props.locationChangedHandler();\r\n }\r\n })\r\n .catch(error => {});\r\n };\r\n\r\n const _toggleBOPIS = (isBopisSelected: boolean) => {\r\n const { storeSelectorStateManager, product, cartline, cartState, storeSelectorModuleId } = props;\r\n\r\n if (isBopisSelected) {\r\n if (!storeSelectorStateManager) {\r\n return;\r\n }\r\n storeSelectorStateManager\r\n .openDialog({\r\n id: storeSelectorModuleId,\r\n product,\r\n alreadySelectedLocation: {\r\n OrgUnitNumber: cartline.FulfillmentStoreId\r\n },\r\n deliveryOptions: props.deliveryOptions,\r\n onLocationSelected: async (orgUnitLocation, deliveryMode: string | undefined) => {\r\n return _onLocationChangedCallback(orgUnitLocation, cartState, cartline, deliveryMode);\r\n }\r\n })\r\n .catch(error => {});\r\n } else {\r\n if (!cartState) {\r\n return;\r\n }\r\n cartline.DeliveryMode = '';\r\n cartline.FulfillmentStoreId = '';\r\n cartline.ShippingAddress = {};\r\n cartState\r\n .clearCartLinePickupLocation({ cartLineId: cartline.LineId! })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n props.locationChangedHandler();\r\n }\r\n })\r\n .catch(error => {});\r\n }\r\n };\r\n\r\n const _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\r\n if (!orgUnitLocations || !fulfillmentStoreId || orgUnitLocations.length === 0) {\r\n return '';\r\n }\r\n\r\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\r\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\r\n });\r\n\r\n if (foundLocation) {\r\n return foundLocation.OrgUnitName;\r\n }\r\n return fulfillmentStoreId;\r\n };\r\n\r\n const _renderShippingMethod = (\r\n cartLine: CartLine,\r\n shipItText: string,\r\n pickupInStoretext: string,\r\n changeStoreText: string,\r\n orgUnitLocations: OrgUnitLocation[] | undefined\r\n ): JSX.Element => {\r\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, orgUnitLocations);\r\n const bopisSelected = !!cartLine.FulfillmentStoreId;\r\n\r\n const toggleBOPIS = (isBopisSelected: boolean) => {\r\n return () => {\r\n _toggleBOPIS(isBopisSelected);\r\n };\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n {cartLine.FulfillmentStoreId ? (\r\n
\r\n {orgUnitName}\r\n \r\n
\r\n ) : null}\r\n \r\n );\r\n };\r\n\r\n const _getDeliveryOption = (pickupStore: IPickUpInStoreProps, deliveryOptions: ProductDeliveryOptions) => {\r\n const delivery = deliveryOptions?.DeliveryOptions?.find(option => option.Code === pickupStore.pickupDeliveryModeCode);\r\n return delivery?.Description;\r\n };\r\n\r\n /**\r\n * Method to check if we have atleast one common delivery code between product and channel.\r\n * @param productdeliveryOptions - Product DeliveryOption List.\r\n * @param storePickUpOptionList - Channel DeliveryOption List.\r\n * @returns Boolean flag.\r\n */\r\n const matchDeliveryOptions = (\r\n productdeliveryOptions: DeliveryOption[] | undefined,\r\n storePickUpOptionList: string[] | undefined\r\n ): boolean => {\r\n const deliveryOption: string[] = [];\r\n productdeliveryOptions?.map(delivery => {\r\n const pickup = storePickUpOptionList?.find(deliveryCode => deliveryCode === delivery.Code);\r\n if (pickup) {\r\n deliveryOption.push(pickup);\r\n }\r\n return deliveryOption;\r\n });\r\n\r\n return ArrayExtensions.hasElements(deliveryOption);\r\n };\r\n\r\n // If no delivery options present on the product, or none of the delivery options\r\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\r\n if (!props.deliveryOptions || !props.deliveryOptions.DeliveryOptions) {\r\n return undefined;\r\n }\r\n\r\n if (props.retailMulitplePickupFeatureState && props.channelDeliveryOptionConfig) {\r\n if (!matchDeliveryOptions(props.deliveryOptions.DeliveryOptions, props.channelDeliveryOptionConfig?.PickupDeliveryModeCodes)) {\r\n return undefined;\r\n }\r\n } else if (\r\n !props.pickupDeliveryModeCode ||\r\n !props.deliveryOptions.DeliveryOptions.find(option => option.Code === props.pickupDeliveryModeCode)\r\n ) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n callbacks: {\r\n toggleBopis: _toggleBOPIS\r\n },\r\n defaultComponent: _renderShippingMethod(\r\n props.cartline,\r\n props.shipitText,\r\n props.pickUpInStoreText,\r\n props.changeStoreText,\r\n props.orgUnitLocations\r\n ),\r\n orgUnitName: _getOrgUnitName(props.cartline.FulfillmentStoreId, props.orgUnitLocations),\r\n isBopisSelected: !!props.cartline.FulfillmentStoreId,\r\n deliveryOption: _getDeliveryOption(props, props.deliveryOptions),\r\n ContainerProps: {\r\n className: 'msc-cart-line__bopis-container'\r\n }\r\n };\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport {\r\n AddToOrderTemplateComponent,\r\n AddToWishlistComponent,\r\n CartLineItemComponent,\r\n IAddToOrderTemplateDialogResources,\r\n ICartlineResourceString,\r\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n IItemAddedToOrderTemplateDialogResources,\r\n IOrderTemplateNameDialogResources,\r\n IWishlistActionSuccessResult\r\n} from '@msdyn365-commerce/components';\r\nimport MsDyn365, {\r\n IAny,\r\n ICoreContext,\r\n IGeneric,\r\n IGridSettings,\r\n IImageSettings,\r\n ITelemetry,\r\n TelemetryEvent,\r\n isChannelTypeB2B\r\n} from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n AsyncResult,\r\n CartLine,\r\n CartLineValidationResultsByLineId,\r\n ChannelDeliveryOptionConfiguration,\r\n CommerceList,\r\n Customer,\r\n OrgUnitLocation,\r\n ProductDeliveryOptions,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { ProductCatalog, ProductDimensionType, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport {\r\n ArrayExtensions,\r\n getInvoiceDetailsPageUrlSync,\r\n getProductUrlSync,\r\n IProductInventoryInformation,\r\n ObjectExtensions,\r\n OrderTemplate\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '@msdyn365-commerce-modules/cart';\r\nimport { IPickUpInStoreViewProps, PickUpInStore } from './citta-cart-pick-up-in-store';\r\n\r\nexport interface ICartLineItemsProps {\r\n cartlines: CartLine[];\r\n cartlinesErrors: CartLineValidationResultsByLineId;\r\n cartState: ICartState | undefined;\r\n orgUnitLocations: OrgUnitLocation[] | undefined;\r\n resources: ICartlineResourceString;\r\n productAvailabilites: IProductInventoryInformation[] | undefined;\r\n products: SimpleProduct[] | undefined;\r\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\r\n pickupDeliveryModeCode?: string;\r\n catalogs?: ProductCatalog[];\r\n retailMulitplePickupFeatureState?: boolean;\r\n\r\n /* GridSettings for the product image in cartline */\r\n gridSettings: IGridSettings;\r\n\r\n /* ImageSettings for the product image in cartline */\r\n imageSettings: IImageSettings;\r\n id: string;\r\n typeName: string;\r\n context: ICoreContext>;\r\n telemetry: ITelemetry;\r\n removeButtonText: string;\r\n addToWishlistButtonText: string;\r\n removeFromWishlistButtonText: string;\r\n shipItText: string;\r\n pickitUpText: string;\r\n changeStoreText: string;\r\n outOfStockText: string;\r\n outOfRangeOneText: string;\r\n outOfRangeFormatText: string;\r\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\r\n isStockCheckEnabled: boolean;\r\n wishlists: CommerceList[] | undefined;\r\n defaultWishlistName: string;\r\n maxCartlineQuantity: number;\r\n includeErrors?: boolean;\r\n showShippingChargesForLineItems?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n isQuantityLimitsFeatureEnabled: boolean;\r\n hasInvoiceLine?: boolean;\r\n storeSelectorModuleId?: string;\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n\r\n addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\r\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\r\n itemAddedToOrderTemplateDialogResources: IItemAddedToOrderTemplateDialogResources;\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\r\n\r\n addToOrderTemplateButtonText: string;\r\n addToOrderTemplateButtonTooltip: string;\r\n addToOrderTemplateMessage: string;\r\n addItemToOrderTemplateError: string;\r\n orderTemplates: OrderTemplate[] | undefined;\r\n customerInformation: Customer | undefined;\r\n shouldIgnoreWarehouse: boolean | undefined;\r\n productAvailability?: AsyncResult;\r\n productPickUpOptions?: ProductDeliveryOptions[] | undefined;\r\n hsoConfig?: number;\r\n\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\r\n updateCartLinesQuantitySuccessHandler(cartline: CartLine, quantity: number, lineIndex?: number): boolean;\r\n locationChangedHandler(): void;\r\n}\r\n\r\nexport interface ICartlinesViewProps {\r\n cartline: React.ReactNode;\r\n pickUpInStore?: IPickUpInStoreViewProps;\r\n remove: React.ReactNode;\r\n addToWishlist: React.ReactNode | undefined;\r\n addToOrderTemplate: React.ReactNode | undefined;\r\n\r\n error?: string;\r\n cartlineId?: string;\r\n hasError?: boolean;\r\n data?: {\r\n product?: SimpleProduct;\r\n cartline: CartLine;\r\n };\r\n}\r\n\r\nconst _getCartItemAvailableQuantity = (\r\n isStockCheckEnabled: boolean,\r\n productAvailability: IProductInventoryInformation | undefined\r\n): number => {\r\n if (\r\n !isStockCheckEnabled ||\r\n !productAvailability ||\r\n !productAvailability.ProductAvailableQuantity ||\r\n !productAvailability.IsProductAvailable ||\r\n !productAvailability.ProductAvailableQuantity.AvailableQuantity\r\n ) {\r\n return 0;\r\n }\r\n\r\n return productAvailability.ProductAvailableQuantity.AvailableQuantity;\r\n};\r\n\r\nconst _getCartItemMaxQuantity = (\r\n maxQuantityByConfig: number,\r\n isStockCheckEnabled: boolean,\r\n availableQuantityInStock: number,\r\n isQuantityLimitsFeatureEnabled: boolean,\r\n maxByQuantityLimitsFeature: number\r\n) => {\r\n if (isQuantityLimitsFeatureEnabled) {\r\n let maxByQuantityLimitsFeatureResult = maxByQuantityLimitsFeature;\r\n\r\n // If max by feature in not defined when feature is on then we suggest that there no max by feature\r\n // and consider available qty if stock check enabled and max from config in site settings.\r\n if (!maxByQuantityLimitsFeature) {\r\n maxByQuantityLimitsFeatureResult = maxQuantityByConfig || 10;\r\n }\r\n\r\n return isStockCheckEnabled\r\n ? maxByQuantityLimitsFeatureResult < availableQuantityInStock\r\n ? maxByQuantityLimitsFeatureResult\r\n : availableQuantityInStock\r\n : maxByQuantityLimitsFeatureResult;\r\n }\r\n if (isStockCheckEnabled) {\r\n return availableQuantityInStock < maxQuantityByConfig ? availableQuantityInStock : maxQuantityByConfig;\r\n }\r\n return maxQuantityByConfig;\r\n};\r\n\r\nconst _getErrorMessage = (\r\n availableQuantityInStock: number,\r\n currentQuantity: number,\r\n props: ICartLineItemsProps,\r\n shouldSkipStockCheck: boolean,\r\n cartLine: CartLine,\r\n lineId: string | undefined\r\n): string | undefined => {\r\n const finalErrorMessages: string[] = [];\r\n\r\n const isLoadingDeliveryOptions = props.productAvailability?.status === 'LOADING';\r\n if (isLoadingDeliveryOptions) {\r\n return undefined;\r\n }\r\n\r\n let foundProductAvailability;\r\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\r\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\r\n if (props.shouldIgnoreWarehouse) {\r\n return productAvailability.ProductAvailableQuantity.ProductId === cartLine.ProductId;\r\n }\r\n return (\r\n productAvailability.ProductAvailableQuantity.ProductId === cartLine.ProductId &&\r\n productAvailability.InventLocationId === cartLine.WarehouseId\r\n );\r\n });\r\n if (foundProductAvailability === undefined) {\r\n return undefined;\r\n }\r\n }\r\n\r\n if (props.includeErrors && props.isStockCheckEnabled && !shouldSkipStockCheck) {\r\n if (availableQuantityInStock <= 0) {\r\n finalErrorMessages.push(props.outOfStockText);\r\n } else if (availableQuantityInStock < currentQuantity) {\r\n if (availableQuantityInStock === 1) {\r\n finalErrorMessages.push(props.outOfRangeOneText);\r\n } else {\r\n finalErrorMessages.push(props.outOfRangeFormatText.replace('{numLeft}', availableQuantityInStock.toString()));\r\n }\r\n }\r\n }\r\n\r\n // Server-side validation\r\n const checkForErrors = props.cartlinesErrors.ValidationResultsPairs;\r\n const errorsFoundByLineId = checkForErrors?.filter(index => index.LineId === lineId);\r\n if (errorsFoundByLineId !== undefined) {\r\n for (const i of errorsFoundByLineId) {\r\n if (ArrayExtensions.hasElements(i.ValidationFailures)) {\r\n i.ValidationFailures.forEach(validation => {\r\n if (validation.ErrorContext !== undefined) {\r\n finalErrorMessages.push(validation.ErrorContext);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n if (ArrayExtensions.hasElements(finalErrorMessages)) {\r\n return finalErrorMessages.join(' ');\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\n/**\r\n * On Remove Click functionality.\r\n * @param removeItemClickHandler -Remove item click function.\r\n * @param cartline -CartLine.\r\n * @returns Remove change value.\r\n */\r\nconst onRemoveClickFunction = (removeItemClickHandler: (cartlineToRemove: CartLine) => void, cartline: CartLine) => () => {\r\n removeItemClickHandler(cartline);\r\n};\r\n\r\n// eslint-disable-next-line complexity -- Auto-suppressed.\r\nconst _assembleNode = (\r\n cartline: CartLine,\r\n product: SimpleProduct | undefined,\r\n props: ICartLineItemsProps,\r\n index: number,\r\n foundProductAvailability?: IProductInventoryInformation,\r\n productPickUpOptions?: ProductDeliveryOptions\r\n): ICartlinesViewProps => {\r\n const {\r\n imageSettings,\r\n gridSettings,\r\n id,\r\n typeName,\r\n context,\r\n resources,\r\n removeButtonText,\r\n removeItemClickHandler,\r\n moveToWishlistSuccessHandler,\r\n addToOrderTemplateButtonText,\r\n addToOrderTemplateButtonTooltip,\r\n addToOrderTemplateDialogResources,\r\n createOrderTemplateDialogResources,\r\n itemAddedToOrderTemplateDialogResources,\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n addToWishlistButtonText,\r\n removeFromWishlistButtonText,\r\n orderTemplates,\r\n customerInformation,\r\n wishlists,\r\n defaultWishlistName,\r\n storeSelectorModuleId,\r\n hsoConfig\r\n } = props;\r\n\r\n const isAuthenticated = context.request.user.isAuthenticated;\r\n const nameOfWishlist = wishlists && wishlists.length > 0 && wishlists[0].Name ? wishlists[0].Name : defaultWishlistName;\r\n const availableQuantityInStock = _getCartItemAvailableQuantity(props.isStockCheckEnabled, foundProductAvailability);\r\n\r\n const maxQuantity =\r\n product &&\r\n _getCartItemMaxQuantity(\r\n props.maxCartlineQuantity,\r\n props.isStockCheckEnabled,\r\n availableQuantityInStock,\r\n props.isQuantityLimitsFeatureEnabled,\r\n product?.Behavior?.MaximumQuantity || 0\r\n );\r\n\r\n // Skip stock check if the cart line is a service item or an invoice line\r\n //const shouldSkipStockCheck = product?.ItemTypeValue === ReleasedProductType.Service || !!cartline.IsInvoiceLine;\r\n let shouldSkipStockCheck = product?.ItemTypeValue === ReleasedProductType.Service || !!cartline.IsInvoiceLine;\r\n \r\n if (hsoConfig) {\r\n const estimatedDateProperty = availableQuantityInStock\r\n && foundProductAvailability?.ProductAvailableQuantity.ExtensionProperties\r\n && foundProductAvailability?.ProductAvailableQuantity.ExtensionProperties.find((property => property.Key === 'EstimatedDate'));\r\n\r\n const estimatedDateValue = estimatedDateProperty && estimatedDateProperty.Value && estimatedDateProperty.Value.StringValue;\r\n\r\n let estimatedDate = \"\";\r\n if (estimatedDateValue == undefined) {\r\n estimatedDate = \"\";\r\n } else {\r\n estimatedDate = estimatedDateValue.toString();\r\n }\r\n\r\n const StockThresholdprop = availableQuantityInStock\r\n && foundProductAvailability?.ProductAvailableQuantity.ExtensionProperties\r\n && foundProductAvailability?.ProductAvailableQuantity.ExtensionProperties.find((property => property.Key === 'StockThreshold'));\r\n const StockThresholdpropval = StockThresholdprop && StockThresholdprop.Value && StockThresholdprop.Value.IntegerValue;\r\n let StockThreshold = 0;\r\n if (StockThresholdpropval != undefined) {\r\n StockThreshold = StockThresholdpropval;\r\n }\r\n\r\n let onhand = 0;\r\n if (availableQuantityInStock != undefined) {\r\n onhand = Number(availableQuantityInStock);\r\n }\r\n\r\n if (StockThreshold == 0) {\r\n shouldSkipStockCheck = true;\r\n } else {\r\n if (onhand >= StockThreshold) {\r\n shouldSkipStockCheck = true;\r\n } else {\r\n if (estimatedDate != \"\") {\r\n shouldSkipStockCheck = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n const errorMessage = ObjectExtensions.isNullOrUndefined(maxQuantity)\r\n ? undefined\r\n : _getErrorMessage(availableQuantityInStock, cartline.Quantity!, props, shouldSkipStockCheck, cartline, cartline.LineId);\r\n\r\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\r\n\r\n const payload = getPayloadObject(TelemetryEvent.RemoveFromCart, props.telemetryContent!, removeButtonText, '');\r\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\r\n\r\n const inventoryLbl = foundProductAvailability?.StockLevelLabel;\r\n const inventoryCode = foundProductAvailability\r\n ? `ms-cart-line__inventory-code-${foundProductAvailability.StockLevelCode?.toLowerCase()}`\r\n : undefined;\r\n const productDimension = 4;\r\n const customPriceDimensionType = productDimension as ProductDimensionType.Style;\r\n const isCustomPriceSelected =\r\n product?.Dimensions?.find(dimension => dimension.DimensionTypeValue === customPriceDimensionType)?.DimensionValue?.Value ===\r\n 'Custom';\r\n\r\n let productUrl: string | undefined;\r\n if (product) {\r\n productUrl = getProductUrlSync(product, props.context.actionContext, undefined);\r\n\r\n if (MsDyn365.isBrowser && isChannelTypeB2B(props.context.actionContext.requestContext)) {\r\n const fullUrl = new URL(productUrl, window.location.href);\r\n fullUrl.searchParams.set('catalogid', `${cartline.CatalogId ?? 0}`);\r\n productUrl = fullUrl.href;\r\n }\r\n } else {\r\n productUrl = getInvoiceDetailsPageUrlSync(cartline.Description || '', props.context.actionContext);\r\n }\r\n\r\n return {\r\n data: {\r\n product,\r\n cartline\r\n },\r\n cartlineId: cartline.LineId,\r\n error: errorMessage,\r\n hasError: !shouldSkipStockCheck && props.isStockCheckEnabled ? cartline.Quantity! > (maxQuantity ?? 0) : false,\r\n cartline: (\r\n \r\n ),\r\n pickUpInStore: product\r\n ? PickUpInStore({\r\n storeSelectorModuleId,\r\n cartState: props.cartState,\r\n cartline,\r\n product,\r\n shipitText: props.shipItText,\r\n pickUpInStoreText: props.pickitUpText,\r\n changeStoreText: props.changeStoreText,\r\n storeSelectorStateManager: props.storeSelectorStateManager,\r\n orgUnitLocations: props.orgUnitLocations,\r\n deliveryOptions: productPickUpOptions,\r\n pickupDeliveryModeCode:\r\n cartline.DeliveryMode !== (undefined || '') ? cartline.DeliveryMode : props.pickupDeliveryModeCode,\r\n retailMulitplePickupFeatureState: props.retailMulitplePickupFeatureState,\r\n channelDeliveryOptionConfig: props.channelDeliveryOptionConfig,\r\n locationChangedHandler: props.locationChangedHandler\r\n })\r\n : undefined,\r\n remove: (\r\n \r\n ),\r\n addToWishlist:\r\n isAuthenticated && product && !isCustomPriceSelected ? (\r\n \r\n ) : (\r\n undefined\r\n ),\r\n addToOrderTemplate:\r\n isAuthenticated && orderTemplates && product ? (\r\n \r\n ) : (\r\n undefined\r\n )\r\n };\r\n};\r\n\r\nexport const assembleCartlines = (\r\n cartlines: CartLine[],\r\n products: SimpleProduct[] | undefined,\r\n props: ICartLineItemsProps\r\n): ICartlinesViewProps[] | null => {\r\n const reactNodes: ICartlinesViewProps[] = [];\r\n\r\n cartlines.map((cartline, index) => {\r\n let product;\r\n if (props.isQuantityLimitsFeatureEnabled) {\r\n // When feature is enabled the same products could have different quantity limits in Behavior so we need\r\n // to check productId and WarehouseId for identification.\r\n product = getProductByProductIdAndWarehouse(cartline.ProductId, products, cartline.WarehouseId, props.cartState);\r\n } else {\r\n product = getProductByProductId(cartline.ProductId, products);\r\n }\r\n let foundProductAvailability;\r\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\r\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\r\n if (props.shouldIgnoreWarehouse) {\r\n return productAvailability.ProductAvailableQuantity?.ProductId === cartline.ProductId;\r\n }\r\n return (\r\n productAvailability.ProductAvailableQuantity?.ProductId === cartline.ProductId &&\r\n productAvailability.InventLocationId?.toUpperCase() === cartline.WarehouseId?.toUpperCase()\r\n );\r\n });\r\n }\r\n\r\n let productPickUpOptions;\r\n if (props.productPickUpOptions !== undefined && ArrayExtensions.hasElements(props.productPickUpOptions)) {\r\n productPickUpOptions = props.productPickUpOptions.find(deliveryOption => {\r\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\r\n });\r\n }\r\n reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability, productPickUpOptions));\r\n });\r\n\r\n return reactNodes;\r\n};\r\n\r\n/**\r\n * CartLineItems component.\r\n * @param props\r\n */\r\nexport const CartLineItems = (props: ICartLineItemsProps) => {\r\n const { products, cartlines } = props;\r\n return assembleCartlines(cartlines, products, props);\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport groupBy from 'lodash/groupBy';\r\n\r\nimport { assembleCartlines, ICartLineItemsProps, ICartlinesViewProps } from './citta-cart-line-items';\r\n\r\nconst _assembleGroupCartlines = (\r\n cartlines: CartLine[],\r\n products: SimpleProduct[] | undefined,\r\n props: ICartLineItemsProps\r\n): ICartlinesViewProps[][] | null => {\r\n const reactNodes: ICartlinesViewProps[][] = [];\r\n if (!products || products.length === 0) {\r\n props.context.telemetry.error('Products content is empty, module wont render');\r\n return null;\r\n }\r\n\r\n const getGroupByStorePickup = (items: CartLine[]) => groupBy(items, item => item.FulfillmentStoreId);\r\n const getGroupByDelivery = (items: CartLine[]) => groupBy(items, item => item.DeliveryMode);\r\n const groupDelivery = getGroupByDelivery(cartlines);\r\n const cartLinesGroup: CartLine[] = [];\r\n\r\n // 1) Group by store and pick up mode\r\n Object.entries(groupDelivery).forEach(([deliveryType, groupByDeliveryType]) => {\r\n // @ts-expect-error\r\n groupDelivery[deliveryType] = getGroupByStorePickup(groupByDeliveryType);\r\n cartLinesGroup.push(getGroupByStorePickup(groupByDeliveryType));\r\n });\r\n\r\n // 2) Create cartlines group\r\n Object.keys(cartLinesGroup).forEach(key => {\r\n const cartLines = cartLinesGroup[key];\r\n Object.keys(cartLines).forEach(index => {\r\n const cartLine = cartLines[index];\r\n const carLineViewProps = assembleCartlines(cartLine, products, props);\r\n if (carLineViewProps !== null) {\r\n reactNodes.push(carLineViewProps);\r\n }\r\n });\r\n });\r\n\r\n return reactNodes;\r\n};\r\n\r\nconst _assembleGroupInvoiceCartlines = (\r\n cartLines: CartLine[],\r\n products: SimpleProduct[] | undefined,\r\n props: ICartLineItemsProps\r\n): ICartlinesViewProps[][] | null => {\r\n const reactNodes: ICartlinesViewProps[][] = [];\r\n if (cartLines && cartLines.length > 0) {\r\n // Create invoice cartLines group\r\n const carLineViewProps = assembleCartlines(cartLines, products, props);\r\n if (carLineViewProps !== null) {\r\n reactNodes.push(carLineViewProps);\r\n }\r\n }\r\n return reactNodes;\r\n};\r\n\r\n/**\r\n * CartLine Group component.\r\n * @param props\r\n */\r\nexport const CartLineGroupItems = (props: ICartLineItemsProps) => {\r\n const { products, cartlines, hasInvoiceLine } = props;\r\n return hasInvoiceLine\r\n ? _assembleGroupInvoiceCartlines(cartlines, products, props)\r\n : _assembleGroupCartlines(cartlines, products, props);\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\r\nimport { getPromotionOptionsForCartLineItems, PromotionOptionsForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\n/**\r\n * IPromotionData entity interface.\r\n */\r\nexport interface IPromotionData {\r\n promotionOptions?: CartPromotionLine[];\r\n}\r\n\r\n/**\r\n * Calls the Retail API and returns a promotion data.\r\n * @param ctx\r\n */\r\nexport async function getPromotionData(ctx: IActionContext): Promise {\r\n const promotionData: IPromotionData = {};\r\n\r\n await getPromotionOptionsForCartLineItems(new PromotionOptionsForCartLineItems(ctx.requestContext.apiSettings), ctx)\r\n .then(promotionOptions => {\r\n if (promotionOptions) {\r\n promotionData.promotionOptions = promotionOptions;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n return {};\r\n });\r\n\r\n return promotionData;\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport {\r\n IAddToOrderTemplateDialogResources,\r\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n IItemAddedToOrderTemplateDialogResources,\r\n ILinesAddedToOrderTemplateDialogResources,\r\n IOrderTemplateNameDialogResources,\r\n IWishlistActionSuccessResult,\r\n PromoCodeComponent,\r\n SaveCartToOrderTemplateComponent\r\n} from '@msdyn365-commerce/components';\r\nimport MsDyn365, { getUrlSync, IImageSettings, isChannelTypeB2B, isOboRequest } from '@msdyn365-commerce/core';\r\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport { AsyncResult, CartLine, CartLineValidationResultsByLineId, LineValidationResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { ProductDeliveryOptions, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { cartLineQuantityUpdatedAsync, validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\r\nimport { IInvoiceSummaryLines, InvoiceSummary } from '@msdyn365-commerce-modules/invoice-payment-summary';\r\nimport { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport {\r\n ActiveCartProductsInput,\r\n ArrayExtensions,\r\n getActiveCartProductsAction,\r\n ICartLineInventoryValidationResult,\r\n ObjectExtensions,\r\n ProductPickUpOptionsForCartLineItems\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Alert,\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n INodeProps,\r\n IPayLoad,\r\n ITelemetryContent,\r\n TelemetryConstant,\r\n Waiting,\r\n updateMaxQuantityForCartLineItem,\r\n urlCheck\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { reaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport React from 'react';\r\nimport { getPickUpOptionsForCartLineItems } from './actions/get-pickup-options-for-citta-cartlines';\r\n\r\nimport { ICittaCartData } from './citta-cart.data';\r\nimport { ICittaCartProps, ICittaCartResources } from './citta-cart.props.autogenerated';\r\nimport { CartLineGroupItems } from './components/citta-cart-line-groups';\r\nimport { CartLineItems, ICartlinesViewProps } from './components/citta-cart-line-items';\r\nimport { cartPromotions, ICartLineItemViewProps } from './components/citta-cart-line-items-promotion';\r\nimport { getPromotionData, IPromotionData } from './utils/get-promotion-in-citta-cart';\r\n\r\nimport { validateCartLinesInventory } from './components/hso-validate-cartlines-inventory';\r\n/**\r\n * Cart view props interface.\r\n */\r\nexport interface ICartViewProps extends ICittaCartProps {\r\n className: string;\r\n title?: React.ReactNode;\r\n CartlinesWrapper: INodeProps;\r\n cartlines?: ICartlinesViewProps[];\r\n cartLinesGroup?: ICartlinesViewProps[][];\r\n cart: ICartState | undefined;\r\n orderSummaryHeading: React.ReactNode;\r\n orderSummaryLineitems?: IOrderSummaryLines;\r\n invoiceSummaryLineitems?: IInvoiceSummaryLines;\r\n OrderSummaryWrapper: INodeProps;\r\n OrderSummaryItems: INodeProps;\r\n OrderSummaryErrors?: IOrderSummaryErrors;\r\n checkoutAsGuestButton: React.ReactNode;\r\n checkoutAsSignInUserButton: React.ReactNode;\r\n storeSelector?: React.ReactNode;\r\n expressCheckoutButton?: React.ReactNode[];\r\n ExpressCheckoutSectionWrapper: INodeProps;\r\n backToShoppingButton: React.ReactNode;\r\n waitingComponent: React.ReactNode;\r\n promotionOptions?: ICartLineItemViewProps;\r\n promoCode: React.ReactNode;\r\n cartLoadingStatus: string;\r\n cartDataResult: boolean;\r\n multiplePickUpEnabled?: boolean;\r\n createTemplateFromCartButton: React.ReactNode;\r\n telemetryContent?: ITelemetryContent;\r\n checkoutBlockedDueToUnavailableFunds?: React.ReactNode;\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\r\n}\r\n\r\n/**\r\n * Order summary errors interface.\r\n */\r\nexport interface IOrderSummaryErrors {\r\n Wrapper: INodeProps;\r\n header: React.ReactNode;\r\n errors: React.ReactNode[];\r\n}\r\n\r\n/**\r\n * Cart component state interface.\r\n */\r\ninterface ICartComponentState {\r\n showPromotionDialog: boolean;\r\n cartlinesErrors: CartLineValidationResultsByLineId;\r\n promotionData: IPromotionData;\r\n isCartValid: boolean;\r\n productPickUpOptions?: ProductDeliveryOptions[];\r\n}\r\n\r\n/**\r\n * Cart component.\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nclass Cart extends React.Component> {\r\n public state: ICartComponentState;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n private isQuantityLimitsFeatureEnabled: boolean = false;\r\n\r\n private _isMounted: boolean = false;\r\n\r\n private readonly promotionPopupId: string = 'cart-promotion-popup';\r\n\r\n public constructor(props: ICittaCartProps) {\r\n super(props);\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n this.payLoad = getPayloadObject('click', this.telemetryContent, '');\r\n this.promotionLinkClick = this.promotionLinkClick.bind(this);\r\n this.promotionCloseButtonclick = this.promotionCloseButtonclick.bind(this);\r\n\r\n this.state = {\r\n showPromotionDialog: false,\r\n promotionData: {},\r\n isCartValid: true,\r\n productPickUpOptions: undefined,\r\n cartlinesErrors: {}\r\n };\r\n }\r\n\r\n /**\r\n * Component did mount function.\r\n */\r\n public async componentDidMount(): Promise {\r\n this._isMounted = true;\r\n const {\r\n config,\r\n context: { actionContext }\r\n } = this.props;\r\n\r\n this.isQuantityLimitsFeatureEnabled = await this.getOrderQuantityLimitsFeatureFlag();\r\n if (this.isQuantityLimitsFeatureEnabled) {\r\n await this.validateCart();\r\n }\r\n\r\n if (config.showAvailablePromotions) {\r\n if (this._isMounted && this.props.data.cart.result?.cart.CartLines) {\r\n this.setState({ promotionData: await getPromotionData(actionContext) });\r\n }\r\n\r\n reaction(\r\n () => this.props.data.cart.result?.cart.CartLines,\r\n async () => {\r\n if (this._isMounted) {\r\n this.setState({ promotionData: await getPromotionData(actionContext) });\r\n }\r\n }\r\n );\r\n }\r\n reaction(\r\n () => this.props.data.cart.result?.cart.CartLines,\r\n async () => {\r\n if (this._isMounted) {\r\n const input = new ProductPickUpOptionsForCartLineItems(actionContext.requestContext.apiSettings);\r\n this.setState({ productPickUpOptions: await getPickUpOptionsForCartLineItems(input, actionContext) });\r\n }\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Component will unmount function.\r\n */\r\n public componentWillUnmount(): void {\r\n this._isMounted = false;\r\n }\r\n\r\n /**\r\n * Should component update function.\r\n * @param nextProps - Next props.\r\n * @param nextState - Next state.\r\n * @returns True if component should update, false otherwise.\r\n */\r\n public shouldComponentUpdate(nextProps: ICittaCartProps, nextState: ICartComponentState): boolean {\r\n if (this.state === nextState && this.props.data === nextProps.data) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /* eslint-disable complexity -- Disabling complexity for render method */\r\n public render(): JSX.Element | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n products: { result: products }\r\n },\r\n context: {\r\n request: {\r\n user: { isAuthenticated, signInUrl }\r\n }\r\n },\r\n resources\r\n } = this.props;\r\n\r\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\r\n const backToShoppingUrl = getUrlSync('home', this.props.context.actionContext) || '';\r\n const checkoutURL = this.getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\r\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\r\n const cartLines = this._getCartLines();\r\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\r\n\r\n \r\n const HSOConfigprop = this.props.data.channelConfiguration.result\r\n && this.props.data.channelConfiguration.result.ExtensionProperties\r\n && this.props.data.channelConfiguration.result!.ExtensionProperties.find((property => property.Key === 'HSOConfig'));\r\n\r\n let HSOConfig = HSOConfigprop && HSOConfigprop.Value && HSOConfigprop.Value.IntegerValue;\r\n if (HSOConfig == undefined) {\r\n HSOConfig = 0;\r\n }\r\n\r\n const validInventoryAcrossCartLines = validateCartLinesInventory(\r\n cart?.cart.CartLines ?? [],\r\n this.props.data.productAvailabilites.result ?? [],\r\n this.props.context.actionContext,\r\n products ?? [],\r\n emailDeliveryModeCode,\r\n HSOConfig\r\n );\r\n\r\n let hasError =\r\n !validInventoryAcrossCartLines?.isValid ||\r\n this._isCheckoutBlockedDueToUnavailableFunds() ||\r\n (!validInventoryAcrossCartLines && !this.state.isCartValid) ||\r\n (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\r\n\r\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\r\n );\r\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\r\n const cartLinesGroup = cart?.hasInvoiceLine || multiplePickUpEnabled ? this.getCartLinesGroup() : null;\r\n this.payLoad.contentAction.etext = TelemetryConstant.Checkout;\r\n const checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n this.payLoad.contentAction.etext = TelemetryConstant.GuestCheckout;\r\n const checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n this.payLoad.contentAction.etext = TelemetryConstant.BackToShopping;\r\n const backtoShoppingAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n\r\n // If there's inventory issues across multiple cart lines then update the error and display as part of the order summary\r\n if (validInventoryAcrossCartLines && !validInventoryAcrossCartLines.isValid) {\r\n if (multiplePickUpEnabled && cartLinesGroup !== null) {\r\n for (const cartLineGroup of cartLinesGroup) {\r\n this._updateCartLineErrorForInvalidInventory(cartLineGroup, validInventoryAcrossCartLines);\r\n }\r\n }\r\n\r\n this._updateCartLineErrorForInvalidInventory(cartLines, validInventoryAcrossCartLines);\r\n }\r\n\r\n const viewProps = {\r\n ...this.props,\r\n className: classnames('ms-cart'),\r\n title:

{resources.cartTitle}

,\r\n cart: this.props.data.cart.result,\r\n CartlinesWrapper: { className: 'msc-cartline-wraper' },\r\n OrderSummaryWrapper: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary-wrapper' : 'msc-order-summary-wrapper' },\r\n OrderSummaryItems: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary__items' : 'msc-order-summary__items' },\r\n cartlines: cartLines,\r\n cartLinesGroup,\r\n promoCode: this._getPromoCode(),\r\n promotionOptions: this._getPromotions(),\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n telemetry: this.props.telemetry,\r\n id: this.props.id,\r\n multiplePickUpEnabled,\r\n removePromoAriaLabelFormat: resources.removePromoAriaLabelFormat,\r\n orderSummaryHeading: ArrayExtensions.hasElements(cart?.cart.CartLines) ? (\r\n cart?.hasInvoiceLine ? (\r\n

{resources.invoiceSummaryTitle}

\r\n ) : (\r\n

{resources.orderSummaryTitle}

\r\n )\r\n ) : null,\r\n orderSummaryLineitems: this._getOrderSummaryLineItems(),\r\n invoiceSummaryLineitems: this._getInvoiceSummaryLineItems(),\r\n checkoutAsSignInUserButton: !isCartEmpty ? (\r\n \r\n {resources.checkoutButtonTitle}\r\n \r\n ) : null,\r\n checkoutAsGuestButton:\r\n !isCartEmpty && !isAuthenticated && this.props.config.showGuestCheckoutButton ? (\r\n \r\n {resources.guestCheckoutButtonTitle}\r\n \r\n ) : null,\r\n expressCheckoutButton: !isCartEmpty ? this.props.slots.paymentExpress : null,\r\n ExpressCheckoutSectionWrapper: { className: 'msc-express-payment-container-in-cart-page' },\r\n backToShoppingButton: (\r\n \r\n {resources.backToShoppingButtonTitle}\r\n \r\n ),\r\n createTemplateFromCartButton:\r\n this._displayAddCartToTemplate() && products ? (\r\n \r\n ) : null,\r\n checkoutBlockedDueToUnavailableFunds: this._isCheckoutBlockedDueToUnavailableFunds() ? (\r\n \r\n \r\n \r\n {resources.checkoutBlockedDueToUnavailableFundsTitle}\r\n {resources.checkoutBlockedDueToUnavailableFundsMessage}\r\n \r\n \r\n ) : null,\r\n storeSelector:\r\n this.props.slots.storeSelector && this.props.slots.storeSelector.length > 0 ? this.props.slots.storeSelector[0] : null,\r\n removeItemClickHandler: this.removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\r\n waitingComponent: ,\r\n cartLoadingStatus: this.props.data.cart.status === 'FAILED' ? this.props.resources.cartLoadingErrorMessage : null,\r\n cartDataResult: this.props.data.cart.result && this.props.data.cart.result.isEmpty,\r\n OrderSummaryErrors: this._getOrderSummaryErrors(cartLines),\r\n telemetryContent: this.telemetryContent\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n /* eslint-enable complexity -- Disabling complexity for render method */\r\n\r\n /**\r\n * Promotion click event handler.\r\n * @param event - The mouse event.\r\n */\r\n private readonly promotionLinkClick = (event: React.MouseEvent) => {\r\n this.setState({\r\n showPromotionDialog: !this.state.showPromotionDialog\r\n });\r\n };\r\n\r\n /**\r\n * Promotion close button click.\r\n */\r\n private readonly promotionCloseButtonclick = () => {\r\n this._hidePromotionDialog();\r\n };\r\n\r\n /**\r\n * Hide promotion dialog.\r\n */\r\n private _hidePromotionDialog(): void {\r\n this.setState({\r\n showPromotionDialog: false\r\n });\r\n }\r\n\r\n /**\r\n * Display add to cart template.\r\n * @returns True if should display, false otherwise.\r\n */\r\n private _displayAddCartToTemplate(): boolean {\r\n const cart = this.props.data.cart?.result;\r\n if (ObjectExtensions.isNullOrUndefined(cart) || cart.hasInvoiceLine) {\r\n return false;\r\n }\r\n\r\n if (\r\n isChannelTypeB2B(this.props.context.actionContext.requestContext) &&\r\n this.props.data.orderTemplates.result &&\r\n ArrayExtensions.hasElements(cart.cart?.CartLines) &&\r\n this.props.data.customerInformation.result\r\n ) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Get promotions.\r\n * @returns React node with the promotions.\r\n */\r\n private _getPromotions(): React.ReactNode {\r\n return (\r\n this.props.config.showAvailablePromotions &&\r\n cartPromotions({\r\n id: this.promotionPopupId,\r\n showPromotionPopup: this.state.showPromotionDialog,\r\n onSeeAllClick: this.promotionLinkClick,\r\n onCloseButtonClick: this.promotionCloseButtonclick,\r\n promotions: this.state.promotionData.promotionOptions,\r\n resources: {\r\n promotionStringHeading: this.props.resources.promotionStringHeading,\r\n promotionLinkText: this.props.resources.promotionLinkText,\r\n promotionPopupHeading: this.props.resources.promotionPopupHeading,\r\n promotionCloseButtonAriaLabel: this.props.resources.promotionCloseButtonAriaLabel\r\n }\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Add error message in cart line in case the quantity exceeds the current inventory.\r\n * @param cartLines - The cart lines.\r\n * @param cartLineInventoryValidationResult - The cart line inventory result.\r\n */\r\n private _updateCartLineErrorForInvalidInventory(\r\n cartLines: ICartlinesViewProps[] | null,\r\n cartLineInventoryValidationResult: ICartLineInventoryValidationResult\r\n ) {\r\n const { resources } = this.props;\r\n\r\n if (\r\n ArrayExtensions.hasElements(cartLines) &&\r\n !cartLineInventoryValidationResult.isValid &&\r\n ArrayExtensions.hasElements(cartLineInventoryValidationResult.productIdWithErrors)\r\n ) {\r\n for (const productIdWithError of cartLineInventoryValidationResult.productIdWithErrors) {\r\n const cartLine = cartLines?.find(element => element.data?.cartline.ProductId === productIdWithError);\r\n if (cartLine) {\r\n cartLine.error = resources.outOfStockErrorMessage;\r\n cartLine.hasError = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get order summary errors.\r\n * @param cartLines - The cart lines.\r\n * @returns Order summary errors.\r\n */\r\n private _getOrderSummaryErrors(cartLines: ICartlinesViewProps[] | null): IOrderSummaryErrors | undefined {\r\n const allErrors =\r\n (cartLines &&\r\n cartLines\r\n .map(cartline => {\r\n // Check if the product is service or not by product type\r\n const isServiceItem = cartline.data?.product?.ItemTypeValue === ReleasedProductType.Service;\r\n\r\n if (!isServiceItem && cartline.error) {\r\n const fullError =\r\n cartline.data && cartline.data.product?.Name\r\n ? `${cartline.data.product.Name}: ${cartline.error}`\r\n : cartline.error;\r\n\r\n return (\r\n
\r\n {fullError}\r\n
\r\n );\r\n }\r\n\r\n return null;\r\n })\r\n .filter((line): line is JSX.Element => !!line)) ||\r\n [];\r\n\r\n return {\r\n Wrapper: {\r\n tag: Alert,\r\n className: 'msc-alert',\r\n isOpen: allErrors.length > 0,\r\n color: 'danger',\r\n assertive: true,\r\n 'aria-label': this.props.resources.outOfStockErrorMessageHeader\r\n },\r\n header: (\r\n \r\n ),\r\n errors: allErrors\r\n };\r\n }\r\n\r\n private _isCheckoutBlockedDueToUnavailableFunds(): boolean {\r\n if (isOboRequest(this.props.context.request)) {\r\n const customerInfo = this.props.data.customerInformation && this.props.data.customerInformation?.result;\r\n return !!customerInfo && (!customerInfo.AllowOnAccountPayment || customerInfo.CreditLimit === 0);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets invoice summary line items.\r\n * @returns Invoice summary lines.\r\n */\r\n private _getInvoiceSummaryLineItems(): IInvoiceSummaryLines | undefined {\r\n const {\r\n data: {\r\n cart: { result: cart }\r\n },\r\n telemetry,\r\n resources\r\n } = this.props;\r\n\r\n return cart?.hasInvoiceLine\r\n ? InvoiceSummary({\r\n orderTotalLabel: resources.totalAmountLabel,\r\n invoiceLabel: resources.invoiceLabel,\r\n cart: cart.cart,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n telemetry,\r\n id: this.props.id\r\n })\r\n : undefined;\r\n }\r\n\r\n /**\r\n * Gets order summary line items.\r\n * @returns Order summary lines.\r\n */\r\n private _getOrderSummaryLineItems(): IOrderSummaryLines | undefined {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n channelDeliveryOptionConfig\r\n },\r\n telemetry,\r\n resources\r\n } = this.props;\r\n\r\n const channelConfiguration = this.props.context && this.props.context.request && this.props.context.request.channel;\r\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\r\n const featureState = this.props?.data?.featureState;\r\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)\r\n ?.IsEnabled;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n const isShowOrHideTaxEnabled = this.props.context.request.app.config?.isEnableShowOrHideSalesTaxECommerceEnabled === true;\r\n\r\n return channelConfiguration && ArrayExtensions.hasElements(cart?.cart.CartLines) && !cart?.hasInvoiceLine\r\n ? OrderSummary({\r\n cart: cart!.cart,\r\n subTotalLabel: resources.itemsWithCountLabel,\r\n shippingLabel: resources.estimatedShippingLabel,\r\n otherChargeLabel: resources.otherCharges,\r\n taxLabel: resources.estimatedTaxLabel,\r\n orderTotalLabel: resources.orderTotal,\r\n totalDiscountsLabel: resources.totalDiscountsLabel,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n toBeCalculatedText: resources.yetToBeCalculatedText,\r\n freeText: resources.priceFree,\r\n channelConfiguration,\r\n retailMultiplePickUpOptionEnabled,\r\n channelDeliveryOptionConfig: channelDeliveryOptionConfig?.result,\r\n telemetry,\r\n isTaxIncludedInPrice: cart!.cart.IsTaxIncludedInPrice,\r\n isShowTaxBreakup: isShowOrHideTaxEnabled\r\n })\r\n : undefined;\r\n }\r\n\r\n /**\r\n * Gets promo code.\r\n * @returns React node with the promo code.\r\n */\r\n private _getPromoCode(): React.ReactNode {\r\n const {\r\n data: {\r\n cart: { result: cart }\r\n },\r\n resources\r\n } = this.props;\r\n\r\n return (\r\n cart && (\r\n \r\n )\r\n );\r\n }\r\n\r\n /**\r\n * Generate add to order template dialog resources.\r\n * @param resources - The resources.\r\n * @returns IAddToOrderTemplateDialogResources.\r\n */\r\n private _generateAddToOrderTemplateDialogResources(resources: ICittaCartResources): IAddToOrderTemplateDialogResources {\r\n return {\r\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\r\n\r\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\r\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\r\n\r\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\r\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\r\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\r\n\r\n selectTemplatesText: resources.selectTemplatesText,\r\n addToTemplateButtonText: resources.addToTemplateButtonText,\r\n lineItemsText: resources.lineItemsText\r\n };\r\n }\r\n\r\n /**\r\n * Generate item added to order template dialog resources.\r\n * @param resources - The resources.\r\n * @returns IItemAddedToOrderTemplateDialogResources.\r\n */\r\n private _generateItemAddedToOrderTemplateDialogResources(resources: ICittaCartResources): IItemAddedToOrderTemplateDialogResources {\r\n return {\r\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\r\n continueShoppingButtonText: resources.continueShoppingButtonText,\r\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\r\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\r\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\r\n freePriceText: resources.freePriceText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText\r\n };\r\n }\r\n\r\n /**\r\n * Generate lines added to order template dialog resources.\r\n * @param resources - The resources.\r\n * @returns ILinesAddedToOrderTemplateDialogResources.\r\n */\r\n private _generateLinesAddedToOrderTemplateDialogResources(resources: ICittaCartResources): ILinesAddedToOrderTemplateDialogResources {\r\n return {\r\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\r\n continueShoppingButtonText: resources.continueShoppingButtonText,\r\n linesAddedToOrderTemplateHeaderItemsOneText: resources.linesAddedToOrderTemplateHeaderItemsOneText,\r\n linesAddedToOrderTemplateHeaderItemsFormatText: resources.linesAddedToOrderTemplateHeaderItemsFormatText,\r\n linesAddedToOrderTemplateHeaderLinesOneText: resources.linesAddedToOrderTemplateHeaderLinesOneText,\r\n linesAddedToOrderTemplateHeaderLinesFormatText: resources.linesAddedToOrderTemplateHeaderLinesFormatText,\r\n linesAddedToOrderTemplateHeaderMessageText: resources.linesAddedToOrderTemplateHeaderMessageText,\r\n linesAddedToOrderTemplateCustomPriceAlertMessageText: resources.linesAddedToOrderTemplateCustomPriceAlertMessageText\r\n };\r\n }\r\n\r\n /**\r\n * Generate duplicate items when adding to order template dialog resources.\r\n * @param resources - The resources.\r\n * @returns IDuplicateItemsWhenAddingToOrderTemplateDialogResources.\r\n */\r\n private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\r\n resources: ICittaCartResources\r\n ): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\r\n return {\r\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\r\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\r\n updateQuantityButtonText: resources.updateQuantityButtonText,\r\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\r\n };\r\n }\r\n\r\n /**\r\n * Generate order template name dialog resources.\r\n * @param resources - The resources.\r\n * @returns IOrderTemplateNameDialogResources.\r\n */\r\n private _generateOrderTemplateNameDialogResources(resources: ICittaCartResources): IOrderTemplateNameDialogResources {\r\n return {\r\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\r\n orderTemplateTitleLabel: resources.orderTemplateTitle,\r\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\r\n orderTemplateDescription: resources.createOrderTemplateDescription,\r\n\r\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\r\n\r\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\r\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\r\n };\r\n }\r\n\r\n /**\r\n * Gets the cart lines view props.\r\n * @returns ICartlinesViewProps [].\r\n */\r\n private _getCartLines(): ICartlinesViewProps[] | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n wishlists: { result: wishlists },\r\n orderTemplates: { result: orderTemplates },\r\n customerInformation: { result: customerInformation }\r\n },\r\n context: {\r\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\r\n },\r\n config,\r\n telemetry,\r\n resources,\r\n modules\r\n } = this.props;\r\n\r\n const imageSettings = this.getImageSettings(config.imageSettings);\r\n\r\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\r\n );\r\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\r\n\r\n const cartlinesErrors: CartLineValidationResultsByLineId = this.state.cartlinesErrors;\r\n let storeSelectorId: string = '';\r\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n storeSelectorId = modules.storeSelector[0].id;\r\n }\r\n\r\n const HSOConfigprop = this.props.data.channelConfiguration.result\r\n && this.props.data.channelConfiguration.result.ExtensionProperties\r\n && this.props.data.channelConfiguration.result!.ExtensionProperties.find((property => property.Key === 'HSOConfig'));\r\n\r\n let HSOConfig = HSOConfigprop && HSOConfigprop.Value && HSOConfigprop.Value.IntegerValue;\r\n if (HSOConfig == undefined) {\r\n HSOConfig = 0;\r\n }\r\n\r\n return ArrayExtensions.hasElements(cart?.cart.CartLines)\r\n ? CartLineItems({\r\n cartlines: cart!.cart.CartLines,\r\n storeSelectorModuleId: storeSelectorId,\r\n cartlinesErrors,\r\n products: this.props.data.products.result,\r\n productAvailabilites: this.props.data.productAvailabilites.result,\r\n productDeliveryOptions: this.props.data.deliveryOptions.result,\r\n catalogs: this.props.data.catalogs?.result,\r\n imageSettings,\r\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\r\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\r\n gridSettings: this.props.context.request.gridSettings!,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n retailMulitplePickupFeatureState: multiplePickUpEnabled,\r\n resources: {\r\n sizeString: \"Size:\" || resources.productDimensionTypeSize,\r\n colorString: resources.productDimensionTypeColor,\r\n configString: resources.productDimensionTypeConfiguration,\r\n styleString: resources.productDimensionTypeStyle,\r\n amountString: resources.productDimensionTypeAmount,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\r\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\r\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\r\n discountStringText: resources.discountStringText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText,\r\n shippingChargesText: resources.shippingCharges,\r\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\r\n priceEditorResources: {\r\n ...resources\r\n }\r\n },\r\n telemetry,\r\n addToWishlistButtonText: resources.addToWishlistButtonText,\r\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\r\n removeButtonText: resources.removeCartButtonText,\r\n shipItText: resources.shipInsteadDisplayText,\r\n pickitUpText: resources.pickItUpDisplayText,\r\n changeStoreText: resources.changeStoreDisplayText,\r\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\r\n outOfStockText: resources.outOfStockErrorMessage,\r\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\r\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\r\n cartState: this.props.data.cart.result,\r\n orgUnitLocations: this.props.data.orgUnitLocations.result,\r\n removeItemClickHandler: this.removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\r\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\r\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\r\n wishlists,\r\n defaultWishlistName: resources.defaultWishlistName,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n includeErrors: config.showOutOfStockErrors,\r\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\r\n telemetryContent: this.telemetryContent,\r\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\r\n\r\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\r\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\r\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\r\n resources\r\n ),\r\n\r\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\r\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\r\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\r\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\r\n orderTemplates,\r\n customerInformation,\r\n productAvailability: this.props.data.productAvailabilites,\r\n hsoConfig: HSOConfig\r\n })\r\n : null;\r\n }\r\n\r\n /**\r\n * Gets the checkout URL.\r\n * @param isAuthenticated - Is authenticated flag.\r\n * @param guestCheckoutUrl - Guest checkout URL.\r\n * @param signInUrl -The sign in URL.\r\n * @returns The checkout URL.\r\n */\r\n private getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\r\n if (isAuthenticated) {\r\n return guestCheckoutUrl;\r\n }\r\n\r\n const isAbsoluteUrl = urlCheck(guestCheckoutUrl);\r\n let returnURL = guestCheckoutUrl;\r\n if (MsDyn365.isBrowser && !isAbsoluteUrl) {\r\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\r\n }\r\n\r\n return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\r\n }\r\n\r\n /**\r\n * Gets the image settings.\r\n * @param imageSettings - Image settings.\r\n * @returns IImageSettings.\r\n */\r\n private readonly getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\r\n return (\r\n imageSettings || {\r\n viewports: {\r\n xs: { q: 'w=80&h=94&m=6', w: 0, h: 0 },\r\n sm: { q: 'w=148&h=174&m=6', w: 0, h: 0 },\r\n lg: { q: 'w=148&h=174&m=6', w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n }\r\n );\r\n };\r\n\r\n /**\r\n * Remove item from citta-cart handler.\r\n * @param cartlineToRemove - The cart line to remove.\r\n */\r\n private readonly removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\r\n if (this.props.data.cart.result) {\r\n const input = {\r\n cartLineIds: [cartlineToRemove.LineId!.toString()]\r\n };\r\n this.props.data.cart.result\r\n .removeCartLines(input)\r\n .then(() => {\r\n this.validateCart().catch(error => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n })\r\n .catch(error => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to Remove Cart Line');\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Move to wish list handler.\r\n * @param result - The wish list action success result.\r\n * @param cartline - The cart line.\r\n */\r\n private readonly moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\r\n if (result.status === 'ADDED' && cartline) {\r\n this.removeItemFromCartHandler(cartline);\r\n }\r\n };\r\n\r\n /**\r\n * Updates the cart line quantity.\r\n * @param cartlineToUpdate - The cart line.\r\n * @param quantity - The quantity.\r\n * @param lineIndex - The line index.\r\n * @returns True if the cart line was updated, false otherwise.\r\n */\r\n private readonly updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number, lineIndex?: number): boolean => {\r\n cartLineQuantityUpdatedAsync(\r\n this.isQuantityLimitsFeatureEnabled,\r\n this.props.data.cart.result,\r\n this.props.telemetry,\r\n this.props.data.products.result,\r\n cartlineToUpdate,\r\n quantity\r\n )\r\n .then((cartActionResult: ICartActionResult | undefined): boolean => {\r\n if (cartActionResult?.status === 'SUCCESS') {\r\n this.validateCart().catch(error => {\r\n this.props.telemetry.warning((error as Error).message);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n\r\n return true;\r\n }\r\n\r\n if (!ObjectExtensions.isNullOrUndefined(cartActionResult)) {\r\n // Show update line error message.\r\n const lineUpdateFailure: LineValidationResult = {\r\n LineId: ObjectExtensions.isNullOrUndefined(cartlineToUpdate.LineId) ? '0' : cartlineToUpdate.LineId,\r\n ValidationFailures: [\r\n {\r\n ErrorContext: ArrayExtensions.hasElements(cartActionResult.validationResults)\r\n ? cartActionResult.validationResults[0].ErrorContext\r\n : '',\r\n LocalizedMessage: cartActionResult.errorDetails?.LocalizedMessage\r\n }\r\n ]\r\n };\r\n\r\n this.setState({\r\n cartlinesErrors: { ValidationResultsPairs: [lineUpdateFailure] }\r\n });\r\n }\r\n\r\n return false;\r\n })\r\n .catch(() => {\r\n return false;\r\n });\r\n\r\n return false;\r\n };\r\n\r\n /**\r\n * Fulfillment store id is updated.\r\n */\r\n private readonly fulfillmentStoreIdUpdated = () => {\r\n if (this.isQuantityLimitsFeatureEnabled) {\r\n // Refresh products (in props.data) based on latest cart.\r\n getActiveCartProductsAction(new ActiveCartProductsInput(), this.props.context.actionContext)\r\n .then(async () => this.validateCart())\r\n .catch((error: Error) => {\r\n this.props.telemetry.warning(error.message);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Validates cart.\r\n * @returns Void promise.\r\n */\r\n private async validateCart(): Promise {\r\n const {\r\n data: { cart },\r\n telemetry,\r\n context\r\n } = this.props;\r\n\r\n const validationResults: CartLineValidationResultsByLineId | undefined = await validateCartAsync(\r\n // this.isQuantityLimitsFeatureEnabled, //version upgrade commented the line as this is not part of validateCartAsync method\r\n cart,\r\n telemetry,\r\n context,\r\n true\r\n );\r\n\r\n const HSOConfigprop = this.props.data.channelConfiguration.result\r\n && this.props.data.channelConfiguration.result.ExtensionProperties\r\n && this.props.data.channelConfiguration.result!.ExtensionProperties.find((property => property.Key === 'HSOConfig'));\r\n\r\n let HSOConfig = HSOConfigprop && HSOConfigprop.Value && HSOConfigprop.Value.IntegerValue;\r\n if (HSOConfig == undefined) {\r\n HSOConfig = 0;\r\n }\r\n if (HSOConfig) {\r\n this.setState({ isCartValid: true });\r\n }\r\n\r\n if (validationResults) {\r\n const isValid = !ArrayExtensions.hasElements(validationResults.ValidationResultsPairs);\r\n this.setState({\r\n cartlinesErrors: validationResults,\r\n isCartValid: isValid\r\n });\r\n } else {\r\n this.setState({ isCartValid: true });\r\n }\r\n\r\n return AsyncResult.resolve();\r\n }\r\n\r\n /**\r\n * Get order quantity limit feature flag.\r\n * @returns True if flag is enabled, false otherwise.\r\n */\r\n private async getOrderQuantityLimitsFeatureFlag(): Promise {\r\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\r\n return false;\r\n }\r\n\r\n try {\r\n const featureStatuses = await this.props.data.featureState;\r\n const isQuantityLimitsFeatureEnabledInHq =\r\n featureStatuses.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\r\n )?.IsEnabled || false;\r\n if (!isQuantityLimitsFeatureEnabledInHq) {\r\n return false;\r\n }\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get feature states');\r\n return false;\r\n }\r\n\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\r\n return true;\r\n }\r\n try {\r\n const customerInfo = await this.props.data.customerInformation;\r\n return (\r\n !!customerInfo &&\r\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\r\n );\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get customer info');\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the cart lines group.\r\n * @returns ICartlinesViewProps [][].\r\n */\r\n private getCartLinesGroup(): ICartlinesViewProps[][] | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n wishlists: { result: wishlists },\r\n orderTemplates: { result: orderTemplates },\r\n customerInformation: { result: customerInformation }\r\n },\r\n context: {\r\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\r\n },\r\n config,\r\n telemetry,\r\n resources,\r\n modules\r\n } = this.props;\r\n\r\n const imageSettings = this.getImageSettings(config.imageSettings);\r\n const cartlinesErrors: CartLineValidationResultsByLineId = this.state.cartlinesErrors;\r\n let storeSelectorId: string = '';\r\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n storeSelectorId = modules.storeSelector[0].id;\r\n }\r\n\r\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\r\n );\r\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\r\n\r\n return this.props.data.products &&\r\n (cart?.hasInvoiceLine || this.props.data.products.result) &&\r\n cart &&\r\n cart.cart.CartLines &&\r\n cart.cart.CartLines.length > 0 &&\r\n this.props.data.channelDeliveryOptionConfig?.result\r\n ? CartLineGroupItems({\r\n cartlines: cart.cart.CartLines,\r\n storeSelectorModuleId: storeSelectorId,\r\n cartlinesErrors,\r\n products: this.props.data.products.result,\r\n productAvailabilites: this.props.data.productAvailabilites.result,\r\n productDeliveryOptions: this.props.data.deliveryOptions.result,\r\n catalogs: this.props.data.catalogs?.result,\r\n imageSettings,\r\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n hasInvoiceLine: cart?.hasInvoiceLine || false,\r\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\r\n gridSettings: this.props.context.request.gridSettings!,\r\n context: this.props.context,\r\n retailMulitplePickupFeatureState: multiplePickUpEnabled,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n resources: {\r\n sizeString: resources.productDimensionTypeSize,\r\n colorString: resources.productDimensionTypeColor,\r\n configString: resources.productDimensionTypeConfiguration,\r\n styleString: resources.productDimensionTypeStyle,\r\n amountString: resources.productDimensionTypeAmount,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\r\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\r\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\r\n discountStringText: resources.discountStringText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText,\r\n shippingChargesText: resources.shippingCharges,\r\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\r\n priceEditorResources: {\r\n ...resources\r\n }\r\n },\r\n telemetry,\r\n addToWishlistButtonText: resources.addToWishlistButtonText,\r\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\r\n removeButtonText: resources.removeCartButtonText,\r\n shipItText: resources.shipInsteadDisplayText,\r\n pickitUpText: resources.pickItUpDisplayText,\r\n changeStoreText: resources.changeStoreDisplayText,\r\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\r\n outOfStockText: resources.outOfStockErrorMessage,\r\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\r\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\r\n cartState: this.props.data.cart.result,\r\n orgUnitLocations: this.props.data.orgUnitLocations.result,\r\n removeItemClickHandler: this.removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\r\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\r\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\r\n wishlists,\r\n defaultWishlistName: resources.defaultWishlistName,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n includeErrors: config.showOutOfStockErrors,\r\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\r\n telemetryContent: this.telemetryContent,\r\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\r\n\r\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\r\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\r\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\r\n resources\r\n ),\r\n\r\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\r\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\r\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\r\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\r\n orderTemplates,\r\n customerInformation,\r\n channelDeliveryOptionConfig: this.props.data.channelDeliveryOptionConfig?.result,\r\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\r\n productAvailability: this.props.data.productAvailabilites,\r\n productPickUpOptions: this.state.productPickUpOptions || this.props.data.cartLinesPickUpOptions?.result\r\n })\r\n : null;\r\n }\r\n}\r\n\r\nexport default Cart;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { CartLine } from '@msdyn365-commerce/retail-proxy';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\n\r\nimport { ArrayExtensions, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\r\n/**\r\n * Cart line inventory validation result interface.\r\n */\r\nexport interface ICartLineInventoryValidationResult {\r\n /**\r\n * Define whether the cart lines inventory is valid across multiple cart lines.\r\n */\r\n readonly isValid: boolean;\r\n\r\n /**\r\n * Defines the list of product id with invalid inventory.\r\n */\r\n readonly productIdWithErrors: number[];\r\n}\r\n\r\n/**\r\n * Validates inventory across cart lines.\r\n * @param cartLines - The cart lines.\r\n * @param productAvailabilities - The product availability collection.\r\n * @param actionContext - The action context.\r\n * @param products - The products.\r\n * @param emailDeliveryModeCode - The emailDeliveryModeCode.\r\n * @returns True if all product quantity are available, false otherwise.\r\n */\r\n// eslint-disable-next-line complexity -- existing code.\r\nexport function validateCartLinesInventory(\r\n cartLines: CartLine[],\r\n productAvailabilities: IProductInventoryInformation[],\r\n actionContext: IActionContext,\r\n products?: SimpleProduct[],\r\n emailDeliveryModeCode?: string | undefined,\r\n hsoConfig?: number\r\n): ICartLineInventoryValidationResult {\r\n const cartLineMap = new Map();\r\n const defaultCartLineQuantity = 1;\r\n if (!actionContext.requestContext.app.config.enableStockCheck) {\r\n return {\r\n isValid: true,\r\n productIdWithErrors: []\r\n };\r\n }\r\n const productIdWithErrors = [];\r\n let isValid = true;\r\n\r\n if (ArrayExtensions.hasElements(cartLines) && ArrayExtensions.hasElements(productAvailabilities)) {\r\n // Consolidate products in different cart lines into single entry with the total cart quantity\r\n for (const cartLine of cartLines) {\r\n // Skip validation if is an invoice inline.\r\n if (cartLine.ProductId && !cartLine.IsInvoiceLine && !cartLine.IsGiftCardLine) {\r\n if (!cartLineMap.has(cartLine.ProductId)) {\r\n cartLineMap.set(cartLine.ProductId, cartLine.Quantity ?? defaultCartLineQuantity);\r\n } else {\r\n const cartLineTotal = cartLineMap.get(cartLine.ProductId) ?? 0;\r\n cartLineMap.delete(cartLine.ProductId);\r\n cartLineMap.set(cartLine.ProductId, cartLineTotal + (cartLine.Quantity ?? defaultCartLineQuantity));\r\n }\r\n }\r\n }\r\n\r\n // Hashing product availability object by product ID.\r\n const productAvailabilityMap = new Map();\r\n for (const productAvailability of productAvailabilities) {\r\n if (\r\n productAvailability.ProductAvailableQuantity.ProductId &&\r\n !productAvailabilityMap.has(productAvailability.ProductAvailableQuantity.ProductId)\r\n ) {\r\n productAvailabilityMap.set(productAvailability.ProductAvailableQuantity.ProductId, productAvailability);\r\n }\r\n }\r\n\r\n // Compare total quantity with the available quantity from the inventory API, also validate that the product is available.\r\n for (const productId of Array.from(cartLineMap.keys())) {\r\n const cartLineQty = cartLineMap.get(productId) ?? defaultCartLineQuantity;\r\n const productAvailability = productAvailabilityMap.get(productId);\r\n const availableQuantity = productAvailability?.ProductAvailableQuantity.AvailableQuantity ?? undefined;\r\n\r\n // If product is non-stocked or cartLine is electronic delivery, then no inventory check\r\n const cartLine = cartLines.find(line => line.ProductId === productId);\r\n const cartLineProduct = products?.find(product => product.RecordId === productId);\r\n let isStockedItem = true;\r\n if (cartLineProduct) {\r\n isStockedItem = !!cartLineProduct.Behavior?.IsStockedProduct;\r\n }\r\n const isEmailDelivery =\r\n cartLine?.DeliveryMode && cartLine.DeliveryMode !== '' ? cartLine.DeliveryMode === emailDeliveryModeCode : false;\r\n let shouldSkipInventoryCheck = !isStockedItem || isEmailDelivery;\r\n\r\n if (hsoConfig) {\r\n const estimatedDateProperty = availableQuantity\r\n && productAvailability?.ProductAvailableQuantity.ExtensionProperties\r\n && productAvailability?.ProductAvailableQuantity.ExtensionProperties.find((property => property.Key === 'EstimatedDate'));\r\n\r\n const estimatedDateValue = estimatedDateProperty && estimatedDateProperty.Value && estimatedDateProperty.Value.StringValue;\r\n\r\n let estimatedDate = \"\";\r\n if (estimatedDateValue == undefined) {\r\n estimatedDate = \"\";\r\n } else {\r\n estimatedDate = estimatedDateValue.toString();\r\n }\r\n\r\n const StockThresholdprop = availableQuantity\r\n && productAvailability?.ProductAvailableQuantity.ExtensionProperties\r\n && productAvailability?.ProductAvailableQuantity.ExtensionProperties.find((property => property.Key === 'StockThreshold'));\r\n const StockThresholdpropval = StockThresholdprop && StockThresholdprop.Value && StockThresholdprop.Value.IntegerValue;\r\n let StockThreshold = 0;\r\n if (StockThresholdpropval != undefined) {\r\n StockThreshold = StockThresholdpropval;\r\n }\r\n\r\n let onhand = 0;\r\n if (availableQuantity != undefined) {\r\n onhand = Number(availableQuantity);\r\n }\r\n\r\n if (StockThreshold == 0) {\r\n shouldSkipInventoryCheck = true;\r\n } else {\r\n if (onhand >= StockThreshold) {\r\n shouldSkipInventoryCheck = true;\r\n } else {\r\n if (estimatedDate != \"\") {\r\n shouldSkipInventoryCheck = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // If product is non-stocked or cartLine is electronic delivery, then no inventory check\r\n if (shouldSkipInventoryCheck) {\r\n continue;\r\n }\r\n if (!productAvailability?.IsProductAvailable || (availableQuantity && cartLineQty > availableQuantity)) {\r\n productIdWithErrors.push(productId);\r\n isValid = false;\r\n }\r\n }\r\n }\r\n return {\r\n isValid,\r\n productIdWithErrors\r\n };\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { INodeProps, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nexport interface ICartLineItemPromotion {\r\n id: string;\r\n showPromotionPopup: boolean;\r\n promotions: CartPromotionLine[] | undefined;\r\n resources: ICartLineItemPromotionResourceString;\r\n onSeeAllClick(event: React.MouseEvent): void;\r\n onCloseButtonClick(): void;\r\n}\r\n\r\nexport interface ICartLineItemViewProps {\r\n promotionMessageWrapper: INodeProps;\r\n promotionMessage: React.ReactNode;\r\n promotionSeeAllLink: React.ReactElement;\r\n promotionDialog: React.ReactNode;\r\n}\r\n\r\nexport interface ICartLineItemPromotionResourceString {\r\n promotionLinkText: string;\r\n promotionStringHeading: string;\r\n promotionPopupHeading: string;\r\n promotionCloseButtonAriaLabel: string;\r\n}\r\n\r\nexport const cartPromotions = (props: ICartLineItemPromotion): ICartLineItemViewProps | undefined => {\r\n const {\r\n id,\r\n showPromotionPopup,\r\n promotions,\r\n resources: { promotionLinkText, promotionPopupHeading },\r\n onCloseButtonClick,\r\n onSeeAllClick\r\n } = props;\r\n\r\n if (!ArrayExtensions.hasElements(promotions)) {\r\n return;\r\n }\r\n\r\n const titleId = `${id}_title`;\r\n const className = 'msc-cart__promotion';\r\n return {\r\n promotionMessageWrapper: {\r\n className: 'msc-cart__promotion'\r\n },\r\n promotionMessage: (\r\n <>\r\n \r\n {props.resources.promotionStringHeading}\r\n \r\n ),\r\n promotionSeeAllLink: (\r\n \r\n {` `}\r\n {promotionLinkText} {` `}\r\n \r\n ),\r\n promotionDialog: (\r\n \r\n \r\n
\r\n {promotionPopupHeading}\r\n
\r\n
\r\n \r\n
    \r\n {promotions.map(_promotion => {\r\n return (\r\n
  • \r\n {_promotion.Promotion?.OfferName} {` `}\r\n
  • \r\n );\r\n })}\r\n
\r\n
\r\n \r\n
\r\n )\r\n };\r\n};\r\n","/* eslint-disable no-duplicate-imports */\r\nimport { getMediaLocationsForSelectedVariant, MediaLocationsForSelectedVariantInput } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { IActionContext, IImageData, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { MediaLocation } from '@msdyn365-commerce/retail-proxy';\r\n\r\nexport async function getValidProductImages(productId: number, channelId: number, actionContext: IActionContext, imageSettings: IImageSettings): Promise {\r\n const actionInput = new MediaLocationsForSelectedVariantInput(\r\n productId,\r\n channelId,\r\n );\r\n\r\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\r\n .then(mediaLocations => {\r\n if (mediaLocations) {\r\n return Promise.all(mediaLocations.map((mediaLocation) => validateMediaLocaionAsync(mediaLocation, imageSettings)))\r\n .then(pairs => {\r\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\r\n });\r\n }\r\n\r\n return [];\r\n }).catch(error => {\r\n actionContext.telemetry.exception(error);\r\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\r\n return [];\r\n });\r\n}\r\n\r\nexport async function validateProductImages(mediaLocations: MediaLocation[], actionContext: IActionContext, imageSettings: IImageSettings): Promise {\r\n return Promise.all(mediaLocations.map((mediaLocation) => validateMediaLocaionAsync(mediaLocation, imageSettings)))\r\n .then(pairs => {\r\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\r\n }).catch(error => {\r\n actionContext.telemetry.exception(error);\r\n actionContext.telemetry.debug('Unable to validate prodcut images');\r\n return [];\r\n });\r\n}\r\n\r\nasync function validateMediaLocaionAsync(mediaLocation: MediaLocation, imageSettings: IImageSettings): Promise<[IImageData, boolean]> {\r\n const imageData = {\r\n src: mediaLocation.Uri || '',\r\n altText: mediaLocation.AltText || ''\r\n };\r\n\r\n const imageSettingsVal = ((imageSettings.viewports?.lg!.q!).replace(/['\"]+/g, ''));\r\n\r\n if (imageData.src === '') {\r\n return [imageData, false];\r\n }\r\n\r\n const imageConcatVal = `${imageData.src}` + `&` + `${imageSettingsVal}`;\r\n\r\n return new Promise<[IImageData, boolean]>((resolve) => {\r\n try {\r\n const http = new XMLHttpRequest();\r\n http.open('HEAD', imageConcatVal, true);\r\n\r\n http.onload = () => {\r\n resolve([imageData, http.status === 200 || http.status === 201]);\r\n };\r\n\r\n http.onerror = () => {\r\n resolve([imageData, false]);\r\n };\r\n\r\n http.send();\r\n } catch (e) {\r\n resolve([imageData, false]);\r\n }\r\n });\r\n}\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n/* eslint-disable no-duplicate-imports */\r\nimport classnames from 'classnames';\r\nimport { reaction } from 'mobx';\r\nimport * as React from 'react';\r\n\r\nimport { Carousel, ICarouselProps } from '@msdyn365-commerce/components';\r\n\r\nimport {\r\n IComponentNodeProps,\r\n ImagefullView,\r\n IModalViewProps,\r\n IModuleProps,\r\n inlineZoomImageOnHover,\r\n inlineZoomImageOnMouseMove,\r\n inlineZoomImageOnMouseOut,\r\n inlineZoomInit,\r\n INodeProps,\r\n ISingleSlideCarouselProps,\r\n KeyCodes,\r\n NodeTag,\r\n onContainerZoomInit,\r\n onMouseMoveLensContainer,\r\n onMouseOutLensContainer,\r\n onMouseOverImageContainer,\r\n removeInlineZoomStyle,\r\n SingleSlideCarousel\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n//@ts-ignore\r\nimport { imageSource, imageZoom, ICittaMediaGalleryData, ICittaMediaGalleryProps, thumbnailsOrientation } from '@msdyn365-commerce-modules/media-gallery';\r\nimport { getValidProductImages, validateProductImages } from './utils';\r\n\r\nexport interface IMediaGalleryState {\r\n animating: boolean;\r\n activeIndex: number;\r\n mediaGalleryItems: IImageData[] | undefined;\r\n isImageZoomed: boolean;\r\n modalIsOpen: boolean;\r\n lastUpdate?: number;\r\n}\r\n\r\nexport interface IMediaGalleryThumbnailsViewProps {\r\n ThumbnailsContainerProps: INodeProps;\r\n SingleSlideCarouselComponentProps: INodeProps;\r\n items?: IMediaGalleryThumbnailItemViewProps[];\r\n}\r\n\r\nexport interface IMediaGalleryThumbnailItemViewProps {\r\n ThumbnailItemContainerProps: INodeProps;\r\n Picture: React.ReactElement;\r\n}\r\n\r\nexport interface IMediaGalleryViewProps extends ICittaMediaGalleryProps {\r\n state: IMediaGalleryState;\r\n MediaGallery: IModuleProps;\r\n CarouselProps: INodeProps;\r\n Thumbnails: IMediaGalleryThumbnailsViewProps;\r\n Modal?:React.ReactElement|null;\r\n}\r\n\r\n/**\r\n * Media gallery component\r\n */\r\nclass MediaGallery extends React.Component, IMediaGalleryState> {\r\n private _inlineZoomDivRef: Map = new Map();\r\n private readonly defaultGalleryImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\r\n sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\r\n md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\r\n lg: { q: 'h=772&m=8', w: 0, h: 0 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n };\r\n\r\n private readonly defaultThumbnailImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=100&m=8', w: 100, h: 0 },\r\n lg: { q: 'w=100&m=8', w: 100, h: 0 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n };\r\n\r\n constructor(props: ICittaMediaGalleryProps) {\r\n super(props);\r\n this._toggleModal = this._toggleModal.bind(this);\r\n this.state = { activeIndex: 0, animating: false, mediaGalleryItems: undefined, isImageZoomed: false, modalIsOpen:false };\r\n\r\n this._onImageMouseOut = this._onImageMouseOut.bind(this);\r\n this._inlineZoomImageOnHover = this._inlineZoomImageOnHover.bind(this);\r\n this._onInlineImageClick = this._onInlineImageClick.bind(this);\r\n this._onContainerZoomImageClick = this._onContainerZoomImageClick.bind(this);\r\n this._onMouseOutLensContainer = this._onMouseOutLensContainer.bind(this);\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n const source = this.props.config.imageSource || imageSource.pageContext;\r\n const curatedImage = this.props.config.images || [];\r\n\r\n if (source === imageSource.pageContext) {\r\n reaction(\r\n () => (this.props.data.product.result ? this.props.data.product.result.RecordId : null),\r\n async () => {\r\n if (this.props.data.product.result) {\r\n const images = await getValidProductImages(\r\n this.props.data.product.result.RecordId,\r\n +this.props.context.request.apiSettings.channelId,\r\n this.props.context.actionContext,\r\n this.props.config.thumbnailImageSettings || this.defaultThumbnailImageSettings\r\n );\r\n this.setState({\r\n mediaGalleryItems: [...images, ...curatedImage],\r\n activeIndex: 0,\r\n lastUpdate: Date.now()\r\n });\r\n } else {\r\n this.setState({\r\n mediaGalleryItems: [...curatedImage],\r\n activeIndex: 0,\r\n lastUpdate: Date.now()\r\n });\r\n }\r\n }\r\n );\r\n }\r\n\r\n if (source === imageSource.productId && this.props.data.mediaLocations.result) {\r\n const images = await validateProductImages(\r\n this.props.data.mediaLocations.result,\r\n this.props.context.actionContext,\r\n this.props.config.thumbnailImageSettings || this.defaultThumbnailImageSettings\r\n );\r\n this.setState({\r\n mediaGalleryItems: [...images, ...curatedImage],\r\n activeIndex: 0,\r\n lastUpdate: Date.now()\r\n });\r\n } else if (source === imageSource.pageContext && this.props.data.product.result) {\r\n const images = await getValidProductImages(\r\n this.props.data.product.result.RecordId,\r\n +this.props.context.request.apiSettings.channelId,\r\n this.props.context.actionContext,\r\n this.props.config.thumbnailImageSettings || this.defaultThumbnailImageSettings\r\n );\r\n\r\n this.setState({\r\n mediaGalleryItems: [...images, ...curatedImage],\r\n activeIndex: 0,\r\n lastUpdate: Date.now()\r\n });\r\n } else {\r\n this.setState({\r\n mediaGalleryItems: [...curatedImage],\r\n activeIndex: 0,\r\n lastUpdate: Date.now()\r\n });\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {\r\n id,\r\n config,\r\n resources\r\n } = this.props;\r\n\r\n const mediaGalleryItems = this.state.mediaGalleryItems;\r\n const { className, showPaginationTooltip } = config;\r\n const galleryImageSettings = config.galleryImageSettings;\r\n if(galleryImageSettings) {\r\n galleryImageSettings.cropFocalRegion = true;\r\n }\r\n const thumbnailImageSettings = config.thumbnailImageSettings;\r\n if(thumbnailImageSettings) {\r\n thumbnailImageSettings.cropFocalRegion = true;\r\n }\r\n\r\n const isVertical: boolean = config.thumbnailsOrientation === thumbnailsOrientation.vertical;\r\n const allowFullscreen:boolean = config.allowFullScreen || false;\r\n const zoomViewMode: string =\r\n config.imageZoom === imageZoom.inline\r\n ? imageZoom.inline\r\n : config.imageZoom === imageZoom.container\r\n ? imageZoom.container\r\n : '';\r\n const zoomView = allowFullscreen ? 'fullscreen': zoomViewMode;\r\n\r\n const viewProps: IMediaGalleryViewProps = {\r\n ...(this.props as ICittaMediaGalleryProps),\r\n state: this.state,\r\n MediaGallery: {\r\n moduleProps: this.props,\r\n className: classnames(`ms-media-gallery ${isVertical ? 'vertical' : ''}`, className)\r\n },\r\n Modal: allowFullscreen ? this.imageModalSlider(zoomViewMode): null,\r\n CarouselProps: {\r\n tag: Carousel,\r\n className: 'ms-media-gallery__carousel',\r\n items:\r\n mediaGalleryItems &&\r\n mediaGalleryItems.map((item: IImageData, index: number) => this._renderCarouselItemImageView(zoomView, item, galleryImageSettings || this.defaultGalleryImageSettings, index)),\r\n activeIndex: this.state.activeIndex,\r\n next: this.next,\r\n previous: this.previous,\r\n interval: false,\r\n directionTextPrev: resources.previousScreenshotFlipperText,\r\n directionTextNext: resources.nextScreenshotFlipperText,\r\n onIndicatorsClickHandler: this.goToIndex,\r\n showPaginationTooltip: showPaginationTooltip === true,\r\n handleOnExited: this.onExited,\r\n handleOnExiting: this.onExiting,\r\n key: this.state.lastUpdate\r\n } as IComponentNodeProps,\r\n Thumbnails: {\r\n ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\r\n SingleSlideCarouselComponentProps: {\r\n tag: SingleSlideCarousel,\r\n className: 'ms-media-gallery__thumbnails',\r\n vertical: isVertical,\r\n flipperPrevLabel: resources.previousScreenshotFlipperText,\r\n flipperNextLabel: resources.nextScreenshotFlipperText,\r\n parentId: id,\r\n useTabList: true,\r\n key: this.state.lastUpdate\r\n } as IComponentNodeProps,\r\n items:\r\n mediaGalleryItems &&\r\n mediaGalleryItems.map((item: IImageData, index: number) => this._getThumbnailItem(item, thumbnailImageSettings || this.defaultThumbnailImageSettings, index, this.state.activeIndex))\r\n }\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n private onExiting = () => {\r\n this.setState({ animating: true });\r\n };\r\n\r\n private onExited = () => {\r\n this.setState({ animating: false });\r\n };\r\n\r\n private next = (): void => {\r\n if (this.isLastItem() === undefined) {\r\n return;\r\n }\r\n\r\n const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex + 1;\r\n this.goToIndex(nextIndex);\r\n };\r\n\r\n private previous = (): void => {\r\n const nextIndex = this.isFirstItem()\r\n ? this.state.mediaGalleryItems\r\n ? this.state.mediaGalleryItems.length - 1\r\n : 0\r\n : this.state.activeIndex - 1;\r\n this.goToIndex(nextIndex);\r\n };\r\n\r\n private goToIndex = (index: number): void => {\r\n this.setState({ activeIndex: index });\r\n };\r\n\r\n private _renderCarouselItemImageView(zoomView: string, image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\r\n if (zoomView === 'container') {\r\n return this._renderImageInContainerOnZoom(image, imageSettings, index);\r\n } else if (zoomView === 'inline') {\r\n return this._renderImageInlineOnZoom(image, imageSettings, index);\r\n } else if (zoomView === 'fullscreen') {\r\n return this._renderImageFullScreenOnZoom(image, imageSettings, index);\r\n } else {\r\n return {this._getCarouselItem(image, imageSettings, index)};\r\n }\r\n }\r\n\r\n private _getCarouselItem = (image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode => (\r\n \r\n );\r\n\r\n private _getThumbnailItem = (image: IImageData, imageSettings: IImageSettings, index: number, modifiedActiveIndex: number): IMediaGalleryThumbnailItemViewProps => {\r\n const classes = classnames(\r\n 'ms-media-gallery__thumbnail-item',\r\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\r\n );\r\n\r\n return {\r\n ThumbnailItemContainerProps: {\r\n tag: 'li' as NodeTag,\r\n className: classes,\r\n role: 'tab',\r\n tabIndex: 0,\r\n key: index,\r\n 'aria-label': image.altText,\r\n 'aria-selected': modifiedActiveIndex === index,\r\n 'aria-controls': `${this.props.id}__carousel-item__${index}`,\r\n onClick: this._generateOnThumbnailClick(index),\r\n onKeyDown: this._generateOnThumbnailKeyDown(index)\r\n },\r\n Picture: (\r\n \r\n )\r\n };\r\n };\r\n\r\n private _generateOnThumbnailKeyDown = (index: number) => {\r\n return (event: React.KeyboardEvent) => {\r\n if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\r\n event.preventDefault();\r\n\r\n this.goToIndex(index);\r\n }\r\n };\r\n };\r\n\r\n private _generateOnThumbnailClick = (index: number) => {\r\n return (event: React.MouseEvent) => {\r\n event.preventDefault();\r\n\r\n this.goToIndex(index);\r\n };\r\n };\r\n\r\n private _renderImageInlineOnZoom(image: IImageData, imageSettings:IImageSettings, index: number): React.ReactNode {\r\n return (\r\n // tslint:disable-next-line: react-this-binding-issue\r\n
this._inlineZoomDivRef.set(index, divRef!)} data-scale={this.props.config.dataScale}>\r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n private _inlineZoomImageOnHover(event: React.MouseEvent): void {\r\n inlineZoomImageOnHover(event, this.props.config.dataScale);\r\n }\r\n\r\n private _onInlineImageClick(event: React.MouseEvent): void {\r\n if (window.innerWidth <= 768) { // $msv-breakpoint-m\r\n return;\r\n }\r\n\r\n inlineZoomInit(event, this.props.config.dataScale);\r\n this.setState({\r\n isImageZoomed: true\r\n });\r\n }\r\n\r\n private _onImageMouseOut(event: React.MouseEvent): void {\r\n inlineZoomImageOnMouseOut(event);\r\n this.setState({\r\n isImageZoomed: false\r\n });\r\n\r\n }\r\n\r\n private _onContainerZoomImageClick(event: React.MouseEvent): void {\r\n if (window.innerWidth <= 768) { // $msv-breakpoint-m\r\n return;\r\n }\r\n\r\n onContainerZoomInit(event);\r\n\r\n this.setState({\r\n isImageZoomed: true\r\n });\r\n }\r\n\r\n private _onMouseOutLensContainer(event: React.MouseEvent): void {\r\n onMouseOutLensContainer(event);\r\n\r\n this.setState({\r\n isImageZoomed: false\r\n });\r\n }\r\n\r\n private _renderImageInContainerOnZoom(image: IImageData, imageSettings:IImageSettings, index: number): React.ReactNode {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n );\r\n }\r\n\r\n private _renderImageFullScreenOnZoom(image: IImageData, imageSettings:IImageSettings, index: number): React.ReactNode {\r\n return (\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n private _mapProductToImageData(product: SimpleProduct): IImageData {\r\n return {\r\n src: product.PrimaryImageUrl || ''\r\n };\r\n }\r\n\r\n private isFirstItem = () => this.state.activeIndex === 0;\r\n\r\n private isLastItem = () => this.state.mediaGalleryItems && this.state.activeIndex === this.state.mediaGalleryItems.length - 1;\r\n\r\n private openModalDialog = (): void => {\r\n this._toggleModal();\r\n }\r\n\r\n private _toggleModal(): void {\r\n if (this.state.modalIsOpen) {\r\n const parentDiv = this._inlineZoomDivRef.get(this.state.activeIndex);\r\n if (parentDiv && parentDiv.children && parentDiv.children.length >= 2) {\r\n const image = parentDiv.children[1].querySelector('img');\r\n if (image) {\r\n image.removeAttribute('style');\r\n }\r\n }\r\n this.setState({\r\n isImageZoomed: false\r\n });\r\n }\r\n this.setState({\r\n isImageZoomed: false,\r\n modalIsOpen: !this.state.modalIsOpen\r\n });\r\n removeInlineZoomStyle();\r\n }\r\n\r\n private imageModalSlider=(ZoomView:string):React.ReactElement => {\r\n const {\r\n data: {\r\n product: { result: product }\r\n },\r\n resources,\r\n config\r\n } = this.props;\r\n let mediaGalleryItems = this.state.mediaGalleryItems;\r\n\r\n if (!mediaGalleryItems && product) {\r\n mediaGalleryItems = [this._mapProductToImageData(product)];\r\n }\r\n\r\n const galleryImageSettings = config.galleryImageSettings;\r\n if(galleryImageSettings) {\r\n galleryImageSettings.cropFocalRegion = true;\r\n }\r\n\r\n const carouselprops = {\r\n tag: Carousel,\r\n className: 'ms-media-gallery__carousel',\r\n items:\r\n mediaGalleryItems &&\r\n mediaGalleryItems.map((item: IImageData, index: number) => this._renderCarouselItemImageView(ZoomView, item, galleryImageSettings || this.defaultGalleryImageSettings, index)),\r\n activeIndex: this.state.activeIndex,\r\n next: this.next,\r\n previous: this.previous,\r\n interval: false,\r\n directionTextPrev: resources.previousScreenshotFlipperText,\r\n directionTextNext: resources.nextScreenshotFlipperText,\r\n onIndicatorsClickHandler: this.goToIndex,\r\n showPaginationTooltip: true,\r\n hideIndicator: true,\r\n handleOnExited: this.onExited,\r\n handleOnExiting: this.onExiting,\r\n } as IComponentNodeProps;\r\n\r\n const carousel = ;\r\n\r\n const imageModalSliderProps:IModalViewProps = {\r\n modalIsOpen:this.state.modalIsOpen,\r\n ontoggle:this._toggleModal,\r\n galleryCarousel: carousel\r\n };\r\n return ImagefullView(imageModalSliderProps) as React.ReactElement;\r\n }\r\n}\r\n\r\nexport default MediaGallery;\r\n","/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * ISuperMediaGallery contentModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\n\r\nexport const enum imageSource {\r\n pageContext = 'pageContext',\r\n productId = 'productId'\r\n}\r\n\r\nexport const enum imageZoom {\r\n inline = 'inline',\r\n container = 'container'\r\n}\r\n\r\nexport const enum thumbnailsOrientation {\r\n vertical = 'vertical',\r\n horizontal = 'horizontal'\r\n}\r\n\r\nexport const enum altTextSource {\r\n product = 'product',\r\n cms = 'cms'\r\n}\r\n\r\nexport interface ISuperMediaGalleryConfig extends Msdyn365.IModuleConfig {\r\n imageSource?: imageSource;\r\n images?: Msdyn365.IImageData[];\r\n productId?: string;\r\n imageZoom?: imageZoom;\r\n allowFullScreen?: boolean;\r\n dataScale?: string;\r\n zoomedImageSettings?: Msdyn365.IImageSettings;\r\n thumbnailsOrientation?: thumbnailsOrientation;\r\n thumbnailImageSettings?: Msdyn365.IImageSettings;\r\n galleryImageSettings?: Msdyn365.IImageSettings;\r\n shouldHideMasterProductImagesForVariant?: boolean;\r\n altTextSource?: altTextSource;\r\n showPaginationTooltip?: boolean;\r\n shouldUpdateOnPartialDimensionSelection?: boolean;\r\n className?: string;\r\n skipImageValidation?: boolean;\r\n autoplay?: boolean;\r\n mute?: boolean;\r\n playPauseTrigger?: boolean;\r\n controls?: boolean;\r\n clientRender?: boolean;\r\n}\r\n\r\nexport interface ISuperMediaGalleryResources {\r\n nextScreenshotFlipperText: string;\r\n previousScreenshotFlipperText: string;\r\n fullScreenTitleText: string;\r\n ariaLabelForSlide: string;\r\n playLabel: string;\r\n pauseLabel: string;\r\n pausedLabel: string;\r\n playingLabel: string;\r\n unMuteLabel: string;\r\n muteLabel: string;\r\n fullScreenLabel: string;\r\n exitFullScreenLabel: string;\r\n seekBarLabel: string;\r\n videoTimeDurationLabel: string;\r\n closedCaptionLabel: string;\r\n optionButtonLabel: string;\r\n sliderThumbLabel: string;\r\n volumeThumbLabel: string;\r\n playVideoTitleText: string;\r\n}\r\n\r\nexport interface ISuperMediaGalleryProps extends Msdyn365.IModule {\r\n resources: ISuperMediaGalleryResources;\r\n config: ISuperMediaGalleryConfig;\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IImageData, IRequestContext, IVideoData } from '@msdyn365-commerce/core';\r\n\r\nexport enum MediaType {\r\n /**\r\n * The None.\r\n */\r\n None = 0,\r\n /**\r\n * The Image type.\r\n */\r\n Image = 1,\r\n /**\r\n * The video type.\r\n */\r\n Video = 2,\r\n /**\r\n * The file type.\r\n */\r\n File = 3\r\n}\r\n\r\nexport interface IMediaData extends IImageData {\r\n mediaTypeValue?: MediaType;\r\n displayOrder?: number;\r\n videoData?: IVideoData;\r\n}\r\n\r\n/**\r\n * Gets correct alt text for image based on configuration of site.\r\n * @param productName Product name.\r\n * @param context Current request context.\r\n * @param imageAltText Alt-text from CMS image.\r\n */\r\nexport function getAltText(\r\n context: IRequestContext,\r\n shouldUseCmsAltText: boolean,\r\n productName?: string,\r\n imageAltText?: string\r\n): string | undefined {\r\n if (!context?.app?.config?.OmniChannelMedia) {\r\n return productName;\r\n }\r\n if (shouldUseCmsAltText) {\r\n return imageAltText;\r\n }\r\n return productName;\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport {\r\n commerceApiRequest,\r\n commerceVideoMetadataRequest,\r\n getCatalogId,\r\n IActionContext,\r\n IImageData,\r\n IImageSettings,\r\n IVideoData\r\n} from '@msdyn365-commerce/core';\r\nimport { MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n getMediaLocationsForSelectedVariant,\r\n MediaLocationsForSelectedVariantInput\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getAltText } from './helper';\r\n\r\nasync function validateMediaLocationAsync(mediaLocation: MediaLocation): Promise<[IImageData, boolean]> {\r\n const imageData: IImageData = {\r\n src: mediaLocation.Uri || '',\r\n altText: mediaLocation.AltText || ''\r\n };\r\n if (mediaLocation.IsApplicableForChildEntities) {\r\n imageData.additionalProperties = { isApplicableForChildEntities: 'true' };\r\n }\r\n\r\n if (imageData.src === '') {\r\n return [imageData, false];\r\n }\r\n\r\n return new Promise<[IImageData, boolean]>(resolve => {\r\n try {\r\n const http = new XMLHttpRequest();\r\n http.open('HEAD', imageData.src!, true);\r\n\r\n http.addEventListener('load', () => {\r\n resolve([imageData, http.status === 200 || http.status === 201]);\r\n });\r\n\r\n http.addEventListener('error', () => {\r\n resolve([imageData, false]);\r\n });\r\n\r\n http.send();\r\n } catch {\r\n resolve([imageData, false]);\r\n }\r\n });\r\n}\r\n\r\nexport async function getValidProductImages(\r\n productId: number,\r\n channelId: number,\r\n actionContext: IActionContext,\r\n imageSettings: IImageSettings,\r\n selectedProduct?: SimpleProduct\r\n): Promise {\r\n const catalogId = getCatalogId(actionContext.requestContext);\r\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\r\n\r\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\r\n .then(mediaLocations => {\r\n if (mediaLocations) {\r\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation))).then(pairs => {\r\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\r\n });\r\n }\r\n\r\n return [];\r\n })\r\n .catch(error => {\r\n actionContext.telemetry.exception(error);\r\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\r\n return [];\r\n });\r\n}\r\n\r\n/**\r\n * Gets product variant images on dimension change of buy-box module for Omni scenario.\r\n * @param productId Product record id.\r\n * @param shouldUseCmsAltText Alt-text source to use.\r\n * @param channelId Current channel id.\r\n * @param actionContext Current action context.\r\n * @param productName Product name.\r\n * @param selectedProduct Currently selected variant product.\r\n * @returns List of images.\r\n */\r\n\r\nexport async function getProductImages(\r\n productId: number,\r\n shouldUseCmsAltText: boolean,\r\n channelId: number,\r\n actionContext: IActionContext,\r\n productName?: string,\r\n selectedProduct?: SimpleProduct\r\n): Promise {\r\n const catalogId = getCatalogId(actionContext.requestContext);\r\n if (actionContext.requestContext?.params?.isPreview) {\r\n const response = await commerceApiRequest(actionContext.requestContext, 'msdyn365-ochannel-product-info', 'post', {\r\n productId: productId,\r\n channelId: channelId,\r\n catalogId: catalogId\r\n });\r\n if (response.status !== 200) {\r\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant for preview scenario');\r\n return [];\r\n }\r\n const previewImageData = response?.data as MediaLocation[];\r\n if (previewImageData) {\r\n return previewImageData.map(mediaLocation => {\r\n return {\r\n src: mediaLocation.Uri ?? '',\r\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\r\n displayOrder: mediaLocation.DisplayOrder,\r\n mediaTypeValue: mediaLocation.MediaTypeValue,\r\n additionalProperties: mediaLocation.IsApplicableForChildEntities\r\n ? {\r\n isApplicableForChildEntities: 'true'\r\n }\r\n : undefined\r\n };\r\n });\r\n }\r\n return [];\r\n }\r\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\r\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\r\n .then(mediaLocations => {\r\n if (mediaLocations) {\r\n return mediaLocations.map(mediaLocation => {\r\n return {\r\n src: mediaLocation.Uri ?? '',\r\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\r\n displayOrder: mediaLocation.DisplayOrder,\r\n mediaTypeValue: mediaLocation.MediaTypeValue,\r\n additionalProperties: mediaLocation.IsApplicableForChildEntities\r\n ? {\r\n isApplicableForChildEntities: 'true'\r\n }\r\n : undefined\r\n };\r\n });\r\n }\r\n return [];\r\n })\r\n .catch(error => {\r\n actionContext.telemetry.exception(error);\r\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\r\n return [];\r\n });\r\n}\r\n\r\nexport async function validateProductImages(\r\n mediaLocations: MediaLocation[],\r\n actionContext: IActionContext,\r\n imageSettings: IImageSettings\r\n): Promise {\r\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation)))\r\n .then(pairs => {\r\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\r\n })\r\n .catch(error => {\r\n actionContext.telemetry.exception(error);\r\n actionContext.telemetry.debug('Unable to validate product images');\r\n return [];\r\n });\r\n}\r\n\r\n/**\r\n * GetVideoMetadataFromAPI - Makes API call to get video metadata.\r\n * @param videoId: Video Id\r\n * @param actionContext: Action context\r\n * @returns: Returns the meta data of the video.\r\n */\r\nexport async function getVideoMetadataFromApi(videoId: string, actionContext: IActionContext): Promise {\r\n let videoPlayerData: IVideoData | undefined;\r\n if (videoId) {\r\n const response = await commerceVideoMetadataRequest(actionContext.requestContext, [videoId]);\r\n\r\n if (response.status !== 200) {\r\n actionContext.telemetry.debug(`Unable to get video metadata for videoId: ${videoId}`);\r\n return;\r\n }\r\n\r\n const videoData = response.data as [];\r\n if (videoData && ArrayExtensions.hasElements(videoData)) {\r\n videoPlayerData = videoData[0];\r\n }\r\n }\r\n return videoPlayerData;\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n/* eslint-disable no-duplicate-imports */\r\nimport { Carousel, ICarouselProps, Player, IPlayerData, IPlayerOptions, IVideoMetadata } from '@msdyn365-commerce/components';\r\nimport { IImageData, IImageSettings, Image, Video } from '@msdyn365-commerce/core';\r\nimport { MediaLocation, MediaType, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions, getFallbackImageUrl, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n defaultDataScale,\r\n IComponentNodeProps,\r\n ImagefullView,\r\n IModalViewProps,\r\n IModuleProps,\r\n inlineZoomImageOnHover,\r\n inlineZoomImageOnMouseMove,\r\n inlineZoomImageOnMouseOut,\r\n inlineZoomInitClick,\r\n INodeProps,\r\n ISingleSlideCarouselProps,\r\n isMobile,\r\n KeyCodes,\r\n NodeTag,\r\n onContainerZoomInit,\r\n onMouseMoveLensContainer,\r\n onMouseOutLensContainer,\r\n onMouseOverImageContainer,\r\n removeContainerZoomStyle,\r\n removeInlineZoomStyle,\r\n SingleSlideCarousel,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { reaction } from 'mobx';\r\nimport * as React from 'react';\r\n\r\nimport { ISuperMediaGalleryData } from './super-media-gallery.data';\r\nimport { imageSource, imageZoom, ISuperMediaGalleryProps, thumbnailsOrientation } from './super-media-gallery.props.autogenerated';\r\nimport { getProductImages, getValidProductImages, getVideoMetadataFromApi, validateProductImages } from './utils';\r\nimport { getAltText, IMediaData } from './utils/helper';\r\n\r\n/**\r\n * IMediaGalleryState Interface.\r\n */\r\nexport interface IMediaGalleryState {\r\n animating: boolean;\r\n activeIndex: number;\r\n isImageZoomed: boolean;\r\n modalIsOpen: boolean;\r\n lastUpdate?: number;\r\n isMobileImageZoomed?: boolean;\r\n mediaGalleryItems?: IMediaData[];\r\n isInitialLoad?: boolean;\r\n shouldUseOptimizedImage?: boolean;\r\n}\r\n\r\n/**\r\n * IMediaGalleryThumbnailsViewProps Interface.\r\n */\r\nexport interface IMediaGalleryThumbnailsViewProps {\r\n ThumbnailsContainerProps: INodeProps;\r\n SingleSlideCarouselComponentProps: INodeProps;\r\n items?: IMediaGalleryThumbnailItemViewProps[];\r\n}\r\n\r\n/**\r\n * IMediaGalleryThumbnailItemViewProps Interface.\r\n */\r\nexport interface IMediaGalleryThumbnailItemViewProps {\r\n ThumbnailItemContainerProps: INodeProps;\r\n Picture: React.ReactElement;\r\n}\r\n\r\n/**\r\n * IMediaGalleryViewProps Interface.\r\n */\r\nexport interface IMediaGalleryViewProps extends ISuperMediaGalleryProps {\r\n state: IMediaGalleryState;\r\n MediaGallery: IModuleProps;\r\n CarouselProps: INodeProps;\r\n Thumbnails: IMediaGalleryThumbnailsViewProps;\r\n Modal?: React.ReactElement | null;\r\n callbackToggle?(): void;\r\n callbackThumbnailClick?(index: number): void;\r\n callbackThumbnailKeyDown?(index: number): void;\r\n}\r\n\r\n/**\r\n * Props for carousel.\r\n */\r\ninterface IMediaGalleryCarouselItems {\r\n items: ItemType[];\r\n keys: (string | undefined)[];\r\n}\r\n\r\n/**\r\n * Media gallery component.\r\n */\r\nclass MediaGallery extends React.Component, IMediaGalleryState> {\r\n private readonly _inlineZoomDivRef: Map = new Map();\r\n\r\n private readonly fullScreenOverlayButtonRef: React.RefObject = React.createRef();\r\n private readonly player: React.RefObject = React.createRef();\r\n\r\n private mediaGalleryImages: IImageData[] = [];\r\n\r\n private fallbackImage?: string;\r\n\r\n private readonly defaultGalleryImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\r\n sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\r\n md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\r\n lg: { q: 'h=772&m=8', w: 0, h: 0 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n };\r\n\r\n private readonly defaultThumbnailImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=100&m=8', w: 100, h: 0 },\r\n lg: { q: 'w=100&m=8', w: 100, h: 0 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n };\r\n\r\n private readonly _zoomedImageSettings: IImageSettings;\r\n\r\n public constructor(props: ISuperMediaGalleryProps) {\r\n super(props);\r\n this._toggleModal = this._toggleModal.bind(this);\r\n this.state = {\r\n activeIndex: 0,\r\n animating: false,\r\n isImageZoomed: false,\r\n modalIsOpen: false,\r\n isInitialLoad: true,\r\n shouldUseOptimizedImage: !!this.props.config.skipImageValidation,\r\n };\r\n\r\n this._zoomedImageSettings =\r\n props.config.zoomedImageSettings ?? props.config.galleryImageSettings ?? this.defaultGalleryImageSettings;\r\n\r\n this._onImageMouseOut = this._onImageMouseOut.bind(this);\r\n this._inlineZoomImageOnHover = this._inlineZoomImageOnHover.bind(this);\r\n this._onInlineImageClick = this._onInlineImageClick.bind(this);\r\n this._onContainerZoomImageClick = this._onContainerZoomImageClick.bind(this);\r\n this._onMouseOutLensContainer = this._onMouseOutLensContainer.bind(this);\r\n }\r\n\r\n public isMobile(): boolean {\r\n const size = isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\r\n return size === 'xs';\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n const source = this.props.config.imageSource ?? imageSource.pageContext;\r\n const shouldUpdateOnPartialDimensionSelection = this.props.config.shouldUpdateOnPartialDimensionSelection;\r\n this._setRenderType();\r\n if (!this.props.context.request.app?.config?.OmniChannelMedia) {\r\n if (source === imageSource.pageContext) {\r\n if (this.state.mediaGalleryItems === undefined && this.props.data.mediaLocationsForSelectedVariant.result) {\r\n const images = await validateProductImages(\r\n this.props.data.mediaLocationsForSelectedVariant.result,\r\n this.props.context.actionContext,\r\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\r\n );\r\n await this._setImages(images);\r\n } else if (this.state.mediaGalleryItems === undefined && this.props.data.product.result) {\r\n const product = this.props.data.product.result;\r\n const images = await getValidProductImages(\r\n product.RecordId,\r\n +this.props.context.request.apiSettings.channelId,\r\n this.props.context.actionContext,\r\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\r\n product.productVariant\r\n );\r\n\r\n await this._setImages(images);\r\n } else {\r\n await this._setImages([]);\r\n }\r\n }\r\n }\r\n\r\n reaction(\r\n () => {\r\n const product = this.props.data.product.result;\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n if (!shouldUpdateOnPartialDimensionSelection || !product.productVariant?.RecordId) {\r\n return `${product.RecordId}`;\r\n }\r\n\r\n return `${product.RecordId}-${product.productVariant.RecordId}`;\r\n },\r\n async () => {\r\n const product = this.props.data.product.result;\r\n let images: IImageData[] = [];\r\n if (product) {\r\n if (this.props.context.app?.config?.OmniChannelMedia) {\r\n images = await getProductImages(\r\n product.RecordId,\r\n this.shouldUseCmsAltText(),\r\n +this.props.context.request.apiSettings.channelId,\r\n this.props.context.actionContext,\r\n product.Name,\r\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\r\n );\r\n } else {\r\n images = await getValidProductImages(\r\n product.RecordId,\r\n +this.props.context.request.apiSettings.channelId,\r\n this.props.context.actionContext,\r\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\r\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\r\n );\r\n }\r\n await this._setImages(images);\r\n } else {\r\n await this._setImages([]);\r\n }\r\n },\r\n { fireImmediately: true }\r\n );\r\n\r\n if (source === imageSource.productId && this.props.data.mediaLocations.result) {\r\n const images = await validateProductImages(\r\n this.props.data.mediaLocations.result,\r\n this.props.context.actionContext,\r\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\r\n );\r\n await this._setImages(images);\r\n }\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: ISuperMediaGalleryProps, nextState: IMediaGalleryState): boolean {\r\n if (this.state === nextState && this.props.data === nextProps.data) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { id, config, resources } = this.props;\r\n\r\n const { className, showPaginationTooltip } = config;\r\n\r\n const isVertical: boolean = config.thumbnailsOrientation === thumbnailsOrientation.vertical;\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- || is required.\r\n const isFullscreenAllowed: boolean = this.isMobile() || config.allowFullScreen || false;\r\n const zoomViewMode: string =\r\n config.imageZoom === imageZoom.inline ? imageZoom.inline : config.imageZoom === imageZoom.container ? imageZoom.container : '';\r\n const source = this.props.config.imageSource ?? imageSource.pageContext;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\r\n const emptyPlaceHolderImage = this.props.context.app.config?.placeholderImageName as string;\r\n if (this.props.data.product.result) {\r\n this.fallbackImage = getFallbackImageUrl(\r\n this.props.data.product.result.ItemId,\r\n this.props.context.request.apiSettings,\r\n this.props.context.request.app?.config?.OmniChannelMedia\r\n );\r\n }\r\n if (emptyPlaceHolderImage && this.fallbackImage) {\r\n this.fallbackImage = `${this.fallbackImage},${emptyPlaceHolderImage}`;\r\n }\r\n if (this.props.config.skipImageValidation && !this.state.mediaGalleryItems && this.state.isInitialLoad) {\r\n let images: IImageData[] = [];\r\n let mediaLocations: MediaLocation[] = [];\r\n if (source === imageSource.pageContext && this.props.data.mediaLocationsForSelectedVariant.result) {\r\n mediaLocations = this.props.data.mediaLocationsForSelectedVariant.result;\r\n } else if (source === imageSource.productId && this.props.data.mediaLocations.result) {\r\n mediaLocations = this.props.data.mediaLocations.result;\r\n }\r\n images = mediaLocations.map(mediaLocation => {\r\n return {\r\n src: mediaLocation.Uri ?? '',\r\n altText: getAltText(\r\n this.props.context.actionContext.requestContext,\r\n this.shouldUseCmsAltText(),\r\n this.props.data.product.result?.Name,\r\n mediaLocation.AltText\r\n )\r\n };\r\n });\r\n const curatedImages = this.props.config.images ?? [];\r\n this.mediaGalleryImages = [...this._filterMasterImageFromVariant(images), ...curatedImages];\r\n }\r\n const mediaGalleryCarouselItems = this._getMediaGalleryItems(isFullscreenAllowed, zoomViewMode);\r\n const mediaGalleryThumbnailCarouselItems = this._getMediaGalleryThumbnailItems();\r\n const viewProps: IMediaGalleryViewProps = {\r\n ...(this.props as ISuperMediaGalleryProps),\r\n state: this.state,\r\n MediaGallery: {\r\n moduleProps: this.props,\r\n className: classnames(`ms-media-gallery ${isVertical ? 'vertical' : ''}`, className)\r\n },\r\n Modal: isFullscreenAllowed ? this.imageModalSlider(zoomViewMode) : null,\r\n callbackToggle: this.openModalDialog,\r\n callbackThumbnailClick: this._generateOnThumbnailClick,\r\n callbackThumbnailKeyDown: this._generateOnThumbnailKeyDown,\r\n CarouselProps: {\r\n tag: Carousel,\r\n className: 'ms-media-gallery__carousel',\r\n items: mediaGalleryCarouselItems.items,\r\n activeIndex: this.state.activeIndex,\r\n next: this.next,\r\n previous: this.previous,\r\n interval: false,\r\n directionTextPrev: resources.previousScreenshotFlipperText,\r\n directionTextNext: resources.nextScreenshotFlipperText,\r\n onIndicatorsClickHandler: this.goToIndex,\r\n showPaginationTooltip: showPaginationTooltip === true,\r\n indicatorAriaText: resources.ariaLabelForSlide,\r\n handleOnExited: this.onExited,\r\n handleOnExiting: this.onExiting,\r\n key: mediaGalleryCarouselItems.keys\r\n } as IComponentNodeProps,\r\n Thumbnails: {\r\n ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\r\n SingleSlideCarouselComponentProps: {\r\n tag: SingleSlideCarousel,\r\n className: 'ms-media-gallery__thumbnails',\r\n vertical: isVertical,\r\n flipperPrevLabel: resources.previousScreenshotFlipperText,\r\n flipperNextLabel: resources.nextScreenshotFlipperText,\r\n parentId: id,\r\n useTabList: true,\r\n key: JSON.stringify(mediaGalleryThumbnailCarouselItems.keys)\r\n } as IComponentNodeProps,\r\n items: mediaGalleryThumbnailCarouselItems.items\r\n }\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n /**\r\n * Zoomed out image on previous/next click.\r\n */\r\n public updateZoomedInImage(): void {\r\n this.setState({ isImageZoomed: false });\r\n }\r\n\r\n private readonly onExiting = () => {\r\n this.setState({ animating: true });\r\n };\r\n\r\n private readonly onExited = () => {\r\n this.setState({ animating: false });\r\n };\r\n\r\n /**\r\n * On click next in carousel.\r\n */\r\n private readonly next = (): void => {\r\n removeInlineZoomStyle();\r\n if (this.isLastItem() === undefined) {\r\n return;\r\n }\r\n\r\n const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex + 1;\r\n this.goToIndex(nextIndex);\r\n\r\n this.updateZoomedInImage();\r\n };\r\n\r\n /**\r\n * On click previous in carousel.\r\n */\r\n private readonly previous = (): void => {\r\n removeInlineZoomStyle();\r\n const images = this.state.mediaGalleryItems;\r\n const nextIndex = this.isFirstItem() ? (images ? images.length - 1 : 0) : this.state.activeIndex - 1;\r\n this.goToIndex(nextIndex);\r\n this.updateZoomedInImage();\r\n };\r\n\r\n private readonly goToIndex = (index: number): void => {\r\n const { autoplay } = this.props.config;\r\n const currentIndex = this.state.activeIndex;\r\n const mediaItems = this.state.mediaGalleryItems;\r\n if (autoplay && mediaItems) {\r\n if (mediaItems[`${index}`]?.mediaTypeValue === MediaType.Video) {\r\n this.player.current?.play();\r\n } else if (mediaItems[`${currentIndex}`].mediaTypeValue === MediaType.Video) {\r\n this.player.current?.pause();\r\n }\r\n }\r\n this.setState({ activeIndex: index });\r\n };\r\n\r\n private _getMediaGalleryThumbnailItems(): IMediaGalleryCarouselItems {\r\n const mediaGalleryItems = this.state.mediaGalleryItems ?? this.mediaGalleryImages;\r\n const thumbnailImageSettings = this.props.config.thumbnailImageSettings;\r\n if (thumbnailImageSettings) {\r\n thumbnailImageSettings.cropFocalRegion = true;\r\n }\r\n\r\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\r\n\r\n if (!hasMediaGalleryItems) {\r\n if (this.state.lastUpdate) {\r\n const defaultKey = 0;\r\n return {\r\n items: [this._getEmptyThumbnailItem(thumbnailImageSettings, defaultKey, this.state.activeIndex)],\r\n keys: ['empty']\r\n };\r\n }\r\n return { items: [], keys: [] };\r\n }\r\n\r\n return {\r\n items: [\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\r\n ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\r\n if (item.mediaTypeValue === MediaType.Video) {\r\n return this.getVideoThumbNailItem(\r\n item,\r\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\r\n index,\r\n this.state.activeIndex\r\n );\r\n } else {\r\n return this._getThumbnailItem(\r\n item,\r\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\r\n index,\r\n this.state.activeIndex\r\n );\r\n }\r\n })\r\n ],\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\r\n keys: [...mediaGalleryItems!.map(item => item.src)]\r\n };\r\n }\r\n\r\n private _getMediaGalleryItems(isFullscreenAllowed: boolean, zoomViewMode: string): IMediaGalleryCarouselItems {\r\n const mediaGalleryItems = this.state.mediaGalleryItems ?? this.mediaGalleryImages;\r\n const galleryImageSettings = this.props.config.galleryImageSettings;\r\n if (galleryImageSettings) {\r\n galleryImageSettings.cropFocalRegion = true;\r\n }\r\n\r\n const zoomView = isFullscreenAllowed ? 'fullscreen' : zoomViewMode;\r\n\r\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\r\n\r\n if (!hasMediaGalleryItems) {\r\n if (this.state.lastUpdate) {\r\n return { items: [this._renderEmptyImage(galleryImageSettings)], keys: ['empty'] };\r\n }\r\n return { items: [], keys: [] };\r\n }\r\n\r\n return {\r\n items: [\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\r\n ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\r\n return this._renderCarouselItemImageView(\r\n zoomView,\r\n item,\r\n galleryImageSettings ?? this.defaultGalleryImageSettings,\r\n index\r\n );\r\n })\r\n ],\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\r\n keys: [...mediaGalleryItems!.map(item => item.src)]\r\n };\r\n }\r\n\r\n private async _setImages(images?: IMediaData[]): Promise {\r\n const curatedImage = this.props.config.images || [];\r\n const mediaToSet: IMediaData[] = this._filterMasterImageFromVariant(images);\r\n\r\n void Promise.all(\r\n mediaToSet.map(async mediaData => {\r\n if (mediaData.mediaTypeValue === MediaType.Video && mediaData.src) {\r\n try {\r\n const url = new URL(mediaData.src);\r\n const videoId = url.searchParams.get('CVID');\r\n if (videoId) {\r\n mediaData.videoData = await getVideoMetadataFromApi(videoId, this.props.context.actionContext);\r\n }\r\n } catch (error) {\r\n if (this.props.telemetry) {\r\n this.props.telemetry.debug('Error while fetching videoId');\r\n }\r\n }\r\n }\r\n return mediaData;\r\n })\r\n ).then(mediaData => {\r\n const mediaItems = mediaData.filter(element => {\r\n return (\r\n element.mediaTypeValue !== MediaType.Video ||\r\n (element.mediaTypeValue === MediaType.Video && element.videoData !== undefined)\r\n );\r\n });\r\n\r\n this.setState({\r\n mediaGalleryItems: [...mediaItems, ...curatedImage],\r\n activeIndex: 0,\r\n lastUpdate: Date.now(),\r\n shouldUseOptimizedImage: false\r\n });\r\n });\r\n\r\n this.setState({\r\n mediaGalleryItems: [...mediaToSet, ...curatedImage],\r\n activeIndex: 0,\r\n lastUpdate: Date.now(),\r\n shouldUseOptimizedImage: false\r\n });\r\n }\r\n\r\n private _setRenderType(): void {\r\n this.setState({\r\n isInitialLoad: false\r\n });\r\n }\r\n\r\n private _renderCarouselItemImageView(\r\n zoomView: string,\r\n media: IMediaData,\r\n imageSettings: IImageSettings,\r\n index: number,\r\n isInPopup: boolean = false\r\n ): React.ReactNode {\r\n if (media.mediaTypeValue === MediaType.Video) {\r\n if (isInPopup || zoomView !== 'fullscreen') {\r\n return <>{this._renderCarouselItemVideo(media, index, imageSettings)};\r\n }\r\n return <>{this._renderVideoThumbnail(media, index, imageSettings)};\r\n } else {\r\n if (this.isMobile()) {\r\n if (isInPopup) {\r\n return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\r\n }\r\n return this._renderImageFullScreenOnZoom(media, imageSettings, index);\r\n }\r\n\r\n switch (zoomView) {\r\n case 'container': {\r\n return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\r\n }\r\n case 'inline': {\r\n return this._renderImageInlineOnZoom(media, this._zoomedImageSettings, index);\r\n }\r\n case 'fullscreen': {\r\n return this._renderImageFullScreenOnZoom(media, imageSettings, index);\r\n }\r\n\r\n // No default\r\n }\r\n return <>{this._getCarouselItem(media, imageSettings, index, isInPopup)};\r\n }\r\n }\r\n\r\n private _filterMasterImageFromVariant(images?: IImageData[]): IImageData[] {\r\n const shouldHidePrimaryImages = this.props.config.shouldHideMasterProductImagesForVariant ?? true;\r\n let variantImages = images ?? [];\r\n const isVariantProduct =\r\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.MasterProductId) ||\r\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.productVariant);\r\n const itemId = this.props.data.product.result?.ItemId;\r\n if (shouldHidePrimaryImages && isVariantProduct && itemId) {\r\n variantImages = variantImages.filter(item => {\r\n const isApplicableForChildEntities = item.additionalProperties?.isApplicableForChildEntities;\r\n return !isApplicableForChildEntities;\r\n });\r\n if (!ArrayExtensions.hasElements(variantImages)) {\r\n variantImages = images ?? [];\r\n }\r\n }\r\n return variantImages;\r\n }\r\n\r\n private readonly _renderCarouselItemVideo = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\r\n const videoData = mediaData.videoData;\r\n if (videoData) {\r\n const options: IPlayerOptions = this.props.config as IPlayerOptions;\r\n const playerResources = this.props.resources;\r\n const videoMetaData: IVideoMetadata = {};\r\n videoMetaData.videoId = videoData.id;\r\n videoMetaData.title = videoData.title;\r\n videoMetaData.duration = videoData.playTime;\r\n if (videoData.thumbnail) {\r\n videoMetaData.posterframeUrl = videoData.thumbnail.src;\r\n }\r\n if (videoData._links?.binaryReferences) {\r\n videoMetaData.videoBinaryReferences = videoData._links.binaryReferences;\r\n }\r\n const videoPlayerData: IPlayerData = { options, metaData: videoMetaData };\r\n const attributes = {\r\n id: `${this.props.id}__carousel-item__${index}`\r\n };\r\n return (\r\n \r\n );\r\n }\r\n return this._renderEmptyImage(imageSettings);\r\n };\r\n\r\n private readonly _getCarouselItem = (\r\n image: IImageData,\r\n imageSettings: IImageSettings,\r\n index: number,\r\n isInPopup: boolean = false\r\n ): React.ReactNode => (\r\n \r\n );\r\n\r\n private readonly _getThumbnailItem = (\r\n image: IImageData,\r\n imageSettings: IImageSettings,\r\n index: number,\r\n modifiedActiveIndex: number\r\n ): IMediaGalleryThumbnailItemViewProps => {\r\n const classes = classnames(\r\n 'ms-media-gallery__thumbnail-item',\r\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\r\n );\r\n\r\n return {\r\n ThumbnailItemContainerProps: {\r\n tag: 'li' as NodeTag,\r\n className: classes,\r\n role: 'tab',\r\n tabIndex: 0,\r\n key: index,\r\n 'aria-label': image.altText,\r\n 'aria-selected': modifiedActiveIndex === index,\r\n onClick: this._generateOnThumbnailClick(index),\r\n onKeyDown: this._generateOnThumbnailKeyDown(index)\r\n },\r\n Picture: (\r\n \r\n )\r\n };\r\n };\r\n\r\n /**\r\n * Gets the video thumbnail item to display media gallery.\r\n * @param props - The Media gallery view props from business layer.\r\n * @returns Return thumbnail view props which will be used to render video.\r\n */\r\n private readonly getVideoThumbNailItem = (\r\n mediaData: IMediaData,\r\n imageSettings: IImageSettings,\r\n index: number,\r\n modifiedActiveIndex: number\r\n ): IMediaGalleryThumbnailItemViewProps => {\r\n const classes = classnames(\r\n 'ms-media-gallery__thumbnail-item',\r\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\r\n );\r\n\r\n const videoData = mediaData.videoData;\r\n let image: IImageData;\r\n if (videoData?.thumbnail) {\r\n image = videoData.thumbnail;\r\n } else {\r\n image = {\r\n src: 'empty'\r\n };\r\n }\r\n\r\n return {\r\n ThumbnailItemContainerProps: {\r\n tag: 'li' as NodeTag,\r\n className: classes,\r\n role: 'tab',\r\n tabIndex: 0,\r\n key: index,\r\n 'aria-label': image.altText,\r\n 'aria-selected': modifiedActiveIndex === index,\r\n onClick: this._generateOnThumbnailClick(index),\r\n onKeyDown: this._generateOnThumbnailKeyDown(index)\r\n },\r\n Picture: (\r\n \r\n )\r\n };\r\n };\r\n\r\n /**\r\n * Ref Handler.\r\n * @param index -Remove item click function.\r\n * @returns Set inline zoom.\r\n */\r\n private readonly _refHandler = (index: number) => (divRef: HTMLDivElement) => {\r\n this._inlineZoomDivRef.set(index, divRef);\r\n };\r\n\r\n private readonly _generateOnThumbnailKeyDown = (index: number) => {\r\n return (event: React.KeyboardEvent) => {\r\n if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\r\n event.preventDefault();\r\n\r\n this.goToIndex(index);\r\n }\r\n };\r\n };\r\n\r\n private readonly _generateOnThumbnailClick = (index: number) => {\r\n return (event: React.MouseEvent) => {\r\n event.preventDefault();\r\n\r\n this.goToIndex(index);\r\n };\r\n };\r\n\r\n private _renderImageInlineOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\r\n return (\r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n private _inlineZoomImageOnHover(event: React.MouseEvent): void {\r\n inlineZoomImageOnHover(event, this.props.config.dataScale ?? String(defaultDataScale));\r\n }\r\n\r\n private _handleMobileViewZoomedImageClick(event: React.MouseEvent) {\r\n const target = this.state.shouldUseOptimizedImage ? (event.target as HTMLImageElement) : event.currentTarget;\r\n const mobileZoomedInImageClassName = 'msc-mobile-zoomed-in';\r\n if (!this.state.isMobileImageZoomed) {\r\n const bounds = target.getBoundingClientRect();\r\n const dataScale = Number(this.props.config.dataScale ?? defaultDataScale);\r\n\r\n const positionX = event.clientX - bounds.left;\r\n const positionY = event.clientY - bounds.top;\r\n const scaledPositionX = positionX * dataScale;\r\n const scaledPositionY = positionY * dataScale;\r\n\r\n target.style.transform = `scale(${dataScale})`;\r\n target.classList.add(mobileZoomedInImageClassName);\r\n target.parentElement!.style.overflow = 'auto';\r\n target.parentElement!.scrollTo(scaledPositionX - positionX, scaledPositionY - positionY);\r\n this.setState({\r\n isMobileImageZoomed: true\r\n });\r\n } else {\r\n target.style.transform = '';\r\n target.classList.remove(mobileZoomedInImageClassName);\r\n target.parentElement!.style.overflow = '';\r\n this.setState({\r\n isMobileImageZoomed: false\r\n });\r\n }\r\n }\r\n\r\n private _onInlineImageClick(event: React.MouseEvent): void {\r\n if (window.innerWidth <= 768) {\r\n // $msv-breakpoint-m\r\n this._handleMobileViewZoomedImageClick(event);\r\n return;\r\n }\r\n inlineZoomInitClick(event, this.props.config.dataScale ?? String(defaultDataScale));\r\n this.setState({\r\n isImageZoomed: true\r\n });\r\n }\r\n\r\n private _onImageMouseOut(event: React.MouseEvent): void {\r\n inlineZoomImageOnMouseOut(event);\r\n this.setState({\r\n isImageZoomed: false\r\n });\r\n }\r\n\r\n private _onContainerZoomImageClick(event: React.MouseEvent): void {\r\n if (window.innerWidth <= 768) {\r\n // $msv-breakpoint-m\r\n this._handleMobileViewZoomedImageClick(event);\r\n return;\r\n }\r\n\r\n onContainerZoomInit(event);\r\n\r\n this.setState({\r\n isImageZoomed: true\r\n });\r\n }\r\n\r\n private _onMouseOutLensContainer(event: React.MouseEvent): void {\r\n onMouseOutLensContainer(event);\r\n\r\n this.setState({\r\n isImageZoomed: false\r\n });\r\n }\r\n\r\n private _renderImageInContainerOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\r\n return (\r\n
\r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n private _renderImageFullScreenOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\r\n return (\r\n
\r\n \r\n
\r\n {}\r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n /**\r\n * Render the video thumbnail in full screen.\r\n * @param mediaData - Media Data.\r\n * @param index - Index\r\n * @param imageSettings - Image settings.\r\n * @returns - JSX.Element\r\n */\r\n private readonly _renderVideoThumbnail = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\r\n const videoData = mediaData.videoData;\r\n let image: IImageData;\r\n if (videoData?.thumbnail) {\r\n image = videoData.thumbnail;\r\n } else {\r\n image = {\r\n src: 'empty'\r\n };\r\n }\r\n\r\n return (\r\n
\r\n \r\n
\r\n {}\r\n \r\n
\r\n
\r\n );\r\n };\r\n\r\n private _mapProductToImageData(product: SimpleProduct): IImageData {\r\n return {\r\n src: product.PrimaryImageUrl ?? ''\r\n };\r\n }\r\n\r\n private _renderEmptyImage(imageSettings: IImageSettings | undefined): React.ReactNode {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n }\r\n\r\n private _getEmptyThumbnailItem(\r\n imageSettings: IImageSettings | undefined,\r\n index: number,\r\n modifiedActiveIndex: number\r\n ): IMediaGalleryThumbnailItemViewProps {\r\n const classes = classnames(\r\n 'ms-media-gallery__thumbnail-item',\r\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\r\n );\r\n return {\r\n ThumbnailItemContainerProps: {\r\n tag: 'li' as NodeTag,\r\n className: classes,\r\n role: 'tab',\r\n tabIndex: 0,\r\n key: 'empty',\r\n 'aria-label': '',\r\n 'aria-selected': modifiedActiveIndex === index,\r\n onClick: this._generateOnThumbnailClick(index),\r\n onKeyDown: this._generateOnThumbnailKeyDown(index)\r\n },\r\n Picture: (\r\n \r\n )\r\n };\r\n }\r\n\r\n private readonly isFirstItem = () => this.state.activeIndex === 0;\r\n\r\n private readonly isLastItem = () => {\r\n const images = this.state.mediaGalleryItems;\r\n return images && this.state.activeIndex === images.length - 1;\r\n };\r\n\r\n private readonly openModalDialog = (): void => {\r\n this._toggleModal();\r\n };\r\n\r\n private _toggleModal(): void {\r\n if (this.state.modalIsOpen) {\r\n this.fullScreenOverlayButtonRef.current?.focus();\r\n const parentDiv = this._inlineZoomDivRef.get(this.state.activeIndex);\r\n if (parentDiv && parentDiv.children && parentDiv.children.length >= 2) {\r\n const image = parentDiv.children[1].querySelector('img');\r\n if (image) {\r\n image.removeAttribute('style');\r\n }\r\n }\r\n this.setState({\r\n isImageZoomed: false\r\n });\r\n }\r\n this.setState({\r\n isImageZoomed: false,\r\n modalIsOpen: !this.state.modalIsOpen\r\n });\r\n removeInlineZoomStyle();\r\n removeContainerZoomStyle();\r\n }\r\n\r\n private readonly imageModalSlider = (ZoomView: string): React.ReactElement => {\r\n const {\r\n data: {\r\n product: { result: product }\r\n },\r\n resources\r\n } = this.props;\r\n let mediaGalleryItems = this.state.mediaGalleryItems;\r\n\r\n if (!mediaGalleryItems && product) {\r\n mediaGalleryItems = [this._mapProductToImageData(product)];\r\n }\r\n const carouselprops = {\r\n tag: Carousel,\r\n className: 'ms-media-gallery__carousel',\r\n items:\r\n mediaGalleryItems &&\r\n mediaGalleryItems.map((item: IImageData, index: number) =>\r\n this._renderCarouselItemImageView(ZoomView, item, this._zoomedImageSettings, index, true)\r\n ),\r\n activeIndex: this.state.activeIndex,\r\n next: this.next,\r\n previous: this.previous,\r\n interval: false,\r\n directionTextPrev: resources.previousScreenshotFlipperText,\r\n directionTextNext: resources.nextScreenshotFlipperText,\r\n onIndicatorsClickHandler: this.goToIndex,\r\n showPaginationTooltip: true,\r\n hideIndicator: false,\r\n keyboard: false,\r\n handleOnExited: this.onExited,\r\n handleOnExiting: this.onExiting,\r\n isDisabledFunctionality: this.state.isMobileImageZoomed\r\n } as IComponentNodeProps;\r\n const carousel = ;\r\n\r\n const imageModalSliderProps: IModalViewProps = {\r\n modalIsOpen: this.state.modalIsOpen,\r\n ontoggle: this._toggleModal,\r\n galleryCarousel: carousel,\r\n classNames: classnames('ms-media-gallery__modal', 'msc-modal-input-required')\r\n };\r\n return ImagefullView(imageModalSliderProps) as React.ReactElement;\r\n };\r\n\r\n private shouldUseCmsAltText = (): boolean => {\r\n if (this.props.config.altTextSource === 'product') {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n };\r\n}\r\n\r\nexport default MediaGallery;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\nimport { IInvoiceSummaryLines } from '@msdyn365-commerce-modules/invoice-payment-summary';\r\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ICartViewProps, IOrderSummaryErrors } from './citta-cart';\r\nimport { ICartlinesViewProps } from './components/citta-cart-line-items';\r\nimport { ICartLineItemViewProps } from './components/citta-cart-line-items-promotion';\r\n\r\nconst _renderCartlines = (\r\n cartLines: ICartlinesViewProps[] | undefined,\r\n cartEmptyText: string,\r\n CartlinesWrapper: INodeProps,\r\n storeSelector: React.ReactNode | undefined,\r\n backToShoppingButton: React.ReactNode,\r\n waitingComponent: React.ReactNode,\r\n cartLoadingStatus: string,\r\n cartDataResult: boolean\r\n): JSX.Element[] | JSX.Element => {\r\n if (cartLoadingStatus) {\r\n return <>{cartLoadingStatus};\r\n }\r\n if (cartLines) {\r\n return cartLines.map(cartLine => {\r\n return (\r\n
\r\n {cartLine.cartline}\r\n {storeSelector && cartLine.pickUpInStore ? (\r\n {cartLine.pickUpInStore.defaultComponent}\r\n ) : null}\r\n {cartLine.addToOrderTemplate ? (\r\n \r\n {cartLine.remove}\r\n {cartLine.addToWishlist}\r\n {cartLine.addToOrderTemplate}\r\n \r\n ) : (\r\n <>\r\n {cartLine.remove}\r\n {cartLine.addToWishlist}\r\n \r\n )}\r\n
\r\n );\r\n });\r\n }\r\n return cartDataResult ? (\r\n
\r\n

{cartEmptyText}

\r\n {backToShoppingButton}\r\n
\r\n ) : (\r\n <>{waitingComponent}\r\n );\r\n};\r\n\r\n/**\r\n * Method will render error block.\r\n * @param errorData -The order summary errors interface.\r\n * @returns Jsx element.\r\n */\r\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\r\n if (!errorData || !ArrayExtensions.hasElements(errorData.errors)) {\r\n return null;\r\n }\r\n return (\r\n \r\n {\"Please review cart errors before proceeding to checkout\"}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render invoice summary lines.\r\n * @param invoiceSummaryLines -The invoicesummary lines interface.\r\n * @param OrderSummaryItems -The order summary items props.\r\n * @param props -The cartview props.\r\n * @returns Jsx element.\r\n */\r\nconst _renderInvoiceSummarylines = (\r\n invoiceSummaryLines: IInvoiceSummaryLines | undefined,\r\n OrderSummaryItems: INodeProps,\r\n props: ICartViewProps\r\n): JSX.Element | null => {\r\n if (!invoiceSummaryLines) {\r\n props.context.telemetry.error('InvoiceSummary content is empty, module wont render');\r\n return null;\r\n }\r\n return (\r\n \r\n {invoiceSummaryLines.invoices}\r\n {invoiceSummaryLines.giftCard}\r\n {invoiceSummaryLines.loyalty}\r\n {invoiceSummaryLines.orderTotal}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render order summary lines.\r\n * @param orderSummaryLines -The ordersummary lines interface.\r\n * @param OrderSummaryItems -The order summary items props.\r\n * @param props -The cartview props.\r\n * @returns Jsx element.\r\n */\r\nconst _renderOrderSummarylines = (\r\n orderSummaryLines: IOrderSummaryLines | undefined,\r\n OrderSummaryItems: INodeProps,\r\n props: ICartViewProps\r\n): JSX.Element | null => {\r\n if (!orderSummaryLines) {\r\n props.context.telemetry.error('OrderSummary content is empty, module wont render');\r\n return null;\r\n }\r\n return (\r\n \r\n {props.promoCode}\r\n {orderSummaryLines.subtotal}\r\n {orderSummaryLines.shipping}\r\n {orderSummaryLines.otherCharge}\r\n {orderSummaryLines.tax}\r\n {orderSummaryLines.totalDiscounts ? orderSummaryLines.totalDiscounts : null}\r\n {orderSummaryLines.orderTotal}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render cart promotions.\r\n * @param promotions -The cartline item view props.\r\n * @returns Jsx element.\r\n */\r\nconst _renderPromotions = (promotions: ICartLineItemViewProps): JSX.Element | undefined => {\r\n return (\r\n <>\r\n \r\n {promotions.promotionMessage}\r\n {promotions.promotionSeeAllLink}\r\n {promotions.promotionDialog}\r\n \r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render cartlines group title.\r\n * @param cartLine -The cartline view props.\r\n * @param titleSeparate -The title separate.\r\n * @returns Jsx element.\r\n */\r\nconst renderCartLinesGroupTitle = (cartLine: ICartlinesViewProps, titleSeparate: string) => {\r\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\r\n return (\r\n <>\r\n \r\n {isBopisSelected ? (\r\n

\r\n {cartLine.pickUpInStore?.deliveryOption}\r\n {titleSeparate}\r\n {cartLine.pickUpInStore?.orgUnitName}\r\n

\r\n ) : null}\r\n
\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render cartlines groups header title.\r\n * @param pickUpText -The pickup text for group.\r\n * @param shippingText -The shipping text for group.\r\n * @param emailShippingText -The email shipping text for group.\r\n * @param titleSeparate -The title separator.\r\n * @param cartLine -The cartline view props.\r\n * @param emailDeliveryModeCode -The email delivery code from channel.\r\n * @returns Jsx element.\r\n */\r\nconst renderCartLinesGroupHeader = (\r\n pickUpText: string,\r\n shippingText: string,\r\n emailShippingText: string,\r\n titleSeparate: string,\r\n cartLine: ICartlinesViewProps,\r\n emailDeliveryModeCode?: string\r\n) => {\r\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\r\n let groupTitle: string;\r\n\r\n groupTitle = isBopisSelected ? pickUpText : shippingText;\r\n if (!StringExtensions.isNullOrEmpty(emailDeliveryModeCode)) {\r\n groupTitle = cartLine.data && cartLine.data.cartline.DeliveryMode === emailDeliveryModeCode ? emailShippingText : groupTitle;\r\n }\r\n\r\n return (\r\n <>\r\n
\r\n

\r\n

{groupTitle}

\r\n {renderCartLinesGroupTitle(cartLine, titleSeparate)}\r\n
\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render cartlines in groups.\r\n * @param props -The cartline.\r\n * @returns Jsx element.\r\n */\r\nconst renderCartLinesGroup = (props: ICartViewProps): JSX.Element | undefined => {\r\n if (props.cartLinesGroup && ArrayExtensions.hasElements(props.cartLinesGroup)) {\r\n return (\r\n
\r\n {props.cartLinesGroup.map(cartlines => {\r\n return (\r\n
\r\n {renderCartLinesGroupHeader(\r\n props.resources.pickUpText,\r\n props.resources.shippingText,\r\n props.resources.emailshippingText,\r\n props.resources.titleSeparate,\r\n cartlines[0],\r\n props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode\r\n )}\r\n {_renderCartlines(\r\n cartlines,\r\n props.resources.emptyCartText,\r\n props.CartlinesWrapper,\r\n props.storeSelector,\r\n props.backToShoppingButton,\r\n props.waitingComponent,\r\n props.cartLoadingStatus,\r\n props.cartDataResult\r\n )}\r\n
\r\n );\r\n })}\r\n
\r\n );\r\n }\r\n return props.cartDataResult ? (\r\n
\r\n
\r\n

{props.resources.emptyCartText}

\r\n {props.backToShoppingButton}\r\n
\r\n
\r\n ) : (\r\n <>{props.waitingComponent}\r\n );\r\n};\r\n\r\nconst CartView: React.FC = (props: ICartViewProps) => (\r\n
\r\n {props.checkoutBlockedDueToUnavailableFunds}\r\n {props.title}\r\n {!props.cart?.hasInvoiceLine && props.promotionOptions && _renderPromotions(props.promotionOptions)}\r\n {props.multiplePickUpEnabled ? (\r\n renderCartLinesGroup(props)\r\n ) : (\r\n \r\n {_renderCartlines(\r\n props.cartlines,\r\n props.resources.emptyCartText,\r\n props.CartlinesWrapper,\r\n props.storeSelector,\r\n props.backToShoppingButton,\r\n props.waitingComponent,\r\n props.cartLoadingStatus,\r\n props.cartDataResult\r\n )}\r\n \r\n )}\r\n {props.orderSummaryHeading && (\r\n \r\n {props.orderSummaryHeading}\r\n {props.cart?.hasInvoiceLine\r\n ? _renderInvoiceSummarylines(props.invoiceSummaryLineitems, props.OrderSummaryItems, props)\r\n : _renderOrderSummarylines(props.orderSummaryLineitems, props.OrderSummaryItems, props)}\r\n {_renderErrorBlock(props.OrderSummaryErrors)}\r\n {props.checkoutAsSignInUserButton}\r\n {props.checkoutAsGuestButton}\r\n {props.expressCheckoutButton && ArrayExtensions.hasElements(props.expressCheckoutButton) ? (\r\n {props.expressCheckoutButton}\r\n ) : null}\r\n {props.backToShoppingButton}\r\n {props.createTemplateFromCartButton}\r\n \r\n )}\r\n {props.storeSelector}\r\n
\r\n);\r\n\r\nexport default CartView;\r\n","/* eslint-disable no-duplicate-imports */\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { IMediaGalleryThumbnailItemViewProps, IMediaGalleryThumbnailsViewProps, IMediaGalleryViewProps } from '@msdyn365-commerce-modules/media-gallery';\r\n\r\nconst MediaGalleryView: React.FC = props => {\r\n const {CarouselProps, Thumbnails, MediaGallery, Modal} = props;\r\n\r\n return (\r\n \r\n \r\n {Modal}\r\n {_renderThumbnails(Thumbnails)}\r\n \r\n );\r\n};\r\n\r\nconst _renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps): JSX.Element => {\r\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps, items } = thumbnails;\r\n\r\n return (\r\n \r\n \r\n {items && items.map(_renderThumbnailItem)}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\r\n const { ThumbnailItemContainerProps, Picture } = thumbnail;\r\n\r\n return (\r\n \r\n {Picture}\r\n \r\n );\r\n};\r\n\r\nexport default MediaGalleryView;","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport { IMediaGalleryThumbnailItemViewProps,\r\n IMediaGalleryThumbnailsViewProps,\r\n IMediaGalleryViewProps\r\n} from '@msdyn365-commerce-modules/media-gallery';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, KeyCodes, Module, Node, NodeTag } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React from 'react';\r\n\r\n/**\r\n * Render the thumbnail item images.\r\n * @param thumbnail - The carousel thumbnail line props.\r\n * @returns Return HTML having thumnailcontainer props with image.\r\n */\r\nconst renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\r\n const { ThumbnailItemContainerProps, Picture } = thumbnail;\r\n\r\n return (\r\n \r\n {Picture}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Gets the thumbnail item to display media gallery images.\r\n * @param image - The media gallery images.\r\n * @param imageSettings - Image settings for the image gallery items.\r\n * @param imageId - Image id.\r\n * @param modifiedActiveIndex - Modified Index of the images when selection changes.\r\n * @param props - The Media gallery view props from business layer.\r\n * @returns Return thumbnail view props which will be used to render images.\r\n */\r\nconst GetThumbnailItemComponent = (\r\n image: IImageData,\r\n imageSettings: IImageSettings,\r\n imageId: number,\r\n modifiedActiveIndex: number,\r\n props: IMediaGalleryViewProps\r\n): IMediaGalleryThumbnailItemViewProps => {\r\n\r\n /**\r\n * OnClick method of media gallery item.\r\n * */\r\n const onClick = () => {\r\n // @ts-ignore\r\n props.callbackToggle?.();\r\n // @ts-ignore\r\n props.callbackThumbnailClick?.(imageId);\r\n props.state.activeIndex = imageId;\r\n };\r\n\r\n const classes = classnames(\r\n 'ms-media-gallery__thumbnail-item',\r\n modifiedActiveIndex === imageId ? 'ms-media-gallery__thumbnail-item-active' : ''\r\n );\r\n\r\n /**\r\n * Keydown event of media gallery item.\r\n * @param event - React.KeyboardEvent.\r\n * */\r\n const handleKeyDown = (event: React.KeyboardEvent) => {\r\n if (event.keyCode === KeyCodes.Enter) {\r\n event.preventDefault();\r\n onClick();\r\n }\r\n };\r\n\r\n return {\r\n ThumbnailItemContainerProps: {\r\n tag: 'li' as NodeTag,\r\n className: classes,\r\n role: 'presentation',\r\n key: imageId\r\n },\r\n Picture: (\r\n \r\n \r\n \r\n \r\n {/* \r\n \r\n */}\r\n \r\n )\r\n };\r\n};\r\n\r\n/**\r\n * Gets the empty thumbnail item to display media gallery images.\r\n * @param imageSettings - Image settings for the image gallery items.\r\n * @param props - The Media gallery view props from business layer.\r\n * @returns Return thumbnail view props which will be used to render empty images.\r\n */\r\nconst GetEmptyThumbnailItemComponent = (imageSettings: IImageSettings, props: IMediaGalleryViewProps): IMediaGalleryThumbnailItemViewProps => {\r\n return {\r\n ThumbnailItemContainerProps: {\r\n tag: 'li' as NodeTag,\r\n className: 'ms-media-gallery__thumbnail-item',\r\n role: 'tab',\r\n tabIndex: 0,\r\n key: 0,\r\n 'aria-label': '',\r\n 'aria-selected': true\r\n },\r\n Picture: (\r\n \r\n )\r\n };\r\n};\r\n\r\n/**\r\n * Update media gallery items method.\r\n * @param items - The media gallery thumbnail item view props.\r\n * @returns The IImageData array.\r\n */\r\nconst getMediaGalleryItems = (items?: IMediaGalleryThumbnailItemViewProps[]): IImageData[] | undefined => {\r\n return items?.map(item => {\r\n return {\r\n altText: item.Picture.props.altText,\r\n src: item.Picture.props.src\r\n };\r\n });\r\n};\r\n\r\nconst defaultThumbnailImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=295&h=295&q=80&m=6&f=jpg', w: 295, h: 295 },\r\n xl: { q: 'w=295&h=295&q=80&m=6&f=jpg', w: 295, h: 295 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n};\r\n\r\n/**\r\n * Render the Media gallery thumbnails to represent images in grid view.\r\n * @param thumbnails - The thumbnail view props.\r\n * @param props - The media gallery view props.\r\n * @returns - The single slide carousel component to render as media gallery image.\r\n */\r\nconst renderThumbnails = (\r\n thumbnails: IMediaGalleryThumbnailsViewProps,\r\n props: IMediaGalleryViewProps\r\n): JSX.Element => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\r\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps } = thumbnails;\r\n const { state, Thumbnails } = props;\r\n const mediaGalleryItems = getMediaGalleryItems(Thumbnails.items);\r\n\r\n const items: IMediaGalleryThumbnailItemViewProps[] | undefined =\r\n // eslint-disable-next-line multiline-ternary -- need multiline for easy code reading\r\n state.lastUpdate && !ArrayExtensions.hasElements(mediaGalleryItems) ? [GetEmptyThumbnailItemComponent(defaultThumbnailImageSettings, props)] :\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery\r\n mediaGalleryItems?.map((item: IImageData, id: number) => GetThumbnailItemComponent(item,\r\n defaultThumbnailImageSettings, id, state.activeIndex, props));\r\n\r\n return (\r\n \r\n \r\n {items?.map(renderThumbnailItem)}\r\n \r\n \r\n );\r\n};\r\n\r\n/**\r\n * Render the Media gallery items using viewprops.\r\n * @param props - The media gallery view props.\r\n * @returns The media gallery module wrapping up images node.\r\n */\r\nconst mediaGalleryView: React.FC = props => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\r\n const { CarouselProps, Thumbnails, MediaGallery, Modal } = props;\r\n return (\r\n \r\n \r\n {Modal}\r\n {renderThumbnails(Thumbnails, props)}\r\n \r\n );\r\n};\r\n\r\nexport default mediaGalleryView;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport {\r\n ICartlinesViewProps,\r\n ICartResources,\r\n ICartViewProps,\r\n IOrderSummaryErrors\r\n} from '@msdyn365-commerce-modules/cart';\r\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { Button, INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport {\r\n IAddToOrderTemplateDialogResources, IDuplicateItemsWhenAddingToOrderTemplateDialogResources, IItemAddedToOrderTemplateDialogResources,\r\n IOrderTemplateNameDialogResources, IWishlistActionSuccessResult, PriceComponent\r\n} from '@msdyn365-commerce/components';\r\nimport { IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport { AsyncResult, CartLine, CartLineValidationResults, LineDataValidationFailure } from '@msdyn365-commerce/retail-proxy';\r\nimport { validateForCheckoutAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport * as React from 'react';\r\nimport { CartLineItems } from '../../../components/citta-cart/cart-line-items';\r\nimport { ICartProps } from '../definition-extensions/cart.ext.props.autogenerated';\r\n\r\nimport CittaTelemetry from '../../../common/telemetry/citta-telemetry';\r\n// import PriceComponent from '../../../components/price-component'\r\n\r\ninterface ICartViewState {\r\n cartlinesErrors: LineDataValidationFailure[];\r\n}\r\n\r\n/**\r\n *\r\n * CartView\r\n * @extends {React.PureComponent}\r\n */\r\nexport class CartView extends React.PureComponent, ICartViewState> {\r\n private cittaTelemetry: CittaTelemetry = new CittaTelemetry(this.props.context.app.config.cittaInstrumentationKey);\r\n\r\n public state: ICartViewState = {\r\n cartlinesErrors: []\r\n };\r\n\r\n private createLogMessage = (message: string): string => {\r\n const url: string = decodeURI(window.location.search);\r\n const origin = window.location.origin;\r\n const logMessage = `${message} Url: - ${url} - Origin: ${origin}`;\r\n return logMessage;\r\n }\r\n\r\n private logMessage = (message: string): void => {\r\n this.cittaTelemetry.trace(this.createLogMessage(message));\r\n }\r\n\r\n // private isQuantityLimitsFeatureEnabled: boolean = true;\r\n private isQuantityLimitsFeatureEnabled: boolean = false;\r\n\r\n\r\n constructor(props: ICartViewProps & ICartProps<{}>) {\r\n super(props);\r\n\r\n this._renderCartlines = this._renderCartlines.bind(this);\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n // if (this.isQuantityLimitsFeatureEnabled) {\r\n // await this._validateCart();\r\n // }\r\n this.isQuantityLimitsFeatureEnabled = await this.getOrderQuantityLimitsFeatureFlag();\r\n if (this.isQuantityLimitsFeatureEnabled) {\r\n await this._validateCart();\r\n }\r\n\r\n this.logMessage('landed on cart page');\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n return (\r\n
\r\n {this.props.title}\r\n \r\n {this._renderCartlines()}\r\n \r\n {this.props.orderSummaryHeading &&\r\n < Node {...this.props.OrderSummaryWrapper}>\r\n {this.props.orderSummaryHeading}\r\n {_renderOrderSummarylines(this.props.orderSummaryLineitems, this.props.OrderSummaryItems, this.props)}\r\n {this.state.cartlinesErrors.length > 0 ? _renderErrorBlock(this.props.OrderSummaryErrors) : null}\r\n {_renderGIftCardError(this.props)}\r\n {this.props.config.freightCalculationText ?
{this.props.config.freightCalculationText}
: null}\r\n
\r\n {this.props.checkoutAsSignInUserButton}\r\n {this.props.context.request && this.props.context.request.user && this.props.context.request.user.isAuthenticated ? null :
{this.props.resources.orLabel}
}\r\n
\r\n {_renderBackToShoppingButton(this.props.resources)}\r\n {this.props.checkoutAsGuestButton}\r\n
\r\n
\r\n \r\n }\r\n {this.props.storeSelector}\r\n
\r\n );\r\n }\r\n\r\n private _renderCartlines(): JSX.Element[] | JSX.Element {\r\n const { emptyCartText } = this.props.resources;\r\n\r\n if (this.props.cartLoadingStatus) {\r\n return <>{this.props.cartLoadingStatus};\r\n }\r\n const cartLines = this._getCartLines();\r\n if (cartLines) {\r\n return cartLines.map((cartLine, index) => {\r\n return (\r\n
\r\n {cartLine.cartline}\r\n {_renderBOPISBlock(cartLine, this.props.resources, this.props.storeSelector)}\r\n
\r\n {cartLine.addToWishlist}\r\n {cartLine.remove}\r\n
\r\n
\r\n );\r\n });\r\n } else {\r\n return (this.props.cartDataResult ?\r\n (\r\n
\r\n

{emptyCartText}

\r\n {this.props.backToShoppingButton}\r\n
\r\n ) : <>{this.props.waitingComponent}\r\n );\r\n }\r\n }\r\n\r\n private _getCartLines(): ICartlinesViewProps[] | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n wishlists: { result: wishlists },\r\n orderTemplates: { result: orderTemplates },\r\n customerInformation: { result: customerInformation }\r\n },\r\n context: {\r\n request: {\r\n channel: {\r\n PickupDeliveryModeCode\r\n } = { PickupDeliveryModeCode: undefined }\r\n }\r\n },\r\n config: config,\r\n telemetry,\r\n resources,\r\n modules\r\n } = this.props;\r\n\r\n const imageSettings = this._getImageSettings(config.imageSettings);\r\n\r\n const cartlinesErrors: LineDataValidationFailure[] = this.state.cartlinesErrors;\r\n let storeSelectorId: string = '';\r\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n storeSelectorId = modules.storeSelector[0].id;\r\n }\r\n return this.props.data.products && this.props.data.products.result && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0 ? (\r\n CartLineItems({\r\n cartlines: cart.cart.CartLines,\r\n storeSelectorModuleId: storeSelectorId,\r\n cartlinesErrors: cartlinesErrors,\r\n products: this.props.data.products.result,\r\n productAvailabilites: this.props.data.productAvailabilites.result,\r\n productDeliveryOptions: this.props.data.deliveryOptions.result,\r\n imageSettings: imageSettings,\r\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n maxCartlineQuantity: this.props.context.app.config.maxQuantityForCartLineItem,\r\n gridSettings: this.props.context.request.gridSettings!,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n resources: {\r\n sizeString: resources.productDimensionTypeSize,\r\n colorString: \"Colour:\" || resources.productDimensionTypeColor,\r\n configString: resources.productDimensionTypeConfiguration,\r\n styleString: resources.productDimensionTypeStyle,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\r\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\r\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\r\n discountStringText: resources.discountStringText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText,\r\n shippingChargesText: resources.shippingCharges\r\n },\r\n telemetry: telemetry,\r\n addToWishlistButtonText: resources.addToWishlistButtonText,\r\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\r\n removeButtonText: resources.removeCartButtonText,\r\n shipItText: resources.shipInsteadDisplayText,\r\n pickitUpText: resources.pickItUpDisplayText,\r\n changeStoreText: resources.changeStoreDisplayText,\r\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\r\n outOfStockText: resources.outOfStockErrorMessage,\r\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\r\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\r\n cartState: this.props.data.cart.result,\r\n orgUnitLocations: this.props.data.orgUnitLocations.result,\r\n removeItemClickHandler: this._removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this._moveToWishlistSuccessHandler,\r\n updateCartLinesQuantitySuccessHandler: this._updateCartlineQuantity,\r\n locationChangedHandler: this._fulfillmentStoreIdUpdated,\r\n wishlists: wishlists,\r\n defaultWishlistName: resources.defaultWishlistName,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n includeErrors: config.showOutOfStockErrors,\r\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\r\n telemetryContent: this.props.telemetryContent,\r\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\r\n\r\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\r\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\r\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources),\r\n\r\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\r\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\r\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\r\n orderTemplates: orderTemplates,\r\n customerInformation: customerInformation\r\n })\r\n ) : null;\r\n }\r\n\r\n private _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\r\n return imageSettings || {\r\n viewports: {\r\n xs: { q: `w=80&h=94&m=6`, w: 0, h: 0 },\r\n sm: { q: `w=148&h=174&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=148&h=174&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n }\r\n\r\n private _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\r\n if (this.props.data.cart.result) {\r\n const input = {\r\n cartLineIds: [cartlineToRemove.LineId!.toString()]\r\n };\r\n this.props.data.cart.result.removeCartLines(input)\r\n .then(() => {\r\n this._validateCart()\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n const cartLines = this.props.data.cart.result?.cart.CartLines;\r\n if(cartLines && cartLines.length === 1 && cartLines.some(item => item.ItemId === \"GiftCard\")) {\r\n location.reload()\r\n }\r\n })\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to Remove Cart Line');\r\n });\r\n }\r\n }\r\n\r\n private _moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\r\n if (result.status === 'ADDED' && cartline) {\r\n this._removeItemFromCartHandler(cartline);\r\n }\r\n }\r\n\r\n private _updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number): boolean => {\r\n if (this.props.data.cart.result) {\r\n const input = {\r\n cartLineId: cartlineToUpdate.LineId!.toString(),\r\n newQuantity: quantity,\r\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: this.isQuantityLimitsFeatureEnabled }\r\n };\r\n this.props.data.cart.result.updateCartLineQuantity(input)\r\n .then((result: ICartActionResult) => {\r\n if (result.status === 'SUCCESS') {\r\n this._validateCart().catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n return true;\r\n }\r\n return false;\r\n })\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to update Cart Line quantity');\r\n });\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _fulfillmentStoreIdUpdated = () => {\r\n this._validateCart().catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n }\r\n\r\n /**\r\n * Get order quantity limit feature flag.\r\n * @returns True if flag is enabled, false otherwise.\r\n */\r\n private async getOrderQuantityLimitsFeatureFlag(): Promise {\r\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\r\n return false;\r\n }\r\n\r\n try {\r\n const featureStatuses = await this.props.data.featureState;\r\n const isQuantityLimitsFeatureEnabledInHq =\r\n featureStatuses.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\r\n )?.IsEnabled || false;\r\n if (!isQuantityLimitsFeatureEnabledInHq) {\r\n return false;\r\n }\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get feature states');\r\n return false;\r\n }\r\n\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\r\n return true;\r\n }\r\n try {\r\n const customerInfo = await this.props.data.customerInformation;\r\n return (\r\n !!customerInfo &&\r\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\r\n );\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get customer info');\r\n return false;\r\n }\r\n }\r\n\r\n private async _validateCart(retry: boolean = true): Promise {\r\n if (!this.isQuantityLimitsFeatureEnabled) {\r\n return AsyncResult.resolve();\r\n }\r\n\r\n const {\r\n data: { cart: cart }\r\n } = this.props;\r\n let cartResult: ICartState;\r\n try {\r\n cartResult = await cart;\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get cart');\r\n return AsyncResult.resolve();\r\n }\r\n const cartVersion = cartResult.cart?.Version;\r\n if (cartVersion) {\r\n try {\r\n const validationResult: CartLineValidationResults = await validateForCheckoutAsync({ callerContext: this.props.context.actionContext }, cartResult?.cart?.Id, cartVersion);\r\n this.setState({ cartlinesErrors: validationResult.ValidationFailuresByCartLines || [] });\r\n return AsyncResult.resolve();\r\n } catch (error) {\r\n if (retry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\r\n try {\r\n await cartResult.refreshCart({});\r\n } catch (refreshError) {\r\n this.props.telemetry.warning(refreshError);\r\n this.props.telemetry.debug('Unable to refresh Cart');\r\n return AsyncResult.resolve();\r\n }\r\n try {\r\n await this._validateCart(false);\r\n return AsyncResult.resolve();\r\n } catch (validateError) {\r\n this.props.telemetry.warning(validateError);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n return AsyncResult.resolve();\r\n }\r\n }\r\n\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n return AsyncResult.resolve();\r\n }\r\n } else {\r\n this.props.telemetry.warning('Cart version not found for Cart validation request.');\r\n return AsyncResult.resolve();\r\n }\r\n }\r\n\r\n private _generateAddToOrderTemplateDialogResources(resources: ICartResources): IAddToOrderTemplateDialogResources {\r\n return {\r\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\r\n\r\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\r\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\r\n\r\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\r\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\r\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\r\n\r\n selectTemplatesText: resources.selectTemplatesText,\r\n addToTemplateButtonText: resources.addToTemplateButtonText,\r\n lineItemsText: resources.lineItemsText\r\n };\r\n }\r\n\r\n private _generateItemAddedToOrderTemplateDialogResources(resources: ICartResources): IItemAddedToOrderTemplateDialogResources {\r\n return {\r\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\r\n continueShoppingButtonText: resources.continueShoppingButtonText,\r\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\r\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\r\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\r\n freePriceText: resources.freePriceText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText\r\n };\r\n }\r\n\r\n private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources: ICartResources): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\r\n return {\r\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\r\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\r\n updateQuantityButtonText: resources.updateQuantityButtonText,\r\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\r\n };\r\n }\r\n\r\n private _generateOrderTemplateNameDialogResources(resources: ICartResources): IOrderTemplateNameDialogResources {\r\n return {\r\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\r\n orderTemplateTitleLabel: resources.orderTemplateTitle,\r\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\r\n orderTemplateDescription: resources.createOrderTemplateDescription,\r\n\r\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\r\n\r\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\r\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\r\n };\r\n }\r\n}\r\nexport default CartView;\r\n\r\nfunction _renderBackToShoppingButton(resources: ICartResources): JSX.Element | null {\r\n return (\r\n \r\n {resources.backToShoppingButtonTitle}\r\n \r\n );\r\n}\r\n\r\nfunction _goToPreviousPage(): void {\r\n window.history.back();\r\n}\r\n\r\nconst _renderBOPISBlock = (cartLine: ICartlinesViewProps, resources: ICartResources, storeSelector: React.ReactNode | undefined): JSX.Element | null => {\r\n if (!cartLine.pickUpInStore || !storeSelector) {\r\n return null;\r\n }\r\n\r\n const { shipInsteadDisplayText, shipToAddressDisplayText, pickItUpDisplayText, pickUpAtStoreWithLocationText, changeStoreDisplayText } = resources;\r\n\r\n const isBopisSelected = cartLine.pickUpInStore.isBopisSelected;\r\n const toggleBopis = (event: React.MouseEvent) => { return cartLine.pickUpInStore && cartLine.pickUpInStore.callbacks.toggleBopis(!isBopisSelected); };\r\n const changeStore = (event: React.MouseEvent) => { return cartLine.pickUpInStore && cartLine.pickUpInStore.callbacks.toggleBopis(true); };\r\n\r\n return (\r\n \r\n
\r\n {isBopisSelected ? {pickUpAtStoreWithLocationText} : {shipToAddressDisplayText}}\r\n
\r\n {\r\n isBopisSelected &&\r\n
\r\n {cartLine.pickUpInStore.orgUnitName}\r\n \r\n
\r\n }\r\n \r\n
\r\n );\r\n};\r\n\r\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\r\n if (!errorData || errorData.errors.length === 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n {\"Please review cart errors before proceeding to checkout\"}\r\n \r\n );\r\n};\r\n\r\nconst _renderGIftCardError = (props: ICartViewProps & ICartProps<{}>): JSX.Element | null => {\r\n function checkAvailability(arr:any, val:string) {\r\n return arr.some(function(arrVal:any) {\r\n return val === arrVal.data?.product?.ItemId;\r\n });\r\n }\r\n let hasGiftCard = checkAvailability(props.cartlines, \"GiftCard\");\r\n let cartlinesLength = props.cartlines?.length || 0;\r\n if(hasGiftCard && cartlinesLength > 1) {\r\n return (\r\n
\r\n {props.config.giftCardErrorMessage || \"At this stage, we cannot process gift cards with product. Please purchase gift cards in a separate transaction.\"}\r\n
\r\n );\r\n } else {\r\n return null\r\n }\r\n};\r\n\r\nfunction _renderProgressBar(percentFilled: number): JSX.Element | null {\r\n return
\r\n
\r\n
\r\n
\r\n
\r\n}\r\n\r\nfunction _renderGiftWithPurchasMessage(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n const ogtyAmount = 50;\r\n const perSpend = 200;\r\n \r\n const OrderSubTotal = props.data.cart.result?.cart?.TotalAmount;\r\n if (!props.config.ourGiftToYou || !OrderSubTotal || props.cartlines?.some(line => line.data?.cartline.ItemId === \"GiftCard\")) {\r\n return null;\r\n }\r\n let amountOf50s = Math.floor(OrderSubTotal/perSpend);\r\n if(amountOf50s > 0) {\r\n return
\r\n {_renderProgressBar((OrderSubTotal%perSpend) / perSpend * 100)}\r\n
\r\n You have qualified for ${ogtyAmount * amountOf50s} in promotional vouchers. Spend another ${Math.ceil(perSpend - (OrderSubTotal%perSpend))} to receive an additional ${ogtyAmount} voucher\r\n
\r\n
\r\n } else {\r\n return
\r\n {_renderProgressBar(OrderSubTotal / perSpend * 100)}\r\n
\r\n Spend an additional ${Math.ceil(perSpend - (OrderSubTotal%perSpend))} to receive a ${ogtyAmount} promotional voucher\r\n
\r\n
\r\n }\r\n}\r\n\r\nconst _renderOrderSummarylines = (orderSummaryLines: IOrderSummaryLines | undefined, OrderSummaryItems: INodeProps, props: ICartViewProps & ICartProps<{}>): JSX.Element | null => {\r\n if (!orderSummaryLines) {\r\n return null;\r\n }\r\n return (\r\n \r\n {_renderGiftWithPurchasMessage(props)}\r\n {props.promoCode}\r\n {_renderSubTotal(props)}\r\n {orderSummaryLines.totalDiscounts ? orderSummaryLines.totalDiscounts : null}\r\n {orderSummaryLines.shipping}\r\n {props.config.hideTaxLine ? null : orderSummaryLines.tax}\r\n {_renderAmountDue(props)}\r\n {/* {_renderTotalSavings(props)} */}\r\n \r\n );\r\n};\r\n\r\nfunction _renderSubTotal(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n const OrderSubTotal = props.data.cart.result?.cart?.NetPrice;\r\n return (\r\n

\r\n {OrderSubTotal && OrderSubTotal > 0 ? (\r\n <>\r\n {props.resources.subTotalHeadingLabel}\r\n \r\n \r\n ) : null}\r\n

\r\n );\r\n}\r\n\r\n// function _renderTax(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n// const discountAmount = props.cart && props.cart.cart.DiscountAmount || 0;\r\n// const taxLabel = discountAmount > 0? props.resources.estimatedShippingLabel : props.resources.estimatedTaxLabel;\r\n// return (\r\n//

\r\n// {taxLabel}\r\n// {props.data.cart.result?.cart?.TaxAmount && props.data.cart.result?.cart?.TaxAmount > 0 ? (\r\n// \r\n// ) : (\r\n// {props.resources.yetToBeCalculatedText}\r\n// )}\r\n//

\r\n// );\r\n// }\r\n\r\nfunction _renderAmountDue(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n return (\r\n

\r\n {props.resources.totalAmountLabel}\r\n {props.data.cart.result?.cart?.TotalAmount || props.data.cart.result?.cart?.TotalAmount === 0 ? (\r\n \r\n ) : (\r\n {props.resources.yetToBeCalculatedText}\r\n )}\r\n

\r\n );\r\n}\r\n\r\n// function _renderTotalSavings(props: ICartViewProps): JSX.Element | null {\r\n\r\n// const DiscountAmountWithoutTax = props.data.cart.result?.cart?.DiscountAmountWithoutTax;\r\n// return (\r\n//

\r\n// {DiscountAmountWithoutTax && DiscountAmountWithoutTax > 0 ? (\r\n// <>\r\n// {props.resources.totalSavings}\r\n// \r\n// \r\n// ) : null}\r\n//

\r\n// );\r\n// }","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport msdyn365Commerce from '@msdyn365-commerce/core';\r\nimport { ICheckoutViewProps, IEmailDelivery, ILineItem, ILineItemDeliveryGroup, ILineItems, IPickUpAtStore } from '@msdyn365-commerce-modules/checkout';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport * as MsDyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\nimport { ICheckoutProps } from '../definition-extensions/checkout.ext.props.autogenerated';\r\n\r\n\r\nexport const PickUpAtStoreComponent: React.FC = ({ PickUpAtStore, label, location }) => (\r\n \r\n {label}\r\n {location}\r\n \r\n);\r\n\r\nexport const EmailDeliveryComponent: React.FC = ({ EmailDelivery, label }) => (\r\n \r\n {label}\r\n \r\n);\r\n\r\nexport const LineItemComponent: React.FC = ({ LineItem, item, pickUpAtStore, emailDelivery }) => (\r\n \r\n {item}\r\n {pickUpAtStore && }\r\n {emailDelivery && }\r\n \r\n);\r\n\r\nexport const LineItemGroupComponent: React.FC = ({ LineItemDeliveryGroup, LineItemList, heading, lineItems }) => (\r\n \r\n {heading}\r\n \r\n {lineItems.map(lineItem => (\r\n \r\n ))}\r\n \r\n \r\n);\r\n\r\nexport const LineItemsComponent: React.FC = ({ LineItems, Header, heading, editLink, itemsForPickup, itemsForShip, itemsForEmail }) => (\r\n \r\n \r\n {heading}\r\n {editLink}\r\n \r\n {itemsForPickup && }\r\n {itemsForEmail && }\r\n {itemsForShip && }\r\n \r\n);\r\n\r\nfunction _renderOtherCharges(props: ICheckoutViewProps): React.ReactNode | null{\r\n const chargeAmountInclTax = props.data.checkout.result?.checkoutCart.cart.ChargeAmount && props.data.checkout.result?.checkoutCart.cart.ChargeAmount || 0;\r\n const shippingCharges = props.data.checkout.result?.checkoutCart.cart.ShippingChargeAmount && props.data.checkout.result?.checkoutCart.cart.ShippingChargeAmount || 0;\r\n const chargeLines = props.data.checkout.result?.checkoutCart.cart.ChargeLines;\r\n\r\n let otherChargesAmountFromLines = 0;\r\n let totalChargeAmountFromLines = 0;\r\n let chargesOverriden = false;\r\n let displayOtherChargesAmount = 0;\r\n let shippingChargesFromLines = 0;\r\n const freightChargeCode = props.context.app.config.freightChargeCode;\r\n\r\n if(chargeLines) {\r\n chargeLines.forEach(chargeLine => {\r\n const chargeAmountInclTaxLocal = chargeLine.CalculatedAmount ? chargeLine.CalculatedAmount : 0;\r\n if (chargeLine.ChargeCode != freightChargeCode) {\r\n otherChargesAmountFromLines += chargeAmountInclTaxLocal;\r\n }\r\n if (chargeLine.ChargeCode == freightChargeCode){\r\n shippingChargesFromLines += chargeAmountInclTaxLocal;\r\n }\r\n });\r\n }\r\n\r\n if(shippingChargesFromLines == 0 && shippingCharges != shippingChargesFromLines)\r\n {\r\n totalChargeAmountFromLines = shippingCharges + otherChargesAmountFromLines;\r\n }\r\n else{\r\n totalChargeAmountFromLines = shippingChargesFromLines + otherChargesAmountFromLines;\r\n }\r\n \r\n chargesOverriden = totalChargeAmountFromLines != chargeAmountInclTax;\r\n displayOtherChargesAmount = chargesOverriden ? 0 : otherChargesAmountFromLines;\r\n if (displayOtherChargesAmount == 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n

\r\n {displayOtherChargesAmount && displayOtherChargesAmount > 0 ? (\r\n <>\r\n Other charges\r\n \r\n \r\n ) : null}\r\n

\r\n );\r\n}\r\n\r\n\r\nfunction _renderShippingInclTaxes(props: ICheckoutViewProps): React.ReactNode | null{\r\n const chargeLines = props.data.checkout.result?.checkoutCart.cart.ChargeLines;\r\n let chargeAmountInclTax = 0;\r\n if(chargeLines) {\r\n chargeLines.forEach(chargeLine => {\r\n if (chargeLine.IsShipping) {\r\n const chargeAmountInclTaxLocal = chargeLine.GrossAmount ? chargeLine.GrossAmount : 0;\r\n chargeAmountInclTax += chargeAmountInclTaxLocal;\r\n }\r\n });\r\n }\r\n if (chargeAmountInclTax == 0) {\r\n return props.orderSummary?.lines?.shipping;\r\n }\r\n\r\n return (\r\n

\r\n {chargeAmountInclTax && chargeAmountInclTax > 0 ? (\r\n <>\r\n {props.resources.shippingLabel}\r\n \r\n \r\n ) : null}\r\n

\r\n );\r\n}\r\n\r\nfunction _renderTotalSavings(props: ICheckoutViewProps): JSX.Element | null {\r\n\r\n const DiscountAmount = props.data.checkout.result?.checkoutCart.cart.DiscountAmount;\r\n return (\r\n

\r\n {DiscountAmount && DiscountAmount > 0 ? (\r\n <>\r\n {props.resources.totalSavingsLabel}\r\n \r\n \r\n ) : null}\r\n

\r\n );\r\n}\r\n\r\nconst _renderOrderSummarylines = (props: ICheckoutViewProps & ICheckoutProps<{}>): JSX.Element | null => {\r\n const isB2B = props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits === 'b2b';\r\n const {orderSummary } = props;\r\n if (!orderSummary) {\r\n return null;\r\n }\r\n return (\r\n
\r\n {orderSummary.heading}\r\n
\r\n {orderSummary.lines && (\r\n <>\r\n {isB2B ? orderSummary.lines.subtotal : _renderSubTotal(props)}\r\n {isB2B ? null : orderSummary.lines.totalDiscounts}\r\n {_renderShippingInclTaxes(props)}\r\n {_renderOtherCharges(props)}\r\n {/*hide on us*/}\r\n {props.config.hideTaxLine ? null : orderSummary.lines.tax}\r\n {_renderTotalOrder(props)}\r\n {orderSummary.lines.loyalty}\r\n {orderSummary.lines.giftCard}\r\n {isB2B ? null : orderSummary.lines.orderTotal}\r\n {isB2B? null : _renderTotalSavings(props)}\r\n \r\n )}\r\n
\r\n {_renderFreeShippingMessage(props)}\r\n {_getCheckoutSummaryText(props)}\r\n
\r\n );\r\n};\r\n\r\nfunction _renderFreeShippingMessage(props: ICheckoutViewProps & ICheckoutProps<{}>): JSX.Element | null {\r\n const shippingAmount = props.data.checkout.result?.checkoutCart.cart.DeliveryModeChargeAmount || 0;\r\n const OrderSubTotal = (props.data.checkout.result?.checkoutCart.cart.AmountDue || 0) - shippingAmount;\r\n \r\n const freeShippingAmount = props.config.freeShippingAmount;\r\n\r\n if (!freeShippingAmount || !OrderSubTotal || OrderSubTotal >= freeShippingAmount) {\r\n return null;\r\n }\r\n return
\r\n Spend an additional ${Math.ceil(freeShippingAmount - OrderSubTotal)} to get FREE SHIPPING\r\n
\r\n}\r\n\r\nfunction _renderSubTotal(props: ICheckoutViewProps): JSX.Element | null {\r\n var subtotal=0;\r\n props.data.checkout.result?.checkoutCart.cart.CartLines?.forEach((item)=>{\r\n subtotal += item.Price! * item.Quantity!;\r\n });\r\n const OrderSubTotal = subtotal;//props.data.checkout.result?.checkoutCart.cart.NetPrice;\r\n return (\r\n

\r\n {OrderSubTotal && OrderSubTotal > 0 ? (\r\n <>\r\n {props.resources.subTotalLabel}\r\n \r\n \r\n ) : null}\r\n

\r\n );\r\n}\r\nfunction _renderTotalOrder(props: ICheckoutViewProps): JSX.Element | null {\r\n\r\n const OrderTotal = props.data.checkout.result?.checkoutCart.cart.TotalAmount;\r\n return (\r\n

\r\n {OrderTotal && OrderTotal > 0 ? (\r\n <>\r\n {props.resources.totalAmountLabel}\r\n \r\n \r\n ) : null}\r\n

\r\n );\r\n}\r\nconst _getCheckoutSummaryText = (props: ICheckoutViewProps & ICheckoutProps<{}>): React.ReactNode | undefined => {\r\n const { paragraph } = props.config;\r\n\r\n return (\r\n paragraph && (\r\n \r\n )\r\n );\r\n};\r\nconst CheckoutView: React.FC> = props => {\r\n const {\r\n canShow,\r\n checkoutProps,\r\n headerProps,\r\n hasSalesOrder,\r\n bodyProps,\r\n mainProps,\r\n mainControlProps,\r\n sideProps,\r\n sideControlFirstProps,\r\n sideControlSecondProps,\r\n termsAndConditionsProps,\r\n orderConfirmation,\r\n loading,\r\n alert,\r\n title,\r\n guidedForm,\r\n lineItems,\r\n placeOrderButton,\r\n termsAndConditions,\r\n keepShoppingButton\r\n } = props;\r\n\r\n let isBusy = false;\r\n if(msdyn365Commerce.isBrowser) {\r\n const url: string = decodeURI(window.location.search);\r\n const urlParams: URLSearchParams = new URLSearchParams(url);\r\n if (urlParams.get('paymentMethod') === 'AP' && urlParams.has('orderToken')) {\r\n const orderToken = urlParams.get('orderToken');\r\n const afterpayStatus = urlParams.get('status') || 'FAILURE';\r\n\r\n if (afterpayStatus === 'SUCCESS' && orderToken) {\r\n isBusy = true;\r\n }\r\n }\r\n }\r\n\r\n const isB2B = props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits === 'b2b';\r\n function _renderPlaceOrderCopy(): JSX.Element | null {\r\n return (\r\n
\r\n By clicking Place order you agree to your signed terms of business, please contact your account manager for further information.\r\n
\r\n )\r\n }\r\n\r\n return (\r\n \r\n {!hasSalesOrder && {title}}\r\n {!hasSalesOrder &&\r\n \r\n {loading}\r\n {\r\n isBusy ? (\r\n
\r\n
\r\n
\r\n ) : null\r\n }\r\n {alert}\r\n {canShow && (\r\n <>\r\n \r\n {guidedForm}\r\n \r\n {termsAndConditions}\r\n \r\n \r\n {placeOrderButton}\r\n {keepShoppingButton}\r\n \r\n {isB2B? _renderPlaceOrderCopy() : null}\r\n \r\n \r\n {_renderOrderSummarylines(props)}\r\n \r\n \r\n {termsAndConditions}\r\n \r\n {placeOrderButton}\r\n {keepShoppingButton}\r\n \r\n {lineItems && }\r\n \r\n \r\n {termsAndConditions}\r\n \r\n {placeOrderButton}\r\n {keepShoppingButton}\r\n \r\n \r\n \r\n )}\r\n \r\n }\r\n {hasSalesOrder && orderConfirmation}\r\n \r\n );\r\n};\r\n\r\nexport default CheckoutView;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport {\r\n ICartlinesViewProps,\r\n ICartResources,\r\n ICartViewProps,\r\n IOrderSummaryErrors\r\n} from '@msdyn365-commerce-modules/cart';\r\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { Button, INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport {\r\n IAddToOrderTemplateDialogResources, IDuplicateItemsWhenAddingToOrderTemplateDialogResources, IItemAddedToOrderTemplateDialogResources,\r\n IOrderTemplateNameDialogResources, IWishlistActionSuccessResult, PriceComponent\r\n} from '@msdyn365-commerce/components';\r\nimport { IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport { AsyncResult, CartLine, CartLineValidationResults, LineDataValidationFailure } from '@msdyn365-commerce/retail-proxy';\r\nimport { validateForCheckoutAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport * as React from 'react';\r\nimport { CartLineItems } from '../../../components/citta-cart/cart-line-items';\r\nimport { ICartProps } from '../definition-extensions/cart.ext.props.autogenerated';\r\n\r\nimport CittaTelemetry from '../../../common/telemetry/citta-telemetry';\r\n// import PriceComponent from '../../../components/price-component'\r\n\r\ninterface ICartViewState {\r\n cartlinesErrors: LineDataValidationFailure[];\r\n}\r\n\r\n/**\r\n *\r\n * CartView\r\n * @extends {React.PureComponent}\r\n */\r\nexport class CartView extends React.PureComponent, ICartViewState> {\r\n private cittaTelemetry: CittaTelemetry = new CittaTelemetry(this.props.context.app.config.cittaInstrumentationKey);\r\n\r\n public state: ICartViewState = {\r\n cartlinesErrors: []\r\n };\r\n\r\n private createLogMessage = (message: string): string => {\r\n const url: string = decodeURI(window.location.search);\r\n const origin = window.location.origin;\r\n const logMessage = `${message} Url: - ${url} - Origin: ${origin}`;\r\n return logMessage;\r\n }\r\n\r\n private logMessage = (message: string): void => {\r\n this.cittaTelemetry.trace(this.createLogMessage(message));\r\n }\r\n\r\n // private isQuantityLimitsFeatureEnabled: boolean = true;\r\n private isQuantityLimitsFeatureEnabled: boolean = false;\r\n\r\n\r\n constructor(props: ICartViewProps & ICartProps<{}>) {\r\n super(props);\r\n\r\n this._renderCartlines = this._renderCartlines.bind(this);\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n // if (this.isQuantityLimitsFeatureEnabled) {\r\n // await this._validateCart();\r\n // }\r\n this.isQuantityLimitsFeatureEnabled = await this.getOrderQuantityLimitsFeatureFlag();\r\n if (this.isQuantityLimitsFeatureEnabled) {\r\n await this._validateCart();\r\n }\r\n\r\n this.logMessage('landed on cart page');\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n return (\r\n
\r\n {this.props.title}\r\n \r\n {this._renderCartlines()}\r\n \r\n {this.props.orderSummaryHeading &&\r\n < Node {...this.props.OrderSummaryWrapper}>\r\n {this.props.orderSummaryHeading}\r\n {_renderOrderSummarylines(this.props.orderSummaryLineitems, this.props.OrderSummaryItems, this.props)}\r\n {this.state.cartlinesErrors.length > 0 ? _renderErrorBlock(this.props.OrderSummaryErrors) : null}\r\n {_renderUnder200sError(this.props)}\r\n {this.props.config.freightCalculationText ?
{this.props.config.freightCalculationText}
: null}\r\n
\r\n {this.props.checkoutAsSignInUserButton}\r\n {this.props.context.request && this.props.context.request.user && this.props.context.request.user.isAuthenticated ? null :
{this.props.resources.orLabel}
}\r\n
\r\n {_renderBackToShoppingButton(this.props.resources)}\r\n {this.props.checkoutAsGuestButton}\r\n
\r\n
\r\n \r\n }\r\n {this.props.storeSelector}\r\n
\r\n );\r\n }\r\n\r\n private _renderCartlines(): JSX.Element[] | JSX.Element {\r\n const { emptyCartText } = this.props.resources;\r\n\r\n if (this.props.cartLoadingStatus) {\r\n return <>{this.props.cartLoadingStatus};\r\n }\r\n const cartLines = this._getCartLines();\r\n if (cartLines) {\r\n return cartLines.map((cartLine, index) => {\r\n return (\r\n
\r\n {cartLine.cartline}\r\n {_renderBOPISBlock(cartLine, this.props.resources, this.props.storeSelector)}\r\n
\r\n {cartLine.addToWishlist}\r\n {cartLine.remove}\r\n
\r\n
\r\n );\r\n });\r\n } else {\r\n return (this.props.cartDataResult ?\r\n (\r\n
\r\n

{emptyCartText}

\r\n {this.props.backToShoppingButton}\r\n
\r\n ) : <>{this.props.waitingComponent}\r\n );\r\n }\r\n }\r\n\r\n private _getCartLines(): ICartlinesViewProps[] | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n wishlists: { result: wishlists },\r\n orderTemplates: { result: orderTemplates },\r\n customerInformation: { result: customerInformation }\r\n },\r\n context: {\r\n request: {\r\n channel: {\r\n PickupDeliveryModeCode\r\n } = { PickupDeliveryModeCode: undefined }\r\n }\r\n },\r\n config: config,\r\n telemetry,\r\n resources,\r\n modules\r\n } = this.props;\r\n\r\n const imageSettings = this._getImageSettings(config.imageSettings);\r\n\r\n const cartlinesErrors: LineDataValidationFailure[] = this.state.cartlinesErrors;\r\n let storeSelectorId: string = '';\r\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n storeSelectorId = modules.storeSelector[0].id;\r\n }\r\n return this.props.data.products && this.props.data.products.result && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0 ? (\r\n CartLineItems({\r\n cartlines: cart.cart.CartLines,\r\n storeSelectorModuleId: storeSelectorId,\r\n cartlinesErrors: cartlinesErrors,\r\n products: this.props.data.products.result,\r\n productAvailabilites: this.props.data.productAvailabilites.result,\r\n productDeliveryOptions: this.props.data.deliveryOptions.result,\r\n imageSettings: imageSettings,\r\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n maxCartlineQuantity: this.props.context.app.config.maxQuantityForCartLineItem,\r\n gridSettings: this.props.context.request.gridSettings!,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n resources: {\r\n sizeString: \"Size:\" || resources.productDimensionTypeSize,\r\n colorString: \"Colour:\" || resources.productDimensionTypeColor,\r\n configString: resources.productDimensionTypeConfiguration,\r\n styleString: resources.productDimensionTypeStyle,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\r\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\r\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\r\n discountStringText: resources.discountStringText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText,\r\n shippingChargesText: resources.shippingCharges\r\n },\r\n telemetry: telemetry,\r\n addToWishlistButtonText: resources.addToWishlistButtonText,\r\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\r\n removeButtonText: resources.removeCartButtonText,\r\n shipItText: resources.shipInsteadDisplayText,\r\n pickitUpText: resources.pickItUpDisplayText,\r\n changeStoreText: resources.changeStoreDisplayText,\r\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\r\n outOfStockText: resources.outOfStockErrorMessage,\r\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\r\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\r\n cartState: this.props.data.cart.result,\r\n orgUnitLocations: this.props.data.orgUnitLocations.result,\r\n removeItemClickHandler: this._removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this._moveToWishlistSuccessHandler,\r\n updateCartLinesQuantitySuccessHandler: this._updateCartlineQuantity,\r\n locationChangedHandler: this._fulfillmentStoreIdUpdated,\r\n wishlists: wishlists,\r\n defaultWishlistName: resources.defaultWishlistName,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n includeErrors: config.showOutOfStockErrors,\r\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\r\n telemetryContent: this.props.telemetryContent,\r\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\r\n\r\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\r\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\r\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources),\r\n\r\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\r\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\r\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\r\n orderTemplates: orderTemplates,\r\n customerInformation: customerInformation\r\n })\r\n ) : null;\r\n }\r\n\r\n private _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\r\n return imageSettings || {\r\n viewports: {\r\n xs: { q: `w=80&h=94&m=6`, w: 0, h: 0 },\r\n sm: { q: `w=148&h=174&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=148&h=174&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n }\r\n\r\n private _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\r\n if (this.props.data.cart.result) {\r\n const input = {\r\n cartLineIds: [cartlineToRemove.LineId!.toString()]\r\n };\r\n this.props.data.cart.result.removeCartLines(input)\r\n .then(() => {\r\n this._validateCart()\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n })\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to Remove Cart Line');\r\n });\r\n }\r\n }\r\n\r\n private _moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\r\n if (result.status === 'ADDED' && cartline) {\r\n this._removeItemFromCartHandler(cartline);\r\n }\r\n }\r\n\r\n private _updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number): boolean => {\r\n if (this.props.data.cart.result) {\r\n const input = {\r\n cartLineId: cartlineToUpdate.LineId!.toString(),\r\n newQuantity: quantity,\r\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: this.isQuantityLimitsFeatureEnabled }\r\n };\r\n this.props.data.cart.result.updateCartLineQuantity(input)\r\n .then((result: ICartActionResult) => {\r\n if (result.status === 'SUCCESS') {\r\n this._validateCart().catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n return true;\r\n }\r\n return false;\r\n })\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to update Cart Line quantity');\r\n });\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _fulfillmentStoreIdUpdated = () => {\r\n this._validateCart().catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n }\r\n\r\n /**\r\n * Get order quantity limit feature flag.\r\n * @returns True if flag is enabled, false otherwise.\r\n */\r\n private async getOrderQuantityLimitsFeatureFlag(): Promise {\r\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\r\n return false;\r\n }\r\n\r\n try {\r\n const featureStatuses = await this.props.data.featureState;\r\n const isQuantityLimitsFeatureEnabledInHq =\r\n featureStatuses.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\r\n )?.IsEnabled || false;\r\n if (!isQuantityLimitsFeatureEnabledInHq) {\r\n return false;\r\n }\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get feature states');\r\n return false;\r\n }\r\n\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\r\n return true;\r\n }\r\n try {\r\n const customerInfo = await this.props.data.customerInformation;\r\n return (\r\n !!customerInfo &&\r\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\r\n );\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get customer info');\r\n return false;\r\n }\r\n }\r\n\r\n private async _validateCart(retry: boolean = true): Promise {\r\n if (!this.isQuantityLimitsFeatureEnabled) {\r\n return AsyncResult.resolve();\r\n }\r\n\r\n const {\r\n data: { cart: cart }\r\n } = this.props;\r\n let cartResult: ICartState;\r\n try {\r\n cartResult = await cart;\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get cart');\r\n return AsyncResult.resolve();\r\n }\r\n const cartVersion = cartResult.cart?.Version;\r\n if (cartVersion) {\r\n try {\r\n const validationResult: CartLineValidationResults = await validateForCheckoutAsync({ callerContext: this.props.context.actionContext }, cartResult?.cart?.Id, cartVersion);\r\n this.setState({ cartlinesErrors: validationResult.ValidationFailuresByCartLines || [] });\r\n return AsyncResult.resolve();\r\n } catch (error) {\r\n if (retry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\r\n try {\r\n await cartResult.refreshCart({});\r\n } catch (refreshError) {\r\n this.props.telemetry.warning(refreshError);\r\n this.props.telemetry.debug('Unable to refresh Cart');\r\n return AsyncResult.resolve();\r\n }\r\n try {\r\n await this._validateCart(false);\r\n return AsyncResult.resolve();\r\n } catch (validateError) {\r\n this.props.telemetry.warning(validateError);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n return AsyncResult.resolve();\r\n }\r\n }\r\n\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n return AsyncResult.resolve();\r\n }\r\n } else {\r\n this.props.telemetry.warning('Cart version not found for Cart validation request.');\r\n return AsyncResult.resolve();\r\n }\r\n }\r\n\r\n private _generateAddToOrderTemplateDialogResources(resources: ICartResources): IAddToOrderTemplateDialogResources {\r\n return {\r\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\r\n\r\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\r\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\r\n\r\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\r\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\r\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\r\n\r\n selectTemplatesText: resources.selectTemplatesText,\r\n addToTemplateButtonText: resources.addToTemplateButtonText,\r\n lineItemsText: resources.lineItemsText\r\n };\r\n }\r\n\r\n private _generateItemAddedToOrderTemplateDialogResources(resources: ICartResources): IItemAddedToOrderTemplateDialogResources {\r\n return {\r\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\r\n continueShoppingButtonText: resources.continueShoppingButtonText,\r\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\r\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\r\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\r\n freePriceText: resources.freePriceText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText\r\n };\r\n }\r\n\r\n private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources: ICartResources): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\r\n return {\r\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\r\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\r\n updateQuantityButtonText: resources.updateQuantityButtonText,\r\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\r\n };\r\n }\r\n\r\n private _generateOrderTemplateNameDialogResources(resources: ICartResources): IOrderTemplateNameDialogResources {\r\n return {\r\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\r\n orderTemplateTitleLabel: resources.orderTemplateTitle,\r\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\r\n orderTemplateDescription: resources.createOrderTemplateDescription,\r\n\r\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\r\n\r\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\r\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\r\n };\r\n }\r\n}\r\nexport default CartView;\r\n\r\nfunction _renderBackToShoppingButton(resources: ICartResources): JSX.Element | null {\r\n return (\r\n \r\n {resources.backToShoppingButtonTitle}\r\n \r\n );\r\n}\r\n\r\nfunction _goToPreviousPage(): void {\r\n window.history.back();\r\n}\r\n\r\nconst _renderBOPISBlock = (cartLine: ICartlinesViewProps, resources: ICartResources, storeSelector: React.ReactNode | undefined): JSX.Element | null => {\r\n if (!cartLine.pickUpInStore || !storeSelector) {\r\n return null;\r\n }\r\n\r\n const { shipInsteadDisplayText, shipToAddressDisplayText, pickItUpDisplayText, pickUpAtStoreWithLocationText, changeStoreDisplayText } = resources;\r\n\r\n const isBopisSelected = cartLine.pickUpInStore.isBopisSelected;\r\n const toggleBopis = (event: React.MouseEvent) => { return cartLine.pickUpInStore && cartLine.pickUpInStore.callbacks.toggleBopis(!isBopisSelected); };\r\n const changeStore = (event: React.MouseEvent) => { return cartLine.pickUpInStore && cartLine.pickUpInStore.callbacks.toggleBopis(true); };\r\n\r\n return (\r\n \r\n
\r\n {isBopisSelected ? {pickUpAtStoreWithLocationText} : {shipToAddressDisplayText}}\r\n
\r\n {\r\n isBopisSelected &&\r\n
\r\n {cartLine.pickUpInStore.orgUnitName}\r\n \r\n
\r\n }\r\n \r\n
\r\n );\r\n};\r\n\r\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\r\n if (!errorData || errorData.errors.length === 0) {\r\n return null;\r\n }\r\n return (\r\n \r\n {\"Please review cart errors before proceeding to checkout\"}\r\n \r\n );\r\n};\r\n\r\nconst _renderUnder200sError = (props:any): JSX.Element | null => {\r\n const OrderSubTotal = props.data.cart.result?.cart?.SubtotalAmount;\r\n const { request } = props.context;\r\n const market = request && request.apiSettings && request.apiSettings.oun;\r\n const isB2BI = market && market === \"B2BI\";\r\n let minimumOrder = 200;\r\n const discountLevel = props.data.customerInformation.result!.LineDiscountGroup;\r\n if(isB2BI) {\r\n switch(discountLevel){\r\n case \"Level 1\":\r\n minimumOrder = 1500;\r\n break;\r\n case \"Level 4\":\r\n minimumOrder = 500;\r\n break;\r\n case \"Level 5\":\r\n minimumOrder = 500;\r\n break;\r\n default:\r\n minimumOrder = 200;\r\n }\r\n }\r\n let isGiftCardOnly = props.data.cart.result?.cart && props.data.cart.result?.cart.CartLines && props.data.cart.result?.cart.CartLines.length === 1 && props.data.cart.result?.cart.CartLines[0].ItemId === \"GiftCard\";\r\n if(!isGiftCardOnly && OrderSubTotal < minimumOrder) {\r\n return (\r\n
\r\n
Your order must be a minimum of ${minimumOrder}. Please update your cart to place an order.
\r\n
\r\n );\r\n }\r\n return null\r\n};\r\n\r\nconst _renderOrderSummarylines = (orderSummaryLines: IOrderSummaryLines | undefined, OrderSummaryItems: INodeProps, props: ICartViewProps & ICartProps<{}>): JSX.Element | null => {\r\n if (!orderSummaryLines) {\r\n return null;\r\n }\r\n const isB2B = props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits === 'b2b';\r\n return (\r\n \r\n {isB2B? null : props.promoCode}\r\n {isB2B? orderSummaryLines.subtotal : _renderSubTotal(props)}\r\n {props.config.hideTaxLine ? null : _renderTax(props)}\r\n {isB2B ? orderSummaryLines.subtotal : (orderSummaryLines.totalDiscounts ? orderSummaryLines.subtotal : null)}\r\n {isB2B? null : _renderAmountDue(props)}\r\n {isB2B? null : _renderTotalSavings(props)}\r\n \r\n );\r\n};\r\n\r\nfunction _renderSubTotal(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n const OrderSubTotal = props.data.cart.result?.cart?.NetPrice;\r\n return (\r\n

\r\n {OrderSubTotal && OrderSubTotal > 0 ? (\r\n <>\r\n {props.resources.subTotalHeadingLabel}\r\n \r\n \r\n ) : null}\r\n

\r\n );\r\n}\r\n\r\nfunction _renderTax(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n const discountAmount = props.cart && props.cart.cart.DiscountAmount || 0;\r\n const taxLabel = discountAmount > 0? props.resources.estimatedShippingLabel : props.resources.estimatedTaxLabel;\r\n return (\r\n

\r\n {taxLabel}\r\n {props.data.cart.result?.cart?.TaxAmount && props.data.cart.result?.cart?.TaxAmount > 0 ? (\r\n \r\n ) : (\r\n {props.resources.yetToBeCalculatedText}\r\n )}\r\n

\r\n );\r\n}\r\n\r\nfunction _renderAmountDue(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n return (\r\n

\r\n {props.resources.amountDueLabel}\r\n {props.data.cart.result?.cart?.TotalAmount || props.data.cart.result?.cart?.TotalAmount === 0 ? (\r\n \r\n ) : (\r\n {props.resources.yetToBeCalculatedText}\r\n )}\r\n

\r\n );\r\n}\r\n\r\nfunction _renderTotalSavings(props: ICartViewProps): JSX.Element | null {\r\n\r\n const DiscountAmountWithoutTax = props.data.cart.result?.cart?.DiscountAmountWithoutTax;\r\n return (\r\n

\r\n {DiscountAmountWithoutTax && DiscountAmountWithoutTax > 0 ? (\r\n <>\r\n {props.resources.totalSavings}\r\n \r\n \r\n ) : null}\r\n

\r\n );\r\n}","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ICartIconViewProps } from './cart-icon';\nimport { IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\n\nconst _renderCartlines = (cartLines: IFlyoutCartLineItemViewProps[] | undefined, props: ICartIconViewProps): JSX.Element[] | null => {\n if (!cartLines) {\n props.context.telemetry.error('Cartlines content is empty, module wont render');\n return null;\n }\n return cartLines.map((cartLine, index) => {\n return (\n \n {cartLine.cartline}\n {cartLine.storeLocation}\n {cartLine.remove}\n \n );\n });\n};\n\nconst CartIconView: React.FC = (props: ICartIconViewProps) => (\n \n {props.cartIcon}\n {props.FlyoutContainer ? (\n \n {props.flyoutTitle}\n {props.checkoutBlockedDueToUnavailableFunds}\n {_renderCartlines(props.cartlines, props)}\n {props.totalPrice}\n {props.checkoutAsSignInUserButton}\n {props.checkoutAsGuestButton}\n {props.goToCartButton}\n \n ) : (\n false\n )}\n \n);\n\nexport default CartIconView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IPromoBannerViewProps } from './promo-banner';\n\nconst PromoBannerView: React.FC = props => {\n const {\n promoBannerProps,\n contentProps,\n closeButton,\n bannerMessages,\n promoBannerTextProps,\n promoBannerLinksProps,\n carouselProps,\n promoBannerText,\n handleLinks,\n handleText\n } = props;\n\n const slides =\n bannerMessages &&\n bannerMessages.map((message, index) => {\n return (\n \n {promoBannerText}\n {message.text && }\n {message.links && message.links.length > 0 && (\n \n )}\n \n );\n });\n\n return (\n \n \n {closeButton}\n \n );\n};\nexport default PromoBannerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductDimensionConfigureDropdownViewProps, IProductDimensionConfigureViewProps } from '@msdyn365-commerce/components';\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IQuickOrderGridViewProps, IQuickOrderGridFormViewProps } from './index';\n\n/**\n * Render product dimension/configure dropdown.\n * @param dropdown -- Product dimension drop down.\n * @returns Dropdown.\n */\nconst renderConfigureDropdown = (dropdown: IProductDimensionConfigureDropdownViewProps): JSX.Element => {\n const { containerProps, labelContainerProps, heading, errors, select } = dropdown;\n\n return (\n \n {heading}\n {errors}\n {select}\n \n );\n};\n\n/**\n * Render product dimension/configure container.\n * @param configure -- Product dimension configuration.\n * @returns Container to have dimension dropdown.\n */\nconst renderConfigure = (configure?: IProductDimensionConfigureViewProps): JSX.Element | null => {\n if (configure !== undefined) {\n const { containerProps, dropdowns } = configure;\n\n return {dropdowns.map(renderConfigureDropdown)};\n }\n return null;\n};\n\n/**\n * Render product dimension/configure container.\n * @param form -- Form props.\n * @param isMobileView -- Flag to check mobile view.\n * @param quickOrderForm - Form component container.\n * @param quickOrderProductContent - Form product component.\n * @param quickOrderMessageContent - Form user message component.\n * @param configure - Product Dimension component.\n * @returns Jsx element of quick order form component.\n */\nconst renderForm = (\n form: IQuickOrderGridFormViewProps,\n isMobileView: boolean,\n quickOrderForm: INodeProps,\n quickOrderProductContent: INodeProps,\n quickOrderMessageContent: INodeProps,\n configure?: IProductDimensionConfigureViewProps\n) => {\n return isMobileView ? (\n \n \n {form.product}\n {renderConfigure(configure)}\n {form.quantity}\n {form.userMessage}\n {form.addToListBtn}\n \n \n ) : (\n \n {form.userMessage}\n \n {form.product}\n {renderConfigure(configure)}\n {form.quantity}\n {form.addToListBtn}\n \n \n );\n};\n\n/**\n * Retrieves current sort criteria.\n * @param props - QuickOrder Grid view props.\n * @returns - Render View.\n */\nconst quickOrderGridView: React.FC = props => {\n const {\n quickOrderGridProps,\n contentProps,\n form,\n quickOrderGridForm,\n drawer,\n configure,\n quickOrderGridFormProductContent,\n quickOrderGridFormMsgContent,\n isMobileView,\n header,\n container,\n actions,\n orderActions\n } = props;\n\n return (\n \n {header}\n {actions && (\n \n {orderActions?.userMessage}\n {orderActions?.addProductListToBag}\n {orderActions?.removeProductList}\n \n )}\n \n \n {renderForm(\n form as IQuickOrderGridFormViewProps,\n isMobileView,\n quickOrderGridForm,\n quickOrderGridFormProductContent,\n quickOrderGridFormMsgContent,\n configure\n )}\n {props.bulkPurchase}\n \n \n {container}\n \n );\n};\n\nexport default quickOrderGridView;\n","import * as React from 'react';\r\n\r\nimport { Button, format } from '@msdyn365-commerce-modules/utilities';\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { IComponentProps } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { Coupon } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport {SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { getCartState } from '@msdyn365-commerce/global-state';\r\nimport { getByIdAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\n\r\nexport interface IPromoCodeProps extends IComponentProps<{}> {\r\n cart: ICartState | undefined;\r\n promoCodeHeadingText: string;\r\n appliedPromoCodeHeadingText: string;\r\n removePromoAriaLabelFormat: string;\r\n promoPlaceholderText: string;\r\n promoCodeApplyButtonText: string;\r\n collapseTimeOut: number;\r\n removePromoText: string;\r\n invalidPromoCodeErrorText: string;\r\n failedToAddPromoCodeErrorText: string;\r\n duplicatePromoCodeErrorText: string;\r\n failedToRemovePromoCodeErrorText: string;\r\n promoCodeApplyCallback?(): void;\r\n}\r\n\r\ninterface IPromoCodeState {\r\n isCollapseOpen: boolean;\r\n promoCodeInputValue: string;\r\n error: string;\r\n canApply: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The PromoCode component renders the promocode section.\r\n * @extends {React.PureComponent}\r\n */\r\nclass PromoCode extends React.Component {\r\n\r\n constructor(props: IPromoCodeProps, state: IPromoCodeState) {\r\n super(props);\r\n this.state = {\r\n isCollapseOpen: false,\r\n promoCodeInputValue: '',\r\n error: '',\r\n canApply: false\r\n };\r\n }\r\n\r\n public render(): JSX.Element {\r\n return (\r\n
\r\n
{this.props.promoCodeHeadingText}
\r\n {this._renderForm(this.props.promoPlaceholderText, this.props.promoCodeApplyButtonText, this.props.cart)}\r\n

{this.state.error}

\r\n {this._renderAppliedPromoCode(this.props)}\r\n
\r\n );\r\n }\r\n\r\n private _onInputChange = (e: React.ChangeEvent) => {\r\n const error = e.target.value === '' ? '' : this.state.error;\r\n this.setState({\r\n promoCodeInputValue: e.target.value, error: error,\r\n canApply: e.target.value ? true : false\r\n });\r\n }\r\n\r\n private _applyPromotion = (cartState: ICartState | undefined) => {\r\n if (!cartState || !cartState.cart) {\r\n return;\r\n }\r\n const appliedPromo = this.state.promoCodeInputValue;\r\n\r\n cartState.addPromoCode({ promoCode: appliedPromo })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n // show success text\r\n this.setState({ promoCodeInputValue: '', error: '', canApply: false});\r\n this._addProductToCart(appliedPromo);\r\n } else if (result.substatus === 'ALREADYADDED') {\r\n this.setState({ error: this.props.duplicatePromoCodeErrorText });\r\n } else {\r\n this.setState({ error: this.props.invalidPromoCodeErrorText });\r\n }\r\n })\r\n .catch(error => {\r\n this.setState({ error: this.props.failedToAddPromoCodeErrorText });\r\n });\r\n }\r\n\r\n private async _addProductToCart(appliedPromo: string): Promise {\r\n let productRecId = '';\r\n if(appliedPromo === 'GIFTSPRING') {\r\n productRecId = '5637359181';\r\n }\r\n const product: SimpleProduct|null = await getByIdAsync(\r\n { callerContext: this.props.context.actionContext },\r\n parseInt(productRecId, 10),\r\n this.props.context.request.apiSettings.channelId).catch(error => {\r\n return null\r\n }) ||{ RecordId: 0, ProductTypeValue: 0, BasePrice: 0, Price: 0, AdjustedPrice: 0 }; \r\n\r\n const cartState = await getCartState(this.props.context.actionContext);\r\n\r\n if (cartState && cartState.cart && cartState.cart.CartLines) {\r\n const addProductsToCartInput = {\r\n product: product,\r\n count: 1,\r\n // availableQuantity: 10,\r\n enableStockCheck: this.props.context.app.config.enableStockCheck,\r\n // isAddEmailDeliveryItemToCart: true,\r\n // customPrice: 100,\r\n // deliveryMode: emailDeliveryModeCode\r\n };\r\n let isAddedToCart:boolean = false;\r\n await cartState.addProductToCart(addProductsToCartInput)\r\n .then(async result => {\r\n if (result.status === 'SUCCESS') {\r\n isAddedToCart = true;\r\n window.location.reload();\r\n }\r\n })\r\n .catch(error => {\r\n console.log(error,'this is an error');\r\n });\r\n console.log(isAddedToCart)\r\n } \r\n }\r\n\r\n private _renderForm = (promoPlaceholderText: string, promoCodeApplyButtonText: string, cartState: ICartState | undefined) => {\r\n const _onSubmit = (event: React.FormEvent) => {event.preventDefault(); this._applyPromotion(cartState);};\r\n const _applyPromotion = (event: React.MouseEvent) => {this._applyPromotion(cartState);};\r\n\r\n return (\r\n
\r\n
\r\n \r\n \r\n {promoCodeApplyButtonText}\r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n private _removePromotion = (cartState: ICartState | undefined, event: React.MouseEvent) => {\r\n if (!cartState) {\r\n return;\r\n }\r\n const code = event.currentTarget.getAttribute('data-value') || '';\r\n cartState.removePromoCodes({\r\n promoCodes: [\r\n code\r\n ]\r\n })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n this.setState({ error: ''});\r\n }\r\n })\r\n .catch(() => {\r\n this.setState({ error: this.props.failedToRemovePromoCodeErrorText});\r\n });\r\n\r\n }\r\n private _calculateDiscount = (code: string, cartState: ICartState | undefined) => {\r\n if (!cartState || !cartState.cart || !cartState.cart.CartLines || cartState.cart.CartLines.length === 0 || !code) {\r\n return;\r\n }\r\n let discountAmount = 0;\r\n for (const line of cartState.cart.CartLines) {\r\n if (line.DiscountLines) {\r\n for (const discountLine of line.DiscountLines) {\r\n if (discountLine.DiscountCode === code) {\r\n discountAmount += discountLine.DiscountCost!;\r\n }\r\n }\r\n }\r\n }\r\n return discountAmount * -1;\r\n }\r\n\r\n private _renderAppliedPromoCode = (props: IPromoCodeProps) => {\r\n if (!props.cart || !props.cart.cart || !props.cart.cart.Coupons || !(props.cart.cart.Coupons.length > 0)) {\r\n return;\r\n }\r\n\r\n const _removePromotion = (event: React.MouseEvent) => {this._removePromotion(props.cart, event);};\r\n\r\n return (\r\n <>\r\n
\r\n
{this.props.appliedPromoCodeHeadingText}
\r\n \r\n
\r\n {\r\n props.cart.cart.Coupons.map((coupon: Coupon) => {\r\n const ariaLabel = props.removePromoAriaLabelFormat ? format(props.removePromoAriaLabelFormat, props.removePromoText, coupon.Code) : '';\r\n\r\n return (\r\n
\r\n
\r\n {coupon.Code} (\r\n )\r\n
\r\n \r\n {props.removePromoText}\r\n \r\n
\r\n );\r\n })\r\n }\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default PromoCode;","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, ITelemetry } from '@msdyn365-commerce/core';\nimport { ICheckoutState, IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { Cart, CartLine } from '@msdyn365-commerce/retail-proxy';\nimport { format } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IInvoiceSummaryProps {\n orderTotalLabel: string;\n invoiceLabel: string;\n loyaltyLabel?: string;\n giftcardLabel?: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n cart: Cart;\n id: string;\n typeName: string;\n freeText?: string;\n toBeCalculatedText?: string;\n checkoutState?: ICheckoutState;\n}\n\nexport interface IInvoiceSummaryLines {\n orderTotal: React.ReactNode;\n invoices: React.ReactNode;\n giftCard?: React.ReactNode;\n loyalty?: React.ReactNode;\n}\n\ninterface IInvoiceSummaryLineProps {\n label: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n price?: number;\n freeText?: string;\n toBeCalculatedText?: string;\n id: string;\n typeName: string;\n cssLabel: string;\n}\n\nconst InvoiceSummaryLine: React.FC = ({\n price,\n label,\n context,\n id,\n typeName,\n toBeCalculatedText,\n freeText,\n cssLabel\n}) => {\n return (\n

\n {label}\n {price || price === 0 ? (\n \n ) : (\n {toBeCalculatedText}\n )}\n

\n );\n};\n\nconst _buildPaymentSummarySection = (\n props: IInvoiceSummaryProps,\n price: number | undefined,\n label: string,\n cssLabel: string\n): React.ReactNode => {\n return (\n \n );\n};\n\nconst _computedLoyaltyAmount = (checkoutState: ICheckoutState): number => {\n return (checkoutState && checkoutState.loyaltyAmount) || 0;\n};\n\nconst _computeGiftCardAmount = (checkoutState: ICheckoutState, cart: Cart): number => {\n const giftCardCounter = (count: number, giftCard: IGiftCardExtend) => {\n return count + (giftCard.Balance || 0);\n };\n const giftCardTotalValue = (checkoutState.giftCardExtends || []).reduce(giftCardCounter, 0);\n const amount = (cart.TotalAmount || 0) - _computedLoyaltyAmount(checkoutState);\n return Math.min(giftCardTotalValue, amount);\n};\n\nexport const InvoiceSummary = (props: IInvoiceSummaryProps) => {\n const { TotalAmount, CartLines } = props.cart;\n const invoiceLines = CartLines?.filter(cartLine => cartLine.IsInvoiceLine);\n const reactNodes: IInvoiceSummaryLines = {\n invoices: invoiceLines?.map((invoiceLine: CartLine) => {\n return _buildPaymentSummarySection(\n props,\n invoiceLine.InvoiceAmount,\n format(props.invoiceLabel, invoiceLine.InvoiceId),\n 'invoice'\n );\n }),\n orderTotal: _buildPaymentSummarySection(props, TotalAmount, props.orderTotalLabel, 'total')\n };\n\n if (props.checkoutState) {\n const giftCardAmount = _computeGiftCardAmount(props.checkoutState, props.cart);\n const loyaltyAmount = _computedLoyaltyAmount(props.checkoutState);\n const totalAmountAfterGiftCard = (TotalAmount || 0) - giftCardAmount - loyaltyAmount;\n\n if (loyaltyAmount > 0) {\n reactNodes.loyalty = _buildPaymentSummarySection(props, -loyaltyAmount, props.loyaltyLabel || 'Loyalty amount', 'loyalty');\n }\n\n if (giftCardAmount > 0) {\n reactNodes.giftCard = _buildPaymentSummarySection(\n props,\n -giftCardAmount,\n props.giftcardLabel || 'Gift card amount',\n 'gift-card'\n );\n }\n\n reactNodes.orderTotal = _buildPaymentSummarySection(\n { ...props, freeText: undefined },\n totalAmountAfterGiftCard,\n props.orderTotalLabel,\n 'total'\n );\n }\n\n return reactNodes;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, ITelemetry } from '@msdyn365-commerce/core';\nimport { ICheckoutState, IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { Cart, ChannelConfiguration, ChannelDeliveryOptionConfiguration } from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\n\nexport interface IOrderSummaryProps {\n subTotalLabel: string;\n shippingLabel: string;\n taxLabel: string;\n orderTotalLabel: string;\n loyaltyLabel?: string;\n giftcardLabel?: string;\n totalDiscountsLabel: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n cart: Cart;\n channelConfiguration: ChannelConfiguration;\n id: string;\n typeName: string;\n otherChargeLabel?: string;\n freeText?: string;\n toBeCalculatedText?: string;\n checkoutState?: ICheckoutState;\n retailMultiplePickUpOptionEnabled?: boolean;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n isTaxIncludedInPrice?: boolean;\n isShowTaxBreakup?: boolean;\n customerAccountLabel?: string;\n}\n\nexport interface IOrderSummaryLines {\n subtotal: React.ReactNode;\n shipping?: React.ReactNode;\n otherCharge?: React.ReactNode;\n tax: React.ReactNode;\n orderTotal: React.ReactNode;\n totalDiscounts?: React.ReactNode;\n giftCard?: React.ReactNode;\n loyalty?: React.ReactNode;\n customerAccount?: React.ReactNode;\n}\n\ninterface IOrderSummaryLineProps {\n label: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n price?: number;\n freeText?: string;\n toBeCalculatedText?: string;\n id: string;\n typeName: string;\n cssLabel: string;\n priceCurrency?: string;\n}\n\ninterface IShippingOrderLine {\n cart: Cart;\n channelConfiguration: ChannelConfiguration;\n canShip?: boolean;\n hasDeliveryMethod?: boolean;\n hasShippingMethod?: boolean;\n freightFee?: number;\n}\n\nconst OrderSummaryLine: React.FC = ({\n price,\n label,\n context,\n id,\n typeName,\n toBeCalculatedText,\n freeText,\n cssLabel,\n priceCurrency\n}) => {\n return (\n

\n {label}\n {price || price === 0 ? (\n \n ) : (\n {toBeCalculatedText}\n )}\n

\n );\n};\n\nconst _buildOrderSummarySection = (\n props: IOrderSummaryProps,\n price: number | undefined,\n cssLabel: string,\n label: string = ''\n): React.ReactNode => {\n return (\n \n );\n};\n\nconst _computedLoyaltyAmount = (checkoutState: ICheckoutState): number => {\n return (checkoutState && checkoutState.loyaltyAmount) || 0;\n};\n\nconst _computedCustomerAccountAmount = (checkoutState: ICheckoutState): number => {\n return (checkoutState && checkoutState.customerAccountAmount) || 0;\n};\n\nconst _computeGiftCardAmount = (checkoutState: ICheckoutState, cart: Cart): number => {\n const giftCardCounter = (count: number, giftCard: IGiftCardExtend) => {\n return count + (giftCard.Balance || 0);\n };\n const giftCardTotalValue = (checkoutState.giftCardExtends || []).reduce(giftCardCounter, 0);\n const amount = (cart.TotalAmount || 0) - _computedLoyaltyAmount(checkoutState);\n return Math.min(giftCardTotalValue, amount);\n};\n\nconst getDeliveryConfiguration = (\n cart: Cart,\n channelConfiguration: ChannelConfiguration,\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration,\n retailMultiplePickUpOptionEnabled?: boolean,\n isTaxIncludedInPrice?: boolean,\n isShowTaxBreakup?: boolean\n): IShippingOrderLine => {\n const pickupDeliveryModeCode = channelConfiguration && channelConfiguration.PickupDeliveryModeCode;\n const emailDeliveryModeCode = channelConfiguration && channelConfiguration.EmailDeliveryModeCode;\n const cartLines = cart.CartLines || [];\n const deliveryModes = cartLines.map(cartLine => cartLine.DeliveryMode);\n const taxOnShippingCharge = cart.TaxOnShippingCharge !== undefined ? cart.TaxOnShippingCharge : 0;\n const shippingChargeAmount = cart.ShippingChargeAmount !== undefined ? cart.ShippingChargeAmount : 0;\n\n // isTaxIncludedInPrice isShowTaxBreakup useProperties\n // False False/True shippingChargeAmount\n // True True shippingChargeAmount\n // True false shippingChargeAmount + taxOnShippingCharge\n // if either of isTaxIncludedInPrice or isShowTaxBreakup is undefined then we will execute old logic\n let freightFee: number | undefined = 0;\n if (isTaxIncludedInPrice === undefined || isShowTaxBreakup === undefined) {\n freightFee = cart.ShippingChargeAmount;\n } else {\n freightFee = isTaxIncludedInPrice && !isShowTaxBreakup ? shippingChargeAmount + taxOnShippingCharge : cart.ShippingChargeAmount;\n }\n const canShip = deliveryModes.some(\n deliveryMode =>\n !(\n deliveryMode !== '' &&\n (deliveryMode ===\n getDeliveryMode(deliveryMode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig, pickupDeliveryModeCode) ||\n deliveryMode === emailDeliveryModeCode)\n )\n );\n const hasDeliveryMethod = deliveryModes.some(deliveryMode => !!deliveryMode && deliveryMode !== emailDeliveryModeCode);\n const hasShippingMethod = deliveryModes.some(\n deliveryMode =>\n !!deliveryMode &&\n deliveryMode !==\n getDeliveryMode(deliveryMode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig, pickupDeliveryModeCode) &&\n deliveryMode !== emailDeliveryModeCode\n );\n return {\n canShip,\n hasDeliveryMethod,\n hasShippingMethod,\n freightFee\n } as IShippingOrderLine;\n};\n\nconst getDeliveryMode = (\n deliveryMode?: string,\n featureSate: boolean = false,\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration,\n pickupDeliveryMode?: string\n) => {\n if (!featureSate) {\n return pickupDeliveryMode;\n }\n return channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(dM => dM === deliveryMode);\n};\n\n// eslint-disable-next-line complexity\nexport const OrderSummary = (props: IOrderSummaryProps) => {\n const {\n SubtotalAmount,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Existing Property.\n SubtotalAmountWithoutTax,\n TaxAmount,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Existing Property.\n TaxOnNonShippingCharges,\n DiscountAmount = 0,\n TotalAmount,\n OtherChargeAmount\n } = props.cart;\n\n const { canShip, hasDeliveryMethod, hasShippingMethod, freightFee } = getDeliveryConfiguration(\n props.cart,\n props.channelConfiguration,\n props.channelDeliveryOptionConfig,\n props.retailMultiplePickUpOptionEnabled,\n props.isTaxIncludedInPrice,\n props.isShowTaxBreakup\n );\n\n let reactNodes: IOrderSummaryLines;\n // if either of isTaxIncludedInPrice or isShowTaxBreakup is undefined then we will execute old logic\n if (props.isTaxIncludedInPrice === undefined || props.isShowTaxBreakup === undefined) {\n reactNodes = {\n subtotal: _buildOrderSummarySection(props, SubtotalAmount, 'sub-total', props.subTotalLabel),\n tax: _buildOrderSummarySection(props, hasDeliveryMethod ? TaxAmount : undefined, 'tax-amount', props.taxLabel),\n orderTotal: _buildOrderSummarySection(props, TotalAmount, 'total', props.orderTotalLabel),\n otherCharge:\n (OtherChargeAmount && _buildOrderSummarySection(props, OtherChargeAmount, 'other-charges', props.otherChargeLabel)) ||\n undefined\n };\n } else {\n const otherChargeAmount = OtherChargeAmount !== undefined ? OtherChargeAmount : 0;\n const taxOnNonShippingCharges = TaxOnNonShippingCharges !== undefined ? TaxOnNonShippingCharges : 0;\n const isTaxGreaterThanZero = TaxAmount !== undefined && TaxAmount > 0;\n // isTaxIncludedInPrice isShowTaxBreakup useProperties\n // False False/True otherChargeAmount\n // True True otherChargeAmount\n // True false otherChargeAmount+TaxOnNonShippingCharges\n\n const otherChargeAmountTotal =\n props.isTaxIncludedInPrice && !props.isShowTaxBreakup ? otherChargeAmount + taxOnNonShippingCharges : otherChargeAmount;\n\n const subtotalAmountActual = props.isTaxIncludedInPrice && props.isShowTaxBreakup ? SubtotalAmountWithoutTax : SubtotalAmount;\n\n reactNodes = {\n subtotal: _buildOrderSummarySection(props, subtotalAmountActual, 'sub-total', props.subTotalLabel),\n tax: props.isShowTaxBreakup\n ? _buildOrderSummarySection(\n props,\n hasDeliveryMethod || isTaxGreaterThanZero ? TaxAmount : undefined,\n 'tax-amount',\n props.taxLabel\n )\n : '',\n orderTotal: _buildOrderSummarySection(props, TotalAmount, 'total', props.orderTotalLabel),\n otherCharge:\n (OtherChargeAmount && _buildOrderSummarySection(props, otherChargeAmountTotal, 'other-charges', props.otherChargeLabel)) ||\n undefined\n };\n }\n if (canShip) {\n reactNodes.shipping = _buildOrderSummarySection(props, hasShippingMethod ? freightFee : undefined, 'shipping', props.shippingLabel);\n }\n if (props.checkoutState) {\n const giftCardAmount = _computeGiftCardAmount(props.checkoutState, props.cart);\n const loyaltyAmount = _computedLoyaltyAmount(props.checkoutState);\n const customerAccountAmount = _computedCustomerAccountAmount(props.checkoutState);\n const totalAmountAfterGiftCard = (TotalAmount || 0) - giftCardAmount - loyaltyAmount - customerAccountAmount;\n\n if (loyaltyAmount > 0) {\n reactNodes.loyalty = _buildOrderSummarySection(props, -loyaltyAmount, 'loyalty', props.loyaltyLabel || 'Loyalty amount');\n }\n\n if (giftCardAmount > 0) {\n reactNodes.giftCard = _buildOrderSummarySection(props, -giftCardAmount, 'gift-card', props.giftcardLabel || 'Gift card amount');\n }\n\n if (customerAccountAmount > 0) {\n reactNodes.customerAccount = _buildOrderSummarySection(\n props,\n -customerAccountAmount,\n 'customer-credit-amount',\n props.customerAccountLabel || 'Customer Credit amount'\n );\n }\n\n reactNodes.orderTotal = _buildOrderSummarySection(\n { ...props, freeText: undefined },\n totalAmountAfterGiftCard,\n 'total',\n props.orderTotalLabel\n );\n }\n\n if (DiscountAmount > 0) {\n reactNodes.totalDiscounts = _buildOrderSummarySection(props, -DiscountAmount, 'total-discounts', props.totalDiscountsLabel);\n }\n\n return reactNodes;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Find the product in array of products considering product id.\n * @param productId - The searched product id.\n * @param products - The array of products in which search is executed.\n * @returns - The found product.\n */\nexport function getProductByProductId(productId: number | undefined, products?: SimpleProduct[]): SimpleProduct | undefined {\n if (productId !== undefined && ArrayExtensions.hasElements(products)) {\n return products.find(product => {\n return productId === product.RecordId;\n });\n }\n\n return undefined;\n}\n\n/**\n * Find the product in array of products considering product id and product behavior's warehouse.\n * @param productId - The searched product id.\n * @param products - The array of products in which search is executed.\n * @param warehouseId - Warehouse id of cartLine.\n * @param cartState - The cart start in case cart line has no warehouse.\n * @returns - The found product.\n */\nexport function getProductByProductIdAndWarehouse(\n productId: number | undefined,\n products?: SimpleProduct[],\n warehouseId?: string,\n cartState?: ICartState\n): SimpleProduct | undefined {\n const targetWarehouseValue = warehouseId ?? cartState?.cart.WarehouseId;\n\n if (productId !== undefined && ArrayExtensions.hasElements(products)) {\n return products.find(product => {\n return productId === product.RecordId && product.Behavior?.InventoryLocationId === targetWarehouseValue;\n });\n }\n\n return undefined;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICoreContext } from '@msdyn365-commerce/core';\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport {\n AsyncResult,\n CartLine,\n CartLineValidationResults,\n CartLineValidationResultsByLineId,\n CartsDataActions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\n\nimport { ITelemetry } from '@msdyn365-commerce/telemetry-internal';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Validate the cart.\n * @param isQuantityLimitsFeatureEnabled -- Is the quantity limits feature enabled.\n * @param cart -- The cart state to validate.\n * @param telemetry -- The telemetry.\n * @param propsContext -- The props context.\n * @param shouldRetry -- Should retry.\n * @returns A list of line data validation failures.\n */\nexport async function validateCartAsync(\n cart: AsyncResult,\n telemetry: ITelemetry,\n propsContext: ICoreContext,\n shouldRetry: boolean = true\n): Promise {\n let cartResult: ICartState;\n let cartVersion: number | undefined;\n try {\n cartResult = await cart;\n cartVersion = cartResult.cart.Version;\n } catch (error) {\n telemetry.warning(error);\n telemetry.debug('Unable to get cart or cart version.');\n return AsyncResult.resolve();\n }\n\n if (cartVersion) {\n try {\n const validationResult: CartLineValidationResults = await CartsDataActions.validateForCheckoutAsync(\n { callerContext: propsContext.actionContext, bypassCache: 'none' },\n cartResult.cart.Id,\n cartVersion\n );\n\n return await AsyncResult.resolve(validationResult.ValidationResultsByLineId ?? undefined);\n } catch (error) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- error type is not defined.\n if (shouldRetry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\n try {\n await cartResult.refreshCart({});\n } catch (refreshError) {\n telemetry.warning(refreshError);\n telemetry.debug('Unable to refresh Cart');\n return AsyncResult.resolve();\n }\n try {\n await validateCartAsync(cart, telemetry, propsContext, false);\n return AsyncResult.resolve();\n } catch (validateError) {\n telemetry.warning(validateError);\n telemetry.debug('Unable to validate Cart');\n return AsyncResult.resolve();\n }\n }\n\n telemetry.warning(error);\n telemetry.debug('Unable to validate Cart');\n return AsyncResult.resolve();\n }\n } else {\n telemetry.warning('Cart version not found for Cart validation request.');\n return AsyncResult.resolve();\n }\n}\n\n/**\n * Check if cart line quantity update is success.\n * @param isQuantityLimitsFeatureEnabled -- Is quantity limits feature enabled.\n * @param cartResult -- The cart result.\n * @param telemetry -- The telemetry.\n * @param products -- The products.\n * @param cartLineToUpdate -- The cart line to update.\n * @param quantity -- The quantity.\n * @returns Boolean to indicate if the cart line quantity is updated.\n */\nexport async function isCartLineQuantityUpdatedAsync(\n isQuantityLimitsFeatureEnabled: boolean | undefined,\n cartResult: ICartState | undefined,\n telemetry: ITelemetry,\n products: SimpleProduct[] | undefined,\n cartLineToUpdate: CartLine,\n quantity: number\n): Promise {\n if (cartResult) {\n let isUsingDefaultOrderSettingsMax: boolean = false;\n if (ArrayExtensions.hasElements(products) && isQuantityLimitsFeatureEnabled) {\n const modifiedProduct: SimpleProduct | undefined = products.find(\n (product: SimpleProduct) => product.RecordId === cartLineToUpdate.ProductId\n );\n isUsingDefaultOrderSettingsMax = !!modifiedProduct && !!modifiedProduct.Behavior?.MaximumQuantity;\n } else {\n isUsingDefaultOrderSettingsMax = false;\n }\n\n const input = {\n cartLineId: cartLineToUpdate.LineId!.toString(),\n newQuantity: quantity,\n additionalProperties: { isUsingDefaultOrderSettingsMax }\n };\n\n try {\n const updateLineResult: ICartActionResult = await cartResult.updateCartLineQuantity(input);\n return await AsyncResult.resolve(updateLineResult.status === 'SUCCESS');\n } catch (error) {\n telemetry.warning((error as Error).message);\n telemetry.debug('Unable to update Cart Line quantity');\n }\n }\n\n return AsyncResult.resolve(false);\n}\n\n/**\n * Update cart line with cart action result.\n * @param isQuantityLimitsFeatureEnabled -- Is quantity limits feature enabled.\n * @param cartResult -- The cart result.\n * @param telemetry -- The telemetry.\n * @param products -- The products.\n * @param cartLineToUpdate -- The cart line to update.\n * @param quantity -- The quantity.\n * @returns Boolean to indicate if the cart line quantity is updated.\n */\nexport async function cartLineQuantityUpdatedAsync(\n isQuantityLimitsFeatureEnabled: boolean | undefined,\n cartResult: ICartState | undefined,\n telemetry: ITelemetry,\n products: SimpleProduct[] | undefined,\n cartLineToUpdate: CartLine,\n quantity: number\n): Promise {\n if (cartResult) {\n let isUsingDefaultOrderSettingsMax: boolean = false;\n if (ArrayExtensions.hasElements(products) && isQuantityLimitsFeatureEnabled) {\n const modifiedProduct: SimpleProduct | undefined = products.find(\n (product: SimpleProduct) => product.RecordId === cartLineToUpdate.ProductId\n );\n isUsingDefaultOrderSettingsMax = !!modifiedProduct && !!modifiedProduct.Behavior?.MaximumQuantity;\n } else {\n isUsingDefaultOrderSettingsMax = false;\n }\n\n const input = {\n cartLineId: cartLineToUpdate.LineId!.toString(),\n newQuantity: quantity,\n additionalProperties: { isUsingDefaultOrderSettingsMax }\n };\n\n try {\n const updateLineResult: ICartActionResult = await cartResult.updateCartLineQuantity(input);\n return await AsyncResult.resolve(updateLineResult);\n } catch (error) {\n telemetry.warning((error as Error).message);\n telemetry.debug('Unable to update Cart Line quantity');\n }\n }\n\n return AsyncResult.resolve();\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n AddToOrderTemplateComponent,\n AddToWishlistComponent,\n CartLineItemComponent,\n IAddToOrderTemplateDialogResources,\n ICartlineResourceString,\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources,\n IOrderTemplateNameDialogResources,\n IWishlistActionSuccessResult\n} from '@msdyn365-commerce/components';\nimport MsDyn365, {\n IAny,\n ICoreContext,\n IGeneric,\n IGridSettings,\n IImageSettings,\n ITelemetry,\n TelemetryEvent,\n isChannelTypeB2B\n} from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport {\n AsyncResult,\n CartLine,\n CartLineValidationResultsByLineId,\n ChannelDeliveryOptionConfiguration,\n CommerceList,\n Customer,\n OrgUnitLocation,\n ProductDeliveryOptions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { ProductCatalog, ProductDimensionType, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\nimport {\n ArrayExtensions,\n getInvoiceDetailsPageUrlSync,\n getProductUrlSync,\n IProductInventoryInformation,\n isCartLineItemPickUpType,\n ObjectExtensions,\n OrderTemplate,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '../../../Common/get-product';\nimport { IPickUpInStoreViewProps, PickUpInStore } from './cart-pick-up-in-store';\n\nexport interface ICartLineItemsProps {\n cartlines: CartLine[];\n cartlinesErrors: CartLineValidationResultsByLineId;\n cartState: ICartState | undefined;\n orgUnitLocations: OrgUnitLocation[] | undefined;\n resources: ICartlineResourceString;\n productAvailabilites: IProductInventoryInformation[] | undefined;\n products: SimpleProduct[] | undefined;\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\n pickupDeliveryModeCode?: string;\n catalogs?: ProductCatalog[];\n retailMulitplePickupFeatureState?: boolean;\n\n /* GridSettings for the product image in cartline */\n gridSettings: IGridSettings;\n\n /* ImageSettings for the product image in cartline */\n imageSettings: IImageSettings;\n id: string;\n typeName: string;\n context: ICoreContext>;\n telemetry: ITelemetry;\n removeButtonText: string;\n addToWishlistButtonText: string;\n removeFromWishlistButtonText: string;\n shipItText: string;\n pickitUpText: string;\n changeStoreText: string;\n outOfStockText: string;\n outOfRangeOneText: string;\n outOfRangeFormatText: string;\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\n isStockCheckEnabled: boolean;\n wishlists: CommerceList[] | undefined;\n defaultWishlistName: string;\n maxCartlineQuantity: number;\n includeErrors?: boolean;\n showShippingChargesForLineItems?: boolean;\n telemetryContent?: ITelemetryContent;\n isQuantityLimitsFeatureEnabled: boolean;\n hasInvoiceLine?: boolean;\n storeSelectorModuleId?: string;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\n itemAddedToOrderTemplateDialogResources: IItemAddedToOrderTemplateDialogResources;\n duplicateItemsWhenAddingToOrderTemplateDialogResources: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\n\n addToOrderTemplateButtonText: string;\n addToOrderTemplateButtonTooltip: string;\n addToOrderTemplateMessage: string;\n addItemToOrderTemplateError: string;\n orderTemplates: OrderTemplate[] | undefined;\n customerInformation: Customer | undefined;\n shouldIgnoreWarehouse: boolean | undefined;\n productAvailability?: AsyncResult;\n productPickUpOptions?: ProductDeliveryOptions[] | undefined;\n isMultipleCatalogFeatureEnabledInHq: boolean;\n catalogId?: number;\n\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\n updateCartLinesQuantitySuccessHandler(cartline: CartLine, quantity: number, lineIndex?: number): boolean;\n locationChangedHandler(): void;\n}\n\nexport interface ICartlinesViewProps {\n cartline: React.ReactNode;\n pickUpInStore?: IPickUpInStoreViewProps;\n remove: React.ReactNode;\n addToWishlist: React.ReactNode | undefined;\n addToOrderTemplate: React.ReactNode | undefined;\n\n error?: string;\n cartlineId?: string;\n hasError?: boolean;\n data?: {\n product?: SimpleProduct;\n cartline: CartLine;\n };\n}\n\nconst _getCartItemAvailableQuantity = (\n isStockCheckEnabled: boolean,\n productAvailability: IProductInventoryInformation | undefined\n): number => {\n if (\n !isStockCheckEnabled ||\n !productAvailability ||\n !productAvailability.ProductAvailableQuantity ||\n !productAvailability.IsProductAvailable ||\n !productAvailability.ProductAvailableQuantity.AvailableQuantity\n ) {\n return 0;\n }\n\n return productAvailability.ProductAvailableQuantity.AvailableQuantity;\n};\n\nconst _getCartItemMaxQuantity = (\n maxQuantityByConfig: number,\n isStockCheckEnabled: boolean,\n availableQuantityInStock: number,\n isQuantityLimitsFeatureEnabled: boolean,\n maxByQuantityLimitsFeature: number\n) => {\n if (isQuantityLimitsFeatureEnabled) {\n let maxByQuantityLimitsFeatureResult = maxByQuantityLimitsFeature;\n\n // If max by feature in not defined when feature is on then we suggest that there no max by feature\n // and consider available qty if stock check enabled and max from config in site settings.\n if (!maxByQuantityLimitsFeature) {\n maxByQuantityLimitsFeatureResult = maxQuantityByConfig || 10;\n }\n\n return isStockCheckEnabled\n ? maxByQuantityLimitsFeatureResult < availableQuantityInStock\n ? maxByQuantityLimitsFeatureResult\n : availableQuantityInStock\n : maxByQuantityLimitsFeatureResult;\n }\n if (isStockCheckEnabled) {\n return availableQuantityInStock < maxQuantityByConfig ? availableQuantityInStock : maxQuantityByConfig;\n }\n return maxQuantityByConfig;\n};\n\nconst _getErrorMessage = (\n availableQuantityInStock: number,\n currentQuantity: number,\n props: ICartLineItemsProps,\n shouldSkipStockCheck: boolean,\n cartLine: CartLine,\n lineId: string | undefined,\n foundProductAvailability?: IProductInventoryInformation\n): string | undefined => {\n const finalErrorMessages: string[] = [];\n\n const isLoadingDeliveryOptions = props.productAvailability?.status === 'LOADING';\n if (isLoadingDeliveryOptions) {\n return undefined;\n }\n // check availability passed as prop for each cartline\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\n if (foundProductAvailability === undefined) {\n finalErrorMessages.push(props.outOfStockText);\n return finalErrorMessages.toString();\n }\n }\n if (props.includeErrors && props.isStockCheckEnabled && !shouldSkipStockCheck) {\n if (availableQuantityInStock <= 0) {\n finalErrorMessages.push(props.outOfStockText);\n } else if (availableQuantityInStock < currentQuantity) {\n if (availableQuantityInStock === 1) {\n finalErrorMessages.push(props.outOfRangeOneText);\n } else {\n finalErrorMessages.push(props.outOfRangeFormatText.replace('{numLeft}', availableQuantityInStock.toString()));\n }\n }\n }\n\n // Server-side validation\n const checkForErrors = props.cartlinesErrors.ValidationResultsPairs;\n const errorsFoundByLineId = checkForErrors?.filter(index => index.LineId === lineId);\n if (errorsFoundByLineId !== undefined) {\n for (const i of errorsFoundByLineId) {\n if (ArrayExtensions.hasElements(i.ValidationFailures)) {\n i.ValidationFailures.forEach(validation => {\n if (validation.ErrorContext !== undefined) {\n finalErrorMessages.push(validation.ErrorContext);\n }\n });\n }\n }\n }\n\n if (ArrayExtensions.hasElements(finalErrorMessages)) {\n return finalErrorMessages.join(' ');\n }\n\n return undefined;\n};\n\n/**\n * On Remove Click functionality.\n * @param removeItemClickHandler -Remove item click function.\n * @param cartline -CartLine.\n * @returns Remove change value.\n */\nconst onRemoveClickFunction = (removeItemClickHandler: (cartlineToRemove: CartLine) => void, cartline: CartLine) => () => {\n removeItemClickHandler(cartline);\n};\n\n// eslint-disable-next-line complexity -- Auto-suppressed.\nconst _assembleNode = (\n cartline: CartLine,\n product: SimpleProduct | undefined,\n props: ICartLineItemsProps,\n index: number,\n foundProductAvailability?: IProductInventoryInformation,\n productPickUpOptions?: ProductDeliveryOptions\n): ICartlinesViewProps => {\n const {\n imageSettings,\n gridSettings,\n id,\n typeName,\n context,\n resources,\n removeButtonText,\n removeItemClickHandler,\n moveToWishlistSuccessHandler,\n addToOrderTemplateButtonText,\n addToOrderTemplateButtonTooltip,\n addToOrderTemplateDialogResources,\n createOrderTemplateDialogResources,\n itemAddedToOrderTemplateDialogResources,\n duplicateItemsWhenAddingToOrderTemplateDialogResources,\n addToWishlistButtonText,\n removeFromWishlistButtonText,\n orderTemplates,\n customerInformation,\n wishlists,\n defaultWishlistName,\n storeSelectorModuleId,\n isMultipleCatalogFeatureEnabledInHq\n } = props;\n\n const isAuthenticated = context.request.user.isAuthenticated;\n const nameOfWishlist = wishlists && wishlists.length > 0 && wishlists[0].Name ? wishlists[0].Name : defaultWishlistName;\n const availableQuantityInStock = _getCartItemAvailableQuantity(props.isStockCheckEnabled, foundProductAvailability);\n\n const maxQuantity =\n product &&\n _getCartItemMaxQuantity(\n props.maxCartlineQuantity,\n props.isStockCheckEnabled,\n availableQuantityInStock,\n props.isQuantityLimitsFeatureEnabled,\n product?.Behavior?.MaximumQuantity || 0\n );\n\n // Skip stock check if the cart line is a service item or an invoice line\n const shouldSkipStockCheck = product?.ItemTypeValue === ReleasedProductType.Service || !!cartline.IsInvoiceLine;\n\n const errorMessage = ObjectExtensions.isNullOrUndefined(maxQuantity)\n ? undefined\n : _getErrorMessage(\n availableQuantityInStock,\n cartline.Quantity!,\n props,\n shouldSkipStockCheck,\n cartline,\n cartline.LineId,\n foundProductAvailability\n );\n\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\n\n const payload = getPayloadObject(TelemetryEvent.RemoveFromCart, props.telemetryContent!, removeButtonText, '');\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\n\n const inventoryLbl = foundProductAvailability?.StockLevelLabel;\n const inventoryCode = foundProductAvailability\n ? `ms-cart-line__inventory-code-${foundProductAvailability.StockLevelCode?.toLowerCase()}`\n : undefined;\n const productDimension = 4;\n const customPriceDimensionType = productDimension as ProductDimensionType.Style;\n const isCustomPriceSelected =\n product?.Dimensions?.find(dimension => dimension.DimensionTypeValue === customPriceDimensionType)?.DimensionValue?.Value ===\n 'Custom';\n\n let productUrl: string | undefined;\n if (product) {\n productUrl = getProductUrlSync(product, props.context.actionContext, undefined);\n\n if (MsDyn365.isBrowser && isChannelTypeB2B(props.context.actionContext.requestContext)) {\n const fullUrl = new URL(productUrl, window.location.href);\n fullUrl.searchParams.set('catalogid', `${cartline.CatalogId ?? 0}`);\n productUrl = fullUrl.href;\n }\n } else {\n productUrl = getInvoiceDetailsPageUrlSync(cartline.Description || '', props.context.actionContext);\n }\n\n return {\n data: {\n product,\n cartline\n },\n cartlineId: cartline.LineId,\n error: errorMessage,\n hasError:\n (!shouldSkipStockCheck && props.isStockCheckEnabled ? cartline.Quantity! > (maxQuantity ?? 0) : false) ||\n (!ObjectExtensions.isNullOrUndefined(errorMessage) && !StringExtensions.isNullOrEmpty(errorMessage)),\n cartline: (\n \n ),\n pickUpInStore: product\n ? PickUpInStore({\n storeSelectorModuleId,\n cartState: props.cartState,\n cartline,\n product,\n shipitText: props.shipItText,\n pickUpInStoreText: props.pickitUpText,\n changeStoreText: props.changeStoreText,\n storeSelectorStateManager: props.storeSelectorStateManager,\n orgUnitLocations: props.orgUnitLocations,\n deliveryOptions: productPickUpOptions,\n pickupDeliveryModeCode:\n cartline.DeliveryMode !== (undefined || '') ? cartline.DeliveryMode : props.pickupDeliveryModeCode,\n retailMulitplePickupFeatureState: props.retailMulitplePickupFeatureState,\n channelDeliveryOptionConfig: props.channelDeliveryOptionConfig,\n locationChangedHandler: props.locationChangedHandler\n })\n : undefined,\n remove: (\n \n ),\n addToWishlist:\n isAuthenticated && product && !isCustomPriceSelected ? (\n \n ) : (\n undefined\n ),\n addToOrderTemplate:\n isAuthenticated && orderTemplates && product ? (\n \n ) : (\n undefined\n )\n };\n};\n\nexport const assembleCartlines = (\n cartlines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: ICartLineItemsProps\n): ICartlinesViewProps[] | null => {\n const reactNodes: ICartlinesViewProps[] = [];\n\n cartlines.map((cartline, index) => {\n let product;\n if (props.isQuantityLimitsFeatureEnabled) {\n // When feature is enabled the same products could have different quantity limits in Behavior so we need\n // to check productId and WarehouseId for identification.\n product = getProductByProductIdAndWarehouse(cartline.ProductId, products, cartline.WarehouseId, props.cartState);\n } else {\n product = getProductByProductId(cartline.ProductId, products);\n }\n let foundProductAvailability;\n\n // check if cartlineitem is pickup item\n const isPickUpItem = isCartLineItemPickUpType(\n cartline,\n props.retailMulitplePickupFeatureState,\n props.channelDeliveryOptionConfig,\n props.pickupDeliveryModeCode\n );\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\n if (!props.shouldIgnoreWarehouse && isPickUpItem) {\n // check warehouse only if siteBuilder setting is not \"Based on aggregate for shipping and pickup warehouses\" and cartlineitem is pickupitem\n return (\n productAvailability.ProductAvailableQuantity?.ProductId === cartline.ProductId &&\n productAvailability.InventLocationId?.toUpperCase() === cartline.WarehouseId?.toUpperCase()\n );\n }\n return productAvailability.ProductAvailableQuantity.ProductId === cartline.ProductId;\n });\n }\n\n let productPickUpOptions;\n if (props.productPickUpOptions !== undefined && ArrayExtensions.hasElements(props.productPickUpOptions)) {\n productPickUpOptions = props.productPickUpOptions.find(deliveryOption => {\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\n });\n }\n reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability, productPickUpOptions));\n });\n\n return reactNodes;\n};\n\n/**\n * CartLineItems component.\n * @param props\n */\nexport const CartLineItems = (props: ICartLineItemsProps) => {\n const { products, cartlines } = props;\n return assembleCartlines(cartlines, products, props);\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n CartLine,\n ChannelDeliveryOptionConfiguration,\n DeliveryOption,\n OrgUnitLocation,\n ProductDeliveryOptions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IPickUpInStoreViewProps {\n callbacks: {\n toggleBopis(isBopisSelected: boolean): void;\n };\n defaultComponent?: React.ReactNode;\n orgUnitName?: string;\n isBopisSelected: boolean;\n ContainerProps: INodeProps;\n deliveryOption?: string;\n}\n\nexport interface IPickUpInStoreProps {\n cartline: CartLine;\n product: SimpleProduct;\n shipitText: string;\n pickUpInStoreText: string;\n changeStoreText: string;\n cartState: ICartState | undefined;\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\n orgUnitLocations?: OrgUnitLocation[] | undefined;\n deliveryOptions?: ProductDeliveryOptions;\n pickupDeliveryModeCode?: string;\n storeSelectorModuleId?: string;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n retailMulitplePickupFeatureState?: boolean;\n locationChangedHandler(): void;\n}\n\nexport const PickUpInStore = (props: IPickUpInStoreProps): IPickUpInStoreViewProps | undefined => {\n const _onLocationChangedCallback = async (\n orgUnitLocation: OrgUnitLocation,\n cartState: ICartState | undefined,\n cartline: CartLine,\n deliveryMode?: string\n ) => {\n if (!cartState) {\n return Promise.resolve();\n }\n return cartState\n .updateCartLinePickupLocation({ cartLineId: cartline.LineId!, location: orgUnitLocation, deliveryMode })\n .then(result => {\n if (result.status === 'SUCCESS') {\n props.locationChangedHandler();\n }\n })\n .catch(error => {});\n };\n\n const _toggleBOPIS = (isBopisSelected: boolean) => {\n const { storeSelectorStateManager, product, cartline, cartState, storeSelectorModuleId } = props;\n\n if (isBopisSelected) {\n if (!storeSelectorStateManager) {\n return;\n }\n storeSelectorStateManager\n .openDialog({\n id: storeSelectorModuleId,\n product,\n alreadySelectedLocation: {\n OrgUnitNumber: cartline.FulfillmentStoreId\n },\n deliveryOptions: props.deliveryOptions,\n onLocationSelected: async (orgUnitLocation, deliveryMode: string | undefined) => {\n return _onLocationChangedCallback(orgUnitLocation, cartState, cartline, deliveryMode);\n }\n })\n .catch(error => {});\n } else {\n if (!cartState) {\n return;\n }\n cartline.DeliveryMode = '';\n cartline.FulfillmentStoreId = '';\n cartline.ShippingAddress = {};\n cartState\n .clearCartLinePickupLocation({ cartLineId: cartline.LineId! })\n .then(result => {\n if (result.status === 'SUCCESS') {\n props.locationChangedHandler();\n }\n })\n .catch(error => {});\n }\n };\n\n const _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\n if (!orgUnitLocations || !fulfillmentStoreId || orgUnitLocations.length === 0) {\n return '';\n }\n\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\n });\n\n if (foundLocation) {\n return foundLocation.OrgUnitName;\n }\n return fulfillmentStoreId;\n };\n\n const _renderShippingMethod = (\n cartLine: CartLine,\n shipItText: string,\n pickupInStoretext: string,\n changeStoreText: string,\n orgUnitLocations: OrgUnitLocation[] | undefined\n ): JSX.Element => {\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, orgUnitLocations);\n const bopisSelected = !!cartLine.FulfillmentStoreId;\n\n const toggleBOPIS = (isBopisSelected: boolean) => {\n return () => {\n _toggleBOPIS(isBopisSelected);\n };\n };\n\n return (\n <>\n \n \n {cartLine.FulfillmentStoreId ? (\n
\n {orgUnitName}\n \n
\n ) : null}\n \n );\n };\n\n const _getDeliveryOption = (pickupStore: IPickUpInStoreProps, deliveryOptions: ProductDeliveryOptions) => {\n const delivery = deliveryOptions?.DeliveryOptions?.find(option => option.Code === pickupStore.pickupDeliveryModeCode);\n return delivery?.Description;\n };\n\n /**\n * Method to check if we have atleast one common delivery code between product and channel.\n * @param productdeliveryOptions - Product DeliveryOption List.\n * @param storePickUpOptionList - Channel DeliveryOption List.\n * @returns Boolean flag.\n */\n const matchDeliveryOptions = (\n productdeliveryOptions: DeliveryOption[] | undefined,\n storePickUpOptionList: string[] | undefined\n ): boolean => {\n const deliveryOption: string[] = [];\n productdeliveryOptions?.map(delivery => {\n const pickup = storePickUpOptionList?.find(deliveryCode => deliveryCode === delivery.Code);\n if (pickup) {\n deliveryOption.push(pickup);\n }\n return deliveryOption;\n });\n\n return ArrayExtensions.hasElements(deliveryOption);\n };\n\n // If no delivery options present on the product, or none of the delivery options\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\n if (!props.deliveryOptions || !props.deliveryOptions.DeliveryOptions) {\n return undefined;\n }\n\n if (props.retailMulitplePickupFeatureState && props.channelDeliveryOptionConfig) {\n if (!matchDeliveryOptions(props.deliveryOptions.DeliveryOptions, props.channelDeliveryOptionConfig?.PickupDeliveryModeCodes)) {\n return undefined;\n }\n } else if (\n !props.pickupDeliveryModeCode ||\n !props.deliveryOptions.DeliveryOptions.find(option => option.Code === props.pickupDeliveryModeCode)\n ) {\n return undefined;\n }\n\n return {\n callbacks: {\n toggleBopis: _toggleBOPIS\n },\n defaultComponent: _renderShippingMethod(\n props.cartline,\n props.shipitText,\n props.pickUpInStoreText,\n props.changeStoreText,\n props.orgUnitLocations\n ),\n orgUnitName: _getOrgUnitName(props.cartline.FulfillmentStoreId, props.orgUnitLocations),\n isBopisSelected: !!props.cartline.FulfillmentStoreId,\n deliveryOption: _getDeliveryOption(props, props.deliveryOptions),\n ContainerProps: {\n className: 'msc-cart-line__bopis-container'\n }\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IImageData, IRequestContext, IVideoData } from '@msdyn365-commerce/core';\n\nexport enum MediaType {\n /**\n * The None.\n */\n None = 0,\n /**\n * The Image type.\n */\n Image = 1,\n /**\n * The video type.\n */\n Video = 2,\n /**\n * The file type.\n */\n File = 3\n}\n\nexport interface IMediaData extends IImageData {\n mediaTypeValue?: MediaType;\n displayOrder?: number;\n videoData?: IVideoData;\n}\n\n/**\n * Gets correct alt text for image based on configuration of site.\n * @param productName Product name.\n * @param context Current request context.\n * @param imageAltText Alt-text from CMS image.\n */\nexport function getAltText(\n context: IRequestContext,\n shouldUseCmsAltText: boolean,\n productName?: string,\n imageAltText?: string\n): string | undefined {\n if (!context?.app?.config?.OmniChannelMedia) {\n return productName;\n }\n if (shouldUseCmsAltText) {\n return imageAltText;\n }\n return productName;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n commerceApiRequest,\n commerceVideoMetadataRequest,\n getCatalogId,\n IActionContext,\n IImageData,\n IImageSettings,\n IVideoData\n} from '@msdyn365-commerce/core';\nimport { MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n getMediaLocationsForSelectedVariant,\n MediaLocationsForSelectedVariantInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { getAltText } from './helper';\n\nasync function validateMediaLocationAsync(mediaLocation: MediaLocation): Promise<[IImageData, boolean]> {\n const imageData: IImageData = {\n src: mediaLocation.Uri || '',\n altText: mediaLocation.AltText || ''\n };\n if (mediaLocation.IsApplicableForChildEntities) {\n imageData.additionalProperties = { isApplicableForChildEntities: 'true' };\n }\n\n if (imageData.src === '') {\n return [imageData, false];\n }\n\n return new Promise<[IImageData, boolean]>(resolve => {\n try {\n const http = new XMLHttpRequest();\n http.open('HEAD', imageData.src!, true);\n\n http.addEventListener('load', () => {\n resolve([imageData, http.status === 200 || http.status === 201]);\n });\n\n http.addEventListener('error', () => {\n resolve([imageData, false]);\n });\n\n http.send();\n } catch {\n resolve([imageData, false]);\n }\n });\n}\n\nexport async function getValidProductImages(\n productId: number,\n channelId: number,\n actionContext: IActionContext,\n imageSettings: IImageSettings,\n selectedProduct?: SimpleProduct\n): Promise {\n const catalogId = getCatalogId(actionContext.requestContext);\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\n\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n .then(mediaLocations => {\n if (mediaLocations) {\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation))).then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n });\n }\n\n return [];\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n return [];\n });\n}\n\n/**\n * Gets product variant images on dimension change of buy-box module for Omni scenario.\n * @param productId Product record id.\n * @param shouldUseCmsAltText Alt-text source to use.\n * @param channelId Current channel id.\n * @param actionContext Current action context.\n * @param productName Product name.\n * @param selectedProduct Currently selected variant product.\n * @returns List of images.\n */\n\nexport async function getProductImages(\n productId: number,\n shouldUseCmsAltText: boolean,\n channelId: number,\n actionContext: IActionContext,\n productName?: string,\n selectedProduct?: SimpleProduct\n): Promise {\n const catalogId = getCatalogId(actionContext.requestContext);\n if (actionContext.requestContext?.params?.isPreview) {\n const response = await commerceApiRequest(actionContext.requestContext, 'msdyn365-ochannel-product-info', 'post', {\n productId: productId,\n channelId: channelId,\n catalogId: catalogId\n });\n if (response.status !== 200) {\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant for preview scenario');\n return [];\n }\n const previewImageData = response?.data as MediaLocation[];\n if (previewImageData) {\n return previewImageData.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\n displayOrder: mediaLocation.DisplayOrder,\n mediaTypeValue: mediaLocation.MediaTypeValue,\n additionalProperties: mediaLocation.IsApplicableForChildEntities\n ? {\n isApplicableForChildEntities: 'true'\n }\n : undefined\n };\n });\n }\n return [];\n }\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n .then(mediaLocations => {\n if (mediaLocations) {\n return mediaLocations.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\n displayOrder: mediaLocation.DisplayOrder,\n mediaTypeValue: mediaLocation.MediaTypeValue,\n additionalProperties: mediaLocation.IsApplicableForChildEntities\n ? {\n isApplicableForChildEntities: 'true'\n }\n : undefined\n };\n });\n }\n return [];\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n return [];\n });\n}\n\nexport async function validateProductImages(\n mediaLocations: MediaLocation[],\n actionContext: IActionContext,\n imageSettings: IImageSettings\n): Promise {\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation)))\n .then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to validate product images');\n return [];\n });\n}\n\n/**\n * GetVideoMetadataFromAPI - Makes API call to get video metadata.\n * @param videoId: Video Id\n * @param actionContext: Action context\n * @returns: Returns the meta data of the video.\n */\nexport async function getVideoMetadataFromApi(videoId: string, actionContext: IActionContext): Promise {\n let videoPlayerData: IVideoData | undefined;\n if (videoId) {\n const response = await commerceVideoMetadataRequest(actionContext.requestContext, [videoId]);\n\n if (response.status !== 200) {\n actionContext.telemetry.debug(`Unable to get video metadata for videoId: ${videoId}`);\n return;\n }\n\n const videoData = response.data as [];\n if (videoData && ArrayExtensions.hasElements(videoData)) {\n videoPlayerData = videoData[0];\n }\n }\n return videoPlayerData;\n}\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport { IPickUpInStoreViewProps, PickUpInStore } from '@msdyn365-commerce-modules/cart';\r\nimport { getProductUrlSync, IProductInventoryInformation, OrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport {\r\n AddToOrderTemplateComponent, AddToWishlistComponent, CartLineItemComponent,\r\n IAddToOrderTemplateDialogResources, ICartlineResourceString, IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n IItemAddedToOrderTemplateDialogResources, IOrderTemplateNameDialogResources, IWishlistActionSuccessResult\r\n} from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IGridSettings, IImageSettings, ITelemetry, TelemetryEvent } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { CartLine, CommerceList, Customer, LineDataValidationFailure, OrgUnitLocation, ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n// import { PropertyUserActionClass } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceModels.g';\r\nimport { ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport * as React from 'react';\r\n\r\nexport interface ICartLineItemsProps {\r\n cartlines: CartLine[];\r\n cartlinesErrors: LineDataValidationFailure[];\r\n cartState: ICartState | undefined;\r\n orgUnitLocations: OrgUnitLocation[] | undefined;\r\n resources: ICartlineResourceString;\r\n productAvailabilites: IProductInventoryInformation[] | undefined;\r\n products: SimpleProduct[] | undefined;\r\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\r\n pickupDeliveryModeCode?: string;\r\n /** GridSettings for the product image in cartline */\r\n gridSettings: IGridSettings;\r\n /** ImageSettings for the product image in cartline */\r\n imageSettings: IImageSettings;\r\n id: string;\r\n typeName: string;\r\n context: ICoreContext;\r\n telemetry: ITelemetry;\r\n removeButtonText: string;\r\n addToWishlistButtonText: string;\r\n removeFromWishlistButtonText: string;\r\n shipItText: string;\r\n pickitUpText: string;\r\n changeStoreText: string;\r\n outOfStockText: string;\r\n outOfRangeOneText: string;\r\n outOfRangeFormatText: string;\r\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\r\n isStockCheckEnabled: boolean;\r\n wishlists: CommerceList[] | undefined;\r\n defaultWishlistName: string;\r\n maxCartlineQuantity: number;\r\n includeErrors?: boolean;\r\n showShippingChargesForLineItems?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n isQuantityLimitsFeatureEnabled: boolean;\r\n storeSelectorModuleId?: string;\r\n\r\n addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\r\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\r\n itemAddedToOrderTemplateDialogResources: IItemAddedToOrderTemplateDialogResources;\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\r\n\r\n addToOrderTemplateButtonText: string;\r\n addToOrderTemplateMessage: string;\r\n addItemToOrderTemplateError: string;\r\n orderTemplates: OrderTemplate[] | undefined;\r\n customerInformation: Customer | undefined;\r\n\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\r\n updateCartLinesQuantitySuccessHandler(cartline: CartLine, quantity: number): boolean;\r\n locationChangedHandler(): void;\r\n}\r\n\r\nexport interface ICartlinesViewProps {\r\n cartline: React.ReactNode;\r\n pickUpInStore?: IPickUpInStoreViewProps;\r\n remove: React.ReactNode;\r\n addToWishlist: React.ReactNode | undefined;\r\n addToOrderTemplate: React.ReactNode | undefined;\r\n\r\n error?: string;\r\n\r\n data?: {\r\n product: SimpleProduct;\r\n cartline: CartLine;\r\n };\r\n}\r\n\r\nconst _getProduct = (productId: number | undefined, products: SimpleProduct[]): SimpleProduct | undefined => {\r\n if (productId !== undefined && products) {\r\n return products.find(product => {\r\n return productId === product.RecordId;\r\n });\r\n }\r\n return undefined;\r\n};\r\n\r\nconst _getCartItemMaxQuantity = (maxCartlineQuantity: number, isStockCheckEnabled: boolean, productAvailability?: IProductInventoryInformation, productMaxQuantity?: number) => {\r\n const lineMaxQuantity = productMaxQuantity ? productMaxQuantity : maxCartlineQuantity;\r\n\r\n if (isStockCheckEnabled) {\r\n if (!productAvailability || !productAvailability.ProductAvailableQuantity || !productAvailability.IsProductAvailable || !productAvailability.ProductAvailableQuantity.AvailableQuantity) {\r\n return 0;\r\n }\r\n return productAvailability.ProductAvailableQuantity.AvailableQuantity ? productAvailability.ProductAvailableQuantity.AvailableQuantity : lineMaxQuantity;\r\n }\r\n\r\n return lineMaxQuantity;\r\n};\r\n\r\nconst _getErrorMessage = (maxQuantity: number, currentQuantity: number, props: ICartLineItemsProps, lineIndex: number, isServiceItem: boolean, eoqQuantity:number): string | undefined => {\r\n \r\n const finalErrorMessage: string[] = [];\r\n if (props.includeErrors) {\r\n if (props.isStockCheckEnabled && !isServiceItem) {\r\n if (maxQuantity <= 0) {\r\n finalErrorMessage.push(props.outOfStockText);\r\n } else if (maxQuantity < currentQuantity) {\r\n if (maxQuantity === 1) {\r\n finalErrorMessage.push(props.outOfRangeOneText);\r\n } else {\r\n finalErrorMessage.push(props.outOfRangeFormatText.replace('{numLeft}', maxQuantity.toString()));\r\n }\r\n }\r\n }\r\n }\r\n const eoqErrorMessage = `Must be purchased in multiples of ${eoqQuantity}`;\r\n\r\n // server-side validation\r\n props.cartlinesErrors\r\n .filter(i => i.LineIndex === lineIndex)\r\n .forEach(i => {\r\n if (\r\n i.DataValidationFailure?.ErrorResourceId === \"Microsoft_Dynamics_Commerce_Runtime_ItemQuantityViolatesMultiplicityOfConfiguredNumber\" ||\r\n i.DataValidationFailure?.ErrorResourceId === \"Microsoft_Dynamics_Commerce_Runtime_ItemQuantityLessThanMinimumAndViolatesMultiplicityOfConfiguredNumber\") {\r\n finalErrorMessage.push(eoqErrorMessage);\r\n } else if (i.DataValidationFailure?.ErrorContext) {\r\n finalErrorMessage.push(i.DataValidationFailure.ErrorContext);\r\n }\r\n });\r\n\r\n if (finalErrorMessage.length > 0) {\r\n return finalErrorMessage.join(' ');\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\n// tslint:disable-next-line:max-func-body-length\r\nconst _assembleNode = (\r\n cartline: CartLine,\r\n product: SimpleProduct,\r\n props: ICartLineItemsProps,\r\n index: number,\r\n foundProductAvailability?: IProductInventoryInformation,\r\n foundProductDeliveryOptions?: ProductDeliveryOptions)\r\n : ICartlinesViewProps => {\r\n const { imageSettings, gridSettings, id, typeName, context, resources, removeButtonText,\r\n removeItemClickHandler, moveToWishlistSuccessHandler, addToOrderTemplateButtonText,\r\n addToOrderTemplateDialogResources, createOrderTemplateDialogResources,\r\n itemAddedToOrderTemplateDialogResources, duplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n addToWishlistButtonText, removeFromWishlistButtonText, orderTemplates, customerInformation,\r\n wishlists, defaultWishlistName, storeSelectorModuleId } = props;\r\n\r\n const isAuthenticated = context.request.user.isAuthenticated;\r\n const nameOfWishlist = wishlists && wishlists.length > 0 && wishlists[0].Name ? wishlists[0].Name : defaultWishlistName;\r\n const maxQuantity = _getCartItemMaxQuantity(\r\n props.maxCartlineQuantity,\r\n props.isStockCheckEnabled,\r\n foundProductAvailability,\r\n props.isQuantityLimitsFeatureEnabled ? product.Behavior?.MaximumQuantity : undefined);\r\n\r\n // check if the product is service or not by product type\r\n const PRODUCTASSERVICE = 2 as ReleasedProductType.Service;\r\n const isServiceItem = product.ItemTypeValue === PRODUCTASSERVICE;\r\n\r\n const isB2B = props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits === 'b2b';\r\n const eoqQuantity:number =isB2B? product.Behavior?.MultipleOfQuantity || 1 : 1;\r\n const errorMessage = _getErrorMessage(maxQuantity, cartline.Quantity!, props, index, isServiceItem, eoqQuantity);\r\n\r\n const onRemoveClickHandler = (event: React.MouseEvent) => { removeItemClickHandler(cartline);};\r\n const payload = getPayloadObject(TelemetryEvent.RemoveFromCart, props.telemetryContent!, removeButtonText, '');\r\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\r\n\r\n const inventoryLbl = foundProductAvailability?.StockLevelLabel;\r\n const inventoryCode = foundProductAvailability ? `ms-cart-line__inventory-code-${foundProductAvailability.StockLevelCode?.toLowerCase()}` : undefined;\r\n return {\r\n data: {\r\n product: product,\r\n cartline: cartline\r\n },\r\n error: errorMessage,\r\n cartline: (\r\n ),\r\n pickUpInStore: (\r\n PickUpInStore({\r\n storeSelectorModuleId: storeSelectorModuleId,\r\n cartState: props.cartState,\r\n cartline: cartline,\r\n product: product,\r\n shipitText: props.shipItText,\r\n pickUpInStoreText: props.pickitUpText,\r\n changeStoreText: props.changeStoreText,\r\n storeSelectorStateManager: props.storeSelectorStateManager,\r\n orgUnitLocations: props.orgUnitLocations,\r\n deliveryOptions: foundProductDeliveryOptions,\r\n pickupDeliveryModeCode: props.pickupDeliveryModeCode,\r\n locationChangedHandler: props.locationChangedHandler\r\n })\r\n ),\r\n remove: (\r\n \r\n {removeButtonText}\r\n \r\n ),\r\n addToWishlist: (\r\n isAuthenticated ? (\r\n \r\n ) :\r\n undefined\r\n ),\r\n addToOrderTemplate: (\r\n\r\n isAuthenticated && orderTemplates ? (\r\n //@ts-ignore\r\n \r\n ) :\r\n undefined\r\n )\r\n };\r\n};\r\n\r\nconst _assembleCartlines = (cartlines: CartLine[], products: SimpleProduct[] | undefined, props: ICartLineItemsProps): ICartlinesViewProps[] | null => {\r\n const reactNodes: ICartlinesViewProps[] = [];\r\n\r\n if (!products || products.length === 0) {\r\n props.context.telemetry.error('Products content is empty, module wont render');\r\n return null;\r\n }\r\n\r\n cartlines.map((cartline, index) => {\r\n const product = _getProduct(cartline.ProductId, products);\r\n let foundProductAvailability;\r\n if (props.productAvailabilites && props.productAvailabilites.length > 0) {\r\n foundProductAvailability = props.productAvailabilites.find((productAvailability) => {\r\n return productAvailability.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\r\n });\r\n }\r\n let foundProductDeliveryOption;\r\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\r\n foundProductDeliveryOption = props.productDeliveryOptions.find((deliveryOption) => {\r\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\r\n });\r\n }\r\n if (product) {\r\n reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability, foundProductDeliveryOption));\r\n }\r\n });\r\n\r\n return reactNodes;\r\n};\r\n\r\n/**\r\n * CartLineItems component\r\n */\r\n\r\nexport const CartLineItems = (props: ICartLineItemsProps) => {\r\n const { products, cartlines } = props;\r\n return (\r\n _assembleCartlines(cartlines, products, props)\r\n );\r\n};","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { INodeProps, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface ICartLineItemPromotion {\n id: string;\n showPromotionPopup: boolean;\n promotions: CartPromotionLine[] | undefined;\n resources: ICartLineItemPromotionResourceString;\n onSeeAllClick(event: React.MouseEvent): void;\n onCloseButtonClick(): void;\n}\n\nexport interface ICartLineItemViewProps {\n promotionMessageWrapper: INodeProps;\n promotionMessage: React.ReactNode;\n promotionSeeAllLink: React.ReactElement;\n promotionDialog: React.ReactNode;\n}\n\nexport interface ICartLineItemPromotionResourceString {\n promotionLinkText: string;\n promotionStringHeading: string;\n promotionPopupHeading: string;\n promotionCloseButtonAriaLabel: string;\n}\n\nexport const cartPromotions = (props: ICartLineItemPromotion): ICartLineItemViewProps | undefined => {\n const {\n id,\n showPromotionPopup,\n promotions,\n resources: { promotionLinkText, promotionPopupHeading },\n onCloseButtonClick,\n onSeeAllClick\n } = props;\n\n if (!ArrayExtensions.hasElements(promotions)) {\n return;\n }\n\n const titleId = `${id}_title`;\n const className = 'msc-cart__promotion';\n return {\n promotionMessageWrapper: {\n className: 'msc-cart__promotion'\n },\n promotionMessage: (\n <>\n \n {props.resources.promotionStringHeading}\n \n ),\n promotionSeeAllLink: (\n
\n {` `}\n {promotionLinkText} {` `}\n \n ),\n promotionDialog: (\n \n \n
\n {promotionPopupHeading}\n
\n
\n \n
    \n {promotions.map(_promotion => {\n return (\n
  • \n {_promotion.Promotion?.OfferName} {` `}\n
  • \n );\n })}\n
\n
\n \n
\n )\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartLineItemComponent, ICartlineResourceString } from '@msdyn365-commerce/components';\nimport MsDyn365, { ICoreContext, IGridSettings, IImageSettings, ITelemetry, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport {\n CartLine,\n ChannelDeliveryOptionConfiguration,\n OrgUnitLocation,\n ProductAvailableQuantity,\n ProductDeliveryOptions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { ProductCatalog, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { getProductUrlSync, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '../../../Common/get-product';\n\nexport interface IFlyoutCartLineItemsProps {\n cartlines: CartLine[];\n cartState: ICartState | undefined;\n orgUnitLocations: OrgUnitLocation[] | undefined;\n resources: ICartlineResourceString;\n productAvailabilites: IProductInventoryInformation[] | undefined;\n products: SimpleProduct[] | undefined;\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\n pickupDeliveryModeCode?: string;\n catalogs?: ProductCatalog[];\n\n /**\n * GridSettings for the product image in cartline\n */\n gridSettings: IGridSettings;\n\n /**\n * ImageSettings for the product image in cartline\n */\n imageSettings: IImageSettings;\n id: string;\n typeName: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n removeButtonText: string;\n outOfStockText: string;\n outOfRangeOneText: string;\n outOfRangeFormatText: string;\n maxCartlineQuantity: number;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n isQuantityLimitsFeatureEnabled: boolean;\n\n outOfStockThreshold: number;\n isStockCheckEnabled: boolean;\n telemetryContent?: ITelemetryContent;\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n}\n\nexport interface IFlyoutCartLineItemViewProps {\n cartline: React.ReactNode;\n remove: React.ReactNode;\n storeLocation: React.ReactNode;\n hasError: boolean;\n\n data: {\n product: SimpleProduct;\n cartline: CartLine;\n };\n}\n\nconst _getCartItemAvailableQuantity = (\n isStockCheckEnabled: boolean,\n outOfStockThreshold: number,\n productAvailability?: ProductAvailableQuantity\n): number => {\n if (isStockCheckEnabled) {\n if (\n !productAvailability ||\n !productAvailability.AvailableQuantity ||\n productAvailability.AvailableQuantity <= 0 ||\n productAvailability.AvailableQuantity <= outOfStockThreshold\n ) {\n return 0;\n }\n return productAvailability.AvailableQuantity - outOfStockThreshold;\n }\n\n return 0;\n};\n\nconst _getCartItemMaxQuantity = (\n maxQuantityByConfig: number,\n isStockCheckEnabled: boolean,\n availableQuantityInStock: number,\n isQuantityLimitsFeatureEnabled: boolean,\n maxByQuantityLimitsFeature: number\n) => {\n if (isQuantityLimitsFeatureEnabled) {\n let maxByQuantityLimitsFeatureResult = maxByQuantityLimitsFeature;\n\n // If max by feature in not defined when feature is on then we suggest that there is no max by feature\n // and consider available qty if stock check enabled and max from config in site settings.\n if (!maxByQuantityLimitsFeature) {\n maxByQuantityLimitsFeatureResult = maxQuantityByConfig || 10;\n }\n\n return isStockCheckEnabled\n ? maxByQuantityLimitsFeatureResult < availableQuantityInStock\n ? maxByQuantityLimitsFeatureResult\n : availableQuantityInStock\n : maxByQuantityLimitsFeatureResult;\n }\n if (isStockCheckEnabled) {\n return availableQuantityInStock < maxQuantityByConfig ? availableQuantityInStock : maxQuantityByConfig;\n }\n return maxQuantityByConfig;\n};\n\n/**\n * On Remove Click functionality.\n * @param removeItemClickHandler -Remove item click function.\n * @param cartline -CartLine.\n * @returns Remove change value.\n */\nconst onRemoveClickFunction = (removeItemClickHandler: (cartlineToRemove: CartLine) => void, cartline: CartLine) => () => {\n removeItemClickHandler(cartline);\n};\nconst _assembleNode = (\n cartline: CartLine,\n product: SimpleProduct,\n props: IFlyoutCartLineItemsProps,\n index: number,\n foundProductAvailability?: ProductAvailableQuantity,\n foundProductDeliveryOptions?: ProductDeliveryOptions\n): IFlyoutCartLineItemViewProps => {\n const { imageSettings, gridSettings, id, typeName, context, resources, removeButtonText, removeItemClickHandler } = props;\n\n const availableQuantityInStock = _getCartItemAvailableQuantity(\n props.isStockCheckEnabled,\n props.outOfStockThreshold,\n foundProductAvailability\n );\n const maxQuantity =\n product &&\n _getCartItemMaxQuantity(\n props.maxCartlineQuantity,\n props.isStockCheckEnabled,\n availableQuantityInStock,\n props.isQuantityLimitsFeatureEnabled,\n product?.Behavior?.MaximumQuantity || 0\n );\n\n // Check if the product is service or not by product type\n const isServiceItem = product.ItemTypeValue === ReleasedProductType.Service;\n\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.RemoveCartItem);\n const removeCartItemAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n let productUrl = getProductUrlSync(product, props.context.actionContext, undefined);\n if (MsDyn365.isBrowser && isChannelTypeB2B(props.context.actionContext.requestContext)) {\n const fullUrl = new URL(productUrl, window.location.href);\n fullUrl.searchParams.set('catalogid', `${cartline.CatalogId ?? 0}`);\n productUrl = fullUrl.href;\n }\n\n return {\n data: {\n product,\n cartline\n },\n hasError: !isServiceItem && props.isStockCheckEnabled ? cartline.Quantity! > maxQuantity : false,\n cartline: (\n \n ),\n remove: (\n \n {removeButtonText}\n \n ),\n storeLocation: _renderStoreLocation(cartline, props)\n };\n};\n\nconst _renderDeliveryLocation = (cartLine: CartLine | null | undefined, props: IFlyoutCartLineItemsProps): string | undefined => {\n let deliverylocation;\n if (cartLine && cartLine.FulfillmentStoreId) {\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\n\n let foundProductDeliveryOption;\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\n foundProductDeliveryOption = props.productDeliveryOptions.find(deliveryOption => {\n return deliveryOption && deliveryOption.ProductId === cartLine.ProductId;\n });\n }\n const delivery = foundProductDeliveryOption?.DeliveryOptions?.find(option => option.Code === cartLine.DeliveryMode);\n const location = delivery?.Description;\n\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n if (location) {\n deliverylocation = `${location}, ${orgUnitName}`;\n } else {\n deliverylocation = `${orgUnitName}`;\n }\n } else {\n deliverylocation = props.resources.shippingText;\n }\n return deliverylocation;\n};\n\nconst _renderStoreLocation = (cartLine: CartLine | null | undefined, props: IFlyoutCartLineItemsProps): JSX.Element | null => {\n if (cartLine && cartLine.FulfillmentStoreId) {\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\n\n if (orgUnitName) {\n return (\n
\n {orgUnitName}\n
\n );\n }\n }\n\n return null;\n};\n\nconst _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\n if (!orgUnitLocations || !fulfillmentStoreId || orgUnitLocations.length === 0) {\n return '';\n }\n\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\n });\n\n if (foundLocation) {\n return foundLocation.OrgUnitName;\n }\n return fulfillmentStoreId;\n};\n\nconst _assembleCartlines = (\n cartlines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: IFlyoutCartLineItemsProps\n): IFlyoutCartLineItemViewProps[] | null => {\n const reactNodes: IFlyoutCartLineItemViewProps[] = [];\n\n if (!products || products.length === 0) {\n props.context.telemetry.error('Cartlines content is empty, module wont render');\n return null;\n }\n\n cartlines.map((cartline, index) => {\n let product;\n if (props.isQuantityLimitsFeatureEnabled) {\n // When feature is enabled the same products could have different quantity limits in Behavior so we need\n // to check productId and WarehouseId for identification.\n product = getProductByProductIdAndWarehouse(cartline.ProductId, products, cartline.WarehouseId, props.cartState);\n } else {\n product = getProductByProductId(cartline.ProductId, products);\n }\n let foundProductAvailability;\n if (props.productAvailabilites && props.productAvailabilites.length > 0) {\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\n return productAvailability.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\n });\n }\n let foundProductDeliveryOption;\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\n foundProductDeliveryOption = props.productDeliveryOptions.find(deliveryOption => {\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\n });\n }\n if (product) {\n reactNodes.push(\n _assembleNode(\n cartline,\n product,\n props,\n index,\n foundProductAvailability?.ProductAvailableQuantity,\n foundProductDeliveryOption\n )\n );\n }\n });\n\n return reactNodes;\n};\n\n/**\n * CartLineItems component.\n */\n\nexport const FlyoutCartLineItems = (props: IFlyoutCartLineItemsProps) => {\n const { products, cartlines } = props;\n return _assembleCartlines(cartlines, products, props);\n};\n"],"names":["ProductPickUpOptionsForCartLineItems","constructor","apiSettings","getCacheKey","buildCacheKey","this","getCacheObjectType","dataCacheType","async","getPickUpOptionsForCartLineItems","input","context","channelId","Error","cart","getCartState","products","getActiveCartProductsAction","ActiveCartProductsInput","response","undefined","ArrayExtensions","hasElements","Promise","resolve","ProductsDataActions","callerContext","queryResultSettings","QueryResultSettingsProxy","getPagingFromInputDataOrDefaultValue","map","product","RecordId","createObservableDataAction","id","action","inputData","requestContext","CartLineGroupItems","props","cartlines","hasInvoiceLine","_assembleGroupInvoiceCartlines","cartLines","reactNodes","length","carLineViewProps","assembleCartlines","push","_assembleGroupCartlines","telemetry","error","getGroupByStorePickup","items","groupBy","item","FulfillmentStoreId","groupDelivery","DeliveryMode","cartLinesGroup","Object","entries","forEach","_ref","deliveryType","groupByDeliveryType","keys","key","index","cartLine","getPromotionData","ctx","promotionData","getPromotionOptionsForCartLineItems","PromotionOptionsForCartLineItems","then","promotionOptions","catch","exception","Cart","React","super","isQuantityLimitsFeatureEnabled","_isMounted","promotionPopupId","promotionLinkClick","event","setState","showPromotionDialog","state","promotionCloseButtonclick","_hidePromotionDialog","getImageSettings","imageSettings","viewports","xs","q","w","h","sm","lg","lazyload","removeItemFromCartHandler","cartlineToRemove","data","result","cartLineIds","LineId","toString","removeCartLines","validateCart","warning","debug","moveToWishlistSuccessHandler","cartline","status","updateCartlineQuantity","cartlineToUpdate","quantity","lineIndex","cartLineQuantityUpdatedAsync","cartActionResult","message","cartlinesErrors","ObjectExtensions","isNullOrUndefined","_cartActionResult$err","lineUpdateFailure","ValidationFailures","ErrorContext","validationResults","LocalizedMessage","errorDetails","ValidationResultsPairs","fulfillmentStoreIdUpdated","actionContext","telemetryContent","getTelemetryObject","request","telemetryPageName","friendlyName","payLoad","getPayloadObject","bind","isCartValid","productPickUpOptions","config","_this$props$data$cart","getOrderQuantityLimitsFeatureFlag","_isChannelLimitsFeatureEnabled","showAvailablePromotions","CartLines","reaction","_this$props$data$cart2","_this$props$data$cart3","componentWillUnmount","shouldComponentUpdate","nextProps","nextState","render","_this$props$context$r","_cart$cart$CartLines","_this$props$data$prod","_this$props$data$feat","_featureState$result","user","isAuthenticated","signInUrl","resources","guestCheckoutUrl","getUrlSync","backToShoppingUrl","checkoutURL","getCheckoutURL","isCartEmpty","_getCartLines","emailDeliveryModeCode","channel","EmailDeliveryModeCode","validInventoryAcrossCartLines","validateCartLinesInventory","productAvailabilites","hasError","isValid","some","RetailMultiplePickupFeatureState","featureState","find","Name","multiplePickUpEnabled","IsEnabled","isMultipleCatalogsFeatureEnabled","currentCatalogId","getCatalogId","validateCatalogId","getCartLinesGroup","contentAction","etext","TelemetryConstant","Checkout","checkoutBySignInAttributes","getTelemetryAttributes","GuestCheckout","checkoutByGuestAttributes","BackToShopping","backtoShoppingAttributes","cartLineGroup","_updateCartLineErrorForInvalidInventory","viewProps","_objectSpread","className","classnames","title","cartTitle","CartlinesWrapper","OrderSummaryWrapper","OrderSummaryItems","promoCode","_getPromoCode","_getPromotions","typeName","removePromoAriaLabelFormat","orderSummaryHeading","invoiceSummaryTitle","orderSummaryTitle","orderSummaryLineitems","_getOrderSummaryLineItems","invoiceSummaryLineitems","_getInvoiceSummaryLineItems","checkoutAsSignInUserButton","Button","assign","disabled","href","checkoutButtonTitle","checkoutAsGuestButton","showGuestCheckoutButton","guestCheckoutButtonTitle","expressCheckoutButton","slots","paymentExpress","ExpressCheckoutSectionWrapper","backToShoppingButton","backToShoppingButtonTitle","createTemplateFromCartButton","_displayAddCartToTemplate","SaveCartToOrderTemplateComponent","addToOrderTemplateDialogResources","_generateAddToOrderTemplateDialogResources","createOrderTemplateDialogResources","_generateOrderTemplateNameDialogResources","linesAddedToOrderTemplateDialogResources","_generateLinesAddedToOrderTemplateDialogResources","duplicateItemsWhenAddingToOrderTemplateDialogResources","_generateDuplicateItemsWhenAddingToOrderTemplateDialogResources","createOrderTemplateFromCartButton","createOrderTemplateFromCartButtonTooltip","isMultipleCatalogFeatureEnabledInHq","catalogId","orderTemplates","customerInformation","checkoutBlockedDueToUnavailableFunds","storeSelector","removeItemClickHandler","waitingComponent","Waiting","cartLoadingStatus","cartLoadingErrorMessage","cartDataResult","isEmpty","OrderSummaryErrors","_getOrderSummaryErrors","renderView","_this$props$data$cart4","_cart$cart","isChannelTypeB2B","cartPromotions","showPromotionPopup","onSeeAllClick","onCloseButtonClick","promotions","promotionStringHeading","promotionLinkText","promotionPopupHeading","promotionCloseButtonAriaLabel","cartLineInventoryValidationResult","productIdWithErrors","productIdWithError","element","_element$data","ProductId","outOfStockErrorMessage","allErrors","_cartline$data","ItemTypeValue","ReleasedProductType","Service","_cartline$data$produc","fullError","filter","line","Wrapper","tag","Alert","isOpen","color","assertive","outOfStockErrorMessageHeader","header","errors","InvoiceSummary","orderTotalLabel","totalAmountLabel","invoiceLabel","_this$props","_featureState$result2","_this$props$context$r2","channelDeliveryOptionConfig","channelConfiguration","retailMultiplePickUpOptionEnabled","isShowOrHideTaxEnabled","app","isEnableShowOrHideSalesTaxECommerceEnabled","OrderSummary","subTotalLabel","itemsWithCountLabel","shippingLabel","estimatedShippingLabel","otherChargeLabel","otherCharges","taxLabel","estimatedTaxLabel","orderTotal","totalDiscountsLabel","toBeCalculatedText","yetToBeCalculatedText","freeText","priceFree","isTaxIncludedInPrice","IsTaxIncludedInPrice","isShowTaxBreakup","PromoCodeComponent","promoCodeHeadingText","promoPlaceholderText","promoCodeApplyButtonText","appliedPromoCodeHeadingText","collapseTimeOut","removePromoText","invalidPromoCodeErrorText","failedToAddPromoCodeErrorText","failedToRemovePromoCodeErrorText","duplicatePromoCodeErrorText","duplicatePromotionErrorText","addToOrderTemplateHeader","noOrderTemplatesMessage","noOrderTemplatesDescription","createAnOrderTemplateButtonText","createNewOrderTemplateButtonText","cancelOrderTemplateCreationButtonText","selectTemplatesText","addToTemplateButtonText","lineItemsText","_generateItemAddedToOrderTemplateDialogResources","viewOrderTemplateButtonText","continueShoppingButtonText","itemAddedToOrderTemplateHeaderItemOneText","itemAddedToOrderTemplateHeaderItemFormatText","itemAddedToOrderTemplateHeaderMessageText","freePriceText","originalPriceText","currentPriceText","linesAddedToOrderTemplateHeaderItemsOneText","linesAddedToOrderTemplateHeaderItemsFormatText","linesAddedToOrderTemplateHeaderLinesOneText","linesAddedToOrderTemplateHeaderLinesFormatText","linesAddedToOrderTemplateHeaderMessageText","linesAddedToOrderTemplateCustomPriceAlertMessageText","duplicatedProductsHeader","duplicatedProductsDescription","updateQuantityButtonText","cancelDuplicateItemsButtonText","orderTemplateHeaderLabel","createOrderTemplateHeader","orderTemplateTitleLabel","orderTemplateTitle","orderTemplateNameAriaLabel","orderTemplateDescription","createOrderTemplateDescription","defaultOrderTemplateName","orderTemplateButtonLabel","createOrderTemplateButtonText","orderTemplateCancelButtonLabel","cancelNewOrderTemplateCreationButtonText","_this$props$data$feat2","_this$props$data$feat3","_this$props$data$cata","wishlists","PickupDeliveryModeCode","modules","storeSelectorId","CartLineItems","storeSelectorModuleId","productDeliveryOptions","deliveryOptions","catalogs","isStockCheckEnabled","enableStockCheck","maxCartlineQuantity","updateMaxQuantityForCartLineItem","maxQuantityForCartLineItem","shouldIgnoreWarehouse","warehouseAggregation","gridSettings","retailMulitplePickupFeatureState","sizeString","productDimensionTypeSize","colorString","productDimensionTypeColor","configString","productDimensionTypeConfiguration","styleString","productDimensionTypeStyle","amountString","productDimensionTypeAmount","quantityDisplayString","quantityDisplayText","inputQuantityAriaLabel","decrementButtonAriaLabel","incrementButtonAriaLabel","discountStringText","shippingChargesText","shippingCharges","salesAgreementPricePrompt","priceEditorResources","addToWishlistButtonText","removeFromWishlistButtonText","removeButtonText","removeCartButtonText","shipItText","shipInsteadDisplayText","pickitUpText","pickItUpDisplayText","changeStoreText","changeStoreDisplayText","storeSelectorStateManager","outOfStockText","outOfRangeOneText","errorMessageOutOfRangeOneLeft","outOfRangeFormatText","errorMessageOutOfRangeFormat","cartState","orgUnitLocations","updateCartLinesQuantitySuccessHandler","locationChangedHandler","defaultWishlistName","pickupDeliveryModeCode","includeErrors","showOutOfStockErrors","showShippingChargesForLineItems","itemAddedToOrderTemplateDialogResources","addToOrderTemplateButtonText","addToOrderTemplateButtonTooltip","addToOrderTemplateMessage","addItemToOrderTemplateError","productAvailability","isAbsoluteUrl","urlCheck","returnURL","MsDyn365","isBrowser","window","location","origin","includes","AsyncResult","validateCartAsync","_featureStatuses$find2","featureStatuses","_featureStatuses$find","_cartConfiguration$Ig","cartConfiguration","IgnoreOrderSettings","_this$props$context","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","customerInfo","IsB2b","_featureStatuses$find3","isChannelLimitsFeatureEnabledInHq","_this$props$data$feat4","_featureState$result3","_this$props$data$chan","_this$props$data$cata2","_this$props$data$chan2","_this$props$data$cart5","cartLinesPickUpOptions","__decorate","observer","MediaGallery","_this","_props$config$zoomedI","_inlineZoomDivRef","Map","fullScreenOverlayButtonRef","player","defaultGalleryImageSettings","md","cropFocalRegion","defaultThumbnailImageSettings","onExiting","animating","onExited","next","removeInlineZoomStyle","isLastItem","nextIndex","activeIndex","goToIndex","updateZoomedInImage","previous","images","mediaGalleryItems","isFirstItem","autoplay","currentIndex","mediaItems","_mediaItems","_this$player$current","mediaTypeValue","MediaType","Video","current","play","_this$player$current2","pause","getImagesData","skipImageValidation","OmniChannelMedia","_this$props$config$im","_this$props$config$im2","source","imageSource","mediaLocations","mediaLocationsForSelectedVariant","mediaLocation","_mediaLocation$Uri","src","Uri","altText","getAltText","shouldUseCmsAltText","AltText","additionalProperties","IsApplicableForChildEntities","isApplicableForChildEntities","curatedImages","_filterMasterImageFromVariant","_renderCarouselItemVideo","mediaData","videoData","_videoData$_links","options","playerResources","videoMetaData","videoId","duration","playTime","thumbnail","posterframeUrl","_links","binaryReferences","videoBinaryReferences","videoPlayerData","metaData","attributes","editProps","Player","ref","playerData","isEditor","params","_renderEmptyImage","_getCarouselItem","image","isInPopup","arguments","Image","fallBackSrc","fallbackImage","loadFailureBehavior","shouldSkipToMainImage","bypassHideOnFailure","_getThumbnailItem","modifiedActiveIndex","ThumbnailItemContainerProps","role","tabIndex","onClick","_generateOnThumbnailClick","onKeyDown","_generateOnThumbnailKeyDown","Picture","imageFallbackOptimize","shouldUseOptimizedImage","getVideoThumbNailItem","classes","_refHandler","divRef","set","which","KeyCodes","Enter","Space","preventDefault","_renderVideoThumbnail","fullScreenTitleText","openModalDialog","_toggleModal","imageModalSlider","ZoomView","_mapProductToImageData","carouselprops","Carousel","_renderCarouselItemImageView","_zoomedImageSettings","interval","directionTextPrev","previousScreenshotFlipperText","directionTextNext","nextScreenshotFlipperText","onIndicatorsClickHandler","showPaginationTooltip","hideIndicator","keyboard","handleOnExited","handleOnExiting","isDisabledFunctionality","isMobileImageZoomed","carousel","imageModalSliderProps","modalIsOpen","ontoggle","galleryCarousel","classNames","ImagefullView","altTextSource","mediaGalleryImages","isImageZoomed","isInitialLoad","zoomedImageSettings","galleryImageSettings","_onImageMouseOut","_inlineZoomImageOnHover","_onInlineImageClick","_onContainerZoomImageClick","_onMouseOutLensContainer","isMobile","variant","VariantType","Viewport","_this$props$config$im3","_this$props$context$r3","shouldUpdateOnPartialDimensionSelection","_setRenderType","_this$props$config$th","validateProductImages","thumbnailImageSettings","_setImages","_this$props$config$th2","getValidProductImages","productVariant","_product$productVaria","_this$props$context$a","_this$props$config$th3","getProductImages","fireImmediately","_this$props$config$th4","_this$props$context$a2","isVertical","thumbnailsOrientation","isFullscreenAllowed","allowFullScreen","zoomViewMode","imageZoom","emptyPlaceHolderImage","placeholderImageName","_this$props$context$r4","getFallbackImageUrl","ItemId","mediaGalleryCarouselItems","_getMediaGalleryItems","mediaGalleryThumbnailCarouselItems","_getMediaGalleryThumbnailItems","moduleProps","Modal","callbackToggle","callbackThumbnailClick","callbackThumbnailKeyDown","CarouselProps","indicatorAriaText","ariaLabelForSlide","Thumbnails","ThumbnailsContainerProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","vertical","flipperPrevLabel","flipperNextLabel","parentId","useTabList","JSON","stringify","lastUpdate","defaultKey","_getEmptyThumbnailItem","zoomView","curatedImage","mediaToSet","all","URL","searchParams","get","getVideoMetadataFromApi","Date","now","media","_renderImageInContainerOnZoom","_renderImageFullScreenOnZoom","_renderImageInlineOnZoom","_this$props$config$sh","_this$props$data$prod2","_this$props$data$prod3","_this$props$data$prod4","shouldHidePrimaryImages","shouldHideMasterProductImagesForVariant","variantImages","isVariantProduct","MasterProductId","itemId","_item$additionalPrope","_this$props$config$da","dataScale","defaultDataScale","onMouseOver","onMouseMove","inlineZoomImageOnMouseMove","_this$props$config$da2","inlineZoomImageOnHover","String","_handleMobileViewZoomedImageClick","target","currentTarget","mobileZoomedInImageClassName","style","transform","classList","remove","parentElement","overflow","_this$props$config$da3","bounds","getBoundingClientRect","Number","positionX","clientX","left","positionY","clientY","top","scaledPositionX","scaledPositionY","add","scrollTo","_this$props$config$da4","innerWidth","inlineZoomInitClick","inlineZoomImageOnMouseOut","onContainerZoomInit","onMouseOutLensContainer","_this$props$config$da5","onMouseOut","onMouseMoveLensContainer","onMouseOverImageContainer","_product$PrimaryImage","PrimaryImageUrl","_this$fullScreenOverl","focus","parentDiv","children","querySelector","removeAttribute","removeContainerZoomStyle","_renderCartlines","cartEmptyText","_cartLine$cartlineId","cartlineId","pickUpInStore","Node","ContainerProps","defaultComponent","addToOrderTemplate","addToWishlist","renderCartLinesGroupHeader","pickUpText","shippingText","emailShippingText","titleSeparate","_cartLine$pickUpInSto4","groupTitle","isBopisSelected","StringExtensions","isNullOrEmpty","toLowerCase","renderCartLinesGroupTitle","_cartLine$pickUpInSto","_cartLine$pickUpInSto2","_cartLine$pickUpInSto3","deliveryOption","orgUnitName","_props$cart","_props$cart2","errorData","renderModuleAttributes","promotionMessageWrapper","promotionMessage","promotionSeeAllLink","promotionDialog","_props$context$action","emailshippingText","emptyCartText","renderCartLinesGroup","_renderInvoiceSummarylines","invoiceSummaryLines","invoices","giftCard","loyalty","_renderOrderSummarylines","orderSummaryLines","subtotal","shipping","otherCharge","tax","totalDiscounts","getMiniCartData","miniCartData","getAvailabilitiesForCartLineItems","ProductAvailabilitiesForCartLineItems","availableQuantity","getDeliveryOptionsForCartLineItems","ProductDeliveryOptionsForCartLineItems","CartIcon","getSortedCartLines","sortOrder","lines","sort","item1","item2","_item2$LineNumber","_item1$LineNumber","LineNumber","_item1$LineNumber2","_item2$LineNumber2","_getImageSettings","_removeItemFromCartHandler","payload","TelemetryEvent","CheckOut","ViewShoppingBag","viewShoppingBagAttributes","_this$props$data$orgU","_setQuantityLimitsFeatureFlag","_validateCart","componentDidUpdate","prevProps","_this$state$miniCartD","_this$state$miniCartD2","enableHoverCart","isAnonymousCheckout","cartUrl","_getCheckoutURL","shouldShowMiniCart","isProductAddedToCart","addToCartBehavior","AddToCartBehavior","showMiniCart","includeFlyout","totalItemsInCart","goToCartButtonText","goToCartButtonTitle","replace","flyoutTitle","flyoutTooltip","UncontrolledTooltip","placement","hideArrow","trigger","displayMode","shouldShowCloseButton","cartPageUrl","hideAriaHidden","price","TotalAmount","priceString","totalPriceFormatString","cultureFormatter","formatCurrency","feature","cartIcon","CartIconComponent","cartLabel","cartQtyLabel","FlyoutContainer","miniCartWrapper","miniCartItemWrapper","goToCartButton","totalPrice","_cart$result$cart$Ver","_cart$result","cartVersion","Version","lastValidatedCartVersion","msdyn365Commerce","FlyoutCartLineItems","cartLinesSortOrder","outOfStockThreshold","_renderThumbnails","thumbnails","_renderThumbnailItem","Module","PromoBannerCloseButton","closeButtonAriaLabel","label","onClose","PromoBannerClose","PromoBannerLinks","links","onTextChange","editableLinks","_mapEditableLinks","Msdyn365","linkdata","link","linkText","editableLink","ariaLabel","linkUrl","destinationUrl","openInNewTab","onTelemetryClick","PromoBannerText","text","onEdit","PromoBanner","isVisible","handleTextChange","bannerMessages","value","handleLinkTextChange","linkIndex","_next","_isLastItem","_goToIndex","_previous","_isFirstItem","_onDismiss","dismissEnabled","hideFlipper","closeButtonLabel","bannerText","bannerAriaLabel","onDismiss","handleLinks","handleText","promoBannerProps","promoBannerTextProps","promoBannerLinksProps","contentProps","promoBannerText","carouselProps","closeButton","AddToCartProductListComponent","_quickOrderTemplate$q","_quickOrderTemplate$q2","quickOrderTemplate","quickOrderTemplateLines","fullProduct","ProductDetails","productListLine","Quantity","buttonLabel","quickOrderGridBuySelectedButtonText","buttonAriaLabel","quickOrderGridBuySelectedButtonAriaLabel","dialogStrings","_props$resources$quic","_props$resources$quic2","_props$resources$quic3","_props$resources$quic4","_props$resources$quic5","_props$resources$quic6","_props$resources$quic7","_props$resources$free","_props$resources$orig","_props$resources$curr","_props$resources$adde","_props$resources$quic8","_props$resources$quic9","goToCartText","quickOrderGridGoToCartText","continueShoppingText","quickOrderGridDialogCloseText","closeNotificationLabel","quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel","headerItemOneText","quickOrderGridSingleItemText","headerItemFormatText","quickOrderGridMultiLineItemFormatText","headerLinesFormatText","quickOrderGridMultiLinesFormatText","headerMessageText","quickOrderGridHeaderMessageText","addedQuantityText","buyAgainNotificationTitle","quickOrderGridBuySelectedAddingToCartErrorNotificationTitle","buyAgainNotificationCloseAriaLabel","getDialogStrings","orderDetailProducts","quickOrder","orderDetails","quickLine","_quickLine$fullProduc","salesLine","OrderDetailsProduct","getOrderDetails","AddToCartComponent","addToCartText","addToCartArialLabel","navigationUrl","shouldSkipSiteSettings","orderDetailsProducts","onError","getQuickOrderGridAddToCartDialog","moduleClassName","_result$cartActionRes","handlers","onErrorMessage","removeActionHandler","removeProductList","productList","Id","removeQuickOrderList","QuickOrderGridDrawer","_props$collapseProps$","_props$collapseProps","toggle","_isManuallyToggled","onToggle","previousState","collapseProps","_drawerGlyphClass","toggleGlyphClassName","closeGlyph","isAnimateGlyph","_drawerOpenGlyph","openGlyph","_drawerCloseGlyph","drawerClass","drawerButtonClassName","toggleButtonProps","block","isDisabled","_generateDrawerButtonInnerMarkup","Collapse","isCollapseState","drawerButtonTextClass","toggleButtonClassName","headingDrawerClass","descriptionDrawerClass","moduleHeadingText","moduleDescriptionText","_generateGlyphMarkup","glyphClass","QuickOrderGridFormComponent","productTextInput","quantityTextInput","quickOrderGridState","maxChars","minQuantity","maxQuantity","isAddtoListDisabled","ariaLabelQuantity","ariaLabelProduct","ariaLabelAddtoCart","handleQuantityChange","handleInputChange","handleAddProductListClick","onInputChange","onInputChangeFunction","onQuantityInputChange","onQuantityChangeFunction","productNode","type","onChange","quantityNode","pattern","maxLength","addToListBtn","userMessage","stateMessage","statusCssString","messageGlyph","messageText","QuickOrderGridProduct","productLine","isSelected","observable","QuickOrderGridDesktopHeaderCellsComponent","columnWithNumberClassName","quickOrderGridProductNumberText","quickOrderGridProductText","quickOrderGridUnitPriceText","quickOrderGridUnitOfMeasureText","quickOrderGridQuantityText","quickOrderGridActionsText","QuickOrderGridMobileHeaderCellsComponent","QuickOrderGridTableHeaderComponent","rowClassName","headerCells","defaultImageSettings","QuickOrderGridTableRowProductImageComponent","_props$data$product$p","_props$context$reques","_props$imageSettings","fallbackImageUrl","containerClassName","setShowPreviousActions","onChangeHandler","onChangeQuantity","itemKey","newValue","onRemoveHandler","onRemoveItem","quickOrderGridProductKey","QuickOrderGridExtraActionsPopupComponent","_props$data$product$p2","quickOrderGridViewDetailsButtonAriaLabel","quickOrderGridViewDetailsButtonText","shouldShowActions","setShowActions","useState","productUrl","isNullOrWhitespace","getProductPageUrlSync","onClickViewDetails","shouldShowActionsNewValue","actionsContainerClassName","quickOrderGridRemoveItemButtonAriaLabel","QuickOrderGridDesktopTableRowCellComponent","_props$data$product$p3","min","max","_product$Dimensions","_productListLine$Line","Dimensions","dimension","_dimension$DimensionV","DimensionValue","Value","dimensionValue","join","quickOrderGridProductDimensionsSeparator","moduleId","moduleTypeName","PriceComponent","renderProductPrice","UnitOfMeasure","renderUnitOfMeasure","IncrementalQuantity","currentCount","quickOrderGridInputQuantityAriaLabel","quickOrderGridDecrementButtonAriaLabel","quickOrderGridIncrementButtonAriaLabel","isGiftCard","IsGiftCard","callbacks","QuickOrderGridMobileTableRowCellComponent","_props$data$product$p4","_productListLine$Line2","QuickOrderGridTableRowComponent","QuickOrderGridTableComponent","setIsMobile","isMobileView","quickOrderGridProducts","isOrderQuantityLimitsFeatureEnabled","updateViewport","addEventListener","headerClassName","quickOrderProduct","_product$ProductDetai","_quickOrderProduct$pr","_quickOrderProduct$pr2","behavior","Behavior","MinimumQuantity","MaximumQuantity","Math","ProductPrice","callBacks","QuickOrderGrid","_this$props$data$feat5","_cartConfiguration$re","_cartConfiguration$re2","_waitTime","_dimensionUpdateQueueMaxLength","_errorCssClass","_errorCssGlyphClass","_dimensionUpdateQueue","FinitePromiseQueue","_dimensions","_initializedDimensions","Set","_cssClassNameConfigure","_className","_isOrderQuantityLimitsFeatureEnabled","_applyDefaultOrderSettingsForCartLine","_quickOrderGridCallbacks","initializeDimension","initializedDimension","dimensionSelectedAsync","selectedDimensionId","selectedDimensionValueId","_this$state$productDi","size","productDimensions","enqueue","_updateDimensions","FinitePromiseQueueError","ProcessWasDiscardedFromTheQueue","getDropdownName","dimensionType","_getDropdownName","changeUpdatingDimension","isUpdatingDimension","_quickOrderGridRowCallbacks","_removeItemRowFromTable","productListLineId","_changeRowQuantity","_removeProductList","token","ProductListsDataActions","reload","_updateStatusState","quickOrderGridDeleteProductListFailedText","_handleInputChange","query","productResponse","_cancellabelDebounce","cancel","isQuickOrderGridFormExpanded","_debounce","getScanResult","GetScanResultInput","results","Product","ProductDimensionFull","_updateQuantitiesInState","setTimeout","_handleQuantityChange","_this$state$productRe","currentValue","parseInt","inputElement","_quantityInput","HTMLInputElement","minimumQuantity","needToUpdateUIValue","_behavior$MinimumQuan","newCurrentValue","isNaN","setAttribute","_this$state$productRe2","ProductDimensionType","Color","Configuration","Size","Style","hasProductDimensions","dimensionsToUpdate","productDimensionErrorState","otherError","clearOtherErrorState","dimensionKey","configureErrors","errorState","mappedDimensions","_this$_updateDimensio","DimensionTypeValue","_updateDimensionValue","ExtensionProperties","selectedProduct","newProduct","getSelectedVariant","SelectedVariantInput","getDimensionsForSelectedVariant","GetDimensionsForSelectedVariantInput","variantProduct","productDimensionFull","newValueId","DimensionValues","_getDimensionErrorString","dimensionTypeValue","amountErrorMessage","quickOrderGridproductDimensionTypeAmountErrorMessage","quickOrderGridproductDimensionTypeColorErrorMessage","quickOrderGridproductDimensionTypeConfigurationErrorMessage","quickOrderGridproductDimensionTypeSizeErrorMessage","quickOrderGridproductDimensionTypeStyleErrorMessage","_productResponse$Dime","missingDimensions","_getConfigureErrors","quickOrderGridWrongQuantityErrorMsg","quickOrderTemplateLinesData","orderLineIndex","findIndex","newProductListLine","previousQuantity","_objectWithoutProperties","_excluded","list","newLine","updatedLines","updatedProductList","ProductListLines","update","ActiveProductListInput","ProductListId","_isChannelMultipleCatalogsFeatureEnabled","_addItemToProductListLine","quickOrderGridAddedToGridSuccessMessage","quickOrderGridAddedToGridFailureMessage","quickOrderGridAddedToGridDuplicateError","productListId","_productResponse$Defa","_createProductList","AddItemToProductListInput","DefaultUnitOfMeasure","addItemToProductListAction","name","CreateProductListInput","ProductListType","QuickOrder","createProductList","_productTextInput","_telemetryContent","_quickOrderGridFormClass","_quickOrderGridFormProductContent","_quickOrderGridFormMsgContent","ValidateDefaultOrderSettingsPerLine","_this$state$min","_this$state$max","quickOrderGridModuleHeading","quickOrderGridModuleDescription","quickOrderGridAddtogrid","quickOrderGridProductQuantityInputLabel","quickOrderGridProductInputLabel","quickOrderGridProductDimensionTypeColor","quickOrderGridProductDimensionTypeConfiguration","quickOrderGridSelectDimensionFormatString","quickOrderGridProductDimensionTypeSize","quickOrderGridProductDimensionTypeStyle","quickOrderGridProductDimensionTypeAmount","quickOrderGridModulePageHeading","productConfigureResources","selectDimensionFormatString","Heading","quickOrderGridProps","isB2bCustomer","actions","drawer","bulkPurchase","_renderBulkPurchase","quickOrderGridForm","quickOrderGridFormProductContent","quickOrderGridFormMsgContent","form","configure","getProductConfigure","container","_renderListContainer","orderActions","_renderQuickOrderGridActions","quickOrderGridDeleteButtonText","userMessageNode","topStateMessage","addProductListToBag","QuickOrderGridActionsView","isBulkPurchaseEnabled","bulkPurchaseSlots","containerClass","_renderQuickOrderTable","_initQuickOrderGridProducts","quickOrderGridProduct","validValues","tableClassName","_getMinQuantityForCartLineItem","_getMaxQuantityForCartLineItem","_getQuantity","_product$Behavior","_getIgnoreOrderSettings","_product$Behavior2","_cartConfiguration$re3","_cartConfiguration$re4","applyDefaultOrderSettingsForCartLine","_product$Behavior3","defaultQuantity","DefaultQuantity","dimensions","computed","PickUpInStore","_toggleBOPIS","openDialog","alreadySelectedLocation","OrgUnitNumber","onLocationSelected","orgUnitLocation","deliveryMode","updateCartLinePickupLocation","cartLineId","_onLocationChangedCallback","ShippingAddress","clearCartLinePickupLocation","_getOrgUnitName","fulfillmentStoreId","foundLocation","OrgUnitName","DeliveryOptions","_props$channelDeliver","matchDeliveryOptions","productdeliveryOptions","storePickUpOptionList","delivery","pickup","deliveryCode","Code","PickupDeliveryModeCodes","option","toggleBopis","_renderShippingMethod","pickupInStoretext","bopisSelected","toggleBOPIS","checked","shipitText","pickUpInStoreText","_getDeliveryOption","pickupStore","_deliveryOptions$Deli","Description","_assembleNode","foundProductAvailability","_foundProductAvailabi","_props$cartState","hsoConfig","nameOfWishlist","availableQuantityInStock","ProductAvailableQuantity","IsProductAvailable","AvailableQuantity","_getCartItemAvailableQuantity","_getCartItemMaxQuantity","maxQuantityByConfig","maxByQuantityLimitsFeature","maxByQuantityLimitsFeatureResult","shouldSkipStockCheck","IsInvoiceLine","estimatedDateProperty","property","Key","estimatedDateValue","StringValue","estimatedDate","StockThresholdprop","StockThresholdpropval","IntegerValue","StockThreshold","onhand","errorMessage","_getErrorMessage","currentQuantity","lineId","_props$productAvailab","finalErrorMessages","InventLocationId","WarehouseId","checkForErrors","errorsFoundByLineId","i","validation","onRemoveClickHandler","onRemoveClickFunction","RemoveFromCart","inventoryLbl","StockLevelLabel","inventoryCode","StockLevelCode","isCustomPriceSelected","getProductUrlSync","_cartline$CatalogId","fullUrl","CatalogId","getInvoiceDetailsPageUrlSync","CartLineItemComponent","isOutOfStock","isQuantityEditable","quantityOnChange","primaryImageUrl","inventoryInformationLabel","inventoryLabelClassName","isCartStateReady","AddToWishlistComponent","showButtonText","showStatusMessage","showRemoveButton","showButtonTooltip","ariaRole","onSuccess","AddToOrderTemplateComponent","shouldShowButtonFailedTooltip","disableButton","disableTooltip","getProductByProductIdAndWarehouse","getProductByProductId","_productAvailability$2","_productAvailability$3","_cartline$WarehouseId","_productAvailability$","toUpperCase","HSOConfigprop","HSOConfig","productAvailabilities","cartLineMap","IsGiftCardLine","has","_cartLineMap$get","_cartLine$Quantity2","cartLineTotal","delete","_cartLine$Quantity","productAvailabilityMap","productId","Array","from","_cartLineMap$get2","cartLineQty","cartLineProduct","isStockedItem","_cartLineProduct$Beha","IsStockedProduct","isEmailDelivery","shouldSkipInventoryCheck","_isCheckoutBlockedDueToUnavailableFunds","checkoutBlockedDueToUnavailableFundsTitle","checkoutBlockedDueToUnavailableFundsMessage","titleId","ModalHeader","ModalBody","_promotion","_promotion$Promotion","Promotion","OfferName","ModalFooter","isOboRequest","_this$props$data$cust","AllowOnAccountPayment","CreditLimit","actionInput","MediaLocationsForSelectedVariantInput","getMediaLocationsForSelectedVariant","validateMediaLocaionAsync","pairs","pair","_imageSettings$viewpo","imageData","imageSettingsVal","imageConcatVal","http","XMLHttpRequest","open","onload","onerror","send","e","pageContext","allowFullscreen","inline","inlineZoomInit","productName","imageAltText","_context$app","validateMediaLocationAsync","_unused","_actionContext$reques","isPreview","commerceApiRequest","previewImageData","displayOrder","DisplayOrder","MediaTypeValue","_mediaLocation$Uri2","_this$state$mediaGall","_this$state$mediaGall2","commerceVideoMetadataRequest","renderThumbnailItem","GetThumbnailItemComponent","imageId","_props$config$thumbna","_props$callbackToggle","_props$callbackThumbn","keyCode","call","fetchpriority","GetEmptyThumbnailItemComponent","_props$config$thumbna2","xl","renderThumbnails","getMediaGalleryItems","CartView","cittaTelemetry","CittaTelemetry","cittaInstrumentationKey","createLogMessage","decodeURI","search","logMessage","trace","_moveToWishlistSuccessHandler","_updateCartlineQuantity","newQuantity","orderQuantityLimitsFeatureIsEnabled","updateCartLineQuantity","_fulfillmentStoreIdUpdated","_renderErrorBlock","_renderGIftCardError","freightCalculationText","orLabel","_goToPreviousPage","_renderBOPISBlock","_cartResult$cart","retry","cartResult","_cartResult","validationResult","validateForCheckoutAsync","ValidationFailuresByCartLines","refreshCart","refreshError","validateError","history","back","shipToAddressDisplayText","pickUpAtStoreWithLocationText","_props$cartlines","hasGiftCard","arr","val","arrVal","_arrVal$data","cartlinesLength","giftCardErrorMessage","_renderProgressBar","percentFilled","marginTop","width","_props$data$cart$resu","_props$cartlines2","perSpend","OrderSubTotal","ourGiftToYou","_line$data","amountOf50s","floor","marginBottom","ceil","_renderGiftWithPurchasMessage","_props$data$cart$resu2","NetPrice","subTotalHeadingLabel","CustomerContextualPrice","_renderSubTotal","hideTaxLine","_props$data$cart$resu3","_props$data$cart$resu4","_props$data$cart$resu5","_renderAmountDue","PickUpAtStoreComponent","PickUpAtStore","EmailDeliveryComponent","_ref2","EmailDelivery","LineItemComponent","_ref3","LineItem","pickUpAtStore","emailDelivery","LineItemGroupComponent","_ref4","LineItemDeliveryGroup","LineItemList","heading","lineItems","lineItem","LineItemsComponent","_ref5","LineItems","Header","editLink","itemsForPickup","itemsForShip","itemsForEmail","_props$context","isB2B","orderSummary","_props$data$checkout$10","checkout","checkoutCart","Price","_props$data$checkout$6","chargeLines","ChargeLines","chargeAmountInclTax","_props$orderSummary","chargeLine","IsShipping","chargeAmountInclTaxLocal","GrossAmount","_renderShippingInclTaxes","_props$data$checkout$","_props$data$checkout$2","_props$data$checkout$3","_props$data$checkout$4","_props$data$checkout$5","ChargeAmount","ShippingChargeAmount","otherChargesAmountFromLines","totalChargeAmountFromLines","chargesOverriden","displayOtherChargesAmount","shippingChargesFromLines","freightChargeCode","CalculatedAmount","ChargeCode","_renderOtherCharges","_props$data$checkout$11","OrderTotal","_renderTotalOrder","_props$data$checkout$7","DiscountAmount","totalSavingsLabel","_renderTotalSavings","_props$data$checkout$8","_props$data$checkout$9","shippingAmount","DeliveryModeChargeAmount","AmountDue","freeShippingAmount","_renderFreeShippingMessage","_getCheckoutSummaryText","paragraph","_props$context2","canShow","checkoutProps","headerProps","hasSalesOrder","bodyProps","mainProps","mainControlProps","sideProps","sideControlFirstProps","sideControlSecondProps","termsAndConditionsProps","orderConfirmation","loading","alert","guidedForm","placeOrderButton","termsAndConditions","keepShoppingButton","isBusy","url","urlParams","URLSearchParams","orderToken","_renderUnder200sError","SubtotalAmount","market","oun","isB2BI","minimumOrder","discountLevel","LineDiscountGroup","_props$data$cart$resu6","_props$data$cart$resu7","_props$data$cart$resu8","_props$data$cart$resu9","TaxAmount","_renderTax","_props$data$cart$resu10","_props$data$cart$resu11","_props$data$cart$resu12","amountDueLabel","_props$data$cart$resu13","DiscountAmountWithoutTax","totalSavings","storeLocation","slides","renderConfigureDropdown","dropdown","containerProps","labelContainerProps","select","renderConfigure","dropdowns","renderForm","quickOrderForm","quickOrderProductContent","quickOrderMessageContent","PromoCode","_onInputChange","promoCodeInputValue","canApply","_applyPromotion","appliedPromo","addPromoCode","_addProductToCart","substatus","_renderForm","onSubmit","placeholder","_removePromotion","code","getAttribute","removePromoCodes","promoCodes","_calculateDiscount","discountAmount","DiscountLines","discountLine","DiscountCode","DiscountCost","_renderAppliedPromoCode","Coupons","coupon","format","isCollapseOpen","productRecId","getByIdAsync","ProductTypeValue","BasePrice","AdjustedPrice","addProductsToCartInput","count","isAddedToCart","addProductToCart","console","log","InvoiceSummaryLine","cssLabel","_buildPaymentSummarySection","_computedLoyaltyAmount","checkoutState","loyaltyAmount","invoiceLines","invoiceLine","InvoiceAmount","InvoiceId","giftCardAmount","_computeGiftCardAmount","giftCardTotalValue","giftCardExtends","reduce","giftCardCounter","Balance","amount","totalAmountAfterGiftCard","loyaltyLabel","giftcardLabel","OrderSummaryLine","priceCurrency","currencyCode","_buildOrderSummarySection","Currency","getDeliveryMode","_channelDeliveryOptio","featureSate","pickupDeliveryMode","dM","SubtotalAmountWithoutTax","TaxOnNonShippingCharges","OtherChargeAmount","canShip","hasDeliveryMethod","hasShippingMethod","freightFee","getDeliveryConfiguration","deliveryModes","taxOnShippingCharge","TaxOnShippingCharge","shippingChargeAmount","otherChargeAmount","taxOnNonShippingCharges","isTaxGreaterThanZero","otherChargeAmountTotal","subtotalAmountActual","customerAccountAmount","customerAccount","customerAccountLabel","warehouseId","targetWarehouseValue","InventoryLocationId","propsContext","shouldRetry","_validationResult$Val","CartsDataActions","bypassCache","ValidationResultsByLineId","cartLineToUpdate","isUsingDefaultOrderSettingsMax","_modifiedProduct$Beha2","modifiedProduct","updateLineResult","_context$request$chan","isPickUpItem","isCartLineItemPickUpType","_assembleCartlines","_getProduct","foundProductDeliveryOption","foundProductDeliveryOptions","productMaxQuantity","lineMaxQuantity","isServiceItem","eoqQuantity","MultipleOfQuantity","finalErrorMessage","eoqErrorMessage","LineIndex","_i$DataValidationFail","_i$DataValidationFail2","_i$DataValidationFail3","DataValidationFailure","ErrorResourceId","_renderDeliveryLocation","deliverylocation","_foundProductDelivery","_renderStoreLocation","RemoveCartItem","removeCartItemAttribute","deliveryLocation"],"sourceRoot":""}