{"version":3,"file":"static/js/c31e64b0d7ca8eac1c2a.bundle.js","mappings":";yQAEM,SAAUA,EAA0BC,EAAYC,GAC7CD,GAGLE,OAAOC,KAAKH,GAAOI,SAAQC,IACX,WAARA,GAA4B,SAARA,GAA0B,QAARA,GAAyB,mBAARA,IAI/C,kBAARA,EACAJ,EAAQD,EAAMK,KACC,UAARA,GAA2B,aAARA,GAA8B,UAARA,GAA2B,YAARA,GAAqBA,EAAIC,MAAM,WAAmC,iBAAfN,EAAMK,KAC5HN,EAA0BC,EAAMK,GAAMJ,OAkB5C,SAAUM,EAA+BP,GAC3CD,EAA0BC,GAAQQ,KAdhC,SAA2BA,GACzBA,EAAcC,OAEdD,EAAcC,KAAO,GAGzBP,OAAOC,KAAKK,EAAcE,WAAa,IAAIN,SAAQC,IAC3CG,EAAcE,UAAUL,GAAKM,IAC7BH,EAAcE,UAAUL,GAAKM,EAAIH,EAAcE,UAAUL,GAAKM,EAAEC,QAAQ,oBAAqB,UAAUA,QAAQ,QAAS,WAO5HC,CAAiBL,MCLzB,MAAMM,EAAuBC,IAEzB,MAAM,4BAAEC,EAA2B,QAAEC,EAAO,MAAEC,GAAUH,EAExD,OAAOI,IAAAA,cAACC,EAAAA,KAAIlB,OAAAmB,OAAA,GAAKL,GAA8BE,GAAgBD,IAY7DK,EAA4BA,CAC9BC,EACAf,EACAgB,EACAC,EACAzB,EACA0B,KACqC,IAAAC,EAAAC,EACrC,IAAIC,EAAoC,GAExC,MAAMC,EAAgD,QAA3BH,EAAG3B,EAAM+B,QAAQC,IAAIC,cAAM,IAAAN,OAAA,EAAxBA,EAA0BO,qBACzB,IAAAC,EAA3BnC,EAAMoC,KAAKC,QAAQC,SACnBT,GAAgBU,EAAAA,EAAAA,qBACZvC,EAAMoC,KAAKC,QAAQC,OAAOE,OAC1BxC,EAAM+B,QAAQU,QAAQC,YACG,QADQP,EACjCnC,EAAM+B,QAAQU,QAAQT,WAAG,IAAAG,GAAQ,QAARA,EAAzBA,EAA2BF,cAAM,IAAAE,OAAA,EAAjCA,EAAmCQ,mBAGvCb,GAAyBD,IACzBA,EAAgB,GAAGA,KAAiBC,KAMxC,MAAMc,EAAUA,KAAK,IAAAC,EAAAC,EACG,QAApBD,EAAA7C,EAAM+C,sBAAc,IAAAF,GAApBA,EAAAG,KAAAhD,GAC4B,QAA5B8C,EAAA9C,EAAMiD,8BAAsB,IAAAH,GAA5BA,EAAAE,KAAAhD,EAA+BwB,GAC/BxB,EAAMkD,MAAMC,YAAc3B,GAYxB4B,EAAiBC,IACfA,EAAMC,UAAYC,EAAAA,SAASC,QAC3BH,EAAMI,iBACNb,MAIR,MAAO,CACH5B,4BAA6B,CACzB0C,IAAK,KACLC,UAnBQC,GAAAA,CACZ,mCACAnC,IAAwBD,EAAU,0CAA4C,IAkB1EqC,KAAM,eACNxD,IAAKmB,GAETP,QACIE,IAAAA,cAACC,EAAAA,KAAI,CAACuC,UAAU,yBACZxC,IAAAA,cAAC2C,EAAAA,OAAM,CACHD,KAAK,MAAK,aACEtC,EAAMwC,QAAO,gBACVtC,IAAwBD,EAAO,gBAC/B,GAAGxB,EAAMgE,sBAAsBxC,IAC9CmC,UAAU,sCACVf,QAASA,EACTqB,UAAWb,GAEXjC,IAAAA,cAAC+C,EAAAA,GAAKhE,OAAAmB,OAAA,CACF8C,eAAgBnE,EAAM+B,QAAQqC,cAAcD,eAC5CR,UAAU,+BACNpC,EAAK,CACT8C,aAAcrE,EAAM+B,QAAQU,QAAQ4B,aACpC7D,cAAkD,QAArCoB,EAAE5B,EAAMiC,OAAOqC,8BAAsB,IAAA1C,EAAAA,EAAIpB,EACtD+D,oBAAoB,OACpBC,sBAAuBxE,EAAMkD,MAAMuB,wBACnCC,YA3BC,IA2BYlD,EAA2BK,EAAgBN,EAAMoD,IAC9DC,oBA5BC,IA4BoBpD,MAG7BL,IAAAA,cAACC,EAAAA,KAAI,CACDuC,UACIjC,IAAmBmD,EAAAA,UAAU3D,MAAQ,uCAAyC,kCAGlFC,IAAAA,cAAC2C,EAAAA,OAAM,CACHG,UAAWb,EACX0B,MACIpD,IAAmBmD,EAAAA,UAAU3D,MAAQlB,EAAM+E,UAAUC,mBAAqBhF,EAAM+E,UAAUE,oBAE9FpB,KAAK,SACLF,UACIjC,IAAmBmD,EAAAA,UAAU3D,MACvB,yCACA,+CAEV0B,QAASA,QAyE3BsC,EAAiCA,CACnC1E,EACAR,KACqC,IAAAmF,EAAAC,EACrC,IAAIvD,EAAoC,GAExC,MAAMC,EAAgD,QAA3BqD,EAAGnF,EAAM+B,QAAQC,IAAIC,cAAM,IAAAkD,OAAA,EAAxBA,EAA0BjD,qBAEzB,IAAAmD,EAA3BrF,EAAMoC,KAAKC,QAAQC,SACnBT,GAAgBU,EAAAA,EAAAA,qBACZvC,EAAMoC,KAAKC,QAAQC,OAAOE,OAC1BxC,EAAM+B,QAAQU,QAAQC,YACG,QADQ2C,EACjCrF,EAAM+B,QAAQU,QAAQT,WAAG,IAAAqD,GAAQ,QAARA,EAAzBA,EAA2BpD,cAAM,IAAAoD,OAAA,EAAjCA,EAAmC1C,mBAO3C,OAJIb,GAAyBD,IACzBA,EAAgB,GAAGA,KAAiBC,KAGjC,CACHd,4BAA6B,CACzB0C,IAAK,KACLC,UAAW,mCACXE,KAAM,MACNyB,SAAU,EACVjF,IAAK,EACL,aAAc,GACd,iBAAiB,GAErBY,QACIE,IAAAA,cAAC+C,EAAAA,GAAK,CACFC,eAAgBnE,EAAM+B,QAAQqC,cAAcD,eAC5CR,UAAU,0CACVgB,IAAI,6DACJN,aAAcrE,EAAM+B,QAAQU,QAAQ4B,aACpC7D,cAAkD,QAArC4E,EAAEpF,EAAMiC,OAAOqC,8BAAsB,IAAAc,EAAAA,EAAI5E,EACtD+D,oBAAoB,QACpBC,wBAAyBxE,EAAMiC,OAAOsD,oBACtCb,YAAa7C,MAuBvB2D,EAAgD,CAClD9E,UAAW,CACP+E,GAAI,CAAE9E,EAAG,6BAA8B+E,EAAG,IAAKC,EAAG,KAClDC,GAAI,CAAEjF,EAAG,6BAA8B+E,EAAG,IAAKC,EAAG,MAEtDE,UAAU,EACVC,iBAAiB,GASfC,EAAmBA,CAACC,EAA8ChG,KAEpE,MAAM,yBAAEiG,EAAwB,kCAAEC,GAAsCF,GAClE,MAAE9C,GAAUlD,EACZmG,EA/BoBC,CAAAA,GACnBA,MAAAA,OAAK,EAALA,EAAOC,KAAIC,IACP,CACHC,aAAcD,EAAKC,aACnB7E,eAAgB4E,EAAK5E,eACrBqC,QAASuC,EAAKvC,QACdY,IAAK2B,EAAK3B,IACV6B,UAAWF,EAAKE,cAwBEC,CAAqBvD,EAAMiD,mBAE/CC,EAEFlD,EAAMwD,YAAcC,EAAAA,gBAAgBC,YAAYT,IAAmD,UAA7BA,EAAkB,GAAGxB,IACrF,CAACO,EAA+BM,EAA+BxF,IAEjEmG,MAAAA,OAAiB,EAAjBA,EAAmBE,KAAI,CAACC,EAAkBtC,KACtC,GAAIsC,EAAK5E,iBAAmBmD,EAAAA,UAAU3D,MAAO,CACzC,GAAIlB,EAAMiC,OAAO4E,gBAAiB,KAAAC,EAC9B,MAAMC,EAA+B,QAAjBD,EAAGR,EAAKE,iBAAS,IAAAM,OAAA,EAAdA,EAAgB/F,UACvC,OAAIgG,EACOzF,EACHyF,EACAvB,EACAxB,EACAd,EAAMC,YACNnD,EACAsG,EAAK5E,gBAGFwD,EAA+BM,EAA+BxF,GAGzE,MAhKJgH,EAChBC,EACAC,EACA/D,EACA3C,EACAR,KAEA,MAAMwG,EAAYS,EAAUT,UAC5B,GAAIA,EAAW,KAAAW,EACX,MAAMC,EAA0BpH,EAAMiC,OAChCoF,EAAkBrH,EAAM+E,UACxBuC,EAAgC,GACtCA,EAAcC,QAAUf,EAAUxC,GAClCsD,EAAcxC,MAAQ0B,EAAU1B,MAChCwC,EAAcE,SAAWhB,EAAUiB,SAC/BjB,EAAUzF,YACVuG,EAAcI,eAAiBlB,EAAUzF,UAAU4D,KAEnC,QAApBwC,EAAIX,EAAUmB,cAAM,IAAAR,GAAhBA,EAAkBS,mBAClBN,EAAcO,sBAAwBrB,EAAUmB,OAAOC,kBAE3D,MAAME,EAA+B,CAAEV,QAAAA,EAASW,SAAUT,GAO1D,MAAO,CACHtG,4BAA6B,CACzB0C,IAAK,KACLC,UARQC,GAAAA,CACZ,mCACAsD,IAAU/D,EAAc,0CAA4C,IAOhEU,KAAM,eACNxD,IAAK6G,GAETjG,QAASE,IAAAA,cAAAA,IAAAA,SAAA,MACTD,MACIC,IAAAA,cAACD,EAAAA,GAAK,CAACyC,UAAU,2BAA2BqE,UAAW,CAAE3H,IAAKmG,EAAWrC,eAAgBnE,EAAM+B,QAAQU,UACnGtB,IAAAA,cAAC8G,EAAAA,OAAM,CACHC,WAAYJ,EACZK,SAAUnI,EAAM+B,QAAQU,QAAQ2F,OAAOD,SACvCd,gBAAiBA,MAMrC,OAAOnC,EAA+B1E,EAAeR,IAiH1BgH,CAAYV,EAAMtC,EAAId,EAAMC,YAAaqC,EAA+BxF,GAGnF,OAAOsB,EAA0BgF,EAAMd,EAA+BxB,EAAId,EAAMC,YAAanD,MAI7G,OACImB,IAAAA,cAACC,EAAAA,KAAIlB,OAAAmB,OAAA,GAAK4E,GACN9E,IAAAA,cAACC,EAAAA,KAAIlB,OAAAmB,OAAA,GAAK6E,GAAoCE,MAAAA,OAAK,EAALA,EAAOC,IAAIvF,MA2BrE,EAjB2Dd,IAEvD,MAAM,cAAEqI,EAAa,WAAEC,EAAU,aAAEC,EAAY,MAAEC,GAAUxI,EAM3D,OAJAO,EAA+B8H,GAC/B9H,EAA+B+H,GAC/B/H,EAA+BiI,GAG3BrH,IAAAA,cAACsH,EAAAA,OAAMvI,OAAAmB,OAAA,GAAKkH,GACRpH,IAAAA,cAACC,EAAAA,KAAIlB,OAAAmB,OAAA,GAAKgH,IACTG,EACAzC,EAAiBuC,EAAYtI,0mBC1V1C,MAAM0I,EAAU,CAAEC,QAAS,GAAIC,YAAa,IAmBlCC,EAA8BA,CAACC,EAAqBC,KAUlD,GADAL,EAAQE,YAAYE,GAAuBC,GACtCL,EAAQE,YAAYE,GAAqBE,QAC1C,MAAM,IAAIC,MAAM,oBAAsBH,EAAsB,mCAEhEJ,EAAQE,YAAYE,GAAqBE,QAAQE,UAAUC,eAAiBL,EACxEJ,EAAQE,YAAYE,GAAqBE,QAAQE,UAAUlF,KAC3D0E,EAAQE,YAAYF,EAAQE,YAAYE,GAAqBE,QAAQE,UAAUlF,IAAM8E,IAMhGJ,EAAQC,QAAQ,iBAAmB,CAChCS,EAAGA,IAAMC,EAAQ,KACjBC,MAAO,gBACPC,GAAI,CAAC,CAACC,KAAK,iBAAmBC,KAAK,+EAAgFC,MAAO,GAAG,CAACF,KAAK,mCAAqCC,KAAK,8FAA+FC,MAAO,GAAG,CAACF,KAAK,UAAYC,KAAK,0EAA2EC,MAAO,IAE/XC,KAAK,EACLC,GAAI,6BACJC,EAAG,gBACHC,EAAG,gBAEHC,IAAK,GAGLC,GAAI,wFAOAnB,EAF4B,+EACXQ,EAAQ,MAQzBR,EAF4B,8FACXQ,EAAQ,MAQzBR,EAF4B,0EACXQ,EAAQ,KAMjCY,OAAOC,aAAeD,OAAOC,cAAgB,GAC7CD,OAAOC,aAAavB,QAAOwB,EAAAA,EAAA,GACpBF,OAAOC,aAAavB,SAAW,IAC/BD,EAAQC,SAGXsB,OAAOC,aAAatB,YAAWuB,EAAAA,EAAA,GAC5BF,OAAOC,aAAatB,aAAe,IACnCF,EAAQE,aAEY,MAAMwB,EAAiB,GAC9BA,EAAe,uEAAyE,CAChGhB,EAAGA,IAAMC,EAAQ,MACjBgB,GAAI,qCAEpBD,EAAe,gFAAkF,CACjFhB,EAAGA,IAAMC,EAAQ,MACjBgB,GAAI,0DAEpBD,EAAe,gGAAkG,CACjGhB,EAAGA,IAAMC,EAAQ,MACjBgB,GAAI,mEAEpBJ,OAAOC,aAAeD,OAAOC,cAAgB,GAC7CD,OAAOC,aAAaE,eAAcD,EAAAA,EAAA,GACPF,OAAOC,aAAaE,gBAAkB,IACtCA,g0BCN3B,MAAM7B,UAAqBpH,EAAAA,UAgCvBmJ,YAAmBtK,GAA4C,IAAAuK,EAAAC,EAAAC,EAC3DC,MAAM1K,GAAMuK,EAAAI,KAhCC,KAAAC,kBAAiD,IAAIC,IAErD,KAAAC,2BAAqF3J,EAAAA,YACrF,KAAA4J,OAAkC5J,EAAAA,YAE3C,KAAA6J,mBAAmC,GAI1B,KAAAC,4BAA8C,CAC3DvK,UAAW,CACP+E,GAAI,CAAE9E,EAAG,kBAAmB+E,EAAG,EAAGC,EAAG,GACrCuF,GAAI,CAAEvK,EAAG,kBAAmB+E,EAAG,EAAGC,EAAG,GACrCqE,GAAI,CAAErJ,EAAG,kBAAmB+E,EAAG,EAAGC,EAAG,GACrCwF,GAAI,CAAExK,EAAG,YAAa+E,EAAG,EAAGC,EAAG,IAEnCE,UAAU,EACVC,iBAAiB,GAGJ,KAAAN,8BAAgD,CAC7D9E,UAAW,CACP+E,GAAI,CAAE9E,EAAG,YAAa+E,EAAG,IAAKC,EAAG,GACjCwF,GAAI,CAAExK,EAAG,YAAa+E,EAAG,IAAKC,EAAG,IAErCE,UAAU,EACVC,iBAAiB,GA+NJ,KAAAsF,UAAY,KACzBT,KAAKU,SAAS,CAAEC,WAAW,KAGd,KAAAC,SAAW,KACxBZ,KAAKU,SAAS,CAAEC,WAAW,KAMd,KAAAE,KAAO,KAEpB,IADAC,EAAAA,EAAAA,8BAC0BC,IAAtBf,KAAKgB,aACL,OAGJ,MAAMC,EAAYjB,KAAKgB,aAAe,EAAIhB,KAAKzH,MAAMC,YAAc,EACnEwH,KAAKkB,UAAUD,GAEfjB,KAAKmB,uBAMQ,KAAAC,SAAW,MACxBN,EAAAA,EAAAA,yBACA,MAAMO,EAASrB,KAAKzH,MAAMiD,kBACpByF,EAAYjB,KAAKsB,cAAiBD,EAASA,EAAOE,OAAS,EAAI,EAAKvB,KAAKzH,MAAMC,YAAc,EACnGwH,KAAKkB,UAAUD,GACfjB,KAAKmB,uBAGQ,KAAAD,UAAa3E,IAC1B,MAAM,SAAEiF,GAAaxB,KAAK3K,MAAMiC,OAC1BmK,EAAezB,KAAKzH,MAAMC,YAC1BkJ,EAAa1B,KAAKzH,MAAMiD,kBACD,IAADmG,EACwCC,EADpE,GAAIJ,GAAYE,EACZ,IAA0B,QAAtBC,EAAAD,EAAW,GAAGnF,YAAQ,IAAAoF,OAAA,EAAtBA,EAAwB5K,kBAAmBmD,EAAAA,UAAU3D,MAClC,QAAnBqL,EAAA5B,KAAKI,OAAOyB,eAAO,IAAAD,GAAnBA,EAAqBE,YAClB,GAAIJ,EAAW,GAAGD,KAAgB1K,iBAAmBmD,EAAAA,UAAU3D,MAAO,CAAC,IAADwL,EACtD,QAAnBA,EAAA/B,KAAKI,OAAOyB,eAAO,IAAAE,GAAnBA,EAAqBC,QAG7BhC,KAAKU,SAAS,CAAElI,YAAa+D,KA+LhB,KAAA0F,yBAA2B,CAAC3F,EAAuBC,EAAe1G,KAC/E,MAAMgG,EAAYS,EAAUT,UAC5B,GAAIA,EAAW,CAAC,IAADW,EACX,MAAMC,EAA0BuD,KAAK3K,MAAMiC,OACrCoF,EAAkBsD,KAAK3K,MAAM+E,UAC7BuC,EAAgC,GACtCA,EAAcC,QAAUf,EAAUxC,GAClCsD,EAAcxC,MAAQ0B,EAAU1B,MAChCwC,EAAcE,SAAWhB,EAAUiB,SAC/BjB,EAAUzF,YACVuG,EAAcI,eAAiBlB,EAAUzF,UAAU4D,KAEnC,QAApBwC,EAAIX,EAAUmB,cAAM,IAAAR,GAAhBA,EAAkBS,mBAClBN,EAAcO,sBAAwBrB,EAAUmB,OAAOC,kBAE3D,MAAME,EAA+B,CAAEV,QAAAA,EAASW,SAAUT,GACpDuF,EAAa,CACf7I,GAAI,GAAG2G,KAAK3K,MAAMgE,sBAAsBkD,KAE5C,OACI/F,EAAAA,cAACD,EAAAA,GAAK,CAACyC,UAAU,2BAA2BqE,UAAW,CAAE3H,IAAKmG,EAAWrC,eAAgBwG,KAAK3K,MAAM+B,QAAQU,UACxGtB,EAAAA,cAAC8G,EAAAA,OAAM/H,OAAAmB,OAAA,CACHyL,IAAKnC,KAAKI,OACV7C,WAAYJ,EACZK,SAAUwC,KAAK3K,MAAM+B,QAAQU,QAAQ2F,OAAOD,SAC5Cd,gBAAiBA,GACbwF,KAKpB,OAAOlC,KAAKoC,kBAAkBvM,IAGjB,KAAAwM,iBAAmB,SAChCzL,EACAf,EACA0G,GAAa,IACb+F,EAAAC,UAAAhB,OAAA,QAAAR,IAAAwB,UAAA,IAAAA,UAAA,GAA0B,OAE1B/L,EAAAA,cAAC+C,EAAAA,GAAKhE,OAAAmB,OAAA,CACF8C,eAAgBoG,EAAKvK,MAAM+B,QAAQqC,cAAcD,eACjDR,UAAU,0BACNpC,EAAK,CACTmD,YAAuB,IAAVwC,EAAcqD,EAAK1I,cAAgBN,EAAMoD,IACtDN,aAAckG,EAAKvK,MAAM+B,QAAQU,QAAQ4B,aACzC7D,cAAeA,EACf+D,oBAAoB,OACpBP,GAAI,GAAGuG,EAAKvK,MAAMgE,sBAAsBkD,IACxCiG,sBAAuBF,EACvBrI,oBAA+B,IAAVsC,MAIZ,KAAAkG,kBAAoB,CACjC7L,EACAf,EACA0G,EACAzF,KAOO,CACHT,4BAA6B,CACzB0C,IAAK,KACLC,UARQC,GAAAA,CACZ,mCACAnC,IAAwByF,EAAQ,0CAA4C,IAOxErD,KAAM,MACNyB,SAAU,EACVjF,IAAK6G,EACL,aAAc3F,EAAMwC,QACpB,gBAAiBtC,IAAwByF,EACzCtE,QAAS+H,KAAK0C,0BAA0BnG,GACxCjD,UAAW0G,KAAK2C,4BAA4BpG,IAEhDjG,QACIE,EAAAA,cAAC+C,EAAAA,GAAKhE,OAAAmB,OAAA,CACF8C,eAAgBwG,KAAK3K,MAAM+B,QAAQqC,cAAcD,eACjDR,UAAU,+BACNpC,EAAK,CACTmD,YAAuB,IAAVwC,EAAcyD,KAAK9I,cAAgBN,EAAMoD,IACtDN,aAAcsG,KAAK3K,MAAM+B,QAAQU,QAAQ4B,aACzC7D,cAAeA,EACf+D,oBAAoB,OACpBC,sBAAuBmG,KAAKzH,MAAMuB,wBAClCG,oBAA+B,IAAVsC,OAWpB,KAAAqG,sBAAwB,CACrCtG,EACAzG,EACA0G,EACAzF,KAEA,MAAM+L,EAAU5J,GAAAA,CACZ,mCACAnC,IAAwByF,EAAQ,0CAA4C,IAG1EV,EAAYS,EAAUT,UAC5B,IAAIjF,EASJ,OAPIA,EADAiF,MAAAA,GAAAA,EAAWzF,UACHyF,EAAUzF,UAEV,CACJ4D,IAAK,SAIN,CACH3D,4BAA6B,CACzB0C,IAAK,KACLC,UAAW6J,EACX3J,KAAM,MACNyB,SAAU,EACVjF,IAAK6G,EACL,aAAc3F,EAAMwC,QACpB,gBAAiBtC,IAAwByF,EACzCtE,QAAS+H,KAAK0C,0BAA0BnG,GACxCjD,UAAW0G,KAAK2C,4BAA4BpG,IAEhDjG,QACIE,EAAAA,cAAC+C,EAAAA,GAAKhE,OAAAmB,OAAA,CACF8C,eAAgBwG,KAAK3K,MAAM+B,QAAQqC,cAAcD,eACjDR,UAAU,+BACNpC,EAAK,CACTmD,YAAanD,EAAMoD,IACnBN,aAAcsG,KAAK3K,MAAM+B,QAAQU,QAAQ4B,aACzC7D,cAAeA,EACf+D,oBAAoB,OACpBC,sBAAuBmG,KAAKzH,MAAMuB,wBAClCG,oBAA+B,IAAVsC,OAWpB,KAAAuG,YAAevG,GAAmBwG,IAC/C/C,KAAKC,kBAAkB+C,IAAIzG,EAAOwG,IAGrB,KAAAJ,4BAA+BpG,GACpC7D,IACAA,EAAMuK,QAAUrK,EAAAA,SAASC,OAASH,EAAMuK,QAAUrK,EAAAA,SAASsK,QAC3DxK,EAAMI,iBAENkH,KAAKkB,UAAU3E,KAKV,KAAAmG,0BAA6BnG,GAClC7D,IACJA,EAAMI,iBAENkH,KAAKkB,UAAU3E,IA0LN,KAAA4G,sBAAwB,CAAC7G,EAAuBC,EAAe1G,KAC5E,MAAMgG,EAAYS,EAAUT,UAC5B,IAAIjF,EASJ,OAPIA,EADAiF,MAAAA,GAAAA,EAAWzF,UACHyF,EAAUzF,UAEV,CACJ4D,IAAK,SAKTxD,EAAAA,cAAA,OAAKwC,UAAU,yBACXxC,EAAAA,cAAC+C,EAAAA,GAAKhE,OAAAmB,OAAA,CACF8C,eAAgBwG,KAAK3K,MAAM+B,QAAQqC,cAAcD,eACjDR,UAAU,gCACNpC,EAAK,CACTmD,YAAanD,EAAMoD,IACnBN,aAAcsG,KAAK3K,MAAM+B,QAAQU,QAAQ4B,aACzC7D,cAAeA,EACf+D,oBAAoB,OACpBC,sBAAuBmG,KAAKzH,MAAMuB,wBAClCG,oBAA+B,IAAVsC,KAEzB/F,EAAAA,cAAA,OAAKwC,UAAU,wCAEXxC,EAAAA,cAAA,UACI2D,MAAO6F,KAAK3K,MAAM+E,UAAUE,oBAC5BpB,KAAK,SACLiJ,IAAKnC,KAAKG,2BACVlI,QAAS+H,KAAKoD,gBACdpK,UAAU,8CA8Db,KAAAsI,YAAc,IAAiC,IAA3BtB,KAAKzH,MAAMC,YAE/B,KAAAwI,WAAa,KAC1B,MAAMK,EAASrB,KAAKzH,MAAMiD,kBAC1B,OAAO6F,GAAUrB,KAAKzH,MAAMC,cAAgB6I,EAAOE,OAAS,GAG/C,KAAA6B,gBAAkB,KAC/BpD,KAAKqD,gBAyBQ,KAAAC,iBAAoBC,IACjC,MACI9L,MACIC,SAAWC,OAAQD,IACtB,UACD0C,GACA4F,KAAK3K,MACT,IAAImG,EAAoBwE,KAAKzH,MAAMiD,mBAE9BA,GAAqB9D,IACtB8D,EAAoB,CAACwE,KAAKwD,uBAAuB9L,KAErD,MAAM+L,EAAgB,CAClB1K,IAAK2K,EAAAA,SACL1K,UAAW,6BACXyC,MACID,GACAA,EAAkBE,KAAI,CAACC,EAAkBY,IACrCyD,KAAK2D,6BAA6BJ,EAAU5H,EAAMqE,KAAK4D,qBAAsBrH,GAAO,KAE5F/D,YAAawH,KAAKzH,MAAMC,YACxBqI,KAAMb,KAAKa,KACXO,SAAUpB,KAAKoB,SACfyC,UAAU,EACVC,kBAAmB1J,EAAU2J,8BAC7BC,kBAAmB5J,EAAU6J,0BAC7BC,yBAA0BlE,KAAKkB,UAC/BiD,uBAAuB,EACvBC,eAAe,EACfC,UAAU,EACVC,eAAgBtE,KAAKY,SACrB2D,gBAAiBvE,KAAKS,UACtB+D,wBAAyBxE,KAAKzH,MAAMkM,qBAElCC,EAAWlO,EAAAA,cAACkN,EAAAA,SAAQnO,OAAAmB,OAAA,GAAK+M,IAEzBkB,EAAyC,CAC3CC,YAAa5E,KAAKzH,MAAMqM,YACxBC,SAAU7E,KAAKqD,aACfyB,gBAAiBJ,EACjBK,WAAY9L,GAAAA,CAAW,0BAA2B,6BAEtD,OAAO+L,EAAAA,EAAAA,eAAcL,IAGjB,KAAAM,oBAAsB,IACc,YAApCjF,KAAK3K,MAAMiC,OAAO4N,cAp9BtBlF,KAAKqD,aAAerD,KAAKqD,aAAa8B,KAAKnF,MAC3CA,KAAKzH,MAAQ,CACTC,YAAa,EACbmI,WAAW,EACXyE,eAAe,EACfR,aAAa,EACbS,eAAe,EACfvL,0BAA2BkG,KAAK3K,MAAMiC,OAAOsD,qBAGjDoF,KAAK4D,qBACoE,QADhD/D,EACW,QADXC,EACrBzK,EAAMiC,OAAOgO,2BAAmB,IAAAxF,EAAAA,EAAIzK,EAAMiC,OAAOiO,4BAAoB,IAAA1F,EAAAA,EAAIG,KAAKM,4BAElFN,KAAKwF,iBAAmBxF,KAAKwF,iBAAiBL,KAAKnF,MACnDA,KAAKyF,wBAA0BzF,KAAKyF,wBAAwBN,KAAKnF,MACjEA,KAAK0F,oBAAsB1F,KAAK0F,oBAAoBP,KAAKnF,MACzDA,KAAK2F,2BAA6B3F,KAAK2F,2BAA2BR,KAAKnF,MACvEA,KAAK4F,yBAA2B5F,KAAK4F,yBAAyBT,KAAKnF,MAGhE6F,WAEH,MAAgB,QADHA,EAAAA,EAAAA,UAAS,CAAEC,QAASC,EAAAA,YAAYC,SAAU5O,QAAS4I,KAAK3K,MAAM+B,QAAQU,UAIhF,0BAAuB,IAAAmO,EAAAC,EAC1B,MAAMC,EAAsC,QAAhCF,EAAGjG,KAAK3K,MAAMiC,OAAO8O,mBAAW,IAAAH,EAAAA,EAAA,cACtCI,EAA0CrG,KAAK3K,MAAMiC,OAAO+O,wCAElE,GADArG,KAAKsG,kBAC8B,QAA/BJ,EAAClG,KAAK3K,MAAM+B,QAAQU,QAAQT,WAAG,IAAA6O,GAAQ,QAARA,EAA9BA,EAAgC5O,cAAM,IAAA4O,IAAtCA,EAAwClO,mBAC/B,gBAANmO,EACA,QAAqCpF,IAAjCf,KAAKzH,MAAMiD,mBAAmCwE,KAAK3K,MAAMoC,KAAK8O,iCAAiC5O,OAAQ,CAAC,IAAD6O,EACvG,MAAMnF,QAAeoF,EAAAA,EAAAA,IACjBzG,KAAK3K,MAAMoC,KAAK8O,iCAAiC5O,OACjDqI,KAAK3K,MAAM+B,QAAQqC,cACqB,QADR+M,EAChCxG,KAAK3K,MAAMiC,OAAOqC,8BAAsB,IAAA6M,EAAAA,EAAIxG,KAAKnF,qCAE/CmF,KAAK0G,WAAWrF,QACnB,QAAqCN,IAAjCf,KAAKzH,MAAMiD,mBAAmCwE,KAAK3K,MAAMoC,KAAKC,QAAQC,OAAQ,CAAC,IAADgP,EACrF,MAAMjP,EAAUsI,KAAK3K,MAAMoC,KAAKC,QAAQC,OAClC0J,QAAeuF,EAAAA,EAAAA,IACjBlP,EAAQmP,UACP7G,KAAK3K,MAAM+B,QAAQU,QAAQC,YAAY+O,UACxC9G,KAAK3K,MAAM+B,QAAQqC,cACqB,QADRkN,EAChC3G,KAAK3K,MAAMiC,OAAOqC,8BAAsB,IAAAgN,EAAAA,EAAI3G,KAAKnF,8BACjDnD,EAAQqP,sBAGN/G,KAAK0G,WAAWrF,cAEhBrB,KAAK0G,WAAW,IAgDlC,IA3CAM,EAAAA,EAAAA,KACI,KAAK,IAAAC,EACD,MAAMvP,EAAUsI,KAAK3K,MAAMoC,KAAKC,QAAQC,OACxC,OAAKD,EAIA2O,GAAkE,QAAvBY,EAACvP,EAAQqP,sBAAc,IAAAE,GAAtBA,EAAwBJ,SAIlE,GAAGnP,EAAQmP,YAAYnP,EAAQqP,eAAeF,WAH1C,GAAGnP,EAAQmP,WAJX,QASfK,UACI,MAAMxP,EAAUsI,KAAK3K,MAAMoC,KAAKC,QAAQC,OACxC,IAAI0J,EAAuB,GAC3B,GAAI3J,EAAS,CAAC,IAADyP,EAUFC,EATP,GAA0B,QAA1BD,EAAInH,KAAK3K,MAAM+B,QAAQC,WAAG,IAAA8P,GAAQ,QAARA,EAAtBA,EAAwB7P,cAAM,IAAA6P,GAA9BA,EAAgCnP,iBAChCqJ,QAAegG,EAAAA,EAAAA,IACX3P,EAAQmP,SACR7G,KAAKiF,uBACJjF,KAAK3K,MAAM+B,QAAQU,QAAQC,YAAY+O,UACxC9G,KAAK3K,MAAM+B,QAAQqC,cACnB/B,EAAQ4P,KACRjB,EAA0C3O,EAAQqP,oBAAiBhG,QAGvEM,QAAeuF,EAAAA,EAAAA,IACXlP,EAAQmP,UACP7G,KAAK3K,MAAM+B,QAAQU,QAAQC,YAAY+O,UACxC9G,KAAK3K,MAAM+B,QAAQqC,cACqB,QADR2N,EAChCpH,KAAK3K,MAAMiC,OAAOqC,8BAAsB,IAAAyN,EAAAA,EAAIpH,KAAKnF,8BACjDwL,EAA0C3O,EAAQqP,oBAAiBhG,SAGrEf,KAAK0G,WAAWrF,cAEhBrB,KAAK0G,WAAW,MAG9B,CAAEa,iBAAiB,IAGb,cAANpB,GAAoCnG,KAAK3K,MAAMoC,KAAK+P,eAAe7P,OAAQ,CAAC,IAAD8P,EAC3E,MAAMpG,QAAeoF,EAAAA,EAAAA,IACjBzG,KAAK3K,MAAMoC,KAAK+P,eAAe7P,OAC/BqI,KAAK3K,MAAM+B,QAAQqC,cACqB,QADRgO,EAChCzH,KAAK3K,MAAMiC,OAAOqC,8BAAsB,IAAA8N,EAAAA,EAAIzH,KAAKnF,qCAE/CmF,KAAK0G,WAAWrF,IAIvBqG,sBAAsBC,EAAkDC,GAC3E,OAAI5H,KAAKzH,QAAUqP,GAAa5H,KAAK3K,MAAMoC,OAASkQ,EAAUlQ,KAM3DoQ,SAAM,IAAAC,EAAAC,EACT,MAAM,GAAE1O,EAAE,OAAE/B,EAAM,UAAE8C,GAAc4F,KAAK3K,OAEjC,UAAE2D,EAAS,sBAAEmL,GAA0B7M,EAEvC0Q,EAAkD,aAA5B1Q,EAAO2Q,sBAE7BC,EAA+BlI,KAAK6F,YAAcvO,EAAO4E,kBAAmB,EAC5EiM,EACc,WAAhB7Q,EAAO8Q,UAAgC,SAAoC,cAAhB9Q,EAAO8Q,UAAmC,YAAuB,GAC1HjC,EAAsC,QAAhC2B,EAAG9H,KAAK3K,MAAMiC,OAAO8O,mBAAW,IAAA0B,EAAAA,EAAA,cAEtC3Q,EAAqD,QAAhC4Q,EAAG/H,KAAK3K,MAAM+B,QAAQC,IAAIC,cAAM,IAAAyQ,OAAA,EAA7BA,EAA+BxQ,qBACxB,IAAD8Q,EAAhCrI,KAAK3K,MAAMoC,KAAKC,QAAQC,SACxBqI,KAAK9I,eAAgBU,EAAAA,EAAAA,qBACjBoI,KAAK3K,MAAMoC,KAAKC,QAAQC,OAAOE,OAC/BmI,KAAK3K,MAAM+B,QAAQU,QAAQC,YACG,QADQsQ,EACtCrI,KAAK3K,MAAM+B,QAAQU,QAAQT,WAAG,IAAAgR,GAAQ,QAARA,EAA9BA,EAAgC/Q,cAAM,IAAA+Q,OAAA,EAAtCA,EAAwCrQ,mBAMhD,GAHIb,GAAyB6I,KAAK9I,gBAC9B8I,KAAK9I,cAAgB,GAAG8I,KAAK9I,iBAAiBC,KAE9C6I,KAAK3K,MAAMiC,OAAOsD,sBAAwBoF,KAAKzH,MAAMiD,mBAAqBwE,KAAKzH,MAAM8M,cAAe,CAAC,IAADiD,EACpG,IAAIjH,EAAuB,GACvBmG,EAAkC,GAC5B,gBAANrB,GAAsCnG,KAAK3K,MAAMoC,KAAK8O,iCAAiC5O,OACvF6P,EAAiBxH,KAAK3K,MAAMoC,KAAK8O,iCAAiC5O,OACrD,cAANwO,GAAoCnG,KAAK3K,MAAMoC,KAAK+P,eAAe7P,SAC1E6P,EAAiBxH,KAAK3K,MAAMoC,KAAK+P,eAAe7P,QAEpD0J,EAASmG,EAAe9L,KAAI6M,IAAgB,IAAAC,EAAAC,EACxC,MAAO,CACHzO,IAAsB,QAAnBwO,EAAED,EAAcG,WAAG,IAAAF,EAAAA,EAAI,GAC1BpP,SAASuP,EAAAA,EAAAA,GACL3I,KAAK3K,MAAM+B,QAAQqC,cAAcD,eACjCwG,KAAKiF,sBACyB,QADJwD,EAC1BzI,KAAK3K,MAAMoC,KAAKC,QAAQC,cAAM,IAAA8Q,OAAA,EAA9BA,EAAgCnB,KAChCiB,EAAcK,aAI1B,MAAMC,EAAwC,QAA3BP,EAAGtI,KAAK3K,MAAMiC,OAAO+J,cAAM,IAAAiH,EAAAA,EAAI,GAClDtI,KAAKK,mBAAqB,IAAIL,KAAK8I,8BAA8BzH,MAAYwH,GAEjF,MAAME,EAA4B/I,KAAKgJ,sBAAsBd,EAAqBC,GAC5Ec,EAAqCjJ,KAAKkJ,iCAC1CC,EAAS3J,EAAAA,EAAA,GACPQ,KAAK3K,OAA+C,IACxDkD,MAAOyH,KAAKzH,MACZqF,aAAc,CACVwL,YAAapJ,KAAK3K,MAClB2D,UAAWC,GAAAA,CAAW,qBAAoB+O,EAAa,WAAa,IAAMhP,IAE9E6E,MAAOqK,EAAsBlI,KAAKsD,iBAAiB6E,GAAgB,KACnE/P,eAAgB4H,KAAKoD,gBACrB9K,uBAAwB0H,KAAK0C,0BAC7B2G,yBAA0BrJ,KAAK2C,4BAC/BjF,cAAe,CACX3E,IAAK2K,EAAAA,SACL1K,UAAW,6BACXyC,MAAOsN,EAA0BtN,MACjCjD,YAAawH,KAAKzH,MAAMC,YACxBqI,KAAMb,KAAKa,KACXO,SAAUpB,KAAKoB,SACfyC,UAAU,EACVC,kBAAmB1J,EAAU2J,8BAC7BC,kBAAmB5J,EAAU6J,0BAC7BC,yBAA0BlE,KAAKkB,UAC/BiD,uBAAiD,IAA1BA,EACvBmF,kBAAmBlP,EAAUmP,kBAC7BjF,eAAgBtE,KAAKY,SACrB2D,gBAAiBvE,KAAKS,UACtB/K,IAAKqT,EAA0BvT,MAEnCmI,WAAY,CACRrC,yBAA0B,CAAEtC,UAAW,0CACvCuC,kCAAmC,CAC/BxC,IAAKyQ,EAAAA,oBACLxQ,UAAW,+BACXyQ,SAAUzB,EACV0B,iBAAkBtP,EAAU2J,8BAC5B4F,iBAAkBvP,EAAU6J,0BAC5B2F,SAAUvQ,EACVwQ,YAAY,EACZnU,IAAKoU,KAAKC,UAAUd,EAAmCzT,OAE3DiG,MAAOwN,EAAmCxN,SAIlD,OAAOuE,KAAK3K,MAAM2U,WAAWb,GAM1BhI,sBACHnB,KAAKU,SAAS,CAAE0E,eAAe,IAmD3B8D,iCAA8B,IAAAe,EAClC,MAAMzO,EAAgD,QAA/ByO,EAAGjK,KAAKzH,MAAMiD,yBAAiB,IAAAyO,EAAAA,EAAIjK,KAAKK,mBACzD1G,EAAyBqG,KAAK3K,MAAMiC,OAAOqC,uBAC7CA,IACAA,EAAuBwB,iBAAkB,GAK7C,IAF6Ba,EAAAA,gBAAgBC,YAAYT,GAE9B,CACvB,GAAIwE,KAAKzH,MAAMwD,WAAY,CACvB,MAAMmO,EAAa,EACnB,MAAO,CACHzO,MAAO,CAACuE,KAAKmK,uBAAuBxQ,EAAwBuQ,EAAYlK,KAAKzH,MAAMC,cACnFhD,KAAM,CAAC,UAGf,MAAO,CAAEiG,MAAO,GAAIjG,KAAM,IAG9B,MAAO,CACHiG,MAAO,IAEAD,EAAmBE,KAAI,CAACC,EAAkBY,IACrCZ,EAAK5E,iBAAmBmD,EAAAA,UAAU3D,MAC3ByJ,KAAK4C,sBACRjH,EACAhC,MAAAA,EAAAA,EAA0BqG,KAAKnF,8BAC/B0B,EACAyD,KAAKzH,MAAMC,aAGRwH,KAAKyC,kBACR9G,EACAhC,MAAAA,EAAAA,EAA0BqG,KAAKnF,8BAC/B0B,EACAyD,KAAKzH,MAAMC,gBAM3BhD,KAAM,IAAIgG,EAAmBE,KAAIC,GAAQA,EAAK3B,QAI9CgP,sBAAsBd,EAA8BC,GAAoB,IAAAiC,EAC5E,MAAM5O,EAAgD,QAA/B4O,EAAGpK,KAAKzH,MAAMiD,yBAAiB,IAAA4O,EAAAA,EAAIpK,KAAKK,mBACzDkF,EAAuBvF,KAAK3K,MAAMiC,OAAOiO,qBAC3CA,IACAA,EAAqBpK,iBAAkB,GAG3C,MAAMkP,EAAWnC,EAAsB,aAAeC,EAItD,OAF6BnM,EAAAA,gBAAgBC,YAAYT,GASlD,CACHC,MAAO,IAEAD,EAAmBE,KAAI,CAACC,EAAkBY,IAClCyD,KAAK2D,6BACR0G,EACA1O,EACA4J,MAAAA,EAAAA,EAAwBvF,KAAKM,4BAC7B/D,MAKZ/G,KAAM,IAAIgG,EAAmBE,KAAIC,GAAQA,EAAK3B,QAnB1CgG,KAAKzH,MAAMwD,WACJ,CAAEN,MAAO,CAACuE,KAAKoC,kBAAkBmD,IAAwB/P,KAAM,CAAC,UAEpE,CAAEiG,MAAO,GAAIjG,KAAM,IAoB1B,iBAAiB6L,GACrB,MAAMiJ,EAAetK,KAAK3K,MAAMiC,OAAO+J,QAAU,GAC3CkJ,EAA2BvK,KAAK8I,8BAA8BzH,GAE/DmJ,QAAQC,IACTF,EAAW7O,KAAIwL,MAAAA,IACX,GAAI5K,EAAUvF,iBAAmBmD,EAAAA,UAAU3D,OAAS+F,EAAUtC,IAC1D,IACI,MACM4C,EADM,IAAI8N,IAAIpO,EAAUtC,KACV2Q,aAAaC,IAAI,QACjChO,IACAN,EAAUT,gBAAkBgP,EAAAA,EAAAA,IAAwBjO,EAASoD,KAAK3K,MAAM+B,QAAQqC,gBAEtF,MAAOqR,GACD9K,KAAK3K,MAAM0V,WACX/K,KAAK3K,MAAM0V,UAAUC,MAAM,gCAIvC,OAAO1O,MAEb2O,MAAK3O,IACH,MAAMoF,EAAapF,EAAU4O,QAAOC,GAE5BA,EAAQpU,iBAAmBmD,EAAAA,UAAU3D,OACpC4U,EAAQpU,iBAAmBmD,EAAAA,UAAU3D,YAA+BwK,IAAtBoK,EAAQtP,YAI/DmE,KAAKU,SAAS,CACVlF,kBAAmB,IAAIkG,KAAe4I,GACtC9R,YAAa,EACbuD,WAAYqP,KAAKC,MACjBvR,yBAAyB,OAIjCkG,KAAKU,SAAS,CACVlF,kBAAmB,IAAI+O,KAAeD,GACtC9R,YAAa,EACbuD,WAAYqP,KAAKC,MACjBvR,yBAAyB,IAIzBwM,iBACJtG,KAAKU,SAAS,CACV2E,eAAe,IAIf1B,6BACJ0G,EACAiB,EACAzV,EACA0G,GAC0B,IAA1B+F,EAAAC,UAAAhB,OAAA,QAAAR,IAAAwB,UAAA,IAAAA,UAAA,GAEA,GAAI+I,EAAMvU,iBAAmBmD,EAAAA,UAAU3D,MACnC,OAAI+L,GAA0B,eAAb+H,EACN7T,EAAAA,cAAAA,EAAAA,SAAA,KAAGwJ,KAAKiC,yBAAyBqJ,EAAO/O,EAAO1G,IAEnDW,EAAAA,cAAAA,EAAAA,SAAA,KAAGwJ,KAAKmD,sBAAsBmI,EAAO/O,EAAO1G,IAEnD,GAAImK,KAAK6F,WACL,OAAIvD,EACOtC,KAAKuL,8BAA8BD,EAAOtL,KAAK4D,qBAAsBrH,GAEzEyD,KAAKwL,6BAA6BF,EAAOzV,EAAe0G,GAGnE,OAAQ8N,GACJ,IAAK,YACD,OAAOrK,KAAKuL,8BAA8BD,EAAOtL,KAAK4D,qBAAsBrH,GAEhF,IAAK,SACD,OAAOyD,KAAKyL,yBAAyBH,EAAOtL,KAAK4D,qBAAsBrH,GAE3E,IAAK,aACD,OAAOyD,KAAKwL,6BAA6BF,EAAOzV,EAAe0G,GAKvE,OAAO/F,EAAAA,cAAAA,EAAAA,SAAA,KAAGwJ,KAAKqC,iBAAiBiJ,EAAOzV,EAAe0G,EAAO+F,IAI7DwG,8BAA8BzH,GAAqB,IAAAqK,EAAAC,EAAAC,EAAAC,EACvD,MAAMC,EAAmF,QAA5DJ,EAAG1L,KAAK3K,MAAMiC,OAAOyU,+CAAuC,IAAAL,GAAAA,EACzF,IAAIM,EAAgB3K,MAAAA,EAAAA,EAAU,GAC9B,MAAM4K,GACDC,EAAAA,iBAAiBC,kBAAgD,QAA/BR,EAAC3L,KAAK3K,MAAMoC,KAAKC,QAAQC,cAAM,IAAAgU,OAAA,EAA9BA,EAAgCS,mBACnEF,EAAAA,iBAAiBC,kBAAgD,QAA/BP,EAAC5L,KAAK3K,MAAMoC,KAAKC,QAAQC,cAAM,IAAAiU,OAAA,EAA9BA,EAAgC7E,gBAClEsF,EAAuC,QAAjCR,EAAG7L,KAAK3K,MAAMoC,KAAKC,QAAQC,cAAM,IAAAkU,OAAA,EAA9BA,EAAgChU,OAU/C,OATIiU,GAA2BG,GAAoBI,IAC/CL,EAAgBA,EAAcd,QAAOvP,IAAO,IAAA2Q,EAExC,QAD8D,QAA5BA,EAAG3Q,EAAK4Q,4BAAoB,IAAAD,OAAA,EAAzBA,EAA2BE,iCAG/DxQ,EAAAA,gBAAgBC,YAAY+P,KAC7BA,EAAgB3K,MAAAA,EAAAA,EAAU,KAG3B2K,EAiLHP,yBAAyB7U,EAAmBf,EAA+B0G,GAAa,IAAAkQ,EAC5F,OACIjW,EAAAA,cAAA,OACIwC,UAAW,mBAAkBgH,KAAKzH,MAAM6M,cAAgB,SAAW,IACnEjD,IAAKnC,KAAK8C,YAAYvG,GAAM,aACW,QADXkQ,EAChBzM,KAAK3K,MAAMiC,OAAOoV,iBAAS,IAAAD,EAAAA,EAAIE,EAAAA,kBAE3CnW,EAAAA,cAAC+C,EAAAA,GAAKhE,OAAAmB,OAAA,CACF8C,eAAgBwG,KAAK3K,MAAM+B,QAAQqC,cAAcD,eACjDR,UAAU,0BACNpC,EAAK,CACTmD,YAAuB,IAAVwC,EAAcyD,KAAK9I,cAAgBN,EAAMoD,IACtDN,aAAcsG,KAAK3K,MAAM+B,QAAQU,QAAQ4B,aACzC7D,cAAeA,EACf+D,oBAAoB,OACpB3B,QAAS+H,KAAK0F,oBACdkH,YAAc5M,KAAKzH,MAAM6M,eAAiBpF,KAAKyF,8BAA4B1E,EAC3E1H,GAAI,GAAG2G,KAAK3K,MAAMgE,sBAAsBkD,IACxCiG,uBAAqB,EACrB3I,sBAAuBmG,KAAKzH,MAAMuB,0BAA4BkG,KAAK3K,MAAMiC,OAAO4E,gBAChFjC,oBAA+B,IAAVsC,KAEzB/F,EAAAA,cAAC+C,EAAAA,GAAKhE,OAAAmB,OAAA,CACFwC,KAAK,eACLM,eAAgBwG,KAAK3K,MAAM+B,QAAQqC,cAAcD,eACjDR,UAAU,6BACNpC,EAAK,CACTmD,YAAuB,IAAVwC,EAAcyD,KAAK9I,cAAgBN,EAAMoD,IACtD/B,QAAS+H,KAAKwF,iBACd9L,aAAcsG,KAAK3K,MAAM+B,QAAQU,QAAQ4B,aACzC7D,cAAeA,EACf+D,oBAAoB,OACpBP,GAAI,GAAG2G,KAAK3K,MAAMgE,aAAakD,IAC/BsQ,YAAc7M,KAAKzH,MAAM6M,eAAiB0H,EAAAA,iCAA+B/L,EACzEyB,uBAAqB,EACrB3I,sBAAuBmG,KAAKzH,MAAMuB,0BAA4BkG,KAAK3K,MAAMiC,OAAO4E,gBAChFjC,oBAA+B,IAAVsC,MAM7BkJ,wBAAwB/M,GAAyC,IAAAqU,GACrEC,EAAAA,EAAAA,wBAAuBtU,EAAkC,QAA7BqU,EAAE/M,KAAK3K,MAAMiC,OAAOoV,iBAAS,IAAAK,EAAAA,EAAIE,OAAON,EAAAA,mBAGhEO,kCAAkCxU,GACtC,MAAMyU,EAASnN,KAAKzH,MAAMuB,wBAA2BpB,EAAMyU,OAA8BzU,EAAM0U,cACzFC,EAA+B,uBACrC,GAAKrN,KAAKzH,MAAMkM,oBAiBZ0I,EAAOG,MAAMC,UAAY,GACzBJ,EAAOK,UAAUC,OAAOJ,GACxBF,EAAOO,cAAeJ,MAAMK,SAAW,GACvC3N,KAAKU,SAAS,CACV+D,qBAAqB,QArBQ,CAAC,IAADmJ,EACjC,MAAMC,EAASV,EAAOW,wBAChBpB,EAAYqB,OAAkC,QAA5BH,EAAC5N,KAAK3K,MAAMiC,OAAOoV,iBAAS,IAAAkB,EAAAA,EAAIjB,EAAAA,kBAElDqB,EAAYtV,EAAMuV,QAAUJ,EAAOK,KACnCC,EAAYzV,EAAM0V,QAAUP,EAAOQ,IACnCC,EAAkBN,EAAYtB,EAC9B6B,EAAkBJ,EAAYzB,EAEpCS,EAAOG,MAAMC,UAAY,SAASb,KAClCS,EAAOK,UAAUgB,IAAInB,GACrBF,EAAOO,cAAeJ,MAAMK,SAAW,OACvCR,EAAOO,cAAee,SAASH,EAAkBN,EAAWO,EAAkBJ,GAC9EnO,KAAKU,SAAS,CACV+D,qBAAqB,KAYzBiB,oBAAoBhN,GAAyC,IAAAgW,EAC7DpP,OAAOqP,YAAc,IAErB3O,KAAKkN,kCAAkCxU,KAG3CkW,EAAAA,EAAAA,qBAAoBlW,EAAkC,QAA7BgW,EAAE1O,KAAK3K,MAAMiC,OAAOoV,iBAAS,IAAAgC,EAAAA,EAAIzB,OAAON,EAAAA,mBACjE3M,KAAKU,SAAS,CACV0E,eAAe,KAIfI,iBAAiB9M,IACrBmW,EAAAA,EAAAA,2BAA0BnW,GAC1BsH,KAAKU,SAAS,CACV0E,eAAe,IAIfO,2BAA2BjN,GAC3B4G,OAAOqP,YAAc,IAErB3O,KAAKkN,kCAAkCxU,KAI3CoW,EAAAA,EAAAA,qBAAoBpW,GAEpBsH,KAAKU,SAAS,CACV0E,eAAe,KAIfQ,yBAAyBlN,IAC7BqW,EAAAA,EAAAA,yBAAwBrW,GAExBsH,KAAKU,SAAS,CACV0E,eAAe,IAIfmG,8BAA8B3U,EAAmBf,EAA+B0G,GAAa,IAAAyS,EACjG,OACIxY,EAAAA,cAAA,OAAKwC,UAAU,+BACXxC,EAAAA,cAAA,oBAC2C,QAD3CwY,EACgBhP,KAAK3K,MAAMiC,OAAOoV,iBAAS,IAAAsC,EAAAA,EAAIrC,EAAAA,iBAC3C3T,UAAU,8BACVE,KAAK,eACL+V,WAAYjP,KAAK4F,yBACjB3N,QAAS+H,KAAK4F,yBACdiH,YAAc7M,KAAKzH,MAAM6M,eAAiB8J,EAAAA,+BAA6BnO,IAE3EvK,EAAAA,cAAC+C,EAAAA,GAAKhE,OAAAmB,OAAA,CACF8C,eAAgBwG,KAAK3K,MAAM+B,QAAQqC,cAAcD,eACjDR,UAAU,0BACNpC,EAAK,CACTmD,YAAuB,IAAVwC,EAAcyD,KAAK9I,cAAgBN,EAAMoD,IACtDN,aAAcsG,KAAK3K,MAAM+B,QAAQU,QAAQ4B,aACzCzB,QAAS+H,KAAK2F,2BACd9P,cAAeA,EACf+D,oBAAoB,OACpBgT,YAAc5M,KAAKzH,MAAM6M,eAAiB+J,EAAAA,gCAA8BpO,EACxE1H,GAAI,GAAG2G,KAAK3K,MAAMgE,sBAAsBkD,IACxCiG,uBAAqB,EACrB3I,sBAAuBmG,KAAKzH,MAAMuB,0BAA4BkG,KAAK3K,MAAMiC,OAAO4E,gBAChFjC,oBAA+B,IAAVsC,MAM7BiP,6BAA6B5U,EAAmBf,EAA+B0G,GACnF,OACI/F,EAAAA,cAAA,OAAKwC,UAAU,yBACXxC,EAAAA,cAAC+C,EAAAA,GAAKhE,OAAAmB,OAAA,CACF8C,eAAgBwG,KAAK3K,MAAM+B,QAAQqC,cAAcD,eACjDR,UAAU,0BACNpC,EAAK,CACTmD,YAAuB,IAAVwC,EAAcyD,KAAK9I,cAAgBN,EAAMoD,IACtDN,aAAcsG,KAAK3K,MAAM+B,QAAQU,QAAQ4B,aACzC7D,cAAeA,EACf+D,oBAAoB,OACpBC,sBAAuBmG,KAAKzH,MAAMuB,wBAClCG,oBAA+B,IAAVsC,KAEzB/F,EAAAA,cAAA,OAAKwC,UAAU,kCAEXxC,EAAAA,cAAA,KACI4Y,KAAK,sBACLjV,MAAO6F,KAAK3K,MAAM+E,UAAUE,oBAC5BpB,KAAK,SACLiJ,IAAKnC,KAAKG,2BACVlI,QAAS+H,KAAKoD,gBACdpK,UAAU,mDAoDtBwK,uBAAuB9L,GAAsB,IAAA2X,EACjD,MAAO,CACHrV,IAA4B,QAAzBqV,EAAE3X,EAAQ4X,uBAAe,IAAAD,EAAAA,EAAI,IAIhCjN,kBAAkBvM,GACtB,OACIW,EAAAA,cAAA,OAAKwC,UAAU,0BACXxC,EAAAA,cAAC+C,EAAAA,GAAK,CACFC,eAAgBwG,KAAK3K,MAAM+B,QAAQqC,cAAcD,eACjDR,UAAU,gCACVgB,IAAI,QACJN,aAAcsG,KAAK3K,MAAM+B,QAAQU,QAAQ4B,aACzC7D,cAAeA,MAAAA,EAAAA,EAAiBmK,KAAKM,4BACrC1G,oBAAoB,WAM5BuQ,uBACJtU,EACA0G,EACAzF,GAMA,MAAO,CACHT,4BAA6B,CACzB0C,IAAK,KACLC,UAPQC,GAAAA,CACZ,mCACAnC,IAAwByF,EAAQ,0CAA4C,IAMxErD,KAAM,MACNyB,SAAU,EACVjF,IAAK,QACL,aAAc,GACd,gBAAiBoB,IAAwByF,EACzCtE,QAAS+H,KAAK0C,0BAA0BnG,GACxCjD,UAAW0G,KAAK2C,4BAA4BpG,IAEhDjG,QACIE,EAAAA,cAAC+C,EAAAA,GAAK,CACFC,eAAgBwG,KAAK3K,MAAM+B,QAAQqC,cAAcD,eACjDR,UAAU,0CACVgB,IAAI,QACJN,aAAcsG,KAAK3K,MAAM+B,QAAQU,QAAQ4B,aACzC7D,cAAeA,MAAAA,EAAAA,EAAiBmK,KAAKnF,8BACrCjB,oBAAoB,WAiB5ByJ,eACJ,GAAIrD,KAAKzH,MAAMqM,YAAa,CAAC,IAAD2K,EACe,QAAvCA,EAAAvP,KAAKG,2BAA2B0B,eAAO,IAAA0N,GAAvCA,EAAyCC,QACzC,MAAMC,EAAYzP,KAAKC,kBAAkB2K,IAAI5K,KAAKzH,MAAMC,aACxD,GAAIiX,GAAaA,EAAUC,UAAYD,EAAUC,SAASnO,QAAU,EAAG,CACnE,MAAM3K,EAAQ6Y,EAAUC,SAAS,GAAGC,cAAc,OAC9C/Y,GACAA,EAAMgZ,gBAAgB,SAG9B5P,KAAKU,SAAS,CACV0E,eAAe,IAGvBpF,KAAKU,SAAS,CACV0E,eAAe,EACfR,aAAc5E,KAAKzH,MAAMqM,eAE7B9D,EAAAA,EAAAA,0BACA+O,EAAAA,EAAAA,6BAyDR,+ECvlCA,MAYMC,EAAqBzU,IACvB,MAAM,yBAAEC,EAAwB,kCAAEC,EAAiC,MAAEE,GAAUJ,EAE/E,OACI7E,EAAAA,cAACC,EAAAA,KAAIlB,OAAAmB,OAAA,GAAK4E,GACN9E,EAAAA,cAACC,EAAAA,KAAIlB,OAAAmB,OAAA,GAAK6E,GAAoCE,GAASA,EAAMC,IAAIqU,MAKvEA,EAAwB3Z,IAC1B,MAAM,4BAAEC,EAA2B,QAAEC,GAAYF,EAEjD,OAAOI,EAAAA,cAACC,EAAAA,KAAIlB,OAAAmB,OAAA,GAAKL,GAA8BC,IAGnD,EA5B2DjB,IACvD,MAAM,cAAEqI,EAAa,WAAEC,EAAU,aAAEC,EAAY,MAAEC,GAAUxI,EAE3D,OACImB,EAAAA,cAACsH,EAAAA,OAAMvI,OAAAmB,OAAA,GAAKkH,GACRpH,EAAAA,cAACC,EAAAA,KAAIlB,OAAAmB,OAAA,GAAKgH,IACTG,EACAiS,EAAkBnS,oBCVxB,IAAKzD,EA+BL,SAASyO,EACZvR,EACA6N,EACA+K,EACAC,GAAqB,IAAAC,EAErB,OAAK9Y,MAAAA,GAAY,QAAL8Y,EAAP9Y,EAASC,WAAG,IAAA6Y,GAAQ,QAARA,EAAZA,EAAc5Y,cAAM,IAAA4Y,GAApBA,EAAsBlY,kBAGvBiN,EACOgL,EAHAD,2BAtCf,SAAY9V,GAIRA,EAAAA,EAAA,eAIAA,EAAAA,EAAA,iBAIAA,EAAAA,EAAA,iBAIAA,EAAAA,EAAA,eAhBJ,CAAYA,IAAAA,EAAS,iHCerBgN,eAAeiJ,EAA2B5H,GACtC,MAAM6H,EAAwB,CAC1BpW,IAAKuO,EAAcG,KAAO,GAC1BtP,QAASmP,EAAcK,SAAW,IAMtC,OAJIL,EAAc8H,+BACdD,EAAU7D,qBAAuB,CAAEC,6BAA8B,SAG/C,KAAlB4D,EAAUpW,IACH,CAACoW,GAAW,GAGhB,IAAI5F,SAA+B8F,IACtC,IACI,MAAMC,EAAO,IAAIC,eACjBD,EAAKE,KAAK,OAAQL,EAAUpW,KAAM,GAElCuW,EAAKG,iBAAiB,QAAQ,KAC1BJ,EAAQ,CAACF,EAA2B,MAAhBG,EAAKI,QAAkC,MAAhBJ,EAAKI,YAGpDJ,EAAKG,iBAAiB,SAAS,KAC3BJ,EAAQ,CAACF,GAAW,OAGxBG,EAAKK,OACP,MAAAC,GACEP,EAAQ,CAACF,GAAW,QAKzBlJ,eAAeN,EAClBkK,EACAhK,EACArN,EACA5D,EACAkb,GAEA,MAAMC,GAAYC,EAAAA,EAAAA,IAAaxX,EAAcD,gBACvC0X,EAAc,IAAIC,EAAAA,sCAAsCL,EAAWhK,EAAWiK,EAAiBC,GAErG,OAAOI,EAAAA,EAAAA,qCAAoCF,EAAazX,GACnDwR,MAAKzD,GACEA,EACOgD,QAAQC,IAAIjD,EAAe9L,KAAI6M,GAAiB4H,EAA2B5H,MAAiB0C,MAAKoG,GAC7FA,EAAMnG,QAAOoG,GAAQA,EAAK,KAAI5V,KAAI4V,GAAQA,EAAK,OAIvD,KAEVC,OAAMzG,IACHrR,EAAcsR,UAAUyG,UAAU1G,GAClCrR,EAAcsR,UAAUC,MAAM,sDACvB,MAeZ9D,eAAeG,EAClByJ,EACA7L,EACA6B,EACArN,EACAuW,EACAe,GAA+B,IAAAU,EAE/B,MAAMT,GAAYC,EAAAA,EAAAA,IAAaxX,EAAcD,gBAC7C,GAAgC,QAAhCiY,EAAIhY,EAAcD,sBAAc,IAAAiY,GAAQ,QAARA,EAA5BA,EAA8BhU,cAAM,IAAAgU,GAApCA,EAAsCC,UAAW,CACjD,MAAMC,QAAiBC,EAAAA,EAAAA,IAAmBnY,EAAcD,eAAgB,iCAAkC,OAAQ,CAC9GsX,UAAWA,EACXhK,UAAWA,EACXkK,UAAWA,IAEf,GAAwB,MAApBW,EAAShB,OAET,OADAlX,EAAcsR,UAAUC,MAAM,2EACvB,GAEX,MAAM6G,EAAmBF,MAAAA,OAAQ,EAARA,EAAUla,KACnC,OAAIoa,EACOA,EAAiBnW,KAAI6M,IAAgB,IAAAC,EACxC,MAAO,CACHxO,IAAsB,QAAnBwO,EAAED,EAAcG,WAAG,IAAAF,EAAAA,EAAI,GAC1BpP,SAASuP,EAAAA,EAAAA,GAAWlP,EAAcD,eAAgByL,EAAqB+K,EAAazH,EAAcK,SAClGhN,aAAc2M,EAAcuJ,aAC5B/a,eAAgBwR,EAAcwJ,eAC9BxF,qBAAsBhE,EAAc8H,6BAC9B,CACI7D,6BAA8B,aAElCzL,MAIX,GAEX,MAAMmQ,EAAc,IAAIC,EAAAA,sCAAsCL,EAAWhK,EAAWiK,EAAiBC,GACrG,OAAOI,EAAAA,EAAAA,qCAAoCF,EAAazX,GACnDwR,MAAKzD,GACEA,EACOA,EAAe9L,KAAI6M,IAAgB,IAAAyJ,EACtC,MAAO,CACHhY,IAAsB,QAAnBgY,EAAEzJ,EAAcG,WAAG,IAAAsJ,EAAAA,EAAI,GAC1B5Y,SAASuP,EAAAA,EAAAA,GAAWlP,EAAcD,eAAgByL,EAAqB+K,EAAazH,EAAcK,SAClGhN,aAAc2M,EAAcuJ,aAC5B/a,eAAgBwR,EAAcwJ,eAC9BxF,qBAAsBhE,EAAc8H,6BAC9B,CACI7D,6BAA8B,aAElCzL,MAIX,KAEVwQ,OAAMzG,IACHrR,EAAcsR,UAAUyG,UAAU1G,GAClCrR,EAAcsR,UAAUC,MAAM,sDACvB,MAIZ9D,eAAeT,EAClBe,EACA/N,EACA5D,GAEA,OAAO2U,QAAQC,IAAIjD,EAAe9L,KAAI6M,GAAiB4H,EAA2B5H,MAC7E0C,MAAKoG,GACKA,EAAMnG,QAAOoG,GAAQA,EAAK,KAAI5V,KAAI4V,GAAQA,EAAK,OAEzDC,OAAMzG,IACHrR,EAAcsR,UAAUyG,UAAU1G,GAClCrR,EAAcsR,UAAUC,MAAM,qCACvB,MAUZ9D,eAAe2D,EAAwBjO,EAAiBnD,GAC3D,IAAI0D,EACJ,GAAIP,EAAS,CACT,MAAM+U,QAAiBM,EAAAA,EAAAA,IAA6BxY,EAAcD,eAAgB,CAACoD,IAEnF,GAAwB,MAApB+U,EAAShB,OAET,YADAlX,EAAcsR,UAAUC,MAAM,6CAA6CpO,KAI/E,MAAMf,EAAY8V,EAASla,KACvBoE,GAAaG,EAAAA,gBAAgBC,YAAYJ,KACzCsB,EAAkBtB,EAAU,IAGpC,OAAOsB,kICtKX,MAAMhH,EAAuBC,IAEzB,MAAM,4BAAEC,EAA2B,QAAEC,EAAO,MAAEC,GAAUH,EAExD,OAAOI,IAAAA,cAACC,EAAAA,KAAIlB,OAAAmB,OAAA,GAAKL,GAA8BE,GAAgBD,IAY7DK,EAA4BA,CAC9BC,EACAf,EACAgB,EACAC,EACAzB,EACA0B,KACqC,IAAAC,EAAAC,EACrC,IAAIC,EAAoC,GAExC,MAAMC,EAAgD,QAA3BH,EAAG3B,EAAM+B,QAAQC,IAAIC,cAAM,IAAAN,OAAA,EAAxBA,EAA0BO,qBACxB,IAADC,EAA3BnC,EAAMoC,KAAKC,QAAQC,SACnBT,GAAgBU,EAAAA,EAAAA,qBACZvC,EAAMoC,KAAKC,QAAQC,OAAOE,OAC1BxC,EAAM+B,QAAQU,QAAQC,YACG,QADQP,EACjCnC,EAAM+B,QAAQU,QAAQT,WAAG,IAAAG,GAAQ,QAARA,EAAzBA,EAA2BF,cAAM,IAAAE,OAAA,EAAjCA,EAAmCQ,mBAGvCb,GAAyBD,IACzBA,EAAgB,GAAGA,KAAiBC,KAMxC,MAAMc,EAAUA,KAAK,IAAAC,EAAAC,EACG,QAApBD,EAAA7C,EAAM+C,sBAAc,IAAAF,GAApBA,EAAAG,KAAAhD,GAC4B,QAA5B8C,EAAA9C,EAAMiD,8BAAsB,IAAAH,GAA5BA,EAAAE,KAAAhD,EAA+BwB,GAC/BxB,EAAMkD,MAAMC,YAAc3B,GAYxB4B,EAAiBC,IACfA,EAAMC,UAAYC,EAAAA,SAASC,QAC3BH,EAAMI,iBACNb,MAIR,MAAO,CACH5B,4BAA6B,CACzB0C,IAAK,KACLC,UAnBQC,GAAAA,CACZ,mCACAnC,IAAwBD,EAAU,0CAA4C,IAkB1EqC,KAAM,eACNxD,IAAKmB,GAETP,QACIE,IAAAA,cAACC,EAAAA,KAAI,CAACuC,UAAU,yBACZxC,IAAAA,cAAC2C,EAAAA,OAAM,CACHD,KAAK,MAAK,aACEtC,EAAMwC,QAAO,gBACVtC,IAAwBD,EAAO,gBAC/B,GAAGxB,EAAMgE,sBAAsBxC,IAC9CmC,UAAU,sCACVf,QAASA,EACTqB,UAAWb,GAEXjC,IAAAA,cAAC+C,EAAAA,GAAKhE,OAAAmB,OAAA,CACF8C,eAAgBnE,EAAM+B,QAAQqC,cAAcD,eAC5CR,UAAU,+BACNpC,EAAK,CACT8C,aAAcrE,EAAM+B,QAAQU,QAAQ4B,aACpC7D,cAAkD,QAArCoB,EAAE5B,EAAMiC,OAAOqC,8BAAsB,IAAA1C,EAAAA,EAAIpB,EACtD+D,oBAAoB,OACpBC,sBAAuBxE,EAAMkD,MAAMuB,wBACnCC,YA3BC,IA2BYlD,EAA2BK,EAAgBN,EAAMoD,IAC9DC,oBA5BC,IA4BoBpD,MAG7BL,IAAAA,cAACC,EAAAA,KAAI,CACDuC,UACIjC,IAAmBmD,EAAAA,UAAU3D,MAAQ,uCAAyC,kCAGlFC,IAAAA,cAAC2C,EAAAA,OAAM,CACHG,UAAWb,EACX0B,MACIpD,IAAmBmD,EAAAA,UAAU3D,MAAQlB,EAAM+E,UAAUC,mBAAqBhF,EAAM+E,UAAUE,oBAE9FpB,KAAK,SACLF,UACIjC,IAAmBmD,EAAAA,UAAU3D,MACvB,yCACA,+CAEV0B,QAASA,QAyE3BsC,EAAiCA,CACnC1E,EACAR,KACqC,IAAAmF,EAAAC,EACrC,IAAIvD,EAAoC,GAExC,MAAMC,EAAgD,QAA3BqD,EAAGnF,EAAM+B,QAAQC,IAAIC,cAAM,IAAAkD,OAAA,EAAxBA,EAA0BjD,qBAExB,IAADmD,EAA3BrF,EAAMoC,KAAKC,QAAQC,SACnBT,GAAgBU,EAAAA,EAAAA,qBACZvC,EAAMoC,KAAKC,QAAQC,OAAOE,OAC1BxC,EAAM+B,QAAQU,QAAQC,YACG,QADQ2C,EACjCrF,EAAM+B,QAAQU,QAAQT,WAAG,IAAAqD,GAAQ,QAARA,EAAzBA,EAA2BpD,cAAM,IAAAoD,OAAA,EAAjCA,EAAmC1C,mBAO3C,OAJIb,GAAyBD,IACzBA,EAAgB,GAAGA,KAAiBC,KAGjC,CACHd,4BAA6B,CACzB0C,IAAK,KACLC,UAAW,mCACXE,KAAM,MACNyB,SAAU,EACVjF,IAAK,EACL,aAAc,GACd,iBAAiB,GAErBY,QACIE,IAAAA,cAAC+C,EAAAA,GAAK,CACFC,eAAgBnE,EAAM+B,QAAQqC,cAAcD,eAC5CR,UAAU,0CACVgB,IAAI,QACJN,aAAcrE,EAAM+B,QAAQU,QAAQ4B,aACpC7D,cAAkD,QAArC4E,EAAEpF,EAAMiC,OAAOqC,8BAAsB,IAAAc,EAAAA,EAAI5E,EACtD+D,oBAAoB,QACpBC,wBAAyBxE,EAAMiC,OAAOsD,oBACtCb,YAAa7C,MAuBvB2D,EAAgD,CAClD9E,UAAW,CACP+E,GAAI,CAAE9E,EAAG,6BAA8B+E,EAAG,IAAKC,EAAG,KAClDC,GAAI,CAAEjF,EAAG,6BAA8B+E,EAAG,IAAKC,EAAG,MAEtDE,UAAU,EACVC,iBAAiB,GASfC,EAAmBA,CAACC,EAA8ChG,KAEpE,MAAM,yBAAEiG,EAAwB,kCAAEC,GAAsCF,GAClE,MAAE9C,GAAUlD,EACZmG,EA/BoBC,CAAAA,GACnBA,MAAAA,OAAK,EAALA,EAAOC,KAAIC,IACP,CACHC,aAAcD,EAAKC,aACnB7E,eAAgB4E,EAAK5E,eACrBqC,QAASuC,EAAKvC,QACdY,IAAK2B,EAAK3B,IACV6B,UAAWF,EAAKE,cAwBEC,CAAqBvD,EAAMiD,mBAE/CC,EAEFlD,EAAMwD,YAAcC,EAAAA,gBAAgBC,YAAYT,IAAmD,UAA7BA,EAAkB,GAAGxB,IACrF,CAACO,EAA+BM,EAA+BxF,IAE/DmG,MAAAA,OAAiB,EAAjBA,EAAmBE,KAAI,CAACC,EAAkBtC,KACtC,GAAIsC,EAAK5E,iBAAmBmD,EAAAA,UAAU3D,MAAO,CACzC,GAAIlB,EAAMiC,OAAO4E,gBAAiB,CAAC,IAADC,EAC9B,MAAMC,EAA+B,QAAjBD,EAAGR,EAAKE,iBAAS,IAAAM,OAAA,EAAdA,EAAgB/F,UACvC,OAAIgG,EACOzF,EACHyF,EACAvB,EACAxB,EACAd,EAAMC,YACNnD,EACAsG,EAAK5E,gBAGFwD,EAA+BM,EAA+BxF,GAGzE,MAhKNgH,EAChBC,EACAC,EACA/D,EACA3C,EACAR,KAEA,MAAMwG,EAAYS,EAAUT,UAC5B,GAAIA,EAAW,CAAC,IAADW,EACX,MAAMC,EAA0BpH,EAAMiC,OAChCoF,EAAkBrH,EAAM+E,UACxBuC,EAAgC,GACtCA,EAAcC,QAAUf,EAAUxC,GAClCsD,EAAcxC,MAAQ0B,EAAU1B,MAChCwC,EAAcE,SAAWhB,EAAUiB,SAC/BjB,EAAUzF,YACVuG,EAAcI,eAAiBlB,EAAUzF,UAAU4D,KAEnC,QAApBwC,EAAIX,EAAUmB,cAAM,IAAAR,GAAhBA,EAAkBS,mBAClBN,EAAcO,sBAAwBrB,EAAUmB,OAAOC,kBAE3D,MAAME,EAA+B,CAAEV,QAAAA,EAASW,SAAUT,GAO1D,MAAO,CACHtG,4BAA6B,CACzB0C,IAAK,KACLC,UARQC,GAAAA,CACZ,mCACAsD,IAAU/D,EAAc,0CAA4C,IAOhEU,KAAM,eACNxD,IAAK6G,GAETjG,QAASE,IAAAA,cAAAA,IAAAA,SAAA,MACTD,MACIC,IAAAA,cAACD,EAAAA,GAAK,CAACyC,UAAU,2BAA2BqE,UAAW,CAAE3H,IAAKmG,EAAWrC,eAAgBnE,EAAM+B,QAAQU,UACnGtB,IAAAA,cAAC8G,EAAAA,OAAM,CACHC,WAAYJ,EACZK,SAAUnI,EAAM+B,QAAQU,QAAQ2F,OAAOD,SACvCd,gBAAiBA,MAMrC,OAAOnC,EAA+B1E,EAAeR,IAiHxBgH,CAAYV,EAAMtC,EAAId,EAAMC,YAAaqC,EAA+BxF,GAGnF,OAAOsB,EAA0BgF,EAAMd,EAA+BxB,EAAId,EAAMC,YAAanD,MAI/G,OACImB,IAAAA,cAACC,EAAAA,KAAIlB,OAAAmB,OAAA,GAAK4E,GACN9E,IAAAA,cAACC,EAAAA,KAAIlB,OAAAmB,OAAA,GAAK6E,GAAoCE,MAAAA,OAAK,EAALA,EAAOC,IAAIvF,MAsBrE,EAZ2Dd,IAEvD,MAAM,cAAEqI,EAAa,WAAEC,EAAU,aAAEC,EAAY,MAAEC,GAAUxI,EAC3D,OACImB,IAAAA,cAACsH,EAAAA,OAAMvI,OAAAmB,OAAA,GAAKkH,GACRpH,IAAAA,cAACC,EAAAA,KAAIlB,OAAAmB,OAAA,GAAKgH,IACTG,EACAzC,EAAiBuC,EAAYtI,YCpV1C6c,EAAOC,QAAU3b,cCAjB0b,EAAOC,QAAUC","sources":["webpack://Msdyn365.Commerce.Online/./src/shared-utils/image-utilities.ts?f424","webpack://Msdyn365.Commerce.Online/./src/themes/dlvry-adventureworks/views/media-gallery.view.tsx?72c1","webpack://Msdyn365.Commerce.Online/./lib/media-gallery/module-registration.js?47e5","webpack://Msdyn365.Commerce.Online/./src/modules/media-gallery/media-gallery.tsx?24d7","webpack://Msdyn365.Commerce.Online/./src/modules/media-gallery/media-gallery.view.tsx?5061","webpack://Msdyn365.Commerce.Online/./src/modules/media-gallery/utils/helper.ts?b895","webpack://Msdyn365.Commerce.Online/./src/modules/media-gallery/utils/get-valid-product-images.ts?a364","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/media-gallery.view.tsx?7624","webpack://Msdyn365.Commerce.Online/external var \"React\"?0d3b","webpack://Msdyn365.Commerce.Online/external var \"ReactDOM\"?853b"],"sourcesContent":["import { IImageSettings } from '@msdyn365-commerce/core';\r\n\r\nexport function findImagesSettingsInProps(props: any, onFound: (result: IImageSettings) => void) {\r\n if (!props) {\r\n return;\r\n }\r\n Object.keys(props).forEach(key => {\r\n if (key === '_owner' || key === 'type' || key === 'tag' || key === 'requestContext') {\r\n return;\r\n }\r\n\r\n if (key === 'imageSettings') {\r\n onFound(props[key]);\r\n } else if (key === 'props' || key === 'children' || key === 'items' || key === 'Picture' || key.match(/^\\d+$/m) && typeof props[key] === 'object') {\r\n findImagesSettingsInProps(props[key], onFound);\r\n }\r\n });\r\n}\r\n\r\nexport function fixImageSettings(imageSettings: IImageSettings) {\r\n if (imageSettings.mode) {\r\n // How to set this otherwise it will overwrite modes defined below\r\n imageSettings.mode = 0;\r\n }\r\n\r\n Object.keys(imageSettings.viewports || {}).forEach(key => {\r\n if (imageSettings.viewports[key].q) {\r\n imageSettings.viewports[key].q = imageSettings.viewports[key].q.replace(/f=(jpg|jpeg|png)/g, 'f=webp').replace(/m=\\d/g, 'm=0');\r\n }\r\n });\r\n}\r\n\r\nexport function findAndFixImageSettingsInProps(props: any) {\r\n findImagesSettingsInProps(props, (imageSettings: IImageSettings) => {\r\n fixImageSettings(imageSettings);\r\n });\r\n}","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { IImageData, IImageSettings, Image, Video } from '@msdyn365-commerce/core';\r\nimport {\r\n IMediaData,\r\n IMediaGalleryThumbnailItemViewProps,\r\n IMediaGalleryThumbnailsViewProps,\r\n IMediaGalleryViewProps,\r\n MediaType\r\n} from '@msdyn365-commerce-modules/media-gallery';\r\nimport { ArrayExtensions, getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, KeyCodes, Module, Node, NodeTag } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React from 'react';\r\nimport { IPlayerData, IPlayerOptions, IVideoMetadata, Player } from '@msdyn365-commerce-modules/video-player-utilities';\r\nimport { findAndFixImageSettingsInProps } from '../../../shared-utils/image-utilities';\r\n\r\ninterface IMediaGalleryItemsProps extends IMediaGalleryThumbnailItemViewProps {\r\n Video?: React.ReactElement;\r\n}\r\n\r\n/**\r\n * Render the thumbnail item images.\r\n * @param thumbnail - The carousel thumbnail line props.\r\n * @returns Return HTML having thumbnail container props with image.\r\n */\r\nconst renderThumbnailItem = (thumbnail: IMediaGalleryItemsProps): JSX.Element => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\r\n const { ThumbnailItemContainerProps, Picture, Video } = thumbnail;\r\n\r\n return {Video ? Video : Picture};\r\n};\r\n\r\n/**\r\n * Gets the thumbnail item to display media gallery images.\r\n * @param image - The media gallery images.\r\n * @param imageSettings - Image settings for the image gallery items.\r\n * @param imageId - Image id.\r\n * @param modifiedActiveIndex - Modified Index of the images when selection changes.\r\n * @param props - The Media gallery view props from business layer.\r\n * @returns Return thumbnail view props which will be used to render images.\r\n */\r\nconst GetThumbnailItemComponent = (\r\n image: IImageData,\r\n imageSettings: IImageSettings,\r\n imageId: number,\r\n modifiedActiveIndex: number,\r\n props: IMediaGalleryViewProps,\r\n mediaTypeValue?: MediaType\r\n): IMediaGalleryThumbnailItemViewProps => {\r\n let fallbackImage: string | undefined = '';\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\r\n const emptyPlaceHolderImage = props.context.app.config?.placeholderImageName as string;\r\n if (props.data.product.result) {\r\n fallbackImage = getFallbackImageUrl(\r\n props.data.product.result.ItemId,\r\n props.context.request.apiSettings,\r\n props.context.request.app?.config?.OmniChannelMedia\r\n );\r\n }\r\n if (emptyPlaceHolderImage && fallbackImage) {\r\n fallbackImage = `${fallbackImage},${emptyPlaceHolderImage}`;\r\n }\r\n\r\n /**\r\n * OnClick method of media gallery item.\r\n */\r\n const onClick = () => {\r\n props.callbackToggle?.();\r\n props.callbackThumbnailClick?.(imageId);\r\n props.state.activeIndex = imageId;\r\n };\r\n\r\n const classes = classnames(\r\n 'ms-media-gallery__thumbnail-item',\r\n modifiedActiveIndex === imageId ? 'ms-media-gallery__thumbnail-item-active' : ''\r\n );\r\n\r\n /**\r\n * Keydown event of media gallery item.\r\n * @param event - React.KeyboardEvent.\r\n */\r\n const handleKeyDown = (event: React.KeyboardEvent) => {\r\n if (event.keyCode === KeyCodes.Enter) {\r\n event.preventDefault();\r\n onClick();\r\n }\r\n };\r\n const defaultIndex = 0;\r\n return {\r\n ThumbnailItemContainerProps: {\r\n tag: 'li' as NodeTag,\r\n className: classes,\r\n role: 'presentation',\r\n key: imageId\r\n },\r\n Picture: (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n };\r\n};\r\n\r\n/**\r\n * Render the video player.\r\n * @param mediaData - Media Data\r\n * @param index - Index of the video\r\n * @param activeIndex - Active Index\r\n * @param imageSettings - Image settings\r\n * @param props - Media gallery view props\r\n * @returns - JSX.Element.\r\n */\r\nconst RenderVideo = (\r\n mediaData: IMediaData,\r\n index: number,\r\n activeIndex: number,\r\n imageSettings: IImageSettings,\r\n props: IMediaGalleryViewProps\r\n): IMediaGalleryItemsProps => {\r\n const videoData = mediaData.videoData;\r\n if (videoData) {\r\n const options: IPlayerOptions = props.config as IPlayerOptions;\r\n const playerResources = props.resources;\r\n const videoMetaData: IVideoMetadata = {};\r\n videoMetaData.videoId = videoData.id;\r\n videoMetaData.title = videoData.title;\r\n videoMetaData.duration = videoData.playTime;\r\n if (videoData.thumbnail) {\r\n videoMetaData.posterframeUrl = videoData.thumbnail.src;\r\n }\r\n if (videoData._links?.binaryReferences) {\r\n videoMetaData.videoBinaryReferences = videoData._links.binaryReferences;\r\n }\r\n const videoPlayerData: IPlayerData = { options, metaData: videoMetaData };\r\n\r\n const classes = classnames(\r\n 'ms-media-gallery__thumbnail-item',\r\n index === activeIndex ? 'ms-media-gallery__thumbnail-item-active' : ''\r\n );\r\n\r\n return {\r\n ThumbnailItemContainerProps: {\r\n tag: 'li' as NodeTag,\r\n className: classes,\r\n role: 'presentation',\r\n key: index\r\n },\r\n Picture: <>,\r\n Video: (\r\n \r\n )\r\n };\r\n }\r\n return GetEmptyThumbnailItemComponent(imageSettings, props);\r\n};\r\n\r\n/**\r\n * Gets the empty thumbnail item to display media gallery images.\r\n * @param imageSettings - Image settings for the image gallery items.\r\n * @param props - The Media gallery view props from business layer.\r\n * @returns Return thumbnail view props which will be used to render empty images.\r\n */\r\nconst GetEmptyThumbnailItemComponent = (\r\n imageSettings: IImageSettings,\r\n props: IMediaGalleryViewProps\r\n): IMediaGalleryThumbnailItemViewProps => {\r\n let fallbackImage: string | undefined = '';\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\r\n const emptyPlaceHolderImage = props.context.app.config?.placeholderImageName as string;\r\n\r\n if (props.data.product.result) {\r\n fallbackImage = getFallbackImageUrl(\r\n props.data.product.result.ItemId,\r\n props.context.request.apiSettings,\r\n props.context.request.app?.config?.OmniChannelMedia\r\n );\r\n }\r\n if (emptyPlaceHolderImage && fallbackImage) {\r\n fallbackImage = `${fallbackImage},${emptyPlaceHolderImage}`;\r\n }\r\n\r\n return {\r\n ThumbnailItemContainerProps: {\r\n tag: 'li' as NodeTag,\r\n className: 'ms-media-gallery__thumbnail-item',\r\n role: 'tab',\r\n tabIndex: 0,\r\n key: 0,\r\n 'aria-label': '',\r\n 'aria-selected': true\r\n },\r\n Picture: (\r\n \r\n )\r\n };\r\n};\r\n\r\n/**\r\n * Update media gallery items method.\r\n * @param items - The media gallery thumbnail item view props.\r\n * @returns The IImageData array.\r\n */\r\nconst getMediaGalleryItems = (items?: IMediaData[]): IMediaData[] | undefined => {\r\n return items?.map(item => {\r\n return {\r\n displayOrder: item.displayOrder,\r\n mediaTypeValue: item.mediaTypeValue,\r\n altText: item.altText,\r\n src: item.src,\r\n videoData: item.videoData\r\n };\r\n });\r\n};\r\n\r\nconst defaultThumbnailImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=860&h=860&q=80&m=6&f=jpg', w: 860, h: 860 },\r\n xl: { q: 'w=860&h=860&q=80&m=6&f=jpg', w: 860, h: 860 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n};\r\n\r\n/**\r\n * Render the Media gallery thumbnails to represent images in grid view.\r\n * @param thumbnails - The thumbnail view props.\r\n * @param props - The media gallery view props.\r\n * @returns - The single slide carousel component to render as media gallery image.\r\n */\r\nconst renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps, props: IMediaGalleryViewProps): JSX.Element => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\r\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps } = thumbnails;\r\n const { state } = props;\r\n const mediaGalleryItems = getMediaGalleryItems(state.mediaGalleryItems);\r\n\r\n const items: IMediaGalleryItemsProps[] | undefined =\r\n // eslint-disable-next-line multiline-ternary -- need multiline for easy code reading\r\n state.lastUpdate && ArrayExtensions.hasElements(mediaGalleryItems) && mediaGalleryItems[0].src === 'empty'\r\n ? [GetEmptyThumbnailItemComponent(defaultThumbnailImageSettings, props)]\r\n : // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery\r\n mediaGalleryItems?.map((item: IMediaData, id: number) => {\r\n if (item.mediaTypeValue === MediaType.Video) {\r\n if (props.config.allowFullScreen) {\r\n const videoThumbnail = item.videoData?.thumbnail;\r\n if (videoThumbnail) {\r\n return GetThumbnailItemComponent(\r\n videoThumbnail,\r\n defaultThumbnailImageSettings,\r\n id,\r\n state.activeIndex,\r\n props,\r\n item.mediaTypeValue\r\n );\r\n } else {\r\n return GetEmptyThumbnailItemComponent(defaultThumbnailImageSettings, props);\r\n }\r\n } else {\r\n return RenderVideo(item, id, state.activeIndex, defaultThumbnailImageSettings, props);\r\n }\r\n } else {\r\n return GetThumbnailItemComponent(item, defaultThumbnailImageSettings, id, state.activeIndex, props);\r\n }\r\n });\r\n\r\n return (\r\n \r\n {items?.map(renderThumbnailItem)}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Render the Media gallery items using viewprops.\r\n * @param props - The media gallery view props.\r\n * @returns The media gallery module wrapping up images node.\r\n */\r\nconst mediaGalleryView: React.FC = props => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\r\n const { CarouselProps, Thumbnails, MediaGallery, Modal } = props;\r\n\r\n findAndFixImageSettingsInProps(CarouselProps);\r\n findAndFixImageSettingsInProps(Thumbnails);\r\n findAndFixImageSettingsInProps(Modal);\r\n\r\n return (\r\n \r\n \r\n {Modal}\r\n {renderThumbnails(Thumbnails, props)}\r\n \r\n );\r\n};\r\n\r\nexport default mediaGalleryView;\r\n","const binding = { modules: {}, dataActions: {} };\n\n const registerActionId = (actionPath) => {\n if (binding.dataActions[actionPath] &&\n binding.dataActions[actionPath].default &&\n binding.dataActions[actionPath].default.prototype &&\n binding.dataActions[actionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[actionPath].default.prototype.id] = binding.dataActions[actionPath];\n } else {\n Object.keys(binding.dataActions[actionPath] || {}).forEach(exportName => {\n if (binding.dataActions[actionPath][exportName] &&\n binding.dataActions[actionPath][exportName].prototype &&\n binding.dataActions[actionPath][exportName].prototype.Action) {\n binding.dataActions[binding.dataActions[actionPath][exportName].prototype.id] = binding.dataActions[actionPath][exportName];\n }\n })\n }\n };\n\n const registerSanitizedActionPath = (sanitizedActionPath, dataAction) => {\n if (process.env.NODE_ENV === 'development') {\n if (!dataAction.default) {\n throw new Error('Data action path does not have a default export');\n }\n if (!(dataAction.default.prototype.id && binding.dataActions[dataAction.default.prototype.id]) || !binding.dataActions[sanitizedActionPath]) {\n binding.dataActions[sanitizedActionPath] = dataAction;\n }\n } else {\n binding.dataActions[sanitizedActionPath] = dataAction;\n if (!binding.dataActions[sanitizedActionPath].default) {\n throw new Error('Data action path ' + sanitizedActionPath + ' does not have a default export');\n }\n binding.dataActions[sanitizedActionPath].default.prototype.RegistrationId = sanitizedActionPath;\n if (binding.dataActions[sanitizedActionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[sanitizedActionPath].default.prototype.id] = sanitizedActionPath;\n }\n }\n };\n \n\n (binding.modules['media-gallery'] = {\n c: () => require('@msdyn365-commerce-modules/media-gallery/dist/lib/modules/media-gallery/media-gallery'),\n $type: 'contentModule',\n da: [{name:'mediaLocations', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-media-locations-by-id', runOn: 0},{name:'mediaLocationsForSelectedVariant', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-media-locations-for-selected-variant', runOn: 0},{name:'product', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant', runOn: 0}],\n \n iNM: true,\n ns: '@msdyn365-commerce-modules',\n n: 'media-gallery',\n p: 'media-gallery',\n \n pdp: '',\n \n \n md: 'node_modules/@msdyn365-commerce-modules/media-gallery/dist/lib/modules/media-gallery'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-media-locations-by-id';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-media-locations-by-id');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-media-locations-for-selected-variant';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-media-locations-for-selected-variant');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n \n window.__bindings__ = window.__bindings__ || {};\n window.__bindings__.modules = {\n ...window.__bindings__.modules || {},\n ...binding.modules\n };\n \n window.__bindings__.dataActions = {\n ...window.__bindings__.dataActions || {},\n ...binding.dataActions\n };\n export const viewDictionary = {};\n viewDictionary['__local__|__local__|themes|dlvry-adventureworks|views|media-gallery'] = {\n c: () => require('partner/themes/dlvry-adventureworks/views/media-gallery.view.tsx'),\n cn: '__local__-__local__-media-gallery'\n };\nviewDictionary['@msdyn365-commerce-modules|media-gallery|modules|media-gallery|media-gallery'] = {\n c: () => require('@msdyn365-commerce-modules/media-gallery/dist/lib/modules/media-gallery/media-gallery.view.js'),\n cn: '@msdyn365-commerce-modules-media-gallery-media-gallery'\n };\nviewDictionary['@msdyn365-commerce-theme|adventureworks-theme-kit|modules|adventureworks|views|media-gallery'] = {\n c: () => require('@msdyn365-commerce-theme/adventureworks-theme-kit/dist/lib/modules/adventureworks/views/media-gallery.view.js'),\n cn: '@msdyn365-commerce-theme-adventureworks-theme-kit-media-gallery'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Carousel, ICarouselProps, Player, IPlayerData, IPlayerOptions, IVideoMetadata } from '@msdyn365-commerce/components';\nimport { IImageData, IImageSettings, Image, Video } from '@msdyn365-commerce/core';\nimport { MediaLocation, MediaType, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getFallbackImageUrl, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n defaultDataScale,\n IComponentNodeProps,\n ImagefullView,\n IModalViewProps,\n IModuleProps,\n inlineZoomImageOnHover,\n inlineZoomImageOnMouseMove,\n inlineZoomImageOnMouseOut,\n inlineZoomInitClick,\n INodeProps,\n ISingleSlideCarouselProps,\n isMobile,\n KeyCodes,\n NodeTag,\n onContainerZoomInit,\n onMouseMoveLensContainer,\n onMouseOutLensContainer,\n onMouseOverImageContainer,\n removeContainerZoomStyle,\n removeInlineZoomStyle,\n SingleSlideCarousel,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport * as React from 'react';\n\nimport { IMediaGalleryData } from './media-gallery.data';\nimport { imageSource, imageZoom, IMediaGalleryProps, thumbnailsOrientation } from './media-gallery.props.autogenerated';\nimport { getProductImages, getValidProductImages, getVideoMetadataFromApi, validateProductImages } from './utils';\nimport { getAltText, IMediaData } from './utils/helper';\n\n/**\n * IMediaGalleryState Interface.\n */\nexport interface IMediaGalleryState {\n animating: boolean;\n activeIndex: number;\n isImageZoomed: boolean;\n modalIsOpen: boolean;\n lastUpdate?: number;\n isMobileImageZoomed?: boolean;\n mediaGalleryItems?: IMediaData[];\n isInitialLoad?: boolean;\n shouldUseOptimizedImage?: boolean;\n}\n\n/**\n * IMediaGalleryThumbnailsViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailsViewProps {\n ThumbnailsContainerProps: INodeProps;\n SingleSlideCarouselComponentProps: INodeProps;\n items?: IMediaGalleryThumbnailItemViewProps[];\n}\n\n/**\n * IMediaGalleryThumbnailItemViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailItemViewProps {\n ThumbnailItemContainerProps: INodeProps;\n Picture: React.ReactElement;\n}\n\n/**\n * IMediaGalleryViewProps Interface.\n */\nexport interface IMediaGalleryViewProps extends IMediaGalleryProps {\n state: IMediaGalleryState;\n MediaGallery: IModuleProps;\n CarouselProps: INodeProps;\n Thumbnails: IMediaGalleryThumbnailsViewProps;\n Modal?: React.ReactElement | null;\n callbackToggle?(): void;\n callbackThumbnailClick?(index: number): void;\n callbackThumbnailKeyDown?(index: number): void;\n}\n\n/**\n * Props for carousel.\n */\ninterface IMediaGalleryCarouselItems {\n items: ItemType[];\n keys: (string | undefined)[];\n}\n\n/**\n * Media gallery component.\n */\nclass MediaGallery extends React.Component, IMediaGalleryState> {\n private readonly _inlineZoomDivRef: Map = new Map();\n\n private readonly fullScreenOverlayButtonRef: React.RefObject = React.createRef();\n private readonly player: React.RefObject = React.createRef();\n\n private mediaGalleryImages: IImageData[] = [];\n\n private fallbackImage?: string;\n\n private readonly defaultGalleryImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\n sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\n md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\n lg: { q: 'h=772&m=8', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly defaultThumbnailImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=100&m=8', w: 100, h: 0 },\n lg: { q: 'w=100&m=8', w: 100, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly _zoomedImageSettings: IImageSettings;\n\n public constructor(props: IMediaGalleryProps) {\n super(props);\n this._toggleModal = this._toggleModal.bind(this);\n this.state = {\n activeIndex: 0,\n animating: false,\n isImageZoomed: false,\n modalIsOpen: false,\n isInitialLoad: true,\n shouldUseOptimizedImage: !!this.props.config.skipImageValidation\n };\n\n this._zoomedImageSettings =\n props.config.zoomedImageSettings ?? props.config.galleryImageSettings ?? this.defaultGalleryImageSettings;\n\n this._onImageMouseOut = this._onImageMouseOut.bind(this);\n this._inlineZoomImageOnHover = this._inlineZoomImageOnHover.bind(this);\n this._onInlineImageClick = this._onInlineImageClick.bind(this);\n this._onContainerZoomImageClick = this._onContainerZoomImageClick.bind(this);\n this._onMouseOutLensContainer = this._onMouseOutLensContainer.bind(this);\n }\n\n public isMobile(): boolean {\n const size = isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n return size === 'xs';\n }\n\n public async componentDidMount(): Promise {\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n const shouldUpdateOnPartialDimensionSelection = this.props.config.shouldUpdateOnPartialDimensionSelection;\n this._setRenderType();\n if (!this.props.context.request.app?.config?.OmniChannelMedia) {\n if (source === imageSource.pageContext) {\n if (this.state.mediaGalleryItems === undefined && this.props.data.mediaLocationsForSelectedVariant.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocationsForSelectedVariant.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n );\n await this._setImages(images);\n } else if (this.state.mediaGalleryItems === undefined && this.props.data.product.result) {\n const product = this.props.data.product.result;\n const images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n product.productVariant\n );\n\n await this._setImages(images);\n } else {\n await this._setImages([]);\n }\n }\n }\n\n reaction(\n () => {\n const product = this.props.data.product.result;\n if (!product) {\n return null;\n }\n\n if (!shouldUpdateOnPartialDimensionSelection || !product.productVariant?.RecordId) {\n return `${product.RecordId}`;\n }\n\n return `${product.RecordId}-${product.productVariant.RecordId}`;\n },\n async () => {\n const product = this.props.data.product.result;\n let images: IImageData[] = [];\n if (product) {\n if (this.props.context.app?.config?.OmniChannelMedia) {\n images = await getProductImages(\n product.RecordId,\n this.shouldUseCmsAltText(),\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n product.Name,\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\n );\n } else {\n images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\n );\n }\n await this._setImages(images);\n } else {\n await this._setImages([]);\n }\n },\n { fireImmediately: true }\n );\n\n if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocations.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n );\n await this._setImages(images);\n }\n }\n\n public shouldComponentUpdate(nextProps: IMediaGalleryProps, nextState: IMediaGalleryState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const { id, config, resources } = this.props;\n\n const { className, showPaginationTooltip } = config;\n\n const isVertical: boolean = config.thumbnailsOrientation === thumbnailsOrientation.vertical;\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- || is required.\n const isFullscreenAllowed: boolean = this.isMobile() || config.allowFullScreen || false;\n const zoomViewMode: string =\n config.imageZoom === imageZoom.inline ? imageZoom.inline : config.imageZoom === imageZoom.container ? imageZoom.container : '';\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = this.props.context.app.config?.placeholderImageName as string;\n if (this.props.data.product.result) {\n this.fallbackImage = getFallbackImageUrl(\n this.props.data.product.result.ItemId,\n this.props.context.request.apiSettings,\n this.props.context.request.app?.config?.OmniChannelMedia\n );\n }\n if (emptyPlaceHolderImage && this.fallbackImage) {\n this.fallbackImage = `${this.fallbackImage},${emptyPlaceHolderImage}`;\n }\n if (this.props.config.skipImageValidation && !this.state.mediaGalleryItems && this.state.isInitialLoad) {\n let images: IImageData[] = [];\n let mediaLocations: MediaLocation[] = [];\n if (source === imageSource.pageContext && this.props.data.mediaLocationsForSelectedVariant.result) {\n mediaLocations = this.props.data.mediaLocationsForSelectedVariant.result;\n } else if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n mediaLocations = this.props.data.mediaLocations.result;\n }\n images = mediaLocations.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(\n this.props.context.actionContext.requestContext,\n this.shouldUseCmsAltText(),\n this.props.data.product.result?.Name,\n mediaLocation.AltText\n )\n };\n });\n const curatedImages = this.props.config.images ?? [];\n this.mediaGalleryImages = [...this._filterMasterImageFromVariant(images), ...curatedImages];\n }\n const mediaGalleryCarouselItems = this._getMediaGalleryItems(isFullscreenAllowed, zoomViewMode);\n const mediaGalleryThumbnailCarouselItems = this._getMediaGalleryThumbnailItems();\n const viewProps: IMediaGalleryViewProps = {\n ...(this.props as IMediaGalleryProps),\n state: this.state,\n MediaGallery: {\n moduleProps: this.props,\n className: classnames(`ms-media-gallery ${isVertical ? 'vertical' : ''}`, className)\n },\n Modal: isFullscreenAllowed ? this.imageModalSlider(zoomViewMode) : null,\n callbackToggle: this.openModalDialog,\n callbackThumbnailClick: this._generateOnThumbnailClick,\n callbackThumbnailKeyDown: this._generateOnThumbnailKeyDown,\n CarouselProps: {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items: mediaGalleryCarouselItems.items,\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: showPaginationTooltip === true,\n indicatorAriaText: resources.ariaLabelForSlide,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n key: mediaGalleryCarouselItems.keys\n } as IComponentNodeProps,\n Thumbnails: {\n ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: 'ms-media-gallery__thumbnails',\n vertical: isVertical,\n flipperPrevLabel: resources.previousScreenshotFlipperText,\n flipperNextLabel: resources.nextScreenshotFlipperText,\n parentId: id,\n useTabList: true,\n key: JSON.stringify(mediaGalleryThumbnailCarouselItems.keys)\n } as IComponentNodeProps,\n items: mediaGalleryThumbnailCarouselItems.items\n }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Zoomed out image on previous/next click.\n */\n public updateZoomedInImage(): void {\n this.setState({ isImageZoomed: false });\n }\n\n private readonly onExiting = () => {\n this.setState({ animating: true });\n };\n\n private readonly onExited = () => {\n this.setState({ animating: false });\n };\n\n /**\n * On click next in carousel.\n */\n private readonly next = (): void => {\n removeInlineZoomStyle();\n if (this.isLastItem() === undefined) {\n return;\n }\n\n const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex + 1;\n this.goToIndex(nextIndex);\n\n this.updateZoomedInImage();\n };\n\n /**\n * On click previous in carousel.\n */\n private readonly previous = (): void => {\n removeInlineZoomStyle();\n const images = this.state.mediaGalleryItems;\n const nextIndex = this.isFirstItem() ? (images ? images.length - 1 : 0) : this.state.activeIndex - 1;\n this.goToIndex(nextIndex);\n this.updateZoomedInImage();\n };\n\n private readonly goToIndex = (index: number): void => {\n const { autoplay } = this.props.config;\n const currentIndex = this.state.activeIndex;\n const mediaItems = this.state.mediaGalleryItems;\n if (autoplay && mediaItems) {\n if (mediaItems[`${index}`]?.mediaTypeValue === MediaType.Video) {\n this.player.current?.play();\n } else if (mediaItems[`${currentIndex}`].mediaTypeValue === MediaType.Video) {\n this.player.current?.pause();\n }\n }\n this.setState({ activeIndex: index });\n };\n\n private _getMediaGalleryThumbnailItems(): IMediaGalleryCarouselItems {\n const mediaGalleryItems = this.state.mediaGalleryItems ?? this.mediaGalleryImages;\n const thumbnailImageSettings = this.props.config.thumbnailImageSettings;\n if (thumbnailImageSettings) {\n thumbnailImageSettings.cropFocalRegion = true;\n }\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n const defaultKey = 0;\n return {\n items: [this._getEmptyThumbnailItem(thumbnailImageSettings, defaultKey, this.state.activeIndex)],\n keys: ['empty']\n };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\n if (item.mediaTypeValue === MediaType.Video) {\n return this.getVideoThumbNailItem(\n item,\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n index,\n this.state.activeIndex\n );\n } else {\n return this._getThumbnailItem(\n item,\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n index,\n this.state.activeIndex\n );\n }\n })\n ],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private _getMediaGalleryItems(isFullscreenAllowed: boolean, zoomViewMode: string): IMediaGalleryCarouselItems {\n const mediaGalleryItems = this.state.mediaGalleryItems ?? this.mediaGalleryImages;\n const galleryImageSettings = this.props.config.galleryImageSettings;\n if (galleryImageSettings) {\n galleryImageSettings.cropFocalRegion = true;\n }\n\n const zoomView = isFullscreenAllowed ? 'fullscreen' : zoomViewMode;\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n return { items: [this._renderEmptyImage(galleryImageSettings)], keys: ['empty'] };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\n return this._renderCarouselItemImageView(\n zoomView,\n item,\n galleryImageSettings ?? this.defaultGalleryImageSettings,\n index\n );\n })\n ],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private async _setImages(images?: IMediaData[]): Promise {\n const curatedImage = this.props.config.images || [];\n const mediaToSet: IMediaData[] = this._filterMasterImageFromVariant(images);\n\n void Promise.all(\n mediaToSet.map(async mediaData => {\n if (mediaData.mediaTypeValue === MediaType.Video && mediaData.src) {\n try {\n const url = new URL(mediaData.src);\n const videoId = url.searchParams.get('CVID');\n if (videoId) {\n mediaData.videoData = await getVideoMetadataFromApi(videoId, this.props.context.actionContext);\n }\n } catch (error) {\n if (this.props.telemetry) {\n this.props.telemetry.debug('Error while fetching videoId');\n }\n }\n }\n return mediaData;\n })\n ).then(mediaData => {\n const mediaItems = mediaData.filter(element => {\n return (\n element.mediaTypeValue !== MediaType.Video ||\n (element.mediaTypeValue === MediaType.Video && element.videoData !== undefined)\n );\n });\n\n this.setState({\n mediaGalleryItems: [...mediaItems, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now(),\n shouldUseOptimizedImage: false\n });\n });\n\n this.setState({\n mediaGalleryItems: [...mediaToSet, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now(),\n shouldUseOptimizedImage: false\n });\n }\n\n private _setRenderType(): void {\n this.setState({\n isInitialLoad: false\n });\n }\n\n private _renderCarouselItemImageView(\n zoomView: string,\n media: IMediaData,\n imageSettings: IImageSettings,\n index: number,\n isInPopup: boolean = false\n ): React.ReactNode {\n if (media.mediaTypeValue === MediaType.Video) {\n if (isInPopup || zoomView !== 'fullscreen') {\n return <>{this._renderCarouselItemVideo(media, index, imageSettings)};\n }\n return <>{this._renderVideoThumbnail(media, index, imageSettings)};\n } else {\n if (this.isMobile()) {\n if (isInPopup) {\n return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\n }\n return this._renderImageFullScreenOnZoom(media, imageSettings, index);\n }\n\n switch (zoomView) {\n case 'container': {\n return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\n }\n case 'inline': {\n return this._renderImageInlineOnZoom(media, this._zoomedImageSettings, index);\n }\n case 'fullscreen': {\n return this._renderImageFullScreenOnZoom(media, imageSettings, index);\n }\n\n // No default\n }\n return <>{this._getCarouselItem(media, imageSettings, index, isInPopup)};\n }\n }\n\n private _filterMasterImageFromVariant(images?: IImageData[]): IImageData[] {\n const shouldHidePrimaryImages = this.props.config.shouldHideMasterProductImagesForVariant ?? true;\n let variantImages = images ?? [];\n const isVariantProduct =\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.MasterProductId) ||\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.productVariant);\n const itemId = this.props.data.product.result?.ItemId;\n if (shouldHidePrimaryImages && isVariantProduct && itemId) {\n variantImages = variantImages.filter(item => {\n const isApplicableForChildEntities = item.additionalProperties?.isApplicableForChildEntities;\n return !isApplicableForChildEntities;\n });\n if (!ArrayExtensions.hasElements(variantImages)) {\n variantImages = images ?? [];\n }\n }\n return variantImages;\n }\n\n private readonly _renderCarouselItemVideo = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\n const videoData = mediaData.videoData;\n if (videoData) {\n const options: IPlayerOptions = this.props.config as IPlayerOptions;\n const playerResources = this.props.resources;\n const videoMetaData: IVideoMetadata = {};\n videoMetaData.videoId = videoData.id;\n videoMetaData.title = videoData.title;\n videoMetaData.duration = videoData.playTime;\n if (videoData.thumbnail) {\n videoMetaData.posterframeUrl = videoData.thumbnail.src;\n }\n if (videoData._links?.binaryReferences) {\n videoMetaData.videoBinaryReferences = videoData._links.binaryReferences;\n }\n const videoPlayerData: IPlayerData = { options, metaData: videoMetaData };\n const attributes = {\n id: `${this.props.id}__carousel-item__${index}`\n };\n return (\n \n );\n }\n return this._renderEmptyImage(imageSettings);\n };\n\n private readonly _getCarouselItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n isInPopup: boolean = false\n ): React.ReactNode => (\n \n );\n\n private readonly _getThumbnailItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps => {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: index,\n 'aria-label': image.altText,\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n };\n\n /**\n * Gets the video thumbnail item to display media gallery.\n * @param props - The Media gallery view props from business layer.\n * @returns Return thumbnail view props which will be used to render video.\n */\n private readonly getVideoThumbNailItem = (\n mediaData: IMediaData,\n imageSettings: IImageSettings,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps => {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n const videoData = mediaData.videoData;\n let image: IImageData;\n if (videoData?.thumbnail) {\n image = videoData.thumbnail;\n } else {\n image = {\n src: 'empty'\n };\n }\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: index,\n 'aria-label': image.altText,\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n };\n\n /**\n * Ref Handler.\n * @param index -Remove item click function.\n * @returns Set inline zoom.\n */\n private readonly _refHandler = (index: number) => (divRef: HTMLDivElement) => {\n this._inlineZoomDivRef.set(index, divRef);\n };\n\n private readonly _generateOnThumbnailKeyDown = (index: number) => {\n return (event: React.KeyboardEvent) => {\n if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\n event.preventDefault();\n\n this.goToIndex(index);\n }\n };\n };\n\n private readonly _generateOnThumbnailClick = (index: number) => {\n return (event: React.MouseEvent) => {\n event.preventDefault();\n\n this.goToIndex(index);\n };\n };\n\n private _renderImageInlineOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n \n \n \n \n );\n }\n\n private _inlineZoomImageOnHover(event: React.MouseEvent): void {\n inlineZoomImageOnHover(event, this.props.config.dataScale ?? String(defaultDataScale));\n }\n\n private _handleMobileViewZoomedImageClick(event: React.MouseEvent) {\n const target = this.state.shouldUseOptimizedImage ? (event.target as HTMLImageElement) : event.currentTarget;\n const mobileZoomedInImageClassName = 'msc-mobile-zoomed-in';\n if (!this.state.isMobileImageZoomed) {\n const bounds = target.getBoundingClientRect();\n const dataScale = Number(this.props.config.dataScale ?? defaultDataScale);\n\n const positionX = event.clientX - bounds.left;\n const positionY = event.clientY - bounds.top;\n const scaledPositionX = positionX * dataScale;\n const scaledPositionY = positionY * dataScale;\n\n target.style.transform = `scale(${dataScale})`;\n target.classList.add(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = 'auto';\n target.parentElement!.scrollTo(scaledPositionX - positionX, scaledPositionY - positionY);\n this.setState({\n isMobileImageZoomed: true\n });\n } else {\n target.style.transform = '';\n target.classList.remove(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = '';\n this.setState({\n isMobileImageZoomed: false\n });\n }\n }\n\n private _onInlineImageClick(event: React.MouseEvent): void {\n if (window.innerWidth <= 768) {\n // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n inlineZoomInitClick(event, this.props.config.dataScale ?? String(defaultDataScale));\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onImageMouseOut(event: React.MouseEvent): void {\n inlineZoomImageOnMouseOut(event);\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _onContainerZoomImageClick(event: React.MouseEvent): void {\n if (window.innerWidth <= 768) {\n // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n\n onContainerZoomInit(event);\n\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onMouseOutLensContainer(event: React.MouseEvent): void {\n onMouseOutLensContainer(event);\n\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _renderImageInContainerOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n
\n \n \n
\n );\n }\n\n private _renderImageFullScreenOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n
\n \n
\n {}\n \n
\n
\n );\n }\n\n /**\n * Render the video thumbnail in full screen.\n * @param mediaData - Media Data.\n * @param index - Index\n * @param imageSettings - Image settings.\n * @returns - JSX.Element\n */\n private readonly _renderVideoThumbnail = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\n const videoData = mediaData.videoData;\n let image: IImageData;\n if (videoData?.thumbnail) {\n image = videoData.thumbnail;\n } else {\n image = {\n src: 'empty'\n };\n }\n\n return (\n
\n \n
\n {}\n \n
\n
\n );\n };\n\n private _mapProductToImageData(product: SimpleProduct): IImageData {\n return {\n src: product.PrimaryImageUrl ?? ''\n };\n }\n\n private _renderEmptyImage(imageSettings: IImageSettings | undefined): React.ReactNode {\n return (\n
\n \n
\n );\n }\n\n private _getEmptyThumbnailItem(\n imageSettings: IImageSettings | undefined,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: 'empty',\n 'aria-label': '',\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n }\n\n private readonly isFirstItem = () => this.state.activeIndex === 0;\n\n private readonly isLastItem = () => {\n const images = this.state.mediaGalleryItems;\n return images && this.state.activeIndex === images.length - 1;\n };\n\n private readonly openModalDialog = (): void => {\n this._toggleModal();\n };\n\n private _toggleModal(): void {\n if (this.state.modalIsOpen) {\n this.fullScreenOverlayButtonRef.current?.focus();\n const parentDiv = this._inlineZoomDivRef.get(this.state.activeIndex);\n if (parentDiv && parentDiv.children && parentDiv.children.length >= 2) {\n const image = parentDiv.children[1].querySelector('img');\n if (image) {\n image.removeAttribute('style');\n }\n }\n this.setState({\n isImageZoomed: false\n });\n }\n this.setState({\n isImageZoomed: false,\n modalIsOpen: !this.state.modalIsOpen\n });\n removeInlineZoomStyle();\n removeContainerZoomStyle();\n }\n\n private readonly imageModalSlider = (ZoomView: string): React.ReactElement => {\n const {\n data: {\n product: { result: product }\n },\n resources\n } = this.props;\n let mediaGalleryItems = this.state.mediaGalleryItems;\n\n if (!mediaGalleryItems && product) {\n mediaGalleryItems = [this._mapProductToImageData(product)];\n }\n const carouselprops = {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items:\n mediaGalleryItems &&\n mediaGalleryItems.map((item: IImageData, index: number) =>\n this._renderCarouselItemImageView(ZoomView, item, this._zoomedImageSettings, index, true)\n ),\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: true,\n hideIndicator: false,\n keyboard: false,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n isDisabledFunctionality: this.state.isMobileImageZoomed\n } as IComponentNodeProps;\n const carousel = ;\n\n const imageModalSliderProps: IModalViewProps = {\n modalIsOpen: this.state.modalIsOpen,\n ontoggle: this._toggleModal,\n galleryCarousel: carousel,\n classNames: classnames('ms-media-gallery__modal', 'msc-modal-input-required')\n };\n return ImagefullView(imageModalSliderProps) as React.ReactElement;\n };\n\n private shouldUseCmsAltText = (): boolean => {\n if (this.props.config.altTextSource === 'product') {\n return false;\n } else {\n return true;\n }\n };\n}\n\nexport default MediaGallery;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IMediaGalleryThumbnailItemViewProps, IMediaGalleryThumbnailsViewProps, IMediaGalleryViewProps } from '../..';\n\nconst MediaGalleryView: React.FC = props => {\n const { CarouselProps, Thumbnails, MediaGallery, Modal } = props;\n\n return (\n \n \n {Modal}\n {_renderThumbnails(Thumbnails)}\n \n );\n};\n\nconst _renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps): JSX.Element => {\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps, items } = thumbnails;\n\n return (\n \n {items && items.map(_renderThumbnailItem)}\n \n );\n};\n\nconst _renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\n const { ThumbnailItemContainerProps, Picture } = thumbnail;\n\n return {Picture};\n};\n\nexport default MediaGalleryView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IImageData, IRequestContext, IVideoData } from '@msdyn365-commerce/core';\n\nexport enum MediaType {\n /**\n * The None.\n */\n None = 0,\n /**\n * The Image type.\n */\n Image = 1,\n /**\n * The video type.\n */\n Video = 2,\n /**\n * The file type.\n */\n File = 3\n}\n\nexport interface IMediaData extends IImageData {\n mediaTypeValue?: MediaType;\n displayOrder?: number;\n videoData?: IVideoData;\n}\n\n/**\n * Gets correct alt text for image based on configuration of site.\n * @param productName Product name.\n * @param context Current request context.\n * @param imageAltText Alt-text from CMS image.\n */\nexport function getAltText(\n context: IRequestContext,\n shouldUseCmsAltText: boolean,\n productName?: string,\n imageAltText?: string\n): string | undefined {\n if (!context?.app?.config?.OmniChannelMedia) {\n return productName;\n }\n if (shouldUseCmsAltText) {\n return imageAltText;\n }\n return productName;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n commerceApiRequest,\n commerceVideoMetadataRequest,\n getCatalogId,\n IActionContext,\n IImageData,\n IImageSettings,\n IVideoData\n} from '@msdyn365-commerce/core';\nimport { MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n getMediaLocationsForSelectedVariant,\n MediaLocationsForSelectedVariantInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { getAltText } from './helper';\n\nasync function validateMediaLocationAsync(mediaLocation: MediaLocation): Promise<[IImageData, boolean]> {\n const imageData: IImageData = {\n src: mediaLocation.Uri || '',\n altText: mediaLocation.AltText || ''\n };\n if (mediaLocation.IsApplicableForChildEntities) {\n imageData.additionalProperties = { isApplicableForChildEntities: 'true' };\n }\n\n if (imageData.src === '') {\n return [imageData, false];\n }\n\n return new Promise<[IImageData, boolean]>(resolve => {\n try {\n const http = new XMLHttpRequest();\n http.open('HEAD', imageData.src!, true);\n\n http.addEventListener('load', () => {\n resolve([imageData, http.status === 200 || http.status === 201]);\n });\n\n http.addEventListener('error', () => {\n resolve([imageData, false]);\n });\n\n http.send();\n } catch {\n resolve([imageData, false]);\n }\n });\n}\n\nexport async function getValidProductImages(\n productId: number,\n channelId: number,\n actionContext: IActionContext,\n imageSettings: IImageSettings,\n selectedProduct?: SimpleProduct\n): Promise {\n const catalogId = getCatalogId(actionContext.requestContext);\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\n\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n .then(mediaLocations => {\n if (mediaLocations) {\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation))).then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n });\n }\n\n return [];\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n return [];\n });\n}\n\n/**\n * Gets product variant images on dimension change of buy-box module for Omni scenario.\n * @param productId Product record id.\n * @param shouldUseCmsAltText Alt-text source to use.\n * @param channelId Current channel id.\n * @param actionContext Current action context.\n * @param productName Product name.\n * @param selectedProduct Currently selected variant product.\n * @returns List of images.\n */\n\nexport async function getProductImages(\n productId: number,\n shouldUseCmsAltText: boolean,\n channelId: number,\n actionContext: IActionContext,\n productName?: string,\n selectedProduct?: SimpleProduct\n): Promise {\n const catalogId = getCatalogId(actionContext.requestContext);\n if (actionContext.requestContext?.params?.isPreview) {\n const response = await commerceApiRequest(actionContext.requestContext, 'msdyn365-ochannel-product-info', 'post', {\n productId: productId,\n channelId: channelId,\n catalogId: catalogId\n });\n if (response.status !== 200) {\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant for preview scenario');\n return [];\n }\n const previewImageData = response?.data as MediaLocation[];\n if (previewImageData) {\n return previewImageData.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\n displayOrder: mediaLocation.DisplayOrder,\n mediaTypeValue: mediaLocation.MediaTypeValue,\n additionalProperties: mediaLocation.IsApplicableForChildEntities\n ? {\n isApplicableForChildEntities: 'true'\n }\n : undefined\n };\n });\n }\n return [];\n }\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n .then(mediaLocations => {\n if (mediaLocations) {\n return mediaLocations.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\n displayOrder: mediaLocation.DisplayOrder,\n mediaTypeValue: mediaLocation.MediaTypeValue,\n additionalProperties: mediaLocation.IsApplicableForChildEntities\n ? {\n isApplicableForChildEntities: 'true'\n }\n : undefined\n };\n });\n }\n return [];\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n return [];\n });\n}\n\nexport async function validateProductImages(\n mediaLocations: MediaLocation[],\n actionContext: IActionContext,\n imageSettings: IImageSettings\n): Promise {\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation)))\n .then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to validate product images');\n return [];\n });\n}\n\n/**\n * GetVideoMetadataFromAPI - Makes API call to get video metadata.\n * @param videoId: Video Id\n * @param actionContext: Action context\n * @returns: Returns the meta data of the video.\n */\nexport async function getVideoMetadataFromApi(videoId: string, actionContext: IActionContext): Promise {\n let videoPlayerData: IVideoData | undefined;\n if (videoId) {\n const response = await commerceVideoMetadataRequest(actionContext.requestContext, [videoId]);\n\n if (response.status !== 200) {\n actionContext.telemetry.debug(`Unable to get video metadata for videoId: ${videoId}`);\n return;\n }\n\n const videoData = response.data as [];\n if (videoData && ArrayExtensions.hasElements(videoData)) {\n videoPlayerData = videoData[0];\n }\n }\n return videoPlayerData;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IImageData, IImageSettings, Image, Video } from '@msdyn365-commerce/core';\nimport {\n IMediaData,\n IMediaGalleryThumbnailItemViewProps,\n IMediaGalleryThumbnailsViewProps,\n IMediaGalleryViewProps,\n MediaType\n} from '@msdyn365-commerce-modules/media-gallery';\nimport { ArrayExtensions, getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, KeyCodes, Module, Node, NodeTag } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\nimport { IPlayerData, IPlayerOptions, IVideoMetadata, Player } from '@msdyn365-commerce-modules/video-player-utilities';\n\ninterface IMediaGalleryItemsProps extends IMediaGalleryThumbnailItemViewProps {\n Video?: React.ReactElement;\n}\n\n/**\n * Render the thumbnail item images.\n * @param thumbnail - The carousel thumbnail line props.\n * @returns Return HTML having thumbnail container props with image.\n */\nconst renderThumbnailItem = (thumbnail: IMediaGalleryItemsProps): JSX.Element => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\n const { ThumbnailItemContainerProps, Picture, Video } = thumbnail;\n\n return {Video ? Video : Picture};\n};\n\n/**\n * Gets the thumbnail item to display media gallery images.\n * @param image - The media gallery images.\n * @param imageSettings - Image settings for the image gallery items.\n * @param imageId - Image id.\n * @param modifiedActiveIndex - Modified Index of the images when selection changes.\n * @param props - The Media gallery view props from business layer.\n * @returns Return thumbnail view props which will be used to render images.\n */\nconst GetThumbnailItemComponent = (\n image: IImageData,\n imageSettings: IImageSettings,\n imageId: number,\n modifiedActiveIndex: number,\n props: IMediaGalleryViewProps,\n mediaTypeValue?: MediaType\n): IMediaGalleryThumbnailItemViewProps => {\n let fallbackImage: string | undefined = '';\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = props.context.app.config?.placeholderImageName as string;\n if (props.data.product.result) {\n fallbackImage = getFallbackImageUrl(\n props.data.product.result.ItemId,\n props.context.request.apiSettings,\n props.context.request.app?.config?.OmniChannelMedia\n );\n }\n if (emptyPlaceHolderImage && fallbackImage) {\n fallbackImage = `${fallbackImage},${emptyPlaceHolderImage}`;\n }\n\n /**\n * OnClick method of media gallery item.\n */\n const onClick = () => {\n props.callbackToggle?.();\n props.callbackThumbnailClick?.(imageId);\n props.state.activeIndex = imageId;\n };\n\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === imageId ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n /**\n * Keydown event of media gallery item.\n * @param event - React.KeyboardEvent.\n */\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.keyCode === KeyCodes.Enter) {\n event.preventDefault();\n onClick();\n }\n };\n const defaultIndex = 0;\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'presentation',\n key: imageId\n },\n Picture: (\n \n \n \n \n \n \n \n \n )\n };\n};\n\n/**\n * Render the video player.\n * @param mediaData - Media Data\n * @param index - Index of the video\n * @param activeIndex - Active Index\n * @param imageSettings - Image settings\n * @param props - Media gallery view props\n * @returns - JSX.Element.\n */\nconst RenderVideo = (\n mediaData: IMediaData,\n index: number,\n activeIndex: number,\n imageSettings: IImageSettings,\n props: IMediaGalleryViewProps\n): IMediaGalleryItemsProps => {\n const videoData = mediaData.videoData;\n if (videoData) {\n const options: IPlayerOptions = props.config as IPlayerOptions;\n const playerResources = props.resources;\n const videoMetaData: IVideoMetadata = {};\n videoMetaData.videoId = videoData.id;\n videoMetaData.title = videoData.title;\n videoMetaData.duration = videoData.playTime;\n if (videoData.thumbnail) {\n videoMetaData.posterframeUrl = videoData.thumbnail.src;\n }\n if (videoData._links?.binaryReferences) {\n videoMetaData.videoBinaryReferences = videoData._links.binaryReferences;\n }\n const videoPlayerData: IPlayerData = { options, metaData: videoMetaData };\n\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n index === activeIndex ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'presentation',\n key: index\n },\n Picture: <>,\n Video: (\n \n )\n };\n }\n return GetEmptyThumbnailItemComponent(imageSettings, props);\n};\n\n/**\n * Gets the empty thumbnail item to display media gallery images.\n * @param imageSettings - Image settings for the image gallery items.\n * @param props - The Media gallery view props from business layer.\n * @returns Return thumbnail view props which will be used to render empty images.\n */\nconst GetEmptyThumbnailItemComponent = (\n imageSettings: IImageSettings,\n props: IMediaGalleryViewProps\n): IMediaGalleryThumbnailItemViewProps => {\n let fallbackImage: string | undefined = '';\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = props.context.app.config?.placeholderImageName as string;\n\n if (props.data.product.result) {\n fallbackImage = getFallbackImageUrl(\n props.data.product.result.ItemId,\n props.context.request.apiSettings,\n props.context.request.app?.config?.OmniChannelMedia\n );\n }\n if (emptyPlaceHolderImage && fallbackImage) {\n fallbackImage = `${fallbackImage},${emptyPlaceHolderImage}`;\n }\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: 'ms-media-gallery__thumbnail-item',\n role: 'tab',\n tabIndex: 0,\n key: 0,\n 'aria-label': '',\n 'aria-selected': true\n },\n Picture: (\n \n )\n };\n};\n\n/**\n * Update media gallery items method.\n * @param items - The media gallery thumbnail item view props.\n * @returns The IImageData array.\n */\nconst getMediaGalleryItems = (items?: IMediaData[]): IMediaData[] | undefined => {\n return items?.map(item => {\n return {\n displayOrder: item.displayOrder,\n mediaTypeValue: item.mediaTypeValue,\n altText: item.altText,\n src: item.src,\n videoData: item.videoData\n };\n });\n};\n\nconst defaultThumbnailImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=295&h=295&q=80&m=6&f=jpg', w: 295, h: 295 },\n xl: { q: 'w=295&h=295&q=80&m=6&f=jpg', w: 295, h: 295 }\n },\n lazyload: true,\n cropFocalRegion: true\n};\n\n/**\n * Render the Media gallery thumbnails to represent images in grid view.\n * @param thumbnails - The thumbnail view props.\n * @param props - The media gallery view props.\n * @returns - The single slide carousel component to render as media gallery image.\n */\nconst renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps, props: IMediaGalleryViewProps): JSX.Element => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps } = thumbnails;\n const { state } = props;\n const mediaGalleryItems = getMediaGalleryItems(state.mediaGalleryItems);\n\n const items: IMediaGalleryItemsProps[] | undefined =\n // eslint-disable-next-line multiline-ternary -- need multiline for easy code reading\n state.lastUpdate && ArrayExtensions.hasElements(mediaGalleryItems) && mediaGalleryItems[0].src === 'empty'\n ? [GetEmptyThumbnailItemComponent(defaultThumbnailImageSettings, props)]\n : // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery\n mediaGalleryItems?.map((item: IMediaData, id: number) => {\n if (item.mediaTypeValue === MediaType.Video) {\n if (props.config.allowFullScreen) {\n const videoThumbnail = item.videoData?.thumbnail;\n if (videoThumbnail) {\n return GetThumbnailItemComponent(\n videoThumbnail,\n defaultThumbnailImageSettings,\n id,\n state.activeIndex,\n props,\n item.mediaTypeValue\n );\n } else {\n return GetEmptyThumbnailItemComponent(defaultThumbnailImageSettings, props);\n }\n } else {\n return RenderVideo(item, id, state.activeIndex, defaultThumbnailImageSettings, props);\n }\n } else {\n return GetThumbnailItemComponent(item, defaultThumbnailImageSettings, id, state.activeIndex, props);\n }\n });\n\n return (\n \n {items?.map(renderThumbnailItem)}\n \n );\n};\n\n/**\n * Render the Media gallery items using viewprops.\n * @param props - The media gallery view props.\n * @returns The media gallery module wrapping up images node.\n */\nconst mediaGalleryView: React.FC = props => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\n const { CarouselProps, Thumbnails, MediaGallery, Modal } = props;\n return (\n \n \n {Modal}\n {renderThumbnails(Thumbnails, props)}\n \n );\n};\n\nexport default mediaGalleryView;\n","module.exports = React;","module.exports = ReactDOM;"],"names":["findImagesSettingsInProps","props","onFound","Object","keys","forEach","key","match","findAndFixImageSettingsInProps","imageSettings","mode","viewports","q","replace","fixImageSettings","renderThumbnailItem","thumbnail","ThumbnailItemContainerProps","Picture","Video","React","Node","assign","GetThumbnailItemComponent","image","imageId","modifiedActiveIndex","mediaTypeValue","_props$context$app$co","_props$config$thumbna","fallbackImage","emptyPlaceHolderImage","context","app","config","placeholderImageName","_props$context$reques","data","product","result","getFallbackImageUrl","ItemId","request","apiSettings","OmniChannelMedia","onClick","_props$callbackToggle","_props$callbackThumbn","callbackToggle","call","callbackThumbnailClick","state","activeIndex","handleKeyDown","event","keyCode","KeyCodes","Enter","preventDefault","tag","className","classnames","role","Button","altText","id","onKeyDown","Image","requestContext","actionContext","gridSettings","thumbnailImageSettings","loadFailureBehavior","imageFallbackOptimize","shouldUseOptimizedImage","fallBackSrc","src","bypassHideOnFailure","MediaType","title","resources","playVideoTitleText","fullScreenTitleText","GetEmptyThumbnailItemComponent","_props$context$app$co2","_props$config$thumbna2","_props$context$reques2","tabIndex","skipImageValidation","defaultThumbnailImageSettings","xs","w","h","xl","lazyload","cropFocalRegion","renderThumbnails","thumbnails","ThumbnailsContainerProps","SingleSlideCarouselComponentProps","mediaGalleryItems","items","map","item","displayOrder","videoData","getMediaGalleryItems","lastUpdate","ArrayExtensions","hasElements","allowFullScreen","_item$videoData","videoThumbnail","RenderVideo","mediaData","index","_videoData$_links","options","playerResources","videoMetaData","videoId","duration","playTime","posterframeUrl","_links","binaryReferences","videoBinaryReferences","videoPlayerData","metaData","editProps","Player","playerData","isEditor","params","CarouselProps","Thumbnails","MediaGallery","Modal","Module","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","Error","prototype","RegistrationId","c","require","$type","da","name","path","runOn","iNM","ns","n","p","pdp","md","window","__bindings__","_objectSpread","viewDictionary","cn","constructor","_this","_ref","_props$config$zoomedI","super","this","_inlineZoomDivRef","Map","fullScreenOverlayButtonRef","player","mediaGalleryImages","defaultGalleryImageSettings","sm","lg","onExiting","setState","animating","onExited","next","removeInlineZoomStyle","undefined","isLastItem","nextIndex","goToIndex","updateZoomedInImage","previous","images","isFirstItem","length","autoplay","currentIndex","mediaItems","_mediaItems","_this$player$current","current","play","_this$player$current2","pause","_renderCarouselItemVideo","attributes","ref","_renderEmptyImage","_getCarouselItem","isInPopup","arguments","shouldSkipToMainImage","_getThumbnailItem","_generateOnThumbnailClick","_generateOnThumbnailKeyDown","getVideoThumbNailItem","classes","_refHandler","divRef","set","which","Space","_renderVideoThumbnail","openModalDialog","_toggleModal","imageModalSlider","ZoomView","_mapProductToImageData","carouselprops","Carousel","_renderCarouselItemImageView","_zoomedImageSettings","interval","directionTextPrev","previousScreenshotFlipperText","directionTextNext","nextScreenshotFlipperText","onIndicatorsClickHandler","showPaginationTooltip","hideIndicator","keyboard","handleOnExited","handleOnExiting","isDisabledFunctionality","isMobileImageZoomed","carousel","imageModalSliderProps","modalIsOpen","ontoggle","galleryCarousel","classNames","ImagefullView","shouldUseCmsAltText","altTextSource","bind","isImageZoomed","isInitialLoad","zoomedImageSettings","galleryImageSettings","_onImageMouseOut","_inlineZoomImageOnHover","_onInlineImageClick","_onContainerZoomImageClick","_onMouseOutLensContainer","isMobile","variant","VariantType","Viewport","_this$props$config$im","_this$props$context$r","source","imageSource","shouldUpdateOnPartialDimensionSelection","_setRenderType","mediaLocationsForSelectedVariant","_this$props$config$th","validateProductImages","_setImages","_this$props$config$th2","getValidProductImages","RecordId","channelId","productVariant","reaction","_product$productVaria","async","_this$props$context$a","_this$props$config$th3","getProductImages","Name","fireImmediately","mediaLocations","_this$props$config$th4","shouldComponentUpdate","nextProps","nextState","render","_this$props$config$im2","_this$props$context$a2","isVertical","thumbnailsOrientation","isFullscreenAllowed","zoomViewMode","imageZoom","_this$props$context$r2","_this$props$config$im3","mediaLocation","_mediaLocation$Uri","_this$props$data$prod","Uri","getAltText","AltText","curatedImages","_filterMasterImageFromVariant","mediaGalleryCarouselItems","_getMediaGalleryItems","mediaGalleryThumbnailCarouselItems","_getMediaGalleryThumbnailItems","viewProps","moduleProps","callbackThumbnailKeyDown","indicatorAriaText","ariaLabelForSlide","SingleSlideCarousel","vertical","flipperPrevLabel","flipperNextLabel","parentId","useTabList","JSON","stringify","renderView","_this$state$mediaGall","defaultKey","_getEmptyThumbnailItem","_this$state$mediaGall2","zoomView","curatedImage","mediaToSet","Promise","all","URL","searchParams","get","getVideoMetadataFromApi","error","telemetry","debug","then","filter","element","Date","now","media","_renderImageInContainerOnZoom","_renderImageFullScreenOnZoom","_renderImageInlineOnZoom","_this$props$config$sh","_this$props$data$prod2","_this$props$data$prod3","_this$props$data$prod4","shouldHidePrimaryImages","shouldHideMasterProductImagesForVariant","variantImages","isVariantProduct","ObjectExtensions","isNullOrUndefined","MasterProductId","itemId","_item$additionalPrope","additionalProperties","isApplicableForChildEntities","_this$props$config$da","dataScale","defaultDataScale","onMouseOver","onMouseMove","inlineZoomImageOnMouseMove","_this$props$config$da2","inlineZoomImageOnHover","String","_handleMobileViewZoomedImageClick","target","currentTarget","mobileZoomedInImageClassName","style","transform","classList","remove","parentElement","overflow","_this$props$config$da3","bounds","getBoundingClientRect","Number","positionX","clientX","left","positionY","clientY","top","scaledPositionX","scaledPositionY","add","scrollTo","_this$props$config$da4","innerWidth","inlineZoomInitClick","inlineZoomImageOnMouseOut","onContainerZoomInit","onMouseOutLensContainer","_this$props$config$da5","onMouseOut","onMouseMoveLensContainer","onMouseOverImageContainer","href","_product$PrimaryImage","PrimaryImageUrl","_this$fullScreenOverl","focus","parentDiv","children","querySelector","removeAttribute","removeContainerZoomStyle","_renderThumbnails","_renderThumbnailItem","productName","imageAltText","_context$app","validateMediaLocationAsync","imageData","IsApplicableForChildEntities","resolve","http","XMLHttpRequest","open","addEventListener","status","send","_unused","productId","selectedProduct","catalogId","getCatalogId","actionInput","MediaLocationsForSelectedVariantInput","getMediaLocationsForSelectedVariant","pairs","pair","catch","exception","_actionContext$reques","isPreview","response","commerceApiRequest","previewImageData","DisplayOrder","MediaTypeValue","_mediaLocation$Uri2","commerceVideoMetadataRequest","module","exports","ReactDOM"],"sourceRoot":""}