Get a lifetime subscription to 100GB of top flight cloud storage for just $30


Get a lifetime subscription to 100GB of top flight cloud storage for just $30 | PCWorld‘); } try { (function () { var idgus = window.idgus || {}; //if it’s already set use that instead /* the cmp is code is usually first on the page so run this here to never let anything redefine window.idgus */ Object.defineProperty(window, ‘idgus’, { enumerable: false, configurable: false, get: function () { return idgus; }, set: function () { //do nothing } }); })(); } catch (ex) {}; window.idgus = window.idgus || {}; window.idgus.cmp = (function () { const PRIVACY_MANAGER_IDENT = 165662; //standard purps const STORE_ACCESS_ON_DEVICE = ‘5ea7dfd36ede87504f7dedc5’, SELECT_PERSONSALISED_CONTENT_ID = ‘5ea7dfd36ede87504f7df18d’, SELECT_PERSONSALISED_ADS_ID = ‘5ea7dfd36ede87504f7df04e’, SELECT_BASIC_ADS_ID = ‘5ea7dfd36ede87504f7deeaf’, CREATE_PERSONALISED_ADS_PROFILE_ID = ‘5ea7dfd36ede87504f7def8d’, CREATE_PERSONALISED_CONTENT_PROFILE_ID = ‘5ea7dfd36ede87504f7df117’, MEASURE_ADS_PERFORMANCE_ID = ‘5ea7dfd36ede87504f7df1f7’, MEASURE_CONTENT_PERFORMANCE_ID = ‘5ea7dfd36ede87504f7df2f3’, APPLY_MARKET_RESEARCH_ID = ‘5ea7dfd36ede87504f7df378’, DEVELOP_AND_IMPROVE_PRODUCTS_ID = ‘5ea7dfd36ede87504f7df425’; //custom pur and vend const SOCIAL_MEDIA_CONSENTS_PURPOSE_ID = ‘5f1019609c10086dcb659fba’, GOOGLE_AD_MANAGER_VENDOR_ID = ‘5e74df5ff443bb795772df9c’, GOOGLE_ANALYTICS_VENDOR_ID = ‘5e542b3a4cd8884eb41b5a72’, TWITTER_VENDOR_ID = ‘5e71760b69966540e4554f01’, FACEBOOK_VENDOR_ID = ‘5e716fc09a0b5040d575080f’, LINKEDIN_VENDOR_ID = ‘5e777e669cb08971eb078d71’, BLUECONIC_VENDOR_ID = ‘5eb32dea09c3f947e75e6f02’; //const lang = (siteLang in LANG) ? LANG[siteLang] : LANG[‘en’]; var bindReshowCmp = function () { var url = document.location.pathname; if (url.indexOf(“/about/member-preferences”) > -1) { if (debug) console.log(‘*****GDPR reshowLink executing ‘, url); $(document).ready(function() { $(“.cmpSettings”).show(); $(“.reshowLink”).on(“click”, function(e) { e.preventDefault(); window._sp_.loadPrivacyManagerModal(PRIVACY_MANAGER_IDENT); }); }); } } //sitepoint.com/jquery-document-ready-plain-javascript/ – wanted to avoid jquery if (document.readyState === “complete” || (document.readyState !== “loading” && !document.documentElement.doScroll)) { bindReshowCmp(); } else { document.addEventListener(“DOMContentLoaded”, bindReshowCmp); } let consentedCustomVendors = []; //todo – not needed anymore let consentedPurposes = []; let vendorGrants = {}; var checkIfInEU = new Promise(function (resolve, reject) { __tcfapi(‘addEventListener’, 2, function (tcData, success) { if (debug) { console.log(‘GDPR addEventListener() tcData: ‘, tcData); } if (debug) { console.log(‘GDPR addEventListener() gdprApplies:’, tcData.gdprApplies, ‘eventStatus’, tcData.eventStatus, ‘success’, success); } isEU = tcData.gdprApplies; if (typeof isEU === ‘undefined’) { isEU = true; } if (debug) { console.log(“GDPR in cmp-tcfv2-sp tcData.gdprApplies: ” + isEU); } //if(promiseResolved)return;//timeout reached //promiseResolved = true; if (success && (tcData.eventStatus === ‘tcloaded’ || tcData.eventStatus === ‘useractioncomplete’)) { let isEuVisitor = tcData.gdprApplies || false; if (isEuVisitor) { __tcfapi(‘getCustomVendorConsents’, 2, (vendorConsents, success) => { consentedPurposes = vendorConsents.consentedPurposes || []; consentedCustomVendors = vendorConsents.consentedVendors || []; vendorGrants = vendorConsents.grants; if (debug) { console.log(‘GDPR addEventListener vendorConsents:’, vendorConsents); } if (debug) { console.log(‘GDPR addEventListener consentedPurposes:’, consentedPurposes, ‘consentedCustomVendors’, consentedCustomVendors, ‘vendorGrants’, vendorGrants); } resolve(); }); } else reject(); // remove the ourself to not get called more than once //todo – needed? __tcfapi(‘removeEventListener’, 2, function (success) { if (success) { console.log(‘addEventListener removeEventListener: ‘ + tcData.listenerId); } }, tcData.listenerId); } }); //addEventListener }); //checkCCPAOptOut Promise var checkCCPAOptOut = new Promise(function(resolve, reject) { if (debug) { console.log(“GDPR checkCCPAOptOut Promise”); } var promiseResolved = false; setTimeout(function() { if (debug) { console.log(‘GDPR checkCCPAOptOut timeout reached promiseResolved’, promiseResolved); } if (!promiseResolved) { promiseResolved = true; //assume opt out for safety resolve(); } }, 20000); __uspapi(‘getUSPData’, 1, function(uspData, success) { if (promiseResolved) return; //timeout reached promiseResolved = true; if(success) { try { if (debug) { console.log(‘uspapi success: ‘, uspData); } var uspDataString = uspData.uspString; var uspDataArray = []; uspDataArray = uspDataString.split(“”); if (typeof uspDataArray[2] !== “undefined” && uspDataArray[2] !== “Y”) { //user is still opted in reject(‘CCPA opted in’); } else { //user opted out resolve(); } } catch(e) { if (debug){ console.log(‘error with uspData retrieval: ‘, e); } //assume opt out for safety resolve(); } } else { if (debug) { console.log(‘uspapi fail: ‘, uspData); } //assume opt out for safety resolve(); } }); }); const checkConsent = function (ident) { if (debug) { console.log(‘GDPR’, ‘checkConsent() for ‘, ident); } let ok = false; if (ident in vendorGrants) { //has to have grant on vendor and on all associated puposes, advantage of this is we dont need to keep track of what purps a vendor is assoc with and check independetly const vendor = vendorGrants[ident]; if (debug) { console.log(‘GDPR’, ‘checkConsent() is vendor true – grants ‘, vendor); } ok = vendor.vendorGrant; //has this vendor been granted at vendor level if (debug) { console.log(‘GDPR’, ‘checkConsent() vendor has grant at vendor level’, ok); } if (ok) { //if so check all purposes have been granted for (let purpIdent in vendor.purposeGrants) { ok = vendor.purposeGrants[purpIdent]; if (debug) { console.log(‘GDPR’, ‘checkConsent() vendor has purpose ‘ + purpIdent + ‘ grant ‘, ok); } if (!ok) break; } } if (debug) { console.log(‘GDPR’, ‘checkConsent() vendor has ultimate grant’, ok); } return ok; } //not vendor so check if purpose ok = consentedPurposes.some(obj => obj[__id] == ident); //not vendor just pupose if (debug) { console.log(‘GDPR’, ‘checkConsent() purpose has grant ‘, ok); } return ok; }; return { isDebug: function () { return debug; }, hold: new Promise(function (resolve, reject) { //hold till user has made or choice or doesnt need to checkIfInEU.then(function () { if (debug) { console.log(‘GDPR’, ‘hold() ok resolved – return true’); } resolve(true); }).catch(function () { //not in eu, return ok if (debug) { console.log(‘GDPR’, ‘hold() not in eu – return true’); } resolve(true); }); }), adsense: new Promise(function (resolve, reject) { //same as hold effectively checkIfInEU.then(function () { //const ok = checkConsent(GOOGLE_AD_MANAGER_VENDOR_ID); const ok = true; if (debug) { console.log(‘GDPR’, ‘adsense ok ‘, ok); } resolve(ok); }).catch(function () { //not in eu, return ok if (debug) { console.log(‘GDPR’, ‘adsense not in eu’); } resolve(true); }); }), blueconic: new Promise(function (resolve, reject) { checkIfInEU.then(function () { const ok = checkConsent(BLUECONIC_VENDOR_ID); if (debug) { console.log(‘GDPR’, ‘blueconic ok’, ok); } resolve(ok); }).catch(function () { //not in eu, check CCPA if (debug) { console.log(‘GDPR’, ‘blueconic not in eu’); } checkCCPAOptOut.then(function() { if (debug) { console.log(‘CCPA’, ‘user has opted out of Blueconic’); } resolve(false); }).catch(function(){ if (debug) { console.log(‘CCPA’, ‘user has not opted out of Blueconic’); } resolve(true); }); }); }), gpt: new Promise(function (resolve, reject) { //same as hold effectively checkIfInEU.then(function () { //const ok = checkConsent(GOOGLE_AD_MANAGER_VENDOR_ID); const ok = true; if (debug) { console.log(‘GDPR’, ‘gpt ok’, ok); } resolve(ok); }).catch(function () { //not in eu, return ok if (debug) { console.log(‘GDPR’, ‘gpt not in eu’); } resolve(true); }); }), gaTrack: new Promise(function (resolve, reject) { checkIfInEU.then(function () { const ok = checkConsent(GOOGLE_ANALYTICS_VENDOR_ID); if (debug) { console.log(‘GDPR’, ‘gaTrack ok ‘, ok); } resolve(ok); }).catch(function () { //not in eu, return ok if (debug) { console.log(‘GDPR’, ‘gaTrack not in eu, arguments’, arguments); } resolve(true); }); }), adrian: new Promise(function (resolve, reject) { checkIfInEU.then(function () { const ok = checkConsent(STORE_ACCESS_ON_DEVICE); if (debug) { console.log(‘GDPR’, ‘adrian ok ‘, ok); } resolve(ok); }).catch(function () { //not in eu, return ok if (debug) { console.log(‘GDPR’, ‘adrian not in eu’); } resolve(true); }); }), twitter: new Promise(function (resolve, reject) { checkIfInEU.then(function () { const ok = checkConsent(TWITTER_VENDOR_ID); if (debug) { console.log(‘GDPR’, ‘twitter ok ‘, ok); } resolve(ok); }).catch(function () { //not in eu, return ok if (debug) { console.log(‘GDPR’, ‘twitter not in eu’); } resolve(true); }); }), linkedin: new Promise(function (resolve, reject) { checkIfInEU.then(function () { const ok = checkConsent(LINKEDIN_VENDOR_ID); if (debug) { console.log(‘GDPR’, ‘linkedin ok ‘, ok); } resolve(ok); }).catch(function () { //not in eu, return ok if (debug) { console.log(‘GDPR’, ‘linkedin not in eu’); } resolve(true); }); }), facebook: new Promise(function (resolve, reject) { checkIfInEU.then(function () { const ok = checkConsent(FACEBOOK_VENDOR_ID); if (debug) { console.log(‘GDPR’, ‘facebook ok ‘, ok); } resolve(ok); }).catch(function () { //not in eu, return ok if (debug) { console.log(‘GDPR’, ‘facebook not in eu’); } resolve(true); }); }), consentKnown: new Promise (function (resolve, reject) { checkIfInEU.then(function() { //EU visitors dataLayer.push({ ‘event’: ‘consentKnown’, ‘ccpaOptedOut’: false }); resolve(true); }).catch(function(){ //check for CCPA checkCCPAOptOut.then(function() { //CCPA applies and user has opted out dataLayer.push({ ‘event’: ‘consentKnown’, ‘ccpaOptedOut’: true }); resolve(true); }).catch(function(){ dataLayer.push({ ‘event’: ‘consentKnown’, ‘ccpaOptedOut’: false }); resolve(true); }) }); }) }; // end return })(); ]]> 50, start countdown timer if (IDG.GPT.visibility[currentSlot] >= 50) { IDG.GPT.refreshCountdown[currentSlot].timeRemaining = refreshInterval; IDG.GPT.refreshCountdown[currentSlot].interval = setInterval(function(){ refreshCountdown(currentSlot); }, 1000) IDG.GPT.log(‘Impression viewable – starting countdown for ‘ + currentSlot); } } }); }; IDG.GPT.visibilityChanged = function() { googletag.pubads().addEventListener(‘slotVisibilityChanged’, function (event) { var currentSlot = event.slot.getSlotElementId(); var currentVisibility = event.inViewPercentage; if (currentSlot !== ‘inread’ && currentSlot !== ‘gpt-skin’ && currentSlot !== ‘gpt-superstitial’ && currentSlot !== ‘gpt-overlay’ ) { if (typeof IDG.GPT.visibility[currentSlot] !== “undefined”) { //if this slot has a viewable impression… if (typeof IDG.GPT.viewable[currentSlot] === “boolean” && IDG.GPT.viewable[currentSlot] == true) { //if stored value =50, start countdown timer if (IDG.GPT.visibility[currentSlot] = 50) { IDG.GPT.refreshCountdown[currentSlot].timeRemaining = refreshInterval; IDG.GPT.refreshCountdown[currentSlot].interval = setInterval(function(){ refreshCountdown(currentSlot); }, 1000) IDG.GPT.log(‘Came into view – restarting countdown for ‘ + currentSlot); } //else if stored value >= 50 and current value = 50 && currentVisibility 1){ url=url.split(‘?’)[0]; } try { IDG.GPT.addTarget(“URL”, encodeURIComponent(url)); } catch (exception) { console.log (“google_dfp can’t use IDG.GPT “+ exception); } try {IDG.GPT.addTarget(“zone”, ‘article/security’);} catch (exception) {console.log (“google_dfp can’t use IDG.GPT “+ exception);} try{IDG.GPT.addTarget(“channel”, ‘security’);} catch (exception) {console.log (“google_dfp can’t use IDG.GPT “+ exception);}try{IDG.GPT.addTarget(“articleId”, ‘3619539’);} catch (exception) {console.log (“google_dfp can’t use IDG.GPT “+ exception);}try{IDG.GPT.addTarget(“type”, ‘dealpost’);} catch (exception) {console.log (“google_dfp can’t use IDG.GPT “+ exception);}try{IDG.GPT.addTarget(“typeId”, ’15’);} catch (exception) {console.log (“google_dfp can’t use IDG.GPT “+ exception);}try{IDG.GPT.addTarget(“templateType”, ‘article-default’);} catch (exception) {console.log (“google_dfp can’t use IDG.GPT “+ exception);} try {IDG.GPT.addTarget(“categoryIds”, [‘2206’]);} catch (exception) {console.log (“google_dfp can’t use IDG.GPT “+ exception);} try{IDG.GPT.addTarget(“categorySlugs”, [‘security’]);} catch (exception) {console.log (“google_dfp can’t use IDG.GPT “+ exception);} try {IDG.GPT.addTarget(“goldenIds”, [‘941’]);} catch (exception) {console.log (“google_dfp can’t use IDG.GPT “+ exception);} try { if (null != IDG.GPT.getQsVal(“env”)) { IDG.GPT.addTarget(“env”, IDG.GPT.getQsVal(“env”).replace(/W/g, “”) ); } } catch (exception) { console.log (“google_dfp can’t use IDG.GPT “+ exception); } try { IDG.GPT.addTarget(“author”, ‘DealPost Team’); } catch (exception) { console.log (“google_dfp can’t use IDG.GPT “+ exception); } try { IDG.GPT.addTarget(“page_type”, ”); } catch (exception) { console.log (“google_dfp can’t use IDG.GPT “+ exception); } try { IDG.GPT.addTarget(“tagNames”, ‘Deals’); } catch (exception) { console.log (“google_dfp can’t use IDG.GPT “+ exception); } try { IDG.GPT.addTarget(“insiderContent”, ‘false’); } catch (exception) { console.log (“google_dfp can’t use IDG.GPT “+ exception); } //k/v for Inskin partner /* var fn_pageskin = screen.width >= 1330 ? “true” : “false”; try { IDG.GPT.addTarget(“inskin_yes”, fn_pageskin); IDG.GPT.log(“Inskin: added k/v pair inskin_yes : “+fn_pageskin); } catch (exception) { console.log(“Inskin: google_dfp can’t use IDG.GPT ” + exception); } */ ]]> s.replace(/[~'”=!+#;^()&[]]/g,”); window.ntvConfig = window.ntvConfig || {} ; window.ntvConfig.keyValues = window.ntvConfig.keyValues || {}; const segs = localStorage.getItem(‘_pnativo’); if (segs) { window.ntvConfig.keyValues.permutive = JSON.parse(segs).join(“,”); } const metaKeywordsTag = document.querySelector(“meta[name=’keywords’]”); if ( metaKeywordsTag && (metaKeywordsTag.hasAttribute(‘content’)) ) { const kwds = metaKeywordsTag.content.split(‘,’).filter(kw => kw.length 0 ? catIdList.split(‘,’) : []), ‘categoryIdList’:catIdList, ‘categoryIdPrimary’: ‘2206’, ‘contentStrategy’: ”, ‘contentType’:’dealpost’, ‘datePublished’:’2021-06-05′, ‘dateUpdated’:’2021-06-05′, ‘daysSincePublished’:’5′, ‘daysSinceUpdated’:’5′, ‘displayType’:’article’, ‘edition’:edition, ‘environment’:’production’, ‘ga_enabled’:’true’, ‘gaTrackingId’:’UA-739745-1′, ‘geolocEnabled’:’true’, ‘goldenTaxArray’: (goldenTaxList.length > 0 ? goldenTaxList.split(‘,’) : []), ‘goldenTaxonomyIdAll’: ‘941, 941’, ‘goldenTaxonomyIdList’: ‘941’, ‘goldenTaxonomyIdPrimary’: ‘941’, ‘isBlog’:’false’, ‘isInsiderContent’:”, ‘isICN’: ‘false’, ‘oneRegPlacementID’:oneRegPlacementID, ‘pageNumber’:’1′, ‘platform’:’Web’, ‘podcastSponsored’: ‘false’, ‘primaryCatArray’: (primaryCatList.length > 0 ? primaryCatList.split(‘,’) : []), ‘primaryCategory’: ‘security’, ‘primaryCategoryAll’: ‘security, ‘, ‘primaryCategoryList’: ”, ‘primaryAncestorCategoryList’: ‘security’, ‘prodCategories’:prodCategories.slice(‘|’, -1), ‘prodManufacturers’:prodManufacturers.slice(‘|’, -1), ‘prodNames’:prodNames.slice(‘|’, -1), ‘prodVendors’:prodVendors.slice(‘|’, -1), ‘property’: ‘pcworld’, ‘propertyCountry’:’US’, ‘purchaseIntent’:’notapplicable’, ‘skimlinksId’:’111346X1569483′, ‘source’:’pcworld’, ‘sponsorName’:”, ‘suppressForHoliday’:’false’, ‘suppressMonetization’: supMontMods.toString(), ‘tags’: ‘deals’, ‘userId’:idg_uuid, ‘videoAutoplay’:’false’, ‘youtubeId’:” }); ]]> 0 ? stringFromDataLayer(‘primaryCategoryList’).split(“,”).concat(stringFromDataLayer(‘primaryAncestorCategoryList’).split(“,”)) : stringFromDataLayer(‘primaryCategoryList’).split(“,”) }, ads: { adblocker: (adBlockStatus == “true”), //detected further up the page enabled: true } } }); dlJobPosition = dlJobPosition || null; dlIndustry = dlIndustry || null; if (dlJobPosition !== ” || dlIndustry !== ” || stringFromDataLayer(‘userId’) !== ”) { if (stringFromDataLayer(‘userId’) !== ”) { var userData = {}; var hermesAttrs = { “companySize” : “543ea0bd-604a-4011-99e7-806fc8979b5e”, “country” : “ea76d652-29bd-4a6c-ae50-a5d08ea28c5e”, }; var userKeys = Object.keys(hermesAttrs); $.ajax({ type: “get”, crossDomain: true, url: “https://lqxgcyk808.execute-api.us-east-1.amazonaws.com/prod_h2/api/v1/profiles/” + idg_uuid, dataType: “json”, data: {}, headers : { “Content-Type”: “application/x-www-form-urlencoded”, “x-api-key”:”HLyMXLISSW7HAYGgbx2Vb1Gf1OLcGmMG5BcwZ4Vb” } }).done(function(responseData){ userKeys.forEach(function(key) { if (typeof(responseData.attrs[hermesAttrs[key]].option_label) !== “undefined”) { userData[key] = responseData.attrs[hermesAttrs[key]].option_label; } else { userData[key] = responseData.attrs[hermesAttrs[key]].value; } }); window.permutive.track(‘User’, { companySize: userData[‘companySize’], country: userData[‘country’], id: (stringFromDataLayer(‘userId’) !== “” ? stringFromDataLayer(‘userId’) : null), jobIndustry: (dlIndustry !== “” ? dlIndustry : null), jobPosition: (dlJobPosition !== “” ? dlJobPosition : null), loggedIn: (stringFromDataLayer(‘insiderSignedIn’) == ‘true’) }) }).fail(function(data){ //console.log(“Error retrieving data: ” + data.responseJSON.error); }); } else { window.permutive.track(‘User’, { companySize: null, country: null, id: (stringFromDataLayer(‘userId’) !== “” ? stringFromDataLayer(‘userId’) : null), jobIndustry: (dlIndustry !== “” ? dlIndustry : null), jobPosition: (dlJobPosition !== “” ? dlJobPosition : null), loggedIn: (stringFromDataLayer(‘insiderSignedIn’) == ‘true’) }); } } //product js vars defined in document-head if (prodNames !== ” || prodManufacturers !== ” || prodCategories !== ” || prodVendors !== ”) { window.permutive.track(‘Product’, { names: stringFromDataLayer(‘prodNames’).split(“|”), categories: stringFromDataLayer(‘prodCategories’).split(“|”), manufacturers: stringFromDataLayer(‘prodManufacturers’).split(“|”), vendors: stringFromDataLayer(‘prodVendors’).split(“|”) }); } ]]> Black Friday ‘+currentYear+’ Coupons’; const cyberMondayCoupons = ‘

  • Cyber Monday ‘+currentYear+’ Coupons’; let couponLinks = ‘
  • All Coupon Codes’; fetch(“/saving-united/top-shops”) .then(response => response.text()) .then(text => { const parser = new DOMParser(); const htmlDocument = parser.parseFromString(text, “text/html”); const section = htmlDocument.documentElement.querySelector(“body”); const shopsObj = JSON.parse(section.textContent); for (let i = 0; i < shopsObj.length; i++) { let anchorText = shopsObj[i].anchor_text; let anchorTextURL = shopsObj[i].url; couponLinks = couponLinks + "
  • “+anchorText+””; } couponLinks = couponLinks + blackFridayCoupons + cyberMondayCoupons; document.getElementById(“couponChildren”).innerHTML = couponLinks; }).catch(err => console.error(err)); ]]>
  • sale 20793 article image StackCommerce

    Today’s Best Tech Deals

    Picked by PCWorld’s Editors

    = 930) { IDG.GPT.addDisplayedAd(“gpt-showcase”, “true”); $(‘#gpt-showcase’).responsiveAd({screenSize:’971 1115′, scriptTags: []}); IDG.GPT.log(“Creating ad: gpt-showcase – [971 1115]”); } ]]>

    Top Deals On Great Products

    Picked by Techconnect’s Editors

    Most cloud-based file storage services charge a monthly subscription fee. That means that even the cheapest of plans will add up to be incredibly expensive over time. Want a cloud storage solution that’s truly economical? Then Koofr Cloud Storage, who’s offering lifetime 100GB subscriptions right now for just one low payment, might be just what you’re looking for.

    Koofr Cloud Storage is fast, easy, and above all else, economical. You can use it to transfer an unlimited number of files (up to 100GB in combined total size), you can integrate it with your other cloud storage accounts and control all of them through just one interface, and you can use it on an unlimited number of devices. Plus it’s fast. You can even store a video on their servers and then stream it to your device with no lag or buffering, which is something you can’t do with some other options out there.

    At the end of the day, you need to keep your files in a safe place that’s easily accessible. But you shouldn’t have to pay too much either. That’s why we recommend getting Koofr Cloud Storage, especially since their 100GB Lifetime Subscription package is marked down to just $29.99. That’s a one-time-only payment, by the way, so it won’t ever cost you more than that.

      Koofr Cloud Storage: Lifetime Subscription (100GB) – $29.99

    See Deal

    Prices subject to change.

    Note: When you purchase something after clicking links in our articles, we may earn a small commission. Read our affiliate link policy for more details.

    Our DealPost commerce team presents the best deals on products and services from online retailers and our partners.

    0 ) { var productLinkPosition = “Slideshow”; } else if ( $(this).parents(‘.emo-sb’).length > 0 ) { var productLinkPosition = “Product Sidebar”; } else if ( $(this).parents(‘.at-a-glance.top’).length > 0 ) { var productLinkPosition = “AAG Top”; } else if ( $(this).parents(‘.at-a-glance’).length > 0 ) { var productLinkPosition = “AAG Bottom”; } else if ( $(this).parents(‘.quick-hits.medium’).length > 0 ) { var productLinkPosition = “Quick Hit Medium”; } else if ( $(this).parents(‘.quick-hits’).length > 0 ) { var productLinkPosition = “Quick Hit Full”; } else if ( $(this).parents(‘.product-chart’).length > 0 ) { var productLinkPosition = “Product Chart”; } else if ( $(this).parents(‘.emo-list’).length > 0 ) { var productLinkPosition = “Product List”; } else { var productLinkPosition = “Body Text”; } dataLayer.push({ ‘event’: ‘affiliateLink’, ‘eventCategory’: ‘Affiliate Link’, // Hardcoded, not dynamic ‘eventAction’: ‘Click’, // Hardcoded, not dynamic ‘eventLabel’: ”+e.target+”, // The URL the affiliate link leads to ‘productVendor’: $(this).attr(“data-bkvndr”), // The vendor of the product ‘productManufacturer’: $(this).attr(“data-bkmfr”), // The manufacturer of the product ‘productName’: prodName, // The name of the product ‘productId’: $(this).attr(“data-product-id”), // The ID of the product ‘productLinkPosition’: productLinkPosition // location of product link (Product Sidebar, Product Chart, etc.) }); window.permutive.track(‘AffiliateLinkClick’, { category: $(this).attr(“data-bkc”), name: prodName, manufacturer: $(this).attr(“data-bkmfr”), vendor: $(this).attr(“data-bkvndr”) }); }); ]]> a”).on(‘click’,function(e){ var dataLayer = window.dataLayer = window.dataLayer || []; var $clickEl = $(this); var clickUrl = $clickEl.attr(“href”); var clickText = $clickEl.text().trim(); var linkLocation = “Promo”; dataLayer.push({ ‘event’: ‘promoModuleLink’, ‘eventCategory’: ‘Promotion module’, ‘eventAction’: ‘Click’, ‘eventLabel’: linkLocation+” | “+clickText+” | “+clickUrl }); }); ]]> p:eq(7)”); } else { $(“div.techDeals, div.topDeals”).hide(); } // Add heights of all elements up through read these next (no longer existws) (which is placed after fourth p tag) var firstModIndex = $(“#drr-container > p:eq(3)”).index(); $(“#drr-container”).children().slice(0, firstModIndex).each(function() { placementTarget += $(this).height(); }); // Define first mobile ad here so imu counter shows imu1 first imu2 second, etc. var firstMobileAdHtml = getLazyLoadAdHtml(); // Place Right-rail div containers $(“#drr-container”).children().each(function(index,value) { //ignore any hidden elements in the body, like the mobile-only “read this next” module if ($(this).is(‘:visible’)) { if (DEBUG) { console.log($(this)); } if (cumulativeHeight >= placementTarget) { if (DEBUG) { console.log(“cumulativeHeight >= placementTarget and cumulativeHeight is ” + cumulativeHeight + ” and placementTarget is ” + placementTarget); } var placementDiff = 0; //if ($.inArray(loopCounter, adPositions) != -1 || loopCounter >= 5) { if ($.inArray(loopCounter, adPositions) != -1 || (loopCounter >= 5 && loopCounter < 20) ) { //limiting number of imu placements try { IDG.GPT.addExtIMU(); var adDivString; if (true) { adDivString = getLazyLoadAdHtml(); } else { IDG.GPT.IMUCounter = IDG.GPT.IMUCounter + 1; var slotName = IDG.GPT.getIMUSlotName(), adString = "$('#" + slotName + "').responsiveAd({screenSize:'971 1115', scriptTags: []}, false);if (Object.keys(IDG.GPT.companions).length > 0) {IDG.GPT.refreshAd(‘” + slotName + “‘);}”; adDivString = “” + adString + “”; IDG.GPT.defineGoogleTagSlot(slotName ,[[320,50],[300,250],[300,50]],false,true); } placementDiff = applyInsert($(this), adDivString); if (DEBUG) { console.log(“Just placed an ad and the placementDiff is: ” + placementDiff); } placementTarget = cumulativeHeight + placementDiff + AD_HEIGHT_BUFFER; } catch (e){ console.log(“Error: “+e); } }// end inArray() loopCounter++; } // Avoid placing elements too soon due to non-large figures inflating the cumulative height if ($(this).is(“figure”) && !$(this).is(“figure.large”)) { cumulativeHeight += GRAF_HEIGHT; } else { cumulativeHeight += $(this).height() + GRAF_HEIGHT; } } }); // end $(“#drr-container”).children().each() // For mobile only, place ad after second paragraph. (This is imu2.) if (firstMobileAdHtml) { $(firstMobileAdHtml).insertAfter(“#drr-container > p:eq(1)”); } $(“div.lazyload_ad_article”).lazyLoadAd({ threshold : 0, forceLoad : false, // Ad is loaded even if not visible. Default is false. onLoad : false, // Callback function on call ad loading onComplete : false, // Callback function when load is loaded timeout : 1500, // Timeout ad load debug : false, // For debug use : draw colors border depends on load status xray : false // For debug use : display a complete page view with ad placements }); /* * Increments imu counter and generates a ‘name’ based on count like imu2, imu3, etc. * Returns the html and code script needed for the lazy load ad js. */ function getLazyLoadAdHtml() { try { var adString = IDG.GPT.getLazyAdCode(true); return “” + adString + “”; } catch(e) { console.log(“Error: “+e); } } /** * @param jqo Original jquery object target * @param divString The div to be inserted. * @return Difference in height between original placement target and final target. * Checks first 4 elements for an allowable placement (600 pixel window). * If none, place element in first location that does not follow a reject element. */ function applyInsert(jqo, divString) { if (DEBUG) { console.log(“applyInsert at top and jqo index is: ” + jqo.index()); } for (var i=0; i<=4; i++) { $thisElement = jqo.nextAll().andSelf().slice(i, i+1); if (DEBUG) { console.log("Checking first four and i is: " + i + " and this element index is " + $thisElement.index() ); } if ($thisElement.index() < 0) { break; } if (allowPlacement($thisElement)) { return addElement(jqo, $thisElement, divString); } } if (DEBUG) { console.log("No nearby allows so just place in first spot that is not after reject."); } var numElements = jqo.nextAll().length; var startIndex = jqo.index(); for (var i=startIndex; i 0) { children = $("#drr-container").children().slice(jqo.index(), allowElement.index()); } else { children = $("#drr-container").children().slice(allowElement.index(), jqo.index()); } if (children != null) { children.each(function(i) { if (DEBUG) { console.log("About to add this element's height to heigh diff offset"); console.log($(this)); } height += $(this).height() + GRAF_HEIGHT; }); } if (offset pixelWindow) { return true; } else { if (DEBUG) { console.log("Element too close to end. Remaining height is: " + remainingHeight + " and window is " + pixelWindow); } return false; } } try { performance.mark("mark_drr_executed"); } catch(e) { console.log("Error saving performance mark -- this function may not be supported in this browser"); } } // end function exeImuRMobile() function exeImuDesktop() { var DEBUG = false; // use this to get artBodyHeight var heroImgHeight = $('figure.hero-img').outerHeight(true); if (heroImgHeight === null) { heroImgHeight = 0; } // use this to get artBodyHeight var galleryItemHeight = $('figure.thm-gallery').outerHeight(true); if (galleryItemHeight === null) { galleryItemHeight = 0; } // use this to get artBodyHeight var atAglanceTop = $('.at-a-glance.top').height(); if (atAglanceTop === null) { atAglanceTop = 0; } // use this to get artBodyHeight var drrContainerHeight = $('div#drr-container').outerHeight(true); // subtract this from availRRheight var teadsInreadHeight = $('div.teads-inread').height(); if (teadsInreadHeight === null) { teadsInreadHeight = 0; } // subtract this from availRRheight var unrulyAdHeight = $('.unruly_in_article_placement').height(); if (unrulyAdHeight === null) { unrulyAdHeight = 0; } //just in case the in-article ads are picked up... subtract from availRRheight var collapsibleAdHeight = unrulyAdHeight + teadsInreadHeight; // new Deals modules that need to be subtracted from availRRheight var techDealsHeight=0; if ($("#drr-top-ad").children(".techDeals").length>0) { techDealsHeight = 500; } var prodDealsHeight=0; if ($(“#drr-top-ad”).children(“.topDeals”).length>0) { prodDealsHeight = 500; } var modulesRRHeight = techDealsHeight + prodDealsHeight; // new available RR height: availRRheight var availRRheight = ( heroImgHeight + galleryItemHeight + atAglanceTop + drrContainerHeight); availRRheight = availRRheight – (collapsibleAdHeight + modulesRRHeight); // if there is a gallery video, remove the amount of space used to push the right rail down to accommodate the video in the RR (CAT-102) if (galleryItemHeight > 0) { if (DEBUG) { console.log(“if galleryItemHeight greater than zero subtract 476 from workingRRheight / availRRheight: ” + galleryItemHeight); } availRRheight = availRRheight – 476; } var topIMUheight = 0; var topIMUonPageload = false; // this is used when topimu height is acquired on pageload so height is not subtracted from availRRheight twice if ( $(“#topimu”).length !== 0 ) { topIMUheight = $(‘#topimu’).height(); } if ( $(“#gpt-showcase”).length !== 0 ) { topIMUheight = $(‘#gpt-showcase’).height(); } if (topIMUheight === 0) { topIMUonPageload = false; } else { topIMUonPageload = true; } availRRheight = availRRheight – topIMUheight; if (DEBUG) { console.log(“—–on pageload: topIMUheight = ” + topIMUheight + ” and topIMUonPageload = ” + topIMUonPageload + ” typeof: ” + typeof topIMUonPageload); } if (DEBUG) { console.log(‘—–initial available RR height = ‘ + availRRheight); } // removing topper class that adds space on top of top deals module on short RR heights // topper class is only on PCW, MW, TH top deals module if (availRRheight ie9 only ) //if (window.addEventListener) { window.addEventListener(‘scroll’, rrdebounce(function(event) { var st = window.pageYOffset || document.documentElement.scrollTop; // Credits: “https://github.com/qeremy/so/blob/master/so.dom.js#L426” if (st > lastScrollTop) { var y_scroll_pos = window.pageYOffset; // get offset from scrolling //var imuDivOffset = $(“#”+slotIdTop).offset().top; // get offset of topimu on scroll var imuDivOffset = 0; // getting top offset for topimu… using this to trigger placement of imu2 – only happens once if ( (slotIdTop === ‘topimu’ || slotIdTop === ‘gpt-showcase’) && triggered_no_times == 0) { imuDivOffset = $(“#”+slotIdTop).offset().top; } else { // need to get this top offset after each ad is placed – occurs for each ad placed after the topimu if (slotId.indexOf(“imu”) === 0 && triggered_no_times > 0) { imuDivOffset = $(“#”+slotId).offset().top; } } // if scroll position is greater than the just-placed imu’s top offset means we’ve hit/passed the top of the imu, display next imu do this only once per ad if (y_scroll_pos > imuDivOffset && availRRheight > heightLimit) { // this block creates ad string and appends ad to #drr-top-ad div try { // THIS DETERMINES AD SLOT SIZES BASED ON AVAIL RR HEIGHT if (availRRheight > 999) { // if availRRheight is equal to or greater than 1000 pixels, place ad either 250 or 600 pixels tall adSlotsSizes = [[300,250],[300,600],[120,600],[160,600]]; } else { // if availRRheight is less than 1000 pixels and greater than or equal to 650 pixels tall… if (availRRheight 649) { adSlotsSizes = [[300,250]]; } } // this needs to be equal. if triggered is more than counter, it will place all the ads on the page if (triggered_no_times === counter) { // THIS CREATES AD CODE STRING IDG.GPT.IMUCounter = IDG.GPT.IMUCounter + 1; var slotName = IDG.GPT.getIMUSlotName(), adString = “$(‘#” + slotName + “‘).responsiveAd({screenSize:’971 1115’, scriptTags: []}, “+dynamicAd+”);if (Object.keys(IDG.GPT.companions).length > 0 || IDG.GPT.disableInitialLoad) {IDG.GPT.refreshAd(‘” + slotName + “‘);}”; adDivString = “” + adString + “”; IDG.GPT.defineGoogleTagSlot(slotName,adSlotsSizes,false,true); // PLACE AD CODE STRING $(adDivString).appendTo(‘#drr-top-ad’); if (DEBUG) { console.log(“********PLACED AD CODE: “+ slotName+” ********”); } } // this is so ads are placed one at a time, after ad height and buffer space is subtracted from availRRheight in slotRenderEnded event listener triggered_no_times = counter + 1; } catch (e) { console.log(“Error: “+ e); } } // end if y_scroll_pos > imuDivOffset //console.log(“………….scrolling down…….”); } // end if st > lastScrollTop for detection scroll direction else { //console.log(“………..scrolling up…………..”); } lastScrollTop = st 0) { mobileDeviceWidth = window.innerWidth; } else { mobileDeviceWidth = document.documentElement.clientWidth; } if ($(“figure”).hasClass(“thm-gallery”)) { galleryNode = document.querySelector(‘.thm-gallery .embed-wrapper’); } var supportsOrientationChange = “onorientationchange” in window, orientationEvent = supportsOrientationChange ? “orientationchange” : “resize”; window.addEventListener(orientationEvent, function() { // if device is rotated to landscape orientation if (window.orientation === 90 || window.orientation === -90) { eventDeviceOrientation = “landscape”; } else { eventDeviceOrientation = “portrait”; } }, false); if (typeof galleryNode !== ‘undefined’) { if (mobileDeviceWidth 0) { var selectedAds = selectTSOAds(ads,10); if (null != selectedAds && selectedAds.length > 0) { var html = “

    Sponsored Links”; html += “

      “; for (var i=0; i “+selectedAds[i].title+””; if (null != selectedAds[i].pixel && selectedAds[i].pixel.length > 0) { html += selectedAds[i].pixel; } html += “”; } html += “”; $(“#tso”).html(html).show(); } } } function selectTSOAds(ads,max) { if (ads.length <= max) { return ads; } else { var uniq = {}; var found = 0; var selectedAds = []; while (found

    -1 && $thm.deviceWidthAtLeast($thm.deviceBreakpoints.wide)) { $.get(“/napi/tile?def=international.promo”, function(data) { $(“body”).prepend(data); var visitTime = new Date(); visitTime.setTime(visitTime.getTime()+1000*60*60*24); //24 hours $.cookie(‘geoPromoSeen’, ‘true’, { expires: visitTime, path: ‘/’ }); $(“.geo-promo .ss-delete, a.cont-here, a.dont-show”).click(function(e) { e.preventDefault(); if ($(this).is(“.dont-show”)) { visitTime.setTime(visitTime.getTime()+1000*60*60*24*30); //30 days $.cookie(‘geoPromoDontShow’, ‘true’, { expires: visitTime, path: ‘/’ }); } $(“.geo-promo”).fadeOut(function() {$(“.geo-promo”).remove()}) }); } ); } }); ]]> { img.src = img.dataset.original; }); } else { $.getScript(‘/www/js/jquery/jquery.lazyload.min.js’,function(){ $(“img.lazy”).lazyload({ effect : “fadeIn”, threshold: 200, failure_limit:25 }); }); } } }); ]]>‘); } }); }); ]]>BrandPosts are written and edited by members of our sponsor community. BrandPosts create an opportunity for an individual sponsor to provide insight and commentary from their point-of-view directly to our audience. The editorial team does not participate in the writing or editing of BrandPosts.Close”; if ($(“.blog-byline.sponsored-post”).length > 0) { //for Nativo sponsoredPosts brandpost_txt = “

    SponsoredPosts are written and edited by members of our sponsor community. SponsoredPosts create an opportunity for an individual sponsor to provide insight and commentary from their point-of-view directly to our audience. The editorial team does not participate in the writing or editing of SponsoredPosts.Close”; } $(“body”).append(brandpost_txt); $(“.about-brandposts”).css(“top”,event.pageY); if ($(“body”).width() >= 955) { // need different behavior at desktop breakpoint and above //find difference between X position clicked and body width and set as right attr //this is so tooltip doesn’t overflow window var xpos = $(“body”).width() – event.pageX; $(“.about-brandposts”).css({“right”:xpos,”margin-right”:”0″}); } $(“.about-brandposts .close-bar”).click(function() { $(“.about-brandposts”).remove(); return false; }); return false; }); ]]>

    This content is written and edited by members of our sponsor community. Such sponsor content creates an opportunity for an individual sponsor to provide insight and commentary from their point-of-view directly to our audience. The editorial team does not participate in the writing or editing of sponsor content.Close”; if ($(“.blog-byline.sponsored-post”).length > 0) { //for Nativo sponsoredPosts sponsorship_txt = “

    SponsoredPosts are written and edited by members of our sponsor community. SponsoredPosts create an opportunity for an individual sponsor to provide insight and commentary from their point-of-view directly to our audience. The editorial team does not participate in the writing or editing of SponsoredPosts.Close”; } $(“body”).append(sponsorship_txt); $(“.about-sponsorships”).css(“top”,event.pageY); if ($(“body”).width() >= 955) { // need different behavior at desktop breakpoint and above //find difference between X position clicked and body width and set as right attr //this is so tooltip doesn’t overflow window var xpos = $(“body”).width() – event.pageX; $(“.about-sponsorships”).css({“right”:xpos,”margin-right”:”0″}); } $(“.about-sponsorships .close-bar”).click(function() { $(“.about-sponsorships”).remove(); return false; }); return false; }); ]]>

    });//– end document Ready g_bRequireHttps = true; var localeId = getLocale(); $.ajax(‘/ads/tso?localeId=’ + localeId,{ dataType: ‘json’, success: function(data){ renderTSO(data.tsoLinks, g_bRequireHttps); }, error: function(jqXHR,error,thrown){ $thm.debug(“TSO AJAX Status: “+error+”: “+thrown,true); } }); ]]>
    // visit Source of this content →


    spacenity.com ∞ space of infinity | live in the eternity

    space of infinity | live in the eternity

    infinite storages, traffics, bandwidths, inodes for life for free

    *This domain is for sale with few core preconditions.

    Please send your say/offer :

    theupdatebd@gmail.com

    *we prefer hosting company to send offer.

    you may also try in this marketplace:

    sedo

    Leave a Comment