DDG.Data.Experiments = { about_module: { versions: ["v35-1", "v35-2", "v35-3", "v35-4", "v36-7", "v37-1", "v37-2", "v37-3"], variants: ["a", "b"] }, stack_overflow: { versions: ["v35-5", "v35-6", "v35-7", "v36-1", "v36-2", "v36-3"], variants: ["a", "b"] }, spelling: { versions: ["v33-6", "v33-7", "v34-1", "v34-2", "v34-3"], variants: ["a", "b"] }, region_override: { versions: ["v38-2", "v38-3", "v38-4", "v38-5", "v38-6", "v38-7", "v39-1", "v39-2"], variants: ["a", "b"] }, control: { versions: ["v39-3", "v39-4", "v39-5", "v39-6", "v39-7", "v40-1", "v40-2", "v40-3", "v40-4", "v40-5", "v40-6", "v40-7"], variants: ["a", "b"] }, filter_label: { versions: ["v41-1", "v41-2", "v41-3", "v41-4", "v41-5", "v41-6", "v41-7"], variants: ["a", "b", "c", "d"] }, filters_above_organics: { versions: ["v42-1", "v42-2", "v42-3", "v42-4", "v42-5", "v42-6", "v42-7"], variants: ["a", "b", "c", "d"] }, organic_ux: { versions: ["v44-1", "v44-2", "v44-3", "v44-4", "v44-5", "v44-6", "v44-7"], variants: ["a", "b", "c", "d", "e"], locale: "en_us" }, static_news: { versions: ["v47-6", "v47-7", "v48-1", "v48-2", "v48-3", "v48-4", "v48-5"], variants: ["a", "b"] }, control2: { versions: ["v51-2", "v51-3", "v51-4", "v51-5"], variants: ["a", "b"] }, safe_search_filter: { versions: ["v52-1", "v52-2", "v52-3", "v52-4", "v52-5", "v52-6", "v52-7"], variants: ["a", "b"] }, map_module: { versions: ["v57-1", "v57-2", "v57-3", "v57-4", "v57-5", "v57-6", "v57-7"], variants: ["a", "b"], locale: "en_us" }, images_ux: { versions: ["v58-1"], variants: ["a", "b"] }, images_ux_detail: { versions: ["v58-6", "v58-7"], variants: ["a", "b"] }, images_ux_filters: { versions: ["v59-1", "v59-2", "v59-3"], variants: ["a", "b"], englishOnly: true }, placeholder_delay: { versions: ["v61-1", "v61-2", "v61-3"], variants: ["a", "b"] }, back_button: { versions: ["v63-1", "v63-2", "v63-3", "v63-4", "v63-5", "v63-6"], variants: ["a", "b"] }, fixed_ux_header: { versions: ["v64-3", "v64-4", "v64-5", "v64-6", "v64-7"], variants: ["a", "b"] }, ad_layouts: { versions: ["v66-1", "v66-2", "v66-3", "v66-4", "v66-5", "v66-6", "v66-7", "v67-1"], variants: ["a", "b", "c"] }, ad_layouts_2: { versions: ["v67-2", "v67-3", "v67-4", "v67-5", "v67-6", "v67-7"], variants: ["b", "c"] }, serp_ui: { versions: ["v88-3", "v88-4", "v88-5", "v88-6", "v88-7", "v89-1", "v89-2", "v89-3", "v89-4"], variants: ["q", "r"], platformName: "androidwos" }, chrome_desktop_us_portableapps_control: { versions: ["v121-2", "v121-3", "v121-4", "v121-5", "v121-6", "v121-7", "v122-1", "v122-2", "v122-3", "v122-4", "v122-5", "v122-6", "v122-7"], variants: ["o"], locale: "en_us", desktopOnly: true, displayBrowserName: "Chrome" }, serp_show_hide_bolding: { versions: ["v124-1", "v124-2", "v124-3", "v124-4", "v124-5", "v124-6", "v124-7", "v125-1", "v125-2", "v125-3", "v125-4"], variants: ["a", "b", "c"] }, green_urls: { versions: ["v127-1", "v127-2", "v127-3", "v127-4", "v127-5", "v127-6", "v127-7", "v128-1"], variants: ["a", "b", "c", "d"] }, chrome_desktop_store_install_en: { allocation: [0.5, 1], variants: ["e", "f"], desktopOnly: true, englishOnly: true, atb: true, active: false, displayBrowserName: "Chrome", canInstallExtension: true }, chrome_desktop_store_install_non_en: { allocation: [0.5, 1], variants: ["g", "h"], desktopOnly: true, nonEnglishOnly: true, atb: true, active: false, displayBrowserName: "Chrome", canInstallExtension: true }, serp_footer: { versions: ["v129-6", "v129-7", "v130-1", "v130-2", "v130-3", "v130-4", "v130-5", "v130-6"], englishOnly: true, desktopOnly: true, variants: ["e", "f"] }, safe_search_moderate_default: { versions: ["v136-2", "v136-3", "v136-4", "v136-5", "v136-6", "v136-7", "v137-1", "v137-2"], variants: ["a", "b"] }, region_toggle_default: { versions: ["v140-2", "v140-3", "v140-4", "v140-5", "v140-6", "v140-7", "v141-1", "v141-2", "v141-3"], variants: ["a", "b"], desktopOnly: true }, deemphasize_http_links: { versions: ["v143-7", "v144-1", "v144-2", "v144-3", "v144-4", "v144-5", "v144-6"], variants: ["a", "b", "c"] }, no_ads: { versions: ["v148-2", "v148-3", "v148-4", "v148-5", "v148-6"], variants: ["a", "b"], desktopOnly: true }, fonts: { versions: ["v154-1", "v154-2", "v154-3", "v154-4", "v154-5", "v154-6"], variants: ["a", "b"], mobileAppVariants: { sa: "a", sb: "b", sc: "a", sd: "b" } }, ui_updates: { pixelId: "uiu", versions: ["v155-1", "v155-2", "v155-3", "v155-4", "v155-5", "v155-6", "v155-7", "v156-1", "v156-2", "v156-3", "v156-4", "v156-5", "v156-6", "v156-7"], variants: ["a", "b"], mobileAppVariants: { sa: "a", sb: "b", sc: "a", sd: "b" } }, post_install_onboarding: { versions: ["v157-1", "v157-2", "v157-3", "v157-4", "v157-5", "v157-6", "v157-7"], variants: ["a", "b"], desktopOnly: true }, regions_toggle_exp: { pixelId: "rtl", versions: ["v158-1", "v158-2", "v158-3", "v158-4", "v158-5", "v158-6", "v158-7", "v159-1", "v159-2", "v159-3", "v159-4", "v159-5", "v159-6", "v159-7"], variants: ["a", "b"], countries: ["DE", "FR", "PL", "CA", "IT", "ES", "AU", "BR", "NL", "GB", "ID"], desktopOnly: true }, welcome_message: { pixelId: "wcm", versions: ["v163-1", "v163-2", "v163-3", "v163-4", "v163-5", "v163-6"], variants: ["a", "b"], desktopOnly: true, englishOnly: true }, less_prominent_answerbar: { pixelId: "lpab", versions: ["v163-7", "v164-1", "v164-2", "v164-3", "v164-4", "v164-5", "v164-6"], variants: ["a", "b"], desktopOnly: true }, settings_dropdown: { pixelId: "sdd", versions: ["v165-3", "v165-4", "v165-5", "v165-6", "v165-7", "v166-1", "v166-2"], variants: ["a", "b", "c"], desktopOnly: true, englishOnly: true }, welcome_message_2: { pixelId: "wcm2", versions: ["v166-3", "v166-4", "v166-5", "v166-6", "v166-6", "v167-1"], variants: ["a", "b"], desktopOnly: true, englishOnly: true }, homepage_landing: { allocation: [0.033, 0.066, 0.1], variants: ["a", "b", "c"], desktopOnly: true, englishOnly: true, atb: true, active: false, canInstallExtension: true, defaultThemeOnly: true, stickyAtbVariant: true }, homepage_fullbleed_landing: { allocation: [0, 0.2, 0.4], variant: "g", variants: ["x", "w"], desktopOnly: true, englishOnly: true, atb: true, active: false, canInstallExtension: true, defaultThemeOnly: true, minScreenSize: { width: 800, height: 600 }, filter: function() { return window.locale !== "en_GB" } }, homepage_fullbleed_regional_landing: { allocation: [0, 1], variant: "g", variants: ["y"], desktopOnly: true, englishOnly: true, atb: true, active: false, canInstallExtension: true, defaultThemeOnly: true, minScreenSize: { width: 800, height: 600 }, filter: function() { return window.locale === "en_GB" } }, welcome_message_3: { pixelId: "wcm3", versions: ["v168-1", "v168-2", "v168-3", "v168-4", "v168-5", "v168-6", "v168-7"], variants: ["a", "b", "c", "d"], desktopOnly: true, englishOnly: true }, extension_optin: { versions: ["v169-3", "v169-4", "v169-5", "v169-6", "v169-7", "v170-1", "v170-2", "v170-3", "v170-4", "v170-5"], allocation: [0.5, 1], variants: ["k", "l"], desktopOnly: true, englishOnly: true, canInstallExtension: true }, mobile_cards: { pixelId: "mcds", versions: ["v169-2", "v169-3", "v169-4", "v169-5", "v169-6", "v169-7", "v170-1", "v170-7", "v171-1", "v171-2"], variants: ["a", "b"], appsOnly: true, displayBrowserName: "DDG iPhone", mobileAppVariants: { sc: "a", se: "b" } }, ct_retention_exp: { pixelId: "ctexp", versions: ["v174-7", "v175-1", "v175-2", "v175-3", "v175-4", "v175-5", "v175-6", "v175-7"], variants: ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"], countries: ["AT", "AU", "BE", "BR", "CA", "CH", "DE", "DK", "ES", "FI", "FR", "GB", "ID", "IE", "IN", "IT", "JP", "MX", "NL", "NO", "NZ", "PL", "RU", "SE", "SG", "US"], desktopOnly: true }, post_install_homepage: { pixelId: "pih", versions: ["v177-3", "v177-4", "v177-5", "v177-6", "v177-7", "v178-1"], variants: ["a", "b"], desktopOnly: true, englishOnly: true, canInstallExtension: true, defaultThemeOnly: true, minScreenSize: { width: 900, height: 600 } }, mixed_modules: { variants: ["a", "b"], pixelId: "miaexp", versions: ["v192-7", "v193-1", "v193-2", "v193-3", "v193-4", "v193-5", "v193-6", "v193-7"], mobileAppVariants: { sc: "a", se: "b" } }, mobile_cards_refinements: { variants: ["a", "b", "c"], pixelId: "crdexp", versions: ["v203-2", "v203-3", "v203-4", "v203-5", "v203-6", "v203-7", "v204-1"], mobileAppVariants: { sc: "a", sd: "b", se: "c" } }, autocomplete_delay: { variants: ["a", "b"], pixelId: "acdexp", versions: ["v208-3", "v208-4", "v208-5", "v208-6", "v208-7", "v209-1"] }, organic_atb_measure: { allocation: [0, 0.1], variant: "r", variants: ["z"], desktopOnly: true, englishOnly: true, atb: true, active: false, canInstallExtension: true }, mobile_header: { pixelId: "mhdr", versions: ["v211-4", "v211-5", "v211-6", "v211-7", "v212-1", "v212-2", "v212-3"], variants: ["a", "b"], appsOnly: true, mobileAppVariants: { sc: "a", se: "b" } }, home_brand_messaging: { allocation: [0, 0.1, 0.2], variants: ["a", "d"], desktopOnly: true, englishOnly: true, atb: true, active: false, canInstallExtension: true, defaultThemeOnly: true, minScreenSize: { width: 800, height: 600 } }, dynamic_slotting: { pixelId: "sltret", versions: ["v213-2", "v213-3", "v213-4", "v213-5", "v213-6", "v213-7", "v214-1", "v214-2"], variants: ["a", "b"], mobileAppVariants: { sc: "a", se: "b" } }, privacy_nudge: { allocation: [0.3, 0.5, 0.7], variant: "r", variants: ["y", "z"], desktopOnly: true, englishOnly: true, atb: true, active: false, canInstallExtension: true, displayBrowserName: "Chrome" }, ct_test: { pixelId: "cttest", versions: ["v217-2", "v217-3"], variants: ["a", "b"] }, larger_extension_tracker_list: { allocation: [0.3, 0.5, 0.7], variant: "l", variants: ["m", "n"], desktopOnly: true, atb: true, active: false, canInstallExtension: true }, desktop_mobile_app_promo: { allocation: [0, 0.2, 0.4, 0.8], variant: "p", variants: ["v", "w", "x"], desktopOnly: true, englishOnly: true, trap: true, atb: true, active: false, canInstallExtension: true, displayBrowserName: "Chrome" }, cross_product_promotion_mobile: { allocation: [0.6, 0.7, 0.8, 0.9, 1], variant: "x", variants: ["u", "z", "m", "n"], mobileOnly: true, englishOnly: true, atb: true, active: false, trap: true, stickyAtbVariant: true, displayBrowserName: "Safari", filter: function(a) { return (a.device.isSafari && a.device.isEnglish && a.device.isIOS8p && !a.device.isIPad) } }, msh2exp: { variants: ["a", "b"], versions: ["v234-7", "v235-1", "v235-2", "v235-3", "v235-4", "v235-5", "v235-6"], pixelId: "msh2exp", appsOnly: true, mobileAppVariants: { sc: "a", se: "b" }, filter: function(a) { return a.device && a.device.isMobile } }, extension_fingerprint_protection_control: { allocation: [0.8, 0.9], variant: "c", variants: ["k"], active: true, atb: true, canInstallExtension: true }, extension_fingerprint_protection_exp: { allocation: [0.9, 1], variant: "f", variants: ["k"], active: true, atb: true, canInstallExtension: true }, default_region_toggle: { pixelId: "drt", versions: ["v236-2", "v236-3", "v236-4", "v236-5", "v236-6", "v236-7", "v237-1", "v237-2", "v237-3", "v237-4", "v237-5", "v237-6", "v238-7"], variants: ["a", "b"], countries: ["AU", "AT", "DK", "FI", "FR", "DE", "IT", "IE", "NZ", "NO", "ES", "SE", "GB"] } }; DDG.Data.Onboarding = { _: {}, a: { description: "UrbanDictionary campaign 1", variant: "z", urbanDictionaryLandingPage: true }, b: {}, c: { description: "UrbanDictionary campaign 2", variant: "z", urbanDictionaryLandingPage: true }, d: { description: "UrbanDictionary campaign 3", variant: "z", urbanDictionaryLandingPage: true }, e: { description: "UrbanDictionary campaign 4", variant: "z", urbanDictionaryLandingPage: true }, f: {}, g: {}, h: {}, i: {}, j: {}, k: { description: "UrbanDictionary campaign 7", variant: "z", urbanDictionaryLandingPage: true }, l: { description: "UrbanDictionary campaign 8", variant: "z", urbanDictionaryLandingPage: true }, m: { description: "UrbanDictionary campaign 9", variant: "z", urbanDictionaryLandingPage: true }, n: { description: "UrbanDictionary campaign 10", variant: "z", urbanDictionaryLandingPage: true }, o: { description: "UrbanDictionary campaign 11", variant: "z", urbanDictionaryLandingPage: true }, p: { description: "UrbanDictionary campaign 12", variant: "z", urbanDictionaryLandingPage: true }, q: { description: "UrbanDictionary campaign 13", variant: "z", urbanDictionaryLandingPage: true }, r: { description: "UrbanDictionary campaign 14", variant: "z", urbanDictionaryLandingPage: true }, s: { description: "UrbanDictionary campaign 15", variant: "z", urbanDictionaryLandingPage: true }, t: {}, u: { description: "PortableApps One Button Modal", modalButtons: 1 }, v: { description: "Youtube Video Campaign" }, w: {}, x: { description: "Youtube Video Campaign" }, y: {}, z: { description: "Pagefair 2", variant: "y", urbanDictionaryLandingPage: true } }; DDG.Data.Apps = { isIPhone: "https://itunes.apple.com/us/app/id663592361?mt=8", isAndroid: "market://details?id=com.duckduckgo.mobile.android" }; ! function(a) { a.Data.Homepage = { queries: [{ href: "/?q=tilt+shift+images&ia=images", label: "tilt shift images" }, { href: "/?q=thailand+beach+images&ia=images", label: "thailand beach images" }, { href: "/?q=gopro+videos&ia=videos", label: "gopro videos" }, { href: "/?q=jimmy+fallon+videos&ia=videos", label: "jimmy fallon videos" }, { href: "/?q=weather+in+encinitas&ia=weather", label: "weather in encinitas" }, { href: "/?q=weather+in+paris&ia=weather", label: "weather in paris" }, { href: "/?q=sorbet+recipes&ia=recipes", label: "sorbet recipes" }, { href: "/?q=tilapia+recipes&ia=recipes", label: "tilapia recipes" }, { href: "/?q=thai+food+in+San+Francisco&ia=places", label: "thai food in San Francisco" }, { href: "/?q=bars+near+me", label: "bars near me" }, { href: "/?q=katz%27s+deli+new+york&ia=places", label: "katz's deli new york" }, { href: "/?q=orange&ia=meanings", label: "orange" }, { href: "/?q=daft+punk+soundcloud&ia=soundcloud", label: "daft punk soundcloud" }, { href: "/?q=8oz+to+grams&ia=answer", label: "8oz to grams" }, { href: "/?q=define+superlative&ia=definition", label: "define superlative" }, { href: "/?q=people+in+space&ia=answer", label: "people in space" }] } }(DDG); DDG.Data.StaticIAs = [{ id: "images", name: "Images", type: "static", answerType: "Images", meta: { idField: "image", itemType: l("Images"), linkPrimaryText: 1, autoExpand: 0, developer: [{ name: "DDG Team" }], signal_from: "images" }, parameters: [{ key: "size", values: [{ id: "", name: lp("size", "All Sizes") }, { id: "Small", name: lp("size", "Small") }, { id: "Medium", name: lp("size", "Medium") }, { id: "Large", name: lp("size", "Large") }, { id: "Wallpaper", name: lp("size", "Wallpaper") }] }, { key: "type", values: [{ id: "", name: lp("image-type", "All Types") }, { id: "photo", name: lp("image-type", "Photograph") }, { id: "clipart", name: lp("image-type", "Clipart") }, { id: "gif", name: lp("image-type", "Animated GIF") }, { id: "transparent", name: lp("image-type", "Transparent") }] }, { key: "layout", values: [{ id: "", name: lp("image-layout", "All Layouts") }, { id: "Square", name: lp("image-layout", "Square") }, { id: "Tall", name: lp("image-layout", "Tall") }, { id: "Wide", name: lp("image-layout", "Wide") }] }, { key: "color", values: [{ id: "", name: lp("image-color", "All Colors") }, { id: "color", name: lp("image-color", "Color Only") }, { id: "Monochrome", name: lp("image-color", "Black and White") }, { id: "Red", name: lp("color", "Red") }, { id: "Orange", name: lp("color", "Orange") }, { id: "Yellow", name: lp("color", "Yellow") }, { id: "Green", name: lp("color", "Green") }, { id: "Blue", name: lp("color", "Blue") }, { id: "Purple", name: lp("color", "Purple") }, { id: "Pink", name: lp("color", "Pink") }, { id: "Brown", name: lp("color", "Brown") }, { id: "Black", name: lp("color", "Black") }, { id: "Gray", name: lp("color", "Gray") }, { id: "Teal", name: lp("color", "Teal") }, { id: "White", name: lp("color", "White") }] }], sources: [{ id: "ddg", name: "DuckDuckGo", requeryURL: "/i.js?l=" + window.rl + "&o=json&q=" }], region: true, safeSearch: true, templates: DDG.Data.templates.groups.images, deferredURL: "/i.js?l=" + window.rl + "&o=json&q=", allowModuleIA: true, isFullPage: true, supportsInfiniteScroll: true }, { id: "videos", name: "Videos", model: "Video", type: "static", parameters: [{ key: "publishedAfter", values: [{ id: "", name: l("Any Time") }, { id: "d", name: l("Past Day") }, { id: "w", name: l("Past Week") }, { id: "m", name: l("Past Month") }] }, { key: "videoDefinition", values: [{ id: "", name: lp("video-resolution", "Any Resolution") }, { id: "high", name: lp("video-resolution", "High Definition") }, { id: "standard", name: lp("video-resolution", "Standard Definition") }] }, { key: "videoDuration", showDescriptions: true, values: [{ id: "", name: lp("video-duration", "Any Duration"), description: lp("video-duration", "Show videos of any length") }, { id: "short", name: lp("video-duration", "Short"), description: lp("video-duration", "Less than 4 minutes") }, { id: "medium", name: lp("video-duration", "Medium"), description: lp("video-duration", "Between 4 and 20 minutes") }, { id: "long", name: lp("video-duration", "Long"), description: lp("video-duration", "More than 20 minutes") }] }, { key: "videoLicense", values: [{ id: "", name: lp("video-license", "Any License") }, { id: "creativeCommon", name: lp("video-license", "Creative Commons") }, { id: "youtube", name: lp("video-license", "YouTube Standard") }] }], sources: [{ id: "ddg", name: "DuckDuckGo", requeryURL: "/v.js?l=" + window.rl + "&o=json&sr=1&q=" }], region: true, safeSearch: true, meta: { idField: "id", itemType: l("Videos"), developer: [{ name: "DDG Team" }], signal_from: "videos", linkPrimaryText: 1, autoExpand: 0, detailOverlay: "VideoDetailOverlay", primaryText: l("Videos") }, templates: DDG.Data.templates.groups.videos, deferredURL: "/v.js?l=" + window.rl + "&o=json&sr=1&q=", allowModuleIA: true, moreText: l("More Videos"), isFullPage: true, supportsInfiniteScroll: true }, { id: "news", name: "News", answerType: "News", moreText: l("More News"), type: "static", meta: { developer: [{ name: "DDG Team" }], signal_from: "news", itemType: l("News Articles"), rerender: ["image"], primaryText: l("Recent News") }, safeSearch: true, region: true, date: true, allowVertical: true, isFullPage: true, templates: { item: "news_item" }, deferredURL: function() { return "/news.js?l=" + window.rl + "&o=json&noamp=" + (DDG.device.isDesktop ? 1 : 0) + "&q=" }, experimentalDeferredURL: "/news.js?l=" + window.rl + "&o=json&exp=1&q=" }]; ! function(a) { a.Data.HiddenFields = { DATE_FILTER: "df", DATE_SORT: "ds", IA_REQUERY: "iar" } }(DDG); ! function(a) { var b = a.Models; b.Base = function(c) { this.setMaxListeners(500); $.extend(this, c) }; b.Base.prototype = $.extend({}, EventEmitter2.prototype, a.Utils.Events, { set: function(c, i, f) { if (typeof c === "object") { for (var e in c) { this.set(e, c[e], i) } } f = f || {}; var h = this[c], g = h !== i; this[c] = i; !f.silent && g && this._emitChange(c, h) }, clear: function(c, e) { this.set(c, null, e) }, UUID: function() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(g) { var f = Math.random() * 16 | 0, e = g == "x" ? f : (f & 3 | 8); return e.toString(16) }) }, getInstance: function(c) { if (!this["_" + c]) { this["_" + c] = a[c] } return this["_" + c] }, _emitChange: function(c, e) { var f = this[c]; this.emit("change:" + c, f, e); this.emit("change", c, f, e) } }) }(DDG); ! function(m) { var b = m.Models.Base, c, p = 1440, o = 1079, n = 864, g = 590, j = 425, i = [{ id: "xl", width: p }, { id: "l", width: o }, { id: "m", width: n }, { id: "s", width: g }, { id: "xs", width: j }], f = { xl: 94, l: 94, m: 58, s: 0, xs: 0 }, e = j, a = g, h = Math.ceil(g * 1.25); m.Models.Device = c = function(y) { b.call(this, y); this.isEnglish = window.locale && window.locale.substring(0, 2) === "en"; var q = this.ua, z = y.host || window.location.host; this.isEdge = !!/edge\//.test(q); this.isEdgeChromium = !!/edg\//.test(q); this.isEdgeMobile = !!/(edgios|edga)/.test(q); if (!(this.isEdge || this.isEdgeChromium)) { this.isIE = !!document.all; this.isIE9 = !!/msie 9/.test(q); this.isIE10p = !!/msie 1[0123456789]/.test(q); this.isIE11p = !!(/trident\/[789]/.test(q) || /edge\/[0123456789]/.test(q)); if (this.isIE10p || this.isIE11p) { this.isIE = true } } this.isWindowsPhone = !!/windows phone/.test(q); this.isSafari = !!(!this.isWindowsPhone && !this.isEdgeMobile && /\([windows|macintosh|ipad|iphone].* version.* safari/.test(q)); this.safariVersion = -1; if (this.isSafari) { var s = q.match(/version\/([0-9][0-9]?\.[0-9])/); this.safariVersion = (s) ? parseFloat(s[1]) : -1 } this.isWebkit = !!/webkit/.test(q); this.isYandex = !!/yabrowser/.test(q); this.isBeakerBrowser = !!/beakerbrowser/.test(q); this.isVivaldi = !!/vivaldi/.test(q); this.isBrave = !!navigator.brave && typeof navigator.brave.isBrave === "function" || (this.isIOS8p && this.isFirefox && /(\d{2}\.){3}\d{2}/.test(q)) || /brave chrome/.test(q); this.isChromiumBased = !!(/chrome(?!frame)|crios/.test(q) && !this.isIE && !this.isEdge); this.isChrome = !!(this.isChromiumBased && !this.isVivaldi && !this.isYandex && !/opr\/[0-9][0-9]?/.test(q) && !this.isBeakerBrowser && !this.isEdgeMobile && !this.isEdgeChromium && !this.isBrave); this.isFirefox = !!/firefox|fxios/.test(q); this.firefoxVersion = -1; if (this.isFirefox) { var x = q.match(/(firefox|fxios)\/([0-9]+\.[0-9]+)/); this.firefoxVersion = (x) ? parseFloat(x[2]) : -1 } this.isFirefox38AndUp = this.firefoxVersion > 37; this.isFirefox51AndUp = this.firefoxVersion > 50; this.isFirefoxLessThan57 = this.isFirefox && this.firefoxVersion < 57; this.isFirefoxLessThan67 = this.isFirefox && this.firefoxVersion < 67; this.isFirefox67 = this.isFirefox && (Math.floor(this.firefoxVersion) === 67); this.isFirefox68AndUp = this.isFirefox && this.firefoxVersion >= 68; this.isFirefoxFocus = !!/focus/.test(q); this.operaVersion = -1; this.isOpera = !!/opera/.test(q); if (this.isOpera) { var t = q.match(/version\/([0-9.]+)/); if (t) { this.operaVersion = parseFloat(t[1], 10) } } else { if (/opr\/[0-9][0-9]?/.test(q)) { this.operaVersion = parseInt(q.match(/opr\/([0-9][0-9]?)/)[1], 10) } } this.isOperaMini = !!/opera mini|opios/.test(q); this.isOperaMobile = !!/opera mobi/.test(q); this.isOSX = !!/mac os x [0-9]/.test(q); this.isOSXMavericksAndUp = !!/mac os x 10(_|\.)(1\d|9)/.test(q) || !!/mac os x 11(_|\.)[0-9]{1,2}/.test(q); this.isOSXCatalinaAndUp = !!/mac os x 10(_|\.)(1[5-9])/.test(q) || !!/mac os x 11(_|\.)[0-9]{1,2}/.test(q); this.isIPod = !!/ipod/.test(q); this.isIPadOS = (this.isOSX && navigator.maxTouchPoints); this.isIPad = !!(this.isIPadOS || /ipad/.test(q)); this.isIPhone = !!(!this.isWindowsPhone && /iphone/.test(q)); this.isIDevice = (this.isIPad || this.isIPhone || /\Wios\W/.test(q)); this.isIOS8p = !!((this.isIDevice && (this.isIPadOS || /os (8|9|[1-9][0-9])|os 10_10/.test(q)))); this.isIOS8pSafari = !!((this.isIOS8p && !this.isChrome && !this.isOperaMini && !this.isFirefox)); this.isAndroid = !!(!this.isWindowsPhone && /android/.test(q)); this.isLegacyAndroid = this.isAndroid && /android ([1-3](\..+)?|4(\.[0-2].*)?)(;|$)/.test(q); this.isAndroid4_3AndUp = this.isAndroid && !this.isLegacyAndroid; this.isBlackberry = !!/blackberry/.test(q); this.chromeVersion = -1; if (this.isChromiumBased) { var v = q.match(/(chrome|crios)\/([0-9][0-9]?)/); this.chromeVersion = (v) ? parseInt(v[2], 10) : -1 } this.isChrome31AndUpOnAndroid = !!(this.isAndroid && this.isChrome && this.chromeVersion > 30); this.isChrome48AndUp = !!(this.isChrome && this.chromeVersion > 47); this.isAndroidChromeNoOpenSearch = !!(this.isAndroid && this.isChrome && this.chromeVersion > 31 && this.chromeVersion < 57); this.isSilk = !!/silk/.test(q); this.isKonqueror = !!/konqueror/.test(q); this.isWindows = !!/windows/.test(q); this.isWindows10 = !!/windows nt 10/.test(q); this.isLinux = !!(!this.isAndroid && /linux/.test(q)); this.isOnion = !!z.match(/\.onion$/i); this.isDDGIgnore = !!/ddgignore/.test(q); this.isDDGTest = !!/ddgtest/.test(q); this.isSamsung = !!/samsungbrowser/.test(q); this.isDDGApp = !!(y.qs && y.qs.match(/(\&|\?)t\=(ddg_ios|ddg_android)/)) || /DuckDuckGo\/[57]$/i.test(q); this.isUCBrowser = !!/(ucbrowser)/.test(q); this.isUCBrowserIOS = this.isUCBrowser && this.isIPhone; this.isRetina = is_retina = this.dpr > 1; this.is2x = m.is2x = this.dpr > 1; this.is3x = m.is3x = this.dpr > 2; this.hasFixedHeaderSupport = !this.isIDevice; this.isAppleDevice = this.isIDevice || this.isOSX; if (this.isIDevice) { if (this.isChrome) { this.hasFixedHeaderSupport = this.chromeVersion >= 57 } else { if (this.isFirefox) { this.hasFixedHeaderSupport = this.firefoxVersion >= 7.2 } else { if (this.isUCBrowserIOS) { this.hasFixedHeaderSupport = false } else { this.hasFixedHeaderSupport = this.isIOS8pSafari } } } } var u = "Browser"; if (this.isDDGIgnore) { u = "Ignore" } else { if (/seamonkey/.test(q)) { u = "SeaMonkey" } else { if (/iceape/.test(q)) { u = "Iceape" } else { if (/palemoon/.test(q)) { u = "PaleMoon" } else { if (this.isBrave) { u = "Brave" } else { if (this.isSamsung) { u = "Samsung Internet" } else { if (this.isFirefox) { u = "Firefox" } else { if (/opr\//.test(q) || ((this.isAndroid || this.isIDevice) && (this.isOperaMobile || this.isOperaMini || this.operaVersion !== -1))) { u = "Opera" } else { if (this.isFirefoxFocus) { u = "Focus" } else { if (this.isUCBrowser) { u = "UC Browser" } else { if (this.isEdge || this.isEdgeChromium || this.isEdgeMobile) { u = "Edge" } else { if (this.isAndroid) { u = "Android" } else { if (/xbox/.test(q)) { u = "xBox" } else { if (/midori/.test(q)) { u = "Midori" } else { if (/maxthon/.test(q)) { u = "Maxthon" } else { if (this.isYandex) { u = "Yandex" } else { if (/vivaldi/.test(q)) { u = "Vivaldi" } else { if (this.isChrome) { u = "Chrome" } else { if (/fennec/.test(q)) { u = "Fennec" } else { if (/epiphany/.test(q)) { u = "Epiphany" } else { if (this.isFirefox) { u = "Firefox" } else { if (/uzbl/.test(q)) { u = "Uzbl" } else { if (this.isIE && navigator.platform === "Win64" && !k() && Modernizr.touch && document.documentElement.clientWidth == screen.width) { u = "IEMetro" } else { if (this.isIE) { u = "IE" } else { if (this.isOpera) { u = "Opera" } else { if (this.isIPad) { u = "iPad" } else { if (this.isIPhone) { u = "iPhone" } else { if (/arora/.test(q)) { u = "Arora" } else { if (this.isSafari) { u = "Safari" } else { if (this.isKonqueror) { u = "Konqueror" } else { if (this.isBlackberry) { u = "Blackberry" } else { if (/phantomjs/.test(q)) { u = "PhantomJS" } else { if (this.isIDevice) { u = "iOS" } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } if (this.isDDGApp) { u = "DDG " + u } this.browserName = m.browserName = u; this.pixelBrowserName = (this.isUCBrowser) ? "ucbrowser" : u.toLowerCase(); this.pixelPlatformName = this._getPixelPlatformName(); this.pixelBrowserVersion = this._getPixelBrowserVersion(); this.displayBrowserName = this.browserName; if (u === "IEMetro") { this.displayBrowserName = "IE" } else { if (u === "iPhone" || u === "iPad") { this.displayBrowserName = "Safari" } else { if (u === "Android") { this.displayBrowserName = "Chrome" } } } this._updateScreenSize(); this._updateIsMobileDevice(); this.isSafariWithNativeDDG = this._isSafariWithNativeDDG(); this.isFirefoxWithNativeDDG = this._isFirefoxWithNativeDDG(); if ((this.isIPhone && !this.isIPod) || (/mac os x 10[_.]1\d/.test(this.ua)) || (this.isAndroid && /mobile/.test(this.ua) && (this.isChrome || this.isFirefox || this.isEdgeMobile || this.isUCBrowser)) || this.isWindowsPhone || this.isBlackberry) { this.canMakePhoneCalls = true } else { this.canMakePhoneCalls = false } if (this.isMobileDevice && this.browserName === "Firefox") { if (screen.width && screen.width < this.width) { this.width = viewport_width = screen.width } if (screen.height && screen.height < this.height) { this.height = viewport_height = screen.height } this._updateIsMobileDevice() } var r = (this.width < 600 || (this.width < 800 && this.height < 500)) ? 1 : 0; if (r !== this.isMobile) { this.isMobile = is_mobile = r; this.emit("changed:mobile") } this.isDesktop = !this.isMobile && !this.isMobileDevice; this.hasMetaReferrerSupport = !!((this.chromeVersion > 20 && !this.isMobileDevice) || (this.chromeVersion >= 50) || (this.safariVersion > 7 && !this.isWindows && !this.isMobileDevice) || (this.isIOS8pSafari || (this.safariVersion >= 8 && this.isIDevice)) || (this.operaVersion > 14 && !this.isMobileDevice) || this.isFirefox38AndUp || (this.isIOS8p && this.isFirefox) || this.isBrave || this.isUCBrowser); this.$scrollDoc = $("html,body"); this.pixelId = (this.isMobile || this.isMobileDevice) ? "m" : "d"; if (this.isMobileDevice) { this._wasPortrait = this.isMobilePortrait() } window.onresize = $.throttle(200, this._onResize.bind(this)); window.onscroll = this._onScroll.bind(this); if (typeof document.hidden !== "undefined") { this._visibilityChange = "visibilitychange"; this._visibilityState = "visibilityState" } else { if (typeof document.mozHidden !== "undefined") { this._visibilityChange = "mozvisibilitychange"; this._visibilityState = "mozVisibilityState" } } if (this._visibilityChange) { d.addEventListener(this._visibilityChange, this._onVisibilityChange.bind(this), false) } }; c.prototype = $.extend({}, b.prototype, { scrollTop: function(s, r, q) { if (typeof s === "undefined") { if (typeof this._scrollTop !== "undefined") { return this._scrollTop } return this._scrollTop = m.$doc.scrollTop() } if (s === this.scrollTop()) { if (q) { q() } return this._scrollTop = s } if (r && !$.isNumeric(r)) { r = m.animation_speed } if (!r) { this.$scrollDoc.scrollTop(s); if (q) { q() } } else { this.$scrollDoc.animate({ scrollTop: s }, r, q) } return this._scrollTop = s }, getBrowserMoreURL: function() { var q = "https://help.duckduckgo.com/desktop/"; if (this.isChrome) { return q + "chrome" } else { if (this.isOpera) { return q + "opera" } else { if (this.isSafari && !this.isSafariWithNativeDDG) { return q + "safari" } else { if (this.browserName === "SeaMonkey") { return "https://addons.mozilla.org/seamonkey/addon/duckduckgo-ssl/" } else { if (this.isFirefox) { return q + "firefox" } } } } } }, canAddToBrowser: function() { var q = this.getAddToBrowserDirections(); return q.useForSearch || q.setAsHomepage }, getAddToBrowserDirections: function() { if (this._addToBrowserDirections) { return this._addToBrowserDirections } var q = this.browserName, s, r; if (!this._hasInstallationInstructions()) { return this._addToBrowserDirections = {} } if (q === "IE") { r = "ie" } else { if (q === "SeaMonkey") { r = "seamonkey" } else { if (q === "PaleMoon") { r = "palemoon" } else { if (m.addToBrowser.canAddToBraveIOS()) { r = "brave_ios" } else { if (m.addToBrowser.canAddToMobileFirefox() && this.isAndroid) { r = "firefox_android" } else { if (m.addToBrowser.canAddToMobileFirefox() && this.isIDevice) { r = "firefox_ios" } else { if (this.isFirefoxWithNativeDDG) { r = "firefox" } else { if (q === "Firefox") { r = "firefox_old" } else { if (m.device.isUCBrowser && (this.isAndroid || this.isIDevice)) { r = "uc_browser_mobile" } else { if (m.addToBrowser.canAddToChromeMobile() && this.isAndroid) { r = "chrome_android_default" } else { if (m.addToBrowser.canAddToChromeMobile() && this.isIDevice) { r = "chrome_ios_default" } else { if (this.isEdgeMobile && this.isAndroid) { r = "edge_android_default" } else { if (this.isEdgeMobile && this.isIDevice) { r = "edge_ios_default" } else { if (m.addToBrowser.canAddToBraveAndroid()) { r = "chrome_android_default" } else { if (this.isChrome && this.isAndroid) { r = "chrome_android" } else { if (q === "Chrome") { r = "chrome" } else { if (q === "Maxthon" && !this.isOSX) { r = "maxthon" } else { if (this.isSafariWithNativeDDG) { r = "safari" } else { if (this.isIOS8p && this.isSafari) { r = "ios8" } else { if (q === "Safari" && window.postMessage && this.isOSX) { r = "safari_old" } else { if (q === "Safari" && window.postMessage) { r = "safari_windows" } else { if (q === "Opera") { r = "opera" } else { if (q === "Vivaldi") { r = "vivaldi" } else { if (q === "Edge") { r = "edge" } else { if (q === "Brave") { r = "brave" } } } } } } } } } } } } } } } } } } } } } } } } } if (q === "IE") { s = "ie" } else { if (q.match(/^Firefox|PaleMoon|SeaMonkey$/)) { s = "firefox" } else { if (q === "Maxthon") { s = "maxthon" } else { if (q === "Chrome") { s = "chrome" } else { if (q === "Safari") { s = "safari" } else { if (q === "Opera") { s = "opera" } else { if (q === "Vivaldi") { s = "vivaldi" } else { if (q === "Edge") { s = "edge" } } } } } } } } return this._addToBrowserDirections = { useForSearch: r && ("use_for_search_" + r), setAsHomepage: s && ("set_as_homepage_" + s) } }, DDGisBrowserDefault: function() { return this.ua.match(/palemoon|porteus|qupzilla|lxle/gi) }, isTeapot: function() { return this.width >= a && this.height <= h }, isMobileLandscape: function() { return this.isMobile && this.width > this.height && (this.isAndroid && this.width >= e) }, isMobilePortrait: function() { return this.isMobile && !this.isMobileLandscape() }, widthBreakpoint: function() { var q = i.length; while (--q) { var r = i[q]; if (this.width < r.width) { return r.id } } return i[0].id }, gutterSize: function() { return f[this.widthBreakpoint()] }, isPrv: function() { var s = "prv", r = w.sessionStorage; try { r.setItem(s, "1"); r.removeItem(s) } catch (q) { if (q.code === DOMException.QUOTA_EXCEEDED_ERR && r.length === 0) { return true } } return false }, getCountry: function(q) { if (this.countryCode) { return q && q(null, this.countryCode) } $.ajax({ url: "/country.json", success: function(r) { this.countryCode = r && r.country; return q && q(null, this.countryCode) }.bind(this), error: function(r) { return q && q(r) } }) }, getLang: function() { var r = "en", q = m.settings.get(m.settings.LANGUAGE_KEY); if (q && q !== "wt_WT") { r = q.slice(0, 2) } else { if (w.locale) { r = w.locale.slice(0, 2) } } return r }, getLocale: function() { var q = m.settings.get(m.settings.LANGUAGE_KEY); if (q && q !== "wt_WT") { return q } else { if (w.locale) { return w.locale } } return "en_US" }, getColorScheme: function() { var r = window.matchMedia("(prefers-color-scheme: dark)"), q = window.matchMedia("(prefers-color-scheme: light)"); if (r.matches) { return "dark" } else { if (q.matches) { return "light" } } }, _updateScreenSize: function() { var q, r, s = document.documentElement; q = Math.max(s.clientWidth, window.innerWidth || 0); r = Math.max(s.clientHeight, window.innerHeight || 0); if (q !== this.width || r !== this.height) { this.width = viewport_width = q; this.height = viewport_height = r; return true } return false }, _updateIsMobileDevice: function() { var q = /mobile/.test(this.ua) ? 1 : 0; if (this.isOperaMobile || this.isOperaMini || this.isIDevice || this.isAndroid || this.isSilk || (this.width < 600 && this.height < 400)) { q = 1 } this.isMobileDevice = is_mobile_device = q }, _isSafariWithNativeDDG: function() { if (this.browserName !== "Safari" || this.isMobileDevice) { return false } var q = new RegExp("version/(\\d+)\\.(\\d+)(?:\\.(\\d+))?.*safari/").exec(this.ua); if (!q || !q.length) { return false } q.shift(); q = q.map(function(r) { return r || 0 }).join(""); return q && q > 706 }, _isFirefoxWithNativeDDG: function() { if (this.browserName !== "Firefox") { return false } return navigator.buildID && parseInt(navigator.buildID, 10) >= 20141028112145 }, _getPixelBrowserVersion: function() { var q = 0; if (this.isChrome) { q = this.chromeVersion } else { if (this.isFirefox) { q = this.firefoxVersion } else { if (this.isSafari) { q = this.safariVersion } else { if (this.operaVersion !== -1) { q = this.operaVersion } else { if (this.isIE11p) { q = 11 } else { if (this.isIE10p) { q = 10 } else { if (this.isIE9) { q = 9 } } } } } } } return q }, _getPixelPlatformName: function() { var q = "other"; if (this.isAndroid) { q = "android" } else { if (this.isIPod) { q = "ipod" } else { if (this.isIPad) { q = "ipad" } else { if (this.isIPhone) { q = "iphone" } else { if (this.isWindowsPhone) { q = "winphone" } else { if (this.isWindows) { q = "windows" } else { if (this.isLinux) { q = "linux" } else { if (this.isBlackberry) { q = "blackberry" } else { if (this.isOSX) { q = "mac" } else { if (this.browserName === "DDG iOS") { q = "ios" } } } } } } } } } } return q }, _hasInstallationInstructions: function() { if (this.isSilk) { return false } var q = true; if (this.isMobileDevice || this.isMobile) { q = m.addToBrowser.canAddToMobileBrowser() || this.isAndroidChromeNoOpenSearch } return q }, _onResize: function(q) { if (this._updateScreenSize()) { q.isRotation = this.isMobileDevice && this._wasPortrait != this.isMobilePortrait(); this._wasPortrait = this.isMobilePortrait(); this.emit("resize", q) } }, _onScroll: function(q) { delete this._scrollTop; this.emit("scroll", q) }, _onVisibilityChange: function(q) { this.emit("visibilitychange", d[this._visibilityState]) } }); function k() { var q; try { q = !!new ActiveXObject("htmlfile") } catch (r) {} return q } }(DDG); ! function(c) { var a = c.Models.Base, e = 500, b = { 13: "enter", 27: "escape", 32: "space", 37: "left", 38: "up", 39: "right", 40: "down", 16: "shift", 17: "ctrl", 18: "alt", 91: "cmd", 74: "k", 75: "j" }; c.Models.Keyboard = function(f) { a.call(this, f); if (!c.device.isMobileDevice) { $(document).on("keydown", this._onKeydown.bind(this)) } }; c.Models.Keyboard.prototype = $.extend({}, a.prototype, { namespaced: function(f) { if (!f) { return !!this.namespace } return this.namespace && this.namespace.match(f) }, focusedOnInput: function() { var f = document.activeElement; return f && (f.nodeName === "INPUT" || f.nodeName === "TEXTAREA" || f.localName === "button") }, keyCodeIsOneOf: function(h, g) { var f = b[h]; return (f && g.indexOf(f) > -1) }, _onKeydown: function(h) { var g = h.keyCode; clearTimeout(this._activeTimeout); this.set("active", 1); if (!fq && (!kk || kk == "1") && !h.ctrlKey && !h.metaKey && !this.focusedOnInput() && c.duckbar && c.duckbar.areOrganicsShowing) { if (this.enableSERPShortcuts) { this._onSERPKeydown(h) } if (g == 13) { nke() } if (g == 84) { nkt() } } var f = b[g]; if (f && !h.altKey && !h.shiftKey) { if (this.namespace) { this.emit(f + "." + this.namespace, h) } this.emit(f, h) } this._activeTimeout = setTimeout(function() { clearTimeout(this._activeTimeout); this.set("active") }.bind(this), e) }, _onSERPKeydown: function(g) { var f = g.keyCode; if (f == 40 || f == 74) { if (this.nativeUpDown) { return } g.preventDefault(); nkda() } if (f == 38 || f == 75) { if (this.nativeUpDown) { return } g.preventDefault(); nkua() } if (f == 191) { if (c.device.isFirefox) { g.preventDefault() } nks() } if (f == 79 || f == 76) { nko() } if (f == 222 || f == 86) { nkn() } if (f == 111 || f == 72) { nks() } if (f == 32) { nksb() } if (f == 77) { nkm() } if (f == 68) { nkd(g) } } }) }(DDG); ! function(c) { var b = c.Models, a = b.Base; b.SelectList = function(e) { a.call(this, e); this.select(e.selectedId || this.values[0].id) }; b.SelectList.prototype = $.extend({}, a.prototype, { select: function(e) { var f; this.values.forEach(function(g) { if (g.id === e) { g.selected = true; f = g } else { g.selected = false } }); if (!f) { this.select(this.values[0].id) } else { this.set("selected", f) } } }) }(DDG); ! function(f) { var e = f.Models, c = e.Base, b = "d", a = 10; e.Deep = function(h) { this._backData = h.backData; this._device = h.device; this._page = h.page; this._pixel = h.pixel; this._settings = h.settings; this._adFeed = h.adFeed; this.hideRelated = window.iqa; this.results = {}; this.resultDomains = {}; var g = this.getInstance("adFeed"); g.on("change:ads", function() { if (this.results.a && this.results.a.length) { this.getInstance("pixel").fire("sad", { b: 1, r: "ad" }); return } if (this._heldOrganics) { this.nrnWrapper("d", this._heldOrganics); delete this._heldOrganics } }.bind(this)); g.on("change:lateAds", function() { if (g.lateAds.length) { nrn("a", g.lateAds, 1) } }) }; e.Deep.prototype = $.extend({}, c.prototype, { isLastResult: false, isOutOfResults: false, pageNumber: 1, started: 0, finished: 0, _currentPageItems: { a: [], d: [] }, timeSinceStarted: function() { return this.started ? new Date().getTime() - this.started : 0 }, timeSinceFinished: function() { return this.finished ? new Date().getTime() - this.finished : 0 }, getResultCount: function() { return r1c }, getFirstSource: function() { return this.results && this.results.d && this.results.d[0] && this.results.d[0].s }, getAttributionSource: function() { if (!this.results || !this.results.d || this.results.d.length <= 5) { return "" } var g = this.getFirstSource(); if (g === "yandexru" || g === "yandextr") { return "yandex" } return "" }, canShowAttribution: function() { return !this.showedAttribution && !!this.getAttributionSource() }, getNewsItems: function(h) { if (!this.results.d || !this.results.d.length) { return } var g = []; for (var k = 0; k < this.results.d.length; k++) { var m = this.results.d[k], j = m.da && m.da.split(","); if (j && j.indexOf("news") > -1) { var n = m.d.split("/")[0]; g.push({ title: m.t, excerpt: m.a, url: m.u, source: n, fetch_image: f.Data.NewsImageDomains.indexOf(n) > -1, rank: k }) } } if (h && g.length === 1 && g[0].rank < 5) { return [] } return g }, addResults: function(h, g) { if (!this.results[h]) { this.results[h] = g } else { this.results[h] = this.results[h].concat(g) } this._emitChange("results") }, _checkBackClickFromSecondPage: function() { if (!this.getInstance("settings").autoloadDisabled() || this._hasShownFirstPage) { return } var h = this.getInstance("backData").getId(), g = h && h.match(/r([1a])-([0-9]*)/); if (g) { this._hasShownFirstPage = (g[1] === "1" && parseInt(g[2], 10) > 8) || (g[1] === "a" && parseInt(g[2], 10) > 0) } }, nrnWrapper: function(o, j) { var n = this.getInstance("page").ads, k = this.getInstance("adFeed"), h = this.getInstance("settings").autoloadDisabled() && o === b; if (o === "d" && !this._hasShownFirstPage) { for (var m = 0; m < j.length; m++) { if (j[m].k) { k.setDefaultAds([j[m]], n.adxExperiment); break } } var g = k.getAds(); if (k.yjsFeedActive) { if (k.loading) { this._heldOrganics = j; k.organicsLoaded(); return } else { if (g.length) { this.nrnWrapper("a", g) } } } else { if (!(this.results.a && this.results.a.length) && g.length) { this.nrnWrapper("a", g) } } } this._checkBackClickFromSecondPage(); if (h && !this._hasShownFirstPage) { this._currentPageItems[o] = j.slice(0, a); this._pendingOrganics = j.slice(a); this._hasShownFirstPage = true; j = this._currentPageItems[o] } else { this._currentPageItems[o] = j } this.addResults(o, j); if (o === "a" && !n.isBlocked() && j.length) { this._sendAdImpressions(j) } if (o === "a" && this.pageNumber === 1) { n.setAds(j) } if (this._currentPageItems.a.length && this._currentPageItems.d.length) { this._splitNrnResults() } else { if (o === "d") { nrn(o, j, true, true); this._setFirstPageRendered(); this._currentPageItemsReset() } } }, pageNumberIncrement: function() { return ++this.pageNumber }, pageNumberDecrement: function() { return --this.pageNumber }, hasPendingResults: function() { return this._pendingOrganics && this._pendingOrganics.length }, showPendingResults: function() { if (this.hasPendingResults()) { var g = this._pendingOrganics; this._pendingOrganics = null; this.nrnWrapper("d", g); f.ImageLoader.registerAll($(".js-lazyload-icons"), "scrollY") } }, hasMoreResultsToLoad: function() { var h = this.results.d ? this.results.d.length : 0; var i = this.hasPendingResults(); var g = ""; if (i) { g = this._pendingOrganics[i - 1].n } else { if (h) { g = this.results.d[h - 1].n } } return !!g }, _currentPageItemsReset: function() { this._currentPageItems.a = []; this._currentPageItems.d = [] }, _sendAdImpressions: function(j) { var h = {}, k = this.getInstance("page"), i = false; h.n = j.length; h.rl = window.rl; j.forEach(function(q, p) { q.adn = j.length; if (q.l && q.l.indexOf("sponsored__sitelink-description") > -1) { i = true } if (this.pageNumber === 1) { q.adf = 1 } }.bind(this)); h.sld = i ? 1 : 0; var o = j[0].d; o = o.split("/"); o = o.shift(); if (o) { h.d = o } var n = k.ads.adx; if (n && n !== "ctl") { h.adx = n } if (window.sourceTag) { h.st = window.sourceTag } if (k.ads.adxExperiment) { h.adx_name = k.ads.adxExperiment } try { var g = j.map(function(p) { return p.d }).join(","); h.ds = g } catch (m) {} this.getInstance("pixel").fire("ad", j[0].s || "default", h) }, _canShowSouthAds: function() { return this.pageNumber === 1 && f.settings.isDefault("kav") && f.settings.isDefault("k1") && !this.getInstance("adFeed").isUsingDefaultAds() }, _splitNrnResults: function() { var m = true, h = false, k, g, i = this.getInstance("page").ads, j = this.getInstance("device").isMobile ? 1 : 2; if (this.getInstance("settings").autoloadDisabled() && !this._hasRenderedFirstPage) { this._blockResultSplit = true; if (this._currentPageItems.d.length < 10) { this._blockResultSplit = false } } if (this._currentPageItems.a.length > j && !this._blockResultSplit) { nrn("a", this._currentPageItems.a.slice(0, j), m); nrn("d", this._currentPageItems.d.slice(0, 15), m, h); this.pageNumber++; this.emit("add-separator"); nrn("a", this._currentPageItems.a.slice(j, this._currentPageItems.a.length), m); h = true; nrn("d", this._currentPageItems.d.slice(15, this._currentPageItems.d.length), m, h) } else { if (this._currentPageItems.a.length && i.adx !== "rel2" && this._canShowSouthAds()) { k = i.getNorthAds(this._currentPageItems.a); nrn("a", k, m, h); g = i.getSouthAds(this._currentPageItems.a); h = g.length === 0; nrn("d", this._currentPageItems.d, m, h); if (g.length) { h = true; nrn("a", g, m, h) } } else { if (this._currentPageItems.a.length) { nrn("a", this._currentPageItems.a, m, h); h = true; nrn("d", this._currentPageItems.d, m, h) } } } this._currentPageItemsReset(); this._setFirstPageRendered() }, _setFirstPageRendered: function() { if (!this.finished) { this.set("finished", new Date().getTime()) } this.emit("rendered"); if (this.getInstance("settings").autoloadDisabled()) { this._hasRenderedFirstPage = true; this._blockResultSplit = false } } }) }(DDG); ! function(c) { var b = c.Models, a = b.Base, f = [{ name: l("Any Time"), id: "" }, { name: l("Past Day"), id: "d" }, { name: l("Past Week"), id: "w" }, { name: l("Past Month"), id: "m" }, { name: l("Past Year"), id: "y" }], e = 4; b.Search = function(g) { this.dateFilterId = window[c.Data.HiddenFields.DATE_FILTER]; this.deepAnswerIAs = {}; this.isAdultQuery = window.iqa; this.isMinusQuery = window.iqm; this.isQuoteQuery = window.iqq; this.isDomainQuery = window.iqd; this.isVertical = false; this.isSiteQuery = window.rq && window.rq.indexOf("site%3A") !== -1; a.call(this, g); this.on("change:dateFilterId", this._setDateFilter.bind(this)); this.on("change:isVertical", this._changedVertical.bind(this)); this._setDateFilter() }; b.Search.prototype = $.extend({}, a.prototype, { _dateFilters: f, requery: function() { this.emit("requery") }, addBangToSiteInQuery: function(g, h) { return h.replace(new RegExp("(^|\\s)(" + g + ")($|\\s)", "i"), "$1!$2$3") }, isLatLonQuery: function() { return !!c.get_query().match(/latitude|longitude/gi) }, getDateFilterName: function() { return this._dateFilterName }, getResultCount: function() { return window.r1c || 0 }, _changedVertical: function() { if (this.isVertical && this.dateFilterId === f[e].id) { this._hadPastYear = true; this.set("dateFilterId", "") } else { if (!this.isVertical && this._hadPastYear) { this.set("dateFilterId", f[e].id) } } }, _setDateFilter: function() { this._dateFilters.forEach(function(g) { if (g.id === this.dateFilterId) { g.selected = 1; this._dateFilterName = g.name } else { g.selected = 0 } }.bind(this)) }, getDateFilters: function() { if (this.isVertical) { return this._dateFilters.slice(0, e) } return this._dateFilters }, getSiteQuery: function(q) { if (!q) { return false } q = decodeURIComponentSafe(q); q = c.strip_html(q); var h, g, t = false, n, s = [], o, r = q, p = []; n = q.match(/((NOT )?SITE:)([^\s]+)/); if (n) { t = !!n[2]; p = n[3].split(","); r = q.substring(0, n.index - 1); for (var m = 0; m < p.length; m++) { if (!p[m]) { continue } h = []; for (var k = 0; k < p.length; k++) { if (k !== m) { h.push(p[k]) } } o = (t) ? " NOT SITE:" : " SITE:"; g = (h.length) ? o + h.join(",") : ""; s.push({ site: p[m], clearQuery: encodeURIComponent(r + g) }) } } if (!this.isYhsSource() && t && (s.length > 1 || rqd.toLowerCase().indexOf("not site:") !== -1)) { s = [] } return { str: q, query: r, sites: s, isExcluding: t } }, isYhsSource: function() { return this.src === "yhs" }, isQuotedQuery: function() { return c.get_query().match(/(\'.+\')|(\".+\")/) } }) }(DDG); ! function(b) { var a = b.Models.Base; b.Models.Search.Spelling = function(c) { a.call(this, c); this.type = this.type.toLowerCase(); this.query = decodeURIComponentSafe(c.link); this.recourseQuery = decodeURIComponentSafe(c.recourseLink); this.parsedQuery = c.suggestion && c.suggestion.replace(/<\/?[^>]+(>|$)/g, ""); if (this.type === "nmrc") { this.parsedQuery = window.rq } }; b.Models.Search.Spelling.prototype = $.extend({}, a.prototype, { isValidType: function() { return (this.type && this.type.match(/irf|dym|nmrc/)) }, makeSpellingURL: function(f, e, c) { if (c) { f += "&iar=" + c + "&ia=" + c } var g = b.searchExperiments ? b.searchExperiments.getExperimentGroup("rspexp2") : null; return "/?q=" + f + (e ? "&norw=1" : "") + (w.rv ? "&v=" + w.rv : "") + (w.kurl ? w.kurl : "") + (g ? "&rspexp=" + g : "") } }) }(DDG); var d = document; var w = window; var cd, dz, da, fk, fb, fs, fm, fe, fl, fo, fa, fn, fq, fz, ie, io, ir, is, ga, gd, rc, rd, rs, rsd, rdc, rsc, rtc, rii, rin, rir, rl, rp, reb, rebc, sx, sy, tl, tlz, tac, tr, ts, tn, tsl, tz, nir, kurl, is_mobile, dow, iosx; fb = irl = il = dz = da = dam = daiq = daia = fz = tl = tlz = sx = sy = fl = fo = fa = fn = rdc = rtc = rsc = rii = rin = rebc = tsl = tac = tn = tz = fe = fmx = fmy = ieof = iad = iad2 = iad3 = iadt = 0; kurl = ""; rpc = fk = fs = 1; tr = new Array(); ts = new Array(); rsd = new Array(); reb = new Array(); ! function(c) { var b = c.Models, a = b.Base; b.Hidden = function(f) { a.call(this, f); this._vals = {}; for (var g in c.Data.HiddenFields) { var e = c.Data.HiddenFields[g]; if (window[e]) { this.set(e, window[e]) } } }; b.Hidden.prototype = $.extend({}, a.prototype, { set: function(e, f) { this._vals[e] = f; this.emit("change") }, get: function(e) { return this._vals[e] }, clear: function(e) { delete this._vals[e]; this.emit("change") }, toJSON: function() { return $.extend({}, this._vals) } }) }(DDG); ! function(c) { var a = c.Models.Base, b = { Firefox: { canInstall: function() { return !this.device.isMobileDevice && this.device.isFirefox && !this.device.isFirefoxLessThan57 }, url: "https://addons.mozilla.org/firefox/downloads/latest/duckduckgo-for-firefox/addon-385621-latest.xpi", reviewsUrl: "https://addons.mozilla.org/firefox/addon/duckduckgo-for-firefox/reviews/", watchCSSForSuccess: true }, Chrome: { canInstall: function() { return !this.device.isMobileDevice && this.device.isChrome && ((this.device.isWindows && this.device.chromeVersion >= 36) || (this.device.isOSX && this.device.chromeVersion >= 56)) }, url: "https://chrome.google.com/webstore/detail/bkdgflcldnnnapblkhphbgpggdiikppg" }, Edge: { canInstall: function() { if (c.device.isEnglish) { return false } return !this.device.isMobileDevice && this.device.isEdgeChromium && ((this.device.isWindows && this.device.chromeVersion >= 36) || (this.device.isOSX && this.device.chromeVersion >= 56)) }, url: "https://chrome.google.com/webstore/detail/bkdgflcldnnnapblkhphbgpggdiikppg" }, Brave: { canInstall: function() { return !this.device.isMobileDevice && this.device.isBrave && ((this.device.isWindows && this.device.chromeVersion >= 36) || (this.device.isOSX && this.device.chromeVersion >= 56)) }, url: "https://chrome.google.com/webstore/detail/bkdgflcldnnnapblkhphbgpggdiikppg" }, Vivaldi: { canInstall: function() { return false }, url: "https://chrome.google.com/webstore/detail/bkdgflcldnnnapblkhphbgpggdiikppg" }, Safari: { canInstall: function() { return !this.device.isMobileDevice && this.device.isOSX && this.device.isOSXCatalinaAndUp && !this.device.isIPadOS && this.device.isSafari && this.device.safariVersion >= 13 && document.location.pathname.indexOf("/app") === 0 }, url: "https://apps.apple.com/app/duckduckgo-privacy-essentials/id1482920575", watchCSSForSuccess: true } }; c.Models.Extension = function(e) { a.call(this, e); this.device = (e && e.device) || c.device; $.extend(this, b[this.device.browserName] || {}) }; c.Models.Extension.prototype = $.extend({}, a.prototype, { canInstall: function() { return false }, isInstalled: function(f) { if (typeof this._isInstalled !== "undefined" && !(f && f.nocache)) { return this._isInstalled } var e = $('
'); $("body").append(e); this._isInstalled = e.is(":hidden") && !c.device.isDDGApp; e.remove(); return this._isInstalled } }) }(DDG); ! function(c) { var b = c.Models.Base, a = "kos"; c.Models.Onboarding = function(f) { b.call(this, f); var e = this.getLastRecordedStep(); this.set("step", e >= 2 && !c.extension.isInstalled({ nocache: true }) ? 1 : e) }; c.Models.Onboarding.prototype = $.extend({}, b.prototype, { setStep: function(e) { switch (e) { case 0: if (!this.hasBeenExposed()) { c.settings.set(a, "0") } this.set("step", e); break; case 1: if (this.getLastRecordedStep() < 1) { c.settings.set(a, "1") } this.set("step", e); break; case 2: if (this.getLastRecordedStep() !== 2) { c.settings.set(a, "2") } this.set("step", e); break; case 3: if (this.getLastRecordedStep() < 3) { c.settings.set(a, "3") } this.set("step", e); break } }, getStep: function() { return this.step }, getLastRecordedStep: function() { var e = parseInt(c.settings.get(a), 10); return e > 0 ? e : 0 }, hasBeenExposed: function() { return !c.settings.isDefault(a) }, hasStarted: function() { return this.step > 0 }, hasCompleted: function() { return this.step === 3 && c.extension.isInstalled({ nocache: true }) }, isResumable: function() { return this.step > 0 }, hasCompletedStep1: function() { return c.extension.isInstalled({ nocache: true }) || this.step >= 2 } }) }(DDG); ! function(h) { var b = h.Models.Base, k = 3, e = "cppm-s-v2", j = "cppm-i-v2", g = "cppm-d-v2"; h.Models.MobileOnboarding = function(m) { b.call(this, m); var p, s, q; this.hasStorage = true; this.wasExposedToV1 = false; try { if (window.localStorage) { for (var o = 0; o < window.localStorage.length; o++) { var n = window.localStorage.key(o); if (n && /^cppm-.*-v[12]$/.test(n)) { window.localStorage.removeItem(n) } } if (this.useLocalStorage) { p = window.localStorage.getItem(e); s = window.localStorage.getItem(j); q = window.localStorage.getItem(g) } } else { this.hasStorage = false } } catch (r) { this.hasStorage = false } this.set("statuses", i(p)); this.set("impressions", a(s)); this.set("isDirty", String(q) === "true"); this.set("openStatuses", i()) }; h.Models.MobileOnboarding.prototype = $.extend({}, b.prototype, { completeStep: function(n) { this.set("statuses", this.statuses.map(function(q, p) { if (p === n) { return "completed" } return q })); if (this.useLocalStorage) { var m = c(this.statuses); try { if (window.localStorage) { window.localStorage.setItem(e, m) } } catch (o) {} } }, trackRenderedStep: function(n) { this.set("impressions", this.impressions.map(function(q, p) { if (p === n) { return true } return q })); if (this.useLocalStorage) { var m = f(this.impressions); try { if (window.localStorage) { window.localStorage.setItem(j, m) } } catch (o) {} } }, markDirty: function() { if (!this.isResumable()) { this.set("isDirty", true); if (this.useLocalStorage) { try { if (window.localStorage) { window.localStorage.setItem(g, "true") } } catch (m) {} } } }, setOpenStatuses: function() { this.set("openStatuses", this.getStatuses()) }, isResumable: function() { return this.isDirty || this.statuses.some(function(m) { return m === "completed" }) }, hasBeenExposed: function() { return this.getImpressions().some(function(m) { return m }) }, hasCompletedAllSteps: function() { return this.statuses.every(function(m) { return m === "completed" }) }, hasDdgAsDefault: function() { return this.statuses[0] === "completed" }, hasDdgApp: function() { return this.statuses[1] === "completed" }, hasDdgExtension: function() { return this.statuses[2] === "completed" }, getStatuses: function() { return this.statuses.slice() }, getOpenStatuses: function() { return this.openStatuses.slice() }, getImpressions: function() { return this.impressions.slice() }, getPixelStatuses: function(m) { m = m || this.getStatuses(); return (c(m).replace("0", this.createPixelStep(0)).replace("1", this.createPixelStep(1)).replace("2", this.createPixelStep(2)).replace("3", this.createPixelStep(3)) + "n") }, createPixelStep: function(m) { switch (m) { case 0: return "d"; case 1: return "a"; case 2: return "e"; case 3: return "c"; default: return "" } }, getPixelOpenStatuses: function() { return this.getPixelStatuses(this.getOpenStatuses()) }, getPixelImpressionStatuses: function() { return (f(this.getImpressions()).replace("0", this.createPixelStep(0)).replace("1", this.createPixelStep(1)).replace("2", this.createPixelStep(2)).replace("3", this.createPixelStep(3)) + "n") }, getStatus: function(m) { return this.statuses[m] }, getResumeStep: function(m) { m = m || 0; var o = m; for (var n = m; n < this.statuses.length; n++) { if (this.statuses[n] !== "completed") { o = n; break } } return this.statuses[o] === "completed" ? this.statuses.length : o }, getProgressValue: function() { return this.statuses.filter(function(m) { return m === "completed" }).length } }); function i(o) { var m, n = []; if (!o) { for (m = 0; m < k; m++) { n.push("pending") } } else { var p = o.split("-"); for (m = 0; m < k; m++) { n.push(p.indexOf(m.toString()) === -1 ? "pending" : "completed") } } return n } function c(o) { var m = []; for (var n = 0; n < o.length; n++) { if (o[n] === "completed") { m.push(n) } } return m.join("-") } function a(n) { var m, o = []; if (!n) { for (m = 0; m < (k + 1); m++) { o.push(false) } } else { var p = n.split("-"); for (m = 0; m < (k + 1); m++) { o.push(p.indexOf(m.toString()) !== -1) } } return o } function f(o) { var m = []; for (var n = 0; n < o.length; n++) { if (o[n]) { m.push(n) } } return m.join("-") } }(DDG); ! function(c) { var a = c.Models.Base, b = 700, e = 2500; c.Models.AdFeed = function(f) { this._pixel = f.pixel; a.call(this, f); this.ads = []; this.defaultAds = [] }; c.Models.AdFeed.prototype = $.extend({}, a.prototype, { setDefaultAds: function(f, h) { var g = DDG.searchExperiments.v7exp && DDG.searchExperiments.v7exp.activeGroup === "a"; if (this.ads.length || !f || !f.length || g) { return } this.set("defaultAds", f.map(function(j) { var i = this._makeAffiliateAd(j, h); return { a: j.a.substring(0, 75) + (j.a.length > 75 ? "..." : ""), d: j.d, m: 0, s: i.s, p: 1, c: i.c, u: i.u, h: 0, k: 0, i: j.i, t: j.t.substring(0, 60) + (j.t.length > 60 ? "..." : ""), "IE fix": 1 } }.bind(this))) }, getAds: function() { var f = []; if (this.ads && this.ads.length) { f = this.ads } else { if (this.defaultAds && this.defaultAds.length) { f = this.defaultAds } } return f }, setAds: function(g) { var f = this.getInstance("pixel"); if (this.blockReallyLateAds) { f.fire("sad", { b: 1, r: "late" }); return } else { if (!this.loading) { if (g && g.length) { g.forEach(function(h) { h.late = true; delete h.l }) } f.fire("sad", { b: 0, r: "late" }); this.set("lateAds", g || []); return } } clearTimeout(this._fallbackToDefaultTimeout); delete this._fallbackToDefaultTimeout; this.set("loading", false); this.set("ads", g || []) }, isUsingDefaultAds: function() { return !this.ads.length && this.defaultAds.length }, load: function(g) { if (this.loading) { return } var f = nrj(g); f.addEventListener("error", function() { this.setAds([]) }.bind(this)); this.set("yjsFeedActive", true); this.set("loading", true) }, organicsLoaded: function() { this._fallbackToDefaultTimeout = setTimeout(function() { this.set("loading"); this.set("ads", []) }.bind(this), b); this._blockAdsCompletelyTimeout = setTimeout(function() { this.set("blockReallyLateAds", true) }.bind(this), e) }, _makeAffiliateAd: function(g, h) { var f = h ? "&adx_name=" + h : ""; return { c: "/y.js?u2=" + encodeURIComponent(g.c) + f + (window.ra ? "&a=" + window.ra : "") + ("&vqd=" + window.vqd), u: "/y.js?u2=" + encodeURIComponent(g.u) + f + (window.ra ? "&a=" + window.ra : "") + ("&vqd=" + window.vqd), s: g.k } } }) }(DDG); ! function(c) { var a = c.Models.Base, b = { ctl: { rightRailSecond: true }, def: { rightRailSecond: true }, nav: { rightRailSecond: true }, tasb: { siteLinksBothAds: true }, tas1: { siteLinksFirstAdOnly: true }, tas2: { siteLinksSecondAdOnly: true }, oag: { rightRailSecond: true, siteLinksFirstAdOnly: true }, rel2: { rightRailBoth: true }, none: { rightRailSecond: false, rightRailBoth: false, smallFirst: false, smallSecond: false, siteLinksFirstAdOnly: false, siteLinksSecondAdOnly: false, siteLinksBothAds: false } }; c.Models.Ads = function(e) { this._deep = e.deep; this._device = e.device; this._settings = e.settings; a.call(this, e); this.ads = []; this.setBucket("def"); this.on("change:ads", this._updateLayout.bind(this)) }; c.Models.Ads.prototype = $.extend({}, a.prototype, { block: function() { this.set("blocked", 1) }, isBlocked: function() { return !!(this.blocked || !this.getInstance("settings").isDefault("k1")) }, setAds: function(e) { if (this.isBlocked() || !e || !e.length) { return } this.set("ads", e) }, getAds: function() { return this.ads }, getNorthAds: function(f) { return f; var e = 2; if (this.rightRailSecond) { e = 1 } else { if (this.rightRailBoth) { e = 0 } } e = Math.min(f.length, e); if (!this.canShowRightRailAds()) { return f.slice(0, e) } return f.slice(0, e + 1) }, getSouthAds: function(h) { return []; var e, g = (h.length > 1) ? this.numTopAds : 0, f = h.length; if (g - f === 0) { g = 0; f = 1 } if (f - g > 1) { g = f - 1 } e = h.slice(g, f); e.forEach(function(i) { delete i.l }); return e }, hasAds: function() { var e = this.getAds(); return !!e.length }, getNumberOfTopAds: function() { return this.numTopAds }, hasGoodAds: function() { return true; return (this.adx === "tas" || this.adx === "tasb" || this.adx === "tas1" || this.adx === "tas2" || this.adx === "oag") }, canShowGoodAdsLayout: function() { return (!this.getInstance("device").isMobile && this.hasGoodAds() && (this.getInstance("deep").pageNumber === 1)) }, canShowEnhancedSiteLinks: function(e) { if (!this.canShowGoodAdsLayout()) { return false } return (this.siteLinksSecondAdOnly && e > 0) || (this.siteLinksFirstAdOnly && e === 0) || this.siteLinksBothAds }, setBucket: function(f, e) { f = "tas1"; if (this._firstBatchShown) { return } if (this.getInstance("device").isMobile) { f = "none" } if (b[f]) { this.adx = f } var g = c.backData.getData(); this.adxExperiment = g.adx_name || e || "none" }, _updateLayout: function() { var e = this.ads.length; $.extend(this, b.none); if (this.adx !== "none") { $.extend(this, b[this.adx]) } if (e < 2) { this.rightRailSecond = false } if (this.rightRailSecond) { this.smallSecond = true } else { if (this.rightRailBoth) { this.smallFirst = true; this.smallSecond = true } } if (!this.canShowRightRailAds()) { this.rightRailBoth = false; this.rightRailSecond = false } }, setFirstBatchShown: function() { if (this._firstBatchShown) { return } this._firstBatchShown = true; var e = 2; if (this.rightRailSecond) { e = 1 } else { if (this.rightRailBoth) { e = 0 } } if (DDG.pageLayout.isSlottingExperiment()) { e = 10 } this.numTopAds = Math.min(this.getAds().length, e); this.smallFirst = false; this.smallSecond = false; this.rightRailSecond = false; this.rightRailBoth = false }, canShowRightRailAds: function() { var f = this.getInstance("device"), e = this.getInstance("settings"); return !f.isMobileDevice && e.isDefault("kw") && e.isDefault("km") }, hasRightRailAds: function() { if (!this.canShowRightRailAds()) { return false } var e = this.getAds().length; if (e && (e > 2 || this.rightRailBoth || this.rightRailSecond || this.rightRailFirst)) { return true } return false }, canShowAdExtensions: function(f, e) { return !this.getInstance("device").isMobile && f === 0 && this.adx !== "rel2" && e === 1 } }) }(DDG); ! function(b) { var a = b.Models.Base; b.Models.AdSitelinks = function(c) { a.call(this, c); this.hasSitelinkDescriptions = c.sitelinksMarkup && c.sitelinksMarkup.indexOf("sponsored__sitelink-description") > -1; if (c.isShowingLargeSitelinks) { this.hasSitelinkDescriptions = false; this.showEnhancedSiteLinks = false } if (/ebay\.co\.uk|amazon\.co\.uk/i.test(this.domain)) { this.hasSitelinkDescriptions = false; this.showEnhancedSiteLinks = false } }; b.Models.AdSitelinks.prototype = $.extend({}, a.prototype, { canShowLargeSitelinks: function() { if (this.isShowingLargeSitelinks || !this.hasSitelinkDescriptions || !this.isFirstPageOfAds) { return false } return this.canShowGoodAdsLayout || this.layoutName === "def" }, getSitelinkHtml: function() { return this._getSitelinkHtml(this.sitelinksMarkup, this.showEnhancedSiteLinks, this.canShowGoodAdsLayout) }, _getSitelinkHtml: function(g, j, e) { if (!g) { return "" } var c = this._splitSitelinks(g, j || this.canShowLargeSitelinks()); var h = (j && g.indexOf("sponsored__sitelink-description") > -1); var i; var f = "result__sitelinks"; if (this.canShowLargeSitelinks()) { c = c.slice(0, 4); f += " result__sitelinks--large"; i = this._getLargeAdSitelinks(c) } else { if (e && h) { c = c.slice(0, 3); i = this._getGoodAdSitelinks(c) } else { if (e && !h) { f += " result__sitelinks--nodesc"; c = c.slice(0, 6); i = c.join('') } else { c = c.slice(0, 3); i = c.join('') } } } this.tid = this._matchTids(this.tid, c.length); if (this.canShowLargeSitelinks()) { return '
' + i + "
" } return '' + i + "" }, _splitSitelinks: function(i, c) { var e = [], j = "", f = "", g, h; while (i.length) { if (i.indexOf(" 0) { c += '" }, _getGoodAdSitelinks: function(e) { var c = ""; e.forEach(function(f) { f = f.replace(/(]+>)/, "$1 - "); c += '" }); return c }, _matchTids: function(h, e) { if (!e || !h) { return h } var c = h.split("\t"), g = { ad: c.splice(0, 1), sitelinks: c }; g.sitelinks = g.sitelinks.slice(0, e); var f = g.ad.concat(g.sitelinks).join("\t"); return f } }) }(DDG); ! function(e) { var i = e.Data.Settings.regions, h = "kl", f = "kah", c = "wt-wt", j = 3, a = e.Models.Base, n; n = e.Models.Settings.Region = function(o) { this.settings = o.settings; this.prevRegions = []; o.id = o.id || this.settings.get(h); o.prevId = o.prevId || this.settings.get(f); a.call(this, o); this.settings.on("change:" + h, this.setId.bind(this)); this.settings.on("change:" + f, this.setPrevId.bind(this)) }; n.prototype = $.extend({}, a.prototype, { getId: function() { return (window.rlo && window.rl) || this.id || this.getDefaultId() }, getPrevId: function() { return (this.id === this.prevId || this.prevId === this.getDefaultId()) ? null : this.prevId }, getPrevRegions: function() { return this.prevRegions }, getDefaultId: function() { return c }, hasRegion: function() { return this.getId() && this.getId() !== this.getDefaultId() }, hasPrevRegion: function() { return this.getPrevId() && this.getPrevId() !== this.getDefaultId() }, hasRegionOrSuggested: function() { return this.hasRegion() || this.hasPrevRegion() || this.suggestedRegion }, hasUSRegion: function() { return this.getId() && this.getId() !== this.getDefaultId() && this.getId().split("-")[0] === "us" }, isValidRegion: function(o) { return !!i[o] }, setId: function(s, q, p) { if (s === this.id || !this.isValidRegion(s)) { return p && p() } var o = this, r; this.id = s; if (s !== c) { r = this.prevRegions.indexOf(s); if (r !== -1) { this.prevRegions.splice(r, 1) } this.prevRegions.unshift(s); this._trimPrevRegions() } if (q && q.saveToSettings) { if (!q.dontSavePrev) { this.settings.set(f, this.prevRegions.join(",")) } this.settings.set(h, s, { saveToCloud: true, updateURLParams: true, fallbackToURLParam: q.fallbackToURLParam }, function() { o.emit("change:id", o.id); p && p() }) } else { this.emit("change:id", this.id); p && p() } }, setPrevId: function(o) { if (o) { this.prevRegions = o.split(",") } else { this.prevRegions = [] } this._trimPrevRegions(); this.prevId = this.prevRegions[0] }, setDefault: function() { this.setId(this.getDefaultId(), { saveToSettings: true }) }, reset: function(o) { this.prevId = null; this.settings.clear(f); this.setId(this.getDefaultId(), { saveToSettings: true, dontSavePrev: true }, o) }, disableSuggested: function(o) { this.setPrevId(this.getDefaultId()); this.set({ suggestedRegion: null }); this.settings.set(f, this.prevId, { saveToCloud: true }, o) }, disabledSuggested: function() { return this.prevId && this.prevId === this.getDefaultId() }, getName: function(o) { o = o || this.getId(); return l(i[o] || i[this.getDefaultId()]) }, getSmallIconURL: function(o) { return k(o || this.getId()) }, getXSmallIconURL: function(o) { return b(o || this.getId()) }, getLargeIconURL: function(o) { return g(o || this.getId()) }, getAll: function() { var u = [], s, p = this.getId(), o = function(y, v, x) { return { id: y, name: l(v), countryCode: m(y), selected: x } }; var r = this.getPrevRegions(); if (this.suggestedRegion && r.indexOf(this.suggestedRegion) === -1) { r.push(this.suggestedRegion) } for (var t in i) { if (t !== c && r.indexOf(t) === -1) { u.push(o(t, i[t], p === t)) } } u.unshift(o(c, i[c], p === c)); if (r.length && !(r.length === 1 && r[0] === c)) { u[0].showDivider = true } for (var q = r.length - 1; q >= 0; q--) { s = o(r[q], i[r[q]], p === r[q]); if (r[q] !== c && s.name) { u.unshift(s) } } return u }, fetchSuggested: function(o) { e.device.getCountry(this._onFetchedSuggested.bind(this, o)) }, _onFetchedSuggested: function(y, r, q) { if (!q) { return y && y() } var u = q.toLowerCase(), t = [], x = function(A) { this.set({ suggestedRegion: A }); y && y(null, A) }.bind(this); if (u === "us") { return y && y() } if (u === "gb") { u = "uk" } for (var z in i) { var o = z.split("-")[0]; if (o === u) { t.push(z) } } if (!t.length) { return y && y() } if (t.length === 1 || !window.locale) { return x(t[0]) } var p = window.locale.split("_")[0]; for (var s = 0; s < t.length; s++) { var v = t[s].split("-")[1]; if (p === v) { return x(t[s]) } } return x(t[0]) }, _trimPrevRegions: function() { var o = j; if (this.suggestedRegion) { o -= 1 } if (this.prevRegions.length > o) { this.prevRegions = this.prevRegions.slice(0, o) } } }); var m = function(o) { return o.split("-")[0] }, k = function(o) { return "/assets/flags/" + (DDG.is3x ? "60" : DDG.is2x ? "40" : "20") + "/" + m(o) + ".png?v=4" }, b = function(o) { return "/assets/flags/" + (DDG.is3x ? "48" : DDG.is2x ? "32" : "16") + "/" + m(o) + ".png?v=3" }, g = function(o) { return "/assets/flags/" + (DDG.is3x ? "96" : DDG.is2x ? "64" : "32") + "/" + m(o) + ".png?v=4" } }(DDG); ! function(b) { var a = "kae", c = b.Data.Settings[a]; b.Models.Settings.Themes = { KEY: a, getSystemTheme: function() { if (!b.device.getColorScheme) { return } var e = b.device.getColorScheme(); if (e) { return this._getThemeForColorScheme(e) } }, getAll: function() { return DDG.objectToArray(c.values) }, getSettingsForTheme: function(i) { var h = c.values[i], e = c.values[c["default"]].settings; if (h) { return $.extend({}, e, h.settings) } var f = tinycolor(i); if (f.isValid()) { var g = f.toHexString(); return $.extend({}, e, { kj: g, k7: g }) } return $.extend({}, e) }, enableColorSchemeDetection: function(e) { if (!this.colorSchemeMatching) { this.matcher = e; this.prefersDarkMode = window.matchMedia("(prefers-color-scheme: dark)"); this.prefersLightMode = window.matchMedia("(prefers-color-scheme: light)"); this.prefersDarkMode.addListener(e); this.prefersLightMode.addListener(e); this.colorSchemeMatching = true } }, disableColorSchemeDetection: function() { if (this.colorSchemeMatching) { this.prefersDarkMode.removeListener(this.matcher); this.prefersLightMode.removeListener(this.matcher); this.colorSchemeMatching = false } }, _getThemeForColorScheme: function(f) { if (!f) { return } var e = this.getAll(), g = e.find(function(h) { return h.colorScheme && h.colorScheme === f }); if (g) { return g } } } }(DDG); ! function(h) { var b = "/settings.js", g = "application/json", j = "Error ", f = " CloudSave Settings", e = j + "Loading" + f, c = j + "Saving" + f, i = j + "Deleting" + f, a = { url: b, type: "POST", dataType: "json", contentType: g, processData: false }; h.Models.Settings.CloudSave = { keyField: "objectKey", isKeyField: function(k) { return k === this.keyField || k === "key" }, load: function(k, m) { if (!k) { return m(e) } $.ajax({ url: b + "?key=" + k, dataType: "json", success: function(n) { m(null, n) }, error: function() { m(e) } }) }, save: function(k, n, m) { if (!k || !n) { return m && m(c) } $.ajax($.extend({ data: JSON.stringify({ command: "write", objectKey: k, obj: n }), success: function() { m && m(null, n) }, error: function() { m && m(c) } }, a)) }, destroy: function(k, m) { if (!k) { return m(i) } $.ajax($.extend({ type: "POST", data: JSON.stringify({ command: "delete", objectKey: k }), success: function() { m && m(null, true) }, error: function(n) { m && m(i) } }, a)) }, phraseToKey: function(k) { var m = new jsSHA(k, "ASCII"), n = m.getHash("SHA-512", "HEX"); return n }, validatePassPhrase: function(k, n) { if (!k) { return n(lp("cloudsave", "Please enter a pass phrase")) } if (k.length < 9) { return n(lp("cloudsave", "Pass phrase must be at least 9 characters long")) } var m = this.phraseToKey(k); $.ajax({ url: b + "?key=" + m, dataType: "json", success: function() { n(lp("cloudsave", "Pass phrase is already taken.")) }, error: function() { n(null, true) } }) }, suggestPassPhrase: function(m) { var n = 20, k = 4; $.ajax($.extend({ type: "POST", data: JSON.stringify({ command: "passphrase", n: n }), success: function(o) { var q = o.passphrase.split(" "), r = ""; q.sort(function() { return 0.5 - Math.random() }); for (var p = 0; p < k; p++) { r += q[p] + " " } m(null, r.trim()) }, error: function() { m(true) } }, a)) } } }(DDG); ! function(g) { var b = g.Models.Base, f = g.Models.Settings, e = "kp", a = { "1": { name: lp("safe search", "Strict"), description: lp("safe search", "No adult content") }, "-1": { name: lp("safe search", "Moderate"), description: lp("safe search", "No explicit images or videos") }, "-2": { name: lp("setting", "Off"), description: lp("safe search", "Don't filter adult content") } }, c = "-1"; f.SafeSearch = function(h) { b.call(this, h); this.settings.on("change:" + e, this._onSettingChange.bind(this)) }; f.SafeSearch.prototype = $.extend({}, b.prototype, { getId: function() { return this.id || c }, getAll: function() { var h = [], j; for (var i in a) { j = { id: i, name: a[i].name, description: a[i].description }; j.selected = j.id === this.getId(); h.push(j) } return h }, isActive: function() { return this.getId() !== c }, getName: function() { return a[this.getId()].name }, isStrict: function() { return this.getId() === "1" }, isModerate: function() { return this.getId() === "-1" }, isOff: function() { return this.getId() === "-2" }, setId: function(j, i) { var h = { saveToCloud: true, updateURLParams: true, fallbackToURLParam: true }; this.settings.set(e, j, h, i) }, setTemporaryId: function(i, h) { g.hidden.set(e, i); h && h() }, _onSettingChange: function() { var h = this.settings.get(e); this.set("id", h) } }) }(DDG); ! function(p, i) { var u = "January 12, 2025", q = "abcdefghijklmnopqrstuvwxyz", j = i.location.protocol + "//" + i.location.host + "/", v = /<|>|\//g, s = p.Data.Settings, n = "kay", g = "mapkit.SpileTestResults", e = p.Models.Settings.CloudSave, k = p.Models.Settings.Themes, f = p.Models.Base, r; r = p.Models.Settings.Settings = function(x) { x = x || {}; if (x.cloudSaveKey) { this.setCloudSaveKey(x.cloudSaveKey) } this._settings = {}; this._savedSettings = {}; this._urlSettings = {}; this.region = new p.Models.Settings.Region({ settings: this }); this.safeSearch = new p.Models.Settings.SafeSearch({ settings: this }); this.cloudsave = e; this.themes = k; this._updateDeviceDependentSettings(); this._setFromURLParams(); this._setFromQuerystring(); this._backfillGlobals(); this._setFromCookie(); this._restoreCloudSaveKey(); this._useColorScheme() }; r.prototype = $.extend({}, f.prototype, { THEME_KEY: k.KEY, AUTOCOMPLETE_KEY: "kac", LANGUAGE_KEY: "kad", POST_KEY: "kg", MOBILE_INSTRUCTIONS_KEY: "kas", DEFAULT_FIELD_CLASS: "FormField", TYPE_TO_FIELD_CLASS: { "boolean": "BooleanFormField", color: "ColorFormField", composite: "CompositeFormField", thumbnail: "ThumbnailFormField", theme: "ThemeFormField", dropdowncustom: "DropDownCustomFormField", clear: "ClearFormField" }, get: function(x) { if (x === "kl") { return this._getRegionSetting() } var y = this._settings[x] || this.getDefault(x); y = o(x, y); return y }, _getRegionSetting: function() { if (this._settings.kl) { return this._settings.kl } if (this._isInRegionToggleExp() && this._isRegionWithDefaultRegionToggle()) { var z = navigator.language || "en-US"; var y = window.ct === "GB" ? "uk" : (window.ct || "US").toLowerCase(); if (y === "us") { return "wt-wt" } var A = z.split("-")[0]; var x = y + "-" + A; var B = p.Data.Settings.regions; return Object.keys(B).indexOf(x) !== -1 ? x : "wt-wt" } return "wt-wt" }, _isInRegionToggleExp: function() { var z = p.Data.Experiments.default_region_toggle; if (!z) { return false } var A = p.history.get("atb"); if (!A) { return false } var x = z.versions || []; var y = A.slice(0, 6); return x.includes(y) && A[6] === "b" }, _isRegionWithDefaultRegionToggle: function() { var x = ["AU", "AT", "DK", "FI", "FR", "DE", "IT", "IE", "NZ", "NO", "ES", "SE", "GB"]; return x.indexOf(window.ct) !== -1 }, getDefault: function(x) { var y = s[x]; return y && y["default"] }, isDefault: function(x) { return this.get(x) === this.getDefault(x) }, hasCustomLinkStyles: function() { return !(this.isDefault("kae") && this.isDefault("k9") && this.isDefault("kaa") && this.isDefault("k8") && this.isDefault("kx") && this.isDefault("kaf") && this.isDefault("kai") && this.isDefault("kf") && this.isDefault("k7") && this.isDefault("k18")) }, getData: function(z) { var A = $.extend({}, s[z]); A.id = z; if (typeof A.values === "string") { A.values = $.extend({}, s[A.values]) } if (A.values && A.order) { var B, x = {}; for (var y = 0; y < A.order.length; y++) { B = A.order[y]; if (A.values[B]) { x[B] = A.values[B] } } for (B in A.values) { if (!x[B]) { x[B] = A.values[B] } } A.values = x } return A }, getFieldClass: function(x) { return this.TYPE_TO_FIELD_CLASS[x] || this.DEFAULT_FIELD_CLASS }, set: function(x, A, z, y) { z = z || {}; A = o(x, A); if (typeof A === "undefined" || A === "" || A === null || (x !== this.THEME_KEY && this.isDefault(this.THEME_KEY) && A === this.getDefault(x))) { this.clear(x, z, y); if (x === this.THEME_KEY && z.forceTheme) { this._applyTheme(this.getDefault(x), z) } return y && y() } this._settings[x] = A; i[x] = A; if (z.saveToCookie || typeof z.saveToCookie === "undefined") { if (typeof A === "string") { A = A.replace("#", "") } this._savedSettings[x] = A; t(h(x), A, z); if (z.fallbackToURLParam && !document.cookie) { this._urlSettings[x] = A } } if (z.updateURLParams && this._urlSettings[x]) { this._urlSettings[x] = A } if (!z.silent) { this.emit("change:" + x, A) } this.emit("change", x); if (x === this.THEME_KEY) { this._applyTheme(A, z) } if (z.saveToCloud && this._cloudSaveKey) { this.saveToCloud(y) } else { y && y() } }, setTheme: function(z, y, x) { y = y || {}; y.forceTheme = true; this.set(this.THEME_KEY, z, y, x) }, setBulk: function(z, y) { if (z[this.THEME_KEY]) { this.set(this.THEME_KEY, z[this.THEME_KEY], y) } for (var x in z) { if (x !== this.THEME_KEY) { this.set(x, z[x], y) } } }, setTParam: function(x) { this._urlSettings.t = x; this.set("t", x, { saveToCookie: false }) }, clear: function(x, z, y) { z = z || {}; i[x] = ""; delete this._settings[x]; delete this._savedSettings[x]; if (z.saveToCookie || typeof z.saveToCookie === "undefined") { t(h(x), "", { expires: new Date(), clear: true }) } if (z.updateURLParams) { delete this._urlSettings[x] } if (z.saveToCloud) { this.saveToCloud(y) } try { if (x === n) { i.localStorage && i.localStorage.removeItem(g) } else { if (x === e.keyField) { i.localStorage && i.localStorage.removeItem(e.keyField) } } } catch (A) {} if (!z.silent) { this.emit("change:" + x) } this.emit("change", x) }, clearAll: function() { for (var x in this._settings) { this.clear(x) } }, toQueryString: function(x) { return $.param(this.toJSON(x)) }, toJSON: function(x) { x = x || {}; if (x.onlyURLParams) { return $.extend({}, this._urlSettings) } return $.extend({}, x.all ? this._settings : this._savedSettings) }, toBookmarkletURL: function(y) { var x = this.toQueryString(y); return x ? j + "?" + x : j }, toCloudSaveBookmarkletURL: function() { var x = this.getCloudSaveKey(); return x ? j + "?key=" + x : j }, getCloudSaveKey: function() { return this._cloudSaveKey }, setCloudSaveKey: function(x) { b(e.keyField, x); this._cloudSaveKey = x; this.emit("change:cloudsave"); return x }, setCloudSavePassPhrase: function(x) { return this.setCloudSaveKey(e.phraseToKey(x)) }, loadFromCloud: function(x) { x = x || {}; e.load(this._cloudSaveKey, function(A, z) { if (z) { if (x && x.clearAll) { this.clearAll() } this._cloudSettings = z; for (var y in z) { if (this._urlSettings[y]) { delete z[y] } } this.setBulk(z); b(e.keyField, this._cloudSaveKey) } else { this.clearCloudSave() } this.emit(x.initial ? "loaded-initial" : "loaded", A, z) }.bind(this)) }, saveToCloud: function(x) { e.save(this._cloudSaveKey, this._savedSettings, x) }, clearCloudSave: function(y, x) { if (y && y.deleteFromServer) { e.destroy(this._cloudSaveKey, x) } this.clear(e.keyField); this._cloudSaveKey = null; this.emit("change:cloudsave") }, getFontName: function(y) { var x = s.fonts[y]; if ((x && x === "Proxima Nova") || (y && !y.match(/^([a-zA-Z0-9\-\s]+)$/))) { x = "DDG_ProximaNova, DDG_ProximaNova_UI_1, DDG_ProximaNova_UI_2, DDG_ProximaNova_UI_3, DDG_ProximaNova_UI_4, DDG_ProximaNova_UI_5, DDG_ProximaNova_UI_6" } return x }, useRedirect: function() { return this.isDefault("kd") && !p.device.hasMetaReferrerSupport }, autoloadDisabled: function() { return this.isDefault("kav") }, getDropdownSettings: function() { var z = {}; for (var x in s) { if (s[x].dropdownSettings && s[x].dropdownSettings.category) { var y = s[x].dropdownSettings.category; if (!z[y]) { z[y] = [] } z[y][x] = s[x] } } return z }, getThemePalette: function(y, z) { var x = this.get("kae"), A = k.getSettingsForTheme(x); if (A.palette && A[y] === z) { return A.palette } }, _updateDeviceDependentSettings: function() { var y, z, x; for (y in s) { if (s[y].deviceDependent) { x = s[y].values; if (typeof x === "string") { x = s[x] } for (z in x) { if (!this._isValueValidForDevice(x[z])) { delete x[z] } else { if (!s[y]["default"]) { s[y]["default"] = z } } } } } }, _isValueValidForDevice: function(A) { var z = true, y, x; if (A.onDevices) { z = false; for (y = 0; y < A.onDevices.length; y++) { x = A.onDevices[y]; if (p.device[x]) { z = true; break } } } if (z && A.notOnDevices) { for (y = 0; y < A.notOnDevices.length; y++) { x = A.notOnDevices[y]; if (p.device[x]) { z = false; break } } } return z }, isDarkTheme: function() { return p.settings.get("kae") === "d" || p.settings.get("kae") === "t" }, _applyTheme: function(A, y) { y = y || {}; var z = k.getSettingsForTheme(A); this.applyingTheme = true; for (var x in z) { if (!y.forceTheme && this._settings[x]) { continue } this.clear(x); this.set(x, z[x] || this.getDefault(x), { saveToCookie: false }) } this.applyingTheme = false; this.emit("change:themeApplied") }, _setFromQuerystring: function() { for (var x in p.history.curState) { var y = p.history.curState[x]; if (y.match(v)) { continue } if (e.isKeyField(x) && !this.getCloudSaveKey()) { this._urlSettings[x] = y; this.setCloudSaveKey(y) } else { if (x.charAt(0) === "k" || x === "t" || x === "atb" || x === "va") { this._urlSettings[x] = y } } } this.setBulk(this._urlSettings, { saveToCookie: false }) }, _setFromURLParams: function() { if (!i.settings_url_params) { return } for (var x in i.settings_url_params) { var y = i.settings_url_params[x]; if (e.isKeyField(x) && !this.getCloudSaveKey()) { this._urlSettings[x] = y; this.setCloudSaveKey(y) } else { if (!this._urlSettings[x]) { this._urlSettings[x] = y } } } this.setBulk(this._urlSettings, { saveToCookie: false }) }, _setFromCookie: function() { if (!document.cookie) { return } var A = {}, z = document.cookie.split("; "); for (var y = 0; y < z.length; y++) { var B = z[y].split("="); if (B && B.length == 2) { var x = a(B[0]), C = c(B[1]); if (C.match(v)) { continue } if (e.isKeyField(x)) { this.clear(e.keyField); p.pixel.fire("cls", { c: 1 }); this.setCloudSaveKey(C) } else { if (C && !this._urlSettings[x]) { A[x] = C } } } } this.setBulk(A) }, _isLoadableSetting: function(x, y) { if (!x || !y) { return false } if (!s.hasOwnProperty(x) && !e.isKeyField(x)) { return false } if (y.match(v)) { return false } return !this._urlSettings[x] }, _backfillGlobals: function() { var y = 0, x, A; for (; y < 10; y++) { x = a(y.toString()); if (!i[x]) { i[x] = "" } } for (y = 0; y < q.length; y++) { var z = q.charAt(y); x = a(z); A = a("a" + z); if (!i[x]) { i[x] = "" } if (!i[A]) { i[A] = "" } } }, _setDefaultTheme: function(y) { var x = y || k.getSystemTheme(); if (x && x.id !== this.getDefault(this.THEME_KEY)) { p.Data.Settings.kae["default"] = x.id } }, _useColorScheme: function() { var y = k.getSystemTheme(); if (!y) { return } if (!this._settings[this.THEME_KEY] && !this._hasCustomizedTheme()) { this.setTheme(y.id, { saveToCookie: false }); this._enableColorSchemeMatching() } else { if (this._savedSettings[this.THEME_KEY] == y.id && !this._hasCustomizedTheme()) { this.clear(this.THEME_KEY); this._useColorScheme() } else { if (!this._settings[this.THEME_KEY] && this._hasCustomizedTheme()) { var x = DDG.Data.Settings.kae.values["-1"]; y = x } } } this.on("change:themeApplied", this._themeSettingListener); this._setDefaultTheme(y) }, _colorSchemeMatch: function(y) { if (y.matches) { var x = k.getSystemTheme(); if (x) { this._setDefaultTheme(x); this.setTheme(x.id, { saveToCookie: false }) } } }, _enableColorSchemeMatching: function() { this.themes.enableColorSchemeDetection(this._colorSchemeMatch.bind(this)); this._toggleAppearanceSettingListeners(true) }, _disableColorSchemeMatching: function() { this.themes.disableColorSchemeDetection(); this._toggleAppearanceSettingListeners(false) }, _themeSettingListener: function() { var x = k.getSystemTheme(), y = this.get(this.THEME_KEY) === x.id; if (y && !this._hasCustomizedTheme()) { this.clear("kae"); if (!this.themes.colorSchemeMatching) { this._enableColorSchemeMatching() } } else { this._disableColorSchemeMatching() } }, _appearanceSettingListener: function(z) { var x = z.substring(7); if (this.themes.colorSchemeMatching && !this.isDefault(x) && !this.applyingTheme) { var y = this.get(this.THEME_KEY); this.set(this.THEME_KEY, y); this._disableColorSchemeMatching() } }, _toggleAppearanceSettingListeners: function(y) { if (y === null) { return } var x = this.get(this.THEME_KEY), A = this.themes.getSettingsForTheme(x); for (var z in A) { if (y) { this.on("change:" + z, function() { this._appearanceSettingListener(this.event) }.bind(this)) } else { this.off("change:" + z, function() { this._appearanceSettingListener(this.event) }.bind(this)) } } }, _hasCustomizedTheme: function() { var B = this.get(this.THEME_KEY), y = this.themes.getSettingsForTheme(B); for (var A in y) { var x = this.get(A), z = y[A]; if (x === this.getDefault(A)) { x = null } if (x != z) { return true } } return false }, _restoreCloudSaveKey: function() { try { for (var y = 0; y < localStorage.length; y++) { var x = localStorage.key(y), A = localStorage.getItem(x); x = a(x); if (this._isLoadableSetting(x, A) && e.isKeyField(x)) { this.setCloudSaveKey(A) } } } catch (z) {} } }); var c = function(x) { if (!x) { return "" } if (x.indexOf('"') === 0) { x = x.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, "\\") } return x ? decodeURIComponent(x.replace(/\+/g, " ")) : "" }; var t = function(y, B, z) { z = z || {}; z.expires = z.expires || new Date(u); var A = encodeURIComponent(y), x = encodeURIComponent(B); if (!x && (!document.cookie || !document.cookie.match(new RegExp("(^|;)\\s?" + A + "=")))) { return } document.cookie = [A, "=", x, "; sameSite=Strict", (z.secure || location.protocol === "https:") ? "; secure" : "", z.expires ? "; expires=" + z.expires.toUTCString() : "", z.path ? "; path=" + z.path : "", z.domain ? "; domain=" + z.domain : ""].join("") }; var b = function(x, A, y) { try { if (y && y.clear) { localStorage.removeItem(x) } else { localStorage.setItem(x, A) } } catch (z) {} }; var h = function(x) { if (x.charAt(0) === "k") { return x.substr(1, x.length) } return x }; var a = function(x) { if (e.isKeyField(x)) { return x } return "k" + x }; var m = function(x) { var y = s[x]; return typeof y.values === "object" ? y.values : s[y.values] }; var o = function(y, A) { if (!A || !y) { return A } var z = s[y]; if (z && z.type === "color") { var x = m(y); A = x[A] || A } return A } }(DDG, this); ! function(a) { a.Models.TParam = function() { this._param = this.DEFAULT_VARIANT; this.set(a.settings.get("t")) }; a.Models.TParam.prototype = $.extend({}, { DEFAULT_VARIANT: "_", get: function() { return this._param }, set: function(b) { if (!b) { return } if (this._isValidHomepageParam(b)) { this._param = (b.length === 1) ? this.DEFAULT_VARIANT : b.substr(1); this._fromHomepage = true; this._hasValue = true } else { if (/^[a-z0-9]+$/.test(b)) { this._param = b; this._hasValue = true } } }, hasValue: function() { return this._hasValue }, fromDefaultSearch: function() { return this._hasValue && !this.fromHomepage() }, setFromHomepage: function(b) { var c = "h" + b; if (!a.settings.get("t") && this._isValidHomepageParam(c)) { a.settings.setTParam(c) } }, fromHomepage: function() { return this._fromHomepage }, _isValidHomepageParam: function(b) { return /^h[a-z_]?$/.test(b) } }) }(DDG); ! function(b) { var a = b.Models.Base; b.Models.AddToBrowser = function() { this.viewType = (b.device.isMobileDevice) ? "AddToBrowserBanner" : "AddToBrowserBadge" }; b.Models.AddToBrowser.prototype = $.extend({}, a.prototype, { BADGE_DISMISS_KEY: "kak", BADGE_RECURRING_KEY: "kax", canAddToChromeMobile: function() { var e = b.device.isAndroid && b.device.isChrome && b.device.chromeVersion >= 57, c = b.device.isIDevice && b.device.isChrome && b.device.chromeVersion >= 72; return (e || c) && !b.device.isBrave && !b.device.isFirefoxFocus && !b.device.isSamsung && !b.device.isUCBrowser }, canAddToBraveAndroid: function() { return b.device.isAndroid && b.device.isBrave }, canAddToBraveIOS: function() { return b.device.isIOS8p && b.device.isBrave }, canAddToMobileFirefox: function() { return ((b.device.isIOS8p && b.device.isFirefox) || (b.device.isAndroid && (b.device.isFirefox38AndUp || b.device.isFirefoxFocus))) }, canAddToMobileUCBrowser: function() { return b.device.isUCBrowser && (b.device.isAndroid || b.device.isIDevice) }, canAddToMobileBrowser: function() { return (this.canAddToChromeMobile() || (b.device.isIOS8pSafari && !b.device.isUCBrowser) || this.canAddToMobileFirefox() || this.canAddToBraveAndroid() || this.canAddToBraveIOS() || b.device.isEdgeMobile || this.canAddToMobileUCBrowser()) }, canShowMobileBanner: function() { return (this.canAddToMobileBrowser() && b.settings.isDefault(this.BADGE_DISMISS_KEY) && this._canShowAgain()) }, canShowBadgeAgain: function() { return !(b.device.isDesktop && !this._canShowAgain()) }, canShowMobileButton: function() { return (this.canAddToMobileBrowser() && (!b.settings.isDefault(this.BADGE_DISMISS_KEY) || !this._canShowAgain())) }, showDarkInstructions: function() { return this.canAddToMobileBrowser() }, dismiss: function() { var f = (b.opensearch.atbVariant !== b.tParam.DEFAULT_VARIANT) ? b.opensearch.atbVariant : "", g = 4, e = new Date(), c; if (!b.settings.isDefault(this.BADGE_RECURRING_KEY)) { g = 30 } e.setDate(e.getDate() + g); c = b.opensearch.getATBVersionInfo(e).version; if (this._canShowAgain()) { b.settings.set(this.BADGE_RECURRING_KEY, c + f, { saveToCloud: true, fallbackToURLParam: true }) } }, _canShowAgain: function() { var c = b.opensearch.getDaysSinceCohort(b.settings.get(this.BADGE_RECURRING_KEY)), e = !b.settings.isDefault(this.BADGE_RECURRING_KEY); return !e || (e && b.device.isDesktop && c >= 0 && c <= 15) || (e && !b.device.isDesktop && c >= 0) }, canShowOnMobileSerp: function() { return (this.canShowMobileBanner() && b.page.canShowAddToBrowser() && b.tParam.fromHomepage()) }, canShowOnDesktopSerp: function() { return (this.canShowBadgeAgain() && b.page.canShowAddToBrowser() && b.tParam.fromHomepage()) }, canNotYetShowOnDesktopSerp: function() { return (!this.canShowBadgeAgain() && b.page.canShowAddToBrowserButton() && b.tParam.fromHomepage()) }, usesOpenSearch: function() { return this.canAddToChromeMobile() || (b.device.isAndroid && b.device.isEdgeMobile) } }) }(DDG); ! function(b) { var a = b.Models.Base, c = "kao"; b.Models.Settings.OnboardingEducation = function() { this.KEY = c; this.isDismissed = !b.settings.isDefault(c); this.didUserScroll = false; this.isSVGAnimated = false; this.scrollToAnimationDurationMS = 350; this.pauseForAnimationMS = 1000 }; b.Models.Settings.OnboardingEducation.prototype = $.extend({}, a.prototype, { canShow: function() { return (b.settings.isDefault(this.KEY) && !window.extensionsuccess) }, dismiss: function() { b.settings.set(c, -1, { saveToCloud: true }); this.isDismissed = true } }) }(DDG); ! function(a) { a.Models.Settings.OnboardingEducationSlide = function(b) { return { slideIndex: b.model.slideIndex || null, isSVGAnimated: b.model.isSVGAnimated || false, pauseBeforeAnimation: 300, pauseBetweenAnimationIterations: 5000, maxAnimationLoops: 3, animationAnchorEl: { slide1: "monster-eye", slide2: "ghost-girl-face", slide3: "bathtub-periscope", slide4: "scarf-back" } } } }(DDG); ! function(r) { var j, e = { s: "set-text--small", m: "set-text--medium", l: "set-text--larger", t: "set-text--largest" }, a = { w: "set-wide", s: "set-super-wide" }, u = "set-theme--dark", b = "set-theme--terminal", o = "no-theme", p = r.Data.languages.languageFontLookup, h = r.Data.languages.fontSubsets, g = tinycolor; r.Models.Settings.LiveUpdater = j = function(x) { this.settings = x.settings; this.$html = r.$html || $("html"); this.$body = $("body"); this.isHomePage = x.isHomePage; this.$html.removeClass(u); this.$html.removeClass(b); this.$html.removeClass(o); var v = this; this.settings.on("change", function(y) { v[y] && v[y](v.settings.get(y)) }) }; j.prototype = { updateAll: function() { for (var v in j.prototype) { if (v.charAt(0) == "k") { this[v](this.settings.get(v)) } } }, loadFonts: function() { if (!this.settings.isDefault("kt") && !this.settings.isDefault("ka")) { return } var E = r.Data.languages.resultLanguages || {}, A = Object.keys(E) || [], v = [], x = 0, D = 6, C = ""; if (!this.settings.isDefault("kad")) { A.unshift(this.settings.get("kad").split("_")[0]) } if (locale) { A.unshift(locale.split("_")[0]) } if (A && A.length) { for (var B = 0; B < A.length; B++) { var y = A[B]; if (p[y] && v.indexOf(y) === -1) { var F = $.isArray(p[y]) ? p[y] : [p[y]]; for (var z = 0; z < F.length; z++) { C += r.exec_template("theme_font", { name: "_UI_" + x, lang: F[z] }); v = v.concat(h[F[z]]); x++ } if (x >= D) { break } } } } this._clearCSS("customFonts"); if (C) { this.$customFontscss = s(C) } }, k1: function(x) { var v = (x && x == "-1") ? "addClass" : "removeClass"; this.$html[v]("no-ads") }, km: function(x) { var v = (x && x === "m") ? "addClass" : "removeClass"; this.$html[v]("set-align-center") }, ks: function(y) { for (var v in e) { this.$html.removeClass(e[v]) } var x = e[y]; x && this.$html.addClass(x) }, kw: function(x) { this.$html.removeClass("set-wide").removeClass("set-super-wide"); var v = a[x]; v && this.$html.addClass(v) }, kh: function(x) { var v = $("form[name=x]"); if (!v.length) { return } if ((!x || x === "1") && !d.location.port && d.location.protocol !== "https:" && w.location.hostname.indexOf(".onion") === -1) { v.attr("action", "https://" + w.location.host + "/") } else { if ((x && x === "-1") && d.location.protocol !== "http:") { v.attr("action", "http://" + w.location.host + "/") } else { if (this.settings.get("kg") === "p" && r.device.isChrome) { v.attr("action", w.location.protocol + "//" + w.location.host + "/") } else { v.attr("action", "/") } } } }, kg: function(x) { var v = $("form[name=x]"); if (!v.length) { return } var y = (x && x === "p") ? "POST" : "GET"; v.attr("method", y); if (x && x === "p") { d.title = "DuckDuckGo" } if (r.device.isChrome && x && x === "p") { v.attr("action", window.location.protocol + "//" + window.location.host + "//") } }, ko: function(v) { if (this.isHomePage) { return } r.isHeaderFixed = false; this.$html.removeClass("set-header--menu"); this.$html.removeClass("set-header--fixed"); if (v == "1" && r.device.hasFixedHeaderSupport) { r.isHeaderFixed = true; this.$html.addClass("set-header--fixed") } else { if (v == "-2" || v == "-1") { this.$html.addClass("set-header--menu"); delete r._header_height } } }, ku: function(v) { this.$html[k(v)]("set-underlined-links") }, kaf: function(v) { this.$html[k(v)]("full-urls") }, kad: function() { this.loadFonts() }, kag: function(v) { $(".search__button")[k(v)]("search__button--active") }, kt: function(z) { this._clearCSS("kt"); if (!z || z == this.settings.getDefault("kt")) { return } var v = this.settings.getFontName(z) || z, y = this.settings.getFontName(this.settings.getDefault("kt")), x = !!v.match(/Helvetica|Arial|Sans-serif/); if (v.match(/Helvetica/)) { v += ",sans-serif" } this.$ktcss = s(r.exec_template("theme_custom_font", { fontStack: v + "," + y, lightenWeight: x })) }, ka: function(y) { this._clearCSS("ka"); if (!y || y == this.settings.getDefault("ka")) { return } var v = this.settings.getFontName(y) || y, x = this.settings.getFontName(this.settings.getDefault("ka")); if (v.match(/Helvetica/)) { v += ",sans-serif" } this.$kacss = s(".result__a { font-family:" + v + "," + x + ";}") }, kj: function(y) { var G = this.settings.getThemePalette("kj", y); this.$html.removeClass("dark-header"); this._clearCSS("kj"); if (!y || y == this.settings.getDefault("kj")) { return "" } var B = y, x = f(B), E = x.root.toHsl().l > 0.5, D = x.root.toRgbString().replace(/rgb\(|\)/g, ""), A = x.root.toHexString(), C = "", z = {}, F = {}, v = {}; if (!E || x.root.toHsl().s > 0.5) { this.$html.addClass("dark-header") } if (G) { z = { color: G.tertiary, rgb: D, primary: G.primary, bottomBorder: G.secondary, link: G.text.secondary, activeLink: G.text.primary }; F = { icon: G.text.secondary, hoverBg: G.secondary, hoverText: G.text.primary, hoverColor: G.text.primary, background: G.tertiary }; v = { color: A, bg: A, fullPageBg: G.base, detail: x.darker[2], border: G.primary, bottomBorder: G.secondary, outline: G.secondary, text: G.text.secondary, link: G.text.primary, activeLink: G.text.primary, modeBg: G.primary, modeText: G.text.primary, accent1: G.text.secondary, accent2: G.text.primary, accent3: G.secondary, accentText: G.text.primary, accentText2: G.text.secondary, accentText3: G.text.tertiary, btnHoverBg: G.quaternary, btnHoverBorder: G.quaternary, isDark: !E } } else { if (E) { z = { color: A, rgb: D, primary: x.darker[2], bottomBorder: x.darker[0], link: x.text[2], activeLink: x.text[0] }; F = { icon: x.text[3], hoverBg: x.text[2], hoverText: x[2], hoverColor: x.lighter[2], background: x.lighter[4] }; v = { color: A, bg: x.lighter[4], detail: x.lighter[2], border: x.darker[0], bottomBorder: x.darker[0], outline: x.darker[5], text: x.text[1], link: x.text[0], activeLink: x.text[0], tileNav: x.darker[2], modeBg: x.darker[2], modeText: x.text[1], accent1: x.darker[3], accent2: x.darker[4], accent3: x.darker[2], accentText: x.text[2], accentText2: x.text[3], btnHoverBg: A, btnHoverBorder: x.darker[4], isDark: !E } } else { z = { color: A, rgb: D, primary: x.lighter[2], bottomBorder: x.lighter[3], link: x.text[2], activeLink: x.text[0] }; F = { icon: x.text[4], hoverBg: x.text[2], hoverText: x.text[2], hoverColor: x.darker[2], background: x.darker[4] }; v = { color: A, bg: A, detail: x.darker[2], border: x.lighter[3], bottomBorder: x.lighter[3], outline: x.lighter[7], text: x.text[1], link: x.text[0], activeLink: x.text[3], modeBg: x.lighter[1], modeText: x.text[4], accent1: x.lighter[2], accent2: x.lighter[3], accent3: x.lighter[7], accentText: x.text[2], accentText2: x.text[3], accentText3: x.text[4], btnHoverBg: A, btnHoverBorder: x.lighter[3], isDark: !E }; C += t(x, G); C += i(x, G) } } C += r.exec_template("theme_header", z); if (!this.isHomePage) { if (E) { C += q(x) } else { C += t(x, G); C += i(x, G) } C += r.exec_template("theme_header_menu_button", F); C += r.exec_template("theme_zci", v) } this.$kjcss = s(C) }, k7: function(C) { var M = this.settings.getThemePalette("k7", C); this.$html.removeClass("dark-bg"); this.$k7css && this.$k7css.remove(); delete this.$k7css; if (!C || C == this.settings.getDefault("k7")) { return } var I = g(C), F = I.toHexString(), K = I.toPercentageRgbString(), D = f(F), L = D.root.toHsl().l > 0.5, y = K.replace("rgb(", "").replace(")", ""), J = "", B, z = {}, E = {}, G = {}, x = {}, H = {}, v = {}, A = {}; if (M) { B = g(M.text.primary); z = { bg: F, rgbBg: y, text: M.text.primary, rgbText: B.toPercentageRgbString().replace("rgb(", "").replace(")", ""), textTint: M.text.secondary, textTint2: M.text.tertiary, bgTint: M.primary, bgTint2: M.secondary, bgDark: M.tertiary, btnHoverBg: M.quaternary, btnHoverBorder: M.quaternary }; E = { bg: M.secondary, border: M.tertiary, text: M.text.secondary, link: M.text.primary, activeLink: M.text.primary }; G = { icon: M.text.secondary, hoverBg: M.primary, border: M.primary, hoverText: M.text.primary, background: M.tertiary }; x = { primary: M.text.primary, color: M.text.secondary, tertiaryColor: M.text.tertiary, dateColor: M.text.primary }; H = { color: M.text.secondary, bgTint: M.primary }; v = { color: M.primary }; A = { bgColor: M.secondary, borderColor: M.tertiary, textColor: M.text.secondary, linkColor: M.text.primary } } else { B = g(D.text[0]); z = { bg: F, rgbBg: y, text: D.text[0], rgbText: B.toPercentageRgbString().replace("rgb(", "").replace(")", ""), textTint: D.text[3], textTint2: D.text[5], bgTint: L ? D.darker[1] : D.lighter[1], bgTint2: L ? D.darker[0] : D.lighter[2], bgDark: L ? D.lighter[1] : D.darker[1], btnHoverBg: L ? D.darker[0] : D.lighter[2], btnHoverBorder: L ? D.darker[0] : D.lighter[2] }; E = { bg: D.darker[1], border: D.darker[2], text: D.text[5], link: D.text[3], activeLink: D.text[0] }; G = { icon: L ? D.darker[4] : D.text[4], hoverBg: L ? D.darker[1] : D.lighter[1], border: L ? D.darker[1] : D.lighter[1], hoverText: D.text[2], background: L ? D.darker[3] : D.text[2] }; x = { primary: D.text[0], color: D.text[3], tertiaryColor: D.text[5], dateColor: D.text[0] }; H = { color: D.text[3], bgTint: L ? D.darker[1] : D.lighter[1] }; v = { color: L ? D.darker[1] : D.lighter[1] }; A = { bgColor: D.darker[1], borderColor: D.darker[2], textColor: D.text[3], linkColor: D.text[0] } } z.isDark = !L; z.rgbBgDark = g(z.bgDark).toPercentageRgbString().replace("rgb(", "").replace(")", ""); J += r.exec_template("theme_background", z); J += r.exec_template("theme_sidemenu", E); if (this.isHomePage) { J += r.exec_template("theme_header_menu_button", G); if (!L) { J += t(D, M); J += i(D, M) } else { J += q(D, M) } } else { J += r.exec_template("theme_result_snippet", x); J += r.exec_template("theme_result_web_links", H); J += r.exec_template("theme_result_highlight", v); J += r.exec_template("theme_result_message", A) } if (!L || D.root.toHsl().s > 0.5) { this.$html.addClass("dark-bg"); this.isDarkBg = true } this.$k7css = s(J) }, k9: function(x) { this._clearCSS("k9"); if (!x || x == this.settings.getDefault("k9")) { return } var v = g(x); if (v.isValid()) { this.$k9css = s(r.exec_template("theme_result_title", { color: v.toHexString() })) } }, k8: function(z) { this._clearCSS("k8"); if (!z || z == this.settings.getDefault("k8")) { return } var x = g(z), v = this.settings.getThemePalette("k8", z), y = {}; if (x.isValid()) { if (v) { y = { color: x.toHexString(), primary: v.primary } } else { y = { color: x.toHexString(), primary: x.toHexString() } } this.$k8css = s(r.exec_template("theme_result_snippet", y)) } }, kaa: function(x) { this._clearCSS("kaa"); if (!x || x == this.settings.getDefault("kaa")) { return } var v = g(x); if (v.isValid()) { this.$kaacss = s(".results a.result__a:visited,.sitelinks__title a.result__a:visited,.module--news__body__title:visited,.module__link:visited, .module__link:visited:hover,.module__link a:visited, .module__link a:visited:hover{ color:" + v.toHexString() + ";}") } }, kx: function(x) { this._clearCSS("kx"); if (!x || x == this.settings.getDefault("kx")) { return } var v = g(x); if (v.isValid()) { this.$kxcss = s(r.exec_template("theme_result_web_links", { color: v.toHexString() })) } }, k21: function(B) { this._clearCSS("k21"); if (!B || B == this.settings.getDefault("k21")) { return } var x = g(B), v = this.settings.getThemePalette("k21", B), y = f(x), A = y.root.toHsl().l > 0.5, z = {}; if (v) { z = { moduleBg: x.toHexString(), moduleBgRgb: x.toRgbString().replace(/rgb\(|\)/g, ""), primary: v.primary, secondary: v.secondary, primaryText: v.text.primary, secondaryText: v.text.secondary, tertiaryText: v.text.tertiary, border: x.toHexString(), borderHover: v.text.tertiary, separator: v.primary, shadows: true, btnHoverBg: v.quaternary, btnHoverBorder: v.quaternary, isDark: !A } } else { if (A) { z = { moduleBg: x.toHexString(), moduleBgRgb: x.toRgbString().replace(/rgb\(|\)/g, ""), primary: y.darker[3], secondary: y.darker[4], primaryText: y.text[3], secondaryText: y.text[1], tertiaryText: y.text[2], border: y.darker[1], borderHover: y.darker[2], shadows: false, separator: y.darker[1], btnHoverBg: y.darker[3], btnHoverBorder: y.darker[3], isDark: !A } } else { z = { moduleBg: x.toHexString(), moduleBgRgb: x.toRgbString().replace(/rgb\(|\)/g, ""), primary: x.toHexString(), secondary: y.lighter[4], primaryText: y.text[0], secondaryText: y.text[3], tertiaryText: x.toHexString(), border: y.lighter[2], borderHover: y.lighter[5], shadows: false, separator: y.lighter[2], btnHoverBg: x.toHexString(), btnHoverBorder: y.lighter[2], isDark: !A } } } if (x.isValid()) { this.$k21css = s(r.exec_template("theme_module", z)) } }, k20: function(x) { this._clearCSS("k20"); if (!x || x == this.settings.getDefault("k20")) { return } var v = g(x); if (v.isValid()) { this.$k20css = s(".sitelinks__title a.result__a:visited { color:" + v.toHexString() + " !important;}") } }, k19: function(x) { this._clearCSS("k19"); if (!x || x == this.settings.getDefault("k19")) { return } var v = g(x); if (v.isValid()) { this.$k19css = s(".module__more-at, .module__more-at:hover, .module__official-url, .module__official-url:hover {color: " + v.toHexString() + ";}") } }, k18: function(v) { this._clearCSS("k18"); if (v !== this.settings.getDefault("k18")) { this.$k18css = s(".result__check { display: block;}") } }, k17: function(x) { this._clearCSS("k17"); if (!x || x == this.settings.getDefault("k17")) { return } var v = g(x); if (v.isValid()) { this.$k17css = s(".result__url:hover {color: " + v.toHexString() + ";}") } }, k16: function(x) { this._clearCSS("k16"); if (!x || x == this.settings.getDefault("k16")) { return } var v = g(x); if (v.isValid()) { this.$k16css = s(".result__url:visited {color: " + v.toHexString() + ";}") } }, k15: function(v) { this._clearCSS("k15"); if (!v || v == this.settings.getDefault("k15")) { return } this.$k15css = s(".result__title {font-weight: " + v + ";}") }, k14: function(v) { this._clearCSS("k14"); if (!v || v == this.settings.getDefault("k14")) { return } this.$k14css = s(".result__title {font-size: " + v + ";}") }, k13: function(v) { this._clearCSS("k13"); if (v === "off") { this.$k13css = s(".result__title b {font-weight: normal;}") } }, k12: function(x) { this._clearCSS("k12"); if (!x || x == this.settings.getDefault("k12")) { return } var v = g(x); if (v.isValid()) { this.$k12css = s(".badge--ad {background-color: " + v.toHexString() + ";}") } }, k11: function(x) { this._clearCSS("k11"); if (!x || x == this.settings.getDefault("k11")) { return } var v = g(x); if (v.isValid()) { this.$k11css = s(".msg--spelling :link,.msg--spelling :visited,.msg--spelling a:hover,.msg__clear,.msg__clear:hover,.msg__all,.msg__all:visited {color: " + v.toHexString() + " !important;}") } }, k10: function(x) { this._clearCSS("k10"); if (!x || x == this.settings.getDefault("k10")) { return } var v = g(x); if (v.isValid()) { this.$k10css = s(".highlight .result__a,.result__a:hover,.result__a:visited:hover {color: " + v.toHexString() + " !important;}") } }, kf: function(v) { if (v && v === "-1") { $(".result__icon").addClass("is-hidden") } else { $(".result__icon").removeClass("is-hidden"); r.ImageLoader.loadMore() } }, kai: function(v) { if (!v || v != this.settings.getDefault("kai")) { $(".result--url-above-snippet").removeClass("result--url-above-snippet"); $(".js-result-snippet").each(function(y, z) { var x = $(z), A = x.parent().find(".result__extras"); A.before(x) }) } else { $(".result").addClass("result--url-above-snippet"); $(".js-result-snippet").each(function(y, z) { var x = $(z), A = x.parent().find(".result__extras"); A.after(x) }) } }, _clearCSS: function(v) { var y = "$" + v + "css", x = this[y]; x && x.remove(); delete this[y] } }; var s = function(v) { return $("
", { html: "­" }).children().appendTo("body") }, k = function(v) { return (v && v == "1") ? "addClass" : "removeClass" }, n = function(x, v) { x = g(x); return g.lighten(x, v * (1 - x.toHsl().l)).toHexString() }, c = function(x, v) { x = g(x); return g.darken(x, v * x.toHsl().l).toHexString() }, m = function(v, x, B, A) { var z = []; for (var y = 1; y <= x; y++) { z.push(A(v, B * y)) } return z }, f = function(y) { y = g(y); var E = y.toHsl().l > 0.5, A = g.monochromatic(g.desaturate(y, 80), 20), F = g.mostReadable(y, A), B = g(F).toHsl().l > 0.5, v = E ? 10 : 4, D = E ? 4 : 10; if (E) { D += D * y.toHsl().s } var x = m(F, 10, 5, B ? c : n), C = m(y, 8, D, c), z = m(y, 8, v, n); return { root: y, text: x, lighter: z, darker: C } }, t = function(y, x) { var v = {}; if (x) { v = { bg: x.primary, border: x.secondary, iconText: x.text.secondary, buttonBg: x.quaternary, inputText: x.text.primary, iconHover: x.text.primary, sepColor: x.text.tertiary } } else { v = { bg: y.darker[1], border: y.darker[2], iconText: "rgba(255,255,255,0.35)", buttonBg: y.darker[3], inputText: y.text[0], sepColor: y.darker[3] } } return r.exec_template("theme_search_bar", v) }, i = function(z, y) { var x = g(z.darker[2]).toRgb(), v = {}; if (y) { v = { headerBg: y.tertiary, bg: y.primary, border: y.secondary, lightText: y.text.primary, darkText: y.text.secondary, selectedBg: y.secondary } } else { v = { headerBg: z.darker[1], bg: "rgb(" + x.r + "," + x.g + "," + x.b + ")", border: z.darker[0], lightText: z.text[1], darkText: z.text[5], selectedBg: z.lighter[3] } } return r.exec_template("theme_autocomplete", v) }, q = function(x, v) { return r.exec_template("theme_search_bar", { bg: "#fff", border: x.darker[2], iconText: "rgba(0,0,0,0.35)", buttonBg: x.darker[4], inputText: x.text[1], sepColor: x.darker[4] }) } }(DDG); ! function(f) { var e = f.Models.Base, c = "survey-settings-", g = "p-", a = "r", i = "e"; f.Models.SerpSurvey = function(n) { e.call(this, {}); this.allocation = n.allocation == null ? 1 : n.allocation; this.opensearch = n.opensearch; var p = this._createKey(), j = null; try { this._storage = n.storage || window.localStorage; if (this._storage) { for (var m = 0; m < this._storage.length; m++) { var k = this._storage.key(m); if (k && k.indexOf(c) > -1 && k !== p) { this._storage.removeItem(k) } } j = b(this._storage.getItem(p)) } } catch (o) {} this.set("status", j) }; f.Models.SerpSurvey.prototype = $.extend({}, e.prototype, { plan: function() { if (this.status && (this.status === i || this.status === a || this.status.indexOf(g) === 0)) { return this.status.indexOf(g) === 0 } var j = this._createKey(); if (!j) { return false } try { if (this._storage) { var k = Math.random() < this.allocation ? g + Date.now() : a; this._storage.setItem(j, h(k)); this.set("status", k); return k !== a } } catch (m) {} return false }, end: function() { var j = this._createKey(); if (!j) { return } try { if (this._storage) { this._storage.setItem(j, h(i)); this.set("status", i) } } catch (k) {} }, canShowSurvey: function() { return !!(this.status && this.status.indexOf(g) === 0) }, getElapsedTimeSinceExposure: function() { if (this.status && this.status.indexOf(g) === 0) { var j = parseInt(this.status.replace(new RegExp("^" + g), ""), 10); return Date.now() - j } }, _createKey: function() { var j = this.opensearch.getTrappedAtbParams(); return j ? c + j.variant + j.atbVariant : "" } }); function b(m) { if (!m) { return m } var j; try { j = JSON.parse(m) } catch (k) {} if (j) { return j.value } } function h(j) { return JSON.stringify({ description: "This non-personal data is only stored on your device and is part of our anonymous experiment engine that helps us improve DuckDuckGo. It does not collect or share any personal information. Visit https://help.duckduckgo.com/privacy/atb/ for more info.", value: j }) } }(DDG); ! function(a) { a.Pages.Base = function(b) { this.views = {}; this.onboardingTest = {}; a.keyboard = this.keyboard = new a.Models.Keyboard(); document.onreadystatechange = this._onReadyStateChange.bind(this); a.ready(this.ready.bind(this)) }; a.Pages.Base.prototype = { ready: function() { $("head").append(''); this._initializePage(); if (a.device.isMobile) { a.addClass("html", a.$html, "is-mobile") } if (a.device.isMobileDevice) { a.addClass("html", a.$html, "is-mobile-device") } else { a.addClass("html", a.$html, "is-not-mobile-device") } if (a.device.isLegacyAndroid) { a.addClass("html", a.$html, "is-legacy-android") } if (a.device.isFirefoxFocus && a.device.isAndroid) { a.addClass("html", a.$html, "is-firefox-focus") } this.isCppExp = false; this.isCppControl = false; if ((this.pageType === "home" || this.pageType === "serp") && a.opensearch.isExperiment("msh2exp", "b")) { a.$html.addClass("is-mobile-header-exp") } a.settings.on("loaded-initial", this._onSettingsLoaded.bind(this)); a.settings.loadFromCloud({ initial: true }); a.device.on("resize", function() { a.ImageLoader.loadMore() }); a.device.on("scroll", function() { a.ImageLoader.loadMore() }); this.headerMenuOps = this.headerMenuOps || {}; if (!this.headerMenuOps.disableSearchBar) { this.initSearchBar() } if (!this.headerMenuOps.disableSideMenu) { this.initSideMenu() } this.initAddToHomepageBanner(); this.onboardingTest = a.Data.Onboarding[a.opensearch.atbVariant] || {}; this._verifyMobileInstallation(); this.isSafeDDG = w.safe_ddg; this.isCppmControl = (a.opensearch.variant === "x" && a.opensearch.atbVariant === "u"); this.isCppm = (a.opensearch.variant === "x" && a.opensearch.atbVariant === "v"); this.isCppmStateless = (a.opensearch.variant === "x" && a.opensearch.atbVariant === "z"); this.isCppm4 = (a.opensearch.variant === "x" && a.opensearch.atbVariant === "m"); this.isCppm5 = (a.opensearch.variant === "x" && a.opensearch.atbVariant === "n"); this.mobileOnboarding = new a.Models.MobileOnboarding({ useLocalStorage: false }) }, initSearchBar: function() { this.searchbar = new a.Views.SearchBar({ el: ".js-search-form" }); this.searchbar.on("focus", function() { this.sideMenu && this.sideMenu.hide() }.bind(this)) }, initSideMenu: function() { this.sideMenu = new a.Views.SideMenu($.extend({ pageType: this.pageType, showATB: this.canShowAddToBrowser(), appendLinkTo: ".js-header-aside", appendTo: ".js-site-wrapper" }, this.sideMenuOps || {})); this.sideMenu.on("opened", function() { if (this.searchbar && this.searchbar.hasFocus) { this._restoreSearchFocus = true; this.searchbar.unfocus() } }.bind(this)); this.sideMenu.on("closed", function() { if (this._restoreSearchFocus) { this.searchbar.focus({ focusInput: true }); delete this._restoreSearchFocus } }.bind(this)) }, initAddToHomepageBanner: function() { if (!a.device.isAndroidChromeNoOpenSearch || !navigator.serviceWorker || a.addToBrowser.canAddToChromeMobile()) { return } var b = a.tParam.fromDefaultSearch() || a.history.get("atb") || !a.settings.isDefault(a.addToBrowser.BADGE_DISMISS_KEY); navigator.serviceWorker.register("service-worker.js", { scope: "./" }); window.addEventListener("beforeinstallprompt", function(c) { a.pixel.fire("aths", "i"); if (b || a.addToBrowser.canAddToChromeMobile()) { c.preventDefault(); return false } $(".js-atb-banner-link").hide(); c.userChoice.then(function(f) { var e = {}; if (b) { e.r = 1 } if (f.outcome === "dismissed") { a.pixel.fire("aths", "d", e) } else { a.pixel.fire("aths", "c", e) } }); return true }) }, notify: function(b) { if (!this.notifications) { this.notifications = new a.Views.Notification({ appendTo: "body" }) } this.notifications.flash(b) }, isInstalled: function() { return (a.device.DDGisBrowserDefault() || a.extension.isInstalled() || a.device.isDDGApp || (a.tParam.fromDefaultSearch()) || !!a.history.get("atb") || a.device.isOnion) }, canShowAddToBrowser: function() { if (this.isCppm) { return (a.settings.isDefault(a.addToBrowser.BADGE_DISMISS_KEY) && !this.mobileOnboarding.hasCompletedAllSteps()) } if (this.isCppExp) { return (a.settings.isDefault(a.addToBrowser.BADGE_DISMISS_KEY) && a.addToBrowser.canShowBadgeAgain() && !a.onboarding.hasCompleted()) } if (a.device.isDDGApp || (a.extension.isInstalled() && a.history.get("exti") !== 2)) { return false } if (a.addToBrowser.canAddToChromeMobile() && a.tParam.get() === "crhs") { return true } if (a.device.isMobileDevice && a.settings.isDefault(a.addToBrowser.BADGE_DISMISS_KEY) && !a.tParam.fromDefaultSearch() && !a.history.get("atb") && a.device.canAddToBrowser() && this.pageType !== "serp") { return true } return (a.settings.isDefault(a.addToBrowser.BADGE_DISMISS_KEY) && a.addToBrowser.canShowBadgeAgain() && !a.device.DDGisBrowserDefault() && (!a.tParam.fromDefaultSearch()) && !a.history.get("atb") && !a.device.isOnion && a.device.canAddToBrowser() && a.settings.isDefault("ko") && !a.duckpan) }, canShowAddToBrowserButton: function() { return (a.settings.isDefault(a.addToBrowser.BADGE_DISMISS_KEY) && !a.addToBrowser.canShowBadgeAgain() && !a.device.DDGisBrowserDefault() && !a.device.isDDGApp && (!a.extension.isInstalled() || a.history.get("exti") == 2) && (!a.tParam.fromDefaultSearch()) && !a.history.get("atb") && !a.device.isOnion && a.device.canAddToBrowser() && a.settings.isDefault("ko") && !a.duckpan) }, canShowHomepageEducationInstallButton: function() { if (this.isCppExp && a.settings.isDefault(a.addToBrowser.BADGE_DISMISS_KEY) && !a.onboarding.hasCompleted()) { return true } return (!a.device.DDGisBrowserDefault() && !a.device.isDDGApp && !a.extension.isInstalled() && (!a.tParam.fromDefaultSearch()) && !a.history.get("atb") && !a.device.isOnion && a.device.canAddToBrowser() && a.settings.isDefault("ko") && !a.duckpan) }, canShowHomepageOnboardingEducation: function() { return a.onboardingEducation.canShow() }, fireStat: function(b) { var c = { b: a.device.pixelBrowserName, atbi: this.canShowAddToBrowser(), ei: this.canShowHomepageOnboardingEducation(), i: this.isInstalled(), d: a.device.pixelId, l: w.locale, p: a.device.pixelPlatformName, atb: a.opensearch.version, va: a.opensearch.variant, atbva: a.opensearch.atbVariant }; a.pixel.fire(b, c) }, _onSettingsLoaded: function() { var b = a.settings.toQueryString({ onlyURLParams: true }); if (b) { kurl += "&" + b } if (this.liveUpdater) { a.settings.updater = new a.Models.Settings.LiveUpdater({ isHomePage: this.pageType === "home", settings: a.settings }); a.settings.updater.updateAll(); a.settings.on("change:kae", this.notify.bind(this, l("Theme Changed"))) } }, _checkForForceReload: function() { if (a.querystringParam("rld") === "1") { a.history.clear("rld", function() { window.location.reload() }) } }, _verifyMobileInstallation: function() { if (!a.device.isMobileDevice || this.pageType !== "serp") { return } var j = a.settings.get(a.settings.MOBILE_INSTRUCTIONS_KEY); if (a.tParam.fromDefaultSearch() && !a.settings.isDefault(a.settings.MOBILE_INSTRUCTIONS_KEY)) { var g = j.match(/v\d*-\d/); var k, h, i, c; if (g) { k = g[0]; j = j.replace(k, ""); c = j.substr(3); h = j.charAt(0); i = j.charAt(1) } var m = a.settings.isDefault(a.addToBrowser.BADGE_RECURRING_KEY) ? 0 : 1; var b; if (h === a.opensearch.variant && i === a.opensearch.atbVariant) { var f = a.opensearch.findRunnableAtbExperimentByVariantAndAtbVariant(h, i); if (f) { b = true } } var e; if (k) { e = a.opensearch.getDaysSinceCohort(k) } a.pixel.fire("exti", a.device.pixelBrowserName, a.opensearch.version, { va: h, atbva: i, cva: a.opensearch.variant, catbva: a.opensearch.atbVariant, r: b ? "1" : "0", d: e, l: window.locale, cp: c, exte: 0, p: a.device.pixelPlatformName, ak: a.settings.get(a.addToBrowser.BADGE_DISMISS_KEY), ax: m, kae: a.settings.get("kae") }); a.settings.clear(a.settings.MOBILE_INSTRUCTIONS_KEY) } }, _initializePage: function() { var c, b = this.pageType === "serp"; if (b && a.device.isIE) { setTimeout("d.x.reset()", 50) } if (w.postMessage) { c = d.createElement("iframe"); c.id = "iframe_hidden"; c.src = "/post2.html"; d.body.appendChild(c) } if (b) { if (nir) { nir("v") } setTimeout("nis()", 250); if (!a.device.isMobileDevice) { $("#web_content_wrapper").on("mousemove", nkf); $(document).on("mouseup", ncg); $(document).on("keydown", nckd); $(document).on("keyup", ncku) } } $(document).on("mousedown", ncf) }, _hasCachedResources: function(b) { if (typeof b === "undefined" || b.length === 0) { return false } var h, c, g = 0, k = /proximanova/i, j = /\/(arrow|logo_homepage\.normal\.v\d+).svg$/i, f = /((l|u|d)\d+|libs|utils|base)\.js|((s|o)\d+|home|serp|style)\.css/i; for (var e = 0; e < b.length; e++) { h = b[e]; c = h.name; if (k.test(c) || j.test(c) || f.test(c)) { if ("transferSize" in h && h.transferSize === 0) { g += 1; break } else { if ("duration" in h && h.duration < 20) { g += 1; break } } } } return g > 0 }, _isBrowserReload: function(b) { return (performance.navigation.type === performance.navigation.TYPE_RELOAD) }, _hasDefaultSettings: function(b) { var c = Object.keys(b); if (c.length === 0) { return true } else { if (c.length === 1 && b.hasOwnProperty("t")) { return true } } return false }, _onReadyStateChange: function() { if (document.readyState === "complete") { if (this.pageType === "home" || this.pageType === "serp") { a.perf.reportNavigation(this.pageType) } } } } }(DDG); ! function(b) { var a = b.Pages.Base; b.Pages.Static = function(c) { a.call(this, c); this.pixelClass = c && c.pixelClass || false }; b.Pages.Static.prototype = $.extend({}, a.prototype, { pageType: "static", sideMenuOps: { hideThemes: true }, headerMenuOps: { disableSearchBar: false, disableSideMenu: false }, ready: function() { if (location.pathname === "/iframe") { this.headerMenuOps.disableSearchBar = true; this.headerMenuOps.disableSideMenu = true } if (b.device.isMobileDevice && b.device.isAndroid && b.device.isDDGApp && [-1, -2].includes(parseInt(b.settings.get("ko"), 10))) { b.addClass("html", b.$html, "set-header--hidden") } a.prototype.ready.call(this); $(".js-show-header").click(function(c) { c.preventDefault(); c.stopPropagation(); this.searchbar.focus({ focusInput: true }) }.bind(this)); this.$anchors = $(".js-anchor"); this.$anchorLinks = $(".js-anchor-link"); this.$anchorLinks.on("click", this._onAnchorLinkClick.bind(this)); this.$popouts = $(".js-popout"); this.$popovers = $(".js-popover"); this._createPopouts(); this._createPopovers(); $("img").bind("contextmenu", function(c) { return false }); if (this.pixelClass) { this.$links = $(".js-static-" + this.pixelClass); this.$links.on("click", this._onLinkClick.bind(this, 0)) } this.$footerLinks = $(".js-static-foot-link"); if (this.$footerLinks.length) { this.$footerLinks.on("click", this._onLinkClick.bind(this, 1)) } }, addTo: function(e, c) { var f = DDG.Utils.AddTo.getData(); if (f[e]) { new b.Views.AddTo({ appendTo: c, data: f[e] }) } }, _onAnchorLinkClick: function(j) { j.preventDefault(); var h = j.currentTarget.hash.substr(1), f = this.$anchors, c = ""; for (var g = 0; f.length > g; g++) { if (f[g].name === h || f[g].id === h) { c = $(f[g]); break } } if (c) { b.device.scrollTop(c.offset().top, 500) } }, _createPopouts: function() { this.views.popouts = []; var g, c, e, f = 0; for (; this.$popouts.length > f; f++) { g = $(this.$popouts[f]); c = g.find(".js-popout-link"); e = new b.Views.Modal({ $el: g.find(".js-popout-main") }); c.click(e.toggle.bind(e)); this.views.popouts.push(e) } }, _createPopovers: function() { this.views.popovers = []; var f, c, g, e = 0; for (; this.$popovers.length > e; e++) { f = $(this.$popovers[e]); c = $(f.attr("data-js-selector")); g = new b.Views.Modal({ $el: f }); c.click(g.toggle.bind(g)); this.views.popovers.push(g) } }, _onLinkClick: function(g, h) { var c = $(h.currentTarget), f = b.pixel.sanitizeUrl(c.attr("href")); b.pixel.fire("splc", this.pageType, f, { ft: g }) } }) }(DDG); ! function(c) { var b = c.Pages.Base, a = 1366, e = 220; c.Pages.Home = function(f) { this._checkForForceReload(); b.call(this, f); window.onpageshow = this._onPageShow.bind(this); this.canShowMobileButton = c.addToBrowser.canShowMobileButton() }; c.Pages.Home.prototype = $.extend({}, b.prototype, { pageType: "home", liveUpdater: true, sideMenuOps: { twitterLink: true, hideSettings: true }, ready: function() { var f = w.location.host.toLowerCase() === "start.duckduckgo.com", g = w.location.hash === "#1"; this.isStart = f; this.scrollToOnboarding = g; this.searchbarFocusedIpad = false; this.showOnboardingArrow = true; if (!f && !(c.extension.isInstalled() || c.device.isDDGApp)) { c.tParam.setFromHomepage(c.opensearch.allocateAtbVariant()) } c.$win.scrollTop(0); b.prototype.ready.call(this); if (f) { this.searchbar.$el.attr("action", "//duckduckgo.com/"); c.settings.set("kak", "-1"); c.settings.set("kal", "-1"); c.settings.set("kao", "-1"); c.settings.set("kaq", "-1") } this._renderBadgeContent(); this._initHeaderLinks(); this.canShowFaq = (this.canShowAddToBrowser() && c.device.isDesktop && c.device.isEnglish); if (Modernizr.touch && c.device.isIDevice) { if (c.device.isIPad && c.getProperty(window, "screen.height") === a) { var h; this.searchbar.$el.on("focusin", function() { this.searchbarFocusedIpad = true; if (Math.abs(window.orientation) === 90) { h = c.device.scrollTop(); c.device.scrollTop(e) } }.bind(this)); this.searchbar.$el.on("focusout", function() { if (Math.abs(window.orientation) === 90) { c.device.scrollTop(h) } this.searchbarFocusedIpad = false }.bind(this)) } window.onorientationchange = function() { if (this.searchbarFocusedIpad && Math.abs(window.orientation) === 90) { setTimeout(function() { c.device.scrollTop(e) }, 500) } else { c.$win.scrollTop(0) } }.bind(this) } this.views.tagline = new DDG.Views.HomepageTagline({ appendTo: ".js-tag-home" }); this.views.onboardingEducation = new c.Views.OnboardingEducation({ appendTo: ".site-wrapper--home", isCppExp: this.isCppExp, isCppControl: this.isCppControl, pageView: this, preventAnimation: this.canShowFaq, model: c.onboardingEducation, extraClass: this.canShowFaq ? "onboarding-ed--faq" : "", doRenderTeaserArrow: this.showOnboardingArrow }); if (this.canShowHomepageEducationInstallButton()) { this._addOnboardingEducationButtons() } if (this.canShowFaq) { this.views.faq = new c.Views.Faq({ appendTo: ".site-wrapper--home", stats: { atbi: this.canShowAddToBrowser(), ei: this.canShowHomepageOnboardingEducation(), i: this.isInstalled() } }); this.views.atbFaq = this._createButton("f", { appendTo: ".site-wrapper--home", buttonClass: "btn--primary atb-button--faq", addImpressionPixel: true, onlyFireImpressionPixelIfIntoView: true }) } DDG.$html.find(".content--home").css("visibility", "visible"); if (!c.device.isMobileDevice) { this.searchbar.focus({ focusInput: true }) } this.fireStat("hi") }, _initHeaderLinks: function() { this.views.headerLinks = new c.Views.HeaderLinks({ appendTo: ".js-header-aside" }) }, _createButton: function(g, f) { f = f || {}; return new c.Views[c.addToBrowser.viewType]({ isCppExp: this.isCppExp, isCppControl: this.isCppControl, impressionPixel: f.addImpressionPixel ? "atb" + g + "i" : null, clickPixel: "atb" + g + "c", xPixel: "atbbx", template: "add_to_browser_badge_button", buttonClass: (f.buttonClass || "onboarding-ed__button-small") + (this.isCppExp ? " js-cta-state-cpp" : ""), appendTo: f.appendTo || (".js-onboarding-ed-button-small-" + g), isCppm: this.isCppm, isCppm4: this.isCppm4, isCppm5: this.isCppm5, isCppmControl: this.isCppmControl, isCppmStateless: this.isCppmStateless, mobileOnboarding: this.mobileOnboarding, onStartSearch: this._handleStartSearch.bind(this), onlyFireImpressionPixelIfIntoView: f.onlyFireImpressionPixelIfIntoView }) }, _addOnboardingEducationButtons: function() { this.views.atb_button = new c.Views[c.addToBrowser.viewType]({ isCppExp: this.isCppExp, isCppControl: this.isCppControl, clickPixel: "atbbc", xPixel: "atbbx", template: "add_to_browser_badge_button", buttonClass: "onboarding-ed__button" + (this.isCppExp ? " js-cta-state-cpp" : ""), appendTo: ".js-onboarding-ed-button", isCppm: this.isCppm, isCppm4: this.isCppm4, isCppm5: this.isCppm5, isCppmControl: this.isCppmControl, isCppmStateless: this.isCppmStateless, mobileOnboarding: this.mobileOnboarding, onStartSearch: this._handleStartSearch.bind(this) }); this.views.atb_button_1 = this._createButton(1); this.views.atb_button_2 = this._createButton(2); this.views.atb_button_3 = this._createButton(3) }, _onPageShow: function(f) { if (f && f.persisted) { this._checkForForceReload() } }, _renderBadgeContent: function() { if ((!this.scrollToOnboarding && this.canShowAddToBrowser())) { var i = !c.device.isMobileDevice, h = $(".js-foot-home"), f = { impressionPixel: this.canShowMobileButton ? "atbbi" : "atbhi", clickPixel: this.canShowMobileButton ? "atb0c" : "atbhc", xPixel: "atbhx", topRight: i, fadeIn: i, appendTo: i ? ".js-site-wrapper" : h, hideOnClick: true, isCppm: this.isCppm, isCppm4: this.isCppm4, isCppm5: this.isCppm5, isCppmStateless: this.isCppmStateless, isCppmControl: this.isCppmControl, mobileOnboarding: this.mobileOnboarding, onStartSearch: this._handleStartSearch.bind(this), displayableBannerHtmlClass: "displayable-atb-banner" }; if (c.device.isDesktop) { this.showOnboardingArrow = false; i = false; var j = "add_to_browser_fullbleed_billboard_v2", g = "is-atb-fullbleed"; if (c.device.isIE) { f.hideCurve = true } var k = c.device.isFirefox ? c.extension.reviewsUrl : c.extension.url + "/reviews"; $("#search_form_input_homepage").attr("placeholder", lp("search input box", "Search the web without being tracked")); if (this.isCppExp || this.isCppControl) { f.isCppExp = this.isCppExp; f.isCppControl = this.isCppControl; if (this.isCppExp) { f.onOnboardingDone = function() { $("#search_form_input_homepage").removeAttr("placeholder"); if (this.searchbar) { this.searchbar.focus({ focusInput: true }) } }.bind(this) } } f = $.extend({}, f, { topRight: false, hideOnClick: false, fadeIn: false, button: ".js-badge-link-button", appendTo: ".content--home", template: j, htmlClass: g, canInstall: c.extension.canInstall(), extRating: c.device.isFirefox ? 4.5 : 4.4, halfStar: c.device.isFirefox, reviewsUrl: k, shortLocale: window.locale.split("_")[0], searchbar: this.searchbar }) } this.views.badge = new c.Views[c.addToBrowser.viewType](f); if (i) { this.searchbar.on("typed", function() { if (this.views.badge.$el.is(":visible")) { c.pixel.fire("atbht", c.device.pixelBrowserName, c.opensearch.version, { va: c.opensearch.variant, atbva: c.opensearch.atbVariant, l: w.locale, p: c.device.pixelPlatformName }) } this.views.badge && this.views.badge.hide() }.bind(this)) } if (c.addToBrowser.canShowMobileBanner()) { this.searchbar.$el.on("focusin", function() { this.views.badge && this.views.badge.hide() }.bind(this)); this.searchbar.$el.on("focusout", function() { if (!(this.isCppm || this.isCppm4 || this.isCppm5 || this.isCppmStateless) || ((this.isCppm || this.isCppm4 || this.isCppm5 || this.isCppmStateless) && this.canShowAddToBrowser())) { this.views.badge && this.views.badge.show(150) } }.bind(this)) } } else { if (c.newsletter.shouldShowBadge()) { this.views.newsletter = new c.Views.SubscribeToNewsletterBadge({ appendTo: ".js-site-wrapper" }); c.pixel.fire("nli", c.newsletter.group, "home"); this.views.newsletter.show(); this.searchbar.on("typed", function() { this.views.newsletter && this.views.newsletter.hide() }.bind(this)) } else { if (c.survey.shouldShowBadge()) { this.views.survey = new c.Views.SurveyBadge({ appendTo: ".js-site-wrapper" }); this.views.survey.show(); this.searchbar.on("typed", function() { this.views.survey && this.views.survey.hide() }.bind(this)) } } } }, _handleStartSearch: function() { if (this.isCppm || this.isCppm4 || this.isCppm5 || this.isCppmStateless) { this.searchbar.focus({ focusInput: true }) } }, addOnboarding: function() { if (!this.views.onboardingEducation.$el || this.views.onboardingEducation.model.isDismissed) { this.views.onboardingEducation.model.isDismissed = false; this.views.onboardingEducation = new c.Views.OnboardingEducation({ appendTo: ".site-wrapper--home", isCppExp: this.isCppExp, pageView: this, learnMore: true, model: c.onboardingEducation }); if (this.canShowHomepageEducationInstallButton()) { this._addOnboardingEducationButtons() } } this.views.onboardingEducation.currentSlide = 1; this.views.onboardingEducation._snapToSlideScroll() } }) }(DDG); DDG.assets_loaded = []; DDG.templates = {}; DDG.first_result = "r1-0"; DDG.is_header_fixed = true; DDG.first_source = false; DDG.last_selection = ""; DDG.animation_speed = 300; DDG.isJSURL = function(a) { return !a || a === "javascript:;" || a === "#" }; DDG.detect_intent_link = function(a) { var b = 0; if (DDG.device.isIDevice && a.hostname == "itunes.apple.com") { b = 1 } else { if (DDG.device.isAndroid && a.hostname == "play.google.com") { b = 1 } } return b }; DDG.get_http_redirect = function(e, f) { var b = e.href; if (DDG.settings.useRedirect() && e.href.indexOf("/l/?") == -1 && !DDG.isInternalURL(e.href) && !DDG.detect_intent_link(e)) { var c = b.match(/^https/) || DDG.device.isOnion, a = c ? "" : "http://r.duckduckgo.com"; b = a + "/l/?kh=-1&uddg=" + encodeURIComponent(e.href); if (!(DDG.device.isEdge && f)) { nua("nul", e, 500) } } return b }; DDG.get_query_encoded = function() { return rq }; DDG.get_query = function() { return decodeURIComponentSafe(rq) }; DDG.get_is_safe_search = function() { return DDG.settings.safeSearch.isStrict() }; DDG.stem = function(a) { return a.replace(/(?:s)$/, "") }; DDG.get_asset_path = function(c, b) { if (Spice && Spice.sharedir_map && Spice.sharedir_map[c]) { return "/share/" + Spice.sharedir_map[c].path + "/" + b } var a = window["spice_" + c + "_version"] || spice_version; return "/share/spice/" + c + "/" + a + "/" + b }; DDG.get_now = function() { var a = new Date(); return a.getTime() }; DDG.$win = $(window); DDG.$doc = $(document); DDG.$html = $("html"); DDG._$cache = {}; DDG.$ = function(a) { return DDG._$cache[a.toString()] || (DDG._$cache[a.toString()] = $(a)) }; DDG._$classCache = {}; DDG.addClass = function(c, b, a) { DDG._$classCache[c + a] = true; b.addClass(a) }; DDG.removeClass = function(c, b, a) { delete DDG._$classCache[c + a]; b.removeClass(a) }; DDG.hasClass = function(b, a) { return DDG._$classCache[b + a] }; DDG.toggleClass = function(c, b, a) { if (DDG.hasClass(c, a)) { DDG.removeClass(c, b, a) } else { DDG.addClass(c, b, a) } }; DDG.get_header_height = function() { return typeof DDG._header_height !== "undefined" ? DDG._header_height : (DDG._header_height = DDG.$("#header_wrapper").outerHeight()) }; DDG.add_sitelinks = function(j, k, f, a) { var b = 0; if (f && f[k] && f[k]["l"]) { f[k]["l"].forEach(function(q, n, m) { var r = n % 2 === 0; var i = n === 0; var p = n === m.length - 1; var o = (p && r && m.length > 1); q.id = "r1-" + (n + 1); q.nextRow = (r && !i && !p) || (o); q.domainName = a; q.idx = n; if (DDG.device.isMobile) { f[k]["l"][n].snippet = null } if (f[k]["l"][n].snippet) { b += 1 } }); if (!b && !DDG.device.isMobile) { return } var h = DDG.$exec_template("sitelinks", { links: f[k]["l"], isDesktop: !DDG.device.isMobile, newWindow: DDG.settings && !DDG.settings.isDefault("kn") }); if (DDG.device.isMobile) { if (DDG.settings.isDefault("kai")) { $(j).find(".js-result-snippet").after(h[0]) } else { $(j).find(".js-result-extras").after(h[0]) } } else { $(j).after(h[0]) } var g = function(i) { organicClick(i.currentTarget, i); DDG.backData.set("sl-" + $(this).attr("data-idx"), {}); return nrl(i, i.currentTarget) }; var e = $(h).find(".result__sitelink-title"); for (var c = 0; c < e.length; c++) { e[c].onclick = g } DDG.search.set("hasSiteLinks", f[k]["l"].length) } }; DDG.linkClickWillOpenInNewTab = function(a) { return (a.ctrlKey || a.shiftKey || a.metaKey || (a.button && a.button == 1) || !DDG.settings.isDefault("kn")) }; function ncku(a) { if (!DDG.device.isIE && !a.metaKey) { fa = 0 } } function nckd(a) { if (!DDG.device.isIE && a.metaKey) { fa = 1 } } function ncf(h) { var i, a, f, j, k; fmx = h.clientX; fmy = h.clientY; if (fmx > viewport_width - 100 && fmy > parseInt(viewport_height) - 17) { if (!DDG.deep.isLastResult && nrb) { nrb() } } i = ""; if (h.srcElement) { i = h.srcElement } else { i = h.target } var g = 0; var c = 0; if (DDG.device.isIE && (nkdc(h) || nkdm(h))) { g = 1 } if (DDG.device.isEdge && (nkdc(h) || nkdm(h))) { c = 1 } var b = h.which && h.which == 2; var m = h.which && h.which == 3; if (c || g || b || m) { fm = 1; while (i && i != window) { if (i.nodeName && i.nodeName == "A") { if (DDG.isJSURL(i.href)) { i.onclick(); return false } else { i.href = DDG.get_http_redirect(i, m) } fl = 1; break } a = i.id; if (a && !m) { if (a == "links") { break } if (rc && a == rc.id) { nrg(rc, 0, h, 1) } } if (i.parentNode) { i = i.parentNode } else { break } } setTimeout(function() { fm = 0; fl = 0 }, 1000) } else { fm = 0 } } function ncg(a) { fmx = 0; fmy = 0; if (a.clientX > viewport_width - 25) { if (!DDG.deep.isLastResult && nrb) { nrb() } } } function nir(g) { var a, f, e, b, c; e = (g) ? ".highlight_" + g : ".result"; a = $(e); a.each(function(h, j) { f = $(j); if (f.attr("data-nir")) { return } if (!is_mobile_device) { f.on("mouseenter", function(i) { if (fk || fe) { return false } if (rc && rc != this) { nua("nro", rc) } nua("nrv", this); rc = this }); f.on("mouseleave", function(i) { if (fk || fe) { return false } nua("nro", this) }) } if (g != "a") { f.click(function(i) { if (this.id !== "did_you_mean") { organicClick(this, i) } if (!fe) { nrg(this, 0, i, 0) } }) } f.attr("data-nir", 1); if (!g || g == "a" || g == "v") { b = f.find("a"); for (c = 0; c < b.length; c++) { if (!b[c].onclick && !rs) { b[c].onclick = function(i) { this.blur(); return nrl(i || window.event, this) } } else { if (!b[c].onclick) { b[c].onclick = function() { this.blur(); fl = 1 } } } if (kn && kn === "1" && !DDG.isInternalURL(b[c].href)) { b[c].target = "_blank" } } } }) } function nis() { var e, a; if (fq) { return false } var c = DDG.backData.getId(), b = DDG.backData.getData(); if (c && c.match(/^r1/)) { DDG.deep.lastClickedId = c; DDG.deep.lastPage = b.page; nrm(5, c) } else { rc = d.getElementById(DDG.first_result) } fs = 0; if (!DDG.deep.isLastResult && nrb) { nrb() } } function nkda(a) { if (fq) { return false } if (a && (nkdc(a) || nkdm(a) || nkds(a) || nkdt(a) || fa)) { return false } fk = 1; nrm(1) } function nkua(a) { if (fq) { return false } if (a && (nkdc(a) || nkdm(a) || nkds(a) || nkdt(a) || fa)) { return false } fk = 1; nrm(2) } function nke(c) { if (fq) { return false } if (c && (nkdc(c) || nkdm(c) || nkds(c) || nkdt(c) || fa)) { return false } fk = 1; if (rc && (!kn || kn != "1")) { var b = new RegExp("rl([ei])(\\d+)-(\\d+)"); var a = new RegExp("^r2-(\\d+)$"); if (rc.id && b.test(rc.id)) { if (a.test(rc.nextSibling.firstChild.id)) { rc = rc.nextSibling.firstChild } else { rc = rc.nextSibling.firstChild.nextSibling } nrv(rc) } else { rc.click() } } } function nko(a) { if (fq) { return false } if (a && (nkdc(a) || nkdm(a) || nkds(a) || nkdt(a) || fa)) { return false } fk = 1; if (rc) { rc.click() } } function nkt(a) { if (fq) { return false } if (a && (nkdc(a) || nkdm(a) || nkds(a) || nkdt(a) || fa)) { return false } fk = 1; rc = ""; DDG.device.scrollTop(0) } function nkd(b) { if (fq) { return false } if (b && (nkdc(b) || nkdm(b) || nkds(b) || nkdt(b) || fa)) { return false } fk = 1; var a = $(rc).find(".js-result-extras-site_search")[0]; if (a) { nrg(rc, null, null, null, a) } } function nkn(a) { if (fq) { return false } if (a && (nkdc(a) || nkdm(a) || nkds(a) || nkdt(a) || fa)) { return false } fk = 1; fn = 1; if (rc) { rc.click() } } function nkm(a) { if (fq) { return false } if (a && (nkdc(a) || nkdm(a) || nkds(a) || nkdt(a) || fa)) { return false } fk = 1; if (d.getElementById(DDG.first_result)) { nrm(5, DDG.first_result) } } function nksb(a) { if (fq) { return false } if (a && (nkdc(a) || nkdm(a) || nkds(a) || nkdt(a) || fa)) { return false } fk = 1; if (!DDG.deep.isLastResult && nrb) { nrb() } } function nks(b) { if (fq) { return false } if (b && (nkdc(b) || nkdm(b) || nkds(b) || fa)) { return false } fk = 1; setTimeout("d.x.q.focus()", 10); setTimeout("d.x.q.select()", 15); var a = DDG.settings.get("ko"); if (a == "s" || a == "d") { setTimeout(function() { DDG.device.scrollTop(0) }, 10) } } function nkdc(a) { var b; if (a) { b = a.ctrlKey } return b } function nkdm(a) { var b; if (!DDG.device.isIE && a) { b = a.metaKey } return b } function nkdt(a) { var b; if (a) { b = a.altKey } return b } function nkds(a) { var b; if (a) { b = a.shiftKey } return b } function nkf(c) { var b, a; if (DDG.device.isIE) { b = c.clientX + d.body.scrollLeft; a = c.clientY + d.body.scrollTop } else { b = c.pageX; a = c.pageY } if (fk && sx && sy && (sx != b || sy != a)) { fk = 0 } sx = b; sy = a } var mousewheelevt = /Firefox/i.test(navigator.userAgent) ? "DOMMouseScroll" : "mousewheel"; if (document.attachEvent) { document.attachEvent("on" + mousewheelevt, nkw) } else { if (document.addEventListener) { document.addEventListener(mousewheelevt, nkw, false) } } function nkw(a) { if (DDG.device.isOpera && !DDG.deep.isLastResult && nrb) { nrb() } fk = 0 } function nrv(a, h, q, c) { if (!a) { return false } var g, n, r, o, m, k, f, j, p, e; g = a; a = a.parentNode; if (g.id == "r1-" + (parseInt(r1c) - 1)) { if (DDG.deep.lastClickedId && DDG.settings.autoloadDisabled() && DDG.deep.lastPage > DDG.deep.pageNumber) { if (!DDG.deep.isLastResult && nrb) { nrb("", 1) } } else { if (!DDG.deep.isLastResult && nrb && !DDG.settings.autoloadDisabled()) { nrb("", 1) } } } if (!h) { var b = $(g); if (!b.hasClass("highlight")) { b.addClass("highlight"); if (b.hasClass("highlight_sponsored")) { b.addClass("highlight_sponsored_hover") } n = nun(g); o = b.offset().top; m = DDG.device.scrollTop(); if (c && n && !fq && o > m) { n.focus(); n.onclick = function(i) { return nrl(i, this) } } } } } function nro(j) { var h, f, e, b, g, c; if (!j) { return false } var a = $(j); if (a.hasClass("highlight")) { a.removeClass("highlight"); if (a.hasClass("highlight_sponsored_hover")) { a.removeClass("highlight_sponsored_hover") } h = nun(j); if (h && !fq) { h.blur() } } } function nrs(b, f, e) { var g, a, c, i, h; g = $(b).offset().top; c = $(b).outerHeight(); a = DDG.device.scrollTop(); h = viewport_height / 2; if (!c || g == a) { return } if (f || g + c + 10 > viewport_height + a || g - 10 < a) { i = g - h; if (!e || e == 1 && g - a > h || e == -1 && g - a < h) { DDG.device.scrollTop(i) } } } function sendCount(a) { $.ajax({ url: window.location.origin + "/public/l" + a + ".jpg", cache: false, dataType: "image/jpg" }); DDG.abc = a } function nrj(a, m, i) { var r = a; if (DDG.searchExperiments && DDG.searchExperiments.v7exp && DDG.searchExperiments.v7exp.activeGroup === "a") { var g = ["^\\/share\\/spice\\/.*images\\.spice\\.js$", "^\\/share\\/spice\\/.*videos\\.spice\\.js$"]; if (!DDG.history.get("iax")) { g.push("^\\/?i\\.js"); g.push("^\\/?v\\.js") } var o = new RegExp(g.join("|"), "i"); if (o.test(a)) { return false } } if (DDG.assets_loaded[a]) { return false } var n = DDG.Utils.Cache.Called; var s = n.type[a.substr(0, 5)]; if (s) { if (n.deferred[s] || n.nrj[s]) { return false } n.nrj[s] = 1 } if (a && a.match(/^\/d\.js/)) { if (window.show_covid) { DDG.duckbar.add({ id: "covid19", model: "Covid19", duckbar_topic: "Coronavirus" }); DDG.duckbar.future_signal_tab({ signal: "high", from: "covid19" }) } if (DDG.vqd.isExpired()) { DDG.pixel.fire("dxr", { back: DDG.vqd.timestampFromBackData ? 1 : 0 }); return window.location.reload() } if (DDG.deep && DDG.deep.pageNumber === 1) { var f = DDG.history.get("ia"), q = DDG.history.get("iax"), b = DDG.history.get("iar"), e = DDG.history.get("iaxm"), j; if (!f && b) { f = b } if (e) { j = e } else { if ((f && q === f) || b) { var c = DDG.Data.StaticIAs.filter(function(t) { return t.id === f && t.isFullPage }); if (c.length) { j = c[0].id } } } if (j) { a += "&iapl=" + j } } if (DDG.extension.isInstalled()) { a += "&ext=1" } if (window.ddg_deep_a) { a += "&aa=" + window.ddg_deep_a } } if (a && DDG.searchExperiments) { a = DDG.searchExperiments.addExperimentParameters(a) } if (a.match(/^\/d.js\?/)) { if (DDG.searchExperiments && DDG.searchExperiments.getExperimentGroup("msvrtexp") === "b") { a = "//links.duckduckgo.com" + a } if (DDG.rgi && DDG.rgi.enabled() && !i) { $.ajax({ url: a, dataType: "script", cache: true, beforeSend: function(t) { t.setRequestHeader("Rgi", DDG.rgi.get()) }, error: function(v, t, u) { DDG.pixel.fire("rgif"); nrj(r, m, true); return } }); return } } if (a.indexOf("amazon.spice.js") !== -1 && DDG.duckbar) { $.ajax({ url: a, dataType: "script", cache: true, success: function() { DDG.assets_loaded[a] = 1 }, error: function(t) { DDG.duckbar.failed("products") } }); return } DDG.assets_loaded[a] = 1; var k, h; k = d.createElement("script"); k.type = "text/javascript"; if (!m) { k.async = true } else { k.async = false } if (a && a.match(/\/local\.js|\/js\/spice\/maps\/places/)) { if (DDG.userLocator.hasLocation()) { var p = DDG.userLocator.userLocation; a = DDG.addSearchParam(a, "latitude", p.lat); a = DDG.addSearchParam(a, "longitude", p.lon); a = DDG.addSearchParam(a, "location_type", p.type) } } k.src = a; h = document.getElementsByTagName("script")[0]; h.parentNode.insertBefore(k, h); return k } function nrc(c) { if (DDG.assets_loaded[c]) { return false } DDG.assets_loaded[c] = 1; var b, a; b = d.createElement("link"); b.type = "text/css"; b.rel = "stylesheet"; b.async = true; b.href = c; b.media = "screen"; a = document.getElementsByTagName("head")[0]; a.parentNode.insertBefore(b, a) } function nrg(h, b, e, f, c) { var a, g; if (!b) { b = 0 } e = e || window.event; if (!c) { c = h.getElementsByTagName("a")[0] } if (!f) { f = nkdc(e) || nkdm(e) || fn } if (!f && kn && kn == "1") { f = 1 } if (is_mobile_device) { if (rc && rc != h) { nro(rc) } nrv(h); rc = h } if (!DDG.isJSURL(c.href)) { h && DDG.backData.set(h.id, { adx_name: DDG.page.ads.adxExperiment, page: DDG.deep.pageNumber, sexp: DDG.searchExperiments.getBackButtonData(), hu: DDG.deep.hu, timestamp: DDG.vqd.timestamp }); if (fl) { fl = 0 } else { fl = 1; a = DDG.get_http_redirect(c); if (f) { nug(a, f) } else { nua("nug", a, "", "", "", f) } } } else { if (fl) { fl = 0 } else { if (DDG.isJSURL(c.href)) { c.onclick() } } } } function nrl(c, b) { var a = ((c.target && c.target.href) || (c.currentTarget && c.currentTarget.href)); if (a && DDG && DDG.extension && DDG.extension.url && a.indexOf(DDG.extension.url) === 0) { return } var e, f; c = c || window.event; fl = 1; e = nkdc(c) || nkdm(c) || ""; if (!e && kn && kn == "1" && b && b.href && !DDG.isInternalURL(b.href)) { e = 1 } if (!e && b.target && b.target === "_blank") { e = 1 } if (!e && (nkds(c) || fm || c.button && (c.button == 1 || DDG.device.isIE && c.button == 4))) { e = 1 } if (e) { b.href = DDG.get_http_redirect(b); if (nkds(c) && !DDG.device.isIE && !DDG.device.isSafari) { nua("nug", b.href, "", "", "", e); return false } else { return true } } else { f = DDG.get_http_redirect(b); nua("nug", f); return false } } function nrrel(a) { DDG.deep.set("related", a.r); if (DDG.page.relatedSearches || DDG.deep.hideNoResults) { return } if (DDG.deep.getResultCount() && !DDG.deep.hideRelated && a.r && a.r.length > 1) { DDG.page.relatedSearches = new DDG.Views.RelatedSearches({ appendTo: $("#links"), model: DDG.deep }) } } function nrb(b, c) { var f, q, h, k, o, n, p, g, a, j, m; if (!DDG.duckbar.areOrganicsShowing) { return } if (fs) { return false } fs = 1; o = document.body.scrollHeight; n = DDG.device.scrollTop(); h = n + viewport_height >= o - 500 ? 1 : 0; k = 0; if (!c && fmx && fmy && fmx > viewport_width - 100 && fmy < parseInt(viewport_height) - 17) { fs = 0; return } if (h || k || c) { for (g = parseInt(r1c) - 1; g >= 0; g--) { m = "r1-" + g; a = d.getElementById(m); j = a && a.parentNode; var e = $(".result--more__btn")[0]; if ($(j).css("display") == "block") { if (DDG.deep.hasPendingResults()) { DDG.deep.showPendingResults(); nsr(e); $(".js-result-sep").removeClass("is-hidden") } else { nsr(e) } break } } } fs = 0 } function nrm(q, m) { var o, g, f, c, e, a, v, n, u, i, r, j, h, t, z, s, b, p; if (fq) { return false } if (fo) { setTimeout("nrm(" + q + ",'" + m + "')", 100); return false } fo = 1; o = new RegExp("r(\\d+)-(\\d+)"); g = new RegExp("rl([ei])(\\d+)-(\\d+)"); f = new RegExp("rld-(\\d+)"); if (m) { if (o.test(m)) { c = RegExp.$1 || 0; e = RegExp.$2 || 0 } else { if (m == "zero_click_wrapper") { c = 1; e = -1 } else { fo = 0; return false } } } else { if (rc && rc.id == "zero_click_wrapper") { c = 1; e = -1 } else { if (rc && o.test(rc.id)) { c = RegExp.$1 || 0; e = RegExp.$2 || 0 } else { if (rc && g.test(rc.id)) { c = rs ? 1 : 2; r = 1 } else { if (rc && f.test(rc.id)) { c = 1; r = 1 } else { rc = d.getElementById(DDG.first_result); if (!rc) { rc = d.getElementById("zero_click_wrapper") } if (!rc) { fo = 0; return false } else { e = 0; c = 1 } } } } } } switch (q) { case 1: if (rc && rc.id && rc.id == DDG.first_result && !$(rc).hasClass("highlight")) {} else { e++ } break; case 2: e--; break; case 3: c++; e = 0; break; case 4: c--; e = 0; break; case 5: break; case 6: break; case 7: e++; break; default: e++ } n = "r" + c + "-" + e; if (e <= -1) { n = "zero_click_wrapper" } u = d.getElementById(n); i = 0; if (m) { i = d.getElementById(m) } if (q == 1 && c == 2 && !u && r1c) { n = DDG.first_result; u = d.getElementById(n) } z = DDG.device.scrollTop(); if (q == 1) { if ($("#" + n).length > 0) { t = $("#" + n).offset().top } if (t && (t < z || t > (z + 2 * viewport_height))) { a = 0; while (a > -1) { v = d.getElementById("r1-" + a); if (!v) { break } b = $(v); t = b.offset().top; p = 10; s = b.height() + p; if (t - s < z && z !== 0) { a++ } else { u = v; break } } } } if (q == 2 && n !== "zero_click_wrapper") { if ($("#" + n).length > 0) { t = $("#" + n).offset().top } if (t < (z - 2 * viewport_height) || t > (z + viewport_height)) { a = r1c - 2; while (a > 0) { v = d.getElementById("r1-" + a); if (!v) { break } b = $(v); t = b.offset().top; p = 10; s = Math.max(b.height(), 90) + p; if (t + s > (z + viewport_height)) { a-- } else { u = v; break } } } } if (i && !u && q == 7 && i.nextSibling && i.nextSibling.firstChild) { var k = i.nextSibling; if (k.firstChild && k.firstChild.onclick) { k.firstChild.onclick() } fo = 0; return } else { if (!i && !u && q == 7 && rc && rc.nextSibling && rc.nextSibling.firstChild) { var k = rc.nextSibling; if (k.firstChild && k.firstChild.onclick) { k.firstChild.onclick() } fo = 0; return } } if ((n == "zero_click_wrapper") && $(u).css("display") == "none") { fo = 0; return } if (r) { switch (q) { case 1: if (c == 2) { u = rc.nextSibling.nextSibling; if (!u) { n = DDG.first_result; u = d.getElementById(n) } else { if ($(u).css("display") == "none") { u = u.nextSibling.firstChild; if (!u.id && u.nextSibling) { u = u.nextSibling } } } } else { if (c == 1 && rc.nextSibling.nextSibling) { u = rc.nextSibling.nextSibling.nextSibling } else { if (1) { n = DDG.first_result; u = d.getElementById(n) } else { u = rc.nextSibling.firstChild } } } break; case 2: u = rc.previousSibling.previousSibling; if ($(u).css("display") == "none") { u = u.nextSibling.lastChild } break; case 4: break; case 7: if (rc.nextSibling.nextSibling) { u = rc.nextSibling.nextSibling.nextSibling } else { u = rc.nextSibling.firstChild } break; default: fo = 0; return false } } if (u) { if (c == 1 && g.test(u.id)) { u = u.nextSibling.firstChild } if (q != 7) { if (rc) { nua("nro", rc) } } if (q != 5 && (c == 2 || rs) && $(u.parentNode).css("display") == "none") { j = u; while (j.parentNode.id != "zero_click_topics" && j.parentNode.id != "links" && j.parentNode.id != "content") { j = j.parentNode; if (!h && $(j).css("display") == "block") { h = j } } if (h && r) { u = j.nextSibling.nextSibling } else { if ($(j).css("display") == "none") { u = j.previousSibling } else { if (j.nextSibling && $(j.nextSibling).css("display") == "block") { u = h.lastChild.previousSibling } else { if (q == 2 && j.previousSibling) { u = j.previousSibling } else { if (q == 1 && j.nextSibling && $(j.nextSibling).css("display") == "none") { u = j.nextSibling.nextSibling.firstChild.nextSibling } else { if (q == 1 && !j.nextSibling) { u = j.previousSibling } } } } } } if (g.test(u.id) && rs && RegExp.$1 == "e") { u = u.nextSibling.firstChild } } nua("nrv", u, 0, 1, 0, q == 7 ? 1 : 0, q == 5 || q == 7 ? 1 : 0, 1); if (q != 7) { rc = u } if (q != 7 && rc && rc.id) { if (fk && (e > 6 || q == 2)) { if (!DDG.device.isOpera) { nua("nrs", rc, 0, 1, 0, 1, q == 5 ? 0 : q == 1 ? 1 : -1) } else { nrs(rc, 1, q == 5 ? 0 : q == 1 ? 1 : -1) } } else { if (!DDG.device.isOpera) { nua("nrs", rc, 0, 1) } else { nrs(rc, 0, 0) } } } } else { if (c == 1 && n != "zero_click_wrapper" && !DDG.deep.isOutOfResults && (!rs || !it) && DDG.deep.lastPage >= DDG.deep.pageNumber) { nrv(d.getElementById("r1-" + parseInt(r1c - 1)), 1); setTimeout("nrm(" + q + ",'" + m + "')", 100) } } if (DDG.device.isOpera && q == 1 && nrb) { nrb() } fo = 0 } function appendAdClass(b, a, e, c) { b.className += " result--ad highlight_sponsored sponsored"; if ((a === 0 && DDG.page.ads.smallFirst) || (a === 1 && DDG.page.ads.smallSecond) || a > 1 || c.side) { b.className += " result--ad--small" } b.setAttribute("data-source", e) } function resultsBetweenLastSeparators() { var a = document.querySelectorAll(".result"); var c = []; var f = 0; for (var e = 0; e < a.length; e++) { if (/js-result-sep/.test(a[e].className)) { c.unshift(f); f = 0 } else { f += 1 } } c.unshift(f); var b = c[1] || c[0]; return b } function nrn(az, H, s, N) { if (!az || !H) { return } if (!s) { DDG.deep.nrnWrapper(az, H); return } var Q, aw, ao, am, ak, J, m, C, p, V, af, o, av, ai, v, u, ax, ar, ap, Y, b, A, ad, ac, Z, E, q, U, S, G, ab, F, X, ae, ag, M, I, aj, a, L; var aq = DDG.page.ads.canShowRightRailAds(); var au = DDG.page.ads.canShowGoodAdsLayout(); var P = false; var g = kai && kai == "-1"; var k; var h = false; E = H.length; if (az === "d") { av = "1"; o = d.getElementById("links"); ai = r1c; if (!DDG.deep.started) { ag = 1; DDG.deep.set("started", new Date().getTime()) } } else { if (az === "a") { ai = r3c; av = "a"; P = !ai && DDG.deep.pageNumber === 1; var T = 3; if (E > T) { H = H.slice(0, T); E = H.length } if (DDG.page.ads.isBlocked() || !H.length) { return } if (P && !H[0].late) { var t = $(".js-sidebar-ads"), e = DDG.page.ads.rightRailBoth, f = DDG.page.ads.rightRailSecond; if (f || e || (DDG.page.ads.ads.length > 2 && aq)) { t.addClass("results--ads results--ads--rrail"); $("html").addClass("has-right-rail-ads") } if (e) { o = t[0] } else { o = d.getElementById("ads") } } else { var c = $('
'); if (H[0].late) { var at = !DDG.deep.isOutOfResults && (!DDG.settings.autoloadDisabled() || DDG.deep.lastPage >= DDG.deep.pageNumber); if (at) { $(".js-result-hidden-el:last").append(c) } else { $(".results_links_deep:last").after(c) } } else { $("#links").append(c) } o = c[0] } } } G = 0; if (az == "d" && (!H.length || H[E - 1]["t"] == "EOP" || H[E - 1]["t"] == "EOF" || !DDG.deep.hasMoreResultsToLoad())) { G = 1; DDG.deep.set("isOutOfResults", true); DDG.deep.set("isLastResult", true); if (H.length && H[E - 1]["t"] == "EOP") { G = 2 } if (E === 1 && ag) { setTimeout(function() { DDG.pixel.fire("nre", { ss: DDG.page.showingSafeSearch }) }, 250) } } if (az == "d") { $(".js-results-loading").remove(); if (E > 1) { $(".js-result-sep.is-hidden").removeClass("is-hidden") } } Y = b = q = U = S = 0; for (var Q = 0; Q < E; Q++) { Y++; F = 0; if (!H[Q]) { continue } if (!a && Q > 0) { a = true } if (!DDG.settings.isDefault("k1") && H[Q]["p"]) { continue } if (az === "a" && ((Q > 0 && DDG.page.ads.rightRailSecond) || (Q > 1 && aq)) || H[Q] && H[Q].side) { o = $(".js-sidebar-ads")[0] } if (Y == 1 && rv == "i") { setTimeout('top.location.replace("' + H[Q]["u"] + '")', 100); return } if (DDG.pageLayout.isSlottingExperiment()) { DDG.page.pageLayoutView.renderModuleForSlot(az, ai, o, E) } var an = H[Q]["u"] || ""; var W = H[Q]["d"] || ""; W = W.split("/"); var A = W.shift() || ""; ab = 0; if (az == "d" && H[Q]["t"] == "EOP") { ab = 1; continue } else { if (az == "d" && H[Q]["t"] == "EOF") { ab = 1; continue } } if (az == "d" && !ab && !H[Q]["p"]) { if (!A || DDG.deep.resultDomains[H[Q]["u"]]) { if (b == 0 && Y == E && !ag && !DDG.deep.hideNoResults) { if (DDG.searchExperiments.getExperimentGroup("v7exp") !== "a") { nrj("/l.js?q=" + rq) } } if (Y == E) { F = 1 } else { if (!DDG.pageLayout.isSlottingExperiment()) { continue } } } else { DDG.deep.resultDomains[H[Q]["u"]] = H[Q]["u"] } if (Q == (E - 1) && H[Q]["n"]) { DDG.page.deepNextURL = H[Q]["n"] } } if (!F) { b++; aw = d.createElement("div"); aw.id = "r" + av + "-" + ai; ai++; $(aw).addClass("result results_links" + (az == "d" && !H[Q]["h"] ? "_deep" : "") + " highlight_" + az); if (au && az == "a") { $(aw).addClass("result--ad--good") } if (az === "a" && H[Q]["adn"]) { aw.setAttribute("data-adn", H[Q]["adn"]) } if (az === "a" && H[Q]["adf"]) { aw.setAttribute("data-adf", 1) } aw.setAttribute("data-domain", A); var D = d.createElement("a"); D.href = an; aw.setAttribute("data-hostname", D.hostname); if (typeof H[Q]["hu"] !== "undefined") { aw.setAttribute("data-hu", H[Q]["hu"]) } } if (H[Q]["da"]) { DDG.search.deepAnswerIAs["r" + (ai - 1)] = H[Q]["da"] } if (F) { continue } ao = d.createElement("div"); $(ao).addClass("result__body links_" + (av == 1 || av == "a" ? "main" : "zero_click")); if ((az == "d" || az == "a") && !H[Q]["h"]) { $(ao).addClass("links_deep") } var K; if (az != "r") { m = d.createElement("a"); K = d.createElement("a"); if (az == "d" || az == "a") { m.className = "result__a"; m.setAttribute("rel", "noopener"); K.setAttribute("rel", "noopener"); K.className = "result__check"; K.innerHTML = '' + l("Your browser indicates if you've visited this link") + "" } m.href = H[Q]["c"]; K.href = H[Q]["c"]; if (kn && kn == "1" && m && m.href && m.getAttribute("href").indexOf("http") != -1) { m.target = "_blank"; K.target = "_blank" } M = d.createElement("h2"); M.className = "result__title"; m.innerHTML = H[Q]["t"]; C = m; if (DDG.searchExperiments.demexp && DDG.searchExperiments.demexp.activeGroup === "c") { k = DDG.$exec_template("result_icon_lock", { icon: { hide: false } }); M.appendChild(k[0]) } M.appendChild(m); M.appendChild(K); ao.appendChild(M) } if (az == "d" || az == "a") { var n = new DDG.Views.ResultSnippet({ model: new DDG.Models.ResultSnippet({ isAd: az === "a", item: H[Q], showExtensionData: az === "a" && DDG.page.ads.canShowAdExtensions(Q, DDG.deep.pageNumber) }), appendTo: $(ao), parentDiv: aw }); var ah = null, R = null, O = H[Q].l; if (DDG.pageLayout && DDG.pageLayout.canSendImpressions()) { O = DDG.getProperty(H[Q], "adext.sitelinks.l"); R = DDG.getProperty(H[Q], "adext.sitelinks.tid") } if (az === "a" && O) { ah = new DDG.Models.AdSitelinks({ sitelinksMarkup: O, tid: R, showEnhancedSiteLinks: DDG.page.ads.canShowEnhancedSiteLinks(Q), canShowGoodAdsLayout: DDG.page.ads.canShowGoodAdsLayout(), source: H[Q].s, adxExperiment: DDG.page.ads.adxExperiment, layoutName: DDG.page.ads.adx, isShowingLargeSitelinks: L, isFirstPageOfAds: P, domain: H[Q].d }); L = ah.canShowLargeSitelinks() } am = d.createElement("div"); am.className = "result__extras js-result-extras"; var al = new DDG.Views.ResultExtras({ model: new DDG.Models.ResultExtras({ isAd: az === "a", item: H[Q] }), appendTo: $(am), parentDiv: aw, titleLockIcon: k }); if (O && az === "a" && ah && !ah.canShowLargeSitelinks()) { DDG.page.views["adSitelinks" + Q] = new DDG.Views.AdSitelinks({ model: ah, organicResultContainer: aw, appendTo: $(n.$el) }) } if (!ab) { if (H[Q]["p"]) { DDG.page.views["adBadge" + Q] = new DDG.Views.AdBadge({ appendTo: $(M) }); appendAdClass(aw, Q, H[Q].s, H[Q]) } } if (ah && ah.canShowLargeSitelinks() && g) { ao.appendChild(am); DDG.page.views["adSitelinks" + Q] = new DDG.Views.AdSitelinks({ model: ah, organicResultContainer: aw, appendTo: $(ao) }) } else { if (ah && ah.canShowLargeSitelinks()) { ao.insertBefore(am, ao.lastChild); aw.className += " result--url-above-snippet"; DDG.page.views["adSitelinks" + Q] = new DDG.Views.AdSitelinks({ model: ah, organicResultContainer: aw, appendTo: $(ao) }) } else { if ((n.$el && !n.$el[0] || g)) { ao.appendChild(am) } else { ao.insertBefore(am, ao.lastChild); aw.className += " result--url-above-snippet" } } } } aw.appendChild(ao); o.appendChild(aw); if (az === "a") { DDG.pageLayout.recordAdImpression(H[Q], ah, n) } if (O && az === "d" && !h) { h = true; DDG.add_sitelinks(aw, Q, H, A) } if (!rc && aw.id == DDG.first_result) { rc = aw; var r = d.createElement("div"); r.id = "organic-module"; o.appendChild(r) } if (az == "d" && b == 1) { X = 0; u = new RegExp("^r1-(\\d+)$"); if (rc && u.test(rc.id)) { ax = RegExp.$1 } X = ax == ai ? 1 : 0; if (fk && X && (!aw.previousSibling || aw.previousSibling.id.indexOf("r1-") == -1)) { nrm(6, aw.id) } } var B = function(i, x, j, y) { if (i === "a") { adClick(x, j, y) } return nrl(y, this) }; if (C) { C.onclick = B.bind(C, az, H[Q].s, aw) } } if (az == "d" && H[0] && H[0]["s"] && !DDG.deep.showedAttribution) { if (ag) { DDG.first_source = H[0]["s"] } DDG.search.set("src", H[0]["s"]); if (DDG.deep.canShowAttribution()) { new DDG.Views.WebAttribution({ model: DDG.deep, appendTo: ".js-serp-bottom-right" }); DDG.deep.set("showedAttribution", true) } } if (av == "a") { if (!r3c) { DDG.page.ads.setFirstBatchShown() } r3c = ai } else { if (!ag && resultsBetweenLastSeparators() < 10) { $(".js-result-sep:last").remove(); DDG.deep.pageNumberDecrement() } r1c = ai } H = null; if (nir) { nir(az) } DDG.ImageLoader.locateUnloaded(); var ay = document.getElementsByClassName("pinned-to-bottom")[0]; if (ay && ag) { $("#links")[0].appendChild(ay) } else { if (!ay) { ay = d.createElement("div"); $(ay).addClass("pinned-to-bottom"); $("#links")[0].appendChild(ay) } } if (G && !DDG.deep.hideNoResults && !DDG.deep.getResultCount()) { DDG.page.noResults = new DDG.Views.NoResults({ appendTo: $("#links") }) } if (!G && Y == E && !q && N) { var aa = $("#links")[0]; ao = d.createElement("div"); $(ao).addClass("result result--more"); m = d.createElement("a"); m.href = "javascript:;"; m.onclick = function() { DDG.pixel.fire("mrc"); if (DDG.deep.hasPendingResults()) { nsr(this); DDG.deep.showPendingResults(); $(".js-result-sep").removeClass("is-hidden") } else { nsr(this) } }; m.className = "result__a"; ao.id = "rld-" + ++rdc; m.appendChild(d.createTextNode(lp("additional_info_at", "More results"))); m.className = "result--more__btn btn btn--full"; ao.appendChild(m); aa.appendChild(ao); ao = d.createElement("div"); ao.id = "rrd-" + rdc; ao.className = "js-result-hidden-el"; $(ao).css("display", "none"); aa.appendChild(ao); q = 1 } if (nrb) { nrb() } } function nsr(f, s, e) { if (!f) { return } var j, i, h, c, g, m, o, n, k, r, a, u, b; h = new RegExp("^r[lr](.*)-(\\d+)$"); f = f.parentNode; if (f.id && h.test(f.id)) { g = RegExp.$1 || 0; m = RegExp.$2 || 0 } if (g && m) { if (tn == f.id) { return false } tn = f.id; b = j = i = 0; c = new RegExp("^r1-(\\d+)$"); if (rc && c.test(rc.id)) { j = RegExp.$1 } if (f.previousSibling && c.test(f.previousSibling.id)) { i = RegExp.$1 } b = j && i && parseInt(j) == parseInt(i) + 1 ? 1 : 0; if (!fk) { b = 2 } o = d.getElementById("rl" + g + "-" + m); n = d.getElementById("rr" + g + "-" + m); k = d.getElementById("rl" + g + "-" + (parseInt(m) + 1)); var q = DDG.settings.get("kv"); if (q && q != "-1" && rds != 0 && (rds != 1 || r1hc) && g && g.indexOf("i") == -1) { o.onmouseover = function() {}; o.onmouseout = function() {}; o.onclick = function() {}; o.className = "result result--sep is-hidden js-result-sep"; var p = DDG.deep.pageNumberIncrement(); if (q == "m") { o.className += " result--sep--hr"; o.innerHTML = "" } else { if (q == "l") { o.innerHTML = '
' + l("Page %s", p) + "
" } else { o.className += " result--sep--hr has-pagenum"; o.innerHTML = '
' + p + "
" } } } else { $(o).css("display", "none") } n.style.display = "block"; if (k && !s) { $(k).css("display", "block") } else { if (!k && (g == "d" || g == "e0" && !fd) && DDG.page.deepNextURL) { a = d.createElement("span"); a.className = (!DDG.settings.autoloadDisabled()) ? "result--more" : "btn result--more"; a.className += " is-loading js-results-loading"; a.innerHTML = Handlebars.helpers.loader(); n.parentNode.appendChild(a); if (rv == "d") { rv = "" } if (rds) { rds += 50 } else { rds += 30 } nrj(DDG.page.deepNextURL, 1); delete DDG.page.deepNextURL } } if (!s && !e && b == 1) { if (f.nextSibling.firstChild) { nrm(6, f.nextSibling.firstChild.id) } } } } function nul(b) { var a, c; var a = b.href.indexOf("/l/?kh=-1&uddg="); if (a != -1) { c = decodeURIComponent(b.href.substring(a + 15)) } if (c) { b.href = c } fl = 0 } function nutp(b) { var a = b.split("_"); DDG.pixel.fire.apply(DDG.pixel, a); a.unshift("old"); DDG.pixel.fire.apply(DDG.pixel, a) } function nua(i, j, h, g, b, e, c, a) { if (!b) { b = tr.length; tr[b] = j } if (!h) { h = 10 } if (!g) { setTimeout(i + "(tr[" + b + "]," + e + "," + c + "," + a + ");", h) } else { if (!tsl) { tsl = ts.length; setTimeout(i + "(tr[" + b + "]," + e + "," + c + "," + a + ");tsl=0", 10) } else { setTimeout("nua(" + i + ",0,1," + b + "," + e + "," + c + "," + a + ")", 100) } } } function nug(e, g) { var b, c, f, a; fl = 0; fn = 0; a = ""; if (window.getSelection) { a = window.getSelection().toString() } else { if (document.selection) { a = document.selection.createRange(); a = a.text } } var h = a == DDG.last_selection ? 1 : 0; DDG.last_selection = a; if (!h) { return false } if (g) { openBlankWindow(e) } else { if (w.postMessage && !DDG.device.isSafari && !DDG.device.isIDevice && !DDG.device.isKonqueror && kg != "p" && DDG.settings.useRedirect()) { b = document.getElementById("iframe_hidden"); b.contentWindow.postMessage("ddg:" + e, location.protocol + "//" + location.hostname) } else { if ((DDG.device.isIE || DDG.device.isIDevice || DDG.device.isChrome || DDG.device.isSafari || DDG.device.isFirefox) && e.indexOf("http") != -1 && kg != "p" && DDG.settings.useRedirect()) { if (d.getElementById("iframe_hidden")) { d.body.removeChild(d.getElementById("iframe_hidden")) } c = "