{"version":3,"file":"static/js/31d9502b7a306ba031f2.bundle.js","mappings":"0MAUO,MAAMA,IACGC,EAAAA,EAAAA,IAAAA,CAAXC,EAAAA,IAAW,kCAEAD,EAAAA,EAAAA,IAAAA,CAAXC,EAAAA,IAAW,6CAEAD,EAAAA,EAAAA,IAAAA,CAAXC,EAAAA,IAAW,iD,ICJEC,E,sFAAlB,SAAkBA,GACdA,EAAAA,SAAAA,iBACAA,EAAAA,QAAAA,UACAA,EAAAA,QAAAA,UACAA,EAAAA,KAAAA,OAJJ,CAAkBA,IAAAA,EAAc,KAU1B,MAAOC,EAOTC,YAAYC,EAAqBC,EAAcC,EAAyBC,EAAoBC,GAQrF,KAAAC,YAAc,IAAM,+BACpB,KAAAC,mBAAqB,IAAM,+BAC3B,KAAAC,cAAgB,IAAiB,OATpCC,KAAKC,YAAcT,EACnBQ,KAAKE,gBAAkBT,EACvBO,KAAKN,eAAiBA,EACtBM,KAAKL,UAAYA,EACjBK,KAAKJ,UAAYA,GA+BzBO,eAAeC,EACXC,EACAC,EACAC,GAEA,MAAMC,EAA2C,CAC7CC,sBAAuB,CACnBC,gBAAiBL,EAAMJ,aAAeI,EAAMJ,YAAYU,OAAS,EAAIN,EAAMJ,YAAc,GACzFW,QAAS,CACLC,WAAYN,EAAIO,eAAeC,YAAYC,UAC3CC,WAAYV,EAAIO,eAAeC,YAAYG,YAGnDC,UAAWd,EAAMV,UACjByB,UAAWf,EAAMT,UACjBP,eAAgBgB,EAAMX,gBAGpB2B,QAA0BC,EAAAA,EAAAA,2BAC5B,CAAEC,cAAehB,EAAKiB,oBAAqB,CAAEC,OAAQ,CAAEC,IAAKrB,EAAMH,mBAClEM,GAGAa,GAAqBA,EAAkBV,OAAS,GAEhDU,EAAkBM,KACbC,GACIA,EAAKC,SAAWD,EAAKC,UAAWC,EAAAA,EAAAA,kBAAiBF,EAAKC,SAAUtB,EAAIO,eAAeC,aAAe,KAG3GT,EAAYyB,iBAAmBV,GAE/Bd,EAAIyB,UAAUC,MAAd,mGAAgHzB,EAAenB,iBAIhI,MAMP,GANoD6C,EAAAA,EAAAA,IAA2B,CAC3EC,GAAI,iEACJC,OAtDGjC,eAA0CE,EAAyBE,GAEtE,IAAKF,IAAUA,EAAMJ,YACjB,MAAM,IAAIoC,MAAM,oEAGpB,MAAM/B,EAA+B,GAE/BgC,EAAsB,CACxBlC,EAAgBC,EAAOC,EAAaC,IAExC,OAAOgC,QAAQC,IAAIF,GAAqBG,MAAK,IAClCnC,KA2CXD,MA9DiBqC,GACV,IAAIpD,I,aChBT,MAAOqD,UAAqCC,EAAAA,EAAlDrD,c,oBACW,KAAAO,mBAAqB,IAAM,kCAC3B,KAAAC,cAAgB,IAA0B,eA2ErD,SAAemC,EAAAA,EAAAA,IAA2B,CACtCC,GAAI,gEACJC,OAjDJjC,eACIE,EACAE,GAIA,MAAMsC,EAA6C,GACnDA,EAAoBjC,QAAU,CAAEC,UAAWN,EAAIO,eAAeC,YAAYC,UAAWC,UAAWV,EAAIO,eAAeC,YAAYG,WAC/H2B,EAAoBC,WAAa,GACjCD,EAAoBE,mBAAoB,EACxCF,EAAoBG,sBAAuB,EAE3CH,EAAoBnC,gBAAkBL,EAAMb,WAC5C,MAAMyD,GAAUC,EAAAA,EAAAA,uBACZ,CACI3B,cAAehB,EACfiB,oBAAqBnB,EAAMmB,qBAE/BqB,GAmBJ,MAAO,CACHM,gBAjBuDF,GAEftB,KAAIyB,IAC5C,MAAMC,GAAcC,EAAAA,EAAAA,yBAChBF,EACA7C,EAAIO,eAAeC,aAOvB,OAJIsC,IACAD,EAAoBG,gBAAkBF,GAGlCD,KAMRI,MAAOP,EAAQQ,SAASD,OAAS,EAEjCE,gBAAiBb,EAAoBC,WACrCa,oBAAqBtD,EAAMuD,WAQ/BvD,MAxEiBwD,IACjB,MAAMxD,GAAQyD,EAAAA,EAAAA,GAA0BD,EAAMlB,GAc9C,OAXItC,EAAMmB,oBAAoBC,QAAUoC,EAAKE,SACzC1D,EAAMmB,oBAAoBC,OAAOC,IAAMmC,EAAKE,OAAOC,cAAgB,GAInE3D,EAAMmB,oBAAoBC,QAAUoC,EAAK/C,eAAemD,OAASJ,EAAK/C,eAAemD,MAAMC,OAC3F7D,EAAMmB,oBAAoBC,OAAO0C,MAAQN,EAAK/C,eAAemD,MAAMC,MAGvE7D,EAAMmB,oBAAoBgC,OAAQ,EAE3BnD,K,iBCnBX,IAAI+D,EAMG,MAAMC,EAA+BC,IACxC,MAAM,YAAEC,EAAF,UAAe5E,EAAf,UAA0BC,GAAc0E,EAE9C,IAAKC,EACD,OAGJH,GAAUI,EAAAA,EAAAA,kBAAiB,QAASF,EAAMG,iBAAmB,IAE7D,MAAMC,EAAgC,GAMtC,OAJAH,EAAY5C,KAAIC,IACZ8C,EAAWC,KAAKC,EAAchD,EAAMjC,EAAWC,EAAW0E,OAGvD,CAAEO,KAAMH,IAGbE,EAAgB,CAAChD,EAAwBjC,EAAmBC,EAAmB0E,KACjF,MAAMQ,EACFlD,EAAKmD,OAASnD,EAAKmD,MAAMC,QAAQ,IAAIC,OAAJ,WAAetF,EAAf,KAA6B,MAAO,IAAIqF,QAAQ,IAAIC,OAAJ,WAAerF,EAAf,KAA6B,MAAO,IACzHwE,EAAQc,cAAcC,MAAQL,EAC9B,MAAMM,GAAYC,EAAAA,EAAAA,wBAAuBf,EAAMG,iBAAmBL,GAClE,OACIkB,EAAAA,cAAAA,KAAAA,CAAIC,UAAU,uCAAuCC,IAAK5D,EAAK6D,IAC3DH,EAAAA,cAAAA,IAAAA,OAAAA,OAAAA,CAAA,aAAeR,EAAWY,KAAMC,EAAc/D,EAAMjC,EAAWC,EAAW0E,IAAYc,GACjFO,EAAc/D,EAAMjC,EAAWC,EAAW0E,IACvCsB,EAAoBhE,EAAKmD,MAAQnD,EAAKmD,MAAQ,GAAIpF,EAAWC,MAM3E+F,EAAgB,CAACE,EAA8BlG,EAAmBC,EAAmB0E,KACvF,MAAM,cAAEwB,EAAF,UAAiBC,GAAczB,EAE/B0B,EAAiBH,EAAWd,MAC7BC,QAAQ,IAAIC,OAAJ,WAAetF,EAAf,KAA6B,MAAO,IAC5CqF,QAAQ,IAAIC,OAAJ,WAAerF,EAAf,KAA6B,MAAO,IAC3CqG,EAAQH,GAAiB,GAC/B,OAAOE,GAAiBA,EAAcrF,OAAS,EAAxC,UACEsF,GADF,QACkC,IAAxBA,EAAMC,QAAQ,KAAc,IAAM,KAD5C,OACkDH,EADlD,YAC+DC,GAChEC,GAGJL,EAAsB,CAACC,EAAoBlG,EAAmBC,KAChE,MAAMuG,EAAgBN,EACjBb,QAAQ,IAAIC,OAAJ,WAAetF,EAAf,KAA6B,MAAO,YAC5CqF,QAAQ,IAAIC,OAAJ,WAAerF,EAAf,KAA6B,MAAO,aAGjD,OAAO0F,EAAAA,cAAAA,OAAAA,CAAMc,yBAAyBC,EAAAA,EAAAA,IAAgBF,M,6lBClC1D,IAAI/B,EACAK,EAMG,MAAM6B,EAA+BhC,IACxC,MAAM,YACFC,EADE,UAEF3E,EAFE,UAGFD,EACA4G,kBACIC,SAAS,cAAEC,GACXC,WAAW,yBAAEC,IANf,WAQFC,EARE,SASFC,EATE,kBAUFC,GACAxC,EACEI,EAA4C,GAIlD,GAHAD,EAAmBH,EAAMG,iBACzBL,GAAUI,EAAAA,EAAAA,kBAAiB,QAASF,EAAMG,iBAAmB,KAExDF,EACD,OAGJA,EAAY5C,KAAIC,IACZ8C,EAAWC,KAAKC,EAAchD,EAAMjC,EAAWC,EAAW6G,EAAenC,EAAOsC,EAAYC,EAAUC,OAK1G,MAAO,CAAEC,MAFSC,EAAaL,GAEJM,MAAOvC,IAGhCsC,EAAgBL,IAClB,MAAMO,EAA+BP,GAAsD,iBAE3F,OAAOrB,EAAAA,cAAAA,KAAAA,CAAIC,UAAU,yCAAyC2B,IAG5DtC,EAAgB,CAClBhD,EACAjC,EACAC,EACA6G,EACAnC,EACAsC,EACAC,EACAC,KAEA,MAAMK,EACFvF,EAAKmD,OAASnD,EAAKmD,MAAMC,QAAQ,IAAIC,OAAJ,WAAetF,EAAf,KAA6B,MAAO,IAAIqF,QAAQ,IAAIC,OAAJ,WAAerF,EAAf,KAA6B,MAAO,IAEzH,MAAO,CACHiF,KAAMe,EAAoBhE,EAAKmD,MAAQnD,EAAKmD,MAAQ,GAAIpF,EAAWC,GACnEwH,UAAWC,EAAiBzF,EAAMuF,GAAoB,GAAI7C,GAC1DgD,MACI1F,EAAK6D,IACL7D,EAAK2F,QACL3F,EAAK2F,OAAOxC,OACZnD,EAAK2F,OAAOxC,MAAMyC,cAClBC,EAAa7F,EAAK2F,OAAOxC,MAAMyC,aAAc5F,EAAK2F,OAAOxC,MAAMyC,aAAcX,EAAUD,EAAYtC,GACvGoD,UAAWC,IACXC,SAAUC,EAAajG,EAAMjC,EAAWC,EAAW6G,EAAenC,EAAOwC,GACzE3E,GAAIP,EAAK6D,KAIXkC,EAAgB,KACX,CACHpC,UAAW,uCACXuC,IAAK,OAIPD,EAAe,CACjBjG,EACAjC,EACAC,EACA6G,EACAsB,EACAjB,KAEA,MAAMhC,EACFlD,EAAKmD,OAASnD,EAAKmD,MAAMC,QAAQ,IAAIC,OAAJ,WAAetF,EAAf,KAA6B,MAAO,IAAIqF,QAAQ,IAAIC,OAAJ,WAAerF,EAAf,KAA6B,MAAO,IAEzHwE,EAAQc,cAAc8C,MAAQpG,EAAK6D,GACnC,MAAML,GAAYC,EAAAA,EAAAA,wBAAuBZ,EAAmBL,GACtD6D,EAAUtC,EAAc/D,EAAMjC,EAAWC,EAAW6G,GAEpDyB,EADmBD,EAAQ/B,QAAQY,IACO,EAAImB,EAAQjD,QAAR,WAAoB8B,GAAqB,IAAMmB,EAEnG,OAAO,EAAP,GACI1C,UAAW,uCACXuC,IAAK,IACL,aAAchD,EACdY,KAAMwC,GACH9C,GALP,IAMI+C,QAAUC,IACNA,EAAEC,iBAEEC,MAEAA,KAAKC,KAAK,CACNC,WAAY,cACZC,YAAaV,EAAYvI,WACzBkJ,YAAa,4BAIjBC,EAAAA,GAAAA,WAAsBT,IACtBU,OAAOC,SAASnD,KAAOwC,OAMjCvC,EAAgB,CAACE,EAA8BlG,EAAmBC,EAAmB6G,KAAiC,UACxH,MAAMT,EAAiBH,EAAWd,MAC7BC,QAAQ,IAAIC,OAAJ,WAAetF,EAAf,KAA6B,MAAO,IAC5CqF,QAAQ,IAAIC,OAAJ,WAAerF,EAAf,KAA6B,MAAO,IAC3CkJ,EAAsBjD,IAAU,UAAIA,EAAWkD,2BAAf,iBAAI,EAAgCC,MAAMC,GAAiD,4BAAlBA,MAAAA,OAAA,EAAAA,EAAUC,cAAnF,iBAAI,EAAkHnE,aAAtH,aAAI,EAAyHoE,WAEnK,IAAIC,EAAavD,EAAWd,OAASc,EAAWJ,IAC1C4D,EAAAA,EAAAA,uBAAsBrD,EAAgBH,EAAWJ,GAA0BgB,OAAe6C,GAC1F,GACN,MAAMC,EAA+C,IAAxBT,IAA8BM,EAAWI,SAAS,KAApB,qBAAyCV,GAAzC,qBAA+EA,KAA0B,GAEpK,OADAM,GAAcG,EACPH,GAGLxD,EAAsB,CAACC,EAAoBlG,EAAmBC,KAChE,MAAMuG,EAAgBN,EACjBb,QAAQ,IAAIC,OAAJ,WAAetF,EAAf,KAA6B,MAAO,YAC5CqF,QAAQ,IAAIC,OAAJ,WAAerF,EAAf,KAA6B,MAAO,aAGjD,OACI0F,EAAAA,cAAAA,OAAAA,CAAMC,UAAU,sDAAsDa,yBAAyBC,EAAAA,EAAAA,IAAgBF,MAIjHsB,EAAe,CACjBgC,EACAC,EACA7C,EACAD,EACAtC,KAEA,MACIiC,kBAAkB,QAAEC,GADlB,UAEFE,GACApC,EAEJ,OACIgB,EAAAA,cAACqE,EAAAA,eAAc,CACXxH,GAAI0E,EACJ+C,SAAUhD,EACVJ,QAASA,EACTqD,cAAeH,EAAYhD,EAAUoD,UAAY,GACjDC,KAAM,CACFzC,MAAO,CACH0C,wBAAyBP,EACzBQ,UAAWP,IAGnBnE,UAAU,gDAKhB8B,EAAmB,CAACxB,EAA8BsB,EAAiB7C,KACrE,MACIiC,kBACIC,SACI0D,SAAS,aAAEC,IAEfpG,QAAQ,cAAEqG,KAEd9F,EAKJ,GAJI8F,IACAA,EAAcC,iBAAkB,IAG/BxE,IAAeA,EAAWhE,SAE3B,OADAyC,EAAMtC,UAAUC,MAAM,2DACf,KAaX,OACIqD,EAAAA,cAACgF,EAAAA,GAAK,CACFnD,QAASA,EACT5B,UAAU,2CACVgF,IAAK1E,EAAWhE,SAChBsI,aAAcA,EACdC,cAAeA,GAhBsB,CACzCI,UAAW,CACPC,GAAI,CAAEC,EAAG,gBAAiBC,EAAG,EAAGC,EAAG,GACnCC,GAAI,CAAEH,EAAG,gBAAiBC,EAAG,EAAGC,EAAG,GACnCE,GAAI,CAAEJ,EAAG,gBAAiBC,EAAG,EAAGC,EAAG,IAEvCG,UAAU,EACVV,iBAAiB,GAUbW,oBAAoB,U,kBCpOhC,IAAI5G,EAMG,MAAM6G,EAAgC3G,IACzC,MAAM,YACFC,EADE,WAEF/E,EACA+G,kBACIG,WAAW,0BAAEwE,KAEjB5G,EAEJ,IAAKC,EACD,OAGJ,MAAMG,EAAgC,GACtCN,GAAUI,EAAAA,EAAAA,kBAAiB,QAASF,EAAMG,iBAAmB,IAE7DF,EAAY5C,KAAIC,IACZ8C,EAAWC,KAAKC,EAAchD,EAAM0C,EAAOA,EAAMiC,sBAKrD,MAAO,CAAEQ,MAFSC,EAAakE,EAA2B1L,GAE/BqF,KAAMH,IAG/BsC,EAAe,CAACkE,EAAmC1L,KACrD,MAAM2L,EAAgCD,GAChCE,EAAAA,EAAAA,QAAOF,EAA2B1L,GADuB,kBAE9CA,EAF8C,mBAI/D,OAAO8F,EAAAA,cAAAA,KAAAA,CAAIC,UAAU,0CAA0C4F,IAG7DvG,EAAgB,CAClBhD,EACAmG,EACAsD,KAEA,MAAM,UAAE1L,EAAF,UAAaC,GAAcmI,EAE3BuD,EAAa1J,EAAKmD,OAASnD,EAAKmD,MAAMwG,MAAM,KAAKC,MACjD1G,EAAYwG,EACZA,EAAWtG,QAAQ,IAAIC,OAAJ,WAAetF,EAAf,KAA6B,MAAO,IAAIqF,QAAQ,IAAIC,OAAJ,WAAerF,EAAf,KAA6B,MAAO,IACvGgC,EAAKmD,OAASnD,EAAKmD,MAAMC,QAAQ,IAAIC,OAAJ,WAAetF,EAAf,KAA6B,MAAO,IAAIqF,QAAQ,IAAIC,OAAJ,WAAerF,EAAf,KAA6B,MAAO,IAC3HwE,EAAQc,cAAcC,MAAQvD,EAAKmD,MACnC,MAAMK,GAAYC,EAAAA,EAAAA,wBAAuB0C,EAAYtD,iBAAmBL,GAClE6D,EAAUwD,EAAiB7J,EAAMyJ,GACvC,OACI/F,EAAAA,cAAAA,KAAAA,CAAIC,UAAU,wCAAwCC,IAAK5D,EAAK6D,IAC5DH,EAAAA,cAAAA,IAAAA,OAAAA,OAAAA,CAAA,aACgBR,EACZY,KAAMuC,GACF7C,EAAS,CAEb+C,QAAUC,IACNA,EAAEC,iBAEEC,MAEAA,KAAKC,KAAK,CACNC,WAAY,cACZC,YAAaV,EAAYvI,WACzBkJ,YAAa,8BAIjBC,EAAAA,GAAAA,WAAsBV,IACtBW,OAAOC,SAASnD,KAAOuC,MAI9BA,GAAWrC,EAAoBhE,EAAKmD,MAAQnD,EAAKmD,MAAQ,GAAIpF,EAAWC,MAMnF6L,EAAmB,CAAC5F,EAA8BvB,KAAgE,UACpH,MAAMoH,EAAY,UAAG7F,EAAWkD,2BAAd,iBAAG,EAAgCC,MAAKC,GAA6B,iBAAjBA,EAASC,aAA7D,iBAAG,EAAmFnE,aAAtF,aAAG,EAA0F4G,YACzGC,EAAa/F,EAAWJ,GAE9B,OAAOI,GAAc6F,GAAgBE,EAAaC,EAAoBH,EAAcE,EAAYtH,GAAS,IAGvGuH,EAAsB,CAACH,EAAsBE,EAAoBtH,KACnE,GAAIqE,EAAAA,GAAAA,UAAoB,CACpB,MAAMmD,EAAOlD,OAAOC,SAASkD,OACvBC,EAAoBN,EACrBO,cACAjH,QAAQ,MAAO,KACfA,QAAQ,KAAM,IACdA,QAAQ,MAAO,KACdkH,GAA0BC,EAAAA,EAAAA,IAAeH,EAAkBT,MAAM,KAAKa,OAAO,GAAI9H,EAAMkC,QAAQ0D,SAASmC,KAAK,KAEnH,MAAO,GAAP,OAAUP,EAAV,YAAkBI,EAAlB,YAA6CN,EAA7C,QAMFhG,EAAsB,CAACC,EAAoBlG,EAAmBC,KAChE,IAAIuG,EAAgBN,EACfb,QAAQ,IAAIC,OAAJ,WAAetF,EAAf,KAA6B,MAAO,YAC5CqF,QAAQ,IAAIC,OAAJ,WAAerF,EAAf,KAA6B,MAAO,aAIjD,OAHAuG,EAAgBA,EAAcoF,MAAM,KAAKC,OAAS,GAG3ClG,EAAAA,cAAAA,OAAAA,CAAMc,yBAAyBC,EAAAA,EAAAA,IAAgBF,MCnH7CmG,EAAiBhI,IAC1B,MAAM,UACFyB,EADE,kBAEFwG,EAFE,gBAGFC,EAHE,qBAIFC,EAJE,gBAKFC,EALE,kBAMFC,EANE,SAOFC,EAPE,oBAQFC,EARE,yBASFC,EATE,MAUF7I,EAVE,gBAWF8I,EAXE,gBAYFC,EAZE,gBAaFC,EAbE,aAcFC,GACA5I,EAEE6I,EAAiB/E,IACnBuE,EAAkBvE,EAAEgF,OAAOC,OAAS,KAGlCC,EAAad,EAaflH,EAAAA,cAAAA,QAAAA,CACIC,UAAU,0BACVgI,KAAK,OAAM,aACCP,EACZQ,KAAMzH,EACN0H,YAAalB,EACbmB,IAAKhB,EACLiB,SAAUR,EACVE,MAAOpJ,IApBXqB,EAAAA,cAAAA,QAAAA,CACIC,UAAU,0BACVgI,KAAK,OAAM,aACCd,EAAuB,kBAAoB,mBACvDe,KAAMzH,EACN0H,YAAalB,EACbmB,IAAKhB,EACLiB,SAAUR,EACVS,UAAWhB,EACXS,MAAOpJ,IAeT4J,GAAiBhB,GACnBvH,EAAAA,cAACwI,EAAAA,OAAM,CACHvI,UAAU,+BAA8B,aAC5B0H,EACZ9E,QAAUC,GAA2C8E,EAAa9E,EAAG,qBAa7E,MAAO,CAAE/H,MAAOiN,EAAWS,UARvBzI,EAAAA,cAACwI,EAAAA,OAAM,CACHvI,UAAYsH,EAAuD,uCAAjC,+BAAuE,aAC7FE,EACZ5E,QAAS2E,EACTS,KAAK,WAIwCS,UAAWH,IC5EvDI,EAAkB3J,IAC3B,MAAM,iBACF4J,EADE,sBAEFC,EAFE,qBAGF1B,EAHE,WAIF2B,EAJE,qBAKFC,EALE,gBAMF7B,EANE,yBAOFM,EAPE,iBAQFrI,GACAH,EACEF,GAAUI,EAAAA,EAAAA,kBAAiB,QAASC,EAAkB2J,EAAY,IAClEE,GAAajJ,EAAAA,EAAAA,wBAAuBZ,EAAkBL,GAE5D,OACIkB,EAAAA,cAAAA,MAAAA,CAAKC,UAAW2I,GACZ5I,EAAAA,cAACwI,EAAAA,OAAMS,OAAAA,OAAAA,CACHhJ,UAAU,kBAAiB,gBACZkH,EAAoB,aACvB0B,EACZhG,QAAS2E,EACT0B,SAAUH,GACNC,IAEF9B,GACElH,EAAAA,cAAAA,OAAAA,CAAMC,UAAU,uBAAsB,eAAc,GAC/C6I,M,ykBC2BzB,MAAMK,WAAenJ,EAAAA,UAkBjB/F,YAAY+E,GACRoK,MAAMpK,GAZF,KAAA3E,UAAoB,IACpB,KAAAC,UAAoB,IACpB,KAAA+O,SAAmB,IA2PnB,KAAAC,gBAAmBxG,IACvB,MAAM,YAAE7D,GAAgBvE,KAAK6O,MAEzBtK,GAAeA,EAAYxC,kBAAuD,OAAnCqG,EAAEgF,OAAO0B,QAAQ,eAChE9O,KAAK+O,0BAIL,KAAAC,OAAU5G,IACd,MAAM,YAAE7D,GAAgBvE,KAAK6O,MAEzBtK,GAAeA,EAAYxC,kBAAoBqG,EAAE6G,UAAYC,EAAAA,SAAAA,OAC7DlP,KAAK+O,yBACE/O,KAAK6O,MAAMpC,sBAAwBrE,EAAE6G,UAAYC,EAAAA,SAAAA,QACpDlP,KAAK6O,MAAMpC,sBACXzM,KAAKmP,SAAS,CAAE1C,sBAAsB,IAIvCzM,KAAKoP,cAAcC,SAAWrP,KAAKoP,cAAcC,QAAQC,SAASlH,EAAEgF,SACtEpN,KAAKuP,qBAAqBF,SAAWrP,KAAKuP,qBAAqBF,QAAQC,SAASlH,EAAEgF,UAC/E7I,GAAeA,EAAYxC,kBAC3B/B,KAAK+O,yBAGL/O,KAAK6O,MAAMpC,sBACXzM,KAAKmP,SAAS,CAAE1C,sBAAsB,MAK1C,KAAAsC,uBAAyB,KAC7B,MACIvI,SAAS,cAAEC,GACXsD,MAAM,YAAEyF,IACRxP,KAAKsE,MAELtE,KAAK0M,gBAAgB2C,SAAWrP,KAAK0M,gBAAgB2C,QAAQhC,MAAM1M,OAAS,IAC5E6O,EAAYhQ,WAAa,GACzBgQ,EAAYC,sBAAwB,GACpCD,EAAYE,2BAA6B,GACzCjJ,GAAgBA,EAAckJ,QAAOC,EAAAA,EAAAA,wBAAuBJ,GAAcA,GAC1ExP,KAAK0M,gBAAgB2C,QAAQhC,MAAQ,IAGzCrN,KAAKmP,SAAS,CAAE3P,WAAY,GAAI+E,iBAAa+E,EAAWuG,oBAAgBvG,KAGpE,KAAAwG,mBAAsB7L,MACrBA,GAASA,EAAMtD,OAASX,KAAK4M,WAC9B5M,KAAKmP,SAAS,CAAE3P,WAAYyE,IAG5BjE,KAAK+P,qBACL/P,KAAK+P,oBAAoBC,SAG7B,MAAM,UACFhO,EADE,QAEFwE,EACAuD,MAAM,YAAEyF,IACRxP,KAAKsE,MAET,GAAIkC,EAAS,CACT,GAAIvC,GAASA,EAAMtD,OAAS,EAAG,CAC3B,GAAIsD,EAAMtD,OAASX,KAAK4M,SACpB,OAGJ5M,KAAK+P,oBAAsBE,GAAAA,EAAS,KAChCC,EACI,IAAI5Q,EACA2E,EACAjE,KAAKE,gBACLF,KAAKmQ,mBAAmBnQ,KAAKoQ,qBAC7BpQ,KAAKL,UACLK,KAAKJ,WAET4G,EAAQC,eAEPhE,MAAK4N,IACFrQ,KAAKsQ,mBAAmBrM,GACnBxB,MAAKmB,IACF5D,KAAKmP,SAAS,CACV5K,YAAa8L,EAASR,eAAgBjM,EACtC2M,qBAAsBvQ,KAAKwQ,2BAA2BH,QAG7DI,OAAMxO,IACHjC,KAAKmP,SAAS,CACV5K,YAAa8L,EAASR,oBAAgBvG,EACtCiH,qBAAsBvQ,KAAKwQ,2BAA2BH,KAE1DrO,EAAU0O,UAAUzO,GACpBD,EAAU2O,MAAM,wCAG3BF,OAAMxO,IACHjC,KAAKmP,SAAS,CACV5K,iBAAa+E,EAAWuG,oBAAgBvG,EACxCiH,qBAAsBvQ,KAAKwQ,+BAE/BxO,EAAU0O,UAAUzO,GACpBD,EAAU2O,MAAM,2CAEzB3Q,KAAK2O,UAERiC,YAAW,KACP5Q,KAAK+P,wBACN,GAEHP,EAAYhQ,WAAayE,OAEzBjE,KAAKmP,SAAS,CAAE5K,iBAAa+E,EAAWuG,oBAAgBvG,IACxDkG,EAAYhQ,WAAa,GAE7BgH,EAAQC,cAAckJ,QAAOC,EAAAA,EAAAA,wBAAuBJ,GAAcA,KAIlE,KAAAW,mBAAsBU,IAC1B,GAAIA,GAAmBA,EAAgBlQ,OAAS,EAAG,CAC/C,MAAMmQ,EAAoC,GAQ1C,OAPAD,GACIA,EAAgBE,SAAQ,CAACC,EAAoBC,KACzCD,EAAmB3R,gBACfyR,EAAwBnM,KACpBqM,EAAmB3R,eAAe6R,OAAO,GAAGC,cAAgBH,EAAmB3R,eAAe+R,MAAM,OAG7GN,EAAwBzE,KAAK,KAExC,MAAO,oCAgBH,KAAAgF,cAAgBlR,MACpBiI,EAAwGkJ,KAExG,MACIvN,QAAQ,oBAAE8I,GACVrG,SAAS,cACLC,EACA8K,KACIxN,QAAQ,2BAAE2L,MAGlB1P,KAAKsE,MAEHL,EAAQjE,KAAK0M,gBAAgB2C,SAAWrP,KAAK0M,gBAAgB2C,QAAQhC,MAY3E,GAXAjF,EAAEC,iBAEEC,MAEAA,KAAKC,KAAK,CACNC,WAAY,cACZC,YAAaxE,EACbyE,YAA2B,oBAAd4I,EAAkC,kBAAoB,sBAItErN,GAAUA,GAA0B,IAAjBA,EAAMtD,QAAiBkM,EAC3C7M,KAAK0M,iBAAmB1M,KAAK0M,gBAAgB2C,SAAWrP,KAAK0M,gBAAgB2C,QAAQmC,YAClF,CACH,MAAMzL,EAAY2J,GAA8B,IAC1C+B,EAAYzR,KAAK0R,oBAAmBC,EAAAA,EAAAA,IAAW,SAAUlL,IAAkB,GAAIxC,EAAO8B,GACtF6L,QAAoB5R,KAAK6R,qBAAqB5N,GAE5B,MAAxB,GAAI6N,EAAAA,GAAAA,UACAC,SAASlJ,SAASnD,KAAlB,UAA0BkM,GAA4BH,SAAtD,aAAyB,EAAyCzM,QAAxC,IAAD,OAAqDhF,KAAKsE,MAAMiN,IAAIxN,OAAO+C,mBAAqB,MAO7H,KAAA+K,qBAAuB1R,MAAAA,IAC3B,MAAME,EAAQ,IAAIsC,EACd,SACA3C,KAAKsE,MAAMkC,QAAQ0D,QAAQnJ,YAC3B,CACIU,OAAQ,CACJC,IAAK,EACLyC,KAAM,GAEVX,OAAO,EACPwO,QAAS,IAEb,KACGhS,KAAKsE,MAAMkC,QAAQ0D,QAAQ+H,UAAUC,QAAU,GAClDjO,GACA,EACAjE,KAAKsE,MAAMkC,QAAQ0D,QAAQiI,OAC3BnS,KAAKsE,MAAMkC,QAAQ0D,QAAQkI,IAAIC,WAAWC,UAE9C,IAAIV,EAAc,GAClB,GAAIvR,MAAAA,GAAAA,EAAOb,WAAY,WACnB,MAAM+S,QAAuBC,EAAkBnS,EAAOL,KAAKsE,MAAMkC,QAAQC,eACnEgM,EAAgBF,EAAepP,UAAYoP,EAAepP,SAASxC,OAAS,IAA5D,UAAiE4R,EAAepP,SAAS,UAAzF,aAAiE,EAA4B4F,qBAC7G2J,EAAmBD,IAAiBA,MAAAA,GAAJ,UAAIA,EAAezJ,MAAK2J,GAAoB,iBAAbA,MAAAA,OAAA,EAAAA,EAAKzJ,cAApC,iBAAI,EAAwDnE,aAA5D,aAAI,EAA+D4G,aAEzG,OAD8CiG,EAA9Cc,GAAoBA,EAAiB/R,OAAuB+R,EAAiC,GACtFd,EAEX,OAAOA,GAGH,KAAAgB,0BAA4B,KAChC,MAAM,qBAAEnG,EAAF,YAAwBlI,GAAgBvE,KAAK6O,MAE9CpC,GAOGlI,GAAeA,EAAYxC,kBAC3B/B,KAAK+O,yBAGT/O,KAAKmP,SAAS,CAAE1C,sBAAsB,KAVtCzM,KAAKmP,SAAS,CACV1C,sBAAsB,EACtBjN,WAAY,GACZqT,gBAAgB,KAWpB,KAAAnB,mBAAqB,CAACzL,EAAehC,EAAe6O,IACpD7M,GAASA,EAAMtF,OAAS,EACjBsD,GAASA,EAAMtD,OAAS,EAAxB,UACEsF,GADF,QACkC,IAAxBA,EAAMC,QAAQ,KAAc,IAAM,KAD5C,OACkD4M,EADlD,YACyDC,mBAAmB9O,IAC7EgC,EAEH,GAGH,KAAAuK,2BAA8BwC,IAClC,GAAsD,OAAlDhT,KAAKiT,iCAAiC5D,QAAkB,CACxD,MAAM6D,EAAiBlT,KAAKiT,iCAAiC5D,QACvD8D,EAAsBnT,KAAKsE,MAAMoC,UAAU0M,wBAC3CC,EAAoBrT,KAAKsE,MAAMoC,UAAU4M,wBAG/C,OAFAJ,EAAeK,UAAYP,GAAWA,EAAOjR,kBAAoBiR,EAAOjR,iBAAiBpB,OAAS,EAAKwS,EAAsBE,EAC7HH,EAAeM,aAAa,YAAa,aAClCN,EAAeK,UAEtB,MAAO,IA9eXvT,KAAK0M,gBAAkBpH,EAAAA,YACvBtF,KAAKqO,qBAAuB/I,EAAAA,YAC5BtF,KAAKiT,iCAAmC3N,EAAAA,YACxCtF,KAAKuP,qBAAuBjK,EAAAA,YAC5BtF,KAAKoP,cAAgB9J,EAAAA,YACtBtF,KAAK6O,MAAQ,CACRpC,sBAAsB,EACtBjN,WAAY,GACZiU,0BAA2B,kCAC3BC,0BAA2B,kCAC3BC,2BAA4B,mCAC5BpP,iBAAa+E,EACbuG,oBAAgBvG,EAChBiH,qBAAsB,GACtBsC,gBAAgB,GAEpB7S,KAAK4M,SACA5M,KAAKsE,MAAMkC,SACRxG,KAAKsE,MAAMkC,QAAQ+K,KACnBvR,KAAKsE,MAAMkC,QAAQ+K,IAAIxN,QACvB/D,KAAKsE,MAAMkC,QAAQ+K,IAAIxN,OAAO6P,sBAClC,GACJ5T,KAAKoQ,oBAAsBpQ,KAAKsE,MAAMP,QAAU/D,KAAKsE,MAAMP,OAAO8P,wBAClE7T,KAAKE,gBAAkBF,KAAKsE,MAAMP,QAAU/D,KAAKsE,MAAMP,OAAO7D,gBAAkBF,KAAKsE,MAAMP,OAAO7D,gBAAkB,EACpHF,KAAK8T,gBAAkB,kBACvB9T,KAAKkO,iBAAmB,mBACxBlO,KAAKyE,kBAAmBsP,EAAAA,EAAAA,oBACpB/T,KAAKsE,MAAMkC,QAAQ0D,QAAQ8J,kBAC3BhU,KAAKsE,MAAM2P,aACXjU,KAAKsE,MAAMtC,WAIW,0BACtB8P,EAAAA,GAAAA,YACAC,SAASmC,MAAQnC,SAASmC,KAAKC,iBAAiB,YAAanU,KAAK4O,iBAClEhG,QAAUA,OAAOuL,iBAAiB,QAASnU,KAAKgP,SAIjDoF,uBACCtC,EAAAA,GAAAA,YACAC,SAASmC,MAAQnC,SAASmC,KAAKG,oBAAoB,YAAarU,KAAK4O,iBAAiB,GACtFhG,QAAUA,OAAOyL,oBAAoB,QAASrU,KAAKgP,QAAQ,IAI5DsF,qBACH,MACIvQ,QAAQ,gBAAEyI,IACVxM,KAAKsE,OACH,qBAAEmI,EAAF,eAAwBoG,GAAmB7S,KAAK6O,MAEjD7O,KAAKsE,MAAMkC,QAAQ0D,QAAQqK,OAAOC,YAC9BhI,GAAmBC,EACpBzM,KAAK0M,iBAAmB1M,KAAK0M,gBAAgB2C,SAAWrP,KAAK0M,gBAAgB2C,QAAQmC,QAC7EqB,GACR7S,KAAKqO,sBAAwBrO,KAAKqO,qBAAqBgB,SAAWrP,KAAKqO,qBAAqBgB,QAAQmC,SAMzGiD,SACH,MAAM,QACFjO,EACAE,WAAW,WAAE0H,EAAF,sBAAcD,EAAd,mBAAqCuG,EAArC,mBAAyDC,EAAzD,mBAA6EC,GACxF7Q,QAAQ,gBAAEyI,EAAF,oBAAmBK,EAAnB,sBAAwCgI,EAAxC,UAA+DtP,EAAY,KACnFvF,KAAKsE,OAEH,qBACFmI,EADE,WAEFjN,EAFE,0BAGFiU,EAHE,0BAIFC,EAJE,2BAKFC,EALE,YAMFpP,EANE,eAOFsL,GACA7P,KAAK6O,MAEH9I,EAAaS,GAAWA,EAAQ+K,KAAO/K,EAAQ+K,IAAIxN,QAAUyC,EAAQ+K,IAAIxN,OAAO2L,4BAA+B,IAC/G5J,GAAgB6L,EAAAA,EAAAA,IAAW,SAAUnL,GAAWA,EAAQC,gBAAkB,GAC1EgL,EAAYzR,KAAK0R,mBAAmB5L,EAAetG,EAAYuG,GAC/DwG,EAAoBsI,GAAyBA,EAAsBlU,OAAS,EAAIkU,EAAwB,qBAExGC,EACFvQ,GACAA,EAAYxC,kBACZwC,EAAYxC,iBAAiBgT,QACxBC,GAAWA,EAAE3V,iBAAmBA,EAAe4V,SAAWD,EAAE3V,iBAAmBA,EAAe6V,OAEjGC,EACF5Q,GACAA,EAAYxC,kBACZwC,EAAYxC,iBAAiBgT,QAAQC,GAAWA,EAAE3V,iBAAmBA,EAAe+V,UAClFC,EACF9Q,GACAA,EAAYxC,kBACZwC,EAAYxC,iBAAiBgT,QAAQC,GAAWA,EAAE3V,iBAAmBA,EAAeiW,WAElFC,EAAS,SACPvV,KAAKsE,OADE,IAGXmK,OAAQ,CACJ+G,YAAaxV,KAAKsE,MAClBiB,UAAW,GAAF,OAAKkQ,GAAAA,CAAW,YAAalQ,GAA7B,YAA2CsH,EAAsB,YAAc,gBAE5F6I,qBAAsB,CAClB5N,IAAK,MACLvC,UAAW,iCACX,YAAa,YACbmI,IAAK1N,KAAKiT,kCAEd0C,yBAA0B3V,KAAK6O,MAAM0B,qBACrC/Q,WAAYQ,KAAK6O,MAAMrP,WACvBoW,YAAa,CACTlI,IAAK1N,KAAKuP,qBACVhK,UAAW,0BAEfsQ,eAAgB,CACZtQ,UAAWkO,GAEfqC,eAAgB,CACZvQ,UAAWmO,GAEfqC,gBAAiB,CACbxQ,UAAWoO,GAEfqC,WAAY,CACRzQ,UAAW,GAAF,OAAKvF,KAAK8T,gBAAV,YAA6BrH,EAAuB,UAAY,YAE7EwJ,YAAa,CACTnO,IAAK,OACL4F,IAAK1N,KAAKoP,cACV7J,UAAW,wBACX,aAAc,SACdiI,KAAM,aACN0I,KAAM,SACN9T,OAAQqP,EACR0E,aAAc,MACdC,SAAUpW,KAAKqR,eAEnBgF,UAAW,CACPvO,IAAK,KACLvC,UAAWkQ,GAAAA,CAAW,wCAAyClQ,IAEnE+Q,UAAW,CACPxO,IAAK,KACLvC,UAAWkQ,GAAAA,CAAW,wCAAyClQ,IAEnEgR,WAAY,CACRzO,IAAK,KACLvC,UAAWkQ,GAAAA,CAAW,yCAA0ClQ,IAEpEiR,MAAOvI,EAAe,CAClBxB,qBAAsBA,EACtByB,iBAAkB,GAAF,OAAKlO,KAAKkO,iBAAV,YAA8BzB,EAAuB,UAAY,WACjF2B,WAAYA,EACZD,sBAAuBA,EACvBE,qBAAsBrO,KAAKqO,qBAC3B7B,gBAAiBA,EACjBM,yBAA0B9M,KAAK4S,0BAC/BnO,iBAAkBzE,KAAKyE,mBAE3BgS,KAAMnK,EAAc,CAChBS,gBAAiB2H,EACjB1H,gBAAiB2H,EACjB1H,gBAAiB2H,EACjBpI,gBAAiBA,EACjBE,gBAAiB1M,KAAK0M,gBACtBD,qBAAsBA,EACtBI,oBAAqBA,EACrBF,kBAAmB3M,KAAK8P,mBACxBhD,yBAA0B9M,KAAK4S,0BAC/BhG,SAAU5M,KAAK4M,SACf7G,UAAWA,EACXwG,kBAAmBA,EACnBtI,MAAOzE,EACPkX,UAAWjF,EACXvE,aAAclN,KAAKqR,gBAEvBsF,mBACInX,GAAcA,EAAWmB,OAAS,GAAKmU,GAAsBA,EAAmBnU,OAAS,EACnF0D,EAA4B,CAC1BoP,0BAA2BA,EAC3B3N,cAAeA,EACfC,UAAWA,EACXpG,UAAWK,KAAKL,UAChBC,UAAWI,KAAKJ,UAChB2G,iBAAkBvG,KAAKsE,MACvB9E,WAAYA,EACZ+E,YAAauQ,EACbrQ,iBAAkBzE,KAAKyE,wBAEzB6E,EACVsN,mBACIpX,GAAcA,EAAWmB,OAAS,GAAKwU,GAAsBA,EAAmBxU,OAAS,EACnF2F,EAA4B,CAC1BoN,0BAA2BA,EAC3B5N,cAAeA,EACfC,UAAWA,EACXpG,UAAWK,KAAKL,UAChBC,UAAWI,KAAKJ,UAChB2G,iBAAkBvG,KAAKsE,MACvB9E,WAAYA,EACZ+E,YAAa4Q,EACbnT,UAAWhC,KAAKsE,MAAMtC,UACtB4E,WAAY5G,KAAKsE,MAAMsF,SACvB/C,SAAU7G,KAAKsE,MAAMnC,GACrBsC,iBAAkBzE,KAAKyE,iBACvBiC,UAAW1G,KAAKsE,MAAMoC,UACtBI,kBAAmB9G,KAAKsE,MAAMiN,IAAIxN,OAAO+C,yBAE3CwC,EACVuN,oBACIrX,GAAcA,EAAWmB,OAAS,GAAK0U,GAAuBA,EAAoB1U,OAAS,EACrFsK,EAA6B,CAC3B0I,2BAA4BA,EAC5B7N,cAAeA,EACfC,UAAWA,EACXpG,UAAWK,KAAKL,UAChBC,UAAWI,KAAKJ,UAChB2G,iBAAkBvG,KAAKsE,MACvB9E,WAAYA,EACZ+E,YAAa8Q,EACbxF,eAAgBA,EAChBpL,iBAAkBzE,KAAKyE,wBAEzB6E,EACVwN,UAAW,CACPhK,yBAA0B9M,KAAK4S,2BAEnCnG,qBAAsBzM,KAAK6O,MAAMpC,qBACjCsK,oBAAqB/W,KAAK6R,uBAG9B,OAAO7R,KAAKsE,MAAM0S,WAAWzB,GA2ID,yBAAC/V,GAC7B,MAAQiH,cAAelG,GAAQP,KAAKsE,MAAMkC,QAC1C,OAAOyQ,EAAAA,EAAAA,+BACH,CAAE1V,cAAehB,GACjB,CACIG,gBAAiBlB,EACjBoB,QAAS,CACLC,WAAYN,EAAIO,eAAeC,YAAYC,UAC3CC,WAAYV,EAAIO,eAAeC,YAAYG,cAoH/D,a,qFCjkBA,MA6HMgW,EAAc,CAACT,EAA4BT,EAAwBC,IAEjE3Q,EAAAA,cAAC6R,EAAAA,KAAI5I,OAAAA,OAAAA,GAAKyH,GACN1Q,EAAAA,cAAC6R,EAAAA,KAAI5I,OAAAA,OAAAA,GAAK0H,GACLQ,EAAKzI,UACLyI,EAAKpW,MACLoW,EAAK1I,YAMhBqJ,EAA4B,CAACvB,EAA4BQ,EAAuBvB,IAE9EA,GACIxP,EAAAA,cAAC6R,EAAAA,KAAI5I,OAAAA,OAAAA,GAAKsH,GACNvQ,EAAAA,cAAC6R,EAAAA,KAAI5I,OAAAA,OAAAA,GAAK8H,GACLvB,EAAmBjQ,KAAKlD,KAAIkD,GAClBA,MAQzBwS,EAA4B,CAACvB,EAA4BQ,EAAuBnB,IAE9EA,GACI7P,EAAAA,cAAC6R,EAAAA,KAAI5I,OAAAA,OAAAA,GAAKuH,GACNxQ,EAAAA,cAAC6R,EAAAA,KAAI5I,OAAAA,OAAAA,GAAK+H,GACLnB,EAAmBpO,MACnBoO,EAAmBlO,MAAMtF,KAAI,CAACC,EAAMqP,IAE7B3L,EAAAA,cAAC6R,EAAAA,KAAI5I,OAAAA,OAAAA,GAAK3M,EAAK8F,UAAS,CAAElC,IAAK5D,EAAKO,IAAM8O,IACtC3L,EAAAA,cAAC6R,EAAAA,KAAI5I,OAAAA,OAAAA,GAAK3M,EAAKgG,UAGVhG,EAAKiD,WAapCyS,EAA6B,CAC/BvB,EACAQ,EACAgB,EACAlC,IAGIA,GACI/P,EAAAA,cAAC6R,EAAAA,KAAI5I,OAAAA,OAAAA,GAAKwH,GACNzQ,EAAAA,cAAC6R,EAAAA,KAAI5I,OAAAA,OAAAA,GAAKgI,GAGNjR,EAAAA,cAAC6R,EAAAA,KAAI,CAAC5R,UAAU,yCAAyCuC,IAAI,MACxDyP,GAGJlC,EAAoBxQ,KAAKlD,KAAIkD,GACnBA,MA+CzB2S,EAAyB,CAC3BlT,EACAmT,EACAtC,EACAE,KAIKA,GAAuBF,IACpB7P,EAAAA,cAAC6R,EAAAA,KAAI,CACDrP,IAAI,IACJvC,UAAS,UALF,yBAKE,qBACT2Q,KAAK,SACLxQ,KAAK,qBAELyC,QAAS,IAtDKhI,OAAAA,IAE1B,MAAM,WACFX,EACAuE,QAAQ,oBAAE8I,GACVrG,SAAS,cACLC,EACA8K,KACIxN,QAAQ,2BAAE2L,MAGlBpL,EAEEL,EAAQzE,GAAcA,EAE5B,IAAKyE,GAAUA,GAA0B,IAAjBA,EAAMtD,QAAiBkM,OAExC,CACH,MAAM9G,EAAY2J,GAA8B,IAC1C+B,EAAYC,GAAmBC,EAAAA,EAAAA,IAAW,SAAUlL,IAAkB,GAAIxC,EAAO8B,GAEnFuC,MAEAA,KAAKC,KAAK,CACNC,WAAY,cACZC,YAAanE,EAAM9E,WACnBkJ,YAAa,2BAIrB,MAAMkJ,QAAoBtN,EAAMyS,oBAAoB9S,GAEhD0E,EAAAA,GAAAA,YACAoJ,SAASlJ,SAASnD,KAAOkM,GAA4BH,KAqBlCiG,CAAsBpT,GACrCqT,SAAS,KAERF,GAMX/F,EAAqB,CAACzL,EAAehC,EAAe6O,IAClD7M,GAASA,EAAMtF,OAAS,EACjBsD,GAASA,EAAMtD,OAAS,EAAxB,UAA+BsF,GAA/B,QAA+D,IAAxBA,EAAMC,QAAQ,KAAc,IAAM,KAAzE,OAA+E4M,EAA/E,YAAsFC,mBAAmB9O,IAAWgC,EAExH,GAGX,EA9Q+C3B,IAC3C,MAAM,OACFmK,EADE,qBAEFiH,EAFE,yBAGFC,EAHE,WAIFnW,EAJE,YAKFoW,EALE,eAMFC,EANE,eAOFC,EAPE,gBAQFC,EARE,UASFM,EATE,UAUFC,EAVE,WAWFC,EAXE,KAYFE,EAZE,oBAaFI,EAbE,mBAcFF,EAdE,mBAeFC,EAfE,WAgBFZ,EAhBE,YAiBFC,EAjBE,MAkBFO,EACAhQ,SAAS,IAAE+K,GACX7K,WAAW,uBAAE+Q,EAAF,kBAA0BF,IACrCjT,EACEsT,EAAuBrG,EAAIxN,OAAO6T,sBAAwB,GACzDC,EAAcC,GAAoBxS,EAAAA,UAAe,GACxD,IAAIyE,EACAgO,EAAe,GACnB,MAAOC,EAAWC,GAAgB3S,EAAAA,UAAe,IAC1C4S,EAAWC,GAAgB7S,EAAAA,UAAe,GAC3C8S,EAAc,KACXJ,IACLC,GAAa,GACbE,GAAa,KAmCjB,GAhCD7S,EAAAA,WAAgB,KACRsD,OAAM,WAAeyP,KAAOzP,OAAM,WAAeyP,IAAI,UACpDtO,EAAOnB,OAAM,WAAeyP,IAAI,QAChCN,EAAgBhO,EAAKuO,aAEtBP,EAzCiB,cA0ChBD,GAAiB,GAEzB,MAAMS,EAAenQ,KACC,CAAC4P,UAAAA,KACiC,OAAnC5P,EAAEgF,OAAO0B,QAAQ,gBAC9BmJ,GAAa,GACbE,GAAa,KAKhBvP,OAAO4P,uBAAyB,SAASpQ,GAAM,MACtC8P,GAAsC,4BAAzB9P,MAAAA,GAAA,UAAAA,EAAGgF,cAAH,eAAW7H,aAC9B4S,GAAa,GACbF,GAAa,KAGjB,MAAMQ,EAAa,CAACZ,aAAAA,GAChBlP,EAAAA,GAAAA,WAAsB8P,IAErB1G,SAASmC,MAAQnC,SAASmC,KAAKC,iBAAiB,QAASoE,GAEzDxG,SAASmC,MAAQnC,SAASmC,KAAKC,iBAAiB,QAASvL,OAAO4P,2BAEvE,IAECX,EAAa,CACZ,MAAMa,EAAiBV,IAAcE,GAAgB1Y,GAAcA,EAAWmB,OAAS,IAAOuX,EAC9F,OACI5S,EAAAA,cAACqT,EAAAA,OAAMpK,OAAAA,OAAAA,GAAKE,GACJnJ,EAAAA,cAAC6R,EAAAA,KAAI,CAAE5R,UAAS,4BAAwBmT,EAAgB,OAAS,UAErEpT,EAAAA,cAAC6R,EAAAA,KAAI,CAAC5R,UAAU,oBAAoBqT,QAASR,GACxC5B,EACAU,EAAYT,EAA8BT,EAAYC,GACtDyC,EACGpT,EAAAA,cAAC6R,EAAAA,KAAI5I,OAAAA,OAAAA,GAAKqH,GACNtQ,EAAAA,cAAC6R,EAAAA,KAAI,CAAC5R,UAAW,kCACZmT,EAAgBpT,EAAAA,cAAC6R,EAAAA,KAAI5I,OAAAA,OAAAA,GAAKmH,GAAuBC,GAAmC,GAEpF0B,EAA0BvB,EAAgBQ,EAAWM,KAM9D,KAMZ,OACItR,EAAAA,cAACqT,EAAAA,OAAMpK,OAAAA,OAAAA,GAAKE,GAERnJ,EAAAA,cAAC6R,EAAAA,KAAI,CACD5R,UAAS,6BACJsR,GAAuBD,IAAuBpX,GAAcA,EAAWmB,QAAUiX,EAAuB,OAAS,UAG1HtS,EAAAA,cAAC6R,EAAAA,KAAI,CAAC5R,UAAU,qBACXiR,EACAU,EAAYT,EAA8BT,EAAYC,GAEtDzW,GAAcA,EAAWmB,QAAUiX,EAChCtS,EAAAA,cAAC6R,EAAAA,KAAI5I,OAAAA,OAAAA,GAAKqH,GACNtQ,EAAAA,cAAC6R,EAAAA,KAAI,CAAC5R,UAAW,kCACZ/F,GAAcA,EAAWmB,OAAS,EAAI2E,EAAAA,cAAC6R,EAAAA,KAAI5I,OAAAA,OAAAA,GAAKmH,GAAuBC,GAAmC,GAC1GyB,EAA0BvB,EAAgBQ,EAAWM,GACrDU,EAA0BvB,EAAgBQ,EAAWM,GACrDY,EAAuBlT,EAAOmT,EAAwBb,EAAoBC,GAC1ES,EAA2BvB,EAAiBQ,EAAYgB,EAAmBV,KAIpF,O,umBCpI5B,MAAMgC,EAAU,CAAEC,QAAS,GAAIC,YAAa,IAmBlCC,EAA8B,CAACC,EAAqBC,KAUlD,GADAL,EAAQE,YAAYE,GAAuBC,GACtCL,EAAQE,YAAYE,GAAqBE,QAC1C,MAAM,IAAI9W,MAAM,oBAAsB4W,EAAsB,mCAEhEJ,EAAQE,YAAYE,GAAqBE,QAAQC,UAAUC,eAAiBJ,EACxEJ,EAAQE,YAAYE,GAAqBE,QAAQC,UAAUjX,KAC3D0W,EAAQE,YAAYF,EAAQE,YAAYE,GAAqBE,QAAQC,UAAUjX,IAAM8W,IAMhGJ,EAAQC,QAAQ,eAAiB,CAC9BQ,EAAG,IAAMC,EAAQ,MACjBC,MAAO,gBACPC,GAAI,CAAC,CAACjM,KAAK,gBAAkBkM,KAAK,uDAAwDC,MAAO,GAAG,CAACnM,KAAK,WAAakM,KAAK,+EAAgFC,MAAO,GAAG,CAACnM,KAAK,cAAgBkM,KAAK,gFAAiFC,MAAO,IAEzUC,KAAK,EACLC,GAAI,YACJC,EAAG,cACHC,EAAG,YAEHC,IAAK,GAGLC,GAAI,2BAOAjB,EAF4B,gFACXO,EAAQ,MAQzBP,EAF4B,+EACXO,EAAQ,MAQzBP,EAF4B,uDACXO,EAAQ,MAMjC3Q,OAAOsR,aAAetR,OAAOsR,cAAgB,GAC7CtR,OAAOsR,aAAapB,QAApB,OACOlQ,OAAOsR,aAAapB,SAAW,IAC/BD,EAAQC,SAGXlQ,OAAOsR,aAAanB,YAApB,OACGnQ,OAAOsR,aAAanB,aAAe,IACnCF,EAAQE,aAEY,MAAMoB,EAAiB,GAC9BA,EAAe,uDAAyD,CAChFb,EAAG,IAAMC,EAAQ,MACjBa,GAAI,mCAEpBxR,OAAOsR,aAAetR,OAAOsR,cAAgB,GAC7CtR,OAAOsR,aAAaC,eAApB,OAC2BvR,OAAOsR,aAAaC,gBAAkB,IACtCA,I,4HCvFpB,SAASvK,EAAuBoD,GACnC,OAAO,IAAIqH,EAAAA,aAA0B,cAAerH,EAAQ,eAGhE,MAIasH,GAA6BpY,EAAAA,EAAAA,IAA2B,CACjEE,OAA8BmY,EAAAA,iBAC9Bla,MANoCqC,GAC7BkN,EAAuB,CAAEpQ,WAAY,OAQhD,K,MCvBAgb,EAAOC,QAAUnV,O,OCAjBkV,EAAOC,QAAUC,W","sources":["webpack://mattressfirm/./src/search-state.ts?dd10","webpack://mattressfirm/./src/modules/mfrm-search/actions/get-auto-suggest-suggestions.ts?6a0a","webpack://mattressfirm/./src/modules/mfrm-search/actions/get-full-products-by-search.ts?40b0","webpack://mattressfirm/./src/modules/mfrm-search/components/mfrm-search.keywordsuggest.tsx?d1cc","webpack://mattressfirm/./src/modules/mfrm-search/components/mfrm-search.productsuggest.tsx?fe87","webpack://mattressfirm/./src/modules/mfrm-search/components/mfrm-search.categorysuggest.tsx?964c","webpack://mattressfirm/./src/modules/mfrm-search/components/mfrm-search.form.tsx?5563","webpack://mattressfirm/./src/modules/mfrm-search/components/mfrm-search.label.tsx?8dd4","webpack://mattressfirm/./src/modules/mfrm-search/mfrm-search.tsx?810c","webpack://mattressfirm/./src/modules/mfrm-search/mfrm-search.view.tsx?7448","webpack://mattressfirm/./lib/mfrm-search/module-registration.js?669f","webpack://mattressfirm/./src/search-state-data-action.ts?8223","webpack://mattressfirm/external var \"React\"?0d3b","webpack://mattressfirm/external var \"ReactDOM\"?853b"],"sourcesContent":["/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { observable } from 'mobx';\n\n/**\n * State information related to what is needed to succesfully perform a autosuggest.\n */\nexport class SearchState {\n @observable public searchText?: string;\n\n @observable public defaultBasicSearchUrl?: string;\n\n @observable public searchQueryStringParameter?: string;\n}\n","import { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\r\nimport {\r\n CacheType, createObservableDataAction, IAction, IActionContext, IActionInput,\r\n ICreateActionContext\r\n} from '@msdyn365-commerce/core';\r\nimport { SearchSuggestion, SearchSuggestionCriteria } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n getSearchSuggestionsAsync\r\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\r\n\r\nexport const enum SuggestionType {\r\n Category = 'ScopedCategory',\r\n Keyword = 'Keyword',\r\n Product = 'Product',\r\n None = 'None'\r\n}\r\n\r\n/**\r\n * Input class for auto suggest search input\r\n */\r\nexport class AutoSuggestInput implements IActionInput {\r\n public searchQuery?: string;\r\n public topResultsCount?: number;\r\n public suggestionType?: string;\r\n public hitPrefix?: string;\r\n public hitSuffix?: string;\r\n\r\n constructor(searchText?: string, top?: number, suggestionType?: string, hitPrefix?: string, hitSuffix?: string) {\r\n this.searchQuery = searchText;\r\n this.topResultsCount = top;\r\n this.suggestionType = suggestionType;\r\n this.hitPrefix = hitPrefix;\r\n this.hitSuffix = hitSuffix;\r\n }\r\n\r\n public getCacheKey = () => `AutoSuggestSearchSuggestions`;\r\n public getCacheObjectType = () => 'AutoSuggestSearchSuggestions';\r\n public dataCacheType = (): CacheType => 'none';\r\n}\r\n\r\nconst createInput = (inputData: ICreateActionContext) => {\r\n return new AutoSuggestInput();\r\n};\r\n\r\n/**\r\n * Calls the Retail API and returns a auto-suggest suggestions\r\n */\r\nexport async function getSearchSuggestionsAction(input: AutoSuggestInput, ctx: IActionContext): Promise {\r\n // If no input is provided fail out\r\n if (!input || !input.searchQuery) {\r\n throw new Error('[getSearchSuggestionsAction]No valid Input was provided, failing');\r\n }\r\n\r\n const autosuggest: Autosuggestions = {};\r\n\r\n const autoSuggestPromises = [\r\n _getAutoSuggest(input, autosuggest, ctx)\r\n ];\r\n return Promise.all(autoSuggestPromises).then(() => {\r\n return autosuggest;\r\n });\r\n}\r\n\r\nasync function _getAutoSuggest(\r\n input: AutoSuggestInput,\r\n autosuggest: Autosuggestions,\r\n ctx: IActionContext\r\n): Promise {\r\n const searchCriteria: SearchSuggestionCriteria = {\r\n ProductSearchCriteria: {\r\n SearchCondition: input.searchQuery && input.searchQuery.length > 0 ? input.searchQuery : '',\r\n Context: {\r\n ChannelId: +ctx.requestContext.apiSettings.channelId,\r\n CatalogId: +ctx.requestContext.apiSettings.catalogId\r\n }\r\n },\r\n HitPrefix: input.hitPrefix,\r\n HitSuffix: input.hitSuffix,\r\n SuggestionType: input.suggestionType\r\n };\r\n\r\n const searchSuggestions = await getSearchSuggestionsAsync(\r\n { callerContext: ctx, queryResultSettings: { Paging: { Top: input.topResultsCount } } },\r\n searchCriteria\r\n );\r\n\r\n if (searchSuggestions && searchSuggestions.length > 0) {\r\n // Generate image url\r\n searchSuggestions.map(\r\n (item: SearchSuggestion) =>\r\n (item.ImageUrl = item.ImageUrl ? generateImageUrl(item.ImageUrl, ctx.requestContext.apiSettings) : '')\r\n );\r\n\r\n autosuggest.AllSearchResults = searchSuggestions;\r\n } else {\r\n ctx.telemetry.error(`[getSearchSuggestionsAction] unable to get availabilites for search with suggestion type ${searchCriteria.SuggestionType}`);\r\n }\r\n}\r\n\r\nexport const getSearchSuggestionsActionDataAction = createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/search/get-auto-suggest-suggestions',\r\n action: >getSearchSuggestionsAction,\r\n input: createInput\r\n});\r\n\r\nexport default getSearchSuggestionsActionDataAction;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\n/* tslint:disable: no-duplicate-imports */\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { generateProductImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n ICreateActionContext\r\n} from '@msdyn365-commerce/core';\r\nimport { ProductSearchCriteria, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { searchByCriteriaAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport {\r\n BaseCollectionInput,\r\n createBaseCollectionInput\r\n} from '../../mfrm-search-result-container/actions/base-collection-action';\r\nimport { IFullProductsSearchResultsWithCount } from './IFullProductsSearchResultsWithCount';\r\n\r\n/**\r\n * GetFullProductsByCollection Action Input\r\n */\r\nexport class GetFullProductsBySearchInput extends BaseCollectionInput implements IActionInput {\r\n public getCacheObjectType = () => 'FullProductSearchResultBySearch';\r\n public dataCacheType = (): Msdyn365.CacheType => 'application';\r\n}\r\n\r\n/**\r\n * createInput function which creates and actionInput used to fetch products for a list page.\r\n */\r\nconst createInput = (args: ICreateActionContext<{ itemsPerPage: number; includedAttributes: boolean | undefined }>): IActionInput => {\r\n const input = createBaseCollectionInput(args, GetFullProductsBySearchInput);\r\n\r\n // Set Top\r\n if (input.queryResultSettings.Paging && args.config) {\r\n input.queryResultSettings.Paging.Top = args.config.itemsPerPage || 1;\r\n }\r\n\r\n // Set Skip\r\n if (input.queryResultSettings.Paging && args.requestContext.query && args.requestContext.query.skip) {\r\n input.queryResultSettings.Paging.Skip = +args.requestContext.query.skip;\r\n }\r\n\r\n input.queryResultSettings.count = true;\r\n\r\n return input;\r\n};\r\n\r\n/**\r\n * Action function to fetch products for a list page\r\n */\r\n// tslint:disable-next-line: max-func-body-length cyclomatic-complexity\r\nasync function action(\r\n input: GetFullProductsBySearchInput,\r\n ctx: IActionContext\r\n): Promise {\r\n // let promise: AsyncResult;\r\n // let searchProductId;\r\n const searchCriteriaInput: ProductSearchCriteria = {};\r\n searchCriteriaInput.Context = { ChannelId: ctx.requestContext.apiSettings.channelId, CatalogId: ctx.requestContext.apiSettings.catalogId };\r\n searchCriteriaInput.Refinement = [];\r\n searchCriteriaInput.IncludeAttributes = false;\r\n searchCriteriaInput.SkipVariantExpansion = true;\r\n\r\n searchCriteriaInput.SearchCondition = input.searchText;\r\n const promise = searchByCriteriaAsync(\r\n {\r\n callerContext: ctx,\r\n queryResultSettings: input.queryResultSettings\r\n },\r\n searchCriteriaInput\r\n );\r\n\r\n const productSearchResults : ProductSearchResult[] = await promise;\r\n\r\n const mappedProducts = productSearchResults.map(productSearchResult => {\r\n const newImageUrl = generateProductImageUrl(\r\n productSearchResult,\r\n ctx.requestContext.apiSettings\r\n );\r\n\r\n if (newImageUrl) {\r\n productSearchResult.PrimaryImageUrl = newImageUrl;\r\n }\r\n\r\n return (productSearchResult);\r\n });\r\n\r\n\r\n return {\r\n products: mappedProducts,\r\n count: promise.metadata.count || 0,\r\n // VSI Customization 7294 Start\r\n virtualRefiners: searchCriteriaInput.Refinement,\r\n minusVirtualRefiner: input.refiners\r\n // VSI Customization 7294 End\r\n };\r\n}\r\n\r\nexport default createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/search/get-full-products-by-search',\r\n action: >action,\r\n input: createInput\r\n});\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\n\r\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { getRichTextHtml } from '@msdyn365-commerce/core';\r\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { IMfrmSearchData } from '../mfrm-search.data';\r\nimport { IMfrmSearchProps } from '../mfrm-search.props.autogenerated';\r\n\r\nexport interface ISearchKeywordSuggestProps {\r\n searchKeywordSuggestClass: string;\r\n searchPageURL: string;\r\n searchQsp: string | undefined;\r\n hitPrefix: string;\r\n hitSuffix: string;\r\n autoSuggestProps: IMfrmSearchProps;\r\n searchText: string;\r\n suggestions: SearchSuggestion[] | undefined;\r\n telemetryContent?: ITelemetryContent;\r\n}\r\n\r\nexport interface ISearchKeywordViewProps {\r\n text: React.ReactNode[];\r\n}\r\n\r\nlet payLoad: IPayLoad;\r\n\r\n/**\r\n *\r\n * KeywordSuggestionsComponent\r\n */\r\nexport const KeywordSuggestionsComponent = (props: ISearchKeywordSuggestProps): ISearchKeywordViewProps | undefined => {\r\n const { suggestions, hitPrefix, hitSuffix } = props;\r\n\r\n if (!suggestions) {\r\n return undefined;\r\n }\r\n\r\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\r\n\r\n const reactNodes: React.ReactNode[] = [];\r\n\r\n suggestions.map(item => {\r\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, props));\r\n });\r\n\r\n return { text: reactNodes };\r\n};\r\n\r\nconst _assembleNode = (item: SearchSuggestion, hitPrefix: string, hitSuffix: string, props: ISearchKeywordSuggestProps) => {\r\n const ariaLabel =\r\n item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n payLoad.contentAction.etext = ariaLabel;\r\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n return (\r\n
  • \r\n \r\n {_generateLink(item, hitPrefix, hitSuffix, props) &&\r\n _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix)}\r\n \r\n
  • \r\n );\r\n};\r\n\r\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, props: ISearchKeywordSuggestProps): string => {\r\n const { searchPageURL, searchQsp } = props;\r\n\r\n const formattedLink = (suggestion.Value as string)\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n const route = searchPageURL || '';\r\n return formattedLink && formattedLink.length > 0\r\n ? `${route}${route.indexOf('?') === -1 ? '?' : '&'}${searchQsp}=${formattedLink}`\r\n : route;\r\n};\r\n\r\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\r\n const formattedText = suggestion\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n\r\n // tslint:disable:react-no-dangerous-html\r\n return ;\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\n\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport Msdyn365, { getRichTextHtml, IActionContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\r\nimport { CommerceProperty, SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n INodeProps,\r\n IPayLoad,\r\n ITelemetryContent,\r\n NodeTag\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { IMfrmSearchData } from '../mfrm-search.data';\r\nimport { IMfrmSearchProps, IMfrmSearchResources } from '../mfrm-search.props.autogenerated';\r\n\r\nexport interface ISearchProductSuggestProps {\r\n searchProductSuggestClass: string;\r\n searchPageURL: string;\r\n searchQsp: string | undefined;\r\n hitPrefix: string;\r\n hitSuffix: string;\r\n autoSuggestProps: IMfrmSearchProps;\r\n searchText: string;\r\n suggestions: SearchSuggestion[] | undefined;\r\n telemetry: ITelemetry;\r\n moduleType: string;\r\n moduleId: string;\r\n telemetryContent?: ITelemetryContent;\r\n resources: IMfrmSearchResources;\r\n wmapPageUrlSuffix: string;\r\n}\r\nexport interface ISearchProductViewProps {\r\n title: React.ReactNode;\r\n items: ISearchProductItemViewProps[];\r\n}\r\n\r\nexport interface ISearchProductItemViewProps {\r\n text: React.ReactNode;\r\n thumbnail: React.ReactNode;\r\n price: React.ReactNode;\r\n LiProduct: INodeProps;\r\n AProduct: INodeProps;\r\n id: string | undefined;\r\n}\r\n\r\nlet payLoad: IPayLoad;\r\nlet telemetryContent: ITelemetryContent | undefined;\r\n\r\n/**\r\n *\r\n * ProductSuggestionsComponent\r\n */\r\nexport const ProductSuggestionsComponent = (props: ISearchProductSuggestProps): ISearchProductViewProps | undefined => {\r\n const {\r\n suggestions,\r\n hitSuffix,\r\n hitPrefix,\r\n autoSuggestProps: {\r\n context: { actionContext },\r\n resources: { productSuggestionHeading }\r\n },\r\n moduleType,\r\n moduleId,\r\n wmapPageUrlSuffix\r\n } = props;\r\n const reactNodes: ISearchProductItemViewProps[] = [];\r\n telemetryContent = props.telemetryContent;\r\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\r\n\r\n if (!suggestions) {\r\n return undefined;\r\n }\r\n\r\n suggestions.map(item => {\r\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, actionContext, props, moduleType, moduleId, wmapPageUrlSuffix));\r\n });\r\n\r\n const titleNode = _renderTitle(productSuggestionHeading);\r\n\r\n return { title: titleNode, items: reactNodes };\r\n};\r\n\r\nconst _renderTitle = (productSuggestionHeading: string) => {\r\n const productAutoSuggestionHeading = productSuggestionHeading ? productSuggestionHeading : 'Go to products';\r\n\r\n return
  • {productAutoSuggestionHeading}
  • ;\r\n};\r\n\r\nconst _assembleNode = (\r\n item: SearchSuggestion,\r\n hitPrefix: string,\r\n hitSuffix: string,\r\n actionContext: IActionContext,\r\n props: ISearchProductSuggestProps,\r\n moduleType: string,\r\n moduleId: string,\r\n wmapPageUrlSuffix: string\r\n): ISearchProductItemViewProps => {\r\n const altText =\r\n item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n\r\n return {\r\n text: _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix),\r\n thumbnail: _renderThumbnail(item, altText ? altText : '', props),\r\n price:\r\n item.Id &&\r\n item.Value3 &&\r\n item.Value3.Value &&\r\n item.Value3.Value.DecimalValue &&\r\n _renderPrice(item.Value3.Value.DecimalValue, item.Value3.Value.DecimalValue, moduleId, moduleType, props),\r\n LiProduct: _getLiWrapper(),\r\n AProduct: _getAWrapper(item, hitPrefix, hitSuffix, actionContext, props, wmapPageUrlSuffix),\r\n id: item.Id\r\n };\r\n};\r\n\r\nconst _getLiWrapper = () => {\r\n return {\r\n className: 'msc-autoSuggest__productResults-item',\r\n tag: 'li' as NodeTag\r\n };\r\n};\r\n\r\nconst _getAWrapper = (\r\n item: SearchSuggestion,\r\n hitPrefix: string,\r\n hitSuffix: string,\r\n actionContext: IActionContext,\r\n searchProps: ISearchProductSuggestProps,\r\n wmapPageUrlSuffix: string\r\n) => {\r\n const ariaLabel =\r\n item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n\r\n payLoad.contentAction.recid = item.Id;\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n const linkUrl = _generateLink(item, hitPrefix, hitSuffix, actionContext);\r\n const makeAPaymentLink = linkUrl.indexOf(wmapPageUrlSuffix);\r\n const makeAPaymentLinkUrl = makeAPaymentLink > -1 ? linkUrl.replace(`/${wmapPageUrlSuffix}`, '') : linkUrl;\r\n\r\n return {\r\n className: 'msc-autoSuggest__productResults-item',\r\n tag: 'a' as NodeTag,\r\n 'aria-label': ariaLabel,\r\n href: makeAPaymentLinkUrl,\r\n ...attribute,\r\n onClick: (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n // @ts-ignore\r\n if (utag) {\r\n // @ts-ignore\r\n utag.link({\r\n event_type: 'site_search',\r\n search_term: searchProps.searchText,\r\n search_type: 'related-products-search'\r\n });\r\n }\r\n\r\n if (Msdyn365.isBrowser && makeAPaymentLinkUrl) {\r\n window.location.href = makeAPaymentLinkUrl;\r\n }\r\n }\r\n };\r\n};\r\n\r\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, actionContext: IActionContext) => {\r\n const formattedLink = (suggestion.Value as string)\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n const unbxdDefaultVariant = suggestion && suggestion.ExtensionProperties?.find((property: CommerceProperty) => property?.Key === \"Unbxd_DefaultVariantID\")?.Value?.LongValue;\r\n\r\n let productUrl = suggestion.Value && suggestion.Id\r\n ? getProductPageUrlSync(formattedLink, (suggestion.Id as unknown) as number, actionContext, undefined)\r\n : '';\r\n const variantIdQueryParams = unbxdDefaultVariant !== 0 && (productUrl.includes('?') ? `&variantid=${unbxdDefaultVariant}` : `?variantid=${unbxdDefaultVariant}`) || '';\r\n productUrl += variantIdQueryParams;\r\n return productUrl;\r\n};\r\n\r\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\r\n const formattedText = suggestion\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n\r\n // tslint:disable:react-no-dangerous-html\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst _renderPrice = (\r\n adjustedPrice: number,\r\n basePrice: number,\r\n moduleId: string,\r\n moduleType: string,\r\n props: ISearchProductSuggestProps\r\n): JSX.Element | null => {\r\n const {\r\n autoSuggestProps: { context },\r\n resources\r\n } = props;\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst _renderThumbnail = (suggestion: SearchSuggestion, altText: string, props: ISearchProductSuggestProps): JSX.Element | null => {\r\n const {\r\n autoSuggestProps: {\r\n context: {\r\n request: { gridSettings }\r\n },\r\n config: { imageSettings }\r\n }\r\n } = props;\r\n if (imageSettings) {\r\n imageSettings.cropFocalRegion = true;\r\n }\r\n\r\n if (!suggestion || !suggestion.ImageUrl) {\r\n props.telemetry.error('Search suggestion content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n const defaultImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: `w=40&h=40&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=40&h=40&m=6`, w: 0, h: 0 },\r\n xl: { q: `w=40&h=40&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\n\r\nimport Msdyn365, { getRichTextHtml } from '@msdyn365-commerce/core';\r\nimport { ProductRefiner, SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { IMfrmSearchData } from '../mfrm-search.data';\r\nimport { IMfrmSearchProps } from '../mfrm-search.props.autogenerated';\r\n\r\nimport { removeKeywords } from '../../../Utilities/plp-url-utils';\r\n\r\nexport interface ISearchCategorySuggestProps {\r\n searchCategorySuggestClass: string;\r\n searchPageURL: string;\r\n searchQsp: string | undefined;\r\n hitPrefix: string;\r\n hitSuffix: string;\r\n autoSuggestProps: IMfrmSearchProps;\r\n searchText: string;\r\n searchRefiners: ProductRefiner[] | undefined;\r\n suggestions: SearchSuggestion[] | undefined;\r\n telemetryContent?: ITelemetryContent;\r\n}\r\n\r\nexport interface ISearchCategoryViewProps {\r\n title: React.ReactNode;\r\n text: React.ReactNode[];\r\n}\r\n\r\nlet payLoad: IPayLoad;\r\n\r\n/**\r\n *\r\n * CategorySuggestionsComponent\r\n */\r\nexport const CategorySuggestionsComponent = (props: ISearchCategorySuggestProps): ISearchCategoryViewProps | undefined => {\r\n const {\r\n suggestions,\r\n searchText,\r\n autoSuggestProps: {\r\n resources: { categorySuggestionHeading }\r\n }\r\n } = props;\r\n\r\n if (!suggestions) {\r\n return undefined;\r\n }\r\n\r\n const reactNodes: React.ReactNode[] = [];\r\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\r\n\r\n suggestions.map(item => {\r\n reactNodes.push(_assembleNode(item, props, props.autoSuggestProps));\r\n });\r\n\r\n const titleNode = _renderTitle(categorySuggestionHeading, searchText);\r\n\r\n return { title: titleNode, text: reactNodes };\r\n};\r\n\r\nconst _renderTitle = (categorySuggestionHeading: string, searchText: string) => {\r\n const categoryAutoSuggestionHeading = categorySuggestionHeading\r\n ? format(categorySuggestionHeading, searchText)\r\n : `Search \"${searchText}\" in categories`;\r\n\r\n return
  • {categoryAutoSuggestionHeading}
  • ;\r\n};\r\n\r\nconst _assembleNode = (\r\n item: SearchSuggestion,\r\n searchProps: ISearchCategorySuggestProps,\r\n categoryProps: IMfrmSearchProps\r\n) => {\r\n const { hitPrefix, hitSuffix } = searchProps;\r\n\r\n const splitValue = item.Value && item.Value.split('|').pop();\r\n const ariaLabel = splitValue\r\n ? splitValue.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '')\r\n : item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n payLoad.contentAction.etext = item.Value;\r\n const attribute = getTelemetryAttributes(searchProps.telemetryContent!, payLoad);\r\n const linkUrl = _generateLinkPLP(item, categoryProps);\r\n return (\r\n
  • \r\n ) => {\r\n e.preventDefault();\r\n // @ts-ignore\r\n if (utag) {\r\n // @ts-ignore\r\n utag.link({\r\n event_type: 'site_search',\r\n search_term: searchProps.searchText,\r\n search_type: 'related-categories-search'\r\n });\r\n }\r\n\r\n if (Msdyn365.isBrowser && linkUrl) {\r\n window.location.href = linkUrl;\r\n }\r\n }}\r\n >\r\n {linkUrl && _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix)}\r\n \r\n
  • \r\n );\r\n};\r\n\r\nconst _generateLinkPLP = (suggestion: SearchSuggestion, props: IMfrmSearchProps): string | undefined => {\r\n const categoryPath = suggestion.ExtensionProperties?.find(property => property.Key === 'CategoryPath')?.Value?.StringValue;\r\n const categoryId = suggestion.Id;\r\n\r\n return suggestion && categoryPath && categoryId ? _getCategoryLinkPLP(categoryPath, categoryId, props) : '';\r\n};\r\n\r\nconst _getCategoryLinkPLP = (categoryPath: string, categoryId: string, props: IMfrmSearchProps): string | undefined => {\r\n if (Msdyn365.isBrowser) {\r\n const base = window.location.origin;\r\n const validCategoryPath = categoryPath\r\n .toLowerCase()\r\n .replace(/\\|/g, '/')\r\n .replace(/&/g, '')\r\n .replace(/ +/g, '-');\r\n const pathWithRemovedKeyWords = removeKeywords(validCategoryPath.split('/').splice(1), props.context.request).join('/');\r\n\r\n return `${base}/${pathWithRemovedKeyWords}/${categoryId}.c`;\r\n } else {\r\n return undefined;\r\n }\r\n};\r\n\r\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\r\n let formattedText = suggestion\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n formattedText = formattedText.split('|').pop() || '';\r\n\r\n // tslint:disable:react-no-dangerous-html\r\n return ;\r\n};\r\n\r\n/**\r\n * Compressed a list of refiners for use in URLs\r\n * @param refiners The uncompressed refiners\r\n */\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { Button } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface ISearchFormProps {\r\n hideSearchLabel: boolean | undefined;\r\n isSearchFormExpanded: boolean | undefined;\r\n disableSubmitSearch: boolean | undefined;\r\n searchTextInput: React.RefObject;\r\n searchUrl: string;\r\n maxChars: number;\r\n searchQsp: string;\r\n searchPlaceholder: string;\r\n query: string;\r\n ariaLabelCancel: string;\r\n ariaLabelSearch: string;\r\n ariaLabelSubmit: string;\r\n handleCancelSearchChange(): void;\r\n handleInputChange(query: string): void;\r\n handleSubmit(e: React.MouseEvent | React.KeyboardEvent | React.FormEvent, eventType?: string): Promise\r\n}\r\n\r\nexport interface ISearchFormViewProps {\r\n input: React.ReactNode;\r\n submitBtn: React.ReactNode;\r\n cancelBtn: React.ReactNode;\r\n}\r\n\r\nexport const FormComponent = (props: ISearchFormProps): ISearchFormViewProps => {\r\n const {\r\n searchQsp,\r\n searchPlaceholder,\r\n hideSearchLabel,\r\n isSearchFormExpanded,\r\n searchTextInput,\r\n handleInputChange,\r\n maxChars,\r\n disableSubmitSearch,\r\n handleCancelSearchChange,\r\n query,\r\n ariaLabelCancel,\r\n ariaLabelSearch,\r\n ariaLabelSubmit,\r\n handleSubmit\r\n } = props;\r\n\r\n const onInputChange = (e: React.ChangeEvent): void => {\r\n handleInputChange(e.target.value || '');\r\n };\r\n\r\n const inputNode = !hideSearchLabel ? (\r\n \r\n ) : (\r\n \r\n );\r\n\r\n const submitBtnNode = !disableSubmitSearch && (\r\n ) => handleSubmit(e, 'search-box-icon')}\r\n />\r\n );\r\n\r\n const cancelBtNoden = (\r\n \r\n );\r\n\r\n return { input: inputNode, cancelBtn: cancelBtNoden, submitBtn: submitBtnNode };\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface ISearchLabelProps {\r\n isSearchFormExpanded: boolean;\r\n searchLabelClass: string;\r\n searchLabelArialLabel: string;\r\n searchtext: string;\r\n searchCollapsedLabel: React.RefObject;\r\n hideSearchLabel?: boolean;\r\n telemetryContent: ITelemetryContent;\r\n handleCancelSearchChange(): void;\r\n}\r\n\r\nexport const LabelComponent = (props: ISearchLabelProps) => {\r\n const {\r\n searchLabelClass,\r\n searchLabelArialLabel,\r\n isSearchFormExpanded,\r\n searchtext,\r\n searchCollapsedLabel,\r\n hideSearchLabel,\r\n handleCancelSearchChange,\r\n telemetryContent\r\n } = props;\r\n const payLoad = getPayloadObject('click', telemetryContent, searchtext, '');\r\n const attributes = getTelemetryAttributes(telemetryContent, payLoad);\r\n\r\n return (\r\n
    \r\n \r\n {!hideSearchLabel && (\r\n \r\n {searchtext}\r\n \r\n )}\r\n \r\n
    \r\n );\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { createSearchStateInput } from '@msdyn365-commerce-modules/search-utilities';\r\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes } from '@msdyn365-commerce-modules/utilities';\r\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365, { getUrlSync } from '@msdyn365-commerce/core';\r\nimport { ProductRefiner } from '@msdyn365-commerce/retail-proxy';\r\nimport { getProductSearchRefinersAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport classnames from 'classnames';\r\nimport debounce from 'lodash/debounce';\r\nimport * as React from 'react';\r\n\r\nimport getSearchSuggestionsAction, { AutoSuggestInput, SuggestionType } from './actions/get-auto-suggest-suggestions';\r\nimport getSearchProducts, { GetFullProductsBySearchInput } from './actions/get-full-products-by-search';\r\nimport {\r\n CategorySuggestionsComponent,\r\n FormComponent,\r\n ISearchCategoryViewProps,\r\n ISearchKeywordViewProps,\r\n ISearchProductViewProps,\r\n KeywordSuggestionsComponent,\r\n LabelComponent,\r\n ProductSuggestionsComponent\r\n} from './components';\r\nimport { IMfrmSearchData } from './mfrm-search.data';\r\nimport { IMfrmSearchProps, ISuggestionTypeCriterionData } from './mfrm-search.props.autogenerated';\r\n\r\nexport interface ISearchState {\r\n isSearchFormExpanded: boolean;\r\n searchText: string;\r\n searchKeywordSuggestClass: string;\r\n searchProductSuggestClass: string;\r\n searchCategorySuggestClass: string;\r\n suggestions: Autosuggestions | undefined;\r\n searchRefiners?: ProductRefiner[] | undefined;\r\n autoSuggestAriaLabel: string;\r\n isInitialState: boolean;\r\n}\r\n\r\nexport interface ISearchViewProps extends IMfrmSearchProps {\r\n Search: IModuleProps;\r\n AutoSuggestAriaLabel: INodeProps;\r\n AutoSuggestAriaLabelText: string;\r\n searchText: string;\r\n AutoSuggest: INodeProps;\r\n KeywordSuggest: INodeProps;\r\n ProductSuggest: INodeProps;\r\n CategorySuggest: INodeProps;\r\n SearchForm: INodeProps;\r\n FormWrapper: INodeProps;\r\n UlKeyword: INodeProps;\r\n UlProduct: INodeProps;\r\n UlCategory: INodeProps;\r\n label: React.ReactNode;\r\n form: React.ReactNode;\r\n autosuggestKeyword?: ISearchKeywordViewProps;\r\n autosuggestProduct?: ISearchProductViewProps;\r\n autosuggestCategory?: ISearchCategoryViewProps;\r\n callbacks: {\r\n handleCancelSearchChange(): void;\r\n };\r\n isSearchFormExpanded: boolean;\r\n handleUnbxdRedirect(query: string): Promise;\r\n}\r\n\r\n/**\r\n *\r\n * Search module\r\n * @extends {React.Component, ISearchState>}\r\n */\r\nclass Search extends React.Component, ISearchState> {\r\n private searchTextInput: React.RefObject;\r\n private searchCollapsedLabel: React.RefObject;\r\n private formReference: React.RefObject;\r\n private maxChars: number;\r\n private inputSuggestionType?: ISuggestionTypeCriterionData[];\r\n private topResultsCount?: number;\r\n private hitPrefix: string = '{';\r\n private hitSuffix: string = '}';\r\n private waitTime: number = 500;\r\n private autoSuggestResultScreenReaderDiv: React.RefObject;\r\n private autoSuggestResultDiv: React.RefObject;\r\n private searchFormClass: string;\r\n private searchLabelClass: string;\r\n private telemetryContent: ITelemetryContent;\r\n // @ts-ignore\r\n private cancellabelDebounce: debounce;\r\n\r\n constructor(props: IMfrmSearchProps) {\r\n super(props);\r\n this.searchTextInput = React.createRef();\r\n this.searchCollapsedLabel = React.createRef();\r\n this.autoSuggestResultScreenReaderDiv = React.createRef();\r\n this.autoSuggestResultDiv = React.createRef();\r\n this.formReference = React.createRef();\r\n this.state = {\r\n isSearchFormExpanded: false,\r\n searchText: '',\r\n searchKeywordSuggestClass: 'ms-search__autoSuggest__keyword',\r\n searchProductSuggestClass: 'ms-search__autoSuggest__product',\r\n searchCategorySuggestClass: 'ms-search__autoSuggest__category',\r\n suggestions: undefined,\r\n searchRefiners: undefined,\r\n autoSuggestAriaLabel: '',\r\n isInitialState: true\r\n };\r\n this.maxChars =\r\n (this.props.context &&\r\n this.props.context.app &&\r\n this.props.context.app.config &&\r\n this.props.context.app.config.searchInputMaxLength) ||\r\n 50;\r\n this.inputSuggestionType = this.props.config && this.props.config.suggestionTypeCriterion;\r\n this.topResultsCount = this.props.config && this.props.config.topResultsCount ? this.props.config.topResultsCount : 5;\r\n this.searchFormClass = 'ms-search__form';\r\n this.searchLabelClass = 'ms-search__label';\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n if (MsDyn365.isBrowser) {\r\n document.body && document.body.addEventListener('mousedown', this._focusOutTarget);\r\n window && window.addEventListener('keyup', this._keyup);\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.isBrowser) {\r\n document.body && document.body.removeEventListener('mousedown', this._focusOutTarget, false);\r\n window && window.removeEventListener('keyup', this._keyup, false);\r\n }\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n const {\r\n config: { hideSearchLabel }\r\n } = this.props;\r\n const { isSearchFormExpanded, isInitialState } = this.state;\r\n\r\n if (!this.props.context.request.params.isEditor) {\r\n if (!hideSearchLabel && isSearchFormExpanded) {\r\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\r\n } else if (!isInitialState) {\r\n this.searchCollapsedLabel && this.searchCollapsedLabel.current && this.searchCollapsedLabel.current.focus();\r\n }\r\n }\r\n }\r\n\r\n // tslint:disable-next-line: cyclomatic-complexity max-func-body-length\r\n public render(): JSX.Element {\r\n const {\r\n context,\r\n resources: { searchtext, searchLabelArialLabel, cancelBtnAriaLabel, searchBtnAriaLabel, submitBtnAriaLabel },\r\n config: { hideSearchLabel, disableSubmitSearch, searchplaceholderText, className = '' }\r\n } = this.props;\r\n\r\n const {\r\n isSearchFormExpanded,\r\n searchText,\r\n searchKeywordSuggestClass,\r\n searchProductSuggestClass,\r\n searchCategorySuggestClass,\r\n suggestions,\r\n searchRefiners\r\n } = this.state;\r\n\r\n const searchQsp = (context && context.app && context.app.config && context.app.config.searchQueryStringParameter) || 'q';\r\n const searchPageURL = getUrlSync('search', context && context.actionContext) || '';\r\n const searchURL = this._appendQueryParams(searchPageURL, searchText, searchQsp);\r\n const searchPlaceholder = searchplaceholderText && searchplaceholderText.length > 0 ? searchplaceholderText : 'Search in Fabrikam';\r\n\r\n const keywordSuggestions =\r\n suggestions &&\r\n suggestions.AllSearchResults &&\r\n suggestions.AllSearchResults.filter(\r\n (i: any) => i.SuggestionType === SuggestionType.Keyword || i.SuggestionType === SuggestionType.None\r\n );\r\n const productSuggestions =\r\n suggestions &&\r\n suggestions.AllSearchResults &&\r\n suggestions.AllSearchResults.filter((i: any) => i.SuggestionType === SuggestionType.Product);\r\n const categorySuggestions =\r\n suggestions &&\r\n suggestions.AllSearchResults &&\r\n suggestions.AllSearchResults.filter((i: any) => i.SuggestionType === SuggestionType.Category);\r\n\r\n const viewProps: ISearchViewProps = {\r\n ...(this.props as IMfrmSearchProps),\r\n\r\n Search: {\r\n moduleProps: this.props,\r\n className: `${classnames('ms-search', className)} ${disableSubmitSearch ? 'no-submit' : 'with-submit'}`\r\n },\r\n AutoSuggestAriaLabel: {\r\n tag: 'div',\r\n className: 'msc-autoSuggest__screen-reader',\r\n 'aria-live': 'assertive',\r\n ref: this.autoSuggestResultScreenReaderDiv\r\n },\r\n AutoSuggestAriaLabelText: this.state.autoSuggestAriaLabel,\r\n searchText: this.state.searchText,\r\n AutoSuggest: {\r\n ref: this.autoSuggestResultDiv,\r\n className: 'ms-search__autoSuggest'\r\n },\r\n KeywordSuggest: {\r\n className: searchKeywordSuggestClass\r\n },\r\n ProductSuggest: {\r\n className: searchProductSuggestClass\r\n },\r\n CategorySuggest: {\r\n className: searchCategorySuggestClass\r\n },\r\n SearchForm: {\r\n className: `${this.searchFormClass} ${isSearchFormExpanded ? 'bx-show' : 'bx-hide'}`\r\n },\r\n FormWrapper: {\r\n tag: 'form',\r\n ref: this.formReference,\r\n className: 'ms-search__searchForm',\r\n 'aria-label': 'Search',\r\n name: 'searchForm',\r\n role: 'search',\r\n action: searchURL,\r\n autoComplete: 'off',\r\n onSubmit: this._handleSubmit\r\n },\r\n UlKeyword: {\r\n tag: 'ul',\r\n className: classnames('msc-autoSuggest__keywordResults-items', className)\r\n },\r\n UlProduct: {\r\n tag: 'ul',\r\n className: classnames('msc-autoSuggest__productResults-items', className)\r\n },\r\n UlCategory: {\r\n tag: 'ul',\r\n className: classnames('msc-autoSuggest__categoryResults-items', className)\r\n },\r\n label: LabelComponent({\r\n isSearchFormExpanded: isSearchFormExpanded,\r\n searchLabelClass: `${this.searchLabelClass} ${isSearchFormExpanded ? 'bx-hide' : 'bx-show'}`,\r\n searchtext: searchtext,\r\n searchLabelArialLabel: searchLabelArialLabel,\r\n searchCollapsedLabel: this.searchCollapsedLabel,\r\n hideSearchLabel: hideSearchLabel,\r\n handleCancelSearchChange: this._handleCancelSearchChange,\r\n telemetryContent: this.telemetryContent\r\n }),\r\n form: FormComponent({\r\n ariaLabelCancel: cancelBtnAriaLabel,\r\n ariaLabelSearch: searchBtnAriaLabel,\r\n ariaLabelSubmit: submitBtnAriaLabel,\r\n hideSearchLabel: hideSearchLabel,\r\n searchTextInput: this.searchTextInput,\r\n isSearchFormExpanded: isSearchFormExpanded,\r\n disableSubmitSearch: disableSubmitSearch,\r\n handleInputChange: this._handleInputChange,\r\n handleCancelSearchChange: this._handleCancelSearchChange,\r\n maxChars: this.maxChars,\r\n searchQsp: searchQsp,\r\n searchPlaceholder: searchPlaceholder,\r\n query: searchText,\r\n searchUrl: searchURL,\r\n handleSubmit: this._handleSubmit\r\n }),\r\n autosuggestKeyword:\r\n searchText && searchText.length > 0 && keywordSuggestions && keywordSuggestions.length > 0\r\n ? KeywordSuggestionsComponent({\r\n searchKeywordSuggestClass: searchKeywordSuggestClass,\r\n searchPageURL: searchPageURL,\r\n searchQsp: searchQsp,\r\n hitPrefix: this.hitPrefix,\r\n hitSuffix: this.hitSuffix,\r\n autoSuggestProps: this.props,\r\n searchText: searchText,\r\n suggestions: keywordSuggestions,\r\n telemetryContent: this.telemetryContent\r\n })\r\n : undefined,\r\n autosuggestProduct:\r\n searchText && searchText.length > 0 && productSuggestions && productSuggestions.length > 0\r\n ? ProductSuggestionsComponent({\r\n searchProductSuggestClass: searchProductSuggestClass,\r\n searchPageURL: searchPageURL,\r\n searchQsp: searchQsp,\r\n hitPrefix: this.hitPrefix,\r\n hitSuffix: this.hitSuffix,\r\n autoSuggestProps: this.props,\r\n searchText: searchText,\r\n suggestions: productSuggestions,\r\n telemetry: this.props.telemetry,\r\n moduleType: this.props.typeName,\r\n moduleId: this.props.id,\r\n telemetryContent: this.telemetryContent,\r\n resources: this.props.resources,\r\n wmapPageUrlSuffix: this.props.app.config.wmapPageUrlSuffix\r\n })\r\n : undefined,\r\n autosuggestCategory:\r\n searchText && searchText.length > 0 && categorySuggestions && categorySuggestions.length > 0\r\n ? CategorySuggestionsComponent({\r\n searchCategorySuggestClass: searchCategorySuggestClass,\r\n searchPageURL: searchPageURL,\r\n searchQsp: searchQsp,\r\n hitPrefix: this.hitPrefix,\r\n hitSuffix: this.hitSuffix,\r\n autoSuggestProps: this.props,\r\n searchText: searchText,\r\n suggestions: categorySuggestions,\r\n searchRefiners: searchRefiners,\r\n telemetryContent: this.telemetryContent\r\n })\r\n : undefined,\r\n callbacks: {\r\n handleCancelSearchChange: this._handleCancelSearchChange\r\n },\r\n isSearchFormExpanded: this.state.isSearchFormExpanded,\r\n handleUnbxdRedirect: this._handleUnbxdRedirect\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n // tslint:disable-next-line:no-any\r\n private _focusOutTarget = (e: any): void => {\r\n const { suggestions } = this.state;\r\n\r\n if (suggestions && suggestions.AllSearchResults && e.target.closest('.ms-search') === null) {\r\n this._clearAutoSuggestState();\r\n }\r\n };\r\n\r\n private _keyup = (e: KeyboardEvent): void => {\r\n const { suggestions } = this.state;\r\n\r\n if (suggestions && suggestions.AllSearchResults && e.keyCode === KeyCodes.Escape) {\r\n this._clearAutoSuggestState();\r\n } else if (this.state.isSearchFormExpanded && e.keyCode === KeyCodes.Escape) {\r\n if (this.state.isSearchFormExpanded) {\r\n this.setState({ isSearchFormExpanded: false });\r\n }\r\n }\r\n\r\n if (!((this.formReference.current && this.formReference.current.contains(e.target as unknown as Node)) ||\r\n (this.autoSuggestResultDiv.current && this.autoSuggestResultDiv.current.contains(e.target as unknown as Node)))) {\r\n if (suggestions && suggestions.AllSearchResults) {\r\n this._clearAutoSuggestState();\r\n }\r\n\r\n if (this.state.isSearchFormExpanded) {\r\n this.setState({ isSearchFormExpanded: false });\r\n }\r\n }\r\n };\r\n\r\n private _clearAutoSuggestState = (): void => {\r\n const {\r\n context: { actionContext },\r\n data: { searchState }\r\n } = this.props;\r\n\r\n if (this.searchTextInput.current && this.searchTextInput.current.value.length > 0) {\r\n searchState.searchText = '';\r\n searchState.defaultBasicSearchUrl = '';\r\n searchState.searchQueryStringParameter = '';\r\n actionContext ? actionContext.update(createSearchStateInput(searchState), searchState) : null;\r\n this.searchTextInput.current.value = '';\r\n }\r\n\r\n this.setState({ searchText: '', suggestions: undefined, searchRefiners: undefined });\r\n };\r\n\r\n private _handleInputChange = (query: string): void => {\r\n if (!query || query.length < this.maxChars) {\r\n this.setState({ searchText: query });\r\n }\r\n\r\n if (this.cancellabelDebounce) {\r\n this.cancellabelDebounce.cancel();\r\n }\r\n\r\n const {\r\n telemetry,\r\n context,\r\n data: { searchState }\r\n } = this.props;\r\n\r\n if (context) {\r\n if (query && query.length > 0) {\r\n if (query.length > this.maxChars) {\r\n return;\r\n }\r\n\r\n this.cancellabelDebounce = debounce(() => {\r\n getSearchSuggestionsAction(\r\n new AutoSuggestInput(\r\n query,\r\n this.topResultsCount,\r\n this._getSuggestionType(this.inputSuggestionType),\r\n this.hitPrefix,\r\n this.hitSuffix\r\n ),\r\n context.actionContext\r\n )\r\n .then(results => {\r\n this._getSearchRefiners(query)\r\n .then(refiners => {\r\n this.setState({\r\n suggestions: results, searchRefiners: refiners,\r\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(results)\r\n });\r\n })\r\n .catch(error => {\r\n this.setState({\r\n suggestions: results, searchRefiners: undefined,\r\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(results)\r\n });\r\n telemetry.exception(error);\r\n telemetry.debug('Unable to get refiners results');\r\n });\r\n })\r\n .catch(error => {\r\n this.setState({\r\n suggestions: undefined, searchRefiners: undefined,\r\n autoSuggestAriaLabel: this._setAutoSuggestResultCount()\r\n });\r\n telemetry.exception(error);\r\n telemetry.debug('Unable to get auto suggest results');\r\n });\r\n }, this.waitTime);\r\n\r\n setTimeout(() => {\r\n this.cancellabelDebounce();\r\n }, 0);\r\n\r\n searchState.searchText = query;\r\n } else {\r\n this.setState({ suggestions: undefined, searchRefiners: undefined });\r\n searchState.searchText = '';\r\n }\r\n context.actionContext.update(createSearchStateInput(searchState), searchState);\r\n }\r\n };\r\n\r\n private _getSuggestionType = (suggestionTypes?: ISuggestionTypeCriterionData[]): string => {\r\n if (suggestionTypes && suggestionTypes.length > 0) {\r\n const distinctSuggestionTypes: string[] = [];\r\n suggestionTypes &&\r\n suggestionTypes.forEach((suggestionTypeItem, index) => {\r\n suggestionTypeItem.SuggestionType &&\r\n distinctSuggestionTypes.push(\r\n suggestionTypeItem.SuggestionType.charAt(0).toUpperCase() + suggestionTypeItem.SuggestionType.slice(1)\r\n );\r\n });\r\n return distinctSuggestionTypes.join(',');\r\n }\r\n return 'Keyword, Product, ScopedCategory';\r\n };\r\n\r\n private async _getSearchRefiners(searchText: string): Promise {\r\n const { actionContext: ctx } = this.props.context;\r\n return getProductSearchRefinersAsync(\r\n { callerContext: ctx },\r\n {\r\n SearchCondition: searchText,\r\n Context: {\r\n ChannelId: +ctx.requestContext.apiSettings.channelId,\r\n CatalogId: +ctx.requestContext.apiSettings.catalogId\r\n }\r\n }\r\n );\r\n }\r\n private _handleSubmit = async (\r\n e: React.MouseEvent | React.KeyboardEvent | React.FormEvent, eventType: string\r\n ): Promise => {\r\n const {\r\n config: { disableSubmitSearch },\r\n context: {\r\n actionContext,\r\n app: {\r\n config: { searchQueryStringParameter }\r\n }\r\n }\r\n } = this.props;\r\n\r\n const query = this.searchTextInput.current && this.searchTextInput.current.value;\r\n e.preventDefault();\r\n // @ts-ignore\r\n if (utag) {\r\n // @ts-ignore\r\n utag.link({\r\n event_type: 'site_search',\r\n search_term: query,\r\n search_type: eventType === 'search-box-icon' ? 'search-box-icon' : 'search-box-enter'\r\n });\r\n }\r\n\r\n if (!query || (query && query.length === 0) || disableSubmitSearch) {\r\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\r\n } else {\r\n const searchQsp = searchQueryStringParameter || 'q';\r\n const searchURL = this._appendQueryParams(getUrlSync('search', actionContext) || '', query, searchQsp);\r\n const redirectUrl = await this._handleUnbxdRedirect(query);\r\n\r\n if (MsDyn365.isBrowser) {\r\n document.location.href = (redirectUrl ? redirectUrl : searchURL)?.replace(`/${this.props.app.config.wmapPageUrlSuffix}`, '');\r\n }\r\n\r\n\r\n }\r\n };\r\n\r\n private _handleUnbxdRedirect = async (query: string): Promise => {\r\n const input = new GetFullProductsBySearchInput(\r\n 'Search',\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: 1,\r\n Skip: 0\r\n },\r\n count: true,\r\n Sorting: {}\r\n },\r\n [],\r\n + (this.props.context.request.urlTokens.itemId || 0),\r\n query,\r\n false,\r\n this.props.context.request.locale,\r\n this.props.context.request.url.requestUrl.pathname\r\n );\r\n let redirectUrl = '';\r\n if (input?.searchText) {\r\n const productResults = await getSearchProducts(input, this.props.context.actionContext);\r\n const extProperties = productResults.products && productResults.products.length > 0 && productResults.products[0]?.ExtensionProperties;\r\n const redirectUrlValue = extProperties && extProperties?.find(obj => obj?.Key === 'RedirectURL')?.Value?.StringValue;\r\n redirectUrlValue && redirectUrlValue.length ? redirectUrl = redirectUrlValue : redirectUrl = '';\r\n return redirectUrl;\r\n }\r\n return redirectUrl;\r\n };\r\n\r\n private _handleCancelSearchChange = (): void => {\r\n const { isSearchFormExpanded, suggestions } = this.state;\r\n\r\n if (!isSearchFormExpanded) {\r\n this.setState({\r\n isSearchFormExpanded: true,\r\n searchText: '',\r\n isInitialState: false\r\n });\r\n } else {\r\n if (suggestions && suggestions.AllSearchResults) {\r\n this._clearAutoSuggestState();\r\n }\r\n\r\n this.setState({ isSearchFormExpanded: false });\r\n }\r\n };\r\n\r\n private _appendQueryParams = (route: string, query: string, qsp: string): string => {\r\n if (route && route.length > 0) {\r\n return query && query.length > 0\r\n ? `${route}${route.indexOf('?') === -1 ? '?' : '&'}${qsp}=${encodeURIComponent(query)}`\r\n : route;\r\n }\r\n return '';\r\n };\r\n\r\n private _setAutoSuggestResultCount = (result?: Autosuggestions) => {\r\n if (this.autoSuggestResultScreenReaderDiv.current !== null) {\r\n const ariaLiveRegion = this.autoSuggestResultScreenReaderDiv.current;\r\n const suggestResultString = this.props.resources.autoSuggestFoundMessage;\r\n const emptyResultString = this.props.resources.noAutoSuggestionMessage;\r\n ariaLiveRegion.innerText = result && (result.AllSearchResults && result.AllSearchResults.length > 0) ? suggestResultString : emptyResultString;\r\n ariaLiveRegion.setAttribute('aria-live', 'assertive');\r\n return ariaLiveRegion.innerText;\r\n } else {\r\n return '';\r\n }\r\n };\r\n}\r\n\r\nexport default Search;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\nimport {\r\n ISearchCategoryViewProps,\r\n ISearchFormViewProps,\r\n ISearchKeywordViewProps,\r\n ISearchProductViewProps\r\n} from '@msdyn365-commerce-modules/search/src/modules/search/./components';\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport Msdyn365, { getUrlSync } from '@msdyn365-commerce/core';\r\nimport { ISearchViewProps } from './mfrm-search';\r\nconst searchAutosuggestID = 20889341556;\r\nconst SearchView: React.FC = props => {\r\n const {\r\n Search,\r\n AutoSuggestAriaLabel,\r\n AutoSuggestAriaLabelText,\r\n searchText,\r\n AutoSuggest,\r\n KeywordSuggest,\r\n ProductSuggest,\r\n CategorySuggest,\r\n UlKeyword,\r\n UlProduct,\r\n UlCategory,\r\n form,\r\n autosuggestCategory,\r\n autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label,\r\n context: { app },\r\n resources: { seeAllResultButtonText, categoryTitleText }\r\n } = props;\r\n const searchInputMinLength = app.config.searchInputMinLength || 3;\r\n const [optimizelyID, updateExperiment] = React.useState(false);\r\n let data;\r\n let experimentID = {};\r\n const [isFocused, setIsFocused] = React.useState(false);\r\n const [isClicked, setIsClicked] = React.useState(false);\r\n const handleFocus = () => {\r\n if (!isFocused) {\r\n setIsFocused(true);\r\n setIsClicked(false);\r\n }\r\n };\r\n React.useEffect(() => {\r\n if(window[\"optimizely\"].get && window[\"optimizely\"].get(\"data\")) {\r\n data = window[\"optimizely\"].get(\"data\");\r\n experimentID = data.experiments;\r\n }\r\n if(experimentID[searchAutosuggestID]){\r\n updateExperiment(true);\r\n }\r\n const handleBlurr = (e: any): void => {\r\n const focus = {isFocused};\r\n if (focus && e.target.closest('.ms-search') === null) {\r\n setIsFocused(false);\r\n setIsClicked(true);\r\n }\r\n };\r\n\r\n // @ts-ignore\r\n window.closeSearchAutosuggest = function(e: any){\r\n if ( !isClicked && e?.target?.className === 'searchautosuggestClose') {\r\n setIsClicked(true);\r\n setIsFocused(false);\r\n }\r\n };\r\n const optimizely = {optimizelyID};\r\n if (Msdyn365.isBrowser && optimizely){\r\n // @ts-ignore\r\n document.body && document.body.addEventListener('click', handleBlurr);\r\n // @ts-ignore\r\n document.body && document.body.addEventListener('click', window.closeSearchAutosuggest);\r\n }\r\n },[]);\r\n\r\n if(optimizelyID){\r\n const displaySearch = (isFocused && !isClicked) || ((searchText && searchText.length > 0) && !isClicked);\r\n return (\r\n \r\n \r\n \r\n {label}\r\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\r\n {displaySearch ? (\r\n \r\n \r\n {displaySearch ? {AutoSuggestAriaLabelText} : ''}\r\n {/* {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword)} */}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct)}\r\n {/* {_renderSearchAllButton(props, seeAllResultButtonText, autosuggestProduct, autosuggestCategory)} */}\r\n {/* {_renderCategorySuggestions(CategorySuggest, UlCategory, categoryTitleText, autosuggestCategory)} */}\r\n \r\n \r\n ) : (\r\n ''\r\n )}\r\n \r\n \r\n );\r\n } else {\r\n return (\r\n \r\n\r\n = searchInputMinLength ? 'show' : 'hide'\r\n }`}\r\n />\r\n \r\n {label}\r\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\r\n\r\n {searchText && searchText.length >= searchInputMinLength ? (\r\n \r\n \r\n {searchText && searchText.length > 0 ? {AutoSuggestAriaLabelText} : ''}\r\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword)}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct)}\r\n {_renderSearchAllButton(props, seeAllResultButtonText, autosuggestProduct, autosuggestCategory)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, categoryTitleText, autosuggestCategory)}\r\n \r\n \r\n ) : (\r\n ''\r\n )}\r\n \r\n \r\n );\r\n }\r\n};\r\n\r\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\r\n return (\r\n \r\n \r\n {form.submitBtn}\r\n {form.input}\r\n {form.cancelBtn}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderKeywordSuggestions = (KeywordSuggest: INodeProps, UlKeyword: INodeProps, keywordSuggestions?: ISearchKeywordViewProps) => {\r\n return (\r\n keywordSuggestions && (\r\n \r\n \r\n {keywordSuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderProductSuggestions = (ProductSuggest: INodeProps, UlProduct: INodeProps, productSuggestions?: ISearchProductViewProps) => {\r\n return (\r\n productSuggestions && (\r\n \r\n \r\n {productSuggestions.title}\r\n {productSuggestions.items.map((item, index) => {\r\n return (\r\n \r\n \r\n {/* VSI Customization - Start */}\r\n {/* {item.thumbnail} */}\r\n {item.text}\r\n {/* {item.price} */}\r\n {/* VSI Customization - End */}\r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n\r\nconst _renderCategorySuggestions = (\r\n CategorySuggest: INodeProps,\r\n UlCategory: INodeProps,\r\n categoryTitleText: string,\r\n categorySuggestions?: ISearchCategoryViewProps\r\n) => {\r\n return (\r\n categorySuggestions && (\r\n \r\n \r\n {/* VSI Customization - Start */}\r\n {/* {categorySuggestions.title} */}\r\n \r\n {categoryTitleText}\r\n \r\n {/* VSI Customization - END */}\r\n {categorySuggestions.text.map(text => {\r\n return text;\r\n })}\r\n \r\n \r\n )\r\n );\r\n};\r\n// VSI Customization - Start\r\nconst handleSearchAllResult = async (props: React.PropsWithChildren): Promise => {\r\n\r\n const {\r\n searchText,\r\n config: { disableSubmitSearch },\r\n context: {\r\n actionContext,\r\n app: {\r\n config: { searchQueryStringParameter }\r\n }\r\n }\r\n } = props;\r\n\r\n const query = searchText && searchText;\r\n\r\n if (!query || (query && query.length === 0) || disableSubmitSearch) {\r\n // this.searchTextInput && searchText && searchText.focus();\r\n } else {\r\n const searchQsp = searchQueryStringParameter || 'q';\r\n const searchURL = _appendQueryParams(getUrlSync('search', actionContext) || '', query, searchQsp);\r\n // @ts-ignore\r\n if (utag) {\r\n // @ts-ignore\r\n utag.link({\r\n event_type: 'site_search',\r\n search_term: props.searchText,\r\n search_type: 'see-all-results-button'\r\n });\r\n }\r\n\r\n const redirectUrl = await props.handleUnbxdRedirect(query);\r\n\r\n if (Msdyn365.isBrowser) {\r\n document.location.href = redirectUrl ? redirectUrl : searchURL;\r\n }\r\n\r\n }\r\n};\r\n\r\nconst _renderSearchAllButton = (\r\n props: React.PropsWithChildren,\r\n seeAllResultButtonText: string,\r\n productSuggestions?: ISearchProductViewProps,\r\n categorySuggestions?: ISearchCategoryViewProps\r\n) => {\r\n const moduleName = 'ms-search__autoSuggest';\r\n return (\r\n (categorySuggestions || productSuggestions) && (\r\n handleSearchAllResult(props)}\r\n tabIndex='0'\r\n >\r\n {seeAllResultButtonText}\r\n \r\n )\r\n );\r\n};\r\n\r\nconst _appendQueryParams = (route: string, query: string, qsp: string): string => {\r\n if (route && route.length > 0) {\r\n return query && query.length > 0 ? `${route}${route.indexOf('?') === -1 ? '?' : '&'}${qsp}=${encodeURIComponent(query)}` : route;\r\n }\r\n return '';\r\n};\r\n// VSI Customization - END\r\nexport default SearchView;\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['mfrm-search'] = {\n c: () => require('partner/modules/mfrm-search/mfrm-search.tsx'),\n $type: 'contentModule',\n da: [{name:'listPageState', path:'modules/mfrm-search-result-container/list-page-state', runOn: 0},{name:'products', path:'modules/mfrm-search-result-container/actions/get-full-products-by-collection', runOn: 0},{name:'searchState', path:'@msdyn365-commerce-modules/search-utilities/dist/lib/search-state-data-action', runOn: 1}],\n \n iNM: false,\n ns: '__local__',\n n: 'mfrm-search',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/mfrm-search'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/search-utilities/dist/lib/search-state-data-action';\n let dataAction = require('@msdyn365-commerce-modules/search-utilities/dist/lib/search-state-data-action');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/mfrm-search-result-container/actions/get-full-products-by-collection';\n let dataAction = require('partner/modules/mfrm-search-result-container/actions/get-full-products-by-collection');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/mfrm-search-result-container/list-page-state';\n let dataAction = require('partner/modules/mfrm-search-result-container/list-page-state');\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__|modules|mfrm-search|mfrm-search'] = {\n c: () => require('partner/modules/mfrm-search/mfrm-search.view.tsx'),\n cn: '__local__-__local__-mfrm-search'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { createObservableDataAction, IAction, IActionInput, IAny, ICreateActionContext, IGeneric } from '@msdyn365-commerce/core';\nimport { GenericInput, getGenericAction } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { SearchState } from './search-state';\n\nexport function createSearchStateInput(result: SearchState): GenericInput {\n return new GenericInput('searchState', result, 'SearchState');\n}\n\nconst createsearchStateInputInternal = (inputData: ICreateActionContext>): IActionInput => {\n return createSearchStateInput({ searchText: '' });\n};\n\nexport const getGenericActionDataAction = createObservableDataAction({\n action: >getGenericAction,\n input: createsearchStateInputInternal\n});\n\nexport default getGenericActionDataAction;\n","module.exports = React;","module.exports = ReactDOM;"],"names":["SearchState","__decorate","observable","SuggestionType","AutoSuggestInput","constructor","searchText","top","suggestionType","hitPrefix","hitSuffix","getCacheKey","getCacheObjectType","dataCacheType","this","searchQuery","topResultsCount","async","_getAutoSuggest","input","autosuggest","ctx","searchCriteria","ProductSearchCriteria","SearchCondition","length","Context","ChannelId","requestContext","apiSettings","channelId","CatalogId","catalogId","HitPrefix","HitSuffix","searchSuggestions","getSearchSuggestionsAsync","callerContext","queryResultSettings","Paging","Top","map","item","ImageUrl","generateImageUrl","AllSearchResults","telemetry","error","createObservableDataAction","id","action","Error","autoSuggestPromises","Promise","all","then","inputData","GetFullProductsBySearchInput","BaseCollectionInput","searchCriteriaInput","Refinement","IncludeAttributes","SkipVariantExpansion","promise","searchByCriteriaAsync","products","productSearchResult","newImageUrl","generateProductImageUrl","PrimaryImageUrl","count","metadata","virtualRefiners","minusVirtualRefiner","refiners","args","createBaseCollectionInput","config","itemsPerPage","query","skip","Skip","payLoad","KeywordSuggestionsComponent","props","suggestions","getPayloadObject","telemetryContent","reactNodes","push","_assembleNode","text","ariaLabel","Value","replace","RegExp","contentAction","etext","attribute","getTelemetryAttributes","React","className","key","Id","href","_generateLink","_getHighlightedText","suggestion","searchPageURL","searchQsp","formattedLink","route","indexOf","formattedText","dangerouslySetInnerHTML","getRichTextHtml","ProductSuggestionsComponent","autoSuggestProps","context","actionContext","resources","productSuggestionHeading","moduleType","moduleId","wmapPageUrlSuffix","title","_renderTitle","items","productAutoSuggestionHeading","altText","thumbnail","_renderThumbnail","price","Value3","DecimalValue","_renderPrice","LiProduct","_getLiWrapper","AProduct","_getAWrapper","tag","searchProps","recid","linkUrl","makeAPaymentLinkUrl","onClick","e","preventDefault","utag","link","event_type","search_term","search_type","Msdyn365","window","location","unbxdDefaultVariant","ExtensionProperties","find","property","Key","LongValue","productUrl","getProductPageUrlSync","undefined","variantIdQueryParams","includes","adjustedPrice","basePrice","PriceComponent","typeName","freePriceText","priceFree","data","CustomerContextualPrice","BasePrice","request","gridSettings","imageSettings","cropFocalRegion","Image","src","viewports","xs","q","w","h","lg","xl","lazyload","loadFailureBehavior","CategorySuggestionsComponent","categorySuggestionHeading","categoryAutoSuggestionHeading","format","categoryProps","splitValue","split","pop","_generateLinkPLP","categoryPath","StringValue","categoryId","_getCategoryLinkPLP","base","origin","validCategoryPath","toLowerCase","pathWithRemovedKeyWords","removeKeywords","splice","join","FormComponent","searchPlaceholder","hideSearchLabel","isSearchFormExpanded","searchTextInput","handleInputChange","maxChars","disableSubmitSearch","handleCancelSearchChange","ariaLabelCancel","ariaLabelSearch","ariaLabelSubmit","handleSubmit","onInputChange","target","value","inputNode","type","name","placeholder","ref","onChange","maxLength","submitBtnNode","Button","cancelBtn","submitBtn","LabelComponent","searchLabelClass","searchLabelArialLabel","searchtext","searchCollapsedLabel","attributes","Object","innerRef","Search","super","waitTime","_focusOutTarget","state","closest","_clearAutoSuggestState","_keyup","keyCode","KeyCodes","setState","formReference","current","contains","autoSuggestResultDiv","searchState","defaultBasicSearchUrl","searchQueryStringParameter","update","createSearchStateInput","searchRefiners","_handleInputChange","cancellabelDebounce","cancel","debounce","getSearchSuggestionsAction","_getSuggestionType","inputSuggestionType","results","_getSearchRefiners","autoSuggestAriaLabel","_setAutoSuggestResultCount","catch","exception","debug","setTimeout","suggestionTypes","distinctSuggestionTypes","forEach","suggestionTypeItem","index","charAt","toUpperCase","slice","_handleSubmit","eventType","app","focus","searchURL","_appendQueryParams","getUrlSync","redirectUrl","_handleUnbxdRedirect","MsDyn365","document","Sorting","urlTokens","itemId","locale","url","requestUrl","pathname","productResults","getSearchProducts","extProperties","redirectUrlValue","obj","_handleCancelSearchChange","isInitialState","qsp","encodeURIComponent","result","autoSuggestResultScreenReaderDiv","ariaLiveRegion","suggestResultString","autoSuggestFoundMessage","emptyResultString","noAutoSuggestionMessage","innerText","setAttribute","searchKeywordSuggestClass","searchProductSuggestClass","searchCategorySuggestClass","searchInputMaxLength","suggestionTypeCriterion","searchFormClass","getTelemetryObject","telemetryPageName","friendlyName","body","addEventListener","componentWillUnmount","removeEventListener","componentDidUpdate","params","isEditor","render","cancelBtnAriaLabel","searchBtnAriaLabel","submitBtnAriaLabel","searchplaceholderText","keywordSuggestions","filter","i","Keyword","None","productSuggestions","Product","categorySuggestions","Category","viewProps","moduleProps","classnames","AutoSuggestAriaLabel","AutoSuggestAriaLabelText","AutoSuggest","KeywordSuggest","ProductSuggest","CategorySuggest","SearchForm","FormWrapper","role","autoComplete","onSubmit","UlKeyword","UlProduct","UlCategory","label","form","searchUrl","autosuggestKeyword","autosuggestProduct","autosuggestCategory","callbacks","handleUnbxdRedirect","renderView","getProductSearchRefinersAsync","_renderForm","Node","_renderKeywordSuggestions","_renderProductSuggestions","_renderCategorySuggestions","categoryTitleText","_renderSearchAllButton","seeAllResultButtonText","handleSearchAllResult","tabIndex","searchInputMinLength","optimizelyID","updateExperiment","experimentID","isFocused","setIsFocused","isClicked","setIsClicked","handleFocus","get","experiments","handleBlurr","closeSearchAutosuggest","optimizely","displaySearch","Module","onFocus","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","prototype","RegistrationId","c","require","$type","da","path","runOn","iNM","ns","n","p","pdp","md","__bindings__","viewDictionary","cn","GenericInput","getGenericActionDataAction","getGenericAction","module","exports","ReactDOM"],"sourceRoot":""}