{"version":3,"sources":["pages/common/Constants.ts","pages/common/HelperFunctions.ts","pages/common/SEO/SEOcontentBFE.tsx","pages/common/SEO/SEOcontentJOBSITE.tsx","pages/common/SEO/SEOcontentTCAT.tsx","pages/common/SEO/SeoFunctions.ts","pages/common/Components/ContactForm_TCAT_hubspot.tsx","pages/common/Components/FormSpree_Battlefield.js","pages/common/Components/FormSpreeFR_Battlefield.js","pages/common/Components/ContactForm_Battlefield.tsx","pages/common/Components/FormSpree_BattlefieldRentalFleet.js","pages/common/Components/FormSpreeFR_BattlefieldRentalFleet.js","pages/common/Components/ContactForm_BattlefieldRentalFleet.tsx","pages/common/Components/FormSpree_Jobsite.js","pages/common/Components/FormSpreeFR_Jobsite.js","pages/common/Components/ContactForm_Jobsite.tsx","pages/common/Sections/CTASection.tsx","js_vanilla/used-favouriteAddon.js","images/categoryimagesbfe/home-attachments.jpg","images/categoryimagesbfe/home-backhoe-loaders.jpg","images/categoryimagesbfe/home-compact-track-loader.jpg","images/categoryimagesbfe/home-compactors.jpg","images/categoryimagesbfe/home-excavators.jpg","images/categoryimagesbfe/home-industrial-loaders.jpg","images/categoryimagesbfe/home-skid-steer-loaders.jpg","images/categoryimagesbfe/home-telehandlers.jpg","images/categoryimagesbfe/home-vtr.jpg","images/categoryimagesbfe/home-wheel-loaders.jpg","images/categoryimagesbferental/air-compressors.jpg","images/categoryimagesbferental/backhoe-loaders.jpg","images/categoryimagesbferental/compact-track-loaders.jpg","images/categoryimagesbferental/compaction-equipment.jpg","images/categoryimagesbferental/concrete-buggy.jpg","images/categoryimagesbferental/excavators.jpg","images/categoryimagesbferental/generators.jpg","images/categoryimagesbferental/lawn-garden-equipment.jpg","images/categoryimagesbferental/light-towers.jpg","images/categoryimagesbferental/material-handling.jpg","images/categoryimagesbferental/message-arrow-boards.jpg","images/categoryimagesbferental/misc-fr.jpg","images/categoryimagesbferental/misc.jpg","images/categoryimagesbferental/pumps.jpg","images/categoryimagesbferental/scissor-lifts-booms.jpg","images/categoryimagesbferental/skid-steer-loaders.jpg","images/categoryimagesbferental/trench-shoring.jpg","images/categoryimagesbferental/welders.jpg","images/categoryimagesjobsite/air-tools.jpg","images/categoryimagesjobsite/confined-space.jpg","images/categoryimagesjobsite/electric-tools.jpg","images/categoryimagesjobsite/hoisting-rigging.jpg","images/categoryimagesjobsite/jacks.jpg","images/categoryimagesjobsite/material-handling-machinery-moving.jpg","images/categoryimagesjobsite/misc.jpg","images/categoryimagesjobsite/pipe-bending.jpg","images/categoryimagesjobsite/pipe-fabrication.jpg","images/categoryimagesjobsite/storage-boxes.jpg","images/categoryimagesjobsite/torqueing-bolting.jpg","images/categoryimagesjobsite/welding-power-distribution.jpg","images/categoryimagesjobsite/wire-cable-handling.jpg","js_vanilla/wdyr.js","images sync /^/.*$","images/1-warranty.png","images/2-certification.png","images/3-inventory.png","images/4-parts.png","images/Demande_Soumission.png","images/Financing-offer-used-english.png","images/Financing-offer-used-french.png","images/Thumbs.db","images/Undercarriage_2014_1012_edit.jpg","images/abstractbg.jpg","images/bfe-logo-fr.png","images/bfe-logo.png","images/bg-contactform.jpg","images/categoryimagestcat/Used Cat Articulated Trucks - Toromont Cat.jpg","images/categoryimagestcat/Used Cat Backhoe Loaders - Toromont Cat.jpg","images/categoryimagestcat/Used Cat Compactors - Toromont Cat.jpg","images/categoryimagestcat/Used Cat Dozers - Toromont Cat.jpg","images/categoryimagestcat/Used Cat Excavators - Toromont Cat.jpg","images/categoryimagestcat/Used Cat Forestry Machines - Toromont Cat.jpg","images/categoryimagestcat/Used Cat Mining Equipment - Toromont Cat.jpg","images/categoryimagestcat/Used Cat Motor Graders - Toromont Cat.jpg","images/categoryimagestcat/Used Cat Off-Highway Trucks - Toromont Cat.jpg","images/categoryimagestcat/Used Cat Paving Products - Toromont Cat.jpg","images/categoryimagestcat/Used Cat Telehandlers - Toromont Cat.jpg","images/categoryimagestcat/Used Cat Track Type Loaders - Toromont Cat.jpg","images/categoryimagestcat/Used Cat Wheel Loaders - Toromont Cat.jpg","images/ccu1.jpg","images/ccu2.jpg","images/ccu3.jpg","images/consignmentimg.jpg","images/cta-machines-pic.png","images/dealspage/Banner_used_EN.jpg","images/dealspage/Banner_used_FR.jpg","images/debug.log","images/excavatorbg-bw - Copy.jpg","images/excavatorbg-bw.jpg","images/excavatorbg2 - Copy.jpg","images/excavatorbg2.jpg","images/financing-dozer.jpg","images/financing_dozer.jpg","images/flag_ca.png","images/flag_us.png","images/image-coming-soon-bferental.jpg","images/image-coming-soon.jpg","images/ironclad-pre-owned-fr.png","images/ironclad-pre-owned.png","images/ironclad.png","images/jobsite-logo.png","images/loading-gears - Copy.gif","images/loading-gears.gif","images/logo.gif","images/no_image.jpg","images/no_image2.jpg","images/unbeatablevalue.png","images/unbeatablevalue500-old.png","images/unbeatablevalue500.png","images/unbeatablevalue600.png","images/used-print-header - Copy.jpg","images/used-print-header.jpg","images/usedbackground.jpg","images/usedmachineryformimage - Copy.jpg","images/usedmachineryformimage.jpf","images/usedmachineryformimage.jpg","pages/common/Components/NavPhoneNum_Tcat.tsx","pages/common/Navigation/Components/LanguageSwitcher.tsx","pages/common/Navigation/PreNavigation.tsx","pages/common/Navigation/Components/NavDropdown.tsx","pages/common/Navigation/Components/NavItems_TCAT.tsx","pages/common/Navigation/Components/NavItems_BFE.tsx","pages/common/Navigation/Components/FavouritesLinkMobile.tsx","pages/common/Navigation/Components/FavouritesNavPopup.tsx","pages/common/Navigation/NavigationHeader.tsx","pages/common/Components/Header.tsx","pages/common/Components/ScrollTopButton.tsx","pages/common/Components/Footer_Battlefield.tsx","pages/common/Components/Footer_Jobsite.tsx","pages/common/Components/FooterSubscribeForm_Tcat_hubspot.tsx","pages/common/Components/Footer_TCAT.tsx","pages/listings/sections/CtaSectionHeader.tsx","pages/listings/sections/SeoTextHeader.tsx","pages/listings/functions/listingFunctions.ts","pages/listings/sections/ListingHeader.tsx","pages/listings/functions/getAllProductsFromCategory.ts","pages/listings/functions/getFilteredSearchResults.ts","pages/listings/sections/SeoTextBottom.tsx","pages/listings/components/SelectSortOrder.tsx","pages/listings/components/InputKeywordSearch.tsx","pages/listings/sections/FiltersTop.tsx","pages/listings/components/SelectCategory.tsx","pages/listings/components/CheckboxCertified.tsx","pages/listings/components/SelectManufacturer.tsx","pages/listings/components/InputYearMinMax.tsx","pages/listings/components/InputHoursMax.tsx","pages/listings/components/InputPriceMax.tsx","pages/listings/components/SelectProvinceAndCity.tsx","pages/listings/components/SelectClass.tsx","pages/listings/sections/FiltersSide.tsx","pages/listings/ListingsPage.tsx","pages/other/CCUPage.tsx","pages/other/ConsignmentPage.tsx","pages/other/EmailConfirm.tsx","pages/home/components/AdvancedFilters.tsx","pages/home/components/MainSearch.tsx","pages/home/components/IntroText.tsx","pages/home/components/FoundCountText.tsx","pages/home/sections/IntroSection.tsx","pages/home/sections/CategorySection.tsx","pages/home/sections/SeoTextSectionToromontCat.tsx","pages/home/sections/SeoTextSectionBattlefield.tsx","pages/home/sections/SeoTextSectionJobsite.tsx","pages/home/HomePage.tsx","pages/other/UpdateSitemap.tsx","PageWrapper.tsx","App.tsx","index.js","serviceWorker.js"],"names":["ALLFAMSWORD_EN","ALLFAMSWORD_FR","URLPOWER_EN","URLPOWER_FR","URLPOWER_SLUG","URLFAVES_EN","URLFAVES_FR","URLCCU","URLCONSIGNMENT","CLASS_HEAVY","CLASS_POWER","ITEMSPERPAGE","DEPLOY_ENV","isEnvironmentBFE","checkEnvironment","isEnvironmentTCAT","isEnvironmentBFERENTAL","isEnvironmentBFE_or_BFERENTAL","isEnvironmentJOBSITE","DOMAINBASE","PageTypes","Home","Listings","Details","CCU","Consignment","EmailConfirm","UpdateSitemap","IMAGES","LOGO_TCAT","getImage","LOGO_BFE","LOGO_BFE_FR","LOGO_JOBSITE","NOIMG_DEFAULTSRC","NOIMG_DEFAULTSRC_BFERENTAL","FLAG_CA","FLAG_US","HOME_UNBEATABLEVALUE","CTA_SECTION_IMAGE","CCU1","CCU2","CCU3","ConsigmentImage","LOADING_GIF","TEXT","lang","callForPrice","SORT","YEAR_LO","YEAR_HI","HOURS_LO","HOURS_HI","MODEL_LO","MODEL_HI","PRICE_HI","PRICE_LO","PARAMS","PROVINCE","CITY","YEAR_MIN","YEAR_MAX","CLASS","MAKE","PRICE_MAX","KEYWORD","HOURS_MAX","CERTIFIED","BFE_INV","VIEW_FAVES","VIEW_DEALS","PAGE","FORM","AVAILABLE","PHONENUMBERS","HEAVY_TCAT","POWER_TCAT","BFE","BFERENTAL","JOBSITE","ELOQUAFORMS","CONTACTFORM","HEAVY","CENTRAL","QM","POWER","FOOTERSUBSCRIBE","EN","FR","HUBSPOTFORMIDS","searchFiltersEmptyDefault","categoryClass","category","sortBy","make","maxPrice","keyword","province","yearMin","yearMax","hoursMax","city","certifiedOnly","battlefieldInventory","rentalFleetAvailability","rentalFleetWithImages","viewFaves","viewDeals","outputEnFr","textEn","textFr","getJsonUrl","pageType","serial","jsonUrl","Constants","replace","urlSplit","split","SingProdURL","concat","newURL","param","imageFileName","imagefile","require","err","getPhoneNumber","currentClass","isHeavyEquipmentCategory","UsedDataGroup","classVal","toUpperCase","getCategoryClassFromValue","equipments","name","slug","isPowerCategory","sortGroupsByDisplayName","UsedData","_","o","deburr","saferString","string","deflt","join","badCityCheck","cityName","namefix","toLowerCase","length","setBodyClass","classesArray","document","body","classList","remove","add","getCategoryLinks","jsonDataGroups","categoryLinks","forEach","group","push","linkText","count","linkUrl","getListingPageUrl","groupCodeSlug","sort","a","b","formatHours","hours","seperator","accounting","formatMoney","getProductPhotoSrc","data","num","machineImage","photos","handleImageLoadError","e","target","src","getProductName","jsonDataProduct","year","manufacturer","model","getDealerName","cityGroupingValue","grpValue","hasWord","product","foundAllWords","i","foundCurWord","curWord","indexOf","state","getProvinceName","seoDescs","getSeoContentByCatCode","seoDescEn","stripHtml","renderToString","Desc","seoDescFr","CatCode","html","envToCompare","process","origName","fullName","originalName","getProvinceNameInFrench","cityDisplayName","dispName","getSearchFiltersFromUrl","urlParams","ConverterNumber","formatPrice","price","inclCurTxt","currency","receivedCurrency","formattedPrice","currencyText","Number","formatNumberText","textInputValue","ConverterString","value","undefined","toString","ConverterBoolean","parseFloat","getCookie","cname","ca","decodeURIComponent","cookie","c","charAt","substring","SEO_BFE","CatCodeSlug","Name","Meta","ExtraText","rel","href","SEO_TCAT","CtaImage","sourcetext","text","Helpers","setLang","setCategory","includeExtraParams","filters","currentPage","newUrl","getUrlParamsFromFilters","getDetailPageUrlFromSerial","serialNumber","productUrl","getNewUrlFromFilters","console","log","products","numberClean","number","newNumber","allparams","encodeURI","getAllUrlParams","params","search_string","window","location","search","parse","pairs","parts","key","slice","substr","getMetaTitle","info","includeSiteName","newMetaTitle","companyName","siteNamePrepend","getPathLanguageChanged","newLanguage","curPageType","path","newPath","catcode","SEO","SEO_JOBSITE","seoData","find","ContactFormToromontCatHubspot","getHubSpotFormId","props","updateModelValue","hiddenInput_Model","querySelector","modelName","hiddenInput_Url","this","curCategory","cssClass","portalId","formId","formInstanceId","onReady","form","React","PureComponent","FormSpree","submitForm","bind","status","className","onSubmit","action","method","type","aria-label","id","ev","preventDefault","FormData","xhr","XMLHttpRequest","open","setRequestHeader","onreadystatechange","readyState","DONE","reset","setState","send","Component","FormSpreeFR","ContactFormBattlefield","whyDidYouRender","ContactFormBattlefieldRentalFleet","FormSpreeJobsite","useForm","handleSubmit","succeeded","prefix","field","errors","disabled","submitting","FormSpreeJobsiteFR","ContactFormJobsite","CTASection","heading","subheading","submitBtnText","ctaImage","ctaImageAltText","getSubmitBtnTxt","headingText","getHeading","subheadTxt","getSubHeading","alt","shoppingCart","cart","Item","pic","linkurl","saveCart","localStorage","setItem","JSON","stringify","getItem","loadCart","obj","yr","alreadyExist","getCartDataAttribute","item","splice","totalCount","totalCost","toFixed","cartCopy","itemCopy","p","total","displayCart","$","cartArray","listCart","output","displayName","itemprice","hide","show","countCart","totalCart","sn","on","event","attr","isItemInCart","addItemToCart","removeClass","addClass","removeItemFromCartAll","removeItemFromCart","val","setCountForItem","each","clearCart","module","exports","map","webpackContext","req","webpackContextResolve","__webpack_require__","Error","code","keys","Object","resolve","NavPhoneNum_Tcat","data-fr","currentCatClass","withRouter","history","pathname","PreNav","NavDropdown","ref","wrapperRef","useRef","useEffect","handleClickOutside","current","contains","handleClickOutsideDropdown","addEventListener","removeEventListener","topLinkIsCurrent","dropdownList","paramCategory","fallbackUrl","includes","onClick","handleToggleDropdown","tabIndex","linkName","isOpen","link","to","NavItems_TCAT","dropdownIDs","heavyEquipList","dropdownOpenState","NavItems_BFE","FavouritesLinkMobile","FavouritesNavPopup","favesDropdown","getElementById","loadedFirstTime","MutationObserver","handleForceOpenDropdown","observe","childList","viewingClass","isViewingFaves","favesPopup","NavigationHeader","openMobileMenu","toggle","newState","dropdownOpen","isEqual","newState_dropdownOpen","getLogo","style","padding","mobileOnlyClass","Header","ScrollTopButton","useState","isVisible","setIsVisible","onscroll","scrollTop","documentElement","el","scrollIntoView","behavior","scrollToTop","title","Footer_Battlefield","curYear","Date","getFullYear","aria-hidden","marginBottom","Footer_Jobsite","FooterSubscribeForm_Tcat_hubspot","Footer_TCAT","CtaSectionHeader","btnPhone","btnForm","SeoTextHeader","h1title","seoText","getCategoryHeader","getCategorySeoText","getCategorySeoTextBFERental","getCategorySeoTextJobsite","currentDealsArray","ListingHeader","fetch","then","response","setUpPaging","curPage","itemCount","itemsPerPg","endAtItem","numPages","Math","ceil","startAtItem","totalItems","getAllProductsFromCategory","VIEWALLPRODUCTS","FamData","filter","AllData","getFilteredSearchResults","famData","filteredResults","serialnum","stocknum","f_yearMax","certification","chain","reverse","SeoTextBottom","getExtraText","SelectSortOrder","onChange","newSortVal","updatedSearchFilters","onSearchFilterChange","onSortByChange","InputKeywordSearch","arial-label","placeholder","newKeywords","onKeywordSearch","FiltersTop","showingProductsText","textCountShowingProducts","pagingState","min","display","activePage","itemsCountPerPage","totalItemsCount","pageRangeDisplayed","onPageChange","hideFirstLastPages","innerClass","SelectCategory","htmlFor","newCategory","onCategoryChange","selectOptions_fam","x","famCount","famName","famCode","getCategoryDropdownOptions","CheckboxCertified","onBattlefieldChange","newBattlefieldValue","checked","onCertifiedChange","newCertifiedValue","currentURL","shouldCheckBattlefieldInventoryEn","shouldCheckBattlefieldInventoryFr","aria-labelledby","defaultChecked","newRentalFleetAvailableValue","onRentalFleetAvailableChange","newRentalFleetWithImagesValue","onRentalFleetWithImagesChange","clear","SelectManufacturer","onSelectboxChange","newManufacturer","onKeyPress","InputYearMinMax","currentYear","oldestModelYear","showSlider","oldestModel","minBy","rangeSliderMinimum","rangeSliderMaximum","defaultSliderValueMin","defaultSliderValueMax","textInputValueMin","setTextInputValueMin","textInputValueMax","setTextInputValueMax","sliderCurrentValueMin","setSliderCurrentValueMin","sliderCurrentValueMax","setSliderCurrentValueMax","isUserUpdatingSlider","setIsUserUpdatingSlider","newYearMin","onYearMinChange","newYearMax","onYearMaxChange","defaultValue","allowCross","onBeforeChange","newMin","newMax","onSliderChange","onAfterChange","minYearChanged","maxYearChanged","onSliderFinishedChange","max","ariaLabelGroupForHandles","InputHoursMax","lowestHours","highestHours","highestHoursModel","maxBy","lowestHoursModel","defaultSliderValue","setTextInputValue","sliderCurrentValue","setSliderCurrentValue","updateFilters","newMaxHours","newHoursMax","onInputboxChange","ariaLabelForHandle","InputPriceMax","lowestPrice","highestPrice","highestPriceModel","lowestPriceModel","newMaxPrice","SelectProvinceAndCity","onCitySelectboxChange","newCity","onProvinceSelectChange","newProvince","selectedCity","foundCityInList","getCityList","checkProv","UsedDataCities","groupBy","filters_Province","list_cities","curCity","curProv","getProvincesList","curLang","UsedDataProvinces","list_provinces","provinceDisplayName","findIndex","getCitySelectOptions","selectOptions_cities","cityList","getProvincesSelectOptions","selectOptions_provinces","provList","aria-aria-label","SelectClass","newClass","handleUpdateCatClass","onClassChange","FiltersSide","toggleFiltersOpenMobile","filtersOpenMobile","onClearFilters","SearchResultListings","lazy","ListingsPage","getMetaDescTag","catCode","getMetaTitleTag","categoryName","getCategoryDisplayName","searchFilters","getCtaImageSrc","handleSearchFilterChange","setPageTo","paging","searchResults","setUserIsTyping","pushUpdatedUrl","isUserTyping","typingTimer","clearTimeout","setTimeout","doneTyping","handlePageChange","setToPage","handleClearSearchFilters","resetSearchFilters","getCanonicalUrl","canonicalUrl","catCodeFromUrl","scrollTo","defaultSearchFilters","initialState","prevProps","prevState","bodyClassNames","getBodyClassNames","Helmet","content","width","results","famDataCount","previousLabel","CCUPage","ConsignmentPage","isFooterSubscribe","height","AdvancedFilters","handleKeyPressSubmitSearch","MainSearch","handleSubmitSearch","fadeInClass","navigator","userAgent","IntroText","FoundCountText","nonefoundclass","IntroSection","initializeSearchResults","allDataGrouped","allData","toggleFiltersExpand","filtersOpen","which","listingUrl","CategorySection","categoryList","getLink","groupCode","groupDisplayName","groupCount","groupImage","linkClasses","numberOfColumns","columnClass","famCountPerColumn","column","categoryImagesBFE","attachmentImage","compactorImage","telehandlerImage","backhoeLoaderImage","excavatorImage","wheelLoaderImage","compactTrackLoaderImage","skidSteerLoaderImage","vtrImage","ILImage","categoryImagesBFERental","aircompressorsImage","backhoeloadersImage","compactionequipmentImage","compacttrackloadersImage","concBuggyImage","excavatorsImage","generatorsImage","lawngardenequipmentImage","lighttowersImage","materialhandlingImage","messagearrowboardsImage","miscImage","miscImageFR","pumpsImage","scissorliftsboomsImage","skidsteerloadersImage","trenchshoringImage","weldersImage","categoryImagesJobsite","hoistingImage","materialImage","jacksImage","weldingImage","pipeBendingImage","pipeFabImage","wireImage","electricToolsImage","airToolsImage","confinedImage","storageImage","torqueImage","miscJobsiteImage","endColumnCheck","newLink","SeoTextSection_TCAT","SeoTextSectionBattlefield","SeoTextSectionJobsite","HomePage","getSeoTextSection","newSitemapItem","url_en","url_fr","toISOString","res","json","groupList","productList","finalOutput","curCategoryClass","baseurl","hreflink_en","hreflink_fr","curProduct","valueToSend","request","valueToSendEncoded","write","responseText","paramName","sendPost","close","DetailsPage","PageWrapper","updateCategoryClassState","getJsonData","jsonApiUrl","result","getCategoryClass","jsonDataGroupsMain","initialFilterJson","jsonDataGroupsPower","powerSystemsFilterJson","error","jsonData","groups","groupCategoryClass","getCurrentListingGroups","getParamLanguage","getPageComponent","getParamCategory","serialFromUrl","getParamSerial","getFooterComponent","browserLang","paramLang","match","param_Lang","cookieLang","setLanguageTo","language","param_Category","param_Serial","newJsonUrl","loadJsonOnStartup","jsonDataSrc","newPowerGrouping","equipmentFilteredPowerOnly","equipmentGroupingPower","htmlAttributes","fallback","queryClient","QueryClient","AppRouter","client","children","tagManagerArgs","Boolean","hostname","gtmId","TagManager","initialize","render","App","serviceWorker","ready","registration","unregister","catch","message"],"mappings":"uIAAA,i6BAGaA,EAAiB,WACjBC,EAAiB,WACjBC,EAAc,gBACdC,EAAc,sBACdC,EAAgB,qCAGhBC,EAAc,aACdC,EAAc,UACdC,EAAS,0CACTC,EAAiB,2BACjBC,EAAc,wBACdC,EAAc,sBACdC,EAAe,GAEfC,EAEL,YAFKA,EAGN,WAHMA,EAIA,kBAJAA,EAKF,eAEEC,EAA4BC,YAAiBF,GAC7CG,EAA6BD,YAAiBF,GAC9CI,EAAkCF,YAC7CF,GAEWK,EACXH,YAAiBF,IAAmBE,YAAiBF,GAC1CM,EAAgCJ,YAC3CF,GAGWO,EAAaL,YAAiBF,GACvC,uCACA,+BAESQ,EAAY,CACvBC,KAAM,EACNC,SAAU,EACVC,QAAS,EACTC,IAAK,EACLC,YAAa,EACbC,aAAc,EACdC,cAAe,GAEJC,EAAS,CACpBC,UAAWC,YAAS,YACpBC,SAAUD,YAAS,gBACnBE,YAAaF,YAAS,mBACtBG,aAAcH,YAAS,oBACvBI,iBAAkBJ,YAAS,yBAC3BK,2BAA4BL,YAAS,mCACrCM,QAASN,YAAS,eAClBO,QAASP,YAAS,eAClBQ,qBAAsBR,YAAS,0BAC/BS,kBAAmBT,YAAS,8BAC5BU,KAAMV,YAAS,YACfW,KAAMX,YAAS,YACfY,KAAMZ,YAAS,YACfa,gBAAiBb,YAAS,sBAC1Bc,YAAad,YAAS,sBAGXe,EAAO,SAACC,GACnB,MAAO,CACLC,aACW,OAATD,EAAgB,uBAAyB,gCAIlCE,EAAO,CAClBC,QAAS,UACTC,QAAS,UACTC,SAAU,WACVC,SAAU,WACVC,SAAU,WACVC,SAAU,WACVC,SAAU,WACVC,SAAU,YAGCC,EAAS,CACpBC,SAAU,WACVC,KAAM,OACNC,SAAU,QACVC,SAAU,QACVC,MAAO,QACPd,KAAM,OACNe,KAAM,OACNC,UAAW,MACXC,QAAS,UACTC,UAAW,MACXC,UAAW,YACXC,QAAS,SACTC,WAAY,MACZC,WAAY,QACZC,KAAM,OACNC,KAAM,OACNC,UAAW,YACX7C,OAAQ,UAGG8C,EAAe,CAC1BC,WAAY,iBACZC,WAAY,iBACZC,IAAK,iBACLC,UAAW,iBACXC,QAAS,kBAGEC,EAAc,CACzBC,YAAa,CACXC,MAAO,CACLC,QAAS,6BACTC,GAAI,iCAENC,MAAO,CACLF,QAAS,iCACTC,GAAI,iCAGRE,gBAAiB,CACfJ,MAAO,CACLK,GAAI,mCACJC,GAAI,gCAENH,MAAO,CACLE,GAAI,+BACJC,GAAI,gCAKGC,EAAiB,CAC5BR,YAAa,CACXC,MAAO,CACLK,GAAI,uCACJC,GAAI,wCAENH,MAAO,CACLE,GAAI,uCACJC,GAAI,yCAGRF,gBAAiB,CACfJ,MAAO,CACLK,GAAI,uCACJC,GAAI,wCAENH,MAAO,CACLE,GAAI,uCACJC,GAAI,0CAKGE,EAA2C,CACtDC,cAAelF,EACfmF,SAAU,KACVC,OAAQ,KACRC,KAAM,KACNC,SAAU,KACVC,QAAS,KACTC,SAAU,KACVC,QAAS,KACTC,QAAS,KACTC,SAAU,KACVC,KAAM,KACNC,eAAe,EACfC,sBAAsB,EACtBC,yBAAyB,EACzBC,uBAAuB,EACvBC,WAAW,EACXC,WAAW,I,uiCC7JAC,EAAa,SAACC,EAAQC,EAAQhE,GACzC,MAAgB,OAATA,EAAgBgE,EAASD,GAIrBE,EAAa,SAACC,EAAkBlE,EAAcmE,GACzD,IAAIC,EACF,gFAoBF,GAlBIC,MAEFD,EACE,iFAGAC,MAEFD,EACE,0GAGAC,MAEFD,EACE,iGAGAF,IAAaG,IAAoB5F,QAEnC,GAAI4F,IAEFD,EAAUA,EAAQE,QAAQ,sBAAuB,IACjDF,GAAW,uBAAyBD,MAC/B,IAAIE,IAAgC,CAGzC,IAAIE,EAAWH,EAAQI,MAAM,YACzBC,EAAcF,EAAS,GAAGG,OAAO,IAAMH,EAAS,IAChDI,EAASF,EAAYC,OAAO,sBAAwBP,GAExD,GAAa,OAATnE,EAAe,CAOjB,OAJayE,EAAYC,OACvB,sBAAwBP,EAAxB,0BAMJ,OAAOQ,EAEPP,GAAW,cAAgBD,EAI/B,IAAIS,EAAQ,IAgBZ,OAdEV,IAAaG,IAAoB5F,SACjC4F,MAEAO,EAAQ,KAIRV,IAAaG,IAAoB5F,SACjC4F,MAEAO,EAAQ,KAINP,IACKD,GAIPA,GADW,OAATpE,EACS4E,EAAQ,wBAERA,EAAQ,wBAInBV,IAAaG,IAAoB7F,UACjC0F,IAAaG,IAAoB5F,SACjCyF,IAAaG,IAAoB9F,KAG1B6F,OANT,IAUK,SAASpF,EAAS6F,GAEvB,IAAIC,EACJ,IACEA,EAAYC,OAAQ,KAAkBF,GACtC,MAAOG,GACPF,EAAY,KAEd,OAAOA,EAGF,SAASG,EAAeC,GAC7B,OAAIb,IACKA,IAAuBtC,IACrBsC,IACFA,IAAuBrC,UACrBqC,IACFA,IAAuBpC,QACrBiD,IAAiBb,IAEnBA,IAAuBvC,WAGvBuC,IAAuBxC,WA6D3B,SAASsD,EAAyBC,GAQvC,OASK,SAAmCC,GAExC,GAAiB,eADjBA,EAAWA,EAASC,gBACyB,eAAbD,EAC9B,OAAOhB,IACF,GACQ,kBAAbgB,GACa,8BAAbA,GACa,4BAAbA,EAEA,OAAOhB,IAET,OAAOgB,EA3BkBE,CACvBH,EAAcI,WAAW,GAAG,6BAA6B,kBACtDC,QAGkBpB,KACrBqB,YAAKN,EAAc,iBAAmBf,IAInC,SAASsB,EAAgBP,GAG9B,OADEM,YAAKN,EAAc,iBAAmBf,IAuCnC,SAASuB,EAAwBC,GACtC,OAAOC,IAAE/C,OAAO8C,GAAU,SAAUE,GAClC,GAA+B,MAA3BA,EAAE,sBACJ,OAAOD,IAAEE,OAAOD,EAAE,0BAKjB,SAASE,EAAYC,EAAQC,GASlC,OANED,EAFY,MAAVA,GACFA,EAASA,EAAO1B,MAAM,KAAK4B,KAAK,MAChB5B,MAAM,KAAK4B,KAAK,UACb,MAAVF,GAAkC,oBAATC,EACzBA,EAEA,MAKN,SAASE,EAAaC,GAC3B,GAAiB,OAAbA,GAAyC,qBAAbA,GAAyC,KAAbA,EAM1D,MAAO,MALP,IAAIC,EAAUD,EAASE,cACvB,MAAgB,WAAZD,GAAoC,aAAZA,GAA0BA,EAAQE,OAAS,EAC9D,MAMJH,EAEF,SAASI,EAAaC,GAAyB,IAAD,KACnD,EAAAC,SAASC,KAAKC,WAAUC,OAAxB,oBAAkCH,SAASC,KAAKC,aAChD,EAAAF,SAASC,KAAKC,WAAUE,IAAxB,oBAA+BL,IAG1B,SAASM,EACdC,EACAlH,GAEA,GAA8B,qBAAnBkH,GAAqD,OAAnBA,EAAyB,CACpE,IAAIC,EAAuC,GAqB3C,OApBAD,EAAeE,SAAQ,SAACC,GAClBhD,MAAgCc,EAAyBkC,IAG7DF,EAAcG,KAAK,CACjBC,SAAUF,EAAM,sBAAwB,KAAOA,EAAMG,MAAQ,IAC7DC,QAASC,YAAkB1H,EAAMqH,EAAM,eAAe,GACtDM,cAAejC,YAAK2B,EAAM,oBAG9BF,EAAcS,MAAK,SAAUC,EAAGC,GAE9B,OAAID,EAAEN,SAAWO,EAAEP,UACT,EAENM,EAAEN,SAAWO,EAAEP,SACV,EAEF,KAEFJ,EAEP,OAAO,KAIJ,SAASY,EAAYC,EAAehI,GACzC,IACIiI,EAAY,GAYhB,OAXID,GAAS,MACXC,EAAY,KAGD,OAATjI,GAAiBgI,EAAQ,EACZE,IAAWC,YAAYH,EAAO,GAAI,EAAGC,GAC3CD,EAAQ,EACFE,IAAWC,YAAYH,EAAO,GAAI,GAElC,MAIZ,SAASI,EAAmBC,EAAMC,GACvC,IAAIC,EAAelE,IAAiBhF,2BAYpC,MATwB,oBAAfgJ,EAAKG,QACe,oBAApBH,EAAKG,OAAOF,KAEoB,oBAA5BD,EAAKG,OAAOF,GAAZ,KACTC,EAAeF,EAAKG,OAAOF,GAAZ,KAAyBhE,QAAQ,UAAW,MAChB,oBAA3B+D,EAAKG,OAAOF,GAAZ,MAChBC,EAAeF,EAAKG,OAAOF,GAAZ,IAAwBhE,QAAQ,UAAW,QAGvDiE,EAEF,SAASE,EAAqBC,GACnCA,EAAEC,OAAOC,IAAMvE,IAAiBhF,2BAG3B,SAASwJ,EAAeC,GAC7B,OACGA,EAAgBC,KAAOD,EAAgBC,KAAO,IAAM,KACpB,MAAhCD,EAAgBE,aACbF,EAAgBE,aAAe,IAC/B,KACsB,MAAzBF,EAAgBG,MAAgBH,EAAgBG,MAAQ,IAItD,SAASC,EAAcJ,GAC5B,OAAOA,EAAgB,eAGlB,SAASK,EAAkB7C,GAChC,GAAIA,EAAU,CACZ,IAAI8C,EAAWtD,IAAEE,OAAOK,EAAaC,IAWrC,OADA8C,GADAA,GADAA,GADAA,GADAA,GADAA,GADAA,GADAA,GADAA,EAAWA,EAAS5C,eACAhC,MAAM,KAAK4B,KAAK,KAChB5B,MAAM,KAAK4B,KAAK,KAChB5B,MAAM,KAAK4B,KAAK,KAChB5B,MAAM,KAAK4B,KAAK,KAChB5B,MAAM,KAAK4B,KAAK,KAChB5B,MAAM,KAAK4B,KAAK,KAChB5B,MAAM,KAAK4B,KAAK,KAChB5B,MAAM,KAAK4B,KAAK,IAGpC,MAAO,KAIJ,SAASiD,EAAQC,EAASpG,GAoB/B,IAJA,IAAIqG,GAAgB,EACd/E,GAfJtB,EADqB,qBAAZA,EACC,IAWVA,GADAA,GADAA,GADAA,GADAA,GADAA,GADAA,GADAA,GADAA,EAAUA,EAAQoB,QAAQ,QAAS,KACjBA,QAAQ,SAAU,KAClBA,QAAQ,SAAU,KAClBA,QAAQ,UAAW,KACnBA,QAAQ,cAAe,KACvBA,QAAQ,aAAc,KACtBA,QAAQ,WAAY,KACpBA,QAAQ,aAAc,KACtBA,QAAQ,iBAAkB,KAC1BA,QAAQ,MAAO,MAGbE,MAAM,KAGnBgF,EAAI,EAAGA,EAAIhF,EAAMiC,SAAU+C,EAAG,CACrC,IAAIC,GAAe,EAGbC,EAAU5D,IAAEE,OAAOxB,EAAMgF,GAAGhD,eAIf,MAAjB8C,EAAQL,OACRnD,IAAEE,OAAOsD,EAAQL,OAAOzC,cAAcmD,QAAQD,IAAY,IAE1DD,GAAe,GAIC,MAAhBH,EAAQP,MACRO,EAAQP,KAAKvC,cAAcmD,QAAQD,IAAY,IAE/CD,GAAe,GAImB,oBAA3BH,EAAQ,iBACY,MAA3BA,EAAQ,iBACRxD,IAAEE,OAAOsD,EAAQ,iBAAiB9C,gBAAkBkD,IAGpDD,GAAe,GAIoB,oBAA5BH,EAAQ,kBACa,MAA5BA,EAAQ,kBACRxD,IAAEE,OAAOsD,EAAQ,kBAAkB9C,gBAAkBkD,IAGrDD,GAAe,GAIgC,oBAAxCH,EAAQ,8BACqC,MAApDA,EAAQ,6BAAR,UAGK,MAFLA,EAAQ,6BAAR,SACE,0BAEFxD,IAAEE,OACAsD,EAAQ,6BAAR,SACE,0BAGD9C,cACAmD,QAAQD,IAAY,IAEvBD,GAAe,GAIgC,oBAAxCH,EAAQ,8BACqC,MAApDA,EAAQ,6BAAR,UAEE,MADFA,EAAQ,6BAAR,SAAiD,kBAEjDxD,IAAEE,OACAsD,EAAQ,6BAAR,SAAiD,kBAEhD9C,cACAmD,QAAQD,IAAY,IAEvBD,GAAe,GAIkC,oBAA1CH,EAAQ,gCACfxD,IAAEE,OAAOsD,EAAQ,gCACd9C,cACAmD,QAAQD,IAAY,IAEvBD,GAAe,GAIC,MAAhBH,EAAQ/F,MACRuC,IAAEE,OAAOsD,EAAQ/F,MAAMiD,cAAcmD,QAAQD,IAAY,IAEzDD,GAAe,GAIE,MAAjBH,EAAQM,QACP9D,IAAEE,OAAO6D,EAAgBP,EAAQM,MAAO,OACtCpD,cACAmD,QAAQD,IAAY,GACrB5D,IAAEE,OAAO6D,EAAgBP,EAAQM,MAAO,OACrCpD,cACAmD,QAAQD,IAAY,KAEzBD,GAAe,GAIS,MAAxBH,EAAQN,cACRlD,IAAEE,OAAOsD,EAAQN,cAAcxC,cAAcmD,QAAQD,IAAY,IAEjED,GAAe,GAGjB,IAAMK,EAAgCC,YACpCrE,YAAK4D,EAAQ,6BAAR,SAAiD,mBAElDU,EAAYC,EAAUC,yBAAeJ,EAASrH,GAAG0H,OACjDC,EAAYH,EAAUC,yBAAeJ,EAASrH,GAAG0H,OAKhC,YAArBL,EAASO,UACRvE,IAAEE,OAAOgE,GAAWxD,cAAcmD,QAAQD,IAAY,GACrD5D,IAAEE,OAAOoE,GAAW5D,cAAcmD,QAAQD,IAAY,KAExDD,GAAe,IAII,IAAjBA,IACFF,GAAgB,GAGpB,OAAOA,EAGT,SAASU,EAAUK,GAIjB,OAFSA,EACOhG,QAFJ,uBAEmB,KAI1B,SAAStG,EAAiBuM,GAC/B,SACEA,GACY,OAAZC,GACgB,OAAhBA,+RAGIA,oBAAiDD,EAUlD,SAASV,EAAgBY,EAAUzK,GACxC,IAAI0K,EAAWD,EAIf,GAHgB,MAAZA,GAAiC,cAAbA,IACtBA,EAAW,OAETA,EAAShE,OAAS,EAEpB,OAAQgE,GACN,IAAK,MACHC,EAAW,SACX,MACF,IAAK,KACHA,EAAW,4BACX,MACF,IAAK,KACHA,EAAW,uBACX,MACF,IAAK,KACHA,EAAW,cACX,MACF,IAAK,KACHA,EAAW,gBACX,MACF,IAAK,KACHA,EAAW,UACX,MACF,IAAK,KACHA,EAAW,SACX,MACF,IAAK,KACHA,EAAW,WACX,MACF,IAAK,KACHA,EAAW,eACX,MACF,IAAK,KACHA,EAAW,UACX,MACF,IAAK,KACHA,EAAW,QACX,MACF,IAAK,KACHA,EAAW,UACX,MACF,IAAK,KACHA,EAAW,wBACX,MACF,IAAK,KACHA,EAAW,mBACX,MACF,QACEA,EAAW,QAKjB,MAAgB,OAAT1K,EAGF,SAAiC2K,GACtC,OAAQA,GACN,IAAK,4BACH,MAAO,0BACT,IAAK,uBACH,MAAO,8BACT,IAAK,cACH,MAAO,qBACT,IAAK,gBACH,MAAO,oBACT,IAAK,SACH,MAAO,YACT,IAAK,wBACH,MAAO,4BACT,IAAK,mBACH,MAAO,uBACT,QACE,OAAOA,GApBYC,CAAwBF,GAAYA,EAwBtD,SAASG,EAAgBvE,GAC9B,IAAIwE,EAAWxE,EAGf,OADAwE,GADAA,EAAWA,EAASxF,eACAd,MAAM,MAAM4B,KAAK,KAIhC,IAAM2E,EAA0B,SACrClI,EACAC,EACAkI,GAHqC,MAIZ,CACzBnI,cAAeA,EACfC,SAAUA,EACVC,OAAQiI,EAAU3G,IAAiBnE,MACnC8C,KAAMgI,EAAU3G,IAAiBpD,MACjCgC,SAAU+H,EAAU3G,IAAiBnD,WACrCgC,QAAS8H,EAAU3G,IAAiBlD,SACpCgC,SAAU6H,EAAU3G,IAAiBzD,UACrCwC,QAAS6H,EAAgBD,EAAU3G,IAAiBvD,WACpDuC,QAAS4H,EAAgBD,EAAU3G,IAAiBtD,WACpDuC,SAAU0H,EAAU3G,IAAiBjD,WACrCmC,KAAMyH,EAAU3G,IAAiBxD,MACjC2C,cAAyD,MAA1CwH,EAAU3G,IAAiBhD,WAC1CoC,qBAA8D,MAAxCuH,EAAU3G,IAAiB/C,SACjDoC,wBAAmE,MAA1CsH,EAAU3G,IAAiB1C,WACpDgC,sBAA8D,MAAvCqH,EAAU3G,IAAiBvF,QAClD8E,UACEd,IAAauB,KAAyBvB,IAAauB,IACrDR,UAAwB,UAAbf,IAiCN,SAASoI,EACdC,EACAnL,EACAoL,EACAC,EACAC,GAEA,IAAIC,EAAiBJ,EAIrB,GAAa,OAATnL,EAAe,CAEjB,IAAMwL,EAAeJ,EAAa,MAAQ,GAIxCG,EAFc,MAAZF,GAAiC,QAAbA,EAGpBnD,IAAWC,YATH,IASesD,OAAON,GAAkB,GAAI,EAAG,KACvD,KACAK,EAIAtD,IAAWC,YAAYgD,EAAO,GAAI,EAAG,KAAO,KAAOK,EAGnDnH,MAEAkH,EADEF,IAAaC,EAEQ,QAArBA,EACIpD,IAAWC,YAtBT,IAsBqBsD,OAAON,GAAkB,IAAK,KAAO,KAC5DjD,IAAWC,YAAYsD,OAAON,GAvB5B,IAuB8C,IAAK,KAAO,KAGhEjD,IAAWC,YAAYsD,OAAON,GAAQ,IAAK,KAA3CjD,OAIAsD,OAGD,CAEL,IAAMA,EAAeJ,EAAa,OAAS,GAGzCG,EAFc,MAAZF,GAAiC,QAAbA,EAGpBnD,IAAWC,YAvCH,IAuCesD,OAAON,GAAkB,IAAK,GAAKK,EAG3CtD,IAAWC,YAAYgD,EAAO,IAAK,GAAKK,EAMvDnH,MAEAkH,EADEF,IAAaC,EAEQ,QAArBA,EACIpD,IAAWC,YApDT,IAoDqBsD,OAAON,GAAkB,IAAK,GACrDK,EACAtD,IAAWC,YAAYsD,OAAON,GAtD5B,IAsD8C,IAAK,GACrDK,EAGJtD,IAAWC,YAAYsD,OAAON,GAAQ,IAAK,GAAKK,GAMxD,OAAOD,EAEF,SAASG,EAAiBC,EAAgB3L,GAC/C,OAAIyL,OAAOE,GAAkB,EACpB7H,EACLoE,IAAWC,YAAYwD,EAAgB,GAAI,GAC3CzD,IAAWC,YAAYwD,EAAgB,GAAI,EAAG,KAC9C3L,GAGG,GAGF,IAAM4L,EAAkB,SAACC,GAC9B,OAAc,OAAVA,QAA4BC,IAAVD,GAAwC,kBAAVA,EAC3CA,EAEFA,EAAME,YAGFC,EAAmB,SAACH,GAC/B,OAAc,OAAVA,QAA4BC,IAAVD,GAAwC,mBAAVA,EAC3CA,EAEmB,SAArBA,EAAME,YAGFd,EAAkB,SAACY,GAC9B,OAAc,OAAVA,QAA4BC,IAAVD,GAAwC,kBAAVA,EAC3CA,EAEFI,WAAWJ,EAAME,aAInB,SAASG,EAAUC,GAIxB,IAHA,IAAI1G,EAAO0G,EAAQ,IAEfC,EADgBC,mBAAmBzF,SAAS0F,QACzB9H,MAAM,KACpBgF,EAAI,EAAGA,EAAI4C,EAAG3F,OAAQ+C,IAAK,CAElC,IADA,IAAI+C,EAAIH,EAAG5C,GACY,MAAhB+C,EAAEC,OAAO,IACdD,EAAIA,EAAEE,UAAU,GAElB,GAAwB,IAApBF,EAAE5C,QAAQlE,GACZ,OAAO8G,EAAEE,UAAUhH,EAAKgB,OAAQ8F,EAAE9F,QAGtC,MAAO,M,qYC20BMiG,EA7nDkB,CAC/B,CACErC,QAAS,UACTsC,YAAa,WAEblK,GAAI,CACFmK,KAAM,gCACNC,KACE,ocACF1C,KACE,ocACF2C,UAAW,MAEbpK,GAAI,CACFkK,KAAM,4CACNC,KACE,woBACF1C,KACE,woBACF2C,UAAW,OAGf,CACEzC,QAAS,+CACTsC,YAAa,0CACblK,GAAI,CACFmK,KAAM,qBACNC,KACE,sNACF1C,KACE,oCACE,6EACA,0ZAQA,yEAGJ2C,UACE,oCACE,2FACA,yzBAeA,6BACA,yGAIA,kbAQA,gGACqE,IACnE,uBACEnE,OAAO,SACPoE,IAAI,sBACJC,KAAK,4EAHP,uBAFF,OAcNtK,GAAI,CACFkK,KAAM,0BACNC,KACE,0RACF1C,KACE,oCACE,iEACA,6dAUJ2C,UACE,oCACE,uGAGA,goCAkBA,6BACA,mIAIA,qjBAUA,+IAQR,CACEzC,QAAS,2CACTsC,YAAa,yCACblK,GAAI,CACFmK,KAAM,kBACNC,KACE,6KACF1C,KACE,oCACE,gFACA,qdASA,+DAGJ2C,UACE,oCACE,wFACA,qtBAaA,6BACA,sGAIA,mbAYNpK,GAAI,CACFkK,KAAM,mBACNC,KACE,4VACF1C,KACE,oCACE,oGACA,6mBAYJ2C,UACE,oCACE,4GAIA,+zBAaA,6BACA,yIAIA,4jBAcR,CACEzC,QAAS,2BACTsC,YAAa,yBACblK,GAAI,CACFmK,KAAM,aACNC,KACE,uJACFC,UACE,oCACE,2FACA,owBAY4C,KAE5C,6BACA,iGAGA,8aAOsB,MAI1B3C,KACE,oCACE,2EACA,oiBAUA,2DAINzH,GAAI,CACFkK,KAAM,cACNC,KACE,8UACF1C,KACE,oCACE,2FACA,ymBAYJ2C,UACE,oCACE,qGACsE,KAEtE,w9BAeA,6BACA,wIAE+B,KAE/B,4cAYR,CACEzC,QAAS,wBACTsC,YAAa,sBACblK,GAAI,CACFmK,KAAM,uBACNzC,KACE,oCACE,2FACA,6NAKA,8EAGJ0C,KACE,0LACFC,UACE,oCACE,wEACA,0vBAWuE,OAK7EpK,GAAI,CACFkK,KAAM,yBACNC,KACE,6OACF1C,KACE,oCACE,8GAES,KAET,smBASO,MAIX2C,UACE,oCACE,0FACA,8+BAmBR,CACEzC,QAAS,mCACTsC,YAAa,iCACblK,GAAI,CACFmK,KAAM,aACNC,KACE,kSACF1C,KACE,oCACE,oFACA,kwBAcA,wEAGJ2C,UACE,oCACE,oGACmE,KAEnE,iVAK6C,IAC3C,uBAAGE,KAAK,8CAAR,yBANF,+gBAqBNtK,GAAI,CACFkK,KAAM,eACNC,KACE,kVACF1C,KACE,iiCACF2C,UACE,oCACE,iIAIA,onCAe2D,QAMnE,CACEzC,QAAS,0CACTsC,YAAa,qCACblK,GAAI,CACFmK,KAAM,kBACNC,KACE,uPACF1C,KACE,oCACE,2FACA,sdASA,0EAGJ2C,UACE,oCACE,iEACA,+rBAgBNpK,GAAI,CACFkK,KAAM,uBACNC,KACE,2XACF1C,KACE,mrBACF2C,UACE,oCACE,+FACA,w+BAmBR,CACEzC,QAAS,qCACTsC,YAAa,gCACblK,GAAI,CACFmK,KAAM,YACNC,KACE,+NACF1C,KACE,wdACF2C,UAAW,MAEbpK,GAAI,CACFkK,KAAM,yBACNC,KACE,kUACF1C,KACE,2pBACF2C,UAAW,OAGf,CACEzC,QAAS,yCACTsC,YAAa,uCACblK,GAAI,CACFmK,KAAM,mBACNC,KACE,qSACF1C,KACE,oCACE,wFACA,uhBAYJ2C,UACE,oCACE,8EACA,6nBAcNpK,GAAI,CACFkK,KAAM,yBACNC,KACE,uUACF1C,KACE,4rBACF2C,UACE,oCACE,yFACA,2vBAgBR,CACEzC,QAAS,6BACTsC,YAAa,2BACblK,GAAI,CACFmK,KAAM,gBACNC,KACE,wNACF1C,KACE,oCACE,sFACA,wfAUA,wEAGJ2C,UACE,oCACE,yEACA,ijBAaNpK,GAAI,CACFkK,KAAM,aACNC,KACE,gTACF1C,KACE,olBACF2C,UACE,oCACE,uFACA,msBAUe,QAMvB,CACEzC,QAAS,iEACTsC,YAAa,2DACblK,GAAI,CACFmK,KAAM,gCACNC,KACE,oPACF1C,KACE,oCACE,0FACA,+dAWJ2C,UACE,oCACE,mFACA,omBASsD,OAK5DpK,GAAI,CACFkK,KAAM,iCACNC,KACE,iTACF1C,KACE,qiBACF2C,UACE,oCACE,gGACA,qrBAgBR,CACEzC,QAAS,uCACTsC,YAAa,qCACblK,GAAI,CACFmK,KAAM,oBACNC,KACE,yJACF1C,KACE,igBACF2C,UAAW,MAEbpK,GAAI,CACFkK,KAAM,mBACNC,KACE,oMACF1C,KACE,2iBACF2C,UAAW,OAGf,CACEzC,QAAS,wCACTsC,YAAa,mCACblK,GAAI,CACFmK,KAAM,kBACNC,KACE,+LACF1C,KACE,oCACE,8EACA,ihBAUA,yEAGJ2C,UACE,oCACE,sEACA,ulBAcNpK,GAAI,CACFkK,KAAM,qBACNC,KACE,iQACF1C,KACE,kpBACF2C,UACE,oCACE,kFACA,2pBASmE,QAM3E,CACEzC,QAAS,wDACTsC,YAAa,oDACblK,GAAI,CACFmK,KAAM,qBACNC,KACE,sMACF1C,KACE,oCACE,2FACA,kXAQA,6EAGJ2C,UACE,oCACE,4EACA,mnBAcNpK,GAAI,CACFkK,KAAM,6BACNC,KACE,yRACF1C,KACE,0uBACF2C,UACE,oCACE,kGAGA,6xBAiBR,CACEzC,QAAS,qDACTsC,YAAa,6CACblK,GAAI,CACFmK,KAAM,eACNC,KACE,gMACF1C,KACE,oCACE,iGACgE,KAEhE,qgBAUA,uEAGJ2C,UACE,oCACE,8DACA,+mBAcNpK,GAAI,CACFkK,KAAM,sCACNC,KACE,6RACF1C,KACE,mnBACF2C,UACE,oCACE,iGACA,6vBAgBR,CACEzC,QAAS,wDACTsC,YAAa,oDACblK,GAAI,CACFmK,KAAM,gCACNC,KACE,6HACF1C,KACE,oCACE,sGAEW,KAEX,qcASA,0FAGJ2C,UACE,oCACE,oHAEe,KAEf,6lBAcNpK,GAAI,CACFkK,KAAM,wBACNC,KACE,6HACF1C,KACE,sgBACF2C,UACE,oCACE,mHAIA,srBAeR,CACEzC,QAAS,uDACTsC,YAAa,mDACblK,GAAI,CACFmK,KAAM,+BACNC,KACE,8NACF1C,KACE,oCACE,wEACA,yeASA,yFAGJ2C,UACE,oCACE,uFACA,guBAgBNpK,GAAI,CACFkK,KAAM,wBACNC,KACE,mUACF1C,KACE,2oBACF2C,UACE,oCACE,+EACA,i1BAkBR,CACEzC,QACE,wFACFsC,YACE,kFACFlK,GAAI,CACFmK,KAAM,0CACNC,KACE,oTACF1C,KACE,oCACE,wEACA,iwBAcA,4EAGJ2C,UACE,oCACE,8DACA,8uBAgBNpK,GAAI,CACFkK,KAAM,8CACNC,KACE,6QACF1C,KACE,ygCACF2C,UACE,oCACE,iFACA,u8BAmBR,CACEzC,QAAS,iCACTsC,YAAa,+BACblK,GAAI,CACFmK,KAAM,aACNC,KACE,2LACF1C,KACE,uYACF2C,UAAW,MAEbpK,GAAI,CACFkK,KAAM,oBACNC,KACE,6PACF1C,KACE,miBACF2C,UAAW,OAGf,CACEzC,QAAS,0CACTsC,YAAa,qCACblK,GAAI,CACFmK,KAAM,aACNC,KACE,mQACF1C,KACE,oCACE,yrBAaA,qEAGJ2C,UACE,oCACE,yEACA,iSASNpK,GAAI,CACFkK,KAAM,6BACNC,KACE,gYACF1C,KACE,oCACE,o+BAeA,kFAGJ2C,UACE,oCACE,+FACA,+ZAYR,CACEzC,QAAS,OACTsC,YAAa,OACblK,GAAI,CACFmK,KAAM,4BACNC,KACE,mQACF1C,KACE,oCACE,yrBAaA,qEAGJ2C,UACE,oCACE,yEACA,iSASNpK,GAAI,CACFkK,KAAM,2CACNC,KACE,gYACF1C,KACE,oCACE,g/BAgBA,kFAGJ2C,UACE,oCACE,+FACA,+ZAYR,CACEzC,QAAS,OACTsC,YAAa,OACblK,GAAI,CACFmK,KAAM,qBACNC,KACE,mQACF1C,KACE,oCACE,yrBAaA,qEAGJ2C,UACE,oCACE,yEACA,iSASNpK,GAAI,CACFkK,KAAM,sBACNC,KACE,gYACF1C,KACE,oCACE,g/BAgBA,kFAGJ2C,UACE,oCACE,+FACA,+ZAYR,CACEzC,QAAS,OACTsC,YAAa,OACblK,GAAI,CACFmK,KAAM,wBACNC,KACE,mQ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ACA,wvBAgBR,CACEzC,QAAS,6BACTsC,YAAa,2BACblK,GAAI,CACFmK,KAAM,gBACNC,KAAM,6NACN1C,KACE,oCACE,2FACA,6fAUA,wEAGJ2C,UACE,oCACE,yEACA,2jBAcNpK,GAAI,CACFkK,KAAM,aACNC,KAAM,4SACN1C,KAAM,glBACN2C,UACE,oCACE,uFACA,+rBAUe,QAMvB,CACEzC,QAAS,iEACTsC,YAAa,2DACblK,GAAI,CACFmK,KAAM,gCACNC,KAAM,oPACN1C,KACE,oCACE,0FACA,+dAWJ2C,UACE,oCACE,mFACA,8mBASuE,OAK7EpK,GAAI,CACFkK,KAAM,iCACNC,KAAM,iTACN1C,KAAM,iiBACN2C,UACE,oCACE,gGACA,6qBAgBR,CACEzC,QAAS,uCACTsC,YAAa,qCACblK,GAAI,CACFmK,KAAM,oBACNC,KAAM,yJACN1C,KAAM,igBACN2C,UAAW,MAEbpK,GAAI,CACFkK,KAAM,mBACNC,KAAM,oMACN1C,KAAM,2iBACN2C,UAAW,OAGf,CACEzC,QAAS,wCACTsC,YAAa,mCACblK,GAAI,CACFmK,KAAM,kBACNC,KAAM,+LACN1C,KACE,oCACE,8EACA,shBAUA,yEAGJ2C,UACE,oCACE,sEACA,imBAcNpK,GAAI,CACFkK,KAAM,qBACNC,KAAM,iQACN1C,KAAM,8oBACN2C,UACE,oCACE,kFACA,mpBASmE,QAM3E,CACEzC,QAAS,wDACTsC,YAAa,oDACblK,GAAI,CACFmK,KAAM,qBACNC,KAAM,sMACN1C,KACE,oCACE,gGACA,uXAQA,6EAGJ2C,UACE,oCACE,4EACA,6nBAeNpK,GAAI,CACFkK,KAAM,6BACNC,KAAM,yRACN1C,KAAM,suBACN2C,UACE,oCACE,kGAGA,0yBAiBR,CACEzC,QAAS,qDACTsC,YAAa,6CACblK,GAAI,CACFmK,KAAM,eACNC,KAAM,qMACN1C,KACE,oCACE,sGACqE,KAErE,+gBAUA,uEAGJ2C,UACE,oCACE,8DACA,ynBAcNpK,GAAI,CACFkK,KAAM,sCACNC,KAAM,yRACN1C,KAAM,+mBACN2C,UACE,oCACE,iGACA,qvBAi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","file":"static/js/main.d79effc7.chunk.js","sourcesContent":["import { getImage, checkEnvironment } from \"./HelperFunctions\";\r\nimport { searchFilters } from \"./Types\";\r\n\r\nexport const ALLFAMSWORD_EN = \"products\";\r\nexport const ALLFAMSWORD_FR = \"produits\";\r\nexport const URLPOWER_EN = \"power-systems\";\r\nexport const URLPOWER_FR = \"production-denergie\";\r\nexport const URLPOWER_SLUG = \"power-systems-production-d-energie\";\r\nexport const URLHEAVY_EN = \"heavy-equipment\";\r\nexport const URLHEAVY_FR = \"equipement-lourd\";\r\nexport const URLFAVES_EN = \"favourites\";\r\nexport const URLFAVES_FR = \"favoris\";\r\nexport const URLCCU = \"cat-certified-used-usagee-certifiee-cat\";\r\nexport const URLCONSIGNMENT = \"consignment-consignation\";\r\nexport const CLASS_HEAVY = \"class-heavy-equipment\";\r\nexport const CLASS_POWER = \"class-power-systems\";\r\nexport const ITEMSPERPAGE = 16;\r\n\r\nexport const DEPLOY_ENV = {\r\n /*https://create-react-app.dev/docs/adding-custom-environment-variables/*/\r\n TCAT: \"tcat-prod\",\r\n BFE: \"bfe-prod\",\r\n BFERENTAL: \"bfe-rental-prod\",\r\n JOBSITE: \"jobsite-prod\",\r\n};\r\nexport const isEnvironmentBFE: boolean = checkEnvironment(DEPLOY_ENV.BFE);\r\nexport const isEnvironmentTCAT: boolean = checkEnvironment(DEPLOY_ENV.TCAT);\r\nexport const isEnvironmentBFERENTAL: boolean = checkEnvironment(\r\n DEPLOY_ENV.BFERENTAL\r\n);\r\nexport const isEnvironmentBFE_or_BFERENTAL =\r\n checkEnvironment(DEPLOY_ENV.BFE) || checkEnvironment(DEPLOY_ENV.BFERENTAL);\r\nexport const isEnvironmentJOBSITE: boolean = checkEnvironment(\r\n DEPLOY_ENV.JOBSITE\r\n);\r\n\r\nexport const DOMAINBASE = checkEnvironment(DEPLOY_ENV.BFE)\r\n ? \"https://used.battlefieldequipment.ca\"\r\n : \"https://used.toromontcat.com\";\r\n\r\nexport const PageTypes = {\r\n Home: 0,\r\n Listings: 1,\r\n Details: 2,\r\n CCU: 3,\r\n Consignment: 4,\r\n EmailConfirm: 5,\r\n UpdateSitemap: 6,\r\n};\r\nexport const IMAGES = {\r\n LOGO_TCAT: getImage(\"logo.gif\"),\r\n LOGO_BFE: getImage(\"bfe-logo.png\"),\r\n LOGO_BFE_FR: getImage(\"bfe-logo-fr.png\"),\r\n LOGO_JOBSITE: getImage(\"jobsite-logo.png\"),\r\n NOIMG_DEFAULTSRC: getImage(\"image-coming-soon.jpg\"),\r\n NOIMG_DEFAULTSRC_BFERENTAL: getImage(\"image-coming-soon-bferental.jpg\"),\r\n FLAG_CA: getImage(\"flag_ca.png\"),\r\n FLAG_US: getImage(\"flag_us.png\"),\r\n HOME_UNBEATABLEVALUE: getImage(\"unbeatablevalue500.png\"),\r\n CTA_SECTION_IMAGE: getImage(\"usedmachineryformimage.jpg\"),\r\n CCU1: getImage(\"ccu1.jpg\"),\r\n CCU2: getImage(\"ccu2.jpg\"),\r\n CCU3: getImage(\"ccu3.jpg\"),\r\n ConsigmentImage: getImage(\"consignmentimg.jpg\"),\r\n LOADING_GIF: getImage(\"loading-gears.gif\"),\r\n};\r\n\r\nexport const TEXT = (lang) => {\r\n return {\r\n callForPrice:\r\n lang === \"en\" ? \"Contact us for price\" : \"Contactez-nous pour le prix\",\r\n };\r\n};\r\n\r\nexport const SORT = {\r\n YEAR_LO: \"year-lo\",\r\n YEAR_HI: \"year-hi\",\r\n HOURS_LO: \"hours-lo\",\r\n HOURS_HI: \"hours-hi\",\r\n MODEL_LO: \"model-lo\",\r\n MODEL_HI: \"model-hi\",\r\n PRICE_HI: \"price-hi\",\r\n PRICE_LO: \"price-lo\",\r\n};\r\n\r\nexport const PARAMS = {\r\n PROVINCE: \"province\",\r\n CITY: \"city\",\r\n YEAR_MIN: \"yrmin\",\r\n YEAR_MAX: \"yrmax\",\r\n CLASS: \"class\",\r\n SORT: \"sort\",\r\n MAKE: \"make\",\r\n PRICE_MAX: \"max\",\r\n KEYWORD: \"keyword\",\r\n HOURS_MAX: \"hrs\",\r\n CERTIFIED: \"certified\",\r\n BFE_INV: \"bfeinv\",\r\n VIEW_FAVES: \"fav\",\r\n VIEW_DEALS: \"deals\",\r\n PAGE: \"page\",\r\n FORM: \"form\",\r\n AVAILABLE: \"available\",\r\n IMAGES: \"images\",\r\n};\r\n\r\nexport const PHONENUMBERS = {\r\n HEAVY_TCAT: \"1-888-850-1455\",\r\n POWER_TCAT: \"1-888-513-3694\",\r\n BFE: \"1-866-606-1372\",\r\n BFERENTAL: \"1-866-542-1989\",\r\n JOBSITE: \"1-866-484-2739\",\r\n};\r\n\r\nexport const ELOQUAFORMS = {\r\n CONTACTFORM: {\r\n HEAVY: {\r\n CENTRAL: \"toromontcat_used_equipment\",\r\n QM: \"toromontcat_used_equipment_qm\",\r\n },\r\n POWER: {\r\n CENTRAL: \"toromontcat_used_power_systems\",\r\n QM: \"toromontcat_power_systems_QM\",\r\n },\r\n },\r\n FOOTERSUBSCRIBE: {\r\n HEAVY: {\r\n EN: \"used_equipment_footer_signup_New\",\r\n FR: \"used_equipment_footer_french\",\r\n },\r\n POWER: {\r\n EN: \"used_power_footer_signup_New\",\r\n FR: \"used_powerystems_footer_FR\",\r\n },\r\n },\r\n};\r\n\r\nexport const HUBSPOTFORMIDS = {\r\n CONTACTFORM: {\r\n HEAVY: {\r\n EN: \"4c808b24-ae08-46a7-b265-8c913b95f2df\",\r\n FR: \"1bac4921-bdf5-4b65-87d6-eaa61c6b6994\",\r\n },\r\n POWER: {\r\n EN: \"36c95e79-cb2d-45ec-a8c2-9ef704500c55\",\r\n FR: \"0b0b40aa-3841-4c05-a8bb-e2ada83bc5e3\",\r\n },\r\n },\r\n FOOTERSUBSCRIBE: {\r\n HEAVY: {\r\n EN: \"6ba78c3a-ced9-4ee9-8f5d-2c26b619fa43\",\r\n FR: \"7babf47e-0642-4896-915b-53706ed176f4\",\r\n },\r\n POWER: {\r\n EN: \"660bcf52-2e25-4a81-89ad-dcf54d98ea41\",\r\n FR: \"0917dfc4-fbbf-42d3-9ac9-8d53b547e652\",\r\n },\r\n },\r\n};\r\n\r\nexport const searchFiltersEmptyDefault: searchFilters = {\r\n categoryClass: CLASS_HEAVY,\r\n category: null,\r\n sortBy: null,\r\n make: null,\r\n maxPrice: null,\r\n keyword: null,\r\n province: null,\r\n yearMin: null,\r\n yearMax: null,\r\n hoursMax: null,\r\n city: null,\r\n certifiedOnly: false,\r\n battlefieldInventory: false,\r\n rentalFleetAvailability: false,\r\n rentalFleetWithImages: false,\r\n viewFaves: false,\r\n viewDeals: false,\r\n};\r\n","import {\r\n slug,\r\n getListingPageUrl,\r\n getSeoContentByCatCode,\r\n} from \"./SEO/SeoFunctions\";\r\nimport * as Types from \"../common/Types\";\r\nimport { Type_jsonModelDetails } from \"../common/Types\";\r\nimport * as Constants from \"./Constants\";\r\nimport accounting from \"accounting\";\r\nimport { renderToString } from \"react-dom/server\";\r\nimport _ from \"lodash\";\r\n\r\ntype Props_MachineImagesAndInfo = {\r\n lang: string;\r\n catCodeFromUrl: string;\r\n currentCatClass: string;\r\n jsonDataProduct: Type_jsonModelDetails | undefined;\r\n urlParams: string[];\r\n};\r\n\r\nexport const outputEnFr = (textEn, textFr, lang: string) => {\r\n return lang === \"fr\" ? textFr : textEn;\r\n};\r\n\r\n// All coming from URL\r\nexport const getJsonUrl = (pageType: number, lang: string, serial: string) => {\r\n let jsonUrl =\r\n \"https://tws.toromont.ca/ToromontCAT/ServiceHub/PublicInfo/equipment/used/N000\";\r\n\r\n if (Constants.isEnvironmentBFE) {\r\n //change json url if BFE\r\n jsonUrl =\r\n \"https://tws.toromont.ca/ToromontCAT/ServiceHub/PublicInfo/equipment/used/N001\";\r\n }\r\n\r\n if (Constants.isEnvironmentBFERENTAL) {\r\n //change json url if BFERENTAL\r\n jsonUrl =\r\n \"https://tws.toromont.ca/ToromontCAT/ServiceHub/PublicInfo/equipment/used/N001/selloff?smallEquipment=N\";\r\n }\r\n\r\n if (Constants.isEnvironmentJOBSITE) {\r\n //change json url if Jobsite\r\n jsonUrl =\r\n \"https://tws.toromont.ca/ToromontCAT/ServiceHub/PublicInfo/equipment/used/N001/selloff/jobsite\";\r\n }\r\n\r\n if (pageType === Constants.PageTypes.Details) {\r\n //Details page adds serial as parameter to json\r\n if (Constants.isEnvironmentBFERENTAL) {\r\n // Remove ?smallEquipment=N if present, as it throws null\r\n jsonUrl = jsonUrl.replace(/\\?smallEquipment=N$/, '');\r\n jsonUrl += \"/detail?equipmentId=\" + serial;\r\n } else if (Constants.isEnvironmentJOBSITE) {\r\n // The single product API details did not live under \"/jobsite/\" in the API's URL. It lives under \"/selloff/\", without \"/jobsite/\".\r\n // Split off the URL from /jobsite onward into two arrays, join up the first split array with both \"/\" and the second array which was empty, then join up the brand new URL with the unique serial.\r\n let urlSplit = jsonUrl.split(\"/jobsite\");\r\n let SingProdURL = urlSplit[0].concat(\"/\" + urlSplit[1]);\r\n let newURL = SingProdURL.concat(\"detail?equipmentId=\" + serial);\r\n\r\n if (lang === \"fr\") {\r\n let param = \"&\";\r\n let french = \"accept-language=fr-ca\";\r\n let newURL = SingProdURL.concat(\r\n \"detail?equipmentId=\" + serial + param + french\r\n );\r\n\r\n return newURL;\r\n }\r\n\r\n return newURL;\r\n } else {\r\n jsonUrl += \"/equipment/\" + serial;\r\n }\r\n }\r\n\r\n let param = \"?\";\r\n if (\r\n pageType === Constants.PageTypes.Details &&\r\n Constants.isEnvironmentBFERENTAL\r\n ) {\r\n param = \"&\";\r\n }\r\n\r\n if (\r\n pageType === Constants.PageTypes.Details &&\r\n Constants.isEnvironmentJOBSITE\r\n ) {\r\n param = \"&\";\r\n }\r\n\r\n // Return new json URL Pun supplied, without appending param + accept languages\r\n if (Constants.isEnvironmentBFERENTAL) {\r\n return jsonUrl;\r\n }\r\n\r\n if (lang === \"fr\") {\r\n jsonUrl += param + \"accept-language=fr-ca\";\r\n } else {\r\n jsonUrl += param + \"accept-language=en-ca\";\r\n }\r\n\r\n if (\r\n pageType === Constants.PageTypes.Listings ||\r\n pageType === Constants.PageTypes.Details ||\r\n pageType === Constants.PageTypes.Home\r\n ) {\r\n //won't load json unless these page types, not needed on specific pages\r\n return jsonUrl;\r\n }\r\n};\r\n\r\nexport function getImage(imageFileName) {\r\n //this is used because require can crash site if file not found\r\n let imagefile;\r\n try {\r\n imagefile = require(\"../../images/\" + imageFileName);\r\n } catch (err) {\r\n imagefile = null;\r\n }\r\n return imagefile;\r\n}\r\n\r\nexport function getPhoneNumber(currentClass): string {\r\n if (Constants.isEnvironmentBFE) {\r\n return Constants.PHONENUMBERS.BFE;\r\n } else if (Constants.isEnvironmentBFERENTAL) {\r\n return Constants.PHONENUMBERS.BFERENTAL;\r\n } else if (Constants.isEnvironmentJOBSITE) {\r\n return Constants.PHONENUMBERS.JOBSITE;\r\n } else if (currentClass === Constants.CLASS_POWER) {\r\n //power systems phone number\r\n return Constants.PHONENUMBERS.POWER_TCAT;\r\n } else {\r\n //regular heavy equipment phone number\r\n return Constants.PHONENUMBERS.HEAVY_TCAT;\r\n }\r\n}\r\nexport function getEloquaFormNameCONTACT(\r\n categoryClass,\r\n currentCategory,\r\n userSelectedProvince\r\n): string {\r\n if (isProvinceQM(userSelectedProvince)) {\r\n //QM\r\n if (categoryClass === Constants.CLASS_POWER) {\r\n //POWER\r\n return Constants.ELOQUAFORMS.CONTACTFORM.POWER.QM;\r\n } else {\r\n //HEAVY EQUIPMENT\r\n return Constants.ELOQUAFORMS.CONTACTFORM.HEAVY.QM;\r\n }\r\n } else {\r\n //Central\r\n if (categoryClass === Constants.CLASS_POWER) {\r\n //POWER\r\n return Constants.ELOQUAFORMS.CONTACTFORM.POWER.CENTRAL;\r\n } else {\r\n //HEAVY EQUIPMENT\r\n return Constants.ELOQUAFORMS.CONTACTFORM.HEAVY.CENTRAL;\r\n }\r\n }\r\n}\r\nexport function getEloquaFormNameFOOTER(\r\n lang,\r\n currentClass,\r\n currentCategory\r\n): string {\r\n if (\r\n currentClass === Constants.CLASS_POWER ||\r\n currentCategory === Constants.URLPOWER_SLUG\r\n ) {\r\n //power\r\n return lang === \"fr\"\r\n ? Constants.ELOQUAFORMS.FOOTERSUBSCRIBE.POWER.FR\r\n : Constants.ELOQUAFORMS.FOOTERSUBSCRIBE.POWER.EN;\r\n } else {\r\n //heavy equipment\r\n return lang === \"fr\"\r\n ? Constants.ELOQUAFORMS.FOOTERSUBSCRIBE.HEAVY.FR\r\n : Constants.ELOQUAFORMS.FOOTERSUBSCRIBE.HEAVY.EN;\r\n }\r\n}\r\nexport function isProvinceQM(provAbbr) {\r\n if (\r\n provAbbr === \"QC\" ||\r\n provAbbr === \"NS\" ||\r\n provAbbr === \"NB\" ||\r\n provAbbr === \"PE\"\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n}\r\n\r\nexport function isHeavyEquipmentCategory(UsedDataGroup) {\r\n const curCategoryClass = getCategoryClassFromValue(\r\n UsedDataGroup.equipments[0][\"product-family-categories\"][\"category-class\"]\r\n .name\r\n );\r\n const isHeavyEquipmentCategory =\r\n curCategoryClass === Constants.CLASS_HEAVY &&\r\n slug(UsedDataGroup[\"group-code\"]) !== Constants.URLPOWER_SLUG;\r\n return isHeavyEquipmentCategory;\r\n}\r\n\r\nexport function isPowerCategory(UsedDataGroup) {\r\n const isPowerCategory =\r\n slug(UsedDataGroup[\"group-code\"]) === Constants.URLPOWER_SLUG;\r\n return isPowerCategory;\r\n}\r\n\r\nexport function getCategoryClassFromValue(classVal) {\r\n classVal = classVal.toUpperCase();\r\n if (classVal === \"MACHINERY\" || classVal === \"MACHINERIE\") {\r\n return Constants.CLASS_HEAVY;\r\n } else if (\r\n classVal === \"POWER SYSTEMS\" ||\r\n classVal === \"SYSTÈME D'ALIMENTATION\" ||\r\n classVal === \"PRODUCTION D'ÉNERGIE\"\r\n ) {\r\n return Constants.CLASS_POWER;\r\n }\r\n return classVal;\r\n}\r\n\r\nexport function isEmpty(thing) {\r\n if (typeof thing !== \"undefined\" && thing !== null && thing !== \"\") {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n}\r\n\r\nexport function saferStringForUrl(string) {\r\n if (string != null) {\r\n string = _.deburr(string);\r\n string = string.toLowerCase();\r\n string = string.split(\"&\").join(\"+\");\r\n string = string.split(\"'\").join(\"\");\r\n string = string.split(\"- \").join(\"-\");\r\n string = string.split(\" \").join(\"-\");\r\n string = string.split(\"/\").join(\"-\");\r\n }\r\n return string;\r\n}\r\n\r\nexport function sortGroupsByDisplayName(UsedData) {\r\n return _.sortBy(UsedData, function (o) {\r\n if (o[\"group-display-name\"] != null) {\r\n return _.deburr(o[\"group-display-name\"]);\r\n }\r\n }); //asc\r\n}\r\n\r\nexport function saferString(string, deflt?) {\r\n if (string != null) {\r\n string = string.split(\"&\").join(\"+\");\r\n string = string.split(\"'\").join(\"'\");\r\n } else if (string == null && typeof deflt != \"undefined\") {\r\n string = deflt;\r\n } else {\r\n string = \"N/A\";\r\n }\r\n return string;\r\n}\r\n\r\nexport function badCityCheck(cityName) {\r\n if (cityName !== null && typeof cityName !== \"undefined\" && cityName !== \"\") {\r\n var namefix = cityName.toLowerCase();\r\n if (namefix === \"client\" || namefix === \"customer\" || namefix.length < 2) {\r\n return \"N/A\";\r\n }\r\n } else {\r\n return \"N/A\";\r\n }\r\n\r\n return cityName;\r\n}\r\nexport function setBodyClass(classesArray: string[]) {\r\n document.body.classList.remove(...document.body.classList);\r\n document.body.classList.add(...classesArray);\r\n}\r\n\r\nexport function getCategoryLinks(\r\n jsonDataGroups,\r\n lang\r\n): Types.type_linkList[] | null {\r\n if (typeof jsonDataGroups !== \"undefined\" && jsonDataGroups !== null) {\r\n let categoryLinks: Types.type_linkList[] = [];\r\n jsonDataGroups.forEach((group) => {\r\n if (Constants.isEnvironmentTCAT && !isHeavyEquipmentCategory(group)) {\r\n return;\r\n } //skip non-heavy for tcat\r\n categoryLinks.push({\r\n linkText: group[\"group-display-name\"] + \" (\" + group.count + \")\",\r\n linkUrl: getListingPageUrl(lang, group[\"group-code\"], false),\r\n groupCodeSlug: slug(group[\"group-code\"]),\r\n });\r\n });\r\n categoryLinks.sort(function (a, b) {\r\n //sort alphabeticaly\r\n if (a.linkText < b.linkText) {\r\n return -1;\r\n }\r\n if (a.linkText > b.linkText) {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n return categoryLinks;\r\n } else {\r\n return null;\r\n }\r\n}\r\n\r\nexport function formatHours(hours: number, lang: string) {\r\n var formattedHrs;\r\n var seperator = \"\";\r\n if (hours >= 10000) {\r\n seperator = \" \";\r\n }\r\n\r\n if (lang === \"fr\" && hours > 0) {\r\n formattedHrs = accounting.formatMoney(hours, \"\", 0, seperator);\r\n } else if (hours > 0) {\r\n formattedHrs = accounting.formatMoney(hours, \"\", 0);\r\n } else {\r\n formattedHrs = \"---\";\r\n }\r\n return formattedHrs;\r\n}\r\nexport function getProductPhotoSrc(data, num) {\r\n let machineImage = Constants.IMAGES.NOIMG_DEFAULTSRC_BFERENTAL;\r\n\r\n if (\r\n typeof data.photos != \"undefined\" &&\r\n typeof data.photos[num] != \"undefined\"\r\n ) {\r\n if (typeof data.photos[num][\"text\"] != \"undefined\") {\r\n machineImage = data.photos[num][\"text\"].replace(\"http://\", \"//\");\r\n } else if (typeof data.photos[num][\"uri\"] != \"undefined\") {\r\n machineImage = data.photos[num][\"uri\"].replace(\"http://\", \"//\");\r\n }\r\n }\r\n return machineImage;\r\n}\r\nexport function handleImageLoadError(e) {\r\n e.target.src = Constants.IMAGES.NOIMG_DEFAULTSRC_BFERENTAL;\r\n}\r\n\r\nexport function getProductName(jsonDataProduct: Types.Type_jsonModelDetails) {\r\n return (\r\n (jsonDataProduct.year ? jsonDataProduct.year + \" \" : \"\") +\r\n (jsonDataProduct.manufacturer != null\r\n ? jsonDataProduct.manufacturer + \" \"\r\n : \"\") +\r\n (jsonDataProduct.model != null ? jsonDataProduct.model : \"\")\r\n );\r\n}\r\n\r\nexport function getDealerName(jsonDataProduct: Types.Type_jsonModelDetails) {\r\n return jsonDataProduct[\"dealer-name\"];\r\n}\r\n\r\nexport function cityGroupingValue(cityName) {\r\n if (cityName) {\r\n var grpValue = _.deburr(badCityCheck(cityName));\r\n\r\n grpValue = grpValue.toLowerCase();\r\n grpValue = grpValue.split(\"'\").join(\"\"); //apostrophe\r\n grpValue = grpValue.split(\")\").join(\"\"); //r bracket\r\n grpValue = grpValue.split(\"(\").join(\"\"); //l bracket\r\n grpValue = grpValue.split(\".\").join(\"\"); //period\r\n grpValue = grpValue.split(\" \").join(\"\"); //spaces\r\n grpValue = grpValue.split(\"/\").join(\"\"); //slash\r\n grpValue = grpValue.split(\"|\").join(\"\"); //pipe\r\n grpValue = grpValue.split(\"-\").join(\"\"); //dashes\r\n return grpValue;\r\n } else {\r\n return \"na\";\r\n }\r\n}\r\n\r\nexport function hasWord(product, keyword) {\r\n if (typeof keyword === \"undefined\") {\r\n keyword = \"\";\r\n } else {\r\n //strip junk words from search\r\n keyword = keyword.replace(/for/gi, \"\");\r\n keyword = keyword.replace(/sale/gi, \"\");\r\n keyword = keyword.replace(/used/gi, \"\");\r\n keyword = keyword.replace(/heavy/gi, \"\");\r\n keyword = keyword.replace(/equipment/gi, \"\");\r\n keyword = keyword.replace(/for sale/gi, \"\");\r\n keyword = keyword.replace(/canada/gi, \"\");\r\n keyword = keyword.replace(/toromont/gi, \"\");\r\n keyword = keyword.replace(/construction/gi, \"\");\r\n keyword = keyword.replace(/\\+/g, \" \");\r\n }\r\n let foundAllWords = true;\r\n const split = keyword.split(\" \");\r\n\r\n //split by each word so can check that all words are found\r\n for (let i = 0; i < split.length; ++i) {\r\n let foundCurWord = false;\r\n\r\n //everything is deburred and lowercased to avoid differences in text characters\r\n const curWord = _.deburr(split[i].toLowerCase());\r\n\r\n /*model*/\r\n if (\r\n product.model != null &&\r\n _.deburr(product.model).toLowerCase().indexOf(curWord) > -1\r\n ) {\r\n foundCurWord = true;\r\n }\r\n /*year*/\r\n if (\r\n product.year != null &&\r\n product.year.toLowerCase().indexOf(curWord) > -1\r\n ) {\r\n foundCurWord = true;\r\n }\r\n /*unit number - must match entirety*/\r\n if (\r\n typeof product[\"stock-number\"] != \"undefined\" &&\r\n product[\"stock-number\"] != null &&\r\n _.deburr(product[\"stock-number\"]).toLowerCase() === curWord\r\n ) {\r\n //not using indexof = strict search full stock num\r\n foundCurWord = true;\r\n }\r\n /*serial number - must match entirety*/\r\n if (\r\n typeof product[\"serial-number\"] != \"undefined\" &&\r\n product[\"serial-number\"] != null &&\r\n _.deburr(product[\"serial-number\"]).toLowerCase() === curWord\r\n ) {\r\n //not using indexof = strict search full serial num\r\n foundCurWord = true;\r\n }\r\n /*category display name*/\r\n if (\r\n typeof product[\"product-family-categories\"] != \"undefined\" &&\r\n product[\"product-family-categories\"][\"category\"] != null &&\r\n product[\"product-family-categories\"][\"category\"][\r\n \"category-display-name\"\r\n ] != null &&\r\n _.deburr(\r\n product[\"product-family-categories\"][\"category\"][\r\n \"category-display-name\"\r\n ]\r\n )\r\n .toLowerCase()\r\n .indexOf(curWord) > -1\r\n ) {\r\n foundCurWord = true;\r\n }\r\n /*category-code*/\r\n if (\r\n typeof product[\"product-family-categories\"] != \"undefined\" &&\r\n product[\"product-family-categories\"][\"category\"] != null &&\r\n product[\"product-family-categories\"][\"category\"][\"category-code\"] !=\r\n null &&\r\n _.deburr(\r\n product[\"product-family-categories\"][\"category\"][\"category-code\"]\r\n )\r\n .toLowerCase()\r\n .indexOf(curWord) > -1\r\n ) {\r\n foundCurWord = true;\r\n }\r\n /*product-family-code*/\r\n if (\r\n typeof product[\"product-family-display-name\"] != \"undefined\" &&\r\n _.deburr(product[\"product-family-display-name\"])\r\n .toLowerCase()\r\n .indexOf(curWord) > -1\r\n ) {\r\n foundCurWord = true;\r\n }\r\n /*city*/\r\n if (\r\n product.city != null &&\r\n _.deburr(product.city).toLowerCase().indexOf(curWord) > -1\r\n ) {\r\n foundCurWord = true;\r\n }\r\n /*province - check against both eng and fr*/\r\n if (\r\n product.state != null &&\r\n (_.deburr(getProvinceName(product.state, \"en\"))\r\n .toLowerCase()\r\n .indexOf(curWord) > -1 ||\r\n _.deburr(getProvinceName(product.state, \"fr\"))\r\n .toLowerCase()\r\n .indexOf(curWord) > -1)\r\n ) {\r\n foundCurWord = true;\r\n }\r\n /*make*/\r\n if (\r\n product.manufacturer != null &&\r\n _.deburr(product.manufacturer).toLowerCase().indexOf(curWord) > -1\r\n ) {\r\n foundCurWord = true;\r\n }\r\n\r\n const seoDescs: Types.types_seoData = getSeoContentByCatCode(\r\n slug(product[\"product-family-categories\"][\"category\"][\"category-code\"])\r\n );\r\n const seoDescEn = stripHtml(renderToString(seoDescs.EN.Desc));\r\n const seoDescFr = stripHtml(renderToString(seoDescs.EN.Desc));\r\n\r\n /*category descriptions english*/\r\n //search full family description - html parsed to unescape characters\r\n if (\r\n seoDescs.CatCode !== \"Default\" &&\r\n (_.deburr(seoDescEn).toLowerCase().indexOf(curWord) > -1 ||\r\n _.deburr(seoDescFr).toLowerCase().indexOf(curWord) > -1)\r\n ) {\r\n foundCurWord = true;\r\n }\r\n\r\n //must have found each word in order for foundAllWords to be true\r\n if (foundCurWord === false) {\r\n foundAllWords = false;\r\n }\r\n }\r\n return foundAllWords;\r\n}\r\n\r\nfunction stripHtml(html) {\r\n var regex = /( |<([^>]+)>)/gi,\r\n body = html,\r\n result = body.replace(regex, \" \");\r\n return result;\r\n}\r\n\r\nexport function checkEnvironment(envToCompare?) {\r\n if (\r\n envToCompare &&\r\n process !== null &&\r\n process.env !== null &&\r\n process.env.REACT_APP_DEPLOYMENT_ENVIRONMENT !== null\r\n ) {\r\n if (process.env.REACT_APP_DEPLOYMENT_ENVIRONMENT === envToCompare) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n return false;\r\n }\r\n}\r\n\r\nexport function getProvinceName(origName, lang) {\r\n let fullName = origName;\r\n if (origName == null || origName === \"undefined\") {\r\n origName = \"CAN\"; // Set a default value when origName is null or undefined\r\n }\r\n if (origName.length < 3) {\r\n //name is abbreviation\r\n switch (origName) {\r\n case \"CAN\":\r\n fullName = \"Canada\";\r\n break;\r\n case \"NL\":\r\n fullName = \"Newfoundland and Labrador\";\r\n break;\r\n case \"PE\":\r\n fullName = \"Prince Edward Island\";\r\n break;\r\n case \"NS\":\r\n fullName = \"Nova Scotia\";\r\n break;\r\n case \"NB\":\r\n fullName = \"New Brunswick\";\r\n break;\r\n case \"ON\":\r\n fullName = \"Ontario\";\r\n break;\r\n case \"QC\":\r\n fullName = \"Quebec\";\r\n break;\r\n case \"MB\":\r\n fullName = \"Manitoba\";\r\n break;\r\n case \"SK\":\r\n fullName = \"Saskatchewan\";\r\n break;\r\n case \"AB\":\r\n fullName = \"Alberta\";\r\n break;\r\n case \"YT\":\r\n fullName = \"Yukon\";\r\n break;\r\n case \"NU\":\r\n fullName = \"Nunavut\";\r\n break;\r\n case \"NT\":\r\n fullName = \"Northwest Territories\";\r\n break;\r\n case \"BC\":\r\n fullName = \"British Columbia\";\r\n break;\r\n default:\r\n fullName = \"Other\";\r\n break;\r\n }\r\n }\r\n\r\n return lang === \"fr\" ? getProvinceNameInFrench(fullName) : fullName;\r\n}\r\n\r\nexport function getProvinceNameInFrench(originalName) {\r\n switch (originalName) {\r\n case \"Newfoundland and Labrador\":\r\n return \"Terre-Neuve-et-Labrador\";\r\n case \"Prince Edward Island\":\r\n return \"Île-du-Prince-Édouard\";\r\n case \"Nova Scotia\":\r\n return \"Nouvelle-Écosse\";\r\n case \"New Brunswick\":\r\n return \"Nouveau-Brunswick\";\r\n case \"Quebec\":\r\n return \"Québec\";\r\n case \"Northwest Territories\":\r\n return \"Territoires du Nord-Ouest\";\r\n case \"British Columbia\":\r\n return \"Colombie-Britannique\";\r\n default:\r\n return originalName;\r\n }\r\n}\r\n\r\nexport function cityDisplayName(cityName) {\r\n var dispName = cityName;\r\n dispName = dispName.toUpperCase();\r\n dispName = dispName.split(\"- \").join(\"-\");\r\n return dispName;\r\n}\r\n\r\nexport const getSearchFiltersFromUrl = (\r\n categoryClass: string,\r\n category: string,\r\n urlParams: string[]\r\n): Types.searchFilters => ({\r\n categoryClass: categoryClass,\r\n category: category,\r\n sortBy: urlParams[Constants.PARAMS.SORT],\r\n make: urlParams[Constants.PARAMS.MAKE],\r\n maxPrice: urlParams[Constants.PARAMS.PRICE_MAX],\r\n keyword: urlParams[Constants.PARAMS.KEYWORD],\r\n province: urlParams[Constants.PARAMS.PROVINCE],\r\n yearMin: ConverterNumber(urlParams[Constants.PARAMS.YEAR_MIN]),\r\n yearMax: ConverterNumber(urlParams[Constants.PARAMS.YEAR_MAX]),\r\n hoursMax: urlParams[Constants.PARAMS.HOURS_MAX],\r\n city: urlParams[Constants.PARAMS.CITY],\r\n certifiedOnly: urlParams[Constants.PARAMS.CERTIFIED] === \"1\",\r\n battlefieldInventory: urlParams[Constants.PARAMS.BFE_INV] === \"1\",\r\n rentalFleetAvailability: urlParams[Constants.PARAMS.AVAILABLE] === \"1\",\r\n rentalFleetWithImages: urlParams[Constants.PARAMS.IMAGES] === \"1\",\r\n viewFaves:\r\n category === Constants.URLFAVES_EN || category === Constants.URLFAVES_FR,\r\n viewDeals: category === \"deals\",\r\n});\r\n\r\n// export function getUrlParams(catCode) {\r\n// let urlParams: Types.searchFilters = {\r\n// categoryClass: Constants.CLASS_HEAVY,\r\n// category: catCode,\r\n// sortBy: urlParam(Constants.PARAMS.SORT),\r\n// make: urlParam(Constants.PARAMS.MAKE),\r\n// maxPrice: !isNaN(Number(urlParam(Constants.PARAMS.PRICE_MAX))) ? Number(urlParam(Constants.PARAMS.PRICE_MAX)) : null,\r\n// keyword: urlParam(Constants.PARAMS.KEYWORD),\r\n// province: urlParam(Constants.PARAMS.PROVINCE),\r\n// yearMin: !isNaN(Number(urlParam(Constants.PARAMS.YEAR_MIN))) ? Number(urlParam(Constants.PARAMS.YEAR_MIN)) : null,\r\n// yearMax: !isNaN(Number(urlParam(Constants.PARAMS.YEAR_MAX))) ? Number(urlParam(Constants.PARAMS.YEAR_MAX)) : null,\r\n// hoursMax: !isNaN(Number(urlParam(Constants.PARAMS.HOURS_MAX))) ? Number(urlParam(Constants.PARAMS.HOURS_MAX)) : null,\r\n// city: urlParam(Constants.PARAMS.CITY),\r\n// certifiedOnly: (urlParam(Constants.PARAMS.CERTIFIED) === 1),\r\n// viewFaves: (urlParam(Constants.PARAMS.VIEW_FAVES) === 1),\r\n// viewDeals: (urlParam(Constants.PARAMS.VIEW_DEALS)===1)\r\n// }\r\n// if (urlParam(Constants.PARAMS.CLASS) === Constants.URLPOWER_EN || urlParam(Constants.PARAMS.CLASS) === Constants.URLPOWER_FR) {\r\n// urlParams.categoryClass = Constants.CLASS_POWER;\r\n// if (catCode===Constants.URLPOWER_SLUG){urlParams.category=null;}//fix for power class\r\n// } else {\r\n// urlParams.categoryClass = Constants.CLASS_HEAVY;\r\n// }\r\n// //fix category if default no category word\r\n// if (catCode === Constants.ALLFAMSWORD_EN || catCode === Constants.ALLFAMSWORD_FR) {\r\n// urlParams.category = null;\r\n// }\r\n// return urlParams;\r\n// }\r\n\r\nexport function formatPrice(\r\n price,\r\n lang,\r\n inclCurTxt?: boolean,\r\n currency?: \"USD\" | \"CAD\",\r\n receivedCurrency?: string\r\n) {\r\n let formattedPrice = price;\r\n\r\n let usaRate = 0.77;\r\n\r\n if (lang === \"fr\") {\r\n //FRENCH\r\n const currencyText = inclCurTxt ? \"CAD\" : \"\";\r\n\r\n if (currency != null && currency === \"USD\") {\r\n //USD\r\n formattedPrice =\r\n accounting.formatMoney(Number(price) * usaRate, \"\", 0, \" \") +\r\n \" $\" +\r\n currencyText;\r\n } else {\r\n //CAD\r\n formattedPrice =\r\n accounting.formatMoney(price, \"\", 0, \" \") + \" $\" + currencyText;\r\n }\r\n // Alter conversions for BFE (French)\r\n if (Constants.isEnvironmentBFE_or_BFERENTAL) {\r\n if (currency !== receivedCurrency) {\r\n formattedPrice =\r\n receivedCurrency === \"CAD\"\r\n ? accounting.formatMoney(Number(price) * usaRate, \" \", \" \") + \" $\"\r\n : accounting.formatMoney(Number(price) / usaRate, \" \", \" \") + \" $\";\r\n } else {\r\n formattedPrice =\r\n accounting.formatMoney(Number(price), \" \", \" \") +\r\n \" \" +\r\n \" $\" +\r\n \" \" +\r\n currencyText;\r\n }\r\n }\r\n } else {\r\n //ENGLISH\r\n const currencyText = inclCurTxt ? \" CAD\" : \"\";\r\n if (currency != null && currency === \"USD\") {\r\n //USD\r\n formattedPrice =\r\n accounting.formatMoney(Number(price) * usaRate, \"$\", 0) + currencyText;\r\n } else {\r\n //CAD\r\n formattedPrice = accounting.formatMoney(price, \"$\", 0) + currencyText;\r\n }\r\n\r\n // check undefined logic goes here\r\n\r\n // Alter conversions for BFE (English) on single product pages\r\n if (Constants.isEnvironmentBFE_or_BFERENTAL) {\r\n if (currency !== receivedCurrency) {\r\n formattedPrice =\r\n receivedCurrency === \"CAD\"\r\n ? accounting.formatMoney(Number(price) * usaRate, \"$\", 0) +\r\n currencyText\r\n : accounting.formatMoney(Number(price) / usaRate, \"$\", 0) +\r\n currencyText;\r\n } else {\r\n formattedPrice =\r\n accounting.formatMoney(Number(price), \"$\", 0) + currencyText;\r\n // this shows up on ALL prices (cdn or usd) on the listings page, and ONLY\r\n // on American prices on the single products.\r\n }\r\n }\r\n }\r\n return formattedPrice;\r\n}\r\nexport function formatNumberText(textInputValue, lang) {\r\n if (Number(textInputValue) > 0) {\r\n return outputEnFr(\r\n accounting.formatMoney(textInputValue, \"\", 0),\r\n accounting.formatMoney(textInputValue, \"\", 0, \" \"),\r\n lang\r\n );\r\n }\r\n return \"\";\r\n}\r\n\r\nexport const ConverterString = (value: any) => {\r\n if (value === null || value === undefined || typeof value === \"string\")\r\n return value;\r\n\r\n return value.toString();\r\n};\r\n\r\nexport const ConverterBoolean = (value: any) => {\r\n if (value === null || value === undefined || typeof value === \"boolean\")\r\n return value;\r\n\r\n return value.toString() === \"true\";\r\n};\r\n\r\nexport const ConverterNumber = (value: any) => {\r\n if (value === null || value === undefined || typeof value === \"number\")\r\n return value;\r\n\r\n return parseFloat(value.toString());\r\n};\r\n\r\n//function to get cookie\r\nexport function getCookie(cname) {\r\n var name = cname + \"=\";\r\n var decodedCookie = decodeURIComponent(document.cookie);\r\n var ca = decodedCookie.split(\";\");\r\n for (var i = 0; i < ca.length; i++) {\r\n var c = ca[i];\r\n while (c.charAt(0) === \" \") {\r\n c = c.substring(1);\r\n }\r\n if (c.indexOf(name) === 0) {\r\n return c.substring(name.length, c.length);\r\n }\r\n }\r\n return \"\";\r\n}\r\n","import React from \"react\";\r\nimport { types_seoData } from \"../Types\";\r\n\r\nconst SEO_BFE: types_seoData[] = [\r\n {\r\n CatCode: \"Default\",\r\n CatCodeSlug: \"products\",\r\n\r\n EN: {\r\n Name: \"Battlefield Equipment Rentals\",\r\n Meta:\r\n \"At Battlefield Equipment Rentals, you will find the largest inventory of used Cat compact equipment in Eastern Canada. From landscaping to construction and excavating to road building, our powerhouse selection offers increased value and top-notch performance in all types of environments. Battlefield Equipment Rentals is your authorized Caterpillar Dealer in Manitoba, Ontario, Quebec, New Brunswick, Nova Scotia, P.E.I., Newfoundland and Labrador.\",\r\n Desc:\r\n \"At Battlefield Equipment Rentals, you will find the largest inventory of used Cat compact equipment in Eastern Canada. From landscaping to construction and excavating to road building, our powerhouse selection offers increased value and top-notch performance in all types of environments. Battlefield Equipment Rentals is your authorized Caterpillar Dealer in Manitoba, Ontario, Quebec, New Brunswick, Nova Scotia, P.E.I., Newfoundland and Labrador.\",\r\n ExtraText: null,\r\n },\r\n FR: {\r\n Name: \"Location d’équipement Battlefield\",\r\n Meta:\r\n \"Chez Location d’équipement Battlefield, vous trouverez le plus grand inventaire d’équipement usagé Cat dans l’est du Canada. Que ce soit pour des applications de construction, de pavage, de concassage ou forestières, notre sélection d’équipement offre une valeur accrue et une performance inégalée dans tous les types d’environnements. Location d’équipement Battlefield est votre concessionnaire Caterpillar autorisé au Manitoba, en Ontario, au Québec, au Nouveau-Brunswick, en Nouvelle-Écosse, à l’Île-du-Prince-Édouard, à Terre-Neuve et Labrador et au Nunavut.\",\r\n Desc:\r\n \"Chez Location d’équipement Battlefield, vous trouverez le plus grand inventaire d’équipement usagé Cat dans l’est du Canada. Que ce soit pour des applications de construction, de pavage, de concassage ou forestières, notre sélection d’équipement offre une valeur accrue et une performance inégalée dans tous les types d’environnements. Location d’équipement Battlefield est votre concessionnaire Caterpillar autorisé au Manitoba, en Ontario, au Québec, au Nouveau-Brunswick, en Nouvelle-Écosse, à l’Île-du-Prince-Édouard, à Terre-Neuve et Labrador et au Nunavut.\",\r\n ExtraText: null,\r\n },\r\n },\r\n {\r\n CatCode: \"Articulated Trucks - Tombereaux Articulés\",\r\n CatCodeSlug: \"articulated-trucks-tombereaux-articules\",\r\n EN: {\r\n Name: \"Articulated Trucks\",\r\n Meta:\r\n \"Operational efficiency is maximized thanks to our rock-solid selection of used articulated trucks. Our dump trucks are ultra-tough, offering unmatched performance and traction control on rough or uneven terrain.\",\r\n Desc: (\r\n <>\r\n

Used Articulated Trucks – Built to Last!

\r\n

\r\n Does your construction site require an ultra-tough, reliable and\r\n cost-effective dump truck? Look no further than Battlefield\r\n Equipment Rentals's extensive selection of used articulated trucks!\r\n Regardless of the heavy materials you need to haul or your project's\r\n budget, Battlefield Equipment Rentals has the used dump truck to\r\n meet your specific needs and get the job done right!\r\n

\r\n

Used Articulated / Dump Trucks for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Need the Best Used Articulated Truck to start hauling ASAP?

\r\n

\r\n From Nova Scotia to Nunavut, Battlefield Equipment Rentals has a\r\n wide selection of used articulated trucks that are ready to get to\r\n work! Our used dump trucks are durable and ready to handle payloads\r\n ranging in weight from 26.5 ton to 45.2 ton. Whatever you need to\r\n haul away – from rocks to cement to soil – our used articulated\r\n trucks can carry it all with ease! Our used dump trucks always\r\n handle rough and uneven terrain like a pro, because of a superior\r\n traction control system. Battlefield Equipment Rentals used\r\n articulated trucks also contain advanced technologies and features\r\n like tipping and load dumping control, which help to reduce cycle\r\n times and fuel consumption. Our used dump trucks can come\r\n Caterpillar Certified and range in price from $25,000 CAD to\r\n $700,000 CAD.\r\n

\r\n
\r\n
\r\n Get Your Used Articulated Truck from Battlefield Equipment Rentals\r\n Today!\r\n
\r\n

\r\n Experience how much faster and cheaper you can get your hauling done\r\n with a used articulated truck from Battlefield Equipment Rentals!\r\n Caterpillar's used dump trucks are built to last and always get the\r\n job done right! Discover the difference a Caterpillar dump truck can\r\n make on your site! Contact us today for more information about our\r\n used articulated trucks or to get a quote for your next project!\r\n

\r\n

\r\n You can also find more information about our articulated trucks on{\" \"}\r\n \r\n Cat's official site\r\n \r\n .\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Tombereaux Articulés\",\r\n Meta:\r\n \"L’efficacité opérationnelle est maximisée grâce à notre sélection solide de tombereaux articulés usagés. Nos tombereaux sont ultra robustes, fournissant une performance accrue et un superbe contrôle de traction sur terrain rugueux ou accidenté.\",\r\n Desc: (\r\n <>\r\n

TOMBEREAUX ARTICULÉS USAGÉS

\r\n

\r\n Est-ce que vous avez besoin d’un tombereau résistant, fiable et\r\n rentable? Nous avons chez Location d’équipement Battlefield un choix\r\n étendu de tombereaux articulés usagés! Peu importe les matériaux\r\n lourds que vous devez transporter ou le budget de votre projet,\r\n Location d’équipement Battlefield a le camion articulé usagé qui\r\n répondra à vos besoins spécifiques et fera le travail correctement!\r\n

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

\r\n Avez-vous besoin du meilleur tombereau articulé usagé maintenant?\r\n

\r\n

\r\n De la Nouvelle-Écosse au Nunavut, Location d’équipement Battlefield\r\n a une vaste sélection de tombereaux articulés usagés prêts à se\r\n mettre au travail! Nos tombereaux articulés usagés sont durables et\r\n capables de manipuler des charges utiles allant de 26,5 tonnes à\r\n 45,2 tonnes. Tout ce que vous avez besoin de transporter - des\r\n roches au ciment en passant par la terre - nos tombereaux articulés\r\n usagés peuvent tout déplacer avec facilité! Nos tombereaux articulés\r\n usagés se comportent toujours comme un pro sur les terrains\r\n accidentés et inégaux, grâce à un système de contrôle de la traction\r\n supérieur. Les tombereaux articulés usagés Location d’équipement\r\n Battlefield contiennent également des technologies et des\r\n caractéristiques avancées comme le contrôle de basculement et de\r\n déversement de la charge, qui aident à réduire les temps de cycle et\r\n la consommation de carburant. Nos tombereaux articulés usagés\r\n peuvent être certifiés Caterpillar et leur prix varie de 25 000$ CAN\r\n à 700 000$ CAN.\r\n

\r\n
\r\n
\r\n Achetez votre tombereau articulé usagé chez Battlefield Equipment\r\n Rentals dès aujourd'hui!\r\n
\r\n

\r\n Découvrez comment vous pouvez effectuer votre transport plus\r\n rapidement et à moindre coût avec un tombereau articulé usagé\r\n Location d’équipement Battlefield! Les tombereaux articulés usagés\r\n de Caterpillar sont construits pour durer et toujours bien faire le\r\n travail! Faites la différence sur votre chantier avec un tombereau\r\n articulé Caterpillar! Contactez-nous dès aujourd'hui pour plus\r\n d'information sur nos tombereaux articulés usagés ou pour obtenir un\r\n devis pour votre prochain projet!\r\n

\r\n

\r\n Trouvez plus d'information sur nos tombereaux articulés usagés sur\r\n le site web officiel de Caterpillar.\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Backhoe Loaders - Chargeuses-pelleteuses\",\r\n CatCodeSlug: \"backhoe-loaders-chargeuses-pelleteuses\",\r\n EN: {\r\n Name: \"Backhoe Loaders\",\r\n Meta:\r\n \"Our used Backhoe Loaders are a must-have for a variety of tasks, such as general construction, demolitions and excavations, landscaping, asphalt breaking and road paving.\",\r\n Desc: (\r\n <>\r\n

Used Backhoe Loaders for a Wide Variety of Tasks

\r\n

\r\n Backhoe loaders are necessary for a variety of tasks, such as\r\n general construction, demolition and excavating, landscaping,\r\n asphalt breaking and road paving. Are you looking for a used backhoe\r\n loader with a powerful engine, superior digging capability and the\r\n durability to handle any terrain? Battlefield Equipment Rentals\r\n carries a large selection of used backhoe loaders to help you\r\n complete your next project on time and under budget!\r\n

\r\n

Used Backhoe Loaders for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Need the Best Used Backhoe Loader for Your Next Project?

\r\n

\r\n A backhoe loader is an essential piece of equipment on your site, so\r\n invest in the used backhoe loader that is reliable, versatile and\r\n can help you get the job done faster! Our used backhoe loaders\r\n continue to be a popular choice in urban engineering and\r\n construction projects because of their small, compact design, which\r\n provides machine versatility and allows them to go virtually\r\n anywhere. Despite their small size, our used backhoe loaders are\r\n quite powerful, ranging in net power from 68HP to 131HP. Equipping\r\n yourself with one of our used backhoe loaders means precise control\r\n and top-of-the-line performance that will improve construction\r\n productivity and lower machine operating costs!\r\n

\r\n
\r\n
\r\n Get Your Used Backhoe Loader from Battlefield Equipment Rentals\r\n Today!\r\n
\r\n

\r\n If you need a backhoe loader that can handle challenging terrains,\r\n carry materials and dig through almost anything, choose a\r\n Caterpillar! Battlefield Equipment Rentals has a wide selection of\r\n used Caterpillar backhoe loaders that come Caterpillar Certified,\r\n starting at $20,000 CAD. Contact us today for more information about\r\n our available used backhoe loaders or to get a quote for your next\r\n project!\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Rétrocaveuses\",\r\n Meta:\r\n \"Nos rétrocaveuses usagées à vendre sont indispensables pour une variété de travaux. Grâce à leur châssis compact, nos pépines d’occasion peuvent aller n’importe où, ce qui en fait un choix populaire pour les projets d’ingénierie ou de construction qui nécessitent une performance supérieure.\",\r\n Desc: (\r\n <>\r\n

Rétrocaveuses usagées pour une vaste gamme d’applications

\r\n

\r\n Les rétrocaveuses sont nécessaires pour une variété de travaux,\r\n comme la construction, l’excavation, la démolition, l’aménagement\r\n paysager, le travail d’asphalte et le pavage routier. Cherchez-vous\r\n une rétrocaveuse usagée avec un moteur puissant, une performance\r\n supérieure en matière de creusement et la durabilité pour affronter\r\n n’importe quel terrain? Location d’équipement Battlefield offre une\r\n vaste sélection de pépines usagées pour vous aider à compléter votre\r\n projet à temps et en deçà du budget!\r\n

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

\r\n Besoin de la meilleure rétrocaveuse usagée pour votre prochain\r\n projet?\r\n

\r\n

\r\n Sur votre chantier, une rétrocaveuse est une pièce d’équipement\r\n essentielle. Il est donc important de choisir une pépine usagée qui\r\n est fiable, polyvalente et qui peut vous aider à en accomplir\r\n beaucoup plus! Nos rétrocaveuses usagées sont un choix populaire\r\n pour les projets d’ingénierie et de construction grâce à leur\r\n châssis compact – qui leur permet d’aller n’importe où! En dépit de\r\n leurs dimensions, nos rétrocaveuses usagées sont performantes et\r\n livrent une puissance de 68 HP à 131 HP. En vous équipant d’une de\r\n nos rétrocaveuses usagées, vous obtiendrez un contrôle précis et une\r\n performance inégalable qui amélioreront votre productivité et\r\n réduiront vos coûts d’entretien!\r\n

\r\n
\r\n

\r\n Achetez votre pépine usagée chez Location d’équipement Battlefield\r\n dès aujourd’hui!\r\n

\r\n

\r\n Si vous avez besoin d’une rétrocaveuse qui fournit une maniabilité\r\n précise sur les terrains difficiles, qui porte les matériaux lourds\r\n et qui creuse partout, choisissez un Cat®! Location d’équipement\r\n Battlefield a une vaste sélection de pépines usagées qui peuvent\r\n être certifiées Caterpillar, et dont les prix commencent à 20 000 $\r\n CAD. Contactez-nous aujourd’hui pour obtenir plus d’informations sur\r\n nos rétrocaveuses usagées ou demander un devis pour votre prochain\r\n projet!\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Compactors - Compacteurs\",\r\n CatCodeSlug: \"compactors-compacteurs\",\r\n EN: {\r\n Name: \"Compactors\",\r\n Meta:\r\n \"Battlefield Equipment Rentals’ Industrial Compactors feature advanced technologies that boost durability, operational performance and efficacy.\",\r\n ExtraText: (\r\n <>\r\n

Looking to Purchase a Used Compactor for Your Next Project?

\r\n

\r\n Compacting to specifications is crucial for a variety of\r\n applications, so choose the Caterpillar compactor that is specially\r\n designed to handle your specific compaction tasks. Our used\r\n compactors feature advanced technologies that boost durability,\r\n operational performance and efficacy. Whether flattening soil,\r\n compacting landfill material or smoothing the surface of a newly\r\n paved road, our selection of combination rollers will offer value\r\n where it is needed most. If you need a soil compactor in Winnipeg, a\r\n pneumatic roller in Toronto or a landfill compactor in\r\n Pointe-Claire, Battlefield Equipment Rentals has the used compactor\r\n you need! Our used compactors are affordable (starting at $13,500\r\n CAD) and many come Caterpillar Certified.{\" \"}\r\n

\r\n
\r\n
\r\n Get Your Used Compactor from Battlefield Equipment Rentals Today!\r\n
\r\n

\r\n If your landfill, agricultural or construction site needs a\r\n compactor, choose a used Caterpillar compactor from Battlefield\r\n Equipment Rentals! We carry a wide selection of compactors (soil,\r\n vibratory soil and landfill) and rollers (pneumatic and tandem\r\n vibratory) that are affordable, cost-effective and backed by\r\n Caterpillar. Contact us today for more information about our range\r\n of used compactors!{\" \"}\r\n

\r\n \r\n ),\r\n Desc: (\r\n <>\r\n

Wide Selection of Used Compactors Available

\r\n

\r\n Wide Selection of Used Compactors Available Compactors are an\r\n important tool for many road building, landfill and construction\r\n sites, so it is essential to choose the used compactor specific to\r\n your needs. Are you looking for a dependable used compactor for your\r\n next project? If you require a soil compactor, vibratory soil\r\n compactor, landfill compactor, pneumatic rollers or tandem vibratory\r\n rollers, Battlefield Equipment Rentals has the used Caterpillar\r\n compactor to match your project needs and get the job done!\r\n

\r\n

Used Compactors for Sale:

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Compacteurs\",\r\n Meta:\r\n \"Les compacteurs d’occasion de Location d’équipement Battlefield sont dotés de technologies avancées qui augmentent la durabilité, la performance et l’efficacité pour optimiser votre productivité sur le chantier. Nos rouleaux compacteurs usagés offrent un maximum de valeur pour tous vos besoins.\",\r\n Desc: (\r\n <>\r\n

Une vaste sélection de compacteurs usagés disponibles

\r\n

\r\n Les compacteurs sont un outil important pour de nombreux projets\r\n d’agriculture, de construction et de compactage. Il est donc\r\n essentiel de choisir le compacteur le mieux adapté à vos besoins.\r\n Cherchez-vous un compacteur usagé sûr pour votre prochain projet? Si\r\n vous avez besoin d’un compacteur du sol, d’un compacteur du sol\r\n vibrant, d’un compacteur de décharge, d’un rouleau pneumatique ou\r\n d’un rouleau vibrant, Location d’équipement Battlefield a le\r\n compacteur Cat® usagé qui répondra à vos besoins et fera le travail!\r\n

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

\r\n Voulez-vous acheter un compacteur usagé pour votre prochain projet?{\" \"}\r\n

\r\n

\r\n Un compactage conforme aux spécifications est important pour une\r\n variété d’applications. Mieux vaut donc choisir le compacteur Cat®\r\n qui a été fabriqué pour vos tâches précises. Nos compacteurs usagés\r\n sont dotés de technologies avancées qui en augmentent la durabilité,\r\n la performance et l’efficacité. Notre sélection de rouleaux mixtes,\r\n utilisés pour une variété de travaux – tels que le compactage de\r\n décharges et le lissage du sol et de la chaussée –, offre un maximum\r\n de valeur pour tous vos besoins. Si vous avez besoin d’un compacteur\r\n de sol à Winnipeg, d’un rouleau pneumatique à Toronto ou d’un\r\n compacteur de décharge à Pointe-Claire, Battlefield Equipment\r\n Rentals a le compacteur usagé fait pour vous! Nos compacteurs usagés\r\n sont abordables (ils sont offerts à partir de 13 000 $ CAD) et\r\n peuvent être certifiés Caterpillar.\r\n

\r\n
\r\n
\r\n Obtenez votre compacteur usagé chez Location d’équipement\r\n Battlefield dès aujourd’hui!{\" \"}\r\n
\r\n

\r\n Si votre projet d’agriculture, de construction ou de compactage\r\n nécessite un compacteur, choisissez un compacteur Caterpillar de\r\n Location d’équipement Battlefield! Nous offrons une vaste sélection\r\n de compacteurs et de rouleaux mixtes abordables, rentables et\r\n garantis par Caterpillar. Contactez-nous aujourd’hui pour obtenir\r\n plus d’informations à propos de notre gamme de compacteurs usagés!\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Aggregate - Granulats\",\r\n CatCodeSlug: \"aggregate-granulats\",\r\n EN: {\r\n Name: \"Crushers and Screens\",\r\n Desc: (\r\n <>\r\n

Improve Your Bottom Line with Our Used Crushers and Screens

\r\n

\r\n Whether processing raw materials, manufacturing sand or handling\r\n glass in recycling applications, our used industrial crushing\r\n equipment will boost productivity and improve your bottom line.\r\n

\r\n

Used Crushers and Screens Currently for Sale:

\r\n \r\n ),\r\n Meta:\r\n \"Whether processing raw materials, mining sand or handling glass in recycling applications, our used industrial crushing equipment will boost productivity and improve your bottom line.\",\r\n ExtraText: (\r\n <>\r\n

Wide Range of Used Crushers and Screens

\r\n

\r\n Battlefield Equipment Rentals carries a wide range of used crushers\r\n and screens for applications in the mining, quarry and recycling\r\n industries. Whether your job site requires fine grinding of stone,\r\n glass or other materials, Battlefield Equipment Rentals will have\r\n the used crusher to meet your needs. The used screenrs we carry are\r\n able to process and effectively screen construction, demolition,\r\n soil and recycling debris. Battlefield Equipment Rentals’s lineup of\r\n used crushers and screens includes well-known, trusted and reliable\r\n brands such as Lokotrack, Masaba, Metso and Nordberg CVB. If you\r\n need a used crusher and screen for your job site, contact\r\n Battlefield Equipment Rentals today for more information or a quote!{\" \"}\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Concasseurs et cribles\",\r\n Meta:\r\n \"Que vous traitiez des matières premières, du sable, ou du verre dans des applications de recyclage, nos concasseurs et nos cribles usagés à vendre augmenteront votre productivité et amélioreront votre rentabilité.\",\r\n Desc: (\r\n <>\r\n

\r\n Améliorer votre rentabilité avec nos concasseurs et nos cribles\r\n usagés{\" \"}\r\n

\r\n

\r\n Que vous traitiez des matières premières, du sable, ou du verre dans\r\n des applications de recyclage, nos concasseurs et nos cribles usagés\r\n à vendre augmenteront votre productivité et amélioreront votre\r\n rentabilité. Nos broyeurs d’occasion sont plus souvent utilisés dans\r\n les carrières, les mines et les industries des agrégats, et sont\r\n conçus pour résister aux environnements les plus rigoureux, tout en\r\n offrant une performance de haute qualité. Pour tous vos besoins\r\n industriels, faites confiance aux concasseurs de pierres de Toromont\r\n Cat.{\" \"}\r\n

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Grande sélection de concasseurs et de cribles usagés

\r\n

\r\n Location d’équipement Battlefield offre une vaste gamme de cribles\r\n et de concasseurs usagés pour des applications dans les industries\r\n minières, de carrières et de recyclage. Que votre chantier nécessite\r\n de l’équipement pour broyer des pierres, du verre ou d’autres\r\n matériaux, vous pouvez compter sur Location d’équipement Battlefield\r\n pour répondre à vos besoins. Les cribles d’occasion que nous offrons\r\n sont capables de traiter et de filtrer efficacement les débris de\r\n construction, de démolition, de sol et de recyclage. La sélection de\r\n cribles et de concasseurs usagés de Location d’équipement\r\n Battlefield est composée de marques fiables et connues telles que\r\n Lokotrack, Masaba, Metso et Nordberg CVB. Si vous avez besoin d’une\r\n crible ou d’un concasseur usagé, contactez Location d’équipement\r\n Battlefield aujourd’hui pour obtenir un devis ou plus d’information.\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Excavators - Pelles Hydrauliques\",\r\n CatCodeSlug: \"excavators-pelles-hydrauliques\",\r\n EN: {\r\n Name: \"Excavators\",\r\n Meta:\r\n \"Excavators are an indispensable asset to any contractor’s fleet. Whatever the application, our selection of used excavators can get the job done safely and efficiently. A digger’s purpose is almost limitless thanks its exceptional speed, energy efficiency and lifting capacity.\",\r\n Desc: (\r\n <>\r\n

Used Cat excavators to help you dig up the profits!

\r\n

\r\n Whatever the application, Battlefield Equipment Rentals’ selection\r\n of used excavators can get the job done safely and efficiently. When\r\n you choose to buy used excavators, you are obtaining the absolute\r\n best machines for the job. Our used excavators offer limitless\r\n capabilities including exceptional speed, fuel efficiency and\r\n digging performance. Thanks to their rock-solid frames and robust\r\n components, our used mini hydraulic excavators provide unrivaled\r\n strength, durability and reliability on the most challenging\r\n terrain. From digging trenches and foundations, to post holes and\r\n breaking concrete, you can count on Battlefield Equipment Rentals’\r\n used mini hydraulic excavators to perform with unsurpassed power and\r\n agility.\r\n

\r\n

Our used excavators currently for sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

\r\n Battlefield Equipment Rentals’ wide selection of used excavators{\" \"}\r\n

\r\n

\r\n Battlefield Equipment Rentals used excavators are equipped with a\r\n long, heavy-duty undercarriage that offers greater stability when\r\n lifting heavy objects, thus greatly increasing daily productivity.\r\n Optimal performance and durability are achieved with a variety of\r\n standard and optional technologies such as{\" \"}\r\n \r\n Cat Connect solutions\r\n \r\n , which optimize production and minimize operating costs, and the\r\n abrasion-resistant Cat XT™-6 hose, which can withstand high\r\n pressures over long periods of time. With features such as a quiet,\r\n ergonomic cab that offers automatic climate control for the\r\n maintenance of consistent temperature, an LCD monitor that is easy\r\n to program and use, and large windows that provide a panoramic view,\r\n Battlefield Equipment Rentals’ used excavators for sale enable you\r\n dominate the job site with ease, comfort and security.\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Excavatrices\",\r\n Meta:\r\n \"Les excavatrices usagées à vendre de Location d’équipement Battlefield sont un atout indispensable pour la flotte d’un entrepreneur. Quelle que soit l’application, notre sélection de pelles hydrauliques d’occasion fera en sorte que le travail sera accompli avec efficacité et en toute sécurité.\",\r\n Desc:\r\n \"Les excavatrices usagées à vendre de Location d’équipement Battlefield sont un atout indispensable pour la flotte d’un entrepreneur. Quelle que soit l’application, notre sélection de pelles hydrauliques d’occasion fera en sorte que le travail sera accompli avec efficacité et en toute sécurité. Grâce à leur vitesse, leur rendement énergétique et à leur puissance de levage exceptionnelle, Il n’y a pas de limites aux travaux que nos pelles mécaniques peuvent accomplir. Le châssis et les composants robustes de nos pelles sur chaines et nos pelles sur pneus offrent une puissance et une fiabilité supérieures sur les terrains difficiles et dans les environnements rigoureux. Que vous creusiez des tranchées ou des fondations, ou que vous faisiez du paillage forestier ou des travaux miniers, vous pouvez compter sur les excavatrices usagées de Location d’équipement Battlefield pour vous fournir une agilité, une productivité et une performance inégalés.\",\r\n ExtraText: (\r\n <>\r\n

\r\n La vaste sélection d’excavatrices usagées de Location d’équipement\r\n Battlefield\r\n

\r\n

\r\n Les excavatrices usagées de Location d’équipement Battlefield sont\r\n équipées d’un châssis robuste qui offre une stabilité supérieure\r\n pendant le transport d’objets lourds, ce qui augmente la\r\n productivité quotidienne. Une performance et une durabilité\r\n optimales sont atteintes grâce à une variété de technologies\r\n intégrées d’usine ou offert en option telles que (insert link), qui\r\n augmentent la productivité et réduisent les coûts d’exploitation. Le\r\n tuyau Cat XT™-6 résistant à l’abrasion permet aussi de résister à\r\n des pressions élevées pendant de longues périodes. Avec des\r\n fonctionnalités telles que la cabine ergonomique et silencieuse qui\r\n offre un contrôle de climat automatique pour une température\r\n constante, un écran LCD facile à programmer et à utiliser, et des\r\n grandes fenêtres offrant une vue panoramique, les excavatrices\r\n d’occasion de Location d’équipement Battlefield vous permettent de\r\n maîtrise le chantier avec facilité, confort et sécurité.{\" \"}\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Forest Products - Matériel Forestier\",\r\n CatCodeSlug: \"forest-products-materiel-forestier\",\r\n EN: {\r\n Name: \"Forest Products\",\r\n Meta:\r\n \"Battlefield Equipment Rentals’ used forestry machines will satisfy your toughest application needs. Our commercial logging equipment provide increased stability on steep ground, fuel economy, efficient swing power and maximized visibility.\",\r\n Desc: (\r\n <>\r\n

Battlefield Equipment Rentals’ Used Forestry Machines

\r\n

\r\n Battlefield Equipment Rentals’ used forestry machines will satisfy\r\n your toughest application needs. Our commercial logging equipment\r\n provide increased stability on steep ground, fuel economy, efficient\r\n swing power and maximized visibility. Our varied inventory of feller\r\n bunchers, forwarders and skidders is your top pick for harvesting,\r\n extracting and loading goods on major projects, such as road\r\n building, lumber and reforestation.\r\n

\r\n

Used Forest Machines Currently for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Used Forest Machines for Any Job

\r\n

\r\n Battlefield Equipment Rentals carries a selection of used forestry\r\n machines than can help complete your commercial logging needs. Our\r\n used forestry inventory includes feller bunchers, forwarders and\r\n skidders to meet your extracting, harvesting and loading needs.\r\n Caterpillar forestry machines are reliable, easy to maintain and\r\n provide increased stability and visibility on your jobsite. Our\r\n forestry machines are also powerful, ranging in net flywheel power\r\n from 149 HP to 291 HP. If your land management, logging or mill yard\r\n needs require rugged, purpose-built equipment to get the job done,\r\n contact Battlefield Equipment Rentals today about our used forest\r\n machines.\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Produits forestiers \",\r\n Meta:\r\n \"Les machines forestières d’occasion de Location d’équipement Battlefield sauront satisfaire à vos besoins les plus ardus. Notre équipement d’exploitation forestière usagé fournit une superbe stabilité sur le terrain escarpé, une bonne économie de carburant, une visibilité maximisée et une puissance d’oscillation efficace.\",\r\n Desc:\r\n \"Les machines forestières d’occasion de Location d’équipement Battlefield sauront satisfaire à vos besoins les plus ardus. Notre équipement d’exploitation forestière fournit une superbe stabilité sur le terrain escarpé, une bonne économie de carburant, une visibilité maximisée et une puissance d’oscillation efficace. Notre inventaire varié d’abatteuses-groupeuses, de porteurs et de débardeurs usagés à vendre sont votre meilleur choix pour vos travaux d’extraction, de récolte ou de chargement de marchandise sur des projets majeurs de construction de route, d’exploitation forestière ou de reboisement.\",\r\n ExtraText: (\r\n <>\r\n

Des machines forestières usagées pour tout type de projet

\r\n

\r\n Location d’équipement Battlefield offre une sélection de produits\r\n forestiers usagés conçus pour répondre à tous vos besoins en matière\r\n d’exploitation forestière commerciale. Notre inventaire d’équipement\r\n forestier usagé, qui comprend des abatteuses-groupeuses, des\r\n porteurs et des débadeurs, vous permet d’accomplir tous vos travaux\r\n d'extraction, de récolte et de chargement. Les machines forestières\r\n Caterpillar sont fiables, faciles à entretenir et fournissent une\r\n stabilité et une visibilité supérieures sur le chantier. Notre\r\n équipement forestier est aussi très puissant, offrant une puissance\r\n d’inertie de 149 HP à 291 HP. Si vous nécessitez un équipement\r\n robuste et spécialement conçu pour vos travaux forestiers, contactez\r\n Location d’équipement Battlefield aujourd’hui pour obtenir plus\r\n d’information sur nos machines forestières d'occasion.\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Forklifts - Chariots Elévateurs\",\r\n CatCodeSlug: \"forklifts-chariots-elevateurs\",\r\n EN: {\r\n Name: \"Forklifts\",\r\n Meta:\r\n \"Safety, comfort and lifting capacity are just some of the features that make up a great Forklift. With Toromont Material Handling’s used lift trucks, you can easily cut costs and optimize your logistical operations.\",\r\n Desc:\r\n \"Safety, comfort and lifting capacity are just some of the features that make up a great forklift. With Toromont Material Handling’s used lift trucks, you can easily cut costs and optimize your logistical operations. Our diesel and electric forklifts are robust, durable, powerful and comfortable to operate, helping to minimize downtime for higher productivity and cost efficiency. Whatever the industry, we have a solution for all of your material handling needs.\",\r\n ExtraText: null,\r\n },\r\n FR: {\r\n Name: \"Chariots Elévateurs\",\r\n Meta:\r\n \"Un bon chariot élévateur doit posséder des caractéristiques supérieures en termes de sécurité, de confort et de capacité de levage. Avec les chariots élévateurs usagés de Toromont Manutention, vous pouvez facilement réduire et optimiser vos coûts d’opérations logistiques.\",\r\n Desc:\r\n \"Un bon chariot élévateur doit posséder des caractéristiques supérieures en termes de sécurité, de confort et de capacité de levage. Avec les chariots élévateurs usagés de Toromont Manutention, vous pouvez facilement réduire et optimiser vos coûts d’opérations logistiques. Nos chariots élévateurs électriques et à combustion sont robustes, durables, puissants et confortables, permettant de réduire vos temps d’arrêt pour une plus grande productivité et une meilleure rentabilité. Quel que soit l’industrie, nous avons une solution pour tous vos besoins en matière de manutention.\",\r\n ExtraText: null,\r\n },\r\n },\r\n {\r\n CatCode: \"Mining Equipment - Machines Pour Mines\",\r\n CatCodeSlug: \"mining-equipment-machines-pour-mines\",\r\n EN: {\r\n Name: \"Mining Equipment\",\r\n Meta:\r\n \"To navigate the notoriously rigorous terrain and harsh environment that is common to the mining industry, you need Battlefield Equipment Rentals’ used mining equipment. Our selection of used mining equipment will optimize your operations by delivering value and heavy-duty performance.\",\r\n Desc: (\r\n <>\r\n

Optimize Your Operations with Our Used Mining Equipment

\r\n

\r\n To navigate the notoriously rigorous terrain and harsh environment\r\n that is common to the mining industry, you need Battlefield\r\n Equipment Rentals’s used mining equipment. Our selection of used\r\n mining equipment will optimize your operations by delivering value\r\n and heavy-duty performance. Our machines offer superb traction,\r\n rigidity and hydraulic efficiency with premium components and\r\n advanced technologies. Thanks to our commercial mining vehicles, you\r\n can move material swiftly and at lower cost.\r\n

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Most Advanced Lineup of Used Mining Equipment

\r\n

\r\n Battlefield Equipment Rentals carries the mining industry’s largest\r\n and most advanced lineup of used mining equipment for surface mining\r\n applications. Whether your mining site requires digging, drilling,\r\n hauling or moving, Battlefield Equipment Rentals has the used mining\r\n equipment, loading tools and commercial mining vehicles needed to\r\n get the job done. Caterpillar’s used mining equipment is renowned\r\n for its efficiency, excellent traction and rigidity to help you move\r\n your materials faster. Contact Battlefield Equipment Rentals today\r\n for more information about our used mining equipment!\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Équipements miniers\",\r\n Meta:\r\n \"Pour naviguer sur le terrain rigoureux et difficile qui est commun à l’industrie minière, il vous faut l’équipement minier usagé de Location d’équipement Battlefield. Notre sélection d’équipements miniers améliorera vos opérations en livrant une performance de longue durée.\",\r\n Desc:\r\n \"Pour naviguer sur le terrain rigoureux et difficile qui est commun à l’industrie minière, il vous faut l’équipement minier usagé de Location d’équipement Battlefield. Notre sélection d’équipements miniers améliorera vos opérations en livrant une performance de longue durée et une valeur supérieure. Nos machines sont dotées de technologies avancées et de composants de qualité qui fournissent une superbe traction, une plus grande durabilité et une puissance hydraulique exceptionnelle. Grâce à nos véhicules miniers commerciaux, vous pouvez transporter votre matériel plus rapidement à un coût moins élevé.\",\r\n ExtraText: (\r\n <>\r\n

La plus grande gamme d’équipement minier usagé

\r\n

\r\n Location d’équipement Battlefield offre la plus grande sélection\r\n d’équipement minier usagé pour tous vos travaux miniers. Que votre\r\n chantier nécessite des travaux de terrassement, de forage ou de\r\n transport, l’équipement minier usagé de Location d’équipement\r\n Battlefield vous aidera à optimiser votre productivité. L’équipement\r\n d’exploitation minière d’occasion Caterpillar est réputé pour son\r\n efficacité, sa traction supérieure et sa rigidité, vous permettant\r\n de transporter vos matériaux plus rapidement. Contactez Battlefield\r\n Equipment Rentals aujourd’hui pour obtenir plus d’information sur\r\n notre équipement minier usagé!\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Motor Graders - Niveleuses\",\r\n CatCodeSlug: \"motor-graders-niveleuses\",\r\n EN: {\r\n Name: \"Motor Graders\",\r\n Meta:\r\n \"Your fleet isn’t complete without a Battlefield Equipment Rentals motor grader. Our used graders provide precise maneuverability in tight spaces and excellent traction on slopes and soft underfoot conditions.\",\r\n Desc: (\r\n <>\r\n

Battlefield Equipment Rentals’ Used Motor Graders

\r\n

\r\n Your fleet isn’t complete without a Battlefield Equipment Rentals\r\n motor grader. Our used graders provide precise maneuverability in\r\n tight spaces and excellent traction on slopes and soft underfoot\r\n conditions. Motor graders can easily travel from point A to point B,\r\n and can handle multiple jobs in a variety of applications. Their\r\n invaluable, multi-faceted usage in road paving, construction,\r\n farming and snow removal applications makes them a truly versatile\r\n machine.\r\n

\r\n

Used Motor Graders Currently for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Used Motor Graders to Flatten Any Jobsite

\r\n

\r\n The Cat motor graders we carry are renowned for their controls,\r\n technology, hydraulics and comfortable cabs. Battlefield Equipment\r\n Rentals carries used motor graders that range in power from 179 HP\r\n to 535 HP with blade widths from 12 ft to 24 ft, designed to help\r\n you get the job done. They also work well on sloped or soft terrain\r\n and provide excellent maneuvering in small spaces. If you need a\r\n used motor grader for agricultural, construction, paving or snow\r\n removal applications, contact Battlefield Equipment Rentals today!\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Niveleuses\",\r\n Meta:\r\n \"Votre flotte n’est pas complète sans une niveleuse usagée de Location d’équipement Battlefield. Nos niveleuses d’occasion à vendre fournissent une maniabilité précise dans les espaces restreints et une excellente traction sur les pentes et le sol à faible portance.\",\r\n Desc:\r\n \"Votre flotte n’est pas complète sans une niveleuse usagée de Location d’équipement Battlefield. Nos niveleuses d’occasion à vendre fournissent une maniabilité précise dans les espaces restreints et une excellente traction sur les pentes et le sol à faible portance. Les niveleuses sont complètement polyvalentes, car elles peuvent se déplacer facilement entre les chantiers et peuvent accomplir plusieurs travaux dans une grande variété d’applications, comme celles du pavage, de la construction, de l’agriculture et du déneigement.\",\r\n ExtraText: (\r\n <>\r\n

Maîtrisez le chantier avec nos niveleuses usagées

\r\n

\r\n Nos niveleuses Cat sont réputées pour leur excellent contrôle, leurs\r\n technologies avancées, leurs systèmes hydrauliques supérieurs et\r\n leurs cabines ergonomiques. Les niveleuses d’occasion de Toromont\r\n Cat ont une puissance de 179 HP à 535 HP et une largeur de lame de\r\n 12 pi à 14 pi, vous permettant d’accomplir vos projets avec plus\r\n d’efficacité. Elles offrent aussi une maniabilité accrue sur les\r\n pentes et dans les espaces étroits. Si vous avez besoin d’une\r\n niveleuse pour vos travaux d’agriculture, de construction, de pavage\r\n ou de déneigement, contactez Location d’équipement Battlefield\r\n aujourd’hui!{\" \"}\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Off-highway Trucks / Tractors - Tombereaux rigides / tracteurs\",\r\n CatCodeSlug: \"off-highway-trucks-tractors-tombereaux-rigides-tracteurs\",\r\n EN: {\r\n Name: \"Off-highway Trucks / Tractors\",\r\n Meta:\r\n \"Off highway trucks are specifically designed for the mining, quarry and construction industries, where challenging terrain and extreme environments are the norm. In these industries, durability, reliability and load capacity matter the most.\",\r\n Desc: (\r\n <>\r\n

Exceed Your Expectations with Our Used Off-Highway Trucks

\r\n

\r\n Off highway trucks are specifically designed for the mining, quarry\r\n and construction industries, where challenging terrain and extreme\r\n environments are the norm. In these industries, durability,\r\n reliability and load capacity matter the most. Toromont’s used off\r\n highway trucks will exceed your expectations. Excellent hauling\r\n capabilities, maneuverability, safety and operating costs are just\r\n some of the outstanding features of our machines.\r\n

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Wide Range of Used Off-Highway Trucks and Tractors

\r\n

\r\n Battlefield Equipment Rentals carries a range of used off-highway\r\n trucks created specifically to handle mining, construction and\r\n quarry challenges. Our Caterpillar used off-highway trucks can carry\r\n payloads between 42.1 ton and 98.4 ton and travel more than 40 mph\r\n when fully loaded. Caterpillar’s used off-highway trucks are built\r\n to withstand a variety of environments and terrains and can be\r\n relied upon to get the job done when it matters most. If your next\r\n construction, mining or quarry project needs a used off-highway\r\n truck, contact Battlefield Equipment Rentals today!{\" \"}\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Tombereaux rigides / tracteurs\",\r\n Meta:\r\n \"Les tombereaux rigides sont spécialement conçus pour les industries minières où le terrain est habituellement difficile et les environnements sont extrêmes. Dans ces types d’industries, la durabilité, la fiabilité et la capacité de charge sont d’une grande importance.\",\r\n Desc:\r\n \"Les tombereaux rigides sont spécialement conçus pour les industries minières où le terrain est habituellement difficile et les environnements sont extrêmes. Dans ces types d’industries, la durabilité, la fiabilité et la capacité de charge sont d’une grande importance. Les tombereaux et les tracteurs rigides usagés de Location d’équipement Battlefield sauront dépasser vos atteintes, car ils sont fiables, sécuritaires et économiques, et offrent d’excellentes capacités de transport.\",\r\n ExtraText: (\r\n <>\r\n

Une grande gamme de tombereaux rigides et de tracteurs usagés

\r\n

\r\n Location d’équipement Battlefield offre une gamme de tombereaux\r\n rigides conçus spécialement pour les travaux miniers, de\r\n construction et de carrière. Nos tombereaux rigides Caterpillar\r\n peuvent transporter des charges entre 42,1 tonnes et 98,4 tonnes et\r\n parcourir des distances de plus de 40 mph. Les tombereaux rigides\r\n usagés Caterpillar sont extrêmement fiables, car ils sont construits\r\n pour résister à une variété d’environnements et de terrains. Si\r\n votre prochain projet minier, de construction ou de carrière\r\n nécessite un tombereau rigide, contactez Location d’équipement\r\n Battlefield aujourd’hui!\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"On-highway Trucks - Camions Routiers\",\r\n CatCodeSlug: \"on-highway-trucks-camions-routiers\",\r\n EN: {\r\n Name: \"On-highway Trucks\",\r\n Meta:\r\n \"Designed for the long haul, our premium selection of used on-highway trucks will help you transport today’s heavy loads with ease and efficiency.\",\r\n Desc:\r\n \"Our premium selection of used on-highway trucks will help you transport today’s heavy loads with ease and efficiency. Designed for the long haul, our used transport trucks feature an ergonomic cab that delivers superior comfort, a powerful, fuel-efficient engine that can handle long distances, a rugged, industrial build for long-lasting performance, and technologically advanced features that will optimize the drive, enhancing any hauling application for superior productivity and results at top value.\",\r\n ExtraText: null,\r\n },\r\n FR: {\r\n Name: \"Camions Routiers\",\r\n Meta:\r\n \"Conçue pour le transport de charges lourdes, notre sélection de camions routiers usagés vous permettra d’effectuer vos applications de transport avec facilité et efficacité.\",\r\n Desc:\r\n \"Notre sélection de camions routiers usagés vous permettra d’effectuer vos applications de transport avec facilité et efficacité. Conçus pour le transport de charges lourdes, nos camions de transport usagés sont équipés d'une cabine ergonomique offrant un confort supérieur, d'un moteur puissant et faible en carburant, d'une construction robuste pour une durabilité accrue, et de technologies avancées qui optimisent la conduite et la performance, fournissant une productivité et des résultats supérieurs.\",\r\n ExtraText: null,\r\n },\r\n },\r\n {\r\n CatCode: \"Paving Products - Matériel Routier\",\r\n CatCodeSlug: \"paving-products-materiel-routier\",\r\n EN: {\r\n Name: \"Paving Products\",\r\n Meta:\r\n \"Our range of used asphalt pavers and rollers will provide economical and versatile solutions for all types of paving needs, from airport and highway projects to small housing developments.\",\r\n Desc: (\r\n <>\r\n

Used Asphalt Pavers for all Your Paving Needs

\r\n

\r\n Our range of used asphalt pavers and rollers will provide economical\r\n and versatile solutions for all types of paving needs, from airport\r\n and highway projects to small housing developments. Battlefield\r\n Equipment Rentals’s paving equipment is the ideal choice for\r\n demanding applications that require fuel efficiency, comfortable\r\n operating conditions, impressive mobility and superior\r\n functionality. With our selection of used wheel and steel track\r\n pavers, you can take any job to the next level.\r\n

\r\n

Used Asphalt Pavers Currently for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Our Selection of Used Paving Products

\r\n

\r\n Battlefield Equipment Rentals carries a large selection of used\r\n paving products – including wheel and track asphalt pavers and\r\n screeds – for sale or rental. Caterpillar’s used paving products are\r\n known for their mobility, fuel efficiency and comfortable cab\r\n conditions for operators. Our asphalt pavers are also renowned for\r\n their high horsepower, ranging in gross power from 46 HP to 225 HP.\r\n Whatever your paving needs, Battlefield Equipment Rentals has the\r\n used paving products to get your job done. Contact us for more\r\n information or a quote today!\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Produits de pavage\",\r\n Meta:\r\n \"Notre gamme de finisseurs et de rouleaux usagés fournit des solutions économiques et polyvalentes pour tous besoins en matière de pavage, que ce soit pour des projets d’autoroute, d’aéroport ou des développements résidentiels.\",\r\n Desc:\r\n \"Notre gamme de finisseurs et de rouleaux usagés fournit des solutions économiques et polyvalentes pour tous besoins en matière de pavage, que ce soit pour des projets d’autoroute, d’aéroport ou de développement résidentiel. L’équipement de pavage de Location d’équipement Battlefield est le choix idéal pour les applications exigeantes nécessitant une faible consommation de carburant, une opération confortable, une mobilité impressionnante et une fonctionnalité supérieure. Avec notre sélection de finisseurs sur roues ou sur chaînes, votre travail peut atteindre des nouveaux sommets.\",\r\n ExtraText: (\r\n <>\r\n

Notre sélection de produits de pavage usagés

\r\n

\r\n Location d’équipement Battlefield offre une vaste sélection de\r\n produits de pavage usagés à vendre ou pour location. Notre gamme de\r\n finisseurs et de rouleaux Caterpillar sont renommés pour leur\r\n mobilité, leur efficacité en carburant et leurs cabines\r\n confortables. Nos finisseurs sont aussi réputés pour leur puissance\r\n élevée, allant de 46 HP à 225 HP. Quels que soient vos besoins, vous\r\n pouvez compter sur Location d’équipement Battlefield pour les\r\n produits de pavage les plus efficaces. Contactez-nous aujourd’hui\r\n pour demander une soumission ou pour obtenir plus d’information!{\" \"}\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Skid Steer Loaders / ASV - Chargeurs Compacts rigides\",\r\n CatCodeSlug: \"skid-steer-loaders-asv-chargeurs-compacts-rigides\",\r\n EN: {\r\n Name: \"Skid Steer Loaders\",\r\n Meta:\r\n \"Skid steer loaders are highly adaptable machines. With the use of different attachments, multi terrain loaders can handle a wide range of jobs from snow removal and landscaping to debris removal.\",\r\n Desc: (\r\n <>\r\n

Battlefield Equipment Rentals’ Used Skid Steer Loaders

\r\n

\r\n Skid Steer Loaders are highly adaptable machines. With the use of\r\n different attachments, skid steer loaders can handle a wide range of\r\n jobs from snow removal and landscaping to debris removal.\r\n Battlefield Equipment Rentals’ used skid steer loaders are primed\r\n for digging, grading, pushing or loading in almost any kind of\r\n environment.\r\n

\r\n

Used Skid Steer Loaders Currently for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Used Skid Steer Loaders to Get the Job Done

\r\n

\r\n Skid steer loaders are strong, powerful machines with arms that can\r\n be attached to a variety of Cat attachments for different\r\n applications. Battlefield Equipment Rentals carries several models\r\n of used skid steer loaders that range in power from 65.8 HP to 106\r\n HP and have an operating capacity of 1550 lb to 3650 lb. Our used\r\n Caterpillar skid steer loaders are known worldwide for their\r\n durability, reliability, efficiency and simple controls. Battlefield\r\n Equipment Rentals’s used steer loaders are designed and built to\r\n help you get the job done, so contact us for more information today!\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Chargeurs Compacts rigides\",\r\n Meta:\r\n \"Les chargeurs compacts rigides sont très adaptables. En utilisant plusieurs accessoires différents, les chargeurs tout terrain peuvent accomplir un large éventail de travaux comme le déneigement, l’aménagement paysager et l’élimination des débris.\",\r\n Desc:\r\n \"Les chargeurs compacts rigides sont très adaptables. En utilisant plusieurs accessoires différents, les chargeurs tout terrain peuvent accomplir un large éventail de travaux comme le déneigement, l’aménagement paysager et l’élimination des débris. Les chargeurs compacts rigides usagés de Location d’équipement Battlefield sont prêts à creuser, à niveler, à pousser ou à transporter dans n’importe quel type d’environnement. Nos petits chargeurs sont idéals pour les travaux d’intérieur ou les espaces étroits, tandis que nos gros chargeurs sont parfaits pour les grands travaux d’extérieur tels que la démolition et l’exploitation forestière.\",\r\n ExtraText: (\r\n <>\r\n

\r\n Les chargeurs compacts rigides usagés pour un travail bien fait\r\n

\r\n

\r\n Les chargeurs compacts rigides sont des machines robustes et\r\n puissantes avec des bras qui peuvent être fixés à une variété\r\n d’accessoires Cat pour différentes applications. Battlefield\r\n Equipment Rentals offre plusieurs modèles de chargeurs compacts\r\n rigides avec une puissance de 65,8 HP à 106 HP et une capacité de\r\n chargement de 1 550 lb à 3 650 lb. Nos chargeurs compacts rigides\r\n Caterpillar sont connus dans le monde entier pour leur durabilité,\r\n leur fiabilité, leur efficacité et leurs technologies de pointe. Les\r\n chargeurs compacts rigides d’occasion de Battlefield Equipment\r\n Rentals sont conçus pour faciliter tout type de travail, alors\r\n contactez-nous aujourd’hui pour obtenir plus d’information!\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Telehandlers - Chargeurs à Bras Télescopique\",\r\n CatCodeSlug: \"telehandlers-chargeurs-a-bras-telescopique\",\r\n EN: {\r\n Name: \"Telehandlers\",\r\n Meta:\r\n \"With Battlefield Equipment Rentals’ used telehandlers, nothing is out of reach. Our line of telescopic lifts add unmatched versatility and ease of handling to any industry application.\",\r\n Desc: (\r\n <>\r\n

\r\n Battlefield Equipment Rentals’ Selection of Used Telehandlers{\" \"}\r\n

\r\n

\r\n Battlefield Equipment Rentals’ selection of Used Telehandlers With\r\n Battlefield Equipment Rentals’ used telehandlers, nothing is out of\r\n reach. Our line of telescopic lifts add unmatched versatility and\r\n ease of handling to any industry application. Telehandlers can\r\n operate where forklifts and conventional equipment cannot, offering\r\n extra stability on steep or rough terrain, durability for heavy load\r\n handling, and optimal lift and reach capabilities for hard-hitting\r\n results.\r\n

\r\n

Used Telehandlers Currently for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Used Telehandlers for Any Job

\r\n

\r\n Battlefield Equipment Rentals’ used telehandlers by Caterpillar are\r\n easily maneuverable and versatile for use in a variety of\r\n industries. The used telehandlers we carry are known for their reach\r\n and lift capabilities and have load capacities ranging from 5,500 lb\r\n to 12,000 lb. Our used telehandlers are specifically built and\r\n designed to operate in challenging terrains where conventional heavy\r\n equipment would struggle. If your job site or next project could\r\n benefit from a durable, powerful and reliable telehandler, contact\r\n Battlefield Equipment Rentals for more information today!\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Chargeurs à Bras Télescopique\",\r\n Meta:\r\n \"Avec les chargeurs à bras télescopique usagés de Location d’équipement Battlefield, le ciel est à votre portée. Notre gamme de chargeurs à bras télescopique ajoute une polyvalence et une facilité de manutention à n’importe quelle application.\",\r\n Desc:\r\n \"Avec les chargeurs à bras télescopique usagés de Location d’équipement Battlefield, le ciel est à votre portée. Notre gamme de chargeurs à bras télescopique ajoute une polyvalence et une facilité de manutention à n’importe quelle application. Les chargeurs à bras télescopique peuvent travailler là où les chariots élévateurs et l’équipement conventionnel ne peuvent pas, fournissant une capacité de levage impressionnante, une superbe stabilité sur le terrain escarpé ou difficile, et une bonne durabilité pour la manutention de charges lourdes.\",\r\n ExtraText: (\r\n <>\r\n

Des chargeurs à bras télescopique pour tout type de travail

\r\n

\r\n Les chargeurs à bras télescopique Caterpillar sont conçus pour une\r\n variété d’industries car ils sont polyvalents et faciles à\r\n manœuvrer. Nos chargeurs à bras télescopique sont connus pour leur\r\n capacité de chargement supérieure. Ils sont capables de transporter\r\n des charges allant de 5 500 lb à 12 000 lb. Les chargeurs à bras\r\n télescopique de Location d’équipement Battlefield sont spécialement\r\n conçus pour les terrains et les travaux rigoureux. Si votre prochain\r\n projet ou chantier nécessite un chargeur à bras télescopique fiable,\r\n durable et puissant, contactez Location d’équipement Battlefield\r\n aujourd’hui pour obtenir plus d’information!\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Track Type Loaders / Crawlers - Chargeurs Sur Chaines\",\r\n CatCodeSlug: \"track-type-loaders-crawlers-chargeurs-sur-chaines\",\r\n EN: {\r\n Name: \"Track Type Loaders / Crawlers\",\r\n Meta:\r\n \"When it comes to top loading and digging performance on the job site, nothing beats our used track type loaders/crawlers.\",\r\n Desc: (\r\n <>\r\n

\r\n Reach Maximum Performance with Our Used Track Type Loaders and\r\n Crawlers{\" \"}\r\n

\r\n

\r\n When it comes to maximum loading and digging performance on the job\r\n site, nothing beats our used track type loaders/crawlers. Toromont\r\n Cat tracked loaders are made to handle the most challenging\r\n terrains, offering unrivaled power, versatility and productivity\r\n thanks to their uncanny ability to dig, load and excavate in some of\r\n roughest and most stringent ground work applications such as mining,\r\n quarry and construction.\r\n

\r\n

Used Track Type Loaders and Crawlers Currently for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

\r\n Battlefield Equipment Rentals’ Selection of Used Track Type Loaders\r\n and Crawlers{\" \"}\r\n

\r\n

\r\n Toromont carries several models of used track type loaders and\r\n crawlers with high loading capacities and the ability to handle some\r\n of the world’s most challenging terrains. Our Caterpillar used track\r\n type loaders/crawlers range in flywheel power from 154 HP to 275 HP\r\n and are able to perform digging, loading and excavation tasks in\r\n some of the toughest industries. If your construction, mining or\r\n quarry site could benefit from a heavy-duty used track type\r\n loader/crawler, contact Battlefield Equipment Rentals today for more\r\n information about our available models.\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Chargeurs Sur Chaines\",\r\n Meta:\r\n \"Nos chargeurs sur chaînes usagés offrent une puissance de creusement et de chargement supérieure sur le chantier.\",\r\n Desc:\r\n \"Nos chargeurs sur chaînes usagés offrent une puissance de creusement et de chargement supérieure sur le chantier. Les chargeurs sur chaînes de Location d’équipement Battlefield sont conçus pour maîtriser les terrains les plus rigoureux. Ils fournissent une puissance et une polyvalence inégalées grâce à leur étonnante capacité à creuser et à charger dans les applications les plus difficiles telles que l'exploitation minière, la carrière et la construction.\",\r\n ExtraText: (\r\n <>\r\n

\r\n La sélection de chargeurs sur chaines usagés de Battlefield\r\n Equipment Rentals\r\n

\r\n

\r\n Location d’équipement Battlefield offre plusieurs modèles de\r\n chargeurs sur chaines usagés avec une capacité de chargement élevée.\r\n Nos chargeurs sur chaines d’occasion Caterpillar fournissent une\r\n puissance d’inertie de 154 HP à 275 HP et sont capables d’effectuer\r\n des travaux de creusement, de chargement et d’excavation dans les\r\n industries les plus rigoureuses. Si votre chantier minier, de\r\n construction ou de carrière nécessite un chargeur sur chaines usagé\r\n robuste, contactez Location d’équipement Battlefield aujourd’hui\r\n pour obtenir plus d’information sur nos modèles disponibles.\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Track Type Tractors / Dozers - Tracteurs Sur Chaines\",\r\n CatCodeSlug: \"track-type-tractors-dozers-tracteurs-sur-chaines\",\r\n EN: {\r\n Name: \"Track Type Tractors / Dozers\",\r\n Meta:\r\n \"Dozers are a force to be reckoned with when it comes to achieving peak mobility on difficult terrain. Our used track type tractors deliver earth-moving power thanks to their excellent tractive force and maneuverability.\",\r\n Desc: (\r\n <>\r\n

Our Used Track Type Tractors and Dozers

\r\n

\r\n Dozers are a force to be reckoned with when it comes to achieving\r\n peak mobility on difficult terrain. Our used track type tractors\r\n deliver earth-moving power thanks to their excellent tractive force\r\n and maneuverability. Used on various job sites, such as farms,\r\n mines, quarries and construction, track loaders can effectively push\r\n dense soil, sand, rubble and other materials, bringing a high level\r\n of productivity and performance to any type of application.\r\n

\r\n

Used Track Type Tractors and Dozers Currently for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Wide Range of Used Track Type Tractors and Used Dozers

\r\n

\r\n Battlefield Equipment Rentals has a range of Caterpillar’s used\r\n small, medium, large and waste handling dozers available to handle\r\n some of the toughest projects imaginable. Our fleet of used track\r\n type tractors and dozers is well-known for their advanced\r\n technologies, maneuverability, reliability and safety features that\r\n help them to outperform other bulldozers on any job site. Whether\r\n you need a used track type tractor or dozer for your next\r\n agricultural, construction, mining or quarry project, Battlefield\r\n Equipment Rentals can help you find the right for your needs.\r\n Contact Battlefield Equipment Rentals today for more information\r\n about our selection of used track type tractors or dozers!\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Tracteurs Sur Chaines\",\r\n Meta:\r\n \"En matière de performance et de mobilité sur les terrains difficiles, rien ne bat les bulldozers usagés à vendre de Location d’équipement Battlefield. Grâce à leur maniabilité et à leur superbe capacité de traction, nos dozers usagés offrent une puissance qui fait secouer la terre.\",\r\n Desc:\r\n \"En matière de performance et de mobilité sur les terrains difficiles, rien ne bat les bulldozers usagés à vendre de Location d’équipement Battlefield. Grâce à leur maniabilité et à leur superbe capacité de traction, nos dozers usagés offrent une puissance qui fait secouer la terre. Utilisés sur une variété de chantiers tels que les fermes, les mines, les carrières et la construction, les tracteurs sur chaines peuvent efficacement pousser de la terre, du sable et d’autres matériaux pour fournir un haut niveau de productivité et de performance dans toutes sortes d’applications.\",\r\n ExtraText: (\r\n <>\r\n

Grande gamme de tracteurs sur chaines usagés

\r\n

\r\n Location d’équipement Battlefield offre une sélection de petits,\r\n moyens et grands tracteurs sur chaines usagés Caterpillar pour tous\r\n types de travaux. Nos tracteurs sur chaines sont renommés pour leurs\r\n technologies de pointe, leur maniabilité, leur fiabilité et leur\r\n sécurité. Nos tracteurs sur chaines d’occasion fournissent une\r\n performance optimale sur le chantier. Si vous avez besoin d’un\r\n tracteur sur chaines pour votre prochain projet minier,\r\n d’agriculture, de construction ou de carrière, Battlefield Equipment\r\n Rentals peut vous aider à trouver la machine la mieux adaptée à vos\r\n besoins. Contactez Location d’équipement Battlefield aujourd’hui\r\n pour obtenir plus d’information sur notre sélection de tracteurs sur\r\n chaines usagés!\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode:\r\n \"Wheel Loaders / Integrated Toolcarriers - Chargeurs Sur Pneus / Chargeurs Industriels\",\r\n CatCodeSlug:\r\n \"wheel-loaders-integrated-toolcarriers-chargeurs-sur-pneus-chargeurs-industriels\",\r\n EN: {\r\n Name: \"Wheel Loaders / Integrated Toolcarriers\",\r\n Meta:\r\n \"When choosing the right wheel loader, configuration is key. With a wide range of loaders from Battlefield Equipment Rentals, selecting the best type of equipment for each specific application is fast and simple. Our wheel loaders deliver excellent fill factors, improved cycle times and better visibility.\",\r\n Desc: (\r\n <>\r\n

Wide Selection of Used Cat Wheel Loaders

\r\n

\r\n With Battlefield Equipment Rentals’ range of Used Compact Wheel\r\n Loaders selecting the best type of equipment for each specific\r\n application is fast and simple. When you buy used compact wheel\r\n loaders from us, you will equip your fleet with equipment that\r\n delivers excellent fill factors, improved cycle times and better\r\n visibility. From asphalt and dirt, to gravel and snow, our used\r\n compact wheel loaders can handle any material on the job site with\r\n precision, safety and fuel efficiency. Our used compact wheel\r\n loaders are important assets on any job site, helping perform daily\r\n tasks such as landscaping, construction, forestry and agriculture\r\n projects with enhanced capabilities that increase efficiency and\r\n lower operating costs.\r\n

\r\n

Our used wheel loaders currently for sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Used Wheel Loaders for Any Job

\r\n

\r\n Our used wheel loaders can help maximize your budget. Our machines\r\n are always inspected for top quality assurance, so you know you’re\r\n getting the best performance, reliability and durability at the\r\n absolute best value. Cat wheel loaders are outfitted with innovative\r\n technologies that offer high performance with outstanding\r\n versatility. Standard features deliver a significant increase in\r\n lift capacity and travel speed, allowing operators to complete their\r\n jobs in a shorter amount of time. Battlefield Equipment Rentals used\r\n wheel loaders for sale are also outfitted with premium ergonomic\r\n cabs and options such as engine and ground speed control, which\r\n provide customizable control when operating work tools.\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Chargeurs Sur Pneus / Chargeurs Industriels\",\r\n Meta:\r\n \"Pour choisir le bon chargeur sur pneus, il faut considérer la configuration. Avec la gamme de chargeurs sur roues usagés de Location d’équipement Battlefield, il est simple et facile de sélectionner le meilleur équipement pour chaque application.\",\r\n Desc:\r\n \"Pour choisir le bon chargeur sur pneus, il faut considérer la configuration. Avec la gamme de chargeurs sur roues usagés de Location d’équipement Battlefield, il est simple et facile de sélectionner le meilleur équipement pour chaque application. Nos chargeurs sur roues à vendre améliorent les temps de cycles, la visibilité et les facteurs de remplissage. Nos chargeurs peuvent gérer le transport et la manipulation de toutes sortes de matériaux, comme l’asphalte, la terre, le gravier et la neige, avec précision, sécurité et une faible consommation de carburant. Utilisés pour les travaux d’aménagement paysager, de construction, d’exploitation forestière, de gestion de déchets, de mine ou d’agriculture, et équipés d’une variété d’outils de travail et de technologies, nos chargeurs sur pneus d’occasion peuvent accomplir n’importe quel travail tout en optimisant le rendement et les performances opérationnelles.\",\r\n ExtraText: (\r\n <>\r\n

Des chargeurs sur pneus pour tout type de travail

\r\n

\r\n Nos chargeurs sur pneus vous permettent de maximiser votre budget.\r\n Nos machines sont toujours inspectées pour une assurance de qualité\r\n supérieure, ce qui vous permet d’obtenir la meilleure performance,\r\n fiabilité et durabilité à la meilleure valeur. Les chargeurs sur\r\n pneus Cat sont équipés de technologies avancées qui offrent une\r\n performance élevée et une polyvalence exceptionnelle. Les\r\n technologies intégrées d’usine augmentent nettement la puissance de\r\n levage et la vitesse de voyage, permettant aux opérateurs de\r\n compléter leur travail plus rapidement. Les chargeurs sur pneus\r\n d’occasion à vendre de Location d’équipement Battlefield sont aussi\r\n équipés de cabines ergonomiques et d’options telles que le contrôle\r\n du moteur et de la vitesse au sol, fournissant un contrôle\r\n personnalisé lors de l’utilisation d’outils de travail.\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Work Tools - Outils De Travail\",\r\n CatCodeSlug: \"work-tools-outils-de-travail\",\r\n EN: {\r\n Name: \"Work Tools\",\r\n Meta:\r\n \"The right tools will do the right job. Battlefield Equipment Rentals offers a wide assortment of used work tools suited for all types of applications, from landscaping to snow removal.\",\r\n Desc:\r\n \"The right tools will do the right job. Battlefield Equipment Rentals offers a wide assortment of used work tools suited for all types of applications, from landscaping to snow removal. We carry used buckets, augers and forks, as well as breakers, compactors and snow removal. Getting your hands on our cost-friendly work tools will ensure flexibility and peak performance on the job site.\",\r\n ExtraText: null,\r\n },\r\n FR: {\r\n Name: \"Outils De Travail\",\r\n Meta:\r\n \"Les bons outils font un bon travail. Location d’équipement Battlefield offre un grand assortiment d’outils de travail usagés qui sont adaptés à plusieurs types d’applications comme le déneigement et le travail forestier.\",\r\n Desc:\r\n \"Les bons outils font un bon travail. Location d’équipement Battlefield offre un grand assortiment d’outils de travail usagés qui sont adaptés à plusieurs types d’applications comme le déneigement et le travail forestier. Nous offrons des godets, des têtes d’abattage et des fourches ainsi que des outils pour concasseurs, compacteurs et équipement de déneigement. Nos outils de travail à prix budgétaires vous aideront à atteindre une meilleure performance et flexibilité sur le chantier.\",\r\n ExtraText: null,\r\n },\r\n },\r\n {\r\n CatCode: \"Power Systems - Production d'énergie\",\r\n CatCodeSlug: \"power-systems-production-d-energie\",\r\n EN: {\r\n Name: \"Generators\",\r\n Meta:\r\n \"Battlefield Equipment Rentals carries a wide selection of used commercial and industrial generators. Our used gas and diesel generators are built to world-class standards, for high efficiency and low fuel consumption. Contact us today for more information!\",\r\n Desc: (\r\n <>\r\n

\r\n Generators provide power for countless agricultural, construction\r\n and mining projects across Canada. They are also often required to\r\n power complex business data centers and hospitals. Battlefield\r\n Equipment Rentals carries a large selection of used generators for\r\n commercial and industrial applications that range in power from 40\r\n kW to 2,000 kW. We guarantee that our Caterpillar used generators\r\n are load tested and regularly serviced to ensure that you can use\r\n your generator immediately after purchase. Whether you need a used\r\n generator for your job site or business, contact Battlefield\r\n Equipment Rentals today for more information about our used\r\n generator range.\r\n

\r\n

Used Generators Currently for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Used Commercial and Industrial Generators

\r\n

\r\n Battlefield Equipment Rentals carries a wide selection of used\r\n commercial and industrial generators. Our used gas and diesel\r\n generators are built to world-class standards, for high efficiency\r\n and low fuel consumption. Contact us today for more information!\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Groupes électrogènes\",\r\n Meta:\r\n \"Location d’équipement Battlefield offre une large sélection de groupes électrogènes commerciaux et industriels. Nos groupes électrogènes au gaz et au diesel sont conçus pour fournir une performance et efficacité supérieures ainsi qu’une plus grande économie en carburant. Contactez-nous aujourd’hui pour obtenir plus d’information!\",\r\n Desc: (\r\n <>\r\n

\r\n Les groupes électrogènes alimentent une multitude de projets\r\n miniers, d’agriculture et de construction à travers le Canada. Ils\r\n sont aussi souvent utilisés pour alimenter des centres hospitaliers\r\n et des centres complexes de données d’entreprise. Battlefield\r\n Equipment Rentals offre une large sélection de groupes électrogènes\r\n usagés, qui livrent une puissance de 40 kW à 2 000 kW, pour des\r\n applications commerciales et industrielles. Nous garantissons que\r\n les groupes électrogènes usagés Caterpillar sont testés en charge et\r\n régulièrement entretenus afin d’être pouvoir utilisé immédiatement\r\n après leur achat. Si vous avez besoin d’un groupe électrogène\r\n d’occasion pour votre chantier ou votre entreprise, veuillez\r\n contacter Location d’équipement Battlefield aujourd’hui pour obtenir\r\n plus d’information sur notre sélection de groupes électrogènes.\r\n

\r\n

Groupes électrogènes actuellement en vente:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Groupes électrogènes commerciaux et industriels usagés

\r\n

\r\n Location d’équipement Battlefield offre une large sélection de\r\n groupes électrogènes commerciaux et industriels. Nos groupes\r\n électrogènes au gaz et au diesel sont conçus pour fournir une\r\n performance et efficacité supérieures ainsi qu’une plus grande\r\n économie en carburant. Contactez-nous aujourd’hui pour obtenir plus\r\n d’information!\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"gens\",\r\n CatCodeSlug: \"gens\",\r\n EN: {\r\n Name: \"Stationary Generator Sets\",\r\n Meta:\r\n \"Battlefield Equipment Rentals carries a wide selection of used commercial and industrial generators. Our used gas and diesel generators are built to world-class standards, for high efficiency and low fuel consumption. Contact us today for more information!\",\r\n Desc: (\r\n <>\r\n

\r\n Generators provide power for countless agricultural, construction\r\n and mining projects across Canada. They are also often required to\r\n power complex business data centers and hospitals. Battlefield\r\n Equipment Rentals carries a large selection of used generators for\r\n commercial and industrial applications that range in power from 40\r\n kW to 2,000 kW. We guarantee that our Caterpillar used generators\r\n are load tested and regularly serviced to ensure that you can use\r\n your generator immediately after purchase. Whether you need a used\r\n generator for your job site or business, contact Battlefield\r\n Equipment Rentals today for more information about our used\r\n generator range.\r\n

\r\n

Used Generators Currently for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Used Commercial and Industrial Generators

\r\n

\r\n Battlefield Equipment Rentals carries a wide selection of used\r\n commercial and industrial generators. Our used gas and diesel\r\n generators are built to world-class standards, for high efficiency\r\n and low fuel consumption. Contact us today for more information!\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"GROUPES ÉLECTROGÈNES STATIONNAIRES\",\r\n Meta:\r\n \"Location d’équipement Battlefield offre une large sélection de groupes électrogènes commerciaux et industriels. Nos groupes électrogènes au gaz et au diesel sont conçus pour fournir une performance et efficacité supérieures ainsi qu’une plus grande économie en carburant. Contactez-nous aujourd’hui pour obtenir plus d’information!\",\r\n Desc: (\r\n <>\r\n

\r\n Les groupes électrogènes alimentent une multitude de projets\r\n miniers, d’agriculture et de construction à travers le Canada. Ils\r\n sont aussi souvent utilisés pour alimenter des centres hospitaliers\r\n et des centres complexes de données d’entreprise. Location\r\n d’équipement Battlefield offre une large sélection de groupes\r\n électrogènes usagés, qui livrent une puissance de 40 kW à 2 000 kW,\r\n pour des applications commerciales et industrielles. Nous\r\n garantissons que les groupes électrogènes usagés Caterpillar sont\r\n testés en charge et régulièrement entretenus afin d’être pouvoir\r\n utilisé immédiatement après leur achat. Si vous avez besoin d’un\r\n groupe électrogène d’occasion pour votre chantier ou votre\r\n entreprise, veuillez contacter Location d’équipement Battlefield\r\n aujourd’hui pour obtenir plus d’information sur notre sélection de\r\n groupes électrogènes.\r\n

\r\n

Groupes électrogènes actuellement en vente:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Groupes électrogènes commerciaux et industriels usagés

\r\n

\r\n Location d’équipement Battlefield offre une large sélection de\r\n groupes électrogènes commerciaux et industriels. Nos groupes\r\n électrogènes au gaz et au diesel sont conçus pour fournir une\r\n performance et efficacité supérieures ainsi qu’une plus grande\r\n économie en carburant. Contactez-nous aujourd’hui pour obtenir plus\r\n d’information!\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"inen\",\r\n CatCodeSlug: \"inen\",\r\n EN: {\r\n Name: \"Industrial Engines\",\r\n Meta:\r\n \"Battlefield Equipment Rentals carries a wide selection of used commercial and industrial generators. Our used gas and diesel generators are built to world-class standards, for high efficiency and low fuel consumption. Contact us today for more information!\",\r\n Desc: (\r\n <>\r\n

\r\n Generators provide power for countless agricultural, construction\r\n and mining projects across Canada. They are also often required to\r\n power complex business data centers and hospitals. Battlefield\r\n Equipment Rentals carries a large selection of used generators for\r\n commercial and industrial applications that range in power from 40\r\n kW to 2,000 kW. We guarantee that our Caterpillar used generators\r\n are load tested and regularly serviced to ensure that you can use\r\n your generator immediately after purchase. Whether you need a used\r\n generator for your job site or business, contact Battlefield\r\n Equipment Rentals today for more information about our used\r\n generator range.\r\n

\r\n

Used Generators Currently for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Used Commercial and Industrial Generators

\r\n

\r\n Battlefield Equipment Rentals carries a wide selection of used\r\n commercial and industrial generators. Our used gas and diesel\r\n generators are built to world-class standards, for high efficiency\r\n and low fuel consumption. Contact us today for more information!\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"MOTEURS INDUSTRIELS\",\r\n Meta:\r\n \"Location d’équipement Battlefield offre une large sélection de groupes électrogènes commerciaux et industriels. Nos groupes électrogènes au gaz et au diesel sont conçus pour fournir une performance et efficacité supérieures ainsi qu’une plus grande économie en carburant. Contactez-nous aujourd’hui pour obtenir plus d’information!\",\r\n Desc: (\r\n <>\r\n

\r\n Les groupes électrogènes alimentent une multitude de projets\r\n miniers, d’agriculture et de construction à travers le Canada. Ils\r\n sont aussi souvent utilisés pour alimenter des centres hospitaliers\r\n et des centres complexes de données d’entreprise. Location\r\n d’équipement Battlefield offre une large sélection de groupes\r\n électrogènes usagés, qui livrent une puissance de 40 kW à 2 000 kW,\r\n pour des applications commerciales et industrielles. Nous\r\n garantissons que les groupes électrogènes usagés Caterpillar sont\r\n testés en charge et régulièrement entretenus afin d’être pouvoir\r\n utilisé immédiatement après leur achat. Si vous avez besoin d’un\r\n groupe électrogène d’occasion pour votre chantier ou votre\r\n entreprise, veuillez contacter Location d’équipement Battlefield\r\n aujourd’hui pour obtenir plus d’information sur notre sélection de\r\n groupes électrogènes.\r\n

\r\n

Groupes électrogènes actuellement en vente:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Groupes électrogènes commerciaux et industriels usagés

\r\n

\r\n Location d’équipement Battlefield offre une large sélection de\r\n groupes électrogènes commerciaux et industriels. Nos groupes\r\n électrogènes au gaz et au diesel sont conçus pour fournir une\r\n performance et efficacité supérieures ainsi qu’une plus grande\r\n économie en carburant. Contactez-nous aujourd’hui pour obtenir plus\r\n d’information!\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"genm\",\r\n CatCodeSlug: \"genm\",\r\n EN: {\r\n Name: \"Mobile Generator Sets\",\r\n Meta:\r\n \"Battlefield Equipment Rentals carries a wide selection of used commercial and industrial generators. Our used gas and diesel generators are built to world-class standards, for high efficiency and low fuel consumption. Contact us today for more information!\",\r\n Desc: (\r\n <>\r\n

\r\n Generators provide power for countless agricultural, construction\r\n and mining projects across Canada. They are also often required to\r\n power complex business data centers and hospitals. Battlefield\r\n Equipment Rentals carries a large selection of used generators for\r\n commercial and industrial applications that range in power from 40\r\n kW to 2,000 kW. We guarantee that our Caterpillar used generators\r\n are load tested and regularly serviced to ensure that you can use\r\n your generator immediately after purchase. Whether you need a used\r\n generator for your job site or business, contact Battlefield\r\n Equipment Rentals today for more information about our used\r\n generator range.\r\n

\r\n

Used Generators Currently for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Used Commercial and Industrial Generators

\r\n

\r\n Battlefield Equipment Rentals carries a wide selection of used\r\n commercial and industrial generators. Our used gas and diesel\r\n generators are built to world-class standards, for high efficiency\r\n and low fuel consumption. Contact us today for more information!\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"GROUPES ÉLECTROGÈNES MOBILES (2)\",\r\n Meta:\r\n \"Location d’équipement Battlefield offre une large sélection de groupes électrogènes commerciaux et industriels. Nos groupes électrogènes au gaz et au diesel sont conçus pour fournir une performance et efficacité supérieures ainsi qu’une plus grande économie en carburant. Contactez-nous aujourd’hui pour obtenir plus d’information!\",\r\n Desc: (\r\n <>\r\n

\r\n Les groupes électrogènes alimentent une multitude de projets\r\n miniers, d’agriculture et de construction à travers le Canada. Ils\r\n sont aussi souvent utilisés pour alimenter des centres hospitaliers\r\n et des centres complexes de données d’entreprise. Location\r\n d’équipement Battlefield offre une large sélection de groupes\r\n électrogènes usagés, qui livrent une puissance de 40 kW à 2 000 kW,\r\n pour des applications commerciales et industrielles. Nous\r\n garantissons que les groupes électrogènes usagés Caterpillar sont\r\n testés en charge et régulièrement entretenus afin d’être pouvoir\r\n utilisé immédiatement après leur achat. Si vous avez besoin d’un\r\n groupe électrogène d’occasion pour votre chantier ou votre\r\n entreprise, veuillez contacter Location d’équipement Battlefield\r\n aujourd’hui pour obtenir plus d’information sur notre sélection de\r\n groupes électrogènes.\r\n

\r\n

Groupes électrogènes actuellement en vente:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Groupes électrogènes commerciaux et industriels usagés

\r\n

\r\n Location d’équipement Battlefield offre une large sélection de\r\n groupes électrogènes commerciaux et industriels. Nos groupes\r\n électrogènes au gaz et au diesel sont conçus pour fournir une\r\n performance et efficacité supérieures ainsi qu’une plus grande\r\n économie en carburant. Contactez-nous aujourd’hui pour obtenir plus\r\n d’information!\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"100a\",\r\n CatCodeSlug: \"100a\",\r\n EN: {\r\n Name: \"Systems / Components\",\r\n Meta:\r\n \"Battlefield Equipment Rentals carries a wide selection of used commercial and industrial generators. Our used gas and diesel generators are built to world-class standards, for high efficiency and low fuel consumption. Contact us today for more information!\",\r\n Desc: (\r\n <>\r\n

\r\n Generators provide power for countless agricultural, construction\r\n and mining projects across Canada. They are also often required to\r\n power complex business data centers and hospitals. Battlefield\r\n Equipment Rentals carries a large selection of used generators for\r\n commercial and industrial applications that range in power from 40\r\n kW to 2,000 kW. We guarantee that our Caterpillar used generators\r\n are load tested and regularly serviced to ensure that you can use\r\n your generator immediately after purchase. Whether you need a used\r\n generator for your job site or business, contact Battlefield\r\n Equipment Rentals today for more information about our used\r\n generator range.\r\n

\r\n

Used Generators Currently for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Used Commercial and Industrial Generators

\r\n

\r\n Battlefield Equipment Rentals carries a wide selection of used\r\n commercial and industrial generators. Our used gas and diesel\r\n generators are built to world-class standards, for high efficiency\r\n and low fuel consumption. Contact us today for more information!\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"COMPOSANTS DE SYSTÈMES\",\r\n Meta:\r\n \"Location d’équipement Battlefield offre une large sélection de groupes électrogènes commerciaux et industriels. Nos groupes électrogènes au gaz et au diesel sont conçus pour fournir une performance et efficacité supérieures ainsi qu’une plus grande économie en carburant. Contactez-nous aujourd’hui pour obtenir plus d’information!\",\r\n Desc: (\r\n <>\r\n

\r\n Les groupes électrogènes alimentent une multitude de projets\r\n miniers, d’agriculture et de construction à travers le Canada. Ils\r\n sont aussi souvent utilisés pour alimenter des centres hospitaliers\r\n et des centres complexes de données d’entreprise. Location\r\n d’équipement Battlefield offre une large sélection de groupes\r\n électrogènes usagés, qui livrent une puissance de 40 kW à 2 000 kW,\r\n pour des applications commerciales et industrielles. Nous\r\n garantissons que les groupes électrogènes usagés Caterpillar sont\r\n testés en charge et régulièrement entretenus afin d’être pouvoir\r\n utilisé immédiatement après leur achat. Si vous avez besoin d’un\r\n groupe électrogène d’occasion pour votre chantier ou votre\r\n entreprise, veuillez contacter Location d’équipement Battlefield\r\n aujourd’hui pour obtenir plus d’information sur notre sélection de\r\n groupes électrogènes.\r\n

\r\n

Groupes électrogènes actuellement en vente:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Groupes électrogènes commerciaux et industriels usagés

\r\n

\r\n Location d’équipement Battlefield offre une large sélection de\r\n groupes électrogènes commerciaux et industriels. Nos groupes\r\n électrogènes au gaz et au diesel sont conçus pour fournir une\r\n performance et efficacité supérieures ainsi qu’une plus grande\r\n économie en carburant. Contactez-nous aujourd’hui pour obtenir plus\r\n d’information!\r\n

\r\n \r\n ),\r\n },\r\n },\r\n];\r\nexport default SEO_BFE;\r\n","import React from \"react\";\r\nimport { types_seoData } from \"../Types\";\r\n\r\nconst SEO_BFE: types_seoData[] = [\r\n {\r\n CatCode: \"Default\",\r\n CatCodeSlug: \"products\",\r\n\r\n EN: {\r\n Name: \"Jobsite Industrial Rental Services\",\r\n Meta: \"At Jobsite Industrial Rental Services, you will find the largest inventory of used Cat compact equipment in Eastern Canada. From landscaping to construction and excavating to road building, our powerhouse selection offers increased value and top-notch performance in all types of environments. Jobsite Industrial Rental Services is your authorized Caterpillar Dealer in Manitoba, Ontario, Quebec, New Brunswick, Nova Scotia, P.E.I., Newfoundland and Labrador.\",\r\n Desc: \"At Jobsite Industrial Rental Services, you will find the largest inventory of used Cat compact equipment in Eastern Canada. From landscaping to construction and excavating to road building, our powerhouse selection offers increased value and top-notch performance in all types of environments. Jobsite Industrial Rental Services is your authorized Caterpillar Dealer in Manitoba, Ontario, Quebec, New Brunswick, Nova Scotia, P.E.I., Newfoundland and Labrador.\",\r\n ExtraText: null,\r\n },\r\n FR: {\r\n Name: \"Location d'outils industriels Jobsite\",\r\n Meta: \"Chez Location d'outils industriels Jobsite, vous trouverez le plus grand inventaire d’équipement usagé Cat dans l’est du Canada. Que ce soit pour des applications de construction, de pavage, de concassage ou forestières, notre sélection d’équipement offre une valeur accrue et une performance inégalée dans tous les types d’environnements. Location d'outils industriels Jobsite est votre concessionnaire Caterpillar autorisé au Manitoba, en Ontario, au Québec, au Nouveau-Brunswick, en Nouvelle-Écosse, à l’Île-du-Prince-Édouard, à Terre-Neuve et Labrador et au Nunavut.\",\r\n Desc: \"Chez Location d'outils industriels Jobsite, vous trouverez le plus grand inventaire d’équipement usagé Cat dans l’est du Canada. Que ce soit pour des applications de construction, de pavage, de concassage ou forestières, notre sélection d’équipement offre une valeur accrue et une performance inégalée dans tous les types d’environnements. Location d'outils industriels Jobsite est votre concessionnaire Caterpillar autorisé au Manitoba, en Ontario, au Québec, au Nouveau-Brunswick, en Nouvelle-Écosse, à l’Île-du-Prince-Édouard, à Terre-Neuve et Labrador et au Nunavut.\",\r\n ExtraText: null,\r\n },\r\n },\r\n {\r\n CatCode: \"Articulated Trucks - Tombereaux Articulés\",\r\n CatCodeSlug: \"articulated-trucks-tombereaux-articules\",\r\n EN: {\r\n Name: \"Articulated Trucks\",\r\n Meta: \"Operational efficiency is maximized thanks to our rock-solid selection of used articulated trucks. Our dump trucks are ultra-tough, offering unmatched performance and traction control on rough or uneven terrain.\",\r\n Desc: (\r\n <>\r\n

Used Articulated Trucks – Built to Last!

\r\n

\r\n Does your construction site require an ultra-tough, reliable and\r\n cost-effective dump truck? Look no further than Jobsite Industrial\r\n Rental Services's extensive selection of used articulated trucks!\r\n Regardless of the heavy materials you need to haul or your project's\r\n budget, Jobsite Industrial Rental Services has the used dump truck\r\n to meet your specific needs and get the job done right!\r\n

\r\n

Used Articulated / Dump Trucks for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Need the Best Used Articulated Truck to start hauling ASAP?

\r\n

\r\n From Nova Scotia to Nunavut, Jobsite Industrial Rental Services has\r\n a wide selection of used articulated trucks that are ready to get to\r\n work! Our used dump trucks are durable and ready to handle payloads\r\n ranging in weight from 26.5 ton to 45.2 ton. Whatever you need to\r\n haul away – from rocks to cement to soil – our used articulated\r\n trucks can carry it all with ease! Our used dump trucks always\r\n handle rough and uneven terrain like a pro, because of a superior\r\n traction control system. Jobsite Industrial Rental Services used\r\n articulated trucks also contain advanced technologies and features\r\n like tipping and load dumping control, which help to reduce cycle\r\n times and fuel consumption. Our used dump trucks can come\r\n Caterpillar Certified and range in price from $25,000 CAD to\r\n $700,000 CAD.\r\n

\r\n
\r\n
\r\n Get Your Used Articulated Truck from Jobsite Industrial Rental\r\n Services Today!\r\n
\r\n

\r\n Experience how much faster and cheaper you can get your hauling done\r\n with a used articulated truck from Jobsite Industrial Rental\r\n Services! Caterpillar's used dump trucks are built to last and\r\n always get the job done right! Discover the difference a Caterpillar\r\n dump truck can make on your site! Contact us today for more\r\n information about our used articulated trucks or to get a quote for\r\n your next project!\r\n

\r\n

\r\n You can also find more information about our articulated trucks on{\" \"}\r\n \r\n Cat's official site\r\n \r\n .\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Tombereaux Articulés\",\r\n Meta: \"L’efficacité opérationnelle est maximisée grâce à notre sélection solide de tombereaux articulés usagés. Nos tombereaux sont ultra robustes, fournissant une performance accrue et un superbe contrôle de traction sur terrain rugueux ou accidenté.\",\r\n Desc: (\r\n <>\r\n

TOMBEREAUX ARTICULÉS USAGÉS

\r\n

\r\n Est-ce que vous avez besoin d’un tombereau résistant, fiable et\r\n rentable? Nous avons chez Location d'outils industriels Jobsite un\r\n choix étendu de tombereaux articulés usagés! Peu importe les\r\n matériaux lourds que vous devez transporter ou le budget de votre\r\n projet, Location d'outils industriels Jobsite a le camion articulé\r\n usagé qui répondra à vos besoins spécifiques et fera le travail\r\n correctement!\r\n

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

\r\n Avez-vous besoin du meilleur tombereau articulé usagé maintenant?\r\n

\r\n

\r\n De la Nouvelle-Écosse au Nunavut, Location d'outils industriels\r\n Jobsite a une vaste sélection de tombereaux articulés usagés prêts à\r\n se mettre au travail! Nos tombereaux articulés usagés sont durables\r\n et capables de manipuler des charges utiles allant de 26,5 tonnes à\r\n 45,2 tonnes. Tout ce que vous avez besoin de transporter - des\r\n roches au ciment en passant par la terre - nos tombereaux articulés\r\n usagés peuvent tout déplacer avec facilité! Nos tombereaux articulés\r\n usagés se comportent toujours comme un pro sur les terrains\r\n accidentés et inégaux, grâce à un système de contrôle de la traction\r\n supérieur. Les tombereaux articulés usagés Location d'outils\r\n industriels Jobsite contiennent également des technologies et des\r\n caractéristiques avancées comme le contrôle de basculement et de\r\n déversement de la charge, qui aident à réduire les temps de cycle et\r\n la consommation de carburant. Nos tombereaux articulés usagés\r\n peuvent être certifiés Caterpillar et leur prix varie de 25 000$ CAN\r\n à 700 000$ CAN.\r\n

\r\n
\r\n
\r\n Achetez votre tombereau articulé usagé chez Location d'outils\r\n industriels Jobsite dès aujourd'hui!\r\n
\r\n

\r\n Découvrez comment vous pouvez effectuer votre transport plus\r\n rapidement et à moindre coût avec un tombereau articulé usagé\r\n Location d'outils industriels Jobsite! Les tombereaux articulés\r\n usagés de Caterpillar sont construits pour durer et toujours bien\r\n faire le travail! Faites la différence sur votre chantier avec un\r\n tombereau articulé Caterpillar! Contactez-nous dès aujourd'hui pour\r\n plus d'information sur nos tombereaux articulés usagés ou pour\r\n obtenir un devis pour votre prochain projet!\r\n

\r\n

\r\n Trouvez plus d'information sur nos tombereaux articulés usagés sur\r\n le site web officiel de Caterpillar.\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Backhoe Loaders - Chargeuses-pelleteuses\",\r\n CatCodeSlug: \"backhoe-loaders-chargeuses-pelleteuses\",\r\n EN: {\r\n Name: \"Backhoe Loaders\",\r\n Meta: \"Our used Backhoe Loaders are a must-have for a variety of tasks, such as general construction, demolitions and excavations, landscaping, asphalt breaking and road paving.\",\r\n Desc: (\r\n <>\r\n

Used Backhoe Loaders for a Wide Variety of Tasks

\r\n

\r\n Backhoe loaders are necessary for a variety of tasks, such as\r\n general construction, demolition and excavating, landscaping,\r\n asphalt breaking and road paving. Are you looking for a used backhoe\r\n loader with a powerful engine, superior digging capability and the\r\n durability to handle any terrain? Jobsite Industrial Rental Services\r\n carries a large selection of used backhoe loaders to help you\r\n complete your next project on time and under budget!\r\n

\r\n

Used Backhoe Loaders for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Need the Best Used Backhoe Loader for Your Next Project?

\r\n

\r\n A backhoe loader is an essential piece of equipment on your site, so\r\n invest in the used backhoe loader that is reliable, versatile and\r\n can help you get the job done faster! Our used backhoe loaders\r\n continue to be a popular choice in urban engineering and\r\n construction projects because of their small, compact design, which\r\n provides machine versatility and allows them to go virtually\r\n anywhere. Despite their small size, our used backhoe loaders are\r\n quite powerful, ranging in net power from 68HP to 131HP. Equipping\r\n yourself with one of our used backhoe loaders means precise control\r\n and top-of-the-line performance that will improve construction\r\n productivity and lower machine operating costs!\r\n

\r\n
\r\n
\r\n Get Your Used Backhoe Loader from Jobsite Industrial Rental Services\r\n Today!\r\n
\r\n

\r\n If you need a backhoe loader that can handle challenging terrains,\r\n carry materials and dig through almost anything, choose a\r\n Caterpillar! Jobsite Industrial Rental Services has a wide selection\r\n of used Caterpillar backhoe loaders that come Caterpillar Certified,\r\n starting at $20,000 CAD. Contact us today for more information about\r\n our available used backhoe loaders or to get a quote for your next\r\n project!\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Rétrocaveuses\",\r\n Meta: \"Nos rétrocaveuses usagées à vendre sont indispensables pour une variété de travaux. Grâce à leur châssis compact, nos pépines d’occasion peuvent aller n’importe où, ce qui en fait un choix populaire pour les projets d’ingénierie ou de construction qui nécessitent une performance supérieure.\",\r\n Desc: (\r\n <>\r\n

Rétrocaveuses usagées pour une vaste gamme d’applications

\r\n

\r\n Les rétrocaveuses sont nécessaires pour une variété de travaux,\r\n comme la construction, l’excavation, la démolition, l’aménagement\r\n paysager, le travail d’asphalte et le pavage routier. Cherchez-vous\r\n une rétrocaveuse usagée avec un moteur puissant, une performance\r\n supérieure en matière de creusement et la durabilité pour affronter\r\n n’importe quel terrain? Location d'outils industriels Jobsite offre\r\n une vaste sélection de pépines usagées pour vous aider à compléter\r\n votre projet à temps et en deçà du budget!\r\n

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

\r\n Besoin de la meilleure rétrocaveuse usagée pour votre prochain\r\n projet?\r\n

\r\n

\r\n Sur votre chantier, une rétrocaveuse est une pièce d’équipement\r\n essentielle. Il est donc important de choisir une pépine usagée qui\r\n est fiable, polyvalente et qui peut vous aider à en accomplir\r\n beaucoup plus! Nos rétrocaveuses usagées sont un choix populaire\r\n pour les projets d’ingénierie et de construction grâce à leur\r\n châssis compact – qui leur permet d’aller n’importe où! En dépit de\r\n leurs dimensions, nos rétrocaveuses usagées sont performantes et\r\n livrent une puissance de 68 HP à 131 HP. En vous équipant d’une de\r\n nos rétrocaveuses usagées, vous obtiendrez un contrôle précis et une\r\n performance inégalable qui amélioreront votre productivité et\r\n réduiront vos coûts d’entretien!\r\n

\r\n
\r\n

\r\n Achetez votre pépine usagée chez Location d'outils industriels\r\n Jobsite dès aujourd’hui!\r\n

\r\n

\r\n Si vous avez besoin d’une rétrocaveuse qui fournit une maniabilité\r\n précise sur les terrains difficiles, qui porte les matériaux lourds\r\n et qui creuse partout, choisissez un Cat®! Location d'outils\r\n industriels Jobsite a une vaste sélection de pépines usagées qui\r\n peuvent être certifiées Caterpillar, et dont les prix commencent à\r\n 20 000 $ CAD. Contactez-nous aujourd’hui pour obtenir plus\r\n d’informations sur nos rétrocaveuses usagées ou demander un devis\r\n pour votre prochain projet!\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Compactors - Compacteurs\",\r\n CatCodeSlug: \"compactors-compacteurs\",\r\n EN: {\r\n Name: \"Compactors\",\r\n Meta: \"Jobsite Industrial Rental Services’ Industrial Compactors feature advanced technologies that boost durability, operational performance and efficacy.\",\r\n ExtraText: (\r\n <>\r\n

Looking to Purchase a Used Compactor for Your Next Project?

\r\n

\r\n Compacting to specifications is crucial for a variety of\r\n applications, so choose the Caterpillar compactor that is specially\r\n designed to handle your specific compaction tasks. Our used\r\n compactors feature advanced technologies that boost durability,\r\n operational performance and efficacy. Whether flattening soil,\r\n compacting landfill material or smoothing the surface of a newly\r\n paved road, our selection of combination rollers will offer value\r\n where it is needed most. If you need a soil compactor in Winnipeg, a\r\n pneumatic roller in Toronto or a landfill compactor in\r\n Pointe-Claire, Jobsite Industrial Rental Services has the used\r\n compactor you need! Our used compactors are affordable (starting at\r\n $13,500 CAD) and many come Caterpillar Certified.{\" \"}\r\n

\r\n
\r\n
\r\n Get Your Used Compactor from Jobsite Industrial Rental Services\r\n Today!\r\n
\r\n

\r\n If your landfill, agricultural or construction site needs a\r\n compactor, choose a used Caterpillar compactor from Jobsite\r\n Industrial Rental Services! We carry a wide selection of compactors\r\n (soil, vibratory soil and landfill) and rollers (pneumatic and\r\n tandem vibratory) that are affordable, cost-effective and backed by\r\n Caterpillar. Contact us today for more information about our range\r\n of used compactors!{\" \"}\r\n

\r\n \r\n ),\r\n Desc: (\r\n <>\r\n

Wide Selection of Used Compactors Available

\r\n

\r\n Wide Selection of Used Compactors Available Compactors are an\r\n important tool for many road building, landfill and construction\r\n sites, so it is essential to choose the used compactor specific to\r\n your needs. Are you looking for a dependable used compactor for your\r\n next project? If you require a soil compactor, vibratory soil\r\n compactor, landfill compactor, pneumatic rollers or tandem vibratory\r\n rollers, Jobsite Industrial Rental Services has the used Caterpillar\r\n compactor to match your project needs and get the job done!\r\n

\r\n

Used Compactors for Sale:

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Compacteurs\",\r\n Meta: \"Les compacteurs d’occasion de Location d'outils industriels Jobsite sont dotés de technologies avancées qui augmentent la durabilité, la performance et l’efficacité pour optimiser votre productivité sur le chantier. Nos rouleaux compacteurs usagés offrent un maximum de valeur pour tous vos besoins.\",\r\n Desc: (\r\n <>\r\n

Une vaste sélection de compacteurs usagés disponibles

\r\n

\r\n Les compacteurs sont un outil important pour de nombreux projets\r\n d’agriculture, de construction et de compactage. Il est donc\r\n essentiel de choisir le compacteur le mieux adapté à vos besoins.\r\n Cherchez-vous un compacteur usagé sûr pour votre prochain projet? Si\r\n vous avez besoin d’un compacteur du sol, d’un compacteur du sol\r\n vibrant, d’un compacteur de décharge, d’un rouleau pneumatique ou\r\n d’un rouleau vibrant, Location d'outils industriels Jobsite a le\r\n compacteur Cat® usagé qui répondra à vos besoins et fera le travail!\r\n

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

\r\n Voulez-vous acheter un compacteur usagé pour votre prochain projet?{\" \"}\r\n

\r\n

\r\n Un compactage conforme aux spécifications est important pour une\r\n variété d’applications. Mieux vaut donc choisir le compacteur Cat®\r\n qui a été fabriqué pour vos tâches précises. Nos compacteurs usagés\r\n sont dotés de technologies avancées qui en augmentent la durabilité,\r\n la performance et l’efficacité. Notre sélection de rouleaux mixtes,\r\n utilisés pour une variété de travaux – tels que le compactage de\r\n décharges et le lissage du sol et de la chaussée –, offre un maximum\r\n de valeur pour tous vos besoins. Si vous avez besoin d’un compacteur\r\n de sol à Winnipeg, d’un rouleau pneumatique à Toronto ou d’un\r\n compacteur de décharge à Pointe-Claire, Location d'outils\r\n industriels Jobsite a le compacteur usagé fait pour vous! Nos\r\n compacteurs usagés sont abordables (ils sont offerts à partir de 13\r\n 000 $ CAD) et peuvent être certifiés Caterpillar.\r\n

\r\n
\r\n
\r\n Obtenez votre compacteur usagé chez Location d'outils industriels\r\n Jobsite dès aujourd’hui!{\" \"}\r\n
\r\n

\r\n Si votre projet d’agriculture, de construction ou de compactage\r\n nécessite un compacteur, choisissez un compacteur Caterpillar de\r\n Location d'outils industriels Jobsite! Nous offrons une vaste\r\n sélection de compacteurs et de rouleaux mixtes abordables, rentables\r\n et garantis par Caterpillar. Contactez-nous aujourd’hui pour obtenir\r\n plus d’informations à propos de notre gamme de compacteurs usagés!\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Aggregate - Granulats\",\r\n CatCodeSlug: \"aggregate-granulats\",\r\n EN: {\r\n Name: \"Crushers and Screens\",\r\n Desc: (\r\n <>\r\n

Improve Your Bottom Line with Our Used Crushers and Screens

\r\n

\r\n Whether processing raw materials, manufacturing sand or handling\r\n glass in recycling applications, our used industrial crushing\r\n equipment will boost productivity and improve your bottom line.\r\n

\r\n

Used Crushers and Screens Currently for Sale:

\r\n \r\n ),\r\n Meta: \"Whether processing raw materials, mining sand or handling glass in recycling applications, our used industrial crushing equipment will boost productivity and improve your bottom line.\",\r\n ExtraText: (\r\n <>\r\n

Wide Range of Used Crushers and Screens

\r\n

\r\n Jobsite Industrial Rental Services carries a wide range of used\r\n crushers and screens for applications in the mining, quarry and\r\n recycling industries. Whether your job site requires fine grinding\r\n of stone, glass or other materials, Jobsite Industrial Rental\r\n Services will have the used crusher to meet your needs. The used\r\n screenrs we carry are able to process and effectively screen\r\n construction, demolition, soil and recycling debris. Jobsite\r\n Industrial Rental Services’s lineup of used crushers and screens\r\n includes well-known, trusted and reliable brands such as Lokotrack,\r\n Masaba, Metso and Nordberg CVB. If you need a used crusher and\r\n screen for your job site, contact Jobsite Industrial Rental Services\r\n today for more information or a quote!{\" \"}\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Concasseurs et cribles\",\r\n Meta: \"Que vous traitiez des matières premières, du sable, ou du verre dans des applications de recyclage, nos concasseurs et nos cribles usagés à vendre augmenteront votre productivité et amélioreront votre rentabilité.\",\r\n Desc: (\r\n <>\r\n

\r\n Améliorer votre rentabilité avec nos concasseurs et nos cribles\r\n usagés{\" \"}\r\n

\r\n

\r\n Que vous traitiez des matières premières, du sable, ou du verre dans\r\n des applications de recyclage, nos concasseurs et nos cribles usagés\r\n à vendre augmenteront votre productivité et amélioreront votre\r\n rentabilité. Nos broyeurs d’occasion sont plus souvent utilisés dans\r\n les carrières, les mines et les industries des agrégats, et sont\r\n conçus pour résister aux environnements les plus rigoureux, tout en\r\n offrant une performance de haute qualité. Pour tous vos besoins\r\n industriels, faites confiance aux concasseurs de pierres de Toromont\r\n Cat.{\" \"}\r\n

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Grande sélection de concasseurs et de cribles usagés

\r\n

\r\n Location d'outils industriels Jobsite offre une vaste gamme de\r\n cribles et de concasseurs usagés pour des applications dans les\r\n industries minières, de carrières et de recyclage. Que votre\r\n chantier nécessite de l’équipement pour broyer des pierres, du verre\r\n ou d’autres matériaux, vous pouvez compter sur Location d'outils\r\n industriels Jobsite pour répondre à vos besoins. Les cribles\r\n d’occasion que nous offrons sont capables de traiter et de filtrer\r\n efficacement les débris de construction, de démolition, de sol et de\r\n recyclage. La sélection de cribles et de concasseurs usagés de\r\n Location d'outils industriels Jobsite est composée de marques\r\n fiables et connues telles que Lokotrack, Masaba, Metso et Nordberg\r\n CVB. Si vous avez besoin d’une crible ou d’un concasseur usagé,\r\n contactez Location d'outils industriels Jobsite aujourd’hui pour\r\n obtenir un devis ou plus d’information.\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Excavators - Pelles Hydrauliques\",\r\n CatCodeSlug: \"excavators-pelles-hydrauliques\",\r\n EN: {\r\n Name: \"Excavators\",\r\n Meta: \"Excavators are an indispensable asset to any contractor’s fleet. Whatever the application, our selection of used excavators can get the job done safely and efficiently. A digger’s purpose is almost limitless thanks its exceptional speed, energy efficiency and lifting capacity.\",\r\n Desc: (\r\n <>\r\n

Used Cat excavators to help you dig up the profits!

\r\n

\r\n Whatever the application, Jobsite Industrial Rental Services’\r\n selection of used excavators can get the job done safely and\r\n efficiently. When you choose to buy used excavators, you are\r\n obtaining the absolute best machines for the job. Our used\r\n excavators offer limitless capabilities including exceptional speed,\r\n fuel efficiency and digging performance. Thanks to their rock-solid\r\n frames and robust components, our used mini hydraulic excavators\r\n provide unrivaled strength, durability and reliability on the most\r\n challenging terrain. From digging trenches and foundations, to post\r\n holes and breaking concrete, you can count on Jobsite Industrial\r\n Rental Services’ used mini hydraulic excavators to perform with\r\n unsurpassed power and agility.\r\n

\r\n

Our used excavators currently for sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

\r\n Jobsite Industrial Rental Services’ wide selection of used\r\n excavators{\" \"}\r\n

\r\n

\r\n Jobsite Industrial Rental Services used excavators are equipped with\r\n a long, heavy-duty undercarriage that offers greater stability when\r\n lifting heavy objects, thus greatly increasing daily productivity.\r\n Optimal performance and durability are achieved with a variety of\r\n standard and optional technologies such as{\" \"}\r\n \r\n Cat Connect solutions\r\n \r\n , which optimize production and minimize operating costs, and the\r\n abrasion-resistant Cat XT™-6 hose, which can withstand high\r\n pressures over long periods of time. With features such as a quiet,\r\n ergonomic cab that offers automatic climate control for the\r\n maintenance of consistent temperature, an LCD monitor that is easy\r\n to program and use, and large windows that provide a panoramic view,\r\n Jobsite Industrial Rental Services’ used excavators for sale enable\r\n you dominate the job site with ease, comfort and security.\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Excavatrices\",\r\n Meta: \"Les excavatrices usagées à vendre de Location d'outils industriels Jobsite sont un atout indispensable pour la flotte d’un entrepreneur. Quelle que soit l’application, notre sélection de pelles hydrauliques d’occasion fera en sorte que le travail sera accompli avec efficacité et en toute sécurité.\",\r\n Desc: \"Les excavatrices usagées à vendre de Location d'outils industriels Jobsite sont un atout indispensable pour la flotte d’un entrepreneur. Quelle que soit l’application, notre sélection de pelles hydrauliques d’occasion fera en sorte que le travail sera accompli avec efficacité et en toute sécurité. Grâce à leur vitesse, leur rendement énergétique et à leur puissance de levage exceptionnelle, Il n’y a pas de limites aux travaux que nos pelles mécaniques peuvent accomplir. Le châssis et les composants robustes de nos pelles sur chaines et nos pelles sur pneus offrent une puissance et une fiabilité supérieures sur les terrains difficiles et dans les environnements rigoureux. Que vous creusiez des tranchées ou des fondations, ou que vous faisiez du paillage forestier ou des travaux miniers, vous pouvez compter sur les excavatrices usagées de Location d'outils industriels Jobsite pour vous fournir une agilité, une productivité et une performance inégalés.\",\r\n ExtraText: (\r\n <>\r\n

\r\n La vaste sélection d’excavatrices usagées de Location d'outils\r\n industriels Jobsite\r\n

\r\n

\r\n Les excavatrices usagées de Location d'outils industriels Jobsite\r\n sont équipées d’un châssis robuste qui offre une stabilité\r\n supérieure pendant le transport d’objets lourds, ce qui augmente la\r\n productivité quotidienne. Une performance et une durabilité\r\n optimales sont atteintes grâce à une variété de technologies\r\n intégrées d’usine ou offert en option telles que (insert link), qui\r\n augmentent la productivité et réduisent les coûts d’exploitation. Le\r\n tuyau Cat XT™-6 résistant à l’abrasion permet aussi de résister à\r\n des pressions élevées pendant de longues périodes. Avec des\r\n fonctionnalités telles que la cabine ergonomique et silencieuse qui\r\n offre un contrôle de climat automatique pour une température\r\n constante, un écran LCD facile à programmer et à utiliser, et des\r\n grandes fenêtres offrant une vue panoramique, les excavatrices\r\n d’occasion de Location d'outils industriels Jobsite vous permettent\r\n de maîtrise le chantier avec facilité, confort et sécurité.{\" \"}\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Forest Products - Matériel Forestier\",\r\n CatCodeSlug: \"forest-products-materiel-forestier\",\r\n EN: {\r\n Name: \"Forest Products\",\r\n Meta: \"Jobsite Industrial Rental Services’ used forestry machines will satisfy your toughest application needs. Our commercial logging equipment provide increased stability on steep ground, fuel economy, efficient swing power and maximized visibility.\",\r\n Desc: (\r\n <>\r\n

Jobsite Industrial Rental Services’ Used Forestry Machines

\r\n

\r\n Jobsite Industrial Rental Services’ used forestry machines will\r\n satisfy your toughest application needs. Our commercial logging\r\n equipment provide increased stability on steep ground, fuel economy,\r\n efficient swing power and maximized visibility. Our varied inventory\r\n of feller bunchers, forwarders and skidders is your top pick for\r\n harvesting, extracting and loading goods on major projects, such as\r\n road building, lumber and reforestation.\r\n

\r\n

Used Forest Machines Currently for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Used Forest Machines for Any Job

\r\n

\r\n Jobsite Industrial Rental Services carries a selection of used\r\n forestry machines than can help complete your commercial logging\r\n needs. Our used forestry inventory includes feller bunchers,\r\n forwarders and skidders to meet your extracting, harvesting and\r\n loading needs. Caterpillar forestry machines are reliable, easy to\r\n maintain and provide increased stability and visibility on your\r\n jobsite. Our forestry machines are also powerful, ranging in net\r\n flywheel power from 149 HP to 291 HP. If your land management,\r\n logging or mill yard needs require rugged, purpose-built equipment\r\n to get the job done, contact Jobsite Industrial Rental Services\r\n today about our used forest machines.\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Produits forestiers \",\r\n Meta: \"Les machines forestières d’occasion de Location d'outils industriels Jobsite sauront satisfaire à vos besoins les plus ardus. Notre équipement d’exploitation forestière usagé fournit une superbe stabilité sur le terrain escarpé, une bonne économie de carburant, une visibilité maximisée et une puissance d’oscillation efficace.\",\r\n Desc: \"Les machines forestières d’occasion de Location d'outils industriels Jobsite sauront satisfaire à vos besoins les plus ardus. Notre équipement d’exploitation forestière fournit une superbe stabilité sur le terrain escarpé, une bonne économie de carburant, une visibilité maximisée et une puissance d’oscillation efficace. Notre inventaire varié d’abatteuses-groupeuses, de porteurs et de débardeurs usagés à vendre sont votre meilleur choix pour vos travaux d’extraction, de récolte ou de chargement de marchandise sur des projets majeurs de construction de route, d’exploitation forestière ou de reboisement.\",\r\n ExtraText: (\r\n <>\r\n

Des machines forestières usagées pour tout type de projet

\r\n

\r\n Location d'outils industriels Jobsite offre une sélection de\r\n produits forestiers usagés conçus pour répondre à tous vos besoins\r\n en matière d’exploitation forestière commerciale. Notre inventaire\r\n d’équipement forestier usagé, qui comprend des\r\n abatteuses-groupeuses, des porteurs et des débadeurs, vous permet\r\n d’accomplir tous vos travaux d'extraction, de récolte et de\r\n chargement. Les machines forestières Caterpillar sont fiables,\r\n faciles à entretenir et fournissent une stabilité et une visibilité\r\n supérieures sur le chantier. Notre équipement forestier est aussi\r\n très puissant, offrant une puissance d’inertie de 149 HP à 291 HP.\r\n Si vous nécessitez un équipement robuste et spécialement conçu pour\r\n vos travaux forestiers, contactez Location d'outils industriels\r\n Jobsite aujourd’hui pour obtenir plus d’information sur nos machines\r\n forestières d'occasion.\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Forklifts - Chariots Elévateurs\",\r\n CatCodeSlug: \"forklifts-chariots-elevateurs\",\r\n EN: {\r\n Name: \"Forklifts\",\r\n Meta: \"Safety, comfort and lifting capacity are just some of the features that make up a great Forklift. With Toromont Material Handling’s used lift trucks, you can easily cut costs and optimize your logistical operations.\",\r\n Desc: \"Safety, comfort and lifting capacity are just some of the features that make up a great forklift. With Toromont Material Handling’s used lift trucks, you can easily cut costs and optimize your logistical operations. Our diesel and electric forklifts are robust, durable, powerful and comfortable to operate, helping to minimize downtime for higher productivity and cost efficiency. Whatever the industry, we have a solution for all of your material handling needs.\",\r\n ExtraText: null,\r\n },\r\n FR: {\r\n Name: \"Chariots Elévateurs\",\r\n Meta: \"Un bon chariot élévateur doit posséder des caractéristiques supérieures en termes de sécurité, de confort et de capacité de levage. Avec les chariots élévateurs usagés de Toromont Manutention, vous pouvez facilement réduire et optimiser vos coûts d’opérations logistiques.\",\r\n Desc: \"Un bon chariot élévateur doit posséder des caractéristiques supérieures en termes de sécurité, de confort et de capacité de levage. Avec les chariots élévateurs usagés de Toromont Manutention, vous pouvez facilement réduire et optimiser vos coûts d’opérations logistiques. Nos chariots élévateurs électriques et à combustion sont robustes, durables, puissants et confortables, permettant de réduire vos temps d’arrêt pour une plus grande productivité et une meilleure rentabilité. Quel que soit l’industrie, nous avons une solution pour tous vos besoins en matière de manutention.\",\r\n ExtraText: null,\r\n },\r\n },\r\n {\r\n CatCode: \"Mining Equipment - Machines Pour Mines\",\r\n CatCodeSlug: \"mining-equipment-machines-pour-mines\",\r\n EN: {\r\n Name: \"Mining Equipment\",\r\n Meta: \"To navigate the notoriously rigorous terrain and harsh environment that is common to the mining industry, you need Jobsite Industrial Rental Services’ used mining equipment. Our selection of used mining equipment will optimize your operations by delivering value and heavy-duty performance.\",\r\n Desc: (\r\n <>\r\n

Optimize Your Operations with Our Used Mining Equipment

\r\n

\r\n To navigate the notoriously rigorous terrain and harsh environment\r\n that is common to the mining industry, you need Jobsite Industrial\r\n Rental Services’s used mining equipment. Our selection of used\r\n mining equipment will optimize your operations by delivering value\r\n and heavy-duty performance. Our machines offer superb traction,\r\n rigidity and hydraulic efficiency with premium components and\r\n advanced technologies. Thanks to our commercial mining vehicles, you\r\n can move material swiftly and at lower cost.\r\n

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Most Advanced Lineup of Used Mining Equipment

\r\n

\r\n Jobsite Industrial Rental Services carries the mining industry’s\r\n largest and most advanced lineup of used mining equipment for\r\n surface mining applications. Whether your mining site requires\r\n digging, drilling, hauling or moving, Jobsite Industrial Rental\r\n Services has the used mining equipment, loading tools and commercial\r\n mining vehicles needed to get the job done. Caterpillar’s used\r\n mining equipment is renowned for its efficiency, excellent traction\r\n and rigidity to help you move your materials faster. Contact Jobsite\r\n Industrial Rental Services today for more information about our used\r\n mining equipment!\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Équipements miniers\",\r\n Meta: \"Pour naviguer sur le terrain rigoureux et difficile qui est commun à l’industrie minière, il vous faut l’équipement minier usagé de Location d'outils industriels Jobsite. Notre sélection d’équipements miniers améliorera vos opérations en livrant une performance de longue durée.\",\r\n Desc: \"Pour naviguer sur le terrain rigoureux et difficile qui est commun à l’industrie minière, il vous faut l’équipement minier usagé de Location d'outils industriels Jobsite. Notre sélection d’équipements miniers améliorera vos opérations en livrant une performance de longue durée et une valeur supérieure. Nos machines sont dotées de technologies avancées et de composants de qualité qui fournissent une superbe traction, une plus grande durabilité et une puissance hydraulique exceptionnelle. Grâce à nos véhicules miniers commerciaux, vous pouvez transporter votre matériel plus rapidement à un coût moins élevé.\",\r\n ExtraText: (\r\n <>\r\n

La plus grande gamme d’équipement minier usagé

\r\n

\r\n Location d'outils industriels Jobsite offre la plus grande sélection\r\n d’équipement minier usagé pour tous vos travaux miniers. Que votre\r\n chantier nécessite des travaux de terrassement, de forage ou de\r\n transport, l’équipement minier usagé de Location d'outils\r\n industriels Jobsite vous aidera à optimiser votre productivité.\r\n L’équipement d’exploitation minière d’occasion Caterpillar est\r\n réputé pour son efficacité, sa traction supérieure et sa rigidité,\r\n vous permettant de transporter vos matériaux plus rapidement.\r\n Contactez Jobsite Industrial Rental Services aujourd’hui pour\r\n obtenir plus d’information sur notre équipement minier usagé!\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Motor Graders - Niveleuses\",\r\n CatCodeSlug: \"motor-graders-niveleuses\",\r\n EN: {\r\n Name: \"Motor Graders\",\r\n Meta: \"Your fleet isn’t complete without a Jobsite Industrial Rental Services motor grader. Our used graders provide precise maneuverability in tight spaces and excellent traction on slopes and soft underfoot conditions.\",\r\n Desc: (\r\n <>\r\n

Jobsite Industrial Rental Services’ Used Motor Graders

\r\n

\r\n Your fleet isn’t complete without a Jobsite Industrial Rental\r\n Services motor grader. Our used graders provide precise\r\n maneuverability in tight spaces and excellent traction on slopes and\r\n soft underfoot conditions. Motor graders can easily travel from\r\n point A to point B, and can handle multiple jobs in a variety of\r\n applications. Their invaluable, multi-faceted usage in road paving,\r\n construction, farming and snow removal applications makes them a\r\n truly versatile machine.\r\n

\r\n

Used Motor Graders Currently for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Used Motor Graders to Flatten Any Jobsite

\r\n

\r\n The Cat motor graders we carry are renowned for their controls,\r\n technology, hydraulics and comfortable cabs. Jobsite Industrial\r\n Rental Services carries used motor graders that range in power from\r\n 179 HP to 535 HP with blade widths from 12 ft to 24 ft, designed to\r\n help you get the job done. They also work well on sloped or soft\r\n terrain and provide excellent maneuvering in small spaces. If you\r\n need a used motor grader for agricultural, construction, paving or\r\n snow removal applications, contact Jobsite Industrial Rental\r\n Services today!\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Niveleuses\",\r\n Meta: \"Votre flotte n’est pas complète sans une niveleuse usagée de Location d'outils industriels Jobsite. Nos niveleuses d’occasion à vendre fournissent une maniabilité précise dans les espaces restreints et une excellente traction sur les pentes et le sol à faible portance.\",\r\n Desc: \"Votre flotte n’est pas complète sans une niveleuse usagée de Location d'outils industriels Jobsite. Nos niveleuses d’occasion à vendre fournissent une maniabilité précise dans les espaces restreints et une excellente traction sur les pentes et le sol à faible portance. Les niveleuses sont complètement polyvalentes, car elles peuvent se déplacer facilement entre les chantiers et peuvent accomplir plusieurs travaux dans une grande variété d’applications, comme celles du pavage, de la construction, de l’agriculture et du déneigement.\",\r\n ExtraText: (\r\n <>\r\n

Maîtrisez le chantier avec nos niveleuses usagées

\r\n

\r\n Nos niveleuses Cat sont réputées pour leur excellent contrôle, leurs\r\n technologies avancées, leurs systèmes hydrauliques supérieurs et\r\n leurs cabines ergonomiques. Les niveleuses d’occasion de Toromont\r\n Cat ont une puissance de 179 HP à 535 HP et une largeur de lame de\r\n 12 pi à 14 pi, vous permettant d’accomplir vos projets avec plus\r\n d’efficacité. Elles offrent aussi une maniabilité accrue sur les\r\n pentes et dans les espaces étroits. Si vous avez besoin d’une\r\n niveleuse pour vos travaux d’agriculture, de construction, de pavage\r\n ou de déneigement, contactez Location d'outils industriels Jobsite\r\n aujourd’hui!{\" \"}\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Off-highway Trucks / Tractors - Tombereaux rigides / tracteurs\",\r\n CatCodeSlug: \"off-highway-trucks-tractors-tombereaux-rigides-tracteurs\",\r\n EN: {\r\n Name: \"Off-highway Trucks / Tractors\",\r\n Meta: \"Off highway trucks are specifically designed for the mining, quarry and construction industries, where challenging terrain and extreme environments are the norm. In these industries, durability, reliability and load capacity matter the most.\",\r\n Desc: (\r\n <>\r\n

Exceed Your Expectations with Our Used Off-Highway Trucks

\r\n

\r\n Off highway trucks are specifically designed for the mining, quarry\r\n and construction industries, where challenging terrain and extreme\r\n environments are the norm. In these industries, durability,\r\n reliability and load capacity matter the most. Toromont’s used off\r\n highway trucks will exceed your expectations. Excellent hauling\r\n capabilities, maneuverability, safety and operating costs are just\r\n some of the outstanding features of our machines.\r\n

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Wide Range of Used Off-Highway Trucks and Tractors

\r\n

\r\n Jobsite Industrial Rental Services carries a range of used\r\n off-highway trucks created specifically to handle mining,\r\n construction and quarry challenges. Our Caterpillar used off-highway\r\n trucks can carry payloads between 42.1 ton and 98.4 ton and travel\r\n more than 40 mph when fully loaded. Caterpillar’s used off-highway\r\n trucks are built to withstand a variety of environments and terrains\r\n and can be relied upon to get the job done when it matters most. If\r\n your next construction, mining or quarry project needs a used\r\n off-highway truck, contact Jobsite Industrial Rental Services today!{\" \"}\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Tombereaux rigides / tracteurs\",\r\n Meta: \"Les tombereaux rigides sont spécialement conçus pour les industries minières où le terrain est habituellement difficile et les environnements sont extrêmes. Dans ces types d’industries, la durabilité, la fiabilité et la capacité de charge sont d’une grande importance.\",\r\n Desc: \"Les tombereaux rigides sont spécialement conçus pour les industries minières où le terrain est habituellement difficile et les environnements sont extrêmes. Dans ces types d’industries, la durabilité, la fiabilité et la capacité de charge sont d’une grande importance. Les tombereaux et les tracteurs rigides usagés de Location d'outils industriels Jobsite sauront dépasser vos atteintes, car ils sont fiables, sécuritaires et économiques, et offrent d’excellentes capacités de transport.\",\r\n ExtraText: (\r\n <>\r\n

Une grande gamme de tombereaux rigides et de tracteurs usagés

\r\n

\r\n Location d'outils industriels Jobsite offre une gamme de tombereaux\r\n rigides conçus spécialement pour les travaux miniers, de\r\n construction et de carrière. Nos tombereaux rigides Caterpillar\r\n peuvent transporter des charges entre 42,1 tonnes et 98,4 tonnes et\r\n parcourir des distances de plus de 40 mph. Les tombereaux rigides\r\n usagés Caterpillar sont extrêmement fiables, car ils sont construits\r\n pour résister à une variété d’environnements et de terrains. Si\r\n votre prochain projet minier, de construction ou de carrière\r\n nécessite un tombereau rigide, contactez Location d'outils\r\n industriels Jobsite aujourd’hui!\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"On-highway Trucks - Camions Routiers\",\r\n CatCodeSlug: \"on-highway-trucks-camions-routiers\",\r\n EN: {\r\n Name: \"On-highway Trucks\",\r\n Meta: \"Designed for the long haul, our premium selection of used on-highway trucks will help you transport today’s heavy loads with ease and efficiency.\",\r\n Desc: \"Our premium selection of used on-highway trucks will help you transport today’s heavy loads with ease and efficiency. Designed for the long haul, our used transport trucks feature an ergonomic cab that delivers superior comfort, a powerful, fuel-efficient engine that can handle long distances, a rugged, industrial build for long-lasting performance, and technologically advanced features that will optimize the drive, enhancing any hauling application for superior productivity and results at top value.\",\r\n ExtraText: null,\r\n },\r\n FR: {\r\n Name: \"Camions Routiers\",\r\n Meta: \"Conçue pour le transport de charges lourdes, notre sélection de camions routiers usagés vous permettra d’effectuer vos applications de transport avec facilité et efficacité.\",\r\n Desc: \"Notre sélection de camions routiers usagés vous permettra d’effectuer vos applications de transport avec facilité et efficacité. Conçus pour le transport de charges lourdes, nos camions de transport usagés sont équipés d'une cabine ergonomique offrant un confort supérieur, d'un moteur puissant et faible en carburant, d'une construction robuste pour une durabilité accrue, et de technologies avancées qui optimisent la conduite et la performance, fournissant une productivité et des résultats supérieurs.\",\r\n ExtraText: null,\r\n },\r\n },\r\n {\r\n CatCode: \"Paving Products - Matériel Routier\",\r\n CatCodeSlug: \"paving-products-materiel-routier\",\r\n EN: {\r\n Name: \"Paving Products\",\r\n Meta: \"Our range of used asphalt pavers and rollers will provide economical and versatile solutions for all types of paving needs, from airport and highway projects to small housing developments.\",\r\n Desc: (\r\n <>\r\n

Used Asphalt Pavers for all Your Paving Needs

\r\n

\r\n Our range of used asphalt pavers and rollers will provide economical\r\n and versatile solutions for all types of paving needs, from airport\r\n and highway projects to small housing developments. Jobsite\r\n Industrial Rental Services’s paving equipment is the ideal choice\r\n for demanding applications that require fuel efficiency, comfortable\r\n operating conditions, impressive mobility and superior\r\n functionality. With our selection of used wheel and steel track\r\n pavers, you can take any job to the next level.\r\n

\r\n

Used Asphalt Pavers Currently for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Our Selection of Used Paving Products

\r\n

\r\n Jobsite Industrial Rental Services carries a large selection of used\r\n paving products – including wheel and track asphalt pavers and\r\n screeds – for sale or rental. Caterpillar’s used paving products are\r\n known for their mobility, fuel efficiency and comfortable cab\r\n conditions for operators. Our asphalt pavers are also renowned for\r\n their high horsepower, ranging in gross power from 46 HP to 225 HP.\r\n Whatever your paving needs, Jobsite Industrial Rental Services has\r\n the used paving products to get your job done. Contact us for more\r\n information or a quote today!\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Produits de pavage\",\r\n Meta: \"Notre gamme de finisseurs et de rouleaux usagés fournit des solutions économiques et polyvalentes pour tous besoins en matière de pavage, que ce soit pour des projets d’autoroute, d’aéroport ou des développements résidentiels.\",\r\n Desc: \"Notre gamme de finisseurs et de rouleaux usagés fournit des solutions économiques et polyvalentes pour tous besoins en matière de pavage, que ce soit pour des projets d’autoroute, d’aéroport ou de développement résidentiel. L’équipement de pavage de Location d'outils industriels Jobsite est le choix idéal pour les applications exigeantes nécessitant une faible consommation de carburant, une opération confortable, une mobilité impressionnante et une fonctionnalité supérieure. Avec notre sélection de finisseurs sur roues ou sur chaînes, votre travail peut atteindre des nouveaux sommets.\",\r\n ExtraText: (\r\n <>\r\n

Notre sélection de produits de pavage usagés

\r\n

\r\n Location d'outils industriels Jobsite offre une vaste sélection de\r\n produits de pavage usagés à vendre ou pour location. Notre gamme de\r\n finisseurs et de rouleaux Caterpillar sont renommés pour leur\r\n mobilité, leur efficacité en carburant et leurs cabines\r\n confortables. Nos finisseurs sont aussi réputés pour leur puissance\r\n élevée, allant de 46 HP à 225 HP. Quels que soient vos besoins, vous\r\n pouvez compter sur Location d'outils industriels Jobsite pour les\r\n produits de pavage les plus efficaces. Contactez-nous aujourd’hui\r\n pour demander une soumission ou pour obtenir plus d’information!{\" \"}\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Skid Steer Loaders / ASV - Chargeurs Compacts rigides\",\r\n CatCodeSlug: \"skid-steer-loaders-asv-chargeurs-compacts-rigides\",\r\n EN: {\r\n Name: \"Skid Steer Loaders\",\r\n Meta: \"Skid steer loaders are highly adaptable machines. With the use of different attachments, multi terrain loaders can handle a wide range of jobs from snow removal and landscaping to debris removal.\",\r\n Desc: (\r\n <>\r\n

Jobsite Industrial Rental Services’ Used Skid Steer Loaders

\r\n

\r\n Skid Steer Loaders are highly adaptable machines. With the use of\r\n different attachments, skid steer loaders can handle a wide range of\r\n jobs from snow removal and landscaping to debris removal. Jobsite\r\n Industrial Rental Services’ used skid steer loaders are primed for\r\n digging, grading, pushing or loading in almost any kind of\r\n environment.\r\n

\r\n

Used Skid Steer Loaders Currently for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Used Skid Steer Loaders to Get the Job Done

\r\n

\r\n Skid steer loaders are strong, powerful machines with arms that can\r\n be attached to a variety of Cat attachments for different\r\n applications. Jobsite Industrial Rental Services carries several\r\n models of used skid steer loaders that range in power from 65.8 HP\r\n to 106 HP and have an operating capacity of 1550 lb to 3650 lb. Our\r\n used Caterpillar skid steer loaders are known worldwide for their\r\n durability, reliability, efficiency and simple controls. Jobsite\r\n Industrial Rental Services’s used steer loaders are designed and\r\n built to help you get the job done, so contact us for more\r\n information today!\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Chargeurs Compacts rigides\",\r\n Meta: \"Les chargeurs compacts rigides sont très adaptables. En utilisant plusieurs accessoires différents, les chargeurs tout terrain peuvent accomplir un large éventail de travaux comme le déneigement, l’aménagement paysager et l’élimination des débris.\",\r\n Desc: \"Les chargeurs compacts rigides sont très adaptables. En utilisant plusieurs accessoires différents, les chargeurs tout terrain peuvent accomplir un large éventail de travaux comme le déneigement, l’aménagement paysager et l’élimination des débris. Les chargeurs compacts rigides usagés de Location d'outils industriels Jobsite sont prêts à creuser, à niveler, à pousser ou à transporter dans n’importe quel type d’environnement. Nos petits chargeurs sont idéals pour les travaux d’intérieur ou les espaces étroits, tandis que nos gros chargeurs sont parfaits pour les grands travaux d’extérieur tels que la démolition et l’exploitation forestière.\",\r\n ExtraText: (\r\n <>\r\n

\r\n Les chargeurs compacts rigides usagés pour un travail bien fait\r\n

\r\n

\r\n Les chargeurs compacts rigides sont des machines robustes et\r\n puissantes avec des bras qui peuvent être fixés à une variété\r\n d’accessoires Cat pour différentes applications. Jobsite Industrial\r\n Rental Services offre plusieurs modèles de chargeurs compacts\r\n rigides avec une puissance de 65,8 HP à 106 HP et une capacité de\r\n chargement de 1 550 lb à 3 650 lb. Nos chargeurs compacts rigides\r\n Caterpillar sont connus dans le monde entier pour leur durabilité,\r\n leur fiabilité, leur efficacité et leurs technologies de pointe. Les\r\n chargeurs compacts rigides d’occasion de Location d'outils\r\n industriels Jobsite sont conçus pour faciliter tout type de travail,\r\n alors contactez-nous aujourd’hui pour obtenir plus d’information!\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Telehandlers - Chargeurs à Bras Télescopique\",\r\n CatCodeSlug: \"telehandlers-chargeurs-a-bras-telescopique\",\r\n EN: {\r\n Name: \"Telehandlers\",\r\n Meta: \"With Jobsite Industrial Rental Services’ used telehandlers, nothing is out of reach. Our line of telescopic lifts add unmatched versatility and ease of handling to any industry application.\",\r\n Desc: (\r\n <>\r\n

\r\n Jobsite Industrial Rental Services’ Selection of Used Telehandlers{\" \"}\r\n

\r\n

\r\n Jobsite Industrial Rental Services’ selection of Used Telehandlers\r\n With Jobsite Industrial Rental Services’ used telehandlers, nothing\r\n is out of reach. Our line of telescopic lifts add unmatched\r\n versatility and ease of handling to any industry application.\r\n Telehandlers can operate where forklifts and conventional equipment\r\n cannot, offering extra stability on steep or rough terrain,\r\n durability for heavy load handling, and optimal lift and reach\r\n capabilities for hard-hitting results.\r\n

\r\n

Used Telehandlers Currently for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Used Telehandlers for Any Job

\r\n

\r\n Jobsite Industrial Rental Services’ used telehandlers by Caterpillar\r\n are easily maneuverable and versatile for use in a variety of\r\n industries. The used telehandlers we carry are known for their reach\r\n and lift capabilities and have load capacities ranging from 5,500 lb\r\n to 12,000 lb. Our used telehandlers are specifically built and\r\n designed to operate in challenging terrains where conventional heavy\r\n equipment would struggle. If your job site or next project could\r\n benefit from a durable, powerful and reliable telehandler, contact\r\n Jobsite Industrial Rental Services for more information today!\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Chargeurs à Bras Télescopique\",\r\n Meta: \"Avec les chargeurs à bras télescopique usagés de Location d'outils industriels Jobsite, le ciel est à votre portée. Notre gamme de chargeurs à bras télescopique ajoute une polyvalence et une facilité de manutention à n’importe quelle application.\",\r\n Desc: \"Avec les chargeurs à bras télescopique usagés de Location d'outils industriels Jobsite, le ciel est à votre portée. Notre gamme de chargeurs à bras télescopique ajoute une polyvalence et une facilité de manutention à n’importe quelle application. Les chargeurs à bras télescopique peuvent travailler là où les chariots élévateurs et l’équipement conventionnel ne peuvent pas, fournissant une capacité de levage impressionnante, une superbe stabilité sur le terrain escarpé ou difficile, et une bonne durabilité pour la manutention de charges lourdes.\",\r\n ExtraText: (\r\n <>\r\n

Des chargeurs à bras télescopique pour tout type de travail

\r\n

\r\n Les chargeurs à bras télescopique Caterpillar sont conçus pour une\r\n variété d’industries car ils sont polyvalents et faciles à\r\n manœuvrer. Nos chargeurs à bras télescopique sont connus pour leur\r\n capacité de chargement supérieure. Ils sont capables de transporter\r\n des charges allant de 5 500 lb à 12 000 lb. Les chargeurs à bras\r\n télescopique de Location d'outils industriels Jobsite sont\r\n spécialement conçus pour les terrains et les travaux rigoureux. Si\r\n votre prochain projet ou chantier nécessite un chargeur à bras\r\n télescopique fiable, durable et puissant, contactez Location\r\n d'outils industriels Jobsite aujourd’hui pour obtenir plus\r\n d’information!\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Track Type Loaders / Crawlers - Chargeurs Sur Chaines\",\r\n CatCodeSlug: \"track-type-loaders-crawlers-chargeurs-sur-chaines\",\r\n EN: {\r\n Name: \"Track Type Loaders / Crawlers\",\r\n Meta: \"When it comes to top loading and digging performance on the job site, nothing beats our used track type loaders/crawlers.\",\r\n Desc: (\r\n <>\r\n

\r\n Reach Maximum Performance with Our Used Track Type Loaders and\r\n Crawlers{\" \"}\r\n

\r\n

\r\n When it comes to maximum loading and digging performance on the job\r\n site, nothing beats our used track type loaders/crawlers. Toromont\r\n Cat tracked loaders are made to handle the most challenging\r\n terrains, offering unrivaled power, versatility and productivity\r\n thanks to their uncanny ability to dig, load and excavate in some of\r\n roughest and most stringent ground work applications such as mining,\r\n quarry and construction.\r\n

\r\n

Used Track Type Loaders and Crawlers Currently for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

\r\n Jobsite Industrial Rental Services’ Selection of Used Track Type\r\n Loaders and Crawlers{\" \"}\r\n

\r\n

\r\n Toromont carries several models of used track type loaders and\r\n crawlers with high loading capacities and the ability to handle some\r\n of the world’s most challenging terrains. Our Caterpillar used track\r\n type loaders/crawlers range in flywheel power from 154 HP to 275 HP\r\n and are able to perform digging, loading and excavation tasks in\r\n some of the toughest industries. If your construction, mining or\r\n quarry site could benefit from a heavy-duty used track type\r\n loader/crawler, contact Jobsite Industrial Rental Services today for\r\n more information about our available models.\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Chargeurs Sur Chaines\",\r\n Meta: \"Nos chargeurs sur chaînes usagés offrent une puissance de creusement et de chargement supérieure sur le chantier.\",\r\n Desc: \"Nos chargeurs sur chaînes usagés offrent une puissance de creusement et de chargement supérieure sur le chantier. Les chargeurs sur chaînes de Location d'outils industriels Jobsite sont conçus pour maîtriser les terrains les plus rigoureux. Ils fournissent une puissance et une polyvalence inégalées grâce à leur étonnante capacité à creuser et à charger dans les applications les plus difficiles telles que l'exploitation minière, la carrière et la construction.\",\r\n ExtraText: (\r\n <>\r\n

\r\n La sélection de chargeurs sur chaines usagés de Jobsite Industrial\r\n Rental Services\r\n

\r\n

\r\n Location d'outils industriels Jobsite offre plusieurs modèles de\r\n chargeurs sur chaines usagés avec une capacité de chargement élevée.\r\n Nos chargeurs sur chaines d’occasion Caterpillar fournissent une\r\n puissance d’inertie de 154 HP à 275 HP et sont capables d’effectuer\r\n des travaux de creusement, de chargement et d’excavation dans les\r\n industries les plus rigoureuses. Si votre chantier minier, de\r\n construction ou de carrière nécessite un chargeur sur chaines usagé\r\n robuste, contactez Location d'outils industriels Jobsite aujourd’hui\r\n pour obtenir plus d’information sur nos modèles disponibles.\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Track Type Tractors / Dozers - Tracteurs Sur Chaines\",\r\n CatCodeSlug: \"track-type-tractors-dozers-tracteurs-sur-chaines\",\r\n EN: {\r\n Name: \"Track Type Tractors / Dozers\",\r\n Meta: \"Dozers are a force to be reckoned with when it comes to achieving peak mobility on difficult terrain. Our used track type tractors deliver earth-moving power thanks to their excellent tractive force and maneuverability.\",\r\n Desc: (\r\n <>\r\n

Our Used Track Type Tractors and Dozers

\r\n

\r\n Dozers are a force to be reckoned with when it comes to achieving\r\n peak mobility on difficult terrain. Our used track type tractors\r\n deliver earth-moving power thanks to their excellent tractive force\r\n and maneuverability. Used on various job sites, such as farms,\r\n mines, quarries and construction, track loaders can effectively push\r\n dense soil, sand, rubble and other materials, bringing a high level\r\n of productivity and performance to any type of application.\r\n

\r\n

Used Track Type Tractors and Dozers Currently for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Wide Range of Used Track Type Tractors and Used Dozers

\r\n

\r\n Jobsite Industrial Rental Services has a range of Caterpillar’s used\r\n small, medium, large and waste handling dozers available to handle\r\n some of the toughest projects imaginable. Our fleet of used track\r\n type tractors and dozers is well-known for their advanced\r\n technologies, maneuverability, reliability and safety features that\r\n help them to outperform other bulldozers on any job site. Whether\r\n you need a used track type tractor or dozer for your next\r\n agricultural, construction, mining or quarry project, Jobsite\r\n Industrial Rental Services can help you find the right for your\r\n needs. Contact Jobsite Industrial Rental Services today for more\r\n information about our selection of used track type tractors or\r\n dozers!\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Tracteurs Sur Chaines\",\r\n Meta: \"En matière de performance et de mobilité sur les terrains difficiles, rien ne bat les bulldozers usagés à vendre de Location d'outils industriels Jobsite. Grâce à leur maniabilité et à leur superbe capacité de traction, nos dozers usagés offrent une puissance qui fait secouer la terre.\",\r\n Desc: \"En matière de performance et de mobilité sur les terrains difficiles, rien ne bat les bulldozers usagés à vendre de Location d'outils industriels Jobsite. Grâce à leur maniabilité et à leur superbe capacité de traction, nos dozers usagés offrent une puissance qui fait secouer la terre. Utilisés sur une variété de chantiers tels que les fermes, les mines, les carrières et la construction, les tracteurs sur chaines peuvent efficacement pousser de la terre, du sable et d’autres matériaux pour fournir un haut niveau de productivité et de performance dans toutes sortes d’applications.\",\r\n ExtraText: (\r\n <>\r\n

Grande gamme de tracteurs sur chaines usagés

\r\n

\r\n Location d'outils industriels Jobsite offre une sélection de petits,\r\n moyens et grands tracteurs sur chaines usagés Caterpillar pour tous\r\n types de travaux. Nos tracteurs sur chaines sont renommés pour leurs\r\n technologies de pointe, leur maniabilité, leur fiabilité et leur\r\n sécurité. Nos tracteurs sur chaines d’occasion fournissent une\r\n performance optimale sur le chantier. Si vous avez besoin d’un\r\n tracteur sur chaines pour votre prochain projet minier,\r\n d’agriculture, de construction ou de carrière, Location d'outils\r\n industriels Jobsite peut vous aider à trouver la machine la mieux\r\n adaptée à vos besoins. Contactez Location d'outils industriels\r\n Jobsite aujourd’hui pour obtenir plus d’information sur notre\r\n sélection de tracteurs sur chaines usagés!\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode:\r\n \"Wheel Loaders / Integrated Toolcarriers - Chargeurs Sur Pneus / Chargeurs Industriels\",\r\n CatCodeSlug:\r\n \"wheel-loaders-integrated-toolcarriers-chargeurs-sur-pneus-chargeurs-industriels\",\r\n EN: {\r\n Name: \"Wheel Loaders / Integrated Toolcarriers\",\r\n Meta: \"When choosing the right wheel loader, configuration is key. With a wide range of loaders from Jobsite Industrial Rental Services, selecting the best type of equipment for each specific application is fast and simple. Our wheel loaders deliver excellent fill factors, improved cycle times and better visibility.\",\r\n Desc: (\r\n <>\r\n

Wide Selection of Used Cat Wheel Loaders

\r\n

\r\n With Jobsite Industrial Rental Services’ range of Used Compact Wheel\r\n Loaders selecting the best type of equipment for each specific\r\n application is fast and simple. When you buy used compact wheel\r\n loaders from us, you will equip your fleet with equipment that\r\n delivers excellent fill factors, improved cycle times and better\r\n visibility. From asphalt and dirt, to gravel and snow, our used\r\n compact wheel loaders can handle any material on the job site with\r\n precision, safety and fuel efficiency. Our used compact wheel\r\n loaders are important assets on any job site, helping perform daily\r\n tasks such as landscaping, construction, forestry and agriculture\r\n projects with enhanced capabilities that increase efficiency and\r\n lower operating costs.\r\n

\r\n

Our used wheel loaders currently for sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Used Wheel Loaders for Any Job

\r\n

\r\n Our used wheel loaders can help maximize your budget. Our machines\r\n are always inspected for top quality assurance, so you know you’re\r\n getting the best performance, reliability and durability at the\r\n absolute best value. Cat wheel loaders are outfitted with innovative\r\n technologies that offer high performance with outstanding\r\n versatility. Standard features deliver a significant increase in\r\n lift capacity and travel speed, allowing operators to complete their\r\n jobs in a shorter amount of time. Jobsite Industrial Rental Services\r\n used wheel loaders for sale are also outfitted with premium\r\n ergonomic cabs and options such as engine and ground speed control,\r\n which provide customizable control when operating work tools.\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Chargeurs Sur Pneus / Chargeurs Industriels\",\r\n Meta: \"Pour choisir le bon chargeur sur pneus, il faut considérer la configuration. Avec la gamme de chargeurs sur roues usagés de Location d'outils industriels Jobsite, il est simple et facile de sélectionner le meilleur équipement pour chaque application.\",\r\n Desc: \"Pour choisir le bon chargeur sur pneus, il faut considérer la configuration. Avec la gamme de chargeurs sur roues usagés de Location d'outils industriels Jobsite, il est simple et facile de sélectionner le meilleur équipement pour chaque application. Nos chargeurs sur roues à vendre améliorent les temps de cycles, la visibilité et les facteurs de remplissage. Nos chargeurs peuvent gérer le transport et la manipulation de toutes sortes de matériaux, comme l’asphalte, la terre, le gravier et la neige, avec précision, sécurité et une faible consommation de carburant. Utilisés pour les travaux d’aménagement paysager, de construction, d’exploitation forestière, de gestion de déchets, de mine ou d’agriculture, et équipés d’une variété d’outils de travail et de technologies, nos chargeurs sur pneus d’occasion peuvent accomplir n’importe quel travail tout en optimisant le rendement et les performances opérationnelles.\",\r\n ExtraText: (\r\n <>\r\n

Des chargeurs sur pneus pour tout type de travail

\r\n

\r\n Nos chargeurs sur pneus vous permettent de maximiser votre budget.\r\n Nos machines sont toujours inspectées pour une assurance de qualité\r\n supérieure, ce qui vous permet d’obtenir la meilleure performance,\r\n fiabilité et durabilité à la meilleure valeur. Les chargeurs sur\r\n pneus Cat sont équipés de technologies avancées qui offrent une\r\n performance élevée et une polyvalence exceptionnelle. Les\r\n technologies intégrées d’usine augmentent nettement la puissance de\r\n levage et la vitesse de voyage, permettant aux opérateurs de\r\n compléter leur travail plus rapidement. Les chargeurs sur pneus\r\n d’occasion à vendre de Location d'outils industriels Jobsite sont\r\n aussi équipés de cabines ergonomiques et d’options telles que le\r\n contrôle du moteur et de la vitesse au sol, fournissant un contrôle\r\n personnalisé lors de l’utilisation d’outils de travail.\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"Work Tools - Outils De Travail\",\r\n CatCodeSlug: \"work-tools-outils-de-travail\",\r\n EN: {\r\n Name: \"Work Tools\",\r\n Meta: \"The right tools will do the right job. Jobsite Industrial Rental Services offers a wide assortment of used work tools suited for all types of applications, from landscaping to snow removal.\",\r\n Desc: \"The right tools will do the right job. Jobsite Industrial Rental Services offers a wide assortment of used work tools suited for all types of applications, from landscaping to snow removal. We carry used buckets, augers and forks, as well as breakers, compactors and snow removal. Getting your hands on our cost-friendly work tools will ensure flexibility and peak performance on the job site.\",\r\n ExtraText: null,\r\n },\r\n FR: {\r\n Name: \"Outils De Travail\",\r\n Meta: \"Les bons outils font un bon travail. Location d'outils industriels Jobsite offre un grand assortiment d’outils de travail usagés qui sont adaptés à plusieurs types d’applications comme le déneigement et le travail forestier.\",\r\n Desc: \"Les bons outils font un bon travail. Location d'outils industriels Jobsite offre un grand assortiment d’outils de travail usagés qui sont adaptés à plusieurs types d’applications comme le déneigement et le travail forestier. Nous offrons des godets, des têtes d’abattage et des fourches ainsi que des outils pour concasseurs, compacteurs et équipement de déneigement. Nos outils de travail à prix budgétaires vous aideront à atteindre une meilleure performance et flexibilité sur le chantier.\",\r\n ExtraText: null,\r\n },\r\n },\r\n {\r\n CatCode: \"Power Systems - Production d'énergie\",\r\n CatCodeSlug: \"power-systems-production-d-energie\",\r\n EN: {\r\n Name: \"Generators\",\r\n Meta: \"Jobsite Industrial Rental Services carries a wide selection of used commercial and industrial generators. Our used gas and diesel generators are built to world-class standards, for high efficiency and low fuel consumption. Contact us today for more information!\",\r\n Desc: (\r\n <>\r\n

\r\n Generators provide power for countless agricultural, construction\r\n and mining projects across Canada. They are also often required to\r\n power complex business data centers and hospitals. Jobsite\r\n Industrial Rental Services carries a large selection of used\r\n generators for commercial and industrial applications that range in\r\n power from 40 kW to 2,000 kW. We guarantee that our Caterpillar used\r\n generators are load tested and regularly serviced to ensure that you\r\n can use your generator immediately after purchase. Whether you need\r\n a used generator for your job site or business, contact Jobsite\r\n Industrial Rental Services today for more information about our used\r\n generator range.\r\n

\r\n

Used Generators Currently for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Used Commercial and Industrial Generators

\r\n

\r\n Jobsite Industrial Rental Services carries a wide selection of used\r\n commercial and industrial generators. Our used gas and diesel\r\n generators are built to world-class standards, for high efficiency\r\n and low fuel consumption. Contact us today for more information!\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"Groupes électrogènes\",\r\n Meta: \"Location d'outils industriels Jobsite offre une large sélection de groupes électrogènes commerciaux et industriels. Nos groupes électrogènes au gaz et au diesel sont conçus pour fournir une performance et efficacité supérieures ainsi qu’une plus grande économie en carburant. Contactez-nous aujourd’hui pour obtenir plus d’information!\",\r\n Desc: (\r\n <>\r\n

\r\n Les groupes électrogènes alimentent une multitude de projets\r\n miniers, d’agriculture et de construction à travers le Canada. Ils\r\n sont aussi souvent utilisés pour alimenter des centres hospitaliers\r\n et des centres complexes de données d’entreprise. Jobsite Industrial\r\n Rental Services offre une large sélection de groupes électrogènes\r\n usagés, qui livrent une puissance de 40 kW à 2 000 kW, pour des\r\n applications commerciales et industrielles. Nous garantissons que\r\n les groupes électrogènes usagés Caterpillar sont testés en charge et\r\n régulièrement entretenus afin d’être pouvoir utilisé immédiatement\r\n après leur achat. Si vous avez besoin d’un groupe électrogène\r\n d’occasion pour votre chantier ou votre entreprise, veuillez\r\n contacter Location d'outils industriels Jobsite aujourd’hui pour\r\n obtenir plus d’information sur notre sélection de groupes\r\n électrogènes.\r\n

\r\n

Groupes électrogènes actuellement en vente:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Groupes électrogènes commerciaux et industriels usagés

\r\n

\r\n Location d'outils industriels Jobsite offre une large sélection de\r\n groupes électrogènes commerciaux et industriels. Nos groupes\r\n électrogènes au gaz et au diesel sont conçus pour fournir une\r\n performance et efficacité supérieures ainsi qu’une plus grande\r\n économie en carburant. Contactez-nous aujourd’hui pour obtenir plus\r\n d’information!\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"gens\",\r\n CatCodeSlug: \"gens\",\r\n EN: {\r\n Name: \"Stationary Generator Sets\",\r\n Meta: \"Jobsite Industrial Rental Services carries a wide selection of used commercial and industrial generators. Our used gas and diesel generators are built to world-class standards, for high efficiency and low fuel consumption. Contact us today for more information!\",\r\n Desc: (\r\n <>\r\n

\r\n Generators provide power for countless agricultural, construction\r\n and mining projects across Canada. They are also often required to\r\n power complex business data centers and hospitals. Jobsite\r\n Industrial Rental Services carries a large selection of used\r\n generators for commercial and industrial applications that range in\r\n power from 40 kW to 2,000 kW. We guarantee that our Caterpillar used\r\n generators are load tested and regularly serviced to ensure that you\r\n can use your generator immediately after purchase. Whether you need\r\n a used generator for your job site or business, contact Jobsite\r\n Industrial Rental Services today for more information about our used\r\n generator range.\r\n

\r\n

Used Generators Currently for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Used Commercial and Industrial Generators

\r\n

\r\n Jobsite Industrial Rental Services carries a wide selection of used\r\n commercial and industrial generators. Our used gas and diesel\r\n generators are built to world-class standards, for high efficiency\r\n and low fuel consumption. Contact us today for more information!\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"GROUPES ÉLECTROGÈNES STATIONNAIRES\",\r\n Meta: \"Location d'outils industriels Jobsite offre une large sélection de groupes électrogènes commerciaux et industriels. Nos groupes électrogènes au gaz et au diesel sont conçus pour fournir une performance et efficacité supérieures ainsi qu’une plus grande économie en carburant. Contactez-nous aujourd’hui pour obtenir plus d’information!\",\r\n Desc: (\r\n <>\r\n

\r\n Les groupes électrogènes alimentent une multitude de projets\r\n miniers, d’agriculture et de construction à travers le Canada. Ils\r\n sont aussi souvent utilisés pour alimenter des centres hospitaliers\r\n et des centres complexes de données d’entreprise. Location d'outils\r\n industriels Jobsite offre une large sélection de groupes\r\n électrogènes usagés, qui livrent une puissance de 40 kW à 2 000 kW,\r\n pour des applications commerciales et industrielles. Nous\r\n garantissons que les groupes électrogènes usagés Caterpillar sont\r\n testés en charge et régulièrement entretenus afin d’être pouvoir\r\n utilisé immédiatement après leur achat. Si vous avez besoin d’un\r\n groupe électrogène d’occasion pour votre chantier ou votre\r\n entreprise, veuillez contacter Location d'outils industriels Jobsite\r\n aujourd’hui pour obtenir plus d’information sur notre sélection de\r\n groupes électrogènes.\r\n

\r\n

Groupes électrogènes actuellement en vente:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Groupes électrogènes commerciaux et industriels usagés

\r\n

\r\n Location d'outils industriels Jobsite offre une large sélection de\r\n groupes électrogènes commerciaux et industriels. Nos groupes\r\n électrogènes au gaz et au diesel sont conçus pour fournir une\r\n performance et efficacité supérieures ainsi qu’une plus grande\r\n économie en carburant. Contactez-nous aujourd’hui pour obtenir plus\r\n d’information!\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"inen\",\r\n CatCodeSlug: \"inen\",\r\n EN: {\r\n Name: \"Industrial Engines\",\r\n Meta: \"Jobsite Industrial Rental Services carries a wide selection of used commercial and industrial generators. Our used gas and diesel generators are built to world-class standards, for high efficiency and low fuel consumption. Contact us today for more information!\",\r\n Desc: (\r\n <>\r\n

\r\n Generators provide power for countless agricultural, construction\r\n and mining projects across Canada. They are also often required to\r\n power complex business data centers and hospitals. Jobsite\r\n Industrial Rental Services carries a large selection of used\r\n generators for commercial and industrial applications that range in\r\n power from 40 kW to 2,000 kW. We guarantee that our Caterpillar used\r\n generators are load tested and regularly serviced to ensure that you\r\n can use your generator immediately after purchase. Whether you need\r\n a used generator for your job site or business, contact Jobsite\r\n Industrial Rental Services today for more information about our used\r\n generator range.\r\n

\r\n

Used Generators Currently for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Used Commercial and Industrial Generators

\r\n

\r\n Jobsite Industrial Rental Services carries a wide selection of used\r\n commercial and industrial generators. Our used gas and diesel\r\n generators are built to world-class standards, for high efficiency\r\n and low fuel consumption. Contact us today for more information!\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"MOTEURS INDUSTRIELS\",\r\n Meta: \"Location d'outils industriels Jobsite offre une large sélection de groupes électrogènes commerciaux et industriels. Nos groupes électrogènes au gaz et au diesel sont conçus pour fournir une performance et efficacité supérieures ainsi qu’une plus grande économie en carburant. Contactez-nous aujourd’hui pour obtenir plus d’information!\",\r\n Desc: (\r\n <>\r\n

\r\n Les groupes électrogènes alimentent une multitude de projets\r\n miniers, d’agriculture et de construction à travers le Canada. Ils\r\n sont aussi souvent utilisés pour alimenter des centres hospitaliers\r\n et des centres complexes de données d’entreprise. Location d'outils\r\n industriels Jobsite offre une large sélection de groupes\r\n électrogènes usagés, qui livrent une puissance de 40 kW à 2 000 kW,\r\n pour des applications commerciales et industrielles. Nous\r\n garantissons que les groupes électrogènes usagés Caterpillar sont\r\n testés en charge et régulièrement entretenus afin d’être pouvoir\r\n utilisé immédiatement après leur achat. Si vous avez besoin d’un\r\n groupe électrogène d’occasion pour votre chantier ou votre\r\n entreprise, veuillez contacter Location d'outils industriels Jobsite\r\n aujourd’hui pour obtenir plus d’information sur notre sélection de\r\n groupes électrogènes.\r\n

\r\n

Groupes électrogènes actuellement en vente:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Groupes électrogènes commerciaux et industriels usagés

\r\n

\r\n Location d'outils industriels Jobsite offre une large sélection de\r\n groupes électrogènes commerciaux et industriels. Nos groupes\r\n électrogènes au gaz et au diesel sont conçus pour fournir une\r\n performance et efficacité supérieures ainsi qu’une plus grande\r\n économie en carburant. Contactez-nous aujourd’hui pour obtenir plus\r\n d’information!\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"genm\",\r\n CatCodeSlug: \"genm\",\r\n EN: {\r\n Name: \"Mobile Generator Sets\",\r\n Meta: \"Jobsite Industrial Rental Services carries a wide selection of used commercial and industrial generators. Our used gas and diesel generators are built to world-class standards, for high efficiency and low fuel consumption. Contact us today for more information!\",\r\n Desc: (\r\n <>\r\n

\r\n Generators provide power for countless agricultural, construction\r\n and mining projects across Canada. They are also often required to\r\n power complex business data centers and hospitals. Jobsite\r\n Industrial Rental Services carries a large selection of used\r\n generators for commercial and industrial applications that range in\r\n power from 40 kW to 2,000 kW. We guarantee that our Caterpillar used\r\n generators are load tested and regularly serviced to ensure that you\r\n can use your generator immediately after purchase. Whether you need\r\n a used generator for your job site or business, contact Jobsite\r\n Industrial Rental Services today for more information about our used\r\n generator range.\r\n

\r\n

Used Generators Currently for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Used Commercial and Industrial Generators

\r\n

\r\n Jobsite Industrial Rental Services carries a wide selection of used\r\n commercial and industrial generators. Our used gas and diesel\r\n generators are built to world-class standards, for high efficiency\r\n and low fuel consumption. Contact us today for more information!\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"GROUPES ÉLECTROGÈNES MOBILES (2)\",\r\n Meta: \"Location d'outils industriels Jobsite offre une large sélection de groupes électrogènes commerciaux et industriels. Nos groupes électrogènes au gaz et au diesel sont conçus pour fournir une performance et efficacité supérieures ainsi qu’une plus grande économie en carburant. Contactez-nous aujourd’hui pour obtenir plus d’information!\",\r\n Desc: (\r\n <>\r\n

\r\n Les groupes électrogènes alimentent une multitude de projets\r\n miniers, d’agriculture et de construction à travers le Canada. Ils\r\n sont aussi souvent utilisés pour alimenter des centres hospitaliers\r\n et des centres complexes de données d’entreprise. Location d'outils\r\n industriels Jobsite offre une large sélection de groupes\r\n électrogènes usagés, qui livrent une puissance de 40 kW à 2 000 kW,\r\n pour des applications commerciales et industrielles. Nous\r\n garantissons que les groupes électrogènes usagés Caterpillar sont\r\n testés en charge et régulièrement entretenus afin d’être pouvoir\r\n utilisé immédiatement après leur achat. Si vous avez besoin d’un\r\n groupe électrogène d’occasion pour votre chantier ou votre\r\n entreprise, veuillez contacter Location d'outils industriels Jobsite\r\n aujourd’hui pour obtenir plus d’information sur notre sélection de\r\n groupes électrogènes.\r\n

\r\n

Groupes électrogènes actuellement en vente:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Groupes électrogènes commerciaux et industriels usagés

\r\n

\r\n Location d'outils industriels Jobsite offre une large sélection de\r\n groupes électrogènes commerciaux et industriels. Nos groupes\r\n électrogènes au gaz et au diesel sont conçus pour fournir une\r\n performance et efficacité supérieures ainsi qu’une plus grande\r\n économie en carburant. Contactez-nous aujourd’hui pour obtenir plus\r\n d’information!\r\n

\r\n \r\n ),\r\n },\r\n },\r\n {\r\n CatCode: \"100a\",\r\n CatCodeSlug: \"100a\",\r\n EN: {\r\n Name: \"Systems / Components\",\r\n Meta: \"Jobsite Industrial Rental Services carries a wide selection of used commercial and industrial generators. Our used gas and diesel generators are built to world-class standards, for high efficiency and low fuel consumption. Contact us today for more information!\",\r\n Desc: (\r\n <>\r\n

\r\n Generators provide power for countless agricultural, construction\r\n and mining projects across Canada. They are also often required to\r\n power complex business data centers and hospitals. Jobsite\r\n Industrial Rental Services carries a large selection of used\r\n generators for commercial and industrial applications that range in\r\n power from 40 kW to 2,000 kW. We guarantee that our Caterpillar used\r\n generators are load tested and regularly serviced to ensure that you\r\n can use your generator immediately after purchase. Whether you need\r\n a used generator for your job site or business, contact Jobsite\r\n Industrial Rental Services today for more information about our used\r\n generator range.\r\n

\r\n

Used Generators Currently for Sale:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Used Commercial and Industrial Generators

\r\n

\r\n Jobsite Industrial Rental Services carries a wide selection of used\r\n commercial and industrial generators. Our used gas and diesel\r\n generators are built to world-class standards, for high efficiency\r\n and low fuel consumption. Contact us today for more information!\r\n

\r\n \r\n ),\r\n },\r\n FR: {\r\n Name: \"COMPOSANTS DE SYSTÈMES\",\r\n Meta: \"Location d'outils industriels Jobsite offre une large sélection de groupes électrogènes commerciaux et industriels. Nos groupes électrogènes au gaz et au diesel sont conçus pour fournir une performance et efficacité supérieures ainsi qu’une plus grande économie en carburant. Contactez-nous aujourd’hui pour obtenir plus d’information!\",\r\n Desc: (\r\n <>\r\n

\r\n Les groupes électrogènes alimentent une multitude de projets\r\n miniers, d’agriculture et de construction à travers le Canada. Ils\r\n sont aussi souvent utilisés pour alimenter des centres hospitaliers\r\n et des centres complexes de données d’entreprise. Location d'outils\r\n industriels Jobsite offre une large sélection de groupes\r\n électrogènes usagés, qui livrent une puissance de 40 kW à 2 000 kW,\r\n pour des applications commerciales et industrielles. Nous\r\n garantissons que les groupes électrogènes usagés Caterpillar sont\r\n testés en charge et régulièrement entretenus afin d’être pouvoir\r\n utilisé immédiatement après leur achat. Si vous avez besoin d’un\r\n groupe électrogène d’occasion pour votre chantier ou votre\r\n entreprise, veuillez contacter Location d'outils industriels Jobsite\r\n aujourd’hui pour obtenir plus d’information sur notre sélection de\r\n groupes électrogènes.\r\n

\r\n

Groupes électrogènes actuellement en vente:

\r\n \r\n ),\r\n ExtraText: (\r\n <>\r\n

Groupes électrogènes commerciaux et industriels usagés

\r\n

\r\n Location d'outils industriels Jobsite offre une large sélection de\r\n groupes électrogènes commerciaux et industriels. Nos groupes\r\n électrogènes au gaz et au diesel sont conçus pour fournir une\r\n performance et efficacité supérieures ainsi qu’une plus grande\r\n économie en carburant. Contactez-nous aujourd’hui pour obtenir plus\r\n d’information!\r\n

\r\n \r\n ),\r\n },\r\n },\r\n];\r\nexport default SEO_BFE;\r\n","import React from \"react\";\r\nimport { URLCCU, URLCONSIGNMENT } from \"../Constants\";\r\nimport { getImage } from \"../HelperFunctions\";\r\nimport { types_seoData } from \"../Types\";\r\n\r\n\r\nconst SEO_TCAT: types_seoData[] = [\r\n\r\n {\r\n CatCode: \"Default\",\r\n CatCodeSlug: \"products\",\r\n CtaImage: getImage(\"usedmachineryformimage.jpg\"),\r\n EN: {\r\n Name: \"Toromont Cat\",\r\n Meta: \"At Toromont Cat, you will find the largest inventory of used Cat equipment in Eastern Canada. We offer increased value and top-notch performance in all types of environments.\",\r\n Desc: \"At Toromont Cat, you will find the largest inventory of used Cat equipment in Eastern Canada. From construction to paving and crushing to forestry, our powerhouse selection offers increased value and top-notch performance in all types of environments. Toromont Cat is your authorized Caterpillar Dealer in Manitoba, Ontario, Quebec, New Brunswick, Nova Scotia, P.E.I., Newfoundland and Labrador, and Nunavut.\",\r\n ExtraText: null\r\n },\r\n FR: {\r\n Name: \"Toromont Cat\",\r\n Meta: \"Chez Toromont Cat, vous trouverez le plus grand inventaire d’équipement usagé Cat dans l’est du Canada. Que ce soit pour des applications de construction, de pavage, de concassage ou forestières, notre sélection d’équipement offre une valeur accrue et une performance inégalée dans tous les types d’environnements. Toromont Cat est votre concessionnaire Caterpillar autorisé au Manitoba, en Ontario, au Québec, au Nouveau-Brunswick, en Nouvelle-Écosse, à l’Île-du-Prince-Édouard, à Terre-Neuve et Labrador et au Nunavut.\",\r\n Desc: \"Chez Toromont Cat, vous trouverez le plus grand inventaire d’équipement usagé Cat dans l’est du Canada. Que ce soit pour des applications de construction, de pavage, de concassage ou forestières, notre sélection d’équipement offre une valeur accrue et une performance inégalée dans tous les types d’environnements. Toromont Cat est votre concessionnaire Caterpillar autorisé au Manitoba, en Ontario, au Québec, au Nouveau-Brunswick, en Nouvelle-Écosse, à l’Île-du-Prince-Édouard, à Terre-Neuve et Labrador et au Nunavut.\",\r\n ExtraText: null\r\n }\r\n\r\n },\r\n {\r\n CatCode: \"Articulated Trucks - Tombereaux Articulés\",\r\n CatCodeSlug: \"articulated-trucks-tombereaux-articules\",\r\n CtaImage: getImage(\"categoryimagestcat/Used Cat Articulated Trucks - Toromont Cat.jpg\"),\r\n EN: {\r\n Name: \"Articulated Trucks\",\r\n Meta: \"Operational efficiency is maximized thanks to our rock-solid selection of used articulated trucks. Our dump trucks are ultra-tough, offering unmatched performance and traction control on rough or uneven terrain.\",\r\n Desc: <>

Used Articulated Trucks – Built to Last!

Does your construction site require an ultra-tough, reliable and cost-effective dump truck? Look no further than Toromont Cat's extensive selection of used articulated trucks! Regardless of the heavy materials you need to haul or your project's budget, Toromont Cat has the used dump truck to meet your specific needs and get the job done right!

Used Articulated / Dump Trucks for Sale:

,\r\n ExtraText: <>

Need the Best Used Articulated Truck to start hauling ASAP?

From Nova Scotia to Nunavut, Toromont Cat has a wide selection of used articulated trucks that are ready to get to work! Our used dump trucks are durable and ready to handle payloads ranging in weight from 26.5 ton to 45.2 ton. Whatever you need to haul away – from rocks to cement to soil – our used articulated trucks can carry it all with ease! Our used dump trucks always handle rough and uneven terrain like a pro, because of a superior traction control system. Toromont Cat's used articulated trucks also contain advanced technologies and features like tipping and load dumping control, which help to reduce cycle times and fuel consumption. Our used dump trucks can come Caterpillar Certified and range in price from $25,000 CAD to $700,000 CAD.


Get Your Used Articulated Truck from Toromont Cat Today!

Experience how much faster and cheaper you can get your hauling done with a used articulated truck from Toromont Cat! Caterpillar's used dump trucks are built to last and always get the job done right! Discover the difference a Caterpillar dump truck can make on your site! Contact us today for more information about our used articulated trucks or to get a quote for your next project!

You can also find more information about our articulated trucks on Cat's official site.

,\r\n\r\n },\r\n FR: {\r\n Name: \"Tombereaux Articulés\",\r\n Meta: \"L’efficacité opérationnelle est maximisée grâce à notre sélection solide de tombereaux articulés usagés. Nos tombereaux sont ultra robustes, fournissant une performance accrue et un superbe contrôle de traction sur terrain rugueux ou accidenté.\",\r\n Desc: <>

TOMBEREAUX ARTICULÉS USAGÉS

Est-ce que vous avez besoin d’un tombereau résistant, fiable et rentable? Nous avons chez Toromont Cat un choix étendu de tombereaux articulés usagés! Peu importe les matériaux lourds que vous devez transporter ou le budget de votre projet, Toromont Cat a le camion articulé usagé qui répondra à vos besoins spécifiques et fera le travail correctement!

,\r\n ExtraText: <>

Avez-vous besoin du meilleur tombereau articulé usagé maintenant?

De la Nouvelle-Écosse au Nunavut, Toromont Cat a une vaste sélection de tombereaux articulés usagés prêts à se mettre au travail! Nos tombereaux articulés usagés sont durables et capables de manipuler des charges utiles allant de 26,5 tonnes à 45,2 tonnes. Tout ce que vous avez besoin de transporter - des roches au ciment en passant par la terre - nos tombereaux articulés usagés peuvent tout déplacer avec facilité! Nos tombereaux articulés usagés se comportent toujours comme un pro sur les terrains accidentés et inégaux, grâce à un système de contrôle de la traction supérieur. Les tombereaux articulés usagés Toromont Cat contiennent également des technologies et des caractéristiques avancées comme le contrôle de basculement et de déversement de la charge, qui aident à réduire les temps de cycle et la consommation de carburant. Nos tombereaux articulés usagés peuvent être certifiés Caterpillar et leur prix varie de 25 000$ CAN à 700 000$ CAN.


Achetez votre tombereau articulé usagé chez Toromont Cat dès aujourd'hui!

Découvrez comment vous pouvez effectuer votre transport plus rapidement et à moindre coût avec un tombereau articulé usagé Toromont Cat! Les tombereaux articulés usagés de Caterpillar sont construits pour durer et toujours bien faire le travail! Faites la différence sur votre chantier avec un tombereau articulé Caterpillar! Contactez-nous dès aujourd'hui pour plus d'information sur nos tombereaux articulés usagés ou pour obtenir un devis pour votre prochain projet!

Trouvez plus d'information sur nos tombereaux articulés usagés sur le site web officiel de Caterpillar.

\r\n\r\n }\r\n\r\n },\r\n {\r\n \"CatCode\": \"Backhoe Loaders - Chargeuses-pelleteuses\",\r\n \"CatCodeSlug\": \"backhoe-loaders-chargeuses-pelleteuses\",\r\n CtaImage: getImage(\"categoryimagestcat/Used Cat Backhoe Loaders - Toromont Cat.jpg\"),\r\n EN: {\r\n \"Name\": \"Backhoe Loaders\",\r\n \"Meta\": \"Our used Backhoe Loaders are a must-have for a variety of tasks, such as general construction, demolitions and excavations, landscaping, asphalt breaking and road paving.\",\r\n \"Desc\": <>

Used Backhoe Loaders for a Wide Variety of Tasks

Backhoe loaders are necessary for a variety of tasks, such as general construction, demolitions and excavations, landscaping, asphalt breaking and road paving. Are you looking for a used backhoe loader with a powerful engine, superior digging capability and the durability to handle any terrain? Toromont Cat carries a large selection of used backhoe loaders to help you complete your next project on time and under budget!

Used Backhoe Loaders for Sale:

,\r\n \"ExtraText\": <>

Need the Best Used Backhoe Loader for Your Next Project?

A backhoe loader is an essential piece of equipment on your site, so invest in the used backhoe loader that is reliable, versatile and can help you get the job done faster! Our used backhoe loaders continue to be a popular choice in urban engineering and construction projects because of their small, compact design, which provides machine versatility and allows them to go virtually anywhere. Despite their small size, our used backhoe loaders are quite powerful, ranging in net power from 68HP to 131HP. Equipping yourself with one of our used backhoe loaders means precise control and top-of-the-line performance that will improve construction productivity and lower machine operating costs!


Get Your Used Backhoe Loader from Toromont Cat Today!

If you need a backhoe loader that can handle challenging terrains, carry materials and dig through almost anything, choose a Caterpillar! Toromont Cat has a wide selection of used Caterpillar backhoe loaders that come Caterpillar Certified, starting at $20,000 CAD. Contact us today for more information about our available used backhoe loaders or to get a quote for your next project!

,\r\n\r\n },\r\n FR: {\r\n \"Name\": \"Rétrocaveuses\",\r\n \"Meta\": \"Nos rétrocaveuses usagées à vendre sont indispensables pour une variété de travaux. Grâce à leur châssis compact, nos pépines d’occasion peuvent aller n’importe où, ce qui en fait un choix populaire pour les projets d’ingénierie ou de construction qui nécessitent une performance supérieure.\",\r\n \"Desc\": <>

Rétrocaveuses usagées pour une vaste gamme d’applications

Les rétrocaveuses sont nécessaires pour une variété de travaux, comme la construction, l’excavation, la démolition, l’aménagement paysager, le travail d’asphalte et le pavage routier. Cherchez-vous une rétrocaveuse usagée avec un moteur puissant, une performance supérieure en matière de creusement et la durabilité pour affronter n’importe quel terrain? Toromont Cat offre une vaste sélection de pépines usagées pour vous aider à compléter votre projet à temps et en deçà du budget!

,\r\n \"ExtraText\": <>

Besoin de la meilleure rétrocaveuse usagée pour votre prochain projet?

\r\n

Sur votre chantier, une rétrocaveuse est une pièce d’équipement essentielle. Il est donc important de choisir une pépine usagée qui est fiable, polyvalente et qui peut vous aider à en accomplir beaucoup plus! Nos rétrocaveuses usagées sont un choix populaire pour les projets d’ingénierie et de construction grâce à leur châssis compact – qui leur permet d’aller n’importe où! En dépit de leurs dimensions, nos rétrocaveuses usagées sont performantes et livrent une puissance de 68 HP à 131 HP. En vous équipant d’une de nos rétrocaveuses usagées, vous obtiendrez un contrôle précis et une performance inégalable qui amélioreront votre productivité et réduiront vos coûts d’entretien!

\r\n

Achetez votre pépine usagée chez Toromont Cat dès aujourd’hui!

\r\n

Si vous avez besoin d’une rétrocaveuse qui fournit une maniabilité précise sur les terrains difficiles, qui porte les matériaux lourds et qui creuse partout, choisissez un Cat®! Toromont Cat a une vaste sélection de pépines usagées qui peuvent être certifiées Caterpillar, et dont les prix commencent à 20 000 $ CAD. Contactez-nous aujourd’hui pour obtenir plus d’informations sur nos rétrocaveuses usagées ou demander un devis pour votre prochain projet!

\r\n }\r\n\r\n },\r\n {\r\n \"CatCode\": \"Compactors - Compacteurs\",\r\n \"CatCodeSlug\": \"compactors-compacteurs\",\r\n CtaImage: getImage(\"categoryimagestcat/Used Cat Compactors - Toromont Cat.jpg\"),\r\n EN: {\r\n \"Name\": \"Compactors\",\r\n \"Meta\": \"Toromont Cat’s Industrial Compactors feature advanced technologies that boost durability, operational performance and efficacy.\",\r\n \"ExtraText\": <>

Looking to Purchase a Used Compactor for Your Next Project?

Compacting to specifications is crucial for a variety of applications, so choose the Caterpillar compactor that is specially designed to handle your specific compaction tasks. Our used compactors feature advanced technologies that boost durability, operational performance and efficacy. Whether flattening soil, compacting landfill material or smoothing the surface of a newly paved road, our selection of combination rollers will offer value where it is needed most. If you need a soil compactor in Winnipeg, a pneumatic roller in Toronto or a landfill compactor in Pointe-Claire, Toromont Cat has the used compactor you need! Our used compactors are affordable (starting at $13,500 CAD) and many come Caterpillar Certified.


Get Your Used Compactor from Toromont Cat Today!

If your landfill, agricultural or construction site needs a compactor, choose a used Caterpillar compactor from Toromont Cat! We carry a wide selection of compactors (soil, vibratory soil and landfill) and rollers (pneumatic and tandem vibratory) that are affordable, cost-effective and backed by Caterpillar. Contact us today for more information about our range of used compactors!

,\r\n \"Desc\": <>

Wide Selection of Used Compactors Available

\r\n

Compactors are an important tool for many agricultural, landfill and construction sites, so it is essential to choose the\r\n used compactor specific to your needs. Are you looking for a dependable used compactor for your next project?\r\n If you require a soil compactor, vibratory soil compactor, landfill compactor, pneumatic rollers or tandem vibratory rollers,\r\n Toromont Cat has the used Caterpillar compactor to match your project needs and get the job done!

\r\n

Used Compactors for Sale:

,\r\n\r\n },\r\n FR: {\r\n \"Name\": \"Compacteurs\",\r\n \"Meta\": \"Les compacteurs d’occasion de Toromont Cat sont dotés de technologies avancées qui augmentent la durabilité, la performance et l’efficacité pour optimiser votre productivité sur le chantier. Nos rouleaux compacteurs usagés offrent un maximum de valeur pour tous vos besoins.\",\r\n \"Desc\": <>

Une vaste sélection de compacteurs usagés disponibles

Les compacteurs sont un outil important pour de nombreux projets d’agriculture, de construction et de compactage. Il est donc essentiel de choisir le compacteur le mieux adapté à vos besoins. Cherchez-vous un compacteur usagé sûr pour votre prochain projet? Si vous avez besoin d’un compacteur du sol, d’un compacteur du sol vibrant, d’un compacteur de décharge, d’un rouleau pneumatique ou d’un rouleau vibrant, Toromont Cat a le compacteur Cat® usagé qui répondra à vos besoins et fera le travail!

,\r\n \"ExtraText\": <>

Voulez-vous acheter un compacteur usagé pour votre prochain projet?

Un compactage conforme aux spécifications est important pour une variété d’applications. Mieux vaut donc choisir le compacteur Cat® qui a été fabriqué pour vos tâches précises. Nos compacteurs usagés sont dotés de technologies avancées qui en augmentent la durabilité, la performance et l’efficacité. Notre sélection de rouleaux mixtes, utilisés pour une variété de travaux – tels que le compactage de décharges et le lissage du sol et de la chaussée –, offre un maximum de valeur pour tous vos besoins. Si vous avez besoin d’un compacteur de sol à Winnipeg, d’un rouleau pneumatique à Toronto ou d’un compacteur de décharge à Pointe-Claire, Toromont Cat a le compacteur usagé fait pour vous! Nos compacteurs usagés sont abordables (ils sont offerts à partir de 13 000 $ CAD) et peuvent être certifiés Caterpillar.


Obtenez votre compacteur usagé chez Toromont Cat dès aujourd’hui!

Si votre projet d’agriculture, de construction ou de compactage nécessite un compacteur, choisissez un compacteur Caterpillar de Toromont Cat! Nous offrons une vaste sélection de compacteurs et de rouleaux mixtes abordables, rentables et garantis par Caterpillar. Contactez-nous aujourd’hui pour obtenir plus d’informations à propos de notre gamme de compacteurs usagés!

\r\n\r\n }\r\n\r\n },\r\n {\r\n \"CatCode\": \"Aggregate - Granulats\",\r\n \"CatCodeSlug\": \"aggregate-granulats\",\r\n EN: {\r\n \"Name\": \"Crushers and Screens\",\r\n \"Desc\": <>

Improve Your Bottom Line with Our Used Crushers and Screens

\r\n

Crushers and screens are necessary on many sites involved in materials processing, so choose the specific ones that match your needs. Whether processing raw materials, manufacturing sand or handling glass in recycling applications, our used industrial crushing equipment will boost productivity and improve your bottom line.\r\n

\r\n

Used Crushers and Screens for Sale:

,\r\n \"Meta\": \"Whether processing raw materials, mining sand or handling glass in recycling applications, our used industrial crushing equipment will boost productivity and improve your bottom line.\",\r\n \"ExtraText\": <>

Choose from Our Wide Range of Reliable Used Crushers and Screens!

\r\n

Toromont Cat has a large selection of used crushers and screens from well-known, trusted and reliable brands such as Lokotrack, Masaba, Metso and Nordberg CVB. Our tracked and wheeled used crushers and screens are equipped with advanced technologies and special safety features to improve productivity and keep you safe. Whether you need to process materials in the mining, quarry, construction, demolition or recycling industries, you can find the most durable and versatile used screens and crushers at Toromont Cat.\r\n

\r\n
Purchase Used Crushers and Screens from Toromont Cat Today!
\r\n

\r\n Do you need used crushers and screens that are tough and offer quality results? Toromont Cat carries a wide range of dependable used crushers and screens! Whether your job site requires fine grinding of glass, stone or other materials, Toromont Cat will have the used crusher to meet your needs. Our selection of used screens can process almost any material and effectively screen construction, demolition, soil and recycling debris. Contact us today for more information about our available used crushers and screens or to get a quote for your next project!\r\n

\r\n ,\r\n\r\n },\r\n FR: {\r\n \"Name\": \"Concasseurs et cribles\",\r\n \"Meta\": \"Que vous traitiez des matières premières, du sable, ou du verre dans des applications de recyclage, nos concasseurs et nos cribles usagés à vendre augmenteront votre productivité et amélioreront votre rentabilité.\",\r\n \"Desc\": <>

Améliorez votre rentabilité avec nos concasseurs et nos cribles usagés

\r\n

Les concasseurs et les cribles sont nécessaires sur plusieurs chantiers qui travaillent en matière de traitement de matériaux, alors choisissez de l’équipement qui répondra à vos besoins. Que vous traitiez des matières premières, du sable ou du verre en ce qui concerne les applications de recyclage, les concasseurs et les cribles usagés de Toromont Cat augmenteront votre productivité et amélioreront votre rentabilité.\r\n

,\r\n \"ExtraText\": <>

Choisissez parmi notre grande sélection de concasseurs et de cribles usagés

\r\n

Toromont Cat a une grande sélection de cribles et de concasseurs composée de marques fiables et connues telles que Lokotrack, Masaba, Metso et Nordberg CVB. Nos cribles et nos concasseurs usagés incluent des technologies avancées et des caractéristiques spéciales pour ce qui est de la sécurité qui vous aident à compléter votre travail rapidement et de manière sécuritaire. Que vous ayez besoin de traiter des matériaux dans le cade des industries minières, de carrières, de construction, de démolition ou de recyclage, vous trouverez les cribles et les concasseurs usagés les plus durables et polyvalents chez Toromont Cat.\r\n

\r\n

Achetez des cribles et des concasseurs d’occasion chez Toromont Cat maintenant!

\r\n

\r\n Avez-vous besoin de concasseurs et de cribles usagés endurants qui donnent des résultats de qualité? Si votre chantier nécessite de l’équipement pour broyer des pierres, du verre ou d’autres matériaux, vous pouvez compter sur Toromont Cat pour répondre à vos besoins. Les cribles et les concasseurs d’occasion que nous offrons sont capables de traiter et de filtrer les débris de construction, de démolition, de sol et de recyclage efficacement. Contactez Toromont Cat aujourd’hui pour obtenir plus d’informations sur nos cribles et nos concasseurs usagés ou pour obtenir un devis pour votre prochain projet!\r\n

\r\n \r\n\r\n }\r\n\r\n },\r\n {\r\n \"CatCode\": \"Excavators - Pelles Hydrauliques\",\r\n \"CatCodeSlug\": \"excavators-pelles-hydrauliques\",\r\n CtaImage: getImage(\"categoryimagestcat/Used Cat Excavators - Toromont Cat.jpg\"),\r\n EN: {\r\n \"Name\": \"Excavators\",\r\n \"Meta\": \"Excavators are an indispensable asset to any contractor’s fleet. Whatever the application, our selection of used excavators can get the job done safely and efficiently. A digger’s purpose is almost limitless thanks its exceptional speed, energy efficiency and lifting capacity.\",\r\n \"Desc\": <>

Break New Ground with a Used Excavator from Toromont Cat

\r\n

When starting a new project, it is essential to have a reliable and efficient used excavator on your site. Whether you need a small, medium or large excavator for agricultural, construction, forestry or mining applications, Toromont Cat’s used excavators available for sale will complete your tasks with unmatched power and agility.\r\n

\r\n

Our used excavators currently for sale:

,\r\n \"ExtraText\": <>

Get the Job Done Faster and Lower Costs with a Used Cat® Excavator

\r\n

Toromont Cat has hundreds of used excavators available for sale in Ontario, Quebec, Manitoba, New Brunswick, Newfoundland and Labrador, Nova Scotia and\r\n Prince Edward Island. Our used excavators feature rock-solid frames and robust components that enhance their strength, durability\r\n and reliability in the most challenging environments. Many of Toromont Cat’s used Cat® excavators for sale are outfitted with\r\n enhanced features that increase productivity, comfort and safety; a long, heavy-duty undercarriage increases stability when\r\n lifting heavy objects, a quiet and ergonomic cab with automatic climate control provides consistent temperature maintenance\r\n and large windows provide operators with panoramic visibility. In many newer-model used Cat® excavators, Cat® Connect Solutions optimize productivity and reduce operating costs while\r\n high-pressure hoses increase the longevity of your machine by ensuring that hydraulic fluids are efficiently pumped to your excavator’s\r\n components for up to 1 million cycles.\r\n\r\n

\r\n
Dig Up the Profits with a Dependable Used Excavator
\r\n

\r\n At Toromont Cat, we carry a large selection of used excavators by Caterpillar and several other well-known brands. Many of our used Cat® excavators are also Caterpillar Certified – lightly serviced and inspected to an almost-new state by our skilled technicians – so that you can be certain that you are buying a first-rate machine in outstanding condition. Toromont Cat’s fleet of used excavators includes models spanning from 1997 to 2020, many of which have been operated for 1,000 hours or less. When you buy your next used excavator from Toromont Cat, you can rest assured that you will receive an industry-leading machine in great condition.\r\n\r\n

\r\n
Choose from Toromont Cat’s Wide Selection of Used Excavators
\r\n

\r\n Equip your job site with a reliable and well-maintained used excavator from Toromont Cat! Whether you need to dig a trench, build a foundation, clear land or extract underground materials and minerals, you’ll find a used excavator to meet your needs and exceed your expectations at Toromont Cat. Our used excavators for sale enable you to dominate the job site with ease, efficiency, comfort and security. Contact Toromont Cat today for a project quote or for more information about our selection of used excavators.\r\n

\r\n\r\n\r\n ,\r\n\r\n\r\n },\r\n FR: {\r\n \"Name\": \"Excavatrices\",\r\n \"Meta\": \"Les excavatrices usagées à vendre de Toromont Cat sont un atout indispensable pour la flotte d’un entrepreneur. Quelle que soit l’application, notre sélection de pelles hydrauliques d’occasion fera en sorte que le travail sera accompli avec efficacité et en toute sécurité.\",\r\n \"Desc\": <>\r\n

Innovez avec une excavatrice usagée de Toromont

\r\n

\r\n Lorsque vous commencez un nouveau projet, une excavatrice usagée fiable et efficace est essentielle. Si vous avez besoin d’une petite ou une grosse excavatrice ou même d’une excavatrice intermédiaire pour de l’agriculture, de la construction, de la sylviculture ou du travail minier, les pelles d’occasion de Toromont Cat vont compléter vos tâches avec une agilité et une puissance inégalées.\r\n

\r\n

\r\n Excavatrices d’occasion à vendre:\r\n

\r\n ,\r\n \"ExtraText\": <>\r\n

\r\n Complétez le travail plus rapidement et réduisez les coûts avec une excavatrice d’occasion Cat®\r\n

\r\n

\r\n Toromont Cat a des centaines de pelles usagées disponibles à la vente en Ontario, Québec, Manitoba, Nouveau-Brunswick, Terre-Neuve-et-Labrador, Nouvelle-Écosse et Île-du-Prince-Édouard. Nos excavatrices usagées incluent un châssis et des composants robustes qui offrent une puissance et une fiabilité supérieures sur les terrains difficiles et dans les environnements rigoureux. Les pelles usagées Cat® chez Toromont Cat incluent des fonctionnalités qui augmentent la productivité, le confort et la sécurité; un châssis robuste offre une stabilité supérieure pendant le transport d’objets lourds, une cabine ergonomique et silencieuse offre un contrôle de climat automatique pour une température constante et des grandes fenêtres offrent une vue panoramique aux opérateurs. Dans plusieurs de nos nouveaux modèles d’excavatrices usagées, les Solutions Cat® Connect augmentent la productivité et réduisent les coûts d’exploitation. Les tuyaux haute pression augmenteront la longévité de votre pelle d’occasion en assurant que les fluides hydrauliques seront transportés efficacement aux composants.\r\n

\r\n
Augmentez la rentabilité avec des pelles usagées fiables
\r\n

\r\n Chez Toromont Cat, nous offrons une grande sélection d’excavatrices d’occasion fabriquées par Caterpillar ainsi que par d’autres marques renommées. Plusieurs de nos pelles d’occasion Cat® sont aussi certifiées Caterpillar pour vous assurer que vous avez acheté une excavatrice de première qualité. La flotte d’excavatrices usagées chez Toromont Cat inclut des modèles allant de l’année 1997 jusqu’au 2020 et plusieurs de ces machines ont moins de mille heures d’opération. Lorsque vous achetez une pelle usagée chez Toromont Cat, vous recevez une machine remarquable dans une condition formidable.\r\n

\r\n
Choisissez parmi la vaste sélection d’excavatrices usagées chez Toromont Cat
\r\n

Équipez votre flotte avec une pelle usagée fiable et bien entretenue de Toromont Cat. Que vous creusiez une tranchée, défrichiez des terres ou extrayiez des matériaux et des minéraux, vous trouver une pelle usagée pour répondre à vos besoins et dépasser vos attentes chez Toromont Cat. Nos excavatrices d’occasion vous permettent de gérer le chantier avec facilité, confort et de manière sécuritaire. Contactez Toromont Cat aujourd‘hui pour un devis ou plus d’information sur nos excavatrices usagées.

\r\n \r\n }\r\n\r\n },\r\n {\r\n \"CatCode\": \"Forest Products - Matériel Forestier\",\r\n \"CatCodeSlug\": \"forest-products-materiel-forestier\",\r\n CtaImage: getImage(\"categoryimagestcat/Used Cat Forestry Machines - Toromont Cat.jpg\"),\r\n EN: {\r\n \"Name\": \"Forest Products\",\r\n \"Meta\": \"A Wide Variety of Used Forest Products for All of Your Commercial Logging Needs\",\r\n \"Desc\": <>\r\n

A Wide Variety of Used Forest Products for All of Your Commercial Logging Needs

\r\n

Forestry machines need to be versatile, reliable and strong enough to handle your toughest application needs. Toromont Cat carries a wide variety of used forest products from all major brands.\r\n\r\n

\r\n

Used Forest Products for Sale:

\r\n ,\r\n \"ExtraText\": <>\r\n

Used Forest Machines Tough Enough to Handle Any Job

\r\n

\r\n Toromont Cat has a large inventory of durable feller bunchers, forwarders and skidders to help you complete your commercial logging applications with ease and under budget! Regardless of how challenging your terrain may be, our range of used forest products includes wheeled and tracked options to tackle any environment. Toromont Cat’s used forest machines are reliable, easy to maintain and equipped with advanced technologies to improve stability and visibility on your job site. Our used forestry machines are also very powerful, with some of our Cat® products ranging in net flywheel power from 149 HP to 291 HP. From Nunavut to Nova Scotia, Toromont Cat is your best choice for used forest machines!\r\n\r\n

\r\n
Get the Used Forest Products You Need from Toromont Cat Today!
\r\n

\r\n Do you need dependable used forest machines for your job site? Toromont Cat has a large selection of used forest products. Whether you need feller bunchers, forwarders or skidders, Toromont Cat carries an unparalleled range of rugged, purpose-built used forest equipment to get the job done. Contact us today for more information about our used forest machines or to receive a detailed quote for your next project!\r\n

\r\n ,\r\n\r\n },\r\n FR: {\r\n \"Name\": \"Produits forestiers \",\r\n \"Meta\": \"Une grande sélection de produits forestiers usagés pour vos besoins en matière d’exploitation forestière commerciale\",\r\n \"Desc\": <>\r\n

Une grande sélection de produits forestiers usagés pour vos besoins en matière d’exploitation forestière commerciale

\r\n

Les machines forestières ont besoin d’être polyvalentes, fiables et assez solides pour répondre à vos besoins les plus exigeants. Toromont Cat offre une quantité de produits forestiers usagés composé de toutes les grandes marques.

\r\n ,\r\n \"ExtraText\": <>

Des machines forestières usagées assez solides pour affronter tout type de projet

\r\n

\r\n Toromont Cat a un grand inventaire d’abatteuses-groupeuses, de porteurs et de débardeurs. Nos produits forestiers usagés ont été conçus pour répondre à tous vos besoins en matière d’exploitation forestière commerciale avec facilité et en deçà du budget! Peu importe le terrain en question, nos produits forestiers usagés incluent des pneus et des voies ferrées spéciales pour affronter tout type d’environnement. Les machines forestières usagées de Toromont Cat sont fiables, faciles à entretenir et équipées avec des technologies avancées qui fournissent une stabilité et une visibilité supérieures sur votre chantier. Notre équipement forestier est aussi très puissant. Les machines forestières usagées de Cat® offrent des puissances nettes au volant allant de 149 HP à 291 HP. Du Nunavut à la Nouvelle-Écosse, Toromont Cat est le meilleur choix en matière de produits forestiers usagés.\r\n

\r\n
\r\n Achetez des produits forestiers usagés\r\n
\r\n

\r\n Avez-vous besoin des machines forestières usagées fiables? Toromont Cat offre une grande sélection de produits forestiers usagés. Si vous avez besoin d’une abatteuse-groupeuse, d’un porteur ou d’un débardeur, Toromont Cat offre une gamme d’équipement robuste et spécialement conçue pour affronter vos travaux forestiers. Contactez-nous aujourd’hui pour obtenir plus d’informations sur nos machines forestières d’occasion ou pour obtenir un devis détaillé.\r\n

\r\n \r\n\r\n }\r\n },\r\n {\r\n \"CatCode\": \"Forklifts - Chariots Elévateurs\",\r\n \"CatCodeSlug\": \"forklifts-chariots-elevateurs\",\r\n EN: {\r\n \"Name\": \"Forklifts\",\r\n \"Meta\": \"Safety, comfort and lifting capacity are just some of the features that make up a great Forklift. With Toromont Material Handling’s used lift trucks, you can easily cut costs and optimize your logistical operations.\",\r\n \"Desc\": \"Safety, comfort and lifting capacity are just some of the features that make up a great forklift. With Toromont Material Handling’s used lift trucks, you can easily cut costs and optimize your logistical operations. Our diesel and electric forklifts are robust, durable, powerful and comfortable to operate, helping to minimize downtime for higher productivity and cost efficiency. Whatever the industry, we have a solution for all of your material handling needs.\",\r\n ExtraText: null\r\n },\r\n FR: {\r\n \"Name\": \"Chariots Elévateurs\",\r\n \"Meta\": \"Un bon chariot élévateur doit posséder des caractéristiques supérieures en termes de sécurité, de confort et de capacité de levage. Avec les chariots élévateurs usagés de Toromont Manutention, vous pouvez facilement réduire et optimiser vos coûts d’opérations logistiques.\",\r\n \"Desc\": \"Un bon chariot élévateur doit posséder des caractéristiques supérieures en termes de sécurité, de confort et de capacité de levage. Avec les chariots élévateurs usagés de Toromont Manutention, vous pouvez facilement réduire et optimiser vos coûts d’opérations logistiques. Nos chariots élévateurs électriques et à combustion sont robustes, durables, puissants et confortables, permettant de réduire vos temps d’arrêt pour une plus grande productivité et une meilleure rentabilité. Quel que soit l’industrie, nous avons une solution pour tous vos besoins en matière de manutention.\",\r\n ExtraText: null\r\n }\r\n },\r\n {\r\n \"CatCode\": \"Mining Equipment - Machines Pour Mines\",\r\n \"CatCodeSlug\": \"mining-equipment-machines-pour-mines\",\r\n CtaImage: getImage(\"categoryimagestcat/Used Cat Mining Equipment - Toromont Cat.jpg\"),\r\n EN: {\r\n \"Name\": \"Mining Equipment\",\r\n \"Meta\": \"To navigate the notoriously rigorous terrain and harsh environment that is common to the mining industry, you need Toromont Cat’s used mining equipment. Our selection of used mining equipment will optimize your operations by delivering value and heavy-duty performance.\",\r\n \"Desc\": <>

Optimize Your Operations with Our Used Mining Equipment

\r\n

Mining equipment has to be tougher than the difficult terrains and harsh environments that are common in the mining industry. Toromont Cat carries a selection of durable used mining vehicles and equipment that deliver heavy-duty performance and high-quality results.\r\n\r\n

\r\n

Used Mining Equipment Currently for Sale:

\r\n ,\r\n \"ExtraText\": <>

\r\n Choose from the Most Advanced Lineup of Used Mining Equipment\r\n

\r\n

Whether your mining site requires digging, drilling, hauling or moving, Toromont Cat carries the used mining equipment, loading tools and commercial mining vehicles you need. Our used mining machines deliver excellent traction, rigidity and hydraulic efficiency. Thanks to their premium components and advanced technologies, our used commercial mining equipment is the safest, most productive and incredibly reliable. Toromont Cat’s selection of well-maintained pre-owned mining equipment includes trusted brands like Caterpillar and Hitachi. If your site requires the toughest equipment that can handle the harshest environments, choose from Toromont Cat’s selection of used mining equipment.\r\n\r\n

\r\n
Buy Used Mining Equipment for Your Jobsite from Toromont Cat Today!
\r\n

Every load counts, so choose the used mining products that are built to handle any load. For pre-owned mining products that can complete the toughest mining applications, choose Toromont Cat. Contact us today for more details about our range of used mining equipment or to get a quote for your project!\r\n\r\n

\r\n ,\r\n\r\n },\r\n FR: {\r\n \"Name\": \"Équipements miniers\",\r\n \"Meta\": \"Pour naviguer sur le terrain rigoureux et difficile qui est commun à l’industrie minière, il vous faut l’équipement minier usagé de Toromont Cat. Notre sélection d’équipements miniers améliorera vos opérations en livrant une performance de longue durée.\",\r\n \"Desc\": <>\r\n

Optimisez vos opérations avec nos équipements miniers usagés

\r\n

Les équipements miniers doivent être robustes pour travailler sur les terrains rigoureux et difficiles qui caractérisent l’industrie minière. Toromont Cat offre une sélection d’équipements miniers usagés très durables qui démontrent une performance à toute épreuve et donnent des résultats de haute qualité.\r\n\r\n

\r\n

Équipements miniers usagés à vendre:

\r\n ,\r\n \"ExtraText\": <>\r\n

Choisissez parmi la plus grande flotte d’équipement minier d’occasion

\r\n

Que votre chantier nécessite des travaux en matière de forage ou de transport, l’équipement minier usagé, les outils de chargement et les véhicules miniers de Toromont Cat vous aideront à optimiser votre productivité. Notre équipement minier d’occasion offre une excellente traction, une grande durabilité et une puissance hydraulique exceptionnelle. Grâce à leurs technologies avancées et leurs composants de qualité, nos équipements miniers d’occasion sont les plus sûrs, les plus productifs et notablement fiables. Chez Toromont Cat, la flotte d’équipements miniers d’occasion est bien entretenue. Notre sélection est comprise de marques connues comme Caterpillar et Hitachi. Si vous avez besoin d’équipement résistant tout terrain pour votre chantier, choisissez Toromont Cat.\r\n

\r\n
Achetez votre équipement minier usagé chez Toromont Cat dès aujourd’hui!
\r\n

\r\n Chaque charge a un impact, alors choisissez de l’équipement minier d’occasion conçu pour supporter toutes les charges possibles. Contactez Toromont Cat aujourd’hui pour plus de détails sur notre flotte d’équipement minier d’occasion ou pour un devis pour votre projet!\r\n

\r\n \r\n\r\n }\r\n },\r\n {\r\n \"CatCode\": \"Motor Graders - Niveleuses\",\r\n \"CatCodeSlug\": \"motor-graders-niveleuses\",\r\n CtaImage: getImage(\"categoryimagestcat/Used Cat Motor Graders - Toromont Cat.jpg\"),\r\n EN: {\r\n \"Name\": \"Motor Graders\",\r\n \"Meta\": \"Your fleet isn’t complete without a Toromont Cat motor grader. Our used graders provide precise maneuverability in tight spaces and excellent traction on slopes and soft underfoot conditions.\",\r\n \"Desc\": <>

Large Selection of Used Motor Graders Available at Toromont Cat

\r\n

\r\n Motor graders are invaluable for a variety of applications such as construction, farming, road paving and snow removal. Toromont Cat carries a range of used motor graders that consistently provide precise maneuverability in tight spaces and excellent traction in a variety of conditions.\r\n\r\n

\r\n

Used Motor Graders Currently for Sale:

\r\n ,\r\n \"ExtraText\": <>\r\n

Our Used Motor Graders Will Flatten Any Jobsite

\r\n

Toromont Cat carries a large selection of used motor graders that are renowned for their controls, technology, hydraulics and comfortable cabs. They provide additional traction control in challenging terrains that have gravel, snow or mud and work well on sloped surfaces. Toromont Cat’s used motor graders range in power from 179 HP to 535 HP and have blade widths from 12 ft to 24 ft. We carry several different brands of motor graders including Caterpillar, Champion, Deere + Co, John Deere and Volvo. Many of our pre-owned motor graders come Caterpillar Certified. Whether you work in agriculture, construction or snow removal, Toromont Cat has the used motor grader to meet your specific needs.\r\n

\r\n
Buy Your Next Used Motor Grader from Toromont Cat!
\r\n

\r\n Toromont Cat carries an unbeatable selection of used motor graders that are built to handle your toughest applications. Whatever your flattening needs are, we have a pre-owned motor grader to help you complete the job. Contact Toromont Cat today to learn more about our used motor graders!\r\n

\r\n ,\r\n\r\n },\r\n FR: {\r\n \"Name\": \"Niveleuses\",\r\n \"Meta\": \"Votre flotte n’est pas complète sans une niveleuse usagée de Toromont Cat. Nos niveleuses d’occasion à vendre fournissent une maniabilité précise dans les espaces restreints et une excellente traction sur les pentes et le sol à faible portance.\",\r\n \"Desc\": <>\r\n

Une flotte de niveleuses usagées vous attend chez Toromont Cat

\r\n

\r\n Les niveleuses sont nécessaires pour une variété d’applications telles que le pavage, la construction, l’agriculture et le déneigement. Toromont Cat offre une flotte de niveleuses usagées qui peuvent exécuter des manœuvres précises même dans des espaces restreints et qui offrent une excellente traction dans des conditions très diverses.\r\n

\r\n

Niveleuses usagées à vendre :

\r\n ,\r\n \"ExtraText\": <>

Aucun chantier n’est trop difficile à dominer pour nos niveleuses d’occasion

\r\n

Toromont Cat a une grande sélection de niveleuses usagées qui sont réputées pour leur excellentes commandes, leurs technologies avancées, leurs systèmes hydrauliques supérieurs et leurs cabines ergonomiques. Pour ce qui est des environnements avec du gravier, de la neige ou de la boue, nos niveleuses d’occasion offrent davantage de traction pour travailler efficacement. Elles travaillent aussi sur le terrain incliné. Les niveleuses usagées de Toromont Cat ont une puissance de 179 HP à 535 HP et une largeur de 12 pi à 14 pi. Nous avons plusieurs niveleuses de marques connues comme Caterpillar, Champion, Deere + Co, John Deere et Volvo. Plusieurs niveleuses usagées sont certifiées Caterpillar. Si vous travaillez dans l’agriculture, la construction ou le déneigement, Toromont Cat a la niveleuse usagée qui répondra à vos besoins.\r\n

\r\n
Achetez vos niveleuses d’occasion chez Toromont Cat
\r\n

Toromont Cat offre des niveleuses usagées qui peuvent entreprendre les travaux les plus difficiles. Peu importe vos besoins d’aplanissement, nous avons la niveleuse usagée parfaite pour vous. Contactez Toromont Cat aujourd’hui pour plus d’information sur nos niveleuses d’occasion!\r\n\r\n

\r\n \r\n\r\n }\r\n },\r\n {\r\n \"CatCode\": \"Off-highway Trucks / Tractors - Tombereaux rigides / tracteurs\",\r\n \"CatCodeSlug\": \"off-highway-trucks-tractors-tombereaux-rigides-tracteurs\",\r\n CtaImage: getImage(\"categoryimagestcat/Used Cat Off-Highway Trucks - Toromont Cat.jpg\"),\r\n EN: {\r\n \"Name\": \"Off-highway Trucks / Tractors\",\r\n \"Meta\": \"Off highway trucks are specifically designed for the mining, quarry and construction industries, where challenging terrain and extreme environments are the norm. In these industries, durability, reliability and load capacity matter the most.\",\r\n \"Desc\": <>

Exceed Your Expectations with Our Used Off-Highway Trucks

\r\n

Off-highway trucks are specifically designed for the construction, mining and quarry industries where extreme environments\r\n are common. For a truck that can handle your toughest applications in almost any environment, choose a used off-highway truck\r\n from Toromont Cat.

\r\n

Used Off-Highway Trucks & Tractors Currently for Sale:

\r\n ,\r\n \"ExtraText\": <>

Used Off-Highway Trucks that Perform in Harsh Conditions

\r\n

Toromont Cat has a wide selection of used off-highway trucks available for purchase. Our off-highway trucks are well-known for their excellent hauling capabilities and maneuverability on rugged terrain. Newer technologies have improved the comfort, performance, safety and cost-efficiency of our machines. Our range of pre-owned off-highway trucks can easily carry payloads between 42.1 ton and 98.4 ton and travel more than 40 mph when fully loaded. Whatever you need to haul, a used off-highway truck from Toromont Cat can help you get the job done.

\r\n
Buy Your Next Used Off-Highway Truck from Toromont Cat!
\r\n

Off-highway trucks are pivotal pieces of equipment for many jobsites in the construction, mining and quarry industries. Choose trucks that are reliable and tough enough to handle the challenging terrain on your site. For a used off-highway truck built to perform in the harshest of conditions, contact Toromont Cat today!

\r\n ,\r\n\r\n },\r\n FR: {\r\n \"Name\": \"Tombereaux rigides / tracteurs\",\r\n \"Meta\": \"Les tombereaux rigides sont spécialement conçus pour les industries minières où le terrain est habituellement difficile et les environnements sont extrêmes. Dans ces types d’industries, la durabilité, la fiabilité et la capacité de charge sont d’une grande importance.\",\r\n \"Desc\": <>\r\n

Dépassez vos attentes avec nos tombereaux et tracteurs rigides usagés

\r\n

Les tombereaux rigides sont spécialement conçus pour les industries minières, de construction et de carrière où les environnements extrêmes sont communs. Pour un camion qui pourrait manipuler vos applications les plus dures, choisissez un tombereau ou un tracteur rigide usagé chez Toromont Cat.

\r\n

Tombereaux et tracteurs rigides usagés à vendre :

\r\n ,\r\n \"ExtraText\": <>\r\n

Les Tombereaux et tracteurs rigides d’occasion qui compléteraient le travail dans les conditions difficiles

\r\n

Toromont Cat a une vaste gamme de tombereaux et de tracteurs rigides usagés à vendre. Nos tombereaux rigides sont renommés pour leurs excellentes capacités de transport et leur maniabilité sur le terrain accidenté. Les technologies avancées ont amélioré le confort, la performance et la sécurité de nos machines. Notre gamme de tombereaux rigides usagés peuvent facilement transporter des charges entre 42,1 tonnes et 98,4 tonnes et parcourir des distances de plus de 40 mph. N’importe quoi vous devez traîner, un tombereau rigide d’occasion de Toromont Cat fera le travail.

\r\n
Achetez votre prochain tombereau ou tracteur rigide usagé chez Toromont Cat
\r\n

Pour plusieurs de chantiers, les tombereaux et les tracteurs rigides sont nécessaires. Choisissez les tombereaux assez fiables et résistants pour les terrains accidentés. Pour les tombereaux ou les tracteurs rigides usagés qui étaient construit pour exécuter dans les conditions les plus difficiles, contactez Toromont Cat aujourd’hui!

\r\n \r\n\r\n }\r\n },\r\n {\r\n \"CatCode\": \"On-highway Trucks - Camions Routiers\",\r\n \"CatCodeSlug\": \"on-highway-trucks-camions-routiers\",\r\n EN: {\r\n \"Name\": \"On-highway Trucks\",\r\n \"Meta\": \"Designed for the long haul, our premium selection of used on-highway trucks will help you transport today’s heavy loads with ease and efficiency.\",\r\n \"Desc\": \"Our premium selection of used on-highway trucks will help you transport today’s heavy loads with ease and efficiency. Designed for the long haul, our used transport trucks feature an ergonomic cab that delivers superior comfort, a powerful, fuel-efficient engine that can handle long distances, a rugged, industrial build for long-lasting performance, and technologically advanced features that will optimize the drive, enhancing any hauling application for superior productivity and results at top value.\",\r\n ExtraText: null\r\n },\r\n FR: {\r\n \"Name\": \"Camions Routiers\",\r\n \"Meta\": \"Conçue pour le transport de charges lourdes, notre sélection de camions routiers usagés vous permettra d’effectuer vos applications de transport avec facilité et efficacité.\",\r\n \"Desc\": \"Notre sélection de camions routiers usagés vous permettra d’effectuer vos applications de transport avec facilité et efficacité. Conçus pour le transport de charges lourdes, nos camions de transport usagés sont équipés d'une cabine ergonomique offrant un confort supérieur, d'un moteur puissant et faible en carburant, d'une construction robuste pour une durabilité accrue, et de technologies avancées qui optimisent la conduite et la performance, fournissant une productivité et des résultats supérieurs.\",\r\n ExtraText: null\r\n }\r\n },\r\n {\r\n \"CatCode\": \"Paving Products - Matériel Routier\",\r\n \"CatCodeSlug\": \"paving-products-materiel-routier\",\r\n CtaImage: getImage(\"categoryimagestcat/Used Cat Paving Products - Toromont Cat.jpg\"),\r\n EN: {\r\n \"Name\": \"Paving Products\",\r\n \"Meta\": \"Our range of used asphalt pavers and rollers will provide economical and versatile solutions for all types of paving needs, from airport and highway projects to small housing developments.\",\r\n \"Desc\": <>\r\n

Used Paving Products for All Your Paving Needs

\r\n

Paving projects are common in the construction industry. Whether you are working to pave an airport, a highway or a small housing development, Toromont Cat has the used asphalt pavers and rollers to get the job done quickly, safely and efficiently.

\r\n

Used Asphalt Pavers Currently for Sale:

\r\n ,\r\n \"ExtraText\": <>\r\n

Large Selection of Durable Used Paving Equipment

\r\n

Toromont Cat carries a wide range of used paving products – including asphalt pavers, rollers and screeds – that are available for purchase or rental. We carry wheeled and tracked machines from trusted brands like Caterpillar, Roadtec, Vögele America and Weiler that range in gross power from 46 HP to 300 HP. Our pre-owned paving machines come equipped with advanced fume ventilation and cooling systems, pivoting seats and excellent traction control. Our used paving products are also well-known for their speed, fuel efficiency and comfortable cab conditions for operators. Whatever your paving needs, Toromont Cat has the used paving products to help you lay the smoothest mat.

\r\n
Purchase Reliable Used Paving Products from Toromont Cat
\r\n

Toromont Cat’s selection of used paving equipment is the ideal choice for demanding paving applications. If you need power, fuel efficiency, comfortable operating conditions and superior functionality from your paving equipment, contact Toromont Cat today to learn more about our exceptional range of used paving products.

\r\n ,\r\n\r\n },\r\n FR: {\r\n \"Name\": \"Produits de pavage\",\r\n \"Meta\": \"Notre gamme de finisseurs et de rouleaux usagés fournit des solutions économiques et polyvalentes pour tous besoins en matière de pavage, que ce soit pour des projets d’autoroute, d’aéroport ou des développements résidentiels.\",\r\n \"Desc\": <>\r\n

Les Produits de pavage usagés pour toutes vos applications de pavage

\r\n

Les projets de pavage sont communs dans l’industrie de construction. Si vous paveriez un aéroport, une autoroute ou un développement résidentiel, Toromont Cat a les finisseurs et les rouleaux usagés qui fera le travail rapidement et sans danger.

\r\n

Finisseurs et rouleaux usagés à vendre :

\r\n ,\r\n \"ExtraText\": <>\r\n

Une Grande sélection de produits de pavage usagés durables

\r\n

Toromont Cat offre une vaste gamme de produits de pavage usagés – comme les finisseurs, les rouleaux et les chapes – à vendre ou pour location. Nous avons les machines avec les pneus et les voies ferrées de marques connues comme Caterpillar, Roadtec, Vögele America et Weiler. Elles ont la puissance élevée allant de 46 HP à 300 HP. Nos produits de pavage d’occasion sont équipés avec les systèmes de ventilation et refroidissement, les places pivotantes et l’excellente contrôle de traction. Nos produits de pavage usagés sont aussi renommés pour leur vitesse, leur efficacité en carburant et leurs cabines confortables. Peu importe vos besoins de pavage, Toromont Cat a les produits de pavage d’occasion pour vous aidera à poser le tapis le plus lisse.

\r\n
Achetez les produits de pavage usagés fiables chez Toromont Cat
\r\n

La sélection de produits de pavage usagés chez Toromont Cat est le meilleur choix pour les applications de pavage astreignantes. Si vous avez besoin de puissance, une faible consommation de carburant, une opération confortable et une fonctionnalité supérieure de votre équipement de pavage, contactez Toromont Cat aujourd’hui!

\r\n \r\n\r\n }\r\n },\r\n {\r\n \"CatCode\": \"Skid Steer Loaders / ASV - Chargeurs Compacts rigides\",\r\n \"CatCodeSlug\": \"skid-steer-loaders-asv-chargeurs-compacts-rigides\",\r\n EN: {\r\n \"Name\": \"Skid Steer Loaders\",\r\n \"Meta\": \"Skid steer loaders are highly adaptable machines. With the use of different attachments, multi terrain loaders can handle a wide range of jobs from snow removal and landscaping to debris removal.\",\r\n \"Desc\": <>

Toromont Cat’s Used Skid Steer Loaders

Skid steer loaders are highly adaptable machines. With the use of different attachments, multi terrain loaders can handle a wide range of jobs from snow removal and landscaping to debris removal. Toromont Cat’s used skid steer loaders are primed for digging, grading, pushing or loading in almost any kind of environment. Our small loaders are ideal for work in indoor or narrow spaces, while our large loaders deliver hard-hitting performance on grueling outdoor projects such as demolition and forestry.

Used Skid Steer Loaders Currently for Sale:

,\r\n \"ExtraText\": <>

Used Skid Steer Loaders to Get the Job Done

Skid steer loaders are strong, powerful machines with arms that can be attached to a variety of Cat attachments for different applications. Toromont Cat carries several models of used skid steer loaders that range in power from 65.8 HP to 106 HP and have an operating capacity of 1550 lb to 3650 lb. Our used Caterpillar skid steer loaders are known worldwide for their durability, reliability, efficiency and simple controls. Toromont Cat’s used steer loaders are designed and built to help you get the job done, so contact us for more information today!

,\r\n\r\n },\r\n FR: {\r\n \"Name\": \"Chargeurs Compacts rigides\",\r\n \"Meta\": \"Les chargeurs compacts rigides sont très adaptables. En utilisant plusieurs accessoires différents, les chargeurs tout terrain peuvent accomplir un large éventail de travaux comme le déneigement, l’aménagement paysager et l’élimination des débris.\",\r\n \"Desc\": \"Les chargeurs compacts rigides sont très adaptables. En utilisant plusieurs accessoires différents, les chargeurs tout terrain peuvent accomplir un large éventail de travaux comme le déneigement, l’aménagement paysager et l’élimination des débris. Les chargeurs compacts rigides usagés de Toromont Cat sont prêts à creuser, à niveler, à pousser ou à transporter dans n’importe quel type d’environnement. Nos petits chargeurs sont idéals pour les travaux d’intérieur ou les espaces étroits, tandis que nos gros chargeurs sont parfaits pour les grands travaux d’extérieur tels que la démolition et l’exploitation forestière.\",\r\n \"ExtraText\": <>

Les chargeurs compacts rigides usagés pour un travail bien fait

Les chargeurs compacts rigides sont des machines robustes et puissantes avec des bras qui peuvent être fixés à une variété d’accessoires Cat pour différentes applications. Toromont Cat offre plusieurs modèles de chargeurs compacts rigides avec une puissance de 65,8 HP à 106 HP et une capacité de chargement de 1 550 lb à 3 650 lb. Nos chargeurs compacts rigides Caterpillar sont connus dans le monde entier pour leur durabilité, leur fiabilité, leur efficacité et leurs technologies de pointe. Les chargeurs compacts rigides d’occasion de Toromont Cat sont conçus pour faciliter tout type de travail, alors contactez-nous aujourd’hui pour obtenir plus d’information!

\r\n\r\n }\r\n },\r\n {\r\n \"CatCode\": \"Telehandlers - Chargeurs à Bras Télescopique\",\r\n \"CatCodeSlug\": \"telehandlers-chargeurs-a-bras-telescopique\",\r\n CtaImage: getImage(\"categoryimagestcat/Used Cat Telehandlers - Toromont Cat.jpg\"),\r\n EN: {\r\n \"Name\": \"Telehandlers\",\r\n \"Meta\": \"With Toromont Cat’s used telehandlers, nothing is out of reach. Our line of telescopic lifts add unmatched versatility and ease of handling to any industry application.\",\r\n \"Desc\": <>\r\n

Reach New Heights with a Used Telehandler from Toromont Cat

\r\n

Telehandlers – also known as boom lifts, telescopic lifts and reach forklifts – are relied upon in the agriculture, construction and mining industries to extend reach distances and carry heavy loads. For a dependable used telehandler that won’t exhaust your budget, look no further than Toromont Cat.

\r\n

Used Telehandlers Currently for Sale:

\r\n ,\r\n \"ExtraText\": <>\r\n

A Selection of Used Telehandlers for Any Job

\r\n

A telescopic lift can easily do the work of both a crane and a forklift and can be fitted with attachments to help you perform other tasks, like remove debris. The used Cat® telehandlers that we carry are renowned for their lift and reach capabilities – with maximum lift heights ranging from 18.37 ft to 54.6 ft – and have load capacities ranging from 5,500 lb to 12,000 lb. Our range of hydraulic lifting equipment is also equipped with advanced features that improve stability and site visibility, increase operator efficiency and extend service intervals. With a pre-owned telehandler from Toromont Cat, nothing is out of your reach.

\r\n
Purchase Your Next Used Telehandler from Toromont Cat Today!
\r\n

If you’re in need of a used telehandler that can operate with ease on almost any terrain, hoist your heaviest loads and deliver superior results, choose a used telehandler from Toromont Cat. Contact us today for more information about our used telescopic lifts or to request a quote for your next project.

\r\n ,\r\n\r\n },\r\n FR: {\r\n \"Name\": \"Chargeurs à Bras Télescopique\",\r\n \"Meta\": \"Avec les chargeurs à bras télescopique usagés de Toromont Cat, le ciel est à votre portée. Notre gamme de chargeurs à bras télescopique ajoute une polyvalence et une facilité de manutention à n’importe quelle application.\",\r\n \"Desc\": <>\r\n

Atteindre de nouveaux sommets avec un chargeur à bras télescopique usagé

\r\n

Les chargeurs à bras télescopique sont cruciaux dans les industries minières, de l’agriculture et de la construction. Ils augmentent la distance d’atteinte et portent les charges lourdes. Pour un chargeur à bras télescopique d’occasion sûr qui n’épuiserait votre budget, contactez Toromont Cat.

\r\n

Chargeurs à bras télescopique usagés à vendre:

\r\n \r\n ,\r\n \"ExtraText\": <>\r\n

Une gamme des chargeurs à bras télescopique pour tout type de travail

\r\n

Un chargeur à bras télescopique peut remplacer une grue et un chariot élévateur, et il peut aider avec les autres applications, comme l’enlèvement de rebut. Nos chargeurs à bras télescopique Cat® sont connus pour leurs capacités d’atteinte et de chargement supérieure. Ils sont capables d’atteindre les hauteurs allant 18,37 pieds à 54,6 pieds et ils peuvent transporter des charges allant 5 500 lb à 12 000 lb. Notre équipement de levage hydraulique est aussi équipé avec les caractéristiques avancées qui peuvent améliorer la stabilité et la visibilité, augmenter l’efficacité d’opérateur et prolonger les intervalles de service. Avec les chargeurs à bras télescopique usagés de Toromont Cat, le ciel est à votre portée.

\r\n
Achetez votre prochain chargeur à bras usagé chez Toromont Cat
\r\n

Si vous avez besoin d’un chargeur à bras télescopique d’occasion qui peut manipuler presque tout terrain, transporter vos chargements les plus lourds, offrir une distance d’atteinte haute et produire les résultats superbes, choisissez votre prochaine machine chez Toromont Cat. Contactez-nous aujourd’hui pour obtenir plus d’information sur nos chargeurs à bras télescopique usagés ou un devis pour votre prochain projet!

\r\n \r\n\r\n }\r\n },\r\n {\r\n \"CatCode\": \"Track Type Loaders / Crawlers - Chargeurs Sur Chaines\",\r\n \"CatCodeSlug\": \"track-type-loaders-crawlers-chargeurs-sur-chaines\",\r\n CtaImage: getImage(\"categoryimagestcat/Used Cat Track Type Loaders - Toromont Cat.jpg\"),\r\n EN: {\r\n \"Name\": \"Track Type Loaders / Crawlers\",\r\n \"Meta\": \"When it comes to top loading and digging performance on the job site, nothing beats our used track type loaders/crawlers.\",\r\n \"Desc\": <>

Reach Maximum Performance with Our Used Track Type Loaders and Crawlers

When it comes to maximum loading and digging performance on the job site, nothing beats our used track type loaders/crawlers. Toromont Cat tracked loaders are made to handle the most challenging terrains, offering unrivaled power, versatility and productivity thanks to their uncanny ability to dig, load and excavate in some of roughest and most stringent ground work applications such as mining, quarry and construction.

Used Track Type Loaders and Crawlers Currently for Sale:

,\r\n \"ExtraText\": <>

Toromont Cat’s Selection of Used Track Type Loaders and Crawlers

Toromont carries several models of used track type loaders and crawlers with high loading capacities and the ability to handle some of the world’s most challenging terrains. Our Caterpillar used track type loaders/crawlers range in flywheel power from 154 HP to 275 HP and are able to perform digging, loading and excavation tasks in some of the toughest industries. If your construction, mining or quarry site could benefit from a heavy-duty used track type loader/crawler, contact Toromont Cat today for more information about our available models.

\r\n\r\n },\r\n FR: {\r\n \"Name\": \"Chargeurs Sur Chaines\",\r\n \"Meta\": \"Nos chargeurs sur chaînes usagés offrent une puissance de creusement et de chargement supérieure sur le chantier.\",\r\n \"Desc\": \"Nos chargeurs sur chaînes usagés offrent une puissance de creusement et de chargement supérieure sur le chantier. Les chargeurs sur chaînes de Toromont Cat sont conçus pour maîtriser les terrains les plus rigoureux. Ils fournissent une puissance et une polyvalence inégalées grâce à leur étonnante capacité à creuser et à charger dans les applications les plus difficiles telles que l'exploitation minière, la carrière et la construction.\",\r\n \"ExtraText\": <>

La sélection de chargeurs sur chaines usagés de Toromont Cat

Toromont Cat offre plusieurs modèles de chargeurs sur chaines usagés avec une capacité de chargement élevée. Nos chargeurs sur chaines d’occasion Caterpillar fournissent une puissance d’inertie de 154 HP à 275 HP et sont capables d’effectuer des travaux de creusement, de chargement et d’excavation dans les industries les plus rigoureuses. Si votre chantier minier, de construction ou de carrière nécessite un chargeur sur chaines usagé robuste, contactez Toromont Cat aujourd’hui pour obtenir plus d’information sur nos modèles disponibles.

\r\n\r\n }\r\n },\r\n {\r\n \"CatCode\": \"Track Type Tractors / Dozers - Tracteurs Sur Chaines\",\r\n \"CatCodeSlug\": \"track-type-tractors-dozers-tracteurs-sur-chaines\",\r\n EN: {\r\n \"Name\": \"Track Type Tractors / Dozers\",\r\n \"Meta\": \"Dozers are a force to be reckoned with when it comes to achieving peak mobility on difficult terrain. Our used track type tractors deliver earth-moving power thanks to their excellent tractive force and maneuverability.\",\r\n \"Desc\": <>\r\n

Eliminate Site Obstructions with Used Tractors and Dozers from Toromont Cat

\r\n

To quickly and easily clear your site of trees and shrubs, dense soil, stones or leftover building materials, you’ll need a dependable used Cat® tractor or dozer to get the job done. Toromont Cat offers a wide selection of used small, medium, large and waste-handling dozers capable of removing obstacles and flattening the job site with power, stability and precision.

\r\n

Used Tractors and Dozers Currently for Sale:

\r\n ,\r\n \"ExtraText\": <>\r\n

Used Cat® Tractors and Dozers Outperform the Competition

\r\n

Toromont Cat carries a variety of reliable used track-type tractors and dozers built to easily and efficiently complete the clearing and grading tasks common to agricultural, construction, mining and quarry sites. Our used Cat® tractors and dozers – which range in net power from 80 HP to 850 HP – are renowned for their technology, safety features, maneuverability and durability. Many of Toromont Cat’s pre-owned Cat® dozers come equipped with Cat® Connect Technologies – including Cat® Slope Assist, Cat® Slope Indicate, Cat® Stable Blade and Cat® Grade with 3D – which help to boost productivity and provide better quality results. Save more fuel and money with the Eco Mode feature on our used tractors and dozers; the D10T, D3K2, D4K2, D6K2, D6N and D6T used dozer models are up to 15% more fuel efficient and produce less exhaust emissions. With Cat® Connect Technologies, automatic traction control, power pitch and improved blade control, operators will be up to 50% more productive when operating a used Cat® dozer. Our pre-owned tractors and dozers are also outfitted with seat-mounted controls, heated seats and panoramic windows for better operator visibility.

\r\n
Explore Toromont Cat’s Wide Range of Used Track-Type Tractors and Dozers
\r\n

Toromont Cat has used tractors and dozers available for sale by Caterpillar and other trusted brands in the seven regions we serve (ON, QC, MN, NB, NL, NS and PE). Our fleet of pre-owned tractors includes models from 2002 to 2019, many of which have low usage hours. When you buy a used dozer from Toromont Cat, you’ll also have 24/7 access to our team of dedicated service technicians. Thanks to easy access panels for servicing on our used tractors and dozers, our technicians can quickly repair your machine with little downtime. For more peace of mind, choose a Caterpillar Certified dozer that has been serviced and inspected by our technicians to an almost-new state, so that you can be certain you’re receiving a durable dozer in top-notch condition. With pre-owned tractors and dozers from Toromont Cat, you can power through tough conditions and finish the job faster.

\r\n
Purchase Your Next Used Tractor or Dozer from Toromont Cat
\r\n

For your next agricultural, construction, mining or quarry project, choose a used dozer from Toromont Cat that can handle your toughest obstacle removal and grading tasks. Our used Cat® tractors and dozers are outfitted with advanced features that help them to outperform other dozers on any job site. To learn more about our used tractors and dozers and the difference they can make on your site, contact Toromont Cat today!

\r\n ,\r\n\r\n },\r\n FR: {\r\n \"Name\": \"Tracteurs Sur Chaines\",\r\n \"Meta\": \"En matière de performance et de mobilité sur les terrains difficiles, rien ne bat les bulldozers usagés à vendre de Toromont Cat. Grâce à leur maniabilité et à leur superbe capacité de traction, nos dozers usagés offrent une puissance qui fait secouer la terre.\",\r\n \"Desc\": <>\r\n

Éliminez les obstructions de chantier avec les tracteurs sur chaines usagés de Toromont Cat

\r\n

Pour facilement et rapidement enlever des arbres et des arbustes, de la terre, des pierres ou des matériaux restants sur votre chantier, vous avez besoin d’un sûr bulldozer usagé Cat®. Toromont Cat offre une vaste sélection de petits, moyens et grands tracteurs sur chaines Caterpillar capables d’enlever les obstacles et de niveler le chantier avec puissance, stabilité et précision.

\r\n

Tracteurs sur chaines usagés à vendre:

\r\n \r\n ,\r\n \"ExtraText\": <>\r\n

Les tracteurs sur chaines d’occasion Cat® surpassent la compétition

\r\n

Toromont Cat a une grande variété de bulldozers usagés conçus pour efficacement compléter les tâches de défrichement et d’aplanissement sur les chantiers d’agriculture, de construction, de carrière et de mine. Nos tracteurs sur chaines usagés Cat® – qui varient en puissance nette de 80 HP à 850 HP – sont renommés pour leurs technologies de pointe, leur sécurité, leur maniabilité et leur durabilité. Plusieurs de bulldozers usagés Caterpillar chez Toromont Cat sont équipés avec Cat® Connect Technologies – comme Cat® Slope Assist, Cat® Slope Indicate, Cat® Stable Blade et Cat® Grade avec 3D – qui aident à stimuler la productivité et produisent les résultats d’une haute qualité. Économisez l’argent et le carburant avec la fonction Eco Mode; les modèles de bulldozers usagés D10T, D3K2, D4K2, D6K2, D6N et D6T sont jusqu’à 15% plus économiques en carburant et produisent moins du gaz d’échappement. Avec Cat® Connect Technologies, le contrôle de traction automatique et meilleur contrôle du plat, les opérateurs seront jusqu’à 50% plus productifs quand ils utilisent un tracteur sur chaines usagé Caterpillar. Nos bulldozers d’occasion sont aussi équipés avec les commandes montées sur le siège, les sièges chauffants et les fenêtres panoramiques pour une meilleure visibilité.

\r\n
Explorez la large gamme de tracteurs sur chaines usagés chez Toromont Cat
\r\n

Toromont Cat a les tracteurs sur chaines d’occasion par Caterpillar et les autres marques de confiance à vendre presque partout Canada (QC, ON, MN, NB, NL, NS et PE). Notre flotte de tracteurs sur chaines usagés inclut les modèles de 2002 jusqu’au 2019 et beaucoup de ces machines ont les faibles heures d’utilisation. Quand vous achetez un bulldozer d’occasion chez Toromont Cat, vous allez aussi avoir l’accès à notre équipe de techniciens de service dédiés. Grâce aux panneaux d’accès facile, nos techniciens peuvent rapidement réparer votre machine avec peu de temps d’arrêt. Pour plus de tranquillité d’esprit, choisissez un bulldozer certifié Caterpillar donc vous êtes certain que vous avez acheté un tracteur sur chaines usagé dans un état presque parfait. Avec les tracteurs sur chaines d’occasion de Toromont Cat, vous pouvez traverser des conditions difficiles et compléter le travail plus vite.

\r\n
Achetez votre prochain tracteur sur chaines usagé chez Toromont Cat
\r\n

Pour votre prochain projet minier, d’agriculture, de construction ou de carrière, choisissez un bulldozer usagé de Toromont Cat qui peut gérer vos tâches d’enlèvement d’obstacles et de nivellement les plus difficiles. Nos tracteurs sur chaines d’occasion Caterpillar sont équipés avec les fonctionnalités qui fournissent une performance optimale sur le chantier. Pour en savoir plus de nos bulldozers d’occasion et la différence qu’ils peuvent faire sur votre chantier, contactez Toromont Cat aujourd’hui!

\r\n \r\n\r\n }\r\n },\r\n {\r\n \"CatCode\": \"Wheel Loaders / Integrated Toolcarriers - Chargeurs Sur Pneus / Chargeurs Industriels\",\r\n \"CatCodeSlug\": \"wheel-loaders-integrated-toolcarriers-chargeurs-sur-pneus-chargeurs-industriels\",\r\n CtaImage: getImage(\"categoryimagestcat/Used Cat Wheel Loaders - Toromont Cat.jpg\"),\r\n EN: {\r\n \"Name\": \"Wheel Loaders / Integrated Toolcarriers\",\r\n \"Meta\": \"When choosing the right wheel loader, configuration is key. With a wide range of loaders from Toromont Cat, selecting the best type of equipment for each specific application is fast and simple. Our wheel loaders deliver excellent fill factors, improved cycle times and better visibility.\",\r\n \"Desc\": <>

Move Loose Materials with a Used Wheel Loader from Toromont Cat

\r\n

When moving loose materials – from asphalt and dirt, to gravel and snow – an efficient wheel loader can lighten your workload. For a dependable used small, medium or large wheel loader that improves productivity and lowers operating costs, contact Toromont Cat today.\r\n

\r\n

Used Wheel Loaders for Sale:

,\r\n \"ExtraText\": <>\r\n

Used Wheel Loaders Capable of Hauling Your Heaviest Loads

\r\n

Since 1993, Toromont Cat has been committed to providing Canadians working in a variety of industries with reliable heavy equipment, attachments, tools and supplies. Toromont Cat carries an extensive range of used wheel loaders that can easily transport loose materials on your site. Whether you work in agriculture, construction, forestry, landscaping, mining or waste management, we have a used wheel loader to meet your specific needs. The used wheel loaders in our inventory are outfitted with innovative technologies that offer high performance and outstanding versatility. Toromont Cat’s wheel loaders were specially designed with operator comfort and needs in mind; premium ergonomic cabs and customizable engine and ground speed controls for easier work with attachments are standard features. Our used wheel loaders also come equipped with features that boost lift capacity and travel speed, which allow operators to get more done in less time.\r\n

\r\n
Used Wheel Loaders for Any Job
\r\n

With hundreds of used wheel loaders currently available from Toromont Cat, you will surely find one to meet all of your specific hauling needs. We carry a wide variety of used wheel loaders by Caterpillar and other well-known and trusted brands! You can also feel secure in your next purchase from Toromont Cat knowing that many of our used wheel loaders come Caterpillar Certified. Used wheel loaders that are Caterpillar Certified have been inspected and lightly serviced by our dedicated technicians so that they are as good as new for you to use on your site.\r\n

\r\n
Purchase Your Next Used Wheel Loader from Toromont Cat Today!
\r\n

With a used wheel loader from Toromont Cat, you’ll be getting the best in performance, reliability and durability at the absolute best value. For a used wheel loader you can trust to get the job done, contact Toromont Cat today!

\r\n ,\r\n\r\n },\r\n FR: {\r\n \"Name\": \"Chargeurs Sur Pneus / Chargeurs Industriels\",\r\n \"Meta\": \"Pour choisir le bon chargeur sur pneus, il faut considérer la configuration. Avec la gamme de chargeurs sur roues usagés de Toromont Cat, il est simple et facile de sélectionner le meilleur équipement pour chaque application.\",\r\n \"Desc\": <>\r\n

Déplacez tous types de matériaux avec un chargeur sur pneus usagé de Toromont Cat

\r\n

Pour déplacer des matériaux tels que l’asphalte, la terre, le gravier et la neige, un chargeur sur pneus usagé est le bon choix. Pour un chargeur sur pneus usagé petit, intermédiaire ou gros qui optimise les performances opérationnelles et réduit les coûts, contactez Toromont Cat aujourd’hui.\r\n

\r\n ,\r\n \"ExtraText\": <>\r\n

Chargeurs sur pneus d'occasion capables de transporter vos charges les plus lourdes

\r\n

\r\n Depuis 1993, Toromont Cat s'est engagé à fournir des équipements lourds, des accessoires, des outils et des ressources fiables aux Canadiens travaillant dans des diverses industries. Toromont Cat met sa grande flotte de chargeurs sur pneus d'occasion, qui peuvent facilement transporter des matériaux en vrac sur le chantier. Que vous travailliez dans l'agriculture, la construction, la foresterie, le paysagisme, l'exploitation minière ou la gestion des déchets, nous avons un chargeur sur pneus d'occasion conçue pour répondre à vos besoins spécifiques. Les chargeurssur pneus d'occasion de notre inventaire sont équipés de technologies innovantes qui offrent des performances élevées et une polyvalence exceptionnelle. Les chargeurs sur pneus Toromont Cat ont été spécialement conçus pour le confort et les besoins de l'opérateur. En effet, les cabines ergonomiques de haute gamme, les commandes personnalisables du moteur et la vitesse au sol facilitent le travail avec les accessoires et viennent standard.. Nos chargeurs sur pneus d'occasion sont également équipés de fonctionnalités qui augmentent la capacité de levage et la vitesse de déplacement, ce qui permet aux opérateurs de faire plus en moins de temps.\r\n

\r\n
Chargeurs sur pneus d'occasion conçus pour tout type de travail
\r\n

\r\n Parmi les nombreux chargeurs sur pneus d'occasion actuellement disponibles chez Toromont Cat, vous en trouverez sûrement un qui répond à tous vos besoins spécifiques. Nous offrons une grande variété de chargeurs sur pneus d'occasion Caterpillar ainsi que d'autres marques connues et fiables ! Vous pourrez également vous sentir en sécurité lors de votre prochain achat chez Toromont Cat puisque plusieurs des chargeurs sur pneus disponibles sont certifiées Caterpillar. Les chargeurs sur pneus d'occasion certifiées Caterpillar ont été inspectés et légèrement entretenus par nos techniciens afin qu'ils soient comme neufs et prêts sur le chantier.\r\n

\r\n
Achetez vos prochains chargeurs sur pneus d'occasion chez Toromont Cat dès aujourd'hui!
\r\n

Avec un chargeur sur pneus d'occasion de Toromont Cat, vous obtenez les meilleures performances, ainsi que de la fiabilité et de la durabilité à des prix abordables. Pour un chargeur sur pneus d'occasion de confiance, contactez Toromont Cat dès aujourd'hui!\r\n \r\n

\r\n \r\n\r\n }\r\n },\r\n {\r\n \"CatCode\": \"Work Tools - Outils De Travail\",\r\n \"CatCodeSlug\": \"work-tools-outils-de-travail\",\r\n EN: {\r\n \"Name\": \"Work Tools\",\r\n \"Meta\": \"The right tools will do the right job. Toromont Cat offers a wide assortment of used work tools suited for all types of applications, from snow removal to forestry.\",\r\n \"Desc\": \"The right tools will do the right job. Toromont Cat offers a wide assortment of used work tools suited for all types of applications, from snow removal to forestry. We carry used buckets, forestry harvesting heads and forks, as well as tools for crushers, compactors and snow removal. Getting your hands on our cost-friendly work tools will ensure flexibility and peak performance on the job site.\",\r\n ExtraText: null\r\n },\r\n FR: {\r\n \"Name\": \"Outils De Travail\",\r\n \"Meta\": \"Les bons outils font un bon travail. Toromont Cat offre un grand assortiment d’outils de travail usagés qui sont adaptés à plusieurs types d’applications comme le déneigement et le travail forestier.\",\r\n \"Desc\": \"Les bons outils font un bon travail. Toromont Cat offre un grand assortiment d’outils de travail usagés qui sont adaptés à plusieurs types d’applications comme le déneigement et le travail forestier. Nous offrons des godets, des têtes d’abattage et des fourches ainsi que des outils pour concasseurs, compacteurs et équipement de déneigement. Nos outils de travail à prix budgétaires vous aideront à atteindre une meilleure performance et flexibilité sur le chantier.\",\r\n ExtraText: null\r\n }\r\n },\r\n {\r\n \"CatCode\": \"Power Systems - Production d'énergie\",\r\n \"CatCodeSlug\": \"power-systems-production-d-energie\",\r\n EN: {\r\n \"Name\": \"Generators\",\r\n \"Meta\": \"Toromont Cat carries a wide selection of used commercial and industrial generators. Our used gas and diesel generators are built to world-class standards, for high efficiency and low fuel consumption. Contact us today for more information!\",\r\n \"Desc\": <>

Generators provide power for countless agricultural, construction and mining projects across Canada. They are also often required to power complex business data centers and hospitals. Toromont Cat carries a large selection of used generators for commercial and industrial applications that range in power from 40 kW to 2,000 kW. We guarantee that our Caterpillar used generators are load tested and regularly serviced to ensure that you can use your generator immediately after purchase. Whether you need a used generator for your job site or business, contact Toromont Cat today for more information about our used generator range.

Used Generators Currently for Sale:

,\r\n \"ExtraText\": <>

Used Commercial and Industrial Generators

Toromont Cat carries a wide selection of used commercial and industrial generators. Our used gas and diesel generators are built to world-class standards, for high efficiency and low fuel consumption. Contact us today for more information!

,\r\n\r\n },\r\n FR: {\r\n \"Name\": \"Groupes électrogènes\",\r\n \"Meta\": \"Toromont Cat offre une large sélection de groupes électrogènes commerciaux et industriels. Nos groupes électrogènes au gaz et au diesel sont conçus pour fournir une performance et efficacité supérieures ainsi qu’une plus grande économie en carburant. Contactez-nous aujourd’hui pour obtenir plus d’information!\",\r\n \"Desc\": <>

Les groupes électrogènes alimentent une multitude de projets miniers, d’agriculture et de construction à travers le Canada. Ils sont aussi souvent utilisés pour alimenter des centres hospitaliers et des centres complexes de données d’entreprise. Toromont Cat offre une large sélection de groupes électrogènes usagés, qui livrent une puissance de 40 kW à 2 000 kW, pour des applications commerciales et industrielles. Nous garantissons que les groupes électrogènes usagés Caterpillar sont testés en charge et régulièrement entretenus afin d’être pouvoir utilisé immédiatement après leur achat. Si vous avez besoin d’un groupe électrogène d’occasion pour votre chantier ou votre entreprise, veuillez contacter Toromont Cat aujourd’hui pour obtenir plus d’information sur notre sélection de groupes électrogènes.

Groupes électrogènes actuellement en vente:

,\r\n \"ExtraText\": <>

Groupes électrogènes commerciaux et industriels usagés

Toromont Cat offre une large sélection de groupes électrogènes commerciaux et industriels. Nos groupes électrogènes au gaz et au diesel sont conçus pour fournir une performance et efficacité supérieures ainsi qu’une plus grande économie en carburant. Contactez-nous aujourd’hui pour obtenir plus d’information!

\r\n\r\n }\r\n },\r\n {\r\n \"CatCode\": \"gens\",\r\n \"CatCodeSlug\": \"gens\",\r\n EN: {\r\n \"Name\": \"Stationary Generator Sets\",\r\n \"Meta\": \"Toromont Cat carries a wide selection of used commercial and industrial generators. Our used gas and diesel generators are built to world-class standards, for high efficiency and low fuel consumption. Contact us today for more information!\",\r\n \"Desc\": <>

Generators provide power for countless agricultural, construction and mining projects across Canada. They are also often required to power complex business data centers and hospitals. Toromont Cat carries a large selection of used generators for commercial and industrial applications that range in power from 40 kW to 2,000 kW. We guarantee that our Caterpillar used generators are load tested and regularly serviced to ensure that you can use your generator immediately after purchase. Whether you need a used generator for your job site or business, contact Toromont Cat today for more information about our used generator range.

Used Generators Currently for Sale:

,\r\n \"ExtraText\": <>

Used Commercial and Industrial Generators

Toromont Cat carries a wide selection of used commercial and industrial generators. Our used gas and diesel generators are built to world-class standards, for high efficiency and low fuel consumption. Contact us today for more information!

,\r\n\r\n },\r\n FR: {\r\n \"Name\": \"GROUPES ÉLECTROGÈNES STATIONNAIRES\",\r\n \"Meta\": \"Toromont Cat offre une large sélection de groupes électrogènes commerciaux et industriels. Nos groupes électrogènes au gaz et au diesel sont conçus pour fournir une performance et efficacité supérieures ainsi qu’une plus grande économie en carburant. Contactez-nous aujourd’hui pour obtenir plus d’information!\",\r\n \"Desc\": <>

Les groupes électrogènes alimentent une multitude de projets miniers, d’agriculture et de construction à travers le Canada. Ils sont aussi souvent utilisés pour alimenter des centres hospitaliers et des centres complexes de données d’entreprise. Toromont Cat offre une large sélection de groupes électrogènes usagés, qui livrent une puissance de 40 kW à 2 000 kW, pour des applications commerciales et industrielles. Nous garantissons que les groupes électrogènes usagés Caterpillar sont testés en charge et régulièrement entretenus afin d’être pouvoir utilisé immédiatement après leur achat. Si vous avez besoin d’un groupe électrogène d’occasion pour votre chantier ou votre entreprise, veuillez contacter Toromont Cat aujourd’hui pour obtenir plus d’information sur notre sélection de groupes électrogènes.

Groupes électrogènes actuellement en vente:

,\r\n \"ExtraText\": <>

Groupes électrogènes commerciaux et industriels usagés

Toromont Cat offre une large sélection de groupes électrogènes commerciaux et industriels. Nos groupes électrogènes au gaz et au diesel sont conçus pour fournir une performance et efficacité supérieures ainsi qu’une plus grande économie en carburant. Contactez-nous aujourd’hui pour obtenir plus d’information!

\r\n\r\n }\r\n },\r\n {\r\n \"CatCode\": \"inen\",\r\n \"CatCodeSlug\": \"inen\",\r\n EN: {\r\n \"Name\": \"Industrial Engines\",\r\n \"Meta\": \"Toromont Cat carries a wide selection of used commercial and industrial generators. Our used gas and diesel generators are built to world-class standards, for high efficiency and low fuel consumption. Contact us today for more information!\",\r\n \"Desc\": <>

Generators provide power for countless agricultural, construction and mining projects across Canada. They are also often required to power complex business data centers and hospitals. Toromont Cat carries a large selection of used generators for commercial and industrial applications that range in power from 40 kW to 2,000 kW. We guarantee that our Caterpillar used generators are load tested and regularly serviced to ensure that you can use your generator immediately after purchase. Whether you need a used generator for your job site or business, contact Toromont Cat today for more information about our used generator range.

Used Generators Currently for Sale:

,\r\n \"ExtraText\": <>

Used Commercial and Industrial Generators

Toromont Cat carries a wide selection of used commercial and industrial generators. Our used gas and diesel generators are built to world-class standards, for high efficiency and low fuel consumption. Contact us today for more information!

,\r\n\r\n },\r\n FR: {\r\n \"Name\": \"MOTEURS INDUSTRIELS\",\r\n \"Meta\": \"Toromont Cat offre une large sélection de groupes électrogènes commerciaux et industriels. Nos groupes électrogènes au gaz et au diesel sont conçus pour fournir une performance et efficacité supérieures ainsi qu’une plus grande économie en carburant. Contactez-nous aujourd’hui pour obtenir plus d’information!\",\r\n \"Desc\": <>

Les groupes électrogènes alimentent une multitude de projets miniers, d’agriculture et de construction à travers le Canada. Ils sont aussi souvent utilisés pour alimenter des centres hospitaliers et des centres complexes de données d’entreprise. Toromont Cat offre une large sélection de groupes électrogènes usagés, qui livrent une puissance de 40 kW à 2 000 kW, pour des applications commerciales et industrielles. Nous garantissons que les groupes électrogènes usagés Caterpillar sont testés en charge et régulièrement entretenus afin d’être pouvoir utilisé immédiatement après leur achat. Si vous avez besoin d’un groupe électrogène d’occasion pour votre chantier ou votre entreprise, veuillez contacter Toromont Cat aujourd’hui pour obtenir plus d’information sur notre sélection de groupes électrogènes.

Groupes électrogènes actuellement en vente:

,\r\n \"ExtraText\": <>

Groupes électrogènes commerciaux et industriels usagés

Toromont Cat offre une large sélection de groupes électrogènes commerciaux et industriels. Nos groupes électrogènes au gaz et au diesel sont conçus pour fournir une performance et efficacité supérieures ainsi qu’une plus grande économie en carburant. Contactez-nous aujourd’hui pour obtenir plus d’information!

\r\n\r\n }\r\n },\r\n {\r\n \"CatCode\": \"genm\",\r\n \"CatCodeSlug\": \"genm\",\r\n EN: {\r\n \"Name\": \"Mobile Generator Sets\",\r\n \"Meta\": \"Toromont Cat carries a wide selection of used commercial and industrial generators. Our used gas and diesel generators are built to world-class standards, for high efficiency and low fuel consumption. Contact us today for more information!\",\r\n \"Desc\": <>

Generators provide power for countless agricultural, construction and mining projects across Canada. They are also often required to power complex business data centers and hospitals. Toromont Cat carries a large selection of used generators for commercial and industrial applications that range in power from 40 kW to 2,000 kW. We guarantee that our Caterpillar used generators are load tested and regularly serviced to ensure that you can use your generator immediately after purchase. Whether you need a used generator for your job site or business, contact Toromont Cat today for more information about our used generator range.

Used Generators Currently for Sale:

,\r\n \"ExtraText\": <>

Used Commercial and Industrial Generators

Toromont Cat carries a wide selection of used commercial and industrial generators. Our used gas and diesel generators are built to world-class standards, for high efficiency and low fuel consumption. Contact us today for more information!

,\r\n\r\n },\r\n FR: {\r\n \"Name\": \"GROUPES ÉLECTROGÈNES MOBILES\",\r\n \"Meta\": \"Toromont Cat offre une large sélection de groupes électrogènes commerciaux et industriels. Nos groupes électrogènes au gaz et au diesel sont conçus pour fournir une performance et efficacité supérieures ainsi qu’une plus grande économie en carburant. Contactez-nous aujourd’hui pour obtenir plus d’information!\",\r\n \"Desc\": <>

Les groupes électrogènes alimentent une multitude de projets miniers, d’agriculture et de construction à travers le Canada. Ils sont aussi souvent utilisés pour alimenter des centres hospitaliers et des centres complexes de données d’entreprise. Toromont Cat offre une large sélection de groupes électrogènes usagés, qui livrent une puissance de 40 kW à 2 000 kW, pour des applications commerciales et industrielles. Nous garantissons que les groupes électrogènes usagés Caterpillar sont testés en charge et régulièrement entretenus afin d’être pouvoir utilisé immédiatement après leur achat. Si vous avez besoin d’un groupe électrogène d’occasion pour votre chantier ou votre entreprise, veuillez contacter Toromont Cat aujourd’hui pour obtenir plus d’information sur notre sélection de groupes électrogènes.

Groupes électrogènes actuellement en vente:

,\r\n \"ExtraText\": <>

Groupes électrogènes commerciaux et industriels usagés

Toromont Cat offre une large sélection de groupes électrogènes commerciaux et industriels. Nos groupes électrogènes au gaz et au diesel sont conçus pour fournir une performance et efficacité supérieures ainsi qu’une plus grande économie en carburant. Contactez-nous aujourd’hui pour obtenir plus d’information!

\r\n\r\n }\r\n },\r\n {\r\n \"CatCode\": \"genp\",\r\n \"CatCodeSlug\": \"genp\",\r\n EN: {\r\n \"Name\": \"Portable Generator Sets\",\r\n \"Meta\": \"Toromont Cat carries a wide selection of used commercial and industrial generators. Our used gas and diesel generators are built to world-class standards, for high efficiency and low fuel consumption. Contact us today for more information!\",\r\n \"Desc\": <>

Generators provide power for countless agricultural, construction and mining projects across Canada. They are also often required to power complex business data centers and hospitals. Toromont Cat carries a large selection of used generators for commercial and industrial applications that range in power from 40 kW to 2,000 kW. We guarantee that our Caterpillar used generators are load tested and regularly serviced to ensure that you can use your generator immediately after purchase. Whether you need a used generator for your job site or business, contact Toromont Cat today for more information about our used generator range.

Used Generators Currently for Sale:

,\r\n \"ExtraText\": <>

Used Commercial and Industrial Generators

Toromont Cat carries a wide selection of used commercial and industrial generators. Our used gas and diesel generators are built to world-class standards, for high efficiency and low fuel consumption. Contact us today for more information!

,\r\n\r\n },\r\n FR: {\r\n \"Name\": \"GROUPES ÉLECTROGÈNES PORTABLES\",\r\n \"Meta\": \"Toromont Cat offre une large sélection de groupes électrogènes commerciaux et industriels. Nos groupes électrogènes au gaz et au diesel sont conçus pour fournir une performance et efficacité supérieures ainsi qu’une plus grande économie en carburant. Contactez-nous aujourd’hui pour obtenir plus d’information!\",\r\n \"Desc\": <>

Les groupes électrogènes alimentent une multitude de projets miniers, d’agriculture et de construction à travers le Canada. Ils sont aussi souvent utilisés pour alimenter des centres hospitaliers et des centres complexes de données d’entreprise. Toromont Cat offre une large sélection de groupes électrogènes usagés, qui livrent une puissance de 40 kW à 2 000 kW, pour des applications commerciales et industrielles. Nous garantissons que les groupes électrogènes usagés Caterpillar sont testés en charge et régulièrement entretenus afin d’être pouvoir utilisé immédiatement après leur achat. Si vous avez besoin d’un groupe électrogène d’occasion pour votre chantier ou votre entreprise, veuillez contacter Toromont Cat aujourd’hui pour obtenir plus d’information sur notre sélection de groupes électrogènes.

Groupes électrogènes actuellement en vente:

,\r\n \"ExtraText\": <>

Groupes électrogènes commerciaux et industriels usagés

Toromont Cat offre une large sélection de groupes électrogènes commerciaux et industriels. Nos groupes électrogènes au gaz et au diesel sont conçus pour fournir une performance et efficacité supérieures ainsi qu’une plus grande économie en carburant. Contactez-nous aujourd’hui pour obtenir plus d’information!

\r\n\r\n }\r\n },\r\n {\r\n \"CatCode\": \"100a\",\r\n \"CatCodeSlug\": \"100a\",\r\n EN: {\r\n \"Name\": \"Systems / Components\",\r\n \"Meta\": \"Toromont Cat carries a wide selection of used commercial and industrial generators. Our used gas and diesel generators are built to world-class standards, for high efficiency and low fuel consumption. Contact us today for more information!\",\r\n \"Desc\": <>

Generators provide power for countless agricultural, construction and mining projects across Canada. They are also often required to power complex business data centers and hospitals. Toromont Cat carries a large selection of used generators for commercial and industrial applications that range in power from 40 kW to 2,000 kW. We guarantee that our Caterpillar used generators are load tested and regularly serviced to ensure that you can use your generator immediately after purchase. Whether you need a used generator for your job site or business, contact Toromont Cat today for more information about our used generator range.

Used Generators Currently for Sale:

,\r\n \"ExtraText\": <>

Used Commercial and Industrial Generators

Toromont Cat carries a wide selection of used commercial and industrial generators. Our used gas and diesel generators are built to world-class standards, for high efficiency and low fuel consumption. Contact us today for more information!

,\r\n\r\n },\r\n FR: {\r\n \"Name\": \"COMPOSANTS DE SYSTÈMES\",\r\n \"Meta\": \"Toromont Cat offre une large sélection de groupes électrogènes commerciaux et industriels. Nos groupes électrogènes au gaz et au diesel sont conçus pour fournir une performance et efficacité supérieures ainsi qu’une plus grande économie en carburant. Contactez-nous aujourd’hui pour obtenir plus d’information!\",\r\n \"Desc\": <>

Les groupes électrogènes alimentent une multitude de projets miniers, d’agriculture et de construction à travers le Canada. Ils sont aussi souvent utilisés pour alimenter des centres hospitaliers et des centres complexes de données d’entreprise. Toromont Cat offre une large sélection de groupes électrogènes usagés, qui livrent une puissance de 40 kW à 2 000 kW, pour des applications commerciales et industrielles. Nous garantissons que les groupes électrogènes usagés Caterpillar sont testés en charge et régulièrement entretenus afin d’être pouvoir utilisé immédiatement après leur achat. Si vous avez besoin d’un groupe électrogène d’occasion pour votre chantier ou votre entreprise, veuillez contacter Toromont Cat aujourd’hui pour obtenir plus d’information sur notre sélection de groupes électrogènes.

Groupes électrogènes actuellement en vente:

,\r\n \"ExtraText\": <>

Groupes électrogènes commerciaux et industriels usagés

Toromont Cat offre une large sélection de groupes électrogènes commerciaux et industriels. Nos groupes électrogènes au gaz et au diesel sont conçus pour fournir une performance et efficacité supérieures ainsi qu’une plus grande économie en carburant. Contactez-nous aujourd’hui pour obtenir plus d’information!

\r\n\r\n }\r\n\r\n },\r\n {\r\n CatCode: \"Favourites\",\r\n CatCodeSlug: \"favourites\",\r\n EN: {\r\n Name: \"Favourited Machinery\",\r\n Meta: \"At Toromont Cat, you will find the largest inventory of used Cat equipment in Eastern Canada. We offer increased value and top-notch performance in all types of environments.\",\r\n Desc: \"At Toromont Cat, you will find the largest inventory of used Cat equipment in Eastern Canada. From construction to paving and crushing to forestry, our powerhouse selection offers increased value and top-notch performance in all types of environments. Toromont Cat is your authorized Caterpillar Dealer in Manitoba, Ontario, Quebec, New Brunswick, Nova Scotia, P.E.I., Newfoundland and Labrador, and Nunavut.\",\r\n ExtraText: null\r\n },\r\n FR: {\r\n Name: \"Équipement favorisé\",\r\n Meta: \"Chez Toromont Cat, vous trouverez le plus grand inventaire d’équipement usagé Cat dans l’est du Canada. Que ce soit pour des applications de construction, de pavage, de concassage ou forestières, notre sélection d’équipement offre une valeur accrue et une performance inégalée dans tous les types d’environnements. Toromont Cat est votre concessionnaire Caterpillar autorisé au Manitoba, en Ontario, au Québec, au Nouveau-Brunswick, en Nouvelle-Écosse, à l’Île-du-Prince-Édouard, à Terre-Neuve et Labrador et au Nunavut.\",\r\n Desc: \"Chez Toromont Cat, vous trouverez le plus grand inventaire d’équipement usagé Cat dans l’est du Canada. Que ce soit pour des applications de construction, de pavage, de concassage ou forestières, notre sélection d’équipement offre une valeur accrue et une performance inégalée dans tous les types d’environnements. Toromont Cat est votre concessionnaire Caterpillar autorisé au Manitoba, en Ontario, au Québec, au Nouveau-Brunswick, en Nouvelle-Écosse, à l’Île-du-Prince-Édouard, à Terre-Neuve et Labrador et au Nunavut.\",\r\n ExtraText: null\r\n }\r\n },\r\n {\r\n CatCode: \"Favourites\",\r\n CatCodeSlug: \"favoris\",\r\n EN: {\r\n Name: \"Favourited Machinery\",\r\n Meta: \"At Toromont Cat, you will find the largest inventory of used Cat equipment in Eastern Canada. We offer increased value and top-notch performance in all types of environments.\",\r\n Desc: \"At Toromont Cat, you will find the largest inventory of used Cat equipment in Eastern Canada. From construction to paving and crushing to forestry, our powerhouse selection offers increased value and top-notch performance in all types of environments. Toromont Cat is your authorized Caterpillar Dealer in Manitoba, Ontario, Quebec, New Brunswick, Nova Scotia, P.E.I., Newfoundland and Labrador, and Nunavut.\",\r\n ExtraText: null\r\n },\r\n FR: {\r\n Name: \"Équipement favorisé\",\r\n Meta: \"Chez Toromont Cat, vous trouverez le plus grand inventaire d’équipement usagé Cat dans l’est du Canada. Que ce soit pour des applications de construction, de pavage, de concassage ou forestières, notre sélection d’équipement offre une valeur accrue et une performance inégalée dans tous les types d’environnements. Toromont Cat est votre concessionnaire Caterpillar autorisé au Manitoba, en Ontario, au Québec, au Nouveau-Brunswick, en Nouvelle-Écosse, à l’Île-du-Prince-Édouard, à Terre-Neuve et Labrador et au Nunavut.\",\r\n Desc: \"Chez Toromont Cat, vous trouverez le plus grand inventaire d’équipement usagé Cat dans l’est du Canada. Que ce soit pour des applications de construction, de pavage, de concassage ou forestières, notre sélection d’équipement offre une valeur accrue et une performance inégalée dans tous les types d’environnements. Toromont Cat est votre concessionnaire Caterpillar autorisé au Manitoba, en Ontario, au Québec, au Nouveau-Brunswick, en Nouvelle-Écosse, à l’Île-du-Prince-Édouard, à Terre-Neuve et Labrador et au Nunavut.\",\r\n ExtraText: null\r\n }\r\n },\r\n {\r\n CatCode: \"Deals\",\r\n CatCodeSlug: \"deals\",\r\n EN: {\r\n Name: \"FEATURED DEALS\",\r\n Meta: \"Every week, we showcase our best deals on used Cat equipment right here. These machines are proven reliable and priced to move – don’t miss your chance to get the equipment you need at unbeatable value.\",\r\n Desc: \"Every week, we showcase our best deals on used Cat equipment right here. These machines are proven reliable and priced to move – don’t miss your chance to get the equipment you need at unbeatable value.\",\r\n ExtraText: null\r\n },\r\n FR: {\r\n Name: \"AUBAINES EN VEDETTE\",\r\n Meta: \"Chaque semaine, nous présentons ici nos meilleures offres sur les équipements d'occasion Cat. Ces machines ont une fiabilité éprouvée et sont disponibles à des prix très abordables - ne manquez pas votre chance d'obtenir l'équipement dont vous avez besoin à un prix imbattable.\",\r\n Desc: \"Chaque semaine, nous présentons ici nos meilleures offres sur les équipements d'occasion Cat. Ces machines ont une fiabilité éprouvée et sont disponibles à des prix très abordables - ne manquez pas votre chance d'obtenir l'équipement dont vous avez besoin à un prix imbattable.\",\r\n ExtraText: null\r\n }\r\n },\r\n {\r\n CatCode: \"Consignment / Consignation\",\r\n CatCodeSlug: URLCONSIGNMENT,\r\n EN: {\r\n Name: \"Machine Consignment\",\r\n Meta: \"Our consignment program gives you an easy and reliable way to get fair market value for your used heavy equipment, with no risk and no rush.\",\r\n Desc: null,\r\n ExtraText: null\r\n },\r\n FR: {\r\n //TODO: get french meta desc\r\n Name: \"Programme de consignation d'équipement\",\r\n Meta: \"Chez Toromont Cat, vous trouverez le plus grand inventaire d’équipement usagé Cat dans l’est du Canada. Que ce soit pour des applications de construction, de pavage, de concassage ou forestières, notre sélection d’équipement offre une valeur accrue et une performance inégalée dans tous les types d’environnements. Toromont Cat est votre concessionnaire Caterpillar autorisé au Manitoba, en Ontario, au Québec, au Nouveau-Brunswick, en Nouvelle-Écosse, à l’Île-du-Prince-Édouard, à Terre-Neuve et Labrador et au Nunavut.\",\r\n Desc: null,\r\n ExtraText: null\r\n }\r\n },\r\n {\r\n CatCode: \"Cat Certified Used / Usagée Certifiée\",\r\n CatCodeSlug: URLCCU,\r\n EN: {\r\n Name: \"Cat Certified Used & CVA\",\r\n Meta: \"Before you put a Cat® Certified Used machine to work, we put it to the test. Cat Certified Used machines are well-maintained, fully inspected, and ready to work.\",\r\n Desc: null,\r\n ExtraText: null\r\n },\r\n FR: {\r\n //TODO: get french meta desc\r\n Name: \"Équipement d'occasion certifié Cat et EVC\",\r\n Meta: \"Chez Toromont Cat, vous trouverez le plus grand inventaire d’équipement usagé Cat dans l’est du Canada. Que ce soit pour des applications de construction, de pavage, de concassage ou forestières, notre sélection d’équipement offre une valeur accrue et une performance inégalée dans tous les types d’environnements. Toromont Cat est votre concessionnaire Caterpillar autorisé au Manitoba, en Ontario, au Québec, au Nouveau-Brunswick, en Nouvelle-Écosse, à l’Île-du-Prince-Édouard, à Terre-Neuve et Labrador et au Nunavut.\",\r\n Desc: null,\r\n ExtraText: null\r\n }\r\n }\r\n];\r\nexport default SEO_TCAT;\r\n","import * as Constants from \"../Constants\";\r\nimport * as Helpers from \"../HelperFunctions\";\r\nimport * as Types from \"../../common/Types\";\r\nimport { PageTypes } from \"../../../pages/common/Constants\";\r\nimport SEO_BFE from \"./SEOcontentBFE\";\r\nimport SEO_JOBSITE from \"./SEOcontentJOBSITE\";\r\nimport SEO_TCAT from \"./SEOcontentTCAT\";\r\nimport _ from \"lodash\";\r\n\r\nexport function slug(sourcetext: string | null) {\r\n let text = sourcetext;\r\n if (text !== null && text !== \"\") {\r\n text = _.deburr(text) + \"\";\r\n text = text.toLowerCase();\r\n text = text.split(\"'\").join(\"-\"); //apostrophe\r\n text = text.split(\".\").join(\"\"); //period\r\n text = text.split(\")\").join(\"\"); //r bracket\r\n text = text.split(\"(\").join(\"\"); //l bracket\r\n text = text.split(\" \").join(\"-\"); //spaces\r\n text = text.split(\"/\").join(\"-\"); //slash\r\n text = text.split(\"|\").join(\"-\"); //pipe\r\n text = text.split(\"---\").join(\"-\"); //3 dashes\r\n\r\n //text = text.replace(/\\)|\\(/g, '');//remove brackets\r\n // text = text.replace(/\\'|\\s+|\\/|\\|/g, '-');\t// '/| space : replace with hyphen\r\n // text = text.replace(/-+/g, '-');\t//3 dashes - plus counts multiple\r\n }\r\n return Helpers.ConverterString(text);\r\n}\r\n\r\nexport function getListingPageUrl(\r\n setLang: string,\r\n setCategory: string | null,\r\n includeExtraParams: boolean,\r\n filters?: Types.searchFilters,\r\n currentPage?\r\n) {\r\n let newUrl;\r\n currentPage = currentPage || 1;\r\n if (\r\n typeof setCategory === \"undefined\" ||\r\n setCategory === \"\" ||\r\n setCategory === null ||\r\n setCategory === \"undefined\"\r\n ) {\r\n //set to generic \"products\" or \"produits\"\r\n setCategory =\r\n setLang === \"fr\" ? Constants.ALLFAMSWORD_FR : Constants.ALLFAMSWORD_EN;\r\n }\r\n newUrl = \"/\" + setLang + \"/\" + slug(setCategory);\r\n if (includeExtraParams && filters && currentPage) {\r\n newUrl += getUrlParamsFromFilters(setLang, filters, currentPage);\r\n newUrl = newUrl.replace(\"&\", \"?\"); //replace first & with ? so its valid url\r\n }\r\n return newUrl;\r\n}\r\n\r\nexport function getDetailPageUrlFromSerial(\r\n setLang: string,\r\n setCategory: string | null,\r\n serialNumber: string,\r\n includeExtraParams: boolean,\r\n filters?: Types.searchFilters,\r\n currentPage?\r\n) {\r\n var productUrl;\r\n // logme(\"getDetailPageUrlFromSerial(\"+sernum+\",\"+setfamily+\",\"+includeExtraParams);\r\n\r\n if (setCategory === null || setCategory === \"\") {\r\n setCategory =\r\n setLang === \"fr\" ? Constants.ALLFAMSWORD_FR : Constants.ALLFAMSWORD_EN;\r\n }\r\n if (setLang === \"fr\") {\r\n // newUrl = \"/fr/\"+ALLFAMSWORD_FR;\r\n productUrl = \"/fr/\" + setCategory;\r\n } else {\r\n // newUrl = \"/en/\"+ALLFAMSWORD_EN;\r\n productUrl = \"/en/\" + setCategory;\r\n }\r\n\r\n productUrl += \"/\" + serialNumber;\r\n if (includeExtraParams && filters) {\r\n productUrl += getUrlParamsFromFilters(setLang, filters, currentPage);\r\n productUrl = productUrl.replace(\"&\", \"?\"); //replace first & with ? so its valid url\r\n }\r\n return productUrl;\r\n}\r\n\r\nexport function getNewUrlFromFilters(\r\n lang: string,\r\n filters: Types.searchFilters,\r\n currentPage: number\r\n) {\r\n console.log(\"getNewUrlFromFilters()\", lang, filters, currentPage);\r\n\r\n let newUrl = \"/\" + lang;\r\n\r\n if (\r\n filters.category !== null &&\r\n filters.category !== \"\" &&\r\n filters.category !== Constants.ALLFAMSWORD_EN &&\r\n filters.category !== Constants.ALLFAMSWORD_FR &&\r\n !filters.viewDeals &&\r\n !filters.viewFaves\r\n ) {\r\n //add category\r\n newUrl += \"/\" + filters.category;\r\n } else if (filters.viewDeals) {\r\n //add category\r\n newUrl += \"/deals\";\r\n } else if (filters.viewFaves) {\r\n var urlcategory = lang === \"fr\" ? \"favoris\" : \"favourites\";\r\n newUrl += \"/\" + urlcategory;\r\n } else {\r\n var products =\r\n lang === \"fr\" ? Constants.ALLFAMSWORD_FR : Constants.ALLFAMSWORD_EN;\r\n //adjust for power systems\r\n if (\r\n filters.categoryClass != null &&\r\n filters.categoryClass === Constants.CLASS_POWER\r\n ) {\r\n products = Constants.URLPOWER_SLUG;\r\n }\r\n\r\n newUrl += \"/\" + products;\r\n }\r\n\r\n newUrl += getUrlParamsFromFilters(lang, filters, currentPage);\r\n\r\n newUrl = newUrl.replace(\"&\", \"?\"); //replace first & with ? so its valid url\r\n\r\n return newUrl;\r\n}\r\n\r\nexport function numberClean(number) {\r\n //for text inputs, symbols cause issues\r\n let newNumber = number;\r\n newNumber = newNumber.split(\",\").join(\"\");\r\n newNumber = newNumber.split(\" \").join(\"\");\r\n newNumber = newNumber.split(\"$\").join(\"\");\r\n return newNumber;\r\n}\r\n\r\nfunction getUrlParamsFromFilters(\r\n lang: string,\r\n filters: Types.searchFilters,\r\n currentPage: number\r\n) {\r\n let allparams = \"\";\r\n if (filters.keyword) {\r\n allparams += \"&keyword=\" + encodeURI(filters.keyword);\r\n }\r\n if (filters.make) {\r\n allparams += \"&make=\" + filters.make;\r\n }\r\n if (filters.maxPrice) {\r\n allparams += \"&max=\" + filters.maxPrice;\r\n }\r\n if (filters.hoursMax) {\r\n allparams += \"&hrs=\" + filters.hoursMax;\r\n }\r\n if (filters.yearMin && filters.yearMin) {\r\n allparams += \"&yrmin=\" + filters.yearMin;\r\n }\r\n if (filters.yearMax) {\r\n allparams += \"&yrmax=\" + filters.yearMax;\r\n }\r\n if (filters.province) {\r\n allparams += \"&province=\" + filters.province;\r\n }\r\n if (\r\n filters.categoryClass &&\r\n filters.categoryClass === Constants.CLASS_POWER &&\r\n filters.category !== Constants.URLPOWER_SLUG\r\n ) {\r\n allparams +=\r\n \"&class=\" +\r\n (lang === \"fr\" ? Constants.URLPOWER_FR : Constants.URLPOWER_EN);\r\n }\r\n if (filters.city && Helpers.badCityCheck(filters.city) !== \"N/A\") {\r\n allparams += \"&city=\" + Helpers.saferString(filters.city);\r\n }\r\n if (filters.certifiedOnly) {\r\n allparams += \"&certified=1\";\r\n }\r\n if (filters.battlefieldInventory) {\r\n allparams += \"&bfeinv=1\";\r\n }\r\n if (filters.rentalFleetAvailability) {\r\n allparams += \"&available=1\";\r\n }\r\n if (filters.rentalFleetWithImages) {\r\n allparams += \"&images=1\";\r\n }\r\n if (filters.sortBy && filters.sortBy !== Constants.SORT.YEAR_HI) {\r\n //ignore year desc because its the default\r\n allparams += \"&sort=\" + filters.sortBy;\r\n }\r\n\r\n if (currentPage > 1) {\r\n allparams += \"&page=\" + currentPage;\r\n }\r\n /*if (imagesOnlyChecked){\r\n allparams += \"&images=1\";\r\n }*/\r\n return allparams;\r\n}\r\n\r\nexport function getAllUrlParams(): string[] {\r\n //gets URL parameters but only for values after the ?\r\n const get_params = function (search_string) {\r\n const parse = function (params, pairs) {\r\n const pair = pairs[0];\r\n const parts = pair.split(\"=\");\r\n const key = decodeURIComponent(parts[0]);\r\n const value = decodeURIComponent(parts.slice(1).join(\"=\"));\r\n params[key] = value;\r\n return pairs.length === 1 ? params : parse(params, pairs.slice(1));\r\n };\r\n\r\n // Get rid of leading ?\r\n return search_string.length === 0\r\n ? {}\r\n : parse({}, search_string.substr(1).split(\"&\"));\r\n };\r\n let params;\r\n if (typeof window.location != \"undefined\") {\r\n params = get_params(window.location.search);\r\n if (params) {\r\n return params;\r\n }\r\n }\r\n return [];\r\n}\r\n\r\nexport function getMetaTitle(\r\n info: string,\r\n lang: string,\r\n filters?: Types.searchFilters,\r\n includeSiteName?: boolean\r\n) {\r\n let companyName = Constants.isEnvironmentBFE_or_BFERENTAL\r\n ? \"Battlefield Equipment Rentals\" : Constants.isEnvironmentJOBSITE ? \"Jobsite Industrial Rental Services\"\r\n : \"Toromont Cat\";\r\n\r\n if (lang === \"fr\" && Constants.isEnvironmentBFE_or_BFERENTAL) {\r\n companyName = \"Location d’équipement Battlefield\";\r\n } else if (lang === \"fr\" && Constants.isEnvironmentJOBSITE) {\r\n companyName = \"Location d'outils industriels Jobsite\"\r\n }\r\n\r\n let newMetaTitle;\r\n if (info === \"default\") {\r\n if (\r\n (filters && filters.categoryClass === Constants.CLASS_POWER) ||\r\n (filters && filters.category === \"power-systems-production-d-energie\")\r\n ) {\r\n newMetaTitle =\r\n lang === \"fr\"\r\n ? \"Groupes électrogènes usagés | \" + companyName\r\n : \"Used Generators | \" + companyName;\r\n } else if (Constants.isEnvironmentBFERENTAL) {\r\n newMetaTitle =\r\n lang === \"fr\"\r\n ? \"Vente de flotte de location | \" + companyName\r\n : \"Rental Fleet Sell-Off | \" + companyName;\r\n } else {\r\n newMetaTitle =\r\n lang === \"fr\"\r\n ? \"Outils & Équipements d'Occasion | \" + companyName\r\n : \"Used Tools & Equipment | \" + companyName;\r\n }\r\n } else {\r\n info = lang === \"fr\" ? info : \"Used \" + info;\r\n if (\r\n (filters && filters.categoryClass === Constants.CLASS_POWER) ||\r\n (filters && filters.category === \"power-systems-production-d-energie\")\r\n ) {\r\n newMetaTitle =\r\n lang === \"fr\"\r\n ? \"Groupes électrogènes usagés - \" + info + \" | \" + companyName\r\n : \"Used Generators | \" + companyName;\r\n } else {\r\n let siteNamePrepend = lang === \"fr\" ? \"Équipement lourd usagé - \" : \"Used Heavy Equipment - \";\r\n siteNamePrepend = includeSiteName ? siteNamePrepend : \"\"; //remove if disabled\r\n\r\n newMetaTitle = siteNamePrepend + info + \" | \" + companyName;\r\n }\r\n }\r\n if (filters && filters.keyword && filters.keyword !== \"\") {\r\n newMetaTitle = filters.keyword + \" | \" + newMetaTitle;\r\n }\r\n return newMetaTitle;\r\n}\r\nexport function handleChangeLanguage(\r\n newLang,\r\n pgType,\r\n location_pathname,\r\n location_search\r\n) {\r\n console.log(\"handleChangeLanguage\", newLang);\r\n\r\n if (newLang) {\r\n //dont change state but change url\r\n const updatedUrl = getPathLanguageChanged(\r\n newLang,\r\n pgType,\r\n location_pathname,\r\n location_search\r\n );\r\n document.location.href = updatedUrl; //using instead of history.push for a hard page load on language change\r\n }\r\n}\r\nexport function getPathLanguageChanged(newLanguage, curPageType, path, params) {\r\n var newPath = path;\r\n\r\n if (curPageType === PageTypes.Home) {\r\n newPath = \"/\" + newLanguage;\r\n } else {\r\n newPath = newPath.replace(\"/en/\", \"/\" + newLanguage + \"/\"); //find lang param and replace\r\n newPath = newPath.replace(\"/fr/\", \"/\" + newLanguage + \"/\"); //find lang param and replace\r\n newPath = newPath + params;\r\n }\r\n return newPath;\r\n}\r\n\r\nexport const getSeoContentByCatCode = (\r\n catcode?: string | null\r\n): Types.types_seoData => {\r\n if (catcode == null) {\r\n catcode = \"products\";\r\n }\r\n\r\n const SEO = Constants.isEnvironmentBFE_or_BFERENTAL ? SEO_BFE : Constants.isEnvironmentJOBSITE ? SEO_JOBSITE : SEO_TCAT;\r\n\r\n if (catcode) {\r\n let seoData = SEO.find((o) => o[\"CatCodeSlug\"] === catcode);\r\n if (seoData) {\r\n return seoData;\r\n }\r\n }\r\n\r\n return SEO[0];\r\n};\r\n\r\n// export const getCategoryCtaImage=(catCode:string)=>{\r\n// const img = switch(catCode){\r\n// case \"articulated-trucks-tombereaux-articules\"\r\n\r\n// }\r\n\r\n// }","import React from \"react\";\r\nimport { CLASS_POWER, HUBSPOTFORMIDS } from \"../Constants\";\r\nimport HubspotForm from 'react-hubspot-form';\r\n\r\ntype Props_ContactFormToromontCat_hubspot = {\r\n lang: string;\r\n submitBtnText: string;\r\n curCategory: string | null;\r\n categoryClass: string; \r\n modelName?: string;\r\n }\r\n\r\nclass ContactFormToromontCatHubspot extends React.PureComponent {\r\n\r\n getHubSpotFormId = () => { \r\n if (this.props.categoryClass === CLASS_POWER) {//power\r\n return (this.props.lang === \"fr\" ? HUBSPOTFORMIDS.CONTACTFORM.POWER.FR : HUBSPOTFORMIDS.CONTACTFORM.POWER.EN);\r\n } else {//heavy equipment\r\n return (this.props.lang === \"fr\" ? HUBSPOTFORMIDS.CONTACTFORM.HEAVY.FR : HUBSPOTFORMIDS.CONTACTFORM.HEAVY.EN);\r\n }\r\n }\r\n updateModelValue = () => {\r\n //update hidden model name, detail page only\r\n const hiddenInput_Model = document.querySelector('input[name=\"modelname\"]') as HTMLInputElement;\r\n if (hiddenInput_Model != null) {\r\n hiddenInput_Model.value = this.props.modelName || \"N/A\";\r\n }\r\n //update hidden URL value\r\n const hiddenInput_Url = document.querySelector('input[name=\"page_url\"]') as HTMLInputElement;\r\n if (hiddenInput_Url != null) {\r\n hiddenInput_Url.value = window.location.href || \"https://used.toromontcat.com\";\r\n }\r\n\r\n }\r\n\r\n render() {\r\n console.log(\"render ContactFormToromontCat\", this.getHubSpotFormId());\r\n return (\r\n console.log('Submit!')}\r\n onReady={(form) => this.updateModelValue()}\r\n //loading={
Loading...
}\r\n />\r\n )\r\n }\r\n\r\n\r\n};\r\n\r\nexport default ContactFormToromontCatHubspot;\r\n","import React from \"react\";\r\n\r\nexport default class FormSpree extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.submitForm = this.submitForm.bind(this);\r\n this.state = {\r\n status: \"\",\r\n };\r\n }\r\n\r\n render() {\r\n const { status } = this.state;\r\n return (\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 \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 \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n\r\n {status === \"SUCCESS\" ? (\r\n

\r\n Thanks for your submission! We will be in touch with you shortly.\r\n

\r\n ) : (\r\n \r\n )}\r\n {status === \"ERROR\" &&

Ooops! There was an error.

}\r\n \r\n
\r\n );\r\n }\r\n\r\n submitForm(ev) {\r\n ev.preventDefault();\r\n const form = ev.target;\r\n const data = new FormData(form);\r\n const xhr = new XMLHttpRequest();\r\n xhr.open(form.method, form.action);\r\n xhr.setRequestHeader(\"Accept\", \"application/json\");\r\n xhr.onreadystatechange = () => {\r\n if (xhr.readyState !== XMLHttpRequest.DONE) return;\r\n if (xhr.status === 200) {\r\n form.reset();\r\n this.setState({ status: \"SUCCESS\" });\r\n } else {\r\n this.setState({ status: \"ERROR\" });\r\n }\r\n };\r\n xhr.send(data);\r\n }\r\n}\r\n","import React from \"react\";\r\n\r\nexport default class FormSpreeFR extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.submitForm = this.submitForm.bind(this);\r\n this.state = {\r\n status: \"\",\r\n };\r\n }\r\n\r\n render() {\r\n const { status } = this.state;\r\n return (\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 \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 \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n\r\n {status === \"SUCCESS\" ? (\r\n

Merci pour votre soumission! Nous vous contacterons sous peu.

\r\n ) : (\r\n \r\n )}\r\n {status === \"ERROR\" &&

Ooops! There was an error.

}\r\n \r\n
\r\n );\r\n }\r\n\r\n submitForm(ev) {\r\n ev.preventDefault();\r\n const form = ev.target;\r\n const data = new FormData(form);\r\n const xhr = new XMLHttpRequest();\r\n xhr.open(form.method, form.action);\r\n xhr.setRequestHeader(\"Accept\", \"application/json\");\r\n xhr.onreadystatechange = () => {\r\n if (xhr.readyState !== XMLHttpRequest.DONE) return;\r\n if (xhr.status === 200) {\r\n form.reset();\r\n this.setState({ status: \"SUCCESS\" });\r\n } else {\r\n this.setState({ status: \"ERROR\" });\r\n }\r\n };\r\n xhr.send(data);\r\n }\r\n}\r\n","import React from \"react\";\r\nimport FormSpree from \"../Components/FormSpree_Battlefield\";\r\nimport FormSpreeFR from \"../Components/FormSpreeFR_Battlefield\";\r\n\r\nconst ContactFormBattlefield = (props: { lang: string }) => {\r\n return <>{props.lang === \"fr\" ? : };\r\n};\r\n\r\nContactFormBattlefield.whyDidYouRender = true;\r\nexport default ContactFormBattlefield;\r\n","import React from \"react\";\r\n\r\nexport default class FormSpree extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.submitForm = this.submitForm.bind(this);\r\n this.state = {\r\n status: \"\",\r\n };\r\n }\r\n\r\n render() {\r\n const { status } = this.state;\r\n return (\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 \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 \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n\r\n {status === \"SUCCESS\" ? (\r\n

\r\n Thanks for your submission! We will be in touch with you shortly.\r\n

\r\n ) : (\r\n \r\n )}\r\n {status === \"ERROR\" &&

Ooops! There was an error.

}\r\n \r\n
\r\n );\r\n }\r\n\r\n submitForm(ev) {\r\n ev.preventDefault();\r\n const form = ev.target;\r\n const data = new FormData(form);\r\n const xhr = new XMLHttpRequest();\r\n xhr.open(form.method, form.action);\r\n xhr.setRequestHeader(\"Accept\", \"application/json\");\r\n xhr.onreadystatechange = () => {\r\n if (xhr.readyState !== XMLHttpRequest.DONE) return;\r\n if (xhr.status === 200) {\r\n form.reset();\r\n this.setState({ status: \"SUCCESS\" });\r\n } else {\r\n this.setState({ status: \"ERROR\" });\r\n }\r\n };\r\n xhr.send(data);\r\n }\r\n}\r\n","import React from \"react\";\r\n\r\nexport default class FormSpreeFR extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.submitForm = this.submitForm.bind(this);\r\n this.state = {\r\n status: \"\",\r\n };\r\n }\r\n\r\n render() {\r\n const { status } = this.state;\r\n return (\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 \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 \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n\r\n {status === \"SUCCESS\" ? (\r\n

Merci pour votre soumission! Nous vous contacterons sous peu.

\r\n ) : (\r\n \r\n )}\r\n {status === \"ERROR\" &&

Ooops! There was an error.

}\r\n \r\n
\r\n );\r\n }\r\n\r\n submitForm(ev) {\r\n ev.preventDefault();\r\n const form = ev.target;\r\n const data = new FormData(form);\r\n const xhr = new XMLHttpRequest();\r\n xhr.open(form.method, form.action);\r\n xhr.setRequestHeader(\"Accept\", \"application/json\");\r\n xhr.onreadystatechange = () => {\r\n if (xhr.readyState !== XMLHttpRequest.DONE) return;\r\n if (xhr.status === 200) {\r\n form.reset();\r\n this.setState({ status: \"SUCCESS\" });\r\n } else {\r\n this.setState({ status: \"ERROR\" });\r\n }\r\n };\r\n xhr.send(data);\r\n }\r\n}\r\n","import React from \"react\";\r\nimport FormSpreeBFERental from \"../Components/FormSpree_BattlefieldRentalFleet\";\r\nimport FormSpreeFRBFERental from \"../Components/FormSpreeFR_BattlefieldRentalFleet\";\r\n\r\nconst ContactFormBattlefieldRentalFleet = (props: { lang: string }) => {\r\n return (\r\n <>\r\n {props.lang === \"fr\" ? : }\r\n \r\n );\r\n};\r\n\r\nContactFormBattlefieldRentalFleet.whyDidYouRender = true;\r\nexport default ContactFormBattlefieldRentalFleet;\r\n","import React from \"react\";\r\nimport { useForm, ValidationError } from \"@formspree/react\";\r\n\r\nfunction FormSpreeJobsite() {\r\n const [state, handleSubmit] = useForm(\"xvolzwdj\");\r\n if (state.succeeded) {\r\n return (\r\n

Thanks for your submission! We will be in touch with you shortly.

\r\n );\r\n }\r\n return (\r\n
\r\n \r\n {/* Put the cc emails in the value field below */}\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 \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 \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n Submit\r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nexport default FormSpreeJobsite;\r\n","import React from \"react\";\r\nimport { useForm, ValidationError } from \"@formspree/react\";\r\n\r\nfunction FormSpreeJobsiteFR() {\r\n const [state, handleSubmit] = useForm(\"mzbodjoj\");\r\n if (state.succeeded) {\r\n return

Merci pour votre soumission! Nous vous contacterons sous peu.

;\r\n }\r\n return (\r\n
\r\n \r\n {/* Put the cc emails in the value field below */}\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 \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 \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n Soumettre\r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nexport default FormSpreeJobsiteFR;\r\n","import React from \"react\";\r\nimport FormSpreeJobsite from \"../Components/FormSpree_Jobsite\";\r\nimport FormSpreeJobsiteFR from \"./FormSpreeFR_Jobsite\";\r\n\r\nconst ContactFormJobsite = (props: { lang: string }) => {\r\n return (\r\n <>{props.lang === \"fr\" ? : }\r\n );\r\n};\r\n\r\nContactFormJobsite.whyDidYouRender = true;\r\nexport default ContactFormJobsite;\r\n","import React from \"react\";\r\nimport { outputEnFr } from \"../HelperFunctions\";\r\nimport ContactFormToromontCatHubspot from \"../Components/ContactForm_TCAT_hubspot\";\r\nimport ContactFormBattlefield from \"../Components/ContactForm_Battlefield\";\r\nimport ContactFormBattlefieldRentalFleet from \"../Components/ContactForm_BattlefieldRentalFleet\";\r\nimport ContactFormJobsite from \"../Components/ContactForm_Jobsite\";\r\nimport * as Constants from \"../../common/Constants\";\r\n\r\nexport type Props_CTASection = {\r\n lang: string;\r\n curCategory: string | null;\r\n categoryClass: string;\r\n heading?: string;\r\n subheading?: string;\r\n submitBtnText?: string;\r\n viewDeals?: boolean;\r\n modelName?: string;\r\n ctaImage?: string;\r\n ctaImageAltText?: string;\r\n};\r\n\r\nconst CTASection = ({\r\n lang,\r\n curCategory,\r\n categoryClass,\r\n heading,\r\n subheading,\r\n submitBtnText,\r\n viewDeals,\r\n modelName,\r\n ctaImage,\r\n ctaImageAltText,\r\n}: Props_CTASection) => {\r\n const contactFormComponent = () => {\r\n if (Constants.isEnvironmentBFE) {\r\n return ;\r\n } else if (Constants.isEnvironmentBFERENTAL) {\r\n return ;\r\n } else if (Constants.isEnvironmentJOBSITE) {\r\n return ;\r\n } else {\r\n return (\r\n \r\n );\r\n }\r\n };\r\n\r\n const getHeading = () => {\r\n let headingText = outputEnFr(\"Find out more\", \"En savoir plus\", lang);\r\n if (viewDeals) {\r\n headingText = outputEnFr(\r\n \"CONNECT WITH AN EXPERT\",\r\n \"COMMUNIQUEZ AVEC UN EXPERT\",\r\n lang\r\n );\r\n }\r\n return heading || headingText;\r\n };\r\n\r\n const getSubHeading = () => {\r\n let subheadTxt = outputEnFr(\r\n \"For more information or to request a quote, please complete the form below.\",\r\n \"Pour plus d'informations ou pour demander une soumission, remplissez le formulaire.\",\r\n lang\r\n );\r\n if (viewDeals) {\r\n subheadTxt = outputEnFr(\r\n \"To learn more about any of our used machines, connect with us using the form below.\",\r\n \"Pour en savoir plus sur l'une de nos machines usagées, contactez-nous en utilisant le formulaire ci-dessous.\",\r\n lang\r\n );\r\n }\r\n\r\n return subheading || subheadTxt;\r\n };\r\n\r\n const getSubmitBtnTxt = () => {\r\n let submitBtnText = outputEnFr(\"Submit\", \"Soumettre\", lang);\r\n if (viewDeals) {\r\n submitBtnText = outputEnFr(\r\n \"CONNECT WITH AN EXPERT\",\r\n \"COMMUNIQUEZ AVEC UN EXPERT\",\r\n lang\r\n );\r\n }\r\n\r\n return submitBtnText || submitBtnText;\r\n };\r\n return (\r\n
\r\n
\r\n
\r\n

{getHeading()}

\r\n

{getSubHeading()}

\r\n
\r\n
\r\n {contactFormComponent()}\r\n
\r\n
\r\n
\r\n
\r\n {Constants.isEnvironmentTCAT && (\r\n
\r\n {\" \"}\r\n
\r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default CTASection;\r\n","import $ from \"jquery/dist/jquery.slim\";\r\n\r\n\r\n// ***************************************************\r\n// Shopping Cart functions\r\n\r\nconst shoppingCart = (function () {\r\n // Private methods and properties\r\n var cart = [];\r\n\r\n function Item(name, price, pic, serial, location, hours, count, linkurl) {\r\n this.name = name\r\n this.price = price\r\n this.pic = pic\r\n this.serial = serial\r\n this.location = location\r\n this.hours = hours\r\n this.count = count\r\n this.linkurl = linkurl\r\n }\r\n\r\n function saveCart() {\r\n try {\r\n localStorage.setItem(\"shoppingCart\", JSON.stringify(cart));\r\n } catch (e) { \r\n }\r\n\r\n }\r\n\r\n function loadCart() {\r\n\r\n try {\r\n cart = JSON.parse(localStorage.getItem(\"shoppingCart\"));\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n if (cart === null) {\r\n cart = []\r\n }\r\n }\r\n\r\n loadCart();\r\n\r\n\r\n\r\n // Public methods and properties\r\n var obj = {};\r\n\r\n obj.isItemInCart = function (yr, make, model, serial) {\r\n //console.log(\"Checking cart:\"+name+ \",\"+serial);\r\n var alreadyExist = false;\r\n const name = getCartDataAttribute(yr, make, model, serial);\r\n for (var i in cart) {\r\n\r\n if (name === cart[i].name && serial === cart[i].serial) {\r\n alreadyExist = true;\r\n }\r\n }\r\n //console.log(\"Found - \"+alreadyExist);\r\n return alreadyExist;\r\n }\r\n\r\n obj.addItemToCart = function (name, price, pic, serial, location, hours, count, linkurl) {\r\n for (var i in cart) {\r\n if (cart[i].name === name) {\r\n cart[i].count += count;\r\n saveCart();\r\n return;\r\n }\r\n }\r\n\r\n //gtag('event', 'Add to favorites', {'event_category': 'Engagement', 'event_label': name});//TODO: add GA\r\n\r\n //console.log(\"addItemToCart:\", name, price, pic, serial, location,hours, count,linkurl);\r\n\r\n var item = new Item(name, price, pic, serial, location, hours, count, linkurl);\r\n cart.push(item);\r\n saveCart();\r\n };\r\n\r\n obj.setCountForItem = function (name, count) {\r\n for (var i in cart) {\r\n if (cart[i].name === name) {\r\n cart[i].count = count;\r\n break;\r\n }\r\n }\r\n saveCart();\r\n };\r\n\r\n\r\n obj.removeItemFromCart = function (name) { // Removes one item\r\n for (var i in cart) {\r\n if (cart[i].name === name) { // \"3\" === 3 false\r\n cart[i].count--; // cart[i].count --\r\n if (cart[i].count === 0) {\r\n cart.splice(i, 1);\r\n }\r\n break;\r\n }\r\n }\r\n saveCart();\r\n };\r\n\r\n\r\n obj.removeItemFromCartAll = function (name) { // removes all item name\r\n for (var i in cart) {\r\n if (cart[i].name === name) {\r\n cart.splice(i, 1);\r\n break;\r\n }\r\n }\r\n saveCart();\r\n };\r\n\r\n\r\n obj.clearCart = function () {\r\n cart = [];\r\n saveCart();\r\n }\r\n\r\n\r\n obj.countCart = function () { // -> return total count\r\n var totalCount = 0;\r\n for (var i in cart) {\r\n totalCount += cart[i].count;\r\n }\r\n\r\n return totalCount;\r\n };\r\n\r\n obj.totalCart = function () { // -> return total cost\r\n var totalCost = 0;\r\n for (var i in cart) {\r\n totalCost += cart[i].price * cart[i].count;\r\n }\r\n return totalCost.toFixed(2);\r\n };\r\n\r\n obj.listCart = function () { // -> array of Items\r\n var cartCopy = [];\r\n for (var i in cart) {\r\n // console.log(i);\r\n var item = cart[i];\r\n var itemCopy = {};\r\n for (var p in item) {\r\n itemCopy[p] = item[p];\r\n }\r\n itemCopy.total = (item.price * item.count).toFixed(2);\r\n cartCopy.push(itemCopy);\r\n }\r\n return cartCopy;\r\n };\r\n\r\n // ----------------------------\r\n return obj;\r\n})();\r\n\r\n// ------------------------\r\n\r\n// function setCookie(cname, cvalue, exdays) {\r\n// var d = new Date();\r\n// d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));\r\n// var expires = \"expires=\" + d.toUTCString();\r\n// document.cookie = cname + \"=\" + cvalue + \";\" + expires + \";path=/\";\r\n\r\n// }\r\n\r\n\r\n\r\n\r\n\r\n$(document).on('click', '.add-to-cart', function (event) {\r\n\r\n event.preventDefault();\r\n var name = $(this).attr(\"data-name\");\r\n var pic = $(this).attr(\"data-pic\");\r\n var serial = $(this).attr(\"data-serial\");\r\n var location = $(this).attr(\"data-location\");\r\n var hours = $(this).attr(\"data-hours\");\r\n var price = $(this).attr(\"data-price\");\r\n var linkurl = $(this).attr(\"data-url\");\r\n var isInCart = false;\r\n\r\n isInCart = shoppingCart.isItemInCart(name, serial);\r\n //alert(isInCart);\r\n //console.log(\"CHECKING: \"+name+\" / \"+serial);\r\n\r\n if (!isInCart) {\r\n //console.log(\"ADDING TO CART\");\r\n shoppingCart.addItemToCart(name, price, pic, serial, location, hours, 1, linkurl);\r\n displayCart();\r\n $(this).removeClass(\"add-to-cart\");\r\n $(this).addClass(\"delete-item\");\r\n //$(this).html(\"Remove from Favourites \");\r\n\r\n\r\n } else {\r\n //console.log(\"ALREADY IN CART\");\r\n }\r\n\r\n $(\".shopping-cart\").addClass(\"favesUpdated\");\r\n});\r\n\r\n\r\n\r\n\r\nexport function displayCart() {\r\n $(function () {\r\n var cartArray = shoppingCart.listCart();\r\n console.log(\"displayCart()\", cartArray);\r\n var output = \"\";\r\n\r\n for (var i in cartArray) {\r\n\r\n var displayName = cartArray[i].name;\r\n if (displayName != null) {\r\n displayName = displayName.replace(/\\s/g, \" \");//remove nbsp\r\n displayName = displayName.split(\"S/N:\")[0];//remove serial\r\n } else {\r\n continue;\r\n }\r\n\r\n var itemprice = \"\";\r\n if (typeof cartArray[i].price != \"undefined\" && cartArray[i].price !== \"undefined\") {\r\n itemprice = cartArray[i].price;\r\n } \r\n\r\n output += \"
\"\r\n\r\n + \"
\"\r\n + \"
\"\r\n + \"

\" + displayName + \"

\"\r\n // +cartArray[i].serial\r\n // +cartArray[i].location\r\n // +cartArray[i].hours\r\n\r\n //+\" \"\r\n + \"

\" + itemprice + \"

\"\r\n //+\" = \"+cartArray[i].total\r\n //+\" \"\r\n // +\" \"\r\n + \"
\"\r\n + \"\" \r\n + \"\"\r\n + \"
\";\r\n }\r\n\r\n\r\n\r\n if (cartArray.length === 0) {\r\n $(\"#cartDropdownBtns\").hide();\r\n $(\"#cartEmptyMsg\").show();\r\n } else {\r\n $(\"#cartDropdownBtns\").show();\r\n $(\"#cartEmptyMsg\").hide();\r\n }\r\n\r\n $(\"#show-cart\").html(output);\r\n $(\"#count-cart\").html(shoppingCart.countCart());\r\n $(\".mobile-count\").html(shoppingCart.countCart());\r\n $(\"#count-cart-mobile\").html(shoppingCart.countCart());\r\n $(\"#total-cart\").html(shoppingCart.totalCart());\r\n \r\n\r\n });\r\n}\r\n\r\n\r\n\r\n//$(\".delete-item\").click(function(event){\r\n// $(\"#show-cart\").on(\"click\", \".delete-item\", function(event){\r\n$(document).on(\"click\", \".delete-item\", function (event) {\r\n \r\n var name = $(this).attr(\"data-name\");\r\n console.log(\"remove\",name);\r\n //console.log(\"Deleting \"+name);\r\n shoppingCart.removeItemFromCartAll(name);\r\n displayCart();\r\n //$(\".shopping-cart\").fadeIn(\"fast\");\r\n\r\n $(this).addClass(\"add-to-cart\");\r\n $(this).removeClass(\"delete-item\");\r\n //$(this).html(\"Favourite This Machine \");\r\n});\r\n\r\n\r\n\r\n\r\n$(\"#show-cart\").on(\"click\", \".subtract-item\", function (event) {\r\n var name = $(this).attr(\"data-name\");\r\n shoppingCart.removeItemFromCart(name);\r\n displayCart();\r\n});\r\n\r\n$(\"#show-cart\").on(\"click\", \".plus-item\", function (event) {\r\n var name = $(this).attr(\"data-name\");\r\n shoppingCart.addItemToCart(name, 0, 1);\r\n displayCart();\r\n});\r\n$(\"#show-cart\").on(\"change\", \".item-count\", function (event) {\r\n var name = $(this).attr(\"data-name\");\r\n var count = Number($(this).val());\r\n shoppingCart.setCountForItem(name, count);\r\n displayCart();\r\n});\r\n\r\n$(document).on(\"click\", \"#clear-cart\", function (event) {\r\n\r\n $(\".btn-addremove.delete-item\").each(function (i, obj) {\r\n $(this).addClass(\"add-to-cart\");\r\n $(this).removeClass(\"delete-item\");\r\n $(this).html(\"Favourite This Machine \");\r\n });\r\n $(\".delete-item\").addClass(\"add-to-cart\");\r\n $(\".delete-item\").removeClass(\"delete-item\");\r\n shoppingCart.clearCart();\r\n displayCart();\r\n});\r\n\r\n\r\n// function openCartInNav() {\r\n// $(\".shopping-cart\").fadeToggle(\"fast\");\r\n// } \r\n\r\nexport function getCartDataAttribute(yr, make, model, sn) {\r\n const dataName = yr + \"\\u00A0\" + make + \"\\u00A0\" + model + \"\\u00A0S/N:\" + sn;\r\n return dataName;\r\n}\r\n\r\n\r\n// //bookmark page html\r\n// function getCartPageHtml() {\r\n// var cartArray = shoppingCart.listCart();\r\n// //console.log(cartArray);\r\n// var output = \"\";\r\n\r\n// for (var i in cartArray) {\r\n\r\n// var displayName = cartArray[i].name;\r\n// displayName = displayName.replace(/\\s/g, \" \");//remove nbsp\r\n// displayName = displayName.split(\"S/N:\")[0];//remove serial\r\n\r\n// var displayPrice = cartArray[i].price;\r\n// if (Number(cartArray[i].price) > 0) {\r\n// displayPrice = \"$\" + displayPrice;\r\n// }\r\n\r\n\r\n// output += '

' + displayName + '

'\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// + '\t\t

Serial Number:

' + cartArray[i].serial + '

Hours:

' + cartArray[i].hours + '

Location:

' + cartArray[i].location + '

View details »

'\r\n\r\n// + '
'\r\n// + '
'\r\n// + '

 ' + displayPrice + '

'\r\n// + '
'\r\n// + '

Financing Options Available

'\r\n// + '

Inquire about our Warranty Options

'\r\n// + '

Premium Used

';\r\n// }\r\n\r\n\r\n// if (cartArray.length === 0) {\r\n// $(\"#bookmarkedhtml\").html(\"

You have not added any machines to your favourites list.

\");\r\n// } else {\r\n// $(\"#bookmarkedhtml\").html(output);\r\n// }\r\n// }\r\n\r\n\r\n\r\n\r\n// $(function () {\r\n// //initialize cart feature\r\n// displayCart();\r\n\r\n// });\r\nshoppingCart.whyDidYouRender = true;\r\nexport default shoppingCart;","module.exports = __webpack_public_path__ + \"static/media/home-attachments.458bff44.jpg\";","module.exports = __webpack_public_path__ + \"static/media/home-backhoe-loaders.9a623f36.jpg\";","module.exports = __webpack_public_path__ + \"static/media/home-compact-track-loader.b0d49a29.jpg\";","module.exports = __webpack_public_path__ + \"static/media/home-compactors.cd62bb93.jpg\";","module.exports = __webpack_public_path__ + \"static/media/home-excavators.2332648e.jpg\";","module.exports = __webpack_public_path__ + \"static/media/home-industrial-loaders.671485a7.jpg\";","module.exports = __webpack_public_path__ + \"static/media/home-skid-steer-loaders.babb0826.jpg\";","module.exports = __webpack_public_path__ + \"static/media/home-telehandlers.aed772c9.jpg\";","module.exports = __webpack_public_path__ + \"static/media/home-vtr.f75bed94.jpg\";","module.exports = __webpack_public_path__ + \"static/media/home-wheel-loaders.a2c547ce.jpg\";","module.exports = __webpack_public_path__ + \"static/media/air-compressors.806d5312.jpg\";","module.exports = __webpack_public_path__ + \"static/media/backhoe-loaders.951ffa5f.jpg\";","module.exports = __webpack_public_path__ + \"static/media/compact-track-loaders.da1eba26.jpg\";","module.exports = __webpack_public_path__ + \"static/media/compaction-equipment.f9b1a18b.jpg\";","module.exports = __webpack_public_path__ + \"static/media/concrete-buggy.ce077cb6.jpg\";","module.exports = __webpack_public_path__ + \"static/media/excavators.4d507157.jpg\";","module.exports = __webpack_public_path__ + \"static/media/generators.1c6c2b09.jpg\";","module.exports = __webpack_public_path__ + \"static/media/lawn-garden-equipment.0db0ef31.jpg\";","module.exports = __webpack_public_path__ + \"static/media/light-towers.bc89f45c.jpg\";","module.exports = __webpack_public_path__ + \"static/media/material-handling.e492c88c.jpg\";","module.exports = __webpack_public_path__ + \"static/media/message-arrow-boards.7e0ea531.jpg\";","module.exports = __webpack_public_path__ + \"static/media/misc-fr.46852ef8.jpg\";","module.exports = __webpack_public_path__ + \"static/media/misc.6bdb4bda.jpg\";","module.exports = __webpack_public_path__ + \"static/media/pumps.0b9afccd.jpg\";","module.exports = __webpack_public_path__ + \"static/media/scissor-lifts-booms.c360de44.jpg\";","module.exports = __webpack_public_path__ + \"static/media/skid-steer-loaders.1e360c04.jpg\";","module.exports = __webpack_public_path__ + \"static/media/trench-shoring.98545e3e.jpg\";","module.exports = __webpack_public_path__ + \"static/media/welders.82c88907.jpg\";","module.exports = __webpack_public_path__ + \"static/media/air-tools.d7a84b75.jpg\";","module.exports = __webpack_public_path__ + \"static/media/confined-space.a4118c43.jpg\";","module.exports = __webpack_public_path__ + \"static/media/electric-tools.68d4c847.jpg\";","module.exports = __webpack_public_path__ + \"static/media/hoisting-rigging.3ff9d3c6.jpg\";","module.exports = __webpack_public_path__ + \"static/media/jacks.5c512ee0.jpg\";","module.exports = __webpack_public_path__ + \"static/media/material-handling-machinery-moving.40ea9bd8.jpg\";","module.exports = __webpack_public_path__ + \"static/media/misc.74c0a562.jpg\";","module.exports = __webpack_public_path__ + \"static/media/pipe-bending.aa952ff8.jpg\";","module.exports = __webpack_public_path__ + \"static/media/pipe-fabrication.51364921.jpg\";","module.exports = __webpack_public_path__ + \"static/media/storage-boxes.4259d83c.jpg\";","module.exports = __webpack_public_path__ + \"static/media/torqueing-bolting.df072b0f.jpg\";","module.exports = __webpack_public_path__ + \"static/media/welding-power-distribution.0d5fb30a.jpg\";","module.exports = __webpack_public_path__ + \"static/media/wire-cable-handling.a30aa97b.jpg\";","if (process.env.NODE_ENV === 'development') {\r\n /*ENABLE ME FOR PERFORMANCE DEBUGGING - CHECKS FOR NEEDLESS RERENDERS*/ \r\n // const whyDidYouRender = require('@welldone-software/why-did-you-render');\r\n // whyDidYouRender(React, {\r\n // trackAllPureComponents: true,\r\n // });\r\n}","var map = {\n\t\"./1-warranty.png\": 198,\n\t\"./2-certification.png\": 199,\n\t\"./3-inventory.png\": 200,\n\t\"./4-parts.png\": 201,\n\t\"./Demande_Soumission.png\": 202,\n\t\"./Financing-offer-used-english.png\": 203,\n\t\"./Financing-offer-used-french.png\": 204,\n\t\"./Thumbs.db\": 205,\n\t\"./Undercarriage_2014_1012_edit.jpg\": 206,\n\t\"./abstractbg.jpg\": 207,\n\t\"./bfe-logo-fr.png\": 208,\n\t\"./bfe-logo.png\": 209,\n\t\"./bg-contactform.jpg\": 210,\n\t\"./categoryimagesbfe/home-attachments.jpg\": 93,\n\t\"./categoryimagesbfe/home-backhoe-loaders.jpg\": 94,\n\t\"./categoryimagesbfe/home-compact-track-loader.jpg\": 95,\n\t\"./categoryimagesbfe/home-compactors.jpg\": 96,\n\t\"./categoryimagesbfe/home-excavators.jpg\": 97,\n\t\"./categoryimagesbfe/home-industrial-loaders.jpg\": 98,\n\t\"./categoryimagesbfe/home-skid-steer-loaders.jpg\": 99,\n\t\"./categoryimagesbfe/home-telehandlers.jpg\": 100,\n\t\"./categoryimagesbfe/home-vtr.jpg\": 101,\n\t\"./categoryimagesbfe/home-wheel-loaders.jpg\": 102,\n\t\"./categoryimagesbferental/air-compressors.jpg\": 103,\n\t\"./categoryimagesbferental/backhoe-loaders.jpg\": 104,\n\t\"./categoryimagesbferental/compact-track-loaders.jpg\": 105,\n\t\"./categoryimagesbferental/compaction-equipment.jpg\": 106,\n\t\"./categoryimagesbferental/concrete-buggy.jpg\": 107,\n\t\"./categoryimagesbferental/excavators.jpg\": 108,\n\t\"./categoryimagesbferental/generators.jpg\": 109,\n\t\"./categoryimagesbferental/lawn-garden-equipment.jpg\": 110,\n\t\"./categoryimagesbferental/light-towers.jpg\": 111,\n\t\"./categoryimagesbferental/material-handling.jpg\": 112,\n\t\"./categoryimagesbferental/message-arrow-boards.jpg\": 113,\n\t\"./categoryimagesbferental/misc-fr.jpg\": 114,\n\t\"./categoryimagesbferental/misc.jpg\": 115,\n\t\"./categoryimagesbferental/pumps.jpg\": 116,\n\t\"./categoryimagesbferental/scissor-lifts-booms.jpg\": 117,\n\t\"./categoryimagesbferental/skid-steer-loaders.jpg\": 118,\n\t\"./categoryimagesbferental/trench-shoring.jpg\": 119,\n\t\"./categoryimagesbferental/welders.jpg\": 120,\n\t\"./categoryimagesjobsite/air-tools.jpg\": 121,\n\t\"./categoryimagesjobsite/confined-space.jpg\": 122,\n\t\"./categoryimagesjobsite/electric-tools.jpg\": 123,\n\t\"./categoryimagesjobsite/hoisting-rigging.jpg\": 124,\n\t\"./categoryimagesjobsite/jacks.jpg\": 125,\n\t\"./categoryimagesjobsite/material-handling-machinery-moving.jpg\": 126,\n\t\"./categoryimagesjobsite/misc.jpg\": 127,\n\t\"./categoryimagesjobsite/pipe-bending.jpg\": 128,\n\t\"./categoryimagesjobsite/pipe-fabrication.jpg\": 129,\n\t\"./categoryimagesjobsite/storage-boxes.jpg\": 130,\n\t\"./categoryimagesjobsite/torqueing-bolting.jpg\": 131,\n\t\"./categoryimagesjobsite/welding-power-distribution.jpg\": 132,\n\t\"./categoryimagesjobsite/wire-cable-handling.jpg\": 133,\n\t\"./categoryimagestcat/Used Cat Articulated Trucks - Toromont Cat.jpg\": 211,\n\t\"./categoryimagestcat/Used Cat Backhoe Loaders - Toromont Cat.jpg\": 212,\n\t\"./categoryimagestcat/Used Cat Compactors - Toromont Cat.jpg\": 213,\n\t\"./categoryimagestcat/Used Cat Dozers - Toromont Cat.jpg\": 214,\n\t\"./categoryimagestcat/Used Cat Excavators - Toromont Cat.jpg\": 215,\n\t\"./categoryimagestcat/Used Cat Forestry Machines - Toromont Cat.jpg\": 216,\n\t\"./categoryimagestcat/Used Cat Mining Equipment - Toromont Cat.jpg\": 217,\n\t\"./categoryimagestcat/Used Cat Motor Graders - Toromont Cat.jpg\": 218,\n\t\"./categoryimagestcat/Used Cat Off-Highway Trucks - Toromont Cat.jpg\": 219,\n\t\"./categoryimagestcat/Used Cat Paving Products - Toromont Cat.jpg\": 220,\n\t\"./categoryimagestcat/Used Cat Telehandlers - Toromont Cat.jpg\": 221,\n\t\"./categoryimagestcat/Used Cat Track Type Loaders - Toromont Cat.jpg\": 222,\n\t\"./categoryimagestcat/Used Cat Wheel Loaders - Toromont Cat.jpg\": 223,\n\t\"./ccu1.jpg\": 224,\n\t\"./ccu2.jpg\": 225,\n\t\"./ccu3.jpg\": 226,\n\t\"./consignmentimg.jpg\": 227,\n\t\"./cta-machines-pic.png\": 228,\n\t\"./dealspage/Banner_used_EN.jpg\": 229,\n\t\"./dealspage/Banner_used_FR.jpg\": 230,\n\t\"./debug.log\": 231,\n\t\"./excavatorbg-bw - Copy.jpg\": 232,\n\t\"./excavatorbg-bw.jpg\": 233,\n\t\"./excavatorbg2 - Copy.jpg\": 234,\n\t\"./excavatorbg2.jpg\": 235,\n\t\"./financing-dozer.jpg\": 236,\n\t\"./financing_dozer.jpg\": 237,\n\t\"./flag_ca.png\": 238,\n\t\"./flag_us.png\": 239,\n\t\"./image-coming-soon-bferental.jpg\": 240,\n\t\"./image-coming-soon.jpg\": 241,\n\t\"./ironclad-pre-owned-fr.png\": 242,\n\t\"./ironclad-pre-owned.png\": 243,\n\t\"./ironclad.png\": 244,\n\t\"./jobsite-logo.png\": 245,\n\t\"./loading-gears - Copy.gif\": 246,\n\t\"./loading-gears.gif\": 247,\n\t\"./logo.gif\": 248,\n\t\"./no_image.jpg\": 249,\n\t\"./no_image2.jpg\": 250,\n\t\"./unbeatablevalue.png\": 251,\n\t\"./unbeatablevalue500-old.png\": 252,\n\t\"./unbeatablevalue500.png\": 253,\n\t\"./unbeatablevalue600.png\": 254,\n\t\"./used-print-header - Copy.jpg\": 255,\n\t\"./used-print-header.jpg\": 256,\n\t\"./usedbackground.jpg\": 257,\n\t\"./usedmachineryformimage - Copy.jpg\": 258,\n\t\"./usedmachineryformimage.jpf\": 259,\n\t\"./usedmachineryformimage.jpg\": 260\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 197;","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABMCAYAAADUQBHfAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkQyMjk3MURCMDI2MzExRTZCRDgwRDMxODQ0REZDM0VDIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkQyMjk3MURDMDI2MzExRTZCRDgwRDMxODQ0REZDM0VDIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RDIyOTcxRDkwMjYzMTFFNkJEODBEMzE4NDRERkMzRUMiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RDIyOTcxREEwMjYzMTFFNkJEODBEMzE4NDRERkMzRUMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4Dsj95AAAPtklEQVR42txc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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABNCAYAAAAfHMJ6AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkVDMEFEQ0YzMDI2MzExRTZBNTdERDk1NTQzNTRFODRBIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkVDMEFEQ0Y0MDI2MzExRTZBNTdERDk1NTQzNTRFODRBIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RUMwQURDRjEwMjYzMTFFNkE1N0REOTU1NDM1NEU4NEEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RUMwQURDRjIwMjYzMTFFNkE1N0REOTU1NDM1NEU4NEEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5JYhjnAAAPOElEQVR42uxc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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABOCAYAAACZiLDUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjE5MTJGNzgxMTc4NzExRTY4Q0RDODRBODgzQTRCQkEwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjE5MTJGNzgyMTc4NzExRTY4Q0RDODRBODgzQTRCQkEwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MTkxMkY3N0YxNzg3MTFFNjhDREM4NEE4ODNBNEJCQTAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MTkxMkY3ODAxNzg3MTFFNjhDREM4NEE4ODNBNEJCQTAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6F9Jn9AAAIoUlEQVR42uxc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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABOCAYAAACZiLDUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjREMjVDNDdEMTc4NzExRTY5RUVEOThDRjBBRDFFQUEyIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjREMjVDNDdFMTc4NzExRTY5RUVEOThDRjBBRDFFQUEyIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NEQyNUM0N0IxNzg3MTFFNjlFRUQ5OENGMEFEMUVBQTIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NEQyNUM0N0MxNzg3MTFFNjlFRUQ5OENGMEFEMUVBQTIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5nWODWAAAMxElEQVR42uxc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\"","module.exports = __webpack_public_path__ + \"static/media/Demande_Soumission.5957b429.png\";","module.exports = __webpack_public_path__ + \"static/media/Financing-offer-used-english.98f6bd72.png\";","module.exports = __webpack_public_path__ + \"static/media/Financing-offer-used-french.aad0e1ad.png\";","module.exports = __webpack_public_path__ + \"static/media/Thumbs.24227c9c.db\";","module.exports = __webpack_public_path__ + \"static/media/Undercarriage_2014_1012_edit.5c55107e.jpg\";","module.exports = __webpack_public_path__ + \"static/media/abstractbg.9be1e2ba.jpg\";","module.exports = __webpack_public_path__ + \"static/media/bfe-logo-fr.96a6e9bb.png\";","module.exports = __webpack_public_path__ + \"static/media/bfe-logo.c1c1e79c.png\";","module.exports = __webpack_public_path__ + \"static/media/bg-contactform.015f5c0d.jpg\";","module.exports = __webpack_public_path__ + \"static/media/Used Cat Articulated Trucks - Toromont Cat.d04f9681.jpg\";","module.exports = __webpack_public_path__ + \"static/media/Used Cat Backhoe Loaders - Toromont Cat.ff36ac9b.jpg\";","module.exports = __webpack_public_path__ + \"static/media/Used Cat Compactors - Toromont Cat.1c1c0022.jpg\";","module.exports = __webpack_public_path__ + \"static/media/Used Cat Dozers - Toromont Cat.beb1b698.jpg\";","module.exports = __webpack_public_path__ + \"static/media/Used Cat Excavators - Toromont Cat.c29d83ff.jpg\";","module.exports = __webpack_public_path__ + \"static/media/Used Cat Forestry Machines - Toromont Cat.804e90b6.jpg\";","module.exports = __webpack_public_path__ + \"static/media/Used Cat Mining Equipment - Toromont Cat.89ec70ae.jpg\";","module.exports = __webpack_public_path__ + \"static/media/Used Cat Motor Graders - Toromont Cat.4bab9eee.jpg\";","module.exports = __webpack_public_path__ + \"static/media/Used Cat Off-Highway Trucks - Toromont Cat.51831a60.jpg\";","module.exports = __webpack_public_path__ + \"static/media/Used Cat Paving Products - Toromont Cat.4233bbf6.jpg\";","module.exports = __webpack_public_path__ + \"static/media/Used Cat Telehandlers - Toromont Cat.32b28e1b.jpg\";","module.exports = __webpack_public_path__ + \"static/media/Used Cat Track Type Loaders - Toromont Cat.cb8a6f12.jpg\";","module.exports = __webpack_public_path__ + \"static/media/Used Cat Wheel Loaders - Toromont Cat.12cb1781.jpg\";","module.exports = __webpack_public_path__ + \"static/media/ccu1.2e14bcc8.jpg\";","module.exports = __webpack_public_path__ + \"static/media/ccu2.a240dbb5.jpg\";","module.exports = __webpack_public_path__ + \"static/media/ccu3.6116450a.jpg\";","module.exports = __webpack_public_path__ + \"static/media/consignmentimg.11db1366.jpg\";","module.exports = __webpack_public_path__ + \"static/media/cta-machines-pic.8e048fdc.png\";","module.exports = __webpack_public_path__ + \"static/media/Banner_used_EN.1c912b48.jpg\";","module.exports = __webpack_public_path__ + \"static/media/Banner_used_FR.3f3f3613.jpg\";","module.exports = __webpack_public_path__ + \"static/media/debug.0df79069.log\";","module.exports = __webpack_public_path__ + \"static/media/excavatorbg-bw - Copy.7aea8db4.jpg\";","module.exports = __webpack_public_path__ + \"static/media/excavatorbg-bw.bbb6e9d2.jpg\";","module.exports = __webpack_public_path__ + \"static/media/excavatorbg2 - Copy.1b0edcaf.jpg\";","module.exports = __webpack_public_path__ + \"static/media/excavatorbg2.dc140559.jpg\";","module.exports = __webpack_public_path__ + \"static/media/financing-dozer.4a4af305.jpg\";","module.exports = __webpack_public_path__ + \"static/media/financing_dozer.4a4af305.jpg\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAAGXcA1uAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkU4OUVFN0IwRkY2MTFFM0E2MThEOUVGOURDNzI1QkQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkU4OUVFN0MwRkY2MTFFM0E2MThEOUVGOURDNzI1QkQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyRTg5RUU3OTBGRjYxMUUzQTYxOEQ5RUY5REM3MjVCRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyRTg5RUU3QTBGRjYxMUUzQTYxOEQ5RUY5REM3MjVCRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Plm8WhIAAAQGSURBVHjaYvz//z8DDLAwMjGx3L937zeIw8jAyCjwSVX1PYOUFANAADEiK2O67Oz3/8GDB/8vOPv+ZxJjZWMQdndnEGNhYwAIIBRlqABkWFLu/9+/f///HRgIpt8n5fxnAcm9OnmageftWwaG+HgGBiD9CcgHCCCcRjHhsICB5YyT73/huZOAVjGCBb6m5DF8//efgUlOQZ5BVlaWQWb1agYZGRkGOXkFhvf3HzAwfXn0mOH79+8M3+fMYfiurc3w/ekzhp///zGwfH72goH72zcGhkOHIEY5BzL8AjoIIABl5G6DIBSF4U9uzA1WtgzAAEzhAI7ACLbaKaUlexjHsDORAirsiYkiXB6KJ2is1MT+/875Hz8C8p/brylkg3G2WJ30OWe0Xn4UlbM5rTjZbbb0DRb7A51MZhkDQQBxDEkCrguOg0kzbqJrBOqBPD1yt5SQEtL3wfOepxsZPwwpJlP5gLTxAq5FycC2GdY1aA1R9LbTVRVGKcwlp5XyHwLQSsY6CQRRFD2suyQE4i/wBdpBaO0VC37BisaGio6eytpfkI7CjpLEAvgDEiM0BkWNYXdnZr3LrFpoS/EyefPmzX333Xv4LR2+ofRwdp6FMlIkQtXbmz8Pco4fV9f7DTUm4yjcLpc0Li+kYIlKvf7vr5+nJ8THNZiMa4GsiXt7x24V1vrodLDD4U+e183jk7eGlcbp5hWXJ70erNcgVKIIBgPo90k2LyT49Ye5R1IpnGkks1jAauXnmM99dLsY+T8x6TeCJH+WV0T86P4O2u1fpWczKJf39cTZokEIJt4JMMAYA6MRTKfQavkm3aUyZeyc1yELAnZibqsVT1AF12z6swgjPqZo+BKg3KpXTRiKwid/tkLqqM+QR6hT1w7iIri65TV8jW5FcBDcHLp2KzgXshkopRWk1dqA9uaaeH6SNBAXh069EE6Se8/5cv6+k7Nr6c8r4/8B0Chwn25uvz0q7x8FJhKAeVGDmj84y5C6u4cE9RMkDI36AfLX9ePDFTGMHYUvEGOpG7s9Fyzl3zmV/MlEZL9f2dLPAdd+QoVfvwSySbaZwqh91Ns7xguJkmiKy1P/akcRgO8DLJfyPBoBjMdy77oCsN4UAGqdsk1GEADkz49PBrAyAJsIdTgEmM2qnqxWAO223Hc6fI70ySQ1VgwpHPK5ANnLPX4BzgjOOgExwADzMJ8DBMHpwHuenMGzavOFoU05vHtsskNa8kDjhsZ2jQ2z8CAmgGYTYDqVi9Z2K7LRENnrFeOD2j33QOMw1eUQcdww+2YGYOYA+ep2RRKH0Mp5pHQmRv0kA1AIkJQ9cHBGvdoWs7DJAMjGi0XxU1CsVktkGFZofedYEiL2wMARUOe9IyAK9aI3ue2rAAAAAElFTkSuQmCC\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAAGXcA1uAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDg0OUU4QUIwRkY2MTFFM0I4MTU5MkZGQ0FBODc5RjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDg0OUU4QUMwRkY2MTFFM0I4MTU5MkZGQ0FBODc5RjMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowODQ5RThBOTBGRjYxMUUzQjgxNTkyRkZDQUE4NzlGMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowODQ5RThBQTBGRjYxMUUzQjgxNTkyRkZDQUE4NzlGMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PtGbNhoAAAN0SURBVHjaYvz//z8DAjAysqipTfx/X03tPxOQywNCwmfOMAAEECOyMhZ19X4gj5lhI8NUBhZGRj6G//8ZGcRPnGAACCBGVNMQgIWRiUnAzXXte6AVYIGtDNMZ/oAsBFop8IyD4z0Tks7fQAwQQDiNYmLAAYDO6gFqYQNzdgKd9hdIfwdJKCrKAZ0IkZBhUGAAGXxizx4Glnv33gDt5wBLfD+zhgFk589TpxgYb3Jw/OdHMvs/IyPDuZ8/GQACCKercAEmBhIBOKQy0ne8f//+L4b+5cvdIM4BuuL3798MZ4BRwwISOH36KVCQFRwRyOCHsTEsYsHB/fvCBYiGe/deM4DCCl3DN4b7EBuA+C9Q009YHF29cuU9Dw8PAysrK4abQc759+8fw48fPxhu3LjBABBAtA8l2mtgVFPr/g/Rx8wAS7UwAEpdIB+CghQUQrq3b7Oy3LnzgmHfvlwGZmYWFA1TplxmkF9+A8z++/cvOJQY+Ph4WECh/PPnHwYmpv/AEEZoeP/+O8NfDw8w+x80HsBJA8T99u0XUAMTiobXr78C88xreEr9jazh589fQCeh+uHr158Mf84chNgAjLjf374xMEhLQzRkZu4FxigThqd/yclBNABN/wULpa1Ax+uxsYGKAQZGHLEO0vAZKKf+86cgy7+NGxl+aGgwcHBwYPgDnv+BSfvPly8MDDo6DAAByimflgSCMA7/ojwoCUURdCgiKDuJePDmwZOYe/JqR6/1Nfomonc39FDIHrz5Ada1g2YEoqaY7qY7a+8sM1YYmUGnBob3MDAv75/nWXmX/nwz/l8CLoDN05PrYTZ7gVzuHun0GQqFBlKpY6hqA4pyhGKxiUTiEKXSA+LxAzdeOXd8weZ3RoOdkUYZIWB7vdDzeYQNw8+BIX7aGAxMGEYf/b6FarWNaHQflcoTIpE9aNojwuFdlMsthEI7bryE9tlE8tLSML8fo3rdBWFDPg+HFrrdMUxzgk5nebRv8wuqk7qbUhUskwFiMYgEDqFlEY8vxOnrj+I0GFz0KYeec0BssFpNsvyeoNcbiziij76PU/S+bBET7mIfhrx1o6rPgUDApZNLgxP6m8PbI12n6zrOk8lttwKmKJjwj0VJawuaWX5kBdy+EyHVeYs8Ph+aNG8upHUBxypJ5OeOaI1Nw/bYNncm3gDVCs0/DOCnhQAAAABJRU5ErkJggg==\"","module.exports = __webpack_public_path__ + \"static/media/image-coming-soon-bferental.a6095c35.jpg\";","module.exports = \"data:image/jpeg;base64,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVIAAAB5CAYAAABryamuAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjJBRkVCMEU5MDcyRjExRTY4MzBFQzVGMzY4RThBQjg2IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjJBRkVCMEVBMDcyRjExRTY4MzBFQzVGMzY4RThBQjg2Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MkFGRUIwRTcwNzJGMTFFNjgzMEVDNUYzNjhFOEFCODYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MkFGRUIwRTgwNzJGMTFFNjgzMEVDNUYzNjhFOEFCODYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6QMbxGAAAXMUlEQVR42uyd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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAckAAACQCAYAAABjyZD6AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Q0NFNDFERjkyMUI0MTFFNUJGQTg4NjUxRjc3QzU1MDUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Q0NFNDFERkEyMUI0MTFFNUJGQTg4NjUxRjc3QzU1MDUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDQ0U0MURGNzIxQjQxMUU1QkZBODg2NTFGNzdDNTUwNSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDQ0U0MURGODIxQjQxMUU1QkZBODg2NTFGNzdDNTUwNSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pji5zNwAAB5jSURBVHja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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAACJCAYAAAD9lhzgAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkVBRDgzRTVGMTVGQzExRTZCNkIwQTAwOEU3NDBDQkFCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkVBRDgzRTYwMTVGQzExRTZCNkIwQTAwOEU3NDBDQkFCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RUFEODNFNUQxNUZDMTFFNkI2QjBBMDA4RTc0MENCQUIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RUFEODNFNUUxNUZDMTFFNkI2QjBBMDA4RTc0MENCQUIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6Uux3eAAAKC0lEQVR42uydC3BU1RnHv7vZezcIVUYK4qSUQTBtOuVhCEpAooi0wOCD2mqVAAomDVWJojRTrCEJpaAiOFMMAxjej2oBqUxoi8ZGTMNDQVpwKC+hgYCQjEbBJtm9u7fft3vXWWIIyd1zNnsv33/mP2QS9uy53++ec77z2L2K6kmECCWjp6PHoJPQLmDFowLoavQ29AJvQ/2R8B+UCKDPoF9CuzletpIfPQOhLoSIFjiNSDNMWyqB2GmJHaaFW2hv/PcQWuXY2Fo+dEpCgttdhD+kczwc0VJd1EKP4Q+9OR6O0HEC6uOx0zHSXQzTUXLzPNNhYqAMlMVAWQyUZTErEljWxxBacarhsLZJXdEp6FtEFEbzUCOaAu7JCMCLT/qgTw+D0UShY6cUyFukwtYdrvYDOitLh+cn60xDoOYsd0PhMusdp+XbYcIYP8OUIIopxTamLbRjB4Ajmxuha2fuZmWopk6B5J954Ov6GLXQMUP9DFNmloSxpRjHrMtN7xvgqEvWkH6B2AHt3oUDLls3XB/DpEjjsw3SZTXGvFLkMF2Ve6FnaxU4cUYBnx6blnZTkoFdqMFAReskQsyZq8J7H8W+Yxo9JADFeT5I6iYX7FXT5Z6pUWBYltYuMEl/rXRBRrYGtTjHZKACVLDUDec+V9q1DqfOKTBvZQIDFaEt5fFxqW+VM9CodbEeoO6iEhd1qa7hLjdq6X4lbuoSkLzIxvNQh4mBMlAWA2UxUBYDZTFQBspioCwGymKgLAbKQFkMlMVAWQyUxUAZKIuBshgoi4GyGCgDZTFQFgNlMVAWA2WgLAbKYqAsBspioAyUxUBZDJTFQFkMlIGyGCiLgbIYKIuBMlAWA2UxUBYDZTFQBspioCwGymKgLAbKQFnydE0iA3WU+vYJMFAnaeoDfgbqFGXd74dHRskFaunphA2NDKctStQA5j/tg+xxfukxtgS06pzClFo9ZhqwtsgLKb2MmMTYUpdbtod76tboyQf9ULm8sc0wo4mxpRZKz+A8eFyBH/c2mFoz6trZgJJ8H4xKt5bRUmytPufU0qsM5Jg9RwWvj+E11U8HB2DfOq9lmBRTiq1hsa1Y7js/OuSCB36jwZcXGSKJnrX9cq4Oby/wWn7eNsWSYkqxbZdpy993uWDQJA/sPnh1j6k/6GlAZUkj5P5SB8VivrjzQCiWFNN2nYfSg8rv/JUGc1e6wR+4+mDS3HL3ykbod7O1Vkkx+8MKN9yVowVjGa0U1ZN4Dv/tJuLihg0IwOpC+U+Cb6vo6b7dRnqElnn9tQYsmanDfXdYXyg4jVOTiQUqVOwX1sOdp5LKRZX2AVYsNVODze8lOLpV3pGKic9ab1QwN2GMKFYCYZLKqYXeTixEX/SU+/wwP9cHHTs4p4W68T6dla3DjEwdXBY50PPAn12owoqtUm76YVStCvTroksu+UsC3PaoB/YfcUbCdFOSAe8v9ULeROswPz7sCsZEEszXvQ31FeGqPYF+Q/Q7HKlS4PbHNXh1g9vyvCoelDnaDx+uboRBP7KW9dG1L1jnDsbiaJWUZdM3TIbBpOibBAk9Ff0KWvg27MjbAlDygg+6d4k9Watd7rUdAV7L88FDI62PlWdrFZhcpELZh1J6qgb0s+jF2DqNptMW+kUxehD6gOh3fme3CwZiErDtn/bogtP7BmDvmsaoYJZiBzhwgiYLJjFKQ5DFYZiXm4ceRN+KXiS6BjV1Ctz/nAbTMSlo8MYOTudOBnjUVk7MMSK/m6xD2WIv9LzRWm9C15b7igrjZmhQWyeli/2jyeiT1i4sUFN+Cj0WXSu6NoveTIAhkz1w6ETstuGGp115/OtxgwFlxV7Iz9KDGa0VffKpAumPeWDxRimJT43JZJrJqM0rRaXofujtomtGOwqU8S3ZHJs5a1GODmoLe0s/H+GHvTi3HNrfeuJDEAfjNRFUCdpusii90kpRq1aUzMF3DloTXdOxwwKw7HkfdLlObsL07h4XTJmtBhOVyO6YFtUnjbU+VtJQkv17FUrl5Ac0OM1ELzDznEv/2FBvCWhYqegN6GTRtb7xuwasmOWDu9LkLgj79NB+7n/PKpDU1YCM1AB85xqxN4lAHUY/TFPYy9KOEigJk3l4Ff246NrTTsVzmToUZLfcPcaDaN8yf4k7OL+UpGXoZ9Bft1gPAUC/GXbMN+0s+koGpgRgbZEPen8vPlcjaHFg/AuqrFWwL9BZ6E2turGaAI2mRhvNQVr4OvDeQy5Im+iBNdvib5F/+dsJcKu8Jc0dZkw3WS0gmhYaFkX9t+gC82eh+sXdfijO88F1ndoX5BcXFPj1PHdwl0SCKCPLR79o/tz6rl9gl/utxRX0OnQv0Vf7/e5GcJ91SL/22UGnLa4Js1SoPi8l8fkUPR69y9JYLrDLbaqd6AFmFixUVZ8pMGKqBrNLYnsqQse2UrDUDXc/ocmCuc6M2S5RBYpsoZHKRC9GC+8oqZVSa6VWK1MnqhWYVKDCLjnnpS6gc7B1rdcSo9swltlCI7XWvPN2iy648t+04O2BjWXyEqY/bU8IHtiSBJNa4wCCKaNwWS00LFoSL0Tnybh5aHVn4XQfdBJ0KuLC/wCeelmF9X+TcrPQYDGXkkeEqYd/KbqFygYa1nD0GnSS6IL79DBgDXbBNHeNRnQUlQ5sUVcrQacp8cHg72j6B7t0uU31D3N+9Zbogo+dUiAjW4P5a90QsMCUkqx5q9wwPEeTBTM4X28Oph273OaUDaGlQ+HHx0YMCsDyfF9wXbg1osz10UIV3t8n5b7GDhxyEWSL57Xs2kIjtRQ9EL1fdMF0MoCORpZWXPmytpSHjlFKgkmL6alXgumUFhoWHfKZh35aRuHjR/shf4oOvZIuba3HTytQuMwdzGQlic5kzUSYrTqTYdekqCWNQq8CQaf3L7k4HBL73xyA5J4hqP856YIDxxRZJxA/Q0/EAL/Tlhc5ESiYMFeZcO0oOkXwGAa3pq0vdMIY2pzOo8eY3a/XRiDpmxDo7NU9VmA6bQy9nPpDaD04Jc5h0om7hxFkVEdendpCI/UvdBp6SRzDLDbreCDeKhavp55pDpeDHof+PI7qRUda74XQxw4a4jFw8X6MfQuEVpjK46Au75rDwdZ4DpgdPpdQjR4BoaOMeju8P301CG0u/AR9Jt6DZZfP+oV3KobS2kAM3/coejD6JWjmTCwDjV570LegV8fgvUogdA55n50CZMdP49Ju/yQIncP5SkL5deiHIHTu2HZf2mPnj1evN5OUnQLLrDDLfNOuQbH75+VPojPQs81x1qrCxyjvRFfZOSBO+AIEPQLGKQuvPxFxU/jtHgwnfQXYB2Z3+ec2vGaDmWRVOiUITvtON/pcyINmQnOhhf/3lZlYPYL+0kkBcOqX9NGU44cQ2mw+as4haYw9bM4pk2M09Ym5/i/AAF2EBJfqoljFAAAAAElFTkSuQmCC\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAA+CAYAAABuk1SaAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDYuMC1jMDA2IDc5LjE2NDc1MywgMjAyMS8wMi8xNS0xMTo1MjoxMyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIyLjMgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjcxNjc5RjYyQUU3RDExRUJCRTJFQjBGRTM5QzA4NjY3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjcxNjc5RjYzQUU3RDExRUJCRTJFQjBGRTM5QzA4NjY3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NzE2NzlGNjBBRTdEMTFFQkJFMkVCMEZFMzlDMDg2NjciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NzE2NzlGNjFBRTdEMTFFQkJFMkVCMEZFMzlDMDg2NjciLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5fA/kmAAANmUlEQVR42uxdC1xU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\"","module.exports = __webpack_public_path__ + \"static/media/loading-gears - Copy.12cdbd0e.gif\";","module.exports = __webpack_public_path__ + \"static/media/loading-gears.20e642eb.gif\";","module.exports = \"data:image/gif;base64,R0lGODlhjAAmAOYAAAAAAP///1RQQnBuZ2tRAo1rA5x3BH1fA6qCBbiNBtGhCMWXB+m0Ct2qCfS8C//FDPvCDfe/De64Dum1DtmoDtemDtKiDrySDduqELqQDrWMDqSADZFwDNGiEllFCIdqDoFlDlJOQVhCApt4EVZEDmpUE0g8GFRIJFJGJkQ/MUIwASYbAf39/fz8/Pv7+/r6+vj4+Ovr6+np6ePj4+Li4uDg4N3d3dDQ0M/Pz83NzczMzMnJycXFxcLCwr+/v7y8vLu7u7q6urS0tLGxsbCwsKurq6KioqGhoZycnJiYmJeXl5WVlZSUlJKSkpCQkI2NjYmJiYWFhYSEhH9/f35+fnd3d3R0dHNzc3BwcG9vb2VlZVxcXFpaWlhYWFZWVktLS0ZGRkVFRUREREBAQD4+PjQ0NDExMTAwMC4uLi0tLSoqKigoKCUlJSIiIiAgIBsbGxkZGRUVFRQUFA0NDQwMDAoKCgkJCQMDAwEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAjAAmAAAH/4ABgoOEhYaHiImKi4yNjo+QkZKTlJWWl4YPmpucnZ6foKGio6SlowCoqaqrrK2shKaxsrO0tZuuuLmtsLa9vr+xusK6vMDGx8bDyruDyM7PtMvSqcXQ1tee09PV2N3W2tLc3uPH4Mvi5Om9rHNpaXTmAHeo6Or2sqpxRSyCLEVyqaTUGFijDACCCGuAQXIFQD1RrBA8aCAC1QEHDxCoErFAk4MDqEQ00JSKwAMFqSR+DDnyAQFUBlyi0rgqWioghoKk0kHIisNDX6Y0fBgqIoMVGzOyYvCgYqoVTJ8qndlUFVSZAEy+BEBTlU0Acgbt+DEoDoA6LQgR+WloDLVms/8i0jQAEkADmgicJmhg0QBVr10R8AVwwC9XrACwdk311c2gMGYGoQFARhAOQTHwnDnjY9BmePTg2pQoc8XEmTQfOECNaiRSk6oa1OVK03VWxA22akpdK5VjQWPOeAZQRRAUGoLWoCIy6JXouIcfqLj9ACbvmQVQaXopojqA6QoITOeaPbHM7lu56p5qy/eg4MOZB+giX8vy5quIQoyOyqR3AqnRFJ52WP3H1QpbIbCebukVsB5vjb33hhMUvgGADIKwQYUgR9wniHOCtMcfdf0tBgB6BOoGE1cAGKZgitptRYAIDxIYIXCrtDHIEDkIYoOHAYAYgIik9UdSVibGtKD/djN9x6J6MCa2lV81mndjAG6pwoUgL2AhxCBwACBfkPk9h8+I/pU4U10DmqciV04tMNOSUqIiJ2Ps9YbKb1iqQZAaTAQgQwgZfPCEIF6IiZ8q+hUV3XRptpjaauTB2N2cqKBUqZsnYsWAV3leCZ8gZ+iQwwkUaLLBAC80oeiHZYaoJ2kvmTYYAtfR1toDr3mHgGGU4rprr7ohRSCE0AHA56gBmGFECRJwcoEAQLxKJqNmBhPdXHXdReBMgxX2l66JgdsXVbrNtpuNyfK5hRiY2cEBBJ5UgIK1QhKpyVFJ5SqRU6hcNZOclx4GMABX6dbVulYmawcMgrgA8QwpaBDKkQQeKLHoW7KOtglFFmHE23QHqFaXSEcigBJsh610Yku6aWoesmeiEgUhPJhgwSgRgJAErNh2fM/QNQOAhxY93LAECR2UgsEIWdyQL9FUmxLPMI1WXfXVwmStNdFcE5Pt12R7F7YrXpetztm4pK02OWyjPfbbVMfNjNB0a2331Hl/vXesmAQu+OCEF2744YgPHggAOw==\"","module.exports = \"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgFBgcGBQgHBgcJCAgJDBMMDAsLDBgREg4THBgdHRsYGxofIywlHyEqIRobJjQnKi4vMTIxHiU2OjYwOiwwMTD/2wBDAQgJCQwKDBcMDBcwIBsgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDD/wgARCAEsASwDAREAAhEBAxEB/8QAGgABAAMBAQEAAAAAAAAAAAAAAAIDBAEFB//EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAPtYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABjLikgbyswHoEzzzSXlZgOG0mYASPRAAAAAAAABgLzOUnqGQynpkjzC09A801lh55tMZ6QAAAAAAAAAMBeZwXmc4bik6Yz1TyD1iIIGA0GgtAAAAAAAABgLzOXmYkRNxiLTKekeYesYTOeiYjaTJgAAAAAAAAwF5nNp5RvMxtPPNhQWlJeXnlHpGI9AEwAAAAAAAAZS0qNBlNRmLSs1FZSXmEFxoMQOm8AAAAAAAAEDpEECw6CRE4dBIgcBI4QLgAAAAAAAAYC84DpoM5w4ASBYZyZwkcLC0AAAAAAAAFJWSOnS4zA4TIkiB0HCRE6TLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/xAA7EAACAQMBAwgJAgQHAAAAAAABAgMABBESITRBBRATFCJRcXIxMjNAUlNhgaEjQhVzkKIkNWJjkrHB/9oACAEBAAE/AP6Id7PJFKAjYBFWjtJAGc5JJq9nlilARsAgGre6laZQ75UnmuXMcDMNhxgV1yf5n4FQMWhVmOSRzT3colYI+FBqylaWNtZywOOaaVYULNTXM0pwrEZ4LXS3ERBZnBPBqtLgTqQwwwq5dkgZlOCK65P8z8CuuT/M/AqG6mMqBnyCQPc+UfbL5asN2Hia5R9sPKKlUoykcVBqNg6BhxANcovsVBxOalTQVHEqDVru8fgKlfRGzdwJqGMyJKx2lRXJz4mK/EOa/cvNp4KMVZRBIQcdphUqCSNlPEVaLIs6lUbAOCcVe7q9cn7x9vdeUfbL5asN2Hia5R9sPKKuk/w8D9wAqwfMGOKkip/1r3SO8LV/vH2FWu7x+ArlF9MIXixqwTEBJ/eaQmG48pxzTbZnP1pBhAO4CjLECQZEBH+qhLETgSIT5qvd1ereXoZNenOwj01/EP8Aa/uq2m6dC2nGD3+58o+2Xy1YbsPE1yj7YeUU6a7EDuQGrGURs+eI/wCqsFLTs524BNX+8Hwq13ePwFcoPqmwPQoqK8iSNV0vsAFXDrJMzqCAatn1wofpU4xM4+ppDqRSOIBqSyleRmDJgmkBWYA8GAq93V6s0WSbS4yME11SD4PyajjSJSEXAJ7yfc+UfbL5asN2Hia5R9sPKKg2wR+UVIpSRl7iRXJ6YhLcWNX+8Hwq2IFshPAUgM9zg57ZJrqEXxPV3bLCgZCxBNcmvlGQ8DV/GUm1gbGqxnVowjHDCppViQlj4DiajOZVJ7xV7ur1YsqT5ZgBjia6aL5if8qEsROBIhPm9zu7Z5pAyFQAtWsbRQhGIJBJq7tnmkDKVAAqJSkaqeAAq5tGllLoVAIFRoEjCjgAKubV5ZdSlQMAbTXROLXo1I1YxVpatFJqcqdnNcRmWFkGATg1aW0kMhLMpBHA1LGsqFXFSWUqnsYao7KVvXwoqS0JkQx4CqAKuEMkLIuATiuoSfEldQk+JKSylVwSyYBB9zSVHdkVssuw1rXpNGe1jNSzRxY1uBSTRsrMjggDJxwrrkHx/wBpqKVJVJjbIBx6Kd1jQs5wBRkUR6y3YxnNKQy5U5BFI6uGKHIBIqKVJQSjZAOK1r0gTPbIzikdXLBDkqcH6cySo7MqNkqcGpZ44cCRsZ+lRTxSkhHBIpXV2ZVOSuM1LKkSgyNgE49FJcwuwVHyT7moKGWZBkpKwP1WlIa9BU5Biz+atAGeWRhltZWpQEvIigwXyDjjVxvNv4tzT4knSH0gdtqtQNEtu/7CR9jUEpjtHDetFlaIMFkEX13wPuajXq9yEHqyKB9xR/zAfy//AE1Z+tP/ADDU8nRQs/EDZSIbeSFuDjQ/jVy+i6gbSzYDbAKRxLeKdJjKg7GGC1W+83HitXp09CcE4kBqOfWwXopVzxK+528bL0oYbGcnxFW8Dx3LEjMYUhTmtEsMjtEodHOdJOCDSRu8wlmAGkEKoOcVMjPPCyjIQnPMlsJGd517ROwZ9A+1LB0Vwrwr2CCHGakgdrnKj9NiC23iKlhM041r+mo78ZNS2ihdUC4kUgjtVoc3QkK4Xo8VGJ4Xl0w6wzk51gVIkk5QSJpUElhqqWzjMbBFw2Mg6qdZi8EgjyyA6hqoJLLOjugjCfXOaAmjnlZItYcj92KmE0io3RYZHB06qSSZmAaDSDx15x/Qe//EABQRAQAAAAAAAAAAAAAAAAAAAKD/2gAIAQIBAT8ANJ//xAAUEQEAAAAAAAAAAAAAAAAAAACg/9oACAEDAQE/ADSf/9k=\"","module.exports = __webpack_public_path__ + \"static/media/no_image2.80a2b4b3.jpg\";","module.exports = __webpack_public_path__ + \"static/media/unbeatablevalue.69d505a8.png\";","module.exports = __webpack_public_path__ + \"static/media/unbeatablevalue500-old.5eb53370.png\";","module.exports = __webpack_public_path__ + \"static/media/unbeatablevalue500.e64a60e1.png\";","module.exports = __webpack_public_path__ + \"static/media/unbeatablevalue600.709f1467.png\";","module.exports = __webpack_public_path__ + \"static/media/used-print-header - Copy.668e79fc.jpg\";","module.exports = __webpack_public_path__ + \"static/media/used-print-header.07903b61.jpg\";","module.exports = __webpack_public_path__ + \"static/media/usedbackground.8966f900.jpg\";","module.exports = __webpack_public_path__ + \"static/media/usedmachineryformimage - Copy.65ed4d34.jpg\";","module.exports = __webpack_public_path__ + \"static/media/usedmachineryformimage.bf954357.jpf\";","module.exports = __webpack_public_path__ + \"static/media/usedmachineryformimage.e5c54ca8.jpg\";","import React from \"react\";\r\nimport { outputEnFr, getPhoneNumber } from \"../HelperFunctions\"; \r\n\r\ntype Props_NavPhoneNum = {\r\n lang: string,\r\n currentCatClass: string\r\n}\r\nconst NavPhoneNum_Tcat = (props: Props_NavPhoneNum) => {\r\n return (\r\n

\r\n  {\" \"}\r\n \r\n {outputEnFr(\r\n \"Have questions?\",\r\n \"Vous avez des questions?\",\r\n props.lang\r\n )}\r\n {\" \"}\r\n \r\n {getPhoneNumber(props.currentCatClass)}\r\n \r\n

\r\n )\r\n}\r\nexport default NavPhoneNum_Tcat;","import React from \"react\";\r\nimport { getPathLanguageChanged } from \"../../SEO/SeoFunctions\";\r\nimport { withRouter } from \"react-router-dom\";\r\n\r\ntype props_LanguageSwitcher = {\r\n lang: string;\r\n pageType: number;\r\n history?; //from withRouter\r\n};\r\n\r\nconst LanguageSwitcher = ({\r\n lang,\r\n pageType,\r\n history,\r\n}: props_LanguageSwitcher) => {\r\n return (\r\n
\r\n  {\" \"}\r\n \r\n EN\r\n \r\n {\" / \"}\r\n \r\n FR\r\n \r\n
\r\n );\r\n};\r\n\r\nexport default withRouter(LanguageSwitcher);\r\n","/* eslint-disable react/jsx-pascal-case */\r\nimport React from \"react\";\r\nimport NavPhoneNum_Tcat from \"../Components/NavPhoneNum_Tcat\";\r\nimport LanguageSwitcher from \"./Components/LanguageSwitcher\";\r\nimport {\r\n IMAGES,\r\n isEnvironmentBFE_or_BFERENTAL,\r\n isEnvironmentTCAT,\r\n} from \"../Constants\";\r\n\r\ntype props_PreNav = {\r\n lang;\r\n pageType: number;\r\n currentCatClass: string;\r\n};\r\n\r\nconst PreNav = ({ lang, pageType, currentCatClass }: props_PreNav) => {\r\n return (\r\n
\r\n {isEnvironmentBFE_or_BFERENTAL ? (\r\n \r\n ) : (\r\n \"Toromont\r\n )}\r\n\r\n
\r\n
\r\n
\r\n
 
\r\n
\r\n {isEnvironmentTCAT ? (\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\nexport default PreNav;\r\n","import React, { useRef, useEffect } from \"react\";\r\nimport { type_linkList } from \"../../Types\";\r\nimport { Link } from \"react-router-dom\";\r\nimport { PageTypes } from \"../../Constants\";\r\n\r\ntype Props_NavDropdown = {\r\n id: number;\r\n isOpen: boolean;\r\n linkName: string;\r\n fallbackUrl: string;\r\n pageType: number;\r\n paramCategory: string;\r\n dropdownList: type_linkList[] | null;\r\n handleToggleDropdown;\r\n handleClickOutsideDropdown;\r\n};\r\n\r\nconst NavDropdown = (props: Props_NavDropdown) => {\r\n function useOutsideDetection(ref) {\r\n useEffect(() => {\r\n function handleClickOutside(event) {\r\n if (ref.current && !ref.current.contains(event.target)) {\r\n //function that updates state passed from parent\r\n props.handleClickOutsideDropdown(props.id);\r\n }\r\n }\r\n // Bind the event listener\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => {\r\n // Unbind the event listener on clean up\r\n document.removeEventListener(\"mousedown\", handleClickOutside);\r\n };\r\n }, [ref]);\r\n }\r\n const wrapperRef = useRef(null);\r\n useOutsideDetection(wrapperRef);\r\n\r\n const topLinkIsCurrent = () => {\r\n return (\r\n (props.dropdownList &&\r\n props.dropdownList.find(function (o) {\r\n return o.groupCodeSlug === props.paramCategory;\r\n })) ||\r\n (props.fallbackUrl.includes(\"/\" + props.paramCategory) &&\r\n props.pageType !== PageTypes.Details)\r\n );\r\n };\r\n\r\n const getDropdownClass = () => {\r\n return topLinkIsCurrent() ? \"dropdown hasCurrent\" : \"dropdown\";\r\n };\r\n\r\n return props.dropdownList ? (\r\n
  • \r\n \r\n
      \r\n {props.dropdownList ? (\r\n props.dropdownList.map((link, i) => {\r\n return (\r\n \r\n props.handleToggleDropdown(props.id)}\r\n to={link.linkUrl}\r\n >\r\n {link.linkText}\r\n \r\n \r\n );\r\n })\r\n ) : (\r\n <>\r\n )}\r\n
    \r\n
  • \r\n ) : (\r\n
  • \r\n {props.linkName}\r\n
  • \r\n );\r\n};\r\nNavDropdown.whyDidYouRender = true;\r\nexport default NavDropdown;\r\n","import React from \"react\";\r\nimport { outputEnFr, getCategoryLinks } from \"../../HelperFunctions\";\r\nimport NavDropdown from \"../Components/NavDropdown\";\r\nimport { dropdownIDs } from \"../NavigationHeader\";\r\nimport { Link } from \"react-router-dom\";\r\nimport { PageTypes, URLCCU, URLCONSIGNMENT } from \"../../Constants\";\r\n\r\ntype Props_NavItems = {\r\n lang: string,\r\n jsonDataGroups,\r\n dropdownOpenState,\r\n pageType: number,\r\n paramCategory: string,\r\n handleToggleDropdown,\r\n handleClickOutsideDropdown\r\n}\r\n\r\nconst NavItems_TCAT = (props: Props_NavItems) => {\r\n\r\n return (<>\r\n\r\n {/*HEAVY EQUIPMENT CATEGORIES*/}\r\n \r\n\r\n {/*CERTIFIED*/}\r\n
  • \r\n \r\n {outputEnFr(\"Cat Certified\", \"Certifié Cat\", props.lang)}\r\n \r\n
  • \r\n {/*CONSIGNATION*/}\r\n
  • \r\n \r\n {outputEnFr(\"Consignment\", \"Consignation\", props.lang)}\r\n \r\n
  • \r\n\r\n {/*GENERATORS*/}\r\n
  • \r\n \r\n {outputEnFr(\"Generators\", \"Groupes électrogènes\", props.lang)}\r\n
  • \r\n\r\n {/*DEALS*/}\r\n
  • \r\n \r\n {outputEnFr(\"Deals\", \"Aubaines\", props.lang)}\r\n
  • \r\n \r\n )\r\n}\r\nexport default NavItems_TCAT;","import React from \"react\";\r\nimport { isEnvironmentBFERENTAL, isEnvironmentJOBSITE } from \"../../Constants\";\r\nimport { outputEnFr, getCategoryLinks } from \"../../HelperFunctions\";\r\nimport NavDropdown from \"../Components/NavDropdown\";\r\nimport { dropdownIDs } from \"../NavigationHeader\";\r\n\r\ntype Props_NavItems = {\r\n lang: string;\r\n jsonDataGroups;\r\n dropdownOpenState;\r\n pageType: number;\r\n paramCategory: string;\r\n handleToggleDropdown;\r\n handleClickOutsideDropdown;\r\n};\r\n\r\nconst NavItems_BFE = (props: Props_NavItems) => {\r\n return (\r\n <>\r\n {/*ALL CATEGORIES*/}\r\n {isEnvironmentBFERENTAL ? (\r\n \r\n ) : isEnvironmentJOBSITE ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n};\r\nexport default NavItems_BFE;\r\n","import React from \"react\";\r\nimport { outputEnFr } from \"../../HelperFunctions\";\r\nimport { Link } from \"react-router-dom\";\r\n\r\ntype props_FavouritesLinkMobile = {\r\n lang: string;\r\n};\r\n\r\nconst FavouritesLinkMobile = (props: props_FavouritesLinkMobile) => {\r\n return (\r\n \r\n \r\n  {outputEnFr(\"My Favourites\", \"Mes favoris\", props.lang)}\r\n  \r\n \r\n 0\r\n \r\n \r\n );\r\n};\r\nFavouritesLinkMobile.whyDidYouRender = true;\r\nexport default FavouritesLinkMobile;\r\n","import React, { useEffect, useRef } from \"react\";\r\nimport { outputEnFr } from \"../../HelperFunctions\";\r\nimport { Link } from \"react-router-dom\";\r\n\r\ntype Props_FavesPopup = {\r\n id: number;\r\n lang: string;\r\n isOpen: boolean;\r\n isViewingFaves: boolean;\r\n handleToggleDropdown;\r\n handleClickOutsideDropdown;\r\n handleForceOpenDropdown;\r\n};\r\n\r\nconst FavouritesNavPopup = (props: Props_FavesPopup) => {\r\n //detect change to favorites, on change force open by changing open state\r\n window.addEventListener(\"DOMContentLoaded\", (event) => {\r\n var favesDropdown = document.getElementById(\"show-cart\");\r\n let loadedFirstTime = false; //avoids open on page load\r\n if (favesDropdown != null) {\r\n var observerOptions = {\r\n childList: true,\r\n };\r\n var observer = new MutationObserver(function (event) {\r\n if (loadedFirstTime) {\r\n props.handleForceOpenDropdown(props.id);\r\n } else {\r\n loadedFirstTime = true;\r\n }\r\n });\r\n observer.observe(favesDropdown, observerOptions);\r\n }\r\n });\r\n\r\n function useOutsideDetection(ref) {\r\n useEffect(() => {\r\n function handleClickOutside(event) {\r\n if (ref.current && !ref.current.contains(event.target)) {\r\n props.handleClickOutsideDropdown(props.id);\r\n }\r\n }\r\n // Bind the event listener\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => {\r\n // Unbind the event listener on clean up\r\n document.removeEventListener(\"mousedown\", handleClickOutside);\r\n };\r\n }, [ref]);\r\n }\r\n const wrapperRef = useRef(null);\r\n useOutsideDetection(wrapperRef);\r\n const viewingClass = props.isViewingFaves ? \"hasCurrent\" : \"\";\r\n return (\r\n <>\r\n \r\n \r\n props.handleToggleDropdown(props.id)}\r\n >\r\n   \r\n {outputEnFr(\"My Favourites\", \"Mes favoris\", props.lang)} \r\n  \r\n \r\n 0\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 props.handleToggleDropdown(props.id)}\r\n >\r\n \r\n {outputEnFr(\r\n \"View my favourites\",\r\n \"Voir mes favoris\",\r\n props.lang\r\n )}\r\n \r\n \r\n
    \r\n
    \r\n

    \r\n {outputEnFr(\r\n \"No favourites added to list.\",\r\n \"Pas de favoris ajoutés à la liste\",\r\n props.lang\r\n )}\r\n

    \r\n
    \r\n \r\n
    \r\n \r\n );\r\n};\r\nFavouritesNavPopup.whyDidYouRender = true;\r\nexport default FavouritesNavPopup;\r\n","/* eslint-disable react/jsx-pascal-case */\r\nimport React from \"react\";\r\nimport { Link } from \"react-router-dom\";\r\nimport {\r\n isEnvironmentBFERENTAL,\r\n isEnvironmentBFE_or_BFERENTAL,\r\n isEnvironmentJOBSITE,\r\n IMAGES,\r\n URLFAVES_EN,\r\n URLFAVES_FR,\r\n} from \"../Constants\";\r\nimport NavItems_TCAT from \"./Components/NavItems_TCAT\";\r\nimport NavItems_BFE from \"./Components/NavItems_BFE\";\r\nimport LanguageSwitcher from \"./Components/LanguageSwitcher\";\r\nimport FavouritesLinkMobile from \"./Components/FavouritesLinkMobile\";\r\nimport FavouritesNavPopup from \"./Components/FavouritesNavPopup\";\r\nimport _ from \"lodash\";\r\n\r\ntype Props_NavMenu = {\r\n lang: string;\r\n pageType: number;\r\n paramCategory: string;\r\n jsonDataGroups;\r\n};\r\ntype State_NavMenu = {\r\n dropdownOpen: {\r\n heavyEquipList: boolean;\r\n favesPopup: boolean;\r\n };\r\n};\r\nexport const dropdownIDs = {\r\n //helps with toggling\r\n heavyEquipList: 0,\r\n favesPopup: 1,\r\n};\r\nconst mobileOnlyClass = \"hidden-md hidden-lg\";\r\n\r\nclass NavigationHeader extends React.PureComponent<\r\n Props_NavMenu,\r\n State_NavMenu\r\n> {\r\n constructor(props) {\r\n super(props);\r\n console.log(\"Construct NavMenu\", props);\r\n this.state = {\r\n dropdownOpen: {\r\n heavyEquipList: false,\r\n favesPopup: false,\r\n },\r\n };\r\n }\r\n\r\n openMobileMenu = () => {\r\n document.body.classList.toggle(\"openMenu\");\r\n };\r\n\r\n handleClickOutsideDropdown = (id) => {\r\n let newState = { ...this.state };\r\n switch (id) {\r\n case dropdownIDs.favesPopup:\r\n newState.dropdownOpen = {\r\n ...this.state.dropdownOpen,\r\n favesPopup: false,\r\n };\r\n break;\r\n case dropdownIDs.heavyEquipList:\r\n newState.dropdownOpen = {\r\n ...this.state.dropdownOpen,\r\n heavyEquipList: false,\r\n };\r\n break;\r\n }\r\n //close dropdown if it is open - json stringify added for proper object comparison\r\n if (!_.isEqual(newState.dropdownOpen, this.state.dropdownOpen)) {\r\n this.setState(newState);\r\n }\r\n };\r\n\r\n handleForceOpenDropdown = (id: number) => {\r\n switch (id) {\r\n case dropdownIDs.favesPopup:\r\n this.setState({\r\n ...this.state,\r\n dropdownOpen: { ...this.state.dropdownOpen, favesPopup: true },\r\n });\r\n break;\r\n case dropdownIDs.heavyEquipList:\r\n this.setState({\r\n ...this.state,\r\n dropdownOpen: { ...this.state.dropdownOpen, heavyEquipList: true },\r\n });\r\n break;\r\n }\r\n };\r\n\r\n handleToggleDropdown = (id: number) => {\r\n let newState_dropdownOpen = this.state.dropdownOpen; //get old state\r\n\r\n let openOrClosed: boolean;\r\n\r\n //set the state in question to its opposite and the rest to false\r\n switch (id) {\r\n case dropdownIDs.favesPopup:\r\n openOrClosed = !this.state.dropdownOpen.favesPopup;\r\n //console.log(\"handleToggleDropdown id:\"+id+\" set to:\"+openOrClosed);\r\n newState_dropdownOpen = {\r\n heavyEquipList: false,\r\n favesPopup: openOrClosed,\r\n };\r\n break;\r\n case dropdownIDs.heavyEquipList:\r\n openOrClosed = !this.state.dropdownOpen.heavyEquipList;\r\n // console.log(\"handleToggleDropdown id:\"+id+\" set to:\"+openOrClosed);\r\n newState_dropdownOpen = {\r\n favesPopup: false,\r\n heavyEquipList: openOrClosed,\r\n };\r\n break;\r\n }\r\n\r\n this.setState({\r\n ...this.state,\r\n dropdownOpen: newState_dropdownOpen,\r\n });\r\n };\r\n\r\n getLogo =\r\n this.props.lang === \"fr\" ? (\r\n \r\n {isEnvironmentBFE_or_BFERENTAL ? (\r\n \r\n ) : isEnvironmentJOBSITE ? (\r\n \r\n ) : (\r\n \"Toromont\r\n )}\r\n \r\n ) : (\r\n \r\n {isEnvironmentBFE_or_BFERENTAL ? (\r\n \"Battlefield\r\n ) : isEnvironmentJOBSITE ? (\r\n \r\n ) : (\r\n \"Toromont\r\n )}\r\n \r\n );\r\n\r\n render() {\r\n console.log(\"Render NavigationHeader\");\r\n const isViewingFaves =\r\n this.props.paramCategory === URLFAVES_EN ||\r\n this.props.paramCategory === URLFAVES_FR;\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    {this.getLogo}
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n );\r\n }\r\n}\r\nexport default NavigationHeader;\r\n","/* eslint-disable react/jsx-pascal-case */\r\nimport React from \"react\";\r\nimport PreNav from \"../Navigation/PreNavigation\";\r\nimport NavigationHeader from \"../Navigation/NavigationHeader\";\r\n\r\ntype props_PreNav = {\r\n lang;\r\n pageType: number;\r\n paramCategory: string;\r\n currentCatClass: string;\r\n jsonDataGroups;\r\n};\r\n\r\nconst Header = ({\r\n lang,\r\n pageType,\r\n paramCategory,\r\n currentCatClass,\r\n jsonDataGroups,\r\n}: props_PreNav) => {\r\n return (\r\n <>\r\n \r\n\r\n \r\n \r\n );\r\n};\r\n\r\nexport default Header;\r\n","import React, { useState } from \"react\";\r\n\r\nconst ScrollTopButton = (props) => {\r\n const [isVisible, setIsVisible] = useState(false);\r\n\r\n const scrollAmountPx = 125; //amount in px user scrolls before button shows\r\n\r\n function detectVisibility() {\r\n // When the user scrolls down from the top of the document, show the button\r\n if (\r\n document.body.scrollTop > scrollAmountPx ||\r\n document.documentElement.scrollTop > scrollAmountPx\r\n ) {\r\n setIsVisible(true);\r\n } else {\r\n setIsVisible(false);\r\n }\r\n }\r\n\r\n function scrollToTop() {\r\n const el = document.getElementById(\"prenav\"); //uses prenav element since it's at very top\r\n el && el.scrollIntoView({ behavior: \"smooth\" });\r\n }\r\n\r\n window.onscroll = function () {\r\n detectVisibility();\r\n };\r\n\r\n return isVisible ? (\r\n scrollToTop()}\r\n id=\"scrollTopBtn\"\r\n title=\"Go to top\"\r\n >\r\n \r\n Back to top\r\n \r\n \r\n ) : (\r\n <>\r\n );\r\n};\r\nScrollTopButton.whyDidYouRender = true;\r\nexport default ScrollTopButton;\r\n","import React from \"react\";\r\nimport { outputEnFr } from \"../HelperFunctions\";\r\nimport { isEnvironmentBFERENTAL, PHONENUMBERS } from \"../Constants\";\r\nimport ScrollTopButton from \"./ScrollTopButton\";\r\n\r\ntype Props_footer = {\r\n lang: string;\r\n};\r\n\r\nconst Footer_Battlefield = ({ lang }: Props_footer) => {\r\n const curYear = new Date().getFullYear();\r\n\r\n return (\r\n
    \r\n \r\n \r\n \r\n
    \r\n

    \r\n {outputEnFr(\r\n \"Have questions? Call our used equipment specialists today!\",\r\n \"Vous avez des questions? Appelez notre spécialiste en équipement usagé aujourd'hui\",\r\n lang\r\n )}\r\n

    \r\n

    \r\n {isEnvironmentBFERENTAL ? (\r\n \r\n {PHONENUMBERS.BFERENTAL}\r\n \r\n ) : (\r\n \r\n {PHONENUMBERS.BFE}\r\n \r\n )}\r\n

    \r\n \r\n {outputEnFr(\r\n \"Operating Hours: Monday to Friday 8:00am – 5:00pm\",\r\n \"Heures d’ouverture : du lundi au vendredi de 8h00 à 17h00\",\r\n lang\r\n )}\r\n \r\n
    \r\n \r\n {outputEnFr(\r\n \"\\u00a9 \" +\r\n curYear +\r\n \" Battlefield Equipment Rentals. All Rights Reserved.\",\r\n \"\\u00a9 \" +\r\n curYear +\r\n \" Battlefield Equipment Rentals - Tous droits réservés.\",\r\n lang\r\n )}\r\n \r\n
    \r\n
    \r\n \r\n {outputEnFr(\r\n \"Copyright Information & Legal Notice\",\r\n \"Information de droits d'auteur et mentions légales\",\r\n lang\r\n )}\r\n {\" \"}\r\n
    \r\n \r\n {outputEnFr(\r\n \"Website Privacy Statement\",\r\n \"Politique de confidentialité\",\r\n lang\r\n )}\r\n \r\n
    \r\n \r\n {outputEnFr(\"Accessibility\", \"Accessibilité\", lang)}\r\n \r\n
    \r\n \r\n
    \r\n );\r\n};\r\n\r\nexport default Footer_Battlefield;\r\n","import React from \"react\";\r\nimport { outputEnFr } from \"../HelperFunctions\";\r\nimport { PHONENUMBERS } from \"../Constants\";\r\nimport ScrollTopButton from \"./ScrollTopButton\";\r\n\r\ntype Props_footer = {\r\n lang: string;\r\n};\r\n\r\nconst Footer_Jobsite = ({ lang }: Props_footer) => {\r\n const curYear = new Date().getFullYear();\r\n\r\n return (\r\n
    \r\n \r\n \r\n \r\n
    \r\n

    \r\n {outputEnFr(\r\n \"Have questions? Call our used equipment specialists today!\",\r\n \"Vous avez des questions? Appelez notre spécialiste en équipement usagé aujourd'hui\",\r\n lang\r\n )}\r\n

    \r\n

    \r\n \r\n {PHONENUMBERS.JOBSITE}\r\n \r\n

    \r\n \r\n {outputEnFr(\r\n \"\\u00a9 \" +\r\n curYear +\r\n \" Jobsite Industrial Rental Services. All Rights Reserved.\",\r\n \"\\u00a9 \" +\r\n curYear +\r\n \" Location d'outils industriels Jobsite - Tous droits réservés.\",\r\n lang\r\n )}\r\n \r\n
    \r\n
    \r\n \r\n {outputEnFr(\r\n \"Copyright Information & Legal Notice\",\r\n \"Information de droits d'auteur et mentions légales\",\r\n lang\r\n )}\r\n {\" \"}\r\n
    \r\n \r\n {outputEnFr(\r\n \"Website Privacy Statement\",\r\n \"Politique de confidentialité\",\r\n lang\r\n )}\r\n \r\n
    \r\n \r\n {outputEnFr(\"Accessibility\", \"Accessibilité\", lang)}\r\n \r\n
    \r\n \r\n
    \r\n );\r\n};\r\n\r\nexport default Footer_Jobsite;\r\n","/* eslint-disable no-useless-escape */\r\nimport React from \"react\"; \r\nimport { CLASS_POWER, HUBSPOTFORMIDS} from \"../Constants\";\r\nimport HubspotForm from 'react-hubspot-form';\r\n\r\n\r\ntype Props_FooterSubscribeForm_Tcat = {\r\n lang: string,\r\n currentCatClass: string\r\n}\r\nconst FooterSubscribeForm_Tcat_hubspot = (props: Props_FooterSubscribeForm_Tcat) => { \r\n \r\n const getHubSpotFormId = () => {\r\n if (props.currentCatClass === CLASS_POWER) {//power\r\n return (props.lang === \"fr\" ? HUBSPOTFORMIDS.FOOTERSUBSCRIBE.POWER.FR : HUBSPOTFORMIDS.FOOTERSUBSCRIBE.POWER.EN);\r\n } else {//heavy equipment\r\n return (props.lang === \"fr\" ? HUBSPOTFORMIDS.FOOTERSUBSCRIBE.HEAVY.FR: HUBSPOTFORMIDS.FOOTERSUBSCRIBE.HEAVY.EN);\r\n }\r\n }\r\n\r\n\r\n return (\r\n
    \r\n console.log('Submit!')}\r\n //onReady={(form) => console.log('Form ready!')}\r\n //loading={
    Loading...
    } \r\n />\r\n
    \r\n )\r\n}\r\nFooterSubscribeForm_Tcat_hubspot.whyDidYouRender = true;\r\nexport default FooterSubscribeForm_Tcat_hubspot;","/* eslint-disable react/jsx-pascal-case */\r\nimport React from \"react\";\r\nimport { outputEnFr, getPhoneNumber } from \"../HelperFunctions\";\r\nimport FooterSubscribeForm_Tcat_hubspot from \"./FooterSubscribeForm_Tcat_hubspot\";\r\nimport ScrollTopButton from \"./ScrollTopButton\";\r\n\r\ntype Props_footer = {\r\n lang: string;\r\n currentCatClass: string;\r\n};\r\n\r\nexport default class Footer_TCAT extends React.PureComponent {\r\n curYear = new Date().getFullYear();\r\n\r\n scrollToTop = () => {\r\n //TODO: create this function\r\n return;\r\n };\r\n\r\n render() {\r\n return (\r\n
    \r\n \r\n \r\n \r\n
    \r\n

    \r\n {outputEnFr(\r\n \"Have questions? Call our used equipment specialists today!\",\r\n \"Vous avez des questions? Appelez notre spécialiste en équipement usagé aujourd'hui\",\r\n this.props.lang\r\n )}\r\n

    \r\n

    \r\n \r\n {getPhoneNumber(this.props.currentCatClass)}\r\n \r\n

    \r\n \r\n \r\n {outputEnFr(\r\n \"\\u00a9 \" +\r\n this.curYear +\r\n \" Toromont Industries Ltd. All Rights Reserved.\",\r\n \"\\u00a9 \" +\r\n this.curYear +\r\n \" Toromont Cat - Tous droits réservés.\",\r\n this.props.lang\r\n )}\r\n \r\n
    \r\n
    \r\n \r\n {outputEnFr(\r\n \"Copyright Information & Legal Notice\",\r\n \"Information de droits d'auteur et mentions légales\",\r\n this.props.lang\r\n )}\r\n {\" \"}\r\n
    \r\n \r\n {outputEnFr(\r\n \"Website Privacy Statement\",\r\n \"Politique de confidentialité\",\r\n this.props.lang\r\n )}\r\n \r\n
    \r\n \r\n {outputEnFr(\"Accessibility\", \"Accessibilité\", this.props.lang)}\r\n \r\n
    \r\n \r\n
    \r\n );\r\n }\r\n}\r\n","import React from \"react\";\r\nimport { isEnvironmentJOBSITE } from \"../../common/Constants\";\r\nimport { outputEnFr, getPhoneNumber } from \"../../common/HelperFunctions\";\r\n\r\ntype Props_CtaSectionHeader = {\r\n lang: string;\r\n currentCatClass: string;\r\n};\r\n\r\nconst CtaSectionHeader = (props: Props_CtaSectionHeader) => {\r\n const btnPhone = (\r\n \r\n  {\" \"}\r\n {getPhoneNumber(props.currentCatClass)}{\" \"}\r\n \r\n );\r\n\r\n const btnForm = (\r\n \r\n  \r\n \r\n {outputEnFr(\"Contact Us\", \"Demande d'information\", props.lang)}\r\n \r\n \r\n );\r\n\r\n return (\r\n
    \r\n {btnPhone}\r\n {!isEnvironmentJOBSITE ? (\r\n <>\r\n

    \r\n {outputEnFr(\r\n \"Operating Hours: Monday to Friday 8:00am – 5:00pm\",\r\n \"Heures d’ouverture : du lundi au vendredi de 8h00 à 17h00\",\r\n props.lang\r\n )}\r\n

    \r\n \r\n ) : (\r\n \"\"\r\n )}\r\n\r\n {btnForm}\r\n
    \r\n );\r\n};\r\nCtaSectionHeader.whyDidYouRender = true;\r\nexport default CtaSectionHeader;\r\n","import React from \"react\";\r\nimport { types_seoData } from \"../../common/Types\";\r\nimport { getSeoContentByCatCode } from \"../../common/SEO/SeoFunctions\";\r\nimport {\r\n CLASS_POWER,\r\n isEnvironmentBFE,\r\n isEnvironmentBFERENTAL,\r\n isEnvironmentJOBSITE,\r\n} from \"../../common/Constants\";\r\n\r\ntype Props_SeoTextHeader = {\r\n lang: string;\r\n category: string | null;\r\n currentCatClass: string;\r\n};\r\n\r\nconst SeoTextHeader = (props: Props_SeoTextHeader) => {\r\n console.log(\"Render SeoTextHeader \", props);\r\n\r\n let h1title =\r\n props.lang === \"fr\"\r\n ? \"Outils & Équipements d'Occasion\"\r\n : \"Used Tools & Equipment\";\r\n if (isEnvironmentBFE) {\r\n h1title =\r\n props.lang === \"fr\"\r\n ? \"Équipement d'occasion compact\"\r\n : \"Used Compact Equipment\";\r\n } else if (isEnvironmentBFERENTAL) {\r\n h1title =\r\n props.lang === \"fr\"\r\n ? \"Équipement de flotte de location d'occasion\"\r\n : \"Used Rental Fleet Equipment\";\r\n }\r\n\r\n if (isEnvironmentBFE && window.location.toString().includes(\"work-tools\")) {\r\n h1title = props.lang === \"fr\" ? \"Équipement compact\" : \"Compact Equipment\";\r\n }\r\n\r\n if (props.currentCatClass === CLASS_POWER) {\r\n h1title =\r\n props.lang === \"fr\" ? \"Production d'énergie\" : \"Used Power Systems\";\r\n }\r\n\r\n const seoText: types_seoData = getSeoContentByCatCode(props.category);\r\n\r\n const getCategoryHeader =\r\n props.lang === \"fr\" ? seoText.FR.Name : seoText.EN.Name;\r\n const getCategorySeoText =\r\n props.lang === \"fr\" ? seoText.FR.Desc : seoText.EN.Desc;\r\n const getCategorySeoTextBFERental =\r\n props.lang === \"fr\"\r\n ? \"Location d’équipement Battlefield offre à prix avantageux une large gamme de machines d’occasion de qualité avec peu d’heures d’utilisation. Tous nos équipements font l’objet d’un entretien régulier par nos techniciens formés en usine selon un programme de maintenance rigoureux. Location d’équipement Battlefield procure des produits de marque de confiance et est le distributeur autorisé de produits Caterpillar, Spectra Precision/Trimble, Wacker Neuson, STIHL, Honda, SkyJack, Genie, Huqsvarna, Atlas Copco, Bosch, Godwin, entre autres. \"\r\n : \"Battlefield Equipment Rentals offers a wide range of quality, low-hour used machines for sale at great prices. All of our equipment has been regularly serviced by our Factory Trained Technicians and has undergone a strict maintenance schedule. Battlefield Equipment Rentals sells thousands of brand name products and is the authorized distributor for such brands as Caterpillar, Spectra Precision / Trimble, Wacker Neuson, Stihl, Honda, SkyJack, Genie, Husqvarna, Atlas Copco, Bosch, Gorman-Rupp, as well as many others.\";\r\n const getCategorySeoTextJobsite =\r\n props.lang === \"fr\"\r\n ? \"Location d’outils industriels Jobsite offrent une vaste gamme d'outils et d'équipements d'occasion de qualité à vendre à des prix avantageux. Tous nos équipements ont été régulièrement entretenus par nos techniciens formés en usine et ont fait l'objet d'un programme d'entretien strict. Location d’outils industriels Jobsite vend des milliers de produits de marque et est le distributeur autorisé de marques telles que Lincoln Electric, Greenlee, Rigid, Sumner, RAD, Enerpac, Genie, Eagle Pro, ainsi que de nombreuses autres.\"\r\n : \"Jobsite Industrial Rental Services offers a wide range of quality used tools and equipment for sale at great prices. All of our equipment has been regularly serviced by our Factory Trained Technicians and has undergone a strict maintenance schedule. Jobsite Industrial Rental Services sells thousands of brand name products and is the authorized distributor for such brands as Lincoln Electric, Greenlee, Rigid, Sumner, RAD, Enerpac, Genie, Eagle Pro, as well as many others.\";\r\n\r\n return (\r\n <>\r\n
    \r\n

    \r\n \r\n {h1title + \" - \"}\r\n \r\n \r\n {getCategoryHeader}\r\n \r\n

    \r\n
    \r\n {isEnvironmentBFERENTAL\r\n ? getCategorySeoTextBFERental\r\n : isEnvironmentJOBSITE\r\n ? getCategorySeoTextJobsite\r\n : getCategorySeoText}\r\n
    \r\n \r\n );\r\n};\r\nSeoTextHeader.whyDidYouRender = true;\r\nexport default SeoTextHeader;\r\n","import * as Types from '../../common/Types';\r\nimport * as Constants from '../../common/Constants'\r\nimport { ConverterNumber } from '../../common/HelperFunctions';\r\nlet currentDealsArray;\r\nif (Constants.isEnvironmentTCAT){ \r\n //fetch text file of deals serial numbers - toromont only\r\n fetch('/dealslist.txt')\r\n .then(response => response.text())\r\n .then((text) => { \r\n currentDealsArray=text;\r\n }); \r\n}\r\n\r\n\r\nexport function isCurrentDeal(serialnum, stocknum): boolean { \r\n //checks list of models from txt file and returns if found\r\n if (currentDealsArray){\r\n const isCurrentDeal = (currentDealsArray.indexOf(serialnum) > -1 || currentDealsArray.indexOf(stocknum) > -1); \r\n return isCurrentDeal || false; \r\n }\r\n return false; \r\n}\r\n\r\nexport const setUpPaging = (curPage, itemCount) => {\r\n curPage = ConverterNumber(curPage) || 1;\r\n const itemsPerPg = Constants.ITEMSPERPAGE;\r\n if (itemCount <= itemsPerPg) { curPage = 1; console.log(\"Changing curpage to 1\"); }\r\n const endAtItem = itemsPerPg * curPage;\r\n\r\n let paging: Types.pagingState = {\r\n curPage: curPage,\r\n numPages: Math.ceil(itemCount / itemsPerPg),\r\n endAtItem: endAtItem,\r\n startAtItem: (endAtItem - itemsPerPg) + 1,\r\n totalItems: itemCount\r\n }\r\n return paging;\r\n}\r\n\r\nexport function getBodyClassNames(filters) {\r\n let bodyClassNames: string[] = [\"pgListing\"];\r\n if (Constants.isEnvironmentBFE_or_BFERENTAL) {\r\n bodyClassNames.push(\"bfetheme\");\r\n }\r\n if (Constants.isEnvironmentJOBSITE) {\r\n bodyClassNames.push(\"jobsite-theme\")\r\n }\r\n if (filters.viewFaves) {\r\n bodyClassNames.push(\"viewFaves\");\r\n }\r\n if (filters.viewDeals) {\r\n bodyClassNames.push(\"viewDeals\");\r\n }\r\n return bodyClassNames;\r\n}\r\n\r\n\r\n","import React from \"react\";\r\nimport CtaSectionHeader from \"./CtaSectionHeader\";\r\nimport SeoTextHeader from \"./SeoTextHeader\"; \r\n\r\ntype Props_ListingHeader = {\r\n lang: string,\r\n currentCatClass:string,\r\n category:string|null\r\n //seoData:Types_SeoData\r\n}\r\n\r\n\r\n\r\nexport default class ListingHeader extends React.PureComponent{\r\n\r\n constructor(props){\r\n super(props)\r\n console.log(\"Construct ListingHeader \", props);\r\n }\r\n \r\n\r\n render(){\r\n return (\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} ","import * as Types from '../../common/Types'; \r\nimport { slug } from '../../common/SEO/SeoFunctions';\r\nimport * as Constants from '../../common/Constants';\r\nimport _ from 'lodash';\r\n\r\nexport default function getAllProductsFromCategory (filters:Types.searchFilters, jsonDataGroups){\r\n //console.log(\"getAllProductsFromCategory()\",filters); \r\n\r\n const VIEWALLPRODUCTS = (filters.category===Constants.ALLFAMSWORD_EN || filters.category===Constants.ALLFAMSWORD_FR || filters.category===Constants.URLPOWER_SLUG || filters.category===null);\r\n \r\n //filter only current category class - TCAT ONLY\r\n // let UsedData = _.filter(jsonDataGroups, function (o) {\r\n // var checkClass1 = o.equipments[0]['product-family-categories']['category-class']['name'];\r\n // var checkClass2 = o.equipments[0]['product-family-categories'].category.name;\r\n // return (\r\n // isEnvironmentBFE ||\r\n // getCategoryClassFromValue(checkClass1) === filters.categoryClass ||\r\n // getCategoryClassFromValue(checkClass2) === filters.categoryClass\r\n // )\r\n // });\r\n let UsedData=jsonDataGroups;\r\n let FamData=[];\r\n //set famData list (single category)\r\n if (!VIEWALLPRODUCTS){\r\n FamData = _.filter(UsedData, function (o) {\r\n return (\r\n o['group-code'] === filters.category ||\r\n slug(o['group-code']) === slug(filters.category)\r\n )\r\n });\r\n if (typeof FamData != \"undefined\" && typeof FamData[0] != \"undefined\") {\r\n FamData = FamData[0]['equipments'];\r\n }\r\n } \r\n\r\n //set current list \r\n if (VIEWALLPRODUCTS || filters.viewFaves || filters.viewDeals || !filters.category) {\r\n //set AllData list (all categories)\r\n let AllData = [];\r\n for (var i = 0; i < UsedData.length; i++) { //combine all groups into one array\r\n AllData = AllData.concat(UsedData[i]['equipments']);\r\n }\r\n UsedData = AllData;\r\n } else {\r\n UsedData = FamData;\r\n } \r\n return UsedData;\r\n} ","import * as Types from \"../../common/Types\";\r\nimport { cityGroupingValue, hasWord } from \"../../common/HelperFunctions\";\r\nimport _ from \"lodash\";\r\nimport { SORT } from \"../../common/Constants\";\r\nimport shoppingCart from \"../../../js_vanilla/used-favouriteAddon\";\r\nimport { isCurrentDeal } from \"./listingFunctions\";\r\n\r\nconst getFilteredSearchResults = (filters: Types.searchFilters, famData) => {\r\n //filter based on all search filters\r\n let filteredResults = _.filter(famData, function (p) {\r\n //x is current product data\r\n\r\n //adjust some filters for better results\r\n let f_yearMax = filters.yearMax;\r\n if (f_yearMax && f_yearMax < 999) {\r\n f_yearMax = 0;\r\n }\r\n\r\n //apply filters\r\n if (\r\n typeof p[\"serial-number\"] === \"undefined\" ||\r\n (filters.make &&\r\n filters.make === \"Caterpillar\" &&\r\n p.manufacturer != null &&\r\n p.manufacturer !== \"CATERPILLAR\") ||\r\n (filters.make &&\r\n filters.make === \"other\" &&\r\n p.manufacturer != null &&\r\n p.manufacturer === \"CATERPILLAR\") ||\r\n (filters.province &&\r\n filters.province !== \"\" &&\r\n p.state != null &&\r\n p.state !== filters.province) ||\r\n (filters.city &&\r\n ((filters.city !== \"N/A\" && p.city == null) ||\r\n (p.city != null &&\r\n cityGroupingValue(p.city) !== cityGroupingValue(filters.city)))) ||\r\n (filters.maxPrice &&\r\n filters.maxPrice > 0 &&\r\n (p.price == null || Number(p.price.text) > filters.maxPrice)) ||\r\n (filters.yearMin &&\r\n filters.yearMin > 0 &&\r\n (p.year == null || Number(p.year) < filters.yearMin)) ||\r\n (f_yearMax &&\r\n f_yearMax > 0 &&\r\n (p.year == null || Number(p.year) > f_yearMax)) ||\r\n (filters.hoursMax &&\r\n filters.hoursMax > 0 &&\r\n (p.hours == null ||\r\n Number(p.hours) < 1 ||\r\n Number(p.hours) > filters.hoursMax)) ||\r\n (filters.keyword &&\r\n filters.keyword !== \"\" &&\r\n !hasWord(p, filters.keyword)) ||\r\n // Certified only\r\n (filters.certifiedOnly &&\r\n (p.certification == null ||\r\n p.certification === \"None\" ||\r\n p.certification === \"No Certification\" ||\r\n p.certification === \"Pas de Certification\" ||\r\n p.certification === \"Aucune\")) ||\r\n // Battlefield inventory start\r\n (filters.battlefieldInventory &&\r\n p[\"dealer-name\"] === \"CATERPILLAR FINANCIAL SERVICES CORPORATION\") ||\r\n // Battfield inventory end\r\n (filters.rentalFleetAvailability && p[\"availability\"] === \"No\") ||\r\n (filters.rentalFleetWithImages &&\r\n (p[\"photos\"] === undefined || !p[\"photos\"].length)) ||\r\n // If both Rental Fleet checkboxes are checked\r\n (filters.rentalFleetAvailability &&\r\n p[\"availability\"] === \"No\" &&\r\n filters.rentalFleetWithImages &&\r\n (p[\"photos\"] === undefined || !p[\"photos\"].length)) ||\r\n // If both Battlefield Used checkboxes are checked\r\n (filters.certifiedOnly &&\r\n (p.certification == null ||\r\n p.certification === \"None\" ||\r\n p.certification === \"Aucune\") &&\r\n filters.battlefieldInventory &&\r\n p[\"dealer-name\"] === \"CATERPILLAR FINANCIAL SERVICES CORPORATION\") ||\r\n (filters.viewFaves &&\r\n !shoppingCart.isItemInCart(\r\n p.year,\r\n p.manufacturer,\r\n p.model,\r\n p[\"serial-number\"]\r\n )) ||\r\n (filters.viewDeals &&\r\n !isCurrentDeal(p[\"serial-number\"], p[\"stock-number\"]))\r\n ) {\r\n return false; // don't include in listings\r\n } else {\r\n return true;\r\n }\r\n });\r\n\r\n ///////////////SORT ORDER\r\n if (filters.sortBy === SORT.YEAR_LO) {\r\n //sort by year asc\r\n filteredResults = _.chain(filteredResults)\r\n .sortBy(function (o) {\r\n if (o.price != null) {\r\n return Number(o.price.text);\r\n } else {\r\n return 0;\r\n }\r\n }) //asc\r\n .sortBy(\"manufacturer\") //asc\r\n .sortBy(\"year\") //asc\r\n .value();\r\n } else if (filters.sortBy === SORT.HOURS_LO) {\r\n //sort by hours asc\r\n filteredResults = _.chain(filteredResults)\r\n .sortBy(function (o) {\r\n return Number(o.hours) || 999999999999999999;\r\n }) //asc\r\n .value();\r\n } else if (filters.sortBy === SORT.HOURS_HI) {\r\n //sort by hours desc\r\n filteredResults = _.chain(filteredResults)\r\n .sortBy(function (o) {\r\n return Number(o.hours);\r\n })\r\n .reverse() //desc\r\n .value();\r\n } else if (filters.sortBy === SORT.MODEL_LO) {\r\n //sort by model asc\r\n filteredResults = _.chain(filteredResults)\r\n .sortBy(\"year\") //asc\r\n .sortBy(\"model\") //asc\r\n .sortBy(\"manufacturer\") //asc\r\n .value();\r\n } else if (filters.sortBy === SORT.MODEL_HI) {\r\n //sort by model desc\r\n filteredResults = _.chain(filteredResults)\r\n .sortBy(\"year\")\r\n .reverse() //asc\r\n .sortBy(\"model\")\r\n .reverse() //desc\r\n .sortBy(\"manufacturer\") //asc\r\n .value();\r\n } else if (filters.sortBy === SORT.PRICE_HI) {\r\n //sort by price desc\r\n filteredResults = _.chain(filteredResults)\r\n .sortBy(function (o) {\r\n if (o.price != null) {\r\n return Number(o.price.text);\r\n } else {\r\n return 0;\r\n }\r\n })\r\n .reverse() //desc\r\n .value();\r\n } else if (filters.sortBy === SORT.PRICE_LO) {\r\n //sort by price asc\r\n filteredResults = _.chain(filteredResults)\r\n .sortBy(function (o) {\r\n if (o.price != null) {\r\n return Number(o.price.text);\r\n } else {\r\n return 99999999999;\r\n }\r\n }) //asc\r\n .value();\r\n } else {\r\n //sort by year desc\r\n filteredResults = _.chain(filteredResults)\r\n .sortBy(function (o) {\r\n if (o.price != null) {\r\n return Number(o.price.text);\r\n } else {\r\n return 0;\r\n }\r\n })\r\n .reverse() //asc\r\n .sortBy(\"manufacturer\")\r\n .reverse() //asc\r\n .sortBy(function (o) {\r\n return o.year || 0;\r\n }) //desc\r\n .reverse()\r\n .value();\r\n }\r\n return filteredResults;\r\n};\r\nexport default getFilteredSearchResults;\r\n","import React from \"react\";\r\nimport { types_seoData } from \"../../common/Types\";\r\nimport { getSeoContentByCatCode } from \"../../common/SEO/SeoFunctions\";\r\nimport { isEnvironmentJOBSITE } from \"../../common/Constants\";\r\n\r\ntype Props_SeoTextBottom = {\r\n lang: string;\r\n category: string | null;\r\n //seoText: Types_SeoData\r\n};\r\n\r\nclass SeoTextBottom extends React.PureComponent {\r\n getExtraText = () => {\r\n const seoText: types_seoData = getSeoContentByCatCode(this.props.category);\r\n return this.props.lang === \"fr\"\r\n ? seoText.FR.ExtraText\r\n : seoText.EN.ExtraText;\r\n };\r\n\r\n render() {\r\n return (\r\n <>\r\n {isEnvironmentJOBSITE ? (\r\n \"\"\r\n ) : (\r\n
    \r\n
    \r\n
    \r\n
    \r\n {this.getExtraText()}\r\n
    \r\n
    \r\n
    \r\n
    \r\n )}\r\n \r\n );\r\n }\r\n}\r\nexport default SeoTextBottom;\r\n","import React from \"react\";\r\nimport * as Constants from \"../../common/Constants\";\r\nimport * as Types from \"../../common/Types\";\r\nimport { outputEnFr, ConverterString } from \"../../common/HelperFunctions\";\r\n\r\ntype props_SelectSortOrder = {\r\n lang: string;\r\n filters: Types.searchFilters;\r\n onSearchFilterChange;\r\n};\r\n\r\nconst SelectSortOrder = (props: props_SelectSortOrder) => {\r\n const onSortByChange = (e) => {\r\n const newSortVal = e.target.value;\r\n\r\n const updatedSearchFilters: Types.searchFilters = {\r\n ...props.filters,\r\n sortBy: newSortVal,\r\n };\r\n\r\n props.onSearchFilterChange(updatedSearchFilters);\r\n };\r\n\r\n return (\r\n <>\r\n
    \r\n \r\n onSortByChange(e)}\r\n value={\r\n ConverterString(props.filters.sortBy) || Constants.SORT.YEAR_HI\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\nSelectSortOrder.whyDidYouRender = true;\r\nexport default SelectSortOrder;\r\n","import React from \"react\";\r\nimport * as Types from \"../../common/Types\";\r\nimport { outputEnFr } from \"../../common/HelperFunctions\";\r\n\r\ntype props_InputKeywordSearch = {\r\n lang: string;\r\n filters: Types.searchFilters;\r\n onSearchFilterChange;\r\n};\r\n\r\nconst InputKeywordSearch = (props: props_InputKeywordSearch) => {\r\n const onKeywordSearch = (e) => {\r\n const newKeywords = e.target.value;\r\n\r\n const updatedSearchFilters: Types.searchFilters = {\r\n ...props.filters,\r\n keyword: newKeywords,\r\n };\r\n\r\n props.onSearchFilterChange(updatedSearchFilters);\r\n };\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};\r\nInputKeywordSearch.whyDidYouRender = true;\r\nexport default InputKeywordSearch;\r\n","import React from \"react\";\r\nimport * as Types from '../../common/Types';\r\nimport * as Constants from '../../common/Constants'\r\nimport Pagination from \"react-js-pagination\";\r\nimport { outputEnFr } from \"../../common/HelperFunctions\";\r\nimport SelectSortOrder from \"../components/SelectSortOrder\";\r\nimport InputKeywordSearch from \"../components/InputKeywordSearch\";\r\n\r\ntype Props_FiltersTop = {\r\n lang: string,\r\n pagingState: Types.pagingState,\r\n filters: Types.searchFilters,\r\n onPageChange,\r\n onSearchFilterChange\r\n}\r\n\r\nclass FiltersTop extends React.PureComponent { \r\n \r\n showingProductsText = () => {\r\n let textCountShowingProducts = \"0\";\r\n if (this.props.pagingState.totalItems > 0){\r\n textCountShowingProducts = this.props.pagingState.startAtItem +\" - \"+Math.min(this.props.pagingState.endAtItem,this.props.pagingState.totalItems);\r\n } \r\n return(<>\r\n {outputEnFr(\"Showing products \", \"Afficher les produits \",this.props.lang)}\r\n {textCountShowingProducts} \r\n {outputEnFr(\"out of\", \"sur\",this.props.lang)}\r\n {this.props.pagingState.totalItems}\r\n \r\n );\r\n } \r\nrender(){ \r\n return ( \r\n <>\r\n
    \r\n
    \r\n
    \r\n\r\n \r\n\r\n

    \r\n {this.showingProductsText()}\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 {this.showingProductsText()}\r\n

    \r\n
    \r\n
    \r\n
    \r\n \r\n );\r\n\r\n}\r\n} \r\nexport default FiltersTop;","import React from \"react\";\r\nimport * as Types from \"../../common/Types\";\r\nimport {\r\n outputEnFr,\r\n sortGroupsByDisplayName,\r\n} from \"../../common/HelperFunctions\";\r\nimport { slug } from \"../../common/SEO/SeoFunctions\";\r\n\r\ntype Props_SelectCategory = {\r\n lang: string;\r\n filters: Types.searchFilters;\r\n onSearchFilterChange;\r\n jsonDataGroups;\r\n};\r\n\r\nconst SelectCategory = (props: Props_SelectCategory) => {\r\n const onCategoryChange = (e) => {\r\n const newCategory = e.target.value;\r\n\r\n const updatedSearchFilters: Types.searchFilters = {\r\n ...props.filters,\r\n category: newCategory,\r\n };\r\n\r\n props.onSearchFilterChange(updatedSearchFilters);\r\n };\r\n\r\n const getCategoryDropdownOptions = () => {\r\n let selectOptions_fam = [\r\n ,\r\n ];\r\n const UsedData = sortGroupsByDisplayName(props.jsonDataGroups);\r\n Object.keys(UsedData).forEach(function (x) {\r\n if (UsedData[x] == null) {\r\n return;\r\n }\r\n var famCount = UsedData[x].count;\r\n var famName = UsedData[x][\"group-display-name\"];\r\n var famCode = UsedData[x][\"group-code\"];\r\n\r\n selectOptions_fam.push(\r\n \r\n );\r\n });\r\n return selectOptions_fam;\r\n };\r\n\r\n return (\r\n <>\r\n \r\n\r\n onCategoryChange(e)}\r\n >\r\n {getCategoryDropdownOptions()}\r\n \r\n \r\n );\r\n};\r\nSelectCategory.whyDidYouRender = true;\r\nexport default SelectCategory;\r\n","import React, { useEffect, Fragment } from \"react\";\r\nimport { outputEnFr } from \"../../common/HelperFunctions\";\r\nimport * as Types from \"../../common/Types\";\r\nimport { ConverterBoolean } from \"../../common/HelperFunctions\";\r\nimport {\r\n isEnvironmentBFE,\r\n isEnvironmentBFERENTAL,\r\n isEnvironmentJOBSITE,\r\n} from \"../../common/Constants\";\r\n\r\ntype Props_CheckboxCertified = {\r\n lang: string;\r\n filters: Types.searchFilters;\r\n onSearchFilterChange;\r\n};\r\n\r\nconst CheckboxCertified = (props: Props_CheckboxCertified) => {\r\n // Rental Fleet show available toggle\r\n const onRentalFleetAvailableChange = (e) => {\r\n const newRentalFleetAvailableValue: boolean = e.target.checked;\r\n\r\n const updatedSearchFilters: Types.searchFilters = {\r\n ...props.filters,\r\n rentalFleetAvailability: newRentalFleetAvailableValue,\r\n };\r\n\r\n props.onSearchFilterChange(updatedSearchFilters);\r\n };\r\n // Rental Fleet show products with images toggle\r\n const onRentalFleetWithImagesChange = (e) => {\r\n const newRentalFleetWithImagesValue: boolean = e.target.checked;\r\n\r\n const updatedSearchFilters: Types.searchFilters = {\r\n ...props.filters,\r\n rentalFleetWithImages: newRentalFleetWithImagesValue,\r\n };\r\n\r\n props.onSearchFilterChange(updatedSearchFilters);\r\n };\r\n // Battlfield product toggle\r\n const onBattlefieldChange = (e) => {\r\n const newBattlefieldValue: boolean = e.target.checked;\r\n\r\n const updatedSearchFilters: Types.searchFilters = {\r\n ...props.filters,\r\n battlefieldInventory: newBattlefieldValue,\r\n };\r\n\r\n props.onSearchFilterChange(updatedSearchFilters);\r\n };\r\n\r\n // Dealer certified product toggle\r\n const onCertifiedChange = (e) => {\r\n const newCertifiedValue: boolean = e.target.checked;\r\n\r\n const updatedSearchFilters: Types.searchFilters = {\r\n ...props.filters,\r\n certifiedOnly: newCertifiedValue,\r\n };\r\n\r\n props.onSearchFilterChange(updatedSearchFilters);\r\n };\r\n\r\n // useEffect to check the URL and update the checkbox on load\r\n useEffect(() => {\r\n // Get the current URL\r\n const currentURL = window.location.pathname;\r\n\r\n // Check if the URL contains \"/en/work-tools-outils-de-travail\"\r\n const shouldCheckBattlefieldInventoryEn = currentURL.includes(\r\n \"/en/work-tools-outils-de-travail\"\r\n );\r\n\r\n const shouldCheckBattlefieldInventoryFr = currentURL.includes(\r\n \"/fr/work-tools-outils-de-travail\"\r\n );\r\n\r\n // If the URL contains the specified path, check the checkbox\r\n if (\r\n shouldCheckBattlefieldInventoryEn ||\r\n shouldCheckBattlefieldInventoryFr\r\n ) {\r\n onBattlefieldChange({ target: { checked: true } });\r\n }\r\n }, []);\r\n\r\n return (\r\n <>\r\n
    \r\n {isEnvironmentBFE ? (\r\n \r\n \r\n

    \r\n

    \r\n \r\n
    \r\n ) : isEnvironmentBFERENTAL || isEnvironmentJOBSITE ? (\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 Cat Certified:\r\n
    • 140-point inspection
    • \r\n
    • One-year/1,000-hour warranty on powertrain and hydraulics
    • \r\n
    • Discount on financing
    • \r\n
    • Up-to-date maintenance
    • \r\n
    • 500-hour PM Kit
    • \r\n
    • 10 % discount on Cat work tools
    \r\n
    \r\nDealer Certified:\r\n
    • 140-point inspection
    • \r\n
    • 3-month/250-hour warranty on powertrain
    • \r\n
    • Financing available
    • \r\n
    • Up-to-date maintenance
    • \r\n
    • 10 % discount on Cat work tools
    \" data-content-fr=\"Certifié Cat :\r\n
    • Inspection en 140 points
    • \r\n
    • Garantie 1 an / 1000 heures sur groupe motopropulseur et hydraulique
    • \r\n
    • Rabais sur le financement
    • \r\n
    • Maintenance à jour
    • \r\n
    • Kit d’entretien 500 heures fourni
    • \r\n
    • 10 % de rabais sur les accessoires Cat
    \r\n
    \r\nCertifié concessionnaire :\r\n\r\n
    • Inspection en 140 points
    • \r\n
    • Garantie 3 mois / 250 heures sur groupe motopropulseur
    • \r\n
    • Maintenance complétée
    • \r\n
    • 10 % de rabais sur les accessoires Cat
    • \r\n
    • Financement disponible
    \">\r\n [?]\r\n
    \r\n
    */}\r\n
    \r\n
    \r\n \r\n );\r\n};\r\nCheckboxCertified.whyDidYouRender = true;\r\nexport default CheckboxCertified;\r\n","import React from \"react\";\r\nimport * as Types from \"../../common/Types\";\r\nimport { outputEnFr } from \"../../common/HelperFunctions\";\r\nimport {\r\n isEnvironmentBFERENTAL,\r\n isEnvironmentJOBSITE,\r\n} from \"../../common/Constants\";\r\n\r\ntype props_SelectManufacturer = {\r\n lang: string;\r\n filters: Types.searchFilters;\r\n onSearchFilterChange;\r\n onKeyPress?; //only needed for home page\r\n};\r\n\r\nconst SelectManufacturer = (props: props_SelectManufacturer) => {\r\n const onSelectboxChange = (e) => {\r\n const newManufacturer = e.target.value;\r\n\r\n const updatedSearchFilters: Types.searchFilters = {\r\n ...props.filters,\r\n make: newManufacturer,\r\n };\r\n\r\n props.onSearchFilterChange(updatedSearchFilters);\r\n };\r\n\r\n return (\r\n <>\r\n {isEnvironmentBFERENTAL || isEnvironmentJOBSITE ? (\r\n \"\"\r\n ) : (\r\n <>\r\n \r\n onSelectboxChange(e)}\r\n onKeyPress={\r\n props.onKeyPress\r\n ? (e) => props.onKeyPress(e)\r\n : (e) => onSelectboxChange(e)\r\n }\r\n >\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\nSelectManufacturer.whyDidYouRender = true;\r\nexport default SelectManufacturer;\r\n","import React, { useState, useEffect } from \"react\";\r\nimport * as Types from \"../../common/Types\";\r\nimport { outputEnFr, ConverterNumber } from \"../../common/HelperFunctions\";\r\nimport { Range } from \"rc-slider\";\r\nimport _ from \"lodash\";\r\n\r\ntype Props_InputYearMinMax = {\r\n lang: string;\r\n filters: Types.searchFilters;\r\n onSearchFilterChange;\r\n showSlider: boolean;\r\n famData?; //only needed for slider value/listing page\r\n onKeyPress?; //only needed for home page\r\n};\r\n\r\nconst InputYearMinMax = (props: Props_InputYearMinMax) => {\r\n const currentYear = new Date().getFullYear();\r\n let oldestModelYear = 1960; //default\r\n if (props.famData && props.showSlider) {\r\n const oldestModel = _.minBy(props.famData, function (o) {\r\n return o.year;\r\n });\r\n if (typeof oldestModel != \"undefined\") {\r\n oldestModelYear = oldestModel.year;\r\n }\r\n }\r\n let rangeSliderMinimum = ConverterNumber(oldestModelYear);\r\n let rangeSliderMaximum = currentYear;\r\n\r\n const defaultSliderValueMin = props.filters.yearMin || rangeSliderMinimum;\r\n const defaultSliderValueMax = props.filters.yearMax || rangeSliderMaximum;\r\n\r\n const [textInputValueMin, setTextInputValueMin] = useState(\r\n ConverterNumber(props.filters.yearMin)\r\n );\r\n const [textInputValueMax, setTextInputValueMax] = useState(\r\n ConverterNumber(props.filters.yearMax)\r\n );\r\n const [sliderCurrentValueMin, setSliderCurrentValueMin] = useState(\r\n defaultSliderValueMin\r\n );\r\n const [sliderCurrentValueMax, setSliderCurrentValueMax] = useState(\r\n defaultSliderValueMax\r\n );\r\n const [isUserUpdatingSlider, setIsUserUpdatingSlider] = useState(false); //prevents issues from category changing\r\n\r\n useEffect(() => {\r\n //update values from prop change, mainly url change from going back/forward in browser\r\n //update yearMin\r\n setTextInputValueMin(ConverterNumber(props.filters.yearMin));\r\n setSliderCurrentValueMin(props.filters.yearMin || defaultSliderValueMin);\r\n //update yearMax\r\n setTextInputValueMax(ConverterNumber(props.filters.yearMax));\r\n setSliderCurrentValueMax(props.filters.yearMax || defaultSliderValueMax);\r\n }, [\r\n props.filters.yearMin,\r\n props.filters.yearMax,\r\n props.famData,\r\n defaultSliderValueMin,\r\n defaultSliderValueMax,\r\n ]);\r\n\r\n /*text box updates*/\r\n const onYearMinChange = (e) => {\r\n const newYearMin = e.target.value;\r\n console.log(\"onYearMinChange\", newYearMin);\r\n setTextInputValueMin(newYearMin); //update its own value\r\n setSliderCurrentValueMin(newYearMin); //update slider to match typed value\r\n\r\n const updatedSearchFilters: Types.searchFilters = {\r\n ...props.filters,\r\n yearMin: newYearMin,\r\n };\r\n props.onSearchFilterChange(updatedSearchFilters); //update filters parent state\r\n };\r\n\r\n const onYearMaxChange = (e) => {\r\n let newYearMax = e.target.value;\r\n\r\n setTextInputValueMax(newYearMax); //update its own value\r\n setSliderCurrentValueMax(newYearMax); //update slider to match typed value\r\n\r\n const updatedSearchFilters: Types.searchFilters = {\r\n ...props.filters,\r\n yearMax: newYearMax,\r\n };\r\n props.onSearchFilterChange(updatedSearchFilters); //update filters parent state\r\n };\r\n\r\n /*slider updates*/\r\n function onSliderBeforeChange(value) {\r\n setIsUserUpdatingSlider(true);\r\n }\r\n function onSliderChange(value) {\r\n const newMin = value[0];\r\n const newMax = value[1];\r\n if (isUserUpdatingSlider) {\r\n setSliderCurrentValueMin(newMin); //update its own value\r\n setSliderCurrentValueMax(newMax); //update its own value\r\n setTextInputValueMin(ConverterNumber(newMin)); //update text input to match slider value\r\n setTextInputValueMax(ConverterNumber(newMax)); //update text input to match slider value\r\n }\r\n }\r\n\r\n function onSliderFinishedChange(value) {\r\n const newMin = value[0];\r\n const newMax = value[1];\r\n const minYearChanged: boolean = newMin !== props.filters.yearMin;\r\n const maxYearChanged: boolean = newMax !== props.filters.yearMax;\r\n if (minYearChanged || maxYearChanged) {\r\n console.log(\"slider change:\", value); //eslint-disable-line\r\n let updatedSearchFilters: Types.searchFilters = {\r\n ...props.filters,\r\n };\r\n if (minYearChanged) {\r\n console.log(\"Min year updated: \" + newMin);\r\n setTextInputValueMin(newMin);\r\n updatedSearchFilters.yearMin = newMin;\r\n }\r\n if (maxYearChanged) {\r\n console.log(\"Max year updated: \" + newMax);\r\n setTextInputValueMax(newMax);\r\n updatedSearchFilters.yearMax = newMax;\r\n }\r\n props.onSearchFilterChange(updatedSearchFilters);\r\n }\r\n setIsUserUpdatingSlider(false);\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {outputEnFr(\"Model year:\", \"Année du modèle:\", props.lang)}\r\n \r\n
    \r\n onYearMinChange(e)}\r\n onKeyPress={props.onKeyPress ? (e) => props.onKeyPress(e) : undefined}\r\n value={textInputValueMin || \"\"}\r\n />\r\n\r\n props.onKeyPress(e) : undefined}\r\n onChange={(e) => onYearMaxChange(e)}\r\n />\r\n {props.showSlider ? (\r\n onSliderBeforeChange(e)}\r\n onChange={(e) => onSliderChange(e)}\r\n onAfterChange={(e) => onSliderFinishedChange(e)}\r\n min={rangeSliderMinimum}\r\n max={rangeSliderMaximum}\r\n ariaLabelGroupForHandles={[\"min model year\", \"max model year\"]}\r\n />\r\n ) : (\r\n <>\r\n )}\r\n \r\n );\r\n};\r\nInputYearMinMax.whyDidYouRender = true;\r\nexport default InputYearMinMax;\r\n","import React, { useState, useEffect } from \"react\";\r\nimport * as Types from \"../../common/Types\";\r\nimport {\r\n outputEnFr,\r\n ConverterNumber,\r\n formatNumberText,\r\n} from \"../../common/HelperFunctions\";\r\nimport Slider from \"rc-slider\";\r\nimport { numberClean } from \"../../common/SEO/SeoFunctions\";\r\nimport _ from \"lodash\";\r\n\r\ntype props_InputHoursMax = {\r\n lang: string;\r\n filters: Types.searchFilters;\r\n onSearchFilterChange;\r\n showSlider: boolean;\r\n famData?; //only needed for slider values/listing page\r\n onKeyPress?; //only needed for home page\r\n};\r\n\r\nconst InputHoursMax = (props: props_InputHoursMax) => {\r\n let lowestHours = 0;\r\n let highestHours = 99999;\r\n if (props.famData && props.showSlider) {\r\n const highestHoursModel = _.maxBy(props.famData, function (o) {\r\n return o.hours;\r\n });\r\n const lowestHoursModel = _.minBy(props.famData, function (o) {\r\n if (o.hours && o.hours > -1) {\r\n return o.hours;\r\n }\r\n });\r\n if (typeof lowestHoursModel != \"undefined\") {\r\n lowestHours = lowestHoursModel.hours;\r\n }\r\n if (typeof highestHoursModel != \"undefined\") {\r\n highestHours = highestHoursModel.hours;\r\n }\r\n }\r\n const defaultSliderValue = props.filters.hoursMax || highestHours;\r\n\r\n const [textInputValue, setTextInputValue] = useState(\r\n ConverterNumber(props.filters.hoursMax)\r\n );\r\n const [isUserUpdatingSlider, setIsUserUpdatingSlider] = useState(false); //prevents issues from category changing\r\n const [sliderCurrentValue, setSliderCurrentValue] =\r\n useState(defaultSliderValue);\r\n\r\n const rangeSliderMinimum = lowestHours;\r\n const rangeSliderMaximum = highestHours;\r\n\r\n useEffect(() => {\r\n //update values from prop change, mainly url change from going back/forward in browser\r\n //update yearMax\r\n setTextInputValue(ConverterNumber(props.filters.hoursMax));\r\n setSliderCurrentValue(props.filters.hoursMax || highestHours);\r\n }, [props.filters.hoursMax, highestHours]);\r\n\r\n const onInputboxChange = (e) => {\r\n const newHoursMax = numberClean(e.target.value);\r\n setTextInputValue(newHoursMax); //update its own value\r\n setSliderCurrentValue(newHoursMax); //update slider to match typed value\r\n updateFilters(newHoursMax); //update filters parent state\r\n };\r\n\r\n function onSliderBeforeChange(value) {\r\n setIsUserUpdatingSlider(true);\r\n }\r\n function onSliderChange(value) {\r\n if (isUserUpdatingSlider) {\r\n //only change if customer controlling slider\r\n setSliderCurrentValue(value); //update its own value\r\n setTextInputValue(ConverterNumber(value)); //update text input to match slider value\r\n }\r\n }\r\n function onSliderFinishedChange(value) {\r\n updateFilters(value); //update filters parent state\r\n setIsUserUpdatingSlider(false);\r\n }\r\n\r\n const updateFilters = (newMaxHours) => {\r\n const updatedSearchFilters: Types.searchFilters = {\r\n ...props.filters,\r\n hoursMax: newMaxHours,\r\n };\r\n props.onSearchFilterChange(updatedSearchFilters);\r\n };\r\n\r\n return (\r\n <>\r\n \r\n\r\n onInputboxChange(e)}\r\n onKeyPress={props.onKeyPress ? (e) => props.onKeyPress(e) : undefined}\r\n value={formatNumberText(textInputValue, props.lang) || \"\"}\r\n />\r\n {props.showSlider ? (\r\n onSliderBeforeChange(e)}\r\n onChange={(e) => onSliderChange(e)}\r\n onAfterChange={(e) => onSliderFinishedChange(e)}\r\n min={rangeSliderMinimum}\r\n max={rangeSliderMaximum}\r\n disabled={rangeSliderMinimum === rangeSliderMaximum}\r\n ariaLabelForHandle={[\"maximum hours\"]}\r\n />\r\n ) : null}\r\n \r\n );\r\n};\r\nInputHoursMax.whyDidYouRender = true;\r\nexport default InputHoursMax;\r\n","import React, { useState, useEffect } from \"react\";\r\nimport * as Types from \"../../common/Types\";\r\nimport {\r\n outputEnFr,\r\n ConverterNumber,\r\n formatNumberText,\r\n} from \"../../common/HelperFunctions\";\r\nimport Slider from \"rc-slider\";\r\nimport { numberClean } from \"../../common/SEO/SeoFunctions\";\r\nimport _ from \"lodash\";\r\n\r\ntype Props_InputPriceMax = {\r\n lang: string;\r\n filters: Types.searchFilters;\r\n famData;\r\n onSearchFilterChange;\r\n};\r\n\r\nconst InputPriceMax = (props: Props_InputPriceMax) => {\r\n let lowestPrice = 0;\r\n let highestPrice = 9999999;\r\n const highestPriceModel = _.maxBy(props.famData, function (o) {\r\n if (o.price && Number(o.price.text) > -1) {\r\n return Number(o.price.text);\r\n }\r\n });\r\n const lowestPriceModel = _.minBy(props.famData, function (o) {\r\n if (o.price && Number(o.price.text) > -1) {\r\n return Number(o.price.text);\r\n }\r\n });\r\n\r\n if (typeof lowestPriceModel != \"undefined\") {\r\n lowestPrice = Number(lowestPriceModel.price.text);\r\n }\r\n if (typeof highestPriceModel != \"undefined\") {\r\n highestPrice = Number(highestPriceModel.price.text);\r\n }\r\n const defaultSliderValue = props.filters.maxPrice || highestPrice;\r\n\r\n const [textInputValue, setTextInputValue] = useState(\r\n ConverterNumber(props.filters.maxPrice)\r\n );\r\n const [sliderCurrentValue, setSliderCurrentValue] =\r\n useState(defaultSliderValue);\r\n const [isUserUpdatingSlider, setIsUserUpdatingSlider] = useState(false); //prevents issues from category changing\r\n\r\n useEffect(() => {\r\n //update values from prop change, mainly url change from going back/forward in browser\r\n //update yearMax\r\n setTextInputValue(ConverterNumber(props.filters.maxPrice));\r\n setSliderCurrentValue(props.filters.maxPrice || highestPrice);\r\n }, [props.filters.maxPrice, highestPrice]);\r\n\r\n const rangeSliderMinimum = lowestPrice;\r\n const rangeSliderMaximum = highestPrice;\r\n\r\n const onInputboxChange = (e) => {\r\n const newMaxPrice = numberClean(e.target.value);\r\n setTextInputValue(newMaxPrice); //update its own value\r\n setSliderCurrentValue(newMaxPrice); //update slider to match typed value\r\n updateFilters(newMaxPrice); //update filters parent state\r\n };\r\n\r\n function onSliderBeforeChange(value) {\r\n setIsUserUpdatingSlider(true);\r\n }\r\n function onSliderChange(value) {\r\n if (isUserUpdatingSlider) {\r\n setSliderCurrentValue(value); //update its own value\r\n setTextInputValue(ConverterNumber(value)); //update text input to match slider value\r\n }\r\n }\r\n\r\n function onSliderFinishedChange(value) {\r\n updateFilters(value); //update filters parent state\r\n setIsUserUpdatingSlider(false);\r\n }\r\n\r\n const updateFilters = (newMaxPrice) => {\r\n const updatedSearchFilters: Types.searchFilters = {\r\n ...props.filters,\r\n maxPrice: newMaxPrice,\r\n };\r\n props.onSearchFilterChange(updatedSearchFilters);\r\n };\r\n\r\n return (\r\n <>\r\n \r\n
    \r\n \r\n $\r\n \r\n onInputboxChange(e)}\r\n value={formatNumberText(textInputValue, props.lang) || \"\"}\r\n />\r\n
    \r\n onSliderBeforeChange(e)}\r\n onChange={(e) => onSliderChange(e)}\r\n onAfterChange={(e) => onSliderFinishedChange(e)}\r\n min={rangeSliderMinimum}\r\n max={rangeSliderMaximum}\r\n disabled={rangeSliderMinimum === rangeSliderMaximum}\r\n ariaLabelForHandle={[\"maximum price\"]}\r\n />\r\n \r\n );\r\n};\r\nInputPriceMax.whyDidYouRender = true;\r\nexport default InputPriceMax;\r\n","import React from \"react\";\r\nimport { outputEnFr } from \"../../common/HelperFunctions\";\r\nimport * as Types from \"../../common/Types\";\r\nimport {\r\n getProvinceName,\r\n saferString,\r\n cityGroupingValue,\r\n cityDisplayName,\r\n badCityCheck,\r\n} from \"../../common/HelperFunctions\";\r\nimport _ from \"lodash\";\r\nimport { isEnvironmentTCAT } from \"../../common/Constants\";\r\n\r\ntype Props_SelectProvinceAndCity = {\r\n lang: string;\r\n filters: Types.searchFilters;\r\n onSearchFilterChange;\r\n famData;\r\n};\r\n\r\ntype type_citylist = {\r\n value: string;\r\n displayName: string;\r\n province: string;\r\n};\r\ntype type_provincelist = {\r\n value: string;\r\n displayName: string;\r\n};\r\nexport default class SelectProvinceAndCity extends React.PureComponent {\r\n onCitySelectboxChange = (e) => {\r\n let newCity = e.target.value;\r\n if (newCity === \"\") {\r\n newCity = null;\r\n }\r\n const updatedSearchFilters: Types.searchFilters = {\r\n ...this.props.filters,\r\n city: newCity,\r\n };\r\n\r\n this.props.onSearchFilterChange(updatedSearchFilters);\r\n };\r\n\r\n onProvinceSelectChange = (e) => {\r\n let newProvince = e.target.value;\r\n let selectedCity = this.props.filters.city;\r\n if (newProvince === \"\") {\r\n newProvince = null;\r\n }\r\n\r\n const foundCityInList = this.getCityList(newProvince).find(\r\n (o) => o.value === selectedCity\r\n );\r\n if (selectedCity && !foundCityInList) {\r\n //reset city to null if not in list due to province change\r\n selectedCity = null;\r\n }\r\n\r\n const updatedSearchFilters: Types.searchFilters = {\r\n ...this.props.filters,\r\n province: newProvince,\r\n city: selectedCity,\r\n };\r\n\r\n this.props.onSearchFilterChange(updatedSearchFilters);\r\n };\r\n\r\n getCityList = (checkProv?) => {\r\n //only shows current province if one is selected\r\n //checkProv allows to get list for specific province instead of what is in filters\r\n const UsedDataCities = _.chain(this.props.famData)\r\n .sortBy(function (o) {\r\n return cityGroupingValue(o.city);\r\n })\r\n .groupBy(function (o) {\r\n return cityGroupingValue(o.city);\r\n })\r\n .value();\r\n let filters_Province = this.props.filters.province;\r\n if (checkProv) {\r\n filters_Province = checkProv;\r\n }\r\n let list_cities: type_citylist[] = [];\r\n\r\n Object.keys(UsedDataCities).forEach(function (x) {\r\n if (UsedDataCities[x][0] == null) {\r\n return;\r\n }\r\n var curCity = badCityCheck(UsedDataCities[x][0][\"city\"]);\r\n var curProv = saferString(UsedDataCities[x][0][\"state\"]);\r\n if (\r\n curCity === \"N/A\" ||\r\n (filters_Province && filters_Province !== curProv)\r\n ) {\r\n return;\r\n }\r\n list_cities.push({\r\n value: cityGroupingValue(curCity),\r\n displayName: cityDisplayName(curCity),\r\n province: curProv,\r\n });\r\n });\r\n\r\n return list_cities;\r\n };\r\n\r\n getProvincesList = () => {\r\n const curLang = this.props.lang;\r\n\r\n let UsedDataProvinces = _.chain(this.props.famData)\r\n .sortBy(function (o) {\r\n return _.deburr(getProvinceName(o.state, curLang));\r\n })\r\n .groupBy(\"state\")\r\n .value();\r\n\r\n let list_provinces: type_provincelist[] = [];\r\n\r\n Object.keys(UsedDataProvinces).forEach(function (x) {\r\n if (UsedDataProvinces[x][0] == null) {\r\n return;\r\n }\r\n const curProv = saferString(UsedDataProvinces[x][0].state);\r\n let provinceDisplayName = getProvinceName(curProv, curLang); //get different display name if abbreviation OR translation needed\r\n\r\n if (\r\n isEnvironmentTCAT &&\r\n (curProv === \"IL\" || provinceDisplayName === \"Other\")\r\n ) {\r\n return;\r\n }\r\n if (\r\n list_provinces.findIndex((o) => o.displayName === provinceDisplayName) <\r\n 0\r\n ) {\r\n //Add to array if not includes display name already\r\n list_provinces.push({\r\n value: curProv,\r\n displayName: provinceDisplayName,\r\n });\r\n }\r\n });\r\n return list_provinces;\r\n };\r\n\r\n getCitySelectOptions = () => {\r\n let selectOptions_cities = [\r\n ,\r\n ];\r\n\r\n const cityList: type_citylist[] = this.getCityList();\r\n\r\n Object.keys(cityList).forEach(function (x) {\r\n selectOptions_cities.push(\r\n \r\n );\r\n });\r\n\r\n return selectOptions_cities;\r\n };\r\n\r\n getProvincesSelectOptions = () => {\r\n let selectOptions_provinces = [\r\n ,\r\n ];\r\n\r\n const provList: type_provincelist[] = this.getProvincesList();\r\n\r\n Object.keys(provList).forEach(function (x) {\r\n selectOptions_provinces.push(\r\n \r\n );\r\n });\r\n return selectOptions_provinces;\r\n };\r\n\r\n render() {\r\n return (\r\n <>\r\n <>\r\n \r\n this.onProvinceSelectChange(e)}\r\n value={saferString(this.props.filters.province)}\r\n >\r\n {this.getProvincesSelectOptions()}\r\n \r\n\r\n \r\n this.onCitySelectboxChange(e)}\r\n value={saferString(this.props.filters.city)}\r\n >\r\n {this.getCitySelectOptions()}\r\n \r\n\r\n
    \r\n \r\n \r\n );\r\n }\r\n}\r\n","import React from \"react\";\r\nimport * as Constants from \"../../common/Constants\";\r\nimport * as Types from \"../../common/Types\";\r\nimport { outputEnFr } from \"../../common/HelperFunctions\";\r\n\r\ntype Props_SelectClass = {\r\n lang: string;\r\n filters: Types.searchFilters;\r\n onSearchFilterChange;\r\n handleUpdateCatClass;\r\n};\r\n\r\nconst SelectClass = (props: Props_SelectClass) => {\r\n const onClassChange = (e) => {\r\n const newClass = e.target.value;\r\n\r\n const updatedSearchFilters: Types.searchFilters = {\r\n ...props.filters,\r\n categoryClass: newClass,\r\n category: null,\r\n };\r\n\r\n props.onSearchFilterChange(updatedSearchFilters);\r\n props.handleUpdateCatClass(newClass);\r\n };\r\n\r\n return (\r\n <>\r\n \r\n onClassChange(e)}\r\n //@ts-ignore - due to value tag\r\n value={props.filters.categoryClass}\r\n >\r\n \r\n \r\n \r\n \r\n );\r\n};\r\nSelectClass.whyDidYouRender = true;\r\nexport default SelectClass;\r\n","import React from \"react\";\r\nimport * as Types from '../../common/Types';\r\nimport Collapse from \"@kunukn/react-collapse\";\r\nimport { outputEnFr} from \"../../common/HelperFunctions\";\r\nimport SelectCategory from \"../components/SelectCategory\";\r\nimport CheckboxCertified from \"../components/CheckboxCertified\";\r\nimport SelectManufacturer from \"../components/SelectManufacturer\";\r\nimport InputYearMinMax from \"../components/InputYearMinMax\";\r\nimport InputHoursMax from \"../components/InputHoursMax\";\r\nimport InputPriceMax from \"../components/InputPriceMax\";\r\nimport SelectProvinceAndCity from \"../components/SelectProvinceAndCity\";\r\nimport SelectClass from \"../components/SelectClass\";\r\nimport { isEnvironmentTCAT } from \"../../common/Constants\";\r\n\r\n\r\n\r\nexport type Props_FiltersSide = {\r\n lang: string,\r\n filters: Types.searchFilters,\r\n onSearchFilterChange,\r\n handleUpdateCatClass,\r\n jsonDataGroups,\r\n famData,\r\n searchResults,\r\n onClearFilters,\r\n filtersOpenMobile: boolean\r\n toggleFiltersOpenMobile\r\n}\r\n\r\nclass FiltersSide extends React.PureComponent {\r\n\r\n render() { \r\n return ( <>\r\n

    this.props.toggleFiltersOpenMobile(e)}\r\n style={this.props.filters.viewDeals || this.props.filters.viewFaves ? { display: \"none\" } : {}}>\r\n \r\n {this.props.filtersOpenMobile ?\r\n outputEnFr(\"Hide search filters\", \"Masquer les filtres de recherche\", this.props.lang) :\r\n outputEnFr(\"Show advanced filters\", \"Afficher les filtres de recherche\", this.props.lang)}\r\n  \r\n {this.props.filtersOpenMobile ? : }\r\n

    \r\n \r\n
    \r\n
    \r\n
    \r\n {isEnvironmentTCAT ?\r\n : null}\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
    \r\n\r\n
    \r\n
    \r\n
    \r\n\r\n \r\n )\r\n }\r\n\r\n}\r\nexport default FiltersSide;","import React from \"react\";\r\nimport { Helmet } from \"react-helmet\";\r\nimport ListingHeader from \"./sections/ListingHeader\";\r\nimport {\r\n setBodyClass,\r\n getSearchFiltersFromUrl,\r\n outputEnFr,\r\n} from \"../common/HelperFunctions\";\r\nimport * as Types from \"../common/Types\";\r\nimport * as Constants from \"../common/Constants\";\r\nimport { setUpPaging, getBodyClassNames } from \"./functions/listingFunctions\";\r\nimport Pagination from \"react-js-pagination\";\r\nimport getAllProductsFromCategory from \"./functions/getAllProductsFromCategory\";\r\nimport getFilteredSearchResults from \"./functions/getFilteredSearchResults\";\r\nimport CTASection from \"../common/Sections/CTASection\";\r\nimport {\r\n getNewUrlFromFilters,\r\n getMetaTitle,\r\n getSeoContentByCatCode,\r\n getListingPageUrl,\r\n} from \"../common/SEO/SeoFunctions\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport SeoTextBottom from \"./sections/SeoTextBottom\";\r\nimport \"../../css/listingcss.scss\";\r\nimport \"rc-slider/assets/index.css\";\r\nimport FiltersTop from \"./sections/FiltersTop\";\r\nimport FiltersSide from \"./sections/FiltersSide\";\r\nimport _ from \"lodash\";\r\nconst SearchResultListings = React.lazy(\r\n () => import(\"./sections/SearchResultListings\")\r\n);\r\n\r\ntype Props_Listings = {\r\n lang: string;\r\n catCodeFromUrl: string;\r\n currentCatClass;\r\n handleUpdateCatClass;\r\n jsonDataGroups;\r\n urlParams: string[];\r\n history?; //from withRouter\r\n};\r\ntype State_Listings = {\r\n searchFilters: Types.searchFilters; //object of user selected search filters\r\n famData; //contains all products in current category, not affected by search filters\r\n searchResults; //contains search filtered list of products, what user sees\r\n paging: Types.pagingState; //paging state, altered when user changes page\r\n filtersOpenMobile: boolean; //advanced filter dropdown, hidden by default on mobile\r\n isUserTyping: boolean;\r\n};\r\n\r\nclass ListingsPage extends React.PureComponent {\r\n constructor(props) {\r\n super(props);\r\n console.log(\"Construct ListingsPage \", props);\r\n window.scrollTo(0, 0);\r\n\r\n const defaultSearchFilters = getSearchFiltersFromUrl(\r\n props.currentCatClass,\r\n props.catCodeFromUrl,\r\n props.urlParams\r\n );\r\n\r\n let famData;\r\n let searchResults;\r\n if (this.props.jsonDataGroups) {\r\n famData = getAllProductsFromCategory(\r\n defaultSearchFilters,\r\n this.props.jsonDataGroups\r\n );\r\n\r\n if (famData.length > 0) {\r\n searchResults = getFilteredSearchResults(defaultSearchFilters, famData);\r\n }\r\n }\r\n const initialState: State_Listings = {\r\n searchResults: searchResults,\r\n searchFilters: defaultSearchFilters,\r\n famData: famData,\r\n filtersOpenMobile: false,\r\n paging: setUpPaging(1, searchResults ? searchResults.length : 0),\r\n isUserTyping: false,\r\n };\r\n console.log(\"ListingsPage setting state in constructor\", initialState);\r\n //set initial state\r\n this.state = initialState;\r\n\r\n //console.log(\"Setting canonical url \"+getCanonicalUrlListingPg(this.props.lang, props.catCodeFromUrl) );\r\n }\r\n\r\n componentDidUpdate(prevProps, prevState) {\r\n if (this.props.jsonDataGroups && this.props !== prevProps) {\r\n console.log(\"ListingsPage componentDidUpdate()\", this.props, prevProps);\r\n let searchFilters = this.state.searchFilters;\r\n let currentPage = 1;\r\n if (prevProps.urlParams !== this.props.urlParams) {\r\n searchFilters = getSearchFiltersFromUrl(\r\n this.props.currentCatClass,\r\n this.props.catCodeFromUrl,\r\n this.props.urlParams\r\n );\r\n }\r\n if (typeof this.props.urlParams[Constants.PARAMS.PAGE] !== \"undefined\") {\r\n currentPage = this.props.urlParams[Constants.PARAMS.PAGE];\r\n }\r\n if (\r\n !_.isEqual(searchFilters, this.state.searchFilters) ||\r\n currentPage !== this.state.paging.curPage ||\r\n this.props.jsonDataGroups !== prevProps.jsonDataGroups\r\n ) {\r\n //SOMETHING HAS CHANGED, UPDATE STATE\r\n const famData = getAllProductsFromCategory(\r\n searchFilters,\r\n this.props.jsonDataGroups\r\n );\r\n const searchResults = getFilteredSearchResults(searchFilters, famData);\r\n const newState: State_Listings = {\r\n ...this.state,\r\n searchFilters: searchFilters,\r\n famData: famData,\r\n searchResults: searchResults,\r\n paging: setUpPaging(currentPage, searchResults.length),\r\n };\r\n console.log(\r\n \"ListingsPage setting new state from componentDidUpdate:\",\r\n newState,\r\n prevState\r\n );\r\n this.setState(newState);\r\n }\r\n }\r\n\r\n if (\r\n !this.state.isUserTyping &&\r\n prevState.isUserTyping &&\r\n prevState.searchFilters === this.state.searchFilters\r\n ) {\r\n console.log(\r\n \"Done typing, update url now\",\r\n this.state.searchFilters.keyword\r\n );\r\n this.pushUpdatedUrl(this.state.searchFilters, this.state.paging.curPage);\r\n }\r\n }\r\n\r\n getMetaDescTag = (catCode: string) => {\r\n const seoText: Types.types_seoData = getSeoContentByCatCode(catCode);\r\n const metaText =\r\n this.props.lang === \"fr\" ? seoText.FR.Meta : seoText.EN.Meta;\r\n return metaText;\r\n };\r\n getMetaTitleTag = (catCode: string | null) => {\r\n let categoryName = this.getCategoryDisplayName(catCode);\r\n if (Constants.isEnvironmentBFERENTAL) {\r\n let categoryName = \"Rental Fleet Sell-Off\";\r\n return getMetaTitle(\r\n categoryName,\r\n this.props.lang,\r\n this.state.searchFilters\r\n );\r\n } else {\r\n return getMetaTitle(\r\n categoryName,\r\n this.props.lang,\r\n this.state.searchFilters\r\n );\r\n }\r\n };\r\n getCategoryDisplayName = (catCode: string | null) => {\r\n const seoText: Types.types_seoData = getSeoContentByCatCode(catCode);\r\n const categoryName =\r\n this.props.lang === \"fr\" ? seoText.FR.Name : seoText.EN.Name;\r\n return categoryName;\r\n };\r\n getCtaImageSrc = (catCode: string | null) => {\r\n const seoText: Types.types_seoData = getSeoContentByCatCode(catCode);\r\n return seoText.CtaImage;\r\n };\r\n\r\n handleSearchFilterChange = (updatedSearchFilters: Types.searchFilters) => {\r\n console.log(\"handleSearchFilterChange()\", updatedSearchFilters);\r\n\r\n let setPageTo = this.state.paging.curPage;\r\n if (updatedSearchFilters.category !== this.state.searchFilters.category) {\r\n //category has been changed\r\n setPageTo = 1;\r\n }\r\n\r\n const famData = getAllProductsFromCategory(\r\n updatedSearchFilters,\r\n this.props.jsonDataGroups\r\n );\r\n console.log(\"Search filter change, famData now:\", famData);\r\n const searchResults = getFilteredSearchResults(\r\n updatedSearchFilters,\r\n famData\r\n );\r\n console.log(\"Search filter change, searchResults now:\", searchResults);\r\n if (\r\n updatedSearchFilters.keyword !== this.state.searchFilters.keyword ||\r\n updatedSearchFilters.yearMax !== this.state.searchFilters.yearMax ||\r\n updatedSearchFilters.yearMin !== this.state.searchFilters.yearMin ||\r\n updatedSearchFilters.hoursMax !== this.state.searchFilters.hoursMax ||\r\n updatedSearchFilters.maxPrice !== this.state.searchFilters.maxPrice\r\n ) {\r\n //typed inputs only - adds delay before updating URL\r\n this.setUserIsTyping();\r\n } else {\r\n //update URL right away\r\n this.pushUpdatedUrl(updatedSearchFilters, setPageTo);\r\n }\r\n\r\n const newState = {\r\n ...this.state,\r\n famData: famData,\r\n searchResults: searchResults,\r\n searchFilters: updatedSearchFilters,\r\n paging: setUpPaging(setPageTo, searchResults.length),\r\n isUserTyping: true,\r\n };\r\n\r\n console.log(\"Search filter change, newState now:\", newState);\r\n\r\n this.setState(newState);\r\n };\r\n\r\n pushUpdatedUrl(updatedSearchFilters: Types.searchFilters, setPageTo: number) {\r\n const newUrl = getNewUrlFromFilters(\r\n this.props.lang,\r\n updatedSearchFilters,\r\n setPageTo\r\n );\r\n const history = this.props.history;\r\n\r\n const newMetaTitle = this.getMetaTitleTag(updatedSearchFilters.category);\r\n document.title = newMetaTitle; //need to update before history push for GTM\r\n console.log(\"Pushing newUrl\", newUrl);\r\n history.push(newUrl);\r\n }\r\n\r\n //typing timer for updating url after X seconds\r\n typingTimer;\r\n setUserIsTyping = () => {\r\n const urlUpdateDelay = 2000; //ms\r\n clearTimeout(this.typingTimer);\r\n this.typingTimer = setTimeout(this.doneTyping, urlUpdateDelay);\r\n };\r\n doneTyping = () => {\r\n if (this.state.isUserTyping) {\r\n this.setState({ ...this.state, isUserTyping: false });\r\n }\r\n };\r\n\r\n handlePageChange = (setToPage) => {\r\n this.pushUpdatedUrl(this.state.searchFilters, setToPage);\r\n this.setState({\r\n ...this.state,\r\n paging: setUpPaging(setToPage, this.state.searchResults.length),\r\n });\r\n };\r\n\r\n handleClearSearchFilters = () => {\r\n const resetSearchFilters: Types.searchFilters = {\r\n ...this.state.searchFilters,\r\n category: null,\r\n make: null,\r\n maxPrice: null,\r\n keyword: \"\",\r\n province: null,\r\n yearMin: null,\r\n yearMax: null,\r\n hoursMax: null,\r\n city: null,\r\n certifiedOnly: false,\r\n };\r\n console.log(\"Clear filters now\", resetSearchFilters);\r\n this.handleSearchFilterChange(resetSearchFilters);\r\n };\r\n\r\n toggleFiltersOpenMobile = () => {\r\n this.setState({\r\n ...this.state,\r\n filtersOpenMobile: !this.state.filtersOpenMobile,\r\n });\r\n };\r\n\r\n getCanonicalUrl = () => {\r\n let canonicalUrl =\r\n Constants.DOMAINBASE +\r\n getListingPageUrl(\r\n this.props.lang,\r\n this.state.searchFilters.category,\r\n false\r\n );\r\n if (\r\n this.props.currentCatClass === Constants.CLASS_POWER &&\r\n this.props.catCodeFromUrl !== Constants.URLPOWER_SLUG\r\n ) {\r\n canonicalUrl +=\r\n \"?class=\" +\r\n outputEnFr(\r\n Constants.URLPOWER_EN,\r\n Constants.URLPOWER_FR,\r\n this.props.lang\r\n );\r\n }\r\n return canonicalUrl;\r\n };\r\n\r\n render() {\r\n setBodyClass(getBodyClassNames(this.state.searchFilters));\r\n return (\r\n <>\r\n \r\n \r\n {this.getMetaTitleTag(this.props.catCodeFromUrl)}\r\n \r\n {this.state.searchFilters.viewFaves ? (\r\n \r\n ) : null}\r\n \r\n {/* {this.state.searchFilters.viewDeals ? (\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
    \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 this.handlePageChange(e)}\r\n hideFirstLastPages={true}\r\n innerClass=\"ul-pagination\"\r\n previousLabel=\"test\"\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 withRouter(ListingsPage);\r\n","import React from \"react\";\r\nimport { setBodyClass, outputEnFr } from \"../common/HelperFunctions\";\r\nimport * as Constants from \"../common/Constants\";\r\nimport CTASection from \"../common/Sections/CTASection\";\r\nimport { Helmet } from \"react-helmet\";\r\nimport { Link } from \"react-router-dom\";\r\n\r\ntype Props_CCUPage = {\r\n lang: string\r\n}\r\nexport default class CCUPage extends React.PureComponent {\r\n\r\n render() {\r\n setBodyClass([\"pgListing\", \"pgCCU\"]);\r\n return (<>\r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n {outputEnFr(\"Cat Certified Used & CVA\", \"Équipement d'occasion certifié Cat et EVC\", this.props.lang)}\r\n

    \r\n

    \r\n {outputEnFr(\"Used heavy equipment you can rely on, value you can trust.\",\r\n \"De l’équipement lourd usagé fiable et une valeur sur laquelle vous pouvez compter.\",\r\n this.props.lang)}\r\n

    \r\n

    \r\n {outputEnFr(\"SHOPPING FOR USED EQUIPMENT? CHOOSE A MACHINE THAT PASSES OUR TOUGHEST TESTS.\",\r\n \"À LA RECHERCHE D’ÉQUIPEMENT USAGÉ? CHOISISSEZ UNE MACHINE QUI A PASSÉ LES TESTS LES PLUS EXIGEANTS.\",\r\n this.props.lang)}\r\n

    \r\n
    \r\n\r\n {this.props.lang === \"en\" ?

    Before you put a Cat® Certified Used machine to work, we put it to the test.\r\n Each low-hour, well-maintained model must survive a rigorous inspection that\r\n includes up to 140 checkpoints before it can even receive a “certified” status.\r\n Once a machine passes the test, we service it with Cat parts, complete all\r\n required maintenance, back it with a Caterpillar warranty, and turn on the\r\n connectivity (if equipped).

    :\r\n

    Avant de mettre au travail une machine usagée certifiée Cat®, nous la testons.\r\n Chacun de nos modèles, à faible utilisation et entretenus régulièrement, doivent subir\r\n une inspection rigoureuse qui comprend jusqu'à 140 points de contrôle avant que nous\r\n puissions les considérer comme certifiés. Lorsqu’une machine passe ce test, nous la\r\n réparons avec des pièces Cat authentiques, nous effectuons tous les entretiens requis,\r\n nous fournissons une garantie Caterpillar et nous activons sa connectivité (le cas échéant).

    }\r\n\r\n {/*Button linking to machine listings */}\r\n
    \r\n \r\n \r\n
    \r\n\r\n {this.props.lang === \"en\" ? \"Discover our Cat certified\" : \"Voir nos Cat certifiés\"} \r\n
    \r\n \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n

    {outputEnFr(\"Cat Certified Used:\", \"Équipement d'occasion certifié Cat :\", this.props.lang)}\r\n

    \r\n

    {outputEnFr(\"Proven reliability at unbeatable value\", \"Fiabilité garantie à une valeur imbattable\", this.props.lang)}

    \r\n\r\n

    \r\n {outputEnFr(\"Cat Certified Used machines are well-maintained, fully inspected, and ready to work.\",\r\n \"Nos machines usagées certifiées Cat sont bien entretenues, entièrement inspectées et prêtes à travailler.\", this.props.lang)}\r\n


    \r\n {this.props.lang === \"en\" ?\r\n
      \r\n
    • Latest model, low-hour
    • \r\n
    • 140-point inspected
    • \r\n
    • Serviced with genuine Cat parts
    • \r\n
    • Activated Product Link
    • \r\n
    • Includes 1-year warranty (powertrain + hydraulics)
    • \r\n
    \r\n :\r\n
      \r\n
    • Dernier modèle/peu d’heures
    • \r\n
    • Inspection à 140 points
    • \r\n
    • Entretenues avec des pièces Cat authentiques
    • \r\n
    • Activation de Product Link
    • \r\n
    • Comprend une garantie d’un an (groupe motopropulseur + hydraulique)
    • \r\n
    \r\n }\r\n
    \r\n\r\n

    \r\n {outputEnFr(\"For ultimate peace of mind, add a CVA\", \"Pour l’esprit tranquille, ajoutez une EVC\", this.props.lang)}\r\n

    \r\n

    \r\n {outputEnFr(\" A Toromont Cat Customer Value Agreement (CVA) is the easiest way to get the most value out of your machine over its lifespan. Choose the “Do it yourself” maintenance to pick up your parts, or the “Do it for me” service to have our experts service your equipment on-site after-hours.\",\r\n \"Une entente de valeur pour les clients de Toromont Cat (EVC) est la meilleure façon de tirer parti de votre machine pendant sa durée de vie. Choisissez l’entretien « Je le fais moi-même » pour les pièces prêtes à ramasser ou choisissez le service « Faites-le pour moi » afin que nos experts entretiennent votre équipement sur site hors des heures d'ouverture.\",\r\n this.props.lang)}\r\n\r\n


    \r\n

    {outputEnFr(\"Every CVA includes:\", \"Chaque EVC comprend :\", this.props.lang)}


    \r\n\r\n {this.props.lang === \"en\" ?\r\n
      \r\n
    • Preventative maintenance parts
    • \r\n
    • Annual TA1 inspections
    • \r\n
    • Access to the Toromont Cat Hotline
    • \r\n
    • Discounted ET and SIS software licenses
    • \r\n
    • Extended warranty coverage\r\n (powertrain + hydraulics)
    • \r\n
    • And much more!
    • \r\n
    \r\n :\r\n
      \r\n
    • des pièces d'entretien préventif
    • \r\n
    • des inspections annuelles TA1
    • \r\n
    • l'accès à la ligne d’assistance de Toromont Cat
    • \r\n
    • des licences des logiciels ET et SIS à prix réduit
    • \r\n
    • une prolongation de garantie (groupe motopropulseur + hydraulique)
    • \r\n
    • et bien plus!
    • \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}","import React from \"react\";\r\nimport { setBodyClass, outputEnFr } from \"../common/HelperFunctions\";\r\nimport * as Constants from \"../common/Constants\";\r\nimport CTASection from \"../common/Sections/CTASection\";\r\nimport { Helmet } from \"react-helmet\";\r\nimport { getMetaTitle, getSeoContentByCatCode } from \"../common/SEO/SeoFunctions\";\r\nimport { types_seoData } from \"../common/Types\";\r\n \r\ntype Props_ConsignmentPage = {\r\n lang: string\r\n}\r\nexport default class ConsignmentPage extends React.PureComponent {\r\n\r\n\r\n\r\n getMetaDescTag = () => {\r\n const seoText: types_seoData = getSeoContentByCatCode(Constants.URLCONSIGNMENT);\r\n const metaText =\r\n this.props.lang === \"fr\" ? seoText.FR.Meta : seoText.EN.Meta;\r\n return metaText;\r\n }\r\n getMetaTitleTag = () => {\r\n const categoryName = this.getCategoryDisplayName();\r\n return getMetaTitle(categoryName, this.props.lang);\r\n }\r\n getCategoryDisplayName = () => {\r\n const seoText: types_seoData = getSeoContentByCatCode(Constants.URLCONSIGNMENT);\r\n const categoryName = this.props.lang === \"fr\" ? seoText.FR.Name : seoText.EN.Name;\r\n return categoryName;\r\n }\r\n\r\n render() {\r\n setBodyClass([\"pgListing\", \"pgConsignment\"]);\r\n return (<>\r\n \r\n \r\n {this.getMetaTitleTag()}\r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n {outputEnFr(\"Machine Consignment\",\r\n \"Programme de consignation d'équipement\", this.props.lang)}\r\n

    \r\n

    \r\n {outputEnFr(\"Toromont Cat Equipment Consignment: We do the marketing, you get the sale.\",\r\n \"Programme de consignation d'équipement Toromont Cat : Nous faisons la promotion, vous profitez de la vente.\", this.props.lang)}\r\n

    \r\n
    \r\n {this.props.lang === \"en\" ?\r\n

    \r\n Don’t let the competitor dictate the selling price of your machine.\r\n Our consignment program gives you an easy and reliable way to get fair\r\n market value for your used heavy equipment, with no risk and no rush.\r\n

    :\r\n

    \r\n Ne laissez pas votre concurrent déterminer le prix de vente de votre machine. Notre programme de consignation vous offre un moyen simple et fiable d'obtenir la juste valeur marchande de votre équipement lourd usagé, sans risque et sans stress.\r\n

    }\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n\r\n {this.props.lang === \"en\" ? <>\r\n

    \r\n Toromont Cat Equipment Consignment includes:\r\n

    \r\n
      \r\n
    • No-charge equipment inspection
    • \r\n
    • Our experienced sales force works to sell your machine
    • \r\n
    • Promotion through our 33 locations across Eastern Canada
    • \r\n
    • Listing on used.toromontcat.com
    • \r\n
    : <>\r\n

    \r\n Notre programme de consignation d'équipement Toromont Cat inclut les avantages suivants :\r\n

    \r\n
      \r\n
    • Inspection gratuite de l'équipement
    • \r\n
    • Notre équipe des ventes expérimentée travaille pour vendre votre machine
    • \r\n
    • Promotion de votre équipement dans nos 33 succursales dans l'Est du Canada
    • \r\n
    • Affichage sur used.toromontcat.com/fr
    • \r\n
    }\r\n\r\n
    \r\n

    \r\n {outputEnFr(\" Take control of your used equipment sale to get the highest return on your investment.\",\r\n \"Prenez le contrôle de votre vente d'équipement usagé pour obtenir le meilleur rendement sur investissement.\",\r\n this.props.lang)}\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}","import React from \"react\";\r\nimport { setBodyClass, outputEnFr } from \"../common/HelperFunctions\";\r\nimport { Link } from \"react-router-dom\";\r\nimport { PARAMS } from \"../common/Constants\";\r\nimport { Helmet } from \"react-helmet\";\r\n\r\ntype Props_EmailConfirm = {\r\n lang: string,\r\n urlParams: string[]\r\n}\r\nclass EmailConfirm extends React.PureComponent {\r\n\r\n render() {\r\n setBodyClass([\"pgListing\", \"pgEmailConfirm\"]);\r\n const isFooterSubscribe = (this.props.urlParams[PARAMS.FORM] === \"footer\");\r\n\r\n console.log(\"Rendering EmailConfirm Page\", isFooterSubscribe);\r\n\r\n return (<>\r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
     
    \r\n

    \r\n {outputEnFr(\"Thank you!\", \"Merci !\", this.props.lang)}\r\n\r\n


    \r\n

    \r\n\r\n {isFooterSubscribe ?\r\n outputEnFr(\"You are now subscribed to email updates from Toromont Cat.\",\r\n \"Vous êtes maintenant inscrit aux mises à jour par courriel de Toromont Cat.\",\r\n this.props.lang)\r\n :\r\n outputEnFr(<>Thank you for contacting Toromont Cat.
    One of our equipment specialists will be in touch with you soon.,\r\n <>Merci d’avoir contacté Toromont Cat.
    Un de nos spécialistes en équipement communiquera avec vous sous peu.,\r\n this.props.lang)\r\n }\r\n

    \r\n \r\n « Back to Toromont Cat Used Equipment\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\nexport default EmailConfirm;","import React from \"react\";\r\nimport * as Types from \"../../common/Types\";\r\nimport SelectManufacturer from \"../../listings/components/SelectManufacturer\";\r\nimport InputHoursMax from \"../../listings/components/InputHoursMax\";\r\nimport InputYearMinMax from \"../../listings/components/InputYearMinMax\";\r\nimport Collapse from \"@kunukn/react-collapse\";\r\n\r\ntype Props_AdvancedFilters = {\r\n lang: string;\r\n filters: Types.searchFilters;\r\n onSearchFilterChange;\r\n open: boolean;\r\n handleKeyPressSubmitSearch;\r\n};\r\n\r\nconst AdvancedFilters = ({\r\n lang,\r\n filters,\r\n onSearchFilterChange,\r\n open,\r\n handleKeyPressSubmitSearch,\r\n}: Props_AdvancedFilters) => {\r\n return (\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\nexport default AdvancedFilters;\r\n","import React from \"react\";\r\nimport { outputEnFr } from \"../../common/HelperFunctions\";\r\nimport { searchFilters } from \"../../common/Types\";\r\n\r\ntype Props_MainSearch = {\r\n lang: string;\r\n filters: searchFilters;\r\n onSearchFilterChange;\r\n disabled: boolean;\r\n handleKeyPressSubmitSearch;\r\n handleSubmitSearch;\r\n};\r\n\r\nconst MainSearch = (props: Props_MainSearch) => {\r\n const onKeywordSearch = (e) => {\r\n const newKeywords = e.target.value;\r\n\r\n const updatedSearchFilters: searchFilters = {\r\n ...props.filters,\r\n keyword: newKeywords,\r\n };\r\n\r\n props.onSearchFilterChange(updatedSearchFilters);\r\n };\r\n\r\n return (\r\n
    \r\n \r\n \r\n props.handleSubmitSearch()}\r\n >\r\n \r\n \r\n
    \r\n
     
    \r\n \r\n );\r\n};\r\nMainSearch.whyDidYouRender = true;\r\nexport default MainSearch;\r\n","import React from \"react\";\r\nimport {\r\n isEnvironmentBFE,\r\n isEnvironmentBFERENTAL,\r\n isEnvironmentJOBSITE,\r\n} from \"../../common/Constants\";\r\nimport { outputEnFr } from \"../../common/HelperFunctions\";\r\n\r\nconst fadeInClass = navigator.userAgent === \"ReactSnap\" ? \"fade-in\" : \"\";\r\n\r\nconst IntroText = ({ lang }) => {\r\n return (\r\n
    \r\n

    \r\n {isEnvironmentBFE\r\n ? outputEnFr(\r\n \"Battlefield Used Equipment\",\r\n \"Location d’équipement Battlefield\",\r\n lang\r\n )\r\n : isEnvironmentBFERENTAL\r\n ? outputEnFr(\r\n \"Rental Fleet Sell-Off\",\r\n \"Vente de flotte de location\",\r\n lang\r\n )\r\n : outputEnFr(\r\n \"Used Tools & Equipment\",\r\n \"Outils & Équipements d'Occasion\",\r\n lang\r\n )}\r\n

    \r\n

    \r\n {isEnvironmentBFE\r\n ? outputEnFr(\r\n \"A complete line of Used Cat Compact Equipment for your needs.\",\r\n \"Une gamme complète d'équipements compacts Cat d'occasion pour vos besoins.\",\r\n lang\r\n )\r\n : isEnvironmentBFERENTAL || isEnvironmentJOBSITE\r\n ? outputEnFr(\r\n \"A complete line of rental fleet items for your needs.\",\r\n \"Une gamme complète d'articles de flotte de location pour vos besoins.\",\r\n lang\r\n )\r\n : outputEnFr(\r\n \"A complete line of used equipment for your needs.\",\r\n \"Une gamme complète d'équipement usagé pour tous vos besoins.\",\r\n lang\r\n )}\r\n

    \r\n\r\n \r\n {outputEnFr(\"We have it all.\", \"Tout est là.\", lang)}\r\n \r\n
    \r\n
    \r\n );\r\n};\r\n\r\nexport default IntroText;\r\n","import React from \"react\";\r\nimport { outputEnFr } from \"../../common/HelperFunctions\";\r\n\r\ntype Props_FoundCounText = {\r\n lang: string;\r\n count: number;\r\n};\r\n\r\nconst FoundCountText = (props: Props_FoundCounText) => {\r\n if (props.count === -1) {\r\n return <>;\r\n } else {\r\n const nonefoundclass = props.count > 0 ? \"\" : \"noneFound\";\r\n\r\n return (\r\n
    \r\n {/* {\r\n props.count === 0 ? \r\n {outputEnFr(\r\n \"Please adjust your search - \",\r\n \"Veuillez ajuster votre recherche - \",\r\n props.lang\r\n )}\r\n : <>\r\n } */}\r\n\r\n \r\n {props.count} \r\n {outputEnFr(\"Products Found\", \"équipements trouvés\", props.lang)}\r\n \r\n
    \r\n );\r\n }\r\n};\r\nexport default FoundCountText;\r\n","import React from \"react\";\r\nimport { outputEnFr } from \"../../common/HelperFunctions\";\r\nimport AdvancedFilters from \"../components/AdvancedFilters\";\r\nimport MainSearch from \"../components/MainSearch\";\r\nimport * as Types from \"../../common/Types\";\r\nimport * as Constants from \"../../common/Constants\";\r\nimport getFilteredSearchResults from \"../../listings/functions/getFilteredSearchResults\";\r\nimport getAllProductsFromCategory from \"../../listings/functions/getAllProductsFromCategory\";\r\nimport IntroText from \"../components/IntroText\";\r\nimport FoundCountText from \"../components/FoundCountText\";\r\nimport { getListingPageUrl } from \"../../common/SEO/SeoFunctions\";\r\nimport { withRouter } from \"react-router-dom\";\r\n\r\ntype Props_IntroSection = {\r\n lang: string;\r\n jsonDataGroups;\r\n history?; //from withRouter\r\n};\r\ntype State_IntroSection = {\r\n filtersOpen: boolean;\r\n allData;\r\n searchFilters: Types.searchFilters;\r\n searchResults;\r\n};\r\n\r\nclass IntroSection extends React.PureComponent<\r\n Props_IntroSection,\r\n State_IntroSection\r\n> {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n searchResults: null,\r\n allData: null,\r\n searchFilters: Constants.searchFiltersEmptyDefault,\r\n filtersOpen: false,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n this.initializeSearchResults();\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n if (prevProps !== this.props) {\r\n this.initializeSearchResults();\r\n }\r\n }\r\n\r\n initializeSearchResults = () => {\r\n if (this.props.jsonDataGroups) {\r\n const allDataGrouped = getAllProductsFromCategory(\r\n this.state.searchFilters,\r\n this.props.jsonDataGroups\r\n );\r\n const searchResults = getFilteredSearchResults(\r\n this.state.searchFilters,\r\n allDataGrouped\r\n );\r\n console.log(\"initializeSearchResults()\");\r\n this.setState({\r\n ...this.state,\r\n allData: allDataGrouped,\r\n searchResults: searchResults,\r\n });\r\n }\r\n };\r\n\r\n toggleFiltersExpand = () => {\r\n console.log(\"toggleFiltersExpand()\");\r\n this.setState({\r\n ...this.state,\r\n filtersOpen: !this.state.filtersOpen,\r\n });\r\n };\r\n\r\n handleKeyPressSubmitSearch = (e) => {\r\n if (e.which === 13) {\r\n //enter button\r\n this.handleSubmitSearch();\r\n }\r\n };\r\n\r\n handleSubmitSearch = () => {\r\n const listingUrl = getListingPageUrl(\r\n this.props.lang,\r\n null,\r\n true,\r\n this.state.searchFilters\r\n );\r\n this.props.history.push(listingUrl);\r\n };\r\n\r\n handleSearchFilterChange = (updatedSearchFilters: Types.searchFilters) => {\r\n const searchResults = getFilteredSearchResults(\r\n updatedSearchFilters,\r\n this.state.allData\r\n );\r\n\r\n this.setState({\r\n ...this.state,\r\n searchResults: searchResults,\r\n searchFilters: updatedSearchFilters,\r\n });\r\n };\r\n\r\n render() {\r\n return (\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 {/*advanced filter button and prod count*/}\r\n
    \r\n
    \r\n this.toggleFiltersExpand()}\r\n >\r\n {this.state.filtersOpen ? (\r\n \r\n ) : (\r\n \r\n )}\r\n   \r\n \r\n {this.state.filtersOpen\r\n ? outputEnFr(\r\n \"Hide advanced filters\",\r\n \"Masquer les filtres de recherches avancés\",\r\n this.props.lang\r\n )\r\n : outputEnFr(\r\n \"Advanced filters\",\r\n \"Filtres de recherche avancés\",\r\n this.props.lang\r\n )}\r\n \r\n

    \r\n
    \r\n
    \r\n {/*products found count*/}\r\n \r\n
    \r\n
    \r\n {/*mobile only button*/}\r\n this.handleSubmitSearch()}\r\n disabled={\r\n !this.state.searchResults ||\r\n this.state.searchResults.length === 0\r\n }\r\n className=\"find-btn visible-xs hidden-sm hidden-md hidden-lg\"\r\n >\r\n  \r\n \r\n {outputEnFr(\"Search\", \"Rechercher\", this.props.lang)}\r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n );\r\n }\r\n}\r\nexport default withRouter(IntroSection);\r\n","import React from \"react\";\r\nimport {\r\n isHeavyEquipmentCategory,\r\n outputEnFr,\r\n} from \"../../common/HelperFunctions\";\r\nimport { getListingPageUrl } from \"../../common/SEO/SeoFunctions\";\r\nimport { Link } from \"react-router-dom\";\r\nimport * as Constants from \"../../common/Constants\";\r\nimport _ from \"lodash\";\r\n\r\n// BFE category images\r\nimport attachmentImage from \"../../../images/categoryimagesbfe/home-attachments.jpg\";\r\nimport compactorImage from \"../../../images/categoryimagesbfe/home-compactors.jpg\";\r\nimport telehandlerImage from \"../../../images/categoryimagesbfe/home-telehandlers.jpg\";\r\nimport backhoeLoaderImage from \"../../../images/categoryimagesbfe/home-backhoe-loaders.jpg\";\r\nimport excavatorImage from \"../../../images/categoryimagesbfe/home-excavators.jpg\";\r\nimport wheelLoaderImage from \"../../../images/categoryimagesbfe/home-wheel-loaders.jpg\";\r\nimport compactTrackLoaderImage from \"../../../images/categoryimagesbfe/home-compact-track-loader.jpg\";\r\nimport skidSteerLoaderImage from \"../../../images/categoryimagesbfe/home-skid-steer-loaders.jpg\";\r\nimport vtrImage from \"../../../images/categoryimagesbfe/home-vtr.jpg\";\r\nimport ILImage from \"../../../images/categoryimagesbfe/home-industrial-loaders.jpg\";\r\n\r\n// BFERental category images\r\nimport aircompressorsImage from \"../../../images/categoryimagesbferental/air-compressors.jpg\";\r\nimport backhoeloadersImage from \"../../../images/categoryimagesbferental/backhoe-loaders.jpg\";\r\nimport compactionequipmentImage from \"../../../images/categoryimagesbferental/compaction-equipment.jpg\";\r\nimport compacttrackloadersImage from \"../../../images/categoryimagesbferental/compact-track-loaders.jpg\";\r\nimport concBuggyImage from \"../../../images/categoryimagesbferental/concrete-buggy.jpg\";\r\nimport excavatorsImage from \"../../../images/categoryimagesbferental/excavators.jpg\";\r\nimport generatorsImage from \"../../../images/categoryimagesbferental/generators.jpg\";\r\nimport lawngardenequipmentImage from \"../../../images/categoryimagesbferental/lawn-garden-equipment.jpg\";\r\nimport lighttowersImage from \"../../../images/categoryimagesbferental/light-towers.jpg\";\r\nimport materialhandlingImage from \"../../../images/categoryimagesbferental/material-handling.jpg\";\r\nimport messagearrowboardsImage from \"../../../images/categoryimagesbferental/message-arrow-boards.jpg\";\r\nimport miscImage from \"../../../images/categoryimagesbferental/misc.jpg\";\r\nimport miscImageFR from \"../../../images/categoryimagesbferental/misc-fr.jpg\";\r\nimport pumpsImage from \"../../../images/categoryimagesbferental/pumps.jpg\";\r\nimport scissorliftsboomsImage from \"../../../images/categoryimagesbferental/scissor-lifts-booms.jpg\";\r\nimport skidsteerloadersImage from \"../../../images/categoryimagesbferental/skid-steer-loaders.jpg\";\r\nimport trenchshoringImage from \"../../../images/categoryimagesbferental/trench-shoring.jpg\";\r\nimport weldersImage from \"../../../images/categoryimagesbferental/welders.jpg\";\r\n\r\n// Jobsite category images\r\nimport hoistingImage from \"../../../images/categoryimagesjobsite/hoisting-rigging.jpg\";\r\nimport materialImage from \"../../../images/categoryimagesjobsite/material-handling-machinery-moving.jpg\";\r\nimport jacksImage from \"../../../images/categoryimagesjobsite/jacks.jpg\";\r\nimport pipeBendingImage from \"../../../images/categoryimagesjobsite/pipe-bending.jpg\";\r\nimport pipeFabImage from \"../../../images/categoryimagesjobsite/pipe-fabrication.jpg\";\r\nimport wireImage from \"../../../images/categoryimagesjobsite/wire-cable-handling.jpg\";\r\nimport electricToolsImage from \"../../../images/categoryimagesjobsite/electric-tools.jpg\";\r\nimport airToolsImage from \"../../../images/categoryimagesjobsite/air-tools.jpg\";\r\nimport confinedImage from \"../../../images/categoryimagesjobsite/confined-space.jpg\";\r\nimport storageImage from \"../../../images/categoryimagesjobsite/storage-boxes.jpg\";\r\nimport torqueImage from \"../../../images/categoryimagesjobsite/torqueing-bolting.jpg\";\r\nimport weldingImage from \"../../../images/categoryimagesjobsite/welding-power-distribution.jpg\";\r\nimport miscJobsiteImage from \"../../../images/categoryimagesjobsite/misc.jpg\";\r\n\r\ntype Props_CategorySection = {\r\n lang: string;\r\n jsonDataGroups;\r\n};\r\nconst fadeInClass = navigator.userAgent === \"ReactSnap\" ? \"fade-in\" : \"\";\r\n\r\nconst CategorySection = (props: Props_CategorySection) => {\r\n console.log(\"Rendering CategorySection\", props);\r\n\r\n //each array is a column\r\n let categoryList: Object = [];\r\n categoryList[0] = [];\r\n categoryList[1] = [];\r\n categoryList[2] = [];\r\n categoryList[3] = [];\r\n\r\n const getLink = (\r\n groupCode: string,\r\n groupDisplayName: string,\r\n groupCount?: number,\r\n groupImage?: string\r\n ) => {\r\n const href = getListingPageUrl(\r\n props.lang,\r\n groupCode,\r\n false,\r\n Constants.searchFiltersEmptyDefault\r\n );\r\n const linkClasses = groupCount ? \"homeequiplink\" : \"homeequiplink default\";\r\n return (\r\n \r\n {groupDisplayName}\r\n {props.lang === \"en\" && groupDisplayName === \"Vtrd\"\r\n ? \"Vibratory Tandem Rollers\"\r\n : props.lang === \"fr\" && groupDisplayName === \"Vtrd\"\r\n ? \"Rouleaux tandems vibrants\"\r\n : groupDisplayName === \"Vtrd\"\r\n ? \"Vibratory Tandem Rollers\"\r\n : props.lang === \"en\" && groupDisplayName === \"Il\"\r\n ? \"Industrial Loaders\"\r\n : props.lang === \"fr\" && groupDisplayName === \"Il\"\r\n ? \"Chargeurs industriels\"\r\n : groupDisplayName === \"Il\"\r\n ? \"Industrial Loaders\"\r\n : groupDisplayName}\r\n  \r\n {/* {groupDisplayName}  */}\r\n {groupCount && (\r\n {groupCount}\r\n )}\r\n \r\n );\r\n };\r\n\r\n //Set columns based on environment\r\n let numberOfColumns = 3;\r\n let columnClass = \"col-sm-4\"; //3 columns\r\n if (\r\n Constants.isEnvironmentBFE_or_BFERENTAL ||\r\n Constants.isEnvironmentJOBSITE\r\n ) {\r\n numberOfColumns = 4;\r\n columnClass = \"col-sm-3\"; //4 columns\r\n }\r\n\r\n if (props.jsonDataGroups) {\r\n //sort by display name\r\n const UsedData = _.sortBy(props.jsonDataGroups, function (o) {\r\n if (o[\"group-display-name\"] != null) {\r\n return _.deburr(o[\"group-display-name\"]);\r\n }\r\n }); //asc\r\n\r\n if (UsedData) {\r\n let famCount = UsedData.length;\r\n\r\n let famCountPerColumn = Math.ceil(famCount / numberOfColumns); //number of items per column\r\n\r\n let count = 0;\r\n let column = 0;\r\n\r\n // Grouped category images object (BFE)\r\n const categoryImagesBFE = {\r\n \"Work Tools - Outils De Travail\": attachmentImage,\r\n \"Compactors - Compacteurs\": compactorImage,\r\n \"Telehandlers - Chargeurs À Bras Télescopique\": telehandlerImage,\r\n \"Backhoe Loaders - Chargeuses-pelleteuses\": backhoeLoaderImage,\r\n \"Excavators - Pelles Hydrauliques\": excavatorImage,\r\n \"Wheel Loaders / Integrated Toolcarriers - Chargeurs Sur Pneus / Chargeurs Industriels\":\r\n wheelLoaderImage,\r\n \"COMPACT TRACK LOADER - COMPACT TRACK LOADER\": compactTrackLoaderImage,\r\n \"Skid Steer Loaders / ASV - Chargeurs Compacts rigides\":\r\n skidSteerLoaderImage,\r\n \"VTRD\": vtrImage,\r\n \"IL\": ILImage,\r\n };\r\n\r\n // Grouped category images object (BFERENTAL)\r\n const categoryImagesBFERental = {\r\n \"BFE001\": aircompressorsImage,\r\n \"BFE013\": backhoeloadersImage,\r\n \"BFE012\": compactionequipmentImage,\r\n \"BFE010\": compacttrackloadersImage,\r\n \"BFE007\": concBuggyImage,\r\n \"BFE011\": excavatorsImage,\r\n \"BFE002\": generatorsImage,\r\n \"BFE008\": lawngardenequipmentImage,\r\n \"BFE003\": lighttowersImage,\r\n \"BFE014\": materialhandlingImage,\r\n \"BFE006\": messagearrowboardsImage,\r\n \"BFE015\": props.lang === \"en\" ? miscImage : miscImageFR,\r\n \"BFE004\": pumpsImage,\r\n \"BFE005\": scissorliftsboomsImage,\r\n \"BFE009\": skidsteerloadersImage,\r\n \"BFE017\": trenchshoringImage,\r\n \"BFE016\": weldersImage,\r\n };\r\n\r\n // Grouped category images object (Jobsite)\r\n const categoryImagesJobsite = {\r\n \"JEIJ01\": hoistingImage,\r\n \"JEIJ02\": materialImage,\r\n \"JEIJ03\": jacksImage,\r\n \"JEIJ04\": weldingImage,\r\n \"JEIJ05\": pipeBendingImage,\r\n \"JEIJ06\": pipeFabImage,\r\n \"JEIJ07\": wireImage,\r\n \"JEIJ08\": electricToolsImage,\r\n \"JEIJ09\": airToolsImage,\r\n \"JEIJ10\": confinedImage,\r\n \"JEIJ11\": storageImage,\r\n \"JEIJ12\": torqueImage,\r\n \"JEIJ13\": miscJobsiteImage,\r\n };\r\n\r\n const endColumnCheck = (c) => {\r\n if (\r\n c === famCountPerColumn ||\r\n c === famCountPerColumn * 2 ||\r\n c === famCountPerColumn * 3 ||\r\n c === famCountPerColumn * 4\r\n ) {\r\n column++;\r\n }\r\n };\r\n UsedData.forEach((group) => {\r\n if (\r\n Constants.isEnvironmentBFE || //BFE - show all\r\n isHeavyEquipmentCategory(group) //TCAT - heavy equipment only\r\n ) {\r\n count++;\r\n // If BFE images or TCAT, grab category images and load\r\n if (Constants.isEnvironmentBFE || Constants.isEnvironmentTCAT) {\r\n const newLink = getLink(\r\n group[\"group-code\"],\r\n group[\"group-display-name\"],\r\n group.count,\r\n categoryImagesBFE[group[\"group-code\"]]\r\n );\r\n categoryList[column].push(newLink);\r\n endColumnCheck(count);\r\n console.log(\"bfe running\");\r\n // If BFERental images, grab category images and load\r\n } else if (Constants.isEnvironmentBFERENTAL) {\r\n const newLink = getLink(\r\n group[\"group-code\"],\r\n group[\"group-display-name\"],\r\n group.count,\r\n categoryImagesBFERental[group[\"group-code\"]]\r\n );\r\n categoryList[column].push(newLink);\r\n endColumnCheck(count);\r\n console.log(\"bfe rental running\");\r\n // If Jobsite images, grab category images and load\r\n } else if (Constants.isEnvironmentJOBSITE) {\r\n const newLink = getLink(\r\n group[\"group-code\"],\r\n group[\"group-display-name\"],\r\n group.count,\r\n categoryImagesJobsite[group[\"group-code\"]]\r\n );\r\n categoryList[column].push(newLink);\r\n endColumnCheck(count);\r\n console.log(\"jobsite running\");\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n {outputEnFr(\r\n \"Browse by category\",\r\n \"Parcourir par catégorie\",\r\n props.lang\r\n )}\r\n

    \r\n
    \r\n\r\n
    \r\n {props.jsonDataGroups ? Constants.isEnvironmentBFE ? (\r\n <>\r\n
    \r\n {categoryList[0].length > 0 ? categoryList[0] : \"\"}\r\n
    \r\n
    \r\n {categoryList[1].length > 0 ? categoryList[1] : \"\"}\r\n
    \r\n
    \r\n {categoryList[2].length > 0 ? categoryList[2] : \"\"}\r\n
    \r\n
    \r\n {categoryList[3].length > 0 ? categoryList[3] : \"\"}\r\n
    \r\n \r\n ) : (\r\n <>\r\n
    \r\n {categoryList[0].length > 0 ? categoryList[0] : \"\"}\r\n
    \r\n
    \r\n {categoryList[1].length > 0 ? categoryList[1] : \"\"}\r\n
    \r\n
    \r\n {categoryList[2].length > 0 ? categoryList[2] : \"\"}\r\n
    \r\n
    \r\n {categoryList[3].length > 0 ? categoryList[3] : \"\"}\r\n
    \r\n \r\n ) : outputEnFr(\r\n \"Loading products, please wait...\",\r\n \"Chargement des produits, veuillez patienter...\",\r\n props.lang\r\n )}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n\r\nCategorySection.whyDidYouRender = true;\r\nexport default CategorySection;\r\n","import React from \"react\";\r\nimport { outputEnFr } from \"../../common/HelperFunctions\";\r\nimport * as Constants from '../../common/Constants';\r\n\r\nconst SeoTextSection_TCAT = (props:{lang:string}) => {\r\n \r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n

    {outputEnFr(\"UNBEATABLE VALUE\",\"UNE VALEUR IMBATTABLE\", props.lang)}

    \r\n
    \r\n {outputEnFr(\"\r\n
    \r\n
    \r\n
    {outputEnFr(\"Superior repair service\",\"Service de réparation hors pair\", props.lang)}
    \r\n
    \r\n
    \r\n
    {outputEnFr(\"Tons of parts\",\"Pièces en abondance\", props.lang)}
    \r\n
    \r\n
    \r\n
    {outputEnFr(\"Huge inventory\",\"Inventaire imposant\", props.lang)}
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n {outputEnFr(\"At Toromont Cat, you will find the largest inventory of used Cat equipment in Eastern Canada. From construction to paving and crushing to forestry, our unbeatable selection offers increased value and top-notch performance in all types of environments. Toromont Cat is your authorized Caterpillar Dealer in Manitoba, Ontario, Quebec, New Brunswick, Nova Scotia, P.E.I., Newfoundland and Labrador, and Nunavut.\",\r\n \"Chez Toromont Cat, vous trouverez le plus grand inventaire d’équipement usagé Cat dans l’est du Canada. Que ce soit pour des applications de construction, de pavage, de concassage ou forestières, notre sélection d’équipement offre une valeur accrue et une performance inégalée dans tous les types d’environnements. Toromont Cat est votre concessionnaire Caterpillar autorisé au Manitoba, en Ontario, au Québec, au Nouveau-Brunswick, en Nouvelle-Écosse, à l’Île-du-Prince-Édouard, à Terre-Neuve et Labrador et au Nunavut.\", props.lang)}\r\n\r\n

    \r\n\r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\nSeoTextSection_TCAT.whyDidYouRender = true;\r\nexport default SeoTextSection_TCAT;","import React from \"react\";\r\nimport { outputEnFr } from \"../../common/HelperFunctions\";\r\nimport * as Constants from \"../../common/Constants\";\r\n\r\nconst SeoTextSectionBattlefield = (props: { lang: string }) => {\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n {outputEnFr(\r\n \"UNBEATABLE VALUE\",\r\n \"UNE VALEUR IMBATTABLE\",\r\n props.lang\r\n )}\r\n

    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n {outputEnFr(\r\n \"Superior repair service\",\r\n \"Service de réparation hors pair\",\r\n props.lang\r\n )}\r\n
    \r\n
    \r\n
    \r\n
    \r\n {outputEnFr(\r\n \"Tons of parts\",\r\n \"Pièces en abondance\",\r\n props.lang\r\n )}\r\n
    \r\n
    \r\n
    \r\n
    \r\n {\" \"}\r\n {outputEnFr(\r\n \"Huge inventory\",\r\n \"Inventaire imposant\",\r\n props.lang\r\n )}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n {Constants.isEnvironmentBFERENTAL\r\n ? outputEnFr(\r\n \"Battlefield Equipment Rentals offers a wide range of quality, low-hour used machines for sale at great prices. All of our equipment has been regularly serviced by our Factory Trained Technicians and has undergone a strict maintenance schedule. Battlefield Equipment Rentals sells thousands of brand name products and is the authorized distributor for such brands as Caterpillar, Spectra Precision / Trimble, Wacker Neuson, Stihl, Honda, SkyJack, Genie, Husqvarna, Atlas Copco, Bosch, Gorman-Rupp, as well as many others.\",\r\n \"Location d’équipement Battlefield offre à prix avantageux une large gamme de machines d’occasion de qualité avec peu d’heures d’utilisation. Tous nos équipements font l’objet d’un entretien régulier par nos techniciens formés en usine selon un programme de maintenance rigoureux. Location d’équipement Battlefield procure des produits de marque de confiance et est le distributeur autorisé de produits Caterpillar, Spectra Precision/Trimble, Wacker Neuson, STIHL, Honda, SkyJack, Genie, Huqsvarna, Atlas Copco, Bosch, Godwin, entre autres.\",\r\n props.lang\r\n )\r\n : outputEnFr(\r\n \"At Battlefield Equipment Rentals, you will find the largest inventory of used Cat equipment in Eastern Canada. From construction to paving and crushing to forestry, our unbeatable selection offers increased value and top-notch performance in all types of environments. Battlefield Equipment Rentals is your authorized Caterpillar Dealer in Manitoba, Ontario, Quebec, New Brunswick, Nova Scotia, P.E.I., Newfoundland and Labrador, and Nunavut.\",\r\n \"Chez Battlefield Equipment Rentals, vous trouverez le plus grand inventaire d’équipement usagé Cat dans l’est du Canada. Que ce soit pour des applications de construction, de pavage, de concassage ou forestières, notre sélection d’équipement offre une valeur accrue et une performance inégalée dans tous les types d’environnements. Battlefield Equipment Rentals est votre concessionnaire Caterpillar autorisé au Manitoba, en Ontario, au Québec, au Nouveau-Brunswick, en Nouvelle-Écosse, à l’Île-du-Prince-Édouard, à Terre-Neuve et Labrador et au Nunavut.\",\r\n props.lang\r\n )}\r\n

    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\nSeoTextSectionBattlefield.whyDidYouRender = true;\r\nexport default SeoTextSectionBattlefield;\r\n","import React from \"react\";\r\nimport { outputEnFr } from \"../../common/HelperFunctions\";\r\nimport * as Constants from \"../../common/Constants\";\r\n\r\nconst SeoTextSectionJobsite = (props: { lang: string }) => {\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n {outputEnFr(\r\n \"UNBEATABLE VALUE\",\r\n \"UNE VALEUR IMBATTABLE\",\r\n props.lang\r\n )}\r\n

    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n {outputEnFr(\r\n \"Superior repair service\",\r\n \"Service de réparation hors pair\",\r\n props.lang\r\n )}\r\n
    \r\n
    \r\n
    \r\n
    \r\n {outputEnFr(\r\n \"Tons of parts\",\r\n \"Pièces en abondance\",\r\n props.lang\r\n )}\r\n
    \r\n
    \r\n
    \r\n
    \r\n {\" \"}\r\n {outputEnFr(\r\n \"Huge inventory\",\r\n \"Inventaire imposant\",\r\n props.lang\r\n )}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n {Constants.isEnvironmentJOBSITE\r\n ? outputEnFr(\r\n \"Jobsite Industrial Rental Services offers a wide range of quality used tools and equipment for sale at great prices. All of our equipment has been regularly serviced by our Factory Trained Technicians and has undergone a strict maintenance schedule. Jobsite Industrial Rental Services sells thousands of brand name products and is the authorized distributor for such brands as Lincoln Electric, Greenlee, Rigid, Sumner, RAD, Enerpac, Genie, Eagle Pro, as well as many others.\",\r\n \"Location d’outils industriels Jobsite offrent une vaste gamme d'outils et d'équipements d'occasion de qualité à vendre à des prix avantageux. Tous nos équipements ont été régulièrement entretenus par nos techniciens formés en usine et ont fait l'objet d'un programme d'entretien strict. Location d’outils industriels Jobsite vend des milliers de produits de marque et est le distributeur autorisé de marques telles que Lincoln Electric, Greenlee, Rigid, Sumner, RAD, Enerpac, Genie, Eagle Pro, ainsi que de nombreuses autres.\",\r\n props.lang\r\n )\r\n : outputEnFr(\r\n \"At Jobsite Industrial Rental Services, you will find the largest inventory of used Cat equipment in Eastern Canada. From construction to paving and crushing to forestry, our unbeatable selection offers increased value and top-notch performance in all types of environments. Jobsite Industrial Rental Services is your authorized Caterpillar Dealer in Manitoba, Ontario, Quebec, New Brunswick, Nova Scotia, P.E.I., Newfoundland and Labrador, and Nunavut.\",\r\n \"Chez Jobsite Industrial Rental Services, vous trouverez le plus grand inventaire d’équipement usagé Cat dans l’est du Canada. Que ce soit pour des applications de construction, de pavage, de concassage ou forestières, notre sélection d’équipement offre une valeur accrue et une performance inégalée dans tous les types d’environnements. Jobsite Industrial Rental Services est votre concessionnaire Caterpillar autorisé au Manitoba, en Ontario, au Québec, au Nouveau-Brunswick, en Nouvelle-Écosse, à l’Île-du-Prince-Édouard, à Terre-Neuve et Labrador et au Nunavut.\",\r\n props.lang\r\n )}\r\n

    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\nSeoTextSectionJobsite.whyDidYouRender = true;\r\nexport default SeoTextSectionJobsite;\r\n","/* eslint-disable react/jsx-pascal-case */\r\nimport React from \"react\";\r\nimport IntroSection from \"./sections/IntroSection\";\r\nimport CategorySection from \"./sections/CategorySection\";\r\nimport { setBodyClass } from \"../common/HelperFunctions\";\r\nimport SeoTextSection_TCAT from \"./sections/SeoTextSectionToromontCat\";\r\nimport SeoTextSectionBattlefield from \"./sections/SeoTextSectionBattlefield\";\r\nimport SeoTextSectionJobsite from \"./sections/SeoTextSectionJobsite\";\r\nimport { Helmet } from \"react-helmet\";\r\nimport {\r\n DOMAINBASE,\r\n isEnvironmentBFE_or_BFERENTAL,\r\n isEnvironmentJOBSITE,\r\n} from \"../common/Constants\";\r\nimport \"../../css/homepage.scss\";\r\n\r\ntype Props_Home = {\r\n lang: string;\r\n jsonDataGroups;\r\n};\r\n\r\nexport default class HomePage extends React.PureComponent {\r\n getSeoTextSection = () => {\r\n if (isEnvironmentBFE_or_BFERENTAL) {\r\n return ;\r\n } else if (isEnvironmentJOBSITE) {\r\n return ;\r\n } else {\r\n return ;\r\n }\r\n };\r\n\r\n render() {\r\n console.log(\"Render HomePage\", this.props);\r\n isEnvironmentBFE_or_BFERENTAL\r\n ? setBodyClass([\"pgHome\", \"bfetheme\"])\r\n : isEnvironmentJOBSITE\r\n ? setBodyClass([\"pgHome\", \"jobsite-theme\"])\r\n : setBodyClass([\"pgHome\"]);\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n {this.getSeoTextSection()}\r\n \r\n );\r\n }\r\n}\r\n","import React from \"react\"; \r\nimport _ from 'lodash';\r\nimport { getListingPageUrl, getDetailPageUrlFromSerial, slug } from \"../common/SEO/SeoFunctions\";\r\nimport {isEnvironmentTCAT } from \"../common/Constants\";\r\n\r\n\r\n\r\nconst UpdateSitemap = () => {\r\n\r\n function newSitemapItem(url_en, url_fr) {\r\n var moddate = new Date().toISOString();\r\n return \"\" +\r\n \"\" + url_en + \"\" +\r\n \"\" +\r\n \"\" +\r\n \"\" + moddate + \"\" +\r\n \"daily\" +\r\n \"1\" +\r\n \"\";\r\n }\r\n\r\n function sendPost(valueToSend) { \r\n const request = new XMLHttpRequest(); \r\n const url = \"sitemapfiles/updatesitemap.aspx\"; \r\n const paramName = \"mapxml\"; \r\n const valueToSendEncoded = encodeURI(valueToSend);\r\n\r\n if (request) {\r\n request.open('POST', url, false);\r\n request.onreadystatechange = function() {\r\n if (request.readyState === 4 && request.status === 200) {\r\n document.write(request.responseText);\r\n }else{\r\n document.write(\"No response - sitemap not updated\");\r\n }\r\n }\r\n request.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\r\n request.send(paramName+\"=\"+valueToSendEncoded);\r\n }else{\r\n document.write(\"Error occured - sitemap not updated\");\r\n }\r\n }\r\n\r\n const generateLinks = () => {\r\n var jsonUrl = \"https://tws.toromont.ca/ToromontCAT/ServiceHub/PublicInfo/equipment/used/N000\";\r\n\r\n fetch(jsonUrl)\r\n .then(res => res.json())\r\n .then(\r\n (data) => {\r\n var groupList;\r\n var productList;\r\n var finalOutput = \"\";\r\n\r\n //homepage\r\n finalOutput += newSitemapItem(\"https://used.toromontcat.com/\", \"https://used.toromontcat.com/fr\");\r\n\r\n groupList = data['groups'];//combine into one array\r\n groupList = _.filter(groupList, function (o) {\r\n if (o != null) {\r\n var curCategoryClass = o['equipments'][0]['product-family-categories']['category-class']['name'];\r\n return (curCategoryClass !== \"ATTACHMENTS\" && curCategoryClass !== \"ÉQUIPEMENTS\"\r\n && slug(o['group-code']) !== \"work-tools-outils-de-travail\");\r\n\r\n }\r\n });\r\n productList = [];\r\n for (var i = 0; i < groupList.length; i++) {\r\n productList = productList.concat(groupList[i]['equipments']);\r\n }\r\n\r\n console.log(\"Generate links\", groupList, productList);\r\n var baseurl = \"https://used.toromontcat.com\";\r\n\r\n Object.keys(groupList).forEach(function (x) {\r\n //PRODUCT CATEGORY PAGES\r\n if (groupList[x] == null) { return; }\r\n\r\n var famCode = groupList[x]['group-code'];\r\n\r\n var hreflink_en = baseurl + getListingPageUrl(\"en\", famCode, false);\r\n var hreflink_fr = baseurl + getListingPageUrl(\"fr\", famCode, false);\r\n\r\n finalOutput += newSitemapItem(hreflink_en, hreflink_fr);\r\n });\r\n\r\n Object.keys(productList).forEach(function (x) {\r\n //PRODUCT DETAIL PAGES\r\n var curProduct = productList[x];\r\n\r\n if (\r\n (typeof curProduct['serial-number'] === \"undefined\") ||\r\n (curProduct['group-code'] === \"Forklift\" ||\r\n curProduct['group-code'] === \"Chariots Elévateurs\")//filter out lift truck family\r\n ) { return; }\r\n\r\n var hreflink_en = baseurl + getDetailPageUrlFromSerial(\r\n \"en\",\r\n curProduct['serial-number'],\r\n slug(curProduct['product-family-categories']['category']['category-code']),\r\n false);\r\n var hreflink_fr = baseurl + getDetailPageUrlFromSerial(\r\n \"fr\",\r\n curProduct['serial-number'],\r\n slug(curProduct['product-family-categories']['category']['category-code']),\r\n false );\r\n finalOutput += newSitemapItem(hreflink_en, hreflink_fr);\r\n\r\n\r\n }); \r\n\r\n finalOutput += \"\"; \r\n\r\n sendPost(finalOutput);\r\n document.close();\r\n \r\n }\r\n ) \r\n\r\n }\r\n isEnvironmentTCAT && generateLinks(); \r\n\r\n return (
    \r\n

    Generating sitemap...

    \r\n
    \r\n )\r\n}\r\nexport default UpdateSitemap;","/* eslint-disable react/jsx-pascal-case */\r\nimport React, { Suspense } from \"react\";\r\nimport { Helmet } from \"react-helmet\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport {\r\n slug,\r\n getAllUrlParams,\r\n getSeoContentByCatCode,\r\n getMetaTitle,\r\n} from \"./pages/common/SEO/SeoFunctions\";\r\nimport { displayCart } from \"./js_vanilla/used-favouriteAddon\";\r\nimport Header from \"./pages/common/Components/Header\";\r\nimport * as Constants from \"./pages/common/Constants\";\r\nimport {\r\n getJsonUrl,\r\n getCookie,\r\n isPowerCategory,\r\n} from \"./pages/common/HelperFunctions\";\r\nimport Footer_Battlefield from \"./pages/common/Components/Footer_Battlefield\";\r\nimport Footer_Jobsite from \"./pages/common/Components/Footer_Jobsite\";\r\nimport Footer_TCAT from \"./pages/common/Components/Footer_TCAT\";\r\nimport { types_seoData, Type_jsonCategoryGroup } from \"./pages/common/Types\";\r\nimport ListingsPage from \"./pages/listings/ListingsPage\";\r\nimport CCUPage from \"./pages/other/CCUPage\";\r\nimport ConsignmentPage from \"./pages/other/ConsignmentPage\";\r\nimport EmailConfirm from \"./pages/other/EmailConfirm\";\r\nimport HomePage from \"./pages/home/HomePage\";\r\nimport _ from \"lodash\";\r\nimport UpdateSitemap from \"./pages/other/UpdateSitemap\";\r\nconst DetailsPage = React.lazy(() => import(\"./pages/details/DetailsPage\"));\r\n\r\ntype Props_PageWrapper = {\r\n pageType: number;\r\n history?; //from withRouter\r\n match?; //from withRouter\r\n};\r\ntype State_PageWrapper = {\r\n categoryClass;\r\n jsonApiUrl;\r\n jsonDataGroupsMain: Type_jsonCategoryGroup[] | null;\r\n jsonDataGroupsPower: Type_jsonCategoryGroup[] | null;\r\n jsonDataProduct;\r\n};\r\n\r\nclass PageWrapper extends React.PureComponent<\r\n Props_PageWrapper,\r\n State_PageWrapper\r\n> {\r\n constructor(props) {\r\n super(props);\r\n console.log(\"Construct PageWrapper\", props, getAllUrlParams());\r\n\r\n //get class from URL (either heavy equipment or power)\r\n\r\n this.state = {\r\n categoryClass: this.getCategoryClass(),\r\n jsonApiUrl: getJsonUrl(\r\n this.props.pageType,\r\n this.getParamLanguage(),\r\n this.getParamSerial()\r\n ),\r\n jsonDataGroupsMain: null,\r\n jsonDataGroupsPower: null,\r\n jsonDataProduct: null,\r\n };\r\n\r\n displayCart(); //initialize cart/faves in nav\r\n }\r\n getParamLanguage() {\r\n let paramLang = this.props.match.params.param_Lang; //get language from URL\r\n let cookieLang = getCookie(\"lang\"); //get language from cookie/\r\n let browserLang;\r\n let setLanguageTo = \"en\";\r\n if (typeof window != \"undefined\" && window.navigator != null) {\r\n //get language from browser setting\r\n browserLang = window.navigator.language;\r\n }\r\n //console.log(\"Lang setting: url: \" + paramLang + \", cookie: \" + cookieLang + \", browser: \" + browserLang);\r\n if (typeof paramLang !== \"undefined\" && paramLang !== \"undefined\") {\r\n //url language takes priority\r\n setLanguageTo = paramLang;\r\n } else if (cookieLang && cookieLang !== \"\") {\r\n //cookie takes second priority\r\n setLanguageTo = cookieLang;\r\n } else if (\r\n this.getParamCategory() === Constants.URLPOWER_FR ||\r\n browserLang === \"fr\" ||\r\n browserLang === \"fr-CA\"\r\n ) {\r\n setLanguageTo = \"fr\";\r\n }\r\n //save language preference to cookie\r\n if (!cookieLang || cookieLang === \"\" || cookieLang !== setLanguageTo) {\r\n console.log(\"Storing language cookie \" + setLanguageTo);\r\n document.cookie =\r\n \"lang=\" +\r\n setLanguageTo +\r\n \"; path=/; expires=Fri, 31 Dec 9999 23:59:59 GMT\";\r\n }\r\n return setLanguageTo;\r\n }\r\n getParamCategory() {\r\n return this.props.match.params.param_Category;\r\n }\r\n getParamSerial() {\r\n return this.props.match.params.param_Serial;\r\n }\r\n getCategoryClass() {\r\n let categoryClass = Constants.CLASS_HEAVY;\r\n if (\r\n this.getParamCategory() === Constants.URLPOWER_SLUG ||\r\n getAllUrlParams()[\"class\"] === Constants.URLPOWER_EN ||\r\n getAllUrlParams()[\"class\"] === Constants.URLPOWER_FR\r\n ) {\r\n categoryClass = Constants.CLASS_POWER;\r\n }\r\n return categoryClass;\r\n }\r\n\r\n componentDidMount() {\r\n console.log(\"PageWrapper componentDidMount() \", this.props);\r\n const newJsonUrl = getJsonUrl(\r\n this.props.pageType,\r\n this.getParamLanguage(),\r\n this.getParamSerial()\r\n );\r\n if (!navigator.userAgent || navigator.userAgent !== \"ReactSnap\") {\r\n //avoids loading on react-snap scan\r\n this.loadJsonOnStartup(newJsonUrl);\r\n }\r\n }\r\n\r\n componentDidUpdate() {\r\n const newJsonUrl = getJsonUrl(\r\n this.props.pageType,\r\n this.getParamLanguage(),\r\n this.getParamSerial()\r\n );\r\n //update json if changed\r\n if (newJsonUrl !== this.state.jsonApiUrl) {\r\n console.log(\"Json URL changed, load updated json now\");\r\n this.loadJsonOnStartup(newJsonUrl);\r\n }\r\n //update cat class if changed\r\n if (this.getCategoryClass() !== this.state.categoryClass) {\r\n console.log(\r\n \"PageWrapper ComponentDidUpdate - category class updated\",\r\n this.getCategoryClass()\r\n );\r\n this.updateCategoryClassState(this.getCategoryClass());\r\n }\r\n }\r\n\r\n async loadJsonOnStartup(newJsonUrl: string | undefined) {\r\n if (newJsonUrl) {\r\n await this.getJsonData(newJsonUrl);\r\n }\r\n }\r\n\r\n updateCategoryClassState = (newClass) => {\r\n this.setState({\r\n ...this.state,\r\n categoryClass: newClass,\r\n });\r\n };\r\n\r\n getJsonData = (jsonApiUrl: string) => {\r\n fetch(jsonApiUrl)\r\n .then((res) => res.json())\r\n .then(\r\n (result) => {\r\n console.log(\"loaded api\", jsonApiUrl);\r\n\r\n //TODO: set canonical urls using react-helmet\r\n\r\n if (this.props.pageType === Constants.PageTypes.Details) {\r\n this.setState({\r\n categoryClass: this.getCategoryClass(),\r\n jsonApiUrl: jsonApiUrl,\r\n jsonDataProduct: result,\r\n });\r\n } else {\r\n this.setState({\r\n categoryClass: this.getCategoryClass(),\r\n jsonApiUrl: jsonApiUrl,\r\n jsonDataGroupsMain: this.initialFilterJson(result),\r\n jsonDataGroupsPower: this.powerSystemsFilterJson(result),\r\n });\r\n }\r\n },\r\n (error) => {\r\n console.log(error);\r\n }\r\n );\r\n };\r\n\r\n initialFilterJson = (jsonData) => {\r\n //const categClass = this.state.categoryClass;\r\n\r\n //TCAT ONLY - FILTER BY CATEGORY CLASS TYPE\r\n if (Constants.isEnvironmentTCAT) {\r\n let equipmentGrouping: Type_jsonCategoryGroup[] = _.filter(\r\n jsonData.groups,\r\n function (o) {\r\n const groupCategoryClass =\r\n o[\"equipments\"][0][\"product-family-categories\"][\"category-class\"][\r\n \"name\"\r\n ];\r\n const famCode = o[\"group-code\"];\r\n\r\n const notAttachments =\r\n groupCategoryClass !== \"ATTACHMENTS\" &&\r\n groupCategoryClass !== \"ÉQUIPEMENTS\" &&\r\n slug(famCode) !== \"work-tools-outils-de-travail\";\r\n\r\n const notForklifts =\r\n famCode !== \"Forklifts\" &&\r\n famCode !== \"CHARIOTS ÉLÉVATEURS\" &&\r\n famCode !== \"Forklifts - Chariots Elévateurs\";\r\n\r\n if (notAttachments && notForklifts && !isPowerCategory(o)) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n );\r\n\r\n return equipmentGrouping;\r\n } else {\r\n return jsonData.groups;\r\n }\r\n };\r\n\r\n powerSystemsFilterJson(jsonDataSrc) {\r\n let newPowerGrouping: Type_jsonCategoryGroup[] = [];\r\n\r\n let equipmentFilteredPowerOnly: Type_jsonCategoryGroup[] = _.filter(\r\n jsonDataSrc.groups,\r\n function (o) {\r\n if (isPowerCategory(o)) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n );\r\n if (typeof equipmentFilteredPowerOnly[0] == \"undefined\") return null;\r\n\r\n let equipmentGroupingPower = _.groupBy(\r\n equipmentFilteredPowerOnly[0].equipments,\r\n function (o) {\r\n return o[\"product-family-code\"];\r\n }\r\n );\r\n\r\n Object.keys(equipmentGroupingPower).forEach(function (x) {\r\n newPowerGrouping.push({\r\n count: equipmentGroupingPower[x].length,\r\n \"group-code\": equipmentGroupingPower[x][0][\"product-family-code\"],\r\n \"group-display-name\": equipmentGroupingPower[x][0][\"product-family\"],\r\n \"group-name\": equipmentGroupingPower[x][0][\"product-family\"],\r\n equipments: equipmentGroupingPower[x],\r\n });\r\n });\r\n\r\n console.log(\"initial json 2 (power) \", newPowerGrouping);\r\n return newPowerGrouping;\r\n }\r\n\r\n getCurrentListingGroups = () => {\r\n return this.state.categoryClass === Constants.CLASS_POWER\r\n ? this.state.jsonDataGroupsPower\r\n : this.state.jsonDataGroupsMain;\r\n };\r\n\r\n getMetaDescTag = () => {\r\n const seoText: types_seoData = getSeoContentByCatCode();\r\n const metaText =\r\n this.getParamLanguage() === \"fr\" ? seoText.FR.Meta : seoText.EN.Meta;\r\n return metaText;\r\n };\r\n\r\n getPageComponent = () => {\r\n switch (this.props.pageType) {\r\n case Constants.PageTypes.Listings:\r\n return (\r\n \r\n );\r\n case Constants.PageTypes.Details:\r\n return (\r\n \r\n );\r\n case Constants.PageTypes.CCU:\r\n return ;\r\n case Constants.PageTypes.Consignment:\r\n return ;\r\n case Constants.PageTypes.EmailConfirm:\r\n return (\r\n \r\n );\r\n case Constants.PageTypes.UpdateSitemap:\r\n return ;\r\n default:\r\n return (\r\n \r\n );\r\n }\r\n };\r\n\r\n getFooterComponent = () => {\r\n return Constants.isEnvironmentBFE_or_BFERENTAL ? (\r\n \r\n ) : Constants.isEnvironmentJOBSITE ? (\r\n \r\n ) : (\r\n \r\n );\r\n };\r\n\r\n render() {\r\n return (\r\n <>\r\n \r\n {getMetaTitle(\"default\", this.getParamLanguage())}\r\n \r\n \r\n }>\r\n \r\n Skip to content\r\n \r\n \r\n\r\n {this.getPageComponent()}\r\n\r\n {this.getFooterComponent()}\r\n \r\n \r\n );\r\n }\r\n}\r\nexport default withRouter(PageWrapper);\r\n","import React from \"react\";\r\nimport { Switch, Route, BrowserRouter as Router } from \"react-router-dom\";\r\nimport { QueryClientProvider, QueryClient } from \"react-query\";\r\nimport PageWrapper from \"./PageWrapper\";\r\nimport \"./css/usedtheme.scss\";\r\nimport {\r\n isEnvironmentBFE_or_BFERENTAL,\r\n isEnvironmentJOBSITE,\r\n PageTypes,\r\n URLCCU,\r\n URLCONSIGNMENT,\r\n} from \"./pages/common/Constants\";\r\n\r\nif (isEnvironmentBFE_or_BFERENTAL) {\r\n require(\"./css/battlefieldtheme.scss\");\r\n}\r\nif (isEnvironmentJOBSITE) {\r\n require(\"./css/jobsite-theme.scss\");\r\n}\r\nif (process.env.NODE_ENV === \"production\") {\r\n console.log = function () {}; //disable console messages in production\r\n}\r\n\r\n// export const history = createBrowserHistory({\r\n// basename: process.env.PUBLIC_URL\r\n// });\r\n\r\nconst queryClient = new QueryClient();\r\n\r\nfunction AppRouter() {\r\n return (\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 \r\n \r\n \r\n );\r\n}\r\n\r\nAppRouter.whyDidYouRender = true;\r\nexport default AppRouter;\r\n","import \"./js_vanilla/wdyr\";\r\nimport React from \"react\";\r\nimport { render } from \"react-dom\";\r\n\r\nimport TagManager from \"react-gtm-module\";\r\nimport App from \"./App\";\r\nimport * as serviceWorker from \"./serviceWorker\";\r\nimport {\r\n isEnvironmentTCAT,\r\n isEnvironmentBFE_or_BFERENTAL,\r\n isEnvironmentJOBSITE,\r\n} from \"./pages/common/Constants\";\r\n\r\nlet tagManagerArgs;\r\nif (isEnvironmentBFE_or_BFERENTAL) {\r\n tagManagerArgs = {\r\n gtmId: \"GTM-3L4L\",\r\n };\r\n} else if (isEnvironmentTCAT) {\r\n tagManagerArgs = {\r\n gtmId: \"GTM-PB9SM93\",\r\n };\r\n} else if (isEnvironmentJOBSITE) {\r\n tagManagerArgs = {\r\n gtmId: \"GTM-NNBKST2\",\r\n };\r\n}\r\n\r\n/*Initialize GTM only in production and not scan from reactSnap*/\r\n// const production = process.env.NODE_ENV === \"production\";\r\nif (navigator.userAgent !== \"ReactSnap\") {\r\n TagManager.initialize(tagManagerArgs);\r\n}\r\n// Render the jsx, will overwrite html rendered by react-snap\r\nrender(, document.getElementById(\"root\"));\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://bit.ly/CRA-PWA\r\nserviceWorker.unregister();\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://bit.ly/CRA-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(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport function register(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://bit.ly/CRA-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, 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://bit.ly/CRA-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, 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(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\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"],"sourceRoot":""}