{"version":3,"file":"traffic.cdd77a97.js","mappings":"qqCAYO,SAASA,EAAYC,GAA4C,IAA3C,MAAEC,EAAK,KAAEC,EAAI,OAAEC,EAAM,UAAEC,GAAkBJ,EACpE,OACEK,EAAAA,EAAAA,KAACC,EAAAA,GAAM,CACLC,GAAG,IACHC,cAAcH,EAAAA,EAAAA,KAACI,EAAAA,GAAI,CAACC,KAAK,YAAYN,UAAU,gDAAgDO,MAAO,KACtGC,KAAK,OACLC,QAAQ,UACRC,MAAM,WACNV,UAAWW,IAAW,oCAAqCX,GAC3DY,OAAO,SACPC,IAAI,WACJf,KAAMA,EACNgB,YAAcC,GAA+CA,EAAMC,kBACnEC,QAAUF,GAA+CA,EAAMC,kBAAkBE,SAEhFrB,IAASI,EAAAA,EAAAA,KAAA,QAAMD,UAAWW,IAAW,CAAE,YAAaZ,IAAUmB,SAAErB,KAGvE,C,sEC3BO,SAASsB,IACd,MAAMC,EAAYC,EAAAA,OAA6B,OACxCC,EAAUC,GAAeF,EAAAA,UAAe,GAuB/C,OArBAA,EAAAA,WAAgB,KACd,IAAKD,EAAUI,QAAS,OAExB,MAAMC,EAAWC,KAAS,WACxB,MAAMC,EAAgBP,EAAUI,QAChC,IAAKG,EAAe,OAEpB,MAAMC,EAAyBC,WAAWC,iBAAiBH,GAAeI,KACpEC,EAA0BL,EAAcM,wBAAwBF,IAEtER,EAAYS,IAA4BJ,EAC1C,GAAG,KAKH,OAHAH,IACAS,SAASC,iBAAiB,SAAUV,GAE7B,KACLS,SAASE,oBAAoB,SAAUX,EAAS,CACjD,GACA,IAEIJ,EAAAA,SACL,KAAM,CACJD,YACAE,cAEF,CAACA,GAEL,C,sEC3BO,SAASe,IAAyE,IAA3D,iBAAEC,EAAmB,IAAG,WAAEC,GAAa,GAAaC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAC,EACpF,MAAOhC,EAAMmC,GAAWtB,EAAAA,SAAe,CACrCuB,YAAaV,SAASW,gBAAgBD,YACtCE,WAAYC,OAAOD,WACnBE,YAAaD,OAAOC,cAsBtB,OAnBA3B,EAAAA,WAAgB,KACd,IAAKkB,EAAY,OAEjB,MAAMU,EAAevB,KAAS,KAC5BiB,EAAQ,CACNC,YAAaV,SAASW,gBAAgBD,YACtCE,WAAYC,OAAOD,WACnBE,YAAaD,OAAOC,aACpB,GACDV,GAIH,OAFAS,OAAOZ,iBAAiB,SAAUc,GAE3B,KACLA,EAAaC,SACbH,OAAOX,oBAAoB,SAAUa,EAAa,CACnD,GACA,CAACX,EAAkBC,IAEf/B,CACT,C,4NCpBA,MAAM2C,GAA6B,EAE5B,SAASC,EAAyBxD,GAM/B,IANgC,cACxCyD,EAAa,cACbC,EAAa,WACbC,EAAU,cACVC,EAAa,iBACbC,GACM7D,EACN,MAAM8D,EAAarC,EAAAA,OAA6B,MAC1CsC,EAA8BtC,EAAAA,OAAa,GAC3CuC,GAAqBC,EAAAA,EAAAA,GAAYN,GAWvC,OATAlC,EAAAA,WAAgB,KACVuC,IAAuBL,GACzBO,YAAW,KAAM,IAAAC,EAAAC,EACf,MAAMC,EAAyE,QAAlDF,EAAqB,QAArBC,EAAGN,EAAWlC,eAAO,IAAAwC,OAAA,EAAlBA,EAAoB/B,wBAAwBF,WAAG,IAAAgC,EAAAA,EAAI,EACnFhB,OAAOmB,SAAS,CAAEnC,IAAKgB,OAAOoB,SAAWR,EAA4BnC,QAAUyC,IAA2B,GAE9G,GACC,CAACL,EAAoBL,KAGtBa,EAAAA,EAAAA,MAAA,OAAKpE,UAAU,2CAA2CqE,IAAKX,EAAWxC,SAAA,CACvEsC,GACCvD,EAAAA,EAAAA,KAACC,EAAAA,GAAM,CACLQ,MAAM,OACN4D,KAAK,SACL9D,KAAK,QACLS,QAASA,KAAM,IAAAsD,EAAAC,EACbb,EAA4BnC,QAAyD,QAAlD+C,EAAqB,QAArBC,EAAGd,EAAWlC,eAAO,IAAAgD,OAAA,EAAlBA,EAAoBvC,wBAAwBF,WAAG,IAAAwC,EAAAA,EAAI,EACzFd,GAAkBF,EAAW,EAE/BkB,aAAaxE,EAAAA,EAAAA,KAACI,EAAAA,GAAI,CAACC,KAAK,cAAcC,MAAO,GAAIP,UAAWW,IAAW,CAAE,aAAc4C,MACvFvD,UAAU,cAAakB,SAEtBqC,EAAaD,EAAgBD,KAGhCpD,EAAAA,EAAAA,KAAA,WAGFmE,EAAAA,EAAAA,MAAA,OAAKpE,UAAU,iDAAgDkB,SAAA,EAC7DjB,EAAAA,EAAAA,KAAA,QAAMD,UAAU,eAAckB,SAAC,iCAC7BiC,IACAiB,EAAAA,EAAAA,MAAAM,EAAAA,SAAA,CAAAxD,SAAA,EACEjB,EAAAA,EAAAA,KAAA,QAAMD,UAAU,sBAAqBkB,SAAC,OACtCjB,EAAAA,EAAAA,KAACC,EAAAA,GAAM,CAACQ,MAAM,OAAOP,GAAG,IAAIL,KAAK,IAAIU,KAAK,QAAQR,UAAU,cAAakB,SAAC,mCAQtF,C,eCtDO,SAASyD,EAAgB/E,GAAoE,IAAnE,QAAEgF,EAAO,KAAEC,EAAI,0BAAEC,EAAyB,aAAEC,GAAqBnF,EAUhG,OACEwE,EAAAA,EAAAA,MAACY,EAAAA,GAAS,CAAA9D,SAAA,EACRjB,EAAAA,EAAAA,KAACgF,EAAAA,GAAW,CAACC,MAAOC,EAAAA,GAAWC,KAAMpF,UAAWW,IAAWmE,EAA2B,cAAexD,UAAQ,IAE5GsD,EAAQS,KAAKC,IAAM,IAAAC,EAAA,OAClBtF,EAAAA,EAAAA,KAACuF,EAAAA,GAAmB,CAElBN,MAAOI,EAAOJ,MACdlF,UAAWsF,EAAOtF,UAClByF,SAAUH,EAAOI,MAAkB,QAAhBH,EAAKV,EAAKS,cAAM,IAAAC,OAAA,EAAXA,EAAaG,IACrCC,UAAWd,EAAKc,UAChB1E,QAASA,IApBSqE,KACxB,MAAMM,EAAoBf,EAAKc,YAAcE,EAAAA,GAAcC,YAAcR,IAAWT,EAAKS,OAEvFP,EADEa,EACW,QAEAN,EACf,EAcqBS,CAAiBT,GAAQpE,SAEvCoE,EAAOhF,MAPHgF,EAAOI,GAQQ,MAI9B,C,eCxCO,IAAKM,EAAmB,SAAnBA,GAAmB,OAAnBA,EAAmB,gBAAnBA,EAAmB,4BAAnBA,CAAmB,MAKnBC,EAAS,SAATA,GAAS,OAATA,EAAS,QAATA,EAAS,QAATA,CAAS,MAKTC,EAAW,SAAXA,GAAW,OAAXA,EAAW,UAAXA,EAAW,kBAAXA,CAAW,MCNhB,SAASC,IACd,MAAM,SAAEC,EAAQ,YAAEC,IAAgBC,EAAAA,EAAAA,MAE5BC,EAAgBA,CAACC,EAA4BC,KACjDJ,EAAY,IACPD,EACH,CAACI,GAAMC,GACP,EAGJ,OACErC,EAAAA,EAAAA,MAAA,OAAKpE,UAAU,oCAAmCkB,SAAA,EAChDjB,EAAAA,EAAAA,KAACyG,EAAAA,GAAO,CAACC,MAAO,EAAG3G,UAAU,aAAYkB,SAAC,6BAG1CkD,EAAAA,EAAAA,MAAA,OAAKpE,UAAU,qBAAoBkB,SAAA,EACjCkD,EAAAA,EAAAA,MAACwC,EAAAA,EAAU,CAACpG,KAAK,QAAQX,MAAM,OAAMqB,SAAA,EACnCjB,EAAAA,EAAAA,KAAC4G,EAAAA,EAAgB,CACfC,OAAQV,EAASW,kBAAoBf,EAAoBgB,OACzD/F,QAASA,KACPsF,EAAc,kBAAmBP,EAAoBgB,OAAO,EAC5D9F,SACH,YAGDjB,EAAAA,EAAAA,KAAC4G,EAAAA,EAAgB,CACfC,OAAQV,EAASW,kBAAoBf,EAAoBiB,aACzDhG,QAASA,KACPsF,EAAc,kBAAmBP,EAAoBiB,aAAa,EAClE/F,SACH,qBAKHkD,EAAAA,EAAAA,MAACwC,EAAAA,EAAU,CAACpG,KAAK,QAAQX,MAAM,QAAOqB,SAAA,EACpCjB,EAAAA,EAAAA,KAAC4G,EAAAA,EAAgB,CACfC,OAAQV,EAASc,YAAcC,EAAAA,GAAKC,KACpC3C,YAAY,WACZjE,KAAK,OACLR,UAAU,UACViB,QAASA,KACPsF,EAAc,YAAaY,EAAAA,GAAKC,KAAK,KAGzCnH,EAAAA,EAAAA,KAAC4G,EAAAA,EAAgB,CACfC,OAAQV,EAASc,YAAcC,EAAAA,GAAKE,MACpC5C,YAAY,gBACZjE,KAAK,OACLR,UAAU,UACViB,QAASA,KACPsF,EAAc,YAAaY,EAAAA,GAAKE,MAAM,YAOpD,CC/DO,MAAMC,EAAa,kBAEbC,EAA2B,GAE3BC,EAAoC,CAC/CT,gBAAiBf,EAAoBgB,OACrCE,UAAW,EACXO,aAAc,CAACvB,EAAYwB,QAASxB,EAAYyB,KAChDC,WAAY,CAAC3B,EAAU4B,GAAI5B,EAAU6B,KAG1BC,EAAiBC,OAAOC,KAAKC,EAAAA,IAAcC,QACrDC,GAAMA,IAAMF,EAAAA,GAAaG,MAAQD,IAAMF,EAAAA,GAAaI,UAG1CC,EAAoB,CAC/B,CAACrC,EAAYyB,KAAM,MACnB,CAACzB,EAAYwB,SAAU,WAGZc,EAAkB,CAC7B,CAACvC,EAAU4B,IAAK,MAChB,CAAC5B,EAAU6B,IAAK,a,SCjBX,SAASW,EAAsB7I,GAAuC,IAAtC,0BAAE8I,GAAkC9I,EACzE,MAAO2D,EAAYoF,GAAiBtH,EAAAA,UAAe,IAC5CuH,EAAkCC,GACvCxH,EAAAA,SAAqD,CAAC,GAElDyH,EAAgCzH,EAAAA,aAAkB,CAACqE,EAAYqD,KACnEF,GAAqCG,IAAS,IACzCA,EACH,CAACtD,GAAKqD,KACL,GACF,IAEGE,EAA2B5H,EAAAA,aAAkB,KACjDwH,GAAqCG,GACnChB,OAAOC,KAAKe,GAAWE,QACrB,CAACC,EAAKzD,IACJgD,SAAAA,EAA2BU,SAAS1D,GAChCyD,EACA,IACKA,EACH,CAACzD,KAAKsD,EAAUtD,SAAahD,IAErCsG,IAEH,GACA,CAACN,IAEEW,EAAmBhI,EAAAA,aACtBkC,IACKA,GACF0F,IAEFN,EAAcpF,EAAW,GAE3B,CAAC0F,IAGH,OAAO5H,EAAAA,SACL,KAAM,CACJuH,mCACAE,gCACAO,mBACA9F,gBAEF,CAACqF,EAAkCE,EAA+BO,EAAkB9F,GAExF,C,0BC3CA,MAAM+F,EAA2BA,CAACC,EAAoBxC,KACpD,MAAMyC,EAAiBzC,IAAoBf,EAAoBiB,aA4B/D,MAAO,CACLrC,QA5BmE2E,EAASlE,KAAKoE,IACjF,MAAMC,EAAOD,EAAUE,MAAM,EAAG,GAC1BC,EAAQH,EAAUE,MAAM,EAAG,GAC3BE,EAAaC,OAAOC,SAASH,GAAS,EACtCI,EAAO,IAAIC,KAAKH,OAAOC,SAASL,GAAOG,EAAY,GACzD,MAAO,CACLnE,GAAI+D,EACJnJ,MAAM4J,EAAAA,EAAAA,GAAOF,EAAqB,IAAfH,EAAmB,OAAS,OAC/C3E,MAAOC,EAAAA,GAAWgF,MAClBnK,UAAWW,IFMuB,gEENc,CAC9C,aAAc6I,IAEhBY,mBAAqBC,GAAUb,GAAiBc,EAAAA,EAAAA,GAAqBD,EAAKE,eAAed,IAAc,KACvGe,aAAeH,IAAS,IAAAI,EACtB,MAAMhE,EAA0E,QAArEgE,EAAGJ,EAAKb,EAAiB,iBAAmB,eAAeC,UAAU,IAAAgB,EAAAA,EAAI,KAC9EC,EAA4B,iBAAVjE,EAClBkE,GAAqBlE,QAAAA,EAAS,IAAM,KAAQ+C,EAClD,OACEpF,EAAAA,EAAAA,MAAA,QAAMpE,UAAWW,IAAW,CAAE,gBAAiB+J,IAAYxJ,SAAA,EACxD0J,EAAAA,EAAAA,IAAkBnE,EAAO,CAAEoE,UAAWF,EAAoB,EAAI,EAAGG,aAAc,MAC/EtB,GAAkBkB,EAAW,IAAM,KAC/B,EAGZ,IAKDK,YAAczF,GAA+D+E,IAA2B,IAAAW,EAAA,OACpC,QADoCA,EACtGX,EAAKb,EAAiB,iBAAmB,eAAelE,EAAOI,WAAG,IAAAsF,EAAAA,EAAI,IAAI,EAC7E,EAGGC,EAAmE,GAElE,SAASC,EAAgB3B,EAAoBxC,EAAsCoE,GACxF,OAAO9J,EAAAA,SACL,IACE8J,EACI7B,EAAyBC,EAAUxC,GACnC,CAAEnC,QAASqG,EAAaF,YAAaA,IAAM,IAAM,OACvD,CAACxB,EAAUxC,EAAiBoE,GAEhC,CCOO,SAASC,EAAgBC,GAC9B,GAAKA,EAAIC,MAET,OAAID,EAAIE,KAAOrF,EAAYwB,QAClB,iDAAiD2D,EAAIC,QAGvD,8BAA8BD,EAAIC,OAC3C,CAEO,SAASE,EAAcC,GAC5B,GAAIA,EAAKC,OACP,MAAO,WAAWD,EAAKC,QAG3B,CA0BO,SAASC,EAAuBC,GACrC,MAAO,IAAIA,GAAM/G,MAAK,CAACgH,EAAGC,KAAM,IAAAC,EAAAC,EAAAC,EAAAC,EAC9B,MAAMC,EAAyC,QAA/BJ,EAAQ,QAARC,EAAGH,EAAEO,WAAG,IAAAJ,OAAA,EAALA,EAAOK,EAAER,EAAEO,IAAIC,EAAE5J,OAAS,UAAE,IAAAsJ,EAAAA,EAAI,EAC7CO,EAAyC,QAA/BL,EAAQ,QAARC,EAAGJ,EAAEM,WAAG,IAAAF,OAAA,EAALA,EAAOG,EAAEP,EAAEM,IAAIC,EAAE5J,OAAS,UAAE,IAAAwJ,EAAAA,EAAI,EACnD,OAAIE,IAAeG,EAAmB,EAE/BH,EAAaG,GAAc,EAAI,CAAC,GAE3C,CCrFA,SAASC,EAAO3M,GAMgD,IAN/C,YACf4M,EAAW,aACXC,EAAY,iBACZC,EAAgB,SAChBnD,EAAQ,cACRoD,GACsC/M,EAiDtC,MAhDoB,CAAC4M,KAAgBC,KAAiBC,GACrBrH,KAAI,CAACuH,EAASC,KAAU,IAAAC,EACvD,MAAMC,EAAUJ,EAQZ,GAPApD,EAASlE,KAAK2E,IAAS,IAAAgD,EAAAC,EAAAC,EAAAC,EACrB,MAAMN,EAAuD,QAAlDG,EAAkB,QAAlBC,EAAGL,EAAQA,eAAO,IAAAK,OAAA,EAAfA,EAAiBG,EAAEC,WAAWD,GAAMA,IAAMpD,WAAK,IAAAgD,EAAAA,GAAK,EAClE,MAAO,CACLtD,KAAMM,EAAKsD,WACX7G,MAAgC,QAA3ByG,EAAiB,QAAjBC,EAAEP,EAAQA,eAAO,IAAAO,OAAA,EAAfA,EAAiBd,EAAEQ,UAAM,IAAAK,EAAAA,EAAI,KACrC,IAIDK,EAAqD,GACrDC,EAAoD,CAAC,EACrDjD,EAA0D,CAAC,EAEjE,IAAKoC,EAAe,CAClB,MAAMc,GAAUC,EAAAA,EAAAA,IAAqBX,GACrCA,EAAOY,SAAQC,IAAqB,IAAAC,EAAA,IAApB,KAAEnE,EAAI,MAAEjD,GAAOmH,EAC7B,MAAME,EAAwB,QAAhBD,EAAGJ,EAAQ/D,UAAK,IAAAmE,EAAAA,EAAI,KAClCL,EAAY9D,GAAQjD,EACpB8D,EAAeb,GAAQoE,EAEvBP,EAAkBQ,KAAK,CACrBrE,OACAjD,QACAqH,YACA,GAEN,CAEA,MAAME,EAAgBpB,EAAQlB,SAAWc,EAAYd,OAErD,MAAO,CACL7L,MAAO+M,EAAQlB,OACfhG,GAAIkH,EAAQlB,OACZuC,cAAchO,EAAAA,EAAAA,KAACN,EAAAA,EAAY,CAACE,MAAO+M,EAAQlB,OAAS5L,KAAM0L,EAAcoB,GAAU7M,OAAQiO,IAC1FE,qBAAsB,oBACtBC,qBAAqB,EACrBC,MAAOrG,EAAe8E,EAAQ9E,EAAetF,QAC7CuL,gBACAjF,WAAY6D,EAAQlB,SAAWc,EAAYd,UAAYc,SAAkB,QAAPM,EAAXN,EAAa6B,aAAK,IAAAvB,IAAlBA,EAAoB1D,SAASwD,EAAQlB,SAC5FqB,OAAQQ,EACRC,cACAjD,iBACD,GAIL,CAEO,SAAS+D,EAAMC,GAMZ,IANa,YACrB/B,EAAW,aACXC,EACAC,iBAAkB8B,EAAmB,cACrCrD,EAAa,SACbsD,GACMF,EACN,MAAM,SAAEnI,IAAaE,EAAAA,EAAAA,MACfoC,EAA4BrH,EAAAA,SAChC,IAAOmL,EAAc,CAACA,KAAgBC,GAAcpH,KAAIqJ,IAAA,IAAC,OAAEhD,GAAQgD,EAAA,OAAKhD,QAAAA,EAAU,EAAE,IAAK,IACzF,CAACc,EAAaC,KAEV,iCAAE7D,EAAgC,8BAAEE,EAA6B,WAAEvF,EAAU,iBAAE8F,GACnFZ,EAAuB,CACrBC,8BAEEgE,EAAmBrL,EAAAA,SAAc,IACjCkC,EACKiL,EAEFA,EAAoBrG,QAAOwG,IAAA,IAAC,OAAEjD,GAAQiD,EAAA,OAAKjD,QAAuDhJ,IAA7CkG,EAAiC8C,EAAqB,KACjH,CAAC8C,EAAqB5F,EAAkCrF,IAErDgG,EAAWlI,EAAAA,SAAc,IACT,CAACmL,KAAgBC,KAAiBC,GAEnDkC,SAAQC,IAAA,IAAC,QAAEjC,GAASiC,EAAA,OAAKjC,aAAO,EAAPA,EAASQ,CAAC,IACnCjF,QAAO,CAACuB,EAAMmD,EAAOiC,SAAiBpM,IAATgH,GAAsBoF,EAAIC,QAAQrF,KAAUmD,IACzEhI,MAAK,CAACgH,EAAGC,IAAMD,EAAKC,KACtB,CAACU,EAAaC,EAAcC,IACzBsC,EAAiB3N,EAAAA,SAAc,IAAMkI,EAASlE,KAAK4J,GAAMA,EAAE3B,cAAa,CAAC/D,KACxE2F,EAAaC,GAAkB9N,EAAAA,UAAe,IACnDkL,EAAQ,CAAEE,eAAcD,cAAaE,mBAAkBnD,WAAUoD,eAAe,OAE5E,QAAE/H,EAAO,YAAEmG,GAAgBG,EAAgB8D,EAAgB5I,EAASW,gBAAiBoE,IAGzFd,KAAM+E,EAAU,KAChBvK,EAAI,WACJwK,IACEC,EAAAA,EAAAA,IAAa,CACfjF,KAAM6E,EACNtK,UACA2K,YAAa,CAAEjK,OAAQV,EAAQA,EAAQnC,OAAS,GAAIkD,WAAY,GAChEa,IAAK2E,EAAgB,EAAI,EACzBJ,gBA+BF,OA5BA1J,EAAAA,WAAgB,KACd,IAAK8J,EACH,OAGF,MAAMqE,EAAiBjD,EAAQ,CAC7BE,eACAD,cACAE,mBACAnD,WACAoD,eAAe,IAEjBwC,EACEK,EAAenK,KAAI,CAACgF,EAAMwC,KAAK,IAAA4C,EAAA,MAAM,IAChCpF,EACHtB,WAAqD,QAA3C0G,EAAE7G,EAAiCyB,EAAK3E,WAAG,IAAA+J,EAAAA,EAAI5C,EAAQ,CAACL,KAAgBC,GAAchK,OACjG,IACF,GACA,CACDgK,EACAD,EACAE,EACAnD,EACAX,EACAuC,EACA/E,EAASW,mBAIT3C,EAAAA,EAAAA,MAAA,OAAKpE,UAAU,wCAAuCkB,SAAA,EACpDjB,EAAAA,EAAAA,KAACyP,EAAAA,GAAgB,CACfrF,KAAM+E,EACNO,QAAQ1P,EAAAA,EAAAA,KAACkG,EAA2B,IACpCyJ,WAAW3P,EAAAA,EAAAA,KAAC0E,EAAgB,CAACC,QAASA,EAASC,KAAMA,EAAME,aAAcsK,IACzEzK,QAASA,EACTiL,uBAAwB1E,EACxB2E,cAAc,EACdC,mBAAoBjH,EAA8B5H,UAElDjB,EAAAA,EAAAA,KAAC+P,EAAAA,EAAmB,CAClB3F,KAAM+E,EACN7F,SAAUyF,EACV9H,UAAWd,EAASc,UACpB+I,qBAAqB,QACrBxB,SAAUA,EACVtD,cAAeA,EACf+E,aAAW,EACXC,UAAQ,OAGZlQ,EAAAA,EAAAA,KAACmD,EAAyB,CACxBC,cAAc,iCACdC,cAAc,mCACdE,cAAegL,EAAoB/L,OAAS,EAC5Cc,WAAYA,EACZE,iBAAkB4F,MAI1B,CC5LA,MAAMmD,EAAc,CAClB4D,OAAQ,OACR1E,OAAQ,YACR2E,OAAQ,yBACRC,cAAe,kCACfC,SAAU,iDACVC,cAAe,qBACfC,iBAAkB,qBAClBpC,MAAO,6DACPzB,QAAS,CACPQ,EAAG,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,QAC5Ff,EAAG,CACD,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACnG,UAAW,aAKXI,EAAe,CACnB,CACE2D,OAAQ,KACR1E,OAAQ,mBACR8E,cAAe,qBACfC,iBAAkB,qBAClBpC,MAAO,+DACPzB,QAAS,CACPQ,EAAG,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,QAC5Ff,EAAG,CACD,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SACpG,YAIN,CACE+D,OAAQ,OACR1E,OAAQ,aACR2E,OAAQ,yBACRC,cAAe,2BACfC,SAAU,cACVC,cAAe,qBACfC,iBAAkB,qBAClBpC,MAAO,yEACPzB,QAAS,CACPQ,EAAG,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,QAC5Ff,EAAG,CACD,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SACpG,YAIN,CACE+D,OAAQ,MACR1E,OAAQ,cACR2E,OAAQ,yBACRC,cAAe,YACfC,SAAU,mBACVC,cAAe,qBACfC,iBAAkB,qBAClBpC,MAAO,0EACPzB,QAAS,CACPQ,EAAG,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,QAC5Ff,EAAG,CACD,UAAW,UAAW,UAAW,UAAW,UAAW,SAAU,SAAU,SAAU,SAAU,SAC/F,UAAW,aAIjB,CACE+D,OAAQ,OACR1E,OAAQ,YACR2E,OAAQ,yBACRC,cAAe,kCACfC,SAAU,iDACVC,cAAe,qBACfC,iBAAkB,qBAClBpC,MAAO,sEACPzB,QAAS,CACPQ,EAAG,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,QAC5Ff,EAAG,CAAC,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,WAG3G,CACE+D,OAAQ,OACR1E,OAAQ,WACR2E,OAAQ,yBACRC,cAAe,kCACfC,SAAU,6CACVC,cAAe,qBACfC,iBAAkB,qBAClBpC,MAAO,uEACPzB,QAAS,CACPQ,EAAG,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,QAC5Ff,EAAG,CACD,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SACpG,aAUD,SAASqE,EAAiB9Q,GAAyB,IAAxB,YAAE+Q,GAAoB/Q,EACtD,OACEwE,EAAAA,EAAAA,MAAA,OAAKpE,UAAU,wBAAuBkB,SAAA,EACpCjB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,8BAA6BkB,UAC1CjB,EAAAA,EAAAA,KAACqO,EAAM,CACL9B,YAAaA,EACbC,aAAcA,EACdC,iBAAkBD,EAClBgC,UAAQ,EACRtD,eAAa,OAGjBlL,EAAAA,EAAAA,KAAA,OAAKD,UAAU,oFAAmFkB,UAChGkD,EAAAA,EAAAA,MAAA,OAAKpE,UAAU,uDAAsDkB,SAAA,EACnEkD,EAAAA,EAAAA,MAACsC,EAAAA,GAAO,CAACC,MAAO,EAAEzF,SAAA,CAAC,wBAAsByP,MACzCvM,EAAAA,EAAAA,MAACwM,EAAAA,GAAS,CAAA1P,SAAA,CAAC,2DACgD,KACzDjB,EAAAA,EAAAA,KAAA,UAAAiB,SAAQ,4DAAgE,sIAOpF,C,+DC5HO,SAAS2P,IACd,MAAM,SAAEzK,EAAQ,YAAEC,IAAgBC,EAAAA,EAAAA,MAE5BC,EAAgBA,CAACC,EAA4BC,KACjDJ,EAAY,IACPD,EACH,CAACI,GAAMC,GACP,EAGJ,OACErC,EAAAA,EAAAA,MAAA,OAAKpE,UAAU,oCAAmCkB,SAAA,EAChDjB,EAAAA,EAAAA,KAACyG,EAAAA,GAAO,CAACC,MAAO,EAAG3G,UAAU,aAAYkB,SAAC,gCAG1CkD,EAAAA,EAAAA,MAAA,OAAKpE,UAAU,8BAA6BkB,SAAA,EAC1CjB,EAAAA,EAAAA,KAAC2G,EAAAA,EAAU,CAACpG,KAAK,QAAQX,MAAM,WAAUqB,SACtC,CAACgF,EAAYyB,IAAKzB,EAAYwB,SAASrC,KAAKmB,IAC3CvG,EAAAA,EAAAA,KAAC4G,EAAAA,EAAgB,CAEfC,OAAQV,EAASqB,aAAa2B,SAAS5C,GACvCvF,QAASA,KACP,MAAM6P,EAAM1K,EAASqB,aAAa2B,SAAS5C,GAC3CD,EAAc,eAAgB,IACzBH,EAASqB,aAAaU,QAAQ4I,GAAaA,IAAavK,OACvDsK,EAAM,GAAK,CAACtK,IAChB,EACFtF,SAEDqH,EAAkB/B,IAVdA,QAeXvG,EAAAA,EAAAA,KAAC2G,EAAAA,EAAU,CAACpG,KAAK,QAAQX,MAAM,WAAUqB,SACtC,CAAC+E,EAAU6B,GAAI7B,EAAU4B,IAAIxC,KAAKmB,IACjCvG,EAAAA,EAAAA,KAAC4G,EAAAA,EAAgB,CAEfC,OAAQV,EAASwB,WAAWwB,SAAS5C,GACrCvF,QAASA,KACP,MAAM6P,EAAM1K,EAASwB,WAAWwB,SAAS5C,GACzCD,EAAc,aAAc,IACvBH,EAASwB,WAAWO,QAAQ4I,GAAaA,IAAavK,OACrDsK,EAAM,GAAK,CAACtK,IAChB,EACFtF,SAEDsH,EAAgBhC,IAVZA,QAeXpC,EAAAA,EAAAA,MAACwC,EAAAA,EAAU,CAACpG,KAAK,QAAQX,MAAM,OAAMqB,SAAA,EACnCjB,EAAAA,EAAAA,KAAC4G,EAAAA,EAAgB,CACfC,OAAQV,EAASW,kBAAoBf,EAAoBgB,OACzD/F,QAASA,KACPsF,EAAc,kBAAmBP,EAAoBgB,OAAO,EAC5D9F,SACH,SAGDjB,EAAAA,EAAAA,KAAC4G,EAAAA,EAAgB,CACfC,OAAQV,EAASW,kBAAoBf,EAAoBiB,aACzDhG,QAASA,KACPsF,EAAc,kBAAmBP,EAAoBiB,aAAa,EAClE/F,SACH,qBAKHkD,EAAAA,EAAAA,MAACwC,EAAAA,EAAU,CAACpG,KAAK,QAAQX,MAAM,QAAOqB,SAAA,EACpCjB,EAAAA,EAAAA,KAAC4G,EAAAA,EAAgB,CACfC,OAAQV,EAASc,YAAcC,EAAAA,GAAKC,KACpC3C,YAAY,WACZjE,KAAK,OACLR,UAAU,UACViB,QAASA,KACPsF,EAAc,YAAaY,EAAAA,GAAKC,KAAK,KAGzCnH,EAAAA,EAAAA,KAAC4G,EAAAA,EAAgB,CACfC,OAAQV,EAASc,YAAcC,EAAAA,GAAKE,MACpC5C,YAAY,gBACZjE,KAAK,OACLR,UAAU,UACViB,QAASA,KACPsF,EAAc,YAAaY,EAAAA,GAAKE,MAAM,YAOpD,CC/EA,SAASkF,EAAO3M,GAMuB,IANtB,OACf8L,EAAM,kBACNsF,EAAiB,mBACjBC,EAAkB,SAClB1H,EAAQ,cACRoD,GACa/M,EACb,OAAOoR,EAAkB3L,KAAI,CAACgG,EAAKwB,KAAU,IAAAqE,EAAAC,EAC3C,MAAMC,EAAqB,QAAdF,EAAG7F,EAAI+F,eAAO,IAAAF,EAAAA,EAAI,MACzBG,EAAgBhG,EAAIE,GAAKhD,EAAkB8C,EAAIE,IAAM,MACrD+F,EAAWjG,EAAIkG,IAAM/I,EAAgB6C,EAAIkG,KAAO,MAChDxE,EAAUJ,EAQZ,GAPApD,EAASlE,KAAK2E,IAAS,IAAAwH,EAAAC,EAAAC,EAAAC,EACrB,MAAM9E,EAA+C,QAA1C2E,EAAU,QAAVC,EAAGpG,EAAIe,WAAG,IAAAqF,OAAA,EAAPA,EAASrE,EAAEC,WAAWD,GAAMA,IAAMpD,WAAK,IAAAwH,EAAAA,GAAK,EAC1D,MAAO,CACL9H,KAAMM,EAAKsD,WACX7G,MAAwB,QAAnBiL,EAAS,QAATC,EAAEtG,EAAIe,WAAG,IAAAuF,OAAA,EAAPA,EAAStF,EAAEQ,UAAM,IAAA6E,EAAAA,EAAI,KAC7B,IAIDnE,EAAqD,GACrDC,EAAoD,CAAC,EACrDjD,EAA0D,CAAC,EAEjE,IAAKoC,EAAe,CAClB,MAAMc,GAAUC,EAAAA,EAAAA,IAAqBX,GACrCA,EAAOY,SAAQC,IAAqB,IAAAC,EAAA,IAApB,KAAEnE,EAAI,MAAEjD,GAAOmH,EAC7B,MAAME,EAAwB,QAAhBD,EAAGJ,EAAQ/D,UAAK,IAAAmE,EAAAA,EAAI,KAClCL,EAAY9D,GAAQjD,EACpB8D,EAAeb,GAAQoE,EAEvBP,EAAkBQ,KAAK,CACrBrE,OACAjD,QACAqH,YACA,GAEN,CAEA,MAAME,EAAgB3C,EAAIK,SAAWA,EAErC,MAAO,CACLhG,GAAI2F,EAAI3F,GACR7F,MAAO,CAACuR,EAASC,EAAeC,GAAUM,KAAK,OAC/C1D,qBAAsB,oBACtBC,qBAAqB,EACrBF,cACE7J,EAAAA,EAAAA,MAAA,OAAKpE,UAAU,sDAAqDkB,SAAA,EAClEjB,EAAAA,EAAAA,KAACN,EAAAA,EAAY,CAACE,MAAOuR,EAAStR,KAAMsL,EAAgBC,GAAMtL,OAAQiO,KAClE/N,EAAAA,EAAAA,KAAC4R,EAAAA,GAAG,CAACrR,KAAK,QAAOU,SAAEmQ,IAAoB,KAACpR,EAAAA,EAAAA,KAAC4R,EAAAA,GAAG,CAACrR,KAAK,QAAOU,SAAEoQ,OAG/DtD,gBACAuD,IAAKlG,EAAIkG,IACThG,GAAIF,EAAIE,GACR6C,MAAOrG,EAAe8E,EAAQ9E,EAAetF,QAC7CsG,WAAwC,QAA9BoI,EAAEF,aAAkB,EAAlBA,EAAqB5F,EAAI3F,WAAG,IAAAyL,EAAAA,EAAItE,EAAQtF,EACpDwF,OAAQQ,EACRC,cACAjD,iBACD,GAEL,CAUO,SAASuH,EAAIvD,GAAyE,IAAxE,WAAEwD,EAAU,SAAEC,EAAQ,aAAEC,EAAY,cAAE9G,EAAa,SAAEsD,GAAiBF,EACzF,MAAM,SAAEnI,IAAaE,EAAAA,EAAAA,OACf,OAAEoF,EAAM,SAAEnC,EAAQ,eAAEyF,GAAmB3N,EAAAA,SAAc,KAAM,IAAA6Q,EAAAC,EAAAC,EAAAC,EAC/D,MAAM3G,EAA+B,QAAzBwG,EAAGH,aAAU,EAAVA,EAAa,GAAGrG,cAAM,IAAAwG,EAAAA,EAAI,KACnCI,EAA0D,QAA3CH,EAAGJ,aAAU,EAAVA,EAAYnD,SAAQF,IAAA,IAAC,IAAEtC,GAAKsC,EAAA,OAAKtC,aAAG,EAAHA,EAAKgB,CAAC,WAAC,IAAA+E,EAAAA,EAAI,GAC9DI,EAAsD,QAAzCH,EAAGJ,aAAQ,EAARA,EAAUpD,SAAQD,IAAA,IAAC,IAAEvC,GAAKuC,EAAA,OAAKvC,aAAG,EAAHA,EAAKgB,CAAC,WAAC,IAAAgF,EAAAA,EAAI,GAC1DI,EAA8D,QAA7CH,EAAGJ,aAAY,EAAZA,EAAcrD,SAAQC,IAAA,IAAC,IAAEzC,GAAKyC,EAAA,OAAKzC,aAAG,EAAHA,EAAKgB,CAAC,WAAC,IAAAiF,EAAAA,EAAI,GAElE9I,EACJ,IAAI,IAAIkJ,IAAI,IAAIH,KAAoBC,KAAkBC,KAAqBrK,OAAOuK,SAClF7N,MAAK,CAACgH,EAAGC,IAAMD,EAAIC,IAErB,MAAO,CACLvC,WACAyF,eAAgBzF,EAASlE,KAAK4J,GAAMA,EAAE3B,aACtC5B,SACD,GACA,CAACqG,EAAYC,EAAUC,IAEpBjB,EAAoB3P,EAAAA,SACxB,IJ5BG,SAA6BqN,GAMN,IANO,WACnCqD,EAAU,SACVC,EAAQ,aACRC,EAAY,aACZxK,EAAY,WACZG,GAC0B8G,EAC1B,OAA0B,IAAtBqD,EAAWtP,OACN,GAGF,CAACsP,EAAYC,EAAUC,GAC3BU,OACAxK,QAAQkD,GAAQ5D,EAAa2B,SAASiC,EAAIE,KAAQ3D,EAAWwB,SAASiC,EAAIkG,MAC/E,CIeMqB,CAAqB,CACnBb,aACAC,WACAC,eACAxK,aAAcrB,EAASqB,aACvBG,WAAYxB,EAASwB,cAEzB,CAACmK,EAAYC,EAAUC,EAAc7L,EAASwB,WAAYxB,EAASqB,eAE/DiB,EAA4BrH,EAAAA,SAChC,IAAM2P,EAAkBrH,MAAM,EAAGpC,GAA0BlC,KAAIwN,IAAA,IAAC,GAAEnN,GAAImN,EAAA,OAAKnN,CAAE,KAC7E,CAACsL,KAEG,iCAAEpI,EAAgC,8BAAEE,EAA6B,WAAEvF,EAAU,iBAAE8F,GACnFZ,EAAuB,CAAEC,+BACpBwG,EAAaC,GAAkB9N,EAAAA,UAAe,IACnDkL,EAAQ,CACNb,SACAsF,kBAAmBA,EAAkBrH,MAAM,EAAGpC,GAC9CgC,WACAoD,eAAe,OAGb,QAAE/H,EAAO,YAAEmG,GAAgBG,EAAgB8D,EAAgB5I,EAASW,gBAAiBoE,IAGzFd,KAAM+E,EAAU,KAChBvK,EAAI,WACJwK,IACEC,EAAAA,EAAAA,IAAa,CACfjF,KAAM6E,EACNtK,UACA2K,YAAa,CAAEjK,OAAQV,EAAQA,EAAQnC,OAAS,GAAIkD,WAAY,GAChEa,IAAK2E,EAAgB,EAAI,EACzBJ,gBAGF1J,EAAAA,WAAgB,KACd,IAAK8J,EACH,OAGF,MAAMqE,EAAiBjD,EAAQ,CAC7Bb,SACAsF,kBAAmBA,EAAkB7I,QACnC,CAAA2K,EAASjG,KAAK,IAAb,GAAEnH,GAAIoN,EAAA,OACLvP,GAAcsJ,EAAQtF,QAAqE7E,IAAzCkG,EAAiClD,EAAiB,IAExG6D,WACA0H,mBAAoBrI,EACpB+D,eAAe,IAGjBwC,EAAeK,EAAe,GAC7B,CAAC9D,EAAQsF,EAAmBpI,EAAkCW,EAAUhG,EAAY4H,IAEvF,MAAM4H,EAAiC,IAAvB7D,EAAYzM,OAE5B,OACE2B,EAAAA,EAAAA,MAAA,OAAKpE,UAAU,wCAAuCkB,SAAA,EACpDjB,EAAAA,EAAAA,KAACyP,EAAAA,GAAgB,CACfrF,KAAM+E,EACNO,QAAQ1P,EAAAA,EAAAA,KAAC4Q,EAAwB,IACjCjB,UACEmD,OAAUrQ,GACRzC,EAAAA,EAAAA,KAAC0E,EAAgB,CACfG,0BAA0B,OAC1BF,QAASA,EACTC,KAAMA,EACNE,aAAcsK,IAIpBzK,QAASA,EACTiL,uBAAwB1E,EACxB4E,mBAAoBjH,EAA8B5H,UAElDjB,EAAAA,EAAAA,KAAC+P,EAAAA,EAAmB,CAClB3F,KAAM+E,EACN7F,SAAUyF,EACV9H,UAAWd,EAASc,UACpB+I,qBAAqB,QACrB+C,cACE5O,EAAAA,EAAAA,MAAAM,EAAAA,SAAA,CAAAxD,SAAA,CAAE,2BAEAjB,EAAAA,EAAAA,KAAA,SAAM,2CAIV8S,QAASA,EACTtE,SAAUA,EACVtD,cAAeA,EACf+E,aAAW,EACXC,UAAQ,OAGV4C,IACA9S,EAAAA,EAAAA,KAACmD,EAAyB,CACxBC,cAAc,8BACdC,cAAc,gCACdE,cAAewN,EAAkBvO,OAAS8E,EAC1ChE,WAAYA,EACZE,iBAAkB4F,MAK5B,CCvNA,MAAM4J,EAAqC,6BAE5B,SAASC,EAAmBtT,GAAgD,IAA/C,OAAE8L,EAAM,YAAEyH,EAAW,cAAEC,GAAsBxT,EACvF,MAAMyT,EAAqBhS,EAAAA,aAAkBuM,IAAkC,IAAA0F,EAAAC,EAAA,IAAjC,MAAE9M,GAA0BmH,EACxE,MAAM4F,EAA2F,QAAtEF,EAAGpR,SAASuR,uBAAuBR,UAAmC,IAAAK,OAAA,EAAnEA,EAAsE,GAC9FI,EACJ5J,OAAOjI,WAAWkB,OAAOjB,iBAAiBI,SAASyR,MAAMC,iBAAiB,wBAA0B,EAChGC,EAAU3R,SAAS4R,eAAerN,GAClCsN,EAAyD,QAAvCR,EAAGM,aAAO,EAAPA,EAAS5R,wBAAwBF,WAAG,IAAAwR,EAAAA,EAAI,EACnExQ,OAAOmB,SAAS,CACd8P,KAAM,EACNjS,IAAKgB,OAAOoB,QAAU4P,EAAqBP,EAAsBS,aAAeP,EAAqB,EACrGQ,SAAU,UACV,GACD,IAEH,OACEjU,EAAAA,EAAAA,KAAA,OAAKD,UAAU,QAAOkB,UACpBjB,EAAAA,EAAAA,KAACkU,EAAAA,GAAM,CACL1N,MAAOiF,EACPhL,MAAM,OACNV,UAAU,WACVoU,aAAa,oBACb5T,KAAK,UACL6T,WAAW,EACXjU,cAAcH,EAAAA,EAAAA,KAACI,EAAAA,GAAI,CAACC,KAAK,cAAcC,MAAO,KAC9C+T,MAAOnB,EACPC,cAAeA,EACfmB,SAAUlB,KAIlB,C,eC5Be,SAASmB,EAAa5U,GAA6D,IAA5D,cAAE6U,EAAa,OAAEpE,EAAM,UAAEqE,EAAS,cAAEC,GAAsB/U,EAC9F,MAAM,UAAEwB,EAAS,SAAEE,IAAaH,EAAAA,EAAAA,KAE1ByT,EAAgBvT,EAAAA,SAAc,KAClC,MAAMwT,EAAkBF,EAAcA,EAAclS,OAAS,GACvDqS,EAAkBH,EAAcA,EAAclS,OAAS,GACvDsS,EACuB,iBAApBF,GAA2D,iBAApBC,GACxCD,EAAkBC,GAAmBE,KAAKC,IAAIH,GAAoB,IACpE,KAEN,MAAO,CACL,CAAEjV,MAAO,SAAU4G,MAAOgO,GAC1B,CACE5U,MAAO,oBACP4G,MAAO,IAAGmE,EAAAA,EAAAA,IAAkBiK,EAAiB,CAAEhK,UAAW,OAAmC,OAA3BkK,EAAkC,KAAInK,EAAAA,EAAAA,IAAkBmK,EAAwB,CAAElK,UAAW,EAAGqK,cAAc,QAAc,MAGhM,CAAErV,MAAO,SAAU4G,MAAO4J,GAAU,KACpC,CAAExQ,MAAO,aAAc4G,MAAOiO,GAAa,MAC3CrP,KAAI,CAAAuI,EAAmBf,KAAK,IAAvB,MAAEhN,EAAK,MAAE4G,GAAOmH,EAAA,OACrBxJ,EAAAA,EAAAA,MAAA,OAAKpE,UAAU,uBAAsBkB,SAAA,CACxB,IAAV2L,GAAexL,EAAAA,eAAqBoF,GACnCA,GAEAxG,EAAAA,EAAAA,KAACyG,EAAAA,GAAO,CAACC,MAAO,EAAG3G,UAAU,GAAEkB,SAC5BuF,KAGLxG,EAAAA,EAAAA,KAAA,QAAMD,UAAU,gCAA+BkB,SAAErB,MARR,GAAGA,KAAS4G,IASjD,GACN,GACD,CAACgO,EAAeE,EAAetE,EAAQqE,IAE1C,OACEtQ,EAAAA,EAAAA,MAAA,OAAKpE,UAAU,+DAA+DqE,IAAKjD,EAAUF,SAAA,EAC3FjB,EAAAA,EAAAA,KAAA,OACED,UAAWmV,IAAW,oEAAqE,CACzF,8CAA+C7T,EAC/C,aAAcA,OAGlBrB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,gEAA+DkB,UAC5EjB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,8BAA6BkB,SAAE0T,QAItD,CC5CO,SAASQ,EAAoBxV,GAA8C,IAAAyV,EAAAC,EAAA,IAA7C,kBAAEC,EAAiB,OAAE7J,EAAM,MAAEmB,GAAcjN,EAC9E,MAAM,oCAAE4V,IAAwCC,EAAAA,EAAAA,MAC1C1D,EAAa1Q,EAAAA,SACjB,IAAMsK,EAAuB4J,EAAkBG,cAAcvN,QAAQkD,GAAQA,EAAIK,SAAWA,MAC5F,CAAC6J,EAAmB7J,KAEf+C,EAAUkH,GAAetU,EAAAA,UAAe,IACxC8J,EAAeyK,GAAoBvU,EAAAA,UAAe,IACnD,YAAEmL,EAAW,aAAEC,EAAY,iBAAEC,EAAgB,SAAEsF,EAAQ,aAAEC,GAAiB5Q,EAAAA,SAAc,KAC5F,MAAMoL,EAAoC,GACpCC,EAAwC,GAExCF,EAAc+I,EAAkBM,kBAAkBC,MAAMlJ,GAAYA,EAAQlB,SAAWA,IAE7F6J,SAAAA,EAAmBM,kBAAkBlI,SAASf,IAAY,IAAAE,EACpDF,EAAQlB,SAAWA,IAEK,QAArBoB,EAAIN,EAAY6B,aAAK,IAAAvB,GAAjBA,EAAmB1D,SAASwD,EAAQlB,QAC7Ce,EAAasB,KAAKnB,GAElBJ,EAAYgE,eACZhE,EAAYiE,kBACZjE,EAAYgE,gBAAkB5D,EAAQ4D,eACtChE,EAAYiE,mBAAqB7D,EAAQ6D,kBAEzC/D,EAAiBqB,KAAKnB,GACxB,IAGF,MAAMoF,EAAWrG,EACf4J,EAAkBG,cAAcvN,QAAQkD,GAAQoB,EAAasJ,MAAMnJ,GAAYvB,EAAIK,SAAWkB,EAAQlB,YAElGuG,EAAetG,EACnB4J,EAAkBG,cAAcvN,QAAQkD,GAAQqB,EAAiBqJ,MAAMnJ,GAAYvB,EAAIK,SAAWkB,EAAQlB,YAG5G,MAAO,CACLc,cACAC,eACAC,mBACAsF,WACAC,eACD,GACA,CAACsD,EAAmB7J,IAEjByH,EAAc9R,EAAAA,SAClB,IACEkU,EAAkBM,kBACf1N,QAAOyF,IAAA,IAAC,OAAEwC,EAAM,OAAE1E,GAAQkC,EAAA,OAAKlC,GAAU0E,IAAW5D,EAAY4D,MAAM,IACtE/K,KAAIkJ,IAAA,IAAC,OAAE7C,GAAQ6C,EAAA,MAAM,CAAE9H,MAAOiF,EAAS7L,MAAO6L,EAAS,KAC5D,CAAC6J,EAAkBM,kBAAmBrJ,EAAY4D,SAiBpD,OAdA/O,EAAAA,WAAgB,KACVoN,IAAatD,GACfyK,GAAiB,EACnB,GACC,CAACzK,EAAesD,IAEnBpN,EAAAA,WAAgB,KACd,MAAM2U,EAAaR,EAAoC9J,EAAQiK,GAE/D,MAAO,KACLK,SAAAA,GAAc,CACf,GACA,CAACtK,EAAQ8J,KAGVpR,EAAAA,EAAAA,MAAA,OAAKsB,GAAIgG,EAAOxK,SAAA,CACb2L,EAAQ,IAAK5M,EAAAA,EAAAA,KAAA,OAAKD,UAAU,oDAC7BC,EAAAA,EAAAA,KAACuU,EAAa,CACZC,cACEtB,EAAY1Q,OAAS,GACnBxC,EAAAA,EAAAA,KAACiT,EAAmB,CAACxH,OAAQA,EAAQyH,YAAaA,EAAaC,cAAe3E,IAE9E/C,EAGJ2E,OAAQ7D,EAAYgE,cACpBkE,UAAWlI,EAAYiE,iBACvBkE,cAAqC,QAAxBU,EAAqB,QAArBC,EAAE9I,EAAYI,eAAO,IAAA0I,OAAA,EAAnBA,EAAqBjJ,SAAC,IAAAgJ,EAAAA,EAAI,MAG3CpV,EAAAA,EAAAA,KAACqO,EAAM,CACL9B,YAAaA,EACbC,aAAcA,EACdC,iBAAkBA,EAClBvB,cAAeA,EACfsD,SAAUA,IAGXsD,EAAWtP,OAAS,IACnBxC,EAAAA,EAAAA,KAAC6R,EAAI,CACHC,WAAYA,EACZC,SAAUA,EACVC,aAAcA,EACd9G,cAAeA,EACfsD,SAAUA,MAKpB,CC3GA,SAASwH,KACP,MAAM,YAAErT,IAAgBP,EAAAA,EAAAA,MAClB,KAAEgI,IAAS6L,EAAAA,EAAAA,MAEXC,EAAa9U,EAAAA,SAAwC,IACpDgJ,ERRF,SAAkCA,GAA6C,IAAA+L,EAAAC,EACpF,MAAM,WAAEC,EAAU,kBAAET,EAAiB,cAAEH,EAAa,YAAE/E,EAAW,eAAE4F,GAAmBlM,EAEtF,MAAO,CACLkM,iBACA5F,cACA2F,WAAkG,QAAxFF,EAAgF,QAAhFC,EAAER,EAAkBC,MAAKlW,IAAA,IAAC,OAAE8L,GAAQ9L,EAAA,OAAK8L,IAAU4K,aAAU,EAAVA,EAAYlN,SAASsC,GAAQ,eAAA2K,OAAA,EAA9EA,EAAgF3K,cAAM,IAAA0K,EAAAA,EAAI,KACtGP,kBAAmBA,EAAkBxQ,KAAIuI,IAAA,IAAC,YAAE4I,KAAgB/K,GAAMmC,EAAA,MAAM,IACnEnC,EACHmB,QAAS4J,EAAcC,KAAKC,MAAMF,GAAe,KAClD,IACDd,cAAeA,EAAcrQ,KAAIkJ,IAA0B,IAAAoI,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,IAAzB,QAAEC,KAAYvL,GAAM8C,EAChDgD,EAAwB,KACxBhG,EAAyB,KAY7B,OAXY,QAARoL,EAAAlL,EAAK8F,WAAG,IAAAoF,OAAA,EAARA,EAAUM,iBAAkBhR,EAAU6B,GACxCyJ,EAAMtL,EAAU6B,IACC,QAAR8O,EAAAnL,EAAK8F,WAAG,IAAAqF,OAAA,EAARA,EAAUK,iBAAkBhR,EAAU4B,KAC/C0J,EAAMtL,EAAU4B,KAEP,QAAPgP,EAAApL,EAAKF,UAAE,IAAAsL,OAAA,EAAPA,EAASI,iBAAkB/Q,EAAYyB,IACzC4D,EAAKrF,EAAYyB,KACD,QAAPmP,EAAArL,EAAKF,UAAE,IAAAuL,OAAA,EAAPA,EAASG,iBAAkB/Q,EAAYwB,UAChD6D,EAAKrF,EAAYwB,SAGZ,IACF+D,EACH2F,QAAqB,QAAd2F,EAAEtL,EAAK2F,eAAO,IAAA2F,EAAAA,EAAI,MACzBrR,GAAI,GAAG+F,EAAKC,UAAUD,EAAK2F,WAAW3F,EAAKH,SAASG,EAAKF,MAAME,EAAK8F,MACpEhG,KACAgG,MACAnF,IAAK4K,EAAUP,KAAKC,MAAMM,GAAW,KACtC,IAGP,CQzBWE,CAAyB7M,GAFd,MAGjB,CAACA,IAEE8M,EAA0B9V,EAAAA,SAAc,IACvC8U,ERuBF,SAA0CA,GAC/C,MAAMgB,EAA0BhB,EAAWN,kBAAkB1N,QAC1DiP,GACCA,EAAiB1L,QACjByK,EAAWI,eAAeR,MAAM3F,IAAM,IAAAiH,EAAA,OAAKjH,EAAO6G,iBAAyC,QAA5BI,EAAKD,EAAiBhH,cAAM,IAAAiH,OAAA,EAAvBA,EAAyBJ,cAAc,MAW/G,OATAE,EAAwBtS,MAAK,CAACgH,EAAGC,KAAM,IAAAwL,EAAAC,EAAAC,EAAAC,EACrC,GAAI5L,EAAEH,UAAWyK,aAAU,EAAVA,EAAYG,YAAY,OAAQ,EACjD,GAAIxK,EAAEJ,UAAWyK,aAAU,EAAVA,EAAYG,YAAY,OAAO,EAChD,MAAMnK,EAAiD,QAAvCmL,EAAY,QAAZC,EAAG1L,EAAEe,eAAO,IAAA2K,OAAA,EAATA,EAAWlL,EAAER,EAAEe,QAAQP,EAAE5J,OAAS,UAAE,IAAA6U,EAAAA,EAAI,EACrDhL,EAAiD,QAAvCkL,EAAY,QAAZC,EAAG3L,EAAEc,eAAO,IAAA6K,OAAA,EAATA,EAAWpL,EAAEP,EAAEc,QAAQP,EAAE5J,OAAS,UAAE,IAAA+U,EAAAA,EAAI,EAC3D,OAAIrL,IAAeG,EAAmB,EAE/BH,EAAaG,GAAc,EAAI,CAAC,IAElC6K,CACT,CQrCWO,CAAiCvB,GAFhB,IAGvB,CAACA,IAO0C,IAAAwB,EAA9C,OALAtW,EAAAA,WAAgB,KAAM,IAAAuW,EAEW,QAA/BA,EAAA1V,SAAS4R,eAAe,eAAO,IAAA8D,GAA/BA,EAAiCC,MAAMC,eAAe,aAAa,GAClE,IAEEzN,GAAsC,IAA9BA,EAAKqL,cAAcjT,QAK9BxC,EAAAA,EAAAA,KAAC8X,EAAAA,GAAmC,CAAA7W,UAClCjB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,0BAA0B6X,MAAO,CAAEG,SAAUhD,KAAKiD,IAAIrV,EAAa,OAAQ1B,SACvFiW,EAAwB9R,KAAI,CAAC+R,EAAkBvK,KAC9C5M,EAAAA,EAAAA,KAACmV,EAAoB,CAEnBG,kBAAmBY,EACnBzK,OAAQ0L,EAAiB1L,OACzBmB,MAAOA,GAHFuK,EAAiB1L,eARvBzL,EAAAA,EAAAA,KAACyQ,EAAiB,CAACC,YAAoC,QAAzBgH,EAAExB,aAAU,EAAVA,EAAYxF,mBAAW,IAAAgH,EAAAA,EAAI,IAiBtE,CAEe,SAASO,KACtB,OACEjY,EAAAA,EAAAA,KAACkY,EAAAA,GAA8B,CAACC,gBAAiB5Q,EAAkB6Q,UAAW/Q,EAAWpG,UACvFjB,EAAAA,EAAAA,KAACgW,GAAgB,KAGvB,C,uECzCO,MAAMqC,EAA8BjX,EAAAA,cAAsD,CAC/FkX,gCAAiC,CAAE/W,QAAS,CAAC,GAC7CgU,oCAAqCA,IAAM,OAOtC,SAASC,IACd,OAAOpU,EAAAA,WAAiBiX,EAC1B,CASO,MAAMP,EAAsCnY,IAA4D,IAA3D,SAAEsB,GAAoDtB,EACxG,MAAM2Y,EAAkClX,EAAAA,OAAwC,CAAC,GAC3EmX,EAA0BnX,EAAAA,OAC9B,IAAIoX,sBAAsBC,IACxBA,EAAQ/K,SAASgL,IACf,MAAMC,EAAWL,EAAgC/W,QAAQmX,EAAM/X,OAAO8E,IACtEkT,SAAAA,EAAWD,EAAME,eAAe,GAChC,KAINxX,EAAAA,WACE,IAAM,KACJmX,EAAwBhX,QAAQsX,YAAY,GAE9C,IAGF,MAAMtD,EAAsCnU,EAAAA,aAC1C,CAAC0X,EAAmBH,KAClB,MAAM/E,EAAU3R,SAAS4R,eAAeiF,GACxC,OAAKlF,GAGL2E,EAAwBhX,QAAQwX,QAAQnF,GACxC0E,EAAgC/W,QAAQuX,GAAaH,EAE9C,KACLJ,EAAwBhX,QAAQyX,UAAUpF,UACnC0E,EAAgC/W,QAAQuX,EAAU,GAPlD,IAQR,GAEH,IAGF,OACE9Y,EAAAA,EAAAA,KAACqY,EAA4BY,SAAQ,CACnCzS,MAAO,CAAE8R,kCAAiC/C,uCAAsCtU,SAE/EA,GACoC,C","sources":["webpack://@finviz/website/./js/main/components/external-link/external-link.tsx","webpack://@finviz/website/./js/main/hooks/use-sticky-shadow.ts","webpack://@finviz/website/./js/main/hooks/use-window-size.tsx","webpack://@finviz/website/./js/main/modules/traffic/TrafficTableBottomContent.tsx","webpack://@finviz/website/./js/main/modules/traffic/TrafficTableHead.tsx","webpack://@finviz/website/./js/main/modules/traffic/types.ts","webpack://@finviz/website/./js/main/modules/traffic/WidgetDomainSettingsSection.tsx","webpack://@finviz/website/./js/main/modules/traffic/constants.ts","webpack://@finviz/website/./js/main/modules/traffic/useMonthlyDataControls.ts","webpack://@finviz/website/./js/main/modules/traffic/useTableColumns.tsx","webpack://@finviz/website/./js/main/modules/traffic/utils.ts","webpack://@finviz/website/./js/main/modules/traffic/Domain.tsx","webpack://@finviz/website/./js/main/modules/traffic/NoDataPlaceholder.tsx","webpack://@finviz/website/./js/main/modules/traffic/WidgetAppSettingsSection.tsx","webpack://@finviz/website/./js/main/modules/traffic/Apps.tsx","webpack://@finviz/website/./js/main/modules/traffic/TrafficDomainSelect.tsx","webpack://@finviz/website/./js/main/modules/traffic/TrafficHeader.tsx","webpack://@finviz/website/./js/main/modules/traffic/TrafficDomainSection.tsx","webpack://@finviz/website/./js/main/modules/traffic/index.tsx","webpack://@finviz/website/./js/main/services/IntersectionObserverContext.tsx"],"sourcesContent":["import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { Button, Icon } from '..'\r\n\r\ninterface Props {\r\n label?: string\r\n href: string | undefined\r\n isBold?: boolean\r\n className?: string\r\n}\r\n\r\nexport function ExternalLink({ label, href, isBold, className }: Props) {\r\n return (\r\n }\r\n size=\"none\"\r\n padding=\"xxsmall\"\r\n theme=\"linkText\"\r\n className={classnames('inline-flex text-2xs leading-none', className)}\r\n target=\"_blank\"\r\n rel=\"nofollow\"\r\n href={href}\r\n onMouseDown={(event: React.MouseEvent) => event.stopPropagation()}\r\n onClick={(event: React.MouseEvent) => event.stopPropagation()}\r\n >\r\n {label && {label}}\r\n \r\n )\r\n}\r\n","import throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\nexport function useStickyShadow() {\r\n const stickyRef = React.useRef(null)\r\n const [isSticky, setIsSticky] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n if (!stickyRef.current) return\r\n\r\n const onScroll = throttle(function () {\r\n const stickyElement = stickyRef.current\r\n if (!stickyElement) return\r\n\r\n const elementStickyTopOffset = parseFloat(getComputedStyle(stickyElement).top)\r\n const elementCurrentTopOffset = stickyElement.getBoundingClientRect().top\r\n\r\n setIsSticky(elementCurrentTopOffset === elementStickyTopOffset)\r\n }, 100)\r\n\r\n onScroll()\r\n document.addEventListener('scroll', onScroll)\r\n\r\n return () => {\r\n document.removeEventListener('scroll', onScroll)\r\n }\r\n }, [])\r\n\r\n return React.useMemo(\r\n () => ({\r\n stickyRef,\r\n isSticky,\r\n }),\r\n [isSticky]\r\n )\r\n}\r\n","import throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\ninterface Props {\r\n throttleWaitInMs?: number\r\n isWatching?: boolean\r\n}\r\n\r\nexport function useWindowSize({ throttleWaitInMs = 300, isWatching = true }: Props = {}) {\r\n const [size, setSize] = React.useState({\r\n clientWidth: document.documentElement.clientWidth,\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!isWatching) return\r\n\r\n const handleResize = throttle(() => {\r\n setSize({\r\n clientWidth: document.documentElement.clientWidth,\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n }, throttleWaitInMs)\r\n\r\n window.addEventListener('resize', handleResize)\r\n\r\n return () => {\r\n handleResize.cancel()\r\n window.removeEventListener('resize', handleResize)\r\n }\r\n }, [throttleWaitInMs, isWatching])\r\n\r\n return size\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, Icon } from '../../components'\r\nimport { usePrevious } from '../../hooks/use-previous'\r\n\r\ninterface Props {\r\n showMoreLabel: string\r\n showLessLabel: string\r\n isShowMore: boolean\r\n hasHiddenRows: boolean\r\n onShowMoreToggle: (isShowMore: boolean) => void\r\n}\r\n\r\n// Rating relevancy is going to be done in some follow up\r\nconst TEMP_HIDDEN_RATE_RELEVANCY = true\r\n\r\nexport function TrafficTableBottomContent({\r\n showMoreLabel,\r\n showLessLabel,\r\n isShowMore,\r\n hasHiddenRows,\r\n onShowMoreToggle,\r\n}: Props) {\r\n const wrapperRef = React.useRef(null)\r\n const previousExpandWrapperTopRef = React.useRef(0)\r\n const isShowMorePrevious = usePrevious(isShowMore)\r\n\r\n React.useEffect(() => {\r\n if (isShowMorePrevious && !isShowMore) {\r\n setTimeout(() => {\r\n const currentExpandWrapperTop = wrapperRef.current?.getBoundingClientRect().top ?? 0\r\n window.scrollTo({ top: window.scrollY - (previousExpandWrapperTopRef.current - currentExpandWrapperTop) })\r\n })\r\n }\r\n }, [isShowMorePrevious, isShowMore])\r\n\r\n return (\r\n
\r\n {hasHiddenRows ? (\r\n {\r\n previousExpandWrapperTopRef.current = wrapperRef.current?.getBoundingClientRect().top ?? 0\r\n onShowMoreToggle(!isShowMore)\r\n }}\r\n leftContent={}\r\n className=\"font-normal\"\r\n >\r\n {isShowMore ? showLessLabel : showMoreLabel}\r\n \r\n ) : (\r\n
\r\n )}\r\n\r\n
\r\n Data source: similarweb.com\r\n {!TEMP_HIDDEN_RATE_RELEVANCY && (\r\n <>\r\n \r\n \r\n \r\n )}\r\n
\r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { TableAlign, TableHead, TableHeader, TableHeaderSortable } from '../../components/Table'\r\nimport { FinancialsColumnDefinition } from '../../components/financials-table/types'\r\nimport { SortByShape } from '../../hooks/use-sort-data'\r\nimport { SortDirection } from '../../types'\r\nimport { TrafficSubRowDataType } from './types'\r\n\r\ntype Props = {\r\n columns: FinancialsColumnDefinition[]\r\n sort: SortByShape | null>\r\n stickyLabelWidthClassName?: string\r\n onSortChange: (column: FinancialsColumnDefinition) => void\r\n}\r\n\r\nexport function TrafficTableHead({ columns, sort, stickyLabelWidthClassName, onSortChange }: Props) {\r\n const handleChangeSort = (column: FinancialsColumnDefinition) => {\r\n const shouldRemoveOrder = sort.direction === SortDirection.Descending && column === sort.column\r\n if (shouldRemoveOrder) {\r\n onSortChange('order' as unknown as FinancialsColumnDefinition)\r\n } else {\r\n onSortChange(column)\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n\r\n {columns.map((column) => (\r\n handleChangeSort(column)}\r\n >\r\n {column.name}\r\n \r\n ))}\r\n \r\n )\r\n}\r\n","import { ColorVariant } from '../../components'\r\nimport { FinancialsSubRowDataType } from '../../components/financials-table/types'\r\nimport { View } from '../../components/line-stacked-bar-chart'\r\n\r\nexport enum TrafficDataViewEnum {\r\n visits = 'visits',\r\n momChangePct = 'momChangePct',\r\n}\r\n\r\nexport enum AppRegion {\r\n us = 'us',\r\n ww = 'ww',\r\n}\r\n\r\nexport enum AppPlatform {\r\n ios = 'ios',\r\n android = 'android',\r\n}\r\n\r\nexport type TrafficSettings = {\r\n trafficDataView: TrafficDataViewEnum\r\n chartView: View\r\n appRegions: AppRegion[]\r\n appPlatforms: AppPlatform[]\r\n}\r\n\r\nexport interface InitialTrafficData {\r\n trafficTickers: string[]\r\n companyName: string\r\n mainDomain?: string | null\r\n trafficsWithPeers: TrafficItem[]\r\n appsWithPeers: AppItem[]\r\n}\r\n\r\nexport interface ParsedTrafficData extends Omit {\r\n trafficsWithPeers: ParsedTrafficItem[]\r\n appsWithPeers: ParsedAppItem[]\r\n}\r\n\r\nexport interface TrafficItem {\r\n domain?: string | null\r\n industry?: string | null\r\n industryGroup?: string | null\r\n heatmapSector?: string | null\r\n heatmapSubSector?: string | null\r\n peers?: string | null\r\n sector?: string | null\r\n ticker: string | null\r\n trafficJson?: string | null\r\n}\r\n\r\nexport type ParsedTrafficItem = Omit & {\r\n traffic: {\r\n d: number[]\r\n v: number[]\r\n } | null\r\n}\r\n\r\nexport interface AppItem {\r\n domain?: string\r\n appId?: string | null\r\n appName?: string | null\r\n os?: string | null\r\n geo?: string | null\r\n mauJson?: string | null\r\n}\r\n\r\nexport type ParsedAppItem = Omit & {\r\n id: string\r\n os: AppPlatform | null\r\n geo: AppRegion | null\r\n mau: {\r\n d: number[]\r\n v: number[]\r\n } | null\r\n}\r\n\r\nexport type TrafficSubRowDataType = Omit & {\r\n values: Array<{ year: string; value: number | null; momValue?: number | null }>\r\n keyValueMap: Record\r\n momKeyValueMap: Record\r\n}\r\n\r\nexport type TrafficRowDataType = TrafficSubRowDataType & {\r\n isSelected: boolean\r\n isHighlighted: boolean\r\n color: ColorVariant\r\n}\r\n","import React from 'react'\r\n\r\nimport { Heading } from '../../components'\r\nimport { ChipSwitch, ChipSwitchButton } from '../../components/ChipSwitch'\r\nimport { useFinancialsTableContext } from '../../components/financials-table'\r\nimport { View } from '../../components/line-stacked-bar-chart'\r\nimport { TrafficDataViewEnum, TrafficSettings } from './types'\r\n\r\nexport function WidgetDomainSettingsSection() {\r\n const { settings, setSettings } = useFinancialsTableContext()\r\n\r\n const toggleSetting = (key: keyof TrafficSettings, value: TrafficSettings[typeof key]) => {\r\n setSettings({\r\n ...settings,\r\n [key]: value,\r\n })\r\n }\r\n\r\n return (\r\n
\r\n \r\n Domains: Monthly Visits\r\n \r\n
\r\n \r\n {\r\n toggleSetting('trafficDataView', TrafficDataViewEnum.visits)\r\n }}\r\n >\r\n Visits\r\n \r\n {\r\n toggleSetting('trafficDataView', TrafficDataViewEnum.momChangePct)\r\n }}\r\n >\r\n MoM Growth %\r\n \r\n \r\n\r\n \r\n {\r\n toggleSetting('chartView', View.bars)\r\n }}\r\n />\r\n {\r\n toggleSetting('chartView', View.lines)\r\n }}\r\n />\r\n \r\n
\r\n
\r\n )\r\n}\r\n","import { ColorVariant } from '../../components'\r\nimport { AppPlatform, AppRegion, TrafficDataViewEnum, TrafficSettings } from './types'\r\n\r\nexport const COOKIE_KEY = 'trafficSettings'\r\n\r\nexport const DEFAULT_SHOW_NUM_OF_APPS = 12\r\n\r\nexport const DEFAULT_SETTINGS: TrafficSettings = {\r\n trafficDataView: TrafficDataViewEnum.visits,\r\n chartView: 1,\r\n appPlatforms: [AppPlatform.android, AppPlatform.ios],\r\n appRegions: [AppRegion.us, AppRegion.ww],\r\n}\r\n\r\nexport const SEGMENT_COLORS = Object.keys(ColorVariant).filter(\r\n (c) => c !== ColorVariant.gray && c !== ColorVariant.default\r\n) as ColorVariant[]\r\n\r\nexport const AppPlatformLabels = {\r\n [AppPlatform.ios]: 'iOS',\r\n [AppPlatform.android]: 'Android',\r\n}\r\n\r\nexport const AppRegionLabels = {\r\n [AppRegion.us]: 'USA',\r\n [AppRegion.ww]: 'Worldwide',\r\n}\r\n\r\nexport const COMMON_COLUMN_CLASS_NAME = 'px-3.5 last:pr-11 w-17 min-w-17 max-w-17 last:w-24.5 relative'\r\n","import * as React from 'react'\r\n\r\nexport type MonthlyDataRowSelectionOverridesType = Record\r\n\r\ninterface Props {\r\n clearInactiveIdsBlacklist?: string[]\r\n}\r\n\r\nexport function useMonthlyDataControls({ clearInactiveIdsBlacklist }: Props) {\r\n const [isShowMore, setIsShowMore] = React.useState(false)\r\n const [monthlyDataRowSelectionOverrides, setMonthlyDataRowSelectionOverrides] =\r\n React.useState({})\r\n\r\n const toggleMonthlyDataRowSelection = React.useCallback((id: string, isSelected: boolean) => {\r\n setMonthlyDataRowSelectionOverrides((prevState) => ({\r\n ...prevState,\r\n [id]: isSelected,\r\n }))\r\n }, [])\r\n\r\n const clearInactiveMonthlyData = React.useCallback(() => {\r\n setMonthlyDataRowSelectionOverrides((prevState) =>\r\n Object.keys(prevState).reduce(\r\n (acc, id) =>\r\n clearInactiveIdsBlacklist?.includes(id)\r\n ? acc\r\n : {\r\n ...acc,\r\n [id]: prevState[id] ? true : undefined,\r\n },\r\n prevState\r\n )\r\n )\r\n }, [clearInactiveIdsBlacklist])\r\n\r\n const toggleIsShowMore = React.useCallback(\r\n (isShowMore: boolean) => {\r\n if (isShowMore) {\r\n clearInactiveMonthlyData()\r\n }\r\n setIsShowMore(isShowMore)\r\n },\r\n [clearInactiveMonthlyData]\r\n )\r\n\r\n return React.useMemo(\r\n () => ({\r\n monthlyDataRowSelectionOverrides,\r\n toggleMonthlyDataRowSelection,\r\n toggleIsShowMore,\r\n isShowMore,\r\n }),\r\n [monthlyDataRowSelectionOverrides, toggleMonthlyDataRowSelection, toggleIsShowMore, isShowMore]\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport { format } from 'date-fns'\r\nimport * as React from 'react'\r\n\r\nimport { TableAlign } from '../../components/Table'\r\nimport { getHeatmapClassNames } from '../../components/financials-table'\r\nimport { FinancialsColumnDefinition } from '../../components/financials-table/types'\r\nimport { shortFormatNumber } from '../../util'\r\nimport { COMMON_COLUMN_CLASS_NAME } from './constants'\r\nimport { TrafficDataViewEnum, TrafficSubRowDataType } from './types'\r\n\r\nconst getColumnsAndValueGetter = (yearKeys: string[], trafficDataView: TrafficDataViewEnum) => {\r\n const isMomChangePct = trafficDataView === TrafficDataViewEnum.momChangePct\r\n const columns: FinancialsColumnDefinition[] = yearKeys.map((yearMonth) => {\r\n const year = yearMonth.slice(0, 4)\r\n const month = yearMonth.slice(4, 6)\r\n const monthIndex = Number.parseInt(month) - 1\r\n const date = new Date(Number.parseInt(year), monthIndex, 1)\r\n return {\r\n id: yearMonth,\r\n name: format(date, monthIndex === 0 ? 'yyyy' : 'MMM'),\r\n align: TableAlign.Right,\r\n className: classnames(COMMON_COLUMN_CLASS_NAME, {\r\n 'is-heatmap': isMomChangePct,\r\n }),\r\n getColumnClassName: (data) => (isMomChangePct ? getHeatmapClassNames(data.momKeyValueMap[yearMonth]) : null),\r\n renderColumn: (data) => {\r\n const value = data[isMomChangePct ? 'momKeyValueMap' : 'keyValueMap'][yearMonth] ?? null\r\n const hasValue = typeof value === 'number'\r\n const shouldShowDecimal = (value ?? 0) >= 1000 || isMomChangePct\r\n return (\r\n \r\n {shortFormatNumber(value, { fractions: shouldShowDecimal ? 1 : 0, defaultValue: '—' })}\r\n {isMomChangePct && hasValue ? '%' : ''}\r\n \r\n )\r\n },\r\n }\r\n })\r\n\r\n return {\r\n columns,\r\n valueGetter: (column: FinancialsColumnDefinition) => (data: TrafficSubRowDataType) =>\r\n data[isMomChangePct ? 'momKeyValueMap' : 'keyValueMap'][column.id] ?? null,\r\n }\r\n}\r\n\r\nconst EMPTY_ARRAY: FinancialsColumnDefinition[] = []\r\n\r\nexport function useTableColumns(yearKeys: string[], trafficDataView: TrafficDataViewEnum, hasBeenInView: boolean) {\r\n return React.useMemo(\r\n () =>\r\n hasBeenInView\r\n ? getColumnsAndValueGetter(yearKeys, trafficDataView)\r\n : { columns: EMPTY_ARRAY, valueGetter: () => () => null },\r\n [yearKeys, trafficDataView, hasBeenInView]\r\n )\r\n}\r\n","import {\r\n AppPlatform,\r\n AppRegion,\r\n InitialTrafficData,\r\n ParsedAppItem,\r\n ParsedTrafficData,\r\n ParsedTrafficItem,\r\n} from './types'\r\n\r\nexport function getParsedDataFromInitial(data: InitialTrafficData): ParsedTrafficData {\r\n const { mainDomain, trafficsWithPeers, appsWithPeers, companyName, trafficTickers } = data\r\n\r\n return {\r\n trafficTickers,\r\n companyName,\r\n mainDomain: trafficsWithPeers.find(({ domain }) => domain && mainDomain?.includes(domain))?.domain ?? null,\r\n trafficsWithPeers: trafficsWithPeers.map(({ trafficJson, ...item }) => ({\r\n ...item,\r\n traffic: trafficJson ? JSON.parse(trafficJson) : null,\r\n })),\r\n appsWithPeers: appsWithPeers.map(({ mauJson, ...item }) => {\r\n let geo: AppRegion | null = null\r\n let os: AppPlatform | null = null\r\n if (item.geo?.toLowerCase() === AppRegion.ww) {\r\n geo = AppRegion.ww\r\n } else if (item.geo?.toLowerCase() === AppRegion.us) {\r\n geo = AppRegion.us\r\n }\r\n if (item.os?.toLowerCase() === AppPlatform.ios) {\r\n os = AppPlatform.ios\r\n } else if (item.os?.toLowerCase() === AppPlatform.android) {\r\n os = AppPlatform.android\r\n }\r\n\r\n return {\r\n ...item,\r\n appName: item.appName ?? 'N/A',\r\n id: `${item.domain}-${item.appName}-${item.appId}-${item.os}-${item.geo}`,\r\n os,\r\n geo,\r\n mau: mauJson ? JSON.parse(mauJson) : null,\r\n }\r\n }),\r\n }\r\n}\r\n\r\nexport function getSortedTickerTrafficsWithPeers(parsedData: ParsedTrafficData) {\r\n const tickerTrafficsWithPeers = parsedData.trafficsWithPeers.filter(\r\n (trafficWithPeers) =>\r\n trafficWithPeers.domain &&\r\n parsedData.trafficTickers.some((ticker) => ticker.toLowerCase() === trafficWithPeers.ticker?.toLowerCase())\r\n )\r\n tickerTrafficsWithPeers.sort((a, b) => {\r\n if (a.domain === parsedData?.mainDomain) return -1\r\n if (b.domain === parsedData?.mainDomain) return 1\r\n const aLastValue = a.traffic?.v[a.traffic.v.length - 1] ?? 0\r\n const bLastValue = b.traffic?.v[b.traffic.v.length - 1] ?? 0\r\n if (aLastValue === bLastValue) return 0\r\n\r\n return aLastValue > bLastValue ? -1 : 1\r\n })\r\n return tickerTrafficsWithPeers\r\n}\r\n\r\nexport function getAppStoreLink(app: ParsedAppItem) {\r\n if (!app.appId) return undefined\r\n\r\n if (app.os === AppPlatform.android) {\r\n return `https://play.google.com/store/apps/details?id=${app.appId}`\r\n }\r\n\r\n return `https://apps.apple.com/app/${app.appId}`\r\n}\r\n\r\nexport function getDomainHref(item: ParsedTrafficItem) {\r\n if (item.domain) {\r\n return `https://${item.domain}`\r\n }\r\n return undefined\r\n}\r\n\r\ninterface GetSelectedAppsArrayProps {\r\n domainApps: ParsedAppItem[]\r\n peerApps: ParsedAppItem[]\r\n industryApps: ParsedAppItem[]\r\n appRegions: AppRegion[]\r\n appPlatforms: AppPlatform[]\r\n}\r\n\r\nexport function getSelectedAppsArray({\r\n domainApps,\r\n peerApps,\r\n industryApps,\r\n appPlatforms,\r\n appRegions,\r\n}: GetSelectedAppsArrayProps) {\r\n if (domainApps.length === 0) {\r\n return []\r\n }\r\n\r\n return [domainApps, peerApps, industryApps]\r\n .flat()\r\n .filter((app) => appPlatforms.includes(app.os!) && appRegions.includes(app.geo!))\r\n}\r\n\r\nexport function sortByMauLastValueDesc(apps: ParsedAppItem[]) {\r\n return [...apps].sort((a, b) => {\r\n const aLastValue = a.mau?.v[a.mau.v.length - 1] ?? 0\r\n const bLastValue = b.mau?.v[b.mau.v.length - 1] ?? 0\r\n if (aLastValue === bLastValue) return 0\r\n\r\n return aLastValue > bLastValue ? -1 : 1\r\n })\r\n}\r\n","import React from 'react'\r\n\r\nimport { useTableSort } from '../../components/Table'\r\nimport { ExternalLink } from '../../components/external-link'\r\nimport { FinancialsWidget, getMoMPercentageData, useFinancialsTableContext } from '../../components/financials-table'\r\nimport { LineStackedBarChart } from '../../components/line-stacked-bar-chart'\r\nimport { TrafficTableBottomContent } from './TrafficTableBottomContent'\r\nimport { TrafficTableHead } from './TrafficTableHead'\r\nimport { WidgetDomainSettingsSection } from './WidgetDomainSettingsSection'\r\nimport { SEGMENT_COLORS } from './constants'\r\nimport { TrafficRowDataType, TrafficSettings, TrafficSubRowDataType } from './types'\r\nimport { ParsedTrafficItem } from './types'\r\nimport { useMonthlyDataControls } from './useMonthlyDataControls'\r\nimport { useTableColumns } from './useTableColumns'\r\nimport { getDomainHref } from './utils'\r\n\r\ninterface MapDataProps {\r\n mainTraffic: ParsedTrafficItem\r\n peerTraffics: ParsedTrafficItem[]\r\n industryTraffics: ParsedTrafficItem[]\r\n isPlaceholder: boolean\r\n}\r\n\r\ninterface Props extends Omit {\r\n hasBeenInView: boolean\r\n isInView: boolean\r\n}\r\n\r\nfunction mapData({\r\n mainTraffic,\r\n peerTraffics,\r\n industryTraffics,\r\n yearKeys,\r\n isPlaceholder,\r\n}: MapDataProps & { yearKeys: number[] }): TrafficRowDataType[] {\r\n const allTraffics = [mainTraffic, ...peerTraffics, ...industryTraffics]\r\n const domainsArray = allTraffics.map((traffic, index) => {\r\n const values = !isPlaceholder\r\n ? yearKeys.map((date) => {\r\n const index = traffic.traffic?.d.findIndex((d) => d === date) ?? -1\r\n return {\r\n year: date.toString(),\r\n value: traffic.traffic?.v[index] ?? null,\r\n }\r\n })\r\n : []\r\n\r\n const valuesWithMomData: TrafficSubRowDataType['values'] = []\r\n const keyValueMap: TrafficSubRowDataType['keyValueMap'] = {}\r\n const momKeyValueMap: TrafficSubRowDataType['momKeyValueMap'] = {}\r\n\r\n if (!isPlaceholder) {\r\n const momData = getMoMPercentageData(values)\r\n values.forEach(({ year, value }) => {\r\n const momValue = momData[year] ?? null\r\n keyValueMap[year] = value\r\n momKeyValueMap[year] = momValue\r\n\r\n valuesWithMomData.push({\r\n year,\r\n value,\r\n momValue,\r\n })\r\n })\r\n }\r\n\r\n const isHighlighted = traffic.domain === mainTraffic.domain\r\n\r\n return {\r\n label: traffic.domain!,\r\n id: traffic.domain!,\r\n labelElement: ,\r\n labelColumnClassName: 'whitespace-nowrap',\r\n isLabelColumnSticky: true,\r\n color: SEGMENT_COLORS[index % SEGMENT_COLORS.length],\r\n isHighlighted,\r\n isSelected: traffic.domain === mainTraffic.domain || !!mainTraffic?.peers?.includes(traffic.domain!),\r\n values: valuesWithMomData,\r\n keyValueMap,\r\n momKeyValueMap,\r\n }\r\n })\r\n\r\n return domainsArray\r\n}\r\n\r\nexport function Domain({\r\n mainTraffic,\r\n peerTraffics,\r\n industryTraffics: industryTrafficsRaw,\r\n hasBeenInView,\r\n isInView,\r\n}: Props) {\r\n const { settings } = useFinancialsTableContext()\r\n const clearInactiveIdsBlacklist = React.useMemo(\r\n () => (mainTraffic ? [mainTraffic, ...peerTraffics].map(({ domain }) => domain ?? '') : ([] as string[])),\r\n [mainTraffic, peerTraffics]\r\n )\r\n const { monthlyDataRowSelectionOverrides, toggleMonthlyDataRowSelection, isShowMore, toggleIsShowMore } =\r\n useMonthlyDataControls({\r\n clearInactiveIdsBlacklist,\r\n })\r\n const industryTraffics = React.useMemo(() => {\r\n if (isShowMore) {\r\n return industryTrafficsRaw\r\n }\r\n return industryTrafficsRaw.filter(({ domain }) => domain && monthlyDataRowSelectionOverrides[domain] !== undefined)\r\n }, [industryTrafficsRaw, monthlyDataRowSelectionOverrides, isShowMore])\r\n\r\n const yearKeys = React.useMemo(() => {\r\n const allTraffics = [mainTraffic, ...peerTraffics, ...industryTraffics]\r\n return allTraffics\r\n .flatMap(({ traffic }) => traffic?.d)\r\n .filter((year, index, arr) => year !== undefined && arr.indexOf(year) === index)\r\n .sort((a, b) => a! - b!) as number[]\r\n }, [mainTraffic, peerTraffics, industryTraffics])\r\n const stringYearKeys = React.useMemo(() => yearKeys.map((y) => y.toString()), [yearKeys])\r\n const [monthlyData, setMonthlyData] = React.useState(() =>\r\n mapData({ peerTraffics, mainTraffic, industryTraffics, yearKeys, isPlaceholder: true })\r\n )\r\n const { columns, valueGetter } = useTableColumns(stringYearKeys, settings.trafficDataView, hasBeenInView)\r\n\r\n const {\r\n data: sortedData,\r\n sort,\r\n changeSort,\r\n } = useTableSort({\r\n data: monthlyData,\r\n columns,\r\n defaultSort: { column: columns[columns.length - 1], direction: -1 },\r\n key: hasBeenInView ? 1 : 0,\r\n valueGetter,\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!hasBeenInView) {\r\n return\r\n }\r\n\r\n const newMonthlyData = mapData({\r\n peerTraffics,\r\n mainTraffic,\r\n industryTraffics,\r\n yearKeys,\r\n isPlaceholder: false,\r\n })\r\n setMonthlyData(\r\n newMonthlyData.map((data, index) => ({\r\n ...data,\r\n isSelected: monthlyDataRowSelectionOverrides[data.id] ?? index < [mainTraffic, ...peerTraffics].length,\r\n }))\r\n )\r\n }, [\r\n peerTraffics,\r\n mainTraffic,\r\n industryTraffics,\r\n yearKeys,\r\n monthlyDataRowSelectionOverrides,\r\n hasBeenInView,\r\n settings.trafficDataView,\r\n ])\r\n\r\n return (\r\n
\r\n }\r\n tableHead={}\r\n columns={columns}\r\n hasStickyColumnWrapper={hasBeenInView}\r\n isTableFixed={false}\r\n onVisibilityChange={toggleMonthlyDataRowSelection}\r\n >\r\n \r\n \r\n 0}\r\n isShowMore={isShowMore}\r\n onShowMoreToggle={toggleIsShowMore}\r\n />\r\n
\r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Heading, Paragraph } from '../../components/typography'\r\nimport { Domain } from './Domain'\r\n\r\nconst mainTraffic = {\r\n ticker: 'AAPL',\r\n domain: 'apple.com',\r\n sector: 'Information Technology',\r\n industryGroup: 'Technology Hardware & Equipment',\r\n industry: 'Electronic Equipment, Instruments & Components',\r\n heatmapSector: 'Retail & Ecommerce',\r\n heatmapSubSector: 'Electronics Retail',\r\n peers: 'bestbuy.com bhphotovideo.com dell.com newegg.com gopro.com',\r\n traffic: {\r\n d: [202309, 202310, 202311, 202312, 202401, 202402, 202403, 202404, 202405, 202406, 202407, 202408],\r\n v: [\r\n 540748750, 505229547, 487297621, 488173477, 491135108, 455089483, 469888439, 438799320, 466652151, 447602427,\r\n 460280112, 466004425,\r\n ],\r\n },\r\n}\r\n\r\nconst peerTraffics = [\r\n {\r\n ticker: null,\r\n domain: 'bhphotovideo.com',\r\n heatmapSector: 'Retail & Ecommerce',\r\n heatmapSubSector: 'Electronics Retail',\r\n peers: 'adorama.com bestbuy.com newegg.com crutchfield.com apple.com',\r\n traffic: {\r\n d: [202309, 202310, 202311, 202312, 202401, 202402, 202403, 202404, 202405, 202406, 202407, 202408],\r\n v: [\r\n 16882382, 15587001, 19360737, 17491439, 15626709, 14937833, 15778420, 14048463, 14447505, 13713870, 14458610,\r\n 13244665,\r\n ],\r\n },\r\n },\r\n {\r\n ticker: 'NEGG',\r\n domain: 'newegg.com',\r\n sector: 'Consumer Discretionary',\r\n industryGroup: 'Automobiles & Components',\r\n industry: 'Automobiles',\r\n heatmapSector: 'Retail & Ecommerce',\r\n heatmapSubSector: 'Electronics Retail',\r\n peers: 'bestbuy.com bhphotovideo.com microcenter.com monoprice.com adorama.com',\r\n traffic: {\r\n d: [202309, 202310, 202311, 202312, 202401, 202402, 202403, 202404, 202405, 202406, 202407, 202408],\r\n v: [\r\n 14655543, 14675084, 21299681, 17083935, 14989483, 12606841, 12744555, 11189424, 11204263, 10793083, 12361144,\r\n 10800396,\r\n ],\r\n },\r\n },\r\n {\r\n ticker: 'BBY',\r\n domain: 'bestbuy.com',\r\n sector: 'Consumer Discretionary',\r\n industryGroup: 'Retailing',\r\n industry: 'Specialty Retail',\r\n heatmapSector: 'Retail & Ecommerce',\r\n heatmapSubSector: 'Electronics Retail',\r\n peers: 'bhphotovideo.com newegg.com microcenter.com adorama.com crutchfield.com',\r\n traffic: {\r\n d: [202309, 202310, 202311, 202312, 202401, 202402, 202403, 202404, 202405, 202406, 202407, 202408],\r\n v: [\r\n 103083547, 109511672, 183001509, 145494317, 106208296, 91989808, 89471329, 82107190, 93211500, 95630411,\r\n 107767846, 108331167,\r\n ],\r\n },\r\n },\r\n {\r\n ticker: 'GPRO',\r\n domain: 'gopro.com',\r\n sector: 'Information Technology',\r\n industryGroup: 'Technology Hardware & Equipment',\r\n industry: 'Electronic Equipment, Instruments & Components',\r\n heatmapSector: 'Retail & Ecommerce',\r\n heatmapSubSector: 'Electronics Retail',\r\n peers: 'adorama.com bhphotovideo.com crutchfield.com bestbuy.com newegg.com',\r\n traffic: {\r\n d: [202309, 202310, 202311, 202312, 202401, 202402, 202403, 202404, 202405, 202406, 202407, 202408],\r\n v: [6691953, 5650591, 5848752, 5772722, 5387842, 4922998, 5067003, 4727655, 4848193, 5098999, 5130140, 4867626],\r\n },\r\n },\r\n {\r\n ticker: 'DELL',\r\n domain: 'dell.com',\r\n sector: 'Information Technology',\r\n industryGroup: 'Technology Hardware & Equipment',\r\n industry: 'Technology Hardware, Storage & Peripherals',\r\n heatmapSector: 'Retail & Ecommerce',\r\n heatmapSubSector: 'Electronics Retail',\r\n peers: 'bestbuy.com newegg.com bhphotovideo.com microcenter.com kabum.com.br',\r\n traffic: {\r\n d: [202309, 202310, 202311, 202312, 202401, 202402, 202403, 202404, 202405, 202406, 202407, 202408],\r\n v: [\r\n 45350663, 46275790, 54923594, 43819278, 47816519, 41098872, 45505450, 40775151, 40332786, 39203811, 45198644,\r\n 41075116,\r\n ],\r\n },\r\n },\r\n]\r\n\r\ninterface Props {\r\n companyName: string\r\n}\r\n\r\nexport function NoDataPlaceholder({ companyName }: Props) {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n Data Unavailable for {companyName}\r\n \r\n Currently, we do not have sufficient data to display the{' '}\r\n associated domains and smartphone apps for this company. As soon as the relevant\r\n information becomes available, this view will be updated to provide you with valuable insights.\r\n \r\n
\r\n
\r\n
\r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Heading } from '../../components'\r\nimport { ChipSwitch, ChipSwitchButton } from '../../components/ChipSwitch'\r\nimport { useFinancialsTableContext } from '../../components/financials-table'\r\nimport { View } from '../../components/line-stacked-bar-chart'\r\nimport { AppPlatformLabels, AppRegionLabels } from './constants'\r\nimport { AppPlatform, AppRegion, TrafficDataViewEnum, TrafficSettings } from './types'\r\n\r\nexport function WidgetAppSettingsSection() {\r\n const { settings, setSettings } = useFinancialsTableContext()\r\n\r\n const toggleSetting = (key: keyof TrafficSettings, value: TrafficSettings[typeof key]) => {\r\n setSettings({\r\n ...settings,\r\n [key]: value,\r\n })\r\n }\r\n\r\n return (\r\n
\r\n \r\n Apps: Monthly Active Users\r\n \r\n
\r\n \r\n {[AppPlatform.ios, AppPlatform.android].map((key) => (\r\n {\r\n const has = settings.appPlatforms.includes(key)\r\n toggleSetting('appPlatforms', [\r\n ...settings.appPlatforms.filter((platform) => platform !== key),\r\n ...(has ? [] : [key]),\r\n ])\r\n }}\r\n >\r\n {AppPlatformLabels[key]}\r\n \r\n ))}\r\n \r\n\r\n \r\n {[AppRegion.ww, AppRegion.us].map((key) => (\r\n {\r\n const has = settings.appRegions.includes(key)\r\n toggleSetting('appRegions', [\r\n ...settings.appRegions.filter((platform) => platform !== key),\r\n ...(has ? [] : [key]),\r\n ])\r\n }}\r\n >\r\n {AppRegionLabels[key]}\r\n \r\n ))}\r\n \r\n\r\n \r\n {\r\n toggleSetting('trafficDataView', TrafficDataViewEnum.visits)\r\n }}\r\n >\r\n MAU\r\n \r\n {\r\n toggleSetting('trafficDataView', TrafficDataViewEnum.momChangePct)\r\n }}\r\n >\r\n MoM Growth %\r\n \r\n \r\n\r\n \r\n {\r\n toggleSetting('chartView', View.bars)\r\n }}\r\n />\r\n {\r\n toggleSetting('chartView', View.lines)\r\n }}\r\n />\r\n \r\n
\r\n
\r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Tag } from '../../components'\r\nimport { useTableSort } from '../../components/Table'\r\nimport { ExternalLink } from '../../components/external-link'\r\nimport { FinancialsWidget, getMoMPercentageData, useFinancialsTableContext } from '../../components/financials-table'\r\nimport { LineStackedBarChart } from '../../components/line-stacked-bar-chart'\r\nimport { TrafficTableBottomContent } from './TrafficTableBottomContent'\r\nimport { TrafficTableHead } from './TrafficTableHead'\r\nimport { WidgetAppSettingsSection } from './WidgetAppSettingsSection'\r\nimport { AppPlatformLabels, AppRegionLabels, DEFAULT_SHOW_NUM_OF_APPS, SEGMENT_COLORS } from './constants'\r\nimport { ParsedAppItem, TrafficRowDataType, TrafficSettings, TrafficSubRowDataType } from './types'\r\nimport { MonthlyDataRowSelectionOverridesType, useMonthlyDataControls } from './useMonthlyDataControls'\r\nimport { useTableColumns } from './useTableColumns'\r\nimport { getAppStoreLink, getSelectedAppsArray } from './utils'\r\n\r\ninterface MapDataProps {\r\n domain: string | null\r\n selectedAppsArray: ParsedAppItem[]\r\n selectionOverrides?: MonthlyDataRowSelectionOverridesType\r\n yearKeys: number[]\r\n isPlaceholder: boolean\r\n}\r\n\r\nfunction mapData({\r\n domain,\r\n selectedAppsArray,\r\n selectionOverrides,\r\n yearKeys,\r\n isPlaceholder,\r\n}: MapDataProps): TrafficRowDataType[] {\r\n return selectedAppsArray.map((app, index) => {\r\n const appName = app.appName ?? 'N/A'\r\n const platformLabel = app.os ? AppPlatformLabels[app.os] : 'N/A'\r\n const geoLabel = app.geo ? AppRegionLabels[app.geo] : 'N/A'\r\n const values = !isPlaceholder\r\n ? yearKeys.map((date) => {\r\n const index = app.mau?.d.findIndex((d) => d === date) ?? -1\r\n return {\r\n year: date.toString(),\r\n value: app.mau?.v[index] ?? null,\r\n }\r\n })\r\n : []\r\n\r\n const valuesWithMomData: TrafficSubRowDataType['values'] = []\r\n const keyValueMap: TrafficSubRowDataType['keyValueMap'] = {}\r\n const momKeyValueMap: TrafficSubRowDataType['momKeyValueMap'] = {}\r\n\r\n if (!isPlaceholder) {\r\n const momData = getMoMPercentageData(values)\r\n values.forEach(({ year, value }) => {\r\n const momValue = momData[year] ?? null\r\n keyValueMap[year] = value\r\n momKeyValueMap[year] = momValue\r\n\r\n valuesWithMomData.push({\r\n year,\r\n value,\r\n momValue,\r\n })\r\n })\r\n }\r\n\r\n const isHighlighted = app.domain === domain\r\n\r\n return {\r\n id: app.id,\r\n label: [appName, platformLabel, geoLabel].join(' - '),\r\n labelColumnClassName: 'whitespace-nowrap',\r\n isLabelColumnSticky: true,\r\n labelElement: (\r\n
\r\n \r\n {platformLabel} {geoLabel}\r\n
\r\n ),\r\n isHighlighted,\r\n geo: app.geo,\r\n os: app.os,\r\n color: SEGMENT_COLORS[index % SEGMENT_COLORS.length],\r\n isSelected: selectionOverrides?.[app.id] ?? index < DEFAULT_SHOW_NUM_OF_APPS,\r\n values: valuesWithMomData,\r\n keyValueMap,\r\n momKeyValueMap,\r\n }\r\n })\r\n}\r\n\r\ninterface Props {\r\n domainApps: ParsedAppItem[]\r\n peerApps: ParsedAppItem[]\r\n industryApps: ParsedAppItem[]\r\n hasBeenInView: boolean\r\n isInView: boolean\r\n}\r\n\r\nexport function Apps({ domainApps, peerApps, industryApps, hasBeenInView, isInView }: Props) {\r\n const { settings } = useFinancialsTableContext()\r\n const { domain, yearKeys, stringYearKeys } = React.useMemo(() => {\r\n const domain = domainApps?.[0].domain ?? null\r\n const domainAppsYears = domainApps?.flatMap(({ mau }) => mau?.d) ?? []\r\n const peerAppsYears = peerApps?.flatMap(({ mau }) => mau?.d) ?? []\r\n const industryAppsYears = industryApps?.flatMap(({ mau }) => mau?.d) ?? []\r\n\r\n const yearKeys = (\r\n [...new Set([...domainAppsYears, ...peerAppsYears, ...industryAppsYears])].filter(Boolean) as number[]\r\n ).sort((a, b) => a - b)\r\n\r\n return {\r\n yearKeys,\r\n stringYearKeys: yearKeys.map((y) => y.toString()),\r\n domain,\r\n }\r\n }, [domainApps, peerApps, industryApps])\r\n\r\n const selectedAppsArray = React.useMemo(\r\n () =>\r\n getSelectedAppsArray({\r\n domainApps,\r\n peerApps,\r\n industryApps,\r\n appPlatforms: settings.appPlatforms,\r\n appRegions: settings.appRegions,\r\n }),\r\n [domainApps, peerApps, industryApps, settings.appRegions, settings.appPlatforms]\r\n )\r\n const clearInactiveIdsBlacklist = React.useMemo(\r\n () => selectedAppsArray.slice(0, DEFAULT_SHOW_NUM_OF_APPS).map(({ id }) => id),\r\n [selectedAppsArray]\r\n )\r\n const { monthlyDataRowSelectionOverrides, toggleMonthlyDataRowSelection, isShowMore, toggleIsShowMore } =\r\n useMonthlyDataControls({ clearInactiveIdsBlacklist })\r\n const [monthlyData, setMonthlyData] = React.useState(() =>\r\n mapData({\r\n domain,\r\n selectedAppsArray: selectedAppsArray.slice(0, DEFAULT_SHOW_NUM_OF_APPS),\r\n yearKeys,\r\n isPlaceholder: true,\r\n })\r\n )\r\n const { columns, valueGetter } = useTableColumns(stringYearKeys, settings.trafficDataView, hasBeenInView)\r\n\r\n const {\r\n data: sortedData,\r\n sort,\r\n changeSort,\r\n } = useTableSort({\r\n data: monthlyData,\r\n columns,\r\n defaultSort: { column: columns[columns.length - 1], direction: -1 },\r\n key: hasBeenInView ? 1 : 0,\r\n valueGetter,\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!hasBeenInView) {\r\n return\r\n }\r\n\r\n const newMonthlyData = mapData({\r\n domain,\r\n selectedAppsArray: selectedAppsArray.filter(\r\n ({ id }, index) =>\r\n isShowMore || index < DEFAULT_SHOW_NUM_OF_APPS || monthlyDataRowSelectionOverrides[id] !== undefined\r\n ),\r\n yearKeys,\r\n selectionOverrides: monthlyDataRowSelectionOverrides,\r\n isPlaceholder: false,\r\n })\r\n\r\n setMonthlyData(newMonthlyData)\r\n }, [domain, selectedAppsArray, monthlyDataRowSelectionOverrides, yearKeys, isShowMore, hasBeenInView])\r\n\r\n const isEmpty = monthlyData.length === 0\r\n\r\n return (\r\n
\r\n }\r\n tableHead={\r\n isEmpty ? undefined : (\r\n \r\n )\r\n }\r\n columns={columns}\r\n hasStickyColumnWrapper={hasBeenInView}\r\n onVisibilityChange={toggleMonthlyDataRowSelection}\r\n >\r\n \r\n No matching Apps found.\r\n
\r\n Adjust your filters for more results.\r\n \r\n }\r\n isEmpty={isEmpty}\r\n isInView={isInView}\r\n hasBeenInView={hasBeenInView}\r\n isFullWidth\r\n hasXAxis\r\n />\r\n \r\n {!isEmpty && (\r\n DEFAULT_SHOW_NUM_OF_APPS}\r\n isShowMore={isShowMore}\r\n onShowMoreToggle={toggleIsShowMore}\r\n />\r\n )}\r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Icon, Select, SelectItem } from '../../components'\r\n\r\ninterface Props {\r\n domain?: string | null\r\n domainItems: SelectItem[]\r\n isInteractive: boolean\r\n}\r\n\r\nconst TICKER_HEADER_CONTAINER_CLASS_NAME = 'js-ticker-header-container'\r\n\r\nexport default function TrafficDomainSelect({ domain, domainItems, isInteractive }: Props) {\r\n const handleDomainSelect = React.useCallback(({ value }: { value: string }) => {\r\n const tickerHeaderContainer = document.getElementsByClassName(TICKER_HEADER_CONTAINER_CLASS_NAME)?.[0]\r\n const fvHeaderHeightInPx =\r\n Number.parseFloat(window.getComputedStyle(document.body).getPropertyValue('--fv-header-height')) || 0\r\n const element = document.getElementById(value)\r\n const elementTopPosition = element?.getBoundingClientRect().top ?? 0\r\n window.scrollTo({\r\n left: 0,\r\n top: window.scrollY + elementTopPosition - tickerHeaderContainer.clientHeight - fvHeaderHeightInPx - 1, // -1 because if it's not there sticky shadow is applied on domain header\r\n behavior: 'smooth',\r\n })\r\n }, [])\r\n\r\n return (\r\n
\r\n }\r\n items={domainItems}\r\n isInteractive={isInteractive}\r\n onChange={handleDomainSelect}\r\n />\r\n
\r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { Heading } from '../../components/typography'\r\nimport { useStickyShadow } from '../../hooks/use-sticky-shadow'\r\nimport { shortFormatNumber } from '../../util'\r\n\r\ninterface Props {\r\n domainElement: React.ReactElement | string\r\n sector?: string | null\r\n subSector?: string | null\r\n monthlyVisits: Array\r\n}\r\n\r\nexport default function TrafficHeader({ domainElement, sector, subSector, monthlyVisits }: Props) {\r\n const { stickyRef, isSticky } = useStickyShadow()\r\n\r\n const headerColumns = React.useMemo(() => {\r\n const lastMonthVisits = monthlyVisits[monthlyVisits.length - 1]\r\n const prevMonthVisits = monthlyVisits[monthlyVisits.length - 2]\r\n const visitsChangePercentage =\r\n typeof lastMonthVisits === 'number' && typeof prevMonthVisits === 'number'\r\n ? ((lastMonthVisits - prevMonthVisits) / Math.abs(prevMonthVisits)) * 100\r\n : null\r\n\r\n return [\r\n { label: 'Domain', value: domainElement },\r\n {\r\n label: 'Last Month Visits',\r\n value: `${shortFormatNumber(lastMonthVisits, { fractions: 2 })} ${visitsChangePercentage !== null ? `(${shortFormatNumber(visitsChangePercentage, { fractions: 2, showPlusSign: true })}%)` : ''}`,\r\n },\r\n // Used || intentionally in case sector/subSection is '' (empty string)\r\n { label: 'Sector', value: sector || '—' },\r\n { label: 'Sub Sector', value: subSector || '—' },\r\n ].map(({ label, value }, index) => (\r\n
\r\n {index === 0 && React.isValidElement(value) ? (\r\n value\r\n ) : (\r\n \r\n {value}\r\n \r\n )}\r\n {label}\r\n
\r\n ))\r\n }, [domainElement, monthlyVisits, sector, subSector])\r\n\r\n return (\r\n
\r\n \r\n
\r\n
{headerColumns}
\r\n
\r\n
\r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { useIntersectionObserverContext } from '../../services/IntersectionObserverContext'\r\nimport { Apps } from './Apps'\r\nimport { Domain } from './Domain'\r\nimport TrafficDomainSelect from './TrafficDomainSelect'\r\nimport TrafficHeader from './TrafficHeader'\r\nimport { ParsedTrafficData } from './types'\r\nimport { ParsedTrafficItem } from './types'\r\nimport { sortByMauLastValueDesc } from './utils'\r\n\r\ninterface Props {\r\n parsedTrafficData: ParsedTrafficData\r\n domain: string\r\n index: number\r\n}\r\n\r\nexport function TrafficDomainSection({ parsedTrafficData, domain, index }: Props) {\r\n const { registerIntersectionObservedElement } = useIntersectionObserverContext()\r\n const domainApps = React.useMemo(\r\n () => sortByMauLastValueDesc(parsedTrafficData.appsWithPeers.filter((app) => app.domain === domain)),\r\n [parsedTrafficData, domain]\r\n )\r\n const [isInView, setIsInView] = React.useState(false)\r\n const [hasBeenInView, setHasBeenInView] = React.useState(false)\r\n const { mainTraffic, peerTraffics, industryTraffics, peerApps, industryApps } = React.useMemo(() => {\r\n const peerTraffics: ParsedTrafficItem[] = []\r\n const industryTraffics: ParsedTrafficItem[] = []\r\n\r\n const mainTraffic = parsedTrafficData.trafficsWithPeers.find((traffic) => traffic.domain === domain)!\r\n\r\n parsedTrafficData?.trafficsWithPeers.forEach((traffic) => {\r\n if (traffic.domain === domain) {\r\n return\r\n } else if (mainTraffic.peers?.includes(traffic.domain!)) {\r\n peerTraffics.push(traffic)\r\n } else if (\r\n mainTraffic.heatmapSector &&\r\n mainTraffic.heatmapSubSector &&\r\n mainTraffic.heatmapSector === traffic.heatmapSector &&\r\n mainTraffic.heatmapSubSector === traffic.heatmapSubSector\r\n ) {\r\n industryTraffics.push(traffic)\r\n }\r\n })\r\n\r\n const peerApps = sortByMauLastValueDesc(\r\n parsedTrafficData.appsWithPeers.filter((app) => peerTraffics.some((traffic) => app.domain === traffic.domain))\r\n )\r\n const industryApps = sortByMauLastValueDesc(\r\n parsedTrafficData.appsWithPeers.filter((app) => industryTraffics.some((traffic) => app.domain === traffic.domain))\r\n )\r\n\r\n return {\r\n mainTraffic,\r\n peerTraffics,\r\n industryTraffics,\r\n peerApps,\r\n industryApps,\r\n }\r\n }, [parsedTrafficData, domain])\r\n\r\n const domainItems = React.useMemo(\r\n () =>\r\n parsedTrafficData.trafficsWithPeers\r\n .filter(({ ticker, domain }) => domain && ticker === mainTraffic.ticker)\r\n .map(({ domain }) => ({ value: domain!, label: domain! })),\r\n [parsedTrafficData.trafficsWithPeers, mainTraffic.ticker]\r\n )\r\n\r\n React.useEffect(() => {\r\n if (isInView && !hasBeenInView) {\r\n setHasBeenInView(true)\r\n }\r\n }, [hasBeenInView, isInView])\r\n\r\n React.useEffect(() => {\r\n const unregister = registerIntersectionObservedElement(domain, setIsInView)\r\n\r\n return () => {\r\n unregister?.()\r\n }\r\n }, [domain, registerIntersectionObservedElement])\r\n\r\n return (\r\n
\r\n {index > 0 &&
}\r\n 1 ? (\r\n \r\n ) : (\r\n domain\r\n )\r\n }\r\n sector={mainTraffic.heatmapSector}\r\n subSector={mainTraffic.heatmapSubSector}\r\n monthlyVisits={mainTraffic.traffic?.v ?? []}\r\n />\r\n\r\n \r\n\r\n {domainApps.length > 0 && (\r\n \r\n )}\r\n
\r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { FinancialsTableContextProvider } from '../../components/financials-table'\r\nimport { useWindowSize } from '../../hooks/use-window-size'\r\nimport { useCachedLoaderData } from '../../hooks/useCachedLoaderData'\r\nimport { IntersectionObserverContextProvider } from '../../services/IntersectionObserverContext'\r\nimport { NoDataPlaceholder } from './NoDataPlaceholder'\r\nimport { TrafficDomainSection } from './TrafficDomainSection'\r\nimport { COOKIE_KEY, DEFAULT_SETTINGS } from './constants'\r\nimport { InitialTrafficData, ParsedTrafficData } from './types'\r\nimport { getParsedDataFromInitial, getSortedTickerTrafficsWithPeers } from './utils'\r\n\r\nfunction TrafficComponent() {\r\n const { clientWidth } = useWindowSize()\r\n const { data } = useCachedLoaderData()\r\n\r\n const parsedData = React.useMemo(() => {\r\n if (!data) return null\r\n\r\n return getParsedDataFromInitial(data)\r\n }, [data])\r\n\r\n const tickerTrafficsWithPeers = React.useMemo(() => {\r\n if (!parsedData) return []\r\n\r\n return getSortedTickerTrafficsWithPeers(parsedData)\r\n }, [parsedData])\r\n\r\n React.useEffect(() => {\r\n // Remove min-height from react root element which is set on BE because of CLS\r\n document.getElementById('root')?.style.removeProperty('min-height')\r\n }, [])\r\n\r\n if (!data || data.appsWithPeers.length === 0) {\r\n return \r\n }\r\n\r\n return (\r\n \r\n
\r\n {tickerTrafficsWithPeers.map((trafficWithPeers, index) => (\r\n \r\n ))}\r\n
\r\n
\r\n )\r\n}\r\n\r\nexport default function Traffic() {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { ObjectHash } from '../components/types'\r\n\r\ntype IntersectionObservedEntry = ObjectHash<(isIntersecting: boolean) => void>\r\n\r\n/*\r\n * Context.\r\n */\r\n\r\nexport interface IntersectionObserverContextProps {\r\n intersectionObservedElementsRef: React.MutableRefObject\r\n registerIntersectionObservedElement: (\r\n elementId: string,\r\n callback: (isObserving: boolean) => void\r\n ) => (() => void) | null\r\n}\r\n\r\nexport const IntersectionObserverContext = React.createContext({\r\n intersectionObservedElementsRef: { current: {} },\r\n registerIntersectionObservedElement: () => null,\r\n})\r\n\r\n/*\r\n * Hook.\r\n */\r\n\r\nexport function useIntersectionObserverContext(): IntersectionObserverContextProps {\r\n return React.useContext(IntersectionObserverContext)\r\n}\r\n\r\n/*\r\n * Component.\r\n */\r\n\r\ninterface IntersectionObserverContextProviderProps {\r\n children: React.ReactNode\r\n}\r\nexport const IntersectionObserverContextProvider = ({ children }: IntersectionObserverContextProviderProps) => {\r\n const intersectionObservedElementsRef = React.useRef({})\r\n const intersectionObserverRef = React.useRef(\r\n new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n const callback = intersectionObservedElementsRef.current[entry.target.id]\r\n callback?.(entry.isIntersecting)\r\n })\r\n })\r\n )\r\n\r\n React.useEffect(\r\n () => () => {\r\n intersectionObserverRef.current.disconnect()\r\n },\r\n []\r\n )\r\n\r\n const registerIntersectionObservedElement = React.useCallback(\r\n (elementId: string, callback: (isObserving: boolean) => void) => {\r\n const element = document.getElementById(elementId)\r\n if (!element) {\r\n return null\r\n }\r\n intersectionObserverRef.current.observe(element)\r\n intersectionObservedElementsRef.current[elementId] = callback\r\n\r\n return () => {\r\n intersectionObserverRef.current.unobserve(element)\r\n delete intersectionObservedElementsRef.current[elementId]\r\n }\r\n },\r\n []\r\n )\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n"],"names":["ExternalLink","_ref","label","href","isBold","className","_jsx","Button","as","rightContent","Icon","name","width","size","padding","theme","classnames","target","rel","onMouseDown","event","stopPropagation","onClick","children","useStickyShadow","stickyRef","React","isSticky","setIsSticky","current","onScroll","throttle","stickyElement","elementStickyTopOffset","parseFloat","getComputedStyle","top","elementCurrentTopOffset","getBoundingClientRect","document","addEventListener","removeEventListener","useWindowSize","throttleWaitInMs","isWatching","arguments","length","undefined","setSize","clientWidth","documentElement","innerWidth","window","innerHeight","handleResize","cancel","TEMP_HIDDEN_RATE_RELEVANCY","TrafficTableBottomContent","showMoreLabel","showLessLabel","isShowMore","hasHiddenRows","onShowMoreToggle","wrapperRef","previousExpandWrapperTopRef","isShowMorePrevious","usePrevious","setTimeout","_wrapperRef$current$g","_wrapperRef$current","currentExpandWrapperTop","scrollTo","scrollY","_jsxs","ref","type","_wrapperRef$current$g2","_wrapperRef$current2","leftContent","_Fragment","TrafficTableHead","columns","sort","stickyLabelWidthClassName","onSortChange","TableHead","TableHeader","align","TableAlign","Left","map","column","_sort$column","TableHeaderSortable","isActive","id","direction","shouldRemoveOrder","SortDirection","Descending","handleChangeSort","TrafficDataViewEnum","AppRegion","AppPlatform","WidgetDomainSettingsSection","settings","setSettings","useFinancialsTableContext","toggleSetting","key","value","Heading","level","ChipSwitch","ChipSwitchButton","active","trafficDataView","visits","momChangePct","chartView","View","bars","lines","COOKIE_KEY","DEFAULT_SHOW_NUM_OF_APPS","DEFAULT_SETTINGS","appPlatforms","android","ios","appRegions","us","ww","SEGMENT_COLORS","Object","keys","ColorVariant","filter","c","gray","default","AppPlatformLabels","AppRegionLabels","useMonthlyDataControls","clearInactiveIdsBlacklist","setIsShowMore","monthlyDataRowSelectionOverrides","setMonthlyDataRowSelectionOverrides","toggleMonthlyDataRowSelection","isSelected","prevState","clearInactiveMonthlyData","reduce","acc","includes","toggleIsShowMore","getColumnsAndValueGetter","yearKeys","isMomChangePct","yearMonth","year","slice","month","monthIndex","Number","parseInt","date","Date","format","Right","getColumnClassName","data","getHeatmapClassNames","momKeyValueMap","renderColumn","_data$yearMonth","hasValue","shouldShowDecimal","shortFormatNumber","fractions","defaultValue","valueGetter","_data$column$id","EMPTY_ARRAY","useTableColumns","hasBeenInView","getAppStoreLink","app","appId","os","getDomainHref","item","domain","sortByMauLastValueDesc","apps","a","b","_a$mau$v","_a$mau","_b$mau$v","_b$mau","aLastValue","mau","v","bLastValue","mapData","mainTraffic","peerTraffics","industryTraffics","isPlaceholder","traffic","index","_mainTraffic$peers","values","_traffic$traffic$d$fi","_traffic$traffic","_traffic$traffic$v$in","_traffic$traffic2","d","findIndex","toString","valuesWithMomData","keyValueMap","momData","getMoMPercentageData","forEach","_ref2","_momData$year","momValue","push","isHighlighted","labelElement","labelColumnClassName","isLabelColumnSticky","color","peers","Domain","_ref3","industryTrafficsRaw","isInView","_ref4","_ref5","flatMap","_ref6","arr","indexOf","stringYearKeys","y","monthlyData","setMonthlyData","sortedData","changeSort","useTableSort","defaultSort","newMonthlyData","_monthlyDataRowSelect","FinancialsWidget","header","tableHead","hasStickyColumnWrapper","isTableFixed","onVisibilityChange","LineStackedBarChart","lineChartTooltipSort","isFullWidth","hasXAxis","ticker","sector","industryGroup","industry","heatmapSector","heatmapSubSector","NoDataPlaceholder","companyName","Paragraph","WidgetAppSettingsSection","has","platform","selectedAppsArray","selectionOverrides","_app$appName","_selectionOverrides$a","appName","platformLabel","geoLabel","geo","_app$mau$d$findIndex","_app$mau","_app$mau$v$index","_app$mau2","join","Tag","Apps","domainApps","peerApps","industryApps","_domainApps$0$domain","_domainApps$flatMap","_peerApps$flatMap","_industryApps$flatMap","domainAppsYears","peerAppsYears","industryAppsYears","Set","Boolean","flat","getSelectedAppsArray","_ref7","_ref8","isEmpty","emptyMessage","TICKER_HEADER_CONTAINER_CLASS_NAME","TrafficDomainSelect","domainItems","isInteractive","handleDomainSelect","_document$getElements","_element$getBoundingC","tickerHeaderContainer","getElementsByClassName","fvHeaderHeightInPx","body","getPropertyValue","element","getElementById","elementTopPosition","left","clientHeight","behavior","Select","contentClass","focusRing","items","onChange","TrafficHeader","domainElement","subSector","monthlyVisits","headerColumns","lastMonthVisits","prevMonthVisits","visitsChangePercentage","Math","abs","showPlusSign","classNames","TrafficDomainSection","_mainTraffic$traffic$","_mainTraffic$traffic","parsedTrafficData","registerIntersectionObservedElement","useIntersectionObserverContext","appsWithPeers","setIsInView","setHasBeenInView","trafficsWithPeers","find","some","unregister","TrafficComponent","useCachedLoaderData","parsedData","_trafficsWithPeers$fi","_trafficsWithPeers$fi2","mainDomain","trafficTickers","trafficJson","JSON","parse","_item$geo","_item$geo2","_item$os","_item$os2","_item$appName","mauJson","toLowerCase","getParsedDataFromInitial","tickerTrafficsWithPeers","trafficWithPeers","_trafficWithPeers$tic","_a$traffic$v","_a$traffic","_b$traffic$v","_b$traffic","getSortedTickerTrafficsWithPeers","_parsedData$companyNa","_document$getElementB","style","removeProperty","IntersectionObserverContextProvider","maxWidth","max","Traffic","FinancialsTableContextProvider","defaultSettings","cookieKey","IntersectionObserverContext","intersectionObservedElementsRef","intersectionObserverRef","IntersectionObserver","entries","entry","callback","isIntersecting","disconnect","elementId","observe","unobserve","Provider"],"sourceRoot":""}