https://cdn.sentinelp.com/an_sentinel.js?v=199

Last Checked: Apr 26, 2024, 18:42 EDT

IP Address: 169.150.221.147
ASN #: AS60068 CDN77 _, GB
Location: Unknown, Unknown, Unknown
URL Reputation:
  • Unknown This URL is not identified as malicious in the PhishTank Database.
  • Unknown PhishCheck thinks this URL is likely not a phish.
  • Unknown OpenPhish: URL not in feed.

Other submissions on 169.150.221.147:

  • https://8iunos1x6o17.swipepages.net/

  • https://core.arc.io/broker.html?987699e

  • https://84dds8rsbi0c.swipepages.net/montolieu-A17540

  • http://s10.adtidy.net/

  • https://cam.fapchat.com/pink?transaction_id=102bc0a0d92ed48173abbda013694f&aff_id=21&aff_sub=TJ_1006524281_PHUB_UPL_ALL&aff_sub2=KW_{Keywords};PUB_Pornhub+PC-+Underplayer+Adblock;SBAN_011498DFAPC18ALLEN6667L1;SCMP_1006524281;LOC_UPLVLM_74fc5c78-15b4-4af1-81eb-dac31733665e_706f4996-8bfc-4749-aa10-9848ab457669_bc1e1db8-c1c7-4d3e-a60a-e0bbdc45e65b&source=TS1-1006524281&file_id=585010&xid=4&bo=5696,5603,5645

  • http://tcache92.com/

  • http://wcache12.com/

  • http://ipfs.tech/

  • http://spdtrk.com/

  • https://roblox.com.vc/

Other submissions on sentinelp.com:

  • https://cdn.sentinelp.com/admiral/admiral_HowToGeek.js?v=199

  • https://sentinelp.com/www.howtogeek.com/an-strpixel.png?time=1714170663303&permalink=/811409/force-delete-folder-windows/&referrer=&isActiveSession=0&connSpeed=10&naMode=0&intent=Evergreen&contentType=Feature&primaryTag=Windows%2011&primaryCategory=Windows&networkCategory=tech&type=engagedSeconds&typeValue=5&uuid=2ffed2f4-24a4-4005-9fa2-e642d2cfcdbe

Previous checks:

                               Domain Name: sentinelp.com
Registry Domain ID: 2861523544_DOMAIN_COM-VRSN
Registrar WHOIS Server: whois.godaddy.com
Registrar URL: https://www.godaddy.com
Updated Date: 2024-03-06T16:46:14Z
Creation Date: 2024-03-06T16:46:13Z
Registrar Registration Expiration Date: 2029-03-06T16:46:13Z
Registrar: GoDaddy.com, LLC
Registrar IANA ID: 146
Registrar Abuse Contact Email: abuse@godaddy.com
Registrar Abuse Contact Phone: +1.4806242505
Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited
Domain Status: clientUpdateProhibited https://icann.org/epp#clientUpdateProhibited
Domain Status: clientRenewProhibited https://icann.org/epp#clientRenewProhibited
Domain Status: clientDeleteProhibited https://icann.org/epp#clientDeleteProhibited
Registry Registrant ID: Not Available From Registry
Registrant Name: Registration Private
Registrant Organization: Domains By Proxy, LLC
Registrant Street: DomainsByProxy.com
Registrant Street: 2155 E Warner Rd
Registrant City: Tempe
Registrant State/Province: Arizona
Registrant Postal Code: 85284
Registrant Country: US
Registrant Phone: +1.4806242599
Registrant Phone Ext:
Registrant Fax: 
Registrant Fax Ext:
Registrant Email: Select Contact Domain Holder link at https://www.godaddy.com/whois/results.aspx?domain=sentinelp.com
Registry Admin ID: Not Available From Registry
Admin Name: Registration Private
Admin Organization: Domains By Proxy, LLC
Admin Street: DomainsByProxy.com
Admin Street: 2155 E Warner Rd
Admin City: Tempe
Admin State/Province: Arizona
Admin Postal Code: 85284
Admin Country: US
Admin Phone: +1.4806242599
Admin Phone Ext:
Admin Fax: 
Admin Fax Ext:
Admin Email: Select Contact Domain Holder link at https://www.godaddy.com/whois/results.aspx?domain=sentinelp.com
Registry Tech ID: Not Available From Registry
Tech Name: Registration Private
Tech Organization: Domains By Proxy, LLC
Tech Street: DomainsByProxy.com
Tech Street: 2155 E Warner Rd
Tech City: Tempe
Tech State/Province: Arizona
Tech Postal Code: 85284
Tech Country: US
Tech Phone: +1.4806242599
Tech Phone Ext:
Tech Fax: 
Tech Fax Ext:
Tech Email: Select Contact Domain Holder link at https://www.godaddy.com/whois/results.aspx?domain=sentinelp.com
Name Server: NS20.DIGICERTDNS.COM
Name Server: NS21.DIGICERTDNS.COM
Name Server: NS23.DIGICERTDNS.NET
Name Server: NS24.DIGICERTDNS.NET
DNSSEC: unsigned
URL of the ICANN WHOIS Data Problem Reporting System: http://wdprs.internic.net/
>>> Last update of WHOIS database: 2024-04-26T22:42:09Z <<<
For more information on Whois status codes, please visit https://icann.org/epp

TERMS OF USE: The data contained in this registrar's Whois database, while believed by the
registrar to be reliable, is provided "as is" with no guarantee or warranties regarding its
accuracy. This information is provided for the sole purpose of assisting you in obtaining
information about domain name registration records. Any use of this data for any other purpose
is expressly forbidden without the prior written permission of this registrar. By submitting
an inquiry, you agree to these terms and limitations of warranty. In particular, you agree not
to use this data to allow, enable, or otherwise support the dissemination or collection of this
data, in part or in its entirety, for any purpose, such as transmission by e-mail, telephone,
postal mail, facsimile or other means of mass unsolicited, commercial advertising or solicitations
of any kind, including spam. You further agree not to use this data to enable high volume, automated
or robotic electronic processes designed to collect or compile this data for any purpose, including
mining this data for your own personal or commercial purposes. Failure to comply with these terms
may result in termination of access to the Whois database. These terms may be subject to modification
at any time without notice.


                             
  • GET
    200 OK

    https://firefox.settings.services.mozilla.com/v1/buckets/main/collections/whats-new-panel/changeset?_expected=1617030573137

<html><head><link rel="stylesheet" href="resource://content-accessible/plaintext.css"></head><body><pre>/*! For license information please see an_sentinel.js.LICENSE.txt */
(function(){var __webpack_modules__={"./client/js/adsninja-logger.js":function(){eval("//\n// Log messages to the console.\nfunction AdsNinjaLogger(debug = false){\n\n    this.DEFAULT_MESSAGE_PILL     = 'AdsNinja';\n    this.DEFAULT_STYLE_PILL       = 'display: inline-block; padding: 1px 4px; border-radius: 3px;';\n    this.DEFAULT_STYLE_PILL_DEBUG = 'background: blue; color: #fff;';\n    this.DEFAULT_STYLE_PILL_WARN  = 'background: yellow; color: #000;';\n    this.DEFAULT_STYLE_PILL_ERROR = 'background: red; color: #fff;';\n\n    this.__debug = debug;\n\n    // Check if debug param is presnt in query string. If it is present, set debug to true.\n    if(URLSearchParams){\n\n        var urlParams = new URLSearchParams(window.location.search);\n\n        if(urlParams.has('an_debug')){\n    \n            var urlParamsDebug = urlParams.get('an_debug');\n            urlParamsDebug     = (urlParamsDebug === '0' || urlParamsDebug === 'false') ? false : urlParamsDebug; \n            this.__debug       = Boolean(urlParamsDebug);\n\n            localStorage.setItem('an_debug', this.__debug);\n        }\n        else{\n\n            var localStorageDebug = localStorage.getItem('an_debug');\n            localStorageDebug     = (localStorageDebug === '0' || localStorageDebug === 'false') ? false : localStorageDebug; \n            localStorageDebug     = Boolean(localStorageDebug);\n\n            this.__debug = Boolean(this.__debug || localStorageDebug);\n        }\n    }\n}\n\n//\n// Returns debug status.\nAdsNinjaLogger.prototype.isDebug = function(){\n\n    return this.debug;\n}\n\n//\n// Returns log data.\nAdsNinjaLogger.prototype.__getLogData = function(data, takeDataSnapshot = true){\n\n    var logData = null;\n\n    if(typeof data === 'object' &amp;&amp; Object.keys(data).length !== 0 &amp;&amp; data !== null){\n\n        logData = data;\n\n        if(takeDataSnapshot){\n\n            try{\n\n                // To keep current state of data intact.\n                logData = JSON.parse(JSON.stringify(data));\n            }\n            catch(error){\n\n                this.warn(error.message, {\n                    error: error,\n                    data: data,\n                }, false);\n\n                // Circular logic detected.\n                logData = data;\n            }\n        }\n    }\n    else{\n\n        logData = '';\n    }\n\n    return logData;\n}\n\n//\n// Logs to console with default level.\nAdsNinjaLogger.prototype.log = function(message, data = {}, takeDataSnapshot = true){\n\n    var logData = this.__getLogData(data, takeDataSnapshot);\n\n    console.log(\n        `%c${this.DEFAULT_MESSAGE_PILL}`,\n        `${this.DEFAULT_STYLE_PILL} ${this.DEFAULT_STYLE_PILL_DEBUG}`,\n        message,\n        logData\n    );\n}\n\n//\n// Logs to console with info level.\nAdsNinjaLogger.prototype.info = function(message, data = {}, takeDataSnapshot = true){\n\n    this.log(message, data, takeDataSnapshot);\n}\n\n//\n// Logs to console with debug level.\nAdsNinjaLogger.prototype.debug = function(message, data = {}, takeDataSnapshot = true){\n\n    if(!this.__debug){\n\n        return;\n    }\n\n    var logData = this.__getLogData(data, takeDataSnapshot);\n\n    console.debug(\n        `%c${this.DEFAULT_MESSAGE_PILL}`,\n        `${this.DEFAULT_STYLE_PILL} ${this.DEFAULT_STYLE_PILL_DEBUG}`,\n        message,\n        logData\n    );\n}\n\n//\n// Logs to console with warn level.\nAdsNinjaLogger.prototype.warn = function(message, data = {}, takeDataSnapshot = true){\n\n    var logData = this.__getLogData(data, takeDataSnapshot);\n\n    console.warn(\n        `%c${this.DEFAULT_MESSAGE_PILL}`,\n        `${this.DEFAULT_STYLE_PILL} ${this.DEFAULT_STYLE_PILL_WARN}`,\n        message,\n        logData\n    );\n}\n\n//\n// Logs to console with error level.\nAdsNinjaLogger.prototype.error = function(message, data = {}, takeDataSnapshot = true){\n\n    var logData = this.__getLogData(data, takeDataSnapshot);\n\n    console.error(\n        `%c${this.DEFAULT_MESSAGE_PILL}`,\n        `${this.DEFAULT_STYLE_PILL} ${this.DEFAULT_STYLE_PILL_ERROR}`,\n        message,\n        logData\n    );\n}\n\nwindow.AdsNinjaLogger = AdsNinjaLogger;\n\n//# sourceURL=webpack://AdsNinja-Package/./client/js/adsninja-logger.js?")},"./client/js/adsninja-sentinel.js":function(){eval("\nwindow.an_sentinel                        = window.an_sentinel || {};\nwindow.an_sentinel.queue                  = window.an_sentinel.queue || [];\nwindow.an_sentinel.__sentinel             = null;\nwindow.an_sentinel.logger                 = new AdsNinjaLogger();\nvar __firstQueueProcessing                = true;\n\nwindow.an_sentinel.init = function (data){\n\n    this.__siteConfig = data.siteConfig || {};\n\n    var isNoAdsMode = 0;\n    if (data['modeAds'] == undefined || (data['modeAds'] !== undefined &amp;&amp; data['modeAds'] === 2)) {\n        isNoAdsMode = 1;\n    } else {\n        if (data['connectionConfig'] &amp;&amp; data['connectionConfig'][data['connectionType']]) {\n            if (data['connectionConfig'][data['connectionType']]['adsDisabled'] === true) {\n                isNoAdsMode = 1;\n            }\n        }\n    }\n    \n    if(window.adsninja_sentinel &amp;&amp; this.__siteConfig.hasOwnProperty('sentinelEnabled') &amp;&amp; this.__siteConfig.sentinelEnabled){\n        \n        var pageLevelDefinition = null;\n        if(data['pageLevelDefinition'] !== undefined){\n            \n            pageLevelDefinition = data['pageLevelDefinition'];\n        }\n        \n        var infiniteScrollEvent = null;\n        if(data['infiniteScrollEvent'] !== undefined){\n\n            infiniteScrollEvent = data['infiniteScrollEvent'];\n        }\n\n        window.an_sentinel.__sentinel = new adsninja_sentinel('an-strpixel.png', 'article', isNoAdsMode, pageLevelDefinition, infiniteScrollEvent);\n        this.logger.debug(\"an_sentinel: Sentinel created\");\n    }\n\n}\n\nwindow.an_sentinel.processQueue = function (){\n\n    // Execute all closures currently in the queue.\n    while(window.an_sentinel.queue.length &gt; 0){\n\n        var closure = window.an_sentinel.queue.shift();\n        \n        try{\n\n            closure();\n        }\n        catch(error){\n\n            this.logger.error('Error in queue processing an_sentinel queue.', {\n                message: error.message,\n                closure: closure,\n            });\n        }\n    }\n\n    if(__firstQueueProcessing){\n\n        // Override methods to call our handler.\n        // This way closures pushed to the queue will be executed immediately from this point on.\n        window.an_sentinel.queue.push = function(){\n\n            Array.prototype.push.apply(this, arguments);\n            window.an_sentinel.processQueue();\n        };\n\n        window.an_sentinel.queue.unshift = function(){\n\n            Array.prototype.unshift.apply(this, arguments);\n            window.an_sentinel.processQueue();\n        };\n\n        __firstQueueProcessing = false;\n    }\n}\n\nif('complete' !== document.readyState){\n\n    document.addEventListener('readystatechange', function(event){\n\n        if('complete' === event.target.readyState){\n\n            window.an_sentinel.processQueue();\n        }\n    });\n}\nelse{\n\n    window.an_sentinel.processQueue();\n}\n\n//# sourceURL=webpack://AdsNinja-Package/./client/js/adsninja-sentinel.js?")},"./vendor/valnet/valnet_sentinel/src/js/valnet_sentinel.js":function(){eval('function adsninja_sentinel(pixelUrl, elementName = null, isNoAdsMode, pageLevelDefinition = null, infiniteScrollEvent = null) {\n\n    // Set and check for pixelUrl property. Cannot have a pixel without a pixelUrl\n    this.pixelUrl = pixelUrl;\n\n    if(elementName==\'article\'){\n\n        \n        var element = document.body;\n\n        var elements = document.querySelectorAll("article.w-article");\n        if (elements.length &gt; 0) {\n\n            element = elements[elements.length - 1];\n        }\n        \n        this.createPageDepthMarkers(element);\n\n    }\n\n    if(infiniteScrollEvent !== null){\n\n        this.infiniteScrollEvent = infiniteScrollEvent;\n        this.listenForInfiniteScroll(infiniteScrollEvent);\n    }\n\n    this.createEngagedPageTimers();\n\n    this.isNoAdsMode = isNoAdsMode;\n\n    this.pageLevelDefinition = pageLevelDefinition;\n\n    this.uuid = this.generateUUID();\n\n    this.connectionSpeed = this.getConnectionSpeed();\n\n    if(!this.pixelUrl){\n\n        console.error("Sentinel pixel failed to instantiate. No pixelUrl provided.");\n    } else {\n\n        this.sendPixel();\n    }\n}\n\nadsninja_sentinel.prototype.sendPixel = function(type = null, typeValue = null) {\n\n    var pixelUrl = this.pixelUrl;\n    var referrer = document.referrer;\n    var xhttp = new XMLHttpRequest();\n\n    var hostname = window.location.hostname;\n    if(!hostname.startsWith("www.")){\n        hostname = "www." + hostname;\n    }\n\n    // define basic url\n    var url = "https://sentinelp.com/" + hostname + "/" + pixelUrl + "?time=" + Date.now() + "";\n\n    // add permalink to url\n    url = url + "&amp;permalink=" + "/" + window.location.pathname.replace(/(^\\/+|\\/+$)/g, \'\') + \'/\';\n\n    // add referrer to url, generated in real time\n    url = url + "&amp;referrer=" + referrer;\n\n    // add isActiveSession to url\n    url = url + "&amp;isActiveSession=" + (sessionStorage.getItem(\'sentinel_sessionTracker\') ?? 0);\n\n    if (this.connectionSpeed) {\n        // add connection speed\n        url = url + "&amp;connSpeed=" + this.connectionSpeed;\n    }\n\n    // add ads mode\n    url = url + "&amp;naMode=" + this.isNoAdsMode;\n\n    if(this.pageLevelDefinition){\n        \n        if(this.pageLevelDefinition.intent){\n\n            url = url + "&amp;intent=" + encodeURIComponent(this.pageLevelDefinition.intent);\n        }\n\n        if(this.pageLevelDefinition.contentType){\n\n            url = url + "&amp;contentType=" + encodeURIComponent(this.pageLevelDefinition.contentType);\n        }\n\n        if(this.pageLevelDefinition.primaryTag){\n\n            url = url + "&amp;primaryTag=" + encodeURIComponent(this.pageLevelDefinition.primaryTag);\n        }\n\n        if(this.pageLevelDefinition.primaryCategory){\n\n            url = url + "&amp;primaryCategory=" + encodeURIComponent(this.pageLevelDefinition.primaryCategory);\n        }\n\n        if(this.pageLevelDefinition.networkCategory){\n\n            url = url + "&amp;networkCategory=" + encodeURIComponent(this.pageLevelDefinition.networkCategory);\n        }\n    }\n\n    // check for type and use if not pre-defined rely on referrer\n    if(!type){\n\n        type = "pageVisit";\n\n        // check referrer domain to update and set type\n        if (referrer &amp;&amp; referrer.trim() !== ""){\n\n            var domain = window.location.hostname;\n            var referrerDomain = (new URL(referrer)).hostname;\n\n            if (referrerDomain === domain) {\n\n                type = "pageView";\n            } else {\n\n                type = "pageVisit";\n            }\n        }\n    }\n\n    url = url + "&amp;type=" + type;\n\n    if(typeValue!==null){\n\n        url = url + "&amp;typeValue=" + typeValue;\n    }\n\n    url = url + "&amp;uuid=" + this.uuid;\n\n    xhttp.open("GET", url, true);\n    xhttp.send();\n}\n\nadsninja_sentinel.prototype.sendVideoPixel = function(identifier, type, clientData, message = null, value = null, data = null) {\n\n    var pixelUrl = this.pixelUrl;\n    var referrer = document.referrer;\n    var xhttp = new XMLHttpRequest();\n\n    var hostname = window.location.hostname;\n    if(!hostname.startsWith("www.")){\n        hostname = "www." + hostname;\n    }\n\n    // define basic url\n    var url = "https://sentinelp.com/" + hostname + "/video/" + pixelUrl + "?time=" + Date.now() + "";\n\n    // add referrer to url, generated in real time\n    url = url + "&amp;referrer=" + referrer;\n\n    // add isActiveSession to url\n    url = url + "&amp;isActiveSession=" + (sessionStorage.getItem("sentinel_sessionTracker") ?? 0);\n\n    if (this.connectionSpeed) {\n        // add connection speed\n        url = url + "&amp;connSpeed=" + this.connectionSpeed;\n    }\n\n    // add ads mode\n    url = url + "&amp;naMode=" + this.isNoAdsMode;\n\n    if(this.pageLevelDefinition){\n        \n        if(this.pageLevelDefinition.intent){\n\n            url = url + "&amp;intent=" + encodeURIComponent(this.pageLevelDefinition.intent);\n        }\n\n        if(this.pageLevelDefinition.contentType){\n\n            url = url + "&amp;contentType=" + encodeURIComponent(this.pageLevelDefinition.contentType);\n        }\n\n        if(this.pageLevelDefinition.primaryTag){\n\n            url = url + "&amp;primaryTag=" + encodeURIComponent(this.pageLevelDefinition.primaryTag);\n        }\n\n        if(this.pageLevelDefinition.primaryCategory){\n\n            url = url + "&amp;primaryCategory=" + encodeURIComponent(this.pageLevelDefinition.primaryCategory);\n        }\n\n        if(this.pageLevelDefinition.networkCategory){\n\n            url = url + "&amp;networkCategory=" + encodeURIComponent(this.pageLevelDefinition.networkCategory);\n        }\n    }\n\n    // add type to url\n    url = url + "&amp;type=" + type;\n\n    // add placement to url\n    url = url + "&amp;placement=" + identifier;\n\n    // add fileName to url (data - videoUrl)\n    if(data &amp;&amp; data.videoUrl !== undefined){\n        \n        url = url + "&amp;fileName=" + data.videoUrl;\n    }\n\n    // add isAutoPlay to url (data - isAutoplay - true or false)\n    if(data &amp;&amp; data.isAutoplay !== undefined){\n\n        url = url + "&amp;isAutoPlay=" + ((data.isAutoplay) ? "1" : "0");\n    }\n\n    // add permalink to url (clientData - clientData - url)\n    if(clientData.clientData &amp;&amp; clientData.clientData.url !== undefined) {\n        \n        url = url + "&amp;permalink=" + "/" + clientData.clientData.url.replace(/(^\\/+|\\/+$)/g, \'\') + "/";\n    }\n\n    // add template to url (clientData - clientData - template)\n    if(clientData.clientData &amp;&amp; clientData.clientData.template !== undefined) {\n        \n        url = url + "&amp;template=" + clientData.clientData.template;\n    }\n    \n    // add source to url (clientData - clientData - source)\n    if(clientData.clientData &amp;&amp; clientData.clientData.source !== undefined) {\n\n        url = url + "&amp;source=" + clientData.clientData.source;\n    }\n\n    url = url + "&amp;uuid=" + this.uuid;\n\n    xhttp.open("GET", url, true);\n    xhttp.send();\n}\n\nadsninja_sentinel.prototype.createPageDepthMarkers = function(element) {\n    \n    var elementStartPos = element.getBoundingClientRect().top + document.documentElement.scrollTop;\n    var elementHeight = element.offsetHeight;\n    var sentinelObj = this;\n\n    var depthMarkerPercentages = [0, 20, 40, 60, 80, 100];\n    depthMarkerPercentages.forEach(function(percentage) {\n\n        setupPercentMarker(sentinelObj, elementStartPos, elementHeight, percentage);\n    });\n}\n\nfunction setupPercentMarker(sentinelObj, elementStartPos, elementHeight, percentage) {\n    \n    var offsetHeight = (elementHeight * percentage / 100) + elementStartPos;\n    \n    function handleScroll() {\n        \n        if ((window.scrollY + window.innerHeight) &gt; offsetHeight) {\n            \n            sentinelObj.percentMarkerHandler(percentage);\n            window.removeEventListener(\'scroll\', handleScroll);\n        }\n    }\n    \n    window.addEventListener(\'scroll\', handleScroll);\n}\n\nadsninja_sentinel.prototype.percentMarkerHandler = function(percentage) {\n    \n    this.sendPixel("engagedDepth",percentage);\n}\n\nadsninja_sentinel.prototype.createEngagedPageTimers = function() {\n    \n    const maxEngagedTime = 30 * 60 * 1000;\n    var totalTimeEngaged = 0;\n    var timerPos = 0;\n    var timers = [5000,10000,15000,25000,35000,45000,65000,85000,105000,145000,185000,225000,305000,385000,465000,625000,785000,945000,1265000,1585000,1905000];\n    var sentinelObj = this;\n    var timerId;\n    var pausedTimer = false;\n    \n    function recursiveTimeout() {\n        \n        if(totalTimeEngaged &gt; maxEngagedTime){\n            return;\n        }\n        \n        timerId = setTimeout(recursiveTimeout, timers[timerPos]-totalTimeEngaged);\n        \n        if(!pausedTimer){\n            \n            if(totalTimeEngaged&gt;0){\n                \n                sentinelObj.engagedTimeHandler(timers[timerPos-1] / 1000);\n            }\n            \n            totalTimeEngaged = timers[timerPos];\n            timerPos += 1;\n        }\n        \n    }\n    \n    function pauseTimers() {\n        \n        clearTimeout(timerId);\n        pausedTimer = true;\n    }\n    \n    function resumeTimers() {\n        \n        recursiveTimeout();\n        pausedTimer = false;\n    }\n    \n    document.addEventListener("visibilitychange", function() {\n        \n        if (document.visibilityState === "hidden") {\n            \n            pauseTimers();\n        } else {\n            \n            resumeTimers();\n        }\n    });\n    \n    recursiveTimeout();\n}\n\nadsninja_sentinel.prototype.engagedTimeHandler = function(seconds) {\n    \n    this.sendPixel("engagedSeconds", seconds);\n}\n\nadsninja_sentinel.prototype.getConnectionSpeed = function() {\n    \n    var connectionSpeed = null;\n    if(navigator.connection){\n        connectionSpeed = navigator.connection.downlink;\n    }\n    \n    return connectionSpeed;\n}\n\nadsninja_sentinel.prototype.isAdBlockerActive = function() {\n    \n    var adElements = document.querySelectorAll(\'.adsninja-ad-zone\');\n    \n    var isAdBlocker = 0;\n    // Iterate through each ad element and check if it\'s visible\n    for (var i = 0; i &lt; adElements.length; i++) {\n        \n        var adElement = adElements[i];\n        var style = window.getComputedStyle(adElement);\n        \n        // Check if the element is hidden or has zero height\n        if (style.display === \'none\') {\n            isAdBlocker = 1; // Ad blocker might be active\n            break;\n        }\n    }\n    \n    return isAdBlocker;\n}\n\nadsninja_sentinel.prototype.generateUUID = function() {\n    \n    var uuid;\n    // Check if crypto.randomUUID() is supported\n    if (typeof crypto.randomUUID === \'function\') {\n        // Use crypto.randomUUID() if supported\n        uuid = crypto.randomUUID();\n    } else {\n        // Fallback method for generating UUIDs\n        function fallbackUUID() {\n            // Implementation of fallback UUID generation algorithm\n            return \'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\'.replace(/[xy]/g, function(c) {\n                var r = Math.random() * 16 | 0,\n                v = c === \'x\' ? r : (r &amp; 0x3 | 0x8);\n                return v.toString(16);\n            });\n        }\n        \n        // Use the fallback method to generate UUID\n        uuid = fallbackUUID();\n    }\n    \n    return uuid;\n}\n\nadsninja_sentinel.prototype.listenForInfiniteScroll = function(infiniteScrollEvent) {\n    \n    // Listen for infinite scroll events\n    window.addEventListener(infiniteScrollEvent, (event) =&gt; {\n        \n        console.log("adsNinjaSentinelInfiniteScroll event received");\n        this.sendPixel("pageView");\n    });\n}\n\nwindow.adsninja_sentinel = adsninja_sentinel;\n\n\n\n//# sourceURL=webpack://AdsNinja-Package/./vendor/valnet/valnet_sentinel/src/js/valnet_sentinel.js?')}};__webpack_modules__["./vendor/valnet/valnet_sentinel/src/js/valnet_sentinel.js"](),__webpack_modules__["./client/js/adsninja-logger.js"]();var __webpack_exports__={};__webpack_modules__["./client/js/adsninja-sentinel.js"]()})();</pre></body></html>

                             

Screenshot: