@clickview/lite 0.72.1 → 0.72.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/scripts/3816-ca44792dca-lite.chunk.js +2 -0
- package/dist/scripts/3816-ca44792dca-lite.chunk.js.map +1 -0
- package/dist/scripts/{bundle-dfca00e3d3.min.js → bundle-23f3b64e36.min.js} +3 -3
- package/dist/scripts/{bundle-dfca00e3d3.min.js.map → bundle-23f3b64e36.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/3816-abed23a1ce-lite.chunk.js +0 -2
- package/dist/scripts/3816-abed23a1ce-lite.chunk.js.map +0 -1
- /package/dist/scripts/{bundle-dfca00e3d3.min.js.LICENSE.txt → bundle-23f3b64e36.min.js.LICENSE.txt} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/3816-abed23a1ce-lite.chunk.js","mappings":"qgDAOA,IAAMA,EAAa,GAiBb,SAAUC,EACdC,EACAC,GAEA,IAEMC,EAFS,UAA0BF,EAASF,GAE1BK,KAAI,SAAAC,GAAK,OAAIH,EAAW,SAAiBG,GAAO,IAElEC,EAAY,qBAA6BH,GAEzCI,EAAW,YAAoBD,EAAUE,MACzCC,EAAQH,EAAUE,KAAKE,OACzBH,EAASI,QAAO,SAACC,EAAKC,GAAI,OAAK,+BAAMD,GAAG,KAAGC,EAAKC,GAAKD,GAAI,GAAK,CAAC,GAC/D,KAEJ,MAAO,CACLN,SAAAA,EACAE,MAAAA,EACAM,WAAYT,EAAUS,WAE1B,CAQM,SAAUC,EACdC,EACAf,EACAgB,G,YAEMC,EAASD,GAAY,SAACE,GAC1B,MAAmB,WAAf,EAAOA,GACFA,EAAIN,GAENM,CACT,EAEMC,EAAe,SAA0B,IAAIC,KAEmB,G,EAApC,WAAiC,I,EAAG,E,unBAA9DnB,EAAQ,KAAEoB,EAAW,KAE7B,aAAgB,WACd,GAAKN,aAAI,EAAJA,EAAMP,OAAX,CAGA,IAAMc,EAAsB,GAE5BP,EAAKQ,SAAQ,SAAAL,GACX,IAAMM,EAAMP,EAAOC,GAEfC,EAAaM,QAAQC,IAAIF,KAG7BF,EAAeK,KAAKT,GACpBC,EAAaM,QAAQG,IAAIJ,GAC3B,IAEKF,EAAed,QAGpBa,GAAY,SAAAQ,GAAC,kBAAUA,GAAC,EAAK,UAAqBP,EAAgBzB,GAAYK,IAAIF,IAAW,GAjBrF,CAkBV,GAAG,CAACe,aAAI,EAAJA,EAAMP,SAEV,IAAMJ,EAAY,qBAA6BH,GAEzCI,EAAW,YAAoBD,EAAUE,MACzCC,EAAQH,EAAUE,KAAKE,OACzBH,EAASI,QAAO,SAACC,EAAKC,GAAI,OAAK,+BAAMD,GAAG,KAAGO,EAAON,GAAQA,GAAI,GAAK,CAAC,GACpE,KAEJ,MAAO,CACLmB,4BAAoD,QAAxB,EAAmB,QAAnB,EAAA1B,EAAUA,iBAAS,eAAG,UAAE,eAAE2B,cACtD1B,SAAAA,EACAE,MAAAA,EACAM,WAAYT,EAAUS,WAE1B,C,wECnGMmB,EAAmB,I,iHC2BnB,SAAUC,EACdjC,EACAkC,EACAC,EACAC,EACAC,EACAC,GAEA,I,ID1BgCC,EAC1BC,ECyB+C,G,GAAX,IAAAC,UAAS,G,EAAE,E,o4BAA7CC,EAAY,KAAEC,EAAe,KAE/BC,EAAcV,EAcdW,GAAW,QAZjB,SAAgBC,GACd,IAAK9C,EACH,OAAO,KAET,IAAM+C,EAAU/C,EAAW8C,GAE3B,OAAKC,EAGEA,EAAQvB,IAFN,IAGX,GAIEY,EACAC,GAwCF,ODrFgCE,ECwDd,CAChBS,cATF,WACE,GAAKd,GAAclC,GAAe6C,EAIlC,OADAF,GAAgB,SAAAM,GAAU,OAAIA,EAAa,CAAC,IACrCL,EAAYC,EAASK,WAC9B,EAIEC,WAAWN,aAAQ,EAARA,EAAUK,YACrBrC,WAAYgC,aAAQ,EAARA,EAAUhC,WACtByB,gBAAAA,GD3DIE,EAAe,WACnB,IAAID,EAAQ1B,WAAZ,CAGA,GAAK0B,EAAQD,gBAON,CACL,IAAQA,EAAoBC,EAApBD,gBAKR,GAJ4BA,EAAgBc,wBAAwBC,OAASf,EAAgBgB,UAEzEhB,EAAgBiB,aAAevB,EAGjD,MACH,MAVC,GAJ4BwB,OAAOC,YAAcC,SAASC,gBAAgBL,UAEtDI,SAASC,gBAAgBJ,aAAevB,EAG1D,OAWJO,EAAQS,eAnBA,CAoBV,GAEA,IAAAY,YAAU,WACR,IAAMC,EAAWC,EAAA,WAAwBtB,EAAc,KAEjDF,EAAkBC,EAAQD,iBAAmBkB,OAKnD,OAHIjB,EAAQY,SACVb,EAAgByB,iBAAiB,SAAUF,GAEtC,kBAAMvB,EAAgB0B,oBAAoB,SAAUH,EAAS,CACtE,GAAG,CAAEtB,EAAQY,QAASZ,EAAQS,cAAeT,EAAQD,mBC6BrD,IAAAsB,YAAU,WACHf,GAGDA,EAASoB,oBAAsB/B,IACjCU,IACAD,GAAgB,SAAAM,GAAU,OAAIA,EAAa,CAAC,IAEhD,GAAG,CAAEJ,aAAQ,EAARA,EAAUoB,mBAAoB/B,KAEnC,IAAA0B,YAAU,W,QACR,IAAKf,aAAQ,EAARA,EAAUqB,aAAeJ,EAAA,aAA0B3B,GAAxD,CAGA,IAAMgC,IAAoE,QAA/B,EAAmB,QAAnB,EAAAtB,EAASqB,kBAAU,eAAEE,kBAAU,eAAEC,OAAO,EAAG,IAElFF,IAAoBG,EAAA,eAA+BH,IAAoBG,EAAA,eAG3EnC,EAAQO,EAAcG,EAASqB,WAPvB,CAQV,GAAG,CAACrB,aAAQ,EAARA,EAAUqB,aAEP,CACL3D,MAAOsC,aAAQ,EAARA,EAAUtC,MACjB4C,WAAWN,aAAQ,EAARA,EAAUK,YACrBA,WAAYL,aAAQ,EAARA,EAAUK,WACtBrC,WAAYgC,aAAQ,EAARA,EAAUhC,WACtB0D,WAAY1B,aAAQ,EAARA,EAAU0B,WACtBC,sBAAuB3B,aAAQ,EAARA,EAAU2B,sBAErC,C,kBC1GA,IAAYC,E,iBAAZ,SAAYA,GACV,2CACA,yBACA,+BACA,yCACA,2BACA,2BACA,eACD,CARD,CAAYA,IAAAA,EAAc,I,yFCSpB,SAAUC,EAAiBC,EAAmBC,EAAgBC,GAClE,OAAKF,GAAcC,EAGZ,CACLE,YAAa,cACbC,OAAQ,qBACRC,KAAM,CAAEL,EAAWC,EAAOhE,GAAI,YAAmBgE,EAAOK,OACxDC,OAAQ,CACNL,KAAAA,IAPK,IAUX,CAEM,SAAUM,EAAuBP,GAGrC,I,QAFIQ,EAAW,EAENC,EAAI,EAA0B,QAAvB,EAAAA,GAAe,QAAX,EAAAT,EAAOK,YAAI,eAAEzE,eAAM,SAAO6E,IAC5CD,GAAYR,EAAOK,KAAKK,WAAWD,GAGrC,OAAO,IAAsBD,EAAW,WAC1C,C,gLCxBM,SAAUG,EAAkBC,G,YAC1BC,EAAgB,OAAH,wBACdD,EAAMC,eAAa,CACtB7E,GAAc,QAAV,EAAA4E,EAAMlF,YAAI,eAAEM,GAChBqE,KAAgB,QAAV,EAAAO,EAAMlF,YAAI,eAAE2E,OAGdS,EAAmB,OAAH,sBACpBC,SAAU,6BACPH,EAAME,kBAAgB,CACzBE,WAAY,WACZC,OAAQ,aACRC,WAAY,aAGd,OACE,gBAACC,EAAA,EAA6B,iBACxBP,EAAK,CACTC,cAAeA,EACfC,iBAAkBA,EAClBM,SAAyB,QAAf,EAAAR,EAAMlF,KAAK2F,YAAI,eAAEC,IAC3BC,aAAiC,QAAnB,EAAAX,EAAMlF,KAAK8F,gBAAQ,eAAEC,SAGzC,CCvBM,SAAUC,EAAcd,GAC5B,OACE,gBAACe,EAAA,EAAG,CAACC,GAAG,KAAKC,GAAI,EAAGC,GAAIlB,EAAMmB,cAAgB,EAAI,EAAGC,GAAIpB,EAAMmB,cAAgB,EAAI,GACjF,uBAAKE,UAAS,+BACZ,gBAACtB,EAAiB,CAChBjF,KAAMkF,EAAM7E,KACZmG,gBAAiBtB,EAAMuB,SAASC,kBAChCC,uBAAwB,WAAK,QAAC,OAAuC,QAAvC,KAAAzB,EAAMuB,UAASG,gCAAwB,sBAAG1B,EAAM7E,KAAK,EACnF8E,cAAe,CACb0B,UAAW3B,EAAM2B,UACjBC,OAAQ,CACNC,MAAO7B,EAAM8B,YAAYD,MACzBE,MAAO/B,EAAM7E,KAAK6G,OAClBC,SAAUjC,EAAM7E,KAAK+G,UACrBC,SAAUnC,EAAM7E,KAAKiH,WAEvBC,kBAAmB,GAErBC,QAAStC,EAAMmB,iBAKzB,C,gDC9BA,QAA4B,Q,sGCe5B,IAAMoB,EAAY,4BAIZ,SAAUC,EAAmBxC,G,QAC3ByC,EAAQzC,EAAM7E,KAAKuH,WAHW,IAKhC1C,EAAM7E,KAAKuH,UASTC,EAAiB,2BACjBC,EAAqD,QAApC,EAAAD,EAAejD,cAAqB,QAAI,CAAC,EAC5DmD,EAAqC,QAArB,EAAAD,aAAa,EAAbA,EAAeE,cAAM,QAAI,GAEzCD,IAAkBE,MAAMC,QAAQH,KAClCA,EAAgB,CAACA,IAEnB,I,EAAMI,EAAgB,OAAH,wBACdN,GAAc,CACjBjD,OAAQ,OAAF,wBACDkD,GAAa,CAChBE,OAAQ,GAAF,Q,EAAQD,E,omBAAgB,4BAI5B5C,EAAgB,CACpB4B,MAAO7B,EAAM8B,YAAYD,MACzBF,UAAW3B,EAAM2B,UACjBU,kBAAmBrC,EAAMqC,mBAErBnC,EAAmB,CACvBG,OAAQ,mBACRF,SAAU,6BACVC,WAAY,WACZE,WAAY,sBAGd,OACE,uBAAKe,UAlC2B,IAA5BrB,EAAMqC,kBACD,0BAEF,gDAgCL,gBAACa,EAAA,EAAO,CACNC,QAASF,EACThD,cAAeA,EACfC,iBAAkBA,GAElB,sBAAImB,UAAU,MACZ,gBAAC+B,EAAA,EAAI,CAACb,UAAWA,EAAWc,OAAO,cAGvC,yBACE,gBAACD,EAAA,EAAI,CAACb,UAAWA,EAAWc,OAAO,YAAY,IAE/C,gBAACH,EAAA,EAAO,CACNC,QAASnD,EAAMuB,SAAS+B,eACxBjC,UAAU,YACVpB,cAAeA,EACfC,iBAAgB,+BACXA,GAAgB,CACnBI,WAAY,iBAGd,gBAAC8C,EAAA,EAAI,CAACb,UAAWA,EAAWc,OAAO,oBAC3B,KAIZ,uBAAKhC,UAAS,4BAAuB,IAClCrB,EAAM7E,KAAKoI,OAAOC,MAAM,EAAGf,GAAO/H,KAAI,SAAC+I,EAAG5D,GACzC,OACE,gBAAC6D,EAAA,EAAS,CACR1H,IAAK6D,EACL8D,MAAOF,EACPG,gBAAiB5D,EAAMuB,SAASqC,gBAChCC,sBAAuB7D,EAAM8D,UAC7B7D,cAAgB,CACd2B,OAAQ,CACNC,MAAO7B,EAAM8B,YAAYD,MACzBE,MAAO0B,EAAEzB,OACTC,SAAUwB,EAAEvB,UACZC,SAAUsB,EAAErB,WAEdC,kBAAmBrC,EAAMqC,mBAE3B0B,eAAgB/D,EAAM+D,eACtBC,iBAAkBhE,EAAMgE,kBAG9B,KAEF,uBAAK3C,UAAU,oBACb,gBAAC6B,EAAA,EAAO,CACN7B,UAAU,iBACV8B,QAASF,EACThD,cAAeA,EACfC,iBAAkBA,GAElB,gBAACkD,EAAA,EAAI,CAACb,UAAWA,EAAWc,OAAO,cAK7C,C,eClHM,SAAUY,EAAoBjE,GAClC,OACE,uBAAKqB,UAAU,QACb,gBAAC6C,EAAA,EAAS,CACRP,MAAO3D,EAAM7E,KACb0I,sBAAuB7D,EAAM8D,UAC7BF,gBAAiB,SAACH,EAAGU,GAAI,OAAKnE,EAAMuB,SAASqC,gBAAgBH,EAAGU,EAAK,EACrElE,cAAe,CACb2B,OAAQ,CACNC,MAAO7B,EAAM8B,YAAYD,MACzBE,MAAO/B,EAAM7E,KAAK6G,OAClBC,SAAUjC,EAAM7E,KAAK+G,UACrBC,SAAUnC,EAAM7E,KAAKiH,WAEvBC,kBAAmBrC,EAAMqC,mBAE3B+B,sBAAoB,EACpBC,kBAAmBC,EAAA,oBAA8BtE,EAAM+D,gBACvDC,iBAAkBhE,EAAMgE,mBAIhC,C,yBCcM,SAAUO,EAAmBvE,GACjC,IArBMwE,EAqBAC,GArBAD,GAAc,EAAAE,EAAA,MAEJC,IAAMH,EAAYI,IACzB,EAEF,EAkBDrB,EAASvD,EAAM6E,SAAStB,OAAOzI,KAAK0I,MAAM,EAAGiB,GAE7CK,EAA4C,CAChD1E,WAAY,WACZC,OAAQ,cACRF,SAAU,yBAGN4E,EAAqB,+BACtB/E,EAAMC,eAAa,CACtB7E,GAAI4E,EAAM6E,SAASzJ,GACnBqE,KAAMO,EAAM6E,SAASpF,OAGvB,OACE,uBAAK4B,UAAU,aACb,gBAAC2D,EAAA,EAAG,CAAC3D,UAAU,wBACb,gBAACN,EAAA,EAAG,CAACkE,GAAI,EAAG7D,GAAI,EAAGC,UAAU,QAC3B,gBAAC,KAAY,CACX8B,QAASnD,EAAMkF,gBACfjF,cAAeD,EAAMC,cACrBC,iBAAgB,+BACX4E,GAAuB,CAC1BxE,WAAY,aAEdxF,KAAMkF,EAAM6E,SACZhB,sBAAuB7D,EAAM6D,sBAC7BsB,mBAAoB,IACpBC,UAAU,aACVC,YAAarF,EAAMgE,iBAAiBqB,YACpCC,YAAatF,EAAMsF,YACnB5C,WAAW,EACX6C,WAAS,KAGb,gBAACxE,EAAA,EAAG,CAACkE,GAAI,EAAG7D,GAAI,GACd,uBAAKC,UAAU,kCACb,uBAAKA,UAAS,qBCnFE,UDoFbkC,aAAM,EAANA,EAAQ7I,KAAI,SAAAiJ,GACX,IAAM6B,EAAkB,+BACnBT,GAAqB,CACxBU,QAAS9B,EAAMvI,GACfsK,UAAW/B,EAAMlE,OAGnB,OACE,uBAAKzD,IAAK2H,EAAMvI,GAAIiG,UAAU,QAC5B,gBAACqC,EAAA,EAAS,CACRC,MAAOA,EACPC,gBAAiB5D,EAAM4D,gBACvB3D,cAAeuF,EACftF,iBAAkB,CAChBG,OAAQ,WACRF,SAAU,yBAEZwF,KAAK,KACL5B,eAAgB/D,EAAM+D,eACtB6B,mBAAiB,EACjB5B,iBAAkBhE,EAAMgE,mBAIhC,KAEF,uBAAK3C,UAAU,sBACb,gBAAC6B,EAAA,EAAO,CACN7B,UAAU,wBACV8B,QAASnD,EAAMkF,gBACfjF,cAAe8E,EACf7E,iBAAgB,+BACX4E,GAAuB,CAC1BxE,WAAY,aAGd,gBAAC8C,EAAA,EAAI,CAACb,UApGJ,4BAoG0Bc,OAAO,sBAQnD,CEzHM,SAAUwC,EAAoB7F,GAClC,OACE,uBAAKqB,UAAU,SACb,gBAACkD,EAAkB,CACjBM,SAAU7E,EAAM7E,KAChB+J,gBAAiBlF,EAAMuB,SAASuE,mBAAmB9F,EAAM7E,MACzD0I,sBAAuB7D,EAAM8D,UAC7B7D,cAAe,CACb2B,OAAQ,CACNC,MAAO7B,EAAM8B,YAAYD,MACzBE,MAAO/B,EAAM7E,KAAK6G,OAClBC,SAAUjC,EAAM7E,KAAK+G,UACrBC,SAAUnC,EAAM7E,KAAKiH,WAEvBC,kBAAmBrC,EAAMqC,mBAE3BiD,YAAatF,EAAMsF,YACnBS,cAAY,EACZnC,gBAAiB5D,EAAMuB,SAASqC,gBAChCG,eAAgB/D,EAAM+D,eACtBC,iBAAkBhE,EAAMgE,mBAIhC,C,eCaM,SAAUgC,EAAiBhG,GAC/B,IAvBMwE,EAuBAC,GAvBAD,GAAc,EAAAE,EAAA,MAEJC,IAAMH,EAAYI,IACzB,EAELJ,EAAYpD,IAAMoD,EAAYtD,GACzB,EAEF,EAiBDqC,EAASvD,EAAMiG,OAAO1C,OAAOzI,KAAK0I,MAAM,EAAGiB,GAE3CyB,EAA0C,CAC9C9F,WAAY,WACZC,OAAQ,YACRF,SAAU,uBAGNgG,EAAmB,+BACpBnG,EAAMC,eAAa,CACtB7E,GAAI4E,EAAMiG,OAAO7K,GACjBqE,KAAMO,EAAMiG,OAAOxG,OAGrB,OACE,uBAAK4B,UAAU,aACb,gBAAC2D,EAAA,EAAG,CAAC3D,UAAU,wBACb,gBAACN,EAAA,EAAG,CAACkE,GAAI,EAAG7D,GAAI,EAAGC,UAAU,QAC3B,gBAAC6B,EAAA,EAAO,CACNC,QAASnD,EAAMoG,cACf/E,UAAU,oBACVpB,cAAekG,EACfjG,iBAAgB,+BACXgG,GAAqB,CACxB5F,WAAY,mBAGd,gBAAC+F,EAAA,EAAgB,CACfJ,OAAQjG,EAAMiG,OACdpC,sBAAuB7D,EAAM6D,sBAC7BkC,aAAc/F,EAAM+F,aACpBO,WAAW,uBAIjB,gBAACvF,EAAA,EAAG,CAACkE,GAAI,EAAG7D,GAAI,GACd,uBAAKC,UAAU,kCACb,uBAAKA,UAAS,qBCpFE,UDqFbkC,aAAM,EAANA,EAAQ7I,KAAI,SAAAiJ,GACX,IAAM6B,EAAkB,+BACnBW,GAAmB,CACtBV,QAAS9B,EAAMvI,GACfsK,UAAW/B,EAAMlE,OASnB,OALAkE,EAAQ,OAAH,wBACAA,GAAK,CACRsC,OAAQjG,EAAMiG,SAId,uBAAKjK,IAAK2H,EAAMvI,GAAIiG,UAAU,QAC5B,gBAACqC,EAAA,EAAS,CACRC,MAAOA,EACPC,gBAAiB5D,EAAM4D,gBACvB3D,cAAeuF,EACftF,iBAAkB,CAChBG,OAAQ,WACRF,SAAU,uBAEZwF,KAAK,KACL5B,eAAgB/D,EAAM+D,eACtB6B,mBAAiB,EACjB5B,iBAAkBhE,EAAMgE,mBAIhC,KAEF,uBAAK3C,UAAU,sBACb,gBAAC6B,EAAA,EAAO,CACN7B,UAAU,wBACV8B,QAASnD,EAAMoG,cACfnG,cAAekG,EACfjG,iBAAgB,+BACXgG,GAAqB,CACxB5F,WAAY,aAGd,gBAAC8C,EAAA,EAAI,CAACb,UA5GJ,0BA4G0Bc,OAAO,sBAQnD,CEhIM,SAAUkD,EAAkBvG,GAChC,OACE,uBAAKqB,UAAU,SACb,gBAAC2E,EAAgB,CACfnC,sBAAuB7D,EAAM8D,UAC7BmC,OAAQjG,EAAM7E,KACdiL,cAAepG,EAAMuB,SAASiF,iBAAiBxG,EAAM7E,MACrDyI,gBAAiB5D,EAAMuB,SAASqC,gBAChC3D,cAAe,CACb2B,OAAQ,CACNC,MAAO7B,EAAM8B,YAAYD,MACzBE,MAAO/B,EAAM7E,KAAK6G,OAClBC,SAAUjC,EAAM7E,KAAK+G,UACrBC,SAAUnC,EAAM7E,KAAKiH,WAEvBC,kBAAmBrC,EAAMqC,mBAE3B0D,cAAY,EACZhC,eAAgB/D,EAAM+D,eACtBC,iBAAkBhE,EAAMgE,mBAIhC,C,qCCIM,SAAUyC,EAAoBzG,GAClC,IAZMwE,EAYAC,GAZAD,GAAc,EAAAE,EAAA,MAEJO,GACP,EAELT,EAAYvD,GACP,EAEF,EAMDyF,EAAiB,CACrBzG,cAAeD,EAAMC,cACrBC,iBAAkBF,EAAME,kBAG1B,OACE,gCACE,sBAAImB,UAAU,sBACXrB,EAAMuD,OAAOC,MAAM,EAAGiB,GAAW/J,KAAI,SAAA+I,G,MAC9BkD,IAAqBlD,EAAEmD,kBAA2B,QAAR,EAAAnD,EAAEoD,cAAM,eAAEzL,IAE1D,OACE,sBAAIY,IAAG,UAAKgE,EAAM8G,aAAY,YAAIrD,EAAErI,IAAMiG,UAAU,6BAClD,gBAAC6B,EAAA,EAAO,iBACFwD,EAAc,CAClBrF,UAAU,UACV8B,QAASnD,EAAM4D,gBAAgBH,KAE9BkD,GAAoB,gCAAE,gBAAC,IAAa,CAAChD,MAAOF,IAAK,KACjDA,EAAEhE,MAIX,KAGF,gBAACyD,EAAA,EAAO,iBACFwD,EAAc,CAClBrF,UAAU,YACV8B,QAASnD,EAAMmD,UAEf,gBAACC,EAAA,EAAI,CAACb,UAzDI,6BAyDkBc,OAAO,YAI3C,C,oECpBM,SAAU0D,EAAoB/G,G,UAU1BlF,EATF0J,GAAc,EAAAE,EAAA,KAEdsC,EAAmB,OADZC,EAAA,UAAwBzC,EAAa,MAG5C0C,KAA2C,QAA7B,EAAuB,QAAvB,EAAAlH,EAAMmH,WAAW5D,cAAM,eAAEzI,YAAI,eAAEE,QAE7CoM,EAA0BF,GAAalH,EAAMmH,WAAW5D,OAAOzI,KAAKuM,MAAK,SAAA5D,GAAI,MAAC,SAAa,QAAX,EAAAA,EAAE6D,iBAAS,eAAE5G,IAAG,IAiBhGT,GAdEnF,EAAI,+BACLkF,EAAMC,eAAa,CACtB7E,GAAI4E,EAAMmH,WAAW/L,GACrBqE,KAAMO,EAAMmH,WAAW1H,OAGrB2H,IACFtM,EAAK2K,QAAU2B,EAAwBhM,GACvCN,EAAK4K,UAAY0B,EAAwB3H,MAGpC3E,GAIHyM,EAAoC,WAAzBvH,EAAMwH,eAEvB,OACE,uBAAKnG,UAAS,kBAAa2F,EAAU,GAAK,SACxC,gBAACjG,EAAA,EAAG,iBAAKkG,EAAA,wBAAqC,CAAE5F,UAAS,6CAAwC2F,EAAU,YAAc,eACvH,uBAAK3F,UAAS,4CAAuC2F,EAAU,UAAY,cACzE,gBAACS,EAAA,EAAS,CACR3M,KAAMsM,aAAuB,EAAvBA,EAAyBE,UAC/BnE,QAASnD,EAAMmD,QACfuE,UAAW,gBACXzH,cAAeA,EACfC,iBAAgB,+BACXF,EAAME,kBAAgB,CACzBI,WAAY,kBAGd,gBAACqH,EAAA,EAAI,CAACC,KAAM5H,EAAM6H,WAClB,gBAACC,EAAA,GAAa,CAACF,KAAM5H,EAAM+H,oBAE3B,uBAAK1G,UAAS,wFChG2B,UDiGvC,gBAAC+B,EAAA,EAAI,CAACb,UAzEF,6BAyEwBc,OAAO,eAM3C,gBAACtC,EAAA,EAAG,iBAAKkG,EAAA,sBAAmC,CAAE5F,UAAW2F,EAAU,OAAS,UACxEhH,EAAMgI,UACN,gBAACC,EAAA,EAAgB,CACfC,QAASlI,EAAMmI,qBACbnI,EAAMmH,WACNnH,EAAMoI,YACNpI,EAAMwH,eACNxH,EAAME,kBAERmB,UAAU,kBACVgH,yBAAyB,sBAI7B,gBAACnF,EAAA,EAAO,CACNC,QAASnD,EAAMmD,QACflD,cAAeA,EACfC,iBAAgB,+BACXF,EAAME,kBAAgB,CACzBI,WAAY,cAGd,sBAAIe,UAAU,YAAW,wBAAMA,UAAU,WAAWrB,EAAMmH,WAAW1H,QAGtE8H,IAAavH,EAAMsI,YAClB,gBAACC,EAAA,EAAkB,KACjB,gBAACC,EAAA,EAAK,CAACZ,KAAMY,EAAA,SAAkB1N,KAAOkF,EAAMmH,WAAsBsB,SAClE,gBAACD,EAAA,EAAK,CAACZ,KAAMY,EAAA,iBAA0B1N,KAA2C,QAApC,EAAAkF,EAAMmH,WAAsBvG,gBAAQ,eAAE8H,QAIvFxB,GACC,gBAACT,EAAmB,CAClBK,aAAc9G,EAAMmH,WAAW/L,GAC/BmI,OAAQvD,EAAMmH,WAAW5D,OAAOzI,KAChCqI,QAASnD,EAAMmD,QACflD,cAAeA,EACfC,iBAAgB,+BACXF,EAAME,kBAAgB,CACzBI,WAAY,YAEdsD,gBAAiB5D,EAAM4D,mBAMnC,CE1IM,SAAU+E,EAAoB3I,GAClC,OACE,uBAAKqB,UAAS,4BAAuB,IACnC,gBAAC0F,EAAmB,CAClB9G,cAAe,CACb2B,OAAQ,CACNC,MAAO7B,EAAM8B,YAAYD,MACzBE,MAAO/B,EAAM7E,KAAK6G,OAClBC,SAAUjC,EAAM7E,KAAK+G,UACrBC,SAAUnC,EAAM7E,KAAKiH,WAEvBC,kBAAmBrC,EAAMqC,mBAE3BnC,iBAAkB,CAChBG,OAAQ,cACRD,WAAY,WACZD,SAAU,uBAEZgD,QAASnD,EAAMuB,SAASuE,mBAAmB9F,EAAM7E,MACjDiN,YAAapI,EAAMoI,YACnBjB,WAAYnH,EAAM7E,KAClBqM,eAAe,WACfK,SAAUF,EAAA,WACVI,kBAAmBD,EAAA,qBACnBE,SAAUhI,EAAMgE,iBAAiBgE,SACjCpE,gBAAiB5D,EAAMuB,SAASqC,gBAChCuE,qBAAsBnI,EAAMuB,SAAS4G,uBAI7C,CC9BM,SAAUS,EAAkB5I,GAChC,OACE,uBAAKqB,UAAS,4BAAuB,IACnC,gBAAC0F,EAAmB,CAClB9G,cAAe,CACb2B,OAAQ,CACNC,MAAO7B,EAAM8B,YAAYD,MACzBE,MAAO/B,EAAM7E,KAAK6G,OAClBC,SAAUjC,EAAM7E,KAAK+G,UACrBC,SAAUnC,EAAM7E,KAAKiH,WAEvBC,kBAAmBrC,EAAMqC,mBAE3BnC,iBAAkB,CAChBG,OAAQ,YACRD,WAAY,WACZD,SAAU,qBAEZgD,QAASnD,EAAMuB,SAASiF,iBAAiBxG,EAAM7E,MAC/CqM,eAAe,SACfL,WAAYnH,EAAM7E,KAClBiN,YAAapI,EAAMoI,YACnBP,SAAUF,EAAA,SACVI,kBAAmBD,EAAA,mBACnBQ,YAAU,EACVN,SAAUhI,EAAMgE,iBAAiBgE,SACjCpE,gBAAiB5D,EAAMuB,SAASqC,gBAChCuE,qBAAsBnI,EAAMuB,SAAS4G,uBAI7C,C,cCrCM,SAAUU,EAAc7I,GAC5B,OACE,gBAACe,EAAA,EAAG,CAACC,GAAG,KAAKC,GAAI,EAAGC,GAAIlB,EAAMmB,cAAgB,EAAI,EAAGC,GAAIpB,EAAMmB,cAAgB,EAAI,GACjF,uBAAKE,UAAS,+BACZ,gBAAC,KAAiB,CAChBvG,KAAMkF,EAAM7E,KACZmG,gBAAiBtB,EAAMuB,SAASuH,yBAChCrH,uBACE,WAAK,QAAC,OAA8C,QAA9C,KAAAzB,EAAMuB,UAASwH,uCAA+B,sBAAG/I,EAAM7E,KAAK,EAEpE6N,uBAAwBhJ,EAAMgJ,uBAC9B/I,cAAe,CACb0B,UAAW3B,EAAM2B,UACjBC,OAAQ,CACNC,MAAO7B,EAAM8B,YAAYD,MACzBE,MAAO/B,EAAM7E,KAAK6G,OAClBC,SAAUjC,EAAM7E,KAAK+G,UACrBC,SAAUnC,EAAM7E,KAAKiH,WAEvBC,kBAAmB,GAErBC,QAAStC,EAAMmB,cACf8H,iBAAkBjJ,EAAMgE,iBAAiBkF,yBAKnD,C,0BCvBM,SAAUC,EAAYnJ,GAa1B,IAXE2D,EAWIyF,GAXJzF,EAWiC3D,EAAM7E,KATnCmJ,EAAA,SAAmBX,GACd0F,EAAA,EAEL/E,EAAA,gBAA0BX,GACrB2F,EAAA,EAEF5F,EAAA,GAKT,OACE,uBAAKrC,UAAS,4BAAuB,IACnC,gBAAC+H,EAAS,CACRzF,MAAO3D,EAAM7E,KACbyI,gBAAiB5D,EAAMuB,SAASqC,gBAChC2F,2BAA4BvJ,EAAMuB,SAASgI,2BAC3C1F,sBAAuB7D,EAAM8D,UAC7B7D,cAAgB,CACd2B,OAAQ,CACNC,MAAO7B,EAAM8B,YAAYD,MACzBE,MAAO/B,EAAM7E,KAAK6G,OAClBC,SAAUjC,EAAM7E,KAAK+G,UACrBC,SAAUnC,EAAM7E,KAAKiH,WAEvBC,kBAAmBrC,EAAMqC,mBAE3B0B,eAAgB/D,EAAM+D,eACtBC,iBAAkBhE,EAAMgE,mBAIhC,C,8tBCpBA,IA+BawF,EAAqB,QAAW,SAASxJ,G,oBAC9CwE,GAAc,EAAAE,EAAA,KACd+E,EAAoBjF,EAAYS,IAAMT,EAAYvD,GAExD,KAAkB,QAAb,EAAAjB,EAAM0J,eAAO,eAAE1O,WAAuB,QAAZ,EAAAgF,EAAM2J,cAAM,eAAEC,iBAAgC,QAAf,EAAA5J,EAAM6J,iBAAS,eAAED,cAC7E,OAAO,iCAET,IAAME,EAAqB,GAAH,SACK,QAAxB,EAAe,QAAf,EAAA9J,EAAM6J,iBAAS,eAAEH,eAAO,QAAI,IAAE,EACT,QAArB,EAAY,QAAZ,EAAA1J,EAAM2J,cAAM,eAAED,eAAO,QAAI,KAGxBK,EAAU,eACd5I,cAAe2I,EAAmB9O,OAAS,GACxCgF,GAGL,OACE,uBAAKqB,UAAU,qBACb,qBAAG2I,KAAK,SAAS3I,UAAU,mBAAkB,gBAAC+B,EAAA,EAAI,CAACb,UAlDvC,4BAkD6Dc,OAAO,kBAE7EyG,EAAmB9O,QACpB,gBAACgK,EAAA,EAAG,CAAChE,GAAG,KAAKK,UAAU,gCACpByI,EAAmBtG,MAAM,EApDR,GAoDgC9I,KAAI,SAACuP,EAAGtI,GACxD,OAAQsI,EAAErC,KAAKsC,eACb,IAAK,UACH,OACE,gBAACpJ,EAAa,eACZ9E,IAAK2F,EACLxG,KAAM8O,EACNtI,UAAWA,GACPoI,IAGV,IAAK,UACH,OACE,gBAAClB,EAAa,eACZ7M,IAAK2F,EACLxG,KAAM8O,EACNtI,UAAWA,GACPoI,IAKd,KAIU,QAAb,EAAA/J,EAAM0J,eAAO,eAAEhP,KAAI,SAACyP,EAAQC,G,QACrB/H,EAAoByH,EAAmB9O,OAASoP,EAAQ,EAAIA,EAElE,GAAI,yBAA0BD,GAAUA,EAAOE,qBAC7C,OACE,gBAAC7H,EAAkB,eACjBxG,IAAKoO,EACLjP,KAAMgP,EACN9H,kBAAmBA,GACf0H,IAMV,OAAmB,QAAX,EAAAI,EAAOvC,YAAI,eAAEsC,eACnB,IAAK,cACL,IAAK,OACL,IAAK,QACH,OAAc,IAAVE,GAAeD,EAAO/H,WAAakC,EAAA,UAAoB6F,GAEvD,gBAAClG,EAAmB,eAClBjI,IAAKoO,EACLjP,KAAMgP,EACN9H,kBAAmBA,GACf0H,IAMR,gBAACZ,EAAW,eACVnN,IAAKoO,EACLjP,KAAMgP,EACN9H,kBAAmBA,GACf0H,IAKV,IAAK,WACH,OAAIN,EAEA,gBAACd,EAAmB,eAClB3M,IAAKoO,EACLjP,KAAMgP,EACN9H,kBAAmBA,GACf0H,IAMR,gBAAClE,EAAmB,eAClB7J,IAAKoO,EACLjP,KAAMgP,EACN9H,kBAAmBA,GACf0H,IAKV,IAAK,SAGH,OAAIN,KAAuC,QAAjB,EAFXU,EAEkBG,kBAAU,eAAElP,IAEzC,gBAACwN,EAAiB,eAChB5M,IAAKoO,EACLjP,KAAMgP,EACN9H,kBAAmBA,GACf0H,IAMR,gBAACxD,EAAiB,eAChBvK,IAAKoO,EACLjP,KAAMgP,EACN9H,kBAAmBA,GACf0H,IAKd,IAGN,I,WC7LM,GAAY,0BAQZ,SAAUQ,GAAiBvK,GAC/B,OAAKA,EAAMwK,WAIT,uBAAKnJ,UAAU,QACb,qBAAGA,UAAU,WACX,gBAAC+B,EAAA,EAAI,CAACb,UAAW,GAAWc,OAAO,eAAe,IAClD,gBAACH,EAAA,EAAO,CACN7B,UAAU,YACV8B,QAASnD,EAAMyK,WAAWzK,EAAMwK,WAAYxK,EAAM8B,aAClD4I,eAAgB,CAAEC,SAAS,IAE1B3K,EAAMwK,aAGX,qBAAGnJ,UAAU,qBACX,gBAAC+B,EAAA,EAAI,CAACb,UAAW,GAAWc,OAAO,qBACnC,gBAACH,EAAA,EAAO,CACN7B,UAAU,YACV8B,QAASnD,EAAMyK,WAAWzK,EAAM8B,YAAYD,MAAO,OAAF,wBAAO7B,EAAM8B,aAAW,CAAE8I,gBAAiB,YAE3F5K,EAAM8B,YAAYD,OAErB,gBAACuB,EAAA,EAAI,CAACb,UAAW,GAAWc,OAAO,kBAtBhC,gCA0BX,CCpCA,IAAM,GAAY,2BAaZ,SAAUwH,GAAkB7K,G,MAChC,OAAsB,QAAjB,EAAAA,EAAM8K,mBAAW,eAAE9P,QAItB,uBAAKqG,UAAU,kCACb,gBAAC+B,EAAA,EAAI,CAACb,UAAW,GAAWc,OAAO,eAAe,IAGjDrD,EAAM8K,YAAYpQ,KAAI,SAACqQ,EAAYX,GAAK,OACvC,gBAAC,WAAc,CAACpO,IAAG,UAAK+O,EAAU,YAAIX,IACzB,IAAVA,GAAe,wBAAM/I,UAAU,QAAM,KAEtC,gBAAC6B,EAAA,EAAO,CACN7B,UAAU,YACV8B,QAASnD,EAAMyK,WAAWM,EAAY/K,EAAM8B,aAC5C4I,eAAgB,CAAEC,SAAS,IAE1BI,GAEY,KAlBd,gCAsBX,CA7BAF,GAAkBG,aAAe,CAC/BF,YAAa,GACbhJ,YAAa,CAAC,G,kVCRV,SAAUmJ,GAAqBC,GACnC,IACMC,GAAYpH,GADS,EAAAqH,GAAA,KAAnBrH,gBACyBsH,GAAA,qBAEjC,GAGI,EAAAC,GAAA,KAFFtC,EAAsB,EAAtBA,uBACAuC,EAAsB,EAAtBA,uBAUIC,EANAL,EACKD,EAAe,CAACA,aAAY,EAAZA,EAAc9P,IAAM,KAEtC4N,aAAsB,EAAtBA,EAAwBtO,KAAI,SAAA+Q,GAAC,OAAIA,EAAErQ,EAAE,IAK9C,OAAO,mBACLmQ,GACAC,GACAE,GAAA,eAA4BF,GAEhC,C,+DC3BaG,GAAa,CACxBhI,MAAO,sBACPsC,OAAQ,oBACRpB,SACE,kHAEF+G,eAAgB,gCAAF,OAAkCC,GAAA,WAAgB,KAChEC,KAAM,qBACNC,YAAa,4BACbC,QAAS,OACTC,SAAU,8B,u+DCFZ,SAASC,GAAqB7O,G,UAYxBuM,EAAevM,EAASuM,aAEtBF,EAsBJ,QAtBc,EAAiB,QAAjB,EAAArM,aAAQ,EAARA,EAAUqM,eAAO,eAAEyC,QAAO,SAAAhC,G,oBACxC,GAAsB,WAAlBA,EAAOiC,QAAyC,aAAlBjC,EAAOiC,OACvC,OAAO,EAET,GAAsB,aAAlBjC,EAAOiC,OAAuB,CAChC,IAAMvH,EAAWsF,EAEjB,UAAwB,QAApB,EAAc,QAAd,EAAAtF,EAASwH,aAAK,eAAEvR,YAAI,eAAEE,UACK,QAA3B,EAAqB,QAArB,EAAA6J,EAASyH,oBAAY,eAAExR,YAAI,eAAEE,UACR,QAArB,EAAe,QAAf,EAAA6J,EAAStB,cAAM,eAAEzI,YAAI,eAAEE,WAG3B4O,KACO,EACR,CAED,OAAqE,KAAb,QAApD,EAA8C,QAA9C,EAACO,EAAuC5G,cAAM,eAAEzI,YAAI,eAAEE,UACxD4O,KACO,EAIX,WAAE,QAAI,GAENvM,EAASqM,QAAUA,EACnBrM,EAASuM,aAAeA,EAIxB,IAAM2C,EAA2B,QAAV,EAAA7C,EAAQ,UAAE,eAAE1H,OAEnC,OAAO,OAAP,wBACK3E,GAAQ,CACXqM,QAAS8C,GAAA,6BAA8C9C,EAAS6C,IAEpE,CAEA,SAASE,GAAgB/Q,GACvB,OAAOgR,OAAOC,QAAQjR,GAAKT,QAAO,SAAC2R,EAAM,GAAe,IAAXC,EAAW,QAAN,GAC5CC,EAAmBD,EAQvB,MANqB,WAAjB,GAAOA,GACTC,EAAmBL,GAAgBI,GAC1B,CAAE,SAAU,UAAW,UAAWE,SAAS,GAAOF,MAC3DC,EAAmBD,EAAMjO,YAGtBgO,EAAK5R,OAGH,GAAP,OAAU4R,EAAI,YAAIE,GAFTA,CAGX,GAAG,GACL,CAEO,IAAM,GAAuB,CAClCE,SAAQ,SACNnL,EACAoL,GAC4B,IAA5BC,EAAA,uDAA0B,GAEpBC,EAAaD,EAAQxS,KAAI,SAAA0S,GAAC,MAAI,CAAEA,EAAEhS,GAAIgS,aAAC,EAADA,EAAG9P,OAAQ,IACjD+P,EAAaZ,GAAgBQ,GAE7BjR,EAAM,aAAH,OAAgB6F,EAAK,YAAIsL,EAAU,YAAIE,GAM5C,EAAAJ,EAHF,YAAIK,GAAA,sBAAmC,kBAAmBC,EAAa,KACvEpC,EAAS,EAATA,UACGqC,EAAc,KAHb,uCAMA1S,EAAO,CACXoS,QAAAA,EACAO,QAASF,EACTN,QAASP,OAAOC,QAAQa,GACrBvS,QAAO,SAAC2R,EAAM,GAAF,cAAI5Q,EAAG,KAAE6Q,EAAK,YACzB,+BAAMD,GAAI,MAAG5Q,EAAI2O,QAAQ,WAAY,IAAMkC,GAAK,GAAK,CAAC,GAC1DhL,MAAAA,EACA6L,mBAAmB,EACnBvC,YAAaA,EACbwC,KAAMhC,IAGR,MAAO,CACLjL,IAAK,sBACLkN,UAAW,iBACXhG,KAAMiG,GAAA,OACN/S,KAAAA,EACAgT,WAAY,SAACzQ,GACX,IAAM0Q,EAAyB1Q,EAAS6P,QAAQ7F,MAAK,SAAA+F,GAAC,OAAIA,EAAEY,WAAaC,GAAA,sBAAiC,IAM1G,OAAIF,EACK,CACLb,QAAS,CAACa,IAIP1Q,CACT,EACArB,IAAAA,EAEJ,EAEAkS,SAAQ,SACNrM,EACAsM,GAIc,IAHdlB,EAAA,uDAAsB,CAAC,EACvBrC,IAAA,yDACAtN,EAAe,uCACfmF,EAAc,uCAEVzG,EAAM,aAAH,OAAgB6F,EAAK,YAAI+I,EAAe,YAAIuD,EAAU,YAAI7Q,GAEjEtB,GAAO0Q,OAAO0B,KAAKnB,GAASvS,KAAI,SAAA2T,GAC9B,IAAMlC,EAASc,EAAQoB,GACvB,OAAOtL,MAAMC,QAAQmJ,GAAUA,EAAOmC,KAAK,KAAOnC,CACpD,IAAGmC,KAAK,KAMJ,MAAArB,EAHF,YAAIK,GAAA,sBAAmC,2BAA4BiB,EAAuB,KAC1FpD,EAAS,EAATA,UACGqC,EAAc,KAHb,uCAaA1S,EAAO,CACX0T,WAAY,UACZf,QATcU,EAAWzT,KAAI,SAAA0P,GAC7B,MAAc,UAAVA,GAAsBmE,EAGnB,CAAEnE,MAAAA,EAAO6C,QAAS,CAAEsB,wBAAAA,IAFlB,CAAEnE,MAAAA,EAGb,IAKE6C,QAASP,OAAOC,QAAQa,GACrBvS,QAAO,SAAC2R,EAAM,GAAF,cAAI5Q,EAAG,KAAE6Q,EAAK,YACzB,+BAAMD,GAAI,MAAG5Q,EAAI2O,QAAQ,WAAY,IAAMkC,GAAK,GAAK,CAAC,GAC1DhL,MAAAA,EACA+I,gBAAAA,EACAtN,OAAQA,QAAAA,OAAUmR,EAClBtD,YAAaA,EACb1I,MAAAA,GAGF,MAAO,CACL/B,IAAK,sBACLkN,UAAW,iBACXhG,KAAMiG,GAAA,OACN/S,KAAAA,EACAkB,IAAAA,EACA8R,WAAY5B,GAEhB,EAEAtK,OAAM,SACJC,EACA4L,GAM0B,IAL1BR,EAAA,uDAAsB,CAAC,EACvBrC,IAAA,yDACAtN,EAAe,uCACfmF,EAAc,uCACdiM,EAA0C,uCAC1CC,EAA0B,uCAEtB3S,EAAM,UAAH,OAAa6F,EAAK,YAAI+I,EAAe,YAAI6C,EAAO,YAAInQ,GAE3DtB,GAAO0Q,OAAO0B,KAAKnB,GAASvS,KAAI,SAAA2T,GAC9B,IAAMlC,EAASc,EAAQoB,GACvB,OAAOtL,MAAMC,QAAQmJ,GAAUA,EAAOmC,KAAK,KAAOnC,CACpD,IAAGmC,KAAK,KAER,IAAM5O,EAASgN,OAAOkC,OAAO,CAAC,EAAG,OAAF,QAC7BxE,MAAOqD,EACPnQ,OAAQA,QAAAA,OAAUmR,EAClB5M,MAAAA,EACA+I,gBAAAA,EACAnI,MAAAA,GACGwK,IAGL,MAAO,CACLvM,IAAKmO,GAAA,aAAqB,sBAAuBnP,GACjDkO,UAAWiB,GAAA,aAAqB,cAAenP,GAC/C1D,IAAAA,EACA8R,WAAY5B,GACZwC,QAAAA,EACAC,MAAAA,EAEJ,EAEAG,uBAAsB,SACpBjN,EACA4L,GAIkB,IAHlBR,EAAA,uDAAsB,CAAC,EACvB3P,EAAe,uCACfoR,EAAqC,uCACrCC,EAAkB,uCAEZjP,EAAS,OAAH,QACV0K,MAAOqD,EACPnQ,OAAAA,EACAuE,MAAAA,GACGoL,GAGDjR,EAAM,kBAAH,OAAqB6F,EAAK,YAAI4L,EAAQa,KAAK,KAAI,YAAIhR,GAO1D,OALAtB,GAAO0Q,OAAO0B,KAAKnB,GAASvS,KAAI,SAAA2T,GAC9B,IAAMlC,EAASc,EAAQoB,GACvB,OAAOtL,MAAMC,QAAQmJ,GAAUA,EAAOmC,KAAK,KAAOnC,CACpD,IAAGmC,KAAK,KAED,CACL5N,IAAKmO,GAAA,aAAqB,+CAAgDnP,GAC1EkO,UAAWiB,GAAA,aAAqB,uCAAwCnP,GACxE1D,IAAAA,EACA0S,QAAAA,EACAC,MAAAA,EACAI,WAAW,EAEf,G,wRC9OF,IAAMC,GAAkB,CAAE,yBAA0B,wBAC9CC,GAAkB,CAAE,yBAA0B,uBAAwB,a,muBCyB5E,SAASC,K,cACD5J,EAAc,mBAAkC6J,GAAA,iBAEhDC,GAAW,UACXC,GAAW,EAAAC,EAAA,GAAY,MAEvBC,EAAoB,mBAAiCC,GAAA,wBACrDC,EAA4C,QAAtB,EAAAF,EAAkBzU,YAAI,eAAE4U,SAE9CC,EAA4BP,EAASQ,WAAWC,GAAA,aAAuBR,EAASM,0BAGhFG,EAAmB,oBACP,QAAhB,EAAAxK,EAAYxK,YAAI,eAAEiV,kBAAmBP,GAAA,kBAFY,CAAE,gBAAiB,gBAAiB,YAAa,gBAAiB,cAKjHQ,EAAiC,QAArB,EAAAF,EAAiBhV,YAAI,QAAI,GACnCmV,EAAuBD,aAAS,EAATA,EAAWE,WAAU,SAAAC,GAAC,OAAIA,EAAEvI,OAASwI,GAAA,UAA0B,IACtFC,EAAmD,QAA/B,EAAAL,EAAUC,UAAqB,eAAE7U,GAK3D,GAHKuU,IACHK,EAAY,GAAH,UAAQA,EAAUxM,MAAM,EAAGyM,IAAqB,GAAKD,EAAUxM,MAAMyM,EAAuB,MAEnGR,EAAqB,CACvB,IAAMa,EAAkBN,aAAS,EAATA,EAAWE,WAAU,SAAAC,GAAC,OAAIA,EAAE/U,GAAGwD,aAAe6Q,EAAoB7Q,UAAU,IACpGoR,EAAY,GAAH,UAAQA,EAAUxM,MAAM,EAAG8M,IAAgB,GAAKN,EAAUxM,MAAM8M,EAAkB,IAC5F,CAOD,MAAO,CACLC,sBALAhB,EAAkBhT,iBACA,QAAhB,EAAA+I,EAAYxK,YAAI,eAAEiV,kBAAmBD,EAAiBvT,cAKxDyT,UAAAA,EACAK,kBAAAA,EACAZ,oBAAAA,EACAE,0BAAAA,EAEJ,CAEA,SAASa,K,QACDlL,EAAc,mBAAkC6J,GAAA,iBAChDsB,EAAU,mBAA+BC,GAAA,UAAuC,QAAhB,EAAApL,EAAYxK,YAAI,eAAE6V,cAExF,GAEI,EAAArF,GAAA,KADFsF,EAAkB,EAAlBA,mBAAoB5H,EAAsB,EAAtBA,uBAAwB6H,EAAuB,EAAvBA,wBAAyBtF,EAAsB,EAAtBA,uBAGjEuF,EAAsBF,GAAsBC,IAElD,OAAKtF,GAGDvC,aAAsB,EAAtBA,EAAwBhO,QAAS,IAAM8V,GAGrBC,GAAA,6BAAwCD,EAAoBE,iBAC5DC,GAAA,UAHbR,EAMF,OAAP,wBACKA,GAAO,CACV3V,KAAkB,QAAZ,EAAA2V,EAAQ3V,YAAI,eAAEqR,QAAO,SAAA1D,GAEzB,OAAOA,EAAOyI,MAAQzI,EAAOoE,MAAQ,EACvC,MAdO4D,CAgBX,CAMM,SAAUU,GACdrP,G,gBAEMwD,EAAc,mBAAkC6J,GAAA,iBAChDiC,EAAc,oBAA2C,QAAhB,EAAA9L,EAAYxK,YAAI,eAAEM,KAAM+T,GAAA,OAAkB7J,EAAYxK,KAAKM,KACpGiW,EAAS,mBAA6BC,GAAA,YACtCC,EAAa,oBACD,QAAhB,EAAAjM,EAAYxK,YAAI,eAAEiV,kBAAmByB,GAAA,aAA4BlM,EAAYxK,KAAK2W,aAE9ErC,GAAW,UACXC,GAAW,EAAAC,EAAA,GAAY,MAE7B,EAMIJ,KALFqB,EAAqB,EAArBA,sBACAP,EAAS,EAATA,UACAK,EAAiB,EAAjBA,kBACAZ,EAAmB,EAAnBA,oBACAE,EAAyB,EAAzBA,0BAGF,GAEI,EAAArE,GAAA,KADFsF,EAAkB,EAAlBA,mBAAoB5H,EAAsB,EAAtBA,uBAAwB6H,EAAuB,EAAvBA,wBAAyBtF,EAAsB,EAAtBA,uBAGjEuF,EAAsBF,GAAsBC,IAC5Ca,EAAwBZ,aAAmB,EAAnBA,EAAqB1V,GAE7CuW,GAAc,EAAAC,GAAA,KAEd9N,GAAY,EAAA+N,GAAA,KAEZC,EAAe7G,GAAqB6F,GACpCiB,EAAgD,QAA/B,EAAiB,QAAjB,EAAAD,EAAahX,YAAI,eAAEgX,oBAAY,eAAEpX,KAAI,SAAA+Q,GAAC,OAAIA,EAAErQ,EAAE,IAC/D4W,EAAkB,oBAAmCF,aAAY,EAAZA,EAAchX,OACvEmX,GAAA,sCAA2DF,IAEvDtB,EAAUD,KAEhB,GAAgD,EAAApF,GAAA,KAAxCrH,EAAc,EAAdA,eAAgBmO,EAAmB,EAAnBA,oBAElB/G,EAAYpH,EAAesH,GAAA,qBAC3B8G,EAAsBD,EAAoB,uBAC1CE,EAAqBrO,EAAesH,GAAA,iBACpCgH,EAAiBtO,EAAesH,GAAA,gBAEhC1B,ED7IF,SACJ7H,GAIkB,I,EAHlB2O,EAAA,uDAAoB,GACpB6B,EAAsB,uCACtBtJ,EAAsC,uCACtCuJ,EAAkB,uCAEZC,GAAa/B,aAAO,EAAPA,EAASzV,SAAUyX,GAAA,4BACpC3Q,EACA2O,EACA,CAAC6B,GACDC,EACA,IAGItF,EAAU,UAAkBuF,EAAYD,EAAYtD,GAAkBD,IAC5E/B,EAAQ,8BAAgCyF,GAAA,UACxCzF,EAAQ,kBAAoB0F,GAAA,aAExB7Q,aAAW,EAAXA,EAAa8Q,eACf3F,EAAQ,uBAAyB4F,GAAA,iBAE/B7J,EAAuBhO,SACzBiS,EAAQ,wBAA0BjE,EAAuBtO,KAAI,SAAAwQ,GAAY,OAAIA,EAAa9P,EAAE,KAG9F,IAAM0X,EAGA,QAHkB,EAAA9J,aAAsB,EAAtBA,EAAwB/N,QAAO,SAACC,EAAiBgQ,GAEvE,OADAhQ,EAAIgQ,EAAa9P,IAAM8P,EAChBhQ,CACT,GAAG,CAAC,UAAE,QAAI,CAAC,EAIL6X,GAFUN,GAAA,qBAA+B3Q,GAETiL,SAAS,kBAEzCxP,EAAU,UACd,cAAsBuE,GACtB,CAAC,kBACDmL,EACgC,UAAhCnL,EAAY8I,iBAGRoI,GAAeD,EAEf1V,EAAW,mBAAyC2V,GAAezV,GAEzE,IAAKyV,EACH,OAAO,KAET,IAAK3V,EAASvC,KACZ,OAAOuC,EAET,IAAK2L,IAA0BA,aAAsB,EAAtBA,EAAwBhO,QAAS,EAC9D,OAAOqC,EAET,I,EAOM4V,G,EAPc5V,EAASvC,KAAK4O,Q,umBAOJrK,MAAK,SAAC6T,EAAGC,GAErC,GAAID,EAAElR,SAAWmR,EAAEnR,OACjB,OAAO,EAET,IAAMoR,EAAgBN,EAAgBI,EAAEZ,gBAClCe,EAAgBP,EAAgBK,EAAEb,gBAExC,OAAKc,EAGAC,EAIED,EAAcvG,MAAQwG,EAAcxG,OAHjC,EAHD,CAOX,IAEA,OAAO,OAAP,wBACKxP,GAAQ,CACXvC,KAAM,OAAF,wBACCuC,EAASvC,MAAI,CAChB4O,QAASuJ,KAGf,CCsDiBK,CACbxR,EACA2O,EAAQ3V,KACR4W,EACA1I,EACAmC,GAGItB,EC5JF,SACJ/H,GAGuB,IAFvB2O,EAAA,uDAAoB,GAEpB4B,EAAuB,uCAEjBkB,GAHgC,wCAGkB7Y,KAAI,SAAA8Y,GAAC,OAAIA,EAAEpY,EAAE,IAU/D6R,GARawD,aAAO,EAAPA,EAASzV,SAAUyX,GAAA,4BACpC3Q,EACA2O,EACA8C,GACA,EACA,KAG4B,CAAC,GAM3BA,aAAwB,EAAxBA,EAA0BvY,UAC5BiS,EAAQ,wBAA0BsG,GAEpC,I,EAEME,GAFUhB,GAAA,qBAA+B3Q,GAENiL,SAAS,WAE5CxP,EAAU,UACd,cAAsBuE,GACtB,CAAC,WACDmL,EACgC,UAAhCnL,EAAY8I,iBAGRoI,GAAeS,GAA2BpB,EAE1ChV,EAAW,mBAA2C2V,GAAezV,GAE3E,OAAKyV,EAGA3V,EAASvC,KAGP,OAAP,wBACKuC,GAAQ,CACXvC,KAAM,OAAF,wBACCuC,EAASvC,MAAI,CAChB4O,S,EAAarM,EAASvC,KAAK4O,Q,2mBANtBrM,EAHA,IAYX,CDuGoBqW,CAChB5R,EACA2O,EAAQ3V,KACRkO,EACAqJ,GAuBF,MAAO,CACLvQ,YAAAA,EACAwD,YAAAA,EACA8L,YAAAA,EACAC,OAAAA,EACAE,WAAAA,EACAnC,SAAAA,EACAC,SAAAA,EACAsC,YAAAA,EACA7N,UAAAA,EACAgO,aAAAA,EACAhB,oBAAAA,EACA9H,uBAAAA,EACAgJ,gBAAAA,EACAvB,QAAAA,EACA9G,OAAAA,EACAE,UAAAA,EACA8J,sBAnCE,QAAyB,CAC3BC,WAAY,kBACZ9R,YAAAA,IAHA+R,UAqCAnC,sBAAAA,EACAvG,UAAAA,EACAgH,oBAAAA,EACAnC,UAAAA,EACA8D,cAlCAhQ,EAAUvH,cACVgP,GACAjG,EAAY/I,iBACM,QAAhB,EAAA+I,EAAYxK,YAAI,eAAEiV,kBAAmBqB,EAAY7U,eACnDkU,EAAQlU,cACR8U,EAAO9U,cACPyM,MACkB,QAAhB,EAAA1D,EAAYxK,YAAI,eAAEiV,mBAAoBX,EAAS2E,qBAChD1E,EAAS2E,mBACVzD,EA0BAF,kBAAAA,EACAZ,oBAAAA,EACAE,0BAAAA,EACA5L,eAAAA,EACAmO,oBAAAA,EACAE,mBAAAA,EACAC,eAAAA,EAEJ,C,sfE9MO,IAAM,GAAY,eAYnB,SAAU4B,GAAoBlX,G,gBAC1B+E,EAAgD/E,EAAhD+E,YAAaoS,EAAmCnX,EAAnCmX,eAAgBC,EAAmBpX,EAAnBoX,eAE/BC,GAAS,UACTC,EAAQ,mBAERC,EAAwB,oBAAuD,QAAlB,EAAAC,WAAkB,eAAEvY,KACjFwY,EAWN,SAA0BrV,G,UACxB,QAAKA,IAGG,QADD,EAAyE,QAAzE,EAAsB,QAAtB,EAAApC,EAAQoX,sBAAc,yBAAM7G,GAAA,sBAAmC,mBAAU,eAC5EmH,YAAI,uBAAG,SAACtE,GAAS,OAAKA,EAAEvR,aAAeO,CAAS,IACtD,CAhBiCuV,CAA0C,QAAzB,EAAA3X,EAAQsT,yBAAiB,eAAEzR,YACvE+V,EACJ5X,EAAQ+W,gBACRI,aAAc,EAAdA,EAAgBlZ,SAChB+B,EAAQ4S,4BACP6E,EAEGI,EAA6B,mBACjCD,GAWO,YACL7S,EAAYD,MACZqS,EACAC,EACgC,UAAhCrS,EAAY8I,gBACZ,KACA,KAIJ,SAAS2J,EAAiBjX,GACxB,GAAKP,EAAQ+W,gBAAkBI,aAAc,EAAdA,EAAgBlZ,QAA/C,CAEA,IAAImZ,EAAiB,OAAH,UAAQpX,EAAQoX,gBAElC,GAAIpX,EAAQ4S,4BAA8B6E,EAA0B,CAClE,IAAMK,EAAuB,GAAH,OAAMvH,GAAA,sBAAmC,2BACnE6G,EAAiB,OAAH,wBACTA,G,8YAAc,IAChBU,EAAoB,U,gDAAQV,EAAeU,K,ojBAAqB,CAAE9X,EAAQsT,qBAE9E,CAED,OAAO,YACLvO,EAAYD,MACZqS,EACAC,EACgC,UAAhCrS,EAAY8I,gBACZtN,EAjB2D,C,KAmB/D,CAEA,SAASZ,EAAUY,GACjB+W,EAAME,EAAiBjX,GACzB,CASA,IAAMwX,GAAgB,QACpBP,EACA7X,GATF,SAAiBqY,EAAoBC,GACnC,GAAmB,IAAfD,EACF,OAAO,QAAgBC,GAEzBZ,EAAOzF,MAAMsG,EAAA,YAA0B,GAAW,SACpD,IAME,SAAAna,GAAI,OAAIA,EAAK4O,OAAO,IAUhBnG,EAA4B,QAAnB,EAAAuR,EAAc/Z,aAAK,eAAEoR,QAAO,SAAA9P,GAAC,MAAiB,UAAbA,EAAE+P,QAAmC,SAAb/P,EAAE+P,MAAiB,KAC3F,EAAA8I,GAAA,GAAc3R,GAEd,IAAMxI,ECnGF,SAAkCgC,G,MACtC,OAAO,WAAc,W,QACnB,KAA0B,QAArB,EAAAA,EAAQ+X,qBAAa,eAAE9Z,WAA6C,QAAlC,EAAA+B,EAAQ6X,kCAA0B,eAAE5Z,SAAmC,cAAzB+B,EAAQoY,aAC3F,OAAOpY,EAAQ+X,cAEjB,IAEIM,EACAC,E,EAHEC,E,gDAAsDvY,EAAQ+X,gB,ojBAC9DS,EAAgD,GAGlDC,GAAc,EAElBzY,EAAQ6X,2BAA2B7Y,SAAQ,SAACZ,EAAMiP,G,UAChD,GAA+B,IAA3BmL,EAAgBva,OAApB,CAMA,GAJwBsJ,EAAA,UAAoBnJ,IACV,KAAb,QAAnB,EAAAA,EAAK6U,UAAUlV,YAAI,eAAEE,UACG,QAAxB,EAAmB,QAAnB,EAAAG,EAAK6U,UAAUlV,YAAI,eAAG,UAAE,eAAE2a,UAAWC,GAAA,qBAarC,YAVsBjH,IAAlB2G,IACFA,EAAgBhL,EAChBiL,EAAoB,EACpBG,GAAc,GAGZA,GACFH,SAEFE,EAAgBpZ,KAAKhB,GAIvBqa,GAAc,CApB0B,CAqB1C,IAEA,IAAMG,EAA8D,CAClEva,GAAI,KACJwM,KAAM,KACNnI,KAAM,KACN8D,OAAQgS,EACR7S,UAA6B,IAAlB0S,EAAsB,EAAIC,EACrChL,sBAAsB,EACtB+B,OAAQ,MAMV,MAH6B,UAAzBrP,EAAQoY,cAA4BI,EAAgBva,QACtDsa,EAAqBM,OAAOR,EAAe,EAAGO,GAEzCL,CACT,GAAG,CACDvY,EAAQuX,sBACa,QAArB,EAAAvX,EAAQ+X,qBAAa,eAAE9Z,OACvB+B,EAAQ6X,2BACR7X,EAAQoY,cAEZ,CD4CgBU,CAAwB,CACpCf,cAAeA,EAAc/Z,MAC7B6Z,2BAA2D,QAA/B,EAAAA,EAA2B9Z,YAAI,eAAE4O,QAC7D4K,sBAAuBA,EAAsBxZ,KAC7Cqa,aAbKpY,EAAQ4S,0BAGN6E,EAA2B,YAAc,QAFvC,SAeX,OAAO,OAAP,wBACKM,GAAa,CAChB9V,sBAAuB8V,EAAc9V,wBAA0BjC,EAAQ+W,iBAAkBI,aAAc,EAAdA,EAAgBlZ,QACzGD,MAAAA,EACA2B,UAAAA,EACAoZ,gBAA2C,QAA1B,EAAAxB,EAAsBxZ,YAAI,eAAEgb,gBAC7ChL,YAAuC,QAA1B,EAAAwJ,EAAsBxZ,YAAI,eAAEgQ,aAE7C,CE/G+B,GAAD,OACzBwC,GAAA,sBAAmC,kB,kICjBlC,SAAUyI,GAAcxZ,GAC5B,I,IAAoF,G,GAAlD,QAAa,uBAAgC,G,EAAK,E,s4BAA5EyZ,EAAQ,KAAEC,EAAW,KAE7B,aAAgB,WACdD,GAAYzZ,GAAgB0Z,GAAY,EAC1C,GAAG,CAAC1Z,GACN,C,4BCFM,GAAY,iCAOZ,SAAU2Z,GAAwBlW,G,QAChCmW,EAAYnW,EAAMoW,UAAmD,YAApB,QAAnB,EAAW,QAAX,EAAApW,EAAM6B,aAAK,eAAEwU,cAAM,eAAEnM,eACrDoM,GAAA,sCACAA,GAAA,6BAEJ,OACE,gBAAC,aAAiC,CAACzJ,MAAO,IACxC,gBAAC0J,GAAA,EAAU,KACT,gBAACA,GAAA,QAAgB,CAACC,IAAKL,IAEvB,gBAACI,GAAA,UAAkB,KAChBvW,EAAM6B,MACH,gBAACuB,EAAA,EAAI,CAACC,OAAO,mBAAmBtG,QAAS,CAAE8E,MAAO7B,EAAM6B,SACxD,gBAACuB,EAAA,EAAI,CAACC,OAAO,yBAInB,gBAACkT,GAAA,OAAe,KACd,gBAACnT,EAAA,EAAI,CAACC,OAAO,SACb,gBAACH,EAAA,EAAO,CACN7B,UAAU,YACV8B,QAAS,CAAE7D,YAAa,aAAqBC,OAAQ,oCAErD,gBAAC6D,EAAA,EAAI,CAACC,OAAO,qBAMzB,CCjBO,IACDoT,GAAYxB,EAAA,mBADO,wBAOnB,SAAUyB,GAAkB1W,G,wBHtBWjD,EGuB3C,EAA6BiD,EAArB8B,YAAAA,OAAW,IAAG,GAAC,EAAC,EAElB6U,GAAe,EAAAC,GAAA,GAAgB,CAAEzW,SAAU,iBACzC6D,GAAqB,EAAA6S,GAAA,GAAoB,CAC/CC,gBAAiB,oBACjBC,IAAKjV,EAAY8Q,cAFX5O,iBAKFgT,EAAa7F,GAAmBrP,GAEhCmV,EAAgB,uBAA+BD,GAE/CE,KAAeD,aAAa,EAAbA,EAAe/C,eAAelZ,QAC7C8T,GHpCqC/R,EGoCiBma,GAAcD,EHnCnE,mBAA+Bla,GAAW,0BAC/CA,EAAQ+E,YAAYD,MACpB9E,EAAQmX,eACRnX,EAAQoX,kBGiCJW,EAAgBb,GAAoB,OAAD,wBAAMgD,GAAkBD,IAE3D/J,EAAU,gBAAwB,CACtCnS,KAAMkc,EACNG,oBAAqBF,aAAa,EAAbA,EAAeE,oBACpCrI,uBAAwBoI,GAAcpI,KAGxC,EAAAsI,GAAA,GAAmBC,GAAA,sBAAsC,CACvDC,MAAwB,QAAjB,EAAAxV,EAAYD,aAAK,QAAI,GAC5B0V,cAAe,CACbC,cAAef,GACfgB,YAAa,YACbC,kBAAmB,mBAErBC,eAAe,KAMjB,IAAMC,EACJZ,EAAWlD,eAAiB7G,EAMxB4K,EACJ/C,EAAc9V,yBAEZgY,EAAWrN,QAAUqN,EAAWrN,OAAOpN,iBACvCya,EAAWnN,WAAamN,EAAWnN,UAAUtN,iBAC7C2a,GAAcpI,EAAuBvS,iBACrC0Q,EAME6K,GACe,QAAnB,EAAAhD,EAAc/Z,aAAK,eAAEC,UACE,QAAvB,EAAiB,QAAjB,EAAAgc,EAAWrN,cAAM,eAAE7O,YAAI,eAAE8O,gBACC,QAA1B,EAAoB,QAApB,EAAAoN,EAAWnN,iBAAS,eAAE/O,YAAI,eAAE8O,cAK9B,OAFAmM,GAAc8B,GAETD,EAIH,uBAAKvW,UAAU,QACb,gBAACkJ,GAAgB,CACfC,WAAYsK,EAAcgB,gBAC1BhU,YAAaA,EACb2I,WAAY,yBAGZqK,EAAcgB,iBACd,gBAACjL,GAAiB,CAChBC,YAAagK,EAAchK,YAC3BhJ,YAAaA,EACb2I,WAAY,0BAIZuM,EAAWlT,UAAUhJ,QAAUkc,EAAWvG,QAAQ3V,QAAUkc,EAAWhF,gBAAgBlX,MACzF,gBAACid,EAAA,EAAa,CACZjW,YAAaA,EACbkW,YAAa/K,aAAO,EAAPA,EAAS+K,YACtBC,YAAahL,aAAO,EAAPA,EAASgL,YACtB/X,iBAAkB,CAChBG,OAAQ,mBACRF,SAAU,oBAEZgD,QAAS,CAAE7D,YAAa,YAAoBC,OAAQ,kBACpD2Y,kBAAmBpJ,EAAuBzT,aAI7Cwc,GACC,+BACGC,EAEG,gBAACK,GAAA,WAA4B,CAACtL,MAAO8J,GACnC,gBAACnN,EAAkB,CACjB1H,YAAaA,EACb4H,QAASoL,EAAc/Z,MACvB4O,OAAyB,QAAjB,EAAAqN,EAAWrN,cAAM,eAAE7O,KAC3B+O,UAA+B,QAApB,EAAAmN,EAAWnN,iBAAS,eAAE/O,KACjCgJ,WAAYhC,EAAY8Q,aAAeoE,EAAWlT,UAAUhJ,KAC5DwK,YAAa0R,EAAW1R,YAAYxK,KACpCkO,uBAAwBgO,EAAWhO,uBACnCZ,aAAe4O,EAAW7L,WAAa6L,EAAW7E,oBAClDpO,eAAgBiT,EAAWjT,eAC3BxC,SAAU,iBACRyV,EAAWlG,oBACXkG,EAAWhO,uBACiB,SAA5BlH,EAAY8Q,aAEd5O,iBAAkBA,KAItB,gBAACkS,GAAuB,CACtBrU,MAAOC,EAAYD,MACnBuU,YAAuD,QAA3C,EAA8B,QAA9B,EAAAY,EAAWlG,2BAAmB,eAAEsH,mBAAW,eAAElO,cAAc6C,SAAS,gBAKpF+H,EAAcnX,SAAWmX,EAAczZ,aACvC,gBAACgd,GAAA,EAAoB,CACnBhd,WAAYyZ,EAAczZ,WAC1BqB,UAAWoY,EAAcpY,UACzBgB,WAAYoX,EAAcpX,WAC1B4a,eAAa,MApEhB,gCA2EX,C,8qBCvKA,IACM,GAAYrD,EAAA,mBADA,8BA0BZ,SAAUsD,GAAoBvY,GAClC,IAnBuBgO,EAAwBwK,EAAmB,EAmB5DnV,GAnBiB2K,EAmBQhO,EAAMgO,SAnBUwK,EAmBAxY,EAAMwY,YAlBzB,mCACzBvK,GAAA,uBAAoC,yBACpCA,GAAA,kBAA+B,6BAC/BA,GAAA,mBAAgC,qBAChCA,GAAA,eAA4B,iBAC5BA,GAAA,kBAA+B,oBAC/BA,GAAA,uBAAoC,0BACpCA,GAAA,8BAA2CuK,EAAa,iCAAmC,0BAC3FvK,GAAA,iBAA8B,mBAC9BA,GAAA,8BAA2CuK,EAAa,gCAAkC,yBAC1FvK,GAAA,wBAAqC,0BAAwB,KAC7DA,GAAA,uBAAoC,0BAGTD,IAM9B,OAAK3K,EAIH,gBAACoV,GAAA,EAAY,CACXpX,UAAS,+BACTqX,QAAS,WACTpB,MAAO,GAAUjU,GACjBsV,iBAAiB,MACjBC,iBAAe,EACfC,yBAAyB,SATpB,gCAYX,CCjDA,UAAgB,8BAAgC,SCkBhD,IAAM,GAAY,kCAElB,SAASC,GAAQC,EAA0BP,GACzC,OAAIO,EAAO/K,WAAaC,GAAA,8BACfuK,EAAavD,EAAA,YAA0B,GAAW,yBAA2B8D,EAAOtZ,KAEzFsZ,EAAO/K,WAAaC,GAAA,+BACfuK,EAAavD,EAAA,YAA0B,GAAW,+BAEpD8D,EAAOtZ,IAChB,CAEA,SAASuZ,GAAkBD,GACzB,OAAIA,EAAO/K,WAAaC,GAAA,uBACf,CACLgL,mBAAoBF,EAAOG,QAAQzZ,KACnC0Z,0BAA2BJ,EAAOG,QAAQd,aAIvC,CAAC,CACV,CAmBM,SAAUgB,GAAyBpZ,GACvC,OAAKA,EAAMlF,MAASkF,EAAMlF,KAAKE,OAI7B,uBAAKqG,UAAW,kCACbrB,EAAMlF,KAAKJ,KAAI,SAACqe,EAAQM,GACvB,OACE,gBAACC,GAAA,EAAmB,CAClBC,iBAAkB,aAElBvd,IAAKqd,EACLG,YAAaH,EACbje,GAAIie,EAAIza,WAERa,KAAMqZ,GAAQC,EAAQ/Y,EAAMwY,YAC5BU,QAASH,EAAOG,QAAQpe,KACxB2e,WAAYV,EAAOU,WACnBC,aAAcX,EAAO/K,SAErBlK,UAAW9D,EAAM8D,UACjBwB,YAAatF,EAAMsF,YACnB/D,SAAUvB,EAAM2Z,eAChB3Q,uBAAwBhJ,EAAMgJ,uBAC9BjF,eAAgB/D,EAAM+D,eACtB6V,YAAa5Z,EAAM6Z,eAAed,GAClC/U,iBAAkBhE,EAAMgE,iBACxB8V,iBAAkB,SAAAC,GAAM,OAAI/Z,EAAM8Z,iBAAiBf,EAAQM,EAAKU,EAAO,EACvEC,eACE,gBAACzB,GAAmB,CAClBvK,SAAU+K,EAAO/K,SACjBwK,WAAYxY,EAAMwY,aAGtByB,iBAAkBja,EAAMia,iBAExB7B,YAAa,KACbxX,SAAUoY,GAAkBD,GAC5BmB,cAAc,EACd7K,SAAU,KACV8K,kBAAmB,MAGzB,KAzCK,gCA4CX,C,gHCjGM,SAAUC,KACd,OACE,uBAAK/Y,UAAU,iCACb,uBAAKA,UAAU,sCACb,gBAACgZ,GAAA,EAAmC,OAEtC,2BACE,gBAAC,KAAwC,CAACC,iBAAe,KAE3D,2BACE,gBAACC,GAAA,EAAmB,CAACD,iBAAe,IACpC,gBAACE,GAAA,EAA0C,OAE7C,gBAACC,GAAA,EAAiD,CAACH,iBAAe,IAClE,2BACE,gBAACC,GAAA,EAAmB,CAACD,iBAAe,IACpC,gBAACE,GAAA,EAA0C,OAInD,C,gBCnBM,GAAY,mCAOZ,SAAUE,GAA0B1a,GACxC,MAAiDA,EAAzC2a,8BAAAA,OAA6B,IAAG,GAAI,EAE5C,OACE,uBAAKtZ,UAAU,2EACZrB,EAAMoY,YACH,4BAAOpY,EAAMoY,aACb,gBAAChV,EAAA,EAAI,CAACC,OAAO,cAAcd,UAAW,KAE1C,gBAACW,EAAA,EAAO,CACNC,QAAS,CACP7D,YAAa,aACbC,OAAQ,2BACRG,OAAQ,CACNkb,eAAgB3b,GAAA,gBAChB0b,gCAAiCA,IAGrCtZ,UAAU,wBAEV,gBAAC+B,EAAA,EAAI,CAACC,OAAO,eAAed,UAAW,MAI/C,CC1BA,IAAM,GAAY,mCACZ,GAAY0S,EAAA,mBAAiC,IAQ7C,SAAU,GAAwBjV,G,QAChCmW,EAAYnW,EAAMoW,UAAmD,YAApB,QAAnB,EAAW,QAAX,EAAApW,EAAM6B,aAAK,eAAEwU,cAAM,eAAEnM,eACrDoM,GAAA,sCACAA,GAAA,6BAEJ,OACE,gBAAC,aAAiC,CAACzJ,MAAO,IACxC,gBAAC0J,GAAA,EAAU,KACT,gBAACA,GAAA,QAAgB,CAACC,IAAKL,IAEvB,gBAACI,GAAA,UAAkB,KAChBvW,EAAM6B,MACH,gBAACuB,EAAA,EAAI,CAACC,OAAO,mBAAmBtG,QAAS,CAAE8E,MAAO7B,EAAM6B,SACxD,gBAACuB,EAAA,EAAI,CAACC,OAAO,yBAInB,gBAACkT,GAAA,OAAe,CAAClV,UAAU,YACzB,gBAAC+B,EAAA,EAAI,CAACC,OAAO,SACb,gBAACH,EAAA,EAAO,CACN7B,UAAU,YACV8B,QAAS,CAAE7D,YAAa,aAAqBC,OAAQ,oCAErD,gBAAC6D,EAAA,EAAI,CAACC,OAAO,sBAKjBrD,EAAM6a,kBACN,gBAACH,GAAyB,CAACtC,YAAa,GAAU,sBAI1D,C,gBC1CM0C,GAA+C,CACnD7M,GAAA,uBACAA,GAAA,kBACAA,GAAA,kBACAA,GAAA,eACAA,GAAA,mBACAA,GAAA,iBACAA,GAAA,uBACAA,GAAA,8BACAA,GAAA,8BACAA,GAAA,wBACAA,GAAA,uBACAA,GAAA,wBAGF,SAAS8M,GAAche,G,MACfie,EAAiC,QAAnB,EAAAje,EAAQ+E,mBAAW,eAAG/E,EAAQf,KAElD,MAA2B,iBAAhBgf,EACFA,IAAgBje,EAAQ8P,QAG5B9J,MAAMC,QAAQgY,IAIZA,EAAYjO,SAAShQ,EAAQ8P,MACtC,CAgHO,IAAMoO,GAA4B,CACvCC,mBAAkB,SAAClN,EAAwBlM,GACzC,IAAMkZ,EAAclZ,aAAW,EAAXA,EAAqB,MAEzC,MAA2B,iBAAhBkZ,EACFA,EAAY9Q,gBAAkB8D,EAAS9D,gBAE3CnH,MAAMC,QAAQgY,IAGQ,IAAvBA,EAAYhgB,UAGPggB,EAAY3T,MAAK,SAAAmM,GAAC,OAAIA,EAAEtJ,gBAAkB8D,EAAS9D,aAAa,GAC3E,EAEAiR,uBAAsB,SACpBrZ,EACAxE,GAEA,IAAM8d,EA1HV,SAA0B9d,GACxB,GAAKA,GAAWA,EAAOtC,OAAvB,CAGA,IAAIqgB,EACJ,IACE,IAAMC,EAAwBC,KAAKC,MAAMle,GAEzC,IAAKge,EAAOhe,SAAWge,EAAO5B,aAC5B,OAEF,IAAKoB,GAA6B/N,SAASuO,EAAO5B,cAChD,OAEF2B,EAAUC,C,CACV,SACA,MACD,CAED,OAAOD,CAjBC,CAkBV,CAsG0BI,CAAiBne,GAOvC,OAAI8d,EACK,CAAC,CACNhgB,GAAIggB,EAAc1B,aAClBpc,OAAQ8d,EAAc9d,SA/F9B,SAAqCwE,GACnC,IAAMoL,EAA0B,GAE1BwO,EAlBR,SAA+B5Z,GAC7B,GAAKA,aAAW,EAAXA,EAAa6Z,MAGlB,MAAiC,iBAAtB7Z,EAAY6Z,MACdb,GAA6BzT,MAAK,SAAA+F,GAAC,OAAIA,IAAMtL,EAAY6Z,KAAK,IAGnE5Y,MAAMC,QAAQlB,EAAY6Z,QAAuC,IAA7B7Z,EAAY6Z,MAAM3gB,OACjD8f,GAA6BzT,MAAK,SAAA+F,GAAC,OAAIA,IAAMtL,EAAY6Z,MAAM,EAAE,SAD1E,CAKF,CAKwBC,CAAsB9Z,GAE5C,OAAI4Z,EACK,CAAEA,EAAezN,GAAA,eAGtB8M,GAAc,CAAE/e,IAAK,OAAQ6Q,MAAO,oBAAkC/K,YAAAA,KACxEoL,EAAQ/Q,KAAK8R,GAAA,wBAGX8M,GAAc,CAAE/e,IAAK,OAAQ6Q,MAAO,aAA2B/K,YAAAA,KACjEoL,EAAQ/Q,KAAK8R,GAAA,mBAGX8M,GAAc,CAAE/e,IAAK,OAAQ6Q,MAAO,YAA0B/K,YAAAA,KAChEoL,EAAQ/Q,KAAK8R,GAAA,gBAGX8M,GAAc,CAAE/e,IAAK,OAAQ6Q,MAAO,cAA4B/K,YAAAA,KAClEoL,EAAQ/Q,KAAK8R,GAAA,mBAGX8M,GAAc,CAAE/e,IAAK,OAAQ6Q,MAAO,cAA4B/K,YAAAA,KAClEoL,EAAQ/Q,KAAK8R,GAAA,8BAA0CA,GAAA,wBAGrD8M,GAAc,CAAE/e,IAAK,SAAU6Q,MAAO,qBAAqC/K,YAAAA,KAC7EoL,EAAQ/Q,KAAK8R,GAAA,yBAGX8M,GAAc,CAAE/e,IAAK,SAAU6Q,MAAO,cAA8B/K,YAAAA,KACtEoL,EAAQ/Q,KAAK8R,GAAA,iBAA6BA,GAAA,wBAGxC8M,GAAc,CAAE/e,IAAK,SAAU6Q,MAAO,eAA+B/K,YAAAA,KACvEoL,EAAQ/Q,KAAK8R,GAAA,mBAA+BA,GAAA,wBAG1C8M,GAAc,CAAE/e,IAAK,SAAU6Q,MAAO,YAA4B/K,YAAAA,KACpEoL,EAAQ/Q,KAAK8R,GAAA,8BAA0CA,GAAA,gCAGrD8M,GAAc,CAAE/e,IAAK,OAAQ6Q,MAAO,WAAyB/K,YAAAA,KAC7DiZ,GAAc,CAAE/e,IAAK,OAAQ6Q,MAAO,UAAwB/K,YAAAA,KAC5DiZ,GAAc,CAAE/e,IAAK,OAAQ6Q,MAAO,iBAA+B/K,YAAAA,MACrEoL,EAAQ/Q,KACN8R,GAAA,mBACAA,GAAA,uBACAA,GAAA,8BACAA,GAAA,iBACAA,GAAA,wBACAA,GAAA,wBAIAf,EAAQlS,QACVkS,EAAQ/Q,KAAK8R,GAAA,cAGR4N,GAAA,OAAiB3O,GAC1B,CAuCoC4O,CAA4Bha,GAE7CpH,KAAI,SAAA0S,GAAC,MAAK,CAAEhS,GAAIgS,EAAG,GACpC,EAEA2O,+BAA8B,SAACja,GAC7B,MAAgD,iBAArCA,aAAW,EAAXA,EAAaka,qBACf,CAAC,CAAE5gB,GAAI0G,EAAYka,oBAAqBvc,KAAMqC,EAAYka,sBAE/DjZ,MAAMC,QAAQlB,aAAW,EAAXA,EAAaka,qBACtBla,EAAYka,oBAAoBthB,KAAI,SAACuhB,GAAW,MAAM,CAC3D7gB,GAAI6gB,EACJxc,KAAMwc,EACP,IAEI,EACT,EAEAC,6BAA4B,SAACpa,EAAyB4X,GACpD,OAAIA,IAAiBzL,GAAA,aACZ,GAEFgN,GAA0Bc,+BAA+Bja,EAClE,G,YCjNI,SAAUqa,GAAkBC,GAChC,IAAMC,EAAa,WAAc,kBAAM,IAAI,KAAe,GAAE,IAuB5D,OArBA,aAAgB,WACTD,GAAoBA,EAAgBphB,QAGzCohB,EAAgBrgB,SAAQ,SAAAugB,GAAE,OAAID,EAAWE,QAAQD,EAAG,GACtD,GAAG,IAgBI,CACLngB,KAfF,SAAcmgB,GACPD,GAGLA,EAAWE,QAAQD,EACrB,EAWEE,QATF,SAAiBzf,GACf,GAAKsf,EAGL,OAAOA,EAAWI,OAAO1f,EAC3B,EAMF,C,42CCrBM,SAAU2f,GAAmB3f,GACjC,IAAQjC,EAASiC,EAATjC,KAER,IAAKA,EAAM,OAAOiC,EAQlB,IANA,IAAMhC,EAAQ,GAAID,GAEZ6hB,EAAiBd,GAAA,UAAoB9gB,EAAO,YAE5C6hB,EAAoC,GAE1C,MAA0BlQ,OAAOmQ,OAAOF,GAAe,eAAE,CAApD,IAI6B,EAH5BG,EAAwC,KACtC5P,EAA8B,GAAG,KAFnB,MAIY,IAAhC,IAAK,EAAL,qBAAkC,KAAvB6L,EAAM,QACV+D,EAUD/D,EAAOU,aAAeqD,EAAoBrD,WAM9CqD,EAAoB5D,QAAQpe,KAAO,GAAH,UAC1BgiB,EAAoB5D,QAAQpe,MAAQ,IAAE,GACvCie,EAAOG,QAAQpe,QAPlBoS,EAAQ/Q,KAAK2gB,GACbA,EAAsB/D,GAXtB+D,EAAsB/D,C,CAmBzB,+BAED7L,EAAQ/Q,KAAK2gB,GACbF,EAAczgB,KAAI,MAAlBygB,EAAsB1P,EACvB,CAED,OAAO,OAAP,wBACKnQ,GAAO,CACVjC,KAAM8hB,GAEV,C,uHC/CM,SAAUG,GACdhgB,GAEA,GAAIA,EAAQjC,KAAKkT,WAAaC,GAAA,uBAC5B,OAAOlR,EAET,SAASigB,EAAoB9J,EAAmBC,GAC9C,OAAOpC,GAAA,sBAAiCmC,EAAGC,EAAGpW,EAAQiM,uBACxD,CAOA,IAAMiU,EAAqBlgB,EAAQjC,KAAKoe,QAAQpe,KAAK0I,MAAM,EAAG,GACxD0Z,EAAsBngB,EAAQjC,KAAKoe,QAAQpe,KAAK0I,MAAM,GAEtD2Z,EAA2C,GAC3CC,EAA0C,GAEhDH,EAAmBlhB,SAAQ,SAAAshB,G,MACpBC,GAAA,mBAAkCD,MAGxB,QAAX,EAAAA,aAAK,EAALA,EAAO5d,YAAI,eAAEyK,iBAAkBnN,EAAQ8E,MAAMqI,cAKjDkT,EAAsBjhB,KAAKkhB,GAJzBF,EAAuBhhB,KAAKkhB,GAKhC,IAEAF,EAAuB9d,KAAK2d,GAC5BI,EAAsB/d,KAAK2d,GAE3B,I,EAAMO,EAAa,OAAH,wBACXxgB,EAAQjC,MAAI,CACfoe,QAAS,OAAF,wBACFnc,EAAQjC,KAAKoe,SAAO,CACvBpe,KAAM,GAAF,OACCqiB,EACAC,G,EACAF,E,4mBAUT,OALAngB,EAAU,OAAH,wBACFA,GAAO,CACVjC,KAAMyiB,GAIV,CCzDM,SAAUC,GAAoBzgB,GAClC,GAAIA,EAAQjC,KAAKkT,WAAaC,GAAA,aAC5B,OAAOlR,EAET,IAAM0gB,EAAqB1gB,EAAQjC,KAAKoe,QAAQpe,KAAKJ,KAAI,SAAAgjB,GAAC,OAAI,eAC5DtiB,GAAIsiB,EAAEje,MACHie,EAAC,IAWN,OARA3gB,EAAQjC,KAAO,OAAH,wBACPiC,EAAQjC,MAAI,CACfoe,QAAS,OAAF,wBACFnc,EAAQjC,KAAKoe,SAAO,CACvBpe,KAAM2iB,MAIH1gB,CACT,C,muBCeA,IACM,GAAYkY,EAAA,mBADA,gC,qsBCRL0I,GAA6B,CACxCC,wBAAuB,SACrB9b,GACyC,IAAzC+b,EAAA,uDAAuC,CAAC,EAExC,MAAO,CACLjS,eAAgB,SAAC,GACf,IAAM7O,EAAO,+BACR8gB,GAAc,CACjBjL,YAAa7B,GAAA,QAAmB,KAGlC,OAAO+M,GAAA,aAAuC,EAAgB/gB,EAChE,EAEAghB,UAAW,SAACpa,EAAmBQ,GAA4B,OACzD6Z,GAAA,aAA8Bra,EAAO,OAAF,wBAC9BQ,GAAI,CACP8Z,gBAAgB,IAChB,EAGJhY,OAAQiY,GAAA,mBAERrZ,SAAU,SAAC,GAAkB,MAAM,CACjCvF,YAAa,eACbC,OAAQ,wBACRC,KAAM,CAAE,EAASpE,GAAI+iB,GAAA,UAAmB,EAAS1e,OAClD,EAGDuM,QAAS,SAAC,GAAgB,MAAM,CAC9B1M,YAAa,mBACbC,OAAQ,mCACRC,KAAM,CAAE,EAAQpE,GAAI+iB,GAAA,UAAmB,EAAQ1e,OAChD,EAEDL,OAAQ,SAAC,EAAgB+E,GACvB,OAAKA,aAAI,EAAJA,EAAMhF,YAQJ,QAAiBgF,aAAI,EAAJA,EAAMhF,UAAW,EAAQ,MAPxC,CACLG,YAAa,eACbC,OAAQ,+BACRC,KAAM,CAAE,EAAOpE,GAAI+iB,GAAA,UAAmB,EAAO1e,OAKnD,EAEA6D,eAAgB,WAAF,MAAS,CACrBhE,YAAa,cACbC,OAAQ,8BACT,EAED6e,WAAY,SAACC,EAA2BthB,GACtC,IAAI2C,EAAM,iBAAoB2e,GAS9B,OAPKthB,aAAO,EAAPA,EAAS4N,WACZjL,EAAS,OAAH,wBACDoC,GACApC,IAIC,CACNJ,YAAa,YACbC,OAAQ,iBAIRC,KAAM,GACNE,OAAAA,EAEJ,EAEAuc,IAAK,SAAC,GACJ,IAAID,EACJf,GAA0Bc,+BAA+Bja,GAAapH,KAAI,SAAAgjB,GAAC,OAAIA,EAAEje,IAAI,IAQrF,OANIuc,EAAoBjP,SAAS,EAAItN,MACnCuc,EAAsBA,EAAoB7P,QAAO,SAAAuR,GAAC,OAAIA,IAAM,EAAIje,IAAI,IAEpEuc,EAAoB7f,KAAK,EAAIsD,MAGvB,CACNF,OAAQ,iBACRD,YAAa,YACbI,OAAQ,OAAF,wBACDoC,GAAW,CACdka,oBAAAA,IAGN,EAEJ,EAEAsC,kBAAiB,SAACvhB,G,MAChB,GAAoBA,EAAQgc,OArGdG,QAAQ5b,OAqGtB,CAtGJ,IAyGUihB,EAA4D,QAA3C,EAAAC,GAAA,EAAmBzhB,EAAQgc,OAAO/K,iBAAS,eAAEyQ,qBAEpE,GAAKF,IAAkBtD,GAA0BC,mBAAmBne,EAAQgc,OAAO/K,SAAUjR,EAAQ+E,eAQzE,IAAxB/E,EAAQjC,KAAKE,QAAgB+B,EAAQjC,KAAK,GAAGkT,WAAajR,EAAQgc,OAAO/K,UAG7E,OAAOuQ,EAAexhB,EAAQwE,SAftB,CAgBV,G,uGC7GK,IACD,GAAY0T,EAAA,mBADO,0BAOnB,SAAUyJ,GAAoB1e,G,QAClC,EAA6BA,EAArB8B,YAAAA,OAAW,IAAG,GAAC,EAAC,GAExB,EAAAsV,GAAA,GAAmBC,GAAA,sBAAsC,CACvDC,MAAwB,QAAjB,EAAAxV,EAAYD,aAAK,QAAI,GAC5B0V,cAAe,CACbC,cAAe,GACfC,YAAa,YACbC,kBAAmB,mBAErBC,eAAe,KAGjB,I,IAAOgH,G,GAAmB,QACxBC,GAAA,uBACAnQ,EACA,CAAEoQ,QAAS,uB,EACZ,E,s4BAJqB,GAMhBlI,GAAe,EAAAC,GAAA,GAAgB,CAAEzW,SAAU,iBACzC6D,GAAqB,EAAA6S,GAAA,GAAoB,CAC/CC,gBAAiB,oBACjBC,IAAKjV,EAAY8Q,cAFX5O,iBAIFwU,GAAa,EAAAsG,GAAA,KAKb9H,ErB0JF,SACJlV,G,gBAEMwD,EAAc,mBAAkC6J,GAAA,iBAChDiC,EAAc,oBAA2C,QAAhB,EAAA9L,EAAYxK,YAAI,eAAEM,KAAM+T,GAAA,OAAkB7J,EAAYxK,KAAKM,KACpGiW,EAAS,mBAA6BC,GAAA,YACtCC,EAAa,oBACD,QAAhB,EAAAjM,EAAYxK,YAAI,eAAEiV,kBAAmByB,GAAA,aAA4BlM,EAAYxK,KAAK2W,aAE9ErC,GAAW,UACXC,GAAW,EAAAC,EAAA,GAAY,MAE7B,EAMIJ,KALFqB,EAAqB,EAArBA,sBACAP,EAAS,EAATA,UACAK,EAAiB,EAAjBA,kBACAZ,EAAmB,EAAnBA,oBACAE,EAAyB,EAAzBA,0BAGF,GAEI,EAAArE,GAAA,KADFsF,EAAkB,EAAlBA,mBAAoB5H,EAAsB,EAAtBA,uBAAwB6H,EAAuB,EAAvBA,wBAAyBtF,EAAsB,EAAtBA,uBAGjEuF,EAAsBF,GAAsBC,IAC5Ca,EAAwBZ,aAAmB,EAAnBA,EAAqB1V,GAE7C0I,GAAY,EAAA+N,GAAA,KAEZC,EAAe7G,GAAqB6F,GACpCiB,EAAgD,QAA/B,EAAiB,QAAjB,EAAAD,EAAahX,YAAI,eAAEgX,oBAAY,eAAEpX,KAAI,SAAA+Q,GAAC,OAAIA,EAAErQ,EAAE,IAC/D4W,EAAkB,oBAAmCF,aAAY,EAAZA,EAAchX,OACvEmX,GAAA,sCAA2DF,IAEvDtB,EAAUD,KAEhB,GAAgD,EAAApF,GAAA,KAAxCrH,EAAc,EAAdA,eAAgBmO,EAAmB,EAAnBA,oBAElB/G,EAAYpH,EAAesH,GAAA,qBAC3B+G,EAAqBrO,EAAesH,GAAA,iBACpCgH,EAAiBtO,EAAesH,GAAA,gBAsBtC,MAAO,CACLvJ,YAAAA,EACAwD,YAAAA,EACA8L,YAAAA,EACAG,WAAAA,EACAnC,SAAAA,EACAC,SAAAA,EACAvL,UAAAA,EACAgO,aAAAA,EACAhB,oBAAAA,EACA9H,uBAAAA,EACAgJ,gBAAAA,EACAvB,QAAAA,EACAkD,sBA/BE,QAAyB,CAC3BC,WAAY,kBACZ9R,YAAAA,IAHA+R,UAiCAnC,sBAAAA,EACAvG,UAAAA,EACA6E,UAAAA,EACA8D,cA7BAhQ,EAAUvH,cACVgP,GACAjG,EAAY/I,iBACM,QAAhB,EAAA+I,EAAYxK,YAAI,eAAEiV,kBAAmBqB,EAAY7U,eACnDkU,EAAQlU,cACR8U,EAAO9U,cACPyM,MACkB,QAAhB,EAAA1D,EAAYxK,YAAI,eAAEiV,mBAAoBX,EAAS2E,qBAChD1E,EAAS2E,mBACVzD,EAqBAF,kBAAAA,EACAZ,oBAAAA,EACAE,0BAAAA,EACA5L,eAAAA,EACAmO,oBAAAA,EACAE,mBAAAA,EACAC,eAAAA,EAEJ,CqBlPqB0M,CAAqBjd,GAKlCmV,EAAgB,yBAAiCD,GAKjDlC,EFzCF,SAAgC/X,GACpC,IAAQ+E,EAAgD/E,EAAhD+E,YAAaoS,EAAmCnX,EAAnCmX,eAAgBC,EAAmBpX,EAAnBoX,eAE/BE,EAAQ,mBACRD,GAAS,UAET4K,EAA2B7C,GAA8C,CAC7EO,KAGIuC,EAAwB9C,GAAiD,CAC7EqB,GACAT,KAkCF,SAASxI,EAAiBjX,GACxB,GAAKP,EAAQ+W,gBAAkBI,aAAc,EAAdA,EAAgBlZ,QAA/C,CAEA,IAAMkkB,EACJjE,GAA0BE,uBAAuBrZ,EAAaxE,GAEhE,OAAO,YACLwE,EAAYD,MACZsS,EACA+K,EAR2D,CAU/D,CAEA,SAASxiB,EAAUY,GACjB,OAAO+W,EAAME,EAAiBjX,GAChC,CAkCA,IA7EgCxC,EA6E1Bga,GAAgB,QACpBP,EACA7X,GAlCF,SAAiBqY,EAAoBC,GACnC,GAAmB,IAAfD,EACF,OAAO,QAAgBC,GAEzBZ,EAAOzF,MAAM,GAAU,SACzB,IA+BE,SAAA7T,GAAI,OAAIA,EAAKoS,OAAO,IAxBtB,SAAmB7P,G,QACX8hB,EAAkB,GAAI9hB,EAAS6P,SAErC,GAAKiS,EAAgBnkB,OAArB,CAIA,IAAMokB,EAAavD,GAAA,OAAiBsD,GAEpC,GAAuB,QAAnB,EAAAC,aAAU,EAAVA,EAAYlG,eAAO,eAAE5b,OAAQ,CAC/B,IAAM8d,EAAgB,CACpB1B,aAAc0F,EAAWpR,SACzB1Q,OAA2B,QAAnB,EAAA8hB,aAAU,EAAVA,EAAYlG,eAAO,eAAE5b,QAE/B,OAAOie,KAAK8D,UAAUjE,EACvB,CAVA,CAaH,IAUMrgB,GArF0BD,EAqFKga,EAAc/Z,QApFnCD,EAAKE,OAGGgkB,EAAyBxC,QAAQ,CAAE1hB,KAAAA,IAEpCA,KAAKJ,KAAI,SAAAS,G,MACtBmkB,EAAqD,CACzDxkB,KAAMK,EACN6N,uBAAwBjM,EAAQiM,uBAChCnH,OAA0B,QAAnB,EAAA9E,EAAQ+E,mBAAW,eAAED,QAAS,IAKvC,OAFoBod,EAAsBzC,QAAQ8C,GAE/BxkB,IACrB,GAAG,IAdMA,EAqFLykB,EAnEAzK,EAAczZ,cAAeN,aAAK,EAALA,EAAOC,QAC/B,GAEFD,EAAME,QAAO,SAACukB,EAAOzG,GAC1B,OAAOA,EAAOG,QAAQpe,KAAKG,QAAO,SAACwkB,EAAO9b,GAAK,mBAAW8b,GAAK,CAAE9b,GAAK,GAAK6b,EAC7E,GAAG,IAiEL,OAFA,EAAAtK,GAAA,GAAcqK,GAEP,OAAP,wBACKzK,GAAa,CAChB/Z,MAAAA,EACA2B,UAAAA,GAEJ,CExEwBgjB,CAAsB,OAAD,wBAAMzI,GAAkBD,KC1E/D,SACJlC,EACAhT,GAEA,aAAgB,W,QACd,GAAKgT,EAAc9V,sBAAnB,CAGA,IAAM2gB,EAAuB7K,EAAc/Z,MAAMsM,MAAK,SAAA0R,GACpD,OAAOA,EAAO/K,WAAaC,GAAA,sBAC7B,IAEM2R,KAAiD,QAA7B,EAAAD,aAAoB,EAApBA,EAAsBzG,eAAO,eAAEzZ,UAAuC,QAA7B,EAAAkgB,aAAoB,EAApBA,EAAsBzG,eAAO,eAAEd,eAE9FtW,aAAW,EAAXA,EAAc,QAAkC8d,IAW/C9d,aAAW,EAAXA,EAAc,QAAiC8d,GAClD,eAA2B,OAAD,wBACrB,4BAAsC,CACzClgB,OAAQ,OAAF,wBACC,2BAAuCA,QAAU,CAAC,GAAiB,MACvE,MAA+B,MAEjC,CAAEiL,SAAS,IAjBd,eAA2B,OAAD,wBACrB,4BAAsC,CACzCjL,OAAQ,OAAF,wBACC,2BAAuCA,QAAU,CAAC,GAAiB,MACvE,UAA+B+O,MAEjC,CAAE9D,SAAS,GAfR,CA4BV,GAAG,CAACmK,EAAc9V,uBACpB,CD4CE6gB,CAAwB/K,EAAehT,GAKvC,IAAMmL,EAAU,gBAAwB,CACtCnS,KAAMkc,EACNG,oBAAqBF,aAAa,EAAbA,EAAeE,oBACpC2I,eAAe,IAMXlI,EACJZ,EAAWlD,eAAiB7G,EAMxB4K,EACJ/C,EAAc9V,yBACZiO,EAME6K,EACe,QAAnB,EAAAhD,EAAc/Z,aAAK,eAAEC,OAGjB+kB,GACFjL,EAAc9V,uBAAyB8V,EAAczZ,YACtDyc,KAAgBhD,EAAc/Z,MAAMsM,MAAK,SAAAlM,GAAI,OAAIA,EAAK6S,WAAaC,GAAA,YAAuB,IAGvF0L,EAAiBgE,GAA2BC,wBAChD9b,EACAke,GAAA,oBAAiCrB,IAKnC,OAFA5I,GAAc8B,GAETD,EAIH,uBAAKvW,UAAU,UACT2V,EAAWlT,UAAUhJ,QAAUkc,EAAWvG,QAAQ3V,QAAUkc,EAAWhF,gBAAgBlX,MACzF,gBAACid,EAAA,EAAa,CACZjW,YAAaA,EACbkW,YAAa/K,aAAO,EAAPA,EAAS+K,YACtBC,YAAahL,aAAO,EAAPA,EAASgL,YACtB/X,iBAAkB,CAChBG,OAAQ,mBACRF,SAAU,oBAEZgD,QAAS,CAAE7D,YAAa,YAAoBC,OAAQ,kBACpDwgB,YAAaA,EACbD,eAAa,IAIf,W,MACA,OAAKhL,EAAc9V,uBAAyB8V,EAAczZ,WACjD,gBAAC+e,GAAoB,MAGzBtC,EAWH,+BACE,gBAACK,GAAA,WAA4B,CAACtL,MAAO8J,GACnC,gBAACyC,GAAwB,CACvBte,KAAMga,EAAc/Z,MACpB4e,eAAgBA,EAChB7V,UAAWkT,EAAWlT,UAAUhJ,KAChCkO,uBAAwBgO,EAAWhO,uBACnC1D,YAAa0R,EAAW1R,YAAYxK,KACpC0d,WAAYA,EAEZqB,eAAgB,SAAAd,GAAM,OAAI4E,GAA2BW,kBAAkB,CACrEvF,OAAAA,EACAjX,YAAAA,EACAhH,KAAMga,EAAc/Z,MACpBwG,SAAUoY,GACV,EACF5V,eAAgBiT,EAAWjT,eAC3BmO,oBAAqB8E,EAAW9E,oBAChClO,iBAAkBA,EAClB8V,iBAAkB,SAACf,EAAQkH,EAAQlG,GAAM,MAAM,CAC7C/L,SAAU+K,EAAO/K,SACjBkS,WAAYnH,EAAOtZ,KACnBga,WAAYV,EAAOU,WACnBD,YAAayG,EACbte,UAAWoY,EACXnY,OAAQ,CACNC,MAAOC,EAAYD,OAAS,IAE/B,EACDoY,iBAAkB,SAAAlB,GAAM,OACtBkC,GAA0BiB,6BAA6Bpa,EAAaiX,EAAO,KAI5E/B,EAAW7L,YAAc2J,EAAczZ,aAAeyZ,EAAcpX,YACrE,gBAACgd,GAAyB,OAG1B5F,EAAcnX,SAAWmX,EAAczZ,aACvC,gBAACgd,GAAA,EAAoB,CACnBhd,WAAYyZ,EAAczZ,WAC1BqB,UAAWoY,EAAcpY,UACzBgB,WAAYoX,EAAcpX,WAC1B4a,eAAe,MApDrB,gBAAC,GAAuB,CACtBzW,MAAOC,EAAYD,MACnBuU,UAAqC,QAA3B,EAAAY,EAAW1R,YAAYxK,YAAI,eAAEqlB,iBAAkBC,GAAA,OACzDvF,iBAAkB7D,EAAW7L,WAuDrC,CAjEE,IAnBG,gCAuFX,CE7MM,SAAUkV,GAAsBrgB,GACpC,MAA6BA,EAArB8B,YAAAA,OAAW,IAAG,GAAC,EAAC,EAIxB,OAFyB,EAAAwN,EAAA,GAAY,MAA7BgR,aAGC,gBAAC5B,GAAmB,CAAC5c,YAAaA,IAGpC,gBAAC4U,GAAiB,CAAC5U,YAAaA,GACzC,C,kDCtBa4O,EAAiB,CAC5BD,QAAO,SAACE,GACN,MAAO,CACLjQ,IAAK,4BACLkN,UAAW,eAAqB,4BAA6B,CAAE+C,YAAAA,IAC/D3U,IAAK,UAEL8R,WAAY,SAAC2C,GACX,OAAOA,EAAQpR,MAAK,SAAC6T,EAAGC,GAAC,OAAKD,EAAErG,MAAQsG,EAAEtG,KAAK,GACjD,EAEJ,E,wECTWgF,EAA2B,WACtC,OAAwD,OAAgB,CAAE0O,iBAAiB,IAAnF3P,EAAkB,EAAlBA,mBAAoBC,EAAuB,EAAvBA,wBAEtB3F,EAAe0F,GAAsBC,IAO3C,OALkB,oBACd3F,GACF,0BAAuCA,EAAa9P,IAIxD,C,uECUM,SAAU8Z,EAAcqK,GAA+C,IAA/BxiB,EAAA,uDAA6B,CAAC,EACpEyjB,EAtBR,SAAyBjB,GACvB,OAAKA,EAGDxc,MAAMC,QAAQuc,GACTA,EAAQpT,QAAO,SAAAV,GAAC,QAAMA,IAAM,YAAoBA,IAAM,WAAmBA,GAAG,IAEjF,SAAU8T,EACLA,EAAQzkB,KAAKqR,QAAO,SAAAV,GAAC,QAAMA,IAAM,YAAoBA,IAAM,WAAmBA,GAAG,IAEnF,GARE,EASX,CAWmBgV,CAAgBlB,GAAS7kB,KAAI,SAAA+I,GAAC,OAAIA,EAAErI,EAAE,KAEvD,OAAqBolB,GAAU,SAAAE,GAAG,OAAI,qBAA+BA,EAAK3jB,EAAQ4jB,gBAAgB,GACpG,C","sources":["file:///app/packages/libs/shared/src/hooks/UseBatchFetch.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteScroll.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteList.ts","file:///app/packages/libs/shared/src/views/feedback/enums/FeedbackOption.ts","file:///app/packages/projects/lite/src/apps/libraries/views/library-folder/LibraryFolderViewUtils.ts","file:///app/packages/libs/shared/src/components/widgets/items/subject-widget-item/CompanyWidgetItem.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/CompanyResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/mixed-search-results.scss","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/exchange-video-group/ExchangeVideoGroup.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/FeaturedVideoResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/playlist-with-videos/PlaylistWithVideos.tsx","file:///app/packages/libs/shared/src/apps/search/components/playlist-with-videos/playlist-with-videos.scss","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/LargePlaylistResults.tsx","file:///app/packages/libs/shared/src/apps/search/components/series-with-videos/SeriesWithVideos.tsx","file:///app/packages/libs/shared/src/apps/search/components/series-with-videos/series-with-videos.scss","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/LargeSeriesResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/collection-video-list/CollectionVideoList.tsx","file:///app/packages/libs/shared/src/apps/search/components/collection-thumbnail/CollectionThumbnail.tsx","file:///app/packages/libs/shared/src/apps/search/components/collection-thumbnail/collection-thumbnail.scss","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/SmallPlaylistResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/SmallSeriesResults.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/SubjectResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/components/VideoResult.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-search-results/MixedSearchResults.tsx","file:///app/packages/libs/shared/src/apps/search/components/search-substitute/SearchSubstitute.tsx","file:///app/packages/libs/shared/src/apps/search/components/search-suggestions/SearchSuggestions.tsx","file:///app/packages/projects/lite/src/apps/search/hooks/useFetchSchoolLevels.ts","file:///app/packages/libs/shared/src/apps/search/constants/SearchOGQL.ts","file:///app/packages/libs/shared/src/apps/search/flight-requests/SharedSearchRequests.ts","file:///app/packages/projects/lite/src/apps/search/hooks/useSearchTopics.ts","file:///app/packages/projects/lite/src/apps/search/hooks/useFetchSearchData.tsx","file:///app/packages/projects/lite/src/apps/search/hooks/useSearchCompanies.ts","file:///app/packages/projects/lite/src/apps/search/hooks/useGetSearchResults.tsx","file:///app/packages/projects/lite/src/apps/search/hooks/useGroupExchangeResults.ts","file:///app/packages/projects/lite/src/apps/search/hooks/useGetTagsAndClassifications.tsx","file:///app/packages/projects/lite/src/apps/search/hooks/useSearchMask.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results/empty-state/SearchResultsEmptyState.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results/SearchResultsView.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-widget-search-results/components/search-widget-tooltip/SearchWidgetTooltip.tsx","file:///app/packages/libs/shared/src/apps/search/components/mixed-widget-search-results/mixed-widget-search-results.scss","file:///app/packages/libs/shared/src/apps/search/components/mixed-widget-search-results/MixedWidgetSearchResults.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/components/partial-loading/PartialSearchResults.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/components/search-results-request-video/SearchResultsRequestVideo.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/components/search-results-empty-state/SearchResultsEmptyState.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/utils/SearchResultsFilterHelper.ts","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/hooks/useTransformer.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/hooks/use-get-search-results/transformations/results/mergeSearchResults.ts","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/hooks/use-get-search-results/transformations/widget-item/transformSearchRelevantTopics.ts","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/hooks/use-get-search-results/transformations/widget-item/transformSearchTags.ts","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/hooks/use-get-search-results/useGetSearchResultsV2.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/utils/SearchResultsAppLinkHelper.ts","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/SearchResultsViewV2.tsx","file:///app/packages/projects/lite/src/apps/search/views/search-results-v2/hooks/useCurriculumCodeSearch.ts","file:///app/packages/projects/lite/src/apps/search/views/lite-search-results-view/LiteSearchResultsView.tsx","file:///app/packages/projects/lite/src/shared/flight-requests/RatingRequests.ts","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoMixin.ts"],"sourcesContent":["import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { BaseObject } from 'libs/shared/interfaces';\n\nconst CHUNK_SIZE = 50;\n\nexport interface UseBatchFetchResult<T extends BaseObject> {\n itemsArr: T[];\n items: { [key: string]: T} | null;\n isFetching: boolean;\n}\n\n/**\n * Used to fetch multiple items by id with Flight. Will fetch 25 items at a time firing off multiple\n * requests if there are more than 25 items.\n * This will return items as null until we have all our items. Items will be returned as an object with\n * their ids as they key for easy mapping\n * \n * @param itemIds \n * @param getRequest \n */\nexport function useBatchFetch<T extends BaseObject>(\n itemIds: string[],\n getRequest: (ids: string[]) => Flight.Request\n): UseBatchFetchResult<T> {\n const chunks = ArrayHelper.chunk<string>(itemIds, CHUNK_SIZE);\n\n const requests = chunks.map(chunk => getRequest(ArrayHelper.uniq(chunk)));\n\n const responses = Flight.useBasicFetchAll<T[]>(requests);\n\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length\n ? itemsArr.reduce((acc, item) => ({ ...acc, [item.id]: item }), {})\n : null;\n\n return {\n itemsArr,\n items,\n isFetching: responses.isFetching\n };\n}\n\n/**\n * When you need the useBatchFetch() behavior, but your list of objects to hydrate\n * will grow, such as on a scrolling page. useGrowingBatchFetch() will use local state\n * to determine what we've already built a request for and what items are new\n * as to not re-fetch items - Sha\n */\nexport function useGrowingBatchFetch<T>(\n objs: T[],\n getRequest: (items: T[]) => Flight.Request,\n _getKey?: (obj: T) => string\n) {\n const getKey = _getKey || ((obj: any) => {\n if (typeof obj === 'object')\n return obj.id;\n\n return obj;\n });\n\n const fetchedItems = React.useRef<Set<string>>(new Set<string>());\n\n const [ requests, setRequests ] = React.useState<Flight.Request[]>([]);\n\n React.useEffect(() => {\n if (!objs?.length)\n return;\n\n const unfetchedItems: T[] = [];\n \n objs.forEach(obj => {\n const key = getKey(obj);\n\n if (fetchedItems.current.has(key))\n return;\n\n unfetchedItems.push(obj);\n fetchedItems.current.add(key);\n });\n \n if (!unfetchedItems.length)\n return;\n\n setRequests(r => ([ ...r, ...ArrayHelper.chunk<T>(unfetchedItems, CHUNK_SIZE).map(getRequest) ]));\n }, [objs?.length]);\n\n const responses = Flight.useBasicFetchAll<T[]>(requests);\n\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length\n ? itemsArr.reduce((acc, item) => ({ ...acc, [getKey(item)]: item }), {})\n : null;\n\n return {\n hasFirstRequestCompleted: !!responses.responses?.[0]?.hasCompleted,\n itemsArr,\n items,\n isFetching: responses.isFetching\n };\n}","import { useEffect } from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst SCROLL_TOLERANCE = 400; // value in px\n\ninterface UseInfiniteScrollOptions {\n fetchNextPage: () => void;\n hasMore: boolean;\n isFetching: boolean;\n scrollContainer?: HTMLElement;\n}\n\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): void {\n const handleScroll = (): void => {\n if (options.isFetching)\n return;\n\n if (!options.scrollContainer) {\n const currentScrollHeight = window.innerHeight + document.documentElement.scrollTop;\n \n const totalHeight = document.documentElement.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n } else {\n const { scrollContainer } = options;\n const currentScrollHeight = scrollContainer.getBoundingClientRect().height + scrollContainer.scrollTop;\n \n const totalHeight = scrollContainer.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n }\n\n options.fetchNextPage();\n };\n\n useEffect(() => {\n const onScroll = FunctionHelper.throttle(handleScroll, 200);\n\n const scrollContainer = options.scrollContainer || window;\n\n if (options.hasMore)\n scrollContainer.addEventListener('scroll', onScroll);\n\n return () => scrollContainer.removeEventListener('scroll', onScroll);\n }, [ options.hasMore, options.fetchNextPage, options.scrollContainer ]);\n}","import { useEffect, useState } from 'react';\n\nimport { HttpStatus, HttpStatusClass } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\n\nimport { useInfiniteScroll } from './UseInfiniteScroll';\nimport { useSelectAllPages } from './UseSelectAllPages';\n\nexport interface UseInfiniteListResult<T extends BaseObject> {\n items: T[];\n hasMore: boolean;\n isFetching: boolean;\n nextCursor: string;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\n/**\n * Hook to extract an infinite list from the application state,\n * save it locally in state and only update when new data\n * is fetched.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useInfiniteList<TObject = BaseObject, TResponse = BasePaginatedCollection<TObject>>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false,\n onError?: (pageNumber: number, statusCode: HttpStatus) => void,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string,\n scrollContainer?: HTMLElement\n): UseInfiniteListResult<TObject> {\n const [ pagesFetched, setPagesFetched ] = useState(0);\n\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n function getKey(cursor?: string): string {\n if (!getRequest)\n return null;\n\n const request = getRequest(cursor);\n\n if (!request)\n return null;\n\n return request.key;\n }\n\n const response = useSelectAllPages<TObject, TResponse>(\n getKey,\n getItems,\n getCursor\n );\n\n function fetchNextPage(): void {\n if (!fetchNext || !getRequest || !response)\n return;\n\n setPagesFetched(currentVal => currentVal + 1);\n return fetchNextFn(response.nextCursor);\n }\n\n useInfiniteScroll({\n fetchNextPage,\n hasMore: !!response?.nextCursor,\n isFetching: response?.isFetching,\n scrollContainer\n });\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext) {\n fetchNextFn();\n setPagesFetched(currentVal => currentVal + 1);\n }\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response?.statusCode || !FunctionHelper.isFunction(onError))\n return;\n\n const httpStatusClass: HttpStatusClass = +(response.statusCode?.toString()?.substr(0, 1));\n\n if (httpStatusClass !== HttpStatusClass.ClientError && httpStatusClass !== HttpStatusClass.ServerError)\n return;\n\n onError(pagesFetched, response.statusCode);\n }, [response?.statusCode]);\n\n return {\n items: response?.items,\n hasMore: !!response?.nextCursor,\n nextCursor: response?.nextCursor,\n isFetching: response?.isFetching,\n totalItems: response?.totalItems,\n hasFirstPageCompleted: response?.hasFirstPageCompleted\n };\n}","export enum FeedbackOption {\n SUGGEST_IMPROVEMENT = 'suggestImprovement',\n REPORT_BUG = 'reportBug',\n REQUEST_VIDEO = 'requestVideo',\n REQUEST_LIVESTREAM = 'requestLivestream',\n GIVE_PRAISE = 'givePraise',\n RAISE_ISSUE = 'raiseIssue',\n OTHER = 'other'\n}","import { Core } from 'libs/common/core';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { Folder, Library } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nexport function getFolderAppLink(libraryId: string, folder: Folder, sort: string): Core.AppLink {\n if (!libraryId || !folder)\n return null;\n\n return {\n application: AppChannels.LIBRARIES,\n action: Actions.Libraries.FOLDER,\n args: [ libraryId, folder.id, TextHelper.slugify(folder.name) ],\n params: {\n sort\n }\n };\n}\n\nexport function getFolderBgColourClass(folder: Folder | Library): string {\n let charCode = 0;\n\n for (let i = 0; i < folder.name?.length ?? 0; i++) {\n charCode += folder.name.charCodeAt(i);\n }\n\n return BG_COLOUR_CLASS_NAMES[charCode % BG_COLOUR_CLASS_NAMES.length];\n}","import * as React from 'react';\n\nimport { ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CoverPillWidgetContentWrapper, CoverPillWidgetItemProps } from 'libs/shared/components/widgets/items/subject-widget-item/CoverPill';\nimport { Company } from 'libs/shared/interfaces';\n\nexport function CompanyWidgetItem(props: CoverPillWidgetItemProps<Company>): JSX.Element {\n const analyticsData = {\n ...props.analyticsData,\n id: props.data?.id,\n name: props.data?.name\n };\n\n const analyticsOptions = {\n location: LocationContext.ClassificationListItem,\n ...props.analyticsOptions,\n actionType: UserAction.Click,\n entity: EntityType.Company,\n descriptor: ClickDescriptor.Cover\n };\n\n return (\n <CoverPillWidgetContentWrapper\n {...props}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n coverUrl={props.data.logo?.url}\n coverBgColor={props.data.metadata?.colour}\n />\n );\n}","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { CompanyWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item/CompanyWidgetItem';\nimport { Company } from 'libs/shared/interfaces';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function CompanyResult(props: MixedSearchResultItemProps<Company>): JSX.Element {\n return (\n <Col as='li' sm={6} md={props.useLargeStyle ? 6 : 4} lg={props.useLargeStyle ? 4 : 3}>\n <div className={`position-relative px-1 mb-2`}>\n <CompanyWidgetItem\n data={props.item}\n getChildAppLink={props.appLinks.getCompanyAppLink}\n getChildAppLinkOptions={() => props.appLinks.getCompanyAppLinkOptions?.(props.item)}\n analyticsData={{\n itemIndex: props.itemIndex,\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: 0\n }}\n isLarge={props.useLargeStyle}\n />\n </div>\n </Col>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"videoList\":\"ZhLPS\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { ClickDescriptor, EntityType, HashObject, LocationContext, SearchSourceDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { SourceFilterOptions } from 'libs/shared/apps/search/interfaces';\nimport { ExchangeVideoGroup } from 'libs/shared/apps/search/interfaces/SearchResults';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\n\nimport { MixedSearchResultItemProps } from './../MixedSearchResultItemProps';\n\nimport styles from '../../mixed-search-results.scss';\n\nconst namespace = 'search.exchangeVideoGroup';\n\nconst EXCHANGE_RESULT_DISPLAY_LIMIT = 3;\n\nexport function ExchangeVideoGroup(props: MixedSearchResultItemProps<ExchangeVideoGroup>): JSX.Element {\n const limit = props.item.showCount >= EXCHANGE_RESULT_DISPLAY_LIMIT\n ? EXCHANGE_RESULT_DISPLAY_LIMIT\n : props.item.showCount;\n\n function getContainerClassName(): string {\n if (props.pagePositionIndex === 0)\n return 'border-bottom pb-1 mb-3';\n\n return 'border-top border-bottom pt-3 mt-2 pb-1 mb-3';\n }\n\n const currentAppLink = Core.AppLinkHelper.getCurrentAppLink();\n const currentParams = (currentAppLink.params as HashObject) ?? {};\n let currentSource = currentParams?.source ?? [];\n\n if (currentSource && !Array.isArray(currentSource))\n currentSource = [currentSource];\n\n const searchAppLink = {\n ...currentAppLink,\n params: {\n ...currentParams,\n source: [ ...(currentSource), SourceFilterOptions.ExchangeArchive ]\n }\n };\n\n const analyticsData = {\n query: props.queryParams.query,\n itemIndex: props.itemIndex,\n pagePositionIndex: props.pagePositionIndex\n };\n const analyticsOptions = {\n entity: EntityType.SearchResults,\n location: LocationContext.ExchangeSearchGroupItem,\n actionType: UserAction.Click,\n descriptor: SearchSourceDescriptor.ExchangeArchive\n };\n\n return (\n <div className={getContainerClassName()}>\n <AppLink\n appLink={searchAppLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n >\n <h2 className='h4'>\n <Text namespace={namespace} phrase='heading' />\n </h2>\n </AppLink>\n <p>\n <Text namespace={namespace} phrase='message' />\n \n <AppLink\n appLink={props.appLinks.searchSettings}\n className='text-info'\n analyticsData={analyticsData}\n analyticsOptions={{\n ...analyticsOptions,\n descriptor: ClickDescriptor.Settings\n }}\n >\n <Text namespace={namespace} phrase='searchSettings' />\n </AppLink>\n .\n </p>\n\n <div className={`position-relative ${styles.videoList}`}>\n {props.item.videos.slice(0, limit).map((v, i) => {\n return (\n <VideoItem\n key={i}\n video={v}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n presentationAudiences={props.audiences}\n analyticsData= {{\n search: {\n query: props.queryParams.query,\n score: v._score,\n maxScore: v._maxScore,\n featured: v._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n );\n })}\n </div>\n <div className='text-center py-2'>\n <AppLink\n className='text-secondary'\n appLink={searchAppLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n >\n <Text namespace={namespace} phrase='seeMore' />\n </AppLink>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { HeroVideo } from 'libs/shared/apps/subjects/components/hero-video/HeroVideo';\nimport { Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function FeaturedVideoResult(props: MixedSearchResultItemProps<Video>): JSX.Element {\n return (\n <div className='pb-3'>\n <HeroVideo\n video={props.item}\n presentationAudiences={props.audiences}\n getVideoAppLink={(v, opts) => props.appLinks.getVideoAppLink(v, opts)}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hideInteractiveBadge\n showVideoGuidance={VideoHelper.showVideoGuidance(props.hasPermissions)}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { PlaylistItem } from 'libs/shared/apps/playlists/components/playlist-list';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { CurrentUser, Playlist, PresentationAudience, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './playlist-with-videos.scss';\n\nconst namespace = 'search.playlistWithVideos';\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xl || breakpoints.xxl)\n return 3;\n \n return 2;\n}\n\ninterface PlaylistWithVideoProps {\n playlist: Playlist;\n playlistAppLink: Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n currentUser: CurrentUser;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n hasPermissions: HasPermissionsFunc;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function PlaylistWithVideos(props: PlaylistWithVideoProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const videos = props.playlist.videos.data.slice(0, maxVideos);\n\n const playlistAnalyticsOption: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Playlist,\n location: LocationContext.PlaylistWithVideos\n };\n\n const playlistAnalyticsData: HashObject = {\n ...props.analyticsData,\n id: props.playlist.id,\n name: props.playlist.name\n };\n\n return (\n <div className='ps-2 py-2'>\n <Row className='g-0 border rounded-3'>\n <Col xs={4} lg={3} className='pe-3'>\n <PlaylistItem\n appLink={props.playlistAppLink}\n analyticsData={props.analyticsData}\n analyticsOptions={{\n ...playlistAnalyticsOption,\n descriptor: ClickDescriptor.Cover\n }}\n data={props.playlist}\n presentationAudiences={props.presentationAudiences}\n bgColourClassNames={BG_COLOUR_CLASS_NAMES}\n itemStyle='round-left'\n imageCdnUrl={props.commonVideoProps.imageCdnUrl}\n currentUser={props.currentUser}\n showCount={false}\n showOwner\n />\n </Col>\n <Col xs={8} lg={9}>\n <div className='d-flex justify-content-between'>\n <div className={`pt-3 mb-n2 ${styles.videoList}`}>\n {videos?.map(video => {\n const videoAnalyticsData: HashObject = {\n ...playlistAnalyticsData,\n videoId: video.id,\n videoName: video.name\n };\n\n return (\n <div key={video.id} className='mb-2'>\n <VideoItem\n video={video}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.PlaylistWithVideos\n }}\n size='sm'\n hasPermissions={props.hasPermissions}\n hideVideoGuidance\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n })}\n </div>\n <div className='text-end pt-3 pe-3'>\n <AppLink\n className='info-link fw-semibold'\n appLink={props.playlistAppLink}\n analyticsData={playlistAnalyticsData}\n analyticsOptions={{\n ...playlistAnalyticsOption,\n descriptor: ClickDescriptor.Link\n }}\n >\n <Text namespace={namespace} phrase='seeAllVideos' />\n </AppLink>\n </div>\n </div>\n </Col>\n </Row>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"videoList\":\"eEZEe\"};","import React from 'react';\n\nimport { Playlist } from 'libs/shared/interfaces';\n\nimport { PlaylistWithVideos } from '../../playlist-with-videos/PlaylistWithVideos';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function LargePlaylistResult(props: MixedSearchResultItemProps<Playlist>): JSX.Element {\n return (\n <div className='mx-n2'>\n <PlaylistWithVideos\n playlist={props.item}\n playlistAppLink={props.appLinks.getPlaylistAppLink(props.item)}\n presentationAudiences={props.audiences}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n currentUser={props.currentUser}\n preloadImage\n getVideoAppLink={props.appLinks.getVideoAppLink}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SeriesTallPoster } from 'libs/shared/components/series-tall-poster/SeriesTallPoster';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoItem } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { PresentationAudience, Series, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './series-with-videos.scss';\n\nconst namespace = 'search.seriesWithVideos';\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xl || breakpoints.xxl)\n return 5;\n \n if (breakpoints.lg || breakpoints.md)\n return 4;\n\n return 3;\n}\n\ninterface SeriesWithVideoProps {\n series: Series;\n seriesAppLink: Core.AppLink;\n presentationAudiences: PresentationAudience[];\n preloadImage: boolean;\n analyticsData: HashObject;\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n hasPermissions: HasPermissionsFunc;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function SeriesWithVideos(props: SeriesWithVideoProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const videos = props.series.videos.data.slice(0, maxVideos);\n\n const seriesAnalyticsOption: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Series,\n location: LocationContext.SeriesWithVideos\n };\n\n const seriesAnalyticsData: HashObject = {\n ...props.analyticsData,\n id: props.series.id,\n name: props.series.name\n };\n\n return (\n <div className='ps-2 py-2'>\n <Row className='g-0 border rounded-3'>\n <Col xs={4} lg={3} className='pe-3'>\n <AppLink\n appLink={props.seriesAppLink}\n className='position-relative'\n analyticsData={seriesAnalyticsData}\n analyticsOptions={{\n ...seriesAnalyticsOption,\n descriptor: ClickDescriptor.TallPoster\n }}\n >\n <SeriesTallPoster\n series={props.series}\n presentationAudiences={props.presentationAudiences}\n preloadImage={props.preloadImage}\n imageClass='rounded-start-lg'\n />\n </AppLink>\n </Col>\n <Col xs={8} lg={9}>\n <div className='d-flex justify-content-between'>\n <div className={`pt-3 mb-n2 ${styles.videoList}`}>\n {videos?.map(video => {\n const videoAnalyticsData: HashObject = {\n ...seriesAnalyticsData,\n videoId: video.id,\n videoName: video.name\n };\n\n // insert parent series into video object\n video = {\n ...video,\n series: props.series\n };\n\n return (\n <div key={video.id} className='mb-2'>\n <VideoItem\n video={video}\n getVideoAppLink={props.getVideoAppLink}\n analyticsData={videoAnalyticsData}\n analyticsOptions={{\n entity: EntityType.Video,\n location: LocationContext.SeriesWithVideos\n }}\n size='sm'\n hasPermissions={props.hasPermissions}\n hideVideoGuidance\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n })}\n </div>\n <div className='text-end pt-3 pe-3'>\n <AppLink\n className='info-link fw-semibold'\n appLink={props.seriesAppLink}\n analyticsData={seriesAnalyticsData}\n analyticsOptions={{\n ...seriesAnalyticsOption,\n descriptor: ClickDescriptor.Link\n }}\n >\n <Text namespace={namespace} phrase='seeAllVideos' />\n </AppLink>\n </div>\n </div>\n </Col>\n </Row>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"videoList\":\"UT8bc\"};","import React from 'react';\n\nimport { Series } from 'libs/shared/interfaces';\n\nimport { SeriesWithVideos } from '../../series-with-videos/SeriesWithVideos';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function LargeSeriesResult(props: MixedSearchResultItemProps<Series>): JSX.Element {\n return (\n <div className='mx-n2'>\n <SeriesWithVideos\n presentationAudiences={props.audiences}\n series={props.item}\n seriesAppLink={props.appLinks.getSeriesAppLink(props.item)}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n preloadImage\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { SeasonEpisode } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Video } from 'libs/shared/interfaces';\n\nconst namespace = 'search.collectionVideoList';\n\ninterface CollectionVideoListProps {\n videos: Video[];\n collectionId: string;\n appLink: Core.AppLink;\n analyticsOptions: AnalyticsOptions;\n analyticsData?: HashObject;\n getVideoAppLink: (video: Video) => Core.AppLink;\n}\n\nfunction useGetMaxVideos(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xs)\n return 2;\n\n if (breakpoints.sm)\n return 1;\n\n return 3;\n}\n\nexport function CollectionVideoList(props: CollectionVideoListProps): JSX.Element {\n const maxVideos = useGetMaxVideos();\n\n const analyticsProps = {\n analyticsData: props.analyticsData,\n analyticsOptions: props.analyticsOptions\n };\n\n return (\n <>\n <ul className='list-unstyled my-1'>\n {props.videos.slice(0, maxVideos).map(v => {\n const hasSeasonEpisode = !!v.episodeNumber && !!v.season?.id;\n\n return (\n <li key={`${props.collectionId}:${v.id}`} className='d-flex align-items-center'>\n <AppLink\n {...analyticsProps}\n className='clamp-1'\n appLink={props.getVideoAppLink(v)}\n >\n {hasSeasonEpisode && <><SeasonEpisode video={v} /> </>}\n {v.name}\n </AppLink>\n </li>\n );\n })}\n </ul>\n\n <AppLink\n {...analyticsProps}\n className='info-link'\n appLink={props.appLink}\n >\n <Text namespace={namespace} phrase='seeAll' />\n </AppLink>\n </>\n );\n}","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor } from 'libs/analytics/interfaces';\n\nimport { CollectionVideoList } from 'libs/shared/apps/search/components/collection-video-list/CollectionVideoList';\nimport { ActionOptions, Actions as ActionsComponent } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { Mask, MaskType } from 'libs/shared/components/mask/Mask';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Playlist, Series, Video } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\n\nimport styles from './collection-thumbnail.scss';\n\nconst namespace = 'search.collectionThumbnail';\n\n\nexport type GetCollectionActions = (\n collection: Collection,\n showActions: boolean,\n collectionType: CollectionType,\n baseAnalyticsOptions: AnalyticsOptions\n) => ActionOptions[]\n\ntype Collection = Series | Playlist;\ntype CollectionType = 'series' | 'playlist';\n\ninterface CollectionThumbnailProps {\n collection: Collection;\n collectionType: CollectionType;\n appLink: Core.AppLink;\n showActions: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n maskType?: MaskType;\n imageFallbackType?: ImageFallbackType;\n hideBadges?: boolean;\n isPlugin: boolean;\n getCollectionActions: GetCollectionActions;\n getVideoAppLink: (video: Video, opts?: GetVideoAppLinkOptions) => Core.AppLink;\n}\n\nexport function CollectionThumbnail(props: CollectionThumbnailProps): JSX.Element {\n const breakpoints = useBreakpoints();\n const size = VideoListHelper.getSize(breakpoints, 'md');\n const isSmall = size === 'sm';\n\n const hasVideos = !!props.collection.videos?.data?.length;\n\n const firstVideoWithThumbnail = hasVideos && props.collection.videos.data.find(v => !!v.thumbnail?.url);\n\n function getAnalyticsData(): HashObject {\n const data: HashObject = {\n ...props.analyticsData,\n id: props.collection.id,\n name: props.collection.name\n };\n\n if (firstVideoWithThumbnail) {\n data.videoId = firstVideoWithThumbnail.id;\n data.videoName = firstVideoWithThumbnail.name;\n }\n\n return data;\n }\n\n const analyticsData = getAnalyticsData();\n const isSeries = props.collectionType === 'series';\n\n return (\n <div className={`row g-0 ${isSmall ? '' : 'py-2'}`}>\n <Col {...VideoListHelper.getThumbnailColumns()} className={`flex-column align-items-flex-start ${isSmall ? `pb-2 pe-2` : 'mb-1 px-2'}`}>\n <div className={`position-relative overflow-hidden ${isSmall ? 'rounded' : 'rounded-3'}`}>\n <BaseImage\n data={firstVideoWithThumbnail?.thumbnail}\n appLink={props.appLink}\n imageType={ImageType.Thumbnails}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Thumbnail\n }}\n >\n <Mask type={props.maskType} />\n <ImageFallback type={props.imageFallbackType} />\n \n <div className={`d-flex flex-column align-items-center justify-content-center text-white h-100 ${styles.overlay}`}>\n <Text namespace={namespace} phrase='seeAll' />\n </div>\n </BaseImage>\n </div>\n </Col>\n\n <Col {...VideoListHelper.getDetailsColumns()} className={isSmall ? 'pb-2' : 'px-2'}>\n {!props.isPlugin &&\n <ActionsComponent\n actions={props.getCollectionActions(\n props.collection,\n props.showActions,\n props.collectionType,\n props.analyticsOptions\n )}\n className='float-end mt-n1'\n actionsDropdownClassName='btn btn-link ms-1'\n />\n }\n\n <AppLink\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Title\n }}\n >\n <h5 className='m-0 mb-1'><span className='clamp-1'>{props.collection.name}</span></h5>\n </AppLink>\n\n {isSeries && !props.hideBadges && (\n <BadgeListContainer>\n <Badge type={BadgeType.Rating} data={(props.collection as Series).rating} />\n <Badge type={BadgeType.ProductionYear} data={(props.collection as Series).metadata?.year} />\n </BadgeListContainer>\n )}\n \n {hasVideos && (\n <CollectionVideoList\n collectionId={props.collection.id}\n videos={props.collection.videos.data}\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={{\n ...props.analyticsOptions,\n descriptor: ClickDescriptor.Link\n }}\n getVideoAppLink={props.getVideoAppLink}\n />\n )}\n </Col>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"overlayContainer\":\"MnBcv\",\"overlay\":\"AZSmh\"};","import React from 'react';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { MaskType } from 'libs/shared/components/mask/Mask';\nimport { Playlist } from 'libs/shared/interfaces';\n\nimport { CollectionThumbnail } from '../../collection-thumbnail/CollectionThumbnail';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.scss';\n\nexport function SmallPlaylistResult(props: MixedSearchResultItemProps<Playlist>): JSX.Element {\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <CollectionThumbnail\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n analyticsOptions={{\n entity: EntityType.Playlist,\n actionType: UserAction.Click,\n location: LocationContext.PlaylistListItem\n }}\n appLink={props.appLinks.getPlaylistAppLink(props.item)}\n showActions={props.showActions}\n collection={props.item}\n collectionType='playlist'\n maskType={MaskType.Playlist}\n imageFallbackType={ImageFallbackType.PlaylistThumbnail}\n isPlugin={props.commonVideoProps.isPlugin}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getCollectionActions={props.appLinks.getCollectionActions}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { MaskType } from 'libs/shared/components/mask/Mask';\nimport { Series } from 'libs/shared/interfaces';\n\nimport { CollectionThumbnail } from '../../collection-thumbnail/CollectionThumbnail';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.scss';\n\nexport function SmallSeriesResult(props: MixedSearchResultItemProps<Series>): JSX.Element {\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <CollectionThumbnail\n analyticsData={{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n analyticsOptions={{\n entity: EntityType.Series,\n actionType: UserAction.Click,\n location: LocationContext.SeriesListItem\n }}\n appLink={props.appLinks.getSeriesAppLink(props.item)}\n collectionType='series'\n collection={props.item}\n showActions={props.showActions}\n maskType={MaskType.Series}\n imageFallbackType={ImageFallbackType.SeriesThumbnail}\n hideBadges\n isPlugin={props.commonVideoProps.isPlugin}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getCollectionActions={props.appLinks.getCollectionActions}\n />\n </div>\n );\n}","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { SubjectWidgetItem } from 'libs/shared/components/widgets/items/subject-widget-item';\nimport { Classification } from 'libs/shared/interfaces';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nexport function SubjectResult(props: MixedSearchResultItemProps<Classification>): JSX.Element {\n return (\n <Col as='li' sm={6} md={props.useLargeStyle ? 6 : 4} lg={props.useLargeStyle ? 4 : 3}>\n <div className={`position-relative px-1 mb-2`}>\n <SubjectWidgetItem\n data={props.item}\n getChildAppLink={props.appLinks.getClassificationAppLink}\n getChildAppLinkOptions={\n () => props.appLinks.getClassificationAppLinkOptions?.(props.item)\n }\n availablePresentations={props.availablePresentations}\n analyticsData={{\n itemIndex: props.itemIndex,\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: 0\n }}\n isLarge={props.useLargeStyle}\n highlightOnHover={props.commonVideoProps.showNewVideoIndicator}\n />\n </div>\n </Col>\n );\n}","import React from 'react';\n\nimport { ClipItem, ClipItemProps } from 'libs/shared/components/video-list/clip-item/ClipItem';\nimport { InteractiveItem, InteractiveItemProps } from 'libs/shared/components/video-list/interactive-item/InteractiveItem';\nimport { VideoItem, VideoItemProps } from 'libs/shared/components/video-list/video-item/VideoItem';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { MixedSearchResultItemProps } from './MixedSearchResultItemProps';\n\nimport styles from '../mixed-search-results.scss';\n\nexport function VideoResult(props: MixedSearchResultItemProps<VideoTypes>): JSX.Element {\n function getItemComponent(\n video: VideoTypes\n ): (props: ClipItemProps | InteractiveItemProps | VideoItemProps) => JSX.Element {\n if (VideoHelper.isClip(video))\n return ClipItem;\n \n if (VideoHelper.isInteractive(video))\n return InteractiveItem;\n \n return VideoItem;\n }\n\n const Component = getItemComponent(props.item);\n\n return (\n <div className={`position-relative ${styles.videoList}`}>\n <Component\n video={props.item}\n getVideoAppLink={props.appLinks.getVideoAppLink}\n getPreviewQuestionsAppLink={props.appLinks.getPreviewQuestionsAppLink}\n presentationAudiences={props.audiences}\n analyticsData= {{\n search: {\n query: props.queryParams.query,\n score: props.item._score,\n maxScore: props.item._maxScore,\n featured: props.item._featured\n },\n pagePositionIndex: props.pagePositionIndex\n }}\n hasPermissions={props.hasPermissions}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n}","import React from 'react';\nimport { Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { Classification, Company, CurrentUser, InteractiveMetadata, Playlist, Presentation, PresentationAudience, Series, Video } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { SearchResultObjectTypes, SearchResults, SearchResultsObject } from '../../interfaces';\nimport { GetCollectionActions } from '../collection-thumbnail/CollectionThumbnail';\n\nimport { CompanyResult } from './components/CompanyResult';\nimport { ExchangeVideoGroup } from './components/exchange-video-group/ExchangeVideoGroup';\nimport { FeaturedVideoResult } from './components/FeaturedVideoResult';\nimport { LargePlaylistResult } from './components/LargePlaylistResults';\nimport { LargeSeriesResult } from './components/LargeSeriesResult';\nimport { BaseMixedSearchResultItemProps } from './components/MixedSearchResultItemProps';\nimport { SmallPlaylistResult } from './components/SmallPlaylistResult';\nimport { SmallSeriesResult } from './components/SmallSeriesResults';\nimport { SubjectResult } from './components/SubjectResult';\nimport { VideoResult } from './components/VideoResult';\n\nconst namespace = 'shared.mixedSearchResults';\n\nconst TOPIC_DISPLAY_LIMIT = 8;\n\nexport interface MixedSearchResultAppLinks {\n getVideoAppLink: (video: Video, opts: GetVideoAppLinkOptions) => Core.AppLink;\n getSeriesAppLink: (series: Series) => Core.AppLink;\n getCompanyAppLink: (company: Company) => Core.AppLink;\n getCompanyAppLinkOptions?: (company: Company) => Core.AppLinkOptions;\n getClassificationAppLink: (classification: Classification) => Core.AppLink;\n getClassificationAppLinkOptions?: (classification: Classification) => Core.AppLinkOptions;\n getPlaylistAppLink: (playlist: Playlist) => Core.AppLink;\n getPreviewQuestionsAppLink: (interactive: InteractiveMetadata) => Core.AppLink;\n getCollectionActions: GetCollectionActions;\n searchSettings?: Core.AppLink;\n}\n\ninterface MixedSearchResultsProps {\n queryParams: HashObject;\n results: SearchResultObjectTypes[];\n topics?: SearchResults;\n companies?: SearchResults;\n audiences: PresentationAudience[];\n currentUser: CurrentUser;\n availablePresentations: Presentation[]\n showActions: boolean;\n hasPermissions: HasPermissionsFunc;\n appLinks: MixedSearchResultAppLinks;\n commonVideoProps: CommonVideoProps;\n}\n\nexport const MixedSearchResults = React.memo(function(props: MixedSearchResultsProps): JSX.Element {\n const breakpoints = useBreakpoints();\n const useSmallComponent = breakpoints.xs || breakpoints.sm;\n\n if (!props.results?.length && !props.topics?.totalResults && !props.companies?.totalResults)\n return <></>;\n\n const companiesAndTopics = [\n ...props.companies?.results ?? [],\n ...props.topics?.results ?? []\n ];\n\n const childProps: BaseMixedSearchResultItemProps = {\n useLargeStyle: companiesAndTopics.length < 4,\n ...props\n };\n\n return (\n <div className='position-relative'>\n <p role='status' className='visually-hidden'><Text namespace={namespace} phrase='ariaSearch' /></p>\n\n {!!companiesAndTopics.length && (\n <Row as='ul' className='list-unstyled g-0 pb-3 mx-n1'>\n {companiesAndTopics.slice(0, TOPIC_DISPLAY_LIMIT).map((c, itemIndex) => {\n switch (c.type.toLowerCase()) {\n case 'company':\n return (\n <CompanyResult\n key={itemIndex}\n item={c as SearchResultsObject<Company>}\n itemIndex={itemIndex}\n {...childProps}\n />\n );\n case 'subject': {\n return (\n <SubjectResult\n key={itemIndex}\n item={c as SearchResultsObject<Classification>}\n itemIndex={itemIndex}\n {...childProps}\n />\n );\n }\n }\n })}\n </Row>\n )}\n\n {props.results?.map((result, index) => {\n const pagePositionIndex = companiesAndTopics.length ? index + 1 : index;\n\n if ('isExchangeVideoGroup' in result && result.isExchangeVideoGroup) {\n return (\n <ExchangeVideoGroup\n key={index}\n item={result}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n \n\n switch (result.type?.toLowerCase()) {\n case 'interactive':\n case 'clip':\n case 'video': {\n if (index === 0 && result._featured && VideoHelper.isVideo(result)) {\n return (\n <FeaturedVideoResult\n key={index}\n item={result as SearchResultsObject<Video>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <VideoResult\n key={index}\n item={result as SearchResultsObject<Video>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n case 'playlist': {\n if (useSmallComponent) {\n return (\n <SmallPlaylistResult\n key={index}\n item={result as SearchResultsObject<Playlist>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <LargePlaylistResult\n key={index}\n item={result as SearchResultsObject<Playlist>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n case 'series': {\n const series = result as Series;\n\n if (useSmallComponent || !series.tallPoster?.id) {\n return (\n <SmallSeriesResult\n key={index}\n item={result as SearchResultsObject<Series>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n\n return (\n <LargeSeriesResult\n key={index}\n item={result as SearchResultsObject<Series>}\n pagePositionIndex={pagePositionIndex}\n {...childProps}\n />\n );\n }\n }\n })}\n </div>\n );\n});","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.searchSubstitute';\n\ninterface SearchSubstituteProps {\n substitute: string;\n queryParams: HashObject;\n getAppLink: (query: string, queryParams: HashObject) => Core.AppLink\n}\n\nexport function SearchSubstitute(props: SearchSubstituteProps): JSX.Element {\n if (!props.substitute)\n return <></>;\n\n return (\n <div className='pb-3'>\n <p className='mb-1 h6'>\n <Text namespace={namespace} phrase='showingFor' /> \n <AppLink\n className='info-link'\n appLink={props.getAppLink(props.substitute, props.queryParams)}\n appLinkOptions={{ replace: true }}\n >\n {props.substitute}\n </AppLink>\n </p>\n <p className='mb-0 h6 fw-normal'>\n <Text namespace={namespace} phrase='searchInsteadFor' />\n <AppLink\n className='info-link'\n appLink={props.getAppLink(props.queryParams.query, { ...props.queryParams, allowSubstitute: 'false' })}\n >\n {props.queryParams.query}\n </AppLink>\n <Text namespace={namespace} phrase='endOriginal' />\n </p>\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.searchSuggestions';\n\ninterface SearchSuggestionsProps {\n suggestions: string[];\n queryParams: HashObject;\n getAppLink: (query: string, queryParams: HashObject) => Core.AppLink\n}\n\nSearchSuggestions.defaultProps = {\n suggestions: [],\n queryParams: {}\n};\n\nexport function SearchSuggestions(props: SearchSuggestionsProps): JSX.Element {\n if (!props.suggestions?.length)\n return <></>;\n\n return (\n <div className='d-flex align-items-center mb-3'>\n <Text namespace={namespace} phrase='didYouMean' />\n \n\n {props.suggestions.map((suggestion, index) => (\n <React.Fragment key={`${suggestion}:${index}`}>\n {index !== 0 && <span className='mx-1'>•</span>}\n\n <AppLink\n className='info-link'\n appLink={props.getAppLink(suggestion, props.queryParams)}\n appLinkOptions={{ replace: true }}\n >\n {suggestion}\n </AppLink>\n </React.Fragment>\n ))}\n </div>\n );\n}","import { Flight } from 'libs/common/flight';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Presentation, SchoolLevels } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nimport { SearchRequests } from 'apps/search/flight-requests/SearchRequests';\n\nexport function useFetchSchoolLevels(presentation: Presentation) {\n const { hasPermissions } = usePermissions();\n const isLearner = hasPermissions(PermissionName.StudentExperience);\n\n const {\n availablePresentations,\n hasPresentationsLoaded\n } = usePresentation();\n\n function getPresentationIds() {\n if (isLearner)\n return presentation ? [presentation?.id] : null;\n\n return availablePresentations?.map(o => o.id);\n }\n\n const presentationIds = getPresentationIds();\n\n return Flight.useBasicFetch<SchoolLevels>(\n hasPresentationsLoaded &&\n presentationIds &&\n SearchRequests.schoolLevels(presentationIds)\n );\n}","import { SharedWithStatements } from 'libs/shared/constants/WithStatements';\nimport { TagType } from 'libs/shared/enums/TagType';\n\n/**\n * OGQL used for search V5 endpoint\n */\nexport const SearchOGQL = {\n video: SharedWithStatements.VIDEO_COLLECTION,\n series: 'rating,tallPoster',\n playlist:\n 'videos[count(),thumbnail]{limit:1},interactives[count(),_thumbnail]{limit:1},' +\n 'clips[count(),_thumbnail]{limit:1}',\n classification: `cover,thumbnail,tags{tagtype:${TagType.Curation}}`,\n clip: SharedWithStatements.CLIP_COLLECTION,\n interactive: SharedWithStatements.INTERACTIVE_COLLECTION,\n company: 'logo',\n category: 'libraries[_logo],thumbnail'\n};","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { SearchOGQL } from 'libs/shared/apps/search/constants/SearchOGQL';\nimport { SearchIndices, SearchResultObjectTypes, SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport type { WidgetFilter, WidgetSearchResults } from 'libs/shared/apps/search/interfaces/WidgetSearchResults';\nimport { SharedSearchHelper } from 'libs/shared/apps/search/utils/SharedSearchHelper';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport type { Playlist, Series } from 'libs/shared/interfaces';\n\nfunction formatSearchResponse(response: SearchResults<SearchResultObjectTypes>) {\n /**\n * Until playlists and series are regionalised, search will always return every series/playlist that exists\n * even if the current user doesn't have access to the content inside (which will happen for example when playlists/series)\n * contain all UK library content but is being searched for by an AU user.\n *\n * For some search queries, this may result in search showing a bunch of \"empty\" playlists/series, which sucks.\n * This will filter all empty collections out and decrement the `totalResults` to avoid this and make search a better\n * experience.\n *\n * Ideally this will be removed one day when this regionalisation is no longer an issue.\n */\n let totalResults = response.totalResults;\n\n const results = response?.results?.filter(result => {\n if (result._index !== 'series' && result._index !== 'playlist')\n return true;\n\n if (result._index === 'playlist') {\n const playlist = result as SearchResultsObject<Playlist>;\n\n if (playlist.clips?.data?.length ||\n playlist.interactives?.data?.length ||\n playlist.videos?.data?.length)\n return true;\n\n totalResults--;\n return false;\n }\n\n if ((result as SearchResultsObject<Series>).videos?.data?.length === 0) {\n totalResults--;\n return false;\n }\n\n return true;\n }) ?? [];\n\n response.results = results;\n response.totalResults = totalResults;\n\n // The first search result will always have the highest score value.\n // We store it so that we can access it for subsequent results pages\n const resultMaxScore = results[0]?._score;\n\n return {\n ...response,\n results: SharedSearchHelper.mapMaxScoreToSearchResults(results, resultMaxScore)\n };\n}\n\nfunction stringifyObject(obj: HashObject): string {\n return Object.entries(obj).reduce((prev, [ , value ]) => {\n let stringifiedValue = value;\n\n if (typeof value === 'object') {\n stringifiedValue = stringifyObject(value);\n } else if ([ 'number', 'boolean', 'string' ].includes(typeof value)) {\n stringifiedValue = value.toString();\n }\n\n if (!prev.length)\n return stringifiedValue;\n\n return `${prev},${stringifiedValue}`;\n }, '');\n}\n\nexport const SharedSearchRequests = {\n searchV5(\n query: string,\n filters: HashObject,\n widgets: WidgetFilter[] = []\n ): Flight.PublicRequest {\n const widgetData = widgets.map(w => [ w.id, w?.cursor ]);\n const filterData = stringifyObject(filters);\n \n const key = `search:v5:${query}:${widgetData}:${filterData}`;\n \n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`]: indicesFilter,\n isLearner,\n ...genericFilters\n } = filters;\n\n const data = {\n widgets,\n indices: indicesFilter,\n filters: Object.entries(genericFilters)\n .reduce((prev, [ key, value ]) =>\n ({ ...prev, [key.replace('filters.', '')]: value }), {}),\n query,\n includeAllIndices: false,\n isLearner: !!isLearner,\n ogql: SearchOGQL\n };\n\n return {\n url: '{gateway}/v5/search',\n publicUrl: '/api/search/v5',\n type: HttpVerbs.POST,\n data,\n formatData: (response: WidgetSearchResults) => {\n const curriculumSearchWidget = response.widgets.find(w => w.widgetId === WidgetTypeId.SearchCurriculumCode);\n\n /**\n * When a curriculum search has been detected, we want to filter out all other\n * widgets.\n */\n if (curriculumSearchWidget) {\n return {\n widgets: [curriculumSearchWidget]\n };\n }\n\n return response;\n },\n key\n };\n },\n \n searchV4(\n query: string,\n indicesArr: SearchIndices[],\n filters: HashObject = {},\n allowSubstitute: boolean = true,\n cursor?: string,\n limit?: number\n ): Flight.PublicRequest {\n let key = `search:v4:${query}:${allowSubstitute}:${indicesArr}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n const {\n [`${FilterConstants.FILTER_PARAM_PREFIX}excludeLibraryExclusive`]: excludeLibraryExclusive,\n isLearner,\n ...genericFilters\n } = filters;\n\n const indices = indicesArr.map(index => {\n if (index !== 'video' || !excludeLibraryExclusive)\n return { index };\n\n return { index, filters: { excludeLibraryExclusive } };\n });\n\n const data = {\n searchType: 'content',\n indices,\n filters: Object.entries(genericFilters)\n .reduce((prev, [ key, value ]) =>\n ({ ...prev, [key.replace('filters.', '')]: value }), {}),\n query,\n allowSubstitute,\n cursor: cursor ?? undefined,\n isLearner: !!isLearner,\n limit\n };\n\n return {\n url: '{gateway}/v4/search',\n publicUrl: '/api/search/v4',\n type: HttpVerbs.POST,\n data,\n key,\n formatData: formatSearchResponse\n };\n },\n\n search(\n query: string,\n indices: SearchIndices[],\n filters: HashObject = {},\n allowSubstitute: boolean = true,\n cursor?: string,\n limit?: number,\n success?: (results: SearchResults) => void,\n error?: (xhr: Xhr) => void\n ): Flight.PublicRequest {\n let key = `search:${query}:${allowSubstitute}:${indices}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n const params = Object.assign({}, {\n index: indices,\n cursor: cursor ?? undefined,\n query,\n allowSubstitute,\n limit,\n ...filters\n });\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v3/search', params),\n publicUrl: UrlHelper.urlBuilder('/api/search', params),\n key,\n formatData: formatSearchResponse,\n success,\n error\n };\n },\n\n tagsAndClassifications(\n query: string,\n indices: SearchIndices[],\n filters: HashObject = {},\n cursor?: string,\n success?: (results: string[]) => void,\n error?: () => void\n ): Flight.PublicRequest {\n const params = {\n index: indices,\n cursor,\n query,\n ...filters\n };\n\n let key = `filter:options:${query}:${indices.join(':')}:${cursor}`;\n\n key += Object.keys(filters).map(filterName => {\n const filter = filters[filterName];\n return Array.isArray(filter) ? filter.join(';') : filter;\n }).join(';');\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v3/search/tags-and-classifications', params),\n publicUrl: UrlHelper.urlBuilder('/api/search/tags-and-classifications', params),\n key,\n success,\n error,\n normalize: false\n };\n }\n};","import { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { SharedSearchRequests } from 'libs/shared/apps/search/flight-requests/SharedSearchRequests';\nimport { SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { ClassificationStatus } from 'libs/shared/enums/ClassificationStatus';\nimport { ClassificationType } from 'libs/shared/enums/ClassificationType';\nimport { CurationTag } from 'libs/shared/enums/CurationTag';\nimport { Classification, Presentation, Rating } from 'libs/shared/interfaces';\n\nimport { SearchHelper } from 'apps/search/utils';\n\nconst TEACHER_FILTERS = [ 'filters.classification', 'filters.presentation' ];\nconst STUDENT_FILTERS = [ 'filters.classification', 'filters.presentation', 'isLearner' ];\n\ntype TopicSearchResults = SearchResults<SearchResultsObject<Classification>>;\n\nexport function useSearchTopics(\n queryParams: HashObject,\n ratings: Rating[] = [],\n presentationId: string,\n availablePresentations: Presentation[],\n isStudent: boolean\n): Flight.Response<SearchResults> {\n const rawFilters = ratings?.length && FilterHelper.buildBackendFilterParams(\n queryParams,\n ratings,\n [presentationId],\n isStudent,\n []\n );\n\n const filters = ObjectHelper.pick(rawFilters, isStudent ? STUDENT_FILTERS : TEACHER_FILTERS);\n filters[`filters.classificationType`] = ClassificationType.Subject;\n filters[`filters.status`] = ClassificationStatus.Published;\n\n if (queryParams?.moviesAndTv)\n filters[`filters.curationTag`] = CurationTag.MOVIES_AND_TV;\n\n if (availablePresentations.length) {\n filters[`filters.presentation`] = availablePresentations.map(presentation => presentation.id);\n }\n\n const presentationMap = availablePresentations?.reduce((acc: HashObject, presentation) => {\n acc[presentation.id] = presentation;\n return acc;\n }, {}) ?? {};\n\n const indices = FilterHelper.getAppliedIndices(queryParams);\n\n const hasFilteredOutTopics = !indices.includes('classification');\n\n const request = SharedSearchRequests.search(\n SearchHelper.getQuery(queryParams),\n ['classification'],\n filters,\n queryParams.allowSubstitute !== 'false'\n );\n\n const shouldFetch = !hasFilteredOutTopics;\n\n const response = Flight.useBasicFetch<TopicSearchResults>(shouldFetch && request);\n\n if (!shouldFetch)\n return null;\n\n if (!response.data)\n return response;\n\n if (!availablePresentations || availablePresentations?.length < 2)\n return response;\n\n const results = [...response.data.results];\n\n /**\n * If the customer has more than 1 presentation, and they search for something that returns 2 topics\n * with the same score, then we want to order those topics based on the presentation's learning level.\n * This is achieved by checking the `value` on the presentation.\n */\n const sortedResults = results.sort((a, b) => {\n // If the scores are different, then keep the original ordering\n if (a._score !== b._score)\n return 0;\n\n const presentationA = presentationMap[a.presentationId];\n const presentationB = presentationMap[b.presentationId];\n\n if (!presentationA)\n return 1;\n\n if (!presentationB)\n return -1;\n\n // Order by presentation value\n return presentationA.value - presentationB.value;\n });\n\n return {\n ...response,\n data: {\n ...response.data,\n results: sortedResults\n }\n };\n}\n","import { Flight } from 'libs/common/flight';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { TopicResults } from 'libs/shared/apps/search/interfaces';\nimport { MasterObjectTypes } from 'libs/shared/enums/MasterObjectTypes';\nimport { LocalPermissionName, PermissionName } from 'libs/shared/enums/PermissionName';\nimport { PresentationLearningLevel } from 'libs/shared/enums/PresentationLearningLevel';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { DomainMasterCollectionType, LibraryRequests } from 'libs/shared/flight-requests/LibraryRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, DashboardTargetType, Library, Rating, User, YearGroup } from 'libs/shared/interfaces';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { RatingRequests } from 'shared/flight-requests/RatingRequests';\nimport { useCurriculums } from 'shared/hooks/useCurriculums';\nimport { usePresentation } from 'shared/hooks/usePresentation';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useFetchCuratedDashboard } from 'shared/utils/DashboardHelper';\n\nimport { useFetchSchoolLevels } from 'apps/search/hooks/useFetchSchoolLevels';\nimport { useSearchCompanies } from 'apps/search/hooks/useSearchCompanies';\nimport { useSearchTopics } from 'apps/search/hooks/useSearchTopics';\n\n/**\n * We need to fetch libraries in order to support the sources filter. \n * However we need to exclude the streamable library, and additionally we need to exclude\n * the exchange library if the user has decided they don't want to see exchange results.\n * \n * We then need to return both of these ids so that the FilterHelper.getBackendFilters()\n * can add them as excludeLibraryExclusive filters\n * \n * - Sha\n */\nfunction useGetLibraries() {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const products = useProducts();\n const settings = useSettings(null);\n\n const streamableLibrary = Flight.useBasicFetch<HashObject>(LibraryRequests.streamableLearning());\n const streamableLibraryId = streamableLibrary.data?.objectId;\n\n const showExchangeSearchResults = products.hasProduct(ProductId.Exchange) && settings.showExchangeSearchResults;\n\n const libraryTypes: DomainMasterCollectionType[] = [ 'sharedLibrary', 'customLibrary', 'workspace', 'hostedLibrary', 'exchange' ];\n const librariesRequest = Flight.useBasicFetch<Library[]>(\n currentUser.data?.isAuthenticated && LibraryRequests.domainLibraries(libraryTypes)\n );\n\n let libraries = librariesRequest.data ?? [];\n const exchangeLibraryIndex = libraries?.findIndex(l => l.type === MasterObjectTypes.Exchange);\n const exchangeLibraryId = libraries[exchangeLibraryIndex]?.id;\n\n if (!showExchangeSearchResults)\n libraries = [ ...libraries.slice(0, exchangeLibraryIndex), ...libraries.slice(exchangeLibraryIndex + 1) ];\n\n if (streamableLibraryId) {\n const streamableIndex = libraries?.findIndex(l => l.id.toString() === streamableLibraryId.toString());\n libraries = [ ...libraries.slice(0, streamableIndex), ...libraries.slice(streamableIndex + 1) ];\n }\n\n const hasLibrariesCompleted = (\n streamableLibrary.hasCompleted &&\n (!currentUser.data?.isAuthenticated || librariesRequest.hasCompleted)\n );\n\n return {\n hasLibrariesCompleted,\n libraries,\n exchangeLibraryId,\n streamableLibraryId,\n showExchangeSearchResults\n };\n}\n\nfunction useGetRatings() {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const ratings = Flight.useBasicFetch<Rating[]>(RatingRequests.ratings(currentUser.data?.countryCode));\n\n const {\n activePresentation, availablePresentations, getFallbackPresentation, hasPresentationsLoaded\n } = usePresentation();\n\n const currentPresentation = activePresentation || getFallbackPresentation();\n\n if (!hasPresentationsLoaded)\n return ratings;\n\n if (availablePresentations?.length > 1 || !currentPresentation)\n return ratings;\n\n const learningLevel = TopicsHelper.getMappedPresentationLevel(currentPresentation.learningLevel);\n if (learningLevel !== PresentationLearningLevel.Level_1)\n return ratings;\n\n return {\n ...ratings,\n data: ratings.data?.filter(rating => {\n // Primary schools shouldn't see ratings higher than PG\n return rating.code && rating.value < 64;\n })\n };\n}\n\n/**\n * This hook contains all the simple data fetching that normally sits in the view.\n * I've done this to help promote readability of of the SearchResultsView - Sha\n */\nexport function useFetchSearchData(\n queryParams: HashObject\n) {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const userDetails = Flight.useBasicFetch<User>(currentUser.data?.id && UserRequests.user(currentUser.data.id));\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n const products = useProducts();\n const settings = useSettings(null);\n\n const {\n hasLibrariesCompleted,\n libraries,\n exchangeLibraryId,\n streamableLibraryId,\n showExchangeSearchResults\n } = useGetLibraries();\n\n const {\n activePresentation, availablePresentations, getFallbackPresentation, hasPresentationsLoaded\n } = usePresentation();\n\n const currentPresentation = activePresentation || getFallbackPresentation();\n const currentPresentationId = currentPresentation?.id;\n\n const curriculums = useCurriculums();\n\n const audiences = usePresentationAudiences();\n\n const schoolLevels = useFetchSchoolLevels(currentPresentation);\n const schoolLevelIds = schoolLevels.data?.schoolLevels?.map(o => o.id);\n const availableTopics = Flight.useBasicFetch<TopicResults>(schoolLevels?.data &&\n ClassificationRequests.topicsFromAllAvailablePresentations(schoolLevelIds));\n\n const ratings = useGetRatings();\n\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n\n const isLearner = hasPermissions(PermissionName.StudentExperience);\n const canUseSeriesActions = hasLocalPermissions(LocalPermissionName.UseSeriesActions);\n const hasCustomLibraries = hasPermissions(PermissionName.ViewLibraries);\n const hasMoviesAndTv = hasPermissions(PermissionName.ViewMoviesTv);\n\n const topics = useSearchTopics(\n queryParams,\n ratings.data,\n currentPresentationId,\n availablePresentations,\n isLearner\n );\n\n const companies = useSearchCompanies(\n queryParams,\n ratings.data,\n availablePresentations,\n hasMoviesAndTv\n );\n\n const {\n dashboard: moviesAndTvDashboard\n } = useFetchCuratedDashboard({\n targetType: DashboardTargetType.MoviesAndTv,\n queryParams\n });\n\n const hasDataLoaded = (\n audiences.hasCompleted &&\n hasPresentationsLoaded &&\n currentUser.hasCompleted &&\n (!currentUser.data?.isAuthenticated || userDetails.hasCompleted) &&\n ratings.hasCompleted &&\n config.hasCompleted &&\n availablePresentations &&\n (!currentUser.data?.isAuthenticated || !products.isLoadingProducts) &&\n !settings.isLoadingSettings &&\n hasLibrariesCompleted\n );\n\n return {\n queryParams,\n currentUser,\n userDetails,\n config,\n yearGroups,\n products,\n settings,\n curriculums,\n audiences,\n schoolLevels,\n currentPresentation,\n availablePresentations,\n availableTopics,\n ratings,\n topics,\n companies,\n moviesAndTvDashboard,\n currentPresentationId,\n isLearner,\n canUseSeriesActions,\n libraries,\n hasDataLoaded,\n exchangeLibraryId,\n streamableLibraryId,\n showExchangeSearchResults,\n hasPermissions,\n hasLocalPermissions,\n hasCustomLibraries,\n hasMoviesAndTv\n };\n}\n\nexport function useFetchSearchDataV2(\n queryParams: HashObject\n) {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const userDetails = Flight.useBasicFetch<User>(currentUser.data?.id && UserRequests.user(currentUser.data.id));\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n const products = useProducts();\n const settings = useSettings(null);\n\n const {\n hasLibrariesCompleted,\n libraries,\n exchangeLibraryId,\n streamableLibraryId,\n showExchangeSearchResults\n } = useGetLibraries();\n\n const {\n activePresentation, availablePresentations, getFallbackPresentation, hasPresentationsLoaded\n } = usePresentation();\n\n const currentPresentation = activePresentation || getFallbackPresentation();\n const currentPresentationId = currentPresentation?.id;\n\n const audiences = usePresentationAudiences();\n\n const schoolLevels = useFetchSchoolLevels(currentPresentation);\n const schoolLevelIds = schoolLevels.data?.schoolLevels?.map(o => o.id);\n const availableTopics = Flight.useBasicFetch<TopicResults>(schoolLevels?.data &&\n ClassificationRequests.topicsFromAllAvailablePresentations(schoolLevelIds));\n\n const ratings = useGetRatings();\n\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n\n const isLearner = hasPermissions(PermissionName.StudentExperience);\n const hasCustomLibraries = hasPermissions(PermissionName.ViewLibraries);\n const hasMoviesAndTv = hasPermissions(PermissionName.ViewMoviesTv);\n\n const {\n dashboard: moviesAndTvDashboard\n } = useFetchCuratedDashboard({\n targetType: DashboardTargetType.MoviesAndTv,\n queryParams\n });\n\n const hasDataLoaded = (\n audiences.hasCompleted &&\n hasPresentationsLoaded &&\n currentUser.hasCompleted &&\n (!currentUser.data?.isAuthenticated || userDetails.hasCompleted) &&\n ratings.hasCompleted &&\n config.hasCompleted &&\n availablePresentations &&\n (!currentUser.data?.isAuthenticated || !products.isLoadingProducts) &&\n !settings.isLoadingSettings &&\n hasLibrariesCompleted\n );\n\n return {\n queryParams,\n currentUser,\n userDetails,\n yearGroups,\n products,\n settings,\n audiences,\n schoolLevels,\n currentPresentation,\n availablePresentations,\n availableTopics,\n ratings,\n moviesAndTvDashboard,\n currentPresentationId,\n isLearner,\n libraries,\n hasDataLoaded,\n exchangeLibraryId,\n streamableLibraryId,\n showExchangeSearchResults,\n hasPermissions,\n hasLocalPermissions,\n hasCustomLibraries,\n hasMoviesAndTv\n };\n}","import { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SharedSearchRequests } from 'libs/shared/apps/search/flight-requests/SharedSearchRequests';\nimport { SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { Company, Presentation, Rating } from 'libs/shared/interfaces';\n\nimport { SearchHelper } from 'apps/search/utils';\n\ntype CompanySearchResults = SearchResults<SearchResultsObject<Company>>;\n\nexport function useSearchCompanies(\n queryParams: HashObject,\n ratings: Rating[] = [],\n availablePresentations: Presentation[],\n hasMoviesAndTv: boolean\n): Flight.Response<SearchResults> {\n const availablePresentationIds = availablePresentations.map(p => p.id);\n\n const rawFilters = ratings?.length && FilterHelper.buildBackendFilterParams(\n queryParams,\n ratings,\n availablePresentationIds,\n false,\n []\n );\n \n const filters = rawFilters || {};\n\n /**\n * For other uses of FilterHelper.buildBackendFilterParams, the presentaiton ids will only be added for students,\n * but as a temporary fix for searching companies, we always filter by the current presentation - Sha\n */\n if (availablePresentationIds?.length)\n filters[`filters.presentation`] = availablePresentationIds;\n\n const indices = FilterHelper.getAppliedIndices(queryParams);\n\n const hasFilteredOutCompanies = !indices.includes('company');\n\n const request = SharedSearchRequests.search(\n SearchHelper.getQuery(queryParams),\n ['company'],\n filters,\n queryParams.allowSubstitute !== 'false'\n );\n\n const shouldFetch = !hasFilteredOutCompanies && hasMoviesAndTv;\n\n const response = Flight.useBasicFetch<CompanySearchResults>(shouldFetch && request);\n\n if (!shouldFetch)\n return null;\n\n if (!response.data)\n return response;\n\n return {\n ...response,\n data: {\n ...response.data,\n results: [...response.data.results]\n }\n };\n}\n","import { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { SharedSearchRequests } from 'libs/shared/apps/search/flight-requests/SharedSearchRequests';\nimport { SearchIndices, SearchResultObjectTypes, SearchResults } from 'libs/shared/apps/search/interfaces';\nimport { handleHttpError } from 'libs/shared/errors/handlers/HttpErrorHandlers';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { UseProductsResponse } from 'libs/shared/hooks/UseProducts';\nimport { SettingsHash } from 'libs/shared/hooks/useSettings';\nimport { Video } from 'libs/shared/interfaces';\n\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\n\nimport { ExchangeGroupingType, useGroupExchangeResults } from './useGroupExchangeResults';\n\nexport const namespace = 'search.utils';\n\ninterface UseGetSearchResultsOptions {\n queryParams: HashObject;\n appliedIndices: SearchIndices[];\n backendFilters: HashObject;\n products: UseProductsResponse;\n settings: SettingsHash;\n hasDataLoaded: boolean;\n exchangeLibraryId: string;\n showExchangeSearchResults: boolean;\n}\nexport function useGetSearchResults(options: UseGetSearchResultsOptions) {\n const { queryParams, appliedIndices, backendFilters } = options;\n\n const alerts = useAlerts();\n const fetch = Flight.useGetFetch();\n\n const searchResultsResponse = Flight.useGetResponse<SearchResults>(getSearchRequest()?.key);\n const hasExchangeLibraryFilter = hasLibraryFilter(options.exchangeLibraryId?.toString());\n const fetchMixedExchangeResults = (\n options.hasDataLoaded &&\n appliedIndices?.length &&\n options.showExchangeSearchResults &&\n !hasExchangeLibraryFilter\n );\n const mixedExchangeSearchResults = Flight.useBasicFetch<SearchResults>(\n fetchMixedExchangeResults && getMixedExchangeSearchRequest()\n );\n\n function hasLibraryFilter(libraryId: string): boolean {\n if (!libraryId) return false;\n\n return options.backendFilters?.[`${FilterConstants.FILTER_PARAM_PREFIX}library`]\n ?.some?.((l: string) => l.toString() === libraryId);\n }\n\n function getMixedExchangeSearchRequest() {\n return SharedSearchRequests.searchV4(\n queryParams.query,\n appliedIndices,\n backendFilters,\n queryParams.allowSubstitute !== 'false',\n null,\n 10\n );\n }\n\n function getSearchRequest(cursor?: string) {\n if (!options.hasDataLoaded || !appliedIndices?.length) return;\n\n let backendFilters = { ...options.backendFilters };\n\n if (options.showExchangeSearchResults && !hasExchangeLibraryFilter) {\n const excludeLibraryFilter = `${FilterConstants.FILTER_PARAM_PREFIX}excludeLibraryExclusive`;\n backendFilters = {\n ...backendFilters,\n [excludeLibraryFilter]: [ ...backendFilters[excludeLibraryFilter], options.exchangeLibraryId ]\n };\n }\n \n return SharedSearchRequests.searchV4(\n queryParams.query,\n appliedIndices,\n backendFilters,\n queryParams.allowSubstitute !== 'false',\n cursor\n );\n }\n\n function fetchNext(cursor?: string) {\n fetch(getSearchRequest(cursor));\n }\n\n function onError(pageNumber: number, httpStatus: HttpStatus): void {\n if (pageNumber === 1)\n return handleHttpError(httpStatus);\n\n alerts.error(LanguageService.getPhrase(namespace, 'error'));\n }\n\n const searchResults = useInfiniteList<SearchResultObjectTypes, SearchResults>(\n getSearchRequest,\n fetchNext,\n onError,\n data => data.results\n );\n\n function getExchangeGroupingType(): ExchangeGroupingType {\n if (!options.showExchangeSearchResults)\n return 'omit';\n\n return hasExchangeLibraryFilter ? 'untouched' : 'group';\n }\n\n const videos = searchResults.items?.filter(r => r._index === 'video' || r._index === 'clip');\n useVideoMixin(videos as Video[]);\n\n const items = useGroupExchangeResults({\n searchResults: searchResults.items,\n mixedExchangeSearchResults: mixedExchangeSearchResults.data?.results,\n searchResultsResponse: searchResultsResponse.data,\n groupingType: getExchangeGroupingType()\n });\n\n return {\n ...searchResults,\n hasFirstPageCompleted: searchResults.hasFirstPageCompleted || !options.hasDataLoaded || !appliedIndices?.length,\n items,\n fetchNext,\n substituteQuery: searchResultsResponse.data?.substituteQuery,\n suggestions: searchResultsResponse.data?.suggestions\n };\n}\n","import React from 'react';\n\nimport { ExchangeVideoGroup, SearchResultObjectTypes, SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nexport type ExchangeGroupingType =\n 'omit' | // Don't show exchange results at all\n 'group' | // Group exchange results into a component\n 'untouched'; // Leave exchange results untouched\n\ninterface UseGroupExchangeResults {\n searchResults: SearchResultObjectTypes[];\n mixedExchangeSearchResults: SearchResultObjectTypes[];\n searchResultsResponse: SearchResults;\n groupingType: ExchangeGroupingType;\n}\n\nexport function useGroupExchangeResults(options: UseGroupExchangeResults) {\n return React.useMemo(() => {\n if (!options.searchResults?.length || !options.mixedExchangeSearchResults?.length || options.groupingType === 'untouched')\n return options.searchResults;\n\n const mixedExchangeResults: SearchResultObjectTypes[] = [...options.searchResults];\n const exchangeResults: SearchResultsObject<Video>[] = [];\n let exchangeIndex: number;\n let exchangeShowCount: number;\n let consecutive = false;\n\n options.mixedExchangeSearchResults.forEach((item, index) => {\n if (exchangeResults.length === 3) return;\n\n const isExchangeVideo = VideoHelper.isVideo(item) &&\n item.libraries.data?.length === 1 &&\n item.libraries.data?.[0]?.typeId === MasterType.ExchangeCollection;\n\n if (isExchangeVideo) {\n if (exchangeIndex === undefined) {\n exchangeIndex = index;\n exchangeShowCount = 0;\n consecutive = true;\n }\n\n if (consecutive)\n exchangeShowCount++;\n\n exchangeResults.push(item);\n return;\n }\n\n consecutive = false;\n });\n\n const exchangeVideoGroup: SearchResultsObject<ExchangeVideoGroup> = {\n id: null,\n type: null,\n name: null,\n videos: exchangeResults,\n showCount: exchangeIndex === 0 ? 1 : exchangeShowCount,\n isExchangeVideoGroup: true,\n _index: null\n };\n \n if (options.groupingType === 'group' && exchangeResults.length)\n mixedExchangeResults.splice(exchangeIndex, 0, exchangeVideoGroup);\n\n return mixedExchangeResults;\n }, [\n options.searchResultsResponse,\n options.searchResults?.length,\n options.mixedExchangeSearchResults,\n options.groupingType\n ]);\n}","import { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { SharedSearchRequests } from 'libs/shared/apps/search/flight-requests/SharedSearchRequests';\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\n\nexport interface UseGetTagsAndClassificationsOptions {\n queryParams: HashObject;\n appliedIndices: SearchIndices[];\n backendFilters: HashObject;\n}\n\nexport function useGetTagsAndClassifications(options: UseGetTagsAndClassificationsOptions) {\n return Flight.useBasicFetch<string[]>(options && SharedSearchRequests.tagsAndClassifications(\n options.queryParams.query,\n options.appliedIndices,\n options.backendFilters\n ));\n}\n\nconst invalidBackendFilters = [\n `${FilterConstants.FILTER_PARAM_PREFIX}indicesFilters`\n];\n\nfunction getCleanBackendFilters(backendFilters: HashObject) {\n return ObjectHelper.omit(backendFilters, invalidBackendFilters);\n}\n\nexport function useGetTagsAndClassificationsV2(options: UseGetTagsAndClassificationsOptions) {\n const backendFilters = getCleanBackendFilters(options.backendFilters);\n \n return Flight.useBasicFetch<string[]>(options && SharedSearchRequests.tagsAndClassifications(\n options.queryParams.query,\n options.appliedIndices,\n backendFilters\n ));\n}","import React from 'react';\n\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { ViewModelKeys } from 'shared/constants/LiteViewModels';\n\nexport function useSearchMask(hasCompleted: boolean): void {\n const [ showMask, setShowMask ] = useViewModel(ViewModelKeys.SHOW_SEARCH_MASK, true);\n\n React.useEffect(() => {\n showMask && hasCompleted && setShowMask(false);\n }, [hasCompleted]);\n}\n","import React from 'react';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'search.searchResultsEmptyState';\n\ninterface SearchResultsEmptyStateProps {\n query?: string;\n scotland?: boolean;\n}\n\nexport function SearchResultsEmptyState(props: SearchResultsEmptyStateProps): JSX.Element {\n const imageUrl = (props.scotland && props.query?.trim()?.toLowerCase() === 'nessie')\n ? ImageUrls.EmptyStates.Search.RESULTS_SCOTLAND\n : ImageUrls.EmptyStates.Search.RESULTS;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={imageUrl} />\n\n <EmptyState.Heading>\n {props.query\n ? <Text phrase='headingWithQuery' options={{ query: props.query }} />\n : <Text phrase='headingWithoutQuery' />\n }\n </EmptyState.Heading>\n\n <EmptyState.Info>\n <Text phrase='info' />\n <AppLink\n className='info-link'\n appLink={{ application: AppChannels.SUBJECT, action: Actions.Subjects.PRESENTATION_TOPICS }}\n >\n <Text phrase='topicsAppLink' />\n </AppLink>\n </EmptyState.Info>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { EntityType, LocationContext } from 'libs/analytics/interfaces';\n\nimport { MixedSearchResults } from 'libs/shared/apps/search/components/mixed-search-results/MixedSearchResults';\nimport { SearchFilters } from 'libs/shared/apps/search/components/search-filters/SearchFilters';\nimport { SearchSubstitute } from 'libs/shared/apps/search/components/search-substitute/SearchSubstitute';\nimport { SearchSuggestions } from 'libs/shared/apps/search/components/search-suggestions/SearchSuggestions';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\n\nimport { useFetchSearchData } from 'apps/search/hooks/useFetchSearchData';\nimport { useGetSearchResults } from 'apps/search/hooks/useGetSearchResults';\nimport { useGetTagsAndClassifications } from 'apps/search/hooks/useGetTagsAndClassifications';\nimport { useSearchMask } from 'apps/search/hooks/useSearchMask';\nimport { SearchHelper } from 'apps/search/utils';\n\nimport { SearchResultsEmptyState } from './empty-state/SearchResultsEmptyState';\n\nexport const namespace = 'search.searchResults';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SearchResultsViewProps {\n queryParams: HashObject;\n}\n\nexport function SearchResultsView(props: SearchResultsViewProps): JSX.Element {\n const { queryParams = {} } = props;\n\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n const { commonVideoProps } = useCommonVideoProps({\n locationContext: LocationContext.VideoThumbnail,\n mtv: queryParams.moviesAndTv\n });\n\n const searchData = useFetchSearchData(queryParams);\n\n const searchFilters = SearchHelper.getBackendFilters(searchData);\n\n const hasIndices = !!searchFilters?.appliedIndices.length;\n const tagsAndClassifications = useGetTagsAndClassifications(hasIndices && searchFilters);\n const searchResults = useGetSearchResults({ ...searchFilters, ...searchData });\n\n const filters = SearchHelper.getFilters({\n data: searchData,\n inaccessibleIndices: searchFilters?.inaccessibleIndices,\n tagsAndClassifications: hasIndices && tagsAndClassifications\n });\n \n useSetPageMetadata(PageMetadataHelper.getDefaultMetadata({\n title: queryParams.query ?? '',\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n allowIndexing: false\n }));\n\n /**\n * Do we have the data we need for the entire view to render\n */\n const hasLoaded = (\n searchData.hasDataLoaded && filters\n );\n\n /**\n * Do we have the data we need to render our results\n */\n const hasSearchCompleted = (\n searchResults.hasFirstPageCompleted &&\n // Topic and Company requests won't exist if they aren't being fetched\n (!searchData.topics || searchData.topics.hasCompleted) &&\n (!searchData.companies || searchData.companies.hasCompleted) &&\n (!hasIndices || tagsAndClassifications.hasCompleted) &&\n !!filters\n );\n\n /**\n * Do we actually have results\n */\n const hasResults = (\n searchResults.items?.length ||\n searchData.topics?.data?.totalResults ||\n searchData.companies?.data?.totalResults\n );\n\n useSearchMask(hasSearchCompleted);\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <div className='px-4'>\n <SearchSubstitute\n substitute={searchResults.substituteQuery}\n queryParams={queryParams}\n getAppLink={SearchHelper.getSearchAppLink}\n />\n\n {!searchResults.substituteQuery && (\n <SearchSuggestions\n suggestions={searchResults.suggestions}\n queryParams={queryParams}\n getAppLink={SearchHelper.getSearchAppLink}\n />\n )}\n\n {(!!searchData.audiences.data && !!searchData.ratings.data && !!searchData.availableTopics.data) && (\n <SearchFilters\n queryParams={queryParams}\n mainFilters={filters?.mainFilters}\n moreFilters={filters?.moreFilters}\n analyticsOptions={{\n entity: EntityType.SearchResults,\n location: LocationContext.SearchFilters\n }}\n appLink={{ application: AppChannels.SEARCH, action: Actions.Search.HOME }}\n isFetchingOptions={tagsAndClassifications.isFetching}\n />\n )}\n\n {hasSearchCompleted &&\n <section>\n {hasResults\n ? (\n <VideoActionsContext.Provider value={videoActions}>\n <MixedSearchResults\n queryParams={queryParams}\n results={searchResults.items}\n topics={searchData.topics?.data}\n companies={searchData.companies?.data}\n audiences={!queryParams.moviesAndTv && searchData.audiences.data}\n currentUser={searchData.currentUser.data}\n availablePresentations={searchData.availablePresentations}\n showActions={(!searchData.isLearner && searchData.canUseSeriesActions)}\n hasPermissions={searchData.hasPermissions}\n appLinks={SearchHelper.getAppLinks(\n searchData.currentPresentation,\n searchData.availablePresentations,\n queryParams.moviesAndTv === 'true'\n )}\n commonVideoProps={commonVideoProps}\n />\n </VideoActionsContext.Provider>\n ) : (\n <SearchResultsEmptyState\n query={queryParams.query}\n scotland={!!searchData.currentPresentation?.description?.toLowerCase().includes('scotland')}\n />\n )\n }\n {/* XOR */}\n {(searchResults.hasMore || searchResults.isFetching) && (\n <InfiniteScrollFooter\n isFetching={searchResults.isFetching}\n fetchNext={searchResults.fetchNext}\n nextCursor={searchResults.nextCursor}\n fetchOnScroll\n />\n )}\n </section>\n }\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'search.searchWidgetTooltip';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SearchWidgetTooltipProps {\n widgetId: WidgetTypeId;\n isTertiary: boolean;\n}\n\nfunction getWidgetPhrase(widgetId: WidgetTypeId, isTertiary: boolean) {\n const widgetTooltipPhraseMap: {[key in WidgetTypeId]?: string} = {\n [WidgetTypeId.SearchRelevantTopics]: 'relevantTopicsTooltip',\n [WidgetTypeId.SearchCompanies]: 'studiosAndChannelsTooltip',\n [WidgetTypeId.SearchTopResults]: 'topResultsTooltip',\n [WidgetTypeId.SearchSeries]: 'seriesTooltip',\n [WidgetTypeId.SearchPlaylists]: 'playlistsTooltip',\n [WidgetTypeId.SearchMyVideosFolder]: 'myVideosFoldersTooltip',\n [WidgetTypeId.SearchMySchoolLibraryFolder]: isTertiary ? 'mySchoolFoldersTooltipTertiary' : 'mySchoolFoldersTooltip',\n [WidgetTypeId.SearchMyVideos]: 'myVideosTooltip',\n [WidgetTypeId.SearchMySchoolLibraryVideos]: isTertiary ? 'mySchoolVideosTooltipTertiary' : 'mySchoolVideosTooltip',\n [WidgetTypeId.SearchExchangeArchive]: 'exchangeArchiveTooltip',\n [WidgetTypeId.SearchRelatedResults]: 'relatedResultsTooltip'\n };\n\n return widgetTooltipPhraseMap[widgetId];\n}\n\nexport function SearchWidgetTooltip(props: SearchWidgetTooltipProps): JSX.Element {\n const phrase = getWidgetPhrase(props.widgetId, props.isTertiary);\n\n if (!phrase)\n return <></>;\n\n return (\n <SvgContainer\n className={`svg-container text-secondary`}\n svgName={cvSvgLibrary.Info}\n title={getPhrase(phrase)}\n tooltipPlacement='top'\n tooltipSpanHack\n tooltipSpanHackClassName='ms-2'\n />\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"searchResultsWidgetsContainer\":\"Z5jXs\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport type { WidgetSearchItem } from 'libs/shared/apps/search/interfaces/WidgetSearchResults';\nimport { WidgetContainerView } from 'libs/shared/components/widgets/curated-widgets/WidgetContainerView';\nimport { AllSearchWidgetTemplates } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { type HasLocalPermissionsFunc, type HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { type BaseObject, type CurrentUser, DashboardTargetType, type Presentation, type PresentationAudience, WidgetMetadata } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\n\nimport { SearchWidgetTooltip } from './components/search-widget-tooltip/SearchWidgetTooltip';\n\nimport styles from './mixed-widget-search-results.scss';\n\nconst namespace = 'search.mixedWidgetSearchResults';\n\nfunction getName(widget: WidgetSearchItem, isTertiary: boolean): string {\n if (widget.widgetId === WidgetTypeId.SearchMySchoolLibraryFolder)\n return isTertiary ? LanguageService.getPhrase(namespace, 'tertiaryFolderHeading') : widget.name;\n\n if (widget.widgetId === WidgetTypeId.SearchMySchoolLibraryVideos)\n return isTertiary ? LanguageService.getPhrase(namespace, 'tertiaryLibraryVideoHeading') : widget.name;\n\n return widget.name;\n}\n\nfunction getWidgetMetadata(widget: WidgetSearchItem): Partial<WidgetMetadata> {\n if (widget.widgetId === WidgetTypeId.SearchCurriculumCode) {\n return {\n curriculumLeafName: widget.content.name,\n curriculumLeafDescription: widget.content.description\n };\n }\n\n return {};\n}\n\nexport interface MixedWidgetSearchResultsProps {\n data: WidgetSearchItem[];\n widgetAppLinks: AllSearchWidgetTemplates['appLinks'];\n audiences: PresentationAudience[];\n availablePresentations: Presentation[];\n currentUser: CurrentUser;\n commonVideoProps: CommonVideoProps;\n isTertiary: boolean;\n\n getAnalyticsData?: (widget: WidgetSearchItem, yIndex: number, xIndex: number) => HashObject;\n \n getSeeMoreLink: (widget: WidgetSearchItem) => Core.AppLink;\n hasPermissions: HasPermissionsFunc;\n hasLocalPermissions: HasLocalPermissionsFunc;\n getSelectedItems: (type: WidgetTypeId) => BaseObject[];\n}\n\nexport function MixedWidgetSearchResults(props: MixedWidgetSearchResultsProps): JSX.Element {\n if (!props.data || !props.data.length)\n return <></>;\n\n return (\n <div className={styles.searchResultsWidgetsContainer}>\n {props.data.map((widget, idx) => {\n return (\n <WidgetContainerView\n widgetCollection={DashboardTargetType.Search}\n \n key={idx}\n widgetIndex={idx}\n id={idx.toString()}\n \n name={getName(widget, props.isTertiary)}\n content={widget.content.data}\n templateId={widget.templateId}\n widgetTypeId={widget.widgetId}\n \n audiences={props.audiences}\n currentUser={props.currentUser}\n appLinks={props.widgetAppLinks}\n availablePresentations={props.availablePresentations}\n hasPermissions={props.hasPermissions}\n seeMoreLink={props.getSeeMoreLink(widget)}\n commonVideoProps={props.commonVideoProps}\n getAnalyticsData={xIndex => props.getAnalyticsData(widget, idx, xIndex)}\n badgeComponent={\n <SearchWidgetTooltip\n widgetId={widget.widgetId}\n isTertiary={props.isTertiary}\n />\n }\n getSelectedItems={props.getSelectedItems}\n \n description={null}\n metadata={getWidgetMetadata(widget)}\n isPreviewing={false}\n settings={null}\n onClickRemoveItem={null}\n />\n );\n })}\n </div>\n );\n}","import React from 'react';\n\nimport { PartialWidgetHeader } from 'libs/shared/components/widgets/curated-widgets/components/header/partial-loading/PartialWidgetHeader';\nimport { PartialTagSlidingListWidgetTemplate } from 'libs/shared/components/widgets/curated-widgets/templates/tag-sliding-list/partial-loading/PartialTagSlidingListWidgetTemplate';\nimport { PartialThumbnailFixedListMediaSmallWidgetTemplate } from 'libs/shared/components/widgets/curated-widgets/templates/thumbnail-fixed-list-media-small/partial-loading/PartialThumbnailFixedListMediaSmallWidgetTemplate';\nimport { PartialThumbnailFixedSmallWidgetTemplate } from 'libs/shared/components/widgets/curated-widgets/templates/thumbnail-fixed-list-small/partial-loading/PartialThumbnailFixedListSmallWidgetTemplate';\nimport { PartialThumbnailVerticalListWidgetTemplate } from 'libs/shared/components/widgets/curated-widgets/templates/thumbnail-vertical-list/partial-loading/PartialThumbnailVerticalListWidgetTemplate';\n\nexport function PartialSearchResults(): JSX.Element {\n return (\n <div className='d-flex flex-column gap-4 mb-3'>\n <div className='border-bottom border-gray-300 pb-3'>\n <PartialTagSlidingListWidgetTemplate />\n </div>\n <div>\n <PartialThumbnailFixedSmallWidgetTemplate hideDescription />\n </div>\n <div>\n <PartialWidgetHeader hideDescription />\n <PartialThumbnailVerticalListWidgetTemplate />\n </div>\n <PartialThumbnailFixedListMediaSmallWidgetTemplate hideDescription />\n <div>\n <PartialWidgetHeader hideDescription />\n <PartialThumbnailVerticalListWidgetTemplate />\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { FeedbackOption } from 'libs/shared/views/feedback/enums/FeedbackOption';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'search.searchResultsRequestVideo';\n\ninterface SearchResultsRequestVideo {\n skipBeforeRequestingVideoStep?: boolean;\n description?: string;\n}\n\nexport function SearchResultsRequestVideo(props: SearchResultsRequestVideo): JSX.Element {\n const { skipBeforeRequestingVideoStep = true } = props;\n \n return (\n <div className='d-flex flex-column align-items-center justify-content-center gap-3 mb-3'>\n {props.description\n ? <span>{props.description}</span>\n : <Text phrase='description' namespace={namespace} />\n }\n <AppLink\n appLink={{\n application: AppChannels.DEFAULT,\n action: Actions.Default.GIVE_FEEDBACK,\n params: {\n selectedOption: FeedbackOption.REQUEST_VIDEO,\n skipBeforeRequestingVideoStep: !!skipBeforeRequestingVideoStep\n }\n }}\n className='btn btn-outline-dark'\n >\n <Text phrase='requestVideo' namespace={namespace} />\n </AppLink>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { SearchResultsRequestVideo } from '../search-results-request-video/SearchResultsRequestVideo';\n\nconst namespace = 'search.searchResultsEmptyStateV2';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SearchResultsEmptyStateProps {\n query?: string;\n scotland?: boolean;\n hideRequestVideo?: boolean;\n}\n\nexport function SearchResultsEmptyState(props: SearchResultsEmptyStateProps): JSX.Element {\n const imageUrl = (props.scotland && props.query?.trim()?.toLowerCase() === 'nessie')\n ? ImageUrls.EmptyStates.Search.RESULTS_SCOTLAND\n : ImageUrls.EmptyStates.Search.RESULTS;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={imageUrl} />\n\n <EmptyState.Heading>\n {props.query\n ? <Text phrase='headingWithQuery' options={{ query: props.query }} />\n : <Text phrase='headingWithoutQuery' />\n }\n </EmptyState.Heading>\n\n <EmptyState.Info className='w-50 m-0'>\n <Text phrase='info' />\n <AppLink\n className='info-link'\n appLink={{ application: AppChannels.SUBJECT, action: Actions.Subjects.PRESENTATION_TOPICS }}\n >\n <Text phrase='topicsAppLink' />\n </AppLink>\n </EmptyState.Info>\n </EmptyState>\n \n {!props.hideRequestVideo &&\n <SearchResultsRequestVideo description={getPhrase('requestVideoInfo')} />\n }\n </LanguageNamespaceContext.Provider>\n );\n}","import { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { SourceFilterOptions, TypeFilterOptions } from 'libs/shared/apps/search/interfaces';\nimport { WidgetFilter } from 'libs/shared/apps/search/interfaces/WidgetSearchResults';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { BaseObject } from 'libs/shared/interfaces';\n\ninterface HasQueryParamOptions {\n queryParams: HashObject;\n key: string;\n value: string;\n}\n\nconst SupportedSearchWidgetTypeIds: WidgetTypeId[] = [\n WidgetTypeId.SearchRelevantTopics,\n WidgetTypeId.SearchCompanies,\n WidgetTypeId.SearchPlaylists,\n WidgetTypeId.SearchSeries,\n WidgetTypeId.SearchTopResults,\n WidgetTypeId.SearchMyVideos,\n WidgetTypeId.SearchMyVideosFolder,\n WidgetTypeId.SearchMySchoolLibraryVideos,\n WidgetTypeId.SearchMySchoolLibraryFolder,\n WidgetTypeId.SearchExchangeArchive,\n WidgetTypeId.SearchRelatedResults,\n WidgetTypeId.SearchCurriculumCode\n];\n\nfunction hasQueryParam(options: HasQueryParamOptions) {\n const targetParam = options.queryParams?.[options.key];\n \n if (typeof targetParam === 'string') {\n return targetParam === options.value;\n }\n\n if (!Array.isArray(targetParam)) {\n return false;\n }\n\n return targetParam.includes(options.value);\n}\n\nexport interface CursorContext {\n cursor: string;\n widgetTypeId: WidgetTypeId;\n}\n\n/**\n * The `cursor` param is a stringified object with `CursorContext` type\n */\nfunction getCursorContext(cursor: string): CursorContext {\n if (!cursor || !cursor.length)\n return;\n \n let context: CursorContext;\n try {\n const parsed: CursorContext = JSON.parse(cursor);\n\n if (!parsed.cursor || !parsed.widgetTypeId)\n return;\n\n if (!SupportedSearchWidgetTypeIds.includes(parsed.widgetTypeId))\n return;\n\n context = parsed;\n } catch {\n return;\n }\n\n return context;\n}\n\nfunction getValidFocusedWidget(queryParams: HashObject): WidgetTypeId {\n if (!queryParams?.focus)\n return;\n\n if (typeof queryParams.focus === 'string') {\n return SupportedSearchWidgetTypeIds.find(w => w === queryParams.focus);\n }\n\n if (Array.isArray(queryParams.focus) && queryParams.focus.length === 1) {\n return SupportedSearchWidgetTypeIds.find(w => w === queryParams.focus[0]);\n }\n\n return;\n}\n\nfunction getWidgetIdsFromQueryParams(queryParams: HashObject): WidgetTypeId[] {\n const widgets: WidgetTypeId[] = [];\n\n const focusedWidget = getValidFocusedWidget(queryParams);\n\n if (focusedWidget) {\n return [ focusedWidget, WidgetTypeId.SearchTags ];\n }\n \n if (hasQueryParam({ key: 'type', value: TypeFilterOptions.Classification, queryParams })) {\n widgets.push(WidgetTypeId.SearchRelevantTopics);\n }\n \n if (hasQueryParam({ key: 'type', value: TypeFilterOptions.Company, queryParams })) {\n widgets.push(WidgetTypeId.SearchCompanies);\n }\n \n if (hasQueryParam({ key: 'type', value: TypeFilterOptions.Series, queryParams })) {\n widgets.push(WidgetTypeId.SearchSeries);\n }\n \n if (hasQueryParam({ key: 'type', value: TypeFilterOptions.Playlist, queryParams })) {\n widgets.push(WidgetTypeId.SearchPlaylists);\n }\n\n if (hasQueryParam({ key: 'type', value: TypeFilterOptions.Category, queryParams })) {\n widgets.push(WidgetTypeId.SearchMySchoolLibraryFolder, WidgetTypeId.SearchMyVideosFolder);\n }\n \n if (hasQueryParam({ key: 'source', value: SourceFilterOptions.ExchangeArchive, queryParams })) {\n widgets.push(WidgetTypeId.SearchExchangeArchive);\n }\n \n if (hasQueryParam({ key: 'source', value: SourceFilterOptions.MyVideos, queryParams })) {\n widgets.push(WidgetTypeId.SearchMyVideos, WidgetTypeId.SearchMyVideosFolder);\n }\n\n if (hasQueryParam({ key: 'source', value: SourceFilterOptions.ClickView, queryParams })) {\n widgets.push(WidgetTypeId.SearchTopResults, WidgetTypeId.SearchRelatedResults);\n }\n\n if (hasQueryParam({ key: 'source', value: SourceFilterOptions.School, queryParams })) {\n widgets.push(WidgetTypeId.SearchMySchoolLibraryVideos, WidgetTypeId.SearchMySchoolLibraryFolder);\n }\n\n if (hasQueryParam({ key: 'type', value: TypeFilterOptions.Video, queryParams }) ||\n hasQueryParam({ key: 'type', value: TypeFilterOptions.Clip, queryParams }) ||\n hasQueryParam({ key: 'type', value: TypeFilterOptions.Interactive, queryParams })) {\n widgets.push(\n WidgetTypeId.SearchTopResults,\n WidgetTypeId.SearchRelatedResults,\n WidgetTypeId.SearchMySchoolLibraryVideos,\n WidgetTypeId.SearchMyVideos,\n WidgetTypeId.SearchExchangeArchive,\n WidgetTypeId.SearchCurriculumCode\n );\n }\n\n if (widgets.length) {\n widgets.push(WidgetTypeId.SearchTags);\n }\n\n return ArrayHelper.uniq(widgets);\n}\n\nexport const SearchResultsFilterHelper = {\n isOnlyActiveWidget(widgetId: WidgetTypeId, queryParams: HashObject): boolean {\n const targetParam = queryParams?.['focus'];\n \n if (typeof targetParam === 'string')\n return targetParam.toLowerCase() === widgetId.toLowerCase();\n \n if (!Array.isArray(targetParam))\n return false;\n \n if (targetParam.length !== 1)\n return false;\n \n return !!targetParam.find(p => p.toLowerCase() === widgetId.toLowerCase());\n },\n\n getActiveWidgetFilters(\n queryParams: HashObject,\n cursor?: string\n ): WidgetFilter[] {\n const cursorContext = getCursorContext(cursor);\n\n /**\n * Having a cursor context means we will only fetch\n * the specified widget data - this is usually\n * the last widget's cursor from the search response\n */\n if (cursorContext) {\n return [{\n id: cursorContext.widgetTypeId,\n cursor: cursorContext.cursor\n }];\n }\n \n /**\n * We build widget filters based on query params\n */\n const widgets: WidgetTypeId[] = getWidgetIdsFromQueryParams(queryParams);\n \n return widgets.map(w => ({ id: w }));\n },\n\n getSelectedTagOrClassification(queryParams: HashObject): BaseObject[] {\n if (typeof queryParams?.tagOrClassification === 'string')\n return [{ id: queryParams.tagOrClassification, name: queryParams.tagOrClassification }];\n\n if (Array.isArray(queryParams?.tagOrClassification))\n return queryParams.tagOrClassification.map((tag: string) => ({\n id: tag,\n name: tag\n }));\n\n return [];\n },\n\n getSearchWidgetSelectedItems(queryParams: HashObject, widgetTypeId: WidgetTypeId): BaseObject[] {\n if (widgetTypeId !== WidgetTypeId.SearchTags)\n return [];\n\n return SearchResultsFilterHelper.getSelectedTagOrClassification(queryParams);\n }\n};","import React from 'react';\n\nimport { Middleware, type MiddlewareFunctionSync } from 'libs/common/backbone/core';\n\nexport function useTransformer<T>(transformations?: MiddlewareFunctionSync<T>[]) {\n const middleware = React.useMemo(() => new Middleware<T>(), []);\n\n React.useEffect(() => {\n if (!transformations || !transformations.length)\n return;\n\n transformations.forEach(fn => middleware.useSync(fn));\n }, []);\n\n function push(fn: MiddlewareFunctionSync<T>): void {\n if (!middleware)\n return;\n\n middleware.useSync(fn);\n }\n\n function execute(options: T): T {\n if (!middleware)\n return;\n \n return middleware.goSync(options);\n }\n \n return {\n push,\n execute\n };\n}","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { WidgetSearchItem } from 'libs/shared/apps/search/interfaces/WidgetSearchResults';\n\nimport { SearchResultsTransformOptions } from '../../interfaces/SearchResultsTransformOptions';\n\n/**\n * Paginated data returns more widgets so if we dont merge the widget content by widget type id\n * it would add another widget to the page rather than appending content to the relevant\n * search result index\n */\nexport function mergeSearchResults(options: SearchResultsTransformOptions): SearchResultsTransformOptions {\n const { data } = options;\n \n if (!data) return options;\n \n const items = [...data];\n\n const groupedWidgets = ArrayHelper.groupBy(items, 'widgetId');\n\n const mergedWidgets: WidgetSearchItem[] = [];\n\n for (const widgetGroup of Object.values(groupedWidgets)) {\n let currentMergedWidget: WidgetSearchItem = null;\n const widgets: WidgetSearchItem[] = [];\n\n for (const widget of widgetGroup) {\n if (!currentMergedWidget) {\n currentMergedWidget = widget;\n continue;\n }\n\n /**\n * Widgets of the same type may have different templates. When this occurs,\n * we want to make sure each widgetType + template combo is pushed\n * as a separate widget.\n */\n if (widget.templateId !== currentMergedWidget.templateId) {\n widgets.push(currentMergedWidget);\n currentMergedWidget = widget;\n continue;\n }\n\n currentMergedWidget.content.data = [\n ...(currentMergedWidget.content.data || []),\n ...widget.content.data\n ];\n }\n\n widgets.push(currentMergedWidget);\n mergedWidgets.push(...widgets);\n }\n\n return {\n ...options,\n data: mergedWidgets\n };\n}","import { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport type { Classification } from 'libs/shared/interfaces';\nimport { MasterTypeHelper } from 'libs/shared/utils/MasterTypeHelper';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport type { WidgetSearchItemTransformOptions } from '../../interfaces/WidgetSearchItemTransformOptions';\n\n/**\n * Sort first six Relevant topics widget by Exact matches and then by presentation level \n */\nexport function transformSearchRelevantTopics(\n options: WidgetSearchItemTransformOptions\n): WidgetSearchItemTransformOptions {\n if (options.data.widgetId !== WidgetTypeId.SearchRelevantTopics)\n return options;\n\n function sortByLearningLevel(a: Classification, b: Classification) {\n return TopicsHelper.sortByLearningLevel(a, b, options.availablePresentations);\n }\n\n /**\n * We only want to sort the first 6 items.\n * Anything after that are items added\n * through pagination.\n */\n const relevantTopicsData = options.data.content.data.slice(0, 6);\n const remainingTopicsData = options.data.content.data.slice(6);\n \n const exactMatchSortedTopics: Classification[] = [];\n const remainingSortedTopics: Classification[] = [];\n \n relevantTopicsData.forEach(topic => {\n if (!MasterTypeHelper.isClassification(topic))\n return;\n \n if (topic?.name?.toLowerCase() === options.query.toLowerCase()) {\n exactMatchSortedTopics.push(topic);\n return;\n }\n \n remainingSortedTopics.push(topic);\n });\n \n exactMatchSortedTopics.sort(sortByLearningLevel);\n remainingSortedTopics.sort(sortByLearningLevel);\n \n const sortedItem = {\n ...options.data,\n content: {\n ...options.data.content,\n data: [\n ...exactMatchSortedTopics,\n ...remainingSortedTopics,\n ...remainingTopicsData\n ]\n }\n };\n \n options = {\n ...options,\n data: sortedItem\n };\n\n return options;\n}","import { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\n\nimport type { WidgetSearchItemTransformOptions } from '../../interfaces/WidgetSearchItemTransformOptions';\n\n/**\n * Transform search tag data so that its id is its name\n */\nexport function transformSearchTags(options: WidgetSearchItemTransformOptions): WidgetSearchItemTransformOptions {\n if (options.data.widgetId !== WidgetTypeId.SearchTags)\n return options;\n\n const normalizedItemData = options.data.content.data.map(x => ({\n id: x.name,\n ...x\n }));\n\n options.data = {\n ...options.data,\n content: {\n ...options.data.content,\n data: normalizedItemData\n }\n };\n\n return options;\n}","import { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { SharedSearchRequests } from 'libs/shared/apps/search/flight-requests/SharedSearchRequests';\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\nimport { WidgetFilter, WidgetSearchItem, WidgetSearchResults } from 'libs/shared/apps/search/interfaces/WidgetSearchResults';\nimport { handleHttpError } from 'libs/shared/errors/handlers/HttpErrorHandlers';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { UseProductsResponse } from 'libs/shared/hooks/UseProducts';\nimport { SettingsHash } from 'libs/shared/hooks/useSettings';\nimport { Presentation } from 'libs/shared/interfaces';\n\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\n\nimport { SearchResultsFilterHelper } from '../../utils/SearchResultsFilterHelper';\nimport { useTransformer } from '../useTransformer';\n\nimport { SearchResultsTransformOptions } from './interfaces/SearchResultsTransformOptions';\nimport { WidgetSearchItemTransformOptions } from './interfaces/WidgetSearchItemTransformOptions';\nimport { mergeSearchResults } from './transformations/results/mergeSearchResults';\nimport { transformSearchRelevantTopics } from './transformations/widget-item/transformSearchRelevantTopics';\nimport { transformSearchTags } from './transformations/widget-item/transformSearchTags';\n\ninterface UseGetSearchResultsOptionsV2 {\n queryParams: HashObject;\n appliedIndices: SearchIndices[];\n backendFilters: HashObject;\n products: UseProductsResponse;\n settings: SettingsHash;\n hasDataLoaded: boolean;\n exchangeLibraryId: string;\n showExchangeSearchResults: boolean;\n availablePresentations: Presentation[];\n}\n\nconst namespace = 'search.useGetSearchResultsV2';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function useGetSearchResultsV2(options: UseGetSearchResultsOptionsV2) {\n const { queryParams, appliedIndices, backendFilters } = options;\n\n const fetch = Flight.useGetFetch();\n const alerts = useAlerts();\n\n const searchResultsTransformer = useTransformer<SearchResultsTransformOptions>([\n mergeSearchResults\n ]);\n \n const widgetItemTransformer = useTransformer<WidgetSearchItemTransformOptions>([\n transformSearchTags,\n transformSearchRelevantTopics\n ]);\n\n /**\n * Apply tranformations to the search response\n */\n function transformSearchResults(data: WidgetSearchItem[]): WidgetSearchItem[] {\n if (!data || !data.length)\n return data;\n\n const searchResults = searchResultsTransformer.execute({ data });\n \n return searchResults.data.map(item => {\n const transformOptions: WidgetSearchItemTransformOptions = {\n data: item,\n availablePresentations: options.availablePresentations,\n query: options.queryParams?.query || ''\n };\n\n const transformed = widgetItemTransformer.execute(transformOptions);\n\n return transformed.data;\n }, [] as WidgetSearchItem[]);\n }\n\n function getDataFromResponse() {\n if (searchResults.isFetching || !items?.length)\n return [];\n\n return items.reduce((outer, widget) => {\n return widget.content.data.reduce((inner, video) => ([ ...inner, video ]), outer);\n }, []);\n }\n\n function getSearchRequest(cursor?: string): Flight.Request {\n if (!options.hasDataLoaded || !appliedIndices?.length) return;\n\n const widgetsFilter: WidgetFilter[] =\n SearchResultsFilterHelper.getActiveWidgetFilters(queryParams, cursor);\n\n return SharedSearchRequests.searchV5(\n queryParams.query,\n backendFilters,\n widgetsFilter\n );\n }\n\n function fetchNext(cursor?: string) {\n return fetch(getSearchRequest(cursor));\n }\n\n function onError(pageNumber: number, httpStatus: HttpStatus): void {\n if (pageNumber === 1)\n return handleHttpError(httpStatus);\n\n alerts.error(getPhrase('error'));\n }\n\n /**\n * Gets the widget cursor and widgetTypeId.\n * The returned string is a stringified object of\n * those both.\n */\n function getCursor(response: WidgetSearchResults): string {\n const responseWidgets = [...response.widgets];\n\n if (!responseWidgets.length) {\n return;\n }\n\n const lastWidget = ArrayHelper.last(responseWidgets);\n\n if (lastWidget?.content?.cursor) {\n const cursorContext = {\n widgetTypeId: lastWidget.widgetId,\n cursor: lastWidget?.content?.cursor\n };\n return JSON.stringify(cursorContext);\n }\n\n return;\n }\n\n const searchResults = useInfiniteList<WidgetSearchItem, WidgetSearchResults>(\n getSearchRequest,\n fetchNext,\n onError,\n data => data.widgets,\n getCursor\n );\n\n const items = transformSearchResults(searchResults.items);\n \n const objects = getDataFromResponse();\n useVideoMixin(objects);\n\n return {\n ...searchResults,\n items,\n fetchNext\n };\n}","import { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { MixedWidgetSearchResultsProps } from 'libs/shared/apps/search/components/mixed-widget-search-results/MixedWidgetSearchResults';\nimport { WidgetSearchItem } from 'libs/shared/apps/search/interfaces/WidgetSearchResults';\nimport { WidgetTypeIdConfig } from 'libs/shared/constants/WidgetTypeIdConfig';\nimport type { AudienceFilterParams, BaseObject, Classification, Company, Folder, GetClassificationAppLinkOptions, Playlist, VideoTypes } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { ClassificationAppLinkHelper } from 'shared/utils/ClassificationAppLinkHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { getFolderAppLink } from 'apps/libraries/views/library-folder/LibraryFolderViewUtils';\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nimport { SearchResultsFilterHelper } from './SearchResultsFilterHelper';\n\ninterface GetSeeMoreAppLinkOptions {\n appLinks: MixedWidgetSearchResultsProps['widgetAppLinks'];\n widget: WidgetSearchItem;\n queryParams: HashObject;\n data: WidgetSearchItem[];\n}\n\nfunction hasMoreContent(widget: WidgetSearchItem): boolean {\n return !!widget.content.cursor;\n}\n\nexport const SearchResultsAppLinkHelper = {\n getSearchWidgetAppLinks(\n queryParams: HashObject,\n audienceParams: AudienceFilterParams = {}\n ): MixedWidgetSearchResultsProps['widgetAppLinks'] {\n return {\n classification: (classification?: Classification) => {\n const options: GetClassificationAppLinkOptions = {\n ...audienceParams,\n moviesAndTv: TopicsHelper.isMtv(classification)\n };\n\n return ClassificationAppLinkHelper.getAppLink(classification, options);\n },\n \n videoType: (video: VideoTypes, opts: GetVideoAppLinkOptions) => (\n VideoAppLinkHelper.getAppLink(video, {\n ...opts,\n includeContext: false\n })\n ),\n \n series: SeriesAppLinkHelper.getSeriesAppLink,\n \n playlist: (playlist: Playlist) => ({\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.PLAYLIST,\n args: [ playlist.id, TextHelper.slugify(playlist.name) ]\n }),\n \n \n company: (company: Company) => ({\n application: AppChannels.MOVIES_AND_TV,\n action: Actions.MoviesAndTv.COMPANY_DASHBOARD,\n args: [ company.id, TextHelper.slugify(company.name) ]\n }),\n \n folder: (folder: Folder, opts?: {libraryId?: string}) => {\n if (!opts?.libraryId) {\n return {\n application: AppChannels.MY_VIDEOS,\n action: Actions.MyVideos.MY_VIDEOS_FOLDER,\n args: [ folder.id, TextHelper.slugify(folder.name) ]\n };\n }\n \n return getFolderAppLink(opts?.libraryId, folder, null);\n },\n \n searchSettings: () => ({\n application: AppChannels.SETTINGS,\n action: Actions.Settings.SEARCH_SETTINGS\n }),\n \n searchHome: (filterParams?: HashObject, options?: {replace: boolean}) => {\n let params: HashObject = { ...filterParams };\n \n if (!options?.replace) {\n params = {\n ...queryParams,\n ...params\n };\n }\n \n return ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n // This empty args array needs to be here otherwise FixedWidget will try to\n // populate it with some junk that'll break the query params.\n // This is tech debt that needs to be cleaned up.\n args: [],\n params\n });\n },\n\n tag: (tag: BaseObject) => {\n let tagOrClassification: string[] =\n SearchResultsFilterHelper.getSelectedTagOrClassification(queryParams).map(x => x.name);\n \n if (tagOrClassification.includes(tag.name)) {\n tagOrClassification = tagOrClassification.filter(x => x !== tag.name);\n } else {\n tagOrClassification.push(tag.name);\n }\n\n return ({\n action: Actions.Search.HOME,\n application: AppChannels.SEARCH,\n params: {\n ...queryParams,\n tagOrClassification\n }\n });\n }\n };\n },\n \n getSeeMoreAppLink(options: GetSeeMoreAppLinkOptions): Core.AppLink {\n if (!hasMoreContent(options.widget))\n return;\n \n const getAppLinkFunc = WidgetTypeIdConfig[options.widget.widgetId]?.getCollectionAppLink;\n \n if (!getAppLinkFunc || SearchResultsFilterHelper.isOnlyActiveWidget(options.widget.widgetId, options.queryParams))\n return;\n \n /**\n * If its the only widget search result item rendered we infinitely\n * load the widget (if we can) therefore we need to hide 'See all' applink\n * - Nish\n */\n if (options.data.length === 1 && options.data[0].widgetId === options.widget.widgetId)\n return;\n \n return getAppLinkFunc(options.appLinks);\n }\n};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { StorageType } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { EntityType, HashObject, LocationContext } from 'libs/analytics/interfaces';\n\nimport { MixedWidgetSearchResults } from 'libs/shared/apps/search/components/mixed-widget-search-results/MixedWidgetSearchResults';\nimport { SearchFilters } from 'libs/shared/apps/search/components/search-filters/SearchFilters';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { ContentRegion } from 'libs/shared/enums/ContentRegion';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { PresentationAudience } from 'libs/shared/interfaces';\nimport { AudienceHelper } from 'libs/shared/utils/audience-helper/AudienceHelper';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\n\nimport { useIsTertiary } from 'apps/onboarding/hooks/useIsTertiary';\nimport { useFetchSearchDataV2 } from 'apps/search/hooks/useFetchSearchData';\nimport { useSearchMask } from 'apps/search/hooks/useSearchMask';\nimport { SearchHelper } from 'apps/search/utils';\n\nimport { PartialSearchResults } from './components/partial-loading/PartialSearchResults';\nimport { SearchResultsEmptyState } from './components/search-results-empty-state/SearchResultsEmptyState';\nimport { SearchResultsRequestVideo } from './components/search-results-request-video/SearchResultsRequestVideo';\nimport { useGetSearchResultsV2 } from './hooks/use-get-search-results/useGetSearchResultsV2';\nimport { useCurriculumCodeSearch } from './hooks/useCurriculumCodeSearch';\nimport { SearchResultsAppLinkHelper } from './utils/SearchResultsAppLinkHelper';\nimport { SearchResultsFilterHelper } from './utils/SearchResultsFilterHelper';\n\nexport const namespace = 'search.searchResultsV2';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SearchResultsViewV2Props {\n queryParams: HashObject\n}\n\nexport function SearchResultsViewV2(props: SearchResultsViewV2Props): JSX.Element {\n const { queryParams = {} } = props;\n\n useSetPageMetadata(PageMetadataHelper.getDefaultMetadata({\n title: queryParams.query ?? '',\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n allowIndexing: false\n }));\n\n const [activeAudiences] = useViewModel<PresentationAudience[]>(\n SharedViewModelKeys.AUDIENCE_FILTER,\n undefined,\n { storage: StorageType.SessionStorage }\n );\n\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n const { commonVideoProps } = useCommonVideoProps({\n locationContext: LocationContext.VideoThumbnail,\n mtv: queryParams.moviesAndTv\n });\n const isTertiary = useIsTertiary();\n\n /**\n * Data required for search view to render\n */\n const searchData = useFetchSearchDataV2(queryParams);\n\n /**\n * Filters to be applied globally or on indices\n */\n const searchFilters = SearchHelper.getBackendFiltersV2(searchData);\n\n /**\n * Actually fetch the search results with the filters\n */\n const searchResults = useGetSearchResultsV2({ ...searchFilters, ...searchData });\n\n /**\n * Update the search bar UI when we detect that a curriculum code has been searched for\n */\n useCurriculumCodeSearch(searchResults, queryParams);\n\n /**\n * State of the current filters\n */\n const filters = SearchHelper.getFilters({\n data: searchData,\n inaccessibleIndices: searchFilters?.inaccessibleIndices,\n _hasNewSearch: true\n });\n \n /**\n * Do we have the data we need for the entire view to render\n */\n const hasLoaded = (\n searchData.hasDataLoaded && filters\n );\n\n /**\n * Do we have the data we need to render our results\n */\n const hasSearchCompleted = (\n searchResults.hasFirstPageCompleted &&\n !!filters\n );\n\n /**\n * Do we actually have results\n */\n const hasResults = (\n searchResults.items?.length\n );\n\n const hideDivider = (\n (!searchResults.hasFirstPageCompleted && searchResults.isFetching) ||\n (hasResults && !!searchResults.items.find(item => item.widgetId === WidgetTypeId.SearchTags))\n );\n\n const widgetAppLinks = SearchResultsAppLinkHelper.getSearchWidgetAppLinks(\n queryParams,\n AudienceHelper.getAudienceParams(activeAudiences)\n );\n \n useSearchMask(hasSearchCompleted);\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <div className='px-4'>\n {(!!searchData.audiences.data && !!searchData.ratings.data && !!searchData.availableTopics.data) && (\n <SearchFilters\n queryParams={queryParams}\n mainFilters={filters?.mainFilters}\n moreFilters={filters?.moreFilters}\n analyticsOptions={{\n entity: EntityType.SearchResults,\n location: LocationContext.SearchFilters\n }}\n appLink={{ application: AppChannels.SEARCH, action: Actions.Search.HOME }}\n hideDivider={hideDivider}\n _hasNewSearch\n />\n )}\n\n {(() => {\n if (!searchResults.hasFirstPageCompleted && searchResults.isFetching) {\n return <PartialSearchResults />;\n }\n\n if (!hasResults) {\n return (\n <SearchResultsEmptyState\n query={queryParams.query}\n scotland={searchData.currentUser.data?.contentRegion === ContentRegion.SCOT}\n hideRequestVideo={searchData.isLearner}\n />\n );\n }\n\n return (\n <section>\n <VideoActionsContext.Provider value={videoActions}>\n <MixedWidgetSearchResults\n data={searchResults.items}\n widgetAppLinks={widgetAppLinks}\n audiences={searchData.audiences.data}\n availablePresentations={searchData.availablePresentations}\n currentUser={searchData.currentUser.data}\n isTertiary={isTertiary}\n \n getSeeMoreLink={widget => SearchResultsAppLinkHelper.getSeeMoreAppLink({\n widget,\n queryParams,\n data: searchResults.items,\n appLinks: widgetAppLinks\n })}\n hasPermissions={searchData.hasPermissions}\n hasLocalPermissions={searchData.hasLocalPermissions}\n commonVideoProps={commonVideoProps}\n getAnalyticsData={(widget, yIndex, xIndex) => ({\n widgetId: widget.widgetId,\n widgetName: widget.name,\n templateId: widget.templateId,\n widgetIndex: yIndex,\n itemIndex: xIndex,\n search: {\n query: queryParams.query || ''\n }\n })}\n getSelectedItems={widget =>\n SearchResultsFilterHelper.getSearchWidgetSelectedItems(queryParams, widget)\n }\n />\n \n {(!searchData.isLearner && !searchResults.isFetching && !searchResults.nextCursor) &&\n <SearchResultsRequestVideo />\n }\n \n {(searchResults.hasMore || searchResults.isFetching) &&\n <InfiniteScrollFooter\n isFetching={searchResults.isFetching}\n fetchNext={searchResults.fetchNext}\n nextCursor={searchResults.nextCursor}\n fetchOnScroll={true}\n />\n }\n </VideoActionsContext.Provider>\n </section>\n );\n })()}\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SEARCH_CURRICULUM_CODE_PARAM } from 'libs/shared/apps/search/utils/SharedSearchHelper';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\n\nimport { useGetSearchResultsV2 } from './use-get-search-results/useGetSearchResultsV2';\n\nexport function useCurriculumCodeSearch(\n searchResults: ReturnType<typeof useGetSearchResultsV2>,\n queryParams: HashObject\n) {\n React.useEffect(() => {\n if (!searchResults.hasFirstPageCompleted)\n return;\n \n const curriculumCodeWidget = searchResults.items.find(widget => {\n return widget.widgetId === WidgetTypeId.SearchCurriculumCode;\n });\n \n const hasSearchedCode = !!curriculumCodeWidget?.content?.name && !!curriculumCodeWidget?.content?.description;\n \n if (queryParams?.[SEARCH_CURRICULUM_CODE_PARAM] && !hasSearchedCode) {\n Core.AppLinkHelper.trigger({\n ...Core.AppLinkHelper.getCurrentAppLink(),\n params: {\n ...((Core.AppLinkHelper.getCurrentAppLink().params || {}) as HashObject),\n [SEARCH_CURRICULUM_CODE_PARAM]: undefined\n }\n }, { replace: true });\n return;\n }\n \n if (!queryParams?.[SEARCH_CURRICULUM_CODE_PARAM] && hasSearchedCode) {\n Core.AppLinkHelper.trigger({\n ...Core.AppLinkHelper.getCurrentAppLink(),\n params: {\n ...((Core.AppLinkHelper.getCurrentAppLink().params || {}) as HashObject),\n [SEARCH_CURRICULUM_CODE_PARAM]: true\n }\n }, { replace: true });\n }\n }, [searchResults.hasFirstPageCompleted]);\n}","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { useSettings } from 'libs/shared/hooks/useSettings';\n\nimport { SearchResultsView } from '../search-results/SearchResultsView';\nimport { SearchResultsViewV2 } from '../search-results-v2/SearchResultsViewV2';\n\ninterface SearchResultsView2Props {\n queryParams: HashObject;\n}\n\n/**\n * Staging View until we migrate to new search results page completely\n */\n// eslint-disable-next-line rulesdir/require-view-title\nexport function LiteSearchResultsView(props: SearchResultsView2Props): JSX.Element {\n const { queryParams = {} } = props;\n\n const { hasNewSearch } = useSettings(null);\n\n if (hasNewSearch) {\n return <SearchResultsViewV2 queryParams={queryParams} />;\n }\n\n return <SearchResultsView queryParams={queryParams} />;\n}","import { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { Rating } from 'libs/shared/interfaces';\n\nexport const RatingRequests = {\n ratings(countryCode?: string): Flight.PublicRequest {\n return {\n url: '/api/domain/v2/me/ratings',\n publicUrl: UrlHelper.urlBuilder('/api/domain/v2/me/ratings', { countryCode }),\n key: 'ratings',\n // v2/me/ratings doesn't support `query={orderby:value}`. Adding this due to time constraints\n formatData: (ratings: Rating[]) => {\n return ratings.sort((a, b) => a.value - b.value);\n }\n };\n }\n};","import { Flight } from 'libs/common/react/index';\n\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nexport const usePresentationAudiences = () => {\n const { activePresentation, getFallbackPresentation } = usePresentation({ redirectOnError: true });\n\n const presentation = activePresentation || getFallbackPresentation();\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n !!presentation &&\n AudienceRequests.presentationAudiences(presentation.id)\n );\n\n return audiences;\n};","import { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useGrowingBatchFetch } from 'libs/shared/hooks/UseBatchFetch';\nimport { Clip, ClipCollection, Video, VideoCollection } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ntype Types = Video[] | VideoCollection | Clip[] | ClipCollection;\n\nfunction getValidObjects(objects: Types): (Video | Clip)[] {\n if (!objects)\n return [];\n\n if (Array.isArray(objects))\n return objects.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n if ('data' in objects)\n return objects.data.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n return [];\n}\n\ninterface VideoMixinOptions {\n /**\n * If the videos that are having new data mixed into are sitting on an explicit Flight namespace,\n * providing that namespace here is required\n */\n flightNamespace?: string;\n}\n\nexport function useVideoMixin(objects: Types, options: VideoMixinOptions = {}): void {\n const videoIds = getValidObjects(objects).map(v => v.id);\n\n useGrowingBatchFetch(videoIds, ids => VideoRequests.videoMixinAssocs(ids, options.flightNamespace));\n}"],"names":["CHUNK_SIZE","useBatchFetch","itemIds","getRequest","requests","map","chunk","responses","itemsArr","data","items","length","reduce","acc","item","id","isFetching","useGrowingBatchFetch","objs","_getKey","getKey","obj","fetchedItems","Set","setRequests","unfetchedItems","forEach","key","current","has","push","add","r","hasFirstRequestCompleted","hasCompleted","SCROLL_TOLERANCE","useInfiniteList","fetchNext","onError","getItems","getCursor","scrollContainer","options","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","cursor","request","fetchNextPage","currentVal","nextCursor","hasMore","getBoundingClientRect","height","scrollTop","scrollHeight","window","innerHeight","document","documentElement","useEffect","onScroll","FunctionHelper","addEventListener","removeEventListener","shouldInitialFetch","statusCode","httpStatusClass","toString","substr","HttpStatus","totalItems","hasFirstPageCompleted","FeedbackOption","getFolderAppLink","libraryId","folder","sort","application","action","args","name","params","getFolderBgColourClass","charCode","i","charCodeAt","CompanyWidgetItem","props","analyticsData","analyticsOptions","location","actionType","entity","descriptor","CoverPill","coverUrl","logo","url","coverBgColor","metadata","colour","CompanyResult","Col","as","sm","md","useLargeStyle","lg","className","getChildAppLink","appLinks","getCompanyAppLink","getChildAppLinkOptions","getCompanyAppLinkOptions","itemIndex","search","query","queryParams","score","_score","maxScore","_maxScore","featured","_featured","pagePositionIndex","isLarge","namespace","ExchangeVideoGroup","limit","showCount","currentAppLink","currentParams","currentSource","source","Array","isArray","searchAppLink","AppLink","appLink","Text","phrase","searchSettings","videos","slice","v","VideoItem","video","getVideoAppLink","presentationAudiences","audiences","hasPermissions","commonVideoProps","FeaturedVideoResult","HeroVideo","opts","hideInteractiveBadge","showVideoGuidance","VideoHelper","PlaylistWithVideos","breakpoints","maxVideos","useBreakpoints","xl","xxl","playlist","playlistAnalyticsOption","playlistAnalyticsData","Row","xs","playlistAppLink","bgColourClassNames","itemStyle","imageCdnUrl","currentUser","showOwner","videoAnalyticsData","videoId","videoName","size","hideVideoGuidance","LargePlaylistResult","getPlaylistAppLink","preloadImage","SeriesWithVideos","series","seriesAnalyticsOption","seriesAnalyticsData","seriesAppLink","SeriesTallPoster","imageClass","LargeSeriesResult","getSeriesAppLink","CollectionVideoList","analyticsProps","hasSeasonEpisode","episodeNumber","season","collectionId","CollectionThumbnail","isSmall","VideoListHelper","hasVideos","collection","firstVideoWithThumbnail","find","thumbnail","isSeries","collectionType","BaseImage","imageType","Mask","type","maskType","ImageFallback","imageFallbackType","isPlugin","Actions","actions","getCollectionActions","showActions","actionsDropdownClassName","hideBadges","BadgeListContainer","Badge","rating","year","SmallPlaylistResult","SmallSeriesResult","SubjectResult","getClassificationAppLink","getClassificationAppLinkOptions","availablePresentations","highlightOnHover","showNewVideoIndicator","VideoResult","Component","ClipItem","InteractiveItem","getPreviewQuestionsAppLink","MixedSearchResults","useSmallComponent","results","topics","totalResults","companies","companiesAndTopics","childProps","role","c","toLowerCase","result","index","isExchangeVideoGroup","tallPoster","SearchSubstitute","substitute","getAppLink","appLinkOptions","replace","allowSubstitute","SearchSuggestions","suggestions","suggestion","defaultProps","useFetchSchoolLevels","presentation","isLearner","usePermissions","PermissionName","usePresentation","hasPresentationsLoaded","presentationIds","o","SearchRequests","SearchOGQL","classification","TagType","clip","interactive","company","category","formatSearchResponse","filter","_index","clips","interactives","resultMaxScore","SharedSearchHelper","stringifyObject","Object","entries","prev","value","stringifiedValue","includes","searchV5","filters","widgets","widgetData","w","filterData","FilterConstants","indicesFilter","genericFilters","indices","includeAllIndices","ogql","publicUrl","HttpVerbs","formatData","curriculumSearchWidget","widgetId","WidgetTypeId","searchV4","indicesArr","keys","filterName","join","excludeLibraryExclusive","searchType","undefined","success","error","assign","UrlHelper","tagsAndClassifications","normalize","TEACHER_FILTERS","STUDENT_FILTERS","useGetLibraries","UserRequests","products","settings","useSettings","streamableLibrary","LibraryRequests","streamableLibraryId","objectId","showExchangeSearchResults","hasProduct","ProductId","librariesRequest","isAuthenticated","libraries","exchangeLibraryIndex","findIndex","l","MasterObjectTypes","exchangeLibraryId","streamableIndex","hasLibrariesCompleted","useGetRatings","ratings","RatingRequests","countryCode","activePresentation","getFallbackPresentation","currentPresentation","TopicsHelper","learningLevel","PresentationLearningLevel","code","useFetchSearchData","userDetails","config","ConfigRequests","yearGroups","CustomerRequests","customerId","currentPresentationId","curriculums","useCurriculums","usePresentationAudiences","schoolLevels","schoolLevelIds","availableTopics","ClassificationRequests","hasLocalPermissions","canUseSeriesActions","hasCustomLibraries","hasMoviesAndTv","presentationId","isStudent","rawFilters","FilterHelper","ClassificationType","ClassificationStatus","moviesAndTv","CurationTag","presentationMap","hasFilteredOutTopics","shouldFetch","sortedResults","a","b","presentationA","presentationB","useSearchTopics","availablePresentationIds","p","hasFilteredOutCompanies","useSearchCompanies","moviesAndTvDashboard","targetType","dashboard","hasDataLoaded","isLoadingProducts","isLoadingSettings","useGetSearchResults","appliedIndices","backendFilters","alerts","fetch","searchResultsResponse","getSearchRequest","hasExchangeLibraryFilter","some","hasLibraryFilter","fetchMixedExchangeResults","mixedExchangeSearchResults","excludeLibraryFilter","searchResults","pageNumber","httpStatus","LanguageService","useVideoMixin","groupingType","exchangeIndex","exchangeShowCount","mixedExchangeResults","exchangeResults","consecutive","typeId","MasterType","exchangeVideoGroup","splice","useGroupExchangeResults","substituteQuery","useSearchMask","showMask","setShowMask","SearchResultsEmptyState","imageUrl","scotland","trim","ImageUrls","EmptyState","src","getPhrase","SearchResultsView","videoActions","useVideoActions","useCommonVideoProps","locationContext","mtv","searchData","searchFilters","hasIndices","inaccessibleIndices","useSetPageMetadata","PageMetadataHelper","title","phraseContext","phraseHandler","titlePhrase","descriptionPhrase","allowIndexing","hasLoaded","hasSearchCompleted","hasResults","SearchFilters","mainFilters","moreFilters","isFetchingOptions","VideoActionsContext","description","InfiniteScrollFooter","fetchOnScroll","SearchWidgetTooltip","isTertiary","SvgContainer","svgName","tooltipPlacement","tooltipSpanHack","tooltipSpanHackClassName","getName","widget","getWidgetMetadata","curriculumLeafName","content","curriculumLeafDescription","MixedWidgetSearchResults","idx","WidgetContainerView","widgetCollection","widgetIndex","templateId","widgetTypeId","widgetAppLinks","seeMoreLink","getSeeMoreLink","getAnalyticsData","xIndex","badgeComponent","getSelectedItems","isPreviewing","onClickRemoveItem","PartialSearchResults","PartialTagSlidingListWidgetTemplate","hideDescription","PartialWidgetHeader","PartialThumbnailVerticalListWidgetTemplate","PartialThumbnailFixedListMediaSmallWidgetTemplate","SearchResultsRequestVideo","skipBeforeRequestingVideoStep","selectedOption","hideRequestVideo","SupportedSearchWidgetTypeIds","hasQueryParam","targetParam","SearchResultsFilterHelper","isOnlyActiveWidget","getActiveWidgetFilters","cursorContext","context","parsed","JSON","parse","getCursorContext","focusedWidget","focus","getValidFocusedWidget","ArrayHelper","getWidgetIdsFromQueryParams","getSelectedTagOrClassification","tagOrClassification","tag","getSearchWidgetSelectedItems","useTransformer","transformations","middleware","fn","useSync","execute","goSync","mergeSearchResults","groupedWidgets","mergedWidgets","values","currentMergedWidget","transformSearchRelevantTopics","sortByLearningLevel","relevantTopicsData","remainingTopicsData","exactMatchSortedTopics","remainingSortedTopics","topic","MasterTypeHelper","sortedItem","transformSearchTags","normalizedItemData","x","SearchResultsAppLinkHelper","getSearchWidgetAppLinks","audienceParams","ClassificationAppLinkHelper","videoType","VideoAppLinkHelper","includeContext","SeriesAppLinkHelper","TextHelper","searchHome","filterParams","getSeeMoreAppLink","getAppLinkFunc","WidgetTypeIdConfig","getCollectionAppLink","SearchResultsViewV2","activeAudiences","SharedViewModelKeys","storage","useIsTertiary","useFetchSearchDataV2","searchResultsTransformer","widgetItemTransformer","widgetsFilter","responseWidgets","lastWidget","stringify","transformOptions","objects","outer","inner","useGetSearchResultsV2","curriculumCodeWidget","hasSearchedCode","useCurriculumCodeSearch","_hasNewSearch","hideDivider","AudienceHelper","yIndex","widgetName","contentRegion","ContentRegion","LiteSearchResultsView","hasNewSearch","redirectOnError","videoIds","getValidObjects","ids","flightNamespace"],"sourceRoot":""}
|
/package/dist/scripts/{bundle-dfca00e3d3.min.js.LICENSE.txt → bundle-23f3b64e36.min.js.LICENSE.txt}
RENAMED
|
File without changes
|