{"version":3,"sources":["assets/img/home/checkbox_checked.svg","assets/img/detailSection/direction.svg","assets/img/detailSection/pagination_left.svg","assets/img/image_album.svg","assets/img/detailSection/clock_open.svg","assets/img/detailSection/clock_close.svg","assets/img/detailSection/chevron_up.svg","utility/localStorageControl.ts","components/lazyWithRetry.tsx","offline.tsx","routes/index.tsx","containers/LoadingOverlay/style.tsx","containers/LoadingOverlay/index.tsx","App.tsx","reportWebVitals.ts","serviceWorkerRegistration.ts","index.tsx","redux/auth/actions.ts","redux/common/actions.ts","api/index.tsx","assets/img/loading.png","redux/common/reducer.ts","redux/auth/reducer.ts","redux/rootReducers.ts","redux/store.ts","api/apiService.tsx","api/apiV2Service.tsx","assets/img/detailSection/mail.svg","assets/img/detailSection/contact.svg","assets/img/detailSection/product_1.svg","assets/img/detailSection/diagnostic.svg","assets/img/detailSection/maintenance.svg","assets/img/detailSection/servicing.svg","assets/img/detailSection/battery_replacement.svg","assets/img/detailSection/tyre_change.svg","assets/img/detailSection/car_wash.svg","assets/img/detailSection/repair.svg","assets/img/detailSection/accessories.svg","config/settings.ts","styles/style.tsx","containers/NavBar/style.tsx","assets/img/nav/liquimoly_logo.png","assets/img/nav/liquimoly_logo_mobile.png","assets/img/nav/search_icon.svg","assets/img/nav/search_icon_red.svg","assets/img/nav/globe_icon.svg","assets/img/nav/home_icon.svg","assets/img/nav/location_icon.svg","assets/img/nav/close_icon.svg","assets/img/nav/back_icon.svg","assets/img/placeholder/searchbar_product.png","containers/NavBar/index.tsx","components/Footer/style.tsx","components/Footer/index.tsx","components/PwaModal/style.tsx","hooks/useAddToHomeScreenPrompt.tsx","hooks/useShouldShowPrompt.tsx","assets/img/liquimoly_logo_black.png","components/PwaModal/index.tsx","containers/PageLayout/index.tsx","assets/img/chevron-left.svg","assets/img/locate.svg","assets/img/phone.svg","assets/img/clock.svg","utility/geocode.ts","assets/img/home/arrow_down.svg","assets/img/home/grid_view_icon.svg","assets/img/home/grid_view_icon_red.svg","assets/img/home/list_view_icon.svg","assets/img/home/list_view_icon_red.svg","assets/img/home/checkbox.svg"],"names":["getItem","key","data","window","localStorage","JSON","parse","err","setItem","value","stringify","removeItem","lazyWithRetry","componentImport","lazy","pageHasAlreadyBeenForceRefreshed","component","location","reload","OfflinePage","style","position","top","right","bottom","left","width","height","display","flexDirection","justifyContent","alignItems","background","backgroundSize","zIndex","overflow","className","margin","src","LoadingLogo","alt","fontFamily","color","fontSize","textAlign","to","backgroundColor","border","borderRadius","Geocode","setApiKey","process","HomePage","WorkshopPage","WorkshopDetailPage","WorkshopImagesPage","WorkshopAppointmentPage","NotFound","Routes","pathname","useLocation","history","useHistory","dispatch","useDispatch","addLoadedAssetsCount","commonActions","offlineCount","useSelector","common","offline","useEffect","total","PRELOAD_IMAGES","length","setTotalAssetsCount","forEach","preloadImage","image","Image","onload","onerror","scrollTo","push","fallback","PageLayout","exact","path","LoadingOverlayContainer","Styled","div","LoadingProgressBar","LoadingOverlay","useState","isCompleted","setIsCompleted","doneMinLoadingTime","setDoneMinLoadingTime","progress","setProgress","totalAssetsCount","loadedAssetsCount","document","body","resetLoadedAssetsCount","overflowY","setTimeout","App","store","basename","theme","reportWebVitals","onPerfEntry","Function","then","getCLS","getFID","getFCP","getLCP","getTTFB","isLocalhost","Boolean","hostname","match","registerValidSW","swUrl","config","navigator","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","state","controller","console","log","onUpdate","onSuccess","catch","error","Sentry","dsn","integrations","BrowserTracing","tracesSampleRate","denyUrls","ReactDOM","render","StrictMode","getElementById","URL","href","origin","addEventListener","fetch","headers","response","contentType","get","status","indexOf","ready","unregister","checkValidServiceWorker","serviceWorkerRegistration","actions","LOGIN_BEGIN","LOGIN_SUCCESS","LOGIN_ERR","LOGOUT_BEGIN","LOGOUT_SUCCESS","LOGOUT_ERR","MESSAGE_SET","MESSAGE_CLEAR","loginBegin","type","loginSuccess","publicAddress","accessToken","loginErr","logoutBegin","logoutSuccess","logoutErr","messageSet","message","messageClear","SET_TOTAL_ASSETS_COUNT","ADD_LOADED_ASSETS_COUNT","RESET_LOADED_ASSETS_COUNT","GO_OFFLINE","count","payload","goOffline","API","general","getWorkshopTypes","getDistances","getProducts","workshop","getWorkshops","getPoints","workshopDetail","getWorkshopDetail","getWorkshopImages","getWorkshopProduct","productCategories","getProductCategories","appointment","postAppointment","initialState","CommonReducer","action","initState","login","loading","AuthReducer","rootReducers","combineReducers","auth","createStore","rootReducer","composeWithDevTools","createBrowserHistory","client","axios","create","baseURL","APIService","params","optionalHeader","method","url","responseType","interceptors","request","use","requestConfig","Authorization","toJSON","errors","authActions","Promise","reject","SETTINGS","defaultMapCenter","lat","lng","ArrowDown","GridViewIconNormal","GridViewIconRed","ListViewIconNormal","ListViewIconRed","Checkbox","CheckboxChecked","chevronLeft","mail","contact","direction","paginationLeft","product1","imageAlbum","diagnostic","maintenance","servicing","battery_replacement","tyre_change","car_wash","repair","accessories","clockOpen","clockClose","chevron","locate","phone","clock","PageWrapper","ContentBodyWrapper","Nav","NavBar","useGeolocated","positionOptions","enableHighAccuracy","userDecisionTimeout","coords","isGeolocationEnabled","addressRef","useRef","addressElemRef","productRef","workshopRef","workshopElemRef","workshopTypes","setWorkshopTypes","addresses","setAddresses","products","setProducts","workshops","setWorkshops","productSearchInput","setProductSearchInput","productCurrentPage","setProductCurrentPage","productLastPage","setProductLastPage","addressInput","setAddressInput","addressCurrentPage","setAddressCurrentPage","addressLastPage","setAddressLastPage","workshopInput","setWorkshopInput","workshopCurrentPage","setWorkshopCurrentPage","workshopLastPage","setWorkshopLastPage","clickRef","oriHeight","setOriHeight","newHeight","setNewHeight","showMap","setShowMap","showSearch","setShowSearch","activeWorkshopType","setActiveWorkshopType","selected","setSelected","isLoading","setIsLoading","addressLoading","setAddressLoading","productLoading","setProductLoading","workshopLoading","setWorkshopLoading","loadingAddresses","setLoadingAddresses","loadingWorkshops","setLoadingWorkshops","loadingProducts","setLoadingProducts","reqHeaders","setReqHeaders","scrollToHideValue","setScrollToHideValue","scrollY","useScrollPosition","scrollingNavClassname","setScrollingNavClassname","lastScroll","setLastScroll","handleScrollToHideValue","innerWidth","getAddresses","useCallback","debounce","address","APIV2Service","res","meta","current_page","last_page","finally","name","current","cachedLocation","sessionStorage","fetchLocation","getLocationByCoords","latitude","longitude","country","city","firstId","id","defaultItem","find","is_default","handleHeight","removeEventListener","handleOutsideClick","e","contains","target","closeSearch","deselect","handleChange","event","handleAddressScroll","currentAddresses","urlParam","scrollHeight","scrollTop","clientHeight","map","item","handleWorkshopScroll","currentWorkshops","handleProductScroll","currentProducts","clearInput","Address","name_id","onClick","LocationIcon","textDecoration","Product","descriptions","ProductPlaceholder","imageSrc","setImageSrc","onError","Workshop","handleSearch","URLSearchParams","append","toString","replace","ref","behavior","LiquimolyLogo","SearchIconRed","SearchIcon","index","HomeIcon","GlobeIcon","placeholder","onChange","CloseIcon","onScroll","image_url","category_name","LiquimolyLogoMobile","BackIcon","FooterContainer","footer","Footer","year","Date","getFullYear","PwaModalWrapper","useAddToHomescreenPrompt","prompt","setState","preventDefault","Error","setInstallPromptSeenToday","promptName","today","moment","toISOString","getUserShouldBePromptedToInstall","daysToWaitBeforePromptingAgain","lastPrompt","getInstallPromptLastSeenAt","daysSinceLastPrompt","diff","isNaN","useShouldShowPrompt","userShouldBePromptedToInstall","setUserShouldBePromptedToInstall","handleUserSeenInstallPrompt","PwaModal","webPrompt","promptToInstall","isVisible","setVisibleState","isCompatible","setIsCompatible","hide","matchMedia","matches","children","fromLatLng","i","results","address_components","j","types","long_name","short_name"],"mappings":"gIAAe,QAA0B,8C,iCCA1B,QAA0B,uC,iCCA1B,QAA0B,6C,iCCA1B,QAA0B,yC,iCCA1B,QAA0B,wC,iCCA1B,QAA0B,yC,iCCA1B,QAA0B,wC,sDCAzC,0GAAMA,EAAU,SAACC,GACb,IAAMC,EAA8B,qBAAXC,OAAyBC,aAAaJ,QAAQC,GAAO,GAE9E,IACI,OAAOI,KAAKC,MAAMJ,GACpB,MAAOK,GACL,OAAOL,IAITM,EAAU,SAACP,EAAaQ,GAC1B,IAAMC,EAA6B,kBAAVD,EAAqBJ,KAAKK,UAAUD,GAASA,EACtE,OAAOL,aAAaI,QAAQP,EAAKS,IAG/BC,EAAa,SAACV,GAChB,OAAOG,aAAaO,WAAWV,K,8ICcpBW,EA5BO,SAACC,GAAD,OAClBC,eAAI,gCAAC,uGACKC,EAAmCV,KAAKC,MAC1CH,OAAOC,aAAaJ,QAAQ,kCAAoC,SAFnE,kBAM2Ba,IAN3B,cAMSG,EANT,OAQGb,OAAOC,aAAaI,QAAQ,gCAAiC,SARhE,kBAUUQ,GAVV,mCAYQD,EAZR,wBAeOZ,OAAOC,aAAaI,QAAQ,gCAAiC,QAfpE,kBAgBcL,OAAOc,SAASC,UAhB9B,8E,wCCkDMC,EAjDK,WAChB,OACI,sBACIC,MAAO,CACHC,SAAU,QACVC,IAAK,EACLC,MAAO,EACPC,OAAQ,EACRC,KAAM,EACNC,MAAO,QACPC,OAAQ,QACRC,QAAS,OACTC,cAAe,SACfC,eAAgB,SAChBC,WAAY,SACZC,WAAY,UACZC,eAAgB,QAChBC,OAAQ,IACRC,SAAU,UAhBlB,UAmBI,qBACIC,UAAU,gBACVhB,MAAO,CAAEM,MAAO,IAAKC,OAAQ,OAAQU,OAAQ,UAC7CC,IAAKC,IACLC,IAAI,eAER,qBAAKpB,MAAO,CAAEqB,WAAY,aAAcC,MAAO,QAASC,SAAU,GAAIC,UAAW,UAAjF,uDAGA,cAAC,IAAD,CAAMC,GAAG,IAAT,SACI,wBACIT,UAAU,YACVhB,MAAO,CACH0B,gBAAiB,MACjBC,OAAQ,QACRC,aAAc,GACdN,MAAO,QACPD,WAAY,aACZd,OAAQ,IARhB,qCCzBhBsB,IAAQC,UAAUC,2CAElB,I,IAAMC,EAAWxC,GAAc,kBAAM,iCAC/ByC,EAAezC,GAAc,kBAAM,8DACnC0C,EAAqB1C,GAAc,kBAAM,sEACzC2C,EAAqB3C,GAAc,kBAAM,+DACzC4C,EAA0B5C,GAAc,kBAAM,yDAI9C6C,EAAW,WACb,OAAO,cAAC,IAAD,CAAUZ,GAAG,OA0DTa,EAvDA,WACX,IAAQC,EAAaC,cAAbD,SACFE,EAAUC,cAEVC,EAAWC,cAEXC,EAAuB,kBAAMF,EAASG,IAAcD,yBAEpDE,EAAeC,aAAY,qBAAGC,OAA+BC,WA6BnE,OA1BAC,qBAAU,WANkB,IAACC,IAOLC,IAAeC,OAPQX,EAASG,IAAcS,oBAAoBH,IAStFC,IAAeG,SAAQ,SAACC,GACpB,IAAMC,EAAQ,IAAIC,MAClBD,EAAMxC,IAAMuC,EACZC,EAAME,OAAS,WACXf,KAEJa,EAAMG,QAAU,WACZhB,UAGT,IAGHM,qBAAU,WACNpE,OAAO+E,SAAS,EAAG,KACpB,CAACvB,IAEJY,qBAAU,WACFJ,GACAN,EAAQsB,KAAK,cAElB,CAAChB,IAGA,cAAC,WAAD,CAAUiB,SAAU,cAACC,EAAA,EAAD,UAAY,+BAAhC,SACI,eAAC,IAAD,WACI,cAAC,IAAD,CAAOC,OAAK,EAACC,KAAK,IAAIvE,UAAWoC,IACjC,cAAC,IAAD,CAAOkC,OAAK,EAACC,KAAK,WAAWvE,UAAWG,IACxC,cAAC,IAAD,CAAOmE,OAAK,EAACC,KAAK,YAAYvE,UAAWqC,IACzC,cAAC,IAAD,CAAOiC,OAAK,EAACC,KAAK,gBAAgBvE,UAAWsC,IAC7C,cAAC,IAAD,CAAOgC,OAAK,EAACC,KAAK,uBAAuBvE,UAAWuC,IACpD,cAAC,IAAD,CAAO+B,OAAK,EAACC,KAAK,4BAA4BvE,UAAWwC,IAGzD,cAAC,IAAD,CAAO8B,OAAK,EAACC,KAAK,IAAIvE,UAAWyC,U,gDCtE3C+B,EAA0BC,IAAOC,IAAV,+bAwBvBC,EAAqBF,IAAOC,IAAV,ycCiCTE,EApDQ,WACnB,MAAsCC,oBAAS,GAA/C,mBAAOC,EAAP,KAAoBC,EAApB,KACA,EAAoDF,oBAAS,GAA7D,mBAAOG,EAAP,KAA2BC,EAA3B,KACA,EAAgCJ,mBAAS,GAAzC,mBAAOK,EAAP,KAAiBC,EAAjB,KAEMpC,EAAWC,cAGXoC,EAAmBhC,aAAY,qBAAGC,OAA+B+B,oBACjEC,EAAoBjC,aAAY,qBAAGC,OAA+BgC,qBA4BxE,OAzBA9B,qBAAU,WACN,IAAIuB,EAOJ,OALAK,EAAaE,EAAoBD,EAAoB,KAErDE,SAASC,KAAKnF,MAAMe,SAAW,SAC/BmE,SAASC,KAAKnF,MAAMO,OAAS,QAEzB0E,GAAqBD,GAAoBJ,GAdZjC,EAASG,IAAcsC,0BAgBpDT,GAAe,GACfO,SAASC,KAAKnF,MAAMqF,UAAY,YAChCH,SAASC,KAAKnF,MAAMO,OAAS,cAJjC,IAOD,CAACyE,EAAkBC,EAAmBL,IAGzCzB,qBAAU,WACNmC,YAAW,WACPT,GAAsB,KACvB,OACJ,CAACG,IAGAN,GAA4C,aAA7B3F,OAAOc,SAAS0C,SACxB,6BAIP,eAAC6B,EAAD,WACI,qBAAKpD,UAAU,gBAAgBE,IAAKC,IAAaC,IAAI,eAErD,cAACmD,EAAD,UACI,qBAAKvE,MAAO,CAAEM,MAAM,GAAD,OAAKwE,EAAL,MAAoB9D,UAAU,mBChClDuE,EAZH,WACR,OACI,cAAC,IAAD,CAAUC,MAAOA,IAAjB,SACI,eAAC,IAAD,CAAQC,SAAU1D,GAAlB,UACI,cAAC,EAAD,IACA,cAAC,IAAD,CAAgB2D,MAAM,SACtB,cAAC,EAAD,UCDDC,EAZS,SAACC,GACnBA,GAAeA,aAAuBC,UACxC,+BAAqBC,MAAK,YAAkD,IAA/CC,EAA8C,EAA9CA,OAAQC,EAAsC,EAAtCA,OAAQC,EAA8B,EAA9BA,OAAQC,EAAsB,EAAtBA,OAAQC,EAAc,EAAdA,QAC3DJ,EAAOH,GACPI,EAAOJ,GACPK,EAAOL,GACPM,EAAON,GACPO,EAAQP,OCGRQ,EAAcC,QACW,cAA7BtH,OAAOc,SAASyG,UAEe,UAA7BvH,OAAOc,SAASyG,UAEhBvH,OAAOc,SAASyG,SAASC,MAAM,2DA0CnC,SAASC,EAAgBC,EAAeC,GACtCC,UAAUC,cACPC,SAASJ,GACTX,MAAK,SAACgB,GACLA,EAAaC,cAAgB,WAC3B,IAAMC,EAAmBF,EAAaG,WACd,MAApBD,IAGJA,EAAiBE,cAAgB,WACA,cAA3BF,EAAiBG,QACfR,UAAUC,cAAcQ,YAI1BC,QAAQC,IACN,+GAKEZ,GAAUA,EAAOa,UACnBb,EAAOa,SAAST,KAMlBO,QAAQC,IAAI,sCAGRZ,GAAUA,EAAOc,WACnBd,EAAOc,UAAUV,WAO5BW,OAAM,SAACC,GACNL,QAAQK,MAAM,4CAA6CA,M,oCCxFjEC,IAAY,CACRC,IAAK,mEACLC,aAAc,CAAC,IAAIC,KAKnBC,iBAAkB,EAClBC,SAAU,CAAC,eAGfC,IAASC,OACL,cAAC,IAAMC,WAAP,UACI,cAAC,EAAD,MAEJjD,SAASkD,eAAe,SDDrB,SAAkB1B,GACvB,GAA6C,kBAAmBC,UAAW,CAGzE,GADkB,IAAI0B,IAAItG,GAAwBhD,OAAOc,SAASyI,MACpDC,SAAWxJ,OAAOc,SAAS0I,OAIvC,OAGFxJ,OAAOyJ,iBAAiB,QAAQ,WAC9B,IAAM/B,EAAK,UAAM1E,GAAN,sBAEPqE,IAgEV,SAAiCK,EAAeC,GAE9C+B,MAAMhC,EAAO,CACXiC,QAAS,CAAE,iBAAkB,YAE5B5C,MAAK,SAAC6C,GAEL,IAAMC,EAAcD,EAASD,QAAQG,IAAI,gBAEnB,MAApBF,EAASG,QACO,MAAfF,IAA8D,IAAvCA,EAAYG,QAAQ,cAG5CpC,UAAUC,cAAcoC,MAAMlD,MAAK,SAACgB,GAClCA,EAAamC,aAAanD,MAAK,WAC7B/G,OAAOc,SAASC,eAKpB0G,EAAgBC,EAAOC,MAG1Be,OAAM,WACLJ,QAAQC,IAAI,oEAtFV4B,CAAwBzC,EAAOC,GAI/BC,UAAUC,cAAcoC,MAAMlD,MAAK,WACjCuB,QAAQC,IACN,+GAMJd,EAAgBC,EAAOC,OCrB/ByC,GAKAxD,K,gCCrCA,YAEMyD,EAAU,CACZC,YAAa,cACbC,cAAe,gBACfC,UAAW,YAEXC,aAAc,eACdC,eAAgB,iBAChBC,WAAY,aAEZC,YAAa,cACbC,cAAe,gBAEfC,WAAY,WACR,MAAO,CACHC,KAAMV,EAAQC,cAItBU,aAAc,SAACC,EAAuBC,GAIlC,OAHA7K,YAAQ,YAAa,QACrBA,YAAQ,iBAAkB4K,GAC1B5K,YAAQ,eAAgB6K,GACjB,CACHH,KAAMV,EAAQE,cACdU,gBACAC,gBAIRC,SAAU,SAAC/K,GACP,MAAO,CACH2K,KAAMV,EAAQG,UACdpK,QAIRgL,YAAa,WACT,MAAO,CACHL,KAAMV,EAAQI,eAItBY,cAAe,WAIX,OAHA7K,YAAW,aACXA,YAAW,kBACXA,YAAW,gBACJ,CACHuK,KAAMV,EAAQK,iBAItBY,UAAW,SAAClL,GACR,MAAO,CACH2K,KAAMV,EAAQM,WACdvK,QAIRmL,WAAY,SAACC,GACT,MAAO,CACHT,KAAMV,EAAQO,YACdY,YAIRC,aAAc,WACV,MAAO,CACHV,KAAMV,EAAQQ,iBAKXR,O,gCC1Ef,IAAMtG,EAAgB,CAClB2H,uBAAwB,yBACxBC,wBAAyB,0BACzBC,0BAA2B,4BAC3BC,WAAY,aAEZrH,oBAAqB,SAACsH,GAClB,MAAO,CACHf,KAAMhH,EAAc2H,uBACpBK,QAAS,CACLD,WAKZhI,qBAAsB,WAClB,MAAO,CACHiH,KAAMhH,EAAc4H,0BAI5BtF,uBAAwB,WACpB,MAAO,CACH0E,KAAMhH,EAAc6H,4BAI5BI,UAAW,WACP,MAAO,CACHjB,KAAMhH,EAAc8H,cAKjB9H,O,gCClCf,kCAKA,IAAMkI,EAAM,CACRC,QAAS,CACLC,iBAAkB,sBAClBC,aAAc,iBACdC,YAAa,iBAEjBC,SAAU,CACNC,aAAc,iBACdC,UAAW,uBAEfC,eAAgB,CACZC,kBAAmB,sBACnBC,kBAAmB,6BACnBC,mBAAoB,gCAExBC,kBAAmB,CACfC,qBAAsB,0CAE1BC,YAAa,CACTC,gBAAiB,qC,gCCxBV,QAA0B,qC,wECMnCC,EAAe,CACjBhH,iBAAkB,KAClBC,kBAAmB,EACnB/B,QAAS,GAiCE+I,EA9BO,WAAgD,IAA/C9E,EAA8C,uDAAtC6E,EAAcE,EAAwB,uCACjE,OAAQA,EAAOpC,MACX,KAAKhH,IAAc2H,uBACf,OAAO,2BACAtD,GADP,IAEInC,iBAAkBkH,EAAOpB,QAAQD,QAEzC,KAAK/H,IAAc4H,wBACf,OAAO,2BACAvD,GADP,IAEIlC,kBAAmBkC,EAAMlC,kBAAoB,IAErD,KAAKnC,IAAc6H,0BACf,OAAO,2BACAxD,GADP,IAEInC,iBAAkB,KAClBC,kBAAmB,IAG3B,KAAKnC,IAAc8H,WACf,OAAO,2BACAzD,GADP,IAEIjE,QAASiE,EAAMjE,QAAU,IAGjC,QACI,OAAOiE,I,gBCnCXkC,EACJD,IADIC,YAAaC,EACjBF,IADiBE,cAAeC,EAChCH,IADgCG,UAAWC,EAC3CJ,IAD2CI,aAAcC,EACzDL,IADyDK,eAAgBC,EACzEN,IADyEM,WAAYC,EACrFP,IADqFO,YAAaC,EAClGR,IADkGQ,cAGhGuC,EAAY,CACdC,QAAOxN,YAAQ,aACfoL,cAAa,UAAEpL,YAAQ,yBAAV,QAA+B,GAC5CqL,YAAW,UAAErL,YAAQ,uBAAV,QAA6B,GACxCyN,SAAS,EACT3E,MAAO,KACP6C,QAAS,IA+DE+B,EAxDK,WAAiI,IAAhInF,EAA+H,uDAAvHgF,EAAWD,EAA4G,uCACxIpC,EAAmDoC,EAAnDpC,KAAME,EAA6CkC,EAA7ClC,cAAeC,EAA8BiC,EAA9BjC,YAAa9K,EAAiB+M,EAAjB/M,IAAKoL,EAAY2B,EAAZ3B,QAC/C,OAAQT,GACJ,KAAKT,EACD,OAAO,2BACAlC,GADP,IAEIkF,SAAS,IAEjB,KAAK/C,EACD,OAAO,2BACAnC,GADP,IAEIiF,OAAO,EACPpC,cAAeA,EACfC,YAAaA,EACboC,SAAS,EACT3E,MAAO,OAEf,KAAK6B,EACD,OAAO,2BACApC,GADP,IAEIO,MAAOvI,EACPkN,SAAS,IAEjB,KAAK7C,EACD,OAAO,2BACArC,GADP,IAEIkF,SAAS,IAEjB,KAAK5C,EACD,OAAO,2BACAtC,GADP,IAEIiF,OAAO,EACPpC,cAAe,GACfC,YAAa,GACboC,SAAS,IAEjB,KAAK3C,EACD,OAAO,2BACAvC,GADP,IAEIO,MAAOvI,EACPkN,SAAS,IAEjB,KAAK1C,EACD,OAAO,2BACAxC,GADP,IAEIoD,YAER,KAAKX,EACD,OAAO,2BACAzC,GADP,IAEIoD,QAAS,KAEjB,QACI,OAAOpD,IC7DJoF,EAPMC,0BAAgB,CACjCvJ,OAAQgJ,EACRQ,KAAMH,ICFJ9G,EAAQkH,sBAAYC,EAAaC,iCAExBpH,O,kHCCT/C,EAAUoK,cAIVC,EAASC,IAAMC,OAAO,CACxBC,QAHiBlL,6CAIjB2G,QAAS,CACL,eAAgB,sBAIlBwE,E,wFACF,WAAuE,IAA5D/I,EAA2D,uDAApD,GAAIgJ,EAAgD,uDAAvC,GAAIC,EAAmC,uDAAlB,GAChD,OAAON,EAAO,CACVO,OAAQ,MACRC,IAAKnJ,EACLgJ,SACAzE,QAAQ,eAAM0E,O,kBAItB,WAAsE,IAA1DjJ,EAAyD,uDAAlD,GAAIrF,EAA8C,uDAAvC,GAAIsO,EAAmC,uDAAlB,GAC/C,OAAON,EAAO,CACVO,OAAQ,OACRC,IAAKnJ,EACLrF,OACA4J,QAAQ,eAAM0E,O,mBAItB,WAAkD,IAArCjJ,EAAoC,uDAA7B,GAAIrF,EAAyB,uDAAlB,GAC3B,OAAOgO,EAAO,CACVO,OAAQ,QACRC,IAAKnJ,EACLrF,KAAMG,KAAKK,UAAUR,O,iBAI7B,WAAgD,IAArCqF,EAAoC,uDAA7B,GAAIrF,EAAyB,uDAAlB,GACzB,OAAOgO,EAAO,CACVO,OAAQ,MACRC,IAAKnJ,EACLrF,KAAMG,KAAKK,UAAUR,O,sBAI7B,WAA0C,IAA1BqF,EAAyB,uDAAlB,GACnB,OAAO2I,EAAO,CACVO,OAAQ,MACRC,IAAKnJ,EACLoJ,aAAc,a,KAKlB5K,EAAa6C,IAAb7C,SAMRmK,EAAOU,aAAaC,QAAQC,KAAI,SAAChH,GAI7B,IAAMiH,EAAgBjH,EACdgC,EAAYhC,EAAZgC,QAOR,OALoB9J,YAAQ,kBAExB+O,EAAcjF,QAAd,2BAA6BA,GAA7B,IAAsCkF,cAAc,GAAD,OAAKhP,YAAQ,oBAG7D+O,KAGXb,EAAOU,aAAa7E,SAAS+E,KACzB,SAAC/E,GAAD,OAAcA,KACd,SAACjB,GAKG,IAAQiB,EAAajB,EAAbiB,SAoBR,MAjB+B,kBAA3BjB,EAAMmG,SAAStD,SAA4D,YAA7B9H,EAAQ5C,SAAS0C,UAC/DI,EAASG,IAAciI,aAGvBpC,IAEwB,MAApBA,EAASG,QAA2C,+CAAzBH,EAAS7J,KAAKgP,SACzCnL,EAASoL,IAAYzD,WAAW,yCAChC3H,EAASoL,IAAY3D,kBAGrBzB,EAASG,QAMVkF,QAAQC,OAAOvG,MAGfwF,O,kHC1GTzK,EAAUoK,cAIVC,EAASC,IAAMC,OAAO,CACxBC,QAHiBlL,6CAIjB2G,QAAS,CACL,eAAgB,mBAChB,gBAAiB,KAInBwE,E,wFACF,WAAuE,IAA5D/I,EAA2D,uDAApD,GAAIgJ,EAAgD,uDAAvC,GAAIC,EAAmC,uDAAlB,GAChD,OAAON,EAAO,CACVO,OAAQ,MACRC,IAAKnJ,EACLgJ,SACAzE,QAAQ,eAAM0E,O,kBAItB,WAAsE,IAA1DjJ,EAAyD,uDAAlD,GAAIrF,EAA8C,uDAAvC,GAAIsO,EAAmC,uDAAlB,GAC/C,OAAON,EAAO,CACVO,OAAQ,OACRC,IAAKnJ,EACLrF,OACA4J,QAAQ,eAAM0E,O,mBAItB,WAAkD,IAArCjJ,EAAoC,uDAA7B,GAAIrF,EAAyB,uDAAlB,GAC3B,OAAOgO,EAAO,CACVO,OAAQ,QACRC,IAAKnJ,EACLrF,KAAMG,KAAKK,UAAUR,O,iBAI7B,WAAgD,IAArCqF,EAAoC,uDAA7B,GAAIrF,EAAyB,uDAAlB,GACzB,OAAOgO,EAAO,CACVO,OAAQ,MACRC,IAAKnJ,EACLrF,KAAMG,KAAKK,UAAUR,O,sBAI7B,WAA0C,IAA1BqF,EAAyB,uDAAlB,GACnB,OAAO2I,EAAO,CACVO,OAAQ,MACRC,IAAKnJ,EACLoJ,aAAc,a,KAOlB5K,EAAa6C,IAAb7C,SAMRmK,EAAOU,aAAaC,QAAQC,KAAI,SAAChH,GAG7B,IAAMiH,EAAgBjH,EACdgC,EAAYhC,EAAZgC,QAOR,OALoB9J,YAAQ,kBAExB+O,EAAcjF,QAAd,2BAA6BA,GAA7B,IAAsCkF,cAAc,GAAD,OAAKhP,YAAQ,oBAG7D+O,KAGXb,EAAOU,aAAa7E,SAAS+E,KACzB,SAAC/E,GAAD,OAAcA,KACd,SAACjB,GAKG,IAAQiB,EAAajB,EAAbiB,SAoBR,MAlB+B,kBAA3BjB,EAAMmG,SAAStD,SAA4D,YAA7B9H,EAAQ5C,SAAS0C,UAC/DI,EAASG,IAAciI,aAIvBpC,IAEwB,MAApBA,EAASG,QAA2C,+CAAzBH,EAAS7J,KAAKgP,SACzCnL,EAASoL,IAAYzD,WAAW,yCAChC3H,EAASoL,IAAY3D,kBAGrBzB,EAASG,QAMVkF,QAAQC,OAAOvG,MAGfwF,O,iLCnHA,MAA0B,iCCA1B,MAA0B,oC,kBCA1B,MAA0B,sC,SCA1B,MAA0B,uCCA1B,MAA0B,wCCA1B,MAA0B,sCCA1B,MAA0B,gDCA1B,MAA0B,wCCA1B,MAA0B,qCCA1B,MAA0B,mCCA1B,MAA0B,wC,mDCyCnCgB,EAA0B,CAC5BC,iBAAkB,CACdC,IAAK,UACLC,IAAK,aAIPhL,EAA2B,CAE7BlC,IAGAmN,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IAGAC,IAGAC,EACAC,EACAC,IACAC,IACAC,EACAC,IACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,IACAC,IACAC,IAGAC,IACAC,IACAC,M,uEC3EEC,GATiB7L,IAAOC,IAAV,yKASAD,IAAOC,IAAV,8EAKX6L,EAAqB9L,IAAOC,IAAV,6P,uHCdlB8L,EAAM/L,IAAOC,IAAV,+hnCCFM,G,OAAA,IAA0B,4CCA1B,MAA0B,kDCA1B,MAA0B,wCCA1B,MAA0B,4CCA1B,MAA0B,uCCA1B,MAA0B,sCCA1B,MAA0B,0CCA1B,MAA0B,uCCA1B,MAA0B,sCCA1B,+2W,OC6kCA+L,EA/hCA,WACX,MAAyCC,wBAAc,CACnDC,gBAAiB,CACbC,oBAAoB,GAExBC,oBAAqB,MAJjBC,EAAR,EAAQA,OAAQC,EAAhB,EAAgBA,qBAOVC,EAAaC,iBAAO,MACpBC,EAAiBD,iBAAyB,MAC1CE,EAAaF,iBAAO,MACpBG,EAAcH,iBAAO,MACrBI,EAAkBJ,iBAAyB,MAC3CpO,EAAUC,cAChB,EAA0C+B,mBAAgB,IAA1D,mBAAOyM,EAAP,KAAsBC,EAAtB,KACA,EAAkC1M,mBAAgB,IAAlD,mBAAO2M,EAAP,KAAkBC,EAAlB,KACA,EAAgC5M,mBAAgB,IAAhD,mBAAO6M,EAAP,KAAiBC,EAAjB,KACA,EAAkC9M,mBAAgB,IAAlD,mBAAO+M,EAAP,KAAkBC,EAAlB,KACA,EAAoDhN,mBAAS,IAA7D,oBAAOiN,GAAP,MAA2BC,GAA3B,MACA,GAAoDlN,mBAAS,GAA7D,qBAAOmN,GAAP,MAA2BC,GAA3B,MACA,GAA8CpN,mBAAS,KAAvD,qBAAOqN,GAAP,MAAwBC,GAAxB,MACA,GAAwCtN,mBAAS,IAAjD,qBAAOuN,GAAP,MAAqBC,GAArB,MACA,GAAoDxN,mBAAS,GAA7D,qBAAOyN,GAAP,MAA2BC,GAA3B,MACA,GAA8C1N,mBAAS,KAAvD,qBAAO2N,GAAP,MAAwBC,GAAxB,MACA,GAA0C5N,mBAAS,IAAnD,qBAAO6N,GAAP,MAAsBC,GAAtB,MACA,GAAsD9N,mBAAS,GAA/D,qBAAO+N,GAAP,MAA4BC,GAA5B,MACA,GAAgDhO,mBAAS,KAAzD,qBAAOiO,GAAP,MAAyBC,GAAzB,MACMC,GAAW/B,iBAAuB,MACxC,GAAkCpM,mBAAS,SAA3C,qBAAOoO,GAAP,MAAkBC,GAAlB,MACA,GAAkCrO,mBAAS,SAA3C,qBAAOsO,GAAP,MAAkBC,GAAlB,MACQzQ,GAAaC,cAAbD,SACR,GAA8BkC,oBAAS,GAAvC,qBAAOwO,GAAP,MAAgBC,GAAhB,MACA,GAAoCzO,oBAAS,GAA7C,qBAAO0O,GAAP,MAAmBC,GAAnB,MACA,GAAoD3O,mBAAS,GAA7D,qBAAO4O,GAAP,MAA2BC,GAA3B,MACA,GAAgC7O,mBAAS,GAAzC,qBAAO8O,GAAP,MAAiBC,GAAjB,MAEA,GAAkC/O,oBAAS,GAA3C,qBAAOgP,GAAP,MAAkBC,GAAlB,MACA,GAA4CjP,oBAAS,GAArD,qBAAOkP,GAAP,MAAuBC,GAAvB,MACA,GAA4CnP,oBAAS,GAArD,qBAAOoP,GAAP,MAAuBC,GAAvB,MACA,GAA8CrP,oBAAS,GAAvD,qBAAOsP,GAAP,MAAwBC,GAAxB,MACA,GAAgDvP,oBAAS,GAAzD,qBAAOwP,GAAP,MAAyBC,GAAzB,MACA,GAAgDzP,oBAAS,GAAzD,qBAAO0P,GAAP,MAAyBC,GAAzB,MACA,GAA8C3P,oBAAS,GAAvD,qBAAO4P,GAAP,MAAwBC,GAAxB,MAEA,GAAoC7P,mBAAS,IAA7C,qBAAO8P,GAAP,MAAmBC,GAAnB,MAGA,GAAkD/P,mBAAS,IAA3D,qBAAOgQ,GAAP,MAA0BC,GAA1B,MACMC,GAAUC,cAChB,GAA0DnQ,mBAAS,gBAAnE,qBAAOoQ,GAAP,MAA8BC,GAA9B,MACA,GAAoCrQ,mBAAS,GAA7C,qBAAOsQ,GAAP,MAAmBC,GAAnB,MAoBA7R,qBAAU,WAjBN6R,GAAcL,IAGVA,IAAW,EACXG,GAAyB,IAIzBH,IAAWF,IAAqBE,GAAUI,IAAwC,mBAA1BF,GAExDC,GAAyB,kBAClBH,GAAUI,IAAwC,mBAA1BF,IAE/BC,GAAyB,kBAM9B,CAACH,KAGJxR,qBAAU,WACN2R,GAAyB,MAC1B,CAACvS,KAEJ,IAAM0S,GAA0B,WACxBlW,OAAOmW,YAAc,KACrBR,GAAqB,KACd3V,OAAOmW,YAAc,KAAOnW,OAAOmW,YAAc,KACxDR,GAAqB,KAErBA,GAAqB,MAKvBS,GAAeC,sBACjBC,oBAAS,SAAChW,GAEN,IAAM8N,EAAc,CAAEmI,QAASjW,GAE3B6R,EAAc5N,OAAS,GAAK+P,KAC5BlG,EAAM,iBAAuBkG,IAGjCkC,IAAa1M,IAAImC,IAAIK,SAASC,aAAc6B,EAAQoH,IAC/CzO,MAAK,SAAC0P,GACHrD,GAAsBqD,EAAI1W,KAAKA,KAAK2W,KAAKC,cACzCrD,GAAmBmD,EAAI1W,KAAKA,KAAK2W,KAAKE,WACtCtE,EAAamE,EAAI1W,KAAKA,KAAKA,SAE9B2I,OAAM,SAACC,GACJL,QAAQC,IAAII,MAEfkO,SAAQ,WACLhC,IAAkB,QAE3B,KACH,CAACP,KAGCjI,GAAcgK,sBAChBC,oBAAS,SAAChW,GACN6N,IAAWrE,IAAImC,IAAIC,QAAQG,YAAa,CAAEyK,KAAMxW,IAC3CyG,MAAK,SAAC0P,GACH3D,GAAsB2D,EAAI1W,KAAKA,KAAK2W,KAAKC,cACzC3D,GAAmByD,EAAI1W,KAAKA,KAAK2W,KAAKE,WACtCpE,EAAYiE,EAAI1W,KAAKA,KAAKA,SAE7B2I,OAAM,SAACC,GACJL,QAAQC,IAAII,MAEfkO,SAAQ,WACL9B,IAAkB,QAE3B,KACH,IAGExI,GAAe8J,sBACjBC,oBAAS,SAAChW,GACN,IAAM8N,EAAc,CAAE0I,KAAMxW,GAExB6R,EAAc5N,OAAS,GAAK+P,KAC5BlG,EAAM,iBAAuBkG,IAGjCkC,IAAa1M,IAAImC,IAAIK,SAASC,aAAc6B,EAAQoH,IAC/CzO,MAAK,SAAC0P,GACH/C,GAAuB+C,EAAI1W,KAAKA,KAAK2W,KAAKC,cAC1C/C,GAAoB6C,EAAI1W,KAAKA,KAAK2W,KAAKE,WACvClE,EAAa+D,EAAI1W,KAAKA,KAAKA,SAE9B2I,OAAM,SAACC,GACJL,QAAQC,IAAII,MAEfkO,SAAQ,WACL5B,IAAmB,QAE5B,KACH,CAACX,KAcLlQ,qBAAU,WATW,IAAboQ,IAAkBzC,GAAkBA,EAAegF,SACnDX,GAAarE,EAAegF,QAAQzW,OAGvB,IAAbkU,IAAkBtC,GAAmBA,EAAgB6E,SACrDxK,GAAa2F,EAAgB6E,QAAQzW,SAM1C,CAACgU,KAGJlQ,qBAAU,WACN,IAAM4S,EAAiBC,eAAepX,QAAQ,YAC9C,GAAImX,EACAvB,GAAcvV,KAAKC,MAAM6W,SAI7B,GAAIpF,GAAwBD,IAAWqF,EAAgB,CACnD,IAAME,EAAa,iDAAG,gHACKC,YAAoBxF,EAAOyF,SAAUzF,EAAO0F,WADjD,OACZvW,EADY,OAGZ6I,EAAe,GACjB7I,IACA6I,EAAO,QAAc7I,EAASwW,QAC9B3N,EAAO,MAAY7I,EAASsH,MAC5BuB,EAAO,SAAe7I,EAASyW,MAGnC9B,GAAc9L,GAVI,2CAAH,qDAanBuN,OAEL,CAACtF,EAAsBD,IAE1BvN,qBAAU,WAC2B,aAA7BpE,OAAOc,SAAS0C,UAGpB2K,IAAWrE,IAAImC,IAAIC,QAAQC,kBACtBpF,MAAK,SAAC0P,GACHrE,EAAiBqE,EAAI1W,KAAKA,KAAKA,MAE/B,IAAMyX,EAAUf,EAAI1W,KAAKA,KAAKA,KAAK,GAAG0X,GAChCC,EAAcjB,EAAI1W,KAAKA,KAAKA,KAAK4X,MAAK,mBAAuC,GAAvC,EAAGC,cAG3CrD,GADAmD,EACsBA,EAAYD,GAEZD,MAG7B9O,OAAM,SAACC,GACJL,QAAQC,IAAII,MAEfkO,SAAQ,WACLlC,IAAa,QAEtB,IAEH,IAAMkD,GAAe,WACb7X,OAAOmW,YAAc,MACrBpC,GAAa,SACbE,GAAa,UACNjU,OAAOmW,YAAc,KAAOnW,OAAOmW,YAAc,MACxDpC,GAAa,SACbE,GAAa,WAEbF,GAAa,SACbE,GAAa,WAIrB7P,qBAAU,WAMN,OALAyT,KACA7X,OAAOyJ,iBAAiB,SAAUoO,IAClC3B,KACAlW,OAAOyJ,iBAAiB,SAAUyM,IAE3B,WACHlW,OAAO8X,oBAAoB,SAAUD,IACrC7X,OAAO8X,oBAAoB,SAAU5B,OAE1C,IAEH,IAAM6B,GAAqB,SAACC,GACxB,GAAInE,IAAYA,GAASkD,UAChBlD,GAASkD,QAAQkB,SAASD,EAAEE,QAC7B,IACIC,KACF,MAAOH,GACL1P,QAAQC,IAAIyP,KAWtBG,GAAc,WAChBhS,SAAS2R,oBAAoB,QAASC,IAAoB,GAC1D1D,IAAc,GACd+D,MAGEA,GAAW,WACb3D,GAAY,IAGV4D,GAAe,SAACtN,EAAcuN,GAChC,GAAY,WAARvN,EAAmB,CACnB,IAAQzK,EAAUgY,EAAMJ,OAAhB5X,MACR4S,GAAgB5S,GAEZA,EAAMiE,QAAU,GAChB6R,GAAa9V,GACbuU,IAAkB,KAElBvC,EAAa,IACbuC,IAAkB,IAI1B,GAAY,WAAR9J,EAAmB,CACnB,IAAQzK,EAAUgY,EAAMJ,OAAhB5X,MACRsS,GAAsBtS,GAElBA,EAAMiE,QAAU,GAChB8H,GAAY/L,GACZyU,IAAkB,KAElBvC,EAAY,IACZuC,IAAkB,IAI1B,GAAY,YAARhK,EAAoB,CACpB,IAAQzK,EAAUgY,EAAMJ,OAAhB5X,MACRkT,GAAiBlT,GAEbA,EAAMiE,QAAU,GAChBgI,GAAajM,GACb2U,IAAmB,KAEnBvC,EAAa,IACbuC,IAAmB,MAKzBsD,GAAsB,SAACD,GACzB,IAAME,EAAgB,YAAOnG,GACvBoG,EAAgB,GACtB,EAAkDH,EAAMJ,OAAhDQ,EAAR,EAAQA,aAAcC,EAAtB,EAAsBA,UAAWC,EAAjC,EAAiCA,aAG7BzF,KAAuBE,IAFXsF,GAAaD,EAAeE,GAAiB,KAM/C,KAAO1D,KACjBC,IAAoB,GAEhBlC,KACAwF,EAAQ,QAAcxF,IAG1BwF,EAAQ,KAAWtF,GAAqB,EAExCqD,IAAa1M,IAAImC,IAAIK,SAASC,aAAckM,GACvC1R,MAAK,SAAC0P,GACHA,EAAI1W,KAAKA,KAAKA,KAAK8Y,KAAI,SAACC,GACpBN,EAAiBxT,KAAK8T,MAG1B1F,GAAsBqD,EAAI1W,KAAKA,KAAK2W,KAAKC,cACzCrE,EAAakG,GAET3G,GAAcA,EAAWkF,UACzBuB,EAAMJ,OAAOS,UAAYA,MAGhCjQ,OAAM,SAACC,GACJL,QAAQC,IAAII,MAEfkO,SAAQ,WACLtQ,YAAW,WACP4O,IAAoB,KACrB,UAKb4D,GAAuB,SAACT,GAC1B,IAAMU,EAAgB,YAAOvG,GACvBgG,EAAgB,GACtB,EAAkDH,EAAMJ,OAAhDQ,EAAR,EAAQA,aAAcC,EAAtB,EAAsBA,UAAWC,EAAjC,EAAiCA,aAG7BnF,KAAwBE,IAFZgF,GAAaD,EAAeE,GAAiB,KAM/C,KAAOxD,KACjBC,IAAoB,GAEhB9B,KACAkF,EAAQ,KAAWlF,IAGvBkF,EAAQ,KAAWhF,GAAsB,EAEzCtF,IAAWrE,IAAImC,IAAIK,SAASC,aAAckM,GACrC1R,MAAK,SAAC0P,GACHA,EAAI1W,KAAKA,KAAKA,KAAK8Y,KAAI,SAACC,GACpBE,EAAiBhU,KAAK8T,MAG1BpF,GAAuB+C,EAAI1W,KAAKA,KAAK2W,KAAKC,cAC1CjE,EAAasG,GAET/G,GAAeA,EAAY8E,UAC3BuB,EAAMJ,OAAOS,UAAYA,MAGhCjQ,OAAM,SAACC,GACJL,QAAQC,IAAII,MAEfkO,SAAQ,WACLtQ,YAAW,WACP8O,IAAoB,KACrB,UAKb4D,GAAsB,SAACX,GACzB,IAAMY,EAAe,YAAO3G,GACtBkG,EAAgB,GACtB,EAAkDH,EAAMJ,OAAhDQ,EAAR,EAAQA,aAAcC,EAAtB,EAAsBA,UAAWC,EAAjC,EAAiCA,aAG7B/F,KAAuBE,IAFX4F,GAAaD,EAAeE,GAAiB,KAM/C,KAAOtD,KACjBC,IAAmB,GAEf5C,KACA8F,EAAQ,KAAW9F,IAGvB8F,EAAQ,KAAW5F,GAAqB,EAExC1E,IAAWrE,IAAImC,IAAIC,QAAQG,YAAaoM,GACnC1R,MAAK,SAAC0P,GACHA,EAAI1W,KAAKA,KAAKA,KAAK8Y,KAAI,SAACC,GACpBI,EAAgBlU,KAAK8T,MAGzBhG,GAAsB2D,EAAI1W,KAAKA,KAAK2W,KAAKC,cACzCnE,EAAY0G,GAERlH,GAAcA,EAAW+E,UACzBuB,EAAMJ,OAAOS,UAAYA,MAGhCjQ,OAAM,SAACC,GACJL,QAAQC,IAAII,MAEfkO,SAAQ,WACLtQ,YAAW,WACPgP,IAAmB,KACpB,UAKb4D,GAAa,SAACpO,GACJ,WAARA,IACAmI,GAAgB,IAChBZ,EAAa,KAGL,WAARvH,IACA6H,GAAsB,IACtBJ,EAAY,KAGJ,YAARzH,IACAyI,GAAiB,IACjBd,EAAa,MAIf0G,GAAU,SAAC,GAA2D,IAAzDC,EAAwD,EAAxDA,QAASvC,EAA+C,EAA/CA,KAAMP,EAAyC,EAAzCA,QAC9B,OACI,sBAAKtU,UAAU,oBAAf,UACI,qBAAKA,UAAU,wCAAf,SACI,qBACIA,UAAU,iBACVqX,QAAS,WACLpG,GAAgBqD,GAAU6B,MAHlC,SAMI,qBAAKjW,IAAKoX,EAAclX,IAAI,uBAGpC,qBAAKJ,UAAU,2BAA2BqX,QAAS,kBAAMnB,MAAzD,SACI,eAAC,IAAD,CAAMzV,GAAI,aAAe2W,EAASpY,MAAO,CAAEM,MAAO,OAAQiY,eAAgB,QAA1E,UACI,qBAAKvX,UAAU,gBAAf,SAAgC6U,IAChC,qBAAK7U,UAAU,mBAAf,SAAmCsU,aAOjDkD,GAAU,SAAC,GAA6D,IAA3D9U,EAA0D,EAA1DA,MAAOmS,EAAmD,EAAnDA,KAAM4C,EAA6C,EAA7CA,aAC5B,EAAgChU,mBAASf,GAAgBgV,GAAzD,mBAAOC,EAAP,KAAiBC,EAAjB,KAEA,OACI,sBACI5X,UAAU,mBACVqX,QAAS,WACL1G,GAAsBkE,GAAOsB,MAHrC,UAMI,qBAAKnW,UAAU,wBAAf,SACI,qBAAKA,UAAU,kBAAf,SACI,qBAAKE,IAAKyX,EAAUvX,IAAI,gBAAgByX,QAAS,kBAAMD,EAAYF,UAG3E,qBAAK1X,UAAU,QAAf,SACI,sBAAKA,UAAU,oBAAf,UACI,qBAAKA,UAAU,cAAf,SAA8B6U,IAC9B,qBAAK7U,UAAU,sBAAf,SACI,qBAAKA,UAAU,cAAf,SAA8ByX,eAQhDK,GAAW,SAAC,GAA2D,IAAzDV,EAAwD,EAAxDA,QAASvC,EAA+C,EAA/CA,KAAMP,EAAyC,EAAzCA,QAC/B,OACI,sBAAKtU,UAAU,oBAAf,UACI,qBAAKA,UAAU,wCAAf,SACI,qBACIA,UAAU,iBACVqX,QAAS,WACL9F,GAAiBsD,GAAOsB,MAHhC,SAMI,qBAAKjW,IAAKoX,EAAclX,IAAI,uBAGpC,qBAAKJ,UAAU,2BAA2BqX,QAAS,kBAAMnB,MAAzD,SACI,eAAC,IAAD,CAAMzV,GAAI,aAAe2W,EAASpY,MAAO,CAAEM,MAAO,OAAQiY,eAAgB,QAA1E,UACI,qBAAKvX,UAAU,gBAAf,SAAgC6U,IAChC,qBAAK7U,UAAU,mBAAf,SAAmCsU,aAOjDyD,GAAe,WACjB,IAAM5L,EAAS,IAAI6L,gBAEf9H,EAAc5N,OAAS,GAAK+P,IAC5BlG,EAAO8L,OAAO,OAAQ5F,GAAmB6F,YAGzClH,IACA7E,EAAO8L,OAAO,UAAWjH,IAGzBN,IACAvE,EAAO8L,OAAO,eAAgBvH,IAG9BY,IACAnF,EAAO8L,OAAO,OAAQ3G,IAGV,aAAZ/P,GACI4K,EAAO+L,WACPzW,EAAQsB,KAAK,KAAOoJ,EAAO+L,YAE3BzW,EAAQsB,KAAK,KAGjBtB,EAAQ0W,QAAQ,aAAehM,EAAO+L,YAG1ChC,MAGJ,OACI,mCACI,cAAC9G,EAAD,CACIpP,UAAS,UAAK6T,IACd7U,MAAO,CAAEO,OAAQ4S,GAAaJ,GAAYF,IAC1CuG,IAAKxG,GAHT,SAKI,sBAAK5R,UAAU,iBAAf,UACI,qBAAKA,UAAU,iBAAf,SACI,cAAC,IAAD,CAAMS,GAAG,IAAI4W,QAAS,kBAAMtZ,OAAO+E,SAAS,CAAE5D,IAAK,EAAGG,KAAM,EAAGgZ,SAAU,YAAzE,SACI,qBAAKnY,IAAKoY,EAAetY,UAAU,mBAG3C,sBAAKA,UAAU,sBAAf,UACI,sBACIA,UAAW,cAAgBmS,KAAeF,GAAU,mBAAqB,UACzEoF,QAAS,kBAlU7BnT,SAASsD,iBAAiB,QAASsO,IAAoB,QACvD1D,IAAc,IA+TE,UAII,qBAAKlS,IAAKqY,EAAenY,IAAI,eAAeJ,UAAU,oCACtD,+BACKjC,OAAOmW,YAAc,IAChB,8BACA,oCAEV,wBAAQlU,UAAU,gCAAlB,SACI,qBAAKE,IAAKsY,EAAYpY,IAAI,sBAGlC,qBAAKJ,UAAW,iBAAmBmS,KAAeF,GAAU,mBAAqB,UAAjF,SACKQ,GACG,sBAAKzS,UAAU,qBAAf,UACI,cAAC,IAAD,CAAUV,MAAO,IAAKC,OAAQ,KAC9B,cAAC,IAAD,CAAUD,MAAO,GAAIC,OAAQ,KAC7B,cAAC,IAAD,CAAUD,MAAO,GAAIC,OAAQ,QAGjC2Q,EAAc5N,OAAS,GACvB4N,EAAc0G,KAAI,WAAe6B,GAAW,IAAvBjD,EAAsB,EAAtBA,GAAIX,EAAkB,EAAlBA,KACrB,OACI,qBAEI7U,UACI,sBAAwBqS,IAAsBmD,EAAK,SAAW,IAElE6B,QAAS,kBAAM/E,GAAsBkD,IALzC,SAOKX,GANI4D,WAa7B,qBAAKzY,UAAU,mBAAf,SACI,cAAC,IAAD,CACIS,GAAgB,aAAZc,GAA0B,IAAM,YACpC8V,QAAS,kBAAMtZ,OAAO+E,SAAS,CAAE5D,IAAK,EAAGG,KAAM,EAAGgZ,SAAU,YAFhE,SAII,sBAAKrY,UAAW,kBAAgC,aAAZuB,GAA0B,QAAU,IAAxE,UACI,+BACiB,aAAZA,GAA0B,OAASxD,OAAOmW,YAAc,IAAM,MAAQ,aAE3E,qBAAKlU,UAAU,cAAf,SACI,qBAAKE,IAAiB,aAAZqB,GAA0BmX,EAAWC,EAAWvY,IAAI,yBAK9E,qBAAKJ,UAAU,yCAAf,SACI,sBAAKA,UAAW,eAAiBmS,KAAeF,GAAU,SAAW,UAArE,UACI,sBAAKjS,UAAU,aAAf,UACI,sBACIA,UAAW,2BAAyC,GAAZuS,GAAgB,SAAW,IACnE8E,QAAS,kBAAM7E,GAAY,IAF/B,UAII,qBAAKxS,UAAU,eAAf,qBACA,uBACIoY,IAAKtI,EACL9P,UAAU,mBACV4Y,YAAY,oBACZva,MAAO2S,GACP6H,SAAU,SAAC9C,GAAD,OAAOK,GAAa,UAAWL,MAE7C,qBACI/V,UAAW,iBAA+B,GAAZuS,GAAgB,SAAW,UACzD8E,QAAS,kBAAMH,GAAW,YAF9B,SAII,qBAAKhX,IAAK4Y,EAAW1Y,IAAI,qBAGjC,qBAAKJ,UAAU,oBACf,sBACIA,UAAW,gBAA8B,GAAZuS,GAAgB,SAAW,IACxD8E,QAAS,kBAAM7E,GAAY,IAF/B,UAII,qBAAKxS,UAAU,eAAf,qBACA,uBACIA,UAAU,mBACV4Y,YAAY,oBACZva,MAAOqS,GACPmI,SAAU,SAAC9C,GAAD,OAAOK,GAAa,UAAWL,MAE7C,qBACI/V,UAAW,iBAA+B,GAAZuS,GAAgB,SAAW,UACzD8E,QAAS,kBAAMH,GAAW,YAF9B,SAII,qBAAKhX,IAAK4Y,EAAW1Y,IAAI,qBAGjC,qBAAKJ,UAAU,oBACf,sBACIA,UAAW,gBAA8B,GAAZuS,GAAgB,SAAW,IACxD8E,QAAS,kBAAM7E,GAAY,IAF/B,UAII,qBAAKxS,UAAU,eAAf,sBACA,uBACIoY,IAAKnI,EACLjQ,UAAU,mBACV4Y,YAAY,iBACZva,MAAOiT,GACPuH,SAAU,SAAC9C,GAAD,OAAOK,GAAa,WAAYL,MAE9C,qBACI/V,UAAW,iBAA+B,GAAZuS,GAAgB,SAAW,UACzD8E,QAAS,kBAAMH,GAAW,aAF9B,SAII,qBAAKhX,IAAK4Y,EAAW1Y,IAAI,wBAIrC,yBACIJ,UAAW,kBAAoBuS,GAAW,WAAa,IACvD8E,QAASU,GAFb,UAII,qBAAK7X,IAAKsY,EAAYpY,IAAI,iBAC1B,qBAAKJ,UAAW,gBAAkBuS,GAAW,oBAAsB,UAAnE,wBAIFvB,GAAa1O,QAAU,GAAKqQ,KAC1B,qBAAK3S,UAAuB,GAAZuS,GAAgB,gBAAkB,SAAlD,SACKI,GACG,qBAAK3S,UAAU,+DAAf,SACI,cAAC,IAAD,CAAUM,MAAM,UAAUf,OAAQ,GAAID,MAAO,OAGjD,sBAAKU,UAAU,eAAe+Y,SAAU,SAAChD,GAAD,OAAOO,GAAoBP,IAAnE,UACK3F,EAAU9N,OAAS,EAChB8N,EAAUwG,KAAI,WAAiC6B,GAAW,IAAzCrB,EAAwC,EAAxCA,QAAS5B,EAA+B,EAA/BA,GAAIX,EAA2B,EAA3BA,KAAMP,EAAqB,EAArBA,QAChC,OACI,cAAC6C,GAAD,CACIC,QAASA,EAET5B,GAAIA,EACJX,KAAMA,EACNP,QAASA,GAHJ,iBAAmBmE,MAQpC,qBAAKzY,UAAU,oBAAf,+BAGJ,qBACIA,UACI,sBAAwBiT,GAAmB,SAAW,UAF9D,SAKI,cAAC,IAAD,CAAU3S,MAAM,UAAUf,OAAQ,GAAID,MAAO,aAM/DoR,GAAmBpO,QAAU,GAAKuQ,KAChC,qBAAK7S,UAAuB,GAAZuS,GAAgB,gBAAkB,SAAlD,SACKM,GACG,qBAAK7S,UAAU,+DAAf,SACI,cAAC,IAAD,CAAUM,MAAM,UAAUf,OAAQ,GAAID,MAAO,OAGjD,sBAAKU,UAAU,eAAe+Y,SAAU,SAAChD,GAAD,OAAOiB,GAAoBjB,IAAnE,UACKzF,EAAShO,OAAS,EACfgO,EAASsG,KAAI,WAAyC6B,GAAW,IAAjDjD,EAAgD,EAAhDA,GAAIX,EAA4C,EAA5CA,KAAMmE,EAAsC,EAAtCA,UAAWC,EAA2B,EAA3BA,cACjC,OACI,cAACzB,GAAD,CAEIhC,GAAIA,EACJ9S,MAAOsW,EACPnE,KAAMA,EACN4C,aAAcwB,GAJTR,MASjB,qBAAKzY,UAAU,uBAAf,8BAGJ,qBACIA,UACI,sBAAwBqT,GAAkB,SAAW,UAF7D,SAKI,cAAC,IAAD,CAAU/S,MAAM,UAAUf,OAAQ,GAAID,MAAO,aAM/DgS,GAAchP,QAAU,GAAKyQ,KAC3B,qBAAK/S,UAAuB,GAAZuS,GAAgB,iBAAmB,SAAnD,SACKQ,GACG,qBAAK/S,UAAU,+DAAf,SACI,cAAC,IAAD,CAAUM,MAAM,UAAUf,OAAQ,GAAID,MAAO,OAGjD,sBAAKU,UAAU,gBAAgB+Y,SAAU,SAAChD,GAAD,OAAOe,GAAqBf,IAArE,UACKvF,EAAUlO,OAAS,EAChBkO,EAAUoG,KAAI,WAAiC6B,GAAW,IAAzCrB,EAAwC,EAAxCA,QAAS5B,EAA+B,EAA/BA,GAAIX,EAA2B,EAA3BA,KAAMP,EAAqB,EAArBA,QAChC,OACI,cAACwD,GAAD,CACIV,QAASA,EAET5B,GAAIA,EACJX,KAAMA,EACNP,QAASA,GAHJ,iBAAmBmE,MAQpC,qBAAKzY,UAAU,oBAAf,+BAGJ,qBACIA,UACI,sBAAwBmT,GAAmB,SAAW,UAF9D,SAKI,cAAC,IAAD,CAAU7S,MAAM,UAAUf,OAAQ,GAAID,MAAO,iBASzE,qBAAKU,UAAW,sBAAwBmS,KAAeF,GAAU,oBAAsB,UAAvF,SACI,sBAAKjS,UAAU,qBAAf,UACI,qBAAKA,UAAU,iBAAf,SACI,qBAAKE,IAAKgZ,EAAqBlZ,UAAU,iBAE7C,sBAAKA,UAAU,iCAAf,UACI,qBAAKA,UAAU,kBAAf,SACKyS,GACG,sBAAKzS,UAAU,qBAAf,UACI,cAAC,IAAD,CAAUV,MAAO,GAAIC,OAAQ,KAC7B,cAAC,IAAD,CAAUD,MAAO,GAAIC,OAAQ,KAC7B,cAAC,IAAD,CAAUD,MAAO,GAAIC,OAAQ,QAGjC2Q,EAAc5N,OAAS,GACvB4N,EAAc0G,KAAI,WAAe6B,GAAW,IAAvBjD,EAAsB,EAAtBA,GAAIX,EAAkB,EAAlBA,KACrB,OACI,qBAEI7U,UACI,sBACCqS,IAAsBmD,EAAK,SAAW,IAE3C6B,QAAS,kBAAM/E,GAAsBkD,IANzC,SAQKX,GAPI4D,QAazB,qBAAKzY,UAAU,oBAAf,SACI,cAAC,IAAD,CACIS,GAAgB,aAAZc,GAA0B,IAAM,YACpC8V,QAAS,kBAAMtZ,OAAO+E,SAAS,CAAE5D,IAAK,EAAGG,KAAM,EAAGgZ,SAAU,YAFhE,SAII,sBACIrY,UAAW,kBAAgC,aAAZuB,GAA0B,QAAU,IACnE8V,QAAS,kBAAMnF,GAAuB,aAAZ3Q,KAF9B,UAII,+BACiB,aAAZA,GACK,OACAxD,OAAOmW,YAAc,IACjB,MACA,aAEd,qBAAKlU,UAAU,cAAf,SACI,qBACIE,IAAiB,aAAZqB,GAA0BmX,EAAWC,EAC1CvY,IAAI,4BAO5B,sBAAKJ,UAAU,SAAf,UACI,qBAAKA,UAAU,cAAcqX,QAAS,kBAAMnB,MAA5C,SACI,qBAAKhW,IAAKiZ,EAAUnZ,UAAU,iBAElC,sBAAKA,UAAU,wBAAf,UACI,qBAAKA,UAAU,gBAAf,qBACA,sBAAKA,UAAU,uCAAf,UACI,uBACIoY,IAAKtI,EACL9P,UAAU,cACV4Y,YAAY,oBACZvB,QAAS,kBAAM7E,GAAY,IAC3BnU,MAAO2S,GACP6H,SAAU,SAAC9C,GAAD,OAAOK,GAAa,UAAWL,MAE7C,qBACI/V,UAAW,iBAA+B,GAAZuS,GAAgB,mBAAqB,UACnE8E,QAAS,WACLlB,KAAYe,GAAW,YAH/B,SAMI,qBAAKhX,IAAK4Y,EAAW1Y,IAAI,sBAG/B4Q,GAAa1O,QAAU,GAAKqQ,KAC1B,sBACI3S,UAAW,iBAA+B,GAAZuS,GAAgB,oBAAsB,UACpEwG,SAAU,SAAChD,GAAD,OAAOO,GAAoBP,IACrCqC,IAAKxI,EAHT,UAKK+C,GACG,qBAAK3S,UAAU,+DAAf,SACI,cAAC,IAAD,CAAUM,MAAM,UAAUf,OAAQ,GAAID,MAAO,OAEjD8Q,EAAU9N,OAAS,EACnB8N,EAAUwG,KAAI,WAAiC6B,GAAW,IAAzCrB,EAAwC,EAAxCA,QAAS5B,EAA+B,EAA/BA,GAAIX,EAA2B,EAA3BA,KAAMP,EAAqB,EAArBA,QAChC,OACI,cAAC6C,GAAD,CACIC,QAASA,EAET5B,GAAIA,EACJX,KAAMA,EACNP,QAASA,GAHJ,sBAAwBmE,MAQzC,qBAAKzY,UAAU,kBAAf,SACI,qBAAKA,UAAU,2BAAf,iCAIR,qBACIA,UAAW,sBAAwBiT,GAAmB,SAAW,UADrE,SAGI,cAAC,IAAD,CAAU3S,MAAM,UAAUf,OAAQ,GAAID,MAAO,gBAMjE,sBAAKU,UAAU,kBAAf,UACI,qBAAKA,UAAU,gBAAf,qBACA,sBAAKA,UAAU,uCAAf,UACI,uBACIA,UAAU,cACV4Y,YAAY,oBACZvB,QAAS,kBAAM7E,GAAY,IAC3BnU,MAAOqS,GACPmI,SAAU,SAAC9C,GAAD,OAAOK,GAAa,UAAWL,MAE7C,qBACI/V,UAAW,iBAA+B,GAAZuS,GAAgB,mBAAqB,UACnE8E,QAAS,WACLlB,KAAYe,GAAW,YAH/B,SAMI,qBAAKhX,IAAK4Y,EAAW1Y,IAAI,sBAG/BsQ,GAAmBpO,QAAU,GAAKuQ,KAChC,sBACI7S,UAAW,iBAA+B,GAAZuS,GAAgB,oBAAsB,UACpEwG,SAAU,SAAChD,GAAD,OAAOiB,GAAoBjB,IACrCqC,IAAKrI,EAHT,UAKK8C,GACG,qBAAK7S,UAAU,+DAAf,SACI,cAAC,IAAD,CAAUM,MAAM,UAAUf,OAAQ,GAAID,MAAO,OAEjDgR,EAAShO,OAAS,EAClBgO,EAASsG,KAAI,WAAyC6B,GAAW,IAAjDjD,EAAgD,EAAhDA,GAAIX,EAA4C,EAA5CA,KAAMmE,EAAsC,EAAtCA,UAAWC,EAA2B,EAA3BA,cACjC,OACI,cAACzB,GAAD,CAEIhC,GAAIA,EACJ9S,MAAOsW,EACPnE,KAAMA,EACN4C,aAAcwB,GAJTR,MASjB,qBAAKzY,UAAU,kBAAf,SACI,qBAAKA,UAAU,2BAAf,gCAGR,qBAAKA,UAAW,sBAAwBqT,GAAkB,SAAW,UAArE,SACI,cAAC,IAAD,CAAU/S,MAAM,UAAUf,OAAQ,GAAID,MAAO,aAK7D,sBAAKU,UAAU,mBAAf,UACI,qBAAKA,UAAU,gBAAf,sBACA,sBAAKA,UAAU,uCAAf,UACI,uBACIoY,IAAKnI,EACLjQ,UAAU,cACV4Y,YAAY,iBACZvB,QAAS,kBAAM7E,GAAY,IAC3BnU,MAAOiT,GACPuH,SAAU,SAAC9C,GAAD,OAAOK,GAAa,WAAYL,MAE9C,qBACI/V,UAAW,iBAA+B,GAAZuS,GAAgB,mBAAqB,UACnE8E,QAAS,WACLlB,KAAYe,GAAW,aAH/B,SAMI,qBAAKhX,IAAK4Y,EAAW1Y,IAAI,sBAG/BkR,GAAchP,QAAU,GAAKyQ,KAC3B,sBACI/S,UAAW,kBAAgC,GAAZuS,GAAgB,oBAAsB,UACrEwG,SAAU,SAAChD,GAAD,OAAOe,GAAqBf,IACtCqC,IAAKpI,EAHT,UAKK+C,GACG,qBAAK/S,UAAU,+DAAf,SACI,cAAC,IAAD,CAAUM,MAAM,UAAUf,OAAQ,GAAID,MAAO,OAEjDkR,EAAUlO,OAAS,EACnBkO,EAAUoG,KAAI,WAAiC6B,GAAW,IAAzCrB,EAAwC,EAAxCA,QAAS5B,EAA+B,EAA/BA,GAAIX,EAA2B,EAA3BA,KAAMP,EAAqB,EAArBA,QAChC,OACI,cAACwD,GAAD,CACIV,QAASA,EAET5B,GAAIA,EACJX,KAAMA,EACNP,QAASA,GAHJ,uBAAyBmE,MAQ1C,qBAAKzY,UAAU,kBAAf,SACI,qBAAKA,UAAU,2BAAf,iCAIR,qBACIA,UAAW,sBAAwBmT,GAAmB,SAAW,UADrE,SAGI,cAAC,IAAD,CAAU7S,MAAM,UAAUf,OAAQ,GAAID,MAAO,aAK7D,yBACIU,UAAU,gBACVqX,QAASU,GAFb,UAII,qBAAK7X,IAAKsY,EAAYpY,IAAI,iBAC1B,qBAAKJ,UAAU,cAAf,oCCjkC1BoZ,EAAkB/V,IAAOgW,OAAV,yjBCWNC,EAVA,WACX,IAAMC,GAAO,IAAIC,MAAOC,cAExB,OACI,cAACL,EAAD,CAAiBpZ,UAAU,mDAAmDwV,GAAG,SAAjF,SACI,wBAAOxV,UAAU,YAAjB,kBAAgCuZ,EAAhC,oCCNNG,EAAkBrW,IAAOC,IAAV,kjICoCNqW,MA3Bf,WACI,MAA2BlW,mBAA0C,MAArE,mBAAOmW,EAAP,KAAeC,EAAf,KAuBA,OAbA1X,qBAAU,WACN,IAAM6F,EAAQ,SAAC+N,GACXA,EAAE+D,iBACFD,EAAS9D,IAKb,OAFAhY,OAAOyJ,iBAAiB,sBAAuBQ,GAExC,WACHjK,OAAO8X,oBAAoB,sBAAuB7N,MAEvD,IAEI,CAAC4R,EArBgB,WACpB,OAAIA,EACOA,EAAOA,SAGX5M,QAAQC,OAAO,IAAI8M,MAAM,wE,iBCdlCC,EAA4B,SAACC,GACjC,IAAMC,EAAQC,MAASC,cACvBpc,aAAaI,QAAQ6b,EAAYC,IAGnC,SAASG,EAAiCJ,EAAoBK,GAC5D,IAAMC,EAAaJ,IARc,SAACF,GAAD,uBAAgCjc,aAAaJ,QAAQqc,UAArD,QAAoE,GAQ3EO,CAA2BP,IAC/CQ,EAAsBN,MAASO,KAAKH,EAAY,QACtD,OAAOI,MAAMF,IAAwBA,EAAsBH,EAG7D,IAYeM,EAZa,SAACX,GAAmF,IAA/DK,EAA8D,uDAA7B,EAChF,EAA0E7W,mBACxE4W,EAAiCJ,EAAYK,IAD/C,mBAAOO,EAAP,KAAsCC,EAAtC,KAIMC,EAA8B,WAClCD,GAAiC,GACjCd,EAA0BC,IAG5B,MAAO,CAACY,EAA+BE,IC1B1B,MAA0B,iDCgG1BC,EAxFE,WACb,MAAqCrB,IAArC,mBAAOsB,EAAP,KAAkBC,EAAlB,KACA,EAAqCzX,oBAAS,GAA9C,mBAAO0X,EAAP,KAAkBC,EAAlB,KACA,EAAwC3X,oBAAS,GAAjD,mBAAO4X,EAAP,KAAqBC,EAArB,KACA,EAAqEV,EAAoB,wBAAzF,mBAAOC,EAAP,KAAsCE,EAAtC,KAEMQ,EAAO,WACTH,GAAgB,GAChBL,KA4BJ,OApBA5Y,qBAAU,WACepE,OAAOyd,WAAW,8BAA8BC,UAOjEH,IADAL,GAOAG,IADAP,MAKL,CAACI,IAECE,EAKD,cAACzB,EAAD,WACM2B,GAAgBF,EACd,sBAAKnb,UAAU,gBAAf,UACI,sBAAKA,UAAU,uCAAf,UACI,qBAAKA,UAAU,kBAAf,SACI,qBAAKE,IAAKoY,EAAelY,IAAI,iBAEjC,sBAAKJ,UAAU,yDAAf,UACI,qBAAKA,UAAU,aAAf,wCACA,qBAAKA,UAAU,mBAAf,mFAKR,qBAAKA,UAAU,mDAAf,SACI,wBAAQA,UAAU,4BAA4BqX,QAASkE,EAAvD,uBAMR,sBAAKvb,UAAU,gBAAf,UACI,sBAAKA,UAAU,uCAAf,UACI,qBAAKA,UAAU,kBAAf,SACI,qBAAKE,IAAKoY,EAAelY,IAAI,iBAEjC,sBAAKJ,UAAU,yDAAf,UACI,qBAAKA,UAAU,aAAf,wCACA,qBAAKA,UAAU,mBAAf,0EAKR,sBAAKA,UAAU,iBAAf,UACI,wBAAQA,UAAU,eAAeqX,QAhE1B,WACvB6D,IACAK,KA8DgB,mBAGA,wBAAQvb,UAAU,gBAAlB,SACI,sBAAMqX,QAASkE,EAAf,8BA1Cb,8BCxBAtY,IAXI,SAAC,GAAuC,IAArCyY,EAAoC,EAApCA,SAClB,OACI,eAACxM,EAAD,WACI,cAAC,EAAD,IACA,cAAC,EAAD,IACA,cAACC,EAAD,UAAqBuM,IACrB,cAAC,EAAD,S,gCChBG,QAA0B,0C,gCCA1B,QAA0B,oC,gCCA1B,QAA0B,mC,gCCA1B,QAA0B,mC,uGCQ5BxG,EAAmB,iDAAG,WAAOC,EAAkBC,GAAzB,2GAIRvU,IAAQ8a,WAAWxG,EAAUC,GAJrB,UAIzBzN,EAJyB,gDAMpB,MANoB,OAUtBiU,EAAI,EAVkB,YAUfA,EAAIjU,EAASkU,QAAQ,GAAGC,mBAAmBxZ,QAV5B,iBAWlByZ,EAAI,EAXc,YAWXA,EAAIpU,EAASkU,QAAQ,GAAGC,mBAAmBF,GAAGI,MAAM1Z,QAXzC,sBAYfqF,EAASkU,QAAQ,GAAGC,mBAAmBF,GAAGI,MAAMD,GAZjC,OAad,aAbc,QAgBd,gCAhBc,QAmBd,YAnBc,gCAcfzG,EAAO3N,EAASkU,QAAQ,GAAGC,mBAAmBF,GAAGK,UAdlC,oCAiBf9V,EAAQwB,EAASkU,QAAQ,GAAGC,mBAAmBF,GAAGK,UAjBnC,oCAoBf5G,EAAU1N,EAASkU,QAAQ,GAAGC,mBAAmBF,GAAGM,WApBrC,6BAWiDH,IAXjD,uBAUoCH,IAVpC,8BA2B/B5G,eAAe5W,QAAQ,WAAYH,KAAKK,UAAU,CAAEgX,OAAMnP,QAAOkP,aA3BlC,kBA6BxB,CACHA,UACAlP,QACAmP,SAhC2B,4CAAH,yD,gCCRjB,QAA0B,wC,gCCA1B,QAA0B,4C,gCCA1B,QAA0B,gD,gCCA1B,QAA0B,4C,gCCA1B,QAA0B,gD,gCCA1B,QAA0B,uC","file":"static/js/main.38b859a0.chunk.js","sourcesContent":["export default __webpack_public_path__ + \"static/media/checkbox_checked.3c6ee3dd.svg\";","export default __webpack_public_path__ + \"static/media/direction.cd7a836b.svg\";","export default __webpack_public_path__ + \"static/media/pagination_left.b82749f2.svg\";","export default __webpack_public_path__ + \"static/media/image_album.322dd568.svg\";","export default __webpack_public_path__ + \"static/media/clock_open.d85a9966.svg\";","export default __webpack_public_path__ + \"static/media/clock_close.3dec02ff.svg\";","export default __webpack_public_path__ + \"static/media/chevron_up.d0f73927.svg\";","const getItem = (key: string): any => {\r\n const data: any = typeof window !== 'undefined' ? localStorage.getItem(key) : '';\r\n\r\n try {\r\n return JSON.parse(data);\r\n } catch (err) {\r\n return data;\r\n }\r\n};\r\n\r\nconst setItem = (key: string, value: string): any => {\r\n const stringify = typeof value !== 'string' ? JSON.stringify(value) : value;\r\n return localStorage.setItem(key, stringify);\r\n};\r\n\r\nconst removeItem = (key: string): any => {\r\n return localStorage.removeItem(key);\r\n};\r\n\r\nexport { getItem, setItem, removeItem };\r\n","import { lazy } from 'react';\r\n\r\nconst lazyWithRetry = (componentImport: any) =>\r\n lazy(async () => {\r\n const pageHasAlreadyBeenForceRefreshed = JSON.parse(\r\n window.localStorage.getItem('page-has-been-force-refreshed') || 'false',\r\n );\r\n\r\n try {\r\n const component = await componentImport();\r\n\r\n window.localStorage.setItem('page-has-been-force-refreshed', 'false');\r\n\r\n return component;\r\n } catch (error) {\r\n if (!pageHasAlreadyBeenForceRefreshed) {\r\n // Assuming that the user is not on the latest version of the application.\r\n // Let's refresh the page immediately.\r\n window.localStorage.setItem('page-has-been-force-refreshed', 'true');\r\n return window.location.reload();\r\n }\r\n\r\n // The page has already been reloaded\r\n // Assuming that user is already using the latest version of the application.\r\n // Let's let the application crash and raise the error.\r\n throw error;\r\n }\r\n });\r\n\r\n\r\nexport default lazyWithRetry;","import React from 'react';\r\nimport LoadingLogo from 'assets/img/loading.png';\r\nimport { Link } from 'react-router-dom';\r\n\r\nconst OfflinePage = (): JSX.Element => {\r\n return (\r\n \r\n \r\n
\r\n No internet connection, please try again.\r\n
\r\n \r\n \r\n Back to home page\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default OfflinePage;\r\n","import React, { Suspense, useEffect, useState } from 'react';\r\nimport { Switch, Route, Redirect, useLocation, useHistory } from 'react-router-dom';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport commonActions from 'redux/common/actions';\r\nimport { PRELOAD_IMAGES } from 'config/settings';\r\nimport lazyWithRetry from 'components/lazyWithRetry';\r\n\r\n// Geocode\r\nimport Geocode from 'react-geocode';\r\nimport PageLayout from 'containers/PageLayout';\r\nGeocode.setApiKey(process.env.REACT_APP_GOOGLE_MAP_API_KEY);\r\n\r\nconst HomePage = lazyWithRetry(() => import('pages/HomePage'));\r\nconst WorkshopPage = lazyWithRetry(() => import('pages/WorkshopPage'));\r\nconst WorkshopDetailPage = lazyWithRetry(() => import('pages/WorkshopDetailPage'));\r\nconst WorkshopImagesPage = lazyWithRetry(() => import('pages/WorkshopImagesPage'));\r\nconst WorkshopAppointmentPage = lazyWithRetry(() => import('pages/WorkshopAppointmentPage'));\r\nimport OfflinePage from 'offline';\r\nimport { RootState } from 'redux/rootReducers';\r\n\r\nconst NotFound = () => {\r\n return ;\r\n};\r\n\r\nconst Routes = (): JSX.Element => {\r\n const { pathname } = useLocation();\r\n const history = useHistory();\r\n\r\n const dispatch = useDispatch();\r\n const setTotalAssetsCount = (total: number) => dispatch(commonActions.setTotalAssetsCount(total));\r\n const addLoadedAssetsCount = () => dispatch(commonActions.addLoadedAssetsCount());\r\n\r\n const offlineCount = useSelector(({ common }: RootState) => common.offline)\r\n\r\n // Preload images\r\n useEffect(() => {\r\n setTotalAssetsCount(PRELOAD_IMAGES.length);\r\n\r\n PRELOAD_IMAGES.forEach((preloadImage) => {\r\n const image = new Image();\r\n image.src = preloadImage;\r\n image.onload = function () {\r\n addLoadedAssetsCount();\r\n };\r\n image.onerror = function () {\r\n addLoadedAssetsCount();\r\n };\r\n });\r\n }, []);\r\n\r\n // Scroll to top when change path\r\n useEffect(() => {\r\n window.scrollTo(0, 0);\r\n }, [pathname]);\r\n\r\n useEffect(() => {\r\n if (offlineCount) {\r\n history.push('/offline');\r\n }\r\n }, [offlineCount]);\r\n\r\n return (\r\n <>}>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {/* Route Not Found */}\r\n \r\n \r\n \r\n );\r\n\r\n};\r\n\r\nexport default Routes;\r\n","import Styled from 'styled-components';\r\n\r\nconst LoadingOverlayContainer = Styled.div`\r\n position: fixed;\r\n top: 0;\r\n right: 0;\r\n bottom: 0;\r\n left: 0;\r\n width: 100vw;\r\n height: 100vh;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n align-items: center;\r\n background: #00519E;\r\n background-size: cover;\r\n z-index: 9999;\r\n overflow: hidden;\r\n\r\n .app-logo {\r\n width: 230px;\r\n height: auto;\r\n margin: 0 auto;\r\n }\r\n`;\r\n\r\nconst LoadingProgressBar = Styled.div`\r\n position: relative;\r\n width: 180px;\r\n height: 18px;\r\n background: #C2C2C2;\r\n border: 2.62045px solid #FFFFFF;\r\n border-radius: 6.55113px;\r\n display: flex;\r\n align-items: center;\r\n\r\n .progress {\r\n height: 18px;\r\n background-color: #E30613;\r\n transition: 1s ease;\r\n transition-delay: 0.5s;\r\n border: 2.62045px solid #FFFFFF;\r\n border-radius: 6.55113px;\r\n }\r\n`;\r\n\r\nexport { LoadingOverlayContainer, LoadingProgressBar };\r\n","import React, { useState, useEffect } from 'react';\r\nimport { LoadingOverlayContainer, LoadingProgressBar } from './style';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { RootState } from 'redux/rootReducers';\r\nimport LoadingLogo from 'assets/img/loading.png';\r\nimport commonActions from 'redux/common/actions';\r\n\r\nconst LoadingOverlay = (): JSX.Element => {\r\n const [isCompleted, setIsCompleted] = useState(false);\r\n const [doneMinLoadingTime, setDoneMinLoadingTime] = useState(false);\r\n const [progress, setProgress] = useState(0);\r\n\r\n const dispatch = useDispatch();\r\n const resetLoadedAssetsCount = () => dispatch(commonActions.resetLoadedAssetsCount());\r\n\r\n const totalAssetsCount = useSelector(({ common }: RootState) => common.totalAssetsCount);\r\n const loadedAssetsCount = useSelector(({ common }: RootState) => common.loadedAssetsCount);\r\n\r\n // Handle the loading overlay based on assets loaded\r\n useEffect(() => {\r\n if (isCompleted) return;\r\n\r\n setProgress((loadedAssetsCount / totalAssetsCount) * 100);\r\n\r\n document.body.style.overflow = 'hidden';\r\n document.body.style.height = '100vh';\r\n\r\n if (loadedAssetsCount >= totalAssetsCount && doneMinLoadingTime) {\r\n resetLoadedAssetsCount();\r\n setIsCompleted(true);\r\n document.body.style.overflowY = 'auto';\r\n document.body.style.height = 'auto';\r\n return;\r\n }\r\n }, [totalAssetsCount, loadedAssetsCount, doneMinLoadingTime]);\r\n\r\n // Set loading minimum time\r\n useEffect(() => {\r\n setTimeout(() => {\r\n setDoneMinLoadingTime(true);\r\n }, 3000);\r\n }, [totalAssetsCount]);\r\n\r\n // Once completed, destroy the loading overlay\r\n if (isCompleted || window.location.pathname === '/offline') {\r\n return <>;\r\n }\r\n\r\n return (\r\n \r\n \"LIQUI\r\n\r\n \r\n
\r\n \r\n \r\n );\r\n};\r\n\r\nexport default LoadingOverlay;\r\n","import React from 'react';\r\nimport { BrowserRouter as Router } from 'react-router-dom';\r\nimport Routes from 'routes/index';\r\nimport { Provider } from 'react-redux';\r\nimport store from 'redux/store';\r\nimport { ToastContainer } from 'react-toastify';\r\nimport 'react-toastify/dist/ReactToastify.css';\r\nimport LoadingOverlay from 'containers/LoadingOverlay';\r\n\r\nconst App = (): JSX.Element => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default App;\r\n","import { ReportHandler } from 'web-vitals';\r\n\r\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\r\n if (onPerfEntry && onPerfEntry instanceof Function) {\r\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n getCLS(onPerfEntry);\r\n getFID(onPerfEntry);\r\n getFCP(onPerfEntry);\r\n getLCP(onPerfEntry);\r\n getTTFB(onPerfEntry);\r\n });\r\n }\r\n};\r\n\r\nexport default reportWebVitals;\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://cra.link/PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.0/8 are considered localhost for IPv4.\r\n window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\r\n);\r\n\r\ntype Config = {\r\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\r\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\r\n};\r\n\r\nexport function register(config?: Config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://cra.link/PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl: string, config?: Config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then((registration) => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See https://cra.link/PWA.'\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch((error) => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl, {\r\n headers: { 'Service-Worker': 'script' },\r\n })\r\n .then((response) => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (\r\n response.status === 404 ||\r\n (contentType != null && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then((registration) => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log('No internet connection found. App is running in offline mode.');\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready\r\n .then((registration) => {\r\n registration.unregister();\r\n })\r\n .catch((error) => {\r\n console.error(error.message);\r\n });\r\n }\r\n}\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport './index.css';\r\nimport App from './App';\r\nimport reportWebVitals from './reportWebVitals';\r\nimport * as serviceWorkerRegistration from './serviceWorkerRegistration';\r\nimport 'bootstrap/dist/css/bootstrap.min.css';\r\nimport 'bootstrap/dist/js/bootstrap.min.js';\r\nimport * as Sentry from '@sentry/react';\r\nimport { BrowserTracing } from '@sentry/tracing';\r\n\r\nSentry.init({\r\n dsn: 'https://f1e63da8aa46412ca2bc2b23340b9cc1@sentry.revnology.com/11',\r\n integrations: [new BrowserTracing()],\r\n\r\n // Set tracesSampleRate to 1.0 to capture 100%\r\n // of transactions for performance monitoring.\r\n // We recommend adjusting this value in production\r\n tracesSampleRate: 1.0,\r\n denyUrls: ['localhost'],\r\n});\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n document.getElementById('root'),\r\n);\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: https://cra.link/PWA\r\nserviceWorkerRegistration.register();\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals();\r\n","import { setItem, removeItem } from 'utility/localStorageControl';\r\n\r\nconst actions = {\r\n LOGIN_BEGIN: 'LOGIN_BEGIN',\r\n LOGIN_SUCCESS: 'LOGIN_SUCCESS',\r\n LOGIN_ERR: 'LOGIN_ERR',\r\n\r\n LOGOUT_BEGIN: 'LOGOUT_BEGIN',\r\n LOGOUT_SUCCESS: 'LOGOUT_SUCCESS',\r\n LOGOUT_ERR: 'LOGOUT_ERR',\r\n\r\n MESSAGE_SET: 'MESSAGE_SET',\r\n MESSAGE_CLEAR: 'MESSAGE_CLEAR',\r\n\r\n loginBegin: (): any => {\r\n return {\r\n type: actions.LOGIN_BEGIN,\r\n };\r\n },\r\n\r\n loginSuccess: (publicAddress: string, accessToken: string): any => {\r\n setItem('logged_in', 'true')\r\n setItem('public_address', publicAddress)\r\n setItem('access_token', accessToken)\r\n return {\r\n type: actions.LOGIN_SUCCESS,\r\n publicAddress,\r\n accessToken\r\n };\r\n },\r\n\r\n loginErr: (err: string): any => {\r\n return {\r\n type: actions.LOGIN_ERR,\r\n err,\r\n };\r\n },\r\n\r\n logoutBegin: (): any => {\r\n return {\r\n type: actions.LOGOUT_BEGIN,\r\n };\r\n },\r\n\r\n logoutSuccess: (): any => {\r\n removeItem('logged_in')\r\n removeItem('public_address')\r\n removeItem('access_token')\r\n return {\r\n type: actions.LOGOUT_SUCCESS,\r\n };\r\n },\r\n\r\n logoutErr: (err: string): any => {\r\n return {\r\n type: actions.LOGOUT_ERR,\r\n err,\r\n };\r\n },\r\n\r\n messageSet: (message: string): any => {\r\n return {\r\n type: actions.MESSAGE_SET,\r\n message,\r\n };\r\n },\r\n\r\n messageClear: (): any => {\r\n return {\r\n type: actions.MESSAGE_CLEAR,\r\n };\r\n },\r\n};\r\n\r\nexport default actions;\r\n","const commonActions = {\r\n SET_TOTAL_ASSETS_COUNT: 'SET_TOTAL_ASSETS_COUNT',\r\n ADD_LOADED_ASSETS_COUNT: 'ADD_LOADED_ASSETS_COUNT',\r\n RESET_LOADED_ASSETS_COUNT: 'RESET_LOADED_ASSETS_COUNT',\r\n GO_OFFLINE: 'GO_OFFLINE',\r\n\r\n setTotalAssetsCount: (count: number): any => {\r\n return {\r\n type: commonActions.SET_TOTAL_ASSETS_COUNT,\r\n payload: {\r\n count,\r\n },\r\n };\r\n },\r\n\r\n addLoadedAssetsCount: (): any => {\r\n return {\r\n type: commonActions.ADD_LOADED_ASSETS_COUNT,\r\n };\r\n },\r\n\r\n resetLoadedAssetsCount: (): any => {\r\n return {\r\n type: commonActions.RESET_LOADED_ASSETS_COUNT,\r\n };\r\n },\r\n\r\n goOffline: (): any => {\r\n return {\r\n type: commonActions.GO_OFFLINE,\r\n };\r\n },\r\n};\r\n\r\nexport default commonActions;\r\n","/**\r\n * It's suggested to configure the RESTful endpoints in this file\r\n * so that there is only one source of truth, future update of endpoints\r\n * could be done from here without refactoring on multiple places throughout the app\r\n */\r\nconst API = {\r\n general: {\r\n getWorkshopTypes: '/Api/workshop-types',\r\n getDistances: '/Api/distances',\r\n getProducts: '/Api/products',\r\n },\r\n workshop: {\r\n getWorkshops: '/Api/workshops',\r\n getPoints: '/Api/workshop-point',\r\n },\r\n workshopDetail: {\r\n getWorkshopDetail: '/Api/workshops/{id}',\r\n getWorkshopImages: '/Api/workshops/{id}/images',\r\n getWorkshopProduct: '/Api/workshops/{id}/products',\r\n },\r\n productCategories: {\r\n getProductCategories: '/Api/workshops/{id}/product-categories',\r\n },\r\n appointment: {\r\n postAppointment: '/Api/workshops/{id}/appointment'\r\n },\r\n};\r\n\r\nexport { API };\r\n","export default __webpack_public_path__ + \"static/media/loading.0a6ba394.png\";","import commonActions from './actions';\r\ninterface Action {\r\n type: string;\r\n payload: any;\r\n}\r\n\r\nconst initialState = {\r\n totalAssetsCount: 9999,\r\n loadedAssetsCount: 0,\r\n offline: 0,\r\n};\r\n\r\nconst CommonReducer = (state = initialState, action: Action): any => {\r\n switch (action.type) {\r\n case commonActions.SET_TOTAL_ASSETS_COUNT:\r\n return {\r\n ...state,\r\n totalAssetsCount: action.payload.count,\r\n };\r\n case commonActions.ADD_LOADED_ASSETS_COUNT:\r\n return {\r\n ...state,\r\n loadedAssetsCount: state.loadedAssetsCount + 1,\r\n };\r\n case commonActions.RESET_LOADED_ASSETS_COUNT:\r\n return {\r\n ...state,\r\n totalAssetsCount: 9999,\r\n loadedAssetsCount: 0,\r\n };\r\n\r\n case commonActions.GO_OFFLINE:\r\n return {\r\n ...state,\r\n offline: state.offline + 1,\r\n };\r\n\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default CommonReducer;\r\n","import actions from './actions';\r\nimport { getItem } from 'utility/localStorageControl';\r\n\r\nconst { LOGIN_BEGIN, LOGIN_SUCCESS, LOGIN_ERR, LOGOUT_BEGIN, LOGOUT_SUCCESS, LOGOUT_ERR, MESSAGE_SET, MESSAGE_CLEAR } =\r\n actions;\r\n\r\nconst initState = {\r\n login: getItem('logged_in') ? true : false,\r\n publicAddress: getItem('public_address') ?? '',\r\n accessToken: getItem('access_token') ?? '',\r\n loading: false,\r\n error: null,\r\n message: '',\r\n};\r\n\r\n/**\r\n *\r\n * @todo impure state mutation/explaination\r\n */\r\nconst AuthReducer = (state = initState, action: { type: string, publicAddress: string, accessToken: string, err: string, message: string }): any => {\r\n const { type, publicAddress, accessToken, err, message } = action;\r\n switch (type) {\r\n case LOGIN_BEGIN:\r\n return {\r\n ...state,\r\n loading: true,\r\n };\r\n case LOGIN_SUCCESS:\r\n return {\r\n ...state,\r\n login: true,\r\n publicAddress: publicAddress,\r\n accessToken: accessToken,\r\n loading: false,\r\n error: null,\r\n };\r\n case LOGIN_ERR:\r\n return {\r\n ...state,\r\n error: err,\r\n loading: false,\r\n };\r\n case LOGOUT_BEGIN:\r\n return {\r\n ...state,\r\n loading: true,\r\n };\r\n case LOGOUT_SUCCESS:\r\n return {\r\n ...state,\r\n login: false,\r\n publicAddress: '',\r\n accessToken: '',\r\n loading: false,\r\n };\r\n case LOGOUT_ERR:\r\n return {\r\n ...state,\r\n error: err,\r\n loading: false,\r\n };\r\n case MESSAGE_SET:\r\n return {\r\n ...state,\r\n message,\r\n };\r\n case MESSAGE_CLEAR:\r\n return {\r\n ...state,\r\n message: '',\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\nexport default AuthReducer;\r\n","import { combineReducers } from 'redux';\r\nimport CommonReducer from './common/reducer';\r\nimport AuthReducer from './auth/reducer';\r\n\r\nconst rootReducers = combineReducers({\r\n common: CommonReducer,\r\n auth: AuthReducer\r\n});\r\n\r\nexport type RootState = ReturnType\r\n\r\nexport default rootReducers;\r\n","import { createStore } from 'redux';\r\nimport { composeWithDevTools } from 'redux-devtools-extension';\r\nimport rootReducer from './rootReducers';\r\n\r\nconst store = createStore(rootReducer, composeWithDevTools());\r\n\r\nexport default store;\r\n","import axios, { AxiosPromise } from 'axios';\r\nimport store from 'redux/store';\r\nimport { getItem } from 'utility/localStorageControl';\r\nimport { default as authActions } from 'redux/auth/actions';\r\nimport { createBrowserHistory } from 'history';\r\nimport commonActions from 'redux/common/actions';\r\n\r\nconst history = createBrowserHistory();\r\n\r\nconst API_ENDPOINT = process.env.REACT_APP_API_ENDPOINT;\r\n\r\nconst client = axios.create({\r\n baseURL: API_ENDPOINT,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n});\r\n\r\nclass APIService {\r\n static get(path = '', params = {}, optionalHeader = {}): AxiosPromise {\r\n return client({\r\n method: 'GET',\r\n url: path,\r\n params,\r\n headers: { ...optionalHeader },\r\n });\r\n }\r\n\r\n static post(path = '', data = {}, optionalHeader = {}): AxiosPromise {\r\n return client({\r\n method: 'POST',\r\n url: path,\r\n data,\r\n headers: { ...optionalHeader },\r\n });\r\n }\r\n\r\n static patch(path = '', data = {}): AxiosPromise {\r\n return client({\r\n method: 'PATCH',\r\n url: path,\r\n data: JSON.stringify(data),\r\n });\r\n }\r\n\r\n static put(path = '', data = {}): AxiosPromise {\r\n return client({\r\n method: 'PUT',\r\n url: path,\r\n data: JSON.stringify(data),\r\n });\r\n }\r\n\r\n static download(path = ''): AxiosPromise {\r\n return client({\r\n method: 'GET',\r\n url: path,\r\n responseType: 'blob', // important\r\n });\r\n }\r\n}\r\n\r\nconst { dispatch } = store;\r\n\r\n/**\r\n * axios interceptors runs before and after a request, letting the developer modify req,req more\r\n * For more details on axios interceptor see https://github.com/axios/axios#interceptors\r\n */\r\nclient.interceptors.request.use((config) => {\r\n // do something before executing the request\r\n // For example tag along the bearer access token to request header or set a cookie\r\n\r\n const requestConfig = config;\r\n const { headers } = config;\r\n\r\n const accessToken = getItem('access_token');\r\n if (accessToken) {\r\n requestConfig.headers = { ...headers, Authorization: `${getItem('access_token')}` };\r\n }\r\n\r\n return requestConfig;\r\n});\r\n\r\nclient.interceptors.response.use(\r\n (response) => response,\r\n (error) => {\r\n /**\r\n * Do something in case the response returns an error code [3**, 4**, 5**] etc\r\n * For example, on token expiration retrieve a new access token, retry a failed request etc\r\n */\r\n const { response } = error;\r\n\r\n // const originalRequest = error.config;\r\n if (error.toJSON().message === 'Network Error' && history.location.pathname != '/offline') {\r\n dispatch(commonActions.goOffline());\r\n }\r\n\r\n if (response) {\r\n // Handle access token expired, logout user and show message\r\n if (response.status === 401 && response.data.errors === 'E_UNAUTHORIZED_ACCESS: Unauthorized access') {\r\n dispatch(authActions.messageSet('Session expired! Please login again.'));\r\n dispatch(authActions.logoutSuccess());\r\n }\r\n\r\n if (response.status === 500) {\r\n // do something here\r\n } else {\r\n // return originalRequest;\r\n }\r\n }\r\n return Promise.reject(error);\r\n },\r\n);\r\nexport default APIService;\r\n","import axios, { AxiosPromise } from 'axios';\r\nimport store from 'redux/store';\r\nimport { getItem } from 'utility/localStorageControl';\r\nimport { default as authActions } from 'redux/auth/actions';\r\nimport { createBrowserHistory } from 'history';\r\nimport commonActions from 'redux/common/actions';\r\n\r\nconst history = createBrowserHistory();\r\n\r\nconst API_ENDPOINT = process.env.REACT_APP_API_ENDPOINT;\r\n\r\nconst client = axios.create({\r\n baseURL: API_ENDPOINT,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-VERSION': 2\r\n },\r\n});\r\n\r\nclass APIService {\r\n static get(path = '', params = {}, optionalHeader = {}): AxiosPromise {\r\n return client({\r\n method: 'GET',\r\n url: path,\r\n params,\r\n headers: { ...optionalHeader },\r\n });\r\n }\r\n\r\n static post(path = '', data = {}, optionalHeader = {}): AxiosPromise {\r\n return client({\r\n method: 'POST',\r\n url: path,\r\n data,\r\n headers: { ...optionalHeader },\r\n });\r\n }\r\n\r\n static patch(path = '', data = {}): AxiosPromise {\r\n return client({\r\n method: 'PATCH',\r\n url: path,\r\n data: JSON.stringify(data),\r\n });\r\n }\r\n\r\n static put(path = '', data = {}): AxiosPromise {\r\n return client({\r\n method: 'PUT',\r\n url: path,\r\n data: JSON.stringify(data),\r\n });\r\n }\r\n\r\n static download(path = ''): AxiosPromise {\r\n return client({\r\n method: 'GET',\r\n url: path,\r\n responseType: 'blob', // important\r\n });\r\n }\r\n}\r\n\r\n\r\n\r\nconst { dispatch } = store;\r\n\r\n/**\r\n * axios interceptors runs before and after a request, letting the developer modify req,req more\r\n * For more details on axios interceptor see https://github.com/axios/axios#interceptors\r\n */\r\nclient.interceptors.request.use((config) => {\r\n // do something before executing the request\r\n // For example tag along the bearer access token to request header or set a cookie\r\n const requestConfig = config;\r\n const { headers } = config;\r\n\r\n const accessToken = getItem('access_token');\r\n if (accessToken) {\r\n requestConfig.headers = { ...headers, Authorization: `${getItem('access_token')}` };\r\n }\r\n\r\n return requestConfig;\r\n});\r\n\r\nclient.interceptors.response.use(\r\n (response) => response,\r\n (error) => {\r\n /**\r\n * Do something in case the response returns an error code [3**, 4**, 5**] etc\r\n * For example, on token expiration retrieve a new access token, retry a failed request etc\r\n */\r\n const { response } = error;\r\n \r\n if (error.toJSON().message === 'Network Error' && history.location.pathname != '/offline') {\r\n dispatch(commonActions.goOffline());\r\n }\r\n\r\n // const originalRequest = error.config;\r\n if (response) {\r\n // Handle access token expired, logout user and show message\r\n if (response.status === 401 && response.data.errors === 'E_UNAUTHORIZED_ACCESS: Unauthorized access') {\r\n dispatch(authActions.messageSet('Session expired! Please login again.'));\r\n dispatch(authActions.logoutSuccess());\r\n }\r\n\r\n if (response.status === 500) {\r\n // do something here\r\n } else {\r\n // return originalRequest;\r\n }\r\n }\r\n return Promise.reject(error);\r\n },\r\n);\r\nexport default APIService;\r\n","export default __webpack_public_path__ + \"static/media/mail.4e1e510f.svg\";","export default __webpack_public_path__ + \"static/media/contact.871c8b8d.svg\";","export default __webpack_public_path__ + \"static/media/product_1.729a4eef.svg\";","export default __webpack_public_path__ + \"static/media/diagnostic.1d0391c7.svg\";","export default __webpack_public_path__ + \"static/media/maintenance.912c47e7.svg\";","export default __webpack_public_path__ + \"static/media/servicing.be798454.svg\";","export default __webpack_public_path__ + \"static/media/battery_replacement.ec153e11.svg\";","export default __webpack_public_path__ + \"static/media/tyre_change.3f76c54f.svg\";","export default __webpack_public_path__ + \"static/media/car_wash.fd93b372.svg\";","export default __webpack_public_path__ + \"static/media/repair.b77f76c7.svg\";","export default __webpack_public_path__ + \"static/media/accessories.dc8624b0.svg\";","import LoadingLogo from 'assets/img/loading.png';\r\n\r\nimport ArrowDown from 'assets/img/home/arrow_down.svg';\r\nimport GridViewIconNormal from 'assets/img/home/grid_view_icon.svg';\r\nimport GridViewIconRed from 'assets/img/home/grid_view_icon_red.svg';\r\nimport ListViewIconNormal from 'assets/img/home/list_view_icon.svg';\r\nimport ListViewIconRed from 'assets/img/home/list_view_icon_red.svg';\r\nimport Checkbox from 'assets/img/home/checkbox.svg';\r\nimport CheckboxChecked from 'assets/img/home/checkbox_checked.svg';\r\n\r\nimport chevronLeft from 'assets/img/chevron-left.svg';\r\n\r\nimport mail from 'assets/img/detailSection/mail.svg';\r\nimport contact from 'assets/img/detailSection/contact.svg';\r\nimport direction from 'assets/img/detailSection/direction.svg';\r\nimport paginationLeft from 'assets/img/detailSection/pagination_left.svg';\r\nimport product1 from 'assets/img/detailSection/product_1.svg';\r\nimport imageAlbum from 'assets/img/image_album.svg';\r\nimport diagnostic from 'assets/img/detailSection/diagnostic.svg';\r\nimport maintenance from 'assets/img/detailSection/maintenance.svg';\r\nimport servicing from 'assets/img/detailSection/servicing.svg';\r\nimport battery_replacement from 'assets/img/detailSection/battery_replacement.svg';\r\nimport tyre_change from 'assets/img/detailSection/tyre_change.svg';\r\nimport car_wash from 'assets/img/detailSection/car_wash.svg';\r\nimport repair from 'assets/img/detailSection/repair.svg';\r\nimport accessories from 'assets/img/detailSection/accessories.svg';\r\nimport clockOpen from 'assets/img/detailSection/clock_open.svg';\r\nimport clockClose from 'assets/img/detailSection/clock_close.svg';\r\nimport chevron from 'assets/img/detailSection/chevron_up.svg';\r\n\r\nimport locate from 'assets/img/locate.svg';\r\nimport phone from 'assets/img/phone.svg';\r\nimport clock from 'assets/img/clock.svg';\r\n\r\ninterface SETTINGS_TYPE {\r\n defaultMapCenter: {\r\n lat: number;\r\n lng: number;\r\n };\r\n}\r\n\r\nconst SETTINGS: SETTINGS_TYPE = {\r\n defaultMapCenter: {\r\n lat: 3.0838862,\r\n lng: 101.581654,\r\n },\r\n};\r\n\r\nconst PRELOAD_IMAGES: string[] = [\r\n // Loading screen\r\n LoadingLogo,\r\n\r\n // Home page\r\n ArrowDown,\r\n GridViewIconNormal,\r\n GridViewIconRed,\r\n ListViewIconNormal,\r\n ListViewIconRed,\r\n Checkbox,\r\n CheckboxChecked,\r\n\r\n // Appointment Page\r\n chevronLeft,\r\n\r\n // Detail page\r\n mail,\r\n contact,\r\n direction,\r\n paginationLeft,\r\n product1,\r\n imageAlbum,\r\n diagnostic,\r\n maintenance,\r\n servicing,\r\n battery_replacement,\r\n tyre_change,\r\n car_wash,\r\n repair,\r\n accessories,\r\n clockOpen,\r\n clockClose,\r\n chevron,\r\n\r\n // Workshop card\r\n locate,\r\n phone,\r\n clock,\r\n]\r\n\r\nexport { SETTINGS, PRELOAD_IMAGES };\r\n","import Styled from 'styled-components';\r\n\r\nconst LoadingWrapper = Styled.div`\r\n height: 100vh;\r\n width: 100vw;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n background: #FFFFFF;\r\n`;\r\n\r\nconst PageWrapper = Styled.div`\r\n position: relative;\r\n min-height: 100vh;\r\n`;\r\n\r\nconst ContentBodyWrapper = Styled.div`\r\n position: relative;\r\n padding-top: 108px;\r\n\r\n @media only screen and (min-width: 768px) {\r\n padding-top: 150px;\r\n }\r\n\r\n @media only screen and (min-width: 1200px) {\r\n padding-top: 120px;\r\n }\r\n`;\r\n\r\nexport { LoadingWrapper, PageWrapper, ContentBodyWrapper };\r\n","import Styled from 'styled-components';\r\n\r\nconst Nav = Styled.div`\r\n position: fixed;\r\n width: 100%;\r\n top: 0px;\r\n padding: 4px 15px;\r\n background-color: #00519E;\r\n z-index: 999;\r\n\r\n -webkit-transition: height 200ms ease-in-out;\r\n -moz-transition: height 200ms ease-in-out;\r\n transition: height 200ms ease-in-out;\r\n\r\n .logo-container {\r\n width: 100%;\r\n height: 50px;\r\n display: flex;\r\n justify-content: center;\r\n margin-bottom: 10px;\r\n\r\n img {\r\n width: 50px;\r\n height: 100%;\r\n }\r\n }\r\n\r\n .navbar-section {\r\n display: flex;\r\n flex-wrap: wrap;\r\n\r\n .searchbar-container {\r\n margin: 0 10px 0 0;\r\n width: 50vw;\r\n flex-grow: 1;\r\n\r\n .searchbar {\r\n height: 34px;\r\n background: #FFFFFF;\r\n border: 0.82px solid #A9A9A9;\r\n box-shadow: 0px 1.64px 8.2px rgba(0, 0, 0, 0.25);\r\n border-radius: 49.2px;\r\n justify-content: start;\r\n align-items: center;\r\n cursor: pointer;\r\n\r\n padding: 0 10px;\r\n\r\n .mobile-search {\r\n width: 13px;\r\n height: 13px;\r\n }\r\n\r\n span {\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 600;\r\n font-size: 14px;\r\n line-height: 17px;\r\n\r\n color: #343434;\r\n margin: 0 7px;\r\n white-space: nowrap;\r\n overflow-x: auto;\r\n\r\n -ms-overflow-style: none;\r\n scrollbar-width: none;\r\n }\r\n\r\n span::-webkit-scrollbar {\r\n display: none;\r\n }\r\n }\r\n\r\n .vehicle-menu {\r\n justify-content: center;\r\n align-items: center;\r\n height: 45px;\r\n margin-bottom: 10px;\r\n\r\n .skeleton-container {\r\n width: fit-content;\r\n display: flex;\r\n\r\n .react-loading-skeleton {\r\n margin: 0 20px;\r\n }\r\n }\r\n\r\n .vehicle-container {\r\n position: relative;\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 600;\r\n font-size: 18px;\r\n line-height: 22px;\r\n text-align: center;\r\n cursor: pointer;\r\n color: #FFFFFF;\r\n margin: 0 1.5rem;\r\n }\r\n\r\n .vehicle-container.active:after {\r\n content: \"\";\r\n position: absolute;\r\n left: 50%;\r\n transform: translate(-50%);\r\n bottom: -7px;\r\n border-top: 2px solid #FFFFFF;\r\n width: 100%;\r\n }\r\n }\r\n }\r\n\r\n .searchmenu-container {\r\n position: absolute;\r\n bottom: 10px;\r\n left: 45%;\r\n transform: translateX(-45%);\r\n\r\n .searchmenu {\r\n position: relative;\r\n width: 800px;\r\n height: 70px;\r\n background: #EEEEEE;\r\n border: 1px solid #A9A9A9;\r\n border-radius: 60px;\r\n justify-content: space-between;\r\n align-items: center;\r\n animation: searchmenu-animation 0.2s linear !important;\r\n padding-right: 20px;\r\n\r\n .option-bar {\r\n height: 100%;\r\n display: flex;\r\n align-items: center;\r\n\r\n .vertical-border {\r\n height: 34px;\r\n width: 0px;\r\n border-left: 2px solid #A9A9A9;\r\n \r\n margin: 0 1rem;\r\n }\r\n\r\n .first-item {\r\n margin: 0 !important; \r\n padding: 0 1.75rem 0 2rem !important; \r\n }\r\n\r\n .option-item {\r\n position: relative;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n width: 199px;\r\n height: 70px;\r\n padding: 0 1.75rem;\r\n cursor: pointer;\r\n\r\n .option-title {\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 600;\r\n font-size: 14px;\r\n line-height: 17px;\r\n color: #343434;\r\n }\r\n\r\n .option-textfield {\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 500;\r\n font-size: 14px;\r\n line-height: 17px;\r\n color: #343434;\r\n\r\n background: transparent;\r\n border: none;\r\n padding: 0;\r\n\r\n ::placeholder {\r\n font-weight: 300\r\n }\r\n\r\n :focus {\r\n outline: 0;\r\n outline-color: transparent;\r\n outline-style: none;\r\n }\r\n }\r\n\r\n .close-button {\r\n position: absolute;\r\n right: 15px;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n justify-content: center;\r\n align-items: center;\r\n width: 20px;\r\n height: 20px;\r\n cursor: pointer;\r\n z-index: 99;\r\n\r\n img {\r\n width: 100%;\r\n }\r\n }\r\n }\r\n\r\n .active {\r\n background: #FFFFFF !important;\r\n box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.25) !important;\r\n border-radius: 60px !important;\r\n }\r\n }\r\n\r\n .search-button {\r\n width: 35px;\r\n height: 35px;\r\n background: #E40613;\r\n border-radius: 50%;\r\n\r\n border: none;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n -webkit-transition: width 0.25s ease-in-out;\r\n -moz-transition: width 0.25s ease-in-out;\r\n transition: width 0.25s ease-in-out; \r\n\r\n img {\r\n width: 15px;\r\n height: 15px;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \r\n .isMap {\r\n width: 78px !important;\r\n padding: 0 5px !important;\r\n }\r\n\r\n .toggle-container {\r\n width: 80px;\r\n display: flex;\r\n justify-content: flex-end;\r\n\r\n a {\r\n text-decoration: none;\r\n }\r\n\r\n .toggle-button {\r\n width: 71px;\r\n height: 34px;\r\n background: #FFFFFF;\r\n border: 0.694118px solid #A7A7A7;\r\n border-radius: 20.8235px;\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n cursor: pointer;\r\n padding: 0 7px;\r\n\r\n span {\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 400;\r\n font-size: 14px;\r\n line-height: 17px;\r\n\r\n color: #343434;\r\n padding-left: 5px;\r\n }\r\n\r\n .globe-image {\r\n width: 17px;\r\n height: 17px;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n\r\n img {\r\n width: 14px;\r\n height: 14px;\r\n }\r\n }\r\n }\r\n }\r\n \r\n .cursor-pointer {\r\n cursor: pointer !important;\r\n }\r\n\r\n .error-container {\r\n height: 81px;\r\n width: 100%;\r\n padding: 30px 0;\r\n margin: 0 auto;\r\n background: #FFFFFF;\r\n box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.25);\r\n border-radius: 15px;\r\n }\r\n\r\n .nofound-text {\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 700;\r\n font-size: 14px;\r\n line-height: 17px;\r\n color: #343434;\r\n }\r\n\r\n .product-list {\r\n max-height: 280px;\r\n padding: 8px;\r\n overflow-y: auto;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: start;\r\n\r\n -ms-overflow-style: none;\r\n scrollbar-width: none;\r\n }\r\n\r\n .workshop-list, .address-list {\r\n max-height: 280px;\r\n padding: 8px;\r\n overflow-y: auto;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n\r\n -ms-overflow-style: none;\r\n scrollbar-width: none;\r\n }\r\n\r\n .product-list::-webkit-scrollbar, .workshop-list::-webkit-scrollbar, .address-list::-webkit-scrollbar {\r\n display: none;\r\n }\r\n\r\n .mobile-searchmenu {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100vw;\r\n background: #FFFFFF;\r\n box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.25);\r\n padding: 4px 15px 24px ;\r\n\r\n .searchmenu-content {\r\n width: 100%;\r\n margin: 0 auto;\r\n\r\n .vehicle-options {\r\n display: flex;\r\n justify-content: flex-start;\r\n align-items: center;\r\n width: 100%;\r\n height: 34px;\r\n margin: 0 15px 10px 13px;\r\n overflow-x: auto;\r\n\r\n -ms-overflow-style: none;\r\n scrollbar-width: none;\r\n\r\n .skeleton-container {\r\n width: fit-content;\r\n display: flex;\r\n\r\n .react-loading-skeleton {\r\n margin-right: 30px;\r\n }\r\n }\r\n \r\n .vehicle-container {\r\n position: relative;\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 600;\r\n font-size: 14px;\r\n line-height: 17px;\r\n text-align: center;\r\n cursor: pointer;\r\n color: #343434;\r\n white-space: nowrap;\r\n margin-right: 30px;\r\n }\r\n \r\n .vehicle-container.active:after {\r\n content: \"\";\r\n position: absolute;\r\n left: 50%;\r\n transform: translate(-50%);\r\n bottom: -7px;\r\n border-top: 2px solid #343434;\r\n width: 100%;\r\n }\r\n }\r\n \r\n .vehicle-options::-webkit-scrollbar {\r\n display: none;\r\n }\r\n \r\n .back-button {\r\n width: 10px;\r\n height: 15px;\r\n \r\n img {\r\n width: 100%;\r\n }\r\n }\r\n \r\n .section-title {\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 600;\r\n font-size: 14px;\r\n line-height: 17px;\r\n color: #343434;\r\n }\r\n \r\n .input-field {\r\n width: 100%;\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 300;\r\n font-size: 14px;\r\n line-height: 17px;\r\n color: #343434;\r\n margin-bottom: 15px;\r\n background: transparent;\r\n border: none;\r\n padding: 0;\r\n padding-right: 10px;\r\n \r\n :focus {\r\n outline: 0;\r\n outline-color: transparent;\r\n outline-style: none;\r\n }\r\n }\r\n \r\n .close-button {\r\n justify-content: center;\r\n align-items: center;\r\n width: 20px;\r\n height: 20px;\r\n cursor: pointer;\r\n \r\n img {\r\n width: 100%;\r\n }\r\n }\r\n \r\n .product-section {\r\n margin: 10px;\r\n padding-left: 5px;\r\n \r\n .product-item {\r\n align-items: center;\r\n padding: 10px;\r\n margin-left: 0;\r\n margin-bottom: 25px;\r\n width: 100%; \r\n height: 104px;\r\n background: #FFFFFF;\r\n box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.25);\r\n border-radius: 15px;\r\n cursor: pointer !important;\r\n \r\n .image-container {\r\n max-width: 66px;\r\n min-width: 66px;\r\n height: 70px;\r\n border: 0.5px solid #E40613;\r\n box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);\r\n border-radius: 8.75px;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n flex-grow: 1;\r\n margin: 0 auto;\r\n \r\n img {\r\n width: auto;\r\n height: auto;\r\n max-width: 63px;\r\n max-height: 63px;\r\n }\r\n }\r\n \r\n .details-container {\r\n width: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: space-between;\r\n height: 70px;\r\n \r\n .detail-name {\r\n width: 100%;\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 400;\r\n font-size: 12px;\r\n line-height: 14px;\r\n color: #343434;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n display: -webkit-box;\r\n -webkit-line-clamp: 3;\r\n -webkit-box-orient: vertical;\r\n }\r\n \r\n .detail-descriptions {\r\n .detail-text {\r\n width: 100%;\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 700;\r\n font-size: 12px;\r\n line-height: 14px;\r\n color: #343434;\r\n overflow: hidden; \r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \r\n .workshop-section, .address-section {\r\n margin: 10px;\r\n padding-left: 5px;\r\n \r\n .workshop-item {\r\n padding: 10px 15px;\r\n margin-left: 0;\r\n width: 100%;\r\n background: #FFFFFF;\r\n box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.25);\r\n border-radius: 15px;\r\n margin-bottom: 15px;\r\n \r\n .location-container {\r\n .location-image {\r\n width: 30px;\r\n height: 30px;\r\n background: #EEEEEE;\r\n border-radius: 10px;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n cursor: pointer !important; \r\n \r\n img {\r\n width: 45%;\r\n }\r\n }\r\n }\r\n \r\n .workshop-container {\r\n .workshop-name {\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 400;\r\n font-size: 14px;\r\n line-height: 17px;\r\n \r\n color: #343434;\r\n margin-bottom: 3px;\r\n }\r\n \r\n .workshop-address {\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 200;\r\n font-size: 10px;\r\n line-height: 12px;\r\n \r\n color: #343434;\r\n }\r\n }\r\n }\r\n }\r\n\r\n .search-button {\r\n width: 95px;\r\n height: 28px;\r\n background: #E40613;\r\n border-radius: 20px;\r\n\r\n border: none;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n margin-left: auto;\r\n margin-top: 20px;\r\n\r\n img {\r\n width: 13px;\r\n height: 13px;\r\n }\r\n\r\n .search-text {\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 600;\r\n font-size: 14px;\r\n line-height: 17px;\r\n text-align: center;\r\n margin-left: 6px;\r\n color: #FFFFFF;\r\n }\r\n }\r\n }\r\n }\r\n\r\n .loading-container {\r\n width: 100%;\r\n justify-content: center;\r\n }\r\n\r\n &.scrolling-down {\r\n transform: translate3d(0, -100%, 0);\r\n }\r\n\r\n &.scrolling-up {\r\n transform: none;\r\n }\r\n\r\n @keyframes searchmenu-animation {\r\n 0% {\r\n width: 0;\r\n height: 0px;\r\n }\r\n\r\n 100% {\r\n width: 800px;\r\n height: 70px;\r\n }\r\n }\r\n\r\n @media screen and (max-width: 400px) {\r\n .workshop-section, .product-section {\r\n padding-left: 14px !important;\r\n }\r\n }\r\n\r\n @media screen and (min-width: 400px) {\r\n padding: 4px 21px;\r\n\r\n .mobile-searchmenu {\r\n padding: 4px 24px 24px;\r\n \r\n .searchmenu-content {\r\n width: 350px;\r\n\r\n .vehicle-options {\r\n margin: 0 15px 10px 29px;\r\n }\r\n\r\n .address-section {\r\n margin: 5px 29px 10px 15px;\r\n }\r\n\r\n .product-section {\r\n margin: 10px 29px;\r\n padding-left: 0;\r\n \r\n .product-item {\r\n width: 275px;\r\n padding: 16px;\r\n\r\n .details-container {\r\n .detail-name {\r\n width: 100%;\r\n font-size: 14px;\r\n line-height: 17px;\r\n }\r\n \r\n .detail-descriptions {\r\n .detail-text {\r\n font-size: 14px;\r\n line-height: 17px;\r\n }\r\n }\r\n }\r\n }\r\n \r\n }\r\n \r\n .workshop-section {\r\n margin: 10px 29px;\r\n padding-left: 0; \r\n }\r\n }\r\n }\r\n }\r\n \r\n @media screen and (min-width: 768px) {\r\n padding: 24px 32px 0;\r\n\r\n .logo-container {\r\n width: 100px;\r\n height: 100px;\r\n\r\n img {\r\n width: 100% !important;\r\n }\r\n }\r\n\r\n .navbar-section {\r\n .searchbar-container {\r\n width: auto;\r\n margin: 30px auto 0;\r\n\r\n .searchbar {\r\n width: 370px;\r\n height: 50px;\r\n padding: 0 7px;\r\n margin: 0 auto;\r\n justify-content: space-between;\r\n border: 1px solid #A9A9A9;\r\n box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.25);\r\n border-radius: 60px;\r\n\r\n span {\r\n font-size: 16px;\r\n line-height: 20px;\r\n padding-left: 20px;\r\n }\r\n\r\n .search-image {\r\n width: 35px;\r\n height: 35px;\r\n background: #E40613;\r\n border-radius: 50%;\r\n \r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n border: none;\r\n \r\n img {\r\n width: 15px;\r\n height: 15px;\r\n }\r\n }\r\n }\r\n\r\n .vehicle-menu { \r\n margin-top: 12px;\r\n }\r\n }\r\n\r\n .searchmenu-container {\r\n .searchmenu {\r\n width: 708px;\r\n height: 70px;\r\n padding-right: 15px;\r\n\r\n .option-bar {\r\n .vertical-border {\r\n margin: 0 0.75rem;\r\n }\r\n \r\n .first-item {\r\n padding: 0 1.75rem 0 2rem !important; \r\n }\r\n \r\n .option-item {\r\n padding: 0 1.75rem;\r\n \r\n .option-textfield {\r\n padding-right: 10px;\r\n }\r\n\r\n .close-button {\r\n right: 15px;\r\n width: 20px;\r\n height: 20px;\r\n }\r\n }\r\n }\r\n\r\n .search-button {\r\n width: 35px;\r\n height: 35px;\r\n background: #E40613;\r\n border-radius: 50%;\r\n \r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n -webkit-transition: width 0.25s ease-in-out;\r\n -moz-transition: width 0.25s ease-in-out;\r\n transition: width 0.25s ease-in-out; \r\n \r\n img {\r\n width: 15px;\r\n height: 15px;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n .isMap {\r\n width: 104px !important;\r\n padding: 0 12px !important;\r\n }\r\n\r\n .toggle-container {\r\n width: 150px;\r\n margin: 30px 0 0;\r\n\r\n .toggle-button {\r\n width: 140px;\r\n height: 50px;\r\n padding: 0 12px;\r\n border: 1px solid #A7A7A7;\r\n border-radius: 30px;\r\n\r\n span {\r\n font-size: 16px;\r\n line-height: 20px;\r\n padding-left: 2px;\r\n }\r\n\r\n .globe-image {\r\n width: 20px;\r\n height: 20px;\r\n\r\n img {\r\n width: 17px;\r\n height: 17px;\r\n }\r\n }\r\n }\r\n }\r\n\r\n .address-modal {\r\n position: absolute;\r\n left: 0;\r\n top: 115%;\r\n width: 283px;\r\n padding: 15px 35px;\r\n background: #FFFFFF;\r\n box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.25);\r\n border-radius: 15px;\r\n cursor: auto;\r\n \r\n .workshop-item {\r\n width: 100%;\r\n margin-bottom: 15px;\r\n\r\n .location-container {\r\n .location-image {\r\n width: 30px;\r\n height: 30px;\r\n background: #EEEEEE;\r\n border-radius: 10px;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n cursor: pointer;\r\n\r\n img {\r\n width: 45%;\r\n }\r\n }\r\n }\r\n\r\n .workshop-container {\r\n .workshop-name {\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 400;\r\n font-size: 14px;\r\n line-height: 17px;\r\n\r\n color: #343434;\r\n margin-bottom: 3px;\r\n }\r\n\r\n .workshop-address {\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 200;\r\n font-size: 10px;\r\n line-height: 12px;\r\n\r\n color: #343434;\r\n }\r\n }\r\n }\r\n }\r\n \r\n .product-modal {\r\n position: absolute;\r\n left: 59%;\r\n top: 115%; \r\n transform: translateX(-59%);\r\n width: 323px;\r\n padding: 17px 27px;\r\n background: #FFFFFF;\r\n box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.25);\r\n border-radius: 15px;\r\n cursor: auto;\r\n \r\n .product-item {\r\n width: 100%;\r\n margin-bottom: 25px;\r\n cursor: pointer;\r\n \r\n .image-container {\r\n width: 100%;\r\n height: 70px;\r\n border: 0.5px solid #E40613;\r\n box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);\r\n border-radius: 8.75px;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n \r\n img {\r\n width: auto;\r\n height: auto;\r\n max-width: 63px;\r\n max-height: 63px;\r\n }\r\n }\r\n \r\n .details-container {\r\n height: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: space-between;\r\n \r\n .detail-name {\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 400;\r\n font-size: 14px;\r\n line-height: 17px;\r\n color: #343434;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n display: -webkit-box;\r\n -webkit-line-clamp: 3;\r\n -webkit-box-orient: vertical;\r\n }\r\n \r\n .detail-descriptions {\r\n .detail-text {\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 700;\r\n font-size: 14px;\r\n line-height: 17px;\r\n color: #343434;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \r\n .workshop-modal {\r\n position: absolute;\r\n top: 115%; \r\n left: 105%;\r\n transform: translateX(-105%);\r\n width: 283px;\r\n padding: 15px 35px;\r\n background: #FFFFFF;\r\n box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.25);\r\n border-radius: 15px;\r\n cursor: auto;\r\n \r\n .workshop-item {\r\n width: 100%;\r\n margin-bottom: 15px;\r\n\r\n .location-container {\r\n .location-image {\r\n width: 30px;\r\n height: 30px;\r\n background: #EEEEEE;\r\n border-radius: 10px;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n cursor: pointer;\r\n \r\n img {\r\n width: 45%;\r\n }\r\n }\r\n }\r\n \r\n .workshop-container {\r\n .workshop-name {\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 400;\r\n font-size: 14px;\r\n line-height: 17px;\r\n \r\n color: #343434;\r\n margin-bottom: 3px;\r\n }\r\n \r\n .workshop-address {\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 200;\r\n font-size: 10px;\r\n line-height: 12px;\r\n \r\n color: #343434;\r\n }\r\n }\r\n }\r\n }\r\n\r\n .workshop-list, .address-list {\r\n padding: 0px;\r\n } \r\n\r\n @keyframes searchmenu-animation {\r\n 0% {\r\n width: 0;\r\n height: 0px;\r\n }\r\n \r\n 100% {\r\n width: 708px;\r\n height: 70px;\r\n }\r\n }\r\n }\r\n\r\n @media screen and (min-width: 1200px) {\r\n padding: 10px 50px 0;\r\n\r\n .navbar-section {\r\n .searchbar-container {\r\n margin: 24px auto 0;\r\n\r\n .searchbar {\r\n width: 400px;\r\n\r\n span {\r\n font-size: 18px;\r\n line-height: 22px;\r\n }\r\n }\r\n\r\n .vehicle-menu { \r\n margin-top: -20px;\r\n }\r\n }\r\n\r\n .searchmenu-container {\r\n .searchmenu {\r\n width: 800px;\r\n padding-right: 20px;\r\n \r\n .option-bar {\r\n .vertical-border {\r\n margin: 0 1rem;\r\n }\r\n\r\n .first-item {\r\n padding: 0 1.75rem 0 2rem !important; \r\n }\r\n \r\n .option-item {\r\n padding: 0 1.75rem;\r\n \r\n .close-button {\r\n right: 15px;\r\n width: 20px;\r\n height: 20px;\r\n }\r\n }\r\n }\r\n \r\n .search-button {\r\n .search-text {\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 600;\r\n font-size: 18px;\r\n line-height: 22px;\r\n text-align: center;\r\n \r\n color: #FFFFFF;\r\n }\r\n }\r\n \r\n .selected {\r\n width: 106px !important;\r\n border-radius: 20px !important;\r\n justify-content: space-between;\r\n padding: 0 10px;\r\n \r\n -webkit-transition: width 0.25s ease-in-out;\r\n -moz-transition: width 0.25s ease-in-out;\r\n transition: width 0.25s ease-in-out; \r\n }\r\n }\r\n }\r\n }\r\n\r\n .isMap {\r\n width: 150px !important;\r\n padding: 0 20px !important;\r\n }\r\n\r\n .toggle-container {\r\n width: 190px;\r\n margin: 24px 0 0;\r\n\r\n .toggle-button {\r\n width: 170px;\r\n \r\n span {\r\n font-size: 18px;\r\n line-height: 22px;\r\n padding-left: 5px;\r\n }\r\n\r\n .globe-image {\r\n width: 30px;\r\n height: 30px;\r\n\r\n img {\r\n width: 25px;\r\n height: 25px;\r\n }\r\n }\r\n }\r\n }\r\n\r\n .product-modal {\r\n left: 50%;\r\n transform: translateX(-50%);\r\n }\r\n\r\n .workshop-modal { \r\n left: 90%;\r\n transform: translateX(-90%);\r\n }\r\n\r\n @keyframes searchmenu-animation {\r\n 0% {\r\n width: 0;\r\n height: 0px;\r\n }\r\n \r\n 100% {\r\n width: 800px;\r\n height: 70px;\r\n }\r\n }\r\n }\r\n\r\n @media screen and (min-width: 2000px) {\r\n width: 75%;\r\n }\r\n \r\n @media screen and (min-width: 2500px) {\r\n width: 67%;\r\n }\r\n \r\n @media screen and (min-width: 3000px) {\r\n width: 50%;\r\n }\r\n \r\n @media screen and (min-width: 4000px) {\r\n width: 33%;\r\n }\r\n @media screen and (min-width: 6000px) {\r\n width: 25%;\r\n }\r\n`;\r\n\r\nexport { Nav };\r\n","export default __webpack_public_path__ + \"static/media/liquimoly_logo.5800607d.png\";","export default __webpack_public_path__ + \"static/media/liquimoly_logo_mobile.981cf3dc.png\";","export default __webpack_public_path__ + \"static/media/search_icon.1ef6f0ab.svg\";","export default __webpack_public_path__ + \"static/media/search_icon_red.535d0cf6.svg\";","export default __webpack_public_path__ + \"static/media/globe_icon.187a1e81.svg\";","export default __webpack_public_path__ + \"static/media/home_icon.9efacb94.svg\";","export default __webpack_public_path__ + \"static/media/location_icon.5ac22062.svg\";","export default __webpack_public_path__ + \"static/media/close_icon.6f9b628c.svg\";","export default __webpack_public_path__ + \"static/media/back_icon.c6f3ac5d.svg\";","export default \"data:image/png;base64,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bXZTUR8E92Xw0nO3YJ+Pm1vu0R1UENZCQJxB3J/AOzUxbrPzUCOv5zDDBySfJXkTF/bBBx/oKiUU3mddq9rn/iMQPEvzhRde0Au0qnoegvt7NJiBlQOWwloMC/EX0LjnMfBQpNlwpDd3xx7jgOCzY7DOPT778wQrN+6xd//Mj+NKwQyPOPAICOOAkIZC3TtG8ZwDnursjQ963tjGzezz8X14ToRhsvaEX5P7FEL9c+OqhKekc0USzucLdj8IHwICAEQYDwIAEQICAEQICAAQISAAQISAAAARAgIARAgIABAhIABAhIAAABECAgBECAgAECEgAECEgAAAEQICAEQICAAQISAAQISAAAARAgIARAgIABAhIABAhIAAABECAgBECAgAECEgAECEgAAAEQICAEQICAAQISAAQISAAAARAgIARAgIABAhIABAhIAAABECAgBECAgAECEgAECEgAAAEQICAEQICAAQISAAQISAAAARAgIARAgIABAhIABAhIAAABECAgBECAgAECEgAECEgAAAEQICAEQICAAQISAAQISAAAARAgIARAgIABAhIABAhIAAABECAgBECAgAECEgAECEgAAAEQICAEQICAAQISAAQISAAAARAgIARAgIABAhIABAhIAAABECAgBECAgAECEgAECEgAAAEQICAEQICAAQISAAQISAAAARAgIARAgIABAhIABAhIAAABECAgBECAgAECEgAECEgAAAEQICAEQICAAQISAAQISAAAARAgIARAgIABD9f2eA/upd+56TAAAAAElFTkSuQmCC\"","import React, { useState, useRef, useEffect, useCallback } from 'react';\r\nimport { useLocation, useHistory } from 'react-router-dom';\r\nimport APIService from 'api/apiService';\r\nimport APIV2Service from 'api/apiV2Service';\r\nimport { API } from 'api';\r\n\r\n// Libraries\r\nimport { Link } from 'react-router-dom';\r\nimport { TailSpin } from 'react-loader-spinner';\r\nimport Skeleton from 'react-loading-skeleton';\r\nimport { debounce } from 'lodash';\r\nimport { useGeolocated } from 'react-geolocated';\r\nimport { getLocationByCoords } from 'utility/geocode';\r\nimport useScrollPosition from '@react-hook/window-scroll';\r\n\r\n// Styling\r\nimport { Nav } from './style';\r\nimport 'react-loading-skeleton/dist/skeleton.css';\r\n\r\n// Assets\r\nimport LiquimolyLogo from 'assets/img/nav/liquimoly_logo.png';\r\nimport LiquimolyLogoMobile from 'assets/img/nav/liquimoly_logo_mobile.png';\r\nimport SearchIcon from 'assets/img/nav/search_icon.svg';\r\nimport SearchIconRed from 'assets/img/nav/search_icon_red.svg';\r\nimport GlobeIcon from 'assets/img/nav/globe_icon.svg';\r\nimport HomeIcon from 'assets/img/nav/home_icon.svg';\r\nimport LocationIcon from 'assets/img/nav/location_icon.svg';\r\nimport CloseIcon from 'assets/img/nav/close_icon.svg';\r\nimport BackIcon from 'assets/img/nav/back_icon.svg';\r\nimport ProductPlaceholder from 'assets/img/placeholder/searchbar_product.png';\r\n\r\ninterface ProductType {\r\n id: string;\r\n image: string;\r\n name: string;\r\n descriptions: string;\r\n\r\n}\r\n\r\ninterface WorkshopType {\r\n name_id: string,\r\n id: string;\r\n name: string;\r\n address: string;\r\n}\r\n\r\nconst NavBar = (): JSX.Element => {\r\n const { coords, isGeolocationEnabled } = useGeolocated({\r\n positionOptions: {\r\n enableHighAccuracy: false,\r\n },\r\n userDecisionTimeout: 5000,\r\n });\r\n\r\n const addressRef = useRef(null);\r\n const addressElemRef = useRef(null);\r\n const productRef = useRef(null);\r\n const workshopRef = useRef(null);\r\n const workshopElemRef = useRef(null);\r\n const history = useHistory();\r\n const [workshopTypes, setWorkshopTypes] = useState([]);\r\n const [addresses, setAddresses] = useState([]);\r\n const [products, setProducts] = useState([]);\r\n const [workshops, setWorkshops] = useState([]);\r\n const [productSearchInput, setProductSearchInput] = useState('');\r\n const [productCurrentPage, setProductCurrentPage] = useState(1);\r\n const [productLastPage, setProductLastPage] = useState(999);\r\n const [addressInput, setAddressInput] = useState('');\r\n const [addressCurrentPage, setAddressCurrentPage] = useState(1);\r\n const [addressLastPage, setAddressLastPage] = useState(999);\r\n const [workshopInput, setWorkshopInput] = useState('');\r\n const [workshopCurrentPage, setWorkshopCurrentPage] = useState(1);\r\n const [workshopLastPage, setWorkshopLastPage] = useState(999);\r\n const clickRef = useRef(null);\r\n const [oriHeight, setOriHeight] = useState('120px');\r\n const [newHeight, setNewHeight] = useState('131px');\r\n const { pathname } = useLocation();\r\n const [showMap, setShowMap] = useState(false);\r\n const [showSearch, setShowSearch] = useState(false);\r\n const [activeWorkshopType, setActiveWorkshopType] = useState(1);\r\n const [selected, setSelected] = useState(0);\r\n\r\n const [isLoading, setIsLoading] = useState(true);\r\n const [addressLoading, setAddressLoading] = useState(false);\r\n const [productLoading, setProductLoading] = useState(false);\r\n const [workshopLoading, setWorkshopLoading] = useState(false);\r\n const [loadingAddresses, setLoadingAddresses] = useState(false);\r\n const [loadingWorkshops, setLoadingWorkshops] = useState(false);\r\n const [loadingProducts, setLoadingProducts] = useState(false);\r\n\r\n const [reqHeaders, setReqHeaders] = useState({});\r\n\r\n // Handle scroll for nav bar appearance\r\n const [scrollToHideValue, setScrollToHideValue] = useState(90);\r\n const scrollY = useScrollPosition();\r\n const [scrollingNavClassname, setScrollingNavClassname] = useState('scrolling-up');\r\n const [lastScroll, setLastScroll] = useState(0);\r\n\r\n const handleScroll = () => {\r\n setLastScroll(scrollY);\r\n\r\n // When reach top of page, remove classname\r\n if (scrollY <= 0) {\r\n setScrollingNavClassname('');\r\n return;\r\n }\r\n\r\n if (scrollY >= scrollToHideValue && scrollY > lastScroll && scrollingNavClassname !== 'scrolling-down') {\r\n // scrolling down\r\n setScrollingNavClassname('scrolling-down');\r\n } else if (scrollY < lastScroll && scrollingNavClassname === 'scrolling-down') {\r\n // scrolling up\r\n setScrollingNavClassname('scrolling-up');\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n handleScroll();\r\n }, [scrollY]);\r\n\r\n // When change path, reset scrolling state\r\n useEffect(() => {\r\n setScrollingNavClassname('');\r\n }, [pathname]);\r\n\r\n const handleScrollToHideValue = () => {\r\n if (window.innerWidth >= 1200) {\r\n setScrollToHideValue(170);\r\n } else if (window.innerWidth >= 768 && window.innerWidth <= 1200) {\r\n setScrollToHideValue(200);\r\n } else {\r\n setScrollToHideValue(108);\r\n }\r\n };\r\n\r\n // Handle addresses, products and workshops listing\r\n const getAddresses = useCallback(\r\n debounce((value: string) => {\r\n // ToDo: need check for adjustment after they provided API\r\n const params: any = { address: value };\r\n\r\n if (workshopTypes.length > 0 && activeWorkshopType) {\r\n params['workshop_type_id'] = activeWorkshopType;\r\n }\r\n\r\n APIV2Service.get(API.workshop.getWorkshops, params, reqHeaders)\r\n .then((res) => {\r\n setAddressCurrentPage(res.data.data.meta.current_page);\r\n setAddressLastPage(res.data.data.meta.last_page);\r\n setAddresses(res.data.data.data);\r\n })\r\n .catch((error) => {\r\n console.log(error);\r\n })\r\n .finally(() => {\r\n setAddressLoading(false);\r\n });\r\n }, 1000),\r\n [activeWorkshopType],\r\n );\r\n\r\n const getProducts = useCallback(\r\n debounce((value: any) => {\r\n APIService.get(API.general.getProducts, { name: value })\r\n .then((res) => {\r\n setProductCurrentPage(res.data.data.meta.current_page);\r\n setProductLastPage(res.data.data.meta.last_page);\r\n setProducts(res.data.data.data);\r\n })\r\n .catch((error) => {\r\n console.log(error);\r\n })\r\n .finally(() => {\r\n setProductLoading(false);\r\n });\r\n }, 1000),\r\n [],\r\n );\r\n\r\n const getWorkshops = useCallback(\r\n debounce((value: string) => {\r\n const params: any = { name: value };\r\n\r\n if (workshopTypes.length > 0 && activeWorkshopType) {\r\n params['workshop_type_id'] = activeWorkshopType;\r\n }\r\n\r\n APIV2Service.get(API.workshop.getWorkshops, params, reqHeaders)\r\n .then((res) => {\r\n setWorkshopCurrentPage(res.data.data.meta.current_page);\r\n setWorkshopLastPage(res.data.data.meta.last_page);\r\n setWorkshops(res.data.data.data);\r\n })\r\n .catch((error) => {\r\n console.log(error);\r\n })\r\n .finally(() => {\r\n setWorkshopLoading(false);\r\n });\r\n }, 1000),\r\n [activeWorkshopType],\r\n );\r\n\r\n // Handle for get workshops call when switching types\r\n const handleSwitch = () => {\r\n if (selected === 1 && addressElemRef && addressElemRef.current) {\r\n getAddresses(addressElemRef.current.value);\r\n }\r\n\r\n if (selected === 3 && workshopElemRef && workshopElemRef.current) {\r\n getWorkshops(workshopElemRef.current.value);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n handleSwitch();\r\n }, [activeWorkshopType]);\r\n\r\n // On first load, check if geolocation enabled to get workshops data\r\n useEffect(() => {\r\n const cachedLocation = sessionStorage.getItem('location');\r\n if (cachedLocation) {\r\n setReqHeaders(JSON.parse(cachedLocation));\r\n return;\r\n }\r\n\r\n if (isGeolocationEnabled && coords && !cachedLocation) {\r\n const fetchLocation = async () => {\r\n const location = await getLocationByCoords(coords.latitude, coords.longitude);\r\n\r\n const headers: any = {};\r\n if (location) {\r\n headers['country'] = location.country;\r\n headers['state'] = location.state;\r\n headers['province'] = location.city;\r\n }\r\n\r\n setReqHeaders(headers);\r\n };\r\n\r\n fetchLocation();\r\n }\r\n }, [isGeolocationEnabled, coords]);\r\n\r\n useEffect(() => {\r\n if (window.location.pathname === '/offline') {\r\n return\r\n }\r\n APIService.get(API.general.getWorkshopTypes)\r\n .then((res) => {\r\n setWorkshopTypes(res.data.data.data);\r\n\r\n const firstId = res.data.data.data[0].id;\r\n const defaultItem = res.data.data.data.find(({ is_default }: any) => is_default == true);\r\n\r\n if (defaultItem) {\r\n setActiveWorkshopType(defaultItem.id);\r\n } else {\r\n setActiveWorkshopType(firstId);\r\n }\r\n })\r\n .catch((error) => {\r\n console.log(error);\r\n })\r\n .finally(() => {\r\n setIsLoading(false);\r\n });\r\n }, []);\r\n\r\n const handleHeight = () => {\r\n if (window.innerWidth >= 1200) {\r\n setOriHeight('120px');\r\n setNewHeight('140px');\r\n } else if (window.innerWidth >= 768 && window.innerWidth <= 1200) {\r\n setOriHeight('150px');\r\n setNewHeight('200px');\r\n } else {\r\n setOriHeight('108px');\r\n setNewHeight('108px');\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n handleHeight();\r\n window.addEventListener('resize', handleHeight);\r\n handleScrollToHideValue();\r\n window.addEventListener('resize', handleScrollToHideValue);\r\n\r\n return () => {\r\n window.removeEventListener('resize', handleHeight);\r\n window.removeEventListener('resize', handleScrollToHideValue);\r\n };\r\n }, []);\r\n\r\n const handleOutsideClick = (e: any) => {\r\n if (clickRef && clickRef.current) {\r\n if (!clickRef.current.contains(e.target)) {\r\n try {\r\n closeSearch();\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n }\r\n }\r\n };\r\n\r\n const openSearch = () => {\r\n document.addEventListener('click', handleOutsideClick, true);\r\n setShowSearch(true);\r\n };\r\n\r\n const closeSearch = () => {\r\n document.removeEventListener('click', handleOutsideClick, true);\r\n setShowSearch(false);\r\n deselect();\r\n };\r\n\r\n const deselect = () => {\r\n setSelected(0);\r\n };\r\n\r\n const handleChange = (type: string, event: any) => {\r\n if (type == 'address') {\r\n const { value } = event.target;\r\n setAddressInput(value);\r\n\r\n if (value.length >= 2) {\r\n getAddresses(value);\r\n setAddressLoading(true);\r\n } else {\r\n setAddresses([]);\r\n setAddressLoading(false);\r\n }\r\n }\r\n\r\n if (type == 'product') {\r\n const { value } = event.target;\r\n setProductSearchInput(value);\r\n\r\n if (value.length >= 2) {\r\n getProducts(value);\r\n setProductLoading(true);\r\n } else {\r\n setProducts([]);\r\n setProductLoading(false);\r\n }\r\n }\r\n\r\n if (type == 'workshop') {\r\n const { value } = event.target;\r\n setWorkshopInput(value);\r\n\r\n if (value.length >= 2) {\r\n getWorkshops(value);\r\n setWorkshopLoading(true);\r\n } else {\r\n setWorkshops([]);\r\n setWorkshopLoading(false);\r\n }\r\n }\r\n };\r\n\r\n const handleAddressScroll = (event: any) => {\r\n const currentAddresses = [...addresses];\r\n const urlParam: any = {};\r\n const { scrollHeight, scrollTop, clientHeight } = event.target;\r\n const scroll = (scrollTop / (scrollHeight - clientHeight)) * 100;\r\n\r\n if (addressCurrentPage === addressLastPage) {\r\n return;\r\n }\r\n\r\n if (scroll >= 97 && !loadingAddresses) {\r\n setLoadingAddresses(true);\r\n\r\n if (addressInput) {\r\n urlParam['address'] = addressInput;\r\n }\r\n\r\n urlParam['page'] = addressCurrentPage + 1;\r\n\r\n APIV2Service.get(API.workshop.getWorkshops, urlParam)\r\n .then((res) => {\r\n res.data.data.data.map((item: any) => {\r\n currentAddresses.push(item);\r\n });\r\n\r\n setAddressCurrentPage(res.data.data.meta.current_page);\r\n setAddresses(currentAddresses);\r\n\r\n if (addressRef && addressRef.current) {\r\n event.target.scrollTop = scrollTop;\r\n }\r\n })\r\n .catch((error) => {\r\n console.log(error);\r\n })\r\n .finally(() => {\r\n setTimeout(() => {\r\n setLoadingAddresses(false);\r\n }, 1000);\r\n });\r\n }\r\n };\r\n\r\n const handleWorkshopScroll = (event: any) => {\r\n const currentWorkshops = [...workshops];\r\n const urlParam: any = {};\r\n const { scrollHeight, scrollTop, clientHeight } = event.target;\r\n const scroll = (scrollTop / (scrollHeight - clientHeight)) * 100;\r\n\r\n if (workshopCurrentPage === workshopLastPage) {\r\n return;\r\n }\r\n\r\n if (scroll >= 97 && !loadingWorkshops) {\r\n setLoadingWorkshops(true);\r\n\r\n if (workshopInput) {\r\n urlParam['name'] = workshopInput;\r\n }\r\n\r\n urlParam['page'] = workshopCurrentPage + 1;\r\n\r\n APIService.get(API.workshop.getWorkshops, urlParam)\r\n .then((res) => {\r\n res.data.data.data.map((item: any) => {\r\n currentWorkshops.push(item);\r\n });\r\n\r\n setWorkshopCurrentPage(res.data.data.meta.current_page);\r\n setWorkshops(currentWorkshops);\r\n\r\n if (workshopRef && workshopRef.current) {\r\n event.target.scrollTop = scrollTop;\r\n }\r\n })\r\n .catch((error) => {\r\n console.log(error);\r\n })\r\n .finally(() => {\r\n setTimeout(() => {\r\n setLoadingWorkshops(false);\r\n }, 1000);\r\n });\r\n }\r\n };\r\n\r\n const handleProductScroll = (event: any) => {\r\n const currentProducts = [...products];\r\n const urlParam: any = {};\r\n const { scrollHeight, scrollTop, clientHeight } = event.target;\r\n const scroll = (scrollTop / (scrollHeight - clientHeight)) * 100;\r\n\r\n if (productCurrentPage === productLastPage) {\r\n return;\r\n }\r\n\r\n if (scroll >= 97 && !loadingProducts) {\r\n setLoadingProducts(true);\r\n\r\n if (productSearchInput) {\r\n urlParam['name'] = productSearchInput;\r\n }\r\n\r\n urlParam['page'] = productCurrentPage + 1;\r\n\r\n APIService.get(API.general.getProducts, urlParam)\r\n .then((res) => {\r\n res.data.data.data.map((item: any) => {\r\n currentProducts.push(item);\r\n });\r\n\r\n setProductCurrentPage(res.data.data.meta.current_page);\r\n setProducts(currentProducts);\r\n\r\n if (productRef && productRef.current) {\r\n event.target.scrollTop = scrollTop;\r\n }\r\n })\r\n .catch((error) => {\r\n console.log(error);\r\n })\r\n .finally(() => {\r\n setTimeout(() => {\r\n setLoadingProducts(false);\r\n }, 1000);\r\n });\r\n }\r\n };\r\n\r\n const clearInput = (type: string) => {\r\n if (type == 'address') {\r\n setAddressInput('');\r\n setAddresses([]);\r\n }\r\n\r\n if (type == 'product') {\r\n setProductSearchInput('');\r\n setProducts([]);\r\n }\r\n\r\n if (type == 'workshop') {\r\n setWorkshopInput('');\r\n setWorkshops([]);\r\n }\r\n };\r\n\r\n const Address = ({ name_id, name, address }: WorkshopType): JSX.Element => {\r\n return (\r\n
\r\n
\r\n {\r\n setAddressInput(address), deselect();\r\n }}\r\n >\r\n \"location-image\"\r\n
\r\n
\r\n
closeSearch()}>\r\n \r\n
{name}
\r\n
{address}
\r\n \r\n
\r\n
\r\n );\r\n };\r\n\r\n const Product = ({ image, name, descriptions }: ProductType): JSX.Element => {\r\n const [imageSrc, setImageSrc] = useState(image ? image : ProductPlaceholder);\r\n\r\n return (\r\n {\r\n setProductSearchInput(name), deselect();\r\n }}\r\n >\r\n
\r\n
\r\n \"product-image\" setImageSrc(ProductPlaceholder)} />\r\n
\r\n
\r\n
\r\n
\r\n
{name}
\r\n
\r\n
{descriptions}
\r\n
\r\n
\r\n
\r\n \r\n );\r\n };\r\n\r\n const Workshop = ({ name_id, name, address }: WorkshopType): JSX.Element => {\r\n return (\r\n
\r\n
\r\n {\r\n setWorkshopInput(name), deselect();\r\n }}\r\n >\r\n \"location-image\"\r\n
\r\n
\r\n
closeSearch()}>\r\n \r\n
{name}
\r\n
{address}
\r\n \r\n
\r\n \r\n );\r\n };\r\n\r\n const handleSearch = () => {\r\n const params = new URLSearchParams();\r\n\r\n if (workshopTypes.length > 0 && activeWorkshopType) {\r\n params.append('type', activeWorkshopType.toString());\r\n }\r\n\r\n if (addressInput) {\r\n params.append('address', addressInput);\r\n }\r\n\r\n if (productSearchInput) {\r\n params.append('product_name', productSearchInput);\r\n }\r\n\r\n if (workshopInput) {\r\n params.append('name', workshopInput);\r\n }\r\n\r\n if (pathname != '/workshop') {\r\n if (params.toString()) {\r\n history.push('/?' + params.toString());\r\n } else {\r\n history.push('/');\r\n }\r\n } else {\r\n history.replace('/workshop?' + params.toString());\r\n }\r\n\r\n closeSearch();\r\n };\r\n\r\n return (\r\n <>\r\n \r\n
\r\n
\r\n window.scrollTo({ top: 0, left: 0, behavior: 'smooth' })}>\r\n \r\n \r\n
\r\n
\r\n openSearch()}\r\n >\r\n \"search-image\"\r\n \r\n {window.innerWidth <= 768\r\n ? 'Search your Service Partner'\r\n : 'Search for your Service Partner'}\r\n \r\n \r\n
\r\n
\r\n {isLoading ? (\r\n
\r\n \r\n \r\n \r\n
\r\n ) : (\r\n workshopTypes.length > 0 &&\r\n workshopTypes.map(({ id, name }, index) => {\r\n return (\r\n setActiveWorkshopType(id)}\r\n >\r\n {name}\r\n
\r\n );\r\n })\r\n )}\r\n
\r\n \r\n
\r\n window.scrollTo({ top: 0, left: 0, behavior: 'smooth' })}\r\n >\r\n
\r\n \r\n {pathname == '/workshop' ? 'Home' : window.innerWidth <= 768 ? 'Map' : 'Show Map'}\r\n \r\n
\r\n \"globe-image\"\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n setSelected(1)}\r\n >\r\n
Address
\r\n handleChange('address', e)}\r\n >\r\n clearInput('address')}\r\n >\r\n \"close-image\"\r\n
\r\n
\r\n
\r\n setSelected(2)}\r\n >\r\n
Product
\r\n handleChange('product', e)}\r\n >\r\n clearInput('product')}\r\n >\r\n \"close-image\"\r\n
\r\n \r\n
\r\n setSelected(3)}\r\n >\r\n
Workshop
\r\n handleChange('workshop', e)}\r\n >\r\n clearInput('workshop')}\r\n >\r\n \"close-image\"\r\n \r\n \r\n \r\n \r\n \"search-image\"\r\n
\r\n Search\r\n
\r\n \r\n {(addressInput.length >= 2 || addressLoading) && (\r\n
\r\n {addressLoading ? (\r\n
\r\n \r\n
\r\n ) : (\r\n
handleAddressScroll(e)}>\r\n {addresses.length > 0 ? (\r\n addresses.map(({ name_id, id, name, address }, index) => {\r\n return (\r\n \r\n );\r\n })\r\n ) : (\r\n
No workshop found
\r\n )}\r\n\r\n \r\n \r\n
\r\n
\r\n )}\r\n \r\n )}\r\n {(productSearchInput.length >= 2 || productLoading) && (\r\n
\r\n {productLoading ? (\r\n
\r\n \r\n
\r\n ) : (\r\n
handleProductScroll(e)}>\r\n {products.length > 0 ? (\r\n products.map(({ id, name, image_url, category_name }, index) => {\r\n return (\r\n \r\n );\r\n })\r\n ) : (\r\n
No product found
\r\n )}\r\n\r\n \r\n \r\n
\r\n
\r\n )}\r\n \r\n )}\r\n {(workshopInput.length >= 2 || workshopLoading) && (\r\n
\r\n {workshopLoading ? (\r\n
\r\n \r\n
\r\n ) : (\r\n
handleWorkshopScroll(e)}>\r\n {workshops.length > 0 ? (\r\n workshops.map(({ name_id, id, name, address }, index) => {\r\n return (\r\n \r\n );\r\n })\r\n ) : (\r\n
No workshop found
\r\n )}\r\n\r\n \r\n \r\n
\r\n
\r\n )}\r\n \r\n )}\r\n \r\n \r\n\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n {isLoading ? (\r\n
\r\n \r\n \r\n \r\n
\r\n ) : (\r\n workshopTypes.length > 0 &&\r\n workshopTypes.map(({ id, name }, index) => {\r\n return (\r\n setActiveWorkshopType(id)}\r\n >\r\n {name}\r\n
\r\n );\r\n })\r\n )}\r\n
\r\n
\r\n window.scrollTo({ top: 0, left: 0, behavior: 'smooth' })}\r\n >\r\n setShowMap(pathname == '/workshop' ? false : true)}\r\n >\r\n \r\n {pathname == '/workshop'\r\n ? 'Home'\r\n : window.innerWidth <= 768\r\n ? 'Map'\r\n : 'Show Map'}\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
closeSearch()}>\r\n \r\n
\r\n
\r\n
Address
\r\n
\r\n setSelected(1)}\r\n value={addressInput}\r\n onChange={(e) => handleChange('address', e)}\r\n >\r\n {\r\n deselect(), clearInput('address');\r\n }}\r\n >\r\n \"close-image\"\r\n
\r\n
\r\n {(addressInput.length >= 2 || addressLoading) && (\r\n handleAddressScroll(e)}\r\n ref={addressRef}\r\n >\r\n {addressLoading ? (\r\n
\r\n \r\n
\r\n ) : addresses.length > 0 ? (\r\n addresses.map(({ name_id, id, name, address }, index) => {\r\n return (\r\n \r\n );\r\n })\r\n ) : (\r\n
\r\n
No workshop found
\r\n
\r\n )}\r\n\r\n \r\n \r\n
\r\n \r\n )}\r\n \r\n \r\n
\r\n
Product
\r\n
\r\n setSelected(2)}\r\n value={productSearchInput}\r\n onChange={(e) => handleChange('product', e)}\r\n >\r\n {\r\n deselect(), clearInput('product');\r\n }}\r\n >\r\n \"close-image\"\r\n
\r\n
\r\n {(productSearchInput.length >= 2 || productLoading) && (\r\n handleProductScroll(e)}\r\n ref={productRef}\r\n >\r\n {productLoading ? (\r\n
\r\n \r\n
\r\n ) : products.length > 0 ? (\r\n products.map(({ id, name, image_url, category_name }, index) => {\r\n return (\r\n \r\n );\r\n })\r\n ) : (\r\n
\r\n
No product found
\r\n
\r\n )}\r\n
\r\n \r\n
\r\n \r\n )}\r\n \r\n
\r\n
Workshop
\r\n
\r\n setSelected(3)}\r\n value={workshopInput}\r\n onChange={(e) => handleChange('workshop', e)}\r\n >\r\n {\r\n deselect(), clearInput('workshop');\r\n }}\r\n >\r\n \"close-image\"\r\n
\r\n
\r\n {(workshopInput.length >= 2 || workshopLoading) && (\r\n handleWorkshopScroll(e)}\r\n ref={workshopRef}\r\n >\r\n {workshopLoading ? (\r\n
\r\n \r\n
\r\n ) : workshops.length > 0 ? (\r\n workshops.map(({ name_id, id, name, address }, index) => {\r\n return (\r\n \r\n );\r\n })\r\n ) : (\r\n
\r\n
No workshop found
\r\n
\r\n )}\r\n\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \"search-image\"\r\n
Search
\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default NavBar;\r\n","import Styled from 'styled-components';\r\n\r\nconst FooterContainer = Styled.footer`\r\n position: absolute;\r\n bottom: 0;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n width: fit-content;\r\n height: 55px;\r\n background: transparent;\r\n\r\n .copyright{\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 300;\r\n font-size: 12px;\r\n line-height: 15px;\r\n color: #696969;\r\n }\r\n\r\n @media only screen and (min-width: 768px) {\r\n height: 75px;\r\n\r\n .copyright{\r\n font-size: 16px;\r\n line-height: 20px;\r\n }\r\n\r\n }\r\n`;\r\n\r\nexport { FooterContainer };\r\n","import React from 'react';\r\nimport { FooterContainer } from './style';\r\n\r\nconst Footer = (): JSX.Element => {\r\n const year = new Date().getFullYear();\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default Footer;\r\n","import Styled from 'styled-components';\r\n\r\nconst PwaModalWrapper = Styled.div`\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100vw;\r\n height: 100%;\r\n background-color: rgba(0, 0, 0, 0.5);\r\n display: flex;\r\n justify-content: center;\r\n z-index: 9000;\r\n \r\n .modal-section {\r\n position: absolute;\r\n max-width: 95%;\r\n bottom: 5%;\r\n width: fit-content;\r\n height: fit-content;\r\n background: #FFFFFF;\r\n box-shadow: 0px 20px 30px rgba(0, 0, 0, 0.25);\r\n border-radius: 25.5577px;\r\n z-index: 9001;\r\n padding: 15px 20px 15px 12px;\r\n display: flex;\r\n flex-direction: column;\r\n\r\n .title-section {\r\n margin-bottom: 10px;\r\n\r\n .image-container {\r\n width: 50px;\r\n height: 50px;\r\n margin-right: 5px;\r\n\r\n img {\r\n width: 100%;\r\n }\r\n }\r\n\r\n .title-text {\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 700;\r\n font-size: 16px;\r\n line-height: 20px;\r\n color: #000000;\r\n margin-bottom: 5px;\r\n }\r\n\r\n .description-text {\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 400;\r\n font-size: 9px;\r\n line-height: 11px;\r\n color: #000000;\r\n }\r\n }\r\n\r\n .button-section{\r\n display: flex;\r\n align-self: center;\r\n padding-left: 30px;\r\n\r\n .agree-button {\r\n text-transform: uppercase;\r\n background: #E40613;\r\n border: none;\r\n border-radius: 20px;\r\n padding: 5px 15px;\r\n cursor: pointer;\r\n\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 700;\r\n font-size: 14px;\r\n line-height: 17px;\r\n text-align: center;\r\n color: #FFFFFF;\r\n }\r\n\r\n .cancel-button {\r\n background: none;\r\n border: none;\r\n padding: 5px 25px 5px 45px;\r\n cursor: auto;\r\n display: flex;\r\n align-items: center;\r\n \r\n span {\r\n font-family: 'Montserrat';\r\n font-style: normal;\r\n font-weight: 700;\r\n font-size: 14px;\r\n line-height: 17px;\r\n text-align: center;\r\n color: #343434;\r\n \r\n border-bottom: 1px solid #343434;\r\n cursor: pointer;\r\n }\r\n }\r\n }\r\n }\r\n\r\n @media only screen and (min-width: 768px) {\r\n .modal-section {\r\n padding: 18px 70px 23px 20px;\r\n \r\n .title-section {\r\n margin-bottom: 30px;\r\n\r\n .image-container {\r\n width: 100px;\r\n height: 100px;\r\n margin-right: 10px;\r\n }\r\n\r\n .title-text {\r\n font-size: 30px;\r\n line-height: 37px;\r\n margin-bottom: 10px;\r\n }\r\n\r\n .description-text {\r\n font-size: 18px;\r\n line-height: 22px;\r\n }\r\n }\r\n\r\n .button-section{\r\n padding-left: 0px;\r\n\r\n .agree-button {\r\n padding: 10px 35px;\r\n cursor: pointer;\r\n \r\n font-size: 24px;\r\n line-height: 29px;\r\n margin-right: 30px;\r\n }\r\n\r\n .cancel-button {\r\n padding: 5px 25px 5px 70px;\r\n \r\n span {\r\n font-size: 24px;\r\n line-height: 29px;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n`\r\n\r\nexport { PwaModalWrapper };","import { useState, useEffect } from 'react';\r\n\r\ninterface BeforeInstallPromptEvent extends Event {\r\n readonly platforms: string[];\r\n readonly userChoice: Promise<{\r\n outcome: 'accepted' | 'dismissed';\r\n platform: string;\r\n }>;\r\n prompt(): Promise;\r\n}\r\n\r\nfunction useAddToHomescreenPrompt(): [BeforeInstallPromptEvent | null, () => void] {\r\n const [prompt, setState] = useState(null);\r\n\r\n const promptToInstall = () => {\r\n if (prompt) {\r\n return prompt.prompt();\r\n }\r\n\r\n return Promise.reject(new Error('Tried installing before browser sent \"beforeinstallprompt\" event'));\r\n };\r\n\r\n useEffect(() => {\r\n const ready = (e: BeforeInstallPromptEvent) => {\r\n e.preventDefault();\r\n setState(e);\r\n };\r\n\r\n window.addEventListener('beforeinstallprompt', ready as any);\r\n\r\n return () => {\r\n window.removeEventListener('beforeinstallprompt', ready as any);\r\n };\r\n }, []);\r\n\r\n return [prompt, promptToInstall];\r\n}\r\n\r\nexport default useAddToHomescreenPrompt;\r\n","import { useState } from 'react';\r\nimport moment from 'moment';\r\n\r\nconst getInstallPromptLastSeenAt = (promptName: string): string => localStorage.getItem(promptName) ?? '';\r\n\r\nconst setInstallPromptSeenToday = (promptName: string): void => {\r\n const today = moment().toISOString();\r\n localStorage.setItem(promptName, today);\r\n};\r\n\r\nfunction getUserShouldBePromptedToInstall(promptName: string, daysToWaitBeforePromptingAgain: number): boolean {\r\n const lastPrompt = moment(getInstallPromptLastSeenAt(promptName));\r\n const daysSinceLastPrompt = moment().diff(lastPrompt, 'days');\r\n return isNaN(daysSinceLastPrompt) || daysSinceLastPrompt > daysToWaitBeforePromptingAgain;\r\n}\r\n\r\nconst useShouldShowPrompt = (promptName: string, daysToWaitBeforePromptingAgain = 1): [boolean, () => void] => {\r\n const [userShouldBePromptedToInstall, setUserShouldBePromptedToInstall] = useState(\r\n getUserShouldBePromptedToInstall(promptName, daysToWaitBeforePromptingAgain)\r\n );\r\n\r\n const handleUserSeenInstallPrompt = () => {\r\n setUserShouldBePromptedToInstall(false);\r\n setInstallPromptSeenToday(promptName);\r\n };\r\n\r\n return [userShouldBePromptedToInstall, handleUserSeenInstallPrompt];\r\n};\r\nexport default useShouldShowPrompt;","export default __webpack_public_path__ + \"static/media/liquimoly_logo_black.3640ce03.png\";","import React, { useState, useEffect } from 'react';\r\nimport { PwaModalWrapper } from './style';\r\nimport useAddToHomescreenPrompt from 'hooks/useAddToHomeScreenPrompt';\r\nimport useShouldShowPrompt from 'hooks/useShouldShowPrompt';\r\n\r\n// Assets\r\nimport LiquimolyLogo from 'assets/img/liquimoly_logo_black.png';\r\n\r\nconst PwaModal = (): JSX.Element => {\r\n const [webPrompt, promptToInstall] = useAddToHomescreenPrompt();\r\n const [isVisible, setVisibleState] = useState(false);\r\n const [isCompatible, setIsCompatible] = useState(false);\r\n const [userShouldBePromptedToInstall, handleUserSeenInstallPrompt] = useShouldShowPrompt('webInstallPromptedAt');\r\n\r\n const hide = () => {\r\n setVisibleState(false);\r\n handleUserSeenInstallPrompt();\r\n };\r\n\r\n const handleAgreeInstall = () => {\r\n promptToInstall();\r\n hide();\r\n };\r\n\r\n useEffect(() => {\r\n const isStandalone = window.matchMedia('(display-mode: standalone)').matches;\r\n if (isStandalone) {\r\n return;\r\n }\r\n\r\n // If pwa not installed, check if browser is compatible\r\n if (webPrompt) {\r\n setIsCompatible(true);\r\n } else {\r\n setIsCompatible(false);\r\n }\r\n\r\n if (userShouldBePromptedToInstall) {\r\n setVisibleState(true);\r\n } else {\r\n setVisibleState(false);\r\n }\r\n }, [webPrompt]);\r\n\r\n if (!isVisible) {\r\n return <>;\r\n }\r\n\r\n return (\r\n \r\n {!isCompatible && isVisible ? (\r\n
\r\n
\r\n
\r\n \"logo-image\"\r\n
\r\n
\r\n
LIQUI MOLY Service Partner
\r\n
\r\n You may add this app to HomeScreen through browser setting menu\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n ) : (\r\n
\r\n
\r\n
\r\n \"logo-image\"\r\n
\r\n
\r\n
LIQUI MOLY Service Partner
\r\n
\r\n Install this website as a web app on your Apps screen?\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default PwaModal;\r\n","import React, { ReactNode } from 'react';\r\nimport { PageWrapper, ContentBodyWrapper } from 'styles/style';\r\nimport NavBar from 'containers/NavBar';\r\nimport Footer from 'components/Footer';\r\nimport PwaModel from 'components/PwaModal';\r\n\r\ninterface IProps {\r\n children: ReactNode;\r\n}\r\n\r\nconst PageLayout = ({ children }: IProps): JSX.Element => {\r\n return (\r\n \r\n \r\n \r\n {children}\r\n