{"version":3,"file":"static/js/2.b1c3f6c28882235d0690.chunk.js","mappings":";mMAeA,MAAMA,UAAuBC,EAAAA,cACzBC,YAAYC,GACRC,MAAMD,EACV,CAEOE,SACH,MAAM,OAAEC,GAAWC,KAAKJ,MACxBI,KAAKC,OAAO,8BAA8BD,KAAKJ,MAAMM,MAAMF,KAAKJ,MAAMO,aAEtE,MAAMC,EAAwBC,OAAO,mBAAoB,KACzD,IAAIC,EACJ,MAAMC,EAAiBR,GAAUA,EAAOS,aACxC,IAAIC,EAEJ,GAAIF,EAAgB,CAChB,IAAIG,GAAsB,EAG1B,IAFAD,EAAiBF,EAEVG,GACHJ,EAAeF,EAAsBO,KAAKJ,GAEtCD,GAAgBA,EAAaM,OAAS,GACtCZ,KAAKC,OAAO,yBAAyBK,EAAa,MAClDG,EAAiBT,KAAKa,oBAAoBJ,EAAgBH,EAAa,KAEvEI,GAAsB,CAAK,CAKvC,OAAKD,EAKDf,EAAAA,cAACoB,EAAAA,GAAwB,KACpBd,KAAKe,OAAON,GACTf,EAAAA,cAAA,UACIsB,IAAKP,EACLQ,QAASlB,EAAOkB,MAChBC,QAASnB,EAAOmB,MAAK,kBACJnB,EAAOoB,WAAa,YAGzCzB,EAAAA,cAAA,UACIuB,QAASlB,EAAOkB,MAChBC,QAASnB,EAAOmB,MAAK,kBACJnB,EAAOoB,WAAa,UAErCC,wBAAyB,CAAEC,OAAQZ,MAlBxC,IAuBf,CAEQR,OAAOqB,GACPtB,KAAKJ,MAAM2B,WACXvB,KAAKJ,MAAM2B,UAAUC,IAAIC,EAAAA,GAASC,MAAOJ,EAEjD,CAEQP,OAAOY,GAEX,MAAO,oFAAoFC,KAAKD,EACpG,CAEQd,oBAAoBJ,EAAwBoB,GAEhD,MAAMC,EAAoBD,EAAiBE,MAAM,QAEjD,GAAiC,IAA7BD,EAAkBlB,SAAiBH,EACnC,OAAOA,EAGX,MAAMuB,EAAkBF,EAAkB,GACpCG,EAAeH,EAAkB,GAEvC,GAAwB,UAApBE,EAEIhC,KAAKJ,MAAMqC,KAEXxB,EAAiBA,EAAeyB,QAAQL,EAAkB7B,KAAKJ,MAAMqC,IAErEjC,KAAKC,OAAO,wBAAwB4B,yBAAwC7B,KAAKJ,MAAMqC,YAExF,GAAIjC,KAAKJ,MAAMuC,SAAWnC,KAAKJ,MAAMuC,QAAQC,QAChD,OAAQJ,GACJ,IAAK,UAEGhC,KAAKJ,MAAMuC,QAAQC,QAAQH,KAE3BxB,EAAiBA,EAAeyB,QAAQL,EAAkB7B,KAAKJ,MAAMuC,QAAQC,QAAQH,IACrFjC,KAAKC,OAED,wBAAwB4B,2BAA0C7B,KAAKJ,MAAMuC,QAAQC,QAAQH,OAIrG,MACJ,IAAK,OAEGjC,KAAKJ,MAAMuC,QAAQC,QAAQC,MAAQrC,KAAKJ,MAAMuC,QAAQC,QAAQC,KAAKJ,KAEnExB,EAAiBA,EAAeyB,QAAQL,EAAkB7B,KAAKJ,MAAMuC,QAAQC,QAAQC,KAAKJ,IAC1FjC,KAAKC,OAED,wBAAwB4B,wBAAuC7B,KAAKJ,MAAMuC,QAAQC,QAAQC,KAAKJ,OAIvG,MACJ,IAAK,QAEGjC,KAAKJ,MAAMuC,QAAQC,QAAQE,OAAStC,KAAKJ,MAAMuC,QAAQC,QAAQE,MAAML,KAErExB,EAAiBA,EAAeyB,QAAQL,EAAkB7B,KAAKJ,MAAMuC,QAAQC,QAAQE,MAAML,IAC3FjC,KAAKC,OAED,wBAAwB4B,0BAAyC7B,KAAKJ,MAAMuC,QAAQC,QAAQE,MAAML,OAStH,OAAOxB,CACX,EAGJ,suJC3IY8B,gCCIL,SAASC,EAAOC,GAA6C,QAAAC,EAAAC,UAAA/B,OAAjBgC,EAAiB,IAAAC,MAAAH,EAAA,EAAAA,EAAA,KAAAI,EAAA,EAAAA,EAAAJ,EAAAI,IAAjBF,EAAiBE,EAAA,GAAAH,UAAAG,GAChE,OAAKL,EAIEA,EAAgBP,QAAQ,YAAY,CAACa,EAAeC,KACvD,GAAIA,GAASJ,EAAWhC,OACpB,OAAOmC,EAGX,MAAME,EAAQL,EAAWI,GAEzB,MAAqB,iBAAVC,GAAuBA,EAIb,iBAAVA,EACAA,EAGJA,EAAMC,WAPF,EAOY,IAlBhB,EAoBf,CAOO,SAASC,EAAmBF,GAC/B,OAAQA,GAA0B,iBAAVA,IAAuBG,EAAKH,EACxD,CAOO,SAASG,EAAKH,GAEjB,OAAKA,GAA0B,iBAAVA,EAIjBA,EAAMG,KACCH,EAAMG,OAGVH,EAAMf,QAAQ,aAAc,IAPxBe,CAQf,CASO,SAASI,EAAWJ,EAAeK,GAA0C,IAA1BC,IAAAZ,UAAA/B,OAAA,QAAA4C,IAAAb,UAAA,KAAAA,UAAA,GACtD,SAAKM,IAAUK,KAIXC,IACAN,EAAQA,EAAMQ,oBACdH,EAASA,EAAOG,qBAGhBR,EAAMI,WACCJ,EAAMI,WAAWC,GAIhC,CCzEO,SAASI,EAAQC,GACpB,OAAOA,GAAUA,EAAQC,aAAoB,EACjD,CAOO,SAASC,EAASF,EAAsBG,IACvCH,GAAYR,EAAmBW,IAehC,SAAkBH,EAAsBG,GAC3C,IAAKH,GAAWR,EAAmBW,GAC/B,OAAO,EACJ,GAAIH,EAAQI,UACf,OAAOJ,EAAQI,UAAUC,SAASF,GAEtC,MAAO,OAAOH,EAAQM,gBAAgBC,SAAS,OAAOd,EAAKU,UAC/D,CAtBqDK,CAASR,EAASG,KAC3DH,EAAQI,UACRJ,EAAQI,UAAUK,IAAIN,GAEtBH,EAAQM,UAAYb,EAAK,GAAGO,EAAQM,aAAaH,KAG7D,CAsBO,SAASO,EACZC,GAEA,IAAKA,EACD,MAAO,GAGX,MAAMC,EAAgB,GAEtB,IAAK,IAAIC,EAAI,EAAGA,EAAIF,EAAS1D,OAAQ4D,IACjCD,EAASE,KAAQH,EAASE,IAG9B,OAAOD,CACX,CAQO,SAASG,EAAeC,EAAkBxC,GAC7C,OAAOyC,EAA6BD,EAAUxC,EAClD,CAQO,SAASyC,EAAuCD,EAAkBxC,GACrE,GAAIgB,EAAmBwB,IAA0B,MAAbA,EAChC,MAAY,GAGhB,MAAME,EAAyC1C,GAAW2C,SAG1D,GAAI,gBAAgBlD,KAAK+C,GAAW,CAEhC,OAAQA,EAAS,IACb,IAAK,IACD,OAAIE,EAAeE,uBACRV,EAAmBQ,EAAeE,uBAAuBJ,EAASK,MAAM,KAE5EX,EAAmBQ,EAAeI,iBAAiBN,IAE9D,IAAK,IACD,MAAMhB,EAAUkB,EAAeK,cAAcP,GAC7C,OAAahB,EAAU,CAACA,GAAW,GAG3C,OAAOU,EAAmBQ,EAAeM,qBAAqBR,GAAW,CAG7E,OAAON,EAAmBQ,EAAeI,iBAAiBN,GAC9D,CAUO,SAASS,EAAIzB,EAA6B0B,EAAkBpC,GAC/D,OAAKU,EAIDV,GAAmB,KAAVA,OAEHU,EAAS2B,MAAMD,GAAYpC,IAK7BE,EAFJF,EAAcU,EAAS2B,MAAMD,MAKzBpC,GADAA,EAAQsC,iBAAiB5B,IACX0B,IAGXpC,GAhBA,IAkBf,CAMO,SAASuC,EAAgBC,GACxBA,IACAA,EAAcC,UAAY,GAElC,CAQO,SAASC,EAAmBhB,EAAkBxC,GACjD,MAAMyD,EAAmBhB,EAA6BD,EAAUxC,GAChE,OAAQyD,GAAqBA,EAAiBhF,OAAgBgF,EAAiB,GAAxB,IAC3D,EFxJA,SAAYrD,GACRA,EAAAA,EAAA,eACAA,EAAAA,EAAA,aACAA,EAAAA,EAAA,kBACAA,EAAAA,EAAA,kBACAA,EAAAA,EAAA,gBACAA,EAAAA,EAAA,cACAA,EAAAA,EAAA,kBACAA,EAAAA,EAAA,wBACAA,EAAAA,EAAA,oBACAA,EAAAA,EAAA,kBACAA,EAAAA,EAAA,oBACAA,EAAAA,EAAA,wBACAA,EAAAA,EAAA,cACAA,EAAAA,EAAA,gBACAA,EAAAA,EAAA,0BACAA,EAAAA,EAAA,sBACAA,EAAAA,EAAA,4BACAA,EAAAA,EAAA,0BACAA,EAAAA,EAAA,kBACAA,EAAAA,EAAA,oBACAA,EAAAA,EAAA,oBACAA,EAAAA,EAAA,oBACAA,EAAAA,EAAA,sBACAA,EAAAA,EAAA,uBACAA,EAAAA,EAAA,qBACAA,EAAAA,EAAA,qBACAA,EAAAA,EAAA,8BACAA,EAAAA,EAAA,gCACAA,EAAAA,EAAA,iCACAA,EAAAA,EAAA,gBACAA,EAAAA,EAAA,sBACAA,EAAAA,EAAA,sBACAA,EAAAA,EAAA,sBACAA,EAAAA,EAAA,sBACAA,EAAAA,EAAA,uBACAA,EAAAA,EAAA,uBACAA,EAAAA,EAAA,uBACAA,EAAAA,EAAA,uBACAA,EAAAA,EAAA,uBACAA,EAAAA,EAAA,uBACAA,EAAAA,EAAA,qCACAA,EAAAA,EAAA,6BACAA,EAAAA,EAAA,+BACAA,EAAAA,EAAA,2BACAA,EAAAA,EAAA,iCACAA,EAAAA,EAAA,2BACAA,EAAAA,EAAA,2BACAA,EAAAA,EAAA,2BACAA,EAAAA,EAAA,2BACAA,EAAAA,EAAA,2BACAA,EAAAA,EAAA,2BACAA,EAAAA,EAAA,2BACAA,EAAAA,EAAA,2BACAA,EAAAA,EAAA,2BACAA,EAAAA,EAAA,6BACAA,EAAAA,EAAA,6BACAA,EAAAA,EAAA,6BACAA,EAAAA,EAAA,iCACAA,EAAAA,EAAA,qCACAA,EAAAA,EAAA,qCACAA,EAAAA,EAAA,uCACAA,EAAAA,EAAA,yCACAA,EAAAA,EAAA,uBACAA,EAAAA,EAAA,6BACAA,EAAAA,EAAA,mBACAA,EAAAA,EAAA,qBACAA,EAAAA,EAAA,mBACAA,EAAAA,EAAA,mBACAA,EAAAA,EAAA,iCACAA,EAAAA,EAAA,mBACAA,EAAAA,EAAA,yBACAA,EAAAA,EAAA,yBACAA,EAAAA,EAAA,yBACAA,EAAAA,EAAA,yBACAA,EAAAA,EAAA,6CACAA,EAAAA,EAAA,2CACAA,EAAAA,EAAA,6CACAA,EAAAA,EAAA,+CACAA,EAAAA,EAAA,mCACAA,EAAAA,EAAA,uCACAA,EAAAA,EAAA,uCACAA,EAAAA,EAAA,yCACAA,EAAAA,EAAA,mCACAA,EAAAA,EAAA,iCACAA,EAAAA,EAAA,mDACAA,EAAAA,EAAA,qDACAA,EAAAA,EAAA,uDACAA,EAAAA,EAAA,2DACAA,EAAAA,EAAA,6DACAA,EAAAA,EAAA,2DACAA,EAAAA,EAAA,yDACAA,EAAAA,EAAA,6DACAA,EAAAA,EAAA,+DACAA,EAAAA,EAAA,6DACAA,EAAAA,EAAA,+BACAA,EAAAA,EAAA,2BACAA,EAAAA,EAAA,iCACAA,EAAAA,EAAA,kBACH,CAnGD,CAAYA,IAAAA,EAAQ,KGcb,MAAMsD,EAiBFC,YAAYC,EAAaC,EAAgBC,GAC5C,IAAKF,EACD,OAIJ,IAAIG,EAAmB,KAGnBC,OAAOC,gBACPF,EAAc,IAAIE,eAElBF,EAAYG,iBAAiB,QAAQ,KACjCL,GAAQA,EAAKE,EAAYI,cACzBT,EAAcU,+BAA+BL,EAAY,IAM7DL,EAAcW,oBAAoB/B,KAAKyB,IAChCC,OAAOM,iBACdP,EAAc,IAAIO,eAElBP,EAAYQ,mBAAqB,KAC7B,GAA+B,IAA3BR,EAAYS,WAAkB,CAE9B,IAAIC,EAAc,KACS,MAAvBV,EAAYW,SACZD,EAASV,EAAYI,cAEzBN,GAAQA,EAAKY,EAAQ,CACjB,GAQZV,IACAA,EAAYY,UAAYZ,EAAYG,iBAAiB,SAAS,KAC1DR,EAAcU,+BAA+BL,GAC7CD,GAAUA,GAAQ,IAEtBC,EAAYa,KAAK,MAAOhB,GAAK,GAC7BG,EAAYc,OAEpB,CAOQlB,sCAAsCmB,GAE1C,IAAIjE,GAAS,EACb,IAAK,IAAIkE,EAAI,EAAGA,EAAIrB,EAAcW,oBAAoB5F,OAAQsG,IAC1D,GAAID,IAAQpB,EAAcW,oBAAoBU,GAAI,CAC9ClE,EAAQkE,EACR,KAAM,CAGVlE,GAAS,GACT6C,EAAcW,oBAAoBW,OAAOnE,EAAO,EAExD,EA3EwB6C,EAAAW,oBAA2B,QCyLT,oBAAXL,SAA0BA,OAAOrB,UAAYqB,OAAOrB,SAASsC,cAoGzF,SAASC,IAA2B,QAAA3E,EAAAC,UAAA/B,OAAjBgC,EAAiB,IAAAC,MAAAH,GAAAI,EAAA,EAAAA,EAAAJ,EAAAI,IAAjBF,EAAiBE,GAAAH,UAAAG,GACvC,IAAKF,IAAeA,EAAWhC,OAC3B,OAAO,KAGX,MAAM0G,EAAqC,kBAAlB1E,EAAW,IAAoBA,EAAW,GAEnE,GAAIA,EAAWhC,OAAS,EACpB,OAAO0G,EAAY,KAAO1E,EAAW,GAGzC,GAAI0E,GAAa1E,EAAWhC,OAAS,EACjC,OAAOgC,EAAW,GAGtB,MAAM2E,EAASD,EAAY1E,EAAW,GAAKA,EAAW,GAEtD,IAAK,IAAI4E,EAAaF,EAAY,EAAI,EAAGE,EAAa5E,EAAWhC,OAAQ4G,IACrE,QAA+BhE,IAA3BZ,EAAW4E,GACX,IAAK,MAAMC,KAAOC,OAAOC,KAAK/E,EAAW4E,IACrC,GAAI5E,EAAW4E,GAAYI,eAAeH,GAAM,CAC5C,MAAM9F,EAASiB,EAAW4E,GAAYC,GAEtC,GAAIH,EAAW,CACX,IAAIO,EAAgBhF,MAAMiF,QAAUjF,MAAMiF,QAAQnG,GAAuC,mBAA7B,CAAC,EAAEuB,SAAS6E,KAAKpG,GACzEqG,IACET,EAAOE,KACR5E,MAAMiF,QAAUjF,MAAMiF,QAAQP,EAAOE,IAA0C,mBAAlC,CAAC,EAAEvE,SAAS6E,KAAKR,EAAOE,KACtEQ,GAAkBJ,GAAmC,iBAAXlG,EAC1CuG,GAAkBF,KAAmBT,EAAOE,IAA+B,iBAAhBF,EAAOE,GAEtE,GAAII,GAAiBG,EAAe,CAChC,IAAK,MAAOG,EAAYxE,KAAYhC,EAAOyG,UACvCP,EAAgBhF,MAAMiF,QAAUjF,MAAMiF,QAAQnE,GAAyC,mBAA9B,CAAC,EAAET,SAAS6E,KAAKpE,GAC1EqE,IACMT,EAAOE,GAAKU,KACbtF,MAAMiF,QACDjF,MAAMiF,QAAQP,EAAOE,GAAKU,IACoB,mBAA9C,CAAC,EAAEjF,SAAS6E,KAAKR,EAAOE,GAAKU,KACvCF,GAAkBJ,GAAoC,iBAAZlE,EAC1CuE,GAAkBF,KAAmBT,EAAOE,GAAKU,IAAkD,iBAA5BZ,EAAOE,GAAKU,GAG/EZ,EAAOE,GAAKU,GADZN,EAC0BR,GAAO,EAAMW,EAAgBT,EAAOE,GAAKU,GAAc,GAAIxE,GAC9EsE,EACmBZ,GAAO,EAAMa,EAAiBX,EAAOE,GAAKU,GAAc,CAAC,EAAGxE,GAE5DA,EAGlC,QAAS,CACN,GAAIkE,EAAe,CACtBN,EAAOE,GAAOJ,GAAO,EAAM,GAAI1F,GAC/B,QAAS,CACN,GAAIsG,EAAgB,CACvBV,EAAOE,GAAOJ,GAAO,EAAMa,EAAiBX,EAAOE,GAAO,CAAC,EAAG9F,GAC9D,QAAS,CAAT,CAIR4F,EAAOE,GAAO9F,CAAO,CAMrC,OAAO4F,CACX,CASO,SAASc,EAAcC,GAC1B,OAAyB,OAArBA,EACO,KAEJ,CACHC,MAAOD,EAAiBE,YACxBC,OAAQH,EAAiBI,aAEjC,CAMO,SAASC,IACZ,SAAIC,UAAUC,SAAUD,UAAUE,aACvBF,UAAUC,OAAO3E,SAAS,WAAa0E,UAAUE,UAAU5E,SAAS,WAAa0E,UAAUE,UAAU5E,SAAS,SAG7H,6GChWM6E,EAAmB,SAACnJ,GAA2B,UACjD,OAA2G,QAA3GoJ,EAA6E,QAA7EC,EAAqC,QAArCC,EAAOtJ,EAAMuJ,KAAKC,MAAMC,qBAAa,IAAAH,EAAAA,EAAItJ,EAAMuJ,KAAKC,MAAME,2BAAmB,IAAAL,EAAAA,EAAIrJ,EAAMuJ,KAAKC,MAAMG,iBAAS,IAAAP,EAAAA,EAjDlF,CAkD7B,EAqBMQ,EAAiB,SACnB5J,EACAwJ,EACAK,EACAC,GAEA,YAAclG,IAAV4F,EACO,GAGPK,GAhFkB,IAgFQL,GAAuBxJ,EAAM+J,cAChD/J,EAAM+J,cAGV/J,EAAMuC,QAAQyH,iBAAiBJ,eAAeJ,EAAOM,EAChE,EAEMG,EAAiC,SAACjK,GAA2B,UAC/D,OAC+B,QAA3BsJ,EAACtJ,EAAMkK,4BAAoB,IAAAZ,GAAAA,KACb,QAAbD,EAAArJ,EAAMmK,eAAO,IAAAd,OAAA,EAAAA,EAAEe,oBAAqBC,EAAAA,YAAYC,SAAuB,QAAblB,EAAApJ,EAAMmK,eAAO,IAAAf,OAAA,EAAAA,EAAEgB,oBAAqBC,EAAAA,YAAYE,iBACtE3G,IAArC5D,EAAMuJ,KAAKC,MAAMgB,sBACoB5G,IAArC5D,EAAMuJ,KAAKC,MAAMiB,eAEzB,EAyBMC,EAAqB,SAAC1K,GAA2B,MAC7C2K,EAA0Bf,EAAe5J,EAAOA,EAAMuJ,KAAKC,MAAMiB,iBAAiB,EAAOzK,EAAM8J,cAC/Fc,EAA0BhB,EAAe5J,EAAOA,EAAMuJ,KAAKC,MAAMgB,iBAAiB,EAAOxK,EAAM8J,cACrG,OACI9J,EAAMkK,sBACNlK,EAAMuJ,KAAKC,MAAMiB,iBACjBzK,EAAMuJ,KAAKC,MAAMgB,iBACjBxK,EAAMuJ,KAAKC,MAAMiB,gBAAkBzK,EAAMuJ,KAAKC,MAAMgB,gBAGhD1K,EAAAA,cAAA,QAAMuE,UAAU,wBAAwBwG,SAAS,SAC7C/K,EAAAA,cAAA,QAAMuE,UAAU,sBAAsBwG,SAAS,SAC1CD,GAEL9K,EAAAA,cAAA,QAAMuE,UAAU,uBAAuBwG,SAAS,SACvB,QAD8BvB,EAClDtJ,EAAM8K,sBAAc,IAAAxB,OAAA,EAAAA,EAAEyB,qBAE3BjL,EAAAA,cAAA,QAAMuE,UAAU,sBAAsBwG,SAAS,SAC1CF,IAOb7K,EAAAA,cAAA,QAAMuE,UAAU,oBAAoBwG,SAAS,SACxCjB,EAAe5J,EA9FL,SAACA,GACpB,OAAIiK,EAA+BjK,SAA+C4D,IAArC5D,EAAMuJ,KAAKC,MAAMgB,gBACnDxK,EAAMuJ,KAAKC,MAAMgB,qBAGqB5G,IAA7C5D,EAAMuJ,KAAKC,MAAMwB,wBACVhL,EAAMuJ,KAAKC,MAAMwB,wBAGrB7B,EAAiBnJ,EAC5B,CAoFmCiL,CAAejL,IAAQ,EAAMA,EAAM8J,cAGtE,EA4GaoB,EAAgEC,EAAAA,GAAiBC,gBAAiC,SAAOC,EAAAA,EAAAA,IAAA,CAClIC,UA9C0C,SAACtL,GAA2B,UAEtE,QAAiD4D,IAA7C5D,EAAMuJ,KAAKC,MAAMwB,wBACjB,OAAO,KAMX,GAAIhL,EAAMuL,qCAAgF,IAAzCvL,EAAMuJ,KAAKC,MAAMgC,oBAA2B,CACnF,IAAAC,GAAAC,EAAAA,EAAAA,IAA8B5L,EAAAA,UAAwB,GAAM,GAA3D6L,EAAUF,EAAA,GAAEG,EAAaH,EAAA,GAIhC,OACI3L,EAAAA,cAAA,QAAMuE,UAAWwH,IAAW,YAAa7L,EAAMqE,YAC3CvE,EAAAA,cAAA,QAAMuE,UAAWwH,IAAW,iCAAkC7L,EAAMqE,YAChEvE,EAAAA,cAAA,KAAGuE,UAAU,oBAAoBwG,SAAS,SACrCjB,EAAe5J,EAA2C,QAAtCsJ,EAAEtJ,EAAMuJ,KAAKC,MAAMgC,2BAAmB,IAAAlC,EAAAA,EAAItJ,EAAMuJ,KAAKC,MAAMwB,yBAAyB,IAE7GlL,EAAAA,cAACgM,EAAAA,OAAM,CACHzH,UAAWsH,EAAa,2CAA6C,4CAA2C,aAChF,QADgFtC,EACpGrJ,EAAM8K,sBAAc,IAAAzB,OAAA,EAAAA,EAAE0C,0BAClCC,QAZD,WACXJ,GAAeD,EACnB,EAU+B,gBACAA,EACfM,SAAU,GAEW,QAFV7C,EAEVpJ,EAAM8K,sBAAc,IAAA1B,OAAA,EAAAA,EAAE2C,2BAE1BJ,GA5Dc,SAAC3L,GAA2B,kBAGrDkM,GAAgF,QAAtC5C,EAACtJ,EAAMuJ,KAAKC,MAAM2C,4BAAoB,IAAA7C,EAAAA,EAAI,IAAI,GAC9F,OACIxJ,EAAAA,cAAA,KAAGuE,UAAWwH,IAAW,kCAAmC7L,EAAMqE,YAC9DvE,EAAAA,cAAA,SAEK,OAAM8C,EAAAA,EAAAA,QACqD,QAD/CwG,EACW,QADXC,EACTrJ,EAAM8K,sBAAc,IAAAzB,OAAA,EAAAA,EAAE+C,0CAAkC,IAAAhD,EAAAA,EAAI,GAC5DpJ,EAAMuC,QAAQyH,iBAAiBqC,WAAWH,EAAeI,eACzDtM,EAAMuC,QAAQyH,iBAAiBqC,WAAWH,EAAeK,kBAGjEzM,EAAAA,cAAA,SAEK,OAAM8C,EAAAA,EAAAA,QAAkE,QAA5D4J,EAAqB,QAArBf,EAACzL,EAAM8K,sBAAc,IAAAW,OAAA,EAAAA,EAAEgB,6CAAqC,IAAAD,EAAAA,EAAI,GAAIN,EAAeQ,oBAEpG5M,EAAAA,cAAA,SAEK,OAAM8C,EAAAA,EAAAA,QAAkE,QAA5D+J,EAAqB,QAArBC,EAAC5M,EAAM8K,sBAAc,IAAA8B,OAAA,EAAAA,EAAEC,6CAAqC,IAAAF,EAAAA,EAAI,GAAIT,EAAeY,oBAIhH,CAoCmCC,CAA2B/M,IAE3C,CAIf,OACIF,EAAAA,cAAA,QAAMuE,UAAWwH,IAAW,YAAa7L,EAAMqE,YAlJtB,SAACrE,GAC9B,IAAMgN,EAAqB7D,EAAiBnJ,GACtCiN,EAAmBhD,EAA+BjK,GAClDA,EAAMuJ,KAAKC,MAAMgB,gBACjBxK,EAAMuJ,KAAKC,MAAMwB,wBAEvB,SAAIiC,IAAoBD,IACbC,EAAmBD,CAIlC,CAwIaE,CAAyBlN,GA7FM,SAACA,GACzC,IAAMmN,EAAuBvD,EAAe5J,EAAOmJ,EAAiBnJ,IAAQ,GAE5E,OACIF,EAAAA,cAAAA,EAAAA,SAAA,KACIA,EAAAA,cAAA,QAAMuE,UAAU,WACX,IACArE,EAAMoN,kBACN,IACAD,EACA,IACAnN,EAAMqN,iBACN,IACA3C,EAAmB1K,IAExBF,EAAAA,cAAA,QAAMuE,UAAU,2BAA0B,cAAa,QAClD8I,EACA,KAELrN,EAAAA,cAAA,sBAAkB,QAAQ4K,EAAmB1K,IAC5CA,EAAMsN,aAAexN,EAAAA,cAAA,QAAMuE,UAAU,sBAAsBrE,EAAMsN,aAG9E,CAsE+CC,CAAoCvN,GAAS0K,EAAmB1K,GAG/G,GAnN8B,CAAC,u1GCnClBwN,EAAwC,SAACxN,GAC1C,IAAAyN,EAAuCzN,EAAKyN,SAAlCpJ,EAA6BrE,EAAKqE,UAAvBqJ,EAAkB1N,EAAK0N,cAEpD,OACI5N,EAAAA,cAAA,OAAKuE,UAAcA,EAAS,cACvBsJ,EAA0B3N,EAAMuC,QAAY8B,EAAS,aAAcoJ,EAAUC,GAG1F,EAEME,EAA2B,SAACrL,EAAuB8B,EAAmB8F,EAAsBuD,GAA8B,cAS5H,OACI5N,EAAAA,cAAA,OAAKuE,UAAcA,EAAS,iBACxBvE,EAAAA,cAAC+N,EAAAA,GAAK,CACFC,eAAgBvL,EAAQwL,cAAcD,eACtC1M,IAA2C,QAAxCkI,EAAEa,EAAQ6D,eAAeC,uBAAe,IAAA3E,EAAAA,EAAI,GAC/C4E,YAKK,QALMzC,GACP0C,EAAAA,EAAAA,qBACIhE,EAAQ6D,eAAeI,OACvB7L,EAAQwL,cAAcD,eAAeO,YACV,QADqBjF,EAC7B,QAD6BC,EAChD9G,EAAQC,QAAQ8L,WAAG,IAAAjF,OAAA,EAAAA,EAAElJ,cAAM,IAAAiJ,OAAA,EAAAA,EAAEmF,yBAChC,IAAA9C,EAAAA,EAAI,GAET+C,aAAcjM,EAAQC,QAAQgM,aAC9Bd,cAAeA,QAAAA,EArBkB,CACzCe,UAAW,CACPC,GAAI,CAAEC,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCE,GAAI,CAAEJ,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,IAEzCG,UAAU,GAgBFC,oBAAoB,QACpBC,QAAoC,QAA7B1C,EAAErC,EAAQ6D,eAAemB,YAAI,IAAA3C,EAAAA,EAAI,UAIxD,EAEMmB,EAA4B,SAC9BpL,EACA8B,EACAoJ,EACAC,GAEA,OACI5N,EAAAA,cAAA,OAAKuE,UAAcA,EAAS,qBACxBvE,EAAAA,cAAA,OAAKuE,UAAU,OACXvE,EAAAA,cAAA,OAAKuE,UAAU,UACVoJ,EAASzM,OAAS,GAAK4M,EAAyBrL,EAAS8B,EAAWoJ,EAAS,GAAIC,IAEtF5N,EAAAA,cAAA,OAAKuE,UAAU,UACVoJ,EAASzM,OAAS,GAAK4M,EAAyBrL,EAAS8B,EAAWoJ,EAAS,GAAIC,KAG1F5N,EAAAA,cAAA,OAAKuE,UAAU,OACXvE,EAAAA,cAAA,OAAKuE,UAAU,UACVoJ,EAASzM,OAAS,GAAK4M,EAAyBrL,EAAS8B,EAAWoJ,EAAS,GAAIC,IAEtF5N,EAAAA,cAAA,OAAKuE,UAAU,UACVoJ,EAASzM,OAAS,GAAK4M,EAAyBrL,EAAS8B,EAAWoJ,EAAS,GAAIC,KAKtG,q7DCrEO,MAAM0B,EAA+C,CACxD,QAAS,OACT,QAAS,OACT,QAAS,OACT,QAAS,OACT,QAAS,UACT,QAAS,YACT,QAAS,SACT,QAAS,OACT,QAAS,OACT,QAAS,OACT,QAAS,WACT,QAAS,UACT,QAAS,QACT,QAAS,aACT,QAAS,aACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,QACT,QAAS,QACT,QAAS,WACT,QAAS,WACT,QAAS,WACT,QAAS,WACT,QAAS,WACT,QAAS,WACT,QAAS,SACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,WACT,QAAS,QACT,QAAS,QACT,QAAS,SACT,QAAS,WACT,QAAS,mBACT,QAAS,WACT,QAAS,MACT,QAAS,QACT,QAAS,MACT,QAAS,WACT,QAAS,WACT,QAAS,iCACT,QAAS,iBACT,QAAS,kBACT,QAAS,QACT,QAAS,SACT,QAAS,sBACT,QAAS,wBACT,QAAS,SACT,QAAS,UACT,aAAc,SACd,QAAS,aACT,QAAS,YACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,UACT,QAAS,MACT,QAAS,SACT,QAAS,aACT,QAAS,OACT,QAAS,cASAC,EAA2C,CACpD,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS,KACT,QAAS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","sources":["webpack://lds-commerce/./src/modules/script-injector/script-injector.tsx?5a34","webpack://lds-commerce/./src/video-player-utilities/components/utilities/key-codes.ts?1004","webpack://lds-commerce/./src/video-player-utilities/components/utilities/string-extensions.ts?3689","webpack://lds-commerce/./src/video-player-utilities/components/utilities/html-extensions.ts?9642","webpack://lds-commerce/./src/video-player-utilities/components/utilities/player-utility.ts?33e3","webpack://lds-commerce/./src/video-player-utilities/components/utilities/utilities.ts?65c9","webpack://lds-commerce/./src/price/price.components.tsx?7295","webpack://lds-commerce/./src/order-template/order-templates-list/order-template-products-preview.tsx?832a","webpack://lds-commerce/./src/video-player-utilities/components/helper/localization-helper.ts?26d0","webpack://lds-commerce/./src/video-player-utilities/components/helper/closed-caption-helper.ts?8eff","webpack://lds-commerce/./src/video-player-utilities/components/helper/player-helper.ts?800e","webpack://lds-commerce/./src/rating/rating.component.tsx?1ba8","webpack://lds-commerce/./src/video-player-utilities/components/closed-captions/ttml-settings.ts?ff45","webpack://lds-commerce/./src/video-player-utilities/components/closed-captions/ttml-context.ts?2af4","webpack://lds-commerce/./src/video-player-utilities/components/closed-captions/ttml-time-parser.ts?72f5","webpack://lds-commerce/./src/video-player-utilities/components/closed-captions/ttml-parser.ts?6362","webpack://lds-commerce/./src/video-player-utilities/components/closed-captions/video-closed-captions.tsx?4d40","webpack://lds-commerce/./node_modules/@msdyn365-commerce/bootloader/node_modules/core-js/modules/es.string.split.js?2c70","webpack://lds-commerce/./src/social-media/social-media.components.tsx?9b27","webpack://lds-commerce/./src/add-to-cart/add-to-cart.component.tsx?c15a","webpack://lds-commerce/./src/add-to-cart/items-added-to-cart.ts?4f10","webpack://lds-commerce/./src/add-to-cart/items-added-to-cart-error-component.tsx?3e3e","webpack://lds-commerce/./src/add-to-cart/items-added-to-cart-dialog-component.tsx?3a1e","webpack://lds-commerce/./src/add-to-cart/notifications/item-successfully-added-to-cart-notification-component.tsx?1092","webpack://lds-commerce/./src/add-to-cart/notifications/item-successfully-added-to-cart-notification.ts?b5b4","webpack://lds-commerce/./src/add-to-cart/notifications/multi-items-successfully-added-to-cart-notification-component.tsx?ec23","webpack://lds-commerce/./src/add-to-cart/notifications/multi-items-successfully-added-to-cart-notification.ts?4d32","webpack://lds-commerce/./src/add-to-cart/product-model.ts?91f1","webpack://lds-commerce/./src/order-template/add-order-template-to-cart/add-order-template-to-cart.component.tsx?b3bb","webpack://lds-commerce/./src/order-template/rename-order-template/rename-order-template.component.tsx?22f7","webpack://lds-commerce/./src/order-template/lines-added-to-cart-dialog/lines-added-to-cart-dialog.component.tsx?3b78","webpack://lds-commerce/./src/order-template/order-template-name-dialog/order-template-name-dialog.component.tsx?aa9c","webpack://lds-commerce/./src/order-template/order-templates-list/order-template-list.tsx?9a9e","webpack://lds-commerce/./src/order-template/add-to-order-template-dialog/add-to-order-template-dialog.component.tsx?94ad","webpack://lds-commerce/./src/order-template/lines-added-to-order-template-dialog/lines-added-to-order-template-dialog.component.tsx?8a37","webpack://lds-commerce/./src/order-template/add-products-to-order-template/add-products-to-order-template.component.tsx?bf4c","webpack://lds-commerce/./src/order-template/duplicate-items-when-adding-to-order-template-dialog/duplicate-items-when-adding-to-order-template-dialog.component.tsx?1ec3","webpack://lds-commerce/./src/order-template/item-added-to-order-template-dialog/item-added-to-order-template-dialog.component.tsx?017f","webpack://lds-commerce/./src/order-template/add-to-order-template/add-to-order-template.component.tsx?0066","webpack://lds-commerce/./src/order-template/item-added-to-cart-dialog/item-added-to-cart-dialog.component.tsx?9757","webpack://lds-commerce/./src/order-template/save-cart-to-order-template/save-cart-to-order-template.component.tsx?c47e","webpack://lds-commerce/./src/video-player-utilities/player.tsx?8176","webpack://lds-commerce/./src/video-player-utilities/components/action-toggle/action-toggle.tsx?246b","webpack://lds-commerce/./src/video-player-utilities/components/age-gate/age-gate.tsx?96c8","webpack://lds-commerce/./src/video-player-utilities/components/data/player-constants.ts?0a75","webpack://lds-commerce/./src/video-player-utilities/components/data/player-metadata.ts?24d6","webpack://lds-commerce/./src/video-player-utilities/components/closed-captions/video-closed-captions-settings.ts?2fc2","webpack://lds-commerce/./src/video-player-utilities/components/menu/menu.tsx?4ce6","webpack://lds-commerce/./src/video-player-utilities/components/menu-item/menu-item.tsx?471c","webpack://lds-commerce/./src/video-player-utilities/components/play-pause-trigger/play-pause-trigger.tsx?3fa4","webpack://lds-commerce/./src/video-player-utilities/components/video-controls/video-controls.tsx?32a5","webpack://lds-commerce/./src/carousel/CarouselContext.tsx?5738","webpack://lds-commerce/./src/carousel/CarouselItem.tsx?ecad","webpack://lds-commerce/./src/carousel/Carousel.tsx?9349","webpack://lds-commerce/./src/cart-icon/cart-icon.component.tsx?ef29","webpack://lds-commerce/./src/promocode/promocode.component.tsx?37c7","webpack://lds-commerce/./src/action-menu/action-menu.component.tsx?7298","webpack://lds-commerce/./src/add-to-wishlist/add-to-wishlist.component.tsx?0a03","webpack://lds-commerce/./src/cartline/components/cart-line-price-editor.tsx?6767","webpack://lds-commerce/./src/cartline/cartlineitem.component.tsx?be39","webpack://lds-commerce/./src/product-card/components/product-component-swatch.tsx?a399","webpack://lds-commerce/./src/product-card/product.component.tsx?32e2","webpack://lds-commerce/./src/product-dimension/dropdown/dropdown.tsx?9ac3","webpack://lds-commerce/./src/product-dimension/product-dimension.component.tsx?387b","webpack://lds-commerce/./src/product-dimension/swatch/swatch-item.tsx?72c2","webpack://lds-commerce/./src/product-dimension/swatch/swatch.tsx?6550","webpack://lds-commerce/./src/product-card-v2/components/product-component-swatch-v2.tsx?1bc1","webpack://lds-commerce/./src/product-dimensions-matrix/components/product-dimensions-matrix-dimension-item.tsx?0f56","webpack://lds-commerce/./src/product-dimensions-matrix/components/product-dimensions-matrix-dimension-selection.tsx?2e77","webpack://lds-commerce/./src/product-dimensions-matrix/components/product-dimensions-matrix-enter-all-quantity-button.tsx?43c1","webpack://lds-commerce/./src/product-dimensions-matrix/product-dimensions-matrix.tsx?50f3","webpack://lds-commerce/./src/refiner/common.tsx?5431","webpack://lds-commerce/./src/refiner/refiner-apply.component.tsx?c65c","webpack://lds-commerce/./src/refiner/refiner-choice-summary.component.tsx?bb08","webpack://lds-commerce/./src/refiner/refiner-footer.component.tsx?922c","webpack://lds-commerce/./src/refiner/refiner-toggle.component.tsx?191b","webpack://lds-commerce/./src/refiner/refiner-sort.component.tsx?6742","webpack://lds-commerce/./src/refiner/refiner-header.component.tsx?f32a","webpack://lds-commerce/./src/refiner/refiner-item-check.component.tsx?49ea","webpack://lds-commerce/./src/refiner/refiner-item-daterange.component.tsx?a87f","webpack://lds-commerce/./src/refiner/refiner-modal.component.tsx?e1db","webpack://lds-commerce/./src/refiner/refiner-options.component.tsx?7d6b","webpack://lds-commerce/./src/refiner/refiner.component.tsx?4a59","webpack://lds-commerce/./src/search-bar/search-bar.component.tsx?4f38","webpack://lds-commerce/./src/table/table.component.tsx?d5d2","webpack://lds-commerce/./src/wishlist-icon/wishlist-icon.component.tsx?a133","webpack://lds-commerce/./src/video-player-utilities/components/data/player-options.ts?0c9c","webpack://lds-commerce/./src/product-card-v2/product-v2.component.tsx?2a5e"],"sourcesContent":["/*!\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-internal';\nimport { LogLevel } from '@msdyn365-commerce/telemetry-internal';\nimport * as React from 'react';\nimport { IScriptInjectorProps } from './script-injector.props.autogenerated';\n\n/**\n *\n * CoreComponent component\n * @extends {React.PureComponent<IScriptInjectorProps>}\n */\nclass ScriptInjector extends React.PureComponent<IScriptInjectorProps<{}>> {\n    constructor(props: IScriptInjectorProps<{}>) {\n        super(props);\n    }\n\n    public render(): JSX.Element | null {\n        const { config } = this.props;\n        this._debug(`Adding html head tags for '${this.props.id}/${this.props.typeName}'`);\n\n        const placeHolderPropsRegEx = RegExp('%[a-zA-Z0-9-.]*%', 'g');\n        let placeHolders: RegExpExecArray | null;\n        const originalSource = config && config.scriptSource;\n        let resolvedSource;\n\n        if (originalSource) {\n            let hasMorePlaceHolders = true;\n            resolvedSource = originalSource;\n\n            while (hasMorePlaceHolders) {\n                placeHolders = placeHolderPropsRegEx.exec(originalSource);\n\n                if (placeHolders && placeHolders.length > 0) {\n                    this._debug(`extracted placeholder ${placeHolders[0]}`);\n                    resolvedSource = this._resolvePlaceHolder(resolvedSource, placeHolders[0]);\n                } else {\n                    hasMorePlaceHolders = false;\n                }\n            }\n        }\n\n        if (!resolvedSource) {\n            return null;\n        }\n\n        return (\n            <MsDyn365.HtmlHeadInclude>\n                {this._isUrl(resolvedSource) ? (\n                    <script\n                        src={resolvedSource}\n                        async={!!config.async}\n                        defer={!!config.defer}\n                        data-load-point={config.loadPoint || 'bodyEnd'}\n                    />\n                ) : (\n                    <script\n                        async={!!config.async}\n                        defer={!!config.defer}\n                        data-load-point={config.loadPoint || 'bodyEnd'}\n                        // eslint-disable-next-line react/no-danger\n                        dangerouslySetInnerHTML={{ __html: resolvedSource }}\n                    />\n                )}\n            </MsDyn365.HtmlHeadInclude>\n        );\n    }\n\n    private _debug(debugMessage: string): void {\n        if (this.props.telemetry) {\n            this.props.telemetry.log(LogLevel.Debug, debugMessage);\n        }\n    }\n\n    private _isUrl(source: string): boolean {\n        // eslint-disable-next-line security/detect-unsafe-regex\n        return /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-\\/]))?/.test(source);\n    }\n\n    private _resolvePlaceHolder(resolvedSource: string, placeHolderToken: string): string {\n        // expect placeholder to of the format eg: %config.id%\n        const placeHolderTokens = placeHolderToken.split(/[%.]/);\n\n        if (placeHolderTokens.length !== 4 || !resolvedSource) {\n            return resolvedSource;\n        }\n\n        const propertyContext = placeHolderTokens[1];\n        const propertyName = placeHolderTokens[2];\n\n        if (propertyContext === 'props') {\n            // eslint-disable-next-line security/detect-object-injection -- bracket object notation with user input present leads to eslint security issue.\n            if (this.props[propertyName]) {\n                // eslint-disable-next-line security/detect-object-injection -- bracket object notation with user input present leads to eslint security issue.\n                resolvedSource = resolvedSource.replace(placeHolderToken, this.props[propertyName]);\n                // eslint-disable-next-line security/detect-object-injection -- bracket object notation with user input present leads to eslint security issue.\n                this._debug(`Replaced placeholder ${placeHolderToken} with props property ${this.props[propertyName]}`);\n            }\n        } else if (this.props.context && this.props.context.request) {\n            switch (propertyContext) {\n                case 'request':\n                    // eslint-disable-next-line security/detect-object-injection -- bracket object notation with user input present leads to eslint security issue.\n                    if (this.props.context.request[propertyName]) {\n                        // eslint-disable-next-line security/detect-object-injection -- bracket object notation with user input present leads to eslint security issue.\n                        resolvedSource = resolvedSource.replace(placeHolderToken, this.props.context.request[propertyName]);\n                        this._debug(\n                            // eslint-disable-next-line security/detect-object-injection -- bracket object notation with user input present leads to eslint security issue.\n                            `Replaced placeholder ${placeHolderToken} with request property ${this.props.context.request[propertyName]}`\n                        );\n                    }\n\n                    break;\n                case 'user':\n                    // eslint-disable-next-line security/detect-object-injection -- bracket object notation with user input present leads to eslint security issue.\n                    if (this.props.context.request.user && this.props.context.request.user[propertyName]) {\n                        // eslint-disable-next-line security/detect-object-injection -- bracket object notation with user input present leads to eslint security issue.\n                        resolvedSource = resolvedSource.replace(placeHolderToken, this.props.context.request.user[propertyName]);\n                        this._debug(\n                            // eslint-disable-next-line security/detect-object-injection -- bracket object notation with user input present leads to eslint security issue.\n                            `Replaced placeholder ${placeHolderToken} with user property ${this.props.context.request.user[propertyName]}`\n                        );\n                    }\n\n                    break;\n                case 'query':\n                    // eslint-disable-next-line security/detect-object-injection -- bracket object notation with user input present leads to eslint security issue.\n                    if (this.props.context.request.query && this.props.context.request.query[propertyName]) {\n                        // eslint-disable-next-line security/detect-object-injection -- bracket object notation with user input present leads to eslint security issue.\n                        resolvedSource = resolvedSource.replace(placeHolderToken, this.props.context.request.query[propertyName]);\n                        this._debug(\n                            // eslint-disable-next-line security/detect-object-injection -- bracket object notation with user input present leads to eslint security issue.\n                            `Replaced placeholder ${placeHolderToken} with query parameter ${this.props.context.request.query[propertyName]}`\n                        );\n                    }\n\n                    break;\n                default:\n            }\n        }\n\n        return resolvedSource;\n    }\n}\n\nexport default ScriptInjector;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/**\n * KeyCodes Enum.\n */\nexport enum KeyCodes {\n    Back = 8,\n    Tab = 9,\n    Enter = 13,\n    Shift = 16,\n    Ctrl = 17,\n    Alt = 18,\n    Break = 19,\n    CapsLock = 20,\n    Escape = 27,\n    Space = 32,\n    PageUp = 33,\n    PageDown = 34,\n    End = 35,\n    Home = 36,\n    ArrowLeft = 37,\n    ArrowUp = 38,\n    ArrowRight = 39,\n    ArrowDown = 40,\n    Print = 44,\n    Insert = 45,\n    Delete = 46,\n    Colon2 = 59, // Opera and Firefox\n    Equals2 = 61, // Opera\n    Equals3 = 107, // Firefox\n    Minus2 = 109, // Opera and Firefox\n    Period = 190,\n    WindowsLeft = 91,\n    WindowsRight = 92,\n    WindowsOpera = 219, // Opera\n    Menu = 93,\n    NumPad0 = 96,\n    NumPad1 = 97,\n    NumPad2 = 98,\n    NumPad3 = 99,\n    NumPad4 = 100,\n    NumPad5 = 101,\n    NumPad6 = 102,\n    NumPad7 = 103,\n    NumPad8 = 104,\n    NumPad9 = 105,\n    NumPadMultiply = 106,\n    NumPadPlus = 107,\n    NumPadMinus = 109,\n    NumPadDot = 110,\n    NumPadDivide = 111,\n    Function1 = 112,\n    Function2 = 113,\n    Function3 = 114,\n    Function4 = 115,\n    Function5 = 116,\n    Function6 = 117,\n    Function7 = 118,\n    Function8 = 119,\n    Function9 = 120,\n    Function10 = 121,\n    Function11 = 122,\n    Function12 = 123,\n    NavigationUp = 138,\n    NavigationDown = 139,\n    NavigationLeft = 140,\n    NavigationRight = 141,\n    NavigationAccept = 142,\n    NumLock = 144,\n    ScrollLock = 145,\n    Colon = 186,\n    Equals = 187,\n    Comma = 188,\n    Minus = 189,\n    ForwardSlash = 191,\n    Tilde = 192,\n    GamepadA = 195,\n    GamepadB = 196,\n    GamepadX = 197,\n    GamepadY = 198,\n    GamepadRightButton = 199,\n    GamepadLeftButton = 200,\n    GamepadLeftTrigger = 201,\n    GamepadRightTrigger = 202,\n    GamepadDPadUp = 203,\n    GamepadDPadDown = 204,\n    GamepadDPadLeft = 205,\n    GamepadDPadRight = 206,\n    GamepadSelect = 207,\n    GamepadStart = 208,\n    GamepadLeftThumbstick = 209,\n    GamepadRightThumbstick = 210,\n    GamepadLeftThumbstickUp = 211,\n    GamepadLeftThumbstickDown = 212,\n    GamepadLeftThumbstickRight = 213,\n    GamepadLeftThumbstickLeft = 214,\n    GamepadRightThumbstickUp = 215,\n    GamepadRightThumbstickDown = 216,\n    GamepadRightThumbstickRight = 217,\n    GamepadRightThumbstickLeft = 218,\n    OpenBracket = 219,\n    BackSlash = 220,\n    CloseBracket = 221,\n    Quote = 222\n}\n\n/**\n * Here for test coverage.\n */\nexport class KeycodesClass {\n    public testCoverage(): string {\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\n/**\n * Format the passed string.\n * @param formatSpecifier - FormatSpecifier.\n * @param parameters -- Any number of parameters.\n * @returns The formated string.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function format(formatSpecifier: string, ...parameters: any[]): string {\n    if (!formatSpecifier) {\n        return '';\n    }\n\n    return formatSpecifier.replace(/{(\\d+)}/g, (match: string, index: number) => {\n        if (index >= parameters.length) {\n            return match;\n        }\n\n        const value = parameters[index];\n\n        if (typeof value !== 'number' && !value) {\n            return '';\n        }\n\n        if (typeof value === 'string') {\n            return value;\n        }\n\n        return value.toString();\n    });\n}\n\n/**\n * Determines if the specified string is undefined, null, empty, or whitespace.\n * @param value - The string to examine.\n * @returns - True if the value is undefined, null, empty, or whitespace, otherwise false.\n */\nexport function isNullOrWhiteSpace(value: string): boolean {\n    return !value || typeof value !== 'string' || !trim(value);\n}\n\n/**\n * Trims leading and trailing whitespace from the string.\n * @param value - The string to examine.\n * @returns - The trimmed string.\n */\nexport function trim(value: string): string {\n    // Any flavor of !value (ie. null/undefined/'') should return itself.\n    if (!value || typeof value !== 'string') {\n        return value;\n    }\n\n    if (value.trim) {\n        return value.trim();\n    }\n\n    return value.replace(/^\\s+|\\s+$/g, '');\n}\n\n/**\n * Determines if the specified string starts with the specified value.\n * @param value - The string to look in.\n * @param prefix - The prefix to look for.\n * @param ignoreCase - Ignore Case.\n * @returns - True if the string starts with the prefix, otherwise false.\n */\nexport function startsWith(value: string, prefix: string, ignoreCase: boolean = true): boolean {\n    if (!value || !prefix) {\n        return false;\n    }\n\n    if (ignoreCase) {\n        value = value.toLocaleLowerCase();\n        prefix = prefix.toLocaleLowerCase();\n    }\n\n    if (value.startsWith) {\n        return value.startsWith(prefix);\n    }\n\n    return value.startsWith(prefix);\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { isNullOrWhiteSpace, trim } from './string-extensions';\n\n/**\n * Get the text of the element.\n * @param element - HTML element.\n * @returns The content of the element.\n */\nexport function getText(element?: HTMLElement | Element): string {\n    return element ? element.textContent || '' : '';\n}\n\n/**\n * Add a css class to an element.\n * @param element - The element to add the css class to.\n * @param cssClass - The css class to add.\n */\nexport function addClass(element: HTMLElement, cssClass: string): void {\n    if (element && !isNullOrWhiteSpace(cssClass) && !hasClass(element, cssClass)) {\n        if (element.classList) {\n            element.classList.add(cssClass);\n        } else {\n            element.className = trim(`${element.className} ${cssClass}`);\n        }\n    }\n}\n\n/**\n * Checks for the presence of a css class on an element.\n * @param element - The element to check the css class of.\n * @param cssClass - The css class to check for.\n * @returns True if the element's className has the specified class, otherwise false.\n */\nexport function hasClass(element: HTMLElement, cssClass: string): boolean {\n    if (!element || isNullOrWhiteSpace(cssClass)) {\n        return false;\n    } else if (element.classList) {\n        return element.classList.contains(cssClass);\n    }\n    return `' ' ${element.className} ' '`.includes(`' ' ${trim(cssClass)}  ' '`);\n}\n\n/**\n * Convert node list to array.\n * @param nodeList - Node List.\n * @returns Array of the node list.\n */\nexport function nodeListToArray<T extends Node>(\n    nodeList: NodeListOf<T> | NodeListOf<Element> | HTMLCollection | NodeList | NamedNodeMap\n): T[] {\n    if (!nodeList) {\n        return [];\n    }\n\n    const elements: T[] = [];\n\n    for (let n = 0; n < nodeList.length; n++) {\n        elements.push(<T>nodeList[n]);\n    }\n\n    return elements;\n}\n\n/**\n * Select elements in a context.\n * @param  selector - Can be class, id or tag selector.\n * @param  [context] - Any element to scope the selection. It's optional. If not provided document will be assumed.\n * @returns HTMLElement[].\n */\nexport function selectElements(selector: string, context?: HTMLElement): HTMLElement[] {\n    return selectElementsT<HTMLElement>(selector, context);\n}\n\n/**\n * Select elements in a context.\n * @param  selector - Can be class, id or tag selector.\n * @param  [context] - Any element to scope the selection. It's optional. If not provided document will be assumed.\n * @returns T[].\n */\nexport function selectElementsT<T extends HTMLElement>(selector: string, context?: HTMLElement): T[] {\n    if (isNullOrWhiteSpace(selector) || selector === '#') {\n        return <T[]>[];\n    }\n\n    const currentContext: HTMLElement | Document = context || document;\n\n    // Check if the first character is class or id.\n    if (/^[#.]?[\\w-]+$/.test(selector)) {\n        // eslint-disable-next-line default-case\n        switch (selector[0]) {\n            case '.':\n                if (currentContext.getElementsByClassName) {\n                    return nodeListToArray<T>(currentContext.getElementsByClassName(selector.slice(1)));\n                }\n                return nodeListToArray<T>(currentContext.querySelectorAll(selector));\n\n            case '#':\n                const element = currentContext.querySelector(selector);\n                return <T[]>(element ? [element] : []);\n        }\n\n        return nodeListToArray<T>(currentContext.getElementsByTagName(selector));\n    }\n\n    return nodeListToArray<T>(currentContext.querySelectorAll(selector));\n}\n\n/**\n * Sets or gets CSS properties.\n * @param  element - HTML Element.\n * @param  property - The CSS property name.\n * @param  [value] - The value to set on the CSS property.\n * @returns - The value of the CSS property.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function css(element: HTMLElement | Node, property: string, value?: any): any {\n    if (!element) {\n        return null;\n    }\n\n    if (value || value === '') {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        (<any>element).style[property] = value;\n    } else {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        value = (<any>element).style[property];\n\n        if (isNullOrWhiteSpace(value)) {\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            value = getComputedStyle(element as any);\n            value = value[property];\n        }\n\n        return value;\n    }\n}\n\n/**\n * Remove all inner HTML from a parent element - used to delete child elements.\n * @param parentElement - The parent element from which all children should be removed.\n */\nexport function removeInnerHtml(parentElement: HTMLElement): void {\n    if (parentElement) {\n        parentElement.innerHTML = '';\n    }\n}\n\n/**\n * Select first element from the selected elements using provided selector.\n * @param selector - Element selector.\n * @param [context] - An optional context to scope the selection.\n * @returns  - The first element from the match.\n */\nexport function selectFirstElement(selector: string, context?: HTMLElement): HTMLElement | null {\n    const elementsSelected = selectElementsT<HTMLElement>(selector, context);\n    return !elementsSelected || !elementsSelected.length ? null : elementsSelected[0];\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ndeclare let window: any;\n\n/**\n * @name - XDomainRequest\n * @description - typescript declaration for XDomainRequest object.\n * @type {object}\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ndeclare let XDomainRequest: any;\n\n/**\n * PlayerUtilities class.\n * @classdesc - The PlayerOptions class is used to pass player options settings to the player.\n * It supplies default values which can be overridden via overrides passed to the constructor.\n */\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nexport class PlayerUtility {\n    /**\n     * @name - pendingAjaxRequests\n     * @description -  array to hold pending ajax requests.\n     * @private\n     * @static\n     * @returns {any}\n     */\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    private static readonly pendingAjaxRequests: any = [];\n\n    /**\n     * Gets request data using ajax call.\n     * @param url - Url from where to fetch data.\n     * @param done - On success callback function.\n     * @param failed - On failed callback function.\n     */\n    public static ajax(url: string, done: Function, failed?: Function): void {\n        if (!url) {\n            return;\n        }\n\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        let ajaxRequest: any = null;\n\n        // For IE 9 and below use XDomainRequest\n        if (window.XDomainRequest) {\n            ajaxRequest = new XDomainRequest();\n\n            ajaxRequest.addEventListener('load', () => {\n                done && done(ajaxRequest.responseText);\n                PlayerUtility._removeFromPendingAjaxRequests(ajaxRequest);\n            });\n\n            // IE8 and IE9 have a bug where garbage collector will clear XDomainRequest object\n            // before the call is completed. Thus add a reference to the object so that request\n            // is not aborted by garbage collector.\n            PlayerUtility.pendingAjaxRequests.push(ajaxRequest);\n        } else if (window.XMLHttpRequest) {\n            ajaxRequest = new XMLHttpRequest();\n\n            ajaxRequest.onreadystatechange = () => {\n                if (ajaxRequest.readyState === 4) {\n                    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                    let result: any = null;\n                    if (ajaxRequest.status === 200) {\n                        result = ajaxRequest.responseText;\n                    }\n                    done && done(result);\n                } else {\n                    // The following console.log useful for debugging and is left in commented out for easy restoration.\n                    // console.log('Localization-helper: readystate(' + xhttp.readyState + ') status(' + xhttp.status + ')');\n                }\n            };\n        }\n\n        // Attach common event handlers and make the request.\n        if (ajaxRequest) {\n            ajaxRequest.ontimeout = ajaxRequest.addEventListener('error', () => {\n                PlayerUtility._removeFromPendingAjaxRequests(ajaxRequest);\n                failed && failed();\n            });\n            ajaxRequest.open('GET', url, true);\n            ajaxRequest.send();\n        }\n    }\n\n    /**\n     * Removes object from array to hold pending ajax requests.\n     * @param obj - Object.\n     */\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    private static _removeFromPendingAjaxRequests(obj: any): void {\n        // When the call is completed remove it from the array\n        let index = -1;\n        for (let i = 0; i < PlayerUtility.pendingAjaxRequests.length; i++) {\n            if (obj === PlayerUtility.pendingAjaxRequests[i]) {\n                index = i;\n                break;\n            }\n        }\n        if (index >= 0) {\n            PlayerUtility.pendingAjaxRequests.splice(index, 1);\n        }\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 * Client Dimension Interface.\n */\nexport interface IClientDimension {\n    width: number;\n    height: number;\n}\n\n/**\n * Dictionary String Interface.\n */\nexport interface IDictionaryStringString {\n    [key: string]: string;\n}\n\n/**\n * @interface IGrid\n * @classdesc - The IGrid interface contract.\n */\nexport interface IGrid {\n    rows: number;\n    columns: number;\n}\n\n/**\n * Clamp position between a range.\n * @param value - Value to be clamped.\n * @param min - Minimum value in range.\n * @param max - Maximum value in range.\n * @returns The clap value if min passed is less than max else returns 0.\n */\nexport function clamp(value: number, min: number, max: number): number {\n    if (min <= max) {\n        return Math.min(Math.max(value, min), max);\n    }\n    return 0;\n}\n\n/**\n * Upper case the first letter of the string, if only one char exists on the string, uppercase it.\n * @param value - Value to be upper cased.\n * @returns The upper cased string of the passed value, if it has just one char uppercase it.\n */\nexport function toUpperCaseFirstChar(value: string): string {\n    if (value.length > 1) {\n        return value.charAt(0).toUpperCase() + value.substr(1);\n    }\n    if (value.length === 1) {\n        return value.charAt(0).toUpperCase();\n    }\n    return '';\n}\n\n/**\n * HTML collectio to Array.\n * @param nodeList - Html Collection.\n * @returns - An array of the HTML Element.\n */\nexport function htmlCollectionToArray(nodeList: HTMLCollection): HTMLElement[] {\n    return Array.prototype.slice.call(nodeList);\n}\n\n/**\n * Get CSS for the Element.\n * @param element - The HTML Element.\n * @param property - The HTML property.\n * @returns - The value of the required property.\n */\nexport function getCSS(element: HTMLElement, property: string): string {\n    let style = element.style[property];\n\n    if (!style) {\n        style = getComputedStyle(element)[property];\n    }\n\n    return style;\n}\n\n/**\n * Create Throttled Event.\n * @param listener - The Event Listener.\n * @param threshold - The threshold number.\n * @returns The event.\n */\nexport function createThrottledEvent(listener: EventListener, threshold: number): (event: Event) => void {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    let timer: any;\n    let last = 0;\n\n    return (event: Event) => {\n        const now = Date.now();\n\n        if (timer) {\n            clearTimeout(timer);\n            timer = undefined;\n        }\n\n        if (last && now < last + threshold) {\n            timer = setTimeout(() => {\n                last = Date.now();\n                listener(event);\n            }, threshold - (now - last));\n        } else {\n            last = now;\n            listener(event);\n        }\n    };\n}\n\n/**\n * Add the Throrrled Event.\n * @param target - Event Targer.\n * @param name - Name of the Event.\n * @param listener - The Event Listener.\n * @param threshold - The Threshold number.\n * @returns - Returns the Throttled Event.\n */\nexport function addThrottledEvent(\n    target: EventTarget,\n    name: string,\n    listener: EventListener,\n    threshold: number = 150\n): (event: Event) => void {\n    const throttledEventHandler = createThrottledEvent(listener, threshold);\n    target.addEventListener(name, throttledEventHandler, false);\n\n    return throttledEventHandler;\n}\n\n/**\n * Map the CSS to the modules.\n * @param className - Class name.\n * @param cssModule - CSS modules.\n * @returns - Returns the map CSS.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function mapToCssModules(className: string = '', cssModule: any): string {\n    if (!cssModule) {\n        return className;\n    }\n\n    return className\n        .split(' ')\n        .map((c: string) => cssModule[c] || c)\n        .join(' ');\n}\n\n/**\n * Check the raget object is reference.\n * @param target - Target object.\n * @returns Returns boolean.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isRef(target: any): boolean {\n    if (!target) {\n        return false;\n    }\n\n    return (<React.RefObject<HTMLElement>>target).current !== undefined;\n}\n\n/**\n * Check if the passed target is element.\n * @param target - Target element.\n * @returns Returns boolean.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isElement(target: any): boolean {\n    if (!target) {\n        return false;\n    }\n\n    return (<HTMLElement>target).addEventListener !== undefined;\n}\n\n/**\n * KeyCodes Enum.\n */\nexport const keyCodes = {\n    esc: 27,\n    space: 32,\n    tab: 9,\n    up: 38,\n    down: 40,\n    enter: 13\n};\n\n/**\n * Map Interface.\n */\ninterface IMap<T> {\n    [key: string]: T;\n}\nconst warned: IMap<boolean> = {};\n\n/**\n * Warn once.\n * @param message - Message to warned.\n */\nexport function warnOnce(message: string): void {\n    if (!warned[message]) {\n        if (typeof console !== 'undefined') {\n            throw new Error(message);\n        }\n        warned[message] = true;\n    }\n}\n\n/**\n * Can use DOM..\n */\nexport const canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n\n/**\n * Find the required DOM element.\n * @param target - Targert Dom Element.\n * @returns - The DOM Element or string or null.\n */\nexport function findDOMElements(target: string): NodeListOf<Element> | string | null {\n    try {\n        if (typeof target === 'string' && canUseDOM) {\n            let selection = document.querySelectorAll(target);\n\n            if (!selection.length) {\n                selection = document.querySelectorAll(`#${target}`);\n            }\n\n            if (!selection.length) {\n                throw new Error();\n            }\n            return selection;\n        }\n\n        return target;\n    } catch {\n        console.error(`The target '${target}' could not be identified in the dom, tip: check spelling`);\n        return null;\n    }\n}\n\n/**\n * Get the Target element.\n * @param target - Target Element.\n * @returns - Returns the HTMLElement or null or string.\n */\nexport function getTarget(target: string | HTMLElement | React.Ref<HTMLElement>): HTMLElement | React.Ref<HTMLElement> | null | string {\n    const selection = findDOMElements(<string>target);\n    if (selection && selection.length) {\n        return <HTMLElement>selection[0];\n    }\n\n    return target;\n}\n\n/**\n * Get the Target element.\n * @param target - Target Element.\n * @returns - Returns the HTMLElement or null or string.\n */\nexport function getTargetElement(target: string | HTMLElement | React.Ref<HTMLElement>): HTMLElement | null {\n    const targetElement = getTarget(target);\n    if (isRef(targetElement)) {\n        return (<React.RefObject<HTMLElement>>targetElement).current;\n    }\n    if (isElement(targetElement)) {\n        return <HTMLElement>targetElement;\n    }\n\n    return null;\n}\n\n/**\n * Transition Timeouts.\n */\nexport const TransitionTimeouts = {\n    Fade: 150,\n    Collapse: 350,\n    Modal: 300,\n    Carousel: 600\n};\n\n/**\n * Transition Statuses.\n */\nexport type TransitionStatuses = 'entering' | 'entered' | 'exiting' | 'exited';\n\n/**\n * Focusable Elements.\n */\nexport const focusableElements = [\n    'a[href]',\n    'area[href]',\n    'input:not([disabled]):not([type=hidden])',\n    'select:not([disabled])',\n    'textarea:not([disabled])',\n    'button:not([disabled])',\n    'iframe',\n    'object',\n    'embed',\n    '[tabindex]:not(.modal)',\n    'audio[controls]',\n    'video[controls]',\n    '[contenteditable]:not([contenteditable=\"false\"])'\n];\n\n/**\n * Extends an object with properties/values from one or more others.\n * @param parameters - The objects to merge together.\n * @returns - The extended object.\n */\n// eslint-disable-next-line complexity, @typescript-eslint/no-explicit-any\nexport function extend(...parameters: any[]): any {\n    if (!parameters || !parameters.length) {\n        return null;\n    }\n\n    const recursive = typeof parameters[0] === 'boolean' && parameters[0];\n\n    if (parameters.length < 2) {\n        return recursive ? null : parameters[0];\n    }\n\n    if (recursive && parameters.length < 3) {\n        return parameters[1];\n    }\n\n    const target = recursive ? parameters[1] : parameters[0];\n\n    for (let paramIndex = recursive ? 2 : 1; paramIndex < parameters.length; paramIndex++) {\n        if (parameters[paramIndex] !== undefined) {\n            for (const key of Object.keys(parameters[paramIndex])) {\n                if (parameters[paramIndex].hasOwnProperty(key)) {\n                    const source = parameters[paramIndex][key];\n\n                    if (recursive) {\n                        let isSourceArray = Array.isArray ? Array.isArray(source) : {}.toString.call(source) === '[object Array]';\n                        let isTargetArray =\n                            !!target[key] &&\n                            (Array.isArray ? Array.isArray(target[key]) : {}.toString.call(target[key]) === '[object Array]');\n                        let isSourceObject = !isSourceArray && typeof source === 'object';\n                        let isTargetObject = !isTargetArray && !!target[key] && typeof target[key] === 'object';\n\n                        if (isSourceArray && isTargetArray) {\n                            for (const [arrayIndex, element] of source.entries()) {\n                                isSourceArray = Array.isArray ? Array.isArray(element) : {}.toString.call(element) === '[object Array]';\n                                isTargetArray =\n                                    !!target[key][arrayIndex] &&\n                                    (Array.isArray\n                                        ? Array.isArray(target[key][arrayIndex])\n                                        : {}.toString.call(target[key][arrayIndex]) === '[object Array]');\n                                isSourceObject = !isSourceArray && typeof element === 'object';\n                                isTargetObject = !isTargetArray && !!target[key][arrayIndex] && typeof target[key][arrayIndex] === 'object';\n\n                                if (isSourceArray) {\n                                    target[key][arrayIndex] = extend(true, isTargetArray ? target[key][arrayIndex] : [], element);\n                                } else if (isSourceObject) {\n                                    target[key][arrayIndex] = extend(true, isTargetObject ? target[key][arrayIndex] : {}, element);\n                                } else {\n                                    target[key][arrayIndex] = element;\n                                }\n                            }\n                            continue;\n                        } else if (isSourceArray) {\n                            target[key] = extend(true, [], source);\n                            continue;\n                        } else if (isSourceObject) {\n                            target[key] = extend(true, isTargetObject ? target[key] : {}, source);\n                            continue;\n                        }\n                    }\n\n                    target[key] = source;\n                }\n            }\n        }\n    }\n\n    return target;\n}\n\n/**\n * Gets the dimension of an element.\n * @param containerElement - The container element.\n * @returns - {IClientDimension} - The client dimension.\n * {IClientDimension.width} - The client width.\n * {IClientDimension.height} - The client height.\n */\nexport function getDimensions(containerElement: HTMLElement): IClientDimension | null {\n    if (containerElement === null) {\n        return null;\n    }\n    return {\n        width: containerElement.clientWidth,\n        height: containerElement.clientHeight\n    };\n}\n\n/**\n * Check if the browser is Safari or not.\n * @returns Ture or false.\n */\nexport function isSafari(): boolean {\n    if (navigator.vendor && navigator.userAgent) {\n        return navigator.vendor.includes('Apple') && !navigator.userAgent.includes('CriOS') && !navigator.userAgent.includes('FxiOS');\n    }\n    return false;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { ProductPrice, ProductType, SalesAgreementPriceLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { Button, format, ICollapseProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nconst defaultPrice: number = 0;\nconst freePrice: number = 0;\n\n/**\n * Interface for price component resources.\n * @param {string} priceRangeSeparator - The price range separator.\n */\nexport interface IPriceComponentResources {\n    priceRangeSeparator?: string;\n    salesAgreementPricePrompt?: string;\n    salesAgreementExpirationDatePrompt?: string;\n    salesAgreementCommittedQuantityPrompt?: string;\n    salesAgreementRemainingQuantityPrompt?: string;\n}\n\n/**\n * Interface for price component props.\n * @param {boolean} isPriceMinMaxEnabled - Whether the price range feature is enabled or not.\n * @param {IPriceComponentResources} priceResources - The price range resources.\n */\nexport interface IPriceComponentProps extends IComponentProps<{ price: ProductPrice }> {\n    className?: string;\n    product?: SimpleProduct;\n    savingsText?: string;\n    freePriceText?: string;\n    originalPriceText?: string;\n    currentPriceText?: string;\n    isPriceMinMaxEnabled?: boolean;\n    isSalesAgreementPriceFeatureEnabled?: boolean;\n    salesAgreementLineId?: number;\n    priceResources?: IPriceComponentResources;\n    salesAgreementDetailCollapseProps?: ICollapseProps;\n    currencyCode?: string;\n    salesAgreementDetailOnClick?(event: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>): void;\n}\n\n/**\n * The interface of price component.\n */\nexport interface IPriceComponent extends IComponent<IPriceComponentProps> {}\n\nconst priceComponentActions = {};\n\n/**\n * Get the original price from price component props.\n * @param props - The IPriceComponentProps.\n * @returns The original price.\n */\nconst getOriginalPrice = (props: IPriceComponentProps): number => {\n    return props.data.price.AdjustedPrice ?? props.data.price.TradeAgreementPrice ?? props.data.price.BasePrice ?? defaultPrice;\n};\n\nconst getActivePrice = (props: IPriceComponentProps): number => {\n    if (showPriceRangeForMasterProduct(props) && props.data.price.MinVariantPrice !== undefined) {\n        return props.data.price.MinVariantPrice;\n    }\n\n    if (props.data.price.CustomerContextualPrice !== undefined) {\n        return props.data.price.CustomerContextualPrice;\n    }\n\n    return getOriginalPrice(props);\n};\n\n/**\n * Get the formatted currency.\n * @param props - The props.\n * @param price - The price.\n * @param shouldUseFreePriceText - The shouldUseFreePriceText.\n * @returns The formatted currency.\n */\nconst formatCurrency = (\n    props: IPriceComponentProps,\n    price: number | undefined,\n    shouldUseFreePriceText: boolean | undefined,\n    currencyCode?: string | undefined\n): string => {\n    if (price === undefined) {\n        return '';\n    }\n\n    if (shouldUseFreePriceText && price === freePrice && props.freePriceText) {\n        return props.freePriceText;\n    }\n\n    return props.context.cultureFormatter.formatCurrency(price, currencyCode);\n};\n\nconst showPriceRangeForMasterProduct = (props: IPriceComponentProps): boolean => {\n    return (\n        (props.isPriceMinMaxEnabled ?? false) &&\n        (props.product?.ProductTypeValue === ProductType.Master || props.product?.ProductTypeValue === ProductType.KitMaster) &&\n        props.data.price.MinVariantPrice !== undefined &&\n        props.data.price.MaxVariantPrice !== undefined\n    );\n};\n\n/**\n * ShowStrikethroughPricing.\n * @param props - The props.\n * @returns True if showStrikethroughPricing, false otherwise.\n */\nconst showStrikethroughPricing = (props: IPriceComponentProps): boolean => {\n    const originalSalesPrice = getOriginalPrice(props);\n    const activeSalesPrice = showPriceRangeForMasterProduct(props)\n        ? props.data.price.MinVariantPrice\n        : props.data.price.CustomerContextualPrice;\n\n    if (activeSalesPrice && originalSalesPrice) {\n        return activeSalesPrice < originalSalesPrice;\n    }\n\n    return false;\n};\n\n/**\n * Render current price.\n * @param props - The props.\n * @returns The JSX.Element.\n */\nconst renderCurrentPrice = (props: IPriceComponentProps): JSX.Element => {\n    const maxVariantPrice: string = formatCurrency(props, props.data.price.MaxVariantPrice, false, props.currencyCode);\n    const minVariantPrice: string = formatCurrency(props, props.data.price.MinVariantPrice, false, props.currencyCode);\n    if (\n        props.isPriceMinMaxEnabled &&\n        props.data.price.MaxVariantPrice &&\n        props.data.price.MinVariantPrice &&\n        props.data.price.MaxVariantPrice > props.data.price.MinVariantPrice\n    ) {\n        return (\n            <span className='msc-price__pricerange' itemProp='price'>\n                <span className='msc-price__minprice' itemProp='price'>\n                    {minVariantPrice}\n                </span>\n                <span className='msc-price__separator' itemProp='price'>\n                    {props.priceResources?.priceRangeSeparator}\n                </span>\n                <span className='msc-price__maxprice' itemProp='price'>\n                    {maxVariantPrice}\n                </span>\n            </span>\n        );\n    }\n\n    return (\n        <span className='msc-price__actual' itemProp='price'>\n            {formatCurrency(props, getActivePrice(props), true, props.currencyCode)}\n        </span>\n    );\n};\n\n/**\n * Render active sales price with original sales price.\n * @param props - The props.\n * @returns The JSX.Element.\n */\nconst renderCurrentPriceWithOriginalPrice = (props: IPriceComponentProps): JSX.Element => {\n    const initialPrice: string = formatCurrency(props, getOriginalPrice(props), true);\n\n    return (\n        <>\n            <span className='sr-only'>\n                {` `}\n                {props.originalPriceText}\n                {` `}\n                {initialPrice}\n                {` `}\n                {props.currentPriceText}\n                {` `}\n                {renderCurrentPrice(props)}\n            </span>\n            <span className='msc-price__strikethrough' aria-hidden='true'>\n                {initialPrice}\n                {` `}\n            </span>\n            <span aria-hidden='true'>{renderCurrentPrice(props)}</span>\n            {props.savingsText && <span className='msc-price__savings'>{props.savingsText}</span>}\n        </>\n    );\n};\n\nconst renderSalesAgreementDetail = (props: IPriceComponentProps): JSX.Element => {\n    // In most cases there should be only one sales agreement line.\n    // If there are more than one, only the first one will be shown.\n    const firstPriceLine: SalesAgreementPriceLine = (props.data.price.AttainablePriceLines ?? [])[0] as SalesAgreementPriceLine;\n    return (\n        <p className={classnames('msc-price__salesagreementdetail', props.className)}>\n            <p>\n                {/* Available date */}\n                {` · ${format(\n                    props.priceResources?.salesAgreementExpirationDatePrompt ?? '',\n                    props.context.cultureFormatter.formatDate(firstPriceLine.EffectiveDate as Date),\n                    props.context.cultureFormatter.formatDate(firstPriceLine.ExpirationDate as Date)\n                )}`}\n            </p>\n            <p>\n                {/* Quantity commitment */}\n                {` · ${format(props.priceResources?.salesAgreementCommittedQuantityPrompt ?? '', firstPriceLine.CommittedQuantity)}`}\n            </p>\n            <p>\n                {/* Remaining quantity to qualify */}\n                {` · ${format(props.priceResources?.salesAgreementRemainingQuantityPrompt ?? '', firstPriceLine.RemainingQuantity)}`}\n            </p>\n        </p>\n    );\n};\n\n/**\n * Price.\n * @param props - The props.\n * @returns The JSX.Element.\n */\nconst Price: React.FC<IPriceComponentProps> = (props: IPriceComponentProps): JSX.Element | null => {\n    // CustomerContextualPrice could be zero\n    if (props.data.price.CustomerContextualPrice === undefined) {\n        return null;\n    }\n\n    // Determine if contract price is avaiable/applied by:\n    //   isFeatureEnabled and SA price != 0, for PDP.\n    //   SA line id != 0, for cart line.\n    if (props.isSalesAgreementPriceFeatureEnabled && props.data.price.SalesAgreementPrice !== 0) {\n        const [isExpanded, setIsExpanded] = React.useState<boolean>(false);\n        const toggle = () => {\n            setIsExpanded(!isExpanded);\n        };\n        return (\n            <span className={classnames('msc-price', props.className)}>\n                <span className={classnames('msc-price__salesagreementprice', props.className)}>\n                    <p className='msc-price__actual' itemProp='price'>\n                        {formatCurrency(props, props.data.price.SalesAgreementPrice ?? props.data.price.CustomerContextualPrice, true)}\n                    </p>\n                    <Button\n                        className={isExpanded ? 'msc-price__salesagreementprompt_expanded' : 'msc-price__salesagreementprompt_collapsed'}\n                        aria-label={props.priceResources?.salesAgreementPricePrompt}\n                        onClick={toggle}\n                        aria-expanded={isExpanded}\n                        tabIndex={0}\n                    >\n                        {props.priceResources?.salesAgreementPricePrompt}\n                    </Button>\n                    {isExpanded && renderSalesAgreementDetail(props)}\n                </span>\n            </span>\n        );\n    }\n\n    return (\n        <span className={classnames('msc-price', props.className)}>\n            {showStrikethroughPricing(props) ? renderCurrentPriceWithOriginalPrice(props) : renderCurrentPrice(props)}\n        </span>\n    );\n};\n\n/**\n * The PriceComponent.\n */\nexport const PriceComponent: React.FunctionComponent<IPriceComponentProps> = msdyn365Commerce.createComponent<IPriceComponent>('Price', {\n    component: Price,\n    ...priceComponentActions\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 { ICoreContext, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport * as React from 'react';\n\nexport interface IOrderTemplateProductsPreviewComponentProps {\n    className: string;\n    products: FullProduct[];\n    context: ICoreContext;\n    imageSettings?: IImageSettings;\n}\n\nexport const OrderTemplateProductsPreviewComponent = (props: IOrderTemplateProductsPreviewComponentProps) => {\n    const { products, className, imageSettings } = props;\n\n    return (\n        <div className={`${className}__products`}>\n            {renderOrderTemplateImages(props.context, `${className}__products`, products, imageSettings)}\n        </div>\n    );\n};\n\nconst renderOrderTemplateImage = (context: ICoreContext, className: string, product: FullProduct, imageSettings?: IImageSettings) => {\n    const defaultImageSettings: IImageSettings = {\n        viewports: {\n            xs: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\n            lg: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\n            xl: { q: 'w=140&h=140&m=6', w: 0, h: 0 }\n        },\n        lazyload: true\n    };\n    return (\n        <div className={`${className}__image-props`}>\n            <Image\n                requestContext={context.actionContext.requestContext}\n                src={product.ProductDetails.PrimaryImageUrl ?? ''}\n                fallBackSrc={\n                    getFallbackImageUrl(\n                        product.ProductDetails.ItemId,\n                        context.actionContext.requestContext.apiSettings,\n                        context.request.app?.config?.OmniChannelMedia\n                    ) ?? ''\n                }\n                gridSettings={context.request.gridSettings!}\n                imageSettings={imageSettings ?? defaultImageSettings}\n                loadFailureBehavior='empty'\n                altText={product.ProductDetails.Name ?? 'image'}\n            />\n        </div>\n    );\n};\n\nconst renderOrderTemplateImages = (\n    context: ICoreContext,\n    className: string,\n    products: FullProduct[],\n    imageSettings?: IImageSettings\n): JSX.Element | null => {\n    return (\n        <div className={`${className}__image-container`}>\n            <div className='row'>\n                <div className='column'>\n                    {products.length > 0 && renderOrderTemplateImage(context, className, products[0], imageSettings)}\n                </div>\n                <div className='column'>\n                    {products.length > 1 && renderOrderTemplateImage(context, className, products[1], imageSettings)}\n                </div>\n            </div>\n            <div className='row'>\n                <div className='column'>\n                    {products.length > 2 && renderOrderTemplateImage(context, className, products[2], imageSettings)}\n                </div>\n                <div className='column'>\n                    {products.length > 3 && renderOrderTemplateImage(context, className, products[3], imageSettings)}\n                </div>\n            </div>\n        </div>\n    );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IPlayerResources } from '../data';\nimport { IDictionaryStringString } from '../utilities';\n\n/**\n * @name - ccCultureLocStrings\n * @description - The localized names for the close caption menu options.\n * @constant\n * @type {IDictionaryStringString}\n */\nexport const ccCultureLocStrings: IDictionaryStringString = {\n    'ar-ab': 'عربي',\n    'ar-xm': 'عربي',\n    'ar-ma': 'عربي',\n    'ar-sa': 'عربي',\n    'eu-es': 'Euskara',\n    'bg-bg': 'Български',\n    'ca-es': 'Català',\n    'zh-cn': '简体中文',\n    'zh-hk': '繁體中文',\n    'zh-tw': '繁體中文',\n    'hr-hr': 'Hrvatski',\n    'cs-cz': 'Čeština',\n    'da-dk': 'Dansk',\n    'nl-be': 'Nederlands',\n    'nl-nl': 'Nederlands',\n    'en-ab': 'English',\n    'en-aa': 'English',\n    'en-au': 'English',\n    'en-ca': 'English',\n    'en-eu': 'English',\n    'en-hk': 'English',\n    'en-in': 'English',\n    'en-id': 'English',\n    'en-ie': 'English',\n    'en-jm': 'English',\n    'en-my': 'English',\n    'en-nz': 'English',\n    'en-pk': 'English',\n    'en-ph': 'English',\n    'en-sg': 'English',\n    'en-za': 'English',\n    'en-tt': 'English',\n    'en-gb': 'English',\n    'en-us': 'English',\n    'et-ee': 'Eesti',\n    'fi-fi': 'Suomi',\n    'fr-ab': 'Français',\n    'fr-be': 'Français',\n    'fr-ca': 'Français',\n    'fr-fr': 'Français',\n    'fr-xf': 'Français',\n    'fr-ch': 'Français',\n    'gl-es': 'Galego',\n    'de-de': 'Deutsch',\n    'de-at': 'Deutsch',\n    'de-ch': 'Deutsch',\n    'el-gr': 'Ελληνικά',\n    'he-il': 'עברית',\n    'hi-in': 'हिंदी',\n    'hu-hu': 'Magyar',\n    'is-is': 'Íslenska',\n    'id-id': 'Bahasa Indonesia',\n    'it-it': 'Italiano',\n    'ja-jp': '日本語',\n    'kk-kz': 'Қазақ',\n    'ko-kr': '한국어',\n    'lv-lv': 'Latviešu',\n    'lt-lt': 'Lietuvių',\n    'ms-my': 'Bahasa Melayu (Asia Tenggara)‎',\n    'nb-no': 'Norsk (bokmål)',\n    'nn-no': 'Norsk (nynorsk)',\n    'fa-ir': 'فارسی',\n    'pl-pl': 'Polski',\n    'pt-br': 'Português (Brasil)‎',\n    'pt-pt': 'Português (Portugal)‎',\n    'ro-ro': 'Română',\n    'ru-ru': 'Русский',\n    'sr-latn-rs': 'Srpski',\n    'sk-sk': 'Slovenčina',\n    'sl-si': 'Slovenski',\n    'es-ar': 'Español',\n    'es-cl': 'Español',\n    'es-co': 'Español',\n    'es-cr': 'Español',\n    'es-do': 'Español',\n    'es-ec': 'Español',\n    'es-us': 'Español',\n    'es-gt': 'Español',\n    'es-hn': 'Español',\n    'es-xl': 'Español',\n    'es-mx': 'Español',\n    'es-ni': 'Español',\n    'es-pa': 'Español',\n    'es-py': 'Español',\n    'es-pe': 'Español',\n    'es-pr': 'Español',\n    'es-es': 'Español',\n    'es-uy': 'Español',\n    'es-ve': 'Español',\n    'sv-se': 'Svenska',\n    'tl-ph': 'Tagalog',\n    'th-th': 'ไทย',\n    'tr-tr': 'Türkçe',\n    'uk-ua': 'Українська',\n    'ur-pk': 'اردو',\n    'vi-vn': 'Tiếng Việt'\n};\n\n/**\n * @name - ccLanguageCodes\n * @description - The 2 character language codes for use with the lang attribute .\n * @constant\n * @type {IDictionaryStringString}\n */\nexport const ccLanguageCodes: IDictionaryStringString = {\n    'ar-ab': 'ar',\n    'ar-xm': 'ar',\n    'ar-ma': 'ar',\n    'ar-sa': 'ar',\n    'eu-es': 'eu',\n    'bg-bg': 'bg',\n    'ca-es': 'ca',\n    'zh-cn': 'zh',\n    'zh-hk': 'zh',\n    'zh-tw': 'zh',\n    'hr-hr': 'hr',\n    'cs-cz': 'cs',\n    'da-dk': 'da',\n    'nl-be': 'nl',\n    'nl-nl': 'nl',\n    'en-ab': 'en',\n    'en-aa': 'en',\n    'en-au': 'en',\n    'en-ca': 'en',\n    'en-eu': 'en',\n    'en-hk': 'en',\n    'en-in': 'en',\n    'en-id': 'en',\n    'en-ie': 'en',\n    'en-jm': 'en',\n    'en-my': 'en',\n    'en-nz': 'en',\n    'en-pk': 'en',\n    'en-ph': 'en',\n    'en-sg': 'en',\n    'en-za': 'en',\n    'en-tt': 'en',\n    'en-gb': 'en',\n    'en-us': 'en',\n    'et-ee': 'et',\n    'fi-fi': 'fi',\n    'fr-ab': 'fr',\n    'fr-be': 'fr',\n    'fr-ca': 'fr',\n    'fr-fr': 'fr',\n    'fr-xf': 'fr',\n    'fr-ch': 'fr',\n    'gl-es': 'gl',\n    'de-de': 'de',\n    'de-at': 'de',\n    'de-ch': 'de',\n    'el-gr': 'el',\n    'he-il': 'he',\n    'hi-in': 'hi',\n    'hu-hu': 'hu',\n    'is-is': 'is',\n    'id-id': 'id',\n    'it-it': 'it',\n    'ja-jp': 'ja',\n    'kk-kz': 'kk',\n    'ko-kr': 'ko',\n    'lv-lv': 'lv',\n    'lt-lt': 'lt',\n    'ms-my': 'ms‎',\n    'nb-no': 'nb',\n    'nn-no': 'nn',\n    'fa-ir': 'fa',\n    'pl-pl': 'pl',\n    'pt-br': 'pt‎',\n    'pt-pt': 'pt‎',\n    'ro-ro': 'ro',\n    'ru-ru': 'ru',\n    'sr-latn-rs': 'sr',\n    'sk-sk': 'sk',\n    'sl-si': 'sl',\n    'es-ar': 'es',\n    'es-cl': 'es',\n    'es-co': 'es',\n    'es-cr': 'es',\n    'es-do': 'es',\n    'es-ec': 'es',\n    'es-us': 'es',\n    'es-gt': 'es',\n    'es-hn': 'es',\n    'es-xl': 'es',\n    'es-mx': 'es',\n    'es-ni': 'es',\n    'es-pa': 'es',\n    'es-py': 'es',\n    'es-pe': 'es',\n    'es-pr': 'es',\n    'es-es': 'es',\n    'es-uy': 'es',\n    'es-ve': 'es',\n    'sv-se': 'sv',\n    'tl-ph': 'tl',\n    'th-th': 'th',\n    'tr-tr': 'tr',\n    'uk-ua': 'uk',\n    'ur-pk': 'ur',\n    'vi-vn': 'vi'\n};\n\n/**\n * @name - playerLocKeys\n * @description - Key names to get localized values.\n * @constant\n */\nexport const PlayerLocKeys = {\n    audio_tracks: 'audio_tracks',\n    closecaption_off: 'closecaption_off',\n    audio_tracks_default: 'audio_tracks_default',\n    geolocation_error: 'geolocation_error',\n    media_err_aborted: 'media_err_aborted',\n    media_err_decode: 'media_err_decode',\n    media_err_network: 'media_err_network',\n    media_err_src_not_supported: 'media_err_src_not_supported',\n    media_err_unknown_error: 'media_err_unknown_error',\n    media_err_amp_encrypt: 'media_err_amp_encrypt',\n    media_err_amp_player_mismatch: 'media_err_amp_player_mismatch',\n    browserunsupported: 'browserunsupported',\n    browserunsupported_download: 'browserunsupported_download',\n    expand: 'expand',\n    mute: 'mute',\n    nullvideoerror: 'nullvideoerror',\n    pause: 'pause',\n    play: 'play',\n    play_video: 'play_video',\n    playing: 'playing',\n    paused: 'paused',\n    play_pause_button_tooltip: 'play_pause_button_tooltip',\n    live_caption: 'live_caption',\n    live_label: 'live_label',\n    playbackerror: 'playbackerror',\n    standarderror: 'standarderror',\n    time: 'time',\n    more_caption: 'more_caption',\n    data_error: 'data_error',\n    seek: 'seek',\n    unexpand: 'unexpand',\n    unmute: 'unmute',\n    volume: 'volume',\n    quality: 'quality',\n    quality_hd: 'quality_hd',\n    quality_hq: 'quality_hq',\n    quality_lo: 'quality_lo',\n    quality_sd: 'quality_sd',\n    quality_auto: 'quality_auto',\n    cc_customize: 'cc_customize',\n    cc_text_font: 'cc_text_font',\n    cc_text_color: 'cc_text_color',\n    cc_color_black: 'cc_color_black',\n    cc_color_blue: 'cc_color_blue',\n    cc_color_cyan: 'cc_color_cyan',\n    cc_color_green: 'cc_color_green',\n    cc_color_grey: 'cc_color_grey',\n    cc_color_magenta: 'cc_color_magenta',\n    cc_color_red: 'cc_color_red',\n    cc_color_white: 'cc_color_white',\n    cc_color_yellow: 'cc_color_yellow',\n    cc_font_name_casual: 'cc_font_name_casual',\n    cc_font_name_cursive: 'cc_font_name_cursive',\n    cc_font_name_monospacedsansserif: 'cc_font_name_monospacedsansserif',\n    cc_font_name_proportionalsansserif: 'cc_font_name_proportionalsansserif',\n    cc_font_name_monospacedserif: 'cc_font_name_monospacedserif',\n    cc_font_name_proportionalserif: 'cc_font_name_proportionalserif',\n    cc_font_name_smallcapitals: 'cc_font_name_smallcapitals',\n    cc_text_size: 'cc_text_size',\n    cc_text_size_default: 'cc_text_size_default',\n    cc_text_size_extralarge: 'cc_text_size_extralarge',\n    cc_text_size_large: 'cc_text_size_large',\n    cc_text_size_maximum: 'cc_text_size_maximum',\n    cc_text_size_small: 'cc_text_size_small',\n    cc_appearance: 'cc_appearance',\n    cc_preset1: 'cc_preset1',\n    cc_preset2: 'cc_preset2',\n    cc_preset3: 'cc_preset3',\n    cc_preset4: 'cc_preset4',\n    cc_preset5: 'cc_preset5',\n    cc_presettings: 'cc_presettings',\n    cc_text_background_color: 'cc_text_background_color',\n    cc_text_background_opacity: 'cc_text_background_opacity',\n    cc_text_opacity: 'cc_text_opacity',\n    cc_percent_0: 'cc_percent_0',\n    cc_percent_100: 'cc_percent_100',\n    cc_percent_25: 'cc_percent_25',\n    cc_percent_50: 'cc_percent_50',\n    cc_percent_75: 'cc_percent_75',\n    cc_text_edge_color: 'cc_text_edge_color',\n    cc_text_edge_style: 'cc_text_edge_style',\n    cc_text_edge_style_depressed: 'cc_text_edge_style_depressed',\n    cc_text_edge_style_dropshadow: 'cc_text_edge_style_dropshadow',\n    cc_text_edge_style_none: 'cc_text_edge_style_none',\n    cc_text_edge_style_raised: 'cc_text_edge_style_raised',\n    cc_text_edge_style_uniform: 'cc_text_edge_style_uniform',\n    cc_window_color: 'cc_window_color',\n    cc_window_opacity: 'cc_window_opacity',\n    cc_reset: 'cc_reset',\n    closecaption: 'closecaption',\n    close_text: 'close_text',\n    playbackspeed: 'playbackspeed',\n    playbackspeed_normal: 'playbackspeed_normal',\n    sharing_label: 'sharing_label',\n    sharing_facebook: 'sharing_facebook',\n    sharing_twitter: 'sharing_twitter',\n    sharing_linkedin: 'sharing_linkedin',\n    sharing_skype: 'sharing_skype',\n    sharing_mail: 'sharing_mail',\n    sharing_copy: 'sharing_copy',\n    loading_value_text: 'loading_value_text',\n    loading_aria_label: 'loading_aria_label',\n    descriptive_audio: 'descriptive_audio',\n    unknown_language: 'unknown_language',\n    download_label: 'download_label',\n    download_transcript: 'download_transcript',\n    download_audio: 'download_audio',\n    download_video: 'download_video',\n    download_videoWithCC: 'download_videoWithCC',\n    agegate_day: 'agegate_day',\n    agegate_month: 'agegate_month',\n    agegate_year: 'agegate_year',\n    agegate_enterdate: 'agegate_enterdate',\n    agegate_enterdate_arialabel: 'agegate_enterdate_arialabel',\n    agegate_fail: 'agegate_fail',\n    agegate_verifyyourage: 'agegate_verifyyourage',\n    agegate_submit: 'agegate_submit',\n    agegate_dateorder: 'agegate_dateorder',\n    previous_menu_aria_label: 'previous_menu_aria_label',\n    reactive_menu_aria_label: 'reactive_menu_aria_label',\n    reactive_menu_aria_label_closedcaption: 'reactive_menu_aria_label_closedcaption',\n    interactivity_show: 'interactivity_show',\n    interactivity_hide: 'interactivity_hide'\n};\n\n/**\n * Localization Constants.\n */\nexport const LocalizationConstants = {\n    playVideoAriaLabel: 'play video',\n    playAriaLabel: 'play',\n    pauseAriaLabel: 'pause',\n    closeAriaLabel: 'close',\n    optionAriaLabel: 'More options',\n    muteAriaLabel: 'mute',\n    unMuteAriaLabel: 'unmute',\n    fullScreenAriaLabel: 'full screen',\n    exitFullScreenAriaLabel: 'exit full screen',\n    playingAriaLabel: 'paying',\n    pausedAriaLabel: 'paused',\n    seekBarLabel: 'Seek bar',\n    sliderThumbLabel: 'Slider thumb',\n    volumeThumbLabel: 'Volume thumb',\n    videoTimeDurationLabel: 'Video time duration',\n    closedCaptionLabel: 'Closed caption',\n    audio_tracks: 'Audio Tracks',\n    descriptive_audio: 'Audio descriptions',\n    closecaption_off: 'Off',\n    audio_tracks_default: 'Default Track',\n    cc_customize: 'Customize',\n    cc_text_font: 'Font',\n    cc_text_color: 'Text color',\n    cc_color_black: 'Black',\n    cc_color_blue: 'Blue',\n    cc_color_cyan: 'Cyan',\n    cc_color_green: 'Green',\n    cc_color_grey: 'Grey',\n    cc_color_magenta: 'Magenta',\n    cc_color_red: 'Red',\n    cc_color_white: 'White',\n    cc_color_yellow: 'Yellow',\n    cc_font_name_casual: 'Casual',\n    cc_font_name_cursive: 'Cursive',\n    cc_font_name_monospacedsansserif: 'Monospaced Sans Serif',\n    cc_font_name_monospacedserif: 'Monospaced Serif',\n    cc_font_name_proportionalserif: 'Proportional Serif',\n    cc_font_name_proportionalsansserif: 'Proportional Sans Serif',\n    cc_font_name_smallcapitals: 'Small Capitals',\n    cc_text_size: 'Text size',\n    cc_text_size_default: 'Default',\n    cc_text_size_extralarge: 'Extra Large',\n    cc_text_size_large: 'Large',\n    cc_text_size_maximum: 'Maximum',\n    cc_text_size_small: 'Small',\n    cc_appearance: 'Appearance',\n    cc_preset1: 'Preset 1 ',\n    cc_preset2: 'Preset 2',\n    cc_preset3: 'Preset 3',\n    cc_preset4: 'Preset 4',\n    cc_preset5: 'Preset 5',\n    cc_presettings: 'Close captions appearance {0}: ({1}:{2}, {3}:{4})',\n    cc_text_background_color: 'Background color',\n    cc_text_background_opacity: 'Background opacity',\n    cc_text_opacity: 'Text opacity',\n    cc_percent_0: '0%',\n    cc_percent_100: '100%',\n    cc_percent_25: '25%',\n    cc_percent_50: '50%',\n    cc_percent_75: '75%',\n    cc_text_edge_color: 'Text edge color',\n    cc_text_edge_style: 'Text edge style',\n    cc_text_edge_style_depressed: 'Depressed',\n    cc_text_edge_style_dropshadow: 'Drop shadow',\n    cc_text_edge_style_none: 'No edge',\n    cc_text_edge_style_raised: 'Raised',\n    cc_text_edge_style_uniform: 'Uniform',\n    cc_window_color: 'Window color',\n    cc_window_opacity: 'Window opacity',\n    cc_reset: 'Reset'\n};\n\n/**\n *\n * Closed Caption helper class.\n *\n */\nexport default class LocalizationHelper {\n    private readonly playerResources: IPlayerResources;\n\n    public constructor(props: IPlayerResources) {\n        this.playerResources = props;\n    }\n\n    /**\n     * Gets the localized value for given key.\n     * @param key - The key to look for.\n     * @returns The localization string.\n     */\n    public getLocalizedValue(key: string): string {\n        return this.playerResources[key] || LocalizationConstants[key] || '';\n    }\n\n    /**\n     * Converts from a locale ID to a 2 character language code.\n     * @public\n     * @param locale - Locale ID string.\n     * @returns The localization string.\n     */\n    public getLanguageCodeFromLocale(locale: string): string {\n        return ccLanguageCodes[locale] || '';\n    }\n\n    /**\n     * Converts from language ID or locale name to a localized language name.\n     * @public\n     * @param locale - Language ID string or locale name string.\n     * @returns Language Name from locale.\n     */\n    public getLanguageNameFromLocale(locale: string): string {\n        return ccCultureLocStrings[locale] || this.getLocalizedValue(PlayerLocKeys.unknown_language);\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    closedCaptionsPresetMap,\n    closedCaptionsSettingsMap,\n    closedCaptionsSettingsOptions,\n    videoClosedCaptionsConstant\n} from '../closed-captions';\nimport { ClosedCaptionTypes, ICurrentClosedCaptionsSettings, IPlayerMenu, IPlayerMenuItem, IVideoMetadata, MenuCategories } from '../data';\nimport { format } from '../utilities';\nimport LocalizationHelper, { ccCultureLocStrings, PlayerLocKeys } from './localization-helper';\nimport PlayerHelper from './player-helper';\n\n/**\n *\n * Closed Caption helper class.\n *\n */\nexport default class ClosedCaptionHelper {\n    private readonly playerMetaData: IVideoMetadata;\n\n    private readonly playerHelper: PlayerHelper;\n\n    private readonly localizationHelper: LocalizationHelper;\n\n    public constructor(props: IVideoMetadata, playerHelper: PlayerHelper, localizationHelper: LocalizationHelper) {\n        this.playerMetaData = props;\n        this.playerHelper = playerHelper;\n        this.localizationHelper = localizationHelper;\n    }\n\n    public checkClosedCaptionsFiles(): boolean {\n        if (this.playerMetaData.ccFiles && this.playerMetaData.ccFiles.length > 0) {\n            return true;\n        }\n        return false;\n    }\n\n    public getClosedCaptionMenu(): IPlayerMenu | null {\n        if (this.playerMetaData.ccFiles && this.playerMetaData.ccFiles.length > 0) {\n            const ccFiles = this.playerMetaData.ccFiles;\n\n            const ccMenuItems: IPlayerMenuItem[] = [];\n\n            for (const ccFile of ccFiles) {\n                // If ccType is not provided we default to TTML\n                if (!ccFile.ccType || ccFile.ccType === ClosedCaptionTypes.TTML) {\n                    const lang = this.localizationHelper.getLanguageCodeFromLocale(ccFile.locale.toLowerCase());\n\n                    const ccMenuItem: IPlayerMenuItem = {\n                        id: this.playerHelper.addIdPrefix(ccFile.locale),\n                        label: ccCultureLocStrings[ccFile.locale],\n                        language: lang,\n                        data: ccFile.locale,\n                        selected: false,\n                        selectable: true,\n                        persistOnClick: true,\n                        ariaLabel: `${ccCultureLocStrings[ccFile.locale]} ${this.localizationHelper.getLocalizedValue(\n                            PlayerLocKeys.closecaption\n                        )}`\n                    };\n                    ccMenuItems.push(ccMenuItem);\n                }\n            }\n\n            ccMenuItems.push({\n                id: this.playerHelper.addIdPrefix('appearance'),\n                label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.cc_appearance),\n                selected: false,\n                selectable: false,\n                subMenu: this._getClosedCaptionsSettingsMenu()\n            });\n\n            // Add 'off' option to the top of the list\n            ccMenuItems.unshift({\n                id: this.playerHelper.addIdPrefix('off'),\n                label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.closecaption_off),\n                selected: false,\n                data: 'off',\n                selectable: true,\n                persistOnClick: true,\n                ariaLabel: `${this.localizationHelper.getLocalizedValue(\n                    PlayerLocKeys.closecaption_off\n                )} ${this.localizationHelper.getLocalizedValue(PlayerLocKeys.closecaption)}`\n            });\n\n            return {\n                category: MenuCategories.ClosedCaption,\n                id: this.playerHelper.addIdPrefix(MenuCategories.ClosedCaption),\n                label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.closecaption),\n                items: ccMenuItems\n            };\n        }\n        return null;\n    }\n\n    public getUpdatedClosedCaptionSetting(\n        currentClosedCaptionsSetting: ICurrentClosedCaptionsSettings,\n        settingKey: string,\n        optionKey: string\n    ): ICurrentClosedCaptionsSettings {\n        if (settingKey === videoClosedCaptionsConstant.presetKey) {\n            const presetValue = closedCaptionsPresetMap[optionKey];\n\n            return {\n                window_color: currentClosedCaptionsSetting.window_color,\n                window_opacity: currentClosedCaptionsSetting.window_opacity,\n                text_background_color: presetValue.text_background_color,\n                text_background_opacity: presetValue.text_background_opacity,\n                text_color: presetValue.text_color,\n                text_edge_style: presetValue.text_edge_style,\n                text_font: presetValue.text_font,\n                text_opacity: presetValue.text_opacity,\n                text_size: presetValue.text_size,\n                preset: optionKey\n            };\n        }\n        if (this._getOptionValue(settingKey, optionKey)) {\n            currentClosedCaptionsSetting[videoClosedCaptionsConstant.presetKey] = 'none';\n            currentClosedCaptionsSetting[settingKey] = optionKey;\n            return currentClosedCaptionsSetting;\n        }\n        return currentClosedCaptionsSetting;\n    }\n\n    /**\n     * Gets the value of closed captions URL from the locale.\n     * @param locale - Locale.\n     * @returns Returns the closed caption URL.\n     */\n    public getClosedCaptionURLFromLocale(locale: string): string {\n        let url: string = '';\n        const ccFiles = this.playerMetaData.ccFiles!;\n        for (const ccFile of ccFiles) {\n            if (ccFile.locale === locale) {\n                url = ccFile.url;\n            }\n        }\n        return url;\n    }\n\n    /**\n     * Gets the value of closed captions settings option.\n     * @private\n     * @param settingKey - The closed ceptions settings key.\n     * @param optionKey - The closed captions option key.\n     * @returns - The option value.\n     */\n    private _getOptionValue(settingKey: string, optionKey: string): string {\n        const setting = closedCaptionsSettingsMap[settingKey];\n        if (setting) {\n            const option = closedCaptionsSettingsOptions[setting.option];\n            return option && option.map[optionKey];\n        }\n        return '';\n    }\n\n    /**\n     * Gets the closed captions settings menu to be added to options menu.\n     * @returns - The player menu.\n     */\n    private _getClosedCaptionsSettingsMenu(): IPlayerMenu {\n        // Const currentSettings = currentClosedCaptionsSetting;\n\n        // create customize settings menu\n        const settingsMenuItems: IPlayerMenuItem[] = [];\n\n        for (const settingKey of Object.keys(closedCaptionsSettingsMap)) {\n            const setting = closedCaptionsSettingsMap[settingKey];\n\n            const option = closedCaptionsSettingsOptions[setting.option];\n            const optionMenuItem: IPlayerMenuItem[] = [];\n\n            // eslint-disable-next-line guard-for-in\n            for (const optionKey in option.map) {\n                optionMenuItem.push({\n                    id: this._getCCMenuItemId(settingKey, optionKey),\n                    label: this.localizationHelper.getLocalizedValue(`${option.pre}${optionKey}`),\n                    selectable: true,\n                    selected: false,\n                    persistOnClick: true,\n                    data: `${settingKey}:${optionKey}`\n                });\n            }\n\n            // Add back button\n            optionMenuItem.unshift({\n                id: '',\n                label: this.localizationHelper.getLocalizedValue(`cc_${settingKey}`),\n                ariaLabel: `${settingKey} - go back to previous menu`,\n                selectable: false,\n                selected: false,\n                persistOnClick: false,\n                isBackButton: true\n            });\n\n            settingsMenuItems.push({\n                id: this.playerHelper.addIdPrefix(`${settingKey}_item`),\n                label: this.localizationHelper.getLocalizedValue(`cc_${settingKey}`),\n                selectable: false,\n                subMenu: {\n                    id: this._getCCSettingsMenuId(settingKey),\n                    category: MenuCategories.ClosedCaptionSettings,\n                    items: optionMenuItem,\n                    label: this.localizationHelper.getLocalizedValue(`cc_${settingKey}`)\n                }\n            });\n        }\n\n        settingsMenuItems.unshift({\n            id: '',\n            label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.cc_customize),\n            ariaLabel: 'Customize - go back to previous menu',\n            selectable: false,\n            selected: false,\n            persistOnClick: false,\n            isBackButton: true\n        });\n\n        const settingsMenu: IPlayerMenu = {\n            id: this.playerHelper.addIdPrefix(MenuCategories.ClosedCaptionSettings),\n            label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.cc_customize),\n            category: MenuCategories.ClosedCaptionSettings,\n            items: settingsMenuItems\n        };\n\n        // Create preset items menu\n        const presetItems: IPlayerMenuItem[] = [];\n\n        for (const preset of Object.keys(closedCaptionsPresetMap)) {\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            const presetSetting: any = closedCaptionsPresetMap[preset];\n            const font: string = presetSetting.text_font;\n            const color: string = presetSetting.text_color;\n\n            const ariaLabelValue = format(\n                this.localizationHelper.getLocalizedValue(PlayerLocKeys.cc_presettings),\n                '',\n                this.localizationHelper.getLocalizedValue(PlayerLocKeys.cc_text_font),\n                this.localizationHelper.getLocalizedValue(`cc_font_name_${font}`),\n                this.localizationHelper.getLocalizedValue(PlayerLocKeys.cc_text_color),\n                this.localizationHelper.getLocalizedValue(`cc_color_${color}`)\n            );\n\n            presetItems.push({\n                id: this._getCCMenuItemId(videoClosedCaptionsConstant.presetKey, preset),\n                label: this.localizationHelper.getLocalizedValue(`cc_${preset}`),\n                data: `preset:${preset}`,\n                selectable: true,\n                selected: false,\n                persistOnClick: true,\n                ariaLabel: ariaLabelValue,\n                hasMouseHoverEvents: true\n            });\n        }\n\n        presetItems.push({\n            id: this.playerHelper.addIdPrefix('cc-customize'),\n            label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.cc_customize),\n            subMenu: settingsMenu,\n            hasMouseHoverEvents: true\n        });\n\n        presetItems.push({\n            id: 'reset',\n            label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.cc_reset),\n            data: 'reset',\n            persistOnClick: true,\n            hasMouseHoverEvents: true\n        });\n\n        presetItems.unshift({\n            id: '',\n            label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.cc_appearance),\n            ariaLabel: 'Appreance - go back to previous menu',\n            selectable: false,\n            selected: false,\n            persistOnClick: false,\n            isBackButton: true,\n            hasMouseHoverEvents: true\n        });\n\n        return {\n            id: this._getCCSettingsMenuId(videoClosedCaptionsConstant.presetKey),\n            label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.cc_appearance),\n            category: MenuCategories.ClosedCaptionSettings,\n            items: presetItems\n        };\n    }\n\n    /**\n     * Gets the close captions setting menu item id.\n     * @param settingId - The setting key.\n     * @param optionId - The option key.\n     * @returns - Menu Id.\n     */\n    private _getCCMenuItemId(settingId: string, optionId: string): string {\n        return this.playerHelper.addIdPrefix(`cc-${settingId}-${optionId}`);\n    }\n\n    /**\n     * Gets the close captions setting menu id.\n     * @param settingId - The setting key.\n     * @returns Setting menu Id.\n     */\n    private _getCCSettingsMenuId(settingId: string): string {\n        return this.playerHelper.addIdPrefix(`cc-${settingId}`);\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    ClosedCaptionTypes,\n    IAudioTrack,\n    IBinaryReference,\n    ICCFile,\n    IPlayerMenu,\n    IPlayerMenuItem,\n    IPlayerProps,\n    IVideoFile,\n    IVideoMetadata,\n    MediaQuality,\n    MediaTypes,\n    MenuCategories,\n    PlayerConstants\n} from '../data';\nimport { startsWith } from '../utilities';\nimport LocalizationHelper, { PlayerLocKeys } from './localization-helper';\n\n/**\n *\n * Player helper class.\n *\n */\nexport default class PlayerHelper {\n    private playerProps: IPlayerProps;\n\n    private readonly localizationHelper: LocalizationHelper;\n\n    private readonly _isMobileDevice?: boolean;\n\n    public constructor(props: IPlayerProps, localizationHelper: LocalizationHelper, isMobileDevice?: boolean) {\n        this.playerProps = props;\n        this.localizationHelper = localizationHelper;\n        this._isMobileDevice = isMobileDevice;\n    }\n\n    public getMetadata(): IVideoMetadata {\n        this._mapVideoFiles();\n        this._setCCFiles();\n        this._setAudioTracks();\n        return this.playerProps.playerData.metaData;\n    }\n\n    public updatePlayerProps(props: IPlayerProps): void {\n        this.playerProps = props;\n        this._clearVideoPlayerMetaData();\n    }\n\n    public getOptionMenu(): IPlayerMenu | null {\n        const audioTracks = this._getAudioTracksMenu();\n        if (audioTracks === null) {\n            return null;\n        }\n        const optionMenuItems: IPlayerMenuItem[] = [];\n\n        optionMenuItems.push({\n            id: this.addIdPrefix('audioTracks'),\n            label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.audio_tracks),\n            selected: false,\n            selectable: false,\n            subMenu: audioTracks\n        });\n\n        return {\n            category: MenuCategories.Options,\n            id: this.addIdPrefix(MenuCategories.Options),\n            label: 'Options',\n            items: optionMenuItems\n        };\n    }\n\n    /**\n     * Get Poster Frame URL.\n     * @returns Returns the poster image URL.\n     */\n    public getPosterFrameUrl(): string {\n        let posterFrameUrl = '';\n        if (!this.playerProps.playerData.options.hidePosterFrame && this.playerProps.playerData.metaData.posterframeUrl) {\n            posterFrameUrl = this._removeProtocolFromUrl(this.playerProps.playerData.metaData.posterframeUrl);\n            if (this.playerProps.playerData.options.thumbnailFullWidth) {\n                if (posterFrameUrl.indexOf('?') > 0) {\n                    posterFrameUrl = `${posterFrameUrl}${'&w='}${PlayerConstants.thumbnailFullWidth}${'&h='}${\n                        PlayerConstants.thumbnailFullHeight\n                    }`;\n                } else {\n                    posterFrameUrl = `${posterFrameUrl}${'?w='}${PlayerConstants.thumbnailFullWidth}${'&h='}${\n                        PlayerConstants.thumbnailFullHeight\n                    }`;\n                }\n            }\n        }\n        return posterFrameUrl;\n    }\n\n    public getVideoFileToPlay(): IVideoFile {\n        let videoFile: IVideoFile = {\n            url: '',\n            mediaType: MediaTypes.MP4,\n            quality: MediaQuality.LO\n        };\n        const videoMetaData: IVideoMetadata = this.playerProps.playerData.metaData;\n\n        const mpVideoFiles = this._getVideoFileByType(MediaTypes.MP4, videoMetaData.videoFiles!);\n\n        if (this._isMobileDevice && this.playerProps.playerData.options.mobileVideoQuality) {\n            const mobileVideoFile = this._getVideoFileByQuality(\n                this.playerProps.playerData.options.mobileVideoQuality.toUpperCase() as MediaQuality,\n                mpVideoFiles\n            );\n            if (mobileVideoFile) {\n                return mobileVideoFile;\n            }\n        }\n\n        const hdVideoFile = this._getVideoFileByQuality(MediaQuality.HDX, mpVideoFiles);\n        if (hdVideoFile !== null) {\n            videoFile = hdVideoFile;\n        } else {\n            const hqVideoFile = this._getVideoFileByQuality(MediaQuality.HQ, mpVideoFiles);\n            if (hqVideoFile !== null) {\n                videoFile = hqVideoFile;\n            } else {\n                const sdVideoFile = this._getVideoFileByQuality(MediaQuality.SD, mpVideoFiles);\n                if (sdVideoFile !== null) {\n                    videoFile = sdVideoFile;\n                } else {\n                    const loVideoFile = this._getVideoFileByQuality(MediaQuality.LO, mpVideoFiles);\n                    if (loVideoFile !== null) {\n                        videoFile = loVideoFile;\n                    }\n                }\n            }\n        }\n        return videoFile;\n    }\n\n    /**\n     * Callback function when error happen.\n     * @param errorType - Error Type.\n     * @param message - Error message.\n     */\n    public onErrorCallback = (errorType: string, message: string): void => {\n        console.log(`ErrorType : ${errorType}, Message : ${message}`);\n    };\n\n    public isEmptyOrUndefined(value?: string): boolean {\n        if (value === undefined || value === '') {\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * Adds the id prefix to form a child id.\n     * @param childId - The child id to prefix.\n     * @returns - The prefixed id or the original id if no prefix is built.\n     */\n    public addIdPrefix(childId: string): string {\n        const prefix = this.isEmptyOrUndefined(this.playerProps.playerId) ? null : `${this.playerProps.playerId}-`;\n\n        return prefix && !startsWith(childId, prefix, false) ? prefix + childId : childId;\n    }\n\n    /**\n     * Removes the id prefix from a child id.\n     * @param childId - The child id to prefix.\n     * @returns - The un-prefixed id or the original id if no prefix was found.\n     */\n    public removeIdPrefix(childId: string): string {\n        const prefix = this.isEmptyOrUndefined(this.playerProps.playerId) ? null : `${this.playerProps.playerId}-`;\n\n        return prefix && startsWith(childId, prefix, false) ? childId.substring(prefix.length) : childId;\n    }\n\n    private _getAudioTracksMenu(): IPlayerMenu | null {\n        const audioTracksMenuItems: IPlayerMenuItem[] = [];\n        const videoMetaData: IVideoMetadata = this.playerProps.playerData.metaData;\n        if (videoMetaData.audioTracks !== undefined && videoMetaData.audioTracks.length > 0) {\n            // Check if there are multiple \"Descriptive Audio\" tracks, in which case we will want to show language\n            let descriptiveAudioTrackCount = 0;\n            for (const track of videoMetaData.audioTracks) {\n                if (track.isDescriptiveAudio) {\n                    descriptiveAudioTrackCount++;\n                }\n            }\n\n            let trackIndex: number = 0;\n            for (const audioTrack of videoMetaData.audioTracks) {\n                let label: string;\n                let languageCode: string = '';\n                if (audioTrack.isDescriptiveAudio) {\n                    // Descriptive audio labels look like:\n                    //   \"Descriptive audio\" -- when only one descriptive audio track exists\n                    // or\n                    //   \"Descriptive audio - English\" -- if there is more than one descriptive audio track\n                    const descriptiveAudioLabel = this.localizationHelper.getLocalizedValue(PlayerLocKeys.descriptive_audio);\n                    if (descriptiveAudioTrackCount > 1) {\n                        const language = this.localizationHelper.getLanguageNameFromLocale(audioTrack.languageCode);\n                        label = `${descriptiveAudioLabel} - ${language}`;\n                    } else {\n                        label = descriptiveAudioLabel;\n                    }\n                    languageCode = `daudio-${audioTrack.languageCode.toLowerCase()}`;\n                } else {\n                    // Regular tracks display language of the stream only.\n                    label = this.localizationHelper.getLanguageNameFromLocale(audioTrack.languageCode);\n                    languageCode = audioTrack.languageCode.toLowerCase();\n                }\n\n                const audioMenuItem: IPlayerMenuItem = {\n                    label,\n                    language: languageCode,\n                    data: audioTrack.url,\n                    id: this.addIdPrefix(`audio-${trackIndex}`),\n                    selected: false,\n                    selectable: true,\n                    persistOnClick: true\n                };\n\n                audioTracksMenuItems.push(audioMenuItem);\n                trackIndex++;\n            }\n\n            audioTracksMenuItems.unshift({\n                id: '',\n                label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.audio_tracks_default),\n                ariaLabel: this.localizationHelper.getLocalizedValue(PlayerLocKeys.audio_tracks_default),\n                language: 'default',\n                data: 'default',\n                selectable: true,\n                selected: false,\n                persistOnClick: true\n            });\n\n            audioTracksMenuItems.unshift({\n                id: '',\n                label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.audio_tracks),\n                ariaLabel: `${this.localizationHelper.getLocalizedValue(PlayerLocKeys.audio_tracks)} - go back to previous menu`,\n                selectable: false,\n                selected: false,\n                persistOnClick: false,\n                isBackButton: true\n            });\n            return {\n                category: MenuCategories.AudioTracks,\n                id: this.addIdPrefix(MenuCategories.AudioTracks),\n                label: this.localizationHelper.getLocalizedValue(PlayerLocKeys.audio_tracks),\n                items: audioTracksMenuItems\n            };\n        }\n        return null;\n    }\n\n    private _clearVideoPlayerMetaData(): void {\n        this.playerProps.playerData.metaData.videoFiles = [];\n        this.playerProps.playerData.metaData.audioTracks = [];\n        this.playerProps.playerData.metaData.ccFiles = [];\n    }\n\n    private _setCCFiles(): void {\n        const videoMetaData: IVideoMetadata = this.playerProps.playerData.metaData;\n        const ccFiles: ICCFile[] = [];\n        if (!(videoMetaData.ccFiles && videoMetaData.ccFiles.length > 0)) {\n            if (videoMetaData.videoBinaryReferences && videoMetaData.videoBinaryReferences.length > 0) {\n                for (const binaryRef of videoMetaData.videoBinaryReferences) {\n                    // Skip all other format except ttml/closedcaption\n                    if (\n                        (binaryRef.extension && binaryRef.extension === 'ttml') ||\n                        binaryRef.$type === 'videoClosedCaptionBinaryReference'\n                    ) {\n                        const ccFile: ICCFile = {\n                            ccType: ClosedCaptionTypes.TTML,\n                            locale: binaryRef.locale!,\n                            url: binaryRef.sourceHref!\n                        };\n                        ccFiles.push(ccFile);\n                    }\n                }\n                this.playerProps.playerData.metaData.ccFiles = ccFiles;\n            }\n        }\n    }\n\n    private _setAudioTracks(): void {\n        const videoMetaData: IVideoMetadata = this.playerProps.playerData.metaData;\n        const audioTracks: IAudioTrack[] = [];\n        if (videoMetaData.videoBinaryReferences && videoMetaData.videoBinaryReferences.length > 0) {\n            for (const binaryRef of videoMetaData.videoBinaryReferences) {\n                if (binaryRef.$type && binaryRef.$type === 'audioBinaryReference') {\n                    const audioTrack: IAudioTrack = {\n                        isDescriptiveAudio: binaryRef.audioType === 'descriptiveAudio',\n                        bitrate: binaryRef.bitrate!,\n                        languageCode: binaryRef.locale === undefined ? '' : binaryRef.locale,\n                        name: binaryRef.alias!,\n                        url: binaryRef.clientHref!\n                    };\n                    audioTracks.push(audioTrack);\n                }\n            }\n        }\n        this.playerProps.playerData.metaData.audioTracks = audioTracks;\n    }\n\n    private _mapVideoFiles(): void {\n        const videoMetaData: IVideoMetadata = this.playerProps.playerData.metaData;\n        if (!videoMetaData.videoFiles || videoMetaData.videoFiles.length === 0) {\n            const videoFiles: IVideoFile[] = [];\n            const videoBinaryFiles: IBinaryReference[] = videoMetaData.videoBinaryReferences!;\n            if (videoBinaryFiles && videoBinaryFiles.length > 0) {\n                for (const binaryRef of videoBinaryFiles) {\n                    if (binaryRef.format) {\n                        // Skip the unsupported 1001 format\n                        if (binaryRef.format === '1001') {\n                            continue;\n                        }\n\n                        // Handle all other video/audio format\n                        const mediaTypeAndQuality = this._getMediaTypeAndQuality(binaryRef.format);\n                        let urlRef;\n                        if (mediaTypeAndQuality.mediaType === MediaTypes.MP4) {\n                            urlRef = binaryRef.clientHref;\n                        } else {\n                            urlRef = binaryRef.sourceHref;\n                        }\n\n                        if (urlRef) {\n                            urlRef = this._removeProtocolFromUrl(urlRef);\n                        }\n\n                        if (urlRef) {\n                            videoFiles.push({\n                                url: urlRef,\n                                quality: mediaTypeAndQuality.quality,\n                                mediaType: mediaTypeAndQuality.mediaType,\n                                formatCode: binaryRef.format\n                            });\n                        }\n                    }\n                }\n            }\n            this.playerProps.playerData.metaData.videoFiles = videoFiles;\n        }\n    }\n\n    /**\n     * Gets video quality and media type from stream name.\n     * @param format - The stream name.\n     * @returns The mediaType and MediaQuality.\n     */\n    private _getMediaTypeAndQuality(format: string): { mediaType: MediaTypes; quality: MediaQuality } {\n        let mType: MediaTypes = MediaTypes.MP4;\n        let mQuality: MediaQuality = MediaQuality.SD;\n\n        switch (format) {\n            case '101':\n                mType = MediaTypes.MP4;\n                mQuality = MediaQuality.LO;\n                break;\n            case '102':\n                mType = MediaTypes.MP4;\n                mQuality = MediaQuality.SD;\n                break;\n            case '103':\n                mType = MediaTypes.MP4;\n                mQuality = MediaQuality.HQ;\n                break;\n            case '104':\n                mType = MediaTypes.MP4;\n                mQuality = MediaQuality.HDX;\n                break;\n            case '105':\n                mType = MediaTypes.MP4;\n                mQuality = MediaQuality.HD;\n                break;\n            case '1004':\n                mType = MediaTypes.SMOOTH;\n                break;\n            case '1006':\n                mType = MediaTypes.HLS;\n                break;\n            case '1007':\n                mType = MediaTypes.DASH;\n                break;\n            default:\n                mType = MediaTypes.MP4;\n                mQuality = MediaQuality.SD;\n        }\n\n        return {\n            mediaType: mType,\n            quality: mQuality\n        };\n    }\n\n    /**\n     * Removes protocol from url.\n     * @param url - The url.\n     * @returns The URL.\n     */\n    private _removeProtocolFromUrl(url: string): string {\n        return url.replace(/(^\\w+:|^)\\/\\//, '//');\n    }\n\n    /**\n     * Gets the video file of specified quality.\n     * @param quality - The desired quality to look for.\n     * @param videoFiles - The video files.\n     * @returns Returns the video file.\n     */\n    private _getVideoFileByQuality(quality: MediaQuality, videoFiles: IVideoFile[]): IVideoFile | null {\n        let videoFile = null;\n        for (const file of videoFiles) {\n            if (file.quality === quality) {\n                videoFile = file;\n                break;\n            }\n        }\n\n        return videoFile;\n    }\n\n    /**\n     * Gets the video file of specified type.\n     * @param mediaType - The media type to look for.\n     * @param videoFiles - The video files.\n     * @returns Returns the video file.\n     */\n    private _getVideoFileByType(mediaType: MediaTypes, videoFiles: IVideoFile[]): IVideoFile[] {\n        const videoFile: IVideoFile[] = [];\n        for (const file of videoFiles) {\n            if (file.mediaType === mediaType) {\n                videoFile.push(file);\n            }\n        }\n        return videoFile;\n    }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport React, { useEffect, useState } from 'react';\n\nexport interface IRatingComponentProps extends IComponentProps<{}> {\n    readOnly: boolean;\n    ariaLabel: string;\n    avgRating: number;\n    ratingCount?: string;\n    initialRating?: number;\n    hideCount?: boolean;\n    shouldShowFullRatingDescription?: boolean;\n    className?: string;\n    ratingCountAriaLabel?: string;\n    onChange?(value: number): void;\n}\nexport interface IRatingComponent extends IComponent<IRatingComponentProps> {\n    onSliderChanged(): (\n        event: React.ChangeEvent<HTMLInputElement>,\n        props: IRatingComponentProps,\n        setRating: (rating: IRatingState) => void\n    ) => void;\n    onMouseOver(): (event: React.MouseEvent<HTMLElement>, rating: IRatingState, setRating: (rating: IRatingState) => void) => void;\n    onClick(): (event: React.MouseEvent<HTMLElement>, props: IRatingComponentProps, setRating: (rating: IRatingState) => void) => void;\n    onMouseLeave(): (event: React.MouseEvent, rating: IRatingState, setRating: (rating: IRatingState) => void) => void;\n}\n\ninterface IRatingState {\n    rating: number;\n    lastSelectedRating: number;\n}\n\nconst roundUpMin: number = 0.75;\nconst roundMidMin: number = 0.25;\nconst maxRating: number = 5;\n\nconst RatingComponentActions = {\n    onSliderChanged(\n        event: React.ChangeEvent<HTMLInputElement>,\n        props: IRatingComponentProps,\n        setRating: (rating: IRatingState) => void\n    ): void {\n        const value = Number.parseInt(event.target.value, 10);\n        setRating({ rating: value, lastSelectedRating: value });\n\n        if (props.onChange) {\n            props.onChange(value);\n        }\n    },\n    onMouseLeave(_event: React.MouseEvent, rating: IRatingState, setRating: (rating: IRatingState) => void): void {\n        setRating({ rating: rating.lastSelectedRating, lastSelectedRating: rating.lastSelectedRating });\n    },\n    onMouseOver(event: React.MouseEvent<HTMLElement>, rating: IRatingState, setRating: (rating: IRatingState) => void): void {\n        setRating({ rating: getIndex(event), lastSelectedRating: rating.lastSelectedRating });\n    },\n    onClick(event: React.MouseEvent<HTMLElement>, props: IRatingComponentProps, setRating: (rating: IRatingState) => void): void {\n        if (!props.readOnly) {\n            const index = getIndex(event);\n            setRating({ rating: index, lastSelectedRating: index });\n\n            if (props.onChange) {\n                props.onChange(index);\n            }\n        }\n    }\n};\n\nconst Rating: React.FC<IRatingComponentProps> = (props: IRatingComponentProps) => {\n    const initialRating = props.readOnly ? props.avgRating : props.initialRating || 0;\n    const [rating, setRating] = useState({ rating: initialRating, lastSelectedRating: initialRating });\n    useEffect(() => {\n        const newRating = props.readOnly ? props.avgRating : props.initialRating || 0;\n        setRating({ rating: newRating, lastSelectedRating: newRating });\n    }, [props]);\n    const onChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n        RatingComponentActions.onSliderChanged(event, props, setRating);\n    };\n    const onMouseLeave = (event: React.MouseEvent) => {\n        RatingComponentActions.onMouseLeave(event, rating, setRating);\n    };\n    const onMouseOver = (event: React.MouseEvent<HTMLElement>) => {\n        RatingComponentActions.onMouseOver(event, rating, setRating);\n    };\n    const onClick = (event: React.MouseEvent<HTMLElement>) => {\n        RatingComponentActions.onClick(event, props, setRating);\n    };\n\n    const shouldShowFullRatingDescriptionConfiguration = props.shouldShowFullRatingDescription ?? false;\n    const shouldShowDescription = shouldShowFullRatingDescriptionConfiguration || props.typeName === 'reviews-list';\n\n    return (\n        <div className={`msc-rating  ${rating.rating > 0 ? 'msc-no-ratings' : ''} ${props.className ? props.className : ''}`}>\n            {starControl(props.readOnly, rating.rating, props.ariaLabel, props.ratingCountAriaLabel, onChange)}\n            <div aria-hidden onMouseLeave={props.readOnly ? undefined : onMouseLeave} className='msc-rating__group'>\n                {renderStars(rating.rating, props, onMouseOver, onClick)}\n            </div>\n            {props.ratingCount && (\n                <output aria-hidden className='msc-rating__count'>\n                    {` `}\n                    {shouldShowDescription ? `${props.avgRating} / 5 (${props.ratingCount})` : props.ratingCount}\n                    {` `}\n                </output>\n            )}\n        </div>\n    );\n};\n\n// Set default props\nRating.defaultProps = {\n    avgRating: 0\n} as Partial<IRatingComponentProps>;\n\n/**\n * Rating Review ariaLabel.\n * @param  readOnly - Boolean.\n * @param  currentRating - Current rating number.\n * @param  ariaLabel - Rating AriaLabel.\n * @param  reviewCountAriaLabel - Product review count.\n * @param onChange - On Change function.\n * @returns Jsx element.\n */\nconst starControl = (\n    readOnly: boolean,\n    currentRating: number,\n    ariaLabel: string,\n    reviewCountAriaLabel: string | undefined,\n    onChange: (event: React.ChangeEvent<HTMLInputElement>) => void\n): JSX.Element => {\n    if (readOnly) {\n        return <div className='msc-rating__range sr-only'>{`${ariaLabel}${reviewCountAriaLabel ? ` ${reviewCountAriaLabel}` : ''}`}</div>;\n    }\n\n    return (\n        <input\n            type='range'\n            className='msc-rating__range'\n            min={0}\n            max={5}\n            step={1}\n            value={currentRating}\n            aria-valuemax={5}\n            aria-valuemin={0}\n            aria-valuenow={currentRating}\n            onChange={onChange}\n            aria-label={ariaLabel}\n        />\n    );\n};\n\nconst renderStars = (\n    rating: number,\n    props: IRatingComponentProps,\n    mouseOver: (event: React.MouseEvent<HTMLElement>) => void,\n    onClick: (event: React.MouseEvent<HTMLElement>) => void\n): JSX.Element[] => {\n    const floor = Math.floor(rating);\n    const remainder = rating - floor;\n    const filled = remainder < roundUpMin ? floor : floor + 1;\n    const half = roundMidMin <= remainder && remainder < roundUpMin ? filled + 1 : 0;\n    const stars = [];\n\n    for (let i = 1; i <= maxRating; i++) {\n        const glyphClass = filled >= i ? 'msc-rating__star' : half === i ? 'msc-rating__half-star' : 'msc-rating__empty-star'!;\n        stars.push(\n            <span\n                className={glyphClass}\n                data-index={i}\n                key={i}\n                onMouseOver={props.readOnly ? undefined : mouseOver}\n                onClick={onClick}\n                role='presentation'\n            />\n        );\n    }\n\n    return stars;\n};\n\nconst getIndex = (event: React.MouseEvent<HTMLElement>): number => {\n    const target = event.target as HTMLElement;\n    return Number.parseInt(target.getAttribute('data-index')!, 10);\n};\n\n// @ts-expect-error\nexport const RatingComponent: React.FunctionComponent<IRatingComponentProps> = msdyn365Commerce.createComponent<IRatingComponent>(\n    'Rating',\n    { component: Rating, ...RatingComponentActions }\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { extend, IClientDimension, IDictionaryStringString, IGrid } from '../utilities';\n\n/**\n * Timed Text Markup Language (TTML).\n * See http://www.w3.org/TR/ttml1/ for more details.\n */\nexport const xmlNS = 'http://www.w3.org/XML/1998/namespace';\n\n/**\n * @interface ITtmlSettings\n * @classdesc - The ITtmlSettings interface contract.\n */\nexport interface ITtmlSettings {\n    ttmlNamespace?: string;\n    ttmlStyleNamespace?: string;\n    ttmlParameterNamespace?: string;\n    ttmlMetaNamespace?: string;\n    idPrefix?: string;\n    mediaFrameRate?: number;\n    mediaFrameRateMultiplier?: number;\n    mediaSubFrameRate?: number;\n    mediaTickRate?: number;\n    supportedTimeBase?: string;\n    rootContainerRegionDimensions?: IClientDimension | null;\n    relatedMediaObjectRegion?: IClientDimension | null;\n    cellResolution?: IGrid;\n    defaultRegionStyle?: IDictionaryStringString;\n    fontMap?: IDictionaryStringString;\n    log?: Function;\n}\n\n/**\n *\n * The TtmlSettings class.\n * The TtmlSettings class is used to pass settings between the ttml parser, the ttml context, and the outside world.\n * It supplies default values which can be overridden via overrides passed to the constructor.\n */\nexport class TtmlSettings implements ITtmlSettings {\n    /**\n     * @name - ttmlNamespace\n     * @description - The ttml namespace to use.\n     * @public\n     * @type {string}\n     */\n    public ttmlNamespace: string = 'http://www.w3.org/ns/ttml';\n\n    /**\n     * @name - ttmlStyleNamespace\n     * @description - The ttml style namespace to use.\n     * @public\n     * @type {string}\n     */\n    public ttmlStyleNamespace: string = 'http://www.w3.org/ns/ttml#styling';\n\n    /**\n     * @name - ttmlParameterNamespace\n     * @description - The ttml parameter namespace to use.\n     * @public\n     * @type {string}\n     */\n    public ttmlParameterNamespace: string = 'http://www.w3.org/ns/ttml#parameter';\n\n    /**\n     * @name - ttmlMetaNamespace\n     * @description - The ttml metadata namespace to use.\n     * @public\n     * @type {string}\n     */\n    public ttmlMetaNamespace: string = 'http://www.w3.org/ns/ttml#metadata';\n\n    /**\n     * @name - idPrefix\n     * @description - The id prefix to use so ids copied from the ttml doc are unique.\n     * @public\n     * @type {string}\n     */\n    public idPrefix: string = '';\n\n    /**\n     * @name - mediaFrameRate\n     * @description - The media frame rate to use.\n     * @public\n     * @type {number}\n     */\n    public mediaFrameRate: number = 30;\n\n    /**\n     * @name - mediaFrameRateMultiplier\n     * @description - The media frame rate multiplier to use.\n     * @public\n     * @type {number}\n     */\n    public mediaFrameRateMultiplier: number = 1;\n\n    /**\n     * @name - mediaSubFrameRate\n     * @description - The media sub frame rate to use.\n     * @public\n     * @type {number}\n     */\n    public mediaSubFrameRate: number = 1;\n\n    /**\n     * @name - mediaTickRate\n     * @description - The media tick rate to use.\n     * @public\n     * @type {number}\n     */\n    public mediaTickRate: number = 1000;\n\n    /**\n     * @name - supportedTimeBase\n     * @description - The support timebase value.\n     * @public\n     * @type {string}\n     */\n    public supportedTimeBase: string = 'media';\n\n    /**\n     * @name - rootContainerRegionDimensions\n     * @description - The root container's dimensions.\n     * @public\n     * @type {IClientDimension}\n     */\n    public rootContainerRegionDimensions: IClientDimension | null = null;\n\n    /**\n     * @name - relatedMediaObjectRegion\n     * @description - The media object's dimensions.\n     * @public\n     * @type {IClientDimension}\n     */\n    public relatedMediaObjectRegion: IClientDimension | null = null;\n\n    /**\n     * @name - cellResolution\n     * @description - The default cell grid.\n     * @public\n     * @type {IGrid}\n     */\n    public cellResolution: IGrid = { rows: 15, columns: 32 };\n\n    /**\n     * @name - defaultRegionStyle\n     * @description - The default region style.\n     * @public\n     * @type {IDictionaryStringString}\n     */\n    public defaultRegionStyle: IDictionaryStringString = {\n        backgroundColor: 'transparent',\n        color: '#E8E9EA',\n        direction: 'ltr',\n        display: 'auto',\n        displayAlign: 'before',\n        extent: 'auto',\n        fontFamily: 'default',\n        fontSize: '1c',\n        fontStyle: 'normal',\n        fontWeight: 'normal',\n        lineHeight: 'normal',\n        opacity: '1',\n        origin: 'auto',\n        overflow: 'hidden',\n        padding: '0',\n        showBackground: 'always',\n        textAlign: 'start',\n        textDecoration: 'none',\n        textOutline: 'none',\n        unicodeBidi: 'normal',\n        visibility: 'visible',\n        wrapOption: 'normal',\n        writingMode: 'lrtb'\n    };\n\n    /**\n     * @name - fontMap\n     * @description - The default font map.\n     * @public\n     * @type {IDictionaryStringString}\n     */\n    public fontMap: IDictionaryStringString = {};\n\n    /**\n     * @name - log\n     * @description - The logging function to use in debug mode.\n     * @public\n     * @type {Function}\n     */\n    public log: Function | undefined;\n\n    /*\n     * Constructor for the TtmlSettings class.\n     */\n    public constructor(settingsOverrides?: ITtmlSettings) {\n        // These are from the Simple Delivery Profile\n        // Per spec recommendation that default be monospace sans serif.\n        this.fontMap.default = 'Lucida sans typewriter, Lucida console, Consolas';\n        this.fontMap.monospaceSerif = 'Courier';\n        this.fontMap.proportionalSerif = 'Times New Roman, Serif';\n        this.fontMap.monospaceSansSerif = 'Lucida sans typewriter, Lucida console, Consolas';\n        this.fontMap.proportionalSansSerif = 'Arial, Sans-serif';\n        this.fontMap.casual = 'Verdana';\n        this.fontMap.cursive = 'Zapf-Chancery, Segoe script, Cursive';\n        this.fontMap.smallCaps = 'Arial, Helvetica';\n\n        // These are others from the broader ttml (v1.0)\n        this.fontMap.monospace = 'Lucida sans typewriter, Lucida console, Consolas';\n        this.fontMap.sansSerif = 'Arial, Sans-serif';\n        this.fontMap.serif = 'Times New Roman, Serif';\n\n        if (settingsOverrides) {\n            extend(this, settingsOverrides);\n        }\n    }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n    addClass,\n    css,\n    extend,\n    format,\n    getDimensions,\n    getText,\n    IClientDimension,\n    IDictionaryStringString,\n    isNullOrWhiteSpace,\n    nodeListToArray,\n    trim\n} from '../utilities';\nimport { ITtmlEvent, TtmlParser } from './ttml-parser';\nimport { TtmlSettings, xmlNS } from './ttml-settings';\n\n// Timed Text Markup Language (TTML).\n// See http://www.w3.org/TR/ttml1/ for more details.\n\n/**\n * @interface ITtmlContext\n * @classdesc - The TtmlContext interface contract.\n */\nexport interface ITtmlContext {\n    setOwnerDocument(ownerDocument: Document): void;\n    updateRelatedMediaObjectRegion(dimensions: IClientDimension): boolean;\n    resetCurrentEvents(): void;\n    hasEvents(): boolean;\n    updateCurrentEvents(time: number): boolean;\n    getCues(time: number): HTMLElement[];\n}\n\n/**\n * @interface ITtmlTranslationResult\n * @classdesc - The ITtmlTranslationResult interface contract.\n */\ninterface ITtmlTranslationResult {\n    outerNode: HTMLElement | null;\n    innerNode: HTMLElement | null;\n    inheritableStyleSet?: IDictionaryStringString | null;\n}\n\n/**\n * @interface ITtmlPruneResult\n * @classdesc - The ITtmlPruneResult interface contract.\n */\ninterface ITtmlPruneResult {\n    prunedElement: Element;\n    hasPreservedContent: boolean;\n}\n\n/**\n * The TtmlContext. An instance of this class is returned from the TttmlParser.parse() method after it parses a ttml file.\n * This context is then used by the VideoClosedCaptions object to get the captions for any play position of the video.\n */\nexport class TtmlContext implements ITtmlContext {\n    /**\n     * @name - lengthRegEx\n     * The regular expression pattern used in ttml->css text outline conersion.\n     * @static\n     * @private\n     * @type {RegExp}\n     */\n    private static readonly lengthRegEx: RegExp = /\\s*(\\d+\\.*\\d*)(.*)\\s*/;\n\n    /**\n     * @name - rgbaRegEx\n     * The regular expression pattern used in ttml->css color conersion.\n     * @static\n     * @private\n     * @type {RegExp}\n     */\n    private static readonly rgbaRegEx: RegExp = /\\s*rgba\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)\\s*/;\n\n    /**\n     * @name - TtmlNamedColorMap\n     * The table used to map named ttml color values to css color values.\n     * @static\n     * @private\n     * @type {IDictionaryStringString}\n     */\n    private static readonly TtmlNamedColorMap: IDictionaryStringString = {\n        transparent: 'rgba(0,0,0,0)',\n        black: 'rgba(0,0,0,1)',\n        silver: 'rgba(192,192,192,1)',\n        gray: 'rgba(128,128,128,1)',\n        white: 'rgba(255,255,255,1)',\n        maroon: 'rgba(128,0,0,1)',\n        red: 'rgba(255,0,0,1)',\n        purple: 'rgba(128,0,128,1)',\n        fuchsia: 'rgba(255,0,255,1)',\n        magenta: 'rgba(255,0,255,1)',\n        green: 'rgba(0,128,0,1)',\n        lime: 'rgba(0,255,0,1)',\n        olive: 'rgba(128,128,0,1)',\n        yellow: 'rgba(255,255,0,1)',\n        navy: 'rgba(0,0,128,1)',\n        blue: 'rgba(0,0,255,1)',\n        teal: 'rgba(0,128,128,1)',\n        aqua: 'rgba(0,255,255,1)',\n        cyan: 'rgba(0,255,255,1)'\n    };\n\n    /**\n     * @name - events\n     * The set of all ttml events.\n     * @public\n     * @type {ITtmlEvent[]}\n     */\n    public events!: ITtmlEvent[];\n\n    /**\n     * @name - settings\n     * The ttml settings.\n     * @public\n     * @type {TtmlSettings}\n     */\n    public settings!: TtmlSettings;\n\n    /**\n     * @name - styleSetCache\n     * The ttml styleSet cache.\n     * @public\n     * @type {IDictionaryStringString[]}\n     */\n    public styleSetCache!: IDictionaryStringString[];\n\n    /**\n     * @name - rootContainerRegion\n     * The root container region.\n     * @public\n     * @type {Element}\n     */\n    public rootContainerRegion!: Element;\n\n    /**\n     * @name - root\n     * The root element.\n     * @public\n     * @type {Element}\n     */\n    public root!: Element;\n\n    /**\n     * @name - body\n     * The body element.\n     * @public\n     * @type {Element}\n     */\n    public body!: Element;\n\n    /**\n     * @name - layout\n     * The layout element.\n     * @public\n     * @type {Element}\n     */\n    public layout!: Element;\n\n    /**\n     * @name - ownerDocument\n     * The owner document for this context. Used to create html elements.\n     * @private\n     * @type {Document}\n     */\n    private ownerDocument!: Document;\n\n    /**\n     * @name - currentEvents\n     * The current set of temporally active events.\n     * @private\n     * @type {ITtmlEvent[]}\n     */\n    private currentEvents!: ITtmlEvent[];\n\n    /**\n     * @name - currentEventsTime\n     * The time the currentEvents was populated.\n     * @private\n     * @type {number}\n     */\n    private currentEventsTime!: number;\n\n    /**\n     * Converts a ttml text decoration style value to a css one.\n     * @param ttmlTextDecoration - The ttml value.\n     * @returns - The css value.\n     */\n    private static _ttmlToCssTextDecoration(ttmlTextDecoration: string): string {\n        let textDecoration = '';\n        const parts = ttmlTextDecoration.split(/\\s+/);\n\n        // Since we have no CSS for the 'no' values just replace them all with a none at the front of the list.\n        for (const value of parts) {\n            // eslint-disable-next-line default-case\n            switch (value) {\n                case 'none':\n                case 'noUnderline':\n                case 'noLineThrough':\n                case 'noOverline':\n                    textDecoration = 'none';\n            }\n        }\n\n        // Then append all the others.\n        for (const value of parts) {\n            switch (value) {\n                case 'none':\n                case 'noUnderline':\n                case 'noLineThrough':\n                case 'noOverline':\n                    break;\n                case 'lineThrough':\n                    textDecoration += ' line-through';\n                    break;\n                default:\n                    textDecoration += ` ${value}`;\n            }\n        }\n\n        return trim(textDecoration);\n    }\n\n    /**\n     * Converts a ttml text color style value to a css one.\n     * #RRGGBB and rgb(rrr,ggg,bbb) do not need conversion and are not modified.\n     * #RRGGBBAA is modified because css doesn't support it (at least as implemented in todays browsers).\n     * rgba(rrr,ggg,bbb,aaa) is converted to rgba(rrr,ggg,bbb,0-1).\n     * ttml namedColors are converted to rgb(rrr,ggg,bbb) in the unlikely event that their alpha (only) is overridden.\n     * @param color - The ttml value.\n     * @returns - The css value.\n     */\n    private static _ttmlToCssColor(color: string): string {\n        let mappedColor = color;\n\n        color = color.toLowerCase();\n\n        if (color.startsWith('rgba')) {\n            const parts = TtmlContext.rgbaRegEx.exec(color);\n\n            if (parts && parts.length === 5) {\n                const red = parts[1];\n                const green = parts[2];\n                const blue = parts[3];\n                const alpha = Number.parseInt(parts[4], 10);\n\n                mappedColor = format('rgba({0},{1},{2},{3})', red, green, blue, Math.round((alpha * 100) / 255) / 100);\n            }\n        } else if (color.startsWith('#') && color.length === 9) {\n            const red = Number.parseInt(color.substr(1, 2), 16);\n            const green = Number.parseInt(color.substr(3, 2), 16);\n            const blue = Number.parseInt(color.substr(5, 2), 16);\n            const alpha = Number.parseInt(color.substr(7, 2), 16);\n\n            mappedColor = format('rgba({0},{1},{2},{3})', red, green, blue, Math.round((alpha * 100) / 255) / 100);\n        } else if (TtmlContext.TtmlNamedColorMap[color]) {\n            mappedColor = TtmlContext.TtmlNamedColorMap[color];\n        }\n\n        return mappedColor;\n    }\n\n    /**\n     * Applies default styles to the element to match the ttml defaults.\n     * @param element - The element to set the default styles on.\n     * @returns - The specified element (for chaining).\n     */\n    private static _defaultStyle(element: HTMLElement): HTMLElement {\n        // Set some element styles to our ttml defaults for them.\n        css(element, 'background-color', TtmlContext.TtmlNamedColorMap.transparent);\n        css(element, 'offset', '0');\n        css(element, 'margin', '0');\n        css(element, 'padding', '0');\n        css(element, 'border', '0');\n        return element;\n    }\n\n    /**\n     * Set the context's owner document. It will use this to create elements during translation.\n     * @param ownerDocument - The owner document for this context.\n     */\n    public setOwnerDocument(ownerDocument: Document): void {\n        this.ownerDocument = ownerDocument;\n    }\n\n    /**\n     * Updates the context's media object region.\n     * @public\n     * @param dimensions - The desired dimensions for the region.\n     * @returns - True if the dimensions where changed, otherwise false.\n     */\n    public updateRelatedMediaObjectRegion(dimensions: IClientDimension): boolean {\n        if (\n            dimensions !== null &&\n            (!this.settings.relatedMediaObjectRegion ||\n                dimensions.width !== this.settings.relatedMediaObjectRegion.width ||\n                dimensions.height !== this.settings.relatedMediaObjectRegion.height)\n        ) {\n            this.settings.relatedMediaObjectRegion = {\n                width: dimensions.width,\n                height: dimensions.height\n            };\n\n            return true;\n        }\n\n        return false;\n    }\n\n    /**\n     * Indicates whether or not the context has events.\n     * @returns - True if the context has events, otherwise false.\n     */\n    public hasEvents(): boolean {\n        return this.events && !!this.events.length;\n    }\n\n    /**\n     * Resets the context's currentEvents.\n     */\n    public resetCurrentEvents(): void {\n        this.currentEvents = [];\n    }\n\n    /**\n     * Updates the context's currentEvents if there are new events for the specified time.\n     * @param time - The time to get events for.\n     * @returns - True if the events for the specified time are different than the currentEvents, otherwise false.\n     */\n    public updateCurrentEvents(time: number): boolean {\n        const timeEvents = this._getTemporallyActiveEvents(time);\n\n        // As a shortcut compare lengths first.\n        const currentEventsLength = this.currentEvents ? this.currentEvents.length : 0;\n        const timeEventsLength = timeEvents ? timeEvents.length : 0;\n\n        if (currentEventsLength !== timeEventsLength) {\n            this.currentEventsTime = time;\n            this.currentEvents = timeEvents;\n            return true;\n        }\n\n        if (this.currentEvents) {\n            for (let index = 0; index < currentEventsLength; index++) {\n                if (this.currentEvents[index].time !== timeEvents[index].time) {\n                    this.currentEventsTime = time;\n                    this.currentEvents = timeEvents;\n                    return true;\n                }\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * The set of cues that apply to the specified time.\n     * @param time - The time to get cues for.\n     * @returns - The set of cues for the specified time, otherwise an empty [].\n     */\n    public getCues(time: number): HTMLElement[] {\n        let cues: HTMLElement[] = [];\n\n        if (this.currentEventsTime !== time) {\n            this.updateCurrentEvents(time);\n        }\n\n        // Find all the region elements in the TTML namespace.\n        const preserveSpace = TtmlParser.getAttributeNS(this.root, 'space', xmlNS) === 'preserve';\n        const regions = <HTMLElement[]>(this.layout ? this.layout.getElementsByTagNameNS(this.settings.ttmlNamespace, 'region') : []);\n\n        for (const region of regions) {\n            const regionId = TtmlParser.getAttributeNS(region, 'id', xmlNS);\n            const anonymousId = region.getAttribute('data-isanonymous');\n\n            if (anonymousId || regionId) {\n                const translation = this._translate(region, this.settings.defaultRegionStyle, preserveSpace, time, this.translateToHtml);\n\n                if (translation.outerNode && translation.innerNode) {\n                    const innerNode = translation.innerNode;\n                    const outerNode = translation.outerNode;\n\n                    // Create a new subtree for the body element, prune elements\n                    // not associated with the region, and if its not empty then\n                    // select it into this region by adding it to div container.\n                    for (const event of this.events) {\n                        if (event.element) {\n                            if (this._isInRegion(event.element, anonymousId ? '' : regionId)) {\n                                const pruneResult = this._prune(\n                                    event.element,\n                                    translation.inheritableStyleSet!,\n                                    preserveSpace,\n                                    time,\n                                    this.translateToHtml\n                                );\n                                let cueBody: Element | null = pruneResult.prunedElement;\n\n                                if (!pruneResult.hasPreservedContent && cueBody && !trim(getText(cueBody)).length) {\n                                    cueBody = null;\n                                }\n\n                                if (cueBody) {\n                                    innerNode.appendChild(cueBody);\n                                }\n                            }\n                        }\n                    }\n\n                    const showAlways = outerNode.getAttribute('data-showBackground') === 'always';\n\n                    if (showAlways || innerNode.children.length) {\n                        if (showAlways) {\n                            // Just needed internally for the previous check, don't pass through on the cue.\n                            outerNode.removeAttribute('data-showBackground');\n                        }\n\n                        cues.push(outerNode);\n                    }\n                }\n            }\n        }\n\n        // If we ended up with any displayable cues add them all to the rootContainerRegion cue.\n        if (cues.length) {\n            const rcr = this._translate(this.rootContainerRegion, { overflow: 'hidden', padding: '0' }, false, time, this.translateToHtml);\n\n            for (const cue of cues) {\n                rcr.innerNode!.appendChild(cue);\n            }\n\n            cues = [];\n            cues.push(rcr.outerNode!);\n        }\n\n        return cues;\n    }\n\n    /**\n     * Get the list of temporally active events for the specified time.\n     * @private\n     * @param time - The time to get the active events for.\n     * @returns - The set of active events for the specified time, otherwise an empty [].\n     */\n    private _getTemporallyActiveEvents(time: number): ITtmlEvent[] {\n        return this.events.filter(event => {\n            return event.element ? this._isTemporallyActive(event.element, time) : true;\n        });\n    }\n\n    /**\n     * Determines whether or not the specified element is temporally active at the specified time.\n     * @param element - The element to check.\n     * @param time - The time to check against.\n     * @returns - True if the element is active at the specified time, otherwise false.\n     */\n    private _isTemporallyActive(element: Element, time: number): boolean {\n        return (\n            (Number.parseInt(element.getAttribute('data-time-start')!, 10) || 0) <= time &&\n            time < (Number.parseInt(element.getAttribute('data-time-end')!, 10) || 0)\n        );\n    }\n\n    /**\n     * Convert a ttml element into the equivalent in another format via the supplied translator function.\n     * @param element - The ttml element to translate.\n     * @param inheritedStyleSet - The element's inherited style set.\n     * @param preserveSpace - Indicates whether or not space should be preserved.\n     * @param time - The time to translate against. Elements and styles are temporally transient.\n     * @param translator - The translator function to use. Originally supported both xml/html but is always using html in MWF.\n     * @returns - A ITtmlTranslationResult instance containing the translation results.\n     */\n    private _translate(\n        element: Element,\n        inheritedStyleSet: IDictionaryStringString,\n        preserveSpace: boolean,\n        time: number,\n        translator: Function\n    ): ITtmlTranslationResult {\n        let translation: ITtmlTranslationResult;\n        let computedStyleSet: IDictionaryStringString;\n\n        if (this._isTemporallyActive(element, time)) {\n            const tag = this._getTagNameEquivalent(element);\n\n            computedStyleSet = this._getComputedStyleSet(element, inheritedStyleSet, tag, time);\n\n            if (computedStyleSet.display !== 'none') {\n                const applicableStyleSet = this._getApplicableStyleSet(computedStyleSet, tag);\n\n                translation = translator(element, applicableStyleSet, preserveSpace);\n\n                return {\n                    outerNode: translation.outerNode,\n                    innerNode: translation.innerNode,\n                    inheritableStyleSet: this._getInheritableStyleSet(computedStyleSet)\n                };\n            }\n        }\n\n        return { outerNode: null, innerNode: null, inheritableStyleSet: null };\n    }\n\n    /**\n     * Convert a ttml element into the its equivalent html element.\n     * @param element - The ttml element to translate.\n     * @param applicableStyleSet - The style set applicable to this element.\n     * @param preserveSpace - Indicates whether or not space should be preserved.\n     * @returns - A ITtmlTranslationResult instance containing the translation results.\n     */\n    private readonly translateToHtml = (\n        element: Element,\n        applicableStyleSet: IDictionaryStringString,\n        preserveSpace: boolean\n    ): ITtmlTranslationResult => {\n        let translation: HTMLElement;\n        let innerNode: HTMLElement;\n        const name = this._getTagNameEquivalent(element);\n        let htmlName = '';\n        let htmlClass = '';\n        switch (name) {\n            case 'ttml:region':\n                htmlClass = 'cue ';\n\n            /* Falls through */\n            // break;\n            case 'ttml:rootcontainerregion':\n            case 'ttml:body':\n            case 'ttml:div':\n                htmlName = 'div';\n                break;\n            case 'ttml:p':\n                htmlName = 'p';\n                break;\n            case 'ttml:span':\n                htmlName = 'span';\n                break;\n            case 'ttml:br':\n                htmlName = 'br';\n                break;\n            default:\n        }\n\n        const role = TtmlParser.getAttributeNS(element, 'role', this.settings.ttmlMetaNamespace);\n\n        if (role) {\n            htmlClass += ` ${role}`;\n        }\n\n        const agent = TtmlParser.getAttributeNS(element, 'agent', this.settings.ttmlMetaNamespace);\n\n        if (agent) {\n            htmlClass += ` ${agent}`;\n        }\n\n        // Hack until display:ruby on other elements works.\n        if (role === 'x-ruby') {\n            htmlName = 'ruby';\n        } else if (role === 'x-rubybase') {\n            htmlName = 'rb';\n        } else if (role === 'x-rubytext') {\n            htmlName = 'rt';\n        }\n\n        if (!isNullOrWhiteSpace(htmlName)) {\n            translation = TtmlContext._defaultStyle(this.ownerDocument.createElement(htmlName));\n            addClass(translation, trim(htmlClass));\n\n            const title = TtmlParser.getAttributeNS(element, 'title', this.settings.ttmlMetaNamespace);\n\n            if (title) {\n                translation.setAttribute('title', title);\n            }\n\n            const id = TtmlParser.getAttributeNS(element, 'id', xmlNS);\n\n            if (id && this.settings.idPrefix) {\n                // Migrate the ttml doc id's over to the html markup.\n                // Use idPrefix to ensure there are no name clases on id's already in target doc.\n                translation.setAttribute('id', this.settings.idPrefix + id);\n            }\n\n            if (name === 'ttml:region') {\n                // To get a <region> to display properly we are actually going to need to create two nested <div>s\n                // This is because for displayAlign to work we need a table-cell <div> inside a table <div>.\n                innerNode = translation.appendChild(TtmlContext._defaultStyle(this.ownerDocument.createElement('div')));\n                innerNode.setAttribute('style', 'display:table; border-spacing:0; cell-spacing:0; cell-padding:0; width:100%; height:100%');\n                innerNode = innerNode.appendChild(TtmlContext._defaultStyle(this.ownerDocument.createElement('div')));\n                css(innerNode, 'display', 'table-cell');\n\n                // Apply the displayAlign style to inner table-cell <div>\n                if (applicableStyleSet.displayAlign) {\n                    this._translateStyle(name, innerNode, { displayAlign: applicableStyleSet.displayAlign });\n\n                    // Then remove displayAlign from the applicableStyleSet so as not to also later apply it to the outer table <div>\n                    applicableStyleSet.displayAlign = '';\n                }\n            }\n\n            // If we're preserving space add an inner <span> with 'white-space: pre'.\n            // This is how we implement preserving space in css and we need an inner\n            // span because the 'real' span will already be setting it's css white-space\n            // value to either normal or nowrap and we can't collide with that.\n            if (preserveSpace && name === 'ttml:span') {\n                innerNode = translation.appendChild(TtmlContext._defaultStyle(this.ownerDocument.createElement('span')));\n                css(innerNode, 'white-space', 'pre');\n            }\n\n            // Default some css properties that we don't want to inadvertantly end up\n            // inheriting values for that might cause adverse layout impacts for us.\n            css(translation, 'position', 'static');\n            css(translation, 'width', '100%');\n\n            // Copy style from element over to html, translating into CSS as we go.\n            this._translateStyle(name, translation, applicableStyleSet);\n        }\n\n        return { outerNode: translation!, innerNode: innerNode! ? innerNode! : translation! };\n    };\n\n    /**\n     * Translate the ttml styles in a styleSet to their equivalent css styles and apply them to the specified html element.\n     * @param tagName - The ttml element tagName. All styles do not apply to all tagNames.\n     * @param element - The ttml element to translate.\n     * @param applicableStyleSet - The style set applicable to this element.\n     */\n    private _translateStyle(tagName: string, element: HTMLElement, applicableStyleSet: IDictionaryStringString): void {\n        for (const style in applicableStyleSet) {\n            if (applicableStyleSet[style]) {\n                this._applyStyle(element, tagName, style, applicableStyleSet[style]);\n            }\n        }\n    }\n\n    /**\n     * Convert the element if it is in the region, then recurse into its contents.\n     * If it ends up with no children then we dont add it to the region, we prune it.\n     * @param element - The ttml element to translate.\n     * @param inheritedStyleSet - The style set inherited by this element.\n     * @param preserveSpace - Indicates whether or not space should be preserved.\n     * @param time - The time to translate against. Elements and styles are temporally transient.\n     * @param translator - The translator function to use. Originally supported both xml/html but is always using html in MWF.\n     * @param [ignoreAncestors] - Specifies whether or not to ignore the element's ancestors.\n     * @returns - A ITtmlPruneResult instance containing the prune results.\n     */\n    private _prune(\n        element: Element,\n        inheritedStyleSet: IDictionaryStringString,\n        preserveSpace: boolean,\n        time: number,\n        translator: Function,\n        ignoreAncestors: boolean = false\n    ): ITtmlPruneResult {\n        let outerNode: Element;\n        let hasPreservedContent = false;\n\n        let translation = this._translate(element, inheritedStyleSet, preserveSpace, time, translator);\n\n        if (translation.outerNode !== null) {\n            const tag = this._getTagNameEquivalent(element);\n\n            outerNode = translation.outerNode;\n            let innerNode = translation.innerNode;\n\n            for (const child of nodeListToArray<Node>(element.childNodes)) {\n                if (child.nodeType === Node.COMMENT_NODE) {\n                    // Do nothing.\n                } else if (child.nodeType === Node.TEXT_NODE) {\n                    innerNode!.appendChild(document.createTextNode((<Text>child).data));\n\n                    if (preserveSpace && tag === 'ttml:span') {\n                        hasPreservedContent = true;\n                    }\n                } else {\n                    let childPreserveSpace = preserveSpace;\n                    const spaceAttr = TtmlParser.getAttributeNS(<Element>child, 'space', xmlNS);\n\n                    if (spaceAttr) {\n                        childPreserveSpace = spaceAttr === 'preserve';\n                    }\n\n                    const pruneRecord = this._prune(\n                        <Element>child,\n                        translation.inheritableStyleSet!,\n                        childPreserveSpace,\n                        time,\n                        translator,\n                        true\n                    );\n\n                    hasPreservedContent = hasPreservedContent || pruneRecord.hasPreservedContent;\n\n                    if (pruneRecord.prunedElement) {\n                        innerNode!.appendChild(pruneRecord.prunedElement);\n                    }\n                }\n            }\n\n            // Now traverse back till the body and build the corresponding structures.\n            if (!ignoreAncestors) {\n                let ancestor = <Element>element.parentNode;\n\n                while (ancestor !== null && ancestor.nodeType === Node.ELEMENT_NODE && ancestor !== this.body) {\n                    translation = this._translate(ancestor, inheritedStyleSet, preserveSpace, time, translator);\n                    if (translation.outerNode) {\n                        innerNode = translation.innerNode;\n                        innerNode!.appendChild(outerNode);\n                        outerNode = translation.outerNode;\n                    } else {\n                        break;\n                    }\n\n                    ancestor = <Element>ancestor.parentNode;\n                }\n            }\n        }\n\n        return { prunedElement: outerNode!, hasPreservedContent };\n    }\n\n    /**\n     * Build this element's ttml computed styleset.\n     * This is used as the base styleSet to filter the inherited styleSet from for an element's children.\n     * @param element - The ttml element to translate.\n     * @param inheritedStyleSet - The styleSet inherited by this element.\n     * @param tagName - The ttml element tagName. All styles do not apply to all tagNames.\n     * @param time - The time to translate against. Elements and styles are temporally transient.\n     * @returns - The resulting computed styleSet.\n     */\n    private _getComputedStyleSet(\n        element: Element,\n        inheritedStyleSet: IDictionaryStringString,\n        tagName: string,\n        time: number\n    ): IDictionaryStringString {\n        // Start off with a clone of the inherited styleset.\n        const computedStyleSet = extend({}, inheritedStyleSet);\n\n        // Iterate over this nodes ttml styles and pave them onto it's computed styleset.\n        extend(computedStyleSet, this.styleSetCache[Number.parseInt(element.getAttribute('data-styleSet')!, 10)]);\n\n        // Apply any temporally active style animations.\n        const sets = element.getElementsByTagNameNS(this.settings.ttmlNamespace, 'set');\n\n        for (const set of nodeListToArray(sets)) {\n            if (this._isTemporallyActive(<Element>set, time)) {\n                TtmlParser.applyInlineStyles(this.settings, computedStyleSet, <Element>set);\n            }\n        }\n\n        if (tagName === 'ttml:p' && computedStyleSet.lineHeight === 'normal') {\n            // Special case for <p>'s with tts:lineHeight='normal'\n            // This means use the largest tts:fontSize value of any\n            // of it's descendant <span>'s. Since we don't know what\n            // values those might be until translateStyle we'll just\n            // save them all and figure it out then.\n            const fontSizes = this._appendSpanFontSizes(element, this._getInheritableStyleSet(computedStyleSet), time, '');\n\n            if (fontSizes) {\n                computedStyleSet['computed-lineHeight'] = fontSizes;\n            }\n        }\n\n        return computedStyleSet;\n    }\n\n    /**\n     * Build this tags ttml applicable styleset from the specified computed styleSet to apply only to it.\n     * @param computedStyleSet - The style set inherited by this element.\n     * @param tagName - The ttml element tagName. All styles do not apply to all tagNames.\n     * @returns - The resulting applicable styleSet.\n     */\n    private _getApplicableStyleSet(computedStyleSet: IDictionaryStringString, tagName: string): IDictionaryStringString {\n        const applicableStyleSet: IDictionaryStringString = {};\n\n        // Special case extent to the front of the list as later processing of\n        // padding will depend on it having already been set first.\n        if (computedStyleSet.extent && this._isStyleApplicable(tagName, 'extent')) {\n            applicableStyleSet.extent = computedStyleSet.extent;\n        }\n\n        // Special case color to the front of the list as later processing of\n        // textOutline will depend on it having already been set first.\n        if (computedStyleSet.color && this._isStyleApplicable(tagName, 'color')) {\n            applicableStyleSet.color = computedStyleSet.color;\n        }\n\n        for (const style in computedStyleSet) {\n            if (this._isStyleApplicable(tagName, style)) {\n                applicableStyleSet[style] = computedStyleSet[style];\n            }\n        }\n\n        return applicableStyleSet;\n    }\n\n    /**\n     * Determines if the specified style applies to the specified ttml tagName.\n     * NOTE: The ttml spec doesn't mention ttml:br in the styles 'applies to' sections but\n     * as noted in the span section everything that applies to ttml:span also applies to ttml:br.\n     * @private\n     * @param tagName - The ttml element tagName. All styles do not apply to all tagNames.\n     * @param style - The style to check against the tagName.\n     * @returns - True if the ttml:style applies to the ttml:tag, otherwise false.\n     */\n    private _isStyleApplicable(tagName: string, style: string): boolean {\n        switch (style) {\n            case 'backgroundColor':\n            case 'display':\n            case 'visibility':\n                return 'ttml:body ttml:div ttml:p ttml:region ttml:rootcontainerregion ttml:span ttml:br'.includes(tagName);\n\n            // Technically these font styles do not apply to <p>s but for some reason the resulting html/css\n            // for span/br doesnt compute line-height correctly if the entire containing <p> (div) isn't all the same...\n            case 'fontFamily':\n            case 'fontSize':\n            case 'fontStyle':\n            case 'fontWeight':\n                return 'ttml:p ttml:span ttml:br'.includes(tagName);\n\n            case 'color':\n            case 'textDecoration':\n            case 'textOutline':\n            case 'wrapOption':\n                return 'ttml:span ttml:br'.includes(tagName);\n\n            case 'direction':\n            case 'unicodeBidi':\n                return 'ttml:p ttml:span ttml:br'.includes(tagName);\n\n            case 'displayAlign':\n            case 'opacity':\n            case 'origin':\n            case 'overflow':\n            case 'padding':\n            case 'showBackground':\n            case 'writingMode':\n            case 'zIndex':\n                return 'ttml:region ttml:rootcontainerregion'.includes(tagName);\n\n            case 'extent':\n                return 'ttml:tt ttml:region ttml:rootcontainerregion'.includes(tagName);\n\n            case 'computed-lineHeight':\n            case 'lineHeight':\n            case 'textAlign':\n                return 'ttml:p'.includes(tagName);\n\n            default:\n                return false;\n        }\n    }\n\n    /**\n     * Filters a computed styleSet into an inheritable styleSet subset to pass on to children.\n     * Not all styles are inheritable.\n     * @private\n     * @param computedStyleSet - The computed styleSet to filter.\n     * @returns - The resulting inheritable styleSet.\n     */\n    private _getInheritableStyleSet(computedStyleSet: IDictionaryStringString): IDictionaryStringString {\n        const inheritedStyleSet: IDictionaryStringString = {};\n\n        for (const style in computedStyleSet) {\n            if (computedStyleSet.hasOwnProperty(style)) {\n                switch (style) {\n                    case 'backgroundColor':\n                    case 'computed-lineHeight':\n                    case 'display':\n                    case 'displayAlign':\n                    case 'extent':\n                    case 'opacity':\n                    case 'origin':\n                    case 'overflow':\n                    case 'padding':\n                    case 'showBackground':\n                    case 'unicodeBidi':\n                    case 'writingMode':\n                    case 'zIndex':\n                        break;\n                    default:\n                        inheritedStyleSet[style] = computedStyleSet[style];\n                }\n            }\n        }\n\n        return inheritedStyleSet;\n        // eslint-disable-next-line max-lines\n    }\n\n    /**\n     * Recurses through an element and it's descendants finding the font sizess of all it's <span>'s.\n     * @param element - The ttml element to translate.\n     * @param inheritedStyleSet - The element's inherited styleSet.\n     * @param time - The time to translate against. Elements and styles are temporally transient.\n     * @param value - The list of font sizes to append to.\n     * @returns - The value with any additional font sizes appended to it.\n     */\n    private _appendSpanFontSizes(element: Element, inheritedStyleSet: IDictionaryStringString, time: number, value: string): string {\n        for (const child of nodeListToArray<Element>(element.childNodes)) {\n            if (child.nodeType === Node.ELEMENT_NODE) {\n                const tag = this._getTagNameEquivalent(child);\n\n                if (tag === 'ttml:span') {\n                    const computedStyleSet = this._getComputedStyleSet(child, inheritedStyleSet, 'ttml:span', time);\n                    const fontSize = computedStyleSet.fontSize;\n\n                    if (fontSize) {\n                        value += (value ? ',' : '') + fontSize;\n                    }\n\n                    value = this._appendSpanFontSizes(child, this._getInheritableStyleSet(computedStyleSet), time, value);\n                }\n            }\n        }\n\n        return value;\n    }\n\n    /**\n     * Determines whether or not the specified element is associated with the specified region.\n     * Ttml defines 5 ordered rules, where the first rule satisfied is used and remaining rules are skipped.\n     * @param element - The ttml element to check.\n     * @param regionId - The id of the region to see if the element is associated with.\n     * @returns - True if the specified element is within the specified region, otherwise false.\n     */\n    private _isInRegion(element: Element, regionId: string): boolean {\n        // Quick test: Out of normal order, but makes following rules simpler.\n        // This is a shortcut to check step #4 first\n        if (!regionId) {\n            return true;\n        }\n\n        const elemRegion = TtmlParser.getAttributeNS(element, 'region', this.settings.ttmlNamespace);\n\n        // 1. If the element specifies a region attribute, then the element is\n        // associated with the region referenced by that attribute;\n        if (elemRegion === regionId) {\n            return true;\n        }\n\n        if (!elemRegion) {\n            // 2. If some ancestor of that element specifies a region attribute, then the element is\n            // associated with the region referenced by the most immediate ancestor that specifies\n            // this attribute;\n            let ancestor = <Element>element.parentNode;\n\n            while (ancestor !== null && ancestor.nodeType === Node.ELEMENT_NODE) {\n                const id = this._getRegionId(ancestor);\n                if (id) {\n                    return id === regionId;\n                }\n                ancestor = <Element>ancestor.parentNode;\n            }\n\n            // 3. If the element contains a descendant element that specifies a region attribute,\n            // then the element is associated with the region referenced by that attribute;\n            for (const node of nodeListToArray(element.getElementsByTagName('*'))) {\n                if (this._getRegionId(<Element>node) === regionId) {\n                    return true;\n                }\n            }\n        }\n\n        // 5. The element is not associated with any region.\n        return false;\n    }\n\n    /**\n     * Gets the region id for the specified element.\n     * @param element - The ttml element to check.\n     * @returns - The id of the region the element is associated with.\n     */\n    private _getRegionId(element: Element): string {\n        let regionId: string;\n\n        if (element.nodeType === Node.ELEMENT_NODE && element.namespaceURI === this.settings.ttmlNamespace) {\n            if (TtmlParser.getLocalTagName(element) === 'region') {\n                regionId = TtmlParser.getAttributeNS(element, 'id', xmlNS);\n            } else {\n                regionId = TtmlParser.getAttributeNS(element, 'region', this.settings.ttmlNamespace);\n            }\n        }\n\n        return regionId!;\n    }\n\n    /**\n     * Gets the tagName of the element with the current ttml namespace prepended if non-standard.\n     * @param element - The ttml element to get the tagName of.\n     * @returns - The tagName or '' if the namespace isn't one of the ttml ones.\n     */\n    private _getTagNameEquivalent(element: Element): string {\n        const tagName = TtmlParser.getLocalTagName(element);\n        const nameSpace = element.namespaceURI;\n\n        if (nameSpace === this.settings.ttmlNamespace) {\n            return `ttml:${tagName}`;\n        }\n\n        if (nameSpace === 'http://www.w3.org/1999/xhtml') {\n            return tagName;\n        }\n\n        return '';\n    }\n\n    /**\n     * Translates the ttml style/value into one or more css styles/values and applies them to the element.\n     * @param element - The ttml element to apply the css style(s) too.\n     * @param tagName - The ttml tagName associated with the element.\n     * @param style - The ttml style name.\n     * @param value - The ttml style value.\n     */\n    // eslint-disable-next-line complexity\n    private _applyStyle(element: HTMLElement, tagName: string, style: string, value: string): void {\n        let mappedValue = value;\n\n        switch (style) {\n            case 'color':\n            case 'backgroundColor': {\n                mappedValue = TtmlContext._ttmlToCssColor(value);\n                css(element, style, mappedValue);\n                return;\n            }\n\n            case 'direction':\n            case 'display': {\n                // No change.\n                css(element, style, mappedValue);\n                return;\n            }\n\n            case 'displayAlign': {\n                // eslint-disable-next-line default-case\n                switch (value) {\n                    case 'before':\n                        mappedValue = 'top';\n                        break;\n                    case 'center':\n                        mappedValue = 'middle';\n                        break;\n                    case 'after':\n                        mappedValue = 'bottom';\n                }\n\n                css(element, 'vertical-align', mappedValue);\n                return;\n            }\n\n            case 'extent': {\n                let width: string;\n                let height: string;\n\n                if (value !== 'auto') {\n                    // Get the individual components.\n                    const coords = value.split(/\\s+/);\n\n                    if (coords.length === 2) {\n                        width = this._ttmlToCssUnits(coords[0], true);\n                        height = this._ttmlToCssUnits(coords[1], false);\n                    }\n                }\n\n                if (!width!) {\n                    width = `${(this.settings.rootContainerRegionDimensions\n                        ? this.settings.rootContainerRegionDimensions.width\n                        : this.settings.relatedMediaObjectRegion!.width\n                    ).toString()}px`;\n                    height = `${(this.settings.rootContainerRegionDimensions\n                        ? this.settings.rootContainerRegionDimensions.height\n                        : this.settings.relatedMediaObjectRegion!.height\n                    ).toString()}px`;\n                }\n\n                css(element, 'position', 'absolute');\n                css(element, 'width', width!);\n                css(element, 'min-width', width!);\n                css(element, 'max-width', width!);\n                css(element, 'height', height!);\n                css(element, 'min-height', height!);\n                css(element, 'max-height', height!);\n                return;\n            }\n\n            case 'fontFamily': {\n                if (this.settings.fontMap && this.settings.fontMap[value]) {\n                    mappedValue = this.settings.fontMap[value];\n                }\n\n                if (value === 'smallCaps') {\n                    // Need to additionally add font-variant: small-caps.\n                    css(element, 'fontVariant', 'small-caps');\n                }\n\n                css(element, style, mappedValue);\n                return;\n            }\n\n            case 'fontSize': {\n                const parts = value.split(/\\s+/);\n\n                // For two part fontSize values we use the vertical size which is in the second part.\n                const size = parts.length > 1 ? parts[1] : parts[0];\n\n                // Set the fontsize scaleFactor to 75% (of cell size) to account for ascenders/descenders etc.\n                mappedValue = this._ttmlToCssFontSize(size, false, 0.75, tagName === 'ttml:region');\n\n                css(element, style, mappedValue);\n                return;\n            }\n\n            case 'fontStyle':\n            case 'fontWeight': {\n                // No change.\n                css(element, style, mappedValue);\n                return;\n            }\n\n            case 'lineHeight': {\n                // Spec doesn't qualify what % lengths mean so I'm going to assume it's % of a\n                // cell and therefore use fontSize conversion method.\n                mappedValue = value === 'normal' ? value : this._ttmlToCssFontSize(value, false);\n\n                css(element, 'line-height', mappedValue);\n                return;\n            }\n\n            case 'computed-lineHeight': {\n                const values = value.split(',');\n                let max = -1;\n\n                for (const fontSize of values) {\n                    // Computed-lineHeight is based off of fontSize so use fontSize conversion method.\n                    mappedValue = this._ttmlToCssFontSize(fontSize, false);\n\n                    if (mappedValue && mappedValue.indexOf('px') === mappedValue.length - 2) {\n                        const height = Number.parseFloat(mappedValue.substr(0, mappedValue.length - 2));\n\n                        if (!isNaN(height) && height > max) {\n                            max = height;\n                        }\n                    }\n                }\n\n                if (max >= 0) {\n                    css(element, 'line-height', `${max}px`);\n                }\n\n                return;\n            }\n\n            case 'origin': {\n                if (value !== 'auto') {\n                    // Get the individual components.\n                    const coords = value.split(/\\s+/);\n\n                    if (coords.length === 2) {\n                        css(element, 'position', 'absolute');\n                        css(element, 'left', this._ttmlToCssUnits(coords[0], true));\n                        css(element, 'top', this._ttmlToCssUnits(coords[1], false));\n                    }\n                }\n\n                return;\n            }\n\n            case 'opacity': {\n                // No change.\n                css(element, style, mappedValue);\n                return;\n            }\n\n            case 'padding': {\n                const contextRect = getDimensions(element);\n\n                // Get the individual components.\n                const parts = value.split(/\\s+/);\n                let first: string;\n                let second: string;\n                let third: string;\n                let forth: string;\n\n                // eslint-disable-next-line default-case\n                switch (parts.length) {\n                    case 1:\n                        // Value is used for all 4 sides.\n                        first = this._ttmlToCssUnits(parts[0], false, contextRect!);\n                        second = this._ttmlToCssUnits(parts[0], true, contextRect!);\n                        mappedValue = format('{0} {1} {0} {1}', first, second);\n                        break;\n                    case 2:\n                        // First is top/bottom, second is left/right.\n                        first = this._ttmlToCssUnits(parts[0], false, contextRect!);\n                        second = this._ttmlToCssUnits(parts[1], true, contextRect!);\n                        mappedValue = format('{0} {1} {0} {1}', first, second);\n                        break;\n                    case 3:\n                        // First is top, second is left/right, third is bottom.\n                        first = this._ttmlToCssUnits(parts[0], false, contextRect!);\n                        second = this._ttmlToCssUnits(parts[1], true, contextRect!);\n                        third = this._ttmlToCssUnits(parts[2], false, contextRect!);\n                        mappedValue = format('{0} {1} {2} {1}', first, second, third);\n                        break;\n                    case 4:\n                        // Top, right, bottom, left.\n                        first = this._ttmlToCssUnits(parts[0], false, contextRect!);\n                        second = this._ttmlToCssUnits(parts[1], true, contextRect!);\n                        third = this._ttmlToCssUnits(parts[2], false, contextRect!);\n                        forth = this._ttmlToCssUnits(parts[3], true, contextRect!);\n                        mappedValue = format('{0} {1} {2} {3}', first, second, third, forth);\n                }\n\n                // Using border width to implement tts:padding as neither padding nor margin fix the size (height) of the content area.\n                css(element, 'box-sizing', 'border-box');\n\n                // TODO: See if we work in FF without the following commented out -moz-box-sizing line now and if so remove it.\n                /// /// css(element, '-moz-box-sizing', 'border-box');\n                css(element, 'border-style', 'solid');\n                css(element, 'border-color', 'transparent');\n\n                // It can be helpful when debugging to change the border-color from transparent to something like rgba(255,255,200,0.5)\n                // css(element, 'border-color', 'rgba(255,255,200,0.5)');\n                css(element, 'border-width', mappedValue);\n                return;\n            }\n\n            // If you know what this was for please document it here and uncomment it.\n            // As of now the caller appeared to be doing nothing with it so commenting it out.\n            /// /// case 'showBackground': {\n            /// /// return this.getAttribute('data-showBackground', value);\n            /// /// }\n\n            case 'textAlign': {\n                // eslint-disable-next-line default-case\n                switch (value) {\n                    case 'start':\n                        mappedValue = 'left'; // TODO: handle rtl correctly.\n                        break;\n                    case 'end':\n                        mappedValue = 'right'; // TODO: handle rtl correctly.\n                }\n\n                css(element, 'text-align', mappedValue);\n                return;\n            }\n\n            case 'textDecoration': {\n                mappedValue = TtmlContext._ttmlToCssTextDecoration(value);\n                css(element, 'text-decoration', mappedValue);\n                return;\n            }\n\n            case 'textOutline': {\n                const defaultColor = css(element, 'color');\n                css(element, 'text-shadow', this._ttmlToCssTextOutline(mappedValue, defaultColor));\n                return;\n            }\n\n            case 'unicodeBidi': {\n                // TODO: Handle multiple options correctly.\n                // eslint-disable-next-line default-case\n                switch (value) {\n                    case 'bidiOverride':\n                        mappedValue = 'bidi-override';\n                }\n                css(element, 'unicode-bidi', mappedValue);\n                return;\n            }\n\n            case 'visibility': {\n                // No change.\n                css(element, style, mappedValue);\n                return;\n            }\n\n            case 'writingMode': {\n                // eslint-disable-next-line default-case\n                switch (value) {\n                    case 'lr':\n                    case 'lrtb': {\n                        css(element, 'writing-mode', 'horizontal-tb'); // CCS3 standard: Doesn't work yet\n                        css(element, '-webkit-writing-mode', 'horizontal-tb'); // Webkit for Chrome\n                        css(element, 'writing-mode', 'lr-tb'); // IE specific\n                        return;\n                    }\n                    case 'rl':\n                    case 'rltb': {\n                        css(element, 'writing-mode', 'horizontal-tb'); // CCS3 standard: Doesn't work yet\n                        css(element, '-webkit-writing-mode', 'horizontal-tb'); // Webkit for Chrome\n                        css(element, 'writing-mode', 'rl-tb'); // IE specific\n                        return;\n                    }\n                    case 'tblr': {\n                        css(element, 'text-orientation', 'upright'); // CCS3 standard: Doesn't work yet\n                        css(element, 'writing-mode', 'vertical-lr'); // CCS3 standard: Doesn't work yet\n                        css(element, '-webkit-text-orientation', 'upright'); // Webkit for Chrome\n                        css(element, '-webkit-writing-mode', 'vertical-lr'); // Webkit for Chrome\n                        css(element, 'writing-mode', 'tb-lr'); // IE specific\n                        return;\n                    }\n                    case 'tb':\n                    case 'tbrl': {\n                        css(element, 'text-orientation', 'upright'); // CCS3 standard: Doesn't work yet\n                        css(element, 'writing-mode', 'vertical-rl'); // CCS3 standard: Doesn't work yet\n                        css(element, '-webkit-text-orientation', 'upright'); // Webkit for Chrome\n                        css(element, '-webkit-writing-mode', 'vertical-rl'); // Webkit for Chrome\n                        css(element, 'writing-mode', 'tb-rl'); // IE specific\n                        return;\n                    }\n                }\n                return;\n            }\n\n            case 'wrapOption': {\n                css(element, 'white-space', value === 'noWrap' ? 'nowrap' : value === 'pre' ? 'pre' : 'normal');\n                return;\n            }\n\n            case 'zIndex': {\n                css(element, style, mappedValue); // Requires global information...\n                return;\n            }\n\n            default: {\n                css(element, style, mappedValue);\n            }\n        }\n    }\n\n    /**\n     * Converts a ttml unit string to a css one.\n     * @param ttmlUnits - The ttml value.\n     * @param width - Indicates whether to perform a width based or a height based conversion.\n     * @param  [contextRect] - The context rectangle to use for conversion.\n     * @returns - The css value.\n     */\n    private _ttmlToCssUnits(ttmlUnits: string, width: boolean, contextRect?: IClientDimension): string {\n        let cssUnits = ttmlUnits;\n\n        if (ttmlUnits) {\n            const unit = ttmlUnits.charAt(ttmlUnits.length - 1);\n\n            // Need to special case handle ttml cell metrics.\n            if (unit === 'c' || unit === '%') {\n                const container = this.settings.rootContainerRegionDimensions\n                    ? this.settings.rootContainerRegionDimensions\n                    : this.settings.relatedMediaObjectRegion;\n                const length = Number.parseFloat(ttmlUnits.substr(0, ttmlUnits.length - 1));\n                let containerSize = width ? container!.width : container!.height;\n                let value: number;\n\n                if (unit === 'c') {\n                    const gridSize = width ? this.settings.cellResolution.columns : this.settings.cellResolution.rows;\n\n                    value = (length * containerSize) / gridSize;\n                } else if (unit === '%') {\n                    // If % units calls also specify a contextRect use that instead of the container.\n                    if (contextRect) {\n                        containerSize = width ? contextRect.width : contextRect.height;\n                    }\n\n                    // Have to convert % to px because padding and vertical-align (displayAlign) are not\n                    // working together if the extent width/height are % instead of px.\n                    value = (containerSize * length) / 100;\n                }\n\n                // Round to 1 decimal place\n                value = Math.round(value! * 10) / 10;\n                cssUnits = `${value}px`;\n            }\n        }\n\n        return cssUnits;\n    }\n\n    /**\n     * Converts a ttml font size to a css one.\n     * @param ttmlUnits - The ttml value.\n     * @param width - Indicates whether to perform a width based or a height based conversion.\n     * @param [scaleFactor] - The scale factor to use for conversion.\n     * @param [isRegion] - Indicates whether or not the conversion is being done for a <region>.\n     * @returns - The css value.\n     */\n    private _ttmlToCssFontSize(ttmlUnits: string, width: boolean, scaleFactor: number = 1, isRegion: boolean = false): string {\n        let cssUnits = ttmlUnits;\n\n        if (ttmlUnits) {\n            const unit = ttmlUnits.charAt(ttmlUnits.length - 1);\n\n            // Need to special case handle ttml cell metrics and % units.\n            if (unit === 'c' || (isRegion && unit === '%')) {\n                const container = this.settings.rootContainerRegionDimensions\n                    ? this.settings.rootContainerRegionDimensions\n                    : this.settings.relatedMediaObjectRegion;\n                const length = Number.parseFloat(ttmlUnits.substr(0, ttmlUnits.length - 1));\n                const containerSize = width ? container!.width : container!.height;\n                const gridSize = width ? this.settings.cellResolution.columns : this.settings.cellResolution.rows;\n                let value = (length * containerSize) / gridSize;\n\n                if (unit === '%') {\n                    // Length is % so divide by 100.\n                    value /= 100;\n                }\n\n                // Apply the scale factor and limit to one decimal place precision.\n                value = Math.floor(value * scaleFactor * 10) / 10;\n\n                cssUnits = `${value}px`;\n            }\n        }\n\n        return cssUnits;\n    }\n\n    /**\n     * Converts a ttml text outline style value to a css one.\n     * @param textOutline - The ttml value.\n     * @param defaultColor - Default value of the outline color.\n     * @returns - The css value.\n     */\n    private _ttmlToCssTextOutline(textOutline: string, defaultColor: string): string {\n        let textShadow = 'none';\n\n        if (!isNullOrWhiteSpace(textOutline) && textOutline !== 'none') {\n            let parts: string[] = textOutline.split(/\\s+/);\n            let color: string = '';\n            let thickness: string = '';\n            let blur: string = '';\n\n            if (parts.length === 1) {\n                color = defaultColor;\n                thickness = parts[0];\n                blur = '';\n            } else if (parts.length === 3) {\n                color = parts[0];\n                thickness = parts[1];\n                blur = parts[2];\n            } else if (parts.length === 2) {\n                const firstChar = parts[0].charAt(0);\n\n                if (firstChar >= '0' && firstChar <= '9') {\n                    color = defaultColor;\n                    thickness = parts[0];\n                    blur = parts[1];\n                } else {\n                    color = parts[0];\n                    thickness = parts[1];\n                    blur = '';\n                }\n            }\n\n            // Spec doesn't qualify what % lengths mean so I'm going to assume it's % of a cell\n            // and therefore use fontSize conversion method with the same scaleFactor applied\n            // to fontSize since it's the font that we're outlining here.\n            blur = this._ttmlToCssFontSize(blur, false, 0.75);\n            thickness = this._ttmlToCssFontSize(thickness, false, 0.75);\n\n            parts = <string[]>TtmlContext.lengthRegEx.exec(thickness);\n\n            if (parts && parts.length === 3) {\n                const width = Math.round(Number.parseFloat(parts[1]));\n                const units = parts[2];\n\n                textShadow = '';\n\n                for (let x = -width; x <= width; x++) {\n                    for (let y = -width; y <= width; y++) {\n                        if (x !== 0 || y !== 0) {\n                            textShadow += format('{0}{4} {1}{4} {2} {3}, ', x, y, blur, TtmlContext._ttmlToCssColor(color), units);\n                        }\n                    }\n                }\n\n                if (textShadow) {\n                    textShadow = textShadow.substr(0, textShadow.length - 2);\n                }\n            }\n        }\n\n        return textShadow;\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 * TtmlTimeParser class.\n * @classdesc - The TtmlTimeParser class is used to parse ttml time expressions which can be absolute or relative.\n */\nexport class TtmlTimeParser {\n    /**\n     * @name - absoluteTimeRegex\n     * Regex to parse absolute ttml times. (clock-time).\n     * Hours \":\" minutes \":\" seconds ( fraction | \":\" frames ( \".\" sub-frames )? )?.\n     * NOTE: (johnlemi)  Our clocktime regex matches 1 or 2 digits for hours instead of 2 because even.\n     * though the spec says 2 we have some existing ttml from the Office team with end attrs with 1 hour digit.\n     * @static\n     * @private\n     * @type {string}\n     */\n    private static readonly absoluteTimeRegex: RegExp = /^(\\d+):(\\d{2}):(\\d{2})((\\.\\d+)|:(\\d{2,}(\\.\\d+)?))?$/;\n\n    /**\n     * @name - relativeTimeRegex\n     * Regex to parse relative ttml times. (offset-time).\n     * time-count fraction? metric.\n     * @static\n     * @private\n     * @type {string}\n     */\n    private static readonly relativeTimeRegex: RegExp = /^(\\d+(\\.\\d+)?)(ms|[fhmst])$/;\n\n    /**\n     * @name - mediaFrameRate.\n     * @description - mediaFrameRate.\n     * @private\n     * @type {string}\n     */\n    private readonly mediaFrameRate: number;\n\n    /**\n     * @name - mediaTickRate.\n     * @description - mediaTickRate.\n     * @private\n     * @type {string}\n     */\n    private readonly mediaTickRate: number;\n\n    /**\n     * Constructor for the TtmlTimeParser class.\n     * @param _mediaFrameRate - The ttml media frame rate.\n     * @param _mediaTickRate - The ttml media tick rate.\n     */\n    public constructor(_mediaFrameRate: number, _mediaTickRate: number) {\n        this.mediaFrameRate = _mediaFrameRate;\n        this.mediaTickRate = _mediaTickRate;\n    }\n\n    /**\n     * Parses a ttml time expression string into a number.\n     * @param ttmlTime - The time expression to parse.\n     * @returns - The number the time expression represents, or 0 if the exression doesn't match.\n     */\n    public parse(ttmlTime: string): number {\n        if (!ttmlTime) {\n            return 0;\n        }\n\n        const absoluteTime = TtmlTimeParser.absoluteTimeRegex.exec(ttmlTime);\n\n        if (absoluteTime && absoluteTime.length > 3) {\n            const hours = Number.parseInt(absoluteTime[1], 10) * 60 * 60;\n            const minutes = Number.parseInt(absoluteTime[2], 10) * 60;\n            const seconds = Number.parseInt(absoluteTime[3], 10);\n            let subseconds = 0;\n\n            if (absoluteTime[5]) {\n                subseconds = Number.parseFloat(absoluteTime[4]) * 1000;\n            }\n\n            if (absoluteTime[6]) {\n                subseconds = Math.round(Number.parseFloat(absoluteTime[6]) * this._getTimeUnitMultiplier('f'));\n            }\n\n            return (hours + minutes + seconds) * 1000 + subseconds;\n        }\n\n        const relativeTime = TtmlTimeParser.relativeTimeRegex.exec(ttmlTime);\n\n        if (relativeTime && relativeTime.length > 3) {\n            return Math.round(Number.parseFloat(relativeTime[1]) * this._getTimeUnitMultiplier(relativeTime[3]));\n        }\n\n        return 0;\n    }\n\n    /**\n     * Converts a ttml time unit expression string into a multiplier number.\n     * @param timeUnit - The time unit expression.\n     * @returns - The multiplier value, or 0 if the unit exression doesn't match.\n     */\n    private _getTimeUnitMultiplier(timeUnit: string): number {\n        switch (timeUnit) {\n            case 'h':\n                return 1000 * 60 * 60;\n            case 'ms':\n                return 1;\n            case 'm':\n                return 1000 * 60;\n            case 's':\n                return 1000;\n            case 'f':\n                return 1000 / this.mediaFrameRate;\n            case 't':\n                return 1000 / this.mediaTickRate;\n            default:\n                return 0;\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 { format, IDictionaryStringString, IGrid, nodeListToArray, trim } from '../utilities';\nimport { ITtmlContext, TtmlContext } from './ttml-context';\nimport { ITtmlSettings, TtmlSettings, xmlNS } from './ttml-settings';\nimport { TtmlTimeParser } from './ttml-time-parser';\n\n// Timed Text Markup Language (TTML).\n// See http://www.w3.org/TR/ttml1/ for more details.\n\n/**\n * @interface ITtmlEvent\n * @classdesc - The ITtmlEvent interface contract.\n * @export\n */\nexport interface ITtmlEvent {\n    time: number;\n    element?: Element;\n}\n\n/**\n * @interface ITtmlTimingBounds\n * @classdesc - The ITtmlTimingBounds interface contract.\n * @export\n */\ninterface ITtmlTimingBounds {\n    start: number;\n    end: number;\n}\n\n/**\n *\n * The TtmlParser class.\n *\n */\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nexport class TtmlParser {\n    /**\n     * @name - mediaStart\n     * Used as the start time for applyTiming when applying to the entire document.\n     * @static\n     * @private\n     * @type {number}\n     */\n    private static readonly mediaStart: number = -1;\n\n    /**\n     * @name - mediaEnd\n     * Used as the end time for applyTiming when applying to the entire document.\n     * Picking a number that should always be greater than any real media end time.\n     * @static\n     * @private\n     * @type {number}\n     */\n    private static readonly mediaEnd: number = 99_999_999;\n\n    /**\n     * Gets the local tagName of a Node.\n     * @param node - The node to get the tagName of.\n     * @returns - The tagName.\n     */\n    public static getLocalTagName(node: Node): string {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        return (<Element>node).localName || (<any>node).baseName;\n    }\n\n    /**\n     * Gets the value of a namespaced attribute. First tries element.getAttributeNS() but falls back\n     * to scanning each attribute if that fails.\n     * If you know which cases go into the fallback code please document it here.\n     * @param element - The element to get the attribute of.\n     * @param name - The attribute name.\n     * @param namespace - The attribute namespace.\n     * @returns - The attribute value. Or an empty string if a matching attribute is not found.\n     */\n    public static getAttributeNS(element: Element, name: string, namespace: string): string {\n        let result = element.getAttributeNS(namespace, name);\n\n        if (!result) {\n            // Go through all the attributes looking for a match.\n            for (const attribute of nodeListToArray(element.attributes)) {\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                if ((<any>attribute).localName === name && attribute.lookupNamespaceURI((<any>attribute).prefix) === namespace) {\n                    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                    result = (<any>attribute).value;\n                    break;\n                }\n            }\n        }\n\n        return result!;\n    }\n\n    /**\n     * Parses a ttml document and builds a ttmlContext instance from it.\n     * @param ttmlDocument - The ttml document to parse.\n     * @param settingsOverrides - The ttml settings overrides to use.\n     * @returns - The resulting ttmlContext instance that can be used to get cues by time.\n     */\n    public static parse(ttmlDocument: XMLDocument, settingsOverrides: ITtmlSettings): ITtmlContext {\n        ttmlDocument = typeof ttmlDocument === 'string' ? TtmlParser._parseXml(ttmlDocument) : ttmlDocument;\n\n        const ttmlContext = new TtmlContext();\n\n        // Start initializing the context.\n        ttmlContext.settings = new TtmlSettings(settingsOverrides);\n        ttmlContext.root = TtmlParser._verifyRoot(ttmlDocument, ttmlContext);\n        ttmlContext.body = TtmlParser._getFirstElementByTagNameNS(ttmlContext.root, 'body', ttmlContext.settings.ttmlNamespace);\n        ttmlContext.events = [];\n        ttmlContext.styleSetCache = [];\n\n        if (ttmlContext.body) {\n            // Parse the root <tt> attributes.\n            TtmlParser._parseTtAttrs(ttmlContext);\n\n            // Set up our regions.\n            const head = TtmlParser._ensureRegions(ttmlContext);\n\n            const timeBase =\n                TtmlParser.getAttributeNS(ttmlContext.root, 'timeBase', ttmlContext.settings.ttmlParameterNamespace) || 'media';\n\n            if (ttmlContext.settings.supportedTimeBase.includes(timeBase)) {\n                // Process textnodes into anonymous spans.\n                TtmlParser._processAnonymousSpans(ttmlContext, ttmlContext.body);\n\n                const timeParser = new TtmlTimeParser(ttmlContext.settings.mediaFrameRate, ttmlContext.settings.mediaTickRate);\n\n                // Apply the intervals over the tree.\n                TtmlParser._applyTiming(\n                    ttmlContext,\n                    ttmlContext.root,\n                    { start: TtmlParser.mediaStart, end: TtmlParser.mediaEnd },\n                    true,\n                    timeParser\n                );\n\n                // Apply the style inheritance over the tree.\n                TtmlParser._applyStyling(ttmlContext, head);\n            }\n\n            // Add an dummy end event for the captions to appear until end of video.\n            // Not sure why we need to do this, please add to this comment if you know.\n            ttmlContext.events.push({ time: TtmlParser.mediaEnd, element: undefined });\n\n            // Sort events into temporal order.\n            ttmlContext.events.sort((event1: ITtmlEvent, event2: ITtmlEvent) => {\n                return event1.time - event2.time;\n            });\n        }\n\n        return ttmlContext;\n    }\n\n    /**\n     * Applies the elements inline styles into the styleSet.\n     * @param settings - The TtmlSettings for this document.\n     * @param styleSet - The styleSet to build upon.\n     * @param element - The element to apply the styles of.\n     */\n    public static applyInlineStyles(settings: TtmlSettings, styleSet: IDictionaryStringString, element: Element): void {\n        for (const attribute of nodeListToArray(element.attributes)) {\n            if (attribute.namespaceURI === settings.ttmlStyleNamespace) {\n                // Trim() because we see lots of ttml attribute values with trailing space...\n                styleSet[TtmlParser.getLocalTagName(attribute)] = trim(attribute.nodeValue!);\n            }\n        }\n    }\n\n    /**\n     * Parses an xml document in string format to an XMLDocument.\n     * @param xmlString - The xml string to parse.\n     * @returns - The resulting XMLDocument, or null if the xml string failed to parse.\n     */\n    private static _parseXml(xmlString: string): XMLDocument {\n        let xml: XMLDocument;\n\n        if (window.DOMParser) {\n            const domParser = new window.DOMParser();\n            xml = domParser.parseFromString(xmlString, 'application/xml');\n        } else {\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            const domParser = new (<any>window).ActiveXObject('Microsoft.XMLDOM');\n            domParser.async = false;\n            domParser.loadXML(xmlString);\n            xml = <XMLDocument>domParser;\n        }\n        return xml;\n    }\n\n    /**\n     * Verifies that root <tag> of the specified document is the expected ttml <tt> tagName and\n     * updates the settings namespaces from it if they are non standard.\n     * @param ttmlDocument - The ttml document to verify.\n     * @param ttmlContext - The ttmlContext for this document.\n     * @returns - The valid root Element, or or null if the root Element was not valid.\n     */\n    private static _verifyRoot(ttmlDocument: XMLDocument, ttmlContext: TtmlContext): Element {\n        let root: Element;\n        const candidate = ttmlDocument.documentElement;\n\n        if (TtmlParser.getLocalTagName(candidate) === 'tt') {\n            if (candidate.namespaceURI !== 'http://www.w3.org/ns/ttml') {\n                ttmlContext.settings.ttmlNamespace = candidate.namespaceURI!;\n                ttmlContext.settings.ttmlStyleNamespace = `${ttmlContext.settings.ttmlNamespace}#styling`;\n                ttmlContext.settings.ttmlParameterNamespace = `${ttmlContext.settings.ttmlNamespace}#parameter`;\n                ttmlContext.settings.ttmlMetaNamespace = `${ttmlContext.settings.ttmlNamespace}#metadata`;\n            }\n\n            root = candidate;\n        }\n\n        return root!;\n    }\n\n    /**\n     * Parses the <tt> tag attributes and initializes ttmlContext properties from them.\n     * @param ttmlContext - The ttmlContext for this document.\n     */\n    private static _parseTtAttrs(ttmlContext: TtmlContext): void {\n        const cellRes = TtmlParser.getAttributeNS(ttmlContext.root, 'cellResolution', ttmlContext.settings.ttmlParameterNamespace);\n        const extent = TtmlParser.getAttributeNS(ttmlContext.root, 'extent', ttmlContext.settings.ttmlStyleNamespace);\n        let cellGrid: IGrid | null = null;\n\n        if (cellRes) {\n            const parts = trim(cellRes).split(/\\s+/);\n\n            if (parts.length === 2) {\n                const columns = Math.round(Number.parseFloat(parts[0]));\n                const rows = Math.round(Number.parseFloat(parts[1]));\n\n                if (rows > 0 && columns > 0) {\n                    cellGrid = { rows, columns };\n                }\n            }\n        }\n\n        if (cellGrid) {\n            ttmlContext.settings.cellResolution = cellGrid;\n        }\n\n        if (extent) {\n            if (extent !== 'auto') {\n                // Get the individual components.\n                const coords = extent.split(/\\s+/);\n\n                if (\n                    coords.length === 2 &&\n                    coords[0].substr(coords[0].length - 2) === 'px' &&\n                    coords[1].substr(coords[1].length - 2) === 'px'\n                ) {\n                    const width = Number.parseFloat(coords[0].substr(0, coords[0].length - 2));\n                    const height = Number.parseFloat(coords[1].substr(0, coords[1].length - 2));\n\n                    // Round to integer.\n                    ttmlContext.settings.rootContainerRegionDimensions = { width: Math.round(width), height: Math.round(height) };\n                }\n            }\n        }\n    }\n\n    /**\n     * Ensures we have the elements/regions we require by either finding them or creating them if they are not present.\n     * @param ttmlContext - The ttmlContext for this document.\n     * @returns - The <head> element.\n     */\n    private static _ensureRegions(ttmlContext: TtmlContext): Element {\n        // Create our rootContainerRegion\n        ttmlContext.rootContainerRegion = ttmlContext.root.ownerDocument.createElementNS(\n            ttmlContext.settings.ttmlNamespace,\n            'rootcontainerregion'\n        );\n\n        ttmlContext.root.appendChild(ttmlContext.rootContainerRegion);\n\n        const extents = ttmlContext.settings.rootContainerRegionDimensions\n            ? format(\n                  '{0}px {1}px',\n                  ttmlContext.settings.rootContainerRegionDimensions.width,\n                  ttmlContext.settings.rootContainerRegionDimensions.height\n              )\n            : 'auto';\n\n        ttmlContext.rootContainerRegion.setAttributeNS(ttmlContext.settings.ttmlStyleNamespace, 'extent', extents);\n\n        let head = TtmlParser._getFirstElementByTagNameNS(ttmlContext.root, 'head', ttmlContext.settings.ttmlNamespace);\n\n        // Ensure we have a <head>\n        if (!head) {\n            // No <head> so we need to create that now.\n            head = ttmlContext.root.ownerDocument.createElementNS(ttmlContext.settings.ttmlNamespace, 'head');\n            ttmlContext.root.appendChild(head);\n        }\n\n        // Ensure we have a <layout>\n        ttmlContext.layout = TtmlParser._getFirstElementByTagNameNS(head, 'layout', ttmlContext.settings.ttmlNamespace);\n\n        if (!ttmlContext.layout) {\n            // No <layout> so we need to create that now.\n            ttmlContext.layout = ttmlContext.root.ownerDocument.createElementNS(ttmlContext.settings.ttmlNamespace, 'layout');\n            ttmlContext.root.appendChild(ttmlContext.layout);\n        }\n\n        // Create an anonymous region if we have no regions.\n        const regions = ttmlContext.layout.getElementsByTagNameNS(ttmlContext.settings.ttmlNamespace, 'region');\n\n        if (!regions.length) {\n            const anonymousRegion = ttmlContext.root.ownerDocument.createElementNS(ttmlContext.settings.ttmlNamespace, 'region');\n\n            anonymousRegion.setAttributeNS(xmlNS, 'id', 'anonymous');\n            anonymousRegion.setAttribute('data-isanonymous', '1');\n            ttmlContext.layout.appendChild(anonymousRegion);\n\n            ttmlContext.body.setAttributeNS(ttmlContext.settings.ttmlNamespace, 'region', 'anonymous');\n        }\n\n        return head;\n    }\n\n    /**\n     * Recurses through all the <p> elements in the document and groups all the contiguous TEXT_NODES together into <span>'s.\n     * @param ttmlContext - The ttmlContext for this document.\n     * @param element - The element to process the TEXT_NODES of.\n     */\n    private static _processAnonymousSpans(ttmlContext: TtmlContext, element: Element): void {\n        // If this element is <p> then group all contiguous textnodes together in <span>\n        if (TtmlParser._isTagNS(element, 'p', ttmlContext.settings.ttmlNamespace)) {\n            const textNodeGroups: Node[][] = [];\n            let prevNodeType: number = 0;\n\n            for (const child of nodeListToArray(element.childNodes)) {\n                if (child.nodeType === Node.TEXT_NODE) {\n                    if (prevNodeType !== Node.TEXT_NODE) {\n                        textNodeGroups.push([]);\n                    }\n\n                    textNodeGroups[textNodeGroups.length - 1].push(child);\n                }\n\n                prevNodeType = child.nodeType;\n            }\n\n            for (const group of textNodeGroups) {\n                const anonSpan = ttmlContext.root.ownerDocument.createElementNS(ttmlContext.settings.ttmlNamespace, 'span');\n\n                anonSpan.appendChild(group[0].parentNode!.replaceChild(anonSpan, group[0]));\n\n                for (let index = 1; index < group.length; index++) {\n                    anonSpan.appendChild(group[index]);\n                }\n            }\n        }\n\n        // Then recurse through the contents doing the same thing for those.\n        for (const child of nodeListToArray<Element>(element.childNodes)) {\n            this._processAnonymousSpans(ttmlContext, child);\n        }\n    }\n\n    /**\n     * Recurses through the document element tree to determine the absolute start and end times of all the elements\n     * using the TTML subset of the SMIL timing model. The reference times passed in 'bound' are absolute times.\n     * The result of calling this is to set the local start time and end time to absolute times between these two\n     * reference times, based on the begin, end and dur attributes and to recursively set all of the children.\n     * @param ttmlContext - The ttmlContext for this document.\n     * @param element - The element to apply the timing to.\n     * @param bound - The bounds for the timing.\n     * @param isParallelContext - Indicates whether or not this element is in a parallel timing context.\n     * @param timeParser - The TtmlTimeParser to use to parse this elements time attributes.\n     */\n    private static _applyTiming(\n        ttmlContext: TtmlContext,\n        element: Element,\n        bound: ITtmlTimingBounds,\n        isParallelContext: boolean,\n        timeParser: TtmlTimeParser\n    ): void {\n        const beginAttribute = TtmlParser.getAttributeNS(element, 'begin', ttmlContext.settings.ttmlNamespace);\n        let startTime = beginAttribute ? timeParser.parse(beginAttribute) : bound.start;\n        let endTime = 0;\n\n        // Compute the simple duration of the interval.\n        let duration = 0;\n        let end = 0;\n        const durationAttribute = TtmlParser.getAttributeNS(element, 'dur', ttmlContext.settings.ttmlNamespace);\n        const endAttribute = TtmlParser.getAttributeNS(element, 'end', ttmlContext.settings.ttmlNamespace);\n\n        if (!durationAttribute && !endAttribute) {\n            // No direct timing attested, so use default based on context.\n            // Parallel children have indefinite default duration, truncated by bounds.\n            if (isParallelContext) {\n                // Sequential children have zero default duration.\n                if (startTime <= bound.end) {\n                    endTime = bound.end;\n                } else {\n                    endTime = 0;\n                }\n            }\n        } else if (durationAttribute && endAttribute) {\n            // Both duration and end attested, the minimum interval applies.\n            duration = timeParser.parse(durationAttribute);\n            end = timeParser.parse(endAttribute);\n            const minEnd = Math.min(startTime + duration, bound.start + end);\n            endTime = Math.min(minEnd, bound.end);\n        } else if (endAttribute) {\n            // Only end attested.\n            end = timeParser.parse(endAttribute);\n            endTime = Math.min(bound.start + end, bound.end);\n        } else {\n            // Only dur attested.\n            duration = timeParser.parse(durationAttribute);\n            endTime = Math.min(startTime + duration, bound.end);\n        }\n\n        if (endTime < startTime) {\n            endTime = startTime;\n        }\n\n        startTime = Math.floor(startTime);\n        endTime = Math.floor(endTime);\n\n        element.setAttribute('data-time-start', startTime.toString());\n        element.setAttribute('data-time-end', endTime.toString());\n\n        if (\n            startTime >= 0 &&\n            ttmlContext.events.filter(event => {\n                return event.time === startTime;\n            }).length <= 0\n        ) {\n            ttmlContext.events.push({ time: startTime, element });\n        }\n\n        let start = startTime;\n\n        for (const child of nodeListToArray<Element>(element.childNodes)) {\n            if (child.nodeType === Node.ELEMENT_NODE) {\n                // Parallel is the default so null is OK here.\n                if (TtmlParser.getAttributeNS(element, 'timeContainer', ttmlContext.settings.ttmlNamespace) !== 'seq') {\n                    this._applyTiming(ttmlContext, child, { start: startTime, end: endTime }, true, timeParser);\n                } else {\n                    this._applyTiming(ttmlContext, child, { start, end: endTime }, false, timeParser);\n                    start = Number.parseInt(child.getAttribute('data-time-end')!, 10);\n                }\n            }\n        }\n    }\n\n    /**\n     * Recurses through all the elements in <head> applying the ttml sytling to them based on the <style>'s.\n     * @param ttmlContext - The ttmlContext for this document.\n     * @param head - The element to process the TEXT_NODES of.\n     */\n    private static _applyStyling(ttmlContext: TtmlContext, head: Element): void {\n        // First find all the <style>'s\n        const styling = TtmlParser._getFirstElementByTagNameNS(head, 'styling', ttmlContext.settings.ttmlNamespace);\n        const styles = styling ? nodeListToArray(styling.getElementsByTagNameNS(ttmlContext.settings.ttmlNamespace, 'style')) : [];\n\n        // Apply the styles to every element in the body\n        for (const element of nodeListToArray(ttmlContext.root.querySelectorAll('*'))) {\n            this._applyStyle(ttmlContext, element, <Element[]>styles);\n        }\n    }\n\n    /**\n     * Applies the ttml styling to the specified element.\n     * Apply styles in the correct order to element by building a styleSet, adding it\n     * to the stlyeSetCache, and the adding reference to the cached styleSet to the element.\n     * @param ttmlContext - The ttmlContext for this document.\n     * @param element - The element to apply the ttml styling to.\n     * @param styles - The set of styles to apply.\n     */\n    private static _applyStyle(ttmlContext: TtmlContext, element: Element, styles: Element[]): void {\n        const styleSet: IDictionaryStringString = {};\n\n        // Find all the applicable styles and set them as properties on styleSet.\n        this._applyStylesheet(ttmlContext.settings, styleSet, element, styles);\n        TtmlParser.applyInlineStyles(ttmlContext.settings, styleSet, element);\n\n        let empty = true;\n\n        for (const style in styleSet) {\n            // Just need to see if there's at least one.\n            if (styleSet.hasOwnProperty(style)) {\n                empty = false;\n                break;\n            }\n        }\n\n        if (!empty) {\n            // Record the applied set to the element.\n            element.setAttribute('data-styleSet', ttmlContext.styleSetCache.length.toString());\n            ttmlContext.styleSetCache.push(styleSet);\n        }\n    }\n\n    /**\n     * For each style id on the element, find the corresponding style element and then\n     * apply the stylesheet into styleset; this recurses over the tree of referenced styles.\n     * @param settings - The TtmlSettings for this document.\n     * @param styleSet - The styleSet to build upon.\n     * @param element - The element to apply the styles of.\n     * @param styles - The set of styles to apply.\n     */\n    private static _applyStylesheet(settings: TtmlSettings, styleSet: IDictionaryStringString, element: Element, styles: Element[]): void {\n        // Find all the style ID references.\n        const styleAttribute = TtmlParser.getAttributeNS(element, 'style', settings.ttmlNamespace);\n        const ids = styleAttribute ? styleAttribute.split(/\\s+/) : [];\n\n        for (const styleId of ids) {\n            for (const style of styles) {\n                // Filter on those whose id is the one we want.\n                if (TtmlParser.getAttributeNS(style, 'id', xmlNS) === styleId) {\n                    // Recurse into its style references.\n                    this._applyStylesheet(settings, styleSet, style, styles);\n\n                    // Do inline styles.\n                    TtmlParser.applyInlineStyles(settings, styleSet, style);\n                }\n            }\n        }\n\n        // If the element is a region do nested styles. NOTE regions can only be referenced from elements in the body.\n        if (TtmlParser._isTagNS(element, 'region', settings.ttmlNamespace)) {\n            // Find all the style elements in the TTML namespace.\n            for (const style of nodeListToArray(element.getElementsByTagNameNS(settings.ttmlNamespace, 'style'))) {\n                TtmlParser.applyInlineStyles(settings, styleSet, <Element>style);\n            }\n        }\n    }\n\n    /**\n     * Determines whether or not the namespace and local tagName of an element matches\n     * the specified namespace and tag name.\n     * @param element - The node to compare against.\n     * @param tagName - The tag name.\n     * @param namespace - The attribute namespace.\n     * @returns - True if the elements ns/tagName match, otherwise false.\n     */\n    private static _isTagNS(element: Element, tagName: string, namespace: string): boolean {\n        return element.namespaceURI === namespace && this.getLocalTagName(element) === tagName;\n    }\n\n    /**\n     * Gets the first matching element that matches the specified tagName and namespace.\n     * @param context - The context to search within.\n     * @param tagName - The tagName to match.\n     * @param namespace - The namespace to match.\n     * @returns - The first matching element found, or null if there are no matches.\n     */\n    private static _getFirstElementByTagNameNS(context: Element, tagName: string, namespace: string): Element {\n        let result: Element;\n        if (context) {\n            const matches = context.getElementsByTagNameNS(namespace, tagName);\n\n            if (matches && matches.length) {\n                result = matches[0];\n            }\n        }\n\n        return result!;\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\nimport { ICurrentClosedCaptionsSettings } from '../data';\nimport {\n    css,\n    format,\n    getDimensions,\n    IDictionaryStringString,\n    PlayerUtility,\n    removeInnerHtml,\n    selectElements,\n    selectFirstElement\n} from '../utilities';\nimport { IClosedCaptionsProps } from './closed-captions-props';\nimport { ITtmlContext } from './ttml-context';\nimport { TtmlParser } from './ttml-parser';\nimport { ITtmlSettings } from './ttml-settings';\nimport { closedCaptionsSettingsMap, closedCaptionsSettingsOptions } from './video-closed-captions-settings';\n\n/**\n *\n * ClosedCaptions React component for video player.\n *\n */\nexport default class ClosedCaptions extends React.Component<IClosedCaptionsProps> {\n    /**\n     * @name - currentSettings\n     * @description - The current closed captions settings.\n     * @private\n     * @type {IDictionaryStringString}\n     */\n    public currentSettings: ICurrentClosedCaptionsSettings | undefined;\n\n    /**\n     * @name - userPreferences\n     * @description - The user preference overrides for the closed captions.\n     * @static\n     * @public\n     * @type {ICcUserPreferences}\n     */\n    private userPreferences: ICcUserPreferences = {\n        text: {},\n        window: {}\n    };\n\n    private readonly closedCaptionDiv: React.RefObject<HTMLDivElement> = React.createRef<HTMLDivElement>();\n\n    /**\n     * @name - lastPlayPosition\n     * @description - The last player position passed to updateCaptions.\n     * This is used to call updateCaptions again when the cc language is changed.\n     * Play could be paused at that time.\n     * @private\n     * @type {number}\n     */\n    private lastPlayPosition: number = 0;\n\n    /**\n     * @name - ttmlContext\n     * @description - The ttmlContext for the current ttml document.\n     * @private\n     * @type {ITtmlContext}\n     */\n    private ttmlContext: ITtmlContext | null = null;\n\n    public constructor(props: IClosedCaptionsProps) {\n        super(props);\n        this.resetCaptions();\n        this.clicked = this.clicked.bind(this);\n    }\n\n    public render(): JSX.Element {\n        const { className } = this.props;\n        const closedCaptionDivStyle = {\n            bottom: this.props.isVideoControlVisible ? '2.5em' : '0',\n            transition: 'bottom 0.5s ease-in 0s'\n        };\n        return (\n            <div\n                role='none'\n                className={className}\n                ref={this.closedCaptionDiv}\n                aria-hidden={!this.props.showClosedCaptions}\n                style={closedCaptionDivStyle}\n                onClick={this.clicked}\n            />\n        );\n    }\n\n    public clicked(): void {\n        this.props.onClosedCaptionClick();\n    }\n\n    public componentDidMount(): void {\n        if (this.props.ccURL) {\n            this._setCcLanguage(this.props.ccURL);\n        }\n        window &&\n            window.addEventListener('resize', () => {\n                if (this.props.showClosedCaptions) {\n                    this.updateCaptions(this.props.currentTime);\n                }\n            });\n    }\n\n    public shouldComponentUpdate(nextProps: IClosedCaptionsProps): boolean {\n        let shouldRender = false;\n        if (nextProps.showClosedCaptions || this.props.showClosedCaptions !== nextProps.showClosedCaptions) {\n            shouldRender = true;\n        }\n        return shouldRender;\n    }\n\n    public componentWillUnmount(): void {\n        window &&\n            window.removeEventListener('resize', () => {\n                if (this.props.showClosedCaptions) {\n                    this.updateCaptions(this.props.currentTime);\n                }\n            });\n    }\n\n    public componentDidUpdate(prevProps: IClosedCaptionsProps): void {\n        if (this.props.showClosedCaptions) {\n            if (prevProps.ccLanguage! !== this.props.ccLanguage!) {\n                if (this.props.ccURL) {\n                    this._setCcLanguage(this.props.ccURL);\n                }\n            }\n            this.applySettings();\n            this.resetCaptions();\n            this.updateCaptions(this.props.currentTime);\n            if (prevProps.isVideoControlVisible !== this.props.isVideoControlVisible) {\n                this.applySettings();\n                this.resetCaptions();\n\n                // Setting up a delay so that right height and width is calculated\n                window.setTimeout(() => {\n                    this.updateCaptions(this.props.currentTime);\n                }, 500);\n            }\n        }\n    }\n\n    /**\n     * Displays a mocked caption container with content, used to show the caption preset preview.\n     */\n    public showSampleCaptions(): void {\n        this.ttmlContext = null;\n        const mockCaptions: XMLDocument = new DOMParser().parseFromString(\n            `<?xml version='1.0' encoding='utf-8'?>\n<tt xml:lang='en-us' xmlns='http://www.w3.org/ns/ttml' xmlns:tts='http://www.w3.org/ns/ttml#styling'\nxmlns:ttm='http://www.w3.org/ns/ttml#metadata'>\n    <head>\n    <metadata>\n        <ttm:title>Media.wvx.aib</ttm:title>\n        <ttm:copyright>Copyright (c) 2013 Microsoft Corporation.  All rights reserved.</ttm:copyright>\n    </metadata>\n    <styling>\n        <style xml:id='Style1' tts:fontFamily='proportionalSansSerif' tts:fontSize='0.8c' tts:textAlign='center'\n        tts:color='white' />\n    </styling>\n    <layout>\n        <region style='Style1' xml:id='CaptionArea' tts:origin='0c 12.6c' tts:extent='32c 2.4c'\n        tts:backgroundColor='rgba(0,0,0,160)' tts:displayAlign='center' tts:padding='0.3c 0.5c' />\n    </layout>\n    </head>\n    <body region='CaptionArea'>\n    <div>\n        <p begin='00:00:01.140' end='99:99:99.999'>EXAMPLE CAPTIONS!</p>\n    </div>\n    </body>\n</tt>`,\n            'text/xml'\n        );\n\n        this._onClosedCaptionsLoaded(mockCaptions);\n        const dimensions = getDimensions(this.closedCaptionDiv.current!);\n        this.ttmlContext!.updateRelatedMediaObjectRegion(dimensions!);\n        this.closedCaptionDiv.current!.style.bottom = '2.5rem';\n    }\n\n    /**\n     * Update the captionContainer with the captions that correspond to the current time.\n     * @param playPosition - The video's play position to sync the captions to.\n     */\n    public updateCaptions(playPosition: number): void {\n        let output: string = '';\n        this.lastPlayPosition = playPosition;\n\n        if (this.ttmlContext && this.ttmlContext.hasEvents()) {\n            const tick = Math.floor(playPosition * 1000);\n\n            const dimensions = getDimensions(this.closedCaptionDiv.current!);\n            if (this.ttmlContext.updateRelatedMediaObjectRegion(dimensions!)) {\n                // Call resetCaptions to force an update since the relatedMediaObjectRegion size has changed.\n                this.resetCaptions();\n            }\n\n            if (this.ttmlContext.updateCurrentEvents(tick)) {\n                removeInnerHtml(this.closedCaptionDiv.current!);\n\n                for (const cue of this.ttmlContext.getCues(tick)) {\n                    this._applyUserPreferencesOverrides(cue);\n\n                    // Background color is not honored in high contrast mode,\n                    // thus remove it from this wrapper div to avoid video not getting displayed in high contrast mode\n                    // with close captions enabled\n                    css(cue, 'background-color', '');\n                    output = cue.outerHTML;\n                }\n\n                this.closedCaptionDiv.current!.innerHTML = output;\n            }\n        }\n    }\n\n    /**\n     * Resets the ttml caption container.\n     * This should be called when user preferences change.\n     */\n    public resetCaptions(): void {\n        if (this.ttmlContext) {\n            this.ttmlContext.resetCurrentEvents();\n        }\n\n        if (this.closedCaptionDiv.current!) {\n            removeInnerHtml(this.closedCaptionDiv.current!);\n        }\n        this.applySettings();\n    }\n\n    /**\n     * Applies the closed captions settings.\n     */\n    public applySettings(): void {\n        const prefs: IDictionaryStringString = {};\n\n        const currentSettings = this.props.tempClosedCaptionsSettings\n            ? this.props.tempClosedCaptionsSettings\n            : this.props.currentClosedCaptionsSettings;\n\n        for (const settingKey in currentSettings) {\n            if (currentSettings.hasOwnProperty(settingKey)) {\n                const optionValue = this._getOptionValue(settingKey, currentSettings[settingKey]);\n\n                if (optionValue) {\n                    prefs[settingKey] = `${closedCaptionsSettingsMap[settingKey].value}${optionValue}`;\n                }\n            }\n        }\n\n        this.userPreferences.text = this._getPrefsCss(prefs, 'text');\n        this.userPreferences.window = this._getPrefsCss(prefs, 'window');\n    }\n\n    /**\n     * Loads the close captioning ttml file.\n     * @param href - The cc href.\n     */\n    private _loadClosedCaptions(href: string): void {\n        PlayerUtility.ajax(\n            href,\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            (result: any) => {\n                this._onClosedCaptionsLoaded(result);\n            },\n            () => {\n                if (this.props.errorCallback) {\n                    this.props.errorCallback({\n                        errorType: 'Player.error.loadClosedCaptions.ajax',\n                        errorDesc: `Ajax call failed: ' ${href}`\n                    });\n                }\n            }\n        );\n    }\n\n    /**\n     * Close captioning ttml file loaded handler.\n     * @param ttmlDocument - The ttml document containing the closed captions.\n     */\n    private _onClosedCaptionsLoaded(ttmlDocument: XMLDocument): void {\n        if (!ttmlDocument) {\n            if (this.props.errorCallback) {\n                this.props.errorCallback({\n                    errorType: 'Player.error.onClosedCaptionsLoaded.ttmlDoc',\n                    errorDesc: 'No ttmlDocument found'\n                });\n            }\n            return;\n        }\n\n        // This.closedCaptionDiv.current!.setAttribute(ClosedCaptions.ariaHidden, 'false');\n\n        const id = this.closedCaptionDiv.current!.id ? `${this.closedCaptionDiv.current!.id} '-'` : '';\n        const settingsOverrides: ITtmlSettings = {\n            idPrefix: id,\n            fontMap: { default: 'Segoe ui, Arial' },\n            relatedMediaObjectRegion: getDimensions(this.closedCaptionDiv.current!)\n        };\n\n        try {\n            this.ttmlContext = TtmlParser.parse(ttmlDocument, settingsOverrides);\n\n            if (this.ttmlContext) {\n                this.ttmlContext.setOwnerDocument(this.closedCaptionDiv.current!.ownerDocument);\n\n                if (this.ttmlContext.hasEvents()) {\n                    this.updateCaptions(this.lastPlayPosition);\n                }\n            }\n        } catch (error) {\n            if (this.props.errorCallback) {\n                this.props.errorCallback({\n                    errorType: 'Player.error.onClosedCaptionsLoaded.ttmlParser',\n                    errorDesc: `'TtmlDocument parser error: ' ${error.message}`\n                });\n            }\n        }\n    }\n\n    /**\n     * Applies user preference overrides to the specified cue.\n     * @param cue - The cue to apply any overrides to.\n     */\n    private _applyUserPreferencesOverrides(cue: HTMLElement): void {\n        if (!this.userPreferences) {\n            return;\n        }\n\n        if (this.userPreferences.text) {\n            for (const element of selectElements('span, br', cue)) {\n                for (const property in this.userPreferences.text) {\n                    if (this.userPreferences.text.hasOwnProperty(property)) {\n                        css(element, property, this.userPreferences.text[property]);\n                    }\n                }\n            }\n        }\n\n        if (this.userPreferences.window) {\n            const winElement: HTMLElement | null = selectFirstElement('p', cue);\n            if (winElement) {\n                for (const property in this.userPreferences.window) {\n                    if (this.userPreferences.window.hasOwnProperty(property)) {\n                        css(winElement, property, this.userPreferences.window[property]);\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Updates the component if there is any change to its underlying DOM.\n     * @param href - The ttml href.\n     */\n    private _setCcLanguage(href: string): void {\n        this.ttmlContext = null;\n        this.resetCaptions();\n        if (!href) {\n            return;\n        }\n        this._loadClosedCaptions(href);\n    }\n\n    /**\n     * Gets the value of closed captions settings option.\n     * @param settingKey - The closed ceptions settings key.\n     * @param optionKey - The closed captions option key.\n     */\n    private _getOptionValue(settingKey: string, optionKey: string): string {\n        const setting = closedCaptionsSettingsMap[settingKey];\n        if (setting) {\n            const option = closedCaptionsSettingsOptions[setting.option];\n            return option && option.map[optionKey];\n        }\n        return '';\n    }\n\n    /**\n     * Gets the css for the preferences.\n     * @param prefs - The preferences to get css for.\n     * @param prefix - The closed captions type (text/window).\n     */\n    private _getPrefsCss(prefs: IDictionaryStringString, prefix: string): IDictionaryStringString {\n        const prefsCss: IDictionaryStringString = {};\n\n        //  First store all the non-transparency values\n        for (const pref in prefs) {\n            if (prefs.hasOwnProperty(pref)) {\n                const propVal = prefs[pref];\n\n                if (pref.startsWith(prefix) && !pref.includes('opacity')) {\n                    if (propVal && propVal.length > 0) {\n                        const styles = propVal.split(';');\n\n                        for (const style of styles) {\n                            const pVal = style.split(':');\n\n                            if (pVal.length > 1) {\n                                prefsCss[pVal[0].trim()] = pVal[1].trim();\n                            }\n                        }\n                    }\n                }\n            }\n        }\n\n        //  Then go through all the transparency values and\n        //  map them onto their non-transparent color counterparts\n        for (const pref in prefs) {\n            if (prefs.hasOwnProperty(pref)) {\n                const propVal = prefs[pref];\n                if (pref.startsWith(prefix) && pref.indexOf('opacity') > 0) {\n                    const pVal = propVal.split(':');\n\n                    if (pVal.length > 1) {\n                        const colorValue = prefsCss[pVal[0].trim()];\n                        const opacityValue = pVal[1].trim();\n                        prefsCss[pVal[0].trim()] = this._formatAsRgba(colorValue, opacityValue);\n                    }\n                }\n            }\n        }\n\n        return prefsCss;\n    }\n\n    /**\n     * Formats the color value from css to rgba value.\n     * @param cssColor - The css color value.\n     * @param opacity - The opacity value.\n     * @returns - The Rgb.\n     */\n    private _formatAsRgba(cssColor: string, opacity: string): string {\n        let result = format('rgba(0,0,0,{0})', opacity);\n        const colorStart = cssColor ? cssColor.indexOf('#') : -1;\n\n        if (colorStart >= 0) {\n            const fullColorString = cssColor.substr(colorStart + 1);\n            const colorLenght = fullColorString.length / 3;\n\n            if (colorLenght > 0) {\n                const red = Number.parseInt(fullColorString.substr(0, colorLenght), 16);\n                const green = Number.parseInt(fullColorString.substr(colorLenght, colorLenght), 16);\n                const blue = Number.parseInt(fullColorString.substr(colorLenght * 2, colorLenght), 16);\n                result = format('rgba({0},{1},{2},{3})', red, green, blue, opacity);\n            }\n        }\n\n        return result;\n    }\n}\n\n/**\n * @interface ICcUserPreferences\n * @classdesc - Describes the closed caption user preferences data structure.\n */\nexport interface ICcUserPreferences {\n    text: IDictionaryStringString;\n    window: IDictionaryStringString;\n}\n","'use strict';\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar speciesConstructor = require('../internals/species-constructor');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar toLength = require('../internals/to-length');\nvar toString = require('../internals/to-string');\nvar getMethod = require('../internals/get-method');\nvar regExpExec = require('../internals/regexp-exec-abstract');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar fails = require('../internals/fails');\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;\nvar MAX_UINT32 = 0xFFFFFFFF;\nvar min = Math.min;\nvar push = uncurryThis([].push);\nvar stringSlice = uncurryThis(''.slice);\n\n// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n// Weex JS has frozen built-in prototypes, so use try / catch wrapper\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n  // eslint-disable-next-line regexp/no-empty-group -- required for testing\n  var re = /(?:)/;\n  var originalExec = re.exec;\n  re.exec = function () { return originalExec.apply(this, arguments); };\n  var result = 'ab'.split(re);\n  return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n});\n\nvar BUGGY = 'abbc'.split(/(b)*/)[1] === 'c' ||\n  // eslint-disable-next-line regexp/no-empty-group -- required for testing\n  'test'.split(/(?:)/, -1).length !== 4 ||\n  'ab'.split(/(?:ab)*/).length !== 2 ||\n  '.'.split(/(.?)(.?)/).length !== 4 ||\n  // eslint-disable-next-line regexp/no-empty-capturing-group, regexp/no-empty-group -- required for testing\n  '.'.split(/()()/).length > 1 ||\n  ''.split(/.?/).length;\n\n// @@split logic\nfixRegExpWellKnownSymbolLogic('split', function (SPLIT, nativeSplit, maybeCallNative) {\n  var internalSplit = '0'.split(undefined, 0).length ? function (separator, limit) {\n    return separator === undefined && limit === 0 ? [] : call(nativeSplit, this, separator, limit);\n  } : nativeSplit;\n\n  return [\n    // `String.prototype.split` method\n    // https://tc39.es/ecma262/#sec-string.prototype.split\n    function split(separator, limit) {\n      var O = requireObjectCoercible(this);\n      var splitter = isNullOrUndefined(separator) ? undefined : getMethod(separator, SPLIT);\n      return splitter\n        ? call(splitter, separator, O, limit)\n        : call(internalSplit, toString(O), separator, limit);\n    },\n    // `RegExp.prototype[@@split]` method\n    // https://tc39.es/ecma262/#sec-regexp.prototype-@@split\n    //\n    // NOTE: This cannot be properly polyfilled in engines that don't support\n    // the 'y' flag.\n    function (string, limit) {\n      var rx = anObject(this);\n      var S = toString(string);\n\n      if (!BUGGY) {\n        var res = maybeCallNative(internalSplit, rx, S, limit, internalSplit !== nativeSplit);\n        if (res.done) return res.value;\n      }\n\n      var C = speciesConstructor(rx, RegExp);\n      var unicodeMatching = rx.unicode;\n      var flags = (rx.ignoreCase ? 'i' : '') +\n                  (rx.multiline ? 'm' : '') +\n                  (rx.unicode ? 'u' : '') +\n                  (UNSUPPORTED_Y ? 'g' : 'y');\n      // ^(? + rx + ) is needed, in combination with some S slicing, to\n      // simulate the 'y' flag.\n      var splitter = new C(UNSUPPORTED_Y ? '^(?:' + rx.source + ')' : rx, flags);\n      var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n      if (lim === 0) return [];\n      if (S.length === 0) return regExpExec(splitter, S) === null ? [S] : [];\n      var p = 0;\n      var q = 0;\n      var A = [];\n      while (q < S.length) {\n        splitter.lastIndex = UNSUPPORTED_Y ? 0 : q;\n        var z = regExpExec(splitter, UNSUPPORTED_Y ? stringSlice(S, q) : S);\n        var e;\n        if (\n          z === null ||\n          (e = min(toLength(splitter.lastIndex + (UNSUPPORTED_Y ? q : 0)), S.length)) === p\n        ) {\n          q = advanceStringIndex(S, q, unicodeMatching);\n        } else {\n          push(A, stringSlice(S, p, q));\n          if (A.length === lim) return A;\n          for (var i = 1; i <= z.length - 1; i++) {\n            push(A, z[i]);\n            if (A.length === lim) return A;\n          }\n          q = p = e;\n        }\n      }\n      push(A, stringSlice(S, p));\n      return A;\n    }\n  ];\n}, BUGGY || !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC, UNSUPPORTED_Y);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, IImageData } from '@msdyn365-commerce/core';\nimport * as React from 'react';\n\nexport enum SocialMedia {\n    Facebook = 'facebook',\n    Twitter = 'twitter',\n    Pinterest = 'pinterest',\n    Mail = 'mail',\n    Linkedin = 'linkedin',\n    Customization = 'customization'\n}\n\nexport interface ISocialMediaProps extends IComponentProps<{}> {\n    src?: IImageData;\n    postUrl: string;\n    postTitle?: string;\n    socialMedia: SocialMedia;\n    socialShareURL?: string;\n    socialMediaName?: string;\n}\n\nexport interface ISocialMediaComponent extends IComponent<ISocialMediaProps> {}\n\n/**\n *\n * SocialMedia component.\n * @extends {React.FC<ISocialMediaProps>}\n */\n\nexport const SocialMediaComponent: React.FC<ISocialMediaProps> = props => {\n    const openWindowFunc = (event: React.MouseEvent<HTMLElement>) => {\n        setShareLinks(props);\n    };\n    const src = props.src && props.src.src;\n    return (\n        <img\n            onClick={openWindowFunc}\n            src={src}\n            alt={props.socialMediaName || props.socialMedia}\n            title={props.socialMediaName || props.socialMedia}\n        />\n    );\n};\n\nconst setShareLinks = (props: React.PropsWithChildren<ISocialMediaProps>): void => {\n    const pageUrl = encodeURIComponent(props.postUrl);\n    const mediaImage = document.getElementsByName('twitter:image')[0].getAttribute('content');\n    let url: string | undefined;\n    switch (props.socialMedia) {\n        case SocialMedia.Facebook:\n            url = `https://www.facebook.com/sharer.php?u=${pageUrl}`;\n            break;\n        case SocialMedia.Twitter:\n            url = `https://twitter.com/share?url=${pageUrl}${props.postTitle ? `&text=${props.postTitle}` : ''}`;\n            break;\n        case SocialMedia.Pinterest:\n            url = `https://www.pinterest.com/pin/create/button/?url=${pageUrl}${mediaImage ? `&media=${mediaImage}` : ''}${\n                props.postTitle ? `&description=${props.postTitle}` : ''\n            }`;\n            break;\n        case SocialMedia.Mail:\n            url = `mailto:?body=Check%20out%20this%20site:${pageUrl}${props.postTitle ? `&subject=${props.postTitle}` : ''}`;\n            break;\n        case SocialMedia.Linkedin:\n            url = `https://www.linkedin.com/shareArticle?mini=true&url=${pageUrl}${props.postTitle ? `&title=${props.postTitle}` : ''}`;\n            break;\n        case SocialMedia.Customization:\n            url = props.socialShareURL && `${props.socialShareURL}${pageUrl}`;\n            break;\n        default:\n    }\n\n    url && openWindow(url);\n};\n\nfunction openWindow(url: string): void {\n    const left = (screen.width - 570) / 2;\n    const top = (screen.height - 570) / 2;\n    const params = `menubar=no,toolbar=no,status=no,width=570,height=570,top='${top}',left='${left}`;\n\n    // Setting 'params' to an empty string will launch\n    // content in a new tab or window rather than a pop-up.\n    // params = \"\";\n    window.open(url, 'NewWindow', params);\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, {\n    getCatalogId,\n    IComponent,\n    IComponentProps,\n    IGridSettings,\n    IImageSettings,\n    msdyn365Commerce,\n    TelemetryEvent\n} from '@msdyn365-commerce/core';\nimport { getCartState, ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport {\n    CartLineValidationResults,\n    CartsDataActions,\n    format,\n    ProductAvailableQuantity,\n    ProductDimension,\n    ProductPrice,\n    ProductsDataActions,\n    ProductSearchCriteria,\n    ProductType,\n    SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { ErrorNotification, NotificationsManager } from '@msdyn365-commerce-modules/notifications-core';\nimport { ArrayExtensions, generateProductImageUrl, ObjectExtensions, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, IPopupProps, ITelemetryContent, Popup } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React, { useState } from 'react';\n\nimport { PriceComponent } from '../price';\nimport { IItemsAddedToCartResources } from './items-added-to-cart';\nimport { ItemsAddedToCartDialogComponent } from './items-added-to-cart-dialog-component';\nimport { ItemSuccessfullyAddedToCartNotification } from './notifications/item-successfully-added-to-cart-notification';\nimport { MultiItemsSuccessfullyAddedToCartNotification } from './notifications/multi-items-successfully-added-to-cart-notification';\nimport { OrderDetailsProduct } from './product-model';\n\n/**\n * Interface for add to cart resources.\n */\nexport interface IAddToCartResources {\n    goToCartText: string;\n    continueShoppingText: string;\n    closeNotificationLabel: string;\n    headerItemOneText: string;\n    headerItemFormatText: string;\n    headerLinesFormatText?: string;\n    headerMessageText: string;\n    freePriceText: string;\n    originalPriceText: string;\n    currentPriceText: string;\n    addedQuantityText: string;\n    buyAgainNotificationTitle?: string;\n    buyAgainNotificationCloseAriaLabel?: string;\n    validationErrorMessage?: string;\n    oneErrorText?: string;\n    multiErrorsText?: string;\n}\n\n/**\n * Interface for add to cart components props.\n */\nexport interface IAddToCartComponentProps extends IComponentProps<{ product: SimpleProduct; price?: ProductPrice } | undefined> {\n    className?: string;\n    addToCartText: string;\n    outOfStockText?: string;\n    disabled?: boolean;\n    quantity?: number;\n    navigationUrl?: string;\n    productAvailability?: ProductAvailableQuantity;\n    getSelectedProduct?: Promise<SimpleProduct | null>;\n    isNavigationToCartPageDisabled?: boolean;\n    shouldSkipSiteSettings?: boolean;\n    addToCartArialLabel?: string;\n    products?: {\n        productId: number;\n        quantity: number;\n        catalogId?: number;\n    }[];\n    orderDetailsProducts?: OrderDetailsProduct[];\n    hasAvailableProducts?: boolean;\n    imageSettings?: IImageSettings;\n    gridSettings?: IGridSettings;\n\n    isLoading?: boolean;\n    isUpdatingDimension?: boolean;\n    isLoadingDeliveryOptions?: boolean;\n    isUpdatingDeliveryOptions?: boolean;\n    isAddServiceItemToCart?: boolean;\n    isAddEmailDeliveryItemToCart?: boolean;\n    isPriceKeyedIn?: boolean;\n    customPriceAmount?: number;\n    isOrderQuantityLimitsFeatureEnabled?: boolean;\n\n    dialogStrings?: IAddToCartResources;\n\n    telemetryContent?: ITelemetryContent;\n\n    catalogId?: number;\n\n    isCustomPriceSelected?: boolean;\n    maximumKeyInPrice?: number;\n    minimumKeyInPrice?: number;\n    defaultMaximumKeyInPrice?: number;\n    defaultMinimumKeyInPrice?: number;\n    isProductQuantityLoading?: boolean;\n\n    onAdd?(result: ICartActionResult): void;\n    onError?(result: IAddToCartFailureResult): void;\n    changeUpdatingDimension?(isUpdatingDimension: boolean): void;\n    changeUpdatingDeliveryOptions?(isUpdatingDeliveryOptions: boolean): void;\n}\n\n/**\n * Cart action Failure reason type.\n */\nexport declare type ICartActionFailureReason =\n    | 'EMPTYINPUT'\n    | 'MISSINGDIMENSION'\n    | 'OUTOFSTOCK'\n    | 'CARTACTIONFAILED'\n    | 'INVALIDCUSTOMAMOUNT';\n\n/**\n * Interface for add to cart failure result.\n */\nexport interface IAddToCartFailureResult {\n    failureReason: ICartActionFailureReason;\n\n    stockLeft?: number;\n    cartActionResult?: ICartActionResult;\n    missingDimensions?: ProductDimension[];\n}\n\n/**\n * This setting defines the experience when a product is added to cart. Corresponds to the configuration in Fabrikam.\n */\nexport enum AddToCartBehavior {\n    /**\n     * Navigate to cart page.\n     */\n    goToCart = 'goToCart',\n\n    /**\n     * Show item added to cart popup.\n     */\n    showModal = 'showModal',\n\n    /**\n     * Show mini cart popup.\n     */\n    showMiniCart = 'showMiniCart',\n\n    /**\n     * Show item added to cart notification.\n     */\n    showNotification = 'showNotification',\n\n    /**\n     * Do nothing and stay on the page.\n     */\n    nothing = 'nothing'\n}\n\nconst zero = 0;\nconst defaultQuantity = 1;\n\n/**\n * The propagate result.\n * @param props -- The add to cart component props.\n * @param result -- The cart action result.\n */\nconst propagateResult = (props: IAddToCartComponentProps, result: ICartActionResult): void => {\n    if (props.onAdd) {\n        props.onAdd(result);\n    }\n};\n\n/**\n * The propagate error.\n * @param props -- The add to cart component props.\n * @param result -- The add to cart failure result.\n */\nconst propagateError = (props: IAddToCartComponentProps, result: IAddToCartFailureResult): void => {\n    if (props.onError) {\n        props.onError(result);\n    }\n};\n\n/**\n * Retrieves add to cart input from the component props.\n * @param props - Add to cart component props.\n * @returns Add to cart input.\n */\nconst getAddToCartInputFromProps = async (props: IAddToCartComponentProps) => {\n    const products = props.orderDetailsProducts?.filter(product => !ObjectExtensions.isNullOrUndefined(product.simpleProduct));\n    const emailDeliveryModeCode = props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n    const input = products?.map(product => {\n        const deliveryOption = product.salesLine.DeliveryMode;\n        return {\n            product: product.simpleProduct!,\n            count: ObjectExtensions.isNullOrUndefined(product.salesLine.Quantity) ? defaultQuantity : product.salesLine.Quantity,\n            catalogId: product.salesLine.CatalogId,\n            isAddEmailDeliveryItemToCart: deliveryOption && deliveryOption === emailDeliveryModeCode\n        };\n    });\n\n    if (ArrayExtensions.hasElements(input)) {\n        return input;\n    }\n\n    if (ArrayExtensions.hasElements(props.products)) {\n        const actionContext = props.context.actionContext;\n        const apiSettings = actionContext.requestContext.apiSettings;\n\n        const catalogId = props.catalogId ?? getCatalogId(props.context.actionContext.requestContext);\n        validateCatalogId(catalogId);\n\n        const searchCriteriaInput: ProductSearchCriteria = {\n            Context: {\n                ChannelId: apiSettings.channelId,\n                CatalogId: catalogId\n            },\n            IncludeAttributes: false,\n            Ids: props.products.map(product => product.productId)\n        };\n\n        const searchResult = await ProductsDataActions.searchByCriteriaAsync({ callerContext: actionContext }, searchCriteriaInput);\n        const productSearchResultsWithImages = searchResult.map(productSearchResult => {\n            const newProductSearchResult = { ...productSearchResult };\n            const newImageUrl = generateProductImageUrl(newProductSearchResult, apiSettings);\n\n            if (newImageUrl) {\n                newProductSearchResult.PrimaryImageUrl = newImageUrl;\n            }\n\n            return newProductSearchResult;\n        });\n\n        return props.products.map(item => {\n            const productData = productSearchResultsWithImages.find(product => product.RecordId === item.productId);\n            let simpleProduct: SimpleProduct;\n            if (productData) {\n                simpleProduct = {\n                    ...productData,\n                    ProductTypeValue: ProductType.Variant,\n                    AdjustedPrice: productData.Price,\n                    BasePrice: productData.BasePrice ?? productData.Price\n                };\n            } else {\n                // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Cast to simple product since only record id is available.\n                simpleProduct = {\n                    RecordId: item.productId\n                } as SimpleProduct;\n            }\n\n            return {\n                product: simpleProduct,\n                count: item.quantity,\n                catalogId: item.catalogId\n            };\n        });\n    }\n\n    if (props.data?.product) {\n        return [\n            {\n                product: props.data.product,\n                count: props.quantity ?? defaultQuantity,\n                catalogId: props.catalogId\n            }\n        ];\n    }\n\n    return [];\n};\n\n/**\n * Add one item to cart when it is not buy again.\n * @param props -- The props.\n * @param setDisabled -- The set disable call back.\n * @param openModal -- The open modal call back.\n */\nconst addOneItemToCart = async (\n    props: IAddToCartComponentProps,\n    setDisabled: (disabled: boolean) => void,\n    openModal: (opened: boolean) => void\n): Promise<void> => {\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\n    const addToCartBehavior = props.context.app.config.addToCartBehavior;\n    const data = props.data;\n\n    const addToCartInput = await getAddToCartInputFromProps(props);\n    const product = addToCartInput[0].product;\n    const quantity = addToCartInput[0].count;\n\n    const cartState = await getCartState(props.context.actionContext);\n    const addToCartResult = await cartState.addProductToCart({\n        product,\n        count: quantity,\n        availableQuantity: props.productAvailability?.AvailableQuantity,\n        additionalProperties: { validateQuantity: props.isOrderQuantityLimitsFeatureEnabled },\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\n        enableStockCheck: props.context.app.config.enableStockCheck,\n        isPriceKeyedIn: props.isPriceKeyedIn,\n        customPrice: props.isPriceKeyedIn ? props.customPriceAmount : undefined,\n        isAddEmailDeliveryItemToCart: props.isAddEmailDeliveryItemToCart,\n        shouldSkipSiteSettings: props.shouldSkipSiteSettings,\n        catalogId: addToCartInput[0].catalogId\n    });\n\n    if (addToCartResult.status === 'SUCCESS') {\n        if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showModal) {\n            setDisabled(false);\n            openModal(true);\n        } else if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showNotification) {\n            setDisabled(false);\n            const notification = new ItemSuccessfullyAddedToCartNotification(\n                props.context,\n                props.dialogStrings,\n                props.imageSettings,\n                props.gridSettings,\n                product,\n                data?.price,\n                quantity,\n                props.navigationUrl,\n                props.telemetryContent!,\n                props.id,\n                props.typeName\n            );\n            NotificationsManager.instance().addNotification(notification);\n        } else if (\n            MsDyn365.isBrowser &&\n            props.navigationUrl &&\n            !props.isNavigationToCartPageDisabled &&\n            (addToCartBehavior === undefined || addToCartBehavior === AddToCartBehavior.goToCart)\n        ) {\n            window.location.assign(props.navigationUrl);\n        } else {\n            setDisabled(false);\n        }\n        propagateResult(props, addToCartResult);\n    } else {\n        NotificationsManager.instance().addNotification(\n            new ErrorNotification(\n                addToCartResult.errorDetails?.LocalizedMessage ?? 'Add to cart failed',\n                props.dialogStrings?.closeNotificationLabel ?? ''\n            )\n        );\n\n        propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: addToCartResult });\n        setDisabled(false);\n    }\n};\n\n/**\n * Callback to handle success of adding to cart.\n * @param props - Add to cart component props.\n * @param setDisabled - Callback to update disabled state of the component.\n * @param setItemsAddedToCartDialogOpen - Callback to update disabled state of the component.\n * @param setErrorMessage - Callback to update error message state of the component.\n * @param cartState - Current cart state.\n * @param addToCartInput - Input used for adding to cart.\n * @param addToCartResult - Result of adding to cart.\n */\nconst handleAddItemsToCartSuccess = async (\n    props: IAddToCartComponentProps,\n    setDisabled: (disabled: boolean) => void,\n    setItemsAddedToCartDialogOpen: (opened: boolean) => void,\n    setErrorMessage: (message: string) => void,\n    cartState: ICartState,\n    addToCartInput: {\n        product: SimpleProduct;\n        count: number;\n    }[],\n    addToCartResult: ICartActionResult\n) => {\n    // Validate cart for line errors.\n    const validationResult: CartLineValidationResults = await CartsDataActions.validateForCheckoutAsync(\n        { callerContext: props.context.actionContext, bypassCache: 'none' },\n        cartState.cart.Id,\n        cartState.cart.Version\n    );\n    const errorCount = (validationResult.ValidationFailuresByCartLines ?? []).length;\n    const singleErrorCount = 1;\n    const errorText = errorCount === singleErrorCount ? props.dialogStrings?.oneErrorText : props.dialogStrings?.multiErrorsText;\n    const errorMessage =\n        errorCount > zero ? format(props.dialogStrings?.validationErrorMessage ?? '', errorCount.toString(), errorText) : '';\n\n    setErrorMessage(errorMessage);\n\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\n    const addToCartBehavior = props.context.app.config.addToCartBehavior;\n\n    if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showModal) {\n        setDisabled(false);\n        setItemsAddedToCartDialogOpen(true);\n    } else if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showNotification) {\n        setDisabled(false);\n        const itemsAddedResource: IItemsAddedToCartResources = {\n            viewCartButtonText: props.dialogStrings.goToCartText,\n            closeButtonLabel: props.dialogStrings.closeNotificationLabel,\n            itemsAddedToCartHeaderText: props.dialogStrings.headerMessageText,\n            itemsAddedToCartFormatText: props.dialogStrings.headerItemFormatText,\n            linesAddedToCartFormatText: props.dialogStrings.headerLinesFormatText ?? '{0}',\n            itemsAddedValidationErrorMessage: errorMessage\n        };\n\n        const notification = new MultiItemsSuccessfullyAddedToCartNotification(\n            props.context,\n            itemsAddedResource,\n            props.imageSettings,\n            props.gridSettings,\n            addToCartInput,\n            props.navigationUrl,\n            props.telemetryContent!,\n            props.id,\n            props.typeName\n        );\n        NotificationsManager.instance().addNotification(notification);\n    } else if (\n        MsDyn365.isBrowser &&\n        props.navigationUrl &&\n        !props.isNavigationToCartPageDisabled &&\n        (addToCartBehavior === undefined || addToCartBehavior === AddToCartBehavior.goToCart)\n    ) {\n        window.location.assign(props.navigationUrl);\n    } else {\n        setDisabled(false);\n    }\n    propagateResult(props, addToCartResult);\n};\n\n/**\n * Add one or multi item to cart from buy again.\n * @param props -- The props.\n * @param setDisabled -- The set disable call back.\n * @param setItemsAddedToCartDialogOpen -- The open modal call back.\n * @param setErrorMessage -- The set error message call back.\n */\nconst addItemsToCart = async (\n    props: IAddToCartComponentProps,\n    setDisabled: (disabled: boolean) => void,\n    setItemsAddedToCartDialogOpen: (opened: boolean) => void,\n    setErrorMessage: (message: string) => void\n): Promise<void> => {\n    const addToCartInput = await getAddToCartInputFromProps(props);\n\n    if (!ArrayExtensions.hasElements(addToCartInput)) {\n        return;\n    }\n\n    const cartState = await getCartState(props.context.actionContext);\n    const addToCartResult = await cartState.addProductsToCart(addToCartInput);\n\n    if (addToCartResult.status === 'SUCCESS') {\n        await handleAddItemsToCartSuccess(\n            props,\n            setDisabled,\n            setItemsAddedToCartDialogOpen,\n            setErrorMessage,\n            cartState,\n            addToCartInput,\n            addToCartResult\n        );\n    } else {\n        if (props.dialogStrings?.buyAgainNotificationTitle) {\n            // For buy again show simple error notification.\n            NotificationsManager.instance().addNotification(\n                new ErrorNotification(\n                    props.dialogStrings.buyAgainNotificationTitle,\n                    props.dialogStrings.buyAgainNotificationCloseAriaLabel ?? ''\n                )\n            );\n        } else {\n            NotificationsManager.instance().addNotification(\n                new ErrorNotification(\n                    addToCartResult.errorDetails?.LocalizedMessage ?? 'Add to cart failed',\n                    props.dialogStrings?.closeNotificationLabel ?? ''\n                )\n            );\n        }\n\n        propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: addToCartResult });\n        setDisabled(false);\n    }\n};\n\n/**\n * Interface for add to cart component.\n */\nexport interface IAddtoCartComponent extends IComponent<IAddToCartComponentProps> {\n    onClick(): (event: React.MouseEvent<HTMLElement>, props: IAddToCartComponentProps) => void;\n}\n\n/**\n * On click function.\n * @param _event - The mouse event.\n * @param props - The props.\n * @param setDisabled - Flag to define whether the element is disabled.\n * @param openModal - Flag to specify if it should open in a modal window.\n * @param setItemsAddedToCartDialogOpen - Sets items added to cart while dialog is open.\n * @param setErrorMessage - Error message.\n */\nconst onClick = async (\n    _event: React.MouseEvent<HTMLElement>,\n    props: IAddToCartComponentProps,\n    setDisabled: (disabled: boolean) => void,\n    openModal: (opened: boolean) => void,\n    setItemsAddedToCartDialogOpen: (opened: boolean) => void,\n    setErrorMessage: (message: string) => void\n): Promise<void> => {\n    if (!ArrayExtensions.hasElements(props.products)) {\n        const cartError = addToCartError(props);\n\n        if (cartError) {\n            propagateError(props, cartError);\n            return;\n        }\n\n        setDisabled(true);\n    }\n\n    const hasOrderDetailsProducts =\n        ArrayExtensions.hasElements(props.orderDetailsProducts) && props.orderDetailsProducts.length > defaultQuantity;\n    const hasProducts = ArrayExtensions.hasElements(props.products) && props.products.length > defaultQuantity;\n\n    const hasMultipleProducts = hasOrderDetailsProducts || hasProducts;\n\n    if (props.shouldSkipSiteSettings && hasMultipleProducts) {\n        await addItemsToCart(props, setDisabled, setItemsAddedToCartDialogOpen, setErrorMessage);\n    } else {\n        await addOneItemToCart(props, setDisabled, openModal);\n    }\n};\n\n/**\n * Add to cart component action constant.\n */\nconst AddToCartComponentActions = {\n    onClick\n};\n\n/**\n * Add to cart component.\n * @param props - The props.\n * @returns - The add to cart component.\n */\nexport const AddToCartFunctionalComponent: React.FC<IAddToCartComponentProps> = (props: IAddToCartComponentProps) => {\n    const [disabled, setDisabled] = useState(false);\n    const [modalOpen, setModalOpen] = useState(false);\n    const [isItemsAddedToCartDialogOpen, setItemsAddedToCartDialogOpen] = useState(false);\n    const [errorMessage, setErrorMessage] = useState('');\n    const [addToCartInput, setAddToCartInput] = useState<\n        {\n            product: SimpleProduct;\n            count: number;\n        }[]\n    >([]);\n\n    const onClickHandler = async (event: React.MouseEvent<HTMLElement>) => {\n        await AddToCartComponentActions.onClick(event, props, setDisabled, setModalOpen, setItemsAddedToCartDialogOpen, setErrorMessage);\n    };\n\n    /**\n     * Close dialog.\n     */\n    const closeItemsAddedToCartDialog = React.useCallback(() => {\n        setItemsAddedToCartDialogOpen(false);\n    }, []);\n\n    const priceComponent = props.data?.price ? (\n        <PriceComponent\n            data={{ price: props.data.price }}\n            context={props.context}\n            id={props.id}\n            typeName={props.typeName}\n            freePriceText={props.dialogStrings?.freePriceText}\n            originalPriceText={props.dialogStrings?.originalPriceText}\n            currentPriceText={props.dialogStrings?.currentPriceText}\n        />\n    ) : (\n        ''\n    );\n\n    const popupProps: IPopupProps = {\n        context: props.context,\n        className: 'msc-add-to-cart',\n        id: props.id,\n        typeName: props.typeName,\n        data: { product: addToCartInput[0]?.product, price: props.data?.price }, // addToCartInput[0]?.product?.Price },\n        dialogStrings: props.dialogStrings,\n        imageSettings: props.imageSettings,\n        gridSettings: props.context.request.gridSettings,\n        productQuantity: addToCartInput[0]?.count !== undefined ? addToCartInput[0]?.count : defaultQuantity,\n        priceComponent,\n        navigationUrl: props.navigationUrl,\n        modalOpen,\n        setModalOpen,\n        telemetryContent: props.telemetryContent\n    };\n\n    const itemsAddedResource: IItemsAddedToCartResources = {\n        viewCartButtonText: props.dialogStrings?.goToCartText ?? '',\n        closeButtonLabel: props.dialogStrings?.closeNotificationLabel ?? 'Close',\n        itemsAddedToCartHeaderText: props.dialogStrings?.headerMessageText ?? '',\n        itemsAddedToCartFormatText: props.dialogStrings?.headerItemFormatText ?? '',\n        linesAddedToCartFormatText: props.dialogStrings?.headerLinesFormatText ?? '{0}',\n        itemsAddedValidationErrorMessage: errorMessage\n    };\n\n    const renderModalPopup = <Popup {...popupProps} />;\n    const label = getLinkText(props);\n    const payload = getPayloadObject(TelemetryEvent.AddToCart, props.telemetryContent!, label, '');\n    const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\n    const buttonClassName = props.shouldSkipSiteSettings ? '' : 'msc-add-to-cart ';\n\n    React.useEffect(() => {\n        /**\n         * Retrieves add to cart input and updates the state.\n         */\n        const retrieveAddToCartInput = async () => {\n            const retrievedInput = await getAddToCartInputFromProps(props);\n            setAddToCartInput(retrievedInput);\n        };\n\n        // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call async method as per the documentation of react useEffect.\n        retrieveAddToCartInput();\n    }, [props, setAddToCartInput]);\n\n    return (\n        <>\n            {renderModalPopup}\n            <button\n                className={classnames(buttonClassName, props.className)}\n                aria-label={props.addToCartArialLabel ?? label}\n                title={props.addToCartArialLabel ?? label}\n                {...attributes}\n                onClick={onClickHandler}\n                disabled={props.disabled || disabled || isIntermediateState(props) || shouldShowOutOfStock(props, false)}\n            >\n                {label}\n            </button>\n            <ItemsAddedToCartDialogComponent\n                className='msc-lines-added-to-cart-dialog'\n                id={props.id}\n                typeName={props.typeName}\n                context={props.context}\n                dialogStrings={itemsAddedResource}\n                data={{\n                    products: addToCartInput\n                }}\n                isModalOpen={isItemsAddedToCartDialogOpen}\n                onClose={closeItemsAddedToCartDialog}\n            />\n        </>\n    );\n};\n\n// Set default props\nAddToCartFunctionalComponent.defaultProps = {\n    quantity: defaultQuantity\n};\n\n/**\n * Resolves whether product is in stock.\n * @param props - The add to cart component props.\n * @returns Gets the link text.\n */\nconst getLinkText = (props: IAddToCartComponentProps): string => {\n    return shouldShowOutOfStock(props, false) && props.outOfStockText ? props.outOfStockText : props.addToCartText;\n};\n\n/**\n * Resolves whether product is in stock.\n * @param props - The add to cart component props.\n * @returns The add to cart failure result.\n */\nconst addToCartError = (props: IAddToCartComponentProps): IAddToCartFailureResult | undefined => {\n    const {\n        data,\n        productAvailability,\n        isCustomPriceSelected,\n        customPriceAmount,\n        maximumKeyInPrice,\n        minimumKeyInPrice,\n        defaultMaximumKeyInPrice = 100,\n        defaultMinimumKeyInPrice = 10\n    } = props;\n\n    if (!data || !data.product.RecordId) {\n        // No product exists, won't be able to add to cart\n        return { failureReason: 'EMPTYINPUT' };\n    }\n\n    if (data.product.Dimensions) {\n        const missingDimensions = data.product.Dimensions.filter(\n            dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value)\n        );\n\n        if (ArrayExtensions.hasElements(missingDimensions)) {\n            // At least one dimension with no value exists on the product, won't be able to add to cart\n            return { failureReason: 'MISSINGDIMENSION', missingDimensions };\n        }\n    }\n\n    if (shouldShowOutOfStock(props, true)) {\n        const defaultAvailableQuantity = 0; // Showing as out of stock if no available products found.\n        const availableQuantity = productAvailability?.AvailableQuantity ?? defaultAvailableQuantity;\n        const stockLeft = Math.max(availableQuantity, defaultAvailableQuantity);\n\n        return { failureReason: 'OUTOFSTOCK', stockLeft };\n    }\n\n    // When Custom price is selected, if there is no keyed-in price or keyed-in price is out of limit, should return error.\n    if (\n        isCustomPriceSelected &&\n        (!customPriceAmount ||\n            customPriceAmount > (maximumKeyInPrice || defaultMaximumKeyInPrice) ||\n            customPriceAmount < (minimumKeyInPrice || defaultMinimumKeyInPrice))\n    ) {\n        return { failureReason: 'INVALIDCUSTOMAMOUNT' };\n    }\n\n    // Only allow adding to cart if not showing out of stock\n    return undefined;\n};\n\n/**\n * Resolves whether product is in stock.\n * @param props - The add to cart component props.\n * @param includeCurrentQuantity - Flag to specify whether current quantity should be included.\n * @returns The dialog element.\n */\nconst shouldShowOutOfStock = (props: IAddToCartComponentProps, includeCurrentQuantity: boolean): boolean => {\n    if (props.context.app.config.enableStockCheck === undefined || props.context.app.config.enableStockCheck === false) {\n        return false;\n    }\n\n    // When skip site settings do not need show out of stock on adding to cart\n    if (props.shouldSkipSiteSettings) {\n        return false;\n    }\n\n    if (\n        props.isLoading ||\n        props.isProductQuantityLoading ||\n        props.isUpdatingDimension ||\n        props.isLoadingDeliveryOptions ||\n        props.isUpdatingDeliveryOptions ||\n        props.isAddServiceItemToCart\n    ) {\n        // Out of stock turn off, don't bother showing out of stock\n        return false;\n    }\n\n    if (!props.data || !props.data.product.RecordId) {\n        // No product exists, don't bother showing out of stock\n        return false;\n    }\n\n    const hasAvailableProducts = props.hasAvailableProducts ?? true;\n    if (!hasAvailableProducts) {\n        return true;\n    }\n\n    if (props.data.product.Dimensions) {\n        if (props.data.product.Dimensions.find(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value))) {\n            // At least one dimension with no value exists on the product, so also don't show out of stock\n            return false;\n        }\n    }\n\n    const includedQuantityNumber = includeCurrentQuantity && props.quantity ? props.quantity : defaultQuantity;\n\n    return !(\n        props.productAvailability &&\n        props.productAvailability.AvailableQuantity !== undefined &&\n        props.productAvailability.AvailableQuantity >= includedQuantityNumber\n    );\n};\n\nconst isIntermediateState = (props: IAddToCartComponentProps): boolean => {\n    if (props.data?.product.Dimensions) {\n        if (props.data.product.Dimensions.find(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value))) {\n            // At least one dimension with no value exists on the product, so also not in intermediate state\n            return false;\n        }\n    }\n\n    if (!props.isLoading && !props.isUpdatingDimension && !props.isLoadingDeliveryOptions && !props.isUpdatingDeliveryOptions) {\n        return false;\n    }\n\n    return true;\n};\n\n// @ts-expect-error\nexport const AddToCartComponent: React.FunctionComponent<IAddToCartComponentProps> = msdyn365Commerce.createComponent<IAddtoCartComponent>(\n    'AddToCart',\n    { component: AddToCartFunctionalComponent, ...AddToCartComponentActions }\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\n\n/**\n * Interface for multi items added to cart resource.\n */\nexport interface IItemsAddedToCartResources {\n    viewCartButtonText: string;\n    closeButtonLabel: string;\n    itemsAddedToCartHeaderText: string;\n    itemsAddedToCartFormatText: string;\n    linesAddedToCartFormatText: string;\n    itemsAddedValidationErrorMessage?: string;\n}\n\n/**\n * Interface for add to cart input.\n */\nexport interface IAddToCartInput {\n    product: SimpleProduct;\n    count?: number;\n}\n\n/**\n * The total number of items.\n * @param addedInput -- The added to cart input.\n * @returns The total number of items.\n */\nexport const getTotalItems = (addedInput: IAddToCartInput[]): number => {\n    const defaultQuantity: number = 1;\n    let totalCount: number = 0;\n\n    for (const item of addedInput) {\n        totalCount += item.count ?? defaultQuantity;\n    }\n\n    return totalCount;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport * as React from 'react';\n\n/**\n * Items added to cart error message.\n */\nexport interface IItemsAddedErrorProps {\n    errorMessage?: string;\n}\n\n/**\n * Items added error.\n * @param errorProps - The error properties.\n * @param errorProps.errorMessage - The error message to show.\n * @returns The alert element showing items added errors.\n */\nexport const ItemsAddedErrorComponent: React.FC<IItemsAddedErrorProps> = ({ errorMessage }) => {\n    if (StringExtensions.isNullOrEmpty(errorMessage)) {\n        return null;\n    }\n\n    return (\n        <span className='msc-alert-danger msc-alert'>\n            <span className='msi-exclamation-triangle' aria-hidden='true' />\n            <span>{errorMessage}</span>\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 { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport { getUrlSync, IComponentProps, IImageSettings } from '@msdyn365-commerce/core';\nimport { format } from '@msdyn365-commerce/retail-proxy';\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { OrderTemplateProductsPreviewComponent } from '../order-template/order-templates-list/order-template-products-preview';\nimport { getTotalItems, IAddToCartInput, IItemsAddedToCartResources } from './items-added-to-cart';\nimport { ItemsAddedErrorComponent } from './items-added-to-cart-error-component';\n\n/**\n * Interface for items added to cart data.\n */\nexport interface IItemsAddedToCartDialogData {\n    products: IAddToCartInput[];\n}\n\n/**\n * Interface for items added to cart props.\n */\nexport interface IItemsAddedToCartDialogProps extends IComponentProps<IItemsAddedToCartDialogData> {\n    className: string;\n    dialogStrings: IItemsAddedToCartResources;\n\n    imageSettings?: IImageSettings;\n    isModalOpen?: boolean;\n\n    onClose(): void;\n}\n\n/**\n * Items added to cart dialog.\n * @param dialogProps -- The dialog props.\n * @returns The dialog element.\n */\nexport const ItemsAddedToCartDialogComponent = (dialogProps: IItemsAddedToCartDialogProps): JSX.Element => {\n    const {\n        dialogStrings,\n        className,\n        context,\n        isModalOpen,\n        imageSettings,\n        data: { products }\n    } = dialogProps;\n\n    /**\n     * Get cart page URL.\n     * @returns The URL of cart page.\n     */\n    const getCartPageUrl = (): string => {\n        return getUrlSync('cart', context.actionContext) ?? '';\n    };\n\n    const itemsString =\n        format(dialogStrings.itemsAddedToCartFormatText, getTotalItems(products).toString()) + dialogStrings.itemsAddedToCartHeaderText;\n    const linesString = format(dialogStrings.linesAddedToCartFormatText, products.length.toString());\n\n    const fullProducts: FullProduct[] = products.map(item => {\n        return { ProductDetails: item.product };\n    });\n\n    return (\n        <Modal isOpen={isModalOpen} className={className} toggle={dialogProps.onClose}>\n            <ModalHeader className={`${className}__dialog__header`} toggle={dialogProps.onClose}>\n                <b>{linesString}</b>\n                <span>{dialogStrings.itemsAddedToCartHeaderText}</span>\n            </ModalHeader>\n            <ModalBody className={`${className}__dialog__body`}>\n                <div className={`${className}__dialog__content`}>\n                    <OrderTemplateProductsPreviewComponent\n                        context={context}\n                        className={`${className}__dialog`}\n                        products={fullProducts}\n                        imageSettings={imageSettings}\n                    />\n                    <div className={`${className}__dialog__description`}>\n                        <div className={`${className}__dialog__order-template-items`}>{itemsString}</div>\n                    </div>\n                    <ItemsAddedErrorComponent errorMessage={dialogProps.dialogStrings.itemsAddedValidationErrorMessage} />\n                </div>\n            </ModalBody>\n            <ModalFooter className={`${className}__dialog__footer`}>\n                <Button\n                    className={`${className}__dialog__view-cart-button`}\n                    title={dialogStrings.viewCartButtonText}\n                    href={getCartPageUrl()}\n                >\n                    {dialogStrings.viewCartButtonText}\n                </Button>\n                <Button\n                    className={`${className}__dialog__continue-shopping`}\n                    title={dialogStrings.closeButtonLabel}\n                    onClick={dialogProps.onClose}\n                >\n                    {dialogStrings.closeButtonLabel}\n                </Button>\n            </ModalFooter>\n        </Modal>\n    );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Image } from '@msdyn365-commerce/core';\nimport {\n    BaseNotificationComponent,\n    ClosableNotificationWrapper,\n    DismissibleNotificationWrapper,\n    INotificationCloseButtonProps,\n    INotificationProps,\n    NotificationCloseButton,\n    NotificationContent,\n    NotificationFooter,\n    NotificationHeader,\n    NotificationInstance,\n    NotificationTitle\n} from '@msdyn365-commerce-modules/notifications-core';\nimport { getFallbackImageUrl, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getPayloadObject, getTelemetryAttributes, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { PriceComponent } from '../../price/price.components';\nimport { ItemSuccessfullyAddedToCartNotification } from './item-successfully-added-to-cart-notification';\n\nexport interface IItemSuccessfullyAddedToCartNotificationProps\n    extends INotificationProps<ItemSuccessfullyAddedToCartNotification>,\n        INotificationCloseButtonProps<ItemSuccessfullyAddedToCartNotification> {}\n\nexport class ItemSuccessfullyAddedToCartNotificationComponent extends BaseNotificationComponent<\n    ItemSuccessfullyAddedToCartNotification,\n    IItemSuccessfullyAddedToCartNotificationProps\n> {\n    public static readonly className: string = 'msc-notification-item-successfully-added-to-cart';\n\n    public constructor(props: IItemSuccessfullyAddedToCartNotificationProps) {\n        super(props);\n    }\n\n    public render(): React.ReactNode {\n        const payLoad = getPayloadObject('click', this.props.notification.telemetryContent, TelemetryConstant.ContinueShopping);\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n        const shouldDisplayUnitOfMeasure =\n            this.props.notification.context.app.config?.unitOfMeasureDisplayType &&\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n            this.props.notification.context.app.config.unitOfMeasureDisplayType !== 'none';\n        payLoad.contentAction.etext = TelemetryConstant.ViewBagAndCheckout;\n        const viewBagAttribute = getTelemetryAttributes(this.props.notification.telemetryContent, payLoad);\n        const fallbackImageUrl = getFallbackImageUrl(\n            this.props.notification.product.ItemId,\n            this.props.notification.context.actionContext.requestContext.apiSettings,\n            this.props.notification.context.app?.config?.OmniChannelMedia\n        );\n        if (this.props.notification.imageSettings) {\n            this.props.notification.imageSettings.cropFocalRegion = true;\n        }\n\n        const reducedDimensions: string = this.props.notification.product.Dimensions\n            ? this.props.notification.product.Dimensions.reduce<string>((str, productDimension) => {\n                  if (productDimension.DimensionValue && productDimension.DimensionValue.Value) {\n                      if (str) {\n                          return `${str}, ${productDimension.DimensionValue.Value}`;\n                      }\n\n                      return `${productDimension.DimensionValue.Value}`;\n                  }\n\n                  return str;\n              }, '')\n            : '';\n\n        const contentClassName = NotificationContent.className;\n        const footerClassName = NotificationFooter.className;\n\n        return (\n            <div role='alert' className={ItemSuccessfullyAddedToCartNotificationComponent.className}>\n                <ClosableNotificationWrapper notification={this.props.notification}>\n                    <DismissibleNotificationWrapper notification={this.props.notification}>\n                        <NotificationInstance notification={this.props.notification}>\n                            <NotificationHeader notification={this.props.notification}>\n                                <NotificationTitle notification={this.props.notification} />\n                                <NotificationCloseButton notification={this.props.notification} />\n                            </NotificationHeader>\n                            <NotificationContent notification={this.props.notification}>\n                                <Image\n                                    requestContext={this.props.notification.context.actionContext.requestContext}\n                                    className={`${contentClassName}__image`}\n                                    src={this.props.notification.product.PrimaryImageUrl || ''}\n                                    fallBackSrc={fallbackImageUrl}\n                                    altText={this.props.notification.product.Name}\n                                    gridSettings={this.props.notification.gridSettings || {}}\n                                    imageSettings={this.props.notification.imageSettings}\n                                    loadFailureBehavior='empty'\n                                />\n                                <div className={`${contentClassName}__product-info`}>\n                                    <div className={`${contentClassName}__product-title`}>{this.props.notification.product.Name}</div>\n                                    {this.props.notification.price ? (\n                                        <div className={`${contentClassName}__product-price`}>\n                                            <PriceComponent\n                                                data={{ price: this.props.notification.price }}\n                                                context={this.props.notification.context}\n                                                id={this.props.notification.id}\n                                                typeName={this.props.notification.typeName}\n                                                freePriceText={this.props.notification.resources.freePriceText}\n                                                originalPriceText={this.props.notification.resources.originalPriceText}\n                                                currentPriceText={this.props.notification.resources.currentPriceText}\n                                            />\n                                        </div>\n                                    ) : (\n                                        ''\n                                    )}\n                                    {this.props.notification.product.DefaultUnitOfMeasure && shouldDisplayUnitOfMeasure ? (\n                                        <div className={`${contentClassName}__product-unit-of-measure`}>\n                                            <span>{this.props.notification.product.DefaultUnitOfMeasure}</span>\n                                        </div>\n                                    ) : (\n                                        ''\n                                    )}\n                                    {StringExtensions.isNullOrWhitespace(reducedDimensions) ? null : (\n                                        <div className={`${contentClassName}__product-variants`}>{reducedDimensions}</div>\n                                    )}\n                                    <div className={`${contentClassName}__product-quantity`}>\n                                        {this.props.notification.resources.addedQuantityText.replace(\n                                            '{0}',\n                                            this.props.notification.productQuantity.toString()\n                                        )}\n                                    </div>\n                                </div>\n                            </NotificationContent>\n                            <NotificationFooter notification={this.props.notification}>\n                                {this.props.notification.navigationUrl && (\n                                    <Button\n                                        className={`${footerClassName}__go-to-cart`}\n                                        href={this.props.notification.navigationUrl}\n                                        title={this.props.notification.resources.goToCartText}\n                                        {...viewBagAttribute}\n                                    >\n                                        {this.props.notification.resources.goToCartText}\n                                    </Button>\n                                )}\n                            </NotificationFooter>\n                        </NotificationInstance>\n                    </DismissibleNotificationWrapper>\n                </ClosableNotificationWrapper>\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 { IAny, ICoreContext, IGeneric, IGridSettings, IImageSettings, RichText } from '@msdyn365-commerce/core';\nimport { format, ProductPrice, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n    DismissibleNotification,\n    IClosableNotification,\n    ITitledNotification,\n    NotificationEvents,\n    withNotificationComponent\n} from '@msdyn365-commerce-modules/notifications-core';\nimport { Event } from '@msdyn365-commerce-modules/retail-actions';\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\n\nimport { IAddToCartResources } from '../add-to-cart.component';\nimport { ItemSuccessfullyAddedToCartNotificationComponent } from './item-successfully-added-to-cart-notification-component';\n\n/**\n * Notification which will be shown after the user adds an item to the cart.\n */\n@withNotificationComponent(ItemSuccessfullyAddedToCartNotificationComponent)\nexport class ItemSuccessfullyAddedToCartNotification extends DismissibleNotification implements ITitledNotification, IClosableNotification {\n    public readonly context: ICoreContext<IGeneric<IAny>>;\n\n    public readonly resources: IAddToCartResources;\n\n    public readonly imageSettings?: IImageSettings;\n\n    public readonly gridSettings?: IGridSettings;\n\n    public readonly product: SimpleProduct;\n\n    public readonly price?: ProductPrice;\n\n    public readonly productQuantity: number;\n\n    public readonly navigationUrl?: string;\n\n    public readonly telemetryContent: ITelemetryContent;\n\n    public readonly closeAriaLabel: string;\n\n    public readonly title: RichText;\n\n    public readonly componentId: string;\n\n    public readonly typeName: string;\n\n    public isClosed: boolean;\n\n    public constructor(\n        context: ICoreContext<IGeneric<IAny>>,\n        resources: IAddToCartResources,\n        imageSettings: IImageSettings | undefined,\n        gridSettings: IGridSettings | undefined,\n        product: SimpleProduct,\n        price: ProductPrice | undefined,\n        productQuantity: number,\n        navigationUrl: string | undefined,\n        telemetryContent: ITelemetryContent,\n        componentId: string,\n        typeName: string\n    ) {\n        super();\n\n        const quantityOne = 1;\n        const itemsString =\n            productQuantity === quantityOne\n                ? resources.headerItemOneText\n                : format(resources.headerItemFormatText, productQuantity.toString());\n\n        this.title = `<b>${itemsString}</b><span>${resources.headerMessageText}</span>`;\n\n        this.context = context;\n        this.resources = resources;\n        this.imageSettings = imageSettings;\n        this.gridSettings = gridSettings;\n        this.product = product;\n        this.price = price;\n        this.productQuantity = productQuantity;\n        this.navigationUrl = navigationUrl;\n        this.telemetryContent = telemetryContent;\n        this.componentId = componentId;\n        this.typeName = typeName;\n\n        this.isClosed = false;\n        this.closeAriaLabel = resources.closeNotificationLabel;\n\n        this.events.setValue(NotificationEvents.Close, new Event());\n    }\n\n    public close(): void {\n        this.isClosed = true;\n        this.events.getValue(NotificationEvents.Close)?.trigger();\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 {\n    BaseNotificationComponent,\n    ClosableNotificationWrapper,\n    DismissibleNotificationWrapper,\n    INotificationCloseButtonProps,\n    INotificationProps,\n    NotificationCloseButton,\n    NotificationContent,\n    NotificationDescription,\n    NotificationFooter,\n    NotificationHeader,\n    NotificationInstance,\n    NotificationTitle\n} from '@msdyn365-commerce-modules/notifications-core';\nimport { Button, getPayloadObject, getTelemetryAttributes, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { OrderTemplateProductsPreviewComponent } from '../../order-template/order-templates-list/order-template-products-preview';\nimport { ItemsAddedErrorComponent } from '../items-added-to-cart-error-component';\nimport { MultiItemsSuccessfullyAddedToCartNotification } from './multi-items-successfully-added-to-cart-notification';\n\n/**\n * Interface of props for multiple items are successfully added to cart notification.\n */\nexport interface IMultiItemsSuccessfullyAddedToCartNotificationProps\n    extends INotificationProps<MultiItemsSuccessfullyAddedToCartNotification>,\n        INotificationCloseButtonProps<MultiItemsSuccessfullyAddedToCartNotification> {}\n\n/**\n * Multiple items are successfully added to cart notification.\n */\nexport class MultiItemsSuccessfullyAddedToCartNotificationComponent extends BaseNotificationComponent<\n    MultiItemsSuccessfullyAddedToCartNotification,\n    IMultiItemsSuccessfullyAddedToCartNotificationProps\n> {\n    public static readonly className: string = 'msc-notification-items-added-to-cart';\n\n    public constructor(props: IMultiItemsSuccessfullyAddedToCartNotificationProps) {\n        super(props);\n    }\n\n    public render(): React.ReactNode {\n        const payLoad = getPayloadObject('click', this.props.notification.telemetryContent, TelemetryConstant.ContinueShopping);\n        payLoad.contentAction.etext = TelemetryConstant.ViewBagAndCheckout;\n        const viewBagAttribute = getTelemetryAttributes(this.props.notification.telemetryContent, payLoad);\n        if (this.props.notification.imageSettings) {\n            this.props.notification.imageSettings.cropFocalRegion = true;\n        }\n\n        const fullProducts: FullProduct[] = this.props.notification.products.map(item => {\n            return { ProductDetails: item.product };\n        });\n\n        const className = MultiItemsSuccessfullyAddedToCartNotificationComponent.className;\n        const footerClassName = NotificationFooter.className;\n        return (\n            <div role='alert' className={className}>\n                <ClosableNotificationWrapper notification={this.props.notification}>\n                    <DismissibleNotificationWrapper notification={this.props.notification}>\n                        <NotificationInstance notification={this.props.notification}>\n                            <NotificationHeader notification={this.props.notification}>\n                                <NotificationTitle notification={this.props.notification} />\n                                <NotificationCloseButton notification={this.props.notification} />\n                            </NotificationHeader>\n                            <NotificationContent notification={this.props.notification}>\n                                <OrderTemplateProductsPreviewComponent\n                                    context={this.props.notification.context}\n                                    className='msc-notification-content__preview'\n                                    products={fullProducts}\n                                    imageSettings={this.props.notification.imageSettings}\n                                />\n                                <NotificationDescription notification={this.props.notification} />\n                                <ItemsAddedErrorComponent\n                                    errorMessage={this.props.notification.resources.itemsAddedValidationErrorMessage}\n                                />\n                            </NotificationContent>\n                            <NotificationFooter notification={this.props.notification}>\n                                {this.props.notification.navigationUrl && (\n                                    <Button\n                                        className={`${footerClassName}__go-to-cart`}\n                                        href={this.props.notification.navigationUrl}\n                                        title={this.props.notification.resources.viewCartButtonText}\n                                        {...viewBagAttribute}\n                                    >\n                                        {this.props.notification.resources.viewCartButtonText}\n                                    </Button>\n                                )}\n                            </NotificationFooter>\n                        </NotificationInstance>\n                    </DismissibleNotificationWrapper>\n                </ClosableNotificationWrapper>\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 { IAny, ICoreContext, IGeneric, IGridSettings, IImageSettings, RichText } from '@msdyn365-commerce/core';\nimport { format } from '@msdyn365-commerce/retail-proxy';\nimport {\n    DismissibleNotification,\n    IClosableNotification,\n    ITitledNotification,\n    NotificationEvents,\n    withNotificationComponent\n} from '@msdyn365-commerce-modules/notifications-core';\nimport { Event } from '@msdyn365-commerce-modules/retail-actions';\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\n\nimport { getTotalItems, IAddToCartInput, IItemsAddedToCartResources } from '../items-added-to-cart';\nimport { MultiItemsSuccessfullyAddedToCartNotificationComponent } from './multi-items-successfully-added-to-cart-notification-component';\n\n/**\n * Notification which will be shown after the user adds multi items to the cart.\n */\n@withNotificationComponent(MultiItemsSuccessfullyAddedToCartNotificationComponent)\nexport class MultiItemsSuccessfullyAddedToCartNotification extends DismissibleNotification\n    implements ITitledNotification, IClosableNotification {\n    public readonly context: ICoreContext<IGeneric<IAny>>;\n\n    public readonly resources: IItemsAddedToCartResources;\n\n    public readonly imageSettings?: IImageSettings;\n\n    public readonly gridSettings?: IGridSettings;\n\n    public readonly products: IAddToCartInput[];\n\n    public readonly navigationUrl?: string;\n\n    public readonly telemetryContent: ITelemetryContent;\n\n    public readonly closeAriaLabel: string;\n\n    public readonly title: RichText;\n\n    public readonly descriptionLines: RichText[];\n\n    public readonly componentId: string;\n\n    public readonly typeName: string;\n\n    public isClosed: boolean;\n\n    public constructor(\n        context: ICoreContext<IGeneric<IAny>>,\n        resources: IItemsAddedToCartResources,\n        imageSettings: IImageSettings | undefined,\n        gridSettings: IGridSettings | undefined,\n        products: IAddToCartInput[],\n        navigationUrl: string | undefined,\n        telemetryContent: ITelemetryContent,\n        componentId: string,\n        typeName: string\n    ) {\n        super();\n\n        const itemsString = format(resources.itemsAddedToCartFormatText, getTotalItems(products).toString());\n        const linesString = format(resources.linesAddedToCartFormatText, products.length.toString());\n\n        this.title = `<b>${linesString}</b><span>${resources.itemsAddedToCartHeaderText}</span>`;\n        this.descriptionLines = [];\n        this.descriptionLines.push(`<b>${itemsString}</b><span>${resources.itemsAddedToCartHeaderText}</span>`);\n\n        this.context = context;\n        this.resources = resources;\n        this.imageSettings = imageSettings;\n        this.gridSettings = gridSettings;\n        this.products = products;\n        this.navigationUrl = navigationUrl;\n        this.telemetryContent = telemetryContent;\n        this.componentId = componentId;\n        this.typeName = typeName;\n\n        this.isClosed = false;\n        this.closeAriaLabel = resources.closeButtonLabel;\n\n        this.events.setValue(NotificationEvents.Close, new Event());\n    }\n\n    public close(): void {\n        this.isClosed = true;\n        this.events.getValue(NotificationEvents.Close)?.trigger();\n    }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { SalesLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { observable } from 'mobx';\n\n/**\n * Represents a product from order details.\n */\nexport class OrderDetailsProduct {\n    @observable\n    public isSelected: boolean;\n\n    public readonly isProductAvailable: boolean;\n\n    public readonly salesLine: SalesLine;\n\n    /**\n     * Simple product info.\n     * May be undefined for the removed/unavailable product.\n     */\n    public readonly simpleProduct?: SimpleProduct;\n\n    public readonly productUrl?: string;\n\n    public constructor(salesLine: SalesLine, simpleProduct?: SimpleProduct, productUrl?: string) {\n        this.salesLine = salesLine;\n        this.simpleProduct = simpleProduct;\n        this.isSelected = false;\n        this.isProductAvailable = !ObjectExtensions.isNullOrUndefined(simpleProduct);\n        this.productUrl = productUrl;\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 { IComponent, IComponentProps, getCatalogId, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { getCartState } from '@msdyn365-commerce/global-state';\nimport {\n    addOrderTemplateToCartAction,\n    AddOrderTemplateToCartInput,\n    OrderTemplate,\n    validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n    Button,\n    getPayloadObject,\n    getTelemetryAttributes,\n    IPopupProductsProps,\n    ITelemetryContent,\n    PopupProducts,\n    TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React, { useState } from 'react';\n\nimport {\n    ILinesAddedToCartDialogResources,\n    LinesAddedToCartDialog\n} from '../lines-added-to-cart-dialog/lines-added-to-cart-dialog.component';\n\nexport interface IAddOrderTemplateToCartComponentData {\n    orderTemplate: OrderTemplate;\n}\n\nexport interface IAddOrderTemplateToCartComponentProps extends IComponentProps<IAddOrderTemplateToCartComponentData> {\n    className?: string;\n    parentElementRef?: React.RefObject<Button>;\n    addToCartText: string;\n    telemetryContent?: ITelemetryContent;\n    dialogStrings: {\n        closeWindowButtonText: string;\n        addToCartFailureMessage: string;\n        addToCartSuccessMessage: string;\n        addToCartProcessMessage: string;\n        orderTemplateErrorMessage: string;\n        linesAddedToCartDialogResources: ILinesAddedToCartDialogResources;\n    };\n    isMultipleCatalogFeatureEnabledInHq?: boolean;\n    catalogId?: number;\n}\n\nexport declare type IAddToCartActionFailureReason = 'EMPTYINPUT' | 'MISSINGDIMENSION' | 'OUTOFSTOCK' | 'CARTACTIONFAILED'; // Rename to used method\n\nexport interface IAddOrderTemplateToCartComponent extends IComponent<IAddOrderTemplateToCartComponentProps> {\n    onClick(): (event: React.MouseEvent<HTMLElement>, props: IAddOrderTemplateToCartComponentProps) => void;\n}\n\nconst onClick = async (\n    _event: React.MouseEvent<HTMLElement>,\n    props: IAddOrderTemplateToCartComponentProps,\n    setUploadStatus: (uploadStatus: addOrderTemplateToCartStatus) => void,\n    openModal: (opened: boolean) => void,\n    setLinesAddedToCartDialogOpen: (opened: boolean) => void,\n    setAddedLinesCount: (value: number) => void,\n    setErrorMessage: (message: string) => void\n): Promise<void> => {\n    openModal(true);\n    setUploadStatus('LOADING');\n    const { context, dialogStrings } = props;\n    // assuming selected catalogId will be passed to component and if not passed then get from context\n    const catalogId = props.catalogId ?? getCatalogId(props.context.actionContext.requestContext);\n    validateCatalogId(catalogId);\n    const isMultipleCatalogFeatureEnabledInHq = props.isMultipleCatalogFeatureEnabledInHq || false;\n    const addOrderTemplateToCartInput = isMultipleCatalogFeatureEnabledInHq\n        ? new AddOrderTemplateToCartInput(props.data.orderTemplate.productList.Id, isMultipleCatalogFeatureEnabledInHq)\n        : new AddOrderTemplateToCartInput(props.data.orderTemplate.productList.Id);\n    try {\n        const cartState = await getCartState(context.actionContext);\n        const cart = cartState.cart;\n        const hasInvoiceInCart = cart?.CartLines?.find(cartLine => cartLine.IsInvoiceLine === true);\n        if (hasInvoiceInCart) {\n            setErrorMessage('Can not add items to a cart containing an invoice.');\n            setUploadStatus('FAILED');\n        } else {\n            const addedCartLines = await addOrderTemplateToCartAction(addOrderTemplateToCartInput, context.actionContext);\n            setAddedLinesCount(addedCartLines.length);\n            openModal(false);\n            setTimeout(() => {\n                setLinesAddedToCartDialogOpen(true);\n            }, 500);\n            setErrorMessage('');\n        }\n    } catch (error) {\n        setErrorMessage(dialogStrings.orderTemplateErrorMessage);\n        setUploadStatus('FAILED');\n    }\n};\n\nconst AddToCartComponentActions = {\n    onClick\n};\n\nexport type addOrderTemplateToCartStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'WAITING';\n\nconst _getModalText = (status: addOrderTemplateToCartStatus, props: IAddOrderTemplateToCartComponentProps, errorMsg: string) => {\n    const { dialogStrings } = props;\n    const { addToCartFailureMessage, addToCartSuccessMessage, addToCartProcessMessage } = dialogStrings;\n\n    if (status === 'LOADING') {\n        return `${addToCartProcessMessage}...`;\n    }\n\n    if (status === 'SUCCESS') {\n        return addToCartSuccessMessage;\n    }\n\n    if (status === 'FAILED') {\n        return errorMsg !== null ? errorMsg : addToCartFailureMessage;\n    }\n\n    return '';\n};\n\nlet buttonEventReference: HTMLButtonElement | undefined;\n\nconst AddOrderTemplate: React.FC<IAddOrderTemplateToCartComponentProps> = (props: IAddOrderTemplateToCartComponentProps) => {\n    const [uploadStatus, setUploadStatus] = useState<addOrderTemplateToCartStatus>('WAITING');\n    const [modalOpen, setModalOpen] = useState(false);\n    const [addedLinesCount, setAddedLinesCount] = useState(0);\n    const [linesAddedToCartDialogOpen, setLinesAddedToCartDialogOpen] = useState(false);\n    const [errorMessage, setErrorMessage] = useState('');\n\n    const onClickHandler = async (event: React.MouseEvent<HTMLElement>) => {\n        buttonEventReference = event.target as HTMLButtonElement;\n        await AddToCartComponentActions.onClick(\n            event,\n            props,\n            setUploadStatus,\n            setModalOpen,\n            setLinesAddedToCartDialogOpen,\n            setAddedLinesCount,\n            setErrorMessage\n        );\n    };\n    const closeLinesAddedToCartDialog = () => {\n        setLinesAddedToCartDialogOpen(false);\n        setErrorMessage('');\n        buttonEventReference?.focus();\n    };\n\n    const modalText = _getModalText(uploadStatus, props, errorMessage);\n    const processStatusClass = uploadStatus.toLowerCase();\n    const dialogStrings = { closeWindowButtonText: props.dialogStrings.closeWindowButtonText };\n    const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.AddOrderTemplateToCart);\n    const addOrderTemplateAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n    const popupProps: IPopupProductsProps = {\n        dialogStrings,\n        className: 'msc-add-order-template-to-cart',\n        processStatusClass,\n        text: modalText,\n        modalOpen,\n        setModalOpen\n    };\n\n    const renderModalPopup = <PopupProducts {...popupProps} />;\n\n    const products = props.data.orderTemplate.orderTemplateLines\n        .map(line => line.fullProduct)\n        .filter(fullProduct => fullProduct) as FullProduct[];\n    const isMultipleCatalogFeatureEnabledInHq = props.isMultipleCatalogFeatureEnabledInHq || false;\n    return (\n        <>\n            {renderModalPopup}\n            <button\n                className={classnames(\n                    'msc-add-order-template-to-cart msc-btn',\n                    props.className,\n                    props.data.orderTemplate.totalLines === 0 ? 'disabled' : ''\n                )}\n                aria-label={props.addToCartText}\n                disabled={props.data.orderTemplate.totalLines === 0}\n                type='button'\n                onClick={onClickHandler}\n                {...addOrderTemplateAttribute}\n            >\n                {props.addToCartText}\n            </button>\n            <LinesAddedToCartDialog\n                className='msc-lines-added-to-cart-dialog'\n                id={props.id}\n                typeName={props.typeName}\n                context={props.context}\n                dialogStrings={props.dialogStrings.linesAddedToCartDialogResources}\n                data={{\n                    linesCount: addedLinesCount,\n                    orderTemplate: props.data.orderTemplate.productList,\n                    products\n                }}\n                modalOpen={linesAddedToCartDialogOpen}\n                onClose={closeLinesAddedToCartDialog}\n                isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogFeatureEnabledInHq || false}\n                {...(isMultipleCatalogFeatureEnabledInHq && { catalogId: props.catalogId })}\n            />\n        </>\n    );\n};\n\nexport const AddOrderTemplateToCartComponent: React.FunctionComponent<IAddOrderTemplateToCartComponentProps> =\n    // @ts-expect-error -- As per design, custom component\n    msdyn365Commerce.createComponent<IAddOrderTemplateToCartComponent>('AddOrderTemplate', {\n        component: AddOrderTemplate,\n        ...AddToCartComponentActions\n    });\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { ProductList } from '@msdyn365-commerce/retail-proxy';\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport {\n    IOrderTemplateNameDialogResources,\n    OrderTemplateNameDialog\n} from '../order-template-name-dialog/order-template-name-dialog.component';\n\nexport interface IRenameOrderTemplateComponentProps extends IComponentProps<IRenameOrderTemplateData> {\n    className?: string;\n    renameOrderTemplateDialogStrings: IOrderTemplateNameDialogResources;\n    renameOrderTemplateButtonText: string;\n    onRenameTemplate(orderTemplate: ProductList): Promise<void>;\n\n    // as required passing in components for later user\n    isMultipleCatalogFeatureEnabledInHq?: boolean;\n    catalogId?: number;\n}\n\ninterface IRenameOrderTemplateData {\n    orderTemplate: ProductList;\n}\n\nexport interface IRenameOrderTemplateComponent extends IComponent<IRenameOrderTemplateComponentProps> {}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention -- For backward compatibility\nconst RenameOrderTemplateComponentActions = {};\nlet buttonEventReference: HTMLButtonElement | undefined;\n\nconst RenameOrderTemplate: React.FC<IRenameOrderTemplateComponentProps> = (props: IRenameOrderTemplateComponentProps) => {\n    const {\n        data: { orderTemplate },\n        renameOrderTemplateButtonText,\n        renameOrderTemplateDialogStrings,\n        context\n    } = props;\n    const [renameOrderTemplateDialogOpen, setOrderTemplateNameDialogOpen] = React.useState(false);\n    const onOrderTemplateNameCancel = () => {\n        context.telemetry.debug('Rename of template was canceled.');\n        buttonEventReference?.focus();\n    };\n\n    const onRenameButtonClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n        buttonEventReference = event.target as HTMLButtonElement;\n        setOrderTemplateNameDialogOpen(true);\n    };\n    return (\n        <>\n            <Button className='ms-order-template-action-bar__rename-template-button' onClick={onRenameButtonClick}>\n                {renameOrderTemplateButtonText}\n            </Button>\n            <OrderTemplateNameDialog\n                existingOrderTemplate={orderTemplate}\n                isUpdateDialog\n                className='msc-order-template-name-dialog'\n                modalOpen={renameOrderTemplateDialogOpen}\n                setModalOpen={setOrderTemplateNameDialogOpen}\n                context={context}\n                id={props.id}\n                data={props.data}\n                orderTemplateName={props.data.orderTemplate.Name}\n                typeName={props.typeName}\n                dialogStrings={renameOrderTemplateDialogStrings}\n                onCancel={onOrderTemplateNameCancel}\n                onSuccess={props.onRenameTemplate}\n            />\n        </>\n    );\n};\n\nexport const RenameOrderTemplateComponent: React.FunctionComponent<IRenameOrderTemplateComponentProps> = msdyn365Commerce.createComponent<\n    // @ts-expect-error\n    IRenameOrderTemplateComponent\n>('RenameOrderTemplate', { component: RenameOrderTemplate, ...RenameOrderTemplateComponentActions });\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 { getUrlSync, IComponentProps, IImageSettings } from '@msdyn365-commerce/core';\nimport { ProductList } from '@msdyn365-commerce/retail-proxy';\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { OrderTemplateProductsPreviewComponent } from '../order-templates-list/order-template-products-preview';\n\nexport interface ILinesAddedToCartDialogResources {\n    viewCartButtonText: string;\n    orderTemplateCloseButtonText: string;\n    linesAddedToCartHeaderItemsOneText: string;\n    linesAddedToCartHeaderLinesOneText: string;\n    linesAddedToCartHeaderLinesFormatText: string;\n    linesAddedToCartHeaderMessageText: string;\n}\n\nexport interface ILinesAddedToCartDialogData {\n    linesCount: number;\n    orderTemplate: ProductList;\n    products: FullProduct[];\n}\n\nexport interface ILinesAddedToCartDialogProps extends IComponentProps<ILinesAddedToCartDialogData> {\n    className: string;\n    imageSettings?: IImageSettings;\n\n    dialogStrings: ILinesAddedToCartDialogResources;\n\n    modalOpen: boolean | undefined;\n    onClose(): void;\n\n    // as required passing in components for later user\n    isMultipleCatalogFeatureEnabledInHq?: boolean;\n    catalogId?: number;\n}\n\nexport const LinesAddedToCartDialog = (dialogProps: ILinesAddedToCartDialogProps) => {\n    const {\n        dialogStrings,\n        className,\n        context,\n        modalOpen,\n        imageSettings,\n        data: { orderTemplate, products, linesCount }\n    } = dialogProps;\n\n    const getCartPageUrl = (): string => {\n        return getUrlSync('cart', context.actionContext) || '';\n    };\n\n    const close: () => void = () => {\n        dialogProps.onClose();\n    };\n\n    const lineItemsString =\n        linesCount === 1\n            ? dialogStrings.linesAddedToCartHeaderLinesOneText\n            : dialogStrings.linesAddedToCartHeaderLinesFormatText.replace('{0}', linesCount.toString());\n\n    return (\n        <Modal isOpen={modalOpen} className={`${className}`} toggle={close}>\n            <ModalHeader className={`${className}__dialog__header`} toggle={close}>\n                <b>{dialogStrings.linesAddedToCartHeaderItemsOneText}</b>\n                <span>{dialogStrings.linesAddedToCartHeaderMessageText}</span>\n            </ModalHeader>\n            <ModalBody className={`${className}__dialog__body`}>\n                <div className={`${className}__dialog__content`}>\n                    <OrderTemplateProductsPreviewComponent\n                        context={context}\n                        className={`${className}__dialog`}\n                        products={products}\n                        imageSettings={imageSettings}\n                    />\n                    <div className={`${className}__dialog__description`}>\n                        <div className={`${className}__dialog__order-template-name`}>{orderTemplate.Name}</div>\n                        <div className={`${className}__dialog__order-template-items`}>{lineItemsString}</div>\n                    </div>\n                </div>\n            </ModalBody>\n            <ModalFooter className={`${className}__dialog__footer`}>\n                <Button\n                    className={`${className}__dialog__view-cart-button`}\n                    title={dialogStrings.viewCartButtonText}\n                    href={getCartPageUrl()}\n                >\n                    {dialogStrings.viewCartButtonText}\n                </Button>\n                <Button\n                    className={`${className}__dialog__continue-shopping`}\n                    title={dialogStrings.orderTemplateCloseButtonText}\n                    onClick={close}\n                >\n                    {dialogStrings.orderTemplateCloseButtonText}\n                </Button>\n            </ModalFooter>\n        </Modal>\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 { ProductList } from '@msdyn365-commerce/retail-proxy';\nimport {\n    createOrderTemplate,\n    CreateOrderTemplateInput,\n    StringExtensions,\n    updateOrderTemplateHeader,\n    UpdateOrderTemplateHeaderInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nexport interface IOrderTemplateNameDialogResources {\n    orderTemplateHeaderLabel: string;\n    orderTemplateTitleLabel: string;\n    orderTemplateNameAriaLabel: string;\n    orderTemplateDescription: string;\n    defaultOrderTemplateName: string;\n    orderTemplateButtonLabel: string;\n    orderTemplateCancelButtonLabel: string;\n    orderTemplateModalAriaLabel?: string;\n}\n\nexport interface IOrderTemplateNameDialogProps extends IComponentProps {\n    isUpdateDialog: boolean | undefined;\n    existingOrderTemplate?: ProductList;\n    className: string;\n    orderTemplateName?: string;\n    dialogStrings: IOrderTemplateNameDialogResources;\n    modalOpen: boolean | undefined;\n    parentElementRef?: React.RefObject<HTMLButtonElement>;\n    setModalOpen(newValue: boolean): void;\n    onCancel(): void;\n    onSuccess(orderTemplate: ProductList): Promise<void>;\n}\n\nexport const OrderTemplateNameDialog = (dialogProps: IOrderTemplateNameDialogProps) => {\n    const {\n        isUpdateDialog,\n        existingOrderTemplate,\n        dialogStrings,\n        className,\n        modalOpen,\n        setModalOpen,\n        onCancel,\n        onSuccess,\n        context,\n        parentElementRef\n    } = dialogProps;\n\n    if (!dialogStrings) {\n        return null;\n    }\n\n    const [orderTemplateName, setOrderTemplateName] = useState(dialogProps.orderTemplateName);\n\n    const cancel: () => void = () => {\n        setModalOpen(false);\n        onCancel();\n        setOrderTemplateName('');\n        if (parentElementRef) {\n            parentElementRef.current?.focus();\n        }\n    };\n\n    const submit: () => Promise<void> = async () => {\n        dialogProps.orderTemplateName = orderTemplateName || dialogStrings.defaultOrderTemplateName;\n        if (StringExtensions.isNullOrWhitespace(dialogProps.orderTemplateName)) {\n            return;\n        }\n        if (isUpdateDialog) {\n            if (existingOrderTemplate) {\n                existingOrderTemplate.Name = dialogProps.orderTemplateName;\n                const input: UpdateOrderTemplateHeaderInput = new UpdateOrderTemplateHeaderInput(existingOrderTemplate);\n                const orderTemplate: ProductList = await updateOrderTemplateHeader(input, context.actionContext);\n                setModalOpen(false);\n                await onSuccess(orderTemplate);\n            } else {\n                context.telemetry.error('You need to pass ProductList instance for update.');\n                throw new Error('Unexpected error: existing order template was not set.');\n            }\n        } else {\n            const input: CreateOrderTemplateInput = new CreateOrderTemplateInput(dialogProps.orderTemplateName);\n            const orderTemplate: ProductList = await createOrderTemplate(input, context.actionContext);\n            setModalOpen(false);\n            await onSuccess(orderTemplate);\n        }\n    };\n\n    const updateOrderTemplateName = (event: React.ChangeEvent<HTMLInputElement>) => {\n        setOrderTemplateName(event.target.value);\n    };\n\n    return (\n        <Modal\n            isOpen={modalOpen}\n            className={`${className} msc-modal-input-required`}\n            toggle={cancel}\n            aria-label={dialogStrings.orderTemplateModalAriaLabel}\n        >\n            <ModalHeader className={`${className}__dialog__header`} toggle={cancel}>\n                <span aria-live='assertive'>{dialogStrings.orderTemplateHeaderLabel}</span>\n            </ModalHeader>\n            <ModalBody className={`${className}__dialog__body`}>\n                <div className={`${className}__dialog__content`}>\n                    <label\n                        className={`${className}__dialog__order-template-name-label`}\n                        htmlFor={`${className}__dialog__order-template-name`}\n                    >\n                        {dialogStrings.orderTemplateTitleLabel}\n                    </label>\n                    <input\n                        className={`${className}__dialog__order-template-name`}\n                        type='text'\n                        aria-label={dialogStrings.orderTemplateNameAriaLabel}\n                        placeholder={dialogStrings.defaultOrderTemplateName}\n                        onChange={updateOrderTemplateName}\n                        value={orderTemplateName}\n                        maxLength={250}\n                    />\n                    <div className={`${className}__dialog__description`}>{dialogStrings.orderTemplateDescription}</div>\n                </div>\n            </ModalBody>\n            <ModalFooter className={`${className}__dialog__footer`}>\n                <Button\n                    className={`${className}__dialog__create-order-template-button`}\n                    title={dialogStrings.orderTemplateButtonLabel}\n                    aria-label={dialogStrings.orderTemplateButtonLabel}\n                    onClick={submit}\n                >\n                    {dialogStrings.orderTemplateButtonLabel}\n                </Button>\n                <Button\n                    className={`${className}__dialog__cancel-button`}\n                    title={dialogStrings.orderTemplateCancelButtonLabel}\n                    aria-label={dialogStrings.orderTemplateCancelButtonLabel}\n                    onClick={cancel}\n                >\n                    {dialogStrings.orderTemplateCancelButtonLabel}\n                </Button>\n            </ModalFooter>\n        </Modal>\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 { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport { ProductList } from '@msdyn365-commerce/retail-proxy';\nimport { OrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, format } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { OrderTemplateProductsPreviewComponent } from './order-template-products-preview';\n\nexport interface IOrderTemplateComponentProps {\n    className: string;\n    orderTemplate: OrderTemplate;\n    context: ICoreContext;\n    imageSettings?: IImageSettings;\n    actionButtonText: string;\n    lineItemsText: string;\n    orderTemplateAction(orderTemplate: ProductList): Promise<void>;\n}\n\nexport const OrderTemplateComponent = (props: IOrderTemplateComponentProps) => {\n    const { orderTemplate, className, imageSettings } = props;\n\n    const onActionButtonClick = () => {\n        return props.orderTemplateAction(props.orderTemplate.productList);\n    };\n\n    const products = orderTemplate.orderTemplateLines.map(line => line.fullProduct).filter(fullProduct => fullProduct);\n\n    return (\n        <div className={`${className}__container`}>\n            <div className={`${className}__item_header`}>\n                <div className={`${className}__title`}>{orderTemplate.productList.Name}</div>\n                <div className={`${className}__count`}>{format(props.lineItemsText, orderTemplate.totalLines)}</div>\n            </div>\n            <OrderTemplateProductsPreviewComponent\n                context={props.context}\n                className={className}\n                products={products as FullProduct[]}\n                imageSettings={imageSettings}\n            />\n            <div className={`${className}__footer`}>\n                <Button className={`${className}__action-button`} title={props.actionButtonText} onClick={onActionButtonClick}>\n                    {props.actionButtonText}\n                </Button>\n            </div>\n        </div>\n    );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getAsset, IComponentProps, Image } from '@msdyn365-commerce/core';\nimport { ProductList } from '@msdyn365-commerce/retail-proxy';\nimport { OrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React, { useState } from 'react';\n\nimport {\n    IOrderTemplateNameDialogResources,\n    OrderTemplateNameDialog\n} from '../order-template-name-dialog/order-template-name-dialog.component';\nimport { OrderTemplateComponent } from '../order-templates-list/order-template-list';\n\nexport interface IAddToOrderTemplateDialogData {\n    orderTemplates: OrderTemplate[];\n}\n\nexport interface IAddToOrderTemplateDialogResources {\n    addToOrderTemplateHeader: string;\n\n    noOrderTemplatesMessage: string;\n    noOrderTemplatesDescription: string;\n\n    createAnOrderTemplateButtonText: string;\n    createNewOrderTemplateButtonText: string;\n    cancelOrderTemplateCreationButtonText: string;\n\n    selectTemplatesText: string;\n    addToTemplateButtonText: string;\n    lineItemsText: string;\n}\n\nexport interface IAddToOrderTemplateDialogProps extends IComponentProps<IAddToOrderTemplateDialogData> {\n    className: string;\n\n    addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\n    createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\n\n    modalOpen: boolean | undefined;\n    setModalOpen(newValue: boolean): void;\n    onOrderTemplateSelected(orderTemplate: ProductList): Promise<void>;\n    isMultipleCatalogFeatureEnabledInHq?: boolean;\n    catalogId?: number;\n}\n\nconst renderAddToOrderTemplatesWhenEmptyOrderTemplatesDialog = (\n    dialogProps: IAddToOrderTemplateDialogProps,\n    className: string,\n    closeDialog: () => void,\n    showOrderTemplateNameDialog: () => void\n) => {\n    const { addToOrderTemplateDialogResources, modalOpen } = dialogProps;\n\n    const createOrderTemplateImageUrl = `${getAsset('images/order-templates/create-order-template.svg', dialogProps.context.request)}`;\n\n    return (\n        <>\n            <Modal isOpen={modalOpen} className={`${className} msc-modal-input-required`} toggle={closeDialog}>\n                <ModalHeader className={`${className}__dialog__header`} toggle={closeDialog}>\n                    <span>{addToOrderTemplateDialogResources.addToOrderTemplateHeader}</span>\n                </ModalHeader>\n                <ModalBody className={`${className}__dialog__body`}>\n                    <div className={`${className}__dialog__content`}>\n                        <div className={`${className}__dialog__create-order-template-image-container`}>\n                            <Image\n                                altText={addToOrderTemplateDialogResources.createNewOrderTemplateButtonText}\n                                requestContext={dialogProps.context.actionContext.requestContext}\n                                className={`${className}__dialog__create-order-template-image`}\n                                src={createOrderTemplateImageUrl}\n                                gridSettings={dialogProps.context.request.gridSettings!}\n                                loadFailureBehavior='empty'\n                            />\n                        </div>\n                        <div className={`${className}__dialog__no-order-templates`}>\n                            {addToOrderTemplateDialogResources.noOrderTemplatesMessage}\n                        </div>\n                        <div className={`${className}__dialog__no-order-templates-description`}>\n                            {addToOrderTemplateDialogResources.noOrderTemplatesDescription}\n                        </div>\n                    </div>\n                </ModalBody>\n                <ModalFooter className={`${className}__dialog__footer`}>\n                    <Button\n                        className={`${className}__dialog__create-order-template-button`}\n                        title={addToOrderTemplateDialogResources.createAnOrderTemplateButtonText}\n                        onClick={showOrderTemplateNameDialog}\n                    >\n                        {addToOrderTemplateDialogResources.createAnOrderTemplateButtonText}\n                    </Button>\n                    <Button\n                        className={`${className}__dialog__cancel-button`}\n                        title={addToOrderTemplateDialogResources.cancelOrderTemplateCreationButtonText}\n                        onClick={closeDialog}\n                    >\n                        {addToOrderTemplateDialogResources.cancelOrderTemplateCreationButtonText}\n                    </Button>\n                </ModalFooter>\n            </Modal>\n        </>\n    );\n};\n\nconst formatBold = (text: string, boldText: string) => {\n    const patternToFind = '{0}';\n    return (\n        <>\n            {text.slice(0, text.indexOf(patternToFind))}\n            <b>{boldText}</b>\n            {text.slice(text.indexOf(patternToFind) + patternToFind.length)}\n        </>\n    );\n};\n\nconst renderAddToOrderTemplatesForExistingOrderTemplatesDialog = (\n    dialogProps: IAddToOrderTemplateDialogProps,\n    className: string,\n    closeDialog: () => void,\n    showOrderTemplateNameDialog: () => void,\n    onAddToOrderTemplateButtonClick: (orderTemplate: ProductList) => Promise<void>\n) => {\n    const {\n        addToOrderTemplateDialogResources,\n        modalOpen,\n        data: { orderTemplates }\n    } = dialogProps;\n\n    const createOrderTemplateImageUrl = `${getAsset('images/order-templates/create-order-template.svg', dialogProps.context.request)}`;\n\n    return (\n        <>\n            <Modal isOpen={modalOpen} className={`${className} msc-modal-input-required`} toggle={closeDialog}>\n                <ModalHeader className={`${className}__dialog__header`} toggle={closeDialog}>\n                    <span>{addToOrderTemplateDialogResources.addToOrderTemplateHeader}</span>\n                </ModalHeader>\n                <ModalBody className={`${className}__dialog__body`}>\n                    <div className={`${className}__dialog__content`}>\n                        <div className={`${className}__dialog__order-templates-description`}>\n                            {formatBold(addToOrderTemplateDialogResources.selectTemplatesText, orderTemplates.length.toString())}\n                        </div>\n                        <div className={`${className}__dialog__order-templates-container`}>\n                            <div\n                                className={classnames(\n                                    `${className}__dialog__order-templates-line__container`,\n                                    `${className}__dialog__order-templates-line__container__create-new-line`\n                                )}\n                            >\n                                <Image\n                                    altText={addToOrderTemplateDialogResources.createNewOrderTemplateButtonText}\n                                    requestContext={dialogProps.context.actionContext.requestContext}\n                                    className={`${className}__dialog__order-templates-line__container__create-new-line__image`}\n                                    src={createOrderTemplateImageUrl}\n                                    gridSettings={dialogProps.context.request.gridSettings!}\n                                    loadFailureBehavior='empty'\n                                />\n                                <Button\n                                    className={`${className}__dialog__order-templates-line__container__create-new-line__button`}\n                                    onClick={showOrderTemplateNameDialog}\n                                >\n                                    {addToOrderTemplateDialogResources.createNewOrderTemplateButtonText}\n                                </Button>\n                            </div>\n                            {orderTemplates.map((orderTemplate, index) => {\n                                return (\n                                    <OrderTemplateComponent\n                                        key={index}\n                                        className={`${className}__dialog__order-templates-line`}\n                                        orderTemplate={orderTemplate}\n                                        context={dialogProps.context}\n                                        actionButtonText={addToOrderTemplateDialogResources.addToTemplateButtonText}\n                                        lineItemsText={addToOrderTemplateDialogResources.lineItemsText}\n                                        orderTemplateAction={onAddToOrderTemplateButtonClick}\n                                    />\n                                );\n                            })}\n                        </div>\n                    </div>\n                </ModalBody>\n            </Modal>\n        </>\n    );\n};\n\nexport const AddToOrderTemplateDialog = (dialogProps: IAddToOrderTemplateDialogProps) => {\n    const {\n        setModalOpen,\n        data: { orderTemplates },\n        className\n    } = dialogProps;\n\n    const closeDialog = () => {\n        setModalOpen(false);\n    };\n\n    const [isCreateOrderTemplateDialogOpen, setOrderTemplateNameDialogOpen] = useState(false);\n    const showOrderTemplateNameDialog = () => {\n        setModalOpen(false);\n        setTimeout(() => {\n            setOrderTemplateNameDialogOpen(true);\n        }, 500);\n    };\n    const onCreateOrderTemplateCancel = () => {\n        setTimeout(() => {\n            setModalOpen(true);\n        }, 500);\n    };\n\n    let addToOrderTemplateDialog: JSX.Element;\n    if (orderTemplates.length !== 0) {\n        addToOrderTemplateDialog = renderAddToOrderTemplatesForExistingOrderTemplatesDialog(\n            dialogProps,\n            `${className}__existing`,\n            closeDialog,\n            showOrderTemplateNameDialog,\n            dialogProps.onOrderTemplateSelected\n        );\n    } else {\n        addToOrderTemplateDialog = renderAddToOrderTemplatesWhenEmptyOrderTemplatesDialog(\n            dialogProps,\n            `${className}__empty`,\n            closeDialog,\n            showOrderTemplateNameDialog\n        );\n    }\n\n    return (\n        <>\n            {addToOrderTemplateDialog}\n            <OrderTemplateNameDialog\n                className='msc-order-template-name-dialog'\n                modalOpen={isCreateOrderTemplateDialogOpen}\n                isUpdateDialog={false}\n                setModalOpen={setOrderTemplateNameDialogOpen}\n                context={dialogProps.context}\n                id={dialogProps.id}\n                data={{}}\n                typeName={dialogProps.typeName}\n                dialogStrings={dialogProps.createOrderTemplateDialogResources}\n                onCancel={onCreateOrderTemplateCancel}\n                onSuccess={dialogProps.onOrderTemplateSelected}\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 { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport { getUrlSync, IComponentProps, IImageSettings } from '@msdyn365-commerce/core';\nimport { ProductList } from '@msdyn365-commerce/retail-proxy';\nimport { ProductDimensionType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { OrderTemplateProductsPreviewComponent } from '../order-templates-list/order-template-products-preview';\n\nexport interface ILinesAddedToOrderTemplateDialogResources {\n    viewOrderTemplateButtonText: string;\n    continueShoppingButtonText: string;\n    linesAddedToOrderTemplateHeaderItemsOneText: string;\n    linesAddedToOrderTemplateHeaderItemsFormatText: string;\n    linesAddedToOrderTemplateHeaderLinesOneText: string;\n    linesAddedToOrderTemplateHeaderLinesFormatText: string;\n    linesAddedToOrderTemplateHeaderMessageText: string;\n    linesAddedToOrderTemplateCustomPriceAlertMessageText?: string;\n}\n\nexport interface ILinesAddedToOrderTemplateDialogData {\n    itemsCount: number;\n    linesCount: number;\n    orderTemplate: ProductList;\n    products: FullProduct[];\n}\n\nexport interface ILinesAddedToOrderTemplateDialogProps extends IComponentProps<ILinesAddedToOrderTemplateDialogData> {\n    className: string;\n    imageSettings?: IImageSettings;\n\n    dialogStrings: ILinesAddedToOrderTemplateDialogResources;\n\n    modalOpen: boolean | undefined;\n\n    // as required passing in components for later user\n    isMultipleCatalogFeatureEnabledInHq?: boolean;\n    catalogId?: number;\n}\n\nexport const LinesAddedToOrderTemplateDialog = (dialogProps: ILinesAddedToOrderTemplateDialogProps) => {\n    const {\n        dialogStrings,\n        className,\n        context,\n        modalOpen,\n        imageSettings,\n        data: { orderTemplate, products, itemsCount, linesCount }\n    } = dialogProps;\n\n    const getOrderTemplatePageUrl = (): string => {\n        const url = getUrlSync('ordertemplate', context.actionContext) || '';\n        const separator = url.includes('?') ? '&' : '?';\n        return `${url}${separator}id=${orderTemplate.Id}`;\n    };\n\n    const close = React.useCallback(() => {\n        window.location.reload(true);\n    }, []);\n\n    const itemsString =\n        itemsCount === 1\n            ? dialogStrings.linesAddedToOrderTemplateHeaderItemsOneText\n            : dialogStrings.linesAddedToOrderTemplateHeaderItemsFormatText.replace('{0}', itemsCount.toString());\n    const lineItemsString =\n        linesCount === 1\n            ? dialogStrings.linesAddedToOrderTemplateHeaderLinesOneText\n            : dialogStrings.linesAddedToOrderTemplateHeaderLinesFormatText.replace('{0}', linesCount.toString());\n\n    const addedProducts = products.filter(\n        product =>\n            !product.ProductDetails.Dimensions?.find(\n                dimension => dimension.DimensionTypeValue === ProductDimensionType.Style && dimension.DimensionValue?.Value === 'Custom'\n            )\n    );\n    const filteredProducts = products.filter(product =>\n        product.ProductDetails.Dimensions?.find(\n            dimension => dimension.DimensionTypeValue === ProductDimensionType.Style && dimension.DimensionValue?.Value === 'Custom'\n        )\n    );\n\n    return (\n        <Modal isOpen={modalOpen} className={`${className}`} toggle={close}>\n            <ModalHeader className={`${className}__dialog__header`} toggle={close}>\n                <b>{lineItemsString}</b>\n                <span aria-live='assertive'>{dialogStrings.linesAddedToOrderTemplateHeaderMessageText}</span>\n            </ModalHeader>\n            <ModalBody className={`${className}__dialog__body`}>\n                <div className={`${className}__dialog__content`}>\n                    <OrderTemplateProductsPreviewComponent\n                        context={context}\n                        className={`${className}__dialog`}\n                        products={addedProducts}\n                        imageSettings={imageSettings}\n                    />\n                    <div className={`${className}__dialog__description`}>\n                        <div className={`${className}__dialog__order-template-name`}>{orderTemplate.Name}</div>\n                        <div className={`${className}__dialog__order-template-items`}>{itemsString}</div>\n                    </div>\n                    {ArrayExtensions.hasElements(filteredProducts) ? (\n                        <>\n                            <Alert color='danger' assertive aria-label={dialogStrings.linesAddedToOrderTemplateCustomPriceAlertMessageText}>\n                                <div className='msc-alert__header'>\n                                    <span className='msi-exclamation-triangle' />\n                                    <span>{dialogStrings.linesAddedToOrderTemplateCustomPriceAlertMessageText}</span>\n                                </div>\n                            </Alert>\n                            <OrderTemplateProductsPreviewComponent\n                                context={context}\n                                className={`${className}__dialog`}\n                                products={filteredProducts}\n                                imageSettings={imageSettings}\n                            />\n                        </>\n                    ) : null}\n                </div>\n            </ModalBody>\n            <ModalFooter className={`${className}__dialog__footer`}>\n                <Button\n                    className={`${className}__dialog__view-order-template-button`}\n                    title={dialogStrings.viewOrderTemplateButtonText}\n                    href={getOrderTemplatePageUrl()}\n                >\n                    {dialogStrings.viewOrderTemplateButtonText}\n                </Button>\n                <Button\n                    className={`${className}__dialog__continue-shopping`}\n                    title={dialogStrings.continueShoppingButtonText}\n                    onClick={close}\n                >\n                    {dialogStrings.continueShoppingButtonText}\n                </Button>\n            </ModalFooter>\n        </Modal>\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 { ICoreContext, getCatalogId, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { Customer, ProductList, ProductListLine, ProductListsDataActions } from '@msdyn365-commerce/retail-proxy';\nimport {\n    ArrayExtensions,\n    FullProductInput,\n    getFullProducts,\n    getProductDetailsCriteriaFromActionInput,\n    OrderTemplate,\n    validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nimport {\n    AddToOrderTemplateDialog,\n    IAddToOrderTemplateDialogResources\n} from '../add-to-order-template-dialog/add-to-order-template-dialog.component';\nimport {\n    ILinesAddedToOrderTemplateDialogResources,\n    LinesAddedToOrderTemplateDialog\n} from '../lines-added-to-order-template-dialog/lines-added-to-order-template-dialog.component';\nimport { IOrderTemplateNameDialogResources } from '../order-template-name-dialog/order-template-name-dialog.component';\n\n/**\n * Data for the add products to order template component.\n */\nexport interface IAddProductsToOrderTemplateData {\n    orderTemplates: OrderTemplate[];\n    products: ProductListLine[];\n\n    customerInformation?: Customer;\n}\n\n/**\n * Resources for the add products to order template component.\n */\nexport interface IAddProductsToOrderTemplateResources\n    extends IAddToOrderTemplateDialogResources,\n        IOrderTemplateNameDialogResources,\n        ILinesAddedToOrderTemplateDialogResources {\n    addProductsToOrderTemplateButton: string;\n    addProductsToOrderTemplateButtonTooltip: string;\n}\n\n/**\n * Props for the add products to order template component.\n */\nexport interface IAddProductsToOrderTemplateProps {\n    className: string;\n\n    context: ICoreContext;\n\n    data: IAddProductsToOrderTemplateData;\n\n    resources: IAddProductsToOrderTemplateResources;\n\n    isDisabled?: boolean;\n\n    isMultipleCatalogFeatureEnabledInHq?: boolean;\n    catalogId?: number;\n}\n\nconst modalTimeoutTime = 500;\n\n/**\n * Add products to order template component.\n * @param props - Component props.\n * @returns React node.\n */\nexport const AddProductsToOrderTemplateComponent: React.FC<IAddProductsToOrderTemplateProps> = (\n    props: IAddProductsToOrderTemplateProps\n) => {\n    const [chosenOrderTemplate, setChosenOrderTemplate] = useState<ProductList | undefined>(undefined);\n    const [addedProducts, setAddedProducts] = useState<FullProduct[] | undefined>(undefined);\n    const [isAddToOrderTemplateModalOpen, setIsAddToOrderTemplateModalOpen] = useState(false);\n    const [isLinesAddedToOrderTemplateDialogOpen, setIsLinesAddedToOrderTemplateDialogOpen] = useState(false);\n    const [addedLinesCount, setAddedLinesCount] = useState(0);\n    const [addedItemsCount, setAddedItemsCount] = useState(0);\n\n    /**\n     * Adds product to the selected order template.\n     * @param orderTemplate - Order template to use for adding products.\n     */\n    const onOrderTemplateSelected = React.useCallback(\n        async (orderTemplate: ProductList) => {\n            setChosenOrderTemplate(orderTemplate);\n            // assuming selected catalogId will be passed to component and if not passed then get from context\n            const catalogId = props.catalogId ?? getCatalogId(props.context.actionContext.requestContext);\n            validateCatalogId(catalogId);\n            const isMultipleCatalogFeatureEnabledInHq = props.isMultipleCatalogFeatureEnabledInHq || false;\n            const linesToAdd: ProductListLine[] = props.data.products.map(line => {\n                return {\n                    ...line,\n                    ...(isMultipleCatalogFeatureEnabledInHq && { catalogId: line.CatalogId || catalogId }),\n                    ProductListId: orderTemplate.Id\n                };\n            });\n\n            const allProductInputs: FullProductInput[] = [];\n            for (const listLine of linesToAdd) {\n                if (listLine.ProductId) {\n                    allProductInputs.push(\n                        new FullProductInput(\n                            listLine.ProductId,\n                            props.context.actionContext.requestContext.apiSettings,\n                            getProductDetailsCriteriaFromActionInput(props.context.actionContext),\n                            props.context.actionContext.requestContext\n                        )\n                    );\n                }\n            }\n\n            const allProducts = await getFullProducts(allProductInputs, props.context.actionContext);\n\n            const addedLines = await ProductListsDataActions.addProductListLinesAsync(\n                { callerContext: props.context.actionContext },\n                orderTemplate.Id,\n                linesToAdd\n            );\n\n            const quantities = addedLines.map(line => line.Quantity ?? 0);\n            setAddedLinesCount(addedLines.length);\n            setAddedItemsCount(ArrayExtensions.hasElements(quantities) ? ArrayExtensions.calculateSum(quantities) : 0);\n            setAddedProducts(allProducts);\n\n            setIsAddToOrderTemplateModalOpen(false);\n            setTimeout(() => {\n                setIsLinesAddedToOrderTemplateDialogOpen(true);\n            }, modalTimeoutTime);\n        },\n        [props.context.actionContext, props.data.products]\n    );\n\n    const onAddProductsToOrderTemplateClick = React.useCallback(() => {\n        setIsAddToOrderTemplateModalOpen(true);\n    }, []);\n\n    if (!isChannelTypeB2B(props.context.actionContext.requestContext)) {\n        return null;\n    }\n\n    const addToOrderTemplateReference: React.RefObject<HTMLButtonElement> = React.createRef();\n    const isMultipleCatalogFeatureEnabledInHq = props.isMultipleCatalogFeatureEnabledInHq || false;\n    return (\n        <div className={props.className}>\n            <AddToOrderTemplateDialog\n                className='msc-add-to-order-template-dialog'\n                id=''\n                typeName=''\n                modalOpen={isAddToOrderTemplateModalOpen}\n                setModalOpen={setIsAddToOrderTemplateModalOpen}\n                context={props.context}\n                data={{ orderTemplates: props.data.orderTemplates }}\n                addToOrderTemplateDialogResources={props.resources}\n                createOrderTemplateDialogResources={props.resources}\n                onOrderTemplateSelected={onOrderTemplateSelected}\n                isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogFeatureEnabledInHq}\n                {...(isMultipleCatalogFeatureEnabledInHq && { catalogId: props.catalogId })}\n            />\n            {chosenOrderTemplate && addedProducts && (\n                <LinesAddedToOrderTemplateDialog\n                    className='msc-lines-added-to-order-template-dialog'\n                    id=''\n                    typeName=''\n                    context={props.context}\n                    dialogStrings={props.resources}\n                    data={{\n                        linesCount: addedLinesCount,\n                        itemsCount: addedItemsCount,\n                        orderTemplate: chosenOrderTemplate,\n                        products: addedProducts\n                    }}\n                    modalOpen={isLinesAddedToOrderTemplateDialogOpen}\n                    isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogFeatureEnabledInHq}\n                    {...(isMultipleCatalogFeatureEnabledInHq && { catalogId: props.catalogId })}\n                />\n            )}\n            <Button\n                className={`${props.className}__add-button`}\n                onClick={onAddProductsToOrderTemplateClick}\n                title={props.resources.addProductsToOrderTemplateButton}\n                innerRef={addToOrderTemplateReference}\n                disabled={props.isDisabled}\n            >\n                {props.resources.addProductsToOrderTemplateButton}\n            </Button>\n        </div>\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, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\n    duplicatedProductsHeader: string;\n\n    duplicatedProductsDescription: string;\n\n    updateQuantityButtonText: string;\n    cancelDuplicateItemsButtonText: string;\n}\n\nexport interface IDuplicateItemsWhenAddingToOrderTemplateDialogProps extends IComponentProps {\n    className: string;\n\n    dialogStrings?: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\n\n    modalOpen: boolean | undefined;\n\n    executeOverrideQuantity(): Promise<void>;\n    onCancel(): void;\n    // as required passing in components for later user\n    isMultipleCatalogFeatureEnabledInHq?: boolean;\n    catalogId?: number;\n}\n\nexport const DuplicateItemsWhenAddingToOrderTemplateDialog = (dialogProps: IDuplicateItemsWhenAddingToOrderTemplateDialogProps) => {\n    const { dialogStrings, className, modalOpen, executeOverrideQuantity } = dialogProps;\n\n    return (\n        <Modal isOpen={modalOpen} className={`${className}`} toggle={dialogProps.onCancel}>\n            <ModalHeader className={`${className}__dialog__header`} toggle={dialogProps.onCancel}>\n                <span>{dialogStrings?.duplicatedProductsHeader}</span>\n            </ModalHeader>\n            <ModalBody className={`${className}__dialog__body`}>\n                <div className={`${className}__dialog__content`}>\n                    <div className={`${className}__dialog__description`}>{dialogStrings?.duplicatedProductsDescription}</div>\n                </div>\n            </ModalBody>\n            <ModalFooter className={`${className}__dialog__footer`}>\n                <Button\n                    className={`${className}__dialog__update-quantity-button`}\n                    title={dialogStrings?.updateQuantityButtonText}\n                    onClick={executeOverrideQuantity}\n                >\n                    {dialogStrings?.updateQuantityButtonText}\n                </Button>\n                <Button\n                    className={`${className}__dialog__cancel-button`}\n                    title={dialogStrings?.cancelDuplicateItemsButtonText}\n                    onClick={dialogProps.onCancel}\n                >\n                    {dialogStrings?.cancelDuplicateItemsButtonText}\n                </Button>\n            </ModalFooter>\n        </Modal>\n    );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getUrlSync, IComponentProps, ICoreContext, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ProductPrice, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { PriceComponent } from '../../price/price.components';\n\nexport interface IItemAddedToOrderTemplateDialogResources {\n    viewOrderTemplateButtonText: string;\n    continueShoppingButtonText: string;\n    itemAddedToOrderTemplateHeaderItemOneText: string;\n    itemAddedToOrderTemplateHeaderItemFormatText: string;\n    itemAddedToOrderTemplateHeaderMessageText: string;\n\n    freePriceText: string;\n    originalPriceText: string;\n    currentPriceText: string;\n}\n\nexport interface IItemAddedToOrderTemplateDialogData {\n    product: SimpleProduct;\n    productPrice: ProductPrice;\n    quantity: number;\n    orderTemplateId: string;\n}\n\nexport interface IItemAddedToOrderTemplateDialogProps extends IComponentProps<IItemAddedToOrderTemplateDialogData> {\n    className: string;\n\n    dialogStrings: IItemAddedToOrderTemplateDialogResources;\n\n    modalOpen: boolean | undefined;\n\n    // as required passing in components for later user\n    isMultipleCatalogFeatureEnabledInHq?: boolean;\n    catalogId?: number;\n    imageSettings?: IImageSettings;\n}\n\nconst renderOrderTemplateImage = (context: ICoreContext, className: string, product: SimpleProduct, imageSettings?: IImageSettings) => {\n    const fallbackImageUrl = getFallbackImageUrl(\n        product.ItemId,\n        context.actionContext.requestContext.apiSettings,\n        context.request.app?.config?.OmniChannelMedia\n    );\n    if (imageSettings) {\n        imageSettings.cropFocalRegion = true;\n    }\n    const defaultImageSettings: IImageSettings = {\n        viewports: {\n            xs: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\n            lg: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\n            xl: { q: 'w=140&h=140&m=6', w: 0, h: 0 }\n        },\n        lazyload: true,\n        cropFocalRegion: true\n    };\n    return (\n        <Image\n            requestContext={context.actionContext.requestContext}\n            className={`${className}__image-props`}\n            src={product.PrimaryImageUrl || ''}\n            altText={product.Name}\n            fallBackSrc={fallbackImageUrl}\n            gridSettings={context.request.gridSettings!}\n            imageSettings={imageSettings || defaultImageSettings}\n            loadFailureBehavior='empty'\n        />\n    );\n};\n\nexport const ItemAddedToOrderTemplateDialog = (dialogProps: IItemAddedToOrderTemplateDialogProps) => {\n    const {\n        dialogStrings,\n        className,\n        context,\n        modalOpen,\n        imageSettings,\n        data: { orderTemplateId, product, productPrice, quantity }\n    } = dialogProps;\n\n    const getOrderTemplatePageUrl = (): string => {\n        const url = getUrlSync('ordertemplate', context.actionContext) || '';\n        const separator = url.includes('?') ? '&' : '?';\n        return `${url}${separator}id=${orderTemplateId}`;\n    };\n\n    const close: () => void = () => {\n        window.location.reload(true);\n    };\n\n    const itemsString =\n        quantity === 1\n            ? dialogStrings.itemAddedToOrderTemplateHeaderItemOneText\n            : dialogStrings.itemAddedToOrderTemplateHeaderItemFormatText.replace('{0}', quantity.toString());\n\n    return (\n        <Modal isOpen={modalOpen} className={`${className}`} toggle={close}>\n            <ModalHeader className={`${className}__dialog__header`} toggle={close}>\n                <b>{itemsString}</b>\n                <span>{dialogStrings.itemAddedToOrderTemplateHeaderMessageText}</span>\n            </ModalHeader>\n            <ModalBody className={`${className}__dialog__body`}>\n                <div className={`${className}__dialog__content`}>\n                    {renderOrderTemplateImage(context, `${className}__dialog`, product, imageSettings)}\n                    <div className={`${className}__dialog__description`}>\n                        <div className={`${className}__dialog__product-name`}>{product.Name}</div>\n                        <div className={`${className}__dialog__product-price`}>\n                            {productPrice && (\n                                <PriceComponent\n                                    data={{ price: productPrice }}\n                                    context={dialogProps.context}\n                                    id={dialogProps.id}\n                                    typeName={dialogProps.typeName}\n                                    freePriceText={dialogProps.dialogStrings.freePriceText}\n                                    originalPriceText={dialogProps.dialogStrings.originalPriceText}\n                                    currentPriceText={dialogProps.dialogStrings.currentPriceText}\n                                />\n                            )}\n                        </div>\n                        {product.Dimensions && (\n                            <div className={`${className}__dialog__product-dimensions`}>\n                                {product.Dimensions.map(dimension => dimension.DimensionValue?.Value)\n                                    .filter(value => value)\n                                    .join(', ')}\n                            </div>\n                        )}\n                    </div>\n                </div>\n            </ModalBody>\n            <ModalFooter className={`${className}__dialog__footer`}>\n                <Button\n                    className={`${className}__dialog__view-order-template-button`}\n                    title={dialogStrings.viewOrderTemplateButtonText}\n                    href={getOrderTemplatePageUrl()}\n                >\n                    {dialogStrings.viewOrderTemplateButtonText}\n                </Button>\n                <Button\n                    className={`${className}__dialog__continue-shopping`}\n                    title={dialogStrings.continueShoppingButtonText}\n                    onClick={close}\n                >\n                    {dialogStrings.continueShoppingButtonText}\n                </Button>\n            </ModalFooter>\n        </Modal>\n    );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce, isChannelTypeB2B, IImageSettings } from '@msdyn365-commerce/core';\nimport { AsyncResult, Customer, ProductDimension, ProductList, ProductPrice, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n    addItemToOrderTemplate,\n    AddItemToOrderTemplateInput,\n    getPriceForSelectedVariant,\n    OrderTemplate,\n    PriceForSelectedVariantInput,\n    updateOrderTemplateAction,\n    UpdateOrderTemplateInput,\n    validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, UncontrolledTooltip } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as Popper from 'popper.js';\nimport React, { useState } from 'react';\n\nimport {\n    AddToOrderTemplateDialog,\n    IAddToOrderTemplateDialogData,\n    IAddToOrderTemplateDialogResources\n} from '../add-to-order-template-dialog/add-to-order-template-dialog.component';\nimport {\n    DuplicateItemsWhenAddingToOrderTemplateDialog,\n    IDuplicateItemsWhenAddingToOrderTemplateDialogResources\n} from '../duplicate-items-when-adding-to-order-template-dialog/duplicate-items-when-adding-to-order-template-dialog.component';\nimport {\n    IItemAddedToOrderTemplateDialogResources,\n    ItemAddedToOrderTemplateDialog\n} from '../item-added-to-order-template-dialog/item-added-to-order-template-dialog.component';\nimport { IOrderTemplateNameDialogResources } from '../order-template-name-dialog/order-template-name-dialog.component';\n\nexport interface IAddToOrderTemplateComponentProps extends IComponentProps<IAddToOrderTemplateData> {\n    className?: string;\n\n    addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\n    createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\n    itemAddedToOrderTemplateDialogResources: IItemAddedToOrderTemplateDialogResources;\n    duplicateItemsWhenAddingToOrderTemplateDialogResources: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\n\n    addToOrderTemplateButtonText: string;\n    addToOrderTemplateButtonTooltip: string;\n\n    addToOrderTemplateMessage?: string;\n    addItemToOrderTemplateError?: string;\n\n    showButtonText?: boolean;\n    showButtonTooltip?: boolean;\n    shouldShowButtonFailedTooltip?: boolean;\n    disableButton?: boolean;\n    tooltipPosition?: Popper.Placement;\n    showStatusMessage?: boolean;\n    disabled?: boolean;\n    canAddMasterProduct?: boolean;\n    isMultipleCatalogFeatureEnabledInHq?: boolean;\n    catalogId?: number;\n\n    imageSettings?: IImageSettings;\n\n    onSuccess?(): void;\n    onError?(result: IOrderTemplateActionErrorResult): void;\n}\n\nexport interface IOrderTemplateActionErrorResult {\n    status: 'FAILED' | 'MISSING_DIMENSION';\n\n    missingDimensions?: ProductDimension[];\n}\n\ninterface IAddToOrderTemplateStateManager {\n    waiting: boolean;\n    content: IAddToOrderTemplateContentState;\n\n    setWaiting(newWaiting: boolean): void;\n    setContent(newContent: IAddToOrderTemplateContentState): void;\n}\n\ninterface IAddToOrderTemplateContentState {\n    showAlert?: boolean;\n    orderTemplateTextMessage?: string;\n    color?: string;\n}\n\ninterface IAddToOrderTemplateData {\n    orderTemplates: OrderTemplate[];\n\n    product: SimpleProduct;\n    quantity: number;\n\n    customerInformation?: Customer;\n    isChannelTypeB2B?: boolean;\n}\n\nexport interface IAddToOrderTemplateComponent extends IComponent<IAddToOrderTemplateComponentProps> {\n    onClick(): (\n        event: React.MouseEvent<HTMLElement>,\n        props: IAddToOrderTemplateComponentProps,\n        state: IAddToOrderTemplateStateManager\n    ) => void;\n}\n\nconst onClick = async (\n    _event: React.MouseEvent<HTMLElement>,\n    props: IAddToOrderTemplateComponentProps,\n    state: IAddToOrderTemplateStateManager,\n    openModal: (opened: boolean) => void\n): Promise<void> => {\n    const { user } = props.context.request;\n\n    if (state.waiting) {\n        return;\n    }\n\n    if (!user.isAuthenticated && user.signInUrl && window) {\n        window.location.assign(user.signInUrl);\n        return;\n    }\n\n    addToOrderTemplate(props, openModal);\n    state.setWaiting(false);\n};\n\nconst onDismiss = (state: IAddToOrderTemplateStateManager): void => {\n    state.setContent({ color: 'success', showAlert: false });\n};\n\nconst AddToOrderTemplateComponentActions = {\n    onClick,\n    onDismiss\n};\n\nconst hasProductInOrderTemplates = (productToFind: SimpleProduct) => {\n    /*\n    TODO: Currently API does not support filtering by products.\n    await getProductListLinesAsync(context, '',)\n    return orderTemplates.filter(orderTemplate =>\n        orderTemplate.orderTemplateLines.filter(\n            product => product.productListLine.ProductId === productToFind.RecordId).length !== 0).length !== 0;\n    */\n    return false;\n};\n\nconst AddToOrderTemplate: React.FC<IAddToOrderTemplateComponentProps> = (props: IAddToOrderTemplateComponentProps) => {\n    if (!isChannelTypeB2B(props.context.actionContext.requestContext)) {\n        return null;\n    }\n\n    const [waiting, setWaiting] = useState(false);\n    const [content, setContent] = useState({});\n    const state: IAddToOrderTemplateStateManager = {\n        waiting,\n        content,\n\n        setWaiting,\n        setContent\n    };\n\n    const [addToOrderTemplateModalOpen, setAddToOrderTemplateModalOpen] = useState(false);\n\n    const [chosenOrderTemplateId, setChosenOrderTemplateId] = useState<string | undefined>(undefined);\n    const [productPrice, setProductPrice] = useState<ProductPrice | null>(null);\n    const [itemAddedToOrderTemplateDialogOpen, setItemAddedToOrderTemplateDialogOpen] = useState(false);\n    const [duplicateItemsWhenAddingToOrderTemplateDialogOpen, setDuplicateItemsWhenAddingToOrderTemplateDialogOpen] = useState(false);\n    const catalogId = props.catalogId;\n    validateCatalogId(catalogId);\n    const isMultipleCatalogFeatureEnabledInHq = props.isMultipleCatalogFeatureEnabledInHq || false;\n    const executeAddItemToOrderTemplate = async (orderTemplate: ProductList) => {\n        setChosenOrderTemplateId(orderTemplate.Id);\n        const input = isMultipleCatalogFeatureEnabledInHq\n            ? new AddItemToOrderTemplateInput(\n                  orderTemplate.Id,\n                  props.data.product.RecordId,\n                  props.data.quantity,\n                  props.data.product.DefaultUnitOfMeasure || 'ea',\n                  isMultipleCatalogFeatureEnabledInHq,\n                  catalogId\n              )\n            : new AddItemToOrderTemplateInput(\n                  orderTemplate.Id,\n                  props.data.product.RecordId,\n                  props.data.quantity,\n                  props.data.product.DefaultUnitOfMeasure || 'ea'\n              );\n        await addItemToOrderTemplate(input, props.context.actionContext)\n            .then(async result => {\n                const retrievedProductPrice = await getPriceForSelectedVariant(\n                    new PriceForSelectedVariantInput(\n                        props.data.product.RecordId,\n                        props.context.actionContext.requestContext.apiSettings.channelId,\n                        props.data.product\n                    ),\n                    props.context.actionContext\n                );\n                setProductPrice(retrievedProductPrice);\n                setAddToOrderTemplateModalOpen(false);\n                setTimeout(() => {\n                    setItemAddedToOrderTemplateDialogOpen(true);\n                }, 500);\n            })\n            .catch(error => {\n                if (error.error?.name !== 'Microsoft_Dynamics_Commerce_Runtime_DuplicateObject') {\n                    return AsyncResult.reject(error);\n                }\n                setAddToOrderTemplateModalOpen(false);\n                setTimeout(() => {\n                    setDuplicateItemsWhenAddingToOrderTemplateDialogOpen(true);\n                }, 500);\n                return AsyncResult.resolve();\n            });\n    };\n\n    const onDuplicateDialogCancel = () => {\n        setDuplicateItemsWhenAddingToOrderTemplateDialogOpen(false);\n        setTimeout(() => {\n            setAddToOrderTemplateModalOpen(true);\n        }, 500);\n    };\n\n    const overrideQuantity = async () => {\n        const input = isMultipleCatalogFeatureEnabledInHq\n            ? new UpdateOrderTemplateInput(\n                  chosenOrderTemplateId!,\n                  props.data.product.RecordId,\n                  props.data.quantity,\n                  props.data.product.DefaultUnitOfMeasure || 'ea',\n                  isMultipleCatalogFeatureEnabledInHq,\n                  catalogId\n              )\n            : new UpdateOrderTemplateInput(\n                  chosenOrderTemplateId!,\n                  props.data.product.RecordId,\n                  props.data.quantity,\n                  props.data.product.DefaultUnitOfMeasure || 'ea'\n              );\n        await updateOrderTemplateAction(input, props.context.actionContext);\n\n        const retrievedProductPrice = await getPriceForSelectedVariant(\n            new PriceForSelectedVariantInput(\n                props.data.product.RecordId,\n                props.context.actionContext.requestContext.apiSettings.channelId,\n                props.data.product\n            ),\n            props.context.actionContext\n        );\n        setProductPrice(retrievedProductPrice);\n        setDuplicateItemsWhenAddingToOrderTemplateDialogOpen(false);\n        setTimeout(() => {\n            setItemAddedToOrderTemplateDialogOpen(true);\n        }, 500);\n    };\n\n    const {\n        addToOrderTemplateButtonText,\n        showStatusMessage,\n        showButtonText,\n        className,\n        disabled,\n        showButtonTooltip,\n        shouldShowButtonFailedTooltip,\n        disableButton,\n        tooltipPosition,\n        addToOrderTemplateButtonTooltip,\n        addToOrderTemplateDialogResources,\n        createOrderTemplateDialogResources\n    } = props;\n\n    const onDismissHandler = () => {\n        AddToOrderTemplateComponentActions.onDismiss(state);\n    };\n    const ariaLabel = addToOrderTemplateButtonText;\n    const addToOrderTemplateRef: React.RefObject<HTMLButtonElement> = React.createRef();\n    const showMessage = showStatusMessage !== undefined ? showStatusMessage : true;\n    const showTooltip = showButtonTooltip !== undefined ? showButtonTooltip : true;\n    const tooltipPos = showButtonTooltip !== undefined ? tooltipPosition : 'top-end';\n\n    const dialogData: IAddToOrderTemplateDialogData = {\n        orderTemplates: props.data.orderTemplates\n    };\n\n    const onClickHandler = (event: React.MouseEvent<HTMLElement>) => {\n        return AddToOrderTemplateComponentActions.onClick(event, props, state, setAddToOrderTemplateModalOpen);\n    };\n\n    return (\n        <>\n            <>\n                <button\n                    className={classnames(\n                        className,\n                        hasProductInOrderTemplates(props.data.product)\n                            ? 'msc-add-to-order-template-icon__added'\n                            : 'msc-add-to-order-template-icon',\n                        state.waiting ? 'msc-add-to-order-template-icon__waiting' : ''\n                    )}\n                    aria-label={ariaLabel}\n                    onClick={disableButton ? undefined : onClickHandler}\n                    disabled={disabled}\n                    ref={addToOrderTemplateRef}\n                >\n                    {showButtonText ? ariaLabel : ''}\n                </button>\n                {showTooltip && (\n                    <UncontrolledTooltip placement={tooltipPos} trigger='hover focus' target={addToOrderTemplateRef}>\n                        {shouldShowButtonFailedTooltip ? addToOrderTemplateButtonTooltip : ariaLabel}\n                    </UncontrolledTooltip>\n                )}\n            </>\n            {state.content.showAlert && showMessage ? (\n                <div className='ms-order-template-items__product-status'>\n                    <Alert color={state.content.color} isOpen={state.content.showAlert} toggle={onDismissHandler}>\n                        {state.content.orderTemplateTextMessage}\n                    </Alert>\n                </div>\n            ) : (\n                ''\n            )}\n            <AddToOrderTemplateDialog\n                className='msc-add-to-order-template-dialog'\n                modalOpen={addToOrderTemplateModalOpen}\n                setModalOpen={setAddToOrderTemplateModalOpen}\n                context={props.context}\n                id={props.id}\n                typeName={props.typeName}\n                data={dialogData}\n                addToOrderTemplateDialogResources={addToOrderTemplateDialogResources}\n                createOrderTemplateDialogResources={createOrderTemplateDialogResources}\n                onOrderTemplateSelected={executeAddItemToOrderTemplate}\n                isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogFeatureEnabledInHq}\n                {...(isMultipleCatalogFeatureEnabledInHq && { catalogId: props.catalogId })}\n            />\n            {chosenOrderTemplateId && productPrice && (\n                <ItemAddedToOrderTemplateDialog\n                    className='msc-item-added-to-order-template-dialog'\n                    id={props.id}\n                    typeName={props.typeName}\n                    context={props.context}\n                    dialogStrings={props.itemAddedToOrderTemplateDialogResources}\n                    imageSettings={props.imageSettings !== undefined ? props.imageSettings : undefined}\n                    data={{\n                        product: props.data.product,\n                        quantity: props.data.quantity,\n                        orderTemplateId: chosenOrderTemplateId,\n                        productPrice\n                    }}\n                    modalOpen={itemAddedToOrderTemplateDialogOpen}\n                    isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogFeatureEnabledInHq}\n                    {...(isMultipleCatalogFeatureEnabledInHq && { catalogId: props.catalogId })}\n                />\n            )}\n            <DuplicateItemsWhenAddingToOrderTemplateDialog\n                className='msc-duplicate-items-when-adding-to-order-template-dialog'\n                id={props.id}\n                typeName={props.typeName}\n                context={props.context}\n                dialogStrings={props.duplicateItemsWhenAddingToOrderTemplateDialogResources}\n                data={{}}\n                modalOpen={duplicateItemsWhenAddingToOrderTemplateDialogOpen}\n                executeOverrideQuantity={overrideQuantity}\n                onCancel={onDuplicateDialogCancel}\n                // isMultipleCatalogFeatureEnabledInHq={props.isMultipleCatalogFeatureEnabledInHq}\n                // {...(props.isMultipleCatalogFeatureEnabledInHq && { catalogId: props.catalogId })}\n            />\n        </>\n    );\n};\n\nconst addToOrderTemplate = (props: IAddToOrderTemplateComponentProps, openModal: (opened: boolean) => void): void => {\n    const { canAddMasterProduct } = props;\n\n    if (props.data.product.Dimensions && !canAddMasterProduct) {\n        const missingDimensions = props.data.product.Dimensions.filter(\n            dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value)\n        );\n\n        if (missingDimensions.length > 0) {\n            // At least one dimension with no value exists on the product, won't be able to proceed.\n            propagateError(props, { status: 'MISSING_DIMENSION', missingDimensions });\n            return;\n        }\n    }\n\n    openModal(true);\n};\n\nconst propagateError = (props: IAddToOrderTemplateComponentProps, result: IOrderTemplateActionErrorResult): void => {\n    const { onError } = props;\n\n    if (onError) {\n        onError(result);\n    }\n};\n\nexport const AddToOrderTemplateComponent: React.FunctionComponent<IAddToOrderTemplateComponentProps> = msdyn365Commerce.createComponent<\n    // @ts-expect-error\n    IAddToOrderTemplateComponent\n>('AddToOrderTemplate', { component: AddToOrderTemplate, ...AddToOrderTemplateComponentActions });\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getUrlSync, IComponentProps, ICoreContext, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ProductPrice, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { PriceComponent } from '../../price/price.components';\n\nexport interface IItemAddedToCartDialogResources {\n    viewCartButtonText: string;\n    orderTemplateCloseButtonText: string;\n    itemAddedToCartHeaderItemOneText: string;\n    itemAddedToCartHeaderItemFormatText: string;\n    itemAddedToCartHeaderMessageText: string;\n\n    freePriceText: string;\n    originalPriceText: string;\n    currentPriceText: string;\n}\n\nexport interface IItemAddedToCartDialogData {\n    product: SimpleProduct;\n    productPrice: ProductPrice;\n    quantity: number;\n}\n\nexport interface IItemAddedToCartDialogProps extends IComponentProps<IItemAddedToCartDialogData> {\n    className: string;\n\n    dialogStrings: IItemAddedToCartDialogResources;\n\n    modalOpen: boolean | undefined;\n\n    // as required passing in components for later user\n    isMultipleCatalogFeatureEnabledInHq?: boolean;\n    catalogId?: number;\n    onClose(): void;\n}\n\nconst renderImage = (context: ICoreContext, className: string, product: SimpleProduct, imageSettings?: IImageSettings) => {\n    const fallbackImageUrl = getFallbackImageUrl(\n        product.ItemId,\n        context.actionContext.requestContext.apiSettings,\n        context.request.app?.config?.OmniChannelMedia\n    );\n    const defaultImageSettings: IImageSettings = {\n        viewports: {\n            xs: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\n            lg: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\n            xl: { q: 'w=140&h=140&m=6', w: 0, h: 0 }\n        },\n        lazyload: true\n    };\n    return (\n        <Image\n            requestContext={context.actionContext.requestContext}\n            className={`${className}__image-props`}\n            src={product.PrimaryImageUrl || ''}\n            altText={product.Name}\n            fallBackSrc={fallbackImageUrl}\n            gridSettings={context.request.gridSettings!}\n            imageSettings={imageSettings || defaultImageSettings}\n            loadFailureBehavior='empty'\n        />\n    );\n};\n\nexport const ItemAddedToCartDialog = (dialogProps: IItemAddedToCartDialogProps) => {\n    const {\n        dialogStrings,\n        className,\n        context,\n        modalOpen,\n        data: { product, productPrice, quantity }\n    } = dialogProps;\n\n    const getCartPageUrl = (): string => {\n        return getUrlSync('cart', context.actionContext) || '';\n    };\n\n    const close: () => void = () => {\n        dialogProps.onClose();\n    };\n\n    const itemsString =\n        quantity === 1\n            ? dialogStrings.itemAddedToCartHeaderItemOneText\n            : dialogStrings.itemAddedToCartHeaderItemFormatText.replace('{0}', quantity.toString());\n\n    return (\n        <Modal isOpen={modalOpen} className={`${className}`} toggle={close}>\n            <ModalHeader className={`${className}__dialog__header`} toggle={close}>\n                <b>{itemsString}</b>\n                <span>{dialogStrings.itemAddedToCartHeaderMessageText}</span>\n            </ModalHeader>\n            <ModalBody className={`${className}__dialog__body`}>\n                <div className={`${className}__dialog__content`}>\n                    {renderImage(context, `${className}__dialog`, product)}\n                    <div className={`${className}__dialog__description`}>\n                        <div className={`${className}__dialog__product-name`}>{product.Name}</div>\n                        <div className={`${className}__dialog__product-price`}>\n                            {productPrice && (\n                                <PriceComponent\n                                    data={{ price: productPrice }}\n                                    context={dialogProps.context}\n                                    id={dialogProps.id}\n                                    typeName={dialogProps.typeName}\n                                    freePriceText={dialogProps.dialogStrings.freePriceText}\n                                    originalPriceText={dialogProps.dialogStrings.originalPriceText}\n                                    currentPriceText={dialogProps.dialogStrings.currentPriceText}\n                                />\n                            )}\n                        </div>\n                        {product.Dimensions && (\n                            <div className={`${className}__dialog__product-dimensions`}>\n                                {product.Dimensions.map(dimension => dimension.DimensionValue?.Value)\n                                    .filter(value => value)\n                                    .join(', ')}\n                            </div>\n                        )}\n                    </div>\n                </div>\n            </ModalBody>\n            <ModalFooter className={`${className}__dialog__footer`}>\n                <Button\n                    className={`${className}__dialog__view-cart-button`}\n                    title={dialogStrings.viewCartButtonText}\n                    href={getCartPageUrl()}\n                >\n                    {dialogStrings.viewCartButtonText}\n                </Button>\n                <Button\n                    className={`${className}__dialog__continue-shopping`}\n                    title={dialogStrings.orderTemplateCloseButtonText}\n                    onClick={close}\n                >\n                    {dialogStrings.orderTemplateCloseButtonText}\n                </Button>\n            </ModalFooter>\n        </Modal>\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 { IComponent, IComponentProps, msdyn365Commerce, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { AsyncResult, CartLine, Customer, ProductList, ProductListLine } from '@msdyn365-commerce/retail-proxy';\nimport {\n    addProductListLinesAsync,\n    updateProductListLinesAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductListsDataActions.g';\nimport {\n    FullProductInput,\n    getFullProducts,\n    getProductDetailsCriteriaFromActionInput,\n    getProductListLines,\n    GetProductListLinesInput,\n    OrderTemplate\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, UncontrolledTooltip } from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nimport {\n    AddToOrderTemplateDialog,\n    IAddToOrderTemplateDialogResources\n} from '../add-to-order-template-dialog/add-to-order-template-dialog.component';\nimport {\n    ILinesAddedToOrderTemplateDialogResources,\n    LinesAddedToOrderTemplateDialog\n} from '../lines-added-to-order-template-dialog/lines-added-to-order-template-dialog.component';\nimport { IOrderTemplateNameDialogResources } from '../order-template-name-dialog/order-template-name-dialog.component';\nimport {\n    DuplicateItemsWhenAddingToOrderTemplateDialog,\n    IDuplicateItemsWhenAddingToOrderTemplateDialogResources\n} from '../duplicate-items-when-adding-to-order-template-dialog/duplicate-items-when-adding-to-order-template-dialog.component';\nexport interface ISaveCartToOrderTemplateComponentProps extends IComponentProps<ISaveCartToOrderTemplateData> {\n    className?: string;\n    isMultipleCatalogFeatureEnabledInHq?: boolean;\n    catalogId?: number;\n    addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\n    createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\n    linesAddedToOrderTemplateDialogResources: ILinesAddedToOrderTemplateDialogResources;\n\n    createOrderTemplateFromCartButton: string;\n    createOrderTemplateFromCartButtonTooltip: string;\n\n    duplicateItemsWhenAddingToOrderTemplateDialogResources?: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\n}\n\ninterface ISaveCartToOrderTemplateData {\n    orderTemplates: OrderTemplate[];\n    cartLines: CartLine[];\n    customerInformation?: Customer;\n    isChannelTypeB2B?: boolean;\n}\n\ninterface ISaveCartToOrderTemplateContentState {\n    showAlert?: boolean;\n    orderTemplateTextMessage?: string;\n    color?: string;\n}\n\ninterface ISaveCartToOrderTemplateStateManager {\n    waiting: boolean;\n    content: ISaveCartToOrderTemplateContentState;\n\n    setWaiting(newWaiting: boolean): void;\n    setContent(newContent: ISaveCartToOrderTemplateContentState): void;\n}\n\nexport interface ISaveCartToOrderTemplateComponent extends IComponent<ISaveCartToOrderTemplateComponentProps> {\n    onClick(): (\n        event: React.MouseEvent<HTMLElement>,\n        props: ISaveCartToOrderTemplateComponentProps,\n        state: ISaveCartToOrderTemplateStateManager\n    ) => void;\n}\n\nconst onDismiss = (state: ISaveCartToOrderTemplateStateManager): void => {\n    state.setContent({ color: 'success', showAlert: false });\n};\n\nconst SaveCartToOrderTemplateActions = {\n    onDismiss\n};\n\nconst SaveCartToOrderTemplate: React.FC<ISaveCartToOrderTemplateComponentProps> = (props: ISaveCartToOrderTemplateComponentProps) => {\n    if (!isChannelTypeB2B(props.context.actionContext.requestContext)) {\n        return null;\n    }\n\n    const [chosenOrderTemplate, setChosenOrderTemplate] = useState<ProductList | undefined>(undefined);\n    const [addedProducts, setAddedProducts] = useState<FullProduct[] | undefined>(undefined);\n    const [addToOrderTemplateModalOpen, setAddToOrderTemplateModalOpen] = useState(false);\n    const [linesAddedToOrderTemplateDialogOpen, setLinesAddedToOrderTemplateDialogOpen] = useState(false);\n    const [duplicateItemsWhenAddingToOrderTemplateDialogOpen, setDuplicateItemsWhenAddingToOrderTemplateDialogOpen] = useState(false);\n    const [addedLinesCount, setAddedLinesCount] = useState(0);\n    const [addedItemsCount, setAddedItemsCount] = useState(0);\n\n    const {\n        addToOrderTemplateDialogResources,\n        createOrderTemplateDialogResources,\n        createOrderTemplateFromCartButton,\n        createOrderTemplateFromCartButtonTooltip\n    } = props;\n\n    const onDuplicateDialogCancel = () => {\n        setDuplicateItemsWhenAddingToOrderTemplateDialogOpen(false);\n        setTimeout(() => {\n            setAddToOrderTemplateModalOpen(true);\n        }, 500);\n    };\n    const isMultipleCatalogFeatureEnabledInHq = props.isMultipleCatalogFeatureEnabledInHq || false;\n    const overrideQuantity = async () => {\n        const newLinesToupdate: ProductListLine[] = [];\n\n        for (const cartLine of props.data.cartLines) {\n            const getLinesInput = new GetProductListLinesInput(chosenOrderTemplate?.Id!, cartLine.ProductId!.toString());\n            const linesState = await getProductListLines(getLinesInput, props.context.actionContext);\n            const length = 1;\n            const linesToUpdate = linesState.lines.filter(line => line.productListLine.ProductId === cartLine.ProductId);\n            if (linesToUpdate.length !== length) {\n                // skip new line if not exist already top update\n                continue;\n            }\n            const lineToUpdate = linesToUpdate[0].productListLine;\n            lineToUpdate.UnitOfMeasure = cartLine.UnitOfMeasureSymbol || 'ea';\n            lineToUpdate.Quantity = cartLine.Quantity!;\n            if (isMultipleCatalogFeatureEnabledInHq) {\n                lineToUpdate.CatalogId = cartLine.CatalogId;\n            }\n            newLinesToupdate.push(lineToUpdate);\n        }\n\n        await updateProductListLinesAsync(\n            {\n                callerContext: props.context.actionContext\n            },\n            chosenOrderTemplate!.Id,\n            newLinesToupdate\n        ).then(async updatedLines => {\n            updateLinesCounts(updatedLines);\n            const allProductInputs: FullProductInput[] = getFullProductsDetails(updatedLines);\n            const allProducts = await getFullProducts(allProductInputs, props.context.actionContext);\n            setAddedProducts(allProducts);\n            setDuplicateItemsWhenAddingToOrderTemplateDialogOpen(false);\n            setTimeout(() => {\n                setLinesAddedToOrderTemplateDialogOpen(true);\n            }, 500);\n        });\n    };\n    const getFullProductsDetails = (productLines: ProductListLine[]) => {\n        const allProdInputs: FullProductInput[] = [];\n        productLines.forEach(lines => {\n            if (lines.ProductId) {\n                allProdInputs.push(\n                    new FullProductInput(\n                        lines.ProductId,\n                        props.context.actionContext.requestContext.apiSettings,\n                        getProductDetailsCriteriaFromActionInput(props.context.actionContext),\n                        props.context.actionContext.requestContext\n                    )\n                );\n            }\n        });\n        return allProdInputs;\n    };\n\n    const onOrderTemplateSelected = async (orderTemplate: ProductList) => {\n        setChosenOrderTemplate(orderTemplate);\n        const allProductListLines = props.data.cartLines?.map(cartLine => {\n            const productListLineToAdd: ProductListLine = {\n                ProductListId: orderTemplate.Id,\n                ProductId: cartLine.ProductId,\n                Quantity: cartLine.Quantity,\n                UnitOfMeasure: cartLine.UnitOfMeasureSymbol\n            };\n            return productListLineToAdd;\n        });\n\n        const allProductInputs: FullProductInput[] = getFullProductsDetails(allProductListLines);\n        const allProducts = await getFullProducts(allProductInputs, props.context.actionContext);\n\n        // Filter out products with keyed in price\n        const filteredProductListLines = props.data.cartLines\n            .filter(cartline => !cartline.IsPriceKeyedIn)\n            .map(cartLine => {\n                const productListLineToAdd: ProductListLine = {\n                    ProductListId: orderTemplate.Id,\n                    ProductId: cartLine.ProductId,\n                    Quantity: cartLine.Quantity,\n                    UnitOfMeasure: cartLine.UnitOfMeasureSymbol,\n                    ...(isMultipleCatalogFeatureEnabledInHq && { catalogId: cartLine.CatalogId })\n                };\n\n                return productListLineToAdd;\n            });\n\n        await addProductListLinesAsync({ callerContext: props.context.actionContext }, orderTemplate.Id, filteredProductListLines)\n            .then(filteredAddedLines => {\n                updateLinesCounts(filteredAddedLines);\n                setAddedProducts(allProducts);\n                setAddToOrderTemplateModalOpen(false);\n                setTimeout(() => {\n                    setLinesAddedToOrderTemplateDialogOpen(true);\n                }, 500);\n            })\n            .catch(error => {\n                if (error.name !== 'Microsoft_Dynamics_Commerce_Runtime_DuplicateObject') {\n                    return AsyncResult.reject(error);\n                }\n                setAddToOrderTemplateModalOpen(false);\n                setTimeout(() => {\n                    setDuplicateItemsWhenAddingToOrderTemplateDialogOpen(true);\n                }, 500);\n                return AsyncResult.resolve();\n            });\n    };\n    const updateLinesCounts = (lines: ProductListLine[]) => {\n        setAddedLinesCount(lines.length);\n        setAddedItemsCount(lines.map(line => line.Quantity || 1).reduce((firstQuantity, secondQuantity) => firstQuantity + secondQuantity));\n    };\n    const onSaveCartToOrderTemplateClick = () => {\n        setAddToOrderTemplateModalOpen(true);\n    };\n\n    const areAllCartlinesPriceKeyedIn = props.data.cartLines.filter(cartline => !cartline.IsPriceKeyedIn).length === 0;\n\n    const addToOrderTemplateRef: React.RefObject<HTMLButtonElement> = React.createRef();\n\n    return (\n        <>\n            <AddToOrderTemplateDialog\n                className='msc-add-to-order-template-dialog'\n                modalOpen={addToOrderTemplateModalOpen}\n                setModalOpen={setAddToOrderTemplateModalOpen}\n                context={props.context}\n                id={props.id}\n                typeName={props.typeName}\n                data={{ orderTemplates: props.data.orderTemplates }}\n                addToOrderTemplateDialogResources={addToOrderTemplateDialogResources}\n                createOrderTemplateDialogResources={createOrderTemplateDialogResources}\n                onOrderTemplateSelected={onOrderTemplateSelected}\n                isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogFeatureEnabledInHq}\n                {...(isMultipleCatalogFeatureEnabledInHq && { catalogId: props.catalogId })}\n            />\n            {chosenOrderTemplate && addedProducts && (\n                <LinesAddedToOrderTemplateDialog\n                    className='msc-lines-added-to-order-template-dialog'\n                    id={props.id}\n                    typeName={props.typeName}\n                    context={props.context}\n                    dialogStrings={props.linesAddedToOrderTemplateDialogResources}\n                    data={{\n                        linesCount: addedLinesCount,\n                        itemsCount: addedItemsCount,\n                        orderTemplate: chosenOrderTemplate,\n                        products: addedProducts\n                    }}\n                    modalOpen={linesAddedToOrderTemplateDialogOpen}\n                    isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogFeatureEnabledInHq}\n                    {...(isMultipleCatalogFeatureEnabledInHq && { catalogId: props.catalogId })}\n                />\n            )}\n            <DuplicateItemsWhenAddingToOrderTemplateDialog\n                className='msc-duplicate-items-when-adding-to-order-template-dialog'\n                id={props.id}\n                typeName={props.typeName}\n                context={props.context}\n                dialogStrings={props.duplicateItemsWhenAddingToOrderTemplateDialogResources}\n                data={{}}\n                modalOpen={duplicateItemsWhenAddingToOrderTemplateDialogOpen}\n                executeOverrideQuantity={overrideQuantity}\n                onCancel={onDuplicateDialogCancel}\n                isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogFeatureEnabledInHq}\n                {...(isMultipleCatalogFeatureEnabledInHq && { catalogId: props.catalogId })}\n            />\n            <Button\n                className={`msc-cart__btn-addcarttotemplate${areAllCartlinesPriceKeyedIn ? ' disabled' : ''}`}\n                onClick={areAllCartlinesPriceKeyedIn ? undefined : onSaveCartToOrderTemplateClick}\n                title={createOrderTemplateFromCartButton}\n                innerRef={addToOrderTemplateRef}\n            >\n                {createOrderTemplateFromCartButton}\n            </Button>\n            {areAllCartlinesPriceKeyedIn && (\n                <UncontrolledTooltip\n                    className='msc-cart__btn-addcarttotemplate-tooltip'\n                    placement='top-start'\n                    trigger='hover focus'\n                    target={addToOrderTemplateRef}\n                >\n                    {createOrderTemplateFromCartButtonTooltip}\n                </UncontrolledTooltip>\n            )}\n        </>\n    );\n};\n\nexport const SaveCartToOrderTemplateComponent: React.FunctionComponent<ISaveCartToOrderTemplateComponentProps> = msdyn365Commerce.createComponent<\n    // @ts-expect-error\n    ISaveCartToOrderTemplateComponent\n>('SaveCartToOrderTemplate', { component: SaveCartToOrderTemplate, ...SaveCartToOrderTemplateActions });\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, IPayLoad, ISliderChangeNotification, onTelemetryClick, Waiting } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport {\n    AgeGate,\n    ClosedCaptionHelper,\n    ClosedCaptions,\n    closedCaptionsSettingDefaults,\n    ClosedCaptionTypes,\n    format,\n    ICCFile,\n    ICurrentClosedCaptionsSettings,\n    IPlayerMenu,\n    IPlayerMenuItemClickNotification,\n    IPlayerProps,\n    IPlayPosition,\n    isNullOrWhiteSpace,\n    isSafari,\n    IVideoErrorData,\n    IVideoErrorMessageData,\n    IVideoMetadata,\n    KeyCodes,\n    LocalizationConstants,\n    LocalizationHelper,\n    MediaEvents,\n    MenuCategories,\n    PlayerConstants,\n    PlayerHelper,\n    PlayerStates,\n    PlayPauseTrigger,\n    videoClosedCaptionsConstant,\n    VideoControls,\n    VideoErrorCodes,\n    VideoPlayerNames\n} from './components';\n\n/**\n * Player state interface.\n */\nexport interface IPlayerState {\n    playing: boolean;\n    mouseHovered: boolean;\n    isControlPanelVisible: boolean;\n    doControlsHaveFocus: boolean;\n    playPosition: IPlayPosition;\n    currentVolume: number;\n    isTriggerEnabled: boolean;\n    previousVolume: number;\n    isMuted: boolean;\n    isInFullScreen: boolean;\n    showSpinner: boolean;\n    showErrorMessage: boolean;\n    videoErrorMessage: IVideoErrorMessageData;\n    screenReaderText: string;\n    showClosedCaptions: boolean;\n    isAgegateEnabled: boolean;\n    currentAudioTrack: string;\n    currentAudioTrackURL: string;\n    closedCaptionLanguage: string;\n    closedCaptionsURL: string;\n    currentClosedCaptionsSettings: ICurrentClosedCaptionsSettings;\n    mounted: boolean;\n    tempClosedCaptionsSettings?: {};\n}\n\n/**\n *\n * Player component.\n *\n */\nexport default class Player extends React.Component<IPlayerProps, IPlayerState> {\n    public static defaultProps: Partial<IPlayerProps> = {\n        playerData: {\n            options: {\n                autoplay: true,\n                ageGate: false,\n                mute: true,\n                loop: false,\n                playPauseTrigger: false,\n                controls: true,\n                hidePosterFrame: false,\n                lazyLoad: true\n            },\n            metaData: {\n                playerName: 'videoPlayer',\n                videoId: '',\n                title: '',\n                description: '',\n                duration: 0,\n                posterframeUrl: '',\n                shareUrl: '',\n                videoFiles: [],\n                externalPlayerUrl: '',\n                externalSourceId: '',\n                videoBinaryReferences: []\n            }\n        },\n        playerResources: {\n            playAriaLabel: LocalizationConstants.playAriaLabel,\n            pauseAriaLabel: LocalizationConstants.pauseAriaLabel,\n            closeAriaLabel: LocalizationConstants.closeAriaLabel,\n            muteAriaLabel: LocalizationConstants.muteAriaLabel,\n            unMuteAriaLabel: LocalizationConstants.unMuteAriaLabel,\n            fullScreenAriaLabel: LocalizationConstants.fullScreenAriaLabel,\n            exitFullScreenAriaLabel: LocalizationConstants.exitFullScreenAriaLabel,\n            pausedAriaLabel: LocalizationConstants.pausedAriaLabel,\n            playingAriaLabel: LocalizationConstants.playingAriaLabel,\n            seekBarLabel: LocalizationConstants.seekBarLabel,\n            videoTimeDurationLabel: LocalizationConstants.videoTimeDurationLabel,\n            closedCaptionLabel: LocalizationConstants.closedCaptionLabel,\n            sliderThumbLabel: LocalizationConstants.sliderThumbLabel,\n            volumeThumbLabel: LocalizationConstants.volumeThumbLabel\n        }\n    };\n\n    private controlPanelTimer: number = 0;\n\n    private readonly playerId: string;\n\n    private readonly player: React.RefObject<HTMLVideoElement> = React.createRef<HTMLVideoElement>();\n\n    private readonly audio: React.RefObject<HTMLAudioElement> = React.createRef<HTMLAudioElement>();\n\n    private readonly playerContainer: React.RefObject<HTMLDivElement> = React.createRef<HTMLDivElement>();\n\n    private readonly videoControl: React.RefObject<VideoControls> = React.createRef<VideoControls>();\n\n    private readonly ClosedCaptions: React.RefObject<ClosedCaptions> = React.createRef<ClosedCaptions>();\n\n    private readonly ageGateContainer: React.RefObject<AgeGate> = React.createRef<AgeGate>();\n\n    private videoUrl: string = '';\n\n    private posterFrameUrl: string = '';\n\n    private seekFrom: number | null = null;\n\n    private playerState: PlayerStates;\n\n    private readonly playerHelper: PlayerHelper;\n\n    private readonly localizationHelper: LocalizationHelper;\n\n    private closedCaptionHelper: ClosedCaptionHelper | null = null;\n\n    private closedCaptionMenu: IPlayerMenu | null = null;\n\n    private optionsMenu: IPlayerMenu | null = null;\n\n    private selectedClosedCaptionsLocale: string | null = '';\n\n    private isPlayerManuallyPaused: boolean = false;\n\n    private isPlayerLoaded: boolean = false;\n\n    private playerMetaData: IVideoMetadata;\n\n    private readonly isMobileDevice: boolean;\n\n    private readonly payLoad: IPayLoad;\n\n    private readonly _shouldAutoPlay: boolean;\n\n    /**\n     * Checks if fullscreen is supported by browser or not.\n     * @returns - If native fullscreen enabled.\n     */\n    private static _isNativeFullscreenEnabled(): boolean {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        const doc = document as any;\n        return (\n            doc.fullscreenEnabled ||\n            doc.mozFullScreenEnabled ||\n            doc.webkitFullscreenEnabled ||\n            doc.webkitSupportsFullscreen ||\n            doc.msFullscreenEnabled\n        );\n    }\n    /**\n     * Gets the current fullscreen element.\n     * @returns - The element in full screen.\n     */\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    private static _getElementInFullScreen(): any {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        const doc = document as any;\n        return doc.fullscreenElement || doc.mozFullScreenElement || doc.webkitFullscreenElement || doc.msFullscreenElement;\n    }\n\n    public constructor(props: IPlayerProps) {\n        super(props);\n\n        const {\n            playerData: {\n                options: {\n                    shouldDisableAutoPlayOnMobile,\n                    autoplay: isAutoPlay,\n                    playPauseTrigger: isPlayPauseTrigger,\n                    ageGate: isAgeGateEnabled,\n                    controls: isControlsEnabled,\n                    mute: isMuted,\n                    lazyLoad: isLazyLoaded,\n                    isMobileDevice\n                }\n            }\n        } = this.props;\n\n        this.isMobileDevice = this._isMobile() || isMobileDevice!;\n\n        this._shouldAutoPlay = this.isMobileDevice && shouldDisableAutoPlayOnMobile ? false : isAutoPlay!;\n\n        const state = {\n            playing: false,\n            mouseHovered: isPlayPauseTrigger! || !this._shouldAutoPlay,\n            isControlPanelVisible: !isPlayPauseTrigger,\n            doControlsHaveFocus: false,\n            isTriggerEnabled: isPlayPauseTrigger! && !this._shouldAutoPlay && isControlsEnabled!,\n            currentVolume: isMuted && !this.isMobileDevice ? 0 : PlayerConstants.defaultVolume * 100,\n            previousVolume: 0,\n            isMuted: isMuted ?? false,\n            isInFullScreen: false,\n            showSpinner: false,\n            isAgegateEnabled: isAgeGateEnabled! && !this._shouldAutoPlay,\n            showErrorMessage: false,\n            screenReaderText: '',\n            closedCaptionLanguage: 'off',\n            currentAudioTrack: 'default',\n            currentAudioTrackURL: '',\n            showClosedCaptions: false,\n            mounted: false,\n            currentClosedCaptionsSettings: {\n                preset: closedCaptionsSettingDefaults.preset,\n                text_font: closedCaptionsSettingDefaults.text_font,\n                text_color: closedCaptionsSettingDefaults.text_color,\n                text_opacity: closedCaptionsSettingDefaults.text_opacity,\n                text_size: closedCaptionsSettingDefaults.text_size,\n                text_edge_style: closedCaptionsSettingDefaults.text_edge_style,\n                text_background_color: closedCaptionsSettingDefaults.text_background_color,\n                text_background_opacity: closedCaptionsSettingDefaults.text_background_opacity,\n                window_color: closedCaptionsSettingDefaults.window_color,\n                window_opacity: closedCaptionsSettingDefaults.window_opacity\n            },\n            closedCaptionsURL: '',\n            videoErrorMessage: {\n                title: '',\n                message: ''\n            },\n            playPosition: {\n                currentTime: 0,\n                startTime: 0,\n                endTime: 0,\n                bufferedDuration: 0\n            },\n            tempClosedCaptionsSettings: undefined\n        };\n\n        this.playerState = 'init';\n        this._onTriggerClicked = this._onTriggerClicked.bind(this);\n        this._onMouseEvent = this._onMouseEvent.bind(this);\n        this._onPlay = this._onPlay.bind(this);\n        this._onPause = this._onPause.bind(this);\n        this._triggerEvents = this._triggerEvents.bind(this);\n        this._triggerAudioEvents = this._triggerAudioEvents.bind(this);\n        this._onProgressChange = this._onProgressChange.bind(this);\n        this._setMuted = this._setMuted.bind(this);\n        this._onVolumeChange = this._onVolumeChange.bind(this);\n        this._onFullScreenChanged = this._onFullScreenChanged.bind(this);\n        this._toggleFullScreen = this._toggleFullScreen.bind(this);\n        this._showControlBar = this._showControlBar.bind(this);\n        this._handleControlsKeyDownEvent = this._handleControlsKeyDownEvent.bind(this);\n        this._onFullscreenError = this._onFullscreenError.bind(this);\n        this._onPlayerKeyDown = this._onPlayerKeyDown.bind(this);\n        this._onTriggerFocus = this._onTriggerFocus.bind(this);\n        this._onTriggerBlur = this._onTriggerBlur.bind(this);\n        this._onVideoControlsFocus = this._onVideoControlsFocus.bind(this);\n        this._onVideoControlsBlur = this._onVideoControlsBlur.bind(this);\n        this._onPlayerMenuItemClick = this._onPlayerMenuItemClick.bind(this);\n        this._onPlayerMenuItemFocus = this._onPlayerMenuItemFocus.bind(this);\n        this._onPlayerMenuItemBlur = this._onPlayerMenuItemBlur.bind(this);\n        this._validateAgeSubmitHandler = this._validateAgeSubmitHandler.bind(this);\n        this._onContextMenuClicked = this._onContextMenuClicked.bind(this);\n        this.localizationHelper = new LocalizationHelper(this.props.playerResources!);\n        this.playerHelper = new PlayerHelper(this.props, this.localizationHelper, this.isMobileDevice);\n        this.playerId = this.playerHelper.isEmptyOrUndefined(this.props.playerId) ? 'vid-0' : this.props.playerId!;\n        this.playerMetaData = this.playerHelper.getMetadata();\n        this.state = state;\n        this.posterFrameUrl = this.playerHelper.getPosterFrameUrl();\n        this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n\n        if (!isLazyLoaded) {\n            this.videoUrl = this.playerHelper.getVideoFileToPlay().url;\n        }\n    }\n\n    public shouldComponentUpdate(nextProps: IPlayerProps, nextState: IPlayerState): boolean {\n        if (this.state === nextState && this.props.playerData.options === nextProps.playerData.options) {\n            return false;\n        }\n        return true;\n    }\n\n    public render(): JSX.Element {\n        const {\n            playerData: {\n                options: { loop: isLoop }\n            }\n        } = this.props;\n\n        const maskLevelStyle: React.CSSProperties = {};\n        maskLevelStyle.backgroundColor = this._getMaskLevelStyle();\n\n        if (this.props.isEditor) {\n            this.playerHelper.updatePlayerProps(this.props);\n            this.playerMetaData = this.playerHelper.getMetadata();\n            if (this.posterFrameUrl !== this.playerHelper.getPosterFrameUrl()) {\n                this.posterFrameUrl = this.playerHelper.getPosterFrameUrl();\n            }\n            if (this.isPlayerLoaded && this.videoUrl !== this.playerHelper.getVideoFileToPlay().url) {\n                this._loadPlayer();\n            }\n        }\n\n        const loadMetaData = this._shouldAutoPlay ? 'auto' : 'metadata';\n\n        // Set play aria label\n        let playAriaLabel: string = '';\n        if (this.playerMetaData.title) {\n            playAriaLabel = `${this.localizationHelper.getLocalizedValue('playAriaLabel')} ${this.playerMetaData.title}`;\n        } else {\n            playAriaLabel = LocalizationConstants.playVideoAriaLabel;\n        }\n\n        return (\n            <div\n                role='none'\n                className={`${VideoPlayerNames.videoplayerContainer}`}\n                ref={this.playerContainer}\n                onKeyDown={this._onPlayerKeyDown}\n                onMouseEnter={this._onMouseEvent}\n                onMouseLeave={this._onMouseEvent}\n                data-playerid={this.playerId}\n            >\n                <div className={`${VideoPlayerNames.videoplayerContainer}__wrapper`}>\n                    {this.state.currentAudioTrack !== '' && this.state.currentAudioTrackURL !== '' && (\n                        <audio\n                            ref={this.audio}\n                            preload='auto'\n                            src={this.state.currentAudioTrackURL}\n                            muted={this.state.isMuted}\n                            loop={isLoop}\n                        />\n                    )}\n                    <video\n                        className={`${VideoPlayerNames.videoplayerContainer}__video`}\n                        ref={this.player}\n                        preload={loadMetaData}\n                        autoPlay={this._shouldAutoPlay}\n                        muted={this.state.isMuted}\n                        loop={isLoop}\n                        onPlay={this._onPlay}\n                        onPause={this._onPause}\n                        onClick={!this.state.isAgegateEnabled ? this._onTriggerClicked : this._onPause}\n                        src={this.videoUrl}\n                        onContextMenu={this._onContextMenuClicked}\n                        poster={this.posterFrameUrl}\n                        playsInline\n                        aria-hidden='true'\n                    />\n                    <div\n                        className={`${VideoPlayerNames.videoplayerContainer}__errormessage`}\n                        role='status'\n                        aria-hidden={!this.state.showErrorMessage}\n                    >\n                        <div className={`${VideoPlayerNames.videoplayerContainer}__errormessage__wrapper`}>\n                            <p className={`${VideoPlayerNames.videoplayerContainer}__errormessage__heading`}>\n                                {this.state.videoErrorMessage.title}\n                            </p>\n                        </div>\n                    </div>\n                    <div className={`${VideoPlayerNames.videoplayerContainer}__screenreader`} aria-live='assertive'>\n                        {this.state.screenReaderText}\n                    </div>\n                    <div\n                        className={`${VideoPlayerNames.videoplayerContainer}__spinner`}\n                        role='status'\n                        aria-hidden={!this.state.showSpinner}\n                    >\n                        <Waiting className={`${VideoPlayerNames.videoplayerContainer}__waiting`} />\n                    </div>\n                    {this.props.playerData.options.ageGate && this._renderAgeGate()}\n                    {this._renderPlayPauseTrigger(playAriaLabel, maskLevelStyle)}\n                    {this.state.showClosedCaptions && this._renderClosedCaptions()}\n                    {this._renderVideoControls(playAriaLabel)}\n                </div>\n            </div>\n        );\n    }\n\n    /**\n     * Play the video.\n     */\n    public play(): void {\n        this.player.current!.play().catch(() => {\n            this._onVideoError();\n        });\n        if (this.audio.current) {\n            this.audio.current.play().catch(() => {\n                this._onAudioError();\n            });\n        }\n    }\n\n    /**\n     * Pause the video.\n     */\n    public pause(): void {\n        this.player.current!.pause();\n        if (this.audio.current) {\n            this.audio.current.pause();\n        }\n    }\n\n    public componentDidMount(): void {\n        const {\n            playerData: {\n                options: { playPauseTrigger: isPlayPauseTrigger, lazyLoad: isLazyLoaded }\n            }\n        } = this.props;\n        if (!isLazyLoaded) {\n            this._onVideoLoadedData();\n            this._showControlBar(false);\n        }\n\n        if (this._shouldAutoPlay || (isLazyLoaded && !isPlayPauseTrigger) || !isLazyLoaded) {\n            this._loadPlayer();\n        }\n        document.addEventListener('fullscreenchange', this._onFullScreenChanged);\n        document.addEventListener('mozfullscreenchange', this._onFullScreenChanged);\n        document.addEventListener('webkitfullscreenchange', this._onFullScreenChanged);\n        document.addEventListener('MSFullscreenChange', this._onFullScreenChanged);\n\n        document.addEventListener('fullscreenerror', this._onFullscreenError);\n        document.addEventListener('mozfullscreenerror', this._onFullscreenError);\n        document.addEventListener('webkitfullscreenerror', this._onFullscreenError);\n        document.addEventListener('MSFullscreenError', this._onFullscreenError);\n    }\n\n    public componentWillUnmount(): void {\n        if (this.player.current) {\n            for (const mediaEvent of MediaEvents) {\n                this.player.current.removeEventListener(mediaEvent, this._triggerEvents);\n            }\n        }\n        document.removeEventListener('fullscreenchange', this._onFullScreenChanged);\n        document.removeEventListener('mozfullscreenchange', this._onFullScreenChanged);\n        document.removeEventListener('webkitfullscreenchange', this._onFullScreenChanged);\n        document.removeEventListener('MSFullscreenChange', this._onFullScreenChanged);\n\n        document.removeEventListener('fullscreenerror', this._onFullscreenError);\n        document.removeEventListener('mozfullscreenerror', this._onFullscreenError);\n        document.removeEventListener('webkitfullscreenerror', this._onFullscreenError);\n        document.removeEventListener('MSFullscreenError', this._onFullscreenError);\n    }\n\n    /**\n     * Renders closed captions.\n     * @returns Returns closed captions.\n     */\n    private readonly _renderClosedCaptions = (): JSX.Element => {\n        return (\n            <ClosedCaptions\n                ref={this.ClosedCaptions}\n                className={`${VideoPlayerNames.videoplayerContainer}__ccoverlay`}\n                showClosedCaptions={this.state.showClosedCaptions}\n                currentTime={this.state.playPosition.currentTime}\n                ccLanguage={this.state.closedCaptionLanguage}\n                ccURL={this.state.closedCaptionsURL}\n                errorCallback={this.playerHelper.onErrorCallback}\n                isVideoControlVisible={this.state.isControlPanelVisible || this.state.doControlsHaveFocus}\n                currentClosedCaptionsSettings={this.state.currentClosedCaptionsSettings}\n                tempClosedCaptionsSettings={this.state.tempClosedCaptionsSettings}\n                onClosedCaptionClick={this._onTriggerClicked}\n            />\n        );\n    };\n\n    /**\n     * Renders the play pause trigger.\n     * @param playAriaLabel - Aria label for the play button.\n     * @param maskLevelStyle - Mask level.\n     * @returns Returns play pause trigger.\n     */\n    private readonly _renderPlayPauseTrigger = (playAriaLabel: string, maskLevelStyle: React.CSSProperties): JSX.Element | undefined => {\n        const {\n            playerData: {\n                options: {\n                    autoplay: shouldAutoPlay,\n                    playPauseTrigger: isPlayPauseTrigger,\n                    controls: isControlsEnabled,\n                    shouldDisableAutoPlayOnMobile\n                }\n            }\n        } = this.props;\n\n        if (!MsDyn365.msdyn365Commerce.isBrowser && isPlayPauseTrigger && shouldAutoPlay && shouldDisableAutoPlayOnMobile) {\n            // Rendering an empty div because on server side isMobile will be false at server side.\n            return <div className={`${VideoPlayerNames.videoplayerContainer}__playpausetrigger__container`} />;\n        }\n\n        if (isPlayPauseTrigger && (!isControlsEnabled || this.state.isTriggerEnabled) && !this.state.isAgegateEnabled) {\n            return (\n                <PlayPauseTrigger\n                    className={`${VideoPlayerNames.videoplayerContainer}__playpausetrigger`}\n                    style={maskLevelStyle}\n                    onChange={this._onTriggerClicked}\n                    toggled={this.state.playing}\n                    aria-hidden={!this.state.mouseHovered}\n                    playAriaLabel={playAriaLabel}\n                    pauseAriaLabel={this.localizationHelper.getLocalizedValue('pauseAriaLabel')}\n                    onFocus={this._onTriggerFocus}\n                    onBlur={this._onTriggerBlur}\n                    telemetryContent={this.props.telemetryContent}\n                />\n            );\n        }\n\n        return undefined;\n    };\n\n    /**\n     * Renders the video controls.\n     * @param playAriaLabel - Arial label for the play button.\n     * @returns Returns the video control.\n     */\n    private readonly _renderVideoControls = (playAriaLabel: string): JSX.Element | undefined => {\n        const {\n            playerData: {\n                options: { controls: isControlsEnabled }\n            }\n        } = this.props;\n\n        if (isControlsEnabled && !this.state.isTriggerEnabled && !this.state.isAgegateEnabled) {\n            return (\n                <VideoControls\n                    ref={this.videoControl}\n                    className={`${VideoPlayerNames.videoplayerContainer}__controls ${\n                        this.state.isControlPanelVisible || this.state.doControlsHaveFocus ? 'show' : 'hide'\n                    }`}\n                    aria-hidden={!(this.state.isControlPanelVisible || this.state.doControlsHaveFocus)}\n                    onPlayClick={this._onTriggerClicked}\n                    playing={this.state.playing}\n                    closedCaptionMenu={this.closedCaptionMenu!}\n                    optionMenu={this.optionsMenu!}\n                    videoSeekSteps={PlayerConstants.defaultVideoSliderSteps}\n                    volumeSeekSteps={PlayerConstants.defaultVolumeSliderSteps}\n                    isMuted={this.state.isMuted}\n                    onMuteClick={this._setMuted}\n                    onVolumeChange={this._onVolumeChange}\n                    onProgressChange={this._onProgressChange}\n                    playPosition={this.state.playPosition}\n                    currentClosedCaptionLanguage={this.state.closedCaptionLanguage}\n                    currentVolume={this.state.currentVolume}\n                    isInFullScreen={this.state.isInFullScreen}\n                    toggleFullScreen={this._toggleFullScreen}\n                    handleControlsKeyDownHandler={this._handleControlsKeyDownEvent}\n                    isControlPanelVisible={this.state.isControlPanelVisible || this.state.doControlsHaveFocus}\n                    onFocus={this._onVideoControlsFocus}\n                    onBlur={this._onVideoControlsBlur}\n                    onMenuItemClick={this._onPlayerMenuItemClick}\n                    onMenuItemFocus={this._onPlayerMenuItemFocus}\n                    onMenuItemBlur={this._onPlayerMenuItemBlur}\n                    currentAudioTrack={this.state.currentAudioTrack}\n                    currentAudioTrackURL={this.state.currentAudioTrackURL}\n                    currentClosedCaptionsSetting={this.state.currentClosedCaptionsSettings}\n                    isMobileDevice={this.isMobileDevice}\n                    telemetryContent={this.props.telemetryContent}\n                    resources={{\n                        playAriaLabel,\n                        pauseAriaLabel: this.localizationHelper.getLocalizedValue('pauseAriaLabel'),\n                        muteAriaLabel: this.localizationHelper.getLocalizedValue('muteAriaLabel'),\n                        unMuteAriaLabel: this.localizationHelper.getLocalizedValue('unMuteAriaLabel'),\n                        fullScreenAriaLabel: this.localizationHelper.getLocalizedValue('fullScreenAriaLabel'),\n                        exitFullScreenAriaLabel: this.localizationHelper.getLocalizedValue('exitFullScreenAriaLabel'),\n                        seekBarLabel: this.localizationHelper.getLocalizedValue('seekBarLabel'),\n                        videoTimeDurationLabel: this.localizationHelper.getLocalizedValue('videoTimeDurationLabel'),\n                        closedCaptionLabel: this.localizationHelper.getLocalizedValue('closedCaptionLabel'),\n                        optionButtonLabel: this.localizationHelper.getLocalizedValue('optionAriaLabel'),\n                        sliderThumbLabel: this.localizationHelper.getLocalizedValue('sliderThumbLabel'),\n                        volumeThumbLabel: this.localizationHelper.getLocalizedValue('volumeThumbLabel')\n                    }}\n                />\n            );\n        }\n        return undefined;\n    };\n\n    /**\n     * Renders the age gate module.\n     * @returns Renders the age gate module.\n     */\n    private readonly _renderAgeGate = (): JSX.Element => {\n        return (\n            <AgeGate\n                ref={this.ageGateContainer}\n                onSubmitClick={this._validateAgeSubmitHandler}\n                aria-hidden={!this.state.isAgegateEnabled}\n                minmumAge={this.playerMetaData.minimumAge}\n            />\n        );\n    };\n\n    private _loadPlayer(): void {\n        if (this.player.current) {\n            this.player.current.volume = this.state.currentVolume / 100;\n\n            // Register the media events\n            for (const mediaEvent of MediaEvents) {\n                this.player.current.addEventListener(mediaEvent, this._triggerEvents);\n            }\n        }\n\n        if (this.props.playerData.options.lazyLoad || this.props.isEditor) {\n            this.videoUrl = this.playerHelper.getVideoFileToPlay().url;\n            if (this.player.current) {\n                this.player.current.src = this.videoUrl;\n                this.player.current.load();\n            }\n        }\n\n        this.isPlayerLoaded = true;\n\n        if (this.props.playerData.options.controls) {\n            this.closedCaptionHelper = new ClosedCaptionHelper(this.playerMetaData, this.playerHelper, this.localizationHelper);\n            this.closedCaptionMenu = this.closedCaptionHelper.getClosedCaptionMenu()!;\n            this.optionsMenu = this.playerHelper.getOptionMenu();\n            const ccFiles = this.playerMetaData.ccFiles!;\n            if (ccFiles !== undefined && ccFiles.length > 0) {\n                const autoCaptionsLang = this.props.playerData && this.props.playerData.options.autoCaptions;\n                let autoCaptionsLocale: string | null = null;\n                for (const ccFile of ccFiles) {\n                    if (!autoCaptionsLocale && autoCaptionsLang && ccFile.locale.includes(autoCaptionsLang)) {\n                        autoCaptionsLocale = ccFile.locale;\n                    }\n                }\n                this.selectedClosedCaptionsLocale = autoCaptionsLocale;\n                if (!isNullOrWhiteSpace(this.selectedClosedCaptionsLocale!)) {\n                    this.setState({\n                        closedCaptionLanguage: this.selectedClosedCaptionsLocale!,\n                        closedCaptionsURL: this.closedCaptionHelper.getClosedCaptionURLFromLocale(this.selectedClosedCaptionsLocale!),\n                        showClosedCaptions: true\n                    });\n                }\n            }\n        }\n    }\n\n    /**\n     * Validates the age submitted by the user.\n     */\n    private _validateAgeSubmitHandler(): void {\n        if (this.ageGateContainer.current!.getCalculatedAge()) {\n            this.videoUrl = this.playerHelper.getVideoFileToPlay().url;\n            this.setState({ isAgegateEnabled: false });\n        } else {\n            this.setState({ isAgegateEnabled: true });\n            this._displayErrorMessage({ title: 'you are not allowed to watch video' });\n        }\n    }\n\n    private _onVideoControlsFocus(): void {\n        // No need to call showControlBar, this will make sure it shows\n        this.setState({ doControlsHaveFocus: true });\n    }\n\n    private _onVideoControlsBlur(): void {\n        // Call showControlBar to give it the 6 second timeout\n        this._showControlBar(true);\n\n        this.setState({ doControlsHaveFocus: false });\n    }\n\n    private _onPlayerMenuItemFocus(notification: IPlayerMenuItemClickNotification): void {\n        if (notification.data && notification.data.indexOf(':') > 0) {\n            const dataSplit = notification.data.split(':');\n            const settingKey = dataSplit[0];\n            if (settingKey === videoClosedCaptionsConstant.presetKey) {\n                if (this.state.closedCaptionLanguage === 'off') {\n                    this.setState(\n                        {\n                            showClosedCaptions: true\n                        },\n                        () => {\n                            this.ClosedCaptions.current!.showSampleCaptions();\n                            this._setCCSettings(notification, false);\n                        }\n                    );\n                } else {\n                    this._setCCSettings(notification, false);\n                }\n            }\n        } else if (this.state.closedCaptionLanguage === 'off') {\n            this.setState({\n                showClosedCaptions: false\n            });\n        }\n    }\n\n    private _onPlayerMenuItemBlur(): void {\n        this._setCCSettings({\n            category: MenuCategories.ClosedCaptionSettings,\n            id: '',\n            data: 'current'\n        });\n    }\n\n    private _onPlayerMenuItemClick(notification: IPlayerMenuItemClickNotification): void {\n        switch (notification.category) {\n            case MenuCategories.ClosedCaption: {\n                this._setCC(notification.id);\n                break;\n            }\n\n            case MenuCategories.ClosedCaptionSettings: {\n                this._setCCSettings(notification);\n                break;\n            }\n\n            case MenuCategories.AudioTracks: {\n                this._setAudioTracks(notification);\n                break;\n            }\n            default:\n        }\n    }\n\n    /**\n     * Sets the close captioning language/locale.\n     * @param ccLanguageId - The desired new cc value.\n     */\n    private _setCC(ccLanguageId: string): void {\n        ccLanguageId = this.playerHelper.removeIdPrefix(ccLanguageId);\n        let selectedOption: ICCFile | null = null;\n\n        if (ccLanguageId && this.playerMetaData.ccFiles) {\n            for (const ccFile of this.playerMetaData.ccFiles) {\n                if (ccFile.locale === ccLanguageId && (!ccFile.ccType || ccFile.ccType === ClosedCaptionTypes.TTML)) {\n                    selectedOption = ccFile;\n                    break;\n                }\n            }\n        }\n\n        if (ccLanguageId === 'off') {\n            this.setState({\n                closedCaptionLanguage: 'off',\n                closedCaptionsURL: '',\n                showClosedCaptions: false\n            });\n        } else {\n            this.setState({\n                closedCaptionLanguage: selectedOption!.locale,\n                closedCaptionsURL: selectedOption!.url,\n                showClosedCaptions: true\n            });\n        }\n    }\n\n    /**\n     * Sets the close caption settings.\n     * @param notification - The desired new cc value.\n     * @param updatePreferences - Update Preferences.\n     */\n    private _setCCSettings(notification: IPlayerMenuItemClickNotification, updatePreferences?: boolean): void {\n        if (notification.data === 'reset') {\n            this.setState(\n                {\n                    currentClosedCaptionsSettings: closedCaptionsSettingDefaults\n                },\n                () => {\n                    if (this.ClosedCaptions.current !== null) {\n                        this.ClosedCaptions.current.applySettings();\n                        this.ClosedCaptions.current.resetCaptions();\n                        this.ClosedCaptions.current.updateCaptions(this.state.playPosition.currentTime);\n                    }\n                }\n            );\n        } else if (notification.data === 'current') {\n            this.setState({\n                tempClosedCaptionsSettings: undefined\n            });\n\n            if (this.state.closedCaptionLanguage === 'off') {\n                this.setState({\n                    showClosedCaptions: false\n                });\n            }\n        } else {\n            const dataSplit = notification.data!.split(':');\n            if (!dataSplit) {\n                return;\n            }\n            const settingKey = dataSplit[0];\n            const optionKey = dataSplit[1];\n            const currentSetting = this.closedCaptionHelper!.getUpdatedClosedCaptionSetting(\n                this.state.currentClosedCaptionsSettings,\n                settingKey,\n                optionKey\n            );\n            if (updatePreferences === undefined || updatePreferences) {\n                this.setState(\n                    {\n                        tempClosedCaptionsSettings: undefined,\n                        currentClosedCaptionsSettings: currentSetting\n                    },\n                    () => {\n                        if (this.ClosedCaptions.current) {\n                            this.ClosedCaptions.current.applySettings();\n                            this.ClosedCaptions.current.resetCaptions();\n                            this.ClosedCaptions.current.updateCaptions(this.state.playPosition.currentTime);\n                        }\n                    }\n                );\n            } else {\n                this.setState({\n                    tempClosedCaptionsSettings: currentSetting\n                });\n            }\n        }\n    }\n\n    private _setAudioTracks(notification: IPlayerMenuItemClickNotification): void {\n        const data = JSON.parse(notification.data!);\n        if (data.lang === 'default') {\n            this.setState(\n                {\n                    currentAudioTrack: 'default',\n                    currentAudioTrackURL: ''\n                },\n                () => {\n                    this.player.current!.volume = this.state.currentVolume / 100;\n                }\n            );\n        } else {\n            this.setState(\n                {\n                    currentAudioTrack: data.lang,\n                    currentAudioTrackURL: data.url\n                },\n                () => {\n                    this.audio.current!.currentTime = this.player.current!.currentTime;\n                    this.audio.current!.volume = this.state.currentVolume / 100;\n                    this.player.current!.volume = 0;\n                    if (!this.player.current!.paused) {\n                        this.audio.current!.load();\n                        for (const mediaEvent of MediaEvents) {\n                            this.audio.current!.addEventListener(mediaEvent, this._triggerAudioEvents);\n                        }\n                    }\n                }\n            );\n        }\n    }\n\n    private _triggerAudioEvents(event: Event): void {\n        switch (event.type.toLowerCase()) {\n            case 'error':\n                this._onAudioError();\n                break;\n            case 'waiting':\n                if (this.playerState === 'playing') {\n                    this.isPlayerManuallyPaused = true;\n                    this.pause();\n                }\n                break;\n\n            case 'loadeddata':\n                if (this.isPlayerManuallyPaused) {\n                    this.isPlayerManuallyPaused = false;\n                    this.play();\n                }\n                if (!this.player.current!.paused) {\n                    this.play();\n                }\n                break;\n\n            default:\n        }\n    }\n\n    private _triggerEvents(event: Event): void {\n        switch (event.type.toLowerCase()) {\n            case 'canplay':\n            case 'canplaythrough':\n                break;\n\n            case 'error':\n                this._onVideoError();\n                break;\n\n            case 'play':\n                break;\n\n            case 'pause':\n                this._updateState('paused');\n                if (this.props.playerData.options.playPauseTrigger) {\n                    this.setState({\n                        mouseHovered: true\n                    });\n                }\n                break;\n\n            case 'seeking':\n                if (this.playerState !== 'ended' && this.player.current!.seeking) {\n                    this.seekFrom = this.player.current!.currentTime;\n                    this._updateState('seeking');\n                }\n                break;\n\n            case 'seeked':\n                const currentPlayer = this.player.current;\n                const currentTime = currentPlayer!.currentTime;\n                if (this.playerState !== 'ended' && this.player.current!.seeking && this.seekFrom !== currentTime) {\n                    this.seekFrom = null;\n                }\n                this._updateState(currentPlayer!.paused ? 'paused' : 'playing');\n                break;\n\n            case 'waiting':\n                this._updateState('buffering');\n                break;\n\n            case 'loadedmetadata':\n                break;\n\n            case 'loadeddata':\n                this._onVideoLoadedData();\n                if (!this._shouldAutoPlay) {\n                    this._showControlBar(false);\n                }\n                break;\n\n            case 'timeupdate':\n                this._onTimeUpdate();\n                break;\n\n            case 'ended':\n                this._updateState('ended');\n                this._stop();\n                break;\n\n            case 'playing':\n                this._updateState('playing');\n                break;\n\n            case 'volumechange':\n                break;\n\n            default:\n        }\n    }\n\n    private _onAudioError(): void {\n        this.pause();\n        const errorMessage: IVideoErrorMessageData = { title: 'Error while playing audio Track. Switching back to default track' };\n        this._displayErrorMessage(errorMessage);\n        this._setAudioTracks({ category: 'audioTracks', data: '{ \"lang\": \"default\", \"url\": \"\"}', id: '' });\n        setTimeout(() => {\n            this.setState(\n                {\n                    showErrorMessage: false\n                },\n                () => {\n                    this.play();\n                }\n            );\n        }, 2000);\n    }\n\n    private _onVideoError(): void {\n        this._updateState('error');\n        const error: IVideoErrorData | null = this._getError();\n        let errorMessage = '';\n        if (error?.errorCode) {\n            switch (error.errorCode) {\n                case VideoErrorCodes.MediaErrorAborted:\n                    errorMessage = 'video playback was aborted';\n                    break;\n                case VideoErrorCodes.MediaErrorNetwork:\n                    errorMessage = 'video failed to download';\n                    break;\n                case VideoErrorCodes.MediaErrorDecode:\n                    errorMessage = 'video is not readable';\n                    break;\n                case VideoErrorCodes.MediaErrorSourceNotSupported:\n                    errorMessage = 'video format is not supported';\n                    break;\n                default:\n                    errorMessage = 'unknown error occurred';\n            }\n\n            this._stopMedia(errorMessage);\n        } else {\n            this._stopMedia();\n        }\n    }\n\n    private _stopMedia(msgToDisplay?: string): void {\n        if (msgToDisplay) {\n            this._displayErrorMessage({ title: msgToDisplay });\n            this._updateState('stopped');\n        }\n    }\n\n    /**\n     * Create an error message overlay.\n     * @param errorMessage - Error message content.\n     */\n    private _displayErrorMessage(errorMessage: IVideoErrorMessageData): void {\n        this.setState({ videoErrorMessage: { title: errorMessage.title, message: errorMessage.message } });\n        this.setState({ showErrorMessage: true });\n    }\n\n    /**\n     * Gets the video error code of the current error.\n     * @returns : Returns the video error code.\n     */\n    private _getError(): IVideoErrorData | null {\n        let contentErrorCode: VideoErrorCodes;\n        if (this.player.current!.error) {\n            // Video playback failed - show a message saying why\n            switch (this.player.current!.error.code) {\n                case this.player.current!.error.MEDIA_ERR_ABORTED:\n                    contentErrorCode = VideoErrorCodes.MediaErrorAborted;\n                    break;\n                case this.player.current!.error.MEDIA_ERR_NETWORK:\n                    contentErrorCode = VideoErrorCodes.MediaErrorNetwork;\n                    break;\n                case this.player.current!.error.MEDIA_ERR_DECODE:\n                    contentErrorCode = VideoErrorCodes.MediaErrorDecode;\n                    break;\n                case this.player.current!.error.MEDIA_ERR_SRC_NOT_SUPPORTED:\n                    contentErrorCode = VideoErrorCodes.MediaErrorSourceNotSupported;\n                    break;\n                default:\n                    contentErrorCode = VideoErrorCodes.MediaErrorUnknown;\n            }\n            return { errorCode: contentErrorCode };\n        }\n        return null;\n    }\n\n    private _handleControlsKeyDownEvent(e: React.KeyboardEvent): void {\n        const keyBrdEvent = (e as unknown) as KeyboardEvent;\n        const keycode = keyBrdEvent.keyCode;\n        this._showControlBar(true);\n\n        // Const castTarget = e.target as HTMLElement;\n\n        switch (keycode) {\n            case KeyCodes.Home:\n                e.stopPropagation();\n                e.preventDefault();\n                this.player.current!.currentTime = 0;\n                if (this.audio.current) {\n                    this.audio.current.currentTime = 0;\n                }\n                break;\n            case KeyCodes.End:\n                e.stopPropagation();\n                e.preventDefault();\n                this.player.current!.currentTime = this.state.playPosition.endTime;\n                if (this.audio.current) {\n                    this.audio.current.currentTime = this.state.playPosition.endTime;\n                }\n                break;\n            case KeyCodes.ArrowLeft:\n            case KeyCodes.ArrowRight:\n                e.stopPropagation();\n                e.preventDefault();\n                let jumpToTime =\n                    keycode === KeyCodes.ArrowLeft\n                        ? this.state.playPosition.currentTime - PlayerConstants.defaultVideoSliderSteps\n                        : this.state.playPosition.currentTime + PlayerConstants.defaultVideoSliderSteps;\n                jumpToTime = Math.min(Math.max(this.state.playPosition.startTime, jumpToTime), this.state.playPosition.endTime);\n                this.player.current!.currentTime = jumpToTime;\n                if (this.audio.current) {\n                    this.audio.current.currentTime = jumpToTime;\n                }\n                break;\n            case KeyCodes.ArrowUp:\n            case KeyCodes.ArrowDown:\n                e.stopPropagation();\n                e.preventDefault();\n                this.videoControl.current!.showVolumeControl(true).call(this);\n                const volume =\n                    keycode === KeyCodes.ArrowDown\n                        ? Math.max((this.state.currentVolume - PlayerConstants.defaultVolumeSliderSteps) / 100, 0)\n                        : Math.min((this.state.currentVolume + PlayerConstants.defaultVolumeSliderSteps) / 100, 1);\n                this.setState({ currentVolume: Math.round(volume * 100) });\n                if (this.audio.current) {\n                    this.audio.current.volume = volume;\n                } else {\n                    this.player.current!.volume = volume;\n                }\n                if (volume === 0) {\n                    this.setState({ isMuted: true });\n                } else {\n                    this.setState({ isMuted: false });\n                }\n                break;\n            default:\n        }\n    }\n\n    private _onPlay(): void {\n        this.setState({ playing: true });\n    }\n\n    private _onPause(): void {\n        this.setState({ playing: false });\n    }\n\n    private _onVolumeChange(notification: ISliderChangeNotification): void {\n        this.setState({ currentVolume: notification.firstThumbValue });\n        if (this.audio.current) {\n            this.audio.current.volume = notification.firstThumbValue / 100;\n        } else {\n            this.player.current!.volume = notification.firstThumbValue / 100;\n        }\n\n        if (notification.firstThumbValue === 0) {\n            this.setState({ isMuted: true });\n        } else if (this.state.isMuted && notification.firstThumbValue > 0) {\n            this.setState({ isMuted: false });\n        }\n    }\n\n    private _setMuted(): void {\n        if (this.state.isMuted) {\n            const newVolume = this.state.previousVolume === 0 ? PlayerConstants.defaultVolume * 100 : this.state.previousVolume;\n\n            if (this.audio.current) {\n                this.audio.current.volume = newVolume / 100;\n            } else {\n                this.player.current!.volume = newVolume / 100;\n            }\n            this.setState({ isMuted: false, currentVolume: newVolume });\n            this._updateScreenReaderElement(this.localizationHelper.getLocalizedValue('unMuteAriaLabel'));\n            onTelemetryClick(this.props.telemetryContent!, this.payLoad, LocalizationConstants.unMuteAriaLabel).call(this);\n        } else {\n            this.setState({ isMuted: true, previousVolume: this.player.current!.volume * 100, currentVolume: 0 });\n            this._updateScreenReaderElement(this.localizationHelper.getLocalizedValue('muteAriaLabel'));\n            onTelemetryClick(this.props.telemetryContent!, this.payLoad, LocalizationConstants.muteAriaLabel).call(this);\n        }\n    }\n\n    private _onPlayerKeyDown(e: React.KeyboardEvent): void {\n        const keyBrdEvent = (e as unknown) as KeyboardEvent;\n        const keycode = keyBrdEvent.keyCode;\n\n        if (keycode === KeyCodes.Tab) {\n            this._showControlsBasedOnState();\n        }\n    }\n\n    private _onMouseEvent(event: React.MouseEvent<HTMLDivElement>): void {\n        if (this.props.playerData.options.controls) {\n            this._showControlBar();\n        }\n        if (!this.state.isTriggerEnabled && this.state.playing) {\n            this.setState({ mouseHovered: event.type === 'mouseenter' });\n        }\n    }\n\n    private _showControlBar(autoHide: boolean = true): void {\n        if (!this.state.isTriggerEnabled && !this.state.isAgegateEnabled) {\n            if (!this.state.isControlPanelVisible) {\n                this.setState({ isControlPanelVisible: true });\n            }\n            if (this.controlPanelTimer) {\n                window && window.clearTimeout(this.controlPanelTimer);\n                this.controlPanelTimer = 0;\n            }\n            if (autoHide) {\n                this.controlPanelTimer =\n                    window &&\n                    window.setTimeout(() => {\n                        this._hideControlBar();\n                    }, PlayerConstants.defaultControlPanelTimeout);\n            }\n        }\n    }\n\n    private _hideControlBar(): void {\n        window && window.clearTimeout(this.controlPanelTimer);\n        this.controlPanelTimer = 0;\n        this.setState({ isControlPanelVisible: false });\n    }\n\n    private _onFullScreenChanged(): void {\n        this.state.isInFullScreen ? this._onFullscreenExit() : this._onFullscreenEnter();\n    }\n\n    /**\n     * Event handler for fullscreen enter.\n     */\n    private _onFullscreenEnter(): void {\n        this.setState({\n            isInFullScreen: true\n        });\n    }\n\n    /**\n     * Event handler for fullscreen exit.\n     */\n    private _onFullscreenExit(): void {\n        this.setState({\n            isInFullScreen: false\n        });\n    }\n\n    private _toggleFullScreen(): void {\n        this.state.isInFullScreen ? this._exitFullScreen() : this._enterFullScreen();\n    }\n\n    private _onFullscreenError(): void {\n        this.setState({\n            isInFullScreen: false\n        });\n    }\n\n    private _enterFullScreen(): void {\n        if (!Player._isNativeFullscreenEnabled()) {\n            return;\n        }\n\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        const fullscreenElement = this.playerContainer.current! as any;\n        const elementInFullScreen = Player._getElementInFullScreen();\n\n        // We go to fullscreen only when there is no other element in fullscreen and browser supports fullscreen\n        if (fullscreenElement && !elementInFullScreen) {\n            const enterFullScreen =\n                fullscreenElement.requestFullscreen ||\n                fullscreenElement.msRequestFullscreen ||\n                fullscreenElement.mozRequestFullScreen ||\n                fullscreenElement.webkitRequestFullscreen ||\n                fullscreenElement.webkitEnterFullScreen;\n\n            enterFullScreen.call(fullscreenElement);\n            this._updateScreenReaderElement(this.localizationHelper.getLocalizedValue('fullScreenLabel'));\n            onTelemetryClick(this.props.telemetryContent!, this.payLoad, LocalizationConstants.fullScreenAriaLabel).call(this);\n        }\n    }\n\n    private _exitFullScreen(): void {\n        if (!Player._isNativeFullscreenEnabled()) {\n            return;\n        }\n\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        const fullscreenElement = this.playerContainer.current! as any;\n        const elementInFullScreen = Player._getElementInFullScreen();\n\n        // We only call cancel if we are in fullscreen. If another element went fullscreen that took the player with it then\n        // we shouldn't call cancel fullscreen\n        if (fullscreenElement && fullscreenElement === elementInFullScreen) {\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            const doc = document as any;\n            const cancelFullScreen = doc.cancelFullScreen || doc.msExitFullscreen || doc.mozCancelFullScreen || doc.webkitCancelFullScreen;\n\n            cancelFullScreen.call(doc);\n            this._updateScreenReaderElement(this.localizationHelper.getLocalizedValue('exitFullScreenLabel'));\n            onTelemetryClick(this.props.telemetryContent!, this.payLoad, LocalizationConstants.exitFullScreenAriaLabel).call(this);\n        }\n    }\n\n    private _onVideoLoadedData(): void {\n        this._updateState('ready');\n        if (this.props.playerData.options.controls) {\n            const position = this._getPlayPosition();\n            this.setState({ playPosition: position });\n        }\n    }\n\n    private _onTimeUpdate(): void {\n        if (this.props.playerData.options.controls) {\n            const position = this._getPlayPosition();\n\n            // EndTime changes after playing video for certain time. Keeping this constant.\n            position.endTime = this.state.playPosition.endTime;\n            this.setState({ playPosition: position });\n            if (this.state.playing) {\n                if (this.playerState === 'buffering') {\n                    this._updateState('playing');\n                }\n            }\n        }\n    }\n\n    private _getBufferedDuration(): number {\n        let buffered = 0;\n        if (this.player.current!.buffered && this.player.current!.buffered.length) {\n            buffered = this.player.current!.buffered.end(this.player.current!.buffered.length - 1);\n        }\n        return buffered;\n    }\n\n    private _getPlayPosition(): IPlayPosition {\n        const bufferedDuration = this._getBufferedDuration();\n        return {\n            currentTime: this.player.current!.currentTime,\n            startTime: 0,\n            endTime: this.player.current!.duration,\n            bufferedDuration\n        };\n    }\n\n    private _onProgressChange(notification: ISliderChangeNotification): void {\n        let time = notification.firstThumbValue;\n        const position = this._getPlayPosition();\n        time = Math.max(position.startTime, Math.min(time, position.endTime));\n\n        if (Math.abs(time - position.currentTime) >= PlayerConstants.defaultPositionUpdateThreshold) {\n            this.player.current!.currentTime = time;\n            if (this.audio.current) {\n                this.audio.current.currentTime = time;\n            }\n        }\n    }\n\n    private _onTriggerClicked(): void {\n        const currentPlayer = this.player.current;\n        if (!this.isPlayerLoaded) {\n            this._loadPlayer();\n            this.player.current!.autoplay = true;\n        } else if (currentPlayer!.paused) {\n            this.play();\n            this._updateScreenReaderElement(this.localizationHelper.getLocalizedValue('playingAriaLabel'));\n            onTelemetryClick(this.props.telemetryContent!, this.payLoad, LocalizationConstants.playAriaLabel).call(this);\n            if (this.videoControl.current) {\n                this.videoControl.current.setFocusOnPause();\n            }\n        } else {\n            this.pause();\n            this._updateScreenReaderElement(this.localizationHelper.getLocalizedValue('pausedAriaLabel'));\n            onTelemetryClick(this.props.telemetryContent!, this.payLoad, LocalizationConstants.pauseAriaLabel).call(this);\n            if (this.videoControl.current) {\n                this.videoControl.current.setFocusOnPlay();\n            }\n        }\n\n        if (this.state.isTriggerEnabled) {\n            this.setState({ isTriggerEnabled: false }, () => {\n                setTimeout(() => {\n                    if (this.videoControl.current) {\n                        this.videoControl.current.setFocusOnPause();\n                    }\n                }, 500);\n            });\n            onTelemetryClick(this.props.telemetryContent!, this.payLoad, LocalizationConstants.pauseAriaLabel).call(this);\n            if (this.props.playerData.options.playFullScreen) {\n                this._enterFullScreen();\n            }\n        }\n    }\n\n    private _stop(): void {\n        const videoStartingTime: number = 0.1;\n        if (isSafari()) {\n            // Safari browser has issues with showing the poster frame of the video when ended. So setting the same to 0.1 seconds.\n            this._seek(videoStartingTime);\n        } else {\n            this._seek(0);\n        }\n\n        if (this.props.playerData.options.controls) {\n            this.pause();\n            const playPosition = this._getPlayPosition();\n            playPosition.endTime = this.state.playPosition.endTime;\n            this.setState({ playPosition });\n            if (this.audio.current) {\n                this.audio.current.pause();\n            }\n        }\n    }\n\n    private _seek(time: number): void {\n        const position = this._getPlayPosition();\n        time = Math.max(position.startTime, Math.min(time, position.endTime));\n\n        if (Math.abs(time - position.currentTime) >= PlayerConstants.defaultPositionUpdateThreshold) {\n            this.seekFrom = position.currentTime;\n            this.player.current!.currentTime = time;\n            if (this.audio.current) {\n                this.audio.current.currentTime = time;\n            }\n        }\n    }\n\n    /**\n     * Returns the mask level style.\n     * @returns Returns the mask level style.\n     */\n    private _getMaskLevelStyle(): string {\n        let result: string = '';\n        if (this.state.isTriggerEnabled) {\n            const maskLevel = this.props.playerData.options.maskLevel || PlayerConstants.defaultMaskLevel;\n            result = format('rgba(0,0,0,{0})', Number(maskLevel) / 100);\n        }\n        return result;\n    }\n\n    /**\n     * Updates the current player state.\n     * @param newState - Player state.\n     */\n    private _updateState(newState: PlayerStates): void {\n        if (!newState || newState === this.playerState) {\n            return;\n        }\n\n        this.playerState = newState;\n\n        this._showControlsBasedOnState();\n        this._showSpinnerBasedOnState();\n    }\n\n    /**\n     * Shows or hides the spinner based on player state.\n     */\n    private _showSpinnerBasedOnState(): void {\n        switch (this.playerState) {\n            case 'ready':\n            case 'playing':\n            case 'paused':\n            case 'ended':\n            case 'stopped':\n            case 'error':\n                this._hideSpinner();\n                break;\n            default:\n                this._showSpinner();\n        }\n    }\n\n    /**\n     * Shows or hides the player controls based on player state.\n     */\n    private _showControlsBasedOnState(): void {\n        switch (this.playerState) {\n            case 'error':\n            case 'loading':\n            case 'init':\n                this._hideControlBar();\n                break;\n            case 'ended':\n                this._showControlBar(false);\n                break;\n            case 'ready':\n            case 'paused':\n            case 'stopped':\n                this._showControlBar(false);\n                break;\n            default:\n                this._showControlBar(true);\n        }\n    }\n\n    private _hideSpinner(): void {\n        this.setState({ showSpinner: false });\n    }\n\n    private _showSpinner(): void {\n        this.setState({ showSpinner: true });\n    }\n\n    /**\n     * Play Trigger focus event.\n     */\n    private _onTriggerFocus(): void {\n        this.setState({ mouseHovered: true });\n    }\n\n    /**\n     * Play Trigger Blur event.\n     */\n    private _onTriggerBlur(): void {\n        if (!this.state.isTriggerEnabled && this.state.playing) {\n            this.setState({ mouseHovered: false });\n        }\n    }\n\n    /**\n     * Updates the screen reader element.\n     * @param text - Update the screen reader element with the pased text.\n     */\n    private _updateScreenReaderElement(text: string): void {\n        this.setState({\n            screenReaderText: text\n        });\n    }\n\n    /**\n     * Avoid opening context menu on righ click.\n     * @param e - Mouse Event.\n     */\n    private _onContextMenuClicked(e: React.MouseEvent): void {\n        e.preventDefault();\n    }\n\n    /**\n     * Check for mobile devices.\n     * @returns - Return true or false.\n     */\n    private _isMobile(): boolean {\n        if (MsDyn365.msdyn365Commerce.isBrowser) {\n            const userAgent = window.navigator.userAgent;\n            const isIphone = !!userAgent.match(/iphone/i);\n            const isSilk = !!userAgent.match(/silk/i);\n            const isWindowsPhone = !!userAgent.match(/windows phone/i);\n            const isAndroid = !isWindowsPhone && (isSilk || !!userAgent.match(/android/i));\n            return isIphone || isWindowsPhone || isAndroid;\n        }\n        return false;\n    }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nimport { IActionToggleProps } from './action-toggle.props';\n\n/**\n * ActionToggle - This component is toggle button which switches between states\n * and for accessibility reasons are 2 different buttons.\n */\nexport default class ActionToggle extends React.PureComponent<IActionToggleProps> {\n    private readonly _divRef: React.RefObject<HTMLDivElement> = React.createRef<HTMLDivElement>();\n\n    private _focusElement: HTMLElement | null = null;\n\n    public constructor(props: Readonly<IActionToggleProps>) {\n        super(props);\n        this._onClick = this._onClick.bind(this);\n    }\n\n    public getSnapshotBeforeUpdate(): null {\n        this._focusElement = null;\n        if (this._divRef.current?.contains(document.activeElement)) {\n            this._focusElement = document.activeElement as HTMLElement;\n        }\n        return null;\n    }\n\n    public render(): JSX.Element | null {\n        const { className, children, toggled, onChange, ...props } = this.props;\n        const classes = `action-toggle${className ? ' ' : ''}${className || ''}`;\n        return React.Children.count(children) !== 2 ? null : (\n            <div className={classes} {...props} ref={this._divRef}>\n                {React.Children.map(children, (child: React.ReactNode, index: number) => {\n                    const hidden = (!index && !!toggled) || (!!index && !toggled);\n\n                    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                    return React.cloneElement(child as any, { 'aria-hidden': hidden, onClick: this._onClick });\n                })}\n            </div>\n        );\n    }\n\n    private _onClick(event: React.KeyboardEvent): void {\n        event.stopPropagation();\n        if (this.props.onChange) {\n            this.props.onChange({ id: this.props.id, actionToggle: this, toggled: !!this.props.toggled, event });\n        }\n        if (this._divRef.current && this._focusElement) {\n            const focusTarget = this._divRef.current.children[this.props.toggled ? 1 : 0] as HTMLElement;\n            if (focusTarget !== document.activeElement) {\n                focusTarget.focus();\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 * as React from 'react';\n\nimport { PlayerConstants, VideoPlayerNames } from '../data';\nimport { IAgeGateProps } from './age-gate.props';\n\n/**\n *\n * AgeGate React component for video player.\n *\n */\nexport interface IDropdownState {\n    monthValue: string;\n    dayValue: string;\n    yearValue: string;\n}\n\n/**\n * AgeGate class.\n */\nexport default class AgeGate extends React.PureComponent<IAgeGateProps, IDropdownState> {\n    public static defaultProps: Partial<IAgeGateProps> = {\n        minmumAge: 18\n    };\n\n    private readonly ageGateDiv: React.RefObject<HTMLDivElement> = React.createRef<HTMLDivElement>();\n\n    public constructor(props: IAgeGateProps) {\n        super(props);\n        this._filterDateMonthYear = this._filterDateMonthYear.bind(this);\n        this.state = {\n            monthValue: 'Month',\n            dayValue: 'Day',\n            yearValue: 'Year'\n        };\n    }\n\n    public render(): JSX.Element {\n        const enabled =\n            PlayerConstants.regxForAgeGateInputValidation.test(this.state.dayValue) &&\n            PlayerConstants.regxForAgeGateInputValidation.test(this.state.monthValue) &&\n            PlayerConstants.regxForAgeGateInputValidation.test(this.state.yearValue);\n        return (\n            <div\n                className={`${VideoPlayerNames.videoplayerContainer}__agegate__container`}\n                ref={this.ageGateDiv}\n                aria-hidden={this.props['aria-hidden']}\n            >\n                <div>\n                    <div>\n                        <h3> Enter your date of birth </h3>\n                        <fieldset>\n                            <div>{this.renderSelectMonth()}</div>\n                            <div>{this.renderSelectDay()}</div>\n                            <div>{this.renderSelectYear()}</div>\n                            <button disabled={!enabled} onClick={this.props.onSubmitClick}>\n                                Submit\n                            </button>\n                        </fieldset>\n                    </div>\n                </div>\n            </div>\n        );\n    }\n\n    public getCalculatedAge = () => {\n        const day: number = Number(this.state.dayValue);\n        const month: number = Number(this.state.monthValue);\n        const year: number = Number(this.state.yearValue);\n        const today: Date = new Date();\n        let age = today.getFullYear() - year;\n        const birthdayMonthHasNotHappenedYet: boolean = today.getMonth() + 1 < month;\n        const birthdayDayHasNotHappenedYet: boolean = today.getMonth() + 1 === month && today.getDate() < day;\n        if (birthdayMonthHasNotHappenedYet || birthdayDayHasNotHappenedYet) {\n            // User has not reached their birth month and/or birth day-of-month in the current year\n            age--;\n        }\n        const minimmumage = Number(this.props.minmumAge);\n        if (age >= minimmumage) {\n            return true;\n        }\n        return false;\n    };\n\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    private _filterDateMonthYear(event: any): void {\n        switch (event.target.id) {\n            case 'selectDay': {\n                this.setState({ dayValue: event.target.value });\n                break;\n            }\n            case 'selectMonth': {\n                this.setState({ monthValue: event.target.value });\n                break;\n            }\n            case 'selectYear': {\n                this.setState({ yearValue: event.target.value });\n                break;\n            }\n            default:\n                break;\n        }\n    }\n\n    private readonly renderSelectMonth = (): JSX.Element => {\n        const maxOffset = 12;\n        const allMonth = [];\n        for (let month = 1; month <= maxOffset; month++) {\n            allMonth.push(month);\n        }\n        const monthList = allMonth.map(month => {\n            return (\n                <option role='menuitem' key={month} value={month}>\n                    {month.toFixed(0)}\n                </option>\n            );\n        });\n        return (\n            <select\n                aria-expanded='false'\n                className={`${VideoPlayerNames.videoplayerContainer}__agegate__select`}\n                role='menu'\n                onChange={this._filterDateMonthYear}\n                value={this.state.monthValue}\n                aria-label='Enter your month of birth'\n                name='selectMonth'\n                id='selectMonth'\n            >\n                <option role='menuitem'>Month</option>\n                {monthList}\n            </select>\n        );\n    };\n\n    private readonly renderSelectDay = (): JSX.Element => {\n        const maxOffset = 31;\n        const allDay = [];\n        for (let day = 1; day <= maxOffset; day++) {\n            allDay.push(day);\n        }\n        const dayList = allDay.map(day => {\n            return (\n                <option role='menuitem' key={day}>\n                    {day.toFixed(0)}\n                </option>\n            );\n        });\n        return (\n            <select\n                aria-expanded='false'\n                className={`${VideoPlayerNames.videoplayerContainer}__agegate__select`}\n                role='menu'\n                onChange={this._filterDateMonthYear}\n                value={this.state.dayValue}\n                aria-label='Enter your day of birth'\n                name='selectDay'\n                id='selectDay'\n            >\n                <option role='menuitem'>Day</option>\n                {dayList}\n            </select>\n        );\n    };\n\n    private readonly renderSelectYear = (): JSX.Element => {\n        const maxOffset = 100;\n        const thisYear = new Date().getFullYear();\n        const allYear = [];\n        for (let year = 1; year <= maxOffset; year++) {\n            allYear.push(thisYear - year);\n        }\n        const yearList = allYear.map(year => {\n            return (\n                <option role='menuitem' key={year}>\n                    {year.toFixed(0)}\n                </option>\n            );\n        });\n        return (\n            <select\n                aria-expanded='false'\n                className={`${VideoPlayerNames.videoplayerContainer}__agegate__select`}\n                role='menu'\n                onChange={this._filterDateMonthYear}\n                value={this.state.yearValue}\n                aria-label='Enter your year of birth'\n                name='selectYear'\n                id='selectYear'\n            >\n                <option role='menuitem'>Year</option>\n                {yearList}\n            </select>\n        );\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 * Player constants.\n */\nexport const PlayerConstants = {\n    defaultVolume: 0.8,\n    defaultVolumeSliderSteps: 5,\n    defaultVideoSliderSteps: 1,\n    defaultControlPanelTimeout: 6500,\n    defaultPositionUpdateThreshold: 0.1,\n    defaultMaskLevel: 40,\n    defaultPlayGlyphIcon: 'fas fa-play',\n    defaultPauseGlyphIcon: 'fas fa-pause',\n    defaultMuteGlyphIcon: 'fas fa-volume-up',\n    defaultUnMuteGlyphIcon: 'fas fa-volume-off',\n    defaultFullScreenGlyphIcon: 'fas fa-expand',\n    defaultExitFullScreenGlyphIcon: 'fas fa-compress',\n    closedCaptionGlyphClassName: 'fas fa-closed-captioning',\n    thumbnailFullWidth: 1110,\n    thumbnailFullHeight: 624,\n    ccLangPrefKey: 'vidccpref',\n    seekBarLabel: 'Seek bar',\n    regxForAgeGateInputValidation: /^[\\d\\b]+$/,\n    mutePrefKey: 'vidmut',\n    volumePrefKey: 'vidvol'\n};\n\n/**\n * @description - names used for video and player html elements.\n */\nexport const VideoPlayerNames = {\n    videoplayerContainer: 'msc-videoplayer',\n    mediaType: 'video/mp4'\n};\n\n/**\n * Menu Categories.\n */\nexport const MenuCategories = {\n    AudioTracks: 'audio-tracks',\n    ClosedCaption: 'close-caption',\n    ClosedCaptionSettings: 'cc-settings',\n    PlaybackSpeed: 'playback-speed',\n    Quality: 'quality',\n    Share: 'share',\n    Download: 'download',\n    Options: 'options'\n};\n\n/**\n * Media Events.\n */\nexport const MediaEvents = [\n    'abort',\n    'canplay',\n    'canplaythrough',\n    'emptied',\n    'ended',\n    'error',\n    'loadeddata',\n    'loadedmetadata',\n    'loadstart',\n    'pause',\n    'play',\n    'playing',\n    'progress',\n    'ratechange',\n    'readystatechange',\n    'seeked',\n    'seeking',\n    'stalled',\n    'suspend',\n    'timeupdate',\n    'volumechange',\n    'waiting'\n];\n\n/**\n * Play Positon Interface.\n */\nexport interface IPlayPosition {\n    /**\n     * @name startTime\n     * @type {number}\n     * Start position of the buffer, in seconds.\n     * For VoD this is usually 0.\n     * For live stream this is a position of beginning of DVR window, relative to the stream start time.\n     */\n    startTime: number;\n\n    /**\n     * @name endTime\n     * @type {number}\n     * @description End position of the buffer, in seconds.\n     * For VoD this is normally a video duration.\n     * For live stream this is normally a \"live\" position, relative to the stream start time.\n     */\n    endTime: number;\n\n    /**\n     * @name currentTime\n     * @type {number}\n     * @description Position currently on the screen, relative to the stream start time, in seconds.\n     */\n    currentTime: number;\n\n    /**\n     * @name bufferedDuration\n     * @type {number}\n     * @description Buffered duration of the video.\n     */\n    bufferedDuration: number;\n}\n\n/**\n * Current Closed Captions Settings Interface.\n */\nexport interface ICurrentClosedCaptionsSettings {\n    preset: string;\n    text_font: string;\n    text_color: string;\n    text_opacity: string;\n    text_size: string;\n    text_edge_style: string;\n    text_background_color: string;\n    text_background_opacity: string;\n    window_color: string;\n    window_opacity: string;\n}\n\n/**\n * @name - PlayerEvents\n * @description - Player states.\n * @type {IPlayerState}\n */\nexport type PlayerStates =\n    | 'init'\n    | 'playerLoaded'\n    | 'loading'\n    | 'ready'\n    | 'playing'\n    | 'paused'\n    | 'buffering'\n    | 'seeking'\n    | 'ended'\n    | 'error'\n    | 'stopped';\n\n/**\n * @enum VideoErrorCodes\n * @description - Enum for supported media quality.\n */\nexport enum VideoErrorCodes {\n    // Buffering.\n    BufferingFirstByteTimeout = 2000,\n\n    // Media element errors.\n    MediaErrorAborted = 2100,\n    MediaErrorNetwork = 2101,\n    MediaErrorDecode = 2102,\n    MediaErrorSourceNotSupported = 2103,\n    MediaErrorUnknown = 2104,\n\n    // Media selection.\n    MediaSelectionNoMedia = 2200\n}\n\n/**\n * @interface IVideoErrorData\n * @description - The data contract interface used for storing references to video error data.\n */\nexport interface IVideoErrorData {\n    errorCode: VideoErrorCodes;\n    message?: string;\n}\n\n/**\n * @interface IVideoErrorMessageData\n * @description - The data contract interface used for supplying content to an error message.\n */\nexport interface IVideoErrorMessageData {\n    title?: string;\n    message?: string;\n}\n\n/**\n * @interface - IPlayerMenuItem\n * The IPlayerMenuItem interface that defines the data structure used to store menu item information.\n */\nexport interface IPlayerMenuItem {\n    id: string;\n    label: string;\n    className?: string;\n    language?: string;\n    data?: string;\n    image?: string;\n    itemCount?: number;\n    itemIndex?: number;\n    imageAlt?: string;\n    glyph?: string;\n    selected?: boolean;\n    selectable?: boolean;\n    hasMouseHoverEvents?: boolean;\n    persistOnClick?: boolean;\n    isBackButton?: boolean;\n    ariaLabel?: string;\n    subMenu?: IPlayerMenu;\n    hasFocus?: boolean;\n}\n\n/**\n * @interface - IPlayerMenu\n * The IPlayerMenu interface that defines the data structure used to store menu information.\n */\nexport interface IPlayerMenu {\n    id: string;\n    category: string;\n    items: IPlayerMenuItem[];\n    label?: string;\n    glyph?: string;\n    cssClass?: string;\n    hideBackButton?: boolean;\n}\n\n/**\n * Player Menu Item Click Notification Interface.\n */\nexport interface IPlayerMenuItemClickNotification {\n    category: string;\n    id: string;\n    data?: string;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IAudioTrack } from './player-interface';\n\n/**\n * @interface ICCFile\n * @description - The data contract interface used for storing references to closed caption files.\n */\nexport interface ICCFile {\n    url: string;\n    locale: string;\n    ccType?: ClosedCaptionTypes;\n}\n\n/**\n * @interface IDownloadableFile\n * @description - The data contract interface used for storing references downloadable media files.\n */\nexport interface IDownloadableFile {\n    mediaType: DownloadableMediaTypes;\n    url: string;\n    locale: string;\n}\n\n/**\n * @enum MediaTypes\n * @description - Enum for supported media types.\n */\nexport enum MediaTypes {\n    MP4 = 'MP4',\n    DASH = 'DASH',\n    SMOOTH = 'SMOOTH',\n    HLS = 'HLS'\n}\n\n/**\n * @enum MediaQuality\n * @description - Enum for supported media quality.\n */\nexport enum MediaQuality {\n    HD = 'HD',\n    HDX = 'HDX',\n    HQ = 'HQ',\n    SD = 'SD',\n    LO = 'LO'\n}\n\n/**\n * @enum ClosedCaptionTypes\n * @description - Enum for supported closed caption types.\n */\nexport enum ClosedCaptionTypes {\n    VTT = 'VTT',\n    TTML = 'TTML'\n}\n\n/**\n * @enum DownloadableMediaTypes\n * @description - Enum for supported downloadable media types.\n */\nexport enum DownloadableMediaTypes {\n    transcript = 'transcript',\n    audio = 'audio',\n    video = 'video',\n    videoWithCC = 'videoWithCC'\n}\n\n/**\n * Cms datatype of video binary reference.\n */\nexport interface IVideoBinaryReference {\n    /// <summary>Gets the video binary file format.</summary>\n    format: string;\n\n    /// <summary>Gets the video bit rate.</summary>\n    frameRate: number;\n\n    /// <summary>Gets the URL used on the clients to play the video.</summary>\n    ClientHref: string;\n}\n\n/**\n * Cms datatype of video transcript binary reference.\n */\nexport interface IVideoTranscriptBinaryReference {\n    /// <summary>Gets the locale.</summary>\n    locale: string;\n\n    /// <summary>Gets the URL used on the clients to play the video.</summary>\n    clientHref: string;\n}\n\n/**\n * Cms datatype of video closed captions binary reference.\n */\nexport interface IVideoClosedCaptionBinaryReference {\n    /// <summary>Gets the locale.</summary>\n    locale: string;\n\n    /// <summary>Gets the URL used on the clients to play the video.</summary>\n    clientHref: string;\n}\n\n/**\n * Cms datatype of video closed captions binary reference.\n */\nexport interface IAudioBinaryReference {\n    /// <summary>Gets the locale.</summary>\n    locale: string;\n\n    /// <summary>Gets the audio type.</summary>\n    audioType: string;\n\n    /// <summary>Gets the URL used on the clients to play the video.</summary>\n    clientHref: string;\n}\n\n/**\n * IVideoMetadata.\n * @description - The data contract interface used for storing references to video metadata.\n */\nexport interface IVideoMetadata {\n    playerName?: string;\n    videoId?: string;\n    title?: string;\n    description?: string;\n    duration?: number;\n    posterframeUrl?: string;\n    shareUrl?: string;\n    videoFiles?: IVideoFile[];\n    externalPlayerUrl?: string;\n    externalSourceId?: string;\n    interactiveTriggersEnabled?: boolean;\n    interactiveTriggersUrl?: string;\n    minimumAge?: number;\n    videoBinaryReferences?: IBinaryReference[];\n    ccFiles?: ICCFile[];\n    audioTracks?: IAudioTrack[];\n}\n\n/**\n * @description - The data contract interface used for storing references to video files.\n */\nexport interface IVideoFile {\n    url: string;\n    mediaType: MediaTypes;\n    quality: MediaQuality;\n    width?: number;\n    height?: number;\n    formatCode?: string;\n}\n\n/**\n * Cms datatype of BinaryReference.\n */\nexport interface IBinaryReference {\n    format?: string;\n    bitrate?: number;\n    clientHref?: string;\n    height?: number;\n    width?: number;\n    alias?: string;\n    contentType?: string;\n    description?: string;\n    extension?: string;\n    sizeInBytes?: number;\n    sourceHref?: string;\n    href?: string;\n    locale?: string;\n    $type?: string;\n    audioType?: string;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICurrentClosedCaptionsSettings } from '../data';\nimport { IDictionaryStringString } from '../utilities';\n\n/**\n * Video closed captions constant.\n */\nexport const videoClosedCaptionsConstant = {\n    presetKey: 'preset'\n};\n\n/**\n * @name - closedCaptionsSettinsDefaults\n * @description - The default value for closed captions settings.\n */\nexport const closedCaptionsSettingDefaults: ICurrentClosedCaptionsSettings = {\n    preset: 'preset1',\n    text_font: 'proportionalsansserif',\n    text_color: 'white',\n    text_opacity: '100',\n    text_size: 'default',\n    text_edge_style: 'none',\n    text_background_color: 'black',\n    text_background_opacity: '100',\n    window_color: 'black',\n    window_opacity: '0'\n};\n\n/**\n * @name - closedCaptionsSettingsMap\n * @description - The closed captions settings map.\n */\nexport const closedCaptionsSettingsMap: IClosedCaptionsSettingsMap = {\n    text_font: { value: 'font-family:', option: 'font' },\n    text_color: { value: 'color:', option: 'color' },\n    text_size: { value: 'font-size:', option: 'text_size' },\n    text_edge_style: { value: 'text-shadow:', option: 'text_edge_style' },\n    text_opacity: { value: 'color:', option: 'percent' },\n    text_background_color: { value: 'background:', option: 'color' },\n    text_background_opacity: { value: 'background:', option: 'percent' },\n    window_color: { value: 'background:', option: 'color' },\n    window_opacity: { value: 'background:', option: 'percent' }\n};\n\n/**\n * @interface IClosedCaptionsSettingsMap\n * @description - The data contract interface used for storing closed caption setting map.\n */\nexport interface IClosedCaptionsSettingsMap {\n    [key: string]: IClosedCaptionsSettings;\n}\n\n/**\n * @interface IClosedCaptionsSettings\n * @description - The data contract interface used for storing closed caption setting values.\n */\nexport interface IClosedCaptionsSettings {\n    value: string;\n    option: string;\n}\n\n/**\n * Closed Captions Preset Map Interface.\n */\nexport interface IClosedCaptionsPresetMap {\n    [key: string]: IDictionaryStringString;\n}\n\n/**\n * @name - closedCaptionsPresetMap\n * @description - The closed captions preset settings map.\n */\nexport const closedCaptionsPresetMap: IClosedCaptionsPresetMap = {\n    preset1: {\n        text_font: 'proportionalsansserif',\n        text_color: 'white',\n        text_opacity: '100',\n        text_background_color: 'black',\n        text_background_opacity: '100'\n    },\n    preset2: {\n        text_font: 'monospacedserif',\n        text_color: 'white',\n        text_opacity: '100',\n        text_background_color: 'black',\n        text_background_opacity: '100'\n    },\n    preset3: {\n        text_font: 'proportionalsansserif',\n        text_color: 'yellow',\n        text_opacity: '100',\n        text_background_color: 'black',\n        text_background_opacity: '100'\n    },\n    preset4: {\n        text_font: 'proportionalsansserif',\n        text_color: 'blue',\n        text_opacity: '100',\n        text_background_color: 'grey',\n        text_background_opacity: '100'\n    },\n    preset5: {\n        text_font: 'casual',\n        text_color: 'white',\n        text_opacity: '100',\n        text_background_color: 'black',\n        text_background_opacity: '100'\n    }\n};\n\n/**\n * @name - closedCaptionsSettingsOptions\n * @description - The closed captions settings options and value map.\n */\nexport const closedCaptionsSettingsOptions: IClosedCaptionsOptionsMap = {\n    font: {\n        pre: 'cc_font_name_', // Key prefix for the localization\n        map: {\n            casual: 'Verdana;font-variant:normal',\n            cursive: 'Zapf-Chancery,Segoe script,Cursive;font-variant:normal',\n            monospacedsansserif: 'Lucida sans typewriter,Lucida console,Consolas;font-variant:normal',\n            monospacedserif: 'Courier;font-variant:normal',\n            proportionalsansserif: 'Arial,Sans-serif;font-variant:normal',\n            proportionalserif: 'Times New Roman,Serif;font-variant:normal',\n            smallcapitals: 'Arial,Helvetica,Sans-serif;font-variant:small-caps'\n        }\n    },\n    percent: {\n        pre: 'cc_percent_', // Key prefix for the options\n        map: {\n            0: '0',\n            50: '0.5',\n            75: '0.75',\n            100: '1'\n        }\n    },\n    text_size: {\n        pre: 'cc_text_size_', // Key prefix for the options\n        map: {\n            small: '75%',\n            default: '100%',\n            large: '125%',\n            extralarge: '150%',\n            maximum: '200%'\n        }\n    },\n    color: {\n        pre: 'cc_color_', // Key prefix for the options\n        map: {\n            white: '#FFFFFF',\n            black: '#000000',\n            blue: '#0000FF',\n            cyan: '#00FFFF',\n            green: '#00FF00',\n            grey: '#BCBCBC',\n            magenta: '#FF00FF',\n            red: '#FF0000',\n            yellow: '#FFFF00'\n        }\n    },\n    text_edge_style: {\n        pre: 'cc_text_edge_style_', // Key prefix for the options\n        map: {\n            none: 'none',\n            depressed: '1px 1px 0 #FFF,-1px -1px 0 #000',\n            dropshadow: '1px 1px 0 #000',\n            raised: '1px 1px 0 #000,-1px -1px 0x #FFF',\n            uniform: '1px 1px 0 #000,-1px 1px 0 #000,1px -1px 0 #000,-1px -1px 0 #000'\n        }\n    }\n};\n\n/**\n * @interface IClosedCaptionOptionsMap\n * @description - The data contract interface used for storing player closed captions options map.\n */\nexport interface IClosedCaptionsOptionsMap {\n    [key: string]: IClosedCaptionsOptions;\n}\n\n/**\n * @interface IClosedCaptionsOptions\n * @description - The data contract interface used for storing closed captions options values.\n */\nexport interface IClosedCaptionsOptions {\n    pre: string;\n    map: IDictionaryStringString;\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\nimport { IMenuItemProps, MenuItem } from '../menu-item';\nimport { IMenuProps } from './menu-props';\n\n/**\n *\n * Menu React component for video player.\n *\n */\nexport default class Menu extends React.Component<IMenuProps> {\n    private readonly target: React.RefObject<HTMLDivElement> = React.createRef<HTMLDivElement>();\n\n    public constructor(props: IMenuProps) {\n        super(props);\n        this.handleDocumentClick = this.handleDocumentClick.bind(this);\n        this._onKeyDown = this._onKeyDown.bind(this);\n        this._onKeyUp = this._onKeyUp.bind(this);\n    }\n\n    public componentDidMount(): void {\n        ['click', 'touchstart'].forEach((event: string) => {\n            window && window.addEventListener(event, this.handleDocumentClick, true);\n        });\n    }\n\n    public componentWillUnmount(): void {\n        ['click', 'touchstart'].forEach((event: string) => {\n            window && window.removeEventListener(event, this.handleDocumentClick, true);\n        });\n    }\n\n    public getMenuWidth(): number {\n        return this.target.current!.offsetWidth;\n    }\n\n    public shouldComponentUpdate(nextProps: IMenuProps): boolean {\n        let shouldRender = false;\n        if (nextProps.playerMenu !== this.props.playerMenu) {\n            shouldRender = true;\n        }\n        return shouldRender;\n    }\n\n    public render(): JSX.Element {\n        const { className, style } = this.props;\n        const menuItems: IMenuItemProps[] = this.props.playerMenu.items;\n        const count: number = menuItems.length;\n        return (\n            <div className={className} style={style} ref={this.target} data-category={this.props.playerMenu.category}>\n                <ul role='menu' className={`${className}__list`} onKeyDown={this._onKeyDown} onKeyUp={this._onKeyUp}>\n                    {menuItems.map((menuItem: IMenuItemProps, index: number) => {\n                        return (\n                            <MenuItem\n                                id={menuItem.id}\n                                key={index}\n                                label={menuItem.label}\n                                className={`${className}__menuitem`}\n                                language={menuItem.language}\n                                data={menuItem.data}\n                                isBackButton={menuItem.isBackButton}\n                                image={menuItem.image}\n                                imageAlt={menuItem.imageAlt}\n                                itemCount={count}\n                                itemIndex={index}\n                                glyph={menuItem.glyph}\n                                selected={menuItem.selected}\n                                selectable={menuItem.selectable}\n                                persistOnClick={menuItem.persistOnClick}\n                                {...(menuItem.id.includes('cc-preset') ? {} : { ariaLabel: menuItem.ariaLabel })}\n                                subMenu={menuItem.subMenu}\n                                hasMouseHoverEvents={menuItem.hasMouseHoverEvents}\n                                hasChildren={\n                                    !!(menuItem.subMenu !== undefined && menuItem.subMenu.items && menuItem.subMenu.items.length > 0)\n                                }\n                                onClick={this.props.onMenuItemClick}\n                                onFocus={this.props.onFocus}\n                                onBlur={this.props.onBlur}\n                                onKeyDown={this.props.onKeyDown}\n                                onKeyUp={this.props.onKeyUp}\n                                onMouseOver={this.props.onMouseOver}\n                                onMouseOut={this.props.onMouseOut}\n                                hasFocus={menuItem.hasFocus}\n                            />\n                        );\n                    })}\n                </ul>\n            </div>\n        );\n    }\n\n    public handleDocumentClick(e: Event): void {\n        const target = e.target as HTMLElement;\n        if (\n            this.target !== undefined &&\n            !(this.target.current !== null && (e.target === this.target.current || this.target.current.contains(target)))\n        ) {\n            this.props.onDocumentClick(e);\n        }\n    }\n\n    private _onKeyDown(event: React.KeyboardEvent<HTMLUListElement>): void {\n        this.props.onKeyDown!((event as unknown) as Event);\n    }\n\n    private _onKeyUp(event: React.KeyboardEvent<HTMLUListElement>): void {\n        this.props.onKeyUp!((event as unknown) as Event);\n    }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport React from 'react';\n\nimport { IMenuItemProps } from './menu-item-props';\n\n/**\n *\n * PlayPauseTrigger React component for video player.\n *\n */\nexport default class MenuItem extends React.PureComponent<IMenuItemProps> {\n    private readonly menuItem: React.RefObject<HTMLButtonElement> = React.createRef<HTMLButtonElement>();\n\n    public constructor(props: IMenuItemProps) {\n        super(props);\n        this._onClick = this._onClick.bind(this);\n        this._onFocus = this._onFocus.bind(this);\n        this._onMouseOver = this._onMouseOver.bind(this);\n        this._onMouseOut = this._onMouseOut.bind(this);\n        this._onKeyDown = this._onKeyDown.bind(this);\n        this._onKeyUp = this._onKeyUp.bind(this);\n        this._onBlur = this._onBlur.bind(this);\n    }\n\n    public render(): JSX.Element {\n        const { ...props } = this.props;\n        let className = this.props.className;\n        const hasChildren = !!props.subMenu;\n        if (hasChildren) {\n            className += ' menu__parent menu__position__right';\n        } else if (this.props.selected) {\n            className += ' menu__selected menu__position__right';\n        } else if (this.props.isBackButton) {\n            className += ' menu__back menu__position__left';\n        }\n        return (\n            <li id={props.id} role='presentation'>\n                <button\n                    ref={this.menuItem}\n                    className={className}\n                    data-has-children={hasChildren}\n                    {...(props.data ? { 'data-info': props.data } : {})}\n                    role={props.selectable ? 'menuitemradio' : 'menuitem'}\n                    aria-setsize={props.itemCount}\n                    aria-posinset={props.itemIndex! + 1}\n                    data-itemindex={props.itemIndex!}\n                    data-isbackbutton={props.isBackButton}\n                    {...(props.selectable && props.selected ? { 'aria-selected': true, 'aria-checked': true } : {})}\n                    {...(props.selectable ? { 'data-video-selectable': true } : {})}\n                    {...(hasChildren ? { 'aria-expanded': false, 'aria-haspopup': true } : {})}\n                    {...(props.persistOnClick ? { 'data-persist': true } : {})}\n                    {...(props.ariaLabel ? { 'aria-label': props.ariaLabel } : {})}\n                    {...(props.language ? { lang: props.language } : {})}\n                    {...(props.hasMouseHoverEvents ? { 'data-has-events': props.hasMouseHoverEvents } : {})}\n                    onClick={this._onClick}\n                    onFocus={this._onFocus}\n                    onMouseOver={this._onMouseOver}\n                    onMouseOut={this._onMouseOut}\n                    onKeyDown={this._onKeyDown}\n                    onKeyUp={this._onKeyUp}\n                    onBlur={this._onBlur}\n                >\n                    {props.image && <img src={props.image} alt={props.imageAlt || ''} className='menu__image' />}\n                    {props.label}\n                </button>\n            </li>\n        );\n    }\n\n    public componentDidMount(): void {\n        if (this.props.hasFocus) {\n            setTimeout(() => {\n                this.menuItem.current!.focus();\n            }, 0);\n        }\n    }\n\n    public componentDidUpdate(): void {\n        if (this.props.hasFocus) {\n            setTimeout(() => {\n                this.menuItem.current!.focus();\n            }, 0);\n        }\n    }\n\n    private _onClick(event: React.MouseEvent<HTMLButtonElement, MouseEvent>): void {\n        this.props.onClick!((event as unknown) as Event);\n    }\n\n    private _onFocus(event: React.FocusEvent<HTMLButtonElement>): void {\n        this.props.onFocus!((event as unknown) as Event);\n    }\n\n    private _onMouseOver(event: React.MouseEvent<HTMLButtonElement, MouseEvent>): void {\n        this.props.onMouseOver!((event as unknown) as Event);\n    }\n\n    private _onMouseOut(event: React.MouseEvent<HTMLButtonElement, MouseEvent>): void {\n        this.props.onMouseOut!((event as unknown) as Event);\n    }\n\n    private _onKeyDown(event: React.KeyboardEvent<HTMLButtonElement>): void {\n        event.stopPropagation();\n        this.props.onKeyDown!((event as unknown) as Event);\n    }\n\n    private _onKeyUp(event: React.KeyboardEvent<HTMLButtonElement>): void {\n        event.stopPropagation();\n        this.props.onKeyUp!((event as unknown) as Event);\n    }\n\n    private _onBlur(event: React.FocusEvent<HTMLButtonElement>): void {\n        this.props.onBlur!((event as unknown) as Event);\n    }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, UncontrolledTooltip } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ActionToggle } from '../action-toggle';\nimport { LocalizationConstants } from '../helper';\nimport { IPlayPauseTriggerProps } from './play-pause-trigger.props';\n\n/**\n *\n * PlayPauseTrigger React component for video player.\n *\n */\nexport default class PlayPauseTrigger extends React.PureComponent<IPlayPauseTriggerProps> {\n    public static defaultProps: Partial<IPlayPauseTriggerProps> = {\n        playAriaLabel: 'play',\n        pauseAriaLabel: 'pause'\n    };\n\n    private readonly playRef: React.RefObject<HTMLButtonElement> = React.createRef<HTMLButtonElement>();\n\n    private readonly pauseRef: React.RefObject<HTMLButtonElement> = React.createRef<HTMLButtonElement>();\n\n    private readonly payLoad: IPayLoad;\n\n    public constructor(props: IPlayPauseTriggerProps) {\n        super(props);\n        this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n    }\n\n    public render(): JSX.Element {\n        const { className, playAriaLabel, pauseAriaLabel, style, ...props } = this.props;\n        this.payLoad.contentAction.etext = this.props.toggled ? LocalizationConstants.pauseAriaLabel : LocalizationConstants.playAriaLabel;\n        const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n        return (\n            <div className={`${className}__container`} onClick={this.props.onChange} style={style} role='none'>\n                <ActionToggle className={this.props.className} {...props}>\n                    <button aria-label={playAriaLabel} className={`${className}__playbtn`} ref={this.playRef} {...attribute} />\n                    <button aria-label={pauseAriaLabel} className={`${className}__pausebtn`} ref={this.pauseRef} {...attribute} />\n                </ActionToggle>\n                <UncontrolledTooltip trigger='hover focus' target={this.playRef}>\n                    {' '}\n                    {playAriaLabel}\n                </UncontrolledTooltip>\n                <UncontrolledTooltip trigger='hover focus' target={this.pauseRef}>\n                    {' '}\n                    {pauseAriaLabel}\n                </UncontrolledTooltip>\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 {\n    getPayloadObject,\n    getTelemetryAttributes,\n    IPayLoad,\n    ISliderProps,\n    Slider,\n    UncontrolledTooltip\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ActionToggle } from '../action-toggle';\nimport { IPlayerMenu, MenuCategories, VideoPlayerNames } from '../data';\nimport { LocalizationConstants } from '../helper';\nimport { Menu } from '../menu';\nimport { KeyCodes } from '../utilities';\nimport { IVideoControlsProps } from './video-controls.props';\n\n/**\n * Video Control State Interface.\n */\nexport interface IVideoControlState {\n    showVolumeSlider: boolean;\n    volumeSliderLeftPosition: number;\n    volumeSliderTopPosition: number;\n    showMenu: boolean;\n    menuLeftPosition: number;\n    currentMenu?: IPlayerMenu;\n    toolTipClass: string;\n}\n\n/**\n * Offset Position Interface.\n */\nexport interface IOffsetPosition {\n    offsetLeft: number;\n    offsetTop: number;\n}\n\n/**\n * Button Menu Types.\n */\nexport const ButtonMenuTypes = {\n    ClosedCaption: 'close-caption',\n    Options: 'options'\n};\n\nconst volumeSliderDivOffset: number = 162;\n\n/**\n *\n * VideoControls React component for video player.\n *\n */\nexport default class VideoControls extends React.PureComponent<IVideoControlsProps, IVideoControlState> {\n    public static defaultProps: Partial<IVideoControlsProps> = {\n        resources: {\n            playAriaLabel: LocalizationConstants.playAriaLabel,\n            pauseAriaLabel: LocalizationConstants.pauseAriaLabel,\n            closeAriaLabel: LocalizationConstants.closeAriaLabel,\n            muteAriaLabel: LocalizationConstants.muteAriaLabel,\n            unMuteAriaLabel: LocalizationConstants.unMuteAriaLabel,\n            fullScreenAriaLabel: LocalizationConstants.fullScreenAriaLabel,\n            exitFullScreenAriaLabel: LocalizationConstants.exitFullScreenAriaLabel,\n            pausedAriaLabel: LocalizationConstants.pausedAriaLabel,\n            playingAriaLabel: LocalizationConstants.playingAriaLabel,\n            seekBarLabel: LocalizationConstants.seekBarLabel,\n            videoTimeDurationLabel: LocalizationConstants.videoTimeDurationLabel,\n            closedCaptionLabel: LocalizationConstants.closedCaptionLabel\n        },\n        viewportMin: 200\n    };\n\n    private static readonly videoControlsClassName: string = `${VideoPlayerNames.videoplayerContainer}__controls`;\n\n    private static readonly volumeAutoHideTimeout: number = 2000;\n\n    private selectedMenuItems: number[] = [];\n\n    private volumeAutoHideTimer: number;\n\n    private focusedMenuItemIndex: number;\n\n    private currentMenu: string;\n\n    private readonly volumeButtonDiv: React.RefObject<HTMLDivElement> = React.createRef<HTMLDivElement>();\n\n    private readonly playButtonRef: React.RefObject<HTMLButtonElement> = React.createRef<HTMLButtonElement>();\n\n    private readonly pauseButtonRef: React.RefObject<HTMLButtonElement> = React.createRef<HTMLButtonElement>();\n\n    private readonly closedCaptionRef: React.RefObject<HTMLButtonElement> = React.createRef<HTMLButtonElement>();\n\n    private readonly optionButtonRef: React.RefObject<HTMLButtonElement> = React.createRef<HTMLButtonElement>();\n\n    private readonly fullscreenButtonRef: React.RefObject<HTMLButtonElement> = React.createRef<HTMLButtonElement>();\n\n    private readonly exitFullScreenButtonRef: React.RefObject<HTMLButtonElement> = React.createRef<HTMLButtonElement>();\n\n    private readonly videoControlDiv: React.RefObject<HTMLDivElement> = React.createRef<HTMLDivElement>();\n\n    private readonly closedCaptionButtonDiv: React.RefObject<HTMLDivElement> = React.createRef<HTMLDivElement>();\n\n    private readonly optionButtonDiv: React.RefObject<HTMLDivElement> = React.createRef<HTMLDivElement>();\n\n    private readonly menuRef: React.RefObject<Menu> = React.createRef<Menu>();\n\n    private readonly muteButtonRef: React.RefObject<HTMLButtonElement> = React.createRef<HTMLButtonElement>();\n\n    private readonly unMuteButtonRef: React.RefObject<HTMLButtonElement> = React.createRef<HTMLButtonElement>();\n\n    private readonly _fullScreenReference: React.RefObject<HTMLDivElement> = React.createRef<HTMLDivElement>();\n\n    private readonly payLoad: IPayLoad;\n\n    public static getDerivedStateFromProps(props: IVideoControlsProps, state: IVideoControlState): IVideoControlState {\n        const nextState = { ...state };\n        if (!props.isControlPanelVisible) {\n            nextState.showMenu = false;\n        }\n        return nextState;\n    }\n\n    public constructor(props: IVideoControlsProps) {\n        super(props);\n        this.volumeAutoHideTimer = 0;\n        this.focusedMenuItemIndex = 0;\n        this.currentMenu = '';\n        this._hideVolumeControl = this._hideVolumeControl.bind(this);\n        this._onMenuItemClick = this._onMenuItemClick.bind(this);\n        this._reevaluateWidth = this._reevaluateWidth.bind(this);\n        this._onClosedCaptionClick = this._onClosedCaptionClick.bind(this);\n        this._onDocumentClick = this._onDocumentClick.bind(this);\n        this._onOptionsButtonClick = this._onOptionsButtonClick.bind(this);\n        this._onMenuBlur = this._onMenuBlur.bind(this);\n        this._onMenuFocus = this._onMenuFocus.bind(this);\n        this._onMouseOver = this._onMouseOver.bind(this);\n        this._onMouseOut = this._onMouseOut.bind(this);\n        this._onMenuKeyDown = this._onMenuKeyDown.bind(this);\n        this._onMenuKeyUp = this._onMenuKeyUp.bind(this);\n        this.state = {\n            showVolumeSlider: false,\n            volumeSliderLeftPosition: 0,\n            volumeSliderTopPosition: -160,\n            showMenu: false,\n            menuLeftPosition: 0,\n            currentMenu: this.props.closedCaptionMenu,\n            toolTipClass: ''\n        };\n\n        // Construct telemetry attribute to render\n        this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n    }\n\n    public componentDidUpdate(previousProps: IVideoControlsProps): void {\n        // Updating the selected menu as setstate in player takes time to update\n        if (\n            this.props.currentClosedCaptionLanguage !== previousProps.currentClosedCaptionLanguage ||\n            this.props.currentClosedCaptionsSetting !== previousProps.currentClosedCaptionsSetting ||\n            this.props.currentAudioTrack !== previousProps.currentAudioTrack\n        ) {\n            this._updateSelectedMenu();\n        }\n    }\n\n    public render(): JSX.Element {\n        const { className, ...props } = this.props;\n\n        const currentTime = this._toElapsedTimeString(props.playPosition.currentTime);\n        const endTime = this._toElapsedTimeString(props.playPosition.endTime);\n\n        const volumeDivStyle = {\n            top: this.state.volumeSliderTopPosition,\n            left: this.state.volumeSliderLeftPosition\n        };\n\n        const menuDivStyle = {\n            left: this.state.menuLeftPosition\n        };\n\n        this.payLoad.contentAction.etext = this.props.playing ? LocalizationConstants.pauseAriaLabel : LocalizationConstants.playAriaLabel;\n        const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n        return (\n            <div\n                className={className}\n                ref={this.videoControlDiv}\n                role='none'\n                onKeyDown={this.props.handleControlsKeyDownHandler}\n                onBlur={this.props.onBlur}\n                onFocus={this.props.onFocus}\n            >\n                <div className={`${VideoControls.videoControlsClassName}__wrapper`}>\n                    <div className={`${VideoControls.videoControlsClassName}__playpausebtn__container`}>\n                        <ActionToggle\n                            className={`${VideoControls.videoControlsClassName}__playpausebtn__wrapper`}\n                            onChange={this.props.onPlayClick}\n                            toggled={this.props.playing}\n                        >\n                            <button\n                                ref={this.playButtonRef}\n                                aria-label={this.props.resources.playAriaLabel}\n                                className={`${VideoControls.videoControlsClassName}__playbtn`}\n                                {...attribute}\n                            />\n                            <button\n                                ref={this.pauseButtonRef}\n                                aria-label={this.props.resources.pauseAriaLabel}\n                                className={`${VideoControls.videoControlsClassName}__pausebtn`}\n                                {...attribute}\n                            />\n                        </ActionToggle>\n                        <UncontrolledTooltip className={this.state.toolTipClass} trigger='hover focus' target={this.playButtonRef}>\n                            {' '}\n                            {this.props.resources.playAriaLabel}\n                        </UncontrolledTooltip>\n                        <UncontrolledTooltip trigger='hover focus' target={this.pauseButtonRef}>\n                            {' '}\n                            {this.props.resources.pauseAriaLabel}\n                        </UncontrolledTooltip>\n                    </div>\n                    <div className={`${VideoControls.videoControlsClassName}__time`}>\n                        <div\n                            className={`${VideoControls.videoControlsClassName}__time__screenreader`}\n                            aria-hidden={this.props.isMobileDevice}\n                            aria-live='polite'\n                        >\n                            {`${this.props.resources.videoTimeDurationLabel} ${currentTime} / ${endTime}`}\n                        </div>\n                        <div className={`${VideoControls.videoControlsClassName}__time__text`} aria-hidden='true'>\n                            {currentTime} / {endTime}\n                        </div>\n                    </div>\n                    <div className={`${VideoControls.videoControlsClassName}__slider__container`}>{this._renderVideoSlider()}</div>\n                    {this.props.closedCaptionMenu && this._renderClosedCaptionButton()}\n                    {this.props.optionMenu && this._renderOptionButton()}\n                    {this.state.showMenu && (\n                        <Menu\n                            ref={this.menuRef}\n                            className={`${VideoControls.videoControlsClassName}__menu`}\n                            playerMenu={this.state.currentMenu!}\n                            style={menuDivStyle}\n                            onDocumentClick={this._onDocumentClick}\n                            onMenuItemClick={this._onMenuItemClick}\n                            onFocus={this._onMenuFocus}\n                            onBlur={this._onMenuBlur}\n                            onMouseOver={this._onMouseOver}\n                            onMouseOut={this._onMouseOut}\n                            onKeyDown={this._onMenuKeyDown}\n                            onKeyUp={this._onMenuKeyUp}\n                        />\n                    )}\n                    {!this.props.isMobileDevice && (\n                        <div className={`${VideoControls.videoControlsClassName}__muteunmutebtn__container`} ref={this.volumeButtonDiv}>\n                            {this._renderVolumeButton()}\n                        </div>\n                    )}\n                    {!this.props.isMobileDevice && (\n                        <div\n                            className={`${VideoControls.videoControlsClassName}__volumeslider__container ${\n                                this.state.showVolumeSlider ? 'show' : 'hide'\n                            }`}\n                            onFocus={this.showVolumeControl()}\n                            onBlur={this._hideVolumeControl}\n                            onMouseOver={this.showVolumeControl()}\n                            onMouseOut={this._hideVolumeControl}\n                            style={volumeDivStyle}\n                            role='presentation'\n                        >\n                            {this._renderVolumeSlider()}\n                        </div>\n                    )}\n                    {this._renderFullScreenButton()}\n                </div>\n            </div>\n        );\n    }\n\n    /**\n     * Show Volume Control.\n     * @param autohide - AutoHide the volume Control.\n     * @returns Returns void.\n     */\n    public showVolumeControl = (autohide?: boolean) => () => {\n        const offsetPosition = this._getOffsetPosition(this.volumeButtonDiv);\n        window && window.clearTimeout(this.volumeAutoHideTimer);\n\n        this.setState({\n            showVolumeSlider: true,\n            volumeSliderLeftPosition: offsetPosition.offsetLeft,\n            volumeSliderTopPosition: offsetPosition.offsetTop - volumeSliderDivOffset + 1\n        });\n        if (autohide && document.activeElement!.parentElement !== this.volumeButtonDiv.current!.firstChild) {\n            this.volumeAutoHideTimer =\n                window &&\n                window.setTimeout(() => {\n                    this._hideVolumeControl();\n                }, VideoControls.volumeAutoHideTimeout);\n        }\n    };\n\n    public setFocusOnPlay(): void {\n        setTimeout(() => {\n            if (this.playButtonRef.current) {\n                this.playButtonRef.current.focus();\n            }\n        }, 0);\n    }\n\n    public setFocusOnPause(): void {\n        setTimeout(() => {\n            if (this.pauseButtonRef.current) {\n                this.pauseButtonRef.current.focus();\n            }\n        }, 0);\n    }\n\n    public setFocusOnMenuButton(): void {\n        // Don't set focus if control panel is not visible\n        if (this.props.isControlPanelVisible) {\n            if (this.currentMenu === ButtonMenuTypes.ClosedCaption) {\n                this.closedCaptionRef.current!.focus();\n            } else {\n                this.optionButtonRef.current!.focus();\n            }\n        }\n    }\n\n    public componentDidMount(): void {\n        window && window.addEventListener('resize', this._reevaluateWidth);\n        this._reevaluateWidth();\n        if (this._isIPhone()) {\n            this._fullScreenReference.current?.setAttribute('hidden', 'true');\n        }\n    }\n\n    public componentWillUnmount(): void {\n        window && window.removeEventListener('resize', this._reevaluateWidth);\n    }\n\n    private _reevaluateWidth(): void {\n        const rowDiv = this.videoControlDiv.current!.children[0];\n        let controlBarButtonsWidth = 0;\n\n        // Not able to use for-of loop as it causes another ts-lint issue because rowDiv.children is a HTMLCollection object and HTMLCollection\n        // is not an array type and string type. So I am surpressing the ts-lint error here rather than other error\n        for (let i = 0; i < rowDiv.children.length; i++) {\n            if (rowDiv.children[i].children[0] !== undefined && rowDiv.children[i].children[0].className.includes('action-toggle')) {\n                controlBarButtonsWidth += rowDiv.children[i].clientWidth;\n            }\n        }\n\n        const sliderWidth = controlBarButtonsWidth + 100;\n        rowDiv.children[2].setAttribute('style', `${'width: calc(100% - '}${sliderWidth}${'px)'}`);\n        if (this.state.showVolumeSlider) {\n            this._hideVolumeControl();\n        }\n        if (!this.props.isMobileDevice) {\n            const offsetPosition = this._getOffsetPosition(this.volumeButtonDiv);\n            this.setState({\n                volumeSliderLeftPosition: offsetPosition.offsetLeft,\n                volumeSliderTopPosition: offsetPosition.offsetTop - volumeSliderDivOffset\n            });\n        }\n        if (this.state.showMenu) {\n            this.setState({\n                showMenu: false\n            });\n        }\n\n        const videoControlWidth = this.videoControlDiv.current!.clientWidth;\n        const viewportMax = window && window.innerWidth;\n        this._applyTooltipClassOnWidthChange(videoControlWidth, viewportMax);\n    }\n\n    /**\n     * Handles document click.\n     * @param e - Event object passed.\n     */\n    private readonly _onDocumentClick = (e: Event): void => {\n        const target = e.target as HTMLElement;\n        if (\n            !(\n                (this.currentMenu === ButtonMenuTypes.ClosedCaption &&\n                    (target === this.closedCaptionButtonDiv.current!.firstChild ||\n                        target.parentElement === this.closedCaptionButtonDiv.current!.firstChild)) ||\n                (this.currentMenu === ButtonMenuTypes.Options &&\n                    (target === this.optionButtonDiv.current!.firstChild ||\n                        target.parentElement === this.optionButtonDiv.current!.firstChild))\n            )\n        ) {\n            this.setState({\n                showMenu: !this.state.showMenu\n            });\n        }\n    };\n\n    private _onMenuFocus(e: Event): void {\n        const button: HTMLButtonElement = e.target as HTMLButtonElement;\n        const hasEvents = button.getAttribute('data-has-events');\n        if (hasEvents) {\n            this.props.onMenuItemFocus({\n                category: button.parentElement!.parentElement!.parentElement!.getAttribute('data-category')!,\n                id: button.parentElement!.id,\n                data: button.getAttribute('data-info')!\n            });\n        }\n    }\n\n    private _onMenuBlur(e: Event): void {\n        const button: HTMLButtonElement = e.target as HTMLButtonElement;\n        const hasEvents = button.getAttribute('data-has-events');\n        if (hasEvents) {\n            this.props.onMenuItemBlur();\n        }\n    }\n\n    private _onMouseOver(e: Event): void {\n        const button: HTMLButtonElement = e.target as HTMLButtonElement;\n        const hasEvents = button.getAttribute('data-has-events');\n        if (hasEvents) {\n            this.props.onMenuItemFocus({\n                category: button.parentElement!.parentElement!.parentElement!.getAttribute('data-category')!,\n                id: button.parentElement!.id,\n                data: button.getAttribute('data-info')!\n            });\n        }\n    }\n\n    private _onMouseOut(e: Event): void {\n        const button: HTMLButtonElement = e.target as HTMLButtonElement;\n        const hasEvents = button.getAttribute('data-has-events');\n        if (hasEvents) {\n            this.props.onMenuItemBlur();\n        }\n    }\n\n    private _onMenuKeyDown(e: Event): void {\n        this._onMenuKeyPressed((e as unknown) as KeyboardEvent);\n    }\n\n    private _onMenuKeyUp(event: Event): void {\n        const e = (event as unknown) as KeyboardEvent;\n        const key = e.keyCode;\n\n        if (key === KeyCodes.Space) {\n            event.preventDefault();\n        }\n    }\n\n    /**\n     * Event handler for menu's keyboard events.\n     * @param event - The dialog that is allowed to remain open.\n     */\n    private _onMenuKeyPressed(event: KeyboardEvent): void {\n        const key = event.keyCode;\n        const target = event.target as HTMLElement;\n        const currentMenuItem = this.state.currentMenu!;\n        this._resetFocusForCurrentMenu(currentMenuItem);\n\n        // eslint-disable-next-line default-case\n        switch (key) {\n            case KeyCodes.ArrowLeft:\n            case KeyCodes.ArrowRight:\n                event.stopPropagation();\n                event.preventDefault();\n                if (key === KeyCodes.ArrowRight && target.getAttribute('data-has-children') === 'true') {\n                    this._onMenuItemClick(event);\n                }\n                if (key === KeyCodes.ArrowLeft && target.getAttribute('data-isbackbutton') === 'true') {\n                    this._onMenuItemClick(event);\n                }\n                break;\n\n            case KeyCodes.Enter:\n            case KeyCodes.Space:\n                event.preventDefault();\n                this._onMenuItemClick(event);\n                break;\n\n            case KeyCodes.ArrowUp:\n            case KeyCodes.ArrowDown:\n                event.stopPropagation();\n                event.preventDefault();\n\n                if (key === KeyCodes.ArrowUp) {\n                    this.focusedMenuItemIndex -= 1;\n                    if (this.focusedMenuItemIndex < 0) {\n                        this.focusedMenuItemIndex = currentMenuItem.items.length - 1;\n                    }\n                } else {\n                    this.focusedMenuItemIndex = (this.focusedMenuItemIndex + 1) % currentMenuItem.items.length;\n                }\n\n                currentMenuItem.items[this.focusedMenuItemIndex].hasFocus = true;\n                this.setState(\n                    {\n                        currentMenu: currentMenuItem\n                    },\n                    () => {\n                        if (this.menuRef.current) {\n                            this.menuRef.current.forceUpdate();\n                        }\n                    }\n                );\n                break;\n\n            case KeyCodes.PageUp:\n            case KeyCodes.Home:\n                event.stopPropagation();\n                event.preventDefault();\n                this.focusedMenuItemIndex = 0;\n                currentMenuItem.items[this.focusedMenuItemIndex].hasFocus = true;\n                this.setState(\n                    {\n                        currentMenu: currentMenuItem\n                    },\n                    () => {\n                        if (this.menuRef.current) {\n                            this.menuRef.current.forceUpdate();\n                        }\n                    }\n                );\n                break;\n\n            case KeyCodes.End:\n            case KeyCodes.PageDown:\n                event.stopPropagation();\n                event.preventDefault();\n                this.focusedMenuItemIndex = currentMenuItem.items.length - 1;\n                currentMenuItem.items[this.focusedMenuItemIndex].hasFocus = true;\n                this.setState(\n                    {\n                        currentMenu: currentMenuItem\n                    },\n                    () => {\n                        if (this.menuRef.current) {\n                            this.menuRef.current.forceUpdate();\n                        }\n                    }\n                );\n                break;\n\n            case KeyCodes.Escape:\n                this.setFocusOnMenuButton();\n                this.setState({\n                    showMenu: false\n                });\n                break;\n            case KeyCodes.Tab:\n                if (\n                    (this.focusedMenuItemIndex < currentMenuItem.items.length - 1 ||\n                        (this.focusedMenuItemIndex === currentMenuItem.items.length - 1 && event.shiftKey)) &&\n                    this.focusedMenuItemIndex >= 0 &&\n                    !(this.focusedMenuItemIndex === 0 && event.shiftKey)\n                ) {\n                    this.focusedMenuItemIndex += event.shiftKey ? -1 : 1;\n\n                    currentMenuItem.items[this.focusedMenuItemIndex].hasFocus = true;\n                    this.setState({\n                        currentMenu: currentMenuItem\n                    });\n                } else {\n                    event.stopPropagation();\n                    event.preventDefault();\n                    this.setState({\n                        showMenu: false\n                    });\n                    if (event.shiftKey) {\n                        this.setFocusOnMenuButton();\n                    } else if (this.currentMenu === ButtonMenuTypes.ClosedCaption && this.optionButtonRef.current) {\n                        this.optionButtonRef.current.focus();\n                    } else {\n                        this.props.isMuted ? this.unMuteButtonRef.current!.focus() : this.muteButtonRef.current!.focus();\n                    }\n                }\n        }\n    }\n\n    private _onMenuItemClick(e: KeyboardEvent): void {\n        const button: HTMLButtonElement = e.currentTarget as HTMLButtonElement;\n        if (button.getAttribute('data-has-children')! === 'true') {\n            const index: number = Number(button.getAttribute('data-itemindex')!);\n            this.selectedMenuItems.push(index);\n            const currentMenuItem = this._getSelectedMenuFromList();\n            this.focusedMenuItemIndex = 0;\n            currentMenuItem.items[this.focusedMenuItemIndex].hasFocus = true;\n            this.setState({\n                currentMenu: currentMenuItem\n            });\n        } else if (button.getAttribute('data-isbackbutton')! === 'true') {\n            this.focusedMenuItemIndex = this.selectedMenuItems.pop()!;\n            const currentMenuItem = this._getSelectedMenuFromList();\n            currentMenuItem.items[this.focusedMenuItemIndex].hasFocus = true;\n            this.setState({\n                currentMenu: currentMenuItem\n            });\n        } else {\n            const currentMenuItem = this._getSelectedMenuFromList();\n            this._resetFocusForCurrentMenu(currentMenuItem);\n            const index: number = Number(button.getAttribute('data-itemindex')!);\n            this.focusedMenuItemIndex = index;\n            const data =\n                this.currentMenu === ButtonMenuTypes.ClosedCaption\n                    ? button.getAttribute('data-info')\n                    : JSON.stringify({ url: button.getAttribute('data-info')!, lang: button.getAttribute('lang')! });\n            this.props.onMenuItemClick({\n                category: button.parentElement!.parentElement!.parentElement!.getAttribute('data-category')!,\n                id: button.parentElement!.id,\n                data: data!\n            });\n        }\n        this._updateSelectedMenu();\n    }\n\n    private _resetFocusForCurrentMenu(currentMenu: IPlayerMenu): void {\n        currentMenu.items.forEach(item => (item.hasFocus = false));\n    }\n\n    private _getSelectedMenuFromList(): IPlayerMenu {\n        let menuItem = this.currentMenu === ButtonMenuTypes.ClosedCaption ? this.props.closedCaptionMenu! : this.props.optionMenu!;\n\n        for (let i = 0; i < this.selectedMenuItems.length; i++) {\n            menuItem = menuItem.items[this.selectedMenuItems[i]].subMenu!;\n        }\n        return menuItem;\n    }\n\n    private _updateSelectedMenu(): void {\n        const currentMenuItem = this._getSelectedMenuFromList();\n        if (currentMenuItem) {\n            // eslint-disable-next-line default-case\n            switch (currentMenuItem.category) {\n                case MenuCategories.ClosedCaption:\n                    currentMenuItem.items.forEach(item => {\n                        if (item.data && item.data === this.props.currentClosedCaptionLanguage) {\n                            item.selected = true;\n                        } else {\n                            item.selected = false;\n                        }\n                    });\n                    break;\n                case MenuCategories.ClosedCaptionSettings:\n                    currentMenuItem.items.forEach(item => {\n                        // eslint-disable-next-line guard-for-in\n                        for (const setting in this.props.currentClosedCaptionsSetting) {\n                            const data = `${setting}:${this.props.currentClosedCaptionsSetting[setting]}`;\n                            if (item.data && item.data === data) {\n                                item.selected = true;\n                                break;\n                            } else {\n                                item.selected = false;\n                            }\n                        }\n                    });\n                    break;\n                case MenuCategories.AudioTracks:\n                    currentMenuItem.items.forEach(item => {\n                        if (item.language && item.language === this.props.currentAudioTrack) {\n                            item.selected = true;\n                        } else {\n                            item.selected = false;\n                        }\n                    });\n            }\n\n            this.setState(\n                {\n                    currentMenu: currentMenuItem\n                },\n                () => {\n                    if (this.menuRef.current) {\n                        this.menuRef.current.forceUpdate();\n                    }\n                }\n            );\n        }\n    }\n\n    /**\n     * Render the closed caption button.\n     * @returns Returns the closed caption button.\n     */\n    private readonly _renderClosedCaptionButton = (): JSX.Element => {\n        return (\n            <div className={`${VideoControls.videoControlsClassName}__closedcaption__container`} ref={this.closedCaptionButtonDiv}>\n                <button\n                    ref={this.closedCaptionRef}\n                    aria-label={this.props.resources.closedCaptionLabel}\n                    className={`${VideoControls.videoControlsClassName}__closedcaptionbtn`}\n                    onClick={this._onClosedCaptionClick}\n                />\n                <UncontrolledTooltip trigger='hover focus' target={this.closedCaptionRef}>\n                    {this.props.resources.closedCaptionLabel}\n                </UncontrolledTooltip>\n            </div>\n        );\n    };\n\n    /**\n     * Renders the option button.\n     * @returns Returns the render option button.\n     */\n    private readonly _renderOptionButton = (): JSX.Element => {\n        return (\n            <div className={`${VideoControls.videoControlsClassName}__moreoptions__container`} ref={this.optionButtonDiv}>\n                <button\n                    ref={this.optionButtonRef}\n                    aria-label={this.props.resources.optionButtonLabel}\n                    className={`${VideoControls.videoControlsClassName}__moreoptionsbtn`}\n                    onClick={this._onOptionsButtonClick}\n                />\n                <UncontrolledTooltip trigger='hover focus' target={this.optionButtonRef}>\n                    {this.props.resources.optionButtonLabel}\n                </UncontrolledTooltip>\n            </div>\n        );\n    };\n\n    /**\n     * Renders the full screen button.\n     * @returns Returns the full screen button.\n     */\n    private readonly _renderFullScreenButton = (): JSX.Element => {\n        this.payLoad.contentAction.etext = this.props.isInFullScreen\n            ? LocalizationConstants.exitFullScreenAriaLabel\n            : LocalizationConstants.fullScreenAriaLabel;\n        const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n        return (\n            <div ref={this._fullScreenReference} className={`${VideoControls.videoControlsClassName}__fullscreenbtn__container`}>\n                <ActionToggle\n                    onChange={this.props.toggleFullScreen}\n                    toggled={this.props.isInFullScreen}\n                    className={`${VideoControls.videoControlsClassName}__fullscreenbtn__wrapper`}\n                >\n                    <button\n                        ref={this.fullscreenButtonRef}\n                        aria-label={this.props.resources.fullScreenAriaLabel}\n                        className={`${VideoControls.videoControlsClassName}__fullscreenbtn`}\n                        {...attribute}\n                    />\n                    <button\n                        ref={this.exitFullScreenButtonRef}\n                        aria-label={this.props.resources.exitFullScreenAriaLabel}\n                        className={`${VideoControls.videoControlsClassName}__exitfullscreenbtn`}\n                        {...attribute}\n                    />\n                </ActionToggle>\n                <UncontrolledTooltip\n                    className={`${VideoControls.videoControlsClassName}__fullscreenbtn__tooltip`}\n                    trigger='hover focus'\n                    target={this.fullscreenButtonRef}\n                >\n                    {' '}\n                    {this.props.resources.fullScreenAriaLabel}\n                </UncontrolledTooltip>\n                <UncontrolledTooltip trigger='hover focus' target={this.exitFullScreenButtonRef}>\n                    {' '}\n                    {this.props.resources.exitFullScreenAriaLabel}\n                </UncontrolledTooltip>\n            </div>\n        );\n    };\n\n    /**\n     * Renders the Volume button.\n     * @returns Returns the volume button.\n     */\n    private readonly _renderVolumeButton = (): JSX.Element => {\n        this.payLoad.contentAction.etext = this.props.isMuted ? LocalizationConstants.unMuteAriaLabel : LocalizationConstants.muteAriaLabel;\n        const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n        const volumeButtonProps = {\n            className: `${VideoControls.videoControlsClassName}__muteunmutebtn__wrapper`,\n            onChange: this.props.onMuteClick,\n            toggled: this.props.isMuted,\n            onFocus: this.showVolumeControl(),\n            onBlur: this._hideVolumeControl,\n            onMouseOver: this.showVolumeControl(),\n            onMouseOut: this._hideVolumeControl\n        };\n\n        return (\n            <ActionToggle {...volumeButtonProps}>\n                <button\n                    aria-label={this.props.resources.muteAriaLabel}\n                    ref={this.muteButtonRef}\n                    className={`${VideoControls.videoControlsClassName}__mutebtn`}\n                    {...attribute}\n                />\n                <button\n                    aria-label={this.props.resources.unMuteAriaLabel}\n                    ref={this.unMuteButtonRef}\n                    className={`${VideoControls.videoControlsClassName}__unmutebtn`}\n                    {...attribute}\n                />\n            </ActionToggle>\n        );\n    };\n\n    /**\n     * Renders the video slider.\n     * @returns - Returns the video slider div.\n     */\n    private readonly _renderVideoSlider = (): JSX.Element => {\n        const videoProps: ISliderProps = {\n            id: 'VideoSlider',\n            inForm: false,\n            className: `${VideoControls.videoControlsClassName}__slidercontainer`,\n            min: this.props.playPosition.startTime,\n            max: this.props.playPosition.endTime,\n            ariaLabel: this.props.resources.seekBarLabel,\n            fillTrackValue: this.props.playPosition.bufferedDuration,\n            step: this.props.videoSeekSteps || 1,\n            orientation: 'horizontal',\n            showProgressBar: true,\n            onChange: this.props.onProgressChange,\n            showLabels: false,\n            showTooltip: true,\n            shouldSliderAdjustToRTL: false,\n            handleTooltipText: this._handleProgressToolTipText(this.props.playPosition.currentTime),\n            sliderThumbs: [\n                {\n                    id: 'VideoSliderThumb',\n                    value: this.props.playPosition.currentTime,\n                    ariaValueText: this.props.playPosition.currentTime.toString(),\n                    ariaLabel: this.props.resources.sliderThumbLabel\n                }\n            ]\n        };\n\n        return <Slider {...videoProps} />;\n    };\n\n    /**\n     * Renders the Volume slider.\n     * @returns Returns the Volume Slider.\n     */\n    private readonly _renderVolumeSlider = (): JSX.Element => {\n        const volumeSliderProps: ISliderProps = {\n            id: 'VolumeSlider',\n            inForm: false,\n            className: `${VideoControls.videoControlsClassName}__volumeslider`,\n            min: 0,\n            max: 100,\n            step: this.props.volumeSeekSteps || 5,\n            orientation: 'vertical',\n            showProgressBar: false,\n            onChange: this.props.onVolumeChange,\n            onFocus: this.showVolumeControl(),\n            onBlur: this._hideVolumeControl,\n            showLabels: false,\n            showTooltip: true,\n            shouldSliderAdjustToRTL: false,\n            sliderThumbs: [\n                {\n                    id: 'VolumeSliderThumb',\n                    value: Math.round(this.props.currentVolume),\n                    ariaValueText: Math.round(this.props.currentVolume).toString(),\n                    ariaLabel: this.props.resources.volumeThumbLabel\n                }\n            ]\n        };\n        return <Slider {...volumeSliderProps} />;\n    };\n\n    private _getOffsetPosition(refDiv: React.RefObject<HTMLDivElement>): IOffsetPosition {\n        const buttonWidth = refDiv.current!.children[0].clientWidth;\n        const elementwidth = refDiv.current!.offsetWidth;\n        const offsetLeft = refDiv.current!.offsetLeft + (elementwidth - buttonWidth) / 2;\n        const offsetTop = refDiv.current!.offsetTop;\n        return {\n            offsetLeft,\n            offsetTop\n        };\n    }\n\n    private _onClosedCaptionClick(): void {\n        this.currentMenu = ButtonMenuTypes.ClosedCaption;\n        const offsetLeft = this._getOffsetPosition(this.closedCaptionButtonDiv).offsetLeft;\n        this.focusedMenuItemIndex = 0;\n        this.selectedMenuItems = [];\n        const closedCaptionMenu = this.props.closedCaptionMenu!;\n        this._resetFocusForCurrentMenu(closedCaptionMenu);\n        closedCaptionMenu.items[this.focusedMenuItemIndex].hasFocus = true;\n        this.setState({\n            showMenu: this.currentMenu === ButtonMenuTypes.ClosedCaption && !this.state.showMenu,\n            menuLeftPosition: offsetLeft - 120,\n            currentMenu: closedCaptionMenu\n        });\n        this._updateSelectedMenu();\n    }\n\n    private _onOptionsButtonClick(): void {\n        this.currentMenu = ButtonMenuTypes.Options;\n        const offsetLeft = this._getOffsetPosition(this.optionButtonDiv).offsetLeft;\n        this.focusedMenuItemIndex = 0;\n        this.selectedMenuItems = [];\n        const optionMenu = this.props.optionMenu!;\n        this._resetFocusForCurrentMenu(optionMenu);\n        optionMenu.items[this.focusedMenuItemIndex].hasFocus = true;\n        this.setState({\n            showMenu: this.currentMenu === ButtonMenuTypes.Options && !this.state.showMenu,\n            menuLeftPosition: offsetLeft - 120,\n            currentMenu: optionMenu\n        });\n        this._updateSelectedMenu();\n    }\n\n    private _hideVolumeControl(): void {\n        window && window.clearTimeout(this.volumeAutoHideTimer);\n        this.setState({\n            showVolumeSlider: false\n        });\n    }\n\n    /**\n     * Handles the progresss tool tip.\n     * @param tooltip - Tooltip number.\n     * @returns - The elapsed time.\n     */\n    private readonly _handleProgressToolTipText = (tooltip: number) => () => {\n        return this._toElapsedTimeString(tooltip);\n    };\n\n    private _toElapsedTimeString(seconds: number): string {\n        const negative = seconds < 0;\n        if (negative) {\n            seconds *= -1;\n        }\n\n        const hours = Math.floor(seconds / 3600);\n        const remainder = seconds % 3600;\n        const minutes = Math.floor(remainder / 60);\n\n        let elapsedTime = '';\n        elapsedTime = hours > 0 ? `${hours}:` : '';\n\n        seconds = Math.floor(remainder % 60);\n        elapsedTime += `${(minutes < 10 ? '0' : '') + minutes.toString()}`;\n        elapsedTime += `:${seconds === 0 ? '00' : (seconds < 10 ? '0' : '') + seconds.toString()}`;\n\n        return negative ? `-${elapsedTime}` : elapsedTime;\n    }\n\n    private _applyTooltipClassOnWidthChange(videoControlWidth: number, viewportMax: number): void {\n        if (videoControlWidth) {\n            this.setState({\n                toolTipClass:\n                    videoControlWidth > this.props.viewportMin! && videoControlWidth < viewportMax\n                        ? `${VideoControls.videoControlsClassName}__playpausebtn__tooltip`\n                        : ''\n            });\n        }\n    }\n\n    private _isIPhone(): boolean {\n        const useragent = window && window.navigator.userAgent;\n        return !!useragent.match(/iphone/i);\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\n// eslint-disable-next-line @typescript-eslint/naming-convention\ninterface CarouselContext {\n    direction?: string;\n}\n\n// Create a context wrapping some shared state\nexport default React.createContext<CarouselContext>({\n    direction: 'right'\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { mapToCssModules, TransitionStatuses, TransitionTimeouts } from '@msdyn365-commerce-modules/utilities';\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport Transition from 'react-transition-group/Transition';\n\nimport CarouselContext from './CarouselContext';\nimport { ICarouselItemProps } from './CarouselItem.props';\n\nexport interface ICarouselItemState {\n    startAnimation: boolean;\n}\n\n/**\n * CarouselItem component.\n */\nexport default class CarouselItem extends React.Component<ICarouselItemProps, ICarouselItemState> {\n    public static defaultProps: Partial<ICarouselItemProps> = {\n        tag: 'div',\n        timeout: TransitionTimeouts.Carousel,\n        slide: true\n    };\n\n    public props: ICarouselItemProps;\n\n    public state: ICarouselItemState;\n\n    constructor(props: ICarouselItemProps) {\n        super(props);\n        this.props = props;\n\n        this.state = {\n            startAnimation: false\n        };\n\n        this.onEnter = this.onEnter.bind(this);\n        this.onEntering = this.onEntering.bind(this);\n        this.onExit = this.onExit.bind(this);\n        this.onExiting = this.onExiting.bind(this);\n        this.onExited = this.onExited.bind(this);\n    }\n\n    public onEnter = (node: HTMLElement, isAppearing: boolean) => {\n        this.setState({ startAnimation: false });\n        if (this.props.onEnter) {\n            this.props.onEnter(node, isAppearing);\n        }\n    };\n\n    public onEntering = (node: HTMLElement, isAppearing: boolean) => {\n        // Getting this variable triggers a reflow\n        const offsetHeight = node.offsetHeight;\n        this.setState({ startAnimation: true });\n        if (this.props.onEntering) {\n            this.props.onEntering(node, isAppearing);\n        }\n\n        return offsetHeight;\n    };\n\n    public onExit = (node: HTMLElement) => {\n        this.setState({ startAnimation: false });\n        if (this.props.onExit) {\n            this.props.onExit(node);\n        }\n    };\n\n    public onExiting = (node: HTMLElement) => {\n        this.setState({ startAnimation: true });\n        node.dispatchEvent(new CustomEvent('slide.bs.carousel'));\n        if (this.props.onExiting) {\n            this.props.onExiting(node);\n        }\n    };\n\n    public onExited = (node: HTMLElement) => {\n        node.dispatchEvent(new CustomEvent('slid.bs.carousel'));\n        if (this.props.onExited) {\n            this.props.onExited(node);\n        }\n    };\n\n    public shouldComponentUpdate(nextProps: ICarouselItemProps): boolean {\n        if (nextProps.slide || this.props.slide !== nextProps.slide) {\n            return true;\n        }\n        return false;\n    }\n\n    public render(): JSX.Element | null {\n        const {\n            children,\n            cssModule,\n            slide,\n            tag,\n            className,\n\n            in: collapseIn,\n            mountOnEnter,\n            unmountOnExit,\n            appear,\n            enter,\n            exit,\n            timeout,\n            onEnter,\n            onEntering,\n            onEntered,\n            onExit,\n            onExiting,\n            onExited,\n\n            ...otherProps\n        } = this.props;\n\n        const timeoutOrDefault = timeout || TransitionTimeouts.Carousel;\n        const Tag = tag || 'div';\n        const transitionProps = {\n            in: collapseIn,\n            mountOnEnter,\n            unmountOnExit,\n            appear,\n            enter,\n            exit,\n            timeout: timeoutOrDefault\n        };\n\n        return (\n            <CarouselContext.Consumer>\n                {({ direction }) => (\n                    <Transition\n                        {...transitionProps}\n                        enter={slide}\n                        exit={slide}\n                        in={collapseIn}\n                        onEnter={this.onEnter}\n                        onEntering={this.onEntering}\n                        onExit={this.onExit}\n                        onExiting={this.onExiting}\n                        onExited={this.onExited}\n                    >\n                        {(status: TransitionStatuses) => {\n                            const isActive = status === 'entered' || status === 'exiting';\n                            const directionClassName =\n                                (status === 'entering' || status === 'exiting') &&\n                                this.state.startAnimation &&\n                                (direction === 'right' ? 'msc-carousel__item__left' : 'msc-carousel__item__right');\n                            const orderClassName =\n                                status === 'entering' && (direction === 'right' ? 'msc-carousel__item__next' : 'msc-carousel__item__prev');\n                            const itemClasses = mapToCssModules(\n                                classNames(className, 'msc-carousel__item', isActive && 'active', directionClassName, orderClassName),\n                                cssModule\n                            );\n\n                            return (\n                                <Tag className={itemClasses} {...otherProps}>\n                                    {children}\n                                </Tag>\n                            );\n                        }}\n                    </Transition>\n                )}\n            </CarouselContext.Consumer>\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 { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n    format,\n    getPayloadObject,\n    getTelemetryAttributes,\n    IPayLoad,\n    mapToCssModules,\n    UncontrolledTooltip\n} from '@msdyn365-commerce-modules/utilities';\nimport classNames from 'classnames';\nimport debounce from 'lodash/debounce';\nimport * as React from 'react';\n\nimport { ICarouselProps } from './Carousel.props';\nimport CarouselContext from './CarouselContext';\nimport CarouselItem from './CarouselItem';\n\nexport interface ICarouselState {\n    direction: string;\n    indicatorClicked: boolean;\n}\n\nexport type carouselTransition = 'slide' | 'fade';\n\n/**\n * Carousel component.\n */\nexport default class Carousel extends React.Component<ICarouselProps, ICarouselState> {\n    public static defaultProps: Partial<ICarouselProps> = {\n        interval: 5000,\n        pause: 'hover',\n        keyboard: true,\n        slide: true,\n        hideIndicator: false\n    };\n\n    public props: ICarouselProps;\n\n    public state: ICarouselState;\n\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    public cycleInterval?: any;\n\n    private scrollStart: number | undefined;\n\n    private readonly payLoad: IPayLoad;\n\n    private readonly scrollThreshold: number;\n\n    private readonly linkRefPrev: React.RefObject<HTMLAnchorElement>;\n\n    private readonly linkRefNext: React.RefObject<HTMLAnchorElement>;\n\n    private readonly directionTextPrev: string = 'prev';\n\n    private readonly directionTextNext: string = 'next';\n\n    private readonly nextHandleInputThrottledEvent: (event: React.MouseEvent) => void;\n\n    private readonly previousHandleInputThrottledEvent: (event: React.MouseEvent) => void;\n\n    private readonly defaultThrottleThreshold: number = 200;\n\n    private readonly throttleThreshold: number;\n\n    constructor(props: ICarouselProps) {\n        super(props);\n        this.props = props;\n        this.throttleThreshold = this.props.threshold || this.defaultThrottleThreshold;\n        this.handleKeyPress = this.handleKeyPress.bind(this);\n        this._handleTouchStart = this._handleTouchStart.bind(this);\n        this._handleTouchEnd = this._handleTouchEnd.bind(this);\n        this.renderItems = this.renderItems.bind(this);\n        this.hoverStart = this.hoverStart.bind(this);\n        this.scrollThreshold = this.props.touchScrollThreshold !== undefined ? this.props.touchScrollThreshold : 100;\n        this.state = {\n            direction: 'right',\n            indicatorClicked: false\n        };\n        this._onClickPrev = this._onClickPrev.bind(this);\n        this._onClickNext = this._onClickNext.bind(this);\n        this._handleKeyPressPrev = this._handleKeyPressPrev.bind(this);\n        this._handleKeyPressNext = this._handleKeyPressNext.bind(this);\n        this.linkRefPrev = React.createRef();\n        this.linkRefNext = React.createRef();\n        this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n        this.nextHandleInputThrottledEvent = debounce(this._onClickNext, this.throttleThreshold);\n        this.previousHandleInputThrottledEvent = debounce(this._onClickPrev, this.throttleThreshold);\n    }\n\n    public componentDidMount(): void {\n        // Set up the cycle\n        if (this.props.ride === 'carousel') {\n            this.setInterval();\n        }\n\n        if (this.props.keyboard as boolean) {\n            document.addEventListener('keyup', this.handleKeyPress);\n        }\n    }\n\n    // eslint-disable-next-line react/no-deprecated\n    public componentWillReceiveProps(nextProps: ICarouselProps): void {\n        this.setInterval(nextProps);\n\n        const { activeIndex } = this.props;\n\n        if (activeIndex !== null) {\n            // Calculate the direction to turn\n            if (activeIndex < nextProps.activeIndex) {\n                this.setState({ direction: 'right' });\n            } else if (activeIndex > nextProps.activeIndex) {\n                this.setState({ direction: 'left' });\n            }\n            this.setState({ indicatorClicked: false });\n        }\n    }\n\n    public componentWillUnmount(): void {\n        this.clearInterval();\n        document.removeEventListener('keyup', this.handleKeyPress);\n    }\n\n    public setInterval = (props: ICarouselProps = this.props) => {\n        // Make sure not to have multiple intervals going...\n        this.clearInterval();\n\n        const { interval, autoplay } = props;\n        if (interval && !(autoplay === false)) {\n            this.cycleInterval = setInterval(\n                () => {\n                    props.next();\n                },\n\n                interval\n            );\n        }\n    };\n\n    public clearInterval = () => {\n        clearInterval(this.cycleInterval);\n    };\n\n    public hoverStart = (e: React.MouseEvent) => {\n        const { pause, mouseEnter } = this.props;\n\n        if (pause === 'hover') {\n            this.clearInterval();\n        }\n\n        if (mouseEnter) {\n            mouseEnter(e);\n        }\n    };\n\n    public hoverEnd = (e: React.MouseEvent) => {\n        const { pause, mouseLeave } = this.props;\n\n        if (pause === 'hover') {\n            this.setInterval();\n        }\n\n        if (mouseLeave) {\n            mouseLeave(e);\n        }\n    };\n\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    public handleKeyPress = (e: any) => {\n        const { keyboard, previous, next } = this.props;\n\n        if (keyboard) {\n            if (e.keyCode === 37) {\n                previous();\n            } else if (e.keyCode === 39) {\n                next();\n            }\n        }\n    };\n\n    public renderItems = (carouselItems: React.ReactNode[], className: string) => {\n        const { slide, handleOnExiting, handleOnExited, activeIndex, keys } = this.props;\n\n        const slides = ArrayExtensions.hasElements(carouselItems)\n            ? carouselItems.map((slotContent: React.ReactNode, index: number) => {\n                  return (\n                      <CarouselItem key={keys ? keys[index] : index} onExiting={handleOnExiting} onExited={handleOnExited}>\n                          {slotContent}\n                      </CarouselItem>\n                  );\n              })\n            : [];\n\n        return (\n            <div className={className}>\n                {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}\n                {slides.map((item: any, index: any) => {\n                    const isIn = index === activeIndex;\n\n                    return React.cloneElement(item, {\n                        in: isIn,\n                        slide\n                    });\n                })}\n            </div>\n        );\n    };\n\n    public shouldComponentUpdate(nextProps: ICarouselProps, nextState: ICarouselState): boolean {\n        const hasCurrentKeys = ArrayExtensions.hasElements(this.props.keys);\n        const hasNextKeys = ArrayExtensions.hasElements(nextProps.keys);\n        const isKeyDifferent = hasCurrentKeys && hasNextKeys && !ArrayExtensions.equals(this.props.keys!, nextProps.keys!);\n        return (\n            this.state !== nextState ||\n            this.props.next !== nextProps.next ||\n            this.props.previous !== nextProps.previous ||\n            hasCurrentKeys !== hasNextKeys ||\n            isKeyDifferent\n        );\n    }\n\n    public render(): JSX.Element | null {\n        const {\n            cssModule,\n            className,\n            transitionType,\n            dismissEnabled,\n            hideFlipper,\n            showPaginationTooltip,\n            items,\n            hideIndicator,\n            isDisabledFunctionality\n        } = this.props;\n\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        function carouselClass(transitionTypeValue: any): any {\n            switch (transitionTypeValue) {\n                case 'slide':\n                    return 'slide';\n                case 'fade':\n                    return 'carousel-fade';\n                default:\n                    return null;\n            }\n        }\n\n        const showTooltip = showPaginationTooltip !== undefined ? showPaginationTooltip : true;\n\n        const outerClasses = mapToCssModules(classNames(className, 'msc-carousel', carouselClass(transitionType)), cssModule);\n        const innerClasses = mapToCssModules(classNames('msc-carousel__inner'), cssModule);\n        const dismiss = dismissEnabled && this._renderDismissCarousel();\n        const indicators = !hideIndicator && this._renderIndicators(showTooltip);\n        const carouselControls = !hideFlipper && this._renderCarouselControls(showTooltip);\n        const direction = { direction: this.state.direction };\n        if (items && items.length) {\n            // Rendering indicators, slides and controls\n            return (\n                <CarouselContext.Provider value={direction}>\n                    <div\n                        className={outerClasses}\n                        onMouseEnter={isDisabledFunctionality ? undefined : this.hoverStart}\n                        onMouseLeave={isDisabledFunctionality ? undefined : this.hoverEnd}\n                        onTouchStart={isDisabledFunctionality ? undefined : this._handleTouchStart}\n                        onTouchEnd={isDisabledFunctionality ? undefined : this._handleTouchEnd}\n                    >\n                        {items && items.length && this.renderItems(items, innerClasses)}\n                        {!isDisabledFunctionality && items && items.length > 1 && carouselControls}\n                        {!isDisabledFunctionality && items && items.length > 1 && indicators}\n                        {dismiss}\n                    </div>\n                </CarouselContext.Provider>\n            );\n        }\n        return null;\n    }\n\n    private _handleTouchStart(evt: React.TouchEvent<HTMLDivElement>): void {\n        if (evt.touches.length === 0) {\n            this.scrollStart = undefined;\n        } else {\n            this.scrollStart = evt.touches[0].screenX;\n        }\n    }\n\n    private _handleTouchEnd(evt: React.TouchEvent<HTMLDivElement>): void {\n        if (evt.changedTouches.length > 0 && this.scrollStart !== undefined) {\n            const { previous, next } = this.props;\n            const newTarget: number = evt.changedTouches[0].screenX;\n\n            const delta = newTarget - this.scrollStart;\n\n            if (delta > this.scrollThreshold) {\n                previous();\n            }\n\n            if (delta < -this.scrollThreshold) {\n                next();\n            }\n        }\n\n        this.scrollStart = undefined;\n    }\n\n    private _renderIndicators(showTooltip: boolean): JSX.Element {\n        const { items, activeIndex, cssModule, onIndicatorsClickHandler, indicatorAriaText } = this.props;\n\n        const listClasses = mapToCssModules('msc-carousel__indicators', cssModule);\n        const indicators =\n            items &&\n            items.length &&\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            items.map((item: any, idx: number) => {\n                const indicatorClasses = mapToCssModules(classNames({ active: activeIndex === idx }), cssModule);\n\n                const label = indicatorAriaText ? format(indicatorAriaText, idx + 1) : '';\n                const indicatorId = 'indicatorSlide' + `${idx + 1}`;\n                this.payLoad.contentAction.etext = (idx + 1).toString();\n                const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n\n                return (\n                    <>\n                        <li\n                            id={indicatorId}\n                            aria-label={label}\n                            aria-setsize={items.length}\n                            aria-posinset={idx + 1}\n                            aria-selected={activeIndex === idx}\n                            key={`${item.key || item.src}${item.caption}${item.altText}`}\n                            role='tab'\n                            tabIndex={0}\n                            className={indicatorClasses}\n                            onClick={e => {\n                                e.preventDefault();\n                                onIndicatorsClickHandler(idx);\n                                this.setState({ indicatorClicked: true });\n                            }}\n                            {...attribute}\n                        />\n                        {showTooltip && (\n                            <UncontrolledTooltip trigger='hover focus' target={`${indicatorId}`}>\n                                {label}\n                            </UncontrolledTooltip>\n                        )}\n                    </>\n                );\n            });\n\n        return (\n            <ol className={listClasses} role='tablist'>\n                {indicators}\n            </ol>\n        );\n    }\n\n    private _renderCarouselControls(showTooltip: boolean): JSX.Element {\n        const { cssModule, directionTextPrev, directionTextNext } = this.props;\n\n        const anchorClassesPrev = mapToCssModules('msc-carousel__control__prev', cssModule);\n        const anchorClassesNext = mapToCssModules('msc-carousel__control__next', cssModule);\n        const iconClassesPrev = mapToCssModules('msc-carousel__control__prev__icon', cssModule);\n        const iconClassesNext = mapToCssModules('msc-carousel__control__next__icon', cssModule);\n        const screenReaderClasses = mapToCssModules('screen-reader-only', cssModule);\n        const indexNumber: number = 0;\n        this.payLoad.contentAction.etext = this.directionTextPrev;\n        const prevAttribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n        this.payLoad.contentAction.etext = this.directionTextNext;\n        const nextAttribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n\n        return (\n            <>\n                <a\n                    className={anchorClassesPrev}\n                    role='button'\n                    tabIndex={indexNumber}\n                    onClick={this.previousHandleInputThrottledEvent}\n                    onKeyUp={this._handleKeyPressPrev}\n                    ref={this.linkRefPrev}\n                    {...prevAttribute}\n                >\n                    <span className={iconClassesPrev} aria-hidden='true' />\n                    <span className={screenReaderClasses}>{directionTextPrev || this.directionTextPrev}</span>\n                </a>\n                {showTooltip && (\n                    <UncontrolledTooltip trigger='hover focus' target={this.linkRefPrev}>\n                        {directionTextPrev}\n                    </UncontrolledTooltip>\n                )}\n                <a\n                    className={anchorClassesNext}\n                    role='button'\n                    tabIndex={indexNumber}\n                    onClick={this.nextHandleInputThrottledEvent}\n                    onKeyUp={this._handleKeyPressNext}\n                    ref={this.linkRefNext}\n                    {...nextAttribute}\n                >\n                    <span className={iconClassesNext} aria-hidden='true' />\n                    <span className={screenReaderClasses}>{directionTextNext || this.directionTextNext}</span>\n                </a>\n                {showTooltip && (\n                    <UncontrolledTooltip trigger='hover focus' target={this.linkRefNext}>\n                        {directionTextNext}\n                    </UncontrolledTooltip>\n                )}\n            </>\n        );\n    }\n\n    private _onClickPrev(e: React.MouseEvent): void {\n        e.preventDefault();\n        this.props.previous();\n    }\n\n    private _onClickNext(e: React.MouseEvent): void {\n        e.preventDefault();\n        this.props.next();\n    }\n\n    private readonly _handleKeyPressPrev = (e: React.KeyboardEvent) => {\n        if (e.keyCode === 13) {\n            e.preventDefault();\n            this.props.previous();\n        }\n    };\n\n    private readonly _handleKeyPressNext = (e: React.KeyboardEvent) => {\n        // Handle Enter key\n        if (e.keyCode === 13) {\n            e.preventDefault();\n            this.props.next();\n        }\n    };\n\n    private _renderDismissCarousel(): JSX.Element {\n        const { handleDismissCarousel, dismissCarouselAriaText } = this.props;\n        return (\n            <button className='msc-carousel__dismiss msi msi-times' aria-label={dismissCarouselAriaText} onClick={handleDismissCarousel} />\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 { getUrlSync, IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport {\n    format,\n    getPayloadObject,\n    getTelemetryAttributes,\n    ITelemetryContent,\n    onTelemetryClick\n} from '@msdyn365-commerce-modules/utilities';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nexport interface ICartIconData {\n    cart?: ICartState;\n}\n\nexport interface ICartIconComponentProps extends IComponentProps<ICartIconData> {\n    className?: string;\n    cartLabel: string;\n    cartQtyLabel: string;\n    telemetryContent?: ITelemetryContent;\n}\n\nexport interface ICartIconComponent extends IComponent<ICartIconComponentProps> {}\n\nconst CartIconComponentActions = {};\n\n/**\n *\n * CartIcon component.\n * @extends {React.FC<ICartIconComponentProps>}\n */\nconst CartIcon: React.FC<ICartIconComponentProps> = observer((props: ICartIconComponentProps) => {\n    const {\n        cartLabel,\n        cartQtyLabel,\n        data: { cart }\n    } = props;\n    const cartLink = getUrlSync('cart', props.context.actionContext);\n\n    // If there are invoice lines, don't update mini cart item quantity\n    const cartItem = cart ? cart.totalItemsInCart : 0;\n    const qtyLabel = format(cartQtyLabel, cartItem);\n    const label = format(cartLabel, cartItem);\n\n    // Construct telemetry attribute to render\n    const payLoad = getPayloadObject('click', props.telemetryContent!, 'cart-icon', '');\n    const attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\n    const style: React.CSSProperties = {\n        visibility: cart ? 'visible' : 'hidden'\n    };\n    return (\n        <a\n            title={label}\n            className='msc-cart-icon msc-btn'\n            href={cartLink}\n            aria-label={label}\n            {...attributes}\n            onClick={onTelemetryClick(props.telemetryContent!, payLoad, 'cart-icon')}\n        >\n            <div className='msc-cart-icon__count' aria-hidden style={style}>\n                {qtyLabel}\n            </div>\n        </a>\n    );\n});\n\n// @ts-expect-error\nexport const CartIconComponent: React.FunctionComponent<ICartIconComponentProps> = msdyn365Commerce.createComponent<ICartIconComponent>(\n    'CartIcon',\n    { component: CartIcon, ...CartIconComponentActions }\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { Coupon } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n    Button,\n    format,\n    getPayloadObject,\n    getTelemetryAttributes,\n    IPayLoad,\n    ITelemetryContent,\n    TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { PriceComponent } from '..';\n\nexport interface IPromoCodeProps extends IComponentProps<{}> {\n    cart: ICartState | undefined;\n    promoCodeHeadingText: string;\n    appliedPromoCodeHeadingText: string;\n    removePromoAriaLabelFormat: string;\n    promoPlaceholderText: string;\n    promoCodeApplyButtonText: string;\n    collapseTimeOut: number;\n    removePromoText: string;\n    invalidPromoCodeErrorText: string;\n    failedToAddPromoCodeErrorText: string;\n    duplicatePromoCodeErrorText: string;\n    failedToRemovePromoCodeErrorText: string;\n\n    /**\n     * The telemetry content\n     */\n    telemetryContent?: ITelemetryContent;\n    promoCodeApplyCallback?(): void;\n}\n\nexport interface IPromoCodeComponent extends IComponent<IPromoCodeProps> {}\n\nconst PromoCodeComponentActions = {};\n\ninterface IPromoCodeState {\n    isCollapseOpen: boolean;\n    promoCodeInputValue: string;\n    error: string;\n    canApply: boolean;\n}\n\n/**\n *\n * The PromoCode component renders the promocode section.\n * @extends {React.PureComponent<IRefineSubmenuProps>}\n */\nclass PromoCode extends React.Component<IPromoCodeProps, IPromoCodeState> {\n    private readonly payLoad: IPayLoad;\n\n    constructor(props: IPromoCodeProps, state: IPromoCodeState) {\n        super(props);\n        this.payLoad = getPayloadObject('click', this.props.telemetryContent!, TelemetryConstant.ApplyPromoCode);\n        this.state = {\n            isCollapseOpen: false,\n            promoCodeInputValue: '',\n            error: '',\n            canApply: false\n        };\n    }\n\n    public shouldComponentUpdate(nextProps: IPromoCodeProps): boolean {\n        if (this.props.appliedPromoCodeHeadingText !== nextProps.appliedPromoCodeHeadingText) {\n            return false;\n        }\n        return true;\n    }\n\n    public render(): JSX.Element {\n        return (\n            <div>\n                <div className='msc-promo-code-heading'>{this.props.promoCodeHeadingText}</div>\n                {this._renderForm(this.props.promoPlaceholderText, this.props.promoCodeApplyButtonText, this.props.cart)}\n                <p className={this.state.error ? 'msc-alert-danger' : ''} aria-live='assertive'>\n                    {this.state.error}\n                </p>\n                {this._renderAppliedPromoCode(this.props)}\n            </div>\n        );\n    }\n\n    private readonly _onInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n        const error = e.target.value === '' ? '' : this.state.error;\n        this.setState({\n            promoCodeInputValue: e.target.value.trim(),\n            error,\n            canApply: !!e.target.value\n        });\n    };\n\n    private readonly _applyPromotion = (cartState: ICartState | undefined) => {\n        if (!cartState || !cartState.cart) {\n            return;\n        }\n        const appliedPromo = this.state.promoCodeInputValue;\n\n        cartState\n            .addPromoCode({ promoCode: appliedPromo })\n            .then(result => {\n                if (result.status === 'SUCCESS') {\n                    // Show success text\n                    this.setState({ promoCodeInputValue: '', error: '', canApply: false });\n                } else if (result.substatus === 'ALREADYADDED') {\n                    this.setState({ error: this.props.duplicatePromoCodeErrorText });\n                } else {\n                    this.setState({ error: this.props.invalidPromoCodeErrorText });\n                }\n            })\n            .catch(error => {\n                this.setState({ error: this.props.failedToAddPromoCodeErrorText });\n            });\n    };\n\n    private readonly _renderForm = (promoPlaceholderText: string, promoCodeApplyButtonText: string, cartState: ICartState | undefined) => {\n        const _onSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n            event.preventDefault();\n            this._applyPromotion(cartState);\n        };\n        const _applyPromotion = (event: React.MouseEvent<HTMLElement>) => {\n            this._applyPromotion(cartState);\n        };\n        const attributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n\n        return (\n            <form onSubmit={_onSubmit} className='msc-promo-code__form-container'>\n                <div className='msc-promo-code__group'>\n                    <input\n                        className='msc-promo-code__input-box'\n                        aria-label={promoPlaceholderText}\n                        onChange={this._onInputChange}\n                        value={this.state.promoCodeInputValue}\n                        placeholder={promoPlaceholderText}\n                    />\n                    <Button\n                        title={promoCodeApplyButtonText}\n                        className='msc-promo-code__apply-btn btn'\n                        onClick={_applyPromotion}\n                        disabled={!this.state.canApply}\n                        {...attributes}\n                    >\n                        {promoCodeApplyButtonText}\n                    </Button>\n                </div>\n            </form>\n        );\n    };\n\n    private readonly _removePromotion = (cartState: ICartState | undefined, event: React.MouseEvent) => {\n        if (!cartState) {\n            return;\n        }\n        const code = event.currentTarget.getAttribute('data-value') || '';\n        cartState\n            .removePromoCodes({\n                promoCodes: [code]\n            })\n            .then(result => {\n                if (result.status === 'SUCCESS') {\n                    this.setState({ error: '' });\n                }\n            })\n            .catch(() => {\n                this.setState({ error: this.props.failedToRemovePromoCodeErrorText });\n            });\n    };\n\n    private readonly _calculateDiscount = (code: string, cartState: ICartState | undefined) => {\n        if (!cartState || !cartState.cart || !cartState.cart.CartLines || cartState.cart.CartLines.length === 0 || !code) {\n            return;\n        }\n        let discountAmount = 0;\n        for (const line of cartState.cart.CartLines) {\n            if (line.DiscountLines) {\n                for (const discountLine of line.DiscountLines) {\n                    if (discountLine.DiscountCode === code) {\n                        discountAmount += discountLine.DiscountCost!;\n                    }\n                }\n            }\n        }\n        return discountAmount * -1;\n    };\n\n    private readonly _renderAppliedPromoCode = (props: IPromoCodeProps) => {\n        if (!props.cart || !props.cart.cart || !props.cart.cart.Coupons || !(props.cart.cart.Coupons.length > 0)) {\n            return;\n        }\n\n        const _removePromotion = (event: React.MouseEvent<HTMLElement>) => {\n            this._removePromotion(props.cart, event);\n        };\n        let totalCouponDiscountAmount = 0;\n        for (const coupon of props.cart.cart.Coupons) {\n            const discountAmount = this._calculateDiscount(coupon.Code ?? '', props.cart);\n            if (discountAmount) {\n                totalCouponDiscountAmount += discountAmount;\n            }\n        }\n\n        return (\n            <>\n                <div className='msc-promo-code__discount'>\n                    <div className='msc-promo-code__discount-heading'>{this.props.appliedPromoCodeHeadingText}</div>\n                    <PriceComponent\n                        data={{\n                            price: {\n                                CustomerContextualPrice: totalCouponDiscountAmount\n                            }\n                        }}\n                        context={props.context}\n                        id={props.id}\n                        typeName={props.typeName}\n                        className='msc-promo-code__discount-value'\n                    />\n                </div>\n                {props.cart.cart.Coupons.map((coupon: Coupon) => {\n                    const ariaLabel = props.removePromoAriaLabelFormat\n                        ? format(props.removePromoAriaLabelFormat, props.removePromoText, coupon.Code)\n                        : '';\n\n                    return (\n                        <div key={coupon.Code} className='msc-promo-code__line-container'>\n                            <div className='msc-promo-code__line-value'>\n                                {coupon.Code}\n                                {` `}\n                                <PriceComponent\n                                    data={{\n                                        price: {\n                                            CustomerContextualPrice: this._calculateDiscount(coupon.Code || '', props.cart)\n                                        }\n                                    }}\n                                    context={props.context}\n                                    id={props.id}\n                                    typeName={props.typeName}\n                                    className='msc-promo-code__line-discount-value'\n                                />\n                            </div>\n                            <Button\n                                title={props.removePromoText}\n                                className='msc-promo-code__line__btn-remove'\n                                onClick={_removePromotion}\n                                data-value={coupon.Code}\n                                aria-label={ariaLabel}\n                            >\n                                {props.removePromoText}\n                            </Button>\n                        </div>\n                    );\n                })}\n            </>\n        );\n    };\n}\n\n// @ts-expect-error\nexport const PromoCodeComponent: React.FunctionComponent<IPromoCodeProps> = msdyn365Commerce.createComponent<IPromoCodeComponent>(\n    'PromoCode',\n    { component: PromoCode, ...PromoCodeComponentActions }\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport React from 'react';\n\nimport classnames from 'classnames';\n\nimport { Button } from '@msdyn365-commerce-modules/utilities';\n\n/**\n * Class names used in component.\n */\nconst componentClassName = 'msc-action-menu';\nconst toggleMenuButtonClassName = `${componentClassName}__action-toggle`;\nconst actionsContainerClassName = `${componentClassName}__actions-container`;\n\n/**\n * IActionMenuComponent interface.\n */\ninterface IActionMenuComponent extends IComponent<IActionMenuProps> {}\n\n/**\n * IActionMenuProps interface.\n */\nexport interface IActionMenuProps extends IComponentProps<{}> {\n    className?: string;\n    isVisible?: boolean;\n    isDisabled?: boolean;\n    label?: string;\n    ariaLabel?: string;\n    title?: string;\n    children?: React.ReactNode | React.ReactNode[];\n    telemetryAttributes?: { [key: string]: string };\n    onClick?: (showActions: boolean) => void;\n}\n\nlet setShowPreviousActions: React.Dispatch<React.SetStateAction<boolean>> | undefined;\n\n/**\n * Menu function.\n * @param isShowActions - Whether actions should be visible or not.\n * @param setShowActions - Function to change the state.\n */\nconst toggle = (isShowActions: boolean, setShowActions: React.Dispatch<React.SetStateAction<boolean>>) => {\n    const shouldShowActions = !isShowActions;\n    if (shouldShowActions) {\n        if (setShowPreviousActions) {\n            setShowPreviousActions(false);\n        }\n        setShowActions(shouldShowActions);\n        setShowPreviousActions = setShowActions;\n    } else {\n        setShowPreviousActions = undefined;\n        setShowActions(shouldShowActions);\n    }\n};\n\n/**\n * ActionMenu component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst ActionMenuFunctionalComponent: React.FC<IActionMenuProps> = (props: IActionMenuProps) => {\n    const [showActions, setShowActions] = React.useState(false);\n\n    let children = props.children ?? [];\n    children = Array.isArray(children) ? children : [children];\n\n    const onClickHandler = (): void => {\n        toggle(showActions, setShowActions);\n        props.onClick?.(showActions);\n    };\n\n    const isVisible = props.isVisible ?? true;\n    if (!isVisible) {\n        return <></>;\n    }\n\n    return (\n        <div className={classnames(props.className, componentClassName)}>\n            <Button\n                className={classnames(\n                    toggleMenuButtonClassName,\n                    showActions ? `${toggleMenuButtonClassName}-active` : '',\n                    props.isDisabled ? `${toggleMenuButtonClassName}-disabled` : ''\n                )}\n                title={props.title ?? ''}\n                disabled={!!props.isDisabled}\n                aria-label={props.ariaLabel ?? props.label ?? ''}\n                aria-disabled={!!props.isDisabled}\n                onClick={onClickHandler}\n                {...props.telemetryAttributes}\n            >\n                {props.label}\n            </Button>\n            {showActions && <div className={classnames(actionsContainerClassName)}>{children}</div>}\n        </div>\n    );\n};\n\n/**\n * ActionMenu component.\n */\nexport const ActionMenuComponent: React.FunctionComponent<IActionMenuProps> = msdyn365Commerce.createComponent<IActionMenuComponent>(\n    'ActionMenuComponent',\n    { component: ActionMenuFunctionalComponent }\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { AsyncResult, CartLine, CommerceList, Customer, ProductDimension, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n    addLinesAsync,\n    createCommerceListAsync,\n    createGetByCustomerInput,\n    removeLinesAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/CommerceListsDataActions.g';\nimport { buildWishlistLine, getCustomer, GetCustomerInput } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, UncontrolledTooltip } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as Popper from 'popper.js';\nimport React, { useState } from 'react';\n\nexport interface IAddToWishlistComponentProps extends IComponentProps<IAddtoWishlistData> {\n    className?: string;\n    addToWishlistButtonText: string;\n    removeFromWishlistButtonText: string;\n    nameOfWishlist: string;\n\n    addToWishlistMessage?: string;\n    removedFromWishlistMessage?: string;\n    addItemToWishlistError?: string;\n    removeItemFromWishlistError?: string;\n\n    showButtonText?: boolean;\n    showButtonTooltip?: boolean;\n    tooltipPosition?: Popper.Placement;\n    showStatusMessage?: boolean;\n    showRemoveButton?: boolean;\n    disabled?: boolean;\n    cartline?: CartLine;\n    canAddMasterProduct?: boolean;\n    ariaRole?: string;\n\n    getSelectedProduct?: Promise<SimpleProduct | null>;\n\n    onSuccess?(result: IWishlistActionSuccessResult, cartline?: CartLine): void;\n    onError?(result: IWishlistActionErrorResult): void;\n}\n\nexport interface IWishlistActionSuccessResult {\n    status: 'ADDED' | 'REMOVED';\n}\n\nexport interface IWishlistActionErrorResult {\n    status: 'FAILED' | 'MISSINGDIMENSION';\n\n    missingDimensions?: ProductDimension[];\n}\n\ninterface IAddToWishlistStateManager {\n    waiting: boolean;\n    canRemove: boolean;\n    content: IAddtoWishlistContentState;\n\n    setWaiting(newWaiting: boolean): void;\n    setContent(newContent: IAddtoWishlistContentState): void;\n    setCanRemove(newCanRemove: boolean): void;\n}\n\ninterface IAddtoWishlistContentState {\n    showAlert?: boolean;\n    wishlistTextMessage?: string;\n    color?: string;\n}\n\ninterface IAddtoWishlistData {\n    wishlists?: CommerceList[];\n    product: SimpleProduct;\n}\n\nexport interface IAddtoWishlistComponent extends IComponent<IAddToWishlistComponentProps> {\n    onClick(): (event: React.MouseEvent<HTMLElement>, props: IAddToWishlistComponentProps, state: IAddToWishlistStateManager) => void;\n}\n\nconst onClick = async (\n    _event: React.MouseEvent<HTMLElement>,\n    props: IAddToWishlistComponentProps,\n    state: IAddToWishlistStateManager\n): Promise<void> => {\n    const { user } = props.context.request;\n    let { product } = props.data;\n\n    if (state.waiting) {\n        return;\n    }\n\n    if (!user.isAuthenticated && user.signInUrl && window) {\n        window.location.assign(user.signInUrl);\n\n        return;\n    }\n\n    state.setWaiting(true);\n    if (!(props.getSelectedProduct === undefined)) {\n        product = (await props.getSelectedProduct) || props.data.product;\n    }\n\n    await (doesProductExistInWishlist(product, props) ? removeFromWishlist(product, props, state) : addToWishlist(product, props, state));\n    state.setWaiting(false);\n};\n\nconst onDismiss = (state: IAddToWishlistStateManager): void => {\n    state.setContent({ color: 'success', showAlert: false });\n};\n\nconst AddToWishlistComponentActions = {\n    onClick,\n    onDismiss\n};\n\nconst AddToWishlist: React.FC<IAddToWishlistComponentProps> = (props: IAddToWishlistComponentProps) => {\n    const [waiting, setWaiting] = useState(false);\n    const [canRemove, setCanRemove] = useState(doesProductExistInWishlist(props.data.product, props));\n    const [content, setContent] = useState({});\n    const state: IAddToWishlistStateManager = {\n        waiting,\n        canRemove,\n        content,\n\n        setWaiting,\n        setCanRemove,\n        setContent\n    };\n\n    React.useEffect(() => {\n        setCanRemove(doesProductExistInWishlist(props.data.product, props));\n    }, [props]);\n\n    const {\n        removeFromWishlistButtonText,\n        addToWishlistButtonText,\n        ariaRole,\n        showStatusMessage,\n        showRemoveButton,\n        showButtonText,\n        className,\n        disabled,\n        showButtonTooltip,\n        tooltipPosition\n    } = props;\n\n    const onClickHandler = (event: React.MouseEvent<HTMLElement>) => {\n        return AddToWishlistComponentActions.onClick(event, props, state);\n    };\n    const onDismissHandler = () => {\n        AddToWishlistComponentActions.onDismiss(state);\n    };\n    const ariaLabel = state.canRemove ? removeFromWishlistButtonText : addToWishlistButtonText;\n    const addToWishlistRef: React.RefObject<HTMLButtonElement> = React.createRef();\n    const removeFromWishlistRef: React.RefObject<HTMLButtonElement> = React.createRef();\n    const showMessage = showStatusMessage !== undefined ? showStatusMessage : true;\n    const showButton = showRemoveButton !== undefined ? showRemoveButton : true;\n    const showTooltip = showButtonTooltip !== undefined ? showButtonTooltip : true;\n    const tooltipPos = showButtonTooltip !== undefined ? tooltipPosition : 'right';\n    const linkAriaRole = ariaRole !== undefined ? ariaRole : 'link';\n\n    if (state.canRemove && !showButton) {\n        return null;\n    }\n\n    return (\n        <>\n            {showButtonText ? (\n                <>\n                    <button\n                        className={classnames(\n                            'msc-add-to-wishlist',\n                            className,\n                            state.waiting ? 'msc-add-to-wishlist__waiting' : '',\n                            state.canRemove ? 'msc-add-to-wishlist__removing' : ''\n                        )}\n                        aria-label={ariaLabel}\n                        onClick={onClickHandler}\n                        disabled={disabled}\n                        ref={addToWishlistRef}\n                        role={linkAriaRole}\n                    >\n                        {ariaLabel}\n                    </button>\n                    {showTooltip && (\n                        <UncontrolledTooltip placement={tooltipPos} trigger='hover focus' target={addToWishlistRef}>\n                            {ariaLabel}\n                        </UncontrolledTooltip>\n                    )}\n                </>\n            ) : (\n                <>\n                    <button\n                        className={classnames(\n                            'msc-add-to-wishlist',\n                            className,\n                            state.waiting ? 'msc-add-to-wishlist__waiting' : '',\n                            state.canRemove ? 'msc-add-to-wishlist__removing' : ''\n                        )}\n                        aria-label={ariaLabel}\n                        onClick={onClickHandler}\n                        disabled={disabled}\n                        ref={removeFromWishlistRef}\n                        role={linkAriaRole}\n                    />\n                    {showTooltip && (\n                        <UncontrolledTooltip placement={tooltipPos} trigger='hover focus' target={addToWishlistRef}>\n                            {ariaLabel}\n                        </UncontrolledTooltip>\n                    )}\n                </>\n            )}\n            {state.content.showAlert && showMessage ? (\n                <div className='ms-wishlist-items__product-status'>\n                    <Alert color={state.content.color} isOpen={state.content.showAlert} toggle={onDismissHandler}>\n                        {state.content.wishlistTextMessage}\n                    </Alert>\n                </div>\n            ) : (\n                ''\n            )}\n        </>\n    );\n};\n\nconst doesProductExistInWishlist = (product: SimpleProduct, props: IAddToWishlistComponentProps): boolean => {\n    const { wishlists } = props.data;\n\n    if (!wishlists || !wishlists[0]) {\n        return false;\n    }\n\n    const { CommerceListLines } = wishlists[0];\n\n    if (!CommerceListLines || CommerceListLines.length === 0) {\n        return false;\n    }\n\n    for (const wishlistItem of CommerceListLines) {\n        if (wishlistItem.ProductId === product.RecordId) {\n            return true;\n        }\n    }\n\n    return false;\n};\n\nconst propagateSuccess = (props: IAddToWishlistComponentProps, result: IWishlistActionSuccessResult): void => {\n    const { onSuccess, cartline } = props;\n\n    if (onSuccess) {\n        cartline ? onSuccess(result, props.cartline) : onSuccess(result);\n    }\n};\n\nconst propagateError = (props: IAddToWishlistComponentProps, result: IWishlistActionErrorResult): void => {\n    const { onError } = props;\n\n    if (onError) {\n        onError(result);\n    }\n};\n\nconst addToWishlist = async (\n    product: SimpleProduct,\n    props: IAddToWishlistComponentProps,\n    state: IAddToWishlistStateManager\n): Promise<void> => {\n    const { canAddMasterProduct, context } = props;\n\n    if (product.Dimensions && !canAddMasterProduct) {\n        const missingDimensions = product.Dimensions.filter(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value));\n\n        if (missingDimensions.length > 0) {\n            // At least one dimension with no value exists on the product, won't be able to add to cart\n            propagateError(props, { status: 'MISSINGDIMENSION', missingDimensions });\n\n            return AsyncResult.resolve();\n        }\n    }\n\n    if (context.request.user.isAuthenticated) {\n        if (!props.data.wishlists || props.data.wishlists.length === 0) {\n            const wishlistName = props.nameOfWishlist;\n            const customer = await getCustomerAccount(props);\n            if (customer && customer.AccountNumber) {\n                const listData: CommerceList = {\n                    CustomerId: customer.AccountNumber,\n                    Name: wishlistName,\n\n                    // This is the type value specifically for a wishlist\n                    CommerceListTypeValue: 1,\n                    Id: 0\n                };\n\n                try {\n                    const commerceList = await createCommerceListAsync({ callerContext: context.actionContext }, listData);\n                    return callAddWishlistLine(props, state, commerceList.Id, product.RecordId);\n                } catch (error) {\n                    if (context.telemetry) {\n                        context.telemetry.warning(error);\n                        context.telemetry.debug('Unable to create a wishlist');\n                    }\n                    propagateError(props, { status: 'FAILED' });\n                }\n            } else {\n                context.telemetry.debug('Customer account number missing');\n            }\n        } else {\n            return callAddWishlistLine(props, state, props.data.wishlists[0].Id, product.RecordId);\n        }\n    }\n\n    return AsyncResult.resolve();\n};\n\nconst callAddWishlistLine = async (\n    props: IAddToWishlistComponentProps,\n    state: IAddToWishlistStateManager,\n    wishlistId: number,\n    productId: number\n): Promise<void> => {\n    const { context } = props;\n\n    try {\n        const customer = await getCustomerAccount(props);\n        if (customer && customer.AccountNumber) {\n            const createdCommerceList = await addLinesAsync({ callerContext: context.actionContext }, wishlistId, [\n                buildWishlistLine(productId, customer.AccountNumber, wishlistId)\n            ]);\n            context.actionContext.update(createGetByCustomerInput({}, null), [createdCommerceList]);\n            if (context.telemetry) {\n                context.telemetry.debug(`Added item to the wishlist ${createdCommerceList}`);\n            }\n            state.setCanRemove(true);\n            state.setContent({\n                color: 'success',\n                showAlert: true,\n                wishlistTextMessage: props.addToWishlistMessage ? props.addToWishlistMessage : 'Added to your wishlist'\n            });\n            propagateSuccess(props, { status: 'ADDED' });\n        } else {\n            context.telemetry.debug('Customer Account number missing');\n        }\n    } catch (error) {\n        if (context.telemetry) {\n            context.telemetry.warning(error);\n            context.telemetry.debug(`Unable to add item to wishlist ${error}`);\n        }\n\n        state.setContent({\n            color: 'danger',\n            showAlert: true,\n            wishlistTextMessage: props.addItemToWishlistError\n        });\n        propagateError(props, { status: 'FAILED' });\n    }\n};\n\nconst removeFromWishlist = async (\n    product: SimpleProduct,\n    props: IAddToWishlistComponentProps,\n    state: IAddToWishlistStateManager\n): Promise<void> => {\n    const { context, data, removedFromWishlistMessage, removeItemFromWishlistError } = props;\n    const { wishlists } = data;\n    const { actionContext, telemetry } = context;\n\n    // TODO Please fix customeraccount number null once Bug https://msdyneng.visualstudio.com/FinOps/_workitems/edit/481375 gets fixed.\n    if (context.request.user.isAuthenticated) {\n        if (wishlists && wishlists[0]) {\n            const wishlistLine = wishlists[0].CommerceListLines!.find(line => line.ProductId === product.RecordId);\n\n            if (wishlistLine) {\n                try {\n                    const customer = await getCustomerAccount(props);\n                    const commerceList = await removeLinesAsync({ callerContext: actionContext }, wishlists[0].Id, [wishlistLine]);\n                    if (customer) {\n                        context.actionContext.update(createGetByCustomerInput({}, null), [commerceList]);\n                    } else {\n                        telemetry.debug('Customer Account Number missing');\n                    }\n\n                    if (telemetry) {\n                        telemetry.debug(`[WishlistButton] ${product.RecordId} removed from Wishlist ${commerceList.Id}`);\n                    }\n                    state.setCanRemove(false);\n                    state.setContent({\n                        color: 'success',\n                        showAlert: true,\n                        wishlistTextMessage: removedFromWishlistMessage ? removedFromWishlistMessage : 'Removed item from the wishlist'\n                    });\n                    propagateSuccess(props, { status: 'REMOVED' });\n                } catch (error) {\n                    if (telemetry) {\n                        telemetry.warning(error);\n                        telemetry.debug('[WishlistButton] Error removing item from the wishlist');\n                    }\n\n                    state.setContent({\n                        color: 'danger',\n                        wishlistTextMessage: removeItemFromWishlistError\n                    });\n                    propagateError(props, { status: 'FAILED' });\n                }\n            }\n        } else if (telemetry) {\n            telemetry.debug(\"[WishlistButton] Can't remove from wishlist since no wishlist exisits OR there is no product data\");\n        }\n    }\n\n    return AsyncResult.resolve();\n};\n\nconst getCustomerAccount = (props: IAddToWishlistComponentProps): AsyncResult<Customer> => {\n    const { context } = props;\n    const customerInput = new GetCustomerInput(context.actionContext.requestContext.apiSettings);\n    return getCustomer(customerInput, context.actionContext);\n};\n\nexport const AddToWishlistComponent: React.FunctionComponent<IAddToWishlistComponentProps> = msdyn365Commerce.createComponent<\n    // @ts-expect-error\n    IAddtoWishlistComponent\n>('AddToWishlist', { component: AddToWishlist, ...AddToWishlistComponentActions });\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 { ICartState } from '@msdyn365-commerce/global-state';\nimport { CartLine, SalesLine } from '@msdyn365-commerce/retail-proxy';\nimport { debounce } from 'lodash';\nimport { IPriceEditorResources, PriceEditor } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\n/**\n * Resources for the cart line price editor.\n */\nexport interface ICartLinePriceEditorResources extends IPriceEditorResources {}\n\n/**\n * The props required to render the component.\n */\nexport interface ICartLinePriceEditorProps {\n    className: string;\n    context: ICoreContext;\n\n    resources: ICartLinePriceEditorResources;\n\n    cartLine: CartLine | SalesLine;\n    cartState: ICartState;\n}\n\n/**\n * The props required to render the component.\n */\nexport interface ICartLinePriceEditorState {\n    currentValue: number;\n}\n\n/**\n * Quantity Component - This component is used to allow input of quantity between a\n * range of values.\n */\nexport class CartLinePriceEditor extends React.PureComponent<ICartLinePriceEditorProps, ICartLinePriceEditorState> {\n    // @ts-expect-error\n    private cancellabelDebounce: debounce;\n    private readonly waitTime: number = 500;\n\n    public constructor(props: ICartLinePriceEditorProps) {\n        super(props);\n    }\n\n    public render(): JSX.Element {\n        const minimumPrice = 0.01;\n\n        return (\n            <PriceEditor\n                className={this.props.className}\n                resources={this.props.resources}\n                defaultAmount={this.props.cartLine.Price!}\n                maximumValue={this.props.cartLine.InvoiceAmount}\n                minimumValue={minimumPrice}\n                handleChange={this._handleChange}\n            />\n        );\n    }\n\n    /**\n     * Handles updates of the input and updates the cart line amount.\n     * @param newValue - New entered price for the cart line.\n     */\n    private readonly _handleChange = async (newValue: number) => {\n        if (this.cancellabelDebounce) {\n            this.cancellabelDebounce.cancel();\n        }\n\n        this.cancellabelDebounce = debounce(async () => {\n            await this.props.cartState.setInvoiceLinePrice({ cartLineId: this.props.cartLine.LineId ?? null, price: newValue });\n        }, this.waitTime);\n\n        setTimeout(() => {\n            this.cancellabelDebounce();\n        }, 0);\n    };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, {\n    IComponentProps,\n    IGridSettings,\n    IImageSettings,\n    Image,\n    isChannelTypeB2B,\n    msdyn365Commerce\n} from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ChannelDeliveryOptionConfiguration, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { CartLine, ProductCatalog, SalesLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n    ArrayExtensions,\n    getFallbackImageUrl,\n    ObjectExtensions,\n    StringExtensions,\n    validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classNames from 'classnames';\nimport * as React from 'react';\n\nimport { PriceComponent } from '../price';\nimport { CartLinePriceEditor, ICartLinePriceEditorResources } from './components';\n\n/**\n * ICartlineResourceString: Interface for specifying the\n * resource strings that the component needs.\n */\nexport interface ICartlineResourceString {\n    /**\n     * Display string for discount label.\n     */\n    discountStringText: string;\n\n    /**\n     * String for size key.\n     */\n    sizeString: string;\n\n    /**\n     * String for color key.\n     */\n    colorString: string;\n\n    /**\n     * String associated with the configuration product dimension.\n     */\n    configString: string;\n\n    /**\n     * String for style key.\n     */\n    styleString: string;\n\n    /**\n     * String for amount key.\n     */\n    amountString?: string;\n\n    /**\n     * Display string for quantity label.\n     */\n    quantityDisplayString: string;\n\n    /**\n     * Display string for quantity label.\n     */\n    inputQuantityAriaLabel: string;\n\n    /**\n     * Aria label for the decrement button in quantity component.\n     */\n    decrementButtonAriaLabel?: string;\n\n    /**\n     * Aria label for the increment button in quantity component.\n     */\n    incrementButtonAriaLabel?: string;\n\n    /**\n     * Original text screen reader.\n     */\n    originalPriceText: string;\n\n    /**\n     * Current text screen reader.\n     */\n    currentPriceText: string;\n\n    /**\n     * Shipping Charges Text.\n     */\n    shippingChargesText: string;\n\n    priceEditorResources?: ICartLinePriceEditorResources;\n\n    /**\n     * Sales agreement price prompt text.\n     */\n    salesAgreementPricePrompt?: string;\n\n    /**\n     * Shipping text.\n     */\n    shippingText?: string;\n\n    /**\n     * Shipping text.\n     */\n    confirmedShipDateLabel?: string;\n\n    /**\n     * Request Delivery text.\n     */\n    requestDeliveryDateLabel?: string;\n}\n\n/**\n * The data about the cart line and products.\n */\nexport interface ICartLineData {\n    cartLine: CartLine | SalesLine;\n    cartState?: ICartState;\n    product?: SimpleProduct;\n    catalogs?: ProductCatalog[];\n}\n\nexport type CartLineDisplayMode = 'DEFAULT' | 'COMPACT';\n\n/**\n * ICartLineProps: The props required to render cartLineitem.\n */\nexport interface ICartLineProps extends IComponentProps<ICartLineData> {\n    /**\n     * The flag to change the quantity component from interactivity to static.\n     */\n    disableQuantityInteractivity?: boolean;\n\n    /**\n     * The primary image url.\n     */\n    primaryImageUrl?: string;\n\n    /**\n     * The product url.\n     */\n    productUrl?: string;\n\n    /**\n     * GridSettings for the product image in cartLine.\n     */\n    gridSettings: IGridSettings;\n\n    /**\n     * ImageSettings for the product image in cartLine.\n     */\n    imageSettings: IImageSettings;\n\n    /**\n     * Boolean flag to indicate if the item is out of stock.\n     */\n    isOutOfStock?: boolean;\n\n    /**\n     * Flag to make quantity section editable.\n     */\n    isQuantityEditable?: boolean;\n\n    /**\n     * Max quantity for line item.\n     */\n    maxQuantity?: number;\n\n    /**\n     * Current quantity for line item.\n     */\n    currentQuantity?: number;\n\n    /**\n     * Resource string for the component.\n     */\n    resources: ICartlineResourceString;\n\n    /**\n     * SalesLine flag.\n     */\n    isSalesLine?: boolean;\n\n    /**\n     * Error message to show in place of quantity.\n     */\n    errorMessage?: string;\n\n    /**\n     * Display mode to use.\n     */\n    displayMode?: CartLineDisplayMode;\n\n    /**\n     * Inventory information label.\n     */\n    inventoryInformationLabel?: string;\n\n    /**\n     * Inventory information class name.\n     */\n    inventoryLabelClassName?: string;\n\n    /**\n     * Flag to show/hide shipping charges for line items.\n     */\n    showShippingChargesForLineItems?: boolean;\n\n    /**\n     * Boolean flag to indicate if cart state status is ready.\n     */\n    isCartStateReady?: boolean;\n\n    /**\n     * Chanel Delivery Option configuration is from api.\n     */\n    channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n    /**\n     * The telemetry content.\n     */\n    telemetryContent?: ITelemetryContent;\n\n    /**\n     * The cart line index.\n     */\n    lineIndex?: number;\n\n    /**\n     * The cart line delivery location.\n     */\n    deliveryLocation?: string;\n\n    /**\n     * Quantity onChange callback.\n     */\n    quantityOnChange?(cartLine: CartLine, newQuantity: number, lineIndex?: number): void;\n    priceCurrency?: string;\n\n    /**\n     * Sales line confirmed ship date.\n     */\n    confirmedShipDate?: string;\n\n    /**\n     * Sales line request delivery date.\n     */\n    requestDeliveryDate?: string;\n}\n\ninterface IDimensionStrings {\n    /**\n     * String for size key.\n     */\n    sizeString: string;\n\n    /**\n     * String for color key.\n     */\n    colorString: string;\n\n    /**\n     * String associated with the configuration product dimension.\n     */\n    configString: string;\n\n    /**\n     * String for style key.\n     */\n    styleString: string;\n\n    /**\n     * String for amount key.\n     */\n    amountString?: string;\n}\n\nconst CartLineItemFunctions = {\n    renderProductDimensions: (Product: SimpleProduct, DimensionStrings: IDimensionStrings) => {\n        if (!Product || !Product.Dimensions) {\n            return [];\n        }\n\n        return Product.Dimensions.map(productDimension => {\n            if (productDimension.DimensionTypeValue === 1) {\n                return (\n                    <div key={`${Product.RecordId}ProductDimensions1`} className='msc-cart-line__product-variant-item'>\n                        <span className='msc-cart-line__product-variant-color'>\n                            {DimensionStrings.colorString}\n                            <span className='name'>{productDimension.DimensionValue && productDimension.DimensionValue.Value}</span>\n                        </span>\n                    </div>\n                );\n            }\n\n            if (productDimension.DimensionTypeValue === 2) {\n                return (\n                    <div key={`${Product.RecordId}ProductDimensions2`} className='msc-cart-line__product-variant-item'>\n                        <span className='msc-cart-line__product-configuration'>\n                            {DimensionStrings.configString}\n                            <span className='name'>{productDimension.DimensionValue?.Value}</span>\n                        </span>\n                    </div>\n                );\n            }\n\n            if (productDimension.DimensionTypeValue === 3) {\n                return (\n                    <div key={`${Product.RecordId}ProductDimensions3`} className='msc-cart-line__product-variant-item'>\n                        <span className='msc-cart-line__product-variant-size'>\n                            {DimensionStrings.sizeString}\n                            <span className='name'>{productDimension.DimensionValue?.Value}</span>\n                        </span>\n                    </div>\n                );\n            }\n\n            if (productDimension.DimensionTypeValue === 4) {\n                return (\n                    <div key={`${Product.RecordId}ProductDimensions4`} className='msc-cart-line__product-variant-item'>\n                        <span className='msc-cart-line__product-variant-style'>\n                            {Product.IsGiftCard ? DimensionStrings.amountString : DimensionStrings.styleString}\n                            <span className='name'>{productDimension.DimensionValue?.Value}</span>\n                        </span>\n                    </div>\n                );\n            }\n            return null;\n        });\n    },\n    renderDiscountLines: (props: ICartLineProps) => {\n        if (!props.data.cartLine.DiscountLines || props.data.cartLine.DiscountLines.length === 0) {\n            return null;\n        }\n\n        return props.data.cartLine.DiscountLines.map((discountLine, index) => {\n            return (\n                <div key={discountLine.OfferId || index} className='msc-cart-line-item-product-discount'>\n                    <span className='msc-cart-line__product-savings-label'>\n                        {discountLine.OfferName ? discountLine.OfferName : ''}:{` ${props.resources.discountStringText || 'Discount'} `}\n                    </span>\n                    <span className='msc-cart-line__promo-codes'>\n                        {discountLine.DiscountCost && (\n                            <>\n                                <PriceComponent\n                                    data={\n                                        props.isSalesLine\n                                            ? {\n                                                  price: {\n                                                      CustomerContextualPrice: (props.data.cartLine as SalesLine).PeriodicDiscount\n                                                  }\n                                              }\n                                            : {\n                                                  price: {\n                                                      CustomerContextualPrice: props.data.cartLine.DiscountAmount,\n                                                      BasePrice: props.data.cartLine.DiscountAmount\n                                                  }\n                                              }\n                                    }\n                                    context={props.context}\n                                    id={props.id}\n                                    typeName={props.typeName}\n                                    className='msc-cart-line__discount-value'\n                                    currencyCode={props.priceCurrency}\n                                />\n                            </>\n                        )}\n                    </span>\n                    <span>{` (${discountLine.EffectivePercentage !== undefined ? discountLine.EffectivePercentage : ''}%)`}</span>\n                </div>\n            );\n        });\n    },\n    renderInventoryLabel: (props: ICartLineProps) => {\n        if (!props.inventoryInformationLabel) {\n            return null;\n        }\n        const inventoryCssName = props.inventoryLabelClassName\n            ? `msc-cart-line__product-inventory-label ${props.inventoryLabelClassName}`\n            : 'msc-cart-line__product-inventory-label';\n        return <span className={inventoryCssName}>{props.inventoryInformationLabel}</span>;\n    },\n\n    /**\n     * Gets the react node for product unit of measure display.\n     * @param  props - ICartLineProps props.\n     * @returns The node representing markup for unit of measure component.\n     */\n    renderUnitOfMeasure: (props: ICartLineProps) => {\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        const product = props.data.product;\n        if (!product || !product.DefaultUnitOfMeasure) {\n            return undefined;\n        }\n\n        return (\n            <div className='msc-cartline__product-unit-of-measure'>\n                <span>{product.DefaultUnitOfMeasure}</span>\n            </div>\n        );\n    },\n    renderShippingLabel: (props: ICartLineProps) => {\n        const pickupDeliveryModeCode = props.context.request.channel?.PickupDeliveryModeCode;\n        const channelDeliveryOptionConfig = props.channelDeliveryOptionConfig;\n        const cartline = props.data.cartLine;\n        let hasShippingMethod = false;\n        if (channelDeliveryOptionConfig !== undefined) {\n            hasShippingMethod = !!(\n                cartline.DeliveryMode &&\n                channelDeliveryOptionConfig.PickupDeliveryModeCodes?.some(deliveryMode => deliveryMode !== cartline.DeliveryMode)\n            );\n        } else {\n            hasShippingMethod = !!(cartline.DeliveryMode && cartline.DeliveryMode !== pickupDeliveryModeCode);\n        }\n        if (!hasShippingMethod) {\n            return undefined;\n        }\n\n        const shippingChargeLines = (cartline.ChargeLines || []).filter(chargeLine => chargeLine.IsShipping);\n\n        if (shippingChargeLines.length === 0) {\n            return undefined;\n        }\n\n        const freightFee = shippingChargeLines.reduce((chargeTotal, chargeLine) => {\n            return chargeTotal + (chargeLine.CalculatedAmount || 0);\n        }, 0);\n\n        const priceComponent = (\n            <PriceComponent\n                data={{\n                    price: {\n                        CustomerContextualPrice: freightFee\n                    }\n                }}\n                freePriceText='Free'\n                context={props.context}\n                id={props.id}\n                typeName={props.typeName}\n                className='msc-cart-line__freight-actual'\n                currencyCode={props.priceCurrency}\n            />\n        );\n        return (\n            <>\n                <label className='msc-cart-line__freight-label'>{`${props.resources.shippingChargesText}:`}</label>\n                <span className='shipping-value'>{priceComponent}</span>\n            </>\n        );\n    },\n    renderOtherCharges: (props: ICartLineProps) => {\n        const cartline = props.data.cartLine;\n        const otherCharges = cartline.ChargeLines?.filter(chargeline => !chargeline.IsShipping);\n\n        return (\n            (otherCharges &&\n                otherCharges.map((otherCharge, key) => {\n                    return otherCharge && otherCharge.CalculatedAmount ? (\n                        <div className='msc-cart-line__other-charges' key={key}>\n                            <label className='msc-cart-line__other-charges-label'>{`${otherCharge.Description}:`}</label>\n                            <span className='other-charge-value'>\n                                <PriceComponent\n                                    data={{\n                                        price: {\n                                            CustomerContextualPrice: otherCharge.CalculatedAmount\n                                        }\n                                    }}\n                                    context={props.context}\n                                    id={props.id}\n                                    typeName={props.typeName}\n                                    className='msc-cart-line__other-charges-actual'\n                                    currencyCode={props.priceCurrency}\n                                />\n                            </span>\n                        </div>\n                    ) : (\n                        ''\n                    );\n                })) ||\n            undefined\n        );\n    },\n\n    /**\n     * Render the sales agreement prompt.\n     * @param props - The ICartLineProps.\n     * @returns The JSX.Element.\n     */\n    renderSalesAgreementPrompt: (props: ICartLineProps): JSX.Element | null => {\n        if (props.data.cartLine.SalesAgreementLineRecordId === 0) {\n            return null;\n        }\n        return <div className='msc-cart-line__sales-agreement-prompt'>{props.resources.salesAgreementPricePrompt}</div>;\n    },\n\n    renderConfirmedShipDate: (props: ICartLineProps) => {\n        if (!props.isSalesLine || props.confirmedShipDate === undefined || StringExtensions.isNullOrEmpty(props.confirmedShipDate)) {\n            return null;\n        }\n        const shipDateCssName = 'msc-cart-line__confirmed-ship-date';\n        return (\n            <>\n                <span className={shipDateCssName}>{props.resources.confirmedShipDateLabel}</span>\n                <span className={shipDateCssName}>{props.confirmedShipDate}</span>\n            </>\n        );\n    },\n\n    renderRequestDeliveryDate: (props: ICartLineProps) => {\n        if (!props.isSalesLine || props.requestDeliveryDate === undefined || StringExtensions.isNullOrEmpty(props.requestDeliveryDate)) {\n            return null;\n        }\n        const reqDateCssName = 'msc-cart-line__request-delivery-date';\n        return (\n            <>\n                <span className={reqDateCssName}>{props.resources.requestDeliveryDateLabel}</span>\n                <span className={reqDateCssName}>{props.requestDeliveryDate}</span>\n            </>\n        );\n    }\n};\n\n/**\n * Renders catalog label for the cart line.\n * @param props - Cart line props.\n * @returns Catalog label.\n */\nconst CatalogLabelComponent: React.FC<ICartLineProps> = (props: ICartLineProps) => {\n    const catalogId = props.data.cartLine.CatalogId;\n    validateCatalogId(catalogId);\n\n    if (!isChannelTypeB2B(props.context.actionContext.requestContext) || !catalogId || !ArrayExtensions.hasElements(props.data.catalogs)) {\n        return null;\n    }\n\n    const catalog = props.data.catalogs.find(item => item.RecordId === catalogId);\n\n    if (!catalog || !catalog.Name) {\n        return null;\n    }\n\n    return <div className='msc-cart-line__catalog-label'>{catalog.Name}</div>;\n};\n\n// eslint-disable-next-line no-redeclare\nconst CartLine: React.FC<ICartLineProps> = (props: ICartLineProps) => {\n    const { isSalesLine, productUrl, resources } = props;\n    const { product, cartLine } = props.data;\n\n    const destructDimensionStrings = {\n        sizeString: resources.sizeString,\n        colorString: resources.colorString,\n        styleString: resources.styleString,\n        configString: resources.configString,\n        amountString: resources.amountString\n    };\n    const fallbackImageUrl =\n        product &&\n        getFallbackImageUrl(\n            product.ItemId,\n            props.context.actionContext.requestContext.apiSettings,\n            props.context.app?.config?.OmniChannelMedia\n        );\n    const imageSettings = props.imageSettings;\n    imageSettings.cropFocalRegion = !ObjectExtensions.isNullOrUndefined(imageSettings);\n    const { inputQuantityAriaLabel } = props.resources;\n    const productDimensions = product && CartLineItemFunctions.renderProductDimensions(product, destructDimensionStrings);\n    const renderDiscountLines = CartLineItemFunctions.renderDiscountLines(props);\n    const renderInventoryLabel = CartLineItemFunctions.renderInventoryLabel(props);\n    const renderUnitOfMeasure = CartLineItemFunctions.renderUnitOfMeasure(props);\n    const renderShippingLabel = CartLineItemFunctions.renderShippingLabel(props);\n    const renderOtherCharges = CartLineItemFunctions.renderOtherCharges(props);\n    const renderConfirmedShipDate = CartLineItemFunctions.renderConfirmedShipDate(props);\n    const renderSalesAgreementPrompt = CartLineItemFunctions.renderSalesAgreementPrompt(props);\n    const payLoad = getPayloadObject('click', props.telemetryContent!, '', product?.RecordId.toString());\n    const prodAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n    const productName = product?.Name || cartLine.Description;\n    const imgeClassName = props.data.cartLine.IsInvoiceLine ? 'msc-cart-line__invoice-image' : 'msc-cart-line__product-image';\n\n    const _generateErrorMessage = (): JSX.Element | null => {\n        if (props.errorMessage) {\n            return (\n                <div className='msc-cart-line__error-message msc-alert__header'>\n                    <span className='msi-exclamation-triangle' />\n                    <span>{props.errorMessage}</span>\n                </div>\n            );\n        }\n\n        return null;\n    };\n\n    const _updateQuantity = (event: React.ChangeEvent<HTMLSelectElement>) => {\n        if (props.quantityOnChange) {\n            props.quantityOnChange(props.data.cartLine, Number.parseInt(event.target.value, 10), props.lineIndex);\n        }\n    };\n\n    const _generateMenu = (quantity: number) => {\n        const nodes = [];\n\n        for (let i = 1; i <= quantity; i++) {\n            nodes.push(\n                <option className='msc-cart-line__quantity__select-menu__item' value={i}>\n                    {i}\n                </option>\n            );\n        }\n\n        return nodes;\n    };\n\n    const _generateSelectMenu = (quantity: number, currentQuantity: number | undefined): JSX.Element => {\n        return (\n            <select\n                className='msc-cart-line__quantity__select-menu'\n                aria-label={inputQuantityAriaLabel}\n                value={currentQuantity}\n                onChange={_updateQuantity}\n            >\n                {_generateMenu(quantity)}\n            </select>\n        );\n    };\n\n    const _generateQuantityAndPrice = (): JSX.Element[] | null => {\n        const nodes = [];\n\n        if (props.isOutOfStock) {\n            return null;\n        }\n\n        // No quantity selector for invoice line\n        if (!props.data.cartLine.IsInvoiceLine) {\n            if (props.isQuantityEditable && !props.data.product?.IsGiftCard) {\n                nodes.push(_generateSelectMenu(props.maxQuantity || 10, props.currentQuantity));\n            } else {\n                nodes.push(\n                    <div className={classNames('msc-cart-line__quantity', { 'single-quantity': props.data.cartLine.Quantity === 1 })}>\n                        <label className='quantity-label'>{resources.quantityDisplayString}</label>\n                        <span className='quantity-value'>{props.data.cartLine.Quantity}</span>\n                    </div>\n                );\n            }\n        }\n\n        nodes.push(\n            <div className='msc-cart-line__product-price'>\n                <PriceComponent\n                    data={\n                        isSalesLine\n                            ? {\n                                  price: {\n                                      CustomerContextualPrice: (props.data.cartLine as SalesLine).NetAmountWithAllInclusiveTax,\n                                      BasePrice: (props.data.cartLine as SalesLine).GrossAmount\n                                  }\n                              }\n                            : {\n                                  price: {\n                                      CustomerContextualPrice: (props.data.cartLine as CartLine).ExtendedPrice,\n                                      BasePrice: props.data.cartLine.NetPrice\n                                  }\n                              }\n                    }\n                    context={props.context}\n                    id={props.id}\n                    typeName={props.typeName}\n                    className='discount-value'\n                    originalPriceText={resources.originalPriceText}\n                    currentPriceText={resources.currentPriceText}\n                    salesAgreementLineId={props.data.cartLine.SalesAgreementLineRecordId}\n                    currencyCode={props.priceCurrency}\n                />\n            </div>\n        );\n\n        return nodes;\n    };\n\n    if (props.displayMode === 'COMPACT') {\n        const reducedDimensions: string = product?.Dimensions\n            ? product.Dimensions.reduce<string>((str, productDimension) => {\n                  if (productDimension.DimensionValue?.Value) {\n                      if (str) {\n                          return `${str}, ${productDimension.DimensionValue.Value}`;\n                      }\n\n                      return `${productDimension.DimensionValue.Value}`;\n                  }\n\n                  return str;\n              }, '')\n            : '';\n\n        return (\n            <div className='msc-cart-line msc-cart-line__compact'>\n                <div className={imgeClassName}>\n                    <Image\n                        requestContext={props.context.actionContext.requestContext}\n                        src={props.primaryImageUrl ?? 'empty'}\n                        fallBackSrc={fallbackImageUrl}\n                        altText={productName}\n                        gridSettings={props.gridSettings}\n                        imageSettings={imageSettings}\n                        loadFailureBehavior='empty'\n                    />\n                </div>\n                <div className='msc-cart-line__content'>\n                    {MsDyn365.isBrowser ? (\n                        <a className='msc-cart-line__product-title' {...prodAttribute} href={productUrl} key={productUrl}>\n                            {productName}\n                        </a>\n                    ) : null}\n                    {reducedDimensions !== '' ? <div className='msc-cart-line__product-variants'>{reducedDimensions}</div> : ''}\n                    {renderUnitOfMeasure}\n                    {_generateQuantityAndPrice()}\n                    {props.data.cartLine.IsInvoiceLine && props.data.cartState && props.resources.priceEditorResources && (\n                        <CartLinePriceEditor\n                            className='msc-cart-line__price-editor-container'\n                            context={props.context}\n                            resources={props.resources.priceEditorResources}\n                            cartState={props.data.cartState}\n                            cartLine={props.data.cartLine}\n                        />\n                    )}\n                </div>\n                {_generateErrorMessage()}\n            </div>\n        );\n    }\n\n    return (\n        <>\n            <div className='msc-cart-line'>\n                <div className={imgeClassName}>\n                    <Image\n                        requestContext={props.context.actionContext.requestContext}\n                        src={props.primaryImageUrl ?? ''}\n                        fallBackSrc={fallbackImageUrl}\n                        altText={productName}\n                        gridSettings={props.gridSettings}\n                        imageSettings={imageSettings}\n                        loadFailureBehavior='empty'\n                    />\n                </div>\n                <div className='msc-cart-line__content'>\n                    <div className='msc-cart-line__product'>\n                        <CatalogLabelComponent {...props} />\n                        {MsDyn365.isBrowser ? (\n                            <a className='msc-cart-line__product-title' {...prodAttribute} href={productUrl} key={productUrl}>\n                                {productName}\n                            </a>\n                        ) : null}\n                        {ArrayExtensions.hasElements(productDimensions) ? (\n                            <div className='msc-cart-line__product-variants'>{productDimensions}</div>\n                        ) : (\n                            ''\n                        )}\n                        {renderUnitOfMeasure}\n                        {renderDiscountLines}\n                        {renderInventoryLabel}\n                        {props.showShippingChargesForLineItems && <div className='msc-cart-line__freight'>{renderShippingLabel}</div>}\n                        {renderOtherCharges}\n                        {renderConfirmedShipDate}\n                        {renderSalesAgreementPrompt}\n                    </div>\n                    {_generateQuantityAndPrice()}\n                    {props.data.cartLine.IsInvoiceLine && props.data.cartState && props.resources.priceEditorResources && (\n                        <CartLinePriceEditor\n                            className='msc-cart-line__price-editor-container'\n                            context={props.context}\n                            resources={props.resources.priceEditorResources}\n                            cartState={props.data.cartState}\n                            cartLine={props.data.cartLine}\n                        />\n                    )}\n                </div>\n            </div>\n            {_generateErrorMessage()}\n        </>\n    );\n};\n\n// @ts-expect-error\nexport const CartLineItemComponent: React.FunctionComponent<ICartLineProps> = msdyn365Commerce.createComponent<ICartline>('CartLineItem', {\n    component: CartLine,\n    ...CartLineItemFunctions\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 { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport React from 'react';\n\nimport { ISwatchItem, SwatchComponent } from '../../product-dimension';\n\n/**\n * Props for product component swatch.\n */\nexport interface IProductComponentSwatchProps {\n    context: ICoreContext;\n    swatches: ISwatchItem[];\n    dimensionType?: string;\n    onSelectDimension(coreContext: ICoreContext, swatchItem: ISwatchItem, dimensionType?: string): void;\n}\n\n/**\n * Swatch for the product component.\n * @param props - Swatch props.\n * @returns React element.\n */\nexport const ProductComponentSwatchComponent: React.FC<IProductComponentSwatchProps> = (props: IProductComponentSwatchProps) => {\n    const { context, dimensionType, swatches, onSelectDimension } = props;\n\n    const onSelectItem = React.useCallback(\n        (item: ISwatchItem) => {\n            onSelectDimension(context, item, dimensionType);\n        },\n        [onSelectDimension, context, dimensionType]\n    );\n    if (ArrayExtensions.hasElements(swatches)) {\n        return <SwatchComponent apiSettings={context.request.apiSettings} list={swatches} onSelectItem={onSelectItem} />;\n    }\n\n    return <div className='msc-swatch-empty' />;\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 {\n    getCatalogId,\n    IComponent,\n    IComponentProps,\n    ICoreContext,\n    IGridSettings,\n    IImageData,\n    IImageProps,\n    IImageSettings,\n    Image,\n    IRequestContext,\n    msdyn365Commerce\n} from '@msdyn365-commerce/core';\nimport {\n    AttributeSwatch,\n    ProductDimension,\n    ProductPrice,\n    ProductSearchResult,\n    ProductType,\n    SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n    ArrayExtensions,\n    checkIfShouldDisplayAsSwatch,\n    convertDimensionTypeToProductDimensionType,\n    Dictionary,\n    DimensionSwatchDisplayTypes,\n    DimensionTypes,\n    generateImageUrl,\n    getProductPageUrlSync,\n    IDimensionsApp,\n    StringExtensions,\n    validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n    format,\n    getPayloadObject,\n    getTelemetryAttributes,\n    ITelemetryContent,\n    onTelemetryClick\n} from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nimport { IPriceComponentResources, PriceComponent } from '../price/price.components';\nimport { ISwatchItem } from '../product-dimension';\nimport { RatingComponent } from '../rating/rating.component';\nimport { ProductComponentSwatchComponent } from './components';\n\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult; productPrice?: ProductPrice }> {\n    className?: string;\n    imageSettings?: IImageSettings;\n    savingsText?: string;\n    freePriceText?: string;\n    originalPriceText?: string;\n    currentPriceText?: string;\n    ratingAriaLabel?: string;\n    ratingCountAriaLabel?: string;\n    allowBack?: boolean;\n    telemetryContent?: ITelemetryContent;\n    quickViewButton?: React.ReactNode;\n    productComparisonButton?: React.ReactNode;\n    inventoryLabel?: string;\n    isPriceMinMaxEnabled?: boolean;\n    priceResources?: IPriceComponentResources;\n    dimensionAvailabilities?: IProductsDimensionsAvailabilities[];\n    swatchItemAriaLabel?: string;\n}\n\nexport interface IProductComponent extends IComponent<IProductComponentProps> {}\n\nconst PriceComponentActions = {};\n\n/**\n * Renders product comparison button similar to the quick view button.\n * @param productComparisonButton - React element of the button.\n * @param product - Current product info.\n * @param catalogId - Current catalog.\n * @returns React element for the specific product.\n */\nfunction renderProductComparisonButton(\n    productComparisonButton: React.ReactNode,\n    product: ProductSearchResult,\n    catalogId: number\n): JSX.Element | undefined {\n    validateCatalogId(catalogId);\n    return React.cloneElement(productComparisonButton as React.ReactElement, { product, catalogId });\n}\n\nconst ProductCard: React.FC<IProductComponentProps> = ({\n    data,\n    context,\n    imageSettings,\n    savingsText,\n    freePriceText,\n    originalPriceText,\n    currentPriceText,\n    ratingAriaLabel,\n    ratingCountAriaLabel,\n    allowBack,\n    typeName,\n    id,\n    telemetryContent,\n    quickViewButton,\n    productComparisonButton,\n    inventoryLabel,\n    isPriceMinMaxEnabled,\n    priceResources,\n    dimensionAvailabilities,\n    swatchItemAriaLabel\n}) => {\n    const product = data.product;\n    const productPrice = data.productPrice;\n    const dimensionContext = context as ICoreContext<IDimensionsApp>;\n    const dimensionToPreSelectInProductCard = dimensionContext.app.config.dimensionToPreSelectInProductCard;\n\n    /**\n     * Updates the product url link to product details page.\n     * @param  productDetailsPageUrl - Product page url.\n     * @param  coreContext - Context of the module using the component.\n     * @param  queryString - Querystring to be added to the URL.\n     * @returns The update product page url.\n     */\n    function updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\n        const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\n        if (sourceUrl.search) {\n            sourceUrl.search += `&${queryString}`;\n        } else {\n            sourceUrl.search += queryString;\n        }\n\n        const updatedUrl = new URL(sourceUrl.href);\n        return updatedUrl.pathname + sourceUrl.search;\n    }\n\n    /**\n     * Gets the product page url from the default swatch selected.\n     * @param  productData - Product card to be rendered.\n     * @returns The default swatch selected if any.\n     */\n    function getDefaultSwatchSelected(productData?: ProductSearchResult): AttributeSwatch | null {\n        if (!productData || !productData.AttributeValues) {\n            return null;\n        }\n\n        const attributeSwatches = productData.AttributeValues.find(\n            attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === dimensionToPreSelectInProductCard\n        )?.Swatches;\n\n        if (!ArrayExtensions.hasElements(attributeSwatches)) {\n            return null;\n        }\n\n        const defaultSwatch = attributeSwatches.find(item => item.IsDefault === true) ?? attributeSwatches[0];\n        return defaultSwatch;\n    }\n\n    /**\n     * Gets the product image from the default swatch selected.\n     * @param  coreContext - Context of the module using the component.\n     * @param  productData - Product card to be rendered.\n     * @returns The product card image url.\n     */\n    function getProductImageUrlFromDefaultSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\n        const defaultSwatch = getDefaultSwatchSelected(productData);\n        const swatchProductImageUrls = defaultSwatch?.ProductImageUrls;\n        if (!ArrayExtensions.hasElements(swatchProductImageUrls)) {\n            return productData?.PrimaryImageUrl;\n        }\n\n        return generateImageUrl(swatchProductImageUrls[0], coreContext.request.apiSettings);\n    }\n\n    /**\n     * Gets the product page url from the default swatch selected.\n     * @param  coreContext - Context of the module using the component.\n     * @param productUrl - Product page url for the product card.\n     * @param  productData - Product card to be rendered.\n     * @returns The product card image url.\n     */\n    function getProductPageUrlFromDefaultSwatch(\n        coreContext: ICoreContext,\n        productUrl: string,\n        productData?: ProductSearchResult\n    ): string | undefined {\n        const defaultSwatch = getDefaultSwatchSelected(productData);\n        if (!defaultSwatch?.SwatchValue) {\n            return productUrl;\n        }\n\n        const queryStringEncoded = encodeURIComponent(defaultSwatch.SwatchValue);\n        const queryString = `${dimensionToPreSelectInProductCard}=${queryStringEncoded}`;\n        return updateProductUrl(productUrl, coreContext, queryString);\n    }\n\n    let productUrl = product ? getProductPageUrlSync(product.Name ?? '', product.RecordId, context.actionContext, undefined) : '';\n    if (allowBack && productUrl) {\n        productUrl = updateProductUrl(productUrl, context, 'back=true');\n    }\n\n    const productImageUrlFromSwatch = getProductImageUrlFromDefaultSwatch(context, product) ?? product?.PrimaryImageUrl;\n    const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\n\n    const [productPageUrl, setProductPageUrl] = useState<string>(productPageUrlFromSwatch);\n    const [productImageUrl, setProductImageUrl] = useState<string | undefined>(productImageUrlFromSwatch);\n    const [selectedSwatchItems] = useState(new Dictionary<DimensionTypes, ISwatchItem>());\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\n    const enableStockCheck = context.app.config.enableStockCheck;\n\n    /**\n     * Updates the product page and Image url based on swatch selected.\n     * @param coreContext - Context of the caller.\n     * @param swatchItem - Dimension swatch selected.\n     */\n    const updatePageAndImageUrl = React.useCallback(\n        (coreContext: ICoreContext, swatchItem: ISwatchItem) => {\n            const dimensionType = swatchItem.dimensionType;\n            selectedSwatchItems.setValue(dimensionType, swatchItem);\n            if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\n                return;\n            }\n            const queryString = `${dimensionType}=${swatchItem.value}`;\n            let productPageUrlWithSwatch = '';\n            if (productPageUrl.includes(dimensionType)) {\n                const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\n                newUrl.searchParams.delete(dimensionType);\n                productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\n            } else {\n                productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\n            }\n            setProductPageUrl(productPageUrlWithSwatch);\n            if (dimensionType === dimensionToPreSelectInProductCard) {\n                const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls)\n                    ? swatchItem.productImageUrls[0]\n                    : undefined;\n                const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\n                setProductImageUrl(newImageUrl);\n            }\n        },\n        [selectedSwatchItems, context, productPageUrl]\n    );\n\n    if (!product) {\n        return null;\n    }\n\n    const swatchItems = ArrayExtensions.validValues(\n        product.AttributeValues?.map(item => {\n            const dimensionTypeValue = item.KeyName?.toLocaleLowerCase() ?? '';\n            const shouldDisplayAsSwatch = checkIfShouldDisplayAsSwatch(\n                dimensionTypeValue as DimensionTypes,\n                context as ICoreContext<IDimensionsApp>,\n                DimensionSwatchDisplayTypes.productCard\n            );\n            if (!shouldDisplayAsSwatch) {\n                return null;\n            }\n\n            const dimensionType = dimensionTypeValue as DimensionTypes;\n            const swatches =\n                item.Swatches?.map<ISwatchItem>(swatchItem => {\n                    return {\n                        itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\n                        value: swatchItem.SwatchValue ?? '',\n                        dimensionType,\n                        colorHexCode: swatchItem.SwatchColorHexCode,\n                        imageUrl: swatchItem.SwatchImageUrl,\n                        productImageUrls: swatchItem.ProductImageUrls,\n                        isDefault: swatchItem.IsDefault,\n                        swatchItemAriaLabel: swatchItemAriaLabel ? format(swatchItemAriaLabel, dimensionType) : '',\n                        isDisabled:\n                            enableStockCheck &&\n                            dimensionAvailabilities?.find(\n                                dimensionAvailability => dimensionAvailability.value === (swatchItem.SwatchValue ?? '')\n                            )?.isDisabled\n                    };\n                }) ?? [];\n            if (\n                dimensionType === dimensionToPreSelectInProductCard &&\n                ArrayExtensions.hasElements(swatches) &&\n                !swatches.some(swatch => swatch.isDefault)\n            ) {\n                swatches[0].isDefault = true;\n            }\n            return { recordId: item.RecordId, swatches };\n        })\n    );\n\n    // Construct telemetry attribute to render\n    const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\n\n    const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\n    const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\n\n    /**\n     * Gets the react node for product unit of measure display.\n     * @param  unitOfMeasure - DefaultUnitOfMeasure property from product.\n     * @returns The node representing markup for unit of measure component.\n     */\n    function renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\n        if (!unitOfMeasure) {\n            return null;\n        }\n        return (\n            <div className='msc-product__unit-of-measure'>\n                <span>{unitOfMeasure}</span>\n            </div>\n        );\n    }\n\n    /**\n     * Gets the react node for product availability.\n     * @param inventoryAvailabilityLabel - The product information.\n     * @returns The node representing markup for product availability.\n     */\n    function renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\n        if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\n            return null;\n        }\n\n        return (\n            <div className='msc-product__availability'>\n                <span>{inventoryAvailabilityLabel}</span>\n            </div>\n        );\n    }\n\n    /**\n     * Gets the react node for product dimension as swatch.\n     * @returns The node representing markup for unit of measure component.\n     */\n    function renderProductDimensions(): JSX.Element | null {\n        if (!ArrayExtensions.hasElements(swatchItems)) {\n            return null;\n        }\n\n        return (\n            <div className='msc-product__dimensions'>\n                {swatchItems.map(item => {\n                    return (\n                        <ProductComponentSwatchComponent\n                            key={item.recordId}\n                            context={context}\n                            onSelectDimension={updatePageAndImageUrl}\n                            swatches={item.swatches}\n                        />\n                    );\n                })}\n            </div>\n        );\n    }\n\n    /**\n     * Gets the react node for  product description.\n     * @param  quickview - Quick view node.\n     * @param  item - Product id to de displayed in quickview.\n     * @returns The product quickview component.\n     */\n    function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\n        if (quickview === null) {\n            return undefined;\n        }\n        const selectedDimensions: ProductDimension[] = selectedSwatchItems.getValues().map<ProductDimension>(swatches => {\n            return {\n                DimensionTypeValue: convertDimensionTypeToProductDimensionType(swatches.dimensionType),\n                DimensionValue: {\n                    RecordId: 0,\n                    Value: swatches.value\n                }\n            };\n        });\n        return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions });\n    }\n\n    /**\n     * Gets the aria label for rating.\n     * @param  rating - Product rating.\n     * @param  ratingAriaLabelText - Aria label format for rating.\n     * @returns The product rating aria label string.\n     */\n    function getRatingAriaLabel(rating?: number, ratingAriaLabelText?: string): string {\n        if (rating && ratingAriaLabelText) {\n            const roundedRating = rating.toFixed(2);\n            return format(ratingAriaLabelText || '', roundedRating, '5');\n        }\n        return '';\n    }\n\n    /**\n     * Gets the aria label for review count.\n     * @param  reviewCount - Product review count.\n     * @param  ratingCountAriaLabelText - Aria label format for review.\n     * @returns The product review count aria label string.\n     */\n    function getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\n        if (reviewCount && ratingCountAriaLabelText) {\n            return format(ratingCountAriaLabelText || '', reviewCount);\n        }\n        return '';\n    }\n\n    /**\n     * Gets the aria label string for product that includes product name with its price and rating.\n     * @param  name - Product name.\n     * @param  price - Product price.\n     * @param  rating - Product rating.\n     * @param  ratingAriaLabelText - Rating aria label text.\n     * @param  reviewCount - Product review count.\n     * @param  ratingCountAriaLabelText - Number of ratings.\n     * @returns The aria label string for the product card.\n     */\n    function renderLabel(\n        name?: string,\n        price?: string,\n        rating?: number,\n        ratingAriaLabelText?: string,\n        reviewCount?: number,\n        ratingCountAriaLabelText?: string,\n        availability?: string\n    ): string {\n        const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\n        return `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${\n            reviewCountArialableText ? ` ${reviewCountArialableText}` : ''\n        } ${availability ?? ''}`;\n    }\n\n    /**\n     * Gets the react component for product rating.\n     * @param  productCardimageSettings - Module image settings for product card.\n     * @param  gridSettings - Grid settings defined in theme.\n     * @param  imageUrl - Image url.\n     * @param fallbackImageUrl - Fallback url for imge.\n     * @param  altText - Image Alt text.\n     * @param  requestContext - Request context using the component.\n     * @returns React component for product image.\n     */\n    function renderProductPlacementImage(\n        productCardimageSettings?: IImageSettings,\n        gridSettings?: IGridSettings,\n        imageUrl?: string,\n        fallbackImageUrl?: string,\n        altText?: string,\n        requestContext?: IRequestContext\n    ): JSX.Element | null {\n        if (!imageUrl || !gridSettings || !productCardimageSettings) {\n            return null;\n        }\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n        const emptyPlaceHolderImage = context.app.config.placeholderImageName as string;\n        let fallbackImageSource = fallbackImageUrl;\n        if (emptyPlaceHolderImage && fallbackImageUrl) {\n            fallbackImageSource = `${fallbackImageUrl},${emptyPlaceHolderImage}`;\n        }\n        const image: IImageData = {\n            src: imageUrl,\n            altText: altText ? altText : '',\n            fallBackSrc: fallbackImageSource\n        };\n        const imageProps: IImageProps = { gridSettings };\n\n        imageProps.gridSettings = gridSettings;\n        imageProps.imageSettings = productCardimageSettings;\n        imageProps.imageSettings.cropFocalRegion = true;\n        return <Image {...image} {...imageProps} loadFailureBehavior='empty' requestContext={requestContext} bypassHideOnFailure />;\n    }\n\n    /**\n     * Gets the react component for product rating.\n     * @param  coreContext - Context of the module using the component.\n     * @param  moduleTypeName - Module type name.\n     * @param  moduleId - Module id using the component.\n     * @param  productSearchResult - Product search result.\n     * @param  savingsPriceResourceText - Product price saving text.\n     * @param  freePriceResourceText - Product price free text.\n     * @param  originalPriceResourceText - Product price original text.\n     * @param  currentPriceResourceText - Product price current text.\n     * @param  productPrice - Product Price.\n     * @returns React component for Product price.\n     */\n    function renderPrice(\n        coreContext: ICoreContext,\n        moduleTypeName: string,\n        moduleId: string,\n        productSearchResult: ProductSearchResult,\n        savingsPriceResourceText?: string,\n        freePriceResourceText?: string,\n        originalPriceResourceText?: string,\n        currentPriceResourceText?: string,\n        productPrice?: ProductPrice\n    ): JSX.Element {\n        const product: SimpleProduct = {\n            // This is a fake product. The product type is only used for price component to determine if it should show price range or not.\n            ProductTypeValue: productSearchResult.IsMasterProduct ? ProductType.Master : ProductType.Standalone\n        } as SimpleProduct;\n\n        const price: ProductPrice =\n            productPrice ??\n            ({\n                BasePrice: productSearchResult.BasePrice,\n                AdjustedPrice: productSearchResult.Price,\n                CustomerContextualPrice: productSearchResult.Price,\n                // TODO from [gaweiche]: We should not put productSearchResult.Price into min/max price.\n                // To minimize the change in a backport PR, I'll keep it as is for now.\n                MaxVariantPrice: productSearchResult.MaxVariantPrice ? productSearchResult.MaxVariantPrice : productSearchResult.Price,\n                MinVariantPrice: productSearchResult.MinVariantPrice ? productSearchResult.MinVariantPrice : productSearchResult.Price\n            } as ProductPrice);\n\n        return (\n            <PriceComponent\n                context={coreContext}\n                id={moduleId}\n                typeName={moduleTypeName}\n                product={product}\n                data={{ price }}\n                savingsText={savingsPriceResourceText}\n                freePriceText={freePriceResourceText}\n                originalPriceText={originalPriceResourceText}\n                currentPriceText={currentPriceResourceText}\n                isPriceMinMaxEnabled={isPriceMinMaxEnabled}\n                priceResources={priceResources}\n            />\n        );\n    }\n\n    /**\n     * Gets the react node for product description.\n     * @param  description - Product description.\n     * @returns The product description component.\n     */\n    function renderDescription(description?: string): JSX.Element | null {\n        return <p className='msc-product__text'>{description}</p>;\n    }\n\n    /**\n     * Gets the react component for product rating.\n     * @param  coreContext - Context of the module using the component.\n     * @param  moduleTypeName - Module type name.\n     * @param  moduleId - Module id using the component.\n     * @param  avgRating - Average rating.\n     * @param  totalRatings - Total rating.\n     * @param  ariaLabel - Aria label for rating.\n     * @returns React component for Product rating.\n     */\n    function renderRating(\n        coreContext: ICoreContext,\n        moduleTypeName: string,\n        moduleId: string,\n        avgRating?: number,\n        totalRatings?: number,\n        ariaLabel?: string\n    ): JSX.Element | null {\n        if (!avgRating) {\n            return null;\n        }\n\n        const numberRatings = totalRatings?.toString() || undefined;\n        const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\n        const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\n\n        return (\n            <RatingComponent\n                context={coreContext}\n                id={moduleId}\n                typeName={moduleTypeName}\n                avgRating={avgRating}\n                ratingCount={numberRatings}\n                readOnly\n                ariaLabel={ratingAriaLabelText}\n                ratingCountAriaLabel={ratingCountAriaLabelText}\n                data={{}}\n            />\n        );\n    }\n\n    return (\n        <>\n            <a\n                href={productPageUrl}\n                onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\n                aria-label={renderLabel(\n                    product.Name,\n                    context.cultureFormatter.formatCurrency(product.Price),\n                    product.AverageRating,\n                    ratingAriaLabel,\n                    product.TotalRatings,\n                    ratingCountAriaLabel,\n                    inventoryLabel\n                )}\n                className='msc-product'\n                {...attribute}\n            >\n                <div className='msc-product__image'>\n                    {renderProductPlacementImage(\n                        imageSettings,\n                        context.request.gridSettings,\n                        productImageUrl,\n                        product.PrimaryImageUrl,\n                        product.Name,\n                        context.actionContext.requestContext\n                    )}\n                </div>\n                <h2 className='msc-product__title'>{product.Name}</h2>\n            </a>\n            {renderProductDimensions()}\n            <div className='msc-product__details'>\n                {renderPrice(context, typeName, id, product, savingsText, freePriceText, originalPriceText, currentPriceText, productPrice)}\n                {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\n                {renderDescription(product.Description)}\n                {!context.app.config.hideRating &&\n                    renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel)}\n                {renderProductAvailability(inventoryLabel)}\n            </div>\n            {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\n            {productComparisonButton && renderProductComparisonButton(productComparisonButton, product, getCatalogId(context.request))}\n        </>\n    );\n};\n\nexport const ProductComponent: React.FunctionComponent<IProductComponentProps> = msdyn365Commerce.createComponent<IProductComponent>(\n    'Product',\n    { component: ProductCard, ...PriceComponentActions }\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IDropdownItemProps, IDropdownProps } from './dropdown.props';\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) {\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        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((item: IDropdownItemProps) => (\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            </select>\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 { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport { ICoreContext, ITelemetry } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { getTelemetryObject, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { Dropdown, IDropdownItemProps, IDropdownOnInitializeNotification, IDropdownOnSelectionChangeNotification } from './dropdown';\nimport {\n    IErrorState,\n    IProductDimensionCallbacks,\n    IProductDimensionConfigureDropdownViewProps,\n    IProductDimensionConfigureResources,\n    IProductDimensionConfigureViewProps\n} from './product-dimension-interface';\n\nlet telemetryContent: ITelemetryContent;\n\n// Quantity on change.\nconst onChange = async (\n    notification: IDropdownOnSelectionChangeNotification,\n    dimensionChanged: (newValue: number, selectedDimensionValue: string) => Promise<void>\n): Promise<void> => {\n    await dimensionChanged(+notification.dropdownId, notification.selectId);\n};\n\nconst _onInitializedDimension = (\n    notification: IDropdownOnInitializeNotification,\n    initializeDimension?: (initializedDimension: string) => void\n): void => {\n    if (initializeDimension) {\n        initializeDimension(notification.initializedDimension);\n    }\n};\n\n// This method will map all product dimension to correct value and returns respective dropdown.\nconst mapProductDimensionFullToDropdownViewProps = (\n    productDimensionFull: ProductDimensionFull,\n    moduleName: string,\n    selectDimensionFormatString: string,\n    resources: IProductDimensionConfigureResources,\n    getDropdownName: (dimensionType: number, resources: IProductDimensionConfigureResources) => string,\n    dropdownCallback: (notification: IDropdownOnSelectionChangeNotification) => Promise<void>,\n    onInitializedDimension: (notification: IDropdownOnInitializeNotification) => void,\n    configureErrors?: { [configureId: string]: string | undefined }\n): IProductDimensionConfigureDropdownViewProps => {\n    const dropdownName = getDropdownName(productDimensionFull.DimensionTypeValue, resources);\n    const dropdownId = productDimensionFull.DimensionTypeValue.toString();\n    const dropdownToggleName = selectDimensionFormatString.replace('{0}', dropdownName.toLocaleLowerCase());\n    const dropdownList: IDropdownItemProps[] = productDimensionFull.DimensionValues\n        ? productDimensionFull.DimensionValues.map<IDropdownItemProps>(dM => {\n              return { value: dM.Value || '', id: dM.RecordId.toString() };\n          })\n        : [];\n    const errorMessage = configureErrors ? configureErrors[dropdownId] : '';\n\n    return {\n        containerProps: {\n            className: `${moduleName}__dropdown`\n        },\n        labelContainerProps: {\n            tag: 'label',\n            className: `${moduleName}__dropdown-quantity-label`,\n            htmlFor: `${moduleName}__dropown-quantity-input-${dropdownId}`\n        },\n        errors: errorMessage && (\n            <span className='msc-alert msc-alert-noborder msc-alert-danger'>\n                <span className='msi-exclamation-triangle' aria-hidden='true' />\n                <span>{errorMessage}</span>\n            </span>\n        ),\n        heading: <div>{dropdownName}</div>,\n        select: (\n            <Dropdown\n                dropdownId={dropdownId}\n                dropdownName={dropdownName}\n                dropdownToggleName={dropdownToggleName}\n                dropdownList={dropdownList}\n                onChange={dropdownCallback}\n                onInitialize={onInitializedDimension}\n                telemetryContent={telemetryContent}\n            />\n        )\n    };\n};\n\nexport const getProductConfigure = (\n    moduleName: string,\n    context: ICoreContext,\n    pageName: string,\n    telemetry: ITelemetry,\n    selectDimensionFormatString: string,\n    resources: IProductDimensionConfigureResources,\n    callbacks: IProductDimensionCallbacks,\n    product?: SimpleProduct,\n    productDimensions?: ProductDimensionFull[],\n    configureErrors?: IErrorState\n): IProductDimensionConfigureViewProps | undefined => {\n    const { getDropdownName } = callbacks;\n\n    if (!product || !productDimensions) {\n        return undefined;\n    }\n\n    const onChanged = async (notification: IDropdownOnSelectionChangeNotification) =>\n        onChange(notification, callbacks.dimensionSelectedAsync);\n\n    const onInitializedDimension = async (notification: IDropdownOnInitializeNotification) =>\n        _onInitializedDimension(notification, callbacks.initializeDimension);\n\n    telemetryContent = getTelemetryObject(context.request.telemetryPageName!, pageName, telemetry);\n\n    if (!ArrayExtensions.hasElements(productDimensions)) {\n        return undefined;\n    }\n\n    const dropdowns = productDimensions.map((productDimensionFull: ProductDimensionFull) =>\n        mapProductDimensionFullToDropdownViewProps(\n            productDimensionFull,\n            moduleName,\n            selectDimensionFormatString,\n            resources,\n            getDropdownName,\n            onChanged,\n            onInitializedDimension,\n            configureErrors?.configureErrors\n        )\n    );\n\n    return {\n        containerProps: {\n            className: `${moduleName}__configure`\n        },\n        dropdowns\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 { DimensionTypes, generateSwatchImageUrl, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { format } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\n/**\n * Swatch item data.\n */\nexport interface ISwatchItem {\n    value: string;\n    itemId: string;\n    dimensionType: DimensionTypes;\n    colorHexCode?: string;\n    imageUrl?: string;\n    productImageUrls?: string[];\n    isDisabled?: boolean;\n    isDefault?: boolean;\n    swatchItemAriaLabel?: string;\n}\n\n/**\n * Swatch item configuration.\n */\nexport interface ISwatchItemProps {\n    className: string;\n    apiSettings: ICommerceApiSettings;\n\n    isSelected: boolean;\n    isSelectionEnabled?: boolean;\n\n    item: ISwatchItem;\n    isRefineItem?: boolean;\n\n    onSelectItem(item: ISwatchItem): void;\n}\n\n/**\n * Represents a single item for swatch.\n * @param props - Item configuration.\n * @returns React node.\n */\nexport const SwatchItemComponent: React.FC<ISwatchItemProps> = (props: ISwatchItemProps) => {\n    const { isSelected, className, onSelectItem, item } = props;\n    const { itemId, value, colorHexCode, imageUrl, swatchItemAriaLabel, dimensionType } = item;\n\n    const style: React.CSSProperties = {};\n\n    let isColored = false;\n\n    const hasColor = !StringExtensions.isNullOrWhitespace(colorHexCode);\n    const hasImage = !StringExtensions.isNullOrWhitespace(imageUrl);\n\n    const selectItem = React.useCallback(() => {\n        onSelectItem(item);\n    }, [onSelectItem, item]);\n\n    const selectionHandler = props.isSelectionEnabled ? selectItem : undefined;\n\n    if (hasImage) {\n        const fullImageUrl = generateSwatchImageUrl(imageUrl!, props.apiSettings);\n        return (\n            <img\n                key={`${itemId}-${item.isDisabled ? 'disabled' : 'enabled'}`}\n                src={fullImageUrl}\n                className={classnames(\n                    className,\n                    `${className}-${itemId}`,\n                    `${className}__image`,\n                    isSelected ? `${className}__selected` : `${className}__unselected`,\n                    item.isDisabled ? `${className}__disabled` : undefined\n                )}\n                style={style}\n                onClick={selectionHandler}\n                onKeyPress={selectionHandler}\n                title={value}\n                aria-label={value}\n                alt={value}\n            />\n        );\n    } else if (hasColor) {\n        style.backgroundColor = colorHexCode;\n        isColored = true;\n    }\n\n    const shouldDisplayText = !isColored;\n\n    return (\n        <button\n            role='radio'\n            key={`${itemId}-${item.isDisabled ? 'disabled' : 'enabled'}`}\n            className={classnames(\n                className,\n                `${className}-${itemId}`,\n                isSelected ? `${className}__selected` : `${className}__unselected`,\n                isColored ? `${className}__colored` : `${className}__uncolored`,\n                item.isDisabled ? `${className}__disabled` : undefined\n            )}\n            style={style}\n            onClick={selectionHandler}\n            onKeyPress={selectionHandler}\n            title={value}\n            {...(swatchItemAriaLabel ? { 'aria-label': format(swatchItemAriaLabel, dimensionType, value) } : null)}\n            {...(props.isRefineItem ? { tabIndex: 0 } : null)}\n            aria-checked={isSelected}\n        >\n            {shouldDisplayText && value}\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 { ICommerceApiSettings } from '@msdyn365-commerce/core-internal';\nimport { ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { ISwatchItem, SwatchItemComponent } from './swatch-item';\n\n/**\n * Swatch item configuration.\n */\nexport interface ISwatchProps {\n    className?: string;\n    apiSettings: ICommerceApiSettings;\n\n    list: ISwatchItem[];\n    isSelectionEnabled?: boolean;\n    isRefineItem?: boolean;\n\n    onSelectItem?(item: ISwatchItem): void;\n}\n\n/**\n * Represents a single item for swatch.\n * @param props - Item configuration.\n * @returns React node.\n */\nexport const SwatchComponent: React.FC<ISwatchProps> = (props: ISwatchProps) => {\n    const containerClassName = 'msc-swatch-container';\n\n    const [selectedItemId, setSelectedItemId] = React.useState<string | undefined>(undefined);\n    const [didUserSetAnyItem, setDidUserSetAnyItem] = React.useState<boolean>(false);\n\n    const isSelectionEnabled = props.isSelectionEnabled ?? true;\n\n    const onSelectItemCallback = props.onSelectItem;\n\n    const onSelectItem = React.useCallback(\n        (item: ISwatchItem) => {\n            setSelectedItemId(item.itemId);\n            if (!ObjectExtensions.isNullOrUndefined(onSelectItemCallback)) {\n                onSelectItemCallback(item);\n            }\n            setDidUserSetAnyItem(true);\n        },\n        [setSelectedItemId, onSelectItemCallback]\n    );\n\n    if (!didUserSetAnyItem) {\n        const defaultItem = props.list.find(item => item.isDefault);\n        if (defaultItem && defaultItem.itemId !== selectedItemId) {\n            setSelectedItemId(defaultItem.itemId);\n            if (!ObjectExtensions.isNullOrUndefined(onSelectItemCallback)) {\n                onSelectItemCallback(defaultItem);\n            }\n        }\n    }\n    return (\n        <div\n            role='radiogroup'\n            className={classnames(containerClassName, props.className)}\n            {...(props.isRefineItem ? { 'aria-hidden': true } : null)}\n        >\n            {props.list.map(item => {\n                const itemId = item.itemId;\n                const isSelected = selectedItemId === itemId;\n\n                return (\n                    <SwatchItemComponent\n                        key={`${itemId}-${item.isDisabled ? 'disabled' : 'enabled'}`}\n                        className={`${containerClassName}__item`}\n                        item={item}\n                        onSelectItem={onSelectItem}\n                        isSelected={isSelected}\n                        apiSettings={props.apiSettings}\n                        isSelectionEnabled={isSelectionEnabled}\n                        isRefineItem={props.isRefineItem}\n                    />\n                );\n            })}\n        </div>\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 } from '@msdyn365-commerce/core-internal';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport React from 'react';\n\nimport { ISwatchItem, SwatchComponent } from '../../product-dimension';\n\n/**\n * Props for product component swatch.\n */\nexport interface IProductComponentV2SwatchProps {\n    context: ICoreContext;\n    swatches: ISwatchItem[];\n    dimensionType?: string;\n    onSelectDimension(coreContext: ICoreContext, swatchItem: ISwatchItem, dimensionType?: string): void;\n}\n\n/**\n * Swatch for the product component.\n * @param props - Swatch props.\n * @returns React element.\n */\nexport const ProductComponentV2SwatchComponent: React.FC<IProductComponentV2SwatchProps> = (props: IProductComponentV2SwatchProps) => {\n    const { context, dimensionType, swatches, onSelectDimension } = props;\n\n    const onSelectItem = React.useCallback(\n        (item: ISwatchItem) => {\n            onSelectDimension(context, item, dimensionType);\n        },\n        [onSelectDimension, context, dimensionType]\n    );\n\n    if (ArrayExtensions.hasElements(swatches)) {\n        return <SwatchComponent apiSettings={context.request.apiSettings} list={swatches} onSelectItem={onSelectItem} />;\n    }\n\n    return <div className='msc-swatch-empty' />;\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 { generateSwatchImageUrl, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\n/**\n * Dimension item data.\n */\nexport interface IProductDimensionsMatrixDimensionItemData {\n    value: string;\n    itemId: string;\n    colorHexCode?: string;\n    imageUrl?: string;\n}\n\n/**\n * Swatch item configuration.\n */\nexport interface IProductDimensionsMatrixDimensionItemProps {\n    className: string;\n    apiSettings: ICommerceApiSettings;\n\n    item: IProductDimensionsMatrixDimensionItemData;\n}\n\n/**\n * Represents a single item for the dimension.\n * @param props - Item configuration.\n * @returns React node.\n */\nexport const ProductDimensionsMatrixDimensionItemComponent: React.FC<IProductDimensionsMatrixDimensionItemProps> = (\n    props: IProductDimensionsMatrixDimensionItemProps\n) => {\n    const { className, item } = props;\n    const { itemId, value, colorHexCode, imageUrl } = item;\n\n    const style: React.CSSProperties = {};\n\n    const hasColor = !StringExtensions.isNullOrWhitespace(colorHexCode);\n    const hasImage = !StringExtensions.isNullOrWhitespace(imageUrl);\n\n    let swatchContent: React.ReactElement | undefined;\n    const swatchContainerClassName = 'msc-swatch-container';\n    const swatchContentClassName = `${swatchContainerClassName}__item`;\n    if (hasColor) {\n        style.backgroundColor = colorHexCode;\n        swatchContent = (\n            <span\n                key={itemId}\n                className={classnames(swatchContentClassName, `${swatchContentClassName}__colored`)}\n                style={style}\n                title={value}\n                aria-label={value}\n            />\n        );\n    } else if (hasImage) {\n        const fullImageUrl = generateSwatchImageUrl(imageUrl!, props.apiSettings);\n        swatchContent = (\n            <img\n                key={itemId}\n                src={fullImageUrl}\n                className={classnames(swatchContentClassName, `${swatchContentClassName}__image`)}\n                style={style}\n                title={value}\n                aria-label={value}\n                alt={value}\n            />\n        );\n    }\n\n    return (\n        <span className={classnames(className, `${className}-${itemId}`)}>\n            {swatchContent && <span className={swatchContainerClassName}>{swatchContent}</span>}\n            <span className={`${className}__value`}>{value}</span>\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 { ProductDimensionType } from '@msdyn365-commerce/retail-proxy';\nimport { Button, Popover } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\n/**\n * Resources for the product dimensions matrix dimension selection component.\n */\nexport interface IProductDimensionsMatrixDimensionSelectionResources {\n    productDimensionTypeColor: string;\n    productDimensionTypeConfiguration: string;\n    productDimensionTypeSize: string;\n    productDimensionTypeStyle: string;\n}\n\n/**\n * Props for the product dimensions matrix dimension selection component.\n */\nexport interface IProductDimensionsMatrixDimensionSelectionProps {\n    className: string;\n\n    resources: IProductDimensionsMatrixDimensionSelectionResources;\n\n    dimensionTypes: number[];\n    currentDimensionType: number;\n\n    onDimensionTypeChange(previousDimensionType: number, newDimensionType: number): void;\n}\n\n/**\n * Retrieves dimension localized name.\n * @param dimensionType - Dimension type.\n * @param resources - Resources to use to retrieve localized text.\n * @returns Localized dimension name.\n */\nexport const getDimensionName = (dimensionType: number, resources: IProductDimensionsMatrixDimensionSelectionResources): string => {\n    switch (dimensionType) {\n        case ProductDimensionType.Color:\n            return resources.productDimensionTypeColor;\n        case ProductDimensionType.Configuration:\n            return resources.productDimensionTypeConfiguration;\n        case ProductDimensionType.Size:\n            return resources.productDimensionTypeSize;\n        case ProductDimensionType.Style:\n            return resources.productDimensionTypeStyle;\n        default:\n            return '';\n    }\n};\n\n/**\n * Props for the dimension item component.\n */\ninterface IProductDimensionsMatrixDimensionItemProps {\n    className: string;\n\n    resources: IProductDimensionsMatrixDimensionSelectionResources;\n\n    dimensionType: number;\n\n    onDimensionTypeSelect(dimensionType: number): void;\n}\n\n/**\n * Dimension item component which represents a single dimension from the list of dimensions.\n * @param props - Component props.\n * @returns React node.\n */\nconst ProductDimensionsMatrixDimensionItemComponent: React.FC<IProductDimensionsMatrixDimensionItemProps> = (\n    props: IProductDimensionsMatrixDimensionItemProps\n) => {\n    const changeCurrentDimension = React.useCallback(() => {\n        props.onDimensionTypeSelect(props.dimensionType);\n    }, [props]);\n\n    const title = getDimensionName(props.dimensionType, props.resources);\n    return (\n        <Button key={props.dimensionType} className={props.className} title={title} onClick={changeCurrentDimension}>\n            {title}\n        </Button>\n    );\n};\n\n/**\n * Dimension selection component for product dimensions matrix.\n * @param props - Component props.\n * @returns React node.\n */\nexport const ProductDimensionsMatrixDimensionSelectionComponent: React.FC<IProductDimensionsMatrixDimensionSelectionProps> = (\n    props: IProductDimensionsMatrixDimensionSelectionProps\n) => {\n    const buttonTogglingReference = React.createRef<HTMLButtonElement>();\n    const [isPopoverShown, setIsPopoverShown] = React.useState(false);\n    const [currentDimensionType, setCurrentDimensionType] = React.useState(props.currentDimensionType);\n    const [currentDimensionTypeLabel, setCurrentDimensionTypeLabel] = React.useState(\n        getDimensionName(props.currentDimensionType, props.resources)\n    );\n\n    const popoverClassName = `${props.className}__popover`;\n\n    const togglePopoverHandler = React.useCallback(() => {\n        setIsPopoverShown(!isPopoverShown);\n    }, [isPopoverShown]);\n\n    const changeCurrentDimension = React.useCallback(\n        (dimensionType: number) => {\n            props.onDimensionTypeChange(currentDimensionType, dimensionType);\n            setCurrentDimensionType(dimensionType);\n            setCurrentDimensionTypeLabel(getDimensionName(dimensionType, props.resources));\n        },\n        [currentDimensionType, props]\n    );\n\n    return (\n        <div className={props.className}>\n            <Button\n                className={`${props.className}__toggle-button`}\n                title={currentDimensionTypeLabel}\n                innerRef={buttonTogglingReference}\n                aria-expanded={isPopoverShown}\n                aria-describedby={props.className}\n                onClick={togglePopoverHandler}\n            >\n                {currentDimensionTypeLabel}\n            </Button>\n            <Popover\n                className={popoverClassName}\n                placement='bottom-start'\n                isOpen={isPopoverShown}\n                target={buttonTogglingReference}\n                toggle={togglePopoverHandler}\n            >\n                <div className={`${popoverClassName}__content`}>\n                    {props.dimensionTypes.map(dimensionType => {\n                        return (\n                            <ProductDimensionsMatrixDimensionItemComponent\n                                key={dimensionType}\n                                className={`${popoverClassName}__content__item`}\n                                resources={props.resources}\n                                dimensionType={dimensionType}\n                                onDimensionTypeSelect={changeCurrentDimension}\n                            />\n                        );\n                    })}\n                </div>\n            </Popover>\n        </div>\n    );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button, IncrementalQuantity, Popover } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\n/**\n * Resources for the enter all quantities component.\n */\nexport interface IProductDimensionsMatrixEnterAllQuantitiesResources {\n    productDimensionsMatrixInputQuantityAriaLabel: string;\n    productDimensionsMatrixEnterAllQuantitiesButtonText: string;\n    productDimensionsMatrixEnterAllQuantitiesDecrementButtonAriaLabel: string;\n    productDimensionsMatrixEnterAllQuantitiesIncrementButtonAriaLabel: string;\n    productDimensionsMatrixEnterAllQuantitiesQuantityText: string;\n    productDimensionsMatrixEnterAllQuantitiesEachText: string;\n    productDimensionsMatrixEnterAllQuantitiesApplyToAllText: string;\n}\n\n/**\n * Props for the enter all quantities component.\n */\nexport interface IProductDimensionsMatrixEnterAllQuantitiesProps {\n    className: string;\n\n    resources: IProductDimensionsMatrixEnterAllQuantitiesResources;\n\n    defaultQuantity: number;\n    minQuantityValue: number;\n    maxQuantityValue: number;\n\n    onApplyToAll(newQuantity: number): void;\n}\n\n/**\n * Popover content for the enter all quantities component.\n * @param props - Enter all quantities component props.\n * @returns React node with the content to be used in the popover.\n */\nconst ProductDimensionsMatrixEnterAllQuantitiesPopoverContentComponent: React.FC<IProductDimensionsMatrixEnterAllQuantitiesProps> = (\n    props: IProductDimensionsMatrixEnterAllQuantitiesProps\n) => {\n    const [currentQuantity, setCurrentQuantity] = React.useState(props.defaultQuantity);\n\n    const handleQuantityChange = React.useCallback(\n        (newQuantity?: number) => {\n            setCurrentQuantity(newQuantity ?? props.defaultQuantity);\n            return true;\n        },\n        [props.defaultQuantity]\n    );\n\n    const handleApplyAll = React.useCallback(() => {\n        props.onApplyToAll(currentQuantity);\n        return true;\n    }, [props, currentQuantity]);\n\n    return (\n        <div className={props.className}>\n            <div className={`${props.className}__quantity-label`}>\n                {props.resources.productDimensionsMatrixEnterAllQuantitiesQuantityText}\n            </div>\n            <IncrementalQuantity\n                currentCount={props.defaultQuantity}\n                onChange={handleQuantityChange}\n                inputQuantityAriaLabel={props.resources.productDimensionsMatrixInputQuantityAriaLabel}\n                min={props.minQuantityValue}\n                max={props.maxQuantityValue}\n                decrementButtonAriaLabel={props.resources.productDimensionsMatrixEnterAllQuantitiesDecrementButtonAriaLabel}\n                incrementButtonAriaLabel={props.resources.productDimensionsMatrixEnterAllQuantitiesIncrementButtonAriaLabel}\n            />\n            <div className={`${props.className}__button-label`}>{props.resources.productDimensionsMatrixEnterAllQuantitiesEachText}</div>\n            <div className={`${props.className}__apply-to-all-container`}>\n                <Button\n                    className={`${props.className}__apply-to-all-container__button`}\n                    title={props.resources.productDimensionsMatrixEnterAllQuantitiesApplyToAllText}\n                    onClick={handleApplyAll}\n                >\n                    {props.resources.productDimensionsMatrixEnterAllQuantitiesApplyToAllText}\n                </Button>\n            </div>\n        </div>\n    );\n};\n\n/**\n * Enter all quantities component to update all quantities in the product dimensions matrix.\n * @param props - Enter all quantities component props.\n * @returns React node.\n */\nexport const ProductDimensionsMatrixEnterAllQuantitiesComponent: React.FC<IProductDimensionsMatrixEnterAllQuantitiesProps> = (\n    props: IProductDimensionsMatrixEnterAllQuantitiesProps\n) => {\n    const buttonTogglingReference = React.createRef<HTMLButtonElement>();\n    const [isPopoverShown, setIsPopoverShown] = React.useState(false);\n\n    const popoverClassName = `${props.className}__popover`;\n\n    const togglePopoverHandler = React.useCallback(() => {\n        setIsPopoverShown(!isPopoverShown);\n    }, [isPopoverShown]);\n\n    const handleApplyAll = React.useCallback(\n        (currentQuantity: number) => {\n            setIsPopoverShown(false);\n            props.onApplyToAll(currentQuantity);\n        },\n        [props]\n    );\n\n    return (\n        <div className={props.className}>\n            <Button\n                className={`${props.className}__toggle-button`}\n                title={props.resources.productDimensionsMatrixEnterAllQuantitiesButtonText}\n                innerRef={buttonTogglingReference}\n                aria-expanded={isPopoverShown}\n                aria-describedby={props.className}\n                onClick={togglePopoverHandler}\n            >\n                {props.resources.productDimensionsMatrixEnterAllQuantitiesButtonText}\n            </Button>\n            <Popover\n                className={popoverClassName}\n                placement='bottom-start'\n                isOpen={isPopoverShown}\n                target={buttonTogglingReference}\n                toggle={togglePopoverHandler}\n            >\n                <ProductDimensionsMatrixEnterAllQuantitiesPopoverContentComponent\n                    {...props}\n                    className={`${popoverClassName}__content`}\n                    onApplyToAll={handleApplyAll}\n                />\n            </Popover>\n        </div>\n    );\n};\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 msdyn365Commerce, { getUrlSync, ICoreContext } from '@msdyn365-commerce/core-internal';\nimport {\n    Customer,\n    InventoryAvailabilitySearchCriteria,\n    ProductDimensionValueInventoryAvailability,\n    ProductInventoryAvailability,\n    ProductsDataActions\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n    ArrayExtensions,\n    DeliveryMode,\n    Dictionary,\n    getInventoryLevelCodeFromDimensionValue,\n    getInventoryLevelCodeFromProductAvailability,\n    IDimensionsApp,\n    IDimensionsConfig,\n    InventoryLevels,\n    InventoryLevelValues,\n    ObjectExtensions,\n    OrderTemplate\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n    Button,\n    Collapse,\n    ILabeledDropdownOnChangeNotification,\n    isMobile,\n    LabeledDropdown,\n    Quantity,\n    VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { AddToCartFunctionalComponent, IAddToCartResources } from '../add-to-cart';\nimport { AddProductsToOrderTemplateComponent, IAddProductsToOrderTemplateResources } from '../order-template';\nimport {\n    getDimensionName,\n    IProductDimensionsMatrixDimensionSelectionResources,\n    IProductDimensionsMatrixEnterAllQuantitiesResources,\n    ProductDimensionsMatrixDimensionItemComponent,\n    ProductDimensionsMatrixDimensionSelectionComponent,\n    ProductDimensionsMatrixEnterAllQuantitiesComponent\n} from './components';\n\n/**\n * Resources for the product dimensions matrix component.\n */\nexport interface IProductDimensionsMatrixResources\n    extends IProductDimensionsMatrixEnterAllQuantitiesResources,\n        IProductDimensionsMatrixDimensionSelectionResources,\n        IAddProductsToOrderTemplateResources,\n        IAddToCartResources {\n    productDimensionsMatrixInputQuantityAriaLabel: string;\n    productDimensionsMatrixTotalItemsLabel: string;\n    productDimensionsMatrixOutOfStockLabel: string;\n    productDimensionsMatrixClearAllText: string;\n    productDimensionsMatrixAddItemsToCartButtonText: string;\n\n    productDimensionsMatrixDisplayOrderLabel: string;\n    productDimensionsMatrixDisplayOrderSeparator: string;\n}\n\n/**\n * Data for the product dimensions matrix component.\n */\nexport interface IProductDimensionsMatrixData {\n    dimensions: IProductDimensionsWithAvailabilitiesFull[];\n    orderTemplates?: OrderTemplate[];\n    customerInformation?: Customer;\n}\n\n/**\n * Props for the product dimensions matrix component.\n */\nexport interface IProductDimensionsMatrixProps {\n    className?: string;\n    context: ICoreContext<IDimensionsApp>;\n\n    data: IProductDimensionsMatrixData;\n\n    resources: IProductDimensionsMatrixResources;\n\n    onErrorMessage(result: string): void;\n    dimensionOnChange?(): void;\n    isMultipleCatalogFeatureEnabledInHq: boolean;\n    catalogId?: number | undefined;\n}\n\n/**\n * Represents a single node (cell data) in the matrix.\n */\nexport interface IProductDimensionsMatrixNode {\n    dimensionIds: string[];\n\n    isAvailable: boolean;\n\n    quantity: number;\n\n    productId?: number;\n}\n\n/**\n * State of the matrix.\n */\nexport interface IProductDimensionsMatrixState {\n    dimensionsOrder: IProductDimensionsWithAvailabilitiesFull[];\n    nodes: IProductDimensionsMatrixNode[];\n\n    lastChangeAllDate: number;\n\n    totalQuantity: number;\n\n    dimensionsExpandState: Dictionary<string, boolean>;\n    dimensionsExpandStateDate: number;\n}\n\n/**\n * Retrieves unique dimension id from the dimension data.\n * @param dimension - Dimension data.\n * @returns Unique id that represents the given dimension.\n */\nconst getDimensionId = (dimension: ProductDimensionValueInventoryAvailability) => {\n    return `${dimension.DimensionTypeValue ?? ''}-${dimension.DimensionValue?.RecordId ?? ''}-${dimension.DimensionValue?.Value ?? ''}`;\n};\n\n/**\n * Retrieves dimension inventory level code.\n * @param dimensionId - Dimension id for which the code needs to be retrieved.\n * @param dimensions - List of the dimensions with the data.\n * @param inventoryLevel - Inventory level configuration.\n * @returns Inventory level code, for instance, available or out of stock.\n */\nconst retrieveDimensionInventoryLevelCode = (\n    dimensionId: string,\n    dimensions: ProductDimensionValueInventoryAvailability[],\n    inventoryLevel?: InventoryLevels\n) => {\n    const dimension = dimensions.find(item => getDimensionId(item) === dimensionId)!;\n    return getInventoryLevelCodeFromDimensionValue(dimension, inventoryLevel);\n};\n\n/**\n * Checks whether the given dimension is available for purchase or not.\n * @param dimensionId - Dimension id for which the availability needs to be retrieved.\n * @param dimensions - List of the dimensions with the data.\n * @param config - Inventory configuration.\n * @returns True if the dimension is available, false otherwise.\n */\nexport const isDimensionAvailable = (\n    dimensionId: string,\n    dimensions: ProductDimensionValueInventoryAvailability[],\n    config: IDimensionsConfig\n) => {\n    const enableStockCheck = config.enableStockCheck;\n    if (!enableStockCheck) {\n        return true;\n    }\n    return retrieveDimensionInventoryLevelCode(dimensionId, dimensions, config.inventoryLevel) !== InventoryLevelValues.outOfStock;\n};\n\n/**\n * Checks whether the given product is available for purchase or not.\n * @param productAvailability - Product availability information.\n * @param inventoryLevel - Inventory level configuration.\n * @returns True if the product is available, false otherwise.\n */\nconst isProductAvailable = (productAvailability: ProductInventoryAvailability, inventoryLevel?: InventoryLevels) => {\n    return getInventoryLevelCodeFromProductAvailability(productAvailability, inventoryLevel) !== InventoryLevelValues.outOfStock;\n};\n\n/**\n * Recursively builds matrix nodes based on the given dimensions data.\n * @param dimensionIds - Matrix of dimension ids for each dimension type.\n * @param dimensions - List of the dimensions with the data.\n * @param config - Inventory configuration.\n * @param defaultQuantity - Default quantity to use.\n * @returns List of created nodes.\n */\nconst retrieveEndDimensionsNode = (\n    dimensionIds: string[][],\n    dimensions: ProductDimensionValueInventoryAvailability[],\n    config: IDimensionsConfig,\n    defaultQuantity: number\n): IProductDimensionsMatrixNode[] => {\n    if (!ArrayExtensions.hasElements(dimensionIds)) {\n        return [];\n    }\n\n    if (dimensionIds.length === 1) {\n        return dimensionIds[0].map(dimensionId => {\n            const isAvailable = isDimensionAvailable(dimensionId, dimensions, config);\n            return {\n                dimensionIds: [dimensionId],\n                isAvailable,\n                quantity: isAvailable ? defaultQuantity : 0\n            };\n        });\n    }\n\n    const nodes = retrieveEndDimensionsNode(dimensionIds.slice(1), dimensions, config, defaultQuantity);\n    let endNodes: IProductDimensionsMatrixNode[] = [];\n    for (const node of nodes) {\n        endNodes = endNodes.concat(\n            dimensionIds[0].map(dimension => {\n                const isNodeAvailable = node.isAvailable && isDimensionAvailable(dimension, dimensions, config);\n                const nodeCopy: IProductDimensionsMatrixNode = {\n                    dimensionIds: node.dimensionIds.concat(dimension),\n                    isAvailable: isNodeAvailable,\n                    quantity: isNodeAvailable ? node.quantity : 0\n                };\n\n                return nodeCopy;\n            })\n        );\n    }\n\n    return endNodes;\n};\n\n/**\n * Generates a list of display orders.\n * @param dimensions - List of dimensions.\n * @param usedDimensions - List of used dimensions.\n * @returns List of display orders.\n */\nconst createDisplayOrders = (\n    dimensions: ProductDimensionValueInventoryAvailability[],\n    usedDimensions?: ProductDimensionValueInventoryAvailability[]\n) => {\n    if (usedDimensions?.length === dimensions.length) {\n        return [\n            {\n                dimensionTypes: usedDimensions.map(dimension => dimension.DimensionTypeValue!)\n            }\n        ];\n    }\n\n    let result: {\n        dimensionTypes: number[];\n    }[] = [];\n\n    for (const dimension of dimensions) {\n        if (usedDimensions?.includes(dimension)) {\n            continue;\n        }\n        const currentDimensions = usedDimensions ? usedDimensions.concat(dimension) : [dimension];\n        const currentResult = createDisplayOrders(dimensions, currentDimensions);\n        result = result.concat(currentResult);\n    }\n\n    return result;\n};\n\n/**\n * Represents dimension matrix row data for the react view.\n */\ninterface IProductDimensionsMatrixRow {\n    rows: React.ReactElement[][];\n    newNodeIndex: number;\n}\n\n/**\n * Product dimensions matrix component which allows to purchase multiple product variants at the same time.\n */\nexport class ProductDimensionsMatrix extends React.PureComponent<IProductDimensionsMatrixProps, IProductDimensionsMatrixState> {\n    private static readonly _className: string = 'msc-product-dimensions-matrix';\n\n    private static readonly _defaultQuantityProps = {\n        defaultQuantity: 0,\n        minQuantity: 0,\n        maxQuantity: 10_000_000\n    };\n\n    private readonly _displayOrderList: {\n        dimensionTypes: number[];\n    }[];\n\n    public constructor(props: IProductDimensionsMatrixProps) {\n        super(props);\n\n        const isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\n\n        const dimensions = props.data.dimensions;\n        const nodes = ProductDimensionsMatrix._retrieveNodes(isMobileDevice ? ArrayExtensions.reverse(dimensions) : dimensions, props);\n        const quantities = nodes.map(node => node.quantity);\n        this.state = {\n            dimensionsOrder: dimensions,\n            nodes,\n            totalQuantity: ArrayExtensions.hasElements(quantities) ? ArrayExtensions.calculateSum(quantities) : 0,\n            lastChangeAllDate: Date.now(),\n            dimensionsExpandState: new Dictionary(),\n\n            // The state needs to be updated in order to make collapsing work for inner dimensions.\n            // Probably some react bug that makes the state not change which in turn, doesn't update expand state of the dimensions on the page.\n            // Needs to be updated in order to update expand/collapse states and not to reset the whole component (which resets scroll position).\n            // eslint-disable-next-line react/no-unused-state -- See the reason above.\n            dimensionsExpandStateDate: Date.now()\n        };\n\n        this._displayOrderList = createDisplayOrders(dimensions);\n\n        if (msdyn365Commerce.isBrowser) {\n            // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\n            this.retrieveAvailabilitiesInformation();\n        }\n    }\n\n    // eslint-disable-next-line @typescript-eslint/member-ordering\n    private static _retrieveNodes(dimensions: IProductDimensionsWithAvailabilitiesFull[], props: IProductDimensionsMatrixProps) {\n        const dimensionIds = ArrayExtensions.validValues(\n            dimensions.map(dimension => ArrayExtensions.validValues(dimension.dimensionValuesWithInventory?.map(getDimensionId)))\n        );\n\n        const dimensionsList = ArrayExtensions.flatten(dimensions.map(dimension => dimension.dimensionValuesWithInventory));\n\n        const nodes = retrieveEndDimensionsNode(\n            dimensionIds,\n            dimensionsList,\n            props.context.app.config,\n            ProductDimensionsMatrix._defaultQuantityProps.defaultQuantity\n        );\n\n        for (const node of nodes) {\n            const nodeDimensions = dimensionsList.filter(dimension => node.dimensionIds.includes(getDimensionId(dimension)));\n\n            let productIds: number[] | undefined;\n            for (const dimension of nodeDimensions) {\n                const dimensionProductIds = dimension.ProductIds;\n                if (!ArrayExtensions.hasElements(dimensionProductIds)) {\n                    continue;\n                }\n                if (productIds === undefined) {\n                    productIds = dimensionProductIds;\n                    continue;\n                }\n                productIds = productIds.filter(productId => dimensionProductIds.includes(productId));\n            }\n            if (productIds?.length === 1) {\n                node.productId = productIds[0];\n            }\n        }\n\n        return nodes;\n    }\n\n    // eslint-disable-next-line @typescript-eslint/member-ordering\n    private static _renderMatrixEmptyCell(className: string): React.ReactElement {\n        return <div key='empty-placeholder' className={className} />;\n    }\n\n    public render(): React.ReactElement | null {\n        if (!ArrayExtensions.hasElements(this.state.nodes)) {\n            return null;\n        }\n\n        return (\n            <div className={classnames(this.props.className, ProductDimensionsMatrix._className)}>\n                {this._renderHeader(`${ProductDimensionsMatrix._className}__header`)}\n                {this._renderMatrix(`${ProductDimensionsMatrix._className}__matrix`)}\n                {this._renderFooter(`${ProductDimensionsMatrix._className}__footer`)}\n            </div>\n        );\n    }\n\n    public async retrieveAvailabilitiesInformation() {\n        const productIds = this.state.nodes.map(node => node.productId!);\n        const actionContext = this.props.context.actionContext;\n        const enableStockCheck = this.props.context.app.config.enableStockCheck;\n        const warehouseAggregation = this.props.context.app.config.warehouseAggregation;\n\n        if (!enableStockCheck) {\n            for (const node of this.state.nodes) {\n                node.isAvailable = true;\n            }\n        } else {\n            const availabilitiesSearchCriteria: InventoryAvailabilitySearchCriteria = {\n                ProductIds: productIds,\n                QuantityUnitTypeValue: 2,\n                FilterByChannelFulfillmentGroup: true,\n                DeliveryModeTypeFilterValue: DeliveryMode.shipping,\n                DefaultWarehouseOnly: warehouseAggregation === 'individual'\n            };\n\n            const availabilities = await ProductsDataActions.getEstimatedAvailabilityAsync(\n                { callerContext: actionContext },\n                availabilitiesSearchCriteria\n            );\n\n            for (const node of this.state.nodes) {\n                const availability = availabilities.AggregatedProductInventoryAvailabilities?.find(\n                    item => item.ProductId === node.productId\n                );\n                node.isAvailable =\n                    availability !== undefined && isProductAvailable(availability, this.props.context.app.config.inventoryLevel);\n            }\n        }\n\n        this.setState({\n            lastChangeAllDate: Date.now()\n        });\n    }\n\n    private _renderHeader(className: string): React.ReactElement {\n        return (\n            <div className={className}>\n                {this._renderDisplayOrderContainer(`${className}__display-order`)}\n                {this._renderActions(`${className}__actions`)}\n            </div>\n        );\n    }\n\n    /**\n     * Handles change of dimension.\n     * @param selectedDimensions - Selected dimension order.\n     */\n    private readonly _handleDisplayOrderChange = (selectedDimensions: ILabeledDropdownOnChangeNotification) => {\n        this.setState(state => {\n            const displayOrder = this._displayOrderList.find(value => {\n                return value.dimensionTypes.join('-') === selectedDimensions.selectedOption.key;\n            })!;\n            const newDimensions = displayOrder.dimensionTypes.map(\n                dimensionType => state.dimensionsOrder.find(item => item.DimensionTypeValue === dimensionType)!\n            );\n\n            const newNodes = this._generateNodesByNewDimensions(ArrayExtensions.reverse(newDimensions), state.nodes);\n\n            return {\n                dimensionsOrder: newDimensions,\n                nodes: newNodes,\n                lastChangeAllDate: Date.now()\n            };\n        });\n    };\n\n    private _renderDisplayOrderContainer(className: string) {\n        const isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\n\n        if (!isMobileDevice) {\n            return null;\n        }\n\n        const dropdowns = this._displayOrderList.map(value => {\n            return {\n                key: value.dimensionTypes.join('-'),\n                value: value.dimensionTypes\n                    .map(dimension => getDimensionName(dimension, this.props.resources))\n                    .join(this.props.resources.productDimensionsMatrixDisplayOrderSeparator)\n            };\n        });\n\n        return (\n            <div className={className}>\n                <LabeledDropdown\n                    labelClassname={`${className}__label`}\n                    labelText={this.props.resources.productDimensionsMatrixDisplayOrderLabel}\n                    dropdownOptions={dropdowns}\n                    selectedOption={dropdowns[0]}\n                    dropdownClassname={`${className}__dropdown`}\n                    onSelectOption={this._handleDisplayOrderChange}\n                />\n            </div>\n        );\n    }\n\n    /**\n     * Updates all quantities for each cell with the new given quantity, overrides any existing quantities.\n     * @param newQuantity - Quantity to use for the cells.\n     */\n    private readonly _updateAllQuantities = (newQuantity: number) => {\n        this.setState(state => {\n            const nodes = state.nodes.map(node => {\n                return {\n                    ...node,\n                    quantity: node.isAvailable ? newQuantity : 0\n                };\n            });\n            const quantities = nodes.map(node => node.quantity);\n            return {\n                nodes,\n                totalQuantity: ArrayExtensions.hasElements(quantities) ? ArrayExtensions.calculateSum(quantities) : 0,\n                lastChangeAllDate: Date.now()\n            };\n        });\n    };\n\n    /**\n     * Clears all quantities by setting all nodes to use the default quantity.\n     */\n    private readonly _clearAllQuantities = () => {\n        this._updateAllQuantities(ProductDimensionsMatrix._defaultQuantityProps.defaultQuantity);\n    };\n\n    private _renderActions(className: string): React.ReactElement {\n        return (\n            <div className={className}>\n                {this._renderEnterAllQuantities(`${className}__enter-all-quantities-container`)}\n                {this._renderClearAllQuantities(`${className}__clear-all-quantities-container`)}\n            </div>\n        );\n    }\n\n    private _renderEnterAllQuantities(className: string): React.ReactElement {\n        const maxQuantityForCartLineItem = this.props.context.app.config.maxQuantityForCartLineItem;\n        return (\n            <ProductDimensionsMatrixEnterAllQuantitiesComponent\n                className={className}\n                resources={this.props.resources}\n                defaultQuantity={ProductDimensionsMatrix._defaultQuantityProps.defaultQuantity}\n                minQuantityValue={ProductDimensionsMatrix._defaultQuantityProps.minQuantity}\n                maxQuantityValue={maxQuantityForCartLineItem || ProductDimensionsMatrix._defaultQuantityProps.maxQuantity}\n                onApplyToAll={this._updateAllQuantities}\n            />\n        );\n    }\n\n    private _renderClearAllQuantities(className: string): React.ReactElement {\n        return (\n            <div className={className}>\n                <Button\n                    className={`${className}__button`}\n                    title={this.props.resources.productDimensionsMatrixClearAllText}\n                    onClick={this._clearAllQuantities}\n                >\n                    {this.props.resources.productDimensionsMatrixClearAllText}\n                </Button>\n            </div>\n        );\n    }\n\n    private _renderMatrixDesktop(className: string): React.ReactElement {\n        const rowClassName = `${className}__row`;\n        const cellClassName = `${rowClassName}__cell`;\n        const dimensionsList = ArrayExtensions.flatten(this.state.dimensionsOrder.map(dimension => dimension.dimensionValuesWithInventory));\n        const rows = this._renderMatrixRowsDesktop(rowClassName, dimensionsList, [], 0).rows;\n\n        const reversedDimensions = ArrayExtensions.reverse(this.state.dimensionsOrder);\n\n        return (\n            <div className={className} key={JSON.stringify(this.state.dimensionsOrder)}>\n                {this._renderMatrixDimensionsHeader(`${className}__dimensions-header`, reversedDimensions)}\n                <div className={`${className}__content`}>\n                    <div className={rowClassName}>\n                        {reversedDimensions.map((dimension, index) => {\n                            if (index === reversedDimensions.length - 1) {\n                                return dimension.dimensionValuesWithInventory?.map(item =>\n                                    this._renderMatrixDimensionCell(cellClassName, item)\n                                );\n                            }\n                            return ProductDimensionsMatrix._renderMatrixEmptyCell(cellClassName);\n                        })}\n                    </div>\n                    {rows.map(cells => {\n                        return (\n                            <div className={rowClassName} key='cells'>\n                                {cells}\n                            </div>\n                        );\n                    })}\n                </div>\n            </div>\n        );\n    }\n\n    /**\n     * Handle collapse dimension.\n     * @param dimensionId - Selected dimension id.\n     * @returns Callback for collapse dimension button.\n     */\n    private readonly _handleCollapseDimension = (dimensionId: string) => () => {\n        this.setState(state => {\n            const isExpanded = state.dimensionsExpandState.getValueWithDefaultValue(dimensionId, false);\n            state.dimensionsExpandState.setValue(dimensionId, !isExpanded);\n\n            return {\n                dimensionsExpandState: state.dimensionsExpandState,\n                dimensionsExpandStateDate: Date.now()\n            };\n        });\n    };\n\n    private _renderMatrixMobile(className: string): React.ReactElement {\n        const allDimensions = ArrayExtensions.flatten(this.state.dimensionsOrder.map(dimension => dimension.dimensionValuesWithInventory));\n\n        const singleDimensionClassName = `${className}__single-dimension`;\n        const cellClassName = `${className}__cell`;\n        const dimensionsContainerClassName = `${cellClassName}__dimension-container`;\n\n        return (\n            <div\n                className={classnames(className, this.state.dimensionsOrder.length === 1 ? singleDimensionClassName : '')}\n                key={`${JSON.stringify(this.state.dimensionsOrder)}-${this.state.lastChangeAllDate}`}\n            >\n                {this._renderMatrixRowsMobile(dimensionsContainerClassName, allDimensions, [], 0).rows}\n            </div>\n        );\n    }\n\n    private _renderMatrix(className: string): React.ReactElement {\n        const isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\n\n        if (!isMobileDevice) {\n            return this._renderMatrixDesktop(className);\n        }\n\n        return this._renderMatrixMobile(`${className}__mobile`);\n    }\n\n    private _generateNodesByNewDimensions(\n        newDimensions: IProductDimensionsWithAvailabilitiesFull[],\n        nodes: IProductDimensionsMatrixNode[]\n    ) {\n        return ProductDimensionsMatrix._retrieveNodes(newDimensions, this.props).map(node => {\n            const previousNode = nodes.find(pastNode => ArrayExtensions.haveSameItems(node.dimensionIds, pastNode.dimensionIds))!;\n            node.quantity = previousNode.quantity;\n            node.isAvailable = previousNode.isAvailable;\n            return node;\n        });\n    }\n\n    /**\n     * Handles change of dimension for a column by swapping previous and new dimension columns with each other.\n     * @param previousDimensionType - Previous dimension used in the column.\n     * @param newDimensionType - New dimension to display instead of the previous dimension.\n     */\n    private readonly _handleDimensionTypeChange = (previousDimensionType: number, newDimensionType: number) => {\n        this.setState(\n            state => {\n                const previousDimension = state.dimensionsOrder.find(item => item.DimensionTypeValue === previousDimensionType)!;\n                const newDimension = state.dimensionsOrder.find(item => item.DimensionTypeValue === newDimensionType)!;\n\n                const newDimensions = state.dimensionsOrder.map(item => {\n                    if (item === previousDimension) {\n                        return newDimension;\n                    }\n                    if (item === newDimension) {\n                        return previousDimension;\n                    }\n                    return item;\n                });\n\n                const newNodes = this._generateNodesByNewDimensions(newDimensions, state.nodes);\n\n                return {\n                    dimensionsOrder: newDimensions,\n                    nodes: newNodes,\n                    lastChangeAllDate: Date.now()\n                };\n            },\n            () => {\n                this.props.dimensionOnChange && this.props.dimensionOnChange();\n            }\n        );\n    };\n\n    private _renderMatrixDimensionsHeader(className: string, dimensions: IProductDimensionsWithAvailabilitiesFull[]): React.ReactElement {\n        const cellClassName = `${className}__cell`;\n        const dimensionsList = dimensions.map(dimension => dimension.DimensionTypeValue);\n\n        return (\n            <div className={className}>\n                {dimensionsList.map(dimensionType => {\n                    return (\n                        <ProductDimensionsMatrixDimensionSelectionComponent\n                            key={dimensionType}\n                            className={cellClassName}\n                            resources={this.props.resources}\n                            dimensionTypes={dimensionsList}\n                            currentDimensionType={dimensionType}\n                            onDimensionTypeChange={this._handleDimensionTypeChange}\n                        />\n                    );\n                })}\n            </div>\n        );\n    }\n\n    private _renderMatrixMainDimensionMobile(\n        className: string,\n        dimension: ProductDimensionValueInventoryAvailability,\n        content: React.ReactElement\n    ): React.ReactElement {\n        const dimensionId = getDimensionId(dimension);\n        const isExpanded = this.state.dimensionsExpandState.getValueWithDefaultValue(dimensionId, false);\n\n        const expandButtonClassName = `${className}__expand-button`;\n        const collapseClassName = `${className}__collapse`;\n        const collapseItemClassName = `${collapseClassName}__item`;\n\n        return (\n            <div className={className} key={`${dimensionId}-${isExpanded ? 'expanded' : 'collapsed'}-${this.state.lastChangeAllDate}`}>\n                <Button className={expandButtonClassName} onClick={this._handleCollapseDimension(dimensionId)} aria-expanded={isExpanded}>\n                    {this._renderMatrixDimensionCell(`${expandButtonClassName}__dimension`, dimension)}\n                </Button>\n                <Collapse className={collapseClassName} isOpen={isExpanded}>\n                    <div className={collapseItemClassName}>{content}</div>\n                </Collapse>\n            </div>\n        );\n    }\n\n    private _renderMatrixRowsMobile(\n        className: string,\n        dimensions: ProductDimensionValueInventoryAvailability[],\n        partialDimensions: string[],\n        nodeIndex: number\n    ): IProductDimensionsMatrixRow {\n        const result: IProductDimensionsMatrixRow = {\n            rows: [],\n            newNodeIndex: nodeIndex\n        };\n\n        if (nodeIndex >= this.state.nodes.length) {\n            return result;\n        }\n\n        const node = this.state.nodes[result.newNodeIndex];\n        const nodeDimensionIdsLength = node.dimensionIds.length;\n        const partialDimensionIdsLength = partialDimensions.length;\n        const currentDimensionId = node.dimensionIds[partialDimensionIdsLength];\n        const currentDimension = dimensions.find(dimension => getDimensionId(dimension) === currentDimensionId)!;\n\n        const cellClassName = `${className}__cell`;\n\n        if (nodeDimensionIdsLength === partialDimensionIdsLength + 1) {\n            result.rows.push([]);\n\n            if (node.dimensionIds.length === 1) {\n                while (result.newNodeIndex < this.state.nodes.length) {\n                    const dimensionId = this.state.nodes[result.newNodeIndex].dimensionIds[partialDimensionIdsLength];\n                    const lastDimension = dimensions.find(dimension => getDimensionId(dimension) === dimensionId)!;\n\n                    result.rows[0].push(\n                        <div className={cellClassName}>\n                            {this._renderMatrixDimensionCell(`${cellClassName}__dimension-label`, lastDimension)}\n                            {this._renderMatrixCell(`${cellClassName}__content`, result.newNodeIndex++)}\n                        </div>\n                    );\n                }\n                return result;\n            }\n\n            result.rows[0].push(\n                <div className={cellClassName}>\n                    {this._renderMatrixDimensionCell(`${cellClassName}__dimension-label`, currentDimension)}\n                    {this._renderMatrixCell(`${cellClassName}__content`, result.newNodeIndex++)}\n                </div>\n            );\n\n            if (partialDimensionIdsLength > 0) {\n                const previousDimension = partialDimensions[partialDimensionIdsLength - 1];\n\n                while (\n                    result.newNodeIndex < this.state.nodes.length &&\n                    previousDimension === this.state.nodes[result.newNodeIndex].dimensionIds[partialDimensionIdsLength - 1]\n                ) {\n                    const dimensionId = this.state.nodes[result.newNodeIndex].dimensionIds[partialDimensionIdsLength];\n                    const lastDimension = dimensions.find(dimension => getDimensionId(dimension) === dimensionId)!;\n                    result.rows[0].push(\n                        <div className={cellClassName}>\n                            {this._renderMatrixDimensionCell(`${cellClassName}__dimension-label`, lastDimension)}\n                            {this._renderMatrixCell(`${cellClassName}__content`, result.newNodeIndex++)}\n                        </div>\n                    );\n                }\n            }\n\n            return result;\n        }\n\n        const rows = this._renderMatrixRowsMobile(className, dimensions, partialDimensions.concat(currentDimensionId), result.newNodeIndex);\n        result.newNodeIndex = rows.newNodeIndex;\n        if (partialDimensionIdsLength === 0) {\n            result.rows.push([this._renderMatrixMainDimensionMobile(`${className}__main-dimension`, currentDimension, <>{rows.rows}</>)]);\n        } else {\n            result.rows.push([\n                <div className={`${className}__container`} key={currentDimensionId}>\n                    {this._renderMatrixDimensionCell(`${className}__container__dimension`, currentDimension)}\n                    <div className={`${className}__container__items`}>{rows.rows}</div>\n                </div>\n            ]);\n        }\n\n        if (partialDimensionIdsLength > 0) {\n            const previousDimension = partialDimensions[partialDimensionIdsLength - 1];\n            while (\n                result.newNodeIndex < this.state.nodes.length &&\n                previousDimension === this.state.nodes[result.newNodeIndex].dimensionIds[partialDimensionIdsLength - 1]\n            ) {\n                const nextRows = this._renderMatrixRowsMobile(className, dimensions, partialDimensions, result.newNodeIndex);\n                result.rows = result.rows.concat(nextRows.rows);\n                result.newNodeIndex = nextRows.newNodeIndex;\n            }\n        } else {\n            while (result.newNodeIndex < this.state.nodes.length) {\n                const nextRows = this._renderMatrixRowsMobile(className, dimensions, partialDimensions, result.newNodeIndex);\n                result.rows = result.rows.concat(nextRows.rows);\n                result.newNodeIndex = nextRows.newNodeIndex;\n            }\n        }\n\n        return result;\n    }\n\n    private _renderMatrixRowsDesktop(\n        className: string,\n        dimensions: ProductDimensionValueInventoryAvailability[],\n        partialDimensions: string[],\n        nodeIndex: number\n    ): IProductDimensionsMatrixRow {\n        const result: IProductDimensionsMatrixRow = {\n            rows: [],\n            newNodeIndex: nodeIndex\n        };\n\n        if (nodeIndex >= this.state.nodes.length) {\n            return result;\n        }\n\n        const node = this.state.nodes[result.newNodeIndex];\n        const nodeDimensionIdsLength = node.dimensionIds.length;\n        const partialDimensionIdsLength = partialDimensions.length;\n        const currentDimensionId = node.dimensionIds[partialDimensionIdsLength];\n        const currentDimension = dimensions.find(dimension => getDimensionId(dimension) === currentDimensionId)!;\n\n        const cellClassName = `${className}__cell`;\n\n        if (nodeDimensionIdsLength === partialDimensionIdsLength + 1) {\n            result.rows.push([]);\n\n            if (node.dimensionIds.length === 1) {\n                while (result.newNodeIndex < this.state.nodes.length) {\n                    result.rows[0].push(this._renderMatrixCell(cellClassName, result.newNodeIndex++));\n                }\n                return result;\n            }\n\n            result.rows[0].push(this._renderMatrixCell(cellClassName, result.newNodeIndex++));\n\n            if (partialDimensionIdsLength > 0) {\n                const previousDimension = partialDimensions[partialDimensionIdsLength - 1];\n\n                while (\n                    result.newNodeIndex < this.state.nodes.length &&\n                    previousDimension === this.state.nodes[result.newNodeIndex].dimensionIds[partialDimensionIdsLength - 1]\n                ) {\n                    result.rows[0].push(this._renderMatrixCell(cellClassName, result.newNodeIndex++));\n                }\n            }\n\n            return result;\n        }\n\n        const rows = this._renderMatrixRowsDesktop(\n            className,\n            dimensions,\n            partialDimensions.concat(currentDimensionId),\n            result.newNodeIndex\n        );\n        result.rows = result.rows.concat(\n            rows.rows.map((cells, index) => {\n                if (index === 0) {\n                    return [this._renderMatrixDimensionCell(cellClassName, currentDimension)].concat(cells);\n                }\n                return [ProductDimensionsMatrix._renderMatrixEmptyCell(cellClassName)].concat(cells);\n            })\n        );\n        result.newNodeIndex = rows.newNodeIndex;\n\n        if (partialDimensionIdsLength > 0) {\n            const previousDimension = partialDimensions[partialDimensionIdsLength - 1];\n            while (\n                result.newNodeIndex < this.state.nodes.length &&\n                previousDimension === this.state.nodes[result.newNodeIndex].dimensionIds[partialDimensionIdsLength - 1]\n            ) {\n                const nextRows = this._renderMatrixRowsDesktop(className, dimensions, partialDimensions, result.newNodeIndex);\n                result.rows = result.rows.concat(nextRows.rows);\n                result.newNodeIndex = nextRows.newNodeIndex;\n            }\n        } else {\n            while (result.newNodeIndex < this.state.nodes.length) {\n                const nextRows = this._renderMatrixRowsDesktop(className, dimensions, partialDimensions, result.newNodeIndex);\n                result.rows = result.rows.concat(nextRows.rows);\n                result.newNodeIndex = nextRows.newNodeIndex;\n            }\n        }\n\n        return result;\n    }\n\n    private _renderMatrixDimensionCell(className: string, dimension: ProductDimensionValueInventoryAvailability): React.ReactElement {\n        const dimensionId = getDimensionId(dimension);\n\n        return (\n            <div className={className} key={dimensionId}>\n                <ProductDimensionsMatrixDimensionItemComponent\n                    className={`${className}__dimension-item`}\n                    apiSettings={this.props.context.request.apiSettings}\n                    item={{\n                        itemId: dimensionId,\n                        value: dimension.DimensionValue?.Value ?? '',\n                        colorHexCode: dimension.DimensionValue?.ColorHexCode,\n                        imageUrl: dimension.DimensionValue?.ImageUrl\n                    }}\n                />\n            </div>\n        );\n    }\n\n    private _renderMatrixCell(className: string, nodeIndex: number): React.ReactElement {\n        const node = this.state.nodes[nodeIndex];\n\n        return (\n            <div\n                key={`${JSON.stringify(node.dimensionIds)}-${this.state.lastChangeAllDate}`}\n                className={classnames(className, node.isAvailable ? `${className}__available` : `${className}__unavailable`)}\n            >\n                {node.isAvailable ? this._renderMatrixQuantityCell(node) : this._renderMatrixOutOfStockCell(`${className}__out-of-stock`)}\n            </div>\n        );\n    }\n\n    private _renderMatrixOutOfStockCell(className: string): React.ReactElement {\n        return (\n            <div className={className} key='out-of-stock'>\n                {this.props.resources.productDimensionsMatrixOutOfStockLabel}\n            </div>\n        );\n    }\n\n    private _renderMatrixQuantityCell(node: IProductDimensionsMatrixNode): React.ReactElement {\n        const maxQuantityForCartLineItem = this.props.context.app.config.maxQuantityForCartLineItem;\n        return (\n            <Quantity\n                key={`${JSON.stringify(node.dimensionIds)}-${this.state.lastChangeAllDate}`}\n                currentCount={node.quantity}\n                onChange={this._handleQuantityChange(node)}\n                inputQuantityAriaLabel={this.props.resources.productDimensionsMatrixInputQuantityAriaLabel}\n                min={ProductDimensionsMatrix._defaultQuantityProps.minQuantity}\n                max={maxQuantityForCartLineItem || ProductDimensionsMatrix._defaultQuantityProps.maxQuantity}\n            />\n        );\n    }\n\n    private _renderTotalSummary(className: string): React.ReactElement {\n        return (\n            <div className={className}>\n                <div className={`${className}__total-quantity`}>{this.state.totalQuantity}</div>\n                <div className={`${className}__total-quantity-label`}>{this.props.resources.productDimensionsMatrixTotalItemsLabel}</div>\n            </div>\n        );\n    }\n\n    private _retrieveProducts(): { productId: number; quantity: number }[] {\n        return this.state.nodes\n            .filter(node => node.productId && node.quantity !== 0)\n            .map(node => {\n                return {\n                    productId: node.productId!,\n                    quantity: node.quantity\n                };\n            });\n    }\n\n    private _renderAddToOrderTemplate(className: string): React.ReactElement | null {\n        if (ObjectExtensions.isNullOrUndefined(this.props.data.orderTemplates)) {\n            return null;\n        }\n\n        return (\n            <AddProductsToOrderTemplateComponent\n                className={className}\n                context={this.props.context}\n                data={{\n                    orderTemplates: this.props.data.orderTemplates,\n                    products: this._retrieveProducts().map(item => {\n                        return {\n                            ProductId: item.productId,\n                            Quantity: item.quantity,\n                            UnitOfMeasure: ''\n                        };\n                    }),\n                    customerInformation: this.props.data.customerInformation\n                }}\n                resources={this.props.resources}\n                isDisabled={this.state.totalQuantity === 0}\n                isMultipleCatalogFeatureEnabledInHq={this.props.isMultipleCatalogFeatureEnabledInHq}\n                catalogId={this.props.catalogId}\n            />\n        );\n    }\n\n    private _renderAddToCart(className: string): React.ReactElement {\n        return (\n            <AddToCartFunctionalComponent\n                key={`${JSON.stringify(this.state.nodes)}`}\n                addToCartText={this.props.resources.productDimensionsMatrixAddItemsToCartButtonText}\n                addToCartArialLabel={this.props.resources.productDimensionsMatrixAddItemsToCartButtonText}\n                id=''\n                typeName=''\n                className={className}\n                navigationUrl={getUrlSync('cart', this.props.context.actionContext)}\n                context={this.props.context}\n                dialogStrings={this.props.resources}\n                shouldSkipSiteSettings\n                data={undefined}\n                products={this._retrieveProducts()}\n                disabled={this.state.totalQuantity === 0}\n                onError={(result): void => {\n                    if (result.cartActionResult?.errorDetails?.LocalizedMessage) {\n                        this.props.onErrorMessage(result.cartActionResult.errorDetails.LocalizedMessage);\n                    }\n                }}\n            />\n        );\n    }\n\n    private _renderFooter(className: string): React.ReactElement {\n        return (\n            <div className={className}>\n                {this._renderTotalSummary(`${className}__total-summary`)}\n                {this._renderFooterActions(`${className}__actions`)}\n            </div>\n        );\n    }\n\n    private _renderFooterActions(className: string): React.ReactElement {\n        return (\n            <div className={className}>\n                {this._renderAddToOrderTemplate(`${className}__add-to-order-template`)}\n                {this._renderAddToCart(`${className}__add-to-cart`)}\n            </div>\n        );\n    }\n\n    /**\n     * Handles quantity change.\n     * @param node - Node which needs to be updated.\n     * @returns Handler method.\n     */\n    private readonly _handleQuantityChange = (node: IProductDimensionsMatrixNode) => (newValue: number = 0) => {\n        if (!node.isAvailable) {\n            return;\n        }\n\n        const difference = newValue - node.quantity;\n        node.quantity = newValue;\n        this.setState(state => {\n            return {\n                totalQuantity: state.totalQuantity + difference\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\n/**\n * Refiner options type.\n */\nexport enum RefinerOptionsType {\n    SingleSelect = 0,\n    MultiSelect = 1\n}\n\n/**\n * Refiner item type.\n */\nexport enum RefinerItemType {\n    Check = 0,\n    DateRange = 1\n}\n\n/**\n * IRefinerItemData interface.\n */\nexport interface IRefinerItemData {\n    refinerItemId: number; // must be unique within the refiner group (sourceTypeValue)\n    sourceTypeValue: number;\n    itemType: RefinerItemType;\n    label: string;\n    value?: string;\n    isChecked?: boolean;\n    minLabel?: string;\n    maxLabel?: string;\n    minValue?: string;\n    maxValue?: string;\n}\n\n/**\n * IRefinerOptionsData interface.\n */\nexport interface IRefinerOptionsData {\n    refinerOptionsId: number; // must be unique within the refiner (sourceTypeValue)\n    sourceTypeValue: number;\n    name?: string;\n    typeValue: RefinerOptionsType;\n    isExpanded?: boolean;\n    refinerItems: IRefinerItemData[];\n    selectedRefinerItems: IRefinerItemData[];\n}\n\n/**\n * IRefinerData interface.\n */\nexport interface IRefinerData {\n    refinerOptions: IRefinerOptionsData[];\n}\n\n/**\n * IRefinerItemToggleNotification interface.\n */\nexport interface IRefinerItemToggleNotification {\n    refinerOptionsData: IRefinerOptionsData;\n    refinerItemData: IRefinerItemData;\n    isSelecting: boolean;\n    rangeStart?: string;\n    rangeEnd?: string;\n}\n\n/**\n * Get updated refinement criteria.\n * @param itemToggleNotification - RefineItemToggleNotification object.\n * @param currentRefinementCriteria - Array of IRefineItemData.\n * @returns - Array of IRefineItemData.\n */\nexport function getUpdatedRefinementCriteria(\n    itemToggleNotification: IRefinerItemToggleNotification,\n    currentRefinementCriteria: IRefinerItemData[]\n): IRefinerItemData[] {\n    const updatedRefinementCriteria: IRefinerItemData[] = [];\n    let isToggledItemFound = false;\n\n    // Keep all the existing refinement criteria, except the given item toggle notification if it is not selected.\n    for (const selectedCriterion of currentRefinementCriteria) {\n        if (isMatchingRefinementCriterion(itemToggleNotification.refinerItemData, selectedCriterion)) {\n            isToggledItemFound = true;\n            if (itemToggleNotification.isSelecting) {\n                const next = {\n                    ...selectedCriterion,\n                    minValue:\n                        itemToggleNotification.rangeStart !== undefined\n                            ? `${itemToggleNotification.rangeStart}`\n                            : selectedCriterion.minValue,\n                    maxValue:\n                        itemToggleNotification.rangeEnd !== undefined ? `${itemToggleNotification.rangeEnd}` : selectedCriterion.maxValue\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 (!isToggledItemFound) {\n        const next = {\n            ...itemToggleNotification.refinerItemData\n        };\n\n        updatedRefinementCriteria.push(next);\n\n        // If single select, then deselect any others in the parent refiner group\n        if (itemToggleNotification.refinerOptionsData.typeValue === RefinerOptionsType.SingleSelect) {\n            for (const child of itemToggleNotification.refinerOptionsData.refinerItems) {\n                if (!(child.refinerItemId === next.refinerItemId && child.label === next.label)) {\n                    const matchingIndex = updatedRefinementCriteria.findIndex(criterion => isMatchingRefinementCriterion(child, criterion));\n                    // eslint-disable-next-line max-depth -- Condition required.\n                    if (matchingIndex > -1) {\n                        updatedRefinementCriteria.splice(matchingIndex, 1);\n                    }\n                }\n            }\n        }\n    }\n\n    return updatedRefinementCriteria;\n}\n\n/**\n * Find the refinement criterion associated with this given refiner value.\n * @param refinerValue - Refiner value to match.\n * @param refinementCriterion - Selected refinement criteria.\n * @returns - Boolean.\n */\nexport function isMatchingRefinementCriterion(refinerValue: IRefinerItemData, refinementCriterion: IRefinerItemData): boolean {\n    return (\n        refinementCriterion.refinerItemId === refinerValue.refinerItemId &&\n        refinementCriterion.label === refinerValue.label &&\n        refinerValue.sourceTypeValue === refinementCriterion.sourceTypeValue\n    );\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport {\n    Button,\n    ITelemetryContent,\n    TelemetryConstant,\n    getPayloadObject,\n    getTelemetryAttributes\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport classnames from 'classnames';\n\n/**\n * Class names used in component.\n */\nconst componentClassName: string = 'msc-refiner-apply';\n\n/**\n * IRefinerApplyComponent interface.\n */\ninterface IRefinerApplyComponent extends IComponent<IRefinerApplyProps> {}\n\n/**\n * IRefinerApplyProps interface.\n */\nexport interface IRefinerApplyProps extends IComponentProps<{}> {\n    className?: string;\n    text?: string;\n    ariaLabel?: string;\n    isDisabled?: boolean;\n    telemetryContent?: ITelemetryContent;\n    onClick?(): void;\n}\n\n/**\n * RefinerApply component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst RefinerApplyFunctionalComponent: React.FC<IRefinerApplyProps> = (props: IRefinerApplyProps) => {\n    const { className, text, ariaLabel, isDisabled, telemetryContent, onClick } = props;\n\n    // define telemetry attributes\n    const applyRefinerAttributes = getTelemetryAttributes(\n        props.telemetryContent!,\n        getPayloadObject('click', telemetryContent!, TelemetryConstant.ApplyRefiner)\n    );\n\n    return (\n        <Button\n            className={classnames(className, componentClassName)}\n            disabled={isDisabled}\n            aria-label={ariaLabel ?? text}\n            aria-disabled={isDisabled}\n            onClick={onClick}\n            {...applyRefinerAttributes}\n        >\n            {text}\n        </Button>\n    );\n};\n\n/**\n * RefinerApply component.\n */\nexport const RefinerApplyComponent: React.FunctionComponent<IRefinerApplyProps> = msdyn365Commerce.createComponent<IRefinerApplyComponent>(\n    'Refiner-Apply',\n    {\n        component: React.memo(RefinerApplyFunctionalComponent)\n    }\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport classnames from 'classnames';\n\nimport { IRefinerItemData, RefinerItemType } from './common';\n\n/**\n * Class names used in component.\n */\nconst componentClassName: string = 'msc-refiner-choice-summary';\nconst labelClassName: string = `${componentClassName}__label`;\nconst listClassName: string = `${componentClassName}__list`;\nconst listItemClassName: string = `${componentClassName}__list-item`;\nconst itemClassName: string = `${componentClassName}__item`;\nconst closeButtonGlyphClassName: string = `${componentClassName}__close-btn`;\nconst buttonGlyphClassName: string = `${componentClassName}__glyph`;\nconst clearAllButtonClassName: string = `${componentClassName}__clear-all`;\n\n/**\n * IRefinerChoiceSummaryClickNotification interface.\n */\nexport interface IRefinerChoiceSummaryClickNotification {\n    selectedRefinerItem: IRefinerItemData | undefined;\n    shouldClearAll: boolean;\n    nextItemToFocus: HTMLElement | undefined;\n}\n\n/**\n * IRefinerChoiceSummaryComponent interface.\n */\ninterface IRefinerChoiceSummaryComponent extends IComponent<IRefinerChoiceSummaryProps> {}\n\n/**\n * IRefinerChoiceSummaryData interface.\n */\nexport interface IRefinerChoiceSummaryData {\n    selectedChoices: IRefinerItemData[];\n}\n\n/**\n * IRefinerChoiceSummaryProps interface.\n */\nexport interface IRefinerChoiceSummaryProps extends IComponentProps<IRefinerChoiceSummaryData> {\n    className?: string;\n    clearAllText?: string;\n    label?: string;\n    choiceAriaLabel?: string;\n    choiceFormat?: string;\n    closeAriaLabel?: string;\n    telemetryContent?: ITelemetryContent;\n    onClickChoice(notification: IRefinerChoiceSummaryClickNotification): void;\n    onClickClearAll(notification: IRefinerChoiceSummaryClickNotification): void;\n}\n\n/**\n * RefinerChoiceSummary component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst RefinerChoiceSummaryFunctionalComponent: React.FC<IRefinerChoiceSummaryProps> = (props: IRefinerChoiceSummaryProps) => {\n    const {\n        className,\n        clearAllText,\n        label,\n        choiceAriaLabel,\n        choiceFormat,\n        closeAriaLabel,\n        data: { selectedChoices },\n        onClickChoice,\n        onClickClearAll\n    } = props;\n\n    /**\n     * Get choice summary name.\n     * @param activeRefinerItem - Active refine Item data.\n     * @returns - Returns the tag name.\n     */\n    const getTagName = (activeRefinerItem: IRefinerItemData): string => {\n        /* eslint-disable @typescript-eslint/prefer-nullish-coalescing -- Required for string.  */\n        const overallFormat = choiceFormat ?? '{0}';\n\n        const refinerLabel: string = activeRefinerItem.label;\n        let refinerValue: string = activeRefinerItem.value ?? '';\n        if (activeRefinerItem.itemType === RefinerItemType.DateRange) {\n            const refinerMinValue: string = activeRefinerItem.minValue ?? '';\n            const refinerMaxValue: string = activeRefinerItem.maxValue ?? '';\n            refinerValue = '{0} - {1}'.replace('{0}', refinerMinValue).replace('{1}', refinerMaxValue);\n        }\n\n        return overallFormat.replace('{0}', refinerLabel).replace('{1}', refinerValue);\n        /* eslint-enable @typescript-eslint/prefer-nullish-coalescing -- Required for string.  */\n    };\n\n    const onClickChoiceHandler = React.useCallback(\n        (selectedRefinerItem: IRefinerItemData) => (event: React.MouseEvent<HTMLAnchorElement, MouseEvent>): void => {\n            event.preventDefault();\n            event.stopPropagation();\n\n            const targetChoiceItem = event.currentTarget as HTMLElement;\n\n            onClickChoice({\n                selectedRefinerItem,\n                shouldClearAll: false,\n                nextItemToFocus: targetChoiceItem.nextSibling as HTMLElement\n            });\n        },\n        [onClickChoice]\n    );\n\n    const onClickClearAllHandler = React.useCallback(\n        () => (event: React.MouseEvent<HTMLAnchorElement, MouseEvent>): void => {\n            event.preventDefault();\n            event.stopPropagation();\n\n            const targetChoiceItem = event.currentTarget as HTMLElement;\n\n            onClickClearAll({\n                selectedRefinerItem: undefined,\n                shouldClearAll: true,\n                nextItemToFocus: targetChoiceItem.nextSibling as HTMLElement\n            });\n        },\n        [onClickClearAll]\n    );\n\n    // define telemetry attributes\n    const payLoad: IPayLoad = getPayloadObject('click', props.telemetryContent!, '');\n    payLoad.contentAction.etext = clearAllText;\n    const clearAllAttributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n    return (\n        <div className={componentClassName}>\n            {ArrayExtensions.hasElements(selectedChoices) && label && <span className={labelClassName}>{label}</span>}\n            <ul className={classnames(className, listClassName, 'list-unstyled')}>\n                {ArrayExtensions.hasElements(selectedChoices) &&\n                    selectedChoices.map((choiceItem, index) => {\n                        const choiceItemName = getTagName(choiceItem);\n\n                        // define telemetry attributes\n                        payLoad.contentAction.etext = choiceItemName;\n                        const choiceItemAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n                        return (\n                            <li className={listItemClassName} key={index}>\n                                <a\n                                    key={choiceItem.refinerItemId}\n                                    className={itemClassName}\n                                    role='button'\n                                    aria-label={`${choiceItemName} ${choiceAriaLabel ?? ''}`}\n                                    onClick={onClickChoiceHandler(choiceItem)}\n                                    {...choiceItemAttribute}\n                                >\n                                    {choiceItemName}\n                                    <span\n                                        className={classnames(closeButtonGlyphClassName, buttonGlyphClassName)}\n                                        role='button'\n                                        aria-label={closeAriaLabel}\n                                    />\n                                </a>\n                            </li>\n                        );\n                    })}\n            </ul>\n            {ArrayExtensions.hasElements(selectedChoices) && clearAllText && (\n                <a\n                    className={clearAllButtonClassName}\n                    aria-label={closeAriaLabel}\n                    onClick={onClickClearAllHandler()}\n                    {...clearAllAttributes}\n                >\n                    {clearAllText}\n                </a>\n            )}\n        </div>\n    );\n};\n\n/**\n * RefinerChoiceSummary component.\n */\nexport const RefinerChoiceSummaryComponent: React.FunctionComponent<IRefinerChoiceSummaryProps> = msdyn365Commerce.createComponent<\n    // @ts-expect-error -- Required for this signature.\n    IRefinerChoiceSummaryComponent\n>('Refiner-Choice-Summary', { component: React.memo(RefinerChoiceSummaryFunctionalComponent) });\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport * as React from 'react';\n\nimport classnames from 'classnames';\n\nimport { IRefinerApplyProps, RefinerApplyComponent } from './refiner-apply.component';\n\n/**\n * Class names used in component.\n */\nconst componentClassName: string = 'msc-refiner-footer';\nconst actionsWrapperClassName: string = `${componentClassName}__actions`;\nconst extraActionsWrapperClassName: string = `${componentClassName}__extra-actions`;\n\n/**\n * IRefinerFooterComponent interface.\n */\ninterface IRefinerFooterComponent extends IComponent<IRefinerFooterProps> {}\n\n/**\n * IRefinerFooterProps interface.\n */\nexport interface IRefinerFooterProps extends IComponentProps<{}> {\n    className?: string;\n    refinerApplyProps?: IRefinerApplyProps;\n    extraActions?: React.ReactNode;\n}\n\n/**\n * RefinerFooter component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst RefinerFooterFunctionalComponent: React.FC<IRefinerFooterProps> = (props: IRefinerFooterProps) => {\n    const { className, refinerApplyProps, extraActions } = props;\n\n    return (\n        <div className={classnames(className, componentClassName)}>\n            <div className={actionsWrapperClassName}>\n                {extraActions && <div className={extraActionsWrapperClassName}>{extraActions}</div>}\n                {refinerApplyProps && <RefinerApplyComponent {...refinerApplyProps} />}\n            </div>\n        </div>\n    );\n};\n\n/**\n * RefinerFooter component.\n */\nexport const RefinerFooterComponent: React.FunctionComponent<IRefinerFooterProps> = msdyn365Commerce.createComponent<\n    IRefinerFooterComponent\n>('Refiner-Footer', {\n    component: React.memo(RefinerFooterFunctionalComponent)\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport classnames from 'classnames';\n\n/**\n * Class names used in component.\n */\nconst componentClassName = 'msc-refiner-toggle';\nconst expandedComponentClassName = `${componentClassName}__toggle_expanded`;\nconst collapsedComponentClassName = `${componentClassName}__toggle_collapsed`;\n\n/**\n * IRefinerToggleComponent interface.\n */\ninterface IRefinerToggleComponent extends IComponent<IRefinerToggleProps> {}\n\n/**\n * IRefinerToggleProps interface.\n */\nexport interface IRefinerToggleProps extends IComponentProps<{}> {\n    className?: string;\n    text?: string;\n    ariaLabel?: string;\n    isDisabled?: boolean;\n    isExpanded?: boolean;\n    onClick?(): void;\n}\n\n/**\n * RefinerToggle component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst RefinerToggleFunctionalComponent: React.FC<IRefinerToggleProps> = (props: IRefinerToggleProps) => {\n    const { className, text, ariaLabel, isDisabled, isExpanded, onClick } = props;\n\n    return (\n        <Button\n            className={classnames(className, isExpanded ? expandedComponentClassName : collapsedComponentClassName)}\n            disabled={isDisabled}\n            aria-label={ariaLabel ?? text}\n            aria-expanded={!!isExpanded}\n            aria-disabled={isDisabled}\n            onClick={onClick}\n        >\n            {text}\n        </Button>\n    );\n};\n\n/**\n * RefinerToggle component.\n */\nexport const RefinerToggleComponent: React.FunctionComponent<IRefinerToggleProps> = msdyn365Commerce.createComponent<\n    IRefinerToggleComponent\n>('Refiner-Toggle', {\n    component: React.memo(RefinerToggleFunctionalComponent)\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport React from 'react';\n\nimport classnames from 'classnames';\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\nlet selectHtmlElement: React.RefObject<HTMLSelectElement>;\n\n/**\n * Class names used in component.\n */\nconst componentClassName = 'msc-refiner-sort';\nconst sortOptionsClassName = `${componentClassName}__sort-options`;\nconst sortOptionClassName = `${componentClassName}__sort-option`;\nconst sortOptionSelectedClassName = `${componentClassName}__sort-option-selected`;\nconst labelId = `${componentClassName}__label`;\nconst selectLabelId = `${componentClassName}__select`;\nconst labelClassName = `${componentClassName}__label`;\n\n/**\n * IRefinerSortComponent interface.\n */\ninterface IRefinerSortComponent extends IComponent<IRefinerSortProps> {}\n\n/**\n * IRefinerSortData interface.\n */\nexport interface IRefinerSortData {\n    options: IRefinerSortOption[];\n}\n\n/**\n * IRefinerSortOption interface.\n */\nexport interface IRefinerSortOption {\n    label: string;\n    value: string;\n}\n\n/**\n * IRefinerSortProps interface.\n */\nexport interface IRefinerSortProps extends IComponentProps<IRefinerSortData> {\n    className?: string;\n    currentSortOption?: IRefinerSortOption;\n    label?: string;\n    ariaLabel?: string;\n    isDisabled?: boolean;\n    telemetryContent?: ITelemetryContent;\n    onSelectOption?(newSortOption?: IRefinerSortOption): void;\n}\n\n/**\n * RefinerSort component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst RefinerSortFunctionalComponent: React.FC<IRefinerSortProps> = (props: IRefinerSortProps) => {\n    const [sortOptionState, setSortOptionState] = React.useState(props.currentSortOption);\n\n    const onSelectOptionHandler = (event: React.ChangeEvent<HTMLSelectElement>) => {\n        const value = event.target.value;\n        const sortOption = props.data.options?.find((option: IRefinerSortOption) => option.value === value);\n        setSortOptionState(sortOption);\n        props.onSelectOption?.(sortOption);\n    };\n\n    // TODO: define telemetry attributes\n    // const attributes = getTelemetryAttributes(\n    //     props.telemetryContent!,\n    //     getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Sort)\n    // );\n\n    return (\n        <div className={classnames(props.className, componentClassName)}>\n            {ArrayExtensions.hasElements(props.data.options) && (\n                <label id={labelId} htmlFor={selectLabelId} className={labelClassName}>\n                    {props.label}\n                    <select\n                        id={selectLabelId}\n                        ref={selectHtmlElement}\n                        className={sortOptionsClassName}\n                        value={sortOptionState?.value}\n                        title={props.ariaLabel ?? ''}\n                        disabled={props.isDisabled}\n                        aria-label={props.ariaLabel ?? ''}\n                        aria-disabled={props.isDisabled}\n                        onChange={onSelectOptionHandler}\n                    >\n                        {props.data.options?.map((option: IRefinerSortOption) => {\n                            return (\n                                <option\n                                    key={option.value}\n                                    value={option.value}\n                                    aria-label={option.label}\n                                    aria-selected={option.value === sortOptionState?.value}\n                                    className={classnames(\n                                        sortOptionClassName,\n                                        option.value === sortOptionState?.value ? sortOptionSelectedClassName : ''\n                                    )}\n                                >\n                                    {option.label}\n                                </option>\n                            );\n                        })}\n                    </select>\n                </label>\n            )}\n        </div>\n    );\n};\n\n/**\n * RefinerSort component.\n */\nexport const RefinerSortComponent: React.FunctionComponent<IRefinerSortProps> = msdyn365Commerce.createComponent<IRefinerSortComponent>(\n    'Refiner-Sort',\n    { component: React.memo(RefinerSortFunctionalComponent) }\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport classnames from 'classnames';\n\nimport { IRefinerToggleProps, RefinerToggleComponent } from './refiner-toggle.component';\nimport { IRefinerChoiceSummaryProps, RefinerChoiceSummaryComponent } from './refiner-choice-summary.component';\nimport { IRefinerSortProps, RefinerSortComponent } from './refiner-sort.component';\n\n/**\n * Class names used in component.\n */\nconst componentClassName = 'msc-refiner-header';\nconst choiceSummaryWrapperClassName = `${componentClassName}__wrapper-choice-summary`;\nconst moreActionsWrapperClassName = `${componentClassName}__wrapper-more-actions`;\nconst extraActionsWrapperClassName = `${componentClassName}__wrapper-extra-actions`;\n\n/**\n * IRefinerHeaderComponent interface.\n */\ninterface IRefinerHeaderComponent extends IComponent<IRefinerHeaderProps> {}\n\n/**\n * IRefinerHeaderProps interface.\n */\nexport interface IRefinerHeaderProps extends IComponentProps<{}> {\n    className?: string;\n    refinerToggleProps?: IRefinerToggleProps;\n    refinerChoiceSummaryProps?: IRefinerChoiceSummaryProps;\n    refinerSortProps?: IRefinerSortProps;\n    extraActions?: React.ReactNode;\n}\n\n/**\n * RefinerHeader component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst RefinerHeaderFunctionalComponent: React.FC<IRefinerHeaderProps> = (props: IRefinerHeaderProps) => {\n    const { className, extraActions } = props;\n\n    return (\n        <Node className={classnames(className, componentClassName)}>\n            {props.refinerToggleProps && <RefinerToggleComponent {...props.refinerToggleProps} />}\n            {props.refinerChoiceSummaryProps && (\n                <div className={choiceSummaryWrapperClassName}>\n                    <RefinerChoiceSummaryComponent {...props.refinerChoiceSummaryProps} />\n                </div>\n            )}\n            <div className={moreActionsWrapperClassName}>\n                {props.refinerSortProps && <RefinerSortComponent {...props.refinerSortProps} />}\n                {extraActions && <div className={extraActionsWrapperClassName}>{extraActions}</div>}\n            </div>\n        </Node>\n    );\n};\n\n/**\n * RefinerHeader component.\n */\nexport const RefinerHeaderComponent: React.FunctionComponent<IRefinerHeaderProps> = msdyn365Commerce.createComponent<\n    IRefinerHeaderComponent\n>('Refiner-Header', {\n    component: React.memo(RefinerHeaderFunctionalComponent)\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport classnames from 'classnames';\n\n/**\n * Class names used in component.\n */\nconst componentClassName = 'msc-refiner-item-check';\nconst labelClassName = `${componentClassName}__label`;\n\n/**\n * IRefinerItemCheckComponent interface.\n */\ninterface IRefinerItemCheckComponent extends IComponent<IRefinerItemCheckProps> {}\n\n/**\n * IRefinerItemCheckProps interface.\n */\nexport interface IRefinerItemCheckProps extends IComponentProps<{}> {\n    className?: string;\n    label: string;\n    ariaLabel?: string;\n    isDisabled?: boolean;\n    isSingleSelect: boolean;\n    isChecked?: boolean;\n    telemetryContent?: ITelemetryContent;\n    onClick(): void;\n}\n\n/**\n * RefinerItemCheck component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst RefinerItemCheckFunctionalComponent: React.FC<IRefinerItemCheckProps> = (props: IRefinerItemCheckProps) => {\n    const { className, isDisabled, label, ariaLabel, isSingleSelect, isChecked, onClick, telemetryContent } = props;\n\n    let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\n    itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\n\n    // define telemetry attributes\n    const payLoad: IPayLoad = getPayloadObject('click', telemetryContent!, '');\n    payLoad.contentAction.etext = label;\n    const refinerItemAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n\n    const onClickHandler = (event: React.MouseEvent<HTMLAnchorElement | HTMLInputElement>): void => {\n        event.preventDefault();\n        event.stopPropagation();\n\n        !props.isDisabled && onClick();\n    };\n\n    return (\n        <a\n            tabIndex={0}\n            className={classnames(className, componentClassName, itemTypeClassName, isDisabled ? 'disabled' : '')}\n            role={isSingleSelect ? 'radio' : 'checkbox'}\n            aria-label={ariaLabel ?? label}\n            aria-checked={isChecked}\n            aria-disabled={isDisabled}\n            onClick={onClickHandler}\n            {...refinerItemAttributes}\n        >\n            <span className={labelClassName} aria-hidden='true'>\n                {label}\n            </span>\n        </a>\n    );\n};\n\n/**\n * RefinerItemCheck component.\n */\nexport const RefinerItemCheckComponent: React.FunctionComponent<IRefinerItemCheckProps> = msdyn365Commerce.createComponent<\n    // @ts-expect-error -- Required for this signature.\n    IRefinerItemCheckComponent\n>('Refiner-Item-Check', {\n    component: React.memo(RefinerItemCheckFunctionalComponent)\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport React from 'react';\n\nimport classnames from 'classnames';\n\nlet minInput: React.RefObject<HTMLInputElement>;\n\nlet maxInput: React.RefObject<HTMLInputElement>;\n\n/**\n * Class names used in component.\n */\nconst componentClassName = 'msc-refiner-item-daterange';\nconst minLabelClassName = `${componentClassName}__label-min`;\nconst maxLabelClassName = `${componentClassName}__label-max`;\nconst minInputClassName = `${componentClassName}__input-min`;\nconst maxInputClassName = `${componentClassName}__input-max`;\nconst minLabelId = `${componentClassName}__label-min`;\nconst maxLabelId = `${componentClassName}__label-max`;\nconst minInputLabelId = `${componentClassName}__input-min`;\nconst maxInputLabelId = `${componentClassName}__input-max`;\nconst validationErrorMessageClassName = `${componentClassName}__error`;\n\n/**\n * IRefinerItemDateRangeComponent interface.\n */\ninterface IRefinerItemDateRangeComponent extends IComponent<IRefinerItemDateRangeProps> {}\n\n/**\n * IRefinerItemDateRangeProps interface.\n */\nexport interface IRefinerItemDateRangeProps extends IComponentProps<{}> {\n    className?: string;\n    minInputLabel?: string;\n    maxInputLabel?: string;\n    minInputAriaLabel?: string;\n    maxInputAriaLabel?: string;\n    isDisabled?: boolean;\n    minRangeValue?: string;\n    maxRangeValue?: string;\n    validationErrorForRange?: string;\n    fallbackPattern?: string;\n    onChangeMinValue?(minValue: string): void;\n    onChangeMaxValue?(maxValue: string): void;\n    onBlurMinInput?(minValue: string): void;\n    onBlurMaxInput?(maxValue: string): void;\n}\n\n/**\n * RefinerItemDateRange component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst RefinerItemDateRangeFunctionalComponent: React.FC<IRefinerItemDateRangeProps> = (props: IRefinerItemDateRangeProps) => {\n    const {\n        className,\n        minInputLabel,\n        maxInputLabel,\n        minInputAriaLabel,\n        maxInputAriaLabel,\n        isDisabled,\n        minRangeValue,\n        maxRangeValue,\n        validationErrorForRange,\n        fallbackPattern,\n        onChangeMinValue,\n        onChangeMaxValue,\n        onBlurMinInput,\n        onBlurMaxInput\n    } = props;\n    const [selectedMinValue, setSelectedMinValue] = React.useState(minRangeValue);\n    const [selectedMaxValue, setSelectedMaxValue] = React.useState(maxRangeValue);\n    const [validationErrorMessageForRange, setValidationErrorMessageForRange] = React.useState('');\n\n    const onChangeMinValueHandler = (event: React.FocusEvent<HTMLInputElement>): void => {\n        const selectedFormattedValue = event.target.value;\n        setSelectedMinValue(selectedFormattedValue);\n        onChangeMinValue?.(selectedFormattedValue);\n    };\n\n    const onChangeMaxValueHandler = (event: React.FocusEvent<HTMLInputElement>): void => {\n        const selectedFormattedValue = event.target.value;\n        setSelectedMaxValue(selectedFormattedValue);\n        onChangeMaxValue?.(selectedFormattedValue);\n    };\n\n    function validateRange(minimum?: string, maximum?: string): boolean {\n        if (validationErrorForRange && minimum && maximum && minimum > maximum) {\n            setValidationErrorMessageForRange(validationErrorForRange);\n            return false;\n        }\n        setValidationErrorMessageForRange('');\n        return true;\n    }\n\n    const onBlurMinValueHandler = (event: React.FocusEvent<HTMLInputElement>) => {\n        const userSelectedMinValue = event.target.value;\n        setSelectedMinValue(userSelectedMinValue);\n        const updatedMinInput = userSelectedMinValue;\n        if (validateRange(updatedMinInput, selectedMaxValue)) {\n            onBlurMinInput?.(updatedMinInput);\n        }\n    };\n\n    const onBlurMaxValueHandler = (event: React.FocusEvent<HTMLInputElement>) => {\n        const userSelectedMaxValue = event.target.value;\n        setSelectedMaxValue(userSelectedMaxValue);\n        const updatedMaxInput = userSelectedMaxValue;\n        if (validateRange(selectedMinValue, updatedMaxInput)) {\n            onBlurMaxInput?.(updatedMaxInput);\n        }\n    };\n\n    return (\n        <form\n            className={classnames(className, componentClassName)}\n            aria-disabled={isDisabled}\n            data-testid='range-refine-input-item-container'\n        >\n            <label id={minLabelId} htmlFor={minInputLabelId} className={minLabelClassName}>\n                {minInputLabel}\n                <input\n                    className={minInputClassName}\n                    type='date'\n                    onChange={onChangeMinValueHandler}\n                    onBlur={onBlurMinValueHandler}\n                    value={selectedMinValue}\n                    id={minInputLabelId}\n                    ref={minInput}\n                    aria-label={minInputAriaLabel ?? minInputLabel}\n                    aria-disabled={isDisabled}\n                    pattern={fallbackPattern}\n                />\n            </label>\n            <label id={maxLabelId} htmlFor={maxInputLabelId} className={maxLabelClassName}>\n                {maxInputLabel}\n                <input\n                    className={maxInputClassName}\n                    type='date'\n                    onChange={onChangeMaxValueHandler}\n                    onBlur={onBlurMaxValueHandler}\n                    value={selectedMaxValue}\n                    id={maxInputLabelId}\n                    ref={maxInput}\n                    aria-label={maxInputAriaLabel ?? maxInputLabel}\n                    aria-disabled={isDisabled}\n                    pattern={fallbackPattern}\n                />\n            </label>\n            {validationErrorMessageForRange && validationErrorMessageForRange !== '' && (\n                <span className={validationErrorMessageClassName}>{validationErrorMessageForRange}</span>\n            )}\n        </form>\n    );\n};\n\n/**\n * RefinerItemDateRange component.\n */\nexport const RefinerItemDateRangeComponent: React.FunctionComponent<IRefinerItemDateRangeProps> = msdyn365Commerce.createComponent<\n    IRefinerItemDateRangeComponent\n>('Refiner-Item-DateRange', { component: React.memo(RefinerItemDateRangeFunctionalComponent) });\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\nimport { IRefinerSortProps, RefinerSortComponent } from './refiner-sort.component';\n\n/**\n * Class names used in component\n */\nconst componentModalClassName = 'msc-refiner-modal';\nconst closeModalClassName = `${componentModalClassName}__close`;\nconst modalContentClassName = `${componentModalClassName}__content`;\nconst modalContentWrapperClassName = `${componentModalClassName}__wrapper`;\nconst modalContentWrapper2ClassName = `${componentModalClassName}__wrapper-internal`;\nconst componentModalToggleClassName = `${componentModalClassName}-toggle`;\n\n/**\n * IRefinerModalToggleComponent interface.\n */\ninterface IRefinerModalToggleComponent extends IComponent<IRefinerModalToggleProps> {}\n\n/**\n * IRefinerModalComponent interface.\n */\ninterface IRefinerModalComponent extends IComponent<IRefinerModalProps> {}\n\n/**\n * IRefinerModalToggleProps interface.\n */\nexport interface IRefinerModalToggleProps extends IComponentProps<{}> {\n    innerRef: React.RefObject<HTMLButtonElement> | undefined;\n    id: string;\n    text: string;\n    ariaLabel: string;\n    onClick(): void;\n}\n\n/**\n * IRefinerModalProps interface.\n */\nexport interface IRefinerModalProps extends IComponentProps<{}> {\n    modalTitle?: string;\n    modalCloseButtonText?: string;\n    isOpen?: boolean;\n    returnRef?: React.RefObject<HTMLButtonElement> | undefined;\n    refinerSortProps?: IRefinerSortProps;\n    refinerOptions?: React.ReactNode[];\n    onToggle?(): void;\n}\n\n/**\n * Returns the modal.\n * @param  props - IRefinerModalProps.\n * @returns Modal node.\n */\nconst modalNode = (props: IRefinerModalProps) => {\n    return (\n        <Modal\n            autoFocus\n            applicationNode='renderPage'\n            returnFocusRef={props.returnRef}\n            isOpen={props.isOpen}\n            toggle={props.onToggle}\n            className={componentModalClassName}\n            zIndex={1050}\n        />\n    );\n};\n\n/**\n * Returns the modal header.\n * @param  props - IRefinerModalProps.\n * @returns ModalHeader node.\n */\nconst modalHeaderNode = (props: IRefinerModalProps) => {\n    return <ModalHeader toggle={props.onToggle}>{props.modalTitle}</ModalHeader>;\n};\n\n/**\n * Returns the modal footer.\n * @param  props - IRefinerModalProps.\n * @returns ModalFooter node.\n */\nconst modalFooterNode = (props: IRefinerModalProps) => {\n    return (\n        <ModalFooter>\n            <Button onClick={props.onToggle} className={closeModalClassName}>\n                {props.modalCloseButtonText}\n            </Button>\n        </ModalFooter>\n    );\n};\n\n/**\n * RefinerToggle component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nexport const RefinerModalToggleFunctionalComponent: React.FC<IRefinerModalToggleProps> = (props: IRefinerModalToggleProps) => {\n    const { text, onClick, ariaLabel, innerRef, id } = props;\n    return (\n        <button id={id} className={componentModalToggleClassName} aria-label={ariaLabel} onClick={onClick} ref={innerRef}>\n            {text}\n        </button>\n    );\n};\n\n/**\n * RefinerModal component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst RefinerModalFunctionalComponent: React.FC<IRefinerModalProps> = (props: IRefinerModalProps) => {\n    return (\n        <>\n            {React.cloneElement(\n                modalNode(props),\n                {},\n                modalHeaderNode(props),\n                <ModalBody className={modalContentClassName}>\n                    <div className={modalContentWrapperClassName}>\n                        <div className={modalContentWrapper2ClassName}>\n                            {props.refinerSortProps && <RefinerSortComponent {...props.refinerSortProps} />}\n                            {props.refinerOptions &&\n                                props.refinerOptions.map((item, index) => <React.Fragment key={index}>{item}</React.Fragment>)}\n                        </div>\n                    </div>\n                </ModalBody>,\n                modalFooterNode(props)\n            )}\n        </>\n    );\n};\n\n/**\n * RefinerModalToggle component.\n */\nexport const RefinerModalToggleComponent: React.FunctionComponent<IRefinerModalToggleProps> = msdyn365Commerce.createComponent<\n    // @ts-expect-error -- Required for this signature.\n    IRefinerModalToggleComponent\n>('Refiner-Modal-Toggle', {\n    component: React.memo(RefinerModalToggleFunctionalComponent)\n});\n\n/**\n * RefinerModal component.\n */\nexport const RefinerModalComponent: React.FunctionComponent<IRefinerModalProps> = msdyn365Commerce.createComponent<IRefinerModalComponent>(\n    'Refiner-Modal',\n    {\n        component: React.memo(RefinerModalFunctionalComponent)\n    }\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IAny, IComponent, IComponentProps, ICoreContext, IGeneric, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { Button, ITelemetryContent, Collapse } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport classnames from 'classnames';\n\nimport { IRefinerItemDateRangeProps, RefinerItemDateRangeComponent } from './refiner-item-daterange.component';\nimport { IRefinerItemCheckProps, RefinerItemCheckComponent } from './refiner-item-check.component';\nimport {\n    IRefinerItemData,\n    IRefinerItemToggleNotification,\n    IRefinerOptionsData,\n    RefinerItemType,\n    RefinerOptionsType,\n    isMatchingRefinementCriterion\n} from './common';\n\n// eslint-disable-next-line @typescript-eslint/naming-convention -- This is the standard rule for naming a constant.\nconst DEFAULT_REFINER_OPTIONS_EXPAND_TIMEOUT = 350;\n\n/**\n * Class names used in component.\n */\nconst componentClassName = 'msc-refiner-options';\nconst expandedClassName = `${componentClassName}__toggle_expanded`;\nconst collapsedClassName = `${componentClassName}__toggle_collapsed`;\nconst listClassName = `${componentClassName}__list`;\nconst listItemClassName = `${componentClassName}__list-item`;\n\n/**\n * IRefinerOptionsComponent interface.\n */\ninterface IRefinerOptionsComponent extends IComponent<IRefinerOptionsProps> {}\n\n/**\n * IRefinerOptionsProps interface.\n */\nexport interface IRefinerOptionsProps extends IComponentProps<IRefinerOptionsData> {\n    context: ICoreContext<IGeneric<IAny>>;\n    className: string;\n    isDisabled: boolean;\n    isExpandedOnInitialLoad: boolean;\n    expandTimeout?: number;\n    telemetryContent?: ITelemetryContent;\n    onUpdateRefiners(notification: IRefinerItemToggleNotification): void;\n}\n\n/**\n * RefinerOptions component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst RefinerOptionsFunctionalComponent: React.FC<IRefinerOptionsProps> = (props: IRefinerOptionsProps) => {\n    const {\n        className,\n        context,\n        id: moduleId,\n        typeName,\n        data,\n        isDisabled,\n        isExpandedOnInitialLoad,\n        expandTimeout,\n        telemetryContent,\n        onUpdateRefiners\n    } = props;\n\n    const [shouldRefinerExpand, setShouldRefinerExpand] = React.useState(isExpandedOnInitialLoad);\n    const [isRefinerExpanded, setIsRefinerExpanded] = React.useState(false);\n\n    const onEntering = React.useCallback(() => {\n        setIsRefinerExpanded(!isRefinerExpanded);\n    }, [isRefinerExpanded]);\n\n    const onToggleRefinerOptions = React.useCallback(() => {\n        setShouldRefinerExpand(!shouldRefinerExpand);\n    }, [shouldRefinerExpand]);\n\n    const onClickRefinerItem = React.useCallback(\n        (selectedRefinerItem: IRefinerItemData) => () => {\n            onUpdateRefiners({\n                refinerOptionsData: data,\n                refinerItemData: selectedRefinerItem,\n                isSelecting: !selectedRefinerItem.isChecked\n            });\n        },\n        [onUpdateRefiners, data]\n    );\n\n    const onMinValueUpdate = React.useCallback(\n        (selectedRefinerItem: IRefinerItemData) => (updatedMin: string) => {\n            onUpdateRefiners({\n                refinerOptionsData: data,\n                refinerItemData: selectedRefinerItem,\n                isSelecting: true,\n                rangeStart: updatedMin\n            });\n        },\n        [onUpdateRefiners, data]\n    );\n\n    const onMaxValueUpdate = React.useCallback(\n        (selectedRefinerItem: IRefinerItemData) => (updatedMax: string) => {\n            onUpdateRefiners({\n                refinerOptionsData: data,\n                refinerItemData: selectedRefinerItem,\n                isSelecting: true,\n                rangeEnd: updatedMax\n            });\n        },\n        [onUpdateRefiners, data]\n    );\n\n    /**\n     * Renders RefinerItem components.\n     * @param refineItems - Contains the refiner items.\n     * @returns - Refiner item components.\n     */\n    const renderRefinerItems = (refinerItems: IRefinerItemData[]) => {\n        return refinerItems.map((refinerItem, index) => {\n            const isSingleSelectValue = data.typeValue === RefinerOptionsType.SingleSelect;\n            const selectedItem = data.selectedRefinerItems.find((selectedItem: IRefinerItemData) =>\n                isMatchingRefinementCriterion(refinerItem, selectedItem)\n            );\n\n            refinerItem.isChecked = !!selectedItem;\n            refinerItem.minValue = selectedItem?.minValue;\n            refinerItem.maxValue = selectedItem?.maxValue;\n\n            const refinerItemCheckProps = {\n                context: context,\n                id: moduleId,\n                typeName: typeName,\n                data: refinerItem,\n                label: refinerItem.label ?? '',\n                ariaLabel: refinerItem.label ?? '',\n                isChecked: refinerItem.isChecked,\n                isSingleSelect: isSingleSelectValue,\n                isDisabled: isDisabled,\n                telemetryContent: telemetryContent,\n                onClick: onClickRefinerItem(refinerItem)\n            } as IRefinerItemCheckProps;\n\n            switch (refinerItem.itemType) {\n                case RefinerItemType.DateRange:\n                    const refinerDataRangeProps = {\n                        context: context,\n                        id: moduleId,\n                        typeName: typeName,\n                        data: refinerItem,\n                        minInputLabel: refinerItem.minLabel ?? '',\n                        maxInputLabel: refinerItem.maxLabel ?? '',\n                        minInputAriaLabel: refinerItem.minLabel ?? '',\n                        maxInputAriaLabel: refinerItem.maxLabel ?? '',\n                        minRangeValue: refinerItem.minValue,\n                        maxRangeValue: refinerItem.maxValue,\n                        isDisabled: isDisabled,\n                        onBlurMinInput: onMinValueUpdate(refinerItem),\n                        onBlurMaxInput: onMaxValueUpdate(refinerItem)\n                    } as IRefinerItemDateRangeProps;\n\n                    return (\n                        <li className={listItemClassName} id={`${refinerItem.label}_${index}`} key={refinerItem.refinerItemId}>\n                            <RefinerItemCheckComponent {...refinerItemCheckProps} />\n                            {refinerItem.isChecked && <RefinerItemDateRangeComponent {...refinerDataRangeProps} />}\n                        </li>\n                    );\n                default:\n                    return (\n                        <li className={listItemClassName} id={`${refinerItem.label}_${index}`} key={refinerItem.refinerItemId}>\n                            <RefinerItemCheckComponent {...refinerItemCheckProps} />\n                        </li>\n                    );\n            }\n        });\n    };\n\n    return (\n        <div className={classnames(className, componentClassName, 'list-group', data.name ?? '')} key={data.name}>\n            <Button\n                className={shouldRefinerExpand ? expandedClassName : collapsedClassName}\n                aria-label={data.name}\n                aria-expanded={shouldRefinerExpand}\n                onClick={onToggleRefinerOptions}\n            >\n                {data.name}\n            </Button>\n            <Collapse\n                isOpen={shouldRefinerExpand}\n                onEntering={onEntering}\n                timeout={expandTimeout ?? DEFAULT_REFINER_OPTIONS_EXPAND_TIMEOUT}\n            >\n                <ul className={classnames(listClassName, data.name ?? '')} aria-label={data.name}>\n                    {renderRefinerItems(data.refinerItems)}\n                </ul>\n            </Collapse>\n        </div>\n    );\n};\n\n/**\n * RefinerOptions component.\n */\nexport const RefinerOptionsComponent: React.FunctionComponent<IRefinerOptionsProps> = msdyn365Commerce.createComponent<\n    // @ts-expect-error -- Required for this signature.\n    IRefinerOptionsComponent\n>('Refiner-Options', {\n    component: React.memo(RefinerOptionsFunctionalComponent)\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { Node } from '@msdyn365-commerce-modules/utilities';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport * as React from 'react';\n\nimport classnames from 'classnames';\n\nimport { IRefinerHeaderProps, RefinerHeaderComponent } from './refiner-header.component';\nimport { RefinerChoiceSummaryComponent } from './refiner-choice-summary.component';\nimport { IRefinerFooterProps, RefinerFooterComponent } from './refiner-footer.component';\nimport {\n    IRefinerModalProps,\n    IRefinerModalToggleProps,\n    RefinerModalComponent,\n    RefinerModalToggleComponent\n} from './refiner-modal.component';\n\n/**\n * Class names used in component\n */\nconst componentClassName: string = 'msc-refiner';\nconst refinerContentWrapperClassName: string = `${componentClassName}__wrapper`;\nconst refinerOptionsWrapperClassName: string = `${componentClassName}__wrapper-internal`;\nconst modalToggleWrapperClassName: string = `${componentClassName}__wrapper-refiner-modal-toggle`;\nconst modalToggleMoreActionsWrapperClassName = `${modalToggleWrapperClassName}__wrapper-more-actions`;\nconst modalToggleExtraActionsWrapperClassName = `${modalToggleWrapperClassName}__wrapper-extra-actions`;\n\n/**\n * IRefinerComponent interface.\n */\ninterface IRefinerComponent extends IComponent<IRefinerProps> {}\n\n/**\n * IRefinerProps interface.\n */\nexport interface IRefinerProps extends IComponentProps<{}> {\n    className?: string;\n    refinerModalToggleProps?: IRefinerModalToggleProps;\n    refinerModalProps?: IRefinerModalProps;\n    refinerHeaderProps?: IRefinerHeaderProps;\n    refinerFooterProps?: IRefinerFooterProps;\n    refinerOptions?: React.ReactNode[];\n    isMobileView?: boolean;\n    isExpanded?: boolean;\n}\n\nfunction createComponentInMobileView(props: IRefinerProps): React.ReactNode {\n    const refinerChoiceSummaryProps = props.refinerHeaderProps?.refinerChoiceSummaryProps;\n\n    return (\n        <>\n            {refinerChoiceSummaryProps && <RefinerChoiceSummaryComponent {...refinerChoiceSummaryProps} />}\n            {props.refinerModalToggleProps && (\n                <div className={modalToggleWrapperClassName}>\n                    <RefinerModalToggleComponent {...props.refinerModalToggleProps} />\n                    <div className={modalToggleMoreActionsWrapperClassName}>\n                        {props.refinerHeaderProps?.extraActions && (\n                            <div className={modalToggleExtraActionsWrapperClassName}>{props.refinerHeaderProps.extraActions}</div>\n                        )}\n                    </div>\n                </div>\n            )}\n            {props.refinerModalProps && <RefinerModalComponent {...props.refinerModalProps} />}\n        </>\n    );\n}\n\nfunction createComponentInDesktopView(props: IRefinerProps): React.ReactNode {\n    const { refinerOptions, isExpanded } = props;\n\n    return (\n        <>\n            {props.refinerHeaderProps && <RefinerHeaderComponent {...props.refinerHeaderProps} />}\n\n            {refinerOptions && ArrayExtensions.hasElements(refinerOptions) && isExpanded && (\n                <Node className={refinerContentWrapperClassName}>\n                    <Node className={refinerOptionsWrapperClassName}>\n                        {refinerOptions.map((item, index) => (\n                            <React.Fragment key={index}>{item}</React.Fragment>\n                        ))}\n                    </Node>\n\n                    {props.refinerFooterProps && refinerOptions && ArrayExtensions.hasElements(refinerOptions) && isExpanded && (\n                        <RefinerFooterComponent {...props.refinerFooterProps} />\n                    )}\n                </Node>\n            )}\n        </>\n    );\n}\n\n/**\n * Refiner component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst RefinerFunctionalComponent: React.FC<IRefinerProps> = (props: IRefinerProps) => {\n    const renderMobile = props.isMobileView && props.refinerModalProps;\n\n    return (\n        <Node className={classnames(props.className, componentClassName)}>\n            {renderMobile && createComponentInMobileView(props)}\n            {!renderMobile && createComponentInDesktopView(props)}\n        </Node>\n    );\n};\n\n/**\n * Refiner component.\n */\nexport const RefinerComponent: React.FunctionComponent<IRefinerProps> = msdyn365Commerce.createComponent<IRefinerComponent>('Refiner', {\n    component: React.memo(RefinerFunctionalComponent)\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport {\n    Button,\n    ITelemetryContent,\n    TelemetryConstant,\n    getPayloadObject,\n    getTelemetryAttributes\n} from '@msdyn365-commerce-modules/utilities';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport React from 'react';\n\nimport classnames from 'classnames';\n\n/**\n * Class names used in component.\n */\nconst componentClassName = 'msc-search-bar';\nconst filterOptionsClassName = `${componentClassName}__search-options`;\nconst filterOptionClassName = `${componentClassName}__search-option`;\nconst filterOptionSelectedClassName = `${componentClassName}__search-option-selected`;\nconst searchBarClassName = `${componentClassName}__search-text`;\nconst buttonClassName = `${componentClassName}__search-button`;\n\n/**\n * ISearchBarComponent interface.\n */\ninterface ISearchBarComponent extends IComponent<ISearchBarProps> {}\n\n/**\n * ISearchBarResources interface.\n */\nexport interface ISearchBarResources {\n    searchOptionsAriaLabel?: string;\n    searchBarPlaceholder?: string;\n    searchBarAriaLabel?: string;\n    searchButtonLabel?: string;\n    searchButtonAriaLabel?: string;\n}\n\n/**\n * ISearchBarData interface.\n */\nexport interface ISearchBarData {\n    options: ISearchBarOption[];\n}\n\n/**\n * ISearchBarOption interface.\n */\nexport interface ISearchBarOption {\n    label: string;\n    value: string;\n}\n\n/**\n * ISearchBarProps interface.\n */\nexport interface ISearchBarProps extends IComponentProps<ISearchBarData> {\n    className?: string;\n    resources?: ISearchBarResources;\n    currentSearchOption?: ISearchBarOption;\n    currentSearchText?: string;\n    telemetryContent?: ITelemetryContent;\n    clearSearchTextOnOptionChange?: boolean;\n    onSelectOption?(newSearchOption?: ISearchBarOption): void;\n    onChange?(searchOption?: ISearchBarOption, searchText?: string): void;\n    onBlur?(searchOption?: ISearchBarOption, searchText?: string): void;\n    onClick?(searchOption?: ISearchBarOption, searchText?: string): void;\n}\n\n/**\n * SearchBar component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst SearchBarFunctionalComponent: React.FC<ISearchBarProps> = (props: ISearchBarProps) => {\n    const [searchOptionState, setSearchOptionState] = React.useState(props.currentSearchOption);\n    const [searchTextState, setSearchTextState] = React.useState(props.currentSearchText);\n\n    const onSelectOptionHandler = (event: React.ChangeEvent<HTMLSelectElement>) => {\n        const value = event.currentTarget.value;\n        const searchOption = props.data.options?.find((option: ISearchBarOption) => option.value === value);\n        setSearchOptionState(searchOption);\n        if (props.clearSearchTextOnOptionChange) {\n            setSearchTextState('');\n        }\n        props.onSelectOption?.(searchOption);\n    };\n\n    const onChangeHandler = (event: React.FocusEvent<HTMLInputElement>): void => {\n        const value = event.currentTarget.value;\n        setSearchTextState(value);\n        props.onChange?.(searchOptionState, value);\n    };\n\n    const onBlurHandler = (event: React.FocusEvent<HTMLInputElement>) => {\n        const value = event.currentTarget.value;\n        setSearchTextState(value);\n        props.onBlur?.(searchOptionState, value);\n    };\n\n    const onClickHandler = () => {\n        props.onClick?.(searchOptionState, searchTextState);\n    };\n\n    // define telemetry attributes\n    const searchButtonAttributes = getTelemetryAttributes(\n        props.telemetryContent!,\n        getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Search)\n    );\n\n    return (\n        <div className={classnames(props.className, componentClassName)}>\n            {ArrayExtensions.hasElements(props.data.options) && (\n                <select\n                    className={filterOptionsClassName}\n                    title={props.resources?.searchOptionsAriaLabel}\n                    aria-label={props.resources?.searchOptionsAriaLabel}\n                    onChange={onSelectOptionHandler}\n                >\n                    {props.data.options?.map((option: ISearchBarOption) => {\n                        return (\n                            <option\n                                key={option.value}\n                                value={option.value}\n                                aria-label={option.label}\n                                aria-selected={option.value === searchOptionState?.value}\n                                className={classnames(\n                                    filterOptionClassName,\n                                    option.value === searchOptionState?.value ? filterOptionSelectedClassName : ''\n                                )}\n                            >\n                                {option.label}\n                            </option>\n                        );\n                    })}\n                </select>\n            )}\n            <input\n                type='text'\n                className={classnames(searchBarClassName, ArrayExtensions.hasElements(props.data.options) ? '' : 'full-width')}\n                placeholder={props.resources?.searchBarPlaceholder}\n                title={props.resources?.searchBarAriaLabel}\n                aria-label={props.resources?.searchBarAriaLabel}\n                value={searchTextState}\n                onChange={onChangeHandler}\n                onBlur={onBlurHandler}\n            />\n            <Button\n                className={buttonClassName}\n                aria-label={props.resources?.searchButtonAriaLabel ?? props.resources?.searchButtonLabel}\n                title={props.resources?.searchButtonAriaLabel ?? props.resources?.searchButtonLabel}\n                onClick={onClickHandler}\n                {...searchButtonAttributes}\n            >\n                {props.resources?.searchButtonLabel}\n            </Button>\n        </div>\n    );\n};\n\n/**\n * SearchBar component.\n */\nexport const SearchBarComponent: React.FunctionComponent<ISearchBarProps> = msdyn365Commerce.createComponent<ISearchBarComponent>(\n    'SearchBarComponent',\n    { component: SearchBarFunctionalComponent }\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport React, { ReactElement } from 'react';\n\nimport classnames from 'classnames';\n\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Class names used in component.\n */\nconst componentClassName = 'msc-table';\nconst headerClassName = `${componentClassName}__header`;\nconst headerRowClassName = `${componentClassName}__header-row`;\nconst headerCellClassName = `${componentClassName}__header-cell`;\nconst rowClassName = `${componentClassName}__row`;\nconst rowCellClassName = `${componentClassName}__row-cell`;\n\n/**\n * Table cell content type.\n */\nexport enum TableCellContentType {\n    Text = 'text',\n    Number = 'number',\n    Amount = 'amount',\n    Date = 'date'\n}\n\n/**\n * ITableComponent interface.\n */\ninterface ITableComponent extends IComponent<ITableProps> {}\n\n/**\n * ITableHeaderComponent interface.\n */\ninterface ITableHeaderComponent extends IComponent<ITableHeaderProps> {}\n\n/**\n * ITableRowComponent interface.\n */\ninterface ITableRowComponent extends IComponent<ITableRowProps> {}\n\n/**\n * ITableProps interface.\n */\nexport interface ITableProps extends IComponentProps<{}> {\n    className?: string;\n    children?: React.ReactNode | React.ReactNode[];\n}\n\n/**\n * ITableHeaderProps interface.\n */\nexport interface ITableHeaderProps extends IComponentProps<{}> {\n    className?: string;\n    isVisible?: boolean;\n    children?: ReactElement<ITableCellProps> | ReactElement<ITableCellProps>[];\n}\n\n/**\n * ITableRowProps interface.\n */\nexport interface ITableRowProps extends IComponentProps<{}> {\n    className?: string;\n    isVisible?: boolean;\n    children?: ReactElement<ITableCellProps> | ReactElement<ITableCellProps>[];\n}\n\n/**\n * ITableCellProps interface.\n */\nexport interface ITableCellProps extends IComponentProps<{}> {\n    className?: string;\n    isVisible?: boolean;\n    children?: React.ReactNode;\n    contentType: TableCellContentType;\n}\n\n/**\n * TableHeader component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst TableHeaderFunctionalComponent: React.FC<ITableHeaderProps> = (props: ITableHeaderProps) => {\n    const isVisible = props.isVisible ?? true;\n    if (!isVisible) {\n        return <></>;\n    }\n\n    let children = props.children ?? [];\n    children = Array.isArray(children) ? children : [children];\n\n    return (\n        <thead className={classnames(props.className, headerClassName)}>\n            <tr className={headerRowClassName}>\n                {ArrayExtensions.hasElements(children) &&\n                    children.map((child, index) => {\n                        const childIsVisible = child.props.isVisible ?? true;\n                        return (\n                            childIsVisible && (\n                                <th key={index} className={classnames(child.props.className, headerCellClassName, child.props.contentType)}>\n                                    {child.props.children}\n                                </th>\n                            )\n                        );\n                    })}\n            </tr>\n        </thead>\n    );\n};\n\n/**\n * TableHeader component.\n */\nexport const TableHeaderComponent: React.FunctionComponent<ITableHeaderProps> = msdyn365Commerce.createComponent<ITableHeaderComponent>(\n    'TableHeaderComponent',\n    { component: TableHeaderFunctionalComponent }\n);\n\n/**\n * TableRow component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst TableRowFunctionalComponent: React.FC<ITableRowProps> = (props: ITableRowProps) => {\n    const isVisible = props.isVisible ?? true;\n    if (!isVisible) {\n        return <></>;\n    }\n\n    let children = props.children ?? [];\n    children = Array.isArray(children) ? children : [children];\n\n    return (\n        <tr className={classnames(props.className, rowClassName)}>\n            {ArrayExtensions.hasElements(children) &&\n                children.map((child, index) => {\n                    const childIsVisible = child.props.isVisible ?? true;\n                    return (\n                        childIsVisible && (\n                            <td key={index} className={classnames(child.props.className, rowCellClassName, child.props.contentType)}>\n                                {child.props.children}\n                            </td>\n                        )\n                    );\n                })}\n        </tr>\n    );\n};\n\n/**\n * TableRow component.\n */\nexport const TableRowComponent: React.FunctionComponent<ITableRowProps> = msdyn365Commerce.createComponent<ITableRowComponent>(\n    'TableRowComponent',\n    { component: TableRowFunctionalComponent }\n);\n\n/**\n * TableCell component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst TableCellFunctionalComponent: React.FC<ITableCellProps> = (props: ITableCellProps) => {\n    return <>{props.children}</>;\n};\n\n/**\n * TableCell component.\n */\nexport const TableCellComponent: React.FunctionComponent<ITableCellProps> = msdyn365Commerce.createComponent<\n    // @ts-expect-error -- Required for this signature.\n    ITableCellComponent\n>('TableCellComponent', { component: TableCellFunctionalComponent });\n\n/**\n * Table component.\n * @param props - Configuration of the component.\n * @returns React node.\n */\nconst TableFunctionalComponent: React.FC<ITableProps> = (props: ITableProps) => {\n    return <table className={classnames(props.className, componentClassName)}>{props.children}</table>;\n};\n\n/**\n * Table component.\n */\nexport const TableComponent: React.FunctionComponent<ITableProps> = msdyn365Commerce.createComponent<ITableComponent>('TableComponent', {\n    component: TableFunctionalComponent\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getUrlSync, IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport {\n    Button,\n    format,\n    getPayloadObject,\n    getTelemetryAttributes,\n    ITelemetryContent,\n    onTelemetryClick,\n    UncontrolledTooltip\n} from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport * as React from 'react';\n\nexport interface IWishlistIconComponentProps extends IComponentProps<{}> {\n    className?: string;\n    wishlistTooltipText: string;\n    showButtonTooltip?: boolean;\n    telemetryContent?: ITelemetryContent;\n    wishlistCountLabel?: string;\n    wishlistCount?: number;\n    isDispayWishlistCount?: boolean;\n}\n\nexport interface IWishlistIconComponent extends IComponent<IWishlistIconComponentProps> {}\n\nconst WishlistIconComponentActions = {};\n\n/**\n * WishlistIcon component.\n * @param props\n * @extends {React.PureComponent<IWishlistIconProps>}\n */\nconst WishlistIcon: React.FC<IWishlistIconComponentProps> = (props: IWishlistIconComponentProps) => {\n    const wishlistIconRef: React.RefObject<HTMLButtonElement> = React.createRef();\n    const text = props.wishlistTooltipText;\n    const showButtonIconTooltip = props.showButtonTooltip;\n    const wishlistUrl = getUrlSync('wishlist', props.context.actionContext);\n    const signInUrl = `${props.context.request.user.signInUrl}?ru=${wishlistUrl}`;\n    const url = props.context.request.user.isAuthenticated ? wishlistUrl : signInUrl;\n    const showTooltip = showButtonIconTooltip !== undefined ? showButtonIconTooltip : true;\n    const shouldShowCount = props.isDispayWishlistCount !== undefined ? props.isDispayWishlistCount : false;\n    const wishlistCountlbl = props.wishlistCountLabel !== undefined ? props.wishlistCountLabel : '';\n    const wishlistItemCount = props.wishlistCount !== undefined ? props.wishlistCount : '';\n    const countLabel = format(wishlistCountlbl, wishlistItemCount);\n\n    // Construct telemetry attribute to render\n    const payLoad = getPayloadObject('click', props.telemetryContent!, text, '');\n    const attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n    return (\n        <>\n            <Button\n                className={classname('msc-wishlist-icon', props.className)}\n                href={url}\n                aria-label={text}\n                innerRef={wishlistIconRef}\n                {...attributes}\n                onClick={onTelemetryClick(props.telemetryContent!, payLoad, text)}\n            >\n                {shouldShowCount && <div className='msc-wishlist-icon__count'>{countLabel}</div>}\n                <span className='msc-wishlist-icon__text'>{text}</span>\n            </Button>\n            {showTooltip && (\n                <UncontrolledTooltip trigger='hover focus' target={wishlistIconRef}>\n                    {text}\n                </UncontrolledTooltip>\n            )}\n        </>\n    );\n};\n\nexport const WishListIconComponent: React.FunctionComponent<IWishlistIconComponentProps> = msdyn365Commerce.createComponent<\n    // @ts-expect-error\n    IWishlistIconComponent\n>('WishListIcon', { component: WishlistIcon, ...WishlistIconComponentActions });\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/**\n * Player Options Interface.\n */\nexport interface IPlayerOptions {\n    autoplay?: boolean;\n    mute?: boolean;\n    loop?: boolean;\n    playPauseTrigger?: boolean;\n    controls?: boolean;\n    maskLevel?: number;\n    market?: string;\n    playbackSpeed?: boolean;\n    download?: boolean;\n    playFullScreen?: boolean;\n    hidePosterFrame?: boolean;\n    autoCaptions?: string;\n    flexSize?: boolean;\n    aspectRatio?: number;\n    userMinimumAge?: number;\n    showEndImage?: boolean;\n    showImageForVideoError?: boolean;\n    inviewPlay?: boolean;\n    inviewThreshold?: number;\n    inViewWidthFraction?: number;\n    inViewHeightFraction?: number;\n    controlPanelTimeout?: number;\n    thumbnailFullWidth?: boolean;\n    ageGate?: boolean;\n    lazyLoad?: boolean;\n    mobileVideoQuality?: MobileVideoQuality;\n    shouldDisableAutoPlayOnMobile?: boolean;\n    isMobileDevice?: boolean;\n}\n\n/**\n * Mobile video quality.\n */\nexport enum MobileVideoQuality {\n    hdx = 'hdx',\n    hq = 'hq',\n    sd = 'sd',\n    lo = 'lo'\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 {\n    getCatalogId,\n    IComponent,\n    IComponentProps,\n    ICoreContext,\n    IGridSettings,\n    IImageData,\n    IImageProps,\n    IImageSettings,\n    Image,\n    IRequestContext,\n    msdyn365Commerce\n} from '@msdyn365-commerce/core';\nimport {\n    ArrayExtensions,\n    checkIfShouldDisplayAsSwatch,\n    convertDimensionTypeToProductDimensionType,\n    Dictionary,\n    DimensionSwatchDisplayTypes,\n    DimensionTypes,\n    generateImageUrl,\n    getProductPageUrlSync,\n    IDimensionsApp,\n    StringExtensions,\n    validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n    format,\n    getPayloadObject,\n    getTelemetryAttributes,\n    ITelemetryContent,\n    onTelemetryClick\n} from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nimport { IPriceComponentResources, PriceComponent } from '../price/price.components';\nimport { ISwatchItem } from '../product-dimension';\nimport { RatingComponent } from '../rating/rating.component';\nimport { ProductComponentV2SwatchComponent } from './components';\nimport { IAttributeSwatch, IProductDimension, IProductSearchResult } from './interface';\n\n/**\n * Product component props interface.\n */\nexport interface IProductComponentV2Props extends IComponentProps<{ product?: IProductSearchResult }> {\n    className?: string;\n    imageSettings?: IImageSettings;\n    savingsText?: string;\n    freePriceText?: string;\n    originalPriceText?: string;\n    currentPriceText?: string;\n    ratingAriaLabel?: string;\n    ratingCountAriaLabel?: string;\n    isAllowBack?: boolean;\n    telemetryContent?: ITelemetryContent;\n    quickViewButton?: React.ReactNode;\n    productComparisonButton?: React.ReactNode;\n    inventoryLabel?: string;\n    isPriceMinMaxEnabled?: boolean;\n    priceResources?: IPriceComponentResources;\n    dimensionAvailabilities?: IProductsDimensionsAvailabilities[];\n    swatchItemAriaLabel?: string;\n}\n\n/**\n * Product component interface.\n */\nexport interface IProductComponentV2 extends IComponent<IProductComponentV2Props> {}\n\nconst priceComponentActions = {};\n\n/**\n * Renders product comparison button similar to the quick view button.\n * @param productComparisonButton - React element of the button.\n * @param product - Current product info.\n * @param catalogId - Current catalog.\n * @returns React element for the specific product.\n */\nfunction renderProductComparisonButton(\n    productComparisonButton: React.ReactNode,\n    product: IProductSearchResult,\n    catalogId: number\n): JSX.Element | undefined {\n    validateCatalogId(catalogId);\n    return React.cloneElement(productComparisonButton as React.ReactElement, { product, catalogId });\n}\n\n/**\n * Product for the product component.\n * @param props - Product props.\n * @returns React element.\n */\nconst ProductCardV2: React.FC<IProductComponentV2Props> = (props: IProductComponentV2Props) => {\n    const {\n        data,\n        context,\n        imageSettings,\n        savingsText,\n        freePriceText,\n        originalPriceText,\n        currentPriceText,\n        ratingAriaLabel,\n        ratingCountAriaLabel,\n        isAllowBack,\n        typeName,\n        id,\n        telemetryContent,\n        quickViewButton,\n        productComparisonButton,\n        inventoryLabel,\n        isPriceMinMaxEnabled,\n        priceResources,\n        dimensionAvailabilities,\n        swatchItemAriaLabel\n    } = props;\n    const product = data.product;\n\n    /**\n     * Updates the product url link to product details page.\n     * @param  productDetailsPageUrl - Product page url.\n     * @param  coreContext - Context of the module using the component.\n     * @param  queryString - Querystring to be added to the URL.\n     * @returns The update product page url.\n     */\n    function updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\n        const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\n        if (sourceUrl.search) {\n            sourceUrl.search += `&${queryString}`;\n        } else {\n            sourceUrl.search += queryString;\n        }\n\n        const updatedUrl = new URL(sourceUrl.href);\n        return updatedUrl.pathname + sourceUrl.search;\n    }\n\n    /**\n     * Gets the product page url from the default swatch selected.\n     * @param  productData - Product card to be rendered.\n     * @returns The default color swatch selected if any.\n     */\n    function getDefaultColorSwatchSelected(productData?: IProductSearchResult): IAttributeSwatch | null {\n        if (!productData || !productData.attributeValues) {\n            return null;\n        }\n\n        const colorAttribute = productData.attributeValues.find(\n            attributeValue => attributeValue.keyName?.toLocaleLowerCase() === DimensionTypes.color\n        );\n        if (!ArrayExtensions.hasElements(colorAttribute?.swatches)) {\n            return null;\n        }\n\n        const defaultSwatch = colorAttribute!.swatches.find(item => item.isDefault === true) ?? colorAttribute!.swatches[0];\n        return defaultSwatch;\n    }\n\n    /**\n     * Gets the product image from the default swatch selected.\n     * @param  coreContext - Context of the module using the component.\n     * @param  productData - Product card to be rendered.\n     * @returns The product card image url.\n     */\n    function getProductImageUrlFromDefaultColorSwatch(coreContext: ICoreContext, productData?: IProductSearchResult): string | undefined {\n        const siteContext = coreContext as ICoreContext<IDimensionsApp>;\n        const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n        if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\n            return productData?.primaryImageUrl;\n        }\n        const defaultSwatch = getDefaultColorSwatchSelected(productData);\n        return defaultSwatch && ArrayExtensions.hasElements(defaultSwatch.productImageUrls)\n            ? generateImageUrl(defaultSwatch.productImageUrls[0], coreContext.request.apiSettings)\n            : productData?.primaryImageUrl;\n    }\n\n    /**\n     * Gets the product page url from the default swatch selected.\n     * @param  coreContext - Context of the module using the component.\n     * @param productUrl - Product page url for the product card.\n     * @param  productData - Product card to be rendered.\n     * @returns The product card image url.\n     */\n    function getProductPageUrlFromDefaultSwatch(\n        coreContext: ICoreContext,\n        productUrl: string,\n        productData?: IProductSearchResult\n    ): string | undefined {\n        const siteContext = coreContext as ICoreContext<IDimensionsApp>;\n        const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n        if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\n            return productUrl;\n        }\n        const defaultSwatch = getDefaultColorSwatchSelected(productData);\n        if (!defaultSwatch || !defaultSwatch.swatchValue) {\n            return productUrl;\n        }\n\n        const queryString = `color=${defaultSwatch.swatchValue}`;\n        return updateProductUrl(productUrl, coreContext, queryString);\n    }\n\n    let productUrl = product ? getProductPageUrlSync(product.name ?? '', product.recordId, context.actionContext, undefined) : '';\n    if (isAllowBack && productUrl) {\n        productUrl = updateProductUrl(productUrl, context, 'back=true');\n    }\n    const productImageUrlFromSwatch = getProductImageUrlFromDefaultColorSwatch(context, product) ?? product?.primaryImageUrl;\n    const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\n    const [productPageUrl, setProductPageUrl] = useState<string>(productPageUrlFromSwatch);\n    const [productImageUrl, setProductImageUrl] = useState<string | undefined>(productImageUrlFromSwatch);\n    const [selectedSwatchItems] = useState(new Dictionary<DimensionTypes, ISwatchItem>());\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\n    const enableStockCheck = context.app.config.enableStockCheck;\n\n    /**\n     * Updates the product page and Image url based on swatch selected.\n     * @param coreContext - Context of the caller.\n     * @param swatchItem - Dimension swatch selected.\n     */\n    const updatePageAndImageUrl = React.useCallback(\n        (coreContext: ICoreContext, swatchItem: ISwatchItem) => {\n            const dimensionType = swatchItem.dimensionType;\n            selectedSwatchItems.setValue(dimensionType, swatchItem);\n            if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\n                return;\n            }\n            const queryString = `${dimensionType}=${swatchItem.value}`;\n            let productPageUrlWithSwatch = '';\n            if (productPageUrl.includes(dimensionType)) {\n                const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\n                newUrl.searchParams.delete(dimensionType);\n                productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\n            } else {\n                productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\n            }\n            setProductPageUrl(productPageUrlWithSwatch);\n            if (dimensionType === DimensionTypes.color) {\n                const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls)\n                    ? swatchItem.productImageUrls[0]\n                    : undefined;\n                const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\n                setProductImageUrl(newImageUrl);\n            }\n        },\n        [selectedSwatchItems, context, productPageUrl]\n    );\n\n    if (!product) {\n        return null;\n    }\n\n    const swatchItems = ArrayExtensions.validValues(\n        product.attributeValues?.map(item => {\n            const dimensionTypeValue = item.keyName?.toLocaleLowerCase() ?? '';\n            const shouldDisplayAsSwatch = checkIfShouldDisplayAsSwatch(\n                dimensionTypeValue as DimensionTypes,\n                context as ICoreContext<IDimensionsApp>,\n                DimensionSwatchDisplayTypes.productCard\n            );\n            if (!shouldDisplayAsSwatch) {\n                return null;\n            }\n\n            const siteContext = context as ICoreContext<IDimensionsApp>;\n            const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n            const dimensionType = dimensionTypeValue as DimensionTypes;\n            const swatches =\n                item.swatches?.map<ISwatchItem>(swatchItem => {\n                    return {\n                        itemId: `${item.recordId ?? ''}-${dimensionTypeValue}-${swatchItem.swatchValue ?? ''}`,\n                        value: swatchItem.swatchValue ?? '',\n                        dimensionType,\n                        colorHexCode: swatchItem.swatchColorHexCode,\n                        imageUrl: swatchItem.swatchImageUrl,\n                        productImageUrls: swatchItem.productImageUrls,\n                        isDefault: swatchItem.isDefault,\n                        swatchItemAriaLabel: swatchItemAriaLabel ? format(swatchItemAriaLabel, dimensionType) : '',\n                        isDisabled:\n                            enableStockCheck &&\n                            dimensionAvailabilities?.find(\n                                dimensionAvailability => dimensionAvailability.value === (swatchItem.swatchValue ?? '')\n                            )?.isDisabled\n                    };\n                }) ?? [];\n            if (\n                dimensionToPreSelectInProductCard !== DimensionTypes.none &&\n                ArrayExtensions.hasElements(swatches) &&\n                !swatches.some(swatch => swatch.isDefault) &&\n                dimensionType === DimensionTypes.color\n            ) {\n                swatches[0].isDefault = true;\n            }\n            return { recordId: item.recordId, swatches };\n        })\n    );\n\n    // Construct telemetry attribute to render\n    const payLoad = getPayloadObject('click', telemetryContent!, '', product.recordId.toString());\n\n    const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\n    const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\n\n    /**\n     * Gets the react node for product unit of measure display.\n     * @param  unitOfMeasure - DefaultUnitOfMeasure property from product.\n     * @returns The node representing markup for unit of measure component.\n     */\n    function renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\n        if (!unitOfMeasure) {\n            return null;\n        }\n        return (\n            <div className='msc-product__unit-of-measure'>\n                <span>{unitOfMeasure}</span>\n            </div>\n        );\n    }\n\n    /**\n     * Gets the react node for product availability.\n     * @param inventoryAvailabilityLabel - The product information.\n     * @returns The node representing markup for product availability.\n     */\n    function renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\n        if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\n            return null;\n        }\n\n        return (\n            <div className='msc-product__availability'>\n                <span>{inventoryAvailabilityLabel}</span>\n            </div>\n        );\n    }\n\n    /**\n     * Gets the react node for product dimension as swatch.\n     * @returns The node representing markup for unit of measure component.\n     */\n    function renderProductDimensions(): JSX.Element | null {\n        if (!ArrayExtensions.hasElements(swatchItems)) {\n            return null;\n        }\n\n        return (\n            <div className='msc-product__dimensions'>\n                {swatchItems.map(item => {\n                    return (\n                        <ProductComponentV2SwatchComponent\n                            key={item.recordId}\n                            context={context}\n                            onSelectDimension={updatePageAndImageUrl}\n                            swatches={item.swatches}\n                        />\n                    );\n                })}\n            </div>\n        );\n    }\n\n    /**\n     * Gets the react node for  product description.\n     * @param  quickview - Quick view node.\n     * @param  item - Product id to de displayed in quickview.\n     * @returns The product quickview component.\n     */\n    function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\n        if (quickview === null) {\n            return undefined;\n        }\n        const selectedDimensions: IProductDimension[] = selectedSwatchItems.getValues().map<IProductDimension>(swatches => {\n            return {\n                dimensionTypeValue: convertDimensionTypeToProductDimensionType(swatches.dimensionType),\n                DimensionValue: {\n                    RecordId: 0,\n                    Value: swatches.value\n                }\n            };\n        });\n        return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions });\n    }\n\n    /**\n     * Gets the aria label for rating.\n     * @param  rating - Product rating.\n     * @param  ratingAriaLabelText - Aria label format for rating.\n     * @returns The product rating aria label string.\n     */\n    function getRatingAriaLabel(rating?: number, ratingAriaLabelText?: string): string {\n        if (rating && ratingAriaLabelText) {\n            const roundedRating = rating.toFixed(2);\n            return format(ratingAriaLabelText || '', roundedRating, '5');\n        }\n        return '';\n    }\n\n    /**\n     * Gets the aria label for review count.\n     * @param  reviewCount - Product review count.\n     * @param  ratingCountAriaLabelText - Aria label format for review.\n     * @returns The product review count aria label string.\n     */\n    function getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\n        if (reviewCount && ratingCountAriaLabelText) {\n            return format(ratingCountAriaLabelText || '', reviewCount);\n        }\n        return '';\n    }\n\n    /**\n     * Gets the aria label string for product that includes product name with its price and rating.\n     * @param  name - Product name.\n     * @param  price - Product price.\n     * @param  rating - Product rating.\n     * @param  ratingAriaLabelText - Rating aria label text.\n     * @param  reviewCount - Product review count.\n     * @param  ratingCountAriaLabelText - Number of ratings.\n     * @returns The aria label string for the product card.\n     */\n    function renderLabel(\n        name?: string,\n        price?: string,\n        rating?: number,\n        ratingAriaLabelText?: string,\n        reviewCount?: number,\n        ratingCountAriaLabelText?: string,\n        availability?: string\n    ): string {\n        const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\n        return `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${\n            reviewCountArialableText ? ` ${reviewCountArialableText}` : ''\n        } ${availability ?? ''}`;\n    }\n\n    /**\n     * Gets the react component for product rating.\n     * @param  productCardimageSettings - Module image settings for product card.\n     * @param  gridSettings - Grid settings defined in theme.\n     * @param  imageUrl - Image url.\n     * @param fallbackImageUrl - Fallback url for imge.\n     * @param  altText - Image Alt text.\n     * @param  requestContext - Request context using the component.\n     * @returns React component for product image.\n     */\n    function renderProductPlacementImage(\n        productCardimageSettings?: IImageSettings,\n        gridSettings?: IGridSettings,\n        imageUrl?: string,\n        fallbackImageUrl?: string,\n        altText?: string,\n        requestContext?: IRequestContext\n    ): JSX.Element | null {\n        if (!imageUrl || !gridSettings || !productCardimageSettings) {\n            return null;\n        }\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n        const emptyPlaceHolderImage = context.app.config.placeholderImageName as string;\n        let fallbackImageSource = fallbackImageUrl;\n        if (emptyPlaceHolderImage && fallbackImageUrl) {\n            fallbackImageSource = `${fallbackImageUrl},${emptyPlaceHolderImage}`;\n        }\n        const image: IImageData = {\n            src: imageUrl,\n            altText: altText ? altText : '',\n            fallBackSrc: fallbackImageSource\n        };\n        const imageProps: IImageProps = { gridSettings };\n\n        imageProps.gridSettings = gridSettings;\n        imageProps.imageSettings = productCardimageSettings;\n        imageProps.imageSettings.cropFocalRegion = true;\n        return <Image {...image} {...imageProps} loadFailureBehavior='empty' requestContext={requestContext} bypassHideOnFailure />;\n    }\n\n    /**\n     * Gets the react component for product rating.\n     * @param  coreContext - Context of the module using the component.\n     * @param  moduleTypeName - Module type name.\n     * @param  moduleId - Module id using the component.\n     * @param  productBasePrice - Product base price.\n     * @param  adjustedProductPrice - Product adjusted price.\n     * @param  maxVariantProductPrice - Product variant max price.\n     * @param  minVariantPrice - Product variant min price.\n     * @param  savingsPriceResourceText - Product price saving text.\n     * @param  freePriceResourceText - Product price free text.\n     * @param  originalPriceResourceText - Product price original text.\n     * @param  currentPriceResourceText - Product price current text.\n     * @returns React component for Product price.\n     */\n    function renderPrice(\n        coreContext: ICoreContext,\n        moduleTypeName: string,\n        moduleId: string,\n        productBasePrice?: number,\n        adjustedProductPrice?: number,\n        maxVariantProductPrice?: number,\n        minVariantPrice?: number,\n        savingsPriceResourceText?: string,\n        freePriceResourceText?: string,\n        originalPriceResourceText?: string,\n        currentPriceResourceText?: string\n    ): JSX.Element | null {\n        const price = {\n            BasePrice: productBasePrice,\n            AdjustedPrice: adjustedProductPrice,\n            CustomerContextualPrice: adjustedProductPrice,\n            MaxVariantPrice: maxVariantProductPrice ? maxVariantProductPrice : adjustedProductPrice,\n            MinVariantPrice: minVariantPrice ? minVariantPrice : adjustedProductPrice\n        };\n\n        const channelConfig = coreContext.request.channel;\n        return (\n            <PriceComponent\n                context={coreContext}\n                id={moduleId}\n                typeName={moduleTypeName}\n                data={{ price }}\n                savingsText={savingsPriceResourceText}\n                freePriceText={freePriceResourceText}\n                originalPriceText={originalPriceResourceText}\n                currentPriceText={currentPriceResourceText}\n                isPriceMinMaxEnabled={isPriceMinMaxEnabled}\n                priceResources={priceResources}\n                currencyCode={channelConfig?.Currency}\n            />\n        );\n    }\n\n    /**\n     * Gets the react node for product description.\n     * @param  description - Product description.\n     * @returns The product description component.\n     */\n    function renderDescription(description?: string): JSX.Element | null {\n        return <p className='msc-product__text'>{description}</p>;\n    }\n\n    /**\n     * Gets the react component for product rating.\n     * @param  coreContext - Context of the module using the component.\n     * @param  moduleTypeName - Module type name.\n     * @param  moduleId - Module id using the component.\n     * @param  avgRating - Average rating.\n     * @param  totalRatings - Total rating.\n     * @param  ariaLabel - Aria label for rating.\n     * @returns React component for Product rating.\n     */\n    function renderRating(\n        coreContext: ICoreContext,\n        moduleTypeName: string,\n        moduleId: string,\n        avgRating?: number,\n        totalRatings?: number,\n        ariaLabel?: string\n    ): JSX.Element | null {\n        if (!avgRating) {\n            return null;\n        }\n\n        const numberRatings = totalRatings?.toString() ?? undefined;\n        const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\n        const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\n\n        return (\n            <RatingComponent\n                context={coreContext}\n                id={moduleId}\n                typeName={moduleTypeName}\n                avgRating={avgRating}\n                ratingCount={numberRatings}\n                readOnly\n                ariaLabel={ratingAriaLabelText}\n                ratingCountAriaLabel={ratingCountAriaLabelText}\n                data={{}}\n            />\n        );\n    }\n\n    return (\n        <>\n            <a\n                href={productPageUrl}\n                onClick={onTelemetryClick(telemetryContent!, payLoad, product.name!)}\n                aria-label={renderLabel(\n                    product.name,\n                    context.cultureFormatter.formatCurrency(product.price),\n                    product.averageRating,\n                    ratingAriaLabel,\n                    product.totalRatings,\n                    ratingCountAriaLabel,\n                    inventoryLabel\n                )}\n                className='msc-product'\n                {...attribute}\n            >\n                <div className='msc-product__image'>\n                    {renderProductPlacementImage(\n                        imageSettings,\n                        context.request.gridSettings,\n                        productImageUrl,\n                        product.primaryImageUrl,\n                        product.name,\n                        context.actionContext.requestContext\n                    )}\n                </div>\n                <div className='msc-product__title'>{product.name}</div>\n            </a>\n            {renderProductDimensions()}\n            <div className='msc-product__details'>\n                {renderPrice(\n                    context,\n                    typeName,\n                    id,\n                    product.basePrice,\n                    product.price,\n                    product.maxVariantPrice,\n                    product.minVariantPrice,\n                    savingsText,\n                    freePriceText,\n                    originalPriceText,\n                    currentPriceText\n                )}\n                {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.defaultUnitOfMeasure)}\n                {renderDescription(product.description)}\n                {!context.app.config.hideRating &&\n                    renderRating(context, typeName, id, product.averageRating, product.totalRatings, ratingAriaLabel)}\n                {renderProductAvailability(inventoryLabel)}\n            </div>\n            {quickViewButton && renderQuickView(quickViewButton, product.recordId)}\n            {productComparisonButton && renderProductComparisonButton(productComparisonButton, product, getCatalogId(context.request))}\n        </>\n    );\n};\n\n/**\n * Export product component interface.\n */\nexport const ProductComponentV2: React.FunctionComponent<IProductComponentV2Props> = msdyn365Commerce.createComponent<IProductComponentV2>(\n    'ProductV2',\n    { component: ProductCardV2, ...priceComponentActions }\n);\n"],"names":["ScriptInjector","React","constructor","props","super","render","config","this","_debug","id","typeName","placeHolderPropsRegEx","RegExp","placeHolders","originalSource","scriptSource","resolvedSource","hasMorePlaceHolders","exec","length","_resolvePlaceHolder","MsDyn365","_isUrl","src","async","defer","loadPoint","dangerouslySetInnerHTML","__html","debugMessage","telemetry","log","LogLevel","Debug","source","test","placeHolderToken","placeHolderTokens","split","propertyContext","propertyName","replace","context","request","user","query","KeyCodes","format","formatSpecifier","_len","arguments","parameters","Array","_key","match","index","value","toString","isNullOrWhiteSpace","trim","startsWith","prefix","ignoreCase","undefined","toLocaleLowerCase","getText","element","textContent","addClass","cssClass","classList","contains","className","includes","hasClass","add","nodeListToArray","nodeList","elements","n","push","selectElements","selector","selectElementsT","currentContext","document","getElementsByClassName","slice","querySelectorAll","querySelector","getElementsByTagName","css","property","style","getComputedStyle","removeInnerHtml","parentElement","innerHTML","selectFirstElement","elementsSelected","PlayerUtility","static","url","done","failed","ajaxRequest","window","XDomainRequest","addEventListener","responseText","_removeFromPendingAjaxRequests","pendingAjaxRequests","XMLHttpRequest","onreadystatechange","readyState","result","status","ontimeout","open","send","obj","i","splice","createElement","extend","recursive","target","paramIndex","key","Object","keys","hasOwnProperty","isSourceArray","isArray","call","isTargetArray","isSourceObject","isTargetObject","arrayIndex","entries","getDimensions","containerElement","width","clientWidth","height","clientHeight","isSafari","navigator","vendor","userAgent","getOriginalPrice","_c","_b","_a","data","price","AdjustedPrice","TradeAgreementPrice","BasePrice","formatCurrency","shouldUseFreePriceText","currencyCode","freePriceText","cultureFormatter","showPriceRangeForMasterProduct","isPriceMinMaxEnabled","product","ProductTypeValue","ProductType","Master","KitMaster","MinVariantPrice","MaxVariantPrice","renderCurrentPrice","maxVariantPrice","minVariantPrice","itemProp","priceResources","priceRangeSeparator","CustomerContextualPrice","getActivePrice","PriceComponent","msdyn365Commerce","createComponent","__assign","component","isSalesAgreementPriceFeatureEnabled","SalesAgreementPrice","_d","__read","isExpanded_1","setIsExpanded_1","classnames","Button","salesAgreementPricePrompt","onClick","tabIndex","firstPriceLine","AttainablePriceLines","salesAgreementExpirationDatePrompt","formatDate","EffectiveDate","ExpirationDate","_e","salesAgreementCommittedQuantityPrompt","CommittedQuantity","_g","_f","salesAgreementRemainingQuantityPrompt","RemainingQuantity","renderSalesAgreementDetail","originalSalesPrice","activeSalesPrice","showStrikethroughPricing","initialPrice","originalPriceText","currentPriceText","savingsText","renderCurrentPriceWithOriginalPrice","OrderTemplateProductsPreviewComponent","products","imageSettings","renderOrderTemplateImages","renderOrderTemplateImage","Image","requestContext","actionContext","ProductDetails","PrimaryImageUrl","fallBackSrc","getFallbackImageUrl","ItemId","apiSettings","app","OmniChannelMedia","gridSettings","viewports","xs","q","w","h","lg","xl","lazyload","loadFailureBehavior","altText","Name","ccCultureLocStrings","ccLanguageCodes","PlayerLocKeys","LocalizationConstants","playVideoAriaLabel","playAriaLabel","pauseAriaLabel","closeAriaLabel","optionAriaLabel","muteAriaLabel","unMuteAriaLabel","fullScreenAriaLabel","exitFullScreenAriaLabel","playingAriaLabel","pausedAriaLabel","seekBarLabel","sliderThumbLabel","volumeThumbLabel","videoTimeDurationLabel","closedCaptionLabel","audio_tracks","descriptive_audio","closecaption_off","audio_tracks_default","cc_customize","cc_text_font","cc_text_color","cc_color_black","cc_color_blue","cc_color_cyan","cc_color_green","cc_color_grey","cc_color_magenta","cc_color_red","cc_color_white","cc_color_yellow","cc_font_name_casual","cc_font_name_cursive","cc_font_name_monospacedsansserif","cc_font_name_monospacedserif","cc_font_name_proportionalserif","cc_font_name_proportionalsansserif","cc_font_name_smallcapitals","cc_text_size","cc_text_size_default","cc_text_size_extralarge","cc_text_size_large","cc_text_size_maximum","cc_text_size_small","cc_appearance","cc_preset1","cc_preset2","cc_preset3","cc_preset4","cc_preset5","cc_presettings","cc_text_background_color","cc_text_background_opacity","cc_text_opacity","cc_percent_0","cc_percent_100","cc_percent_25","cc_percent_50","cc_percent_75","cc_text_edge_color","cc_text_edge_style","cc_text_edge_style_depressed","cc_text_edge_style_dropshadow","cc_text_edge_style_none","cc_text_edge_style_raised","cc_text_edge_style_uniform","cc_window_color","cc_window_opacity","cc_reset","LocalizationHelper","playerResources","getLocalizedValue","getLanguageCodeFromLocale","locale","getLanguageNameFromLocale","ClosedCaptionHelper","playerHelper","localizationHelper","playerMetaData","checkClosedCaptionsFiles","ccFiles","getClosedCaptionMenu","ccMenuItems","ccFile","ccType","ClosedCaptionTypes","TTML","lang","toLowerCase","ccMenuItem","addIdPrefix","label","language","selected","selectable","persistOnClick","ariaLabel","subMenu","_getClosedCaptionsSettingsMenu","unshift","category","MenuCategories","ClosedCaption","items","getUpdatedClosedCaptionSetting","currentClosedCaptionsSetting","settingKey","optionKey","videoClosedCaptionsConstant","presetKey","presetValue","closedCaptionsPresetMap","window_color","window_opacity","text_background_color","text_background_opacity","text_color","text_edge_style","text_font","text_opacity","text_size","preset","_getOptionValue","getClosedCaptionURLFromLocale","setting","closedCaptionsSettingsMap","option","closedCaptionsSettingsOptions","map","settingsMenuItems","optionMenuItem","_getCCMenuItemId","pre","isBackButton","_getCCSettingsMenuId","ClosedCaptionSettings","settingsMenu","presetItems","presetSetting","font","color","ariaLabelValue","hasMouseHoverEvents","settingId","optionId","PlayerHelper","isMobileDevice","onErrorCallback","errorType","message","console","playerProps","_isMobileDevice","getMetadata","_mapVideoFiles","_setCCFiles","_setAudioTracks","playerData","metaData","updatePlayerProps","_clearVideoPlayerMetaData","getOptionMenu","audioTracks","_getAudioTracksMenu","optionMenuItems","Options","getPosterFrameUrl","posterFrameUrl","options","hidePosterFrame","posterframeUrl","_removeProtocolFromUrl","thumbnailFullWidth","indexOf","PlayerConstants","thumbnailFullHeight","getVideoFileToPlay","videoFile","mediaType","MediaTypes","MP4","quality","MediaQuality","LO","videoMetaData","mpVideoFiles","_getVideoFileByType","videoFiles","mobileVideoQuality","mobileVideoFile","_getVideoFileByQuality","toUpperCase","hdVideoFile","HDX","hqVideoFile","HQ","sdVideoFile","SD","loVideoFile","isEmptyOrUndefined","childId","playerId","removeIdPrefix","substring","audioTracksMenuItems","descriptiveAudioTrackCount","track","isDescriptiveAudio","trackIndex","audioTrack","languageCode","descriptiveAudioLabel","audioMenuItem","AudioTracks","videoBinaryReferences","binaryRef","extension","$type","sourceHref","audioType","bitrate","name","alias","clientHref","videoBinaryFiles","mediaTypeAndQuality","_getMediaTypeAndQuality","urlRef","formatCode","mType","mQuality","HD","SMOOTH","HLS","DASH","file","RatingComponentActions","onSliderChanged","event","setRating","Number","parseInt","rating","lastSelectedRating","onChange","onMouseLeave","_event","onMouseOver","getIndex","readOnly","Rating","initialRating","avgRating","useState","useEffect","newRating","shouldShowDescription","shouldShowFullRatingDescription","starControl","ratingCountAriaLabel","renderStars","ratingCount","defaultProps","currentRating","reviewCountAriaLabel","type","min","max","step","mouseOver","floor","Math","remainder","filled","half","stars","glyphClass","role","getAttribute","RatingComponent","xmlNS","TtmlSettings","settingsOverrides","ttmlNamespace","ttmlStyleNamespace","ttmlParameterNamespace","ttmlMetaNamespace","idPrefix","mediaFrameRate","mediaFrameRateMultiplier","mediaSubFrameRate","mediaTickRate","supportedTimeBase","rootContainerRegionDimensions","relatedMediaObjectRegion","cellResolution","rows","columns","defaultRegionStyle","backgroundColor","direction","display","displayAlign","extent","fontFamily","fontSize","fontStyle","fontWeight","lineHeight","opacity","origin","overflow","padding","showBackground","textAlign","textDecoration","textOutline","unicodeBidi","visibility","wrapOption","writingMode","fontMap","default","monospaceSerif","proportionalSerif","monospaceSansSerif","proportionalSansSerif","casual","cursive","smallCaps","monospace","sansSerif","serif","TtmlContext","translateToHtml","applicableStyleSet","preserveSpace","translation","innerNode","_getTagNameEquivalent","htmlName","htmlClass","TtmlParser","getAttributeNS","settings","agent","_defaultStyle","ownerDocument","title","setAttribute","appendChild","_translateStyle","outerNode","ttmlTextDecoration","parts","mappedColor","rgbaRegEx","red","green","blue","alpha","round","substr","TtmlNamedColorMap","transparent","setOwnerDocument","updateRelatedMediaObjectRegion","dimensions","hasEvents","events","resetCurrentEvents","currentEvents","updateCurrentEvents","time","timeEvents","_getTemporallyActiveEvents","currentEventsLength","currentEventsTime","getCues","cues","root","regions","layout","getElementsByTagNameNS","region","regionId","anonymousId","_translate","_isInRegion","pruneResult","_prune","inheritableStyleSet","cueBody","prunedElement","hasPreservedContent","showAlways","children","removeAttribute","rcr","rootContainerRegion","cue","filter","_isTemporallyActive","inheritedStyleSet","translator","computedStyleSet","tag","_getComputedStyleSet","_getApplicableStyleSet","_getInheritableStyleSet","tagName","_applyStyle","ignoreAncestors","child","childNodes","nodeType","Node","COMMENT_NODE","TEXT_NODE","createTextNode","childPreserveSpace","spaceAttr","pruneRecord","ancestor","parentNode","ELEMENT_NODE","body","styleSetCache","sets","set","applyInlineStyles","fontSizes","_appendSpanFontSizes","_isStyleApplicable","elemRegion","_getRegionId","node","namespaceURI","getLocalTagName","nameSpace","mappedValue","_ttmlToCssColor","coords","_ttmlToCssUnits","size","_ttmlToCssFontSize","values","parseFloat","isNaN","contextRect","first","second","third","forth","_ttmlToCssTextDecoration","defaultColor","_ttmlToCssTextOutline","ttmlUnits","cssUnits","unit","charAt","container","containerSize","scaleFactor","isRegion","textShadow","thickness","blur","firstChar","lengthRegEx","units","x","y","black","silver","gray","white","maroon","purple","fuchsia","magenta","lime","olive","yellow","navy","teal","aqua","cyan","TtmlTimeParser","_mediaFrameRate","_mediaTickRate","parse","ttmlTime","absoluteTime","absoluteTimeRegex","hours","minutes","seconds","subseconds","_getTimeUnitMultiplier","relativeTime","relativeTimeRegex","timeUnit","localName","baseName","namespace","attribute","attributes","lookupNamespaceURI","ttmlDocument","_parseXml","ttmlContext","_verifyRoot","_getFirstElementByTagNameNS","_parseTtAttrs","head","_ensureRegions","timeBase","_processAnonymousSpans","timeParser","_applyTiming","start","mediaStart","end","mediaEnd","_applyStyling","sort","event1","event2","styleSet","nodeValue","xmlString","xml","DOMParser","parseFromString","domParser","ActiveXObject","loadXML","candidate","documentElement","cellRes","cellGrid","createElementNS","extents","setAttributeNS","anonymousRegion","_isTagNS","textNodeGroups","prevNodeType","group","anonSpan","replaceChild","bound","isParallelContext","beginAttribute","startTime","endTime","duration","durationAttribute","endAttribute","minEnd","styling","styles","_applyStylesheet","empty","styleAttribute","ids","styleId","matches","ClosedCaptions","userPreferences","text","closedCaptionDiv","lastPlayPosition","resetCaptions","clicked","bind","closedCaptionDivStyle","bottom","isVideoControlVisible","transition","ref","showClosedCaptions","onClosedCaptionClick","componentDidMount","ccURL","_setCcLanguage","updateCaptions","currentTime","shouldComponentUpdate","nextProps","shouldRender","componentWillUnmount","removeEventListener","componentDidUpdate","prevProps","ccLanguage","applySettings","setTimeout","showSampleCaptions","mockCaptions","_onClosedCaptionsLoaded","current","playPosition","output","tick","_applyUserPreferencesOverrides","outerHTML","prefs","currentSettings","tempClosedCaptionsSettings","currentClosedCaptionsSettings","optionValue","_getPrefsCss","_loadClosedCaptions","href","ajax","errorCallback","errorDesc","error","winElement","prefsCss","pref","propVal","pVal","colorValue","opacityValue","_formatAsRgba","cssColor","colorStart","fullColorString","colorLenght","uncurryThis","fixRegExpWellKnownSymbolLogic","anObject","isNullOrUndefined","requireObjectCoercible","speciesConstructor","advanceStringIndex","toLength","getMethod","regExpExec","stickyHelpers","fails","UNSUPPORTED_Y","stringSlice","SPLIT_WORKS_WITH_OVERWRITTEN_EXEC","re","originalExec","apply","BUGGY","SPLIT","nativeSplit","maybeCallNative","internalSplit","separator","limit","O","splitter","string","rx","S","res","C","unicodeMatching","unicode","flags","multiline","lim","p","A","lastIndex","e","z","SocialMedia","SocialMediaComponent","setShareLinks","alt","socialMediaName","socialMedia","pageUrl","encodeURIComponent","postUrl","mediaImage","getElementsByName","Facebook","Twitter","postTitle","Pinterest","Mail","Linkedin","Customization","socialShareURL","left","screen","params","openWindow","AddToCartBehavior","getTotalItems","addedInput","totalCount","addedInput_1","__values","addedInput_1_1","next","count","ItemsAddedErrorComponent","errorMessage","StringExtensions","isNullOrEmpty","ItemsAddedToCartDialogComponent","dialogProps","dialogStrings","isModalOpen","itemsString","itemsAddedToCartFormatText","itemsAddedToCartHeaderText","linesString","linesAddedToCartFormatText","fullProducts","item","Modal","isOpen","toggle","onClose","ModalHeader","ModalBody","itemsAddedValidationErrorMessage","ModalFooter","viewCartButtonText","getUrlSync","closeButtonLabel","ItemSuccessfullyAddedToCartNotificationComponent","_super","__extends","prototype","payLoad","getPayloadObject","notification","telemetryContent","TelemetryConstant","ContinueShopping","shouldDisplayUnitOfMeasure","unitOfMeasureDisplayType","contentAction","etext","ViewBagAndCheckout","viewBagAttribute","getTelemetryAttributes","fallbackImageUrl","cropFocalRegion","reducedDimensions","Dimensions","reduce","str","productDimension","DimensionValue","Value","contentClassName","NotificationContent","footerClassName","NotificationFooter","ClosableNotificationWrapper","DismissibleNotificationWrapper","NotificationInstance","NotificationHeader","NotificationTitle","NotificationCloseButton","resources","DefaultUnitOfMeasure","isNullOrWhitespace","addedQuantityText","productQuantity","navigationUrl","goToCartText","BaseNotificationComponent","ItemSuccessfullyAddedToCartNotification","componentId","_this","headerItemOneText","headerItemFormatText","headerMessageText","isClosed","closeNotificationLabel","setValue","NotificationEvents","Close","Event","close","getValue","trigger","__decorate","withNotificationComponent","DismissibleNotification","MultiItemsSuccessfullyAddedToCartNotificationComponent","NotificationDescription","MultiItemsSuccessfullyAddedToCartNotification","descriptionLines","propagateResult","onAdd","propagateError","onError","getAddToCartInputFromProps","__awaiter","orderDetailsProducts","ObjectExtensions","simpleProduct","emailDeliveryModeCode","channel","EmailDeliveryModeCode","input","deliveryOption","salesLine","DeliveryMode","Quantity","catalogId","CatalogId","isAddEmailDeliveryItemToCart","ArrayExtensions","hasElements","apiSettings_1","getCatalogId","validateCatalogId","searchCriteriaInput","Context","ChannelId","channelId","IncludeAttributes","Ids","productId","ProductsDataActions","callerContext","searchResult","sent","productSearchResultsWithImages_1","productSearchResult","newProductSearchResult","newImageUrl","generateProductImageUrl","productData","find","RecordId","Variant","Price","quantity","addOneItemToCart","setDisabled","openModal","addToCartBehavior","addToCartInput","getCartState","addProductToCart","availableQuantity","productAvailability","AvailableQuantity","additionalProperties","validateQuantity","isOrderQuantityLimitsFeatureEnabled","enableStockCheck","isPriceKeyedIn","customPrice","customPriceAmount","shouldSkipSiteSettings","addToCartResult","showModal","showNotification","NotificationsManager","instance","addNotification","isBrowser","isNavigationToCartPageDisabled","goToCart","location","assign","ErrorNotification","errorDetails","LocalizedMessage","failureReason","cartActionResult","handleAddItemsToCartSuccess","setItemsAddedToCartDialogOpen","setErrorMessage","cartState","CartsDataActions","bypassCache","cart","Id","Version","validationResult","errorCount","ValidationFailuresByCartLines","errorText","oneErrorText","multiErrorsText","validationErrorMessage","itemsAddedResource","headerLinesFormatText","addItemsToCart","addProductsToCart","buyAgainNotificationTitle","buyAgainNotificationCloseAriaLabel","AddToCartComponentActions","cartError","addToCartError","hasOrderDetailsProducts","hasProducts","hasMultipleProducts","AddToCartFunctionalComponent","_w","disabled","_x","modalOpen","setModalOpen","_y","isItemsAddedToCartDialogOpen","_z","_0","setAddToCartInput","closeItemsAddedToCartDialog","priceComponent","popupProps","_h","_k","_j","_m","_l","_p","_o","_r","_q","_t","_s","renderModalPopup","Popup","getLinkText","payload","TelemetryEvent","AddToCart","buttonClassName","retrievedInput","_u","addToCartArialLabel","_v","isIntermediateState","shouldShowOutOfStock","outOfStockText","addToCartText","isCustomPriceSelected","maximumKeyInPrice","minimumKeyInPrice","defaultMaximumKeyInPrice","defaultMinimumKeyInPrice","missingDimensions","dimension","stockLeft","includeCurrentQuantity","isLoading","isProductQuantityLoading","isUpdatingDimension","isLoadingDeliveryOptions","isUpdatingDeliveryOptions","isAddServiceItemToCart","hasAvailableProducts","includedQuantityNumber","AddToCartComponent","OrderDetailsProduct","productUrl","isSelected","isProductAvailable","observable","buttonEventReference","LinesAddedToCartDialog","orderTemplate","linesCount","lineItemsString","linesAddedToCartHeaderLinesOneText","linesAddedToCartHeaderLinesFormatText","linesAddedToCartHeaderItemsOneText","linesAddedToCartHeaderMessageText","orderTemplateCloseButtonText","setUploadStatus","setLinesAddedToCartDialogOpen","setAddedLinesCount","isMultipleCatalogFeatureEnabledInHq","addOrderTemplateToCartInput","AddOrderTemplateToCartInput","productList","CartLines","cartLine","IsInvoiceLine","addOrderTemplateToCartAction","addedCartLines","orderTemplateErrorMessage","AddOrderTemplateToCartComponent","uploadStatus","addedLinesCount","linesAddedToCartDialogOpen","modalText","errorMsg","addToCartFailureMessage","addToCartSuccessMessage","addToCartProcessMessage","_getModalText","processStatusClass","closeWindowButtonText","AddOrderTemplateToCart","addOrderTemplateAttribute","PopupProducts","orderTemplateLines","line","fullProduct","totalLines","linesAddedToCartDialogResources","focus","OrderTemplateNameDialog","isUpdateDialog","existingOrderTemplate","onCancel","onSuccess","parentElementRef","orderTemplateName","setOrderTemplateName","cancel","orderTemplateModalAriaLabel","orderTemplateHeaderLabel","htmlFor","orderTemplateTitleLabel","orderTemplateNameAriaLabel","placeholder","defaultOrderTemplateName","maxLength","orderTemplateDescription","orderTemplateButtonLabel","UpdateOrderTemplateHeaderInput","updateOrderTemplateHeader","Error","CreateOrderTemplateInput","createOrderTemplate","orderTemplateCancelButtonLabel","OrderTemplateComponent","lineItemsText","actionButtonText","orderTemplateAction","renderAddToOrderTemplatesForExistingOrderTemplatesDialog","closeDialog","showOrderTemplateNameDialog","onAddToOrderTemplateButtonClick","boldText","patternToFind","addToOrderTemplateDialogResources","orderTemplates","createOrderTemplateImageUrl","getAsset","addToOrderTemplateHeader","selectTemplatesText","createNewOrderTemplateButtonText","addToTemplateButtonText","AddToOrderTemplateDialog","addToOrderTemplateDialog","isCreateOrderTemplateDialogOpen","setOrderTemplateNameDialogOpen","onOrderTemplateSelected","noOrderTemplatesMessage","noOrderTemplatesDescription","createAnOrderTemplateButtonText","cancelOrderTemplateCreationButtonText","renderAddToOrderTemplatesWhenEmptyOrderTemplatesDialog","createOrderTemplateDialogResources","LinesAddedToOrderTemplateDialog","itemsCount","reload","linesAddedToOrderTemplateHeaderItemsOneText","linesAddedToOrderTemplateHeaderItemsFormatText","linesAddedToOrderTemplateHeaderLinesOneText","linesAddedToOrderTemplateHeaderLinesFormatText","addedProducts","DimensionTypeValue","ProductDimensionType","Style","filteredProducts","linesAddedToOrderTemplateHeaderMessageText","Alert","assertive","linesAddedToOrderTemplateCustomPriceAlertMessageText","viewOrderTemplateButtonText","continueShoppingButtonText","AddProductsToOrderTemplateComponent","chosenOrderTemplate","setChosenOrderTemplate","setAddedProducts","isAddToOrderTemplateModalOpen","setIsAddToOrderTemplateModalOpen","isLinesAddedToOrderTemplateDialogOpen","setIsLinesAddedToOrderTemplateDialogOpen","addedItemsCount","setAddedItemsCount","linesToAdd","ProductListId","allProductInputs","linesToAdd_1","linesToAdd_1_1","listLine","ProductId","FullProductInput","getProductDetailsCriteriaFromActionInput","getFullProducts","allProducts","ProductListsDataActions","addedLines","quantities","calculateSum","onAddProductsToOrderTemplateClick","isChannelTypeB2B","addToOrderTemplateReference","addProductsToOrderTemplateButton","innerRef","isDisabled","DuplicateItemsWhenAddingToOrderTemplateDialog","executeOverrideQuantity","duplicatedProductsHeader","duplicatedProductsDescription","updateQuantityButtonText","cancelDuplicateItemsButtonText","ItemAddedToOrderTemplateDialog","orderTemplateId","productPrice","itemAddedToOrderTemplateHeaderItemOneText","itemAddedToOrderTemplateHeaderItemFormatText","itemAddedToOrderTemplateHeaderMessageText","join","AddToOrderTemplateComponentActions","state","waiting","isAuthenticated","signInUrl","addToOrderTemplate","setWaiting","onDismiss","setContent","showAlert","canAddMasterProduct","AddToOrderTemplateComponent","content","addToOrderTemplateModalOpen","setAddToOrderTemplateModalOpen","chosenOrderTemplateId","setChosenOrderTemplateId","setProductPrice","itemAddedToOrderTemplateDialogOpen","setItemAddedToOrderTemplateDialogOpen","duplicateItemsWhenAddingToOrderTemplateDialogOpen","setDuplicateItemsWhenAddingToOrderTemplateDialogOpen","addToOrderTemplateButtonText","showStatusMessage","showButtonText","showButtonTooltip","shouldShowButtonFailedTooltip","disableButton","tooltipPosition","addToOrderTemplateButtonTooltip","addToOrderTemplateRef","showMessage","showTooltip","tooltipPos","dialogData","UncontrolledTooltip","placement","orderTemplateTextMessage","AddItemToOrderTemplateInput","addItemToOrderTemplate","then","getPriceForSelectedVariant","PriceForSelectedVariantInput","retrievedProductPrice","catch","AsyncResult","reject","resolve","itemAddedToOrderTemplateDialogResources","duplicateItemsWhenAddingToOrderTemplateDialogResources","UpdateOrderTemplateInput","updateOrderTemplateAction","ItemAddedToCartDialog","itemAddedToCartHeaderItemOneText","itemAddedToCartHeaderItemFormatText","itemAddedToCartHeaderMessageText","renderImage","RenameOrderTemplateComponent","renameOrderTemplateButtonText","renameOrderTemplateDialogStrings","renameOrderTemplateDialogOpen","debug","onRenameTemplate","SaveCartToOrderTemplateActions","SaveCartToOrderTemplateComponent","linesAddedToOrderTemplateDialogOpen","setLinesAddedToOrderTemplateDialogOpen","createOrderTemplateFromCartButton","createOrderTemplateFromCartButtonTooltip","getFullProductsDetails","productLines","allProdInputs","forEach","lines","updateLinesCounts","firstQuantity","secondQuantity","areAllCartlinesPriceKeyedIn","cartLines","cartline","IsPriceKeyedIn","allProductListLines","UnitOfMeasure","UnitOfMeasureSymbol","filteredProductListLines","addProductListLinesAsync","filteredAddedLines","linesAddedToOrderTemplateDialogResources","newLinesToupdate","getLinesInput","GetProductListLinesInput","getProductListLines","linesState","linesToUpdate","productListLine","lineToUpdate","updateProductListLinesAsync","updatedLines","Player","controlPanelTimer","player","audio","playerContainer","videoControl","ageGateContainer","videoUrl","seekFrom","closedCaptionHelper","closedCaptionMenu","optionsMenu","selectedClosedCaptionsLocale","isPlayerManuallyPaused","isPlayerLoaded","_renderClosedCaptions","VideoPlayerNames","videoplayerContainer","closedCaptionLanguage","closedCaptionsURL","isControlPanelVisible","doControlsHaveFocus","_onTriggerClicked","_renderPlayPauseTrigger","maskLevelStyle","autoplay","shouldAutoPlay","playPauseTrigger","isPlayPauseTrigger","controls","isControlsEnabled","shouldDisableAutoPlayOnMobile","isTriggerEnabled","isAgegateEnabled","PlayPauseTrigger","toggled","playing","mouseHovered","onFocus","_onTriggerFocus","onBlur","_onTriggerBlur","_renderVideoControls","VideoControls","onPlayClick","optionMenu","videoSeekSteps","defaultVideoSliderSteps","volumeSeekSteps","defaultVolumeSliderSteps","isMuted","onMuteClick","_setMuted","onVolumeChange","_onVolumeChange","onProgressChange","_onProgressChange","currentClosedCaptionLanguage","currentVolume","isInFullScreen","toggleFullScreen","_toggleFullScreen","handleControlsKeyDownHandler","_handleControlsKeyDownEvent","_onVideoControlsFocus","_onVideoControlsBlur","onMenuItemClick","_onPlayerMenuItemClick","onMenuItemFocus","_onPlayerMenuItemFocus","onMenuItemBlur","_onPlayerMenuItemBlur","currentAudioTrack","currentAudioTrackURL","optionButtonLabel","_renderAgeGate","AgeGate","onSubmitClick","_validateAgeSubmitHandler","minmumAge","minimumAge","isAutoPlay","ageGate","isAgeGateEnabled","mute","lazyLoad","isLazyLoaded","_isMobile","_shouldAutoPlay","defaultVolume","previousVolume","showSpinner","showErrorMessage","screenReaderText","mounted","closedCaptionsSettingDefaults","videoErrorMessage","bufferedDuration","playerState","_onMouseEvent","_onPlay","_onPause","_triggerEvents","_triggerAudioEvents","_onFullScreenChanged","_showControlBar","_onFullscreenError","_onPlayerKeyDown","_onContextMenuClicked","doc","fullscreenEnabled","mozFullScreenEnabled","webkitFullscreenEnabled","webkitSupportsFullscreen","msFullscreenEnabled","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","nextState","loop","isLoop","_getMaskLevelStyle","isEditor","_loadPlayer","loadMetaData","onKeyDown","onMouseEnter","preload","muted","autoPlay","onPlay","onPause","onContextMenu","poster","playsInline","Waiting","play","_onVideoError","_onAudioError","pause","_onVideoLoadedData","mediaEvent","MediaEvents","volume","load","autoCaptionsLang","autoCaptions","autoCaptionsLocale","setState","getCalculatedAge","_displayErrorMessage","_setCCSettings","_setCC","ccLanguageId","selectedOption","updatePreferences","dataSplit","currentSetting","JSON","paused","_updateState","seeking","currentPlayer","_onTimeUpdate","_stop","_getError","errorCode","VideoErrorCodes","MediaErrorAborted","MediaErrorNetwork","MediaErrorDecode","MediaErrorSourceNotSupported","_stopMedia","msgToDisplay","contentErrorCode","code","MEDIA_ERR_ABORTED","MEDIA_ERR_NETWORK","MEDIA_ERR_DECODE","MEDIA_ERR_SRC_NOT_SUPPORTED","MediaErrorUnknown","keycode","keyCode","Home","stopPropagation","preventDefault","End","ArrowLeft","ArrowRight","jumpToTime","ArrowUp","ArrowDown","showVolumeControl","firstThumbValue","newVolume","_updateScreenReaderElement","onTelemetryClick","Tab","_showControlsBasedOnState","autoHide","clearTimeout","_hideControlBar","defaultControlPanelTimeout","_onFullscreenExit","_onFullscreenEnter","_exitFullScreen","_enterFullScreen","_isNativeFullscreenEnabled","elementInFullScreen","_getElementInFullScreen","requestFullscreen","msRequestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","webkitEnterFullScreen","cancelFullScreen","msExitFullscreen","mozCancelFullScreen","webkitCancelFullScreen","position","_getPlayPosition","_getBufferedDuration","buffered","abs","defaultPositionUpdateThreshold","setFocusOnPause","setFocusOnPlay","playFullScreen","_seek","maskLevel","defaultMaskLevel","newState","_showSpinnerBasedOnState","_hideSpinner","_showSpinner","isIphone","isSilk","isWindowsPhone","isAndroid","playerName","videoId","description","shareUrl","externalPlayerUrl","externalSourceId","ActionToggle","_divRef","_focusElement","_onClick","getSnapshotBeforeUpdate","_this$_divRef$current","activeElement","_this$props","_objectWithoutProperties","_excluded","classes","hidden","actionToggle","focusTarget","ageGateDiv","day","dayValue","month","monthValue","year","yearValue","today","Date","age","getFullYear","birthdayMonthHasNotHappenedYet","getMonth","birthdayDayHasNotHappenedYet","getDate","renderSelectMonth","allMonth","monthList","toFixed","_filterDateMonthYear","renderSelectDay","allDay","dayList","renderSelectYear","thisYear","allYear","yearList","enabled","regxForAgeGateInputValidation","defaultPlayGlyphIcon","defaultPauseGlyphIcon","defaultMuteGlyphIcon","defaultUnMuteGlyphIcon","defaultFullScreenGlyphIcon","defaultExitFullScreenGlyphIcon","closedCaptionGlyphClassName","ccLangPrefKey","mutePrefKey","volumePrefKey","PlaybackSpeed","Quality","Share","Download","DownloadableMediaTypes","preset1","preset2","preset3","preset4","preset5","monospacedsansserif","monospacedserif","proportionalsansserif","proportionalserif","smallcapitals","percent","small","large","extralarge","maximum","grey","none","depressed","dropshadow","raised","uniform","Menu","handleDocumentClick","_onKeyDown","_onKeyUp","getMenuWidth","offsetWidth","playerMenu","menuItems","onKeyUp","menuItem","MenuItem","image","imageAlt","itemCount","itemIndex","glyph","hasChildren","onMouseOut","hasFocus","onDocumentClick","_onFocus","_onMouseOver","_onMouseOut","_onBlur","_objectDestructuringEmpty","playRef","pauseRef","ButtonMenuTypes","selectedMenuItems","volumeButtonDiv","playButtonRef","pauseButtonRef","closedCaptionRef","optionButtonRef","fullscreenButtonRef","exitFullScreenButtonRef","videoControlDiv","closedCaptionButtonDiv","optionButtonDiv","menuRef","muteButtonRef","unMuteButtonRef","_fullScreenReference","autohide","offsetPosition","_getOffsetPosition","volumeAutoHideTimer","showVolumeSlider","volumeSliderLeftPosition","offsetLeft","volumeSliderTopPosition","offsetTop","firstChild","_hideVolumeControl","volumeAutoHideTimeout","_onDocumentClick","currentMenu","showMenu","_renderClosedCaptionButton","videoControlsClassName","_onClosedCaptionClick","_renderOptionButton","_onOptionsButtonClick","_renderFullScreenButton","_renderVolumeButton","volumeButtonProps","_renderVideoSlider","videoProps","inForm","fillTrackValue","orientation","showProgressBar","showLabels","shouldSliderAdjustToRTL","handleTooltipText","_handleProgressToolTipText","sliderThumbs","ariaValueText","Slider","_renderVolumeSlider","volumeSliderProps","tooltip","_toElapsedTimeString","focusedMenuItemIndex","_onMenuItemClick","_reevaluateWidth","_onMenuBlur","_onMenuFocus","_onMenuKeyDown","_onMenuKeyUp","menuLeftPosition","toolTipClass","_objectSpread","previousProps","_updateSelectedMenu","volumeDivStyle","top","menuDivStyle","setFocusOnMenuButton","_this$_fullScreenRefe","_isIPhone","rowDiv","controlBarButtonsWidth","sliderWidth","videoControlWidth","viewportMax","innerWidth","_applyTooltipClassOnWidthChange","button","_onMenuKeyPressed","Space","currentMenuItem","_resetFocusForCurrentMenu","Enter","forceUpdate","PageUp","PageDown","Escape","shiftKey","currentTarget","_getSelectedMenuFromList","pop","stringify","refDiv","buttonWidth","elementwidth","negative","elapsedTime","viewportMin","CarouselItem","onEnter","isAppearing","startAnimation","onEntering","offsetHeight","onExit","onExiting","dispatchEvent","CustomEvent","onExited","slide","cssModule","collapseIn","in","mountOnEnter","unmountOnExit","appear","enter","exit","timeout","otherProps","onEntered","__rest","timeoutOrDefault","TransitionTimeouts","Carousel","Tag","transitionProps","CarouselContext","Consumer","Transition","isActive","directionClassName","orderClassName","itemClasses","mapToCssModules","classNames","directionTextPrev","directionTextNext","defaultThrottleThreshold","setInterval","clearInterval","interval","cycleInterval","hoverStart","mouseEnter","hoverEnd","mouseLeave","handleKeyPress","keyboard","previous","renderItems","carouselItems","handleOnExiting","handleOnExited","activeIndex","slides","slotContent","isIn","_handleKeyPressPrev","_handleKeyPressNext","throttleThreshold","threshold","_handleTouchStart","_handleTouchEnd","scrollThreshold","touchScrollThreshold","indicatorClicked","_onClickPrev","_onClickNext","linkRefPrev","linkRefNext","nextHandleInputThrottledEvent","debounce","previousHandleInputThrottledEvent","ride","componentWillReceiveProps","hasCurrentKeys","hasNextKeys","isKeyDifferent","equals","transitionType","dismissEnabled","hideFlipper","showPaginationTooltip","hideIndicator","isDisabledFunctionality","outerClasses","transitionTypeValue","carouselClass","innerClasses","dismiss","_renderDismissCarousel","indicators","_renderIndicators","carouselControls","_renderCarouselControls","Provider","onTouchStart","onTouchEnd","evt","touches","scrollStart","screenX","changedTouches","delta","onIndicatorsClickHandler","indicatorAriaText","listClasses","idx","indicatorClasses","active","indicatorId","caption","anchorClassesPrev","anchorClassesNext","iconClassesPrev","iconClassesNext","screenReaderClasses","prevAttribute","nextAttribute","handleDismissCarousel","dismissCarouselAriaText","CartIcon","observer","cartLabel","cartQtyLabel","cartLink","cartItem","totalItemsInCart","qtyLabel","CartIconComponent","PromoCode","_onInputChange","promoCodeInputValue","canApply","_applyPromotion","appliedPromo","addPromoCode","promoCode","substatus","duplicatePromoCodeErrorText","invalidPromoCodeErrorText","failedToAddPromoCodeErrorText","_renderForm","promoPlaceholderText","promoCodeApplyButtonText","onSubmit","_removePromotion","removePromoCodes","promoCodes","failedToRemovePromoCodeErrorText","_calculateDiscount","discountAmount","DiscountLines","e_2","discountLine","DiscountCode","DiscountCost","_renderAppliedPromoCode","Coupons","totalCouponDiscountAmount","coupon","Code","appliedPromoCodeHeadingText","removePromoAriaLabelFormat","removePromoText","ApplyPromoCode","isCollapseOpen","promoCodeHeadingText","PromoCodeComponent","setShowPreviousActions","componentClassName","toggleMenuButtonClassName","ActionMenuComponent","showActions","setShowActions","isVisible","isShowActions","shouldShowActions","telemetryAttributes","AddToWishlistComponentActions","getSelectedProduct","doesProductExistInWishlist","removeFromWishlist","addToWishlist","wishlists","CommerceListLines","CommerceListLines_1","CommerceListLines_1_1","propagateSuccess","wishlistName","nameOfWishlist","getCustomerAccount","customer","AccountNumber","listData","CustomerId","CommerceListTypeValue","createCommerceListAsync","commerceList","callAddWishlistLine","warning","error_1","wishlistId","addLinesAsync","buildWishlistLine","createdCommerceList","update","createGetByCustomerInput","setCanRemove","wishlistTextMessage","addToWishlistMessage","error_2","addItemToWishlistError","removedFromWishlistMessage","removeItemFromWishlistError","wishlistLine","removeLinesAsync","error_3","customerInput","GetCustomerInput","getCustomer","AddToWishlistComponent","canRemove","removeFromWishlistButtonText","addToWishlistButtonText","ariaRole","showRemoveButton","onClickHandler","addToWishlistRef","removeFromWishlistRef","linkAriaRole","CartLinePriceEditor","waitTime","_handleChange","newValue","cancellabelDebounce","_debounce","setInvoiceLinePrice","cartLineId","LineId","PriceEditor","defaultAmount","maximumValue","InvoiceAmount","minimumValue","handleChange","CartLineItemFunctions","renderProductDimensions","Product","DimensionStrings","colorString","configString","sizeString","IsGiftCard","amountString","styleString","renderDiscountLines","OfferId","OfferName","discountStringText","isSalesLine","PeriodicDiscount","DiscountAmount","priceCurrency","EffectivePercentage","renderInventoryLabel","inventoryInformationLabel","inventoryCssName","inventoryLabelClassName","renderUnitOfMeasure","renderShippingLabel","pickupDeliveryModeCode","PickupDeliveryModeCode","channelDeliveryOptionConfig","PickupDeliveryModeCodes","some","deliveryMode","shippingChargeLines","ChargeLines","chargeLine","IsShipping","freightFee","chargeTotal","CalculatedAmount","shippingChargesText","renderOtherCharges","otherCharges","chargeline","otherCharge","Description","renderSalesAgreementPrompt","SalesAgreementLineRecordId","renderConfirmedShipDate","confirmedShipDate","shipDateCssName","confirmedShipDateLabel","renderRequestDeliveryDate","requestDeliveryDate","reqDateCssName","requestDeliveryDateLabel","CatalogLabelComponent","catalogs","catalog","CartLineItemComponent","destructDimensionStrings","inputQuantityAriaLabel","productDimensions","prodAttribute","productName","imgeClassName","_generateErrorMessage","_updateQuantity","quantityOnChange","lineIndex","_generateSelectMenu","currentQuantity","nodes","_generateMenu","_generateQuantityAndPrice","isOutOfStock","isQuantityEditable","maxQuantity","quantityDisplayString","NetAmountWithAllInclusiveTax","GrossAmount","ExtendedPrice","NetPrice","salesAgreementLineId","displayMode","primaryImageUrl","priceEditorResources","showShippingChargesForLineItems","ProductComponentSwatchComponent","dimensionType","swatches","onSelectDimension","onSelectItem","SwatchComponent","list","ProductComponent","ratingAriaLabel","allowBack","quickViewButton","productComparisonButton","inventoryLabel","dimensionAvailabilities","swatchItemAriaLabel","dimensionToPreSelectInProductCard","updateProductUrl","productDetailsPageUrl","coreContext","queryString","sourceUrl","URL","baseUrl","search","pathname","getDefaultSwatchSelected","AttributeValues","attributeSwatches","attributeValue","KeyName","Swatches","IsDefault","getProductPageUrlSync","defaultSwatch","swatchProductImageUrls","productImageUrlFromSwatch","ProductImageUrls","generateImageUrl","productPageUrlFromSwatch","SwatchValue","queryStringEncoded","getProductPageUrlFromDefaultSwatch","productPageUrl","setProductPageUrl","productImageUrl","setProductImageUrl","selectedSwatchItems","Dictionary","updatePageAndImageUrl","swatchItem","productPageUrlWithSwatch","newUrl","searchParams","delete","swatchProductImageUrl","productImageUrls","inventoryAvailabilityLabel","unitOfMeasure","ratingAriaLabelText","reviewCount","ratingCountAriaLabelText","availability","reviewCountArialableText","swatchItems","validValues","dimensionTypeValue","checkIfShouldDisplayAsSwatch","DimensionSwatchDisplayTypes","productCard","itemId","colorHexCode","SwatchColorHexCode","imageUrl","SwatchImageUrl","isDefault","dimensionAvailability","swatch","recordId","isUnitOfMeasureEnabled","getRatingAriaLabel","roundedRating","getReviewAriaLabel","AverageRating","TotalRatings","productCardimageSettings","emptyPlaceHolderImage","placeholderImageName","fallbackImageSource","imageProps","bypassHideOnFailure","renderProductPlacementImage","moduleTypeName","moduleId","savingsPriceResourceText","freePriceResourceText","originalPriceResourceText","currentPriceResourceText","IsMasterProduct","Standalone","renderPrice","hideRating","totalRatings","numberRatings","renderRating","quickview","selectedDimensions","getValues","convertDimensionTypeToProductDimensionType","selectedProductId","renderQuickView","renderProductComparisonButton","Dropdown","selectMenu","_onChanged","selectedIndex","dropdownId","selectId","selectedValue","innerText","onInitialize","initializedDimension","selectedItem","dropdownList","dropdownName","dropdownToggleName","dimensionChanged","_onInitializedDimension","initializeDimension","getProductConfigure","moduleName","pageName","selectDimensionFormatString","callbacks","configureErrors","getDropdownName","onChanged","__generator","dimensionSelectedAsync","onInitializedDimension","getTelemetryObject","telemetryPageName","dropdowns","productDimensionFull","dropdownCallback","DimensionValues","dM","containerProps","labelContainerProps","errors","heading","select","mapProductDimensionFullToDropdownViewProps","SwatchItemComponent","isColored","hasColor","hasImage","selectItem","selectionHandler","isSelectionEnabled","fullImageUrl","generateSwatchImageUrl","onKeyPress","shouldDisplayText","isRefineItem","containerClassName","selectedItemId","setSelectedItemId","didUserSetAnyItem","setDidUserSetAnyItem","onSelectItemCallback","defaultItem","ProductComponentV2SwatchComponent","ProductDimensionsMatrixDimensionItemComponent","swatchContent","swatchContainerClassName","swatchContentClassName","getDimensionName","Color","productDimensionTypeColor","Configuration","productDimensionTypeConfiguration","Size","productDimensionTypeSize","productDimensionTypeStyle","changeCurrentDimension","onDimensionTypeSelect","ProductDimensionsMatrixDimensionSelectionComponent","buttonTogglingReference","isPopoverShown","setIsPopoverShown","currentDimensionType","setCurrentDimensionType","currentDimensionTypeLabel","setCurrentDimensionTypeLabel","popoverClassName","togglePopoverHandler","onDimensionTypeChange","Popover","dimensionTypes","ProductDimensionsMatrixEnterAllQuantitiesPopoverContentComponent","defaultQuantity","setCurrentQuantity","handleQuantityChange","newQuantity","handleApplyAll","onApplyToAll","productDimensionsMatrixEnterAllQuantitiesQuantityText","IncrementalQuantity","currentCount","productDimensionsMatrixInputQuantityAriaLabel","minQuantityValue","maxQuantityValue","decrementButtonAriaLabel","productDimensionsMatrixEnterAllQuantitiesDecrementButtonAriaLabel","incrementButtonAriaLabel","productDimensionsMatrixEnterAllQuantitiesIncrementButtonAriaLabel","productDimensionsMatrixEnterAllQuantitiesEachText","productDimensionsMatrixEnterAllQuantitiesApplyToAllText","ProductDimensionsMatrixEnterAllQuantitiesComponent","productDimensionsMatrixEnterAllQuantitiesButtonText","getDimensionId","isDimensionAvailable","dimensionId","inventoryLevel","getInventoryLevelCodeFromDimensionValue","retrieveDimensionInventoryLevelCode","InventoryLevelValues","outOfStock","retrieveEndDimensionsNode","dimensionIds","isAvailable","endNodes","concat","isNodeAvailable","nodes_1","nodes_1_1","createDisplayOrders","usedDimensions","dimensions_1","dimensions_1_1","currentDimensions","currentResult","ProductDimensionsMatrix","_handleDisplayOrderChange","newDimensions","_displayOrderList","dimensionsOrder","_generateNodesByNewDimensions","reverse","lastChangeAllDate","now","_updateAllQuantities","totalQuantity","_clearAllQuantities","_defaultQuantityProps","_handleCollapseDimension","isExpanded","dimensionsExpandState","getValueWithDefaultValue","dimensionsExpandStateDate","_handleDimensionTypeChange","previousDimensionType","newDimensionType","previousDimension","newDimension","dimensionOnChange","_handleQuantityChange","difference","isMobile","variant","VariantType","Viewport","_retrieveNodes","retrieveAvailabilitiesInformation","dimensionValuesWithInventory","dimensionsList","flatten","nodeDimensions","productIds","dimensionProductIds","ProductIds","nodeDimensions_1","e_4","nodeDimensions_1_1","nodes_2","nodes_2_1","_renderMatrixEmptyCell","_className","_renderHeader","_renderMatrix","_renderFooter","warehouseAggregation","availabilitiesSearchCriteria","QuantityUnitTypeValue","FilterByChannelFulfillmentGroup","DeliveryModeTypeFilterValue","shipping","DefaultWarehouseOnly","availabilities","AggregatedProductInventoryAvailabilities","this_1","getInventoryLevelCodeFromProductAvailability","_renderDisplayOrderContainer","_renderActions","productDimensionsMatrixDisplayOrderSeparator","LabeledDropdown","labelClassname","labelText","productDimensionsMatrixDisplayOrderLabel","dropdownOptions","dropdownClassname","onSelectOption","_renderEnterAllQuantities","_renderClearAllQuantities","maxQuantityForCartLineItem","minQuantity","productDimensionsMatrixClearAllText","_renderMatrixDesktop","rowClassName","cellClassName","_renderMatrixRowsDesktop","reversedDimensions","_renderMatrixDimensionsHeader","_renderMatrixDimensionCell","cells","_renderMatrixMobile","allDimensions","singleDimensionClassName","dimensionsContainerClassName","_renderMatrixRowsMobile","previousNode","pastNode","haveSameItems","_renderMatrixMainDimensionMobile","expandButtonClassName","collapseClassName","collapseItemClassName","Collapse","partialDimensions","nodeIndex","newNodeIndex","nodeDimensionIdsLength","partialDimensionIdsLength","currentDimensionId","currentDimension","this_2","lastDimension","_renderMatrixCell","this_3","nextRows","ColorHexCode","ImageUrl","_renderMatrixQuantityCell","_renderMatrixOutOfStockCell","productDimensionsMatrixOutOfStockLabel","_renderTotalSummary","productDimensionsMatrixTotalItemsLabel","_retrieveProducts","_renderAddToOrderTemplate","customerInformation","_renderAddToCart","productDimensionsMatrixAddItemsToCartButtonText","onErrorMessage","_renderFooterActions","RefinerOptionsType","RefinerItemType","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","isToggledItemFound","currentRefinementCriteria_1","currentRefinementCriteria_1_1","selectedCriterion","isMatchingRefinementCriterion","refinerItemData","isSelecting","minValue","rangeStart","maxValue","rangeEnd","refinerOptionsData","typeValue","SingleSelect","refinerItemId","matchingIndex","findIndex","criterion","refinerItems","refinerValue","refinementCriterion","sourceTypeValue","RefinerApplyFunctionalComponent","applyRefinerAttributes","ApplyRefiner","RefinerApplyComponent","RefinerChoiceSummaryFunctionalComponent","clearAllText","choiceAriaLabel","choiceFormat","selectedChoices","onClickChoice","onClickClearAll","onClickChoiceHandler","selectedRefinerItem","targetChoiceItem","shouldClearAll","nextItemToFocus","nextSibling","onClickClearAllHandler","clearAllAttributes","choiceItem","choiceItemName","activeRefinerItem","overallFormat","refinerLabel","itemType","DateRange","refinerMinValue","refinerMaxValue","getTagName","choiceItemAttribute","RefinerChoiceSummaryComponent","RefinerFooterFunctionalComponent","refinerApplyProps","extraActions","RefinerFooterComponent","RefinerToggleFunctionalComponent","RefinerToggleComponent","selectLabelId","RefinerSortFunctionalComponent","currentSortOption","sortOptionState","setSortOptionState","selectHtmlElement","sortOption","RefinerSortComponent","RefinerHeaderFunctionalComponent","refinerToggleProps","refinerChoiceSummaryProps","refinerSortProps","RefinerHeaderComponent","RefinerItemCheckFunctionalComponent","isSingleSelect","isChecked","itemTypeClassName","refinerItemAttributes","RefinerItemCheckComponent","minInputLabelId","maxInputLabelId","RefinerItemDateRangeFunctionalComponent","minInputLabel","maxInputLabel","minInputAriaLabel","maxInputAriaLabel","minRangeValue","maxRangeValue","validationErrorForRange","fallbackPattern","onChangeMinValue","onChangeMaxValue","onBlurMinInput","onBlurMaxInput","selectedMinValue","setSelectedMinValue","selectedMaxValue","setSelectedMaxValue","validationErrorMessageForRange","setValidationErrorMessageForRange","validateRange","minimum","selectedFormattedValue","userSelectedMinValue","updatedMinInput","minInput","pattern","userSelectedMaxValue","updatedMaxInput","maxInput","RefinerItemDateRangeComponent","componentModalClassName","RefinerModalToggleFunctionalComponent","RefinerModalFunctionalComponent","autoFocus","applicationNode","returnFocusRef","returnRef","onToggle","zIndex","modalNode","modalTitle","modalHeaderNode","refinerOptions","modalCloseButtonText","modalFooterNode","RefinerModalToggleComponent","RefinerModalComponent","listItemClassName","RefinerOptionsFunctionalComponent","isExpandedOnInitialLoad","expandTimeout","onUpdateRefiners","shouldRefinerExpand","setShouldRefinerExpand","isRefinerExpanded","setIsRefinerExpanded","onToggleRefinerOptions","onClickRefinerItem","onMinValueUpdate","updatedMin","onMaxValueUpdate","updatedMax","refinerItem","isSingleSelectValue","selectedRefinerItems","refinerItemCheckProps","refinerDataRangeProps","minLabel","maxLabel","RefinerOptionsComponent","modalToggleWrapperClassName","RefinerFunctionalComponent","renderMobile","isMobileView","refinerModalProps","refinerHeaderProps","refinerModalToggleProps","createComponentInMobileView","refinerFooterProps","createComponentInDesktopView","RefinerComponent","SearchBarComponent","currentSearchOption","searchOptionState","setSearchOptionState","currentSearchText","searchTextState","setSearchTextState","searchButtonAttributes","Search","searchOptionsAriaLabel","searchOption","clearSearchTextOnOptionChange","searchBarPlaceholder","searchBarAriaLabel","searchButtonAriaLabel","searchButtonLabel","TableCellContentType","TableHeaderComponent","contentType","TableRowComponent","TableCellComponent","TableComponent","WishListIconComponent","wishlistIconRef","wishlistTooltipText","showButtonIconTooltip","wishlistUrl","shouldShowCount","isDispayWishlistCount","wishlistCountlbl","wishlistCountLabel","wishlistItemCount","wishlistCount","countLabel","classname","MobileVideoQuality","isAllowBack","getDefaultColorSwatchSelected","attributeValues","colorAttribute","keyName","DimensionTypes","getProductImageUrlFromDefaultColorSwatch","swatchValue","swatchColorHexCode","swatchImageUrl","averageRating","productBasePrice","adjustedProductPrice","maxVariantProductPrice","channelConfig","Currency","basePrice","defaultUnitOfMeasure"],"sourceRoot":""}