<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Partyxtraz.com</title>
  <link
    href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css"
    rel="stylesheet"
  />
  <link rel="icon" href="https://cdn-icons-png.freepik.com/512/11812/11812830.png" type="image/png" />
  <style>
    body {
      background-color: #f9fdfb;
      font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
      padding-top: 3rem; /* offset for the floating header */
    }

    .floating-header {
      position: fixed;
      top: 0;
      left: 0;
      width: 100%;
      background-color: #0f0;
      color: #0f5132;
      text-align: center;
      padding: 0.5rem 1rem;
      font-size: 0.95rem;
      z-index: 1050;
      box-shadow: 0 2px 4px rgba(0,0,0,0.05);
    }

    .header {
      padding: 3rem 1rem 0rem;
      text-align: center;
    }

    .mission {
      max-width: 700px;
      margin: 1.5rem auto 2rem auto;
      font-size: 1.2rem;
      color: #4b6043;
    }

    .product-list {
      padding: 0rem 0rem;
    }

    .footer {
      text-align: center;
      padding: 2rem 1rem;
      font-size: 0.9rem;
      color: #6c757d;
      background-color: #eef5ed;
      margin-top: 2rem;
    }
  </style>
</head>
<body>
  <div class="floating-header">
    <a href="https://www.afternic.com/forsale/partyxtraz.com?utm_source=bizbox&utm_medium=bizbox&utm_campaign=bizbox&traffic_type=bizbox&traffic_id=bizbox" class="text-black text-decoration-none d-block" target="_blank">
      The domain partyxtraz.com is for sale. To purchase, call Afternic.com at +1-855-201-2286. Click here for more details.
    </a>
  </div>
  <div class="container">
    <header class="header">
      <h1 class="display-5 fw-bold text-success">Partyxtraz.com</h1>
      <h2 class="text-center mb-4 text-success">Mission</h2>
      <p class="mission">At the heart of <b>partyxtraz.com</b> lies a story of friendship and celebration. Founded by lifelong friends, Emma and Jake, who always believed in the magic of a well-planned gathering, the site aims to inspire hosts to create unforgettable moments. The mission is to provide top-notch party supplies and innovative ideas, ensuring that every event is not just a party, but an experience. Dive into creativity, embrace the joy, and let us be part of your celebration journey.</p>
    </header>
    <section class="product-list">
      <h2 class="text-center mb-4 text-success">Check out these cool products</h2>
      <script src="https://img1.wsimg.com/traffic-assets/js/tccl.min.js" integrity="sha256-d6HXsgKXdPlIwYlPrWetPCxAdYRfhPDkkrrnVM+YiZU=" crossorigin="anonymous"></script>
<script src="https://img1.wsimg.com/traffic-assets/js/tccl-tti.min.js" integrity="sha256-PDekqjz2qq5pIaS3UMDk+B/TONaHi+kLD68vkhA5yyM=" crossorigin="anonymous"></script>
<style>
  body,
  html {
    height: 100%;
    margin: 0;
    padding: 0;
    box-sizing: border-box;
    /* overflow: hidden; */
  }

  .carousel-container {
    display: flex;
    flex-direction: column;
    /* height: 100vh; */
  }

  .search-container {
    width: 100%;
    display: flex;
    justify-content: flex-end;
    margin-bottom: 20px;
    padding-right: 10px;
  }

  #product-search {
    width: 300px;
    padding: 10px;
    border: 2px solid #ddd;
    border-radius: 8px;
    outline: none;
    font-size: 16px;
  }

  .fixed-paragraph {
    margin: 20px 0;
    text-align: center;
  }

  .product-scrollable {
    flex: 1;
    padding-right: 20px;
    overflow-y: auto;
    scrollbar-width: thin;
    scrollbar-color: #ccc #f1f1f1;
  }

  .product-scrollable::-webkit-scrollbar {
    width: 6px; /* Thin scrollbar */
  }

  .product-scrollable::-webkit-scrollbar-thumb {
    background: #bbb;
    border-radius: 10px;
  }

  .product-scrollable::-webkit-scrollbar-track {
    background: #f1f1f1;
  }

  .carousel-track {
    display: grid;
    gap: 15px;
    padding: 10px 0;
    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  }

  .product-tile {
    box-sizing: border-box;
    width: 100%;
    height: 340px;
    text-align: center;
    background: #fff;
    padding: 15px;
    border-radius: 12px;
    display: flex;
    flex-direction: column;
    align-items: center;
    box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.15);
    transition: transform 0.3s ease, box-shadow 0.3s ease;
  }

  .product-tile img {
    width: 100%;
    height: 160px;
    object-fit: cover;
    border-radius: 8px;
    background-color: #f7f7f7;
  }

  .product-info p {
    display: -webkit-box;
    -webkit-line-clamp: 3;   /* Limits text to 2 lines */
    -webkit-box-orient: vertical;
    overflow: hidden;
    text-overflow: ellipsis;
}

  @media (max-width: 1500px) and (min-width: 1200px) {
    .product-scrollable {
      grid-template-columns: repeat(4, 1fr);
    }
  }

  @media (max-width: 1199px) and (min-width: 900px) {
    .product-scrollable {
      grid-template-columns: repeat(3, 1fr);
    }
  }

  @media (max-width: 899px) and (min-width: 600px) {
    .product-scrollable {
      grid-template-columns: repeat(2, 1fr);
    }
  }

  @media (max-width: 599px) {
    .product-scrollable {
      grid-template-columns: 1fr;
    }
  }

  .product-tile {
    box-sizing: border-box;
    width: 100%; /* Fill available grid space */
    height: 340px;
    text-align: center;
    background: #fff;
    padding: 15px;
    border-radius: 12px;
    display: flex;
    flex-direction: column;
    align-items: center;
    box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.15);
    transition: transform 0.3s ease, box-shadow 0.3s ease;
  }

  .product-tile:hover {
    transform: translateY(-5px);
    box-shadow: 0px 6px 15px rgba(0, 0, 0, 0.2);
  }

  .product-tile img {
    width: 100%;
    height: 160px;
    object-fit: cover;
    border-radius: 8px;
    background-color: #f7f7f7;
  }

  .product-info {
    font-size: 15px;
    color: #333;
  }

  .product-info strong {
    font-size: 16px;
    color: #000;
    display: block;
  }

  .product-info p {
    margin: 5px 0;
  }

  .related-domains {
    text-align: center;
    margin: 20px;
  }

  .related-domain-card-container {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 15px;
  }

  .related-domain-card {
    border: 1px solid #ddd;
    border-radius: 8px;
    padding: 15px;
    width: 230px;
    text-align: center;
    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
    transition: transform 0.2s;
  }

  .related-domain-card:hover {
    transform: scale(1.05);
  }

  .related-domain-card a {
    text-decoration: none;
    color: #333;
  }

  .related-domain-card h4 {
    margin: 10px 0;
    font-size: 18px;
  }

  .related-domain-card p {
    font-size: 14px;
    color: #666;
  }


</style>

<div class="carousel-container">
  <div class="search-container">
    <input
            type="text"
            id="product-search"
            placeholder="Search products..."
            oninput="filterProducts()"
    />
  </div>

  <div class="product-scrollable">
    <div class="carousel-track" id="carousel-track"></div>
  </div>

  <p class="fixed-paragraph">
    As an Amazon Associate, this website earns from qualified purchases.
  </p>

</div>

<div class="related-domains">
  <h3>Explore Related Websites</h3>
  <div class="related-domain-card-container">
    <div class="related-domain-card">
      <a href="https://upplies.com?utm_source=linknet"
         target="_blank" onclick="relatedDomainsClickHandler(&#39;upplies.com&#39;)">
        <h4>upplies.com</h4>
      </a>
    </div>
    <div class="related-domain-card">
      <a href="https://seattleconventions.com?utm_source=linknet"
         target="_blank" onclick="relatedDomainsClickHandler(&#39;seattleconventions.com&#39;)">
        <h4>seattleconventions.com</h4>
      </a>
    </div>
    <div class="related-domain-card">
      <a href="https://partygraphicsphotobooth.com?utm_source=linknet"
         target="_blank" onclick="relatedDomainsClickHandler(&#39;partygraphicsphotobooth.com&#39;)">
        <h4>partygraphicsphotobooth.com</h4>
      </a>
    </div>
    <div class="related-domain-card">
      <a href="https://lorisparties.com?utm_source=linknet"
         target="_blank" onclick="relatedDomainsClickHandler(&#39;lorisparties.com&#39;)">
        <h4>lorisparties.com</h4>
      </a>
    </div>
  </div>
</div>

<script>

  const contextWindow = window;

  function hasImpressionEventAlreadyFired() {
    return contextWindow.__pageImpressionEventFired === true;
  }

  function markImpressionEventAsFired() {
    contextWindow.__pageImpressionEventFired = true;
  }

  // Function to wait for parent window to fully initialize
  function waitForParentInitialization(callback, maxAttempts = 50) {
    let attempts = 0;

    function checkParentInitialization() {
      attempts++;

      // Check if parent window and critical objects are available
      if (contextWindow &&
          contextWindow['_signalsDataLayer'] && contextWindow['_signalsDataLayer']['loaded']) {
          if (!hasImpressionEventAlreadyFired()) {
            console.log('Parent window is ready and impression event not yet fired. Firing impression event now!');
            callback();
            markImpressionEventAsFired();
          } else {
            console.log('Impression event already fired, skipping...');
          }
        return;
      }

      if (attempts < maxAttempts) {
        // Not ready yet, check again after a short delay
        setTimeout(checkParentInitialization, 100);
      } else {
        console.log('Failed to detect parent initialization after ' + maxAttempts + ' attempts');
      }
    }

    // Start checking
    checkParentInitialization();
  }

  function isFirstVisit() {
    const STORAGE_KEY = 'hasVisitedBefore';

    try {
      const hasVisited = localStorage.getItem(STORAGE_KEY);

      if (hasVisited === 'true') {
        return false; // Not the first visit
      } else {
        localStorage.setItem(STORAGE_KEY, 'true');
        return true; // First visit
      }

    } catch (e) {
      console.warn('Storage access failed. Treating as first visit.', e);
      return true; // Assume first visit if storage isn't available
    }
  }

  function getParentURLQueryParameter(queryParamName) {
    try {
      const parentSearch = contextWindow.location.search;
      const urlParams = new URLSearchParams(parentSearch);
      const queryParamValue = urlParams.get(queryParamName);
      return queryParamValue ? queryParamValue : '';
    } catch (e) {
      // Cross-origin access error or something else
      return '';
    }
  }

  // any events not joinable by userid should be joined by sessionJoinKey.
  // Intended for external events that can't be instrumented with userid/gamekey/strategy id.
  // Any events found should inherit the property of the event to which they're joined.
  // can be added to any EndGame event
  function generateSessionJoinKey() {
    const length = 16; // Length of the session join key. length 16 should be enough uniqueness for more than 100 million sessions.
    const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
    let result = '';
    for (let i = 0; i < length; i++) {
      result += chars.charAt(Math.floor(Math.random() * chars.length));
    }
    return 'eg.sessionjoinkey.' + result;
  }

  const WalletBitmask = {
    PHANTOM_SOLANA: 1 << 0,
    PHANTOM_EVM:    1 << 1,
    METAMASK:       1 << 2,
    COINBASE:       1 << 3,
    SOLFLARE:       1 << 4,
    TRUST:          1 << 5,
    BACKPACK:       1 << 6,
    XDEFI:          1 << 7,
  };

  // Detection logic for each wallet
  const walletDetectors = [
    {
      tag: 'phantom solana',
      bit: WalletBitmask.PHANTOM_SOLANA,
      detect: (p) => p.solana?.isPhantom,
    },
    {
      tag: 'phantom evm',
      bit: WalletBitmask.PHANTOM_EVM,
      detect: (p) => p.phantom?.ethereum,
    },
    {
      tag: 'metamask',
      bit: WalletBitmask.METAMASK,
      detect: (p) => p.ethereum?.isMetaMask && !!p.ethereum?._metamask, //does not distinguish between actual metamask and coinbase or phantom spoofing metamask for compatibility reasons
    },
    {
      tag: 'coinbase',
      bit: WalletBitmask.COINBASE,
      detect: (p) => !!p.coinbaseWalletExtension,
    },
    {
      tag: 'solflare',
      bit: WalletBitmask.SOLFLARE,
      detect: (p) => p.solflare?.isSolflare,
    },
    {
      tag: 'trust',
      bit: WalletBitmask.TRUST,
      detect: (p) => p.ethereum?.isTrust,
    },
    {
      tag: 'backpack',
      bit: WalletBitmask.BACKPACK,
      detect: (p) => p.backpack?.isBackpack,
    },
    {
      tag: 'xdefi',
      bit: WalletBitmask.XDEFI,
      detect: (p) => p.xfi?.ethereum || window.xfi?.solana,
    },
  ];

  function detectWalletsBitmask() {
    let bitmask = 0;

    for (const { bit, detect, tag } of walletDetectors) {
      try {
        if (detect(contextWindow)) {
          bitmask |= bit;
        }
      } catch (e) {
        console.warn('Error:', e);
      }
    }

    return bitmask;
  }

  // Start detection immediately
  waitForParentInitialization(function() {
    //console.log('Firing impression');
    // This will be called once the parent window is fully initialized


    const walletBitMask = detectWalletsBitmask();
    //console.log('Detected wallet bitmask: ', walletBitMask);

    //Add traffic source to the impression event
    const utmSource = getParentURLQueryParameter('utm_source');
    const utmCampaign = getParentURLQueryParameter('utm_campaign');
    const isUserFirstVisit = isFirstVisit();
    //console.log('Is this the user\'s first visit? ', isUserFirstVisit);
    const sessionJoinKey = generateSessionJoinKey();
    contextWindow['_signalsDataLayer'].push({
      schema: 'add_event',
      version: 'v1',
      data: {
        type: 'impression',
        eid: "endgame.v1.event",
        custom_properties: {
          endGameEventKey: 'page_load', //todo: add utmsource subeventkey
          endGameGameKey: "bizbox",
          endGameStrategyKey: "simple_products_above_the_fold",
          ventureVertical: "no_vertical_specified",
          utmSource: utmSource,
          utmCampaign: utmCampaign,
          isFirstVisit: isUserFirstVisit,
          walletBitMask: walletBitMask,
          sessionJoinKey: sessionJoinKey //this value should be generated fresh for each session and not cross session boundaries
        },
      },
    });

    //Update Airo link.
    function updateParentLinkHref(link, isMerge, newParams) {
      try {
        if (!link || !link.href) return;

        const url = new URL(link.href);

        // Clear all query params if merge is false
        if (!isMerge) {
          url.search = ''; // Removes all query params
        }

        // Add/overwrite specified params
        for (const [key, value] of Object.entries(newParams)) {
          url.searchParams.set(key, value);
        }

        link.href = url.toString();
      } catch (e) {
        console.warn('Unable to access or modify parent document:', e);
      }
    }

    const parentDoc = contextWindow.document;
    const gdAiroLink = parentDoc.querySelector('a[data-aid="FOOTER_POWERED_BY_AIRO_RENDERED_LINK"]');
    //Update query parameters for endgame tracking. Do this for any and all GD links.
    updateParentLinkHref(gdAiroLink,
        false,
        {
          utm_source: 'endgame',
          utm_campaign: sessionJoinKey,
          //utm_medium: 'applications', //compatibility with main attribution logic
          utm_terms: "eg.v1.bizbox.simple_products_above_the_fold"
        }
    );

    if (gdAiroLink) {
<!--        debugLog('Found gdAiroLink');-->
        gdAiroLink.addEventListener('click', (e) => {
<!--          debugLog("GD Airo Link clicked!");-->
          // Replace direct access with safe function
          contextWindow['_signalsDataLayer'].push({
            schema: 'add_event',
            version: 'v1',
            data: {
              type: 'click',
              eid: "endgame.v1.event",
              custom_properties: {
                endGameEventKey: 'gd_product_footer_click',
                endGameGameKey: "bizbox",
                endGameStrategyKey: "simple_products_above_the_fold",
                ventureVertical: "no_vertical_specified",
                sessionJoinKey: sessionJoinKey
              },
            }
          });
        });
      }
  });

  document.addEventListener('DOMContentLoaded', function(e) {
    const debugLog = (message) => {
      console.log('DEBUG: ' + message);
    };

    debugLog("Bizbox DOMContentLoaded fired");

    /*<![CDATA[*/
    const products = [{"image":"https:\/\/m.media-amazon.com\/images\/I\/510Nqk5f9qL._SL500_.jpg","id":"1","title":"Dixie Medium Paper Plates, 8.5 Inch, 90 Count, 2X Stronger*, Microwave-Safe, Soak-Proof, Cut Resistant, Disposable Plate...","priceAsOfDate":"Mar 28, 2025","price":"$5.99 ($0.07 \/ Count)","asin":"B0748J34WZ","url":"https:\/\/www.amazon.com\/dp\/B0748J34WZ?tag=gd-bb-p2b-20\u0026linkCode=osi\u0026th=1\u0026psc=1","brand":"Dixie","rating":""},{"image":"https:\/\/m.media-amazon.com\/images\/I\/410FInvdRfL._SL500_.jpg","id":"2","title":"WOWBOX 4 pcs Serving Tray for Entertaining, Serving Platters for Snacks, Fruit, Cookies, Dessert, Reusable Plastic Trays...","priceAsOfDate":"Mar 28, 2025","price":"$13.98","asin":"B0CCP3YXNJ","url":"https:\/\/www.amazon.com\/dp\/B0CCP3YXNJ?tag=gd-bb-p2b-20\u0026linkCode=osi\u0026th=1\u0026psc=1","brand":"WOWBOX","rating":""},{"image":"https:\/\/m.media-amazon.com\/images\/I\/41dmjBpY9pL._SL500_.jpg","id":"3","title":"Lifewit Ice Chilled Condiment Caddy with 5 Containers(2.5 cup), Condiment Server with Separate Lids, Serving Tray Platte...","priceAsOfDate":"Mar 28, 2025","price":"$23.99","asin":"B0CH354Z1T","url":"https:\/\/www.amazon.com\/dp\/B0CH354Z1T?tag=gd-bb-p2b-20\u0026linkCode=osi\u0026th=1\u0026psc=1","brand":"Lifewit","rating":""},{"image":"https:\/\/m.media-amazon.com\/images\/I\/51nZSQFuLiL._SL500_.jpg","id":"4","title":"Mini Chalkboard Signs, 20 Pack Framed Small Chalk Board Food Labels with Easel Stand for Party Buffet or Wedding Celebra...","priceAsOfDate":"Mar 28, 2025","price":"$9.99","asin":"B07FSZ7NS5","url":"https:\/\/www.amazon.com\/dp\/B07FSZ7NS5?tag=gd-bb-p2b-20\u0026linkCode=osi\u0026th=1\u0026psc=1","brand":"OleOletOy","rating":""},{"image":"https:\/\/m.media-amazon.com\/images\/I\/412mCaUphQL._SL500_.jpg","id":"5","title":"AGPTEK Electric Air Balloon Pump, 110V 600W Rose Red Portable Dual Nozzle Inflator\/Blower for Party Decoration","priceAsOfDate":"Mar 28, 2025","price":"$19.99","asin":"B00A78GZOA","url":"https:\/\/www.amazon.com\/dp\/B00A78GZOA?tag=gd-bb-p2b-20\u0026linkCode=osi\u0026th=1\u0026psc=1","brand":"AGPTEK","rating":""},{"image":"https:\/\/m.media-amazon.com\/images\/I\/41ICulTHV7L._SL500_.jpg","id":"6","title":"Hefty Party On Red Plastic Cups, Disposable Plastic Party Cups for Easy Cleanup and Large Gatherings, Red Cups for BBQs,...","priceAsOfDate":"Mar 28, 2025","price":"$5.84 ($0.12 \/ Count)","asin":"B00I9J3ACY","url":"https:\/\/www.amazon.com\/dp\/B00I9J3ACY?tag=gd-bb-p2b-20\u0026linkCode=osi\u0026th=1\u0026psc=1","brand":"Hefty","rating":""},{"image":"https:\/\/m.media-amazon.com\/images\/I\/41hNrvytRKL._SL500_.jpg","id":"7","title":"EMART Backdrop Stand 10x7ft(WxH) Photo Studio Adjustable Background Stand Support kit with 2 Crossbars, 8 Clamps, 2 Sand...","priceAsOfDate":"Mar 28, 2025","price":"$40.99","asin":"B00MTF6ZVC","url":"https:\/\/www.amazon.com\/dp\/B00MTF6ZVC?tag=gd-bb-p2b-20\u0026linkCode=osi\u0026th=1\u0026psc=1","brand":"EMART","rating":""},{"image":"https:\/\/m.media-amazon.com\/images\/I\/51TIId4azWL._SL500_.jpg","id":"8","title":"WXLDGHQ White and Gold Paper Plates Napkins Party Supplies,Disposable Gold Dot Paper Dessert Plates,105 PCS Birthday Pla...","priceAsOfDate":"Mar 28, 2025","price":"$15.93 ($0.46 \/ Count)","asin":"B0BW6SYNVM","url":"https:\/\/www.amazon.com\/dp\/B0BW6SYNVM?tag=gd-bb-p2b-20\u0026linkCode=osi\u0026th=1\u0026psc=1","brand":"WXLDGHQ","rating":""},{"image":"https:\/\/m.media-amazon.com\/images\/I\/51vGnsuo0GL._SL500_.jpg","id":"9","title":"MOACOCK 200 Count Plastic Silverware, Heavy Weight Plastic Forks Spoons Disposable Utensils Cutlery Set for Wedding Part...","priceAsOfDate":"Mar 28, 2025","price":"$12.99","asin":"B0C1JMKHL4","url":"https:\/\/www.amazon.com\/dp\/B0C1JMKHL4?tag=gd-bb-p2b-20\u0026linkCode=osi\u0026th=1\u0026psc=1","brand":"MOACOCK","rating":""}];
    /*]]>*/

    const track = document.getElementById('carousel-track');

    const renderProducts = (filteredProducts = products) => {
      track.innerHTML = '';
      filteredProducts.forEach((product) => {
        const item = document.createElement('div');
        item.classList.add('product-tile');
        item.innerHTML = `
                  <a href="${product.url}" target="_blank">
                      <img src="${product.image}" alt="${product.title}">
                  </a>
                  <div class="product-info">
                      <strong>${product.brand}</strong>
                      <p>${product.title}</p>
                      <p>Price: ${product.price}</p>
                      <p>(as of ${product.priceAsOfDate})</p>
                  </div>
              `;

        item.addEventListener('click', function (event) {
          debugLog('firing amazon click event');
          if (!event.target.closest('a')) {
            window.open(product.url, '_blank');
          }
          contextWindow['_signalsDataLayer'].push({
            schema: 'add_event',
            version: 'v1',
            data: {
              type: 'click',
              eid: "endgame.v1.event",
              custom_properties: {
                endGameEventKey: 'amazon_product_click',
                endGameGameKey: "bizbox",
                endGameStrategyKey: "simple_products_above_the_fold",
                ventureVertical: "no_vertical_specified",
                asin: `${product.asin}`
              },
            },
          });
        });

        track.appendChild(item);
      });
    };

    const productSearchBox = document.getElementById('product-search');
    productSearchBox.addEventListener("focus", () => {
      debugLog("firing focus event");
      // Replace direct access with safe function
      contextWindow['_signalsDataLayer'].push({
        schema: 'add_event',
        version: 'v1',
        data: {
          type: 'click',
          eid: "endgame.v1.event",
          custom_properties: {
            endGameEventKey: 'product_search_focus',
            endGameGameKey: "bizbox",
            endGameStrategyKey: "simple_products_above_the_fold",
            ventureVertical: "no_vertical_specified"
          },
        },
      });
    });


    window.filterProducts = () => {
      const query = document
              .getElementById('product-search')
              .value.toLowerCase();
      const filteredProducts = products.filter(
              (product) =>
                      product.title.toLowerCase().includes(query) ||
                      product.brand.toLowerCase().includes(query)
      );
      renderProducts(filteredProducts);
    };

    renderProducts();

    // Helper function to find link by domain name using regex
    function findSalesLinkByDomain(parentDocument, domainName) {
      // Escape special regex characters in the domain name
      const escapedDomain = domainName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
      // Create a regex that looks for the domain in a URL context
      const domainRegex = new RegExp(`[^a-zA-Z0-9](${escapedDomain})[^a-zA-Z0-9]|^(${escapedDomain})|^(${escapedDomain})[^a-zA-Z0-9]|[^a-zA-Z0-9](${escapedDomain})$`);

      // Get all anchor elements in the parent doc
      const allLinks = parentDocument.querySelectorAll('a[href]');

      // Find the first link that matches our regex
      for (let i = 0; i < allLinks.length; i++) {
        const href = allLinks[i].getAttribute('href');
        if (href && domainRegex.test(href)) {
          debugLog('Found matching link with href:', href);
          return allLinks[i];
        }
      }

      return null;
    }

    const link = findSalesLinkByDomain(contextWindow.document, "partyxtraz.com");

    if (link) {
      debugLog('Found top banner a tag using regex. Adding listener');
      link.addEventListener('click', (e) => {
        debugLog("Sales banner clicked!");
        // Replace direct access with safe function
        contextWindow['_signalsDataLayer'].push({
          schema: 'add_event',
          version: 'v1',
          data: {
            type: 'click',
            eid: "endgame.v1.event",
            custom_properties: {
              endGameEventKey: 'salesbanner_click',
              endGameGameKey: "bizbox",
              endGameStrategyKey: "simple_products_above_the_fold",
              ventureVertical: "no_vertical_specified"
            },
          }
        });
      });
    }
  });

  // Update the related domains click handler too
  function relatedDomainsClickHandler(targetDomain) {
    console.log('firing linknet click for domain: ' + targetDomain);
    // Replace direct access with safe function
    contextWindow['_signalsDataLayer'].push({
      schema: 'add_event',
      version: 'v1',
      data: {
        type: 'click',
        eid: "endgame.v1.event",
        custom_properties: {
          endGameEventKey: 'linknet_click',
          endGameGameKey: "bizbox",
          endGameStrategyKey: "simple_products_above_the_fold",
          ventureVertical: "no_vertical_specified",
          targetDomain: targetDomain
        },
      },
    });
  }
</script>

    </section>
    <p>
        Blog: coming soon!
    </p>
    <footer class="footer">
      Copyright &copy; partyxtraz.com.  All rights reserved.
    </footer>
  </div>
</body>
</html>
