{"version":3,"file":"static/js/14.e6cfbfc83b5f6ee172ad.chunk.js","mappings":";uTAcO,MAAMA,EAAwBC,IAAA,IAAC,KAAEC,EAAI,UAAEC,EAAS,KAAEC,EAAI,UAAEC,GAAWJ,EAAA,OACtEK,EAAAA,cAAA,KAAGH,UAAWA,EAAWC,KAAMA,EAAI,aAAcC,GAC5C,IACAH,EAAM,oBCMR,MAAMK,EAAgEN,IAQxE,IARyE,SAC1EO,EAAQ,QACRC,EAAO,cACPC,EAAa,UACbC,EAAS,WACTC,EAAU,SACVC,EAAQ,wBACRC,GACHb,EACG,OACIK,EAAAA,cAAA,MAAIH,UAAU,iBACTK,EAASO,KAAI,CAACC,EAA8BC,IACzCX,EAAAA,cAAA,MAAIH,UAAU,iCAAiCe,IAAKD,GAChDX,EAAAA,cAACa,EAAAA,iBAAgB,CACbV,QAASA,EACTC,cAAeA,EACfU,cAAeT,EAAUU,UACzBC,kBAAmBX,EAAUW,kBAC7BC,iBAAkBZ,EAAUY,iBAC5BC,gBAAiBb,EAAUa,gBAC3BC,GAAIZ,EACJa,SAAUd,EACVe,KAAM,CAAEX,QAASA,GACjBF,wBAAyBA,SClCpCc,EAA0B3B,IAAA,IAAC,KAAEC,EAAI,UAAEC,GAAWF,EAAA,OAAKK,EAAAA,cAAA,QAAMH,UAAWA,GAAS,IAAID,EAAI,MCDrF2B,EAAkC5B,IAAA,IAAC,UAAE6B,GAAW7B,EAAA,OAAKK,EAAAA,cAAA,gBAAQwB,EAAS,kCCEjEC,EA0BAC,EAeAC,ylBA4BZ,SAAUC,EACZC,EACAC,GAGA,OAAOA,EAAmBC,MAAMC,GAC5BC,EAA8BJ,EAAqBG,KASrD,SAAUC,EAA8BJ,EAA0CG,GAEpF,OACIA,EAAoBE,kBAAoBL,EAAoBK,iBAC5DF,EAAoBG,qBAAuBN,EAAoBM,oBAC/DH,EAAoBI,gBAAkBP,EAAoBO,gBACzDJ,EAAoBI,gBAAkBX,EAAiCY,OACpEL,EAAoBM,uBAAyBT,EAAoBS,sBAIvE,SAAUC,EACZC,EACAC,GAEA,MAAMC,EAAmD,GACzD,IAAIC,GAAmB,EAsBvB,GArBAF,EAA0BG,SAASC,IAC/B,GAAIZ,EAA8BO,EAAuBX,oBAAqBgB,IAE1E,GADAF,GAAmB,EACfH,EAAuBM,YAAa,CACpC,MAAMC,EAAIC,EAAAA,EAAA,GACHH,GAAiB,IACpBP,0BAC2CW,IAAtCT,EAAuBU,YAA4B,GAAGV,EAAuBU,cAC9EL,EAAkBP,qBACtBa,2BACyCF,IAApCT,EAAuBY,UAA0B,GAAGZ,EAAuBY,YAC5EP,EAAkBM,wBAE1BT,EAA0BW,KAAKN,SAInCL,EAA0BW,KAAKR,OAIlCF,EAAkB,CACnB,MAAMI,EAAIC,EAAAA,EAAA,GACHR,EAAuBX,qBAAmB,IAC7CS,0BAC2CW,IAAtCT,EAAuBU,YAA4B,GAAGV,EAAuBU,cAC9EV,EAAuBX,oBAAoBS,qBAC/Ca,2BACyCF,IAApCT,EAAuBY,UAA0B,GAAGZ,EAAuBY,YAC5EZ,EAAuBX,oBAAoBsB,wBAEnDT,EAA0BW,KAAKN,GAI1BP,EAAuBX,oBAAoBO,gBAAkBX,EAAiC6B,MAC3Fd,EAAuBX,oBAAoBO,gBAAkBX,EAAiC8B,SAClGf,EAAuBgB,8BAA8BC,mBAAqB/B,EAAwBgC,QAElGlB,EAAuBgB,8BAA8BG,OAAOf,SAASgB,IACjE,GAAIA,EAAM1B,kBAAoBa,EAAKb,iBAAmB0B,EAAMtB,uBAAyBS,EAAKT,0BAEnF,CACH,MAAMuB,EAAgBnB,EAA0BoB,WAAWC,GACvD9B,EAA8B2B,EAAOG,KAErCF,GAAiB,GACjBnB,EAA0BsB,OAAOH,EAAe,OAOpE,OAAOnB,EAGL,SAAUuB,EACZC,EACAC,EACAC,EACAC,GAEA,IAAKH,IAAWC,EAEZ,OADAE,EAAUC,MAAM,kEAAkEJ,KAAUC,KACrFD,GAAU,GAErB,MAAMK,EAAeL,GAAUM,OAAON,IAAY,EAClD,IAAIO,EAEJ,IACIA,EAAS,IAAIC,KAAKC,aAAaP,EAAQ,CACnCQ,MAAO,WACPC,gBAAiB,SACjBV,SAAUA,EACVW,sBAAuB,IACxBC,OAAOR,GACZ,MAAOS,GACLP,EAAS,GAAGF,KAAeJ,IAC3BE,EAAUY,QAAQ,kEAAkER,MAAWO,KAGnG,OAAOP,GAvLX,SAAkBhD,GAIdA,EAAAA,EAAA,iBAMAA,EAAAA,EAAA,2BAKAA,EAAAA,EAAA,eAKAA,EAAAA,EAAA,qBApBJ,CAAkBA,IAAAA,EAAgC,KA0BlD,SAAkBC,GAIdA,EAAAA,EAAA,mBAKAA,EAAAA,EAAA,iBATJ,CAAkBA,IAAAA,EAAuB,KAezC,SAAkBC,GAIdA,EAAAA,EAAA,eAIAA,EAAAA,EAAA,yBAIAA,EAAAA,EAAA,uBAIAA,EAAAA,EAAA,iBAIAA,EAAAA,EAAA,mBApBJ,CAAkBA,IAAAA,EAAoB,KCVtC,IAAqBuD,EAArB,cAA6ClF,EAAAA,UAUzCmF,YAAYC,GACRC,MAAMD,GAVF,KAAAE,6BAAoD,IAAIC,IAW5DC,KAAKC,eAAiBD,KAAKC,eAAeC,KAAKF,MAC/CA,KAAKG,kBAAoBH,KAAKG,kBAAkBD,KAAKF,MACrDA,KAAKI,wBAA0BJ,KAAKI,wBAAwBF,KAAKF,MACjEA,KAAKK,WAAaL,KAAKK,WAAWH,KAAKF,MACvCA,KAAKM,WAAaN,KAAKM,WAAWJ,KAAKF,MACvCA,KAAKO,iBAAmBP,KAAKO,iBAAiBL,KAAKF,MACnDA,KAAKQ,iBAAmBR,KAAKQ,iBAAiBN,KAAKF,MAEnDA,KAAKS,SAAWjG,EAAAA,YAChBwF,KAAKU,SAAWlG,EAAAA,YAEhB,MAAM,4BAAEmG,GAAgCX,KAAKJ,MACvCgB,EAAcD,GAA+BA,EAA4B7D,sBAAyB,IAClG+D,EAAcF,GAA+BA,EAA4BhD,4BAA0BF,EACzGuC,KAAKc,MAAQ,CACTC,WAAW,EACXC,wBAAoBvD,EACpBwD,wBAAoBxD,EACpByD,YAAaN,EACbO,YAAaN,EACbO,YAAY,EACZC,YAAY,GA3BV,mBACN,OAAOrB,KAAKJ,MAAMvD,oBAAoBiF,UAAY,GA8B/CC,SACH,MAAM,oBAAElF,EAAmB,8BAAE2B,EAA6B,sBAAEwD,GAA0BxB,KAAKJ,MAE3F,GAAKvD,GAAwB2B,EAO7B,MAA6B,UAAzBgC,KAAKJ,MAAM6B,UACJzB,KAAK0B,qBAGT1B,KAAK2B,gBAVRH,EAAsB3C,UAAU+C,MAC5B,kGAYJF,qBACJ,MAAM,WAAEG,EAAU,8BAAE7D,EAA6B,sBAAEwD,GAA0BxB,KAAKJ,OAC5E,YAAEsB,EAAW,YAAEC,EAAW,WAAEC,EAAU,WAAEC,EAAU,mBAAEL,EAAkB,mBAAEC,GAAuBjB,KAAKc,MAGpGgB,EAAY,CACd,cAFoBN,EAAsBO,iBAAmB,OAAOC,QAAQ,MAAOhE,EAA8BiE,SAAW,IAG5H,gBAAiBJ,GAOfK,EAAoB,mEACtBlB,EAAqB,qCAAuC,IAE1DmB,EAAoB,mEACtBlB,EAAqB,qCAAuC,IAI1DmB,EAAuBpC,KAAKqC,2BAA2BnB,EAAaE,EAAYJ,GAChFsB,EAAuBtC,KAAKqC,2BAA2BlB,EAAaE,EAAYJ,GACtF,OACIzG,EAAAA,cAAA,OAAA+H,OAAAC,OAAA,CAAMnI,UAAU,0CAA6CyH,GACzDtH,EAAAA,cAAA,SAAOH,UANW,8EAObmH,EAAsBiB,SACvBjI,EAAAA,cAAA,SACIH,UAAW6H,EACXQ,SAAU1C,KAAKK,WACfsC,QAAS3C,KAAKK,WACduC,OAAQ5C,KAAKO,iBACbsC,MAAOT,EACPU,IAAK9C,KAAKS,YAGlBjG,EAAAA,cAAA,SAAOH,UAhBW,8EAiBbmH,EAAsBuB,SACvBvI,EAAAA,cAAA,SACIH,UAAW8H,EACXa,YAAaV,OAAuB7E,EAAY+D,EAAsByB,mBACtEP,SAAU1C,KAAKM,WACfqC,QAAS3C,KAAKM,WACdsC,OAAQ5C,KAAKQ,iBACbqC,MAAOP,EACPQ,IAAK9C,KAAKU,YAGjBM,GACGxG,EAAAA,cAAA,QAAMH,UAAU,wFACX2G,GAGRC,GAAsBD,IAAuBC,GAC1CzG,EAAAA,cAAA,QAAMH,UAAU,wFACX4G,IAObU,gBACJ,MAAM,WAAEE,EAAU,oBAAExF,EAAmB,8BAAE2B,EAA6B,4BAAE2C,GAAgCX,KAAKJ,MACvGsD,EAAM7G,EAAoBS,qBAC1BqG,EAAM9G,EAAoBsB,sBAC1BuD,EACDP,GAA+BA,EAA4B7D,sBAC5DT,EAAoBS,sBACpB,IACEqE,EACDR,GAA+BA,EAA4BhD,uBAC5DtB,EAAoBsB,uBACpBwF,EACEC,EAAW,UAAUpF,EAA8BqF,YAAYhH,EAAoBK,kBACnF4G,EAAiB,CACnB,gBAAiBzB,GAGf0B,EAAWvD,KAAKwD,aAAaN,GAC7BO,EAAWzD,KAAKwD,aAAaL,GAC7BO,EAAmB1D,KAAKwD,aAAatC,GACrCyC,EAAmB3D,KAAKwD,aAAarC,GAE3C,OACI3G,EAAAA,cAACoJ,EAAAA,OAAMrB,OAAAC,OAAA,CACHnI,UAAW,mCACXe,IAAKgI,EACLzH,GAAIyH,EACJS,QAAQ,EACRX,IAAMA,GAAOlE,OAAOkE,SAASzF,EAC7B0F,IAAMA,GAAOnE,OAAOmE,SAAS1F,EAC7BqG,KAAM,EACNC,YAAa,aACbC,OAAQ,CACJ,CACIC,QAAS,GAAGb,UACZc,YAAa,GAAGX,IAChBY,iBAAkB,SAEtB,CACIF,QAAS,GAAGb,QACZc,YAAa,GAAGT,IAChBU,iBAAkB,QAG1BC,YAAY,EACZC,aAAa,EACbC,aAAc,CACV,CACI3I,GAAI,GAAGyH,uBACPP,MAAQ3B,GAAelC,OAAOkC,IAAiB,EAC/C3G,UAAW,GAAGyF,KAAKJ,MAAM2E,gCAAgCvE,KAAKwE,eAC9DC,cAAe,GAAGf,KAEtB,CACI/H,GAAI,GAAGyH,qBACPP,MAAO7D,OAAOmC,IAAgBnC,OAAOyE,GACrClJ,UAAW,GAAGyF,KAAKJ,MAAM8E,gCAAgC1E,KAAKwE,eAC9DC,cAAe,GAAGd,MAG1BgB,YAAa3E,KAAKG,kBAClBuC,SAAUkC,GAAAA,CAAS5E,KAAKC,eAAgB,KACxC4E,kBAAmB7E,KAAKI,yBACpBkD,IAKRjD,WAAWyE,GACf9E,KAAK+E,aAAaD,EAAO,OAGrBxE,WAAWwE,GACf9E,KAAK+E,aAAaD,EAAO,OAGrBC,aAAaD,EAA2CE,GAC5D,MAAMC,EAAc,WAAWD,IACzBE,EAAa,UAAUF,IAC7BhF,KAAKmF,SAAS,CACV,CAACF,GAAcjF,KAAKoF,2BAA2BN,EAAMO,cAAcxC,OACnE,CAACqC,IAAa,IAId3E,iBAAiBuE,GACrB,MAAMQ,EAAmBtF,KAAKoF,2BAA2BN,EAAMO,cAAcxC,OAC7E7C,KAAKmF,SAAS,CACVjE,YAAaoE,EACbC,YAAY,IAEhB,MAAM9E,EAAWzB,OAAOsG,IAClB,SACFE,EAAQ,8BACRxH,EAA6B,oBAC7B3B,EAAmB,sBACnBmF,EAAqB,4BACrBb,GACAX,KAAKJ,MACHuD,EAAOxC,GAA+BA,EAA4BhD,4BAA0BF,EAE5FgI,EAAStC,EAAMnE,OAAOmE,QAAO1F,EAEnC,OAAIiI,MAAMjF,IACNT,KAAKmF,SAAS,CAAEnE,mBAAoBQ,EAAsBmE,qBAC1D3F,KAAK4F,OAAO,QACL,GAGP5F,KAAK6F,eAAepF,EAAUgF,IAC9BD,EAAS,CACLxH,8BAA+BA,EAC/B3B,oBAAqBA,EACrBiB,aAAa,EACbI,WAAY+C,EACZ7C,SAAU6H,KAEP,IAEPzF,KAAK4F,OAAO,QAGT,GAGHpF,iBAAiBsE,GACrB,MAAMgB,EAAmB9F,KAAKoF,2BAA2BN,EAAMO,cAAcxC,OAC7E7C,KAAKmF,SAAS,CACVhE,YAAa2E,EACbC,YAAY,IAEhB,MAAMrF,EAAW1B,OAAO8G,IAClB,SACFN,EAAQ,8BACRxH,EAA6B,oBAC7B3B,EAAmB,sBACnBmF,EAAqB,4BACrBb,GACAX,KAAKJ,MACHsD,EAAOvC,GAA+BA,EAA4B7D,sBAAyB,IAE3FkJ,EAAShH,OAAOkE,GAEtB,OAAIwC,MAAMhF,IACNV,KAAKmF,SAAS,CAAElE,mBAAoBO,EAAsBmE,qBAC1D3F,KAAK4F,OAAO,QACL,KAGP5F,KAAK6F,eAAeG,EAAQtF,KACxBrE,EACAmJ,EAAS,CACLxH,8BAA+BA,EAC/B3B,oBAAqBA,EACrBiB,aAAa,EACbI,WAAYsI,EACZpI,SAAU8C,IAGdV,KAAK4F,OAAO,QAET,GAMPA,OAAOZ,GACX,MAAMlC,EAAoB,QAAdkC,EAAsBhF,KAAKU,SAAWV,KAAKS,SAEvDwF,YAAW,KACHnD,GAAOA,EAAIoD,SACXpD,EAAIoD,QAAQC,UAEjB,IAGC9D,2BACJ+D,EACAC,EACAC,GAEA,OAAID,GAAWC,QAAgC7I,IAAb2I,EACvBA,EAEJpG,KAAKwD,aAAa4C,GAGrBP,eAAe3C,EAAaC,GAChC,MAAM,sBAAE3B,GAA0BxB,KAAKJ,MACvC,YAAYnC,IAAR0F,MAIAD,EAAMC,KACNnD,KAAKmF,SAAS,CACVnE,mBAAoBQ,EAAsB+E,qBAC1CtF,mBAAoBO,EAAsB+E,wBAEvC,IAMP/C,aAAa9E,GACjB,MAAME,EAASoB,KAAKJ,MAAM4B,sBAAsB5C,OAC1CK,EAASR,EAAYC,EAAQsB,KAAKwE,aAAc5F,EAAQoB,KAAKJ,MAAM4B,sBAAsB3C,WAE/F,GAAuD,IAAnDmB,KAAKJ,MAAMvD,oBAAoBK,gBAAuB,CAEtD,OADe+B,EAAYC,EAAQsB,KAAKwE,aAAc5F,EAAQoB,KAAKJ,MAAM4B,sBAAsB3C,WAGnG,YAAepB,IAAXiB,GAAyBsB,KAAKF,6BAA6B0G,IAAIvH,GAI5DP,GAAU,IAHbsB,KAAKF,6BAA6B2G,IAAIxH,EAAQP,GACvCA,GAKP0G,2BAA2BsB,GAE/B,MAAMC,EAAa3H,OAAO0H,GAC1B,IAAKhB,MAAMiB,GACP,OAAOD,EAKX,OAD4B1G,KAAKF,6BAA6B8G,IAAIF,IACpCA,EAM1BzG,eAAe4G,GAEnB,GAA2C,cAAvCA,EAAyBC,UAA2B,CACpD,MAAM,SAAEtB,EAAQ,8BAAExH,EAA6B,oBAAE3B,GAAwB2D,KAAKJ,MAC1EvD,GAAuBwK,IACvBrB,EAAS,CACLxH,8BAA+BA,EAC/B3B,oBAAqBA,EACrBiB,aAAa,EACbI,WAAYmJ,EAAyBE,gBACrCnJ,SAAUiJ,EAAyBG,mBAGvChH,KAAKiH,oBAAoBJ,KAO7B1G,kBAAkB0G,GACtB,MAAM,SAAErB,EAAQ,8BAAExH,EAA6B,oBAAE3B,GAAwB2D,KAAKJ,MAC1EvD,GAAuBwK,IACvBrB,EAAS,CACLxH,8BAA+BA,EAC/B3B,oBAAqBA,EACrBiB,aAAa,EACbI,WAAYmJ,EAAyBE,gBACrCnJ,SAAUiJ,EAAyBG,mBAGvChH,KAAKiH,oBAAoBJ,IAMzBI,oBAAoBJ,GACxB,GAAIA,EAAyBlL,GAAI,CAC7B,MAAMuL,EAAUC,SAASC,eAAeP,EAAyBlL,IAC3DuL,GACFjB,YAAW,KACPiB,EAAQf,UACT,IAKP/F,wBAAwBiH,GAC5B,OAAOrH,KAAKwD,aAAa,GAAG6D,QA3YtBC,EAAAA,EAAAA,IAAA,CAATC,EAAAA,IAAQ,iCANQ7H,GAAe4H,EAAAA,EAAAA,IAAA,CADnCE,EAAAA,IACoB9H,4MCAP,MAAO+H,UAAmBjN,EAAAA,UAGpCmF,YAAYC,GACRC,MAAMD,GA+JF,KAAA8H,SAAYlI,IAChBA,EAAEmI,iBAEF,MAAM,8BAAE3J,EAA6B,oBAAE3B,EAAmB,4BAAEsE,GAAgCX,KAAKJ,MAC7FvD,IACA2D,KAAKJ,MAAM4F,SAAS,CAChBxH,8BAA+BA,EAC/B3B,oBAAqBA,EACrBiB,aAAcqD,IAGlBsF,YAAW,KACPjG,KAAK4H,WAAW1B,SAAWlG,KAAK4H,WAAW1B,QAAQC,UACpD,KA3KPnG,KAAK0H,SAAW1H,KAAK0H,SAASxH,KAAKF,MACnCA,KAAKc,MAAQ,CACTC,YAAaf,KAAKJ,MAAMe,6BAE5BX,KAAK4H,WAAapN,EAAAA,YAGf+G,SACH,MAAAsG,EAUI7H,KAAKJ,OAVH,WACFiC,EAAU,sBACVL,EAAqB,8BACrBxD,EAA6B,oBAC7B3B,EAAmB,4BACnBsE,EAA2B,SAC3BmH,EAAQ,SACRtC,EAAQ,QACR7K,GAEHkN,EADME,GAAKC,EAAAA,EAAAA,GAAAH,EAAAI,GAEZ,IAAK5L,EAED,YADAmF,EAAsB3C,UAAU+C,MAAM,sEAGrCvF,EAAoBS,sBACrB0E,EAAsB3C,UAAUY,QAC5B,2DAA2DyI,KAAKC,UAAU9L,MAGlF,MAAM+L,EAAiBpK,EAA8BC,mBAAqB/B,EAAwBgC,OAClG,IAAImK,EAAoBD,EAAiB,gBAAkB,eAC3DC,EAAoB,0BAA0BA,IAC9C,MAAMrD,EAAYoD,EAAiB,QAAU,WACvCE,EAAOF,EAAiB,aAAU3K,EAExC,GADA4K,EAAsB1H,EAA8B,GAAG0H,YAA8BA,EACjFrK,EAA8BuK,cAAgBpM,EAAqBqM,OACnE,OAAInM,EAAoBS,qBAEhBtC,EAAAA,cAAA,MACIH,UAAU,yBACViO,KAAK,QAAO,eACC,QACb3M,GAAI,GAAGqC,EAA8BiE,WAAY5F,EAAoBoM,gCAA+B,aACxF,GAAGzK,EAA8BiE,WAAY5F,EAAoBoM,iCAE7EjO,EAAAA,cAAA,KACIF,KAAM0F,KAAK0I,iBAAgB,aACf,GAAG1K,EAA8BiE,WAAY5F,EAAoBoM,gCAC7EE,QAAS3I,KAAK0H,UAEdlN,EAAAA,cAACoO,EAAAA,gBAAe,CACZC,UAAWC,SAASzM,EAAoBS,qBAAsB,IAC9DiM,YACI1M,EAAoBoM,8BACdpM,EAAoBoM,8BACpBpM,EAAoBS,qBAE9BkM,WAAW,EACXC,UAAU,EACV1O,UAAU,GACVI,QAASA,EACTgB,GAAIqE,KAAKJ,MAAM7E,SACfa,SAAUoE,KAAKJ,MAAMsJ,eACrBrN,KAAM,KAEVrB,EAAAA,cAAA,QAAMH,UAAU,oCACmBoD,IAA9BpB,EAAoB8M,OAAuB,IAAI9M,EAAoB8M,iBAMpF,EAED,KAAAC,EAAAC,EACH,MAAMC,EAAsF,QAAzEF,EAAoD,QAApDC,EAAIrJ,KAAKJ,MAAM5B,8BAA8BiE,eAAO,IAAAoH,OAAA,EAAhDA,EAAkDE,2BAAmB,IAAAH,EAAAA,EAAI,GAC1FI,EAAwBxJ,KAAKyJ,0BAA0BH,GAC7D,IAAIjP,EAAY,yBACZmP,IACAnP,EAAYqP,GAAAA,CAAWrP,EAAW,sCAAsCiP,MAI5E,MAAMK,GAAYC,EAAAA,iBAAiBC,mBAAmBxN,EAAoByN,oBACpEC,GAAYH,EAAAA,iBAAiBC,mBAAmBxN,EAAoB2N,gBACpEC,EAAmBN,GAAYI,EACrC,OACIvP,EAAAA,cAAA,MACIH,UAAU,yBACViO,KAAMA,EACN3M,GAAI,GAAGqC,EAA8BiE,WAAY5F,EAAoBS,wBAErEtC,EAAAA,cAAA,IAAA+H,OAAAC,OAAA,CACIpH,IAAOuF,EAA8B,OAAS,QAC9CmC,IAAK9C,KAAK4H,WACVtN,KAAM0F,KAAK0I,iBACXwB,SAAUP,GAAY,EAAI,EAC1BhB,QAAS3I,KAAK0H,SACdrN,UAAWgO,EACXC,KAAMtD,EAAS,iBACCrE,GACZoH,GAEHkC,GAAoBT,GAAyBxJ,KAAKmK,cAAcb,GACjE9O,EAAAA,cAAA,QAAMH,UAAU,iCACXgC,EAAoBoM,+BAAiCpM,EAAoBS,0BAC3CW,IAA9BpB,EAAoB8M,OAAuB,KAAK9M,EAAoB8M,aAQrFgB,cAAcb,GAA6B,IAAAc,EAC/C,MAAM/N,EAAsB2D,KAAKJ,MAAMvD,oBAGjCjC,EAAOiC,EAAoBoM,+BAAiCpM,EAAoBS,sBAAwB,GACxGuN,EAAc,CAChB,CACIC,OAAQ,GAAsC,QAAtCF,EAAG/N,EAAoBK,uBAAe,IAAA0N,EAAAA,EAAI,MAAMd,KAAiBlP,IACzEyI,MAAOzI,EACPkP,cAAAA,EACAiB,aAAclO,EAAoByN,mBAClCU,SAAUnO,EAAoB2N,iBAItC,OACIxP,EAAAA,cAACiQ,EAAAA,gBAAe,CACZpQ,UAAU,iCACVqQ,YAAa1K,KAAKJ,MAAMjF,QAAQgQ,QAAQD,YACxCE,KAAMP,EACNQ,oBAAoB,EACpBC,cAAY,IAKhBrB,0BAA0BH,GAE9B,OAD8ByB,EAAAA,EAAAA,8BAA6BzB,EAAetJ,KAAKJ,MAAMjF,SAIjF+N,iBACJ,MAAM,WAAEsC,EAAU,8BAAEhN,EAA6B,oBAAE3B,EAAmB,4BAAEsE,GAAgCX,KAAKJ,MAE7G,OAAIvD,EACO2O,EAAW,CACdhN,8BAA+BA,EAC/B3B,oBAAqBA,EACrBiB,aAAcqD,IAIf,+CCnLf,IAAqBsK,EAArB,cAA2CzQ,EAAAA,UAavCmF,YAAYC,GACRC,MAAMD,GAbF,KAAAsL,iBAA2B,gBAoI3B,KAAAxD,SAAYlI,IAChBA,EAAEmI,iBACFnI,EAAE2L,kBAEF,MAAMC,EAAS5L,EAAE6F,cACXgG,EAAWD,EAAOE,aAAa,SAAUC,QAAQ,8BAAgC,EACjFC,EAAkBH,OAAW5N,EAAYuC,KAAKyL,0BAA0BL,GAE1EpL,KAAKJ,MAAM8L,iBACX1L,KAAKJ,MAAM8L,gBAAgB,CACvBL,SAAUA,EACVM,YAAaP,EACbQ,cAAeJ,EACfK,gBAAiBT,EAAOU,eA/I1B,0BACN,MAAM,gBAAEC,GAAoB/L,KAAKJ,MACjC,OAAOmM,EAAgB9Q,KAAI,CAACuQ,EAAsCrQ,KACvD,CACHC,IAAK4E,KAAKgM,uBAAuBR,EAAiBrQ,EAAM8Q,YACxDpJ,MAAO2I,MASZjK,SACH,MAAM,aAAE2K,EAAY,MAAEC,EAAK,WAAEC,EAAU,gBAAEC,EAAe,eAAEC,GAAmBtM,KAAKJ,MAC5E2M,EAAQvM,KAAKwM,oBACnB,OACIhS,EAAAA,cAAA,OAAKH,UAAU,sBACVkS,EAAME,OAAS,GAAKN,GAAS3R,EAAAA,cAAA,QAAMH,UAAU,6BAA6B8R,GAC3E3R,EAAAA,cAAA,MAAIH,UAAWqP,GAAAA,CAAW0C,EAAY,2BAA4B,kBAC7DG,EAAMtR,KAAI,CAACyR,EAAmBvR,KAC3B,MAAMwR,EAAgB,CAClB,gBAAiBxR,EACjB,eAAgBoR,EAAME,QAG1B,OACIjS,EAAAA,cAAA,KAAA+H,OAAAC,OAAA,CAAInI,UAAU,gCAAgCe,IAAKsR,EAAKtR,KAASuR,GAC7DnS,EAAAA,cAAA,KACIH,UAAU,2BACVC,KAAM0F,KAAKJ,MAAMoL,WAAW0B,EAAK7J,OAAO,GAAM,aAClC,GAAG6J,EAAK7J,MAAM/F,wBAAwBuP,IAClD1D,QAAS3I,KAAK0H,SACd/L,GAAI+Q,EAAKtR,KAIRsR,EAAK7J,MAAM/F,sBAAqE,KAA7C4P,EAAK7J,MAAM4F,gCAExCiE,EAAK7J,MAAM4F,oCACqChL,IAA7CiP,EAAK7J,MAAM4F,+BACgB,IAA/BiE,EAAK7J,MAAMnG,gBAHXgQ,EAAK7J,MAAM/F,qBAIX4P,EAAKtR,IAEXZ,EAAAA,cAAA,QACIH,UAAW,GAAG2F,KAAKkL,6CACnB5C,KAAK,SAAQ,aACDgE,UAOnCC,EAAME,OAAS,GAAKP,GACjB1R,EAAAA,cAAA,KAAGF,KAAM0F,KAAKJ,MAAMoL,WAAW,IAAI,GAAO3Q,UAAW,gCAAiCsO,QAAS3I,KAAK0H,UAC/FwE,IAObF,uBAAuB3P,EAA0ClB,GACrE,MAAM,aAAEyR,EAAY,uBAAEC,EAAsB,iBAAEC,EAAgB,UAAEjO,EAAS,cAAEkO,GAAkB/M,KAAKJ,MAC5FoN,EAAgBJ,GAAgB,MAChCK,EAAcJ,EACpB,IAcIK,EAdAC,EAAc,GAClB,GAAIL,GAAoBA,EAAiBvQ,KAAM,CAC3C,MAAM6Q,EAASN,EAAiBvQ,MAC3B8Q,KACKA,EAAUlP,OAAO5B,MAAMsG,GAA+BpG,EAA8BoG,EAAOxG,OAGhG+Q,EAGDD,EAAcC,EAAOnL,SAAW,GAFhCpD,EAAUY,QAAQ,oEAO1B,OAAQpD,EAAoBO,eACxB,KAAKX,EAAiCY,MACtC,KAAKZ,EAAiCqR,WAClCJ,EAAmBD,EACdjL,QAAQ,MAAOhC,KAAKwD,aAAanH,EAAoBS,qBAAsBT,EAAoBiF,WAC/FU,QAAQ,MAAOhC,KAAKwD,aAAanH,EAAoBsB,sBAAuBtB,EAAoBiF,WACrG,MACJ,QACI4L,EAAmB7Q,EAAoBoM,+BAAiCpM,EAAoBS,sBAAwB,GAE5H,GAA4C,IAAxCT,EAAoBK,gBAAuB,CAC3C,MAAM6Q,EAAcR,MAAAA,OAAa,EAAbA,EAAe5O,OAAO5B,MACtCiR,GAAWA,EAAQ1Q,uBAAyBT,EAAoBS,uBAEpEoQ,GAAoBK,EAAcA,EAAY9E,8BAAgCpM,EAAoBS,uBAAyB,GAG/H,MAAoB,WAAhBqQ,GAA4C,UAAhBA,EACrBH,EAAchL,QAAQ,MAAOmL,GAAanL,QAAQ,MAAO,GAAGkL,KAEhEF,EAAchL,QAAQ,MAAOmL,GAAanL,QAAQ,MAAO,GAAGkL,KAAoBC,KAAehS,KAGlGqI,aAAa9E,EAA4BC,GAC7C,IAAKD,IAAWC,EAEZ,OADAqB,KAAKJ,MAAMf,UAAUC,MAAM,2CACpBJ,GAAU,GAErB,MAAMK,EAAeL,GAAUM,OAAON,IAAY,EAC5CE,EAAS6O,GAAAA,CAAIzN,KAAKJ,MAAO,yBAA0B,SACzD,IAAIX,EAEJ,IACIA,EAAS,IAAIC,KAAKC,aAAaP,EAAQ,CACnCQ,MAAO,WACPC,gBAAiB,SACjBV,SAAUA,EACVW,sBAAuB,IACxBC,OAAOR,GACZ,MAAOS,GACLP,EAAS,GAAGF,KAAeJ,IAC3BqB,KAAKJ,MAAMf,UAAUY,QAAQ,8BAA8BR,MAAWO,KAG1E,OAAOP,EAqBHwM,0BAA0BE,GAC9B,MAAM1M,EAASe,KAAKwM,oBAAoBjQ,MAAK6J,GAAYuF,EAAYhQ,KAAOyK,EAAShL,MACrF,OAAQ6D,GAAUA,EAAO4D,YAAUpF,KAtJ7B6J,EAAAA,EAAAA,IAAA,CAATC,EAAAA,IAAQ,wCAHQ0D,GAAa3D,EAAAA,EAAAA,IAAA,CADjCE,EAAAA,IACoByD,qBCWd,MAAMyC,EAA4C9N,IACrD,MAAM,KAAExF,EAAI,QAAEuO,EAAO,UAAEpO,EAAS,SAAEoT,EAAQ,GAAEhS,GAAOiE,EACnD,OACIpF,IAAAA,cAAA,UAAQmB,GAAIA,EAAItB,UAAU,aAAY,aAAaE,EAAWoO,QAASA,EAAS7F,IAAK6K,GAChFvT,IAcPwT,EAAahO,GAEXpF,IAAAA,cAACqT,EAAAA,MAAK,CACFC,WAAW,EACXC,gBAAiB,aACjBC,eAAgBpO,EAAMqO,UACtBC,OAAQtO,EAAMsO,OACdC,OAAQvO,EAAMwO,cACd/T,UAAW,0BACXgU,OAAQ,OAKdC,EAAmB1O,GACdpF,IAAAA,cAAC+T,EAAAA,YAAW,CAACJ,OAAQvO,EAAMwO,eAAgBxO,EAAM/E,UAAU2T,YAGhEC,EAAmB7O,GAEjBpF,IAAAA,cAACkU,EAAAA,YAAW,KACRlU,IAAAA,cAACmU,EAAAA,OAAM,CAAChG,QAAS/I,EAAMwO,cAAe/T,UAAU,kCAC3CuF,EAAM/E,UAAU+T,uBCzBjC,MAAMC,UAAsBrU,EAAAA,UACxBmF,YAAYC,GACRC,MAAMD,GAENI,KAAK8O,cAAgB9O,KAAK8O,cAAc5O,KAAKF,MAC7CA,KAAK+O,iBAAmB/O,KAAK+O,iBAAiB7O,KAAKF,MAEnD,IAAIgP,EAAahP,KAAKJ,MAAMqP,wBACxBjP,KAAKJ,MAAMsP,wBAAwBtS,gBAAkBX,EAAiCY,QACtFmS,GAAa,GAGjBhP,KAAKc,MAAQ,CACTqO,SAAUH,GAIXzN,SACH,MAAM,wBAAE2N,EAAuB,sBAAE1N,GAA0BxB,KAAKJ,MAE3DsP,GACD1N,EAAsB3C,UAAU+C,MAAM,wDAE1C,MAAMvH,EAAYqP,GAAAA,CACd,oBACA,aACAwF,EAAwBjN,SAE5B,OACIzH,EAAAA,cAAA,OAAKH,UAAWA,GACZG,EAAAA,cAACmU,EAAAA,OAAM,CACHtU,UAAW2F,KAAKc,MAAMqO,SAAW,qCAAuC,sCAAqC,aACjGD,EAAwBjN,QACpC0G,QAAS3I,KAAK+O,iBAAgB,gBACf/O,KAAKc,MAAMqO,UAEzBD,EAAwBjN,SAE7BzH,EAAAA,cAAC4U,EAAAA,SAAQ,CAAClB,OAAQlO,KAAKc,MAAMqO,SAAUE,QAAS,KAC3CrP,KAAKsP,kBAAkBJ,KAMhCI,kBAAkBJ,GACtB,OAAQA,EAAwBtS,eAC5B,KAAKX,EAAiCY,MACtC,KAAKZ,EAAiCqR,WAClC,OAAOtN,KAAKuP,aAAaL,GAC7B,QACI,OAAOlP,KAAKwP,yBAAyBN,IAIzCM,yBAAyBN,GAC7B,MAAM,WAAErN,EAAU,sBAAEL,EAAqB,sBAAEiO,EAAqB,QAAE9U,GAAYqF,KAAKJ,MAE7E0I,EADiB4G,EAAwBjR,mBAAqB/B,EAAwBgC,OAC9D,CAAEoK,KAAM,mBAAiB7K,EAEjDiS,GADoBR,EAAwB/Q,QAAU,IACxBlD,KAAI,CAACmD,EAA4BjD,KACjE,IAAKiD,EAID,OAHAoD,EAAsB3C,UAAU+C,MAC5B,6DAA6DsN,EAAwB7L,aAAa6L,EAAwBjN,YAEvH,KAGX,MAAMtB,EAA8BvE,EAAgCgC,EAAOqR,GAE3E,OACIjV,EAAAA,cAACiN,EAAU,CACPzJ,8BAA+BkR,EAC/B7S,oBAAqB+B,EACrBuC,4BAA6BA,EAC7Ba,sBAAuBA,EACvBgE,SAAUxF,KAAK8O,cACf9D,WAAYhL,KAAKJ,MAAMoL,WACvBnJ,WAAYA,EACZzG,IAAKD,EACLR,QAASA,EACTI,SAAUiF,KAAKJ,MAAM7E,SACrBmO,eAAgBlJ,KAAKJ,MAAMsJ,oBAIvC,OACI1O,EAAAA,cAAA,KAAA+H,OAAAC,OAAA,CAAInI,UAAU,2BAA8BiO,EAAI,cAAc4G,EAAwBjN,UACjFyN,GAKLH,aAAaL,GACjB,MAAM,WACFrN,EAAU,sBACVL,EAAqB,sBACrBiO,EAAqB,QACrB9U,EAAO,6BACP4J,EAA4B,6BAC5BG,GACA1E,KAAKJ,MAGH8P,GADoBR,EAAwB/Q,QAAU,IACxBlD,KAAI,CAACmD,EAA4BjD,KACjE,IAAKiD,EAID,OAHAoD,EAAsB3C,UAAU+C,MAC5B,4CAA4CsN,EAAwB7L,aAAa6L,EAAwBjN,YAEtG,KAGX,MAAMtB,EAA8BvE,EAAgCgC,EAAOqR,GAGrEhO,EACFyN,EAAwBtS,gBAAkBX,EAAiCqR,YAC1C,UAAjCtN,KAAKJ,MAAM+P,kBACL,QACA,SACJvU,EAAMuF,EACN,GAAGA,EAA4B7D,wBAAwB6D,EAA4BhD,wBACnF,gBAAgBxC,IACtB,OACIX,EAAAA,cAAA,MAAIH,UAAW,sEAAoCe,IAAKD,GACpDX,EAAAA,cAACkF,EAAe,CACZ1B,8BAA+BkR,EAC/B7S,oBAAqB+B,EACrBuC,4BAA6BA,EAC7Ba,sBAAuBA,EACvBgE,SAAUxF,KAAK8O,cACf9D,WAAYhL,KAAKJ,MAAMoL,WACvBnJ,WAAYA,EACZJ,UAAWA,EACXrG,IAAKA,EACLT,QAASA,EACT4J,6BAA8BA,EAC9BG,6BAA8BA,EAC9B3J,SAAUiF,KAAKJ,MAAM7E,SACrBmO,eAAgBlJ,KAAKJ,MAAMsJ,qBAK3C,OAAO1O,EAAAA,cAAA,MAAIH,UAAU,yCAAyCqV,GAG1DZ,cAAc9R,GAClBgD,KAAKJ,MAAMgQ,iBAAiB5S,GAGxB+R,mBACJ/O,KAAKmF,UAAS0K,IAAa,CACvBV,UAAWU,EAAUV,cAKjC,UCtMaW,EAAwC3V,IAAa,IAAZ,KAAEC,GAAMD,EAC1D,OACIK,EAAAA,cAAA,QAAMH,UAAU,kDACZG,EAAAA,cAAA,cAAMJ,EAAI,ylBCmItB,IAAqB2V,EAAqBC,EAA1C,cAAmDxV,EAAAA,cAmC/CmF,YAAYC,EAA0EkB,GAClFjB,MAAMD,GA5BF,KAAAqQ,sBAAkD,CACtD,CAAE7U,IAAK8U,EAAAA,GAAYC,0BAA2BtN,MAAO7C,KAAKJ,MAAM/E,UAAUsV,2BAC1E,CAAE/U,IAAK8U,EAAAA,GAAYE,oBAAqBvN,MAAO7C,KAAKJ,MAAM/E,UAAUuV,qBACpE,CAAEhV,IAAK8U,EAAAA,GAAYG,qBAAsBxN,MAAO7C,KAAKJ,MAAM/E,UAAUwV,sBACrE,CAAEjV,IAAK8U,EAAAA,GAAYI,qBAAsBzN,MAAO7C,KAAKJ,MAAM/E,UAAUyV,sBACrE,CAAElV,IAAK8U,EAAAA,GAAYK,sBAAuB1N,MAAO7C,KAAKJ,MAAM/E,UAAU0V,uBACtE,CAAEnV,IAAK8U,EAAAA,GAAYM,uBAAwB3N,MAAO7C,KAAKJ,MAAM/E,UAAU2V,yBAGnE,KAAAC,UAAgCzQ,KAAKJ,MAAMjF,QAAQgQ,QAAQ+F,UAAUC,SAOrE,KAAAC,YAAsB,EACb,KAAAC,WAAYC,EAAAA,EAAAA,IAAa9Q,KAAKJ,MAAMjF,QAAQgQ,SAiQ5C,KAAAoG,qCAAuCC,UAA0B,IAAAC,EAAAC,EAC9E,MAAMC,EAAmE,QAAvDF,EAAuC,QAAvCC,EAAGlR,KAAKJ,MAAM/D,KAAKuV,cAAcnS,cAAM,IAAAiS,OAAA,EAApCA,EAAsCG,sBAAc,IAAAJ,EAAAA,EAAI,GAEvEK,QAAwCC,EAAAA,EAAAA,wDAC1C,IAAIC,EAAAA,mDACAL,EACAnR,KAAKJ,MAAMjF,QACX8W,EAAAA,4BAA4BC,aAEhC1R,KAAKJ,MAAMjF,QAAQgX,eAGnBC,EAAAA,gBAAgBC,YAAYP,IAC5BtR,KAAKmF,SAAS,CAAEmM,gCAAAA,KAIhB,KAAAQ,sBAAwB,KAC5B,MAAM,UAAEjX,GAAcmF,KAAKJ,MAC3B,MHjZ0BA,CAAAA,IACvB,CACHmS,MAAOnE,EAAUhO,GACjBoS,YAAa1D,EAAgB1O,GAC7BqS,YAAaxD,EAAgB7O,GAC7BsS,UAAW1X,IAAAA,cAAC2X,EAAAA,UAAS,CAAC9X,UAAU,4BG4YzB+X,CAAkB,CACrBvX,UAAW,CACP+T,qBAAsB/T,EAAU+T,qBAChCJ,WAAY3T,EAAU2T,YAE1BN,OAAQlO,KAAKc,MAAMuR,YACnBpE,UAAWjO,KAAKsS,gBAChBlE,cAAepO,KAAKuS,gBAIpB,KAAAC,oBAAsB,KAC1B,MAAM,KAAE3W,EAAI,QAAElB,EAAO,UAAEE,GAAcmF,KAAKJ,MAE1C,IAAI6S,EAAsC,GAGnC,IAAAC,EAFH/X,GAAWA,EAAQgQ,SAAWhQ,EAAQgQ,QAAQgI,OAAShY,EAAQgQ,QAAQgI,MAAMC,EAC7EH,EAAkB,IAAI9X,EAAQgQ,QAAQgI,MAAMC,KAE5CH,EACK5W,EAAKgX,SAAS5T,QACX+Q,EAAsB8C,gBAAgBnY,EAAQgQ,QAAQ/L,OAAQ/C,EAAKgX,SAAS5T,OAAO8T,mBACtFlX,EAAKgX,SAAS5T,QAAUpD,EAAKgX,SAAS5T,OAAO+T,OACd,QADmBN,EACnD1S,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,aAAK,IAAAD,OAAA,EAAhCA,EAAkCO,QAClC,GAER,IACIC,EADAC,EAAmB,GAEnBtX,EAAKuV,eAAiBvV,EAAKuV,cAAcnS,aAA0DxB,IAAhD5B,EAAKuV,cAAcnS,OAAOmU,kBAC7EF,EAAqBrX,EAAKuV,cAAcnS,OAAOmU,kBACxCvX,EAAKnB,UAAYmB,EAAKnB,SAASuE,SACtCiU,EAAqBrX,EAAKnB,SAASuE,OAAOoU,OAI1CF,EADAD,GAA6C,IAAvBA,EAEK,IAAvBA,GACM3T,EAAAA,EAAAA,QAAOS,KAAKJ,MAAM/E,UAAUyY,iBAAkBJ,GAC9ClT,KAAKJ,MAAM/E,UAAU0Y,YAEZhU,EAAAA,EAAAA,QAAOS,KAAKJ,MAAM/E,UAAUyY,iBAAkB,GAMrE,MAAO,CACHE,eAAgB,CAAEnZ,UAAW,qCAC7B4Y,MAAO,CACHQ,YAPYjZ,EAAAA,cAACsB,EAAK,CAACzB,UAAU,4CAA4CD,KAAMS,EAAU6Y,mBAQzFC,UAPUlB,GAAmBjY,EAAAA,cAACsB,EAAK,CAACzB,UAAU,0CAA0CD,KAAMqY,IAQ9FmB,WAPWpZ,EAAAA,cAACsB,EAAK,CAACzB,UAAU,2CAA2CD,KAAM+Y,OAWjF,KAAAU,sBAAwB,KAC5B,MAAM,KAAEhY,GAASmE,KAAKJ,MAChBkU,EAAoBjY,EAAKiY,kBAAkB7U,OAejD,MAAO,CACH8U,2BAA4B,CAAEC,IAAK,MAAO3Z,UAAW,kDACrD4Z,sBAfAH,GACAA,EAAkB7Y,KAAI,CAAC4H,EAA8B1H,IAE7CX,EAAAA,cAACN,EAAI,CACDkB,IAAKD,EACLf,KAAMyI,EAAMmQ,KACZzY,UAAW,GAAGyF,KAAKJ,MAAM/E,UAAUqZ,yBAAyBrR,EAAMmQ,OAClE1Y,KAAMuI,EAAMsR,QASxBC,2BAL0B5Z,EAAAA,cAACuB,EAAS,CAACC,UAAU,QAS/C,KAAAqY,oBAAsB,KAC1B,MAAM,UAAExZ,GAAcmF,KAAKJ,MACrB0U,EAAiBtU,KAAKuU,+BAAiCvU,KAAKc,MAAM0T,aAAaC,qBAcrF,MAAO,CACHC,iBAAkB,CAAEra,UAAW,gDAC/Bsa,eAdAna,EAAAA,cAACoa,EAAAA,gBAAe,CACZC,eAAe,uBACfC,UAAWja,EAAUka,oBACrBC,WAAW,yBACXC,kBAAkB,wBAClBC,YAAY,OACZC,gBAAiBnV,KAAKiQ,sBACtBmF,eAAgBd,EAChBe,eAAgBrV,KAAKsV,sBACrBxS,IAAK9C,KAAKuV,+BASd,KAAAC,eAAiB,KACrB,MAAM,OAAEC,EAAM,QAAE9a,EAAO,KAAEkB,EAAI,UAAEhB,GAAcmF,KAAKJ,MAC5CwR,EAAgBvV,GAAQA,EAAKuV,eAAiBvV,EAAKuV,cAAcnS,OACjEyW,GAAUC,EAAAA,EAAAA,IAAchb,EAAQgQ,SAChCiL,EAAeH,EAAOG,cAAgB,GACtCC,EACFzE,GAAqD,OAApCA,EAAc0E,kBACzB1E,EAAc0E,mBAAqB9V,KAAKJ,MAAM6V,OAAOG,cAAgB,IACpE5V,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,QAAU3S,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,MAAMoD,MAAS,EACpFC,EAAc5E,GAAiBA,EAAcgC,mBAAsB,EACnE6C,EAAepb,EAAUqb,gBACzBC,EAAWtb,EAAUub,YAC3B,OAAIJ,GAAcJ,EACP,KAGPpb,EAAAA,cAAC6b,EAAAA,uBAAsB,CACnBhc,UAAU,yCACViO,KAAK,aAAY,aACLzN,EAAUyb,oBACtBC,IAAKb,EAAQpb,KACbkc,IAAK,OACLjK,MAAOyJ,EACPJ,aAAcA,EACda,aAAcZ,EACdI,aACIzb,EAAAA,cAAA,OAAKH,UAAU,wBACXG,EAAAA,cAAA,QAAMH,UAAU,oCAAmC,cAAa,SAChEG,EAAAA,cAAA,QAAMH,UAAU,aAAa4b,IAGrCE,SACI3b,EAAAA,cAAA,OAAKH,UAAU,wBACXG,EAAAA,cAAA,QAAMH,UAAU,aAAa8b,GAC7B3b,EAAAA,cAAA,QAAMH,UAAU,qCAAoC,cAAa,UAGzEqc,kBAAmBT,EACnBU,cAAeR,KAKnB,KAAAS,eAAiB,KACrB,MAAM,KAAE/a,EAAI,QAAElB,GAAYqF,KAAKJ,MACzB+P,EAAoBhV,EAAQgQ,QAAQgI,OAAShY,EAAQgQ,QAAQgI,MAAMkE,WAAa,QAAU,SAC1FC,EACFjb,EAAKkb,SAAS9X,QACdpD,EAAKkb,SAAS9X,OAAO+X,QAAOxJ,GACjBA,EAAQrP,OAAOsO,OAAS,IAGjCwK,EAAkBpb,EAAKuV,cAAcnS,QAAUpD,EAAKuV,cAAcnS,OAAOiY,eAAkB,GAwBjG,MAAO,CACHC,oBAAqB,CAAE9c,UAAW,2CAClC+c,wBAAyB,CAAE/c,UAAW,+CACtC0c,SAzBAD,GACAA,EAAc7b,KAAI,CAACiU,EAAmD/T,IACV,IAAjDU,EAAKuV,cAAcnS,OAAQmU,kBAC9B5Y,EAAAA,cAACqU,EAAa,CACVK,wBAAyBA,EACzBO,sBAAuBwH,EACvBzV,sBAAuBxB,KAAKqX,uBAC5B9S,6BAA8BvE,KAAKJ,MAAM/E,UAAU0J,6BACnDG,6BAA8B1E,KAAKJ,MAAM/E,UAAU6J,6BACnDtJ,IAAKD,EACLyU,iBAAkB5P,KAAKsX,kBACvBtM,WAAYhL,KAAKuX,iBACjB1V,YAAY,EACZoN,yBAAyB,EACzBU,kBAAmBA,EACnBhV,QAASA,EACTI,SAAUiF,KAAKJ,MAAMjE,GACrBuN,eAAgBlJ,KAAKJ,MAAMhE,WAE/B,SAeC,KAAA4b,qBAAuBxG,MACpCI,EACAqG,KAEA,GAAIzX,KAAKJ,MAAMjF,QAAQ+c,IAAIjC,OAAOkC,8BAAgCC,EAAAA,GAAqCC,QAAS,CAC5G,MAAMC,EAAsB,IAAIC,EAAAA,GAC5B3G,EAAcT,SACd3Q,KAAKJ,MAAMjF,QAAQgQ,QAAQD,YAC3B,CACI2I,OAAO,GAGX,QAEA5V,EAEA,IAEA,GAEA,OAEAA,EACAuC,KAAK6Q,UACL4G,GAEEO,EAAoC,IAAIC,EAAAA,GAC1CH,EACAL,MAAAA,OAA6B,EAA7BA,EAA+BS,mCAEnC,OAAOC,EAAAA,EAAAA,IAA0BH,EAAmChY,KAAKJ,MAAMjF,QAAQgX,eAE3F,OAAOyG,QAAQC,aAAQ5a,IAGnB,KAAA6a,kBAAoB,KAAsB,IAAAC,EAC9C,MAAM,UAAE1d,EAAS,KAAEgB,EAAI,UAAEgD,GAAcmB,KAAKJ,MACtC4Y,EAAoB3c,EAAKuV,cAAcnS,QAAUpD,EAAKuV,cAAcnS,OAAOiY,eAAkB,GAC7FhK,EAAkD,QAAlCqL,EAAGvY,KAAKJ,MAAM/D,KAAKkb,SAAS9X,cAAM,IAAAsZ,OAAA,EAA/BA,EAAiChc,MAAKkc,GAA6B,WAAnBA,EAAOxW,UAEhF,OACIzH,EAAAA,cAACyQ,EAAa,CACVmB,WAAW,gCACXF,aAAcrR,EAAUqR,aACxBC,MAAOtR,EAAU6d,mBACjB3M,gBAAiByM,EAEjB1L,iBAAkBjR,EAAKkb,SAAS9X,OAChC2N,aAAc/R,EAAU+R,aACxBC,uBAAwBhS,EAAUgS,uBAClChO,UAAWA,EACX6M,gBAAiB1L,KAAK2Y,iBACtB3N,WAAYhL,KAAK4Y,iCACjBvM,gBAAiBxR,EAAUwR,gBAC3BU,cAAeG,KAKnB,KAAAoI,sBAAyBuD,IAC7B,MAAM,QAAEle,GAAYqF,KAAKJ,MACnBkZ,EAAiBne,GAAWA,EAAQgQ,QACpCgH,EAAgBhX,GAAWA,EAAQgX,cAEzC,IAAKmH,IAAmBnH,IAAkB3R,KAAKJ,MAAM/D,KAAKuV,cAAcnS,OAAQ,CAC5E,MAAM2C,EAAQ,mDAAoDkX,EAAqC,GAApB,qBAC9EnH,EAAmC,GAAnB,sCAErB3R,KAAKJ,MAAMf,UAAUY,QAAQmC,GAGjCmX,OAAOC,QAAQC,UACX,GACA,IACAC,EAAAA,EAAAA,KACIvD,EAAAA,EAAAA,IAAc3V,KAAKJ,MAAMjF,QAAQgQ,cACjClN,EACA,CAACuC,KAAKmZ,iCAAiCN,EAAazD,sBACpD3X,KAGR2b,EAAAA,EAAAA,KAAY,KACRpZ,KAAKJ,MAAM/D,KAAKuV,cAAcnS,OAAQ6W,kBAAoB,EAC1D9V,KAAKJ,MAAM/D,KAAKuV,cAAcnS,OAAQoa,eAAiB,CACnDC,QAAS,CAACtZ,KAAKmZ,iCAAiCN,EAAazD,sBAKjE,KAAA+D,iCAAoCI,IACxC,MAAM,KAAE1d,GAASmE,KAAKJ,MAEtB,IAAK/D,EAAK2d,oBAAoBva,OAC1B,MAAO,GAGX,MAAMwa,EAAsB5d,EAAK2d,oBAAoBva,OAAO1C,MAAKid,GACtDA,EAAoBpe,MAAQme,EAAOne,MAG9C,OAAIqe,EACOA,EAAoBC,WAGxB,IAGH,KAAAnF,4BAA8B,KAClC,MAAM,KAAE1Y,GAASmE,KAAKJ,MAChB+Z,EAAe9d,EAAKuV,cAAcnS,QAAUpD,EAAKuV,cAAcnS,OAAOoa,eAEtEO,EACDD,GAAgBA,EAAaL,SAAWK,EAAaL,QAAQ,MAC7DO,EAAAA,EAAAA,IAA8B,UAAW7Z,KAAKJ,MAAMjF,QAAQgQ,UAAY,IAAI,GAEjF,GAAIiP,GAAoB/d,EAAK2d,oBAAoBva,OAAQ,CACrD,MAAM6a,EAAqBje,EAAK2d,oBAAoBva,OAAO1C,MAAKwd,GAExDA,EAAmBL,WAAWM,aAAeJ,EAAiBI,YAC9DD,EAAmBL,WAAWO,eAAiBL,EAAiBK,eAGxE,GAAIH,EACA,OAAO9Z,KAAKiQ,sBAAsB1T,MAAK2d,GAAkBA,EAAe9e,MAAQ0e,EAAmB1e,QAOvG,KAAAkc,kBAAqBta,IACzB,MAAM,QAAErC,GAAYqF,KAAKJ,MACnBkZ,EAAiBne,GAAWA,EAAQgQ,QACpCgH,EAAgBhX,GAAWA,EAAQgX,cAEzC,IAAKmH,IAAmBnH,IAAkB3R,KAAKJ,MAAM/D,KAAKuV,cAAcnS,OAAQ,CAC5E,MAAM2C,EAAQ,8CAA+CkX,EAAqC,GAApB,qBACzEnH,EAAmC,GAAnB,sCAErB3R,KAAKJ,MAAMf,UAAUY,QAAQmC,GAGjC,MAAM1E,EAA4BH,EAC9BC,EACCgD,KAAKJ,MAAM/D,KAAKuV,cAAcnS,QAAUe,KAAKJ,MAAM/D,KAAKuV,cAAcnS,OAAOiY,eAAkB,IAGpG6B,OAAOC,QAAQC,UAAU,GAAI,IAAIC,EAAAA,EAAAA,KAAiBvD,EAAAA,EAAAA,IAAc3V,KAAKJ,MAAMjF,QAAQgQ,SAAUzN,KAC7Fkc,EAAAA,EAAAA,KAAY,KACRpZ,KAAKJ,MAAM/D,KAAKuV,cAAcnS,OAAQ6W,kBAAoB,EAC1D9V,KAAKJ,MAAM/D,KAAKuV,cAAcnS,OAAQiY,cAAgBha,MAItD,KAAAqa,iBAAoBva,IACxB,GAAIgD,KAAKJ,MAAM/D,KAAKuV,cAAcnS,OAAQ,CACtC,MAAMkb,EAAwBpd,EAC1BC,EACAgD,KAAKJ,MAAM/D,KAAKuV,cAAcnS,OAAOiY,eAAiB,IAG1D,OAAOgC,EAAAA,EAAAA,KAAiBvD,EAAAA,EAAAA,IAAc3V,KAAKJ,MAAMjF,QAAQgQ,SAAUwP,GAGnE,OADAna,KAAKJ,MAAMf,UAAUY,QAAQ,uFACtB,IAIP,KAAAkZ,iBAAoBE,IACxB,MAAM,KAAEhd,EAAI,UAAEgD,GAAcmB,KAAKJ,MAEjC,IAAK/D,EAAKuV,cAAcnS,OAEpB,YADAJ,EAAUY,QAAQ,sGAItB,IAAIxC,EAA6BpB,EAAKuV,cAAcnS,QAAUpD,EAAKuV,cAAcnS,OAAOiY,eAAkB,GAE1G,GAAK2B,EAAaxN,SASX,CACHpO,EAA4B,GAG5B,MAAMmd,EAAoBpa,KAAKuV,2BAA2BrP,SAAWlG,KAAKuV,2BAA2BrP,QAAQtG,MAAMoV,WAC7GqF,EAAkBD,GAAqBjT,SAASC,eAAegT,GACrEnU,YAAW,KACPoU,GAAmBA,EAAgBlU,UACpC,QAjBqB,CACxB,MAAMmU,EAAiBzB,EAAajN,cACpC,IAAK0O,EAED,YADAzb,EAAUY,QAAQ,gFAGtBxC,EAA4BA,EAA0B+Z,QACjD3Z,IAA4CZ,EAA8B6d,EAAgBjd,KAanG,MAAMqY,GAAUC,EAAAA,EAAAA,IAAc3V,KAAKJ,MAAMjF,QAAQgQ,SACjDoO,OAAOC,QAAQC,UAAU,GAAI,IAAIC,EAAAA,EAAAA,IAAiBxD,EAASzY,IAC3DpB,EAAKuV,cAAcnS,OAAO6W,kBAAoB,EAC9Cja,EAAKuV,cAAcnS,OAAOiY,cAAgBja,GAGtC,KAAA2b,iCAAmC,CAACpN,EAAsC+O,KAC9E,MAAM,KAAE1e,EAAI,UAAEgD,GAAcmB,KAAKJ,MAC3B8V,GAAUC,EAAAA,EAAAA,IAAc3V,KAAKJ,MAAMjF,QAAQgQ,SAEjD,IAAK9O,EAAKuV,cAAcnS,OAEpB,OADAJ,EAAUY,QAAQ,yGACXiW,EAAQpb,KAGnB,IAAI2C,EAA6BpB,EAAKuV,cAAcnS,QAAUpD,EAAKuV,cAAcnS,OAAOiY,eAAkB,GAE1G,GAAKqD,EASDtd,EAA4B,OATf,CACb,IAAKuO,EAED,OADA3M,EAAUY,QAAQ,wFACXiW,EAAQpb,KAEnB2C,EAA4BA,EAA0B+Z,QACjD3Z,IAA4CZ,EAA8B+O,EAAiBnO,KAMpG,OAAO6b,EAAAA,EAAAA,IAAiBxD,EAASzY,IAvqBjC+C,KAAKwa,UACD5a,EAAMjF,QAAQgQ,SAAW/K,EAAMjF,QAAQgQ,QAAQ8P,QAAgD,WAAtC7a,EAAMjF,QAAQgQ,QAAQ8P,OAAOC,KAAoB,KAAO,KACrH1a,KAAKsS,gBAAkB9X,EAAAA,YACvBwF,KAAKuV,2BAA6B/a,EAAAA,YAClCwF,KAAKuS,aAAevS,KAAKuS,aAAarS,KAAKF,MAC3CA,KAAK2a,gBAAkB3a,KAAK2a,gBAAgBza,KAAKF,MACjDA,KAAKc,MAAQ,CACT0T,aAAc,CACVoG,SAAS,EACTnG,qBAAsBzU,KAAKiQ,sBAAsB,IAErDoC,aAAa,EACboF,mCAA+Bha,GAEnC,MAAM,mBAAEwF,EAAkB,SAAER,EAAQ,SAAEM,EAAQ,gBAAEhB,GAAoB/B,KAAKJ,MAAM/E,UAEzE+D,EAASoB,KAAKJ,MAAMjF,QAAQgQ,QAAQ/L,OACpCC,EAAYmB,KAAKJ,MAAMf,UACvB8G,EAAqB3F,KAAKJ,MAAM/E,UAAUggB,yBAC1CtU,EAAuBvG,KAAKJ,MAAM/E,UAAUigB,wBAClD9a,KAAKqX,uBAAyB,CAC1BxY,UAAAA,EACAD,OAAAA,EACAqE,mBAAAA,EACAR,SAAAA,EACAM,SAAAA,EACAhB,gBAAAA,EACA4D,mBAAAA,EACAY,qBAAAA,GAIJvG,KAAKJ,MAAM/D,KAAKnB,SAASqgB,MAAKrgB,IAC1BsF,KAAKJ,MAAM/D,KAAKuV,cAAc2J,MAAK3J,IACR,aAAnBpR,KAAKyQ,UACLW,EAAcT,SAAW,WAEzBS,EAAcT,SAAW,SAG7B,IAAIqK,EAA6B,GAE7Bhb,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,OAAS3S,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,MAAMsI,UACrED,EAAe9S,KAAKgT,MAAMC,mBAAmBnb,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,MAAMsI,WAGlF7J,EAAc0E,kBACT9V,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,QAAU3S,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,MAAMoD,MAAQ/V,KAAKJ,MAAM6V,OAAOG,cAAgB,KACjH,EACJxE,EAAciI,eAAiB,CAAEC,QAAS0B,GAC1C5J,EAAcgK,SAAWpb,KAAKJ,MAAM6V,OAAOG,cAAgB,GAC3DxE,EAAcC,eAAiB3W,EAASA,SACxC0W,EAAcgC,kBAAoB1Y,EAAS2Y,OAG3CgI,EAAAA,EAAAA,KACI,IACW,CACHjK,EAAc8F,eAAiB9F,EAAc8F,cAAczK,OAC3D2E,EAAc0E,kBACd1E,EAAciI,gBACVjI,EAAciI,eAAeC,SAC7BlI,EAAciI,eAAeC,QAAQ7M,UAGjD,KAAK,IAAA6O,EAAAC,EAAAC,EAAA3T,EACD,MAAMnB,EAAQ,IAAI+U,EAAAA,GACdrK,EAAcT,SACd3Q,KAAKJ,MAAMjF,QAAQgQ,QAAQD,YAC3B,CACIgR,OAAQ,CACJC,IAAK3b,KAAKJ,MAAM6V,OAAOG,aACvBgG,KAAMC,KAAK1Y,IAAIiO,EAAcgK,UAAYhK,EAAc0E,mBAAqB,GAAI,IAEpFzC,OAAO,EACPyI,QAAS1K,EAAciI,gBAAkB,IAE7CjI,EAAc8F,eAAiB,KAC7BlX,KAAKJ,MAAMjF,QAAQgQ,QAAQ+F,UAAUqL,UAAY,GAGnB,QAAhCT,EAAAtb,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,aAAK,IAAA2I,GAAhCA,EAAkC1I,EAC5B5S,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,MAAMC,EACjC1K,KAAKC,UAAU,CACX6T,UAA2C,QAAlCT,EAAEvb,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,aAAK,IAAA4I,OAAA,EAAhCA,EAAkCU,UAC7CC,eAAgD,QAAlCV,EAAExb,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,aAAK,IAAA6I,OAAA,EAAhCA,EAAkCW,mBAGhD,QAAXtU,EAAC7H,KAAKJ,aAAK,IAAAiI,GAAQ,QAARA,EAAVA,EAAY4N,cAAM,IAAA5N,IAAlBA,EAAoBuU,mBACtBpc,KAAKJ,MAAM6V,OAAO4G,mBAClBrc,KAAKJ,MAAMjF,QAAQgQ,QAAQ/L,OAC3BoB,KAAK6Q,YAGTyL,EAAAA,EAAAA,IAAsB5V,EAAO1G,KAAKJ,MAAMjF,QAAQgX,eAAeoJ,MAAKwB,IAChEnL,EAAcC,eAAiBkL,EAAe7hB,SAC9C0W,EAAcgC,kBAAoBmJ,EAAelJ,kBAMrErT,KAAK2a,kBAvIC,eACN,MAA0B,OAAnB3a,KAAKwa,WAAyC,OAAnBxa,KAAKwa,UAsBpC,uBAAuB5b,EAAgB4d,GAAyC,IAAAC,EACnF,IAAIC,EAIJ,OAHI9d,GAAU4d,GAAoB5K,EAAAA,gBAAgBC,YAAY2K,KAC1DE,EAAkBF,EAAiBjgB,MAAKmQ,GAAQA,EAAKiQ,SAAUC,gBAAkBhe,EAAOge,iBAEtE,QAAtBH,EAAOC,SAAe,IAAAD,OAAA,EAAfA,EAAiBI,KA8GrB,0BAAuB,IAAAC,EAAAC,EAAAC,EAAAC,EAC1Bjd,KAAK4Q,YAAa,EACdsM,EAAAA,GAASC,WAAapE,OAAOqE,mBAE7BrE,OAAOqE,iBAAiB,SAAUpd,KAAK2a,iBACvC3a,KAAK2a,mBAGT,MAAMhgB,EAAUqF,KAAKJ,MAAMjF,QACrB0iB,EAAmC1iB,EAAQ+c,IAAIjC,OAAO6H,wBACtDC,EAA8B5iB,EAAQ+c,IAAIjC,OAAO+H,uBAEnD5L,EAAAA,gBAAgBC,YAAYwL,KAC3BA,EAAiCI,SAASC,EAAAA,eAAeC,OAC1D/L,EAAAA,gBAAgBC,YAAY0L,KAC3BA,EAA4BE,SAASC,EAAAA,eAAeC,OACrD3d,KAAKJ,MAAM6V,OAAO2G,mBAGlBpc,KAAK+Q,uCAET,MAAM0G,QAAsCmG,EAAAA,2BAAAA,+BAA0D,CAClGC,cAAe7d,KAAKJ,MAAMjF,QAAQgX,gBAElC3R,KAAK4Q,YACL5Q,KAAKmF,SAAS,CAAEsS,8BAAAA,IAEpB,MAAMrG,QAAsBpR,KAAKJ,MAAM/D,KAAKuV,cAEtC0M,QAAyB9d,KAAKwX,qBAAqBpG,EAAeqG,GAClE/Q,EAAQ,IAAI+U,EAAAA,GACdrK,EAAcT,SACd3Q,KAAKJ,MAAMjF,QAAQgQ,QAAQD,YAC3B,CACIgR,OAAQ,CACJC,IAAK3b,KAAKJ,MAAM6V,OAAOG,aACvBgG,KAAMC,KAAK1Y,IAAIiO,EAAcgK,UAAYhK,EAAc0E,mBAAqB,GAAI,IAEpFzC,OAAO,EACPyI,QAAS1K,EAAciI,gBAAkB,IAE7CjI,EAAc8F,eAAiB,KAC7BlX,KAAKJ,MAAMjF,QAAQgQ,QAAQ+F,UAAUqL,UAAY,GAGnB,QAAhCe,EAAA9c,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,aAAK,IAAAmK,GAAhCA,EAAkClK,EAC5B5S,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,MAAMC,EACjC1K,KAAKC,UAAU,CACX6T,UAA2C,QAAlCe,EAAE/c,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,aAAK,IAAAoK,OAAA,EAAhCA,EAAkCd,UAC7CC,eAAgD,QAAlCc,EAAEhd,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,aAAK,IAAAqK,OAAA,EAAhCA,EAAkCb,mBAGhD,QAAXc,EAACjd,KAAKJ,aAAK,IAAAqd,GAAQ,QAARA,EAAVA,EAAYxH,cAAM,IAAAwH,IAAlBA,EAAoBb,mBACtBpc,KAAKJ,MAAM6V,OAAO4G,mBAClBrc,KAAKJ,MAAMjF,QAAQgQ,QAAQ/L,OAC3BoB,KAAK6Q,UACL4G,EACAqG,IAEJxB,EAAAA,EAAAA,IAAsB5V,EAAO1G,KAAKJ,MAAMjF,QAAQgX,eAAeoJ,MAAKwB,IAChEnL,EAAcC,eAAiBkL,EAAe7hB,SAC9C0W,EAAcgC,kBAAoBmJ,EAAelJ,SAIlD0K,uBACH/d,KAAK4Q,YAAa,EACdsM,EAAAA,GAASC,WAAapE,OAAOiF,qBAE7BjF,OAAOiF,oBAAoB,SAAUhe,KAAK2a,iBAI3CpZ,SACH,MAAM,cAAE3G,EAAa,UAAEP,GAAc2F,KAAKJ,MAAM6V,QAC1C,UAAE5a,EAAS,UAAEgE,GAAcmB,KAAKJ,MAChClF,EAAYsF,KAAKJ,MAAM/D,KAAKuV,cAAcnS,QAAUe,KAAKJ,MAAM/D,KAAKuV,cAAcnS,OAAOoS,gBAAmB,GAClH,IAAI4M,EAAY,GACXvjB,GAAgC,IAApBA,EAAS+R,SACtBwR,EAA+B,aAAnBje,KAAKyQ,UAA2B5V,EAAUqjB,2BAA6BrjB,EAAUsjB,0BAEjG,MAAMnjB,EAA0B4W,EAAAA,gBAAgBC,YAAY7R,KAAKJ,MAAMwe,MAAMpjB,yBACvEgF,KAAKJ,MAAMwe,MAAMpjB,wBAAwB,GACzC,KACAqjB,EACF7jB,EAAAA,cAACC,EAAwB,CACrBC,SAAUA,EACVC,QAASqF,KAAKJ,MAAMjF,QACpBC,cAAeA,EACfiE,UAAWA,EACXhE,UAAWA,EACXC,WAAYkF,KAAKJ,MAAMhE,SACvBb,SAAUiF,KAAKJ,MAAMjE,GACrBX,wBAAyBA,IAI3BsjB,EAA8B9gB,EAAAA,EAAA,GAC7BwC,KAAKJ,OAAK,IACblF,SAAU2jB,EACVE,eAAgBve,KAAKwS,sBACrBsB,kBAAmB9T,KAAK6T,wBACxB2K,WAAYxe,KAAK4W,iBACjBvc,UAAWqP,GAAAA,CAAW,6BAA8BrP,GACpD0V,sBAAuB,CACnB0O,YAAaze,KAAKJ,MAClBvF,UAAWqP,GAAAA,CAAW,6BAA8BrP,IAExDqkB,cACI1e,KAAKJ,MAAM/D,KAAKuV,cAAcnS,QAAqE,IAA3De,KAAKJ,MAAM/D,KAAKuV,cAAcnS,OAAOmU,kBACvEpT,KAAKqU,sBACL,KACVsK,WAAY3e,KAAKwV,iBACjBoJ,kBAAmB,CAAEvkB,UAAW,wCAChCwkB,wBAAyB,CAAExkB,UAAW,+CACtCykB,qBAAsB,CAAEzkB,UAAW,oDACnC0kB,iCAAkC,CAAE1kB,UAAW,sDAC/C2kB,cAAehf,KAAKsY,oBACpB2G,YACIjf,KAAKJ,MAAM/D,KAAKuV,cAAcnS,QAAqE,IAA3De,KAAKJ,MAAM/D,KAAKuV,cAAcnS,OAAOmU,kBACzE5Y,EAAAA,cAACkT,EAAW,CACRtT,KAAMS,EAAU2T,WAChBjU,UAAWM,EAAU2T,WACrBb,SAAU3N,KAAKsS,gBACf3J,QAAS3I,KAAKuS,aACd5W,GAAG,wBAEP,KACRujB,kBAAmBlf,KAAK8R,wBACxBqN,SAAUnf,KAAKmf,SACfC,aAAcnB,GAAazjB,EAAAA,cAACsV,EAAY,CAAC1V,KAAM6jB,IAC/C3M,gCAAiCtR,KAAKc,MAAMwQ,kCAEhD,OAAOtR,KAAKJ,MAAMyf,WAAWf,GA4bzBgB,eACJ,MAAM,QAAE3kB,GAAYqF,KAAKJ,MAGzB,GAAIjF,EAAQgQ,SAAWhQ,EAAQgQ,QAAQ8P,QAA0C,WAAhC9f,EAAQgQ,QAAQ8P,OAAOC,KACpE,MAAO,KAGX,GAAIwC,EAAAA,GAASC,WAAapE,OAAOwG,WAAY,CAEzC,MAAMC,EAAe7kB,EAAQgQ,QAAQ6U,aACrC,GAAIA,EACA,OAAIA,EAAaC,IAAM1G,OAAOwG,YAAcC,EAAaC,GAAGC,EACjD,KACAF,EAAaG,IAAM5G,OAAOwG,YAAcC,EAAaG,GAAGD,EACxD,KACAF,EAAaI,IAAM7G,OAAOwG,YAAcC,EAAaI,GAAGF,EACxD,KACAF,EAAaK,IAAM9G,OAAOwG,YAAcC,EAAaK,GAAGH,EACxD,KAEA,KAKnB,MAAO,KAGHnN,eACJvS,KAAKmF,SAAS,CACVkN,aAAcrS,KAAKc,MAAMuR,cAIzBsI,kBACJ3a,KAAKwa,UAAYxa,KAAKsf,eAElBtf,KAAKc,MAAMuR,cAAgBrS,KAAKmf,UAChCnf,KAAKuS,kBAlvBHjL,EAAAA,EAAAA,IAAA,CAATC,EAAAA,IAAQ,8BAeTD,EAAAA,EAAAA,IAAA,CADCwY,EAAAA,IAAU,gCAlBM/P,EAAqBC,GAAA1I,EAAAA,EAAAA,IAAA,CADzCE,EAAAA,IACoBuI,qGChIrB,MA0DMgQ,EAA0BA,CAC5BC,EACAxB,EACA7J,IAEOna,EAAAA,aACHwlB,EAAWjO,MACX,GACAiO,EAAWhO,YACXiO,EAAgBD,EAAYxB,EAAY7J,GACxCqL,EAAW/N,aAIbgO,EAAkBA,CACpBrgB,EACA4e,EACA7J,IAEIA,EACOna,EAAAA,aAAmBoF,EAAMsS,UAAW,GAAIgO,EAAWvL,GAAiBwL,EAAc3B,IAEtF,KAGL2B,EAAiBvgB,IACnB,MAAM,SAAEmX,EAAQ,oBAAEI,EAAmB,wBAAEC,GAA4BxX,EACnE,OAAImX,EAEIvc,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK4U,GACN5c,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK2U,GACLJ,EAAS9b,KAAI,CAAColB,EAASllB,IACpBX,EAAAA,cAACA,EAAAA,SAAc,CAACY,IAAKD,GAAQklB,OAM1C,MAGLH,EAActgB,IAChB,MAAM,iBAAE8U,EAAgB,eAAEC,GAAmB/U,EAC7C,OAAI+U,EACOna,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKkS,GAAmBC,GAEjC,MAGL2L,EAA2B1gB,IAC7B,MAAM,2BAAEmU,EAA0B,sBAAEE,EAAqB,2BAAEG,GAA+BxU,EAC1F,OAAIqU,EAEIzZ,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKuR,GACLE,EAAsBhZ,KAAI,CAAC4X,EAAU1X,IAClCX,EAAAA,cAACA,EAAAA,SAAc,CAACY,IAAKD,GAChB0X,EACAoB,GAAyBA,EAAsB9Y,EAAQ,IAAMiZ,MAO3E,MAGLmM,EAAe3gB,IACjB,MAAM,MAAEqT,EAAK,eAAEO,GAAmB5T,EAClC,OAAIqT,EAEIzY,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKgR,GACNhZ,EAAAA,cAAA,UACKyY,EAAMQ,YACNR,EAAMU,YAKhB,MAGL6M,EAAoB5gB,IACtB,MAAM,MAAEqT,EAAK,eAAEO,GAAmB5T,EAClC,OAAIqT,EAEIzY,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKgR,GACNhZ,EAAAA,cAAA,UAAKyY,EAAMW,aAIhB,MAGX,EAxJ6EhU,IACzE,MAAM,sBACFmQ,EAAqB,SACrBrV,EAAQ,WACRikB,EAAU,kBACVC,EAAiB,wBACjBC,EAAuB,cACvBG,EAAa,SACbG,EAAQ,YACRF,EAAW,kBACXC,EAAiB,eACjBX,EAAc,WACdC,EAAU,kBACV1K,EAAiB,cACjB4K,EAAa,qBACbI,EAAoB,iCACpBC,EAAgC,aAChCK,GACAxf,EACJ,OAAIuf,EAEI3kB,EAAAA,cAACimB,EAAAA,OAAMle,OAAAC,OAAA,GAAKuN,GACPuQ,EAAwBxM,GACxByM,EAAYhC,GACZS,EACAC,EACAc,EAAwBb,EAAmBV,EAAYE,GACxDlkB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKoc,GACLQ,EACA1kB,GAEJikB,GAKTnkB,EAAAA,cAACimB,EAAAA,OAAMle,OAAAC,OAAA,GAAKuN,GACRvV,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKsc,GACLhL,GAAqBwM,EAAwBxM,GAC7CyK,GAAkBiC,EAAiBjC,IAExC/jB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKuc,GACLP,GAAc2B,EAAc3B,GAC7BhkB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKqc,GACLN,GAAkBgC,EAAYhC,GAC9BS,EACAN,GAAiBwB,EAAWxB,GAC7BlkB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKoc,GACLQ,EACA1kB,GAEJikB,2JCjDrB,IAAqB1T,EAArB,cAA2CzQ,EAAAA,UAavCmF,YAAYC,GACRC,MAAMD,GAbF,KAAAsL,iBAA2B,gBAwD3B,KAAAc,uBAA0B3P,IAC9B,MAAM,aAAEuQ,EAAY,uBAAEC,EAAsB,iBAAEC,EAAgB,UAAEjO,GAAcmB,KAAKJ,MAC7EoN,EAAgBJ,GAAgB,MAChCK,EAAcJ,EACpB,IAcIK,EAdAC,EAAc,GAClB,GAAIL,GAAoBA,EAAiBvQ,KAAM,CAC3C,MAAM6Q,EAASN,EAAiBvQ,MAC3B8Q,KACKA,EAAUlP,OAAO5B,MAAMsG,IAA+BpG,EAAAA,EAAAA,IAA8BoG,EAAOxG,OAGhG+Q,EAGDD,EAAcC,EAAOnL,SAAW,GAFhCpD,EAAUY,QAAQ,oEAO1B,OAAQpD,EAAoBO,eACxB,KAAKX,EAAAA,GAAiCY,MACtC,KAAKZ,EAAAA,GAAiCqR,WAClCJ,EAAmBD,EACdjL,QAAQ,MAAOhC,KAAKwD,aAAanH,EAAoBS,qBAAsBT,EAAoBiF,WAC/FU,QAAQ,MAAOhC,KAAKwD,aAAanH,EAAoBsB,sBAAuBtB,EAAoBiF,WACrG,MACJ,QACI4L,EAAmB7Q,EAAoBoM,+BAAiCpM,EAAoBS,sBAAwB,GAG5H,OAAOkQ,EAAchL,QAAQ,MAAOmL,GAAanL,QAAQ,MAAOkL,IAG5D,KAAA1J,aAAe,CAAC9E,EAA4BC,KAChD,IAAKD,IAAWC,EAEZ,OADAqB,KAAKJ,MAAMf,UAAUC,MAAM,2CACpBJ,GAAU,GAErB,MAAMK,EAAeL,GAAUM,OAAON,IAAY,EAC5CE,EAAS6O,GAAAA,CAAIzN,KAAKJ,MAAO,yBAA0B,SACzD,IAAIX,EAEJ,IACIA,EAAS,IAAIC,KAAKC,aAAaP,EAAQ,CACnCQ,MAAO,WACPC,gBAAiB,SACjBV,SAAUA,EACVW,sBAAuB,IACxBC,OAAOR,GACZ,MAAOS,GACLP,EAAS,GAAGF,KAAeJ,IAC3BqB,KAAKJ,MAAMf,UAAUY,QAAQ,8BAA8BR,MAAWO,KAG1E,OAAOP,GAGH,KAAAyI,SAAYlI,IAChBA,EAAEmI,iBACFnI,EAAE2L,kBAEF,MAAMC,EAAS5L,EAAE6F,cACXgG,EAAWD,EAAOE,aAAa,SAAUC,QAAQ,8BAAgC,EACjFC,EAAkBH,OAAW5N,EAAYuC,KAAKyL,0BAA0BL,GAE1EpL,KAAKJ,MAAM8L,iBACX1L,KAAKJ,MAAM8L,gBAAgB,CACvBL,SAAUA,EACVM,YAAaP,EACbQ,cAAeJ,EACfK,gBAAiBT,EAAOU,eAK5B,KAAAL,0BAA6BE,IACjC,MAAM1M,EAASe,KAAKwM,oBAAoBjQ,MAAK6J,IAAauF,EAAY+U,WAAa/U,EAAY+U,UAAUC,UAAYva,EAAShL,MAC9H,OAAQ6D,GAAUA,EAAO4D,YAAUpF,GAnI7B,0BACN,MAAM,gBAAEsO,GAAoB/L,KAAKJ,MACjC,OAAOmM,EAAgB9Q,KAAKuQ,IACjB,CACHpQ,IAAK4E,KAAKgM,uBAAuBR,GACjC3I,MAAO2I,MASZjK,SACH,MAAM,aAAE2K,EAAY,MAAEC,EAAK,WAAEC,EAAU,gBAAEC,GAAoBrM,KAAKJ,MAC5D2M,EAAQvM,KAAKwM,oBACnB,OACIhS,EAAAA,cAAA,OAAKH,UAAU,sBACVkS,EAAME,OAAS,GAAKN,GAAS3R,EAAAA,cAAA,QAAMH,UAAU,6BAA6B8R,GAC3E3R,EAAAA,cAAA,MAAIH,UAAWqP,GAAAA,CAAW0C,EAAY,2BAA4B,kBAC7DG,EAAMtR,KAAI,CAACyR,EAAmBvR,KAE3B,MAAMylB,EAAuE,cAAtD5gB,KAAKJ,MAAMmM,gBAAgB5Q,GAAOuB,gBAAkC,SAAW,KAChGiQ,EAAgB,CAClB,gBAAiBxR,EACjB,eAAgBoR,EAAME,QAG1B,OACIjS,EAAAA,cAAA,KAAA+H,OAAAC,OAAA,CAAInI,UAAU,gCAAgCe,IAAKsR,EAAKtR,KAASuR,GAC7DnS,EAAAA,cAAA,KACIH,UAAU,2BACVC,KAAM0F,KAAKJ,MAAMoL,WAAW0B,EAAK7J,OAAO,GAAM,aAClC,GAAG6J,EAAKtR,OAAOiR,IAC3B1D,QAAS3I,KAAK0H,UAEbkZ,EACAlU,EAAKtR,IACNZ,EAAAA,cAAA,QAAMH,UAAW,GAAG2F,KAAKkL,qDAM5CqB,EAAME,OAAS,GAAKP,GACjB1R,EAAAA,cAAA,KAAGF,KAAM0F,KAAKJ,MAAMoL,WAAW,IAAI,GAAO3Q,UAAW,gCAAiCsO,QAAS3I,KAAK0H,UAC/FwE,OA/CX5E,EAAAA,EAAAA,IAAA,CAATC,EAAAA,IAAQ,wCAHQ0D,GAAa3D,EAAAA,EAAAA,IAAA,CADjCE,EAAAA,IACoByD,qKC2Bd,MAAM4V,EAAgBna,IACzB,MAOMoa,EAAyBC,IAC3B,MAAM7lB,EAAU6lB,EAAS/E,YARRC,EAQiC8E,EAAS/E,WAP1CpV,GAAAA,CAAIF,EAAO,yBAA2B,IACvCnK,MAAMykB,GACX/E,IAAc+E,EAAS3d,YAHjB4Y,IAAAA,EASjB,MAAM,GACFtgB,EAAE,SACFC,EAAQ,QACRjB,EACA8a,QAAQ,cAAE7a,GACVC,WAAW,sBACPomB,EAAqB,0BACrBC,EAAyB,yBACzBC,EAAwB,0BACxBC,EAAyB,aACzBC,EAAY,uBACZC,EAAsB,mBACtBC,GAEJ5mB,SACIgQ,SAAS,aAAE6U,KAEf9Y,EAEJ,GAAKxL,EAIL,OACIV,EAAAA,cAACgnB,EAAAA,sBAAqB,CAClB7lB,GAAIA,EACJC,SAAUA,EACVjB,QAASA,EACTE,UAAW,CACP4mB,WAAYN,EACZO,YAAaR,EACbS,YAAaP,EACbH,sBAAAA,EACAI,aAAAA,EACAC,uBAAAA,EACAC,mBAAAA,EACA/lB,kBAAmB,GACnBC,iBAAkB,GAClBmmB,oBAAqB,IAEzBC,oBAAoB,EACpBjnB,cAAeA,EACf4kB,aAAcA,EACdsC,YAAYC,EAAAA,EAAAA,mBAAkB7mB,EAASP,EAAQgX,mBAAelU,GAC9DukB,gBAAiB9mB,EAAQ+mB,gBACzBpmB,KAAM,CACFklB,SAAUA,EACV7lB,QAASA,MAMnBgnB,EAA2B3V,GACtBA,EAAMtR,KAAI8lB,IACN,CACHoB,OAAQpB,EAASoB,QAAU,GAC3BC,SAAU,CAAE/nB,UAAW,0BACvBqS,KAAMoU,EAAsBC,OA6BlCsB,EAA+BC,IACjC,MAAM/V,EAT0B+V,CAAAA,IAChC,MAAMC,EAAO3b,GAAAA,CAAIF,EAAO,0CAClB8b,EAAyB5b,GAAAA,CAAIF,EAAO,kDAC1C,MAAgB,SAAT4b,EACDC,EAAKE,UAAUzL,QAAQ+J,GAAuBA,EAAS2B,eAAiBF,IACxED,EAAKE,UAAUzL,QAAQ+J,GAAuBA,EAAS2B,eAAiBF,KAIhEG,CAA2BL,GAEzC,GAAqB,IAAjB/V,EAAME,OACN,OAGJ,MACMwG,EAhCsB2P,EAACvP,EAAeiP,KAC5C,MACIznB,WAAW,UAAEgoB,EAAS,WAAEC,EAAU,mBAAEC,EAAkB,8BAAEC,IACxDtc,EAEEuc,EAAS5P,EAAQ,EAAIyP,EAAaD,EAExC,OADuB,SAATP,EAAkBU,EAAgCD,GACnD/gB,QAAQ,UAAWqR,EAAMpH,YAAYjK,QAAQ,WAAYihB,IAyBxDL,CAtBGrW,CAAAA,GACVA,EAAM2W,QAAO,CAAC7P,EAAO3G,IACjB2G,GAAS3G,EAAKyW,UAAY,IAClC,GAkBWC,CAAY7W,GACmB+V,GAE7C,MAAO,CACHe,sBAAuB,CAAEhpB,UAAWqP,GAAAA,CAAW,yCAA0C4Y,IACzFgB,aAAc,CAAEjpB,UAAW,gCAC3BkpB,QAAS/oB,EAAAA,cAAA,OAAKH,UAAU,uCAAuC4Y,GAC/DuQ,UAAWtB,EAAwB3V,KAqC3C,MAjCsBkX,MAClB,MAAM,QACF9oB,EACA8a,QAAQ,iBAAEiO,GACV7nB,MAAM,SAAEnB,GACRG,WAAW,aAAE8oB,IACbjd,EAEE6b,EAAO3b,GAAAA,CAAIF,EAAO,0CAExB,GAAK6b,GAASA,EAAKE,WAAcF,EAAKE,UAAUhW,QAAW/R,EAI3D,MAAO,CACHkpB,UAAW,CAAEvpB,UAAW,2BACxBwpB,OAAQ,CAAExpB,UAAW,kCACrBkpB,QAASG,GAAoBlpB,EAAAA,cAACspB,EAAAA,QAAOvhB,OAAAC,OAAA,CAACnI,UAAU,mCAAsCqpB,IACtFK,SACIvpB,EAAAA,cAACmU,EAAAA,OAAM,CACHtU,UAAU,yCACV4Y,MAAO0Q,EACPK,MAAM,OACN1pB,MAAM2pB,EAAAA,EAAAA,IAAW,OAAQtpB,EAAQgX,gBAAkB,IAElDgS,GAGTO,eAAgB7B,EAA4B,UAC5C8B,aAAc9B,EAA4B,UAI3CoB,6JClJX,IAAqB/jB,EAArB,cAA6ClF,EAAAA,UAYzCmF,YAAYC,GACRC,MAAMD,GARH,KAAAsD,IAAMlD,KAAKJ,MAAMvD,oBAAoBS,sBAAwB,IAC7D,KAAAqG,IAAMnD,KAAKJ,MAAMvD,oBAAoBsB,uBAAyBqC,KAAKJ,MAAMvD,oBAAoBsB,sBAC5F,KAAAmC,6BAAoD,IAAIC,IA2CxD,KAAA2B,mBAAqB,KACzB,MAAM,WAAEG,EAAU,8BAAE7D,EAA6B,sBAAEwD,GAA0BxB,KAAKJ,OAC5E,mBAAEoB,EAAkB,mBAAEC,GAAuBjB,KAAKc,MAGlDgB,EAAY,CACd,cAFoBN,EAAsBO,iBAAmB,OAAOC,QAAQ,MAAOhE,EAA8BiE,SAAW,IAG5H,gBAAiBJ,GAEfK,EAAoB,mEACtBlB,EAAqB,qCAAuC,IAE1DmB,EAAoB,mEACtBlB,EAAqB,qCAAuC,KAI1D,qBAAEqB,EAAoB,qBAAEF,GAAyBpC,KAAKc,MAC5D,OACItG,EAAAA,cAAA,OAAA+H,OAAAC,OAAA,CAAMnI,UAAU,0CAA6CyH,GACzDtH,EAAAA,cAAA,SAAOH,UALW,8EAMbmH,EAAsBiB,SAAQ,KAAI,IAAG,IACtCjI,EAAAA,cAAA,UAAQH,UAAW6H,EAAmBQ,SAAU1C,KAAKO,iBAAkBuC,IAAK9C,KAAKS,UAC5E2B,GACGA,EAAqBnH,KAAI,CAAC4H,EAAOzH,IAEzBZ,EAAAA,cAAA,UAAQY,IAAKyH,EAAMuhB,WAAYhe,SAAUvD,EAAMuD,SAAUkC,KAAK,SAASzF,MAAOA,EAAMuhB,YAC/EvhB,EAAMuhB,gBAM/B5pB,EAAAA,cAAA,SAAOH,UAjBW,8EAkBbmH,EAAsBuB,SAAQ,KAAI,IAAG,IACtCvI,EAAAA,cAAA,UACIH,UAAW8H,EACXa,YAAaV,OAAuB7E,EAAY+D,EAAsByB,mBACtEP,SAAU1C,KAAKQ,iBACfsC,IAAK9C,KAAKU,UAET4B,GACGA,EAAqBrH,KAAI,CAAC4H,EAAOzH,IAEzBZ,EAAAA,cAAA,UAAQY,IAAKyH,EAAMuhB,WAAYhe,SAAUvD,EAAMuD,SAAUkC,KAAK,SAASzF,MAAOA,EAAMuhB,YAC/EvhB,EAAMuhB,gBAM9BpjB,GACGxG,EAAAA,cAAA,QAAMH,UAAU,wFACX2G,GAGRC,GAAsBD,IAAuBC,GAC1CzG,EAAAA,cAAA,QAAMH,UAAU,wFACX4G,KAOb,KAAAU,cAAgB,KACpB,MAAM,WAAEE,EAAU,oBAAExF,EAAmB,8BAAE2B,EAA6B,4BAAE2C,GAAgCX,KAAKJ,MACvGsD,EAAM7G,EAAoBS,qBAC1BqG,EAAM9G,EAAoBsB,sBAC1BuD,EACDP,GAA+BA,EAA4B7D,sBAC5DT,EAAoBS,sBACpB,IACEqE,EACDR,GAA+BA,EAA4BhD,uBAC5DtB,EAAoBsB,uBACpBwF,EACEC,EAAW,UAAUpF,EAA8BqF,YAAYhH,EAAoBK,kBACnF4G,EAAiB,CACnB,gBAAiBzB,GAGf0B,EAAWvD,KAAKwD,aAAaN,GAC7BO,EAAWzD,KAAKwD,aAAaL,GAC7BO,EAAmB1D,KAAKwD,aAAatC,GACrCyC,EAAmB3D,KAAKwD,aAAarC,GAE3C,OACI3G,EAAAA,cAACoJ,EAAAA,OAAMrB,OAAAC,OAAA,CACHnI,UAAW,mCACXe,IAAKgI,EACLzH,GAAIyH,EACJS,QAAQ,EACRX,IAAMA,GAAOlE,OAAOkE,SAASzF,EAC7B0F,IAAMA,GAAOnE,OAAOmE,SAAS1F,EAC7BqG,KAAM,EACNC,YAAa,aACbC,OAAQ,CACJ,CACIC,QAAS,GAAGb,UACZc,YAAa,GAAGX,IAChBY,iBAAkB,SAEtB,CACIF,QAAS,GAAGb,QACZc,YAAa,GAAGT,IAChBU,iBAAkB,QAG1BC,YAAY,EACZC,aAAa,EACbC,aAAc,CACV,CACI3I,GAAI,GAAGyH,uBACPP,MAAQ3B,GAAelC,OAAOkC,IAAiB,EAC/C3G,UAAW,GAAGyF,KAAKJ,MAAM2E,gCAAgCvE,KAAKwE,eAC9DC,cAAe,GAAGf,KAEtB,CACI/H,GAAI,GAAGyH,qBACPP,MAAO7D,OAAOmC,IAAgBnC,OAAOyE,GACrClJ,UAAW,GAAGyF,KAAKJ,MAAM8E,gCAAgC1E,KAAKwE,eAC9DC,cAAe,GAAGd,MAG1BgB,YAAa3E,KAAKG,kBAClBuC,SAAUkC,GAAAA,CAAS5E,KAAKC,eAAgB,KACxC4E,kBAAmB7E,KAAKI,yBACpBkD,KAKR,KAAA/C,iBAAoBuE,IACxB,MAAMQ,EAAmBtF,KAAKoF,2BAA2BN,EAAMO,cAAcxC,OACvEiD,EAAmB9F,KAAKU,SAASwF,QAASrD,MAC1CwhB,EAAmB,IAAIrkB,KAAKJ,MAAM0kB,8BAClCC,EAAsBF,EAAiB9nB,MAAKioB,GAAKA,EAAEJ,aAAe9e,IAClEmf,EAAsBJ,EAAiB9nB,MAAKioB,IAAoB,IAAfA,EAAEpe,WACzDie,EAAiBppB,KAAI,CAAC4H,EAAO1H,KACrBopB,GAAuBA,EAAoBH,aAAevhB,EAAMuhB,aAChEG,EAAoBne,UAAW,GAE/Bqe,GAAuBA,EAAoBL,aAAevhB,EAAMuhB,aAChEK,EAAoBre,UAAW,GAE5BvD,KAEX7C,KAAKmF,SAAS,CACVjE,YAAaoE,EACbC,YAAY,IAEhB,MAAM9E,EAAWzB,OAAOsG,GAClB5E,EAAW1B,OAAO8G,IAClB,SAAEN,EAAQ,8BAAExH,EAA6B,oBAAE3B,EAAmB,sBAAEmF,GAA0BxB,KAAKJ,MAC/FuD,EAAO9G,GAAuBA,EAAoBsB,4BAA0BF,EAE5EgI,EAAStC,EAAMnE,OAAOmE,QAAO1F,EAEnC,OAAIiI,MAAMjF,IACNT,KAAKmF,SAAS,CAAEnE,mBAAoBQ,EAAsBmE,qBAC1D3F,KAAK4F,OAAO,QACL,GAGP5F,KAAK6F,eAAepF,EAAUgF,IAC9BD,EAAS,CACLxH,8BAA+BA,EAC/B3B,oBAAqBA,EACrBiB,aAAa,EACbI,WAAY+C,EACZ7C,SAAU8C,KAEP,IAEPV,KAAK4F,OAAO,QAGT,IAGH,KAAApF,iBAAoBsE,IACxB,MAAMgB,EAAmB9F,KAAKoF,2BAA2BN,EAAMO,cAAcxC,OACvEyC,EAAmBtF,KAAKS,SAASyF,QAASrD,MAE1CwhB,EAAmB,IAAIrkB,KAAKJ,MAAM8kB,8BAClCH,EAAsBF,EAAiB9nB,MAAKioB,GAAKA,EAAEJ,aAAete,IAClE2e,EAAsBJ,EAAiB9nB,MAAKioB,IAAoB,IAAfA,EAAEpe,WACzDie,EAAiBppB,KAAI,CAAC4H,EAAO1H,KACrBopB,GAAuBA,EAAoBH,aAAevhB,EAAMuhB,aAChEG,EAAoBne,UAAW,GAE/Bqe,GAAuBA,EAAoBL,aAAevhB,EAAMuhB,aAChEK,EAAoBre,UAAW,GAE5BvD,KAGX7C,KAAKmF,SAAS,CACVhE,YAAa2E,EACbC,YAAY,IAEhB,MAAMrF,EAAW1B,OAAO8G,GAClBrF,EAAWzB,OAAOsG,IAClB,SAAEE,EAAQ,8BAAExH,EAA6B,oBAAE3B,EAAmB,sBAAEmF,GAA0BxB,KAAKJ,MAC/FsD,EAAO7G,GAAuBA,EAAoBS,sBAAyB,IAE3EkJ,EAAShH,OAAOkE,GAEtB,OAAIwC,MAAMhF,IACNV,KAAKmF,SAAS,CAAElE,mBAAoBO,EAAsBmE,qBAC1D3F,KAAK4F,OAAO,QACL,KAGP5F,KAAK6F,eAAeG,EAAQtF,KACxBrE,EACAmJ,EAAS,CACLxH,8BAA+BA,EAC/B3B,oBAAqBA,EACrBiB,aAAa,EACbI,WAAY+C,EACZ7C,SAAU8C,IAGdV,KAAK4F,OAAO,QAET,IAMP,KAAAA,OAAUZ,IACd,MAAMlC,EAAoB,QAAdkC,EAAsBhF,KAAKU,SAAWV,KAAKS,SAEvDwF,YAAW,KACHnD,GAAOA,EAAIoD,SACXpD,EAAIoD,QAAQC,UAEjB,KAGC,KAAAN,eAAiB,CAAC3C,EAAaC,KACnC,MAAM,sBAAE3B,GAA0BxB,KAAKJ,MACvC,YAAYnC,IAAR0F,MAIAD,EAAMC,KACNnD,KAAKmF,SAAS,CACVnE,mBAAoBQ,EAAsB+E,qBAC1CtF,mBAAoBO,EAAsB+E,wBAEvC,KAMP,KAAA/C,aAAgB9E,IACpB,MAAME,EAASoB,KAAKJ,MAAM4B,sBAAsB5C,OAC1CK,GAASR,EAAAA,EAAAA,IAAYC,EAAQsB,KAAKwE,aAAc5F,EAAQoB,KAAKJ,MAAM4B,sBAAsB3C,WAM/F,YAJepB,IAAXiB,GAAyBsB,KAAKF,6BAA6B0G,IAAIvH,IAC/De,KAAKF,6BAA6B2G,IAAIxH,EAAQP,GAG3CO,GAGH,KAAAmG,2BAA8BsB,IAElC,MAAMC,EAAa3H,OAAO0H,GAC1B,IAAKhB,MAAMiB,GACP,OAAOD,EAKX,OAD4B1G,KAAKF,6BAA6B8G,IAAIF,IACpCA,GAG1B,KAAAzG,eAAkB4G,IAEtB,GAA2C,cAAvCA,EAAyBC,UAA2B,CACpD,MAAM,SAAEtB,EAAQ,8BAAExH,EAA6B,oBAAE3B,GAAwB2D,KAAKJ,MAC1EvD,GAAuBwK,IACvBrB,EAAS,CACLxH,8BAA+BA,EAC/B3B,oBAAqBA,EACrBiB,aAAa,EACbI,WAAYmJ,EAAyBE,gBACrCnJ,SAAUiJ,EAAyBG,mBAGvChH,KAAKiH,oBAAoBJ,MAK7B,KAAA1G,kBAAqB0G,IACzB,MAAM,SAAErB,EAAQ,8BAAExH,EAA6B,oBAAE3B,GAAwB2D,KAAKJ,MAC1EvD,GAAuBwK,IACvBrB,EAAS,CACLxH,8BAA+BA,EAC/B3B,oBAAqBA,EACrBiB,aAAa,EACbI,WAAYmJ,EAAyBE,gBACrCnJ,SAAUiJ,EAAyBG,mBAGvChH,KAAKiH,oBAAoBJ,KAIzB,KAAAI,oBAAuBJ,IAC3B,GAAIA,EAAyBlL,GAAI,CAC7B,MAAMuL,EAAUC,SAASC,eAAeP,EAAyBlL,IAC3DuL,GACFjB,YAAW,KACPiB,EAAQf,UACT,KAKP,KAAA/F,wBAA2BiH,GACxBrH,KAAKwD,aAAa,GAAG6D,KA3W5BrH,KAAKS,SAAWjG,EAAAA,YAChBwF,KAAKU,SAAWlG,EAAAA,YAEhB,MAAM,oBAAE6B,GAAwB2D,KAAKJ,MAC/BgB,EAAcvE,GAAuBA,EAAoBS,sBAAyB,IAClF+D,EAAcxE,GAAuBA,EAAoBsB,4BAA0BF,EACzFuC,KAAKc,MAAQ,CACTC,WAAW,EACXC,wBAAoBvD,EACpBwD,wBAAoBxD,EACpByD,YAAaN,EACbO,YAAaN,EACbO,YAAY,EACZC,YAAY,EACZe,qBAAsBxC,EAAM0kB,6BAC5BhiB,qBAAsB1C,EAAM8kB,8BA7B1B,mBACN,OAAO1kB,KAAKJ,MAAMvD,oBAAoBiF,UAAY,GAgC/CC,SACH,MAAM,oBAAElF,EAAmB,8BAAE2B,EAA6B,sBAAEwD,GAA0BxB,KAAKJ,MAE3F,GAAKvD,GAAwB2B,EAM7B,MAA6B,UAAzBgC,KAAKJ,MAAM6B,UACJzB,KAAK0B,qBAGT1B,KAAK2B,gBATRH,EAAsB3C,UAAU+C,MAC5B,qGAtCF0F,EAAAA,EAAAA,IAAA,CAATC,EAAAA,IAAQ,iCADQ7H,GAAe4H,EAAAA,EAAAA,IAAA,CADnCE,EAAAA,IACoB9H,6LCbrB,MAAM+H,UAAmBjN,EAAAA,UAGrBmF,YAAYC,GACRC,MAAMD,GAuFF,KAAA8I,eAAiB,KACrB,MAAM,WAAEsC,EAAU,8BAAEhN,EAA6B,oBAAE3B,EAAmB,4BAAEsE,GAAgCX,KAAKJ,MAE7G,OAAIvD,EACO2O,EAAW,CACdhN,8BAA+BA,EAC/B3B,oBAAqBA,EACrBiB,aAAcqD,IAIf,IAGH,KAAA+G,SAAYlI,IAChBA,EAAEmI,iBAEF,MAAM,8BAAE3J,EAA6B,oBAAE3B,EAAmB,4BAAEsE,GAAgCX,KAAKJ,MAC7FvD,IACA2D,KAAKJ,MAAM4F,SAAS,CAChBxH,8BAA+BA,EAC/B3B,oBAAqBA,EACrBiB,aAAcqD,IAGlBsF,YAAW,KACPjG,KAAK4H,WAAW1B,SAAWlG,KAAK4H,WAAW1B,QAAQC,UACpD,KAjHPnG,KAAK0H,SAAW1H,KAAK0H,SAASxH,KAAKF,MACnCA,KAAKc,MAAQ,CACTC,YAAaf,KAAKJ,MAAMe,6BAE5BX,KAAK4H,WAAapN,EAAAA,YAGf+G,SACH,MAAAsG,EAUI7H,KAAKJ,OAVH,WACFiC,EAAU,sBACVL,EAAqB,8BACrBxD,EAA6B,oBAC7B3B,EAAmB,4BACnBsE,EAA2B,SAC3BmH,EAAQ,SACRtC,EAAQ,QACR7K,GAEHkN,EADME,GAAKC,EAAAA,EAAAA,GAAAH,EAAAI,GAEZ,IAAK5L,EAED,YADAmF,EAAsB3C,UAAU+C,MAAM,sEAGrCvF,EAAoBS,sBACrB0E,EAAsB3C,UAAUY,QAC5B,2DAA2DyI,KAAKC,UAAU9L,MAGlF,MAAM+L,EAAiBpK,EAA8BC,mBAAqB/B,EAAAA,GAAwBgC,OAClG,IAAImK,EAAoBD,EAAiB,gBAAkB,eAC3DC,EAAoB,0BAA0BA,IAC9C,MAAMrD,EAAYoD,EAAiB,QAAU,WACvCE,EAAOF,EAAiB,aAAU3K,EAExC,OADA4K,EAAsB1H,EAA8B,GAAG0H,YAA8BA,EACjFrK,EAA8BuK,cAAgBpM,EAAAA,GAAqBqM,OAC/DnM,EAAoBS,qBAEhBtC,EAAAA,cAAA,MACIH,UAAU,yBACViO,KAAK,QAAO,eACC,QACb3M,GAAI,GAAGqC,EAA8BiE,WAAY5F,EAAoBoM,gCAA+B,aACxF,GAAGzK,EAA8BiE,WAAY5F,EAAoBoM,iCAE7EjO,EAAAA,cAAA,KACIF,KAAM0F,KAAK0I,iBAAgB,aACf,GAAG1K,EAA8BiE,WAAY5F,EAAoBoM,gCAC7EE,QAAS3I,KAAK0H,UAEdlN,EAAAA,cAAA,QAAMH,UAAU,oCACmBoD,IAA9BpB,EAAoB8M,OAAuB,IAAI9M,EAAoB8M,iBAMpF,EAIA3O,EAAAA,cAAA,MACIH,UAAU,yBACViO,KAAMA,EACN3M,GAAI,GAAGqC,EAA8BiE,WAAY5F,EAAoBS,wBAErEtC,EAAAA,cAAA,IAAA+H,OAAAC,OAAA,CACIpH,IAAOuF,EAA8B,OAAS,QAC9CmC,IAAK9C,KAAK4H,WACVtN,KAAM0F,KAAK0I,iBACXwB,SAAU,EACVvB,QAAS3I,KAAK0H,SACdrN,UAAWgO,EACXC,KAAMtD,EAAS,iBACCrE,GACZoH,GAEJvN,EAAAA,cAAA,QAAMH,UAAU,iCACXgC,EAAoBoM,+BAAiCpM,EAAoBS,0BAC3CW,IAA9BpB,EAAoB8M,OAAuB,KAAK9M,EAAoB8M,aAuCjG,UCrGA,MAAM0F,UAAsBrU,EAAAA,UACxBmF,YAAYC,GACRC,MAAMD,GAkBH,KAAA+kB,kBAAoB,KACvB3kB,KAAKJ,MAAM+kB,kBAAkB3kB,KAAKJ,MAAMglB,YA6BpC,KAAAviB,2BAA6B,CACjCnB,EACAC,EACAmhB,KAEA,MACM/e,EAAWrC,EAAc2a,KAAKgJ,MAAM7lB,OAAOkC,IAAgB,EAC3DuC,EAAWtC,EAAc0a,KAAKiJ,KAAK9lB,OAAOmC,IAAgB,EAC1D4jB,EAAkB,GAClBC,EAAkB,GACxB,IAAIC,EAA4B,GAC5BC,EAA4B,GAChC,GAAa,QAAT5C,EAAgB,CAChB,IAAK,IAAI6C,EAAI5hB,EAAU4hB,GAAK1hB,EAAU0hB,GARlB,EAShBJ,EAAMlnB,KAAKsnB,EAAElZ,YAWjB,OATAgZ,EAAYF,EAAM9pB,KAAI,CAAC4H,EAAO1H,KAC1B,IAAIiqB,EAMJ,OAJIA,EADU,IAAVjqB,EACM,CAAEipB,WAAYvhB,EAAOuD,UAAU,EAAMif,UAAU,GAE/C,CAAEjB,WAAYvhB,EAAOuD,UAAU,EAAOif,UAAU,GAEnDD,KAEJH,EAEP,GAAI/jB,GAAeC,GAAeD,IAAgBC,EAC9C+jB,EAAUrnB,KAAK,CAAEumB,WAAYjjB,EAAY8K,WAAY7F,UAAU,EAAMif,UAAU,QAC5E,CACH,IAAK,IAAIF,EAAI5hB,EAzBG,EAyByB4hB,GAAK1hB,EAAU0hB,GAzBxC,EA0BZH,EAAMnnB,KAAKsnB,EAAElZ,YAEjB,IAAIqZ,GAAgB,EAUpB,GATAJ,EAAYF,EAAM/pB,KAAI,CAAC4H,EAAO1H,KAC1B,IAAIiqB,EACJA,EAAM,CAAEhB,WAAYvhB,EAAOuD,UAAU,EAAOif,UAAU,GACtD,MAAME,EAAMvmB,OAAO6D,GAInB,OAHIY,EAAW8hB,EAjCH,IAkCRD,GAAO,GAEJF,KAEPE,GAAQJ,EAAUzY,OAAQ,CAC1B,MAAM+Y,EAAYxmB,OAAOkmB,EAAUA,EAAUzY,OAAS,GAAG2X,YACzDc,EAAUrnB,KAAK,CAAEumB,YAAaoB,EAxClB,GAwC+CvZ,WAAY7F,UAAU,EAAMif,UAAU,KAIzG,OAAOH,GAIP,KAAA5V,kBAAqBJ,IACzB,OAAQA,EAAwBtS,eAC5B,KAAKX,EAAAA,GAAiCY,MACtC,KAAKZ,EAAAA,GAAiCqR,WAClC,OAAOtN,KAAKuP,aAAaL,GAC7B,QACI,OAAOlP,KAAKwP,yBAAyBN,KAIzC,KAAAM,yBAA4BN,IAChC,MAAM,WAAErN,EAAU,sBAAEL,EAAqB,sBAAEiO,EAAqB,QAAE9U,GAAYqF,KAAKJ,MAE7E0I,EADiB4G,EAAwBjR,mBAAqB/B,EAAAA,GAAwBgC,OAC9D,CAAEoK,KAAM,mBAAiB7K,EAEjDiS,GADoBR,EAAwB/Q,QAAU,IACxBlD,KAAI,CAACmD,EAA4BjD,KACjE,IAAKiD,EAID,OAHAoD,EAAsB3C,UAAU+C,MAC5B,6DAA6DsN,EAAwB7L,aAAa6L,EAAwBjN,YAEvH,KAGX,MAAMtB,GAA8BvE,EAAAA,EAAAA,IAAgCgC,EAAOqR,GAE3E,OACIjV,EAAAA,cAACiN,EAAU,CACPzJ,8BAA+BkR,EAC/B7S,oBAAqB+B,EACrBuC,4BAA6BA,EAC7Ba,sBAAuBA,EACvBgE,SAAUxF,KAAK8O,cACf9D,WAAYhL,KAAKJ,MAAMoL,WACvBnJ,WAAYA,EACZzG,IAAKD,EACLR,QAASA,EACTI,SAAUiF,KAAKJ,MAAM7E,SACrBmO,eAAgBlJ,KAAKJ,MAAMsJ,oBAIvC,OACI1O,EAAAA,cAAA,KAAA+H,OAAAC,OAAA,CAAInI,UAAU,2BAA8BiO,EAAI,cAAc4G,EAAwBjN,UACjFyN,IAKL,KAAAH,aAAgBL,IACpB,MAAM,WACFrN,EAAU,sBACVL,EAAqB,sBACrBiO,EAAqB,QACrB9U,EAAO,6BACP4J,EAA4B,6BAC5BG,GACA1E,KAAKJ,MAIH8P,GADoBR,EAAwB/Q,QAAU,IACxBlD,KAAI,CAACmD,EAA4BjD,KACjE,IAAKiD,EAID,OAHAoD,EAAsB3C,UAAU+C,MAC5B,4CAA4CsN,EAAwB7L,aAAa6L,EAAwBjN,YAEtG,KAGX,MAAMtB,GAA8BvE,EAAAA,EAAAA,IAAgCgC,EAAOqR,GAGrEhO,GACFyN,EAAwBtS,gBAAkBX,EAAAA,GAAiCqR,YAC3EtN,KAAKJ,MAAM+P,kBACL,SAEJvU,EAAMuF,EACN,GAAGA,EAA4B7D,wBAAwB6D,EAA4BhD,wBACnF,gBAAgBxC,IACtB,OACIX,EAAAA,cAAA,MAAIH,UAAW,sEAAoCe,IAAKD,GACpDX,EAAAA,cAACkF,EAAe,CACZ1B,8BAA+BkR,EAC/B7S,oBAAqB+B,EACrBuC,4BAA6BA,EAC7B2jB,6BAA8BtkB,KAAKc,MAAM2kB,gBACzCf,6BAA8B1kB,KAAKc,MAAM4kB,gBACzClkB,sBAAuBA,EACvBgE,SAAUxF,KAAK8O,cACf9D,WAAYhL,KAAKJ,MAAMoL,WACvBnJ,WAAYA,EACZJ,UAAWA,EACXrG,IAAKA,EACLT,QAASA,EACT4J,6BAA8BA,EAC9BG,6BAA8BA,EAC9B3J,SAAUiF,KAAKJ,MAAM7E,SACrBmO,eAAgBlJ,KAAKJ,MAAMsJ,qBAK3C,OAAO1O,EAAAA,cAAA,MAAIH,UAAU,yCAAyCqV,IAG1D,KAAAZ,cAAiB9R,IACrBgD,KAAKJ,MAAMgQ,iBAAiB5S,IAGxB,KAAA+R,iBAAmB,KACvB/O,KAAKmF,UAAS0K,IAAa,CACvBV,UAAWU,EAAUV,cAnNzBnP,KAAK8O,cAAgB9O,KAAK8O,cAAc5O,KAAKF,MAC7CA,KAAK+O,iBAAmB/O,KAAK+O,iBAAiB7O,KAAKF,MACnD,IAAIgP,EAAahP,KAAKJ,MAAMqP,wBACxBjP,KAAKJ,MAAMsP,wBAAwBtS,gBAAkBX,EAAAA,GAAiCY,QACtFmS,GAAa,GAEjB,MAAM2W,EAAkB/lB,EAAMsP,wBAAwB/Q,OAAO,GAAGrB,qBAC1D8oB,EAAmBhmB,EAAMsP,wBAAwB/Q,OAAO,GAAGR,sBAEjEqC,KAAKc,MAAQ,CACTqO,SAAUH,EACVyW,gBAAiBzlB,KAAKqC,2BAA2BsjB,EAAiBC,EAAkB,OACpFF,gBAAiB1lB,KAAKqC,2BAA2BsjB,EAAiBC,EAAkB,OACpFzG,YAAUvf,EAAMjF,QAAQgQ,UAAW/K,EAAMjF,QAAQgQ,QAAQ8P,QAAgD,WAAtC7a,EAAMjF,QAAQgQ,QAAQ8P,OAAOC,OAQjGnZ,SACH,MAAM,wBAAE2N,EAAuB,sBAAE1N,GAA0BxB,KAAKJ,MAMhE,OAJKsP,GACD1N,EAAsB3C,UAAU+C,MAAM,wDAItCpH,EAAAA,cAAA,OAAKH,UAAW,GAAG2F,KAAKJ,MAAMvF,0CAC1BG,EAAAA,cAACmU,EAAAA,OAAM,CACHtU,UAAW2F,KAAKJ,MAAMsO,OAAS,qCAAuC,sCAAqC,aAC/FgB,EAAwBjN,SAAW,eAC/C0G,QAAS3I,KAAK2kB,kBAAiB,gBAChB3kB,KAAKJ,MAAMsO,QAEzBgB,EAAwBjN,SAE7BzH,EAAAA,cAAC4U,EAAAA,SAAQ,CAAClB,OAAQlO,KAAKJ,MAAMsO,OAAQmB,QAAS,IAC1C7U,EAAAA,cAAA,OAAKH,UAAU,iBAAiBiO,KAAK,SAASK,QAAS3I,KAAK2kB,oBAC3D3kB,KAAKsP,kBAAkBJ,IACtBlP,KAAKc,MAAMqe,UAAY3kB,EAAAA,cAACmU,EAAAA,OAAM,CAAChG,QAAS3I,KAAK2kB,mBAAiB,WA+KpF,0GC5QkB1oB,EA0BAC,EAeAC,OA4BZ,SAAUC,EACZC,EACAC,GAGA,OAAOA,EAAmBC,MAAMC,GAC5BC,EAA8BJ,EAAqBG,KASrD,SAAUC,EAA8BJ,EAA0CG,GAEpF,OACIA,EAAoBE,kBAAoBL,EAAoBK,iBAC5DF,EAAoBG,qBAAuBN,EAAoBM,oBAC/DH,EAAoBI,gBAAkBP,EAAoBO,gBACzDJ,EAAoBI,gBAAkBX,EAAiCY,OACpEL,EAAoBM,uBAAyBT,EAAoBS,sBAmEvE,SAAU2B,EACZC,EACAC,EACAC,EACAC,GAEA,IAAKH,IAAWC,EAEZ,OADAE,EAAUC,MAAM,kEAAkEJ,KAAUC,KACrFD,GAAU,GAErB,MAAMK,EAAeL,GAAUM,OAAON,IAAY,EAClD,IAAIO,EAEJ,IACIA,EAAS,IAAIC,KAAKC,aAAaP,EAAQ,CACnCQ,MAAO,WACPC,gBAAiB,SACjBV,SAAUA,EACVW,sBAAuB,IACxBC,OAAOR,GACZ,MAAOS,GAELP,EAAS,GAAGF,IACZF,EAAUY,QAAQ,kEAAkER,MAAWO,KAGnG,OAAOP,GAxLX,SAAkBhD,GAIdA,EAAAA,EAAA,iBAMAA,EAAAA,EAAA,2BAKAA,EAAAA,EAAA,eAKAA,EAAAA,EAAA,qBApBJ,CAAkBA,IAAAA,EAAgC,KA0BlD,SAAkBC,GAIdA,EAAAA,EAAA,mBAKAA,EAAAA,EAAA,iBATJ,CAAkBA,IAAAA,EAAuB,KAezC,SAAkBC,GAIdA,EAAAA,EAAA,eAIAA,EAAAA,EAAA,yBAIAA,EAAAA,EAAA,uBAIAA,EAAAA,EAAA,iBAIAA,EAAAA,EAAA,mBApBJ,CAAkBA,IAAAA,EAAoB,iKCnBhC,MAAO0pB,UAAkCrrB,EAAAA,cAK3CmF,YAAYC,GACRC,MAAMD,GAuGH,KAAAkmB,kBAAoB,KACvB9lB,KAAK+lB,8BAGF,KAAAC,mBAAqB,KACxBhmB,KAAK+lB,8BAGF,KAAAA,2BAA6B,KAChC,MAAME,EAAO9e,SAASC,eAAe,0BACrC,GAAI6e,GAAQA,EAAKC,QACb,IAAK,IAAIf,EAAI,EAAGA,EAAIc,EAAKC,QAAQzZ,OAAQ0Y,IACjCc,EAAKC,QAAQf,GAAGtiB,MAAM4a,SAAS,YAC/BwI,EAAKC,QAAQf,GAAG/lB,MAAM+mB,QAAU,QAEhCF,EAAKC,QAAQf,GAAGtiB,MAAM4a,SAAS,wBAC/BwI,EAAKC,QAAQf,GAAG/lB,MAAM+mB,QAAU,QAEhCF,EAAKC,QAAQf,GAAGtiB,MAAM4a,SAAS,wBAC/BwI,EAAKC,QAAQf,GAAG/lB,MAAM+mB,QAAU,SAMzC,KAAApG,wBAA0B,CAC7BC,EACAxB,EACA7J,EACAyR,IAEO5rB,EAAAA,aACHwlB,EAAWjO,MACX,GACAiO,EAAWhO,YACXhS,KAAKigB,gBAAgBD,EAAYxB,EAAY7J,EAAgByR,GAC7DpG,EAAW/N,aAIX,KAAAgO,gBAAkB,CACtBrgB,EACA4e,EACA7J,EACAyR,IAEIzR,EACOna,EAAAA,aAAmBoF,EAAMsS,UAAW,GAAIlS,KAAKkgB,WAAWvL,GAAiB3U,KAAKmgB,cAAc3B,EAAY4H,IAE5G,KAGH,KAAA5F,iBAAoB5gB,IACxB,MAAM,MAAEqT,EAAK,eAAEO,GAAmB5T,EAClC,OAAIqT,EAEIzY,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKgR,GACNhZ,EAAAA,cAAA,UAAKyY,EAAMW,aAIhB,MAGH,KAAAyS,UAAY,IACT,IAAMrmB,KAAKmF,SAAS,CAAEsT,QAASzY,KAAKc,MAAM2X,SAG7C,KAAA0H,cAAgB,CAACvgB,EAA6Buf,KAClD,MAAM,SAAEpI,EAAQ,oBAAEI,EAAmB,wBAAEC,GAA4BxX,GAC7D,OAAE6Y,GAAWzY,KAAKc,MACxBqe,EAAWnf,KAAKJ,MAAMuf,SACtB,IAAI,cAAEH,GAAkBhf,KAAKJ,MAE7B,OADAof,EAAgBhf,KAAKsY,oBACjBvB,EAEIvc,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK4U,GACN5c,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK2U,IACJgI,GACEpI,EAAS9b,KAAI,CAAColB,EAASllB,IAAsB,OAAZklB,GAAoBllB,EAAQ,GAAK6E,KAAKsmB,cAAcjG,EAASllB,EAAOsd,MACvG0G,GAAYpI,EAAStK,OAAS,IAAMgM,GAClCje,EAAAA,cAAA,OAAK8N,KAAK,SAASjO,UAAU,YAAYsO,QAAS3I,KAAKqmB,WAClD,qBAIb7rB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK2U,GACLgI,EACG3kB,EAAAA,cAAA,OAAKH,UAAU,4BACXG,EAAAA,cAAA,OAAKH,UAAU,sCAAsC2F,KAAKJ,MAAM2e,eAAetL,MAAMW,YACrFpZ,EAAAA,cAAA,OAAKH,UAAU,oCAAoC2kB,IAEvD,MACFG,GACEpI,EAAS9b,KACL,CAAColB,EAASllB,IAAsB,OAAZklB,GAAoBllB,EAAQ,GAAKsd,GAAUzY,KAAKsmB,cAAcjG,EAASllB,EAAOsd,MAExG0G,GAAYpI,EAAStK,OAAS,GAAKgM,GACjCje,EAAAA,cAAA,OAAK8N,KAAK,SAASjO,UAAU,YAAYsO,QAAS3I,KAAKqmB,WAClD,qBAGRlH,GAAYpI,EAAS9b,KAAI,CAAColB,EAASllB,IAAsB,OAAZklB,GAAoBrgB,KAAKsmB,cAAcjG,EAASllB,EAAOsd,OAK9G,MAGH,KAAAyH,WAActgB,IAClB,MAAM,iBAAE8U,EAAgB,eAAEC,GAAmB/U,EAC7C,OAAI+U,EACOna,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKkS,GAAmBC,GAEjC,MAIH,KAAA2R,cAAgB,CAACjG,EAASllB,EAAesd,KAC7C,MAAM8N,EAAUlG,GAAWA,EAAQzgB,MAInC,MAH8D,UAA1D2mB,EAAQrX,wBAAwBjN,QAAQ2a,gBACxC2J,EAAQrX,wBAAwBjN,QAAU,UAEmB,WAA1DskB,EAAQrX,wBAAwBjN,QAAQ2a,eACe,aAA1D2J,EAAQrX,wBAAwBjN,QAAQ2a,cACxCpiB,EAAAA,cAACqU,EAAAA,EAAa,CACVK,wBAAyBqX,EAAQrX,wBACjCO,sBAAuB8W,EAAQ9W,sBAC/BjO,sBAAuB+kB,EAAQ/kB,sBAC/B+C,6BAA8BgiB,EAAQhiB,6BACtCG,6BAA8B6hB,EAAQ7hB,6BACtCtJ,IAAKD,EACLyU,iBAAkB2W,EAAQ3W,iBAC1B5E,WAAYub,EAAQvb,WACpBiE,yBAAyB,EACzBU,kBAAmB4W,EAAQ5W,kBAC3BhV,QAAS4rB,EAAQ5rB,QACjBI,SAAUwrB,EAAQxrB,SAClBmO,eAAgBqd,EAAQrd,eACxB7O,UAAqB,IAAVc,GAAgBsd,EAAoB,GAAX,SACpC5W,YAAY,EACZ+iB,UAAWzpB,EACXwpB,kBAAmB3kB,KAAK2kB,kBACxBzW,OAAQlO,KAAKc,MAAM0lB,gBAAkBrrB,IAAuC,IAA9B6E,KAAKc,MAAM0lB,gBAE7D,MAGA,KAAA7B,kBAAqB6B,IAErBA,IADwBxmB,KAAKc,MAAM0lB,cAEnCxmB,KAAKmF,SAAS,CAAEqhB,eAAgB,IAEhCxmB,KAAKmF,SAAS,CAAEqhB,cAAAA,KAGhB,KAAAlG,wBAA2B1gB,IAC/B,MAAM,2BAAEmU,EAA0B,sBAAEE,EAAqB,2BAAEG,GAA+BxU,EAC1F,OAAIqU,EAEIzZ,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKuR,GACLE,EAAsBhZ,KAAI,CAAC4X,EAAU1X,IAClCX,EAAAA,cAACA,EAAAA,SAAc,CAACY,IAAKD,GAChB0X,EACAoB,GAAyBA,EAAsB9Y,EAAQ,IAAMiZ,MAO3E,MAGH,KAAAmM,YAAe3gB,IACnB,MAAM,MAAEqT,EAAK,eAAEO,GAAmB5T,EAClC,OAAIqT,EAEIzY,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKgR,GACNhZ,EAAAA,cAAA,UAAKyY,EAAMU,YAIhB,MAEH,KAAA2E,kBAAoB,KACxB,MAAM,UAAEzd,EAAS,KAAEgB,EAAI,UAAEgD,GAAcmB,KAAKJ,MACtC4Y,EAAoB3c,EAAKuV,cAAcnS,QAAUpD,EAAKuV,cAAcnS,OAAOiY,eAAkB,GAC7FuP,EAAe5qB,EAAKkb,SAAS9X,OACnC,OAAKwnB,EAKDjsB,EAAAA,cAACyQ,EAAAA,EAAa,CACVmB,WAAW,gCACXF,aAAcrR,EAAUqR,aACxBC,MAAOtR,EAAU6d,mBACjB3M,gBAAiByM,EACjB1L,iBAAkB2Z,EAClB7Z,aAAc/R,EAAU+R,aACxBC,uBAAwBhS,EAAUgS,uBAClChO,UAAWA,EACX6M,gBAAiB1L,KAAK2Y,iBACtB3N,WAAYhL,KAAK4Y,iCACjBvM,gBAAiBxR,EAAUwR,kBAfxB,MAmBP,KAAAsM,iBAAoBE,IACxB,MAAM,KAAEhd,EAAI,UAAEgD,GAAcmB,KAAKJ,MACjC,IAAK/D,EAAKuV,cAAcnS,OAEpB,YADAJ,EAAUY,QAAQ,sGAItB,IAAIxC,EAA6BpB,EAAKuV,cAAcnS,QAAUpD,EAAKuV,cAAcnS,OAAOiY,eAAkB,GAE1G,GAAK2B,EAAaxN,SASX,CACHpO,EAA4B,GAG5B,MAAMmd,EAAoBpa,KAAKuV,2BAA2BrP,SAAWlG,KAAKuV,2BAA2BrP,QAAQtG,MAAMoV,WAC7GqF,EAAkBD,GAAqBjT,SAASC,eAAegT,GACrEnU,YAAW,KACPoU,GAAmBA,EAAgBlU,UACpC,QAjBqB,CACxB,MAAMmU,EAAiBzB,EAAajN,cACpC,IAAK0O,EAED,YADAzb,EAAUY,QAAQ,gFAGtBxC,EAA4BA,EAA0B+Z,QACjD3Z,KAA4CZ,EAAAA,EAAAA,+BAA8B6d,EAAgBjd,KAanGxB,EAAKuV,cAAcnS,OAAO6W,kBAAoB,EAC9Cja,EAAKuV,cAAcnS,OAAOiY,cAAgBja,GAEtC,KAAA2b,iCAAmC,CAACpN,EAAsC+O,KAC9E,MAAM,KAAE1e,EAAI,UAAEgD,GAAcmB,KAAKJ,MAC3B8V,EAAU1V,KAAKJ,MAAMjF,QAAQgQ,QAAQ4L,IAAImQ,WAE/C,IAAK7qB,EAAKuV,cAAcnS,OAEpB,OADAJ,EAAUY,QAAQ,yGACXiW,EAAQpb,KAGnB,IAAI2C,EAA6BpB,EAAKuV,cAAcnS,QAAUpD,EAAKuV,cAAcnS,OAAOiY,eAAkB,GAE1G,GAAKqD,EASDtd,EAA4B,OATf,CACb,IAAKuO,EAED,OADA3M,EAAUY,QAAQ,wFACXiW,EAAQpb,KAEnB2C,EAA4BA,EAA0B+Z,QACjD3Z,KAA4CZ,EAAAA,EAAAA,+BAA8B+O,EAAiBnO,KAMpG,OAAO2C,KAAKJ,MAAMjF,QAAQgQ,QAAQ4L,IAAImQ,WAAWpsB,MA/WjD0F,KAAKc,MAAQ,CACT2X,QAAQ,EACR+N,eAAgB,GAEpBxmB,KAAKuV,2BAA6B/a,EAAAA,YAE/B+G,SACH,MAAM,MAAE3B,GAAUI,KACZomB,KACFxmB,EAAMjF,QAAQgQ,UAAW/K,EAAMjF,QAAQgQ,QAAQ8P,QAAgD,WAAtC7a,EAAMjF,QAAQgQ,QAAQ8P,OAAOC,OACpF,sBACF3K,EAAqB,SACrBrV,EAAQ,WACRikB,EAAU,kBACVC,EAAiB,wBACjBC,EAAuB,SACvBM,EAAQ,YACRF,EAAW,kBACXC,EAAiB,eACjBX,EAAc,WACdC,EAAU,kBACV1K,EAAiB,cACjB4K,EAAa,qBACbI,EAAoB,iCACpBC,EAAgC,aAChCK,GACApf,KAAKJ,MACT,IAAI,cAAEof,GAAkBhf,KAAKJ,MAE7B,OADAof,EAAgBhf,KAAKsY,oBACjB6G,EAEI3kB,EAAAA,cAACimB,EAAAA,OAAMle,OAAAC,OAAA,GAAKuN,GACP/P,KAAKsgB,wBAAwBxM,GAC7BlU,EAAMwe,OAASxe,EAAMwe,MAAMuI,SACxBnsB,EAAAA,cAAA,WACKoF,EAAMwe,MAAMuI,QAAQ1rB,KAAI,CAAC6M,EAA2B3M,IAE7CX,EAAAA,cAAA,OAAKH,UAAU,SAASe,IAAKD,GACxB2M,MAMpB9H,KAAKugB,YAAYhC,GACjBU,EACAV,EAAetL,MAAMW,WACrB5T,KAAK+f,wBAAwBb,EAAmBV,EAAYE,EAAe0H,GAE5E5rB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKqc,GACNrkB,EAAAA,cAAA,OAAKH,UAAU,yBACXG,EAAAA,cAAA,OAAKH,UAAU,sCACXG,EAAAA,cAAA,OAAKH,UAAU,kBACXG,EAAAA,cAAA,KAAGH,UAAU,gBACZskB,GAELnkB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKsc,GAAuBP,GAAkBve,KAAKwgB,iBAAiBjC,KAE7E/jB,EAAAA,cAAA,OAAKH,UAAU,8BAA8BqkB,GAAiB1e,KAAKkgB,WAAWxB,KAElFlkB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKoc,GACLQ,EACA1kB,GAELF,EAAAA,cAAA,OAAKH,UAAU,yBAAyBskB,KAMpDnkB,EAAAA,cAACimB,EAAAA,OAAMle,OAAAC,OAAA,GAAKuN,GACRvV,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKsc,GAAuBhL,GAAqB9T,KAAKsgB,wBAAwBxM,IAClFlU,EAAMwe,OAASxe,EAAMwe,MAAMuI,SACxBnsB,EAAAA,cAAA,WACKoF,EAAMwe,MAAMuI,QAAQ1rB,KAAI,CAAC6M,EAA2B3M,IAE7CX,EAAAA,cAAA,OAAKH,UAAU,SAASe,IAAKD,GACxB2M,MAMrBtN,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKuc,GACLP,GAAcxe,KAAKmgB,cAAc3B,EAAY4H,GAC7CpH,EACDxkB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKqc,GACNrkB,EAAAA,cAAA,OAAKH,UAAU,iDACVkkB,GAAkBve,KAAKugB,YAAYhC,IAEvCA,EAAetL,MAAMW,WACtBpZ,EAAAA,cAAA,OAAKH,UAAU,6CAA6CqkB,GAAiB1e,KAAKkgB,WAAWxB,IAC7FlkB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKoc,GACLQ,EACA1kB,GAEJikB,MAmRzB,qJC5WM,MAAOiI,UAA8BpsB,EAAAA,cAIvCmF,YACIC,GAEAC,MAAMD,GA6CH,KAAAinB,yBAAsD1sB,IAAmC,IAAlC,oBAAE2sB,EAAmB,MAAE7T,GAAO9Y,EACxF,MACI0B,MACIkrB,gBAAgB,OAAE9nB,KAEtBe,KAAKJ,MACT,IAAIonB,EAAW/nB,GAAUA,EAAOgoB,YAAchoB,EAAOgoB,WAAWC,aAAejoB,EAAOgoB,WAAWC,YAAY,GAAGC,WAChHH,EAAWA,GAAYA,EAASpK,cAChC,MAAMwK,EACFJ,IACCA,EAASvJ,SAAS,QACb,iBACAuJ,EAASvJ,SAAS,UAClB,mBACAuJ,EAASvJ,SAAS,QAClB,oBACA,IACV,OACIjjB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKskB,GACNtsB,EAAAA,cAAA,UAAKyY,GACLzY,EAAAA,cAAA,OAAKH,UAAU,OACXG,EAAAA,cAAA,OAAKH,UAAU,kCACXG,EAAAA,cAAA,QAAMH,UAAW,aAAa+sB,UAM3C,KAAAC,wBAAgDC,IACnD,MAAM,6BAAEC,EAA4B,gBAAEC,GAAoBxnB,KAAKJ,MAAM6V,QAEjE9a,SAAS,iBAAE8sB,IACXznB,KAAKJ,OACH,WAAEqnB,EAAU,WAAES,GAAeJ,EAC7BK,EAAmBD,GAAcA,EAAW,IAAMA,EAAW,GAAG7rB,MAAQ6rB,EAAW,GAAG7rB,KAAK+rB,UAAUC,gBACrGC,EAAiBb,GAAcA,EAAWc,YAAcd,EAAWc,YAAYC,QAAQ,GAAK,GAC5FC,EAAgBN,GAAoBA,EAAiB3U,KAAO2U,EAAiB3U,KAAO,GACpFkV,EAAmBP,GAAoBA,EAAiBQ,YAAcR,EAAiBQ,YAAc,GAC3GnoB,KAAKmF,SAAS,CACVijB,WAAYX,EAAiBY,eAAeP,GAC5CQ,eAAgBL,EAAMM,OAAO,MAAMA,OAAOL,KAE9C,MAAMM,EAAkBvB,GAAcA,EAAWwB,mBAAqBxB,EAAWwB,mBAAqB,GACtG,OACIjuB,EAAAA,cAAA,OAAKH,UAAU,0BACXG,EAAAA,cAAA,KAAGH,UAAU,OACRG,EAAAA,cAAA,QAAMH,UAAU,0CAA0CktB,GAC3D/sB,EAAAA,cAAA,QAAMH,UAAU,qCACX,IACDG,EAAAA,cAAA,cAASguB,KAGjBhuB,EAAAA,cAAA,KAAGH,UAAU,OACRG,EAAAA,cAAA,QAAMH,UAAU,0CAA0CmtB,GAC3DhtB,EAAAA,cAAA,QAAMH,UAAU,qCACX,IACDG,EAAAA,cAAA,cAASitB,EAAiBY,eAAeP,QAMtD,KAAAY,mBAAqB,KACxB,MACIjT,QAAQ,oBAAEkT,GACVjR,KACIkR,QAAQ,KAAEC,KAEd7oB,KAAKJ,MACT,OACI+oB,GACAE,EAAKC,gBACDtuB,EAAAA,cAAA,OAAKH,UAAU,uCAAuCe,IAAI,kBACtDZ,EAAAA,cAAA,KAAGF,KAAMuuB,EAAKC,gBAAiBH,KAKxC,KAAAI,YAAc,KACjB,MAAM,iBAAEC,GAAqBhpB,KAAKJ,MAAM6V,OACxC,OACIuT,GACAA,EAAiBC,UACbzuB,EAAAA,cAAA,OAAKH,UAAU,+BAA+Be,IAAI,SAC9CZ,EAAAA,cAAA,KAAG4Q,OAAO,SAAS9Q,KAAM0uB,EAAiBE,QAAQJ,gBAC9CtuB,EAAAA,cAAA,SAAIwuB,EAAiBC,aAMjC,KAAAE,qBAAuB,KAC3B,MACI1T,QAAQ,oBAAE2T,IACVppB,KAAKJ,MACT,OACIpF,EAAAA,cAAA,OAAKH,UAAU,yCAAyCe,IAAI,WACxDZ,EAAAA,cAAA,UAAK4uB,GACL5uB,EAAAA,cAAA,YAAOwF,KAAKc,MAAMwnB,kBAItB,KAAAe,cAAgB,KACpB,MACI5T,QAAQ,aAAE6T,IACVtpB,KAAKJ,MACT,OAAOpF,EAAAA,cAAA,MAAIH,UAAU,kCAAkCivB,IAEnD,KAAAC,iCAAgEC,IAA8B,IAA7B,sBAAEC,GAAuBD,EAC9F,MACI/T,QAAQ,UAAEiU,IACV1pB,KAAKJ,MACH+pB,EAAiB3pB,KAAKJ,MAAM/D,KAAKkrB,eAAe9nB,QAAUe,KAAKJ,MAAM/D,KAAKkrB,eAAe9nB,OAAOgoB,WAAW2C,aACjH,OACIpvB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKinB,GACNjvB,EAAAA,cAAA,SACKkvB,EACDlvB,EAAAA,cAAA,cAASmvB,MAKjB,KAAAE,2BAAmDC,IAAA,IAAC,eAAEC,EAAc,UAAEnC,GAAWkC,EAAA,OACrFtvB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKunB,GAAiBnC,IAEvB,KAAAoC,uBAA2CC,IAAA,IAAC,WAAEC,EAAU,gBAAEC,EAAe,WAAEzC,GAAYuC,EAAA,OAC3FzvB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK0nB,GACLxC,GACGltB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK2nB,GACLzC,EAAWzsB,KAAI2sB,GACZptB,EAAAA,cAACwF,KAAK6pB,2BAA0BtnB,OAAAC,OAAA,CAACpH,IAAKwsB,EAAU/rB,KAAK+rB,UAAUzF,QAAYyF,SAMvF,KAAAwC,wBAA6CC,IAAA,IAAC,YAAEC,EAAW,OAAEC,GAAQF,EAAA,OACzE7vB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK8nB,GACLC,EAAOtvB,KAAI,CAACuvB,EAAOrvB,IAChBX,EAAAA,cAACwF,KAAKgqB,uBAAsBznB,OAAAC,OAAA,CAACpH,IAAKD,GAAWqvB,QAKjD,KAAAC,eAA2B,KAC/B,MACIhV,QAAQ,gBAAEiV,EAAe,mBAAEC,EAAkB,WAAEC,EAAU,oBAAEC,GAC3DlwB,SAAS,iBAAE8sB,IACXznB,KAAKJ,MACHkrB,EAAmB9qB,KAAKJ,MAAM/D,KAAKkrB,eAAe9nB,QAAUe,KAAKJ,MAAM/D,KAAKkrB,eAAe9nB,OAAOgoB,WAAW8D,eAC7GC,EAAkBhrB,KAAKJ,MAAM/D,KAAKkrB,eAAe9nB,QAAUe,KAAKJ,MAAM/D,KAAKkrB,eAAe9nB,OAAOgoB,WAAWgE,aAC5GC,EAAelrB,KAAKJ,MAAM/D,KAAKkrB,eAAe9nB,QAAUe,KAAKJ,MAAM/D,KAAKkrB,eAAe9nB,OAAOgoB,WAAWkE,YAC/G,OACI3wB,EAAAA,cAAA,OAAKH,UAAU,mCAAmCe,IAAI,qBACjDyvB,GAAuBrwB,EAAAA,cAAA,UAAKqwB,GAC7BrwB,EAAAA,cAAA,KAAGH,UAAU,sDACTG,EAAAA,cAAA,QAAMH,UAAU,8CAA8CqwB,GAC9DlwB,EAAAA,cAAA,QAAMH,UAAU,wDACXywB,GACGtwB,EAAAA,cAAA,QAAMH,UAAU,qBAAqBotB,EAAiBY,eAAeyC,EAAiB9C,QAAQ,OAI1GxtB,EAAAA,cAAA,KAAGH,UAAU,sDACTG,EAAAA,cAAA,QAAMH,UAAU,8CAA8CswB,GAC9DnwB,EAAAA,cAAA,QAAMH,UAAU,wDACX2wB,GACGxwB,EAAAA,cAAA,QAAMH,UAAU,qBAAqBotB,EAAiBY,eAAe2C,EAAgBhD,QAAQ,OAIzGxtB,EAAAA,cAAA,KAAGH,UAAU,mDACTG,EAAAA,cAAA,QAAMH,UAAU,8CAA8CuwB,GAC9DpwB,EAAAA,cAAA,QAAMH,UAAU,wDACX6wB,GACG1wB,EAAAA,cAAA,QAAMH,UAAU,qBAAqBotB,EAAiBY,eAAe6C,EAAalD,QAAQ,SAO1G,KAAAoD,sBAAyCC,IAAA,IAAC,UAAEC,EAAS,cAAEC,EAAa,oBAAEC,EAAmB,cAAEC,GAAeJ,EAAA,OAC9G7wB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK8oB,GACLC,EACAC,EACAC,IAtOLzrB,KAAKc,MAAQ,CACTsnB,WAAY,GACZE,eAAgB,IAGjB/mB,SACH,MAAM,YACFkd,EAAW,gBACXiN,EAAe,WACfzE,EAAU,aACV0E,EAAY,QACZC,EAAO,WACPlE,EAAU,KACVmE,EAAI,OACJtB,EACA9U,QAAQ,kBAAEqW,IACV9rB,KAAKJ,MACHmsB,GAAmBlL,EAAAA,EAAAA,GAAa7gB,KAAKJ,OAC3C,IAAI,UAAE4jB,GAAcxjB,KAAKJ,MAEzB4jB,EAAYuI,EACZ,MAAMzE,EAAwB,CAC1BqE,aAAAA,EACA1E,WAAAA,EACAS,WAAAA,GAEJ,OACIltB,EAAAA,cAACimB,EAAAA,OAAMle,OAAAC,OAAA,GAAKic,GACPze,KAAKqpB,gBACLqC,GAAmBlxB,EAAAA,cAACwF,KAAKupB,iCAAgChnB,OAAAC,OAAA,GAAKkpB,IAC9DpE,GAAa9sB,EAAAA,cAACwF,KAAKqnB,wBAAuB9kB,OAAAC,OAAA,GAAK8kB,IAChD9sB,EAAAA,cAAA,OAAKH,UAAU,wCAAwCyxB,GACtDvB,GAAU/vB,EAAAA,cAACwF,KAAKoqB,wBAAuB7nB,OAAAC,OAAA,GAAK+nB,IAC5CoB,GAAgBnxB,EAAAA,cAACwF,KAAKyqB,eAAc,MACpCmB,GAAWpxB,EAAAA,cAACwF,KAAK6mB,yBAAwBtkB,OAAAC,OAAA,GAAKopB,IAC/CpxB,EAAAA,cAAA,aACCwF,KAAKmpB,uBACLnpB,KAAK+oB,cACNvuB,EAAAA,cAAA,aACCqxB,GAAQrxB,EAAAA,cAACwF,KAAKorB,sBAAqB7oB,OAAAC,OAAA,GAAKqpB,IACxC7rB,KAAK0oB,uBAmMtB,sKCjQM,MAAO7C,UAAkCrrB,EAAAA,cAK3CmF,YAAYC,GACRC,MAAMD,GAuGH,KAAAkmB,kBAAoB,KACvB9lB,KAAK+lB,8BAGF,KAAAC,mBAAqB,KACxBhmB,KAAK+lB,8BAGF,KAAAA,2BAA6B,KAChC,MAAME,EAAO9e,SAASC,eAAe,0BACrC,GAAI6e,GAAQA,EAAKC,QACb,IAAK,IAAIf,EAAI,EAAGA,EAAIc,EAAKC,QAAQzZ,OAAQ0Y,IACjCc,EAAKC,QAAQf,GAAGtiB,MAAM4a,SAAS,YAC/BwI,EAAKC,QAAQf,GAAG/lB,MAAM+mB,QAAU,QAEhCF,EAAKC,QAAQf,GAAGtiB,MAAM4a,SAAS,wBAC/BwI,EAAKC,QAAQf,GAAG/lB,MAAM+mB,QAAU,QAEhCF,EAAKC,QAAQf,GAAGtiB,MAAM4a,SAAS,wBAC/BwI,EAAKC,QAAQf,GAAG/lB,MAAM+mB,QAAU,SAMzC,KAAApG,wBAA0B,CAC7BC,EACAxB,EACA7J,EACAyR,IAEO5rB,EAAAA,aACHwlB,EAAWjO,MACX,GACAiO,EAAWhO,YACXhS,KAAKigB,gBAAgBD,EAAYxB,EAAY7J,EAAgByR,GAC7DpG,EAAW/N,aAIX,KAAAgO,gBAAkB,CACtBrgB,EACA4e,EACA7J,EACAyR,IAEIzR,EACOna,EAAAA,aAAmBoF,EAAMsS,UAAW,GAAIlS,KAAKkgB,WAAWvL,GAAiB3U,KAAKmgB,cAAc3B,EAAY4H,IAE5G,KAGH,KAAA5F,iBAAoB5gB,IACxB,MAAM,MAAEqT,EAAK,eAAEO,GAAmB5T,EAClC,OAAIqT,EAEIzY,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKgR,GACNhZ,EAAAA,cAAA,UAAKyY,EAAMW,aAIhB,MAGH,KAAAyS,UAAY,IACT,IAAMrmB,KAAKmF,SAAS,CAAEsT,QAASzY,KAAKc,MAAM2X,SAG7C,KAAA0H,cAAgB,CAACvgB,EAA6Buf,KAClD,MAAM,SAAEpI,EAAQ,oBAAEI,EAAmB,wBAAEC,GAA4BxX,GAC7D,OAAE6Y,GAAWzY,KAAKc,MACxBqe,EAAWnf,KAAKJ,MAAMuf,SACtB,IAAI,cAAEH,GAAkBhf,KAAKJ,MAE7B,OADAof,EAAgBhf,KAAKsY,oBACjBvB,EAEIvc,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK4U,GACN5c,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK2U,IACJgI,GACEpI,EAAS9b,KAAI,CAAColB,EAASllB,IAAsB,OAAZklB,GAAoBllB,EAAQ,GAAK6E,KAAKsmB,cAAcjG,EAASllB,EAAOsd,MACvG0G,GAAYpI,EAAStK,OAAS,IAAMgM,GAClCje,EAAAA,cAAA,OAAK8N,KAAK,SAASjO,UAAU,YAAYsO,QAAS3I,KAAKqmB,WAClD,qBAIb7rB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK2U,GACLgI,EACG3kB,EAAAA,cAAA,OAAKH,UAAU,4BACXG,EAAAA,cAAA,OAAKH,UAAU,sCAAsC2F,KAAKJ,MAAM2e,eAAetL,MAAMW,YACrFpZ,EAAAA,cAAA,OAAKH,UAAU,oCAAoC2kB,IAEvD,MACFG,GACEpI,EAAS9b,KACL,CAAColB,EAASllB,IAAsB,OAAZklB,GAAoBllB,EAAQ,GAAKsd,GAAUzY,KAAKsmB,cAAcjG,EAASllB,EAAOsd,MAExG0G,GAAYpI,EAAStK,OAAS,GAAKgM,GACjCje,EAAAA,cAAA,OAAK8N,KAAK,SAASjO,UAAU,YAAYsO,QAAS3I,KAAKqmB,WAClD,qBAGRlH,GAAYpI,EAAS9b,KAAI,CAAColB,EAASllB,IAAsB,OAAZklB,GAAoBrgB,KAAKsmB,cAAcjG,EAASllB,EAAOsd,OAK9G,MAGH,KAAAyH,WAActgB,IAClB,MAAM,iBAAE8U,EAAgB,eAAEC,GAAmB/U,EAC7C,OAAI+U,EACOna,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKkS,GAAmBC,GAEjC,MAIH,KAAA2R,cAAgB,CAACjG,EAASllB,EAAesd,KAC7C,MAAM8N,EAAUlG,GAAWA,EAAQzgB,MAInC,MAH8D,UAA1D2mB,EAAQrX,wBAAwBjN,QAAQ2a,gBACxC2J,EAAQrX,wBAAwBjN,QAAU,UAEmB,WAA1DskB,EAAQrX,wBAAwBjN,QAAQ2a,eACe,aAA1D2J,EAAQrX,wBAAwBjN,QAAQ2a,cACxCpiB,EAAAA,cAACqU,EAAAA,EAAa,CACVK,wBAAyBqX,EAAQrX,wBACjCO,sBAAuB8W,EAAQ9W,sBAC/BjO,sBAAuB+kB,EAAQ/kB,sBAC/B+C,6BAA8BgiB,EAAQhiB,6BACtCG,6BAA8B6hB,EAAQ7hB,6BACtCtJ,IAAKD,EACLyU,iBAAkB2W,EAAQ3W,iBAC1B5E,WAAYub,EAAQvb,WACpBiE,yBAAyB,EACzBU,kBAAmB4W,EAAQ5W,kBAC3BhV,QAAS4rB,EAAQ5rB,QACjBI,SAAUwrB,EAAQxrB,SAClBmO,eAAgBqd,EAAQrd,eACxB7O,UAAqB,IAAVc,GAAgBsd,EAAoB,GAAX,SACpC5W,YAAY,EACZ+iB,UAAWzpB,EACXwpB,kBAAmB3kB,KAAK2kB,kBACxBzW,OAAQlO,KAAKc,MAAM0lB,gBAAkBrrB,IAAuC,IAA9B6E,KAAKc,MAAM0lB,gBAE7D,MAGA,KAAA7B,kBAAqB6B,IAErBA,IADwBxmB,KAAKc,MAAM0lB,cAEnCxmB,KAAKmF,SAAS,CAAEqhB,eAAgB,IAEhCxmB,KAAKmF,SAAS,CAAEqhB,cAAAA,KAGhB,KAAAlG,wBAA2B1gB,IAC/B,MAAM,2BAAEmU,EAA0B,sBAAEE,EAAqB,2BAAEG,GAA+BxU,EAC1F,OAAIqU,EAEIzZ,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKuR,GACLE,EAAsBhZ,KAAI,CAAC4X,EAAU1X,IAClCX,EAAAA,cAACA,EAAAA,SAAc,CAACY,IAAKD,GAChB0X,EACAoB,GAAyBA,EAAsB9Y,EAAQ,IAAMiZ,MAO3E,MAGH,KAAAmM,YAAe3gB,IACnB,MAAM,MAAEqT,EAAK,eAAEO,GAAmB5T,EAClC,OAAIqT,EAEIzY,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKgR,GACNhZ,EAAAA,cAAA,UAAKyY,EAAMU,YAIhB,MAEH,KAAA2E,kBAAoB,KACxB,MAAM,UAAEzd,EAAS,KAAEgB,EAAI,UAAEgD,GAAcmB,KAAKJ,MACtC4Y,EAAoB3c,EAAKuV,cAAcnS,QAAUpD,EAAKuV,cAAcnS,OAAOiY,eAAkB,GAC7FuP,EAAe5qB,EAAKkb,SAAS9X,OACnC,OAAKwnB,EAKDjsB,EAAAA,cAACyQ,EAAAA,EAAa,CACVmB,WAAW,gCACXF,aAAcrR,EAAUqR,aACxBC,MAAOtR,EAAU6d,mBACjB3M,gBAAiByM,EACjB1L,iBAAkB2Z,EAClB7Z,aAAc/R,EAAU+R,aACxBC,uBAAwBhS,EAAUgS,uBAClChO,UAAWA,EACX6M,gBAAiB1L,KAAK2Y,iBACtB3N,WAAYhL,KAAK4Y,iCACjBvM,gBAAiBxR,EAAUwR,kBAfxB,MAmBP,KAAAsM,iBAAoBE,IACxB,MAAM,KAAEhd,EAAI,UAAEgD,GAAcmB,KAAKJ,MACjC,IAAK/D,EAAKuV,cAAcnS,OAEpB,YADAJ,EAAUY,QAAQ,sGAItB,IAAIxC,EAA6BpB,EAAKuV,cAAcnS,QAAUpD,EAAKuV,cAAcnS,OAAOiY,eAAkB,GAE1G,GAAK2B,EAAaxN,SASX,CACHpO,EAA4B,GAG5B,MAAMmd,EAAoBpa,KAAKuV,2BAA2BrP,SAAWlG,KAAKuV,2BAA2BrP,QAAQtG,MAAMoV,WAC7GqF,EAAkBD,GAAqBjT,SAASC,eAAegT,GACrEnU,YAAW,KACPoU,GAAmBA,EAAgBlU,UACpC,QAjBqB,CACxB,MAAMmU,EAAiBzB,EAAajN,cACpC,IAAK0O,EAED,YADAzb,EAAUY,QAAQ,gFAGtBxC,EAA4BA,EAA0B+Z,QACjD3Z,KAA4CZ,EAAAA,EAAAA,+BAA8B6d,EAAgBjd,KAanGxB,EAAKuV,cAAcnS,OAAO6W,kBAAoB,EAC9Cja,EAAKuV,cAAcnS,OAAOiY,cAAgBja,GAEtC,KAAA2b,iCAAmC,CAACpN,EAAsC+O,KAC9E,MAAM,KAAE1e,EAAI,UAAEgD,GAAcmB,KAAKJ,MAC3B8V,EAAU1V,KAAKJ,MAAMjF,QAAQgQ,QAAQ4L,IAAImQ,WAE/C,IAAK7qB,EAAKuV,cAAcnS,OAEpB,OADAJ,EAAUY,QAAQ,yGACXiW,EAAQpb,KAGnB,IAAI2C,EAA6BpB,EAAKuV,cAAcnS,QAAUpD,EAAKuV,cAAcnS,OAAOiY,eAAkB,GAE1G,GAAKqD,EASDtd,EAA4B,OATf,CACb,IAAKuO,EAED,OADA3M,EAAUY,QAAQ,wFACXiW,EAAQpb,KAEnB2C,EAA4BA,EAA0B+Z,QACjD3Z,KAA4CZ,EAAAA,EAAAA,+BAA8B+O,EAAiBnO,KAMpG,OAAO2C,KAAKJ,MAAMjF,QAAQgQ,QAAQ4L,IAAImQ,WAAWpsB,MA/WjD0F,KAAKc,MAAQ,CACT2X,QAAQ,EACR+N,eAAgB,GAEpBxmB,KAAKuV,2BAA6B/a,EAAAA,YAE/B+G,SACH,MAAM,MAAE3B,GAAUI,KACZomB,KACFxmB,EAAMjF,QAAQgQ,UAAW/K,EAAMjF,QAAQgQ,QAAQ8P,QAAgD,WAAtC7a,EAAMjF,QAAQgQ,QAAQ8P,OAAOC,OACpF,sBACF3K,EAAqB,SACrBrV,EAAQ,WACRikB,EAAU,kBACVC,EAAiB,wBACjBC,EAAuB,SACvBM,EAAQ,YACRF,EAAW,kBACXC,EAAiB,eACjBX,EAAc,WACdC,EAAU,kBACV1K,EAAiB,cACjB4K,EAAa,qBACbI,EAAoB,iCACpBC,EAAgC,aAChCK,GACApf,KAAKJ,MACT,IAAI,cAAEof,GAAkBhf,KAAKJ,MAE7B,OADAof,EAAgBhf,KAAKsY,oBACjB6G,EAEI3kB,EAAAA,cAACimB,EAAAA,OAAMle,OAAAC,OAAA,GAAKuN,GACP/P,KAAKsgB,wBAAwBxM,GAC7BlU,EAAMwe,OAASxe,EAAMwe,MAAMuI,SACxBnsB,EAAAA,cAAA,WACKoF,EAAMwe,MAAMuI,QAAQ1rB,KAAI,CAAC6M,EAA2B3M,IAE7CX,EAAAA,cAAA,OAAKH,UAAU,SAASe,IAAKD,GACxB2M,MAMpB9H,KAAKugB,YAAYhC,GACjBU,EACAV,EAAetL,MAAMW,WACrB5T,KAAK+f,wBAAwBb,EAAmBV,EAAYE,EAAe0H,GAE5E5rB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKqc,GACNrkB,EAAAA,cAAA,OAAKH,UAAU,yBACXG,EAAAA,cAAA,OAAKH,UAAU,sCACXG,EAAAA,cAAA,OAAKH,UAAU,kBACXG,EAAAA,cAAA,KAAGH,UAAU,gBACZskB,GAELnkB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKsc,GAAuBP,GAAkBve,KAAKwgB,iBAAiBjC,KAE7E/jB,EAAAA,cAAA,OAAKH,UAAU,8BAA8BqkB,GAAiB1e,KAAKkgB,WAAWxB,KAElFlkB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKoc,GACLQ,EACA1kB,GAELF,EAAAA,cAAA,OAAKH,UAAU,yBAAyBskB,KAMpDnkB,EAAAA,cAACimB,EAAAA,OAAMle,OAAAC,OAAA,GAAKuN,GACRvV,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKsc,GAAuBhL,GAAqB9T,KAAKsgB,wBAAwBxM,IAClFlU,EAAMwe,OAASxe,EAAMwe,MAAMuI,SACxBnsB,EAAAA,cAAA,WACKoF,EAAMwe,MAAMuI,QAAQ1rB,KAAI,CAAC6M,EAA2B3M,IAE7CX,EAAAA,cAAA,OAAKH,UAAU,SAASe,IAAKD,GACxB2M,MAMrBtN,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKuc,GACLP,GAAcxe,KAAKmgB,cAAc3B,EAAY4H,GAC7CpH,EACDxkB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKqc,GACNrkB,EAAAA,cAAA,OAAKH,UAAU,iDACVkkB,GAAkBve,KAAKugB,YAAYhC,IAEvCA,EAAetL,MAAMW,WACtBpZ,EAAAA,cAAA,OAAKH,UAAU,6CAA6CqkB,GAAiB1e,KAAKkgB,WAAWxB,IAC7FlkB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKoc,GACLQ,EACA1kB,GAEJikB,MAmRzB,gvBCjWO,MAAMqN,UAAqBxxB,EAAAA,cAM9BmF,YAAmBC,GACfC,MAAMD,GALO,KAAAqsB,eAAyB,SACzB,KAAAC,oBAA8B,8BAC9B,KAAAC,YAAyC3xB,EAAAA,YAsDlD,KAAA4xB,yBAA2B,KAAK,IAAAC,EACZ,QAAxBA,EAAArsB,KAAKmsB,YAAYjmB,eAAO,IAAAmmB,GAAxBA,EAA0BC,oBA8DtB,KAAAC,gBAAmBnN,IACvBpf,KAAKmF,SAAS,CACVqnB,aAAc,CACVC,YAAarN,EACbsN,gBAAiB1sB,KAAKisB,eACtBU,aAAc3sB,KAAKksB,oBACnBhe,QAAQ,MAQH,KAAA0e,gBAAkB,KAC/B5sB,KAAKmF,UAASrE,IAAK,CACfkO,YAAalO,EAAMkO,gBAhIvBhP,KAAKc,MAAQ,CACTkO,YAAY,GAIbzN,SAAM,IAAAsrB,EACT,MAAMC,EAAuBlb,EAAAA,gBAAgBC,YAAY7R,KAAKJ,MAAMmtB,mBAC9DC,EAAsBpb,EAAAA,gBAAgBC,YAA6C,QAAlCgb,EAAC7sB,KAAKJ,MAAM/D,KAAKkxB,yBAAiB,IAAAF,OAAA,EAAjCA,EAAmC5tB,QAC3F,IAAK6tB,IAAyBE,EAC1B,OAAO,KAGX,MAAMC,EAASzvB,EAAAA,EAAA,GACRwC,KAAKJ,OAAK,IACbstB,UAAW,CACPzO,YAAaze,KAAKJ,MAClBvF,UAAWqP,GAAAA,CAAWsiB,EAAa3xB,UAAW2F,KAAKJ,MAAM6V,OAAOpb,YAEpEssB,QAAS3mB,KAAKmtB,uBAAuB,GAAGnB,EAAa3xB,wBAGzD,OAAO2F,KAAKJ,MAAMyf,WAAW4N,GAGzBE,uBAAuB9yB,GAC3B,OACIG,EAAAA,cAAA,OAAKH,UAAWA,GACX2F,KAAKotB,sBAAsB,GAAG/yB,sBAC9B2F,KAAKqtB,gBAAgB,GAAGhzB,gBAK7B+yB,sBAAsB/yB,GAC1B,OACIG,EAAAA,cAACmU,EAAAA,OAAM,CACHtU,UAAWA,EACXsO,QAAS3I,KAAK4sB,gBAAe,gBACd5sB,KAAKc,MAAMkO,WAC1BiE,MAAOjT,KAAKJ,MAAM/E,UAAUyyB,yBAE3BttB,KAAKJ,MAAM/E,UAAUyyB,yBAY1BD,gBAAgBhzB,GACpB,OACIG,EAAAA,cAAC4U,EAAAA,SAAQ,CAAC/U,UAAWA,EAAW6T,OAAQlO,KAAKc,MAAMkO,WAAYlM,IAAK9C,KAAKmsB,aACpEnsB,KAAKutB,mBAAmB,GAAGlzB,oBAKhCkzB,mBAAmBlzB,GACvB,MAAMmzB,EAAsG,QAArFrO,EAAAA,EAAAA,UAAS,CAAEsO,QAASC,EAAAA,YAAYC,SAAUhzB,QAASqF,KAAKJ,MAAMjF,QAAQgQ,UAEvFijB,EAAkB5tB,KAAKc,MAAM0rB,aAC/BhyB,EAAAA,cAACqzB,EAAAA,MAAK,CAAC7J,MAAOhkB,KAAKc,MAAM0rB,aAAaE,gBAAiBxe,OAAQlO,KAAKc,MAAM0rB,aAAate,QACnF1T,EAAAA,cAAA,QAAMH,UAAW2F,KAAKc,MAAM0rB,aAAaG,eACzCnyB,EAAAA,cAAA,YAAOwF,KAAKc,MAAM0rB,aAAaC,mBAGnChvB,EAGJ,OACIjD,EAAAA,cAAA,OAAKH,UAAWA,IACVmzB,GACEhzB,EAAAA,cAAA,OAAKH,UAAW,GAAGA,kBACfG,EAAAA,cAACszB,EAAAA,GAAiB,CAAC1zB,KAAM4F,KAAKJ,MAAM/E,UAAUkzB,+BAGrDH,EACA5tB,KAAKguB,cAAc,GAAG3zB,wBAK3B2zB,cAAc3zB,GAAiB,IAAA4zB,EAAAC,EAAAC,EACnC,MAAMrB,EAAuBlb,EAAAA,gBAAgBC,YAAY7R,KAAKJ,MAAMmtB,oBAE9D,aAAEqB,GAAiBpuB,KAAKJ,MAAM/D,KAC9BwyB,GACFD,MAAAA,GAAoB,QAARH,EAAZG,EAAcnvB,cAAM,IAAAgvB,GAA4E,QAA5EA,EAApBA,EAAsB1xB,MAAMmQ,GAHO,2DAGgBA,EAAKsG,cAAwC,IAAAib,OAAA,EAAhGA,EAAkGK,aAAa,EAC7Gzd,GAAYC,EAAAA,EAAAA,IAAa9Q,KAAKJ,MAAMjF,QAAQgQ,SAElD,OADA4jB,EAAAA,EAAAA,mBAAkB1d,GAEdrW,EAAAA,cAACg0B,EAAAA,wBAAuB,CACpBn0B,UAAWA,EACXM,QAASqF,KAAKJ,MAAMjF,QACpBkB,KAAM,CACF4yB,WAAY3B,EAAuB9sB,KAAKJ,MAAMmtB,kBAAqB/sB,KAAKJ,MAAM/D,KAAKkxB,kBAAmB9tB,OACtGyvB,eAA8C,QAAhCR,EAAEluB,KAAKJ,MAAM/D,KAAK6yB,sBAAc,IAAAR,OAAA,EAA9BA,EAAgCjvB,OAChD0vB,oBAAwD,QAArCR,EAAEnuB,KAAKJ,MAAM/D,KAAK8yB,2BAAmB,IAAAR,OAAA,EAAnCA,EAAqClvB,QAE9DpE,UAAWmF,KAAKJ,MAAM/E,UACtB+zB,kBAAmB5uB,KAAKosB,yBACxByC,eAAgB7uB,KAAKusB,gBACrBuC,oCAAqCT,EACrCxd,UAAWA,KAnHAmb,EAAA3xB,UAAY,mBA6IvC,2TC3IA,MAAM00B,EAAuBnzB,GACe,cAAjCA,EAAS2N,oBAAsC,eAAiB,YAGpE,SAASylB,EACZpvB,EACAqvB,GAAgC,IAAAC,EAAAC,EAEhC,MAAM,SAAEvzB,GAAagE,EAIfwvB,EAAsE,QAA9CF,EAAsC,QAAtCC,EAAGvvB,EAAM/D,KAAKuzB,gCAAwB,IAAAD,OAAA,EAAnCA,EAAqClwB,cAAM,IAAAiwB,EAAAA,EAAID,MAAAA,OAAc,EAAdA,EAAgBG,yBAE1F/0B,EAAY00B,EAAoBnzB,GACtC,IAAKwzB,IAA6Bxd,EAAAA,gBAAgBC,YAAYud,GAC1D,OAEJ,MAAMC,EAAoBD,EAAyB7yB,MAAK+yB,GAAYA,EAASC,eAAiB7M,EAAAA,aAAa4M,WAE3G,GAAID,EAAmB,CACnB,IAAIG,EAMJ,OAJIA,EADAH,EAAkBI,eACG,GAAGp1B,sBAA8BA,qBAA6Bg1B,EAAkBI,eAAe7S,gBAE/F,GAAGviB,qBAGxBG,EAAAA,cAAA,OAAKH,UAAW,GAAGA,qBACfG,EAAAA,cAAA,QAAMH,UAAWm1B,GAAqBH,EAAkBK,mBAQjE,SAASC,EACZ/vB,EACAqvB,GAAgC,IAAA90B,EAAAy1B,EAAAC,EAAAC,EAEhC,MACIra,QAAQ,gBAAEsa,EAAkB,MAAM,SAClCn0B,GACAgE,EACEvF,EAAY00B,EAAoBnzB,GAIhCV,EAA+D,QAAxDf,EAA6B,QAA7By1B,EAAqB,QAArBC,EAAGjwB,EAAM/D,KAAKX,eAAO,IAAA20B,OAAA,EAAlBA,EAAoB5wB,cAAM,IAAA2wB,EAAAA,EAAIX,MAAAA,OAAc,EAAdA,EAAgB/zB,eAAO,IAAAf,EAAAA,OAAIsD,EAEzE,OAAOvC,GAAWV,EAAAA,cAACspB,EAAAA,QAAO,CAACzpB,UAAW,GAAGA,mBAA4B21B,WAAYD,EAAiB31B,KAAkB,QAAd01B,EAAE50B,EAAQ8X,YAAI,IAAA8c,EAAAA,EAAI,KAGrH,SAASG,EACZrwB,EACAqvB,GAAgC,IAAAzF,EAAA0G,EAAAC,EAEhC,MAAM,SAAEv0B,GAAagE,EACfvF,EAAY00B,EAAoBnzB,GAIhCV,EAA+D,QAAxDsuB,EAA6B,QAA7B0G,EAAqB,QAArBC,EAAGvwB,EAAM/D,KAAKX,eAAO,IAAAi1B,OAAA,EAAlBA,EAAoBlxB,cAAM,IAAAixB,EAAAA,EAAIjB,MAAAA,OAAc,EAAdA,EAAgB/zB,eAAO,IAAAsuB,EAAAA,OAAI/rB,EAEzE,OAAOvC,GAAWV,EAAAA,cAAA,KAAGH,UAAW,GAAGA,0BAAmCa,EAAQk1B,aAS3E,SAASC,EACZzwB,EACAqvB,GAAgC,IAAAqB,EAAAC,EAEhC,MAAM,SAAE30B,GAAagE,EACfvF,EAAY00B,EAAoBnzB,GAEtC,GACIgE,EAAMjF,QAAQ+c,IAAIjC,UAChB7V,EAAMjF,QAAQ+c,IAAIjC,OAAO+a,0BAAkF,SAAtD5wB,EAAMjF,QAAQ+c,IAAIjC,OAAO+a,0BAEhF,OAKJ,MAAMt1B,EAAoC,QAA7Bo1B,EAAqB,QAArBC,EAAG3wB,EAAM/D,KAAKX,eAAO,IAAAq1B,OAAA,EAAlBA,EAAoBtxB,cAAM,IAAAqxB,EAAAA,EAAIrB,MAAAA,OAAc,EAAdA,EAAgB/zB,QAC9D,GAAKA,GAAYA,EAAQu1B,qBAKzB,OACIj2B,EAAAA,cAAA,OAAKH,UAAW,GAAGA,8BACfG,EAAAA,cAAA,YAAOU,EAAQu1B,uBANnB7wB,EAAMf,UAAUY,QAAQ,+CAWhC,IAAIixB,EAcJ,MAAMC,EAAoBA,CACtB/wB,EACAkB,EACA8vB,EACAC,EACAC,EACAvO,EACArnB,EACA61B,IACE9xB,IACF,IAAI+xB,EACAC,EACAC,GAAyCC,EAAAA,EAAAA,IACzClyB,EACAsjB,EACA3iB,EAAM/E,UACN+E,EAAMjF,QACNO,EACA61B,OACAtzB,GAcJ,GAX6B,eAAzBwB,EAAOmyB,cACPJ,EAAiD,eAAzB/xB,EAAOmyB,eAAiCC,EAAAA,EAAAA,IAAiBpyB,EAAOqyB,UAAW1xB,EAAM/E,gBAAa4C,EAE7F,qBAAzBwB,EAAOmyB,gBACPnyB,EAAOsyB,kBACgC,gBAAtCtyB,EAAOsyB,iBAAiBC,WAAqE,mBAAtCvyB,EAAOsyB,iBAAiBC,YAEhFR,GAAwBG,EAAAA,EAAAA,IAAgBlyB,EAAQsjB,EAAM3iB,EAAM/E,UAAW+E,EAAMjF,QAASO,EAAS61B,OAAqBtzB,GACpHyzB,OAAqBzzB,GAGI,wBAAzBwB,EAAOmyB,cACP,QAA+B3zB,IAA3BqD,EAAM2wB,kBAAkC3wB,EAAM2wB,kBAAoB7xB,EAAM6V,OAAOic,mBAAqBb,GAA2B,CAC/H,MAAMc,EAAsB/xB,EAAMjF,QAAQ8sB,iBAAiBY,eACvDzoB,EAAM6V,OAAOic,mBAAqBb,GAEtCI,EAA4BrxB,EAAM/E,UAAU+2B,6BAA6B5vB,QAAQ,cAAe2vB,QAC7F,GAAI7wB,EAAM2wB,kBAAoB7xB,EAAM6V,OAAOoc,mBAAqBf,GAA2B,CAC9F,MAAMa,EAAsB/xB,EAAMjF,QAAQ8sB,iBAAiBY,eACvDzoB,EAAM6V,OAAOoc,mBAAqBf,GAEtCG,EAA4BrxB,EAAM/E,UAAUi3B,6BAA6B9vB,QAAQ,cAAe2vB,GAIxGf,EAAUmB,iBAAiB,CACvBC,UAAW,YACXC,cAAejB,EACfkB,gBAC6B,qBAAzBjzB,EAAOmyB,eACDe,EAAAA,EAAAA,IAAmBlzB,EAAOmzB,kBAAmBxyB,EAAM/E,UAAWK,MAAAA,OAAO,EAAPA,EAASm3B,YACvE,GACVC,kBAAmBrB,EACnBsB,WAAYrB,KAUdsB,EAAoBA,CAAC52B,EAAkBg1B,IAAiC3xB,IACzD,cAAbrD,GACAg1B,EAAU6B,iBAAgB,IAI3B,SAASC,EACZ9yB,EACAkB,EACA8vB,EACAC,EACAC,EACA7B,EACA0D,GAA8B,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAE9B,MAAM,GAAEz3B,EAAE,SAAEC,EAAQ,QAAEjB,EAAO,UAAEE,GAAc+E,EAIvC1E,EAAoC,QAA7B03B,EAAqB,QAArBC,EAAGjzB,EAAM/D,KAAKX,eAAO,IAAA23B,OAAA,EAAlBA,EAAoB5zB,cAAM,IAAA2zB,EAAAA,EAAI3D,MAAAA,OAAc,EAAdA,EAAgB/zB,QAIxDqnB,EAA8B,QAA1BuQ,EAAkB,QAAlBC,EAAGnzB,EAAM/D,KAAK0mB,YAAI,IAAAwQ,OAAA,EAAfA,EAAiB9zB,cAAM,IAAA6zB,EAAAA,EAAI7D,MAAAA,OAAc,EAAdA,EAAgB1M,KAIlD6M,EAAsE,QAA9C4D,EAAsC,QAAtCC,EAAGrzB,EAAM/D,KAAKuzB,gCAAwB,IAAA6D,OAAA,EAAnCA,EAAqCh0B,cAAM,IAAA+zB,EAAAA,EAAI/D,MAAAA,OAAc,EAAdA,EAAgBG,0BAE1F,SACFiE,EACAC,YAAY,gBAAEpB,EAAe,cAAED,EAAa,kBAAEK,EAAiB,WAAEC,EAAU,UAAEP,GAAW,gBACxFuB,EAAe,oBACfC,EAAmB,0BACnBC,EAAyB,cACzBC,GACA5yB,EAEEiwB,EAAsBjwB,EAAMsuB,yBAC5BtuB,EAAMsuB,yBAAyBuE,yBAC/BvE,GAA4BA,EAAyB3iB,OAAS,EAC9D2iB,EAAyB,GAAGuE,8BAC5Bl2B,EAEAm2B,EAAqC,CACvCC,aAAch5B,EAAUi5B,mBACxBC,qBAAsBl5B,EAAUm5B,2BAChCC,uBAAwBp5B,EAAUo5B,uBAClCC,kBAAmBr5B,EAAUs5B,qBAC7BC,qBAAsBv5B,EAAUw5B,8BAChCC,kBAAmBz5B,EAAU05B,wBAC7Bj5B,cAAeT,EAAUU,UACzBC,kBAAmBX,EAAUW,kBAC7BC,iBAAkBZ,EAAUY,iBAC5B+4B,kBAAmB35B,EAAU25B,mBAY3BC,EAAwC,cAAb74B,GAA2E,YAA/CgE,EAAM/D,KAAKuzB,yBAAyBsF,OAC7FD,GACA7D,EAAU+D,yBAAwB,GAGtC,MAAMC,EAAwC,cAAbh5B,GAAmE,aAAb,QAA1Bs3B,EAAAtzB,EAAM/D,KAAKg5B,uBAAe,IAAA3B,OAAA,EAA1BA,EAA4BwB,QACrFE,GAA4BhE,EAAUkE,+BACtClE,EAAUkE,+BAA8B,GAG5CpE,GAAmBqE,EAAAA,EAAAA,oBAAmBn1B,EAAMjF,QAAQgQ,QAAQqqB,kBAAoBp1B,EAAMhE,SAAUgE,EAAMf,WAGtG,MAAMo2B,EAA0E,QAArD9B,EAAGvzB,EAAMjF,QAAQgX,cAAcmH,eAAeoc,eAAO,IAAA/B,OAAA,EAAlDA,EAAoDgC,sBAE5EN,EAA+B,cAAbj5B,EAA2BkF,EAAMs0B,uBAAmD,QAA7BhC,EAAGxzB,EAAM/D,KAAKg5B,uBAAe,IAAAzB,OAAA,EAA1BA,EAA4Bn0B,OACxGo2B,EACFzjB,EAAAA,gBAAgBC,YAAYgjB,MAAAA,OAAe,EAAfA,EAAiBS,kBAAoBT,EAAiBS,gBAAgB,GAAGC,OAASN,EAE5GpzB,EAAa2xB,GAAoC,cAAb53B,EAE1C,MAAO,CACH45B,eAAgB,CACZn7B,UAAW,GALD00B,EAAoBnzB,6BAOlC65B,OAAQv6B,GACJV,EAAAA,cAACk7B,EAAAA,mBAAkB,CACfC,cAAe96B,EAAU86B,cACzBC,eAAgB/6B,EAAU+6B,eAC1BC,eAAe5R,EAAAA,EAAAA,IAAW,OAAQtpB,EAAQgX,eAC1C0hB,SAAUA,EACVx3B,KAAM,CAAEX,QAAAA,EAAS46B,MAAOh1B,EAAMi1B,cAC9Bp7B,QAASA,EACT0qB,SAAUxjB,EACVlG,GAAIA,EACJg3B,qBAAsBA,EACtB/2B,SAAUA,EACVo6B,QAASrF,EACL/wB,EACAkB,EACA8vB,EACAC,EACAC,EACAvO,EACArnB,EACA61B,GAEJkF,mBAAoB1C,EACpBxC,oBAAqBA,EACrB0D,yBAA0BA,EAC1BjB,oBAAqBA,EACrBmB,wBAAyB/D,EAAU+D,wBACnCC,yBAA0BA,EAC1BnB,0BAA2BA,EAC3BqB,8BAA+BlE,EAAUkE,8BACzClB,cAAeA,EACfpU,aAAc5f,EAAMjF,QAAQgQ,QAAQ6U,aACpC5kB,cAlEiC,CACzCs7B,UAAW,CACPzW,GAAI,CAAE7M,EAAG,kBAAmB8M,EAAG,EAAGyW,EAAG,GACrCtW,GAAI,CAAEjN,EAAG,kBAAmB8M,EAAG,EAAGyW,EAAG,GACrCC,GAAI,CAAExjB,EAAG,kBAAmB8M,EAAG,EAAGyW,EAAG,IAEzCE,UAAU,GA6DF3F,iBAAkBA,EAClB4F,uBAAwB5C,EACxB6C,eAAgBz1B,EAAMy1B,eACtBC,kBAAmB11B,EAAM2wB,iBACzBgF,sBAAuB31B,EAAM21B,sBAC7B5E,kBAAmBjyB,EAAM6V,OAAOoc,kBAChCH,kBAAmB9xB,EAAM6V,OAAOic,kBAChCb,yBAA0BA,EAC1BC,yBAA0BA,EAC1B4F,oCAAqCC,EAAqC/2B,IAAUg3B,EAA+Bh3B,GACnHi3B,6BAA8BxB,EAC9ByB,MAAOtE,EAAkB52B,EAAUg1B,GACnCmG,+BAA6C,cAAbn7B,IAGxCo7B,WACIx8B,EAAAA,cAACy8B,EAAgB,CACb/E,gBAAiBA,EACjBD,cAAeA,EACfK,kBAAmBA,EACnBC,WAAYA,EACZ13B,UAAWA,EACXq8B,UAAyB,cAAdlF,KAYpB,SAASmF,EAAsBv3B,EAAgDkB,GAAmB,IAAAs2B,EAAAC,EAAAC,EACrG,MAAM,GAAE37B,EAAE,SAAEC,EAAQ,QAAEjB,EAAO,UAAEE,GAAc+E,EAE7C,OACIkB,EAAMi1B,cACFv7B,EAAAA,cAAC+8B,EAAAA,eAAc,CACX57B,GAAIA,EACJC,SAAUA,EACVjB,QAASA,EACTkB,KAAM,CAAEi6B,MAAOh1B,EAAMi1B,cACrB76B,QAA2B,QAApBk8B,EAAEx3B,EAAM/D,KAAKX,eAAO,IAAAk8B,OAAA,EAAlBA,EAAoBn4B,OAC7Bu4B,qBACkC,QADdH,EAChBz3B,EAAM/D,KAAKuyB,aAAanvB,cAAM,IAAAo4B,GAE7B,QAF6BA,EAA9BA,EAAgC96B,MAC5B6xB,GAAsC,0DAAtBA,EAAapb,cAChC,IAAAqkB,OAAA,EAFDA,EAEG/I,UAEPmJ,oCACkC,QADCH,EAC/B13B,EAAM/D,KAAKuyB,aAAanvB,cAAM,IAAAq4B,GAE7B,QAF6BA,EAA9BA,EAAgC/6B,MAC5B6xB,GAAsC,oEAAtBA,EAAapb,cAChC,IAAAskB,OAAA,EAFDA,EAEGhJ,UAEPoJ,eAAgB,CACZC,oBAAqB98B,EAAU88B,oBAC/BC,0BAA2B/8B,EAAU+8B,0BACrCC,mCAAoCh9B,EAAUg9B,mCAC9CC,sCAAuCj9B,EAAUi9B,sCACjDC,sCAAuCl9B,EAAUk9B,uCAErDz8B,cAAeT,EAAUU,UACzBC,kBAAmBX,EAAUW,kBAC7BC,iBAAkBZ,EAAUY,mBAMrC,SAASu8B,EACZp4B,EACAqvB,GAAgC,IAAAgJ,EAAAC,EAEhC,MAAM,GAAEv8B,EAAE,SAAEC,EAAQ,QAAEjB,EAAO,UAAEE,GAAc+E,EAIvCu4B,EAAkD,QAApCF,EAA4B,QAA5BC,EAAGt4B,EAAM/D,KAAKs8B,sBAAc,IAAAD,OAAA,EAAzBA,EAA2Bj5B,cAAM,IAAAg5B,EAAAA,EAAIhJ,MAAAA,OAAc,EAAdA,EAAgBkJ,eAC5E,IAAKA,IAAmBA,EAAeC,cACnC,OAAO59B,EAAAA,cAAA,YAeX,OAZIA,EAAAA,cAACoO,EAAAA,gBAAe,CACZC,UAAWsvB,EAAeC,eAAiB,EAC3CnvB,UAAQ,EACR1O,WAAWgF,EAAAA,EAAAA,QAAO1E,EAAUw9B,uBAAwBF,EAAeC,cAAe,KAClFrvB,YAAa,GAAGovB,EAAeG,eAC/Bz8B,KAAM,GACNlB,QAASA,EACTgB,GAAIA,EACJC,SAAUA,IAOtB,SAAS28B,EAA0C19B,GAC/C,MAAO,CACH29B,yBAA0B39B,EAAU29B,yBAEpCC,wBAAyB59B,EAAU49B,wBACnCC,4BAA6B79B,EAAU69B,4BAEvCC,gCAAiC99B,EAAU89B,gCAC3CC,iCAAkC/9B,EAAU+9B,iCAC5CC,sCAAuCh+B,EAAUg+B,sCAEjDC,oBAAqBj+B,EAAUi+B,oBAC/BC,wBAAyBl+B,EAAUk+B,wBACnCC,cAAen+B,EAAUm+B,eAIjC,SAASC,EAAyCp+B,GAC9C,MAAO,CACHq+B,yBAA0Br+B,EAAUs+B,0BACpCC,wBAAyBv+B,EAAUw+B,mBACnCC,2BAA4Bz+B,EAAUy+B,2BACtCC,yBAA0B1+B,EAAU2+B,+BAEpCC,yBAA0B5+B,EAAU4+B,yBAEpCC,yBAA0B7+B,EAAU8+B,8BACpCC,+BAAgC/+B,EAAUg/B,0CAIlD,SAASC,EAAgDj/B,GACrD,MAAO,CACHk/B,4BAA6Bl/B,EAAUk/B,4BACvCC,2BAA4Bn/B,EAAUm/B,2BACtCC,0CAA2Cp/B,EAAUo/B,0CACrDC,6CAA8Cr/B,EAAUq/B,6CACxDC,0CAA2Ct/B,EAAUs/B,0CACrD7+B,cAAeT,EAAUU,UACzBC,kBAAmBX,EAAUW,kBAC7BC,iBAAkBZ,EAAUY,kBAIpC,SAAS2+B,EACLv/B,GAEA,MAAO,CACHw/B,yBAA0Bx/B,EAAUw/B,yBACpCC,8BAA+Bz/B,EAAUy/B,8BACzCC,yBAA0B1/B,EAAU0/B,yBACpCC,+BAAgC3/B,EAAU2/B,gCAWlD,MAAMC,EAA6BA,CAAC7J,EAA6B/1B,EAAmCK,IAChG+D,IAEA2xB,EAAUmB,iBAAiB,CACvBC,UAAW,iBACXE,gBACsB,sBAAlBjzB,EAAOy1B,QAAiCvC,EAAAA,EAAAA,IAAmBlzB,EAAOmzB,kBAAmBv3B,EAAWK,MAAAA,OAAO,EAAPA,EAASm3B,YAAc,MAI5H,SAASqI,EACZ96B,EACAkB,EACA8vB,EACAvC,EACAxd,GAAkB,IAAA8pB,EAElB,MAAM,GACFh/B,EAAE,SACFC,EAAQ,QACRjB,EACAkB,MACI6yB,gBAAkBzvB,OAAQyvB,GAC1BC,qBAAuB1vB,OAAQ0vB,IAClC,UACD9zB,GACA+E,EAEE1E,EAA4B,QAArBy/B,EAAG/6B,EAAM/D,KAAKX,eAAO,IAAAy/B,OAAA,EAAlBA,EAAoB17B,QAGhCq0B,YAAY,gBAAEpB,EAAe,cAAED,EAAa,kBAAEK,EAAiB,WAAEC,EAAU,UAAEP,GAAW,SACxFqB,GACAvyB,EAGJ,GAAIA,EAAM21B,sBACN,OAIJ,MAAO,CACHjB,eAAgB,CACZn7B,UAAW,GAJD00B,EAAoBnzB,uCAMlC65B,OAAQv6B,GAAWwzB,GACfl0B,EAAAA,cAACogC,EAAAA,4BAA2Br4B,OAAAC,OAAA,CACxBnI,UAAU,gCACVwgC,6BAA8BhgC,EAAUggC,6BACxCC,gCAAiCjgC,EAAUigC,gCAC3CC,kCAAmCxC,EAA0C19B,GAC7EmgC,mCAAoC/B,EAAyCp+B,GAC7EogC,wCAAyCnB,EAAgDj/B,GACzFqgC,uDAAwDd,EACpDv/B,GAEJgB,KAAM,CAAEX,QAAAA,EAASm4B,SAAAA,EAAU3E,eAAAA,EAAgBC,oBAAAA,GAC3Ch0B,QAASA,EACTgB,GAAIA,EACJC,SAAUA,EACVo6B,QAASyE,EAA2B7J,EAAW/1B,EAAWK,GAC1DigC,8BAA+Br6B,EAAM21B,sBACrC3H,oCAAqCT,GAChCA,GAAoC,CAAExd,UAAWA,KAG9DmmB,WACIx8B,EAAAA,cAACy8B,EAAgB,CACb/E,gBAAiBA,EACjBD,cAAeA,EACfK,kBAAmBA,EACnBC,WAAYA,EACZ13B,UAAWA,EACXq8B,UAAyB,mBAAdlF,KAcpB,SAASoJ,EACZpgC,EACAE,EACA2V,EACA/P,GAEA,IAAIA,EAAM21B,sBAKV,OADAlI,EAAAA,EAAAA,mBAAkB1d,GACXrW,EAAAA,aAAmBQ,EAA+C,CAAEE,QAAAA,EAAS2V,UAAAA,IAUxF,MAAMwqB,EAAwBA,CAACzK,EAA6B/1B,EAAmCK,IAC3F+D,IAEA2xB,EAAUmB,iBAAiB,CACvBC,UAAW,WACXE,gBACsB,qBAAlBjzB,EAAOy1B,QAAgCvC,EAAAA,EAAAA,IAAmBlzB,EAAOmzB,kBAAmBv3B,EAAWK,MAAAA,OAAO,EAAPA,EAASm3B,YAAc,MAI3H,SAASiJ,EACZ17B,EACAkB,EACA8vB,EACA3B,GAAgC,IAAAsM,EAEhC,MAAM,GACF5/B,EAAE,SACFC,EAAQ,QACRjB,EACAkB,MACI2/B,WAAav8B,OAAQu8B,IACxB,UACD3gC,GACA+E,EAEE1E,EAA4B,QAAlBqgC,EAAA37B,EAAM/D,KAAKX,eAAO,IAAAqgC,GAAlBA,EAAoBt8B,OAASW,EAAM/D,KAAKX,QAAQ+D,OAASgwB,MAAAA,OAAc,EAAdA,EAAgB/zB,SAGrFo4B,YAAY,gBAAEpB,EAAe,cAAED,EAAa,kBAAEK,EAAiB,WAAEC,EAAU,UAAEP,GAAW,gBACxFuB,GACAzyB,EAGJ,GAAIA,EAAM21B,sBACN,OAKJ,MAAO,CACHjB,eAAgB,CACZn7B,UAAW,GAJD00B,EAAoBnzB,iCAMlC65B,OAAQv6B,GACJV,EAAAA,cAACihC,EAAAA,uBAAsB,CACnBphC,UAAU,gCACVqhC,wBAAyB7gC,EAAU6gC,wBACnCC,6BAA8B9gC,EAAU8gC,6BACxCC,qBAAsB/gC,EAAU+gC,qBAChCC,2BAA4BhhC,EAAUghC,2BACtCC,uBAAwBjhC,EAAUihC,uBAClCC,4BAA6BlhC,EAAUkhC,4BACvCC,eAAgBnhC,EAAUmhC,eAC1BngC,KAAM,CAAEX,QAAAA,EAASsgC,UAAAA,GACjB7gC,QAASA,EACTgB,GAAIA,EACJsgC,SAAS,SACTrgC,SAAUA,EACVo6B,QAASqF,EAAsBzK,EAAW/1B,EAAWK,GACrD+6B,mBAAoB1C,IAG5ByD,WACIx8B,EAAAA,cAACy8B,EAAgB,CACb/E,gBAAiBA,EACjBD,cAAeA,EACfK,kBAAmBA,EACnBC,WAAYA,EACZ13B,UAAWA,EACXq8B,UAAyB,aAAdlF,KAW3B,MAAMkK,EAA2BtL,GAAiCuL,IAC1DvL,EAAUwL,gBACVxL,EAAUwL,eAAeD,IAI1B,SAASE,EACZz8B,EACAkB,EACA8vB,GAEA,MAAM,UAAE/1B,EAAS,SAAEe,GAAagE,GAE1B,SACFyzB,EAAQ,IACRnwB,EAAG,IACHC,EACAmwB,YAAY,cAAErB,IACdnxB,EAEEzG,EAAY00B,EAAoBnzB,GAEtC,MAAO,CACH45B,eAAgB,CACZn7B,UAAW,GAAGA,eAElBiiC,oBAAqB,CACjBtoB,IAAK,QACL3Z,UAAW,GAAGA,4BACdkiC,QAAS,GAAGliC,6BAEhBkpB,QAAS/oB,EAAAA,cAAA,OAAKH,UAAW,GAAGA,qCAA8CQ,EAAU2hC,wBACpFC,OAAQxK,GACJz3B,EAAAA,cAAA,QAAMH,UAAU,iDACZG,EAAAA,cAAA,QAAMH,UAAU,2BAA0B,cAAa,SACvDG,EAAAA,cAAA,YAAOy3B,IAGfvrB,MACIlM,EAAAA,cAAC2oB,EAAAA,SAAQ,CACLxnB,GAAI,GAAGtB,4BACP6I,IAAKA,EACLC,IAAKA,EACLu5B,aAAcrJ,EACd3wB,SAAUw5B,EAAwBtL,GAClCtP,uBAAwBzmB,EAAUymB,uBAClCoP,iBAAkBA,KAM3B,SAASiM,EACZ/8B,EACAg9B,GAAkC,IAAAC,EAElC,MAAM,UAAEhiC,EAAS,QAAEF,EAAO,SAAEiB,GAAagE,EACnC1E,EAA4B,QAArB2hC,EAAGj9B,EAAM/D,KAAKX,eAAO,IAAA2hC,OAAA,EAAlBA,EAAoB59B,OAE9B5E,EAAY00B,EAAoBnzB,GAOhCkhC,EACFF,IAAeG,EAAAA,EAAuBC,MAAQC,EAAAA,kBAAkBC,iBAAmBD,EAAAA,kBAAkBE,uBACnGC,GAAUC,EAAAA,EAAAA,kBAAiB,QAAS3M,EAAkBoM,GACtDQ,GAAYC,EAAAA,EAAAA,wBAAuB7M,EAAkB0M,GACrDhjC,EAAOwiC,IAAeG,EAAAA,EAAuBC,MAAQniC,EAAU2iC,qBAAuB3iC,EAAU4iC,2BAEtG,MAAO,CACHjI,eAAgB,CACZn7B,UAAW,GAAGA,iBAAyBuiC,KAE3Cl2B,MACIlM,EAAAA,cAACmU,EAAAA,OAAMpM,OAAAC,OAAA,CACHyQ,MAAO7Y,EACPC,UAAW,GAAGA,mBAA2BuiC,WAAmB,aAChDxiC,EACZuO,SArBW+0B,EAqBYd,EArBuC,KACtE,MAAMe,GAAY1Z,EAAAA,EAAAA,IAAW,SAAUtpB,GAAWA,EAAQgX,eACpD3V,EAAY2hC,EAAWlgB,SAAS,KAAO,IAAM,IACnDtW,SAASy2B,SAAStjC,KAAO,GAAGqjC,IAAY3hC,cAAsBd,GAC1DA,EAAQmI,2BAA2Bq6B,OAkB3BJ,GAEHljC,IAxBUsjC,IAAAA,EAmC3B,MAAMG,EAAwBjN,GAAiC9rB,IAC3D,MAAMjC,EAAQiC,EAAMO,cAAcxC,MAClC+tB,EAAUkN,iBAAiBj7B,EAAM4J,OAAS,EAAIzN,OAAO6D,GAAS7D,OAAO++B,WAAWl7B,KAG7E,SAASm7B,EACZp+B,EACAkB,EACA8vB,GAEA,MAAM,OAAEnb,EAAM,UAAE5a,GAAc+E,GAG1B0zB,eACAxyB,EAEEzG,EAAY00B,EAAoBnvB,EAAMhE,UAE5C,MAAO,CACH45B,eAAgB,CACZn7B,UAAW,GAAGA,mBAElBiiC,oBAAqB,CACjBtoB,IAAK,QACL3Z,UAAW,GAAGA,wBACdkiC,QAAS,GAAGliC,mBAEhBkpB,QAAS/oB,EAAAA,cAAA,OAAKH,UAAW,GAAGA,iCAA0CQ,EAAUojC,8BAChFv3B,MACIlM,EAAAA,cAAA,SACI8nB,KAAK,SACLjoB,UAAW,GAAGA,uCACdqI,SAAUm7B,EAAqBjN,GAAU,aAC7B/1B,EAAUojC,6BAA4B,gBACnCxoB,EAAOic,kBAAiB,gBACxBjc,EAAOic,kBAAiB,gBACxB5wB,EAAM2wB,iBACrB5uB,MAAO/B,EAAM2wB,iBACbvuB,IAAKuS,EAAOic,kBACZvuB,IAAKsS,EAAOic,qBAMrB,MAAMuF,EAAqDnN,IAO7D,IAP8D,UAC/DoN,EAAS,gBACThF,EAAe,cACfD,EAAa,kBACbK,EAAiB,WACjBC,EAAU,UACV13B,GACHivB,EACOoU,EAAwC,GAgB5C,OAdAA,EAAgB37B,OAAO47B,OAAOjM,GAAiBlb,QAAOonB,QAAuB3gC,IAAZ2gC,IAE7DnM,GACAiM,EAAcrgC,KAAKo0B,GAGnBK,GACA4L,EAAcrgC,KAAKy0B,GAGnBC,GACA2L,EAAcrgC,KAAK00B,GAInB/3B,EAAAA,cAACqzB,EAAAA,MAAK,CAAC3f,OAAQgpB,GAAagH,EAAczxB,OAAS,EAAGuX,MAAM,SAASqa,WAAS,eAAaxjC,EAAUyjC,0BACjG9jC,EAAAA,cAAA,OAAKH,UAAU,oBAAmB,cAAa,QAC3CG,EAAAA,cAAA,QAAMH,UAAU,6BAChBG,EAAAA,cAAA,YAAOK,EAAUyjC,2BAEpBJ,EAAcjjC,KAAI,CAACmjC,EAASjjC,IAErBX,EAAAA,cAAA,OAAKY,IAAKD,EAAOd,UAAU,mBACtB+jC,OAQlB,SAASG,EACZ3+B,EACAkB,GAEA,MAAM,UAAEjG,GAAc+E,GAEhB,IAAEsD,EAAG,IAAEC,GAAQrC,EAErB,GAAK61B,EAAqC/2B,IAAWg3B,EAA+Bh3B,GAIpF,OACIpF,EAAAA,cAAC4lB,EAAAA,KAAI,CAAC/lB,UAAU,yBACXmkC,EAAgB5+B,EAAOuD,EAAKtI,EAAU4jC,iBACtCC,EAAgB9+B,EAAOsD,EAAKrI,EAAU8jC,kBAK5C,MAAMC,EAAsD,kEACtDC,EACT,sEACSC,EAAuE,iDAE9EN,EAAkBA,CACpB5+B,EACAuD,EACAs7B,KAEA,MAAM,UAAE5jC,EAAS,SAAEe,GAAagE,EAC1BvF,EAAY00B,EAAoBnzB,GACtC,GAAIuH,GAAe,IAARA,GAAaA,IAAQnE,OAAO+/B,UACnC,OACIvkC,EAAAA,cAAA,KAAGH,UAAW,GAAGA,wBACbG,EAAAA,cAAA,QAAMH,UAAU,WAAWQ,EAAUmkC,qBACrCxkC,EAAAA,cAAA,KAAGH,UAAU,iBAAgB,cAAa,SACzCokC,EAAgBz8B,QAAQ,QAASmB,EAAI8I,cAOhDyyB,EAAkBA,CACpB9+B,EACAsD,EACAy7B,KAEA,MAAM,UAAE9jC,EAAS,SAAEe,GAAagE,EAC1BvF,EAAY00B,EAAoBnzB,GACtC,GAAIsH,GAAOA,EAAM,EACb,OACI1I,EAAAA,cAAA,KAAGH,UAAW,GAAGA,wBACbG,EAAAA,cAAA,QAAMH,UAAU,WAAWQ,EAAUmkC,qBACrCxkC,EAAAA,cAAA,KAAGH,UAAU,iBAAgB,cAAa,SACzCskC,EAAgB38B,QAAQ,QAASkB,EAAI+I,cAOhD0qB,EAAwC/2B,IAAuE,IAAAq/B,EAAAC,EACjH,MAAMC,EAAkBv/B,EAAM/D,KAAKuyB,aAAanvB,OAIhD,KAF6BkgC,MAAAA,GAAwG,QAAzFF,EAAfE,EAAiB5iC,MAAK6xB,GAAgBA,EAAapb,OAAS4rB,WAA4C,IAAAK,OAAA,EAAxGA,EACvB3Q,WAEF,OAAO,EAOX,GAJ+B6Q,MAAAA,GAE9B,QAF6CD,EAAfC,EAAiB5iC,MAC5C6xB,GAAgBA,EAAapb,OAAS8rB,WACzC,IAAAI,OAAA,EAF8BA,EAE5B5Q,UAEyB,CAAC,IAAD8Q,EACxB,MAAMC,EAAuD,QAAhBD,EAAGx/B,EAAMjF,eAAO,IAAAykC,GAAS,QAATA,EAAbA,EAAez0B,eAAO,IAAAy0B,GAAK,QAALA,EAAtBA,EAAwB1nB,WAAG,IAAA0nB,GAAU,QAAVA,EAA3BA,EAA6BE,gBAAQ,IAAAF,OAAA,EAArCA,EAAuCG,iCACvF,GAAgD,SAA5CF,EACA,OAAO,EAGX,GAAgD,QAA5CA,EACA,OAAO,EAGX,MAAMG,EAAe5/B,EAAM/D,KAAK8yB,oBAAoB1vB,OACpD,OACIugC,IAC8C,QAA5CH,GAAqDG,EAAaC,OACnB,QAA5CJ,IAAsDG,EAAaC,OAEzE,CAAC,IAADC,EAAAC,EACH,MAAMC,EAAgD,QAA/BF,EAAG9/B,EAAM/D,KAAK+jC,yBAAiB,IAAAF,OAAA,EAA5BA,EAA8BzgC,OACxD,QAA+C,QAAxC0gC,EAAEC,MAAAA,OAAiB,EAAjBA,EAAmBC,2BAAmB,IAAAF,GAAAA,KAIjD/I,EAAkCh3B,IAA2D,IAAAkgC,EAC/F,MAAMX,EAAkBv/B,EAAM/D,KAAKuyB,aAAanvB,OAE1C8gC,EAAoCZ,MAAAA,GAEzC,QAFwDW,EAAfX,EAAiB5iC,MACvD6xB,GAAgBA,EAAapb,OAAS6rB,WACzC,IAAAiB,OAAA,EAFyCA,EAEvCxR,UAEH,OAAOyR,MAAAA,GAAAA,itBC97BX,IAAIrP,EA6EG,SAASsP,EACZpgC,EACAkB,EACA8vB,EACA3B,EACAgR,GAAuC,IAAApQ,EAAAqQ,EAAAC,EAEvC,MAAM,UAAEtlC,EAAS,SAAEe,GAAagE,GAG5B0zB,YAAY,gBAAEpB,IACdpxB,GAEE,gBAAEs/B,GAAoBxP,EAEtBj2B,EAAUiF,EAAMjF,QAIhBO,EAA4B,QAAlB20B,EAAAjwB,EAAM/D,KAAKX,eAAO,IAAA20B,GAAlBA,EAAoB5wB,OAASW,EAAM/D,KAAKX,QAAQ+D,OAASgwB,MAAAA,OAAc,EAAdA,EAAgB/zB,QAInFmlC,EAA4D,QAAvCH,EAA+B,QAA/BC,EAAGvgC,EAAM/D,KAAKkxB,yBAAiB,IAAAoT,OAAA,EAA5BA,EAA8BlhC,cAAM,IAAAihC,EAAAA,EAAIjR,MAAAA,OAAc,EAAdA,EAAgBlC,kBAGhFuT,EAAmB1gC,EAAMjF,QAAQ+c,IAAIjC,OAAO6qB,iBAE5CC,EAAuB3uB,EAAAA,gBAAgBC,YAAYwuB,GAEzD,IAAKnlC,IAAYqlC,EACb,OAGJ,MAAMlmC,EAAY00B,EAAoBnzB,GAEhC4kC,EAAYxvB,MAAAA,GACdyvB,EAAW5nB,EAAc+X,EAAU8P,wBAEjCC,EAAyB3vB,MAAAA,GAC3B4vB,EAAwB/nB,EAAc+X,EAAUiQ,qBAEpDnQ,GAAmBqE,EAAAA,EAAAA,oBAAmBp6B,EAAQgQ,QAAQqqB,kBAAoBp1B,EAAMhE,SAAUgE,EAAMf,WAEhG,MAAMiiC,EAAiBnmC,EAAQ+c,IAAIjC,OAAOqrB,eAE1C,IAAIC,EAA0C,GAI9CA,EAF0BV,EAESplC,KAAI+lC,IAAuB,IAAA7mC,EAAA8mC,EAuB1D,MAAO,CACHC,aAvBiBd,EAAgBY,EAAqBG,mBAAoBtmC,GAwB1Ema,WAvBegsB,EAAqBG,mBAAmBl1B,WAwBvDm1B,cArBoC,QADxBjnC,EAAqD,QAArD8mC,EAAID,EAAqBK,oCAA4B,IAAAJ,EAAAA,EACjED,EAAqBM,uBAAe,IAAAnnC,EAAAA,EACpC,IAC0C6c,QAC1CnU,IAAK,IAAA0+B,EAAAC,EAAA,OAAKC,EAAAA,iBAAiBC,kBAAgD,QAA/BH,EAAqB,QAArBC,EAAC3+B,EAAM8+B,sBAAc,IAAAH,OAAA,EAApBA,EAAsBn+B,gBAAQ,IAAAk+B,EAAAA,EAAI1+B,EAAMQ,aAGnBpI,KAAwBomC,IAA+B,IAAAO,EAAAC,EACzH,MAAMC,EAA4D,QAA9CF,EAAGP,EAA6BM,sBAAc,IAAAC,EAAAA,EAAIP,EAChEU,GAAqBC,EAAAA,EAAAA,yCAAwCX,EAA8BP,GACjG,MAAO,CACHj+B,MAA2B,QAAtBg/B,EAAEC,EAAeG,aAAK,IAAAJ,EAAAA,EAAI,GAC/BlmC,GAAImmC,EAAez+B,SAAS4I,WAC5B1B,aAAcu3B,EAAeI,aAC7B13B,SAAUs3B,EAAeK,SACzBtgC,WAAYy+B,GAAoByB,IAAuBK,EAAAA,qBAAqBC,WAC5EC,oBAAqBznC,EAAUynC,oBAAsBznC,EAAUynC,oBAAsB,WAUjG,MAAMC,EAAoBtC,MAAAA,EAAAA,GAAsBuC,EAAAA,EAAAA,6BAA4B7nC,EAAQgQ,QAAQ4L,IAAImQ,YAChG,IAAK,MAAM+b,KAAiB1B,EAAgB,CACxC,MAAM2B,EAA6BH,EAAkBvrB,QACjD2rB,GAAsBA,EAAmBxB,mBAAmBl1B,aAAew2B,EAAcztB,aAE7F,IAAKpD,EAAAA,gBAAgBC,YAAY6wB,GAC7B,SAEJ,MAAME,EAA4BF,EAA2B,GACvDG,EAAwBJ,EAAcrB,aAAapqB,QACrD8rB,IAAa,IAAAC,EAAA,OACTD,EAAcjgC,MAAM0G,uBAAgE,QAA7Cw5B,EAAKH,EAA0BjB,sBAAc,IAAAoB,GAAO,QAAPA,EAAxCA,EAA0Cd,aAAK,IAAAc,OAAA,EAA/CA,EAAiDx5B,wBAEhGqI,EAAAA,gBAAgBC,YAAYgxB,KAGjCA,EAAsB,GAAGG,WAAY,GAGzC,MAAMC,EAAwDlC,EAAe9lC,KAAIwnC,GAtJjC7iC,CAAAA,IAChD,MAAMsjC,EAAclkC,OAAO8J,SAASlJ,EAAMoV,WAAY,IAChDmuB,GAAqB5jC,EAAAA,EAAAA,QAAOK,EAAM/E,UAAUuoC,4BAA6BxjC,EAAMshC,cAE/E9hB,EAAexf,EAAMsyB,gBAAgBtyB,EAAMoV,YAEjD,IAAIquB,EAAyBC,EAAAA,EAAcC,SAE3C,MAAMj6B,GAAgBk6B,EAAAA,EAAAA,6CAA4CN,GAE5DO,EAAkC7jC,EAAMjF,QAAQ+c,IAAIjC,OAAO+H,uBASjE,OAPI5L,EAAAA,gBAAgBC,YAAY4xB,KAC3BA,EAAgChmB,SAASC,EAAAA,eAAeC,OACzD8lB,EAAgChmB,SAASnU,KAEzC+5B,EAAyBC,EAAAA,EAAcI,QAGpC,CACHlO,eAAgB,CACZn7B,UAAW,GAAGuF,EAAMvF,uBAExBiiC,oBAAqB,CACjBtoB,IAAK,QACL3Z,UAAW,GAAGuF,EAAMvF,qCACpBkiC,QAAS,GAAG38B,EAAMvF,qCAAqCuF,EAAMoV,cAEjEynB,OAAQrd,GACJ5kB,EAAAA,cAAA,QAAMH,UAAU,gDAAgDiO,KAAK,QAAO,YAAW,aACnF9N,EAAAA,cAAA,QAAMH,UAAU,2BAA0B,cAAa,SACvDG,EAAAA,cAAA,YAAO4kB,IAGfmE,QAAS/oB,EAAAA,cAAA,WAAMoF,EAAMshC,cACrByC,OACInpC,EAAAA,cAACopC,EAAAA,EAAQ,CACL5uB,WAAYpV,EAAMoV,WAClBksB,aAActhC,EAAMshC,aACpBiC,mBAAoBA,EACpB/B,aAAcxhC,EAAMwhC,aACpB1+B,SAAU9C,EAAMikC,iBAChBC,aAAclkC,EAAMmkC,mBACpBrT,iBAAkBA,EAClBsT,cAAeX,EACf34B,YAAa9K,EAAMjF,QAAQgQ,QAAQD,gBA0GpCu5B,CAA0CzmC,EAAAA,EAAC,GAC3CilC,GAAa,IAChB5nC,UAAAA,EACAq3B,gBAAAA,EACAkO,gBAAAA,EACAyD,iBAAkBrD,EAClBuD,mBAAoBpD,EACpBtmC,UAAAA,EACAM,QAAAA,OAIR,MAAO,CACH66B,eAAgB,CACZn7B,UAAW,GAAGA,gBAElB4oC,UAAAA,GAIR,MAAMxC,EAAazvB,MACf6H,EACAqrB,WAEMA,GAAkBrrB,EAAa7D,WAAY6D,EAAasrB,WAG5DvD,EAA0BA,CAC5B/nB,EACAgoB,KAEIA,GACAA,EAAoBhoB,EAAaurB,uBAInCrV,EAAuBnzB,GACe,cAAjCA,EAAS2N,oBAAsC,eAAiB,yCCjJpE,IAAKwzB,EA4FAhN,mBA5FZ,SAAYgN,GACRA,EAAA,cACAA,EAAA,2BAFJ,CAAYA,IAAAA,EAAsB,KA4FlC,SAAYhN,GACRA,EAAA,QACAA,EAAA,QACAA,EAAA,QACAA,EAAA,QACAA,EAAA,QACAA,EAAA,QANJ,CAAYA,IAAAA,EAAe,ksBC7KpB,MAAM6T,UAAiBppC,EAAAA,cAK1BmF,YAAmBC,EAAuBkB,GACtCjB,MAAMD,GALO,KAAAykC,WAAiD7pC,EAAAA,YA0FjD,KAAA8pC,cAAgBtzB,MAAAA,IAC7BhR,KAAKmF,SAAS,CAAEo/B,cAAe73B,EAAKpC,SAEhCtK,KAAKJ,MAAM8C,gBACL1C,KAAKJ,MAAM8C,SAAS,CACtBsS,WAAYhV,KAAKJ,MAAMoV,WACvBmvB,SAAUz3B,EAAKpC,OACfk6B,cAAe93B,EAAK7J,SAKf,KAAA49B,WAAazvB,MAAAA,IAC1BhR,KAAKmF,SAAS,CAAEo/B,cAAez/B,EAAMsG,OAAOvI,QAExC7C,KAAKJ,MAAM8C,gBACL1C,KAAKJ,MAAM8C,SAAS,CACtBsS,WAAYhV,KAAKJ,MAAMoV,WACvBmvB,SAAUr/B,EAAMsG,OAAOvI,MACvB2hC,cAAe1/B,EAAMsG,OAAOsV,aAtGhC1gB,KAAKJ,MAAMkkC,cACX9jC,KAAKJ,MAAMkkC,aAAa,CACpBM,qBAAsBpkC,KAAKJ,MAAMoV,aAIzC,MAAMyvB,EAAezkC,KAAKJ,MAAMwhC,aAAa7kC,MAAKmQ,GAAQA,EAAKs2B,YAC3DyB,GACAzkC,KAAKc,MAAQ,CACTyjC,cAAeE,EAAa9oC,GAAGsQ,YAE/BjM,KAAKJ,MAAM8C,UAEX1C,KAAKJ,MAAM8C,SAAS,CAChBsS,WAAYhV,KAAKJ,MAAMoV,WACvBmvB,SAAUM,EAAa9oC,GACvB6oC,cAAeC,EAAa5hC,SAIpC7C,KAAKc,MAAQ,CACTyjC,cAAe,IAGvBvkC,KAAKo9B,SAAUC,EAAAA,EAAAA,kBAAiB,QAASz9B,EAAM8wB,iBAAmB1wB,KAAKJ,MAAMshC,cAG1E3/B,SACH,OAAIvB,KAAKJ,MAAM8K,aAAe1K,KAAKJ,MAAMokC,gBAAkBV,EAAAA,EAAcI,OAC9D1jC,KAAKmK,gBAGTnK,KAAK0kC,kBAGRA,kBACJ,MAAM,WAAE1vB,EAAU,aAAEosB,EAAY,aAAEF,EAAY,mBAAEiC,GAAuBnjC,KAAKJ,MACtE09B,GAAYC,EAAAA,EAAAA,wBAAuBv9B,KAAKJ,MAAM8wB,iBAAmB1wB,KAAKo9B,SAC5E,OACI5iC,EAAAA,cAAA,SAAA+H,OAAAC,OAAA,CACI7G,GAAI,uBAAuBqZ,IAC3BlS,IAAK9C,KAAKqkC,WAAU,aACRnD,EACZ7mC,UAAU,uBACVqI,SAAU1C,KAAKygC,YACXnD,GAEJ9iC,EAAAA,cAAA,UAAQqI,MAAM,GAAE,gBAA6C,KAA7B7C,KAAKc,MAAMyjC,cAAsBn+B,SAAuC,KAA7BpG,KAAKc,MAAMyjC,cAAsBI,QAAM,EAACtf,UAAQ,GACtH8d,GAEJ/B,EAAanmC,KACTyR,GACGA,GACIlS,EAAAA,cAAA,UACIqI,MAAO6J,EAAK/Q,GACZP,IAAKsR,EAAK/Q,GACVyK,SAAUpG,KAAKc,MAAMyjC,gBAAkB73B,EAAK/Q,GAAGsQ,WAAU,gBAC1CjM,KAAKc,MAAMyjC,gBAAkB73B,EAAK/Q,GAAGsQ,WACpD5R,UAAWqS,EAAK7K,WAAa,sCAAmCpE,GAE/DiP,EAAK7J,UAQ1BsH,gBACJ,MAAME,EAAcrK,KAAKJ,MAAMwhC,aAAanmC,KAAiByR,GACzDlP,EAAAA,EAAA,GACOkP,GAAI,IACPpC,OAAQoC,EAAK/Q,GACb2N,cAAetJ,KAAKJ,MAAMshC,iBAGlC,OAAO1mC,EAAAA,cAACiQ,EAAAA,gBAAe,CAACG,KAAMP,EAAaK,YAAa1K,KAAKJ,MAAM8K,YAAck6B,aAAc5kC,KAAKskC,+CCrGrG,IAAKhB,mBAAZ,SAAYA,GACRA,EAAAA,EAAA,uBACAA,EAAAA,EAAA,mBAFJ,CAAYA,IAAAA,EAAa,oVC6DlB,SAASjS,EAAiBC,EAA+Bz2B,GAC5D,OAAKy2B,GAAaA,GAAa,EACpBz2B,EAAUgqC,uBACI,IAAdvT,EACAz2B,EAAUiqC,8BAEdjqC,EAAUkqC,6BAA6B/iC,QAAQ,YAAasvB,EAAUrlB,YAG1E,SAASklB,EACZlyB,EACAsjB,EACA1nB,EACAF,EACAO,EACA61B,EACA6M,GAEA,GAA6B,eAAzB3+B,EAAOmyB,cACP,OAAOv2B,EAAUmqC,0BACd,GAA6B,qBAAzB/lC,EAAOmyB,cAAsC,CAAC,IAAD6T,EAmBlDC,EAlBF,GAAIjmC,EAAOsyB,kBAA0D,gBAAtCtyB,EAAOsyB,iBAAiBC,UAA6B,CAEhF,MAAM2T,EA/CX,SACH5iB,EACArnB,EACA0iC,GAGA,IAAIuH,GAA0B,EAE9B,MAAMC,EAAkBlqC,MAAAA,OAAO,EAAPA,EAASmI,SAEjC,IAAK,IAAIlI,EAAQ,EAAGA,EAAQonB,EAAMA,KAAKE,UAAWhW,OAAQtR,IACtD,GACIonB,EAAMA,KAAKE,UAAWtnB,GAAO6gB,YAAcopB,IAC1C7iB,EAAMA,KAAKE,UAAWtnB,GAAOkqC,oBAAsB,QAASzH,MAAAA,OAAQ,EAARA,EAAU0H,gBAAiB,IAC1F,CACEH,EAAiBhqC,EAEjB,MAIR,OAAOgqC,EA0BgCI,CAAgBhjB,EAAMrnB,EAAS0iC,GAE9D,IAAI4H,EAA0B,EAC9B,IAAwB,IAApBL,EAAuB,CAAC,IAADM,EAEvBD,EAA2C,QAA5BC,uWADOjoC,CAAA,GAAQ+kB,EAAMA,KAAKE,UAAW0iB,IACjBhiB,gBAAQ,IAAAsiB,EAAAA,EAAI,EAInD,MAAMC,EArFX,SAA0B/qC,EAAuCo2B,GAGpE,MAAM4U,EAAiDhrC,EAAQ+c,IAAIjC,OAAOkwB,2BACpEC,EAAe7U,MAAAA,OAAmB,EAAnBA,EAAqB8U,kBAG1C,IAAIH,EAYJ,OATIA,OAD+BjoC,IAA/BkoC,QAA6DloC,IAAjBmoC,EAJnB,QAMDnoC,IAAjBmoC,EACSD,MAAAA,EAAAA,EAPS,QAQaloC,IAA/BkoC,EACSC,EAEA/pB,KAAK3Y,IAAIyiC,EAA4BC,GAGlDF,EAkEuBI,CAAiBnrC,EAASo2B,GAChD,OAAOl2B,EAAUkrC,qBACZ/jC,QAAQ,gBAAiBwjC,EAAgBv5B,YACzCjK,QAAQ,gBAAiB0jC,EAAcz5B,YACzC,OACHhN,EAAOsyB,kBACgC,mBAAtCtyB,EAAOsyB,iBAAiBC,WAAwE,kBAAtCvyB,EAAOsyB,iBAAiBC,UAK5D,QAAvByT,EAAAhmC,EAAOsyB,wBAAgB,IAAA0T,GAAvBA,EAAyBe,mBAAqBp0B,EAAAA,gBAAgBC,YAAY5S,EAAOsyB,iBAAiByU,mBAC3F/mC,EAAOsyB,iBAAiByU,kBAC1B/qC,KAAIyR,IAAO,IAAAu5B,EACR,OAAOr8B,EAAAA,iBAAiBs8B,cAAcx5B,EAAKy5B,kBACpB,QADqCF,EACtDv5B,EAAK05B,oBAAY,IAAAH,EAAAA,EAAIv5B,EAAK25B,gBAC1B35B,EAAKy5B,oBAEdl6B,WAGFpR,EAAUmqC,0BAb8B,QAA3CE,EAAOjmC,EAAOsyB,iBAAiB+U,oBAAY,IAAApB,OAAA,EAApCA,EAAsCiB,kBAmBlD,SAAShU,EACZlzB,EACApE,EACA0rC,GAEA,IAAKtnC,EACD,MAAO,GAGX,MAAMwvB,EAA4D,GAElE,IAAK,MAAM+X,KAAavnC,EACpBwvB,EAAW+X,EAAUrF,oBAAsBsF,EAAwBD,EAAUrF,mBAAoBtmC,EAAW0rC,GAGhH,OAAO9X,EAGJ,SAASgY,EAAwBC,EAA4B7rC,EAAmC0rC,GACnG,OAAQG,GACJ,KAAK,EACD,OAAO7rC,EAAU8rC,sCACrB,KAAK,EACD,OAAO9rC,EAAU+rC,8CACrB,KAAK,EACD,OAAO/rC,EAAUgsC,qCACrB,KAAK,EACD,OAAON,EAAa1rC,EAAUisC,uCAAyCjsC,EAAUksC,sCACrF,QACI,MAAO,uPCjInB,MAAMC,EAAgExsC,EAAAA,YAkChEysC,EAA4BA,CAACrnC,EAAkCkB,EAAqB8vB,IAAgC5f,gBA6R1HA,eAAkCpR,EAAkCkB,EAAqB8vB,GAA2B,IAAAsW,EAChH,MACIrrC,MACIsrC,2BAA6BloC,OAAQkoC,GACrC5kB,MAAQtjB,OAAQsjB,GAChB6M,0BAA4BnwB,OAAQmwB,IACvC,UACDv0B,EAAS,QACTF,EAAO,QACPysC,GACAxnC,GAEE,gBAAE2zB,EAAe,SAAEF,GAAavyB,EAEtC,IAAIumC,EAAcznC,EAAM/D,KAAKX,QAAQ+D,OACrC,MAAMqoC,EAAgC,kEAChCC,EAA8C,QAAbL,EAAGtnC,EAAM/D,YAAI,IAAAqrC,GAAc,QAAdA,EAAVA,EAAY9Y,oBAAY,IAAA8Y,GAAQ,QAARA,EAAxBA,EAA0BjoC,cAAM,IAAAioC,GAEzE,QAFyEA,EAAhCA,EAAkC3qC,MACvE6xB,GAA+BA,EAAapb,OAASs0B,WACzD,IAAAJ,OAAA,EAFyCA,EAEvC5Y,UAECiF,IACA8T,QAAqB9T,GAAoB8T,GAG7C,IAAKA,IAAgBF,EACjB,OAGJ,MAAMjsC,EAAUmsC,EAEVjV,EACFl3B,EAAQssC,YACRtsC,EAAQssC,WAAWxwB,QAAQwvB,KAAkCA,EAAU7E,gBAAkB6E,EAAU7E,eAAeM,SAEtH,IAAIwF,EAA0B,GAC1BL,GAAW7kC,OAAOmlC,KAAKN,GAAS36B,OAAS,GAAK26B,EAAQO,eAAiBP,EAAQO,cAAcl7B,OAAS,IACtGg7B,EAAkBL,EAAQO,cAAc,GAAGhsC,IAG3Cy2B,GAAqBA,EAAkB3lB,OAAS,EAC5CmkB,EAAUmB,kBACVnB,EAAUmB,iBAAiB,CACvBC,UAAW,cACXE,iBAAiBC,EAAAA,EAAAA,IAAmBC,EAAmBv3B,KAI/DssC,EACKS,WAAW,CACR1sC,QAAAA,EACAS,GAAI8rC,EACJI,iBAAkBb,EAClBnS,gBAAiB0S,EAAoC3nC,EAAM/D,KAAKg5B,gBAAgB51B,YAASxB,EACzFqqC,mBAAoB92B,MAAO+2B,EAAkCC,KAAwB,IAAA5I,EACjF,IAAK7c,EACD,OAAOnK,QAAQC,UAGnB,MAAM4vB,EAAwB,QAAhB7I,EAAGx/B,EAAMjF,eAAO,IAAAykC,GAAK,QAALA,EAAbA,EAAe1nB,WAAG,IAAA0nB,GAAQ,QAARA,EAAlBA,EAAoB3pB,cAAM,IAAA2pB,OAAA,EAA1BA,EAA4B8I,kBAE7C,OAAO3lB,EACF4lB,iBAAiB,CAAEjtC,QAAAA,EAASmY,MAAOggB,EAAUuK,SAAUmK,EAAiBC,aAAAA,IACxEjtB,MAAM9b,IACH,GAAsB,WAAlBA,EAAOy1B,QAA4C,gBAArBz1B,EAAOuyB,UAA6B,CAElE,IAAIT,EACJ,GAFAH,EAAU6B,iBAAgB,GAEtB3xB,EAAMsuB,yBACN2B,EAAsBjwB,EAAMsuB,yBAAyBuE,8BAClD,GAAIvE,GAA4Bxd,EAAAA,gBAAgBC,YAAYud,GAA2B,CAC1F,MAAMC,EAAoBD,EAAyB7yB,MAC/C+yB,GAAYA,EAASC,eAAiB7M,EAAAA,aAAa0lB,SAEvDrX,EAAsB1B,MAAAA,OAAiB,EAAjBA,EAAmBsE,8BAEzC5C,OAAsBtzB,EAE1B,MAAM4qC,EAAyC,CAC3CjX,cAAe,mBACfG,iBAAkB,CAAEmD,OAAQz1B,EAAOy1B,OAAQlD,UAAWvyB,EAAOuyB,YAEjEZ,EAAUmB,iBAAiB,CACvBC,UAAW,YACXE,gBAAiB,GACjBK,YAAYpB,EAAAA,EAAAA,IACRkX,EACA9lB,EACA1nB,EACAF,EACAO,EACA61B,EACAgX,SAGL,CACHnX,EAAUmB,iBAAiB,CACvBG,gBAAiB,KAErB,MAAM2D,GAAgB5R,EAAAA,EAAAA,IAAW,OAAQtpB,EAAQgX,eACjD,QAAiBlU,IAAbwqC,GAA0BA,IAAaK,EAAAA,kBAAkBC,SACnC,YAAlBtpC,EAAOy1B,QAAwBmB,GAC/B9c,OAAO6kB,SAASp7B,OAAOqzB,QAExB,GAAIoS,IAAaK,EAAAA,kBAAkBE,UACtC5X,EAAU6B,iBAAgB,QACvB,GAAIwV,IAAaK,EAAAA,kBAAkBG,iBAAkB,CAAC,IAADC,EACxD,MAAMC,EAAuC,CACzCzS,UAAW,CACPzW,GAAI,CAAE7M,EAAG,kBAAmB8M,EAAG,EAAGyW,EAAG,GACrCtW,GAAI,CAAEjN,EAAG,kBAAmB8M,EAAG,EAAGyW,EAAG,GACrCC,GAAI,CAAExjB,EAAG,kBAAmB8M,EAAG,EAAGyW,EAAG,IAEzCE,UAAU,GAER3F,GAAmBqE,EAAAA,EAAAA,oBACrBn1B,EAAMjF,QAAQgQ,QAAQqqB,kBACtBp1B,EAAMgpC,aACNhpC,EAAMf,WAEJ+0B,EAAqC,CACvCC,aAAch5B,EAAUi5B,mBACxBC,qBAAsBl5B,EAAUm5B,2BAChCC,uBAAwBp5B,EAAUo5B,uBAClCC,kBAAmBr5B,EAAUs5B,qBAC7BC,qBAAsBv5B,EAAUw5B,8BAChCC,kBAAmBz5B,EAAU05B,wBAC7Bj5B,cAAeT,EAAUU,UACzBC,kBAAmBX,EAAUW,kBAC7BC,iBAAkBZ,EAAUY,iBAC5B+4B,kBAAmB35B,EAAU25B,mBAE3B3b,EAAe,IAAIgwB,EAAAA,wCACrBjpC,EAAMjF,QACNi5B,EACA+U,EACA/oC,EAAMjF,QAAQgQ,QAAQ6U,aACtBtkB,EACuB,QADhBwtC,EACP9oC,EAAM/D,KAAKk6B,oBAAY,IAAA2S,OAAA,EAAvBA,EAAyBzpC,OACzBo0B,EACAwC,EACAnF,EACA9wB,EAAMjE,GACNiE,EAAMhE,UAEVktC,EAAAA,qBAAqBC,WAAWC,gBAAgBnwB,QAI3DowB,OAAOrnC,IACAhC,EAAMf,YACNe,EAAMf,UAAUqqC,UAAUtnC,GAC1BhC,EAAMf,UAAUsqC,MAAM,wCAKzCF,OAAOrnC,IACAhC,EAAMf,YACNe,EAAMf,UAAU+C,MAAMA,EAAMw8B,SAC5Bx+B,EAAMf,UAAUsqC,MAAM,+BA1bhCC,CAAmBxpC,EAAOkB,EAAO8vB,IAgGpC,SAASyY,EACZzpC,EACAkB,EACA8vB,GAA2B,IAAA0Y,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAha,EAAAia,EAE3B,MAAM,KACFjuC,EACAuiB,OAAO,cAAEupB,GACT9sC,WAAW,UACPU,EAAS,kBACTC,EAAiB,iBACjBC,EAAgB,sBAChBsuC,EAAqB,mBACrBjW,EAAkB,2BAClBE,EAA0B,uBAC1BC,EAAsB,qBACtBE,EAAoB,8BACpBE,EAA6B,wBAC7BE,EAAuB,sCACvByV,GAEJrvC,SACIgQ,SAAWuqB,SAAS,uBAAE+U,GAA2B,CAAEA,4BAAwBxsC,MAE/EmC,EAGE1E,EAAUW,MAAAA,GAAa,QAATytC,EAAJztC,EAAMX,eAAO,IAAAouC,OAAA,EAAbA,EAAerqC,OACzB62B,EAAQj6B,MAAAA,GAAkB,QAAd0tC,EAAJ1tC,EAAMk6B,oBAAY,IAAAwT,OAAA,EAAlBA,EAAoBtqC,OAC5BsjB,EAAO1mB,MAAAA,GAAU,QAAN2tC,EAAJ3tC,EAAM0mB,YAAI,IAAAinB,OAAA,EAAVA,EAAYvqC,OACnB41B,EAAkBh5B,MAAAA,GAAqB,QAAjB4tC,EAAJ5tC,EAAMg5B,uBAAe,IAAA4U,OAAA,EAArBA,EAAuBxqC,OACzC8xB,EAAmD,QAAhC2Y,EAAG7tC,EAAKuzB,gCAAwB,IAAAsa,OAAA,EAA7BA,EAA+BzqC,OACrDsoC,EAAoC1rC,MAAAA,GAAkB,QAAd8tC,EAAJ9tC,EAAMuyB,oBAAY,IAAAub,GAAQ,QAARA,EAAlBA,EAAoB1qC,cAAM,IAAA0qC,GAEnE,QAFmEA,EAA1BA,EAA4BptC,MACjE6xB,GAPiC,oEAOFA,EAAapb,cAChD,IAAA22B,OAAA,EAFyCA,EAEvCrb,UACG4b,EAA8BruC,MAAAA,GAAiC,QAA7B+tC,EAAJ/tC,EAAMquC,mCAA2B,IAAAN,OAAA,EAAjCA,EAAmC3qC,OAEjEmzB,EAAoBl3B,MAAAA,GAAmB,QAAZ2uC,EAAP3uC,EAASssC,kBAAU,IAAAqC,OAAA,EAAnBA,EAAqB7yB,QAAOwvB,IAAS,IAAA2D,EAAA,QAA6B,QAAzBA,EAAC3D,EAAU7E,sBAAc,IAAAwI,GAAxBA,EAA0BlI,WAG1F3O,YAAY,gBAAEpB,EAAe,cAAED,EAAa,WAAEM,EAAU,UAAEP,GAAW,UACrEoY,EAAS,SACT/W,GACAvyB,GAEE,kBAAEupC,EAAiB,WAAEC,EAAU,YAAEC,GAxH3C,SACI5vC,EACA6vC,EACAzZ,EACA0Z,EACAC,GAKA,IAAIL,EACAC,EACAC,EAEAI,EAEJ,OAAKH,GAAgBE,EACV,CACHL,mBAAmB,EACnBC,WAAYG,EAAgBG,oBAC5BL,YAAaE,EAAgBI,6BAIjC9Z,IACA4Z,EAAkB5Z,EAAoBx0B,MAAK6rC,GAAUA,EAAO7Y,eAAiB7M,EAAAA,aAAa0lB,WAK1F0C,EAAAA,EAAAA,uBAAsBnwC,EAAQgX,eAC1Bof,GAAsC,QAAnBga,EAAIJ,SAAe,IAAAI,GAAfA,EAAiBC,oBACxCX,GAAoB,EACpBC,EAAaG,EAAgBG,oBAC7BL,EAAcE,EAAgBI,6BAE9BR,GAAoB,EACpBC,EAAaG,EAAgBQ,kCAC7BV,EAAcE,EAAgBS,qCAGlCb,GAAoB,EACpBC,EAAaG,EAAgBG,oBAC7BL,EAAcE,EAAgBI,4BAG3B,CACHR,kBAAAA,EACAE,YAAAA,EACAD,WAAAA,IAnB+C,IAADS,EA0FKI,CACnDvrC,EAAMjF,QACNiF,EAAMjF,QAAQ+c,IAAIjC,OAAO6qB,iBACzBvP,EACAnxB,EAAM/E,UACyC,YAA/C+E,EAAM/D,KAAKuzB,yBAAyBsF,QAAwB9iB,EAAAA,gBAAgBC,YAAYugB,IAG5F,IAAKl3B,IAAY0W,EAAAA,gBAAgBC,YAAY81B,GACzC,OAGJ,IAAK9S,IAAoBA,EAAgBS,gBACrC,OAKJ,GAAIiS,GAAqC2C,GACrC,IAhFqBkB,EACzBC,EACAC,KAEA,MAAMC,EAA2B,GASjC,OARAF,MAAAA,GAAAA,EAAwBpwC,KAAIuwC,IACxB,MAAMpD,EAASkD,MAAAA,OAAqB,EAArBA,EAAuB/uC,MAAKkvC,GAAgBA,IAAiBD,EAASjW,OAIrF,OAHI6S,GACAmD,EAAe1tC,KAAKuqC,GAEjBmD,KAGJ35B,EAAAA,gBAAgBC,YAAY05B,IAmE1BH,CAAqBvW,EAAgBS,gBAAiB4U,MAAAA,OAA2B,EAA3BA,EAA6BwB,yBACpF,YAED,IACFzB,IACApV,EAAgBS,gBAAgB/4B,MAAMgd,GAA2BA,EAAOgc,OAAS0U,IAElF,OAGJ,MAAMrW,EAAgB,CAClBC,aAAcC,EACdC,qBAAsBC,EACtBC,uBAAAA,EACAC,kBAAmBC,EACnBC,qBAAsBC,EACtBC,kBAAmBC,EACnBj5B,cAAeC,EACfC,kBAAAA,EACAC,iBAAAA,GAGEkwC,EAAiB7V,EACnBt7B,EAAAA,cAAC+8B,EAAAA,eAAc,CACX17B,KAAM,CAAEi6B,MAAAA,GACRn7B,QAASiF,EAAMjF,QACfgB,GAAIiE,EAAMjE,GACVC,SAAUgE,EAAMhE,SAChBN,cAAes4B,EAAct4B,cAC7BE,kBAAmBo4B,EAAcp4B,kBACjCC,iBAAkBm4B,EAAcn4B,mBAGpC,GAYEmwC,GAA0B,CAC5BjxC,QAASiF,EAAMjF,QACfN,UAAW,YACXsB,GAAIiE,EAAMjE,GACVC,SAAUgE,EAAMhE,SAChBC,KAAM,CAAEX,QAA2B,QAApB20B,EAAEjwB,EAAM/D,KAAKX,eAAO,IAAA20B,OAAA,EAAlBA,EAAoB5wB,OAAQ62B,MAA8B,QAAzBgU,EAAElqC,EAAM/D,KAAKk6B,oBAAY,IAAA+T,OAAA,EAAvBA,EAAyB7qC,QAC7E20B,cAAAA,EACAh5B,cAhByC,CACzCs7B,UAAW,CACPzW,GAAI,CAAE7M,EAAG,kBAAmB8M,EAAG,EAAGyW,EAAG,GACrCtW,GAAI,CAAEjN,EAAG,kBAAmB8M,EAAG,EAAGyW,EAAG,GACrCC,GAAI,CAAExjB,EAAG,kBAAmB8M,EAAG,EAAGyW,EAAG,IAEzCE,UAAU,GAWV7W,aAAc5f,EAAMjF,QAAQgQ,QAAQ6U,aACpCqsB,gBAAiBxY,EACjBsY,eAAAA,EACA9V,eAAe5R,EAAAA,EAAAA,IAAW,OAAQrkB,EAAMjF,QAAQgX,eAChDy4B,UAAAA,EACA0B,aAAclb,EAAU6B,iBAEtBsZ,GAAmBvxC,EAAAA,cAACwxC,EAAAA,MAAKzpC,OAAAC,OAAA,GAAKopC,KAEpC,MAAO,CACHpW,eAAgB,CACZn7B,UAAW,4BAGfstC,cAAeA,EAAc,GAE7BsE,sBAAuBhF,EAA0BrnC,EAAOkB,EAAO8vB,GAE/DrN,QAAS/oB,EAAAA,cAACspB,EAAAA,QAAO,CAACzpB,UAAU,mCAAmC21B,WAAW,KAAK51B,KAAM2vC,IAErFQ,YAAa/vC,EAAAA,cAAA,KAAGH,UAAU,wCAAwCkwC,GAClE2B,wBACI3E,IAAsC8C,EAClC7vC,EAAAA,cAAAA,EAAAA,SAAA,KACIA,EAAAA,cAAA,KAAGH,UAAU,wCAAwC2vC,GACrDxvC,EAAAA,cAAA,MAAIH,UAAU,kCAAiC,aAAa2vC,GACvDnV,EAAgBS,gBAAgBr6B,KAAKyR,GAE9BlS,EAAAA,cAAA,MAAIH,UAAU,yCAAwC,aAAaqS,EAAK0jB,YAAah1B,IAAKsR,EAAK6oB,MAC1F7oB,EAAK0jB,iBAM1B,KACRqM,OACIjiC,EAAAA,cAACy8B,EAAAA,GAAgB,CACb/E,gBAAiBA,EACjBD,cAAeA,EACfM,WAAYA,EACZ13B,UAAW+E,EAAM/E,UACjBq8B,UAAyB,gBAAdlF,IAInByD,OACIj7B,EAAAA,cAAA,UACIH,UAAU,kCACVsO,QAASs+B,EAA0BrnC,EAAOkB,EAAO8vB,GACjD5M,MAAM,YACNlhB,IAAKkkC,EAAyB,aAClBsD,EACZjlB,cAAmB5nB,IAAT8kB,GAAsB8nB,EAChCp3B,MAAOq3B,GAENA,GAITv4B,MAAOg6B,ulBClNf,MAAMI,UAAe3xC,EAAAA,cA0FjBmF,YAAmBC,EAAkCkB,GACjDjB,MAAMD,GAnFO,KAAAwsC,qBAA4C,IAAIC,EAAAA,mBAAyB,GAElF,KAAA5d,WAAuC,GACvC,KAAA6d,sBAAqC,IAAIC,IAEhC,KAAAC,gBAAoC,CACjDpQ,eAAiBqQ,IACb,MAAMnZ,EAAU91B,EAAA,GAAQwC,KAAKc,MAAMwyB,YAKnC,OAJAA,EAAWrB,mBAAgBx0B,EAC3B61B,EAAWf,gBAAa90B,EAExBuC,KAAKmF,SAAS,CAAEkuB,SAAUoZ,EAAanZ,WAAAA,KAChC,GAEXvB,iBAAmB2a,IACf1sC,KAAKmF,SAAS,CAAEmuB,WAAYoZ,KAEhCC,sBAAuBA,CACnBC,EACAC,EACAC,EACAC,KAEA/sC,KAAKmF,SAAS,CACVouB,gBAAiBqZ,EACjBxd,yBAA0Byd,EAC1BzX,uBAAwB2X,IAE5B/sC,KAAKgtC,aAAaF,IAEtBjM,oBAAsBuD,IACdA,GACApkC,KAAKssC,sBAAsBW,IAAI7I,IAGvC1D,uBAAwB1vB,MAAOk8B,EAA6BC,KAAmD,IAAAtgB,EAG3G,GAFA7sB,KAAKyuB,WAAWye,GAAuBC,EAEnCntC,KAAKssC,sBAAsBc,SAAwC,QAA9BvgB,EAAA7sB,KAAKJ,MAAM/D,KAAKX,QAAQ+D,cAAM,IAAA4tB,GAAY,QAAZA,EAA9BA,EAAgC2a,kBAAU,IAAA3a,OAAA,EAA1CA,EAA4CpgB,SAAU,GAC3F,OAAOzM,KAAKosC,qBACPiB,SAAQr8B,SACEhR,KAAKstC,sBAEfrE,OAAOrnC,IAEJ,GAAIA,IAAU2rC,EAAAA,wBAAwBC,gCAClC,MAAM5rC,MAK1Bw+B,gBAAiBA,CAAC92B,EAAuBzO,IAC9BmF,KAAKytC,iBAAiBnkC,EAAezO,GAEhD43B,gBAAkBib,IACd1tC,KAAKmF,SAAS,CAAEilC,UAAWsD,KAE/B/Y,wBAA0BnB,IACtBxzB,KAAKmF,SAAS,CAAEquB,oBAAAA,KAQpBsB,8BAAgCrB,IAC5BzzB,KAAKmF,SAAS,CAAEsuB,0BAAAA,KAGpBqK,iBAAmB6P,IAEf,MAAMra,EAAU91B,EAAA,GAAQwC,KAAKc,MAAMwyB,YACnCA,EAAWhB,uBAAoB70B,EAE/BuC,KAAKmF,SAAS,CAAEoxB,gBAAgB,EAAM9E,iBAAkBkc,EAAara,WAAAA,IACrEtzB,KAAKgtC,aAAahtC,KAAKc,MAAMi1B,aAAc4X,KAqLlC,KAAAC,yBAA4BC,GAAgC,KACzE,MAAMC,EAAeD,EAAmBE,wBAClCC,EAAUF,EAAaG,KAAOl1B,OAAOm1B,YACrCC,EAAUL,EAAaM,IAAMr1B,OAAOs1B,YAE1Ct1B,OAAOu1B,SAASN,EAASG,IAEZ,KAAAI,yCAA2C,KACxD,IAAIzf,GAAsC,EACP,IAAD0f,EAA9BxuC,KAAKJ,MAAM/D,KAAKuyB,eAChBU,GACuC,QAAnC0f,EAAAxuC,KAAKJ,MAAM/D,KAAKuyB,aAAanvB,cAAM,IAAAuvC,GAElC,QAFkCA,EAAnCA,EAAqCjyC,MACjCkyC,GAA4B,2DAAjBA,EAAQz7B,cACtB,IAAAw7B,OAAA,EAFDA,EAEGlgB,aAAa,GAExB,OAAOQ,GAwFM,KAAAwe,kBAAoBt8B,UACjC,MAAM9V,EAAU8E,KAAKJ,MAAM/D,KAAKX,QAAQ+D,OAElC8tB,EAAoB/sB,KAAKJ,MAAM/D,KAAKkxB,kBAAkB9tB,OAEtDshC,EAAuB3uB,EAAAA,gBAAgBC,YAAYkb,GAEzD,IAAK7xB,IAAYqlC,EACb,OAGJ,MAAMmO,EAAkBlxC,EAAA,GAAkCwC,KAAKyuB,YAK/D,GAHAzuB,KAAKmF,SAAS,CAAEquB,qBAAqB,EAAMC,2BAA2B,IAGlEzzB,KAAKc,MAAMwyB,WAAWf,YAAcvyB,KAAKc,MAAMwyB,WAAWrB,cAAe,CACzE,MAAM0c,EAAenxC,EAAA,GAAQwC,KAAKc,MAAMwyB,YACxCqb,EAAgBpc,gBAAa90B,EACW,cAApCuC,KAAKc,MAAMwyB,WAAWtB,YACtB2c,EAAgB1c,mBAAgBx0B,EAChCkxC,EAAgB3c,eAAYv0B,GAEhCuC,KAAKmF,SAAS,CAAEmuB,WAAYqb,IAIhC,IAAK,MAAMvzC,KAAOmH,OAAOmlC,KAAKgH,GACtB1uC,KAAKc,MAAMwyB,WAAWpB,gBAAgB92B,IACtC4E,KAAKmF,UAASypC,IACV,MAAMtb,EAAasb,EAActb,WAEjC,OADAA,EAAWpB,gBAAgB92B,QAAOqC,EAC3B,CAAE61B,WAAAA,MAKrB,MAAMz3B,EAAOmE,KAAK6uC,mBAAmBH,GAC/BI,QAA6CjzC,EAAKkzC,sBAExD,IAAKD,EACD,OAGJ,MAAME,EAA4B,CAC9BhvC,KAAKivC,iCAAiCH,EAAgBjzC,EAAKqzC,kBAC3DlvC,KAAKmvC,sBAAsBL,GAC3B9uC,KAAKovC,cAAcN,GACnB9uC,KAAKqvC,wBAAwBP,GAC7B9uC,KAAKsvC,yBAAyBR,UAG5B12B,QAAQm3B,IAAIP,IAgKL,KAAAvB,iBAAmB,CAACnkC,EAAuBzO,KAAuC,IAAA20C,EAC/F,MAAMjJ,EAA2C,QAAjCiJ,EAAGxvC,KAAKJ,MAAM/D,KAAKX,QAAQ+D,cAAM,IAAAuwC,OAAA,EAA9BA,EAAgCnd,WAEnD,OAAQ/oB,GACJ,KAAK,EACD,OAAOzO,EAAUqmB,0BACrB,KAAK,EACD,OAAOrmB,EAAU40C,kCACrB,KAAK,EACD,OAAO50C,EAAUsmB,yBACrB,KAAK,EACD,OAAOolB,EAAa1rC,EAAU60C,2BAA6B70C,EAAUumB,0BACzE,QACI,MAAO,KArffphB,KAAKc,MAAQ,CACTwyB,WAAY,CACRpB,gBAAiB,IAErBmB,SAAU,EACVnwB,SAAKzF,EACL0F,SAAK1F,EACL81B,qBAAiB91B,EACjBs4B,kBAAct4B,EACd23B,4BAAwB33B,EAExB2sC,WAAW,EACX5W,qBAAqB,EACrBC,2BAA2B,EAC3Bkc,kBAAkB,GAEtB3vC,KAAK0wB,kBAAmBqE,EAAAA,EAAAA,oBAAmBn1B,EAAMjF,QAAQgQ,QAAQqqB,kBAAoBp1B,EAAMgpC,aAAchpC,EAAMf,WAG5G,0BACH,MACIhD,MACIX,SAAW+D,OAAQ/D,GAAS,aAC5B66B,GACH,QACDp7B,GACAqF,KAAKJ,MAMTI,KAAKmF,SAAS,CAAEwqC,kBAAkB,IAElC5Z,EAAahb,MAAK/J,MAAAA,IACdhR,KAAKgtC,aAAa/tC,MAGlB/D,IAEIA,EAAQ00C,gBAAkBC,EAAAA,oBAAoBC,SAC9C9vC,KAAKmF,SAAS,CAAEuuB,eAAe,UAE7B1zB,KAAKsvC,yBAAyBp0C,IAGpCA,GAAWP,EAAQ+c,IAAIjC,OAAOs6B,4BAA8B,GAC5DC,EAAAA,GAAoBjH,SAAS/oC,KAAKJ,MAAMjF,QAASA,EAAQ+c,IAAIjC,OAAOs6B,4BAA6B70C,EAAQmI,UAI1G9B,SAAM,IAAA0uC,EAAAC,EAAAC,EAAAC,EAAAC,EACT,MACIjyB,OAAO,aAAEkyB,EAAY,wBAAEt1C,GACvBa,MACIX,SAAW+D,OAAQ/D,IAEvBua,QAAQ,UAAEpb,EAAY,KACtB2F,KAAKJ,OAEH,IAAEsD,EAAG,IAAEC,GAAQnD,KAAKc,MAE1B,IAAK5F,EAED,OADA8E,KAAKJ,MAAMjF,QAAQkE,UAAU+C,MAAM,gDAC5B,KAGX,MAAMhC,EAAQI,KAAKJ,MAKbkhC,EADU9gC,KAAKJ,MAAMjF,QACI+c,IAAIjC,OAAOqrB,eACpCO,EAA+BzvB,EAAAA,gBAAgB2+B,QACjD3+B,EAAAA,gBAAgB4+B,YAAoD,QAAzCP,EAACjwC,KAAKJ,MAAM/D,KAAKkxB,kBAAkB9tB,cAAM,IAAAgxC,OAAA,EAAxCA,EAA0Ch1C,KAAI4H,GAASA,EAAMw+B,iCAEvFoP,EAEa,QADfP,EAA6B,QAA7BC,EAACnwC,KAAKJ,MAAM/D,KAAKuyB,oBAAY,IAAA+hB,GAAQ,QAARA,EAA5BA,EAA8BlxC,cAAM,IAAAkxC,GAAyF,QAAzFA,EAApCA,EAAsC5zC,MAAK6xB,GAAgBA,EAAapb,OAAS4rB,EAAAA,YAA4C,IAAAuR,OAAA,EAA7HA,EACK7hB,iBAAS,IAAA4hB,GAAAA,GAEgE,QADtEE,EACyB,QADzBC,EACRrwC,KAAKJ,MAAM/D,KAAK+jC,yBAAiB,IAAAyQ,GAAQ,QAARA,EAAjCA,EAAmCpxC,cAAM,IAAAoxC,OAAA,EAAzCA,EAA2CK,2CAAmC,IAAAN,GAAAA,EAC7Ezd,GACD/gB,EAAAA,gBAAgBC,YAAYwvB,IAC7BA,EAA6BsP,MAAM9tC,IACJm/B,EAAAA,EAAAA,yCACvBn/B,EACAi+B,KAE0BsB,EAAAA,qBAAqBC,aAErDxxB,GAAYC,EAAAA,EAAAA,IAAa9Q,KAAKJ,MAAMjF,QAAQgQ,UAClD4jB,EAAAA,EAAAA,mBAAkB1d,GAElB,MAAMoc,EAASzvB,EAAAA,EAAA,GACPwC,KAAKJ,OAAmC,IAC5CkB,MAAOd,KAAKc,MACZwvC,aAAcA,GAAgBA,EAAa7jC,OAAS,EAAI6jC,EAAa,QAAK7yC,EAC1EmzC,YAAa,CACTnyB,YAAaze,KAAKJ,MAClBvF,UAAWqP,GAAAA,CAAW,YAAarP,IAEvCw2C,0BAA2B,CACvBx2C,UAAW,sBAEfy2C,2BAA4B,CACxBz2C,UAAW,4BAEfq2B,iBAAkB1wB,KAAK0wB,iBACvBE,UAAW5wB,KAAKwsC,gBAChBv5B,OAAO0c,EAAAA,EAAAA,IAAsB/vB,GAC7B2qC,aAAata,EAAAA,EAAAA,IAA4BrwB,GACzCmxC,iBAAkB/wC,KAAKgxC,gCACvBC,eAAe5gB,EAAAA,EAAAA,IAA8BzwB,GAC7CsxC,WAAWlR,EAAAA,EAAAA,GAA0BpgC,EAAOI,KAAKc,MAAOd,KAAKwsC,iBAC7D2E,YAAa9H,EAAqBrpC,KAAKJ,MAAOI,KAAKc,MAAOd,KAAKwsC,iBAC/D1W,OAAOqB,EAAAA,EAAAA,IAAsBv3B,EAAOI,KAAKc,OACzCswC,WAAW1e,EAAAA,EAAAA,IACP9yB,EACAI,KAAKc,MACLd,KAAKwsC,gBAnDoB,GACA,SAqDzB/uC,EACAk1B,GAEJ33B,wBAAyB4W,EAAAA,gBAAgBC,YAAY7W,IAC/CogC,EAAAA,EAAAA,IACIpgC,EAAwB,GACxBE,GACA4V,EAAAA,EAAAA,IAAa9Q,KAAKJ,MAAMjF,QAAQgQ,SAChC3K,KAAKc,YAETrD,EACN4zC,oBAAoB3W,EAAAA,EAAAA,IAChB96B,EACAI,KAAKc,MACLd,KAAKwsC,gBACLxsC,KAAKuuC,2CACL19B,GAEJygC,eAAehW,EAAAA,EAAAA,IAA8B17B,EAAOI,KAAKc,MAAOd,KAAKwsC,iBACrE/zB,QAAS7Y,EAAMjF,QAAQ+c,IAAIjC,OAAO87B,aAAcvZ,EAAAA,EAAAA,IAAuBp4B,GACvEyzB,SAAUn4B,EAAQm3B,gBAAa50B,GAAY4+B,EAAAA,EAAAA,IAAyBz8B,EAAOI,KAAKc,MAAOd,KAAKwsC,iBAC5FgF,gBAAgBxiB,EAAAA,EAAAA,IAAwBpvB,GACxC6xC,gBACIzxC,KAAKJ,MAAM6V,OAAOi8B,yBAA2Bx2C,EAAQm3B,YAC/CsK,EAAAA,EAAAA,IAA2B/8B,EAAOm9B,EAAAA,EAAuBC,YACzDv/B,EACVk0C,uBACI3xC,KAAKJ,MAAM6V,OAAOm8B,+BAAiC12C,EAAQm3B,YACrDsK,EAAAA,EAAAA,IAA2B/8B,EAAOm9B,EAAAA,EAAuB3M,kBACzD3yB,EACVo0C,WACI7xC,KAAKJ,MAAM6V,OAAOq8B,kBAAoB9xC,KAAKc,MAAM21B,uBAC3CuH,EAAAA,EAAAA,IAAoBp+B,EAAOI,KAAKc,MAAOd,KAAKwsC,sBAC5C/uC,EACVs0C,wBAAwBxT,EAAAA,EAAAA,IAA0B3+B,EAAOI,KAAKc,OAC9DoC,IAAKutC,EAA4BvtC,EAAM,EACvCC,IAAAA,EACAstC,0BAA2BA,EAC3BuB,wCAAyChyC,KAAKuuC,2CAC9C0D,iBAAkBphC,EAClBqhC,SAAUlyC,KAAKmyC,wBAAwBthC,KAG3C,OAAO7Q,KAAKJ,MAAMyf,WAAW4N,GA0BzB+jB,gCAEJ,IAAKhxC,KAAKJ,MAAMjF,QAAQ+c,IAAIjC,OAAO28B,sBAC/B,OAAO,KAGX,IAAKC,EAAAA,GAAiBl1B,UAClB,OAAO,KAGX,MAAMm1B,EAAsBC,MAAMC,KAAKrrC,SAASsrC,uBAAuBzmB,EAAAA,aAAa3xB,YAEpF,OAAKuX,EAAAA,gBAAgBC,YAAYygC,GAK7B93C,EAAAA,cAACmU,EAAAA,OAAM,CACHtU,UAAU,kCACV4Y,MAAOjT,KAAKJ,MAAM/E,UAAU63C,qBAC5B/pC,QAAS3I,KAAK4tC,yBAAyB0E,EAAoB,KAE1DtyC,KAAKJ,MAAM/E,UAAU63C,sBATnB,KAcP1F,aAAaF,GAAiG,IAA7Da,EAAAgF,UAAAlmC,OAAA,QAAAhP,IAAAk1C,UAAA,GAAAA,UAAA,GAAkC3yC,KAAKc,MAAM2wB,iBAC9FzxB,KAAKc,MAAM21B,uBAAyBqW,IACpCA,EAAS8F,wBAA0BjF,GAEvC3tC,KAAKmF,SAAS,CAAE4wB,aAAc+W,IAG1B+B,mBAAmBH,GACvB,MACI7yC,MACIX,SAAW+D,OAAQ/D,IAEvBP,SAAS,cACLgX,EACAhH,SACID,aAAa,UAAEmoC,MAGvB7yC,KAAKJ,MAMHsvC,EAJoBlvC,KAAKJ,MAAM/D,KAAKkxB,kBAAkB9tB,OAKvDhE,KAAIurC,IAAY,IAAArsC,EAAA24C,EAAAC,EAAAC,EACb,MAAMvkB,EACuB,QADbt0B,EAA0C,QAA1C24C,EAAItM,EAAUnF,oCAA4B,IAAAyR,EAAAA,EACtDtM,EAAUlF,uBAAe,IAAAnnC,EAAAA,EACzB,GACJ,MAAO,CACHgnC,mBAAoBqF,EAAUrF,mBAC9BQ,eAGqB,QAHPoR,EAGT,QAHSC,EACVvkB,EAAWlyB,MACPsG,IAAK,IAAA0+B,EAAA,OAAwB,QAApBA,EAAA1+B,EAAM8+B,sBAAc,IAAAJ,OAAA,EAApBA,EAAsBl+B,SAAS4I,cAAeyiC,EAAmBlI,EAAUrF,8BACvF,IAAA6R,OAAA,EAFDA,EAEGrR,sBAAc,IAAAoR,EAAAA,EAAIvM,EAAU7E,eACnCsR,oBAAqBzM,EAAUyM,wBAGtCj8B,QAAOwvB,GAAaA,EAAU7E,kBACnCuR,EAAAA,EAAAA,2BAA0BlzC,KAAKJ,MAAMjF,QAAQgX,cAAcmH,eAAevC,IAAImQ,WAAYwoB,GAI1F,MAAMiE,GAAyBC,EAAAA,EAAAA,oBAC3B,IAAIC,EAAAA,qBACAn4C,EAASo4C,gBAAkBp4C,EAASo4C,gBAAkBp4C,EAASmI,SAC/DwvC,OACAp1C,OACAA,EACAuC,KAAKJ,MAAMjF,QAAQgQ,SAEvBgH,GAIJ,OAFA3R,KAAKmF,SAAS,CAAEouB,gBAAiB4f,IAE1B,CAAEpE,sBAAuBoE,EAAwBjE,iBAAAA,GA0DpD,uCACJJ,EACAI,SAQMqE,EAAAA,EAAAA,iCACF,IAAIC,EAAAA,qCACA1E,EAAewE,gBAAkBxE,EAAewE,gBAAkBxE,EAAezrC,SACjFrD,KAAKJ,MAAMjF,QAAQgQ,QAAQD,YAAYmoC,UACvC3D,EACAlvC,KAAKJ,MAAMjF,QAAQgQ,SAEvB3K,KAAKJ,MAAMjF,QAAQgX,eAInB,4BAA4Bm9B,GAA6B,IAAA2E,EAG7D,MAAMC,QAA6BC,EAAAA,EAAAA,4CAC/B,IAAIC,EAAAA,6CACA9E,EAAezrC,SACfrD,KAAKJ,MAAMjF,QAAQgQ,QAAQD,YAAYmoC,UACvC/D,GAEJ9uC,KAAKJ,MAAMjF,QAAQgX,eAGjBkiC,EAAsBH,MAAAA,OAAoB,EAApBA,EAAsBn3C,MAG7C+yB,GAAoCA,EAASC,eAAiB7M,EAAAA,aAAa4M,YAEzB,QAA5BmkB,EAAG3E,EAAetH,kBAAU,IAAAiM,OAAA,EAAzBA,EAA2Bl3C,MACrDiqC,IAAS,IAAA2D,EAAA,OAC4B,IAAjC3D,EAAUrF,oBAA4BqF,EAAU7E,gBAAoE,YAApB,QAA9BwI,EAAA3D,EAAU7E,eAAeM,aAAK,IAAAkI,OAAA,EAA9BA,EAAgCvtB,mBAGtG5c,KAAKmF,SAAS,CAAEsxB,uBAAuB,IAEvCz2B,KAAKmF,UAASypC,IACV,MAAMtb,EAAasb,EAActb,WAEjC,OADAA,EAAWhB,uBAAoB70B,EACxB,CAAEg5B,uBAAuB,EAAOF,gBAAgB,EAAOjD,WAAAA,MAIlEugB,EACA7zC,KAAKmF,SAAS,CAAEiqB,yBAA0BykB,IAE1C7zC,KAAKmF,SAAS,CAAEiqB,8BAA0B3xB,IAI1C,oBAAoBqxC,GAIxB,IAAK9uC,KAAKc,MAAM6uC,iBAEZ,YADA3vC,KAAKmF,SAAS,CAAEwqC,kBAAkB,IAKtC,MAAM7C,QAAiBgH,EAAAA,EAAAA,4BACnB,IAAIC,EAAAA,6BAA6BjF,EAAezrC,SAAUrD,KAAKJ,MAAMjF,QAAQgQ,QAAQD,YAAYmoC,UAAW/D,GAC5G9uC,KAAKJ,MAAMjF,QAAQgX,eAGnBm7B,GACA9sC,KAAKgtC,aAAaF,GAIlB,8BAA8BgC,GAA6B,IAAAkF,EAC/D,MAAMC,EAAsE,QAAtCD,EAAGh0C,KAAKJ,MAAM/D,KAAKuyB,aAAanvB,cAAM,IAAA+0C,OAAA,EAAnCA,EAAqCz3C,MAC1E6xB,GAAsC,oEAAtBA,EAAapb,OAI3B+5B,QAA2BmH,EAAAA,EAAAA,sCAC7B,IAAIC,EAAAA,0CACArF,EAAezrC,SACfrD,KAAKJ,MAAMjF,QAAQgQ,QAAQD,YAAYmoC,UACvC/D,OACArxC,EACAw2C,MAAAA,OAAgC,EAAhCA,EAAkC3lB,WAEtCtuB,KAAKJ,MAAMjF,QAAQgX,eAGnBo7B,GACA/sC,KAAKmF,SAAS,CAAEiwB,uBAAwB2X,IAIxC,+BAA+B7xC,GACnC,MAAMw7B,QAA4C12B,KAAK22B,uCACjDyd,QAAsCp0C,KAAK42B,iCAE3C1zB,EAAclD,KAAKq0C,+BAA+B3d,EAAqCx7B,GACvFiI,EAAcnD,KAAKs0C,+BACrBF,GAAiC1d,EACjCx7B,GAEJ,IAAIm4B,EAAmBrzB,KAAKu0C,aAAar5C,EAASw7B,GAClDrD,EAAWxX,KAAK1Y,IAAIkwB,EAAUnwB,GAE9BlD,KAAKmF,SAAS,CACVjC,IAAAA,EACAC,IAAAA,EACAkwB,SAAAA,IAIAghB,+BAA+B3d,EAA8Cx7B,GAAsB,IAAAs5C,EACvG,OAAI9d,GAAAA,MAAuCx7B,GAAiB,QAAVs5C,EAAPt5C,EAASu5C,gBAAQ,IAAAD,GAAjBA,EAAmBE,iBAAmBx5C,EAAQu5C,SAASC,gBAAkB,EACzGx5C,EAAQu5C,SAASC,gBAGrB,EAGHJ,+BAA+BK,EAAyCz5C,GAAsB,IAAA05C,EAClG,OAAID,GAAAA,MAAkCz5C,GAAiB,QAAV05C,EAAP15C,EAASu5C,gBAAQ,IAAAG,GAAjBA,EAAmBC,iBAAmB35C,EAAQu5C,SAASI,gBAAkB,EACpG35C,EAAQu5C,SAASI,iBAGrBC,EAAAA,EAAAA,kCAAiC90C,KAAKJ,MAAMjF,QAAQ+c,IAAIjC,OAAOkwB,4BAGlE4O,aAAar5C,EAAwBw7B,GAA4C,IAAAqe,EAAAC,EAAAC,EACrF,MAAM,SAAE5hB,GAAarzB,KAAKc,MAC1B,IAAIo0C,EAAkB,EAEtB,GAAI7hB,IAAa6hB,IAAoBxe,EACjC,OAAOrD,EAGX,MAAMuM,EAAoB5/B,KAAKJ,MAAM/D,KAAK+jC,kBAE1C,OAD2G,QAAjEmV,EAAGnV,MAAAA,GAAyB,QAARoV,EAAjBpV,EAAmB3gC,cAAM,IAAA+1C,OAAA,EAAzBA,EAA2BtE,2CAAmC,IAAAqE,GAAAA,GAKvG75C,MAAAA,GAAiB,QAAV+5C,EAAP/5C,EAASu5C,gBAAQ,IAAAQ,GAAjBA,EAAmBE,iBAAmBj6C,EAAQu5C,SAASU,gBAAkB,IACzED,EAAkBh6C,EAAQu5C,SAASU,iBAGhCD,GAPI7hB,EA2BP,6CAA0C,IAAA4L,EAAAC,EAC9C,MAAMC,QAAwBn/B,KAAKJ,MAAM/D,KAAKuyB,aAK9C,KAH6B+Q,MAAAA,GAE5B,QAF2CF,EAAfE,EAAiB5iC,MAC1C6xB,GAAgBA,EAAapb,OAAS4rB,EAAAA,YACzC,IAAAK,OAAA,EAF4BA,EAE1B3Q,WAEC,OAAO,EAMX,GAJ+B6Q,MAAAA,GAE9B,QAF6CD,EAAfC,EAAiB5iC,MAC5C6xB,GAAgBA,EAAapb,OAAS8rB,EAAAA,YACzC,IAAAI,OAAA,EAF8BA,EAE5B5Q,UAEyB,CAAC,IAAD8mB,EACxB,MAAM/V,EAA4D,QAArB+V,EAAGp1C,KAAKJ,MAAMjF,eAAO,IAAAy6C,GAAS,QAATA,EAAlBA,EAAoBzqC,eAAO,IAAAyqC,GAAK,QAALA,EAA3BA,EAA6B19B,WAAG,IAAA09B,GAAU,QAAVA,EAAhCA,EAAkC9V,gBAAQ,IAAA8V,OAAA,EAA1CA,EAA4C7V,iCAC5F,GAAgD,SAA5CF,EACA,OAAO,EAGX,GAAgD,QAA5CA,EACA,OAAO,EAEX,IAAIG,EACJ,IACIA,QAAqBx/B,KAAKJ,MAAM/D,KAAK8yB,oBACvC,MAAO/sB,GAGL,OAFA5B,KAAKJ,MAAMf,UAAUw2C,YAAYzzC,GACjC5B,KAAKJ,MAAMf,UAAUsqC,MAAM,0EACpB,EAGX,OACI3J,IAC8C,QAA5CH,GAAqDG,EAAaC,OACnB,QAA5CJ,IAAsDG,EAAaC,OAEzE,CAAC,IAADE,EACH,MAAMC,QAA0B5/B,KAAKJ,MAAM/D,KAAK+jC,kBAChD,QAA+C,QAAxCD,EAAEC,MAAAA,OAAiB,EAAjBA,EAAmBC,2BAAmB,IAAAF,GAAAA,IAI/CwS,wBAAwBthC,GAAiB,IAAAykC,EAC7C,MAAMpD,EAAmC,QAA3BoD,EAAGt1C,KAAKJ,MAAM/D,KAAKq2C,gBAAQ,IAAAoD,GAAQ,QAARA,EAAxBA,EAA0Br2C,cAAM,IAAAq2C,OAAA,EAAhCA,EAAkCt+B,QAAOtK,GAAQA,EAAKrJ,WAAawN,IACpF,IAAIe,EAAAA,gBAAgBC,YAAYqgC,IAAsC,IAAzBA,EAAS,GAAG7uC,SAIzD,OAAO6uC,EAGH,uCAAoC,IAAApS,EACxC,MAAMX,QAAwBn/B,KAAKJ,MAAM/D,KAAKuyB,aAExC2R,EAAoCZ,MAAAA,GAEzC,QAFwDW,EAAfX,EAAiB5iC,MACvD6xB,GAAgBA,EAAapb,OAAS6rB,EAAAA,YACzC,IAAAiB,OAAA,EAFyCA,EAEvCxR,UAEH,OAAOyR,MAAAA,GAAAA,GAIf,yGC/vBA,MAkDMwV,EAAoBnE,IACtB,MAAM,eAAE5b,EAAc,WAAEwB,EAAU,OAAEvB,GAAW2b,EAE/C,OACI52C,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKgzB,GACLwB,EACAvB,IAKP+f,EAA6BnE,IAC/B,MAAM,eAAE7b,EAAc,WAAEwB,EAAU,OAAEvB,GAAW4b,EAE/C,OACI72C,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKgzB,GACLwB,EACAvB,IAKPggB,EAAwBnE,IAC1B,MAAM,eAAE9b,EAAc,WAAEwB,EAAU,OAAEvB,GAAW6b,EAE/C,OACI92C,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKgzB,GACLwB,EACAvB,IAKPigB,EAAoBxE,IACtB,MAAM,eAAE1b,EAAc,UAAEyN,GAAciO,EAEtC,OAAO12C,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKgzB,GAAiByN,EAAUhoC,IAAI06C,KAG9CC,EAAsBC,IACxB,GAAKA,GAAsC,IAAvBA,EAAYppC,OAIhC,OAAOjS,EAAAA,cAAAA,EAAAA,SAAA,KAAGq7C,EAAY,KAGpBF,EAA4BpS,IAC9B,MAAM,eAAE/N,EAAc,oBAAE8G,EAAmB,QAAE/Y,EAAO,OAAEkZ,EAAM,OAAEkH,GAAWJ,EAEzE,OACI/oC,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKgzB,GACNh7B,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK85B,GACL/Y,EACAkZ,GAEJkH,IAKPmS,EAAsB3E,IACxB,MAAM,eAAE3b,EAAc,cAAEmS,EAAa,QAAEpkB,EAAO,YAAEgnB,EAAW,OAAE9N,EAAM,OAAEhH,EAAM,MAAE1jB,EAAK,wBAAEm6B,GAA4BiF,EAEhH,OACI32C,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKgzB,GACLmS,EACApkB,EACA2oB,EACA3B,EACA9N,EACAhH,EACA1jB,IAKPgkC,EAAmB1iB,IACrB,MAAM,eAAEmC,EAAc,oBAAE8G,EAAmB,QAAE/Y,EAAO,MAAE7c,EAAK,OAAE+1B,GAAWpJ,EAExE,OACI74B,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKgzB,GACNh7B,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK85B,GACL/Y,EACAkZ,GAEJ/1B,IAKPsvC,EAAqBnE,IACvB,MAAM,eAAErc,EAAc,oBAAE8G,EAAmB,QAAE/Y,EAAO,MAAE7c,GAAUmrC,EAEhE,OACIr3C,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKgzB,GACNh7B,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK85B,GAAsB/Y,GAC/B7c,IAKPuvC,EAA0BC,IAC5B,MAAM,eAAE1gB,EAAc,OAAEiH,EAAM,MAAE/1B,GAAUwvC,EAE1C,OACI17C,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKgzB,GACLiH,EACA/1B,IAIb,EAlK+C9G,IAC3C,MAAM,YACFgxC,EAAW,2BACXE,EAA0B,0BAC1BD,EAAyB,UACzBO,EAAS,mBACTC,EAAkB,cAClBC,EAAa,UACbJ,EAAS,YACT3G,EAAW,YACX4G,EAAW,SACX9d,EAAQ,MACRyC,EAAK,MACL7iB,EAAK,OACLwF,EAAM,eACN+4B,EAAc,gBACdC,EAAe,WACfI,EAAU,uBACVF,EAAsB,cACtBV,EAAa,wBACbj2C,GACA4E,EAEJ,OACIpF,EAAAA,cAACimB,EAAAA,OAAMle,OAAAC,OAAA,GAAKouC,GACRp2C,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKsuC,GAA6BlxC,EAAM0wC,cAC7C91C,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKquC,GACL59B,EACA6iB,EACAmb,EACArxC,EAAMmxC,iBACNxG,EACA9xB,EACAy4B,GAAawE,EAAiBxE,GAC9BW,GAAcmE,EAAkBnE,GAChCxe,GAAY0iB,EAAgB1iB,GAC5Bme,EACAJ,GAAamE,EAAiBnE,GAC9BD,GAAe2E,EAAmB3E,GAClCE,GAAsBmE,EAA0BnE,GAChDC,GAAiBmE,EAAqBnE,GACtCsE,EAAmBh2C,EAAMwe,OAASxe,EAAMwe,MAAMy3B,aAC9C76C,EACAy2C,GAAmBwE,EAAuBxE,GAC1CE,GAA0BsE,EAAuBtE,6RCnD3D,SAASwE,EACZx7C,EACAy7C,EACAC,EACAC,GAAqB,IAAAC,EAErB,OAAK57C,MAAAA,GAAY,QAAL47C,EAAP57C,EAAS+c,WAAG,IAAA6+B,GAAQ,QAARA,EAAZA,EAAc9gC,cAAM,IAAA8gC,GAApBA,EAAsBC,kBAGvBJ,EACOE,EAHAD,ECXRrlC,eAAeylC,EAClBx6B,EACA42B,EACAlhC,EACA/W,EACA24B,GAEA,MAAM1iB,GAAYC,EAAAA,EAAAA,IAAaa,EAAcmH,gBACvC49B,EAAc,IAAIC,EAAAA,sCAAsC16B,EAAW42B,EAAWtf,EAAiB1iB,GAErG,OAAO+lC,EAAAA,EAAAA,qCAAoCF,EAAa/kC,GACnDoJ,MAAK87B,GACEA,EACOz+B,QAAQm3B,IAAIsH,EAAe57C,KAAI+V,MAAAA,GAgBtDA,eAAyC8lC,EAA8Bl8C,GACnE,MAAMm8C,EAAY,CACdC,IAAKF,EAAcG,KAAO,GAC1BC,QAASJ,EAAcK,SAAW,IAGtC,GAAsB,KAAlBJ,EAAUC,IACV,MAAO,CAACD,GAAW,GAGvB,OAAO,IAAI3+B,SAA+BC,IACtC,IACI,MAAM++B,EAAO,IAAIC,eACjBD,EAAKE,KAAK,OAAQP,EAAUC,KAAK,GAEjCI,EAAKh6B,iBAAiB,QAAQ,KAC1B/E,EAAQ,CAAC0+B,EAA2B,MAAhBK,EAAK1iB,QAAkC,MAAhB0iB,EAAK1iB,YAGpD0iB,EAAKh6B,iBAAiB,SAAS,KAC3B/E,EAAQ,CAAC0+B,GAAW,OAGxBK,EAAKG,OACP,MAAAC,GACEn/B,EAAQ,CAAC0+B,GAAW,QAzC6CU,CAA0BX,MAAgC/7B,MACnH28B,GACWA,EAAM1gC,QAAO2gC,GAAQA,EAAK,KAAI18C,KAAI08C,GAAQA,EAAK,OAI3D,KAEV1O,OAAMrnC,IACH+P,EAAc9S,UAAUqqC,UAAUtnC,GAClC+P,EAAc9S,UAAUsqC,MAAM,sDACvB,ylBCgJnB,MAAMyO,UAAkBp9C,IAAAA,UAuGpBmF,YAAmBC,GACfC,MAAMD,GAhGO,KAAAwsC,qBAA4C,IAAIC,EAAAA,mBAAyB,GAElF,KAAA5d,WAAuC,GAEvC,KAAA6d,sBAAqC,IAAIC,IAMhC,KAAAsL,mBAAuC,CACpDzb,eAAiBqQ,IACb,MAAMnZ,EAAU91B,EAAA,GAAQwC,KAAKc,MAAMwyB,YAKnC,OAJAA,EAAWrB,mBAAgBx0B,EAC3B61B,EAAWf,gBAAa90B,EAExBuC,KAAKmF,SAAS,CAAEkuB,SAAUoZ,EAAanZ,WAAAA,KAChC,GAEXvB,iBAAmB2a,IACf1sC,KAAKmF,SAAS,CAAEmuB,WAAYoZ,KAEhCC,sBAAuBA,CACnBC,EACAC,EACAC,EACAC,KAEA/sC,KAAKmF,SAAS,CACVouB,gBAAiBqZ,EACjBxd,yBAA0Byd,EAC1BzX,uBAAwB2X,IAE5B/sC,KAAKgtC,aAAaF,IAEtBjM,oBAAsBuD,IACdA,GACApkC,KAAKssC,sBAAsBW,IAAI7I,IAGvC1D,uBAAwB1vB,MAAOk8B,EAA6BC,KAAmD,IAAA2K,EAG3G,GAFA93C,KAAKyuB,WAAWye,GAAuBC,EAEnCntC,KAAKssC,sBAAsBc,QAA4B,QAAxB0K,EAAK93C,KAAKivB,sBAAc,IAAA6oB,GAAS,QAATA,EAAnBA,EAAqB58C,eAAO,IAAA48C,GAAY,QAAZA,EAA5BA,EAA8BtQ,kBAAU,IAAAsQ,OAAA,EAAxCA,EAA0CrrC,QAC9E,OAAOzM,KAAKosC,qBACPiB,SAAQr8B,SACEhR,KAAKstC,sBAEfrE,OAAOrnC,IAEJ,GAAIA,IAAU2rC,EAAAA,wBAAwBC,gCAClC,MAAM5rC,MAK1Bw+B,gBAAiBA,CAAC92B,EAAuBzO,IAC9BmF,KAAKytC,iBAAiBnkC,EAAezO,GAEhD43B,gBAAkBib,IACd1tC,KAAK+3C,wBAETpjB,wBAA0BnB,IACtBxzB,KAAKmF,SAAS,CAAEquB,oBAAAA,KAEpBsK,iBAAmB6P,IAEf,MAAMra,EAAU91B,EAAA,GAAQwC,KAAKc,MAAMwyB,YACnCA,EAAWhB,uBAAoB70B,EAE/BuC,KAAKmF,SAAS,CAAEoxB,gBAAgB,EAAM9E,iBAAkBkc,EAAara,WAAAA,IACrEtzB,KAAKgtC,aAAahtC,KAAKc,MAAMi1B,aAAc4X,KAIlC,KAAAqK,4BAA8C,CAC3D9hB,UAAW,CACPzW,GAAI,CAAE7M,EAAG,kBAAmB8M,EAAG,EAAGyW,EAAG,GACrCxW,GAAI,CAAE/M,EAAG,kBAAmB8M,EAAG,EAAGyW,EAAG,GACrCvW,GAAI,CAAEhN,EAAG,kBAAmB8M,EAAG,EAAGyW,EAAG,GACrCtW,GAAI,CAAEjN,EAAG,YAAa8M,EAAG,EAAGyW,EAAG,IAEnCE,UAAU,EACV4hB,iBAAiB,GAGJ,KAAAC,8BAAgD,CAC7DhiB,UAAW,CACPzW,GAAI,CAAE7M,EAAG,YAAa8M,EAAG,IAAKyW,EAAG,GACjCtW,GAAI,CAAEjN,EAAG,YAAa8M,EAAG,IAAKyW,EAAG,IAErCE,UAAU,EACV4hB,iBAAiB,GAmJJ,KAAAE,uBAA0Bj9C,IACvC,MAAM,OAAEua,GAAWzV,KAAKJ,MAClBw9B,GAAUC,EAAAA,EAAAA,kBAAiB,QAASr9B,KAAK0wB,iBAAkBuM,EAAAA,kBAAkBmb,WAAY,IACzFC,GAAa9a,EAAAA,EAAAA,wBAAuBv9B,KAAK0wB,iBAAkB0M,GAEjE,OACI5iC,IAAAA,cAACmU,EAAAA,OAAMpM,OAAAC,OAAA,CACHnI,UAAU,iCACVsO,SAAS2vC,EAAAA,EAAAA,kBAAiBt4C,KAAK0wB,iBAAkB0M,EAASH,EAAAA,kBAAkBmb,aACxEC,EAAU,cACF5iC,EAAO8iC,mBACnBj+C,KAAM0F,KAAKw4C,eAAet9C,KAEzBua,EAAO8iC,qBASH,KAAAE,gBAAkB,KAAiB,IAAAC,EAChD,MAAM,OAAEjjC,EAAM,UAAE5a,GAAcmF,KAAKJ,MACnC,IAAI+4C,EACAjR,EACJ,MAAMkR,EAAuBnjC,EAAOmjC,qBAChCA,IACAA,EAAqBX,iBAAkB,GAGvCrmC,EAAAA,gBAAgBC,YAAY7R,KAAKc,MAAM63C,oBACvCA,EAAoB34C,KAAKc,MAAM63C,kBAAkB19C,KAAI,CAACyR,EAAkBvR,IAC7D6E,KAAK64C,6BAA6BnsC,EAAMksC,GAAwB54C,KAAKg4C,4BAA6B78C,KAE7GusC,EAAO,IAAI1nC,KAAKc,MAAM63C,kBAAkB19C,KAAIyR,GAAQA,EAAKsqC,SAEzD2B,EAAoB,CAAC34C,KAAK84C,kBAAkBF,IAC5ClR,EAAO,CAAC,UAoBZ,MAjBmD,CAC/C1zB,IAAK+kC,EAAAA,SACL1+C,UAAW,6BACXkS,MAAOosC,EACPK,YAAmC,QAAxBN,EAAE14C,KAAKc,MAAMk4C,mBAAW,IAAAN,EAAAA,EAAI,EACvCn7C,KAAMyC,KAAKzC,KACX07C,SAAUj5C,KAAKi5C,SACfC,UAAU,EACVC,kBAAmBt+C,EAAUu+C,8BAC7BC,kBAAmBx+C,EAAUy+C,0BAC7BC,kBAAmB1+C,EAAU2+C,kBAC7BC,yBAA0Bz5C,KAAK05C,UAC/BC,eAAgB35C,KAAK45C,SACrBC,gBAAiB75C,KAAK85C,UACtB1+C,IAAKssC,IAUI,KAAAqS,kBAAoB,KACjC,MAAM,OAAEtkC,EAAM,GAAE9Z,EAAE,UAAEd,GAAcmF,KAAKJ,MAEjCo6C,EAAyBvkC,EAAOukC,uBAKtC,IAAIrB,EACAjR,EAgBJ,OArBIsS,IACAA,EAAuB/B,iBAAkB,GAKzCrmC,EAAAA,gBAAgBC,YAAY7R,KAAKc,MAAM63C,oBACvCA,EAAoB34C,KAAKc,MAAM63C,kBAAkB19C,KAAI,CAACyR,EAAkBvR,IAC7D6E,KAAKi6C,kBACRvtC,EACAstC,MAAAA,EAAAA,EAA0Bh6C,KAAKk4C,8BAC/B/8C,EACA6E,KAAKc,MAAMk4C,eAGnBtR,EAAO,IAAI1nC,KAAKc,MAAM63C,kBAAkB19C,KAAIyR,GAAQA,EAAKsqC,SAEzD2B,EAAoB,GACpBjR,EAAO,IAGJ,CACHwS,yBAA0B,CAAE7/C,UAAW,0CACvC8/C,kCAAmC,CAC/BnmC,IAAKomC,EAAAA,oBACL//C,UAAW,+BACXggD,iBAAkBx/C,EAAUu+C,8BAC5BkB,iBAAkBz/C,EAAUy+C,0BAC5BiB,SAAU5+C,EACV6+C,YAAY,EACZp/C,IAAK8M,KAAKC,UAAUu/B,IAExBn7B,MAAOosC,IAqBE,KAAArL,kBAAoBt8B,UACjC,MACIrW,SAAS,cACLgX,EACAhH,SACID,aAAa,UAAEmoC,MAGvB7yC,KAAKJ,OAEH,QAAE1E,EAAO,kBAAE6xB,GAAsB/sB,KAAKivB,eAE5C,IAAK/zB,IAAY6xB,EACb,OAGJ,MAAM2hB,EAAkBlxC,EAAA,GAAkCwC,KAAKyuB,YAI/D,GAHAzuB,KAAKmF,SAAS,CAAEquB,qBAAqB,IAGjCxzB,KAAKc,MAAMwyB,WAAWf,YAAcvyB,KAAKc,MAAMwyB,WAAWrB,cAAe,CACzE,MAAM0c,EAAenxC,EAAA,GAAQwC,KAAKc,MAAMwyB,YACxCqb,EAAgBpc,gBAAa90B,EACW,cAApCuC,KAAKc,MAAMwyB,WAAWtB,YACtB2c,EAAgB1c,mBAAgBx0B,EAChCkxC,EAAgB3c,eAAYv0B,GAEhCuC,KAAKmF,SAAS,CAAEmuB,WAAYqb,IAIhC,IAAK,MAAMvzC,KAAOmH,OAAOmlC,KAAKgH,GAC1B,GAAI1uC,KAAKc,MAAMwyB,WAAWpB,gBAAgB92B,GAAM,CAC5C,MAAMk4B,EAAU91B,EAAA,GAAQwC,KAAKc,MAAMwyB,YACnCA,EAAWpB,gBAAgB92B,QAAOqC,EAElCuC,KAAKmF,SAAS,CAAEmuB,WAAAA,IAMxB,MAAM4b,EAAmBniB,EACpB9xB,KAAIurC,IACM,CACHrF,mBAAoBqF,EAAUrF,mBAC9BQ,eACI3hC,KAAKy6C,sBAAsBjU,EAAWkI,EAAmBlI,EAAUrF,sBAAwBqF,EAAU7E,eACzGsR,oBAAqBzM,EAAUyM,wBAGtCj8B,QAAOwvB,GACGA,GAAaA,EAAU7E,iBAKhCpO,EAAkB,IAAInb,SAAiCpH,MAAAA,IACzD,MAAM0pC,QAAmBtH,EAAAA,EAAAA,oBACrB,IAAIC,EAAAA,qBACAn4C,EAAQo4C,gBAAkBp4C,EAAQo4C,gBAAkBp4C,EAAQmI,SAC5DwvC,EACA3D,OACAzxC,EACAuC,KAAKJ,MAAMjF,QAAQgQ,SAEvBgH,GAEA+oC,IAEA16C,KAAKivB,eAAelC,wBAA0BwmB,EAAAA,EAAAA,iCAC1C,IAAIC,EAAAA,qCACAkH,EAAWpH,gBAAkBoH,EAAWpH,gBAAkBoH,EAAWr3C,SACrEwvC,EACA3D,EACAlvC,KAAKJ,MAAMjF,QAAQgQ,SAEvBgH,IAIR0G,EAAQqiC,MAGZ16C,KAAKmF,SAAS,CAAEouB,gBAAAA,IAChB,MAAMonB,QAAuBpnB,EAE7B,GAAIonB,GAAkB36C,KAAKivB,eAAgB,CAAC,IAAD2rB,EAAApM,EAGvCxuC,KAAKivB,eAAe/zB,QAAUy/C,EAC9B,IAAIE,QAA6B76C,KAAK86C,oBAAoB5/C,EAASy/C,GACnEE,EAAS76C,KAAK+6C,8BAA8BF,EAAQF,GACpD36C,KAAKmF,SAAS,CACVwzC,kBAAmB,IAAIkC,GACvB7B,YAAa,EACbgC,WAAYC,KAAKC,QAGrB,MAAMxH,QAA6BC,EAAAA,EAAAA,4CAC/B,IAAIC,EAAAA,6CAA6C+G,EAAet3C,SAAUwvC,GAC1ElhC,GAGJ3R,KAAKivB,eAAeG,yBAA2BskB,EAM/C,GAJuD,QAA5BkH,EAAGD,EAAenT,kBAAU,IAAAoT,OAAA,EAAzBA,EAA2Br+C,MACrDiqC,IAAS,IAAA2D,EAAA,OAAqC,IAAjC3D,EAAUrF,oBAA+E,YAA3B,QAAxBgJ,EAAA3D,EAAU7E,sBAAc,IAAAwI,GAAO,QAAPA,EAAxBA,EAA0BlI,aAAK,IAAAkI,OAAA,EAA/BA,EAAiCvtB,kBAIpF5c,KAAKmF,SAAS,CAAEsxB,uBAAuB,QACpC,CAEH,MAAMnD,EAAU91B,EAAA,GAAQwC,KAAKc,MAAMwyB,YACnCA,EAAWhB,uBAAoB70B,EAE/BuC,KAAKmF,SAAS,CAAEsxB,uBAAuB,EAAOF,gBAAgB,EAAOjD,WAAAA,IAGrEogB,GAAwBA,EAAqBjnC,OAAS,EACtDzM,KAAKmF,SAAS,CAAEiqB,yBAA0BskB,EAAqB,KAE/D1zC,KAAKmF,SAAS,CAAEiqB,8BAA0B3xB,IAI9C,MAAMqvC,QAAiBgH,EAAAA,EAAAA,4BACnB,IAAIC,EAAAA,6BAA6B4G,EAAet3C,SAAUwvC,GAC1DlhC,GAGAm7B,GACA9sC,KAAKgtC,aAAaF,GAGtB,MAAMqO,EAAuE,QAAtC3M,EAAGxuC,KAAKJ,MAAM/D,KAAKuyB,aAAanvB,cAAM,IAAAuvC,OAAA,EAAnCA,EAAqCjyC,MAC3E6xB,GAAsC,oEAAtBA,EAAapb,OAI3B+5B,QAA2BmH,EAAAA,EAAAA,sCAC7B,IAAIC,EAAAA,0CACAwG,EAAet3C,SACfwvC,OACAp1C,OACAA,EACA09C,MAAAA,OAAiC,EAAjCA,EAAmC7sB,WAEvC3c,GAGAo7B,GACA/sC,KAAKmF,SAAS,CAAEiwB,uBAAwB2X,IAG5C/sC,KAAKmF,SAAS,CAAEquB,qBAAqB,UAC/BxzB,KAAKsvC,yBAAyBqL,KAuBpC,KAAAvE,oBAAsB,IACc,YAApCp2C,KAAKJ,MAAM6V,OAAO2lC,cAiFT,KAAAX,sBAAwB,CACrCzZ,EACAqa,KAEA,GAAIA,GAAcra,EAAqBM,gBACnC,OAAON,EAAqBM,gBAAgB/kC,MAAKiqC,GAAaA,EAAUnjC,YAAcg4C,KAM7E,KAAA5N,iBAAmB,CAACnkC,EAAuBzO,KAA0C,IAAAygD,EAClG,MAAM/U,EAAgC,QAAtB+U,EAAGt7C,KAAKivB,sBAAc,IAAAqsB,GAAS,QAATA,EAAnBA,EAAqBpgD,eAAO,IAAAogD,OAAA,EAA5BA,EAA8BjpB,WAEjD,OAAQ/oB,GACJ,KAAK,EACD,OAAOzO,EAAUqmB,0BACrB,KAAK,EACD,OAAOrmB,EAAU40C,kCACrB,KAAK,EACD,OAAO50C,EAAUsmB,yBACrB,KAAK,EACD,OAAOolB,EAAa1rC,EAAU60C,2BAA6B70C,EAAUumB,0BACzE,QACI,MAAO,KAwDF,KAAA04B,UAAY,KACzB95C,KAAKmF,SAAS,CAAEo2C,WAAW,KAGd,KAAA3B,SAAW,KACxB55C,KAAKmF,SAAS,CAAEo2C,WAAW,KAGd,KAAAh+C,KAAO,KACpB,QAA0BE,IAAtBuC,KAAKw7C,aACL,OAGJ,MAAMC,EAAYz7C,KAAKw7C,aAAe,EAAIx7C,KAAKc,MAAMk4C,YAAe,EACpEh5C,KAAK05C,UAAU+B,IAGF,KAAAxC,SAAW,KACxB,MAAMwC,EAAYz7C,KAAK07C,cACjB17C,KAAKc,MAAM63C,kBACP34C,KAAKc,MAAM63C,kBAAkBlsC,OAAS,EACtC,EACJzM,KAAKc,MAAMk4C,YAAe,EAChCh5C,KAAK05C,UAAU+B,IAGF,KAAA/B,UAAav+C,IAC1B6E,KAAKmF,SAAS,CAAE6zC,YAAa79C,KAOhB,KAAAwgD,iBAAmB,CAACC,EAAmBhhD,EAA+BO,IACnFX,IAAAA,cAACqhD,EAAAA,GAAKt5C,OAAAC,OAAA,CACFsW,eAAgB9Y,KAAKJ,MAAMjF,QAAQgX,cAAcmH,eACjDze,UAAU,0BACNuhD,EAAK,CACTp8B,aAAcxf,KAAKJ,MAAMjF,QAAQgQ,QAAQ6U,aACzC5kB,cAAeA,EACfkhD,oBAAoB,UACpBxzC,KAAK,WACLlN,IAAKwgD,EAAM5E,IACXr7C,GAAI,GAAGqE,KAAKJ,MAAMjE,sBAAsBR,OAI/B,KAAA8+C,kBAAoB,CACjC2B,EACAhhD,EACAO,EACA4gD,KAOO,CACHC,4BAA6B,CACzBhoC,IAAK,KACL3Z,UARQqP,GAAAA,CACZ,mCACAqyC,IAAwB5gD,EAAQ,0CAA4C,IAOxEmN,KAAM,MACN4B,SAAU,EACV9O,IAAKD,EACL,aAAcygD,EAAM1E,QACpB,gBAAiB6E,IAAwB5gD,EACzC,gBAAiB,GAAG6E,KAAKJ,MAAMjE,sBAAsBR,IACrDwN,QAAS3I,KAAKi8C,0BAA0B9gD,GACxC+gD,UAAWl8C,KAAKm8C,4BAA4BhhD,IAEhDihD,QACI5hD,IAAAA,cAACqhD,EAAAA,GAAKt5C,OAAAC,OAAA,CACFsW,eAAgB9Y,KAAKJ,MAAMjF,QAAQgX,cAAcmH,eACjDze,UAAU,+BACNuhD,EAAK,CACTxgD,IAAKwgD,EAAM5E,IACXx3B,aAAcxf,KAAKJ,MAAMjF,QAAQgQ,QAAQ6U,aACzC5kB,cAAeA,EACfkhD,oBAAoB,eAMnB,KAAAK,4BAA+BhhD,GACpC2J,IACAA,EAAMu3C,QAAUC,EAAAA,SAASC,OAASz3C,EAAMu3C,QAAUC,EAAAA,SAASE,QAC3D13C,EAAM6C,iBACN3H,KAAK05C,UAAUv+C,KAKV,KAAA8gD,0BAA6B9gD,GAClC2J,IACJA,EAAM6C,iBACN3H,KAAK05C,UAAUv+C,IAWN,KAAAugD,YAAc,IAAiC,IAA3B17C,KAAKc,MAAMk4C,YAE/B,KAAAwC,WAAa,IAAMx7C,KAAKc,MAAM63C,mBAAqB34C,KAAKc,MAAMk4C,cAAgBh5C,KAAKc,MAAM63C,kBAAkBlsC,OAAS,EAEpH,KAAAgwC,eAAiBzrC,MAAAA,GACvBhR,KAAK0H,SAAS5C,EAAO9E,KAAKJ,OAGpB,KAAA8H,SAAWsJ,MAAO0rC,EAAuC98C,KACtE,IAAK6hC,EAAAA,iBAAiBC,kBAAkB9hC,EAAM+8C,mBAAoB,CAC9D,MACIhiD,SAAS,cACLgX,EACAhH,SACID,aAAa,UAAEmoC,MAGvB7yC,KAAKJ,MAET,GAAII,KAAKJ,MAAM+8C,kBAAmB,CAC9B38C,KAAKmF,SAAS,CAAEilC,WAAW,IAC3B,MAAMnuB,EAAYjc,KAAKJ,MAAM+8C,kBACvB1c,EAAqBjgC,KAAKJ,MAAMqgC,mBACtCjgC,KAAKivB,qBC79Bdje,eACHiL,EACA42B,EACA+J,EACA3c,GAEA,MAAMhR,EAAkC,GAExC,GAAIhT,EAAY,GAAK42B,EAAY,EAAG,CAChC,MAAMgK,GAAWC,EAAAA,EAAAA,iBAAgBF,GAC3BG,GAAkBC,EAAAA,EAAAA,kBAAiBJ,SAGnCxJ,EAAAA,EAAAA,oBAAmB,IAAIC,EAAAA,qBAAqBp3B,EAAW42B,EAAW5S,EAAoB,MAAO2c,EAAI9jC,gBAAiB8jC,GACnH7hC,MAAK/J,MAAAA,IACEisC,IACAhuB,EAAe/zB,QAAU+hD,MAGhChU,OAAMrnC,IACHg7C,EAAI/9C,UAAUqqC,UAAUtnC,YAI1B+xC,EAAAA,EAAAA,4CAA2C,IAAIC,EAAAA,6CAA6C33B,EAAW42B,GAAY+J,GACpH7hC,MAAKmiC,IACEA,IACAjuB,EAAeG,yBAA2B8tB,MAGjDjU,OAAMrnC,IACHg7C,EAAI/9C,UAAUqqC,UAAUtnC,YAI1BkyC,EAAAA,EAAAA,4BAA2B,IAAIC,EAAAA,6BAA6B93B,EAAW42B,OAAWp1C,GAAYm/C,GAC/F7hC,MAAKgb,IACEA,IACA9G,EAAe8G,aAAeA,MAGrCkT,OAAMrnC,IACHg7C,EAAI/9C,UAAUqqC,UAAUtnC,YAI1B2xC,EAAAA,EAAAA,iCACF,IAAIC,EAAAA,qCAAqCv3B,EAAW42B,EAAW5S,EAAoB2c,EAAI9jC,gBACvF8jC,GAEC7hC,MAAKgS,IACEA,IACAkC,EAAelC,kBAAoBA,MAG1Ckc,OAAMrnC,IACHg7C,EAAI/9C,UAAUqqC,UAAUtnC,YAI1Bu7C,EAAAA,EAAAA,kBAAiB,IAAIC,EAAAA,sBAAsBR,EAAI9jC,eAAepO,YAAakyC,EAAI9jC,gBAAiB8jC,GACjG7hC,MAAKsiC,IACFpuB,EAAe1M,KAAO86B,KAEzBpU,OAAMrnC,IACHg7C,EAAI/9C,UAAUqqC,UAAUtnC,MAI5Bi7C,GAAYE,SACNO,EAAAA,EAAAA,mBAAkB,IAAIC,EAAAA,uBAAuBthC,EAAUhQ,WAAY4wC,EAAUE,GAAkBH,GAChG7hC,MAAKyiC,IACEA,IACAvuB,EAAekJ,eAAiBqlB,MAGvCvU,OAAMrnC,IACHg7C,EAAI/9C,UAAUqqC,UAAUtnC,MAKxC,OAAOqtB,ED24BiCwuB,CAAkBxhC,EAAW42B,EAAWlhC,EAAesuB,GACnF,MAAM,QAAE/kC,EAAO,aAAE66B,GAAiB/1B,KAAKivB,eACjCyuB,EAAsBzC,KAAKC,MAMjC,GALAl7C,KAAK29C,kBAAkBD,GACnB3nB,GACA/1B,KAAKgtC,aAAajX,GAGlB76B,EAAS,CACT,MAAM,QAAEP,GAAYqF,KAAKJ,MACrBjF,EAAQ+c,IAAIjC,OAAOs6B,4BAA8B,GACjDC,EAAAA,GAAoBjH,SAAS/oC,KAAKJ,MAAMjF,QAASA,EAAQ+c,IAAIjC,OAAOs6B,4BAA6B70C,EAAQmI,UAGzGnI,EAAQ00C,gBAAkBC,EAAAA,oBAAoBC,SAC9C9vC,KAAKmF,SAAS,CAAEuuB,eAAe,UAE7B1zB,KAAKsvC,yBAAyBp0C,GACpC,IAAI2/C,QAAe76C,KAAK86C,oBAAoB5/C,EAASA,GACrD2/C,EAAS76C,KAAK+6C,8BAA8BF,GAC5C76C,KAAKmF,SAAS,CACVwzC,kBAAmB,IAAIkC,GACvB7B,YAAa,EACbgC,WAAY0C,IAGpB19C,KAAKmF,SAAS,CAAEy4C,cAAc,OAKlC,KAAA9C,oBAAsB9pC,MAAO9V,EAA2By/C,KAA2D,IAAAkD,EACvH,IAAIhD,EACmD,IAADiD,EAS/CC,EAAAC,EATmB,QAA1BH,EAAI79C,KAAKJ,MAAMjF,QAAQ+c,WAAG,IAAAmmC,GAAQ,QAARA,EAAtBA,EAAwBpoC,cAAM,IAAAooC,GAA9BA,EAAgCrH,iBAChCqE,QD/8BL7pC,eACHiL,EACAm6B,EACAvD,EACAlhC,EACA0kC,EACA9iB,GAA+B,IAAA0qB,EAE/B,MAAMptC,GAAYC,EAAAA,EAAAA,IAAaa,EAAcmH,gBAC7C,GAAgC,QAAhCmlC,EAAItsC,EAAcmH,sBAAc,IAAAmlC,GAAQ,QAARA,EAA5BA,EAA8BC,cAAM,IAAAD,GAApCA,EAAsCE,UAAW,CACjD,MAAMC,QAAiBC,EAAAA,EAAAA,IAAmB1sC,EAAcmH,eAAgB,iCAAkC,OAAQ,CAC9GmD,UAAWA,EACX42B,UAAWA,EACXhiC,UAAWA,IAEf,GAAwB,MAApButC,EAAS1pB,OAET,OADA/iB,EAAc9S,UAAUsqC,MAAM,2EACvB,GAEX,MAAMmV,EAAmBF,MAAAA,OAAQ,EAARA,EAAUviD,KACnC,OAAIyiD,EACOA,EAAiBrjD,KAAI67C,IAAgB,IAAAyH,EACxC,MAAO,CACHvH,IAAsB,QAAnBuH,EAAEzH,EAAcG,WAAG,IAAAsH,EAAAA,EAAI,GAC1BrH,QAASf,EAAWxkC,EAAcmH,eAAgBs9B,EAAqBC,EAAaS,EAAcK,SAClGqH,qBAAsB1H,EAAc2H,6BAC9B,CACIC,6BAA8B,aAElCjhD,MAIX,GAEX,MAAMi5C,EAAc,IAAIC,EAAAA,sCAAsC16B,EAAW42B,EAAWtf,EAAiB1iB,GACrG,OAAO+lC,EAAAA,EAAAA,qCAAoCF,EAAa/kC,GACnDoJ,MAAK87B,GACEA,EACOA,EAAe57C,KAAI67C,IAAgB,IAAA6H,EACtC,MAAO,CACH3H,IAAsB,QAAnB2H,EAAE7H,EAAcG,WAAG,IAAA0H,EAAAA,EAAI,GAC1BzH,QAASf,EAAWxkC,EAAcmH,eAAgBs9B,EAAqBC,EAAaS,EAAcK,SAClGqH,qBAAsB1H,EAAc2H,6BAC9B,CACIC,6BAA8B,aAElCjhD,MAIX,KAEVwrC,OAAMrnC,IACH+P,EAAc9S,UAAUqqC,UAAUtnC,GAClC+P,EAAc9S,UAAUsqC,MAAM,sDACvB,MCu5BQyV,CACX1jD,EAAQmI,SACRrD,KAAKo2C,uBACJp2C,KAAKJ,MAAMjF,QAAQgQ,QAAQD,YAAYmoC,UACxC7yC,KAAKJ,MAAMjF,QAAQgX,cACnBzW,EAAQ8X,KACc,QADV8qC,EACZ5iD,EAAQ4zC,sBAAc,IAAAgP,EAAAA,EAAInD,GAG9BE,QAAepE,EACXv7C,EAAQmI,UAAY,GACnBrD,KAAKJ,MAAMjF,QAAQgQ,QAAQD,YAAYmoC,UACxC7yC,KAAKJ,MAAMjF,QAAQgX,cACqB,QADRosC,EAChC/9C,KAAKJ,MAAM6V,OAAOukC,8BAAsB,IAAA+D,GAAI/9C,KAAKk4C,8BAC3B,QADwD8F,EAC9E9iD,EAAQ4zC,sBAAc,IAAAkP,EAAAA,EAAIrD,GAGlC,OAAOE,GAGM,KAAAgE,2BAA6B,KAC1C7+C,KAAK+3C,wBA+BQ,KAAA+G,gBAAmBluB,GAAiCuL,IAC7DvL,EAAUwL,gBACHxL,EAAUwL,eAAeD,GAKvB,KAAA4Z,gBAAkB,CAC/Bn2C,EACAkB,EACA8vB,KAEA,MAAM,UAAE/1B,GAAc+E,GAEhB,SACFyzB,EAAQ,IACRnwB,EAAG,IACHC,EACAmwB,YAAY,cAAErB,IACdnxB,EAEJ,MAAO,CACH00B,eAAgB,CACZn7B,UAAW,0BAEfiiC,oBAAqB,CACjBtoB,IAAK,QACL3Z,UAAW,uCACXkiC,QAAS,wCAEbhZ,QAAS/oB,IAAAA,cAAA,OAAKH,UAAU,gDAAgDQ,EAAU2hC,wBAClFC,OAAQxK,GACJz3B,IAAAA,cAAA,QAAMH,UAAU,iDACZG,IAAAA,cAAA,QAAMH,UAAU,2BAA0B,cAAa,SACvDG,IAAAA,cAAA,YAAOy3B,IAGfvrB,MACIlM,IAAAA,cAACukD,EAAAA,oBAAmB,CAChBpjD,GAAG,oCACHuH,IAAKA,EACLC,IAAKA,EACLu5B,aAAcrJ,EACd3wB,SAAU1C,KAAK8+C,gBAAgBluB,GAC/BtP,uBAAwBzmB,EAAUymB,uBAClC09B,yBAA0BnkD,EAAUmkD,yBACpCC,yBAA0BpkD,EAAUokD,yBACpCtgB,gBAAiB9jC,EAAU8jC,gBAC3BF,gBAAiB5jC,EAAU4jC,gBAC3B/N,iBAAkB1wB,KAAK0wB,iBACvBrL,SAAUrlB,KAAKc,MAAM0yB,wBA12BjCxzB,KAAKc,MAAQ,CACTspC,WAAW,EACX/W,SAAU,EACVnwB,SAAKzF,EACL0F,SAAK1F,EACL61B,WAAY,CACRpB,gBAAiB,IAErBqB,qBAAiB91B,EACjBs4B,kBAAct4B,EACd23B,4BAAwB33B,EACxB+1B,qBAAqB,EACrBwlB,YAAa,EACbuC,WAAW,EACX5C,uBAAmBl7C,EACnBmgD,cAAc,GAGlB59C,KAAK6+C,2BAA6B7+C,KAAK6+C,2BAA2B3+C,KAAKF,MACvEA,KAAK0wB,kBAAmBqE,EAAAA,EAAAA,oBAAmBn1B,EAAMjF,QAAQgQ,QAAQqqB,kBAAoBp1B,EAAMgpC,aAAchpC,EAAMf,WAS5GqgD,sBAAsBC,EAA4CC,GACrE,OAAIp/C,KAAKc,QAAUs+C,GAAap/C,KAAKJ,MAAM/D,OAASsjD,EAAUtjD,KAM3D0F,SAAM,IAAA89C,EAAAC,EACT,MACI7pC,QAAQ,UAAEpb,EAAY,IAAI,UAC1BQ,GACAmF,KAAKJ,OACH,IAAEuD,GAAQnD,KAAKc,MACf5F,EAA6B,QAAnBmkD,EAAAr/C,KAAKivB,sBAAc,IAAAowB,GAAnBA,EAAqBnkD,QAAU8E,KAAKivB,eAAe/zB,aAAUuC,EACvEmC,EAAQI,KAAKJ,MAGb4tB,EAAsG,QAArFrO,EAAAA,EAAAA,UAAS,CAAEsO,QAASC,EAAAA,YAAYC,SAAUhzB,QAASqF,KAAKJ,MAAMjF,QAAQgQ,UACvF40C,EAAS/hD,EAAAA,EAAA,GACPwC,KAAKJ,OAAiD,IAC1DkB,MAAOd,KAAKc,MACZmuB,eAAgBjvB,KAAKivB,eACrBye,YAAa1tC,KAAKc,MAAMspC,UACxBoV,UAAW,CACP/gC,YAAaze,KAAKJ,MAClBvF,UAAWqP,GAAAA,CAAW,eAAgBrP,GACtC2Z,IAAK,OAETwZ,eAAAA,EACAiyB,gBACIjlD,IAAAA,cAAA,UAAQH,UAAU,uBAAuBsO,QAAS3I,KAAKy8C,eAAc,aAAc5hD,EAAU6kD,qBACxF7kD,EAAU6kD,qBAGnBC,eAAgB,CACZlhC,YAAaze,KAAKJ,MAClBoU,IAAKnG,EAAAA,MACLxT,UAAW,uBACX6T,OAAQlO,KAAKc,MAAMspC,UACnB,cAAc7qC,EAAAA,EAAAA,QAAO1E,EAAU+kD,mBAAuC,QAArBN,EAAEt/C,KAAKivB,sBAAc,IAAAqwB,GAAS,QAATA,EAAnBA,EAAqBpkD,eAAO,IAAAokD,OAAA,EAA5BA,EAA8BtsC,MACjF7E,OAAQnO,KAAK6+C,2BACbgB,gBAAiB,CAAExwC,QAAS,GAC5BywC,gCAAiC9/C,KAAKc,MAAM88C,cAEhDmC,qBAAsB,CAClB/rC,IAAKzF,EAAAA,YACLlU,UAAW,uBACX8T,OAAQnO,KAAK6+C,4BAEjBmB,qBAAsB,CAClBhsC,IAAKtF,EAAAA,YACLrU,UAAW,wBAEf4lD,mBAAoB,GACpBC,mBAAoB,CAChBlsC,IAAK7B,EAAAA,UACL9X,UAAW,sBAEf8lD,mBAAoB,CAChB9lD,UAAW,qCAEfw2C,0BAA2B,CACvBx2C,UAAW,yBAEfy2C,2BAA4B,CACxBz2C,UAAW,+BAEf+lD,iBAAkBpgD,KAAKm4C,uBAAuBj9C,GAC9CmlD,SAAUrgD,KAAKc,MAAM88C,cACjBpjD,IAAAA,cAAC8lD,EAAAA,EAAO,CAACjmD,UAAU,8BAA8B8R,MAAOtR,EAAU0lD,YAAanT,KAAMoT,EAAAA,EAAYC,QAErG7vB,UAAW5wB,KAAK63C,mBAChB5kC,MAAOjT,KAAKc,MAAM88C,eAAgBjuB,EAAAA,EAAAA,IAAsB/vB,EAAOI,KAAKivB,gBACpEsb,YAAavqC,KAAKc,MAAM88C,eAAgB3tB,EAAAA,EAAAA,IAA4BrwB,EAAOI,KAAKivB,gBAChFiiB,UAAWlxC,KAAKc,MAAM88C,cAChB5d,EAAAA,EAAAA,GAA0BpgC,EAAOI,KAAKc,MAAOd,KAAK63C,mBAAoB73C,KAAKivB,eAAgBjvB,KAAKJ,MAAMqgC,yBACtGxiC,EACNq4B,MAAO91B,KAAKc,MAAM88C,eAAgBzmB,EAAAA,EAAAA,IAAsBv3B,EAAOI,KAAKc,OACpEmwC,cAAejxC,KAAKc,MAAM88C,eAAgBvtB,EAAAA,EAAAA,IAA8BzwB,EAAOI,KAAKivB,gBACpFxW,OACIzY,KAAKc,MAAM88C,eAAiB59C,KAAKJ,MAAMjF,QAAQ+c,IAAIjC,OAAO87B,aAAcvZ,EAAAA,EAAAA,IAAuBp4B,EAAOI,KAAKivB,gBAC/GmiB,UAAWpxC,KAAKc,MAAM88C,cAChBlrB,EAAAA,EAAAA,IACI9yB,EACAI,KAAKc,MACLd,KAAK63C,mBAtEc,GACA,IAwEnB73C,KAAKivB,qBAETxxB,EACNo0C,WACI7xC,KAAKc,MAAM88C,cAAgB59C,KAAKJ,MAAM6V,OAAOq8B,kBAAoB9xC,KAAKc,MAAM21B,uBACtEuH,EAAAA,EAAAA,IAAoBp+B,EAAOI,KAAKc,MAAOd,KAAK63C,yBAC5Cp6C,EACV41B,SAAUn4B,MAAAA,GAAAA,EAASm3B,gBAAa50B,EAAYuC,KAAK+1C,gBAAgB/1C,KAAKJ,MAAOI,KAAKc,MAAOd,KAAK63C,oBAC9FrG,eAAgBxxC,KAAKc,MAAM88C,eAAgB5uB,EAAAA,EAAAA,IAAwBpvB,EAAOI,KAAKivB,gBAC/EqiB,cAAetxC,KAAKc,MAAM88C,cACpBtiB,EAAAA,EAAAA,IAA8B17B,EAAOI,KAAKc,MAAOd,KAAK63C,mBAAoB73C,KAAKivB,qBAC/ExxB,EACNs0C,uBAAwB/xC,KAAKc,MAAM88C,eAAgBrf,EAAAA,EAAAA,IAA0B3+B,EAAOI,KAAKc,OACzFqC,IAAAA,EACAu9C,cAAe1gD,KAAKy4C,kBACpBkI,WAAY3gD,KAAK+5C,sBAGrB,OAAO/5C,KAAKJ,MAAMyf,WAAWkgC,GAiHzB5B,kBAAkBiD,GAAuB,IAAAC,EAC7C,MAAM3lD,EAA6B,QAAtB2lD,EAAG7gD,KAAKivB,sBAAc,IAAA4xB,OAAA,EAAnBA,EAAqB3lD,SAChC8E,KAAKc,MAAM63C,mBAAZ,MAAiCz9C,GAAAA,EAAS+mB,iBAC1CjiB,KAAKmF,SAAS,CACVwzC,kBAAmB,CAAC34C,KAAK8gD,uBAAuB5lD,IAChD8/C,WAAY4F,IAKhB5T,aAAaF,GAAiG,IAA7Da,EAAAgF,UAAAlmC,OAAA,QAAAhP,IAAAk1C,UAAA,GAAAA,UAAA,GAAkC3yC,KAAKc,MAAM2wB,iBAC9FzxB,KAAKc,MAAM21B,uBAAyBqW,IACpCA,EAAS8F,wBAA0BjF,GAEvC3tC,KAAKmF,SAAS,CAAE4wB,aAAc+W,IAoK1B0L,eAAet9C,GAAkC,IAAA2uC,EACrD,IAAK3uC,IAAYm3C,EAAAA,GAAiBl1B,UAC9B,MAAO,GAGX,IAAI2E,EAAa,GACjBA,GAAai/B,EAAAA,EAAAA,uBAAsB7lD,EAAQ8X,MAAQ,GAAI9X,EAAQmI,SAAUrD,KAAKJ,MAAMjF,QAAQgX,mBAAelU,GAE3G,MAAMiY,EAAU,IAAIsrC,IAAIl/B,EAAY/I,OAAO6kB,SAAStjC,MAQpD,OAPkB,QAAlBuvC,EAAA3uC,EAAQssC,kBAAU,IAAAqC,GAAlBA,EAAoB5uC,KAAIurC,IAAY,IAAAya,EAChC,MAAMnf,EAAyC,QAA3Bmf,EAAGza,EAAU7E,sBAAc,IAAAsf,OAAA,EAAxBA,EAA0Bhf,MACjD,IAAKr4B,EAAAA,iBAAiBC,mBAAmBi4B,GAAiB,CACtD,MAAMof,GAAgB1d,EAAAA,EAAAA,6CAA4CgD,EAAUrF,oBAC5EzrB,EAAQyrC,aAAa16C,IAAIy6C,EAAepf,OAGzCpsB,EAAQpb,KAWX,+BAA+BY,GACnC,MAAMw7B,QAA4C12B,KAAK22B,uCACjDyd,QAAsCp0C,KAAK42B,iCAE3C1zB,EAAclD,KAAKq0C,+BAA+B3d,EAAqCx7B,GACvFiI,EAAcnD,KAAKs0C,+BACrBF,GAAiC1d,EACjCx7B,GAEJ,IAAIm4B,EAAmBrzB,KAAKu0C,aAAar5C,EAASw7B,GAClDrD,EAAWxX,KAAK1Y,IAAIkwB,EAAUnwB,GAE9BlD,KAAKmF,SAAS,CACVjC,IAAAA,EACAC,IAAAA,EACAkwB,SAAAA,IAIAghB,+BAA+B3d,EAA8Cx7B,GAAsB,IAAAs5C,EACvG,OAAI9d,GAAAA,MAAuCx7B,GAAiB,QAAVs5C,EAAPt5C,EAASu5C,gBAAQ,IAAAD,GAAjBA,EAAmBE,iBAAmBx5C,EAAQu5C,SAASC,gBAAkB,EACzGx5C,EAAQu5C,SAASC,gBAGrB,EAGHJ,+BAA+BK,EAAyCz5C,GAAsB,IAAA05C,EAClG,OAAID,GAAAA,MAAkCz5C,GAAiB,QAAV05C,EAAP15C,EAASu5C,gBAAQ,IAAAG,GAAjBA,EAAmBC,iBAAmB35C,EAAQu5C,SAASI,gBAAkB,EACpG35C,EAAQu5C,SAASI,iBAGrBC,EAAAA,EAAAA,kCAAiC90C,KAAKJ,MAAMjF,QAAQ+c,IAAIjC,OAAOkwB,4BAGlE4O,aAAar5C,EAAwBw7B,GAA4C,IAAAqe,EAAAC,EAAAC,EACrF,MAAM,SAAE5hB,GAAarzB,KAAKc,MAC1B,IAAIo0C,EAAkB,EAEtB,GAAI7hB,IAAa6hB,IAAoBxe,EACjC,OAAOrD,EAGX,MAAMuM,EAAoB5/B,KAAKJ,MAAM/D,KAAK+jC,kBAE1C,OAD2G,QAAjEmV,EAAGnV,MAAAA,GAAyB,QAARoV,EAAjBpV,EAAmB3gC,cAAM,IAAA+1C,OAAA,EAAzBA,EAA2BtE,2CAAmC,IAAAqE,GAAAA,GAKvG75C,MAAAA,GAAiB,QAAV+5C,EAAP/5C,EAASu5C,gBAAQ,IAAAQ,GAAjBA,EAAmBE,iBAAmBj6C,EAAQu5C,SAASU,gBAAkB,IACzED,EAAkBh6C,EAAQu5C,SAASU,iBAGhCD,GAPI7hB,EAUP0nB,8BAA8BF,EAAuB3/C,GAAiC,IAAAkmD,EAC1F,MAAMC,EAAmF,QAA5DD,EAAGphD,KAAKJ,MAAM6V,OAAO6rC,+CAAuC,IAAAF,GAAAA,EACzF,IAAIG,EAAgB1G,MAAAA,EAAAA,EAAU,GAC9B,MAAM2G,GACD/f,EAAAA,iBAAiBC,kBAAkBxmC,MAAAA,OAAO,EAAPA,EAASo4C,mBAAqB7R,EAAAA,iBAAiBC,kBAAkBxmC,MAAAA,OAAO,EAAPA,EAAS4zC,gBAC5GxkC,EAASpP,MAAAA,OAAO,EAAPA,EAASumD,OAUxB,OATIJ,GAA2BG,GAAoBl3C,IAC/Ci3C,EAAgBA,EAAcvqC,QAAOtK,IAAO,IAAAg1C,EAExC,QAD8D,QAA5BA,EAAGh1C,EAAK8xC,4BAAoB,IAAAkD,OAAA,EAAzBA,EAA2BhD,iCAG/D9sC,EAAAA,gBAAgBC,YAAY0vC,KAC7BA,EAAgB1G,MAAAA,EAAAA,EAAU,KAG3B0G,EA+BH,6CAA0C,IAAAtiB,EAAAC,EAC9C,MAAMC,QAAwBn/B,KAAKJ,MAAM/D,KAAKuyB,aAK9C,KAH6B+Q,MAAAA,GAE5B,QAF2CF,EAAfE,EAAiB5iC,MAC1C6xB,GAAgBA,EAAapb,OAAS4rB,EAAAA,YACzC,IAAAK,OAAA,EAF4BA,EAE1B3Q,WAEC,OAAO,EAMX,GAJ+B6Q,MAAAA,GAE9B,QAF6CD,EAAfC,EAAiB5iC,MAC5C6xB,GAAgBA,EAAapb,OAAS8rB,EAAAA,YACzC,IAAAI,OAAA,EAF8BA,EAE5B5Q,UAEyB,CAAC,IAAD8mB,EACxB,MAAM/V,EAA4D,QAArB+V,EAAGp1C,KAAKJ,MAAMjF,eAAO,IAAAy6C,GAAS,QAATA,EAAlBA,EAAoBzqC,eAAO,IAAAyqC,GAAK,QAALA,EAA3BA,EAA6B19B,WAAG,IAAA09B,GAAU,QAAVA,EAAhCA,EAAkC9V,gBAAQ,IAAA8V,OAAA,EAA1CA,EAA4C7V,iCAC5F,GAAgD,SAA5CF,EACA,OAAO,EAGX,GAAgD,QAA5CA,EACA,OAAO,EAEX,IAAIG,EACJ,IACIA,QAAqBx/B,KAAKJ,MAAM/D,KAAK8yB,oBACvC,MAAO/sB,GAGL,OAFA5B,KAAKJ,MAAMf,UAAUw2C,YAAYzzC,GACjC5B,KAAKJ,MAAMf,UAAUsqC,MAAM,0EACpB,EAGX,OACI3J,IAC8C,QAA5CH,GAAqDG,EAAaC,OACnB,QAA5CJ,IAAsDG,EAAaC,OAEzE,CAAC,IAADE,EACH,MAAMC,QAA0B5/B,KAAKJ,MAAM/D,KAAK+jC,kBAChD,QAA+C,QAAxCD,EAAEC,MAAAA,OAAiB,EAAjBA,EAAmBC,2BAAmB,IAAAF,GAAAA,IAI/C,uCAAoC,IAAAG,EACxC,MAAMX,QAAwBn/B,KAAKJ,MAAM/D,KAAKuyB,aAExC2R,EAAoCZ,MAAAA,GAEzC,QAFwDW,EAAfX,EAAiB5iC,MACvD6xB,GAAgBA,EAAapb,OAAS6rB,EAAAA,YACzC,IAAAiB,OAAA,EAFyCA,EAEvCxR,UAEH,OAAOyR,MAAAA,GAAAA,EAiCH8Y,6BAA6B+C,EAAmBhhD,EAA+BO,GACnF,OAAOX,IAAAA,cAAAA,IAAAA,SAAA,KAAGwF,KAAK27C,iBAAiBC,EAAOhhD,EAAeO,IAuElD2lD,uBAAuB5lD,GAC3B,MAAO,CACH87C,IAAK97C,EAAQ+mB,iBAAmB,GAChCi1B,QAASh8C,EAAQ8X,MAqFjB+kC,uBACJ/3C,KAAKyuB,WAAa,GAClBzuB,KAAKmF,SAAS,CACVilC,WAAW,EACX/W,SAAU,EACVnwB,SAAKzF,EACL0F,SAAK1F,EACL61B,WAAY,CACRpB,gBAAiB,IAErBqB,qBAAiB91B,EACjBs4B,kBAAct4B,EACd23B,4BAAwB33B,EACxB+1B,qBAAqB,EACrBpE,8BAA0B3xB,EAC1Bu9C,gBAAYv9C,EACZu7C,iBAAav7C,EACb89C,eAAW99C,EACXk7C,kBAAmB,GACnBiF,cAAc,IAiEd9E,kBAAkBl+C,GACtB,OACIJ,IAAAA,cAAA,OAAKH,UAAU,0BACXG,IAAAA,cAACqhD,EAAAA,GAAK,CACF/iC,eAAgB9Y,KAAKJ,MAAMjF,QAAQgX,cAAcmH,eACjDze,UAAU,gCACV28C,IAAI,QACJx3B,aAAcxf,KAAKJ,MAAMjF,QAAQgQ,QAAQ6U,aACzC5kB,cAAeA,MAAAA,EAAAA,EAAiBoF,KAAKg4C,4BACrC8D,oBAAoB,YAMxC,qIExoCA,MAsBMnG,EAA4BpS,IAC9B,MAAM,eAAE/N,EAAc,oBAAE8G,EAAmB,QAAE/Y,EAAO,OAAEkZ,EAAM,OAAEkH,GAAWJ,EAEzE,OACI/oC,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKgzB,GACNh7B,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK85B,GACL/Y,EACAkZ,GAEJkH,IAKPge,EAAyB/hD,IAC3B,MAAM,eACF+/C,EAAc,qBACdI,EAAoB,qBACpBC,EAAoB,mBACpBC,EAAkB,mBAClBC,EAAkB,cAClB5O,EAAa,UACbF,EAAS,mBACT+O,GACAvgD,EAEJ,OACIpF,EAAAA,cAACimB,EAAAA,OAAMle,OAAAC,OAAA,GAAKm9C,GACRnlD,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKu9C,GAAuBE,GACjCzlD,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK09C,GAAqB0B,EAAmBhiD,IAClDpF,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKw9C,GACNxlD,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK29C,GACL/O,GAtDKA,CAAAA,IACtB,MAAM,eAAE5b,EAAc,WAAEwB,EAAU,OAAEvB,GAAW2b,EAE/C,OACI52C,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKgzB,GACLwB,EACAvB,IAgDqB8f,CAAiBnE,GAC9BE,GA5CSA,CAAAA,IAC1B,MAAM,eAAE9b,EAAc,WAAEwB,EAAU,OAAEvB,GAAW6b,EAE/C,OACI92C,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKgzB,GACLwB,EACAvB,IAsCyBggB,CAAqBnE,OAuCrDsQ,EAAsBhiD,IACxB,MAAM,MACFqT,EAAK,MACL6iB,EAAK,OACLrd,EAAM,WACNo5B,EAAU,SACVxe,EAAQ,UACR6d,EAAS,eACTM,EAAc,uBACdO,EAAsB,iBACtBqO,EAAgB,QAChBC,EAAO,0BACPxP,EAAyB,2BACzBC,EAA0B,cAC1B4P,EAAa,cACbzP,GACArxC,EACJ,OAAIygD,EACO7lD,EAAAA,cAAAA,EAAAA,SAAA,KAAG6lD,GAGV7lD,EAAAA,cAAAA,EAAAA,SAAA,KACIA,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKsuC,GACNt2C,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKk+C,KAEdlmD,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKquC,GACL59B,EACA6iB,EACAmb,EACAx4B,EACAy4B,GApCSA,CAAAA,IACtB,MAAM,eAAE1b,EAAc,UAAEyN,GAAciO,EAEtC,OAAO12C,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKgzB,GAAiByN,EAAUhoC,IAAI06C,KAiCtBD,CAAiBxE,GAC9BW,GAhDUA,CAAAA,IACvB,MAAM,eAAErc,EAAc,oBAAE8G,EAAmB,QAAE/Y,EAAO,MAAE7c,GAAUmrC,EAEhE,OACIr3C,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKgzB,GACNh7B,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK85B,GAAsB/Y,GAC/B7c,IA0CkBsvC,CAAkBnE,GAChCxe,GAhEO0iB,EAAC1iB,EAA2C0e,KAChE,MAAM,eAAEvc,EAAc,oBAAE8G,EAAmB,QAAE/Y,EAAO,MAAE7c,EAAK,OAAE+1B,GAAWpJ,EAExE,OACI74B,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKgzB,GACNh7B,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK85B,GACL/Y,EACAkZ,GAEJ/1B,EACAqrC,IAsDgBgE,CAAgB1iB,EAAU0e,GACtCqO,EACA5O,KAWJqQ,EAA+DjiD,IACxE,MAAM,UAAE4/C,EAAS,gBAAEC,EAAe,YAAE/R,EAAW,eAAElgB,GAAmB5tB,EACpE,OACIpF,EAAAA,cAACimB,EAAAA,OAAMle,OAAAC,OAAA,GAAKg9C,IACNhyB,GAAkBiyB,EACnB/R,GAAeiU,EAAsB/hD,KAKlD,mDC7JO,MAAMkiD,UCFN,MAGHniD,YAAmB2K,GACftK,KAAKsK,OAASA,IDOlB3K,YAAmBsc,EAAmBpL,GAElChR,MADeiiD,EAA0BC,UAAU9lC,EAAWpL,IAG9D7Q,KAAKic,UAAYA,EACjBjc,KAAK6Q,UAAYA,EATd,iBAAiBoL,EAAmBpL,GACvC,MAAO,GAAGoL,KAAapL,uBEFxB,MAAMm/B,UCJN,MAOHrwC,cAAmC,QAAAqiD,EAAArP,UAAAlmC,OAAbF,EAAa,IAAAgmC,MAAAyP,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAb11C,EAAa01C,GAAAtP,UAAAsP,GAC/BjiD,KAAKkiD,qBAAuB31C,EALhC,YACI,OAAOvM,KAAKkiD,uBDGT,gBAAgBvnD,EAAuBo1C,EAAqC9zB,GAC/E,MAAMkmC,EAAgCxnD,EAAQgQ,QAAQy3C,QACtD,IAAI71C,EAAQyjC,EAAoBqS,0BAA0BF,GAE1D,MAAMtxC,GAAYC,EAAAA,EAAAA,IAAanW,EAAQgQ,SAEjC+B,EAAO,IAAIo1C,EAA0B7lC,EAAWpL,GAChD1N,EAAc4sC,EAA8B,GAAK,GACjD50C,EAAgBoR,EAAMtR,KAAIqnD,GAAUA,EAAOrmC,YAAW1Q,QAAQmB,EAAKuP,WACrEvP,IAAmB,IAAXvR,EACRoR,EAAM1O,KAAK6O,GAEXH,EAAM/N,OAAO+N,EAAME,OAAS,EAAG,EAAGF,EAAM/N,OAAOrD,EAAO,GAAG,IAEzDoR,EAAME,OAAStJ,IACfoJ,EAAQA,EAAMg2C,MAAM1mC,KAAK1Y,IAAIoJ,EAAME,OAAStJ,EAAK,KAGrD6sC,EAAoBwS,eAAeL,EAAenS,EAAoByS,+BAAgCl2C,GAGlG,iCAAiC41C,GACrC,MAAM51C,EAAQyjC,EAAoB0S,gBAAgBP,EAAenS,EAAoByS,gCACrF,OAAK7wC,EAAAA,gBAAgBC,YAAYtF,GAG1BA,EAFI,GAKP,uBAAuB41C,EAA+BQ,GAC1D,IAAKA,EACD,OAGJ,IAAKR,EAAcS,iBACf,OAKJ,OAFoBT,EAAcv7C,IAAoD+7C,GAEnE9/C,MAGf,sBAAsBs/C,EAA+BQ,EAAmB9/C,GACvE8/C,GAILR,EAAc17C,IAAIk8C,EAAW9/C,EAAO,CAAEggD,QAAQ,EAAMC,OAAQ,UAlDxC9S,EAAAyS,+BAAyC,0tBEerE,MAAMM,UAAuBvoD,EAAAA,cAKzBmF,YAAYC,EAAsCkB,GAC9CjB,MAAMD,GAmDO,KAAAojD,uBAAyB,KAClChjD,KAAKJ,MAAMjF,SAAWqF,KAAKJ,MAAMjF,QAAQgQ,SAAW3K,KAAKJ,MAAMjF,QAAQgQ,QAAQy3C,UAC/EpiD,KAAKJ,MAAMjF,QAAQgQ,QAAQy3C,QAAQ37C,IAAI,mBAAmBzG,KAAKJ,MAAMjE,KAAM,QAC3EqE,KAAKmF,SAAS,CAAE89C,iBAAiB,MAOxB,KAAAC,MAAQ,KACrB,MAAM,MAAE9kC,GAAUpe,KAAKJ,MACjB67C,EAAYz7C,KAAKc,MAAMk4C,eAAiB56B,GAASA,EAAMuI,SAAWvI,EAAMuI,QAAQla,OAAS,GAAK,EAAIzM,KAAKc,MAAMk4C,YAAc,EAE7Hh5C,KAAKu7C,UACLv7C,KAAKmF,SAAS,CAAEg+C,UAAU,EAAMnK,YAAayC,IAE7Cz7C,KAAKmF,SAAS,CAAE6zC,YAAayC,KAOpB,KAAA2H,UAAY,KACzB,MAAMhlC,EAAQpe,KAAKJ,MAAMwe,OAASpe,KAAKJ,MAAMwe,MAAMuI,QAC7C80B,EAAuC,IAA3Bz7C,KAAKc,MAAMk4C,YAAqB56B,EAAQA,EAAM3R,OAAS,EAAI,EAAKzM,KAAKc,MAAMk4C,YAAc,EAEvGh5C,KAAKu7C,UACLv7C,KAAKmF,SAAS,CAAEg+C,UAAU,EAAMnK,YAAayC,IAE7Cz7C,KAAKmF,SAAS,CAAE6zC,YAAayC,KAIpB,KAAA4H,WAAa,KAC1BrjD,KAAKu7C,WAAY,GAGJ,KAAA+H,UAAY,KACzBtjD,KAAKu7C,WAAY,EACjBv7C,KAAKmF,SAAS,CAAEg+C,UAAU,KAOb,KAAAI,WAAcC,IACvBxjD,KAAKu7C,WAGTv7C,KAAKmF,SAAS,CAAE6zC,YAAawK,KAtG7BxjD,KAAKc,MAAQ,CAAEk4C,YAAa,EAAGmK,UAAU,EAAOF,iBAAiB,GACjEjjD,KAAKu7C,WAAY,EACjBv7C,KAAK0wB,kBAAmBqE,EAAAA,EAAAA,oBACpB/0B,KAAKJ,MAAMjF,QAAQgQ,QAAQqqB,kBAC3Bh1B,KAAKJ,MAAMgpC,aACX5oC,KAAKJ,MAAMf,WAIZinB,oBACC9lB,KAAKJ,MAAMjF,SAAWqF,KAAKJ,MAAMjF,QAAQgQ,SAAW3K,KAAKJ,MAAMjF,QAAQgQ,QAAQy3C,cACI3kD,IAA/EuC,KAAKJ,MAAMjF,QAAQgQ,QAAQy3C,QAAQx7C,IAAI,mBAAmB5G,KAAKJ,MAAMjE,QACrEqE,KAAKJ,MAAMjF,QAAQgQ,QAAQy3C,QAAQ37C,IAAI,mBAAmBzG,KAAKJ,MAAMjE,KAAM,SAC3EqE,KAAKmF,SAAS,CAAE89C,iBAAiB,KAKtC1hD,SACH,GAAIvB,KAAKc,MAAMmiD,gBACX,OAAO,KAGX,MAAM,UAAE5oD,GAAc2F,KAAKJ,MAAM6V,OAE3BwX,EAASzvB,EAAAA,EAAAA,EAAA,GAGRwC,KAAKJ,OACLI,KAAKc,OAAK,IACb4vB,iBAAkB1wB,KAAK0wB,iBACvB+yB,kBAAmB,CACfhlC,YAAaze,KAAKJ,MAClBvF,UAAWqP,GAAAA,CAAW,cAAerP,IAEzCqpD,eAAgB1jD,KAAKc,MAAMqiD,SAAW,YAAc,GACpD5lD,KAAMyC,KAAKkjD,MACXjK,SAAUj5C,KAAKojD,UACf3J,yBAA0Bz5C,KAAKujD,WAC/BI,sBAAuB3jD,KAAKgjD,uBAC5BrJ,eAAgB35C,KAAKsjD,UACrBzJ,gBAAiB75C,KAAKqjD,aAG1B,OAAOrjD,KAAKJ,MAAMyf,WAAW4N,IA8DrC,8HC9HA,MAAM22B,EAAiBhkD,IACnB,IAAI2M,EAAQ,GAEZ,OADAA,EAAQ3M,EAAMwe,OAASxe,EAAMwe,MAAMuI,SAAW/mB,EAAMwe,MAAMuI,QAAQla,OAAS,EAAI7M,EAAMwe,MAAMuI,QAAU,GAC9Fpa,GA+BX,EA7BmD3M,GAC/CpF,EAAAA,cAACimB,EAAAA,OAAMle,OAAAC,OAAA,GAAK5C,EAAM6jD,kBAAuB7jD,EAAMikD,uBAAuBjkD,IAClEpF,EAAAA,cAACu+C,EAAAA,SAAQ,CACL1+C,UAAWqP,GAAAA,CAAW9J,EAAM8jD,gBAC5B1K,YAAap5C,EAAMo5C,YACnBz7C,KAAMqC,EAAMrC,KACZ07C,SAAUr5C,EAAMq5C,SAChB6K,QAAOlkD,EAAM6V,OAAOsuC,cAAe,QACnCC,KAAMpkD,EAAM6V,OAAOwuC,SAAW,gBAAaxmD,EAC3CwmD,SAAUrkD,EAAM6V,OAAOwuC,SACvB/K,SAAUt5C,EAAM6V,OAAOyjC,SACvBgL,eAAgBtkD,EAAM6V,OAAOyuC,eAAiBtkD,EAAM6V,OAAOyuC,oBAAiBzmD,EAC5E8O,MAAOq3C,EAAchkD,GACrBukD,YAAavkD,EAAM6V,OAAO0uC,YAC1BC,eAAgBxkD,EAAM6V,OAAO2uC,eAC7B3K,yBAA0B75C,EAAM65C,yBAChCkK,sBAAuB/jD,EAAM+jD,sBAC7BU,wBAAyBzkD,EAAM/E,WAAa+E,EAAM/E,UAAUypD,0BAC5D/K,kBAAmB35C,EAAM/E,WAAa+E,EAAM/E,UAAU2+C,kBACtDL,kBAAmBv5C,EAAM/E,WAAa+E,EAAM/E,UAAUqb,gBACtDmjC,kBAAmBz5C,EAAM/E,WAAa+E,EAAM/E,UAAUub,YACtDujC,eAAgB/5C,EAAM+5C,eACtBE,gBAAiBj6C,EAAMi6C,gBACvBnpB,iBAAkB9wB,EAAM8wB,iBACxB6zB,SAAU3kD,EAAM6V,OAAO8uC,21BCqC5B,MAAMC,UAAiChqD,IAAAA,cAyB1CmF,YAAmBC,GACfC,MAAMD,GAwKF,KAAA6kD,wBAA2BC,IAC/B,MAAMC,EAAS3kD,KAAKc,MAAM8jD,sBAC1B,GAAI5kD,KAAKJ,MAAMjF,QAAQ+c,IAAIjC,OAAOovC,yBAA2BF,EAAU,EAAG,CACtE,MAAMG,EAAW,GACjB,IAAK,IAAI3pD,EAAQ,EAAGA,EAAQwpD,EAASxpD,IACjC2pD,EAASjnD,KACLrD,IAAAA,cAAA,MAAIH,UAAU,GAAGe,IAAKD,GAClBX,IAAAA,cAAA,OAAKH,UAAU,0BAI3B,OAAOyqD,IASE,KAAAC,uBAA0Bz6C,IAAwB,IAAA06C,EAC/DC,EAAAA,GAAuBlc,SAAS/oC,KAAKJ,MAAMjF,QAAQgQ,QAA2C,QAApCq6C,EAAEhlD,KAAKJ,MAAM/D,KAAKqpD,0BAAkB,IAAAF,OAAA,EAAlCA,EAAoC/lD,QAAQkmD,eAAe76C,GACvHtK,KAAKmF,UAASypC,IAAgB,IAAAwW,EAC1B,MAAO,CACHC,aAAwC,QAA5BD,EAAExW,EAAcyW,oBAAY,IAAAD,OAAA,EAA1BA,EAA4BpuC,QAAOtK,GAAQA,EAAKpC,SAAWA,SAQpE,KAAAg7C,qBAAmC,KAChDtlD,KAAKmF,UAASypC,IAAgB,IAAA2W,EAC1B,MAAO,CACHv2C,aAAsC,QAA1Bu2C,EAAE3W,EAAc5/B,kBAAU,IAAAu2C,EAAAA,EAAIvlD,KAAKwlD,uCAQ1C,KAAAC,mCAAqC,KAAK,IAAAC,EACvDT,EAAAA,GAAuBlc,SAAS/oC,KAAKJ,MAAMjF,QAAQgQ,QAA2C,QAApC+6C,EAAE1lD,KAAKJ,MAAM/D,KAAKqpD,0BAAkB,IAAAQ,OAAA,EAAlCA,EAAoCzmD,QAAQoM,WACxGrL,KAAKmF,SAAS,CAAEkgD,aAAc,MAnN9BrlD,KAAKc,MAAQ,GAEbd,KAAK2lD,YAAc,GAAGnB,EAAyBnqD,aAAa2F,KAAKJ,MAAMjE,MAAMiqD,EAAAA,OAAOC,KAAKC,iBACzFtB,EAAyBuB,qBAAuB/lD,KAAK2lD,YAErD3lD,KAAKwlD,kCAAmC,EAGrC1/B,oBAAiB,IAAAkgC,EAChBhmD,KAAK2lD,cAAgBnB,EAAyBuB,uBAIlD/lD,KAAKimD,gBACLhB,EAAAA,GAAuBlc,SAAS/oC,KAAKJ,MAAMjF,QAAQgQ,QAA2C,QAApCq7C,EAAEhmD,KAAKJ,MAAM/D,KAAKqpD,0BAAkB,IAAAc,OAAA,EAAlCA,EAAoC/mD,QAAQinD,kBAAkBC,UACtH,CACIC,WAAYpmD,KAAK2lD,YAKjBU,QAASA,KACLrmD,KAAKwlD,kCAAmC,EAExCxlD,KAAKimD,oBAMdloC,uBAAoB,IAAAuoC,EACvBrB,EAAAA,GAAuBlc,SACnB/oC,KAAKJ,MAAMjF,QAAQgQ,QACe,QADR27C,EAC1BtmD,KAAKJ,MAAM/D,KAAKqpD,0BAAkB,IAAAoB,OAAA,EAAlCA,EAAoCrnD,QACtCinD,kBAAkBK,YAAYvmD,KAAK2lD,aAGlCpkD,SAAM,IAAAilD,EAAA35B,EACT,GAAI7sB,KAAK2lD,cAAgBnB,EAAyBuB,qBAC9C,OAAO,KAGX,MAAM94B,EAASzvB,EAAAA,EAAA,GACRwC,KAAKJ,OAAK,IACb6e,YAAa,CACTA,YAAaze,KAAKJ,MAClBvF,UAAWmqD,EAAyBnqD,UACpCsB,GAAIqE,KAAK2lD,aAEbc,eAAgBzmD,KAAKotB,wBACrBs5B,oBAAoB,EACpBC,gCAAiC3mD,KAAKwlD,mCAGpCd,EAAc1kD,KAAK4mD,oCAA2D,QAAxBJ,EAACxmD,KAAKc,MAAMukD,oBAAY,IAAAmB,EAAAA,EAAgC,QAAhC35B,EAAI7sB,KAAKJ,MAAM/D,KAAKwpD,oBAAY,IAAAx4B,OAAA,EAA5BA,EAA8B5tB,QAEtH,IAAK2S,EAAAA,gBAAgBC,YAAY6yC,GAC7B,OAAO1kD,KAAKJ,MAAMyf,WAAW4N,GAGjCA,EAAUy5B,oBAAqB,EAE/B,MAAMG,EAAgB7mD,KAAK8mD,oBAiB3B,OAhBKrlB,EAAAA,iBAAiBC,kBAAkBmlB,KACpC55B,EAAU85B,cAAgB/mD,KAAKJ,MAAM/E,UAAUmsD,4CAC1ChlD,QAAQ,MAAO0iD,EAAYj4C,OAAOR,YAClCjK,QAAQ,MAAO6kD,EAAc56C,aAGtCghB,EAAUje,WAAahP,KAAKc,MAAMkO,WAClCie,EAAUg6B,oBAAsBjnD,KAAKslD,qBACrCr4B,EAAUi6B,iBAAmBlnD,KAAKmnD,qBAAqBzC,GACvDz3B,EAAUm6B,wBAA0BpnD,KAAKykD,wBAAwBC,GACjEz3B,EAAUo6B,uBAAwBpjC,EAAAA,EAAAA,IAAW,qBAAsBjkB,KAAKJ,MAAMjF,QAAQgX,eACtFsb,EAAUq6B,kCAAoCtnD,KAAKylD,mCACnDx4B,EAAUs6B,sBAAwBvnD,KAAK+kD,uBACvC93B,EAAUu6B,qBAAuBxnD,KAAKynD,4BAA4Bx6B,EAAUo6B,uBAC5Ep6B,EAAUy6B,eAAiB1nD,KAAK2nD,wBAEzB3nD,KAAKJ,MAAMyf,WAAW4N,GAEzB25B,oCAAoClC,GAAwD,IAAAkD,EAChG,MAAM/2C,GAAYC,EAAAA,EAAAA,IAAa9Q,KAAKJ,MAAMjF,QAAQgQ,UAClD4jB,EAAAA,EAAAA,mBAAkB1d,GAElB,OAD0F,QAAlE+2C,EAAGlD,MAAAA,OAAW,EAAXA,EAAa1tC,QAAO9b,GAAWA,EAAQ2V,YAAcA,WAAU,IAAA+2C,EAAAA,EAAI,GAG1F,sBAAmB,IAAAC,EACvB,MAAMt7C,EAAQ04C,EAAAA,GAAuBlc,SAAS/oC,KAAKJ,MAAMjF,QAAQgQ,QAA2C,QAApCk9C,EAAE7nD,KAAKJ,MAAM/D,KAAKqpD,0BAAkB,IAAA2C,OAAA,EAAlCA,EAAoC5oD,QAAQsN,MAChH7F,EAAQ,IAAIohD,EAAAA,2CAA2Cv7C,GACvDm4C,QAAoBqD,EAAAA,EAAAA,6CAA4CrhD,EAAO1G,KAAKJ,MAAMjF,QAAQgX,eAC1Fq2C,EAAyBhoD,KAAK4mD,oCAAoClC,GACxE1kD,KAAKmF,SAAS,CAAEkgD,aAAc2C,IAC9BhoD,KAAKioD,0BAA0BD,GAG3BC,0BAA0BvD,GAC9B,GAAIA,GAAe9yC,EAAAA,gBAAgBC,YAAY6yC,GAAc,CACzD,MAAMwD,EAAQloD,KAAK8mD,oBACnB,GAAIoB,GAASloD,KAAKJ,MAAMjF,QAAQ+c,IAAIjC,OAAOovC,wBAAyB,CAChE,MAAMsD,EAAcD,EAAQxD,EAAYj4C,OAExC,OADAzM,KAAKmF,SAAS,CAAEy/C,sBAAuBuD,IAChCA,IAMXhB,qBAAqBzsD,GACzB,MAAM0tD,EAAiC,GAAG5D,EAAyB6D,6CAC7DC,EAAwB,GAAGF,mBAC3BG,EAAuB,GAAG/D,EAAyB6D,kCAEzD,OAAO3tD,EAASO,KAAIypD,IAChB,MAAMxpD,EAAUwpD,EAAYxpD,QAE5B,IAAIstD,EACJ,GAAInW,EAAAA,GAAiBl1B,UAAW,CAAC,IAAD0sB,EAC5B,MAAM/nB,GAAaC,EAAAA,EAAAA,mBAAkB7mB,EAAS8E,KAAKJ,MAAMjF,QAAQgX,eAC3D+D,EAAU,IAAIsrC,IAAIl/B,EAAY/I,OAAO6kB,SAAStjC,OAChDmuD,EAAAA,EAAAA,IAAiBzoD,KAAKJ,MAAMjF,QAAQgX,cAAcmH,iBAClDpD,EAAQyrC,aAAa16C,IAAI,YAAa,GAAGi+C,EAAY7zC,aAEvC,QAAlBg5B,EAAA3uC,EAAQssC,kBAAU,IAAAqC,GAAlBA,EAAoB5uC,KAAIurC,IAAY,IAAA2D,EAChC,MAAMrI,EAAyC,QAA3BqI,EAAG3D,EAAU7E,sBAAc,IAAAwI,OAAA,EAAxBA,EAA0BlI,MACjD,IAAKr4B,EAAAA,iBAAiBC,mBAAmBi4B,GAAiB,CACtD,MAAMof,GAAgB1d,EAAAA,EAAAA,6CAA4CgD,EAAUrF,oBAC5EzrB,EAAQyrC,aAAa16C,IAAIy6C,EAAepf,OAGhD0mB,EAAkB9yC,EAAQpb,KAG9B,MAAO,CACHkuD,gBAAAA,EACA9D,YAAAA,EACAgE,2BACIluD,IAAAA,cAACmuD,EAAAA,GAAmC,CAChCtuD,UAAW,GAAGmqD,EAAyB6D,4BACvCxtD,UAAWmF,KAAKJ,MAAM/E,UACtByP,OAAQo6C,EAAYp6C,OACpBmyC,eAAgBz8C,KAAK+kD,uBACrBpqD,QAASqF,KAAKJ,MAAMjF,QACpBgB,GAAIqE,KAAKJ,MAAMjE,GACfC,SAAUoE,KAAKJ,MAAMhE,SACrBC,KAAM,KAGd+sD,aACIpuD,IAAAA,cAAA,KAAGH,UAAW+tD,EAAgC9tD,KAAMkuD,GAC/CxoD,KAAK6oD,oBAAoBP,EAAuB5D,EAAYxpD,UAGrE4tD,YACItuD,IAAAA,cAAA,KAAGH,UAAWkuD,EAAsBjuD,KAAMkuD,GACrC9D,EAAYxpD,QAAQ8X,UA2DjC8zC,oBACJ,MAAMiC,GAAW5pC,EAAAA,EAAAA,UAAS,CAAEsO,QAASC,EAAAA,YAAYs7B,QAASruD,QAASqF,KAAKJ,MAAMjF,QAAQgQ,UACtF,MAAiB,OAAbo+C,GAAkC,OAAbA,EACd/oD,KAAKJ,MAAMjF,QAAQ+c,IAAIjC,OAAOwzC,qCAElCjpD,KAAKJ,MAAMjF,QAAQ+c,IAAIjC,OAAOyzC,sCASjCL,oBAAoBxuD,EAAmBa,GAAuB,IAAAiuD,EAAAC,EAAA12C,EAClE,GAAI+uB,EAAAA,iBAAiBC,kBAAkBxmC,GACnC,OAGJ,MAAMmuD,EAAuB,kBACvB1gB,EAAuC,CACzCzS,UAAW,CACPzW,GAAI,CAAE7M,EAAGy2C,EAAsB3pC,EAAG,EAAGyW,EAAG,GACxCtW,GAAI,CAAEjN,EAAGy2C,EAAsB3pC,EAAG,EAAGyW,EAAG,GACxCC,GAAI,CAAExjB,EAAGy2C,EAAsB3pC,EAAG,EAAGyW,EAAG,IAE5CE,UAAU,GAGd,OACI77B,IAAAA,cAACqhD,EAAAA,GAAK,CACFzgD,IAAKF,EAAQ8X,KACbgkC,IAA4B,QAAzBmS,EAAEjuD,EAAQ+mB,uBAAe,IAAAknC,EAAAA,EAAI,GAChCG,YAKK,QALMF,GACPG,EAAAA,EAAAA,qBACIruD,EAAQumD,OACRzhD,KAAKJ,MAAMjF,QAAQgX,cAAcmH,eAAepO,YAClB,QAD6BgI,EAC3D1S,KAAKJ,MAAMjF,QAAQgQ,QAAQ+M,WAAG,IAAAhF,GAAQ,QAARA,EAA9BA,EAAgC+C,cAAM,IAAA/C,OAAA,EAAtCA,EAAwC8jC,yBAC3C,IAAA4S,EAAAA,EAAI,GAET5pC,aAAcxf,KAAKJ,MAAMjF,QAAQgQ,QAAQ6U,aACzC5kB,cAAe+tC,EACfmT,oBAAoB,QACpBzhD,UAAWA,EACXye,eAAgB9Y,KAAKJ,MAAMjF,QAAQgX,cAAcmH,iBAKrDsU,wBAAqB,IAAAo8B,EACzB,MAAMC,EAAwC,QAAxBD,EAAGxpD,KAAKc,MAAMkO,kBAAU,IAAAw6C,EAAAA,EAAIxpD,KAAKwlD,iCACjDkE,EAA2B,GAAGlF,EAAyBmF,wCAC7D,IAAIC,EAAoB,GAAGpF,EAAyBqF,oCAKpD,OAJKJ,IACDG,EAAoB,GAAGpF,EAAyBqF,sCAG7C,CACHxvD,UAAWqP,GAAAA,CAAWggD,EAA0BlF,EAAyBqF,wBAAyBD,GAClGjhD,QAAS3I,KAAKslD,qBACdh9C,KAAM,SACN4B,SAAU,GAIVu9C,4BAA4BJ,GAChC,OACI7sD,IAAAA,cAACmU,EAAAA,OAAM,CACHtU,UAAW,GAAGmqD,EAAyBsF,oCACvCxvD,KAAM+sD,EACNp0C,MAAOjT,KAAKJ,MAAM/E,UAAUkvD,4CAE3B/pD,KAAKJ,MAAM/E,UAAUkvD,4CAK1BpC,wBACJ,OACIntD,IAAAA,cAACmU,EAAAA,OAAM,CACHtU,UAAW,GAAGmqD,EAAyBsF,6BACvC72C,MAAOjT,KAAKJ,MAAM/E,UAAUmvD,4CAC5BrhD,QAAS3I,KAAKylD,oCAEbzlD,KAAKJ,MAAM/E,UAAUmvD,8CArUXxF,EAAAnqD,UAAY,gCAEZmqD,EAAAyF,mBAAqB,GAAGzF,EAAyBnqD,uBAEjDmqD,EAAAmF,uBAAyB,GAAGnF,EAAyByF,qCAErDzF,EAAA0F,gBAAkB,GAAG1F,EAAyBmF,iCAE9CnF,EAAA2F,qBAAuB,GAAG3F,EAAyB0F,yBAEnD1F,EAAA4F,eAAiB,GAAG5F,EAAyBmF,gCAE7CnF,EAAA6D,kBAAoB,GAAG7D,EAAyB4F,8BAEhD5F,EAAAsF,gBAAkB,GAAGtF,EAAyBmF,iCAE9CnF,EAAAqF,wBAA0B,GAAGrF,EAAyB0F,4BA2TjF,0LC9YO,MAAMG,EAAgGzqD,IAAQ,IAAA0qD,EAAAC,EAAAC,EACjH,IAAK5qD,EAAM8mD,mBACP,OAAO,KAGX,MAAM+C,EAAmC,QAAnBa,EAAG1qD,EAAMoP,kBAAU,IAAAs7C,EAAAA,EAAI1qD,EAAM+mD,gCAE7CsD,EAAqBvgD,GAAAA,CACvB86C,EAAAA,yBAAyBmF,uBACzBF,EAAmB,GAAK,GAAGjF,EAAAA,yBAAyBmF,qCAGxD,OACInvD,EAAAA,cAACimB,EAAAA,OAAMle,OAAAC,OAAA,GAAK5C,EAAM6e,aACdjkB,EAAAA,cAAC4lB,EAAAA,KAAI,CAAC/lB,UAAWmqD,EAAAA,yBAAyByF,oBACtCzvD,EAAAA,cAAC4lB,EAAAA,KAAI,CAAC/lB,UAAW4vD,GACbzvD,EAAAA,cAAC4lB,EAAAA,KAAI,CAAC/lB,UAAW,GAAGmqD,EAAAA,yBAAyBmF,2CACzCnvD,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK5C,EAAM6mD,gBACZjsD,EAAAA,cAAC4lB,EAAAA,KAAI,CAAC/lB,UAAWmqD,EAAAA,yBAAyB0F,iBACtC1vD,EAAAA,cAAC4lB,EAAAA,KAAI,CAAC/lB,UAAWmqD,EAAAA,yBAAyB2F,sBACtC3vD,EAAAA,cAAC4lB,EAAAA,KAAI,CAAC/lB,UAAW,GAAGmqD,EAAAA,yBAAyB2F,+BAC7C3vD,EAAAA,cAAC4lB,EAAAA,KAAI,CAAC/lB,UAAW,GAAGmqD,EAAAA,yBAAyB2F,mCACxCvqD,EAAM/E,UAAU4vD,oCAErBjwD,EAAAA,cAAC4lB,EAAAA,KAAI,CAAC/lB,UAAW,GAAGmqD,EAAAA,yBAAyB2F,kCACxCvqD,EAAMmnD,kBAKvBvsD,EAAAA,cAAC4lB,EAAAA,KAAI,CAAC/lB,UAAWmqD,EAAAA,yBAAyB4F,eAAgBp2C,IAAI,SAC1DxZ,EAAAA,cAAC4lB,EAAAA,KAAI,CAAC/lB,UAAU,GAAG2Z,IAAI,SACnBxZ,EAAAA,cAAC4lB,EAAAA,KAAI,CAAC/lB,UAAWmqD,EAAAA,yBAAyB6D,kBAAmBr0C,IAAI,MACtC,QAD0Cu2C,EAChE3qD,EAAMsnD,wBAAgB,IAAAqD,OAAA,EAAtBA,EAAwBtvD,KAAIyvD,GAErBlwD,EAAAA,cAAC4lB,EAAAA,KAAI,CAAC/lB,UAAU,GAAG2Z,IAAI,KAAK5Y,IAAKsvD,EAAKhG,YAAYp6C,QAC7CogD,EAAKhC,2BACLgC,EAAK9B,gBAIjBhpD,EAAMwnD,yBAEX5sD,EAAAA,cAAC4lB,EAAAA,KAAI,CAAC/lB,UAAWmqD,EAAAA,yBAAyB6D,kBAAmBr0C,IAAI,MACtC,QAD0Cw2C,EAChE5qD,EAAMsnD,wBAAgB,IAAAsD,OAAA,EAAtBA,EAAwBvvD,KAAIyvD,GAErBlwD,EAAAA,cAAC4lB,EAAAA,KAAI,CAAC/lB,UAAU,GAAG2Z,IAAI,KAAK5Y,IAAKsvD,EAAKhG,YAAYp6C,QAC7C+nC,EAAAA,GAAiBl1B,UAAYutC,EAAK5B,iBAAcrrD,SAQ7EjD,EAAAA,cAAC4lB,EAAAA,KAAI,CAAC/lB,UAAWmqD,EAAAA,yBAAyBsF,iBACrClqD,EAAM8nD,eACN9nD,EAAM4nD,0BAQ/B,8MClDYmD,kCAAZ,SAAYA,GACRA,EAAAA,EAAA,eACAA,EAAAA,EAAA,uBACAA,EAAAA,EAAA,uBACAA,EAAAA,EAAA,qBACAA,EAAAA,EAAA,qBACAA,EAAAA,EAAA,eACAA,EAAAA,EAAA,qBACAA,EAAAA,EAAA,kBACAA,EAAAA,EAAA,kBATJ,CAAYA,IAAAA,EAA2B,KAehC,MAAMC,UAA6BpwD,IAAAA,cAC9B,2BAA2BU,GAC/B,OAAIumC,EAAAA,iBAAiBC,kBAAkBxmC,EAAQ2vD,eACpC,KAIPrwD,IAAAA,cAAA,YACKU,EAAQ4vD,aACR5vD,EAAQ2vD,eAKb,2BAA2B3vD,GAAuB,IAAA6vD,EACtD,OAAItpB,EAAAA,iBAAiBupB,WAAsC,QAA5BD,EAAC7vD,EAAQ+vD,2BAAmB,IAAAF,OAAA,EAA3BA,EAA6BG,aAClD,KAGJ1wD,IAAAA,cAAA,YAAOU,EAAQ+vD,oBAAqBC,eAGvC,0BAA0BhwD,GAC9B,OAAIumC,EAAAA,iBAAiBC,kBAAkBxmC,EAAQiwD,cACpC,KAGJ3wD,IAAAA,cAAA,YAAOU,EAAQiwD,cAGlB,0BAA0BjwD,GAC9B,OAAIumC,EAAAA,iBAAiBC,kBAAkBxmC,EAAQkwD,YACpC,KAGJ5wD,IAAAA,cAAA,YAAOU,EAAQkwD,YAGlB,uBAAuBlwD,GAC3B,OAAIumC,EAAAA,iBAAiBC,kBAAkBxmC,EAAQmwD,WACpC,KAIJ7wD,IAAAA,cAAA,QAAM8wD,yBAAyBC,EAAAA,EAAAA,IAAgBrwD,EAAQmwD,aAGlE1rD,YAAmBC,GACfC,MAAMD,GAGH2B,SAAM,IAAAiqD,EACT,MAAMC,EAAgBzrD,KAAKJ,MAAM6rD,cACjC,GAAIhqB,EAAAA,iBAAiBC,kBAAkB+pB,GACnC,OAAO,KAGX,OAAQA,EAAc7uD,eAClB,KAAK+tD,EAA4BhtC,KAE7B,OAAOnjB,IAAAA,cAAA,aACX,KAAKmwD,EAA4BhsD,SAC7B,OAAOisD,EAAqBc,oBAAoBD,GACpD,KAAKd,EAA4BgB,SAC7B,OAAOf,EAAqBgB,oBAAoBH,GACpD,KAAKd,EAA4BkB,QAC7B,OAAOjB,EAAqBkB,mBAAmBL,GACnD,KAAKd,EAA4BoB,QAC7B,OAAOnB,EAAqBoB,mBAAmBP,GACnD,KAAKd,EAA4BvwD,KAC7B,OAAOwwD,EAAqBqB,gBAAgBR,GAChD,KAAKd,EAA4BuB,QAC7B,OAAOlsD,KAAKmsD,qBAAqBV,GACrC,KAAKd,EAA4ByB,MAE7B,OADApsD,KAAKJ,MAAMf,UAAUY,QAAQ,oEACtB,KACX,KAAKkrD,EAA4B/O,MAE7B,OADA57C,KAAKJ,MAAMf,UAAUY,QAAQ,oEACtB,KACX,QAEI,OADAO,KAAKJ,MAAMf,UAAUY,QAAQ,kCAA6D,QAA7D+rD,EAAkCC,EAAc7uD,qBAAa,IAAA4uD,EAAAA,EAAI,2BACvF,MAIXW,qBAAqBjxD,GACzB,OAAIA,EAAQmxD,aACD7xD,IAAAA,cAAA,YAAOwF,KAAKJ,MAAM/E,UAAUyxD,+CAEhC9xD,IAAAA,cAAA,YAAOwF,KAAKJ,MAAM/E,UAAU0xD,+DCvG3C,MAAMC,EACF5sD,IAEA,MAAM+I,GAAU8jD,EAAAA,EAAAA,cAAY,KACxB7sD,EAAM68C,eAAe78C,EAAM0K,UAC5B,CAAC1K,KAEE,UAAEvF,GAAcuF,EAEtB,OAAOpF,IAAAA,cAACmU,EAAAA,OAAM,CAACtU,UAAWA,EAAW4Y,MAAOrT,EAAM/E,UAAU6xD,gDAAiD/jD,QAASA,KAQ7GggD,EACT/oD,GACCpF,IAAAA,cAAoBgyD,EAA+C5sD,iJCU5D0jC,EA2FAqpB,uwBA3FZ,SAAYrpB,GACRA,EAAA,YACAA,EAAA,gBAFJ,CAAYA,IAAAA,EAAa,KA2FzB,SAAYqpB,GACRA,EAAAA,EAAA,eACAA,EAAAA,EAAA,iBAFJ,CAAYA,IAAAA,EAAwB,KAQ7B,MAAMC,UAA0BpyD,IAAAA,UA8FnCmF,YAAmBC,GACfC,MAAMD,GAmJO,KAAAitD,gCAAkC,KAAW,IAAA7H,EAC1DC,EAAAA,GAAuBlc,SAAS/oC,KAAKJ,MAAMjF,QAAQgQ,QAA2C,QAApCq6C,EAAEhlD,KAAKJ,MAAM/D,KAAKqpD,0BAAkB,IAAAF,OAAA,EAAlCA,EAAoC/lD,QAAQoM,WACxGrL,KAAKmF,SAAS,CAAEkgD,aAAc,MAMjB,KAAAyH,4BAA8B,KAAW,IAAAC,EAEtD,GAAwB,QAAxBA,EAAI/sD,KAAKgtD,uBAAe,IAAAD,GAApBA,EAAsB7mD,QAAS,CAC/B,MAAM+mD,EAAyDjtD,KAAKgtD,gBAAgB9mD,QAAQusC,uBACxFma,EAAkBM,sBAElBt7C,EAAAA,gBAAgBC,YAAY0gC,MAAMC,KAAKya,MACnC/vC,EAAAA,GAASC,WAAahW,SAASgmD,gBAAgBC,UANtC,EAOTH,EAA4B,GAAGI,UAAUpgB,IAAI2f,EAAkBU,4BAE/DL,EAA4B,GAAGI,UAAUE,OAAOX,EAAkBU,+BA+BjE,KAAAE,cAAiB1oD,IAAwC,IAAA2oD,EAC5C,QAA1BA,EAAAztD,KAAK0tD,6BAAqB,IAAAD,GAAS,QAATA,EAA1BA,EAA4BvnD,eAAO,IAAAunD,GAAnCA,EAAqCnf,SAAS,CAAEF,IAAKtpC,EAAMO,cAAc+nD,UAAWnf,KAAMnpC,EAAMO,cAAcsoD,aAC9G3tD,KAAK4tD,uBAQQ,KAAAC,mBAAsBC,IAAuC,IAAAC,EAAAC,EAAAC,EAC1E,MAAMC,EAAoC,QAA3BH,EAAG/tD,KAAKmuD,2BAAmB,IAAAJ,OAAA,EAAxBA,EAA0B7nD,QAC5C,IAAKgoD,EACD,OAGJ,IAKIE,EALAC,EAAoC,QAA3BL,EAAGhuD,KAAKsuD,2BAAmB,IAAAN,GAAS,QAATA,EAAxBA,EAA0B9nD,eAAO,IAAA8nD,OAAA,EAAjCA,EAAmCO,iBACjC9wD,IAAd4wD,IACAA,EAAYruD,KAAKwuD,iBAIrB,MAAMC,EAAiB5yC,KAAKiJ,KAAKopC,EAAUP,YAC3C,GAAIG,IAAcnB,EAAyB1e,KAAM,CAC7CmgB,EAAkBK,EAAiBJ,EACnC,MAAMK,EAAkB,EACxBN,EAAkBvyC,KAAK1Y,IAAIirD,EAAiBM,OACzC,CACH,MAAMC,EAAYT,EAAUU,YAAcV,EAAUK,YACpDH,EAAkBK,EAAiBJ,EACnCD,EAAkBvyC,KAAK3Y,IAAIkrD,EAAiBO,GAG5CzxC,EAAAA,GAASC,WAAkE,SAA1B,QAA3B8wC,EAAA9mD,SAAS0nD,KAAKC,qBAAa,IAAAb,OAAA,EAA3BA,EAA6B3iD,aAAa,UAChE8iD,GAAmBA,GAGvBF,EAAU5f,SAAS,CACfF,IAAK8f,EAAUd,UACfnf,KAAMmgB,IAGVpuD,KAAKmF,UAASypC,IACV,QAA6CnxC,IAAzCmxC,EAAcmgB,uBACd,MAAO,GAEX,IAAIC,EAAS,EAIb,OAHIlB,IAAcnB,EAAyB1e,OACvC+gB,GAAU,GAEP,CACHD,uBAAwBngB,EAAcmgB,uBAAyBC,EAC/DC,qBAAsBhU,KAAKC,MAC3BgU,wBAAoBzxD,MAI5BuC,KAAK4tD,uBAOQ,KAAAuB,qBAAuB,KAAK,IAAAC,EACrClyC,EAAAA,GAASC,WAAkE,SAA1B,QAA3BiyC,EAAAjoD,SAAS0nD,KAAKC,qBAAa,IAAAM,OAAA,EAA3BA,EAA6B9jD,aAAa,QAChEtL,KAAK6tD,mBAAmBlB,EAAyB0C,OAEjDrvD,KAAK6tD,mBAAmBlB,EAAyB1e,OAQxC,KAAAqhB,iBAAmB,KAAK,IAAAC,EACjCryC,EAAAA,GAASC,WAAkE,SAA1B,QAA3BoyC,EAAApoD,SAAS0nD,KAAKC,qBAAa,IAAAS,OAAA,EAA3BA,EAA6BjkD,aAAa,QAChEtL,KAAK6tD,mBAAmBlB,EAAyB1e,MAEjDjuC,KAAK6tD,mBAAmBlB,EAAyB0C,QAOxC,KAAAb,cAAgB,KAAa,IAAAgB,EAC1C,MAAMtB,EAAoC,QAA3BsB,EAAGxvD,KAAKmuD,2BAAmB,IAAAqB,OAAA,EAAxBA,EAA0BtpD,QACtC6iD,GAAW5pC,EAAAA,EAAAA,UAAS,CAAEsO,QAASC,EAAAA,YAAYs7B,QAASruD,QAASqF,KAAKJ,MAAMjF,QAAQgQ,UACtF,IAAI0jD,EAAoB,IAcxB,MAZiB,OAAbtF,GAAqBmF,EACrBG,EAAYH,GAAaA,EAAUK,YAAc,EAC5B,OAAbxF,GAAkC,OAAbA,IAAsBmF,EAG/CA,IACAG,EAAYH,GAAaA,EAAUK,YAAc,GAHrDF,EAAYH,GAAaA,EAAUK,YAAc,EAOrDF,EAAYxyC,KAAKgJ,MAAMwpC,GAEhBA,GAMM,KAAAT,oBAAsB,KAAK,IAAA6B,EAAAC,EACxC,MAAMxB,EAAoC,QAA3BuB,EAAGzvD,KAAKmuD,2BAAmB,IAAAsB,OAAA,EAAxBA,EAA0BvpD,QAC5C,IAAKgoD,EACD,OAGJ,MACMS,EAAYT,EAAUU,YAAcV,EAAUK,YAC9CE,EAAiB5yC,KAAKiJ,KAAKopC,EAAUP,YAEvCzwC,EAAAA,GAASC,WAAkE,SAA1B,QAA3BuyC,EAAAvoD,SAAS0nD,KAAKC,qBAAa,IAAAY,OAAA,EAA3BA,EAA6BpkD,aAAa,SAC5DmjD,GALuB,EAMnBzuD,KAAK2vD,yBACL3vD,KAAK2vD,wBAAyB,EAC9B3vD,KAAK4vD,eAED5vD,KAAK2vD,yBACb3vD,KAAK2vD,wBAAyB,EAC9B3vD,KAAK4vD,eAGLnB,GAAkBE,EACd3uD,KAAK6vD,6BACL7vD,KAAK6vD,4BAA6B,EAClC7vD,KAAK4vD,eAED5vD,KAAK6vD,6BACb7vD,KAAK6vD,4BAA6B,EAClC7vD,KAAK4vD,iBAGLnB,GAzBuB,EA0BnBzuD,KAAK6vD,6BACL7vD,KAAK6vD,4BAA6B,EAClC7vD,KAAK4vD,eAED5vD,KAAK6vD,6BACb7vD,KAAK6vD,4BAA6B,EAClC7vD,KAAK4vD,eAGLnB,GAAkBE,EACd3uD,KAAK2vD,yBACL3vD,KAAK2vD,wBAAyB,EAC9B3vD,KAAK4vD,eAED5vD,KAAK2vD,yBACb3vD,KAAK2vD,wBAAyB,EAC9B3vD,KAAK4vD,iBASA,KAAA7K,uBAA0Bz6C,IAAwB,IAAAo7C,EAC/DT,EAAAA,GAAuBlc,SAAS/oC,KAAKJ,MAAMjF,QAAQgQ,QAA2C,QAApC+6C,EAAE1lD,KAAKJ,MAAM/D,KAAKqpD,0BAAkB,IAAAQ,OAAA,EAAlCA,EAAoCzmD,QAAQkmD,eAAe76C,GACvHtK,KAAKmF,UAASypC,IAAgB,IAAAwW,EAC1B,IAAI0K,EAAqBlhB,EAAcmgB,uBAIvC,OAHIe,IAAuB9vD,KAAK2vD,wBAA0B3vD,KAAK6vD,6BAC3DC,GAAsB,GAEnB,CACHzK,aAAwC,QAA5BD,EAAExW,EAAcyW,oBAAY,IAAAD,OAAA,EAA1BA,EAA4BpuC,QAAOtK,GAAQA,EAAKpC,SAAWA,IACzE2kD,qBAAsBhU,KAAKC,MAC3BgU,wBAAoBzxD,EACpBsxD,uBAAwBe,OA6BnB,KAAAC,eAAkBzlD,GAAmB,KAClDtK,KAAKgwD,oBAAsB1lD,EAE3BtK,KAAKmF,SAAS,CACV8pD,qBAAsBhU,KAAKC,MAC3BgU,mBAAoB5kD,KASX,KAAA2lD,gBAAmB3lD,GAAmB,KAC/CtK,KAAKgwD,sBAAwB1lD,IAIjCtK,KAAKgwD,yBAAsBvyD,EAC3ByyD,GAAAA,EAAS,KACLlwD,KAAKmF,SAAS,CACV8pD,qBAAsBhU,KAAKC,MAC3BgU,wBAAoBzxD,MAEzB,MAuHU,KAAA0yD,QAAU,KACvB,MAAMC,GAAoBnsC,EAAAA,EAAAA,IAAW,OAAQjkB,KAAKJ,MAAMjF,QAAQgX,gBAAkB,GACxD,KAAtBxK,SAASkpD,SACTt3C,OAAO6kB,SAAStjC,KAAO81D,EAEvBr3C,OAAOC,QAAQs3C,QAtiBnBtwD,KAAK2lD,YAAc,GAAGiH,EAAkBvyD,aAAa2F,KAAKJ,MAAMjE,MAAMiqD,EAAAA,OAAOC,KAAKC,iBAElF9lD,KAAKc,MAAQ,CACTukD,kBAAc5nD,EACdwxD,qBAAsBhU,KAAKC,MAC3BgU,wBAAoBzxD,EACpBsxD,uBAAwB,GAG5B/uD,KAAKgtD,gBAAkBxyD,IAAAA,YACvBwF,KAAK0tD,sBAAwBlzD,IAAAA,YAC7BwF,KAAKmuD,oBAAsB3zD,IAAAA,YAC3BwF,KAAKsuD,oBAAsB9zD,IAAAA,YA1DvB,kCAAkCE,GACtC,MAAM61D,EAAiB71D,EAASO,KAAIC,IAAO,IAAAs1D,EAAA,OAA0B,QAA1BA,EAAIt1D,EAAQq1D,sBAAc,IAAAC,OAAA,EAAtBA,EAAwBC,sBACjEC,EAAsC9+C,EAAAA,gBAAgB2+B,QAAQggB,GAG9DI,EAAqB/+C,EAAAA,gBAAgB4+B,YACvCkgB,EACK15C,QAAOy0C,GAHY,IAGKA,EAAcmF,mBACtC31D,KAAIwwD,GAAiBA,EAAcz4C,QAEtC69C,EAA2Bj/C,EAAAA,gBAAgBk/C,OAAOH,GAKxD,OAJ6B/+C,EAAAA,gBAAgB4+B,YACzCqgB,EAAyB51D,KAAI81D,GAAQL,EAAkBn0D,MAAKkvD,GAAiBA,EAAcz4C,OAAS+9C,OAMpG,8BAA8Br2D,GAClC,MAAM+zB,EAAa/zB,EAASO,KAAIC,GAAWA,EAAQ81D,YAAYxpB,aACzDypB,EAAoCr/C,EAAAA,gBAAgB2+B,QAAQ9hB,GAAYzX,QAC1EwvB,IAAc/E,EAAAA,iBAAiBC,kBAAkB8E,EAAU7E,kBAGzDuvB,EAAet/C,EAAAA,gBAAgB4+B,YAAYygB,EAAch2D,KAAIurC,GAAaA,EAAUrF,sBAG1F,OAF2BvvB,EAAAA,gBAAgBk/C,OAAOI,GAK9C,iCAAiCh2D,GACrC,OAAI0O,EAAAA,iBAAiBC,mBAAmB3O,MAAAA,OAAO,EAAPA,EAASk1B,aACtC,KAEJ51B,IAAAA,cAAA,KAAGH,UAAW,GAAGuyD,EAAkBvyD,0BAA2Ba,EAASk1B,aAG1E,qCACJ,MAAO,CACH/1B,UAAWuyD,EAAkBuE,oBAsB9BrrC,oBAAiB,IAAAkgC,EACpBhmD,KAAKimD,gBACLhB,EAAAA,GAAuBlc,SAAS/oC,KAAKJ,MAAMjF,QAAQgQ,QAA2C,QAApCq7C,EAAEhmD,KAAKJ,MAAM/D,KAAKqpD,0BAAkB,IAAAc,OAAA,EAAlCA,EAAoC/mD,QAAQinD,kBAAkBC,UACtH,CACIC,WAAYpmD,KAAK2lD,YAKjBU,QAASA,KAELrmD,KAAKimD,mBAIb/oC,EAAAA,GAASC,WACTpE,OAAOqE,iBAAiB,UAAU,KAC9Bpd,KAAK8sD,iCAGb9sD,KAAK8sD,8BAGF/uC,uBAAoB,IAAAuoC,EACvBrB,EAAAA,GAAuBlc,SACnB/oC,KAAKJ,MAAMjF,QAAQgQ,QACe,QADR27C,EAC1BtmD,KAAKJ,MAAM/D,KAAKqpD,0BAAkB,IAAAoB,OAAA,EAAlCA,EAAoCrnD,QACtCinD,kBAAkBK,YAAYvmD,KAAK2lD,aAGlCzG,sBACHC,EACAC,GAEA,OAAIp/C,KAAKc,MAAMukD,eAAiBjG,EAAUiG,cAAgBrlD,KAAKJ,QAAUu/C,IAKrEn/C,KAAKc,MAAMouD,qBAAuB9P,EAAU8P,oBAC5ClvD,KAAKc,MAAMiuD,yBAA2B3P,EAAU2P,wBAIjDxtD,SAAM,IAAAilD,EAAA35B,EACT,MAAMI,EAASzvB,EAAAA,EAAA,GACRwC,KAAKJ,OAAK,IACb6e,YAAa,CACTA,YAAaze,KAAKJ,MAClBvF,UAAWuyD,EAAkBvyD,WAEjC+2D,+BAAgCpxD,KAAK6sD,gCACrCnG,oBAAoB,EACpB2K,gBAAgB,EAChB9tC,QAASvjB,KAAKsxD,iBACdjR,QAASrgD,KAAKuxD,iBACd7J,eAAgB1nD,KAAK2nD,wBACrB6J,wBAAyB5E,EAAkB6E,8BAC3CC,gBAAiB1xD,KAAK2xD,yBACtBC,YAAa5xD,KAAK6xD,qBAClBC,eAAgB9xD,KAAK+xD,8BACrBC,gBACIx3D,IAAAA,cAAA,OAAKH,UAAW,GAAGuyD,EAAkBvyD,8BAA+B2F,KAAKJ,MAAMwe,MAAM6zC,+BAIvF5M,EAAsC,QAA1BmB,EAAGxmD,KAAKc,MAAMukD,oBAAY,IAAAmB,EAAAA,EAAIxmD,KAAKkyD,qCAAiE,QAA7BrlC,EAAC7sB,KAAKJ,MAAM/D,KAAKwpD,oBAAY,IAAAx4B,OAAA,EAA5BA,EAA8B5tB,QACxH,QAAqBxB,IAAjB4nD,EACA,OAAOrlD,KAAKJ,MAAMyf,WAAW4N,GAIjC,IADuBjtB,KAAKJ,MAAMjF,QAAQgQ,QAAQy3C,QAAQQ,mBAClChxC,EAAAA,gBAAgBC,YAAYwzC,GAEhD,OADAp4B,EAAUokC,gBAAiB,EACpBrxD,KAAKJ,MAAMyf,WAAW4N,GAG7Brb,EAAAA,gBAAgBC,YAAYwzC,KAC5Bp4B,EAAU9Z,iBAAmBnT,KAAKJ,MAAM/E,UAAUs3D,2BAA2BnwD,QAAQ,MAAOqjD,EAAa54C,OAAOR,aAGpHjM,KAAK4tD,sBACL,MAAMwE,EAAuBpyD,KAAKmnD,qBAAqB9B,GACjDgN,EAAwBryD,KAAKsyD,yBAAyBjN,GACtDkN,EAYA,GA4BN,OA3BAF,MAAAA,GAAAA,EAAuBp3D,KAAIurC,IACvB,MAAM1E,EAAiB9hC,KAAKwyD,0BAA0BhsB,EAAW4rB,GAEjE,OADAG,EAAsB10D,KAAKikC,GACpBywB,KAEXtlC,EAAUy5B,oBAAqB,EAC/Bz5B,EAAUwlC,eAAiBzyD,KAAKgtD,gBAChC//B,EAAUylC,qBAAuB1yD,KAAK0tD,sBACtCzgC,EAAU0lC,mBAAqB3yD,KAAKmuD,oBACpClhC,EAAU2lC,mBAAqB5yD,KAAKsuD,oBACpCrhC,EAAUgiC,qBAAuBjvD,KAAKc,MAAMmuD,qBAC5ChiC,EAAUiiC,mBAAqBlvD,KAAKc,MAAMouD,mBAC1CjiC,EAAU4lC,0BAA4B7yD,KAAK6vD,2BAC3C5iC,EAAU6lC,sBAAwB9yD,KAAK2vD,uBACvC1iC,EAAU8hC,uBAAyB/uD,KAAKc,MAAMiuD,uBAC9C9hC,EAAU8lC,oBAAsB/yD,KAAKmvD,qBACrCliC,EAAU+lC,gBAAkBhzD,KAAKsvD,iBACjCriC,EAAUgmC,aAAejzD,KAAKwtD,cAC9BvgC,EAAUimC,cAAgBlzD,KAAK+vD,eAC/B9iC,EAAUkmC,eAAiBnzD,KAAKiwD,gBAChChjC,EAAUs6B,sBAAwBvnD,KAAK+kD,uBACvC93B,EAAUi6B,iBAAmBkL,EAC7BnlC,EAAUmmC,mBAAqBxG,EAAkByG,uBAAuBhO,GACxEp4B,EAAUqmC,gBAAkBf,EAC5BtlC,EAAUsmC,qBAAuB3G,EAAkB4G,2BAA2BnO,GAC9Ep4B,EAAUwmC,oBAAsBzzD,KAAK0zD,uBAAuBzmC,EAAUsmC,qBAAsBtmC,EAAUi6B,kBAE/FlnD,KAAKJ,MAAMyf,WAAW4N,GA8BzBilC,qCACJxN,GAAqD,IAAAkD,EAErD,MAAM/2C,GAAYC,EAAAA,EAAAA,IAAa9Q,KAAKJ,MAAMjF,QAAQgQ,UAClD4jB,EAAAA,EAAAA,mBAAkB1d,GAElB,OAD0F,QAAlE+2C,EAAGlD,MAAAA,OAAW,EAAXA,EAAa1tC,QAAO9b,GAAWA,EAAQ2V,YAAcA,WAAU,IAAA+2C,EAAAA,OAAInqD,EAI1F,sBAAmB,IAAAoqD,EACvB,MAAMt7C,EAAQ04C,EAAAA,GAAuBlc,SAAS/oC,KAAKJ,MAAMjF,QAAQgQ,QAA2C,QAApCk9C,EAAE7nD,KAAKJ,MAAM/D,KAAKqpD,0BAAkB,IAAA2C,OAAA,EAAlCA,EAAoC5oD,QAAQsN,MAChH7F,EAAQ,IAAIitD,EAAAA,GAAoCpnD,GACtD,IAAIm4C,QACEkP,EAAAA,EAAAA,IAAqCltD,EAAO1G,KAAKJ,MAAMjF,QAAQgX,eAAeoJ,MAAKrO,IACrFg4C,EAAch4C,KAElB,MAAMs7C,EAAyBhoD,KAAKkyD,qCAAqCxN,GACzE1kD,KAAKmF,SAAS,CAAEkgD,aAAc2C,IAoM1B6L,iBAAiB34D,GAAmC,IAAA44D,EACxD,MAAMC,EAAgBniD,EAAAA,gBAAgBC,YAAY7R,KAAKJ,MAAMwe,MAAM41C,YAAch0D,KAAKJ,MAAMwe,MAAM41C,WAAW,GAAK,KAClH,GAAIvyB,EAAAA,iBAAiBC,kBAAkBqyB,GACnC,OAAO,KAGX,MAAM9zB,EAAmD,QAAjC6zB,EAAG54D,EAAQ81D,YAAYxpB,kBAAU,IAAAssB,OAAA,EAA9BA,EAAgC98C,QAAOwvB,IAAS,IAAA2D,EAAA,OAA4B,QAA5BA,EAAI3D,EAAU7E,sBAAc,IAAAwI,OAAA,EAAxBA,EAA0BlI,SAEzG,OAAOznC,IAAAA,aAAmBu5D,EAAqC,CAC3DpX,kBAAmBzhD,EAAQ81D,YAAY3tD,SACvC48B,mBAAAA,IA2CA4oB,oBAAoBxuD,EAAmBa,GAAuB,IAAAiuD,EAAAC,EAClE,MACIzuD,SACIgX,eACImH,gBAAgB,YAAEpO,IAEtBC,SACI+M,KAAK,iBAAE8+B,MAGfx2C,KAAKJ,MAET,GAAI6hC,EAAAA,iBAAiBC,kBAAkBxmC,GACnC,OAGJ,MAAM+4D,EAAwB,kBACxBtrB,EAAuC,CACzCzS,UAAW,CACPzW,GAAI,CAAE7M,EAAGqhD,EAAuBv0C,EAAG,EAAGyW,EAAG,GACzCtW,GAAI,CAAEjN,EAAGqhD,EAAuBv0C,EAAG,EAAGyW,EAAG,GACzCC,GAAI,CAAExjB,EAAGqhD,EAAuBv0C,EAAG,EAAGyW,EAAG,IAE7CE,UAAU,GAGd,OACI77B,IAAAA,cAACqhD,EAAAA,GAAK,CACF3E,QAASh8C,MAAAA,OAAO,EAAPA,EAAS8X,KAClB5X,IAAKF,EAAQ8X,KACbgkC,IAA4B,QAAzBmS,EAAEjuD,EAAQ+mB,uBAAe,IAAAknC,EAAAA,EAAI,GAChCG,YAA+E,QAApEF,GAAEG,EAAAA,EAAAA,qBAAoBruD,EAAQumD,OAAQ/2C,EAAa8rC,UAAiB,IAAA4S,EAAAA,EAAI,GACnF5pC,aAAcxf,KAAKJ,MAAMjF,QAAQgQ,QAAQ6U,aACzC5kB,cAAe+tC,EACfmT,oBAAoB,QACpBzhD,UAAWA,EACXye,eAAgB9Y,KAAKJ,MAAMjF,QAAQgX,cAAcmH,iBAKrDo7C,qBAAqB5pD,GACzB,MAAM6pD,EAAqBn0D,KAAKc,MAAMouD,qBAAuB5kD,EAC7D,IAAI4/C,EAAkB0C,EAAkBwH,yBAIxC,OAHID,IACAjK,EAAkBxgD,GAAAA,CAAWwgD,EAAiB,uCAE3C,CACH7vD,UAAW6vD,EACX9uD,IAAK,GAAG8uD,cAA4B5/C,KAAUtK,KAAKc,MAAMouD,sBAAsBlvD,KAAKc,MAAMiuD,yBAC1FsF,aAAcr0D,KAAK+vD,eAAezlD,GAClCgqD,aAAct0D,KAAKiwD,gBAAgB3lD,IAInCiqD,mBAAmBjqD,GACvB,MAAM6pD,EAAqBn0D,KAAKc,MAAMouD,qBAAuB5kD,EAC7D,IAAIkqD,EAAgB5H,EAAkB6H,mBAItC,OAHIN,IACAK,EAAgB9qD,GAAAA,CAAW8qD,EAAe,uCAEvC,CACHn6D,UAAWm6D,EACXp5D,IAAK,GAAGo5D,cAA0BlqD,KAAUtK,KAAKc,MAAMouD,qBACvDmF,aAAcr0D,KAAK+vD,eAAezlD,GAClCgqD,aAAct0D,KAAKiwD,gBAAgB3lD,GACnChC,KAAM,WACN4B,SAAU,GAIVwqD,qBAAqBj8C,GAAuB,IAAAk8C,EAChD,GAAIlzB,EAAAA,iBAAiBC,kBAAkBjpB,MAAAA,OAAM,EAANA,EAAQ2f,eAC3C,OAAO,KAGX,MAAMw8B,EAAcn8C,EAIpB,OACIje,IAAAA,cAACoO,EAAAA,gBAAe,CACZC,UAAW+rD,EAAYx8B,cACvBnvB,UAAQ,EACR1O,WAAWgF,EAAAA,EAAAA,QAAOS,KAAKJ,MAAM/E,UAAUg6D,4CAA6CD,EAAYx8B,cAAe,KAC/GrvB,YAAa,GAA2B,QAA3B4rD,EAAGC,EAAYt8B,oBAAY,IAAAq8B,EAAAA,EAPpB,IAQpBG,iCAA+B,EAC/Bj5D,KAAM,GACNlB,QAASqF,KAAKJ,MAAMjF,QACpBgB,GAAIqE,KAAKJ,MAAMjE,GACfC,SAAUoE,KAAKJ,MAAMhE,WAKzBm2D,8BACJ,OACIv3D,IAAAA,cAACmU,EAAAA,OAAMpM,OAAAC,OAAA,CACHnI,UAAU,uCACN2F,KAAKJ,MAAMf,UAAS,CACxByJ,KAAK,SACLhO,KAAK,IACLqO,QAAS3I,KAAKmwD,QACdl9C,MAAOjT,KAAKJ,MAAM/E,UAAUk6D,sBAE3B/0D,KAAKJ,MAAM/E,UAAUk6D,qBAmB1BC,kBAAkB9xB,GACtB,OAAIA,IAAgB+xB,EAAAA,qBAAqBC,MAC9Bl1D,KAAKJ,MAAM/E,UAAUs6D,2CAE5BjyB,IAAgB+xB,EAAAA,qBAAqBG,KAC9Bp1D,KAAKJ,MAAM/E,UAAUw6D,0CAG5BnyB,IAAgB+xB,EAAAA,qBAAqBK,MAC9Bt1D,KAAKJ,MAAM/E,UAAU06D,gDADhC,EAMI/C,0BAA0BtvB,EAAqBxoC,GACnD,MAAM86D,EAAqB,GAAG5I,EAAkB6I,qCAAqCvyB,IAC/EwyB,EAAuB11D,KAAKg1D,kBAAkB9xB,GAC9Cge,GAAgB1d,EAAAA,EAAAA,6CAA4CN,GAClE,IAAIG,EAAyBC,EAAclpC,KAE3C,MAAMqpC,EAAgEzjC,KAAKJ,MAAMjF,QAAQ+c,IAAIjC,OAAO+H,wBAEhG5L,EAAAA,gBAAgBC,YAAY4xB,IAC3BA,MAAAA,GAAAA,EAAiChmB,SAASC,EAAAA,eAAeC,OAD1D/L,MAEA6xB,IAAAA,EAAiChmB,SAASyjC,KAE1C7d,EAAyBC,EAAcI,QAG3C,MAAMiyB,EAAyBj7D,EAASO,KAAI26D,IAAkB,IAAApmB,EAC1D,IAEIqmB,EAFArvB,EAAgC,GAChCsvB,EAAoB,GAEI,QAA5BtmB,EAAAxvC,KAAKJ,MAAM/D,KAAKwpD,oBAAY,IAAA7V,GAAQ,QAARA,EAA5BA,EAA8BvwC,cAAM,IAAAuwC,GAApCA,EAAsCv0C,KAAI86D,IACwD,IAADC,EAAAC,EAAzFF,EAAkB/E,YAAY3tD,WAAauyD,EAAgB16D,QAAQ81D,YAAY3tD,WAC/EmjC,EAAoD,QAA3CwvB,EAA+B,QAA/BC,EAAGF,EAAkBtnC,kBAAU,IAAAwnC,OAAA,EAA5BA,EAA8BxnC,kBAAU,IAAAunC,EAAAA,EAAI,IAE5D,OAAOxvB,KAGPnD,IAA2BC,EAAcI,SACzCmyB,EACIr7D,IAAAA,cAAA,OAAKH,UAAU,2BACVmsC,EAAUvrC,KAAIi7D,GAEP17D,IAAAA,cAAA,OACIH,UAAU,+BACVe,IAAK,gCAAgCw6D,EAAgB16D,QAAQoP,UAE5D4rD,EAAej3D,OAAOhE,KAAI6nC,IAAgB,IAAAqzB,EACvC,IAAIC,EACJ,MAAMC,EA8BA,QA9BQF,EACVrzB,EAAc7nC,KAAiBq7D,IAAa,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EACxC,IAAIC,GAA8B,EAClC,MAAM/2B,EAAmE,QAAjDs2B,EAAGX,EAAgB16D,QAAQ81D,YAAYxpB,kBAAU,IAAA+uB,OAAA,EAA9CA,EAAgDv/C,QACvEtK,GAAQA,EAAKy0B,qBAAuBm1B,EAAWn1B,qBAEnDlB,MAAAA,GAAAA,EAAoBhlC,KAAIg8D,IAAoB,IAAAC,EAQxC,YANyCz5D,IAArCw5D,EAAkBt1B,gBAClBs1B,EAAkBt1B,eAAew1B,eACJ,QADeD,EACxCZ,EAAW30B,sBAAc,IAAAu1B,OAAA,EAAzBA,EAA2BC,eAE/BH,GAAqB,GAElBA,KAGPV,EAAWn1B,qBAAuB+B,IAClCkzB,EAAqBE,EAAWn1B,oBAEpC,MAAM73B,EAAgB43C,EACtB,MAAO,CACH52C,OAAQ,GAAsC,QAAtCksD,EAA4B,QAA5BC,EAAGH,EAAW30B,sBAAc,IAAA80B,OAAA,EAAzBA,EAA2BpzD,gBAAQ,IAAAmzD,EAAAA,EAAI,MACvC,QADyCE,EAA6B,QAA7BC,EAAIL,EAAW30B,sBAAc,IAAAg1B,OAAA,EAAzBA,EAClD10B,aAAK,IAAAy0B,EAAAA,EAAI,KACf7zD,MAAuC,QAAlC+zD,EAA2B,QAA3BC,EAAEP,EAAW30B,sBAAc,IAAAk1B,OAAA,EAAzBA,EAA2B50B,aAAK,IAAA20B,EAAAA,EAAI,GAC3CttD,cAAAA,EACAiB,aAAuC,QAA3BusD,EAAER,EAAW30B,sBAAc,IAAAm1B,OAAA,EAAzBA,EAA2B50B,aACzC13B,SAAmC,QAA3BusD,EAAET,EAAW30B,sBAAc,IAAAo1B,OAAA,EAAzBA,EAA2B50B,SACrCa,UAAWg0B,aAEjB,IAAAb,EAAAA,EAAI,GACV,OAAIC,GAAsBA,IAAuBlzB,EAEzC1oC,IAAAA,cAACiQ,EAAAA,gBAAe,CACZrP,IAAK8nC,EACLx4B,YAAa1K,KAAKJ,MAAMjF,QAAQgQ,QAAQD,YACxCE,KAAMyrD,EACNxrD,oBAAoB,IAIzB,aAS/Bw4B,IAA2BC,EAAclpC,MACzCosC,EAAUvrC,KAAIyR,GACHA,EAAKzN,OAAOhE,KAAIsR,GACZA,EAAMtR,KAAI6nC,IACb,GAAIA,EAAc3B,qBAAuB+B,EAAa,CAAC,IAADk0B,EAAAC,EAClD,MAAMC,EACY,KAAdxB,EACM91D,KAAKJ,MAAM/E,UAAU08D,0BACrBv3D,KAAKJ,MAAM/E,UAAU08D,0BAA0Bv1D,QAAQ,IAAK,IACtE8zD,IAAwBv2D,EAAAA,EAAAA,QAAO+3D,EAAmE,QAArCF,EAA8B,QAA9BC,EAAEv0B,EAAcnB,sBAAc,IAAA01B,OAAA,EAA5BA,EAA8Bp1B,aAAK,IAAAm1B,EAAAA,EAAI,IAE1G,OAAOtB,SAMvB,MAAM0B,EAAiB,CACnBn0D,SAAUuyD,EAAgB16D,QAAQ81D,YAAY3tD,SAC9C4+B,MAAO6zB,EACPqB,YAAaj0B,EACbf,SAAUyzB,EAAgB16D,QAAQ81D,YAAY/uC,iBAGlD,MAAO,CACHu1C,eAAAA,EACA5B,gBAAAA,EACA6B,KACIj9D,IAAAA,cAAA,OAAKY,IAAK,GAAGw6D,EAAgB16D,QAAQoP,UAAUkrD,KAC1CnyB,IAA2BC,EAAcI,OAASmyB,EAAe2B,EAAev1B,WAKjG,MAAO,CACHiB,YAAAA,EACAge,cAAewU,EACfF,mBAAAA,EACAG,uBAAAA,GAGAjC,uBAAuBnD,EAAkC71D,GAC7D,OAAO61D,EAAet1D,KAAIwwD,IACtB,MAAMiM,EAAyB,GAAG9K,EAAkB+K,6CAA6ClM,EAAcz4C,OAEzG4kD,EAAsBl9D,EAASO,KAAI26D,IAAkB,IAAAiC,EACvD,MAAMC,EAA6D,QAAzCD,EAAGjC,EAAgB16D,QAAQq1D,sBAAc,IAAAsH,OAAA,EAAtCA,EAAwCpH,mBAAmBl0D,MACpFw7D,GAAyBA,EAAsB/kD,OAASy4C,EAAcz4C,OAG1E,MAAO,CACH8kD,qBAAAA,EACAlC,gBAAAA,EACA6B,KACIj9D,IAAAA,cAAA,OAAKY,IAAK,GAAGw6D,EAAgB16D,QAAQoP,UAAUotD,KAC3Cl9D,IAAAA,cAACowD,EAAAA,GAAoB,CACjBa,cAAeqM,EACfj5D,UAAWmB,KAAKJ,MAAMf,UACtBlE,QAASqF,KAAKJ,MAAMjF,QACpBE,UAAWmF,KAAKJ,MAAM/E,iBAO1C,MAAO,CACH4wD,cAAAA,EACAiM,uBAAAA,EACAE,oBAAAA,MAKJtG,iBACJ,OAAO92D,IAAAA,cAACspB,EAAAA,QAAO,CAACzpB,UAAW,GAAGuyD,EAAkBvyD,oBAAqBD,KAAM4F,KAAKJ,MAAM/E,UAAUm9D,yBAG5FzG,iBACJ,OAAO/2D,IAAAA,cAAA,OAAKH,UAAW,GAAGuyD,EAAkBvyD,sBAAuB2F,KAAKJ,MAAM/E,UAAUo9D,8BAGpFtQ,wBACJ,OACIntD,IAAAA,cAACmU,EAAAA,OAAM,CACHtU,UAAW,GAAGuyD,EAAkBuE,uCAAsC,aAC1DnxD,KAAKJ,MAAM/E,UAAUq9D,yCACjCvvD,QAAS3I,KAAK6sD,iCAEb7sD,KAAKJ,MAAM/E,UAAUs9D,qCAU1B7F,yBAAyB53D,GAC7B,MAAM+zB,EAAa/zB,EAASO,KAAIC,GAAWA,EAAQ81D,YAAYxpB,aACzDypB,EAAoCr/C,EAAAA,gBAAgB2+B,QAAQ9hB,GAE5DyiC,EAAet/C,EAAAA,gBAAgB4+B,YAAYygB,EAAch2D,KAAIurC,GAAaA,EAAUrF,sBAG1F,OAF2BvvB,EAAAA,gBAAgBk/C,OAAOI,GAK9CS,yBACJ,OACIn3D,IAAAA,cAACmU,EAAAA,OAAM,CACHtU,UAAWqP,GAAAA,CAAWkjD,EAAkBwL,sBAAuB,GAAGxL,EAAkBwL,mCACpF9vD,KAAK,SACLK,QAAS3I,KAAKmvD,qBACdkJ,QAASr4D,KAAKmvD,sBAEd30D,IAAAA,cAAA,QAAMH,UAAW,GAAGuyD,EAAkBwL,wCAAuC,cAAc,SAC3F59D,IAAAA,cAAA,QAAMH,UAAU,sBAAsB2F,KAAKJ,MAAM/E,UAAUy9D,mCAK/DzG,qBACJ,OACIr3D,IAAAA,cAACmU,EAAAA,OAAM,CACHtU,UAAWqP,GAAAA,CAAWkjD,EAAkBwL,sBAAuB,GAAGxL,EAAkBwL,+BACpF9vD,KAAK,SACLK,QAAS3I,KAAKsvD,iBACd+I,QAASr4D,KAAKsvD,kBAEd90D,IAAAA,cAAA,QAAMH,UAAW,GAAGuyD,EAAkBwL,oCAAmC,cAAc,SACvF59D,IAAAA,cAAA,QAAMH,UAAU,sBAAsB2F,KAAKJ,MAAM/E,UAAU09D,+BAK/DC,kCAAkCluD,GACtC,OACI9P,IAAAA,cAACmuD,EAAAA,GAAmC,CAChCtuD,UAAW,GAAGuyD,EAAkB6L,8BAChCr9D,IAAKkP,EACLzP,UAAWmF,KAAKJ,MAAM/E,UACtByP,OAAQA,EACRmyC,eAAgBz8C,KAAK+kD,uBACrBpqD,QAASqF,KAAKJ,MAAMjF,QACpBgB,GAAIqE,KAAKJ,MAAMjE,GACfC,SAAUoE,KAAKJ,MAAMhE,SACrBC,KAAM,KAKVsrD,qBAAqBzsD,GACzB,MAAMu3C,GAAmBnhC,EAAAA,EAAAA,IAAa9Q,KAAKJ,MAAMjF,QAAQgQ,SAEzD,OADA4jB,EAAAA,EAAAA,mBAAkB0jB,GACXv3C,EAASO,KAAIC,IAChB,IAAIw9D,EACJ,GAAIrmB,EAAAA,GAAiBl1B,UAAW,CAAC,IAADw7C,EAC5B,MAAM72C,GAAaC,EAAAA,EAAAA,mBAAkB7mB,EAAQ81D,YAAahxD,KAAKJ,MAAMjF,QAAQgX,eACvE+D,EAAU,IAAIsrC,IAAIl/B,EAAY/I,OAAO6kB,SAAStjC,OAChDmuD,EAAAA,EAAAA,IAAiBzoD,KAAKJ,MAAMjF,QAAQgX,cAAcmH,iBAClDpD,EAAQyrC,aAAa16C,IAAI,YAAa,GAAGvL,EAAQ2V,aAEvB,QAA9B8nD,EAAAz9D,EAAQ81D,YAAYxpB,kBAAU,IAAAmxB,GAA9BA,EAAgC19D,KAAIurC,IAAY,IAAAya,EAC5C,MAAMnf,EAAyC,QAA3Bmf,EAAGza,EAAU7E,sBAAc,IAAAsf,OAAA,EAAxBA,EAA0Bhf,MACjD,IAAKr4B,EAAAA,iBAAiBC,mBAAmBi4B,GAAiB,CACtD,MAAMof,GAAgB1d,EAAAA,EAAAA,6CAA4CgD,EAAUrF,oBAC5EzrB,EAAQyrC,aAAa16C,IAAIy6C,EAAepf,OAGhD42B,EAAiBhjD,EAAQpb,KAE7B,MAAM65D,EAAqBn0D,KAAKc,MAAMouD,qBAAuBh0D,EAAQoP,OACrE,IAAIkqD,EAAgB5H,EAAkBwH,yBAClCD,IACAK,EAAgB9qD,GAAAA,CAAW8qD,EAAe,uCAE9C,MAAMoE,EAAuB19D,EAAQ2V,YAAcohC,EAE7CmW,EAAiC,GAAGwE,EAAkB6L,+CACtDnQ,EAAwB,GAAGF,mBAC3BG,EAAuB,GAAGqE,EAAkB6L,oCAC5CI,EAAwB,GAAGjM,EAAkB6L,qCAC7CK,EAAe94D,KAAKwuD,gBACpBpvD,EAAQ,CACV25D,MAAO,GAAGD,MACVE,SAAU,GAAGF,MACbG,SAAU,GAAGH,OAEjB,MAAO,CACHI,mBAAoB,CAChB7+D,UAAWm6D,EACXp5D,IAAKF,EAAQoP,OACbxH,IAAK9C,KAAKsuD,oBACV+F,aAAcr0D,KAAK+vD,eAAe70D,EAAQoP,QAC1CgqD,aAAct0D,KAAKiwD,gBAAgB/0D,EAAQoP,QAC3ChC,KAAM,WACN4B,SAAU,EACV9K,MAAOA,GAEXlE,QAAAA,EACA4mB,WAAY42C,EACZhQ,2BAA4B1oD,KAAKw4D,kCAAkCt9D,EAAQoP,QAC3Es+C,aACIpuD,IAAAA,cAAA,OAAKH,UAAW+tD,EAAgChtD,IAAKF,EAAQoP,QACxDtK,KAAK6oD,oBAAoBP,EAAuBptD,EAAQ81D,cAGjElI,YACItuD,IAAAA,cAAA,KAAGH,UAAWkuD,EAAsBjuD,KAAMo+D,EAAgBt9D,IAAKF,EAAQoP,QAClEpP,EAAQ81D,YAAYh+C,MAG7B+iB,aACIv7B,IAAAA,cAAA,OAAKH,UAAWw+D,EAAuBz9D,IAAKF,EAAQoP,QAC/CpP,EAAQ46B,OACLt7B,IAAAA,cAAC+8B,EAAAA,eAAc,CACX58B,QAASqF,KAAKJ,MAAMjF,QACpBgB,GAAIqE,KAAKJ,MAAMjE,GACfC,SAAUoE,KAAKJ,MAAMhE,SACrBC,KAAM,CAAEi6B,MAAO56B,EAAQ46B,OACvBx6B,cAAe0E,KAAKJ,MAAM/E,UAAUs+D,sCACpC39D,kBAAmBwE,KAAKJ,MAAM/E,UAAUu+D,0CACxC39D,iBAAkBuE,KAAKJ,MAAM/E,UAAUw+D,4CAKvD7Z,UAAWx/C,KAAK6zD,iBAAiB34D,GACjC09D,qBAAAA,EACAU,yBACI9+D,IAAAA,cAACmU,EAAAA,OAAM,CAACrU,KAAMo+D,EAAgBzlD,MAAOjT,KAAKJ,MAAM/E,UAAU0+D,+CACrDv5D,KAAKJ,MAAM/E,UAAU0+D,+CAG9BC,eAAgBx5D,KAAKu0D,mBAAmBr5D,EAAQoP,QAChDmvD,iBAAkBz5D,KAAKk0D,qBAAqBh5D,EAAQoP,QACpDovD,mBACuBj8D,IAAnBvC,EAAQud,OAAuBje,IAAAA,cAAA,OAAKY,IAAKF,EAAQoP,QAAStK,KAAK00D,qBAAqBx5D,EAAQud,cAAiBhb,EACjHk8D,wBAC4Bl8D,IAAxBvC,EAAQ81D,YACJx2D,IAAAA,cAAA,OAAKY,IAAKF,EAAQoP,QAASsiD,EAAkBgN,0BAA0B1+D,EAAQ81D,mBAE/EvzD,OAx+BGmvD,EAAAvyD,UAAoB,yBAEpBuyD,EAAAjD,uBAAyB,GAAGiD,EAAkBvyD,4BAE9CuyD,EAAA3C,mBAAqB,GAAG2C,EAAkBjD,oCAE1CiD,EAAAxC,eAAiB,GAAGwC,EAAkB3C,4BAEtC2C,EAAAM,qBAAuB,GAAGN,EAAkBxC,yBAE5CwC,EAAA6L,oBAAsB,GAAG7L,EAAkBM,oCAE3CN,EAAAwL,sBAAwB,GAAGxL,EAAkBxC,0BAE7CwC,EAAAiN,mBAAqB,GAAGjN,EAAkBxC,uBAE1CwC,EAAAvE,kBAAoB,GAAGuE,EAAkBxC,sBAEzCwC,EAAA6I,uBAAyB,GAAG7I,EAAkBiN,qCAE9CjN,EAAA+K,2BAA6B,GAAG/K,EAAkBiN,yCAElDjN,EAAAkN,yBAA2B,GAAGlN,EAAkBxC,8BAEhDwC,EAAAwH,yBAA2B,GAAGxH,EAAkBvE,iCAEhDuE,EAAA6H,mBAAqB,GAAG7H,EAAkBvE,0BAE1CuE,EAAAuE,mBAAqB,GAAGvE,EAAkBvyD,wBAE1CuyD,EAAAU,2BAA6B,GAAGV,EAAkBM,+BAElDN,EAAAmN,oCAAsC,GAAGnN,EAAkBkN,wCA+8BtF,yLC9nCA,MAAME,EAA2BA,CAC7B77B,EAIA87B,EACAlL,IAEO5wB,EAAOljC,KAAI,CAAC4H,EAAO1H,IAClBA,IAAU4zD,EAENv0D,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,CACDpH,IAAKyH,EAAM+yD,gBAAgB6D,iBAAiBr+D,KACxCyH,EAAM+yD,gBAAgB6D,iBAAgB,CAC1CnxD,KAAK,WACL4xD,SAAS,IACT96D,MAAOyD,EAAM+yD,gBAAgBsD,mBAAmB95D,QAE/C66D,GAINz/D,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,CAACpH,IAAKD,GAAW0H,EAAM+yD,gBAAgB6D,iBAAgB,CAAEr6D,MAAOyD,EAAM+yD,gBAAgBsD,mBAAmB95D,WAUvH+6D,EAAqBA,CACvBh8B,EAIA+wB,IAEO/wB,EAAOljC,KAAI4H,GAEVrI,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GACGK,EAAM+yD,gBAAgB4D,eAAc,CACxCp+D,IAAK,GAAGyH,EAAM+yD,gBAAgB16D,QAAQoP,UAAU4kD,IAChD9vD,MAAOyD,EAAM+yD,gBAAgBsD,mBAAmB95D,QAE/CyD,EAAM40D,QAUV2C,EAAkFx6D,IAAQ,IAAA2qD,EAAAC,EAAA6P,EAAAC,EAAAC,EAAAC,EAAAC,EACnG,OACIjgE,EAAAA,cAACimB,EAAAA,OAAMle,OAAAC,OAAA,GAAK5C,EAAM6e,aACb7e,EAAMkyD,eACNlyD,EAAM2jB,QACP/oB,EAAAA,cAAC4lB,EAAAA,KAAI,CAAC/lB,UAAW,GAAGuyD,EAAAA,kBAAkBvyD,iCAAkCuF,EAAMuT,kBAC7EvT,EAAMyxD,gBAAkBzxD,EAAM8mD,wBAAqBjpD,EAAYmC,EAAMygD,QACrEzgD,EAAMyxD,eAAiBzxD,EAAMoyD,qBAAkBv0D,EAChDjD,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK5C,EAAM4xD,0BACV5xD,EAAMyxD,gBAAkBzxD,EAAM8mD,mBAAqB9mD,EAAM8nD,oBAAiBjqD,GAE/EmC,EAAM8mD,mBACHlsD,EAAAA,cAAC4lB,EAAAA,KAAI,CAAC/lB,UAAWuyD,EAAAA,kBAAkBjD,wBAC/BnvD,EAAAA,cAAC4lB,EAAAA,KAAI,CAAC/lB,UAAWuyD,EAAAA,kBAAkB3C,oBAC/BzvD,EAAAA,cAAC4lB,EAAAA,KAAI,CAAC/lB,UAAWuyD,EAAAA,kBAAkBxC,eAAgBtnD,IAAKlD,EAAM6yD,gBAC1Dj4D,EAAAA,cAAC4lB,EAAAA,KAAI,CAAC/lB,UAAW,GAAGuyD,EAAAA,kBAAkBM,wBAClC1yD,EAAAA,cAAC4lB,EAAAA,KAAI,CACD/lB,UAAW,GAAGuyD,EAAAA,kBAAkBM,0CAChCpqD,IAAKlD,EAAM8yD,sBAEV9yD,EAAMizD,2BAA6BjzD,EAAM8xD,gBAC1Cl3D,EAAAA,cAAC4lB,EAAAA,KAAI,CACD/lB,UAAWqP,GAAAA,CACPkjD,EAAAA,kBAAkBvE,kBAClB,GAAGuE,EAAAA,kBAAkBM,qCAEzB5kD,KAAK,QAEkB,QAFZiiD,EAEV3qD,EAAMsnD,wBAAgB,IAAAqD,OAAA,EAAtBA,EAAwBtvD,KAAI26D,IACzB,MAAMgD,EAAuBhD,EAAgBgD,qBACvC8B,EAAmB,GAAG9N,EAAAA,kBAAkB6L,+BAC9C,OACIj+D,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GACGozD,EAAgBsD,mBAAkB,CACtC99D,IAAKw6D,EAAgBsD,mBAAmB99D,IACxCgE,MAAOw2D,EAAgBsD,mBAAmB95D,QAEzCw2D,EAAgBlN,2BAChBkN,EAAgBhN,aAChBvW,EAAAA,GAAiBl1B,UAAYy4C,EAAgB9M,iBAAcrrD,EAC3Dm4D,EAAgB7/B,aACjBv7B,EAAAA,cAAC4lB,EAAAA,KAAI,CAAC/lB,UAAWqgE,EAAkBt/D,IAAKw6D,EAAgB16D,QAAQoP,QAC3DsuD,EACKhD,EAAgBpW,UAChBoW,EAAgB0D,+BAMzC15D,EAAMkzD,uBAAyBlzD,EAAMgyD,cAG9Cp3D,EAAAA,cAAC4lB,EAAAA,KAAI,CACD/lB,UAAWuyD,EAAAA,kBAAkBiN,mBAC7Bc,SAAU/6D,EAAMqzD,aAChBnwD,IAAKlD,EAAM+yD,oBAEY,QAFMnI,EAE5B5qD,EAAMsnD,wBAAgB,IAAAsD,OAAA,EAAtBA,EAAwBvvD,KAAI,CAACwd,EAAQrd,KAAO,IAAAw/D,EAAAC,EACzC,YAAgCp9D,IAAzBgb,EAAOihD,eAAuC,IAARt+D,EACzCZ,EAAAA,cAAC4lB,EAAAA,KAAI,CACD/lB,UAAWqP,GAAAA,CACP,GAAGkjD,EAAAA,kBAAkBiN,iCACrBjN,EAAAA,kBAAkBvE,oBAGtB7tD,EAAAA,cAAC4lB,EAAAA,KAAI,CACD/lB,UAAWuyD,EAAAA,kBAAkBkN,yBAC7B1+D,IAAK,UAAUwE,EAAMmvD,yBACrBzmD,KAAK,QAEkB,QAFZsyD,EAEVh7D,EAAMsnD,wBAAgB,IAAA0T,OAAA,EAAtBA,EAAwB3/D,KAAI,CAAC26D,EAAiBz6D,IACvCA,IAAUyE,EAAMmvD,uBAEZv0D,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,CACDpH,IAAKw6D,EAAgB6D,iBAAiBr+D,KAClCw6D,EAAgB6D,iBAAgB,CACpCnxD,KAAK,WACL4xD,SAAS,IACT96D,MAAOw2D,EAAgBsD,mBAAmB95D,QAEzCQ,EAAM/E,UAAUigE,oCAKzBtgE,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,CACDpH,IAAKw6D,EAAgB6D,iBAAiBr+D,KAClCw6D,EAAgB6D,iBAAgB,CACpCnxD,KAAK,OACL4xD,SAAS,KACT96D,MAAOw2D,EAAgBsD,mBAAmB95D,YAK1D5E,EAAAA,cAAC4lB,EAAAA,KAAI,CACD/lB,UAAW,GAAGuyD,EAAAA,kBAAkBkN,4BAA4BlN,EAAAA,kBAAkBmN,sCAC9EzxD,KAAK,QAEkB,QAFZuyD,EAEVj7D,EAAMsnD,wBAAgB,IAAA2T,OAAA,EAAtBA,EAAwB5/D,KAAI26D,GAErBp7D,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GACGozD,EAAgB4D,eAAc,CAClCp+D,IAAK,GAAGw6D,EAAgB16D,QAAQoP,UAAU1K,EAAMsvD,qBAChD9vD,MAAOw2D,EAAgBsD,mBAAmB95D,QAEzCw2D,EAAgB8D,wBAOrCj8D,KAGe,QADrB48D,EACDz6D,EAAMsnD,wBAAgB,IAAAmT,OAAA,EAAtBA,EAAwBp/D,KAAI,CAACsvC,EAAanvC,KAAO,IAAA2/D,EAAAC,EAC9C,YAA0Cv9D,IAAnC8sC,EAAYovB,oBAA4C,IAARv+D,EACnDZ,EAAAA,cAAC4lB,EAAAA,KAAI,CACD/lB,UAAWqP,GAAAA,CACP,GAAGkjD,EAAAA,kBAAkBiN,sCACrBjN,EAAAA,kBAAkBvE,oBAGtB7tD,EAAAA,cAAC4lB,EAAAA,KAAI,CACD/lB,UAAWuyD,EAAAA,kBAAkBkN,yBAC7B1+D,IAAK,eAAewE,EAAMmvD,yBAC1BzmD,KAAK,QAEkB,QAFZyyD,EAEVn7D,EAAMsnD,wBAAgB,IAAA6T,OAAA,EAAtBA,EAAwB9/D,KAAI,CAAC26D,EAAiBz6D,IACvCA,IAAUyE,EAAMmvD,uBAEZv0D,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,CACDpH,IAAKw6D,EAAgB6D,iBAAiBr+D,KAClCw6D,EAAgB6D,iBAAgB,CACpCnxD,KAAK,WACL4xD,SAAS,IACT96D,MAAOw2D,EAAgBsD,mBAAmB95D,QAEzCQ,EAAM/E,UAAUogE,yCAKzBzgE,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,CACDpH,IAAKw6D,EAAgB6D,iBAAiBr+D,KAClCw6D,EAAgB6D,iBAAgB,CACpCnxD,KAAK,OACL4xD,SAAS,KACT96D,MAAOw2D,EAAgBsD,mBAAmB95D,YAK1D5E,EAAAA,cAAC4lB,EAAAA,KAAI,CACD/lB,UAAW,GAAGuyD,EAAAA,kBAAkBkN,4BAA4BlN,EAAAA,kBAAkBmN,sCAC9EzxD,KAAK,QAEkB,QAFZ0yD,EAEVp7D,EAAMsnD,wBAAgB,IAAA8T,OAAA,EAAtBA,EAAwB//D,KAAI26D,GAErBp7D,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GACGozD,EAAgB4D,eAAc,CAClCp+D,IAAK,GAAGw6D,EAAgB16D,QAAQoP,UAAU1K,EAAMsvD,qBAChD9vD,MAAOw2D,EAAgBsD,mBAAmB95D,QAEzCw2D,EAAgB+D,6BAOrCl8D,KAGc,QADpB68D,EACD16D,EAAM0zD,uBAAe,IAAAgH,OAAA,EAArBA,EAAuBr/D,KAAIu8D,IAEpBA,MAAAA,OAAc,EAAdA,EAAgBtW,gBACZ1mD,EAAAA,cAAC4lB,EAAAA,KAAI,CACD/lB,UAAWqP,GAAAA,CACPkjD,EAAAA,kBAAkB6I,uBAClB7I,EAAAA,kBAAkBvE,kBAClBmP,EAAehC,oBAEnBp6D,IAAKo8D,EAAehC,oBAEpBh7D,EAAAA,cAAC4lB,EAAAA,KAAI,CACD/lB,UAAWuyD,EAAAA,kBAAkBkN,yBAC7B1+D,IAAK,GAAGo8D,EAAetW,iBAAiBthD,EAAMmvD,yBAC9CzmD,KAAK,QAEJ0xD,EACGxC,EAAe7B,uBACf6B,EAAetW,cACfthD,EAAMmvD,yBAIdv0D,EAAAA,cAAC4lB,EAAAA,KAAI,CACD/lB,UAAW,GAAGuyD,EAAAA,kBAAkBkN,4BAA4BlN,EAAAA,kBAAkBmN,sCAC9EzxD,KAAK,QAEJ6xD,EAAmB3C,EAAe7B,uBAAwB/1D,EAAMsvD,wBAM3D,QADxBqL,EACD36D,EAAM6zD,2BAAmB,IAAA8G,OAAA,EAAzBA,EAA2Bt/D,KAAIigE,IAC0D,IAA/EtxD,EAAAA,iBAAiBs8B,cAAcg1B,EAAmBzP,cAAcJ,WACnE7wD,EAAAA,cAAC4lB,EAAAA,KAAI,CACD/lB,UAAWqP,GAAAA,CACPkjD,EAAAA,kBAAkB+K,2BAClB/K,EAAAA,kBAAkBvE,kBAClB6S,EAAmBxD,wBAEvBt8D,IAAK8/D,EAAmBxD,wBAExBl9D,EAAAA,cAAC4lB,EAAAA,KAAI,CACD/lB,UAAWuyD,EAAAA,kBAAkBkN,yBAC7B1+D,IAAK,GAAG8/D,EAAmBzP,cAAcz4C,QAAQpT,EAAMmvD,yBACvDzmD,KAAK,QAEJ0xD,EACGkB,EAAmBtD,oBACnBsD,EAAmBzP,cAAcz4C,KACjCpT,EAAMmvD,yBAGdv0D,EAAAA,cAAC4lB,EAAAA,KAAI,CACD/lB,UAAW,GAAGuyD,EAAAA,kBAAkBkN,4BAA4BlN,EAAAA,kBAAkBmN,sCAC9EzxD,KAAK,QAEJ6xD,EAAmBe,EAAmBtD,oBAAqBh4D,EAAMsvD,2BAI1EzxD,IAGRjD,EAAAA,cAAC4lB,EAAAA,KAAI,CACD/lB,UAAWqP,GAAAA,CACP,GAAGkjD,EAAAA,kBAAkBiN,8BACrBjN,EAAAA,kBAAkBvE,oBAGtB7tD,EAAAA,cAAC4lB,EAAAA,KAAI,CACD/lB,UAAWuyD,EAAAA,kBAAkBkN,yBAC7B1+D,IAAK,OAAOwE,EAAMmvD,yBAClBzmD,KAAK,QAEkB,QAFZkyD,EAEV56D,EAAMsnD,wBAAgB,IAAAsT,OAAA,EAAtBA,EAAwBv/D,KAAI,CAAC26D,EAAiBz6D,IACvCA,IAAUyE,EAAMmvD,uBAEZv0D,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,CACDpH,IAAKw6D,EAAgB6D,iBAAiBr+D,KAClCw6D,EAAgB6D,iBAAgB,CACpCnxD,KAAK,WACL4xD,SAAS,IACT96D,MAAOw2D,EAAgBsD,mBAAmB95D,QAEzCQ,EAAM/E,UAAUsgE,iCAKzB3gE,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,CACDpH,IAAKw6D,EAAgB6D,iBAAiBr+D,KAClCw6D,EAAgB6D,iBAAgB,CACpCr6D,MAAOw2D,EAAgBsD,mBAAmB95D,YAK1D5E,EAAAA,cAAC4lB,EAAAA,KAAI,CACD/lB,UAAW,GAAGuyD,EAAAA,kBAAkBkN,4BAA4BlN,EAAAA,kBAAkBmN,sCAC9EzxD,KAAK,QAEkB,QAFZmyD,EAEV76D,EAAMsnD,wBAAgB,IAAAuT,OAAA,EAAtBA,EAAwBx/D,KAAI26D,GAErBp7D,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GACGozD,EAAgB4D,eAAc,CAClCp+D,IAAK,GAAGw6D,EAAgB16D,QAAQoP,UAAU1K,EAAMsvD,qBAChD9vD,MAAOw2D,EAAgBsD,mBAAmB95D,QAEzCw2D,EAAgB16D,QAAQ81D,YAAYvP,qBAWzEhkD,IAMhB,2IC3WO,MAAM29D,EAA4DjhE,IAA+D,IAA9D,qBAAEkhE,EAAoB,MAAElvD,EAAK,iBAAEukB,EAAgB,QAAE4qC,GAASnhE,EAChI,MAAMijC,GAAUC,EAAAA,EAAAA,kBAAiB,QAAS3M,EAAmBuM,EAAAA,kBAAkBs+B,kBACzEljB,GAAa9a,EAAAA,EAAAA,wBAAuB7M,EAAmB0M,GAC7D,OACI5iC,EAAAA,cAAA,SAAA+H,OAAAC,OAAA,CAAQnI,UAAU,gCAA+B,aAAaghE,EAAsB1yD,QAAS2yD,GAAajjB,GACtG79C,EAAAA,cAAA,QAAMH,UAAU,uCAAsC,kBACjD8R,gBCHV,MAAMqvD,EAAgDrhE,IAA8D,IAA7D,MAAEshE,EAAK,eAAE3iD,EAAc,aAAE4iD,EAAY,iBAAEhrC,GAAkBv2B,EACnH,MAAMwhE,EAAgBC,EAAkBH,EAAO/qC,GAC/C,OACIl2B,EAAAA,cAAA,QAAMH,UAAU,0BACXshE,GAAiBA,EAAclvD,OAAS,EACrCjS,EAAAA,cAACqhE,EAAAA,GAAc,CAACJ,MAAOE,EAAeG,UAAW,CAAEJ,aAAAA,EAAc5iD,eAAAA,KACjE,OAKV8iD,EAAoBA,CAACG,EAAwBrrC,KAC/C,IAAKqrC,GAAgC,IAApBA,EAAStvD,OACtB,OAAO,KAEX,MAAMkvD,EAAuC,GAoB7C,OAnBAI,EAAS3+D,SAAQ,CAAC4+D,EAAM7gE,KAEpB,MAAMiiC,GAAUC,EAAAA,EAAAA,kBAAiB,QAAS3M,EAAkB,GAAI,IAC1DzH,EAAW+yC,EAAK/yC,SAAW+yC,EAAK/yC,SAAW,GACjDmU,EAAQ6+B,cAAcC,MAAQjzC,EAC9B,MAAMovB,GAAa9a,EAAAA,EAAAA,wBAAuB7M,EAAkB0M,GACtD++B,EAAoC,CACtC5hE,UAAWyhE,EAAKzhE,UAChBF,UAAW,wBACX4uB,SAAU+yC,EAAK/yC,SACfC,QAAS8yC,EAAK9yC,QAAQJ,eACtBszC,aAAcJ,EAAKI,aACnB9zD,KAAM,OACNk2C,qBAAsBnG,EACtB1vC,SAAS2vC,EAAAA,EAAAA,kBAAiB5nB,EAAkB0M,EAASnU,IAEzD0yC,EAAc99D,KAAKs+D,MAGhBR,GCvCEU,EAA8CliE,IAA2C,IAA1C,KAAEC,EAAI,aAAEshE,EAAY,eAAE5iD,GAAgB3e,EAC9F,OAAOK,EAAAA,cAACqhE,EAAAA,GAAa,CAACxhE,UAAU,wBAAwB2Z,IAAI,OAAO5Z,KAAMA,EAAM0hE,UAAW,CAAEQ,OAAQZ,EAAc5iD,eAAAA,2kBC0BtH,MAAMyjD,UAAoB/hE,EAAAA,cAA1BmF,cAAA,oBACW,KAAAmB,MAA2B,CAC9By6C,WAAW,EACXihB,WAAW,EACXxjB,YAAa,GAGA,KAAAtoB,kBAAsCqE,EAAAA,EAAAA,oBACnD/0B,KAAKJ,MAAMjF,QAAQgQ,QAAQqqB,kBAC3Bh1B,KAAKJ,MAAMgpC,aACX5oC,KAAKJ,MAAMf,WAmER,KAAA49D,iBAAoB33D,IACnB9E,KAAKJ,MAAM6V,OAAOinD,gBAAkB18D,KAAKJ,MAAM6V,OAAOinD,eAAe,KACrE18D,KAAKJ,MAAM6V,OAAOinD,eAAe,GAAGtiE,KAAO0K,EAAMsG,OAAOvI,QAIzD,KAAA85D,qBAAwBC,GAAuB93D,IAClD,GAAI9E,KAAKJ,MAAM6V,OAAOinD,gBAAkB18D,KAAKJ,MAAM6V,OAAOinD,eAAe,GAAI,CACzE,MAAMjB,EAAQz7D,KAAKJ,MAAM6V,OAAOinD,eAAe,GAAGjB,MAC9CA,IACAA,EAAMmB,GAAW3zC,SAAWnkB,EAAMsG,OAAOvI,SAKpC,KAAAqgD,MAAQ,KACrB,MAAMzH,EAAYz7C,KAAK68D,cAAgB,EAAI78D,KAAKc,MAAMk4C,YAAc,EACpEh5C,KAAKujD,WAAW9H,IAGH,KAAA2H,UAAY,KACzB,MAAM3H,EAAYz7C,KAAK88D,eACjB98D,KAAKJ,MAAM6V,OAAOinD,eACd18D,KAAKJ,MAAM6V,OAAOinD,eAAejwD,OAAS,EAC1C,EACJzM,KAAKc,MAAMk4C,YAAc,EAC/Bh5C,KAAKujD,WAAW9H,IAGH,KAAA8H,WAAcpoD,IACvB6E,KAAKc,MAAMy6C,WAGfv7C,KAAKmF,SAAS,CAAE6zC,YAAa79C,KAGhB,KAAA2hE,aAAe,IAAiC,IAA3B98D,KAAKc,MAAMk4C,YAEhC,KAAA6jB,YAAc,IAC3B78D,KAAKJ,MAAM6V,OAAOinD,gBAAkB18D,KAAKc,MAAMk4C,cAAgBh5C,KAAKJ,MAAM6V,OAAOinD,eAAejwD,OAAS,EAE5F,KAAAswD,WAAa,KAC1B/8D,KAAKmF,SAAS,CAAEq3D,WAAW,KA1GxBj7D,SACH,MAAM,eAAEm7D,EAAc,eAAEtY,EAAc,SAAElL,EAAQ,YAAEiL,EAAW,SAAEF,EAAQ,UAAE5pD,EAAY,IAAO2F,KAAKJ,MAAM6V,QACjG,qBAAE4lD,EAAoB,iBAAE2B,EAAgB,WAAEC,EAAU,gBAAEC,GAAoBl9D,KAAKJ,MAAM/E,WACrF,UAAE2hE,EAAS,YAAExjB,GAAgBh5C,KAAKc,MAExC,IAAK07D,EAED,OADAx8D,KAAKJ,MAAMjF,QAAQkE,UAAU+C,MAAM,sDAC5B,KAGX,MAAMqrB,EAASzvB,EAAAA,EAAA,GAGRwC,KAAKJ,OAAK,IACbvF,UAAWqP,GAAAA,CAAW,kBAAmBrP,GACzCmiE,UAAAA,EACAW,UAAWn9D,KAAK+8D,WAChBK,YAAap9D,KAAK28D,qBAClBU,WAAYr9D,KAAKy8D,iBAEjBa,iBAAkB,CACdjjE,UAAWqP,GAAAA,CAAW,kBAAmBrP,GACzCokB,YAAaze,KAAKJ,MAClB0I,KAAM,SACN,aAAc40D,GAElBK,qBAAsB,CAClBvpD,IAAKqoD,GAETmB,sBAAuB,CACnBxpD,IAAKwnD,EACL9qC,iBAAkB1wB,KAAK0wB,kBAE3B+sC,aAAc,CAAEpjE,UAAW,4BAC3BqjE,gBAAiBT,EACjBP,eAAAA,EACA1jB,YAAAA,EACA2kB,cAAe,CACX3pD,IAAK+kC,EAAAA,SACL1+C,UAAW,4BACX2+C,YAAAA,EACAz7C,KAAMyC,KAAKkjD,MACXjK,SAAUj5C,KAAKojD,UACf3J,yBAA0Bz5C,KAAKujD,WAC/Bqa,cAAezZ,EACfjL,SAAAA,EACAiL,YAAAA,EACAF,SAAAA,GAEJ4Z,YAAazZ,GACT5pD,EAAAA,cAAC4gE,EAAsB74D,OAAAC,OAAA,GACf,CACA84D,QAASt7D,KAAK+8D,WACd5wD,MAAO6wD,EACP3B,qBAAAA,EACA3qC,iBAAkB1wB,KAAK0wB,sBAMvC,OAAO1wB,KAAKJ,MAAMyf,WAAW4N,IAiDrC,kGC1JA,MAmCA,EAnCyDrtB,IACrD,MAAM,iBACF09D,EAAgB,aAChBG,EAAY,YACZI,EAAW,eACXnB,EAAc,qBACda,EAAoB,sBACpBC,EAAqB,cACrBG,EAAa,gBACbD,EAAe,YACfN,EAAW,WACXC,GACAz9D,EAEEk+D,EACFpB,GACAA,EAAezhE,KAAI,CAACmjC,EAASjjC,IAErBX,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKi7D,EAAY,CAAEriE,IAAKD,EAAK,YAAY,MAAMmN,KAAK,YACrD9N,EAAAA,cAAA,QAAMH,UAAU,WAAWqjE,GAC1Bt/B,EAAQhkC,MAAQI,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK+6D,EAAoB,CAAEnjE,KAAMgkC,EAAQhkC,KAAMuO,QAAS00D,KAC7Ej/B,EAAQq9B,OAASr9B,EAAQq9B,MAAMhvD,OAAS,GACrCjS,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKg7D,EAAqB,CAAE/B,MAAOr9B,EAAQq9B,MAAO9yD,QAASy0D,QAMpF,OACI5iE,EAAAA,cAACimB,EAAAA,OAAMle,OAAAC,OAAA,GAAK86D,GACR9iE,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKm7D,EAAa,CAAEpxD,MAAOuxD,KAC/BD,gTCfb,IAAqB5yD,EAArB,cAA2CzQ,EAAAA,cA0BvCmF,YAAYC,GACRC,MAAMD,GA1BO,KAAAsL,iBAA2B,gBA2I3B,KAAAxD,SAAYlI,IACzBA,EAAEmI,iBACFnI,EAAE2L,kBAEF,MAAMC,EAAS5L,EAAE6F,cACXgG,EAAWD,EAAOE,aAAa,SAAUmS,SAAS,6BAClDjS,EAAkBH,OAAW5N,EAAYuC,KAAKyL,0BAA0BL,GAE1EpL,KAAKJ,MAAM8L,iBACX1L,KAAKJ,MAAM8L,gBAAgB,CACvBL,SAAAA,EACAM,YAAaP,EACbQ,cAAeJ,EACfK,gBAAiBT,EAAOU,eA7HhC9L,KAAKo9B,SAAUC,EAAAA,EAAAA,kBAAiB,QAASr9B,KAAKJ,MAAM8wB,iBAAmB,IAvBjE,0BAAuB,IAAA0kB,EAC7B,IAAI,gBAAErpC,GAAoB/L,KAAKJ,MAC/B,MAAM,gCAAEm+D,EAA+B,iBAAEjxD,GAAqB9M,KAAKJ,MAWnE,OATsB,QAAlBw1C,EAAAp1C,KAAKJ,MAAMjF,eAAO,IAAAy6C,OAAA,EAAlBA,EAAoB19B,IAAIjC,OAAOkC,+BAAgCC,EAAAA,GAAqCC,UACpG9L,EAAkBA,EAAgBiL,QAAOgnD,IACrC,MAAM5wD,EAASN,EAAiBvQ,MAC3B8Q,KACKA,EAAUlP,OAAO5B,MAAMsG,IAA+BpG,EAAAA,EAAAA,IAA8BoG,EAAOm7D,OAErG,OAAO5wD,GAAUA,EAAO/J,WAAa06D,MAGtChyD,EAAgB9Q,KAAI,CAACuQ,EAAsCrQ,KACvD,CACHC,IAAK4E,KAAKgM,uBAAuBR,EAAiBrQ,EAAM8Q,YACxDpJ,MAAO2I,MAUZjK,SACH,MAAM,aAAE2K,EAAY,MAAEC,EAAK,WAAEC,EAAU,gBAAEC,EAAe,eAAEC,GAAmBtM,KAAKJ,MAC5E2M,EAAQvM,KAAKwM,oBACnBxM,KAAKo9B,QAAQ6+B,cAAcC,MAAQhwD,EACnC,MAAM+xD,GAAqB1gC,EAAAA,EAAAA,wBAAuBv9B,KAAKJ,MAAM8wB,iBAAmB1wB,KAAKo9B,SACrF,OACI5iC,EAAAA,cAAA,OAAKH,UAAU,sBACVkS,EAAME,OAAS,GAAKN,GAAS3R,EAAAA,cAAA,QAAMH,UAAU,6BAA6B8R,GAC3E3R,EAAAA,cAAA,MAAIH,UAAWqP,GAAAA,CAAW0C,EAAY,2BAA4B,kBAC7DG,EAAMtR,KAAKyR,IACR1M,KAAKo9B,QAAQ6+B,cAAcC,MAAQxvD,EAAKtR,IACxC,MAAMkiC,GAAYC,EAAAA,EAAAA,wBAAuBv9B,KAAKJ,MAAM8wB,iBAAmB1wB,KAAKo9B,SAE5E,OACI5iC,EAAAA,cAAA,MAAIH,UAAU,gCAAgCe,IAAKsR,EAAKtR,KACpDZ,EAAAA,cAAA,IAAA+H,OAAAC,OAAA,CACInI,UAAU,2BACVC,KAAM0F,KAAKJ,MAAMoL,WAAW0B,EAAK7J,OAAO,GAAM,aAClC,GAAG6J,EAAK7J,MAAM/F,wBAAwBuP,IAClD1D,QAAS3I,KAAK0H,SACdY,KAAK,SACL3M,GAAI+Q,EAAKtR,KACLkiC,GAEH5wB,EAAK7J,MAAM/F,sBAAqE,KAA7C4P,EAAK7J,MAAM4F,gCAExCiE,EAAK7J,MAAM4F,oCACqChL,IAA7CiP,EAAK7J,MAAM4F,+BACgB,IAA/BiE,EAAK7J,MAAMnG,gBAHXgQ,EAAK7J,MAAM/F,qBAIX4P,EAAKtR,IAEXZ,EAAAA,cAAA,QACIH,UAAW,GAAG2F,KAAKkL,6CACnB5C,KAAK,SAAQ,aACDgE,UAOnCC,EAAME,OAAS,GAAKP,GACjB1R,EAAAA,cAAA,IAAA+H,OAAAC,OAAA,CACIlI,KAAM0F,KAAKJ,MAAMoL,WAAW,IAAI,GAChC3Q,UAAU,iCACN4jE,EAAkB,CACtBt1D,QAAS3I,KAAK0H,WAEbwE,IAObF,uBAAuB3P,EAA0ClB,GACrE,MAAM,aAAEyR,EAAY,uBAAEC,EAAsB,iBAAEC,EAAgB,UAAEjO,EAAS,cAAEkO,GAAkB/M,KAAKJ,MAC5FoN,EAAgBJ,GAAgB,MAChCK,EAAcJ,EACpB,IAcIK,EAdAC,EAAc,GAClB,GAAIL,GAAoBA,EAAiBvQ,KAAM,CAC3C,MAAM6Q,EAASN,EAAiBvQ,MAC3B8Q,KACKA,EAAUlP,OAAO5B,MAAMsG,IAA+BpG,EAAAA,EAAAA,IAA8BoG,EAAOxG,OAGhG+Q,EAGDD,EAAcC,EAAOnL,SAAW,GAFhCpD,EAAUY,QAAQ,oEAO1B,IAAIy+D,EAAAA,EAAAA,IAAY7hE,EAAoBO,eAChCsQ,EAAmBD,EACdjL,QAAQ,MAAOhC,KAAKwD,aAAanH,EAAoBS,qBAAsBT,EAAoBiF,WAC/FU,QAAQ,MAAOhC,KAAKwD,aAAanH,EAAoBsB,sBAAuBtB,EAAoBiF,gBAClG,GAA4C,IAAxCjF,EAAoBK,gBAAuB,CAClD,MAAM6Q,EAAcR,MAAAA,OAAa,EAAbA,EAAe5O,OAAO5B,MACtCiR,GAAWA,EAAQ1Q,uBAAyBT,EAAoBS,uBAEpEoQ,GAAoBK,EAAcA,EAAY9E,8BAAgCpM,EAAoBS,uBAAyB,QAE3HoQ,EAAmB7Q,EAAoBoM,+BAAiCpM,EAAoBS,sBAAwB,GAGxH,MAAoB,WAAhBqQ,GAA4C,UAAhBA,EACrBH,EAAchL,QAAQ,MAAOmL,GAAanL,QAAQ,MAAO,GAAGkL,KAEhEF,EAAchL,QAAQ,MAAOmL,GAAanL,QAAQ,MAAO,GAAGkL,KAAoBC,KAAehS,KAGlGqI,aAAa9E,EAA4BC,GAC7C,IAAKD,IAAWC,EAEZ,OADAqB,KAAKJ,MAAMf,UAAUC,MAAM,2CACpBJ,GAAU,GAErB,IAAIO,EAASP,EAEb,IACIO,EAASe,KAAKJ,MAAMjF,QAAS8sB,iBAAiBY,eAAerpB,OAAON,GAASC,GAC/E,MAAOiD,GACL5B,KAAKJ,MAAMf,UAAUY,QAAQ,8BAA8BR,MAAW2C,KAG1E,OAAO3C,EAqBHwM,0BAA0BE,GAC9B,MAAM1M,EAASe,KAAKwM,oBAAoBjQ,MAAK6J,GAAYuF,EAAYhQ,KAAOyK,EAAShL,MACrF,OAAQ6D,GAAUA,EAAO4D,YAAUpF,KA3J7B6J,EAAAA,EAAAA,IAAA,CAATC,EAAAA,IAAQ,wCALQ0D,GAAa3D,EAAAA,EAAAA,IAAA,CADjCE,EAAAA,IACoByD,GAkKpB,+UCjLM,MAAM6E,EAAwC3V,IAAa,IAAZ,KAAEC,GAAMD,EAC1D,OACIK,EAAAA,cAAA,QAAMH,UAAU,kDACZG,EAAAA,cAAA,MAAIH,UAAU,cACT,IACAD,EACA,gDCSV,MAAM+jE,EAA8DhkE,IAOtE,IAAAikE,EAAA,IAPuE,QACxEljE,EAAO,QACPP,EAAO,cACPC,EAAa,UACbC,EAAS,iBACT61B,EAAgB,eAChBvU,GACHhiB,EACG,GAAgB,OAAZe,EACA,OAAO,KAGX,MAAMm7C,EAAcn7C,EAAQ8X,KACtBqrD,EAAkBnjE,GAAWA,EAAQmI,SAAWnI,EAAQmI,SAAW,EACnEye,GAAai/B,EAAAA,EAAAA,uBAAsB7lD,EAAQ8X,MAAQ,GAAIqrD,EAAiB1jE,GAAWA,EAAQgX,mBAAelU,GAC1G6gE,GAAgB/U,EAAAA,EAAAA,qBAClBruD,EAAQumD,OACR9mD,EAAQgX,cAAcmH,eAAepO,YAClB,QAD6B0zD,EAChDzjE,EAAQgQ,QAAQ+M,WAAG,IAAA0mD,GAAQ,QAARA,EAAnBA,EAAqB3oD,cAAM,IAAA2oD,OAAA,EAA3BA,EAA6B5nB,kBAE3BjzB,EACFpH,GAAqC,iBAAnBA,EAAoCthB,EAAU0jE,+BAAiC1jE,EAAU2jE,yBAGzGphC,GAAUC,EAAAA,EAAAA,kBAAiB,QAAS3M,EAAmB2lB,EAAcgoB,EAAgBpyD,YAErFqxB,GAAYC,EAAAA,EAAAA,wBAAuB7M,EAAmB0M,GAC5D,OACI5iC,EAAAA,cAAA,OAAKH,UAAU,kCACXG,EAAAA,cAAA,IAAA+H,OAAAC,OAAA,CACIlI,KAAMwnB,EACNnZ,SAAS2vC,EAAAA,EAAAA,kBAAiB5nB,EAAmB0M,EAASliC,EAAQ8X,OAC1DsqB,EAAS,cACDpiC,EAAQ8X,OAEpBxY,EAAAA,cAAA,OAAKH,UAAU,0CAmB/B,SACIO,EACA4kB,EACAhV,EACA0sC,EACAonB,EACA3jE,GAEA,IAAK6P,IAAagV,IAAiB5kB,EAC/B,OAAO,KAEX,MAAM6jE,EAAkB,CACpBznB,IAAKxsC,EACL0sC,QAASA,GAAoB,IAE3BwnB,EAAa,CACfl/C,aAAAA,EACA5kB,cAAAA,EACA0uD,YAAagV,GAEjB,OAAO9jE,EAAAA,cAACqhD,EAAAA,GAAKt5C,OAAAC,OAAA,GAAKi8D,EAASC,EAAU,CAAE5iB,oBAAoB,QAAQhjC,eAAgBne,KAtClEgkE,CACG/jE,EACAD,EAAQgQ,QAAQ6U,aAChBtkB,EAAQ+mB,gBACR/mB,EAAQ8X,KACRsrD,EACA3jE,EAAQgX,cAAcmH,kBAIlCte,EAAAA,cAAA,OAAKH,UAAU,2CACXG,EAAAA,cAAA,KAAGH,UAAU,4CAA4CkpB,IA8B7CtQ,EA7BQ/X,MAAAA,OAAO,EAAPA,EAAS8X,KA8BlCxY,EAAAA,cAAA,MAAIH,UAAU,kDAAkD4Y,MAD3E,IAA4BA,GCzFrB,MAAM/Y,EAAwBC,IAAA,IAAC,KAAEC,EAAI,UAAEC,EAAS,KAAEC,EAAI,UAAEC,GAAWJ,EAAA,OACtEK,EAAAA,cAAA,KAAGH,UAAWA,EAAWC,KAAMA,EAAI,aAAcC,GAC5C,IACAH,EAAM,MCkBFsT,EAA4C9N,IACrD,MAAM,KAAExF,EAAI,QAAEuO,EAAO,UAAEpO,EAAS,SAAEoT,EAAQ,GAAEhS,GAAOiE,EACnD,OACIpF,IAAAA,cAAA,UAAQmB,GAAIA,EAAItB,UAAU,aAAY,aAAaE,EAAWoO,QAASA,EAAS7F,IAAK6K,GAChFvT,IAKAgY,EAAqBxS,IACvB,CACHmS,MAAOnE,EAAUhO,GACjBoS,YAAa1D,EAAgB1O,GAC7BqS,YAAaxD,EAAgB7O,GAC7BsS,UAAW1X,IAAAA,cAAC2X,EAAAA,UAAS,CAAC9X,UAAU,4BAIlCuT,EAAahO,GAEXpF,IAAAA,cAACqT,EAAAA,MAAK,CACFC,WAAS,EACTC,gBAAgB,aAChBC,eAAgBpO,EAAMqO,UACtBC,OAAQtO,EAAMsO,OACdC,OAAQvO,EAAMwO,cACd/T,UAAU,0BACVgU,OAAQ,OAKdC,EAAmB1O,GACdpF,IAAAA,cAAC+T,EAAAA,YAAW,CAACJ,OAAQvO,EAAMwO,eAAgBxO,EAAM/E,UAAU2T,YAGhEC,EAAmB7O,GAEjBpF,IAAAA,cAACkU,EAAAA,YAAW,KACRlU,IAAAA,cAACmU,EAAAA,OAAM,CAAChG,QAAS/I,EAAMwO,cAAe/T,UAAU,kCAC3CuF,EAAM/E,UAAU+T,qCCtC1B,SAASgwD,EAAkBb,EAAqD7iE,GACnF,IAAK6iE,IAAoCnsD,EAAAA,gBAAgBC,YAAY3W,EAAQ2jE,iBACzE,OAEJ,MAAMC,EAAqB5jE,EAAQ2jE,gBAAgBtiE,MAAK+gC,GAAaA,EAAUj6B,WAAa06D,IAC5F,OAAIe,EACOA,EAAmBzT,eAD9B,EAMG,MAAM5wD,EAAgEN,IAcxE,IAdyE,SAC1EO,EAAQ,QACRC,EAAO,cACPC,EAAa,UACbC,EAAS,WACTC,EAAU,SACVC,EAAQ,oBACRgkE,EAAmB,iBACnBruC,EAAgB,cAChBsuC,EAAa,wBACbhkE,EAAuB,gCACvB+iE,EAA+B,qBAC/BvmC,EAAoB,gCACpBlmB,GACHnX,EACG,MAAMu9B,EAA2C,CAC7CC,oBAAqB98B,EAAU88B,qBAEnC,OACIn9B,EAAAA,cAAA,MAAIH,UAAU,iBACTK,EAASO,KAAI,CAACC,EAA8BC,IACzCX,EAAAA,cAAA,MAAIH,UAAU,iCAAiCe,IAAKD,GAChDX,EAAAA,cAACa,EAAAA,iBAAgB,CACbV,QAASA,EACT+1B,iBAAkBA,EAClB91B,cAAeA,EACfU,cAAeT,EAAUU,UACzBC,kBAAmBX,EAAUW,kBAC7BC,iBAAkBZ,EAAUY,iBAC5BC,gBAAiBb,EAAUa,gBAC3BujE,UAAWF,EACXpjE,GAAIZ,EACJK,IAAKF,EAAQmI,SACbzH,SAAUd,EACVe,KAAM,CAAEX,QAAAA,GACRukD,gBAAiBuf,EACjBhkE,wBAAyBA,EACzBw2C,eAAgBotB,EAAkBb,EAAiC7iE,GACnEs8B,qBAAsBA,EACtBE,eAAgBA,EAChB4K,oBAAqBznC,EAAUynC,oBAC/B48B,wBAAyB5tD,MAAAA,OAA+B,EAA/BA,EAAiC/U,MACtD4iE,GACIvtD,EAAAA,gBAAgBC,YAAYstD,IAC5BA,EAAsB,GAAGC,kBAAoBlkE,EAAQo4C,iECjF9E,MAAMv3C,EAAkC5B,IAAA,IAAC,UAAE6B,GAAW7B,EAAA,OACzDK,EAAAA,cAAA,YACK,IACAwB,EACA,MCHIF,EAA0B3B,IAAA,IAAC,KAAEC,EAAI,UAAEC,GAAWF,EAAA,OACvDK,EAAAA,cAAA,QAAMH,UAAWA,GACZ,IACAD,EACA,2JCgCT,IAAqBsF,EAArB,cAA6ClF,EAAAA,UAWzCmF,YAAmBC,GAA4B,IAAAy/D,EAAAllE,EAAAmlE,EAAAC,EAAA/1C,EAAAg2C,EAAAC,EAC3C5/D,MAAMD,GAXO,KAAAE,6BAAoD,IAAIC,IA0IxD,KAAA2/D,UAAY,CAACt8D,EAAkBG,EAAkBE,IACvD,CACH,CACIQ,QAAS,GAAGb,UACZc,YAAa,GAAGX,IAChBY,iBAAkB,SAEtB,CACIF,QAAS,GAAGb,QACZc,YAAa,GAAGT,IAChBU,iBAAkB,QAgBb,KAAAw7D,gBAAkB,CAC/Bv8D,EACAw8D,EACA1+D,EACAwC,EACAvC,EACAwC,EACAF,KACqB,IAAAo8D,EAAAC,EAErB,MAAO,CACH,CACInkE,GAAI,GAAGyH,IAAWw8D,uBAClB/8D,MAAQ3B,GAAelC,OAAOkC,IAJN,EAKxB3G,UAAW,GAA0C,QAA1CslE,EAAG7/D,KAAKJ,MAAM2E,oCAA4B,IAAAs7D,EAAAA,EAAI,MAAM7/D,KAAKwE,eACpEC,cAAe,GAAGf,KAEtB,CACI/H,GAAI,GAAGyH,IAAWw8D,qBAClB/8D,MAAO7D,OAAOmC,IAAgBnC,OAAOyE,GACrClJ,UAAW,GAA0C,QAA1CulE,EAAG9/D,KAAKJ,MAAM8E,oCAA4B,IAAAo7D,EAAAA,EAAI,MAAM9/D,KAAKwE,eACpEC,cAAe,GAAGd,OA7K1B3D,KAAKC,eAAiBD,KAAKC,eAAeC,KAAKF,MAC/CA,KAAKG,kBAAoBH,KAAKG,kBAAkBD,KAAKF,MACrDA,KAAKI,wBAA0BJ,KAAKI,wBAAwBF,KAAKF,MACjEA,KAAKK,WAAaL,KAAKK,WAAWH,KAAKF,MACvCA,KAAKM,WAAaN,KAAKM,WAAWJ,KAAKF,MACvCA,KAAKO,iBAAmBP,KAAKO,iBAAiBL,KAAKF,MACnDA,KAAKQ,iBAAmBR,KAAKQ,iBAAiBN,KAAKF,MAEnDA,KAAKS,SAAWjG,EAAAA,YAChBwF,KAAKU,SAAWlG,EAAAA,YAEhB,MAAM,4BAAEmG,GAAgCX,KAAKJ,MACvCgB,EAA8D,QAApDy+D,EAAG1+D,MAAAA,OAA2B,EAA3BA,EAA6B7D,4BAAoB,IAAAuiE,EAAAA,EAAI,IAClEx+D,EAAaF,MAAAA,OAA2B,EAA3BA,EAA6BhD,sBAC1CyF,EAAW,UAAU28D,OAAO//D,KAAKJ,MAAM5B,8BAA8BqF,aAAa08D,OACpF//D,KAAKJ,MAAMvD,oBAAoBK,mBAE7BsjE,EAAWhgE,KAAKJ,MAAMvD,oBAAoBS,qBAC1CmjE,EAAWjgE,KAAKJ,MAAMvD,oBAAoBsB,sBAC1C4F,EAAWvD,KAAKwD,aAAaw8D,GAC7Bv8D,EAAWzD,KAAKwD,aAAay8D,GAC7Bj8D,EAAyBhE,KAAK0/D,UAAUt8D,EAAUG,EAAUE,GAC5DvC,EACiH,QADtG/G,EAC+C,QAD/CmlE,EACyB,QADzBC,EACbv/D,KAAKJ,MAAMe,mCAA2B,IAAA4+D,OAAA,EAAtCA,EAAwCziE,4BAAoB,IAAAwiE,EAAAA,EAAIt/D,KAAKJ,MAAMvD,oBAAoBS,4BAAoB,IAAA3C,EAAAA,EAAI,IACrHgH,EAEkD,QAFvCqoB,EACgD,QADhDg2C,EACyB,QADzBC,EACbz/D,KAAKJ,MAAMe,mCAA2B,IAAA8+D,OAAA,EAAtCA,EAAwC9hE,6BAAqB,IAAA6hE,EAAAA,EAC7Dx/D,KAAKJ,MAAMvD,oBAAoBsB,6BAAqB,IAAA6rB,EAAAA,EACpDy2C,EACEv8D,EAAmB1D,KAAKwD,aAAatC,GACrCyC,EAAmB3D,KAAKwD,aAAarC,GACrC++D,EAAkBlgE,KAAKJ,MAAMggE,UAAY,IAAIG,OAAO//D,KAAKJ,MAAMggE,aAAe,GAC9Et7D,EAAoCtE,KAAK2/D,gBAC3Cv8D,EACA88D,EACAh/D,EACAwC,EACAvC,EACAwC,EACAF,GAEJzD,KAAKc,MAAQ,CACTC,WAAW,EACXC,wBAAoBvD,EACpBwD,wBAAoBxD,EACpByD,YAAaN,EACbO,YAAaN,EACbO,YAAY,EACZC,YAAY,EACZ+B,SAAAA,EACA48D,SAAAA,EACAC,SAAAA,EACAj8D,OAAAA,EACAM,aAAAA,GA1DE,mBACN,OAAOtE,KAAKJ,MAAMvD,oBAAoBiF,UAAY,GA6D/C49C,sBAAsBC,EAAkCC,GAC3D,OAAIp/C,KAAKc,QAAUs+C,GAAap/C,KAAKJ,QAAUu/C,EAM5Cn5B,mBAAmBm6C,GAClBA,IAAkBngE,KAAKJ,OACvBI,KAAKogE,oBAIN7+D,SACH,MAAM,oBAAElF,EAAmB,8BAAE2B,EAA6B,sBAAEwD,GAA0BxB,KAAKJ,MAE3F,GAAKvD,GAAwB2B,EAO7B,MAA6B,UAAzBgC,KAAKJ,MAAM6B,UACJzB,KAAK0B,qBAGT1B,KAAK2B,gBAVRH,EAAsB3C,UAAU+C,MAC5B,kGAeJw+D,oBAAiB,IAAAt2C,EAAAu2C,EAAAC,EAAAr2C,EAAAs2C,EAAAC,EACrB,MAAMp9D,EAAW,UAAU28D,OAAO//D,KAAKJ,MAAM5B,8BAA8BqF,aAAa08D,OACpF//D,KAAKJ,MAAMvD,oBAAoBK,mBAE7BsjE,EAAWhgE,KAAKJ,MAAMvD,oBAAoBS,qBAC1CmjE,EAAWjgE,KAAKJ,MAAMvD,oBAAoBsB,sBAC1C4F,EAAWvD,KAAKwD,aAAaw8D,GAC7Bv8D,EAAWzD,KAAKwD,aAAay8D,GAC7Bj8D,EAAyBhE,KAAK0/D,UAAUt8D,EAAUG,EAAUE,GAC5DvC,EACiH,QADtG4oB,EAC+C,QAD/Cu2C,EACyB,QADzBC,EACbtgE,KAAKJ,MAAMe,mCAA2B,IAAA2/D,OAAA,EAAtCA,EAAwCxjE,4BAAoB,IAAAujE,EAAAA,EAAIrgE,KAAKJ,MAAMvD,oBAAoBS,4BAAoB,IAAAgtB,EAAAA,EAAI,IACrH3oB,EAEkD,QAFvC8oB,EACgD,QADhDs2C,EACyB,QADzBC,EACbxgE,KAAKJ,MAAMe,mCAA2B,IAAA6/D,OAAA,EAAtCA,EAAwC7iE,6BAAqB,IAAA4iE,EAAAA,EAC7DvgE,KAAKJ,MAAMvD,oBAAoBsB,6BAAqB,IAAAssB,EAAAA,EACpDg2C,EACEv8D,EAAmB1D,KAAKwD,aAAatC,GACrCyC,EAAmB3D,KAAKwD,aAAarC,GACrC++D,EAAkBlgE,KAAKJ,MAAMggE,UAAY,IAAIG,OAAO//D,KAAKJ,MAAMggE,aAAe,GAC9Et7D,EAAoCtE,KAAK2/D,gBAC3Cv8D,EACA88D,EACAh/D,EACAwC,EACAvC,EACAwC,EACAF,GAEJzD,KAAKmF,SAAS,CAAE/B,SAAAA,EAAU48D,SAAAA,EAAUC,SAAAA,EAAUj8D,OAAAA,EAAQM,aAAAA,IA8DlD5C,qBACJ,MAAM,WAAEG,EAAU,8BAAE7D,EAA6B,sBAAEwD,GAA0BxB,KAAKJ,OAC5E,YAAEsB,EAAW,YAAEC,EAAW,WAAEC,EAAU,WAAEC,EAAU,mBAAEL,EAAkB,mBAAEC,GAAuBjB,KAAKc,MAGpGgB,EAAY,CACd,cAFoBN,EAAsBO,iBAAmB,OAAOC,QAAQ,MAAOhE,EAA8BiE,SAAW,IAG5H,gBAAiBJ,GAOfK,EAAoB,mEACtBlB,EAAqB,qCAAuC,IAE1DmB,EAAoB,mEACtBlB,EAAqB,qCAAuC,IAI1DmB,EAAuBpC,KAAKqC,2BAA2BnB,EAAaE,EAAYJ,GAChFsB,EAAuBtC,KAAKqC,2BAA2BlB,EAAaE,EAAYJ,GACtF,OACIzG,EAAAA,cAAA,OAAA+H,OAAAC,OAAA,CAAMnI,UAAU,0CAA6CyH,GACzDtH,EAAAA,cAAA,SAAOH,UANW,8EAObmH,EAAsBiB,SACvBjI,EAAAA,cAAA,SACIH,UAAW6H,EACXQ,SAAU1C,KAAKK,WACfsC,QAAS3C,KAAKK,WACduC,OAAQ5C,KAAKO,iBACbsC,MAAOT,EACPU,IAAK9C,KAAKS,YAGlBjG,EAAAA,cAAA,SAAOH,UAhBW,8EAiBbmH,EAAsBuB,SACvBvI,EAAAA,cAAA,SACIH,UAAW8H,EACXa,YAAaV,OAAuB7E,EAAY+D,EAAsByB,mBACtEP,SAAU1C,KAAKM,WACfqC,QAAS3C,KAAKM,WACdsC,OAAQ5C,KAAKQ,iBACbqC,MAAOP,EACPQ,IAAK9C,KAAKU,YAGjBM,GACGxG,EAAAA,cAAA,QAAMH,UAAU,wFACX2G,GAGRC,GAAsBD,IAAuBC,GAC1CzG,EAAAA,cAAA,QAAMH,UAAU,wFACX4G,IAObU,gBACJ,MAAM,WAAEE,EAAU,UAAE+9D,GAAc5/D,KAAKJ,MACjC0D,EAAiB,CACnB,gBAAiBzB,GAGrB,OACIrH,EAAAA,cAACoJ,EAAAA,OAAMrB,OAAAC,OAAA,CACHnI,UAAU,mCACVe,IAAK4E,KAAKc,MAAMsC,SAChBw8D,UAAWA,EACXjkE,GAAIqE,KAAKc,MAAMsC,SACfS,QAAQ,EACRX,IAAMlD,KAAKc,MAAMk/D,UAAYhhE,OAAOgB,KAAKc,MAAMk/D,gBAAcviE,EAC7D0F,IAAMnD,KAAKc,MAAMm/D,UAAYjhE,OAAOgB,KAAKc,MAAMm/D,gBAAcxiE,EAC7DqG,KAAM,EACNC,YAAY,aACZC,OAAQhE,KAAKc,MAAMkD,OACnBI,YAAU,EACVC,aAAW,EACXC,aAActE,KAAKc,MAAMwD,aACzBK,YAAa3E,KAAKG,kBAClBuC,SAAUkC,GAAAA,CAAS5E,KAAKC,eAAgB,KACxC4E,kBAAmB7E,KAAKI,yBACpBkD,IAKRjD,WAAWyE,GACf9E,KAAK+E,aAAaD,EAAO,OAGrBxE,WAAWwE,GACf9E,KAAK+E,aAAaD,EAAO,OAGrBC,aAAaD,EAA2CE,GAC5D,MAAMC,EAAc,WAAWD,IACzBE,EAAa,UAAUF,IAC7BhF,KAAKmF,SAAS,CACV,CAACF,GAAcjF,KAAKoF,2BAA2BN,EAAMO,cAAcxC,OACnE,CAACqC,IAAa,IAId3E,iBAAiBuE,GACrB,MAAMQ,EAAmBtF,KAAKoF,2BAA2BN,EAAMO,cAAcxC,OAC7E7C,KAAKmF,SAAS,CACVjE,YAAaoE,EACbC,YAAY,IAEhB,MAAM9E,EAAWzB,OAAOsG,IAClB,SACFE,EAAQ,8BACRxH,EAA6B,oBAC7B3B,EAAmB,sBACnBmF,EAAqB,4BACrBb,GACAX,KAAKJ,MACHuD,EAAOxC,GAA+BA,EAA4BhD,4BAA0BF,EAE5FgI,EAAStC,EAAMnE,OAAOmE,QAAO1F,EAEnC,OAAIiI,MAAMjF,IACNT,KAAKmF,SAAS,CAAEnE,mBAAoBQ,EAAsBmE,qBAC1D3F,KAAK4F,OAAO,QACL,GAGP5F,KAAK6F,eAAepF,EAAUgF,IAC9BD,EAAS,CACLxH,8BAAAA,EACA3B,oBAAAA,EACAiB,aAAa,EACbI,WAAY+C,EACZ7C,SAAU6H,KAEP,IAEXzF,KAAK4F,OAAO,QAEL,GAGHpF,iBAAiBsE,GACrB,MAAMgB,EAAmB9F,KAAKoF,2BAA2BN,EAAMO,cAAcxC,OAC7E7C,KAAKmF,SAAS,CACVhE,YAAa2E,EACbC,YAAY,IAEhB,MAAMrF,EAAW1B,OAAO8G,IAClB,SACFN,EAAQ,8BACRxH,EAA6B,oBAC7B3B,EAAmB,sBACnBmF,EAAqB,4BACrBb,GACAX,KAAKJ,MACHsD,EAAOvC,GAA+BA,EAA4B7D,sBAAyB,IAE3FkJ,EAAShH,OAAOkE,GAEtB,OAAIwC,MAAMhF,IACNV,KAAKmF,SAAS,CAAElE,mBAAoBO,EAAsBmE,qBAC1D3F,KAAK4F,OAAO,QACL,KAGP5F,KAAK6F,eAAeG,EAAQtF,KACxBrE,EACAmJ,EAAS,CACLxH,8BAAAA,EACA3B,oBAAAA,EACAiB,aAAa,EACbI,WAAYsI,EACZpI,SAAU8C,IAGdV,KAAK4F,OAAO,QAET,GAMPA,OAAOZ,GACX,MAAMlC,EAAoB,QAAdkC,EAAsBhF,KAAKU,SAAWV,KAAKS,SAEvDwF,YAAW,KACHnD,GAAOA,EAAIoD,SACXpD,EAAIoD,QAAQC,UAEjB,IAGC9D,2BACJ+D,EACAC,EACAC,GAEA,OAAID,GAAWC,QAAgC7I,IAAb2I,EACvBA,EAEJpG,KAAKwD,aAAa4C,GAGrBP,eAAe3C,EAAaC,GAChC,MAAM,sBAAE3B,GAA0BxB,KAAKJ,MACvC,YAAYnC,IAAR0F,MAIAD,EAAMC,KACNnD,KAAKmF,SAAS,CACVnE,mBAAoBQ,EAAsB+E,qBAC1CtF,mBAAoBO,EAAsB+E,wBAEvC,IAMP/C,aAAa9E,GACjB,GAAuD,IAAnDsB,KAAKJ,MAAMvD,oBAAoBK,gBAAuB,CAEtD,OADesD,KAAKJ,MAAMjF,QAAQ8sB,iBAAiBY,eAAerpB,OAAON,GAASsB,KAAKwE,cAG3F,OAAO9F,GAAU,GAGb0G,2BAA2BsB,GAE/B,MAAMC,EAAa3H,OAAO0H,GAC1B,IAAKhB,MAAMiB,GACP,OAAOD,EAKX,OAD4B1G,KAAKF,6BAA6B8G,IAAIF,IACpCA,EAK1BzG,eAAe4G,GAEnB,GAA2C,cAAvCA,EAAyBC,UAA2B,CACpD,MAAM,SAAEtB,EAAQ,8BAAExH,EAA6B,oBAAE3B,GAAwB2D,KAAKJ,MAC1EvD,GAAuBwK,IACvBrB,EAAS,CACLxH,8BAAAA,EACA3B,oBAAAA,EACAiB,aAAa,EACbI,WAAYmJ,EAAyBE,gBACrCnJ,SAAUiJ,EAAyBG,mBAGvChH,KAAKiH,oBAAoBJ,KAM7B1G,kBAAkB0G,GACtB,MAAM,SAAErB,EAAQ,8BAAExH,EAA6B,oBAAE3B,GAAwB2D,KAAKJ,MAC1EvD,GAAuBwK,IACvBrB,EAAS,CACLxH,8BAAAA,EACA3B,oBAAAA,EACAiB,aAAa,EACbI,WAAYmJ,EAAyBE,gBACrCnJ,SAAUiJ,EAAyBG,mBAGvChH,KAAKiH,oBAAoBJ,IAKzBI,oBAAoBJ,GACxB,GAAIA,EAAyBlL,GAAI,CAC7B,MAAMuL,EAAUC,SAASC,eAAe,GAAGP,EAAyBlL,WAChEuL,GACAjB,YAAW,KACPiB,EAAQf,UACT,IAKP/F,wBAAwBiH,GAC5B,OAAOrH,KAAKwD,aAAa,GAAG6D,QAjetBC,EAAAA,EAAAA,IAAA,CAATC,EAAAA,IAAQ,iCAPQ7H,GAAe4H,EAAAA,EAAAA,IAAA,CADnCE,EAAAA,IACoB9H,GA0epB,6bClec,MAAM+H,UAAmBjN,EAAAA,UAKpCmF,YAAmBC,GACfC,MAAMD,GAmKO,KAAA8H,SAAYlI,IACzBA,EAAEmI,iBAEF,MAAM,8BAAE3J,EAA6B,oBAAE3B,EAAmB,4BAAEsE,GAAgCX,KAAKJ,MAC7FvD,IACA2D,KAAKJ,MAAM4F,SAAS,CAChBxH,8BAAAA,EACA3B,oBAAAA,EACAiB,aAAcqD,IAGlBsF,YAAW,KACPjG,KAAK4H,WAAW1B,SAAWlG,KAAK4H,WAAW1B,QAAQC,UACpD,KA/KPnG,KAAK0H,SAAW1H,KAAK0H,SAASxH,KAAKF,MACnCA,KAAKc,MAAQ,CACTC,YAAaf,KAAKJ,MAAMe,6BAE5BX,KAAK4H,WAAapN,EAAAA,YAClBwF,KAAKo9B,SAAUC,EAAAA,EAAAA,kBAAiB,QAASr9B,KAAKJ,MAAM8wB,iBAAmB,IAGpEwuB,sBAAsBC,EAA6BC,GACtD,OAAIp/C,KAAKc,QAAUs+C,GAAap/C,KAAKJ,QAAUu/C,EAM5C59C,SAAM,IAAA6I,EAAAhB,EAAAC,EACT,MAAAxB,EAgBI7H,KAAKJ,OAhBH,WACFiC,EAAU,sBACVL,EAAqB,8BACrBxD,EAA6B,oBAC7B3B,EAAmB,4BACnBsE,EAA2B,sBAC3B8/D,EAAqB,4BACrBC,EAA2B,MAC3BvlE,EAAK,SACL2M,EAAQ,SACRtC,EAAQ,QACR7K,EAAO,iBACP+1B,EAAgB,oBAChBiwC,EAAmB,qBACnBC,GAEH/4D,EADME,GAAKC,EAAAA,EAAAA,GAAAH,EAAAI,GAEZ,IAAK5L,EAED,YADAmF,EAAsB3C,UAAU+C,MAAM,sEAGrCvF,EAAoBS,sBACrB0E,EAAsB3C,UAAUY,QAC5B,2DAA2DyI,KAAKC,UAAU9L,MAGlF,MAAM+L,EAAiBpK,EAA8BC,mBAAqB4iE,EAAAA,YAAYC,aACtF,IAAIz4D,EAAoBD,EAAiB,gBAAkB,eAC3DC,EAAoB,0BAA0BA,IAC9C,MAAMrD,EAAYoD,EAAiB,QAAU,WACvCrH,IAAcJ,EAEpB,GADA0H,EAAoBtH,EAAY,GAAGsH,YAA8BA,EAC7DrK,EAA8BuK,cAAgBpM,EAAAA,qBAAqBqM,OACnE,OAAOxI,KAAK+gE,cACR1kE,EACA2B,EACA+C,EACApG,EACAQ,EACAu1B,EACA+vC,EACAC,GAGR1gE,KAAKo9B,QAAQ6+B,cAAcC,MAAyD,QAApD9xD,EAAG/N,EAAoBoM,qCAA6B,IAAA2B,EAAAA,EAAI/N,EAAoBS,qBAC5G,MAAMwgC,GAAYC,EAAAA,EAAAA,wBAAuB7M,EAAmB1wB,KAAKo9B,SAE3D4jC,EAAc3kE,EAAoBoM,+BAAiCpM,EAAoBS,sBAAwB,GAE/GmkE,EAAe5kE,EAAoB8M,OAAS,EAClD,IAAI+3D,EAEAA,EADiB,IAAjBD,EAC0BN,GACpBphE,EAAAA,EAAAA,QAAOohE,EAAqB3iE,EAA8BiE,QAAS++D,GACnE,GAEoBJ,GACpBrhE,EAAAA,EAAAA,QAAOqhE,EAAsB5iE,EAA8BiE,QAAS++D,EAAaC,GACjF,GAGV,MAAM33D,EAAsF,QAAzEF,EAAoD,QAApDC,EAAIrJ,KAAKJ,MAAM5B,8BAA8BiE,eAAO,IAAAoH,OAAA,EAAhDA,EAAkDE,2BAAmB,IAAAH,EAAAA,EAAI,GAC1FI,EAAwBxJ,KAAKyJ,0BAA0BH,GAE7D,IAAIjP,EAAY,yBACZmP,IACAnP,EAAYqP,GAAAA,CAAWrP,EAAW,sCAAsCiP,MAK5E,MAAMK,GAAYC,EAAAA,iBAAiBC,mBAAmBxN,EAAoByN,oBACpEC,GAAYH,EAAAA,iBAAiBC,mBAAmBxN,EAAoB2N,gBACpEC,EAAmBN,GAAYI,EAErC,OACIvP,EAAAA,cAAA,MAAIH,UAAWA,EAAWsB,GAAI,GAAGqC,EAA8BiE,WAAY9G,KACvEX,EAAAA,cAAA,IAAA+H,OAAAC,OAAA,CACIpH,IAAKuF,EAA8B,OAAS,QAC5CmC,IAAK9C,KAAK4H,WACVtN,KAAM0F,KAAK0I,iBACXwB,SAAUP,GAAY,EAAI,EAC1BhB,QAAS3I,KAAK0H,SACdrN,UAAWgO,EACXC,KAAMtD,EAAS,aACHk8D,EAAuB,iBACnBvgE,GACZ28B,EACAv1B,GAEHkC,GAAoBT,GAAyBxJ,KAAKmK,cAAcb,GACjE9O,EAAAA,cAAA,QAAMH,UAAU,gCAA+B,cAAa,QAEvDgC,EAAoBoM,+BAAiCpM,EAAoBS,0BAC3CW,IAA9BpB,EAAoB8M,OAAuB,KAAK9M,EAAoB8M,YAOjFM,0BAA0BH,GAE9B,OAD8ByB,EAAAA,EAAAA,8BAA6BzB,EAAetJ,KAAKJ,MAAMjF,SAIjFwP,cAAcb,GAA6B,IAAA63D,EAC/C,MAAM9kE,EAAsB2D,KAAKJ,MAAMvD,oBAGjCjC,EAAOiC,EAAoBoM,+BAAiCpM,EAAoBS,sBAAwB,GACxGuN,EAAc,CAChB,CACIC,OAAQ,GAAsC,QAAtC62D,EAAG9kE,EAAoBK,uBAAe,IAAAykE,EAAAA,EAAI,MAAM73D,KAAiBlP,IACzEyI,MAAOzI,EACPkP,cAAAA,EACAiB,aAAclO,EAAoByN,mBAClCU,SAAUnO,EAAoB2N,iBAItC,OACIxP,EAAAA,cAACiQ,EAAAA,gBAAe,CACZpQ,UAAU,iCACVqQ,YAAa1K,KAAKJ,MAAMjF,QAAQgQ,QAAQD,YACxCE,KAAMP,EACNQ,oBAAoB,EACpBC,cAAY,IAKhBpC,iBACJ,MAAM,WAAEsC,EAAU,8BAAEhN,EAA6B,oBAAE3B,EAAmB,4BAAEsE,GAAgCX,KAAKJ,MAE7G,OAAIvD,EACO2O,EAAW,CACdhN,8BAAAA,EACA3B,oBAAAA,EACAiB,aAAcqD,IAIf,GAoBHogE,cACJ1kE,EACA2B,EACA+C,EACApG,EACAQ,EACAu1B,EACA0wC,EACAC,GAEA,GAAIhlE,EAAoBS,qBAAsB,CAAC,IAADwiE,EAAAgC,EAC1CthE,KAAKo9B,QAAQ6+B,cAAcC,MAAQ7/D,EAAoBoM,8BACvD,MAAM60B,GAAYC,EAAAA,EAAAA,wBAAuB7M,EAAmB1wB,KAAKo9B,SAC3DmkC,EAAgBviE,OAAO8J,SAASzM,EAAoBS,qBAAsB,IAC1E0kE,EAAgD,QAAnClC,EAAGt/D,KAAKJ,MAAM6P,6BAAqB,IAAA6vD,OAAA,EAAhCA,EAAkC/iE,MACpDsG,GAASA,EAAMjG,gBAAkBP,EAAoBO,gBAGnD6kE,EAAiBziE,OAAO8J,UAAS04D,MAAAA,OAAa,EAAbA,EAAe1kE,uBAAwB,IAAK,IAC7E4kE,EAAyB,EAC/B,IAAIC,EAA+B,sBAE/BA,EADAJ,EAAgBE,EACO,GAAGE,QACnBJ,EAAgBE,EACA,GAAGE,UAEH,GAAGA,aAE9B,MAAMC,OAC4BnkE,IAA9BpB,EAAoB8M,OAAuB9M,EAAoB8M,QAAUu4D,EACnEL,IAAkC9hE,EAAAA,EAAAA,QAAO8hE,EAAgChlE,EAAoB8M,OAC7Fi4D,IAA4B7hE,EAAAA,EAAAA,QAAO6hE,EAA0B/kE,EAAoB8M,OAC3F,OACI3O,EAAAA,cAAA,MACIH,UAAU,wDACViO,KAAOtI,KAAKJ,MAAMiiE,kBAAgCpkE,EAAjB,eACjC9B,GAAI,GAAGqC,EAA8BiE,WAAY9G,KAEjDX,EAAAA,cAAA,IAAA+H,OAAAC,OAAA,CACIlI,KAAM0F,KAAK0I,iBACXJ,KAAK,SAAQ,gBACEvH,EAAS,aACZ,GAAG/C,EAA8BiE,WAAY5F,EAAoBoM,0DAC3Em5D,IACFj5D,QAAS3I,KAAK0H,UACV41B,GAEJ9iC,EAAAA,cAACoO,EAAAA,gBAAe,CACZvO,UAAWsnE,EACX94D,UAAW04D,EACXx4D,YAA8D,QAAnDu4D,EAAEjlE,EAAoBoM,qCAA6B,IAAA64D,EAAAA,EAAIjlE,EAAoBS,qBACtFkM,WAAW,EACXC,UAAQ,EACR1O,UAAU,GACVI,QAASA,EACTgB,GAAIqE,KAAKJ,MAAM7E,SACfa,SAAUoE,KAAKJ,MAAMsJ,eACrBrN,KAAM,KAEVrB,EAAAA,cAAA,QAAMH,UAAU,8BAA6B,cAAc2F,KAAKJ,MAAMiiE,aAAe,YAASpkE,QAC3DA,IAA9BpB,EAAoB8M,OAAuB,IAAI9M,EAAoB8M,6JClPhG,MAAM0F,UAAsBrU,EAAAA,UACxBmF,YAAYC,GACRC,MAAMD,GAENI,KAAK8O,cAAgB9O,KAAK8O,cAAc5O,KAAKF,MAC7CA,KAAK+O,iBAAmB/O,KAAK+O,iBAAiB7O,KAAKF,MAEnD,MAAMgP,EAAahP,KAAKJ,MAAMqP,wBAM9BjP,KAAKc,MAAQ,CACTqO,SAAUH,GAIXkwC,sBAAsBC,EAAgCC,GACzD,OAAIp/C,KAAKc,QAAUs+C,GAAap/C,KAAKJ,QAAUu/C,EAM5C59C,SACH,MAAM,wBAAE2N,EAAuB,sBAAE1N,GAA0BxB,KAAKJ,MAMhE,GAJKsP,GACD1N,EAAsB3C,UAAU+C,MAAM,wDAGtCsN,EAAwB3G,cAAgBpM,EAAAA,qBAAqBqM,QAAUxI,KAAKJ,MAAMjF,QAAQ+c,IAAIjC,OAAO87B,WACrG,OAAO,KAGX,MAAMl3C,EAAYqP,GAAAA,CACd,oBACA,aACAwF,EAAwBjN,SAG5B,OACIzH,EAAAA,cAAA,OAAKH,UAAWA,GACZG,EAAAA,cAACmU,EAAAA,OAAM,CACHtU,UAAW2F,KAAKc,MAAMqO,SAAW,qCAAuC,sCAAqC,aACjGD,EAAwBjN,QACpC0G,QAAS3I,KAAK+O,iBAAgB,gBACf/O,KAAKc,MAAMqO,UAEzBD,EAAwBjN,SAE7BzH,EAAAA,cAAC4U,EAAAA,SAAQ,CAAClB,OAAQlO,KAAKc,MAAMqO,SAAUE,QAAS,KAC3CrP,KAAKsP,kBAAkBJ,KAMhCI,kBAAkBJ,GACtB,OAAIgvD,EAAAA,EAAAA,IAAYhvD,EAAwBtS,eAC7BoD,KAAKuP,aAAaL,GAEtBlP,KAAKwP,yBAAyBN,GAGjCM,yBAAyBN,GAC7B,MAAM,WACFrN,EAAU,sBACVL,EAAqB,sBACrBiO,EAAqB,QACrB9U,EAAO,sBACP8lE,EAAqB,4BACrBC,EAA2B,oBAC3BC,EAAmB,qBACnBC,EAAoB,SACpBzhD,GACAnf,KAAKJ,MAIH0I,EAFF4G,EAAwBjR,mBAAqB4iE,EAAAA,YAAYC,cACzD5xD,EAAwB3G,cAAgBpM,EAAAA,qBAAqBqM,OACnC,CAAEF,KAAM,gBAAc7K,EAC9CqkE,EAAoB5yD,EAAwB/Q,QAAU,GACtDuR,EAAYoyD,EAAkB7mE,KAAI,CAACmD,EAA4BjD,KACjE,IAAKiD,EAID,OAHAoD,EAAsB3C,UAAU+C,MAC5B,6DAA6DsN,EAAwB7L,aAAa6L,EAAwBjN,YAEvH,KAGX,MAAMtB,GAA8BvE,EAAAA,EAAAA,IAAgCgC,EAAOqR,GAE3E,OACIjV,EAAAA,cAACiN,EAAAA,EAAU,CACPzJ,8BAA+BkR,EAC/B7S,oBAAqB+B,EACrBuC,4BAA6BA,EAC7B8O,sBAAuBA,EAAsBuH,QAAOwtB,GAChDs9B,EAAkBvlE,MAAKsG,GAASA,EAAMnG,kBAAoB8nC,EAAc9nC,oBAE5E8E,sBAAuBA,EACvBgE,SAAUxF,KAAK8O,cACf9D,WAAYhL,KAAKJ,MAAMoL,WACvBnJ,WAAYA,EACZzG,IAAKD,EACLA,MAAOA,EACPR,QAASA,EACTI,SAAUiF,KAAKJ,MAAM7E,SACrBmO,eAAgBlJ,KAAKJ,MAAMsJ,eAC3BwnB,iBAAkB1wB,KAAKJ,MAAM8wB,iBAC7B+vC,sBAAuBA,EACvBE,oBAAqBA,EACrBC,qBAAsBA,EACtBF,4BAA6BA,EAC7BmB,aAAc1iD,OAI1B,OACI3kB,EAAAA,cAAA,KAAA+H,OAAAC,OAAA,CACInI,UAAW,2BAA2B6U,EAAwBjN,WAC1DqG,EAAI,cACI4G,EAAwBjN,UAEnCyN,GAKLqyD,cAAc7yD,GAClB,OACIA,EAAwB8yD,uBAAyBC,EAAAA,gBAAgBplE,OACjEqS,EAAwB8yD,uBAAyBC,EAAAA,gBAAgBr+D,QACjEsL,EAAwB8yD,uBAAyBC,EAAAA,gBAAgBC,eAE1D,SAEJ,QAGH3yD,aAAaL,GACjB,MAAM,WACFrN,EAAU,sBACVL,EAAqB,sBACrBiO,EAAqB,QACrB9U,EAAO,6BACP4J,EAA4B,6BAC5BG,GACA1E,KAAKJ,MAGH8P,GADoBR,EAAwB/Q,QAAU,IACxBlD,KAAI,CAACmD,EAA4BjD,KACjE,IAAKiD,EAID,OAHAoD,EAAsB3C,UAAU+C,MAC5B,4CAA4CsN,EAAwB7L,aAAa6L,EAAwBjN,YAEtG,KAGX,MAAMtB,GAA8BvE,EAAAA,EAAAA,IAAgCgC,EAAOqR,GAErEhO,EAAYzB,KAAK+hE,cAAc7yD,GAC/B9T,EAAMuF,EACN,GAAGA,EAA4B7D,wBAAwB6D,EAA4BhD,wBACnF,gBAAgBxC,IACtB,OACIX,EAAAA,cAAA,MAAIH,UAAW,sEAAoCe,IAAKD,GACpDX,EAAAA,cAACkF,EAAAA,EAAe,CACZ1B,8BAA+BkR,EAC/B7S,oBAAqB+B,EACrBuC,4BAA6BA,EAC7Ba,sBAAuBA,EACvBgE,SAAUxF,KAAK8O,cACf9D,WAAYhL,KAAKJ,MAAMoL,WACvBnJ,WAAYA,EACZJ,UAAWA,EACXrG,IAAKA,EACLwkE,UAAWxkE,EACXT,QAASA,EACT4J,6BAA8BA,EAC9BG,6BAA8BA,EAC9B3J,SAAUiF,KAAKJ,MAAM7E,SACrBmO,eAAgBlJ,KAAKJ,MAAMsJ,qBAK3C,OAAO1O,EAAAA,cAAA,MAAIH,UAAW,yCAAyC6U,EAAwBjN,WAAYyN,GAG/FZ,cAAc9R,GAClBgD,KAAKJ,MAAMgQ,iBAAiB5S,GAGxB+R,mBACJ/O,KAAKmF,UAAS0K,IAAS,CACnBV,UAAWU,EAAUV,cAKjC,wFCpPYlT,EAmDAC,EA8BAC,4lBAwDL,SAAS+hE,EAAYiE,GACxB,OACIA,IAAkBC,EAAAA,kBAAkBC,UACpCF,IAAkBC,EAAAA,kBAAkBE,SACpCH,IAAkBC,EAAAA,kBAAkBG,QASrC,SAASnmE,EACZC,EACAC,GAGA,OAAOA,EAAmBC,MAAMC,GAC5BC,EAA8BJ,EAAqBG,KAUpD,SAASC,EAA8BJ,EAA0CG,GAEpF,OACIA,EAAoBE,kBAAoBL,EAAoBK,iBAC5DF,EAAoBG,qBAAuBN,EAAoBM,oBAC/DH,EAAoBI,gBAAkBP,EAAoBO,gBACzDshE,EAAY1hE,EAAoBI,gBAC7BJ,EAAoBM,uBAAyBT,EAAoBS,sBAItE,SAASC,EACZC,EACAC,GAEA,MAAMC,EAAmD,GACzD,IAAIC,GAAmB,EAsBvB,GArBAF,EAA0BG,SAASC,IAC/B,GAAIZ,EAA8BO,EAAuBX,oBAAqBgB,IAE1E,GADAF,GAAmB,EACfH,EAAuBM,YAAa,CACpC,MAAMC,EAAIC,EAAAA,EAAA,GACHH,GAAiB,IACpBP,0BAC2CW,IAAtCT,EAAuBU,YAA4B,GAAGV,EAAuBU,cAC9EL,EAAkBP,qBACtBa,2BACyCF,IAApCT,EAAuBY,UAA0B,GAAGZ,EAAuBY,YAC5EP,EAAkBM,wBAE1BT,EAA0BW,KAAKN,SAInCL,EAA0BW,KAAKR,OAIlCF,EAAkB,CACnB,MAAMI,EAAIC,EAAAA,EAAA,GACHR,EAAuBX,qBAAmB,IAC7CS,0BAC2CW,IAAtCT,EAAuBU,YAA4B,GAAGV,EAAuBU,cAC9EV,EAAuBX,oBAAoBS,qBAC/Ca,2BACyCF,IAApCT,EAAuBY,UAA0B,GAAGZ,EAAuBY,YAC5EZ,EAAuBX,oBAAoBsB,wBAEnDT,EAA0BW,KAAKN,GAI1BP,EAAuBX,oBAAoBO,gBAAkBwlE,EAAAA,kBAAkBvlD,MAC5E7f,EAAuBX,oBAAoBO,gBAAkBwlE,EAAAA,kBAAkBI,WACnFxlE,EAAuBgB,8BAA8BC,mBAAqB4iE,EAAAA,YAAYC,cAEtF9jE,EAAuBgB,8BAA8BG,OAAOf,SAASgB,IACjE,GAAIA,EAAM1B,kBAAoBa,EAAKb,iBAAmB0B,EAAMtB,uBAAyBS,EAAKT,0BAEnF,CACH,MAAMuB,EAAgBnB,EAA0BoB,WAAWC,GACvD9B,EAA8B2B,EAAOG,KAErCF,GAAiB,GACjBnB,EAA0BsB,OAAOH,EAAe,OAOpE,OAAOnB,GA7OX,SAAYjB,GASRA,EAAAA,EAAA,iBAWAA,EAAAA,EAAA,2BAUAA,EAAAA,EAAA,eAUAA,EAAAA,EAAA,qBAxCJ,CAAYA,IAAAA,EAAgC,KAmD5C,SAAYC,GASRA,EAAAA,EAAA,mBAUAA,EAAAA,EAAA,iBAnBJ,CAAYA,IAAAA,EAAuB,KA8BnC,SAAYC,GASRA,EAAAA,EAAA,eAUAA,EAAAA,EAAA,yBAUAA,EAAAA,EAAA,uBAUAA,EAAAA,EAAA,iBAUAA,EAAAA,EAAA,mBAjDJ,CAAYA,IAAAA,EAAoB,qyBC2DhC,IAAqB4T,EAAqBC,EAA1C,cAAmDxV,EAAAA,cAsD/CmF,YAAmBC,EAAgEkB,GAAkC,IAAA2hE,EACjH5iE,MAAMD,GA/CO,KAAAqQ,sBAAkD,CAC/D,CAAE7U,IAAK8U,EAAAA,GAAYC,0BAA2BtN,MAAO7C,KAAKJ,MAAM/E,UAAUsV,2BAC1E,CAAE/U,IAAK8U,EAAAA,GAAYE,oBAAqBvN,MAAO7C,KAAKJ,MAAM/E,UAAUuV,qBACpE,CAAEhV,IAAK8U,EAAAA,GAAYG,qBAAsBxN,MAAO7C,KAAKJ,MAAM/E,UAAUwV,sBACrE,CAAEjV,IAAK8U,EAAAA,GAAYI,qBAAsBzN,MAAO7C,KAAKJ,MAAM/E,UAAUyV,sBACrE,CAAElV,IAAK8U,EAAAA,GAAYK,sBAAuB1N,MAAO7C,KAAKJ,MAAM/E,UAAU0V,uBACtE,CAAEnV,IAAK8U,EAAAA,GAAYM,uBAAwB3N,MAAO7C,KAAKJ,MAAM/E,UAAU2V,wBACvE,CAAEpV,IAAK8U,EAAAA,GAAYwyD,wBAAyB7/D,MAAO7C,KAAKJ,MAAM/E,UAAU6nE,yBACxE,CAAEtnE,IAAK8U,EAAAA,GAAYyyD,qBAAsB9/D,MAAO7C,KAAKJ,MAAM/E,UAAU8nE,sBACrE,CAAEvnE,IAAK8U,EAAAA,GAAY0yD,0BAA2B//D,MAAO7C,KAAKJ,MAAM/E,UAAU+nE,4BAK7D,KAAAnyD,UAAgCzQ,KAAKJ,MAAMjF,QAAQgQ,QAAQ+F,UAAUC,SAG9E,KAAA6J,UAAsB,KAMtB,KAAAqoD,mBAAyC,EAMhC,KAAAC,kBAAoB,EAEpB,KAAAjyD,WAAYC,EAAAA,EAAAA,IAAa9Q,KAAKJ,MAAMjF,QAAQgQ,SAErD,KAAAo4D,wBAAkC,EAElC,KAAAnyD,YAAsB,EA6Pb,KAAAoyD,2BAA6BhyD,UAC1C,MAAMrW,EAAUqF,KAAKJ,MAAMjF,QACrB0iB,EAAmC1iB,EAAQ+c,IAAIjC,OAAO6H,wBACtDC,EAA8B5iB,EAAQ+c,IAAIjC,OAAO+H,uBAEnD5L,EAAAA,gBAAgBC,YAAYwL,KAC3BA,EAAiCI,SAASC,EAAAA,eAAeC,OAC1D/L,EAAAA,gBAAgBC,YAAY0L,KAC3BA,EAA4BE,SAASC,EAAAA,eAAeC,OACrD3d,KAAKJ,MAAM6V,OAAO2G,yBAEZpc,KAAK+Q,wCASF,KAAAkyD,qBAAuB,CAAC7xD,EAA8B1W,KAAuD,IAAAgY,EAAAwwD,EAAAC,EAAA7nD,EAC1H,IAAIN,EAA6B,GAsBjC,GAnBuB,aAAnBhb,KAAKyQ,UACLW,EAAcT,SAAW,WAEzBS,EAAcT,SAAW,SAGO,QAApC+B,EAAI1S,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,aAAK,IAAAD,GAAhCA,EAAkCuI,UAClCD,EAAe9S,KAAKgT,MAAMC,mBAAmBnb,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,MAAMsI,WAGlF7J,EAAc0E,kBACT9V,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,QACvB3S,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,MAAMoD,MAAsC,QAAlCmtD,EAAIljE,KAAKJ,MAAM6V,OAAOG,oBAAY,IAAAstD,EAAAA,EAd9C,KAe9B,EACJ9xD,EAAciI,eAAiB,CAAEC,QAAS0B,GAC1C5J,EAAcgK,SAAyC,QAAjC+nD,EAAGnjE,KAAKJ,MAAM6V,OAAOG,oBAAY,IAAAutD,EAAAA,EAjBrB,GAkBlC/xD,EAAcC,eAAiB3W,EAASA,SACxC0W,EAAcgC,kBAAoB1Y,EAAS2Y,MAC3CjC,EAAc8F,eAAgBksD,EAAAA,EAAAA,IAAuBpjE,KAAKJ,MAAMjF,QAAQgQ,UAAY,GAChD,QAApC2Q,EAAItb,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,aAAK,IAAA2I,GAAhCA,EAAkCW,UAAW,CAC7C,MAAMonD,EAAiBrjE,KAAKJ,MAAM/D,KAAKwnE,eAAepkE,OAClDokE,IACAjyD,EAAciyD,eAAiBA,KAS1B,KAAAtyD,qCAAuCC,UAA0B,IAAAC,EAAAC,EAC9E,MAAMC,EAAmE,QAAvDF,EAAuC,QAAvCC,EAAGlR,KAAKJ,MAAM/D,KAAKuV,cAAcnS,cAAM,IAAAiS,OAAA,EAApCA,EAAsCG,sBAAc,IAAAJ,EAAAA,EAAI,GAEvEK,QAAwCC,EAAAA,EAAAA,wDAC1C,IAAIC,EAAAA,mDACAL,EACAnR,KAAKJ,MAAMjF,QACX8W,EAAAA,4BAA4BC,aAEhC1R,KAAKJ,MAAMjF,QAAQgX,eAGnBC,EAAAA,gBAAgBC,YAAYP,IAC5BtR,KAAKmF,SAAS,CAAEmM,gCAAAA,KAOP,KAAAgyD,gBAAkBtyD,UAA0B,IAAAuyD,EAAAC,EACzD,MAAMryD,EAAmE,QAAvDoyD,EAAuC,QAAvCC,EAAGxjE,KAAKJ,MAAM/D,KAAKuV,cAAcnS,cAAM,IAAAukE,OAAA,EAApCA,EAAsCnyD,sBAAc,IAAAkyD,EAAAA,EAAI,GACvE7oE,QAAiB+oE,EAAAA,EAAAA,gCACnB,IAAIC,EAAAA,iCAAiCvyD,GACrCnR,KAAKJ,MAAMjF,QAAQgX,sBAGK3R,KAAKJ,MAAM/D,KAAKuV,eAC9BC,eAAiB3W,GAGlB,KAAAoX,sBAAwB,KACrC,MAAM,UAAEjX,GAAcmF,KAAKJ,MAC3B,OAAOwS,EAAAA,EAAAA,mBAAkB,CACrBvX,UAAW,CACP+T,qBAAsB/T,EAAU+T,qBAChCJ,WAAY3T,EAAU2T,YAE1BN,OAAQlO,KAAKc,MAAMuR,YACnBpE,UAAWjO,KAAKsS,gBAChBlE,cAAepO,KAAKuS,gBAIX,KAAAC,oBAAsB,KACnC,MAAM,KAAE3W,EAAI,QAAElB,EAAO,UAAEE,GAAcmF,KAAKJ,MAE1C,IAAI6S,EAAsC,GAGlC,IAAD8I,EAFH5gB,GAAWA,EAAQgQ,SAAWhQ,EAAQgQ,QAAQgI,OAAShY,EAAQgQ,QAAQgI,MAAMC,EAC7EH,EAAkB,IAAI9X,EAAQgQ,QAAQgI,MAAMC,KAE5CH,EACK5W,EAAKgX,SAAS5T,QACX+Q,EAAsB8C,gBAAgBnY,EAAQgQ,QAAQ/L,OAAQ/C,EAAKgX,SAAS5T,OAAO8T,mBACtFlX,EAAKgX,SAAS5T,QAAUpD,EAAKgX,SAAS5T,OAAO+T,OACd,QADmBuI,EACnDvb,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,aAAK,IAAA4I,OAAA,EAAhCA,EAAkCtI,QAClC,GAER,IACIC,EADAC,EAAmB,GAEnBtX,EAAKuV,eAAiBvV,EAAKuV,cAAcnS,aAA0DxB,IAAhD5B,EAAKuV,cAAcnS,OAAOmU,kBAC7EF,EAAqBrX,EAAKuV,cAAcnS,OAAOmU,kBACxCvX,EAAKnB,UAAYmB,EAAKnB,SAASuE,SACtCiU,EAAqBrX,EAAKnB,SAASuE,OAAOoU,OAI1CF,EADAD,GAA6C,IAAvBA,EAEK,IAAvBA,GACM3T,EAAAA,EAAAA,QAAOS,KAAKJ,MAAM/E,UAAUyY,iBAAkBJ,GAC9ClT,KAAKJ,MAAM/E,UAAU0Y,YAEZhU,EAAAA,EAAAA,QAAOS,KAAKJ,MAAM/E,UAAUyY,iBAAkB,GAOrE,MAAO,CACHE,eAAgB,CAAEnZ,UAAW,qCANhBM,EAAQgQ,QAAQqqB,kBAAoB,gBAAgBr6B,EAAQgQ,QAAQqqB,kBAAkBpY,gBAAkB,MAOrH3J,MAAO,CACHQ,YAPYjZ,EAAAA,cAACsB,EAAAA,MAAK,CAACzB,UAAU,4CAA4CD,KAAMS,EAAU6Y,mBAQzFC,UAPUlB,GAAmBjY,EAAAA,cAACsB,EAAAA,MAAK,CAACzB,UAAU,0CAA0CD,KAAMqY,IAQ9FmB,WAPWpZ,EAAAA,cAACsB,EAAAA,MAAK,CAACzB,UAAU,2CAA2CD,KAAM+Y,OAYxE,KAAAU,sBAAwB,KACrC,MAAM,KAAEhY,GAASmE,KAAKJ,MAChBkU,EAAoBjY,EAAKiY,kBAAkB7U,OAejD,MAAO,CACH8U,2BAA4B,CAAEC,IAAK,MAAO3Z,UAAW,kDACrD4Z,sBAfAH,GACAA,EAAkB7Y,KAAI,CAAC4H,EAA8B1H,IAE7CX,EAAAA,cAACN,EAAAA,KAAI,CACDkB,IAAKD,EACLf,KAAMyI,EAAMmQ,KACZzY,UAAW,GAAGyF,KAAKJ,MAAM/E,UAAUqZ,yBAAyBrR,EAAMmQ,OAClE1Y,KAAMuI,EAAMsR,QASxBC,2BAL0B5Z,EAAAA,cAACuB,EAAAA,UAAS,CAACC,UAAU,QAStC,KAAAqY,oBAAsB,KACnC,MAAM,UAAExZ,GAAcmF,KAAKJ,MACrB0U,EAAiBtU,KAAKuU,+BAAiCvU,KAAKc,MAAM0T,aAAaC,qBACrF,IAAIU,EAAkBnV,KAAK2jE,uBAEvB3jE,KAAKJ,MAAMjF,QAAQ+c,IAAIjC,OAAO87B,aAC9Bp8B,EAAkBA,EAAgB6B,QAAOkD,GAAkBA,EAAe9e,MAAQ8U,EAAAA,GAAYM,0BAgBlG,MAAO,CACHkE,iBAAkB,CAAEra,UAAW,gDAC/Bsa,eAdAna,EAAAA,cAACoa,EAAAA,gBAAe,CACZC,eAAe,uBACfC,UAAWja,EAAUka,oBACrBC,WAAW,yBACXC,kBAAkB,wBAClBC,YAAY,OACZC,gBAAiBA,EACjBC,eAAgBd,EAChBe,eAAgBrV,KAAKsV,sBACrBxS,IAAK9C,KAAKuV,+BASL,KAAAC,eAAiB,KAC9B,MAAM,OAAEC,EAAM,QAAE9a,EAAO,KAAEkB,EAAI,UAAEhB,GAAcmF,KAAKJ,MAC5CwR,EAAgBvV,EAAKuV,cAAcnS,OACnCyW,GAAUC,EAAAA,EAAAA,IAAchb,EAAQgQ,SAChCiL,EAAeH,EAAOG,cAAgB,GAEtCC,EAAYzE,MAAAA,GAAAA,EAAe0E,kBAC3B1E,EAAc0E,mBAAqB9V,KAAKJ,MAAM6V,OAAOG,cAAgB,IACpE5V,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,QAAU3S,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,MAAMoD,MAAS,EAChFC,GAAa5E,MAAAA,OAAa,EAAbA,EAAegC,oBAAqB,EACjD6C,EAAepb,EAAUqb,gBACzBC,EAAWtb,EAAUub,YAE3B,OAAIJ,GAAcJ,EACP,KAGPpb,EAAAA,cAAC6b,EAAAA,uBAAsB,CACnBhc,UAAU,yCACViO,KAAK,aAAY,aACLzN,EAAUyb,oBACtBC,IAAKb,EAAQpb,KACbkc,IAAI,OACJjK,MAAOyJ,EACPJ,aAAcA,EACda,aAAcZ,EACdI,aAAcjW,KAAK4jE,YAAY3tD,GAC/BE,SAAUnW,KAAK6jE,YAAY1tD,GAC3BO,kBAAmBT,EACnBU,cAAeR,EACfua,iBAAkB1wB,KAAK0wB,oBAKlB,KAAA9Z,eAAiB,KAC9B,MAAM,KAAE/a,EAAI,QAAElB,EAAO,OAAE8a,GAAWzV,KAAKJ,MACjC+P,EAAoBhV,EAAQgQ,QAAQgI,OAAShY,EAAQgQ,QAAQgI,MAAMkE,WAAa,QAAU,SAC1FC,EACF9W,KAAKJ,MAAM6V,OAAO4G,oBAAsBzK,EAAAA,gBAAgBC,YAAY7R,KAAKc,MAAMiW,UACzE/W,KAAKc,MAAMiW,SAASC,QAAOxJ,GAChBoE,EAAAA,gBAAgBC,YAAYrE,EAAQrP,UAAY6B,KAAK8jE,wBAAwBt2D,KAExF3R,EAAKkb,SAAS9X,QACdpD,EAAKkb,SAAS9X,OAAO+X,QAAOxJ,GACjBoE,EAAAA,gBAAgBC,YAAYrE,EAAQrP,UAAY6B,KAAK8jE,wBAAwBt2D,KAG5FyJ,EAAkBpb,EAAKuV,cAAcnS,QAAUpD,EAAKuV,cAAcnS,OAAOiY,eAAkB,GAEjGlX,KAAK+jE,uBAAuBjtD,GAAiBA,EAAcrK,OAAQgJ,EAAOuuD,qBAC1E,MAAMC,EAAmBjkE,KAAK6iE,mBA8B9B,MAAO,CACH1rD,oBAAqB,CAAE9c,UAAW,2CAClC+c,wBAAyB,CAAE/c,UAAW,+CACtC0c,SA/BAD,GACAA,EAAc7b,KAAI,CAACiU,EAAmD/T,IAE9DX,EAAAA,cAACqU,EAAAA,EAAa,CACVK,wBAAyBA,EACzBO,sBAAuBwH,EACvBzV,sBAAuBxB,KAAKqX,uBAC5B9S,6BAA8BvE,KAAKJ,MAAM/E,UAAU0J,6BACnDG,6BAA8B1E,KAAKJ,MAAM/E,UAAU6J,6BACnDtJ,IAAKD,EACLyU,iBAAkB5P,KAAKsX,kBACvBtM,WAAYhL,KAAKuX,iBACjB1V,YAAY,EACZoN,2BAA4Bg1D,GAAoBA,EAAmB9oE,GACnEwU,kBAAmBA,EACnBhV,QAASA,EACTI,SAAUiF,KAAKJ,MAAMjE,GACrBuN,eAAgBlJ,KAAKJ,MAAMhE,SAC3B80B,iBAAkB1wB,KAAK0wB,iBACvB+vC,sBAAuBzgE,KAAKJ,MAAM/E,UAAU4lE,sBAC5CE,oBAAqB3gE,KAAKJ,MAAM/E,UAAU8lE,oBAC1CC,qBAAsB5gE,KAAKJ,MAAM/E,UAAU+lE,qBAC3CF,4BAA6B1gE,KAAKJ,MAAM/E,UAAU6lE,4BAClDvhD,SAAUnf,KAAKmf,eAiBlB,KAAA2kD,wBAA2Bt2D,IAA8C,IAAAqf,EAAA2iB,EAAAS,EAAAi0B,EACtF,MAAM,8BAAEzsD,GAAkCzX,KAAKc,MACzCqjE,EACsE,KAAxC,QAA/Bt3C,EAAA7sB,KAAKJ,MAAM/D,KAAKnB,SAASuE,cAAM,IAAA4tB,OAAA,EAA/BA,EAAiCu3C,oCAC9B52D,EAAQnK,YAA4C,QAApCmsC,EAAKxvC,KAAKJ,MAAM/D,KAAKnB,SAASuE,cAAM,IAAAuwC,OAAA,EAA/BA,EAAiC40B,oCACuB,KAAhF3sD,MAAAA,OAA6B,EAA7BA,EAA+B4sD,+CAC5B72D,EAAQnK,YAAaoU,MAAAA,OAA6B,EAA7BA,EAA+B4sD,8CAEtDC,EACoE,KAAtC,QAA/Br0B,EAAAjwC,KAAKJ,MAAM/D,KAAKnB,SAASuE,cAAM,IAAAgxC,OAAA,EAA/BA,EAAiC8tB,kCAC9BvwD,EAAQnK,YAA4C,QAApC6gE,EAAKlkE,KAAKJ,MAAM/D,KAAKnB,SAASuE,cAAM,IAAAilE,OAAA,EAA/BA,EAAiCnG,kCACY,KAArEtmD,MAAAA,OAA6B,EAA7BA,EAA+BS,oCAC5B1K,EAAQnK,YAAaoU,MAAAA,OAA6B,EAA7BA,EAA+BS,mCAG5D,OACIisD,GACCnkE,KAAKJ,MAAMjF,QAAQ+c,IAAIjC,OAAOkC,8BAAgCC,EAAAA,GAAqCC,SAChGysD,GAIK,KAAAhsD,kBAAoB,KAAsB,IAAAC,EACvD,MAAM,UAAE1d,EAAS,KAAEgB,EAAI,UAAEgD,GAAcmB,KAAKJ,OACtC,8BAAE6X,GAAkCzX,KAAKc,MACzC0X,EAAoB3c,EAAKuV,cAAcnS,QAAUpD,EAAKuV,cAAcnS,OAAOiY,eAAkB,GAC7FhK,EAAkD,QAAlCqL,EAAGvY,KAAKJ,MAAM/D,KAAKkb,SAAS9X,cAAM,IAAAsZ,OAAA,EAA/BA,EAAiChc,MAAKkc,GAA6B,WAAnBA,EAAOxW,UAChF,OACIzH,EAAAA,cAACyQ,EAAAA,EAAa,CACVmB,WAAW,gCACXF,aAAcrR,EAAUqR,aACxBC,MAAOtR,EAAU6d,mBACjBpM,eAAgBzR,EAAUyR,eAC1BP,gBAAiByM,EAEjB1L,iBAAkBjR,EAAKkb,SAAS9X,OAChC2N,aAAc/R,EAAU+R,aACxBC,uBAAwBhS,EAAUgS,uBAClChO,UAAWA,EACX6M,gBAAiB1L,KAAK2Y,iBACtB3N,WAAYhL,KAAK4Y,iCACjBvM,gBAAiBxR,EAAUwR,gBAC3BqkB,iBAAkB1wB,KAAK0wB,iBACvB/1B,QAASqF,KAAKJ,MAAMjF,QACpBojE,gCAAiCtmD,MAAAA,OAA6B,EAA7BA,EAA+BS,kCAChEnL,cAAeG,KASV,KAAAq3D,aAAe,KAAkB,IAAAC,EAAAh2B,EAAAi2B,EAC9C,MACIhvD,QAAQ,cAAE7a,EAAemkE,oBAAqB2F,IAC9C1kE,KAAKJ,OACH,UAAE/E,GAAcmF,KAAKJ,MAErB+kE,EAAyB3kE,KAAKJ,MAAMjF,QAAQ+c,IAAIjC,OAAOmvD,eACvDC,EAAkBH,IAAiD,SAAnBC,GAAgD,oBAAnBA,GAE7EjqE,EAAYsF,KAAKJ,MAAM/D,KAAKuV,cAAcnS,QAAUe,KAAKJ,MAAM/D,KAAKuV,cAAcnS,OAAOoS,gBAAmB,GAC5G2tD,EAAgC,QAAnBwF,EAAGxkE,KAAKJ,MAAMwe,aAAK,IAAAomD,GAAW,QAAXA,EAAhBA,EAAkBM,iBAAS,IAAAN,OAAA,EAA3BA,EAA8B,GAC9CxpE,EAA0B4W,EAAAA,gBAAgBC,YAAY7R,KAAKJ,MAAMwe,MAAMpjB,yBACvEgF,KAAKJ,MAAMwe,MAAMpjB,wBAAwB,GACzC,KAEA+pE,EAA+D,QAAtCv2B,EAAGxuC,KAAKJ,MAAM/D,KAAKuyB,aAAanvB,cAAM,IAAAuvC,OAAA,EAAnCA,EAAqCjyC,MACnE6xB,GAAsC,0DAAtBA,EAAapb,OAEjC,OACIxY,EAAAA,cAACC,EAAAA,yBAAwB,CACrBC,SAAUA,EACVC,QAASqF,KAAKJ,MAAMjF,QACpBC,cAAeA,EACfC,UAAWA,EACXC,WAAYkF,KAAKJ,MAAMhE,SACvBb,SAAUiF,KAAKJ,MAAMjE,GACrBojE,oBAAqB8F,EACrBn0C,iBAAkB1wB,KAAK0wB,iBACvBsuC,cAAeA,EACfhkE,wBAAyBA,EACzB+iE,gCAAgE,QAAjC0G,EAAEzkE,KAAKJ,MAAM/D,KAAKnB,SAASuE,cAAM,IAAAwlE,OAAA,EAA/BA,EAAiC1G,gCAClEvmC,qBAAsButC,MAAAA,OAAyB,EAAzBA,EAA2Bz2C,UACjDhd,gCAAiCtR,KAAKc,MAAMwQ,mCAKvC,KAAAgE,sBAAyBuD,IACtC,MACIle,SAAWgQ,QAASmO,EAAc,cAAEnH,IACpC3R,KAAKJ,MAET,GAAKkZ,GAAmBnH,GAAkB3R,KAAKJ,MAAM/D,KAAKuV,cAAcnS,OASxE8Z,OAAOC,QAAQC,UACX,GACA,IACAC,EAAAA,EAAAA,KACIvD,EAAAA,EAAAA,IAAc3V,KAAKJ,MAAMjF,QAAQgQ,cACjClN,EACA,CAACuC,KAAKmZ,iCAAiCN,EAAazD,sBACpD3X,KAGR2b,EAAAA,EAAAA,KAAY,KACRpZ,KAAKJ,MAAM/D,KAAKuV,cAAcnS,OAAQ6W,kBAAoB,EAC1D9V,KAAKJ,MAAM/D,KAAKuV,cAAcnS,OAAQoa,eAAiB,CACnDC,QAAS,CAACtZ,KAAKmZ,iCAAiCN,EAAazD,yBAtBrE,CAEI,MAAMxT,EAAQ,mDAAoDkX,EAAqC,GAApB,qBAC9EnH,EAAmC,GAAnB,sCAErB3R,KAAKJ,MAAMf,UAAUY,QAAQmC,KAsBpB,KAAAuX,iCAAoCI,IACjD,MAAM,KAAE1d,GAASmE,KAAKJ,MAEtB,IAAK/D,EAAK2d,oBAAoBva,OAC1B,MAAO,GAGX,MAAMwa,EAAsB5d,EAAK2d,oBAAoBva,OAAO1C,MAAKid,GACtDA,EAAoBpe,MAAQme,EAAOne,MAG9C,OAAIqe,EACOA,EAAoBC,WAGxB,IAOM,KAAAsrD,uBAAyB,KAA6B,IAAAC,EACnE,MAAMtrD,EAAmD,QAAvCsrD,EAAGjlE,KAAKJ,MAAM/D,KAAKuV,cAAcnS,cAAM,IAAAgmE,OAAA,EAApCA,EAAsC5rD,eAC3D,GAAIzH,EAAAA,gBAAgBC,YAAY8H,MAAAA,OAAY,EAAZA,EAAcL,SAC1C,OAAOK,EAAcL,QAAQ,GAGjC,MAAM4rD,GAAerrD,EAAAA,EAAAA,IAA8B,UAAW7Z,KAAKJ,MAAMjF,QAAQgQ,SACjF,OAAIiH,EAAAA,gBAAgBC,YAAYqzD,GACrBA,EAAa,QADxB,GAWa,KAAAvB,qBAAuB,KACpC,MAAMnqD,EAAsBxZ,KAAKJ,MAAM/D,KAAK2d,oBAAoBva,OAEhE,IAAKua,EACD,MAAO,GAGX,MAAM2rD,EAA4BnlE,KAAKiQ,sBAAsB+G,QAAO+C,GAChEP,EAAoBjd,MAAKmQ,GAAQqN,EAAmB3e,MAAQsR,EAAKtR,QAGrE,OAAOwW,EAAAA,gBAAgB4+B,YAAY20B,IAOtB,KAAA5wD,4BAA8B,KAC3C,MAAMqF,EAAmB5Z,KAAKglE,yBAExBxrD,EAAsBxZ,KAAKJ,MAAM/D,KAAK2d,oBAAoBva,OAEhE,IAAK2a,IAAqBJ,EACtB,OAGJ,MAAMM,EAAqBN,EAAoBjd,MAC3Cwd,GACIA,EAAmBL,WAAWM,aAAeJ,EAAiBI,YAC9DD,EAAmBL,WAAWO,eAAiBL,EAAiBK,eAExE,OAAKH,EAIE9Z,KAAKiQ,sBAAsB1T,MAAK2d,GAAkBA,EAAe9e,MAAQ0e,EAAmB1e,WAJnG,GAOa,KAAAkc,kBAAqBta,IAA+D,IAAAooE,EACjG,MACIzqE,SAAWgQ,QAASmO,EAAc,cAAEnH,IACpC3R,KAAKJ,MAET,IAAKkZ,IAAmBnH,IAAkB3R,KAAKJ,MAAM/D,KAAKuV,cAAcnS,OAAQ,CAC5E,MAAM2C,EAAQ,gEACPkX,EAAqC,GAApB,qBAA2BnH,EAAmC,GAAnB,sCAEnE,YADA3R,KAAKJ,MAAMf,UAAUY,QAAQmC,GAKjC,MAAM1E,GAA4BH,EAAAA,EAAAA,8BAC9BC,GACoC,QAApCooE,EAAAplE,KAAKJ,MAAM/D,KAAKuV,cAAcnS,cAAM,IAAAmmE,OAAA,EAApCA,EAAsCluD,gBAAiB,IAG3D6B,OAAOC,QAAQC,UAAU,GAAI,IAAIC,EAAAA,EAAAA,KAAiBvD,EAAAA,EAAAA,IAAc3V,KAAKJ,MAAMjF,QAAQgQ,SAAUzN,KAC7Fkc,EAAAA,EAAAA,KAAY,KACRpZ,KAAKJ,MAAM/D,KAAKuV,cAAcnS,OAAQ6W,kBAAoB,EAC1D9V,KAAKJ,MAAM/D,KAAKuV,cAAcnS,OAAQiY,cAAgBha,MAI7C,KAAAqa,iBAAoBva,IACjC,GAAIgD,KAAKJ,MAAM/D,KAAKuV,cAAcnS,OAAQ,CACtC,MAAMkb,GAAwBpd,EAAAA,EAAAA,8BAC1BC,EACAgD,KAAKJ,MAAM/D,KAAKuV,cAAcnS,OAAOiY,eAAiB,IAG1D,OAAOgC,EAAAA,EAAAA,KAAiBvD,EAAAA,EAAAA,IAAc3V,KAAKJ,MAAMjF,QAAQgQ,SAAUwP,GAGvE,OADAna,KAAKJ,MAAMf,UAAUY,QAAQ,uFACtB,IAGM,KAAAkZ,iBAAoBE,IACjC,MAAM,KAAEhd,EAAI,UAAEgD,GAAcmB,KAAKJ,MAEjC,IAAK/D,EAAKuV,cAAcnS,OAEpB,YADAJ,EAAUY,QAAQ,sGAItB,IAAIxC,EAA6BpB,EAAKuV,cAAcnS,QAAUpD,EAAKuV,cAAcnS,OAAOiY,eAAkB,GAE1G,GAAK2B,EAAaxN,SASX,CACHpO,EAA4B,GAG5B,MAAMmd,EAAoBpa,KAAKuV,2BAA2BrP,SAAWlG,KAAKuV,2BAA2BrP,QAAQtG,MAAMoV,WAC7GqF,EAAkBD,GAAqBjT,SAASC,eAAegT,GACrEnU,YAAW,KACPoU,GAAmBA,EAAgBlU,UACpC,QAjBqB,CACxB,MAAMmU,EAAiBzB,EAAajN,cACpC,IAAK0O,EAED,YADAzb,EAAUY,QAAQ,gFAGtBxC,EAA4BA,EAA0B+Z,QACjD3Z,KAA4CZ,EAAAA,EAAAA,+BAA8B6d,EAAgBjd,KAanG,MAAMqY,GAAUC,EAAAA,EAAAA,IAAc3V,KAAKJ,MAAMjF,QAAQgQ,SACjDoO,OAAOC,QAAQC,UAAU,GAAI,IAAIC,EAAAA,EAAAA,IAAiBxD,EAASzY,IAC3DpB,EAAKuV,cAAcnS,OAAO6W,kBAAoB,EAC9Cja,EAAKuV,cAAcnS,OAAOiY,cAAgBja,GAG7B,KAAA2b,iCAAmC,CAACpN,EAAsC+O,KACvF,MAAM,KAAE1e,EAAI,UAAEgD,GAAcmB,KAAKJ,MAC3B8V,GAAUC,EAAAA,EAAAA,IAAc3V,KAAKJ,MAAMjF,QAAQgQ,SAEjD,IAAK9O,EAAKuV,cAAcnS,OAEpB,OADAJ,EAAUY,QAAQ,yGACXiW,EAAQpb,KAGnB,IAAI2C,EAA6BpB,EAAKuV,cAAcnS,QAAUpD,EAAKuV,cAAcnS,OAAOiY,eAAkB,GAE1G,GAAKqD,EASDtd,EAA4B,OATf,CACb,IAAKuO,EAED,OADA3M,EAAUY,QAAQ,wFACXiW,EAAQpb,KAEnB2C,EAA4BA,EAA0B+Z,QACjD3Z,KAA4CZ,EAAAA,EAAAA,+BAA8B+O,EAAiBnO,KAMpG,OAAO6b,EAAAA,EAAAA,IAAiBxD,EAASzY,IAwBpB,KAAA8mE,uBAAyB,CAACjtD,EAAwBuuD,KAC/D,OAAQA,GACJ,IAAI,MACArlE,KAAK6iE,mBAAqB/rD,EAC1B,MACJ,IAAI,MACA9W,KAAK6iE,mBAAqB,EAC1B,MACJ,IAAI,MACA7iE,KAAK6iE,mBAAqB,EAC1B,MACJ,IAAI,QACA7iE,KAAK6iE,mBAAqB,EAC1B,MACJ,IAAI,OACA7iE,KAAK6iE,mBAAqB,EAC1B,MACJ,QACI7iE,KAAK6iE,mBAAqB,IASrB,KAAAe,YAAe0B,GAExB9qE,EAAAA,cAAA,OAAKH,UAAU,wBACXG,EAAAA,cAAA,QAAMH,UAAU,oCAAmC,cAAa,SAChEG,EAAAA,cAAA,QAAMH,UAAU,aAAairE,IAUxB,KAAAzB,YAAe0B,GAExB/qE,EAAAA,cAAA,OAAKH,UAAU,wBACXG,EAAAA,cAAA,QAAMH,UAAU,aAAakrE,GAC7B/qE,EAAAA,cAAA,QAAMH,UAAU,qCAAoC,cAAa,UAh4BzE2F,KAAKwa,UAAoD,YAAnB,QAArBioD,EAAA7iE,EAAMjF,QAAQgQ,eAAO,IAAA83D,GAAQ,QAARA,EAArBA,EAAuBhoD,cAAM,IAAAgoD,OAAA,EAA7BA,EAA+B/nD,MAAoB,KAAO,KAC3E1a,KAAKsS,gBAAkB9X,EAAAA,YACvBwF,KAAKuV,2BAA6B/a,EAAAA,YAClCwF,KAAKuS,aAAevS,KAAKuS,aAAarS,KAAKF,MAC3CA,KAAK2a,gBAAkB3a,KAAK2a,gBAAgBza,KAAKF,MACjDA,KAAKwlE,cAAgB,GACrBxlE,KAAKc,MAAQ,CACT0T,aAAc,CACVoG,SAAS,EACTnG,qBAAsBzU,KAAKiQ,sBAAsB,IAErDoC,aAAa,EACb0E,SAAU,GACVU,mCAA+Bha,GAEnC,MAAM,mBAAEwF,EAAkB,SAAER,EAAQ,SAAEM,EAAQ,gBAAEhB,GAAoB/B,KAAKJ,MAAM/E,UAEzE+D,EAASoB,KAAKJ,MAAMjF,QAAQgQ,QAAQ/L,OACpCC,EAAYmB,KAAKJ,MAAMf,UACvB8G,EAAqB3F,KAAKJ,MAAM/E,UAAUggB,yBAC1CtU,EAAuBvG,KAAKJ,MAAM/E,UAAUigB,wBAClD9a,KAAKqX,uBAAyB,CAC1BxY,UAAAA,EACAD,OAAAA,EACAqE,mBAAAA,EACAR,SAAAA,EACAM,SAAAA,EACAhB,gBAAAA,EACA4D,mBAAAA,EACAY,qBAAAA,GAEJvG,KAAK0wB,kBAAmBqE,EAAAA,EAAAA,oBACpB/0B,KAAKJ,MAAMjF,QAAQgQ,QAAQqqB,kBAC3Bh1B,KAAKJ,MAAMgpC,aACX5oC,KAAKJ,MAAMf,WAEfmB,KAAK2a,kBAzFC,eACN,MAA0B,OAAnB3a,KAAKwa,WAAyC,OAAnBxa,KAAKwa,UAwCpC,uBAAuB5b,EAAgB4d,GAAyC,IAAAC,EACnF,IAAIC,EAKJ,OAJI9d,GAAU4d,GAAoB5K,EAAAA,gBAAgBC,YAAY2K,KAC1DE,EAAkBF,EAAiBjgB,MAAKmQ,GAAQA,EAAKiQ,SAAUC,gBAAkBhe,EAAOge,iBAGtE,QAAtBH,EAAOC,SAAe,IAAAD,OAAA,EAAfA,EAAiBI,KA4CrB,0BAAuB,IAAA4oD,EAC1BzlE,KAAK4Q,YAAa,EACdsM,EAAAA,GAASC,WAAapE,OAAOqE,mBAC7BrE,OAAOqE,iBAAiB,SAAUpd,KAAK2a,iBACvC3a,KAAK2a,mBAGT,MAAMvJ,QAAsBpR,KAAKJ,MAAM/D,KAAKuV,cACtC1W,QAAiBsF,KAAKJ,MAAM/D,KAAKnB,SACjC+c,QAAsCmG,EAAAA,2BAAAA,+BAA0D,CAClGC,cAAe7d,KAAKJ,MAAMjF,QAAQgX,gBAElC3R,KAAK4Q,YACL5Q,KAAKmF,SAAS,CAAEsS,8BAAAA,IAGpBzX,KAAKijE,qBAAqB7xD,EAAe1W,IAGzC2gB,EAAAA,EAAAA,KACI,KAAK,IAAAqqD,EAAAC,EACD,MAAO,CACwB,QADxBD,EACHt0D,EAAc8F,qBAAa,IAAAwuD,OAAA,EAA3BA,EAA6Bj5D,OAC7B2E,EAAc0E,kBACdlE,EAAAA,gBAAgBC,YAAwC,QAA7B8zD,EAACv0D,EAAciI,sBAAc,IAAAssD,OAAA,EAA5BA,EAA8BrsD,aAGlEtI,UAAW,IAAA40D,EAAAC,EAAAC,EAAAtqD,EAAAsB,EAAAC,EAAAlV,EAAAg2C,EACP,MAAMkoB,QAAyB/lE,KAAKJ,MAAM/D,KAAKuV,cACzC1K,EAAQ,IAAI+U,EAAAA,GACdsqD,EAAiBp1D,SACjB3Q,KAAKJ,MAAMjF,QAAQgQ,QAAQD,YAC3B,CACIgR,OAAQ,CACJC,IAAK3b,KAAKJ,MAAM6V,OAAOG,aACvBgG,KAAMC,KAAK1Y,IAAI4iE,EAAiB3qD,UAA8C,QAAtCwqD,EAAIG,EAAiBjwD,yBAAiB,IAAA8vD,EAAAA,EAAI,GAAI,IAE1FvyD,OAAO,EACPyI,QAAwC,QAAjC+pD,EAAEE,EAAiB1sD,sBAAc,IAAAwsD,EAAAA,EAAI,IAElB,QAD7BC,EACDC,EAAiB7uD,qBAAa,IAAA4uD,EAAAA,EAAI,KAEhC9lE,KAAKJ,MAAMjF,QAAQgQ,QAAQ+F,UAAUqL,UAAY,GAGnB,QAAhCP,EAAAxb,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,aAAK,IAAA6I,GAAhCA,EAAkC5I,EAC5B5S,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,MAAMC,EACjC1K,KAAKC,UAAU,CACX6T,UAA2C,QAAlCc,EAAE9c,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,aAAK,IAAAmK,OAAA,EAAhCA,EAAkCb,UAC7CC,eAAgD,QAAlCa,EAAE/c,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,aAAK,IAAAoK,OAAA,EAAhCA,EAAkCZ,mBAGhD,QAAXtU,EAAC7H,KAAKJ,aAAK,IAAAiI,GAAQ,QAARA,EAAVA,EAAY4N,cAAM,IAAA5N,IAAlBA,EAAoBuU,mBACtBpc,KAAKJ,MAAM6V,OAAO4G,mBAClBrc,KAAKJ,MAAMjF,QAAQgQ,QAAQ/L,OAC3BoB,KAAK6Q,UACL4G,GAGE8E,QAAuBD,EAAAA,EAAAA,IAAsB5V,EAAO1G,KAAKJ,MAAMjF,QAAQgX,eAe7E,GAdAo0D,EAAiB3yD,kBAAoBmJ,EAAelJ,MACpD0yD,EAAiB10D,eAAiBkL,EAAe7hB,SAI7CsF,KAAKJ,MAAM6V,OAAOuwD,+BAC6B,QADAnoB,EAC/C79C,KAAKJ,MAAMjF,QAAQgX,cAAcmH,sBAAc,IAAA+kC,GAAM,QAANA,EAA/CA,EAAiDooB,YAAI,IAAApoB,GAArDA,EAAuDqoB,iBAGvDlmE,KAAKsjE,wBAGHtjE,KAAKgjE,6BAEPhjE,KAAKJ,MAAM6V,OAAO4G,mBAAoB,CAAC,IAAD8pD,EAAAC,EAAAC,EAAArpD,EAAAspD,EACtC,MAAMC,EAAe,IAAIC,EAAAA,GACrBT,EAAiBp1D,SACjB3Q,KAAKJ,MAAMjF,QAAQgQ,QAAQD,YAC3B,CACIgR,OAAQ,CACJC,IAAK3b,KAAKJ,MAAM6V,OAAOG,aACvBgG,KAAMC,KAAK1Y,IACP4iE,EAAiB3qD,UAA8C,QAAtC+qD,EAAIJ,EAAiBjwD,yBAAiB,IAAAqwD,EAAAA,EAAInmE,KAAK8iE,mBACxE9iE,KAAK8iE,oBAGbzvD,OAAO,EACPyI,QAAwC,QAAjCsqD,EAAEL,EAAiB1sD,sBAAc,IAAA+sD,EAAAA,EAAI,IAElB,QAD7BC,EACDN,EAAiB7uD,qBAAa,IAAAmvD,EAAAA,EAAI,KAEhCrmE,KAAKJ,MAAMjF,QAAQgQ,QAAQ+F,UAAUqL,UAAY,GACnB,QAAhCiB,EAAAhd,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,aAAK,IAAAqK,GAAhCA,EAAkCpK,EAC5B5S,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,MAAMC,EACD,QADE0zD,EAClCtmE,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,aAAK,IAAA2zD,OAAA,EAAhCA,EAAkCrqD,WACxC,EACAjc,KAAKJ,MAAM6V,OAAO4G,wBAClB5e,EACAuC,KAAK6Q,UACL4G,GAGEV,QAAiB0vD,EAAAA,EAAAA,IAA4BF,EAAcvmE,KAAKJ,MAAMjF,QAAQgX,eACpF3R,KAAKmF,SAAS,CAAE4R,SAAAA,QAMxB/W,KAAKJ,MAAM6V,OAAOuwD,+BAE6B,QAFAP,EAE/CzlE,KAAKJ,MAAMjF,QAAQgX,cAAcmH,sBAAc,IAAA2sD,GAAM,QAANA,EAA/CA,EAAiDQ,YAAI,IAAAR,GAArDA,EAAuDS,iBAGvDlmE,KAAKsjE,wBAEHtjE,KAAKgjE,6BAGRjlD,uBACH/d,KAAK4Q,YAAa,EACdsM,EAAAA,GAASC,WAAapE,OAAOiF,qBAC7BjF,OAAOiF,oBAAoB,SAAUhe,KAAK2a,iBAI3CpZ,SAAM,IAAApH,EAAAusE,EAAAC,EAAAC,EAAAC,EAAAC,EACT,MACIrxD,QAAQ,cAAE7a,EAAa,UAAEP,GAAW,UACpCQ,EACAgB,MAAM,cAAEuV,EAAe1W,SAAUqsE,EAAiB,eAAE1D,IACpDrjE,KAAKJ,OAEJI,KAAK+iE,wBAA0B3xD,EAAcnS,QAAU8nE,EAAkB9nE,SAC1Ee,KAAKijE,qBAAqB7xD,EAAcnS,OAAQ8nE,EAAkB9nE,QAClEe,KAAK+iE,wBAAyB,GAGlC,MAAMroE,EAAYsF,KAAKJ,MAAM/D,KAAKuV,cAAcnS,QAAUe,KAAKJ,MAAM/D,KAAKuV,cAAcnS,OAAOoS,gBAAmB,GAC5G21D,EAA6E,QAAhE7sE,EAAuC,QAAvCusE,EAAuB,QAAvBC,EAAGv1D,EAAcnS,cAAM,IAAA0nE,OAAA,EAApBA,EAAsBtD,sBAAc,IAAAqD,EAAAA,EAAIrD,EAAepkE,cAAM,IAAA9E,EAAAA,EAAI,KACvF,IAAI8jB,EAAY,GACXrM,EAAAA,gBAAgBC,YAAYnX,KAC7BujB,EAA+B,aAAnBje,KAAKyQ,UAA2B5V,EAAUqjB,2BAA6BrjB,EAAUsjB,0BAEjG,MAAME,EAAoBre,KAAKukE,eACzB0C,EACFzsE,EAAAA,cAAC2jE,EAAAA,wBAAuB,CACpBjjE,QAAS8rE,EACTrsE,QAASqF,KAAKJ,MAAMjF,QACpBC,cAAeA,EACfC,UAAWA,EACXC,WAAYkF,KAAKJ,MAAMhE,SACvBb,SAAUiF,KAAKJ,MAAMjE,GACrB+0B,iBAAkB1wB,KAAK0wB,iBACvBvU,eAAgD,QAAlCyqD,EAAE5mE,KAAKJ,MAAMjF,QAAQgQ,QAAQgI,aAAK,IAAAi0D,OAAA,EAAhCA,EAAkCzqD,iBAIpDmC,EAA8B9gB,EAAAA,EAAA,GAC7BwC,KAAKJ,OAAK,IACblF,SAAU2jB,EACVE,eAAgBve,KAAKwS,sBACrBsB,mBAAoB9T,KAAKJ,MAAM6V,OAAOyxD,kBAAoBlnE,KAAK6T,wBAC/D2K,WAAYxe,KAAK4W,iBACjBvc,UAAWqP,GAAAA,CAAW,6BAA8BrP,GACpD0V,sBAAuB,CACnB0O,YAAaze,KAAKJ,MAClBvF,UAAWqP,GAAAA,CAAW,6BAA8BrP,IAExDqkB,cAA2E,KAAxB,QAApCmoD,EAAA7mE,KAAKJ,MAAM/D,KAAKuV,cAAcnS,cAAM,IAAA4nE,OAAA,EAApCA,EAAsCzzD,mBAA0BpT,KAAKqU,sBAAwB,KAC5GsK,WAAY3e,KAAKwV,iBACjBoJ,kBAAmB,CAAEvkB,UAAW,wCAChCwkB,wBAAyB,CAAExkB,UAAW,+CACtCykB,qBAAsB,CAAEzkB,UAAW,oDACnC0kB,iCAAkC,CAAE1kB,UAAW,sDAC/C2kB,cAAehf,KAAKsY,oBACpB2G,YACgE,KAAxB,QAApC6nD,EAAA9mE,KAAKJ,MAAM/D,KAAKuV,cAAcnS,cAAM,IAAA6nE,OAAA,EAApCA,EAAsC1zD,mBAClC5Y,EAAAA,cAACkT,EAAAA,YAAW,CACRtT,KAAMS,EAAU2T,WAChBjU,UAAWM,EAAU2T,WACrBb,SAAU3N,KAAKsS,gBACf3J,QAAS3I,KAAKuS,aACd5W,GAAG,wBAEP,KACRujB,kBAAmBlf,KAAK8R,wBACxBqN,SAAUnf,KAAKmf,SACfC,aAAcnB,GAAazjB,EAAAA,cAACsV,EAAAA,aAAY,CAAC1V,KAAM6jB,IAC/CkpD,uBAAwB,CAAE9sE,UAAW,4BACrC+sE,mBAAoBJ,EAAgBC,EAAmB,KACvDzB,cAAexlE,KAAKwlE,cACpBl0D,gCAAiCtR,KAAKc,MAAMwQ,kCAEhD,OAAOtR,KAAKJ,MAAMyf,WAAWf,GAslBzBgB,eACJ,OAAIpC,EAAAA,GAASC,WACFgC,EAAAA,EAAAA,UAAS,CAAEsO,QAASC,EAAAA,YAAYs7B,QAASruD,QAASqF,KAAKJ,MAAMjF,QAAQgQ,WAEzEwU,EAAAA,EAAAA,UAAS,CAAEsO,QAASC,EAAAA,YAAYC,SAAUhzB,QAASqF,KAAKJ,MAAMjF,QAAQgQ,UAGzE4H,eACJvS,KAAKmF,SAAS,CACVkN,aAAcrS,KAAKc,MAAMuR,cAIzBsI,kBACJ3a,KAAKwa,UAAYxa,KAAKsf,eAElBtf,KAAKc,MAAMuR,cAAgBrS,KAAKmf,UAChCnf,KAAKuS,kBAp4BHjL,EAAAA,EAAAA,IAAA,CAATC,EAAAA,IAAQ,8BAqBTD,EAAAA,EAAAA,IAAA,CADCwY,EAAAA,IAAU,gCAxBM/P,EAAqBC,GAAA1I,EAAAA,EAAAA,IAAA,CADzCE,EAAAA,IACoBuI,GA67BpB,iGC1kCD,MA+DMgQ,EAA0BA,CAC5BC,EACAxB,EACA7J,EACA0yD,IAEO7sE,EAAAA,aACHwlB,EAAWjO,MACX,GACAiO,EAAWhO,YACXiO,EAAgBD,EAAYxB,EAAY7J,EAAgB0yD,GACxDrnD,EAAW/N,aAIbgO,EAAkBA,CACpBrgB,EACA4e,EACA7J,EACA0yD,IAEI1yD,EACOna,EAAAA,aAAmBoF,EAAMsS,UAAW,GAAIgO,EAAWvL,EAAgB0yD,GAAmBlnD,EAAc3B,IAExG,KAGL2B,EAAiBvgB,IACnB,MAAM,SAAEmX,EAAQ,oBAAEI,EAAmB,wBAAEC,GAA4BxX,EACnE,OAAImX,EAEIvc,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK4U,GACN5c,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK2U,GACLJ,EAAS9b,KAAI,CAAColB,EAASllB,IACpBX,EAAAA,cAACA,EAAAA,SAAc,CAACY,IAAKD,GAAQklB,OAM1C,MAGLH,EAAaA,CAACtgB,EAAyBynE,KACzC,MAAM,iBAAE3yD,EAAgB,eAAEC,GAAmB/U,EAC7C,OAAI+U,IAAmB0yD,EACZ7sE,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKkS,GAAmBC,GAEjC,MAGL2L,EAA2B1gB,IAC7B,MAAM,2BAAEmU,EAA0B,sBAAEE,EAAqB,2BAAEG,GAA+BxU,EAC1F,OAAIqU,EAEIzZ,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKuR,GACLE,EAAsBhZ,KAAI,CAAC4X,EAAU1X,IAClCX,EAAAA,cAACA,EAAAA,SAAc,CAACY,IAAKD,GAChB0X,EACAoB,GAAyBA,EAAsB9Y,EAAQ,IAAMiZ,MAO3E,MAGLmM,EAAe3gB,IACjB,MAAM,MAAEqT,EAAK,eAAEO,GAAmB5T,EAClC,OAAIqT,EAEIzY,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKgR,GACNhZ,EAAAA,cAAA,UACKyY,EAAMQ,YACNR,EAAMU,YAKhB,MAGL6M,EAAoB5gB,IACtB,MAAM,MAAEqT,EAAK,eAAEO,GAAmB5T,EAClC,OAAIqT,EAEIzY,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKgR,GACNhZ,EAAAA,cAAA,UAAKyY,EAAMW,aAIhB,MAGX,EA/J6EhU,IAAQ,IAAAuzB,EACjF,MAAM,sBACFpjB,EAAqB,SACrBrV,EAAQ,WACRikB,EAAU,kBACVC,EAAiB,wBACjBC,EAAuB,cACvBG,EAAa,SACbG,EAAQ,YACRF,EAAW,kBACXC,EAAiB,eACjBX,EAAc,WACdC,EAAU,kBACV1K,EAAiB,cACjB4K,EAAa,qBACbI,EAAoB,iCACpBC,EAAgC,aAChCK,EAAY,uBACZ+nD,EAAsB,mBACtBC,GACAxnE,EACEynE,EAAmE,QAAnDl0C,EAAGvzB,EAAMjF,QAAQgX,cAAcmH,eAAenG,aAAK,IAAAwgB,OAAA,EAAhDA,EAAkDhX,eAC3E,OAAIgD,EAEI3kB,EAAAA,cAACimB,EAAAA,OAAMle,OAAAC,OAAA,GAAKuN,GACPuQ,EAAwBxM,GACxByM,EAAYhC,GACZS,EACAC,EACAc,EAAwBb,EAAmBV,EAAYE,EAAe2oD,GACvE7sE,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK2kE,GAAyBC,GACnC5sE,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKoc,GACLQ,EACA1kB,GAEJikB,GAKTnkB,EAAAA,cAACimB,EAAAA,OAAMle,OAAAC,OAAA,GAAKuN,GACRvV,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKsc,GACLhL,GAAqBwM,EAAwBxM,GAC7CyK,GAAkBiC,EAAiBjC,IAExC/jB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKuc,GACLP,GAAc2B,EAAc3B,GAC7BhkB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKqc,GACLN,GAAkBgC,EAAYhC,GAC9BS,EACAN,IAAkB2oD,GAAoBnnD,EAAWxB,GAClDlkB,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAK2kE,GAAyBC,GACnC5sE,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKoc,GACLQ,EACA1kB,GAEJikB,+qBCnDrB,MAAM2oD,UAAwB9sE,EAAAA,cAC1BmF,YAAYC,GACRC,MAAMD,GAENI,KAAKunE,oBAAsBvnE,KAAKunE,oBAAoBrnE,KAAKF,MAGtDuB,SACH,MAAMg+C,EAAS/hD,EAAAA,EAAA,GACRwC,KAAKJ,OAAK,IACb0nE,gBAAiB,CACb7oD,YAAaze,KAAKJ,MAClBvF,UAAW,wBAEfmtE,uBAAwBxnE,KAAKunE,wBAGjC,OAAOvnE,KAAKJ,MAAMyf,WAAWkgC,GAGzBgoB,sBACJ,MAAMvwB,EAAMh3C,KAAKJ,MAAM6V,OAAOgyD,KAC9B,GAAIvqD,EAAAA,GAASC,UACT,OAAQnd,KAAKJ,MAAM6V,OAAOiyD,aACtB,IAAI,WACA,OACIltE,EAAAA,cAACmtE,EAAAA,qBAAoB,CACjBD,YAAaE,EAAAA,YAAYC,SACzBC,QAAS3gE,SAAS65C,IAClBrmD,QAASqF,KAAKrF,QACdgB,GAAI,GAAGqE,KAAKJ,MAAMjE,cAClBC,SAAUoE,KAAKJ,MAAMhE,SACrBC,KAAM,GACNm7C,IAAKA,IAGjB,IAAI,UACA,OACIx8C,EAAAA,cAACmtE,EAAAA,qBAAoB,CACjBD,YAAaE,EAAAA,YAAYG,QACzBD,QAAS3gE,SAAS65C,IAClBrmD,QAASqF,KAAKrF,QACdgB,GAAI,GAAGqE,KAAKJ,MAAMjE,aAClBC,SAAUoE,KAAKJ,MAAMhE,SACrBC,KAAM,GACNm7C,IAAKA,IAGjB,IAAI,YACA,OACIx8C,EAAAA,cAACmtE,EAAAA,qBAAoB,CACjBD,YAAaE,EAAAA,YAAYI,UACzBF,QAAS3gE,SAAS65C,IAClBrmD,QAASqF,KAAKrF,QACdgB,GAAI,GAAGqE,KAAKJ,MAAMjE,eAClBC,SAAUoE,KAAKJ,MAAMhE,SACrBC,KAAM,GACNm7C,IAAKA,IAGjB,IAAI,WACA,OACIx8C,EAAAA,cAACmtE,EAAAA,qBAAoB,CACjBD,YAAaE,EAAAA,YAAYK,SACzBH,QAAS3gE,SAAS65C,IAClBrmD,QAASqF,KAAKrF,QACdgB,GAAI,GAAGqE,KAAKJ,MAAMjE,cAClBC,SAAUoE,KAAKJ,MAAMhE,SACrBC,KAAM,GACNm7C,IAAKA,IAGjB,IAAI,OACA,OACIx8C,EAAAA,cAACmtE,EAAAA,qBAAoB,CACjBD,YAAaE,EAAAA,YAAYM,KACzBJ,QAAS3gE,SAAS65C,IAClBrmD,QAASqF,KAAKrF,QACdgB,GAAI,GAAGqE,KAAKJ,MAAMjE,UAClBC,SAAUoE,KAAKJ,MAAMhE,SACrBC,KAAM,GACNm7C,IAAKA,IAGjB,QACI,OAAO,KAGnB,OAAO,MAIf,qICxGO,MAAMmxB,EAA2DvoE,IACpE,MAAM,gBAAE0nE,EAAe,uBAAEE,GAA2B5nE,EAEpD,OAAK4nE,EAIEhtE,IAAAA,cAACimB,EAAAA,OAAMle,OAAAC,OAAA,GAAK8kE,GAAkBE,IAHjC5nE,EAAMjF,QAAQkE,UAAU+C,MAAM,iDACvB,OAKf,uPCNO,MAAMwmE,EAA0DjuE,IAAA,IAAC,IAAEiB,EAAG,UAAEf,EAAS,cAAEiP,EAAa,eAAEw4B,GAAgB3nC,EAAA,OACrHK,EAAAA,cAAA,OAAKY,IAAKA,EAAKf,UAAWA,GACtBG,EAAAA,cAAA,QAAMH,UAAU,iCAAiCiP,EAAa,KAC9D9O,EAAAA,cAAA,QAAMH,UAAU,iCAAiCynC,KCwEnDumC,EAdkBzoE,IACpB,MAAM,QAAE1E,EAAO,QAAEotE,EAAO,SAAEC,GAAa3oE,GACjC,YAAE4oE,GAAgBD,EAExBC,GAAettE,GAAWotE,GAAWE,EAAYttE,EAASotE,IAUxDD,EAP2BzoE,IAC7B,MAAM,aAAE6oE,GAAiB7oE,EAAM2oE,UACzB,SAAEllE,GAAazD,EAAM1E,QAE3ButE,GAAgBplE,GAAYolE,EAAaplE,IAyBvCqlE,EAAoB9oE,IACtB,MAAM,QAAE1E,EAAO,MAAE46B,EAAK,QAAEn7B,EAAO,UAAEE,GAAc+E,GAEzC,KAAEoT,EAAI,WAAEw0B,GAAetsC,GACvB,0BAAEgmB,EAAyB,yBAAEC,EAAwB,0BAAEC,GAA8BvmB,EAE3F,IAAI8tE,EAAiB,OACjBl6C,EAAa,KAsBjB,OApBIqH,IACA6yC,EACwB,IAApB7yC,EAAM8yC,UAAkB/tE,EAAUS,cAAgBX,EAAQ8sB,iBAAiBY,eAAeyN,EAAM8yC,UAAY9yC,EAAMg1B,eAGtHtjB,IACA/Y,EAAa+Y,EAAWvsC,KAAI4tE,IACxB,OAAQA,EAAiB1nC,oBACrB,KAAK,EACD,MAAO,GAAGjgB,IAA4B2nD,EAAiBlnC,gBAAkBknC,EAAiBlnC,eAAeM,QAC7G,KAAK,EACD,MAAO,GAAG9gB,IAA2B0nD,EAAiBlnC,gBAAkBknC,EAAiBlnC,eAAeM,QAC5G,KAAK,EACD,MAAO,GAAG7gB,IAA4BynD,EAAiBlnC,gBAAkBknC,EAAiBlnC,eAAeM,QAC7G,QACI,MAAO,QAKhB,GAAGjvB,KAAQ21D,KAAmBl6C,GAAcA,EAAWq6C,KAAK,KAAQ,MASzEC,EAAoBA,CAACriE,EAA2Bob,KAClD,MAAM,iBAAE4O,GAAqBhqB,GACrBrD,SAAU0Y,EAAU/I,KAAMqjC,GAAgB3vC,EAAMxL,QAClDkiC,GAAUC,EAAAA,EAAAA,kBAAiB,QAAS3M,EAAmB,GAAI3U,EAAS9P,YACpE+8D,GAAoBzrC,EAAAA,EAAAA,wBAAuB7M,EAAmB0M,GAC9D6rC,EAA2BnnD,EACjC,OACKlY,EAAAA,iBAAiBC,mBAAmBo/D,IACjCzuE,EAAAA,cAAA,IAAA+H,OAAAC,OAAA,CACIlI,KAAM2uE,EACN5uE,UAAU,mCACN2uE,EAAiB,cACTN,EAAiBhiE,KAE5B2vC,IAqBX6yB,EAAkCA,CAACC,EAA+CC,KACpF,MAAMC,EAAmBD,EACnB,sCAAsCA,IACtC,qCACN,OACKx/D,EAAAA,iBAAiBC,mBAAmBs/D,IACjC3uE,EAAAA,cAAA,QAAMH,UAAWgvE,GAAmBF,IAU1CG,EAAwC5iE,IAC1C,MAAM,UAAE6iE,EAAS,cAAE5zC,EAAa,eAAEC,GAAmBlvB,EAG/CgtB,EAAgBhtB,EAAMxL,QAAQ00C,gBAAkBC,EAAAA,oBAAoBC,QAEpE05B,EAAgBhvE,EAAAA,aAAkB,KACpC6tE,EAA8B3hE,KAC/B,CAACA,IAEJ,OACIlM,EAAAA,cAACmU,EAAAA,OAAM,CACHtU,UAAU,wCACV4Y,OAASygB,GAAiB61C,IAAc5zC,GAAkBC,EAC1DjtB,QAAS6gE,EACTnkD,WAAYqO,GAAiB61C,KAE1B71C,GAAiB61C,IAAc5zC,GAAkBC,IAU1D6zC,EAAiD/iE,IACnD,MAAM,uBAAEgjE,GAA2BhjE,EAE7BijE,EAAmBnvE,EAAAA,aAAkB,KACvC6tE,EAA+B3hE,KAChC,CAACA,IAEJ,OAAOlM,EAAAA,cAAA,UAAQH,UAAU,2CAA0C,aAAaqvE,EAAwB/gE,QAASghE,KAS/GC,EAAsBA,CAACjvE,EAAuCs2C,KAEhE,KAAIt2C,EAAQ+c,IAAIjC,QAAY9a,EAAQ+c,IAAIjC,OAAO+a,0BAA4E,SAAhD71B,EAAQ+c,IAAIjC,OAAO+a,2BAIzFygB,EAIL,OACIz2C,EAAAA,cAAA,OAAKH,UAAU,8CACXG,EAAAA,cAAA,YAAOy2C,KAKN44B,EAAgBnjE,IACzB,MAAM,QACFxL,EAAO,MACP46B,EAAK,QACLn7B,EAAO,cACPC,EAAa,cACbkvE,EAAa,QACbxB,EAAO,SACPC,EAAQ,0BACRY,EAAyB,uBACzBY,EAAsB,wBACtBX,GACA1iE,EAEJ,IAAKxL,EACD,OAAO,KAGX,MAAM,SAAEmI,EAAQ,KAAE2P,EAAI,gBAAEiP,EAAe,WAAEulB,GAAetsC,EACxD,GAAIA,EAAQmI,SAAU,CAAC,IAAD+6D,EAClB,MAAME,GAAgB/U,EAAAA,EAAAA,qBAClBruD,EAAQumD,OACR9mD,EAAQgX,cAAcmH,eAAepO,YAClB,QAD6B0zD,EAChDzjE,EAAQgQ,QAAQ+M,WAAG,IAAA0mD,GAAQ,QAARA,EAAnBA,EAAqB3oD,cAAM,IAAA2oD,OAAA,EAA3BA,EAA6B5nB,kBAE3B10B,EA/LeliB,CAAAA,IACzB,IAAKyyC,EAAAA,GAAiBl1B,UAClB,MAAO,GAGX,MAAMzH,EAAU,IAAIsrC,IAAIphD,EAAMkiB,WAAY/I,OAAO6kB,SAAStjC,MAC1D,IAAK,MAAMksC,KAAqC,QAA5BwjC,EAAIpqE,EAAM1E,QAAQssC,kBAAU,IAAAwiC,EAAAA,EAAI,GAAI,CAAC,IAADA,EAAA7/B,EACpD,MAAMrI,EAAyC,QAA3BqI,EAAG3D,EAAU7E,sBAAc,IAAAwI,OAAA,EAAxBA,EAA0BlI,MACjD,IAAKr4B,EAAAA,iBAAiBC,mBAAmBi4B,GAAiB,CACtD,MAAMof,GAAgB1d,EAAAA,EAAAA,6CAA4CgD,EAAUrF,oBAC5EzrB,EAAQyrC,aAAa16C,IAAIy6C,EAAepf,IAGhD,OAAOpsB,EAAQpb,MAkLQ2vE,CAAoBvjE,GACvC,MAAO,CACHtL,IAAK,GAAGiI,SACRulD,aACI3mC,GAAmBjP,GAAQ61C,EAAoBluD,EAASO,EAAQ8X,KAAOiP,EAAiBq8C,EAAe1jE,GAC3GkuD,YAAaigB,EAAkBriE,EAAOob,GACtCiL,kBAAmBya,GAAc0iC,EAAyBxjE,GAC1DqvB,aAAcD,GAASq0C,EAAazjE,GACpC0jE,qBAAsBlvE,EAAQu1B,sBAAwBm5C,EAAoBjvE,EAASO,EAAQu1B,sBAC3F45C,kBAAmBN,EAAyBjoD,OAAarkB,EACzD6sE,iBAAkBP,EAAyBrB,EAAiBhiE,QAASjJ,EACrE44C,YAAa0zB,GAA0B/2D,IA1HxBqjC,EA0HkDrjC,EAzHlExY,EAAAA,cAAA,OAAKH,UAAU,oCAAoCg8C,IA2HlDk0B,gBAAiB/vE,EAAAA,cAAC8uE,EAAoC/mE,OAAAC,OAAA,GAAKkE,IAC3D8jE,qBAAsBtB,EAAgCC,EAA2BC,GACjFqB,aAAcjwE,EAAAA,cAACivE,EAA6ClnE,OAAAC,OAAA,GAAKkE,IACjEgkE,qBAAsBZ,GAClBA,EAAc57D,QACd47D,EAAc7tD,YAAc5Y,GAC5BymE,EAAcxB,UAAYA,GACtB9tE,EAAAA,cAAA,OAAKH,UAAU,qCACXG,EAAAA,cAACqzB,EAAAA,MAAK,CAAC7J,MAAO8lD,EAAcp9C,gBAAiBxe,OAAQ47D,EAAc57D,OAAQC,OAAQo6D,EAASpL,WACxF3iE,EAAAA,cAAA,YAAOsvE,EAAca,gBArItBt0B,IAAAA,EA2IvB,OAAO,MAGLwS,EAAsBA,CACxBluD,EACA4oB,EACAq4B,EACA0iB,EACA1jE,KAEA,MAAM+tC,EAAuC,CACzCzS,UAAW,CACPzW,GAAI,CAAE7M,EAAG,kBAAmB8M,EAAG,EAAGyW,EAAG,GACrCtW,GAAI,CAAEjN,EAAG,kBAAmB8M,EAAG,EAAGyW,EAAG,GACrCC,GAAI,CAAExjB,EAAG,kBAAmB8M,EAAG,EAAGyW,EAAG,IAEzCE,UAAU,EACV4hB,iBAAiB,GAOrB,OAJIr9C,IACAA,EAAcq9C,iBAAkB,GAGhC2D,EAEIphD,EAAAA,cAACqhD,EAAAA,GAAK,CACF/iC,eAAgBne,EAAQgX,cAAcmH,eACtCze,UAAU,mCACV68C,QAAS3zB,EACTtQ,MAAOsQ,EACPyzB,IAAK4E,EACL0N,YAAagV,EACb9+C,aAAc7kB,EAAQgQ,QAAQ6U,aAC9B5kB,cAAeA,GAAiB+tC,EAChCmT,oBAAoB,UAIzB,MAGLquB,EAAgBvqE,IAClB,MAAM,MAAEk2B,EAAK,QAAEn7B,EAAO,SAAEI,EAAQ,eAAEmO,EAAc,UAAErO,GAAc+E,EAEhE,OAAIk2B,EAEIt7B,EAAAA,cAAC+8B,EAAAA,eAAc,CACX57B,GAAIZ,EACJa,SAAUsN,EACVrN,KAAM,CAAEi6B,MAAAA,GACRz7B,UAAU,mCACViB,cAAeT,EAAUS,cACzBE,kBAAmBX,EAAUW,kBAC7BC,iBAAkBZ,EAAUY,iBAC5Bd,QAASA,IAId,MAGLuvE,EAA4BtqE,IAC9B,MAAM,QAAE1E,EAAO,UAAEL,GAAc+E,EAE/B,OAAK1E,GAAYA,EAAQssC,WAIlBtsC,EAAQssC,WAAWvsC,KAAI,CAACurC,EAAWrrC,KACtC,IAAKqrC,EAAU7E,iBAAmB6E,EAAU7E,eAAeM,MACvD,OAGJ,IAAI3f,EAAO,GAEX,OAAQkkB,EAAUrF,oBACd,KAAK,EACD7e,EAAOznB,EAAUqmB,0BACjB,MAEJ,KAAK,EACDoB,EAAOznB,EAAUsmB,yBACjB,MAEJ,KAAK,EACDmB,EAAOznB,EAAUumB,0BACjB,MAEJ,QACI,OAGR,OACI5mB,EAAAA,cAAC4tE,EAAqB,CAClBhtE,IAAK,GAAGF,EAAQmI,uBAAuBlI,IACvCd,UAAU,iDACViP,cAAegZ,EACfwf,eAAgB0E,EAAU7E,eAAeM,WAhC1C,IC3WF2oC,EAAyEzwE,IAAmC,IAAlC,UAAEE,EAAS,UAAEwwE,EAAS,KAAEzwE,GAAMD,EACjH,OAAQ0wE,GACJ,IAAK,QACD,OAAOrwE,EAAAA,cAAA,KAAGH,UAAWqP,GAAAA,CAAW,mCAAoCrP,IAAaD,GACrF,IAAK,SACD,OAAOI,EAAAA,cAAA,KAAGH,UAAWqP,GAAAA,CAAW,oCAAqCrP,IAAaD,GACtF,IAAK,UACL,QACI,OAAOI,EAAAA,cAAA,KAAGH,UAAWA,EAAY,4CAA8C,sCAAuCD,0kBCwClI,IAAM0wE,EAAN,cAA4BtwE,EAAAA,UAExBmF,YAAYC,GACRC,MAAMD,GAuGH,KAAAmrE,oBAAuBjmE,GAA0C9E,KAAKJ,MAAM6V,OAAO8N,QAASnpB,KAAO0K,EAAMsG,OAAOvI,MAyEtG,KAAAk6D,WAAa,KAC1B/8D,KAAKmF,SAAS,CACV+I,QAAQ,KAIC,KAAAojD,eAAkB/tC,IAC/B,GAAKA,EAGL,OACI/oB,EAAAA,cAAC0iB,EAAAA,GAAa,CACV7iB,UAAU,6BACV2Z,IAAKuP,EAAQvP,KAAO,KACpB5Z,KAAMmpB,EAAQnpB,KACd0hE,UAAW,CAAEQ,OAAQt8D,KAAK+qE,oBAAqBjyD,eAAgB9Y,KAAKJ,MAAMjF,QAAQgQ,YAK7E,KAAAqgE,eAAiBh6D,MAAO9V,EAAwBotE,KAC7D,MAAM,QAAE3tE,EAAO,KAAEkB,EAAI,UAAEhB,EAAS,UAAEgE,GAAcmB,KAAKJ,OAC/C,KAAE2iB,EAAI,oBAAEwO,GAAwBl1B,GAChC,0BAAEovE,EAAyB,0BAAEjmC,EAAyB,0BAAEkmC,GAA8BrwE,EAEtFswE,EAA8BnrE,KAAKorE,qBAAqB,CAAEC,eAAgBnwE,GAAW61B,EAAoB9xB,QAE/G,GAAItE,GACI4nB,EAAKtjB,OAAQ,CAAC,IAAD4+C,EAAAytB,EAAA92B,EAEb,MAAMvf,EAA+E,QAA1D4oB,EAAG79C,KAAKJ,MAAMjF,QAAQgX,cAAcmH,eAAeoc,eAAO,IAAA2oB,OAAA,EAAvDA,EAAyD1oB,sBAEjFN,QAAwB02C,EAAAA,EAAAA,yBAC1B,CACI1tD,cAAe7d,KAAKJ,MAAMjF,QAAQgX,cAClC65D,oBAAqBC,EAAAA,yBAAyBC,qCAAqC1rE,KAAKJ,MAAMjF,QAAQgX,gBAE1G,CAACzW,EAAQmI,WAEPsoE,EAAmB3rE,KAAK4rE,+BACxBv4C,EAAWrzB,KAAK6rE,yBAA4D,QAArCP,EAAGpwE,MAAAA,GAAiB,QAAVs5C,EAAPt5C,EAASu5C,gBAAQ,IAAAD,OAAA,EAAjBA,EAAmBE,uBAAe,IAAA42B,EAAAA,EAAQ,EAEpFQ,EAAwB,CAC1B5wE,QAAAA,EACAmY,MAAOggB,EACPiN,iBAAkB3lC,EAAQ+c,IAAIjC,OAAO6qB,iBACrCyrC,kBAAmBZ,EACbA,EAA4Bx3C,yBAAyBkS,kBACrD,EACN2Y,qBAAsB,CAAEmtB,iBAAkBA,GAC1C90C,6BACIjlB,EAAAA,gBAAgBC,YAAYgjB,IAC5BjjB,EAAAA,gBAAgBC,YAAYgjB,EAAgB,GAAGS,kBAC/CT,EAAgB,GAAGS,gBAAgB,GAAGC,OAASN,GAGvD1S,EAAKtjB,OACAkpC,iBAAiB2jC,GACjB/wD,MAAK/J,MAAAA,IACF,GAAsB,YAAlB/R,EAAOy1B,OACP10B,KAAKmF,SAAS,CACV8W,UAAW/gB,EAAQmI,SACnBilE,QAAAA,EACAqC,YAAaM,EACbv+C,gBAAiB,UACjBC,aAAc,eACdze,QAAQ,SAET,GAAyB,gBAArBjP,EAAOuyB,UAA6B,CAAC,IAADw6C,EAC3C,MAAMC,GACe,QAAjBD,SAAOzpD,GAAMA,YAAI,IAAAypD,GAAW,QAAXA,EAAjBA,EAAmBvpD,iBAAS,IAAAupD,GAAmD,QAAnDA,EAA5BA,EAA8BzvE,MAAKmQ,GAAQA,EAAKsP,YAAc9gB,EAAQmI,kBAAS,IAAA2oE,OAAA,EAA/EA,EAAiF7oD,WAAY,EAC3F+oD,EAA4BlsE,KAAKmsE,0BAA0BhB,EAA6Bc,GAE9FjsE,KAAKmF,SAAS,CACV8W,UAAW/gB,EAAQmI,SACnBilE,QAAAA,EACAqC,YAAauB,EACbx/C,gBAAiB,SACjBC,aAAc,8BACdze,QAAQ,SAET,GAAyB,mBAArBjP,EAAOuyB,WAAkCm6C,EAAkB,CAAC,IAADS,EAClE,MAAMF,EAA+C,QAAtBE,EAAGntE,EAAOqnC,oBAAY,IAAA8lC,OAAA,EAAnBA,EAAqBjmC,iBAEvDnmC,KAAKmF,SAAS,CACV8W,UAAW/gB,EAAQmI,SACnBilE,QAAAA,EACAqC,YAAauB,GAA6BlnC,EAC1CtY,gBAAiB,SACjBC,aAAc,8BACdze,QAAQ,SAET,GAAyB,kBAArBjP,EAAOuyB,UAA+B,CAAC,IAAD66C,EAC7CrsE,KAAKmF,SAAS,CACV8W,UAAW/gB,EAAQmI,SACnBilE,QAAAA,EACAqC,aAAgC,QAAnB0B,EAAAptE,EAAOqnC,oBAAY,IAAA+lC,OAAA,EAAnBA,EAAqBlmC,mBAAoB+kC,EACtDx+C,gBAAiB,SACjBC,aAAc,8BACdze,QAAQ,SAGZlO,KAAKJ,MAAMf,UAAUsqC,MAAM,iEAC3BnpC,KAAKmF,SAAS,CACV8W,UAAW/gB,EAAQmI,SACnBilE,QAAAA,EACAqC,YAAa3lC,EACbtY,gBAAiB,SACjBC,aAAc,8BACdze,QAAQ,OAInB+6B,OAAMrnC,IACH/C,EAAUY,QAAQmC,GAClB/C,EAAUsqC,MAAM,uEAChBnpC,KAAKmF,SAAS,CACV8W,UAAW/gB,EAAQmI,SACnBilE,QAAAA,EACAqC,YAAa3lC,EACbtY,gBAAiB,SACjBC,aAAc,8BACdze,QAAQ,SAOxB,KAAA09D,6BAA+B,KAAc,IAAAp9B,EACjD,MAAM89B,GACiC,QAAnC99B,EAAAxuC,KAAKJ,MAAM/D,KAAKuyB,aAAanvB,cAAM,IAAAuvC,GAElC,QAFkCA,EAAnCA,EAAqCjyC,MACjC6xB,GAAsC,wEAAtBA,EAAapb,cAChC,IAAAw7B,OAAA,EAFDA,EAEGlgB,aAAa,EAGpB,OAD4CtuB,KAAK02B,uCACH41C,GAG1C,KAAAT,sBAAwB,KAAc,IAAAz7B,EAAAC,EAC1C,MAAM3Z,EAAsC12B,KAAK02B,sCAC3C61C,EAAsG,QAAjFn8B,EAAoC,QAApCC,EAAGrwC,KAAKJ,MAAM/D,KAAK+jC,yBAAiB,IAAAyQ,GAAQ,QAARA,EAAjCA,EAAmCpxC,cAAM,IAAAoxC,OAAA,EAAzCA,EAA2CK,2CAAmC,IAAAN,GAAAA,EAC5G,OAAO1Z,GAAuC61C,GAG1C,KAAA71C,oCAAsC,KAAc,IAAAwZ,EAAAC,EAMxD,MAJuC,QAAnCD,EAAAlwC,KAAKJ,MAAM/D,KAAKuyB,aAAanvB,cAAM,IAAAixC,GAElC,QAFkCA,EAAnCA,EAAqC3zC,MACjC6xB,GAAsC,oEAAtBA,EAAapb,cAChC,IAAAk9B,OAAA,EAFDA,EAEG5hB,aAAa,GAGhB,OAAO,EAOX,GAJkE,QAAtC6hB,EAAGnwC,KAAKJ,MAAM/D,KAAKuyB,aAAanvB,cAAM,IAAAkxC,GAEjE,QAFiEA,EAAnCA,EAAqC5zC,MAChE6xB,GAAsC,mDAAtBA,EAAapb,cAChC,IAAAm9B,OAAA,EAF8BA,EAE5B7hB,UAEyB,CAAC,IAAD8mB,EAAAj7C,EACxB,MAAMklC,EAA4D,QAArB+V,EAAGp1C,KAAKJ,MAAMjF,eAAO,IAAAy6C,GAAS,QAATA,EAAlBA,EAAoBzqC,eAAO,IAAAyqC,GAAK,QAALA,EAA3BA,EAA6B19B,WAAG,IAAA09B,GAAU,QAAVA,EAAhCA,EAAkC9V,gBAAQ,IAAA8V,OAAA,EAA1CA,EAA4C7V,iCAEtFC,EAAex/B,KAAKJ,MAAM/D,KAAK8yB,oBAAoB1vB,OASzD,MANgD,QAA5CogC,GAGmF,QAHlCllC,EAC/CqlC,IACgD,QAA5CH,GAAqDG,EAAaC,OACnB,QAA5CJ,IAAsDG,EAAaC,cAAO,IAAAtlC,GAAAA,EAIpF,CAAC,IAADqyE,EAAA7sC,EACH,MAAMC,EAAqD,QAApC4sC,EAAGxsE,KAAKJ,MAAM/D,KAAK+jC,yBAAiB,IAAA4sC,OAAA,EAAjCA,EAAmCvtE,OAC7D,QAA+C,QAAxC0gC,EAAEC,MAAAA,OAAiB,EAAjBA,EAAmBC,2BAAmB,IAAAF,GAAAA,KAItC,KAAA8sC,wBAA2BxwD,IACxC,MAAM,QAAEthB,EAAO,KAAEkB,EAAI,UAAEgD,GAAcmB,KAAKJ,OACpC,UAAE47B,GAAc3/B,EACtB,IAAI6wE,EAAoD,GACxD,GAAI/xE,GAAWA,EAAQgX,cAAe,CAClC,MAAMg7D,EAAYhyE,EAAQgQ,QAAQs7D,KAAKC,iBAAmBvrE,EAAQgQ,QAAQs7D,KAAK2G,MACzEC,EAAiB7sE,KAAK8sE,gCAAgC7wD,GACxD0wD,GAAanxC,EAAUv8B,QAAUu8B,EAAUv8B,OAAO,IAAM4tE,GACxDE,EAAAA,EAAAA,IAAiB,CAAElvD,cAAeljB,EAAQgX,eAAiB6pB,EAAUv8B,OAAO,GAAG+tE,GAAI,CAAC,CAAE7qD,OAAQ0qD,KACzF9xD,MAAKkyD,IACF,MAAMC,EAAwCD,EAE1CC,GAAoBA,EAAiBF,IAAMryE,EAAQgQ,QAAQs7D,KAAKC,kBAChEwG,EAAoB1sE,KAAKmtE,2BAA2BD,GAChDR,GAAqBA,EAAkBjgE,OAAS,EAChDzM,KAAKotE,2BAA2BV,IAEhC/xE,EAAQgX,cAAc07D,QAAOC,EAAAA,EAAAA,IAAyB,GAAI,MAAO,CAACJ,KAClEK,EAAAA,EAAAA,SAAoB,IAAIC,EAAAA,oBAAuB7yE,EAAQgX,eAClDoJ,MAAKrgB,IACF,MAAM+yE,EAA2C/yE,EAC7C+yE,GAAsBA,EAAmBhhE,OAAS,IAClDzM,KAAKmF,SAAS,CAAEuoE,SAAS,IACzB/yE,EAAQgX,cAAc07D,OAAO,IAAIG,EAAAA,oBAAuBC,OAG/DxkC,OAAMrnC,IACH/C,EAAUY,QAAQ,6EAClBZ,EAAU+C,MAAMA,WAKnCqnC,OAAMrnC,IACH/C,EAAUY,QAAQ,0DAClBZ,EAAU+C,MAAMA,MAGxB/C,EAAUY,QAAQ,kGAoCb,KAAAkuE,gBAAmBzyE,IAChC,MAAM,oBAAE61B,GAAwB/wB,KAAKJ,MAAM/D,KAC3C,GAAIk1B,GAAuBA,EAAoB9xB,OAAQ,CACnD,MAAMksE,EAA8BnrE,KAAKorE,qBAAqBlwE,EAAS61B,EAAoB9xB,QAC3F,GAAIksE,EACA,OAAOA,EAA4Bz7C,kBAO9B,KAAAk+C,oBAAuB1yE,IACpC,MAAM,oBAAE61B,GAAwB/wB,KAAKJ,MAAM/D,KAC3C,GAAIk1B,GAAuBA,EAAoB9xB,OAAQ,CACnD,MAAMksE,EAA8BnrE,KAAKorE,qBAAqBlwE,EAAS61B,EAAoB9xB,QAC3F,GAAIksE,GAA+BA,EAA4B17C,eAC3D,MAAO,sBAAsB07C,EAA4B17C,eAAe7S,kBAOnE,KAAAixD,kBAAqB3yE,IAClC,MAAM,KAAEW,EAAI,QAAElB,GAAYqF,KAAKJ,OACzB,oBAAEmxB,GAAwBl1B,EAEhC,IAAKlB,EAAQ+c,IAAIjC,OAAO6qB,iBACpB,OAAO,EAGX,IAAKvP,EAAoB9xB,SAAW/D,EAAQmwE,eACxC,OAAO,EAGX,IAAK,MAAMpuB,KAAiBlsB,EAAoB9xB,OAC5C,GACIg+C,EAActpB,0BACdspB,EAActpB,yBAAyB3X,WACvCihC,EAActpB,yBAAyB3X,YAAc9gB,EAAQmwE,eAAehoE,SAE5E,OAAO45C,EAAcjS,mBAI7B,OAAO,GAGM,KAAA8hC,gCAAmC7wD,IAChD,MAAM,UAAEuf,GAAcx7B,KAAKJ,MAAM/D,KAEjC,IACK2/B,EAAUv8B,QACiB,IAA5Bu8B,EAAUv8B,OAAOwN,SAChB+uB,EAAUv8B,OAAO,GAAG6uE,mBAC4B,IAAjDtyC,EAAUv8B,OAAO,GAAG6uE,kBAAkBrhE,OAGtC,OADAzM,KAAKJ,MAAMf,UAAU+C,MAAM,kDACpB,KAGX,MAAMmsE,EAAoBvyC,EAAUv8B,OAAO,GAAG6uE,kBAAkB92D,QAAOg3D,GAC5DA,EAAiBhyD,YAAcC,IAG1C,OAAI8xD,GAAqBA,EAAkB,GAAG5rD,OACnC4rD,EAAkB,GAAG5rD,OAEzB,MAGM,KAAAgrD,2BAA8BD,IAAkE,IAAAe,EAC7G,MAAMC,EAAgD,GAUtD,OATkC,QAAlCD,EAAAf,EAAiBY,yBAAiB,IAAAG,GAAlCA,EAAoChzE,KAAIkzE,IACpC,MAAM,SAAEzzE,GAAasF,KAAKJ,MAAM/D,KAIN,KAHLnB,GAAaA,EAAwCuE,QAE1C+X,QAAO9b,GAAWA,EAAQmwE,eAAehoE,WAAa8qE,EAAKnyD,YAC5EvP,SACXyhE,MAAAA,GAAAA,EAAerwE,KAAK,CAAEskB,OAAQgsD,EAAKhsD,aAGpC+rD,GAGM,KAAAd,2BAA8BV,IAC3C,MAAM,QAAE/xE,EAAO,KAAEkB,EAAI,UAAEgD,GAAcmB,KAAKJ,OACpC,UAAE47B,GAAc3/B,EACtB,GAAIlB,GAAWA,EAAQgX,cAAe,CAChBhX,EAAQgQ,QAAQs7D,KAAKC,iBAAmBvrE,EAAQgQ,QAAQs7D,KAAK2G,OAC9DpxC,EAAUv8B,QAAUu8B,EAAUv8B,OAAO,IAClD8tE,EAAAA,EAAAA,IAAiB,CAAElvD,cAAeljB,EAAQgX,eAAiB6pB,EAAUv8B,OAAO,GAAG+tE,GAAIN,GAC9E3xD,MAAKkyD,IACF,MAAMC,EAAwCD,EAC1CC,GAAoBA,EAAiBF,IAAMryE,EAAQgQ,QAAQs7D,KAAKC,kBAChEvrE,EAAQgX,cAAc07D,QAAOC,EAAAA,EAAAA,IAAyB,GAAI,MAAO,CAACJ,KAClEK,EAAAA,EAAAA,SAAoB,IAAIC,EAAAA,oBAAuB7yE,EAAQgX,eAClDoJ,MAAKrgB,IACF,MAAM+yE,EAA2C/yE,EAC7C+yE,GAAsBA,EAAmBhhE,OAAS,IAClDzM,KAAKmF,SAAS,CAAEuoE,SAAS,IACzB/yE,EAAQgX,cAAc07D,OAAO,IAAIG,EAAAA,oBAAuBC,OAG/DxkC,OAAMrnC,IACH/C,EAAUY,QAAQ,6EAClBZ,EAAU+C,MAAMA,UAI/BqnC,OAAMrnC,IACH/C,EAAUY,QAAQ,0DAClBZ,EAAU+C,MAAMA,MAGxB/C,EAAUY,QAAQ,kGA/hB1BO,KAAK0wB,kBAAmBqE,EAAAA,EAAAA,oBACpB/0B,KAAKJ,MAAMjF,QAAQgQ,QAAQqqB,kBAC3Bh1B,KAAKJ,MAAMgpC,aACX5oC,KAAKJ,MAAMf,WAIZ,0BACHmB,KAAKmF,SAAS,CAAEuoE,SAAS,IAGtBxuB,sBAAsBC,EAAoDC,GAC7E,OAAIp/C,KAAKc,QAAUs+C,GAAap/C,KAAKJ,MAAM/D,OAASsjD,EAAUtjD,KAM3D0F,SACH,MAAM,QAAEgiB,EAAO,UAAElpB,GAAc2F,KAAKJ,MAAM6V,QACpC,kBAAE24D,EAAiB,6BAAEC,EAA4B,8BAAEC,GAAkCtuE,KAAKJ,MAAM/E,WAChG,KAAE0nB,EAAI,oBAAEwO,EAAmB,UAAEyK,EAAS,SAAE9gC,GAAasF,KAAKJ,MAAM/D,KAEtE,GAAoB,YAAhB0mB,EAAKmS,QAAuD,YAA/B3D,EAAoB2D,QAA6C,YAArB8G,EAAU9G,OAAsB,CACzG,MAAM65C,EAAU/wE,EAAAA,EAAA,GACRwC,KAAKJ,OAAiD,IAC1DkrE,cAAe,CACXrsD,YAAaze,KAAKJ,MAClBvF,UAAWqP,GAAAA,CAAW,oBAAqBrP,IAE/Cq6B,OAAQ,UAER85C,cAAeh0E,EAAAA,cAACowE,EAA0B,CAACC,UAAU,UAAUzwE,KAAK,eACpEmpB,QAASvjB,KAAKsxD,eAAe/tC,KAEjC,OAAOvjB,KAAKJ,MAAMyf,WAAWkvD,GAGjC,GAAoB,WAAhBhsD,EAAKmS,QAAsD,WAA/B3D,EAAoB2D,QAA4C,WAArB8G,EAAU9G,OAAqB,CACtG,MAAM65C,EAAU/wE,EAAAA,EAAA,GACRwC,KAAKJ,OAAiD,IAC1DkrE,cAAe,CACXrsD,YAAaze,KAAKJ,MAClBvF,UAAWqP,GAAAA,CAAW,oBAAqBrP,IAE/Cq6B,OAAQ,SACR85C,cAAeh0E,EAAAA,cAACowE,EAA0B,CAACC,UAAU,SAASzwE,KAAMi0E,IACpE9qD,QAASvjB,KAAKsxD,eAAe/tC,KAGjC,OAAOvjB,KAAKJ,MAAMyf,WAAWkvD,GAGjC,MAAMp9D,EAAezW,GAAaA,EAAwCuE,OAE1E,GAAIkS,GAAwC,IAAxBA,EAAa1E,OAAc,CAC3C,MAAMgiE,EAAcjxE,EAAAA,EAAA,GACZwC,KAAKJ,OAAiD,IAC1DkrE,cAAe,CACXrsD,YAAaze,KAAKJ,MAClBvF,UAAWqP,GAAAA,CAAW,oBAAqBrP,IAE/Cq6B,OAAQ,QACR85C,cAAeh0E,EAAAA,cAACowE,EAA0B,CAACC,UAAU,QAAQzwE,KAAMg0E,IACnE7qD,QAASvjB,KAAKsxD,eAAe/tC,KAGjC,OAAOvjB,KAAKJ,MAAMyf,WAAWovD,GAGjC,MAAMxhD,EAASzvB,EAAAA,EAAA,GACPwC,KAAKJ,OAAiD,IAC1DkrE,cAAe,CACXrsD,YAAaze,KAAKJ,MAClBvF,UAAWqP,GAAAA,CAAW,oBAAqBrP,IAE/Cq6B,OAAQ,UACRnR,QAASvjB,KAAKsxD,eAAe/tC,GAC7BmrD,SAAU,CACNr0E,UAAW,8BACX2Z,IAAK,MAET26D,QAAS,CACLt0E,UAAW,6BACX2Z,IAAK,MAETq3D,eAAgB,CACZhxE,UAAW,kCACX2Z,IAAK,KAET0c,iBAAkB1wB,KAAK0wB,iBACvBk+C,kBAAmB,CACfv0E,UAAW,yCAEfK,SAAUyW,GAAgBnR,KAAK6uE,mBAAmB19D,GAClD29D,uBACI39D,GAAgBnR,KAAK+uE,qBAAqB59D,EAAci9D,EAAmBE,KAGnF,OAAOtuE,KAAKJ,MAAMyf,WAAW4N,GAKzB8hD,qBAAqBr0E,EAAyBs0E,EAAmBC,GACrE,OAAIjvE,KAAKc,OAASd,KAAKc,MAAM4sE,QACD,IAApBhzE,EAAS+R,OACFjS,EAAAA,cAACowE,EAA0B,CAACC,UAAU,UAAUzwE,KAAM40E,IAG7Dx0E,EAAAA,cAACowE,EAA0B,CACvBvwE,UAAW,4CACXwwE,UAAU,UACVzwE,KAAM60E,IAIX,KAEHJ,mBAAmBn0E,GACvB,MAAM,UACFa,EAAS,kBACTC,EAAiB,iBACjBC,EAAgB,oBAChByzE,EAAmB,eACnBt5C,EAAc,iBACdu5C,EAAgB,0BAChBjuD,EAAyB,yBACzBC,EAAwB,0BACxBC,EAAyB,2BACzBsuB,GACA1vC,KAAKJ,MAAM/E,WACT,QAAEF,EAAO,UAAEkE,GAAcmB,KAAKJ,OAC9B,cAAEhF,EAAa,uBAAEmvE,GAA2B/pE,KAAKJ,MAAM6V,OAE7D,OAAO/a,EAASO,KAAI,CAACC,EAAsBC,KACvC,MAAMi0E,EAAsB,CACxBl0E,QAASA,EAAQmwE,eACjBv1C,MAAO56B,EAAQm0E,aACf10E,QAAAA,EACAmvE,cAAe9pE,KAAKc,MACpBghB,YAAYC,EAAAA,EAAAA,mBAAkB7mB,EAAQmwE,eAAgB1wE,EAAQgX,mBAAelU,GAC7E7C,cAAAA,EACA8uE,uBAAwByF,EACxB5F,UAAWvpE,KAAK6tE,kBAAkB3yE,GAClCy6B,cAAeu5C,EACft5C,eAAAA,EACAz6B,MAAAA,EACAmtE,QAAS,GAAGptE,EAAQmwE,eAAehoE,YAAYnI,EAAQmwE,eAAe5pB,UAAUtmD,IAChF0D,UAAAA,EACA9D,SAAUiF,KAAKJ,MAAMjE,GACrBuN,eAAgBlJ,KAAKJ,MAAMhE,SAC3BmuE,uBAAAA,EACAZ,0BAA2BnpE,KAAK2tE,gBAAgBzyE,GAChDkuE,wBAAyBppE,KAAK4tE,oBAAoB1yE,GAClDw1B,iBAAkB1wB,KAAK0wB,iBACvB63C,SAAU,CACNC,YAAaxoE,KAAKgrE,eAClBvC,aAAczoE,KAAKysE,wBACnBtP,UAAWn9D,KAAK+8D,YAEpBliE,UAAW,CACPqmB,0BAAAA,EACAC,yBAAAA,EACAC,0BAA2BlmB,EAAQmwE,eAAeh5C,WAAaqd,EAA6BtuB,EAC5F9lB,cAAeC,EACfC,kBAAAA,EACAC,iBAAAA,IAGR,OAAOouE,EAAauF,MAkOpBjD,0BAA0BjxE,EAAmD+wE,GACjF,MAAM,QAAEtxE,EAAO,UAAEE,GAAcmF,KAAKJ,OAC9B,qBAAEmmC,GAAyBlrC,EAE3By0E,GAAyBx6B,EAAAA,EAAAA,kCAAiCn6C,EAAQ+c,IAAIjC,OAAOkwB,4BAEnF,IAAKzqC,IAAYA,EAAQy4B,yBAAyBkS,oBAAsBlrC,EAAQ+c,IAAIjC,OAAO6qB,iBACvF,OAAOyF,EACF/jC,QAAQ,gBAAiBstE,EAAuBrjE,YAChDjK,QAAQ,gBAAiBiqE,EAAYhgE,YAG9C,MAAMsjE,EAAe1zD,KAAK3Y,IAAIosE,EAAwBp0E,EAAQy4B,yBAAyBkS,mBAEvF,OAAOE,EAAqB/jC,QAAQ,gBAAiButE,EAAatjE,YAAYjK,QAAQ,gBAAiBiqE,EAAYhgE,YAG/Gm/D,qBACJlwE,EACAs0E,GAEA,GAAIA,GAA8BA,EAA2B/iE,OAAS,EAClE,IAAK,MAAMwwC,KAAiBuyB,EACxB,GAAIt0E,EAAQmwE,eAAehoE,WAAa45C,EAActpB,yBAAyB3X,UAC3E,OAAOihC,IAxarB6tB,GAAaxjE,EAAAA,EAAAA,IAAA,CADlBE,EAAAA,IACKsjE,GAyiBN,oHCtlBA,MAgCM2E,EAAcA,CAChBv0E,EACAyzE,EACAC,EACAvD,EACA36C,KAEA,MAAM,IACFt1B,EAAG,aACHwtD,EAAY,YACZE,EAAW,aACX/yB,EAAY,kBACZhJ,EAAiB,gBACjBw9C,EAAe,aACfE,EAAY,qBACZC,EAAoB,kBACpBL,EAAiB,YACjBh0B,EAAW,iBACXi0B,EAAgB,qBAChBE,EAAoB,qBACpBJ,GACAlvE,EACEkiC,GAAUC,EAAAA,EAAAA,kBAAiB,QAAS3M,EAAmB,GAAIt1B,GAC3D4tE,GAAoBzrC,EAAAA,EAAAA,wBAAuB7M,EAAmB0M,GACpE,OAAIitC,EAEI7vE,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,CAACpH,IAAKA,EAAKf,UAAWs0E,EAASt0E,WAAes0E,GAC/Cn0E,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,CACDlI,KAAM+vE,EACNhwE,UAAWqP,GAAAA,CAAW,uBAAwB2hE,EAAgBhxE,YAC1D2uE,EAAiB,cACTsB,EACZt2D,IAAKq3D,EAAgBr3D,MAEpB40C,EACAvS,EACAtpB,GAAqB6hD,GAClBp0E,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKosE,GACL7hD,EAAkB9xB,KAAIurC,GACZA,KAIlBzQ,EACAq0C,GAEJI,EACAD,EACAE,EACAC,GAKTlwE,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,CAACpH,IAAKA,EAAKf,UAAWs0E,EAASt0E,WAAes0E,GAC9C/lB,EACAE,EACA/7B,GAAqB6hD,GAClBp0E,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKosE,GACL7hD,EAAkB9xB,KAAIurC,GACZA,KAIlBzQ,EACAw0C,EACAE,EACAC,IAKb,EAxG6D9qE,IACzD,MAAM,cACFkrE,EAAa,OACbp2C,EAAM,cACN85C,EAAa,QACbjrD,EAAO,SACPmrD,EAAQ,SACRh0E,EAAQ,QACRi0E,EAAO,eACPtD,EAAc,kBACduD,EAAiB,iBACjBl+C,EAAgB,uBAChBo+C,GACAlvE,EAEJ,OACIpF,EAAAA,cAACimB,EAAAA,OAAMle,OAAAC,OAAA,GAAKsoE,GACPvnD,EACAurD,EACW,YAAXp6C,GAAwB85C,EACxBE,GAAYh0E,GAAYA,EAAS+R,OAAS,GACvCjS,EAAAA,cAAC4lB,EAAAA,KAAI7d,OAAAC,OAAA,GAAKksE,GACLh0E,GACGA,EAASO,KAAIC,GACFA,GAAWu0E,EAAYv0E,EAASyzE,EAASC,EAAmBvD,EAAgB36C","sources":["webpack://Msdyn365.Commerce.Online/./src/modules/mands-search-result-container/components/link.tsx?d795","webpack://Msdyn365.Commerce.Online/./src/modules/mands-search-result-container/components/product-search-result-items.tsx?aca1","webpack://Msdyn365.Commerce.Online/./src/modules/mands-search-result-container/components/title.tsx?37ec","webpack://Msdyn365.Commerce.Online/./src/modules/mands-search-result-container/components/separator.tsx?4cd0","webpack://Msdyn365.Commerce.Online/./src/modules/mands-search-result-container/components/utilities.ts?e4a5","webpack://Msdyn365.Commerce.Online/./src/modules/mands-search-result-container/components/range-refine-item.tsx?14bc","webpack://Msdyn365.Commerce.Online/./src/modules/mands-search-result-container/components/refine-item.tsx?ecb3","webpack://Msdyn365.Commerce.Online/./src/modules/mands-search-result-container/components/choice-summary.tsx?abba","webpack://Msdyn365.Commerce.Online/./src/modules/mands-search-result-container/components/modal.tsx?91b3","webpack://Msdyn365.Commerce.Online/./src/modules/mands-search-result-container/components/refine-submenu.tsx?1d2c","webpack://Msdyn365.Commerce.Online/./src/modules/mands-search-result-container/components/error-message.tsx?30c2","webpack://Msdyn365.Commerce.Online/./src/modules/mands-search-result-container/mands-search-result-container.tsx?0bd5","webpack://Msdyn365.Commerce.Online/./src/modules/mands-search-result-container/mands-search-result-container.view.tsx?be23","webpack://Msdyn365.Commerce.Online/./src/themes/mands/views/custom-components/choice-summary.tsx?f9be","webpack://Msdyn365.Commerce.Online/./src/themes/mands/views/custom-components/get-line-items.tsx?b3f5","webpack://Msdyn365.Commerce.Online/./src/themes/mands/views/custom-components/range-refine-item.tsx?1fe0","webpack://Msdyn365.Commerce.Online/./src/themes/mands/views/custom-components/refine-item.tsx?da70","webpack://Msdyn365.Commerce.Online/./src/themes/mands/views/custom-components/refine-submenu.tsx?448b","webpack://Msdyn365.Commerce.Online/./src/themes/mands/views/custom-components/utilities.ts?239d","webpack://Msdyn365.Commerce.Online/./src/themes/mands/views/mands-search-result-container.view.tsx?c22c","webpack://Msdyn365.Commerce.Online/./src/themes/mands/views/order-confirmation.view.tsx?7470","webpack://Msdyn365.Commerce.Online/./src/themes/mands/views/search-result-container.view.tsx?97e1","webpack://Msdyn365.Commerce.Online/./src/modules/bulk-purchase/bulk-purchase.tsx?9fd5","webpack://Msdyn365.Commerce.Online/./src/common/buybox-components.tsx?42b4","webpack://Msdyn365.Commerce.Online/./src/common/buybox-product-configure.tsx?139c","webpack://Msdyn365.Commerce.Online/./src/common/buyboxInterface.ts?9d60","webpack://Msdyn365.Commerce.Online/./src/common/dropdown/dropdown.tsx?f1d3","webpack://Msdyn365.Commerce.Online/./src/common/dropdown/dropdown.props.ts?7676","webpack://Msdyn365.Commerce.Online/./src/common/utilities/error-utilities.ts?bb69","webpack://Msdyn365.Commerce.Online/./src/modules/buybox/components/buybox-find-in-store.tsx?3ef8","webpack://Msdyn365.Commerce.Online/./src/modules/buybox/buybox.tsx?e22d","webpack://Msdyn365.Commerce.Online/./src/modules/buybox/buybox.view.tsx?376b","webpack://Msdyn365.Commerce.Online/./src/modules/quickview/utilities/helper.ts?f31d","webpack://Msdyn365.Commerce.Online/./src/modules/quickview/utilities/get-valid-product-images.ts?78b7","webpack://Msdyn365.Commerce.Online/./src/modules/quickview/quickview.tsx?4080","webpack://Msdyn365.Commerce.Online/./src/modules/quickview/utilities/get-product-details.ts?5cc2","webpack://Msdyn365.Commerce.Online/./src/modules/quickview/quickview.view.tsx?ee5b","webpack://Msdyn365.Commerce.Online/./src/modules/recently-viewed/base/recently-viewed-product-item.ts?4982","webpack://Msdyn365.Commerce.Online/./src/modules/recently-viewed/base/recently-viewed-item.ts?54c9","webpack://Msdyn365.Commerce.Online/./src/modules/recently-viewed/recently-viewed-state.ts?c73b","webpack://Msdyn365.Commerce.Online/./src/modules/recently-viewed/recently-viewed-manager.ts?a2a8","webpack://Msdyn365.Commerce.Online/./src/modules/carousel/carousel.tsx?80d4","webpack://Msdyn365.Commerce.Online/./src/modules/carousel/carousel.view.tsx?d82f","webpack://Msdyn365.Commerce.Online/./src/modules/product-comparison-preview/product-comparison-preview.tsx?39f6","webpack://Msdyn365.Commerce.Online/./src/modules/product-comparison-preview/product-comparison-preview.view.tsx?28cb","webpack://Msdyn365.Commerce.Online/./src/modules/product-comparison/base/product-specification.tsx?75ed","webpack://Msdyn365.Commerce.Online/./src/modules/product-comparison/base/remove-from-comparison-button.tsx?1d8c","webpack://Msdyn365.Commerce.Online/./src/modules/product-comparison/product-comparison.tsx?4f74","webpack://Msdyn365.Commerce.Online/./src/modules/product-comparison/product-comparison.view.tsx?a0a9","webpack://Msdyn365.Commerce.Online/./src/modules/promo-banner/components/close-button.tsx?063b","webpack://Msdyn365.Commerce.Online/./src/modules/promo-banner/components/links.tsx?2587","webpack://Msdyn365.Commerce.Online/./src/modules/promo-banner/components/text.tsx?782b","webpack://Msdyn365.Commerce.Online/./src/modules/promo-banner/promo-banner.tsx?9ee9","webpack://Msdyn365.Commerce.Online/./src/modules/promo-banner/promo-banner.view.tsx?7f77","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/choice-summary.tsx?3f71","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/error-message.tsx?6302","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/feature-search-result-item.tsx?71fa","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/link.tsx?52c2","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/modal.tsx?d78e","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/product-search-result-items.tsx?5174","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/separator.tsx?4ea6","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/title.tsx?c269","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/range-refine-item.tsx?6288","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/refine-item.tsx?a594","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/refine-submenu.tsx?1292","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/utilities.ts?8569","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/search-result-container.tsx?7500","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/search-result-container.view.tsx?b779","webpack://Msdyn365.Commerce.Online/./src/modules/social-share-item/social-share-item.tsx?bbcb","webpack://Msdyn365.Commerce.Online/./src/modules/social-share-item/social-share-item.view.tsx?2d3e","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/components/wishlist-items-dimensions.tsx?15c5","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/components/wishlist-item.tsx?d2da","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/components/wishlist-items-status-message.tsx?cdb3","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/wishlist-items.tsx?df8b","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/wishlist-items.view.tsx?4d80"],"sourcesContent":["/*!\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 * as React from 'react';\r\ninterface ILink {\r\n className?: string;\r\n text?: string;\r\n href?: string;\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const Link: React.FC = ({ text, className, href, ariaLabel }) => (\r\n \r\n {' '}\r\n {text}{' '}\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 { ProductComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IImageSettings, ITelemetry } from '@msdyn365-commerce/core';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { IMandsSearchResultContainerResources } from '../mands-search-result-container.props.autogenerated';\r\n\r\ninterface IProductSearchResultItems {\r\n products: ProductSearchResult[];\r\n context: ICoreContext;\r\n resources: IMandsSearchResultContainerResources;\r\n telemetry: ITelemetry;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n productComparisonButton?: {} | null | undefined;\r\n}\r\n\r\nexport const ProductSearchResultItems: React.FC = ({\r\n products,\r\n context,\r\n imageSettings,\r\n resources,\r\n moduleType,\r\n moduleId,\r\n productComparisonButton\r\n}) => {\r\n return (\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 * as React from 'react';\r\ninterface ITitle {\r\n className: string;\r\n text: string;\r\n}\r\n\r\nexport const Title: React.FC = ({ text, className }) => {text} ;\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 * as React from 'react';\r\ninterface ISeparator {\r\n separator: string;\r\n}\r\n\r\nexport const Separator: React.FC = ({ separator }) => {separator} ;\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 { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n\r\n/**\r\n * Types of product refiner values\r\n */\r\nexport const enum ProductRefinerValueDataTypeValue {\r\n /**\r\n * Range slider is used for selections like price\r\n */\r\n Range = 1,\r\n\r\n /**\r\n * Range input is a different way to specify ranges and can be expressed with input boxes\r\n * as well as a set of discrete single-select type values\r\n */\r\n RangeInput = 4,\r\n\r\n /**\r\n * This is a discrete list item, either multi-select or single-select\r\n */\r\n List = 5,\r\n\r\n /**\r\n * Boolean types allows only single-select\r\n */\r\n Boolean = 6\r\n}\r\n\r\n/**\r\n * Types of product refiners\r\n */\r\nexport const enum ProductRefinerTypeValue {\r\n /**\r\n * Refiner values are single-select\r\n */\r\n Single = 0,\r\n\r\n /**\r\n * Refiner values are multi-select\r\n */\r\n Multi = 1\r\n}\r\n\r\n/**\r\n * ProductRefinerSource enum type.\r\n */\r\nexport const enum ProductRefinerSource {\r\n /**\r\n * The None member.\r\n */\r\n None = 0,\r\n /**\r\n * The Attribute member.\r\n */\r\n Attribute = 1,\r\n /**\r\n * The Category member.\r\n */\r\n Category = 2,\r\n /**\r\n * The Price member.\r\n */\r\n Price = 3,\r\n /**\r\n * The Rating member.\r\n */\r\n Rating = 4\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value\r\n * @param productRefinerValue product refiner value to match\r\n * @param refinementCriteria selected refinement criteria\r\n */\r\nexport function findMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue | undefined {\r\n // if the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriteria.find((refinementCriterion: ProductRefinerValue) =>\r\n isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value\r\n * @param productRefinerValue product refiner value to match\r\n * @param refinementCriteria selected refinement criteria\r\n */\r\nexport function isMatchingRefinementCriterion(productRefinerValue: ProductRefinerValue, refinementCriterion: ProductRefinerValue): boolean {\r\n // if the value is a range, then match only on data type value; otherwise match on item string\r\n return (\r\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\r\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\r\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\r\n (refinementCriterion.DataTypeValue === ProductRefinerValueDataTypeValue.Range ||\r\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\r\n );\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: IRefineItemToggleNotification,\r\n currentRefinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue[] {\r\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\r\n let toggledItemFound = false;\r\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\r\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\r\n toggledItemFound = true;\r\n if (itemToggleNotification.isSelecting) {\r\n const next = {\r\n ...selectedCriterion,\r\n LeftValueBoundString:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n selectedCriterion.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n } // else the item is being de-selected, so omit it from the refinement criteria\r\n } else {\r\n // keep existing criterion because it is not in the item toggle notification\r\n updatedRefinementCriteria.push(selectedCriterion);\r\n }\r\n });\r\n\r\n if (!toggledItemFound) {\r\n const next = {\r\n ...itemToggleNotification.productRefinerValue,\r\n LeftValueBoundString:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n itemToggleNotification.productRefinerValue.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n // If single select, then deselect any others in the parent refiner group\r\n if (\r\n (itemToggleNotification.productRefinerValue.DataTypeValue === ProductRefinerValueDataTypeValue.List ||\r\n itemToggleNotification.productRefinerValue.DataTypeValue === ProductRefinerValueDataTypeValue.Boolean) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single\r\n ) {\r\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\r\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\r\n // do nothing\r\n } else {\r\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) =>\r\n isMatchingRefinementCriterion(child, criterion)\r\n );\r\n if (matchingIndex > -1) {\r\n updatedRefinementCriteria.splice(matchingIndex, 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n return updatedRefinementCriteria;\r\n}\r\n\r\nexport function formatPrice(\r\n amount: string | undefined,\r\n currency: string | undefined,\r\n locale: string | undefined,\r\n telemetry: ITelemetry\r\n): string {\r\n if (!amount || !currency) {\r\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency: currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (e) {\r\n result = `${priceAmount} ${currency}`;\r\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${e}`);\r\n }\r\n\r\n return result;\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 { Slider } from '@msdyn365-commerce-modules/utilities';\r\nimport debounce from 'lodash/debounce';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { formatPrice } from './utilities';\r\n\r\ntype InputType = 'Min' | 'Max';\r\n\r\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\r\n\r\nexport type RangeRefineItemType = 'slider' | 'input';\r\n\r\n/**\r\n * Range refine item properties\r\n */\r\nexport interface IRangeRefineItemProps extends IRefineItemProps {\r\n rangeType: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n}\r\n\r\n/**\r\n * Range refine item state\r\n */\r\nexport interface IRangeRefineItemState extends IRefineItemState {\r\n validationErrorMin: string | undefined;\r\n validationErrorMax: string | undefined;\r\n selectedMin: string | undefined;\r\n selectedMax: string | undefined;\r\n touchedMin: boolean;\r\n touchedMax: boolean;\r\n}\r\n\r\n/**\r\n * RangeRefineItem component (controlled by RefineSubmenu)\r\n */\r\n@observer\r\nexport default class RangeRefineItem extends React.Component {\r\n private _formattedPriceReverseLookup: Map = new Map();\r\n\r\n private minInput: React.RefObject;\r\n private maxInput: React.RefObject;\r\n\r\n @computed get currencyCode(): string {\r\n return this.props.productRefinerValue.UnitText || '';\r\n }\r\n\r\n constructor(props: IRangeRefineItemProps) {\r\n super(props);\r\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\r\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\r\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\r\n this._changeMin = this._changeMin.bind(this);\r\n this._changeMax = this._changeMax.bind(this);\r\n this._finishChangeMin = this._finishChangeMin.bind(this);\r\n this._finishChangeMax = this._finishChangeMax.bind(this);\r\n\r\n this.minInput = React.createRef();\r\n this.maxInput = React.createRef();\r\n\r\n const { selectedRefinementCriterion } = this.props;\r\n const initialMin = (selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString) || '0';\r\n const initialMax = (selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString) || undefined;\r\n this.state = {\r\n isChecked: false,\r\n validationErrorMin: undefined,\r\n validationErrorMax: undefined,\r\n selectedMin: initialMin,\r\n selectedMax: initialMax,\r\n touchedMin: false,\r\n touchedMax: false\r\n };\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error(\r\n 'Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy'\r\n );\r\n return undefined;\r\n }\r\n\r\n if (this.props.rangeType === 'input') {\r\n return this._renderInputFields();\r\n }\r\n\r\n return this._renderSlider();\r\n }\r\n\r\n private _renderInputFields(): JSX.Element | undefined {\r\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\r\n\r\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', parentProductRefinerHierarchy.KeyName || '');\r\n const formAttrs = {\r\n 'aria-label': rangeAriaLabel,\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n // To enable price formatting of selected fields, this is the approach:\r\n // initial value: min=0 formatted as price, max=undefined\r\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\r\n // onBlur: validate and format entered value as price\r\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${\r\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\r\n }`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\r\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\r\n }`;\r\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\r\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\r\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\r\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\r\n return (\r\n
\r\n \r\n \r\n {validationErrorMin && (\r\n \r\n {validationErrorMin}\r\n \r\n )}\r\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\r\n \r\n {validationErrorMax}\r\n \r\n )}\r\n
\r\n );\r\n }\r\n\r\n private _renderSlider(): JSX.Element | undefined {\r\n const { isDisabled, productRefinerValue, parentProductRefinerHierarchy, selectedRefinementCriterion } = this.props;\r\n const min = productRefinerValue.LeftValueBoundString;\r\n const max = productRefinerValue.RightValueBoundString;\r\n const selectedMin =\r\n (selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString) ||\r\n productRefinerValue.LeftValueBoundString ||\r\n '0';\r\n const selectedMax =\r\n (selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString) ||\r\n productRefinerValue.RightValueBoundString ||\r\n max;\r\n const sliderId = `slider_${parentProductRefinerHierarchy.RecordId}_${productRefinerValue.RefinerRecordId}`;\r\n const ariaAttributes = {\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n const minPrice = this._formatPrice(min);\r\n const maxPrice = this._formatPrice(max);\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _changeMin(event: React.FocusEvent): void {\r\n this._changeValue(event, 'Min');\r\n }\r\n\r\n private _changeMax(event: React.FocusEvent): void {\r\n this._changeValue(event, 'Max');\r\n }\r\n\r\n private _changeValue(event: React.FocusEvent, inputType: InputType): void {\r\n const selectedKey = `selected${inputType}`;\r\n const touchedKey = `touched${inputType}`;\r\n this.setState({\r\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\r\n [touchedKey]: true\r\n });\r\n }\r\n\r\n private _finishChangeMin(event: React.FocusEvent): boolean {\r\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMin: selectedMinValue,\r\n minTouched: false\r\n });\r\n const minInput = Number(selectedMinValue);\r\n const {\r\n onToggle,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n refineItemCommonProps,\r\n selectedRefinementCriterion\r\n } = this.props;\r\n const max = (selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString) || undefined;\r\n\r\n const maxNum = max ? Number(max) : undefined;\r\n\r\n if (isNaN(minInput)) {\r\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Min');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minInput, maxNum)) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minInput,\r\n rangeEnd: maxNum\r\n });\r\n return true;\r\n } else {\r\n this._focus('Min');\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _finishChangeMax(event: React.FocusEvent): boolean {\r\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMax: selectedMaxValue,\r\n maxTouched: false\r\n });\r\n const maxInput = Number(selectedMaxValue);\r\n const {\r\n onToggle,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n refineItemCommonProps,\r\n selectedRefinementCriterion\r\n } = this.props;\r\n const min = (selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString) || '0';\r\n\r\n const minNum = Number(min);\r\n\r\n if (isNaN(maxInput)) {\r\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Max');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minNum, maxInput)) {\r\n if (productRefinerValue) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minNum,\r\n rangeEnd: maxInput\r\n });\r\n } else {\r\n this._focus('Max');\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _focus(inputType: InputType): void {\r\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\r\n\r\n setTimeout(() => {\r\n if (ref && ref.current) {\r\n ref.current.focus();\r\n }\r\n }, 50);\r\n }\r\n\r\n private _getFormattedSelectedValue(\r\n selected: string | undefined,\r\n touched: boolean,\r\n validationError: string | undefined\r\n ): string | undefined {\r\n if (touched || validationError || selected === undefined) {\r\n return selected;\r\n }\r\n return this._formatPrice(selected);\r\n }\r\n\r\n private _validateRange(min: number, max: number | undefined): boolean {\r\n const { refineItemCommonProps } = this.props;\r\n if (max === undefined) {\r\n return true;\r\n }\r\n\r\n if (min > max) {\r\n this.setState({\r\n validationErrorMin: refineItemCommonProps.validationErrorRange,\r\n validationErrorMax: refineItemCommonProps.validationErrorRange\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _formatPrice(amount: string | undefined): string {\r\n const locale = this.props.refineItemCommonProps.locale;\r\n const result = formatPrice(amount, this.currencyCode, locale, this.props.refineItemCommonProps.telemetry);\r\n\r\n if (this.props.productRefinerValue.RefinerRecordId === 0) {\r\n const result = formatPrice(amount, this.currencyCode, locale, this.props.refineItemCommonProps.telemetry);\r\n return result;\r\n }\r\n if (amount !== undefined && !this._formattedPriceReverseLookup.has(result)) {\r\n this._formattedPriceReverseLookup.set(result, amount);\r\n return amount;\r\n }\r\n return amount || '';\r\n }\r\n\r\n private _getInputWithoutFormatting(input: string): string {\r\n // First try to cast raw input to a number\r\n const inputAsNum = Number(input);\r\n if (!isNaN(inputAsNum)) {\r\n return input;\r\n }\r\n\r\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\r\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\r\n return reverseLookupResult || input;\r\n }\r\n\r\n // NOTE: Fix types once Shared Components build pipeline bug fixed\r\n // tslint:disable-next-line:no-any\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private _onRangeUpdate(sliderChangeNotification: any): void {\r\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\r\n if (sliderChangeNotification.eventType !== 'mousemove') {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n }\r\n\r\n // tslint:disable-next-line\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\r\n if (sliderChangeNotification.id) {\r\n const element = document.getElementById(sliderChangeNotification.id);\r\n if (!!element) {\r\n setTimeout(() => {\r\n element.focus();\r\n }, 0);\r\n }\r\n }\r\n }\r\n\r\n private _handleRangeTooltipText(tooltip: number): string {\r\n return this._formatPrice(`${tooltip}`);\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 { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { ProductRefinerSource, ProductRefinerTypeValue } from './utilities';\r\nimport classnames from 'classnames';\r\nimport { checkIfShouldDisplayAsSwatch, DimensionTypes, IDimensionsApp, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\r\n\r\n/**\r\n * RefineItem properties\r\n */\r\nexport interface IRefineItemProps {\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n context: ICoreContext;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n onToggle(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine item state\r\n */\r\nexport interface IRefineItemState extends React.ComponentState {\r\n isChecked: boolean;\r\n renderingError?: object;\r\n}\r\n\r\n/**\r\n * Single-select and multi-select refine item component (controlled by RefineSubmenu)\r\n */\r\nexport default class RefineItem extends React.Component {\r\n private anchorType: React.RefObject;\r\n\r\n constructor(props: IRefineItemProps) {\r\n super(props);\r\n this._onClick = this._onClick.bind(this);\r\n this.state = {\r\n isChecked: !!this.props.selectedRefinementCriterion\r\n };\r\n this.anchorType = React.createRef();\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n selectedRefinementCriterion,\r\n children,\r\n onToggle,\r\n context,\r\n ...attrs\r\n } = this.props;\r\n if (!productRefinerValue) {\r\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\r\n return undefined;\r\n }\r\n if (!productRefinerValue.LeftValueBoundString) {\r\n refineItemCommonProps.telemetry.warning(\r\n `[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`\r\n );\r\n }\r\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single;\r\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\r\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\r\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\r\n const role = isSingleSelect ? 'radio' : undefined;\r\n itemTypeClassName = !!selectedRefinementCriterion ? `${itemTypeClassName}-checked` : itemTypeClassName;\r\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\r\n if (productRefinerValue.LeftValueBoundString) {\r\n return (\r\n \r\n \r\n \r\n \r\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\r\n \r\n \r\n \r\n );\r\n } else {\r\n return undefined;\r\n }\r\n } else {\r\n const dimensionType = (this.props.parentProductRefinerHierarchy.KeyName?.toLocaleLowerCase() ?? '') as DimensionTypes;\r\n const shouldDisplayAsSwatch = this._getShouldDisplayAsSwatch(dimensionType);\r\n let className = 'ms-refine-submenu-item';\r\n if (shouldDisplayAsSwatch) {\r\n className = classnames(className, `ms-refine-submenu-item__dimension__${dimensionType}`);\r\n }\r\n // If the swatch has no color or image specified, it should be displayed as text.\r\n // We don't use swatch logic to display the number of the results found together with the text.\r\n const hasColor = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchColorHexCode);\r\n const hasImage = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchImageUrl);\r\n const hasContentSwatch = hasColor || hasImage;\r\n return (\r\n \r\n \r\n {hasContentSwatch && shouldDisplayAsSwatch && this._renderSwatch(dimensionType)}\r\n \r\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\r\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n\r\n private _renderSwatch(dimensionType: DimensionTypes): JSX.Element | null {\r\n const productRefinerValue = this.props.productRefinerValue;\r\n\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const text = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n const swatchItems = [\r\n {\r\n itemId: `${productRefinerValue.RefinerRecordId ?? ''}-${dimensionType}-${text}`,\r\n value: text,\r\n dimensionType,\r\n colorHexCode: productRefinerValue.SwatchColorHexCode,\r\n imageUrl: productRefinerValue.SwatchImageUrl\r\n }\r\n ];\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _getShouldDisplayAsSwatch(dimensionType: DimensionTypes) {\r\n const shouldDisplayAsSwatch = checkIfShouldDisplayAsSwatch(dimensionType, this.props.context as ICoreContext);\r\n return shouldDisplayAsSwatch;\r\n }\r\n\r\n private _getRefinerUrl(): string {\r\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n\r\n if (productRefinerValue) {\r\n return urlBuilder({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n\r\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n if (productRefinerValue) {\r\n this.props.onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n\r\n setTimeout(() => {\r\n this.anchorType.current && this.anchorType.current.focus();\r\n }, 0);\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 { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport { get } from 'lodash';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { IChoiceSummaryProps } from './choice-summary.props';\r\nimport { isMatchingRefinementCriterion, ProductRefinerValueDataTypeValue } from './utilities';\r\n\r\ninterface IRefinerMap {\r\n key: string;\r\n value: ProductRefinerValue;\r\n}\r\n\r\n/**\r\n * ChoiceSummary component\r\n */\r\n@observer\r\nexport default class ChoiceSummary extends React.Component {\r\n private closeButtonGlyph: string = 'msi-close-btn';\r\n\r\n @computed get selectedRefinersMap(): IRefinerMap[] {\r\n const { selectedChoices } = this.props;\r\n return selectedChoices.map((selectedRefiner: ProductRefinerValue, index) => {\r\n return {\r\n key: this._getKeyForRefinerValue(selectedRefiner, index.toString()),\r\n value: selectedRefiner\r\n } as IRefinerMap;\r\n });\r\n }\r\n\r\n constructor(props: Readonly) {\r\n super(props);\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { clearAllText, label, classNames, choiceAriaLabel, closeAriaLabel } = this.props;\r\n const items = this.selectedRefinersMap;\r\n return (\r\n
\r\n {items.length > 0 && label && {label}}\r\n
    \r\n {items.map((item: IRefinerMap, index: number) => {\r\n const listItemProps = {\r\n 'aria-posinset': index,\r\n 'aria-setsize': items.length\r\n };\r\n\r\n return (\r\n
  • \r\n \r\n {/* {item.key}\r\n */}\r\n {item.value.LeftValueBoundString && item.value.LeftValueBoundLocalizedString === ''\r\n ? item.value.LeftValueBoundString\r\n : (item.value.LeftValueBoundLocalizedString ||\r\n item.value.LeftValueBoundLocalizedString === undefined) &&\r\n item.value.RefinerRecordId === 0\r\n ? item.key\r\n : item.value.LeftValueBoundString}\r\n \r\n \r\n
  • \r\n );\r\n })}\r\n
\r\n {items.length > 0 && clearAllText && (\r\n \r\n {clearAllText}\r\n \r\n )}\r\n
\r\n );\r\n }\r\n\r\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue, index: string): string {\r\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry, refinerValues } = this.props;\r\n const overallFormat = choiceFormat || '{1}';\r\n const rangeFormat = choiceRangeValueFormat;\r\n let refinerName = '';\r\n if (refinerHierarchy && refinerHierarchy.find) {\r\n const parent = refinerHierarchy.find(\r\n (hierarchy: IProductRefinerHierarchy) =>\r\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\r\n );\r\n\r\n if (!parent) {\r\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\r\n } else {\r\n refinerName = parent.KeyName || '';\r\n }\r\n }\r\n\r\n let refinerValueName: string;\r\n switch (productRefinerValue.DataTypeValue) {\r\n case ProductRefinerValueDataTypeValue.Range:\r\n case ProductRefinerValueDataTypeValue.RangeInput:\r\n refinerValueName = rangeFormat\r\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\r\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\r\n break;\r\n default:\r\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n }\r\n if (productRefinerValue.RefinerRecordId === 0) {\r\n const filterValue = refinerValues?.Values.find(\r\n refiner => refiner.LeftValueBoundString === productRefinerValue.LeftValueBoundString\r\n );\r\n refinerValueName = (filterValue ? filterValue.LeftValueBoundLocalizedString : productRefinerValue.LeftValueBoundString) || '';\r\n }\r\n\r\n if (refinerName === 'Rating' || refinerName === 'Price') {\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}`);\r\n }\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}_${refinerName}_${index}`);\r\n }\r\n\r\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\r\n if (!amount || !currency) {\r\n this.props.telemetry.trace('[choice-summary] could not format price');\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n const locale = get(this.props, 'context.request.locale', 'en-US');\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency: currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (e) {\r\n result = `${priceAmount} ${currency}`;\r\n this.props.telemetry.warning(`Failed to format price for ${result}: ${e}`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const target = e.currentTarget as HTMLElement;\r\n const clearAll = target.getAttribute('class')!.indexOf('choice-summary__clear-all') > -1;\r\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\r\n\r\n if (this.props.onChoiceClicked) {\r\n this.props.onChoiceClicked({\r\n clearAll: clearAll,\r\n itemClicked: target,\r\n choiceClicked: selectedRefiner,\r\n nextItemToFocus: target.nextSibling as HTMLElement\r\n });\r\n }\r\n };\r\n\r\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\r\n const result = this.selectedRefinersMap.find(selected => itemClicked.id === selected.key);\r\n return (result && result.value) || undefined;\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 { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nexport interface ISearchResultModalViewProps {\r\n modal: React.ReactElement;\r\n modalHeader: React.ReactElement;\r\n modalFooter: React.ReactElement;\r\n modalBody: React.ReactElement;\r\n}\r\n\r\ninterface IModalToggleProps {\r\n innerRef: React.RefObject | undefined;\r\n id: string;\r\n text: string;\r\n ariaLabel: string;\r\n onClick(): void;\r\n}\r\n\r\nexport interface ISearchResultModalResources {\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n}\r\n\r\nexport interface ISearchResultModalProps {\r\n resources: ISearchResultModalResources;\r\n isOpen: boolean;\r\n returnRef: React.RefObject | undefined;\r\n onModalToggle(): void;\r\n}\r\n\r\nexport const ModalToggle: React.FC = (props: IModalToggleProps) => {\r\n const { text, onClick, ariaLabel, innerRef, id } = props;\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport const SearchResultModal = (props: ISearchResultModalProps): ISearchResultModalViewProps => {\r\n return {\r\n modal: modalNode(props),\r\n modalHeader: modalHeaderNode(props),\r\n modalFooter: modalFooterNode(props),\r\n modalBody: \r\n };\r\n};\r\n\r\nconst modalNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\r\n return {props.resources.modalTitle};\r\n};\r\n\r\nconst modalFooterNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n \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 * as React from 'react';\r\n\r\nimport { Button, Collapse } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { findMatchingRefinementCriterion, ProductRefinerTypeValue, ProductRefinerValueDataTypeValue } from './utilities';\r\nimport classnames from 'classnames';\r\n\r\n/**\r\n * Properties associated with the RefineSubmenu component\r\n */\r\nexport interface IRefineSubmenuProps {\r\n tempRangeTypeTODO: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n productRefinerHierarchy: IProductRefinerHierarchy;\r\n selectedRefinerValues: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n isExpandedOnInitialLoad: boolean;\r\n context: ICoreContext;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n onUpdateRefiners(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine submenu state\r\n */\r\nexport interface IRefineSubmenuState extends React.ComponentState {\r\n expanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The RefineSubmenu component renders the submenu category and child items.\r\n * This computed observes the stateful category hierarchy object.\r\n * @extends {React.PureComponent}\r\n */\r\nclass RefineSubmenu extends React.Component {\r\n constructor(props: IRefineSubmenuProps) {\r\n super(props);\r\n\r\n this._onToggleItem = this._onToggleItem.bind(this);\r\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\r\n\r\n let isExpanded = this.props.isExpandedOnInitialLoad;\r\n if (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\r\n isExpanded = true;\r\n }\r\n\r\n this.state = {\r\n expanded: isExpanded\r\n };\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\r\n }\r\n const className = classnames(\r\n 'ms-refine-submenu',\r\n 'list-group',\r\n productRefinerHierarchy.KeyName // Deprecated because of the localization issues. Leaving for backward compatibility reasons.\r\n );\r\n return (\r\n
\r\n \r\n {productRefinerHierarchy.KeyName}\r\n \r\n \r\n {this._renderChildItems(productRefinerHierarchy)}\r\n \r\n
\r\n );\r\n }\r\n\r\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n switch (productRefinerHierarchy.DataTypeValue) {\r\n case ProductRefinerValueDataTypeValue.Range:\r\n case ProductRefinerValueDataTypeValue.RangeInput:\r\n return this._renderRange(productRefinerHierarchy);\r\n default:\r\n return this._renderSingleMultiSelect(productRefinerHierarchy);\r\n }\r\n }\r\n\r\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context } = this.props;\r\n const isSingleSelect = productRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single;\r\n const role = isSingleSelect ? { role: 'radiogroup' } : undefined;\r\n const refinerValuesList = productRefinerHierarchy.Values || [];\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n return (\r\n \r\n );\r\n });\r\n return (\r\n
    \r\n {listItems}\r\n
\r\n );\r\n }\r\n\r\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n selectedRefinerValues,\r\n context,\r\n minValueSliderThumbAriaLabel,\r\n maxValueSliderThumbAriaLabel\r\n } = this.props;\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = productRefinerHierarchy.Values || [];\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n // TODO BUGBUG 22424559 determine only from the DataTypeValue once live example is working (can test with the tempRangeTypeTODO derived from QSP until then)\r\n const rangeType =\r\n productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.RangeInput ||\r\n this.props.tempRangeTypeTODO === 'input'\r\n ? 'input'\r\n : 'slider';\r\n const key = selectedRefinementCriterion\r\n ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}`\r\n : `not-selected-${index}`;\r\n return (\r\n
  • \r\n \r\n
  • \r\n );\r\n });\r\n return
      {listItems}
    ;\r\n }\r\n\r\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n }\r\n\r\n private _onToggleSubmenu(): void {\r\n this.setState(prevState => ({\r\n expanded: !prevState.expanded\r\n }));\r\n }\r\n}\r\n\r\nexport default RefineSubmenu;\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 * as React from 'react';\r\ninterface IErrorMessage {\r\n text?: string;\r\n}\r\n\r\nexport const ErrorMessage: React.FC = ({ text }) => {\r\n return (\r\n \r\n
    {text}
    \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 ILabeledDropdownOnChangeNotification,\r\n ILabeledDropdownOption,\r\n IModuleProps,\r\n INodeProps,\r\n LabeledDropdown,\r\n UncontrolledPagination\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport {\r\n CategoryHierarchy as CategoryHierarchyData,\r\n IProductRefinerHierarchy,\r\n IProductsDimensionsAvailabilities\r\n} from '@msdyn365-commerce/commerce-entities';\r\nimport {\r\n format,\r\n ProductRefinerValue,\r\n SortColumn,\r\n TextValueTranslation,\r\n ChannelInventoryConfiguration,\r\n StoreOperationsDataActions\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport { computed, observable, reaction, transaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport {\r\n BaseCollectionInput,\r\n getInventoryRefinerAction,\r\n buildListPageUrl,\r\n getCollectionProducts,\r\n getCurrentUrl,\r\n GetFullProductsByCollectionInput,\r\n parseQueryParam,\r\n sortOptions,\r\n ProductListInventoryFilteringOptions,\r\n InventoryInStockRefinerValueInput\r\n} from './actions';\r\nimport {\r\n ErrorMessage,\r\n getUpdatedRefinementCriteria,\r\n IChoiceSummaryClickNotification,\r\n IRefineItemCommonProps,\r\n IRefineItemToggleNotification,\r\n ISearchResultModalViewProps,\r\n isMatchingRefinementCriterion,\r\n Link,\r\n ModalToggle,\r\n ProductSearchResultItems,\r\n SearchResultModal,\r\n Separator,\r\n Title\r\n} from './components';\r\nimport ChoiceSummary from './components/choice-summary';\r\nimport RefineSubmenu from './components/refine-submenu';\r\nimport { IMandsSearchResultContainerData } from './mands-search-result-container.data';\r\nimport { IMandsSearchResultContainerProps } from './mands-search-result-container.props.autogenerated';\r\nimport MsDyn365, { ICoreContext, getCatalogId } from '@msdyn365-commerce/core';\r\nimport {\r\n ArrayExtensions,\r\n IDimensionsApp,\r\n DimensionTypes,\r\n DimensionAvailabilitiesForProductSearchResultInput,\r\n getDimensionAvailabilitiesForProductSearchResultAction,\r\n DimensionSwatchDisplayTypes\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ListPageState } from './list-page-state';\r\n\r\nexport interface ISearchResultContainerViewProps extends IMandsSearchResultContainerProps {\r\n products?: React.ReactNode;\r\n className?: string;\r\n SearchResultContainer: IModuleProps;\r\n TitleViewProps: ITitleViewProps;\r\n categoryHierarchy: ICategoryHierarchyViewProps;\r\n pagination?: React.ReactNode;\r\n ProductsContainer: INodeProps;\r\n ProductSectionContainer: INodeProps;\r\n refineMenu: IRefineMenuViewProps;\r\n sortByOptions: ISortByViewProps;\r\n choiceSummary?: React.ReactNode;\r\n modalToggle: React.ReactNode;\r\n searchResultModal: ISearchResultModalViewProps;\r\n isMobile: boolean;\r\n CategoryNavContainer: INodeProps;\r\n RefineAndProductSectionContainer: INodeProps;\r\n errorMessage: React.ReactNode;\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\r\n}\r\n\r\nexport interface ITitleViewProps {\r\n TitleContainer: INodeProps;\r\n title: ISearchResultTitle;\r\n}\r\n\r\nexport interface IRefineMenuViewProps {\r\n RefineMenuContainer: INodeProps;\r\n RefinerSectionContainer: INodeProps;\r\n refiners?: React.ReactNode[];\r\n}\r\n\r\nexport interface ICategoryHierarchyViewProps {\r\n categoryHierarchyList?: React.ReactNode[];\r\n categoryHierarchySeparator?: React.ReactNode;\r\n CategoryHierarchyContainer: INodeProps;\r\n}\r\n\r\nexport interface ISortByViewProps {\r\n SortingContainer: INodeProps;\r\n sortByDropDown?: React.ReactNode;\r\n}\r\n\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Title component for search result container\r\n */\r\nexport interface ISearchResultTitle {\r\n titlePrefix?: React.ReactNode;\r\n titleText?: React.ReactNode;\r\n titleCount?: React.ReactNode;\r\n}\r\n\r\nexport interface ISearchResultContainerState {\r\n sortingState: ISortByCollectionState;\r\n modalIsOpen: boolean;\r\n channelInventoryConfiguration?: ChannelInventoryConfiguration;\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\r\n}\r\n\r\ninterface ISortByCollectionState {\r\n selectedSortByOption: ILabeledDropdownOption;\r\n pending: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * SearchResultContainer component\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nexport default class SearchResultContainer extends React.PureComponent<\r\n IMandsSearchResultContainerProps,\r\n ISearchResultContainerState\r\n> {\r\n @computed get isMobile(): boolean {\r\n return this._viewport === 'xs' || this._viewport === 'sm';\r\n }\r\n\r\n private sortByDropdownOptions: ILabeledDropdownOption[] = [\r\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\r\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\r\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\r\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\r\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\r\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc }\r\n ];\r\n private _refineItemCommonProps: IRefineItemCommonProps;\r\n private _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\r\n @observable\r\n private _viewport: GridSize;\r\n\r\n private _modalToggleRef: React.RefObject;\r\n private _sortAndFilterContainerRef: React.RefObject;\r\n\r\n private _isMounted: boolean = false;\r\n private readonly catalogId = getCatalogId(this.props.context.request);\r\n\r\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && ArrayExtensions.hasElements(nameTranslations)) {\r\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\r\n }\r\n return nameTranslation?.Text;\r\n }\r\n\r\n constructor(props: IMandsSearchResultContainerProps, state: ISearchResultContainerState) {\r\n super(props);\r\n this._viewport =\r\n props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\r\n this._modalToggleRef = React.createRef();\r\n this._sortAndFilterContainerRef = React.createRef();\r\n this._toggleModal = this._toggleModal.bind(this);\r\n this._updateViewport = this._updateViewport.bind(this);\r\n this.state = {\r\n sortingState: {\r\n pending: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n },\r\n modalIsOpen: false,\r\n channelInventoryConfiguration: undefined\r\n };\r\n const { placeholderTextMax, minLabel, maxLabel, rangeNameFormat } = this.props.resources;\r\n\r\n const locale = this.props.context.request.locale;\r\n const telemetry = this.props.telemetry;\r\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\r\n const validationErrorRange = this.props.resources.validationErrorNotRange;\r\n this._refineItemCommonProps = {\r\n telemetry,\r\n locale,\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat,\r\n validationErrorNaN,\r\n validationErrorRange\r\n };\r\n\r\n // Initalization of list page\r\n this.props.data.products.then(products => {\r\n this.props.data.listPageState.then(listPageState => {\r\n if (this._pageType === 'Category') {\r\n listPageState.pageType = 'Category';\r\n } else {\r\n listPageState.pageType = 'Search';\r\n }\r\n\r\n let querySorting: SortColumn[] = [];\r\n\r\n if (this.props.context.request.query && this.props.context.request.query.sorting) {\r\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\r\n }\r\n\r\n listPageState.currentPageNumber =\r\n (this.props.context.request.query && +this.props.context.request.query.skip / (this.props.config.itemsPerPage || 10)) ||\r\n 0;\r\n listPageState.sortingCritera = { Columns: querySorting };\r\n listPageState.pageSize = this.props.config.itemsPerPage || 10;\r\n listPageState.activeProducts = products.products;\r\n listPageState.totalProductCount = products.count;\r\n\r\n // Initialize reaction based on listPageState properties\r\n reaction(\r\n () => {\r\n return [\r\n listPageState.activeFilters && listPageState.activeFilters.length,\r\n listPageState.currentPageNumber,\r\n listPageState.sortingCritera &&\r\n listPageState.sortingCritera.Columns &&\r\n listPageState.sortingCritera.Columns.length\r\n ];\r\n },\r\n () => {\r\n const input = new GetFullProductsByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(listPageState.pageSize * (listPageState.currentPageNumber || 0), 0)\r\n },\r\n count: true,\r\n Sorting: listPageState.sortingCritera || {}\r\n },\r\n listPageState.activeFilters || [],\r\n +(this.props.context.request.urlTokens.recordId || 0),\r\n // this.props.context.request.query && this.props.context.request.query.q\r\n // eslint-disable-next-line max-len -- existing code\r\n this.props.context.request.query?.q\r\n ? this.props.context.request.query.q\r\n : JSON.stringify({\r\n ProductId: this.props.context.request.query?.productId,\r\n Recommendation: this.props.context.request.query?.recommendation\r\n }),\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Required check.\r\n !!this.props?.config?.includeAttributes,\r\n this.props.config.updateRefinerPanel,\r\n this.props.context.request.locale,\r\n this.catalogId\r\n );\r\n\r\n getCollectionProducts(input, this.props.context.actionContext).then(productResults => {\r\n listPageState.activeProducts = productResults.products;\r\n listPageState.totalProductCount = productResults.count;\r\n });\r\n }\r\n );\r\n });\r\n });\r\n this._updateViewport();\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n this._isMounted = true;\r\n if (MsDyn365.isBrowser && window.addEventListener) {\r\n // if (typeof window !== undefined && window.addEventListener) {\r\n window.addEventListener('resize', this._updateViewport);\r\n this._updateViewport();\r\n }\r\n\r\n const context = this.props.context as ICoreContext;\r\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\r\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\r\n if (\r\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\r\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\r\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\r\n this.props.config.includeAttributes\r\n ) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities of dimensions data without blocking the UI.\r\n this._getProductsDimensionsAvailabilities();\r\n }\r\n const channelInventoryConfiguration = await StoreOperationsDataActions.getInventoryConfigurationAsync({\r\n callerContext: this.props.context.actionContext\r\n });\r\n if (this._isMounted) {\r\n this.setState({ channelInventoryConfiguration });\r\n }\r\n const listPageState = await this.props.data.listPageState;\r\n // Push inventory in stock refiner when productListInventoryDisplay is hide oos\r\n const inventoryRefiner = await this._getInventoryRefiner(listPageState, channelInventoryConfiguration);\r\n const input = new GetFullProductsByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(listPageState.pageSize * (listPageState.currentPageNumber || 0), 0)\r\n },\r\n count: true,\r\n Sorting: listPageState.sortingCritera || {}\r\n },\r\n listPageState.activeFilters || [],\r\n +(this.props.context.request.urlTokens.recordId || 0),\r\n // this.props.context.request.query && this.props.context.request.query.q\r\n // eslint-disable-next-line max-len -- existing code\r\n this.props.context.request.query?.q\r\n ? this.props.context.request.query.q\r\n : JSON.stringify({\r\n ProductId: this.props.context.request.query?.productId,\r\n Recommendation: this.props.context.request.query?.recommendation\r\n }),\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Required check.\r\n !!this.props?.config?.includeAttributes,\r\n this.props.config.updateRefinerPanel,\r\n this.props.context.request.locale,\r\n this.catalogId,\r\n channelInventoryConfiguration,\r\n inventoryRefiner\r\n );\r\n getCollectionProducts(input, this.props.context.actionContext).then(productResults => {\r\n listPageState.activeProducts = productResults.products;\r\n listPageState.totalProductCount = productResults.count;\r\n });\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n this._isMounted = false;\r\n if (MsDyn365.isBrowser && window.removeEventListener) {\r\n // if (typeof window !== undefined && window.addEventListener) {\r\n window.removeEventListener('resize', this._updateViewport);\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { imageSettings, className } = this.props.config;\r\n const { resources, telemetry } = this.props;\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n let errorText = '';\r\n if (!products || products.length === 0) {\r\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\r\n }\r\n const productComparisonButton = ArrayExtensions.hasElements(this.props.slots.productComparisonButton)\r\n ? this.props.slots.productComparisonButton[0]\r\n : null;\r\n const productsComponent = (\r\n \r\n );\r\n\r\n const searchResultContainerViewProps = {\r\n ...this.props,\r\n products: productsComponent,\r\n TitleViewProps: this._getCollectionTitle(),\r\n categoryHierarchy: this._getCategoryHierarchy(),\r\n refineMenu: this._getRefineMenu(),\r\n className: classnames('ms-search-result-container', className),\r\n SearchResultContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-search-result-container', className)\r\n },\r\n sortByOptions:\r\n this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0\r\n ? this._getSortingDropDown()\r\n : null,\r\n pagination: this._getPagination(),\r\n ProductsContainer: { className: 'ms-search-result-container__Products' },\r\n ProductSectionContainer: { className: 'ms-search-result-container__product-section' },\r\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section' },\r\n RefineAndProductSectionContainer: { className: 'ms-search-result-container__refine-product-section' },\r\n choiceSummary: this._getChoiceSummary(),\r\n modalToggle:\r\n this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ? (\r\n \r\n ) : null,\r\n searchResultModal: this._getSearchResultModal(),\r\n isMobile: this.isMobile,\r\n errorMessage: errorText && ,\r\n productsDimensionAvailabilities: this.state.productsDimensionAvailabilities\r\n };\r\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\r\n }\r\n\r\n /**\r\n * Get products dimension availabilities.\r\n * @returns Void.\r\n */\r\n private readonly _getProductsDimensionsAvailabilities = async (): Promise => {\r\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\r\n\r\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\r\n new DimensionAvailabilitiesForProductSearchResultInput(\r\n productsList,\r\n this.props.context as ICoreContext,\r\n DimensionSwatchDisplayTypes.productCard\r\n ),\r\n this.props.context.actionContext\r\n );\r\n\r\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\r\n this.setState({ productsDimensionAvailabilities });\r\n }\r\n };\r\n\r\n private _getSearchResultModal = (): ISearchResultModalViewProps => {\r\n const { resources } = this.props;\r\n return SearchResultModal({\r\n resources: {\r\n modalCloseButtonText: resources.modalCloseButtonText,\r\n modalTitle: resources.modalTitle\r\n },\r\n isOpen: this.state.modalIsOpen,\r\n returnRef: this._modalToggleRef,\r\n onModalToggle: this._toggleModal\r\n });\r\n };\r\n\r\n private _getCollectionTitle = (): ITitleViewProps => {\r\n const { data, context, resources } = this.props;\r\n\r\n let collectionTitle: string | undefined = '';\r\n if (context && context.request && context.request.query && context.request.query.q) {\r\n collectionTitle = `\"${context.request.query.q}\"`;\r\n } else {\r\n collectionTitle =\r\n (data.category.result &&\r\n SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\r\n (data.category.result && data.category.result.Name) ||\r\n this.props.context.request.query?.title ||\r\n '';\r\n }\r\n let productCountText = '';\r\n let productCountNumber: number | undefined;\r\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\r\n productCountNumber = data.listPageState.result.totalProductCount;\r\n } else if (data.products && data.products.result) {\r\n productCountNumber = data.products.result.count;\r\n }\r\n\r\n if (productCountNumber && productCountNumber !== 0) {\r\n productCountText =\r\n productCountNumber !== 1\r\n ? format(this.props.resources.numberOfProducts, productCountNumber)\r\n : this.props.resources.oneProduct;\r\n } else {\r\n productCountText = format(this.props.resources.numberOfProducts, 0);\r\n }\r\n const titlePrefix = ;\r\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\r\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\r\n\r\n return {\r\n TitleContainer: { className: 'ms-search-result-container__title' },\r\n title: {\r\n titlePrefix: titlePrefix,\r\n titleText: titleText,\r\n titleCount: titleCount\r\n }\r\n };\r\n };\r\n private _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\r\n const { data } = this.props;\r\n const categoryHierarchy = data.categoryHierarchy.result;\r\n const categoryLinks =\r\n categoryHierarchy &&\r\n categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\r\n return (\r\n <Link\r\n key={index}\r\n text={value.Name}\r\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\r\n href={value.Url}\r\n />\r\n );\r\n });\r\n const categoryLinkSeparator = <Separator separator='/' />;\r\n\r\n return {\r\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\r\n categoryHierarchyList: categoryLinks,\r\n categoryHierarchySeparator: categoryLinkSeparator\r\n };\r\n };\r\n\r\n private _getSortingDropDown = (): ISortByViewProps => {\r\n const { resources } = this.props;\r\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\r\n const dropdown = (\r\n <LabeledDropdown\r\n labelClassname='reviews-list-sort-by'\r\n labelText={resources.sortByDropdownLabel}\r\n dropdownId='categorySortByDropdown'\r\n dropdownClassname='reviews-list-dropdown'\r\n toggleColor='link'\r\n dropdownOptions={this.sortByDropdownOptions}\r\n selectedOption={activeDropdown}\r\n onSelectOption={this._updateSortByDropdown}\r\n ref={this._sortAndFilterContainerRef}\r\n />\r\n );\r\n return {\r\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\r\n sortByDropDown: dropdown\r\n };\r\n };\r\n\r\n private _getPagination = (): React.ReactNode => {\r\n const { config, context, data, resources } = this.props;\r\n const listPageState = data && data.listPageState && data.listPageState.result;\r\n const fullUrl = getCurrentUrl(context.request);\r\n const itemsPerPage = config.itemsPerPage || 10;\r\n const skipCount =\r\n listPageState && listPageState.currentPageNumber !== null\r\n ? listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)\r\n : (this.props.context.request.query && +this.props.context.request.query.skip) || 0;\r\n const totalItems = (listPageState && listPageState.totalProductCount) || 0;\r\n const previousText = resources.flipperPrevious;\r\n const nextText = resources.flipperNext;\r\n if (totalItems <= itemsPerPage) {\r\n return null;\r\n }\r\n return (\r\n <UncontrolledPagination\r\n className='ms-search-result-container__pagination'\r\n role='navigation'\r\n aria-label={resources.paginationAriaLabel}\r\n url={fullUrl.href}\r\n qsp={'skip'}\r\n items={totalItems}\r\n itemsPerPage={itemsPerPage}\r\n startingItem={skipCount}\r\n previousText={\r\n <div className='msc-pagination__prev'>\r\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\r\n <span className='prev-text'>{previousText}</span>\r\n </div>\r\n }\r\n nextText={\r\n <div className='msc-pagination__next'>\r\n <span className='next-text'>{nextText}</span>\r\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\r\n </div>\r\n }\r\n previousAriaLabel={previousText}\r\n nextAriaLabel={nextText}\r\n />\r\n );\r\n };\r\n\r\n private _getRefineMenu = (): IRefineMenuViewProps => {\r\n const { data, context } = this.props;\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const validRefiners =\r\n data.refiners.result &&\r\n data.refiners.result.filter(refiner => {\r\n return refiner.Values.length > 0;\r\n });\r\n\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n const subMenus =\r\n validRefiners &&\r\n validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n return data.listPageState.result!.totalProductCount !== 0 ? (\r\n <RefineSubmenu\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={true}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.id}\r\n moduleTypeName={this.props.typeName}\r\n />\r\n ) : null;\r\n });\r\n\r\n return {\r\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\r\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\r\n refiners: subMenus\r\n };\r\n };\r\n\r\n /**\r\n * Get inventory refiners.\r\n * @param listPageState The listPageState\r\n * @returns inventory refiner.\r\n */\r\n private readonly _getInventoryRefiner = async (\r\n listPageState: ListPageState,\r\n channelInventoryConfiguration: ChannelInventoryConfiguration\r\n ): Promise<IProductRefinerHierarchy | undefined> => {\r\n if (this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\r\n const baseCollectionInput = new BaseCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n count: true\r\n },\r\n // Parameter - refiners\r\n [],\r\n // Parameter - category\r\n undefined,\r\n // Parameter - searchText\r\n '',\r\n // Parameter - includeAttributes\r\n false,\r\n // Parameter - isUpdateRefinerPanel\r\n false,\r\n // Parameter - locale\r\n undefined,\r\n this.catalogId,\r\n channelInventoryConfiguration\r\n );\r\n const inventoryInStockRefinerValueInput = new InventoryInStockRefinerValueInput(\r\n baseCollectionInput,\r\n channelInventoryConfiguration?.InventoryProductAttributeRecordId\r\n );\r\n return getInventoryRefinerAction(inventoryInStockRefinerValueInput, this.props.context.actionContext);\r\n }\r\n return Promise.resolve(undefined);\r\n };\r\n\r\n private _getChoiceSummary = (): React.ReactNode => {\r\n const { resources, data, telemetry } = this.props;\r\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n const refinerValueName = this.props.data.refiners.result?.find(rating => rating.KeyName === 'Rating');\r\n\r\n return (\r\n <ChoiceSummary\r\n classNames='ms-choice-summary-by-category'\r\n clearAllText={resources.clearAllText}\r\n label={resources.choiceSummaryLabel}\r\n selectedChoices={selectedRefiners}\r\n // @ts-ignore: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\r\n refinerHierarchy={data.refiners.result}\r\n choiceFormat={resources.choiceFormat}\r\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\r\n telemetry={telemetry}\r\n onChoiceClicked={this._onChoiceClicked}\r\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\r\n choiceAriaLabel={resources.choiceAriaLabel}\r\n refinerValues={refinerValueName}\r\n />\r\n );\r\n };\r\n\r\n private _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${\r\n !actionContext ? 'actionContext ' : ''\r\n } could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n window.history.pushState(\r\n {},\r\n '',\r\n buildListPageUrl(\r\n getCurrentUrl(this.props.context.request),\r\n undefined,\r\n [this._getSortColumnFromSelectedOption(notification.selectedOption)],\r\n undefined\r\n )\r\n );\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.sortingCritera = {\r\n Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)]\r\n };\r\n });\r\n };\r\n\r\n private _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\r\n const { data } = this.props;\r\n\r\n if (!data.searchConfiguration.result) {\r\n return {};\r\n }\r\n\r\n const mappedConfiguration = data.searchConfiguration.result.find(searchConfiguration => {\r\n return searchConfiguration.key === option.key;\r\n });\r\n\r\n if (mappedConfiguration) {\r\n return mappedConfiguration.sortColumn;\r\n }\r\n\r\n return {};\r\n };\r\n\r\n private _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\r\n const { data } = this.props;\r\n const sortCriteria = data.listPageState.result && data.listPageState.result.sortingCritera;\r\n\r\n const activeSortColumn =\r\n (sortCriteria && sortCriteria.Columns && sortCriteria.Columns[0]) ||\r\n (parseQueryParam<SortColumn[]>('sorting', this.props.context.request) || [])[0];\r\n\r\n if (activeSortColumn && data.searchConfiguration.result) {\r\n const activeMappedConfig = data.searchConfiguration.result.find(mappedSearchConfig => {\r\n return (\r\n mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\r\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\r\n );\r\n });\r\n if (activeMappedConfig) {\r\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\r\n }\r\n }\r\n\r\n return;\r\n };\r\n\r\n private _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${\r\n !actionContext ? 'actionContext ' : ''\r\n } could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(\r\n itemToggleNotification,\r\n (this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters) || []\r\n );\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\r\n });\r\n };\r\n\r\n private _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\r\n if (this.props.data.listPageState.result) {\r\n const newRefinementCriteria = getUpdatedRefinementCriteria(\r\n itemToggleNotification,\r\n this.props.data.listPageState.result.activeFilters || []\r\n );\r\n\r\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\r\n } else {\r\n this.props.telemetry.warning(`[buildRefinerQueryString]List Page State Not available, unable to build refiner URL`);\r\n return '';\r\n }\r\n };\r\n\r\n private _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\r\n const { data, telemetry } = this.props;\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\r\n return;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!notification.clearAll) {\r\n const selectedChoice = notification.choiceClicked;\r\n if (!selectedChoice) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\r\n return;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n\r\n // set focus to sort and filter\r\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\r\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\r\n setTimeout(() => {\r\n dropdownElement && dropdownElement.focus();\r\n }, 50);\r\n }\r\n\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\r\n data.listPageState.result.currentPageNumber = 0;\r\n data.listPageState.result.activeFilters = currentRefinementCriteria;\r\n };\r\n\r\n private _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\r\n const { data, telemetry } = this.props;\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\r\n return fullUrl.href;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!isClearAll) {\r\n if (!selectedRefiner) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\r\n return fullUrl.href;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n }\r\n\r\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\r\n };\r\n\r\n private _getViewport(): GridSize {\r\n const { context } = this.props;\r\n\r\n // always render in mobile viewport on a mobile device\r\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\r\n return 'xs';\r\n }\r\n\r\n if (MsDyn365.isBrowser && window.innerWidth) {\r\n // if (typeof window !== undefined && window.innerWidth) {\r\n const gridSettings = context.request.gridSettings;\r\n if (gridSettings) {\r\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\r\n return 'xs';\r\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\r\n return 'sm';\r\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\r\n return 'md';\r\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\r\n return 'lg';\r\n } else {\r\n return 'xl';\r\n }\r\n }\r\n }\r\n\r\n return 'xs';\r\n }\r\n\r\n private _toggleModal(): void {\r\n this.setState({\r\n modalIsOpen: !this.state.modalIsOpen\r\n });\r\n }\r\n\r\n private _updateViewport(): void {\r\n this._viewport = this._getViewport();\r\n\r\n if (this.state.modalIsOpen && !this.isMobile) {\r\n this._toggleModal();\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ISearchResultModalViewProps } from './components';\r\nimport {\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps\r\n} from './mands-search-result-container';\r\n\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\r\n const {\r\n SearchResultContainer,\r\n products,\r\n pagination,\r\n ProductsContainer,\r\n ProductSectionContainer,\r\n choiceSummary,\r\n isMobile,\r\n modalToggle,\r\n searchResultModal,\r\n TitleViewProps,\r\n refineMenu,\r\n categoryHierarchy,\r\n sortByOptions,\r\n CategoryNavContainer,\r\n RefineAndProductSectionContainer,\r\n errorMessage\r\n } = props;\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n {renderTitle(TitleViewProps)}\r\n {choiceSummary}\r\n {modalToggle}\r\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions)}\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n <Node {...CategoryNavContainer}>\r\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n {TitleViewProps && renderTitleCount(TitleViewProps)}\r\n </Node>\r\n <Node {...RefineAndProductSectionContainer}>\r\n {refineMenu && renderRefiner(refineMenu)}\r\n <Node {...ProductSectionContainer}>\r\n {TitleViewProps && renderTitle(TitleViewProps)}\r\n {choiceSummary}\r\n {sortByOptions && renderSort(sortByOptions)}\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\nconst createSearchResultModal = (\r\n modalProps: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps\r\n): JSX.Element => {\r\n return React.cloneElement(\r\n modalProps.modal,\r\n {},\r\n modalProps.modalHeader,\r\n createModalBody(modalProps, refineMenu, sortByDropDown),\r\n modalProps.modalFooter\r\n );\r\n};\r\n\r\nconst createModalBody = (\r\n props: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps\r\n): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown), renderRefiner(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>{submenu}</React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderSort = (props: ISortByViewProps): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown) {\r\n return <Node {...SortingContainer}>{sortByDropDown}</Node>;\r\n }\r\n return null;\r\n};\r\n\r\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\r\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\r\n if (categoryHierarchyList) {\r\n return (\r\n <Node {...CategoryHierarchyContainer}>\r\n {categoryHierarchyList.map((category, index) => (\r\n <React.Fragment key={index}>\r\n {category}\r\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n );\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h2>\r\n {title.titlePrefix}\r\n {title.titleText}\r\n </h2>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h5>{title.titleCount}</h5>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nexport default SearchResultContainerView;\r\n","import { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport { get } from 'lodash';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { IChoiceSummaryProps } from '@msdyn365-commerce-modules/search-result-container/dist/types';\r\nimport { isMatchingRefinementCriterion, ProductRefinerValueDataTypeValue } from './utilities';\r\n\r\ninterface IRefinerMap {\r\n key: string;\r\n value: ProductRefinerValue;\r\n}\r\n\r\n/**\r\n * ChoiceSummary component\r\n */\r\n@observer\r\nexport default class ChoiceSummary extends React.Component<IChoiceSummaryProps> {\r\n private closeButtonGlyph: string = 'msi-close-btn';\r\n\r\n @computed get selectedRefinersMap(): IRefinerMap[] {\r\n const { selectedChoices } = this.props;\r\n return selectedChoices.map((selectedRefiner: ProductRefinerValue) => {\r\n return {\r\n key: this._getKeyForRefinerValue(selectedRefiner),\r\n value: selectedRefiner\r\n } as IRefinerMap;\r\n });\r\n }\r\n\r\n constructor(props: Readonly<IChoiceSummaryProps>) {\r\n super(props);\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { clearAllText, label, classNames, choiceAriaLabel } = this.props;\r\n const items = this.selectedRefinersMap;\r\n return (\r\n <div className='msc-choice-summary'>\r\n {items.length > 0 && label && <span className='msc-choice-summary__label'>{label}</span>}\r\n <ul className={classnames(classNames, 'msc-choice-summary__list', 'list-unstyled')}>\r\n {items.map((item: IRefinerMap, index: number) => {\r\n // 11290923670 is RefinerRecordId for Size\r\n const dimensionLabel = this.props.selectedChoices[index].RefinerRecordId === 11290923670 ? 'Size: ' : null;\r\n const listItemProps = {\r\n 'aria-posinset': index,\r\n 'aria-setsize': items.length\r\n };\r\n\r\n return (\r\n <li className='msc-choice-summary__list-item' key={item.key} {...listItemProps}>\r\n <a\r\n className='msc-choice-summary__item'\r\n href={this.props.urlBuilder(item.value, false)}\r\n aria-label={`${item.key} ${choiceAriaLabel}`}\r\n onClick={this._onClick}\r\n >\r\n {dimensionLabel}\r\n {item.key}\r\n <span className={`${this.closeButtonGlyph} msc-choice-summary__glyph`} />\r\n </a>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n {items.length > 0 && clearAllText && (\r\n <a href={this.props.urlBuilder({}, true)} className={'msc-choice-summary__clear-all'} onClick={this._onClick}>\r\n {clearAllText}\r\n </a>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n private _getKeyForRefinerValue = (productRefinerValue: ProductRefinerValue): string => {\r\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry } = this.props;\r\n const overallFormat = choiceFormat || '{1}';\r\n const rangeFormat = choiceRangeValueFormat;\r\n let refinerName = '';\r\n if (refinerHierarchy && refinerHierarchy.find) {\r\n const parent = refinerHierarchy.find(\r\n (hierarchy: IProductRefinerHierarchy) =>\r\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\r\n );\r\n\r\n if (!parent) {\r\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\r\n } else {\r\n refinerName = parent.KeyName || '';\r\n }\r\n }\r\n\r\n let refinerValueName: string;\r\n switch (productRefinerValue.DataTypeValue) {\r\n case ProductRefinerValueDataTypeValue.Range:\r\n case ProductRefinerValueDataTypeValue.RangeInput:\r\n refinerValueName = rangeFormat\r\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\r\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\r\n break;\r\n default:\r\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n }\r\n\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', refinerValueName);\r\n };\r\n\r\n private _formatPrice = (amount: string | undefined, currency: string | undefined): string => {\r\n if (!amount || !currency) {\r\n this.props.telemetry.trace('[choice-summary] could not format price');\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n const locale = get(this.props, 'context.request.locale', 'en-US');\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency: currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (e) {\r\n result = `${priceAmount} ${currency}`;\r\n this.props.telemetry.warning(`Failed to format price for ${result}: ${e}`);\r\n }\r\n\r\n return result;\r\n };\r\n\r\n private _onClick = (e: React.MouseEvent<HTMLAnchorElement>): void => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const target = e.currentTarget as HTMLElement;\r\n const clearAll = target.getAttribute('class')!.indexOf('choice-summary__clear-all') > -1;\r\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\r\n\r\n if (this.props.onChoiceClicked) {\r\n this.props.onChoiceClicked({\r\n clearAll: clearAll,\r\n itemClicked: target,\r\n choiceClicked: selectedRefiner,\r\n nextItemToFocus: target.nextSibling as HTMLElement\r\n });\r\n }\r\n };\r\n\r\n private _getSelectedRefinerChoice = (itemClicked: HTMLElement): ProductRefinerValue | undefined => {\r\n const result = this.selectedRefinersMap.find(selected => (itemClicked.innerText && itemClicked.innerText.trim()) === selected.key);\r\n return (result && result.value) || undefined;\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 { getProductUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, Heading, INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport { CartLineItemComponent } from '@msdyn365-commerce/components';\r\nimport { getUrlSync } from '@msdyn365-commerce/core';\r\nimport { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport classnames from 'classnames';\r\nimport get from 'lodash/get';\r\nimport * as React from 'react';\r\nimport { ICheckoutData } from '@msdyn365-commerce-modules/checkout/src/modules/checkout/checkout.data';\r\nimport { ICheckoutProps } from '@msdyn365-commerce-modules/checkout/src/modules/checkout/checkout.props.autogenerated';\r\n\r\ntype deliveryType = 'pickup' | 'ship';\r\n\r\nexport interface IPickUpAtStore {\r\n PickUpAtStore: INodeProps;\r\n label: React.ReactNode;\r\n location: React.ReactNode;\r\n}\r\n\r\nexport interface ILineItem {\r\n LineId: string;\r\n LineItem: INodeProps;\r\n item?: React.ReactNode;\r\n pickUpAtStore?: IPickUpAtStore;\r\n}\r\n\r\nexport interface ILineItemDeliveryGroup {\r\n LineItemDeliveryGroup: INodeProps;\r\n LineItemList: INodeProps;\r\n heading: React.ReactNode;\r\n lineItems: ILineItem[];\r\n}\r\n\r\nexport interface ILineItems {\r\n LineItems: INodeProps;\r\n Header: INodeProps;\r\n heading: React.ReactNode;\r\n editLink: React.ReactNode;\r\n itemsForPickup?: ILineItemDeliveryGroup;\r\n itemsForShip?: ILineItemDeliveryGroup;\r\n}\r\n\r\nexport const getLineItems = (input: ICheckoutProps<ICheckoutData>): ILineItems | undefined => {\r\n const _getProduct = (productId: number): SimpleProduct | undefined => {\r\n const products = get(input, 'data.products.result') || [];\r\n return products.find((_product: SimpleProduct) => {\r\n return productId === _product.RecordId;\r\n });\r\n };\r\n\r\n const _getLineItemComponent = (cartLine: CartLine): JSX.Element | undefined => {\r\n const product = cartLine.ProductId && _getProduct(cartLine.ProductId);\r\n const {\r\n id,\r\n typeName,\r\n context,\r\n config: { imageSettings },\r\n resources: {\r\n quantityDisplayString,\r\n productDimensionTypeColor,\r\n productDimensionTypeSize,\r\n productDimensionTypeStyle,\r\n configString,\r\n inputQuantityAriaLabel,\r\n discountStringText\r\n },\r\n context: {\r\n request: { gridSettings }\r\n }\r\n } = input;\r\n\r\n if (!product) {\r\n return;\r\n }\r\n\r\n return (\r\n <CartLineItemComponent\r\n id={id}\r\n typeName={typeName}\r\n context={context}\r\n resources={{\r\n sizeString: productDimensionTypeSize,\r\n colorString: productDimensionTypeColor,\r\n styleString: productDimensionTypeStyle,\r\n quantityDisplayString,\r\n configString,\r\n inputQuantityAriaLabel,\r\n discountStringText,\r\n originalPriceText: '',\r\n currentPriceText: '',\r\n shippingChargesText: ''\r\n }}\r\n isQuantityEditable={false}\r\n imageSettings={imageSettings!}\r\n gridSettings={gridSettings!}\r\n productUrl={getProductUrlSync(product, context.actionContext, undefined)}\r\n primaryImageUrl={product.PrimaryImageUrl}\r\n data={{\r\n cartLine: cartLine,\r\n product: product\r\n }}\r\n />\r\n );\r\n };\r\n\r\n const _getLineItemsComponents = (items: CartLine[]): ILineItem[] => {\r\n return items.map(cartLine => {\r\n return {\r\n LineId: cartLine.LineId || '',\r\n LineItem: { className: 'ms-checkout__line-item' },\r\n item: _getLineItemComponent(cartLine)\r\n };\r\n });\r\n };\r\n\r\n const _getGroupTitleComponent = (count: number, type: deliveryType): string => {\r\n const {\r\n resources: { itemLabel, itemsLabel, inStorePickUpLabel, shippingCountCheckoutLineItem }\r\n } = input;\r\n\r\n const suffix = count > 1 ? itemsLabel : itemLabel;\r\n const title = type === 'ship' ? shippingCountCheckoutLineItem : inStorePickUpLabel;\r\n return title.replace('{count}', count.toString()).replace('{suffix}', suffix);\r\n };\r\n\r\n const _countItems = (items: CartLine[]): number => {\r\n return items.reduce((count, item) => {\r\n return count + (item.Quantity || 0);\r\n }, 0);\r\n };\r\n\r\n const _filterItemsByDiliveryType = (type: deliveryType): CartLine[] => {\r\n const cart = get(input, 'data.checkout.result.checkoutCart.cart');\r\n const pickupDeliveryModeCode = get(input, 'context.request.channel.PickupDeliveryModeCode');\r\n return type === 'ship'\r\n ? cart.CartLines.filter((cartLine: CartLine) => cartLine.DeliveryMode !== pickupDeliveryModeCode)\r\n : cart.CartLines.filter((cartLine: CartLine) => cartLine.DeliveryMode === pickupDeliveryModeCode);\r\n };\r\n\r\n const _getLineItemsByDeliveryType = (type: deliveryType): ILineItemDeliveryGroup | undefined => {\r\n const items = _filterItemsByDiliveryType(type);\r\n\r\n if (items.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const count = _countItems(items);\r\n const title = _getGroupTitleComponent(count, type);\r\n\r\n return {\r\n LineItemDeliveryGroup: { className: classnames('ms-checkout__line-items-delivery-group', type) },\r\n LineItemList: { className: 'ms-checkout__line-items-list' },\r\n heading: <div className='ms-checkout__line-items-group-title'>{title}</div>,\r\n lineItems: _getLineItemsComponents(items)\r\n };\r\n };\r\n\r\n const _getLineItems = (): ILineItems | undefined => {\r\n const {\r\n context,\r\n config: { lineItemsHeading },\r\n data: { products },\r\n resources: { editCartText }\r\n } = input;\r\n\r\n const cart = get(input, 'data.checkout.result.checkoutCart.cart');\r\n\r\n if (!cart || !cart.CartLines || !cart.CartLines.length || !products) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n LineItems: { className: 'ms-checkout__line-items' },\r\n Header: { className: 'ms-checkout__line-items-header' },\r\n heading: lineItemsHeading && <Heading className='ms-checkout__line-items-heading' {...lineItemsHeading} />,\r\n editLink: (\r\n <Button\r\n className='ms-checkout__line-items-edit-cart-link'\r\n title={editCartText}\r\n color='link'\r\n href={getUrlSync('cart', context.actionContext) || ''}\r\n >\r\n {editCartText}\r\n </Button>\r\n ),\r\n itemsForPickup: _getLineItemsByDeliveryType('pickup'),\r\n itemsForShip: _getLineItemsByDeliveryType('ship')\r\n };\r\n };\r\n\r\n return _getLineItems();\r\n};\r\n","import { Slider } from '@msdyn365-commerce-modules/utilities';\r\nimport debounce from 'lodash/debounce';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { formatPrice } from './utilities';\r\nimport { ISliderChangeNotification } from '@msdyn365-commerce-modules/utilities/dist/types';\r\ntype InputType = 'Min' | 'Max';\r\n\r\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\r\n\r\nexport type RangeRefineItemType = 'slider' | 'input';\r\n\r\n/**\r\n * Range refine item properties\r\n */\r\nexport interface IRangeRefineItemProps extends IRefineItemProps {\r\n rangeType: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n getFormattedSelectedMinValue: IPriceObject[] | undefined;\r\n getFormattedSelectedMaxValue: IPriceObject[] | undefined;\r\n}\r\n\r\n/**\r\n * Range refine item state\r\n */\r\nexport interface IRangeRefineItemState extends IRefineItemState {\r\n validationErrorMin: string | undefined;\r\n validationErrorMax: string | undefined;\r\n selectedMin: string | undefined;\r\n selectedMax: string | undefined;\r\n touchedMin: boolean;\r\n touchedMax: boolean;\r\n formattedSelectedMin: IPriceObject[] | undefined;\r\n formattedSelectedMax: IPriceObject[] | undefined;\r\n}\r\n\r\nexport interface IPriceObject {\r\n priceValue: string;\r\n selected: boolean;\r\n disabled: boolean;\r\n}\r\n\r\n/**\r\n * RangeRefineItem component (controlled by RefineSubmenu)\r\n */\r\n@observer\r\nexport default class RangeRefineItem extends React.Component<IRangeRefineItemProps, IRangeRefineItemState> {\r\n @computed get currencyCode(): string {\r\n return this.props.productRefinerValue.UnitText || '';\r\n }\r\n\r\n public min = this.props.productRefinerValue.LeftValueBoundString || '0';\r\n public max = this.props.productRefinerValue.RightValueBoundString || this.props.productRefinerValue.RightValueBoundString;\r\n private _formattedPriceReverseLookup: Map<string, string> = new Map();\r\n\r\n private minInput: React.RefObject<HTMLSelectElement>;\r\n private maxInput: React.RefObject<HTMLSelectElement>;\r\n\r\n constructor(props: IRangeRefineItemProps) {\r\n super(props);\r\n\r\n this.minInput = React.createRef<HTMLSelectElement>();\r\n this.maxInput = React.createRef<HTMLSelectElement>();\r\n\r\n const { productRefinerValue } = this.props;\r\n const initialMin = (productRefinerValue && productRefinerValue.LeftValueBoundString) || '0';\r\n const initialMax = (productRefinerValue && productRefinerValue.RightValueBoundString) || undefined;\r\n this.state = {\r\n isChecked: false,\r\n validationErrorMin: undefined,\r\n validationErrorMax: undefined,\r\n selectedMin: initialMin,\r\n selectedMax: initialMax,\r\n touchedMin: false,\r\n touchedMax: false,\r\n formattedSelectedMin: props.getFormattedSelectedMinValue,\r\n formattedSelectedMax: props.getFormattedSelectedMaxValue\r\n };\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error(\r\n 'Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy'\r\n );\r\n return undefined;\r\n }\r\n if (this.props.rangeType === 'input') {\r\n return this._renderInputFields();\r\n }\r\n\r\n return this._renderSlider();\r\n }\r\n\r\n private _renderInputFields = (): JSX.Element | undefined => {\r\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n const { validationErrorMin, validationErrorMax } = this.state;\r\n\r\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', parentProductRefinerHierarchy.KeyName || '');\r\n const formAttrs = {\r\n 'aria-label': rangeAriaLabel,\r\n 'aria-disabled': isDisabled\r\n };\r\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${\r\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\r\n }`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\r\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\r\n }`;\r\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\r\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\r\n const { formattedSelectedMax, formattedSelectedMin } = this.state;\r\n return (\r\n <form className='ms-refine-submenu__input-range-refiner' {...formAttrs}>\r\n <label className={minLabelClassName}>\r\n {refineItemCommonProps.minLabel} ({'£'})\r\n <select className={minInputClassName} onChange={this._finishChangeMin} ref={this.minInput}>\r\n {formattedSelectedMin &&\r\n formattedSelectedMin.map((value, key) => {\r\n return (\r\n <option key={value.priceValue} selected={value.selected} role='button' value={value.priceValue}>\r\n {value.priceValue}\r\n </option>\r\n );\r\n })}\r\n </select>\r\n </label>\r\n <label className={maxLabelClassName}>\r\n {refineItemCommonProps.maxLabel} ({'£'})\r\n <select\r\n className={maxInputClassName}\r\n placeholder={formattedSelectedMax ? undefined : refineItemCommonProps.placeholderTextMax}\r\n onChange={this._finishChangeMax}\r\n ref={this.maxInput}\r\n >\r\n {formattedSelectedMax &&\r\n formattedSelectedMax.map((value, key) => {\r\n return (\r\n <option key={value.priceValue} selected={value.selected} role='button' value={value.priceValue}>\r\n {value.priceValue}\r\n </option>\r\n );\r\n })}\r\n </select>\r\n </label>\r\n {validationErrorMin && (\r\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-min-error-text'>\r\n {validationErrorMin}\r\n </span>\r\n )}\r\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\r\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-max-error-text'>\r\n {validationErrorMax}\r\n </span>\r\n )}\r\n </form>\r\n );\r\n };\r\n\r\n private _renderSlider = (): JSX.Element | undefined => {\r\n const { isDisabled, productRefinerValue, parentProductRefinerHierarchy, selectedRefinementCriterion } = this.props;\r\n const min = productRefinerValue.LeftValueBoundString;\r\n const max = productRefinerValue.RightValueBoundString;\r\n const selectedMin =\r\n (selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString) ||\r\n productRefinerValue.LeftValueBoundString ||\r\n '0';\r\n const selectedMax =\r\n (selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString) ||\r\n productRefinerValue.RightValueBoundString ||\r\n max;\r\n const sliderId = `slider_${parentProductRefinerHierarchy.RecordId}_${productRefinerValue.RefinerRecordId}`;\r\n const ariaAttributes = {\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n const minPrice = this._formatPrice(min);\r\n const maxPrice = this._formatPrice(max);\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n\r\n return (\r\n <Slider\r\n className={'ms-refine-submenu__range-refiner'}\r\n key={sliderId}\r\n id={sliderId}\r\n inForm={false}\r\n min={(min && Number(min)) || undefined}\r\n max={(max && Number(max)) || undefined}\r\n step={1}\r\n orientation={'horizontal'}\r\n labels={[\r\n {\r\n labelId: `${sliderId}_start`,\r\n labelString: `${minPrice}`,\r\n labelPositioning: 'start'\r\n },\r\n {\r\n labelId: `${sliderId}_end`,\r\n labelString: `${maxPrice}`,\r\n labelPositioning: 'end'\r\n }\r\n ]}\r\n showLabels={true}\r\n showTooltip={true}\r\n sliderThumbs={[\r\n {\r\n id: `${sliderId}_slider_thumb_start`,\r\n value: (selectedMin && Number(selectedMin)) || 0,\r\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMinPrice}`\r\n },\r\n {\r\n id: `${sliderId}_slider_thumb_end`,\r\n value: Number(selectedMax) || Number(maxPrice),\r\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMaxPrice}`\r\n }\r\n ]}\r\n onChangeEnd={this._onRangeUpdateEnd}\r\n onChange={debounce(this._onRangeUpdate, 500)}\r\n handleTooltipText={this._handleRangeTooltipText}\r\n {...ariaAttributes}\r\n />\r\n );\r\n };\r\n\r\n private _finishChangeMin = (event: React.FocusEvent<HTMLSelectElement>): boolean => {\r\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n const selectedMaxValue = this.maxInput.current!.value;\r\n const priceObjectArray = [...this.props.getFormattedSelectedMinValue!];\r\n const selectedPriceObject = priceObjectArray.find(x => x.priceValue === selectedMinValue);\r\n const previousPriceObject = priceObjectArray.find(x => x.selected === true);\r\n priceObjectArray.map((value, index) => {\r\n if (selectedPriceObject && selectedPriceObject.priceValue === value.priceValue) {\r\n selectedPriceObject.selected = true;\r\n }\r\n if (previousPriceObject && previousPriceObject.priceValue === value.priceValue) {\r\n previousPriceObject.selected = false;\r\n }\r\n return value;\r\n });\r\n this.setState({\r\n selectedMin: selectedMinValue,\r\n minTouched: false\r\n });\r\n const minInput = Number(selectedMinValue);\r\n const maxInput = Number(selectedMaxValue);\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps } = this.props;\r\n const max = (productRefinerValue && productRefinerValue.RightValueBoundString) || undefined;\r\n\r\n const maxNum = max ? Number(max) : undefined;\r\n\r\n if (isNaN(minInput)) {\r\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Min');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minInput, maxNum)) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minInput,\r\n rangeEnd: maxInput\r\n });\r\n return true;\r\n } else {\r\n this._focus('Min');\r\n }\r\n\r\n return false;\r\n };\r\n\r\n private _finishChangeMax = (event: React.FocusEvent<HTMLSelectElement>): boolean => {\r\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n const selectedMinValue = this.minInput.current!.value;\r\n\r\n const priceObjectArray = [...this.props.getFormattedSelectedMaxValue!];\r\n const selectedPriceObject = priceObjectArray.find(x => x.priceValue === selectedMaxValue);\r\n const previousPriceObject = priceObjectArray.find(x => x.selected === true);\r\n priceObjectArray.map((value, index) => {\r\n if (selectedPriceObject && selectedPriceObject.priceValue === value.priceValue) {\r\n selectedPriceObject.selected = true;\r\n }\r\n if (previousPriceObject && previousPriceObject.priceValue === value.priceValue) {\r\n previousPriceObject.selected = false;\r\n }\r\n return value;\r\n });\r\n\r\n this.setState({\r\n selectedMax: selectedMaxValue,\r\n maxTouched: false\r\n });\r\n const maxInput = Number(selectedMaxValue);\r\n const minInput = Number(selectedMinValue); // here is the value\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps } = this.props;\r\n const min = (productRefinerValue && productRefinerValue.LeftValueBoundString) || '0';\r\n\r\n const minNum = Number(min);\r\n\r\n if (isNaN(maxInput)) {\r\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Max');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minNum, maxInput)) {\r\n if (productRefinerValue) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minInput,\r\n rangeEnd: maxInput\r\n });\r\n } else {\r\n this._focus('Max');\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n private _focus = (inputType: InputType): void => {\r\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\r\n\r\n setTimeout(() => {\r\n if (ref && ref.current) {\r\n ref.current.focus();\r\n }\r\n }, 50);\r\n };\r\n\r\n private _validateRange = (min: number, max: number | undefined): boolean => {\r\n const { refineItemCommonProps } = this.props;\r\n if (max === undefined) {\r\n return true;\r\n }\r\n\r\n if (min > max) {\r\n this.setState({\r\n validationErrorMin: refineItemCommonProps.validationErrorRange,\r\n validationErrorMax: refineItemCommonProps.validationErrorRange\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n private _formatPrice = (amount: string | undefined): string => {\r\n const locale = this.props.refineItemCommonProps.locale;\r\n const result = formatPrice(amount, this.currencyCode, locale, this.props.refineItemCommonProps.telemetry);\r\n\r\n if (amount !== undefined && !this._formattedPriceReverseLookup.has(result)) {\r\n this._formattedPriceReverseLookup.set(result, amount);\r\n }\r\n\r\n return result;\r\n };\r\n\r\n private _getInputWithoutFormatting = (input: string): string => {\r\n // First try to cast raw input to a number\r\n const inputAsNum = Number(input);\r\n if (!isNaN(inputAsNum)) {\r\n return input;\r\n }\r\n\r\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\r\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\r\n return reverseLookupResult || input;\r\n };\r\n\r\n private _onRangeUpdate = (sliderChangeNotification: Readonly<ISliderChangeNotification>): void => {\r\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\r\n if (sliderChangeNotification.eventType !== 'mousemove') {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n };\r\n\r\n private _onRangeUpdateEnd = (sliderChangeNotification: Readonly<ISliderChangeNotification>): void => {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n };\r\n\r\n private _focusOnSliderThumb = (sliderChangeNotification: Readonly<ISliderChangeNotification>): void => {\r\n if (sliderChangeNotification.id) {\r\n const element = document.getElementById(sliderChangeNotification.id);\r\n if (!!element) {\r\n setTimeout(() => {\r\n element.focus();\r\n }, 0);\r\n }\r\n }\r\n };\r\n\r\n private _handleRangeTooltipText = (tooltip: number): string => {\r\n return this._formatPrice(`${tooltip}`);\r\n };\r\n}\r\n","import { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\n// import { RatingComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { IRefineItemToggleNotification, IRefineItemCommonProps } from '@msdyn365-commerce-modules/search-result-container/dist/types';\r\nimport { ProductRefinerSource, ProductRefinerTypeValue } from './utilities';\r\n\r\n/**\r\n * RefineItem properties\r\n */\r\nexport interface IRefineItemProps {\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n context: ICoreContext;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n onToggle(notfication: Readonly<IRefineItemToggleNotification>): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine item state\r\n */\r\nexport interface IRefineItemState extends React.ComponentState {\r\n isChecked: boolean;\r\n renderingError?: object;\r\n}\r\n\r\n/**\r\n * Single-select and multi-select refine item component (controlled by RefineSubmenu)\r\n */\r\nclass RefineItem extends React.Component<IRefineItemProps, IRefineItemState> {\r\n private anchorType: React.RefObject<HTMLAnchorElement>;\r\n\r\n constructor(props: IRefineItemProps) {\r\n super(props);\r\n this._onClick = this._onClick.bind(this);\r\n this.state = {\r\n isChecked: !!this.props.selectedRefinementCriterion\r\n };\r\n this.anchorType = React.createRef();\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n selectedRefinementCriterion,\r\n children,\r\n onToggle,\r\n context,\r\n ...attrs\r\n } = this.props;\r\n if (!productRefinerValue) {\r\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\r\n return undefined;\r\n }\r\n if (!productRefinerValue.LeftValueBoundString) {\r\n refineItemCommonProps.telemetry.warning(\r\n `[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`\r\n );\r\n }\r\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single;\r\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\r\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\r\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\r\n const role = isSingleSelect ? 'radio' : undefined;\r\n itemTypeClassName = !!selectedRefinementCriterion ? `${itemTypeClassName}-checked` : itemTypeClassName;\r\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\r\n if (productRefinerValue.LeftValueBoundString) {\r\n return (\r\n <li\r\n className='ms-refine-submenu-item'\r\n role='radio'\r\n aria-checked='false'\r\n id={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString}`}\r\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString}`}\r\n >\r\n <a\r\n href={this._getRefinerUrl()}\r\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString}`}\r\n onClick={this._onClick}\r\n >\r\n <span className='refine-submenu-item__rating'>\r\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\r\n </span>\r\n </a>\r\n </li>\r\n );\r\n } else {\r\n return undefined;\r\n }\r\n } else {\r\n return (\r\n <li\r\n className='ms-refine-submenu-item'\r\n role={role}\r\n id={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundString}`}\r\n >\r\n <a\r\n key={!!selectedRefinementCriterion ? 'true' : 'false'}\r\n ref={this.anchorType}\r\n href={this._getRefinerUrl()}\r\n tabIndex={0}\r\n onClick={this._onClick}\r\n className={itemTypeClassName}\r\n role={inputType}\r\n aria-checked={!!selectedRefinementCriterion}\r\n {...attrs}\r\n >\r\n <span className='ms-refine-submenu-item__label'>\r\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\r\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\r\n </span>\r\n </a>\r\n </li>\r\n );\r\n }\r\n }\r\n\r\n private _getRefinerUrl = (): string => {\r\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n\r\n if (productRefinerValue) {\r\n return urlBuilder({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n }\r\n\r\n return '';\r\n };\r\n\r\n private _onClick = (e: React.MouseEvent<HTMLAnchorElement | HTMLInputElement>): void => {\r\n e.preventDefault();\r\n\r\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n if (productRefinerValue) {\r\n this.props.onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n\r\n setTimeout(() => {\r\n this.anchorType.current && this.anchorType.current.focus();\r\n }, 0);\r\n }\r\n };\r\n}\r\nexport default RefineItem;\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 * as React from 'react';\r\n\r\nimport { Button, Collapse } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport RangeRefineItem, { RangeRefineItemType, IPriceObject } from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { IRefineItemToggleNotification, IRefineItemCommonProps } from '@msdyn365-commerce-modules/search-result-container/dist/types';\r\n// import { IRefineItemCommonProps } from '@msdyn365-commerce-modules/search-result-container/dist/types';\r\nimport { findMatchingRefinementCriterion, ProductRefinerTypeValue, ProductRefinerValueDataTypeValue } from './utilities';\r\n\r\n/**\r\n * Properties associated with the RefineSubmenu component\r\n */\r\nexport interface IRefineSubmenuProps {\r\n tempRangeTypeTODO: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n productRefinerHierarchy: IProductRefinerHierarchy;\r\n selectedRefinerValues: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n isExpandedOnInitialLoad: boolean;\r\n context: ICoreContext;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n className: string;\r\n isOpen: boolean;\r\n refinerId: number;\r\n onUpdateRefiners(notfication: Readonly<IRefineItemToggleNotification>): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n toggleAllRefiners(activeRefiner: number): void;\r\n // onGameItemClick(val1:string, val2:string): any;\r\n}\r\n\r\n/**\r\n * Refine submenu state\r\n */\r\nexport interface IRefineSubmenuState extends React.ComponentState {\r\n expanded: boolean;\r\n isMobile: boolean;\r\n minPricesObject?: IPriceObject[] | undefined;\r\n maxPricesObject?: IPriceObject[] | undefined;\r\n}\r\n\r\n/**\r\n *\r\n * The RefineSubmenu component renders the submenu category and child items.\r\n * This computed observes the stateful category hierarchy object.\r\n * @extends {React.PureComponent<IRefineSubmenuProps>}\r\n */\r\nclass RefineSubmenu extends React.Component<IRefineSubmenuProps, IRefineSubmenuState> {\r\n constructor(props: IRefineSubmenuProps) {\r\n super(props);\r\n this._onToggleItem = this._onToggleItem.bind(this);\r\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\r\n let isExpanded = this.props.isExpandedOnInitialLoad;\r\n if (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\r\n isExpanded = false;\r\n }\r\n const leftValueString = props.productRefinerHierarchy.Values[0].LeftValueBoundString;\r\n const rightValueString = props.productRefinerHierarchy.Values[0].RightValueBoundString;\r\n\r\n this.state = {\r\n expanded: isExpanded,\r\n minPricesObject: this._getFormattedSelectedValue(leftValueString, rightValueString, 'min'),\r\n maxPricesObject: this._getFormattedSelectedValue(leftValueString, rightValueString, 'max'),\r\n isMobile: props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? true : false\r\n };\r\n }\r\n\r\n public toggleAllRefiners = () => {\r\n this.props.toggleAllRefiners(this.props.refinerId);\r\n };\r\n\r\n public render(): JSX.Element | null {\r\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\r\n }\r\n\r\n return (\r\n <div className={`${this.props.className} ms-refine-submenu list-group`}>\r\n <Button\r\n className={this.props.isOpen ? 'ms-refine-submenu__toggle_expanded' : 'ms-refine-submenu__toggle_collapsed'}\r\n aria-label={productRefinerHierarchy.KeyName || 'refiner.Name'}\r\n onClick={this.toggleAllRefiners}\r\n aria-expanded={this.props.isOpen}\r\n >\r\n {productRefinerHierarchy.KeyName}\r\n </Button>\r\n <Collapse isOpen={this.props.isOpen} timeout={50}>\r\n <div className='collapse-close' role='button' onClick={this.toggleAllRefiners} />\r\n {this._renderChildItems(productRefinerHierarchy)}\r\n {!this.state.isMobile && <Button onClick={this.toggleAllRefiners}>Done</Button>}\r\n </Collapse>\r\n </div>\r\n );\r\n }\r\n\r\n private _getFormattedSelectedValue = (\r\n selectedMin: string | undefined,\r\n selectedMax: string | undefined,\r\n type: string | undefined\r\n ): IPriceObject[] | undefined => {\r\n const differenceValue = 2;\r\n const minPrice = selectedMin ? Math.floor(Number(selectedMin)) : 0;\r\n const maxPrice = selectedMax ? Math.ceil(Number(selectedMax)) : 0;\r\n const minPr: string[] = [];\r\n const maxPr: string[] = [];\r\n let minPrices: IPriceObject[] = [];\r\n let maxPrices: IPriceObject[] = [];\r\n if (type === 'min') {\r\n for (let i = minPrice; i <= maxPrice; i += differenceValue) {\r\n minPr.push(i.toString());\r\n }\r\n minPrices = minPr.map((value, index) => {\r\n let obj: IPriceObject;\r\n if (index === 0) {\r\n obj = { priceValue: value, selected: true, disabled: false };\r\n } else {\r\n obj = { priceValue: value, selected: false, disabled: false };\r\n }\r\n return obj;\r\n });\r\n return minPrices;\r\n } else {\r\n if (selectedMin && selectedMax && selectedMin === selectedMax) {\r\n maxPrices.push({ priceValue: selectedMax.toString(), selected: true, disabled: false });\r\n } else {\r\n for (let i = minPrice + differenceValue; i <= maxPrice; i += differenceValue) {\r\n maxPr.push(i.toString());\r\n }\r\n let flag: boolean = false;\r\n maxPrices = maxPr.map((value, index) => {\r\n let obj: IPriceObject;\r\n obj = { priceValue: value, selected: false, disabled: false };\r\n const val = Number(value);\r\n if (maxPrice - val < differenceValue) {\r\n flag = true;\r\n }\r\n return obj;\r\n });\r\n if (flag && maxPrices.length) {\r\n const lastRange = Number(maxPrices[maxPrices.length - 1].priceValue);\r\n maxPrices.push({ priceValue: (lastRange + differenceValue).toString(), selected: true, disabled: false });\r\n }\r\n }\r\n\r\n return maxPrices;\r\n }\r\n };\r\n\r\n private _renderChildItems = (productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null => {\r\n switch (productRefinerHierarchy.DataTypeValue) {\r\n case ProductRefinerValueDataTypeValue.Range:\r\n case ProductRefinerValueDataTypeValue.RangeInput:\r\n return this._renderRange(productRefinerHierarchy);\r\n default:\r\n return this._renderSingleMultiSelect(productRefinerHierarchy);\r\n }\r\n };\r\n\r\n private _renderSingleMultiSelect = (productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null => {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context } = this.props;\r\n const isSingleSelect = productRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single;\r\n const role = isSingleSelect ? { role: 'radiogroup' } : undefined;\r\n const refinerValuesList = productRefinerHierarchy.Values || [];\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n return (\r\n <RefineItem\r\n parentProductRefinerHierarchy={productRefinerHierarchy}\r\n productRefinerValue={child}\r\n selectedRefinementCriterion={selectedRefinementCriterion}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n key={index}\r\n context={context}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n />\r\n );\r\n });\r\n return (\r\n <ul className='ms-refine-submenu__list' {...role} aria-label={productRefinerHierarchy.KeyName}>\r\n {listItems}\r\n </ul>\r\n );\r\n };\r\n\r\n private _renderRange = (productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null => {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n selectedRefinerValues,\r\n context,\r\n minValueSliderThumbAriaLabel,\r\n maxValueSliderThumbAriaLabel\r\n } = this.props;\r\n\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = productRefinerHierarchy.Values || [];\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n // TODO BUGBUG 22424559 determine only from the DataTypeValue once live example is working (can test with the tempRangeTypeTODO derived from QSP until then)\r\n const rangeType =\r\n productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.RangeInput ||\r\n this.props.tempRangeTypeTODO === 'input'\r\n ? 'input'\r\n : 'input';\r\n const key = selectedRefinementCriterion\r\n ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}`\r\n : `not-selected-${index}`;\r\n return (\r\n <li className={`${submenuClassNamePrefix}--range`} key={index}>\r\n <RangeRefineItem\r\n parentProductRefinerHierarchy={productRefinerHierarchy}\r\n productRefinerValue={child}\r\n selectedRefinementCriterion={selectedRefinementCriterion}\r\n getFormattedSelectedMinValue={this.state.minPricesObject}\r\n getFormattedSelectedMaxValue={this.state.maxPricesObject}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n rangeType={rangeType}\r\n key={key}\r\n context={context}\r\n minValueSliderThumbAriaLabel={minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={maxValueSliderThumbAriaLabel}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n />\r\n </li>\r\n );\r\n });\r\n return <ul className='ms-refine-submenu__list list-unstyled'>{listItems}</ul>;\r\n };\r\n\r\n private _onToggleItem = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n };\r\n\r\n private _onToggleSubmenu = (): void => {\r\n this.setState(prevState => ({\r\n expanded: !prevState.expanded\r\n }));\r\n };\r\n}\r\n\r\nexport default RefineSubmenu;\r\n","import { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport { IRefineItemToggleNotification } from '@msdyn365-commerce-modules/search-result-container/dist/types';\r\n\r\n/**\r\n * Types of product refiner values\r\n */\r\nexport const enum ProductRefinerValueDataTypeValue {\r\n /**\r\n * Range slider is used for selections like price\r\n */\r\n Range = 1,\r\n\r\n /**\r\n * Range input is a different way to specify ranges and can be expressed with input boxes\r\n * as well as a set of discrete single-select type values\r\n */\r\n RangeInput = 4,\r\n\r\n /**\r\n * This is a discrete list item, either multi-select or single-select\r\n */\r\n List = 5,\r\n\r\n /**\r\n * Boolean types allows only single-select\r\n */\r\n Boolean = 6\r\n}\r\n\r\n/**\r\n * Types of product refiners\r\n */\r\nexport const enum ProductRefinerTypeValue {\r\n /**\r\n * Refiner values are single-select\r\n */\r\n Single = 0,\r\n\r\n /**\r\n * Refiner values are multi-select\r\n */\r\n Multi = 1\r\n}\r\n\r\n/**\r\n * ProductRefinerSource enum type.\r\n */\r\nexport const enum ProductRefinerSource {\r\n /**\r\n * The None member.\r\n */\r\n None = 0,\r\n /**\r\n * The Attribute member.\r\n */\r\n Attribute = 1,\r\n /**\r\n * The Category member.\r\n */\r\n Category = 2,\r\n /**\r\n * The Price member.\r\n */\r\n Price = 3,\r\n /**\r\n * The Rating member.\r\n */\r\n Rating = 4\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value\r\n * @param productRefinerValue product refiner value to match\r\n * @param refinementCriteria selected refinement criteria\r\n */\r\nexport function findMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue | undefined {\r\n // if the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriteria.find((refinementCriterion: ProductRefinerValue) =>\r\n isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value\r\n * @param productRefinerValue product refiner value to match\r\n * @param refinementCriteria selected refinement criteria\r\n */\r\nexport function isMatchingRefinementCriterion(productRefinerValue: ProductRefinerValue, refinementCriterion: ProductRefinerValue): boolean {\r\n // if the value is a range, then match only on data type value; otherwise match on item string\r\n return (\r\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\r\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\r\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\r\n (refinementCriterion.DataTypeValue === ProductRefinerValueDataTypeValue.Range ||\r\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\r\n );\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: IRefineItemToggleNotification,\r\n currentRefinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue[] {\r\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\r\n let toggledItemFound = false;\r\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\r\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\r\n toggledItemFound = true;\r\n if (itemToggleNotification.isSelecting) {\r\n const next = {\r\n ...selectedCriterion,\r\n LeftValueBoundString:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n selectedCriterion.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n } // else the item is being de-selected, so omit it from the refinement criteria\r\n } else {\r\n // keep existing criterion because it is not in the item toggle notification\r\n updatedRefinementCriteria.push(selectedCriterion);\r\n }\r\n });\r\n\r\n if (!toggledItemFound) {\r\n const next = {\r\n ...itemToggleNotification.productRefinerValue,\r\n LeftValueBoundString:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n itemToggleNotification.productRefinerValue.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n // If single select, then deselect any others in the parent refiner group\r\n if (\r\n (itemToggleNotification.productRefinerValue.DataTypeValue === ProductRefinerValueDataTypeValue.List ||\r\n itemToggleNotification.productRefinerValue.DataTypeValue === ProductRefinerValueDataTypeValue.Boolean) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single\r\n ) {\r\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\r\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\r\n // do nothing\r\n } else {\r\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) =>\r\n isMatchingRefinementCriterion(child, criterion)\r\n );\r\n if (matchingIndex > -1) {\r\n updatedRefinementCriteria.splice(matchingIndex, 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n return updatedRefinementCriteria;\r\n}\r\n\r\nexport function formatPrice(\r\n amount: string | undefined,\r\n currency: string | undefined,\r\n locale: string | undefined,\r\n telemetry: ITelemetry\r\n): string {\r\n if (!amount || !currency) {\r\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency: currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (e) {\r\n // result = `${priceAmount} ${currency}`;\r\n result = `${priceAmount}`;\r\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${e}`);\r\n }\r\n\r\n return result;\r\n}\r\n","import {\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISearchResultModalViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps,\r\n IChoiceSummaryClickNotification,\r\n isMatchingRefinementCriterion,\r\n ISearchResultContainerData\r\n} from '@msdyn365-commerce-modules/search-result-container';\r\n// import { IMandsSearchResultContainerProps } from '../definition-extensions/mands-search-result-container.ext.props.autogenerated';\r\nimport { Module, Node, LabeledDropdown } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport RefineSubmenu from './custom-components/refine-submenu';\r\nimport ChoiceSummary from './custom-components/choice-summary';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport { IMandsSearchResultContainerProps } from '../../../modules/mands-search-result-container';\r\ninterface IState {\r\n rating: boolean;\r\n activeRefiner: number;\r\n}\r\n\r\n/**\r\n *\r\n * SearchResultContainerView component\r\n * @extends {React.PureComponent<ISearchResultContainerViewProps>}\r\n */\r\n\r\nexport class SearchResultContainerView extends React.PureComponent<\r\n ISearchResultContainerViewProps & IMandsSearchResultContainerProps<ISearchResultContainerData>,\r\n IState\r\n> {\r\n public _sortAndFilterContainerRef: React.RefObject<LabeledDropdown>;\r\n constructor(props: ISearchResultContainerViewProps & IMandsSearchResultContainerProps<ISearchResultContainerData>) {\r\n super(props);\r\n this.state = {\r\n rating: false,\r\n activeRefiner: -1\r\n };\r\n this._sortAndFilterContainerRef = React.createRef<LabeledDropdown>();\r\n }\r\n public render(): JSX.Element {\r\n const { props } = this;\r\n const mobileView =\r\n props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? true : false;\r\n const {\r\n SearchResultContainer,\r\n products,\r\n pagination,\r\n ProductsContainer,\r\n ProductSectionContainer,\r\n isMobile,\r\n modalToggle,\r\n searchResultModal,\r\n TitleViewProps,\r\n refineMenu,\r\n categoryHierarchy,\r\n sortByOptions,\r\n CategoryNavContainer,\r\n RefineAndProductSectionContainer,\r\n errorMessage\r\n } = this.props;\r\n let { choiceSummary } = this.props;\r\n choiceSummary = this._getChoiceSummary();\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {this.renderCategoryHierarchy(categoryHierarchy)}\r\n {props.slots && props.slots.content && (\r\n <div>\r\n {props.slots.content.map((children: React.ReactNode, index: number) => {\r\n return (\r\n <div className='col-12' key={index}>\r\n {children}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n {this.renderTitle(TitleViewProps)}\r\n {modalToggle}\r\n {TitleViewProps.title.titleCount}\r\n {this.createSearchResultModal(searchResultModal, refineMenu, sortByOptions, mobileView)}\r\n\r\n <Node {...ProductSectionContainer}>\r\n <div className='row search-result-row'>\r\n <div className='col-xs-6 col-lg-7 product-quantity'>\r\n <div className='filters-refine'>\r\n <i className='filter-icon' />\r\n {pagination}\r\n </div>\r\n <Node {...CategoryNavContainer}>{TitleViewProps && this.renderTitleCount(TitleViewProps)}</Node>\r\n </div>\r\n <div className='col-xs-6 col-md-6 col-lg-5'>{sortByOptions && this.renderSort(sortByOptions)}</div>\r\n </div>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n <div className='bottom-pagination-plp'>{pagination}</div>\r\n </Node>\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n <Node {...CategoryNavContainer}>{categoryHierarchy && this.renderCategoryHierarchy(categoryHierarchy)}</Node>\r\n {props.slots && props.slots.content && (\r\n <div>\r\n {props.slots.content.map((children: React.ReactNode, index: number) => {\r\n return (\r\n <div className='col-12' key={index}>\r\n {children}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n <Node {...RefineAndProductSectionContainer}>\r\n {refineMenu && this.renderRefiner(refineMenu, mobileView)}\r\n {choiceSummary}\r\n <Node {...ProductSectionContainer}>\r\n <div className='ms-search-result-wrapper-title-choice-summary'>\r\n {TitleViewProps && this.renderTitle(TitleViewProps)}\r\n </div>\r\n {TitleViewProps.title.titleCount}\r\n <div className='ms-search-result-wrapper-sort-by-category'>{sortByOptions && this.renderSort(sortByOptions)}</div>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n }\r\n public componentDidMount = () => {\r\n this.hideRatingFromSortDropdown();\r\n };\r\n\r\n public componentDidUpdate = () => {\r\n this.hideRatingFromSortDropdown();\r\n };\r\n\r\n public hideRatingFromSortDropdown = () => {\r\n const sort = document.getElementById('categorySortByDropdown') as HTMLSelectElement;\r\n if (sort && sort.options) {\r\n for (let i = 0; i < sort.options.length; i++) {\r\n if (sort.options[i].value.includes('Rating')) {\r\n sort.options[i].style.display = 'none';\r\n }\r\n if (sort.options[i].value.includes('Price: Low to High')) {\r\n sort.options[i].style.display = 'none';\r\n }\r\n if (sort.options[i].value.includes('Price: High to Low')) {\r\n sort.options[i].style.display = 'none';\r\n }\r\n }\r\n }\r\n };\r\n\r\n public createSearchResultModal = (\r\n modalProps: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n mobileView: boolean\r\n ): JSX.Element => {\r\n return React.cloneElement(\r\n modalProps.modal,\r\n {},\r\n modalProps.modalHeader,\r\n this.createModalBody(modalProps, refineMenu, sortByDropDown, mobileView),\r\n modalProps.modalFooter\r\n );\r\n };\r\n\r\n private createModalBody = (\r\n props: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n mobileView: boolean\r\n ): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, this.renderSort(sortByDropDown), this.renderRefiner(refineMenu, mobileView));\r\n }\r\n return null;\r\n };\r\n\r\n private renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h5>{title.titleCount}</h5>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n };\r\n\r\n private setRating = () => {\r\n return () => this.setState({ rating: !this.state.rating });\r\n };\r\n\r\n private renderRefiner = (props: IRefineMenuViewProps, isMobile: boolean): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n const { rating } = this.state;\r\n isMobile = this.props.isMobile;\r\n let { choiceSummary } = this.props;\r\n choiceSummary = this._getChoiceSummary();\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {!isMobile &&\r\n refiners.map((submenu, index) => submenu !== null && index < 6 && this.renderSubmenu(submenu, index, rating))}\r\n {!isMobile && refiners.length > 6 && !rating && (\r\n <div role='button' className='show-more' onClick={this.setRating}>\r\n {'Show all filters'}\r\n </div>\r\n )}\r\n </Node>\r\n <Node {...RefineMenuContainer}>\r\n {isMobile ? (\r\n <div className='ms-search-result__toggle'>\r\n <div className='ms-search-result__collection-count'>{this.props.TitleViewProps.title.titleCount}</div>\r\n <div className='ms-search-result__choice-summary'>{choiceSummary}</div>\r\n </div>\r\n ) : null}\r\n {!isMobile &&\r\n refiners.map(\r\n (submenu, index) => submenu !== null && index > 5 && rating && this.renderSubmenu(submenu, index, rating)\r\n )}\r\n {!isMobile && refiners.length > 6 && rating && (\r\n <div role='button' className='show-more' onClick={this.setRating}>\r\n {'Show less filters'}\r\n </div>\r\n )}\r\n {isMobile && refiners.map((submenu, index) => submenu !== null && this.renderSubmenu(submenu, index, rating))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n };\r\n\r\n private renderSort = (props: ISortByViewProps): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown) {\r\n return <Node {...SortingContainer}>{sortByDropDown}</Node>;\r\n }\r\n return null;\r\n };\r\n\r\n // @ts-ignore\r\n private renderSubmenu = (submenu, index: number, rating: boolean) => {\r\n const subMenu = submenu && submenu.props;\r\n if (subMenu.productRefinerHierarchy.KeyName.toLowerCase() === 'color') {\r\n subMenu.productRefinerHierarchy.KeyName = 'Colour';\r\n }\r\n return subMenu.productRefinerHierarchy.KeyName.toLowerCase() !== 'rating' &&\r\n subMenu.productRefinerHierarchy.KeyName.toLowerCase() !== 'category' ? (\r\n <RefineSubmenu\r\n productRefinerHierarchy={subMenu.productRefinerHierarchy}\r\n selectedRefinerValues={subMenu.selectedRefinerValues}\r\n refineItemCommonProps={subMenu.refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={subMenu.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={subMenu.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={subMenu.onUpdateRefiners}\r\n urlBuilder={subMenu.urlBuilder}\r\n isExpandedOnInitialLoad={false}\r\n tempRangeTypeTODO={subMenu.tempRangeTypeTODO}\r\n context={subMenu.context}\r\n moduleId={subMenu.moduleId}\r\n moduleTypeName={subMenu.moduleTypeName}\r\n className={index === 4 && !rating ? 'hidden' : ''}\r\n isDisabled={false}\r\n refinerId={index}\r\n toggleAllRefiners={this.toggleAllRefiners}\r\n isOpen={this.state.activeRefiner === index && this.state.activeRefiner !== -1 ? true : false}\r\n />\r\n ) : null;\r\n };\r\n\r\n private toggleAllRefiners = (activeRefiner: number) => {\r\n const currentRefinerState = this.state.activeRefiner;\r\n if (activeRefiner === currentRefinerState) {\r\n this.setState({ activeRefiner: -1 });\r\n } else {\r\n this.setState({ activeRefiner });\r\n }\r\n };\r\n private renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\r\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\r\n if (categoryHierarchyList) {\r\n return (\r\n <Node {...CategoryHierarchyContainer}>\r\n {categoryHierarchyList.map((category, index) => (\r\n <React.Fragment key={index}>\r\n {category}\r\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n );\r\n }\r\n\r\n return null;\r\n };\r\n\r\n private renderTitle = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h1>{title.titleText}</h1>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n };\r\n private _getChoiceSummary = (): React.ReactNode | null => {\r\n const { resources, data, telemetry } = this.props;\r\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n const refinersData = data.refiners.result;\r\n if (!refinersData) {\r\n return null;\r\n }\r\n\r\n return (\r\n <ChoiceSummary\r\n classNames='ms-choice-summary-by-category'\r\n clearAllText={resources.clearAllText}\r\n label={resources.choiceSummaryLabel}\r\n selectedChoices={selectedRefiners}\r\n refinerHierarchy={refinersData}\r\n choiceFormat={resources.choiceFormat}\r\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\r\n telemetry={telemetry}\r\n onChoiceClicked={this._onChoiceClicked}\r\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\r\n choiceAriaLabel={resources.choiceAriaLabel}\r\n />\r\n );\r\n };\r\n private _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\r\n const { data, telemetry } = this.props;\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\r\n return;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!notification.clearAll) {\r\n const selectedChoice = notification.choiceClicked;\r\n if (!selectedChoice) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\r\n return;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n\r\n // set focus to sort and filter\r\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\r\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\r\n setTimeout(() => {\r\n dropdownElement && dropdownElement.focus();\r\n }, 50);\r\n }\r\n\r\n data.listPageState.result.currentPageNumber = 0;\r\n data.listPageState.result.activeFilters = currentRefinementCriteria;\r\n };\r\n private _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\r\n const { data, telemetry } = this.props;\r\n const fullUrl = this.props.context.request.url.requestUrl;\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\r\n return fullUrl.href;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!isClearAll) {\r\n if (!selectedRefiner) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\r\n return fullUrl.href;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n }\r\n\r\n return this.props.context.request.url.requestUrl.href;\r\n };\r\n}\r\n\r\nexport default SearchResultContainerView;\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport {\r\n IGroup,\r\n IGroups,\r\n IOrderConfirmationViewProps,\r\n IOrderInformation,\r\n ISalesLine,\r\n IHelp,\r\n IOrderSummary,\r\n IPaymentMethods\r\n} from '@msdyn365-commerce-modules/order-management';\r\nimport { IOrderConfirmationProps as IOrderConfirmationExtensionProps } from '../definition-extensions/order-confirmation.ext.props.autogenerated';\r\n\r\nimport { OrderShipments } from '@msdyn365-commerce/retail-proxy/dist/index';\r\n\r\nimport { ICheckoutViewProps } from '@msdyn365-commerce-modules/checkout/src/modules/checkout';\r\n\r\nimport { getLineItems } from './custom-components/get-line-items';\r\n\r\nimport { ICheckoutProps } from '@msdyn365-commerce-modules/checkout/src/modules/checkout/checkout.props.autogenerated';\r\nimport { ICheckoutData } from '@msdyn365-commerce-modules/checkout/src/modules/checkout/checkout.data';\r\n\r\nexport interface IState {\r\n orderTotal: string;\r\n contactDetails: string;\r\n}\r\n\r\nexport interface IOrderPlan {\r\n orderSummary: IOrderSummary | undefined;\r\n salesOrder: OrderShipments | undefined;\r\n salesLines: ISalesLine[] | undefined;\r\n}\r\n/**\r\n *\r\n * Order Confirmation Component\r\n * @extends {React.PureComponent<IOrderConfirmationViewProps & IOrderConfirmationExtensionProps<{}> & ICheckoutViewProps & ICheckoutProps<ICheckoutData>>}\r\n */\r\n\r\nexport class OrderConfirmationView extends React.PureComponent<\r\n IOrderConfirmationViewProps & IOrderConfirmationExtensionProps<{}> & ICheckoutViewProps & ICheckoutProps<ICheckoutData>,\r\n IState\r\n> {\r\n constructor(\r\n props: IOrderConfirmationViewProps & IOrderConfirmationExtensionProps<{}> & ICheckoutViewProps & ICheckoutProps<ICheckoutData>\r\n ) {\r\n super(props);\r\n this.state = {\r\n orderTotal: '',\r\n contactDetails: ''\r\n };\r\n }\r\n public render(): JSX.Element {\r\n const {\r\n moduleProps,\r\n orderInfomation,\r\n salesOrder,\r\n orderSummary,\r\n payment,\r\n salesLines,\r\n help,\r\n groups,\r\n config: { orderDetailsLabel }\r\n } = this.props;\r\n const lineItemsUpdated = getLineItems(this.props);\r\n let { lineItems } = this.props;\r\n lineItems;\r\n lineItems = lineItemsUpdated;\r\n const orderPlan: IOrderPlan = {\r\n orderSummary,\r\n salesOrder,\r\n salesLines\r\n };\r\n return (\r\n <Module {...moduleProps}>\r\n {this.renderHeading()}\r\n {orderInfomation && <this.OrderConfirmationOrderInfomation {...orderInfomation} />}\r\n {orderPlan && <this.renderOrderDeliveryPlan {...orderPlan} />}\r\n <div className='ms-order-confirmation__order-heading'>{orderDetailsLabel}</div>\r\n {groups && <this.OrderConfirmationGroups {...groups} />}\r\n {orderSummary && <this.PaymentDetails />}\r\n {payment && <this.OrderConfirmationPayment {...payment} />}\r\n <span />\r\n {this.renderContactDetails()}\r\n {this.renderLinks()}\r\n <span />\r\n {help && <this.OrderConfirmationHelp {...help} />}\r\n {this.renderHomePageLink()}\r\n </Module>\r\n );\r\n }\r\n public OrderConfirmationPayment: React.FC<IPaymentMethods> = ({ paymentMethodsProps, title }) => {\r\n const {\r\n data: {\r\n orderHydration: { result }\r\n }\r\n } = this.props;\r\n let cardType = result && result.salesOrder && result.salesOrder.TenderLines && result.salesOrder.TenderLines[0].CardTypeId;\r\n cardType = cardType && cardType.toLowerCase();\r\n const cardIconClass =\r\n cardType &&\r\n (cardType.includes('visa')\r\n ? 'visa-card-icon'\r\n : cardType.includes('master')\r\n ? 'master-card-icon'\r\n : cardType.includes('amex')\r\n ? 'american-exp-icon'\r\n : '');\r\n return (\r\n <Node {...paymentMethodsProps}>\r\n <h3>{title}</h3>\r\n <div className='row'>\r\n <div className='msc-payment-method__card-image'>\r\n <span className={`card-icon ${cardIconClass}`} />\r\n </div>\r\n </div>\r\n </Node>\r\n );\r\n };\r\n public renderOrderDeliveryPlan: React.FC<IOrderPlan> = orderPlan => {\r\n const { orderConfirmationNumberLabel, orderTotalLabel } = this.props.config;\r\n const {\r\n context: { cultureFormatter }\r\n } = this.props;\r\n const { salesOrder, salesLines } = orderPlan;\r\n const _shippingAddress = salesLines && salesLines[0] && salesLines[0].data && salesLines[0].data.salesLine.ShippingAddress;\r\n const _total: string = salesOrder && salesOrder.TotalAmount ? salesOrder.TotalAmount.toFixed(2) : '';\r\n const _name: string = _shippingAddress && _shippingAddress.Name ? _shippingAddress.Name : '';\r\n const _address: string = _shippingAddress && _shippingAddress.FullAddress ? _shippingAddress.FullAddress : '';\r\n this.setState({\r\n orderTotal: cultureFormatter.formatCurrency(_total),\r\n contactDetails: _name.concat(', ').concat(_address)\r\n });\r\n const orderID: string = salesOrder && salesOrder.ChannelReferenceId ? salesOrder.ChannelReferenceId : '';\r\n return (\r\n <div className='ms-order-delivery-wrap'>\r\n <p className='row'>\r\n {<span className='col-md-6 ms-order-delivery-plan__label'>{orderConfirmationNumberLabel}</span>}\r\n <span className='col-md-6 ms-order-delivery__value'>\r\n {' '}\r\n <strong>{orderID}</strong>\r\n </span>\r\n </p>\r\n <p className='row'>\r\n {<span className='col-md-6 ms-order-delivery-plan__label'>{orderTotalLabel}</span>}\r\n <span className='col-md-6 ms-order-delivery__value'>\r\n {' '}\r\n <strong>{cultureFormatter.formatCurrency(_total)}</strong>\r\n </span>\r\n </p>\r\n </div>\r\n );\r\n };\r\n public renderHomePageLink = () => {\r\n const {\r\n config: { backToHomePageLabel },\r\n app: {\r\n routes: { home }\r\n }\r\n } = this.props;\r\n return (\r\n backToHomePageLabel &&\r\n home.destinationUrl && (\r\n <div className='ms-order-confirmation__homepage-link' key='homepage-links'>\r\n <a href={home.destinationUrl}>{backToHomePageLabel}</a>\r\n </div>\r\n )\r\n );\r\n };\r\n public renderLinks = () => {\r\n const { returnPolicyLink } = this.props.config;\r\n return (\r\n returnPolicyLink &&\r\n returnPolicyLink.linkText && (\r\n <div className='ms-order-confirmation__links' key='links'>\r\n <a target='_blank' href={returnPolicyLink.linkUrl.destinationUrl}>\r\n <u>{returnPolicyLink.linkText}</u>\r\n </a>\r\n </div>\r\n )\r\n );\r\n };\r\n private renderContactDetails = () => {\r\n const {\r\n config: { contactDetailsLabel }\r\n } = this.props;\r\n return (\r\n <div className='ms-order-confirmation__contact-details' key='contact'>\r\n <h3>{contactDetailsLabel}</h3>\r\n <span>{this.state.contactDetails}</span>\r\n </div>\r\n );\r\n };\r\n private renderHeading = () => {\r\n const {\r\n config: { thankYouNote }\r\n } = this.props;\r\n return <h1 className='ms-order-confirmation__heading'>{thankYouNote}</h1>;\r\n };\r\n private OrderConfirmationOrderInfomation: React.FC<IOrderInformation> = ({ orderInformationProps }) => {\r\n const {\r\n config: { emailText }\r\n } = this.props;\r\n const receiptEmailID = this.props.data.orderHydration.result && this.props.data.orderHydration.result.salesOrder.ReceiptEmail;\r\n return (\r\n <Node {...orderInformationProps}>\r\n <p>\r\n {emailText}\r\n <strong>{receiptEmailID}</strong>\r\n </p>\r\n </Node>\r\n );\r\n };\r\n private OrderConfirmationSalesLine: React.FC<ISalesLine> = ({ salesLineProps, salesLine }) => (\r\n <Node {...salesLineProps}>{salesLine}</Node>\r\n );\r\n private OrderConfirmationGroup: React.FC<IGroup> = ({ groupProps, salesLinesProps, salesLines }) => (\r\n <Node {...groupProps}>\r\n {salesLines && (\r\n <Node {...salesLinesProps}>\r\n {salesLines.map(salesLine => (\r\n <this.OrderConfirmationSalesLine key={salesLine.data.salesLine.LineId} {...salesLine} />\r\n ))}\r\n </Node>\r\n )}\r\n </Node>\r\n );\r\n private OrderConfirmationGroups: React.FC<IGroups> = ({ groupsProps, groups }) => (\r\n <Node {...groupsProps}>\r\n {groups.map((group, index) => (\r\n <this.OrderConfirmationGroup key={index} {...group} />\r\n ))}\r\n </Node>\r\n );\r\n\r\n private PaymentDetails: React.FC = () => {\r\n const {\r\n config: { priceTotalLabel, deliveryTotalLabel, totalLabel, paymentDetailsLabel },\r\n context: { cultureFormatter }\r\n } = this.props;\r\n const totalExlDelivery = this.props.data.orderHydration.result && this.props.data.orderHydration.result.salesOrder.SubtotalAmount;\r\n const deliveryCharges = this.props.data.orderHydration.result && this.props.data.orderHydration.result.salesOrder.ChargeAmount;\r\n const totalCharges = this.props.data.orderHydration.result && this.props.data.orderHydration.result.salesOrder.GrossAmount;\r\n return (\r\n <div className='ms-order-confirmation__promotion' key='promotion-details'>\r\n {paymentDetailsLabel && <h3>{paymentDetailsLabel}</h3>}\r\n <p className='ms-order-confirmation__order-summary-line-subtotal'>\r\n <span className='ms-order-confirmation__order-summary-label'>{priceTotalLabel}</span>\r\n <span className='msc-price ms-order-confirmation__order-summary-price'>\r\n {totalExlDelivery && (\r\n <span className='msc-price__actual'>{cultureFormatter.formatCurrency(totalExlDelivery.toFixed(2))}</span>\r\n )}\r\n </span>\r\n </p>\r\n <p className='ms-order-confirmation__order-summary-line-shipping'>\r\n <span className='ms-order-confirmation__order-summary-label'>{deliveryTotalLabel}</span>\r\n <span className='msc-price ms-order-confirmation__order-summary-price'>\r\n {deliveryCharges && (\r\n <span className='msc-price__actual'>{cultureFormatter.formatCurrency(deliveryCharges.toFixed(2))}</span>\r\n )}\r\n </span>\r\n </p>\r\n <p className='ms-order-confirmation__order-summary-line-total'>\r\n <span className='ms-order-confirmation__order-summary-label'>{totalLabel}</span>\r\n <span className='msc-price ms-order-confirmation__order-summary-price'>\r\n {totalCharges && (\r\n <span className='msc-price__actual'>{cultureFormatter.formatCurrency(totalCharges.toFixed(2))}</span>\r\n )}\r\n </span>\r\n </p>\r\n </div>\r\n );\r\n };\r\n private OrderConfirmationHelp: React.FC<IHelp> = ({ helpProps, needHelpLabel, helpLineNumberLabel, contactNumber }) => (\r\n <Node {...helpProps}>\r\n {needHelpLabel}\r\n {helpLineNumberLabel}\r\n {contactNumber}\r\n </Node>\r\n );\r\n}\r\n\r\nexport default OrderConfirmationView;\r\n","import {\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISearchResultModalViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps,\r\n IChoiceSummaryClickNotification,\r\n isMatchingRefinementCriterion,\r\n ISearchResultContainerData\r\n} from '@msdyn365-commerce-modules/search-result-container';\r\n// import { ISearchResultContainerProps } from '../definition-extensions/search-result-container.ext.props.autogenerated';\r\nimport { Module, Node, LabeledDropdown } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport RefineSubmenu from './custom-components/refine-submenu';\r\nimport ChoiceSummary from './custom-components/choice-summary';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport { IMandsSearchResultContainerProps } from '../../../modules/mands-search-result-container';\r\ninterface IState {\r\n rating: boolean;\r\n activeRefiner: number;\r\n}\r\n\r\n/**\r\n *\r\n * SearchResultContainerView component\r\n * @extends {React.PureComponent<ISearchResultContainerViewProps>}\r\n */\r\n\r\nexport class SearchResultContainerView extends React.PureComponent<\r\n ISearchResultContainerViewProps & IMandsSearchResultContainerProps<ISearchResultContainerData>,\r\n IState\r\n> {\r\n public _sortAndFilterContainerRef: React.RefObject<LabeledDropdown>;\r\n constructor(props: ISearchResultContainerViewProps & IMandsSearchResultContainerProps<ISearchResultContainerData>) {\r\n super(props);\r\n this.state = {\r\n rating: false,\r\n activeRefiner: -1\r\n };\r\n this._sortAndFilterContainerRef = React.createRef<LabeledDropdown>();\r\n }\r\n public render(): JSX.Element {\r\n const { props } = this;\r\n const mobileView =\r\n props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? true : false;\r\n const {\r\n SearchResultContainer,\r\n products,\r\n pagination,\r\n ProductsContainer,\r\n ProductSectionContainer,\r\n isMobile,\r\n modalToggle,\r\n searchResultModal,\r\n TitleViewProps,\r\n refineMenu,\r\n categoryHierarchy,\r\n sortByOptions,\r\n CategoryNavContainer,\r\n RefineAndProductSectionContainer,\r\n errorMessage\r\n } = this.props;\r\n let { choiceSummary } = this.props;\r\n choiceSummary = this._getChoiceSummary();\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {this.renderCategoryHierarchy(categoryHierarchy)}\r\n {props.slots && props.slots.content && (\r\n <div>\r\n {props.slots.content.map((children: React.ReactNode, index: number) => {\r\n return (\r\n <div className='col-12' key={index}>\r\n {children}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n {this.renderTitle(TitleViewProps)}\r\n {modalToggle}\r\n {TitleViewProps.title.titleCount}\r\n {this.createSearchResultModal(searchResultModal, refineMenu, sortByOptions, mobileView)}\r\n\r\n <Node {...ProductSectionContainer}>\r\n <div className='row search-result-row'>\r\n <div className='col-xs-6 col-lg-7 product-quantity'>\r\n <div className='filters-refine'>\r\n <i className='filter-icon' />\r\n {pagination}\r\n </div>\r\n <Node {...CategoryNavContainer}>{TitleViewProps && this.renderTitleCount(TitleViewProps)}</Node>\r\n </div>\r\n <div className='col-xs-6 col-md-6 col-lg-5'>{sortByOptions && this.renderSort(sortByOptions)}</div>\r\n </div>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n <div className='bottom-pagination-plp'>{pagination}</div>\r\n </Node>\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n <Node {...CategoryNavContainer}>{categoryHierarchy && this.renderCategoryHierarchy(categoryHierarchy)}</Node>\r\n {props.slots && props.slots.content && (\r\n <div>\r\n {props.slots.content.map((children: React.ReactNode, index: number) => {\r\n return (\r\n <div className='col-12' key={index}>\r\n {children}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n <Node {...RefineAndProductSectionContainer}>\r\n {refineMenu && this.renderRefiner(refineMenu, mobileView)}\r\n {choiceSummary}\r\n <Node {...ProductSectionContainer}>\r\n <div className='ms-search-result-wrapper-title-choice-summary'>\r\n {TitleViewProps && this.renderTitle(TitleViewProps)}\r\n </div>\r\n {TitleViewProps.title.titleCount}\r\n <div className='ms-search-result-wrapper-sort-by-category'>{sortByOptions && this.renderSort(sortByOptions)}</div>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n }\r\n public componentDidMount = () => {\r\n this.hideRatingFromSortDropdown();\r\n };\r\n\r\n public componentDidUpdate = () => {\r\n this.hideRatingFromSortDropdown();\r\n };\r\n\r\n public hideRatingFromSortDropdown = () => {\r\n const sort = document.getElementById('categorySortByDropdown') as HTMLSelectElement;\r\n if (sort && sort.options) {\r\n for (let i = 0; i < sort.options.length; i++) {\r\n if (sort.options[i].value.includes('Rating')) {\r\n sort.options[i].style.display = 'none';\r\n }\r\n if (sort.options[i].value.includes('Price: Low to High')) {\r\n sort.options[i].style.display = 'none';\r\n }\r\n if (sort.options[i].value.includes('Price: High to Low')) {\r\n sort.options[i].style.display = 'none';\r\n }\r\n }\r\n }\r\n };\r\n\r\n public createSearchResultModal = (\r\n modalProps: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n mobileView: boolean\r\n ): JSX.Element => {\r\n return React.cloneElement(\r\n modalProps.modal,\r\n {},\r\n modalProps.modalHeader,\r\n this.createModalBody(modalProps, refineMenu, sortByDropDown, mobileView),\r\n modalProps.modalFooter\r\n );\r\n };\r\n\r\n private createModalBody = (\r\n props: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n mobileView: boolean\r\n ): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, this.renderSort(sortByDropDown), this.renderRefiner(refineMenu, mobileView));\r\n }\r\n return null;\r\n };\r\n\r\n private renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h5>{title.titleCount}</h5>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n };\r\n\r\n private setRating = () => {\r\n return () => this.setState({ rating: !this.state.rating });\r\n };\r\n\r\n private renderRefiner = (props: IRefineMenuViewProps, isMobile: boolean): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n const { rating } = this.state;\r\n isMobile = this.props.isMobile;\r\n let { choiceSummary } = this.props;\r\n choiceSummary = this._getChoiceSummary();\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {!isMobile &&\r\n refiners.map((submenu, index) => submenu !== null && index < 6 && this.renderSubmenu(submenu, index, rating))}\r\n {!isMobile && refiners.length > 6 && !rating && (\r\n <div role='button' className='show-more' onClick={this.setRating}>\r\n {'Show all filters'}\r\n </div>\r\n )}\r\n </Node>\r\n <Node {...RefineMenuContainer}>\r\n {isMobile ? (\r\n <div className='ms-search-result__toggle'>\r\n <div className='ms-search-result__collection-count'>{this.props.TitleViewProps.title.titleCount}</div>\r\n <div className='ms-search-result__choice-summary'>{choiceSummary}</div>\r\n </div>\r\n ) : null}\r\n {!isMobile &&\r\n refiners.map(\r\n (submenu, index) => submenu !== null && index > 5 && rating && this.renderSubmenu(submenu, index, rating)\r\n )}\r\n {!isMobile && refiners.length > 6 && rating && (\r\n <div role='button' className='show-more' onClick={this.setRating}>\r\n {'Show less filters'}\r\n </div>\r\n )}\r\n {isMobile && refiners.map((submenu, index) => submenu !== null && this.renderSubmenu(submenu, index, rating))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n };\r\n\r\n private renderSort = (props: ISortByViewProps): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown) {\r\n return <Node {...SortingContainer}>{sortByDropDown}</Node>;\r\n }\r\n return null;\r\n };\r\n\r\n // @ts-ignore\r\n private renderSubmenu = (submenu, index: number, rating: boolean) => {\r\n const subMenu = submenu && submenu.props;\r\n if (subMenu.productRefinerHierarchy.KeyName.toLowerCase() === 'color') {\r\n subMenu.productRefinerHierarchy.KeyName = 'Colour';\r\n }\r\n return subMenu.productRefinerHierarchy.KeyName.toLowerCase() !== 'rating' &&\r\n subMenu.productRefinerHierarchy.KeyName.toLowerCase() !== 'category' ? (\r\n <RefineSubmenu\r\n productRefinerHierarchy={subMenu.productRefinerHierarchy}\r\n selectedRefinerValues={subMenu.selectedRefinerValues}\r\n refineItemCommonProps={subMenu.refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={subMenu.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={subMenu.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={subMenu.onUpdateRefiners}\r\n urlBuilder={subMenu.urlBuilder}\r\n isExpandedOnInitialLoad={false}\r\n tempRangeTypeTODO={subMenu.tempRangeTypeTODO}\r\n context={subMenu.context}\r\n moduleId={subMenu.moduleId}\r\n moduleTypeName={subMenu.moduleTypeName}\r\n className={index === 4 && !rating ? 'hidden' : ''}\r\n isDisabled={false}\r\n refinerId={index}\r\n toggleAllRefiners={this.toggleAllRefiners}\r\n isOpen={this.state.activeRefiner === index && this.state.activeRefiner !== -1 ? true : false}\r\n />\r\n ) : null;\r\n };\r\n\r\n private toggleAllRefiners = (activeRefiner: number) => {\r\n const currentRefinerState = this.state.activeRefiner;\r\n if (activeRefiner === currentRefinerState) {\r\n this.setState({ activeRefiner: -1 });\r\n } else {\r\n this.setState({ activeRefiner });\r\n }\r\n };\r\n private renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\r\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\r\n if (categoryHierarchyList) {\r\n return (\r\n <Node {...CategoryHierarchyContainer}>\r\n {categoryHierarchyList.map((category, index) => (\r\n <React.Fragment key={index}>\r\n {category}\r\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n );\r\n }\r\n\r\n return null;\r\n };\r\n\r\n private renderTitle = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h1>{title.titleText}</h1>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n };\r\n private _getChoiceSummary = (): React.ReactNode | null => {\r\n const { resources, data, telemetry } = this.props;\r\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n const refinersData = data.refiners.result;\r\n if (!refinersData) {\r\n return null;\r\n }\r\n\r\n return (\r\n <ChoiceSummary\r\n classNames='ms-choice-summary-by-category'\r\n clearAllText={resources.clearAllText}\r\n label={resources.choiceSummaryLabel}\r\n selectedChoices={selectedRefiners}\r\n refinerHierarchy={refinersData}\r\n choiceFormat={resources.choiceFormat}\r\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\r\n telemetry={telemetry}\r\n onChoiceClicked={this._onChoiceClicked}\r\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\r\n choiceAriaLabel={resources.choiceAriaLabel}\r\n />\r\n );\r\n };\r\n private _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\r\n const { data, telemetry } = this.props;\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\r\n return;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!notification.clearAll) {\r\n const selectedChoice = notification.choiceClicked;\r\n if (!selectedChoice) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\r\n return;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n\r\n // set focus to sort and filter\r\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\r\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\r\n setTimeout(() => {\r\n dropdownElement && dropdownElement.focus();\r\n }, 50);\r\n }\r\n\r\n data.listPageState.result.currentPageNumber = 0;\r\n data.listPageState.result.activeFilters = currentRefinementCriteria;\r\n };\r\n private _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\r\n const { data, telemetry } = this.props;\r\n const fullUrl = this.props.context.request.url.requestUrl;\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\r\n return fullUrl.href;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!isClearAll) {\r\n if (!selectedRefiner) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\r\n return fullUrl.href;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n }\r\n\r\n return this.props.context.request.url.requestUrl.href;\r\n };\r\n}\r\n\r\nexport default SearchResultContainerView;\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductDimensionsWithAvailabilitiesFull } from '@msdyn365-commerce/commerce-entities';\nimport { ProductDimensionsMatrix } from '@msdyn365-commerce/components';\nimport { RichTextComponent } from '@msdyn365-commerce/core';\nimport { ICoreContext, getCatalogId } from '@msdyn365-commerce/core-internal';\nimport { ArrayExtensions, IDimensionsApp, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, Collapse, IModuleProps, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { FeatureState } from '@msdyn365-commerce/retail-proxy';\nimport { IBulkPurchaseData } from './bulk-purchase.data';\nimport { IBulkPurchaseProps } from './bulk-purchase.props.autogenerated';\n\n/**\n * Additional optional props for the bulk purchase.\n */\nexport interface IBulkPurchaseExtendedProps extends IBulkPurchaseProps<IBulkPurchaseData> {\n productDimensions?: IProductDimensionsWithAvailabilitiesFull[];\n}\n\n/**\n * View for the bulk purchase module.\n */\nexport interface IBulkPurchaseViewProps extends IBulkPurchaseProps<IBulkPurchaseData> {\n container: IModuleProps;\n content: React.ReactElement;\n}\n\n/**\n * BulkPurchase state message Interface.\n */\nexport interface IBulkPurchaseStateMessage {\n isOpen: boolean;\n messageGlyph: string;\n messageText: string;\n statusCssString: string;\n}\n\n/**\n * View for the bulk purchase module.\n */\nexport interface IBulkPurchaseState {\n isExpanded: boolean;\n stateMessage?: IBulkPurchaseStateMessage;\n}\n\n/**\n * Bulk-purchase module.\n */\nexport class BulkPurchase extends React.PureComponent<IBulkPurchaseExtendedProps, IBulkPurchaseState> {\n public static readonly className = 'ms-bulk-purchase';\n private readonly _errorCssClass: string = 'danger';\n private readonly _errorCssGlyphClass: string = 'fas fa-exclamation-triangle';\n private readonly collapseRef: React.RefObject<Collapse> = React.createRef<Collapse>();\n\n public constructor(props: IBulkPurchaseExtendedProps) {\n super(props);\n\n this.state = {\n isExpanded: false\n };\n }\n\n public render(): React.ReactElement | null {\n const hasDimensionsInProps = ArrayExtensions.hasElements(this.props.productDimensions);\n const hasDimensionsInData = ArrayExtensions.hasElements(this.props.data.productDimensions?.result);\n if (!hasDimensionsInProps && !hasDimensionsInData) {\n return null;\n }\n\n const viewProps: IBulkPurchaseViewProps = {\n ...this.props,\n container: {\n moduleProps: this.props,\n className: classnames(BulkPurchase.className, this.props.config.className)\n },\n content: this._renderCollapseContent(`${BulkPurchase.className}__content`)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _renderCollapseContent(className: string): React.ReactElement {\n return (\n <div className={className}>\n {this._renderCollapseButton(`${className}__collapse-button`)}\n {this._renderCollapse(`${className}__collapse`)}\n </div>\n );\n }\n\n private _renderCollapseButton(className: string): React.ReactElement {\n return (\n <Button\n className={className}\n onClick={this._toggleCollapse}\n aria-expanded={this.state.isExpanded}\n title={this.props.resources.bulkPurchaseHeaderTitle}\n >\n {this.props.resources.bulkPurchaseHeaderTitle}\n </Button>\n );\n }\n\n /**\n *This function is being used to handel variant change dropdown.\n */\n private _dimensionDropDownChange = () => {\n this.collapseRef.current?.reEvaluateHeight();\n };\n\n private _renderCollapse(className: string): React.ReactElement {\n return (\n <Collapse className={className} isOpen={this.state.isExpanded} ref={this.collapseRef}>\n {this._renderMainContent(`${className}__main-content`)}\n </Collapse>\n );\n }\n\n private _renderMainContent(className: string): React.ReactElement {\n const isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\n\n const userMessageNode = this.state.stateMessage ? (\n <Alert color={this.state.stateMessage.statusCssString} isOpen={this.state.stateMessage.isOpen}>\n <span className={this.state.stateMessage.messageGlyph} />\n <span>{this.state.stateMessage.messageText}</span>\n </Alert>\n ) : (\n undefined\n );\n\n return (\n <div className={className}>\n {!isMobileDevice && (\n <div className={`${className}__description`}>\n <RichTextComponent text={this.props.resources.bulkPurchaseDescriptionText} />\n </div>\n )}\n {userMessageNode}\n {this._renderMatrix(`${className}__matrix-container`)}\n </div>\n );\n }\n\n private _renderMatrix(className: string): React.ReactElement {\n const hasDimensionsInProps = ArrayExtensions.hasElements(this.props.productDimensions);\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 catalogId = getCatalogId(this.props.context.request);\n validateCatalogId(catalogId);\n return (\n <ProductDimensionsMatrix\n className={className}\n context={this.props.context as ICoreContext<IDimensionsApp>}\n data={{\n dimensions: hasDimensionsInProps ? this.props.productDimensions! : this.props.data.productDimensions!.result!,\n orderTemplates: this.props.data.orderTemplates?.result,\n customerInformation: this.props.data.customerInformation?.result\n }}\n resources={this.props.resources}\n dimensionOnChange={this._dimensionDropDownChange}\n onErrorMessage={this._onErrorMessage}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogsFeatureEnabled}\n catalogId={catalogId}\n />\n );\n }\n\n private _onErrorMessage = (errorMessage: string) => {\n this.setState({\n stateMessage: {\n messageText: errorMessage,\n statusCssString: this._errorCssClass,\n messageGlyph: this._errorCssGlyphClass,\n isOpen: true\n }\n });\n };\n\n /**\n * Callback which toggles collapse mode.\n */\n private readonly _toggleCollapse = () => {\n this.setState(state => ({\n isExpanded: !state.isExpanded\n }));\n };\n}\n\nexport default BulkPurchase;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n AddToCartComponent,\n AddToOrderTemplateComponent,\n AddToWishlistComponent,\n IAddToCartFailureResult,\n IAddToCartResources,\n IAddToOrderTemplateDialogResources,\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources,\n IOrderTemplateActionErrorResult,\n IOrderTemplateNameDialogResources,\n IWishlistActionErrorResult,\n PriceComponent,\n RatingComponent\n} from '@msdyn365-commerce/components';\nimport { getUrlSync, IImageSettings } from '@msdyn365-commerce/core';\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport { ProductAvailableQuantity, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, DeliveryMode, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Alert,\n Button,\n format,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n Heading,\n ITelemetryContent,\n Node,\n Quantity,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport {\n IBuyboxAddToCartViewProps,\n IBuyboxAddToOrderTemplateViewProps,\n IBuyboxAddToWishlistViewProps,\n IBuyboxCallbacks,\n IBuyboxCommonData,\n IBuyboxCommonResources,\n IBuyboxErrorBlockProps,\n IBuyboxExtentedProps,\n IBuyboxKeyInPriceViewProps,\n IBuyboxProductQuantityViewProps,\n IBuyboxShopSimilarLookViewProps,\n IBuyboxState,\n IProductDetails,\n ShopSimiliarButtonType\n} from './buyboxInterface';\nimport { getConfigureErrors, getGenericError, getQuantityError } from './utilities/error-utilities';\n\nconst _getClassNamePrefix = (typeName: string): string => {\n return typeName.toLocaleLowerCase() === 'quickview' ? 'ms-quickView' : 'ms-buybox';\n};\n\nexport function getBuyBoxInventoryLabel(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n productDetails?: IProductDetails\n): React.ReactElement | undefined {\n const { typeName } = props;\n\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n const productAvailableQuantity = props.data.productAvailableQuantity?.result ?? productDetails?.productAvailableQuantity;\n\n const className = _getClassNamePrefix(typeName);\n if (!productAvailableQuantity || !ArrayExtensions.hasElements(productAvailableQuantity)) {\n return undefined;\n }\n const shippingInventory = productAvailableQuantity.find(shipping => shipping.deliveryType === DeliveryMode.shipping);\n\n if (shippingInventory) {\n let inventoryClassName: string;\n if (shippingInventory.StockLevelCode) {\n inventoryClassName = `${className}__inventory-label ${className}__inventory-code-${shippingInventory.StockLevelCode.toLowerCase()}`;\n } else {\n inventoryClassName = `${className}__inventory-label`;\n }\n return (\n <div className={`${className}__inventory-info`}>\n <span className={inventoryClassName}>{shippingInventory.StockLevelLabel}</span>\n </div>\n );\n }\n\n return undefined;\n}\n\nexport function getBuyboxProductTitle(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n productDetails?: IProductDetails\n): React.ReactElement | undefined {\n const {\n config: { titleHeadingTag = 'h1' },\n typeName\n } = props;\n const className = _getClassNamePrefix(typeName);\n\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n const product = props.data.product?.result ?? productDetails?.product ?? undefined;\n\n return product && <Heading className={`${className}__product-title`} headingTag={titleHeadingTag} text={product.Name ?? ''} />;\n}\n\nexport function getBuyboxProductDescription(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n productDetails?: IProductDetails\n): React.ReactElement | undefined {\n const { typeName } = props;\n const className = _getClassNamePrefix(typeName);\n\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n const product = props.data.product?.result ?? productDetails?.product ?? undefined;\n\n return product && <p className={`${className}__product-description`}>{product.Description}</p>;\n}\n\n/**\n * Gets the react node for product unit of measure display.\n * @param {IBuyboxExtentedProps<IBuyboxCommonData>} props The buybox module props.\n * @param {IProductDetails} productDetails The product details to be displyed in buybox.\n * @returns {React.ReactElement} The node representing markup for unit of measure component.\n */\nexport function getBuyboxProductUnitOfMeasure(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n productDetails?: IProductDetails\n): React.ReactElement | undefined {\n const { typeName } = props;\n const className = _getClassNamePrefix(typeName);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\n if (\n props.context.app.config &&\n (!props.context.app.config.unitOfMeasureDisplayType || props.context.app.config.unitOfMeasureDisplayType === 'none')\n ) {\n return undefined;\n }\n\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n const product = props.data.product?.result ?? productDetails?.product;\n if (!product || !product.DefaultUnitOfMeasure) {\n props.telemetry.warning('Missing defult unit of measureor theproduct');\n return undefined;\n }\n\n return (\n <div className={`${className}__product-unit-of-measure`}>\n <span>{product.DefaultUnitOfMeasure}</span>\n </div>\n );\n}\n\nlet telemetryContent: ITelemetryContent;\n\n/**\n * On add to cart failed function.\n * @param props -The buybox module props.\n * @param state -The buybox module state.\n * @param callbacks -The buybox module callbacks.\n * @param defaultMinimumKeyInPrice -The default minimum key in price.\n * @param defaultMaximumKeyInPrice -The default maximum key in price.\n * @param cart -The cart state.\n * @param product -The simple product.\n * @param productAvailability -The product available quantity.\n * @returns Update error state.\n */\nconst onAddToCartFailed = (\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks,\n defaultMinimumKeyInPrice: number,\n defaultMaximumKeyInPrice: number,\n cart: ICartState,\n product: SimpleProduct,\n productAvailability: ProductAvailableQuantity | undefined\n) => (result: IAddToCartFailureResult) => {\n let quantityErrorForState: string | undefined;\n let customAmountErrorForState: string | undefined;\n let otherErrorForState: string | undefined = getGenericError(\n result,\n cart,\n props.resources,\n props.context,\n product,\n productAvailability,\n undefined\n );\n\n if (result.failureReason === 'OUTOFSTOCK') {\n quantityErrorForState = result.failureReason === 'OUTOFSTOCK' ? getQuantityError(result.stockLeft, props.resources) : undefined;\n } else if (\n result.failureReason === 'CARTACTIONFAILED' &&\n result.cartActionResult &&\n (result.cartActionResult.substatus === 'MAXQUANTITY' || result.cartActionResult.substatus === 'QUANTITYLIMITS')\n ) {\n quantityErrorForState = getGenericError(result, cart, props.resources, props.context, product, productAvailability, undefined);\n otherErrorForState = undefined; // Prevent error duplication in otherError and quantityError\n }\n\n if (result.failureReason === 'INVALIDCUSTOMAMOUNT') {\n if (state.keyInPriceAmount === undefined || state.keyInPriceAmount < (props.config.minimumKeyInPrice || defaultMinimumKeyInPrice)) {\n const formatedAmountLimit = props.context.cultureFormatter.formatCurrency(\n props.config.minimumKeyInPrice || defaultMinimumKeyInPrice\n );\n customAmountErrorForState = props.resources.invalidSmallCustomAmountText.replace('{minAmount}', formatedAmountLimit);\n } else if (state.keyInPriceAmount > (props.config.maximumKeyInPrice || defaultMaximumKeyInPrice)) {\n const formatedAmountLimit = props.context.cultureFormatter.formatCurrency(\n props.config.maximumKeyInPrice || defaultMaximumKeyInPrice\n );\n customAmountErrorForState = props.resources.invalidLargeCustomAmountText.replace('{maxAmount}', formatedAmountLimit);\n }\n }\n\n callbacks.updateErrorState({\n errorHost: 'ADDTOCART',\n quantityError: quantityErrorForState,\n configureErrors:\n result.failureReason === 'MISSINGDIMENSION'\n ? getConfigureErrors(result.missingDimensions, props.resources, product?.IsGiftCard)\n : {},\n customAmountError: customAmountErrorForState,\n otherError: otherErrorForState\n });\n};\n\n/**\n * On Item Add To Cart function.\n * @param typeName -Type name.\n * @param callbacks -Buybox Callbacks.\n * @returns Change modal open.\n */\nconst onItemAddedToCart = (typeName: string, callbacks: IBuyboxCallbacks) => (result: ICartActionResult) => {\n if (typeName === 'quickview') {\n callbacks.changeModalOpen(false);\n }\n};\n\nexport function getBuyboxAddToCart(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks,\n defaultMinimumKeyInPrice: number,\n defaultMaximumKeyInPrice: number,\n productDetails?: IProductDetails,\n hasAvailableProducts?: boolean\n): IBuyboxAddToCartViewProps {\n const { id, typeName, context, resources } = props;\n\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n const product = props.data.product?.result ?? productDetails?.product;\n\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n const cart = props.data.cart?.result ?? productDetails?.cart;\n\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n const productAvailableQuantity = props.data.productAvailableQuantity?.result ?? productDetails?.productAvailableQuantity;\n\n const {\n quantity,\n errorState: { configureErrors, quantityError, customAmountError, otherError, errorHost },\n selectedProduct,\n isUpdatingDimension,\n isUpdatingDeliveryOptions,\n isServiceItem\n } = state;\n\n const productAvailability = state.productAvailableQuantity\n ? state.productAvailableQuantity.ProductAvailableQuantity\n : productAvailableQuantity && productAvailableQuantity.length > 0\n ? productAvailableQuantity[0].ProductAvailableQuantity\n : undefined;\n\n const dialogStrings: IAddToCartResources = {\n goToCartText: resources.buyBoxGoToCartText,\n continueShoppingText: resources.buyBoxContinueShoppingText,\n closeNotificationLabel: resources.closeNotificationLabel,\n headerItemOneText: resources.buyBoxSingleItemText,\n headerItemFormatText: resources.buyBoxMultiLineItemFormatText,\n headerMessageText: resources.buyBoxHeaderMessageText,\n freePriceText: resources.priceFree,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n addedQuantityText: resources.addedQuantityText\n };\n\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=240&h=240&m=6', w: 0, h: 0 },\n lg: { q: 'w=240&h=240&m=6', w: 0, h: 0 },\n xl: { q: 'w=240&h=240&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n const isProductQuantityLoading = typeName !== 'quickview' && props.data.productAvailableQuantity.status === 'LOADING';\n if (isProductQuantityLoading) {\n callbacks.changeUpdatingDimension(false);\n }\n\n const isLoadingDeliveryOptions = typeName !== 'quickview' && props.data.deliveryOptions?.status === 'LOADING';\n if (isLoadingDeliveryOptions && callbacks.changeUpdatingDeliveryOptions) {\n callbacks.changeUpdatingDeliveryOptions(false);\n }\n\n telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.typeName, props.telemetry);\n\n // Check if the product delivery mode is electronic\n const emailDeliveryModeCode = props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n // from quickview we are not getting deliveryoptions in props.data hence getting it from quickview state\n const deliveryOptions = typeName === 'quickview' ? state.productDeliveryOptions : props.data.deliveryOptions?.result;\n const isEmailDelivery =\n ArrayExtensions.hasElements(deliveryOptions?.DeliveryOptions) && deliveryOptions!.DeliveryOptions[0].Code === emailDeliveryModeCode;\n const className = _getClassNamePrefix(typeName);\n const isDisabled = isUpdatingDimension && typeName === 'quickview';\n\n return {\n ContainerProps: {\n className: `${className}__add-to-cart-container`\n },\n button: product && (\n <AddToCartComponent\n addToCartText={resources.addToCartText}\n outOfStockText={resources.outOfStockText}\n navigationUrl={getUrlSync('cart', context.actionContext)}\n quantity={quantity}\n data={{ product, price: state.productPrice }}\n context={context}\n disabled={isDisabled}\n id={id}\n hasAvailableProducts={hasAvailableProducts}\n typeName={typeName}\n onError={onAddToCartFailed(\n props,\n state,\n callbacks,\n defaultMinimumKeyInPrice,\n defaultMaximumKeyInPrice,\n cart!,\n product,\n productAvailability\n )}\n getSelectedProduct={selectedProduct}\n productAvailability={productAvailability}\n isProductQuantityLoading={isProductQuantityLoading}\n isUpdatingDimension={isUpdatingDimension}\n changeUpdatingDimension={callbacks.changeUpdatingDimension}\n isLoadingDeliveryOptions={isLoadingDeliveryOptions}\n isUpdatingDeliveryOptions={isUpdatingDeliveryOptions}\n changeUpdatingDeliveryOptions={callbacks.changeUpdatingDeliveryOptions}\n dialogStrings={dialogStrings}\n gridSettings={props.context.request.gridSettings}\n imageSettings={defaultImageSettings}\n telemetryContent={telemetryContent}\n isAddServiceItemToCart={isServiceItem}\n isPriceKeyedIn={state.isPriceKeyedIn}\n customPriceAmount={state.keyInPriceAmount}\n isCustomPriceSelected={state.isCustomPriceSelected}\n maximumKeyInPrice={props.config.maximumKeyInPrice}\n minimumKeyInPrice={props.config.minimumKeyInPrice}\n defaultMinimumKeyInPrice={defaultMinimumKeyInPrice}\n defaultMaximumKeyInPrice={defaultMaximumKeyInPrice}\n isOrderQuantityLimitsFeatureEnabled={_isOrderQuantityLimitsFeatureEnabled(props) || _isChannelLimitsFeatureEnabled(props)}\n isAddEmailDeliveryItemToCart={isEmailDelivery}\n onAdd={onItemAddedToCart(typeName, callbacks)}\n isNavigationToCartPageDisabled={typeName === 'quickview'}\n />\n ),\n errorBlock: (\n <BuyboxErrorBlock\n configureErrors={configureErrors}\n quantityError={quantityError}\n customAmountError={customAmountError}\n otherError={otherError}\n resources={resources}\n showError={errorHost === 'ADDTOCART'}\n />\n )\n };\n}\n\n/**\n * Get the React.ReactElement contains price.\n * @param props - The IBuyboxExtentedProps.\n * @param state - The buybox state.\n * @returns The React.ReactElement.\n */\nexport function getBuyboxProductPrice(props: IBuyboxExtentedProps<IBuyboxCommonData>, state: IBuyboxState): React.ReactElement | undefined {\n const { id, typeName, context, resources } = props;\n\n return (\n state.productPrice && (\n <PriceComponent\n id={id}\n typeName={typeName}\n context={context}\n data={{ price: state.productPrice }}\n product={props.data.product?.result}\n isPriceMinMaxEnabled={\n props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\n )?.IsEnabled\n }\n isSalesAgreementPriceFeatureEnabled={\n props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSalesAgreementPriceSupportFeature'\n )?.IsEnabled\n }\n priceResources={{\n priceRangeSeparator: resources.priceRangeSeparator,\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n salesAgreementExpirationDatePrompt: resources.salesAgreementExpirationDatePrompt,\n salesAgreementCommittedQuantityPrompt: resources.salesAgreementCommittedQuantityPrompt,\n salesAgreementRemainingQuantityPrompt: resources.salesAgreementRemainingQuantityPrompt\n }}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n />\n )\n );\n}\n\nexport function getBuyboxProductRating(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n productDetails?: IProductDetails\n): React.ReactElement | undefined {\n const { id, typeName, context, resources } = props;\n\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n const ratingsSummary = props.data.ratingsSummary?.result ?? productDetails?.ratingsSummary;\n if (!ratingsSummary || !ratingsSummary.averageRating) {\n return <div />;\n }\n const ratingComponent = (\n <RatingComponent\n avgRating={ratingsSummary.averageRating || 0}\n readOnly\n ariaLabel={format(resources.averageRatingAriaLabel, ratingsSummary.averageRating, '5')}\n ratingCount={`${ratingsSummary.reviewsCount}`}\n data={{}}\n context={context}\n id={id}\n typeName={typeName}\n />\n );\n\n return ratingComponent;\n}\n\nfunction generateAddToOrderTemplateDialogResources(resources: IBuyboxCommonResources): 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\nfunction generateOrderTemplateNameDialogResources(resources: IBuyboxCommonResources): 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\nfunction generateItemAddedToOrderTemplateDialogResources(resources: IBuyboxCommonResources): 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.priceFree,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText\n };\n}\n\nfunction generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources: IBuyboxCommonResources\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 * Add to order template failed function.\n * @param callbacks -Buybox callbacks.\n * @param resources -Buybox common resources.\n * @param product -Simple product.\n * @returns Update error state.\n */\nconst onAddToOrderTemplateFailed = (callbacks: IBuyboxCallbacks, resources: IBuyboxCommonResources, product: SimpleProduct | undefined) => (\n result: IOrderTemplateActionErrorResult\n) => {\n callbacks.updateErrorState({\n errorHost: 'ORDER_TEMPLATE',\n configureErrors:\n result.status === 'MISSING_DIMENSION' ? getConfigureErrors(result.missingDimensions, resources, product?.IsGiftCard) : {}\n });\n};\n\nexport function getBuyboxProductAddToOrderTemplate(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks,\n isMultipleCatalogsFeatureEnabled?: boolean,\n catalogId?: number\n): IBuyboxAddToOrderTemplateViewProps | undefined {\n const {\n id,\n typeName,\n context,\n data: {\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n resources\n } = props;\n\n const product = props.data.product?.result;\n\n const {\n errorState: { configureErrors, quantityError, customAmountError, otherError, errorHost },\n quantity\n } = state;\n\n // If custom amount is selected, add-to-orderTemplate is disabled\n if (state.isCustomPriceSelected) {\n return undefined;\n }\n const className = _getClassNamePrefix(typeName);\n\n return {\n ContainerProps: {\n className: `${className}__add-to-order-template-container`\n },\n button: product && orderTemplates && (\n <AddToOrderTemplateComponent\n className='msc-add-to-cart-extra-actions'\n addToOrderTemplateButtonText={resources.addToOrderTemplateButtonText}\n addToOrderTemplateButtonTooltip={resources.addToOrderTemplateButtonTooltip}\n addToOrderTemplateDialogResources={generateAddToOrderTemplateDialogResources(resources)}\n createOrderTemplateDialogResources={generateOrderTemplateNameDialogResources(resources)}\n itemAddedToOrderTemplateDialogResources={generateItemAddedToOrderTemplateDialogResources(resources)}\n duplicateItemsWhenAddingToOrderTemplateDialogResources={generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources\n )}\n data={{ product, quantity, orderTemplates, customerInformation }}\n context={context}\n id={id}\n typeName={typeName}\n onError={onAddToOrderTemplateFailed(callbacks, resources, product)}\n shouldShowButtonFailedTooltip={state.isCustomPriceSelected}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogsFeatureEnabled}\n {...(isMultipleCatalogsFeatureEnabled && { catalogId: catalogId })}\n />\n ),\n errorBlock: (\n <BuyboxErrorBlock\n configureErrors={configureErrors}\n quantityError={quantityError}\n customAmountError={customAmountError}\n otherError={otherError}\n resources={resources}\n showError={errorHost === 'ORDER_TEMPLATE'}\n />\n )\n };\n}\n\n/**\n * Renders add to comparison button for the given product.\n * @param productComparisonButton - React element of the button.\n * @param product - Product information.\n * @param catalogId - Current catalog.\n * @param state - Buybox state.\n * @returns React element of the button.\n */\nexport function getBuyboxProductComparisonButton(\n productComparisonButton: React.ReactNode,\n product: SimpleProduct,\n catalogId: number,\n state: IBuyboxState\n): JSX.Element | undefined {\n if (state.isCustomPriceSelected) {\n return undefined;\n }\n\n validateCatalogId(catalogId);\n return React.cloneElement(productComparisonButton as React.ReactElement, { product, catalogId });\n}\n\n/**\n * Add to wishlist failed function.\n * @param callbacks -Buybox callbacks.\n * @param resources -Buybox resources.\n * @param product -Simple product.\n * @returns Update error state.\n */\nconst onAddToWishlistFailed = (callbacks: IBuyboxCallbacks, resources: IBuyboxCommonResources, product: SimpleProduct | undefined) => (\n result: IWishlistActionErrorResult\n) => {\n callbacks.updateErrorState({\n errorHost: 'WISHLIST',\n configureErrors:\n result.status === 'MISSINGDIMENSION' ? getConfigureErrors(result.missingDimensions, resources, product?.IsGiftCard) : {}\n });\n};\n\nexport function getBuyboxProductAddToWishlist(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks,\n productDetails?: IProductDetails\n): IBuyboxAddToWishlistViewProps | undefined {\n const {\n id,\n typeName,\n context,\n data: {\n wishlists: { result: wishlists }\n },\n resources\n } = props;\n\n const product = props.data.product?.result ? props.data.product.result : productDetails?.product;\n\n const {\n errorState: { configureErrors, quantityError, customAmountError, otherError, errorHost },\n selectedProduct\n } = state;\n\n // If custom amount is selected, add-to-wishlist is disabled\n if (state.isCustomPriceSelected) {\n return undefined;\n }\n\n const className = _getClassNamePrefix(typeName);\n\n return {\n ContainerProps: {\n className: `${className}__add-to-wishlist-container`\n },\n button: product && (\n <AddToWishlistComponent\n className='msc-add-to-cart-extra-actions'\n addToWishlistButtonText={resources.addToWishlistButtonText}\n removeFromWishlistButtonText={resources.removeFromWishlistButtonText}\n addToWishlistMessage={resources.addToWishlistMessage}\n removedFromWishlistMessage={resources.removedFromWishlistMessage}\n addItemToWishlistError={resources.addItemToWishlistError}\n removeItemFromWishlistError={resources.removeItemFromWishlistError}\n nameOfWishlist={resources.nameOfWishlist}\n data={{ product, wishlists }}\n context={context}\n id={id}\n ariaRole='button'\n typeName={typeName}\n onError={onAddToWishlistFailed(callbacks, resources, product)}\n getSelectedProduct={selectedProduct}\n />\n ),\n errorBlock: (\n <BuyboxErrorBlock\n configureErrors={configureErrors}\n quantityError={quantityError}\n customAmountError={customAmountError}\n otherError={otherError}\n resources={resources}\n showError={errorHost === 'WISHLIST'}\n />\n )\n };\n}\n\n/**\n * On quantity change function.\n * @param callbacks -Buybox callbacks.\n * @returns Update quantity.\n */\nconst onQuantityChangeHandler = (callbacks: IBuyboxCallbacks) => (newValue: number) => {\n if (callbacks.updateQuantity) {\n callbacks.updateQuantity(newValue);\n }\n};\n\nexport function getBuyboxProductQuantity(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks\n): IBuyboxProductQuantityViewProps {\n const { resources, typeName } = props;\n\n const {\n quantity,\n min,\n max,\n errorState: { quantityError }\n } = state;\n\n const className = _getClassNamePrefix(typeName);\n\n return {\n ContainerProps: {\n className: `${className}__quantity`\n },\n LabelContainerProps: {\n tag: 'label',\n className: `${className}__product-quantity-label`,\n htmlFor: `${className}__product-quantity-input`\n },\n heading: <div className={`${className}__product-quantity-label-heading`}>{resources.productQuantityHeading}</div>,\n errors: quantityError && (\n <span className='msc-alert msc-alert-noborder msc-alert-danger'>\n <span className='msi-exclamation-triangle' aria-hidden='true' />\n <span>{quantityError}</span>\n </span>\n ),\n input: (\n <Quantity\n id={`${className}__product-quantity-input`}\n min={min}\n max={max}\n currentCount={quantity}\n onChange={onQuantityChangeHandler(callbacks)}\n inputQuantityAriaLabel={resources.inputQuantityAriaLabel}\n telemetryContent={telemetryContent}\n />\n )\n };\n}\n\nexport function getBuyboxShopSimilarButton(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n buttonType: ShopSimiliarButtonType\n): IBuyboxShopSimilarLookViewProps {\n const { resources, context, typeName } = props;\n const product = props.data.product?.result;\n\n const className = _getClassNamePrefix(typeName);\n const navigationUrl = (shopSimiliarButtonType: ShopSimiliarButtonType) => () => {\n const searchURL = getUrlSync('search', context && context.actionContext);\n const separator = searchURL!.includes('?') ? '&' : '?';\n document.location.href = `${searchURL}${separator}productId=${product &&\n product.RecordId}&recommendation=${shopSimiliarButtonType}`;\n };\n const telemetryText =\n buttonType === ShopSimiliarButtonType.Looks ? TelemetryConstant.ShopSimliarLooks : TelemetryConstant.ShopSimliarDescription;\n const payLoad = getPayloadObject('click', telemetryContent, telemetryText);\n const attribute = getTelemetryAttributes(telemetryContent, payLoad);\n const text = buttonType === ShopSimiliarButtonType.Looks ? resources.shopSimilarLooksText : resources.shopSimilarDescriptionText;\n\n return {\n ContainerProps: {\n className: `${className}__shopsimilar${buttonType}`\n },\n input: (\n <Button\n title={text}\n className={`${className}__shop-similar-${buttonType}-button`}\n aria-label={text}\n onClick={navigationUrl(buttonType)}\n {...attribute}\n >\n {text}\n </Button>\n )\n };\n}\n\n/**\n * On price change function.\n * @param callbacks -Buybox callbacks.\n * @returns Update key in price.\n */\nconst onPriceChangeHandler = (callbacks: IBuyboxCallbacks) => (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = event.currentTarget.value;\n callbacks.updateKeyInPrice(value.length > 0 ? Number(value) : Number.parseFloat(value));\n};\n\nexport function getBuyboxKeyInPrice(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks\n): IBuyboxKeyInPriceViewProps {\n const { config, resources } = props;\n\n const {\n errorState: {}\n } = state;\n\n const className = _getClassNamePrefix(props.typeName);\n\n return {\n ContainerProps: {\n className: `${className}__key_in_price`\n },\n LabelContainerProps: {\n tag: 'label',\n className: `${className}__key_in_price-label`,\n htmlFor: `${className}__key_in_price`\n },\n heading: <div className={`${className}__key_in_price-label-heading`}>{resources.buyboxKeyInPriceLabelHeading}</div>,\n input: (\n <input\n type='number'\n className={`${className}__key_in_price_custom-amount__input`}\n onChange={onPriceChangeHandler(callbacks)}\n aria-label={resources.buyboxKeyInPriceLabelHeading}\n aria-valuemin={config.minimumKeyInPrice}\n aria-valuemax={config.minimumKeyInPrice}\n aria-valuenow={state.keyInPriceAmount}\n value={state.keyInPriceAmount}\n min={config.minimumKeyInPrice}\n max={config.minimumKeyInPrice}\n />\n )\n };\n}\n\nexport const BuyboxErrorBlock: React.FC<IBuyboxErrorBlockProps> = ({\n showError,\n configureErrors,\n quantityError,\n customAmountError,\n otherError,\n resources\n}) => {\n let errorMessages: (string | undefined)[] = [];\n\n errorMessages = Object.values(configureErrors).filter(message => message !== undefined);\n\n if (quantityError) {\n errorMessages.push(quantityError);\n }\n\n if (customAmountError) {\n errorMessages.push(customAmountError);\n }\n\n if (otherError) {\n errorMessages.push(otherError);\n }\n\n return (\n <Alert isOpen={showError && errorMessages.length > 0} color='danger' assertive aria-label={resources.buyboxErrorMessageHeader}>\n <div className='msc-alert__header' aria-hidden='true'>\n <span className='msi-exclamation-triangle' />\n <span>{resources.buyboxErrorMessageHeader}</span>\n </div>\n {errorMessages.map((message, index) => {\n return (\n <div key={index} className='msc-alert__line'>\n {message}\n </div>\n );\n })}\n </Alert>\n );\n};\n\nexport function getQuantityLimitsMessages(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n state: IBuyboxState\n): React.ReactElement | undefined {\n const { resources } = props;\n\n const { min, max } = state;\n\n if (!_isOrderQuantityLimitsFeatureEnabled(props) && !_isChannelLimitsFeatureEnabled(props)) {\n return undefined;\n }\n\n return (\n <Node className='quantity_text_message'>\n {_renderMaxLabel(props, max, resources.maxQuantityText)}\n {_renderMinLabel(props, min, resources.minQuantityText)}\n </Node>\n );\n}\n\nexport const RetailDefaultOrderQuantityLimitsFeatureName: string = 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature';\nexport const EcommerceQuantityLimitConfigurationsFeatureName: string =\n 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature';\nexport const RevertToSiteBuilderOrderQuantityLimitsSettingsCRTFeatureName: string = 'RevertToSiteBuilderOrderQuantityLimitsSettings';\n\nconst _renderMaxLabel = (\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n max: number | undefined,\n maxQuantityText: string\n): React.ReactElement | undefined => {\n const { resources, typeName } = props;\n const className = _getClassNamePrefix(typeName);\n if (max && max !== 0 && max !== Number.MAX_VALUE) {\n return (\n <p className={`${className}__minmax_label_text`}>\n <span className='sr-only'>{resources.informationIconText}</span>\n <i className='msi-InfoCircle' aria-hidden='true' />\n {maxQuantityText.replace('{max}', max.toString())}\n </p>\n );\n }\n return undefined;\n};\n\nconst _renderMinLabel = (\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n min: number | undefined,\n minQuantityText: string\n): JSX.Element | undefined => {\n const { resources, typeName } = props;\n const className = _getClassNamePrefix(typeName);\n if (min && min > 1) {\n return (\n <p className={`${className}__minmax_label_text`}>\n <span className='sr-only'>{resources.informationIconText}</span>\n <i className='msi-InfoCircle' aria-hidden='true' />\n {minQuantityText.replace('{min}', min.toString())}\n </p>\n );\n }\n return undefined;\n};\n\nconst _isOrderQuantityLimitsFeatureEnabled = (props: IBuyboxExtentedProps<IBuyboxCommonData>): boolean | undefined => {\n const featureStatuses = props.data.featureState.result;\n\n const isFeatureEnabledInHq = featureStatuses?.find(featureState => featureState.Name === RetailDefaultOrderQuantityLimitsFeatureName)\n ?.IsEnabled;\n if (!isFeatureEnabledInHq) {\n return false;\n }\n\n const useSiteBuilderSettings = featureStatuses?.find(\n featureState => featureState.Name === RevertToSiteBuilderOrderQuantityLimitsSettingsCRTFeatureName\n )?.IsEnabled;\n\n if (useSiteBuilderSettings) {\n const defaultOrderQuantityLimitsFeatureConfig = 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 const customerInfo = props.data.customerInformation.result;\n return (\n customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\n );\n } else {\n const cartConfiguration = props.data.cartConfiguration?.result;\n return !(cartConfiguration?.IgnoreOrderSettings ?? false);\n }\n};\n\nconst _isChannelLimitsFeatureEnabled = (props: IBuyboxExtentedProps<IBuyboxCommonData>): boolean => {\n const featureStatuses = props.data.featureState.result;\n\n const isChannelLimitsFeatureEnabledInHq = featureStatuses?.find(\n featureState => featureState.Name === EcommerceQuantityLimitConfigurationsFeatureName\n )?.IsEnabled;\n\n return isChannelLimitsFeatureEnabledInHq ?? false;\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-internal';\nimport { ProductDimension, ProductDimensionType } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n convertProductDimensionTypeToDimensionTypes,\n DimensionTypes,\n getDimensionValuesFromQuery,\n getInventoryLevelCodeFromDimensionValue,\n IDimensionForSelectedVariant,\n IDimensionsApp,\n IDimensionValueForSelectedVariant,\n InventoryLevelValues,\n ObjectExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { format, getTelemetryObject, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport {\n IBuyboxCallbacks,\n IBuyboxCommonData,\n IBuyboxCommonResources,\n IBuyboxExtentedProps,\n IBuyboxProductConfigureDropdownViewProps,\n IBuyboxProductConfigureViewProps,\n IBuyboxState,\n IProductDetails\n} from './buyboxInterface';\nimport {\n Dropdown,\n IDropdownItemProps,\n IDropdownOnInitializeNotification,\n IDropdownOnSelectionChangeNotification,\n SelectionType\n} from './dropdown';\n\nlet telemetryContent: ITelemetryContent;\n\n/**\n * Dimension pre-processing info.\n */\ninterface IProductDimensionInfo {\n dropdownName: string;\n dropdownId: string;\n dropdownList: IDropdownItemProps[];\n}\n\n/**\n * Props for rendering a dropdown.\n */\ninterface IProductDimensionDropdownProps extends IProductDimensionInfo {\n resources: IBuyboxCommonResources;\n className: string;\n context: ICoreContext<IDimensionsApp>;\n\n configureErrors: { [configureId: string]: string | undefined };\n\n getDropdownName(dimensionType: number, resources: IBuyboxCommonResources): string;\n dropdownCallback(notification: IDropdownOnSelectionChangeNotification): Promise<void>;\n initializeCallback(notification: IDropdownOnInitializeNotification): void;\n}\n\nconst mapProductDimensionFullToDropdownViewProps = (props: IProductDimensionDropdownProps): IBuyboxProductConfigureDropdownViewProps => {\n const dimensionId = Number.parseInt(props.dropdownId, 10) as ProductDimensionType;\n const dropdownToggleName = format(props.resources.selectDimensionFormatString, props.dropdownName);\n\n const errorMessage = props.configureErrors[props.dropdownId];\n\n let dimensionSelectionType = SelectionType.dropdown;\n\n const dimensionType = convertProductDimensionTypeToDimensionTypes(dimensionId);\n\n const dimensionsAsSwatchConfiguration = props.context.app.config.dimensionsAsSwatchType;\n if (\n ArrayExtensions.hasElements(dimensionsAsSwatchConfiguration) &&\n !dimensionsAsSwatchConfiguration.includes(DimensionTypes.none) &&\n dimensionsAsSwatchConfiguration.includes(dimensionType)\n ) {\n dimensionSelectionType = SelectionType.swatch;\n }\n\n return {\n ContainerProps: {\n className: `${props.className}__dropdown`\n },\n LabelContainerProps: {\n tag: 'label',\n className: `${props.className}__dropdown-quantity-label`,\n htmlFor: `${props.className}__dropown-quantity-input-${props.dropdownId}`\n },\n errors: errorMessage && (\n <span className='msc-alert msc-alert-noborder msc-alert-danger' role='alert' aria-live='assertive'>\n <span className='msi-exclamation-triangle' aria-hidden='true' />\n <span>{errorMessage}</span>\n </span>\n ),\n heading: <div>{props.dropdownName}</div>,\n select: (\n <Dropdown\n dropdownId={props.dropdownId}\n dropdownName={props.dropdownName}\n dropdownToggleName={dropdownToggleName}\n dropdownList={props.dropdownList}\n onChange={props.dropdownCallback}\n onInitialize={props.initializeCallback}\n telemetryContent={telemetryContent}\n selectionType={dimensionSelectionType}\n apiSettings={props.context.request.apiSettings}\n />\n )\n };\n};\n\nexport function getBuyboxProductConfigure(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks,\n productDetails?: IProductDetails,\n selectedDimensions?: ProductDimension[]\n): IBuyboxProductConfigureViewProps | undefined {\n const { resources, typeName } = props;\n\n const {\n errorState: { configureErrors }\n } = state;\n\n const { getDropdownName } = callbacks;\n\n const context = props.context as ICoreContext<IDimensionsApp>;\n\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n const product = props.data.product?.result ? props.data.product.result : productDetails?.product;\n\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n const productDimensionsData = props.data.productDimensions?.result ?? productDetails?.productDimensions;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\n const enableStockCheck = props.context.app.config.enableStockCheck;\n\n const hasProductDimensions = ArrayExtensions.hasElements(productDimensionsData);\n\n if (!product || !hasProductDimensions) {\n return undefined;\n }\n\n const className = _getClassNamePrefix(typeName);\n\n const onChanged = async (notification: IDropdownOnSelectionChangeNotification) =>\n _onChanged(notification, callbacks.dimensionSelectedAsync);\n\n const onInitializedDimension = async (notification: IDropdownOnInitializeNotification) =>\n _onInitializedDimension(notification, callbacks.initializeDimension);\n\n telemetryContent = getTelemetryObject(context.request.telemetryPageName!, props.typeName, props.telemetry);\n\n const inventoryLevel = context.app.config.inventoryLevel;\n\n let dimensionsInfo: IProductDimensionInfo[] = [];\n\n const productDimensions = productDimensionsData as IDimensionForSelectedVariant[];\n\n dimensionsInfo = productDimensions.map(productDimensionFull => {\n const dropdownName = getDropdownName(productDimensionFull.DimensionTypeValue, resources);\n const dropdownId = productDimensionFull.DimensionTypeValue.toString();\n\n const dimensions = (productDimensionFull.dimensionValuesWithInventory ??\n productDimensionFull.DimensionValues ??\n []) as IDimensionValueForSelectedVariant[];\n const validProductDimensionsFull = dimensions.filter(\n value => !ObjectExtensions.isNullOrUndefined(value.DimensionValue?.RecordId ?? value.RecordId)\n );\n\n const dropdownList: IDropdownItemProps[] = validProductDimensionsFull.map<IDropdownItemProps>(dimensionValuesWithInventory => {\n const dimensionValue = dimensionValuesWithInventory.DimensionValue ?? dimensionValuesWithInventory;\n const inventoryLevelCode = getInventoryLevelCodeFromDimensionValue(dimensionValuesWithInventory, inventoryLevel);\n return {\n value: dimensionValue.Value ?? '',\n id: dimensionValue.RecordId.toString(),\n colorHexCode: dimensionValue.ColorHexCode,\n imageUrl: dimensionValue.ImageUrl,\n isDisabled: enableStockCheck && inventoryLevelCode === InventoryLevelValues.outOfStock,\n swatchItemAriaLabel: resources.swatchItemAriaLabel ? resources.swatchItemAriaLabel : ''\n };\n });\n return {\n dropdownName,\n dropdownId,\n dropdownList\n };\n });\n\n const matchedDimensions = selectedDimensions ?? getDimensionValuesFromQuery(context.request.url.requestUrl);\n for (const dimensionInfo of dimensionsInfo) {\n const currentDimensionsFromQuery = matchedDimensions.filter(\n dimensionFromQuery => dimensionFromQuery.DimensionTypeValue.toString() === dimensionInfo.dropdownId\n );\n if (!ArrayExtensions.hasElements(currentDimensionsFromQuery)) {\n continue;\n }\n const currentDimensionFromQuery = currentDimensionsFromQuery[0];\n const selectedDimensionItem = dimensionInfo.dropdownList.filter(\n dimensionItem =>\n dimensionItem.value.toLocaleLowerCase() === currentDimensionFromQuery.DimensionValue?.Value?.toLocaleLowerCase()\n );\n if (!ArrayExtensions.hasElements(selectedDimensionItem)) {\n continue;\n }\n selectedDimensionItem[0].isDefault = true;\n }\n\n const dropdowns: IBuyboxProductConfigureDropdownViewProps[] = dimensionsInfo.map(dimensionInfo => {\n return mapProductDimensionFullToDropdownViewProps({\n ...dimensionInfo,\n resources,\n configureErrors,\n getDropdownName,\n dropdownCallback: onChanged,\n initializeCallback: onInitializedDimension,\n className,\n context\n });\n });\n\n return {\n ContainerProps: {\n className: `${className}__configure`\n },\n dropdowns\n };\n}\n\nconst _onChanged = async (\n notification: IDropdownOnSelectionChangeNotification,\n dimensionChanged: (newValue: number, selectedDimensionValue: string, initializedDimension?: string) => Promise<void>\n): Promise<void> => {\n await dimensionChanged(+notification.dropdownId, notification.selectId);\n};\n\nconst _onInitializedDimension = (\n notification: IDropdownOnInitializeNotification,\n initializeDimension?: (initializedDimension: string | undefined) => void\n): void => {\n if (initializeDimension) {\n initializeDimension(notification.initializedDimension);\n }\n};\n\nconst _getClassNamePrefix = (typeName: string): string => {\n return typeName.toLocaleLowerCase() === 'quickview' ? 'ms-quickView' : 'ms-buybox';\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ProductDimensionFull, RatingsSummary } from '@msdyn365-commerce/commerce-entities';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport {\n AsyncResult,\n CommerceList,\n Customer,\n FeatureState,\n ProductDeliveryOptions,\n ProductPrice,\n SimpleProduct,\n CartConfiguration\n} from '@msdyn365-commerce/retail-proxy';\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\nimport {\n IDimensionForSelectedVariant,\n IProductInventoryInformation,\n ISelectedProduct,\n OrderTemplate\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\n\nexport interface IBuyboxState {\n quantity: number;\n min: number | undefined;\n max: number | undefined;\n errorState: IErrorState;\n selectedProduct?: Promise<SimpleProduct | null>;\n productAvailableQuantity?: IProductInventoryInformation;\n productPrice?: ProductPrice;\n productDeliveryOptions?: ProductDeliveryOptions;\n modalOpen?: boolean;\n isUpdatingDimension?: boolean;\n isUpdatingDeliveryOptions?: boolean;\n isServiceItem?: boolean;\n isPriceKeyedIn?: boolean;\n keyInPriceAmount?: number;\n isCustomPriceSelected?: boolean;\n activeIndex?: number;\n animating?: boolean;\n lastUpdate?: number;\n mediaGalleryItems?: Msdyn365.IImageData[] | undefined;\n isPriceApiCalled?: boolean;\n}\n\nexport interface IBuyboxCommonData {\n deliveryOptions: AsyncResult<ProductDeliveryOptions | undefined> | undefined;\n product: AsyncResult<SimpleProduct>;\n productDimensions: AsyncResult<ProductDimensionFull[]>;\n productPrice: AsyncResult<ProductPrice>;\n ratingsSummary: AsyncResult<RatingsSummary>;\n storeSelectorStateManager: AsyncResult<IStoreSelectorStateManager>;\n wishlists: AsyncResult<CommerceList[]>;\n orderTemplates: AsyncResult<OrderTemplate[]>;\n cart: AsyncResult<ICartState>;\n productAvailableQuantity: AsyncResult<IProductInventoryInformation[]>;\n customerInformation: AsyncResult<Customer>;\n featureState: AsyncResult<FeatureState[]>;\n cartConfiguration?: AsyncResult<CartConfiguration>;\n}\nexport declare type IBuyboxErrorHost = 'ADDTOCART' | 'FINDINSTORE' | 'WISHLIST' | 'SHOPSIMILARITEM' | 'ORDER_TEMPLATE';\n\nexport interface IErrorState {\n errorHost?: IBuyboxErrorHost;\n configureErrors: { [configureId: string]: string | undefined };\n quantityError?: string;\n customAmountError?: string;\n otherError?: string;\n}\n\nexport interface IBuyboxAddToCartViewProps {\n ContainerProps: INodeProps;\n errorBlock?: React.ReactNode;\n button?: React.ReactNode;\n}\n\nexport interface IBuyboxAddToOrderTemplateViewProps {\n ContainerProps: INodeProps;\n errorBlock?: React.ReactNode;\n button?: React.ReactNode;\n}\n\nexport interface IBuyboxProductQuantityViewProps {\n ContainerProps: INodeProps;\n LabelContainerProps: INodeProps;\n\n heading: React.ReactNode;\n errors?: React.ReactNode;\n\n input: React.ReactNode;\n}\n\nexport interface IBuyboxAddToWishlistViewProps {\n ContainerProps: INodeProps;\n errorBlock?: React.ReactNode;\n button?: React.ReactNode;\n}\n\nexport interface IBuyboxShopSimilarLookViewProps {\n ContainerProps: INodeProps;\n errors?: React.ReactNode;\n input: React.ReactNode;\n}\n\nexport enum ShopSimiliarButtonType {\n Looks = 'looks',\n Description = 'descriptions'\n}\n\nexport interface IBuyboxKeyInPriceViewProps {\n ContainerProps: INodeProps;\n LabelContainerProps: INodeProps;\n heading: React.ReactNode;\n input: React.ReactNode;\n}\n\nexport interface IBuyboxErrorBlockProps {\n configureErrors: { [configureId: string]: string | undefined };\n quantityError?: string;\n customAmountError?: string;\n otherError?: string;\n resources: IBuyboxCommonResources;\n showError: boolean;\n}\n\nexport interface IBuyboxProductConfigureProps {\n product: SimpleProduct;\n productDimensions: ProductDimensionFull[];\n resources: IBuyboxCommonResources;\n channelId: number;\n actionContext: Msdyn365.IActionContext;\n errors: { [configureId: string]: string | undefined };\n\n dimensionChanged?(newValue: number): void;\n}\n\nexport interface IBuyboxProductConfigureDropdownViewProps {\n ContainerProps: INodeProps;\n LabelContainerProps: INodeProps;\n\n heading: React.ReactNode;\n errors?: React.ReactNode;\n\n select: React.ReactNode;\n}\n\nexport interface IBuyboxProductConfigureViewProps {\n ContainerProps: INodeProps;\n\n dropdowns: IBuyboxProductConfigureDropdownViewProps[];\n}\n\nexport interface IBuyboxCallbacks {\n updateQuantity(newQuantity: number): boolean;\n updateKeyInPrice(keyInPrice: number): void;\n updateErrorState(newErrorState: IErrorState): void;\n updateSelectedProduct(\n selectedProduct: Promise<SimpleProduct | null>,\n newInventory: IProductInventoryInformation | undefined,\n newPrice: ProductPrice | undefined,\n newDeliveryOptions: ProductDeliveryOptions | undefined\n ): void;\n getDropdownName(dimensionType: number, resources: IBuyboxCommonResources): string;\n dimensionSelectedAsync(selectedDimensionId: number, selectedDimensionValueId: string): Promise<void>;\n changeModalOpen(isModalOpen: boolean): void;\n changeUpdatingDimension(isUpdatingDimension: boolean): void;\n changeUpdatingDeliveryOptions?(isUpdatingDeliveryOptions: boolean): void;\n\n initializeDimension?(initializedDimension: string | undefined): void;\n}\n\nexport interface IBuyboxExtentedProps<T> extends Msdyn365.IModule<T> {\n resources: IBuyboxCommonResources;\n config: IBuyboxCommonConfig;\n slots: {};\n}\n\nexport interface IBuyboxCommonConfig {\n titleHeadingTag?: titleHeadingTag;\n className?: string;\n enableShopSimilarLooks?: boolean;\n enableShopSimilarDescription?: boolean;\n enableKeyInPrice?: boolean;\n minimumKeyInPrice?: number;\n maximumKeyInPrice?: number;\n}\n\nexport interface IProductDetails {\n product?: ISelectedProduct | null;\n productPrice?: ProductPrice | null;\n ratingsSummary?: RatingsSummary;\n productAvailableQuantity?: IProductInventoryInformation[];\n cart?: ICartState | undefined;\n productDimensions?: IDimensionForSelectedVariant[] | null;\n}\n\nexport enum titleHeadingTag {\n h1 = 'h1',\n h2 = 'h2',\n h3 = 'h3',\n h4 = 'h4',\n h5 = 'h5',\n h6 = 'h6'\n}\n\nexport interface IBuyboxCommonResources {\n priceFree: string;\n invalidSmallCustomAmountText: string;\n invalidLargeCustomAmountText: string;\n buyBoxGoToCartText: string;\n buyBoxContinueShoppingText: string;\n closeNotificationLabel: string;\n buyBoxSingleItemText: string;\n buyBoxMultiLineItemFormatText: string;\n buyBoxHeaderMessageText: string;\n originalPriceText: string;\n currentPriceText: string;\n addedQuantityText: string;\n addToCartText: string;\n outOfStockText: string;\n averageRatingAriaLabel: string;\n addToOrderTemplateHeader: string;\n noOrderTemplatesMessage: string;\n noOrderTemplatesDescription: string;\n createAnOrderTemplateButtonText: string;\n createNewOrderTemplateButtonText: string;\n cancelOrderTemplateCreationButtonText: string;\n selectTemplatesText: string;\n addToTemplateButtonText: string;\n lineItemsText: string;\n createOrderTemplateHeader: string;\n orderTemplateTitle: string;\n orderTemplateNameAriaLabel: string;\n createOrderTemplateDescription: string;\n defaultOrderTemplateName: string;\n createOrderTemplateButtonText: string;\n cancelNewOrderTemplateCreationButtonText: string;\n viewOrderTemplateButtonText: string;\n continueShoppingButtonText: string;\n itemAddedToOrderTemplateHeaderItemOneText: string;\n itemAddedToOrderTemplateHeaderItemFormatText: string;\n itemAddedToOrderTemplateHeaderMessageText: string;\n duplicatedProductsHeader: string;\n duplicatedProductsDescription: string;\n updateQuantityButtonText: string;\n cancelDuplicateItemsButtonText: string;\n addToWishlistButtonText: string;\n removeFromWishlistButtonText: string;\n addToWishlistMessage: string;\n removedFromWishlistMessage: string;\n addItemToWishlistError: string;\n removeItemFromWishlistError: string;\n nameOfWishlist: string;\n productQuantityHeading: string;\n inputQuantityAriaLabel: string;\n buyboxKeyInPriceLabelHeading: string;\n buyboxErrorMessageHeader: string;\n maxQuantityText: string;\n minQuantityText: string;\n selectDimensionFormatString: string;\n errorMessageOutOfStock: string;\n errorMessageOutOfRangeOneLeft: string;\n errorMessageOutOfRangeFormat: string;\n addToOrderTemplateButtonText: string;\n addedToCartFailureMessage: string;\n maxQuantityLimitText: string;\n productDimensionTypeColorErrorMessage: string;\n productDimensionTypeConfigurationErrorMessage: string;\n productDimensionTypeSizeErrorMessage: string;\n productDimensionTypeAmountErrorMessage: string;\n productDimensionTypeStyleErrorMessage: string;\n shopSimilarLooksText?: string;\n shopSimilarDescriptionText?: string;\n addToOrderTemplateButtonTooltip: string;\n loadingText?: string;\n informationIconText?: string;\n priceRangeSeparator?: string;\n swatchItemAriaLabel?: string;\n salesAgreementPricePrompt?: string;\n salesAgreementExpirationDatePrompt?: string;\n salesAgreementCommittedQuantityPrompt?: string;\n salesAgreementRemainingQuantityPrompt?: string;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ISwatchItem, SwatchComponent } from '@msdyn365-commerce/components';\nimport { DimensionTypes } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IDropdownItemProps, IDropdownProps, SelectionType } from './dropdown.props';\n\n/**\n * State for a dropdown component.\n */\ninterface IDropdownState {\n /**\n * @friendlyName selectedIndex\n * @description Selected index.\n */\n selectedIndex: string;\n}\n\n/**\n *\n * DropDown component.\n * @extends {React.PureComponent<IDropdownProps, IDropdownState>}\n */\nexport class Dropdown extends React.PureComponent<IDropdownProps, IDropdownState> {\n private readonly selectMenu: React.RefObject<HTMLSelectElement> = React.createRef<HTMLSelectElement>();\n\n private readonly payLoad: IPayLoad;\n\n public constructor(props: IDropdownProps, state: IDropdownState) {\n super(props);\n\n if (this.props.onInitialize) {\n this.props.onInitialize({\n initializedDimension: this.props.dropdownId\n });\n }\n\n const selectedItem = this.props.dropdownList.find(item => item.isDefault);\n if (selectedItem) {\n this.state = {\n selectedIndex: selectedItem.id.toString()\n };\n if (this.props.onChange) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Update for default.\n this.props.onChange({\n dropdownId: this.props.dropdownId,\n selectId: selectedItem.id,\n selectedValue: selectedItem.value\n });\n }\n } else {\n this.state = {\n selectedIndex: ''\n };\n }\n this.payLoad = getPayloadObject('click', props.telemetryContent!, this.props.dropdownName);\n }\n\n public render(): JSX.Element {\n if (this.props.apiSettings && this.props.selectionType === SelectionType.swatch) {\n return this._renderSwatch();\n }\n\n return this._renderDropdown();\n }\n\n private _renderDropdown(): JSX.Element {\n const { dropdownId, dropdownList, dropdownName, dropdownToggleName } = this.props;\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n return (\n <select\n id={`msc-dropdown__entry-${dropdownId}`}\n ref={this.selectMenu}\n aria-label={dropdownName}\n className='msc-dropdown__select'\n onChange={this._onChanged}\n {...attribute}\n >\n <option value='' aria-selected={this.state.selectedIndex === ''} selected={this.state.selectedIndex === ''} hidden disabled>\n {dropdownToggleName}\n </option>\n {dropdownList.map(\n (item: IDropdownItemProps) =>\n item && (\n <option\n value={item.id}\n key={item.id}\n selected={this.state.selectedIndex === item.id.toString()}\n aria-selected={this.state.selectedIndex === item.id.toString()}\n className={item.isDisabled ? 'msc-dropdown__select__disabled' : undefined}\n >\n {item.value}\n </option>\n )\n )}\n </select>\n );\n }\n\n private _renderSwatch(): JSX.Element {\n const swatchItems = this.props.dropdownList.map<ISwatchItem>(item => {\n return {\n ...item,\n itemId: item.id,\n dimensionType: this.props.dropdownName as DimensionTypes\n };\n });\n return <SwatchComponent list={swatchItems} apiSettings={this.props.apiSettings!} onSelectItem={this._selectSwatch} />;\n }\n\n /**\n * Updates state on swatch selection.\n * @param item - Selected swatch item.\n */\n private readonly _selectSwatch = async (item: ISwatchItem) => {\n this.setState({ selectedIndex: item.itemId });\n\n if (this.props.onChange) {\n await this.props.onChange({\n dropdownId: this.props.dropdownId,\n selectId: item.itemId,\n selectedValue: item.value\n });\n }\n };\n\n private readonly _onChanged = async (event: React.ChangeEvent<HTMLSelectElement>) => {\n this.setState({ selectedIndex: event.target.value });\n\n if (this.props.onChange) {\n await this.props.onChange({\n dropdownId: this.props.dropdownId,\n selectId: event.target.value,\n selectedValue: event.target.innerText\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 { ICommerceApiSettings } from '@msdyn365-commerce/core-internal';\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\n\n/**\n * Specifies the type of selection.\n */\nexport enum SelectionType {\n dropdown = 0,\n swatch = 1\n}\n\n/**\n * Copyright (c) 2018 Microsoft Corporation.\n */\nexport interface IDropdownProps {\n /**\n * Specifies the type of selection. Dropdown by default.\n */\n selectionType?: SelectionType;\n\n /**\n * @friendlyName dropdownId\n * @description Id for dropdown component.\n */\n dropdownId: string;\n\n /**\n * @friendlyName dropdownName\n * @description Name of the dropdown component.\n */\n dropdownName: string;\n\n /**\n * @friendlyName dropdownList\n * @description List of items in dropdown.\n */\n dropdownList: IDropdownItemProps[];\n\n /**\n * @friendlyName dropdownToggleName\n * @description Name to use for the toggle when nothing is selected.\n */\n dropdownToggleName: string;\n\n /**\n * @telemetryContent telemetryContent\n * @description Telemetry content.\n */\n telemetryContent?: ITelemetryContent;\n\n apiSettings?: ICommerceApiSettings;\n\n /**\n * @friendlyName onChange\n * @description Callback that gets fired when when a selected dimension changes.\n */\n onChange?(notification: IDropdownOnSelectionChangeNotification): Promise<void>;\n\n /**\n * @friendlyName onInitialize\n * @description Callback that gets fired when dimension is initialized.\n */\n onInitialize?(notification: IDropdownOnInitializeNotification): void;\n}\n\nexport interface IDropdownItemProps {\n value: string;\n id: string;\n colorHexCode?: string;\n imageUrl?: string;\n isDisabled?: boolean;\n isDefault?: boolean;\n}\n\nexport interface IDropdownOnSelectionChangeNotification {\n dropdownId: string;\n selectId: string;\n selectedValue: string;\n}\n\nexport interface IDropdownOnInitializeNotification {\n initializedDimension: string;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IAddToCartFailureResult } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { OrgUnitLocation, ProductAvailableQuantity, ProductDimension, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { IBuyboxCommonResources } from '../buyboxInterface';\n\n/**\n * Get the quantity limit.\n * @param context - The context.\n * @param productAvailability - The product availability.\n * @returns The quantity limit.\n */\nexport function getQuantityLimit(context: ICoreContext<IGeneric<IAny>>, productAvailability: ProductAvailableQuantity | undefined): number {\n // Get the quantity limit for the product\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- need read from config.\n const maxQuantityForCartLineItem: number | undefined = context.app.config.maxQuantityForCartLineItem;\n const availableQty = productAvailability?.AvailableQuantity;\n const defaultQuantityLimit = 10;\n\n let quantityLimit: number;\n\n if (maxQuantityForCartLineItem === undefined && availableQty === undefined) {\n quantityLimit = defaultQuantityLimit;\n } else if (availableQty === undefined) {\n quantityLimit = maxQuantityForCartLineItem ?? defaultQuantityLimit;\n } else if (maxQuantityForCartLineItem === undefined) {\n quantityLimit = availableQty;\n } else {\n quantityLimit = Math.min(maxQuantityForCartLineItem, availableQty);\n }\n\n return quantityLimit;\n}\n\n/**\n * Get the element index.\n * @param cart - The cart.\n * @param product - The product.\n * @param location - The location.\n * @returns The index of the element.\n */\nexport function getElementIndex(\n cart: ICartState | undefined,\n product: SimpleProduct | undefined,\n location: OrgUnitLocation | undefined\n): number {\n // Get the quantity of the product in cart\n let elementFoundAt: number = -1;\n\n const productIdToFind = product?.RecordId;\n\n for (let index = 0; index < cart!.cart.CartLines!.length; index++) {\n if (\n cart!.cart.CartLines![index].ProductId === productIdToFind &&\n (cart!.cart.CartLines![index].FulfillmentStoreId || '') === (location?.OrgUnitNumber || '')\n ) {\n elementFoundAt = index;\n\n break;\n }\n }\n\n return elementFoundAt;\n}\n\nexport function getQuantityError(stockLeft: number | undefined, resources: IBuyboxCommonResources): string | undefined {\n if (!stockLeft || stockLeft <= 0) {\n return resources.errorMessageOutOfStock;\n } else if (stockLeft === 1) {\n return resources.errorMessageOutOfRangeOneLeft;\n }\n return resources.errorMessageOutOfRangeFormat.replace('{numLeft}', stockLeft.toString());\n}\n\nexport function getGenericError(\n result: IAddToCartFailureResult,\n cart: ICartState | undefined,\n resources: IBuyboxCommonResources,\n context: ICoreContext<IGeneric<IAny>>,\n product: SimpleProduct | undefined,\n productAvailability: ProductAvailableQuantity | undefined,\n location: OrgUnitLocation | undefined\n): string | undefined {\n if (result.failureReason === 'EMPTYINPUT') {\n return resources.addedToCartFailureMessage;\n } else if (result.failureReason === 'CARTACTIONFAILED') {\n if (result.cartActionResult && result.cartActionResult.substatus === 'MAXQUANTITY') {\n // Get the quantity of the product in cart\n const elementFoundAt: number = getElementIndex(cart, product, location);\n\n let currentQuantity: number = 0;\n if (elementFoundAt !== -1) {\n const cartLineToUpdate = { ...cart!.cart.CartLines![elementFoundAt] };\n currentQuantity = cartLineToUpdate.Quantity ?? 0;\n }\n\n // Get the quantity limit for the product\n const quantityLimit = getQuantityLimit(context, productAvailability);\n return resources.maxQuantityLimitText\n .replace('{curQuantity}', currentQuantity.toString())\n .replace('{maxQuantity}', quantityLimit.toString());\n } else if (\n result.cartActionResult &&\n (result.cartActionResult.substatus === 'QUANTITYLIMITS' || result.cartActionResult.substatus === 'INVOICEINCART')\n ) {\n return result.cartActionResult.errorDetails?.LocalizedMessage;\n }\n\n if (result.cartActionResult?.validationResults && ArrayExtensions.hasElements(result.cartActionResult.validationResults)) {\n return result.cartActionResult.validationResults\n .map(item => {\n return StringExtensions.isNullOrEmpty(item.LocalizedMessage)\n ? item.ErrorContext ?? item.ErrorResourceId\n : item.LocalizedMessage;\n })\n .toString();\n }\n\n return resources.addedToCartFailureMessage;\n }\n\n return undefined;\n}\n\nexport function getConfigureErrors(\n result: ProductDimension[] | undefined,\n resources: IBuyboxCommonResources,\n isGiftCard?: boolean\n): { [configureId: string]: string | undefined } {\n if (!result) {\n return {};\n }\n\n const dimensions: { [configureId: string]: string | undefined } = {};\n\n for (const dimension of result) {\n dimensions[dimension.DimensionTypeValue] = getDimensionErrorString(dimension.DimensionTypeValue, resources, isGiftCard);\n }\n\n return dimensions;\n}\n\nexport function getDimensionErrorString(dimensionTypeValue: number, resources: IBuyboxCommonResources, isGiftCard?: boolean): string {\n switch (dimensionTypeValue) {\n case 1: // ProductDimensionType.Color\n return resources.productDimensionTypeColorErrorMessage;\n case 2: // ProductDimensionType.Configuration\n return resources.productDimensionTypeConfigurationErrorMessage;\n case 3: // ProductDimensionType.Size\n return resources.productDimensionTypeSizeErrorMessage;\n case 4: // ProductDimensionType.Style\n return isGiftCard ? resources.productDimensionTypeAmountErrorMessage : resources.productDimensionTypeStyleErrorMessage;\n default:\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 {\n AddToCartBehavior,\n IAddToCartFailureResult,\n IAddToCartResources,\n ItemSuccessfullyAddedToCartNotification,\n PriceComponent\n} from '@msdyn365-commerce/components';\nimport { getUrlSync, ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport { ICartActionResult } from '@msdyn365-commerce/global-state';\nimport { DeliveryOption, FeatureState, OrgUnitLocation, ProductAvailableQuantity, ProductDimension } from '@msdyn365-commerce/retail-proxy';\nimport { NotificationsManager } from '@msdyn365-commerce-modules/notifications-core';\nimport {\n ArrayExtensions,\n DeliveryMode,\n IProductInventoryInformation,\n isAggregatedInventory\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { getTelemetryObject, Heading, INodeProps, IPopupProps, Popup } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { BuyboxErrorBlock } from '../../../common/buybox-components';\nimport { IBuyboxCallbacks, IBuyboxState } from '../../../common/buyboxInterface';\nimport { getConfigureErrors, getGenericError } from '../../../common/utilities/error-utilities';\nimport { IBuyboxData } from '../buybox.data';\nimport { IBuyboxProps, IBuyboxResources } from '../buybox.props.autogenerated';\n\nconst modalCloseButtonReference: React.RefObject<HTMLButtonElement> = React.createRef();\n\n/**\n * FindinStore failure Interface.\n */\nexport interface IFindInStoreFailureResult {\n missingDimensions?: ProductDimension[];\n}\n\n/**\n * BuyBoxFindinStore View Props Interface.\n */\nexport interface IBuyboxFindInStoreViewProps {\n storeSelector?: React.ReactNode;\n heading?: React.ReactNode;\n description?: React.ReactNode;\n errors?: React.ReactNode;\n button?: React.ReactNode;\n productPickupOptionList?: React.ReactNode;\n\n modal?: React.ReactNode;\n\n ContainerProps: INodeProps;\n\n openFindInStoreDialog(): Promise<void>;\n}\n\n/**\n * On click find store handler.\n * @param props -Buybox data.\n * @param state -Buybox state.\n * @param callbacks -Buybox callbacks.\n * @returns Find in store.\n */\nconst onClickFindInStoreHandler = (props: IBuyboxProps<IBuyboxData>, state: IBuyboxState, callbacks: IBuyboxCallbacks) => async () => {\n await findInStoreOnClick(props, state, callbacks);\n};\n\n/**\n * Inventory settings based on the inventory policy for aggregated availability.\n */\ninterface IInventorySettingsProps {\n isSectionDisabled: boolean;\n description: string;\n buttonText: string;\n}\n\n/**\n * The function defines the settings values for a given inventory configuration.\n * @param context - The context.\n * @param isStockCheck - Flag to enable inventory validation.\n * @param productAvailability - The product inventory information.\n * @param buyboxResources - The buybox string resources.\n * @param isLoading - Is loading.\n * @returns Boolean.\n */\nfunction getFindInStoreInventorySettings(\n context: ICoreContext,\n isStockCheck: boolean,\n productAvailability: IProductInventoryInformation[] | undefined,\n buyboxResources: IBuyboxResources,\n isLoading?: boolean\n): IInventorySettingsProps {\n // If shouldValidateAggregation is true then is required to check for the product inventory, based on this the messaging will change\n // and the find in store button will be ensbled or disabled\n\n let isSectionDisabled: boolean;\n let buttonText;\n let description: string;\n\n let pickupInventory: IProductInventoryInformation | undefined;\n\n if (!isStockCheck || isLoading) {\n return {\n isSectionDisabled: false,\n buttonText: buyboxResources.findInStoreLinkText,\n description: buyboxResources.findInStoreDescriptionText\n };\n }\n\n if (productAvailability) {\n pickupInventory = productAvailability.find(pickup => pickup.deliveryType === DeliveryMode.pickup);\n }\n\n // If aggregated is enabled, then we need to validate the inventor check for find in store.\n // If an individual is selected, then we will always show a find in store button.\n if (isAggregatedInventory(context.actionContext)) {\n if (productAvailability && pickupInventory?.IsProductAvailable) {\n isSectionDisabled = false;\n buttonText = buyboxResources.findInStoreLinkText;\n description = buyboxResources.findInStoreDescriptionText;\n } else {\n isSectionDisabled = true;\n buttonText = buyboxResources.findInStoreNotAvailableTextButton;\n description = buyboxResources.findInStoreNotAvailableDescription;\n }\n } else {\n isSectionDisabled = false;\n buttonText = buyboxResources.findInStoreLinkText;\n description = buyboxResources.findInStoreDescriptionText;\n }\n\n return {\n isSectionDisabled,\n description,\n buttonText\n };\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 */\nconst 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\nexport function getBuyboxFindInStore(\n props: IBuyboxProps<IBuyboxData>,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks\n): IBuyboxFindInStoreViewProps | undefined {\n const {\n data,\n slots: { storeSelector },\n resources: {\n priceFree,\n originalPriceText,\n currentPriceText,\n findInStoreHeaderText,\n buyBoxGoToCartText,\n buyBoxContinueShoppingText,\n closeNotificationLabel,\n buyBoxSingleItemText,\n buyBoxMultiLineItemFormatText,\n buyBoxHeaderMessageText,\n descriptionTextToShowAllPickupOptions\n },\n context: {\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\n }\n } = props;\n\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const product = data?.product?.result;\n const price = data?.productPrice?.result;\n const cart = data?.cart?.result;\n const deliveryOptions = data?.deliveryOptions?.result;\n const productAvailability = data.productAvailableQuantity?.result;\n const retailMulitplePickupMFeatureState = data?.featureState?.result?.find(\n (featureState: FeatureState) => featureState.Name === multiplePickupStoreSwitchName\n )?.IsEnabled;\n const channelDeliveryOptionConfig = data?.channelDeliveryOptionConfig?.result;\n\n const missingDimensions = product?.Dimensions?.filter(dimension => !dimension.DimensionValue?.Value);\n\n const {\n errorState: { configureErrors, quantityError, otherError, errorHost },\n modalOpen,\n quantity\n } = state;\n\n const { isSectionDisabled, buttonText, description } = getFindInStoreInventorySettings(\n props.context,\n props.context.app.config.enableStockCheck,\n productAvailability,\n props.resources,\n props.data.productAvailableQuantity.status === 'LOADING' || ArrayExtensions.hasElements(missingDimensions)\n );\n\n if (!product || !ArrayExtensions.hasElements(storeSelector)) {\n return undefined;\n }\n\n if (!deliveryOptions || !deliveryOptions.DeliveryOptions) {\n return undefined;\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 (retailMulitplePickupMFeatureState && channelDeliveryOptionConfig) {\n if (!matchDeliveryOptions(deliveryOptions.DeliveryOptions, channelDeliveryOptionConfig?.PickupDeliveryModeCodes)) {\n return undefined;\n }\n } else if (\n !PickupDeliveryModeCode ||\n !deliveryOptions.DeliveryOptions.find((option: DeliveryOption) => option.Code === PickupDeliveryModeCode)\n ) {\n return undefined;\n }\n\n const dialogStrings = {\n goToCartText: buyBoxGoToCartText,\n continueShoppingText: buyBoxContinueShoppingText,\n closeNotificationLabel,\n headerItemOneText: buyBoxSingleItemText,\n headerItemFormatText: buyBoxMultiLineItemFormatText,\n headerMessageText: buyBoxHeaderMessageText,\n freePriceText: priceFree,\n originalPriceText,\n currentPriceText\n };\n\n const priceComponent = price ? (\n <PriceComponent\n data={{ price }}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n freePriceText={dialogStrings.freePriceText}\n originalPriceText={dialogStrings.originalPriceText}\n currentPriceText={dialogStrings.currentPriceText}\n />\n ) : (\n ''\n );\n\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=240&h=240&m=6', w: 0, h: 0 },\n lg: { q: 'w=240&h=240&m=6', w: 0, h: 0 },\n xl: { q: 'w=240&h=240&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n const popupProps: IPopupProps = {\n context: props.context,\n className: 'ms-buybox',\n id: props.id,\n typeName: props.typeName,\n data: { product: props.data.product?.result, price: props.data.productPrice?.result },\n dialogStrings,\n imageSettings: defaultImageSettings,\n gridSettings: props.context.request.gridSettings,\n productQuantity: quantity,\n priceComponent,\n navigationUrl: getUrlSync('cart', props.context.actionContext),\n modalOpen,\n setModalOpen: callbacks.changeModalOpen\n };\n const renderModalPopup = <Popup {...popupProps} />;\n\n return {\n ContainerProps: {\n className: 'ms-buybox__find-in-store'\n },\n\n storeSelector: storeSelector[0],\n\n openFindInStoreDialog: onClickFindInStoreHandler(props, state, callbacks),\n\n heading: <Heading className='ms-buybox__find-in-store-heading' headingTag='h4' text={findInStoreHeaderText} />,\n\n description: <p className='ms-buybox__find-in-store-description'>{description}</p>,\n productPickupOptionList:\n retailMulitplePickupMFeatureState && !isSectionDisabled ? (\n <>\n <p className='ms-buybox__find-in-store-description'>{descriptionTextToShowAllPickupOptions}</p>\n <ul className='ms-buybox__find-in-store-pickup' aria-label={descriptionTextToShowAllPickupOptions}>\n {deliveryOptions.DeliveryOptions.map((item: DeliveryOption) => {\n return (\n <li className='ms-buybox__find-in-store-pickup-option' aria-label={item.Description} key={item.Code}>\n {item.Description}\n </li>\n );\n })}\n </ul>\n </>\n ) : null,\n errors: (\n <BuyboxErrorBlock\n configureErrors={configureErrors}\n quantityError={quantityError}\n otherError={otherError}\n resources={props.resources}\n showError={errorHost === 'FINDINSTORE'}\n />\n ),\n\n button: (\n <button\n className='ms-buybox__find-in-store-button'\n onClick={onClickFindInStoreHandler(props, state, callbacks)}\n color='secondary'\n ref={modalCloseButtonReference}\n aria-label={buttonText}\n disabled={cart === undefined || isSectionDisabled}\n title={buttonText}\n >\n {buttonText}\n </button>\n ),\n\n modal: renderModalPopup\n };\n}\n\n/**\n * Handler for find in store button.\n * @param props - BuyBox data.\n * @param state - BuyBox state.\n * @param callbacks - BuyBox callbacks.\n * @returns - Promise.\n */\nasync function findInStoreOnClick(props: IBuyboxProps<IBuyboxData>, state: IBuyboxState, callbacks: IBuyboxCallbacks): Promise<void> {\n const {\n data: {\n storeSelectorStateManager: { result: storeSelectorStateManager },\n cart: { result: cart },\n productAvailableQuantity: { result: productAvailableQuantity }\n },\n resources,\n context,\n modules\n } = props;\n\n const { selectedProduct, quantity } = state;\n\n let dataProduct = props.data.product.result;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const retailMulitplePickupMFeatureState = props.data?.featureState?.result?.find(\n (featureState: FeatureState) => featureState.Name === multiplePickupStoreSwitchName\n )?.IsEnabled;\n\n if (selectedProduct) {\n dataProduct = (await selectedProduct) || dataProduct;\n }\n\n if (!dataProduct || !storeSelectorStateManager) {\n return;\n }\n\n const product = dataProduct;\n\n const missingDimensions =\n product.Dimensions &&\n product.Dimensions.filter((dimension: ProductDimension) => !(dimension.DimensionValue && dimension.DimensionValue.Value));\n\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 if (missingDimensions && missingDimensions.length > 0) {\n if (callbacks.updateErrorState) {\n callbacks.updateErrorState({\n errorHost: 'FINDINSTORE',\n configureErrors: getConfigureErrors(missingDimensions, resources)\n });\n }\n } else {\n storeSelectorStateManager\n .openDialog({\n product,\n id: storeSelectorId,\n parentElementRef: modalCloseButtonReference,\n deliveryOptions: retailMulitplePickupMFeatureState ? props.data.deliveryOptions.result : undefined,\n onLocationSelected: async (orgUnitLocation: OrgUnitLocation, deliveryMode: string) => {\n if (!cart) {\n return Promise.resolve();\n }\n\n const behavior = props.context?.app?.config?.addToCartBehavior;\n\n return cart\n .addProductToCart({ product, count: quantity, location: orgUnitLocation, deliveryMode })\n .then((result: ICartActionResult) => {\n if (result.status === 'FAILED' && result.substatus === 'MAXQUANTITY') {\n callbacks.changeModalOpen(false);\n let productAvailability: ProductAvailableQuantity | undefined;\n if (state.productAvailableQuantity) {\n productAvailability = state.productAvailableQuantity.ProductAvailableQuantity;\n } else if (productAvailableQuantity && ArrayExtensions.hasElements(productAvailableQuantity)) {\n const shippingInventory = productAvailableQuantity.find(\n shipping => shipping.deliveryType === DeliveryMode.pickup\n );\n productAvailability = shippingInventory?.ProductAvailableQuantity;\n } else {\n productAvailability = undefined;\n }\n const failureResult: IAddToCartFailureResult = {\n failureReason: 'CARTACTIONFAILED',\n cartActionResult: { status: result.status, substatus: result.substatus }\n };\n callbacks.updateErrorState({\n errorHost: 'ADDTOCART',\n configureErrors: {},\n otherError: getGenericError(\n failureResult,\n cart,\n resources,\n context,\n product,\n productAvailability,\n orgUnitLocation\n )\n });\n } else {\n callbacks.updateErrorState({\n configureErrors: {}\n });\n const navigationUrl = getUrlSync('cart', context.actionContext);\n if (behavior === undefined || behavior === AddToCartBehavior.goToCart) {\n if (result.status === 'SUCCESS' && navigationUrl) {\n window.location.assign(navigationUrl);\n }\n } else if (behavior === AddToCartBehavior.showModal) {\n callbacks.changeModalOpen(true);\n } else if (behavior === AddToCartBehavior.showNotification) {\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=240&h=240&m=6', w: 0, h: 0 },\n lg: { q: 'w=240&h=240&m=6', w: 0, h: 0 },\n xl: { q: 'w=240&h=240&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n const telemetryContent = getTelemetryObject(\n props.context.request.telemetryPageName!,\n props.friendlyName,\n props.telemetry\n );\n const dialogStrings: IAddToCartResources = {\n goToCartText: resources.buyBoxGoToCartText,\n continueShoppingText: resources.buyBoxContinueShoppingText,\n closeNotificationLabel: resources.closeNotificationLabel,\n headerItemOneText: resources.buyBoxSingleItemText,\n headerItemFormatText: resources.buyBoxMultiLineItemFormatText,\n headerMessageText: resources.buyBoxHeaderMessageText,\n freePriceText: resources.priceFree,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n addedQuantityText: resources.addedQuantityText\n };\n const notification = new ItemSuccessfullyAddedToCartNotification(\n props.context,\n dialogStrings,\n defaultImageSettings,\n props.context.request.gridSettings,\n product,\n props.data.productPrice?.result,\n quantity,\n navigationUrl,\n telemetryContent,\n props.id,\n props.typeName\n );\n NotificationsManager.instance().addNotification(notification);\n }\n }\n })\n .catch((error: Error) => {\n if (props.telemetry) {\n props.telemetry.exception(error);\n props.telemetry.debug('Unable to add product to cart');\n }\n });\n }\n })\n .catch((error: Error) => {\n if (props.telemetry) {\n props.telemetry.error(error.message);\n props.telemetry.debug('Unable to find in store');\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 { getCatalogId, ICoreContext, msdyn365Commerce } from '@msdyn365-commerce/core-internal';\nimport {\n CommerceProperty,\n ProductCatalog,\n ProductDeliveryOptions,\n ProductDimensionValue,\n ProductDimensionValueInventoryAvailability,\n ProductPrice,\n ReleasedProductType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { BulkPurchase } from '@msdyn365-commerce-modules/bulk-purchase';\nimport {\n ArrayExtensions,\n DeliveryMode,\n FinitePromiseQueue,\n FinitePromiseQueueError,\n getDeliveryOptionsForSelectedVariant,\n GetDeliveryOptionsForSelectedVariantInput,\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getInventoryLevelCodeFromDimensionValue,\n getPriceForSelectedVariant,\n getProductAvailabilitiesForSelectedVariant,\n getSelectedVariant,\n IDimensionsApp,\n IDimensionValueForSelectedVariant,\n InventoryLevelValues,\n IProductInventoryInformation,\n IPromiseQueue,\n PriceForSelectedVariantInput,\n ProductAvailabilitiesForSelectedVariantInput,\n SelectedVariantInput,\n setDimensionValuesToQuery,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n updateMaxQuantityForCartLineItem\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport {\n getBuyboxAddToCart,\n getBuyBoxInventoryLabel,\n getBuyboxKeyInPrice,\n getBuyboxProductAddToOrderTemplate,\n getBuyboxProductAddToWishlist,\n getBuyboxProductComparisonButton,\n getBuyboxProductDescription,\n getBuyboxProductPrice,\n getBuyboxProductQuantity,\n getBuyboxProductRating,\n getBuyboxProductTitle,\n getBuyboxProductUnitOfMeasure,\n getBuyboxShopSimilarButton,\n getQuantityLimitsMessages,\n RetailDefaultOrderQuantityLimitsFeatureName,\n EcommerceQuantityLimitConfigurationsFeatureName,\n RevertToSiteBuilderOrderQuantityLimitsSettingsCRTFeatureName\n} from '../../common/buybox-components';\nimport { getBuyboxProductConfigure } from '../../common/buybox-product-configure';\nimport {\n IBuyboxAddToCartViewProps,\n IBuyboxAddToOrderTemplateViewProps,\n IBuyboxAddToWishlistViewProps,\n IBuyboxCallbacks,\n IBuyboxCommonData,\n IBuyboxExtentedProps,\n IBuyboxKeyInPriceViewProps,\n IBuyboxProductConfigureViewProps,\n IBuyboxProductQuantityViewProps,\n IBuyboxShopSimilarLookViewProps,\n IBuyboxState,\n IErrorState,\n ShopSimiliarButtonType\n} from '../../common/buyboxInterface';\nimport { IBuyboxData } from './buybox.data';\nimport { IBuyboxProps, IBuyboxResources } from './buybox.props.autogenerated';\nimport { getBuyboxFindInStore, IBuyboxFindInStoreViewProps } from './components/buybox-find-in-store';\nimport { RecentlyViewedState } from '../recently-viewed';\n\nexport interface IBuyboxViewProps extends IBuyboxProps<IBuyboxData> {\n state: IBuyboxState;\n ModuleProps: IModuleProps;\n ProductInfoContainerProps: INodeProps;\n MediaGalleryContainerProps: INodeProps;\n callbacks: IBuyboxCallbacks;\n mediaGallery?: React.ReactNode;\n title?: React.ReactNode;\n description?: React.ReactNode;\n rating?: React.ReactNode;\n price?: React.ReactNode;\n productComparisonButton?: React.ReactNode;\n bulkPurchaseLink?: React.ReactNode;\n addToOrderTemplate?: IBuyboxAddToOrderTemplateViewProps;\n addToWishlist?: IBuyboxAddToWishlistViewProps;\n min?: number | undefined;\n max: number | undefined;\n addToCart: IBuyboxAddToCartViewProps;\n findInStore?: IBuyboxFindInStoreViewProps;\n quantity?: IBuyboxProductQuantityViewProps;\n configure?: IBuyboxProductConfigureViewProps;\n inventoryLabel?: React.ReactNode;\n shopSimilarLook?: IBuyboxShopSimilarLookViewProps;\n shopSimilarDescription?: IBuyboxShopSimilarLookViewProps;\n quantityLimitsMessages: React.ReactNode;\n telemetryContent?: ITelemetryContent;\n keyInPrice?: IBuyboxKeyInPriceViewProps;\n unitOfMeasure?: React.ReactNode;\n catalogs?: ProductCatalog[] | undefined;\n isChannelMultipleCatalogsFeatureEnabled?: boolean;\n currentCatalogId?: number;\n applyDefaultOrderSettings?: boolean;\n}\n\n/**\n * Buybox Module.\n */\nclass Buybox extends React.PureComponent<IBuyboxProps<IBuyboxData>, IBuyboxState> {\n /**\n * A queue of tasks of processing the changes in the dimensions.\n * Limit to two processes:\n * 1 - for the current process, which is under execution at the moment.\n * 2 - next process, which will process the latest version of data.\n * @remark Enqueueing new promises will discard the previous ones (except the one which is under processing).\n */\n private readonly dimensionUpdateQueue: IPromiseQueue<void> = new FinitePromiseQueue<void>(2);\n\n private dimensions: { [id: number]: string } = {};\n private initializedDimensions: Set<string> = new Set();\n\n private readonly buyboxCallbacks: IBuyboxCallbacks = {\n updateQuantity: (newQuantity: number): boolean => {\n const errorState = { ...this.state.errorState };\n errorState.quantityError = undefined;\n errorState.otherError = undefined;\n\n this.setState({ quantity: newQuantity, errorState });\n return true;\n },\n updateErrorState: (newErrorState: IErrorState): void => {\n this.setState({ errorState: newErrorState });\n },\n updateSelectedProduct: (\n newSelectedProduct: Promise<SimpleProduct | null>,\n newInventory: IProductInventoryInformation | undefined,\n newPrice: ProductPrice | undefined,\n newDeliveryOptions: ProductDeliveryOptions | undefined\n ): void => {\n this.setState({\n selectedProduct: newSelectedProduct,\n productAvailableQuantity: newInventory,\n productDeliveryOptions: newDeliveryOptions\n });\n this._updatePrice(newPrice);\n },\n initializeDimension: (initializedDimension: string): void => {\n if (initializedDimension) {\n this.initializedDimensions.add(initializedDimension);\n }\n },\n dimensionSelectedAsync: async (selectedDimensionId: number, selectedDimensionValueId: string): Promise<void> => {\n this.dimensions[selectedDimensionId] = selectedDimensionValueId;\n // Only trigger _updateDimensions when all dimensions are initialized\n if (this.initializedDimensions.size === (this.props.data.product.result?.Dimensions?.length || 0)) {\n return this.dimensionUpdateQueue\n .enqueue(async () => {\n return this._updateDimensions();\n })\n .catch((error: unknown) => {\n // Ignore discarded processes.\n if (error !== FinitePromiseQueueError.ProcessWasDiscardedFromTheQueue) {\n throw error;\n }\n });\n }\n },\n getDropdownName: (dimensionType: number, resources: IBuyboxResources): string => {\n return this._getDropdownName(dimensionType, resources);\n },\n changeModalOpen: (isModalOpen: boolean): void => {\n this.setState({ modalOpen: isModalOpen });\n },\n changeUpdatingDimension: (isUpdatingDimension: boolean): void => {\n this.setState({ isUpdatingDimension });\n },\n\n /**\n * Update isUpdatingDeliveryOptions state.\n *\n * @param isUpdatingDeliveryOptions - The status of updating delivery options.\n */\n changeUpdatingDeliveryOptions: (isUpdatingDeliveryOptions: boolean): void => {\n this.setState({ isUpdatingDeliveryOptions });\n },\n\n updateKeyInPrice: (customPrice: number): void => {\n // Remove custom amount error when updating the custom price\n const errorState = { ...this.state.errorState };\n errorState.customAmountError = undefined;\n\n this.setState({ isPriceKeyedIn: true, keyInPriceAmount: customPrice, errorState });\n this._updatePrice(this.state.productPrice, customPrice);\n }\n };\n\n private readonly telemetryContent: ITelemetryContent;\n\n public constructor(props: IBuyboxProps<IBuyboxData>, state: IBuyboxState) {\n super(props);\n this.state = {\n errorState: {\n configureErrors: {}\n },\n quantity: 1,\n min: undefined,\n max: undefined,\n selectedProduct: undefined,\n productPrice: undefined,\n productDeliveryOptions: undefined,\n\n modalOpen: false,\n isUpdatingDimension: false,\n isUpdatingDeliveryOptions: false,\n isPriceApiCalled: false\n };\n this.telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\n }\n\n public async componentDidMount(): Promise<void> {\n const {\n data: {\n product: { result: product },\n productPrice\n },\n context\n } = this.props;\n\n // There are multiple sources triggering the callback function dimensionSelectedAsync calling the GetActivePrice api before componentDidMount and after componentDidMount.\n // Set isPriceApiCalled to false here to prevent redundant API call after componentDidMount:\n // If the price has not been hydrated before, this means the component was just loaded for the first time with variant selected.\n // We will skip calling RS API in this case as the price data has already been fetched via module data action in node server.\n this.setState({ isPriceApiCalled: false });\n\n productPrice.then(async result => {\n this._updatePrice(result);\n });\n\n if (product) {\n // Check if the product is service or not by product type\n if (product.ItemTypeValue === ReleasedProductType.Service) {\n this.setState({ isServiceItem: true });\n }\n await this._updateQuantitiesInState(product);\n }\n\n if (product && context.app.config.maxRecentlyViewedItemsCount > 0) {\n RecentlyViewedState.instance(this.props.context, context.app.config.maxRecentlyViewedItemsCount, product.RecordId);\n }\n }\n\n public render(): JSX.Element | null {\n const {\n slots: { mediaGallery, productComparisonButton },\n data: {\n product: { result: product }\n },\n config: { className = '' }\n } = this.props;\n\n const { min, max } = this.state;\n\n if (!product) {\n this.props.context.telemetry.error('Product content is empty, module wont render');\n return null;\n }\n\n const props = this.props as IBuyboxExtentedProps<IBuyboxCommonData>;\n const defaultMinimumKeyInPrice = 10;\n const defaultMaximumKeyInPrice = 100;\n\n const context = this.props.context as ICoreContext<IDimensionsApp>;\n const inventoryLevel = context.app.config.inventoryLevel;\n const dimensionValuesWithInventory = ArrayExtensions.flatten(\n ArrayExtensions.validValues(this.props.data.productDimensions.result?.map(value => value.dimensionValuesWithInventory))\n );\n const applyDefaultOrderSettings =\n (this.props.data.featureState?.result?.find(featureState => featureState.Name === RetailDefaultOrderQuantityLimitsFeatureName)\n ?.IsEnabled ??\n false) &&\n (this.props.data.cartConfiguration?.result?.ValidateDefaultOrderSettingsPerLine ?? false);\n const hasAvailableProducts =\n !ArrayExtensions.hasElements(dimensionValuesWithInventory) ||\n dimensionValuesWithInventory.some((value: unknown) => {\n const inventoryLevelCode = getInventoryLevelCodeFromDimensionValue(\n value as ProductDimensionValueInventoryAvailability,\n inventoryLevel\n );\n return inventoryLevelCode !== InventoryLevelValues.outOfStock;\n });\n const catalogId = getCatalogId(this.props.context.request);\n validateCatalogId(catalogId);\n\n const viewProps: IBuyboxViewProps = {\n ...(this.props as IBuyboxProps<IBuyboxData>),\n state: this.state,\n mediaGallery: mediaGallery && mediaGallery.length > 0 ? mediaGallery[0] : undefined,\n ModuleProps: {\n moduleProps: this.props,\n className: classnames('ms-buybox', className)\n },\n ProductInfoContainerProps: {\n className: 'ms-buybox__content'\n },\n MediaGalleryContainerProps: {\n className: 'ms-buybox__media-gallery'\n },\n telemetryContent: this.telemetryContent,\n callbacks: this.buyboxCallbacks,\n title: getBuyboxProductTitle(props),\n description: getBuyboxProductDescription(props),\n bulkPurchaseLink: this._renderBuyboxBulkPurchaseLink(),\n unitOfMeasure: getBuyboxProductUnitOfMeasure(props),\n configure: getBuyboxProductConfigure(props, this.state, this.buyboxCallbacks),\n findInStore: getBuyboxFindInStore(this.props, this.state, this.buyboxCallbacks),\n price: getBuyboxProductPrice(props, this.state),\n addToCart: getBuyboxAddToCart(\n props,\n this.state,\n this.buyboxCallbacks,\n defaultMinimumKeyInPrice,\n defaultMaximumKeyInPrice,\n undefined,\n hasAvailableProducts\n ),\n productComparisonButton: ArrayExtensions.hasElements(productComparisonButton)\n ? getBuyboxProductComparisonButton(\n productComparisonButton[0],\n product,\n getCatalogId(this.props.context.request),\n this.state\n )\n : undefined,\n addToOrderTemplate: getBuyboxProductAddToOrderTemplate(\n props,\n this.state,\n this.buyboxCallbacks,\n this._isChannelMultipleCatalogsFeatureEnabled(),\n catalogId\n ),\n addToWishlist: getBuyboxProductAddToWishlist(props, this.state, this.buyboxCallbacks),\n rating: !props.context.app.config.hideRating && getBuyboxProductRating(props),\n quantity: product.IsGiftCard ? undefined : getBuyboxProductQuantity(props, this.state, this.buyboxCallbacks),\n inventoryLabel: getBuyBoxInventoryLabel(props),\n shopSimilarLook:\n this.props.config.enableShopSimilarLooks && !product.IsGiftCard\n ? getBuyboxShopSimilarButton(props, ShopSimiliarButtonType.Looks)\n : undefined,\n shopSimilarDescription:\n this.props.config.enableShopSimilarDescription && !product.IsGiftCard\n ? getBuyboxShopSimilarButton(props, ShopSimiliarButtonType.Description)\n : undefined,\n keyInPrice:\n this.props.config.enableKeyInPrice && this.state.isCustomPriceSelected\n ? getBuyboxKeyInPrice(props, this.state, this.buyboxCallbacks)\n : undefined,\n quantityLimitsMessages: getQuantityLimitsMessages(props, this.state),\n min: applyDefaultOrderSettings ? min : 1,\n max,\n applyDefaultOrderSettings: applyDefaultOrderSettings,\n isChannelMultipleCatalogsFeatureEnabled: this._isChannelMultipleCatalogsFeatureEnabled(),\n currentCatalogId: catalogId,\n catalogs: this._validateCatalogDetails(catalogId)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Handles anchor click event and scrolls to the given bulk purchase module.\n * @param bulkPurchaseModule - Bulk purchase module.\n * @returns Handler.\n */\n private readonly _onBulkPurchaseLinkClick = (bulkPurchaseModule: Element) => () => {\n const boundingRect = bulkPurchaseModule.getBoundingClientRect();\n const scrollX = boundingRect.left + window.pageXOffset;\n const scrollY = boundingRect.top + window.pageYOffset;\n\n window.scrollTo(scrollX, scrollY);\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 private _renderBuyboxBulkPurchaseLink(): 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 (!msdyn365Commerce.isBrowser) {\n return null;\n }\n\n const bulkPurchaseModules = Array.from(document.getElementsByClassName(BulkPurchase.className));\n\n if (!ArrayExtensions.hasElements(bulkPurchaseModules)) {\n return null;\n }\n\n return (\n <Button\n className='ms-buybox__bulk-purchase-anchor'\n title={this.props.resources.bulkPurchaseLinkText}\n onClick={this._onBulkPurchaseLinkClick(bulkPurchaseModules[0])}\n >\n {this.props.resources.bulkPurchaseLinkText}\n </Button>\n );\n }\n\n private _updatePrice(newPrice: ProductPrice | undefined, customPrice: number | undefined = this.state.keyInPriceAmount): void {\n if (this.state.isCustomPriceSelected && newPrice) {\n newPrice.CustomerContextualPrice = customPrice;\n }\n this.setState({ productPrice: newPrice });\n }\n\n private _getProductVariant(dimensionsToUpdate: { [id: number]: string }) {\n const {\n data: {\n product: { result: product }\n },\n context: {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n }\n } = this.props;\n\n const productDimensions = this.props.data.productDimensions.result!;\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 const dimensions = (dimension.dimensionValuesWithInventory ??\n dimension.DimensionValues ??\n []) as IDimensionValueForSelectedVariant[];\n return {\n DimensionTypeValue: dimension.DimensionTypeValue,\n DimensionValue:\n dimensions.find(\n value => value.DimensionValue?.RecordId.toString() === dimensionsToUpdate[dimension.DimensionTypeValue]\n )?.DimensionValue ?? dimension.DimensionValue,\n ExtensionProperties: dimension.ExtensionProperties\n };\n })\n .filter(dimension => dimension.DimensionValue);\n setDimensionValuesToQuery(this.props.context.actionContext.requestContext.url.requestUrl, mappedDimensions);\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 const selectedProductPromise = getSelectedVariant(\n new SelectedVariantInput(\n product!.MasterProductId ? product!.MasterProductId : product!.RecordId,\n channelId,\n undefined,\n undefined,\n this.props.context.request\n ),\n actionContext\n );\n this.setState({ selectedProduct: selectedProductPromise });\n\n return { productVariantPromise: selectedProductPromise, mappedDimensions };\n }\n\n private readonly _updateDimensions = async (): Promise<void> => {\n const product = this.props.data.product.result;\n\n const productDimensions = this.props.data.productDimensions.result;\n\n const hasProductDimensions = ArrayExtensions.hasElements(productDimensions);\n\n if (!product || !hasProductDimensions) {\n return;\n }\n\n const dimensionsToUpdate: { [id: number]: string } = { ...this.dimensions };\n\n this.setState({ isUpdatingDimension: true, isUpdatingDeliveryOptions: true });\n\n // Step 1: Clear error state to display relevant errors\n if (this.state.errorState.otherError || this.state.errorState.quantityError) {\n const clearErrorState = { ...this.state.errorState };\n clearErrorState.otherError = undefined;\n if (this.state.errorState.errorHost === 'ADDTOCART') {\n clearErrorState.quantityError = undefined;\n clearErrorState.errorHost = undefined;\n }\n this.setState({ errorState: clearErrorState });\n }\n\n // Step 2: Clear any errors indicating the dimension wasn't selected\n for (const key of Object.keys(dimensionsToUpdate)) {\n if (this.state.errorState.configureErrors[key]) {\n this.setState(previousState => {\n const errorState = previousState.errorState;\n errorState.configureErrors[key] = undefined;\n return { errorState };\n });\n }\n }\n\n const data = this._getProductVariant(dimensionsToUpdate);\n const productVariant: SimpleProduct | null = await data.productVariantPromise;\n\n if (!productVariant) {\n return;\n }\n\n const promises: Promise<void>[] = [\n this._getDimensionsForSelectedVariant(productVariant, data.mappedDimensions),\n this._hydrateInventoryInfo(productVariant),\n this._hydratePrice(productVariant),\n this._hydrateDeliveryOptions(productVariant),\n this._updateQuantitiesInState(productVariant)\n ];\n\n await Promise.all(promises);\n };\n\n private async _getDimensionsForSelectedVariant(\n productVariant: SimpleProduct,\n mappedDimensions: {\n /* eslint-disable @typescript-eslint/naming-convention -- Retail proxy values */\n DimensionTypeValue: number;\n DimensionValue: ProductDimensionValue | undefined;\n ExtensionProperties: CommerceProperty[] | undefined;\n /* eslint-enable @typescript-eslint/naming-convention -- Retail proxy values */\n }[]\n ): Promise<void> {\n await getDimensionsForSelectedVariant(\n new GetDimensionsForSelectedVariantInput(\n productVariant.MasterProductId ? productVariant.MasterProductId : productVariant.RecordId,\n this.props.context.request.apiSettings.channelId,\n mappedDimensions,\n this.props.context.request\n ),\n this.props.context.actionContext\n );\n }\n\n private async _hydrateInventoryInfo(productVariant: SimpleProduct): Promise<void> {\n // Step 5. Use these dimensions hydrate the inventory. Wrap this in a promise\n // so that places like add to cart can await it\n const newAvailableQuantity = await getProductAvailabilitiesForSelectedVariant(\n new ProductAvailabilitiesForSelectedVariantInput(\n productVariant.RecordId,\n this.props.context.request.apiSettings.channelId,\n productVariant\n ),\n this.props.context.actionContext\n );\n\n const newShippingQuantity = newAvailableQuantity?.find(\n // @ts-expect-error\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (shipping: { deliveryType: any }) => shipping.deliveryType === DeliveryMode.shipping\n );\n const isCustomPriceSelected = productVariant.Dimensions?.find(\n dimension =>\n dimension.DimensionTypeValue === 4 && dimension.DimensionValue && dimension.DimensionValue.Value?.toLowerCase() === 'custom'\n );\n if (isCustomPriceSelected) {\n this.setState({ isCustomPriceSelected: true });\n } else {\n this.setState(previousState => {\n const errorState = previousState.errorState;\n errorState.customAmountError = undefined;\n return { isCustomPriceSelected: false, isPriceKeyedIn: false, errorState };\n });\n }\n\n if (newShippingQuantity) {\n this.setState({ productAvailableQuantity: newShippingQuantity });\n } else {\n this.setState({ productAvailableQuantity: undefined });\n }\n }\n\n private async _hydratePrice(productVariant: SimpleProduct): Promise<void> {\n // This function is invoked when dimensionSelectedAsync get called.\n // If the price has not been hydrated before, this means the component was just loaded for the first time with variant selected.\n // We will skip calling RS API in this case as the price data has already been fetched via module data action in node server.\n if (!this.state.isPriceApiCalled) {\n this.setState({ isPriceApiCalled: true });\n return;\n }\n\n // Step 6. Use these dimensions hydrate the product price.\n const newPrice = await getPriceForSelectedVariant(\n new PriceForSelectedVariantInput(productVariant.RecordId, this.props.context.request.apiSettings.channelId, productVariant),\n this.props.context.actionContext\n );\n\n if (newPrice) {\n this._updatePrice(newPrice);\n }\n }\n\n private async _hydrateDeliveryOptions(productVariant: SimpleProduct): Promise<void> {\n const retailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n );\n\n // Step 7. Use these dimensions hydrate the product delivery options.\n const newDeliveryOptions = await getDeliveryOptionsForSelectedVariant(\n new GetDeliveryOptionsForSelectedVariantInput(\n productVariant.RecordId,\n this.props.context.request.apiSettings.channelId,\n productVariant,\n undefined,\n retailMultiplePickupFeatureState?.IsEnabled\n ),\n this.props.context.actionContext\n );\n\n if (newDeliveryOptions) {\n this.setState({ productDeliveryOptions: newDeliveryOptions });\n }\n }\n\n private async _updateQuantitiesInState(product: SimpleProduct): Promise<void> {\n const isOrderQuantityLimitsFeatureEnabled = await this._isOrderQuantityLimitsFeatureEnabled();\n const isChannelLimitsFeatureEnabled = await this._isChannelLimitsFeatureEnabled();\n\n const min: number = this._getMinQuantityForCartLineItem(isOrderQuantityLimitsFeatureEnabled, product);\n const max: number = this._getMaxQuantityForCartLineItem(\n isChannelLimitsFeatureEnabled || isOrderQuantityLimitsFeatureEnabled,\n product\n );\n let quantity: number = this._getQuantity(product, isOrderQuantityLimitsFeatureEnabled);\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 (isOrderQuantityLimitsFeatureEnabled && product?.Behavior?.MinimumQuantity && product.Behavior.MinimumQuantity > 0) {\n return product.Behavior.MinimumQuantity;\n }\n\n return 1;\n }\n\n private _getMaxQuantityForCartLineItem(isQuantityLimitsFeatureEnabled: boolean, product: SimpleProduct): number {\n if (isQuantityLimitsFeatureEnabled && product?.Behavior?.MaximumQuantity && product.Behavior.MaximumQuantity > 0) {\n return product.Behavior.MaximumQuantity;\n }\n\n return updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem);\n }\n\n private _getQuantity(product: SimpleProduct, isOrderQuantityLimitsFeatureEnabled: boolean): number {\n const { quantity } = this.state;\n let defaultQuantity = 1;\n\n if (quantity !== defaultQuantity || !isOrderQuantityLimitsFeatureEnabled) {\n return quantity;\n }\n\n const cartConfiguration = this.props.data.cartConfiguration;\n const applyDefaultOrderSettingsForCartLine = cartConfiguration?.result?.ValidateDefaultOrderSettingsPerLine ?? false;\n if (!applyDefaultOrderSettingsForCartLine) {\n return quantity;\n }\n\n if (product?.Behavior?.DefaultQuantity && product.Behavior.DefaultQuantity > 0) {\n defaultQuantity = product.Behavior.DefaultQuantity;\n }\n\n return defaultQuantity;\n }\n\n private readonly _getDropdownName = (dimensionType: number, resources: IBuyboxResources): string => {\n const isGiftCard = this.props.data.product.result?.IsGiftCard;\n\n switch (dimensionType) {\n case 1: // ProductDimensionType.Color\n return resources.productDimensionTypeColor;\n case 2: // ProductDimensionType.Configuration\n return resources.productDimensionTypeConfiguration;\n case 3: // ProductDimensionType.Size\n return resources.productDimensionTypeSize;\n case 4: // ProductDimensionType.Style\n return isGiftCard ? resources.productDimensionTypeAmount : resources.productDimensionTypeStyle;\n default:\n return '';\n }\n };\n\n private async _isOrderQuantityLimitsFeatureEnabled(): Promise<boolean> {\n const featureStatuses = await this.props.data.featureState;\n\n const isFeatureEnabledInHq = featureStatuses?.find(\n featureState => featureState.Name === RetailDefaultOrderQuantityLimitsFeatureName\n )?.IsEnabled;\n if (!isFeatureEnabledInHq) {\n return false;\n }\n const useSiteBuilderSettings = featureStatuses?.find(\n featureState => featureState.Name === RevertToSiteBuilderOrderQuantityLimitsSettingsCRTFeatureName\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 let customerInfo;\n try {\n customerInfo = await this.props.data.customerInformation;\n } catch (error) {\n this.props.telemetry.information(error);\n this.props.telemetry.debug('Unable to receive Customer Information. May be user is not authorized');\n return false;\n }\n\n return (\n customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\n );\n } else {\n const cartConfiguration = await this.props.data.cartConfiguration;\n return !(cartConfiguration?.IgnoreOrderSettings ?? false);\n }\n }\n\n private _validateCatalogDetails(catalogId: number): ProductCatalog[] | undefined {\n const catalogs = this.props.data.catalogs?.result?.filter(item => item.RecordId === catalogId);\n if (ArrayExtensions.hasElements(catalogs) && catalogs[0].RecordId === 0) {\n return;\n }\n\n return catalogs;\n }\n\n private async _isChannelLimitsFeatureEnabled(): Promise<boolean> {\n const featureStatuses = await this.props.data.featureState;\n\n const isChannelLimitsFeatureEnabledInHq = featureStatuses?.find(\n featureState => featureState.Name === EcommerceQuantityLimitConfigurationsFeatureName\n )?.IsEnabled;\n\n return isChannelLimitsFeatureEnabledInHq ?? false;\n }\n}\n\nexport default Buybox;\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 {\n IBuyboxAddToCartViewProps,\n IBuyboxAddToOrderTemplateViewProps,\n IBuyboxAddToWishlistViewProps,\n IBuyboxKeyInPriceViewProps,\n IBuyboxProductConfigureDropdownViewProps,\n IBuyboxProductConfigureViewProps,\n IBuyboxProductQuantityViewProps,\n IBuyboxShopSimilarLookViewProps\n} from '../../common';\nimport { IBuyboxViewProps } from './buybox';\nimport { IBuyboxFindInStoreViewProps } from './components/buybox-find-in-store';\n\nconst BuyboxView: React.FC<IBuyboxViewProps> = props => {\n const {\n ModuleProps,\n MediaGalleryContainerProps,\n ProductInfoContainerProps,\n addToCart,\n addToOrderTemplate,\n addToWishlist,\n configure,\n description,\n findInStore,\n quantity,\n price,\n title,\n rating,\n inventoryLabel,\n shopSimilarLook,\n keyInPrice,\n shopSimilarDescription,\n unitOfMeasure,\n productComparisonButton\n } = props;\n\n return (\n <Module {...ModuleProps}>\n <Node {...MediaGalleryContainerProps}>{props.mediaGallery}</Node>\n <Node {...ProductInfoContainerProps}>\n {title}\n {price}\n {unitOfMeasure}\n {props.bulkPurchaseLink}\n {description}\n {rating}\n {configure && _renderConfigure(configure)}\n {keyInPrice && _renderKeyInPrice(keyInPrice)}\n {quantity && _renderQuantity(quantity)}\n {inventoryLabel}\n {addToCart && _renderAddToCart(addToCart)}\n {findInStore && _renderFindInStore(findInStore)}\n {addToOrderTemplate && _renderAddToOrderTemplate(addToOrderTemplate)}\n {addToWishlist && _renderAddToWishlist(addToWishlist)}\n {_renderSocialShare(props.slots && props.slots.socialShare)}\n {productComparisonButton}\n {shopSimilarLook && _renderShopSimilarItem(shopSimilarLook)}\n {shopSimilarDescription && _renderShopSimilarItem(shopSimilarDescription)}\n </Node>\n </Module>\n );\n};\n\nconst _renderAddToCart = (addToCart: IBuyboxAddToCartViewProps): JSX.Element => {\n const { ContainerProps, errorBlock, button } = addToCart;\n\n return (\n <Node {...ContainerProps}>\n {errorBlock}\n {button}\n </Node>\n );\n};\n\nconst _renderAddToOrderTemplate = (addToOrderTemplate: IBuyboxAddToOrderTemplateViewProps): JSX.Element => {\n const { ContainerProps, errorBlock, button } = addToOrderTemplate;\n\n return (\n <Node {...ContainerProps}>\n {errorBlock}\n {button}\n </Node>\n );\n};\n\nconst _renderAddToWishlist = (addToWishlist: IBuyboxAddToWishlistViewProps): JSX.Element => {\n const { ContainerProps, errorBlock, button } = addToWishlist;\n\n return (\n <Node {...ContainerProps}>\n {errorBlock}\n {button}\n </Node>\n );\n};\n\nconst _renderConfigure = (configure: IBuyboxProductConfigureViewProps): JSX.Element => {\n const { ContainerProps, dropdowns } = configure;\n\n return <Node {...ContainerProps}>{dropdowns.map(_renderConfigureDropdown)}</Node>;\n};\n\nconst _renderSocialShare = (socialShare: React.ReactNode[]): JSX.Element | undefined => {\n if (!socialShare || socialShare.length === 0) {\n return undefined;\n }\n\n return <>{socialShare[0]}</>;\n};\n\nconst _renderConfigureDropdown = (dropdown: IBuyboxProductConfigureDropdownViewProps): JSX.Element => {\n const { ContainerProps, LabelContainerProps, heading, errors, select } = dropdown;\n\n return (\n <Node {...ContainerProps}>\n <Node {...LabelContainerProps}>\n {heading}\n {errors}\n </Node>\n {select}\n </Node>\n );\n};\n\nconst _renderFindInStore = (findInStore: IBuyboxFindInStoreViewProps): JSX.Element => {\n const { ContainerProps, storeSelector, heading, description, errors, button, modal, productPickupOptionList } = findInStore;\n\n return (\n <Node {...ContainerProps}>\n {storeSelector}\n {heading}\n {productPickupOptionList}\n {description}\n {errors}\n {button}\n {modal}\n </Node>\n );\n};\n\nconst _renderQuantity = (quantity: IBuyboxProductQuantityViewProps): JSX.Element => {\n const { ContainerProps, LabelContainerProps, heading, input, errors } = quantity;\n\n return (\n <Node {...ContainerProps}>\n <Node {...LabelContainerProps}>\n {heading}\n {errors}\n </Node>\n {input}\n </Node>\n );\n};\n\nconst _renderKeyInPrice = (keyInPrice: IBuyboxKeyInPriceViewProps): JSX.Element => {\n const { ContainerProps, LabelContainerProps, heading, input } = keyInPrice;\n\n return (\n <Node {...ContainerProps}>\n <Node {...LabelContainerProps}>{heading}</Node>\n {input}\n </Node>\n );\n};\n\nconst _renderShopSimilarItem = (shopSimilarItem: IBuyboxShopSimilarLookViewProps): JSX.Element => {\n const { ContainerProps, errors, input } = shopSimilarItem;\n\n return (\n <Node {...ContainerProps}>\n {errors}\n {input}\n </Node>\n );\n};\nexport default BuyboxView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IRequestContext } from '@msdyn365-commerce/core';\n\n/**\n * Gets correct alt text for image based on configuration of site.\n * @param context Current request context.\n * @param shouldUseCmsAltText Should use CMS alt text.\n * @param productName Product name.\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 { commerceApiRequest, getCatalogId, IActionContext, IImageData, IImageSettings } from '@msdyn365-commerce/core';\nimport { MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getMediaLocationsForSelectedVariant, MediaLocationsForSelectedVariantInput } from '@msdyn365-commerce-modules/retail-actions';\nimport { getAltText } from './helper';\n\nexport async function getValidProductImages(\n productId: number,\n channelId: number,\n actionContext: IActionContext,\n imageSettings: IImageSettings,\n selectedProduct?: SimpleProduct\n): Promise<IImageData[]> {\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(async mediaLocation => validateMediaLocaionAsync(mediaLocation, imageSettings))).then(\n 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// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-unused-vars-experimental -- .\nasync function validateMediaLocaionAsync(mediaLocation: MediaLocation, imageSettings?: IImageSettings): Promise<[IImageData, boolean]> {\n const imageData = {\n src: mediaLocation.Uri || '',\n altText: mediaLocation.AltText || ''\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\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<IImageData[]> {\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 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 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","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport { Carousel, ICarouselProps } from '@msdyn365-commerce/components';\nimport msdyn365Commerce, { IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport {\n ProductDeliveryOptions,\n ProductDimension,\n ProductDimensionValue,\n ProductPrice,\n ReleasedProductType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n convertProductDimensionTypeToDimensionTypes,\n FinitePromiseQueue,\n FinitePromiseQueueError,\n getDeliveryOptionsForSelectedVariant,\n GetDeliveryOptionsForSelectedVariantInput,\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getPriceForSelectedVariant,\n getProductAvailabilitiesForSelectedVariant,\n getProductPageUrlSync,\n getSelectedVariant,\n IProductInventoryInformation,\n IPromiseQueue,\n ISelectedProduct,\n ObjectExtensions,\n PriceForSelectedVariantInput,\n ProductAvailabilitiesForSelectedVariantInput,\n SelectedVariantInput,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n format,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n IComponentNodeProps,\n IModuleProps,\n IncrementalQuantity,\n INodeProps,\n ISingleSlideCarouselProps,\n isMobile,\n ITelemetryContent,\n KeyCodes,\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader,\n NodeTag,\n onTelemetryClick,\n SingleSlideCarousel,\n TelemetryConstant,\n updateMaxQuantityForCartLineItem,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { Spinner, SpinnerSize } from 'office-ui-fabric-react';\nimport React, { ReactNode } from 'react';\n\nimport {\n getBuyboxAddToCart,\n getBuyBoxInventoryLabel,\n getBuyboxKeyInPrice,\n getBuyboxProductAddToWishlist,\n getBuyboxProductDescription,\n getBuyboxProductPrice,\n getBuyboxProductRating,\n getBuyboxProductTitle,\n getBuyboxProductUnitOfMeasure,\n getQuantityLimitsMessages,\n IBuyboxAddToCartViewProps,\n IBuyboxAddToOrderTemplateViewProps,\n IBuyboxAddToWishlistViewProps,\n IBuyboxCallbacks,\n IBuyboxCommonData,\n IBuyboxExtentedProps,\n IBuyboxKeyInPriceViewProps,\n IBuyboxProductConfigureViewProps,\n IBuyboxProductQuantityViewProps,\n IBuyboxState,\n IErrorState,\n IProductDetails,\n RetailDefaultOrderQuantityLimitsFeatureName,\n EcommerceQuantityLimitConfigurationsFeatureName,\n RevertToSiteBuilderOrderQuantityLimitsSettingsCRTFeatureName\n} from '../../common';\nimport { getBuyboxProductConfigure } from '../../common/buybox-product-configure';\nimport { IQuickviewData } from './quickview.data';\nimport { IQuickviewProps, IQuickviewResources } from './quickview.props.autogenerated';\nimport { getProductDetails } from './utilities/get-product-details';\nimport { getProductImages, getValidProductImages } from './utilities/get-valid-product-images';\nimport { RecentlyViewedState } from '../recently-viewed';\n\n/**\n * QuickView props Interface.\n */\nexport interface IQuickviewViewProps extends IQuickviewProps<IQuickviewData> {\n quickView: IModuleProps;\n quickViewButton: React.ReactNode;\n ModalContainer: IModuleProps;\n ModalHeaderContainer: INodeProps;\n ModalHeaderContent: React.ReactNode;\n ModalFooterContainer: INodeProps;\n ModalBodyContainer: INodeProps;\n cartContainerProps: INodeProps;\n state: IBuyboxState;\n ModuleProps?: IModuleProps;\n ProductInfoContainerProps: INodeProps;\n MediaGalleryContainerProps: INodeProps;\n callbacks?: IBuyboxCallbacks;\n title?: React.ReactNode;\n description?: React.ReactNode;\n configure?: IBuyboxProductConfigureViewProps;\n inventoryLabel?: React.ReactNode;\n rating?: React.ReactNode;\n price?: React.ReactNode;\n addToCart?: IBuyboxAddToCartViewProps;\n addToOrderTemplate?: IBuyboxAddToOrderTemplateViewProps;\n addToWishlist?: IBuyboxAddToWishlistViewProps;\n max: number | undefined;\n keyInPrice?: IBuyboxKeyInPriceViewProps;\n quantity?: IBuyboxProductQuantityViewProps;\n quantityLimitsMessages?: React.ReactNode;\n CarouselProps: INodeProps;\n Thumbnails: IQuickViewThumbnailsViewProps;\n seeDetailsbutton: React.ReactNode;\n isModalOpen: boolean;\n loading?: React.ReactNode;\n unitOfMeasure?: React.ReactNode;\n productDetails?: IProductDetails | undefined;\n isMobileDevice?: boolean;\n}\n\n/**\n * QuickView extend props Interface.\n */\nexport interface IQuickviewExtentedProps<T> extends IQuickviewProps<IQuickviewData> {\n selectedProductId?: number;\n selectedDimensions?: ProductDimension[];\n}\n\n/**\n * QuickView thumbnails props Interface.\n */\nexport interface IQuickViewThumbnailsViewProps {\n ThumbnailsContainerProps: INodeProps;\n SingleSlideCarouselComponentProps: INodeProps;\n items?: IQuickViewThumbnailItemViewProps[];\n}\n\n/**\n * QuickView thumbnail item view props Interface.\n */\nexport interface IQuickViewThumbnailItemViewProps {\n ThumbnailItemContainerProps: INodeProps;\n Picture: React.ReactElement;\n}\n\n/**\n * QuickView state Interface.\n */\nexport interface IQuickViewState extends IBuyboxState {\n isDataLoaded: boolean;\n}\n\n/**\n *\n * Quickview component.\n * @extends {React.Component<IQuickviewProps<IQuickviewData>>}\n */\nclass Quickview extends React.Component<IQuickviewExtentedProps<IQuickviewData>, IQuickViewState> {\n /**\n * A queue of tasks of processing the changes in the dimensions.\n * Limit to two processes:\n * 1 - for the current process, which is under execution at the moment.\n * 2 - next process, which will process the latest version of data.\n * @remark Enqueueing new promises will discard the previous ones (except the one which is under processing).\n */\n private readonly dimensionUpdateQueue: IPromiseQueue<void> = new FinitePromiseQueue<void>(2);\n\n private dimensions: { [id: number]: string } = {};\n\n private initializedDimensions: Set<string> = new Set();\n\n private readonly telemetryContent: ITelemetryContent;\n\n private productDetails: IProductDetails | undefined;\n\n private readonly quickViewCallbacks: IBuyboxCallbacks = {\n updateQuantity: (newQuantity: number): boolean => {\n const errorState = { ...this.state.errorState };\n errorState.quantityError = undefined;\n errorState.otherError = undefined;\n\n this.setState({ quantity: newQuantity, errorState });\n return true;\n },\n updateErrorState: (newErrorState: IErrorState): void => {\n this.setState({ errorState: newErrorState });\n },\n updateSelectedProduct: (\n newSelectedProduct: Promise<SimpleProduct | null>,\n newInventory: IProductInventoryInformation | undefined,\n newPrice: ProductPrice | undefined,\n newDeliveryOptions: ProductDeliveryOptions | undefined\n ): void => {\n this.setState({\n selectedProduct: newSelectedProduct,\n productAvailableQuantity: newInventory,\n productDeliveryOptions: newDeliveryOptions\n });\n this._updatePrice(newPrice);\n },\n initializeDimension: (initializedDimension: string): void => {\n if (initializedDimension) {\n this.initializedDimensions.add(initializedDimension);\n }\n },\n dimensionSelectedAsync: async (selectedDimensionId: number, selectedDimensionValueId: string): Promise<void> => {\n this.dimensions[selectedDimensionId] = selectedDimensionValueId;\n // Only trigger _updateDimensions when all dimensions are initialized\n if (this.initializedDimensions.size === this.productDetails?.product?.Dimensions?.length) {\n return this.dimensionUpdateQueue\n .enqueue(async () => {\n return this._updateDimensions();\n })\n .catch((error: unknown) => {\n // Ignore discarded processes.\n if (error !== FinitePromiseQueueError.ProcessWasDiscardedFromTheQueue) {\n throw error;\n }\n });\n }\n },\n getDropdownName: (dimensionType: number, resources: IQuickviewResources): string => {\n return this._getDropdownName(dimensionType, resources);\n },\n changeModalOpen: (isModalOpen: boolean): void => {\n this._hideQuickViewDialog();\n },\n changeUpdatingDimension: (isUpdatingDimension: boolean): void => {\n this.setState({ isUpdatingDimension });\n },\n updateKeyInPrice: (customPrice: number): void => {\n // Remove custom amount error when updating the custom price\n const errorState = { ...this.state.errorState };\n errorState.customAmountError = undefined;\n\n this.setState({ isPriceKeyedIn: true, keyInPriceAmount: customPrice, errorState });\n this._updatePrice(this.state.productPrice, customPrice);\n }\n };\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 public constructor(props: IQuickviewProps<IQuickviewData>) {\n super(props);\n this.state = {\n modalOpen: false,\n quantity: 1,\n min: undefined,\n max: undefined,\n errorState: {\n configureErrors: {}\n },\n selectedProduct: undefined,\n productPrice: undefined,\n productDeliveryOptions: undefined,\n isUpdatingDimension: false,\n activeIndex: 0,\n animating: false,\n mediaGalleryItems: undefined,\n isDataLoaded: false\n };\n\n this._quickViewCloseButtonclick = this._quickViewCloseButtonclick.bind(this);\n this.telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\n }\n\n /**\n * React should component udpate function.\n * @param nextProps - Next Props.\n * @param nextState - Next State.\n * @returns Boolean - Whether the module will rerender or not.\n */\n public shouldComponentUpdate(nextProps: IQuickviewProps<IQuickviewData>, nextState: IBuyboxState): 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 | null {\n const {\n config: { className = '' },\n resources\n } = this.props;\n const { max } = this.state;\n const product = this.productDetails?.product ? this.productDetails.product : undefined;\n const props = this.props as IBuyboxExtentedProps<IBuyboxCommonData>;\n const defaultMinimumKeyInPrice = 10;\n const defaultMaximumKeyInPrice = 100;\n const isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\n const viewprops: IQuickviewViewProps = {\n ...(this.props as IQuickviewExtentedProps<IQuickviewData>),\n state: this.state,\n productDetails: this.productDetails,\n isModalOpen: this.state.modalOpen!,\n quickView: {\n moduleProps: this.props,\n className: classnames('ms-quickView', className),\n tag: 'div'\n },\n isMobileDevice,\n quickViewButton: (\n <button className='ms-quickView__button' onClick={this.onClickHandler} aria-label={resources.quickViewbuttonText}>\n {resources.quickViewbuttonText}\n </button>\n ),\n ModalContainer: {\n moduleProps: this.props,\n tag: Modal,\n className: 'ms-quickView__dialog',\n isOpen: this.state.modalOpen,\n 'aria-label': format(resources.quickViewAriaLabel, this.productDetails?.product?.Name),\n toggle: this._quickViewCloseButtonclick,\n modalTransition: { timeout: 0 },\n shouldUpdateFocusToFirstElement: this.state.isDataLoaded\n },\n ModalHeaderContainer: {\n tag: ModalHeader,\n className: 'ms-quickView__header',\n toggle: this._quickViewCloseButtonclick\n },\n ModalFooterContainer: {\n tag: ModalFooter,\n className: 'ms-quickView__footer'\n },\n ModalHeaderContent: '',\n ModalBodyContainer: {\n tag: ModalBody,\n className: 'ms-quickView__body'\n },\n cartContainerProps: {\n className: 'ms-quickView__product-add-to-cart'\n },\n ProductInfoContainerProps: {\n className: 'ms-quickView__content'\n },\n MediaGalleryContainerProps: {\n className: 'ms-quickView__media-gallery'\n },\n seeDetailsbutton: this._renderSeeDetailButton(product),\n loading: !this.state.isDataLoaded && (\n <Spinner className='ms-quickView__loading__icon' label={resources.loadingText} size={SpinnerSize.large} />\n ),\n callbacks: this.quickViewCallbacks,\n title: this.state.isDataLoaded && getBuyboxProductTitle(props, this.productDetails),\n description: this.state.isDataLoaded && getBuyboxProductDescription(props, this.productDetails),\n configure: this.state.isDataLoaded\n ? getBuyboxProductConfigure(props, this.state, this.quickViewCallbacks, this.productDetails, this.props.selectedDimensions)\n : undefined,\n price: this.state.isDataLoaded && getBuyboxProductPrice(props, this.state),\n unitOfMeasure: this.state.isDataLoaded && getBuyboxProductUnitOfMeasure(props, this.productDetails),\n rating:\n this.state.isDataLoaded && !this.props.context.app.config.hideRating && getBuyboxProductRating(props, this.productDetails),\n addToCart: this.state.isDataLoaded\n ? getBuyboxAddToCart(\n props,\n this.state,\n this.quickViewCallbacks,\n defaultMinimumKeyInPrice,\n defaultMaximumKeyInPrice,\n this.productDetails\n )\n : undefined,\n keyInPrice:\n this.state.isDataLoaded && this.props.config.enableKeyInPrice && this.state.isCustomPriceSelected\n ? getBuyboxKeyInPrice(props, this.state, this.quickViewCallbacks)\n : undefined,\n quantity: product?.IsGiftCard ? undefined : this._renderQuantity(this.props, this.state, this.quickViewCallbacks),\n inventoryLabel: this.state.isDataLoaded && getBuyBoxInventoryLabel(props, this.productDetails),\n addToWishlist: this.state.isDataLoaded\n ? getBuyboxProductAddToWishlist(props, this.state, this.quickViewCallbacks, this.productDetails)\n : undefined,\n quantityLimitsMessages: this.state.isDataLoaded && getQuantityLimitsMessages(props, this.state),\n max,\n CarouselProps: this._renderCarousel(),\n Thumbnails: this._renderThumbnails()\n };\n\n return this.props.renderView(viewprops) as React.ReactElement;\n }\n\n /**\n * Method to render detail button on quick view.\n * @param product - Simple product object.\n * @returns JSX element.\n */\n private readonly _renderSeeDetailButton = (product: SimpleProduct | undefined): JSX.Element => {\n const { config } = this.props;\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.seeDetails, '');\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n\n return (\n <Button\n className='ms-quickView__seeDetailsbutton'\n onClick={onTelemetryClick(this.telemetryContent, payLoad, TelemetryConstant.seeDetails)}\n {...attributes}\n aria-label={config.seeDetailsLinkText}\n href={this._getProductURL(product)}\n >\n {config.seeDetailsLinkText}\n </Button>\n );\n };\n\n /**\n * Method to return carousel.\n * @returns Node props.\n */\n private readonly _renderCarousel = (): INodeProps => {\n const { config, resources } = this.props;\n let mediaGalleryItems: ReactNode[];\n let keys: (string | undefined)[];\n const galleryImageSettings = config.galleryImageSettings;\n if (galleryImageSettings) {\n galleryImageSettings.cropFocalRegion = true;\n }\n\n if (ArrayExtensions.hasElements(this.state.mediaGalleryItems)) {\n mediaGalleryItems = this.state.mediaGalleryItems.map((item: IImageData, index: number) => {\n return this._renderCarouselItemImageView(item, galleryImageSettings || this.defaultGalleryImageSettings, index);\n });\n keys = [...this.state.mediaGalleryItems.map(item => item.src)];\n } else {\n mediaGalleryItems = [this._renderEmptyImage(galleryImageSettings)];\n keys = ['empty'];\n }\n\n const props: IComponentNodeProps<ICarouselProps> = {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items: mediaGalleryItems,\n activeIndex: this.state.activeIndex ?? 0,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n indicatorAriaText: resources.ariaLabelForSlide,\n onIndicatorsClickHandler: this.goToIndex,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n key: keys\n };\n\n return props;\n };\n\n /**\n * Method to render thumbnails.\n * @returns QuickView Thumbnails view props.\n */\n private readonly _renderThumbnails = (): IQuickViewThumbnailsViewProps => {\n const { config, id, resources } = this.props;\n\n const thumbnailImageSettings = config.thumbnailImageSettings;\n if (thumbnailImageSettings) {\n thumbnailImageSettings.cropFocalRegion = true;\n }\n\n let mediaGalleryItems: IQuickViewThumbnailItemViewProps[];\n let keys: (string | undefined)[];\n if (ArrayExtensions.hasElements(this.state.mediaGalleryItems)) {\n mediaGalleryItems = this.state.mediaGalleryItems.map((item: IImageData, index: number) => {\n return this._getThumbnailItem(\n item,\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n index,\n this.state.activeIndex!\n );\n });\n keys = [...this.state.mediaGalleryItems.map(item => item.src)];\n } else {\n mediaGalleryItems = [];\n keys = [];\n }\n\n return {\n ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: 'ms-media-gallery__thumbnails',\n flipperPrevLabel: resources.previousScreenshotFlipperText,\n flipperNextLabel: resources.nextScreenshotFlipperText,\n parentId: id,\n useTabList: true,\n key: JSON.stringify(keys)\n } as IComponentNodeProps<ISingleSlideCarouselProps>,\n items: mediaGalleryItems\n };\n };\n\n private _updateMediaItems(lastUpdatedTime: number): void {\n const product = this.productDetails?.product;\n if (!this.state.mediaGalleryItems && product?.PrimaryImageUrl) {\n this.setState({\n mediaGalleryItems: [this._mapProductToImageData(product)],\n lastUpdate: lastUpdatedTime\n });\n }\n }\n\n private _updatePrice(newPrice: ProductPrice | undefined, customPrice: number | undefined = this.state.keyInPriceAmount): void {\n if (this.state.isCustomPriceSelected && newPrice) {\n newPrice.CustomerContextualPrice = customPrice;\n }\n this.setState({ productPrice: newPrice });\n }\n\n private readonly _updateDimensions = async (): Promise<void> => {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n }\n } = this.props;\n\n const { product, productDimensions } = this.productDetails!;\n\n if (!product || !productDimensions) {\n return;\n }\n\n const dimensionsToUpdate: { [id: number]: string } = { ...this.dimensions };\n this.setState({ isUpdatingDimension: true });\n\n // Step 1: Clear error state to display relevant errors\n if (this.state.errorState.otherError || this.state.errorState.quantityError) {\n const clearErrorState = { ...this.state.errorState };\n clearErrorState.otherError = undefined;\n if (this.state.errorState.errorHost === 'ADDTOCART') {\n clearErrorState.quantityError = undefined;\n clearErrorState.errorHost = undefined;\n }\n this.setState({ errorState: clearErrorState });\n }\n\n // Step 2: Clear any errors indicating the dimension wasn't selected\n for (const key of Object.keys(dimensionsToUpdate)) {\n if (this.state.errorState.configureErrors[key]) {\n const errorState = { ...this.state.errorState };\n errorState.configureErrors[key] = undefined;\n\n this.setState({ 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 && 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 const selectedProduct = new Promise<ISelectedProduct | null>(async resolve => {\n const newProduct = await getSelectedVariant(\n new SelectedVariantInput(\n product.MasterProductId ? product.MasterProductId : product.RecordId,\n channelId,\n mappedDimensions,\n undefined,\n this.props.context.request\n ),\n actionContext\n );\n if (newProduct) {\n // @ts-expect-error\n this.productDetails.productDimensions = 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 this.setState({ selectedProduct });\n const variantProduct = await selectedProduct;\n\n if (variantProduct && this.productDetails) {\n // Step 5. Use these dimensions hydrate the inventory. Wrap this in a promise\n // so that places like add to cart can await it\n this.productDetails.product = variantProduct;\n let images: IImageData[] = await this.getImagesForProduct(product, variantProduct);\n images = this._filterMasterImageFromVariant(images, variantProduct);\n this.setState({\n mediaGalleryItems: [...images],\n activeIndex: 0,\n lastUpdate: Date.now()\n });\n\n const newAvailableQuantity = await getProductAvailabilitiesForSelectedVariant(\n new ProductAvailabilitiesForSelectedVariantInput(variantProduct.RecordId, channelId),\n actionContext\n );\n\n this.productDetails.productAvailableQuantity = newAvailableQuantity!;\n\n const isCustompriceSelected = variantProduct.Dimensions?.find(\n dimension => dimension.DimensionTypeValue === 4 && dimension.DimensionValue?.Value?.toLowerCase() === 'custom'\n );\n\n if (isCustompriceSelected) {\n this.setState({ isCustomPriceSelected: true });\n } else {\n // Remove custom amount error when unselect the custom amount\n const errorState = { ...this.state.errorState };\n errorState.customAmountError = undefined;\n\n this.setState({ isCustomPriceSelected: false, isPriceKeyedIn: false, errorState });\n }\n\n if (newAvailableQuantity && newAvailableQuantity.length > 0) {\n this.setState({ productAvailableQuantity: newAvailableQuantity[0] });\n } else {\n this.setState({ productAvailableQuantity: undefined });\n }\n\n // Step 6. Use these dimensions hydrate the product price.\n const newPrice = await getPriceForSelectedVariant(\n new PriceForSelectedVariantInput(variantProduct.RecordId, channelId),\n actionContext\n );\n\n if (newPrice) {\n this._updatePrice(newPrice);\n }\n\n const RetailMulitplePickupMFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n );\n\n // Step 7. Use these dimensions hydrate the product delivery options.\n const newDeliveryOptions = await getDeliveryOptionsForSelectedVariant(\n new GetDeliveryOptionsForSelectedVariantInput(\n variantProduct.RecordId,\n channelId,\n undefined,\n undefined,\n RetailMulitplePickupMFeatureState?.IsEnabled\n ),\n actionContext\n );\n\n if (newDeliveryOptions) {\n this.setState({ productDeliveryOptions: newDeliveryOptions });\n }\n\n this.setState({ isUpdatingDimension: false });\n await this._updateQuantitiesInState(variantProduct);\n }\n };\n\n private _getProductURL(product: SimpleProduct | undefined): string {\n if (!product || !msdyn365Commerce.isBrowser) {\n return '';\n }\n\n let productUrl = '';\n productUrl = getProductPageUrlSync(product.Name || '', product.RecordId, this.props.context.actionContext, undefined);\n\n const fullUrl = new URL(productUrl, window.location.href);\n product.Dimensions?.map(dimension => {\n const dimensionValue = dimension.DimensionValue?.Value;\n if (!StringExtensions.isNullOrWhitespace(dimensionValue)) {\n const dimensionName = convertProductDimensionTypeToDimensionTypes(dimension.DimensionTypeValue);\n fullUrl.searchParams.set(dimensionName, dimensionValue!);\n }\n });\n return fullUrl.href;\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 private async _updateQuantitiesInState(product: SimpleProduct): Promise<void> {\n const isOrderQuantityLimitsFeatureEnabled = await this._isOrderQuantityLimitsFeatureEnabled();\n const isChannelLimitsFeatureEnabled = await this._isChannelLimitsFeatureEnabled();\n\n const min: number = this._getMinQuantityForCartLineItem(isOrderQuantityLimitsFeatureEnabled, product);\n const max: number = this._getMaxQuantityForCartLineItem(\n isChannelLimitsFeatureEnabled || isOrderQuantityLimitsFeatureEnabled,\n product\n );\n let quantity: number = this._getQuantity(product, isOrderQuantityLimitsFeatureEnabled);\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 (isOrderQuantityLimitsFeatureEnabled && product?.Behavior?.MinimumQuantity && product.Behavior.MinimumQuantity > 0) {\n return product.Behavior.MinimumQuantity;\n }\n\n return 1;\n }\n\n private _getMaxQuantityForCartLineItem(isQuantityLimitsFeatureEnabled: boolean, product: SimpleProduct): number {\n if (isQuantityLimitsFeatureEnabled && product?.Behavior?.MaximumQuantity && product.Behavior.MaximumQuantity > 0) {\n return product.Behavior.MaximumQuantity;\n }\n\n return updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem);\n }\n\n private _getQuantity(product: SimpleProduct, isOrderQuantityLimitsFeatureEnabled: boolean): number {\n const { quantity } = this.state;\n let defaultQuantity = 1;\n\n if (quantity !== defaultQuantity || !isOrderQuantityLimitsFeatureEnabled) {\n return quantity;\n }\n\n const cartConfiguration = this.props.data.cartConfiguration;\n const applyDefaultOrderSettingsForCartLine = cartConfiguration?.result?.ValidateDefaultOrderSettingsPerLine ?? false;\n if (!applyDefaultOrderSettingsForCartLine) {\n return quantity;\n }\n\n if (product?.Behavior?.DefaultQuantity && product.Behavior.DefaultQuantity > 0) {\n defaultQuantity = product.Behavior.DefaultQuantity;\n }\n\n return defaultQuantity;\n }\n\n private _filterMasterImageFromVariant(images?: IImageData[], product?: ISelectedProduct | null): IImageData[] {\n const shouldHidePrimaryImages = this.props.config.shouldHideMasterProductImagesForVariant ?? true;\n let variantImages = images ?? [];\n const isVariantProduct =\n !ObjectExtensions.isNullOrUndefined(product?.MasterProductId) || !ObjectExtensions.isNullOrUndefined(product?.productVariant);\n const itemId = product?.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 _updateDimensionValue = (\n productDimensionFull: ProductDimensionFull,\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 private readonly _getDropdownName = (dimensionType: number, resources: IQuickviewResources): string => {\n const isGiftCard = this.productDetails?.product?.IsGiftCard;\n\n switch (dimensionType) {\n case 1: // ProductDimensionType.Color\n return resources.productDimensionTypeColor;\n case 2: // ProductDimensionType.Configuration\n return resources.productDimensionTypeConfiguration;\n case 3: // ProductDimensionType.Size\n return resources.productDimensionTypeSize;\n case 4: // ProductDimensionType.Style\n return isGiftCard ? resources.productDimensionTypeAmount : resources.productDimensionTypeStyle;\n default:\n return '';\n }\n };\n\n private async _isOrderQuantityLimitsFeatureEnabled(): Promise<boolean> {\n const featureStatuses = await this.props.data.featureState;\n\n const isFeatureEnabledInHq = featureStatuses?.find(\n featureState => featureState.Name === RetailDefaultOrderQuantityLimitsFeatureName\n )?.IsEnabled;\n if (!isFeatureEnabledInHq) {\n return false;\n }\n const useSiteBuilderSettings = featureStatuses?.find(\n featureState => featureState.Name === RevertToSiteBuilderOrderQuantityLimitsSettingsCRTFeatureName\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 let customerInfo;\n try {\n customerInfo = await this.props.data.customerInformation;\n } catch (error) {\n this.props.telemetry.information(error);\n this.props.telemetry.debug('Unable to receive Customer Information. May be user is not authorized');\n return false;\n }\n\n return (\n customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\n );\n } else {\n const cartConfiguration = await this.props.data.cartConfiguration;\n return !(cartConfiguration?.IgnoreOrderSettings ?? false);\n }\n }\n\n private async _isChannelLimitsFeatureEnabled(): Promise<boolean> {\n const featureStatuses = await this.props.data.featureState;\n\n const isChannelLimitsFeatureEnabledInHq = featureStatuses?.find(\n featureState => featureState.Name === EcommerceQuantityLimitConfigurationsFeatureName\n )?.IsEnabled;\n\n return isChannelLimitsFeatureEnabledInHq ?? 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 private readonly next = (): void => {\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\n private readonly previous = (): void => {\n const nextIndex = this.isFirstItem()\n ? this.state.mediaGalleryItems\n ? this.state.mediaGalleryItems.length - 1\n : 0\n : this.state.activeIndex! - 1;\n this.goToIndex(nextIndex);\n };\n\n private readonly goToIndex = (index: number): void => {\n this.setState({ activeIndex: index });\n };\n\n private _renderCarouselItemImageView(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return <>{this._getCarouselItem(image, imageSettings, index)}</>;\n }\n\n private readonly _getCarouselItem = (image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode => (\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__item'\n {...image}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='default'\n role='tabpanel'\n key={image.src}\n id={`${this.props.id}__carousel-item__${index}`}\n />\n );\n\n private readonly _getThumbnailItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n modifiedActiveIndex: number\n ): IQuickViewThumbnailItemViewProps => {\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 'aria-controls': `${this.props.id}__carousel-item__${index}`,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__thumbnail'\n {...image}\n key={image.src}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='default'\n />\n )\n };\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 this.goToIndex(index);\n }\n };\n };\n\n private readonly _generateOnThumbnailClick = (index: number) => {\n return (event: React.MouseEvent<HTMLLIElement>) => {\n event.preventDefault();\n this.goToIndex(index);\n };\n };\n\n private _mapProductToImageData(product: SimpleProduct): IImageData {\n return {\n src: product.PrimaryImageUrl || '',\n altText: product.Name\n };\n }\n\n private readonly isFirstItem = () => this.state.activeIndex === 0;\n\n private readonly isLastItem = () => this.state.mediaGalleryItems && this.state.activeIndex === this.state.mediaGalleryItems.length - 1;\n\n private readonly onClickHandler = async (event: React.MouseEvent<HTMLElement>) => {\n return this._onClick(event, this.props);\n };\n\n private readonly _onClick = async (_event: React.MouseEvent<HTMLElement>, props: IQuickviewExtentedProps<IQuickviewData>) => {\n if (!ObjectExtensions.isNullOrUndefined(props.selectedProductId)) {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n }\n } = this.props;\n\n if (this.props.selectedProductId) {\n this.setState({ modalOpen: true });\n const productId = this.props.selectedProductId;\n const selectedDimensions = this.props.selectedDimensions;\n this.productDetails = await getProductDetails(productId, channelId, actionContext, selectedDimensions);\n const { product, productPrice } = this.productDetails;\n const currentTime: number = Date.now();\n this._updateMediaItems(currentTime);\n if (productPrice) {\n this._updatePrice(productPrice);\n }\n\n if (product) {\n const { context } = this.props;\n if (context.app.config.maxRecentlyViewedItemsCount > 0) {\n RecentlyViewedState.instance(this.props.context, context.app.config.maxRecentlyViewedItemsCount, product.RecordId);\n }\n // Check if the product is service or not by product type\n if (product.ItemTypeValue === ReleasedProductType.Service) {\n this.setState({ isServiceItem: true });\n }\n await this._updateQuantitiesInState(product);\n let images = await this.getImagesForProduct(product, product);\n images = this._filterMasterImageFromVariant(images);\n this.setState({\n mediaGalleryItems: [...images],\n activeIndex: 0,\n lastUpdate: currentTime\n });\n }\n this.setState({ isDataLoaded: true });\n }\n }\n };\n\n private getImagesForProduct = async (product: ISelectedProduct, variantProduct: ISelectedProduct): Promise<IImageData[]> => {\n let images: IImageData[];\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 product.productVariant ?? variantProduct\n );\n } else {\n images = await getValidProductImages(\n product.RecordId || 0,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n product.productVariant ?? variantProduct\n );\n }\n return images;\n };\n\n private readonly _quickViewCloseButtonclick = () => {\n this._hideQuickViewDialog();\n };\n\n private _hideQuickViewDialog(): void {\n this.dimensions = [];\n this.setState({\n modalOpen: false,\n quantity: 1,\n min: undefined,\n max: undefined,\n errorState: {\n configureErrors: {}\n },\n selectedProduct: undefined,\n productPrice: undefined,\n productDeliveryOptions: undefined,\n isUpdatingDimension: false,\n productAvailableQuantity: undefined,\n lastUpdate: undefined,\n activeIndex: undefined,\n animating: undefined,\n mediaGalleryItems: [],\n isDataLoaded: false\n });\n }\n\n /**\n * Quantity Change Handler.\n * @param callbacks -Buybox callbacks.\n * @returns Update quantity.\n */\n private readonly onChangeHandler = (callbacks: IBuyboxCallbacks) => (newValue: number): boolean => {\n if (callbacks.updateQuantity) {\n return callbacks.updateQuantity(newValue);\n }\n return true;\n };\n\n private readonly _renderQuantity = (\n props: IQuickviewExtentedProps<IQuickviewData>,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks\n ): IBuyboxProductQuantityViewProps => {\n const { resources } = props;\n\n const {\n quantity,\n min,\n max,\n errorState: { quantityError }\n } = state;\n\n return {\n ContainerProps: {\n className: 'ms-quickView__quantity'\n },\n LabelContainerProps: {\n tag: 'label',\n className: 'ms-quickView__product-quantity-label',\n htmlFor: 'ms-quickView__product-quantity-input'\n },\n heading: <div className='ms-quickView__product-quantity-label-heading'>{resources.productQuantityHeading}</div>,\n errors: quantityError && (\n <span className='msc-alert msc-alert-noborder msc-alert-danger'>\n <span className='msi-exclamation-triangle' aria-hidden='true' />\n <span>{quantityError}</span>\n </span>\n ),\n input: (\n <IncrementalQuantity\n id='ms-buybox__product-quantity-input'\n min={min}\n max={max}\n currentCount={quantity}\n onChange={this.onChangeHandler(callbacks)}\n inputQuantityAriaLabel={resources.inputQuantityAriaLabel}\n decrementButtonAriaLabel={resources.decrementButtonAriaLabel}\n incrementButtonAriaLabel={resources.incrementButtonAriaLabel}\n minQuantityText={resources.minQuantityText}\n maxQuantityText={resources.maxQuantityText}\n telemetryContent={this.telemetryContent}\n disabled={this.state.isUpdatingDimension}\n />\n )\n };\n };\n\n private _renderEmptyImage(imageSettings: IImageSettings | undefined): React.ReactNode {\n return (\n <div className='ms-media-gallery__item'>\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__item__image'\n src='empty'\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings ?? this.defaultGalleryImageSettings}\n loadFailureBehavior='empty'\n />\n </div>\n );\n }\n}\nexport default Quickview;\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 { getCartStateData, GetCartStateDataInput } from '@msdyn365-commerce/global-state';\nimport { ProductDimension } from '@msdyn365-commerce/retail-proxy';\nimport {\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getPriceForSelectedVariant,\n getProductAvailabilitiesForSelectedVariant,\n getRatingsSummary,\n GetRatingsSummaryInput,\n getRnrEndpointId,\n getRnrPartnerId,\n getSelectedVariant,\n PriceForSelectedVariantInput,\n ProductAvailabilitiesForSelectedVariantInput,\n SelectedVariantInput\n} from '@msdyn365-commerce-modules/retail-actions';\n\nimport { IProductDetails } from '../../../common/buyboxInterface';\n\n/**\n * Calls the Retail API and returns the product details.\n * @param productId\n * @param channelId\n * @param ctx\n * @param selectedDimensions - Dimensions previously selected for the product variant.\n */\nexport async function getProductDetails(\n productId: number,\n channelId: number,\n ctx: IActionContext,\n selectedDimensions?: ProductDimension[]\n): Promise<IProductDetails> {\n const productDetails: IProductDetails = {};\n\n if (productId > 0 && channelId > 0) {\n const tenantId = getRnrPartnerId(ctx);\n const serviceEndPoint = getRnrEndpointId(ctx);\n\n // Get Product Details\n await getSelectedVariant(new SelectedVariantInput(productId, channelId, selectedDimensions, 'get', ctx.requestContext), ctx)\n .then(async productResult => {\n if (productResult) {\n productDetails.product = productResult;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n });\n\n // Get Product Availability\n await getProductAvailabilitiesForSelectedVariant(new ProductAvailabilitiesForSelectedVariantInput(productId, channelId), ctx)\n .then(productAvailabilities => {\n if (productAvailabilities) {\n productDetails.productAvailableQuantity = productAvailabilities;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n });\n\n // Get Product Price\n await getPriceForSelectedVariant(new PriceForSelectedVariantInput(productId, channelId, undefined), ctx)\n .then(productPrice => {\n if (productPrice) {\n productDetails.productPrice = productPrice;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n });\n\n // Get product dimensions\n await getDimensionsForSelectedVariant(\n new GetDimensionsForSelectedVariantInput(productId, channelId, selectedDimensions, ctx.requestContext),\n ctx\n )\n .then(productDimensions => {\n if (productDimensions) {\n productDetails.productDimensions = productDimensions;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n });\n\n // Get Cart State\n await getCartStateData(new GetCartStateDataInput(ctx.requestContext.apiSettings, ctx.requestContext), ctx)\n .then(cartState => {\n productDetails.cart = cartState;\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n });\n\n // Get Product Ratings\n if (tenantId && serviceEndPoint) {\n await getRatingsSummary(new GetRatingsSummaryInput(productId.toString(), tenantId, serviceEndPoint), ctx)\n .then(ratingsSummaryData => {\n if (ratingsSummaryData) {\n productDetails.ratingsSummary = ratingsSummaryData;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n });\n }\n }\n\n return productDetails;\n}\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 {\n IBuyboxAddToCartViewProps,\n IBuyboxAddToWishlistViewProps,\n IBuyboxKeyInPriceViewProps,\n IBuyboxProductConfigureDropdownViewProps,\n IBuyboxProductConfigureViewProps,\n IBuyboxProductQuantityViewProps\n} from '../../common';\nimport { IQuickviewViewProps } from './quickview';\n\nconst _renderAddToCart = (addToCart: IBuyboxAddToCartViewProps): JSX.Element => {\n const { ContainerProps, errorBlock, button } = addToCart;\n\n return (\n <Node {...ContainerProps}>\n {errorBlock}\n {button}\n </Node>\n );\n};\n\nconst _renderAddToWishlist = (addToWishlist: IBuyboxAddToWishlistViewProps): JSX.Element => {\n const { ContainerProps, errorBlock, button } = addToWishlist;\n\n return (\n <Node {...ContainerProps}>\n {errorBlock}\n {button}\n </Node>\n );\n};\n\nconst _renderConfigureDropdown = (dropdown: IBuyboxProductConfigureDropdownViewProps): JSX.Element => {\n const { ContainerProps, LabelContainerProps, heading, errors, select } = dropdown;\n\n return (\n <Node {...ContainerProps}>\n <Node {...LabelContainerProps}>\n {heading}\n {errors}\n </Node>\n {select}\n </Node>\n );\n};\n\nconst _renderQuickViewPopup = (props: IQuickviewViewProps): JSX.Element => {\n const {\n ModalContainer,\n ModalHeaderContainer,\n ModalFooterContainer,\n ModalHeaderContent,\n ModalBodyContainer,\n addToWishlist,\n addToCart,\n cartContainerProps\n } = props;\n\n return (\n <Module {...ModalContainer}>\n <Node {...ModalHeaderContainer}>{ModalHeaderContent}</Node>\n <Node {...ModalBodyContainer}>{_renderBodyContent(props)}</Node>\n <Node {...ModalFooterContainer}>\n <Node {...cartContainerProps}>\n {addToCart && _renderAddToCart(addToCart)}\n {addToWishlist && _renderAddToWishlist(addToWishlist)}\n </Node>\n </Node>\n </Module>\n );\n};\n\nconst _renderQuantity = (quantity: IBuyboxProductQuantityViewProps, quantityLimitsMessages: React.ReactNode): JSX.Element => {\n const { ContainerProps, LabelContainerProps, heading, input, errors } = quantity;\n\n return (\n <Node {...ContainerProps}>\n <Node {...LabelContainerProps}>\n {heading}\n {errors}\n </Node>\n {input}\n {quantityLimitsMessages}\n </Node>\n );\n};\n\nconst _renderKeyInPrice = (keyInPrice: IBuyboxKeyInPriceViewProps): JSX.Element => {\n const { ContainerProps, LabelContainerProps, heading, input } = keyInPrice;\n\n return (\n <Node {...ContainerProps}>\n <Node {...LabelContainerProps}>{heading}</Node>\n {input}\n </Node>\n );\n};\n\nconst _renderConfigure = (configure: IBuyboxProductConfigureViewProps): JSX.Element => {\n const { ContainerProps, dropdowns } = configure;\n\n return <Node {...ContainerProps}>{dropdowns.map(_renderConfigureDropdown)}</Node>;\n};\n\nconst _renderBodyContent = (props: IQuickviewViewProps): JSX.Element => {\n const {\n title,\n price,\n rating,\n keyInPrice,\n quantity,\n configure,\n inventoryLabel,\n quantityLimitsMessages,\n seeDetailsbutton,\n loading,\n ProductInfoContainerProps,\n MediaGalleryContainerProps,\n CarouselProps,\n unitOfMeasure\n } = props;\n if (loading) {\n return <>{loading}</>;\n }\n return (\n <>\n <Node {...MediaGalleryContainerProps}>\n <Node {...CarouselProps} />\n </Node>\n <Node {...ProductInfoContainerProps}>\n {title}\n {price}\n {unitOfMeasure}\n {rating}\n {configure && _renderConfigure(configure)}\n {keyInPrice && _renderKeyInPrice(keyInPrice)}\n {quantity && _renderQuantity(quantity, quantityLimitsMessages)}\n {seeDetailsbutton}\n {inventoryLabel}\n </Node>\n </>\n );\n};\n\n/**\n * Functional component which renders quick view button and popup based by the given props file.\n * @param {IQuickviewViewProps} props - Configuration for the quick view component.\n * @returns {React.FC<IQuickviewViewProps>} - Functional component of the quick view.\n */\nexport const QuickViewFunctionalComponent: React.FC<IQuickviewViewProps> = (props: IQuickviewViewProps) => {\n const { quickView, quickViewButton, isModalOpen, isMobileDevice } = props;\n return (\n <Module {...quickView}>\n {!isMobileDevice && quickViewButton}\n {isModalOpen && _renderQuickViewPopup(props)}\n </Module>\n );\n};\n\nexport default QuickViewFunctionalComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RecentlyViewedItem } from './recently-viewed-item';\n\n/**\n * Represents a product for comparison.\n */\nexport class RecentlyViewedProductItem extends RecentlyViewedItem<string> {\n public readonly productId: number;\n\n public readonly catalogId: number;\n\n public static getItemId(productId: number, catalogId: number): string {\n return `${productId}-${catalogId}`;\n }\n\n public constructor(productId: number, catalogId: number) {\n const itemId = RecentlyViewedProductItem.getItemId(productId, catalogId);\n super(itemId);\n\n this.productId = productId;\n this.catalogId = catalogId;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/**\n * Represents an item for recently viewed.\n */\nexport abstract class RecentlyViewedItem<ItemId> {\n public readonly itemId: ItemId;\n\n public constructor(itemId: ItemId) {\n this.itemId = itemId;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getCatalogId, ICookieContext, ICoreContext } from '@msdyn365-commerce/core';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { RecentlyViewedProductItem } from './base';\nimport { RecentlyViewedManager } from './recently-viewed-manager';\n\n/**\n * Represents a recently viewed product which operates a list of products and cookies to store the list.\n */\nexport class RecentlyViewedState extends RecentlyViewedManager<string, RecentlyViewedProductItem> {\n private static readonly _recentlyViewedLocalStorageKey: string = '_msdyn365___recently_viewed_products';\n\n public static instance(context: ICoreContext, maxRecentlyViewedItemsCount: number, productId: number): void {\n const cookieContext: ICookieContext = context.request.cookies;\n let items = RecentlyViewedState._retrieveItemsFromCookies(cookieContext);\n\n const catalogId = getCatalogId(context.request);\n\n const item = new RecentlyViewedProductItem(productId, catalogId);\n const max: number = maxRecentlyViewedItemsCount + 1 || 11;\n const index: number = items.map(object => object.productId).indexOf(item.productId);\n if (item && index === -1) {\n items.push(item);\n } else {\n items.splice(items.length - 1, 0, items.splice(index, 1)[0]);\n }\n if (items.length > max) {\n items = items.slice(Math.max(items.length - max, 0));\n }\n\n RecentlyViewedState._writeToCookie(cookieContext, RecentlyViewedState._recentlyViewedLocalStorageKey, items);\n }\n\n private static _retrieveItemsFromCookies(cookieContext: ICookieContext): RecentlyViewedProductItem[] {\n const items = RecentlyViewedState._readFromCookie(cookieContext, RecentlyViewedState._recentlyViewedLocalStorageKey);\n if (!ArrayExtensions.hasElements(items)) {\n return [];\n }\n return items;\n }\n\n private static _readFromCookie(cookieContext: ICookieContext, cookieKey: string): RecentlyViewedProductItem[] | undefined | null {\n if (!cookieKey) {\n return undefined;\n }\n\n if (!cookieContext.isConsentGiven()) {\n return undefined;\n }\n\n const cookieValue = cookieContext.get<RecentlyViewedProductItem[] | undefined | null>(cookieKey);\n\n return cookieValue.value;\n }\n\n private static _writeToCookie(cookieContext: ICookieContext, cookieKey: string, value: RecentlyViewedProductItem[]): void {\n if (!cookieKey) {\n return;\n }\n\n cookieContext.set(cookieKey, value, { secure: true, maxAge: 5_184_000 });\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RecentlyViewedItem } from './base';\n\n/**\n * Represents base functionality of a recently viewed manager which operates a list of items for recently viewed.\n */\nexport class RecentlyViewedManager<ItemId, Item extends RecentlyViewedItem<ItemId> = RecentlyViewedItem<ItemId>> {\n private _recentlyViewedItems: Item[];\n\n public get items(): Item[] {\n return this._recentlyViewedItems;\n }\n\n public constructor(...items: Item[]) {\n this._recentlyViewedItems = items;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getTelemetryObject, IModuleProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { ICarouselData } from './carousel.data';\nimport { ICarouselProps } from './carousel.props.autogenerated';\nimport { ICarouselState } from './carousel.state';\n\nexport interface ICarouselViewProps extends ICarouselProps<{}>, ICarouselState {\n closeAnimation: string;\n carouselContainer: IModuleProps;\n telemetryContent: ITelemetryContent;\n next(): void;\n previous(): void;\n onIndicatorsClickHandler(): void;\n handleDismissCarousel(): void;\n handleOnExited(): void;\n handleOnExiting(): void;\n}\n\n/**\n *\n * CarouselModule component.\n * @extends {React.PureComponent<ICarouselProps<ICarouselData>>}\n */\nclass CarouselModule extends React.PureComponent<ICarouselProps<ICarouselData>, ICarouselState> {\n private animating: boolean;\n\n private readonly telemetryContent: ITelemetryContent;\n\n constructor(props: ICarouselProps<ICarouselData>, state: ICarouselState) {\n super(props);\n this.state = { activeIndex: 0, closeNow: false, dismissCarousel: false };\n this.animating = false;\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public componentDidMount(): void {\n if (this.props.context && this.props.context.request && this.props.context.request.cookies) {\n if (this.props.context.request.cookies.get(`CarouselDismiss_${this.props.id}`) === undefined) {\n this.props.context.request.cookies.set(`CarouselDismiss_${this.props.id}`, 'false');\n this.setState({ dismissCarousel: false });\n }\n }\n }\n\n public render(): JSX.Element | null {\n if (this.state.dismissCarousel) {\n return null;\n }\n\n const { className } = this.props.config;\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 ...this.state,\n telemetryContent: this.telemetryContent,\n carouselContainer: {\n moduleProps: this.props,\n className: classnames('ms-carousel', className)\n },\n closeAnimation: this.state.closeNow ? 'close-now' : '',\n next: this._next,\n previous: this._previous,\n onIndicatorsClickHandler: this._goToIndex,\n handleDismissCarousel: this._handleDismissCarousel,\n handleOnExited: this._onExited,\n handleOnExiting: this._onExiting\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Function implementation to dismiss the Carousel.\n */\n private readonly _handleDismissCarousel = (): void => {\n if (this.props.context && this.props.context.request && this.props.context.request.cookies) {\n this.props.context.request.cookies.set(`CarouselDismiss_${this.props.id}`, 'true');\n this.setState({ dismissCarousel: true });\n }\n };\n\n /**\n * Function implementation to move to next slide.\n */\n private readonly _next = (): void => {\n const { slots } = this.props;\n const nextIndex = this.state.activeIndex === (slots && slots.content && slots.content.length - 1) ? 0 : this.state.activeIndex + 1;\n\n if (this.animating) {\n this.setState({ closeNow: true, activeIndex: nextIndex });\n } else {\n this.setState({ activeIndex: nextIndex });\n }\n };\n\n /**\n * Function implementation to move to previous slide.\n */\n private readonly _previous = (): void => {\n const slots = this.props.slots && this.props.slots.content;\n const nextIndex = this.state.activeIndex === 0 ? (slots ? slots.length - 1 : 0) : this.state.activeIndex - 1;\n\n if (this.animating) {\n this.setState({ closeNow: true, activeIndex: nextIndex });\n } else {\n this.setState({ activeIndex: nextIndex });\n }\n };\n\n private readonly _onExiting = (): void => {\n this.animating = true;\n };\n\n private readonly _onExited = (): void => {\n this.animating = false;\n this.setState({ closeNow: false });\n };\n\n /**\n * Function implementation to move to a given slide.\n * @param newIndex\n */\n private readonly _goToIndex = (newIndex: number): void => {\n if (this.animating) {\n return;\n }\n this.setState({ activeIndex: newIndex });\n };\n}\n\nexport default CarouselModule;\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 { Module } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { ICarouselViewProps } from './carousel';\n\n/**\n * Returns item slots.\n * @returns Array of item slots.\n * @param props -Props.\n */\nconst retrieveItems = (props: ICarouselViewProps): React.ReactNode[] => {\n let items = [];\n items = props.slots && props.slots.content && props.slots.content.length > 0 ? props.slots.content : [];\n return items;\n};\nconst CarouselView: React.FC<ICarouselViewProps> = props => (\n <Module {...props.carouselContainer} {...props.renderModuleAttributes(props)}>\n <Carousel\n className={classnames(props.closeAnimation)}\n activeIndex={props.activeIndex}\n next={props.next}\n previous={props.previous}\n pause={props.config.pauseOnHover ? 'hover' : false}\n ride={props.config.autoplay ? 'carousel' : undefined}\n autoplay={props.config.autoplay}\n interval={props.config.interval}\n transitionType={props.config.transitionType ? props.config.transitionType : undefined}\n items={retrieveItems(props)}\n hideFlipper={props.config.hideFlipper}\n dismissEnabled={props.config.dismissEnabled}\n onIndicatorsClickHandler={props.onIndicatorsClickHandler}\n handleDismissCarousel={props.handleDismissCarousel}\n dismissCarouselAriaText={props.resources && props.resources.ariaLabelForDismissButton}\n indicatorAriaText={props.resources && props.resources.ariaLabelForSlide}\n directionTextPrev={props.resources && props.resources.flipperPrevious}\n directionTextNext={props.resources && props.resources.flipperNext}\n handleOnExited={props.handleOnExited}\n handleOnExiting={props.handleOnExiting}\n telemetryContent={props.telemetryContent}\n keyboard={props.config.keyboard}\n />\n </Module>\n);\n\nexport default CarouselView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport msdyn365Commerce, { getCatalogId, getUrlSync, IImageSettings, Image, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n convertProductDimensionTypeToDimensionTypes,\n getFallbackImageUrl,\n getProductUrlSync,\n ObjectExtensions,\n Random,\n StringExtensions,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, IModuleProps, isMobile, VariantType, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport { RemoveFromComparisonButtonComponent } from '../product-comparison';\nimport { ProductComparisonState } from '../product-comparison-state';\nimport {\n getProductsInPreviewProductComparisonAction,\n GetProductsInPreviewProductComparisonInput,\n IProductComparisonProductData\n} from './actions';\nimport { IProductComparisonPreviewData } from './product-comparison-preview.data';\nimport { IProductComparisonPreviewProps } from './product-comparison-preview.props.autogenerated';\n\n/**\n * Represents product comparison view props for main product info.\n */\nexport interface IProductComparisonPreviewProductMainInfo {\n productData: IProductComparisonProductData;\n productNameLink?: string;\n\n removeFromComparisonButton: React.ReactNode;\n productImage: React.ReactNode;\n productLink: React.ReactNode;\n}\n\n/**\n * Represents product comparison view props.\n */\nexport interface IProductComparisonPreviewViewProps extends IProductComparisonPreviewProps<{}> {\n moduleProps: IModuleProps;\n collapseButton: INodeProps;\n isMainContentReady: boolean;\n\n hasUserInteractedWithComparison?: boolean;\n isExpanded?: boolean;\n subheaderText?: string;\n productsMainInfo?: IProductComparisonPreviewProductMainInfo[];\n previewGreyPlaceHolders?: React.ReactNode;\n\n productComparisonLink?: string;\n goToComparisonButton?: React.ReactNode;\n clearAllButton?: React.ReactNode;\n\n handleCollapseClick?(): void;\n clearAllProductsFromTheComparison?(): void;\n removeProductFromList?(itemId: string): void;\n}\n\n/**\n * Extended props for the module including info about the product.\n */\nexport interface IProductComparisonPreviewState {\n isExpanded?: boolean;\n productsData?: IProductComparisonProductData[];\n greyPlaceHoldersCount?: number;\n}\n\n/**\n * Extended props for the module including info about the product.\n */\nexport interface IProductComparisonPreviewFullProps extends IProductComparisonPreviewProps<IProductComparisonPreviewData> {}\n\n/**\n * Represents the component which renders product comparison table.\n */\nexport class ProductComparisonPreview extends React.PureComponent<IProductComparisonPreviewFullProps, IProductComparisonPreviewState> {\n public static readonly className = 'ms-product-comparison-preview';\n\n public static readonly containerClassName = `${ProductComparisonPreview.className}__container`;\n\n public static readonly mainContainerClassName = `${ProductComparisonPreview.containerClassName}__main-container`;\n\n public static readonly headerClassName = `${ProductComparisonPreview.mainContainerClassName}__header`;\n\n public static readonly headerLabelClassName = `${ProductComparisonPreview.headerClassName}__label`;\n\n public static readonly tableClassName = `${ProductComparisonPreview.mainContainerClassName}__table`;\n\n public static readonly tableRowClassName = `${ProductComparisonPreview.tableClassName}__product-row`;\n\n public static readonly footerClassName = `${ProductComparisonPreview.mainContainerClassName}__footer`;\n\n public static readonly collapseButtonClassName = `${ProductComparisonPreview.headerClassName}__collapse`;\n\n public static _displayedInstanceId?: string;\n\n private readonly _instanceId: string;\n\n private _hasUserInteractedWithComparison: boolean;\n\n public constructor(props: IProductComparisonPreviewFullProps) {\n super(props);\n\n this.state = {};\n\n this._instanceId = `${ProductComparisonPreview.className}-${this.props.id}-${Random.Guid.generateGuid()}`;\n ProductComparisonPreview._displayedInstanceId = this._instanceId;\n\n this._hasUserInteractedWithComparison = false;\n }\n\n public componentDidMount(): void {\n if (this._instanceId !== ProductComparisonPreview._displayedInstanceId) {\n return;\n }\n\n this._loadProducts();\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).listModifiedEvent.subscribe(\n {\n instanceId: this._instanceId,\n\n /**\n * Updates the state in case the state for the particular product was changed.\n */\n handler: () => {\n this._hasUserInteractedWithComparison = true;\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Initialize data downloading.\n this._loadProducts();\n }\n }\n );\n }\n\n public componentWillUnmount(): void {\n ProductComparisonState.instance(\n this.props.context.request,\n this.props.data.accountInformation?.result\n ).listModifiedEvent.unsubscribe(this._instanceId);\n }\n\n public render(): React.ReactNode {\n if (this._instanceId !== ProductComparisonPreview._displayedInstanceId) {\n return null;\n }\n\n const viewProps: IProductComparisonPreviewViewProps = {\n ...this.props,\n moduleProps: {\n moduleProps: this.props,\n className: ProductComparisonPreview.className,\n id: this._instanceId\n },\n collapseButton: this._renderCollapseButton(),\n isMainContentReady: false,\n hasUserInteractedWithComparison: this._hasUserInteractedWithComparison\n };\n\n const productData = this._getProdutComparisonDataByCatalogId(this.state.productsData ?? this.props.data.productsData?.result);\n\n if (!ArrayExtensions.hasElements(productData)) {\n return this.props.renderView(viewProps);\n }\n\n viewProps.isMainContentReady = true;\n\n const productsLimit = this._getProductsLimit();\n if (!ObjectExtensions.isNullOrUndefined(productsLimit)) {\n viewProps.subheaderText = this.props.resources.productComparisonPreviewHeaderTextWithLimit\n .replace('{0}', productData.length.toString())\n .replace('{1}', productsLimit.toString());\n }\n\n viewProps.isExpanded = this.state.isExpanded;\n viewProps.handleCollapseClick = this._handleCollapseClick;\n viewProps.productsMainInfo = this._getProductsMainInfo(productData);\n viewProps.previewGreyPlaceHolders = this._renderGreyPlaceHolders(productData);\n viewProps.productComparisonLink = getUrlSync('product-comparison', this.props.context.actionContext);\n viewProps.clearAllProductsFromTheComparison = this._clearAllProductsFromTheComparison;\n viewProps.removeProductFromList = this._removeProductFromList;\n viewProps.goToComparisonButton = this._renderGoToComparisonButton(viewProps.productComparisonLink);\n viewProps.clearAllButton = this._renderClearAllButton();\n\n return this.props.renderView(viewProps);\n }\n private _getProdutComparisonDataByCatalogId(productData: IProductComparisonProductData[] | undefined): IProductComparisonProductData[] {\n const catalogId = getCatalogId(this.props.context.request);\n validateCatalogId(catalogId);\n const productByCatalogId = productData?.filter(product => product.catalogId === catalogId) ?? [];\n return productByCatalogId;\n }\n private async _loadProducts(): Promise<void> {\n const items = ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).items;\n const input = new GetProductsInPreviewProductComparisonInput(items);\n const productData = await getProductsInPreviewProductComparisonAction(input, this.props.context.actionContext);\n const productDataByCatalogId = this._getProdutComparisonDataByCatalogId(productData);\n this.setState({ productsData: productDataByCatalogId });\n this._getGreyPlaceHoldersCount(productDataByCatalogId);\n }\n\n private _getGreyPlaceHoldersCount(productData: IProductComparisonProductData[]): number | undefined {\n if (productData && ArrayExtensions.hasElements(productData)) {\n const limit = this._getProductsLimit();\n if (limit && this.props.context.app.config.displayGreyPlaceHolders) {\n const placeHolder = limit - productData.length;\n this.setState({ greyPlaceHoldersCount: placeHolder });\n return placeHolder;\n }\n }\n return;\n }\n\n private _getProductsMainInfo(products: IProductComparisonProductData[]): IProductComparisonPreviewProductMainInfo[] {\n const productImageContainerClassName = `${ProductComparisonPreview.tableRowClassName}__product-image-container`;\n const productImageClassName = `${productImageContainerClassName}__product-image`;\n const productNameClassName = `${ProductComparisonPreview.tableRowClassName}__product-name`;\n\n return products.map(productData => {\n const product = productData.product;\n\n let productNameLink: string | undefined;\n if (msdyn365Commerce.isBrowser) {\n const productUrl = getProductUrlSync(product, this.props.context.actionContext);\n const fullUrl = new URL(productUrl, window.location.href);\n if (isChannelTypeB2B(this.props.context.actionContext.requestContext)) {\n fullUrl.searchParams.set('catalogid', `${productData.catalogId}`);\n }\n product.Dimensions?.map(dimension => {\n const dimensionValue = dimension.DimensionValue?.Value;\n if (!StringExtensions.isNullOrWhitespace(dimensionValue)) {\n const dimensionName = convertProductDimensionTypeToDimensionTypes(dimension.DimensionTypeValue);\n fullUrl.searchParams.set(dimensionName, dimensionValue!);\n }\n });\n productNameLink = fullUrl.href;\n }\n\n return {\n productNameLink,\n productData,\n removeFromComparisonButton: (\n <RemoveFromComparisonButtonComponent\n className={`${ProductComparisonPreview.tableRowClassName}__remove`}\n resources={this.props.resources}\n itemId={productData.itemId}\n onClickHandler={this._removeProductFromList}\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{}}\n />\n ),\n productImage: (\n <a className={productImageContainerClassName} href={productNameLink}>\n {this._renderProductImage(productImageClassName, productData.product)}\n </a>\n ),\n productLink: (\n <a className={productNameClassName} href={productNameLink}>\n {productData.product.Name}\n </a>\n )\n };\n });\n }\n\n /**\n * Represents product comparison preview view.\n * @returns Elements.\n */\n private _renderGreyPlaceHolders = (productData: IProductComparisonProductData[]): React.ReactNode[] | undefined => {\n const counts = this.state.greyPlaceHoldersCount;\n if (this.props.context.app.config.displayGreyPlaceHolders && counts! > 0) {\n const elements = [];\n for (let index = 0; index < counts!; index++) {\n elements.push(\n <td className='' key={index}>\n <div className='placeholder-preview' />\n </td>\n );\n }\n return elements;\n }\n return;\n };\n\n /**\n * Removes the product from a list.\n * @param itemId - The id of a product to remove.\n */\n private readonly _removeProductFromList = (itemId: string): void => {\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).removeItemById(itemId);\n this.setState(previousState => {\n return {\n productsData: previousState.productsData?.filter(item => item.itemId !== itemId)\n };\n });\n };\n\n /**\n * Toggle collapsing.\n */\n private readonly _handleCollapseClick: () => void = () => {\n this.setState(previousState => {\n return {\n isExpanded: !(previousState.isExpanded ?? this._hasUserInteractedWithComparison)\n };\n });\n };\n\n /**\n * Removes all products from the comparison.\n */\n private readonly _clearAllProductsFromTheComparison = () => {\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).clearAll();\n this.setState({ productsData: [] });\n };\n\n private _getProductsLimit(): number | undefined {\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n if (viewport === 'xs' || viewport === 'sm') {\n return this.props.context.app.config.productComparisonMobileProductsLimit;\n }\n return this.props.context.app.config.productComparisonDesktopProductsLimit;\n }\n\n /**\n * Retrieves product image react node.\n * @param className - Class name to use.\n * @param product - Product info.\n * @returns React node.\n */\n private _renderProductImage(className: string, product?: SimpleProduct): React.ReactNode | undefined {\n if (ObjectExtensions.isNullOrUndefined(product)) {\n return undefined;\n }\n\n const defaultImageSettingQ = 'w=140&h=140&m=6';\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: defaultImageSettingQ, w: 0, h: 0 },\n lg: { q: defaultImageSettingQ, w: 0, h: 0 },\n xl: { q: defaultImageSettingQ, w: 0, h: 0 }\n },\n lazyload: true\n };\n\n return (\n <Image\n key={product.Name}\n src={product.PrimaryImageUrl ?? ''}\n fallBackSrc={\n getFallbackImageUrl(\n product.ItemId,\n this.props.context.actionContext.requestContext.apiSettings,\n this.props.context.request.app?.config?.OmniChannelMedia\n ) ?? ''\n }\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={defaultImageSettings}\n loadFailureBehavior='empty'\n className={className}\n requestContext={this.props.context.actionContext.requestContext}\n />\n );\n }\n\n private _renderCollapseButton(): INodeProps {\n const shouldBeExpanded = this.state.isExpanded ?? this._hasUserInteractedWithComparison;\n const headerContainerClassName = `${ProductComparisonPreview.mainContainerClassName}__header_button`;\n let collapseClassName = `${ProductComparisonPreview.collapseButtonClassName}__expanded`;\n if (!shouldBeExpanded) {\n collapseClassName = `${ProductComparisonPreview.collapseButtonClassName}__collapsed`;\n }\n\n return {\n className: classnames(headerContainerClassName, ProductComparisonPreview.collapseButtonClassName, collapseClassName),\n onClick: this._handleCollapseClick,\n role: 'button',\n tabIndex: 0\n };\n }\n\n private _renderGoToComparisonButton(productComparisonLink: string | undefined): React.ReactNode {\n return (\n <Button\n className={`${ProductComparisonPreview.footerClassName}__go-to-comparison`}\n href={productComparisonLink}\n title={this.props.resources.productComparisonCompareProductsButtonText}\n >\n {this.props.resources.productComparisonCompareProductsButtonText}\n </Button>\n );\n }\n\n private _renderClearAllButton(): React.ReactNode {\n return (\n <Button\n className={`${ProductComparisonPreview.footerClassName}__clear-all`}\n title={this.props.resources.productComparisonClearAllProductsButtonText}\n onClick={this._clearAllProductsFromTheComparison}\n >\n {this.props.resources.productComparisonClearAllProductsButtonText}\n </Button>\n );\n }\n}\n\nexport default ProductComparisonPreview;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport msdyn365Commerce from '@msdyn365-commerce/core';\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IProductComparisonPreviewViewProps, ProductComparisonPreview } from './product-comparison-preview';\n\n/**\n * Represents product comparison preview view.\n * @param props - View props for product comparison preview.\n * @returns Functional component of product comparison preview.\n */\nexport const ProductComparisonPreviewViewFunctionalComponent: React.FC<IProductComparisonPreviewViewProps> = props => {\n if (!props.isMainContentReady) {\n return null;\n }\n\n const shouldBeExpanded = props.isExpanded ?? props.hasUserInteractedWithComparison;\n\n const containerClassName = classnames(\n ProductComparisonPreview.mainContainerClassName,\n shouldBeExpanded ? '' : `${ProductComparisonPreview.mainContainerClassName}__collapsed`\n );\n\n return (\n <Module {...props.moduleProps}>\n <Node className={ProductComparisonPreview.containerClassName}>\n <Node className={containerClassName}>\n <Node className={`${ProductComparisonPreview.mainContainerClassName}__header__section`}>\n <Node {...props.collapseButton}>\n <Node className={ProductComparisonPreview.headerClassName}>\n <Node className={ProductComparisonPreview.headerLabelClassName}>\n <Node className={`${ProductComparisonPreview.headerLabelClassName}__icon`} />\n <Node className={`${ProductComparisonPreview.headerLabelClassName}__main-text`}>\n {props.resources.productComparisonPreviewHeaderText}\n </Node>\n <Node className={`${ProductComparisonPreview.headerLabelClassName}__sub-text`}>\n {props.subheaderText}\n </Node>\n </Node>\n </Node>\n </Node>\n <Node className={ProductComparisonPreview.tableClassName} tag='table'>\n <Node className='' tag='tbody'>\n <Node className={ProductComparisonPreview.tableRowClassName} tag='tr'>\n {props.productsMainInfo?.map(info => {\n return (\n <Node className='' tag='td' key={info.productData.itemId}>\n {info.removeFromComparisonButton}\n {info.productImage}\n </Node>\n );\n })}\n {props.previewGreyPlaceHolders}\n </Node>\n <Node className={ProductComparisonPreview.tableRowClassName} tag='tr'>\n {props.productsMainInfo?.map(info => {\n return (\n <Node className='' tag='td' key={info.productData.itemId}>\n {msdyn365Commerce.isBrowser ? info.productLink : undefined}\n </Node>\n );\n })}\n </Node>\n </Node>\n </Node>\n </Node>\n <Node className={ProductComparisonPreview.footerClassName}>\n {props.clearAllButton}\n {props.goToComparisonButton}\n </Node>\n </Node>\n </Node>\n </Module>\n );\n};\n\nexport default ProductComparisonPreviewViewFunctionalComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getRichTextHtml, ICoreContext, ITelemetry } from '@msdyn365-commerce/core';\nimport { AttributeValue } from '@msdyn365-commerce/retail-proxy';\nimport { ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport React from 'react';\n\n/**\n * Represents resources for the component.\n */\nexport interface IProductSpecificationResources {\n productComparisonProductItemSpecificationTrue: string;\n productComparisonProductItemSpecificationFalse: string;\n}\n\n/**\n * Represent configuration of the component.\n */\nexport interface IProductSpecificationProps {\n telemetry: ITelemetry;\n specification?: AttributeValue;\n context: ICoreContext;\n\n resources: IProductSpecificationResources;\n}\n\n/**\n * Represents the product specification values that comes from the server.\n */\nexport enum SpecificationDataTypeValues {\n none = 0,\n currency = 1,\n dateTime = 2,\n decimal = 3,\n integer = 4,\n text = 5,\n boolean = 6,\n video = 40,\n image = 41\n}\n\n/**\n * Represents the component which renders product comparison table.\n */\nexport class ProductSpecification extends React.PureComponent<IProductSpecificationProps> {\n private static _renderCurrencyCell(product: AttributeValue): React.ReactNode | null {\n if (ObjectExtensions.isNullOrUndefined(product.CurrencyValue)) {\n return null;\n }\n\n return (\n <span>\n {product.CurrencyCode}\n {product.CurrencyValue}\n </span>\n );\n }\n\n private static _renderDateTimeCell(product: AttributeValue): React.ReactNode | null {\n if (ObjectExtensions.isFunction(product.DateTimeOffsetValue?.toUTCString)) {\n return null;\n }\n\n return <span>{product.DateTimeOffsetValue!.toUTCString()}</span>;\n }\n\n private static _renderIntegerCell(product: AttributeValue): React.ReactNode | null {\n if (ObjectExtensions.isNullOrUndefined(product.IntegerValue)) {\n return null;\n }\n\n return <span>{product.IntegerValue}</span>;\n }\n\n private static _renderDecimalCell(product: AttributeValue): React.ReactNode | null {\n if (ObjectExtensions.isNullOrUndefined(product.FloatValue)) {\n return null;\n }\n\n return <span>{product.FloatValue}</span>;\n }\n\n private static _renderTextCell(product: AttributeValue): React.ReactNode | null {\n if (ObjectExtensions.isNullOrUndefined(product.TextValue)) {\n return null;\n }\n\n // eslint-disable-next-line react/no-danger -- Implementation is a copy.\n return <span dangerouslySetInnerHTML={getRichTextHtml(product.TextValue)} />;\n }\n\n public constructor(props: IProductSpecificationProps) {\n super(props);\n }\n\n public render(): React.ReactNode | null {\n const specification = this.props.specification;\n if (ObjectExtensions.isNullOrUndefined(specification)) {\n return null;\n }\n\n switch (specification.DataTypeValue) {\n case SpecificationDataTypeValues.none:\n // Return span here instead of null so the row still shows\n return <span />;\n case SpecificationDataTypeValues.currency:\n return ProductSpecification._renderCurrencyCell(specification);\n case SpecificationDataTypeValues.dateTime:\n return ProductSpecification._renderDateTimeCell(specification);\n case SpecificationDataTypeValues.decimal:\n return ProductSpecification._renderDecimalCell(specification);\n case SpecificationDataTypeValues.integer:\n return ProductSpecification._renderIntegerCell(specification);\n case SpecificationDataTypeValues.text:\n return ProductSpecification._renderTextCell(specification);\n case SpecificationDataTypeValues.boolean:\n return this._renderTrueFalseCell(specification);\n case SpecificationDataTypeValues.video:\n this.props.telemetry.warning('Got video specification type, not supported yet so skipping line');\n return null;\n case SpecificationDataTypeValues.image:\n this.props.telemetry.warning('Got image specification type, not supported yet so skipping line');\n return null;\n default:\n this.props.telemetry.warning(`Got unknown specification type ${specification.DataTypeValue ?? 'null'} so skipping line`);\n return null;\n }\n }\n\n private _renderTrueFalseCell(product: AttributeValue): React.ReactNode | null {\n if (product.BooleanValue) {\n return <span>{this.props.resources.productComparisonProductItemSpecificationTrue}</span>;\n }\n return <span>{this.props.resources.productComparisonProductItemSpecificationFalse}</span>;\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 } from '@msdyn365-commerce/core';\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport React, { useCallback } from 'react';\n\n/**\n * Resources for the remove from comparison button component.\n */\nexport interface IRemoveFromComparisonButtonResources {\n productComparisonRemoveProductFromListAriaLabel: string;\n}\n\n/**\n * The configuration of the remove from comparison button component.\n */\nexport interface IRemoveFromComparisonButtonComponentProps extends IComponentProps {\n className: string;\n itemId: string;\n\n resources: IRemoveFromComparisonButtonResources;\n\n onClickHandler(itemId: string): void;\n}\n\n/**\n * Represents a button which handles adding to product comparison.\n * @param props - Configuration of the component.\n * @returns React functional component.\n */\nconst RemoveFromComparisonButtonFunctionalComponent: React.FC<IRemoveFromComparisonButtonComponentProps> = (\n props: IRemoveFromComparisonButtonComponentProps\n) => {\n const onClick = useCallback(() => {\n props.onClickHandler(props.itemId);\n }, [props]);\n\n const { className } = props;\n\n return <Button className={className} title={props.resources.productComparisonRemoveProductFromListAriaLabel} onClick={onClick} />;\n};\n\n/**\n * Represents a button which handles removing the product from the comparison.\n * @param props - Configuration of the component.\n * @returns React functional component.\n */\nexport const RemoveFromComparisonButtonComponent: React.FunctionComponent<IRemoveFromComparisonButtonComponentProps> = (\n props: IRemoveFromComparisonButtonComponentProps\n) => React.createElement(RemoveFromComparisonButtonFunctionalComponent, props);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RatingsSummary } from '@msdyn365-commerce/commerce-entities';\nimport { ISwatchItem, PriceComponent, RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\nimport MsDyn365, { getCatalogId, IImageSettings, Image, msdyn365Commerce, getUrlSync, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { AttributeValue, ProductDimension, ProductDimensionType, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n getFallbackImageUrl,\n getProductUrlSync,\n ObjectExtensions,\n Random,\n StringExtensions,\n convertProductDimensionTypeToDimensionTypes,\n DimensionTypes,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, format, Heading, IModuleProps, INodeProps, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\nimport { debounce } from 'lodash';\n\nimport { ProductComparisonState } from '../product-comparison-state';\nimport {\n getProductsInProductComparisonAction,\n GetProductsInProductComparisonInput,\n IDimensionResult,\n IProductComparisonItemData\n} from './actions';\nimport { ProductSpecification, RemoveFromComparisonButtonComponent } from './base';\nimport { IProductComparisonData } from './product-comparison.data';\nimport { IProductComparisonProps } from './product-comparison.props.autogenerated';\n\n/**\n * Represents product comparison view props for main product info.\n */\nexport interface IProductComparisonProductMainInfo {\n cellContainerProps: INodeProps;\n tableCellProps: INodeProps;\n tableHeaderProps: INodeProps;\n\n product: IProductComparisonItemData;\n productUrl?: string;\n\n isFromCurrentCatalog: boolean;\n\n removeFromComparisonButton: React.ReactNode;\n productImage: React.ReactNode;\n productLink: React.ReactNode;\n productPrice: React.ReactNode;\n quickView: React.ReactNode;\n goToProductDetailsButton: React.ReactNode;\n productRating: React.ReactNode;\n productDescription: React.ReactNode;\n}\n\n/**\n * Specifies the type of selection.\n */\nexport enum SelectionType {\n text = 'text',\n swatch = 'swatch'\n}\n\n/**\n * Represents product comparison view props.\n */\nexport interface IProductComparisonViewProps extends IProductComparisonProps<{}> {\n moduleProps: IModuleProps;\n\n isMainContentReady: boolean;\n isEmptyContent: boolean;\n productCountText?: string;\n\n actionBarContainerProps: INodeProps;\n\n heading: React.ReactNode;\n loading: React.ReactNode;\n emptyComparison: React.ReactNode;\n clearAllButton: React.ReactNode;\n previousClicker: React.ReactNode;\n nextClicker: React.ReactNode;\n backToShopping: React.ReactNode;\n\n productsMainInfo?: IProductComparisonProductMainInfo[];\n\n tableReference?: React.RefObject<HTMLDivElement>;\n\n tableHeaderReference?: React.RefObject<HTMLDivElement>;\n\n tableBodyReference?: React.RefObject<HTMLDivElement>;\n\n tableCellReference?: React.RefObject<HTMLDivElement>;\n\n shouldShowPreviousClicker?: boolean;\n shouldShowNextClicker?: boolean;\n currentClickerPosition?: number;\n\n hoveringCellItemId?: string;\n hoverStateLastUpdate?: number;\n\n uniqueSpecifications?: AttributeValue[];\n uniqueDimensionIds?: number[];\n\n dimensionsProps?: (\n | {\n dimensionId: number;\n dimensionName: string | undefined;\n dimensionClassName: string;\n productDimensionValues: {\n dimensionProps: { RecordId: number; Value: string; DimensionId: number; ImageUrl: string | undefined };\n productMainInfo: IProductComparisonProductMainInfo;\n node: JSX.Element;\n }[];\n }\n | undefined\n )[];\n\n specificationsProps?: {\n specification: AttributeValue;\n specificationClassName: string;\n specificationValues: {\n productSpecification: AttributeValue | undefined;\n productMainInfo: IProductComparisonProductMainInfo;\n node: React.ReactNode;\n }[];\n }[];\n\n clearAllProductsFromComparison(): void;\n removeProductFromList?(itemId: string): void;\n handleScroll?(event: React.UIEvent<HTMLDivElement>): void;\n handleHoverIn?(itemId: string): () => void;\n handleHoverOut?(itemId: string): () => void;\n handlePreviousClick?(): void;\n handleNextClick?(): void;\n}\n\n/**\n * Represents the state of the product comparison component.\n */\nexport interface IProductComparisonState {\n productsData?: IProductComparisonItemData[];\n hoverStateLastUpdate?: number;\n hoveringCellItemId?: string;\n currentClickerPosition?: number;\n}\n\n/**\n * Represents the direction of product clicker.\n */\nexport enum ProductClickerDirections {\n left = 0,\n right = 1\n}\n\n/**\n * Represents the component which renders product comparison table.\n */\nexport class ProductComparison extends React.Component<IProductComparisonProps<IProductComparisonData>, IProductComparisonState> {\n public static readonly className: string = 'msc-product-comparison';\n\n public static readonly mainContainerClassName = `${ProductComparison.className}__main-container`;\n\n public static readonly containerClassName = `${ProductComparison.mainContainerClassName}__container`;\n\n public static readonly tableClassName = `${ProductComparison.containerClassName}__table`;\n\n public static readonly tableHeaderClassName = `${ProductComparison.tableClassName}__header`;\n\n public static readonly productRowClassName = `${ProductComparison.tableHeaderClassName}__product-row`;\n\n public static readonly tableClickerClassName = `${ProductComparison.tableClassName}__clicker`;\n\n public static readonly tableBodyClassName = `${ProductComparison.tableClassName}__body`;\n\n public static readonly tableRowClassName = `${ProductComparison.tableClassName}__row`;\n\n public static readonly dimensionsRowClassName = `${ProductComparison.tableBodyClassName}__dimensions-row`;\n\n public static readonly specificationsRowClassName = `${ProductComparison.tableBodyClassName}__specifications-row`;\n\n public static readonly tableRowContentClassName = `${ProductComparison.tableClassName}__row-content`;\n\n public static readonly tableHeaderCellClassName = `${ProductComparison.tableRowClassName}__header-cell`;\n\n public static readonly tableCellClassName = `${ProductComparison.tableRowClassName}__cell`;\n\n public static readonly actionBarClassName = `${ProductComparison.className}__action-bar`;\n\n public static readonly tableHeaderLockedClassName = `${ProductComparison.tableHeaderClassName}__locked`;\n\n public static readonly tableRowContentInformationClassName = `${ProductComparison.tableRowContentClassName}__information`;\n\n private readonly _tableReference?: React.RefObject<HTMLDivElement>;\n\n private readonly _tableHeaderReference?: React.RefObject<HTMLDivElement>;\n\n private readonly _tableBodyReference?: React.RefObject<HTMLDivElement>;\n\n private readonly _tableCellReference?: React.RefObject<HTMLDivElement>;\n\n private _shouldShowPreviousClicker?: boolean;\n\n private _shouldShowNextClicker?: boolean;\n\n private _hoveringCellItemId?: string;\n\n private readonly _instanceId: string;\n\n private static _getProductsSpecifications(products: IProductComparisonItemData[]): AttributeValue[] {\n const specifications = products.map(product => product.specifications?.specificationsList);\n const allSpecifications: AttributeValue[] = ArrayExtensions.flatten(specifications);\n\n const emptyAttributeValue = 0;\n const specificationNames = ArrayExtensions.validValues(\n allSpecifications\n .filter(specification => specification.AttributeValueId !== emptyAttributeValue)\n .map(specification => specification.Name)\n );\n const uniqueSpecificationNames = ArrayExtensions.unique(specificationNames);\n const uniqueSpecifications = ArrayExtensions.validValues(\n uniqueSpecificationNames.map(name => allSpecifications.find(specification => specification.Name === name))\n );\n\n return uniqueSpecifications;\n }\n\n private static _getProductsDimensions(products: IProductComparisonItemData[]): number[] {\n const dimensions = products.map(product => product.productInfo.Dimensions);\n const allDimensions: ProductDimension[] = ArrayExtensions.flatten(dimensions).filter(\n dimension => !ObjectExtensions.isNullOrUndefined(dimension.DimensionValue)\n );\n\n const dimensionIds = ArrayExtensions.validValues(allDimensions.map(dimension => dimension.DimensionTypeValue));\n const uniqueDimensionIds = ArrayExtensions.unique(dimensionIds);\n\n return uniqueDimensionIds;\n }\n\n private static _renderProductDescription(product?: SimpleProduct): React.ReactNode {\n if (StringExtensions.isNullOrWhitespace(product?.Description)) {\n return null;\n }\n return <p className={`${ProductComparison.className}__description`}>{product!.Description}</p>;\n }\n\n private static _getActionBarContainerProps(): INodeProps {\n return {\n className: ProductComparison.actionBarClassName\n };\n }\n\n public constructor(props: IProductComparisonProps<IProductComparisonData>) {\n super(props);\n\n this._instanceId = `${ProductComparison.className}-${this.props.id}-${Random.Guid.generateGuid()}`;\n\n this.state = {\n productsData: undefined,\n hoverStateLastUpdate: Date.now(),\n hoveringCellItemId: undefined,\n currentClickerPosition: 0\n };\n\n this._tableReference = React.createRef<HTMLDivElement>();\n this._tableHeaderReference = React.createRef<HTMLDivElement>();\n this._tableBodyReference = React.createRef<HTMLDivElement>();\n this._tableCellReference = React.createRef<HTMLDivElement>();\n }\n\n public componentDidMount(): void {\n this._loadProducts();\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).listModifiedEvent.subscribe(\n {\n instanceId: this._instanceId,\n\n /**\n * Updates the state in case the state for the particular product was changed.\n */\n handler: () => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Initialize data downloading.\n this._loadProducts();\n }\n }\n );\n if (MsDyn365.isBrowser) {\n window.addEventListener('scroll', () => {\n this._configureBoxShadowOnScroll();\n });\n }\n this._configureBoxShadowOnScroll();\n }\n\n public componentWillUnmount(): void {\n ProductComparisonState.instance(\n this.props.context.request,\n this.props.data.accountInformation?.result\n ).listModifiedEvent.unsubscribe(this._instanceId);\n }\n\n public shouldComponentUpdate(\n nextProps: Readonly<IProductComparisonProps<IProductComparisonData>>,\n nextState: Readonly<IProductComparisonState>\n ): boolean {\n if (this.state.productsData !== nextState.productsData || this.props !== nextProps) {\n return true;\n }\n\n return (\n this.state.hoveringCellItemId !== nextState.hoveringCellItemId ||\n this.state.currentClickerPosition !== nextState.currentClickerPosition\n );\n }\n\n public render(): React.ReactNode | null {\n const viewProps: IProductComparisonViewProps = {\n ...this.props,\n moduleProps: {\n moduleProps: this.props,\n className: ProductComparison.className\n },\n clearAllProductsFromComparison: this._clearAllProductsFromComparison,\n isMainContentReady: false,\n isEmptyContent: false,\n heading: this._renderHeading(),\n loading: this._renderLoading(),\n clearAllButton: this._renderClearAllButton(),\n actionBarContainerProps: ProductComparison._getActionBarContainerProps(),\n previousClicker: this._renderPreviousClicker(),\n nextClicker: this._renderNextClicker(),\n backToShopping: this._renderBackToShoppingButton(),\n emptyComparison: (\n <div className={`${ProductComparison.className}__empty-container`}>{this.props.slots.emptyComparisonContentSlots}</div>\n )\n };\n\n const productsData = this.state.productsData ?? this._getProductComparisonDataByCatalogId(this.props.data.productsData?.result);\n if (productsData === undefined) {\n return this.props.renderView(viewProps) as React.ReactNode;\n }\n\n const isConsentGiven = this.props.context.request.cookies.isConsentGiven();\n if (!isConsentGiven || !ArrayExtensions.hasElements(productsData)) {\n viewProps.isEmptyContent = true;\n return this.props.renderView(viewProps) as React.ReactNode;\n }\n\n if (ArrayExtensions.hasElements(productsData)) {\n viewProps.productCountText = this.props.resources.productComparisonCountText.replace('{0}', productsData.length.toString());\n }\n\n this._checkClickersState();\n const productsMainInfoData = this._getProductsMainInfo(productsData);\n const allUniqueDimensionIds = this.getProductsDimensionsIds(productsData);\n const updatedDimensionProps: (\n | {\n dimensionId: number;\n dimensionName: string | undefined;\n dimensionClassName: string;\n productDimensionValues: {\n dimensionProps: { RecordId: number; Value: string; DimensionId: number; ImageUrl: string | undefined };\n productMainInfo: IProductComparisonProductMainInfo;\n node: JSX.Element;\n }[];\n }\n | undefined\n )[] = [];\n allUniqueDimensionIds?.map(dimension => {\n const dimensionValue = this.getUpdatedDimensionsProps(dimension, productsMainInfoData);\n updatedDimensionProps.push(dimensionValue);\n return updatedDimensionProps;\n });\n viewProps.isMainContentReady = true;\n viewProps.tableReference = this._tableReference;\n viewProps.tableHeaderReference = this._tableHeaderReference;\n viewProps.tableBodyReference = this._tableBodyReference;\n viewProps.tableCellReference = this._tableCellReference;\n viewProps.hoverStateLastUpdate = this.state.hoverStateLastUpdate;\n viewProps.hoveringCellItemId = this.state.hoveringCellItemId;\n viewProps.shouldShowPreviousClicker = this._shouldShowPreviousClicker;\n viewProps.shouldShowNextClicker = this._shouldShowNextClicker;\n viewProps.currentClickerPosition = this.state.currentClickerPosition;\n viewProps.handlePreviousClick = this._handlePreviousClick;\n viewProps.handleNextClick = this._handleNextClick;\n viewProps.handleScroll = this._handleScroll;\n viewProps.handleHoverIn = this._handleHoverIn;\n viewProps.handleHoverOut = this._handleHoverOut;\n viewProps.removeProductFromList = this._removeProductFromList;\n viewProps.productsMainInfo = productsMainInfoData;\n viewProps.uniqueDimensionIds = ProductComparison._getProductsDimensions(productsData);\n viewProps.dimensionsProps = updatedDimensionProps;\n viewProps.uniqueSpecifications = ProductComparison._getProductsSpecifications(productsData);\n viewProps.specificationsProps = this._getSpecificationProps(viewProps.uniqueSpecifications, viewProps.productsMainInfo);\n\n return this.props.renderView(viewProps) as React.ReactNode;\n }\n\n /**\n * Removes all product from the comparison list.\n */\n private readonly _clearAllProductsFromComparison = (): void => {\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).clearAll();\n this.setState({ productsData: [] });\n };\n\n /**\n * Configures box shadow on scroll.\n */\n private readonly _configureBoxShadowOnScroll = (): void => {\n const defaultValue = 0;\n if (this._tableReference?.current) {\n const comparisonProductCardHeader: HTMLCollectionOf<Element> = this._tableReference.current.getElementsByClassName(\n ProductComparison.tableHeaderClassName\n );\n if (ArrayExtensions.hasElements(Array.from(comparisonProductCardHeader))) {\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > defaultValue) {\n comparisonProductCardHeader[0].classList.add(ProductComparison.tableHeaderLockedClassName);\n } else {\n comparisonProductCardHeader[0].classList.remove(ProductComparison.tableHeaderLockedClassName);\n }\n }\n }\n };\n\n private _getProductComparisonDataByCatalogId(\n productData: IProductComparisonItemData[] | undefined\n ): IProductComparisonItemData[] | undefined {\n const catalogId = getCatalogId(this.props.context.request);\n validateCatalogId(catalogId);\n const productByCatalogId = productData?.filter(product => product.catalogId === catalogId) ?? undefined;\n return productByCatalogId;\n }\n\n private async _loadProducts(): Promise<void> {\n const items = ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).items;\n const input = new GetProductsInProductComparisonInput(items);\n let productData: IProductComparisonItemData[] | undefined;\n await getProductsInProductComparisonAction(input, this.props.context.actionContext).then(item => {\n productData = item;\n });\n const productDataByCatalogId = this._getProductComparisonDataByCatalogId(productData);\n this.setState({ productsData: productDataByCatalogId });\n }\n\n /**\n * Handles scroll inside table.\n * Used to update header position accordingly to the scroll in table body.\n * @param event - Scroll event.\n */\n private readonly _handleScroll = (event: React.UIEvent<HTMLDivElement>) => {\n this._tableHeaderReference?.current?.scrollTo({ top: event.currentTarget.scrollTop, left: event.currentTarget.scrollLeft });\n this._checkClickersState();\n };\n\n /**\n * Handles product clicker click.\n * Used to update table scroll position accordingly to the clicker.\n * @param direction - Direction of scrolling.\n */\n private readonly _handleScrollClick = (direction: ProductClickerDirections) => {\n const tableBody = this._tableBodyReference?.current;\n if (!tableBody) {\n return;\n }\n\n let cellWidth = this._tableCellReference?.current?.clientWidth;\n if (cellWidth === undefined) {\n cellWidth = this._getCellWidth();\n }\n\n let newLeftPosition: number | undefined;\n const scrollPosition = Math.ceil(tableBody.scrollLeft);\n if (direction === ProductClickerDirections.left) {\n newLeftPosition = scrollPosition - cellWidth;\n const minLeftPosition = 0;\n newLeftPosition = Math.max(newLeftPosition, minLeftPosition);\n } else {\n const maxScroll = tableBody.scrollWidth - tableBody.clientWidth;\n newLeftPosition = scrollPosition + cellWidth;\n newLeftPosition = Math.min(newLeftPosition, maxScroll);\n }\n\n if (MsDyn365.isBrowser && document.body.parentElement?.getAttribute('dir') === 'rtl') {\n newLeftPosition = -newLeftPosition;\n }\n\n tableBody.scrollTo({\n top: tableBody.scrollTop,\n left: newLeftPosition\n });\n\n this.setState(previousState => {\n if (previousState.currentClickerPosition === undefined) {\n return {};\n }\n let change = 1;\n if (direction === ProductClickerDirections.left) {\n change = -1;\n }\n return {\n currentClickerPosition: previousState.currentClickerPosition + change,\n hoverStateLastUpdate: Date.now(),\n hoveringCellItemId: undefined\n };\n });\n\n this._checkClickersState();\n };\n\n /**\n * Handles previous product click.\n * Used to update table scroll position accordingly to the clicker.\n */\n private readonly _handlePreviousClick = () => {\n if (MsDyn365.isBrowser && document.body.parentElement?.getAttribute('dir') === 'rtl') {\n this._handleScrollClick(ProductClickerDirections.right);\n } else {\n this._handleScrollClick(ProductClickerDirections.left);\n }\n };\n\n /**\n * Handles next product click.\n * Used to update table scroll position accordingly to the clicker.\n */\n private readonly _handleNextClick = () => {\n if (MsDyn365.isBrowser && document.body.parentElement?.getAttribute('dir') === 'rtl') {\n this._handleScrollClick(ProductClickerDirections.left);\n } else {\n this._handleScrollClick(ProductClickerDirections.right);\n }\n };\n\n /**\n * Get set width.\n */\n private readonly _getCellWidth = (): number => {\n const tableBody = this._tableBodyReference?.current;\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n let cellWidth: number = 400;\n\n if (viewport === 'xs' && tableBody) {\n cellWidth = tableBody && tableBody.clientWidth / 2;\n } else if ((viewport === 'sm' || viewport === 'md') && tableBody) {\n cellWidth = tableBody && tableBody.clientWidth / 3;\n } else {\n if (tableBody) {\n cellWidth = tableBody && tableBody.clientWidth / 4;\n }\n }\n\n cellWidth = Math.floor(cellWidth);\n\n return cellWidth;\n };\n\n /**\n * Updates clickers state.\n */\n private readonly _checkClickersState = () => {\n const tableBody = this._tableBodyReference?.current;\n if (!tableBody) {\n return;\n }\n\n const previousScrollMinLimit = 0;\n const maxScroll = tableBody.scrollWidth - tableBody.clientWidth;\n const scrollPosition = Math.ceil(tableBody.scrollLeft);\n\n if (MsDyn365.isBrowser && document.body.parentElement?.getAttribute('dir') === 'rtl') {\n if (scrollPosition <= previousScrollMinLimit) {\n if (this._shouldShowNextClicker) {\n this._shouldShowNextClicker = false;\n this.forceUpdate();\n }\n } else if (!this._shouldShowNextClicker) {\n this._shouldShowNextClicker = true;\n this.forceUpdate();\n }\n\n if (scrollPosition >= maxScroll) {\n if (this._shouldShowPreviousClicker) {\n this._shouldShowPreviousClicker = false;\n this.forceUpdate();\n }\n } else if (!this._shouldShowPreviousClicker) {\n this._shouldShowPreviousClicker = true;\n this.forceUpdate();\n }\n } else {\n if (scrollPosition <= previousScrollMinLimit) {\n if (this._shouldShowPreviousClicker) {\n this._shouldShowPreviousClicker = false;\n this.forceUpdate();\n }\n } else if (!this._shouldShowPreviousClicker) {\n this._shouldShowPreviousClicker = true;\n this.forceUpdate();\n }\n\n if (scrollPosition >= maxScroll) {\n if (this._shouldShowNextClicker) {\n this._shouldShowNextClicker = false;\n this.forceUpdate();\n }\n } else if (!this._shouldShowNextClicker) {\n this._shouldShowNextClicker = true;\n this.forceUpdate();\n }\n }\n };\n\n /**\n * Removes the product from a list.\n * @param itemId - The id of a product to remove.\n */\n private readonly _removeProductFromList = (itemId: string): void => {\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).removeItemById(itemId);\n this.setState(previousState => {\n let newClickerPosition = previousState.currentClickerPosition;\n if (newClickerPosition && !this._shouldShowNextClicker && this._shouldShowPreviousClicker) {\n newClickerPosition -= 1;\n }\n return {\n productsData: previousState.productsData?.filter(item => item.itemId !== itemId),\n hoverStateLastUpdate: Date.now(),\n hoveringCellItemId: undefined,\n currentClickerPosition: newClickerPosition\n };\n });\n };\n\n /**\n * Prepares quick view component for the given product.\n * @param product - Product information.\n * @returns The quick view component or null if no quick view info is provided.\n */\n private _renderQuickView(product: IProductComparisonItemData): React.ReactNode | null {\n const quickViewSlot = ArrayExtensions.hasElements(this.props.slots.quickViews) ? this.props.slots.quickViews[0] : null;\n if (ObjectExtensions.isNullOrUndefined(quickViewSlot)) {\n return null;\n }\n\n const selectedDimensions = product.productInfo.Dimensions?.filter(dimension => dimension.DimensionValue?.Value);\n\n return React.cloneElement(quickViewSlot as React.ReactElement, {\n selectedProductId: product.productInfo.RecordId,\n selectedDimensions\n });\n }\n\n /**\n * Handles entering into hover mode.\n * @param itemId - Item id of the cell which is hovered.\n * @returns Event handler.\n */\n private readonly _handleHoverIn = (itemId: string) => () => {\n this._hoveringCellItemId = itemId;\n\n this.setState({\n hoverStateLastUpdate: Date.now(),\n hoveringCellItemId: itemId\n });\n };\n\n /**\n * Handles exiting from the hover mode.\n * @param itemId - Item id of the cell which is hovered.\n * @returns Event handler.\n */\n private readonly _handleHoverOut = (itemId: string) => () => {\n if (this._hoveringCellItemId !== itemId) {\n return;\n }\n\n this._hoveringCellItemId = undefined;\n debounce(() => {\n this.setState({\n hoverStateLastUpdate: Date.now(),\n hoveringCellItemId: undefined\n });\n }, 10);\n };\n\n /**\n * Retrieves product image react node.\n * @param className - Class name to use.\n * @param product - Product info.\n * @returns React node.\n */\n private _renderProductImage(className: string, product?: SimpleProduct): React.ReactNode | undefined {\n const {\n context: {\n actionContext: {\n requestContext: { apiSettings }\n },\n request: {\n app: { OmniChannelMedia }\n }\n }\n } = this.props;\n\n if (ObjectExtensions.isNullOrUndefined(product)) {\n return undefined;\n }\n\n const defaultImageSettingsQ = 'w=140&h=140&m=6';\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: defaultImageSettingsQ, w: 0, h: 0 },\n lg: { q: defaultImageSettingsQ, w: 0, h: 0 },\n xl: { q: defaultImageSettingsQ, w: 0, h: 0 }\n },\n lazyload: true\n };\n\n return (\n <Image\n altText={product?.Name}\n key={product.Name}\n src={product.PrimaryImageUrl ?? ''}\n fallBackSrc={getFallbackImageUrl(product.ItemId, apiSettings, OmniChannelMedia) ?? ''}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={defaultImageSettings}\n loadFailureBehavior='empty'\n className={className}\n requestContext={this.props.context.actionContext.requestContext}\n />\n );\n }\n\n private _getTableHeaderProps(itemId: string): INodeProps {\n const isHoverModeEnabled = this.state.hoveringCellItemId === itemId;\n let headerClassName = ProductComparison.tableHeaderCellClassName;\n if (isHoverModeEnabled) {\n headerClassName = classnames(headerClassName, 'msc-product-comparison__cell-hover');\n }\n return {\n className: headerClassName,\n key: `${headerClassName}__product-${itemId}-${this.state.hoveringCellItemId}-${this.state.currentClickerPosition}`,\n onMouseEnter: this._handleHoverIn(itemId),\n onMouseLeave: this._handleHoverOut(itemId)\n };\n }\n\n private _getTableCellProps(itemId: string): INodeProps {\n const isHoverModeEnabled = this.state.hoveringCellItemId === itemId;\n let cellClassName = ProductComparison.tableCellClassName;\n if (isHoverModeEnabled) {\n cellClassName = classnames(cellClassName, 'msc-product-comparison__cell-hover');\n }\n return {\n className: cellClassName,\n key: `${cellClassName}__product-${itemId}-${this.state.hoveringCellItemId}`,\n onMouseEnter: this._handleHoverIn(itemId),\n onMouseLeave: this._handleHoverOut(itemId),\n role: 'menuitem',\n tabIndex: 0\n };\n }\n\n private _renderProductRating(rating?: RatingsSummary): React.ReactNode {\n if (ObjectExtensions.isNullOrUndefined(rating?.averageRating)) {\n return null;\n }\n\n const ratingValue = rating!;\n\n const defaultReviewsCount = 0;\n\n return (\n <RatingComponent\n avgRating={ratingValue.averageRating!}\n readOnly\n ariaLabel={format(this.props.resources.productComparisonProductItemRatingAriaLabel, ratingValue.averageRating, '5')}\n ratingCount={`${ratingValue.reviewsCount ?? defaultReviewsCount}`}\n shouldShowFullRatingDescription\n data={{}}\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n />\n );\n }\n\n private _renderBackToShoppingButton() {\n return (\n <Button\n className='msc-product-comparison__back-button'\n {...this.props.telemetry}\n role='button'\n href='#'\n onClick={this._goBack}\n title={this.props.resources.backToShoppingLabel}\n >\n {this.props.resources.backToShoppingLabel}\n </Button>\n );\n }\n\n private readonly _goBack = (): void => {\n const backToShoppingUrl = getUrlSync('home', this.props.context.actionContext) || '';\n if (document.referrer === '') {\n window.location.href = backToShoppingUrl;\n } else {\n window.history.back();\n }\n };\n\n /**\n * Retrieves localized text for dimension.\n * @param dimensionId - Dimension id.\n * @returns Localized text.\n */\n private _getDimensionName(dimensionId: number): string | undefined {\n if (dimensionId === ProductDimensionType.Color) {\n return this.props.resources.productComparisonProductItemColorDimension;\n }\n if (dimensionId === ProductDimensionType.Size) {\n return this.props.resources.productComparisonProductItemSizeDimension;\n }\n\n if (dimensionId === ProductDimensionType.Style) {\n return this.props.resources.productComparisonProductItemStyleDimension;\n }\n return undefined;\n }\n\n private getUpdatedDimensionsProps(dimensionId: number, products: IProductComparisonProductMainInfo[]) {\n const dimensionClassName = `${ProductComparison.dimensionsRowClassName}__dimension-${dimensionId}`;\n const dimensionDescription = this._getDimensionName(dimensionId);\n const dimensionName = convertProductDimensionTypeToDimensionTypes(dimensionId);\n let dimensionSelectionType = SelectionType.text;\n\n const dimensionsAsSwatchConfiguration: DimensionTypes[] | undefined = this.props.context.app.config.dimensionsAsSwatchType;\n if (\n ArrayExtensions.hasElements(dimensionsAsSwatchConfiguration) &&\n !dimensionsAsSwatchConfiguration?.includes(DimensionTypes.none) &&\n dimensionsAsSwatchConfiguration?.includes(dimensionName)\n ) {\n dimensionSelectionType = SelectionType.swatch;\n }\n\n const productDimensionValues = products.map(productMainInfo => {\n let dimension: IDimensionResult[] = [];\n let textValue: string = '';\n let renderSwatch: JSX.Element | undefined;\n this.props.data.productsData?.result?.map(productsDimension => {\n if (productsDimension.productInfo.RecordId === productMainInfo.product.productInfo.RecordId) {\n dimension = productsDimension.dimensions?.dimensions ?? [];\n }\n return dimension;\n });\n\n if (dimensionSelectionType === SelectionType.swatch) {\n renderSwatch = (\n <div className='msc-product__dimensions'>\n {dimension.map(dimensionItems => {\n return (\n <div\n className='msc-product__dimensions-item'\n key={`msc-product__dimensions-item-${productMainInfo.product.itemId}`}\n >\n {dimensionItems.result.map(dimensionItem => {\n let currentDimensionId: number | undefined;\n const swatches =\n dimensionItem.map<ISwatchItem>(swatchItem => {\n let isDefaultDimension: boolean = false;\n const selectedDimensions = productMainInfo.product.productInfo.Dimensions?.filter(\n item => item.DimensionTypeValue === swatchItem.DimensionTypeValue\n );\n selectedDimensions?.map(selectedDimension => {\n if (\n selectedDimension.DimensionValue !== undefined &&\n selectedDimension.DimensionValue.DimensionId ===\n swatchItem.DimensionValue?.DimensionId\n ) {\n isDefaultDimension = true;\n }\n return isDefaultDimension;\n });\n\n if (swatchItem.DimensionTypeValue === dimensionId) {\n currentDimensionId = swatchItem.DimensionTypeValue;\n }\n const dimensionType = dimensionName;\n return {\n itemId: `${swatchItem.DimensionValue?.RecordId ?? ''}-${swatchItem.DimensionValue\n ?.Value ?? ''}`,\n value: swatchItem.DimensionValue?.Value ?? '',\n dimensionType,\n colorHexCode: swatchItem.DimensionValue?.ColorHexCode,\n imageUrl: swatchItem.DimensionValue?.ImageUrl,\n isDefault: isDefaultDimension\n };\n }) ?? [];\n if (currentDimensionId && currentDimensionId === dimensionId) {\n return (\n <SwatchComponent\n key={dimensionId}\n apiSettings={this.props.context.request.apiSettings}\n list={swatches}\n isSelectionEnabled={false}\n />\n );\n }\n return null;\n })}\n </div>\n );\n })}\n </div>\n );\n }\n\n if (dimensionSelectionType === SelectionType.text) {\n dimension.map(item => {\n return item.result.map(items => {\n return items.map(dimensionItem => {\n if (dimensionItem.DimensionTypeValue === dimensionId) {\n const productDimensionSeperatorValue =\n textValue !== ''\n ? this.props.resources.productDimensionSeparator\n : this.props.resources.productDimensionSeparator.replace('/', '');\n textValue = textValue + format(productDimensionSeperatorValue, dimensionItem.DimensionValue?.Value ?? '');\n }\n return textValue;\n });\n });\n });\n }\n\n const dimensionProps = {\n RecordId: productMainInfo.product.productInfo.RecordId,\n Value: textValue,\n DimensionId: dimensionId,\n ImageUrl: productMainInfo.product.productInfo.PrimaryImageUrl\n };\n\n return {\n dimensionProps,\n productMainInfo,\n node: (\n <div key={`${productMainInfo.product.itemId}-${dimensionClassName}`}>\n {dimensionSelectionType === SelectionType.swatch ? renderSwatch : dimensionProps.Value}\n </div>\n )\n };\n });\n return {\n dimensionId,\n dimensionName: dimensionDescription,\n dimensionClassName,\n productDimensionValues\n };\n }\n private _getSpecificationProps(specifications: AttributeValue[], products: IProductComparisonProductMainInfo[]) {\n return specifications.map(specification => {\n const specificationClassName = `${ProductComparison.specificationsRowClassName}__specification-${specification.Name!}`;\n\n const specificationValues = products.map(productMainInfo => {\n const productSpecification = productMainInfo.product.specifications?.specificationsList.find(\n productSpecifications => productSpecifications.Name === specification.Name\n );\n\n return {\n productSpecification,\n productMainInfo,\n node: (\n <div key={`${productMainInfo.product.itemId}-${specificationClassName}`}>\n <ProductSpecification\n specification={productSpecification}\n telemetry={this.props.telemetry}\n context={this.props.context}\n resources={this.props.resources}\n />\n </div>\n )\n };\n });\n\n return {\n specification,\n specificationClassName,\n specificationValues\n };\n });\n }\n\n private _renderHeading(): React.ReactNode {\n return <Heading className={`${ProductComparison.className}__header`} text={this.props.resources.productComparisonTitle} />;\n }\n\n private _renderLoading(): React.ReactNode {\n return <div className={`${ProductComparison.className}__loading`}>{this.props.resources.productComparisonLoadingText}</div>;\n }\n\n private _renderClearAllButton(): React.ReactNode {\n return (\n <Button\n className={`${ProductComparison.actionBarClassName}__clear-all-button`}\n aria-label={this.props.resources.productComparisonClearAllButtonAriaLabel}\n onClick={this._clearAllProductsFromComparison}\n >\n {this.props.resources.productComparisonClearAllButtonText}\n </Button>\n );\n }\n\n /**\n * Retrieves unique dimension ids of product.\n * @param products - Product.\n * @returns Unique dimension ids.\n */\n private getProductsDimensionsIds(products: IProductComparisonItemData[]): number[] {\n const dimensions = products.map(product => product.productInfo.Dimensions);\n const allDimensions: ProductDimension[] = ArrayExtensions.flatten(dimensions);\n\n const dimensionIds = ArrayExtensions.validValues(allDimensions.map(dimension => dimension.DimensionTypeValue));\n const uniqueDimensionIds = ArrayExtensions.unique(dimensionIds);\n\n return uniqueDimensionIds;\n }\n\n private _renderPreviousClicker(): React.ReactNode {\n return (\n <Button\n className={classnames(ProductComparison.tableClickerClassName, `${ProductComparison.tableClickerClassName}__previous`)}\n role='button'\n onClick={this._handlePreviousClick}\n onKeyUp={this._handlePreviousClick}\n >\n <span className={`${ProductComparison.tableClickerClassName}__previous__icon`} aria-hidden='true' />\n <span className='screen-reader-only'>{this.props.resources.productComparisonPreviousProduct}</span>\n </Button>\n );\n }\n\n private _renderNextClicker(): React.ReactNode {\n return (\n <Button\n className={classnames(ProductComparison.tableClickerClassName, `${ProductComparison.tableClickerClassName}__next`)}\n role='button'\n onClick={this._handleNextClick}\n onKeyUp={this._handleNextClick}\n >\n <span className={`${ProductComparison.tableClickerClassName}__next__icon`} aria-hidden='true' />\n <span className='screen-reader-only'>{this.props.resources.productComparisonNextProduct}</span>\n </Button>\n );\n }\n\n private _renderRemoveFromComparisonButton(itemId: string): React.ReactNode {\n return (\n <RemoveFromComparisonButtonComponent\n className={`${ProductComparison.productRowClassName}__remove`}\n key={itemId}\n resources={this.props.resources}\n itemId={itemId}\n onClickHandler={this._removeProductFromList}\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{}}\n />\n );\n }\n\n private _getProductsMainInfo(products: IProductComparisonItemData[]): IProductComparisonProductMainInfo[] {\n const currentCatalogId = getCatalogId(this.props.context.request);\n validateCatalogId(currentCatalogId);\n return products.map(product => {\n let productUrlLink: string | undefined;\n if (msdyn365Commerce.isBrowser) {\n const productUrl = getProductUrlSync(product.productInfo, this.props.context.actionContext);\n const fullUrl = new URL(productUrl, window.location.href);\n if (isChannelTypeB2B(this.props.context.actionContext.requestContext)) {\n fullUrl.searchParams.set('catalogid', `${product.catalogId}`);\n }\n product.productInfo.Dimensions?.map(dimension => {\n const dimensionValue = dimension.DimensionValue?.Value;\n if (!StringExtensions.isNullOrWhitespace(dimensionValue)) {\n const dimensionName = convertProductDimensionTypeToDimensionTypes(dimension.DimensionTypeValue);\n fullUrl.searchParams.set(dimensionName, dimensionValue!);\n }\n });\n productUrlLink = fullUrl.href;\n }\n const isHoverModeEnabled = this.state.hoveringCellItemId === product.itemId;\n let cellClassName = ProductComparison.tableHeaderCellClassName;\n if (isHoverModeEnabled) {\n cellClassName = classnames(cellClassName, 'msc-product-comparison__cell-hover');\n }\n const isFromCurrentCatalog = product.catalogId === currentCatalogId;\n\n const productImageContainerClassName = `${ProductComparison.productRowClassName}__product-image-container`;\n const productImageClassName = `${productImageContainerClassName}__product-image`;\n const productNameClassName = `${ProductComparison.productRowClassName}__product-name`;\n const productPriceClassName = `${ProductComparison.productRowClassName}__product-price`;\n const cellNewWidth = this._getCellWidth();\n const style = {\n width: `${cellNewWidth}px`,\n minWidth: `${cellNewWidth}px`,\n maxWidth: `${cellNewWidth}px`\n };\n return {\n cellContainerProps: {\n className: cellClassName,\n key: product.itemId,\n ref: this._tableCellReference,\n onMouseEnter: this._handleHoverIn(product.itemId),\n onMouseLeave: this._handleHoverOut(product.itemId),\n role: 'menuitem',\n tabIndex: 0,\n style: style\n },\n product,\n productUrl: productUrlLink,\n removeFromComparisonButton: this._renderRemoveFromComparisonButton(product.itemId),\n productImage: (\n <div className={productImageContainerClassName} key={product.itemId}>\n {this._renderProductImage(productImageClassName, product.productInfo)}\n </div>\n ),\n productLink: (\n <a className={productNameClassName} href={productUrlLink} key={product.itemId}>\n {product.productInfo.Name}\n </a>\n ),\n productPrice: (\n <div className={productPriceClassName} key={product.itemId}>\n {product.price && (\n <PriceComponent\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{ price: product.price }}\n freePriceText={this.props.resources.productComparisonProductItemFreePrice}\n originalPriceText={this.props.resources.productComparisonProductItemOriginalPrice}\n currentPriceText={this.props.resources.productComparisonProductItemCurrentPrice}\n />\n )}\n </div>\n ),\n quickView: this._renderQuickView(product),\n isFromCurrentCatalog,\n goToProductDetailsButton: (\n <Button href={productUrlLink} title={this.props.resources.productComparisonGoToProductDetailsButtonText}>\n {this.props.resources.productComparisonGoToProductDetailsButtonText}\n </Button>\n ),\n tableCellProps: this._getTableCellProps(product.itemId),\n tableHeaderProps: this._getTableHeaderProps(product.itemId),\n productRating:\n product.rating !== undefined ? <div key={product.itemId}>{this._renderProductRating(product.rating)}</div> : undefined,\n productDescription:\n product.productInfo !== undefined ? (\n <div key={product.itemId}>{ProductComparison._renderProductDescription(product.productInfo)}</div>\n ) : (\n undefined\n )\n };\n });\n }\n}\n\nexport default ProductComparison;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport msdyn365Commerce from '@msdyn365-commerce/core';\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { IProductComparisonProductMainInfo, IProductComparisonViewProps, ProductComparison } from './product-comparison';\n\n/**\n * Renders dynamic header values.\n * @param values - cd..info.\n * @param headerName - Header Name.\n * @returns List of react nodes.\n */\nconst renderDynamicHeaderCells = (\n values: {\n productMainInfo: IProductComparisonProductMainInfo;\n node: React.ReactNode;\n }[],\n headerName: string,\n currentClickerPosition?: number\n) => {\n return values.map((value, index) => {\n if (index === currentClickerPosition) {\n return (\n <Node\n key={value.productMainInfo.tableHeaderProps.key}\n {...value.productMainInfo.tableHeaderProps}\n role='menuitem'\n tabindex='0'\n style={value.productMainInfo.cellContainerProps.style}\n >\n {headerName}\n </Node>\n );\n }\n return <Node key={index} {...value.productMainInfo.tableHeaderProps} style={value.productMainInfo.cellContainerProps.style}></Node>;\n });\n};\n\n/**\n * Renders dynamic cell values.\n * @param values - Cells info.\n * @param hoveringCellItemId - Currently hovered cell.\n * @returns List of react nodes.\n */\nconst renderDynamicCells = (\n values: {\n productMainInfo: IProductComparisonProductMainInfo;\n node: React.ReactNode;\n }[],\n hoveringCellItemId: string\n) => {\n return values.map(value => {\n return (\n <Node\n {...value.productMainInfo.tableCellProps}\n key={`${value.productMainInfo.product.itemId}-${hoveringCellItemId}`}\n style={value.productMainInfo.cellContainerProps.style}\n >\n {value.node}\n </Node>\n );\n });\n};\n/**\n * Represents product comparison view.\n * @param props - View props for product comparison.\n * @returns Functional component of product comparison.\n */\nexport const ProductComparisonViewFunctionalComponent: React.FC<IProductComparisonViewProps> = props => {\n return (\n <Module {...props.moduleProps}>\n {props.backToShopping}\n {props.heading}\n <Node className={`${ProductComparison.className}__product_count_text`}>{props.productCountText}</Node>\n {props.isEmptyContent || props.isMainContentReady ? undefined : props.loading}\n {props.isEmptyContent ? props.emptyComparison : undefined}\n <Node {...props.actionBarContainerProps}>\n {!props.isEmptyContent && props.isMainContentReady ? props.clearAllButton : undefined}\n </Node>\n {props.isMainContentReady ? (\n <Node className={ProductComparison.mainContainerClassName}>\n <Node className={ProductComparison.containerClassName}>\n <Node className={ProductComparison.tableClassName} ref={props.tableReference}>\n <Node className={`${ProductComparison.tableHeaderClassName}`}>\n <Node\n className={`${ProductComparison.tableHeaderClassName}__header__container`}\n ref={props.tableHeaderReference}\n >\n {props.shouldShowPreviousClicker && props.previousClicker}\n <Node\n className={classnames(\n ProductComparison.tableRowClassName,\n `${ProductComparison.tableHeaderClassName}__product-row`\n )}\n role='menu'\n >\n {props.productsMainInfo?.map(productMainInfo => {\n const isFromCurrentCatalog = productMainInfo.isFromCurrentCatalog;\n const actionsClassName = `${ProductComparison.productRowClassName}__actions`;\n return (\n <Node\n {...productMainInfo.cellContainerProps}\n key={productMainInfo.cellContainerProps.key as string}\n style={productMainInfo.cellContainerProps.style}\n >\n {productMainInfo.removeFromComparisonButton}\n {productMainInfo.productImage}\n {msdyn365Commerce.isBrowser ? productMainInfo.productLink : undefined}\n {productMainInfo.productPrice}\n <Node className={actionsClassName} key={productMainInfo.product.itemId}>\n {isFromCurrentCatalog\n ? productMainInfo.quickView\n : productMainInfo.goToProductDetailsButton}\n </Node>\n </Node>\n );\n })}\n </Node>\n {props.shouldShowNextClicker && props.nextClicker}\n </Node>\n </Node>\n <Node\n className={ProductComparison.tableBodyClassName}\n onScroll={props.handleScroll}\n ref={props.tableBodyReference}\n >\n {props.productsMainInfo?.map((rating, key) => {\n return rating.productRating !== undefined && key === 0 ? (\n <Node\n className={classnames(\n `${ProductComparison.tableBodyClassName}__rating-row`,\n ProductComparison.tableRowClassName\n )}\n >\n <Node\n className={ProductComparison.tableRowContentClassName}\n key={`rating-${props.currentClickerPosition}`}\n role='menu'\n >\n {props.productsMainInfo?.map((productMainInfo, index) => {\n if (index === props.currentClickerPosition) {\n return (\n <Node\n key={productMainInfo.tableHeaderProps.key}\n {...productMainInfo.tableHeaderProps}\n role='menuitem'\n tabindex='0'\n style={productMainInfo.cellContainerProps.style}\n >\n {props.resources.productComparisonProductItemRating}\n </Node>\n );\n }\n return (\n <Node\n key={productMainInfo.tableHeaderProps.key}\n {...productMainInfo.tableHeaderProps}\n role='none'\n tabindex='-1'\n style={productMainInfo.cellContainerProps.style}\n ></Node>\n );\n })}\n </Node>\n <Node\n className={`${ProductComparison.tableRowContentClassName} ${ProductComparison.tableRowContentInformationClassName}`}\n role='menu'\n >\n {props.productsMainInfo?.map(productMainInfo => {\n return (\n <Node\n {...productMainInfo.tableCellProps}\n key={`${productMainInfo.product.itemId}-${props.hoveringCellItemId!}`}\n style={productMainInfo.cellContainerProps.style}\n >\n {productMainInfo.productRating}\n </Node>\n );\n })}\n </Node>\n </Node>\n ) : (\n undefined\n );\n })}\n {props.productsMainInfo?.map((description, key) => {\n return description.productDescription !== undefined && key === 0 ? (\n <Node\n className={classnames(\n `${ProductComparison.tableBodyClassName}__description-row`,\n ProductComparison.tableRowClassName\n )}\n >\n <Node\n className={ProductComparison.tableRowContentClassName}\n key={`description-${props.currentClickerPosition}`}\n role='menu'\n >\n {props.productsMainInfo?.map((productMainInfo, index) => {\n if (index === props.currentClickerPosition) {\n return (\n <Node\n key={productMainInfo.tableHeaderProps.key}\n {...productMainInfo.tableHeaderProps}\n role='menuitem'\n tabindex='0'\n style={productMainInfo.cellContainerProps.style}\n >\n {props.resources.productComparisonProductItemDescription}\n </Node>\n );\n }\n return (\n <Node\n key={productMainInfo.tableHeaderProps.key}\n {...productMainInfo.tableHeaderProps}\n role='none'\n tabindex='-1'\n style={productMainInfo.cellContainerProps.style}\n ></Node>\n );\n })}\n </Node>\n <Node\n className={`${ProductComparison.tableRowContentClassName} ${ProductComparison.tableRowContentInformationClassName}`}\n role='menu'\n >\n {props.productsMainInfo?.map(productMainInfo => {\n return (\n <Node\n {...productMainInfo.tableCellProps}\n key={`${productMainInfo.product.itemId}-${props.hoveringCellItemId!}`}\n style={productMainInfo.cellContainerProps.style}\n >\n {productMainInfo.productDescription}\n </Node>\n );\n })}\n </Node>\n </Node>\n ) : (\n undefined\n );\n })}\n {props.dimensionsProps?.map(dimensionProps => {\n return (\n dimensionProps?.dimensionName && (\n <Node\n className={classnames(\n ProductComparison.dimensionsRowClassName,\n ProductComparison.tableRowClassName,\n dimensionProps.dimensionClassName\n )}\n key={dimensionProps.dimensionClassName}\n >\n <Node\n className={ProductComparison.tableRowContentClassName}\n key={`${dimensionProps.dimensionName}-${props.currentClickerPosition}`}\n role='menu'\n >\n {renderDynamicHeaderCells(\n dimensionProps.productDimensionValues,\n dimensionProps.dimensionName,\n props.currentClickerPosition\n )}\n </Node>\n\n <Node\n className={`${ProductComparison.tableRowContentClassName} ${ProductComparison.tableRowContentInformationClassName}`}\n role='menu'\n >\n {renderDynamicCells(dimensionProps.productDimensionValues, props.hoveringCellItemId!)}\n </Node>\n </Node>\n )\n );\n })}\n {props.specificationsProps?.map(specificationProps => {\n return StringExtensions.isNullOrEmpty(specificationProps.specification.TextValue) === false ? (\n <Node\n className={classnames(\n ProductComparison.specificationsRowClassName,\n ProductComparison.tableRowClassName,\n specificationProps.specificationClassName\n )}\n key={specificationProps.specificationClassName}\n >\n <Node\n className={ProductComparison.tableRowContentClassName}\n key={`${specificationProps.specification.Name}-${props.currentClickerPosition}`}\n role='menu'\n >\n {renderDynamicHeaderCells(\n specificationProps.specificationValues,\n specificationProps.specification.Name!,\n props.currentClickerPosition\n )}\n </Node>\n <Node\n className={`${ProductComparison.tableRowContentClassName} ${ProductComparison.tableRowContentInformationClassName}`}\n role='menu'\n >\n {renderDynamicCells(specificationProps.specificationValues, props.hoveringCellItemId!)}\n </Node>\n </Node>\n ) : (\n undefined\n );\n })}\n <Node\n className={classnames(\n `${ProductComparison.tableBodyClassName}__sku-row`,\n ProductComparison.tableRowClassName\n )}\n >\n <Node\n className={ProductComparison.tableRowContentClassName}\n key={`sku-${props.currentClickerPosition}`}\n role='menu'\n >\n {props.productsMainInfo?.map((productMainInfo, index) => {\n if (index === props.currentClickerPosition) {\n return (\n <Node\n key={productMainInfo.tableHeaderProps.key}\n {...productMainInfo.tableHeaderProps}\n role='menuitem'\n tabindex='0'\n style={productMainInfo.cellContainerProps.style}\n >\n {props.resources.productComparisonProductItemSku}\n </Node>\n );\n }\n return (\n <Node\n key={productMainInfo.tableHeaderProps.key}\n {...productMainInfo.tableHeaderProps}\n style={productMainInfo.cellContainerProps.style}\n ></Node>\n );\n })}\n </Node>\n <Node\n className={`${ProductComparison.tableRowContentClassName} ${ProductComparison.tableRowContentInformationClassName}`}\n role='menu'\n >\n {props.productsMainInfo?.map(productMainInfo => {\n return (\n <Node\n {...productMainInfo.tableCellProps}\n key={`${productMainInfo.product.itemId}-${props.hoveringCellItemId!}`}\n style={productMainInfo.cellContainerProps.style}\n >\n {productMainInfo.product.productInfo.ItemId}\n </Node>\n );\n })}\n </Node>\n </Node>\n </Node>\n </Node>\n </Node>\n </Node>\n ) : (\n undefined\n )}\n </Module>\n );\n};\n\nexport default ProductComparisonViewFunctionalComponent;\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<IPromoBannerCloseButton> = ({ closeButtonAriaLabel, label, telemetryContent, onClose }) => {\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.PromoBannerClose);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n <button className='ms-promo-banner__close-button' aria-label={closeButtonAriaLabel} onClick={onClose} {...attributes}>\n <span className='ms-promo-banner__close-button__label' aria-hidden>\n {label}\n </span>\n </button>\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<IPromoBannerLinks> = ({ links, requestContext, onTextChange, telemetryContent }) => {\n const editableLinks = _mapEditableLinks(links, telemetryContent);\n return (\n <span className='ms-promo-banner__links'>\n {editableLinks && editableLinks.length > 0 ? (\n <Msdyn365.Links links={editableLinks} editProps={{ onTextChange, requestContext }} />\n ) : null}\n </span>\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<IPromoBannerText> = ({ text, onTextChange, requestContext }) => {\n return <Msdyn365.Text className='ms-promo-banner__text' tag='span' text={text} editProps={{ onEdit: onTextChange, requestContext }} />;\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<IPromoBannerProps<IPromoBannerState>>}\n */\nclass PromoBanner extends React.PureComponent<IPromoBannerProps<{}>, 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 <PromoBannerCloseButton\n {...{\n onClose: this._onDismiss,\n label: closeButtonLabel,\n closeButtonAriaLabel,\n telemetryContent: this.telemetryContent\n }}\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IPromoBannerViewProps } from './promo-banner';\n\nconst PromoBannerView: React.FC<IPromoBannerViewProps> = 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 <Node {...contentProps} key={index} aria-live='off' role='marquee'>\n <span className='sr-only'>{promoBannerText}</span>\n {message.text && <Node {...promoBannerTextProps} text={message.text} onClick={handleText} />}\n {message.links && message.links.length > 0 && (\n <Node {...promoBannerLinksProps} links={message.links} onClick={handleLinks} />\n )}\n </Node>\n );\n });\n\n return (\n <Module {...promoBannerProps}>\n <Node {...carouselProps} items={slides} />\n {closeButton}\n </Module>\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 { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { ProductListInventoryFilteringOptions } from '../actions';\nimport { IChoiceSummaryProps } from './choice-summary.props';\nimport { isMatchingRefinementCriterion, isRangeType } from './utilities';\n\ninterface IRefinerMap {\n key: string;\n value: ProductRefinerValue;\n}\n\n/**\n * ChoiceSummary component.\n */\n@observer\nexport default class ChoiceSummary extends React.PureComponent<IChoiceSummaryProps> {\n private readonly closeButtonGlyph: string = 'msi-close-btn';\n\n private readonly payLoad: IPayLoad;\n\n @computed get selectedRefinersMap(): IRefinerMap[] {\n let { selectedChoices } = this.props;\n const { channelInventoryConfigurationId, refinerHierarchy } = this.props;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n if (this.props.context?.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\n selectedChoices = selectedChoices.filter(choice => {\n const parent = refinerHierarchy.find(\n (hierarchy: IProductRefinerHierarchy) =>\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, choice))\n );\n return parent && parent.RecordId !== channelInventoryConfigurationId;\n });\n }\n return selectedChoices.map((selectedRefiner: ProductRefinerValue, index) => {\n return {\n key: this._getKeyForRefinerValue(selectedRefiner, index.toString()),\n value: selectedRefiner\n } as IRefinerMap;\n });\n }\n\n constructor(props: Readonly<IChoiceSummaryProps>) {\n super(props);\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public render(): JSX.Element {\n const { clearAllText, label, classNames, choiceAriaLabel, closeAriaLabel } = this.props;\n const items = this.selectedRefinersMap;\n this.payLoad.contentAction.etext = clearAllText;\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n return (\n <div className='msc-choice-summary'>\n {items.length > 0 && label && <span className='msc-choice-summary__label'>{label}</span>}\n <ul className={classnames(classNames, 'msc-choice-summary__list', 'list-unstyled')}>\n {items.map((item: IRefinerMap) => {\n this.payLoad.contentAction.etext = item.key;\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n\n return (\n <li className='msc-choice-summary__list-item' key={item.key}>\n <a\n className='msc-choice-summary__item'\n href={this.props.urlBuilder(item.value, false)}\n aria-label={`${item.value.LeftValueBoundString} ${choiceAriaLabel}`}\n onClick={this._onClick}\n role='button'\n id={item.key}\n {...attribute}\n >\n {item.value.LeftValueBoundString && item.value.LeftValueBoundLocalizedString === ''\n ? item.value.LeftValueBoundString\n : (item.value.LeftValueBoundLocalizedString ||\n item.value.LeftValueBoundLocalizedString === undefined) &&\n item.value.RefinerRecordId === 0\n ? item.key\n : item.value.LeftValueBoundString}\n <span\n className={`${this.closeButtonGlyph} msc-choice-summary__glyph`}\n role='button'\n aria-label={closeAriaLabel}\n />\n </a>\n </li>\n );\n })}\n </ul>\n {items.length > 0 && clearAllText && (\n <a\n href={this.props.urlBuilder({}, true)}\n className='msc-choice-summary__clear-all'\n {...clearAllAttributes}\n onClick={this._onClick}\n >\n {clearAllText}\n </a>\n )}\n </div>\n );\n }\n\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue, index: string): string {\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry, refinerValues } = this.props;\n const overallFormat = choiceFormat || '{1}';\n const rangeFormat = choiceRangeValueFormat;\n let refinerName = '';\n if (refinerHierarchy && refinerHierarchy.find) {\n const parent = refinerHierarchy.find(\n (hierarchy: IProductRefinerHierarchy) =>\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\n );\n\n if (!parent) {\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\n } else {\n refinerName = parent.KeyName || '';\n }\n }\n\n let refinerValueName: string;\n if (isRangeType(productRefinerValue.DataTypeValue)) {\n refinerValueName = rangeFormat\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\n } else if (productRefinerValue.RefinerRecordId === 0) {\n const filterValue = refinerValues?.Values.find(\n refiner => refiner.LeftValueBoundString === productRefinerValue.LeftValueBoundString\n );\n refinerValueName = (filterValue ? filterValue.LeftValueBoundLocalizedString : productRefinerValue.LeftValueBoundString) || '';\n } else {\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n }\n\n if (refinerName === 'Rating' || refinerName === 'Price') {\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}`);\n }\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}_${refinerName}_${index}`);\n }\n\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\n if (!amount || !currency) {\n this.props.telemetry.trace('[choice-summary] could not format price');\n return amount || '';\n }\n let result = amount;\n\n try {\n result = this.props.context!.cultureFormatter.formatCurrency(Number(amount), currency);\n } catch (error) {\n this.props.telemetry.warning(`Failed to format price for ${result}: ${error}`);\n }\n\n return result;\n }\n\n private readonly _onClick = (e: React.MouseEvent<HTMLAnchorElement>): void => {\n e.preventDefault();\n e.stopPropagation();\n\n const target = e.currentTarget as HTMLElement;\n const clearAll = target.getAttribute('class')!.includes('choice-summary__clear-all');\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\n\n if (this.props.onChoiceClicked) {\n this.props.onChoiceClicked({\n clearAll,\n itemClicked: target,\n choiceClicked: selectedRefiner,\n nextItemToFocus: target.nextSibling as HTMLElement\n });\n }\n };\n\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\n const result = this.selectedRefinersMap.find(selected => itemClicked.id === selected.key);\n return (result && result.value) || undefined;\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 React from 'react';\n\ninterface IErrorMessage {\n text?: string;\n}\n\nexport const ErrorMessage: React.FC<IErrorMessage> = ({ text }) => {\n return (\n <span className='ms-search-result-container__no-results-message'>\n <h5 className='error-text'>\n {` `}\n {text}\n {` `}\n </h5>\n </span>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICoreContext, IGridSettings, IImageData, IImageSettings, Image, IRequestContext } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultContainerResources } from '../search-result-container.props.autogenerated';\n\n// Import { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\n\ninterface IFeatureSearchResultItem {\n product: SimpleProduct | null;\n context: ICoreContext;\n resources: ISearchResultContainerResources;\n imageSettings?: IImageSettings;\n moduleType: string;\n moduleId: string;\n telemetryContent?: ITelemetryContent;\n recommendation?: string;\n}\n\nexport const FeatureSearchResultItem: React.FC<IFeatureSearchResultItem> = ({\n product,\n context,\n imageSettings,\n resources,\n telemetryContent,\n recommendation\n}) => {\n if (product === null) {\n return null;\n }\n\n const productName = product.Name;\n const productRecordId = product && product.RecordId ? product.RecordId : 0;\n const productUrl = getProductPageUrlSync(product.Name || '', productRecordId, context && context.actionContext, undefined);\n const fallbackImage = getFallbackImageUrl(\n product.ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n );\n const heading =\n recommendation && recommendation === 'descriptions' ? resources.featureSimilarDescriptionTitle : resources.featureSimilarLooksTitle;\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n <div className='ms-feature-search-result__item'>\n <a\n href={productUrl}\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\n {...attribute}\n aria-label={product.Name}\n >\n <div className='msc-feature-search-result__item__image'>\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n product.PrimaryImageUrl,\n product.Name,\n fallbackImage,\n context.actionContext.requestContext\n )}\n </div>\n </a>\n <div className='msc-feature-search-result__item__detail'>\n <p className='msc-feature-search-result__item__heading'>{heading}</p>\n {renderProductTitle(product?.Name)}\n </div>\n </div>\n );\n};\n\nfunction renderProductPlacementImage(\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n altText?: string,\n fallbackImage?: string,\n context?: IRequestContext\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n const img: IImageData = {\n src: imageUrl,\n altText: altText ? altText : ''\n };\n const imageProps = {\n gridSettings,\n imageSettings,\n fallBackSrc: fallbackImage\n };\n return <Image {...img} {...imageProps} loadFailureBehavior='empty' requestContext={context} />;\n}\n\nfunction renderProductTitle(title?: string): JSX.Element | null {\n return <h1 className='msc-feature-search-result__item__product-title'>{title}</h1>;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface ILink {\n className?: string;\n text?: string;\n href?: string;\n ariaLabel?: string;\n}\n\nexport const Link: React.FC<ILink> = ({ text, className, href, ariaLabel }) => (\n <a className={className} href={href} aria-label={ariaLabel}>\n {' '}\n {text}{' '}\n </a>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface ISearchResultModalViewProps {\n modal: React.ReactElement;\n modalHeader: React.ReactElement;\n modalFooter: React.ReactElement;\n modalBody: React.ReactElement;\n}\n\ninterface IModalToggleProps {\n innerRef: React.RefObject<HTMLButtonElement> | undefined;\n id: string;\n text: string;\n ariaLabel: string;\n onClick(): void;\n}\n\nexport interface ISearchResultModalResources {\n modalTitle: string;\n modalCloseButtonText: string;\n}\n\nexport interface ISearchResultModalProps {\n resources: ISearchResultModalResources;\n isOpen: boolean;\n returnRef: React.RefObject<HTMLButtonElement> | undefined;\n onModalToggle(): void;\n}\n\nexport const ModalToggle: React.FC<IModalToggleProps> = (props: IModalToggleProps) => {\n const { text, onClick, ariaLabel, innerRef, id } = props;\n return (\n <button id={id} className='msc-button' aria-label={ariaLabel} onClick={onClick} ref={innerRef}>\n {text}\n </button>\n );\n};\n\nexport const SearchResultModal = (props: ISearchResultModalProps): ISearchResultModalViewProps => {\n return {\n modal: modalNode(props),\n modalHeader: modalHeaderNode(props),\n modalFooter: modalFooterNode(props),\n modalBody: <ModalBody className='msc-review-modal-body' />\n };\n};\n\nconst modalNode = (props: ISearchResultModalProps) => {\n return (\n <Modal\n autoFocus\n applicationNode='renderPage'\n returnFocusRef={props.returnRef}\n isOpen={props.isOpen}\n toggle={props.onModalToggle}\n className='msc-search-result-modal'\n zIndex={1050}\n />\n );\n};\n\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\n return <ModalHeader toggle={props.onModalToggle}>{props.resources.modalTitle}</ModalHeader>;\n};\n\nconst modalFooterNode = (props: ISearchResultModalProps) => {\n return (\n <ModalFooter>\n <Button onClick={props.onModalToggle} className='ms-sort-and-filter-modal-close'>\n {props.resources.modalCloseButtonText}\n </Button>\n </ModalFooter>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultContainerResources } from '../search-result-container.props.autogenerated';\n\ninterface IProductSearchResultItems {\n products: ProductSearchResult[];\n context: ICoreContext;\n resources: ISearchResultContainerResources;\n imageSettings?: IImageSettings;\n moduleType: string;\n moduleId: string;\n allowBackNavigation?: boolean;\n telemetryContent: ITelemetryContent;\n quickviewSlot?: {} | null | undefined;\n productComparisonButton?: {} | null | undefined;\n channelInventoryConfigurationId?: number;\n isPriceMinMaxEnabled?: boolean;\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\n/**\n * Returns the product inventory label.\n * @param channelInventoryConfigurationId - The channel configuration Id.\n * @param product - The product.\n * @returns The inventory label.\n */\nexport function getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\n return undefined;\n }\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\n if (inventoryAttribute) {\n return inventoryAttribute.TextValue;\n }\n return undefined;\n}\n\nexport const ProductSearchResultItems: React.FC<IProductSearchResultItems> = ({\n products,\n context,\n imageSettings,\n resources,\n moduleType,\n moduleId,\n allowBackNavigation,\n telemetryContent,\n quickviewSlot,\n productComparisonButton,\n channelInventoryConfigurationId,\n isPriceMinMaxEnabled,\n productsDimensionAvailabilities\n}) => {\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n return (\n <ul className='list-unstyled'>\n {products.map((product: ProductSearchResult, index: number) => (\n <li className='ms-product-search-result__item' key={index}>\n <ProductComponent\n context={context}\n telemetryContent={telemetryContent}\n imageSettings={imageSettings}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n ratingAriaLabel={resources.ratingAriaLabel}\n allowBack={allowBackNavigation}\n id={moduleId}\n key={product.RecordId}\n typeName={moduleType}\n data={{ product }}\n quickViewButton={quickviewSlot}\n productComparisonButton={productComparisonButton}\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\n priceResources={priceResources}\n swatchItemAriaLabel={resources.swatchItemAriaLabel}\n dimensionAvailabilities={productsDimensionAvailabilities?.find(\n dimensionAvailability =>\n ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === product.MasterProductId\n )}\n />\n </li>\n ))}\n </ul>\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 React from 'react';\n\ninterface ISeparator {\n separator: string;\n}\n\nexport const Separator: React.FC<ISeparator> = ({ separator }) => (\n <span>\n {` `}\n {separator}\n {` `}\n </span>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface ITitle {\n className: string;\n text: string;\n}\n\nexport const Title: React.FC<ITitle> = ({ text, className }) => (\n <span className={className}>\n {` `}\n {text}\n {` `}\n </span>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ISliderLabel, ISliderThumbProps, Slider } from '@msdyn365-commerce-modules/utilities';\nimport debounce from 'lodash/debounce';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\n\ntype InputType = 'Min' | 'Max';\n\nexport type RangeRefineItemType = 'slider' | 'input';\n\n/**\n * Range refine item properties.\n */\nexport interface IRangeRefineItemProps extends IRefineItemProps {\n rangeType: RangeRefineItemType;\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n sliderKey?: string;\n}\n\n/**\n * Range refine item state.\n */\nexport interface IRangeRefineItemState extends IRefineItemState {\n validationErrorMin: string | undefined;\n validationErrorMax: string | undefined;\n selectedMin: string | undefined;\n selectedMax: string | undefined;\n touchedMin: boolean;\n touchedMax: boolean;\n sliderId: string;\n minValue: string | undefined;\n maxValue: string | undefined;\n labels: ISliderLabel[];\n sliderThumbs: ISliderThumbProps[];\n}\n\n/**\n * RangeRefineItem component (controlled by RefineSubmenu).\n */\n@observer\nexport default class RangeRefineItem extends React.Component<IRangeRefineItemProps, IRangeRefineItemState> {\n private readonly _formattedPriceReverseLookup: Map<string, string> = new Map();\n\n private readonly minInput: React.RefObject<HTMLInputElement>;\n\n private readonly maxInput: React.RefObject<HTMLInputElement>;\n\n @computed get currencyCode(): string {\n return this.props.productRefinerValue.UnitText || '';\n }\n\n public constructor(props: IRangeRefineItemProps) {\n super(props);\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\n this._changeMin = this._changeMin.bind(this);\n this._changeMax = this._changeMax.bind(this);\n this._finishChangeMin = this._finishChangeMin.bind(this);\n this._finishChangeMax = this._finishChangeMax.bind(this);\n\n this.minInput = React.createRef<HTMLInputElement>();\n this.maxInput = React.createRef<HTMLInputElement>();\n\n const { selectedRefinementCriterion } = this.props;\n const initialMin = selectedRefinementCriterion?.LeftValueBoundString ?? '0';\n const initialMax = selectedRefinementCriterion?.RightValueBoundString;\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\n this.props.productRefinerValue.RefinerRecordId\n )}`;\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\n const minPrice = this._formatPrice(minValue);\n const maxPrice = this._formatPrice(maxValue);\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\n const selectedMin =\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\n const selectedMax =\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\n this.props.productRefinerValue.RightValueBoundString ??\n maxValue;\n const selectedMinPrice = this._formatPrice(selectedMin);\n const selectedMaxPrice = this._formatPrice(selectedMax);\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\n sliderId,\n sliderKeyString,\n selectedMin,\n selectedMinPrice,\n selectedMax,\n selectedMaxPrice,\n maxPrice\n );\n this.state = {\n isChecked: false,\n validationErrorMin: undefined,\n validationErrorMax: undefined,\n selectedMin: initialMin,\n selectedMax: initialMax,\n touchedMin: false,\n touchedMax: false,\n sliderId,\n minValue,\n maxValue,\n labels,\n sliderThumbs\n };\n }\n\n public shouldComponentUpdate(nextProps: IRangeRefineItemProps, nextState: IRangeRefineItemState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public componentDidUpdate(previousProps: IRangeRefineItemProps): void {\n if (previousProps !== this.props) {\n this.updateSliderProps();\n }\n }\n\n public render(): JSX.Element | undefined {\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\n refineItemCommonProps.telemetry.error(\n 'Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy'\n );\n return undefined;\n }\n\n if (this.props.rangeType === 'input') {\n return this._renderInputFields();\n }\n\n return this._renderSlider();\n }\n\n /**\n * Function to update slider props.\n */\n private updateSliderProps(): void {\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\n this.props.productRefinerValue.RefinerRecordId\n )}`;\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\n const minPrice = this._formatPrice(minValue);\n const maxPrice = this._formatPrice(maxValue);\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\n const selectedMin =\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\n const selectedMax =\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\n this.props.productRefinerValue.RightValueBoundString ??\n maxValue;\n const selectedMinPrice = this._formatPrice(selectedMin);\n const selectedMaxPrice = this._formatPrice(selectedMax);\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\n sliderId,\n sliderKeyString,\n selectedMin,\n selectedMinPrice,\n selectedMax,\n selectedMaxPrice,\n maxPrice\n );\n this.setState({ sliderId, minValue, maxValue, labels, sliderThumbs });\n }\n\n /**\n * Function to create the labels for slider.\n * @param sliderId - Slider element id for the DOM.\n * @param minPrice - Slider min value.\n * @param maxPrice - Slider max value.\n * @returns Array labels.\n */\n private readonly getLabels = (sliderId: string, minPrice: string, maxPrice: string): ISliderLabel[] => {\n return [\n {\n labelId: `${sliderId}_start`,\n labelString: `${minPrice}`,\n labelPositioning: 'start'\n },\n {\n labelId: `${sliderId}_end`,\n labelString: `${maxPrice}`,\n labelPositioning: 'end'\n }\n ];\n };\n\n /**\n * Function to create the slider thumbs for slider.\n * @param sliderId - Slider element id for the DOM.\n * @param sliderKey - Unique key for slider.\n * @param selectedMin - Slider selected min value.\n * @param selectedMinPrice - Slider selected min price.\n * @param selectedMax - Slider selected max value.\n * @param selectedMaxPrice - Slider selected max price..\n * @param maxPrice - Slider max price..\n * @returns Slider Thumb Props.\n */\n private readonly getSliderThumbs = (\n sliderId: string,\n sliderKey: string,\n selectedMin: string,\n selectedMinPrice: string,\n selectedMax: string | undefined,\n selectedMaxPrice: string,\n maxPrice: string\n ): ISliderThumbProps[] => {\n const sliderThumbDefaultValue = 0;\n return [\n {\n id: `${sliderId}${sliderKey}_slider_thumb_start`,\n value: (selectedMin && Number(selectedMin)) || sliderThumbDefaultValue,\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\n ariaValueText: `${selectedMinPrice}`\n },\n {\n id: `${sliderId}${sliderKey}_slider_thumb_end`,\n value: Number(selectedMax) || Number(maxPrice),\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\n ariaValueText: `${selectedMaxPrice}`\n }\n ];\n };\n\n private _renderInputFields(): JSX.Element | undefined {\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\n\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', parentProductRefinerHierarchy.KeyName || '');\n const formAttrs = {\n 'aria-label': rangeAriaLabel,\n 'aria-disabled': isDisabled\n };\n\n // To enable price formatting of selected fields, this is the approach:\n // initial value: min=0 formatted as price, max=undefined\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\n // onBlur: validate and format entered value as price\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\n }`;\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\n }`;\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\n return (\n <form className='ms-refine-submenu__input-range-refiner' {...formAttrs}>\n <label className={minLabelClassName}>\n {refineItemCommonProps.minLabel}\n <input\n className={minInputClassName}\n onChange={this._changeMin}\n onFocus={this._changeMin}\n onBlur={this._finishChangeMin}\n value={formattedSelectedMin}\n ref={this.minInput}\n />\n </label>\n <label className={maxLabelClassName}>\n {refineItemCommonProps.maxLabel}\n <input\n className={maxInputClassName}\n placeholder={formattedSelectedMax ? undefined : refineItemCommonProps.placeholderTextMax}\n onChange={this._changeMax}\n onFocus={this._changeMax}\n onBlur={this._finishChangeMax}\n value={formattedSelectedMax}\n ref={this.maxInput}\n />\n </label>\n {validationErrorMin && (\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-min-error-text'>\n {validationErrorMin}\n </span>\n )}\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-max-error-text'>\n {validationErrorMax}\n </span>\n )}\n </form>\n );\n }\n\n private _renderSlider(): JSX.Element | undefined {\n const { isDisabled, sliderKey } = this.props;\n const ariaAttributes = {\n 'aria-disabled': isDisabled\n };\n\n return (\n <Slider\n className='ms-refine-submenu__range-refiner'\n key={this.state.sliderId}\n sliderKey={sliderKey}\n id={this.state.sliderId}\n inForm={false}\n min={(this.state.minValue && Number(this.state.minValue)) || undefined}\n max={(this.state.maxValue && Number(this.state.maxValue)) || undefined}\n step={1}\n orientation='horizontal'\n labels={this.state.labels}\n showLabels\n showTooltip\n sliderThumbs={this.state.sliderThumbs}\n onChangeEnd={this._onRangeUpdateEnd}\n onChange={debounce(this._onRangeUpdate, 500)}\n handleTooltipText={this._handleRangeTooltipText}\n {...ariaAttributes}\n />\n );\n }\n\n private _changeMin(event: React.FocusEvent<HTMLInputElement>): void {\n this._changeValue(event, 'Min');\n }\n\n private _changeMax(event: React.FocusEvent<HTMLInputElement>): void {\n this._changeValue(event, 'Max');\n }\n\n private _changeValue(event: React.FocusEvent<HTMLInputElement>, inputType: InputType): void {\n const selectedKey = `selected${inputType}`;\n const touchedKey = `touched${inputType}`;\n this.setState({\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\n [touchedKey]: true\n });\n }\n\n private _finishChangeMin(event: React.FocusEvent<HTMLInputElement>): boolean {\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\n this.setState({\n selectedMin: selectedMinValue,\n minTouched: false\n });\n const minInput = Number(selectedMinValue);\n const {\n onToggle,\n parentProductRefinerHierarchy,\n productRefinerValue,\n refineItemCommonProps,\n selectedRefinementCriterion\n } = this.props;\n const max = (selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString) || undefined;\n\n const maxNum = max ? Number(max) : undefined;\n\n if (isNaN(minInput)) {\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\n this._focus('Min');\n return false;\n }\n\n if (this._validateRange(minInput, maxNum)) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: minInput,\n rangeEnd: maxNum\n });\n return true;\n }\n this._focus('Min');\n\n return false;\n }\n\n private _finishChangeMax(event: React.FocusEvent<HTMLInputElement>): boolean {\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\n this.setState({\n selectedMax: selectedMaxValue,\n maxTouched: false\n });\n const maxInput = Number(selectedMaxValue);\n const {\n onToggle,\n parentProductRefinerHierarchy,\n productRefinerValue,\n refineItemCommonProps,\n selectedRefinementCriterion\n } = this.props;\n const min = (selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString) || '0';\n\n const minNum = Number(min);\n\n if (isNaN(maxInput)) {\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\n this._focus('Max');\n return false;\n }\n\n if (this._validateRange(minNum, maxInput)) {\n if (productRefinerValue) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: minNum,\n rangeEnd: maxInput\n });\n } else {\n this._focus('Max');\n }\n return true;\n }\n\n return false;\n }\n\n private _focus(inputType: InputType): void {\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\n\n setTimeout(() => {\n if (ref && ref.current) {\n ref.current.focus();\n }\n }, 50);\n }\n\n private _getFormattedSelectedValue(\n selected: string | undefined,\n touched: boolean,\n validationError: string | undefined\n ): string | undefined {\n if (touched || validationError || selected === undefined) {\n return selected;\n }\n return this._formatPrice(selected);\n }\n\n private _validateRange(min: number, max: number | undefined): boolean {\n const { refineItemCommonProps } = this.props;\n if (max === undefined) {\n return true;\n }\n\n if (min > max) {\n this.setState({\n validationErrorMin: refineItemCommonProps.validationErrorRange,\n validationErrorMax: refineItemCommonProps.validationErrorRange\n });\n return false;\n }\n\n return true;\n }\n\n private _formatPrice(amount: string | undefined): string {\n if (this.props.productRefinerValue.RefinerRecordId === 0) {\n const result = this.props.context.cultureFormatter.formatCurrency(Number(amount), this.currencyCode);\n return result;\n }\n return amount || '';\n }\n\n private _getInputWithoutFormatting(input: string): string {\n // First try to cast raw input to a number\n const inputAsNum = Number(input);\n if (!isNaN(inputAsNum)) {\n return input;\n }\n\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\n return reverseLookupResult || input;\n }\n\n // NOTE: Fix types once Shared Components build pipeline bug fixed\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _onRangeUpdate(sliderChangeNotification: any): void {\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\n if (sliderChangeNotification.eventType !== 'mousemove') {\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\n if (productRefinerValue && sliderChangeNotification) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: sliderChangeNotification.firstThumbValue,\n rangeEnd: sliderChangeNotification.secondThumbValue\n });\n\n this._focusOnSliderThumb(sliderChangeNotification);\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\n if (productRefinerValue && sliderChangeNotification) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: sliderChangeNotification.firstThumbValue,\n rangeEnd: sliderChangeNotification.secondThumbValue\n });\n\n this._focusOnSliderThumb(sliderChangeNotification);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\n if (sliderChangeNotification.id) {\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\n if (element) {\n setTimeout(() => {\n element.focus();\n }, 0);\n }\n }\n }\n\n private _handleRangeTooltipText(tooltip: number): string {\n return this._formatPrice(`${tooltip}`);\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\nimport { checkIfShouldDisplayAsSwatch, DimensionTypes, IDimensionsApp, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\n\n/**\n * RefineItem properties.\n */\nexport interface IRefineItemProps {\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\n productRefinerValue: ProductRefinerValue;\n selectedRefinementCriterion: ProductRefinerValue | undefined;\n selectedRefinerValues?: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n context: ICoreContext<IGeneric<IAny>>;\n moduleId: string;\n moduleTypeName: string;\n index?: number;\n productCountAriaLabel?: string;\n singleProductCountAriaLabel?: string;\n refineItemAriaLabel?: string;\n refineItemsAriaLabel?: string;\n isMobileView?: boolean;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n onToggle(notfication: Readonly<IRefineItemToggleNotification>): void;\n urlBuilder(refiner: IRefineItemToggleNotification): string;\n}\n\n/**\n * Refine item state.\n */\nexport interface IRefineItemState extends React.ComponentState {\n isChecked: boolean;\n renderingError?: object;\n}\n\n/**\n * Single-select and multi-select refine item component (controlled by RefineSubmenu).\n */\nexport default class RefineItem extends React.Component<IRefineItemProps, IRefineItemState> {\n private readonly anchorType: React.RefObject<HTMLAnchorElement>;\n\n private readonly payLoad: IPayLoad;\n\n public constructor(props: IRefineItemProps) {\n super(props);\n this._onClick = this._onClick.bind(this);\n this.state = {\n isChecked: !!this.props.selectedRefinementCriterion\n };\n this.anchorType = React.createRef();\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public shouldComponentUpdate(nextProps: IRefineItemProps, nextState: IRefineItemState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | undefined {\n const {\n isDisabled,\n refineItemCommonProps,\n parentProductRefinerHierarchy,\n productRefinerValue,\n selectedRefinementCriterion,\n productCountAriaLabel,\n singleProductCountAriaLabel,\n index,\n children,\n onToggle,\n context,\n telemetryContent,\n refineItemAriaLabel,\n refineItemsAriaLabel,\n ...attrs\n } = this.props;\n if (!productRefinerValue) {\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\n return undefined;\n }\n if (!productRefinerValue.LeftValueBoundString) {\n refineItemCommonProps.telemetry.warning(\n `[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`\n );\n }\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect;\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\n const isChecked = !!selectedRefinementCriterion;\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\n return this._renderRating(\n productRefinerValue,\n parentProductRefinerHierarchy,\n isChecked,\n context,\n index,\n telemetryContent,\n productCountAriaLabel,\n singleProductCountAriaLabel\n );\n }\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const productText = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const productCount = productRefinerValue.Count || 0;\n let refineMenuItemAriaLabel;\n if (productCount === 1) {\n refineMenuItemAriaLabel = refineItemAriaLabel\n ? format(refineItemAriaLabel, parentProductRefinerHierarchy.KeyName, productText)\n : '';\n } else {\n refineMenuItemAriaLabel = refineItemsAriaLabel\n ? format(refineItemsAriaLabel, parentProductRefinerHierarchy.KeyName, productText, productCount)\n : '';\n }\n\n const dimensionType = (this.props.parentProductRefinerHierarchy.KeyName?.toLocaleLowerCase() ?? '') as DimensionTypes;\n const shouldDisplayAsSwatch = this._getShouldDisplayAsSwatch(dimensionType);\n\n let className = 'ms-refine-submenu-item';\n if (shouldDisplayAsSwatch) {\n className = classnames(className, `ms-refine-submenu-item__dimension__${dimensionType}`);\n }\n\n // If the swatch has no color or image specified, it should be displayed as text.\n // We don't use swatch logic to display the number of the results found together with the text.\n const hasColor = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchColorHexCode);\n const hasImage = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchImageUrl);\n const hasContentSwatch = hasColor || hasImage;\n\n return (\n <li className={className} id={`${parentProductRefinerHierarchy.KeyName!}_${index}`}>\n <a\n key={selectedRefinementCriterion ? 'true' : 'false'}\n ref={this.anchorType}\n href={this._getRefinerUrl()}\n tabIndex={hasColor ? -1 : 0}\n onClick={this._onClick}\n className={itemTypeClassName}\n role={inputType}\n aria-label={refineMenuItemAriaLabel}\n aria-checked={!!selectedRefinementCriterion}\n {...attribute}\n {...attrs}\n >\n {hasContentSwatch && shouldDisplayAsSwatch && this._renderSwatch(dimensionType)}\n <span className='ms-refine-submenu-item__label' aria-hidden='true'>\n {/* eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string. */}\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\n </span>\n </a>\n </li>\n );\n }\n\n private _getShouldDisplayAsSwatch(dimensionType: DimensionTypes) {\n const shouldDisplayAsSwatch = checkIfShouldDisplayAsSwatch(dimensionType, this.props.context as ICoreContext<IDimensionsApp>);\n return shouldDisplayAsSwatch;\n }\n\n private _renderSwatch(dimensionType: DimensionTypes): JSX.Element | null {\n const productRefinerValue = this.props.productRefinerValue;\n\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const text = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n const swatchItems = [\n {\n itemId: `${productRefinerValue.RefinerRecordId ?? ''}-${dimensionType}-${text}`,\n value: text,\n dimensionType,\n colorHexCode: productRefinerValue.SwatchColorHexCode,\n imageUrl: productRefinerValue.SwatchImageUrl\n }\n ];\n\n return (\n <SwatchComponent\n className='ms-refine-submenu-item__swatch'\n apiSettings={this.props.context.request.apiSettings}\n list={swatchItems}\n isSelectionEnabled={false}\n isRefineItem\n />\n );\n }\n\n private _getRefinerUrl(): string {\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\n\n if (productRefinerValue) {\n return urlBuilder({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n }\n\n return '';\n }\n\n private readonly _onClick = (e: React.MouseEvent<HTMLAnchorElement | HTMLInputElement>): void => {\n e.preventDefault();\n\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\n if (productRefinerValue) {\n this.props.onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n\n setTimeout(() => {\n this.anchorType.current && this.anchorType.current.focus();\n }, 0);\n }\n };\n\n private _renderRating(\n productRefinerValue: ProductRefinerValue,\n parentProductRefinerHierarchy: IProductRefinerHierarchy,\n isChecked: boolean,\n context: ICoreContext,\n index?: number,\n telemetryContent?: ITelemetryContent,\n ratingUserCountAriaLabel?: string,\n ratingSingleUserCountAriaLabel?: string\n ): JSX.Element | undefined {\n if (productRefinerValue.LeftValueBoundString) {\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n const refinerRating = Number.parseInt(productRefinerValue.LeftValueBoundString, 10);\n const ratingRefiner = this.props.selectedRefinerValues?.find(\n value => value.DataTypeValue === productRefinerValue.DataTypeValue\n );\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const selectedRating = Number.parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\n const defaultChkProductCount = 1;\n let ratingComponentClass: string = 'ms-rating-component';\n if (refinerRating > selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__up`;\n } else if (refinerRating < selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__down`;\n } else {\n ratingComponentClass = `${ratingComponentClass}__current`;\n }\n const productCountAriaLabelValue =\n productRefinerValue.Count !== undefined && productRefinerValue.Count === defaultChkProductCount\n ? ratingSingleUserCountAriaLabel && format(ratingSingleUserCountAriaLabel, productRefinerValue.Count)\n : ratingUserCountAriaLabel && format(ratingUserCountAriaLabel, productRefinerValue.Count);\n return (\n <li\n className='ms-refine-submenu-item ms-refine-submenu-item__rating'\n role={!this.props.isMobileView ? 'presentation' : undefined}\n id={`${parentProductRefinerHierarchy.KeyName!}_${index!}`}\n >\n <a\n href={this._getRefinerUrl()}\n role='option'\n aria-selected={isChecked}\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString!}\n ${productCountAriaLabelValue!}`}\n onClick={this._onClick}\n {...attribute}\n >\n <RatingComponent\n className={ratingComponentClass}\n avgRating={refinerRating}\n ratingCount={productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString}\n hideCount={false}\n readOnly\n ariaLabel=''\n context={context}\n id={this.props.moduleId}\n typeName={this.props.moduleTypeName}\n data={{}}\n />\n <span className='refine-submenu-item__rating' aria-hidden={this.props.isMobileView ? 'true' : undefined}>\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\n </span>\n </a>\n </li>\n );\n }\n return undefined;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { DisplayTemplate, ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\nimport { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\nimport RefineItem from './refine-item';\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\nimport { findMatchingRefinementCriterion, isRangeType } from './utilities';\n\n/**\n * Properties associated with the RefineSubmenu component.\n */\nexport interface IRefineSubmenuProps {\n tempRangeTypeTODO: RangeRefineItemType;\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n productRefinerHierarchy: IProductRefinerHierarchy;\n selectedRefinerValues: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n isExpandedOnInitialLoad: boolean;\n context: ICoreContext<IGeneric<IAny>>;\n moduleId: string;\n moduleTypeName: string;\n productCountAriaLabel?: string;\n singleProductCountAriaLabel?: string;\n refineItemAriaLabel?: string;\n refineItemsAriaLabel?: string;\n isMobile?: boolean;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n onUpdateRefiners(notfication: Readonly<IRefineItemToggleNotification>): void;\n urlBuilder(refiner: IRefineItemToggleNotification): string;\n}\n\n/**\n * Refine submenu state.\n */\nexport interface IRefineSubmenuState extends React.ComponentState {\n expanded: boolean;\n}\n\n/**\n *\n * The RefineSubmenu component renders the submenu category and child items.\n * This computed observes the stateful category hierarchy object.\n * @extends {React.PureComponent<IRefineSubmenuProps>}\n */\nclass RefineSubmenu extends React.Component<IRefineSubmenuProps, IRefineSubmenuState> {\n constructor(props: IRefineSubmenuProps) {\n super(props);\n\n this._onToggleItem = this._onToggleItem.bind(this);\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\n\n const isExpanded = this.props.isExpandedOnInitialLoad;\n\n // If (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\n // isExpanded = true;\n // }\n\n this.state = {\n expanded: isExpanded\n };\n }\n\n public shouldComponentUpdate(nextProps: IRefineSubmenuProps, nextState: IRefineSubmenuState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\n\n if (!productRefinerHierarchy) {\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\n }\n\n if (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating && this.props.context.app.config.hideRating) {\n return null;\n }\n\n const className = classnames(\n 'ms-refine-submenu',\n 'list-group',\n productRefinerHierarchy.KeyName // Deprecated because of the localization issues. Leaving for backward compatibility reasons.\n );\n\n return (\n <div className={className}>\n <Button\n className={this.state.expanded ? 'ms-refine-submenu__toggle_expanded' : 'ms-refine-submenu__toggle_collapsed'}\n aria-label={productRefinerHierarchy.KeyName}\n onClick={this._onToggleSubmenu}\n aria-expanded={this.state.expanded}\n >\n {productRefinerHierarchy.KeyName}\n </Button>\n <Collapse isOpen={this.state.expanded} timeout={350}>\n {this._renderChildItems(productRefinerHierarchy)}\n </Collapse>\n </div>\n );\n }\n\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n if (isRangeType(productRefinerHierarchy.DataTypeValue)) {\n return this._renderRange(productRefinerHierarchy);\n }\n return this._renderSingleMultiSelect(productRefinerHierarchy);\n }\n\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n const {\n isDisabled,\n refineItemCommonProps,\n selectedRefinerValues,\n context,\n productCountAriaLabel,\n singleProductCountAriaLabel,\n refineItemAriaLabel,\n refineItemsAriaLabel,\n isMobile\n } = this.props;\n const isSingleSelect =\n productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect &&\n productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating;\n const role = isSingleSelect ? { role: 'listbox' } : undefined;\n const refinerValuesList = productRefinerHierarchy.Values || [];\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\n if (!child) {\n refineItemCommonProps.telemetry.error(\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\n );\n return null;\n }\n\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n\n return (\n <RefineItem\n parentProductRefinerHierarchy={productRefinerHierarchy}\n productRefinerValue={child}\n selectedRefinementCriterion={selectedRefinementCriterion}\n selectedRefinerValues={selectedRefinerValues.filter(selectedValue =>\n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId)\n )}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n urlBuilder={this.props.urlBuilder}\n isDisabled={isDisabled}\n key={index}\n index={index}\n context={context}\n moduleId={this.props.moduleId}\n moduleTypeName={this.props.moduleTypeName}\n telemetryContent={this.props.telemetryContent}\n productCountAriaLabel={productCountAriaLabel}\n refineItemAriaLabel={refineItemAriaLabel}\n refineItemsAriaLabel={refineItemsAriaLabel}\n singleProductCountAriaLabel={singleProductCountAriaLabel}\n isMobileView={isMobile}\n />\n );\n });\n return (\n <ul\n className={`ms-refine-submenu__list ${productRefinerHierarchy.KeyName}`}\n {...role}\n aria-label={productRefinerHierarchy.KeyName}\n >\n {listItems}\n </ul>\n );\n }\n\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\n if (\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars\n ) {\n return 'slider';\n }\n return 'input';\n }\n\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n const {\n isDisabled,\n refineItemCommonProps,\n selectedRefinerValues,\n context,\n minValueSliderThumbAriaLabel,\n maxValueSliderThumbAriaLabel\n } = this.props;\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\n const refinerValuesList = productRefinerHierarchy.Values || [];\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\n if (!child) {\n refineItemCommonProps.telemetry.error(\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\n );\n return null;\n }\n\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n\n const rangeType = this._getRangeType(productRefinerHierarchy);\n const key = selectedRefinementCriterion\n ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}`\n : `not-selected-${index}`;\n return (\n <li className={`${submenuClassNamePrefix}--range`} key={index}>\n <RangeRefineItem\n parentProductRefinerHierarchy={productRefinerHierarchy}\n productRefinerValue={child}\n selectedRefinementCriterion={selectedRefinementCriterion}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n urlBuilder={this.props.urlBuilder}\n isDisabled={isDisabled}\n rangeType={rangeType}\n key={key}\n sliderKey={key}\n context={context}\n minValueSliderThumbAriaLabel={minValueSliderThumbAriaLabel}\n maxValueSliderThumbAriaLabel={maxValueSliderThumbAriaLabel}\n moduleId={this.props.moduleId}\n moduleTypeName={this.props.moduleTypeName}\n />\n </li>\n );\n });\n return <ul className={`ms-refine-submenu__list list-unstyled ${productRefinerHierarchy.KeyName}`}>{listItems}</ul>;\n }\n\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\n this.props.onUpdateRefiners(itemToggleNotification);\n }\n\n private _onToggleSubmenu(): void {\n this.setState(prevState => ({\n expanded: !prevState.expanded\n }));\n }\n}\n\nexport default RefineSubmenu;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ITelemetry } from '@msdyn365-commerce/core';\nimport { AttributeDataType, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\n\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\n\n/**\n * Types of product refiner values.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerValueDataTypeValue {\n /**\n * Range slider is used for selections like price.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Range = 1,\n\n /**\n * Range input is a different way to specify ranges and can be expressed with input boxes\n * as well as a set of discrete single-select type values.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n RangeInput = 4,\n\n /**\n * This is a discrete list item, either multi-select or single-select.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n List = 5,\n\n /**\n * Boolean types allows only single-select.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Boolean = 6\n}\n\n/**\n * Types of product refiners.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerTypeValue {\n /**\n * Refiner values are single-select.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Single = 0,\n\n /**\n * Refiner values are multi-select.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Multi = 1\n}\n\n/**\n * ProductRefinerSource enum type.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerSource {\n /**\n * The None member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n None = 0,\n\n /**\n * The Attribute member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Attribute = 1,\n\n /**\n * The Category member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Category = 2,\n\n /**\n * The Price member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Price = 3,\n\n /**\n * The Rating member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Rating = 4\n}\n\n/**\n * Checks if the data type value corresponds to a slider.\n * @param dataTypeValue\n */\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\n return (\n dataTypeValue === AttributeDataType.Currency ||\n dataTypeValue === AttributeDataType.Decimal ||\n dataTypeValue === AttributeDataType.Integer\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value.\n * @param productRefinerValue Product refiner value to match.\n * @param refinementCriteria Selected refinement criteria.\n */\nexport function findMatchingRefinementCriterion(\n productRefinerValue: ProductRefinerValue,\n refinementCriteria: ProductRefinerValue[]\n): ProductRefinerValue | undefined {\n // If the value is a range, then match only on data type value; otherwise match on item string\n return refinementCriteria.find((refinementCriterion: ProductRefinerValue) =>\n isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value.\n * @param productRefinerValue Product refiner value to match.\n * @param refinementCriteria Selected refinement criteria.\n * @param refinementCriterion\n */\nexport function isMatchingRefinementCriterion(productRefinerValue: ProductRefinerValue, refinementCriterion: ProductRefinerValue): boolean {\n // If the value is a range, then match only on data type value; otherwise match on item string\n return (\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\n (isRangeType(refinementCriterion.DataTypeValue) ||\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\n );\n}\n\nexport function getUpdatedRefinementCriteria(\n itemToggleNotification: IRefineItemToggleNotification,\n currentRefinementCriteria: ProductRefinerValue[]\n): ProductRefinerValue[] {\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\n let toggledItemFound = false;\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\n toggledItemFound = true;\n if (itemToggleNotification.isSelecting) {\n const next = {\n ...selectedCriterion,\n LeftValueBoundString:\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\n selectedCriterion.LeftValueBoundString,\n RightValueBoundString:\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\n selectedCriterion.RightValueBoundString\n };\n updatedRefinementCriteria.push(next);\n } // Else the item is being de-selected, so omit it from the refinement criteria\n } else {\n // Keep existing criterion because it is not in the item toggle notification\n updatedRefinementCriteria.push(selectedCriterion);\n }\n });\n\n if (!toggledItemFound) {\n const next = {\n ...itemToggleNotification.productRefinerValue,\n LeftValueBoundString:\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\n itemToggleNotification.productRefinerValue.LeftValueBoundString,\n RightValueBoundString:\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\n itemToggleNotification.productRefinerValue.RightValueBoundString\n };\n updatedRefinementCriteria.push(next);\n\n // If single select, then deselect any others in the parent refiner group\n if (\n (itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text ||\n itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect\n ) {\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\n // Do nothing\n } else {\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) =>\n isMatchingRefinementCriterion(child, criterion)\n );\n if (matchingIndex > -1) {\n updatedRefinementCriteria.splice(matchingIndex, 1);\n }\n }\n });\n }\n }\n\n return updatedRefinementCriteria;\n}\n\nexport function formatPrice(\n amount: string | undefined,\n currency: string | undefined,\n locale: string | undefined,\n telemetry: ITelemetry\n): string {\n if (!amount || !currency) {\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\n return amount || '';\n }\n const priceAmount = (amount && Number(amount)) || 0;\n let result: string;\n\n try {\n result = new Intl.NumberFormat(locale, {\n style: 'currency',\n currencyDisplay: 'symbol',\n currency,\n minimumFractionDigits: 0\n }).format(priceAmount);\n } catch (error) {\n result = `${priceAmount} ${currency}`;\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${error}`);\n }\n\n return result;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CategoryHierarchy as CategoryHierarchyData,\n IProductRefinerHierarchy,\n IProductsDimensionsAvailabilities\n} from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365, { getCatalogId, ICoreContext } from '@msdyn365-commerce/core';\nimport {\n ChannelInventoryConfiguration,\n format,\n ProductPrice,\n ProductRefinerValue,\n SortColumn,\n StoreOperationsDataActions,\n TextValueTranslation\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n DimensionAvailabilitiesForProductSearchResultInput,\n DimensionTypes,\n DimensionSwatchDisplayTypes,\n getDimensionAvailabilitiesForProductSearchResultAction,\n getPriceForProductSearchResult,\n IDimensionsApp,\n PriceForProductSearchResultInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getTelemetryObject,\n ILabeledDropdownOnChangeNotification,\n ILabeledDropdownOption,\n IModuleProps,\n INodeProps,\n isMobile,\n ITelemetryContent,\n LabeledDropdown,\n UncontrolledPagination,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed, observable, reaction, transaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport {\n buildListPageUrl,\n getCollectionProducts,\n getCollectionRefinersAction,\n getCurrentUrl,\n GetFullProductsByCollectionInput,\n IFullProductsSearchResultsWithCount,\n parseQueryParam,\n ProductListInventoryFilteringOptions,\n RefinersByCollectionInput,\n sortOptions\n} from './actions';\nimport { hydrateRefinersFromUrl } from './actions/url-utils';\nimport {\n ErrorMessage,\n FeatureSearchResultItem,\n getUpdatedRefinementCriteria,\n IChoiceSummaryClickNotification,\n IRefineItemCommonProps,\n IRefineItemToggleNotification,\n ISearchResultModalViewProps,\n isMatchingRefinementCriterion,\n Link,\n ModalToggle,\n ProductSearchResultItems,\n SearchResultModal,\n Separator,\n Title\n} from './components';\nimport ChoiceSummary from './components/choice-summary';\nimport RefineSubmenu from './components/refine-submenu';\nimport { ListPageState } from './list-page-state';\nimport { ISearchResultContainerData } from './search-result-container.data';\nimport { expandRefinersCount, ISearchResultContainerProps } from './search-result-container.props.autogenerated';\n\nexport interface ISearchResultContainerViewProps extends ISearchResultContainerProps<ISearchResultContainerData> {\n products?: React.ReactNode;\n className?: string;\n SearchResultContainer: IModuleProps;\n TitleViewProps: ITitleViewProps;\n categoryHierarchy: ICategoryHierarchyViewProps;\n pagination?: React.ReactNode;\n ProductsContainer: INodeProps;\n ProductSectionContainer: INodeProps;\n refineMenu: IRefineMenuViewProps;\n sortByOptions: ISortByViewProps;\n choiceSummary?: React.ReactNode;\n modalToggle: React.ReactNode;\n searchResultModal: ISearchResultModalViewProps;\n isMobile: boolean;\n CategoryNavContainer: INodeProps;\n RefineAndProductSectionContainer: INodeProps;\n errorMessage: React.ReactNode;\n FeatureSearchContainer: INodeProps;\n similarLookProduct?: React.ReactNode;\n productPrices?: ProductPrice[];\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\nexport interface ITitleViewProps {\n TitleContainer: INodeProps;\n title: ISearchResultTitle;\n}\n\nexport interface IRefineMenuViewProps {\n RefineMenuContainer: INodeProps;\n RefinerSectionContainer: INodeProps;\n refiners?: React.ReactNode[];\n}\n\nexport interface ICategoryHierarchyViewProps {\n categoryHierarchyList?: React.ReactNode[];\n categoryHierarchySeparator?: React.ReactNode;\n CategoryHierarchyContainer: INodeProps;\n}\n\nexport interface ISortByViewProps {\n SortingContainer: INodeProps;\n sortByDropDown?: React.ReactNode;\n}\n\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Title component for search result container.\n */\nexport interface ISearchResultTitle {\n titlePrefix?: React.ReactNode;\n titleText?: React.ReactNode;\n titleCount?: React.ReactNode;\n}\n\nexport interface ISearchResultContainerState {\n sortingState: ISortByCollectionState;\n modalIsOpen: boolean;\n refiners: IProductRefinerHierarchy[];\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n channelInventoryConfiguration?: ChannelInventoryConfiguration;\n}\n\ninterface ISortByCollectionState {\n selectedSortByOption: ILabeledDropdownOption;\n pending: boolean;\n}\n\n/**\n *\n * SearchResultContainer component.\n * @extends {React.PureComponent<ISearchResultContainerProps<ISearchResultContainerData>>}\n */\n@observer\nexport default class SearchResultContainer extends React.PureComponent<\n ISearchResultContainerProps<ISearchResultContainerData>,\n ISearchResultContainerState\n> {\n @computed get isMobile(): boolean {\n return this._viewport === 'xs' || this._viewport === 'sm';\n }\n\n private readonly sortByDropdownOptions: ILabeledDropdownOption[] = [\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc },\n { key: sortOptions.sortByOptionBestSelling, value: this.props.resources.sortByOptionBestSelling },\n { key: sortOptions.sortByOptionNewScore, value: this.props.resources.sortByOptionNewScore },\n { key: sortOptions.sortByOptionTrendingScore, value: this.props.resources.sortByOptionTrendingScore }\n ];\n\n private readonly _refineItemCommonProps: IRefineItemCommonProps;\n\n private readonly _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\n\n @observable\n private _viewport: GridSize = 'lg';\n\n private readonly _modalToggleRef: React.RefObject<HTMLButtonElement>;\n\n private readonly _sortAndFilterContainerRef: React.RefObject<LabeledDropdown>;\n\n private expandrefinerCount: number | undefined = 0;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly productPrices: ProductPrice[];\n\n private readonly defaultPageNumber = 0;\n\n private readonly catalogId = getCatalogId(this.props.context.request);\n\n private isListPageStateUpdated: boolean = false;\n\n private _isMounted: boolean = false;\n\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\n let nameTranslation: TextValueTranslation | undefined;\n if (locale && nameTranslations && ArrayExtensions.hasElements(nameTranslations)) {\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\n }\n\n return nameTranslation?.Text;\n }\n\n public constructor(props: ISearchResultContainerProps<ISearchResultContainerData>, state: ISearchResultContainerState) {\n super(props);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Check required.\n this._viewport = props.context.request?.device?.Type === 'Mobile' ? 'xs' : 'lg';\n this._modalToggleRef = React.createRef<HTMLButtonElement>();\n this._sortAndFilterContainerRef = React.createRef<LabeledDropdown>();\n this._toggleModal = this._toggleModal.bind(this);\n this._updateViewport = this._updateViewport.bind(this);\n this.productPrices = [];\n this.state = {\n sortingState: {\n pending: false,\n selectedSortByOption: this.sortByDropdownOptions[0]\n },\n modalIsOpen: false,\n refiners: [],\n channelInventoryConfiguration: undefined\n };\n const { placeholderTextMax, minLabel, maxLabel, rangeNameFormat } = this.props.resources;\n\n const locale = this.props.context.request.locale;\n const telemetry = this.props.telemetry;\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\n const validationErrorRange = this.props.resources.validationErrorNotRange;\n this._refineItemCommonProps = {\n telemetry,\n locale,\n placeholderTextMax,\n minLabel,\n maxLabel,\n rangeNameFormat,\n validationErrorNaN,\n validationErrorRange\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this._updateViewport();\n }\n public async componentDidMount(): Promise<void> {\n this._isMounted = true;\n if (MsDyn365.isBrowser && window.addEventListener) {\n window.addEventListener('resize', this._updateViewport);\n this._updateViewport();\n }\n\n const listPageState = await this.props.data.listPageState;\n const products = await this.props.data.products;\n const channelInventoryConfiguration = await StoreOperationsDataActions.getInventoryConfigurationAsync({\n callerContext: this.props.context.actionContext\n });\n if (this._isMounted) {\n this.setState({ channelInventoryConfiguration });\n }\n\n this._updateListPageState(listPageState, products);\n\n // Initialize reaction based on listPageState properties\n reaction(\n () => {\n return [\n listPageState.activeFilters?.length,\n listPageState.currentPageNumber,\n ArrayExtensions.hasElements(listPageState.sortingCritera?.Columns)\n ];\n },\n async () => {\n const newListPageState = await this.props.data.listPageState;\n const input = new GetFullProductsByCollectionInput(\n newListPageState.pageType,\n this.props.context.request.apiSettings,\n {\n Paging: {\n Top: this.props.config.itemsPerPage,\n Skip: Math.max(newListPageState.pageSize * (newListPageState.currentPageNumber ?? 0), 0)\n },\n count: true,\n Sorting: newListPageState.sortingCritera ?? {}\n },\n newListPageState.activeFilters ?? [],\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\n +(this.props.context.request.urlTokens.recordId || 0),\n\n // eslint-disable-next-line max-len -- existing code\n this.props.context.request.query?.q\n ? this.props.context.request.query.q\n : JSON.stringify({\n ProductId: this.props.context.request.query?.productId,\n Recommendation: this.props.context.request.query?.recommendation\n }),\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Required check.\n !!this.props?.config?.includeAttributes,\n this.props.config.updateRefinerPanel,\n this.props.context.request.locale,\n this.catalogId,\n channelInventoryConfiguration\n );\n\n const productResults = await getCollectionProducts(input, this.props.context.actionContext);\n newListPageState.totalProductCount = productResults.count;\n newListPageState.activeProducts = productResults.products;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- check is required.\n if (\n this.props.config.enableAffiliationBasedPricing &&\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\n ) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\n this._getActivePrice();\n }\n\n await this._updateVariantAvailability();\n\n if (this.props.config.updateRefinerPanel) {\n const refinerInput = new RefinersByCollectionInput(\n newListPageState.pageType,\n this.props.context.request.apiSettings,\n {\n Paging: {\n Top: this.props.config.itemsPerPage,\n Skip: Math.max(\n newListPageState.pageSize * (newListPageState.currentPageNumber ?? this.defaultPageNumber),\n this.defaultPageNumber\n )\n },\n count: true,\n Sorting: newListPageState.sortingCritera ?? {}\n },\n newListPageState.activeFilters ?? [],\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\n +(this.props.context.request.urlTokens.recordId || 0),\n this.props.context.request.query?.q\n ? this.props.context.request.query.q\n : this.props.context.request.query?.productId,\n false,\n this.props.config.updateRefinerPanel,\n undefined,\n this.catalogId,\n channelInventoryConfiguration\n );\n\n const refiners = await getCollectionRefinersAction(refinerInput, this.props.context.actionContext);\n this.setState({ refiners });\n }\n }\n );\n\n if (\n this.props.config.enableAffiliationBasedPricing &&\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Condition required.\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\n ) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\n this._getActivePrice();\n }\n await this._updateVariantAvailability();\n }\n\n public componentWillUnmount(): void {\n this._isMounted = false;\n if (MsDyn365.isBrowser && window.removeEventListener) {\n window.removeEventListener('resize', this._updateViewport);\n }\n }\n\n public render(): JSX.Element {\n const {\n config: { imageSettings, className },\n resources,\n data: { listPageState, products: productCollection, featureProduct }\n } = this.props;\n\n if (!this.isListPageStateUpdated && listPageState.result && productCollection.result) {\n this._updateListPageState(listPageState.result, productCollection.result);\n this.isListPageStateUpdated = true;\n }\n\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const searchProduct = listPageState.result?.featureProduct ?? featureProduct.result ?? null;\n let errorText = '';\n if (!ArrayExtensions.hasElements(products)) {\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\n }\n const productsComponent = this._getProducts();\n const featureComponent = (\n <FeatureSearchResultItem\n product={searchProduct}\n context={this.props.context}\n imageSettings={imageSettings}\n resources={resources}\n moduleType={this.props.typeName}\n moduleId={this.props.id}\n telemetryContent={this.telemetryContent}\n recommendation={this.props.context.request.query?.recommendation}\n />\n );\n\n const searchResultContainerViewProps = {\n ...this.props,\n products: productsComponent,\n TitleViewProps: this._getCollectionTitle(),\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\n refineMenu: this._getRefineMenu(),\n className: classnames('ms-search-result-container', className),\n SearchResultContainer: {\n moduleProps: this.props,\n className: classnames('ms-search-result-container', className)\n },\n sortByOptions: this.props.data.listPageState.result?.totalProductCount !== 0 ? this._getSortingDropDown() : null,\n pagination: this._getPagination(),\n ProductsContainer: { className: 'ms-search-result-container__Products' },\n ProductSectionContainer: { className: 'ms-search-result-container__product-section' },\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section' },\n RefineAndProductSectionContainer: { className: 'ms-search-result-container__refine-product-section' },\n choiceSummary: this._getChoiceSummary(),\n modalToggle:\n this.props.data.listPageState.result?.totalProductCount !== 0 ? (\n <ModalToggle\n text={resources.modalTitle}\n ariaLabel={resources.modalTitle}\n innerRef={this._modalToggleRef}\n onClick={this._toggleModal}\n id='search-result-modal'\n />\n ) : null,\n searchResultModal: this._getSearchResultModal(),\n isMobile: this.isMobile,\n errorMessage: errorText && <ErrorMessage text={errorText} />,\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\n similarLookProduct: searchProduct ? featureComponent : null,\n productPrices: this.productPrices,\n productsDimensionAvailabilities: this.state.productsDimensionAvailabilities\n };\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\n }\n\n /**\n * Get products variants dimension availabilities.\n * @returns Void.\n */\n private readonly _updateVariantAvailability = async (): Promise<void> => {\n const context = this.props.context as ICoreContext<IDimensionsApp>;\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\n if (\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\n this.props.config.includeAttributes\n ) {\n await this._getProductsDimensionsAvailabilities();\n }\n };\n\n /**\n * Update the list page state with initial data.\n * @param listPageState -- List page State.\n * @param products -- Products.\n */\n private readonly _updateListPageState = (listPageState: ListPageState, products: IFullProductsSearchResultsWithCount): void => {\n let querySorting: SortColumn[] = [];\n const defaultPageNumber: number = 10;\n\n if (this._pageType === 'Category') {\n listPageState.pageType = 'Category';\n } else {\n listPageState.pageType = 'Search';\n }\n\n if (this.props.context.request.query?.sorting) {\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\n }\n\n listPageState.currentPageNumber =\n (this.props.context.request.query &&\n +this.props.context.request.query.skip / (this.props.config.itemsPerPage ?? defaultPageNumber)) ||\n 0;\n listPageState.sortingCritera = { Columns: querySorting };\n listPageState.pageSize = this.props.config.itemsPerPage ?? defaultPageNumber;\n listPageState.activeProducts = products.products;\n listPageState.totalProductCount = products.count;\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request) || [];\n if (this.props.context.request.query?.productId) {\n const featureProduct = this.props.data.featureProduct.result;\n if (featureProduct) {\n listPageState.featureProduct = featureProduct;\n }\n }\n };\n\n /**\n * Get products dimension availabilities.\n * @returns Void.\n */\n private readonly _getProductsDimensionsAvailabilities = async (): Promise<void> => {\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\n\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\n new DimensionAvailabilitiesForProductSearchResultInput(\n productsList,\n this.props.context as ICoreContext<IDimensionsApp>,\n DimensionSwatchDisplayTypes.productCard\n ),\n this.props.context.actionContext\n );\n\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\n this.setState({ productsDimensionAvailabilities });\n }\n };\n\n /**\n * Get the active price for the products.\n */\n private readonly _getActivePrice = async (): Promise<void> => {\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\n const products = await getPriceForProductSearchResult(\n new PriceForProductSearchResultInput(productsList),\n this.props.context.actionContext\n );\n\n const listPageState = await this.props.data.listPageState;\n listPageState.activeProducts = products;\n };\n\n private readonly _getSearchResultModal = (): ISearchResultModalViewProps => {\n const { resources } = this.props;\n return SearchResultModal({\n resources: {\n modalCloseButtonText: resources.modalCloseButtonText,\n modalTitle: resources.modalTitle\n },\n isOpen: this.state.modalIsOpen,\n returnRef: this._modalToggleRef,\n onModalToggle: this._toggleModal\n });\n };\n\n private readonly _getCollectionTitle = (): ITitleViewProps => {\n const { data, context, resources } = this.props;\n\n let collectionTitle: string | undefined = '';\n if (context && context.request && context.request.query && context.request.query.q) {\n collectionTitle = `\"${context.request.query.q}\"`;\n } else {\n collectionTitle =\n (data.category.result &&\n SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\n (data.category.result && data.category.result.Name) ||\n this.props.context.request.query?.title ||\n '';\n }\n let productCountText = '';\n let productCountNumber: number | undefined;\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\n productCountNumber = data.listPageState.result.totalProductCount;\n } else if (data.products && data.products.result) {\n productCountNumber = data.products.result.count;\n }\n\n if (productCountNumber && productCountNumber !== 0) {\n productCountText =\n productCountNumber !== 1\n ? format(this.props.resources.numberOfProducts, productCountNumber)\n : this.props.resources.oneProduct;\n } else {\n productCountText = format(this.props.resources.numberOfProducts, 0);\n }\n const pageName = context.request.telemetryPageName ? `result-count-${context.request.telemetryPageName.toLowerCase()}` : '';\n const titlePrefix = <Title className='ms-search-result__collection-title-prefix' text={resources.searchTextPrefix} />;\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\n\n return {\n TitleContainer: { className: `ms-search-result-container__title ${pageName}` },\n title: {\n titlePrefix,\n titleText,\n titleCount\n }\n };\n };\n\n private readonly _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\n const { data } = this.props;\n const categoryHierarchy = data.categoryHierarchy.result;\n const categoryLinks =\n categoryHierarchy &&\n categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\n return (\n <Link\n key={index}\n text={value.Name}\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\n href={value.Url}\n />\n );\n });\n const categoryLinkSeparator = <Separator separator='/' />;\n\n return {\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\n categoryHierarchyList: categoryLinks,\n categoryHierarchySeparator: categoryLinkSeparator\n };\n };\n\n private readonly _getSortingDropDown = (): ISortByViewProps => {\n const { resources } = this.props;\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\n let dropdownOptions = this._getAllSortByOptions();\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value.\n if (this.props.context.app.config.hideRating) {\n dropdownOptions = dropdownOptions.filter(dropdownOption => dropdownOption.key !== sortOptions.sortByOptionRatingDesc);\n }\n\n const dropdown = (\n <LabeledDropdown\n labelClassname='reviews-list-sort-by'\n labelText={resources.sortByDropdownLabel}\n dropdownId='categorySortByDropdown'\n dropdownClassname='reviews-list-dropdown'\n toggleColor='link'\n dropdownOptions={dropdownOptions}\n selectedOption={activeDropdown}\n onSelectOption={this._updateSortByDropdown}\n ref={this._sortAndFilterContainerRef}\n />\n );\n return {\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\n sortByDropDown: dropdown\n };\n };\n\n private readonly _getPagination = (): React.ReactNode => {\n const { config, context, data, resources } = this.props;\n const listPageState = data.listPageState.result;\n const fullUrl = getCurrentUrl(context.request);\n const itemsPerPage = config.itemsPerPage || 10;\n // eslint-disable-next-line max-len -- existing code\n const skipCount = listPageState?.currentPageNumber\n ? listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)\n : (this.props.context.request.query && +this.props.context.request.query.skip) || 0;\n const totalItems = listPageState?.totalProductCount || 0;\n const previousText = resources.flipperPrevious;\n const nextText = resources.flipperNext;\n\n if (totalItems <= itemsPerPage) {\n return null;\n }\n return (\n <UncontrolledPagination\n className='ms-search-result-container__pagination'\n role='navigation'\n aria-label={resources.paginationAriaLabel}\n url={fullUrl.href}\n qsp='skip'\n items={totalItems}\n itemsPerPage={itemsPerPage}\n startingItem={skipCount}\n previousText={this._renderPrev(previousText)}\n nextText={this._renderNext(nextText)}\n previousAriaLabel={previousText}\n nextAriaLabel={nextText}\n telemetryContent={this.telemetryContent}\n />\n );\n };\n\n private readonly _getRefineMenu = (): IRefineMenuViewProps => {\n const { data, context, config } = this.props;\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\n const validRefiners =\n this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.state.refiners)\n ? this.state.refiners.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\n })\n : data.refiners.result &&\n data.refiners.result.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\n });\n\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\n const expandedRefiners = this.expandrefinerCount;\n const subMenus =\n validRefiners &&\n validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\n return (\n <RefineSubmenu\n productRefinerHierarchy={productRefinerHierarchy}\n selectedRefinerValues={activeRefiners}\n refineItemCommonProps={this._refineItemCommonProps}\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\n key={index}\n onUpdateRefiners={this._onUpdateRefiners}\n urlBuilder={this._buildRefinerUrl}\n isDisabled={false}\n isExpandedOnInitialLoad={!!(expandedRefiners && expandedRefiners > index)}\n tempRangeTypeTODO={tempRangeTypeTODO}\n context={context}\n moduleId={this.props.id}\n moduleTypeName={this.props.typeName}\n telemetryContent={this.telemetryContent}\n productCountAriaLabel={this.props.resources.productCountAriaLabel}\n refineItemAriaLabel={this.props.resources.refineItemAriaLabel}\n refineItemsAriaLabel={this.props.resources.refineItemsAriaLabel}\n singleProductCountAriaLabel={this.props.resources.singleProductCountAriaLabel}\n isMobile={this.isMobile}\n />\n );\n });\n\n return {\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\n refiners: subMenus\n };\n };\n\n /**\n * Should hide from refiners.\n * @param refiner - The refiner.\n * @returns ShouldHideFromRefiners.\n */\n private readonly _shouldHideFromRefiners = (refiner: IProductRefinerHierarchy): boolean => {\n const { channelInventoryConfiguration } = this.state;\n const isInventorySortableAttribute =\n (this.props.data.products.result?.inventoryAwareSortableAttributeId !== 0 &&\n refiner.RecordId === this.props.data.products.result?.inventoryAwareSortableAttributeId) ||\n (channelInventoryConfiguration?.ProductAvailabilitySortableAttributeRecordId !== 0 &&\n refiner.RecordId === channelInventoryConfiguration?.ProductAvailabilitySortableAttributeRecordId);\n\n const isInventoryProductAttribute =\n (this.props.data.products.result?.channelInventoryConfigurationId !== 0 &&\n refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId) ||\n (channelInventoryConfiguration?.InventoryProductAttributeRecordId !== 0 &&\n refiner.RecordId === channelInventoryConfiguration?.InventoryProductAttributeRecordId);\n\n // Always hide sortable attribute since it's just for sorting products in Azure search, not for customers\n return (\n isInventorySortableAttribute ||\n (this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\n isInventoryProductAttribute)\n );\n };\n\n private readonly _getChoiceSummary = (): React.ReactNode => {\n const { resources, data, telemetry } = this.props;\n const { channelInventoryConfiguration } = this.state;\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n const refinerValueName = this.props.data.refiners.result?.find(rating => rating.KeyName === 'Rating');\n return (\n <ChoiceSummary\n classNames='ms-choice-summary-by-category'\n clearAllText={resources.clearAllText}\n label={resources.choiceSummaryLabel}\n closeAriaLabel={resources.closeAriaLabel}\n selectedChoices={selectedRefiners}\n // @ts-expect-error: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\n refinerHierarchy={data.refiners.result}\n choiceFormat={resources.choiceFormat}\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\n telemetry={telemetry}\n onChoiceClicked={this._onChoiceClicked}\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\n choiceAriaLabel={resources.choiceAriaLabel}\n telemetryContent={this.telemetryContent}\n context={this.props.context}\n channelInventoryConfigurationId={channelInventoryConfiguration?.InventoryProductAttributeRecordId}\n refinerValues={refinerValueName}\n />\n );\n };\n\n /**\n * Get Active products.\n * @returns - JSX Elements.\n */\n private readonly _getProducts = (): JSX.Element => {\n const {\n config: { imageSettings, allowBackNavigation: shouldAllowBackNavigation }\n } = this.props;\n const { resources } = this.props;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Reading config value.\n const breadCrumbType: string = this.props.context.app.config.breadcrumbType;\n const shouldAllowBack = shouldAllowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\n\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const quickviewSlot = this.props.slots?.quickview?.[0];\n const productComparisonButton = ArrayExtensions.hasElements(this.props.slots.productComparisonButton)\n ? this.props.slots.productComparisonButton[0]\n : null;\n\n const isPriceMinMaxFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\n );\n return (\n <ProductSearchResultItems\n products={products}\n context={this.props.context}\n imageSettings={imageSettings}\n resources={resources}\n moduleType={this.props.typeName}\n moduleId={this.props.id}\n allowBackNavigation={shouldAllowBack}\n telemetryContent={this.telemetryContent}\n quickviewSlot={quickviewSlot}\n productComparisonButton={productComparisonButton}\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\n productsDimensionAvailabilities={this.state.productsDimensionAvailabilities}\n />\n );\n };\n\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\n const {\n context: { request: requestContext, actionContext }\n } = this.props;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n // eslint-disable-next-line max-len -- existing code\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${\n !actionContext ? 'actionContext ' : ''\n } could not be found`;\n this.props.telemetry.warning(error);\n return;\n }\n\n window.history.pushState(\n {},\n '',\n buildListPageUrl(\n getCurrentUrl(this.props.context.request),\n undefined,\n [this._getSortColumnFromSelectedOption(notification.selectedOption)],\n undefined\n )\n );\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.sortingCritera = {\n Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)]\n };\n });\n };\n\n private readonly _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\n const { data } = this.props;\n\n if (!data.searchConfiguration.result) {\n return {};\n }\n\n const mappedConfiguration = data.searchConfiguration.result.find(searchConfiguration => {\n return searchConfiguration.key === option.key;\n });\n\n if (mappedConfiguration) {\n return mappedConfiguration.sortColumn;\n }\n\n return {};\n };\n\n /**\n * Retrieves current sort criteria.\n * @returns Sort criteria column which is currently active or undefined if it's not specified.\n */\n private readonly _getSortCriteriaColumn = (): SortColumn | undefined => {\n const sortCriteria = this.props.data.listPageState.result?.sortingCritera;\n if (ArrayExtensions.hasElements(sortCriteria?.Columns)) {\n return sortCriteria!.Columns[0];\n }\n\n const queryColumns = parseQueryParam<SortColumn[]>('sorting', this.props.context.request);\n if (ArrayExtensions.hasElements(queryColumns)) {\n return queryColumns[0];\n }\n\n return undefined;\n };\n\n /**\n * Retrieves dropdown options.\n * @returns All dropdown options.\n */\n private readonly _getAllSortByOptions = (): ILabeledDropdownOption[] => {\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!searchConfiguration) {\n return [];\n }\n\n const mappedSearchConfiguration = this.sortByDropdownOptions.filter(mappedSearchConfig =>\n searchConfiguration.find(item => mappedSearchConfig.key === item.key)\n );\n\n return ArrayExtensions.validValues(mappedSearchConfiguration);\n };\n\n /**\n * Retrieves current selected dropdown option based on the sort criteria.\n * @returns Current dropdown option.\n */\n private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\n const activeSortColumn = this._getSortCriteriaColumn();\n\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!activeSortColumn || !searchConfiguration) {\n return undefined;\n }\n\n const activeMappedConfig = searchConfiguration.find(\n mappedSearchConfig =>\n mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\n );\n if (!activeMappedConfig) {\n return undefined;\n }\n\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\n };\n\n private readonly _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\n const {\n context: { request: requestContext, actionContext }\n } = this.props;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n const error = `Refine menu cannot refine search criteria: \n ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\n this.props.telemetry.warning(error);\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Server side the list PageState will not be called.\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(\n itemToggleNotification,\n this.props.data.listPageState.result?.activeFilters || []\n );\n\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\n });\n };\n\n private readonly _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\n if (this.props.data.listPageState.result) {\n const newRefinementCriteria = getUpdatedRefinementCriteria(\n itemToggleNotification,\n this.props.data.listPageState.result.activeFilters || []\n );\n\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\n }\n this.props.telemetry.warning('[buildRefinerQueryString]List Page State Not available, unable to build refiner URL');\n return '';\n };\n\n private readonly _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\n const { data, telemetry } = this.props;\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\n return;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!notification.clearAll) {\n const selectedChoice = notification.choiceClicked;\n if (!selectedChoice) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\n return;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n\n // Set focus to sort and filter\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\n setTimeout(() => {\n dropdownElement && dropdownElement.focus();\n }, 50);\n }\n\n const fullUrl = getCurrentUrl(this.props.context.request);\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\n data.listPageState.result.currentPageNumber = 0;\n data.listPageState.result.activeFilters = currentRefinementCriteria;\n };\n\n private readonly _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\n const { data, telemetry } = this.props;\n const fullUrl = getCurrentUrl(this.props.context.request);\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\n return fullUrl.href;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!isClearAll) {\n if (!selectedRefiner) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\n return fullUrl.href;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n }\n\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\n };\n\n private _getViewport(): GridSize {\n if (MsDyn365.isBrowser) {\n return isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n }\n return isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n }\n\n private _toggleModal(): void {\n this.setState({\n modalIsOpen: !this.state.modalIsOpen\n });\n }\n\n private _updateViewport(): void {\n this._viewport = this._getViewport();\n\n if (this.state.modalIsOpen && !this.isMobile) {\n this._toggleModal();\n }\n }\n\n private readonly _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\n switch (refinerCount) {\n case expandRefinersCount.all:\n this.expandrefinerCount = validRefiners;\n break;\n case expandRefinersCount.one:\n this.expandrefinerCount = 1;\n break;\n case expandRefinersCount.two:\n this.expandrefinerCount = 2;\n break;\n case expandRefinersCount.three:\n this.expandrefinerCount = 3;\n break;\n case expandRefinersCount.four:\n this.expandrefinerCount = 4;\n break;\n default:\n this.expandrefinerCount = 0;\n }\n };\n\n /**\n * Renders a Pagination previous text.\n * @param paginationPreviousText - Pagination previous text from resources.\n * @returns Previous text and flipper icon.\n */\n private readonly _renderPrev = (paginationPreviousText: string) => {\n return (\n <div className='msc-pagination__prev'>\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\n <span className='prev-text'>{paginationPreviousText}</span>\n </div>\n );\n };\n\n /**\n * Renders a Pagination next text.\n * @param paginationNextText - Pagination next text from resources.\n * @returns Next text and flipper icon.\n */\n private readonly _renderNext = (paginationNextText: string) => {\n return (\n <div className='msc-pagination__next'>\n <span className='next-text'>{paginationNextText}</span>\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\n </div>\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultModalViewProps } from './components';\nimport {\n ICategoryHierarchyViewProps,\n IRefineMenuViewProps,\n ISearchResultContainerViewProps,\n ISortByViewProps,\n ITitleViewProps\n} from './search-result-container';\n\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\n const {\n SearchResultContainer,\n products,\n pagination,\n ProductsContainer,\n ProductSectionContainer,\n choiceSummary,\n isMobile,\n modalToggle,\n searchResultModal,\n TitleViewProps,\n refineMenu,\n categoryHierarchy,\n sortByOptions,\n CategoryNavContainer,\n RefineAndProductSectionContainer,\n errorMessage,\n FeatureSearchContainer,\n similarLookProduct\n } = props;\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\n if (isMobile) {\n return (\n <Module {...SearchResultContainer}>\n {renderCategoryHierarchy(categoryHierarchy)}\n {renderTitle(TitleViewProps)}\n {choiceSummary}\n {modalToggle}\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Module>\n );\n }\n return (\n <Module {...SearchResultContainer}>\n <Node {...CategoryNavContainer}>\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\n {TitleViewProps && renderTitleCount(TitleViewProps)}\n </Node>\n <Node {...RefineAndProductSectionContainer}>\n {refineMenu && renderRefiner(refineMenu)}\n <Node {...ProductSectionContainer}>\n {TitleViewProps && renderTitle(TitleViewProps)}\n {choiceSummary}\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Node>\n </Node>\n </Module>\n );\n};\n\nconst createSearchResultModal = (\n modalProps: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element => {\n return React.cloneElement(\n modalProps.modal,\n {},\n modalProps.modalHeader,\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage),\n modalProps.modalFooter\n );\n};\n\nconst createModalBody = (\n props: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element | null => {\n if (sortByDropDown) {\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefiner(refineMenu));\n }\n return null;\n};\n\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\n if (refiners) {\n return (\n <Node {...RefinerSectionContainer}>\n <Node {...RefineMenuContainer}>\n {refiners.map((submenu, index) => (\n <React.Fragment key={index}>{submenu}</React.Fragment>\n ))}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\n const { SortingContainer, sortByDropDown } = props;\n if (sortByDropDown && !isRecoSearchPage) {\n return <Node {...SortingContainer}>{sortByDropDown}</Node>;\n }\n return null;\n};\n\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\n if (categoryHierarchyList) {\n return (\n <Node {...CategoryHierarchyContainer}>\n {categoryHierarchyList.map((category, index) => (\n <React.Fragment key={index}>\n {category}\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\n </React.Fragment>\n ))}\n </Node>\n );\n }\n\n return null;\n};\n\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h2>\n {title.titlePrefix}\n {title.titleText}\n </h2>\n </Node>\n );\n }\n return null;\n};\n\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h5>{title.titleCount}</h5>\n </Node>\n );\n }\n return null;\n};\n\nexport default SearchResultContainerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { SocialMedia, SocialMediaComponent } from '@msdyn365-commerce/components';\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { IModuleProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISocialShareItemConfig, ISocialShareItemProps, socialMedia } from './social-share-item.props.autogenerated';\n\nexport interface ISocialShareItemViewProps extends ISocialShareItemProps<ISocialShareItemConfig> {\n SocialShareItemElement: React.ReactNode | null;\n SocialShareItem: IModuleProps;\n}\n\n/**\n *\n * SocialShareItem component.\n * @extends {React.PureComponent<ISocialShareItemProps<ISocialShareItemConfig>>}\n */\nclass SocialShareItem extends React.PureComponent<ISocialShareItemProps<ISocialShareItemConfig>> {\n constructor(props: ISocialShareItemProps<ISocialShareItemConfig>) {\n super(props);\n\n this._getSocialShareItem = this._getSocialShareItem.bind(this);\n }\n\n public render(): JSX.Element | null {\n const viewprops = {\n ...this.props,\n SocialShareItem: {\n moduleProps: this.props,\n className: 'ms-social-share-item'\n },\n SocialShareItemElement: this._getSocialShareItem()\n };\n\n return this.props.renderView(viewprops) as React.ReactElement;\n }\n\n private _getSocialShareItem(): React.ReactNode | null {\n const src = this.props.config.icon;\n if (MsDyn365.isBrowser) {\n switch (this.props.config.socialMedia) {\n case socialMedia.facebook:\n return (\n <SocialMediaComponent\n socialMedia={SocialMedia.Facebook}\n postUrl={document.URL}\n context={this.context}\n id={`${this.props.id}_facebook`}\n typeName={this.props.typeName}\n data={{}}\n src={src}\n />\n );\n case socialMedia.twitter:\n return (\n <SocialMediaComponent\n socialMedia={SocialMedia.Twitter}\n postUrl={document.URL}\n context={this.context}\n id={`${this.props.id}_twitter`}\n typeName={this.props.typeName}\n data={{}}\n src={src}\n />\n );\n case socialMedia.pinterest:\n return (\n <SocialMediaComponent\n socialMedia={SocialMedia.Pinterest}\n postUrl={document.URL}\n context={this.context}\n id={`${this.props.id}_pinterest`}\n typeName={this.props.typeName}\n data={{}}\n src={src}\n />\n );\n case socialMedia.linkedin:\n return (\n <SocialMediaComponent\n socialMedia={SocialMedia.Linkedin}\n postUrl={document.URL}\n context={this.context}\n id={`${this.props.id}_linkedin`}\n typeName={this.props.typeName}\n data={{}}\n src={src}\n />\n );\n case socialMedia.mail:\n return (\n <SocialMediaComponent\n socialMedia={SocialMedia.Mail}\n postUrl={document.URL}\n context={this.context}\n id={`${this.props.id}_mail`}\n typeName={this.props.typeName}\n data={{}}\n src={src}\n />\n );\n default:\n return null;\n }\n }\n return null;\n }\n}\n\nexport default SocialShareItem;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { ISocialShareItemViewProps } from './social-share-item';\n\nexport const SocialShareItemView: React.FC<ISocialShareItemViewProps> = props => {\n const { SocialShareItem, SocialShareItemElement } = props;\n\n if (!SocialShareItemElement) {\n props.context.telemetry.error('Social media is not valid, module wont render');\n return null;\n }\n return <Module {...SocialShareItem}>{SocialShareItemElement}</Module>;\n};\n\nexport default SocialShareItemView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface IWishlistItemDimension {\n key: string;\n className?: string;\n dimensionType: string;\n dimensionValue: string;\n}\n\nexport const WishlistItemDimension: React.FC<IWishlistItemDimension> = ({ key, className, dimensionType, dimensionValue }) => (\n <div key={key} className={className}>\n <span className='msc-wishlist-dimension__label'>{dimensionType}:</span>\n <span className='msc-wishlist-dimension__value'>{dimensionValue}</span>\n </div>\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 { IAny, ICoreContext, IGeneric, IImageSettings, Image, ITelemetry, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport {\n CommerceListLine,\n ProductPrice,\n ReleasedProductType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n convertProductDimensionTypeToDimensionTypes,\n getFallbackImageUrl,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IWishlistItemActionMessageState } from '../wishlist-items';\nimport { WishlistItemDimension } from './wishlist-items-dimensions';\n\nexport interface IWishlistItemProps extends CommerceListLine {\n product: SimpleProduct;\n wishlistState: IWishlistItemActionMessageState;\n price?: ProductPrice;\n context: ICoreContext<IGeneric<IAny>>;\n productUrl: string;\n imageSettings?: IImageSettings;\n removeFromWishlistText: string;\n isInStock: boolean;\n addToCartText: string;\n outOfStockText: string;\n index: number;\n itemKey: string;\n telemetry: ITelemetry;\n moduleId: string;\n moduleTypeName: string;\n enableImageProductLink?: boolean;\n inventoryInformationLabel?: string;\n inventoryLabelClassName?: string;\n telemetryContent?: ITelemetryContent;\n handlers: {\n onAddToCart(product: SimpleProduct, itemKey: string): void;\n onRemoveItem(productId: number): void | undefined;\n onDismiss(): void;\n };\n resources: {\n productDimensionTypeColor: string;\n productDimensionTypeSize: string;\n productDimensionTypeStyle: string;\n originalPriceText: string;\n currentPriceText: string;\n freePriceText: string;\n };\n}\n\nexport interface IWishlistItemViewProps {\n key: string;\n productImage: React.ReactNode;\n productLink: React.ReactNode;\n productDimensions?: React.ReactNode[];\n productPrice?: React.ReactNode;\n addToCartButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n productStatusMessage?: React.ReactNode;\n productName?: React.ReactNode;\n productAriaLabel?: string;\n entireProductLink?: string;\n inventoryInformation?: React.ReactNode;\n productUnitOfMeasure?: React.ReactNode;\n}\n\nconst _addItemToCart = (props: IWishlistItemProps): void => {\n const { product, itemKey, handlers } = props;\n const { onAddToCart } = handlers;\n\n onAddToCart && product && itemKey && onAddToCart(product, itemKey);\n};\n\nconst _removeItemFromWishlist = (props: IWishlistItemProps): void => {\n const { onRemoveItem } = props.handlers;\n const { RecordId } = props.product;\n\n onRemoveItem && RecordId && onRemoveItem(RecordId);\n};\n\nconst WishListItemActions = {\n addToCart: _addItemToCart,\n removeItem: _removeItemFromWishlist\n};\n\nconst _getFullProductLink = (props: IWishlistItemProps): string => {\n if (!msdyn365Commerce.isBrowser) {\n return '';\n }\n\n const fullUrl = new URL(props.productUrl, window.location.href);\n for (const dimension of props.product.Dimensions ?? []) {\n const dimensionValue = dimension.DimensionValue?.Value;\n if (!StringExtensions.isNullOrWhitespace(dimensionValue)) {\n const dimensionName = convertProductDimensionTypeToDimensionTypes(dimension.DimensionTypeValue);\n fullUrl.searchParams.set(dimensionName, dimensionValue!);\n }\n }\n return fullUrl.href;\n // return updateProductUrl(productUrl, context, swatch);\n};\n\nconst _renderAriaLabel = (props: IWishlistItemProps): string => {\n const { product, price, context, resources } = props;\n\n const { Name, Dimensions } = product;\n const { productDimensionTypeColor, productDimensionTypeSize, productDimensionTypeStyle } = resources;\n\n let formattedPrice = 'Free';\n let dimensions = null;\n\n if (price) {\n formattedPrice =\n price.BasePrice === 0 ? resources.freePriceText : context.cultureFormatter.formatCurrency(price.BasePrice!, price.CurrencyCode);\n }\n\n if (Dimensions) {\n dimensions = Dimensions.map(productDimension => {\n switch (productDimension.DimensionTypeValue) {\n case 1:\n return `${productDimensionTypeColor}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n case 3:\n return `${productDimensionTypeSize}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n case 4:\n return `${productDimensionTypeStyle}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n default:\n return '';\n }\n });\n }\n\n return `${Name} ${formattedPrice} ${(dimensions && dimensions.join('')) || ''}`;\n};\n\n/**\n * Renders a link to a product based on the given props.\n * @param input - Wishlist item props with the info about the product.\n * @param productUrl - The url to the product.\n * @returns React component with a link to a product.\n */\nconst renderProductLink = (input: IWishlistItemProps, productUrl: string) => {\n const { telemetryContent } = input;\n const { RecordId: recordId, Name: productName } = input.product;\n const payLoad = getPayloadObject('click', telemetryContent!, '', recordId.toString());\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n const productPageUrlWithSwatch = productUrl;\n return (\n !StringExtensions.isNullOrWhitespace(productPageUrlWithSwatch) && (\n <a\n href={productPageUrlWithSwatch}\n className='ms-wishlist-items__product-link'\n {...productAttributes}\n aria-label={_renderAriaLabel(input)}\n >\n {productName}\n </a>\n )\n );\n};\n\n/**\n * Renders a product name box.\n * @param productName - The text to display.\n * @returns React component with a name of a product.\n */\nconst renderProductName = (productName: string) => {\n return <div className='ms-wishlist-items__product-title'>{productName}</div>;\n};\n\n/**\n * Renders inventory information.\n * @param inventoryInformationLabel - The text to display.\n * @param inventoryLabelClassName - The component class name.\n * @returns React component.\n */\nconst renderInventoryInformationLabel = (inventoryInformationLabel: string | undefined, inventoryLabelClassName: string | undefined) => {\n const inventoryCssName = inventoryLabelClassName\n ? `ms-wishlist-items__inventory-label ${inventoryLabelClassName}`\n : 'ms-wishlist-items__inventory-label';\n return (\n !StringExtensions.isNullOrWhitespace(inventoryInformationLabel) && (\n <span className={inventoryCssName}>{inventoryInformationLabel}</span>\n )\n );\n};\n\n/**\n * Renders add to cart button.\n * @param input - Wishlist item props with the configuration.\n * @returns React component.\n */\nconst WishlistItemAddToCartButtonComponent = (input: IWishlistItemProps) => {\n const { isInStock, addToCartText, outOfStockText } = input;\n\n // Check if the product is service or not by product type.\n const isServiceItem = input.product.ItemTypeValue === ReleasedProductType.Service;\n\n const addItemAction = React.useCallback(() => {\n WishListItemActions.addToCart(input);\n }, [input]);\n\n return (\n <Button\n className='ms-wishlist-items__product-add-button'\n title={((isServiceItem || isInStock) && addToCartText) || outOfStockText}\n onClick={addItemAction}\n disabled={!(isServiceItem || isInStock)}\n >\n {((isServiceItem || isInStock) && addToCartText) || outOfStockText}\n </Button>\n );\n};\n\n/**\n * Renders remove from wishlist button.\n * @param input - Wishlist item props with the configuration.\n * @returns React component.\n */\nconst WishlistItemRemoveFromWishlistButtonComponent = (input: IWishlistItemProps) => {\n const { removeFromWishlistText } = input;\n\n const removeItemAction = React.useCallback(() => {\n WishListItemActions.removeItem(input);\n }, [input]);\n\n return <button className='ms-wishlist-items__product-remove-button' aria-label={removeFromWishlistText} onClick={removeItemAction} />;\n};\n\n/**\n * Gets the react node for product unit of measure display.\n * @param context - Module context.\n * @param unitOfMeasure - Product unit of measure.\n * @returns The node representing markup for unit of measure component.\n */\nconst renderUnitOfMeasure = (context: ICoreContext<IGeneric<IAny>>, unitOfMeasure?: string) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\n if (context.app.config && (!context.app.config.unitOfMeasureDisplayType || context.app.config.unitOfMeasureDisplayType === 'none')) {\n return undefined;\n }\n\n if (!unitOfMeasure) {\n return undefined;\n }\n\n return (\n <div className='msc-wishlistitems__product-unit-of-measure'>\n <span>{unitOfMeasure}</span>\n </div>\n );\n};\n\nexport const WishlistItem = (input: IWishlistItemProps): IWishlistItemViewProps | null => {\n const {\n product,\n price,\n context,\n imageSettings,\n wishlistState,\n itemKey,\n handlers,\n inventoryInformationLabel,\n enableImageProductLink,\n inventoryLabelClassName\n } = input;\n\n if (!product) {\n return null;\n }\n\n const { RecordId, Name, PrimaryImageUrl, Dimensions } = product;\n if (product.RecordId) {\n const fallbackImage = getFallbackImageUrl(\n product.ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n );\n const productUrl = _getFullProductLink(input);\n return {\n key: `${RecordId}-item`,\n productImage:\n PrimaryImageUrl && Name && _renderProductImage(context, product.Name!, PrimaryImageUrl, fallbackImage, imageSettings),\n productLink: renderProductLink(input, productUrl),\n productDimensions: Dimensions && _renderProductDimensions(input),\n productPrice: price && _renderPrice(input),\n productUnitOfMeasure: product.DefaultUnitOfMeasure && renderUnitOfMeasure(context, product.DefaultUnitOfMeasure),\n entireProductLink: enableImageProductLink ? productUrl : undefined,\n productAriaLabel: enableImageProductLink ? _renderAriaLabel(input) : undefined,\n productName: enableImageProductLink && Name && renderProductName(Name),\n\n addToCartButton: <WishlistItemAddToCartButtonComponent {...input} />,\n inventoryInformation: renderInventoryInformationLabel(inventoryInformationLabel, inventoryLabelClassName),\n removeButton: <WishlistItemRemoveFromWishlistButtonComponent {...input} />,\n productStatusMessage: wishlistState &&\n wishlistState.isOpen &&\n wishlistState.productId === RecordId &&\n wishlistState.itemKey === itemKey && (\n <div className='ms-wishlist-items__product-status'>\n <Alert color={wishlistState.statusCssString} isOpen={wishlistState.isOpen} toggle={handlers.onDismiss}>\n <span>{wishlistState.userMessage}</span>\n </Alert>\n </div>\n )\n };\n }\n return null;\n};\n\nconst _renderProductImage = (\n context: ICoreContext,\n heading: string,\n image?: string,\n fallbackImage?: string,\n imageSettings?: IImageSettings\n): JSX.Element | null => {\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=315&h=315&m=6', w: 0, h: 0 },\n lg: { q: 'w=315&h=315&m=6', w: 0, h: 0 },\n xl: { q: 'w=315&h=315&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n\n if (image) {\n return (\n <Image\n requestContext={context.actionContext.requestContext}\n className='ms-wishlist-items__product-image'\n altText={heading}\n title={heading}\n src={image}\n fallBackSrc={fallbackImage}\n gridSettings={context.request.gridSettings!}\n imageSettings={imageSettings || defaultImageSettings}\n loadFailureBehavior='empty'\n />\n );\n }\n return null;\n};\n\nconst _renderPrice = (props: IWishlistItemProps): JSX.Element | null => {\n const { price, context, moduleId, moduleTypeName, resources } = props;\n\n if (price) {\n return (\n <PriceComponent\n id={moduleId}\n typeName={moduleTypeName}\n data={{ price }}\n className='ms-wishlist-items__product-price'\n freePriceText={resources.freePriceText}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n context={context}\n />\n );\n }\n return null;\n};\n\nconst _renderProductDimensions = (props: IWishlistItemProps): (React.ReactNode | undefined)[] => {\n const { product, resources } = props;\n\n if (!product || !product.Dimensions) {\n return [];\n }\n\n return product.Dimensions.map((dimension, index) => {\n if (!dimension.DimensionValue || !dimension.DimensionValue.Value) {\n return undefined;\n }\n\n let type = '';\n\n switch (dimension.DimensionTypeValue) {\n case 1: {\n type = resources.productDimensionTypeColor;\n break;\n }\n case 3: {\n type = resources.productDimensionTypeSize;\n break;\n }\n case 4: {\n type = resources.productDimensionTypeStyle;\n break;\n }\n default:\n return undefined;\n }\n\n return (\n <WishlistItemDimension\n key={`${product.RecordId}-dimensions-${index}`}\n className='msc-price ms-wishlist-items__product-dimension'\n dimensionType={type}\n dimensionValue={dimension.DimensionValue.Value}\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 classnames from 'classnames';\nimport * as React from 'react';\n\nimport { wishlistStatus } from '../wishlist-items';\n\nexport interface IWishlistItemsStatusMessageProps {\n className?: string;\n errorType: wishlistStatus;\n text?: string;\n}\n\nexport const WishlistItemsStatusMessage: React.FC<IWishlistItemsStatusMessageProps> = ({ className, errorType, text }) => {\n switch (errorType) {\n case 'EMPTY':\n return <p className={classnames('ms-wishlist-items__message-empty', className)}>{text}</p>;\n case 'FAILED':\n return <p className={classnames('ms-wishlist-items__message-failed', className)}>{text}</p>;\n case 'LOADING':\n default:\n return <p className={className ? 'ms-wishlist-items__message-exists-product' : 'ms-wishlist-items__message-waiting'}>{text}</p>;\n }\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { AsyncResult, CommerceList, CommerceListLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { createGetByCustomerInput, removeLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CommerceListsDataActions.g';\nimport { getDeliveryOptionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport {\n ArrayExtensions,\n getProductUrlSync,\n IProductInventoryInformation,\n QueryResultSettingsProxy\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n updateMaxQuantityForCartLineItem\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport getItemsInWishlists, { ActiveWishlistInput } from './actions/get-items-in-wishlists';\nimport { IWishlistItemViewProps, WishlistItem, WishlistItemsStatusMessage } from './components';\nimport { IWishlistItemsData } from './wishlist-items.data';\nimport { IHeadingData, IWishlistItemsProps } from './wishlist-items.props.autogenerated';\n\nexport interface IWishlistItemActionMessageState {\n productId: number;\n itemKey: string;\n userMessage: string;\n statusCssString: string;\n messageGlyph: string;\n isOpen: boolean;\n isError: boolean;\n}\n\nexport type wishlistStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'EMPTY';\n\nexport interface IWishlistItemsViewProps extends IWishlistItemsProps<IWishlistItemsData> {\n WishlistItems: IModuleProps;\n status?: wishlistStatus;\n statusMessage?: React.ReactNode;\n heading?: React.ReactNode;\n Products?: INodeProps;\n Product?: INodeProps;\n ProductDetails?: INodeProps;\n ProductDimensions?: INodeProps;\n products?: IWishlistItemViewProps[];\n telemetryContent?: ITelemetryContent;\n statusNotExistsMessage?: React.ReactNode;\n}\n\n/**\n *\n * WishlistItems component.\n * @extends {React.PureComponent<IWishlistItemsProps<IWishlistItemsData>, IWishlistItemActionMessageState>}\n */\n@observer\nclass WishlistItems extends React.Component<IWishlistItemsProps<IWishlistItemsData>, IWishlistItemActionMessageState> {\n private readonly telemetryContent: ITelemetryContent;\n constructor(props: IWishlistItemsProps<IWishlistItemsData>) {\n super(props);\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public async componentDidMount(): Promise<void> {\n this.setState({ isError: false });\n }\n\n public shouldComponentUpdate(nextProps: IWishlistItemsProps<IWishlistItemsData>, nextState: IWishlistItemActionMessageState): 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 | null {\n const { heading, className } = this.props.config;\n const { emptyWishlistText, wishlistErrorGettingWishlist, noLongerExitsWishlistItemText } = this.props.resources;\n const { cart, productAvailability, wishlists, products } = this.props.data;\n\n if (cart.status === 'LOADING' || productAvailability.status === 'LOADING' || wishlists.status === 'LOADING') {\n const errorProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'LOADING',\n\n statusMessage: <WishlistItemsStatusMessage errorType='LOADING' text='Loading...' />,\n heading: this._renderHeading(heading)\n };\n return this.props.renderView(errorProps);\n }\n\n if (cart.status === 'FAILED' || productAvailability.status === 'FAILED' || wishlists.status === 'FAILED') {\n const errorProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'FAILED',\n statusMessage: <WishlistItemsStatusMessage errorType='FAILED' text={wishlistErrorGettingWishlist} />,\n heading: this._renderHeading(heading)\n };\n\n return this.props.renderView(errorProps);\n }\n\n const productsList = products && (products as AsyncResult<FullProduct[]>).result;\n\n if (productsList && productsList.length === 0) {\n const emptyViewProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'EMPTY',\n statusMessage: <WishlistItemsStatusMessage errorType='EMPTY' text={emptyWishlistText} />,\n heading: this._renderHeading(heading)\n };\n\n return this.props.renderView(emptyViewProps);\n }\n\n const viewProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'SUCCESS',\n heading: this._renderHeading(heading),\n Products: {\n className: 'ms-wishlist-items__products',\n tag: 'ul'\n },\n Product: {\n className: 'ms-wishlist-items__product',\n tag: 'li'\n },\n ProductDetails: {\n className: 'ms-wishlist-items__product-link',\n tag: 'a'\n },\n telemetryContent: this.telemetryContent,\n ProductDimensions: {\n className: 'ms-wishlist-items__product-dimensions'\n },\n products: productsList && this._renderProductList(productsList),\n statusNotExistsMessage:\n productsList && this._getProductNotExists(productsList, emptyWishlistText, noLongerExitsWishlistItemText)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: MsDyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n\n private _getProductNotExists(products: FullProduct[], emptytext: string, noLongerExisttext: string): JSX.Element | null {\n if (this.state && this.state.isError) {\n if (products.length === 0) {\n return <WishlistItemsStatusMessage errorType='SUCCESS' text={emptytext} />;\n }\n return (\n <WishlistItemsStatusMessage\n className={'ms-wishlist-items__message-exists-product'}\n errorType='SUCCESS'\n text={noLongerExisttext}\n />\n );\n }\n return null;\n }\n private _renderProductList(products: FullProduct[]): IWishlistItemViewProps[] {\n const {\n priceFree,\n originalPriceText,\n currentPriceText,\n addToCartButtonText,\n outOfStockText,\n removeButtonText,\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n productDimensionTypeAmount\n } = this.props.resources;\n const { context, telemetry } = this.props;\n const { imageSettings, enableImageProductLink } = this.props.config;\n\n return products.map((product: FullProduct, index) => {\n const currentProductProps = {\n product: product.ProductDetails,\n price: product.ProductPrice,\n context,\n wishlistState: this.state,\n productUrl: getProductUrlSync(product.ProductDetails, context.actionContext, undefined),\n imageSettings,\n removeFromWishlistText: removeButtonText,\n isInStock: this._isProductInStock(product),\n addToCartText: addToCartButtonText,\n outOfStockText,\n index,\n itemKey: `${product.ProductDetails.RecordId}-${product.ProductDetails.ItemId}-${index}`,\n telemetry,\n moduleId: this.props.id,\n moduleTypeName: this.props.typeName,\n enableImageProductLink,\n inventoryInformationLabel: this._inventoryLabel(product),\n inventoryLabelClassName: this._inventoryClassName(product),\n telemetryContent: this.telemetryContent,\n handlers: {\n onAddToCart: this._addItemToCart,\n onRemoveItem: this._removeItemFromWishlist,\n onDismiss: this._onDismiss\n },\n resources: {\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle: product.ProductDetails.IsGiftCard ? productDimensionTypeAmount : productDimensionTypeStyle,\n freePriceText: priceFree,\n originalPriceText,\n currentPriceText\n }\n };\n return WishlistItem(currentProductProps)!;\n });\n }\n\n // Dismiss alert when addingToCart/removeItem\n private readonly _onDismiss = () => {\n this.setState({\n isOpen: false\n });\n };\n\n private readonly _renderHeading = (heading?: IHeadingData): JSX.Element | undefined => {\n if (!heading) {\n return undefined;\n }\n return (\n <MsDyn365.Text\n className='ms-wishlist-items__heading'\n tag={heading.tag || 'h2'}\n text={heading.text}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\n />\n );\n };\n\n private readonly _addItemToCart = async (product: SimpleProduct, itemKey: string): Promise<void> => {\n const { context, data, resources, telemetry } = this.props;\n const { cart, productAvailability } = data;\n const { addedToCartSuccessMessage, addedToCartFailureMessage, invoiceInCartErrorMessage } = resources;\n\n const productInventoryInformation = this._getProductInventory({ ProductDetails: product }, productAvailability.result);\n\n if (context) {\n if (cart.result) {\n // Check if the product delivery mode is electronic\n const emailDeliveryModeCode = this.props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n\n const deliveryOptions = await getDeliveryOptionsAsync(\n {\n callerContext: this.props.context.actionContext,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(this.props.context.actionContext)\n },\n [product.RecordId]\n );\n const validateQuantity = this.isQuantityValidationRequired();\n const quantity = this.respectQuantityLimits() ? product?.Behavior?.MinimumQuantity ?? 1 : 1;\n\n const addProductToCartInput = {\n product,\n count: quantity,\n enableStockCheck: context.app.config.enableStockCheck,\n availableQuantity: productInventoryInformation\n ? productInventoryInformation.ProductAvailableQuantity.AvailableQuantity\n : 0,\n additionalProperties: { validateQuantity: validateQuantity },\n isAddEmailDeliveryItemToCart:\n ArrayExtensions.hasElements(deliveryOptions) &&\n ArrayExtensions.hasElements(deliveryOptions[0].DeliveryOptions) &&\n deliveryOptions[0].DeliveryOptions[0].Code === emailDeliveryModeCode\n };\n\n cart.result\n .addProductToCart(addProductToCartInput)\n .then(async result => {\n if (result.status === 'SUCCESS') {\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartSuccessMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n });\n } else if (result.substatus === 'MAXQUANTITY') {\n const curQuantity =\n (await cart).cart?.CartLines?.find(item => item.ProductId === product.RecordId)?.Quantity || 0;\n const maxQtyLimitReachedMessage = this._getInventoryValueMessage(productInventoryInformation, curQuantity);\n\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: maxQtyLimitReachedMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else if (result.substatus === 'QUANTITYLIMITS' && validateQuantity) {\n const maxQtyLimitReachedMessage = result.errorDetails?.LocalizedMessage!;\n\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: maxQtyLimitReachedMessage || addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else if (result.substatus === 'INVOICEINCART') {\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: result.errorDetails?.LocalizedMessage || invoiceInCartErrorMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else {\n this.props.telemetry.debug('[wishlist-items] Unable to Update Cart Line from the wishlist');\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n }\n })\n .catch(error => {\n telemetry.warning(error);\n telemetry.debug('[wishlist-items] Error trying to Update Cart Line from the wishlist');\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n });\n }\n }\n };\n\n private isQuantityValidationRequired = (): boolean => {\n const isChannelQuantityLimitsFeatureEnabledInHq =\n this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\n )?.IsEnabled || false;\n\n const isOrderQuantityLimitsFeatureEnabled = this.isOrderQuantityLimitsFeatureEnabled();\n return isOrderQuantityLimitsFeatureEnabled || isChannelQuantityLimitsFeatureEnabledInHq;\n };\n\n private respectQuantityLimits = (): boolean => {\n const isOrderQuantityLimitsFeatureEnabled = this.isOrderQuantityLimitsFeatureEnabled();\n const validateLimitsPerLine = this.props.data.cartConfiguration?.result?.ValidateDefaultOrderSettingsPerLine ?? false;\n return isOrderQuantityLimitsFeatureEnabled && validateLimitsPerLine;\n };\n\n private isOrderQuantityLimitsFeatureEnabled = (): boolean => {\n const isOrderQuantityLimitsFeatureEnabledInHq =\n this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n )?.IsEnabled || false;\n\n if (!isOrderQuantityLimitsFeatureEnabledInHq) {\n return false;\n }\n\n const useSiteBuilderSettings = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'RevertToSiteBuilderOrderQuantityLimitsSettings'\n )?.IsEnabled;\n\n if (useSiteBuilderSettings) {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n\n const customerInfo = this.props.data.customerInformation.result;\n\n const isOrderQuantityLimitsFeatureEnabledInSiteSettings =\n defaultOrderQuantityLimitsFeatureConfig === 'all' ||\n ((customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))) ??\n false);\n\n return isOrderQuantityLimitsFeatureEnabledInSiteSettings;\n } else {\n const cartConfiguration = this.props.data.cartConfiguration?.result;\n return !(cartConfiguration?.IgnoreOrderSettings ?? false);\n }\n };\n\n private readonly _removeItemFromWishlist = (productId: number): void => {\n const { context, data, telemetry } = this.props;\n const { wishlists } = data;\n let noLongerLineExist: CommerceListLine[] | undefined = [];\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n const wishlistLineId = this._getWishlistLineIdFromProductId(productId);\n if (userToken && wishlists.result && wishlists.result[0] && wishlistLineId) {\n removeLinesAsync({ callerContext: context.actionContext }, wishlists.result[0].Id, [{ LineId: wishlistLineId }])\n .then(commerceList => {\n const castCommerceList: CommerceList | null = commerceList as CommerceList | null;\n\n if (castCommerceList && castCommerceList.Id && context.request.user.isAuthenticated) {\n noLongerLineExist = this._getProductsNoLongerExists(castCommerceList);\n if (noLongerLineExist && noLongerLineExist.length > 0) {\n this._removeNoLongerExistsLines(noLongerLineExist);\n } else {\n context.actionContext.update(createGetByCustomerInput({}, null), [castCommerceList]);\n getItemsInWishlists(new ActiveWishlistInput(), context.actionContext)\n .then(products => {\n const castSimpleProducts: FullProduct[] | null = products as FullProduct[] | null;\n if (castSimpleProducts && castSimpleProducts.length > 0) {\n this.setState({ isError: false });\n context.actionContext.update(new ActiveWishlistInput(), castSimpleProducts);\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable to hyderate the wishlist with product information');\n telemetry.error(error);\n });\n }\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable remove items from the wishlist');\n telemetry.error(error);\n });\n } else {\n telemetry.warning(\"[wishlist-items] Unable remove items from the wishlist user token or lineItemID wasn't found\");\n }\n }\n };\n\n private _getInventoryValueMessage(product: IProductInventoryInformation | undefined, curQuantity: number): string {\n const { context, resources } = this.props;\n const { maxQuantityLimitText } = resources;\n\n const maxQuantityForLineItem = updateMaxQuantityForCartLineItem(context.app.config.maxQuantityForCartLineItem);\n\n if (!product || !product.ProductAvailableQuantity.AvailableQuantity || !context.app.config.enableStockCheck) {\n return maxQuantityLimitText\n .replace('{maxQuantity}', maxQuantityForLineItem.toString())\n .replace('{curQuantity}', curQuantity.toString());\n }\n\n const minInventory = Math.min(maxQuantityForLineItem, product.ProductAvailableQuantity.AvailableQuantity);\n\n return maxQuantityLimitText.replace('{maxQuantity}', minInventory.toString()).replace('{curQuantity}', curQuantity.toString());\n }\n\n private _getProductInventory(\n product: FullProduct,\n productInventoryCollection: IProductInventoryInformation[] | undefined\n ): IProductInventoryInformation | undefined {\n if (productInventoryCollection && productInventoryCollection.length > 0) {\n for (const productResult of productInventoryCollection) {\n if (product.ProductDetails.RecordId === productResult.ProductAvailableQuantity.ProductId) {\n return productResult;\n }\n }\n }\n return undefined;\n }\n\n private readonly _inventoryLabel = (product: FullProduct): string | undefined => {\n const { productAvailability } = this.props.data;\n if (productAvailability && productAvailability.result) {\n const productInventoryInformation = this._getProductInventory(product, productAvailability.result);\n if (productInventoryInformation) {\n return productInventoryInformation.StockLevelLabel;\n }\n }\n\n return undefined;\n };\n\n private readonly _inventoryClassName = (product: FullProduct): string | undefined => {\n const { productAvailability } = this.props.data;\n if (productAvailability && productAvailability.result) {\n const productInventoryInformation = this._getProductInventory(product, productAvailability.result);\n if (productInventoryInformation && productInventoryInformation.StockLevelCode) {\n return `ms-wishlist-items__${productInventoryInformation.StockLevelCode.toLowerCase()}`;\n }\n }\n\n return undefined;\n };\n\n private readonly _isProductInStock = (product: FullProduct): boolean => {\n const { data, context } = this.props;\n const { productAvailability } = data;\n\n if (!context.app.config.enableStockCheck) {\n return true;\n }\n\n if (!productAvailability.result || !product.ProductDetails) {\n return false;\n }\n\n for (const productResult of productAvailability.result) {\n if (\n productResult.ProductAvailableQuantity &&\n productResult.ProductAvailableQuantity.ProductId &&\n productResult.ProductAvailableQuantity.ProductId === product.ProductDetails.RecordId\n ) {\n return productResult.IsProductAvailable;\n }\n }\n\n return false;\n };\n\n private readonly _getWishlistLineIdFromProductId = (productId: number): number | null => {\n const { wishlists } = this.props.data;\n\n if (\n !wishlists.result ||\n wishlists.result.length === 0 ||\n !wishlists.result[0].CommerceListLines ||\n wishlists.result[0].CommerceListLines.length === 0\n ) {\n this.props.telemetry.error('Wishlist content is empty, module wont render.');\n return null;\n }\n\n const foundWishlistItem = wishlists.result[0].CommerceListLines.filter(commerceListLine => {\n return commerceListLine.ProductId === productId;\n });\n\n if (foundWishlistItem && foundWishlistItem[0].LineId) {\n return foundWishlistItem[0].LineId;\n }\n return null;\n };\n\n private readonly _getProductsNoLongerExists = (castCommerceList: CommerceList): CommerceListLine[] | undefined => {\n const noLongerExist: CommerceListLine[] | undefined = [];\n castCommerceList.CommerceListLines?.map(line => {\n const { products } = this.props.data;\n const productsList = products && (products as AsyncResult<FullProduct[]>).result!;\n\n const skipRemove = productsList.filter(product => product.ProductDetails.RecordId === line.ProductId);\n if (skipRemove.length === 0) {\n noLongerExist?.push({ LineId: line.LineId });\n }\n });\n return noLongerExist;\n };\n\n private readonly _removeNoLongerExistsLines = (noLongerLineExist: CommerceListLine[]) => {\n const { context, data, telemetry } = this.props;\n const { wishlists } = data;\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && wishlists.result && wishlists.result[0]) {\n removeLinesAsync({ callerContext: context.actionContext }, wishlists.result[0].Id, noLongerLineExist)\n .then(commerceList => {\n const castCommerceList: CommerceList | null = commerceList as CommerceList | null;\n if (castCommerceList && castCommerceList.Id && context.request.user.isAuthenticated) {\n context.actionContext.update(createGetByCustomerInput({}, null), [castCommerceList]);\n getItemsInWishlists(new ActiveWishlistInput(), context.actionContext)\n .then(products => {\n const castSimpleProducts: FullProduct[] | null = products as FullProduct[] | null;\n if (castSimpleProducts && castSimpleProducts.length > 0) {\n this.setState({ isError: true });\n context.actionContext.update(new ActiveWishlistInput(), castSimpleProducts);\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable to hyderate the wishlist with product information');\n telemetry.error(error);\n });\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable remove items from the wishlist');\n telemetry.error(error);\n });\n } else {\n telemetry.warning(\"[wishlist-items] Unable remove items from the wishlist user token or lineItemID wasn't found\");\n }\n }\n };\n}\n\nexport default WishlistItems;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n ITelemetryContent,\n Module,\n Node\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IWishlistItemViewProps } from '../..';\nimport { IWishlistItemsViewProps } from './wishlist-items';\n\nconst WishlistItemsView: React.FC<IWishlistItemsViewProps> = props => {\n const {\n WishlistItems,\n status,\n statusMessage,\n heading,\n Products,\n products,\n Product,\n ProductDetails,\n ProductDimensions,\n telemetryContent,\n statusNotExistsMessage\n } = props;\n\n return (\n <Module {...WishlistItems}>\n {heading}\n {statusNotExistsMessage}\n {status !== 'SUCCESS' && statusMessage}\n {Products && products && products.length > 0 && (\n <Node {...Products}>\n {products &&\n products.map(product => {\n return product && _renderItem(product, Product, ProductDimensions, ProductDetails, telemetryContent);\n })}\n </Node>\n )}\n </Module>\n );\n};\n\nconst _renderItem = (\n product: IWishlistItemViewProps,\n Product?: INodeProps,\n ProductDimensions?: INodeProps,\n ProductDetails?: INodeProps,\n telemetryContent?: ITelemetryContent\n): JSX.Element | null => {\n const {\n key,\n productImage,\n productLink,\n productPrice,\n productDimensions,\n addToCartButton,\n removeButton,\n productStatusMessage,\n entireProductLink,\n productName,\n productAriaLabel,\n inventoryInformation,\n productUnitOfMeasure\n } = product;\n const payLoad = getPayloadObject('click', telemetryContent!, '', key);\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n if (entireProductLink) {\n return (\n <Node key={key} className={Product!.className} {...Product}>\n <Node\n href={entireProductLink}\n className={classnames('entire-product-link ', ProductDetails!.className)}\n {...productAttributes}\n aria-label={productAriaLabel}\n tag={ProductDetails!.tag}\n >\n {productImage}\n {productName}\n {productDimensions && ProductDimensions && (\n <Node {...ProductDimensions}>\n {productDimensions.map(dimension => {\n return dimension;\n })}\n </Node>\n )}\n {productPrice}\n {productUnitOfMeasure}\n </Node>\n {inventoryInformation}\n {addToCartButton}\n {removeButton}\n {productStatusMessage}\n </Node>\n );\n }\n return (\n <Node key={key} className={Product!.className} {...Product}>\n {productImage}\n {productLink}\n {productDimensions && ProductDimensions && (\n <Node {...ProductDimensions}>\n {productDimensions.map(dimension => {\n return dimension;\n })}\n </Node>\n )}\n {productPrice}\n {addToCartButton}\n {removeButton}\n {productStatusMessage}\n </Node>\n );\n};\n\nexport default WishlistItemsView;\n"],"names":["Link","_ref","text","className","href","ariaLabel","React","ProductSearchResultItems","products","context","imageSettings","resources","moduleType","moduleId","productComparisonButton","map","product","index","key","ProductComponent","freePriceText","priceFree","originalPriceText","currentPriceText","ratingAriaLabel","id","typeName","data","Title","Separator","separator","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","ProductRefinerSource","findMatchingRefinementCriterion","productRefinerValue","refinementCriteria","find","refinementCriterion","isMatchingRefinementCriterion","RefinerRecordId","RefinerSourceValue","DataTypeValue","Range","LeftValueBoundString","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","forEach","selectedCriterion","isSelecting","next","_objectSpread","undefined","rangeStart","RightValueBoundString","rangeEnd","push","List","Boolean","parentProductRefinerHierarchy","RefinerTypeValue","Single","Values","child","matchingIndex","findIndex","criterion","splice","formatPrice","amount","currency","locale","telemetry","trace","priceAmount","Number","result","Intl","NumberFormat","style","currencyDisplay","minimumFractionDigits","format","e","warning","RangeRefineItem","constructor","props","super","_formattedPriceReverseLookup","Map","this","_onRangeUpdate","bind","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","state","isChecked","validationErrorMin","validationErrorMax","selectedMin","selectedMax","touchedMin","touchedMax","UnitText","render","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","error","isDisabled","formAttrs","rangeNameFormat","replace","KeyName","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","Object","assign","minLabel","onChange","onFocus","onBlur","value","ref","maxLabel","placeholder","placeholderTextMax","min","max","sliderId","RecordId","ariaAttributes","minPrice","_formatPrice","maxPrice","selectedMinPrice","selectedMaxPrice","Slider","inForm","step","orientation","labels","labelId","labelString","labelPositioning","showLabels","showTooltip","sliderThumbs","minValueSliderThumbAriaLabel","currencyCode","ariaValueText","maxValueSliderThumbAriaLabel","onChangeEnd","debounce","handleTooltipText","event","_changeValue","inputType","selectedKey","touchedKey","setState","_getInputWithoutFormatting","currentTarget","selectedMinValue","minTouched","onToggle","maxNum","isNaN","validationErrorNaN","_focus","_validateRange","selectedMaxValue","maxTouched","minNum","setTimeout","current","focus","selected","touched","validationError","validationErrorRange","has","set","input","inputAsNum","get","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","element","document","getElementById","tooltip","__decorate","computed","observer","RefineItem","_onClick","preventDefault","anchorType","_this$props","children","attrs","_objectWithoutProperties","_excluded","JSON","stringify","isSingleSelect","itemTypeClassName","role","SourceValue","Rating","LeftValueBoundLocalizedString","_getRefinerUrl","onClick","RatingComponent","avgRating","parseInt","ratingCount","hideCount","readOnly","moduleTypeName","Count","_this$props$parentPro","_this$props$parentPro2","dimensionType","toLocaleLowerCase","shouldDisplayAsSwatch","_getShouldDisplayAsSwatch","classnames","hasColor","StringExtensions","isNullOrWhitespace","SwatchColorHexCode","hasImage","SwatchImageUrl","hasContentSwatch","tabIndex","_renderSwatch","_productRefinerValue$","swatchItems","itemId","colorHexCode","imageUrl","SwatchComponent","apiSettings","request","list","isSelectionEnabled","isRefineItem","checkIfShouldDisplayAsSwatch","urlBuilder","ChoiceSummary","closeButtonGlyph","stopPropagation","target","clearAll","getAttribute","indexOf","selectedRefiner","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","selectedChoices","_getKeyForRefinerValue","toString","clearAllText","label","classNames","choiceAriaLabel","closeAriaLabel","items","selectedRefinersMap","length","item","listItemProps","choiceFormat","choiceRangeValueFormat","refinerHierarchy","refinerValues","overallFormat","rangeFormat","refinerValueName","refinerName","parent","hierarchy","RangeInput","filterValue","refiner","_get","ModalToggle","innerRef","modalNode","Modal","autoFocus","applicationNode","returnFocusRef","returnRef","isOpen","toggle","onModalToggle","zIndex","modalHeaderNode","ModalHeader","modalTitle","modalFooterNode","ModalFooter","Button","modalCloseButtonText","RefineSubmenu","_onToggleItem","_onToggleSubmenu","isExpanded","isExpandedOnInitialLoad","productRefinerHierarchy","expanded","Collapse","timeout","_renderChildItems","_renderRange","_renderSingleMultiSelect","selectedRefinerValues","listItems","tempRangeTypeTODO","onUpdateRefiners","prevState","ErrorMessage","SearchResultContainer","SearchResultContainer_1","sortByDropdownOptions","sortOptions","sortByOptionRelevanceDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionRatingDesc","_pageType","urlTokens","pageType","_isMounted","catalogId","getCatalogId","_getProductsDimensionsAvailabilities","async","_this$props$data$list","_this$props$data$list2","productsList","listPageState","activeProducts","productsDimensionAvailabilities","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","DimensionSwatchDisplayTypes","productCard","actionContext","ArrayExtensions","hasElements","_getSearchResultModal","modal","modalHeader","modalFooter","modalBody","ModalBody","SearchResultModal","modalIsOpen","_modalToggleRef","_toggleModal","_getCollectionTitle","collectionTitle","_this$props$context$r","query","q","category","getFriendlyName","NameTranslations","Name","title","productCountNumber","productCountText","totalProductCount","count","numberOfProducts","oneProduct","TitleContainer","titlePrefix","searchTextPrefix","titleText","titleCount","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","tag","categoryHierarchyList","categoryLinkAriaLabel","Url","categoryHierarchySeparator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","SortingContainer","sortByDropDown","LabeledDropdown","labelClassname","labelText","sortByDropdownLabel","dropdownId","dropdownClassname","toggleColor","dropdownOptions","selectedOption","onSelectOption","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","config","fullUrl","getCurrentUrl","itemsPerPage","skipCount","currentPageNumber","skip","totalItems","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","paginationAriaLabel","url","qsp","startingItem","previousAriaLabel","nextAriaLabel","_getRefineMenu","inputRange","validRefiners","refiners","filter","activeRefiners","activeFilters","RefineMenuContainer","RefinerSectionContainer","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","_getInventoryRefiner","channelInventoryConfiguration","app","productListInventoryDisplay","ProductListInventoryFilteringOptions","HideOOS","baseCollectionInput","BaseCollectionInput","inventoryInStockRefinerValueInput","InventoryInStockRefinerValueInput","InventoryProductAttributeRecordId","getInventoryRefinerAction","Promise","resolve","_getChoiceSummary","_this$props$data$refi","selectedRefiners","rating","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","notification","requestContext","window","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","transaction","sortingCritera","Columns","option","searchConfiguration","mappedConfiguration","sortColumn","sortCriteria","activeSortColumn","parseQueryParam","activeMappedConfig","mappedSearchConfig","ColumnName","IsDescending","dropdownOption","newRefinementCriteria","dropdownElementId","dropdownElement","selectedChoice","isClearAll","_viewport","device","Type","_updateViewport","pending","validationErrorNotNumber","validationErrorNotRange","then","querySorting","sorting","parse","decodeURIComponent","pageSize","reaction","_this$props$context$r2","_this$props$context$r3","_this$props$context$r4","GetFullProductsByCollectionInput","Paging","Top","Skip","Math","Sorting","recordId","ProductId","productId","Recommendation","recommendation","includeAttributes","updateRefinerPanel","getCollectionProducts","productResults","nameTranslations","_nameTranslation","nameTranslation","Language","toLowerCase","Text","_this$props$context$r5","_this$props$context$r6","_this$props$context$r7","_this$props2","MsDyn365","isBrowser","addEventListener","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","includes","DimensionTypes","none","StoreOperationsDataActions","callerContext","inventoryRefiner","componentWillUnmount","removeEventListener","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","slots","productsComponent","searchResultContainerViewProps","TitleViewProps","refineMenu","moduleProps","sortByOptions","pagination","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","searchResultModal","isMobile","errorMessage","renderView","_getViewport","innerWidth","gridSettings","xs","w","sm","md","lg","observable","createSearchResultModal","modalProps","createModalBody","renderSort","renderRefiner","Node","submenu","renderCategoryHierarchy","renderTitle","renderTitleCount","Module","innerText","trim","dimensionLabel","getLineItems","_getLineItemComponent","cartLine","_product","quantityDisplayString","productDimensionTypeColor","productDimensionTypeSize","productDimensionTypeStyle","configString","inputQuantityAriaLabel","discountStringText","CartLineItemComponent","sizeString","colorString","styleString","shippingChargesText","isQuantityEditable","productUrl","getProductUrlSync","primaryImageUrl","PrimaryImageUrl","_getLineItemsComponents","LineId","LineItem","_getLineItemsByDeliveryType","type","cart","pickupDeliveryModeCode","CartLines","DeliveryMode","_filterItemsByDiliveryType","_getGroupTitleComponent","itemLabel","itemsLabel","inStorePickUpLabel","shippingCountCheckoutLineItem","suffix","reduce","Quantity","_countItems","LineItemDeliveryGroup","LineItemList","heading","lineItems","_getLineItems","lineItemsHeading","editCartText","LineItems","Header","Heading","editLink","color","getUrlSync","itemsForPickup","itemsForShip","priceValue","priceObjectArray","getFormattedSelectedMinValue","selectedPriceObject","x","previousPriceObject","getFormattedSelectedMaxValue","toggleAllRefiners","refinerId","floor","ceil","minPr","maxPr","minPrices","maxPrices","i","obj","disabled","flag","val","lastRange","minPricesObject","maxPricesObject","leftValueString","rightValueString","SearchResultContainerView","componentDidMount","hideRatingFromSortDropdown","componentDidUpdate","sort","options","display","mobileView","setRating","renderSubmenu","subMenu","activeRefiner","refinersData","requestUrl","content","OrderConfirmationView","OrderConfirmationPayment","paymentMethodsProps","orderHydration","cardType","salesOrder","TenderLines","CardTypeId","cardIconClass","renderOrderDeliveryPlan","orderPlan","orderConfirmationNumberLabel","orderTotalLabel","cultureFormatter","salesLines","_shippingAddress","salesLine","ShippingAddress","_total","TotalAmount","toFixed","_name","_address","FullAddress","orderTotal","formatCurrency","contactDetails","concat","orderID","ChannelReferenceId","renderHomePageLink","backToHomePageLabel","routes","home","destinationUrl","renderLinks","returnPolicyLink","linkText","linkUrl","renderContactDetails","contactDetailsLabel","renderHeading","thankYouNote","OrderConfirmationOrderInfomation","_ref2","orderInformationProps","emailText","receiptEmailID","ReceiptEmail","OrderConfirmationSalesLine","_ref3","salesLineProps","OrderConfirmationGroup","_ref4","groupProps","salesLinesProps","OrderConfirmationGroups","_ref5","groupsProps","groups","group","PaymentDetails","priceTotalLabel","deliveryTotalLabel","totalLabel","paymentDetailsLabel","totalExlDelivery","SubtotalAmount","deliveryCharges","ChargeAmount","totalCharges","GrossAmount","OrderConfirmationHelp","_ref6","helpProps","needHelpLabel","helpLineNumberLabel","contactNumber","orderInfomation","orderSummary","payment","help","orderDetailsLabel","lineItemsUpdated","BulkPurchase","_errorCssClass","_errorCssGlyphClass","collapseRef","_dimensionDropDownChange","_this$collapseRef$cur","reEvaluateHeight","_onErrorMessage","stateMessage","messageText","statusCssString","messageGlyph","_toggleCollapse","_this$props$data$prod","hasDimensionsInProps","productDimensions","hasDimensionsInData","viewProps","container","_renderCollapseContent","_renderCollapseButton","_renderCollapse","bulkPurchaseHeaderTitle","_renderMainContent","isMobileDevice","variant","VariantType","Viewport","userMessageNode","Alert","RichTextComponent","bulkPurchaseDescriptionText","_renderMatrix","_featureState$result","_this$props$data$orde","_this$props$data$cust","featureState","isMultipleCatalogsFeatureEnabled","IsEnabled","validateCatalogId","ProductDimensionsMatrix","dimensions","orderTemplates","customerInformation","dimensionOnChange","onErrorMessage","isMultipleCatalogFeatureEnabledInHq","_getClassNamePrefix","getBuyBoxInventoryLabel","productDetails","_props$data$productAv","_props$data$productAv2","productAvailableQuantity","shippingInventory","shipping","deliveryType","inventoryClassName","StockLevelCode","StockLevelLabel","getBuyboxProductTitle","_props$data$product$r","_props$data$product","_product$Name","titleHeadingTag","headingTag","getBuyboxProductDescription","_props$data$product$r2","_props$data$product2","Description","getBuyboxProductUnitOfMeasure","_props$data$product$r3","_props$data$product3","unitOfMeasureDisplayType","DefaultUnitOfMeasure","telemetryContent","onAddToCartFailed","callbacks","defaultMinimumKeyInPrice","defaultMaximumKeyInPrice","productAvailability","quantityErrorForState","customAmountErrorForState","otherErrorForState","getGenericError","failureReason","getQuantityError","stockLeft","cartActionResult","substatus","keyInPriceAmount","minimumKeyInPrice","formatedAmountLimit","invalidSmallCustomAmountText","maximumKeyInPrice","invalidLargeCustomAmountText","updateErrorState","errorHost","quantityError","configureErrors","getConfigureErrors","missingDimensions","IsGiftCard","customAmountError","otherError","onItemAddedToCart","changeModalOpen","getBuyboxAddToCart","hasAvailableProducts","_props$data$product$r4","_props$data$product4","_props$data$cart$resu","_props$data$cart","_props$data$productAv3","_props$data$productAv4","_props$data$deliveryO","_props$context$action","_props$data$deliveryO2","quantity","errorState","selectedProduct","isUpdatingDimension","isUpdatingDeliveryOptions","isServiceItem","ProductAvailableQuantity","dialogStrings","goToCartText","buyBoxGoToCartText","continueShoppingText","buyBoxContinueShoppingText","closeNotificationLabel","headerItemOneText","buyBoxSingleItemText","headerItemFormatText","buyBoxMultiLineItemFormatText","headerMessageText","buyBoxHeaderMessageText","addedQuantityText","isProductQuantityLoading","status","changeUpdatingDimension","isLoadingDeliveryOptions","deliveryOptions","changeUpdatingDeliveryOptions","getTelemetryObject","telemetryPageName","emailDeliveryModeCode","channel","EmailDeliveryModeCode","productDeliveryOptions","isEmailDelivery","DeliveryOptions","Code","ContainerProps","button","AddToCartComponent","addToCartText","outOfStockText","navigationUrl","price","productPrice","onError","getSelectedProduct","viewports","h","xl","lazyload","isAddServiceItemToCart","isPriceKeyedIn","customPriceAmount","isCustomPriceSelected","isOrderQuantityLimitsFeatureEnabled","_isOrderQuantityLimitsFeatureEnabled","_isChannelLimitsFeatureEnabled","isAddEmailDeliveryItemToCart","onAdd","isNavigationToCartPageDisabled","errorBlock","BuyboxErrorBlock","showError","getBuyboxProductPrice","_props$data$product5","_props$data$featureSt","_props$data$featureSt2","PriceComponent","isPriceMinMaxEnabled","isSalesAgreementPriceFeatureEnabled","priceResources","priceRangeSeparator","salesAgreementPricePrompt","salesAgreementExpirationDatePrompt","salesAgreementCommittedQuantityPrompt","salesAgreementRemainingQuantityPrompt","getBuyboxProductRating","_props$data$ratingsSu","_props$data$ratingsSu2","ratingsSummary","averageRating","averageRatingAriaLabel","reviewsCount","generateAddToOrderTemplateDialogResources","addToOrderTemplateHeader","noOrderTemplatesMessage","noOrderTemplatesDescription","createAnOrderTemplateButtonText","createNewOrderTemplateButtonText","cancelOrderTemplateCreationButtonText","selectTemplatesText","addToTemplateButtonText","lineItemsText","generateOrderTemplateNameDialogResources","orderTemplateHeaderLabel","createOrderTemplateHeader","orderTemplateTitleLabel","orderTemplateTitle","orderTemplateNameAriaLabel","orderTemplateDescription","createOrderTemplateDescription","defaultOrderTemplateName","orderTemplateButtonLabel","createOrderTemplateButtonText","orderTemplateCancelButtonLabel","cancelNewOrderTemplateCreationButtonText","generateItemAddedToOrderTemplateDialogResources","viewOrderTemplateButtonText","continueShoppingButtonText","itemAddedToOrderTemplateHeaderItemOneText","itemAddedToOrderTemplateHeaderItemFormatText","itemAddedToOrderTemplateHeaderMessageText","generateDuplicateItemsWhenAddingToOrderTemplateDialogResources","duplicatedProductsHeader","duplicatedProductsDescription","updateQuantityButtonText","cancelDuplicateItemsButtonText","onAddToOrderTemplateFailed","getBuyboxProductAddToOrderTemplate","_props$data$product6","AddToOrderTemplateComponent","addToOrderTemplateButtonText","addToOrderTemplateButtonTooltip","addToOrderTemplateDialogResources","createOrderTemplateDialogResources","itemAddedToOrderTemplateDialogResources","duplicateItemsWhenAddingToOrderTemplateDialogResources","shouldShowButtonFailedTooltip","getBuyboxProductComparisonButton","onAddToWishlistFailed","getBuyboxProductAddToWishlist","_props$data$product7","wishlists","AddToWishlistComponent","addToWishlistButtonText","removeFromWishlistButtonText","addToWishlistMessage","removedFromWishlistMessage","addItemToWishlistError","removeItemFromWishlistError","nameOfWishlist","ariaRole","onQuantityChangeHandler","newValue","updateQuantity","getBuyboxProductQuantity","LabelContainerProps","htmlFor","productQuantityHeading","errors","currentCount","getBuyboxShopSimilarButton","buttonType","_props$data$product8","telemetryText","ShopSimiliarButtonType","Looks","TelemetryConstant","ShopSimliarLooks","ShopSimliarDescription","payLoad","getPayloadObject","attribute","getTelemetryAttributes","shopSimilarLooksText","shopSimilarDescriptionText","shopSimiliarButtonType","searchURL","location","onPriceChangeHandler","updateKeyInPrice","parseFloat","getBuyboxKeyInPrice","buyboxKeyInPriceLabelHeading","errorMessages","values","message","assertive","buyboxErrorMessageHeader","getQuantityLimitsMessages","_renderMaxLabel","maxQuantityText","_renderMinLabel","minQuantityText","RetailDefaultOrderQuantityLimitsFeatureName","EcommerceQuantityLimitConfigurationsFeatureName","RevertToSiteBuilderOrderQuantityLimitsSettingsCRTFeatureName","MAX_VALUE","informationIconText","_featureStatuses$find","_featureStatuses$find2","featureStatuses","_props$context","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","customerInfo","IsB2b","_props$data$cartConfi","_cartConfiguration$Ig","cartConfiguration","IgnoreOrderSettings","_featureStatuses$find3","isChannelLimitsFeatureEnabledInHq","getBuyboxProductConfigure","selectedDimensions","_props$data$productDi","_props$data$productDi2","getDropdownName","productDimensionsData","enableStockCheck","hasProductDimensions","onChanged","_onChanged","dimensionSelectedAsync","onInitializedDimension","_onInitializedDimension","initializeDimension","inventoryLevel","dimensionsInfo","productDimensionFull","_productDimensionFull","dropdownName","DimensionTypeValue","dropdownList","dimensionValuesWithInventory","DimensionValues","_value$DimensionValue","_value$DimensionValue2","ObjectExtensions","isNullOrUndefined","DimensionValue","_dimensionValuesWithI","_dimensionValue$Value","dimensionValue","inventoryLevelCode","getInventoryLevelCodeFromDimensionValue","Value","ColorHexCode","ImageUrl","InventoryLevelValues","outOfStock","swatchItemAriaLabel","matchedDimensions","getDimensionValuesFromQuery","dimensionInfo","currentDimensionsFromQuery","dimensionFromQuery","currentDimensionFromQuery","selectedDimensionItem","dimensionItem","_currentDimensionFrom","isDefault","dropdowns","dimensionId","dropdownToggleName","selectDimensionFormatString","dimensionSelectionType","SelectionType","dropdown","convertProductDimensionTypeToDimensionTypes","dimensionsAsSwatchConfiguration","swatch","select","Dropdown","dropdownCallback","onInitialize","initializeCallback","selectionType","mapProductDimensionFullToDropdownViewProps","dimensionChanged","selectId","initializedDimension","selectMenu","_selectSwatch","selectedIndex","selectedValue","selectedItem","_renderDropdown","hidden","onSelectItem","errorMessageOutOfStock","errorMessageOutOfRangeOneLeft","errorMessageOutOfRangeFormat","addedToCartFailureMessage","_result$cartActionRes2","_result$cartActionRes","elementFoundAt","productIdToFind","FulfillmentStoreId","OrgUnitNumber","getElementIndex","currentQuantity","_cartLineToUpdate$Qua","quantityLimit","maxQuantityForCartLineItem","availableQty","AvailableQuantity","getQuantityLimit","maxQuantityLimitText","validationResults","_item$ErrorContext","isNullOrEmpty","LocalizedMessage","ErrorContext","ErrorResourceId","errorDetails","isGiftCard","dimension","getDimensionErrorString","dimensionTypeValue","productDimensionTypeColorErrorMessage","productDimensionTypeConfigurationErrorMessage","productDimensionTypeSizeErrorMessage","productDimensionTypeAmountErrorMessage","productDimensionTypeStyleErrorMessage","modalCloseButtonReference","onClickFindInStoreHandler","_props$data","storeSelectorStateManager","modules","dataProduct","multiplePickupStoreSwitchName","retailMulitplePickupMFeatureState","Dimensions","storeSelectorId","keys","storeSelector","openDialog","parentElementRef","onLocationSelected","orgUnitLocation","deliveryMode","behavior","addToCartBehavior","addProductToCart","pickup","failureResult","AddToCartBehavior","goToCart","showModal","showNotification","_props$data$productPr2","defaultImageSettings","friendlyName","ItemSuccessfullyAddedToCartNotification","NotificationsManager","instance","addNotification","catch","exception","debug","findInStoreOnClick","getBuyboxFindInStore","_data$product","_data$productPrice","_data$cart","_data$deliveryOptions","_data$productAvailabl","_data$featureState","_data$channelDelivery","_product$Dimensions","_props$data$productPr","findInStoreHeaderText","descriptionTextToShowAllPickupOptions","PickupDeliveryModeCode","channelDeliveryOptionConfig","_dimension$DimensionV","modalOpen","isSectionDisabled","buttonText","description","isStockCheck","buyboxResources","isLoading","pickupInventory","findInStoreLinkText","findInStoreDescriptionText","isAggregatedInventory","_pickupInventory","IsProductAvailable","findInStoreNotAvailableTextButton","findInStoreNotAvailableDescription","getFindInStoreInventorySettings","matchDeliveryOptions","productdeliveryOptions","storePickUpOptionList","deliveryOption","delivery","deliveryCode","PickupDeliveryModeCodes","priceComponent","popupProps","productQuantity","setModalOpen","renderModalPopup","Popup","openFindInStoreDialog","productPickupOptionList","Buybox","dimensionUpdateQueue","FinitePromiseQueue","initializedDimensions","Set","buyboxCallbacks","newQuantity","newErrorState","updateSelectedProduct","newSelectedProduct","newInventory","newPrice","newDeliveryOptions","_updatePrice","add","selectedDimensionId","selectedDimensionValueId","size","enqueue","_updateDimensions","FinitePromiseQueueError","ProcessWasDiscardedFromTheQueue","_getDropdownName","isModalOpen","customPrice","_onBulkPurchaseLinkClick","bulkPurchaseModule","boundingRect","getBoundingClientRect","scrollX","left","pageXOffset","scrollY","top","pageYOffset","scrollTo","_isChannelMultipleCatalogsFeatureEnabled","_this$props$data$feat","feature","dimensionsToUpdate","clearErrorState","previousState","_getProductVariant","productVariant","productVariantPromise","promises","_getDimensionsForSelectedVariant","mappedDimensions","_hydrateInventoryInfo","_hydratePrice","_hydrateDeliveryOptions","_updateQuantitiesInState","all","_this$props$data$prod2","productDimensionTypeConfiguration","productDimensionTypeAmount","isPriceApiCalled","ItemTypeValue","ReleasedProductType","Service","maxRecentlyViewedItemsCount","RecentlyViewedState","_this$props$data$prod3","_this$props$data$feat2","_this$props$data$feat3","_this$props$data$cart","_this$props$data$cart2","mediaGallery","flatten","validValues","applyDefaultOrderSettings","ValidateDefaultOrderSettingsPerLine","some","ModuleProps","ProductInfoContainerProps","MediaGalleryContainerProps","bulkPurchaseLink","_renderBuyboxBulkPurchaseLink","unitOfMeasure","configure","findInStore","addToCart","addToOrderTemplate","addToWishlist","hideRating","inventoryLabel","shopSimilarLook","enableShopSimilarLooks","shopSimilarDescription","enableShopSimilarDescription","keyInPrice","enableKeyInPrice","quantityLimitsMessages","isChannelMultipleCatalogsFeatureEnabled","currentCatalogId","catalogs","_validateCatalogDetails","isBulkPurchaseEnabled","msdyn365Commerce","bulkPurchaseModules","Array","from","getElementsByClassName","bulkPurchaseLinkText","arguments","CustomerContextualPrice","channelId","_dimension$dimensionV","_dimensions$find$Dime","_dimensions$find","ExtensionProperties","setDimensionValuesToQuery","selectedProductPromise","getSelectedVariant","SelectedVariantInput","MasterProductId","getDimensionsForSelectedVariant","GetDimensionsForSelectedVariantInput","_productVariant$Dimen","newAvailableQuantity","getProductAvailabilitiesForSelectedVariant","ProductAvailabilitiesForSelectedVariantInput","newShippingQuantity","getPriceForSelectedVariant","PriceForSelectedVariantInput","_this$props$data$feat4","retailMultiplePickupFeatureState","getDeliveryOptionsForSelectedVariant","GetDeliveryOptionsForSelectedVariantInput","isChannelLimitsFeatureEnabled","_getMinQuantityForCartLineItem","_getMaxQuantityForCartLineItem","_getQuantity","_product$Behavior","Behavior","MinimumQuantity","isQuantityLimitsFeatureEnabled","_product$Behavior2","MaximumQuantity","updateMaxQuantityForCartLineItem","_cartConfiguration$re","_cartConfiguration$re2","_product$Behavior3","defaultQuantity","DefaultQuantity","_this$props$context","information","_this$props$data$cata","_renderAddToCart","_renderAddToOrderTemplate","_renderAddToWishlist","_renderConfigure","_renderConfigureDropdown","_renderSocialShare","socialShare","_renderFindInStore","_renderQuantity","_renderKeyInPrice","_renderShopSimilarItem","shopSimilarItem","getAltText","shouldUseCmsAltText","productName","imageAltText","_context$app","OmniChannelMedia","getValidProductImages","actionInput","MediaLocationsForSelectedVariantInput","getMediaLocationsForSelectedVariant","mediaLocations","mediaLocation","imageData","src","Uri","altText","AltText","http","XMLHttpRequest","open","send","_unused","validateMediaLocaionAsync","pairs","pair","Quickview","quickViewCallbacks","_this$productDetails","_hideQuickViewDialog","defaultGalleryImageSettings","cropFocalRegion","defaultThumbnailImageSettings","_renderSeeDetailButton","seeDetails","attributes","onTelemetryClick","seeDetailsLinkText","_getProductURL","_renderCarousel","_this$state$activeInd","mediaGalleryItems","galleryImageSettings","_renderCarouselItemImageView","_renderEmptyImage","Carousel","activeIndex","previous","interval","directionTextPrev","previousScreenshotFlipperText","directionTextNext","nextScreenshotFlipperText","indicatorAriaText","ariaLabelForSlide","onIndicatorsClickHandler","goToIndex","handleOnExited","onExited","handleOnExiting","onExiting","_renderThumbnails","thumbnailImageSettings","_getThumbnailItem","ThumbnailsContainerProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","flipperPrevLabel","flipperNextLabel","parentId","useTabList","_updateDimensionValue","newProduct","variantProduct","_variantProduct$Dimen","images","getImagesForProduct","_filterMasterImageFromVariant","lastUpdate","Date","now","RetailMulitplePickupMFeatureState","altTextSource","newValueId","_this$productDetails2","animating","isLastItem","nextIndex","isFirstItem","_getCarouselItem","image","Image","loadFailureBehavior","modifiedActiveIndex","ThumbnailItemContainerProps","_generateOnThumbnailClick","onKeyDown","_generateOnThumbnailKeyDown","Picture","which","KeyCodes","Enter","Space","onClickHandler","_event","selectedProductId","ctx","tenantId","getRnrPartnerId","serviceEndPoint","getRnrEndpointId","productResult","productAvailabilities","getCartStateData","GetCartStateDataInput","cartState","getRatingsSummary","GetRatingsSummaryInput","ratingsSummaryData","getProductDetails","currentTime","_updateMediaItems","isDataLoaded","_this$props$context$a","_product$productVaria","_this$props$config$th","_product$productVaria2","_actionContext$reques","params","isPreview","response","commerceApiRequest","previewImageData","_mediaLocation$Uri","additionalProperties","IsApplicableForChildEntities","isApplicableForChildEntities","_mediaLocation$Uri2","getProductImages","_quickViewCloseButtonclick","onChangeHandler","IncrementalQuantity","decrementButtonAriaLabel","incrementButtonAriaLabel","shouldComponentUpdate","nextProps","nextState","_this$productDetails3","_this$productDetails4","viewprops","quickView","quickViewButton","quickViewbuttonText","ModalContainer","quickViewAriaLabel","modalTransition","shouldUpdateFocusToFirstElement","ModalHeaderContainer","ModalFooterContainer","ModalHeaderContent","ModalBodyContainer","cartContainerProps","seeDetailsbutton","loading","Spinner","loadingText","SpinnerSize","large","CarouselProps","Thumbnails","lastUpdatedTime","_this$productDetails5","_mapProductToImageData","getProductPageUrlSync","URL","_dimension$DimensionV2","dimensionName","searchParams","_this$props$config$sh","shouldHidePrimaryImages","shouldHideMasterProductImagesForVariant","variantImages","isVariantProduct","ItemId","_item$additionalPrope","_renderQuickViewPopup","_renderBodyContent","QuickViewFunctionalComponent","RecentlyViewedProductItem","getItemId","_len","_key","_recentlyViewedItems","cookieContext","cookies","_retrieveItemsFromCookies","object","slice","_writeToCookie","_recentlyViewedLocalStorageKey","_readFromCookie","cookieKey","isConsentGiven","secure","maxAge","CarouselModule","_handleDismissCarousel","dismissCarousel","_next","closeNow","_previous","_onExiting","_onExited","_goToIndex","newIndex","carouselContainer","closeAnimation","handleDismissCarousel","retrieveItems","renderModuleAttributes","pause","pauseOnHover","ride","autoplay","transitionType","hideFlipper","dismissEnabled","dismissCarouselAriaText","ariaLabelForDismissButton","keyboard","ProductComparisonPreview","_renderGreyPlaceHolders","productData","counts","greyPlaceHoldersCount","displayGreyPlaceHolders","elements","_removeProductFromList","_this$props$data$acco","ProductComparisonState","accountInformation","removeItemById","_previousState$produc","productsData","_handleCollapseClick","_previousState$isExpa","_hasUserInteractedWithComparison","_clearAllProductsFromTheComparison","_this$props$data$acco2","_instanceId","Random","Guid","generateGuid","_displayedInstanceId","_this$props$data$acco3","_loadProducts","listModifiedEvent","subscribe","instanceId","handler","_this$props$data$acco4","unsubscribe","_this$state$productsD","collapseButton","isMainContentReady","hasUserInteractedWithComparison","_getProdutComparisonDataByCatalogId","productsLimit","_getProductsLimit","subheaderText","productComparisonPreviewHeaderTextWithLimit","handleCollapseClick","productsMainInfo","_getProductsMainInfo","previewGreyPlaceHolders","productComparisonLink","clearAllProductsFromTheComparison","removeProductFromList","goToComparisonButton","_renderGoToComparisonButton","clearAllButton","_renderClearAllButton","_productData$filter","_this$props$data$acco5","GetProductsInPreviewProductComparisonInput","getProductsInPreviewProductComparisonAction","productDataByCatalogId","_getGreyPlaceHoldersCount","limit","placeHolder","productImageContainerClassName","tableRowClassName","productImageClassName","productNameClassName","productNameLink","isChannelTypeB2B","removeFromComparisonButton","RemoveFromComparisonButtonComponent","productImage","_renderProductImage","productLink","viewport","Browser","productComparisonMobileProductsLimit","productComparisonDesktopProductsLimit","_product$PrimaryImage","_getFallbackImageUrl","defaultImageSettingQ","fallBackSrc","getFallbackImageUrl","_this$state$isExpande","shouldBeExpanded","headerContainerClassName","mainContainerClassName","collapseClassName","collapseButtonClassName","footerClassName","productComparisonCompareProductsButtonText","productComparisonClearAllProductsButtonText","containerClassName","headerClassName","headerLabelClassName","tableClassName","ProductComparisonPreviewViewFunctionalComponent","_props$isExpanded","_props$productsMainIn","_props$productsMainIn2","productComparisonPreviewHeaderText","info","SpecificationDataTypeValues","ProductSpecification","CurrencyValue","CurrencyCode","_product$DateTimeOffs","isFunction","DateTimeOffsetValue","toUTCString","IntegerValue","FloatValue","TextValue","dangerouslySetInnerHTML","getRichTextHtml","_specification$DataTy","specification","_renderCurrencyCell","dateTime","_renderDateTimeCell","decimal","_renderDecimalCell","integer","_renderIntegerCell","_renderTextCell","boolean","_renderTrueFalseCell","video","BooleanValue","productComparisonProductItemSpecificationTrue","productComparisonProductItemSpecificationFalse","RemoveFromComparisonButtonFunctionalComponent","useCallback","productComparisonRemoveProductFromListAriaLabel","ProductClickerDirections","ProductComparison","_clearAllProductsFromComparison","_configureBoxShadowOnScroll","_this$_tableReference","_tableReference","comparisonProductCardHeader","tableHeaderClassName","documentElement","scrollTop","classList","tableHeaderLockedClassName","remove","_handleScroll","_this$_tableHeaderRef","_tableHeaderReference","scrollLeft","_checkClickersState","_handleScrollClick","direction","_this$_tableBodyRefer","_this$_tableCellRefer","_document$body$parent","tableBody","_tableBodyReference","newLeftPosition","cellWidth","_tableCellReference","clientWidth","_getCellWidth","scrollPosition","minLeftPosition","maxScroll","scrollWidth","body","parentElement","currentClickerPosition","change","hoverStateLastUpdate","hoveringCellItemId","_handlePreviousClick","_document$body$parent2","right","_handleNextClick","_document$body$parent3","_this$_tableBodyRefer2","_this$_tableBodyRefer3","_document$body$parent4","_shouldShowNextClicker","forceUpdate","_shouldShowPreviousClicker","newClickerPosition","_handleHoverIn","_hoveringCellItemId","_handleHoverOut","_debounce","_goBack","backToShoppingUrl","referrer","back","specifications","_product$specificatio","specificationsList","allSpecifications","specificationNames","AttributeValueId","uniqueSpecificationNames","unique","name","productInfo","allDimensions","dimensionIds","actionBarClassName","clearAllProductsFromComparison","isEmptyContent","_renderHeading","_renderLoading","actionBarContainerProps","_getActionBarContainerProps","previousClicker","_renderPreviousClicker","nextClicker","_renderNextClicker","backToShopping","_renderBackToShoppingButton","emptyComparison","emptyComparisonContentSlots","_getProductComparisonDataByCatalogId","productComparisonCountText","productsMainInfoData","allUniqueDimensionIds","getProductsDimensionsIds","updatedDimensionProps","getUpdatedDimensionsProps","tableReference","tableHeaderReference","tableBodyReference","tableCellReference","shouldShowPreviousClicker","shouldShowNextClicker","handlePreviousClick","handleNextClick","handleScroll","handleHoverIn","handleHoverOut","uniqueDimensionIds","_getProductsDimensions","dimensionsProps","uniqueSpecifications","_getProductsSpecifications","specificationsProps","_getSpecificationProps","GetProductsInProductComparisonInput","getProductsInProductComparisonAction","_renderQuickView","_product$productInfo$","quickViewSlot","quickViews","defaultImageSettingsQ","_getTableHeaderProps","isHoverModeEnabled","tableHeaderCellClassName","onMouseEnter","onMouseLeave","_getTableCellProps","cellClassName","tableCellClassName","_renderProductRating","_ratingValue$reviewsC","ratingValue","productComparisonProductItemRatingAriaLabel","shouldShowFullRatingDescription","backToShoppingLabel","_getDimensionName","ProductDimensionType","Color","productComparisonProductItemColorDimension","Size","productComparisonProductItemSizeDimension","Style","productComparisonProductItemStyleDimension","dimensionClassName","dimensionsRowClassName","dimensionDescription","productDimensionValues","productMainInfo","renderSwatch","textValue","productsDimension","_productsDimension$di","_productsDimension$di2","dimensionItems","_dimensionItem$map","currentDimensionId","swatches","swatchItem","_productMainInfo$prod","_swatchItem$Dimension2","_swatchItem$Dimension3","_swatchItem$Dimension4","_swatchItem$Dimension5","_swatchItem$Dimension6","_swatchItem$Dimension7","_swatchItem$Dimension8","_swatchItem$Dimension9","isDefaultDimension","selectedDimension","_swatchItem$Dimension","DimensionId","_dimensionItem$Dimens","_dimensionItem$Dimens2","productDimensionSeperatorValue","productDimensionSeparator","dimensionProps","node","specificationClassName","specificationsRowClassName","specificationValues","_productMainInfo$prod2","productSpecification","productSpecifications","productComparisonTitle","productComparisonLoadingText","productComparisonClearAllButtonAriaLabel","productComparisonClearAllButtonText","tableClickerClassName","onKeyUp","productComparisonPreviousProduct","productComparisonNextProduct","_renderRemoveFromComparisonButton","productRowClassName","productUrlLink","_product$productInfo$2","isFromCurrentCatalog","productPriceClassName","cellNewWidth","width","minWidth","maxWidth","cellContainerProps","productComparisonProductItemFreePrice","productComparisonProductItemOriginalPrice","productComparisonProductItemCurrentPrice","goToProductDetailsButton","productComparisonGoToProductDetailsButtonText","tableCellProps","tableHeaderProps","productRating","productDescription","_renderProductDescription","tableBodyClassName","tableRowContentClassName","tableRowContentInformationClassName","renderDynamicHeaderCells","headerName","tabindex","renderDynamicCells","ProductComparisonViewFunctionalComponent","_props$productsMainIn5","_props$dimensionsProp","_props$specifications","_props$productsMainIn8","_props$productsMainIn9","actionsClassName","onScroll","_props$productsMainIn3","_props$productsMainIn4","productComparisonProductItemRating","_props$productsMainIn6","_props$productsMainIn7","productComparisonProductItemDescription","specificationProps","productComparisonProductItemSku","PromoBannerCloseButton","closeButtonAriaLabel","onClose","PromoBannerClose","PromoBannerLinks","links","onTextChange","editableLinks","_mapEditableLinks","Msdyn365","editProps","linkdata","link","contentAction","etext","editableLink","openInNewTab","PromoBannerText","onEdit","PromoBanner","isVisible","handleTextChange","bannerMessages","handleLinkTextChange","linkIndex","_isLastItem","_isFirstItem","_onDismiss","closeButtonLabel","bannerText","bannerAriaLabel","onDismiss","handleLinks","handleText","promoBannerProps","promoBannerTextProps","promoBannerLinksProps","contentProps","promoBannerText","carouselProps","hideIndicator","closeButton","slides","channelInventoryConfigurationId","choice","clearAllAttributes","isRangeType","FeatureSearchResultItem","_context$request$app","productRecordId","fallbackImage","featureSimilarDescriptionTitle","featureSimilarLooksTitle","img","imageProps","renderProductPlacementImage","getInventoryLabel","AttributeValues","inventoryAttribute","allowBackNavigation","quickviewSlot","allowBack","dimensionAvailabilities","dimensionAvailability","masterProductId","_selectedRefinementCr","_this$props$selectedR","_this$props$selectedR2","_this$props$selectedR3","_this$props$selectedR4","getLabels","getSliderThumbs","sliderKey","_this$props$minValueS","_this$props$maxValueS","String","minValue","maxValue","sliderKeyString","previousProps","updateSliderProps","_this$props$selectedR5","_this$props$selectedR6","_this$props$selectedR7","_this$props$selectedR8","productCountAriaLabel","singleProductCountAriaLabel","refineItemAriaLabel","refineItemsAriaLabel","RefinerType","SingleSelect","_renderRating","productText","productCount","refineMenuItemAriaLabel","_productRefinerValue$2","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","_productRefinerValue$3","refinerRating","ratingRefiner","selectedRating","defaultChkProductCount","ratingComponentClass","productCountAriaLabelValue","isMobileView","refinerValuesList","_getRangeType","DisplayTemplateValue","DisplayTemplate","SliderWithBars","dataTypeValue","AttributeDataType","Currency","Decimal","Integer","TrueFalse","_props$context$reques","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","expandrefinerCount","defaultPageNumber","isListPageStateUpdated","_updateVariantAvailability","_updateListPageState","_this$props$config$it","_this$props$config$it2","hydrateRefinersFromUrl","featureProduct","_getActivePrice","_this$props$data$list3","_this$props$data$list4","getPriceForProductSearchResult","PriceForProductSearchResultInput","_getAllSortByOptions","_renderPrev","_renderNext","_shouldHideFromRefiners","_getexpandRefinerCount","expandRefinersCount","expandedRefiners","_this$props$data$prod4","isInventorySortableAttribute","inventoryAwareSortableAttributeId","ProductAvailabilitySortableAttributeRecordId","isInventoryProductAttribute","_getProducts","_this$props$slots","_this$props$data$prod5","shouldAllowBackNavigation","breadCrumbType","breadcrumbType","shouldAllowBack","quickview","isPriceMinMaxFeatureState","_getSortCriteriaColumn","_this$props$data$list5","queryColumns","mappedSearchConfiguration","_this$props$data$list6","refinerCount","paginationPreviousText","paginationNextText","productPrices","_this$props$context$a2","_listPageState$active","_listPageState$sortin","_newListPageState$cur","_newListPageState$sor","_newListPageState$act","newListPageState","enableAffiliationBasedPricing","user","isAuthenticated","_newListPageState$cur2","_newListPageState$sor2","_newListPageState$act2","_this$props$context$r8","refinerInput","RefinersByCollectionInput","getCollectionRefinersAction","_listPageState$result","_listPageState$result2","_this$props$context$r9","_this$props$data$list7","_this$props$data$list8","productCollection","searchProduct","featureComponent","disableHierarchy","FeatureSearchContainer","similarLookProduct","isRecoSearchPage","SocialShareItem","_getSocialShareItem","SocialShareItemElement","icon","socialMedia","SocialMediaComponent","SocialMedia","Facebook","postUrl","Twitter","Pinterest","Linkedin","Mail","SocialShareItemView","WishlistItemDimension","WishListItemActions","itemKey","handlers","onAddToCart","onRemoveItem","_renderAriaLabel","formattedPrice","BasePrice","productDimension","join","renderProductLink","productAttributes","productPageUrlWithSwatch","renderInventoryInformationLabel","inventoryInformationLabel","inventoryLabelClassName","inventoryCssName","WishlistItemAddToCartButtonComponent","isInStock","addItemAction","WishlistItemRemoveFromWishlistButtonComponent","removeFromWishlistText","removeItemAction","renderUnitOfMeasure","WishlistItem","wishlistState","enableImageProductLink","_props$product$Dimens","_getFullProductLink","_renderProductDimensions","_renderPrice","productUnitOfMeasure","entireProductLink","productAriaLabel","addToCartButton","inventoryInformation","removeButton","productStatusMessage","userMessage","WishlistItemsStatusMessage","errorType","WishlistItems","handleHeadingChange","_addItemToCart","addedToCartSuccessMessage","invoiceInCartErrorMessage","productInventoryInformation","_getProductInventory","ProductDetails","_product$Behavior$Min","getDeliveryOptionsAsync","queryResultSettings","QueryResultSettingsProxy","getPagingFromInputDataOrDefaultValue","validateQuantity","isQuantityValidationRequired","respectQuantityLimits","addProductToCartInput","availableQuantity","_await$cart$cart","curQuantity","maxQtyLimitReachedMessage","_getInventoryValueMessage","_result$errorDetails","_result$errorDetails2","isChannelQuantityLimitsFeatureEnabledInHq","validateLimitsPerLine","_this$props$data$cart3","_removeItemFromWishlist","noLongerLineExist","userToken","token","wishlistLineId","_getWishlistLineIdFromProductId","removeLinesAsync","Id","commerceList","castCommerceList","_getProductsNoLongerExists","_removeNoLongerExistsLines","update","createGetByCustomerInput","getItemsInWishlists","ActiveWishlistInput","castSimpleProducts","isError","_inventoryLabel","_inventoryClassName","_isProductInStock","CommerceListLines","foundWishlistItem","commerceListLine","_castCommerceList$Com","noLongerExist","line","emptyWishlistText","wishlistErrorGettingWishlist","noLongerExitsWishlistItemText","errorProps","statusMessage","emptyViewProps","Products","Product","ProductDimensions","_renderProductList","statusNotExistsMessage","_getProductNotExists","emptytext","noLongerExisttext","addToCartButtonText","removeButtonText","currentProductProps","ProductPrice","maxQuantityForLineItem","minInventory","productInventoryCollection","_renderItem"],"sourceRoot":""}