devxlogo

The Python 2.5 Goodie Bag: Language Enhancements and Modules

n my last article, “Drill-down on Three Major New Modules in Python 2.5 Standard Library,” I discussed how the ctypes, pysqlite, and ElementTree language modules can save you time and aggravation. In this, my third and final, article on the new 2.5 version of Python, I’ll go over some additional language enhancements and modules that each, individually, adds an important ingredient to some of the smaller subsets of the Python community. I will also cover performance improvements, porting your code from previous versions of Python, and some other odds and ends that will be important to anyone who is ready to adopt the latest release of Python.

Absolute and Relative Imports
To get started, I’ll run through some of the basics of Python language organization.

Python software is organized in modules (.py files) stored in packages. The modules may be pre-compiled (.pyc) or could be extension modules. Python packages are usually just directories that appear in sys.path. Sub-packages are sub-directories of a package directory (or other sub-package) that contain an __init__.py. If the __init__.py doesn’t exist then the sub-directory is ignored by Python’s import mechanism.

Python locates modules that you import by searching a list of directories (or zip files) stored in sys.path. This list is initialized with the directory of the running program, the contents of the PYTHONPATH environment variable, and a list of platform-dependent directories. Programs may modify sys.path at runtime to control the import behavior.

Prior to Python 2.5 imports were always relative to your sys.path. The algorithm was very simple:

When importing ‘aaa.a‘ scan through sys.path. Try to import aaa.a.py from each entry in sys.path.

There were two problems with this algorithm:

  1. Local modules might shadow library modules with identical names. This becomes more of a problem as the standard library grows.
  2. Modules inside nested packages had to use the full path to import modules from a sibling package or parent package.

Python 2.5 added a __future__ option to change the import behavior in order to address these problems. I created a little package and a couple of helper modules to demonstrate the import behavior in Python 2.5:

aaa (package) |-- __init__.py |-- a.py |-- aa.py

Here is the content of the modules:

__init__.py-----------print 'aaa/__init__ here'a.py----from __future__ import absolute_importprint 'aaa/a here'import aaaa.py-----print r'aaaaa here'

I “installed” the package by copying it to Lib/site-packages (the location of third-party Python packages).

In addition I created two modules in the site-packages directory.

import_test.py-----------print 'import_test here'import aaa.aaa.py-----print 'aa here'

Each module just prints its package (if in a package) and its name. It all starts with import_test.py that imports aaa.a. This results in the automatic import of aaa/__init__.py and then aaa/a.py. The latter, aaa/a.py, is the interesting piece. It uses the new absolute_import feature. It imports aa. A module named aa.py exists in the a.py‘s directory (aaa) and in the site-packages directory. Without absolute_import the local aa.py would have been imported (aaa/a.py), but the “absolute” aa.py in site-packages is imported instead. Here is the output of running import_test.py:

aaa/__init__ hereaaa/a hereaa here

If I comment out the __future__ line the local aaa/aa.py module will be imported from aaa.a.py:

aaa/__init__ hereaaa/a hereaaa/aa here

What if you want to import both the local aa and the absolute aa? Prior to Python 2.5 you would have had to play tricks and dynamically modify your sys.path (and hopefully remember to restore it afterwards). With Python 2.5 you can use the new dot notation:

aaa/a.py---------from __future__ import absolute_importprint r'aaa/a here'import aafrom . import aa

Output (of import_test.py):

import_test hereaaa/__init__ hereaaa/a hereaa hereaaa/aa here

The ‘.’ allows you to import from the current directory. Double dot? ‘..’ ?can be used to import from a parent package in a relative path notation.

There is one caveat. The relative import syntax works inside packages only. If you try to use it in a main module you will get the following exception:

ValueError: Attempted relative import in non-package

The ‘__index__’ Method
Slicing is an operation performed on sequences that allows you to extract a subset of the element. The syntax is: sequence[start:stop:step]. ‘start‘ is mandatory, ‘stop‘ defaults to the end of the sequence, and ‘step‘ defaults to 1. When you slice a sequence, Python starts from the start index and returns another sequence (same type as original) that contains all the elements between ‘start‘ and ‘stop‘ in increments of ‘step‘.

You can use a negative number to count from the end of the sequence too. The step may also be negative, but in this case the start index must be bigger than the stop index resulting in a reverse slice. This used to be the only way to reverse a sequence before the reversed() built-in function was introduced in Python 2.4 (yes, you get some history for the same price).

Now let’s break some bread and slice it too.

# prepare a list called bread with 10 integers bread = range(1,11)print bread# plain sliceprint bread[1:10:2]# slice using negative indicesprint bread[-9:-7]# old way of reversing a sequenceprint bread[::-1]

Output:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10][2, 4, 6, 8, 10][2, 3][10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

The indices for start, stop, and step used to be integers or long integers only. This is fine for almost everybody. Why would you want to index into a collection using a different type? You wouldn’t. After all, the meaning of an index is a specific location inside the sequence, and locations are always integers. However, NumPy, which is the leading Python scientific computing package, requires it. NumPy is a Python extension that provides a lightning fast multi-dimensional array and various functions, linear algebra operations, and transformations to act on it.

I can hear you thinking: “What’s the big deal about arrays? Didn’t we have them back in the day in BASIC for the Dragon32?”. Well, you didn’t have THAT kind of array. Multi-dimensional arrays (tensors) are a crucial building block for many scientific computations. NumPy is a very important and influential package that single-handedly made Python a great success in the scientific community. As evidence of its importance, NumPy is slated for inclusion in the standard Python library at some point.

NumPy uses its own data types (remember the ctypes data types?) to represent integers with higher fidelity than Python’s native int and long. These types were not usable for slicing, which is very common in NumPy. The most viable solution was to allow arbitrary types to be used as slicing indices if they define an __index__ method whose return value is int or long. In the following code I defined a few classes with __index__ methods that I use to dice and slice a poor ‘bread.’

class One(object):    def __index__(self):        return 1class Two(object):    def __index__(self):        return 2class Ten(object):    def __index__(self):        return 10print bread[One():Ten():Two()]one = One()two = Two()ten = Ten()print x[one:ten:two]

Output:

[2, 4, 6, 8, 10][2, 4, 6, 8, 10]

My Name Is __missing__, dict.__missing__
The dict __missing__ method is a neat addition to the arsenal of useful tools. It addresses a common problem of returning a default value from a failed lookup on a dictionary.

Suppose your program needs to store securely the code names of British secret agents. You are aware of course that these code names all start with double zero and end with a positive integer. After careful analysis of the problem domain you decide to use a 100×100 sparse matrix (a matrix that contains mostly zeros) to store the code names. Your input is a list of tuples. The first and second elements are the row and column (two-dimensional index), and the third element is the integer that follows the mandatory ’00’. You can represent such a matrix using a plain (non-sparse) dictionary:

sparse_matrix = {}for row in range(100):          for col in range(100):                    sparse_matrix[(row,col)] = 0                     for i in (5,4,8), (88, 33, 7), (99,99,9):          sparse_matrix[i[:2]] = i[2]            print '%d%d%d %s' % (sparse_matrix[(1,1)],                     sparse_matrix[(14,61)],                     sparse_matrix[(88,33)],                     'licensed to kill')

Output:

007 licensed to kill

That works, but it’s not very smart or sparse. A huge dictionary of 10,000 entries is required to identify just three agents?and it takes a while to initialize this huge array with zeros. A much better solution is to keep just the non-zero elements. The problem is what to do when someone accesses a zero entry (missing from the dictionary). The dictionary throws a KeyError exception:

Traceback (most recent call last):  File "/Users/gsayfan/Documents/docs/Publications/DevX/Python 2.5 - Fresh from the Oven/part_3.py", line 57, in     print '%d%d%d %s' % (sparse_matrix[(1,1)],KeyError: (1, 1)

There were several cumbersome solutions prior to Python 2.5. All of them required the caller to handle the missing value. One way was to wrap every access to the dictionary in a try-except block; another way was to use the get() method and pass in a default value to return; and the last way was to use the setdefault() method, which is similar to get() but also sets the default value in the dictionary for posterity.

x = {1:1, 2:2, 3:3}# This is just uglytry:    print x[0]except KeyError:    print 8# This just gets the default value without modifying the dictprint x.get(0, 8)print 'x has %d entries' % len(x)# This actually adds the entry 0:8 to the dictprint x.setdefault(0, 8)print 'x has %d entries' % len(x)

Output:

88x has 3 entries8x has 4 entries

In Python 2.5 there is an elegant way to handle this situation. The dict type has a new hook function called __missing__. It is called whenever you try to access a missing key. The default implementation is to raise the infamous KeyError exception, but you can subclass dict and override the __missing__ method in your subclass to do whatever you want. This is much better because the caller is not responsible for handling default values. Sometimes the returned value should be based on dynamic calculation and the caller doesn’t even know what the proper default value is. Note the dict size remains the same even when accessing non-existing elements.

class SparseDict(dict):    def __missing__(self, key):        return 0sparse_matrix = SparseDict()for i in (5,4,3), (88, 33, 7), (99,99,99):    sparse_matrix[i[:2]] = i[2]print '%d%d%d %s' % (sparse_matrix[(1,1)],                     sparse_matrix[(14,61)],                     sparse_matrix[(88,33)],                     'licensed to kill')print len(sparse_matrix)print sparse_matrix

Output:

007 licensed to kill3{(88, 33): 7, (5, 4): 3, (99, 99): 99}

This solution is elegant and allows full flexibility (you even have the requested key to base your return value on, if you want it). Nonetheless, it feels a little intrusive to write a subclass for every dictionary with a default, especially if you have multiple dictionaries with different defaults. Have no fear. Python 2.5 comes with a default dict, which is almost as flexible as implementing __missing__ yourself.

The default dict lives in the collections package, and it accept a default_factory callable in its constructor. Whenever a non-existing key is accessed, the default_factory will be invoked to produce the proper value. Don’t worry, you don’t need to start writing factory classes or functions now. Most of Python’s types are also factory functions and in most cases this is exactly what you want. For example, Python’s int is a factory function that returns 0 when invoked without arguments. This is exactly what we need for our sparse matrix. Note that accessing non-existing entries sets them in the dictionary just like calling setdefault().

import collectionssparse_matrix = collections.defaultdict(int)for i in (5,4,3), (88, 33, 7), (99,99,99):    sparse_matrix[i[:2]] = i[2]print '%d%d%d %s' % (sparse_matrix[(1,1)],                     sparse_matrix[(14,61)],                     sparse_matrix[(88,33)],                     'licensed to kill')print len(sparse_matrix)print sparse_matrix

Output:

007 licensed to kill5defaultdict(, {(88, 33): 7, (5, 4): 3, (99, 99): 99, (14, 61): 0, (1, 1): 0})

More Modules

hashlib
Hashlib is a new module that provides various secure hash algorithms. The supported algorithms (always available) are: MD5, SHA-1, SHA-224, SHA-256, SHA-384, and SHA-512. Other algorithms may be present and you can try to instantiate them. Secure hash algorithms are used for protocols and standards such as SSH, SSL, PGP, TLS, and S/MIME.

Hashlib has a uniform simple interface for all the algorithms and it’s very easy to use. You create a hash object. You call the update() method one or more times to add text. Finally you call the digest() or hexdigest() methods to get the hash value.

import hashlibx = hashlib.sha256()x.update('Yeah, ')x.update('it ')x.update('works!!!')d1 = x.digest()print x.hexdigest()x = hashlib.sha256()x.update('Yeah, it works!!!')d2 = x.digest()print x.hexdigest()assert d1 == d2x = hashlib.sha224()x.update('Yeah, it works!!!')print x.hexdigest()x = hashlib.sha1()x.update('Yeah, it works!!!')print x.hexdigest()x = hashlib.md5()x.update('Yeah, it works!!!')print x.hexdigest()

Output:

d17380061dff0857ad21450c1206feceb3ada7196b8ef8109fb8b460761241b4d17380061dff0857ad21450c1206feceb3ada7196b8ef8109fb8b460761241b43bb9c0cbc9edb898f5eeefad262d1bafa9edf84bf63c2020ca33dab098f74ddd62bcecfa3a63df80f97d6933aedefc1792928a72f3bb2c4069300dcb64492ea0

You can call the update() method with one big string or multiple times with consecutive sub-strings. If the sub-strings add up to the big string you will get the same hash value (from the same algorithm). The hash values differ in the number of bits they return: md5 returns 128 bits, sha-1 returns 160 bits, and the sha-xxx algorithms return xxx bits respectively.

The digest() method returns a raw buffer of bytes that might contain non-printable characters, so I just used the result for comparison. The hexdigest() method returns a stringified hexadecimal representation of the digest value that you may safely print.

If OpenSSL is installed hashlib will bind to it dynamically, and then additional algorithms may be available. You need to use the new() method to access additional algorithms, if present, and pass the algorithm name to new.

Hashlib deprecates the md5 and sha1 modules. These modules were available in earlier versions, and the new hashlib borrows their simple interface. The modules are still available as a backward compatibility gesture, but they actually use hashlib under the covers.

wsgiref
WSGI stands for the Web Server Gateway Interface. It is a standard interface for web servers, web applications, and middleware. The idea is that web applications that comply with WSGI will able to utilize lots of WSGI-compliant middleware components (e.g. authentication, session, compression) and deploy to any WSGI-compliant web server. The WSGI specification is not aimed at the web application developer, but at the web framework developer.

Some history … Python has an enormous number of web frameworks. The (speculative) reason is that it is so easy to write a web framework in Python that people preferred to roll their own than to use an existing one. Existing frameworks were often incomplete, not well documented, and targeted at the specific needs of some other developer. There is an ongoing debate in the community whether this proliferation is beneficial.

In the last year, this debate grew more intense as Ruby on Rails blazed new trails and the Python community got nervous. By comparison to Rails, Python’s babel tower of web frameworks looked like a bad idea. There were various proposals to unify web frameworks or to pick one web framework.

In the end, two web frameworks emerged as de facto leaders: DJango and TurboGears. (It is debatable whether these are really the leading Python web frameworks, but they are definitely the only two with a book.)

Editor’s Note: The author is a co-author of the TurboGears book, but he does not earn royalties.

Back to WSGI, the fragmentation of the Python web framework scene worried a few people including Philip J. Eby. Eby, a serious mover and shaker in the Python community, is known for his PEAK initiative, which was supposed to provide a pythonic J2EE. Somewhere along the way PEAK started to split and spin off important standalone projects and other ideas such as generic functions and setuptools. Eby decided to do something about the web framework situation and wrote Python Enhancement Proposal (PEP)-333, “Python Web Server Gateway Interface” v1.0 and followed up with a reference implementation called (you guessed it) wsgiref.

The core of wsgiref is so simple that you can write a fully functioning web application in a few lines of code (I’ll provide it soon) that you can effortlessly deploy on any WSGI-compliant server with any WSGI middleware. Before I start showcasing wsgiref, I want to stress that you SHOULD NOT develop web applications from scratch. It is very simple and possible, but there is no need. There are lots of excellent Python web frameworks out there and they all support WSGI, so go ahead and use them for real projects.

Now I’ll get down to writing some code. A WSGI web application is callable (i.e. a function, a class constructor, or any object with a __call__ method). That’s it. You pass this callable to a WSGI-compliant server and that’s your deployment. WSGI is based on HTTP’s request-response model. Whenever a request comes in the server will recognize your application as callable and pass two arguments: the environment and the start_response callable. In your code you can query the environment that contains the request’s path (URL), the HTTP headers’ query parameters, and other relevant data. You call the start_response callable and pass the response headers and status; then you return the response body as a list of strings. It’s really simple.

I’m a very creative guy, so when I thought about a cool web application a “Quote of the Day” immediately jumped to mind. I carefully Googled it to make sure no one thought about it before me, and I was immediately rewarded with 134,000,000 results :-). Being strong-willed I decided to keep going with the original plan. My QOTD web application is highly sophisticated and chockfull of buzzwords. It has a dynamic back-end web service that aggregates an RSS feed from another web application (http://brainyquote.com), parses the RSS using ElementTree, extracts the quotes of the day, and stores the quotes in a lightning fast in-memory database (a simple Python list). When a request comes in the QOTD web application selects a random quote, formats it in the following format: once said… and returns it to the caller. The full code consists of 10 lines of code + three lines of import statements.

I start by importing all the necessary modules. The quotes list is initialized to the empty list. The qotd_app function is the actual web application callable (yes, three lines of code). It gets a random quote from the quotes “database” (the quotes list will already be populated by the time qotd_app is called for the first time). It calls start_response with the ok status and a content type HTTP header of text/html. Finally, it returns the body of the response, which is the quote itself wrapped in a minimal HTML markup.

The code after the function definition is the main initialization code. It downloads the QOTD RSS feed using urllib2.urlopen. It proceeds to parse it using ElementTree.XML and finds all the elements in the feed called . The relevant information in each item is the famous person and her/his quote text. These are the </span> and <span class="pf"><description></span> sub-elements of <span class="pf"><item></span>. It formats the quote into the ‘once said…’ format and appends it to the quotes list. The next thing is to start the WSGI-compliant server and pass it the <span class="pf">qotd_app</span> function. The server will listen on port 8888. </p> <p>To test it save the code to a Python file and run it, then browse with your favorite browser to http://localhost:8888 and check out the pearls of wisdom it will emit. Every refresh will bring a new random quote from the list. The code is shown in <a href="javascript:showSupportItem('listing1');">Listing 1</a>. </p> <p>WSGI web applications are cool but not really useful in professional applications. Besides WSGI web applications there are two other pieces to WSGI: web servers and middleware. You probably don’t want to write a new web server, but if you are serious about WSGI you’d do well to investigate the WSGI middleware path. These are components that sit between the web application and web server. You can compose them freely and, because they all expose the same callable API, you can wrap any web application with multiple WSGI middleware. </p> <p><strong>Optimizations and Internal Changes</strong><br />Python is not the fastest language out there. Most of the time it’s fast enough. If you need more performance you can write performance critical code in C or C++ extensions and call it from Python. Nevertheless, sometimes you will wish Python was a little faster so you can develop more applications in pure Python. Your wish is the Python developers command. Python 2.5 introduces multiple performance enhancements.</p> <p><em>Py_ssize_t as index</em><br />Python used to store various counts in a variable of the C type int. This is a 32-bit type, which meant that lists or tuples couldn’t have more than 2,147,483,647 bits. On 32-bit systems you couldn’t fit more than that in the entire 32-bit addressable memory. On 64-bit systems you have much more addressable memory, so this number isn’t so big anymore. </p> <p>Python 2.5 uses the 64-bit Py_ssoze_t typedef for indices and counts, which allows you to fully utilize the memory of 64-bit systems. This change affects mostly C extension writers. Read <a href='http://www.python.org/dev/peps/pep-0353/' target='_blank'>PEP- 353</a> if you want all the gory details.</p> <p><strong>Memory Functions</strong><br />Python as a runtime virtual machine does a lot of memory management on behalf of your code. Small objects are allocated in 256KB arenas. When you allocate a small object of any size the memory will either be allocated from an existing arena with available space or from a new 256KB arena.. This arrangement allows you to amortize the cost of frequent memory allocations at the cost of inconsistent allocation time. This is a reasonable tradeoff for a language like Python. Nevertheless, Python 2.4 never released empty arenas. Thus, if, in the beginning of your program, you allocated lots of small objects and then your program switched to a state that used a small number of objects, all the arenas that were allocated initially just sat there and hogged memory. Python 2.5 addresses this issue: Empty arenas are de-allocated and the memory is returned to the operating system.</p> <p>This change resulted in different types of memory functions in the Python C API. Prior to Python 2.5 the various memory function families were all reduced to the system malloc. Now, some functions use obmalloc and some use the plain malloc. This means that it is important to free memory using the correct function. This should concern only extension writers.</p> <p><strong>The Need for Speed Sprint</strong><br />The <a href='http://wiki.python.org/moin/NeedForSpeed/Successes' target='_blank'>NeedForSpeed sprint</a> it was a privately sponsored event that took place from May 21 to 28, 2006, in Reykjavik, Iceland. Several prominent Python hackers were flown in and spent a week improving Python’s performance. The results were integrated into Python 2.5. The major successes were significant improvements to repeated function calls (by caching the associated frame object), huge gains in string performance and string to int conversions, reduced interpreter startup time, and faster exceptions. The event produced several orders of magnitude performance improvements! </p> <table align="center" width="95%" border="1" cellpadding="3" style="font-family: Verdana, Arial, Helvetica, Sans-Serif; font-size: x-small; color: red; background: white"> <tr> <td>Author’s Note: The order of magnitude improvements apply to Psyco only; Psyco is a dynamic just-in-time compiler. Psyco is not part of standard Python and it doesn’t work on Mac, so the orders of magnitude performance improvements should refer to Psyco only. </td> </tr> </table> <p><strong>Metadata for Python packages</strong><br />The only chink in Python’s armor is its relatively weak support for installation, deployment, and updates of large systems with many dependencies. It might not be important for the typical utility or administration script, but Python is used more and more for developing large-scale systems. The distutils module is the official way of creating and distributing Python packages. It is based on a set up script that can create source and binary distributions, including metadata, for different platforms. Until Python 2.5 it lacked any notion of dependency between packages. </p> <p>Python 2.5 added a few metadata fields (based on PEP-314): ‘requires’, ‘obsoletes,’ and ‘download_url’. Python also has an online repository for packages called the <a href='http://cheeseshop.python.org/pypi' target='_blank'>cheeseshop</a> , which contains an index of downloadable packages. Unfortunately, it seems the new metadata fields don’t really solve the dependency issues because there is no semantics attached to these fields and no tool support.</p> <p>Python’s salvation may be the <a href='http://peak.telecommunity.com/DevCenter/setuptools' target='_blank'>setuptools project</a> , again by the prolific Philip J. Eby. This project aims to enhance the distutils module and be compatible with it. It is the de facto standard for distributing and installing Python packages. It is at version 0.6c3 and quite usable, but it’s not perfect yet.</p> <p><strong>Balance and Traction</strong><br />Python 2.5 is a mostly backward compatible and balanced release. It introduced multiple language enhancements, several new and improved modules in the standard library, and lots of performance enhancements. Best of all, it created healthy traction and innovation without disrupting its growing user base. </p> <p>Python is well poised to target larger and more complicated systems, while preserving its essential simplicity and the friendliness that attracted so many developers in the first place.</p> <p> <!-- MOLONGUI AUTHORSHIP PLUGIN 5.1.0 --> <!-- https://www.molongui.com/wordpress-plugin-post-authors --> <div class="molongui-clearfix"></div><div class="m-a-box " data-box-layout="slim" data-box-position="below" data-multiauthor="false" data-author-id="1" data-author-type="user" data-author-archived=""><div class="m-a-box-container"><div class="m-a-box-tab m-a-box-content m-a-box-profile" data-profile-layout="layout-1" data-author-ref="user-1" itemscope itemid="https://www.devx.com/author/devx-admin/" itemtype="https://schema.org/Person"><div class="m-a-box-content-top"></div><div class="m-a-box-content-middle"><div class="m-a-box-item m-a-box-avatar" data-source="local"><a class="m-a-box-avatar-url" href="https://www.devx.com/author/devx-admin/"><img alt='' src='https://secure.gravatar.com/avatar/31090e436d407f8356b48602d9147a71655425f30edb3b141a3d14e4ef58d949?s=150&d=mp&r=g' srcset='https://secure.gravatar.com/avatar/31090e436d407f8356b48602d9147a71655425f30edb3b141a3d14e4ef58d949?s=300&d=mp&r=g 2x' class='avatar avatar-150 photo' height='150' width='150' itemprop= "image"/></a></div><div class="m-a-box-item m-a-box-data"><div class="m-a-box-name m-a-box-title"><h5 itemprop="name"><a class="m-a-box-name-url " href="https://www.devx.com/author/devx-admin/" itemprop="url"> Charlie Frank</a></h5></div><div class="m-a-box-bio" itemprop="description"><p>Charlie has over a decade of experience in website administration and technology management. As the site admin, he oversees all technical aspects of running a high-traffic online platform, ensuring optimal performance, security, and user experience.</p></div></div></div><div class="m-a-box-content-bottom"></div></div></div></div><style> .lwrp.link-whisper-related-posts{ } .lwrp .lwrp-title{ }.lwrp .lwrp-description{ } .lwrp .lwrp-list-container{ } .lwrp .lwrp-list-multi-container{ display: flex; } .lwrp .lwrp-list-double{ width: 48%; } .lwrp .lwrp-list-triple{ width: 32%; } .lwrp .lwrp-list-row-container{ display: flex; justify-content: space-between; } .lwrp .lwrp-list-row-container .lwrp-list-item{ width: calc(20% - 20px); } .lwrp .lwrp-list-item:not(.lwrp-no-posts-message-item){ } .lwrp .lwrp-list-item img{ max-width: 100%; height: auto; object-fit: cover; aspect-ratio: 1 / 1; } .lwrp .lwrp-list-item.lwrp-empty-list-item{ background: initial !important; } .lwrp .lwrp-list-item .lwrp-list-link .lwrp-list-link-title-text, .lwrp .lwrp-list-item .lwrp-list-no-posts-message{ }@media screen and (max-width: 480px) { .lwrp.link-whisper-related-posts{ } .lwrp .lwrp-title{ }.lwrp .lwrp-description{ } .lwrp .lwrp-list-multi-container{ flex-direction: column; } .lwrp .lwrp-list-multi-container ul.lwrp-list{ margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; } .lwrp .lwrp-list-double, .lwrp .lwrp-list-triple{ width: 100%; } .lwrp .lwrp-list-row-container{ justify-content: initial; flex-direction: column; } .lwrp .lwrp-list-row-container .lwrp-list-item{ width: 100%; } .lwrp .lwrp-list-item:not(.lwrp-no-posts-message-item){ } .lwrp .lwrp-list-item .lwrp-list-link .lwrp-list-link-title-text, .lwrp .lwrp-list-item .lwrp-list-no-posts-message{ }; }</style> <div id="link-whisper-related-posts-widget" class="link-whisper-related-posts lwrp"> <h2 class="lwrp-title">Related Posts</h2> <div class="lwrp-list-container"> <ul class="lwrp-list lwrp-list-single"> <li class="lwrp-list-item"><a href="https://www.devx.com/news/sonos-ace-headphones-review-impressive-audio-quality/" class="lwrp-list-link"><span class="lwrp-list-link-title-text">Sonos Ace headphones review: impressive audio quality</span></a></li><li class="lwrp-list-item"><a href="https://www.devx.com/news/federal-judge-rules-against-google-in-antitrust-case/" class="lwrp-list-link"><span class="lwrp-list-link-title-text">Federal judge rules against Google in antitrust case</span></a></li><li class="lwrp-list-item"><a href="https://www.devx.com/news/ai-assisted-dentistry-eases-patient-anxiety-enhances-care/" class="lwrp-list-link"><span class="lwrp-list-link-title-text">AI-Assisted Dentistry Eases Patient Anxiety, Enhances Care</span></a></li><li class="lwrp-list-item"><a href="https://www.devx.com/news/new-cram-hardware-slashes-ai-energy-use/" class="lwrp-list-link"><span class="lwrp-list-link-title-text">New CRAM hardware slashes AI energy use</span></a></li><li class="lwrp-list-item"><a href="https://www.devx.com/java/creating-a-immutable-list-via-jdk-9/" class="lwrp-list-link"><span class="lwrp-list-link-title-text">Creating an Immutable List via JDK 9</span></a></li> </ul> </div> </div> </div> </div> <div class="elementor-element elementor-element-9809e6b elementor-align-right elementor-widget elementor-widget-button" data-id="9809e6b" data-element_type="widget" data-widget_type="button.default"> <div class="elementor-widget-container"> <div class="elementor-button-wrapper"> <a class="elementor-button elementor-button-link elementor-size-sm" href="https://www.devx.com/disclosure/"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-icon elementor-align-icon-left"> <i aria-hidden="true" class="far fa-money-bill-alt"></i> </span> <span class="elementor-button-text">Disclosure</span> </span> </a> </div> </div> </div> <div class="elementor-element elementor-element-b24b1f0 elementor-widget elementor-widget-heading" data-id="b24b1f0" data-element_type="widget" data-widget_type="heading.default"> <div class="elementor-widget-container"> <h2 class="elementor-heading-title elementor-size-default">About Our Editorial Process</h2> </div> </div> </div> </div> </div> </section> <div class="elementor-element elementor-element-bf49e8d elementor-widget elementor-widget-text-editor" data-id="bf49e8d" data-element_type="widget" data-widget_type="text-editor.default"> <div class="elementor-widget-container"> <style>/*! elementor - v3.20.0 - 10-04-2024 */ .elementor-widget-text-editor.elementor-drop-cap-view-stacked .elementor-drop-cap{background-color:#69727d;color:#fff}.elementor-widget-text-editor.elementor-drop-cap-view-framed .elementor-drop-cap{color:#69727d;border:3px solid;background-color:transparent}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap{margin-top:8px}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap-letter{width:1em;height:1em}.elementor-widget-text-editor .elementor-drop-cap{float:left;text-align:center;line-height:1;font-size:50px}.elementor-widget-text-editor .elementor-drop-cap-letter{display:inline-block}</style> <p>At DevX, we’re dedicated to tech entrepreneurship. Our team closely follows industry shifts, new products, AI breakthroughs, technology trends, and funding announcements. Articles undergo thorough editing to ensure accuracy and clarity, reflecting DevX’s style and supporting entrepreneurs in the tech sphere.</p><p>See our full <a href="https://www.devx.com/publication-guidelines/">editorial policy</a>.</p> </div> </div> <div class="elementor-element elementor-element-39bd7056 elementor-grid-1 elementor-posts--thumbnail-left elementor-grid-tablet-1 elementor-grid-mobile-1 load-more-align-center elementor-widget elementor-widget-posts" data-id="39bd7056" data-element_type="widget" data-settings="{"classic_columns":"1","classic_row_gap":{"unit":"px","size":0,"sizes":[]},"pagination_type":"load_more_on_click","classic_columns_tablet":"1","classic_columns_mobile":"1","classic_row_gap_tablet":{"unit":"px","size":"","sizes":[]},"classic_row_gap_mobile":{"unit":"px","size":"","sizes":[]},"load_more_spinner":{"value":"fas fa-spinner","library":"fa-solid"}}" data-widget_type="posts.classic"> <div class="elementor-widget-container"> <link rel="stylesheet" href="https://www.devx.com/wp-content/plugins/elementor-pro/assets/css/widget-posts.min.css"> <div class="elementor-posts-container elementor-posts elementor-posts--skin-classic elementor-grid"> <article class="elementor-post elementor-grid-item post-84982 post type-post status-publish format-standard has-post-thumbnail hentry category-technology"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/technology/6-signals-your-system-is-sliding-into-operational-drift/" > <div class="elementor-post__thumbnail"><img width="300" height="200" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="elementor-animation-grow attachment-medium size-medium wp-image-84984 ewww_webp" alt="6 Signals Your System Is Sliding Into Operational Drift" data-src-img="https://www.devx.com/wp-content/uploads/6-signals-your-system-is-sliding-into-operational-drift-300x200.jpg" data-src-webp="https://www.devx.com/wp-content/uploads/6-signals-your-system-is-sliding-into-operational-drift-300x200.jpg.webp" data-eio="j" /><noscript><img width="300" height="200" src="https://www.devx.com/wp-content/uploads/6-signals-your-system-is-sliding-into-operational-drift-300x200.jpg" class="elementor-animation-grow attachment-medium size-medium wp-image-84984" alt="6 Signals Your System Is Sliding Into Operational Drift" /></noscript></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/technology/6-signals-your-system-is-sliding-into-operational-drift/" > 6 Signals Your System Is Sliding Into Operational Drift </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-author"> Steve Gickling </span> <span class="elementor-post-date"> March 5, 2026 </span> <span class="elementor-post-time"> 4:56 PM </span> </div> </div> </article> <article class="elementor-post elementor-grid-item post-84976 post type-post status-publish format-standard has-post-thumbnail hentry category-technology"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/technology/six-reasons-your-ai-prototype-fails-in-production/" > <div class="elementor-post__thumbnail"><img width="300" height="200" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="elementor-animation-grow attachment-medium size-medium wp-image-84979 ewww_webp" alt="Six Reasons Your AI Prototype Fails in Production" data-src-img="https://www.devx.com/wp-content/uploads/six-reasons-your-ai-prototype-fails-in-production-300x200.jpg" data-src-webp="https://www.devx.com/wp-content/uploads/six-reasons-your-ai-prototype-fails-in-production-300x200.jpg.webp" data-eio="j" /><noscript><img width="300" height="200" src="https://www.devx.com/wp-content/uploads/six-reasons-your-ai-prototype-fails-in-production-300x200.jpg" class="elementor-animation-grow attachment-medium size-medium wp-image-84979" alt="Six Reasons Your AI Prototype Fails in Production" /></noscript></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/technology/six-reasons-your-ai-prototype-fails-in-production/" > Six Reasons Your AI Prototype Fails in Production </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-author"> Rashan Dixon </span> <span class="elementor-post-date"> March 5, 2026 </span> <span class="elementor-post-time"> 4:46 PM </span> </div> </div> </article> <article class="elementor-post elementor-grid-item post-84971 post type-post status-publish format-standard has-post-thumbnail hentry category-technology"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/technology/7-early-signs-your-ai-guardrails-wont-hold-in-production/" > <div class="elementor-post__thumbnail"><img width="300" height="188" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="elementor-animation-grow attachment-medium size-medium wp-image-84974 ewww_webp" alt="7 Early Signs Your AI Guardrails Won’t Hold in Production" data-src-img="https://www.devx.com/wp-content/uploads/7-early-signs-your-ai-guardrails-wont-hold-in-production-300x188.jpg" data-src-webp="https://www.devx.com/wp-content/uploads/7-early-signs-your-ai-guardrails-wont-hold-in-production-300x188.jpg.webp" data-eio="j" /><noscript><img width="300" height="188" src="https://www.devx.com/wp-content/uploads/7-early-signs-your-ai-guardrails-wont-hold-in-production-300x188.jpg" class="elementor-animation-grow attachment-medium size-medium wp-image-84974" alt="7 Early Signs Your AI Guardrails Won’t Hold in Production" /></noscript></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/technology/7-early-signs-your-ai-guardrails-wont-hold-in-production/" > 7 Early Signs Your AI Guardrails Won’t Hold in Production </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-author"> Kirstie Sands </span> <span class="elementor-post-date"> March 5, 2026 </span> <span class="elementor-post-time"> 4:37 PM </span> </div> </div> </article> <article class="elementor-post elementor-grid-item post-84965 post type-post status-publish format-standard has-post-thumbnail hentry category-technology"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/technology/how-to-scale-search-infrastructure-for-high-query-volumes/" > <div class="elementor-post__thumbnail"><img width="200" height="300" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="elementor-animation-grow attachment-medium size-medium wp-image-84968 ewww_webp" alt="How to Scale Search Infrastructure for High-Query Volumes" data-src-img="https://www.devx.com/wp-content/uploads/how-to-scale-search-infrastructure-for-high-query-volumes-200x300.jpg" data-src-webp="https://www.devx.com/wp-content/uploads/how-to-scale-search-infrastructure-for-high-query-volumes-200x300.jpg.webp" data-eio="j" /><noscript><img width="200" height="300" src="https://www.devx.com/wp-content/uploads/how-to-scale-search-infrastructure-for-high-query-volumes-200x300.jpg" class="elementor-animation-grow attachment-medium size-medium wp-image-84968" alt="How to Scale Search Infrastructure for High-Query Volumes" /></noscript></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/technology/how-to-scale-search-infrastructure-for-high-query-volumes/" > How to Scale Search Infrastructure for High-Query Volumes </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-author"> Sumit Kumar </span> <span class="elementor-post-date"> March 5, 2026 </span> <span class="elementor-post-time"> 4:21 PM </span> </div> </div> </article> <article class="elementor-post elementor-grid-item post-84959 post type-post status-publish format-standard has-post-thumbnail hentry category-enterprise-zone"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/enterprise-zone/technical-influence-vs-authority-in-engineering-teams/" > <div class="elementor-post__thumbnail"><img width="300" height="169" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="elementor-animation-grow attachment-medium size-medium wp-image-84962 ewww_webp" alt="Technical Influence vs Authority in Engineering Teams" data-src-img="https://www.devx.com/wp-content/uploads/rik-i9rxpao-300x169.jpg" data-src-webp="https://www.devx.com/wp-content/uploads/rik-i9rxpao-300x169.jpg.webp" data-eio="j" /><noscript><img width="300" height="169" src="https://www.devx.com/wp-content/uploads/rik-i9rxpao-300x169.jpg" class="elementor-animation-grow attachment-medium size-medium wp-image-84962" alt="Technical Influence vs Authority in Engineering Teams" /></noscript></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/enterprise-zone/technical-influence-vs-authority-in-engineering-teams/" > Technical Influence vs Authority in Engineering Teams </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-author"> Steve Gickling </span> <span class="elementor-post-date"> March 5, 2026 </span> <span class="elementor-post-time"> 4:09 PM </span> </div> </div> </article> <article class="elementor-post elementor-grid-item post-84905 post type-post status-publish format-standard has-post-thumbnail hentry category-daily-news"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/daily-news/optical-links-challenge-copper-in-data-centers/" > <div class="elementor-post__thumbnail"><img width="300" height="169" src="https://www.devx.com/wp-content/uploads/optical_links_challenge_copper_data_centers-1772637670-300x169.webp" class="elementor-animation-grow attachment-medium size-medium wp-image-84904" alt="optical links challenge copper data centers" /></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/daily-news/optical-links-challenge-copper-in-data-centers/" > Optical Links Challenge Copper In Data Centers </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-author"> Rashan Dixon </span> <span class="elementor-post-date"> March 5, 2026 </span> <span class="elementor-post-time"> 3:48 PM </span> </div> </div> </article> <article class="elementor-post elementor-grid-item post-84911 post type-post status-publish format-standard has-post-thumbnail hentry category-daily-news"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/daily-news/empathy-guides-rosalyn-engelmans-partnership/" > <div class="elementor-post__thumbnail"><img width="300" height="169" src="https://www.devx.com/wp-content/uploads/empathy_guides_rosalyn_engelmans_partnership-1772638171-300x169.webp" class="elementor-animation-grow attachment-medium size-medium wp-image-84910" alt="empathy guides rosalyn engelmans partnership" /></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/daily-news/empathy-guides-rosalyn-engelmans-partnership/" > Empathy Guides Rosalyn Engelman’s Partnership </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-author"> Rashan Dixon </span> <span class="elementor-post-date"> March 5, 2026 </span> <span class="elementor-post-time"> 3:25 PM </span> </div> </div> </article> <article class="elementor-post elementor-grid-item post-84909 post type-post status-publish format-standard has-post-thumbnail hentry category-daily-news"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/daily-news/apple-m5-chips-target-on-device-ai/" > <div class="elementor-post__thumbnail"><img width="300" height="169" src="https://www.devx.com/wp-content/uploads/apple_m5_chips_on_device_ai-1772638115-300x169.webp" class="elementor-animation-grow attachment-medium size-medium wp-image-84908" alt="apple m5 chips on device ai" /></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/daily-news/apple-m5-chips-target-on-device-ai/" > Apple M5 Chips Target On-Device AI </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-author"> Sumit Kumar </span> <span class="elementor-post-date"> March 5, 2026 </span> <span class="elementor-post-time"> 2:41 PM </span> </div> </div> </article> <article class="elementor-post elementor-grid-item post-84907 post type-post status-publish format-standard has-post-thumbnail hentry category-daily-news"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/daily-news/sophia-space-raises-10-million-seed/" > <div class="elementor-post__thumbnail"><img width="300" height="169" src="https://www.devx.com/wp-content/uploads/sophia_space_raises_ten_million_seed-1772637991-300x169.webp" class="elementor-animation-grow attachment-medium size-medium wp-image-84906" alt="sophia space raises ten million seed" /></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/daily-news/sophia-space-raises-10-million-seed/" > Sophia Space Raises $10 Million Seed </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-author"> Steve Gickling </span> <span class="elementor-post-date"> March 5, 2026 </span> <span class="elementor-post-time"> 2:29 PM </span> </div> </div> </article> <article class="elementor-post elementor-grid-item post-84913 post type-post status-publish format-standard has-post-thumbnail hentry category-daily-news"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/daily-news/charles-payne-hosts-investor-town-hall/" > <div class="elementor-post__thumbnail"><img width="300" height="169" src="https://www.devx.com/wp-content/uploads/charles_payne_investor_town_hall-1772638285-300x169.webp" class="elementor-animation-grow attachment-medium size-medium wp-image-84912" alt="charles payne investor town hall" /></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/daily-news/charles-payne-hosts-investor-town-hall/" > Charles Payne Hosts Investor Town Hall </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-author"> Kirstie Sands </span> <span class="elementor-post-date"> March 5, 2026 </span> <span class="elementor-post-time"> 2:16 PM </span> </div> </div> </article> <article class="elementor-post elementor-grid-item post-84901 post type-post status-publish format-standard has-post-thumbnail hentry category-daily-news"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/daily-news/xiaomi-highlights-new-tech-at-mwc/" > <div class="elementor-post__thumbnail"><img width="300" height="169" src="https://www.devx.com/wp-content/uploads/xiaomi_showcases_innovations_mobile_world_congress-1772634501-300x169.webp" class="elementor-animation-grow attachment-medium size-medium wp-image-84900" alt="xiaomi showcases innovations mobile world congress" /></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/daily-news/xiaomi-highlights-new-tech-at-mwc/" > Xiaomi Highlights New Tech At MWC </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-author"> Steve Gickling </span> <span class="elementor-post-date"> March 5, 2026 </span> <span class="elementor-post-time"> 2:13 PM </span> </div> </div> </article> <article class="elementor-post elementor-grid-item post-84915 post type-post status-publish format-standard has-post-thumbnail hentry category-daily-news"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/daily-news/berkshire-hathaway-q4-profit-falls-nearly-30-percent/" > <div class="elementor-post__thumbnail"><img width="300" height="169" src="https://www.devx.com/wp-content/uploads/berkshire_hathaway_q4_profit_falls-1772638358-300x169.webp" class="elementor-animation-grow attachment-medium size-medium wp-image-84914" alt="berkshire hathaway q4 profit falls" /></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/daily-news/berkshire-hathaway-q4-profit-falls-nearly-30-percent/" > Berkshire Hathaway Q4 Profit Falls Nearly 30 Percent </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-author"> Deanna Ritchie </span> <span class="elementor-post-date"> March 5, 2026 </span> <span class="elementor-post-time"> 2:04 PM </span> </div> </div> </article> <article class="elementor-post elementor-grid-item post-84903 post type-post status-publish format-standard has-post-thumbnail hentry category-daily-news"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/daily-news/amazon-debuts-ai-dynamic-canvas-for-sellers/" > <div class="elementor-post__thumbnail"><img width="300" height="169" src="https://www.devx.com/wp-content/uploads/amazon_ai_dynamic_canvas_sellers-1772636770-300x169.webp" class="elementor-animation-grow attachment-medium size-medium wp-image-84902" alt="amazon ai dynamic canvas sellers" /></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/daily-news/amazon-debuts-ai-dynamic-canvas-for-sellers/" > Amazon Debuts AI Dynamic Canvas for Sellers </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-author"> Sumit Kumar </span> <span class="elementor-post-date"> March 5, 2026 </span> <span class="elementor-post-time"> 9:13 AM </span> </div> </div> </article> <article class="elementor-post elementor-grid-item post-84899 post type-post status-publish format-standard has-post-thumbnail hentry category-daily-news"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/daily-news/phones-are-ready-for-serious-offline-ai/" > <div class="elementor-post__thumbnail"><img width="300" height="200" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="elementor-animation-grow attachment-medium size-medium wp-image-23374 ewww_webp" alt="" data-src-img="https://www.devx.com/wp-content/uploads/2022/02/thumbnail.jpg" data-src-webp="https://www.devx.com/wp-content/uploads/2022/02/thumbnail.jpg.webp" data-eio="j" /><noscript><img width="300" height="200" src="https://www.devx.com/wp-content/uploads/2022/02/thumbnail.jpg" class="elementor-animation-grow attachment-medium size-medium wp-image-23374" alt="" /></noscript></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/daily-news/phones-are-ready-for-serious-offline-ai/" > Phones Are Ready For Serious Offline AI </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-author"> Joe Rothwell </span> <span class="elementor-post-date"> March 5, 2026 </span> <span class="elementor-post-time"> 8:10 AM </span> </div> </div> </article> <article class="elementor-post elementor-grid-item post-84926 post type-post status-publish format-standard has-post-thumbnail hentry category-technology"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/technology/4-architectural-decisions-that-shape-reliable-rag-systems/" > <div class="elementor-post__thumbnail"><img width="240" height="300" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="elementor-animation-grow attachment-medium size-medium wp-image-84929 ewww_webp" alt="4 Architectural Decisions That Shape Reliable RAG Systems" data-src-img="https://www.devx.com/wp-content/uploads/4-architectural-decisions-that-shape-reliable-rag-systems-240x300.jpg" data-src-webp="https://www.devx.com/wp-content/uploads/4-architectural-decisions-that-shape-reliable-rag-systems-240x300.jpg.webp" data-eio="j" /><noscript><img width="240" height="300" src="https://www.devx.com/wp-content/uploads/4-architectural-decisions-that-shape-reliable-rag-systems-240x300.jpg" class="elementor-animation-grow attachment-medium size-medium wp-image-84929" alt="4 Architectural Decisions That Shape Reliable RAG Systems" /></noscript></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/technology/4-architectural-decisions-that-shape-reliable-rag-systems/" > 4 Architectural Decisions That Shape Reliable RAG Systems </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-author"> Rashan Dixon </span> <span class="elementor-post-date"> March 4, 2026 </span> <span class="elementor-post-time"> 4:47 PM </span> </div> </div> </article> <article class="elementor-post elementor-grid-item post-84814 post type-post status-publish format-standard has-post-thumbnail hentry category-daily-news"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/daily-news/openai-chair-sees-ai-reshaping-work/" > <div class="elementor-post__thumbnail"><img width="300" height="169" src="https://www.devx.com/wp-content/uploads/openai_chair_discusses_workplace_transformation-1772550322-300x169.webp" class="elementor-animation-grow attachment-medium size-medium wp-image-84813" alt="openai chair discusses workplace transformation" /></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/daily-news/openai-chair-sees-ai-reshaping-work/" > OpenAI Chair Sees AI Reshaping Work </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-author"> Sumit Kumar </span> <span class="elementor-post-date"> March 4, 2026 </span> <span class="elementor-post-time"> 1:21 PM </span> </div> </div> </article> <article class="elementor-post elementor-grid-item post-84803 post type-post status-publish format-standard has-post-thumbnail hentry category-daily-news"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/daily-news/venezuelan-oil-rebranded-as-brazilian-to-china/" > <div class="elementor-post__thumbnail"><img width="300" height="169" src="https://www.devx.com/wp-content/uploads/venezuelan_oil_rebranded_as_brazilian-1772548091-300x169.webp" class="elementor-animation-grow attachment-medium size-medium wp-image-84802" alt="venezuelan oil rebranded as brazilian" /></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/daily-news/venezuelan-oil-rebranded-as-brazilian-to-china/" > Venezuelan Oil Rebranded As Brazilian To China </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-author"> Steve Gickling </span> <span class="elementor-post-date"> March 4, 2026 </span> <span class="elementor-post-time"> 1:05 PM </span> </div> </div> </article> <article class="elementor-post elementor-grid-item post-84820 post type-post status-publish format-standard has-post-thumbnail hentry category-daily-news"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/daily-news/openai-defends-safeguards-in-defense-deal/" > <div class="elementor-post__thumbnail"><img width="300" height="169" src="https://www.devx.com/wp-content/uploads/openai_defends_defense_deal_safeguards-1772551482-300x169.webp" class="elementor-animation-grow attachment-medium size-medium wp-image-84819" alt="openai defends defense deal safeguards" /></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/daily-news/openai-defends-safeguards-in-defense-deal/" > OpenAI Defends Safeguards In Defense Deal </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-author"> Sumit Kumar </span> <span class="elementor-post-date"> March 4, 2026 </span> <span class="elementor-post-time"> 12:31 PM </span> </div> </div> </article> <article class="elementor-post elementor-grid-item post-84824 post type-post status-publish format-standard has-post-thumbnail hentry category-daily-news"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/daily-news/samsung-brings-phone-based-door-unlocking/" > <div class="elementor-post__thumbnail"><img width="300" height="169" src="https://www.devx.com/wp-content/uploads/samsung_phone_based_door_unlocking-1772551693-300x169.webp" class="elementor-animation-grow attachment-medium size-medium wp-image-84823" alt="samsung phone based door unlocking" /></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/daily-news/samsung-brings-phone-based-door-unlocking/" > Samsung Brings Phone-Based Door Unlocking </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-author"> Deanna Ritchie </span> <span class="elementor-post-date"> March 4, 2026 </span> <span class="elementor-post-time"> 12:21 PM </span> </div> </div> </article> <article class="elementor-post elementor-grid-item post-84818 post type-post status-publish format-standard has-post-thumbnail hentry category-daily-news"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/daily-news/smartphones-deliver-net-gains-data-shows/" > <div class="elementor-post__thumbnail"><img width="300" height="169" src="https://www.devx.com/wp-content/uploads/smartphones_deliver_net_gains_data-1772551375-300x169.webp" class="elementor-animation-grow attachment-medium size-medium wp-image-84817" alt="smartphones deliver net gains data" /></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/daily-news/smartphones-deliver-net-gains-data-shows/" > Smartphones Deliver Net Gains, Data Shows </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-author"> Steve Gickling </span> <span class="elementor-post-date"> March 4, 2026 </span> <span class="elementor-post-time"> 10:23 AM </span> </div> </div> </article> <article class="elementor-post elementor-grid-item post-84822 post type-post status-publish format-standard has-post-thumbnail hentry category-daily-news"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/daily-news/asking-ai-chatbots-changes-how-we-learn/" > <div class="elementor-post__thumbnail"><img width="300" height="169" src="https://www.devx.com/wp-content/uploads/asking_chatbots_changes_learning-1772551585-300x169.webp" class="elementor-animation-grow attachment-medium size-medium wp-image-84821" alt="asking chatbots changes learning" /></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/daily-news/asking-ai-chatbots-changes-how-we-learn/" > Asking AI Chatbots Changes How We Learn </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-author"> Rashan Dixon </span> <span class="elementor-post-date"> March 4, 2026 </span> <span class="elementor-post-time"> 10:10 AM </span> </div> </div> </article> <article class="elementor-post elementor-grid-item post-84816 post type-post status-publish format-standard has-post-thumbnail hentry category-daily-news"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/daily-news/ai-rekindles-debate-over-photography/" > <div class="elementor-post__thumbnail"><img width="300" height="169" src="https://www.devx.com/wp-content/uploads/ai_photography_debate_rekindled-1772550911-300x169.webp" class="elementor-animation-grow attachment-medium size-medium wp-image-84815" alt="ai photography debate rekindled" /></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/daily-news/ai-rekindles-debate-over-photography/" > AI Rekindles Debate Over Photography </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-author"> Rashan Dixon </span> <span class="elementor-post-date"> March 4, 2026 </span> <span class="elementor-post-time"> 10:01 AM </span> </div> </div> </article> <article class="elementor-post elementor-grid-item post-84891 post type-post status-publish format-standard has-post-thumbnail hentry category-technology"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/technology/7-refactor-patterns-that-compound-over-years/" > <div class="elementor-post__thumbnail"><img width="300" height="200" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="elementor-animation-grow attachment-medium size-medium wp-image-84895 ewww_webp" alt="7 Refactor Patterns That Compound Over Years" data-src-img="https://www.devx.com/wp-content/uploads/7-refactor-patterns-that-compound-over-years-300x200.jpg" data-src-webp="https://www.devx.com/wp-content/uploads/7-refactor-patterns-that-compound-over-years-300x200.jpg.webp" data-eio="j" /><noscript><img width="300" height="200" src="https://www.devx.com/wp-content/uploads/7-refactor-patterns-that-compound-over-years-300x200.jpg" class="elementor-animation-grow attachment-medium size-medium wp-image-84895" alt="7 Refactor Patterns That Compound Over Years" /></noscript></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/technology/7-refactor-patterns-that-compound-over-years/" > 7 Refactor Patterns That Compound Over Years </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-author"> Kirstie Sands </span> <span class="elementor-post-date"> March 3, 2026 </span> <span class="elementor-post-time"> 4:49 PM </span> </div> </div> </article> <article class="elementor-post elementor-grid-item post-84760 post type-post status-publish format-standard has-post-thumbnail hentry category-daily-news"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/daily-news/doj-files-link-epstein-to-russian-investors/" > <div class="elementor-post__thumbnail"><img width="300" height="169" src="https://www.devx.com/wp-content/uploads/epstein_russian_investors_doj_files-1772464899-300x169.webp" class="elementor-animation-grow attachment-medium size-medium wp-image-84759" alt="epstein russian investors doj files" /></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/daily-news/doj-files-link-epstein-to-russian-investors/" > DOJ Files Link Epstein To Russian Investors </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-author"> Rashan Dixon </span> <span class="elementor-post-date"> March 3, 2026 </span> <span class="elementor-post-time"> 4:47 PM </span> </div> </div> </article> <article class="elementor-post elementor-grid-item post-84758 post type-post status-publish format-standard has-post-thumbnail hentry category-daily-news"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/daily-news/citadel-ark-invest-buy-zro-token/" > <div class="elementor-post__thumbnail"><img width="300" height="169" src="https://www.devx.com/wp-content/uploads/citadel_ark_invest_buy_zro-1772464798-300x169.webp" class="elementor-animation-grow attachment-medium size-medium wp-image-84757" alt="citadel ark invest buy zro" /></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/daily-news/citadel-ark-invest-buy-zro-token/" > Citadel, Ark Invest Buy ZRO Token </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-author"> Sumit Kumar </span> <span class="elementor-post-date"> March 3, 2026 </span> <span class="elementor-post-time"> 4:42 PM </span> </div> </div> </article> </div> <span class="e-load-more-spinner"> <i aria-hidden="true" class="fas fa-spinner"></i> </span> <div class="e-load-more-anchor" data-page="1" data-max-page="1051" data-next-page="https://www.devx.com/open-source-zone/33480/2/"></div> <div class="elementor-button-wrapper"> <a href="#" class="elementor-button-link elementor-button elementor-animation-grow" role="button"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-text">Show More</span> </span> </a> </div> <div class="e-load-more-message"></div> </div> </div> </div> </div> <div class="elementor-column elementor-col-20 elementor-top-column elementor-element elementor-element-270dc71" data-id="270dc71" data-element_type="column"> <div class="elementor-widget-wrap"> </div> </div> <div class="elementor-column elementor-col-20 elementor-top-column elementor-element elementor-element-8905b95 elementor-hidden-tablet" data-id="8905b95" data-element_type="column"> <div class="elementor-widget-wrap elementor-element-populated"> <div class="elementor-element elementor-element-2f83f51 elementor-widget elementor-widget-html" data-id="2f83f51" data-element_type="widget" data-widget_type="html.default"> <div class="elementor-widget-container"> <ins style="display: block; width: 100%" class="direqt-embed" data-bot-id="660c2a84041d59991d8be45b" data-start-hint="poll" data-story-id="auto" data-gtm="true" data-layout="overlay" ></ins> </div> </div> </div> </div> </div> </section> </div> </div> <footer data-elementor-type="footer" data-elementor-id="23300" class="elementor elementor-23300 elementor-location-footer"> <div class="elementor-section-wrap"> <footer class="elementor-section elementor-top-section elementor-element elementor-element-1588a538 elementor-section-height-min-height elementor-section-content-middle elementor-section-full_width elementor-section-height-default elementor-section-items-middle" data-id="1588a538" data-element_type="section" data-settings="{"background_background":"classic"}"> <div class="elementor-container elementor-column-gap-no"> <div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-9d2a788" data-id="9d2a788" data-element_type="column"> <div class="elementor-widget-wrap"> </div> </div> <div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-2e0ce949" data-id="2e0ce949" data-element_type="column"> <div class="elementor-widget-wrap elementor-element-populated"> <div class="elementor-element elementor-element-4f9ec08 elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="4f9ec08" data-element_type="widget" data-widget_type="divider.default"> <div class="elementor-widget-container"> <style>/*! elementor - v3.20.0 - 10-04-2024 */ .elementor-widget-divider{--divider-border-style:none;--divider-border-width:1px;--divider-color:#0c0d0e;--divider-icon-size:20px;--divider-element-spacing:10px;--divider-pattern-height:24px;--divider-pattern-size:20px;--divider-pattern-url:none;--divider-pattern-repeat:repeat-x}.elementor-widget-divider .elementor-divider{display:flex}.elementor-widget-divider .elementor-divider__text{font-size:15px;line-height:1;max-width:95%}.elementor-widget-divider .elementor-divider__element{margin:0 var(--divider-element-spacing);flex-shrink:0}.elementor-widget-divider .elementor-icon{font-size:var(--divider-icon-size)}.elementor-widget-divider .elementor-divider-separator{display:flex;margin:0;direction:ltr}.elementor-widget-divider--view-line_icon .elementor-divider-separator,.elementor-widget-divider--view-line_text .elementor-divider-separator{align-items:center}.elementor-widget-divider--view-line_icon .elementor-divider-separator:after,.elementor-widget-divider--view-line_icon .elementor-divider-separator:before,.elementor-widget-divider--view-line_text .elementor-divider-separator:after,.elementor-widget-divider--view-line_text .elementor-divider-separator:before{display:block;content:"";border-block-end:0;flex-grow:1;border-block-start:var(--divider-border-width) var(--divider-border-style) var(--divider-color)}.elementor-widget-divider--element-align-left .elementor-divider .elementor-divider-separator>.elementor-divider__svg:first-of-type{flex-grow:0;flex-shrink:100}.elementor-widget-divider--element-align-left .elementor-divider-separator:before{content:none}.elementor-widget-divider--element-align-left .elementor-divider__element{margin-left:0}.elementor-widget-divider--element-align-right .elementor-divider .elementor-divider-separator>.elementor-divider__svg:last-of-type{flex-grow:0;flex-shrink:100}.elementor-widget-divider--element-align-right .elementor-divider-separator:after{content:none}.elementor-widget-divider--element-align-right .elementor-divider__element{margin-right:0}.elementor-widget-divider--element-align-start .elementor-divider .elementor-divider-separator>.elementor-divider__svg:first-of-type{flex-grow:0;flex-shrink:100}.elementor-widget-divider--element-align-start .elementor-divider-separator:before{content:none}.elementor-widget-divider--element-align-start .elementor-divider__element{margin-inline-start:0}.elementor-widget-divider--element-align-end .elementor-divider .elementor-divider-separator>.elementor-divider__svg:last-of-type{flex-grow:0;flex-shrink:100}.elementor-widget-divider--element-align-end .elementor-divider-separator:after{content:none}.elementor-widget-divider--element-align-end .elementor-divider__element{margin-inline-end:0}.elementor-widget-divider:not(.elementor-widget-divider--view-line_text):not(.elementor-widget-divider--view-line_icon) .elementor-divider-separator{border-block-start:var(--divider-border-width) var(--divider-border-style) var(--divider-color)}.elementor-widget-divider--separator-type-pattern{--divider-border-style:none}.elementor-widget-divider--separator-type-pattern.elementor-widget-divider--view-line .elementor-divider-separator,.elementor-widget-divider--separator-type-pattern:not(.elementor-widget-divider--view-line) .elementor-divider-separator:after,.elementor-widget-divider--separator-type-pattern:not(.elementor-widget-divider--view-line) .elementor-divider-separator:before,.elementor-widget-divider--separator-type-pattern:not([class*=elementor-widget-divider--view]) .elementor-divider-separator{width:100%;min-height:var(--divider-pattern-height);-webkit-mask-size:var(--divider-pattern-size) 100%;mask-size:var(--divider-pattern-size) 100%;-webkit-mask-repeat:var(--divider-pattern-repeat);mask-repeat:var(--divider-pattern-repeat);background-color:var(--divider-color);-webkit-mask-image:var(--divider-pattern-url);mask-image:var(--divider-pattern-url)}.elementor-widget-divider--no-spacing{--divider-pattern-size:auto}.elementor-widget-divider--bg-round{--divider-pattern-repeat:round}.rtl .elementor-widget-divider .elementor-divider__text{direction:rtl}.e-con-inner>.elementor-widget-divider,.e-con>.elementor-widget-divider{width:var(--container-widget-width,100%);--flex-grow:var(--container-widget-flex-grow)}</style> <div class="elementor-divider"> <span class="elementor-divider-separator"> </span> </div> </div> </div> <section class="elementor-section elementor-inner-section elementor-element elementor-element-73a9986 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="73a9986" data-element_type="section"> <div class="elementor-container elementor-column-gap-default"> <div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-7f08930" data-id="7f08930" data-element_type="column"> <div class="elementor-widget-wrap elementor-element-populated"> <div class="elementor-element elementor-element-269b367 elementor-nav-menu__align-right elementor-nav-menu--dropdown-tablet elementor-nav-menu__text-align-aside elementor-nav-menu--toggle elementor-nav-menu--burger elementor-widget elementor-widget-nav-menu" data-id="269b367" data-element_type="widget" data-settings="{"layout":"horizontal","submenu_icon":{"value":"<i class=\"fas fa-caret-down\"><\/i>","library":"fa-solid"},"toggle":"burger"}" data-widget_type="nav-menu.default"> <div class="elementor-widget-container"> <nav class="elementor-nav-menu--main elementor-nav-menu__container elementor-nav-menu--layout-horizontal e--pointer-underline e--animation-fade"> <ul id="menu-1-269b367" class="elementor-nav-menu"><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-23816"><a href="https://www.devx.com/about/" class="elementor-item">About</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-65041"><a href="https://www.devx.com/contact/" class="elementor-item">Contact</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-23809"><a href="https://www.devx.com/advertise/" class="elementor-item">Advertise</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-46262"><a href="https://www.devx.com/publication-guidelines/" class="elementor-item">Guidelines</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-47967"><a href="https://www.devx.com/expert-review-board/" class="elementor-item">Experts</a></li> </ul> </nav> <div class="elementor-menu-toggle" role="button" tabindex="0" aria-label="Menu Toggle" aria-expanded="false"> <i aria-hidden="true" role="presentation" class="elementor-menu-toggle__icon--open eicon-menu-bar"></i><i aria-hidden="true" role="presentation" class="elementor-menu-toggle__icon--close eicon-close"></i> <span class="elementor-screen-only">Menu</span> </div> <nav class="elementor-nav-menu--dropdown elementor-nav-menu__container" aria-hidden="true"> <ul id="menu-2-269b367" class="elementor-nav-menu"><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-23816"><a href="https://www.devx.com/about/" class="elementor-item" tabindex="-1">About</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-65041"><a href="https://www.devx.com/contact/" class="elementor-item" tabindex="-1">Contact</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-23809"><a href="https://www.devx.com/advertise/" class="elementor-item" tabindex="-1">Advertise</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-46262"><a href="https://www.devx.com/publication-guidelines/" class="elementor-item" tabindex="-1">Guidelines</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-47967"><a href="https://www.devx.com/expert-review-board/" class="elementor-item" tabindex="-1">Experts</a></li> </ul> </nav> </div> </div> </div> </div> <div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-869862d" data-id="869862d" data-element_type="column"> <div class="elementor-widget-wrap elementor-element-populated"> <div class="elementor-element elementor-element-5d5f4dc5 e-grid-align-left elementor-widget__width-initial elementor-shape-rounded elementor-grid-0 elementor-widget elementor-widget-social-icons" data-id="5d5f4dc5" data-element_type="widget" data-widget_type="social-icons.default"> <div class="elementor-widget-container"> <style>/*! elementor - v3.20.0 - 10-04-2024 */ .elementor-widget-social-icons.elementor-grid-0 .elementor-widget-container,.elementor-widget-social-icons.elementor-grid-mobile-0 .elementor-widget-container,.elementor-widget-social-icons.elementor-grid-tablet-0 .elementor-widget-container{line-height:1;font-size:0}.elementor-widget-social-icons:not(.elementor-grid-0):not(.elementor-grid-tablet-0):not(.elementor-grid-mobile-0) .elementor-grid{display:inline-grid}.elementor-widget-social-icons .elementor-grid{grid-column-gap:var(--grid-column-gap,5px);grid-row-gap:var(--grid-row-gap,5px);grid-template-columns:var(--grid-template-columns);justify-content:var(--justify-content,center);justify-items:var(--justify-content,center)}.elementor-icon.elementor-social-icon{font-size:var(--icon-size,25px);line-height:var(--icon-size,25px);width:calc(var(--icon-size, 25px) + 2 * var(--icon-padding, .5em));height:calc(var(--icon-size, 25px) + 2 * var(--icon-padding, .5em))}.elementor-social-icon{--e-social-icon-icon-color:#fff;display:inline-flex;background-color:#69727d;align-items:center;justify-content:center;text-align:center;cursor:pointer}.elementor-social-icon i{color:var(--e-social-icon-icon-color)}.elementor-social-icon svg{fill:var(--e-social-icon-icon-color)}.elementor-social-icon:last-child{margin:0}.elementor-social-icon:hover{opacity:.9;color:#fff}.elementor-social-icon-android{background-color:#a4c639}.elementor-social-icon-apple{background-color:#999}.elementor-social-icon-behance{background-color:#1769ff}.elementor-social-icon-bitbucket{background-color:#205081}.elementor-social-icon-codepen{background-color:#000}.elementor-social-icon-delicious{background-color:#39f}.elementor-social-icon-deviantart{background-color:#05cc47}.elementor-social-icon-digg{background-color:#005be2}.elementor-social-icon-dribbble{background-color:#ea4c89}.elementor-social-icon-elementor{background-color:#d30c5c}.elementor-social-icon-envelope{background-color:#ea4335}.elementor-social-icon-facebook,.elementor-social-icon-facebook-f{background-color:#3b5998}.elementor-social-icon-flickr{background-color:#0063dc}.elementor-social-icon-foursquare{background-color:#2d5be3}.elementor-social-icon-free-code-camp,.elementor-social-icon-freecodecamp{background-color:#006400}.elementor-social-icon-github{background-color:#333}.elementor-social-icon-gitlab{background-color:#e24329}.elementor-social-icon-globe{background-color:#69727d}.elementor-social-icon-google-plus,.elementor-social-icon-google-plus-g{background-color:#dd4b39}.elementor-social-icon-houzz{background-color:#7ac142}.elementor-social-icon-instagram{background-color:#262626}.elementor-social-icon-jsfiddle{background-color:#487aa2}.elementor-social-icon-link{background-color:#818a91}.elementor-social-icon-linkedin,.elementor-social-icon-linkedin-in{background-color:#0077b5}.elementor-social-icon-medium{background-color:#00ab6b}.elementor-social-icon-meetup{background-color:#ec1c40}.elementor-social-icon-mixcloud{background-color:#273a4b}.elementor-social-icon-odnoklassniki{background-color:#f4731c}.elementor-social-icon-pinterest{background-color:#bd081c}.elementor-social-icon-product-hunt{background-color:#da552f}.elementor-social-icon-reddit{background-color:#ff4500}.elementor-social-icon-rss{background-color:#f26522}.elementor-social-icon-shopping-cart{background-color:#4caf50}.elementor-social-icon-skype{background-color:#00aff0}.elementor-social-icon-slideshare{background-color:#0077b5}.elementor-social-icon-snapchat{background-color:#fffc00}.elementor-social-icon-soundcloud{background-color:#f80}.elementor-social-icon-spotify{background-color:#2ebd59}.elementor-social-icon-stack-overflow{background-color:#fe7a15}.elementor-social-icon-steam{background-color:#00adee}.elementor-social-icon-stumbleupon{background-color:#eb4924}.elementor-social-icon-telegram{background-color:#2ca5e0}.elementor-social-icon-threads{background-color:#000}.elementor-social-icon-thumb-tack{background-color:#1aa1d8}.elementor-social-icon-tripadvisor{background-color:#589442}.elementor-social-icon-tumblr{background-color:#35465c}.elementor-social-icon-twitch{background-color:#6441a5}.elementor-social-icon-twitter{background-color:#1da1f2}.elementor-social-icon-viber{background-color:#665cac}.elementor-social-icon-vimeo{background-color:#1ab7ea}.elementor-social-icon-vk{background-color:#45668e}.elementor-social-icon-weibo{background-color:#dd2430}.elementor-social-icon-weixin{background-color:#31a918}.elementor-social-icon-whatsapp{background-color:#25d366}.elementor-social-icon-wordpress{background-color:#21759b}.elementor-social-icon-x-twitter{background-color:#000}.elementor-social-icon-xing{background-color:#026466}.elementor-social-icon-yelp{background-color:#af0606}.elementor-social-icon-youtube{background-color:#cd201f}.elementor-social-icon-500px{background-color:#0099e5}.elementor-shape-rounded .elementor-icon.elementor-social-icon{border-radius:10%}.elementor-shape-circle .elementor-icon.elementor-social-icon{border-radius:50%}</style> <div class="elementor-social-icons-wrapper elementor-grid"> <span class="elementor-grid-item"> <a class="elementor-icon elementor-social-icon elementor-social-icon-linkedin elementor-repeater-item-5c0ce3c" href="https://www.linkedin.com/company/devx" target="_blank"> <span class="elementor-screen-only">Linkedin</span> <i class="fab fa-linkedin"></i> </a> </span> <span class="elementor-grid-item"> <a class="elementor-icon elementor-social-icon elementor-social-icon-twitter elementor-repeater-item-828f132" href="https://twitter.com/DevX_Com" target="_blank"> <span class="elementor-screen-only">Twitter</span> <i class="fab fa-twitter"></i> </a> </span> </div> </div> </div> </div> </div> <div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-21928d3" data-id="21928d3" data-element_type="column"> <div class="elementor-widget-wrap"> </div> </div> </div> </section> <section class="elementor-section elementor-inner-section elementor-element elementor-element-e509954 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="e509954" data-element_type="section"> <div class="elementor-container elementor-column-gap-default"> <div class="elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-f77ca98" data-id="f77ca98" data-element_type="column"> <div class="elementor-widget-wrap elementor-element-populated"> <div class="elementor-element elementor-element-c500cdf elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="c500cdf" data-element_type="widget" data-widget_type="divider.default"> <div class="elementor-widget-container"> <div class="elementor-divider"> <span class="elementor-divider-separator"> </span> </div> </div> </div> <div class="elementor-element elementor-element-fbeb59f elementor-nav-menu__align-center elementor-nav-menu--dropdown-tablet elementor-nav-menu__text-align-aside elementor-nav-menu--toggle elementor-nav-menu--burger elementor-widget elementor-widget-nav-menu" data-id="fbeb59f" data-element_type="widget" data-settings="{"layout":"horizontal","submenu_icon":{"value":"<i class=\"fas fa-caret-down\"><\/i>","library":"fa-solid"},"toggle":"burger"}" data-widget_type="nav-menu.default"> <div class="elementor-widget-container"> <nav class="elementor-nav-menu--main elementor-nav-menu__container elementor-nav-menu--layout-horizontal e--pointer-underline e--animation-fade"> <ul id="menu-1-fbeb59f" class="elementor-nav-menu"><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27045"><a href="https://www.devx.com/a-terms/" class="elementor-item">A</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27044"><a href="https://www.devx.com/b-terms/" class="elementor-item">B</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27043"><a href="https://www.devx.com/c-terms/" class="elementor-item">C</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27152"><a href="https://www.devx.com/d-terms/" class="elementor-item">D</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27153"><a href="https://www.devx.com/e-terms/" class="elementor-item">E</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27154"><a href="https://www.devx.com/f-terms/" class="elementor-item">F</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27155"><a href="https://www.devx.com/g-terms/" class="elementor-item">G</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27156"><a href="https://www.devx.com/h-terms/" class="elementor-item">H</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27157"><a href="https://www.devx.com/i-terms/" class="elementor-item">I</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27158"><a href="https://www.devx.com/j-terms/" class="elementor-item">J</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27159"><a href="https://www.devx.com/k-terms/" class="elementor-item">K</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27137"><a href="https://www.devx.com/l-terms/" class="elementor-item">L</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27151"><a href="https://www.devx.com/m-terms/" class="elementor-item">M</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27150"><a href="https://www.devx.com/n-terms/" class="elementor-item">N</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27149"><a href="https://www.devx.com/o-terms/" class="elementor-item">O</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27148"><a href="https://www.devx.com/p-terms/" class="elementor-item">P</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27147"><a href="https://www.devx.com/q-terms/" class="elementor-item">Q</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27146"><a href="https://www.devx.com/r-terms/" class="elementor-item">R</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27145"><a href="https://www.devx.com/s-terms/" class="elementor-item">S</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27144"><a href="https://www.devx.com/t-terms/" class="elementor-item">T</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27143"><a href="https://www.devx.com/u-terms/" class="elementor-item">U</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27142"><a href="https://www.devx.com/v-terms/" class="elementor-item">V</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27141"><a href="https://www.devx.com/w-terms/" class="elementor-item">W</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27140"><a href="https://www.devx.com/x-terms/" class="elementor-item">X</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27139"><a href="https://www.devx.com/y-terms/" class="elementor-item">Y</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27138"><a href="https://www.devx.com/z-terms/" class="elementor-item">Z</a></li> </ul> </nav> <div class="elementor-menu-toggle" role="button" tabindex="0" aria-label="Menu Toggle" aria-expanded="false"> <i aria-hidden="true" role="presentation" class="elementor-menu-toggle__icon--open eicon-menu-bar"></i><i aria-hidden="true" role="presentation" class="elementor-menu-toggle__icon--close eicon-close"></i> <span class="elementor-screen-only">Menu</span> </div> <nav class="elementor-nav-menu--dropdown elementor-nav-menu__container" aria-hidden="true"> <ul id="menu-2-fbeb59f" class="elementor-nav-menu"><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27045"><a href="https://www.devx.com/a-terms/" class="elementor-item" tabindex="-1">A</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27044"><a href="https://www.devx.com/b-terms/" class="elementor-item" tabindex="-1">B</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27043"><a href="https://www.devx.com/c-terms/" class="elementor-item" tabindex="-1">C</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27152"><a href="https://www.devx.com/d-terms/" class="elementor-item" tabindex="-1">D</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27153"><a href="https://www.devx.com/e-terms/" class="elementor-item" tabindex="-1">E</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27154"><a href="https://www.devx.com/f-terms/" class="elementor-item" tabindex="-1">F</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27155"><a href="https://www.devx.com/g-terms/" class="elementor-item" tabindex="-1">G</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27156"><a href="https://www.devx.com/h-terms/" class="elementor-item" tabindex="-1">H</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27157"><a href="https://www.devx.com/i-terms/" class="elementor-item" tabindex="-1">I</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27158"><a href="https://www.devx.com/j-terms/" class="elementor-item" tabindex="-1">J</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27159"><a href="https://www.devx.com/k-terms/" class="elementor-item" tabindex="-1">K</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27137"><a href="https://www.devx.com/l-terms/" class="elementor-item" tabindex="-1">L</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27151"><a href="https://www.devx.com/m-terms/" class="elementor-item" tabindex="-1">M</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27150"><a href="https://www.devx.com/n-terms/" class="elementor-item" tabindex="-1">N</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27149"><a href="https://www.devx.com/o-terms/" class="elementor-item" tabindex="-1">O</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27148"><a href="https://www.devx.com/p-terms/" class="elementor-item" tabindex="-1">P</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27147"><a href="https://www.devx.com/q-terms/" class="elementor-item" tabindex="-1">Q</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27146"><a href="https://www.devx.com/r-terms/" class="elementor-item" tabindex="-1">R</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27145"><a href="https://www.devx.com/s-terms/" class="elementor-item" tabindex="-1">S</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27144"><a href="https://www.devx.com/t-terms/" class="elementor-item" tabindex="-1">T</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27143"><a href="https://www.devx.com/u-terms/" class="elementor-item" tabindex="-1">U</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27142"><a href="https://www.devx.com/v-terms/" class="elementor-item" tabindex="-1">V</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27141"><a href="https://www.devx.com/w-terms/" class="elementor-item" tabindex="-1">W</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27140"><a href="https://www.devx.com/x-terms/" class="elementor-item" tabindex="-1">X</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27139"><a href="https://www.devx.com/y-terms/" class="elementor-item" tabindex="-1">Y</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27138"><a href="https://www.devx.com/z-terms/" class="elementor-item" tabindex="-1">Z</a></li> </ul> </nav> </div> </div> <div class="elementor-element elementor-element-6963de5 elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="6963de5" data-element_type="widget" data-widget_type="divider.default"> <div class="elementor-widget-container"> <div class="elementor-divider"> <span class="elementor-divider-separator"> </span> </div> </div> </div> </div> </div> </div> </section> </div> </div> <div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-c5e10d2" data-id="c5e10d2" data-element_type="column"> <div class="elementor-widget-wrap"> </div> </div> </div> </footer> <section class="elementor-section elementor-top-section elementor-element elementor-element-a4f01a6 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="a4f01a6" data-element_type="section"> <div class="elementor-container elementor-column-gap-default"> <div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-a1bc5b1" data-id="a1bc5b1" data-element_type="column"> <div class="elementor-widget-wrap"> </div> </div> <div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-e4f110b" data-id="e4f110b" data-element_type="column"> <div class="elementor-widget-wrap elementor-element-populated"> <div class="elementor-element elementor-element-4a914653 elementor-widget elementor-widget-heading" data-id="4a914653" data-element_type="widget" data-widget_type="heading.default"> <div class="elementor-widget-container"> <p class="elementor-heading-title elementor-size-default">©2025 Copyright DevX - All Rights Reserved. Registration or use of this site constitutes acceptance of our Terms of Service and Privacy Policy.</p> </div> </div> <div class="elementor-element elementor-element-d2cf216 elementor-widget elementor-widget-text-editor" data-id="d2cf216" data-element_type="widget" data-widget_type="text-editor.default"> <div class="elementor-widget-container"> <p><strong><a href="https://www.devx.com/sitemap/">Sitemap</a> — </strong><strong><a href="https://www.devx.com/privacy-policy/">Privacy Policy</a></strong></p> </div> </div> </div> </div> <div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-1daca18" data-id="1daca18" data-element_type="column"> <div class="elementor-widget-wrap"> </div> </div> </div> </section> </div> </footer> <!-- AdThrive - Override Elementor 100% iframe width --> <script> setInterval(() => { const elementorPage = document.querySelector('[class*="elementor"]') const adThriveLoaded = document.getElementsByTagName('body')[0].classList.contains('adthrive-device-phone') || document.getElementsByTagName('body')[0].classList.contains('adthrive-device-tablet') || document.getElementsByTagName('body')[0].classList.contains('adthrive-device-desktop') if (!adThriveLoaded) { console.log('Waiting for AdThrive...') return } if (elementorPage) { const ads = document.querySelectorAll(".adthrive-ad iframe"); ads.forEach(ad => { if (typeof ad.width !== "undefined" && ad.width !== "1") { ad.style.width = ad.width + "px"; } }) } }, 50); </script> <script data-no-optimize='1' data-cfasync='false' id='cls-insertion-5544078'>(function(){window.adthriveCLS.buildDate=`2026-03-05`;var e=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),t=e(((e,t)=>{var n=function(e){return e&&e.Math===Math&&e};t.exports=n(typeof globalThis==`object`&&globalThis)||n(typeof window==`object`&&window)||n(typeof self==`object`&&self)||n(typeof global==`object`&&global)||n(typeof e==`object`&&e)||(function(){return this})()||Function(`return this`)()})),n=e(((e,t)=>{t.exports=function(e){try{return!!e()}catch(e){return!0}}})),r=e(((e,t)=>{t.exports=!n()(function(){return Object.defineProperty({},1,{get:function(){return 7}})[1]!==7})})),i=e(((e,t)=>{t.exports=!n()(function(){var e=(function(){}).bind();return typeof e!=`function`||e.hasOwnProperty(`prototype`)})})),a=e(((e,t)=>{var n=i(),r=Function.prototype.call;t.exports=n?r.bind(r):function(){return r.apply(r,arguments)}})),o=e((e=>{var t={}.propertyIsEnumerable,n=Object.getOwnPropertyDescriptor;e.f=n&&!t.call({1:2},1)?function(e){var t=n(this,e);return!!t&&t.enumerable}:t})),s=e(((e,t)=>{t.exports=function(e,t){return{enumerable:!(e&1),configurable:!(e&2),writable:!(e&4),value:t}}})),c=e(((e,t)=>{var n=i(),r=Function.prototype,a=r.call,o=n&&r.bind.bind(a,a);t.exports=n?o:function(e){return function(){return a.apply(e,arguments)}}})),l=e(((e,t)=>{var n=c(),r=n({}.toString),i=n(``.slice);t.exports=function(e){return i(r(e),8,-1)}})),u=e(((e,t)=>{var r=c(),i=n(),a=l(),o=Object,s=r(``.split);t.exports=i(function(){return!o(`z`).propertyIsEnumerable(0)})?function(e){return a(e)===`String`?s(e,``):o(e)}:o})),d=e(((e,t)=>{t.exports=function(e){return e==null}})),f=e(((e,t)=>{var n=d(),r=TypeError;t.exports=function(e){if(n(e))throw new r(`Can't call method on `+e);return e}})),p=e(((e,t)=>{var n=u(),r=f();t.exports=function(e){return n(r(e))}})),m=e(((e,t)=>{var n=typeof document==`object`&&document.all;t.exports=n===void 0&&n!==void 0?function(e){return typeof e==`function`||e===n}:function(e){return typeof e==`function`}})),h=e(((e,t)=>{var n=m();t.exports=function(e){return typeof e==`object`?e!==null:n(e)}})),g=e(((e,n)=>{var r=t(),i=m(),a=function(e){return i(e)?e:void 0};n.exports=function(e,t){return arguments.length<2?a(r[e]):r[e]&&r[e][t]}})),_=e(((e,t)=>{t.exports=c()({}.isPrototypeOf)})),v=e(((e,t)=>{t.exports=typeof navigator<`u`&&String(navigator.userAgent)||``})),y=e(((e,n)=>{var r=t(),i=v(),a=r.process,o=r.Deno,s=a&&a.versions||o&&o.version,c=s&&s.v8,l,u;c&&(l=c.split(`.`),u=l[0]>0&&l[0]<4?1:+(l[0]+l[1])),!u&&i&&(l=i.match(/Edge\/(\d+)/),(!l||l[1]>=74)&&(l=i.match(/Chrome\/(\d+)/),l&&(u=+l[1]))),n.exports=u})),b=e(((e,r)=>{var i=y(),a=n(),o=t().String;r.exports=!!Object.getOwnPropertySymbols&&!a(function(){var e=Symbol(`symbol detection`);return!o(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&i&&i<41})})),x=e(((e,t)=>{t.exports=b()&&!Symbol.sham&&typeof Symbol.iterator==`symbol`})),S=e(((e,t)=>{var n=g(),r=m(),i=_(),a=x(),o=Object;t.exports=a?function(e){return typeof e==`symbol`}:function(e){var t=n(`Symbol`);return r(t)&&i(t.prototype,o(e))}})),C=e(((e,t)=>{var n=String;t.exports=function(e){try{return n(e)}catch(e){return`Object`}}})),ee=e(((e,t)=>{var n=m(),r=C(),i=TypeError;t.exports=function(e){if(n(e))return e;throw new i(r(e)+` is not a function`)}})),te=e(((e,t)=>{var n=ee(),r=d();t.exports=function(e,t){var i=e[t];return r(i)?void 0:n(i)}})),ne=e(((e,t)=>{var n=a(),r=m(),i=h(),o=TypeError;t.exports=function(e,t){var a,s;if(t===`string`&&r(a=e.toString)&&!i(s=n(a,e))||r(a=e.valueOf)&&!i(s=n(a,e))||t!==`string`&&r(a=e.toString)&&!i(s=n(a,e)))return s;throw new o(`Can't convert object to primitive value`)}})),re=e(((e,t)=>{t.exports=!1})),w=e(((e,n)=>{var r=t(),i=Object.defineProperty;n.exports=function(e,t){try{i(r,e,{value:t,configurable:!0,writable:!0})}catch(n){r[e]=t}return t}})),T=e(((e,n)=>{var r=re(),i=t(),a=w(),o=`__core-js_shared__`,s=n.exports=i[o]||a(o,{});(s.versions||(s.versions=[])).push({version:`3.36.1`,mode:r?`pure`:`global`,copyright:`© 2014-2024 Denis Pushkarev (zloirock.ru)`,license:`https://github.com/zloirock/core-js/blob/v3.36.1/LICENSE`,source:`https://github.com/zloirock/core-js`})})),ie=e(((e,t)=>{var n=T();t.exports=function(e,t){return n[e]||(n[e]=t||{})}})),ae=e(((e,t)=>{var n=f(),r=Object;t.exports=function(e){return r(n(e))}})),E=e(((e,t)=>{var n=c(),r=ae(),i=n({}.hasOwnProperty);t.exports=Object.hasOwn||function(e,t){return i(r(e),t)}})),oe=e(((e,t)=>{var n=c(),r=0,i=Math.random(),a=n(1 .toString);t.exports=function(e){return`Symbol(`+(e===void 0?``:e)+`)_`+a(++r+i,36)}})),se=e(((e,n)=>{var r=t(),i=ie(),a=E(),o=oe(),s=b(),c=x(),l=r.Symbol,u=i(`wks`),d=c?l.for||l:l&&l.withoutSetter||o;n.exports=function(e){return a(u,e)||(u[e]=s&&a(l,e)?l[e]:d(`Symbol.`+e)),u[e]}})),ce=e(((e,t)=>{var n=a(),r=h(),i=S(),o=te(),s=ne(),c=se(),l=TypeError,u=c(`toPrimitive`);t.exports=function(e,t){if(!r(e)||i(e))return e;var a=o(e,u),c;if(a){if(t===void 0&&(t=`default`),c=n(a,e,t),!r(c)||i(c))return c;throw new l(`Can't convert object to primitive value`)}return t===void 0&&(t=`number`),s(e,t)}})),le=e(((e,t)=>{var n=ce(),r=S();t.exports=function(e){var t=n(e,`string`);return r(t)?t:t+``}})),ue=e(((e,n)=>{var r=t(),i=h(),a=r.document,o=i(a)&&i(a.createElement);n.exports=function(e){return o?a.createElement(e):{}}})),de=e(((e,t)=>{var i=r(),a=n(),o=ue();t.exports=!i&&!a(function(){return Object.defineProperty(o(`div`),`a`,{get:function(){return 7}}).a!==7})})),D=e((e=>{var t=r(),n=a(),i=o(),c=s(),l=p(),u=le(),d=E(),f=de(),m=Object.getOwnPropertyDescriptor;e.f=t?m:function(e,t){if(e=l(e),t=u(t),f)try{return m(e,t)}catch(e){}if(d(e,t))return c(!n(i.f,e,t),e[t])}})),fe=e(((e,t)=>{var i=r(),a=n();t.exports=i&&a(function(){return Object.defineProperty(function(){},`prototype`,{value:42,writable:!1}).prototype!==42})})),pe=e(((e,t)=>{var n=h(),r=String,i=TypeError;t.exports=function(e){if(n(e))return e;throw new i(r(e)+` is not an object`)}})),O=e((e=>{var t=r(),n=de(),i=fe(),a=pe(),o=le(),s=TypeError,c=Object.defineProperty,l=Object.getOwnPropertyDescriptor,u=`enumerable`,d=`configurable`,f=`writable`;e.f=t?i?function(e,t,n){if(a(e),t=o(t),a(n),typeof e==`function`&&t===`prototype`&&`value`in n&&f in n&&!n[f]){var r=l(e,t);r&&r[f]&&(e[t]=n.value,n={configurable:d in n?n[d]:r[d],enumerable:u in n?n[u]:r[u],writable:!1})}return c(e,t,n)}:c:function(e,t,r){if(a(e),t=o(t),a(r),n)try{return c(e,t,r)}catch(e){}if(`get`in r||`set`in r)throw new s(`Accessors not supported`);return`value`in r&&(e[t]=r.value),e}})),me=e(((e,t)=>{var n=r(),i=O(),a=s();t.exports=n?function(e,t,n){return i.f(e,t,a(1,n))}:function(e,t,n){return e[t]=n,e}})),he=e(((e,t)=>{var n=r(),i=E(),a=Function.prototype,o=n&&Object.getOwnPropertyDescriptor,s=i(a,`name`);t.exports={EXISTS:s,PROPER:s&&(function(){}).name===`something`,CONFIGURABLE:s&&(!n||n&&o(a,`name`).configurable)}})),ge=e(((e,t)=>{var n=c(),r=m(),i=T(),a=n(Function.toString);r(i.inspectSource)||(i.inspectSource=function(e){return a(e)}),t.exports=i.inspectSource})),_e=e(((e,n)=>{var r=t(),i=m(),a=r.WeakMap;n.exports=i(a)&&/native code/.test(String(a))})),ve=e(((e,t)=>{var n=ie(),r=oe(),i=n(`keys`);t.exports=function(e){return i[e]||(i[e]=r(e))}})),ye=e(((e,t)=>{t.exports={}})),be=e(((e,n)=>{var r=_e(),i=t(),a=h(),o=me(),s=E(),c=T(),l=ve(),u=ye(),d=`Object already initialized`,f=i.TypeError,p=i.WeakMap,m,g,_,v=function(e){return _(e)?g(e):m(e,{})},y=function(e){return function(t){var n;if(!a(t)||(n=g(t)).type!==e)throw new f(`Incompatible receiver, `+e+` required`);return n}};if(r||c.state){var b=c.state||(c.state=new p);b.get=b.get,b.has=b.has,b.set=b.set,m=function(e,t){if(b.has(e))throw new f(d);return t.facade=e,b.set(e,t),t},g=function(e){return b.get(e)||{}},_=function(e){return b.has(e)}}else{var x=l(`state`);u[x]=!0,m=function(e,t){if(s(e,x))throw new f(d);return t.facade=e,o(e,x,t),t},g=function(e){return s(e,x)?e[x]:{}},_=function(e){return s(e,x)}}n.exports={set:m,get:g,has:_,enforce:v,getterFor:y}})),xe=e(((e,t)=>{var i=c(),a=n(),o=m(),s=E(),l=r(),u=he().CONFIGURABLE,d=ge(),f=be(),p=f.enforce,h=f.get,g=String,_=Object.defineProperty,v=i(``.slice),y=i(``.replace),b=i([].join),x=l&&!a(function(){return _(function(){},`length`,{value:8}).length!==8}),S=String(String).split(`String`),C=t.exports=function(e,t,n){v(g(t),0,7)===`Symbol(`&&(t=`[`+y(g(t),/^Symbol\(([^)]*)\).*$/,`$1`)+`]`),n&&n.getter&&(t=`get `+t),n&&n.setter&&(t=`set `+t),(!s(e,`name`)||u&&e.name!==t)&&(l?_(e,`name`,{value:t,configurable:!0}):e.name=t),x&&n&&s(n,`arity`)&&e.length!==n.arity&&_(e,`length`,{value:n.arity});try{n&&s(n,`constructor`)&&n.constructor?l&&_(e,`prototype`,{writable:!1}):e.prototype&&(e.prototype=void 0)}catch(e){}var r=p(e);return s(r,`source`)||(r.source=b(S,typeof t==`string`?t:``)),e};Function.prototype.toString=C(function(){return o(this)&&h(this).source||d(this)},`toString`)})),Se=e(((e,t)=>{var n=m(),r=O(),i=xe(),a=w();t.exports=function(e,t,o,s){s||(s={});var c=s.enumerable,l=s.name===void 0?t:s.name;if(n(o)&&i(o,l,s),s.global)c?e[t]=o:a(t,o);else{try{s.unsafe?e[t]&&(c=!0):delete e[t]}catch(e){}c?e[t]=o:r.f(e,t,{value:o,enumerable:!1,configurable:!s.nonConfigurable,writable:!s.nonWritable})}return e}})),Ce=e(((e,t)=>{var n=Math.ceil,r=Math.floor;t.exports=Math.trunc||function(e){var t=+e;return(t>0?r:n)(t)}})),we=e(((e,t)=>{var n=Ce();t.exports=function(e){var t=+e;return t!==t||t===0?0:n(t)}})),Te=e(((e,t)=>{var n=we(),r=Math.max,i=Math.min;t.exports=function(e,t){var a=n(e);return a<0?r(a+t,0):i(a,t)}})),Ee=e(((e,t)=>{var n=we(),r=Math.min;t.exports=function(e){var t=n(e);return t>0?r(t,9007199254740991):0}})),De=e(((e,t)=>{var n=Ee();t.exports=function(e){return n(e.length)}})),Oe=e(((e,t)=>{var n=p(),r=Te(),i=De(),a=function(e){return function(t,a,o){var s=n(t),c=i(s);if(c===0)return!e&&-1;var l=r(o,c),u;if(e&&a!==a){for(;c>l;)if(u=s[l++],u!==u)return!0}else for(;c>l;l++)if((e||l in s)&&s[l]===a)return e||l||0;return!e&&-1}};t.exports={includes:a(!0),indexOf:a(!1)}})),ke=e(((e,t)=>{var n=c(),r=E(),i=p(),a=Oe().indexOf,o=ye(),s=n([].push);t.exports=function(e,t){var n=i(e),c=0,l=[],u;for(u in n)!r(o,u)&&r(n,u)&&s(l,u);for(;t.length>c;)r(n,u=t[c++])&&(~a(l,u)||s(l,u));return l}})),Ae=e(((e,t)=>{t.exports=[`constructor`,`hasOwnProperty`,`isPrototypeOf`,`propertyIsEnumerable`,`toLocaleString`,`toString`,`valueOf`]})),je=e((e=>{var t=ke(),n=Ae().concat(`length`,`prototype`);e.f=Object.getOwnPropertyNames||function(e){return t(e,n)}})),Me=e((e=>{e.f=Object.getOwnPropertySymbols})),k=e(((e,t)=>{var n=g(),r=c(),i=je(),a=Me(),o=pe(),s=r([].concat);t.exports=n(`Reflect`,`ownKeys`)||function(e){var t=i.f(o(e)),n=a.f;return n?s(t,n(e)):t}})),Ne=e(((e,t)=>{var n=E(),r=k(),i=D(),a=O();t.exports=function(e,t,o){for(var s=r(t),c=a.f,l=i.f,u=0;u<s.length;u++){var d=s[u];!n(e,d)&&!(o&&n(o,d))&&c(e,d,l(t,d))}}})),Pe=e(((e,t)=>{var r=n(),i=m(),a=/#|\.prototype\./,o=function(e,t){var n=c[s(e)];return n===u?!0:n===l?!1:i(t)?r(t):!!t},s=o.normalize=function(e){return String(e).replace(a,`.`).toLowerCase()},c=o.data={},l=o.NATIVE=`N`,u=o.POLYFILL=`P`;t.exports=o})),Fe=e(((e,n)=>{var r=t(),i=D().f,a=me(),o=Se(),s=w(),c=Ne(),l=Pe();n.exports=function(e,t){var n=e.target,u=e.global,d=e.stat,f,p=u?r:d?r[n]||s(n,{}):r[n]&&r[n].prototype,m,h,g,_;if(p)for(m in t){if(g=t[m],e.dontCallGetSet?(_=i(p,m),h=_&&_.value):h=p[m],f=l(u?m:n+(d?`.`:`#`)+m,e.forced),!f&&h!==void 0){if(typeof g==typeof h)continue;c(g,h)}(e.sham||h&&h.sham)&&a(g,`sham`,!0),o(p,m,g,e)}}})),Ie=e(((e,t)=>{var n=r(),i=O(),a=s();t.exports=function(e,t,r){n?i.f(e,t,a(0,r)):e[t]=r}})),Le=e((()=>{var e=Fe(),t=r(),n=k(),i=p(),a=D(),o=Ie();e({target:`Object`,stat:!0,sham:!t},{getOwnPropertyDescriptors:function(e){for(var t=i(e),r=a.f,s=n(t),c={},l=0,u,d;s.length>l;)d=r(t,u=s[l++]),d!==void 0&&o(c,u,d);return c}})})),Re=e(((e,n)=>{n.exports=t()}));e(((e,t)=>{Le(),t.exports=Re().Object.getOwnPropertyDescriptors}))();let A={Below_Post_1:`Below_Post_1`,Below_Post:`Below_Post`,Content:`Content`,Content_1:`Content_1`,Content_2:`Content_2`,Content_3:`Content_3`,Content_4:`Content_4`,Content_5:`Content_5`,Content_6:`Content_6`,Content_7:`Content_7`,Content_8:`Content_8`,Content_9:`Content_9`,Recipe:`Recipe`,Recipe_1:`Recipe_1`,Recipe_2:`Recipe_2`,Recipe_3:`Recipe_3`,Recipe_4:`Recipe_4`,Recipe_5:`Recipe_5`,Native_Recipe:`Native_Recipe`,Footer_1:`Footer_1`,Footer:`Footer`,Header_1:`Header_1`,Header_2:`Header_2`,Header:`Header`,Sidebar_1:`Sidebar_1`,Sidebar_2:`Sidebar_2`,Sidebar_3:`Sidebar_3`,Sidebar_4:`Sidebar_4`,Sidebar_5:`Sidebar_5`,Sidebar_9:`Sidebar_9`,Sidebar:`Sidebar`,Interstitial_1:`Interstitial_1`,Interstitial:`Interstitial`,Video_StickyOutstream_1:`Video_StickyOutstream_1`,Video_StickyOutstream:`Video_StickyOutstream`,Video_StickyInstream:`Video_StickyInstream`,Sponsor_Tile:`Sponsor_Tile`},ze=[`siteId`,`siteName`,`adOptions`,`breakpoints`,`adUnits`],Be=(e,t=ze)=>{if(!e)return window.adthriveCLS&&(window.adthriveCLS.disabled=!0),!1;for(let n=0;n<t.length;n++)if(!e[t[n]])return window.adthriveCLS&&(window.adthriveCLS.disabled=!0),!1;return!0},Ve=()=>window.adthriveCLS;function j(e){"@babel/helpers - typeof";return j=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},j(e)}function He(e,t){if(j(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(j(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function Ue(e){var t=He(e,`string`);return j(t)==`symbol`?t:t+``}function M(e,t,n){return(t=Ue(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var We=class{constructor(){M(this,`_clsGlobalData`,Ve())}get enabled(){return!!this._clsGlobalData&&!!this._clsGlobalData.siteAds&&Be(this._clsGlobalData.siteAds)}get error(){return!!(this._clsGlobalData&&this._clsGlobalData.error)}set siteAds(e){this._clsGlobalData.siteAds=e}get siteAds(){return this._clsGlobalData.siteAds}set disableAds(e){this._clsGlobalData.disableAds=e}get disableAds(){return this._clsGlobalData.disableAds}get enabledLocations(){return[A.Below_Post,A.Content,A.Recipe,A.Sidebar]}get injectedFromPlugin(){return this._clsGlobalData.injectedFromPlugin}set injectedFromPlugin(e){this._clsGlobalData.injectedFromPlugin=e}get injectedFromSiteAds(){return this._clsGlobalData.injectedFromSiteAds}set injectedFromSiteAds(e){this._clsGlobalData.injectedFromSiteAds=e}setInjectedSlots(e){this._clsGlobalData.injectedSlots=this._clsGlobalData.injectedSlots||[],this._clsGlobalData.injectedSlots.push(e)}get injectedSlots(){return this._clsGlobalData.injectedSlots}setInjectedVideoSlots(e){this._clsGlobalData.injectedVideoSlots=this._clsGlobalData.injectedVideoSlots||[],this._clsGlobalData.injectedVideoSlots.push(e)}get injectedVideoSlots(){return this._clsGlobalData.injectedVideoSlots}setExperiment(e,t,n=!1){this._clsGlobalData.experiments=this._clsGlobalData.experiments||{},this._clsGlobalData.siteExperiments=this._clsGlobalData.siteExperiments||{};let r=n?this._clsGlobalData.siteExperiments:this._clsGlobalData.experiments;r[e]=t}getExperiment(e,t=!1){let n=t?this._clsGlobalData.siteExperiments:this._clsGlobalData.experiments;return n&&n[e]}setWeightedChoiceExperiment(e,t,n=!1){this._clsGlobalData.experimentsWeightedChoice=this._clsGlobalData.experimentsWeightedChoice||{},this._clsGlobalData.siteExperimentsWeightedChoice=this._clsGlobalData.siteExperimentsWeightedChoice||{};let r=n?this._clsGlobalData.siteExperimentsWeightedChoice:this._clsGlobalData.experimentsWeightedChoice;r[e]=t}getWeightedChoiceExperiment(e,t=!1){var n,r;let i=t?(n=this._clsGlobalData)==null?void 0:n.siteExperimentsWeightedChoice:(r=this._clsGlobalData)==null?void 0:r.experimentsWeightedChoice;return i&&i[e]}get bucket(){return this._clsGlobalData.bucket}set videoDisabledFromPlugin(e){this._clsGlobalData.videoDisabledFromPlugin=e}get videoDisabledFromPlugin(){return this._clsGlobalData.videoDisabledFromPlugin}set targetDensityLog(e){this._clsGlobalData.targetDensityLog=e}get targetDensityLog(){return this._clsGlobalData.targetDensityLog}get removeVideoTitleWrapper(){return this._clsGlobalData.siteAds.adOptions.removeVideoTitleWrapper}};let N=e=>{let t={};return function(...n){let r=JSON.stringify(n);if(r in t)return t[r];let i=e.apply(this,n);return t[r]=i,i}};navigator.vendor;let P=navigator.userAgent,Ge=N(e=>/Chrom|Applechromium/.test(e||P)),Ke=N(()=>/WebKit/.test(P)),qe=N(()=>Ge()?`chromium`:Ke()?`webkit`:`other`),Je=e=>/(Windows NT|Macintosh|X11;[^)]*(Linux|CrOS))/i.test(e),Ye=e=>/Mobi|iP(hone|od)|Opera Mini/i.test(e),Xe=e=>!/iPhone/i.test(e)&&/Mac/i.test(e)&&`ontouchstart`in window,Ze=e=>/Tablet|iPad|Playbook|Nook|webOS|Kindle|Android (?!.*Mobile).*Safari/i.test(e)||Xe(e),Qe=N((e=P)=>Ze(e)?`tablet`:Ye(e)&&!Ze(e)?`mobile`:Je(e)?`desktop`:`tablet`),$e={desktop:`desktop`,tablet:`tablet`,phone:`mobile`},et=e=>e===`mobile`?`phone`:e,tt=()=>{var e;let t=((e=window)==null?void 0:e.adthrive)&&`deviceType`in window.adthrive&&window.adthrive.deviceType||null;return t&&Object.values($e).includes(t)?t:null},nt=N((e,t)=>{let n=Qe(e),r=t==null?n:t;return et(r===`tablet`&&n!==r?n:r)}),rt=(e=navigator.userAgent)=>nt(e,tt()),F=(e=navigator.userAgent)=>rt(e)===`phone`;var it,I=class{static _scheduleViewportUpdate(){this._rafId===null&&(this._rafId=window.requestAnimationFrame(()=>{this._rafId=null,this._updateViewportRects()}))}static _updateViewportRects(){if(this._trackedElements.size===0){this._detachViewportListeners();return}let e=[];this._trackedElements.forEach(t=>{if(!t.isConnected){e.push(t);return}this._cachedRects.set(t,t.getBoundingClientRect())}),e.forEach(e=>{this._trackedElements.delete(e),this._cachedRects.delete(e)}),this._trackedElements.size===0&&this._detachViewportListeners()}static _attachViewportListeners(){this._listenersAttached||(window.addEventListener(`scroll`,this._viewportListener,{passive:!0}),window.addEventListener(`resize`,this._viewportListener),this._listenersAttached=!0)}static _detachViewportListeners(){this._listenersAttached&&(window.removeEventListener(`scroll`,this._viewportListener),window.removeEventListener(`resize`,this._viewportListener),this._listenersAttached=!1)}static trackViewportElement(e){e&&(this._trackedElements.has(e)||(this._trackedElements.add(e),this._attachViewportListeners(),this._scheduleViewportUpdate()))}static untrackViewportElement(e){e&&(this._trackedElements.delete(e),this._cachedRects.delete(e),this._trackedElements.size===0&&this._detachViewportListeners())}static getCachedRect(e){return this._cachedRects.get(e)}static getScrollTop(){return(window.pageYOffset||document.documentElement.scrollTop)-(document.documentElement.clientTop||0)}static getScrollBottom(){let e=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight||0;return this.getScrollTop()+e}static shufflePlaylist(e){let t=e.length,n,r;for(;t!==0;)r=Math.floor(Math.random()*e.length),--t,n=e[t],e[t]=e[r],e[r]=n;return e}static isMobileLandscape(){return window.matchMedia(`(orientation: landscape) and (max-height: 480px)`).matches}static playerViewable(e){let t=this._cachedRects.get(e),n=t==null?e.getBoundingClientRect():t;return this.playerViewableFromRect(n)}static playerViewableFromRect(e){return this.isMobileLandscape()?window.innerHeight>e.top+e.height/2&&e.top+e.height/2>0:window.innerHeight>e.top+e.height/2}static createQueryString(e){return Object.keys(e).map(t=>`${t}=${e[t]}`).join(`&`)}static createEncodedQueryString(e){return Object.keys(e).map(t=>`${t}=${encodeURIComponent(e[t])}`).join(`&`)}static setMobileLocation(e,t=!1){e=e||`bottom-right`;let n=t?`raptive-player-sticky`:`adthrive-collapse`;return e===`top-left`?e=`${n}-top-left`:e===`top-right`?e=`${n}-top-right`:e===`bottom-left`?e=`${n}-bottom-left`:e===`bottom-right`?e=`${n}-bottom-right`:e===`top-center`&&(e=`adthrive-collapse-${F()?`top-center`:`bottom-right`}`),e}static addMaxResolutionQueryParam(e){let t=`max_resolution=${F()?`320`:`1280`}`,[n,r]=String(e).split(`?`);return`${n}?${r?r+`&${t}`:t}`}};it=I,M(I,`_trackedElements`,new Set),M(I,`_cachedRects`,new WeakMap),M(I,`_rafId`,null),M(I,`_listenersAttached`,!1),M(I,`_viewportListener`,()=>{it._scheduleViewportUpdate()});let L=(e,t)=>e==null||e!==e?t:e;var at=class{constructor(e){this._clsOptions=e,M(this,`relatedSettings`,void 0),M(this,`players`,void 0),M(this,`removeVideoTitleWrapper`,void 0),M(this,`footerSelector`,void 0),this.removeVideoTitleWrapper=L(this._clsOptions.siteAds.adOptions.removeVideoTitleWrapper,!1);let t=this._clsOptions.siteAds.videoPlayers;this.footerSelector=L(t&&t.footerSelector,``),this.players=L(t&&t.players.map(e=>(e.mobileLocation=I.setMobileLocation(e.mobileLocation),e)),[]),this.relatedSettings=t&&t.contextual}},ot=class{constructor(e){M(this,`mobileStickyPlayerOnPage`,!1),M(this,`collapsiblePlayerOnPage`,!1),M(this,`playlistPlayerAdded`,!1),M(this,`relatedPlayerAdded`,!1),M(this,`collapseSettings`,void 0),M(this,`footerSelector`,``),M(this,`removeVideoTitleWrapper`,!1),M(this,`desktopCollapseSettings`,void 0),M(this,`mobileCollapseSettings`,void 0),M(this,`relatedSettings`,void 0),M(this,`playerId`,void 0),M(this,`playlistId`,void 0),M(this,`desktopRelatedCollapseSettings`,void 0),M(this,`mobileRelatedCollapseSettings`,void 0),M(this,`collapsePlayerId`,void 0),M(this,`players`,void 0),M(this,`videoAdOptions`,void 0),this.videoAdOptions=new at(e),this.players=this.videoAdOptions.players,this.relatedSettings=this.videoAdOptions.relatedSettings,this.removeVideoTitleWrapper=this.videoAdOptions.removeVideoTitleWrapper,this.footerSelector=this.videoAdOptions.footerSelector}};let st=e=>{let t=e.clientWidth;if(getComputedStyle){let n=getComputedStyle(e,null);t-=parseFloat(n.paddingLeft||`0`)+parseFloat(n.paddingRight||`0`)}return t};var ct=class{},lt=class extends ct{constructor(e){super(),this._probability=e}get(){if(this._probability<0||this._probability>1)throw Error(`Invalid probability: ${this._probability}`);return Math.random()<this._probability}},ut=class{constructor(){M(this,`_featureRollouts`,{}),M(this,`_checkedFeatureRollouts`,new Map),M(this,`_enabledFeatureRolloutIds`,[])}get siteFeatureRollouts(){return this._featureRollouts}_isRolloutEnabled(e){if(this._doesRolloutExist(e)){let t=this._featureRollouts[e],n=t.enabled,r=t.data;if(this._doesRolloutHaveConfig(e)&&this._isFeatureRolloutConfigType(r)){let e=r.pct_enabled?r.pct_enabled/100:1;n=n&&new lt(e).get()}return n}return!1}isRolloutEnabled(e){var t;let n=(t=this._checkedFeatureRollouts.get(e))==null?this._isRolloutEnabled(e):t;return this._checkedFeatureRollouts.get(e)===void 0&&this._checkedFeatureRollouts.set(e,n),n}isRolloutAdministrativelyEnabled(e){return this._doesRolloutExist(e)&&this._featureRollouts[e].enabled}_doesRolloutExist(e){return this._featureRollouts&&!!this._featureRollouts[e]}_doesRolloutHaveConfig(e){return this._doesRolloutExist(e)&&`data`in this._featureRollouts[e]}_isFeatureRolloutConfigType(e){return typeof e==`object`&&!!e&&!!Object.keys(e).length}getSiteRolloutConfig(e){var t;let n=this.isRolloutEnabled(e),r=(t=this._featureRollouts[e])==null?void 0:t.data;return n&&this._doesRolloutHaveConfig(e)&&this._isFeatureRolloutConfigType(r)?r:{}}get enabledFeatureRolloutIds(){return this._enabledFeatureRolloutIds}},dt=class extends ut{constructor(e){super(),this._featureRollouts=e,this._setEnabledFeatureRolloutIds()}_setEnabledFeatureRolloutIds(){Object.entries(this._featureRollouts).forEach(([e,t])=>{this.isRolloutEnabled(e)&&t.featureRolloutId!==void 0&&this._enabledFeatureRolloutIds.push(t.featureRolloutId)})}},R;let ft=new dt(window.adthriveCLS&&window.adthriveCLS.siteAds&&`featureRollouts`in window.adthriveCLS.siteAds?(R=window.adthriveCLS.siteAds.featureRollouts)==null?{}:R:{}),pt=[[728,90],[300,250],[300,600],[320,50],[970,250],[160,600],[300,1050],[336,280],[970,90],[300,50],[320,100],[468,60],[250,250],[120,240],[1,1],[300,300],[300,420],[728,250],[320,300],[300,390]],mt=new Map([[A.Footer,1],[A.Header,2],[A.Sidebar,3],[A.Content,4],[A.Recipe,5],[`Sidebar_sticky`,6],[`Below Post`,7]]),ht=e=>pt.filter(([t,n])=>e.some(([e,r])=>t===e&&n===r)),gt=(e,[t,n],r)=>{let{location:i,sequence:a}=e;if(i===A.Footer)return!(r===`phone`&&t===320&&n===100);if(i===A.Header)return!0;if(i===A.Recipe)return!(F()&&r===`phone`&&(t===300&&n===390||t===320&&n===300));if(i===A.Sidebar){let t=e.adSizes.some(([,e])=>e<=300),r=!!a&&a<=5,i=n>300;return i&&!t||a===9?!0:r?i?e.sticky:!0:!i}else return!0},_t=(e,t)=>{let{location:n,sticky:r}=e;if(n===A.Recipe&&t){let{recipeMobile:e,recipeDesktop:n}=t;if(F()&&e!=null&&e.enabled||!F()&&n!=null&&n.enabled)return!0}return n===A.Footer||r},vt=(e,t)=>{let n=t.adUnits,r=ft.isRolloutEnabled(`enable-250px-max-ad-height`);return n.filter(e=>e.dynamic!==void 0&&e.dynamic.enabled).map(n=>{let i=n.location.replace(/\s+/g,`_`),a=i===`Sidebar`?0:2;i===A.Content&&r&&Ge()&&(n.adSizes=n.adSizes.filter(e=>e[1]<=250));let o=[];for(let e of L(n.targeting,[])){let t=e;t.key===`special`&&o.push(...t.value)}return{auctionPriority:mt.get(i)||8,location:i,sequence:L(n.sequence,1),thirdPartyAdUnitName:n.thirdPartyAdUnitName||``,sizes:ht(n.adSizes).filter(t=>gt(n,t,e)),devices:n.devices,pageSelector:L(n.dynamic.pageSelector,``).trim(),elementSelector:L(n.dynamic.elementSelector,``).trim(),position:L(n.dynamic.position,`beforebegin`),max:Math.floor(L(n.dynamic.max,0)),spacing:L(n.dynamic.spacing,0),skip:Math.floor(L(n.dynamic.skip,0)),every:Math.max(Math.floor(L(n.dynamic.every,1)),1),classNames:n.dynamic.classNames||[],sticky:_t(n,t.adOptions.stickyContainerConfig),stickyOverlapSelector:L(n.stickyOverlapSelector,``).trim(),autosize:n.autosize,special:o,lazy:L(n.dynamic.lazy,!1),lazyMax:L(n.dynamic.lazyMax,a),lazyMaxDefaulted:n.dynamic.lazyMax===0?!1:!n.dynamic.lazyMax,name:n.name}})},yt=(e,t)=>{let n=st(t),r=e.sticky&&e.location===A.Sidebar;return e.sizes.filter(t=>{let i=e.autosize?t[0]<=n||t[0]<=320:!0,a=r?t[1]<=window.innerHeight-100:!0;return i&&a})},bt=(e,t)=>e.devices.includes(t),xt=e=>e.pageSelector.length===0||document.querySelector(e.pageSelector)!==null,z=new class{info(e,t,...n){this.call(console.info,e,t,...n)}warn(e,t,...n){this.call(console.warn,e,t,...n)}error(e,t,...n){this.call(console.error,e,t,...n),this.sendErrorLogToCommandQueue(e,t,...n)}event(e,t,...n){var r;((r=window.adthriveCLS)==null?void 0:r.bucket)===`debug`&&this.info(e,t)}sendErrorLogToCommandQueue(e,t,...n){window.adthrive=window.adthrive||{},window.adthrive.cmd=window.adthrive.cmd||[],window.adthrive.cmd.push(()=>{window.adthrive.logError!==void 0&&typeof window.adthrive.logError==`function`&&window.adthrive.logError(e,t,n)})}call(e,t,n,...r){let i=[`%c${t}::${n} `],a=[`color: #999; font-weight: bold;`];r.length>0&&typeof r[0]==`string`&&i.push(r.shift()),a.push(...r);try{Function.prototype.apply.call(e,console,[i.join(``),...a])}catch(e){console.error(e);return}}},B={Desktop:`desktop`,Mobile:`mobile`},St=e=>{let t=document.body,n=`adthrive-device-${e}`;if(!t.classList.contains(n))try{t.classList.add(n)}catch(e){z.error(`BodyDeviceClassComponent`,`init`,{message:e.message});let t=`classList`in document.createElement(`_`);z.error(`BodyDeviceClassComponent`,`init.support`,{support:t})}},V=e=>`adthrive-${e.location.replace(`_`,`-`).toLowerCase()}`,Ct=e=>`${V(e)}-${e.sequence}`,wt=(e,t)=>window.matchMedia(`(min-width: ${t}px)`).matches?`desktop`:window.matchMedia(`(min-width: ${e}px)`).matches?`tablet`:`phone`,Tt=e=>{let t=e.offsetHeight,n=e.offsetWidth,r=e.getBoundingClientRect(),i=document.body,a=document.documentElement,o=window.pageYOffset||a.scrollTop||i.scrollTop,s=window.pageXOffset||a.scrollLeft||i.scrollLeft,c=a.clientTop||i.clientTop||0,l=a.clientLeft||i.clientLeft||0,u=Math.round(r.top+o-c),d=Math.round(r.left+s-l);return{top:u,left:d,bottom:u+t,right:d+n,width:n,height:t}},Et=(e=document)=>(e===document?document.body:e).getBoundingClientRect().top,Dt=e=>e.includes(`,`)?e.split(`,`):[e],Ot=(e=document)=>{let t=e.querySelectorAll(`article`);if(t.length===0)return null;let n=Array.from(t).reduce((e,t)=>t.offsetHeight>e.offsetHeight?t:e);return n&&n.offsetHeight>window.innerHeight*1.5?n:null},kt=(e,t,n=document)=>{let r=new Set(t.map.map(({el:e})=>e)),i=Ot(n),a=i?[i]:[],o=[];e.forEach(e=>{let t=Array.from(n.querySelectorAll(e.elementSelector)).slice(0,e.skip);Dt(e.elementSelector).forEach(i=>{let s=n.querySelectorAll(i);for(let n=0;n<s.length;n++){let i=s[n];if(r.has(i))continue;let c=i&&i.parentElement;c&&c!==document.body?a.push(c):a.push(i),t.indexOf(i)===-1&&o.push({dynamicAd:e,element:i})}})});let s=Et(n),c=o.map(e=>({item:e,top:e.element.getBoundingClientRect().top-s}));return c.sort((e,t)=>e.top-t.top),[a,c.map(({item:e})=>e)]},At=(e,t,n=document)=>{let[r,i]=kt(e,t,n);return r.length===0?[null,i]:[Array.from(r).reduce((e,t)=>t.offsetHeight>e.offsetHeight?t:e)||document.body,i]},jt=(e,t=`div #comments, section .comments`)=>{let n=e.querySelector(t);return n?e.offsetHeight-n.offsetHeight:e.offsetHeight},Mt=()=>{let e=document.body,t=document.documentElement;return Math.max(e.scrollHeight,e.offsetHeight,t.clientHeight,t.scrollHeight,t.offsetHeight)},Nt=()=>{let e=document.body,t=document.documentElement;return Math.max(e.scrollWidth,e.offsetWidth,t.clientWidth,t.scrollWidth,t.offsetWidth)};function Pt(e,t){t===void 0&&(t={});var n=t.insertAt;if(!(!e||typeof document>`u`)){var r=document.head||document.getElementsByTagName(`head`)[0],i=document.createElement(`style`);i.type=`text/css`,n===`top`&&r.firstChild?r.insertBefore(i,r.firstChild):r.appendChild(i),i.styleSheet?i.styleSheet.cssText=e:i.appendChild(document.createTextNode(e))}}var Ft=Pt;let It=e=>Ft(` .adthrive-device-phone .adthrive-sticky-content { height: 450px !important; margin-bottom: 100px !important; } .adthrive-content.adthrive-sticky { position: -webkit-sticky; position: sticky !important; top: 42px !important; margin-top: 42px !important; } .adthrive-content.adthrive-sticky:after { content: "— Advertisement. Scroll down to continue. —"; font-size: 10pt; margin-top: 5px; margin-bottom: 5px; display:block; color: #888; } .adthrive-sticky-container { position: relative; display: flex; flex-direction: column; justify-content: flex-start; align-items: center; min-height:${e||400}px; margin: 10px 0 10px 0; background-color: #FAFAFA; padding-bottom:0px; } `),Lt=e=>{Ft(` .adthrive-recipe.adthrive-sticky { position: -webkit-sticky; position: sticky !important; top: 42px !important; margin-top: 42px !important; } .adthrive-recipe-sticky-container { position: relative; display: flex; flex-direction: column; justify-content: flex-start; align-items: center; min-height:${e||400}px !important; margin: 10px 0 10px 0; background-color: #FAFAFA; padding-bottom:0px; } `)},Rt=e=>e.some(e=>document.querySelector(e)!==null),zt=e=>/^[-_a-zA-Z]+[-_a-zA-Z0-9]*$/.test(e),Bt=(e,t,n)=>{let r=e=>e?!!(e.classList.contains(`adthrive-ad`)||e.id.includes(`_${n}_`)):!1;switch(t){case`beforebegin`:return r(e.previousElementSibling);case`afterend`:return r(e.nextElementSibling);case`afterbegin`:return r(e.firstElementChild);case`beforeend`:return r(e.lastElementChild);default:return!1}};function Vt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function H(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?Vt(Object(n),!0).forEach(function(t){M(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Vt(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}let Ht=e=>{try{return{valid:!0,elements:document.querySelectorAll(e)}}catch(e){return H({valid:!1},e)}},Ut=e=>e===``?{valid:!0}:Ht(e),Wt=(e,t)=>Math.random()*(t-e)+e;var U=class e extends ct{constructor(e=[],t){super(),this._choices=e,this._default=t}static fromArray(t,n){return new e(t.map(([e,t])=>({choice:e,weight:t})),n)}addChoice(e,t){this._choices.push({choice:e,weight:t})}get(){let e=Wt(0,100),t=0;for(let{choice:n,weight:r}of this._choices)if(t+=r,t>=e)return n;return this._default}get totalWeight(){return this._choices.reduce((e,{weight:t})=>e+t,0)}};let W={AdDensity:`addensity`,AdLayout:`adlayout`,FooterCloseButton:`footerclose`,Interstitial:`interstitial`,RemoveVideoTitleWrapper:`removevideotitlewrapper`,StickyOutstream:`stickyoutstream`,StickyOutstreamOnStickyPlayer:`sospp`,VideoAdvancePlaylistRelatedPlayer:`videoadvanceplaylistrp`,MobileStickyPlayerPosition:`mspp`};var Gt=class{constructor(){M(this,`name`,void 0),M(this,`disable`,void 0),M(this,`gdprPurposes`,void 0)}};let Kt=`__adthriveTcfApiStub`,qt=`__tcfapiLocator`,Jt=`getTCData`,G=[],Yt=!1,Xt,K=e=>typeof e==`function`&&!!e[Kt],Zt=(e,t=2)=>{let n=G.findIndex(([n,r,i])=>n===Jt&&r===t&&i===e);return n===-1?!1:(G.splice(n,1),!0)},Qt=()=>{let e=()=>{if(document.querySelector(`iframe[name="${qt}"]`))return;if(!document.body){setTimeout(e,5);return}let t=document.createElement(`iframe`);t.style.cssText=`display:none`,t.name=qt,document.body.appendChild(t)};e()},q=()=>{let e=window.__tcfapi;return typeof e==`function`&&!K(e)?e:void 0},$t=()=>{let e=q();if(e)for(;G.length>0;){let t=G.shift();if(t)try{e(t[0],t[1],t[2],t[3])}catch(e){e instanceof Error&&e.message}}},en=()=>{if(Yt)return;if(Yt=!0,q()){$t();return}let e=window.__tcfapi;Object.defineProperty(window,`__tcfapi`,{configurable:!0,enumerable:!0,get:()=>e,set:t=>{e=t,typeof t==`function`&&!K(t)&&$t()}})},tn=()=>{let e=(e,t=2,n,r)=>{if(e===void 0)return G;switch(e){case`ping`:typeof n==`function`&&n({gdprApplies:Xt,cmpLoaded:!1,cmpStatus:`stub`,apiVersion:`2.0`},!0);return;case`setGdprApplies`:parseInt(String(t),10)>=2&&typeof r==`boolean`&&(Xt=r,typeof n==`function`&&n(`set`,!0));return;default:G.push([e,t,n,r])}};return Object.defineProperty(e,Kt,{value:!0,configurable:!1,enumerable:!1,writable:!1}),e},nn=()=>{window.addEventListener(`message`,e=>{let t=typeof e.data==`string`,n={};if(t)try{n=JSON.parse(e.data)}catch(e){return}else n=e.data;let r=typeof n==`object`&&n?n.__tcfapiCall:void 0;if(!r)return;let i=e.source;window.__tcfapi(r.command,r.version,(e,n)=>{let a={__tcfapiReturn:{returnValue:e,success:n,callId:r.callId}};i==null||i.postMessage(t?JSON.stringify(a):a,`*`)},r.parameter)},!1)},rn=()=>{if(en(),q())return!1;let e=!1;return K(window.__tcfapi)||(window.__tcfapi=tn(),nn(),e=!0),Qt(),window.__tcfapiQueue=G,e},an=(e,t=2,n,r)=>{if(e===void 0)return;let i=q();i?i(e,t,n,r):(G.push([e,t,n,r]),rn())};function on(e,t,n,r,i,a,o){try{var s=e[a](o),c=s.value}catch(e){n(e);return}s.done?t(c):Promise.resolve(c).then(r,i)}function J(e){return function(){var t=this,n=arguments;return new Promise(function(r,i){var a=e.apply(t,n);function o(e){on(a,r,i,o,s,`next`,e)}function s(e){on(a,r,i,o,s,`throw`,e)}o(void 0)})}}let Y=1e4,sn=e=>Array.isArray(e)?e:[e],cn=(e,t)=>e.reduce((e,n)=>(e[String(n)]=n in t,e),{}),ln=(e,t=2,n,r)=>{an(e,t,n,r)},X=(e=Y)=>new Promise((t,n)=>{let r,i=!1,a=(e,a)=>{i||(i=!0,r&&clearTimeout(r),a&&e?t(e):n(Error(`Failed to retrieve TCData`)))};e>0&&(r=setTimeout(()=>{i||(i=!0,Zt(a,2),n(Error(`TCF API request timed out`)))},e)),ln(Jt,2,a)});(function(){var e=J(function*(e,t=Y){let n=sn(e);try{var r,i;return cn(n,(r=(i=(yield X(t)).vendor)==null?void 0:i.consents)==null?{}:r)}catch(e){return e instanceof Error&&e.message,cn(n,{})}});return function(t){return e.apply(this,arguments)}})(),function(){var e=J(function*(e,t,n=Y){try{var r;let i=yield X(n),a=((r=i.vendor)==null||(r=r.consents)==null?void 0:r[e])===!0,o=!(t!=null&&t.length)||t.every(e=>{var t;return((t=i.purpose)==null||(t=t.consents)==null?void 0:t[e])===!0});return a&&o}catch(e){return e instanceof Error&&e.message,!1}});return function(t,n){return e.apply(this,arguments)}}();let un=[`mcmpfreqrec`],Z=new class extends Gt{constructor(...e){super(...e),M(this,`name`,`BrowserStorage`),M(this,`disable`,!1),M(this,`gdprPurposes`,[1]),M(this,`_sessionStorageHandlerQueue`,[]),M(this,`_localStorageHandlerQueue`,[]),M(this,`_cookieHandlerQueue`,[]),M(this,`_gdpr`,void 0),M(this,`_shouldQueue`,!1),M(this,`_storageConsentGranted`,void 0),M(this,`_gdprEvents`,void 0),M(this,`_storageConsentUpdateInFlight`,0),M(this,`_storageConsentBeforeLatestUpdate`,void 0)}init(e,t){this._gdpr=e.gdpr===`true`,this._shouldQueue=this._gdpr,this._gdprEvents=t,this._gdpr&&t&&(t.consentResponseCaptured.on(()=>{this._refreshStorageConsent(`consentResponseCaptured`)}),t.consentChanged.on(()=>{this._refreshStorageConsent(`consentChanged`)}))}_refreshStorageConsent(e){this._storageConsentBeforeLatestUpdate=this._storageConsentGranted,this._storageConsentUpdateInFlight+=1,this._updateStorageConsent().catch(e=>{}).finally(()=>{this._storageConsentUpdateInFlight=Math.max(0,this._storageConsentUpdateInFlight-1)})}_updateStorageConsent(){var e=this;return J(function*(){var t;let n=yield X();n&&(t=n.purpose)!=null&&t.consents&&(e._storageConsentGranted=n.purpose.consents[1]===!0)})()}clearQueue(e){let t=this._gdpr&&this._hasStorageConsent()===!1,n=e&&t&&this.disable===!1&&this._storageConsentUpdateInFlight>0&&this._storageConsentBeforeLatestUpdate===!1;n&&(this._storageConsentGranted=!0),e&&(!t||n)&&(this._shouldQueue=!1,this._sessionStorageHandlerQueue.forEach(e=>{this.setSessionStorage(e.key,e.value)}),this._localStorageHandlerQueue.forEach(e=>{if(e.key===`adthrive_abgroup`){let t=Object.keys(e.value)[0],n=e.value[t],r=e.value[`${t}_weight`];this.getOrSetABGroupLocalStorageValue(t,n,r,{value:24,unit:`hours`})}else e.expiry?e.type===`internal`?this.setExpirableInternalLocalStorage(e.key,e.value,{expiry:e.expiry,resetOnRead:e.resetOnRead}):this.setExpirableExternalLocalStorage(e.key,e.value,{expiry:e.expiry,resetOnRead:e.resetOnRead}):e.type===`internal`?this.setInternalLocalStorage(e.key,e.value):this.setExternalLocalStorage(e.key,e.value)}),this._cookieHandlerQueue.forEach(e=>{e.type===`internal`?this.setInternalCookie(e.key,e.value):this.setExternalCookie(e.key,e.value)})),this._sessionStorageHandlerQueue=[],this._localStorageHandlerQueue=[],this._cookieHandlerQueue=[]}readInternalCookie(e){return this._verifyInternalKey(e),this._readCookie(e)}readExternalCookie(e){return this._readCookie(e)}readExternalCookieList(e){return this._readCookieList(e)}getAllCookies(){return this._getCookies()}readInternalLocalStorage(e){return this._verifyInternalKey(e),this._readFromLocalStorage(e)}readExternalLocalStorage(e){return this._readFromLocalStorage(e)}readSessionStorage(e){let t=window.sessionStorage.getItem(e);if(!t)return null;try{return JSON.parse(t)}catch(e){return t}}deleteCookie(e){document.cookie=`${e}=; SameSite=None; Secure; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/`}deleteLocalStorage(e){window.localStorage.removeItem(e)}deleteSessionStorage(e){window.sessionStorage.removeItem(e)}_hasStorageConsent(){if(this._storageConsentGranted!==void 0)return this._storageConsentGranted}setInternalCookie(e,t,n){this.disable||(this._verifyInternalKey(e),this._setCookieValue(`internal`,e,t,n))}setExternalCookie(e,t,n){this.disable||this._setCookieValue(`external`,e,t,n)}setInternalLocalStorage(e,t){if(!this.disable)if(this._verifyInternalKey(e),this._gdpr&&this._shouldQueue){let n={key:e,value:t,type:`internal`};this._localStorageHandlerQueue.push(n)}else{let n=typeof t==`string`?t:JSON.stringify(t);window.localStorage.setItem(e,n)}}setExternalLocalStorage(e,t){if(!this.disable)if(this._gdpr&&this._shouldQueue){let n={key:e,value:t,type:`external`};this._localStorageHandlerQueue.push(n)}else{let n=typeof t==`string`?t:JSON.stringify(t);window.localStorage.setItem(e,n)}}setExpirableInternalLocalStorage(e,t,n){if(!this.disable){this._verifyInternalKey(e);try{var r,i;let a=(r=n==null?void 0:n.expiry)==null?{value:400,unit:`days`}:r,o=(i=n==null?void 0:n.resetOnRead)==null?!1:i;if(this._gdpr&&this._shouldQueue){let n={key:e,value:t,type:`internal`,expires:this._getExpiryDate(a),expiry:a,resetOnRead:o};this._localStorageHandlerQueue.push(n)}else{let n={value:t,type:`internal`,expires:this._getExpiryDate(a),expiry:a,resetOnRead:o};window.localStorage.setItem(e,JSON.stringify(n))}}catch(e){console.error(e)}}}setExpirableExternalLocalStorage(e,t,n){if(!this.disable)try{var r,i;let a=(r=n==null?void 0:n.expiry)==null?{value:400,unit:`days`}:r,o=(i=n==null?void 0:n.resetOnRead)==null?!1:i;if(this._gdpr&&this._shouldQueue){let n={key:e,value:JSON.stringify(t),type:`external`,expires:this._getExpiryDate(a),expiry:a,resetOnRead:o};this._localStorageHandlerQueue.push(n)}else{let n={value:t,type:`external`,expires:this._getExpiryDate(a),expiry:a,resetOnRead:o};window.localStorage.setItem(e,JSON.stringify(n))}}catch(e){console.error(e)}}setSessionStorage(e,t){if(!this.disable)if(this._gdpr&&this._shouldQueue){let n={key:e,value:t};this._sessionStorageHandlerQueue.push(n)}else{let n=typeof t==`string`?t:JSON.stringify(t);window.sessionStorage.setItem(e,n)}}getOrSetABGroupLocalStorageValue(e,t,n,r,i=!0){let a=`adthrive_abgroup`,o=this.readInternalLocalStorage(a);if(o!==null){var s;let t=o[e],n=(s=o[`${e}_weight`])==null?null:s;if(this._isValidABGroupLocalStorageValue(t))return[t,n]}let c=H(H({},o),{},{[e]:t,[`${e}_weight`]:n});return r?this.setExpirableInternalLocalStorage(a,c,{expiry:r,resetOnRead:i}):this.setInternalLocalStorage(a,c),[t,n]}_isValidABGroupLocalStorageValue(e){return e!=null&&!(typeof e==`number`&&isNaN(e))}_getExpiryDate({value:e,unit:t}){let n=new Date;return t===`milliseconds`?n.setTime(n.getTime()+e):t==`seconds`?n.setTime(n.getTime()+e*1e3):t===`minutes`?n.setTime(n.getTime()+e*60*1e3):t===`hours`?n.setTime(n.getTime()+e*60*60*1e3):t===`days`?n.setTime(n.getTime()+e*24*60*60*1e3):t===`months`&&n.setTime(n.getTime()+e*30*24*60*60*1e3),n.toUTCString()}_resetExpiry(e){return e.expires=this._getExpiryDate(e.expiry),e}_readCookie(e){let t=document.cookie.split(`; `).find(t=>t.split(`=`)[0]===e);if(!t)return null;let n=t.split(`=`)[1];if(n)try{return JSON.parse(decodeURIComponent(n))}catch(e){return decodeURIComponent(n)}return null}_readCookieList(e){let t;for(let n of document.cookie.split(`;`)){let[r,...i]=n.split(`=`);r.trim()===e&&(t=i.join(`=`).trim())}return t&&JSON.parse(t)||[]}_getCookies(){let e=[];return document.cookie.split(`;`).forEach(t=>{let[n,r]=t.split(`=`).map(e=>e.trim());e.push({name:n,value:r})}),e}_readFromLocalStorage(e){let t=window.localStorage.getItem(e);if(!t)return null;try{let r=JSON.parse(t),i=r.expires&&new Date().getTime()>=new Date(r.expires).getTime();if(e===`adthrive_abgroup`&&r.created)return window.localStorage.removeItem(e),null;if(r.resetOnRead&&r.expires&&!i){var n;let t=this._resetExpiry(r);return window.localStorage.setItem(e,JSON.stringify(r)),(n=t.value)==null?t:n}else if(i)return window.localStorage.removeItem(e),null;if(Object.prototype.hasOwnProperty.call(r,`value`))try{return JSON.parse(r.value)}catch(e){return r.value}else return r}catch(e){return t}}_setCookieValue(e,t,n,r){try{if(this._gdpr&&this._shouldQueue){let r={key:t,value:n,type:e};this._cookieHandlerQueue.push(r)}else{var i,a,o;let e=this._getExpiryDate((i=r==null?void 0:r.expiry)==null?{value:400,unit:`days`}:i),s=(a=r==null?void 0:r.sameSite)==null?`None`:a,c=(o=r==null?void 0:r.secure)==null?!0:o,l=typeof n==`object`?JSON.stringify(n):n;document.cookie=`${t}=${l}; SameSite=${s}; ${c?`Secure;`:``} expires=${e}; path=/`}}catch(e){}}_verifyInternalKey(e){let t=e.startsWith(`adthrive_`),n=e.startsWith(`adt_`);if(!t&&!n&&!un.includes(e))throw Error(`When reading an internal cookie, the key must start with "adthrive_" or "adt_" or be part of the allowed legacy keys.`)}},dn=e=>{let t=5381,n=e.length;for(;n;)t=t*33^e.charCodeAt(--n);return t>>>0},fn=e=>dn(e).toString(16),pn=e=>{if(e===null)return null;let t=e.map(({choice:e})=>e);return fn(JSON.stringify(t))},mn=(e,t)=>{var n,r;return(n=(r=e.find(({choice:e})=>e===t))==null?void 0:r.weight)==null?null:n},hn=e=>e!=null&&!(typeof e==`number`&&isNaN(e)),gn=(e,t)=>{let n=pn(e._choices),r=e._expConfigABGroup?e._expConfigABGroup:e.abgroup,i=r?r.toLowerCase():e.key?e.key.toLowerCase():``,a=n?`${i}_${n}`:i,o=e.localStoragePrefix?`${e.localStoragePrefix}-${a}`:a,s=`gdprEnabled`in window.adthrive?window.adthrive.gdprEnabled:window.adthrive.gdpr===`true`;if([W.AdLayout,W.AdDensity].includes(i)&&s)return t();let c=Z.readInternalLocalStorage(`adthrive_branch`);(c&&c.enabled)===!1&&Z.deleteLocalStorage(o);let l=t(),u=mn(e._choices,l),[d,f]=Z.getOrSetABGroupLocalStorageValue(o,l,u,{value:24,unit:`hours`});return e._stickyResult=d,e._stickyWeight=f,d},_n=()=>(e,t,n)=>{let r=n.value;r&&(n.value=function(...e){return gn(this,()=>r.apply(this,e))})},vn=(e=window.location.search)=>{let t=e.indexOf(`?`)===0?1:0;return e.slice(t).split(`&`).reduce((e,t)=>{let[n,r]=t.split(`=`);return e.set(n,r),e},new Map)},yn=e=>{let t={},n=vn().get(e);if(n)try{let r=decodeURIComponent(n).replace(/\+/g,``);t=JSON.parse(r),z.event(`ExperimentOverridesUtil`,`getExperimentOverrides`,e,t)}catch(e){e instanceof URIError}return t},bn=(e,t)=>typeof e==typeof t,xn=(e,t)=>{let n=e.adDensityEnabled,r=e.adDensityLayout.pageOverrides.find(e=>!!document.querySelector(e.pageSelector)&&(e[t].onePerViewport||typeof e[t].adDensity==`number`));return n?!r:!0},Sn=e=>{var t;let n=(t=e.videoPlayers)==null||(t=t.partners)==null||(t=t.stickyOutstream)==null?void 0:t.blockedPageSelectors;return n?!document.querySelector(n):!0},Cn=e=>{let t=e.adOptions.interstitialBlockedPageSelectors;return t?!document.querySelector(t):!0},wn=(e,t,n)=>{switch(t){case W.AdDensity:return xn(e,n);case W.StickyOutstream:return Sn(e);case W.Interstitial:return Cn(e);default:return!0}},Tn=e=>e.length===1,En=e=>{let t=e.reduce((e,t)=>t.weight?t.weight+e:e,0);return e.length>0&&e.every(e=>{let t=e.value,n=e.weight;return!!(t!=null&&!(typeof t==`number`&&isNaN(t))&&n)})&&t===100},Dn=(e,t)=>{if(!e)return!1;let n=!!e.enabled,r=e.dateStart==null||Date.now()>=e.dateStart,i=e.dateEnd==null||Date.now()<=e.dateEnd,a=e.selector===null||e.selector!==``&&!!document.querySelector(e.selector),o=e.platform===`mobile`&&t===`mobile`,s=e.platform===`desktop`&&t===`desktop`,c=e.platform===null||e.platform===`all`||o||s,l=e.experimentType===`bernoulliTrial`?Tn(e.variants):En(e.variants);return l||z.error(`SiteTest`,`validateSiteExperiment`,`experiment presented invalid choices for key:`,e.key,e.variants),n&&r&&i&&a&&c&&l};var On=class{constructor(e){var t,n;M(this,`siteExperiments`,[]),M(this,`_clsOptions`,void 0),M(this,`_device`,void 0),this._clsOptions=e,this._device=F()?`mobile`:`desktop`,this.siteExperiments=(t=(n=this._clsOptions.siteAds.siteExperiments)==null?void 0:n.filter(e=>{let t=e.key,n=Dn(e,this._device),r=wn(this._clsOptions.siteAds,t,this._device);return n&&r}))==null?[]:t}getSiteExperimentByKey(e){let t=this.siteExperiments.filter(t=>t.key.toLowerCase()===e.toLowerCase())[0],n=yn(`at_site_features`),r=bn(t!=null&&t.variants[1]?t==null?void 0:t.variants[1].value:t==null?void 0:t.variants[0].value,n[e]);return t&&n[e]&&r&&(t.variants=[{displayName:`test`,value:n[e],weight:100,id:0}]),t}},kn=class{constructor(){M(this,`experimentConfig`,void 0)}get enabled(){return this.experimentConfig!==void 0}_isValidResult(e,t=()=>!0){return t()&&hn(e)}},An=class extends kn{constructor(...e){super(...e),M(this,`_resultValidator`,()=>!0)}_isValidResult(e){return super._isValidResult(e,()=>this._resultValidator(e)||e===`control`)}run(){if(!this.enabled)return z.error(`CLSWeightedChoiceSiteExperiment`,`run`,`() => %o`,`No experiment config found. Defaulting to control.`),`control`;if(!this._mappedChoices||this._mappedChoices.length===0)return z.error(`CLSWeightedChoiceSiteExperiment`,`run`,`() => %o`,`No experiment variants found. Defaulting to control.`),`control`;let e=new U(this._mappedChoices).get();return this._isValidResult(e)?e:(z.error(`CLSWeightedChoiceSiteExperiment`,`run`,`() => %o`,`Invalid result from experiment choices. Defaulting to control.`),`control`)}};function jn(e,t,n,r){var i=arguments.length,a=i<3?t:r===null?r=Object.getOwnPropertyDescriptor(t,n):r,o;if(typeof Reflect==`object`&&typeof Reflect.decorate==`function`)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a}var Mn=class extends An{constructor(e){super(),M(this,`_choices`,[]),M(this,`_mappedChoices`,[]),M(this,`_result`,``),M(this,`_clsSiteExperiments`,void 0),M(this,`_resultValidator`,e=>typeof e==`string`),M(this,`key`,W.AdLayout),M(this,`abgroup`,W.AdLayout),this._clsSiteExperiments=new On(e),this.experimentConfig=this._clsSiteExperiments.getSiteExperimentByKey(this.key),this.enabled&&this.experimentConfig&&(this._choices=this.experimentConfig.variants,this._mappedChoices=this._mapChoices(),this._result=this.run(),e.setWeightedChoiceExperiment(this.abgroup,this._result,!0))}get result(){return this._result}run(){if(!this.enabled)return z.error(`CLSAdLayoutSiteExperiment`,`run`,`() => %o`,`No experiment config found. Defaulting to empty class name.`),``;let e=new U(this._mappedChoices).get();return this._isValidResult(e)?e:(z.error(`CLSAdLayoutSiteExperiment`,`run`,`() => %o`,`Invalid result from experiment choices. Defaulting to empty class name.`),``)}_mapChoices(){return this._choices.map(({weight:e,value:t})=>({weight:e,choice:t}))}};jn([_n()],Mn.prototype,`run`,null);var Nn=class extends An{constructor(e){super(),M(this,`_choices`,[]),M(this,`_mappedChoices`,[]),M(this,`_result`,`control`),M(this,`_clsSiteExperiments`,void 0),M(this,`_resultValidator`,e=>typeof e==`number`),M(this,`key`,W.AdDensity),M(this,`abgroup`,W.AdDensity),this._clsSiteExperiments=new On(e),this.experimentConfig=this._clsSiteExperiments.getSiteExperimentByKey(this.key),this.enabled&&this.experimentConfig&&(this._choices=this.experimentConfig.variants,this._mappedChoices=this._mapChoices(),this._result=this.run(),e.setWeightedChoiceExperiment(this.abgroup,this._result,!0))}get result(){return this._result}run(){if(!this.enabled)return z.error(`CLSTargetAdDensitySiteExperiment`,`run`,`() => %o`,`No experiment config found. Defaulting to control.`),`control`;let e=new U(this._mappedChoices).get();return this._isValidResult(e)?e:(z.error(`CLSTargetAdDensitySiteExperiment`,`run`,`() => %o`,`Invalid result from experiment choices. Defaulting to control.`),`control`)}_mapChoices(){return this._choices.map(({weight:e,value:t})=>({weight:e,choice:typeof t==`number`?(t||0)/100:`control`}))}};jn([_n()],Nn.prototype,`run`,null);let Q=`250px`;var Pn=class{constructor(e,t){this._clsOptions=e,this._adInjectionMap=t,M(this,`_recipeCount`,0),M(this,`_mainContentHeight`,0),M(this,`_mainContentDiv`,null),M(this,`_totalAvailableElements`,[]),M(this,`_minDivHeight`,250),M(this,`_densityDevice`,B.Desktop),M(this,`_pubLog`,{onePerViewport:!1,targetDensity:0,targetDensityUnits:0,combinedMax:0}),M(this,`_densityMax`,.99),M(this,`_smallerIncrementAttempts`,0),M(this,`_absoluteMinimumSpacingByDevice`,250),M(this,`_usedAbsoluteMinimum`,!1),M(this,`_infPageEndOffset`,0),M(this,`locationMaxLazySequence`,new Map([[A.Recipe,5]])),M(this,`locationToMinHeight`,{Below_Post:Q,Content:Q,Recipe:Q,Sidebar:Q}),M(this,`_device`,void 0),M(this,`_clsTargetAdDensitySiteExperiment`,void 0);let{tablet:n,desktop:r}=this._clsOptions.siteAds.breakpoints;this._device=wt(n,r),this._clsTargetAdDensitySiteExperiment=this._clsOptions.siteAds.siteExperiments?new Nn(this._clsOptions):null}start(){try{var e;St(this._device);let n=new Mn(this._clsOptions);if(n.enabled){let e=n.result,t=e.startsWith(`.`)?e.substring(1):e;if(zt(t))try{document.body.classList.add(t)}catch(e){z.error(`ClsDynamicAdsInjector`,`start`,`Uncaught CSS Class error: ${e}`)}else z.error(`ClsDynamicAdsInjector`,`start`,`Invalid class name: ${t}`)}let r=vt(this._device,this._clsOptions.siteAds).filter(e=>this._locationEnabled(e)).filter(e=>bt(e,this._device)).filter(e=>xt(e)),i=this.inject(r),a=this._clsOptions.siteAds.adOptions.stickyContainerConfig;if(!(a==null||(e=a.content)==null)&&e.enabled&&!Rt(a.blockedSelectors||[])){var t;It(a==null||(t=a.content)==null?void 0:t.minHeight)}i.forEach(e=>this._clsOptions.setInjectedSlots(e))}catch(e){z.error(`ClsDynamicAdsInjector`,`start`,e)}}inject(e,t=document){this._densityDevice=this._device===`desktop`?B.Desktop:B.Mobile,this._overrideDefaultAdDensitySettingsWithSiteExperiment();let n=this._clsOptions.siteAds,r=L(n.adDensityEnabled,!0),i=n.adDensityLayout&&r,a=e.filter(e=>i?e.location!==A.Content:e),o=e.filter(e=>i?e.location===A.Content:null);return this._capturePreSlotInsertionPageAreaMeasurement(),[...a.length?this._injectNonDensitySlots(a,t):[],...o.length?this._injectDensitySlots(o,t):[]]}_injectNonDensitySlots(e,t=document){var n;let r=[],i=[],a=!1;if(e.some(e=>e.location===A.Recipe&&e.sticky)&&!Rt(((n=this._clsOptions.siteAds.adOptions.stickyContainerConfig)==null?void 0:n.blockedSelectors)||[])){var o,s;let e=this._clsOptions.siteAds.adOptions.stickyContainerConfig;Lt(this._device===`phone`?e==null||(o=e.recipeMobile)==null?void 0:o.minHeight:e==null||(s=e.recipeDesktop)==null?void 0:s.minHeight),a=!0}for(let n of e)this._insertNonDensityAds(n,r,i,t);return a||i.forEach(({location:e,element:t})=>{t.style.minHeight=this.locationToMinHeight[e]}),r}_injectDensitySlots(e,t=document){try{this._calculateMainContentHeightAndAllElements(e,t),this._capturePreSlotInsertionMainContentMeasurement()}catch(e){return[]}let{onePerViewport:n,targetAll:r,targetDensityUnits:i,combinedMax:a,numberOfUnits:o}=this._getDensitySettings(e,t);return this._absoluteMinimumSpacingByDevice=n?window.innerHeight:this._absoluteMinimumSpacingByDevice,o?(this._adInjectionMap.filterUsed(),this._findElementsForAds(o,n,r,a,i,t),this._insertAds()):[]}_overrideDefaultAdDensitySettingsWithSiteExperiment(){var e;if((e=this._clsTargetAdDensitySiteExperiment)!=null&&e.enabled){let e=this._clsTargetAdDensitySiteExperiment.result;typeof e==`number`&&(this._clsOptions.siteAds.adDensityEnabled=!0,this._clsOptions.siteAds.adDensityLayout[this._densityDevice].adDensity=e)}}_getDensitySettings(e,t=document){let n=this._clsOptions.siteAds.adDensityLayout,r=this._determineOverrides(n.pageOverrides),i=r.length?r[0]:n[this._densityDevice],a=i.adDensity,o=i.onePerViewport,s=this._shouldTargetAllEligible(a),c=this._getTargetDensityUnits(a,s),l=this._getCombinedMax(e,t),u=Math.min(this._totalAvailableElements.length,c,...l>0?[l]:[]);return this._pubLog={onePerViewport:o,targetDensity:a,targetDensityUnits:c,combinedMax:l},{onePerViewport:o,targetAll:s,targetDensityUnits:c,combinedMax:l,numberOfUnits:u}}_determineOverrides(e){return e.filter(e=>{let t=Ut(e.pageSelector);return e.pageSelector===``||t.elements&&t.elements.length}).map(e=>e[this._densityDevice])}_shouldTargetAllEligible(e){return e===this._densityMax}_getTargetDensityUnits(e,t){return t?this._totalAvailableElements.length:Math.floor(e*this._mainContentHeight/(1-e)/this._minDivHeight)-this._recipeCount}_getCombinedMax(e,t=document){return L(e.filter(e=>{let n;try{n=t.querySelector(e.elementSelector)}catch(e){}return n}).map(e=>Number(e.max)+Number(e.lazyMaxDefaulted?0:e.lazyMax)).sort((e,t)=>t-e)[0],0)}_elementLargerThanMainContent(e){return e.offsetHeight>=this._mainContentHeight&&this._totalAvailableElements.length>1}_elementDisplayNone(e){let t=window.getComputedStyle(e,null).display;return t&&t===`none`||e.style.display===`none`}_isBelowMaxes(e,t){return this._adInjectionMap.map.length<e&&this._adInjectionMap.map.length<t}_findElementsForAds(e,t,n,r,i,a=document){this._clsOptions.targetDensityLog={onePerViewport:t,combinedMax:r,targetDensityUnits:i,targetDensityPercentage:this._pubLog.targetDensity,mainContentHeight:this._mainContentHeight,recipeCount:this._recipeCount,numberOfEls:this._totalAvailableElements.length};let o=t=>{for(let{dynamicAd:o,element:s}of this._totalAvailableElements)if(this._logDensityInfo(s,o.elementSelector,t),!(!n&&this._elementLargerThanMainContent(s)||this._elementDisplayNone(s)))if(this._isBelowMaxes(r,i)){if(this._checkElementSpacing({dynamicAd:o,element:s,insertEvery:t,targetAll:n,target:a}),this._hasReachedQuota(e))return}else break;this._hasReachedQuota(e)||!this._usedAbsoluteMinimum&&this._smallerIncrementAttempts<5&&(++this._smallerIncrementAttempts,o(this._getSmallerIncrement(t)))};o(this._getInsertEvery(e,t,i))}_hasReachedQuota(e){return this._adInjectionMap.map.length>=e}_getSmallerIncrement(e){let t=e*.6;return t<=this._absoluteMinimumSpacingByDevice&&(t=this._absoluteMinimumSpacingByDevice,this._usedAbsoluteMinimum=!0),t}_insertNonDensityAds(e,t,n,r=document){let i=0,a=0,o=0;e.spacing>0&&(i=window.innerHeight*e.spacing,a=i);let s=this._repeatDynamicAds(e),c=this.getElements(e.elementSelector,r);e.skip;for(let l=e.skip;l<c.length&&!(o+1>s.length);l+=e.every){let u=c[l];if(i>0){let{bottom:e}=Tt(u);if(e<=a)continue;a=e+i}let d=s[o],f=`${d.location}_${d.sequence}`;t.some(e=>e.name===f)&&(o+=1);let p=this.getDynamicElementId(d),m=V(e),h=Ct(e),g=[e.location===A.Sidebar&&e.sticky&&e.sequence&&e.sequence<=5?`adthrive-sticky-sidebar`:``,e.location===A.Recipe&&e.sticky?`adthrive-recipe-sticky-container`:``,m,h,...e.classNames];if(Bt(u,e.position,e.location)&&e.location===A.Recipe)continue;let _=this.addAd(u,p,e.position,g);if(_){let i=yt(d,_);if(i.length){let a={clsDynamicAd:e,dynamicAd:d,element:_,sizes:i,name:f,infinite:r!==document};t.push(a),n.push({location:d.location,element:_}),e.location===A.Recipe&&++this._recipeCount,o+=1}u=_}}}_insertAds(){let e=[],t=0;return this._adInjectionMap.filterUsed(),this._adInjectionMap.map.forEach(({el:n,dynamicAd:r,target:i},a)=>{let o=Number(r.sequence)+a,s=r.max,c=r.lazy&&o>s;r.sequence=o,r.lazy=c;let l=this._addContentAd(n,r,i);l&&(r.used=!0,e.push(l),++t)}),e}_getInsertEvery(e,t,n){let r=this._absoluteMinimumSpacingByDevice;return this._moreAvailableElementsThanUnitsToInject(n,e)?(this._usedAbsoluteMinimum=!1,r=this._useWiderSpacing(n,e)):(this._usedAbsoluteMinimum=!0,r=this._useSmallestSpacing(t)),t&&window.innerHeight>r?window.innerHeight:r}_useWiderSpacing(e,t){return this._mainContentHeight/Math.min(e,t)}_useSmallestSpacing(e){return e&&window.innerHeight>this._absoluteMinimumSpacingByDevice?window.innerHeight:this._absoluteMinimumSpacingByDevice}_moreAvailableElementsThanUnitsToInject(e,t){return this._totalAvailableElements.length>e||this._totalAvailableElements.length>t}_logDensityInfo(e,t,n){let{onePerViewport:r,targetDensity:i,targetDensityUnits:a,combinedMax:o}=this._pubLog;this._totalAvailableElements.length}_checkElementSpacing({dynamicAd:e,element:t,insertEvery:n,targetAll:r,target:i=document}){(this._isFirstAdInjected()||this._hasProperSpacing(t,e,r,n))&&this._markSpotForContentAd(t,H({},e),i)}_isFirstAdInjected(){return!this._adInjectionMap.map.length}_markSpotForContentAd(e,t,n=document){let r=t.position===`beforebegin`||t.position===`afterbegin`;this._adInjectionMap.addSorted(e,this._getElementCoords(e,r),t,n)}_hasProperSpacing(e,t,n,r){let i=t.position===`beforebegin`||t.position===`afterbegin`,a=t.position===`beforeend`||t.position===`afterbegin`,o=n||this._isElementFarEnoughFromOtherAdElements(e,r,i),s=a||this._isElementNotInRow(e,i),c=e.id.indexOf(`AdThrive_${A.Below_Post}`)===-1;return o&&s&&c}_isElementFarEnoughFromOtherAdElements(e,t,n){let r=this._getElementCoords(e,n),[i,a]=this._adInjectionMap.findNeighborIndices(r),o=i===null?void 0:this._adInjectionMap.map[i].coords,s=a===null?void 0:this._adInjectionMap.map[a].coords;return(o===void 0||r-t>o)&&(s===void 0||r+t<s)}_isElementNotInRow(e,t){let n=e.previousElementSibling,r=e.nextElementSibling,i=t?!n&&r||n&&e.tagName!==n.tagName?r:n:r;if(!i)return!0;let a=e.getBoundingClientRect();if(a.height===0)return!0;let o=i.getBoundingClientRect();return a.top!==o.top}_calculateMainContentHeightAndAllElements(e,t=document){let[n,r]=At(e,this._adInjectionMap,t);if(!n)throw Error(`No main content element found`);this._mainContentDiv=n,this._totalAvailableElements=r,this._mainContentHeight=jt(this._mainContentDiv)}_capturePreSlotInsertionMainContentMeasurement(){window.adthriveCLS&&(window.adthriveCLS.preSlotInsertionMeasurements?window.adthriveCLS.preSlotInsertionMeasurements.mainContentHeight=this._mainContentHeight:window.adthriveCLS.preSlotInsertionMeasurements={mainContentHeight:this._mainContentHeight})}_capturePreSlotInsertionPageAreaMeasurement(){if(window.adthriveCLS){let e=Mt()*Nt();window.adthriveCLS.preSlotInsertionMeasurements?window.adthriveCLS.preSlotInsertionMeasurements.totalPageArea=e:window.adthriveCLS.preSlotInsertionMeasurements={totalPageArea:e}}}_getElementCoords(e,t=!1){let n=e.getBoundingClientRect();return(t?n.top:n.bottom)+window.scrollY}_addContentAd(e,t,n=document){var r;let i=null,a=V(t),o=Ct(t),s=this._clsOptions.siteAds.adOptions.stickyContainerConfig,c=s==null||(r=s.content)==null?void 0:r.enabled,l=c?`adthrive-sticky-container`:``,u=this.addAd(e,this.getDynamicElementId(t),t.position,[l,a,o,...t.classNames]);if(u){let e=yt(t,u);if(e.length){var d;(!c||!(!(s==null||(d=s.content)==null)&&d.minHeight))&&(u.style.minHeight=this.locationToMinHeight[t.location]),i={clsDynamicAd:t,dynamicAd:t,element:u,sizes:e,name:`${t.location}_${t.sequence}`,infinite:n!==document}}}return i}getDynamicElementId(e){return`AdThrive_${e.location}_${e.sequence}_${this._device}`}getElements(e,t=document){return t.querySelectorAll(e)}addAd(e,t,n,r=[]){if(!document.getElementById(t)){let i=`<div id="${t}" class="adthrive-ad ${r.join(` `)}"></div>`;e.insertAdjacentHTML(n,i)}return document.getElementById(t)}_repeatDynamicAds(e){let t=[],n=e.location===A.Recipe?99:this.locationMaxLazySequence.get(e.location),r=e.lazy?L(n,0):0,i=e.max,a=e.lazyMax,o=r===0&&e.lazy?i+a:Math.min(Math.max(r-e.sequence+1,0),i+a),s=Math.max(i,o);for(let n=0;n<s;n++){let r=Number(e.sequence)+n,a=e.lazy&&n>=i,o=r;e.name===`Recipe_1`&&r>=5&&(o=r+1),t.push(H(H({},e),{},{sequence:o,lazy:a}))}return t}_locationEnabled(e){let t=this._clsOptions.enabledLocations.includes(e.location),n=this._clsOptions.disableAds&&this._clsOptions.disableAds.all||document.body.classList.contains(`adthrive-disable-all`),r=!document.body.classList.contains(`adthrive-disable-content`)&&!this._clsOptions.disableAds.reasons.has(`content_plugin`);return t&&!n&&r}},Fn=class{constructor(){M(this,`_map`,[])}add(e,t,n,r=document){this._map.push({el:e,coords:t,dynamicAd:n,target:r})}addSorted(e,t,n,r=document){let i=this._upperBoundIndex(t);this._map.splice(i,0,{el:e,coords:t,dynamicAd:n,target:r})}get map(){return this._map}sort(){this._map.sort(({coords:e},{coords:t})=>e-t)}filterUsed(){this._map=this._map.filter(({dynamicAd:e})=>!e.used)}findNeighborIndices(e){let t=this._upperBoundIndex(e);return[t-1>=0?t-1:null,t<this._map.length?t:null]}_upperBoundIndex(e){let t=0,n=this._map.length;for(;t<n;){let r=t+n>>>1;this._map[r].coords<=e?t=r+1:n=r}return t}reset(){this._map=[]}},In=class extends Fn{};let Ln=e=>{let t=qe(),n=Qe(),r=e.siteAdsProfiles,i=null;if(r&&r.length)for(let e of r){let r=e.targeting.device,a=e.targeting.browserEngine,o=r&&r.length&&r.includes(n),s=a&&a.length&&a.includes(t);o&&s&&(i=e)}return i},Rn=e=>{let t=Ln(e);if(t){let e=t.profileId;document.body.classList.add(`raptive-profile-${e}`)}},$={Video_Collapse_Autoplay_SoundOff:`Video_Collapse_Autoplay_SoundOff`,Video_Individual_Autoplay_SOff:`Video_Individual_Autoplay_SOff`,Video_Coll_SOff_Smartphone:`Video_Coll_SOff_Smartphone`,Video_In_Post_ClicktoPlay_SoundOn:`Video_In-Post_ClicktoPlay_SoundOn`,Video_Collapse_Autoplay_SoundOff_15s:`Video_Collapse_Autoplay_SoundOff_15s`,Video_Individual_Autoplay_SOff_15s:`Video_Individual_Autoplay_SOff_15s`,Video_Coll_SOff_Smartphone_15s:`Video_Coll_SOff_Smartphone_15s`,Video_In_Post_ClicktoPlay_SoundOn_15s:`Video_In-Post_ClicktoPlay_SoundOn_15s`};var zn=class{get enabled(){return!0}};let Bn=(e=navigator.userAgent)=>rt(e)===`desktop`;function Vn(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.includes(r))continue;n[r]=e[r]}return n}function Hn(e,t){if(e==null)return{};var n,r,i=Vn(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.includes(n)||{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}let Un=[`valid`,`elements`],Wn=[`valid`,`elements`];var Gn=class extends zn{constructor(e,t,n){super(),this._videoConfig=e,this._component=t,this._context=n,M(this,`_potentialPlayerMap`,void 0),M(this,`_device`,void 0),M(this,`_stickyRelatedOnPage`,!1),M(this,`_relatedMediaIds`,[]),this._device=Bn()?`desktop`:`mobile`,this._potentialPlayerMap=this.setPotentialPlayersMap()}setPotentialPlayersMap(){let e=this._videoConfig.players||[],t=this._filterPlayerMap();return t.stationaryRelated=e.filter(e=>e.type===`stationaryRelated`&&e.enabled),this._potentialPlayerMap=t,this._potentialPlayerMap}_filterPlayerMap(){let e=this._videoConfig.players,t={stickyRelated:[],stickyPlaylist:[],stationaryRelated:[]};return e&&e.length?e.filter(e=>{var t;return(t=e.devices)==null?void 0:t.includes(this._device)}).reduce((e,t)=>(e[t.type]||(z.event(this._component,`constructor`,`Unknown Video Player Type detected`,t.type),e[t.type]=[]),t.enabled&&e[t.type].push(t),e),t):t}_checkPlayerSelectorOnPage(e){for(let t of this._potentialPlayerMap[e]){let e=this._getPlacementElement(t);if(e)return{player:t,playerElement:e}}return{player:null,playerElement:null}}_getOverrideElement(e,t,n){if(e&&t){let r=document.createElement(`div`);t.insertAdjacentElement(e.position,r),n=r}else{let{player:e,playerElement:t}=this._checkPlayerSelectorOnPage(`stickyPlaylist`);if(e&&t){let r=document.createElement(`div`);t.insertAdjacentElement(e.position,r),n=r}}return n}_shouldOverrideElement(e){let t=e.getAttribute(`override-embed`);return t===`true`||t===`false`?t===`true`:this._videoConfig.relatedSettings?this._videoConfig.relatedSettings.overrideEmbedLocation:!1}_checkPageSelector(e,t,n=[]){return e&&t&&n.length===0?(window.location.pathname!==`/`&&z.event(`VideoUtils`,`getPlacementElement`,Error(`PSNF: ${e} does not exist on the page`)),!1):!0}_getElementSelector(e,t,n){return t&&t.length>n?t[n]:(z.event(`VideoUtils`,`getPlacementElement`,Error(`ESNF: ${e} does not exist on the page`)),null)}_getPlacementElement(e){let{pageSelector:t,elementSelector:n,skip:r}=e,i=Ut(t),{valid:a,elements:o}=i,s=Hn(i,Un),c=Ht(n),{valid:l,elements:u}=c,d=Hn(c,Wn);return t!==``&&!a?(z.error(`VideoUtils`,`getPlacementElement`,Error(`${t} is not a valid selector`),s),null):l?this._checkPageSelector(t,a,o)&&this._getElementSelector(n,u,r)||null:(z.error(`VideoUtils`,`getPlacementElement`,Error(`${n} is not a valid selector`),d),null)}_getEmbeddedPlayerType(e){let t=e.getAttribute(`data-player-type`);return(!t||t===`default`)&&(t=this._videoConfig.relatedSettings?this._videoConfig.relatedSettings.defaultPlayerType:`static`),this._stickyRelatedOnPage&&(t=`static`),t}_getMediaId(e){let t=e.getAttribute(`data-video-id`);return t?(this._relatedMediaIds.push(t),t):!1}_createRelatedPlayer(e,t,n,r){t===`collapse`?this._createCollapsePlayer(e,n):t===`static`&&this._createStaticPlayer(e,n,r)}_createCollapsePlayer(e,t){let{player:n,playerElement:r}=this._checkPlayerSelectorOnPage(`stickyRelated`),i=n||this._potentialPlayerMap.stationaryRelated[0];i&&i.playerId?(this._shouldOverrideElement(t)&&(t=this._getOverrideElement(n,r,t)),t=document.querySelector(`#cls-video-container-${e} > div`)||t,this._createStickyRelatedPlayer(H(H({},i),{},{mediaId:e}),t)):z.error(this._component,`_createCollapsePlayer`,`No video player found`)}_createStaticPlayer(e,t,n){if(this._potentialPlayerMap.stationaryRelated.length&&this._potentialPlayerMap.stationaryRelated[0].playerId){let r=this._potentialPlayerMap.stationaryRelated[0];this._createStationaryRelatedPlayer(H(H({},r),{},{mediaOrPlaylistId:e}),t,n)}else z.error(this._component,`_createStaticPlayer`,`No video player found`)}_shouldRunAutoplayPlayers(){return!!(this._isVideoAllowedOnPage()&&(this._potentialPlayerMap.stickyRelated.length||this._potentialPlayerMap.stickyPlaylist.length))}_setPlaylistMediaIdWhenStationaryOnPage(e,t){if(this._potentialPlayerMap.stationaryRelated.length&&this._potentialPlayerMap.stationaryRelated[0].playerId&&e&&e.length){let n=e[0].getAttribute(`data-video-id`);return n?H(H({},t),{},{mediaId:n}):t}return t}_determineAutoplayPlayers(e){let t=this._component,n=t===`VideoManagerComponent`,r=this._context;if(this._stickyRelatedOnPage){z.event(t,`stickyRelatedOnPage`,n&&{device:r&&r.device,isDesktop:this._device}||{});return}let{playerElement:i}=this._checkPlayerSelectorOnPage(`stickyPlaylist`),{player:a}=this._checkPlayerSelectorOnPage(`stickyPlaylist`);a&&a.playerId&&i?(a=this._setPlaylistMediaIdWhenStationaryOnPage(e,a),this._createPlaylistPlayer(a,i)):Math.random()<.01&&setTimeout(()=>{z.event(t,`noStickyPlaylist`,n&&{vendor:`none`,device:r&&r.device,isDesktop:this._device}||{})},1e3)}_initializeRelatedPlayers(e){let t=new Map;for(let n=0;n<e.length;n++){let r=e[n],i=r.offsetParent,a=this._getEmbeddedPlayerType(r),o=this._getMediaId(r);if(i&&o){let e=(t.get(o)||0)+1;t.set(o,e),this._createRelatedPlayer(o,a,r,e)}}}},Kn=class extends Gn{constructor(e,t){super(e,`ClsVideoInsertion`),this._videoConfig=e,this._clsOptions=t,M(this,`_IN_POST_SELECTOR`,`.adthrive-video-player`),M(this,`_WRAPPER_BAR_HEIGHT`,36),M(this,`_playersAddedFromPlugin`,[]),t.removeVideoTitleWrapper&&(this._WRAPPER_BAR_HEIGHT=0)}init(){this._initializePlayers()}_wrapVideoPlayerWithCLS(e,t,n=0){if(e.parentNode){let r=e.offsetWidth*(9/16),i=this._createGenericCLSWrapper(r,t,n);return e.parentNode.insertBefore(i,e),i.appendChild(e),i}return null}_createGenericCLSWrapper(e,t,n){let r=document.createElement(`div`);return r.id=`cls-video-container-${t}`,r.className=`adthrive`,r.style.minHeight=`${e+n}px`,r}_getTitleHeight(){let e=document.createElement(`h3`);e.style.margin=`10px 0`,e.innerText=`Title`,e.style.visibility=`hidden`,document.body.appendChild(e);let t=window.getComputedStyle(e),n=parseInt(t.height,10),r=parseInt(t.marginTop,10),i=parseInt(t.marginBottom,10);return document.body.removeChild(e),Math.min(n+i+r,50)}_initializePlayers(){let e=document.querySelectorAll(this._IN_POST_SELECTOR);e.length&&this._initializeRelatedPlayers(e),this._shouldRunAutoplayPlayers()&&this._determineAutoplayPlayers(e)}_createStationaryRelatedPlayer(e,t,n){let r=this._device===`mobile`?[400,225]:[640,360],i=$.Video_In_Post_ClicktoPlay_SoundOn;if(t&&e.mediaOrPlaylistId){let a=`${e.mediaOrPlaylistId}_${n}`,o=this._wrapVideoPlayerWithCLS(t,a);this._playersAddedFromPlugin.push(e.mediaOrPlaylistId),o&&this._clsOptions.setInjectedVideoSlots({playerId:e.playerId,playerName:i,playerSize:r,element:o,type:`stationaryRelated`})}}_createStickyRelatedPlayer(e,t){let n=this._device===`mobile`?[400,225]:[640,360],r=$.Video_Individual_Autoplay_SOff;if(this._stickyRelatedOnPage=!0,this._videoConfig.mobileStickyPlayerOnPage=this._device===`mobile`,this._videoConfig.collapsiblePlayerOnPage=!0,t&&e.position&&e.mediaId){let i=document.createElement(`div`);t.insertAdjacentElement(e.position,i);let a=this._getTitleHeight(),o=this._wrapVideoPlayerWithCLS(i,e.mediaId,this._WRAPPER_BAR_HEIGHT+a);this._playersAddedFromPlugin.push(e.mediaId),o&&this._clsOptions.setInjectedVideoSlots({playlistId:e.playlistId,playerId:e.playerId,playerSize:n,playerName:r,element:i,type:`stickyRelated`})}}_createPlaylistPlayer(e,t){let n=e.playlistId,r=this._device===`mobile`?$.Video_Coll_SOff_Smartphone:$.Video_Collapse_Autoplay_SoundOff,i=this._device===`mobile`?[400,225]:[640,360];this._videoConfig.mobileStickyPlayerOnPage=!0,this._videoConfig.collapsiblePlayerOnPage=!0;let a=document.createElement(`div`);t.insertAdjacentElement(e.position,a);let o=this._WRAPPER_BAR_HEIGHT;e.title&&(o+=this._getTitleHeight());let s=this._wrapVideoPlayerWithCLS(a,n,o);this._playersAddedFromPlugin.push(`playlist-${n}`),s&&this._clsOptions.setInjectedVideoSlots({playlistId:e.playlistId,playerId:e.playerId,playerSize:i,playerName:r,element:a,type:`stickyPlaylist`})}_isVideoAllowedOnPage(){let e=this._clsOptions.disableAds;if(e&&e.video){let t=``;e.reasons.has(`video_tag`)?t=`video tag`:e.reasons.has(`video_plugin`)?t=`video plugin`:e.reasons.has(`video_page`)&&(t=`command queue`);let n=t?`ClsVideoInsertionMigrated`:`ClsVideoInsertion`;return z.error(n,`isVideoAllowedOnPage`,Error(`DBP: Disabled by publisher via ${t||`other`}`)),!1}return!this._clsOptions.videoDisabledFromPlugin}};try{(()=>{let e=new We;!e||!e.enabled||(e.siteAds&&Rn(e.siteAds),new Pn(e,new In).start(),new Kn(new ot(e),e).init())})()}catch(e){z.error(`CLS`,`pluginsertion-iife`,e),window.adthriveCLS&&(window.adthriveCLS.injectedFromPlugin=!1)}})();</script><script data-no-optimize="1" data-cfasync="false">(function () {var clsElements = document.querySelectorAll("script[id^='cls-']"); window.adthriveCLS && clsElements && clsElements.length === 0 ? window.adthriveCLS.injectedFromPlugin = false : ""; })();</script><script type="speculationrules"> {"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/devxnew/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} </script> <script type="text/javascript"> jQuery(document).ready(function($) { function handleGeotargeting() { userCountry = userCountry.toLowerCase(), localizedStores.hasOwnProperty(userCountry) && (storeTarget = localizedStores[userCountry], storeTarget === storeCountry || trackingIds.hasOwnProperty(storeTarget) && (localTrackingId = trackingIds[storeTarget], update_amazon_links(storeCountry, storeTarget, localTrackingId))); } function getCountry() { getCountryFromApiGeoipdb(); } function getCountryFromApiGeoipdb() { var requestUrl = "https://geolocation-db.com/jsonp/"; (requestUrl = "https://geolocation-db.com/jsonp/"), jQuery.ajax({ url: requestUrl, jsonpCallback: "callback", dataType: "jsonp", success: function(response) { console.log(response); "undefined" != typeof response.IPv4 && "undefined" != typeof response.country_code && (userCountry = response.country_code, setGeotargetingCookie(userCountry)), handleGeotargeting(); } }); } function update_amazon_links(storeOld, storeNew, trackingId) { null !== trackingId && $("a[href*='/amazon'], a[href*='/www.amazon'], a[href*='/amzn'], a[href*='/www.amzn']").each(function(el) { var url = $(this).attr("href"); url = get_url_mode_title($(this), url, storeOld, storeNew), void 0 !== url && (url = replaceUrlParam(url, "tag", trackingId), $(this).attr("href", url)); }); } function get_url_mode_title(linkElement, url, storeOld, storeNew) { var productTitle = linkElement.data("post-title"); return productTitle || (productTitle = linkElement.parents().filter(function() { return $(this).data("post-title"); }).eq(0).data("post-title")), productTitle && (productTitle = getWords(productTitle, 5), url = "https://www.amazon." + storeNew + "/s/?field-keywords=" + encodeURIComponent(productTitle)), url; } function replaceUrlParam(url, paramName, paramValue) { null == paramValue && (paramValue = ""); var pattern = new RegExp("\\b(" + paramName + "=).*?(&|$)"); return url.search(pattern) >= 0 ? url.replace(pattern, "$1" + paramValue + "$2") : url + (url.indexOf("?") > 0 ? "&" : "?") + paramName + "=" + paramValue; } function getWords(str, max) { return str.split(/\s+/).slice(0, max).join(" "); } function setGeotargetingCookie(countryCode) { countryCode && setCookieAff("affiliatable-geotargeting", countryCode,1); } function setCookieAff(key, value, expiry) { var expires = new Date(); expires.setTime(expires.getTime() + (expiry * 24 * 60 * 60 * 1000)); document.cookie = key + '=' + value + ';expires=' + expires.toUTCString(); } function getCookieAff(key) { var keyValue = document.cookie.match('(^|;) ?' + key + '=([^;]*)(;|$)'); return keyValue ? keyValue[2] : 'Not found'; } function getGeotargetingDebugIP() { var vars = {}; return window.location.href.replace(location.hash, "").replace(/[?&]+([^=&]+)=?([^&]*)?/gi, function(m, key, value) { vars[key] = void 0 !== value ? value : ""; }), vars.affiliatable_debug_geotargeting_ip ? vars.affiliatable_debug_geotargeting_ip : ""; } if ("undefined" != typeof affiliatable_geotargeting_settings && "undefined" != typeof affiliatable_geotargeting_localized_stores && "undefined" != typeof affiliatable_geotargeting_tracking_ids) { var devIP = getGeotargetingDebugIP(), api = "undefined" != typeof affiliatable_geotargeting_api ? affiliatable_geotargeting_api : "", settings = affiliatable_geotargeting_settings, localizedStores = affiliatable_geotargeting_localized_stores, trackingIds = affiliatable_geotargeting_tracking_ids; if (!settings.hasOwnProperty("store")) return; var urlMode = settings.hasOwnProperty("mode") ? settings.mode : "mode", storeCountry = settings.store, storeTarget = "", userCountry = "", localTrackingId = "", geotargetingCookie = getCookieAff('affiliatable-geotargeting'); console.log(geotargetingCookie); if (geotargetingCookie!=='Not found'){ userCountry = geotargetingCookie; handleGeotargeting(); } else{ getCountry() } } }); </script> <script id="cg-swiper-js"> /* Start : Swiper Slider */ function CgSwiperGenerate(){ CgSwiper = new Swiper(".cg-swiper", { effect: "coverflow", grabCursor: false, centeredSlides: true, coverflowEffect: { rotate: 0, stretch: 0, depth: 100, modifier: 4, slideShadows: false }, loop: true, longSwipes: false, resistance: false, keyboardControl: false, mousewheelControl: false, resistanceRatio: '0', allowTouchMove: false, observer: true, observeParents: true, navigation: { nextEl: ".cg-swiper-next", prevEl: ".cg-swiper-prev" }, breakpoints: { 640: { slidesPerView: 2 }, 768: { slidesPerView: 2 }, 1024: { slidesPerView: 3 } }, }); } /* End : Swiper Slider */ jQuery(document).ready(function($) { setTimeout(function(){ CgSwiperGenerate(); },1000); }); </script> <script type="text/javascript"> function affiliatable_click_save(data){ jQuery.ajax({ method:'POST', data:data, action:'affiliatable_link_click', url: "/wp-admin/admin-ajax.php", success: function(value) { } }); } jQuery('.cg-aff-link').click(function ($) { var $this=jQuery(this); var page=window.location.href; var post_type=$this.attr('data-post-type'); var post_id=$this.attr('data-post-id'); var link=$this.attr('href'); var title=$this.attr('data-post-title'); if (post_type!=='') { affiliatable_click_save({ page: page, post_type: post_type, link: link, title: title, city: '', country: '', action: 'affiliatable_link_click', post_id: post_id }); } }); </script> <script type="text/javascript" defer='defer' src="https://www.devx.com/wp-content/plugins/metronet-profile-picture/js/mpp-frontend.js?ver=2.6.3" id="mpp_gutenberg_tabs-js"></script> <script type="text/javascript" defer='defer' src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/8.4.5/swiper-bundle.min.js?ver=6.9.1" id="affiliatable_swiper_js-js"></script> <script type="text/javascript" id="wpil-frontend-script-js-extra"> /* <![CDATA[ */ var wpilFrontend = {"ajaxUrl":"/wp-admin/admin-ajax.php","postId":"11614","postType":"post","openInternalInNewTab":"0","openExternalInNewTab":"0","disableClicks":"0","openLinksWithJS":"0","trackAllElementClicks":"0","clicksI18n":{"imageNoText":"Image in link: No Text","imageText":"Image Title: ","noText":"No Anchor Text Found"}}; //# sourceURL=wpil-frontend-script-js-extra /* ]]> */ </script> <script type="text/javascript" defer='defer' src="https://www.devx.com/wp-content/plugins/link-whisper-premium/js/frontend.min.js?ver=1748974546" id="wpil-frontend-script-js"></script> <script type="text/javascript" id="molongui-authorship-byline-js-extra"> /* <![CDATA[ */ var molongui_authorship_byline_params = {"byline_prefix":"","byline_suffix":"","byline_separator":",\u00a0","byline_last_separator":"\u00a0and\u00a0","byline_link_title":"View all posts by","byline_link_class":"","byline_dom_tree":"","byline_dom_prepend":"","byline_dom_append":"","byline_decoder":"v3"}; //# sourceURL=molongui-authorship-byline-js-extra /* ]]> */ </script> <script type="text/javascript" defer='defer' src="https://www.devx.com/wp-content/plugins/molongui-authorship/assets/js/byline.f4f7.min.js?ver=5.1.0" id="molongui-authorship-byline-js"></script> <script type="text/javascript" defer='defer' src="https://www.devx.com/wp-content/themes/devxnew/assets/js/hello-frontend.min.js?ver=1.0.0" id="hello-theme-frontend-js"></script> <script type="text/javascript" defer='defer' src="https://www.devx.com/wp-content/plugins/elementor-pro/assets/lib/smartmenus/jquery.smartmenus.min.js?ver=1.0.1" id="smartmenus-js"></script> <script type="text/javascript" defer='defer' src="https://www.devx.com/wp-includes/js/imagesloaded.min.js?ver=5.0.0" id="imagesloaded-js"></script> <script type="text/javascript" defer='defer' src="https://www.devx.com/wp-content/plugins/elementor-pro/assets/js/webpack-pro.runtime.min.js?ver=3.12.3" id="elementor-pro-webpack-runtime-js"></script> <script type="text/javascript" defer='defer' src="https://www.devx.com/wp-content/plugins/elementor/assets/js/webpack.runtime.min.js?ver=3.20.4" id="elementor-webpack-runtime-js"></script> <script type="text/javascript" defer='defer' src="https://www.devx.com/wp-content/plugins/elementor/assets/js/frontend-modules.min.js?ver=3.20.4" id="elementor-frontend-modules-js"></script> <script type="text/javascript" defer='defer' src="https://www.devx.com/wp-includes/js/dist/hooks.min.js?ver=dd5603f07f9220ed27f1" id="wp-hooks-js"></script> <script type="text/javascript" defer='defer' src="https://www.devx.com/wp-includes/js/dist/i18n.min.js?ver=c26c3dc7bed366793375" id="wp-i18n-js"></script> <script type="text/javascript" id="wp-i18n-js-after"> /* <![CDATA[ */ wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } ); //# sourceURL=wp-i18n-js-after /* ]]> */ </script> <script type="text/javascript" id="elementor-pro-frontend-js-before"> /* <![CDATA[ */ var ElementorProFrontendConfig = {"ajaxurl":"https:\/\/www.devx.com\/wp-admin\/admin-ajax.php","nonce":"0704945f66","urls":{"assets":"https:\/\/www.devx.com\/wp-content\/plugins\/elementor-pro\/assets\/","rest":"https:\/\/www.devx.com\/wp-json\/"},"shareButtonsNetworks":{"facebook":{"title":"Facebook","has_counter":true},"twitter":{"title":"Twitter"},"linkedin":{"title":"LinkedIn","has_counter":true},"pinterest":{"title":"Pinterest","has_counter":true},"reddit":{"title":"Reddit","has_counter":true},"vk":{"title":"VK","has_counter":true},"odnoklassniki":{"title":"OK","has_counter":true},"tumblr":{"title":"Tumblr"},"digg":{"title":"Digg"},"skype":{"title":"Skype"},"stumbleupon":{"title":"StumbleUpon","has_counter":true},"mix":{"title":"Mix"},"telegram":{"title":"Telegram"},"pocket":{"title":"Pocket","has_counter":true},"xing":{"title":"XING","has_counter":true},"whatsapp":{"title":"WhatsApp"},"email":{"title":"Email"},"print":{"title":"Print"}},"facebook_sdk":{"lang":"en_US","app_id":""},"lottie":{"defaultAnimationUrl":"https:\/\/www.devx.com\/wp-content\/plugins\/elementor-pro\/modules\/lottie\/assets\/animations\/default.json"}}; //# sourceURL=elementor-pro-frontend-js-before /* ]]> */ </script> <script type="text/javascript" defer='defer' src="https://www.devx.com/wp-content/plugins/elementor-pro/assets/js/frontend.min.js?ver=3.12.3" id="elementor-pro-frontend-js"></script> <script type="text/javascript" defer='defer' src="https://www.devx.com/wp-content/plugins/elementor/assets/lib/waypoints/waypoints.min.js?ver=4.0.2" id="elementor-waypoints-js"></script> <script type="text/javascript" defer='defer' src="https://www.devx.com/wp-includes/js/jquery/ui/core.min.js?ver=1.13.3" id="jquery-ui-core-js"></script> <script type="text/javascript" id="elementor-frontend-js-before"> /* <![CDATA[ */ var elementorFrontendConfig = {"environmentMode":{"edit":false,"wpPreview":false,"isScriptDebug":false},"i18n":{"shareOnFacebook":"Share on Facebook","shareOnTwitter":"Share on Twitter","pinIt":"Pin it","download":"Download","downloadImage":"Download image","fullscreen":"Fullscreen","zoom":"Zoom","share":"Share","playVideo":"Play Video","previous":"Previous","next":"Next","close":"Close","a11yCarouselWrapperAriaLabel":"Carousel | Horizontal scrolling: Arrow Left & Right","a11yCarouselPrevSlideMessage":"Previous slide","a11yCarouselNextSlideMessage":"Next slide","a11yCarouselFirstSlideMessage":"This is the first slide","a11yCarouselLastSlideMessage":"This is the last slide","a11yCarouselPaginationBulletMessage":"Go to slide"},"is_rtl":false,"breakpoints":{"xs":0,"sm":480,"md":768,"lg":1025,"xl":1440,"xxl":1600},"responsive":{"breakpoints":{"mobile":{"label":"Mobile Portrait","value":767,"default_value":767,"direction":"max","is_enabled":true},"mobile_extra":{"label":"Mobile Landscape","value":880,"default_value":880,"direction":"max","is_enabled":false},"tablet":{"label":"Tablet Portrait","value":1024,"default_value":1024,"direction":"max","is_enabled":true},"tablet_extra":{"label":"Tablet Landscape","value":1200,"default_value":1200,"direction":"max","is_enabled":false},"laptop":{"label":"Laptop","value":1366,"default_value":1366,"direction":"max","is_enabled":false},"widescreen":{"label":"Widescreen","value":2400,"default_value":2400,"direction":"min","is_enabled":false}}},"version":"3.20.4","is_static":false,"experimentalFeatures":{"e_optimized_assets_loading":true,"e_optimized_css_loading":true,"additional_custom_breakpoints":true,"e_swiper_latest":true,"theme_builder_v2":true,"hello-theme-header-footer":true,"block_editor_assets_optimize":true,"ai-layout":true,"landing-pages":true,"e_image_loading_optimization":true,"page-transitions":true,"notes":true,"loop":true,"form-submissions":true,"e_scroll_snap":true},"urls":{"assets":"https:\/\/www.devx.com\/wp-content\/plugins\/elementor\/assets\/"},"swiperClass":"swiper","settings":{"page":[],"editorPreferences":[]},"kit":{"body_background_background":"classic","active_breakpoints":["viewport_mobile","viewport_tablet"],"global_image_lightbox":"yes","lightbox_enable_counter":"yes","lightbox_enable_fullscreen":"yes","lightbox_enable_zoom":"yes","lightbox_enable_share":"yes","lightbox_title_src":"title","lightbox_description_src":"description","hello_header_logo_type":"logo","hello_header_menu_layout":"horizontal","hello_footer_logo_type":"logo"},"post":{"id":11614,"title":"The%20Python%202.5%20Goodie%20Bag%3A%20Language%20Enhancements%20and%20Modules%20-%20DevX","excerpt":"","featuredImage":"https:\/\/www.devx.com\/wp-content\/uploads\/2022\/02\/thumbnail.jpg"}}; //# sourceURL=elementor-frontend-js-before /* ]]> */ </script> <script type="text/javascript" defer='defer' src="https://www.devx.com/wp-content/plugins/elementor/assets/js/frontend.min.js?ver=3.20.4" id="elementor-frontend-js"></script> <script type="text/javascript" defer='defer' src="https://www.devx.com/wp-content/plugins/elementor-pro/assets/js/elements-handlers.min.js?ver=3.12.3" id="pro-elements-handlers-js"></script> <script type="text/javascript" defer='defer' src="https://www.devx.com/wp-content/plugins/elementor-pro/assets/lib/sticky/jquery.sticky.min.js?ver=3.12.3" id="e-sticky-js"></script> <script id="wp-emoji-settings" type="application/json"> {"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://www.devx.com/wp-includes/js/wp-emoji-release.min.js?ver=6.9.1"}} </script> <script type="module"> /* <![CDATA[ */ /*! This file is auto-generated */ const a=JSON.parse(document.getElementById("wp-emoji-settings").textContent),o=(window._wpemojiSettings=a,"wpEmojiSettingsSupports"),s=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const a=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===a[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,a){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!a(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,a){let r;const o=(r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),s=(o.textBaseline="top",o.font="600 32px Arial",{});return e.forEach(e=>{s[e]=t(o,e,n,a)}),s}function r(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}a.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),c.toString(),p.toString()].join(",")+"));",a=new Blob([e],{type:"text/javascript"});const r=new Worker(URL.createObjectURL(a),{name:"wpTestEmojiSupports"});return void(r.onmessage=e=>{i(n=e.data),r.terminate(),t(n)})}catch(e){}i(n=f(s,u,c,p))}t(n)}).then(e=>{for(const n in e)a.supports[n]=e[n],a.supports.everything=a.supports.everything&&a.supports[n],"flag"!==n&&(a.supports.everythingExceptFlag=a.supports.everythingExceptFlag&&a.supports[n]);var t;a.supports.everythingExceptFlag=a.supports.everythingExceptFlag&&!a.supports.flag,a.supports.everything||((t=a.source||{}).concatemoji?r(t.concatemoji):t.wpemoji&&t.twemoji&&(r(t.twemoji),r(t.wpemoji)))}); //# sourceURL=https://www.devx.com/wp-includes/js/wp-emoji-loader.min.js /* ]]> */ </script> <script>!function(){"use strict";!function(e){if(-1===e.cookie.indexOf("__adblocker")){e.cookie="__adblocker=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";var t=new XMLHttpRequest;t.open("GET","https://ads.adthrive.com/abd/abd.js",!0),t.onreadystatechange=function(){if(XMLHttpRequest.DONE===t.readyState)if(200===t.status){var a=e.createElement("script");a.innerHTML=t.responseText,e.getElementsByTagName("head")[0].appendChild(a)}else{var n=new Date;n.setTime(n.getTime()+3e5),e.cookie="__adblocker=true; expires="+n.toUTCString()+"; path=/"}},t.send()}}(document)}(); </script><script>!function(){"use strict";var e;e=document,function(){var t,n;function r(){var t=e.createElement("script");t.src="https://cafemedia-com.videoplayerhub.com/galleryplayer.js",e.head.appendChild(t)}function a(){var t=e.cookie.match("(^|[^;]+)\\s*__adblocker\\s*=\\s*([^;]+)");return t&&t.pop()}function c(){clearInterval(n)}return{init:function(){var e;"true"===(t=a())?r():(e=0,n=setInterval((function(){100!==e&&"false"!==t||c(),"true"===t&&(r(),c()),t=a(),e++}),50))}}}().init()}(); </script> </body> </html> <!-- Dynamic page generated in 1.686 seconds. --> <!-- Cached page generated by WP-Super-Cache on 2026-03-06 02:05:27 --> <!-- Compression = gzip --> <!-- super cache -->