{"version":3,"file":"js/294-b48b81c7f5a54114fb7c.js","mappings":"mKAAO,MAAMA,EAA2B,CACtC,mBACA,kBACA,uBACA,eACA,mBACA,mBAGWC,EAAyBA,CAACC,EAAMC,KAC3C,IAAIC,EAAOF,EAAKG,YAAcH,EAAKE,KACnC,IAAKD,EACH,MAAQ,IAAGC,IAKb,OAFED,EAASG,SAAWN,EAAyBO,SAASL,EAAKM,kBAAoBL,EAASG,QAAW,IAAGF,GAEvF,EAINK,EAAgCC,IAC3C,GAAIA,EAAIC,mBACN,MAAQ,WAAUD,EAAIC,qBAGxB,MAAMP,EAAOM,EAAIR,KAAKU,aAAeF,EAAIR,KAAKE,KAS9C,OANEM,EAAIJ,SAAWN,EAAyBO,SAASG,EAAIG,mBACjDH,EAAIJ,QAAQQ,WAAW,QACrBJ,EAAIJ,QACH,WAAUI,EAAIJ,UAChB,IAAGF,GAEO,C,iICPZ,MAAMW,EAAkBA,EAAGC,WAAUC,YAAWC,SAAQC,YAAWC,wBAAuBC,MAC/F,MAAMC,EAAML,EAAY,MAAQ,SAEhC,OACEM,EAAAA,cAACD,EAAGE,OAAAC,OAAA,CACFN,WAAWO,EAAAA,EAAAA,GACT,2IACAR,EAAS,4EAA8E,WACvFD,EAAY,cAAgB,iBAC5BE,IAEEE,GACHJ,GAAaM,EAAAA,cAACI,EAAAA,EAAoB,CAACR,UAAU,0BAA0BF,GACvED,EACAC,GACCM,EAAAA,cAAA,UAAQK,QAASR,GACfG,EAAAA,cAACM,EAAAA,EAAS,CAACV,UAAU,uBAGrB,EAIGW,EAAaA,EAAGd,WAAUY,UAASR,wBAC9CG,EAAAA,cAAA,OACEJ,UAAU,wGACVS,QAASA,GACRZ,EACDO,EAAAA,cAAA,UAAQK,QAASR,GACfG,EAAAA,cAACM,EAAAA,EAAS,CAACV,UAAU,uB,2MCrD3B,MAAMY,EAAYA,EAChBC,QACAC,gBACAC,mBACAC,SACAC,cAAa,EACbC,gBACAC,iBAAgB,MAEhB,MAAOC,EAAeC,IAAoBC,EAAAA,EAAAA,UAAST,IAC5CU,EAAeC,IAAoBF,EAAAA,EAAAA,WAAS,IAC5CG,EAAaC,IAAkBJ,EAAAA,EAAAA,UAAS,IACzCK,EAAoBP,EAAcQ,OAAS,EAEjD,OACExB,EAAAA,cAAAA,EAAAA,SAAA,KACGa,GACCb,EAAAA,cAACyB,EAAAA,GAAW,CACVC,KAAK,SACLC,aAAa,MACbC,YAAY,MACZC,eAAe,MACfC,YAAY,EACZC,UAAW,IACXC,mBAAmB,SACnBC,mBAAoBnB,EACpBoB,MAAOb,EACPc,SAAWC,IACT,MAAMC,EAAW5B,EAAM6B,QAAQC,GAASA,EAAKC,cAAcxD,SAASoD,EAAMK,OAAOP,MAAMM,iBACvFvB,EAAiBoB,GACjBf,EAAec,EAAMK,OAAOP,MAAM,IAIxClC,EAAAA,cAAA,MAAIJ,UAAU,8BACXoB,EACEsB,QAAQC,GAAS3B,KAAYA,EAAO2B,KACpCG,MAAM,EAAGvB,GAAiBJ,EAAgBC,EAAcQ,OAAS,GACjEmB,KAAKJ,GACJvC,EAAAA,cAAA,MAAI4C,IAAKL,GACPvC,EAAAA,cAAC6C,EAAAA,GAAQ,CACPC,GAAK,sBAAqBP,IAC1B3C,UAAU,OACVmD,QAASrC,EAAc1B,SAASuD,GAChCJ,SAAUA,KACRxB,GAAkBqC,GACZA,EAAUhE,SAASuD,GACdS,EAAUV,QAAQW,GAAaA,IAAaV,IAE5C,IAAIS,EAAWT,IAExB,EAEJW,MAAOtC,EAAU,GAAE2B,MAAS3B,EAAO2B,IAAS,KAAOA,QAK5DhB,IAAsBR,GACrBf,EAAAA,cAAA,UAAQK,QAASA,IAAMe,GAAkBD,GAAgBvB,UAAU,8BAChEuB,EAAgB,WAAa,WAGjC,EAIP,OAAegC,EAAAA,EAAAA,MAAK3C,G,wCCvEb,MAiCM4C,EAAgBA,EAAGC,WAAUC,YAAWC,uBAChC,qBAAXC,SAA2BH,KAChCC,IACAD,IACAE,EAAkBvE,SAAS,SAAWuE,EAAkBvE,SAAS,WAA0C,IAA7BuE,EAAkB/B,QAExFiC,EAAgBA,EAAGF,uBAC9BA,EAAkBvE,SAAS,YAA2C,IAA7BuE,EAAkB/B,OAiFhDkC,EAAgBA,EAEzBC,cACAC,oBACAC,uBACAN,oBACAO,oBACAC,oBACAC,eACAC,cACAC,cACAC,UACAC,gBACAd,YACAD,WACAgB,QACAC,eACAC,oBACAC,kBACAC,eAEFC,UAEoBC,IAAhBF,IAA2BA,EAAcpB,EAAW,EAAI,IAE5D,MAAMuB,EAlJqBC,GAC3BjB,oBACAC,uBACAN,oBACAO,oBACAC,oBACAC,mBAEA,IAAIc,EAAyBlB,GACzBjB,KAAKoC,GAAa,cAAaA,EAAQC,QAAQ,aAAc,UAC7DC,KAAK,QACTH,EAAyBA,EAA0B,IAAGA,KAA4B,KAClF,IAAII,EAA6BrB,GAC7BlB,KAAKwC,GAAe,kBAAiBA,QACrCF,KAAK,SACTC,EAA6BA,EAA8B,IAAGA,KAAgC,KAC9F,IAAIE,EAA0B7B,GAAmBZ,KAAK0C,GAAc,mBAAkBA,QAAcJ,KAAK,QACzGG,EAA0BA,EAA2B,IAAGA,KAA6B,KACrF,MAAME,EAAoBxB,EAAoB,oBAAsB,KAC9DyB,EAA2BxB,GAAmBpB,KAAK6C,GAAc,cAAaA,QAAcP,KAAK,QACjGQ,EAA6BzB,GAAcrB,KAAK+C,GAAS,mBAAkBA,QAAST,KAAK,QAC/F,MAAO,CACLH,EACAI,EACAE,EACAE,EACAC,EACAE,GAECnD,OAAOqD,SACPV,KAAK,QAAQ,EAoHAJ,CAAc,CAC5BjB,oBACAC,uBACAN,oBACAO,oBACAC,oBACAC,iBAGI4B,EAjHwBC,GAC9BjB,UACAV,cACAE,gBACAd,YACAD,WACAE,oBACAU,kBAEA,MAAM6B,EAAU,CACdC,KAAM9B,EACNW,UACAoB,OAAQ,CAAC,gBAAiB,YAAa,mBAGnCC,EAAcxC,EAAc,CAAEF,sBAGpC,GAFgBH,EAAc,CAAEC,WAAUC,YAAWC,uBAEtCW,EACb4B,EAAQI,kBAAoB,CAAChC,QACxB,GAAIb,GAAYC,EACjBc,IACF0B,EAAQK,aAA+B,KAAhB/B,EACvB0B,EAAQM,gBAAkB,MAE5BN,EAAQO,aAAe,CAAC/C,EAAUgD,IAAKhD,EAAUiD,KAAKtB,KAAK,UACtD,IAAIgB,GAAgB5C,EAGzB,OAAO,KAGT,OAAOyC,CAAO,EAiFQD,CAAiB,CACrC5B,cACAW,UACAV,cACAC,UACAC,gBACAd,YACAD,WACAE,sBAGgB,OAAdD,GAAwC,OAAlBsC,IAI1BA,EAAcnB,YAAcA,EAExBH,IACFsB,EAActB,aAAeD,GAG3BE,IACEqB,EAAchB,QAChBgB,EAAchB,QAAW,GAAEA,SAAeL,IAE1CqB,EAAchB,QAAUL,GAIxBC,WACKoB,EAAcS,oBACdT,EAAcO,cAGvBP,EAAcY,sBAAwB,GAEtC7C,EAAY8C,OAAOpC,EAAOuB,GAAec,MAAMC,IAC7CjC,EAAUiC,EAAe,IACzB,EAGSC,EAAwBA,CAACtD,EAAWY,KAC/C,IAAKZ,IAAcY,EAAa,OAAO,KAEvC,MAAM2C,GAAU3C,EAAY,GAAKA,EAAY,IAAM,EAC7C4C,GAAU5C,EAAY,GAAKA,EAAY,IAAM,EAE7C6C,EAAa,CAACzD,EAAUgD,IAAe,EAATO,EAAYvD,EAAUiD,IAAe,EAATO,GAC1DE,EAAiB,CAAC1D,EAAUgD,IAAe,EAATO,EAAYvD,EAAUiD,IAAe,EAATO,GAEpE,OAAOC,EAAWE,OAAOD,EAAe,ECrMpCE,GAAoBC,EAAAA,EAAAA,iBAEpBC,EAAeC,IACnBC,aACAA,oCAGIC,EAAY,sBACZC,EAAcJ,EAAaK,UAAUF,GACrC5D,EAAcyD,EAAaK,UAAUF,GAE9BG,EAAqBA,EAChCjI,WACAkI,oBACAC,eACAC,gBACAC,YACAC,OACAC,SACAC,aAEA,MAAM,MAAEC,IAAUC,EAAAA,EAAAA,MACXC,EAAUC,IAAenH,EAAAA,EAAAA,UAAS8G,IAClC3E,EAAUiF,IAAepH,EAAAA,EAAAA,UAAS+G,IAEzCM,EAAAA,EAAAA,YAAU,KACJL,IACFG,EAAYH,EAAQA,EAAQ,IAAME,GAClCE,EAAYJ,EAAQA,EAAQ,KAAO7E,GACrC,GACC,CAAC6E,IAEJ,MAAOM,IAAatH,EAAAA,EAAAA,UACA,qBAAXsC,OAAyB,IAAIiF,gBAAgBjF,OAAO6B,SAASoB,QAAU,IAAIgC,iBAE9EC,EAAeF,EAAUG,IAAI,UAAY,GACzCC,EAAgBvF,EAAWwF,SAASL,EAAUG,IAAI,YAAc,GAAK,KAErEG,EAAiBN,EAAUG,IAAI,aAC/BI,EAASD,GAAgBE,MAAM,KAAKrG,KAAKsG,GAAUC,WAAWD,KAC9DE,EAAmBJ,EACrB,CAAEzC,IAAKyC,EAAO,GAAIxC,IAAKwC,EAAO,IACN,qBAAjBK,aACPC,KAAKC,MAAMF,aAAaG,QAAQ,cAChC,KACEC,EAAmBhB,EAAUG,IAAI,cAAcK,MAAM,MAAQ,GAC7DS,EAAsBjB,EAAUG,IAAI,iBAAiBK,MAAM,MAAQ,GACnEU,EAAmBlB,EAAUG,IAAI,cAAcK,MAAM,MAAQ,CAAC,SAAU,OAAQ,WAChFW,EAA4D,SAAjCnB,EAAUG,IAAI,eACzCiB,EAAmBpB,EAAUG,IAAI,cAAcK,MAAM,MAAQ,GAC7Da,EAAcrB,EAAUG,IAAI,SAASK,MAAM,MAAQ,GACnDc,EAAiBtB,EAAUG,IAAI,WAAaO,WAAWV,EAAUG,IAAI,YAAc,GACnFoB,EAAqBvB,EACxBG,IAAI,gBACHK,MAAM,KACPrG,KAAKsG,GAAUC,WAAWD,MAGtB5E,EAAO2F,IAAY9I,EAAAA,EAAAA,UAASwH,GAAgB,KAC5CtE,EAAe6F,IAAoB/I,EAAAA,EAAAA,UAAS0H,IAC5CtF,EAAW4G,IAAgBhJ,EAAAA,EAAAA,UAASiI,IACpCjF,EAAaiG,IAAkBjJ,EAAAA,EAAAA,UAAS6I,IACxCnG,EAAmBwG,IAAwBlJ,EAAAA,EAAAA,UAASsI,IACpD3F,EAAsBwG,IAA2BnJ,EAAAA,EAAAA,UAASuI,IAC1DlG,EAAmB+G,IAAwBpJ,EAAAA,EAAAA,UAASwI,IACpD5F,EAAmByG,IAAwBrJ,EAAAA,EAAAA,UAASyI,IACpD5F,EAAmByG,KAAwBtJ,EAAAA,EAAAA,UAAS0I,IACpD5F,GAAcyG,KAAmBvJ,EAAAA,EAAAA,UAAS2I,IAC1Ca,GAASC,KAAczJ,EAAAA,EAAAA,UAAS4I,IAEhCc,GAAgBC,KAAqB3J,EAAAA,EAAAA,UAAS,CAAC,IAC/C4J,GAAmBC,KAAwB7J,EAAAA,EAAAA,UAAS,OACpD8J,GAAgBC,KAAqB/J,EAAAA,EAAAA,UAAS,OAC9CgK,GAAWC,KAAgBjK,EAAAA,EAAAA,UAAS,OACpCkK,GAAMC,KAAWnK,EAAAA,EAAAA,UAAS,OAC1BoK,GAAQC,KAAarK,EAAAA,EAAAA,UAAS,IAC9BsK,GAAYC,KAAiBvK,EAAAA,EAAAA,WAAS,IACtC+C,GAAayH,KAAkBxK,EAAAA,EAAAA,UAAS,IACxCyK,GAAoBC,KAAyB1K,EAAAA,EAAAA,WAAS,IACtD2K,GAASC,KAAc5K,EAAAA,EAAAA,WAAS,IAChC6K,GAAcC,KAAmB9K,EAAAA,EAAAA,WAAS,IAC1C+K,GAAgBC,KAAqBhL,EAAAA,EAAAA,UAAS,OAC9CiL,GAAoBC,KAAyBlL,EAAAA,EAAAA,WAAS,IACtDmL,GAAmBC,KAAwBpL,EAAAA,EAAAA,WAAS,IACpDqL,GAA2BC,KAAgCtL,EAAAA,EAAAA,WAAS,IACpEuL,GAASC,KAAcxL,EAAAA,EAAAA,YACxBiD,GAAUf,EAAc,CAAEC,WAAUC,YAAWC,sBAC/C0C,GAAcxC,EAAc,CAAEF,uBAG7BoJ,GAA2BC,KAAgC1L,EAAAA,EAAAA,UAAS,CAAEkK,KAAM,GAAIE,OAAQ,KACxFuB,GAAqBC,KAA0B5L,EAAAA,EAAAA,UAAS,CAAEkK,KAAM,GAAIE,OAAQ,KAC5EyB,GAAsBC,KAA2B9L,EAAAA,EAAAA,UAAS,CAAEkK,KAAM,GAAIE,OAAQ,KAErF/C,EAAAA,EAAAA,YAAU,KACR,MAAM0E,EAAaA,KACjB,MAAMzE,EAAY,IAAIC,gBAAgBjF,OAAO6B,SAASoB,QACtD2D,EAAqB5B,EAAUG,IAAI,cAAcK,MAAM,MAAQ,IAC/DqB,EAAwB7B,EAAUG,IAAI,iBAAiBK,MAAM,MAAQ,IACrEsB,EAAqB9B,EAAUG,IAAI,cAAcK,MAAM,MAAQ,CAAC,SAAU,OAAQ,YAClFuB,EAAsD,SAAjC/B,EAAUG,IAAI,gBACnC6B,GAAqBhC,EAAUG,IAAI,cAAcK,MAAM,MAAQ,IAC/DyB,GAAgBjC,EAAUG,IAAI,SAASK,MAAM,MAAQ,IACrDgB,EAASxB,EAAUG,IAAI,UAAY,IACnCsB,EAAiB7B,EAAWI,EAAUG,IAAI,WAAa,GAAK,MAE5D,MAAMG,EAAiBN,EAAUG,IAAI,aACrC,GAAIG,EAAgB,CAClB,MAAMC,EAASD,EAAeE,MAAM,KAAKrG,KAAKsG,GAAUC,WAAWD,KACnEiB,EAAa9B,EAAW,CAAE9B,IAAKyC,EAAO,GAAIxC,IAAKwC,EAAO,IAAO,KAC/D,CACAoB,EACE3B,EACGG,IAAI,gBACHK,MAAM,KACPrG,KAAKsG,GAAUC,WAAWD,MAG/B+C,IAAgB,EAAK,EAGjBkB,EAAkBC,IACtBjD,EAAaiD,EAAEC,QACfzC,GAAW,IACX2B,IAAqB,GACrBlD,aAAaiE,QAAQ,YAAahE,KAAKiE,UAAUH,EAAEC,QAAQ,EA0B7D,OAvBA5J,OAAO+J,iBAAiB,WAAYN,GACpCO,SAASD,iBAAiB,eAAgBL,GAE1CO,uBACQjK,OAAOkK,OAAOC,KAAKC,cAAc,UACvCxB,IAAsB,GACtBoB,SAASK,cAAc,IAAIC,YAAY,sBACzC,CAEAC,GAEK3F,GAAa/E,GAChB2K,MAAM,iCACHtH,MAAMuH,IACLA,EAASC,OAAOxH,MAAMyH,IACpBzB,GAAWyB,EAAK,GAChB,IAEHC,OAAOC,IACNC,QAAQD,MAAM,0BAA2BA,EAAM,IAI9C,KACL7K,OAAO+K,oBAAoB,WAAYtB,GACvCO,SAASe,oBAAoB,eAAgBrB,EAAe,CAC7D,GACA,KAEH3E,EAAAA,EAAAA,YAAU,KACR,MAAMiG,EAAe,CACnB7K,cACAC,oBACAC,uBACAN,oBACAO,oBACAC,oBACAC,gBACAC,eACAC,cACAC,WACAC,gBACAd,YACAD,WACAgB,SAGFX,EAAc8K,GAAe7H,IAC3B,MAAM,KAAEyE,EAAI,OAAEE,EAAM,OAAEtF,EAAM,QAAEyI,EAAO,KAAE1I,GAASY,EAE1C+H,EACJ9K,EACAC,EACAN,EACAO,EACAC,EACAC,GACAV,EAAUgD,IACVhD,EAAUiD,IACVnC,EACAF,EACAG,EAEF,IAAIsK,GAAY,EA8BhB,GA7BID,IAAiBzC,KACnB0C,GAAY,EACZjD,GAAe,GACfQ,GAAkBwC,GAClBrD,GAAQ,IACRS,IAAW,GACXc,GAA6B,CAAExB,KAAM,GAAIE,OAAQ,IACjDwB,GAAuB,CAAE1B,KAAM,GAAIE,OAAQ,IAC3C0B,GAAwB,CAAE5B,KAAM,GAAIE,OAAQ,KAG1CtF,GAAQ4I,eAAe7D,GAAqB/E,EAAO4I,eACnD5I,GAAQ8B,WAAWmD,GAAkBjF,EAAO8B,WAC5C9B,GAAQ6I,gBAAgB1D,GAAanF,EAAO6I,gBAEhDtD,GAAUD,GAERD,GADEsD,GAAsB,IAAT5I,EACPqF,EAEC0D,GAAa,IAAIA,KAAa1D,IAEzCwB,GAA6B,CAAExB,KAAM,GAAIE,OAAQ,IACjDwB,GAAuB,CAAE1B,KAAM,GAAIE,OAAQ,IAC3C0B,GAAwB,CAAE5B,KAAM,GAAIE,OAAQ,IAC5CkB,IAA6B,GAC7Bf,GAAc1F,EAAO,GAAK0I,GAC1B7C,IAAsB,GACtBE,IAAW,GAEP0C,EAAarK,SAAWkI,GAAmB,CAC7C,IAAI0C,EAMJ,GALIzD,GAAU,GAAKZ,GAAU,EAC3BqE,EAAUrE,GAAU,EACXY,EAAS,IAAMZ,GAAU,KAClCqE,EAAUrE,GAAU,QAEN/F,IAAZoK,EAAuB,CACzBpE,GAAWoE,GACX,MAAM3M,EAAQ,IAAI0L,YAAY,aAAc,CAAEV,OAAQ2B,IACtDvB,SAASK,cAAczL,EACzB,CACF,CAEAkK,IAAqB,GACR,IAATvG,GAAYvC,OAAOwL,SAAS,EAAG,GDvKhBC,GACvB5K,QACAD,gBACAd,YACAoH,UACA9G,oBACAC,uBACAN,oBACAO,oBACAC,oBACAC,eACAoE,WACA2D,eACAC,kBACA9H,kBAEA,MAAMgL,EAAc,IAAIzG,gBACpBpE,GAAO6K,EAAYC,IAAI,QAAS9K,GAChCD,GAAiBgE,GAAU8G,EAAYC,IAAI,SAAU/K,GACrDd,GAAW4L,EAAYC,IAAI,YAAa,CAAC7L,EAAUgD,IAAKhD,EAAUiD,KAAKtB,KAAK,MAC5ErB,EAAkBpC,QAAQ0N,EAAYC,IAAI,YAAavL,EAAkBqB,KAAK,MAC9EpB,EAAqBrC,QAAQ0N,EAAYC,IAAI,eAAgBtL,EAAqBoB,KAAK,MACvF1B,EAAkB/B,QAAQ0N,EAAYC,IAAI,YAAa5L,EAAkB0B,KAAK,MAC9EnB,GAAmBoL,EAAYC,IAAI,cAAerL,GAClDC,EAAkBvC,QAAQ0N,EAAYC,IAAI,YAAapL,EAAkBkB,KAAK,MAC9EjB,EAAaxC,QAAQ0N,EAAYC,IAAI,OAAQnL,EAAaiB,KAAK,MAC/DyF,GAASwE,EAAYC,IAAI,UAAWzE,GACpCxG,GAAagL,EAAYC,IAAI,cAAejL,EAAYe,KAAK,MAE3C,IAAIwD,gBAAgBjF,OAAO6B,SAASoB,QACxC2I,IAAI,UAAUF,EAAYC,IAAI,QAAS,QAErDpD,EACFC,GAAgB,GAIlBxI,OAAO6L,QAAQC,UACb,CAAEC,YAAaL,EAAYM,YAC3B,GACC,wBAAuBN,EAAYM,aACrC,ECgIGP,CAAU,CACR5K,QACAD,gBACAd,YACAY,cACAwG,WACA9G,oBACAC,uBACAN,oBACAO,oBACAC,oBACAC,gBACAoE,WACA2D,gBACAC,oBACA,GACF,GACD,CACD3H,EACAH,EACAE,EACAR,EACAC,EACAN,EACAQ,EACAC,GACAV,EACAa,GACAL,EACAG,MAGFsE,EAAAA,EAAAA,YAAU,KACR,MAAMkH,EAAqB,CACzB7K,QAAS,+CACTH,YAAa,KAGf,GAAIP,EACFuL,EAAmBvJ,kBAAoB,CAAChC,OACnC,KAAIZ,IAAac,EAItB,OAHAqL,EAAmBpJ,aAAgB,GAAE/C,EAAUgD,OAAOhD,EAAUiD,MAChEkJ,EAAmBtJ,aAA+B,KAAhB/B,CAGpC,CAEAoD,EAAYf,OAAO,GAAIgJ,GAAoB/I,MAAK,EAAG0E,WACjD,MAAMxK,EAASwK,EAAKsE,QAAO,CAACC,EAAKxQ,KAC/BA,EAAIyQ,WAAWC,SAAS9K,IACtB4K,EAAI5K,GAAW4K,EAAI5K,GAAW4K,EAAI5K,GAAW,EAAI,CAAC,IAE7C4K,IACN,CAAC,GACJ9E,GAAkBjK,EAAO,GACzB,GACD,CAACsD,KAEJqE,EAAAA,EAAAA,YAAU,KACR,IAAgB,IAAZsD,GAAmB,CACrB,MAAMiE,EAAUC,YAAW,KACzB,MAAMC,EAAsBC,eAAe1G,QAAQ,mBAAqB,EACxE0G,eAAeC,WAAW,kBAC1B1M,OAAOwL,SAAS,EAAGnG,SAASmH,EAAqB,IAAI,GACpD,KAEH,MAAO,IAAMG,aAAaL,EAC5B,IACC,CAACjE,KAEJ,MAMMuE,IAAeC,EAAAA,EAAAA,cAAY,KAC/BrG,EAAS,IACTI,EAAqB,IACrBC,EAAwB,IACxBC,EAAqB,CAAC,SAAU,OAAQ,YACxCC,GAAqB,GACrBC,GAAqB,IACrBC,GAAgB,IAChBmC,GAA6B,CAAExB,KAAM,GAAIE,OAAQ,IACjDwB,GAAuB,CAAE1B,KAAM,GAAIE,OAAQ,IAC3C0B,GAAwB,CAAE5B,KAAM,GAAIE,OAAQ,IAC5CkC,SAASK,cAAc,IAAIC,YAAY,qBACvCtK,OAAOwL,SAAS,EAAG,EAAE,GACpB,IAEGR,GAAe,CACnB7K,cACAC,oBACAC,uBACAN,oBACAO,oBACAC,oBACAC,gBACAC,eACAC,cACAC,WACAC,gBACAd,YACAD,WACAgB,SA4DF,OACErE,EAAAA,cAACkH,EAAkBoJ,SAAQ,CACzBpO,MAAO,CACLkC,gBACA6F,mBACA7B,WACA/E,WACAsE,oBACAC,eACAE,YACAC,OACA1D,QACA2F,WACApG,oBACAwG,uBACAvG,uBACAwG,0BACA9G,oBACA+G,uBACAvG,oBACAyG,wBACAxG,gBACAyG,mBACA8F,gBAlVkB,CAAC,SAAU,OAAQ,WAmVrCpM,WACA8B,eACA3C,YACA4G,eACAQ,WACAC,cACAzG,cACAiG,iBACAS,kBACAE,qBACAE,kBACAE,aACAE,QACAE,UACAzD,gBACA/D,oBACAyG,uBACAiB,cACAK,WACA2E,SA1IWA,KACX7E,KACJD,IAAgB+E,GAASA,EAAO,IAChC7E,IAAsB,GAAK,EAwIvBwE,gBACAjE,sBACAQ,6BACAC,gCACAC,uBACAC,0BACAC,wBACAC,2BACA0D,2BA7G6BA,KACjC,MAAMC,EAAkB,IAAKnC,GAAclK,cAAc,EAAMG,YAAa,GAAIR,YAAa,GAC7F2I,IAA8BgE,IAAK,IAAWA,EAAOC,UAAU,MAC/DnN,EAAciN,GAAkB1C,IAC9B,GAAIA,EAAS3C,OAAS,EAAG,CACvB,MAAMwF,EAAUC,IAAa9C,EAAS7C,KAAMA,GAAM,YAClDwB,GAA6B,CAAExB,KAAM0F,EAASxF,OAAQwF,EAAQtP,OAAQqP,UAAU,EAAOG,gBAAgB,GACzG,MACEpE,GAA6B,CAAExB,KAAM,GAAIE,OAAQ,EAAGuF,UAAU,EAAOG,gBAAgB,GACvF,GACA,EAoGEC,qBAjGuBA,KAC3B,MAAMN,EAAkB,IACnBnC,GACHtK,YAAa0C,EAAsB4H,GAAalL,UAAWkL,GAAatK,aACxEE,cAA4C,EAA7BoK,GAAapK,cAC5BK,YAAa,GACbR,YAAa,GAEf6I,IAAwB8D,IAAK,IAAWA,EAAOC,UAAU,MACzDnN,EAAciN,GAAkB1C,IAC9B,GAAIA,EAAS3C,OAAS,EAAG,CACvB,MAAMwF,EAAUC,IAAa9C,EAAS7C,KAAMA,GAAM,YAClD0B,GAAuB,CAAE1B,KAAM0F,EAASxF,OAAQwF,EAAQtP,OAAQqP,UAAU,EAAOG,gBAAgB,GACnG,MACElE,GAAuB,CAAE1B,KAAM,GAAIE,OAAQ,EAAGuF,UAAU,EAAOG,gBAAgB,GACjF,GACA,EAkFEE,sBA/EwBA,KAC5B,MAAM3M,EAAoBoD,EACvBrF,QAAQyC,GAAYA,EAAQoM,eAC5BxO,KAAKoC,GAAa,kBAAiBA,EAAQqM,UAC3CnM,KAAK,SACFoM,EAAsB,IACvB7C,GACHjL,kBAAmB,CAAC,WACpBgB,oBACAC,iBAAiB,EACjBC,YAAa,GACbR,YAAa,GAGf+I,IAAyB4D,IAAK,IAAWA,EAAOC,UAAU,MAC1DnN,EAAc2N,GAAsBpD,IAClC,GAAIA,EAAS3C,OAAS,EAAG,CACvB,MAAMwF,EAAUC,IAAa9C,EAAS7C,KAAMA,GAAM,YAClD4B,GAAwB,CAAE5B,KAAM0F,EAASxF,OAAQwF,EAAQtP,OAAQqP,UAAU,EAAOG,gBAAgB,GACpG,MACEhE,GAAwB,CAAE5B,KAAM,GAAIE,OAAQ,EAAGuF,UAAU,EAAOG,gBAAgB,GAClF,GACA,EA0DEzE,6BACAC,gCACAC,aAEDhN,EAC0B,EAIpB6R,EAAuBA,KAAMC,EAAAA,EAAAA,YAAWrK,GCrd/CsK,EAAwBA,KAC5B,MAAM,aAAE5J,EAAY,wBAAEyC,EAAuB,qBAAExG,EAAoB,kBAAEiH,GAAsBwG,KACpFtQ,EAAeC,IAAoBC,EAAAA,EAAAA,UAAS0G,IAC5C6J,EAAUC,IAAexQ,EAAAA,EAAAA,UAAS,IAClCG,EAAaC,IAAkBJ,EAAAA,EAAAA,UAAS,IACzCK,EAAoBP,EAAcQ,OAAS,EAE3CmQ,EAAoB3Q,EACvBsB,QAAQC,GAA0B,KAAhBlB,IAAsByJ,GAAoBA,EAAkBvI,GAAQ,IACtFqP,MAAK,CAACC,EAAGC,KACR,MAAMC,EAAYlO,EAAqB7E,SAAS6S,GAAK,EAAI,EACnDG,EAAYnO,EAAqB7E,SAAS8S,GAAK,EAAI,EAEzD,OAAIC,IAAcC,EAAkBA,EAAYD,EAE5CjH,GACMA,EAAkBgH,IAAM,IAAMhH,EAAkB+G,IAAM,GAEvDA,EAAEI,cAAcH,EACzB,IAGJ,OACE9R,EAAAA,cAAAA,EAAAA,SAAA,KACEA,EAAAA,cAACyB,EAAAA,GAAW,CACVC,KAAK,SACLC,aAAa,MACbC,YAAY,MACZC,eAAe,MACfC,YAAY,EACZC,UAAW,IACXC,mBAAmB,SACnBC,mBAAmB,yDACnBC,MAAOb,EACPc,SAAWC,IACT,MAAMC,EAAWuF,EAAatF,QAAQC,GAASA,EAAKC,cAAcxD,SAASoD,EAAMK,OAAOP,MAAMM,iBAC9FvB,EAAiBoB,GACjBf,EAAec,EAAMK,OAAOP,MAAM,IAGtClC,EAAAA,cAAA,MAAIJ,UAAU,8BACX+R,EAAkBjP,MAAM,EAAG+O,GAAU9O,KAAKJ,GACzCvC,EAAAA,cAAA,MAAI4C,IAAKL,GACPvC,EAAAA,cAAC6C,EAAAA,GAAQ,CACPC,GAAK,gBAAeP,IACpB3C,UAAU,OACVmD,QAASc,EAAqB7E,SAASuD,GACvCJ,SAAUA,KACRkI,GAAyBrH,GACnBA,EAAUhE,SAASuD,GACdS,EAAUV,QAAQW,GAAaA,IAAaV,IAE5C,IAAIS,EAAWT,IAExB,EAEJW,MACE4H,GAAqBA,EAAkBvI,GAAQ,EAC1C,GAAEA,MAASuI,EAAkBvI,GAAQ,GAAK,MAAQuI,EAAkBvI,MACrEA,QAMbhB,GACCvB,EAAAA,cAAA,UACEK,QAASA,IAAOoR,EAAWE,EAAkBnQ,OAASkQ,EAAYD,EAAW,IAAMC,EAAY,GAC/F9R,UAAU,8BACT6R,EAAWE,EAAkBnQ,OAAS,eAAiB,YAG3D,EAIP,OAAe2B,EAAAA,EAAAA,MAAKqO,GCrCpB,MA7BwBU,KACtB,MAAM,gBAAE3B,EAAe,kBAAEhN,EAAiB,qBAAE+G,GAAyBgH,IAErE,OACEtR,EAAAA,cAAAA,EAAAA,SAAA,KACEA,EAAAA,cAAA,MAAIJ,UAAU,4BACX2Q,EAAgB5N,KAAKJ,IACpBvC,SAAAA,cAAA,MAAI4C,IAAKL,GACPvC,EAAAA,cAAC6C,EAAAA,GAAQ,CACPjD,UAAU,OACVmD,QAASQ,EAAkBvE,SAASuD,GACpCJ,SAAUA,KACRmI,GAAsB6H,GAChBA,EAAUnT,SAASuD,GACd4P,EAAU7P,QAAQ+C,GAAaA,IAAa9C,IAE5C,IAAI4P,EAAW5P,IAExB,EAEJW,OA9BQmC,EA8BY9C,EA7Bf,WAAb8C,EACK,gBACe,SAAbA,EACF,aACe,YAAbA,EACF,eADF,MALaA,KAiCb,KAEF,E,WCtBP,MAhBwB+M,EAAGC,QAAO5S,WAAU6S,YAAW,MACrD,MAAOC,EAAYC,IAAiBtR,EAAAA,EAAAA,UAASoR,GAE7C,OACEtS,EAAAA,cAAA,OAAKJ,UAAU,QACbI,EAAAA,cAAA,UACEK,QAASA,IAAMmS,GAAeD,GAC9B3S,UAAU,2DACVI,EAAAA,cAAA,YAAOqS,GACPrS,EAAAA,cAAA,YAAOuS,EAAavS,EAAAA,cAACyS,EAAAA,EAAa,CAAC7S,UAAU,YAAeI,EAAAA,cAAC0S,EAAAA,EAAe,CAAC9S,UAAU,cAEzFI,EAAAA,cAAA,OAAKJ,UAAW2S,EAAa,GAAK,UAAW9S,GACzC,E,iCC+KV,MApLyBkT,KACvB,MAAM,kBAAEhL,EAAiB,kBAAE/D,EAAiB,qBAAEwG,EAAoB,qBAAEE,EAAoB,eAAEM,GACxF0G,IAEIsB,EAAoBjL,EAAkBhF,KAAKoC,GAAYA,EAAQqM,QAC9DyB,EAA2BC,IAAgC5R,EAAAA,EAAAA,UAAS0R,IACpEG,EAA2BC,IAAgC9R,EAAAA,EAAAA,UARnC,GASzB+R,EAA4BL,EAAkBpR,OATrB,EAWzB0R,EAAmBvL,EAAkBrF,QAAQyC,IAAaA,EAAQoM,eAAcxO,KAAKoC,GAAYA,EAAQqM,QACxG+B,EAA0BC,IAA+BlS,EAAAA,EAAAA,UAASgS,IAClEG,EAA0BC,IAA+BpS,EAAAA,EAAAA,UAbjC,GAczBqS,EAA2BL,EAAiB1R,OAdnB,GAgBxBH,EAAaC,IAAkBJ,EAAAA,EAAAA,UAAS,IAEzCsS,EAAgB7L,EAAkB+H,QAAO,CAACC,EAAK5K,KACnD4K,EAAI5K,EAAQqM,MAAQrM,EAAQ0O,MACrB9D,IACN,CAAC,GAEE+D,EAAyBb,EAC5BvQ,QAAQC,KAAWqI,EAAerI,IAASqB,EAAkB5E,SAASuD,EAAO,iBAAmC,KAAhBlB,IAChGuQ,MAAK,CAACC,EAAGC,KACR,MAAMC,EAAYnO,EAAkB5E,SAAS6S,EAAI,gBAAkB,EAAI,EACjEG,EAAYpO,EAAkB5E,SAAS8S,EAAI,gBAAkB,EAAI,EAEvE,OAAIC,IAAcC,EAAkBA,EAAYD,GAExCnH,EAAekH,IAAM,IAAMlH,EAAeiH,IAAM,EAAE,IAGxD8B,EAAwBR,EAC3B7Q,QAAQC,KAAWiR,EAAcjR,KACjCqP,MAAK,CAACC,EAAGC,KACR,MAAMC,EAAYnO,EAAkB5E,SAAS6S,EAAI,cAAgB,EAAI,EAC/DG,EAAYpO,EAAkB5E,SAAS8S,EAAI,cAAgB,EAAI,EAErE,OAAIC,IAAcC,EAAkBA,EAAYD,GAExCyB,EAAc1B,IAAM,IAAM0B,EAAc3B,IAAM,EAAE,IAEzDnP,MAAM,EAAG2Q,GAEZ,OACErT,EAAAA,cAAAA,EAAAA,SAAA,KACEA,EAAAA,cAACyB,EAAAA,GAAW,CACVC,KAAK,SACLC,aAAa,MACbC,YAAY,MACZC,eAAe,MACfC,YAAY,EACZC,UAAW,IACXC,mBAAmB,SACnBC,mBAAmB,sDACnBC,MAAOb,EACPc,SAAWC,IACTd,EAAec,EAAMK,OAAOP,OAC5B,MAAM0R,EAAsBV,EAAiB5Q,QAAQyC,GACnDA,EAAQvC,cAAcxD,SAASoD,EAAMK,OAAOP,MAAMM,iBAEpD4Q,EAA4BQ,GAE5B,MAAMC,EAAuBjB,EAAkBtQ,QAAQyC,GACrDA,EAAQvC,cAAcxD,SAASoD,EAAMK,OAAOP,MAAMM,iBAEpDsQ,EAA6Be,EAAqB,IAGtD7T,EAAAA,cAAAA,EAAAA,SAAA,KACEA,EAAAA,cAAC8T,EAAAA,EAAU,CAACC,QAAQ,iBAAiBC,GAAG,KAAKpU,UAAU,gCAA+B,YAEpFI,EAAAA,cAACiU,EAAAA,EAAU,CAACrU,UAAU,aAExBI,EAAAA,cAAA,MAAIJ,UAAU,8BACX8T,EAAuBhR,MAAM,EAAGqQ,GAA2BpQ,KAAKJ,IAC/D,MAAMkR,EAAQ7I,EAAerI,IAAS,EAChC2R,EAAiB3R,EAAO,eAE9B,OACEvC,EAAAA,cAAA,MAAI4C,IAAKL,GACPvC,EAAAA,cAAC6C,EAAAA,GAAQ,CACPC,GAAK,sBAAqBP,IAC1B3C,UAAU,OACVmD,QAASa,EAAkB5E,SAASkV,GACpC/R,SAAUA,KACR,GAAIyB,EAAkB5E,SAASkV,GAAiB,CAC9C,MAAMC,EAAoBvQ,EAAkBtB,QAAQyC,GAAYA,IAAYmP,IACU,IAAlFC,EAAkB7R,QAAQyC,GAAYA,EAAQ/F,SAAS,iBAAgBwC,QACzE8I,EAAqB,CAAC,SAAU,OAAQ,YAE1CF,EAAqB+J,EACvB,KAAO,CACL7J,EAAqB,CAAC,SAAU,SAChC,MAAM8J,EAAe,IAAIxQ,EAAmBsQ,GACxCtQ,EAAkBtB,QAAQyC,GAAYA,EAAQ/F,SAAS,eAAcwC,OAAS,EAChF4I,EAAqBgK,EAAa9R,QAAQyC,IAAaA,EAAQ/F,SAAS,gBAExEoL,EAAqBgK,EAEzB,GAEFlR,MAAQ,GAAEX,MAASkR,EAAQ,GAAK,MAAQA,OAEvC,IAG0B,IAAlCC,EAAuBlS,QAAgBxB,EAAAA,cAAA,UAAI,wBAE7CiT,GAA6BS,EAAuBlS,OAAS,GAC5DxB,EAAAA,cAAA,UACEK,QAASA,KACP2S,EACED,EAA4BW,EAAuBlS,OAC/CuR,EAA4B,GApHf,EAsHlB,EAEHnT,UAAU,8BACTmT,EAA4BW,EAAuBlS,OAAS,eAAiB,aAIpFxB,EAAAA,cAAC8T,EAAAA,EAAU,CAACC,QAAQ,iBAAiBC,GAAG,KAAKpU,UAAU,gCAA+B,UAEpFI,EAAAA,cAACqU,EAAAA,EAAe,CAACzU,UAAU,aAE7BI,EAAAA,cAAA,MAAIJ,UAAU,8BACX+T,EAAsBhR,KAAKJ,IAC1B,MAAM2R,EAAiB3R,EAAO,aAE9B,OACEvC,EAAAA,cAAA,MAAI4C,IAAKL,GACPvC,EAAAA,cAAC6C,EAAAA,GAAQ,CACPC,GAAK,oBAAmBP,IACxB3C,UAAU,OACVmD,QAASa,EAAkB5E,SAASkV,GACpC/R,SAAUA,KACR,GAAIyB,EAAkB5E,SAASkV,GAAiB,CAC9C,MAAMC,EAAoBvQ,EAAkBtB,QAAQyC,GAAYA,IAAYmP,IACQ,IAAhFC,EAAkB7R,QAAQyC,GAAYA,EAAQ/F,SAAS,eAAcwC,QACvE8I,EAAqB,CAAC,SAAU,OAAQ,YAE1CF,EAAqB+J,EACvB,KAAO,CACL7J,EAAqB,CAAC,YACtB,MAAM8J,EAAe,IAAIxQ,EAAmBsQ,GACxCtQ,EAAkBtB,QAAQyC,GAAYA,EAAQ/F,SAAS,iBAAgBwC,OAAS,EAClF4I,EAAqBgK,EAAa9R,QAAQyC,IAAaA,EAAQ/F,SAAS,kBAExEoL,EAAqBgK,EAEzB,GAEFlR,MACEX,GAAQiR,EAAcjR,GAAS,KAAIiR,EAAcjR,GAAQ,GAAK,MAAQiR,EAAcjR,MAAW,UAGhG,IAGyB,IAAjCoR,EAAsBnS,QAAgBxB,EAAAA,cAAA,UAAI,wBAE5CuT,GAA4BI,EAAsBnS,OAAS,GAC1DxB,EAAAA,cAAA,UACEK,QAASA,KACPiT,EACED,EAA2BF,EAAyB3R,OAChD6R,EAA2B,GA1KZ,EA4KpB,EAEHzT,UAAU,8BACTyT,EAA2BF,EAAyB3R,OAAS,eAAiB,YAGlF,EC7KP,MAAM8S,EAAgB,CACpB,CAAEpS,MAAO,EAAGgB,MAAO,OACnB,CAAEhB,MAAO,EAAGgB,MAAO,OACnB,CAAEhB,MAAO,GAAIgB,MAAO,QACpB,CAAEhB,MAAO,GAAIgB,MAAO,QACpB,CAAEhB,MAAO,GAAIgB,MAAO,QACpB,CAAEhB,MAAO,IAAKgB,MAAO,UA8FvB,MA3FuBqR,KACrB,MAAM,cACJnQ,EAAa,iBACb6F,EAAgB,SAChB5G,EAAQ,kBACRS,EAAiB,qBACjByG,EAAoB,kBACpB3G,EAAiB,qBACjBC,EAAoB,UACpBiE,EAAS,kBACT/D,EAAiB,qBACjByG,EAAoB,eACpBQ,EAAc,KACdjD,EAAI,aACJ/D,EAAY,gBACZyG,EAAe,UACfS,EAAS,aACTkF,GACEkB,IAEEkD,GACH1Q,GAC4B,IAA7BF,EAAkBpC,QACc,IAAhCqC,EAAqBrC,QACG,IAAxBwC,EAAaxC,QACgB,IAA7BuC,EAAkBvC,OAEpB,OACExB,EAAAA,cAAAA,EAAAA,SAAA,MACIwU,GACAxU,EAAAA,cAACyU,EAAAA,GAAM,CAAC/S,KAAK,WAAW9B,UAAU,wBAAwBS,QAAS+P,GAAc,iBAInFpQ,EAAAA,cAAA,OAAKJ,UAAU,yDACbI,EAAAA,cAAC0U,EAAAA,GAAK,CAAC9U,UAAU,YAAY+U,QAAQ,uBAAsB,uBAG3D3U,EAAAA,cAAC4U,EAAAA,GAAM,CACL9R,GAAG,sBACHC,QAASe,EACT3B,SAAUA,IAAMoI,GAAsBzG,MAG1C9D,EAAAA,cAACoS,EAAe,CAACC,MAAM,qBACrBrS,EAAAA,cAAC2S,EAAgB,OAEnB3S,EAAAA,cAACoS,EAAe,CAACC,MAAM,0BACrBrS,EAAAA,cAACwR,EAAqB,OAExBxR,EAAAA,cAACoS,EAAe,CAACC,MAAM,uBACrBrS,EAAAA,cAACkS,EAAe,OAEjB7O,GACCrD,EAAAA,cAACoS,EAAe,CAACC,MAAM,6BACrBrS,EAAAA,cAAA,OAAKJ,UAAU,4BACZ0U,EAAc3R,KAAKkS,GAClB7U,EAAAA,cAAC8U,EAAAA,EAAc,CACbhS,GAAK,kBAAiB+R,EAAK3S,QAC3BU,IAAM,kBAAiBiS,EAAK3S,QAC5BA,MAAO2S,EAAK3S,MACZkP,KAAK,SACLlO,MAAO2R,EAAK3R,MACZH,QAASqB,IAAkByQ,EAAK3S,MAChCC,SAAUA,IAAM8H,EAAiB4K,EAAK3S,aAMhDlC,EAAAA,cAACoS,EAAe,CAACC,MAAM,mBAAmBC,SAAUvO,EAAkBvC,OAAS,GAC7ExB,EAAAA,cAACQ,EAAS,CACRC,MAAOqH,EACPnH,iBAAkB6J,EAClB9J,cAAeqD,EACfnD,OAAQoK,KAGZhL,EAAAA,cAACoS,EAAe,CAACC,MAAM,gBAAgBC,SAAUtO,EAAaxC,OAAS,GACrExB,EAAAA,cAACQ,EAAS,CACRC,MAAOsH,EACPpH,iBAAkB8J,EAClB/J,cAAesD,EACfpD,OAAQsK,EACRnK,eAAe,KAGlB,E,WC3FP,MAZyBgU,EAAGC,eAC1BhV,EAAAA,cAAA,OAAKJ,UAAU,0EACbI,EAAAA,cAACiV,EAAAA,GAAW,CAACrV,UAAU,iCAAiCS,QAAS2U,IACjEhV,EAAAA,cAAC8T,EAAAA,EAAU,CAACC,QAAQ,KAAKC,GAAG,MAAK,0EAGjChU,EAAAA,cAACkV,EAAAA,GAAU,CAACtV,UAAU,OAAOuV,KAAK,QAAO,c,+BCyH7C,MA9HoBC,KAClB,MAAM,UAAE9R,EAAS,aAAE4G,EAAY,eAAEC,EAAc,QAAEO,EAAO,WAAEC,EAAU,YAAEzG,EAAW,QAAEuI,GAAY6E,KACxF3O,EAAK0S,IAAUnU,EAAAA,EAAAA,UAAS,MAyH/B,OAvHAqH,EAAAA,EAAAA,YAAU,MACRkF,iBACE,MAAM,IAAE6H,SAAc9R,OAAOkK,OAAOC,KAAKC,cAAc,QACjDjL,EAAM,IAAI2S,EAAI9H,SAAS+H,eAAe,OAAQ,CAClDC,OAAQlS,EACRmS,KAAM/K,EACNgL,kBAAkB,EAClBC,aAAa,EACbC,MAAO,qBAGT,IAAIC,GAAc,EAElBrS,OAAOkK,OAAOC,KAAKvL,MAAM0T,gBAAgBnT,EAAK,eAAe,WAC3DA,EAAIoT,QAAQrL,GACZ/H,EAAIqT,YACF,OACAC,KAAS,KACP,MAAMC,EAAYvT,EAAIwT,YAAYC,eAC5BC,EAAY1T,EAAIwT,YAAYG,eAC5BC,EAAiB,CAACL,EAAU5P,MAAO4P,EAAU3P,MAAO8P,EAAU/P,MAAO+P,EAAU9P,OACjF8C,KAAKiE,UAAUiJ,KAAoBlN,KAAKiE,UAAUpJ,IACpDiG,EAAeoM,GAGjB,MAAMC,EAAY7T,EAAI8T,YACtB,GAAID,EAAUlQ,QAAUhD,EAAUgD,KAAOkQ,EAAUjQ,QAAUjD,EAAUiD,SAEhE,CACL,MAAMmQ,EAAkB,CAAEpQ,IAAKkQ,EAAUlQ,MAAOC,IAAKiQ,EAAUjQ,OAC/D6C,aAAaiE,QAAQ,YAAahE,KAAKiE,UAAUoJ,IACjDxM,EAAawM,EACf,CAEA/L,EAAWhI,EAAIgU,WACXd,KACFe,EAAAA,EAAAA,IAAyB,CAACJ,EAAUlQ,MAAOkQ,EAAUjQ,QACrDsP,GAAc,EAChB,GACC,KAEP,IAEAR,EAAO1S,GACP6K,SAASK,cAAc,IAAIC,YAAY,sBACzC,CAEA+I,EAAS,GACR,KAEHtO,EAAAA,EAAAA,YAAU,KACR,IAAK5F,EAAK,OAEV,MAAMuK,EAAkBC,IACtBmB,QAAQwI,IAAI,qBAAsB3J,EAAEC,QACpCzK,EAAIoU,UAAU5J,EAAEC,QAChBzK,EAAIoT,QAAQ,IAEZ,MAAMG,EAAYvT,EAAIwT,YAAYC,eAC5BC,EAAY1T,EAAIwT,YAAYG,eAC5BC,EAAiB,CAACL,EAAU5P,MAAO4P,EAAU3P,MAAO8P,EAAU/P,MAAO+P,EAAU9P,OACrF4D,EAAeoM,EAAe,EAG1BS,EAAgB7J,IACpBmB,QAAQwI,IAAI,mBAAoB3J,EAAEC,QAClCzK,EAAIoT,QAAQ5I,EAAEC,QAEd,MAAM8I,EAAYvT,EAAIwT,YAAYC,eAC5BC,EAAY1T,EAAIwT,YAAYG,eAC5BC,EAAiB,CAACL,EAAU5P,MAAO4P,EAAU3P,MAAO8P,EAAU/P,MAAO+P,EAAU9P,OACjF8C,KAAKiE,UAAUiJ,KAAoBlN,KAAKiE,UAAUpJ,IACpDiG,EAAeoM,EACjB,EAMF,OAHA/I,SAASD,iBAAiB,eAAgBL,GAC1CM,SAASD,iBAAiB,aAAcyJ,GAEjC,KACLxJ,SAASe,oBAAoB,eAAgBrB,GAC7CM,SAASe,oBAAoB,aAAcyI,EAAa,CACzD,GACA,CAACrU,KAEJ4F,EAAAA,EAAAA,YAAU,KA6BJ/E,OAAOkK,QAAU/K,GAAO8J,GA5B5BgB,iBACE,MAAM,sBAAEwJ,EAAqB,WAAEC,SAAqB1T,OAAOkK,OAAOC,KAAKC,cAAc,UAErF3N,OAAOkX,QAAQ1K,GAASoD,SAAStN,IAC/B,MAAM6U,EAAM7U,EAAK,GACX8U,EAAgB,IAAIH,EAAW,CACnCI,WAAY,UACZC,YAAa,UACbC,WAAY,8BAERC,EAAS,IAAIR,EAAsB,CACvCS,SAAU,CAAEpR,IAAK8Q,EAAI9Q,IAAKC,IAAK6Q,EAAI7Q,KACnCoR,QAASN,EAAcO,QACvBvF,MAAO+E,EAAIhG,KACXtO,GAAK,UAASsU,EAAIvY,OAClB8D,QAEF8U,EAAOzB,YAAY,SAAU7I,IAC3BA,EAAE0K,SAASC,iBACX,MAAMC,EAAavK,SAAS+H,eAAe6B,EAAIvY,MAC/CkZ,GAAYC,eAAe,CAAEC,SAAU,WACvCF,GAAYG,OAAO,IAErBd,EAAIC,cAAgBA,EACpBD,EAAIK,OAASA,CAAM,GAEvB,CAGEU,EACF,GACC,CAACxV,EAAK8J,IAEFzM,EAAAA,cAAA,OAAK8C,GAAG,MAAMlD,UAAU,iBAAkB,EC/GnD,MAbyBwY,EAAGpD,eAC1BhV,EAAAA,cAAA,OAAKJ,UAAU,iEACbI,EAAAA,cAACiV,EAAAA,GAAW,CAACrV,UAAU,iCAAiCS,QAAS2U,IACjEhV,EAAAA,cAAC8T,EAAAA,EAAU,CAACC,QAAQ,KAAKC,GAAG,MAAK,wFAGjChU,EAAAA,cAAA,OAAKJ,UAAU,QAAO,2EACtBI,EAAAA,cAACkV,EAAAA,GAAU,CAACtV,UAAU,OAAOuV,KAAK,gBAAe,iB,sBCFrD,MAaMkD,EAAgBA,EAAGlZ,SACvBa,EAAAA,cAAA,OAAKJ,UAAU,gCACbI,EAAAA,cAACsY,EAAAA,EAAQ,CAAC1Y,UAAU,wBACpBI,EAAAA,cAAA,QAAMJ,UAAU,aAAqC,IAAxBT,EAAIoZ,gBAAwB,MAAQpZ,EAAIoZ,iBACrEvY,EAAAA,cAAA,QAAMJ,UAAU,sCAAsCT,EAAIqZ,cAAc,sBAItEC,GAAkBA,EAAGC,cACzB1Y,EAAAA,cAAA,OAAKJ,UAAU,uBACZ8Y,EAAS/V,KAAKgW,GACb3Y,EAAAA,cAAA,OAAK4C,IAAK+V,EAAQ7V,IAChB9C,EAAAA,cAAA,OAAKJ,UAAU,aACbI,EAAAA,cAAA,OAAKJ,UAAU,eAAegZ,wBAAyB,CAAEC,OAAQF,EAAQvH,SAE3EpR,EAAAA,cAAA,OAAKJ,UAAU,WACbI,EAAAA,cAAA,YA7BY8Y,KACpB,GAAc,IAAVA,EACF,MAAO,OACF,CACL,MAAMC,EAAUD,EAAQ,IACxB,OAAIA,EAAQ,MAAQ,EACV,IAAGC,EAAQC,QAAQ,KAEnB,IAAGD,EAAQC,QAAQ,IAE/B,GAmBeC,CAAaN,EAAQO,eAAqB,IAAClZ,EAAAA,cAAA,QAAMJ,UAAU,aAAY,UAAS,IACvFI,EAAAA,cAAA,YAAO2Y,EAAQnX,OAAO,aAO1B2X,GAAgBA,EAAGha,UACvB,MAAM,qBAAE0E,GAAyByN,IAC3B8H,EAASja,EAAIia,OAAO9W,QAAQ+W,GAAUxV,EAAqB7E,SAASqa,EAAMjI,OAASiI,EAAM5F,MAAQ,IAEvG,OAAsB,IAAlB2F,EAAO5X,OAAqB,KAG9BxB,EAAAA,cAAA,OAAKJ,UAAU,0CACZwZ,EAAO1W,MAAM,EAAG,GAAGC,KAAK0W,GACvBrZ,EAAAA,cAAA,OAAK4C,IAAM,GAAEzD,EAAIma,kBAAkBD,EAAMjI,OAAQxR,UAAU,6CACzDI,EAAAA,cAAA,OACEJ,UAAY,kEACM,IAAhByZ,EAAM5F,MAAc,aAAe,IAErCmF,wBAAyB,CAAEC,OAAQQ,EAAMjI,QAE1CiI,EAAM5F,MAAQ,GACbzT,EAAAA,cAAA,OAAKJ,UAAU,qEAAqEyZ,EAAM5F,UAI5F,EAwIV,OApImB8F,EAAGpa,MAAKqa,gCAA+B,MACxD,MAAM,UAAElW,EAAS,YAAE2C,EAAW,SAAEmC,EAAQ,QAAEqE,GAAY6E,IAChDoH,EAAWvZ,EAAIuZ,SAAS9G,MAAK,CAACC,EAAGC,IAAMD,EAAE6F,SAAW5F,EAAE4F,WAAUhV,MAAM,EAAG,GACzE+W,EAAcrR,EAAW,YAAc,YAEvCsR,EAAWva,EAAIR,KAAKgb,gBAAgBC,OAAOC,KAC5C,2CAA0CJ,KAAeta,EAAIR,KAAKgb,gBAAgBC,OAAOC,OAC1F1a,EAAIR,KAAKmb,MAEPC,EACJ9T,GAA+B,OAAhB9G,EAAI6a,QACf,KACAR,GAAiCra,EAAI8a,eAAejb,SAAS,YAA4C,IAA9BG,EAAI8a,eAAezY,OAC9F,UACC,IAAE0Y,EAAAA,EAAAA,IAAgB5W,EAAUgD,IAAKhD,EAAUiD,IAAKpH,EAAI6a,QAAQ1T,IAAKnH,EAAI6a,QAAQzT,KAAKyS,QAAQ,QAE3FmB,GAAajb,EAAAA,EAAAA,IAA6BC,GAEhD,OACEa,EAAAA,cAAA,KACEK,QAASA,IAAMmD,OAAOyM,eAAe5C,QAAQ,iBAAkB7J,OAAO4W,SACtEtX,GAAI3D,EAAIR,KAAKE,KACbsW,KAAMgF,EACNE,aAAcA,KACZ,MAAM5C,EAAShL,GAAWA,EAAQ6N,OAAOnb,EAAIma,YAAY7B,OACnDJ,EAAgB5K,GAAWA,EAAQ6N,OAAOnb,EAAIma,YAAYjC,cAE3DI,GAAWJ,IAChBI,EAAO8C,OAAS,EAChBlD,EAAcC,WAAa,2BAC3BD,EAAcE,YAAc,2BAA0B,EAExDiD,aAAcA,KACZ,MAAM/C,EAAShL,GAAWA,EAAQ6N,OAAOnb,EAAIma,YAAY7B,OACnDJ,EAAgB5K,GAAWA,EAAQ6N,OAAOnb,EAAIma,YAAYjC,cAE3DI,GAAWJ,IAChBI,EAAO8C,OAAS,EAChBlD,EAAcC,WAAa,UAC3BD,EAAcE,YAAc,UAAS,EAEvC3X,UAAU,6PACVI,EAAAA,cAAA,OAAKJ,UAAU,oCACZ4D,OAAO6B,SAASoB,OAAOzH,SAAS,UAC/BgB,EAAAA,cAAA,OAAKJ,UAAU,0GACbI,EAAAA,cAAA,WAAK,UAAQb,EAAIsb,eACjBza,EAAAA,cAAA,WAAMb,EAAIqZ,cAAc,YACvBrZ,EAAIub,OAAS1a,EAAAA,cAAA,WAAK,iBAAsBb,EAAIwb,SAAW3a,EAAAA,cAAA,WAAK,mBAAwB,MAGzFA,EAAAA,cAAA,OAAKJ,UAAU,uBACXqG,GAAe3C,GAAanE,EAAI6a,SAChCha,EAAAA,cAAA,OAAKJ,UAAU,8HACZma,GAGL/Z,EAAAA,cAAA,OAAKJ,UAAU,yGACbI,EAAAA,cAAA,OACE4a,IAAKlB,EACLmB,IAAK1b,EAAIR,KAAKyS,KACdxR,UAAU,iGACViM,QAAQ,WAGVzD,GACApI,EAAAA,cAAA,OAAKJ,UAAU,6BACZT,EAAI2b,eAAepY,MAAM,EAAG,GAAGC,KAAKoY,GACnC/a,EAAAA,cAAA,OACE4C,IAAKmY,EAAMjY,GACX8X,IAAM,oDAAmDG,EAAMC,iBAAiBC,QAAQpB,OACxFgB,IAAK1b,EAAIR,KAAKyS,KACdxR,UAAU,sDACViM,QAAQ,aAMlB7L,EAAAA,cAAA,OAAKJ,UAAU,mBACbI,EAAAA,cAAA,MAAIJ,UAAU,2BACZI,EAAAA,cAAA,OACEJ,UAAU,4CACVgZ,wBAAyB,CAAEC,OAAQ1Z,EAAIR,KAAKyS,QAE9CpR,EAAAA,cAAA,OAAKJ,UAAU,oBAAoBgb,IAAI,6BAA6BC,IAAI,cAE1E7a,EAAAA,cAAC8T,EAAAA,EAAU,CAACC,QAAQ,KAAKC,GAAG,MAC1BhU,EAAAA,cAAA,OACEJ,UAAU,4CACVgZ,wBAAyB,CAAEC,OAAQ1Z,EAAIR,KAAK0T,UAGhDrS,EAAAA,cAAA,OAAKJ,UAAU,aACbI,EAAAA,cAACqY,EAAa,CAAClZ,IAAKA,IACpBa,EAAAA,cAAA,OAAKJ,UAAU,kBAAkBT,EAAI+b,YACrClb,EAAAA,cAACmb,EAAAA,GAAO,MACRnb,EAAAA,cAACyY,GAAe,CAACC,SAAUA,IAC3B1Y,EAAAA,cAACmZ,GAAa,CAACha,IAAKA,IACpBa,EAAAA,cAAA,OACEJ,UAAU,mCACVgZ,wBAAyB,CAAEC,OAAQ1Z,EAAIic,kBAAoBjc,EAAIkc,eAKvErb,EAAAA,cAAA,OAAKJ,UAAU,mBACbI,EAAAA,cAACqY,EAAa,CAAClZ,IAAKA,IACpBa,EAAAA,cAAA,OAAKJ,UAAU,qCACbI,EAAAA,cAAA,WAAMb,EAAI+b,aACRjV,GAAe3C,GAAanE,EAAI6a,SAChCha,EAAAA,cAAA,OAAKJ,UAAU,uFACZma,IAIP/Z,EAAAA,cAACyY,GAAe,CAACC,SAAUA,IAC3B1Y,EAAAA,cAACmZ,GAAa,CAACha,IAAKA,IACpBa,EAAAA,cAAA,OACEJ,UAAU,mCACVgZ,wBAAyB,CAAEC,OAAQ1Z,EAAIic,kBAAoBjc,EAAIkc,aAGnErb,EAAAA,cAACyU,EAAAA,GAAM,CACL/S,KAAK,YACL9B,UAAU,wGACVuV,KAAMgF,GAAY,gBAGlB,EC3LR,OAVoBmB,EAAG5a,gBAAeC,mBAAkB4a,aACtDvb,EAAAA,cAAAA,EAAAA,SAAA,KACGU,EAAciC,KAAKJ,GAClBvC,EAAAA,cAACO,EAAAA,GAAU,CAACqC,IAAKL,EAAM1C,mBAAoBA,IAAMc,EAAiBD,EAAc4B,QAAQkZ,GAAMA,IAAMjZ,MACjGgZ,GAAWA,EAAQhZ,GAAQgZ,EAAQhZ,GAAQA,EAAKyC,QAAQ,aAAc,QCc/E,MAEMyW,GAAkBA,EAAGpJ,QAAOjH,OAAMsQ,YAAWC,cAAanC,gCAA+B,MAC7F,MAAM,SAAEpR,GAAakJ,IAErB,OACEtR,EAAAA,cAAAA,EAAAA,SAAA,MACIoI,GAAYuT,GAAe3b,EAAAA,cAACmb,EAAAA,GAAO,CAACvb,UAAU,iBAChDI,EAAAA,cAAA,MAAIJ,UAAU,yCAAyCyS,GACvDrS,EAAAA,cAAA,UACGoL,EAAKzI,KAAKxD,GACTa,EAAAA,cAAA,MAAI4C,IAAK8Y,EAAY,IAAMvc,EAAIma,UAC7BtZ,EAAAA,cAACuZ,GAAU,CAACpa,IAAKA,EAAKqa,6BAA8BA,QAIzD,EAIDoC,GAAaA,EAAGC,oBACpB,MAAM,SACJzT,EAAQ,MACR/D,EAAK,SACL2F,EAAQ,cACR5F,EAAa,iBACb6F,EAAgB,kBAChBrG,EAAiB,qBACjBwG,EAAoB,qBACpBvG,EAAoB,wBACpBwG,EAAuB,kBACvB9G,EAAiB,qBACjB+G,EAAoB,kBACpBvG,EAAiB,aACjBC,EAAY,QACZG,EAAO,aACP+F,EAAY,KACZkB,EAAI,OACJE,EAAM,cACNzD,EAAa,WACb2D,EAAU,SACVgF,EAAQ,QACR3E,EAAO,UACPvI,EAAS,mBACT6I,EAAkB,0BAClBQ,EAAyB,oBACzBE,EAAmB,qBACnBE,EAAoB,aACpBqD,EAAY,2BACZM,EAA0B,qBAC1BO,EAAoB,sBACpBC,EAAqB,0BACrB3E,EAAyB,6BACzBC,GACE8E,KAEGwK,EAAoBC,IAAyB7a,EAAAA,EAAAA,WAAS,IACtD8a,EAA2BC,IAAgC/a,EAAAA,EAAAA,WAAS,IACpEgb,EAA2BC,KAAgCjb,EAAAA,EAAAA,WAAS,GACrEkb,IAAcC,EAAAA,EAAAA,QAAO,MACrBC,IAAmBD,EAAAA,EAAAA,QAAO,MAC1BE,IAAmBF,EAAAA,EAAAA,QAAO,MAC1BG,IAAeH,EAAAA,EAAAA,QAAO,OACtB,MAAEnU,KAAUC,EAAAA,EAAAA,KAEZsU,GACJ7Y,EAAkBpC,OAASqC,EAAqBrC,OAASuC,EAAkBvC,OAASwC,EAAaxC,QAEnG+G,EAAAA,EAAAA,YAAU,KACR,GAA4B,OAAxB6T,GAAYM,QAAkB,CAChC,MAAMC,EAAW,IAAIC,sBAAsBzF,IACzCA,EAAQtH,SAASgN,IACXA,EAAMC,iBACHtR,EAEOe,IACVC,GAA6B,GACzBnI,IAAUsI,EAA0BqE,gBAAgBN,IACrB,IAA7BnN,EAAkB/B,QAAgB+B,EAAkBvE,SAAS,aAC5D6N,EAAoBmE,gBAAgBC,IACpClE,EAAqBiE,gBAAgBE,MAN5CV,IASJ,GACA,IAKJ,OAFAmM,EAASI,QAAQX,GAAYM,SAEtB,KACLC,EAASK,YAAY,CAEzB,IACC,CAACxR,EAAYgF,KAEhBjI,EAAAA,EAAAA,YAAU,KACR,MAAM0U,EAAuB9P,GAAMnD,EAASmD,EAAEC,OAAOgE,MAErD5D,SAASD,iBAAiB,oBAAqB0P,GAE7B,OAAd3Z,GACF4G,EAAarC,IACb+O,EAAAA,EAAAA,IAAyB,CAAC/O,EAAcvB,IAAKuB,EAActB,OAClDjD,IACTsT,EAAAA,EAAAA,IAAyB,CAACtT,EAAUgD,IAAKhD,EAAUiD,MAGrD,MAAM2W,EAAWA,KACXX,GAAiBG,SAAWF,GAAaE,UACvClZ,OAAO4W,SAAW,IACpBmC,GAAiBG,QAAQS,MAAMC,IAAM,EACrCb,GAAiBG,QAAQS,MAAME,KAAO,EACtCd,GAAiBG,QAAQS,MAAMG,MAAQ,EACvCf,GAAiBG,QAAQS,MAAMI,YAAc,OAC7ChB,GAAiBG,QAAQS,MAAMK,aAAe,OAC9CjB,GAAiBG,QAAQS,MAAMM,cAAgB,OAC/ClB,GAAiBG,QAAQS,MAAMzF,SAAW,QAC1C6E,GAAiBG,QAAQS,MAAMO,aAAe,yCAC1CtV,IACFoU,GAAaE,QAAQS,MAAMQ,WAAa,WAG1CpB,GAAiBG,QAAQS,MAAMzF,SAAW,SAC1C6E,GAAiBG,QAAQS,MAAMO,aAAe,OAC9CnB,GAAiBG,QAAQS,MAAMI,YAAc,EAC7ChB,GAAiBG,QAAQS,MAAMK,aAAe,EAC9ChB,GAAaE,QAAQS,MAAMQ,WAAa,GAE5C,EAKF,OAFAna,OAAO+J,iBAAiB,SAAU2P,GAE3B,KACL1P,SAASe,oBAAoB,oBAAqB0O,GAClDzZ,OAAO+K,oBAAoB,SAAU2O,EAAS,CAC/C,GACA,KAEH3U,EAAAA,EAAAA,YAAU,KACJL,GAAQ,GAAKA,GAAQ,KACvBsF,SAASoQ,KAAKC,UAAUC,OAAO,wBAC/BtQ,SAASuQ,cAAc,OAAOF,UAAUC,OAAO,WAE/CtQ,SAASoQ,KAAKC,UAAUG,IAAI,wBAC5BxQ,SAASuQ,cAAc,OAAOF,UAAUG,IAAI,SAC9C,GACC,CAAC9V,MAEJK,EAAAA,EAAAA,YAAU,KACa,IAAjB6C,GAAM5J,QAAiB+K,IACzBC,GAA6B,GACzBnI,IAAUsI,EAA0BqE,gBAAgBN,IACrB,IAA7BnN,EAAkB/B,QAAgB+B,EAAkBvE,SAAS,aAC5D6N,EAAoBmE,gBAAgBC,IACpClE,EAAqBiE,gBAAgBE,KAE9C,GACC,CAAC9F,IAEJ,IAAI6S,GACF3S,EAASqB,EAA0BrB,OAASuB,EAAoBvB,OAASyB,EAAqBzB,OAGhG,OAFI2S,GAAkB,KAAIA,GAAkB,OAG1Cje,EAAAA,cAAAA,EAAAA,SAAA,KACEA,EAAAA,cAAA,OAAKke,IAAK1B,IACRxc,EAAAA,cAAA,OACEJ,UAAU,4GACVud,MAAO,CAAEjV,MAzKS,MA0KlBlI,EAAAA,cAACuU,EAAc,OAEjBvU,EAAAA,cAAA,OACEke,IAAK5B,GACL1c,UAAY,6FACVuE,EAAU,wEAA0E,IAEtFgZ,MAAO,CACLgB,WAAY/V,EAAW,EAlLP,IAmLhBF,MAAO/D,EAAU,KAAO,oBAE1BnE,EAAAA,cAAA,OAAKJ,UAAU,8DACbI,EAAAA,cAAA,OAAKJ,UAAU,qBAAqBse,IAAK3B,IACvCvc,EAAAA,cAAA,OAAKJ,UAAU,gDACbI,EAAAA,cAAA,OAAKJ,UAAU,UACZuM,EAAqBnM,EAAAA,cAACoe,EAAAA,EAAiB,MAAMpe,EAAAA,cAACqe,EAAAA,EAAQ,CAACze,UAAU,gBAEpEI,EAAAA,cAACyU,EAAAA,GAAM,CACL/S,KAAM+a,GAAe,EAAI,YAAc,WACvCpc,QAASA,IAAM0b,GAAsB,GACrCnc,UAAU,0CACVI,EAAAA,cAACse,EAAAA,EAAyB,CAAC1e,UAAU,YACrCI,EAAAA,cAAA,YAAQ,WAASyc,GAAe,EAAK,KAAIA,MAAkB,OAG/Dzc,EAAAA,cAAA,OAAKJ,UAAU,oCACZ,CAAC,WAAY,gBAAiB,YAAa,YAAa,eAAe+C,KAAKL,GAC3EtC,EAAAA,cAACyU,EAAAA,GAAM,CACL/S,KAAK,WACLkB,IAAKN,EACLjC,QAASA,IAAM0b,GAAsB,GACrCnc,UAAU,0CACVI,EAAAA,cAAA,YAAOsC,GACPtC,EAAAA,cAAC0S,EAAAA,EAAe,CAAC9S,UAAU,kBAMrCI,EAAAA,cAAA,WACEA,EAAAA,cAAA,OAAKJ,UAAU,qCACbI,EAAAA,cAAA,OAAKJ,UAAU,2DACZyE,GACCrE,EAAAA,cAACO,EAAAA,GAAU,CACTV,mBAAoBA,KAClBmK,EAAS,IACTwD,SAASK,cAAc,IAAIC,YAAY,oBAAoB,GAC1D,IACIzJ,EAAM,KAGjBrE,EAAAA,cAACsb,GAAW,CACV5a,cAAe6C,EACf5C,iBAAkB2J,EAClBiR,QAAS,CACPgD,QAAS,UACTC,OAAQ,gBACRC,KAAM,gBAGTra,GACCpE,EAAAA,cAACO,EAAAA,GAAU,CAACV,mBAAoBA,IAAMoK,EAAiB,OAAO,UACpD7F,EAAc,UAG1BpE,EAAAA,cAACsb,GAAW,CAAC5a,cAAekD,EAAmBjD,iBAAkByJ,IACjEpK,EAAAA,cAACsb,GAAW,CAAC5a,cAAemD,EAAsBlD,iBAAkB0J,MAGxErK,EAAAA,cAAA,UACGoL,GAAMzI,KAAI,CAACxD,EAAKuf,IACf1e,EAAAA,cAACA,EAAAA,SAAc,CAAC4C,IAAKzD,EAAIma,UAChB,IAANoF,IAAY7C,IAAkBG,GAC7Bhc,EAAAA,cAAA,MAAIJ,UAAU,iEACZI,EAAAA,cAAC+U,EAAgB,CAACC,UAAWA,IAAMiH,GAA6B,MAG7D,KAANyC,IAAa7C,IAAkBK,GAC9Blc,EAAAA,cAAA,MAAIJ,UAAU,iEACZI,EAAAA,cAACoY,EAAgB,CAACpD,UAAWA,IAAMmH,IAA6B,MAGpEnc,EAAAA,cAAA,UACEA,EAAAA,cAACuZ,GAAU,CAACpa,IAAKA,QAItBiM,GAAM5J,OAAS,GAAKxB,EAAAA,cAAA,MAAIke,IAAK9B,GAAa,cAAY,UAExDzP,EAA0BrB,OAAS,GAClCtL,EAAAA,cAACyb,GAAe,CACdpJ,MAAQ,GAAE/G,EAAS,EAAI,qBAAuB,gDAAgDjH,IAC9F+G,KAAMuB,EAA0BvB,KAChCsQ,UAAU,eACVC,YAAarQ,EAAS,IAGzBuB,EAAoBvB,OAAS,GAC5BtL,EAAAA,cAACyb,GAAe,CACdpJ,OACiC,IAA/BxF,EAAoBvB,OAAe,wBAA0B,sBADvD,gBAGRF,KAAMyB,EAAoBzB,KAC1BsQ,UAAU,iBACVC,YAAarQ,EAAS,GAAKqB,EAA0BrB,OAAS,IAGjEyB,EAAqBzB,OAAS,GAC7BtL,EAAAA,cAACyb,GAAe,CACdpJ,OACE/G,EAAS,GAAKqB,EAA0BrB,OAAS,GAAKuB,EAAoBvB,OAAS,EAC/E,qBACA,iBAHE,6BAKRF,KAAM2B,EAAqB3B,KAC3BsQ,UAAU,kBACVC,YAAarQ,EAAS,GAAKqB,EAA0BrB,OAAS,GAAKuB,EAAoBvB,OAAS,EAChGkO,8BAA8B,IAGjC3N,GACDc,EAA0BkE,UAC1BhE,EAAoBgE,UACpB9D,EAAqB8D,SACnB7Q,EAAAA,cAAC2e,EAAAA,EAAc,CAAC/e,UAAU,SACb,IAAX0L,GACmC,IAArCqB,EAA0BrB,QACK,IAA/BuB,EAAoBvB,QACY,IAAhCyB,EAAqBzB,OACrBtL,EAAAA,cAAA,OAAKJ,UAAU,iCAAgC,wBACvByE,EAAQrE,EAAAA,cAAA,YAAM,IAAOqE,EAAM,KAAgB,cAAc,0DAG/E,OAGPF,GACCnE,EAAAA,cAAA,OACEJ,UAAU,wFACVud,MAAO,CAAEyB,SAAU,wBAClBza,EAAUnE,EAAAA,cAACoV,EAAW,MAAMpV,EAAAA,cAAA,OAAK8C,GAAG,MAAMlD,UAAU,mBAGxDwI,GACCpI,EAAAA,cAAC6e,EAAAA,GAAqB,CACpBC,UAAWA,KACT/C,GAAsB,GACtBhM,YAAW,KACTvM,OAAOwL,SAAS,EAAG,EAAE,GACpB,IAAI,EAET+P,QAASjD,EACTkD,OAAO,UACPC,YAAY,EACZC,SAAS,EACTC,iBAAmB,QAAOlB,aAC1BmB,OAAQA,KACNrD,GAAsB,GACtBhM,YAAW,KACTvM,OAAOwL,SAAS,EAAG,EAAE,GACpB,IAAI,EAETqQ,iBAAiB,QACjBC,SAAUA,KACRlP,IACA2L,GAAsB,GACtBhM,YAAW,KACTvM,OAAOwL,SAAS,EAAG,EAAE,GACpB,IAAI,EAETuQ,SAAS,GACTvf,EAAAA,cAACuU,EAAc,QAIpB,EAIQ,SAASiL,IAAK,OAC3BzW,EAAM,kBACNpB,EAAiB,aACjBC,EAAY,UACZE,EAAS,KACTC,EAAI,cACJ8T,EAAa,aACbrN,EAAY,SACZpG,EAAQ,SACR/E,IAEA,OACErD,EAAAA,cAAC0H,EAAkB,CACjBM,OAAQI,EACRH,OAAQ5E,GAAY+E,EACpBT,kBAAmBA,EACnBC,aAAcA,EACdC,cAAekB,EACfjB,UAAWA,EACXC,KAAMA,EACNyG,aAAcA,GACdxO,EAAAA,cAAC4b,GAAU,CAACC,cAAeA,IAGjC,C,mJCtTA,IAzE0BuC,KACxB,MAAM,MAAElW,IAAUC,EAAAA,EAAAA,KACZC,EAAWF,GAAS,KACnBuX,EAAWC,IAAgBxe,EAAAA,EAAAA,UAAS,KAErC,cAAEye,EAAa,iBAAEC,EAAgB,oBAAEC,EAAmB,0BAAEC,IAA8BC,EAAAA,EAAAA,GAAiB,CAC3G9J,SAAU,IACVnQ,QAAS,CACPka,MAAO,CAAC,WAAY,8BAA+B,kBAavD,OATAzX,EAAAA,EAAAA,YAAU,KACR,MAAM0X,EAAuB9S,GAAMuS,EAAavS,EAAEC,QAGlD,OAFAI,SAASD,iBAAiB,oBAAqB0S,GAExC,KACLzS,SAASe,oBAAoB,oBAAqB0R,EAAoB,CACvE,GACA,IAGDjgB,EAAAA,cAACkgB,EAAAA,GAAQ,CACPlM,GAAG,MACHpU,UAAU,YACVsC,MAAOud,EACPtd,SAAWI,IACLA,GACFod,EAAcQ,WAAW,CAAEC,QAAS7d,EAAK8d,WAAaC,IACpD,MAAMC,EAAe,CAAEja,IAAKga,EAAME,SAASnb,SAASiB,MAAOC,IAAK+Z,EAAME,SAASnb,SAASkB,OAClFnE,EAAQ,IAAI0L,YAAY,eAAgB,CAAEV,OAAQmT,IACxD/S,SAASK,cAAczL,GACvBsd,GAAae,EAAAA,EAAAA,IAAmBle,EAAKme,aAAa,GAEtD,GAEF1gB,EAAAA,cAAA,OAAKJ,UAAU,YACbI,EAAAA,cAACkgB,EAAAA,GAASS,MAAK,CACbxe,SAAWye,IACTlB,EAAakB,EAAIne,OAAOP,OACxB2d,EAAoB,CAAEgB,MAAOD,EAAIne,OAAOP,OAAQ,EAElDtC,WAAWO,EAAAA,EAAAA,GAAQ2gB,EAAAA,GAAuB,sDAC1CC,YAAY,aAEbjB,EACC9f,EAAAA,cAAC2e,EAAAA,EAAc,CAAC/e,UAAU,8BAA8BohB,iBAAiB,YAEzEhhB,EAAAA,cAACiU,EAAAA,EAAU,CAACrU,UAAU,mFAGzBggB,GAAkBpe,OAAS,IAAMse,GAChC9f,EAAAA,cAACkgB,EAAAA,GAASe,QAAO,CACfrhB,WAAWO,EAAAA,EAAAA,GAAQ+gB,EAAAA,GAAqB,0CACxC/D,MAAO,CAAEyB,SAAUxW,EAAW,IAAM,MACnCwX,EAAiBjd,KAAKJ,GACrBvC,EAAAA,cAACkgB,EAAAA,GAASiB,OAAM,CAACve,IAAKL,EAAKme,YAAa9gB,UAAWwhB,EAAAA,GAA4Blf,MAAOK,GACpFvC,EAAAA,cAAA,OACE4Y,wBAAyB,CACvBC,QAAQ4H,EAAAA,EAAAA,IAAmBle,EAAKme,aAAa1b,QAC3C,IAAIqc,OAAO5B,EAAW,KACrB,mCAAkC6B,IAAW7B,oBAQnD,C,0MCnEf,MAAMrY,EAAeC,IACnBC,aACAA,oCAGIia,EAAaC,IACjB,MAAM,OAAEC,IAAWC,EAAAA,EAAAA,KAEbhZ,EADY,IAAID,gBAAgBjF,OAAO6B,SAASoB,QACvBkC,IAAI,UAAY,IACxCgZ,EAAYC,IAAiB1gB,EAAAA,EAAAA,UAASwH,IACtCyD,EAAoBC,IAAyBlL,EAAAA,EAAAA,WAAS,GAEvD8I,EAAY6X,IAChBD,EAAcC,GACdJ,EAAOI,EAAS,EAelB,OAZAtZ,EAAAA,EAAAA,YAAU,KACR,MAAMuZ,EAAqBA,IAAMF,EAAc,IACzCG,EAAuBA,IAAM3V,GAAsB,GAIzD,OAHAoB,SAASD,iBAAiB,mBAAoBuU,GAC9CtU,SAASD,iBAAiB,qBAAsBwU,GAEzC,KACLvU,SAASe,oBAAoB,mBAAoBuT,GACjDtU,SAASe,oBAAoB,qBAAsBwT,EAAqB,CACzE,GACA,IAGD/hB,EAAAA,cAAA,OAAKJ,UAAU,wBACbI,EAAAA,cAACkgB,EAAAA,GAAQ,CACPhe,MAAOyf,EACPxf,SAAWhD,IACT,GAAIA,EAAIR,KACN6E,OAAO6B,SAAS8P,MAAOjW,EAAAA,EAAAA,IAA6BC,OAC/C,CACLyiB,EAAcziB,GACd,MAAMiD,EAAQ,IAAI0L,YAAY,oBAAqB,CAAEV,OAAQjO,IAC7DqO,SAASK,cAAczL,EACzB,IAEFpC,EAAAA,cAAA,OAAKJ,UAAU,YACbI,EAAAA,cAACkgB,EAAAA,GAASS,MAAK1gB,OAAAC,OAAA,CACb6gB,YAAY,oDACRS,EAAK,CACTrf,SAAWC,GAAU4H,EAAS5H,EAAMK,OAAOP,OAC3C8f,aAAe7iB,GAAQA,EAAIiS,MAAQuQ,GAAc,GACjD/hB,WAAWO,EAAAA,EAAAA,GAAQ2gB,EAAAA,GAAuB,+BAE5B,KAAfa,GACC3hB,EAAAA,cAACiV,EAAAA,GAAW,CACV5U,QAASA,KACP2J,EAAS,IACT,MAAM5H,EAAQ,IAAI0L,YAAY,oBAAqB,CAAEV,OAAQ,CAAEgE,KAAM,MACrE5D,SAASK,cAAczL,EAAM,EAE/BxC,UAAU,kDAIhBI,EAAAA,cAACkgB,EAAAA,GAASe,QAAO,CAACrhB,WAAWO,EAAAA,EAAAA,GAAQ+gB,EAAAA,GAAqB,4CAExC,KAAfS,GACC3hB,EAAAA,cAACkgB,EAAAA,GAASiB,OAAM,CAACjf,MAAO,CAAEY,GAAI,KAAMsO,KAAMuQ,GAAc/hB,UAAU,UAC/D+hB,GAGL3hB,EAAAA,cAACiiB,EAAAA,EAAK,CAAC1a,UAAU,aACfvH,EAAAA,cAACkiB,EAAAA,EAAS,CAACzd,YAAa,IACxBzE,EAAAA,cAACmiB,EAAsB,OAEzBniB,EAAAA,cAACiiB,EAAAA,EAAK,CAAC1a,UAAU,uBACfvH,EAAAA,cAACkiB,EAAAA,EAAS,CAACzd,YAAa,IACxBzE,EAAAA,cAACoiB,EAAyB,SAI/BjW,GAAsBnM,EAAAA,cAACoe,EAAAA,EAAiB,MACrC,EAIJ+D,EAAyBA,KAC7B,MAAM,KAAE/W,IAASiX,EAAAA,EAAAA,KACXzS,EAAYxE,EAAK9I,QAAQnD,GAA6B,IAArBA,EAAImjB,eACrCC,EAAmBnX,EAAK9I,QAAQnD,GAA6B,IAArBA,EAAImjB,eAElD,OACEtiB,EAAAA,cAAA,WACG4P,EAAUpO,OAAS,GAClBxB,EAAAA,cAAAA,EAAAA,SAAA,KACEA,EAAAA,cAAC8T,EAAAA,EAAU,CAAClU,UAAU,YAAYmU,QAAQ,kBAAiB,aAG1DnE,EAAUjN,KAAKxD,GACda,EAAAA,cAACkgB,EAAAA,GAASiB,OAAM,CACdve,IAAKzD,EAAIma,SACTpX,MAAO/C,EACPS,UAAWA,EAAGD,SAAQ6iB,eACpBriB,EAAAA,EAAAA,GAAQ,qCAAsCqiB,EAAW,UAAY7iB,EAAS,qBAAuB,KAEvGK,EAAAA,cAAA,UACE4Y,wBAAyB,CACvBC,OAAQ1Z,EAAIsjB,iBAAiBrR,KAAKlP,MAAM8C,QACtC,SACA,2EAGJ3E,QAASA,KACP,MAAM+B,EAAQ,IAAI0L,YAAY,oBAAqB,CAAEV,OAAQjO,IAC7DqO,SAASK,cAAczL,EAAM,QAOxCmgB,EAAiB/gB,OAAS,GACzBxB,EAAAA,cAAAA,EAAAA,SAAA,KACEA,EAAAA,cAAC8T,EAAAA,EAAU,CAAClU,UAAU,YAAYmU,QAAQ,kBAAiB,qBAG1DwO,EAAiB5f,KAAKxD,GACrBa,EAAAA,cAACkgB,EAAAA,GAASiB,OAAM,CACdve,IAAKzD,EAAIma,SACTpX,MAAO/C,EACPS,UAAWA,EAAGD,SAAQ6iB,eACpBriB,EAAAA,EAAAA,GAAQ,qCAAsCqiB,EAAW,UAAY7iB,EAAS,qBAAuB,KAEvGK,EAAAA,cAAA,UACE4Y,wBAAyB,CACvBC,OAAQ1Z,EAAIsjB,iBAAiBrR,KAAKlP,MAAM8C,QACtC,SACA,2EAGJ3E,QAASA,KACP,MAAM+B,EAAQ,IAAI0L,YAAY,oBAAqB,CAAEV,OAAQjO,IAC7DqO,SAASK,cAAczL,EAAM,QAOrC,EAIJggB,EAA4BA,KAChC,MAAM,KAAEhX,IAASiX,EAAAA,EAAAA,KAEXK,EAAevjB,GACFA,EAAIR,KAAKgb,gBAAgBgJ,OAAO9I,KAC5C,oCAAmC1a,EAAIR,KAAKgb,gBAAgBgJ,OAAO9I,OACpE1a,EAAIR,KAAKmb,MAKf,OACE9Z,EAAAA,cAAA,WACEA,EAAAA,cAAC8T,EAAAA,EAAU,CAAClU,UAAU,YAAYmU,QAAQ,kBAAiB,iBAG1D3I,EAAKzI,KAAKxD,GACTa,EAAAA,cAACkgB,EAAAA,GAASiB,OAAM,CAACve,IAAKzD,EAAIma,SAAUpX,MAAO/C,EAAKS,UAAWwhB,EAAAA,IACzDphB,EAAAA,cAAA,KAAGJ,UAAU,0BAA0BuV,MAAMjW,EAAAA,EAAAA,IAA6BC,IACxEa,EAAAA,cAAA,OAAKJ,UAAU,yBAAyBgb,IAAK8H,EAAYvjB,GAAM0b,IAAK1b,EAAIR,KAAKyS,OAC7EpR,EAAAA,cAAA,WACEA,EAAAA,cAAA,OACEJ,UAAU,YACVgZ,wBAAyB,CACvBC,OAAQ1Z,EAAIsjB,iBAAiB9jB,KAAKyS,KAAKlP,MAAM8C,QAC3C,SACA,6EAINhF,EAAAA,cAAA,OAAKJ,UAAU,qCACbI,EAAAA,cAACsY,EAAAA,EAAQ,CAAC1Y,UAAU,wBACpBI,EAAAA,cAAA,YAA+B,IAAxBb,EAAIoZ,gBAAwB,MAAQnN,EAAKmN,iBAChDvY,EAAAA,cAAA,QAAMJ,UAAU,aAAaT,EAAIqZ,cAAc,kBAMrD,EAUV,IANwBoK,IACtB5iB,EAAAA,cAAC6iB,EAAAA,EAAa,CAACzb,aAAcA,EAAcG,UAAU,aACnDvH,EAAAA,cAACuhB,EAAS,M","sources":["webpack://daocloud/./app/javascript/@core/practitioner/practitioner.utils.js","webpack://daocloud/./app/javascript/components/shared/Pill.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/FacetList.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/searchUtils.js","webpack://daocloud/./app/javascript/pages/SearchPage/SearchPageContext.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/HealthIssuesFacetList.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/LocationFilters.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/RefinementPanel.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/TherapiesFilters.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/FiltersSection.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/JoinInterstitial.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/MapWithPins.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/QuizInterstitial.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/SearchCard.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/SearchPills.jsx","webpack://daocloud/./app/javascript/pages/SearchPage.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/LocationSearchBox.jsx","webpack://daocloud/./app/javascript/pages/SearchPage/TopNavSearchBox.jsx"],"sourcesContent":["export const websiteSubscriptionTypes = [\n \"Annual - Website\",\n \"Lifer - Website\",\n \"Lifer - Professional\",\n \"Professional\",\n \"Website - Annual\",\n \"Website - Lifer\"\n]\n\nexport const practitionerWebsiteUrl = (user, practice) => {\n let slug = user.vanitySlug || user.slug\n if (!practice) {\n return `/${slug}`\n }\n const websiteUrl =\n practice.website && websiteSubscriptionTypes.includes(user.subscriptionType) ? practice.website : `/${slug}`\n\n return websiteUrl\n}\n\n// Hit is the practitioner object from Algolia and is snake_case\nexport const searchPractitionerWebsiteUrl = (hit) => {\n if (hit.custom_domain_host) {\n return `https://${hit.custom_domain_host}`\n }\n\n const slug = hit.user.vanity_slug || hit.user.slug\n\n const websiteUrl =\n hit.website && websiteSubscriptionTypes.includes(hit.subscription_type)\n ? hit.website.startsWith(\"http\")\n ? hit.website\n : `https://${hit.website}`\n : `/${slug}`\n\n return websiteUrl\n}\n","import { EllipsisVerticalIcon, XMarkIcon } from \"@heroicons/react/24/outline\"\nimport clsx from \"clsx\"\nimport PropTypes from \"prop-types\"\nimport React from \"react\"\nimport { twMerge } from \"tailwind-merge\"\n\nconst Pill = ({ children, onClick, type = \"primary\" }) => (\n <div\n className={clsx(\n \"flex h-8 min-w-fit max-w-fit items-center whitespace-nowrap border border-gray px-4 py-1 text-center hover:cursor-pointer hover:border-black\",\n { \"bg-white\": type === \"primary\" },\n { \"border-none bg-offwhite\": type === \"secondary\" },\n { \"border-teal bg-teal text-white\": type === \"tertiary\" }\n )}\n style={{ borderRadius: \"50px\" }}\n onClick={onClick}>\n {children}\n </div>\n)\n\nPill.propTypes = {\n type: PropTypes.oneOf([\"primary\", \"secondary\", \"tertiary\"]),\n children: PropTypes.node,\n onClick: PropTypes.func\n}\n\nexport default Pill\n\nexport const EndorsementPill = ({ children, draggable, active, className, onCloseButtonClick, ...rest }) => {\n const Tag = draggable ? \"div\" : \"button\"\n\n return (\n <Tag\n className={twMerge(\n \"flex items-center justify-center rounded border border-gray px-3 py-1 hover:border-black focus:outline-none focus:ring-2 focus:ring-blue\",\n active ? \"border-gray-dark bg-gray-dark font-bold text-white hover:border-gray-dark\" : \"bg-white\",\n draggable ? \"cursor-grab\" : \"cursor-pointer\",\n className\n )}\n {...rest}>\n {draggable && <EllipsisVerticalIcon className=\"-ml-2 h-5 w-5 stroke-2\">{draggable}</EllipsisVerticalIcon>}\n {children}\n {draggable && (\n <button onClick={onCloseButtonClick}>\n <XMarkIcon className=\"z-10 ml-2 h-5 w-5\" />\n </button>\n )}\n </Tag>\n )\n}\n\nexport const SearchPill = ({ children, onClick, onCloseButtonClick }) => (\n <div\n className=\"flex h-8 items-center justify-center rounded bg-gray-dark px-3 py-1 font-bold text-white sm:flex-none\"\n onClick={onClick}>\n {children}\n <button onClick={onCloseButtonClick}>\n <XMarkIcon className=\"z-10 ml-2 h-5 w-5\" />\n </button>\n </div>\n)\n","import React, { useState, memo } from \"react\"\n\nimport { CheckBox, SearchInput } from \"../../components/shared/Inputs\"\n\nconst FacetList = ({\n items,\n selectedItems,\n setSelectedItems,\n counts,\n searchable = false,\n searchSubtext,\n alwaysShowAll = false\n}) => {\n const [filteredItems, setFilteredItems] = useState(items)\n const [isShowingMore, setIsShowingMore] = useState(false)\n const [searchValue, setSearchValue] = useState(\"\")\n const canToggleShowMore = filteredItems.length > 4\n\n return (\n <>\n {searchable && (\n <SearchInput\n type=\"search\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck={false}\n maxLength={512}\n containerClassName=\"w-full\"\n explanatorySubtext={searchSubtext}\n value={searchValue}\n onChange={(event) => {\n const newItems = items.filter((item) => item.toLowerCase().includes(event.target.value.toLowerCase()))\n setFilteredItems(newItems)\n setSearchValue(event.target.value)\n }}\n />\n )}\n <ul className=\"mt-4 flex flex-col gap-1.5\">\n {filteredItems\n .filter((item) => counts && !!counts[item])\n .slice(0, isShowingMore || alwaysShowAll ? filteredItems.length : 4)\n .map((item) => (\n <li key={item}>\n <CheckBox\n id={`in-person-checkbox-${item}`}\n className=\"mb-0\"\n checked={selectedItems.includes(item)}\n onChange={() => {\n setSelectedItems((prevItems) => {\n if (prevItems.includes(item)) {\n return prevItems.filter((prevItem) => prevItem !== item)\n } else {\n return [...prevItems, item]\n }\n })\n }}\n label={counts ? `${item} (${counts[item] || 0})` : item}\n />\n </li>\n ))}\n </ul>\n {canToggleShowMore && !alwaysShowAll && (\n <button onClick={() => setIsShowingMore(!isShowingMore)} className=\"mt-1.5 font-bold text-teal\">\n {isShowingMore ? \"See less\" : \"See all\"}\n </button>\n )}\n </>\n )\n}\n\nexport default memo(FacetList)\n","export const filtersString = ({\n selectedTherapies,\n selectedHealthIssues,\n selectedLocations,\n offersFreeConsult,\n selectedLanguages,\n selectedAges\n}) => {\n let selectedTherapyFilters = selectedTherapies\n ?.map((therapy) => `therapies:\"${therapy.replace(/\\s*\\(.*\\)$/, \"\")}\"`)\n ?.join(\" OR \")\n selectedTherapyFilters = selectedTherapyFilters ? `(${selectedTherapyFilters})` : null\n let selectedHealthIssueFilters = selectedHealthIssues\n ?.map((condition) => `health_issues:\"${condition}\"`)\n ?.join(\" AND \")\n selectedHealthIssueFilters = selectedHealthIssueFilters ? `(${selectedHealthIssueFilters})` : null\n let selectedLocationFilters = selectedLocations?.map((location) => `location_types:\"${location}\"`)?.join(\" OR \")\n selectedLocationFilters = selectedLocationFilters ? `(${selectedLocationFilters})` : null\n const freeConsultFilter = offersFreeConsult ? \"free_consult:true\" : null\n const selectedLanguagesFilters = selectedLanguages?.map((language) => `languages:\"${language}\"`)?.join(\" OR \")\n const selectedAgeWorkWithFilters = selectedAges?.map((age) => `age_work_withs:\"${age}\"`)?.join(\" OR \")\n return [\n selectedTherapyFilters,\n selectedHealthIssueFilters,\n selectedLocationFilters,\n freeConsultFilter,\n selectedLanguagesFilters,\n selectedAgeWorkWithFilters\n ]\n .filter(Boolean)\n .join(\" AND \")\n}\n\nexport const shouldShowMap = ({ isTablet, mapCenter, selectedLocations }) =>\n (typeof window === \"undefined\" && !isTablet) ||\n (!!mapCenter &&\n !isTablet &&\n (selectedLocations.includes(\"home\") || selectedLocations.includes(\"office\") || selectedLocations.length === 0))\n\nexport const isVirtualView = ({ selectedLocations }) =>\n selectedLocations.includes(\"virtual\") && selectedLocations.length === 1\n\nexport const getSearchOptions = ({\n filters,\n boundingBox,\n radiusInMiles,\n mapCenter,\n isTablet,\n selectedLocations,\n currentPage\n}) => {\n const options = {\n page: currentPage,\n filters,\n facets: [\"health_issues\", \"languages\", \"age_work_withs\"]\n }\n\n const virtualView = isVirtualView({ selectedLocations })\n const showMap = shouldShowMap({ isTablet, mapCenter, selectedLocations })\n\n if (showMap && boundingBox) {\n options.insideBoundingBox = [boundingBox]\n } else if (isTablet && mapCenter) {\n if (radiusInMiles) {\n options.aroundRadius = radiusInMiles * 1609\n options.aroundPrecision = 5 * 1609\n }\n options.aroundLatLng = [mapCenter.lat, mapCenter.lng].join(\",\")\n } else if (virtualView && !isTablet) {\n // no early return or additional options for virtual web view\n } else {\n return null\n }\n\n return options\n}\n\nexport const updateUrl = ({\n query,\n radiusInMiles,\n mapCenter,\n mapZoom,\n selectedTherapies,\n selectedHealthIssues,\n selectedLocations,\n offersFreeConsult,\n selectedLanguages,\n selectedAges,\n isMobile,\n poppingState,\n setPoppingState,\n boundingBox\n}) => {\n const queryParams = new URLSearchParams()\n if (query) queryParams.set(\"query\", query)\n if (radiusInMiles && isMobile) queryParams.set(\"radius\", radiusInMiles)\n if (mapCenter) queryParams.set(\"mapCenter\", [mapCenter.lat, mapCenter.lng].join(\",\"))\n if (selectedTherapies.length) queryParams.set(\"therapies\", selectedTherapies.join(\",\"))\n if (selectedHealthIssues.length) queryParams.set(\"healthIssues\", selectedHealthIssues.join(\",\"))\n if (selectedLocations.length) queryParams.set(\"locations\", selectedLocations.join(\",\"))\n if (offersFreeConsult) queryParams.set(\"freeConsult\", offersFreeConsult)\n if (selectedLanguages.length) queryParams.set(\"languages\", selectedLanguages.join(\",\"))\n if (selectedAges.length) queryParams.set(\"ages\", selectedAges.join(\",\"))\n if (mapZoom) queryParams.set(\"mapZoom\", mapZoom)\n if (boundingBox) queryParams.set(\"boundingBox\", boundingBox.join(\",\"))\n\n const currentParams = new URLSearchParams(window.location.search)\n if (currentParams.has(\"debug\")) queryParams.set(\"debug\", \"true\")\n\n if (poppingState) {\n setPoppingState(false)\n return\n }\n\n window.history.pushState(\n { queryString: queryParams.toString() },\n \"\",\n `/practitioner-search?${queryParams.toString()}`\n )\n}\n\nexport const performSearch = (\n {\n searchIndex,\n selectedTherapies,\n selectedHealthIssues,\n selectedLocations,\n offersFreeConsult,\n selectedLanguages,\n selectedAges,\n currentPage,\n boundingBox,\n showMap,\n radiusInMiles,\n mapCenter,\n isTablet,\n query,\n similarQuery,\n additionalFilters,\n virtualFallback,\n hitsPerPage\n },\n onSuccess\n) => {\n if (hitsPerPage === undefined) hitsPerPage = isTablet ? 3 : 25\n\n const filters = filtersString({\n selectedTherapies,\n selectedHealthIssues,\n selectedLocations,\n offersFreeConsult,\n selectedLanguages,\n selectedAges\n })\n\n const searchOptions = getSearchOptions({\n currentPage,\n filters,\n boundingBox,\n showMap,\n radiusInMiles,\n mapCenter,\n isTablet,\n selectedLocations\n })\n\n if (mapCenter === null || searchOptions === null) {\n return // don't trigger a search if the search options state isn't fully initialized\n }\n\n searchOptions.hitsPerPage = hitsPerPage\n\n if (similarQuery) {\n searchOptions.similarQuery = query\n }\n\n if (additionalFilters) {\n if (searchOptions.filters) {\n searchOptions.filters = `${filters} AND ${additionalFilters}`\n } else {\n searchOptions.filters = additionalFilters\n }\n }\n\n if (virtualFallback) {\n delete searchOptions.aroundLatLng\n delete searchOptions.aroundRadius\n }\n\n searchOptions.attributesToHighlight = []\n\n searchIndex.search(query, searchOptions).then((searchResponse) => {\n onSuccess(searchResponse)\n })\n}\n\nexport const doubleBoundingBoxSize = (mapCenter, boundingBox) => {\n if (!mapCenter || !boundingBox) return null\n\n const deltaX = (boundingBox[2] - boundingBox[0]) / 2\n const deltaY = (boundingBox[1] - boundingBox[3]) / 2\n\n const newTopLeft = [mapCenter.lat - deltaX * 2, mapCenter.lng + deltaY * 2]\n const newBottomRight = [mapCenter.lat + deltaX * 2, mapCenter.lng - deltaY * 2]\n\n return newTopLeft.concat(newBottomRight)\n}\n","import algoliasearch from \"algoliasearch/lite\"\nimport differenceBy from \"lodash/differenceBy\"\nimport React, { createContext, useCallback, useContext, useEffect, useState } from \"react\"\n\nimport useWindowSize from \"../../hooks/useWindowSize\"\n\nimport { doubleBoundingBoxSize, isVirtualView, performSearch, shouldShowMap, updateUrl } from \"./searchUtils\"\n\nconst SearchPageContext = createContext()\n\nconst searchClient = algoliasearch(\n process?.env?.ALGOLIA_HEALME_SEARCH_APPLICATION_ID,\n process?.env?.ALGOLIA_HEALME_SEARCH_CLIENT_API_KEY\n)\n\nconst indexName = \"Practice_production\"\nconst countsIndex = searchClient.initIndex(indexName)\nconst searchIndex = searchClient.initIndex(indexName)\n\nexport const SearchPageProvider = ({\n children,\n therapyCategories,\n healthIssues,\n defaultLatLng,\n languages,\n ages,\n mobile,\n tablet\n}) => {\n const { width } = useWindowSize()\n const [isMobile, setIsMobile] = useState(mobile)\n const [isTablet, setIsTablet] = useState(tablet)\n\n useEffect(() => {\n if (width) {\n setIsMobile(width ? width < 768 : isMobile)\n setIsTablet(width ? width < 1150 : isTablet)\n }\n }, [width])\n\n const [urlParams] = useState(\n typeof window !== \"undefined\" ? new URLSearchParams(window.location.search) : new URLSearchParams()\n )\n const defaultQuery = urlParams.get(\"query\") || \"\"\n const defaultRadius = isTablet ? parseInt(urlParams.get(\"radius\")) || 25 : null\n\n const mapCenterParam = urlParams.get(\"mapCenter\")\n const latLng = mapCenterParam?.split(\",\").map((coord) => parseFloat(coord))\n const defaultMapCenter = latLng\n ? { lat: latLng[0], lng: latLng[1] }\n : typeof localStorage !== \"undefined\"\n ? JSON.parse(localStorage.getItem(\"mapCenter\"))\n : null\n const defaultTherapies = urlParams.get(\"therapies\")?.split(\",\") || []\n const defaultHealthIssues = urlParams.get(\"healthIssues\")?.split(\",\") || []\n const defaultLocations = urlParams.get(\"locations\")?.split(\",\") || [\"office\", \"home\", \"virtual\"]\n const defaultOffersFreeConsult = urlParams.get(\"freeConsult\") === \"true\"\n const defaultLanguages = urlParams.get(\"languages\")?.split(\",\") || []\n const defaultAges = urlParams.get(\"ages\")?.split(\",\") || []\n const defaultMapZoom = urlParams.get(\"mapZoom\") ? parseFloat(urlParams.get(\"mapZoom\")) : 12\n const defaultBoundingBox = urlParams\n .get(\"boundingBox\")\n ?.split(\",\")\n .map((coord) => parseFloat(coord))\n\n // search state\n const [query, setQuery] = useState(defaultQuery || \"\")\n const [radiusInMiles, setRadiusInMiles] = useState(defaultRadius)\n const [mapCenter, setMapCenter] = useState(defaultMapCenter)\n const [boundingBox, setBoundingBox] = useState(defaultBoundingBox)\n const [selectedTherapies, setSelectedTherapies] = useState(defaultTherapies)\n const [selectedHealthIssues, setSelectedHealthIssues] = useState(defaultHealthIssues)\n const [selectedLocations, setSelectedLocations] = useState(defaultLocations)\n const [offersFreeConsult, setOffersFreeConsult] = useState(defaultOffersFreeConsult)\n const [selectedLanguages, setSelectedLanguages] = useState(defaultLanguages)\n const [selectedAges, setSelectedAges] = useState(defaultAges)\n const [mapZoom, setMapZoom] = useState(defaultMapZoom)\n\n const [inPersonCounts, setInPersonCounts] = useState({})\n const [healthIssueCounts, setHealthIssueCounts] = useState(null)\n const [languageCounts, setLanguageCounts] = useState(null)\n const [ageCounts, setAgeCounts] = useState(null)\n const [hits, setHits] = useState(null)\n const [nbHits, setNbHits] = useState(0)\n const [isLastPage, setIsLastPage] = useState(true)\n const [currentPage, setCurrentPage] = useState(0)\n const [isFetchingNextPage, setIsFetchingNextPage] = useState(false)\n const [loading, setLoading] = useState(true)\n const [poppingState, setPoppingState] = useState(false)\n const [previousSearch, setPreviousSearch] = useState(null)\n const [googlePlacesLoaded, setGooglePlacesLoaded] = useState(false)\n const [shouldDynamicZoom, setShouldDynamicZoom] = useState(true)\n const [performedFallbackSearches, setPerformedFallbackSearches] = useState(false)\n const [mapPins, setMapPins] = useState()\n const showMap = shouldShowMap({ isTablet, mapCenter, selectedLocations })\n const virtualView = isVirtualView({ selectedLocations })\n const locationOptions = [\"office\", \"home\", \"virtual\"]\n\n const [similarQueryFallbackState, setSimilarQueryFallbackState] = useState({ hits: [], nbHits: 0 })\n const [nearbyFallbackState, setNearbyFallbackState] = useState({ hits: [], nbHits: 0 })\n const [virtualFallbackState, setVirtualFallbackState] = useState({ hits: [], nbHits: 0 })\n\n useEffect(() => {\n const onPopState = () => {\n const urlParams = new URLSearchParams(window.location.search)\n setSelectedTherapies(urlParams.get(\"therapies\")?.split(\",\") || [])\n setSelectedHealthIssues(urlParams.get(\"healthIssues\")?.split(\",\") || [])\n setSelectedLocations(urlParams.get(\"locations\")?.split(\",\") || [\"office\", \"home\", \"virtual\"])\n setOffersFreeConsult(urlParams.get(\"freeConsult\") === \"true\")\n setSelectedLanguages(urlParams.get(\"languages\")?.split(\",\") || [])\n setSelectedAges(urlParams.get(\"ages\")?.split(\",\") || [])\n setQuery(urlParams.get(\"query\") || \"\")\n setRadiusInMiles(isMobile ? urlParams.get(\"radius\") || 25 : null)\n\n const mapCenterParam = urlParams.get(\"mapCenter\")\n if (mapCenterParam) {\n const latLng = mapCenterParam.split(\",\").map((coord) => parseFloat(coord))\n setMapCenter(isMobile ? { lat: latLng[0], lng: latLng[1] } : null)\n }\n setBoundingBox(\n urlParams\n .get(\"boundingBox\")\n ?.split(\",\")\n .map((coord) => parseFloat(coord))\n )\n\n setPoppingState(true)\n }\n\n const onNewMapCenter = (e) => {\n setMapCenter(e.detail)\n setMapZoom(12)\n setShouldDynamicZoom(true)\n localStorage.setItem(\"mapCenter\", JSON.stringify(e.detail))\n }\n\n window.addEventListener(\"popstate\", onPopState)\n document.addEventListener(\"newMapCenter\", onNewMapCenter)\n\n async function initPlaces() {\n await window.google.maps.importLibrary(\"places\")\n setGooglePlacesLoaded(true)\n document.dispatchEvent(new CustomEvent(\"googlePlacesLoaded\"))\n }\n\n initPlaces()\n\n if (!isMobile && !isTablet) {\n fetch(\"/practitioner-search/map_pins\")\n .then((response) => {\n response.json().then((data) => {\n setMapPins(data)\n })\n })\n .catch((error) => {\n console.error(\"Error fetching map pins\", error)\n })\n }\n\n return () => {\n window.removeEventListener(\"popstate\", onPopState)\n document.removeEventListener(\"newMapCenter\", onNewMapCenter)\n }\n }, [])\n\n useEffect(() => {\n const searchParams = {\n searchIndex,\n selectedTherapies,\n selectedHealthIssues,\n selectedLocations,\n offersFreeConsult,\n selectedLanguages,\n selectedAges,\n currentPage,\n boundingBox,\n showMap,\n radiusInMiles,\n mapCenter,\n isTablet,\n query\n }\n\n performSearch(searchParams, (searchResponse) => {\n const { hits, nbHits, facets, nbPages, page } = searchResponse\n\n const searchString =\n selectedTherapies +\n selectedHealthIssues +\n selectedLocations +\n offersFreeConsult +\n selectedLanguages +\n selectedAges +\n mapCenter.lat +\n mapCenter.lng +\n radiusInMiles +\n boundingBox +\n query\n\n let newSearch = false\n if (searchString !== previousSearch) {\n newSearch = true\n setCurrentPage(0)\n setPreviousSearch(searchString)\n setHits([])\n setLoading(true)\n setSimilarQueryFallbackState({ hits: [], nbHits: 0 })\n setNearbyFallbackState({ hits: [], nbHits: 0 })\n setVirtualFallbackState({ hits: [], nbHits: 0 })\n }\n\n if (facets?.health_issues) setHealthIssueCounts(facets.health_issues)\n if (facets?.languages) setLanguageCounts(facets.languages)\n if (facets?.age_work_withs) setAgeCounts(facets.age_work_withs)\n\n setNbHits(nbHits)\n if (newSearch || page === 0) {\n setHits(hits)\n } else {\n setHits((prevHits) => [...prevHits, ...hits])\n }\n setSimilarQueryFallbackState({ hits: [], nbHits: 0 })\n setNearbyFallbackState({ hits: [], nbHits: 0 })\n setVirtualFallbackState({ hits: [], nbHits: 0 })\n setPerformedFallbackSearches(false)\n setIsLastPage(page + 1 >= nbPages)\n setIsFetchingNextPage(false)\n setLoading(false)\n\n if (searchParams.showMap && shouldDynamicZoom) {\n let newZoom\n if (nbHits <= 5 && mapZoom > 9) {\n newZoom = mapZoom - 1\n } else if (nbHits > 50 && mapZoom < 13) {\n newZoom = mapZoom + 1\n }\n if (newZoom !== undefined) {\n setMapZoom(newZoom)\n const event = new CustomEvent(\"newMapZoom\", { detail: newZoom })\n document.dispatchEvent(event)\n }\n }\n\n setShouldDynamicZoom(false)\n if (page === 0) window.scrollTo(0, 0)\n\n updateUrl({\n query,\n radiusInMiles,\n mapCenter,\n boundingBox,\n mapZoom,\n selectedTherapies,\n selectedHealthIssues,\n selectedLocations,\n offersFreeConsult,\n selectedLanguages,\n selectedAges,\n isMobile,\n poppingState,\n setPoppingState\n })\n })\n }, [\n query,\n boundingBox,\n radiusInMiles,\n selectedTherapies,\n selectedHealthIssues,\n selectedLocations,\n selectedLanguages,\n selectedAges,\n mapCenter,\n showMap,\n offersFreeConsult,\n currentPage\n ])\n\n useEffect(() => {\n const countsSearchParams = {\n filters: \"location_types:office OR location_types:home\",\n hitsPerPage: 100\n }\n\n if (boundingBox) {\n countsSearchParams.insideBoundingBox = [boundingBox]\n } else if (mapCenter && radiusInMiles) {\n countsSearchParams.aroundLatLng = `${mapCenter.lat},${mapCenter.lng}`\n countsSearchParams.aroundRadius = radiusInMiles * 1609\n } else {\n return\n }\n\n countsIndex.search(\"\", countsSearchParams).then(({ hits }) => {\n const counts = hits.reduce((acc, hit) => {\n hit.therapies?.forEach((therapy) => {\n acc[therapy] = acc[therapy] ? acc[therapy] + 1 : 1\n })\n return acc\n }, {})\n setInPersonCounts(counts)\n })\n }, [boundingBox])\n\n useEffect(() => {\n if (loading === false) {\n const timeout = setTimeout(() => {\n const savedScrollPosition = sessionStorage.getItem(\"scrollPosition\") || 0\n sessionStorage.removeItem(\"scrollPosition\")\n window.scrollTo(0, parseInt(savedScrollPosition, 10))\n }, 300)\n\n return () => clearTimeout(timeout)\n }\n }, [loading])\n\n const showMore = () => {\n if (isFetchingNextPage) return\n setCurrentPage((prev) => prev + 1)\n setIsFetchingNextPage(true)\n }\n\n const resetFilters = useCallback(() => {\n setQuery(\"\")\n setSelectedTherapies([])\n setSelectedHealthIssues([])\n setSelectedLocations([\"office\", \"home\", \"virtual\"])\n setOffersFreeConsult(false)\n setSelectedLanguages([])\n setSelectedAges([])\n setSimilarQueryFallbackState({ hits: [], nbHits: 0 })\n setNearbyFallbackState({ hits: [], nbHits: 0 })\n setVirtualFallbackState({ hits: [], nbHits: 0 })\n document.dispatchEvent(new CustomEvent(\"resetSearchField\"))\n window.scrollTo(0, 0)\n }, [])\n\n const searchParams = {\n searchIndex,\n selectedTherapies,\n selectedHealthIssues,\n selectedLocations,\n offersFreeConsult,\n selectedLanguages,\n selectedAges,\n currentPage,\n boundingBox,\n showMap,\n radiusInMiles,\n mapCenter,\n isTablet,\n query\n }\n\n const similarQueryFallbackSearch = () => {\n const newSearchParams = { ...searchParams, similarQuery: true, hitsPerPage: 25, currentPage: 0 }\n setSimilarQueryFallbackState((state) => ({ ...state, fetching: true }))\n performSearch(newSearchParams, (response) => {\n if (response.nbHits > 0) {\n const newHits = differenceBy(response.hits, hits, \"objectID\")\n setSimilarQueryFallbackState({ hits: newHits, nbHits: newHits.length, fetching: false, queryCompleted: true })\n } else {\n setSimilarQueryFallbackState({ hits: [], nbHits: 0, fetching: false, queryCompleted: true })\n }\n })\n }\n\n const nearbyFallbackSearch = () => {\n const newSearchParams = {\n ...searchParams,\n boundingBox: doubleBoundingBoxSize(searchParams.mapCenter, searchParams.boundingBox),\n radiusInMiles: searchParams.radiusInMiles * 2,\n hitsPerPage: 25,\n currentPage: 0\n }\n setNearbyFallbackState((state) => ({ ...state, fetching: true }))\n performSearch(newSearchParams, (response) => {\n if (response.nbHits > 0) {\n const newHits = differenceBy(response.hits, hits, \"objectID\")\n setNearbyFallbackState({ hits: newHits, nbHits: newHits.length, fetching: false, queryCompleted: true })\n } else {\n setNearbyFallbackState({ hits: [], nbHits: 0, fetching: false, queryCompleted: true })\n }\n })\n }\n\n const virtualFallbackSearch = () => {\n const additionalFilters = therapyCategories\n .filter((therapy) => therapy.inPersonOnly)\n .map((therapy) => `NOT therapies:\"${therapy.name}\"`)\n .join(\" AND \")\n const virtualSearchParams = {\n ...searchParams,\n selectedLocations: [\"virtual\"],\n additionalFilters,\n virtualFallback: true,\n hitsPerPage: 25,\n currentPage: 0\n }\n\n setVirtualFallbackState((state) => ({ ...state, fetching: true }))\n performSearch(virtualSearchParams, (response) => {\n if (response.nbHits > 0) {\n const newHits = differenceBy(response.hits, hits, \"objectID\")\n setVirtualFallbackState({ hits: newHits, nbHits: newHits.length, fetching: false, queryCompleted: true })\n } else {\n setVirtualFallbackState({ hits: [], nbHits: 0, fetching: false, queryCompleted: true })\n }\n })\n }\n\n return (\n <SearchPageContext.Provider\n value={{\n radiusInMiles,\n setRadiusInMiles,\n isMobile,\n isTablet,\n therapyCategories,\n healthIssues,\n languages,\n ages,\n query,\n setQuery,\n selectedTherapies,\n setSelectedTherapies,\n selectedHealthIssues,\n setSelectedHealthIssues,\n selectedLocations,\n setSelectedLocations,\n selectedLanguages,\n setSelectedLanguages,\n selectedAges,\n setSelectedAges,\n locationOptions,\n showMap,\n virtualView,\n mapCenter,\n setMapCenter,\n mapZoom,\n setMapZoom,\n boundingBox,\n setBoundingBox,\n inPersonCounts,\n healthIssueCounts,\n languageCounts,\n ageCounts,\n hits,\n nbHits,\n defaultLatLng,\n offersFreeConsult,\n setOffersFreeConsult,\n isLastPage,\n loading,\n showMore,\n resetFilters,\n googlePlacesLoaded,\n similarQueryFallbackState,\n setSimilarQueryFallbackState,\n nearbyFallbackState,\n setNearbyFallbackState,\n virtualFallbackState,\n setVirtualFallbackState,\n similarQueryFallbackSearch,\n nearbyFallbackSearch,\n virtualFallbackSearch,\n performedFallbackSearches,\n setPerformedFallbackSearches,\n mapPins\n }}>\n {children}\n </SearchPageContext.Provider>\n )\n}\n\nexport const useSearchPageContext = () => useContext(SearchPageContext)\n","import React, { useState, memo } from \"react\"\n\nimport { CheckBox, SearchInput } from \"../../components/shared/Inputs\"\n\nimport { useSearchPageContext } from \"./SearchPageContext\"\n\nconst HealthIssuesFacetList = () => {\n const { healthIssues, setSelectedHealthIssues, selectedHealthIssues, healthIssueCounts } = useSearchPageContext()\n const [filteredItems, setFilteredItems] = useState(healthIssues)\n const [numShown, setNumShown] = useState(4)\n const [searchValue, setSearchValue] = useState(\"\")\n const canToggleShowMore = filteredItems.length > 4\n\n const shownHealthIssues = filteredItems\n .filter((item) => (searchValue === \"\" && healthIssueCounts ? healthIssueCounts[item] > 0 : true))\n .sort((a, b) => {\n const aSelected = selectedHealthIssues.includes(a) ? 1 : 0\n const bSelected = selectedHealthIssues.includes(b) ? 1 : 0\n\n if (aSelected !== bSelected) return bSelected - aSelected\n\n if (healthIssueCounts) {\n return (healthIssueCounts[b] || 0) - (healthIssueCounts[a] || 0)\n } else {\n return a.localeCompare(b)\n }\n })\n\n return (\n <>\n <SearchInput\n type=\"search\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck={false}\n maxLength={512}\n containerClassName=\"w-full\"\n explanatorySubtext=\"Ex “Low back pain†or “Joint painâ€\"\n value={searchValue}\n onChange={(event) => {\n const newItems = healthIssues.filter((item) => item.toLowerCase().includes(event.target.value.toLowerCase()))\n setFilteredItems(newItems)\n setSearchValue(event.target.value)\n }}\n />\n <ul className=\"mt-4 flex flex-col gap-1.5\">\n {shownHealthIssues.slice(0, numShown).map((item) => (\n <li key={item}>\n <CheckBox\n id={`health-issue-${item}`}\n className=\"mb-0\"\n checked={selectedHealthIssues.includes(item)}\n onChange={() => {\n setSelectedHealthIssues((prevItems) => {\n if (prevItems.includes(item)) {\n return prevItems.filter((prevItem) => prevItem !== item)\n } else {\n return [...prevItems, item]\n }\n })\n }}\n label={\n healthIssueCounts && healthIssueCounts[item] > 0\n ? `${item} (${healthIssueCounts[item] > 99 ? \"99+\" : healthIssueCounts[item]})`\n : item\n }\n />\n </li>\n ))}\n </ul>\n {canToggleShowMore && (\n <button\n onClick={() => (numShown < shownHealthIssues.length ? setNumShown(numShown + 10) : setNumShown(4))}\n className=\"mt-1.5 font-bold text-teal\">\n {numShown < shownHealthIssues.length ? \"Load 10 more\" : \"See less\"}\n </button>\n )}\n </>\n )\n}\n\nexport default memo(HealthIssuesFacetList)\n","import React from \"react\"\n\nimport { CheckBox } from \"../../components/shared/Inputs\"\n\nimport { useSearchPageContext } from \"./SearchPageContext\"\n\nconst locationName = (location) => {\n if (location === \"office\") {\n return \"At a practice\"\n } else if (location === \"home\") {\n return \"At my home\"\n } else if (location === \"virtual\") {\n return \"Virtual\"\n }\n}\n\nconst LocationFilters = () => {\n const { locationOptions, selectedLocations, setSelectedLocations } = useSearchPageContext()\n\n return (\n <>\n <ul className=\"mt-3 flex flex-col gap-1\">\n {locationOptions.map((item) => (\n <li key={item}>\n <CheckBox\n className=\"mb-0\"\n checked={selectedLocations.includes(item)}\n onChange={() => {\n setSelectedLocations((locations) => {\n if (locations.includes(item)) {\n return locations.filter((location) => location !== item)\n } else {\n return [...locations, item]\n }\n })\n }}\n label={locationName(item)}\n />\n </li>\n ))}\n </ul>\n </>\n )\n}\n\nexport default LocationFilters\n","import { ChevronUpIcon, ChevronDownIcon } from \"@heroicons/react/24/outline\"\nimport React, { useState } from \"react\"\n\nconst RefinementPanel = ({ title, children, expanded = true }) => {\n const [isExpanded, setIsExpanded] = useState(expanded)\n\n return (\n <div className=\"pb-8\">\n <button\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"mb-1 flex w-full items-center justify-between font-bold\">\n <span>{title}</span>\n <span>{isExpanded ? <ChevronUpIcon className=\"h-5 w-5\" /> : <ChevronDownIcon className=\"h-5 w-5\" />}</span>\n </button>\n <div className={isExpanded ? \"\" : \"hidden\"}>{children}</div>\n </div>\n )\n}\n\nexport default RefinementPanel\n","import { MapPinIcon, VideoCameraIcon } from \"@heroicons/react/24/outline\"\nimport React, { useState } from \"react\"\n\nimport { CheckBox, SearchInput } from \"../../components/shared/Inputs\"\nimport Typography from \"../../components/shared/Typography\"\n\nimport { useSearchPageContext } from \"./SearchPageContext\"\n\nconst defaultNumTherapiesShown = 4\n\nconst TherapiesFilters = () => {\n const { therapyCategories, selectedTherapies, setSelectedTherapies, setSelectedLocations, inPersonCounts } =\n useSearchPageContext()\n\n const inPersonTherapies = therapyCategories.map((therapy) => therapy.name)\n const [filteredInPersonTherapies, setFilteredInPersonTherapies] = useState(inPersonTherapies)\n const [numInPersonTherapiesShown, setNumInPersonTherapiesShown] = useState(defaultNumTherapiesShown)\n const canToggleShowMoreInPerson = inPersonTherapies.length > defaultNumTherapiesShown\n\n const virtualTherapies = therapyCategories.filter((therapy) => !therapy.inPersonOnly).map((therapy) => therapy.name)\n const [filteredVirtualTherapies, setFilteredVirtualTherapies] = useState(virtualTherapies)\n const [numVirtualTherapiesShown, setNumVirtualTherapiesShown] = useState(defaultNumTherapiesShown)\n const canToggleShowMoreVirtual = virtualTherapies.length > defaultNumTherapiesShown\n\n const [searchValue, setSearchValue] = useState(\"\")\n\n const virtualCounts = therapyCategories.reduce((acc, therapy) => {\n acc[therapy.name] = therapy.count\n return acc\n }, {})\n\n const inPersonTherapiesShown = filteredInPersonTherapies\n .filter((item) => !!inPersonCounts[item] || selectedTherapies.includes(item + \" (in person)\") || searchValue !== \"\")\n .sort((a, b) => {\n const aSelected = selectedTherapies.includes(a + \" (in person)\") ? 1 : 0\n const bSelected = selectedTherapies.includes(b + \" (in person)\") ? 1 : 0\n\n if (aSelected !== bSelected) return bSelected - aSelected\n\n return (inPersonCounts[b] || 0) - (inPersonCounts[a] || 0)\n })\n\n const virtualTherapiesShown = filteredVirtualTherapies\n .filter((item) => !!virtualCounts[item])\n .sort((a, b) => {\n const aSelected = selectedTherapies.includes(a + \" (virtual)\") ? 1 : 0\n const bSelected = selectedTherapies.includes(b + \" (virtual)\") ? 1 : 0\n\n if (aSelected !== bSelected) return bSelected - aSelected\n\n return (virtualCounts[b] || 0) - (virtualCounts[a] || 0)\n })\n .slice(0, numVirtualTherapiesShown)\n\n return (\n <>\n <SearchInput\n type=\"search\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck={false}\n maxLength={512}\n containerClassName=\"w-full\"\n explanatorySubtext=\"Ex “Massage Therapy†or “Reikiâ€\"\n value={searchValue}\n onChange={(event) => {\n setSearchValue(event.target.value)\n const newVirtualTherapies = virtualTherapies.filter((therapy) =>\n therapy.toLowerCase().includes(event.target.value.toLowerCase())\n )\n setFilteredVirtualTherapies(newVirtualTherapies)\n\n const newInPersonTherapies = inPersonTherapies.filter((therapy) =>\n therapy.toLowerCase().includes(event.target.value.toLowerCase())\n )\n setFilteredInPersonTherapies(newInPersonTherapies)\n }}\n />\n <>\n <Typography variant=\"capitalHeading\" as=\"h3\" className=\"mt-4 flex items-center gap-1\">\n In-person\n <MapPinIcon className=\"h-5 w-5\" />\n </Typography>\n <ul className=\"mt-3 flex flex-col gap-1.5\">\n {inPersonTherapiesShown.slice(0, numInPersonTherapiesShown).map((item) => {\n const count = inPersonCounts[item] || 0\n const itemWithParens = item + \" (in person)\"\n\n return (\n <li key={item}>\n <CheckBox\n id={`in-person-checkbox-${item}`}\n className=\"mb-0\"\n checked={selectedTherapies.includes(itemWithParens)}\n onChange={() => {\n if (selectedTherapies.includes(itemWithParens)) {\n const filteredTherapies = selectedTherapies.filter((therapy) => therapy !== itemWithParens)\n if (filteredTherapies.filter((therapy) => therapy.includes(\"(in person)\")).length === 0) {\n setSelectedLocations([\"office\", \"home\", \"virtual\"])\n }\n setSelectedTherapies(filteredTherapies)\n } else {\n setSelectedLocations([\"office\", \"home\"])\n const newTherapies = [...selectedTherapies, itemWithParens]\n if (selectedTherapies.filter((therapy) => therapy.includes(\"(virtual)\")).length > 0) {\n setSelectedTherapies(newTherapies.filter((therapy) => !therapy.includes(\"(virtual)\")))\n } else {\n setSelectedTherapies(newTherapies)\n }\n }\n }}\n label={`${item} (${count > 99 ? \"99+\" : count})`}\n />\n </li>\n )\n })}\n {inPersonTherapiesShown.length === 0 && <li>No options matching</li>}\n </ul>\n {canToggleShowMoreInPerson && inPersonTherapiesShown.length > 0 && (\n <button\n onClick={() => {\n setNumInPersonTherapiesShown(\n numInPersonTherapiesShown < inPersonTherapiesShown.length\n ? numInPersonTherapiesShown + 10\n : defaultNumTherapiesShown\n )\n }}\n className=\"mt-1.5 font-bold text-teal\">\n {numInPersonTherapiesShown < inPersonTherapiesShown.length ? \"Load 10 more\" : \"See less\"}\n </button>\n )}\n </>\n <Typography variant=\"capitalHeading\" as=\"h3\" className=\"mt-4 flex items-center gap-1\">\n Virtual\n <VideoCameraIcon className=\"h-5 w-5\" />\n </Typography>\n <ul className=\"mt-3 flex flex-col gap-1.5\">\n {virtualTherapiesShown.map((item) => {\n const itemWithParens = item + \" (virtual)\"\n\n return (\n <li key={item}>\n <CheckBox\n id={`virtual-checkbox-${item}`}\n className=\"mb-0\"\n checked={selectedTherapies.includes(itemWithParens)}\n onChange={() => {\n if (selectedTherapies.includes(itemWithParens)) {\n const filteredTherapies = selectedTherapies.filter((therapy) => therapy !== itemWithParens)\n if (filteredTherapies.filter((therapy) => therapy.includes(\"(virtual)\")).length === 0) {\n setSelectedLocations([\"office\", \"home\", \"virtual\"])\n }\n setSelectedTherapies(filteredTherapies)\n } else {\n setSelectedLocations([\"virtual\"])\n const newTherapies = [...selectedTherapies, itemWithParens]\n if (selectedTherapies.filter((therapy) => therapy.includes(\"(in person)\")).length > 0) {\n setSelectedTherapies(newTherapies.filter((therapy) => !therapy.includes(\"(in person)\")))\n } else {\n setSelectedTherapies(newTherapies)\n }\n }\n }}\n label={\n item + (virtualCounts[item] ? ` (${virtualCounts[item] > 99 ? \"99+\" : virtualCounts[item]})` : \" (0)\")\n }\n />\n </li>\n )\n })}\n {virtualTherapiesShown.length === 0 && <li>No options matching</li>}\n </ul>\n {canToggleShowMoreVirtual && virtualTherapiesShown.length > 0 && (\n <button\n onClick={() => {\n setNumVirtualTherapiesShown(\n numVirtualTherapiesShown < filteredVirtualTherapies.length\n ? numVirtualTherapiesShown + 10\n : defaultNumTherapiesShown\n )\n }}\n className=\"mt-1.5 font-bold text-teal\">\n {numVirtualTherapiesShown < filteredVirtualTherapies.length ? \"Load 10 more\" : \"See less\"}\n </button>\n )}\n </>\n )\n}\n\nexport default TherapiesFilters\n","import React from \"react\"\n\nimport { Button } from \"../../components/shared/Buttons\"\nimport { Label, Toggle } from \"../../components/shared/Inputs\"\nimport { RadioWithLabel } from \"../../components/shared/RadioButtons\"\n\nimport FacetList from \"./FacetList\"\nimport HealthIssuesFacetList from \"./HealthIssuesFacetList\"\nimport LocationFilters from \"./LocationFilters\"\nimport RefinementPanel from \"./RefinementPanel\"\nimport { useSearchPageContext } from \"./SearchPageContext\"\nimport TherapiesFilters from \"./TherapiesFilters\"\n\nconst distanceMarks = [\n { value: 2, label: \"2mi\" },\n { value: 5, label: \"5mi\" },\n { value: 10, label: \"10mi\" },\n { value: 25, label: \"25mi\" },\n { value: 50, label: \"50mi\" },\n { value: 100, label: \"100mi\" }\n]\n\nconst FiltersSection = () => {\n const {\n radiusInMiles,\n setRadiusInMiles,\n isTablet,\n offersFreeConsult,\n setOffersFreeConsult,\n selectedTherapies,\n selectedHealthIssues,\n languages,\n selectedLanguages,\n setSelectedLanguages,\n languageCounts,\n ages,\n selectedAges,\n setSelectedAges,\n ageCounts,\n resetFilters\n } = useSearchPageContext()\n\n const defaultFilterState =\n !offersFreeConsult &&\n selectedTherapies.length === 0 &&\n selectedHealthIssues.length === 0 &&\n selectedAges.length === 0 &&\n selectedLanguages.length === 0\n\n return (\n <>\n {!defaultFilterState && (\n <Button type=\"tertiary\" className=\"mb-6 w-full sm:hidden\" onClick={resetFilters}>\n Reset filters\n </Button>\n )}\n <div className=\"mb-8 flex cursor-pointer items-center justify-between\">\n <Label className=\"text-base\" htmlFor=\"toggle-free-consult\">\n Offers free consult\n </Label>\n <Toggle\n id=\"toggle-free-consult\"\n checked={offersFreeConsult}\n onChange={() => setOffersFreeConsult(!offersFreeConsult)}\n />\n </div>\n <RefinementPanel title=\"Filter by therapy\">\n <TherapiesFilters />\n </RefinementPanel>\n <RefinementPanel title=\"Filter by health issue\">\n <HealthIssuesFacetList />\n </RefinementPanel>\n <RefinementPanel title=\"Location of service\">\n <LocationFilters />\n </RefinementPanel>\n {isTablet && (\n <RefinementPanel title=\"Show practitioners within\">\n <div className=\"mt-2 flex flex-col gap-2\">\n {distanceMarks.map((mark) => (\n <RadioWithLabel\n id={`distance-radio-${mark.value}`}\n key={`distance-radio-${mark.value}`}\n value={mark.value}\n name=\"radius\"\n label={mark.label}\n checked={radiusInMiles === mark.value}\n onChange={() => setRadiusInMiles(mark.value)}\n />\n ))}\n </div>\n </RefinementPanel>\n )}\n <RefinementPanel title=\"Languages spoken\" expanded={selectedLanguages.length > 0}>\n <FacetList\n items={languages}\n setSelectedItems={setSelectedLanguages}\n selectedItems={selectedLanguages}\n counts={languageCounts}\n />\n </RefinementPanel>\n <RefinementPanel title=\"Client age(s)\" expanded={selectedAges.length > 0}>\n <FacetList\n items={ages}\n setSelectedItems={setSelectedAges}\n selectedItems={selectedAges}\n counts={ageCounts}\n alwaysShowAll={true}\n />\n </RefinementPanel>\n </>\n )\n}\n\nexport default FiltersSection\n","import React from \"react\"\n\nimport { CloseButton } from \"../../components/shared/Buttons\"\nimport { ButtonLink } from \"../../components/shared/Links\"\nimport Typography from \"../../components/shared/Typography\"\n\nconst JoinInterstitial = ({ onDismiss }) => (\n <div className=\"relative max-w-5xl rounded-lg border border-orange bg-orange-light p-8\">\n <CloseButton className=\"absolute right-4 top-4 h-6 w-6\" onClick={onDismiss} />\n <Typography variant=\"h3\" as=\"h2\">\n Are you a holistic practitioner? Apply today to feature your practice.\n </Typography>\n <ButtonLink className=\"mt-4\" href=\"/pro\">\n Apply now\n </ButtonLink>\n </div>\n)\n\nexport default JoinInterstitial\n","import debounce from \"lodash/debounce\"\nimport React, { useEffect, useState } from \"react\"\n\nimport { updateLocationSearchText } from \"../../utils/utils\"\n\nimport { useSearchPageContext } from \"./SearchPageContext\"\n\nconst MapWithPins = () => {\n const { mapCenter, setMapCenter, setBoundingBox, mapZoom, setMapZoom, boundingBox, mapPins } = useSearchPageContext()\n const [map, setMap] = useState(null)\n\n useEffect(() => {\n async function initMap() {\n const { Map } = await window.google.maps.importLibrary(\"maps\")\n const map = new Map(document.getElementById(\"map\"), {\n center: mapCenter,\n zoom: mapZoom,\n disableDefaultUI: true,\n zoomControl: true,\n mapId: \"cfedcf9606fee63d\"\n })\n\n let initialLoad = true\n\n window.google.maps.event.addListenerOnce(map, \"tilesloaded\", function () {\n map.setZoom(mapZoom)\n map.addListener(\n \"idle\",\n debounce(() => {\n const northEast = map.getBounds().getNorthEast()\n const southWest = map.getBounds().getSouthWest()\n const newBoundingBox = [northEast.lat(), northEast.lng(), southWest.lat(), southWest.lng()]\n if (JSON.stringify(newBoundingBox) !== JSON.stringify(boundingBox)) {\n setBoundingBox(newBoundingBox)\n }\n\n const newCenter = map.getCenter()\n if (newCenter.lat() === mapCenter.lat && newCenter.lng() === mapCenter.lng) {\n // do nothing\n } else {\n const newCenterObject = { lat: newCenter.lat(), lng: newCenter.lng() }\n localStorage.setItem(\"mapCenter\", JSON.stringify(newCenterObject))\n setMapCenter(newCenterObject)\n }\n\n setMapZoom(map.getZoom())\n if (initialLoad) {\n updateLocationSearchText([newCenter.lat(), newCenter.lng()])\n initialLoad = false\n }\n }, 250)\n )\n })\n\n setMap(map)\n document.dispatchEvent(new CustomEvent(\"googlePlacesLoaded\"))\n }\n\n initMap()\n }, [])\n\n useEffect(() => {\n if (!map) return\n\n const onNewMapCenter = (e) => {\n console.log(\"newMapCenter event\", e.detail)\n map.setCenter(e.detail)\n map.setZoom(12)\n\n const northEast = map.getBounds().getNorthEast()\n const southWest = map.getBounds().getSouthWest()\n const newBoundingBox = [northEast.lat(), northEast.lng(), southWest.lat(), southWest.lng()]\n setBoundingBox(newBoundingBox)\n }\n\n const onNewMapZoom = (e) => {\n console.log(\"newMapZoom event\", e.detail)\n map.setZoom(e.detail)\n\n const northEast = map.getBounds().getNorthEast()\n const southWest = map.getBounds().getSouthWest()\n const newBoundingBox = [northEast.lat(), northEast.lng(), southWest.lat(), southWest.lng()]\n if (JSON.stringify(newBoundingBox) !== JSON.stringify(boundingBox)) {\n setBoundingBox(newBoundingBox)\n }\n }\n\n document.addEventListener(\"newMapCenter\", onNewMapCenter)\n document.addEventListener(\"newMapZoom\", onNewMapZoom)\n\n return () => {\n document.removeEventListener(\"newMapCenter\", onNewMapCenter)\n document.removeEventListener(\"newMapZoom\", onNewMapZoom)\n }\n }, [map])\n\n useEffect(() => {\n async function renderMarkers() {\n const { AdvancedMarkerElement, PinElement } = await window.google.maps.importLibrary(\"marker\")\n\n Object.entries(mapPins).forEach((item) => {\n const pin = item[1]\n const pinBackground = new PinElement({\n background: \"#0B3954\",\n borderColor: \"#0B3954\",\n glyphColor: \"rgba(255, 255, 255, 0.64)\"\n })\n const marker = new AdvancedMarkerElement({\n position: { lat: pin.lat, lng: pin.lng },\n content: pinBackground.element,\n title: pin.name,\n id: `marker-${pin.slug}`,\n map\n })\n marker.addListener(\"click\", (e) => {\n e.domEvent.preventDefault()\n const searchCard = document.getElementById(pin.slug)\n searchCard?.scrollIntoView({ behavior: \"smooth\" })\n searchCard?.focus()\n })\n pin.pinBackground = pinBackground\n pin.marker = marker\n })\n }\n\n if (window.google && map && mapPins) {\n renderMarkers()\n }\n }, [map, mapPins])\n\n return <div id=\"map\" className=\"h-full w-full\" />\n}\n\nexport default MapWithPins\n","import React from \"react\"\n\nimport { CloseButton } from \"../../components/shared/Buttons\"\nimport { ButtonLink } from \"../../components/shared/Links\"\nimport Typography from \"../../components/shared/Typography\"\n\nconst QuizInterstitial = ({ onDismiss }) => (\n <div className=\"relative max-w-5xl rounded-lg border border-teal bg-white p-8\">\n <CloseButton className=\"absolute right-4 top-4 h-6 w-6\" onClick={onDismiss} />\n <Typography variant=\"h3\" as=\"h2\">\n Get matched with the right practitioner now. It’s free and only takes 1 minute.\n </Typography>\n <div className=\"mt-4\">Answer a few questions to help us find you the best fit for your needs.</div>\n <ButtonLink className=\"mt-4\" href=\"/quizzes/new\">\n Match me now\n </ButtonLink>\n </div>\n)\n\nexport default QuizInterstitial\n","import { StarIcon } from \"@heroicons/react/24/solid\"\nimport React from \"react\"\n\nimport { searchPractitionerWebsiteUrl } from \"../../@core/practitioner/practitioner.utils\"\nimport { Button } from \"../../components/shared/Buttons\"\nimport { Divider } from \"../../components/shared/Layout\"\nimport Typography from \"../../components/shared/Typography\"\nimport { distanceInMiles } from \"../../utils/utils\"\n\nimport { useSearchPageContext } from \"./SearchPageContext\"\n\nconst formatAmount = (cents) => {\n if (cents === 0) {\n return \"Free\"\n } else {\n const dollars = cents / 100\n if (cents % 100 === 0) {\n return `$${dollars.toFixed(0)}`\n } else {\n return `$${dollars.toFixed(2)}`\n }\n }\n}\n\nconst ReviewSection = ({ hit }) => (\n <div className=\"mt-2 flex items-center gap-1\">\n <StarIcon className=\"h-5 w-5 text-orange\" />\n <span className=\"font-bold\">{hit.reviews_average === 5 ? \"5.0\" : hit.reviews_average}</span>\n <span className=\"ml-1 font-bold text-teal underline\">{hit.reviews_count} verified reviews</span>\n </div>\n)\n\nconst ServicesSection = ({ services }) => (\n <div className=\"flex flex-col gap-2\">\n {services.map((service) => (\n <div key={service.id}>\n <div className=\"font-bold\">\n <div className=\"line-clamp-2\" dangerouslySetInnerHTML={{ __html: service.name }} />\n </div>\n <div className=\"text-sm\">\n <span>{formatAmount(service.amount_cents)}</span> <span className=\"text-gray\">•</span>{\" \"}\n <span>{service.length} min</span>\n </div>\n </div>\n ))}\n </div>\n)\n\nconst SkillsSection = ({ hit }) => {\n const { selectedHealthIssues } = useSearchPageContext()\n const skills = hit.skills.filter((skill) => selectedHealthIssues.includes(skill.name) && skill.count > 0)\n\n if (skills.length === 0) return null\n\n return (\n <div className=\"mt-4 flex flex-wrap items-center gap-2\">\n {skills.slice(0, 2).map((skill) => (\n <div key={`${hit.objectID}-skill-${skill.name}`} className=\"flex items-stretch justify-center text-sm\">\n <div\n className={`rounded-l-lg border border-gray-light bg-gray-light px-3 py-1 ${\n skill.count === 0 ? \"rounded-lg\" : \"\"\n }`}\n dangerouslySetInnerHTML={{ __html: skill.name }}\n />\n {skill.count > 0 && (\n <div className=\"flex items-center rounded-r-lg border border-gray-light px-3 py-1\">{skill.count}</div>\n )}\n </div>\n ))}\n </div>\n )\n}\n\nconst SearchCard = ({ hit, showVirtualInsteadOfDistance = false }) => {\n const { mapCenter, virtualView, isMobile, mapPins } = useSearchPageContext()\n const services = hit.services.sort((a, b) => a.position - b.position).slice(0, 2)\n const widthResize = isMobile ? \"width:104\" : \"width:234\"\n\n const photoUrl = hit.user.profile_photos?.large?.webp\n ? `https://cdn.filestackcontent.com/resize=${widthResize}/${hit.user.profile_photos?.large?.webp}`\n : hit.user.photo\n\n const distance =\n virtualView || hit._geoloc === null\n ? null\n : showVirtualInsteadOfDistance || (hit.location_types.includes(\"virtual\") && hit.location_types.length === 1)\n ? \"Virtual\"\n : `${distanceInMiles(mapCenter.lat, mapCenter.lng, hit._geoloc.lat, hit._geoloc.lng).toFixed(1)} mi`\n\n const websiteUrl = searchPractitionerWebsiteUrl(hit)\n\n return (\n <a\n onClick={() => window.sessionStorage.setItem(\"scrollPosition\", window.scrollY)}\n id={hit.user.slug}\n href={websiteUrl}\n onMouseEnter={() => {\n const marker = mapPins && mapPins[Number(hit.objectID)]?.marker\n const pinBackground = mapPins && mapPins[Number(hit.objectID)]?.pinBackground\n\n if (!marker || !pinBackground) return\n marker.zIndex = 1\n pinBackground.background = \"rgb(var(--color-orange))\"\n pinBackground.borderColor = \"rgb(var(--color-orange))\"\n }}\n onMouseLeave={() => {\n const marker = mapPins && mapPins[Number(hit.objectID)]?.marker\n const pinBackground = mapPins && mapPins[Number(hit.objectID)]?.pinBackground\n\n if (!marker || !pinBackground) return\n marker.zIndex = 0\n pinBackground.background = \"#0B3954\"\n pinBackground.borderColor = \"#0B3954\"\n }}\n className=\"group mb-8 block w-full max-w-5xl rounded-lg border-gray-light bg-white p-8 focus:outline-none focus:ring-2 focus:ring-blue min_md:hover:border-gray min_md:hover:shadow sm:-ml-6 sm:mb-0 sm:box-content sm:rounded-none sm:border-b sm:p-6 min_sm:border\">\n <div className=\"relative flex items-center gap-8\">\n {window.location.search.includes(\"debug\") && (\n <div className=\"absolute -right-8 -top-8 rounded-lg border border-gray bg-red-light px-2 py-0.5 text-xs font-extrabold\">\n <div>Score: {hit.ranking_score}</div>\n <div>{hit.reviews_count} reviews</div>\n {hit.doctor ? <div>x3 for doctor</div> : hit.licensed ? <div>x2 for licensed</div> : null}\n </div>\n )}\n <div className=\"relative flex-none\">\n {!virtualView && mapCenter && hit._geoloc && (\n <div className=\"absolute -left-2 -top-2 z-10 rounded-lg border border-gray bg-gray-ultralight px-2 py-0.5 text-xs font-extrabold sm:hidden\">\n {distance}\n </div>\n )}\n <div className=\"h-[232px] w-[200px] flex-none overflow-hidden rounded-lg bg-gray-ultralight sm:h-[104px] sm:w-[104px]\">\n <img\n src={photoUrl}\n alt={hit.user.name}\n className=\"h-full w-full rounded-lg object-cover transition-all duration-500 min_md:group-hover:scale-110\"\n loading=\"lazy\"\n />\n </div>\n {!isMobile && (\n <div className=\"mt-4 flex gap-4 sm:hidden\">\n {hit.gallery_images.slice(0, 2).map((image) => (\n <img\n key={image.id}\n src={`https://cdn.filestackcontent.com/resize=width:92/${image.filestack_photo?.square?.webp}`}\n alt={hit.user.name}\n className=\"h-[92px] w-[92px] flex-none rounded-lg object-cover\"\n loading=\"lazy\"\n />\n ))}\n </div>\n )}\n </div>\n <div className=\"overflow-hidden\">\n <h2 className=\"flex items-center gap-2\">\n <div\n className=\"line-clamp-1 min_md:group-hover:underline\"\n dangerouslySetInnerHTML={{ __html: hit.user.name }}\n />\n <img className=\"h-6 w-6 text-teal\" src=\"/images/icons/verified.svg\" alt=\"Verified\" />\n </h2>\n <Typography variant=\"h5\" as=\"h2\">\n <div\n className=\"line-clamp-2 min_md:group-hover:underline\"\n dangerouslySetInnerHTML={{ __html: hit.user.title }}\n />\n </Typography>\n <div className=\"sm:hidden\">\n <ReviewSection hit={hit} />\n <div className=\"text-gray-dark\">{hit.city_state}</div>\n <Divider />\n <ServicesSection services={services} />\n <SkillsSection hit={hit} />\n <div\n className=\"mt-4 line-clamp-2 text-gray-dark\"\n dangerouslySetInnerHTML={{ __html: hit.website_headline || hit.headline }}\n />\n </div>\n </div>\n </div>\n <div className=\"hidden sm:block\">\n <ReviewSection hit={hit} />\n <div className=\"mb-4 mt-2 flex items-center gap-2\">\n <div>{hit.city_state}</div>\n {!virtualView && mapCenter && hit._geoloc && (\n <div className=\"rounded-lg border border-gray bg-gray-ultralight px-2 py-0.5 text-xs font-extrabold\">\n {distance}\n </div>\n )}\n </div>\n <ServicesSection services={services} />\n <SkillsSection hit={hit} />\n <div\n className=\"mt-4 line-clamp-2 text-gray-dark\"\n dangerouslySetInnerHTML={{ __html: hit.website_headline || hit.headline }}\n />\n </div>\n <Button\n type=\"secondary\"\n className=\"mt-4 h-10 w-full transition-all duration-500 min_md:group-hover:bg-teal min_md:group-hover:text-white\"\n href={websiteUrl}>\n View website\n </Button>\n </a>\n )\n}\n\nexport default SearchCard\n","import React from \"react\"\n\nimport { SearchPill } from \"../../components/shared/Pill\"\n\nconst SearchPills = ({ selectedItems, setSelectedItems, mapping }) => (\n <>\n {selectedItems.map((item) => (\n <SearchPill key={item} onCloseButtonClick={() => setSelectedItems(selectedItems.filter((t) => t !== item))}>\n {mapping && mapping[item] ? mapping[item] : item.replace(/\\s*\\(.*\\)$/, \"\")}\n </SearchPill>\n ))}\n </>\n)\n\nexport default SearchPills\n","import { ChevronDownIcon } from \"@heroicons/react/24/outline\"\nimport { AdjustmentsHorizontalIcon } from \"@heroicons/react/24/solid\"\nimport React, { useEffect, useRef, useState } from \"react\"\nimport Skeleton from \"react-loading-skeleton\"\n\nimport { Button } from \"../components/shared/Buttons\"\nimport { Divider } from \"../components/shared/Layout\"\nimport LoadingSpinner from \"../components/shared/LoadingSpinner\"\nimport { MobileFullScreenModal } from \"../components/shared/Modal\"\nimport { SearchPill } from \"../components/shared/Pill\"\nimport useWindowSize from \"../hooks/useWindowSize\"\nimport { updateLocationSearchText } from \"../utils/utils\"\n\nimport FiltersSection from \"./SearchPage/FiltersSection\"\nimport JoinInterstitial from \"./SearchPage/JoinInterstitial\"\nimport LocationSearchBox from \"./SearchPage/LocationSearchBox\"\nimport MapWithPins from \"./SearchPage/MapWithPins\"\nimport QuizInterstitial from \"./SearchPage/QuizInterstitial\"\nimport SearchCard from \"./SearchPage/SearchCard\"\nimport { useSearchPageContext, SearchPageProvider } from \"./SearchPage/SearchPageContext\"\nimport SearchPills from \"./SearchPage/SearchPills\"\n\nconst filtersSectionWidth = 312\n\nconst FallbackSection = ({ title, hits, keyPrefix, showDivider, showVirtualInsteadOfDistance = false }) => {\n const { isMobile } = useSearchPageContext()\n\n return (\n <>\n {!isMobile && showDivider && <Divider className=\"h-0.5 shadow\" />}\n <h3 className=\"mb-6 font-bold text-gray-dark sm:my-4\">{title}</h3>\n <ul>\n {hits.map((hit) => (\n <li key={keyPrefix + \"-\" + hit.objectID}>\n <SearchCard hit={hit} showVirtualInsteadOfDistance={showVirtualInsteadOfDistance} />\n </li>\n ))}\n </ul>\n </>\n )\n}\n\nconst SearchPage = ({ loggedInAsPro }) => {\n const {\n isMobile,\n query,\n setQuery,\n radiusInMiles,\n setRadiusInMiles,\n selectedTherapies,\n setSelectedTherapies,\n selectedHealthIssues,\n setSelectedHealthIssues,\n selectedLocations,\n setSelectedLocations,\n selectedLanguages,\n selectedAges,\n showMap,\n setMapCenter,\n hits,\n nbHits,\n defaultLatLng,\n isLastPage,\n showMore,\n loading,\n mapCenter,\n googlePlacesLoaded,\n similarQueryFallbackState,\n nearbyFallbackState,\n virtualFallbackState,\n resetFilters,\n similarQueryFallbackSearch,\n nearbyFallbackSearch,\n virtualFallbackSearch,\n performedFallbackSearches,\n setPerformedFallbackSearches\n } = useSearchPageContext()\n\n const [mobileFiltersShown, setMobileFiltersShown] = useState(false)\n const [joinInterstitialDismissed, setJoinInterstitialDismissed] = useState(false)\n const [quizInterstitialDismissed, setQuizInterstitialDismissed] = useState(false)\n const sentinelRef = useRef(null)\n const searchResultsRef = useRef(null)\n const mobileFiltersRef = useRef(null)\n const containerRef = useRef(null)\n const { width } = useWindowSize()\n\n const filtersCount =\n selectedTherapies.length + selectedHealthIssues.length + selectedLanguages.length + selectedAges.length\n\n useEffect(() => {\n if (sentinelRef.current !== null) {\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n if (!isLastPage) {\n showMore()\n } else if (!performedFallbackSearches) {\n setPerformedFallbackSearches(true)\n if (query && !similarQueryFallbackState.queryCompleted) similarQueryFallbackSearch()\n if (!(selectedLocations.length === 1 && selectedLocations.includes(\"virtual\"))) {\n if (!nearbyFallbackState.queryCompleted) nearbyFallbackSearch()\n if (!virtualFallbackState.queryCompleted) virtualFallbackSearch()\n }\n }\n }\n })\n })\n\n observer.observe(sentinelRef.current)\n\n return () => {\n observer.disconnect()\n }\n }\n }, [isLastPage, showMore])\n\n useEffect(() => {\n const onRefinementChanged = (e) => setQuery(e.detail.name)\n\n document.addEventListener(\"refinementChanged\", onRefinementChanged)\n\n if (mapCenter === null) {\n setMapCenter(defaultLatLng)\n updateLocationSearchText([defaultLatLng.lat, defaultLatLng.lng])\n } else if (mapCenter) {\n updateLocationSearchText([mapCenter.lat, mapCenter.lng])\n }\n\n const onScroll = () => {\n if (mobileFiltersRef.current && containerRef.current) {\n if (window.scrollY >= 64) {\n mobileFiltersRef.current.style.top = 0\n mobileFiltersRef.current.style.left = 0\n mobileFiltersRef.current.style.right = 0\n mobileFiltersRef.current.style.paddingLeft = \"24px\"\n mobileFiltersRef.current.style.paddingRight = \"24px\"\n mobileFiltersRef.current.style.paddingBottom = \"16px\"\n mobileFiltersRef.current.style.position = \"fixed\"\n mobileFiltersRef.current.style.borderBottom = \"1px solid rgb(var(--color-light-gray))\"\n if (isMobile) {\n containerRef.current.style.paddingTop = \"128px\"\n }\n } else {\n mobileFiltersRef.current.style.position = \"static\"\n mobileFiltersRef.current.style.borderBottom = \"none\"\n mobileFiltersRef.current.style.paddingLeft = 0\n mobileFiltersRef.current.style.paddingRight = 0\n containerRef.current.style.paddingTop = 0\n }\n }\n }\n\n window.addEventListener(\"scroll\", onScroll)\n\n return () => {\n document.removeEventListener(\"refinementChanged\", onRefinementChanged)\n window.removeEventListener(\"scroll\", onScroll)\n }\n }, [])\n\n useEffect(() => {\n if (width > 0 && width < 640) {\n document.body.classList.remove(\"has-navbar-fixed-top\")\n document.querySelector(\"nav\").classList.remove(\"fixed\")\n } else {\n document.body.classList.add(\"has-navbar-fixed-top\")\n document.querySelector(\"nav\").classList.add(\"fixed\")\n }\n }, [width])\n\n useEffect(() => {\n if (hits?.length === 0 && !performedFallbackSearches) {\n setPerformedFallbackSearches(true)\n if (query && !similarQueryFallbackState.queryCompleted) similarQueryFallbackSearch()\n if (!(selectedLocations.length === 1 && selectedLocations.includes(\"virtual\"))) {\n if (!nearbyFallbackState.queryCompleted) nearbyFallbackSearch()\n if (!virtualFallbackState.queryCompleted) virtualFallbackSearch()\n }\n }\n }, [hits])\n\n let numberOfResults =\n nbHits + similarQueryFallbackState.nbHits + nearbyFallbackState.nbHits + virtualFallbackState.nbHits\n if (numberOfResults > 99) numberOfResults = \"99+\"\n\n return (\n <>\n <div ref={containerRef}>\n <div\n className=\"fixed z-30 h-screen min-h-100 overflow-y-auto border-r border-gray-light bg-white p-8 pb-[80px] md:hidden\"\n style={{ width: filtersSectionWidth }}>\n <FiltersSection />\n </div>\n <div\n ref={searchResultsRef}\n className={`min-h-screen overflow-y-auto bg-gray-ultralight p-8 sm:w-full sm:bg-white sm:p-6 sm:pt-0 ${\n showMap ? \"min_search_tablet:w-[calc(50%-156px)] min_search_tablet:min-w-[650px]\" : \"\"\n }`}\n style={{\n marginLeft: isMobile ? 0 : filtersSectionWidth,\n width: showMap ? null : \"100% !important\"\n }}>\n <div className=\"-mx-6 mb-6 hidden border-b border-gray-light px-6 sm:block\">\n <div className=\"z-10 bg-white pb-4\" ref={mobileFiltersRef}>\n <div className=\"flex items-center justify-between gap-4 py-4\">\n <div className=\"w-full\">\n {googlePlacesLoaded ? <LocationSearchBox /> : <Skeleton className=\"h-8 w-full\" />}\n </div>\n <Button\n type={filtersCount > 0 ? \"secondary\" : \"tertiary\"}\n onClick={() => setMobileFiltersShown(true)}\n className=\"flex h-10 flex-none items-center gap-2\">\n <AdjustmentsHorizontalIcon className=\"h-5 w-5\" />\n <span>{`Filters${filtersCount > 0 ? ` (${filtersCount})` : \"\"}`}</span>\n </Button>\n </div>\n <div className=\"-mr-6 flex gap-4 overflow-x-auto\">\n {[\"Services\", \"Health issues\", \"Locations\", \"Languages\", \"Client ages\"].map((filter) => (\n <Button\n type=\"tertiary\"\n key={filter}\n onClick={() => setMobileFiltersShown(true)}\n className=\"flex h-10 flex-none items-center gap-2\">\n <span>{filter}</span>\n <ChevronDownIcon className=\"h-5 w-5\" />\n </Button>\n ))}\n </div>\n </div>\n </div>\n <div>\n <div className=\"mb-4 flex justify-between sm:mb-6\">\n <div className=\"flex gap-2 sm:-mr-6 sm:overflow-x-auto min_sm:flex-wrap\">\n {query && (\n <SearchPill\n onCloseButtonClick={() => {\n setQuery(\"\")\n document.dispatchEvent(new CustomEvent(\"resetSearchField\"))\n }}>\n "{query}"\n </SearchPill>\n )}\n <SearchPills\n selectedItems={selectedLocations}\n setSelectedItems={setSelectedLocations}\n mapping={{\n virtual: \"Virtual\",\n office: \"At a practice\",\n home: \"At my home\"\n }}\n />\n {radiusInMiles && (\n <SearchPill onCloseButtonClick={() => setRadiusInMiles(null)}>\n Within {radiusInMiles} miles\n </SearchPill>\n )}\n <SearchPills selectedItems={selectedTherapies} setSelectedItems={setSelectedTherapies} />\n <SearchPills selectedItems={selectedHealthIssues} setSelectedItems={setSelectedHealthIssues} />\n </div>\n </div>\n <ul>\n {hits?.map((hit, i) => (\n <React.Fragment key={hit.objectID}>\n {i === 5 && !loggedInAsPro && !joinInterstitialDismissed && (\n <li className=\"mb-8 sm:-mx-6 sm:mb-0 sm:border-b sm:border-gray-light sm:p-6\">\n <JoinInterstitial onDismiss={() => setJoinInterstitialDismissed(true)} />\n </li>\n )}\n {i === 10 && !loggedInAsPro && !quizInterstitialDismissed && (\n <li className=\"mb-8 sm:-mx-6 sm:mb-0 sm:border-b sm:border-gray-light sm:p-6\">\n <QuizInterstitial onDismiss={() => setQuizInterstitialDismissed(true)} />\n </li>\n )}\n <li>\n <SearchCard hit={hit} />\n </li>\n </React.Fragment>\n ))}\n {hits?.length > 0 && <li ref={sentinelRef} aria-hidden=\"true\" />}\n </ul>\n {similarQueryFallbackState.nbHits > 0 && (\n <FallbackSection\n title={`${nbHits > 0 ? \"More practitioners\" : \"Practitioners\"} offering services similar to ${query}`}\n hits={similarQueryFallbackState.hits}\n keyPrefix=\"similarQuery\"\n showDivider={nbHits > 0}\n />\n )}\n {nearbyFallbackState.nbHits > 0 && (\n <FallbackSection\n title={`${\n nearbyFallbackState.nbHits === 1 ? \"One more practitioner\" : \"More practitioners\"\n } found nearby`}\n hits={nearbyFallbackState.hits}\n keyPrefix=\"nearbyFallback\"\n showDivider={nbHits > 0 || similarQueryFallbackState.nbHits > 0}\n />\n )}\n {virtualFallbackState.nbHits > 0 && (\n <FallbackSection\n title={`${\n nbHits > 0 || similarQueryFallbackState.nbHits > 0 || nearbyFallbackState.nbHits > 0\n ? \"More practitioners\"\n : \"Practitioners\"\n } offering virtual services`}\n hits={virtualFallbackState.hits}\n keyPrefix=\"virtualFallback\"\n showDivider={nbHits > 0 || similarQueryFallbackState.nbHits > 0 || nearbyFallbackState.nbHits > 0}\n showVirtualInsteadOfDistance={true}\n />\n )}\n {loading ||\n similarQueryFallbackState.fetching ||\n nearbyFallbackState.fetching ||\n virtualFallbackState.fetching ? (\n <LoadingSpinner className=\"py-0\" />\n ) : nbHits === 0 &&\n similarQueryFallbackState.nbHits === 0 &&\n nearbyFallbackState.nbHits === 0 &&\n virtualFallbackState.nbHits === 0 ? (\n <div className=\"mt-8 font-bold text-gray-dark\">\n No results found for {query ? <span>"{query}"</span> : \"your search\"}. Try removing some\n filters or try a different search.\n </div>\n ) : null}\n </div>\n </div>\n {showMap && (\n <div\n className=\"fixed bottom-0 right-0 top-[80px] z-30 w-[calc(50%-156px)] border-l border-gray-light\"\n style={{ maxWidth: \"calc(100vw - 962px)\" }}>\n {showMap ? <MapWithPins /> : <div id=\"map\" className=\"h-full w-full\" />}\n </div>\n )}\n {isMobile && (\n <MobileFullScreenModal\n hideModal={() => {\n setMobileFiltersShown(false)\n setTimeout(() => {\n window.scrollTo(0, 0)\n }, 100)\n }}\n visible={mobileFiltersShown}\n header=\"Filters\"\n showFooter={true}\n animate={false}\n actionButtonCopy={`Show ${numberOfResults} results`}\n onSave={() => {\n setMobileFiltersShown(false)\n setTimeout(() => {\n window.scrollTo(0, 0)\n }, 100)\n }}\n cancelButtonCopy=\"Reset\"\n onCancel={() => {\n resetFilters()\n setMobileFiltersShown(false)\n setTimeout(() => {\n window.scrollTo(0, 0)\n }, 100)\n }}\n unmount={false}>\n <FiltersSection />\n </MobileFullScreenModal>\n )}\n </div>\n </>\n )\n}\n\nexport default function Page({\n latLng,\n therapyCategories,\n healthIssues,\n languages,\n ages,\n loggedInAsPro,\n searchParams,\n isMobile,\n isTablet\n}) {\n return (\n <SearchPageProvider\n mobile={isMobile}\n tablet={isTablet || isMobile}\n therapyCategories={therapyCategories}\n healthIssues={healthIssues}\n defaultLatLng={latLng}\n languages={languages}\n ages={ages}\n searchParams={searchParams}>\n <SearchPage loggedInAsPro={loggedInAsPro} />\n </SearchPageProvider>\n )\n}\n","import { Combobox } from \"@headlessui/react\"\nimport { MapPinIcon } from \"@heroicons/react/24/solid\"\nimport capitalize from \"lodash/capitalize\"\nimport React, { useEffect, useState } from \"react\"\nimport usePlacesService from \"react-google-autocomplete/lib/usePlacesAutocompleteService\"\nimport { twMerge } from \"tailwind-merge\"\n\nimport { BASE_INPUT_CLASSNAMES, DROPDOWN_CLASSNAMES, DROPDOWN_OPTION_CLASSNAMES } from \"../../components/shared/Inputs\"\nimport LoadingSpinner from \"../../components/shared/LoadingSpinner\"\nimport useWindowSize from \"../../hooks/useWindowSize\"\nimport { stripUSAFromString } from \"../../utils/utils\"\n\nconst LocationSearchBox = () => {\n const { width } = useWindowSize()\n const isMobile = width <= 768\n const [inputText, setInputText] = useState(\"\")\n\n const { placesService, placePredictions, getPlacePredictions, isPlacePredictionsLoading } = usePlacesService({\n debounce: 100,\n options: {\n types: [\"locality\", \"administrative_area_level_3\", \"postal_code\"]\n }\n })\n\n useEffect(() => {\n const onNewLocationChosen = (e) => setInputText(e.detail)\n document.addEventListener(\"newLocationChosen\", onNewLocationChosen)\n\n return () => {\n document.removeEventListener(\"newLocationChosen\", onNewLocationChosen)\n }\n }, [])\n\n return (\n <Combobox\n as=\"div\"\n className=\"sm:flex-1\"\n value={inputText}\n onChange={(item) => {\n if (item) {\n placesService.getDetails({ placeId: item.place_id }, (place) => {\n const newMapCenter = { lat: place.geometry.location.lat(), lng: place.geometry.location.lng() }\n const event = new CustomEvent(\"newMapCenter\", { detail: newMapCenter })\n document.dispatchEvent(event)\n setInputText(stripUSAFromString(item.description))\n })\n }\n }}>\n <div className=\"relative\">\n <Combobox.Input\n onChange={(evt) => {\n setInputText(evt.target.value)\n getPlacePredictions({ input: evt.target.value })\n }}\n className={twMerge(BASE_INPUT_CLASSNAMES, \"sm:py-[7px] min_sm:w-[260px] min_sm:rounded-l-none\")}\n placeholder=\"Location\"\n />\n {isPlacePredictionsLoading ? (\n <LoadingSpinner className=\"absolute right-2 top-2 py-0\" spinnerClassName=\"h-5 w-5\" />\n ) : (\n <MapPinIcon className=\"absolute right-1.5 top-1.5 h-6 w-6 text-gray-dark opacity-[0.64] sm:top-[7px]\" />\n )}\n </div>\n {placePredictions?.length > 0 && !isPlacePredictionsLoading && (\n <Combobox.Options\n className={twMerge(DROPDOWN_CLASSNAMES, \"fixed w-[260px] sm:w-[calc(100%-48px)]\")}\n style={{ maxWidth: isMobile ? 300 : 260 }}>\n {placePredictions.map((item) => (\n <Combobox.Option key={item.description} className={DROPDOWN_OPTION_CLASSNAMES} value={item}>\n <div\n dangerouslySetInnerHTML={{\n __html: stripUSAFromString(item.description).replace(\n new RegExp(inputText, \"i\"),\n `<mark style='font-weight: bold'>${capitalize(inputText)}</mark>`\n )\n }}\n />\n </Combobox.Option>\n ))}\n </Combobox.Options>\n )}\n </Combobox>\n )\n}\n\nexport default LocationSearchBox\n","import { Combobox } from \"@headlessui/react\"\nimport { StarIcon } from \"@heroicons/react/24/solid\"\nimport algoliasearch from \"algoliasearch/lite\"\nimport React, { useEffect, useState } from \"react\"\nimport { Configure, Index, InstantSearch, useHits, useSearchBox } from \"react-instantsearch\"\nimport { twMerge } from \"tailwind-merge\"\n\nimport { searchPractitionerWebsiteUrl } from \"../../@core/practitioner/practitioner.utils\"\nimport { CloseButton } from \"../../components/shared/Buttons\"\nimport { BASE_INPUT_CLASSNAMES, DROPDOWN_CLASSNAMES, DROPDOWN_OPTION_CLASSNAMES } from \"../../components/shared/Inputs\"\nimport Typography from \"../../components/shared/Typography\"\n\nimport LocationSearchBox from \"./LocationSearchBox\"\n\nconst searchClient = algoliasearch(\n process.env.ALGOLIA_HEALME_SEARCH_APPLICATION_ID,\n process.env.ALGOLIA_HEALME_SEARCH_CLIENT_API_KEY\n)\n\nconst SearchBox = (props) => {\n const { refine } = useSearchBox()\n const urlParams = new URLSearchParams(window.location.search)\n const defaultQuery = urlParams.get(\"query\") || \"\"\n const [inputValue, setInputValue] = useState(defaultQuery)\n const [googlePlacesLoaded, setGooglePlacesLoaded] = useState(false)\n\n const setQuery = (newQuery) => {\n setInputValue(newQuery)\n refine(newQuery)\n }\n\n useEffect(() => {\n const onSearchFieldReset = () => setInputValue(\"\")\n const onGooglePlacesLoaded = () => setGooglePlacesLoaded(true)\n document.addEventListener(\"resetSearchField\", onSearchFieldReset)\n document.addEventListener(\"googlePlacesLoaded\", onGooglePlacesLoaded)\n\n return () => {\n document.removeEventListener(\"resetSearchField\", onSearchFieldReset)\n document.removeEventListener(\"googlePlacesLoaded\", onGooglePlacesLoaded)\n }\n }, [])\n\n return (\n <div className=\"ml-12 flex sm:hidden\">\n <Combobox\n value={inputValue}\n onChange={(hit) => {\n if (hit.user) {\n window.location.href = searchPractitionerWebsiteUrl(hit)\n } else {\n setInputValue(hit)\n const event = new CustomEvent(\"refinementChanged\", { detail: hit })\n document.dispatchEvent(event)\n }\n }}>\n <div className=\"relative\">\n <Combobox.Input\n placeholder=\"Try “Massage†or “Back painâ€\"\n {...props}\n onChange={(event) => setQuery(event.target.value)}\n displayValue={(hit) => hit.name || inputValue || \"\"}\n className={twMerge(BASE_INPUT_CLASSNAMES, \"w-[260px] rounded-r-none\")}\n />\n {inputValue !== \"\" && (\n <CloseButton\n onClick={() => {\n setQuery(\"\")\n const event = new CustomEvent(\"refinementChanged\", { detail: { name: \"\" } })\n document.dispatchEvent(event)\n }}\n className=\"absolute right-0 top-0 mr-2 mt-[9px] h-5 w-5\"\n />\n )}\n </div>\n <Combobox.Options className={twMerge(DROPDOWN_CLASSNAMES, \"fixed mt-[42px] max-h-[700px] w-[520px]\")}>\n {/* this is needed so you can search a custom string and not just an option from the dropdown */}\n {inputValue !== \"\" && (\n <Combobox.Option value={{ id: null, name: inputValue }} className=\"hidden\">\n {inputValue}\n </Combobox.Option>\n )}\n <Index indexName=\"Specialty\">\n <Configure hitsPerPage={6} />\n <SpecialtySearchResults />\n </Index>\n <Index indexName=\"Practice_production\">\n <Configure hitsPerPage={3} />\n <PractitionerSearchResults />\n </Index>\n </Combobox.Options>\n </Combobox>\n {googlePlacesLoaded && <LocationSearchBox />}\n </div>\n )\n}\n\nconst SpecialtySearchResults = () => {\n const { hits } = useHits()\n const therapies = hits.filter((hit) => hit.ordered_kind === 1)\n const healthConditions = hits.filter((hit) => hit.ordered_kind !== 1)\n\n return (\n <div>\n {therapies.length > 0 && (\n <>\n <Typography className=\"px-3 py-2\" variant=\"capitalHeading\">\n Therapies\n </Typography>\n {therapies.map((hit) => (\n <Combobox.Option\n key={hit.objectID}\n value={hit}\n className={({ active, selected }) =>\n twMerge(\"cursor-pointer px-3 py-2 font-bold\", selected ? \"bg-gray\" : active ? \"bg-gray-ultralight\" : \"\")\n }>\n <button\n dangerouslySetInnerHTML={{\n __html: hit._highlightResult.name.value.replace(\n \"<mark>\",\n \"<mark style='font-weight: normal; color: rgb(var(--color-dark-gray))'>\"\n )\n }}\n onClick={() => {\n const event = new CustomEvent(\"refinementChanged\", { detail: hit })\n document.dispatchEvent(event)\n }}\n />\n </Combobox.Option>\n ))}\n </>\n )}\n {healthConditions.length > 0 && (\n <>\n <Typography className=\"px-3 py-2\" variant=\"capitalHeading\">\n Health Conditions\n </Typography>\n {healthConditions.map((hit) => (\n <Combobox.Option\n key={hit.objectID}\n value={hit}\n className={({ active, selected }) =>\n twMerge(\"cursor-pointer px-3 py-2 font-bold\", selected ? \"bg-gray\" : active ? \"bg-gray-ultralight\" : \"\")\n }>\n <button\n dangerouslySetInnerHTML={{\n __html: hit._highlightResult.name.value.replace(\n \"<mark>\",\n \"<mark style='font-weight: normal; color: rgb(var(--color-dark-gray))'>\"\n )\n }}\n onClick={() => {\n const event = new CustomEvent(\"refinementChanged\", { detail: hit })\n document.dispatchEvent(event)\n }}\n />\n </Combobox.Option>\n ))}\n </>\n )}\n </div>\n )\n}\n\nconst PractitionerSearchResults = () => {\n const { hits } = useHits()\n\n const getPhotoUrl = (hit) => {\n const photoUrl = hit.user.profile_photos?.small?.webp\n ? `https://cdn.filestackcontent.com/${hit.user.profile_photos?.small?.webp}`\n : hit.user.photo\n\n return photoUrl\n }\n\n return (\n <div>\n <Typography className=\"px-3 py-2\" variant=\"capitalHeading\">\n Practitioners\n </Typography>\n {hits.map((hit) => (\n <Combobox.Option key={hit.objectID} value={hit} className={DROPDOWN_OPTION_CLASSNAMES}>\n <a className=\"flex items-center gap-2\" href={searchPractitionerWebsiteUrl(hit)}>\n <img className=\"h-10 w-10 rounded-full\" src={getPhotoUrl(hit)} alt={hit.user.name} />\n <div>\n <div\n className=\"font-bold\"\n dangerouslySetInnerHTML={{\n __html: hit._highlightResult.user.name.value.replace(\n \"<mark>\",\n \"<mark style='font-weight: normal; color: rgb(var(--color-dark-gray))'>\"\n )\n }}\n />\n <div className=\"flex items-center gap-1 font-bold\">\n <StarIcon className=\"h-5 w-5 text-orange\" />\n <span>{hit.reviews_average === 5 ? \"5.0\" : hits.reviews_average}</span>\n <span className=\"text-teal\">{hit.reviews_count} reviews</span>\n </div>\n </div>\n </a>\n </Combobox.Option>\n ))}\n </div>\n )\n}\n\nconst TopNavSearchBox = () => (\n <InstantSearch searchClient={searchClient} indexName=\"Specialty\">\n <SearchBox />\n </InstantSearch>\n)\n\nexport default TopNavSearchBox\n"],"names":["websiteSubscriptionTypes","practitionerWebsiteUrl","user","practice","slug","vanitySlug","website","includes","subscriptionType","searchPractitionerWebsiteUrl","hit","custom_domain_host","vanity_slug","subscription_type","startsWith","EndorsementPill","children","draggable","active","className","onCloseButtonClick","rest","Tag","React","Object","assign","twMerge","EllipsisVerticalIcon","onClick","XMarkIcon","SearchPill","FacetList","items","selectedItems","setSelectedItems","counts","searchable","searchSubtext","alwaysShowAll","filteredItems","setFilteredItems","useState","isShowingMore","setIsShowingMore","searchValue","setSearchValue","canToggleShowMore","length","SearchInput","type","autoComplete","autoCorrect","autoCapitalize","spellCheck","maxLength","containerClassName","explanatorySubtext","value","onChange","event","newItems","filter","item","toLowerCase","target","slice","map","key","CheckBox","id","checked","prevItems","prevItem","label","memo","shouldShowMap","isTablet","mapCenter","selectedLocations","window","isVirtualView","performSearch","searchIndex","selectedTherapies","selectedHealthIssues","offersFreeConsult","selectedLanguages","selectedAges","currentPage","boundingBox","showMap","radiusInMiles","query","similarQuery","additionalFilters","virtualFallback","hitsPerPage","onSuccess","undefined","filters","filtersString","selectedTherapyFilters","therapy","replace","join","selectedHealthIssueFilters","condition","selectedLocationFilters","location","freeConsultFilter","selectedLanguagesFilters","language","selectedAgeWorkWithFilters","age","Boolean","searchOptions","getSearchOptions","options","page","facets","virtualView","insideBoundingBox","aroundRadius","aroundPrecision","aroundLatLng","lat","lng","attributesToHighlight","search","then","searchResponse","doubleBoundingBoxSize","deltaX","deltaY","newTopLeft","newBottomRight","concat","SearchPageContext","createContext","searchClient","algoliasearch","process","indexName","countsIndex","initIndex","SearchPageProvider","therapyCategories","healthIssues","defaultLatLng","languages","ages","mobile","tablet","width","useWindowSize","isMobile","setIsMobile","setIsTablet","useEffect","urlParams","URLSearchParams","defaultQuery","get","defaultRadius","parseInt","mapCenterParam","latLng","split","coord","parseFloat","defaultMapCenter","localStorage","JSON","parse","getItem","defaultTherapies","defaultHealthIssues","defaultLocations","defaultOffersFreeConsult","defaultLanguages","defaultAges","defaultMapZoom","defaultBoundingBox","setQuery","setRadiusInMiles","setMapCenter","setBoundingBox","setSelectedTherapies","setSelectedHealthIssues","setSelectedLocations","setOffersFreeConsult","setSelectedLanguages","setSelectedAges","mapZoom","setMapZoom","inPersonCounts","setInPersonCounts","healthIssueCounts","setHealthIssueCounts","languageCounts","setLanguageCounts","ageCounts","setAgeCounts","hits","setHits","nbHits","setNbHits","isLastPage","setIsLastPage","setCurrentPage","isFetchingNextPage","setIsFetchingNextPage","loading","setLoading","poppingState","setPoppingState","previousSearch","setPreviousSearch","googlePlacesLoaded","setGooglePlacesLoaded","shouldDynamicZoom","setShouldDynamicZoom","performedFallbackSearches","setPerformedFallbackSearches","mapPins","setMapPins","similarQueryFallbackState","setSimilarQueryFallbackState","nearbyFallbackState","setNearbyFallbackState","virtualFallbackState","setVirtualFallbackState","onPopState","onNewMapCenter","e","detail","setItem","stringify","addEventListener","document","async","google","maps","importLibrary","dispatchEvent","CustomEvent","initPlaces","fetch","response","json","data","catch","error","console","removeEventListener","searchParams","nbPages","searchString","newSearch","health_issues","age_work_withs","prevHits","newZoom","scrollTo","updateUrl","queryParams","set","has","history","pushState","queryString","toString","countsSearchParams","reduce","acc","therapies","forEach","timeout","setTimeout","savedScrollPosition","sessionStorage","removeItem","clearTimeout","resetFilters","useCallback","Provider","locationOptions","showMore","prev","similarQueryFallbackSearch","newSearchParams","state","fetching","newHits","differenceBy","queryCompleted","nearbyFallbackSearch","virtualFallbackSearch","inPersonOnly","name","virtualSearchParams","useSearchPageContext","useContext","HealthIssuesFacetList","numShown","setNumShown","shownHealthIssues","sort","a","b","aSelected","bSelected","localeCompare","LocationFilters","locations","RefinementPanel","title","expanded","isExpanded","setIsExpanded","ChevronUpIcon","ChevronDownIcon","TherapiesFilters","inPersonTherapies","filteredInPersonTherapies","setFilteredInPersonTherapies","numInPersonTherapiesShown","setNumInPersonTherapiesShown","canToggleShowMoreInPerson","virtualTherapies","filteredVirtualTherapies","setFilteredVirtualTherapies","numVirtualTherapiesShown","setNumVirtualTherapiesShown","canToggleShowMoreVirtual","virtualCounts","count","inPersonTherapiesShown","virtualTherapiesShown","newVirtualTherapies","newInPersonTherapies","Typography","variant","as","MapPinIcon","itemWithParens","filteredTherapies","newTherapies","VideoCameraIcon","distanceMarks","FiltersSection","defaultFilterState","Button","Label","htmlFor","Toggle","mark","RadioWithLabel","JoinInterstitial","onDismiss","CloseButton","ButtonLink","href","MapWithPins","setMap","Map","getElementById","center","zoom","disableDefaultUI","zoomControl","mapId","initialLoad","addListenerOnce","setZoom","addListener","debounce","northEast","getBounds","getNorthEast","southWest","getSouthWest","newBoundingBox","newCenter","getCenter","newCenterObject","getZoom","updateLocationSearchText","initMap","log","setCenter","onNewMapZoom","AdvancedMarkerElement","PinElement","entries","pin","pinBackground","background","borderColor","glyphColor","marker","position","content","element","domEvent","preventDefault","searchCard","scrollIntoView","behavior","focus","renderMarkers","QuizInterstitial","ReviewSection","StarIcon","reviews_average","reviews_count","ServicesSection","services","service","dangerouslySetInnerHTML","__html","cents","dollars","toFixed","formatAmount","amount_cents","SkillsSection","skills","skill","objectID","SearchCard","showVirtualInsteadOfDistance","widthResize","photoUrl","profile_photos","large","webp","photo","distance","_geoloc","location_types","distanceInMiles","websiteUrl","scrollY","onMouseEnter","Number","zIndex","onMouseLeave","ranking_score","doctor","licensed","src","alt","gallery_images","image","filestack_photo","square","city_state","Divider","website_headline","headline","SearchPills","mapping","t","FallbackSection","keyPrefix","showDivider","SearchPage","loggedInAsPro","mobileFiltersShown","setMobileFiltersShown","joinInterstitialDismissed","setJoinInterstitialDismissed","quizInterstitialDismissed","setQuizInterstitialDismissed","sentinelRef","useRef","searchResultsRef","mobileFiltersRef","containerRef","filtersCount","current","observer","IntersectionObserver","entry","isIntersecting","observe","disconnect","onRefinementChanged","onScroll","style","top","left","right","paddingLeft","paddingRight","paddingBottom","borderBottom","paddingTop","body","classList","remove","querySelector","add","numberOfResults","ref","marginLeft","LocationSearchBox","Skeleton","AdjustmentsHorizontalIcon","virtual","office","home","i","LoadingSpinner","maxWidth","MobileFullScreenModal","hideModal","visible","header","showFooter","animate","actionButtonCopy","onSave","cancelButtonCopy","onCancel","unmount","Page","inputText","setInputText","placesService","placePredictions","getPlacePredictions","isPlacePredictionsLoading","usePlacesService","types","onNewLocationChosen","Combobox","getDetails","placeId","place_id","place","newMapCenter","geometry","stripUSAFromString","description","Input","evt","input","BASE_INPUT_CLASSNAMES","placeholder","spinnerClassName","Options","DROPDOWN_CLASSNAMES","Option","DROPDOWN_OPTION_CLASSNAMES","RegExp","capitalize","SearchBox","props","refine","useSearchBox","inputValue","setInputValue","newQuery","onSearchFieldReset","onGooglePlacesLoaded","displayValue","Index","Configure","SpecialtySearchResults","PractitionerSearchResults","useHits","ordered_kind","healthConditions","selected","_highlightResult","getPhotoUrl","small","TopNavSearchBox","InstantSearch"],"sourceRoot":""}