#!/usr/bin/env python3
"""
Bot de tráfego humano – cada visitante executa uma jornada real:
- Visita um site de referência popular (TikTok, X, YouTube, Terra, UOL, G1, etc.)
  ou realiza uma pesquisa em buscador antes de acessar o site alvo (se houver keywords).
- Engine, UA e dispositivo são coerentes (Chromium, Firefox ou WebKit).
- Timezone geográfico correto via timezonefinder.
- Movimentos de mouse/toque nativos.
- Sem cookies falsos – a sessão é enriquecida organicamente.
"""

import asyncio
import csv
import importlib
import json
import logging
import os
import random
import re
import secrets
import ssl
import subprocess
import sys
import time
import xml.etree.ElementTree as ET
from collections import Counter, deque
from dataclasses import dataclass
from datetime import datetime, timezone as dt_timezone
from pathlib import Path
from typing import List, Tuple, Dict, Optional
from urllib.parse import urlparse, quote_plus


# --------------------------------------------------------------------
# Dependências: instala só o que faltar (não reinstala a cada execução)
# --------------------------------------------------------------------
def _can_import(mod_name: str) -> bool:
    """True se o módulo carrega. Captura ImportError e RuntimeError (ex.: NumPy/CPU)."""
    try:
        importlib.import_module(mod_name)
        return True
    except Exception:
        return False


def ensure_dependencies():
    """
    Verifica imports. Instala só o que faltar.
    timezonefinder é opcional (depende de NumPy; em CPUs antigas pode quebrar).
    """
    required = [
        ("aiohttp", "aiohttp"),
        ("playwright", "playwright"),
        ("playwright_stealth", "playwright-stealth"),
    ]
    optional = [
        ("timezonefinder", "timezonefinder"),
    ]

    missing = [pip_name for mod_name, pip_name in required if not _can_import(mod_name)]
    missing_opt = [pip_name for mod_name, pip_name in optional if not _can_import(mod_name)]

    if missing or missing_opt:
        to_install = missing + missing_opt
        print(f"📦 Dependências ausentes: {', '.join(to_install)}")
        print("   Instalando com pip (só o que falta)...")
        cmd = [
            sys.executable,
            "-m",
            "pip",
            "install",
            "--disable-pip-version-check",
            *to_install,
        ]
        try:
            subprocess.check_call(cmd)
            print("✅ Pacotes instalados.")
        except subprocess.CalledProcessError as e:
            if missing:
                print(f"❌ Falha no pip install (obrigatórios): {e}")
                print("   Instale manualmente:", " ".join(cmd))
                raise SystemExit(1) from e
            print(f"⚠️  Pacote opcional não instalou ({missing_opt}): seguindo sem ele.")

    # Revalida obrigatórios após install
    still = [pip for mod, pip in required if not _can_import(mod)]
    if still:
        print(f"❌ Ainda faltando após install: {', '.join(still)}")
        raise SystemExit(1)

    # Confere chromium + firefox + webkit (não só chromium)
    browsers_marker = Path(__file__).resolve().parent / ".playwright_browsers_ok"
    engines_needed = ("chromium", "firefox", "webkit")

    def _missing_playwright_browsers():
        missing_engines = []
        try:
            from playwright.sync_api import sync_playwright

            with sync_playwright() as pw:
                launchers = {
                    "chromium": pw.chromium,
                    "firefox": pw.firefox,
                    "webkit": pw.webkit,
                }
                for name in engines_needed:
                    try:
                        b = launchers[name].launch(headless=True)
                        b.close()
                    except Exception:
                        missing_engines.append(name)
        except Exception:
            return list(engines_needed)
        return missing_engines

    need = _missing_playwright_browsers()
    if need:
        print(f"📦 Browsers Playwright ausentes: {', '.join(need)}")
        print("   Baixando (pode demorar na 1ª vez)...")
        try:
            subprocess.check_call([sys.executable, "-m", "playwright", "install", *need])
            still = _missing_playwright_browsers()
            if still:
                print(f"⚠️  Ainda faltando após install: {', '.join(still)}")
                print("   Tente: python -m playwright install chromium firefox webkit")
            else:
                print("✅ Browsers Playwright prontos.")
                browsers_marker.write_text(
                    "ok:" + ",".join(engines_needed) + "\n", encoding="utf-8"
                )
        except Exception as e:
            print(f"⚠️  Falha ao instalar browsers: {e}")
            print("   Rode: python -m playwright install chromium firefox webkit")
    elif not browsers_marker.exists():
        browsers_marker.write_text(
            "ok:" + ",".join(engines_needed) + "\n", encoding="utf-8"
        )


ensure_dependencies()

import aiohttp
from playwright.async_api import async_playwright, Browser, BrowserContext, Page
from playwright_stealth import Stealth

# timezonefinder é opcional: em algumas CPUs o NumPy quebra com RuntimeError (X86_V2)
tf = None
try:
    from timezonefinder import TimezoneFinder

    tf = TimezoneFinder()
except Exception as _tz_err:
    print(f"⚠️  timezonefinder indisponível ({type(_tz_err).__name__}) — usando timezone por faixa de latitude.")
    tf = None

# --------------------------------------------------------------------
# Configuração padrão
# --------------------------------------------------------------------
DEFAULT_CONFIG = {
    "site_url": "",
    "keywords": [],
    "min_visitors": 4,
    "max_visitors": 8,
    "dwell_min": 20.0,
    "dwell_max": 40.0,
    "rest_min": 15.0,
    "rest_max": 35.0,
    "headless": True,
}

# Limites anti-travamento (modem/IP reiniciando)
VISIT_MAX_SECONDS = 150          # hard cap por visitante
GOTO_TIMEOUT_MS = 25000          # page.goto individual
CLOSE_TIMEOUT_S = 8              # page/context.close
NETWORK_POLL_S = 15              # intervalo ao aguardar internet

# Sites de referência (para enriquecer a sessão e o referer)
REFERRER_SITES = [
    "https://www.tiktok.com/",
    "https://trends24.in/brazil/",  # substitui X/Twitter
    "https://www.youtube.com/",
    "https://www.terra.com.br/",
    "https://www.uol.com.br/",
    "https://g1.globo.com/",
    "https://www.facebook.com/",
    "https://www.instagram.com/",
    "https://www.linkedin.com/",
    "https://www.reddit.com/",
]

# Motores de busca (para jornada de pesquisa)
SEARCH_SOURCES = {
    "google": {"weight": 60, "base": "https://www.google.com/search?q="},
    "bing":   {"weight": 25, "base": "https://www.bing.com/search?q="},
    "yahoo":  {"weight": 15, "base": "https://search.yahoo.com/search?p="},
}

LOCALE = "pt-BR"
BASE_DIR = Path(__file__).resolve().parent
CONFIG_FILE = BASE_DIR / "config.txt"
UA_FILE = BASE_DIR / "useragents.txt"
log = logging.getLogger("trafego")

# Preenchido em main()
config = {}

# User-Agents embutidos (não depende de useragents.txt)
EMBEDDED_USER_AGENTS = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Mobile Safari/537.36',
    'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36 Edg/133.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36 Edg/133.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36 Edg/133.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edg/137.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edg/137.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edg/137.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36 Edg/140.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36 Edg/140.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36 Edg/140.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 Edg/142.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 Edg/142.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 Edg/142.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36 Edg/144.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36 Edg/144.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36 Edg/144.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36 Edg/145.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36 Edg/145.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36 Edg/145.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36 Edg/146.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36 Edg/146.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36 Edg/146.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36 Edg/148.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36 Edg/148.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36 Edg/148.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36 Edg/149.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36 Edg/149.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36 Edg/149.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36 Edg/150.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36 Edg/150.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36 Edg/150.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36 Edg/151.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36 Edg/151.0.0.0',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36 Edg/151.0.0.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:115.0) Gecko/20100101 Firefox/115.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:115.0) Gecko/20100101 Firefox/115.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:115.0) Gecko/20100101 Firefox/115.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:115.0) Gecko/115.0 Firefox/115.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:115.0) Gecko/115.0 Firefox/115.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:115.0) Gecko/115.0 Firefox/115.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:115.0) Gecko/115.0 Firefox/115.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:115.0) Gecko/115.0 Firefox/115.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:115.0) Gecko/115.0 Firefox/115.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:115.0) Gecko/115.0 Firefox/115.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:115.0) Gecko/115.0 Firefox/115.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:115.0) Gecko/115.0 Firefox/115.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:115.0) Gecko/115.0 Firefox/115.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:115.0) Gecko/115.0 Firefox/115.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:115.0) Gecko/115.0 Firefox/115.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:115.0) Gecko/115.0 Firefox/115.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:115.0) Gecko/115.0 Firefox/115.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:116.0) Gecko/20100101 Firefox/116.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:116.0) Gecko/20100101 Firefox/116.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:116.0) Gecko/20100101 Firefox/116.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:116.0) Gecko/116.0 Firefox/116.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:116.0) Gecko/116.0 Firefox/116.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:116.0) Gecko/116.0 Firefox/116.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:116.0) Gecko/116.0 Firefox/116.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:116.0) Gecko/116.0 Firefox/116.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:116.0) Gecko/116.0 Firefox/116.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:116.0) Gecko/116.0 Firefox/116.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:116.0) Gecko/116.0 Firefox/116.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:116.0) Gecko/116.0 Firefox/116.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:116.0) Gecko/116.0 Firefox/116.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:116.0) Gecko/116.0 Firefox/116.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:116.0) Gecko/116.0 Firefox/116.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:116.0) Gecko/116.0 Firefox/116.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:116.0) Gecko/116.0 Firefox/116.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:117.0) Gecko/20100101 Firefox/117.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:117.0) Gecko/20100101 Firefox/117.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:117.0) Gecko/20100101 Firefox/117.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:117.0) Gecko/117.0 Firefox/117.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:117.0) Gecko/117.0 Firefox/117.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:117.0) Gecko/117.0 Firefox/117.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:117.0) Gecko/117.0 Firefox/117.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:117.0) Gecko/117.0 Firefox/117.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:117.0) Gecko/117.0 Firefox/117.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:117.0) Gecko/117.0 Firefox/117.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:117.0) Gecko/117.0 Firefox/117.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:117.0) Gecko/117.0 Firefox/117.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:117.0) Gecko/117.0 Firefox/117.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:117.0) Gecko/117.0 Firefox/117.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:117.0) Gecko/117.0 Firefox/117.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:117.0) Gecko/117.0 Firefox/117.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:117.0) Gecko/117.0 Firefox/117.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:118.0) Gecko/20100101 Firefox/118.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:118.0) Gecko/20100101 Firefox/118.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:118.0) Gecko/20100101 Firefox/118.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:118.0) Gecko/118.0 Firefox/118.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:118.0) Gecko/118.0 Firefox/118.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:118.0) Gecko/118.0 Firefox/118.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:118.0) Gecko/118.0 Firefox/118.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:118.0) Gecko/118.0 Firefox/118.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:118.0) Gecko/118.0 Firefox/118.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:118.0) Gecko/118.0 Firefox/118.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:118.0) Gecko/118.0 Firefox/118.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:118.0) Gecko/118.0 Firefox/118.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:118.0) Gecko/118.0 Firefox/118.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:118.0) Gecko/118.0 Firefox/118.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:118.0) Gecko/118.0 Firefox/118.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:118.0) Gecko/118.0 Firefox/118.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:118.0) Gecko/118.0 Firefox/118.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:119.0) Gecko/20100101 Firefox/119.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:119.0) Gecko/20100101 Firefox/119.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:119.0) Gecko/20100101 Firefox/119.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:119.0) Gecko/119.0 Firefox/119.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:119.0) Gecko/119.0 Firefox/119.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:119.0) Gecko/119.0 Firefox/119.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:119.0) Gecko/119.0 Firefox/119.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:119.0) Gecko/119.0 Firefox/119.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:119.0) Gecko/119.0 Firefox/119.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:119.0) Gecko/119.0 Firefox/119.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:119.0) Gecko/119.0 Firefox/119.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:119.0) Gecko/119.0 Firefox/119.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:119.0) Gecko/119.0 Firefox/119.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:119.0) Gecko/119.0 Firefox/119.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:119.0) Gecko/119.0 Firefox/119.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:119.0) Gecko/119.0 Firefox/119.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:119.0) Gecko/119.0 Firefox/119.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:120.0) Gecko/20100101 Firefox/120.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:120.0) Gecko/20100101 Firefox/120.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:120.0) Gecko/20100101 Firefox/120.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:120.0) Gecko/120.0 Firefox/120.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:120.0) Gecko/120.0 Firefox/120.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:120.0) Gecko/120.0 Firefox/120.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:120.0) Gecko/120.0 Firefox/120.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:120.0) Gecko/120.0 Firefox/120.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:120.0) Gecko/120.0 Firefox/120.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:120.0) Gecko/120.0 Firefox/120.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:120.0) Gecko/120.0 Firefox/120.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:120.0) Gecko/120.0 Firefox/120.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:120.0) Gecko/120.0 Firefox/120.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:120.0) Gecko/120.0 Firefox/120.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:120.0) Gecko/120.0 Firefox/120.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:120.0) Gecko/120.0 Firefox/120.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:120.0) Gecko/120.0 Firefox/120.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:121.0) Gecko/20100101 Firefox/121.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:121.0) Gecko/20100101 Firefox/121.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:121.0) Gecko/121.0 Firefox/121.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:121.0) Gecko/121.0 Firefox/121.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:121.0) Gecko/121.0 Firefox/121.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:121.0) Gecko/121.0 Firefox/121.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:121.0) Gecko/121.0 Firefox/121.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:121.0) Gecko/121.0 Firefox/121.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:121.0) Gecko/121.0 Firefox/121.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:121.0) Gecko/121.0 Firefox/121.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:121.0) Gecko/121.0 Firefox/121.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:121.0) Gecko/121.0 Firefox/121.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:121.0) Gecko/121.0 Firefox/121.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:121.0) Gecko/121.0 Firefox/121.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:121.0) Gecko/121.0 Firefox/121.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:121.0) Gecko/121.0 Firefox/121.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:122.0) Gecko/20100101 Firefox/122.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:122.0) Gecko/20100101 Firefox/122.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:122.0) Gecko/122.0 Firefox/122.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:122.0) Gecko/122.0 Firefox/122.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:122.0) Gecko/122.0 Firefox/122.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:122.0) Gecko/122.0 Firefox/122.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:122.0) Gecko/122.0 Firefox/122.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:122.0) Gecko/122.0 Firefox/122.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:122.0) Gecko/122.0 Firefox/122.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:122.0) Gecko/122.0 Firefox/122.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:122.0) Gecko/122.0 Firefox/122.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:122.0) Gecko/122.0 Firefox/122.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:122.0) Gecko/122.0 Firefox/122.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:122.0) Gecko/122.0 Firefox/122.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:122.0) Gecko/122.0 Firefox/122.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:122.0) Gecko/122.0 Firefox/122.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:123.0) Gecko/20100101 Firefox/123.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:123.0) Gecko/20100101 Firefox/123.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:123.0) Gecko/123.0 Firefox/123.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:123.0) Gecko/123.0 Firefox/123.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:123.0) Gecko/123.0 Firefox/123.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:123.0) Gecko/123.0 Firefox/123.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:123.0) Gecko/123.0 Firefox/123.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:123.0) Gecko/123.0 Firefox/123.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:123.0) Gecko/123.0 Firefox/123.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:123.0) Gecko/123.0 Firefox/123.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:123.0) Gecko/123.0 Firefox/123.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:123.0) Gecko/123.0 Firefox/123.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:123.0) Gecko/123.0 Firefox/123.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:123.0) Gecko/123.0 Firefox/123.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:123.0) Gecko/123.0 Firefox/123.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:123.0) Gecko/123.0 Firefox/123.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:124.0) Gecko/20100101 Firefox/124.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:124.0) Gecko/20100101 Firefox/124.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:124.0) Gecko/124.0 Firefox/124.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:124.0) Gecko/124.0 Firefox/124.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:124.0) Gecko/124.0 Firefox/124.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:124.0) Gecko/124.0 Firefox/124.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:124.0) Gecko/124.0 Firefox/124.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:124.0) Gecko/124.0 Firefox/124.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:124.0) Gecko/124.0 Firefox/124.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:124.0) Gecko/124.0 Firefox/124.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:124.0) Gecko/124.0 Firefox/124.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:124.0) Gecko/124.0 Firefox/124.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:124.0) Gecko/124.0 Firefox/124.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:124.0) Gecko/124.0 Firefox/124.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:124.0) Gecko/124.0 Firefox/124.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:124.0) Gecko/124.0 Firefox/124.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:125.0) Gecko/20100101 Firefox/125.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:125.0) Gecko/20100101 Firefox/125.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:125.0) Gecko/125.0 Firefox/125.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:125.0) Gecko/125.0 Firefox/125.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:125.0) Gecko/125.0 Firefox/125.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:125.0) Gecko/125.0 Firefox/125.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:125.0) Gecko/125.0 Firefox/125.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:125.0) Gecko/125.0 Firefox/125.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:125.0) Gecko/125.0 Firefox/125.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:125.0) Gecko/125.0 Firefox/125.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:125.0) Gecko/125.0 Firefox/125.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:125.0) Gecko/125.0 Firefox/125.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:125.0) Gecko/125.0 Firefox/125.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:125.0) Gecko/125.0 Firefox/125.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:125.0) Gecko/125.0 Firefox/125.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:125.0) Gecko/125.0 Firefox/125.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:126.0) Gecko/20100101 Firefox/126.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:126.0) Gecko/20100101 Firefox/126.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:126.0) Gecko/126.0 Firefox/126.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:126.0) Gecko/126.0 Firefox/126.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:126.0) Gecko/126.0 Firefox/126.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:126.0) Gecko/126.0 Firefox/126.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:126.0) Gecko/126.0 Firefox/126.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:126.0) Gecko/126.0 Firefox/126.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:126.0) Gecko/126.0 Firefox/126.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:126.0) Gecko/126.0 Firefox/126.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:126.0) Gecko/126.0 Firefox/126.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:126.0) Gecko/126.0 Firefox/126.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:126.0) Gecko/126.0 Firefox/126.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:126.0) Gecko/126.0 Firefox/126.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:126.0) Gecko/126.0 Firefox/126.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:126.0) Gecko/126.0 Firefox/126.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:127.0) Gecko/20100101 Firefox/127.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:127.0) Gecko/20100101 Firefox/127.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:127.0) Gecko/20100101 Firefox/127.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:127.0) Gecko/127.0 Firefox/127.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:127.0) Gecko/127.0 Firefox/127.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:127.0) Gecko/127.0 Firefox/127.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:127.0) Gecko/127.0 Firefox/127.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:127.0) Gecko/127.0 Firefox/127.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:127.0) Gecko/127.0 Firefox/127.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:127.0) Gecko/127.0 Firefox/127.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:127.0) Gecko/127.0 Firefox/127.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:127.0) Gecko/127.0 Firefox/127.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:127.0) Gecko/127.0 Firefox/127.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:127.0) Gecko/127.0 Firefox/127.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:127.0) Gecko/127.0 Firefox/127.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:127.0) Gecko/127.0 Firefox/127.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:127.0) Gecko/127.0 Firefox/127.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:128.0) Gecko/20100101 Firefox/128.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:128.0) Gecko/128.0 Firefox/128.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:128.0) Gecko/128.0 Firefox/128.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:128.0) Gecko/128.0 Firefox/128.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:128.0) Gecko/128.0 Firefox/128.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:128.0) Gecko/128.0 Firefox/128.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:128.0) Gecko/128.0 Firefox/128.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:128.0) Gecko/128.0 Firefox/128.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:128.0) Gecko/128.0 Firefox/128.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:128.0) Gecko/128.0 Firefox/128.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:128.0) Gecko/128.0 Firefox/128.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:128.0) Gecko/128.0 Firefox/128.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:128.0) Gecko/128.0 Firefox/128.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:128.0) Gecko/128.0 Firefox/128.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:128.0) Gecko/128.0 Firefox/128.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:129.0) Gecko/20100101 Firefox/129.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:129.0) Gecko/20100101 Firefox/129.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:129.0) Gecko/20100101 Firefox/129.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:129.0) Gecko/129.0 Firefox/129.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:129.0) Gecko/129.0 Firefox/129.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:129.0) Gecko/129.0 Firefox/129.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:129.0) Gecko/129.0 Firefox/129.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:129.0) Gecko/129.0 Firefox/129.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:129.0) Gecko/129.0 Firefox/129.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:129.0) Gecko/129.0 Firefox/129.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:129.0) Gecko/129.0 Firefox/129.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:129.0) Gecko/129.0 Firefox/129.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:129.0) Gecko/129.0 Firefox/129.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:129.0) Gecko/129.0 Firefox/129.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:129.0) Gecko/129.0 Firefox/129.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:129.0) Gecko/129.0 Firefox/129.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:129.0) Gecko/129.0 Firefox/129.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:130.0) Gecko/20100101 Firefox/130.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:130.0) Gecko/20100101 Firefox/130.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:130.0) Gecko/130.0 Firefox/130.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:130.0) Gecko/130.0 Firefox/130.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:130.0) Gecko/130.0 Firefox/130.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:130.0) Gecko/130.0 Firefox/130.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:130.0) Gecko/130.0 Firefox/130.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:130.0) Gecko/130.0 Firefox/130.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:130.0) Gecko/130.0 Firefox/130.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:130.0) Gecko/130.0 Firefox/130.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:130.0) Gecko/130.0 Firefox/130.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:130.0) Gecko/130.0 Firefox/130.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:130.0) Gecko/130.0 Firefox/130.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:130.0) Gecko/130.0 Firefox/130.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:130.0) Gecko/130.0 Firefox/130.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:130.0) Gecko/130.0 Firefox/130.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:131.0) Gecko/20100101 Firefox/131.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:131.0) Gecko/20100101 Firefox/131.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:131.0) Gecko/20100101 Firefox/131.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:131.0) Gecko/131.0 Firefox/131.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:131.0) Gecko/131.0 Firefox/131.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:131.0) Gecko/131.0 Firefox/131.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:131.0) Gecko/131.0 Firefox/131.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:131.0) Gecko/131.0 Firefox/131.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:131.0) Gecko/131.0 Firefox/131.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:131.0) Gecko/131.0 Firefox/131.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:131.0) Gecko/131.0 Firefox/131.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:131.0) Gecko/131.0 Firefox/131.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:131.0) Gecko/131.0 Firefox/131.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:131.0) Gecko/131.0 Firefox/131.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:131.0) Gecko/131.0 Firefox/131.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:131.0) Gecko/131.0 Firefox/131.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:131.0) Gecko/131.0 Firefox/131.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:132.0) Gecko/20100101 Firefox/132.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:132.0) Gecko/20100101 Firefox/132.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:132.0) Gecko/20100101 Firefox/132.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:132.0) Gecko/132.0 Firefox/132.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:132.0) Gecko/132.0 Firefox/132.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:132.0) Gecko/132.0 Firefox/132.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:132.0) Gecko/132.0 Firefox/132.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:132.0) Gecko/132.0 Firefox/132.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:132.0) Gecko/132.0 Firefox/132.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:132.0) Gecko/132.0 Firefox/132.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:132.0) Gecko/132.0 Firefox/132.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:132.0) Gecko/132.0 Firefox/132.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:132.0) Gecko/132.0 Firefox/132.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:132.0) Gecko/132.0 Firefox/132.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:132.0) Gecko/132.0 Firefox/132.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:132.0) Gecko/132.0 Firefox/132.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:132.0) Gecko/132.0 Firefox/132.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:133.0) Gecko/20100101 Firefox/133.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:133.0) Gecko/20100101 Firefox/133.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:133.0) Gecko/133.0 Firefox/133.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:133.0) Gecko/133.0 Firefox/133.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:133.0) Gecko/133.0 Firefox/133.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:133.0) Gecko/133.0 Firefox/133.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:133.0) Gecko/133.0 Firefox/133.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:133.0) Gecko/133.0 Firefox/133.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:133.0) Gecko/133.0 Firefox/133.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:133.0) Gecko/133.0 Firefox/133.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:133.0) Gecko/133.0 Firefox/133.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:133.0) Gecko/133.0 Firefox/133.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:133.0) Gecko/133.0 Firefox/133.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:133.0) Gecko/133.0 Firefox/133.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:133.0) Gecko/133.0 Firefox/133.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:133.0) Gecko/133.0 Firefox/133.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:134.0) Gecko/20100101 Firefox/134.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:134.0) Gecko/20100101 Firefox/134.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:134.0) Gecko/134.0 Firefox/134.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:134.0) Gecko/134.0 Firefox/134.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:134.0) Gecko/134.0 Firefox/134.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:134.0) Gecko/134.0 Firefox/134.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:134.0) Gecko/134.0 Firefox/134.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:134.0) Gecko/134.0 Firefox/134.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:134.0) Gecko/134.0 Firefox/134.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:134.0) Gecko/134.0 Firefox/134.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:134.0) Gecko/134.0 Firefox/134.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:134.0) Gecko/134.0 Firefox/134.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:134.0) Gecko/134.0 Firefox/134.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:134.0) Gecko/134.0 Firefox/134.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:134.0) Gecko/134.0 Firefox/134.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:134.0) Gecko/134.0 Firefox/134.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:135.0) Gecko/20100101 Firefox/135.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:135.0) Gecko/20100101 Firefox/135.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:135.0) Gecko/135.0 Firefox/135.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:135.0) Gecko/135.0 Firefox/135.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:135.0) Gecko/135.0 Firefox/135.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:135.0) Gecko/135.0 Firefox/135.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:135.0) Gecko/135.0 Firefox/135.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:135.0) Gecko/135.0 Firefox/135.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:135.0) Gecko/135.0 Firefox/135.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:135.0) Gecko/135.0 Firefox/135.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:135.0) Gecko/135.0 Firefox/135.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:135.0) Gecko/135.0 Firefox/135.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:135.0) Gecko/135.0 Firefox/135.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:135.0) Gecko/135.0 Firefox/135.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:135.0) Gecko/135.0 Firefox/135.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:135.0) Gecko/135.0 Firefox/135.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:136.0) Gecko/20100101 Firefox/136.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:136.0) Gecko/136.0 Firefox/136.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:136.0) Gecko/136.0 Firefox/136.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:136.0) Gecko/136.0 Firefox/136.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:136.0) Gecko/136.0 Firefox/136.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:136.0) Gecko/136.0 Firefox/136.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:136.0) Gecko/136.0 Firefox/136.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:136.0) Gecko/136.0 Firefox/136.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:136.0) Gecko/136.0 Firefox/136.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:136.0) Gecko/136.0 Firefox/136.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:136.0) Gecko/136.0 Firefox/136.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:136.0) Gecko/136.0 Firefox/136.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:136.0) Gecko/136.0 Firefox/136.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:136.0) Gecko/136.0 Firefox/136.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:136.0) Gecko/136.0 Firefox/136.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:137.0) Gecko/20100101 Firefox/137.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:137.0) Gecko/20100101 Firefox/137.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:137.0) Gecko/20100101 Firefox/137.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:137.0) Gecko/137.0 Firefox/137.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:137.0) Gecko/137.0 Firefox/137.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:137.0) Gecko/137.0 Firefox/137.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:137.0) Gecko/137.0 Firefox/137.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:137.0) Gecko/137.0 Firefox/137.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:137.0) Gecko/137.0 Firefox/137.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:137.0) Gecko/137.0 Firefox/137.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:137.0) Gecko/137.0 Firefox/137.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:137.0) Gecko/137.0 Firefox/137.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:137.0) Gecko/137.0 Firefox/137.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:137.0) Gecko/137.0 Firefox/137.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:137.0) Gecko/137.0 Firefox/137.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:137.0) Gecko/137.0 Firefox/137.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:137.0) Gecko/137.0 Firefox/137.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:138.0) Gecko/20100101 Firefox/138.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:138.0) Gecko/20100101 Firefox/138.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:138.0) Gecko/20100101 Firefox/138.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:138.0) Gecko/138.0 Firefox/138.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:138.0) Gecko/138.0 Firefox/138.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:138.0) Gecko/138.0 Firefox/138.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:138.0) Gecko/138.0 Firefox/138.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:138.0) Gecko/138.0 Firefox/138.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:138.0) Gecko/138.0 Firefox/138.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:138.0) Gecko/138.0 Firefox/138.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:138.0) Gecko/138.0 Firefox/138.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:138.0) Gecko/138.0 Firefox/138.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:138.0) Gecko/138.0 Firefox/138.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:138.0) Gecko/138.0 Firefox/138.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:138.0) Gecko/138.0 Firefox/138.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:138.0) Gecko/138.0 Firefox/138.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:138.0) Gecko/138.0 Firefox/138.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:139.0) Gecko/20100101 Firefox/139.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:139.0) Gecko/20100101 Firefox/139.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:139.0) Gecko/20100101 Firefox/139.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:139.0) Gecko/139.0 Firefox/139.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:139.0) Gecko/139.0 Firefox/139.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:139.0) Gecko/139.0 Firefox/139.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:139.0) Gecko/139.0 Firefox/139.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:139.0) Gecko/139.0 Firefox/139.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:139.0) Gecko/139.0 Firefox/139.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:139.0) Gecko/139.0 Firefox/139.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:139.0) Gecko/139.0 Firefox/139.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:139.0) Gecko/139.0 Firefox/139.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:139.0) Gecko/139.0 Firefox/139.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:139.0) Gecko/139.0 Firefox/139.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:139.0) Gecko/139.0 Firefox/139.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:139.0) Gecko/139.0 Firefox/139.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:139.0) Gecko/139.0 Firefox/139.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:140.0) Gecko/20100101 Firefox/140.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:140.0) Gecko/140.0 Firefox/140.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:140.0) Gecko/140.0 Firefox/140.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:140.0) Gecko/140.0 Firefox/140.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:140.0) Gecko/140.0 Firefox/140.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:140.0) Gecko/140.0 Firefox/140.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:140.0) Gecko/140.0 Firefox/140.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:140.0) Gecko/140.0 Firefox/140.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:140.0) Gecko/140.0 Firefox/140.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:140.0) Gecko/140.0 Firefox/140.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:140.0) Gecko/140.0 Firefox/140.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:140.0) Gecko/140.0 Firefox/140.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:140.0) Gecko/140.0 Firefox/140.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:140.0) Gecko/140.0 Firefox/140.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:140.0) Gecko/140.0 Firefox/140.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:141.0) Gecko/20100101 Firefox/141.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:141.0) Gecko/20100101 Firefox/141.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:141.0) Gecko/20100101 Firefox/141.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:141.0) Gecko/141.0 Firefox/141.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:141.0) Gecko/141.0 Firefox/141.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:141.0) Gecko/141.0 Firefox/141.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:141.0) Gecko/141.0 Firefox/141.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:141.0) Gecko/141.0 Firefox/141.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:141.0) Gecko/141.0 Firefox/141.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:141.0) Gecko/141.0 Firefox/141.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:141.0) Gecko/141.0 Firefox/141.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:141.0) Gecko/141.0 Firefox/141.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:141.0) Gecko/141.0 Firefox/141.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:141.0) Gecko/141.0 Firefox/141.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:141.0) Gecko/141.0 Firefox/141.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:141.0) Gecko/141.0 Firefox/141.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:141.0) Gecko/141.0 Firefox/141.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:142.0) Gecko/20100101 Firefox/142.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:142.0) Gecko/20100101 Firefox/142.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:142.0) Gecko/20100101 Firefox/142.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:142.0) Gecko/142.0 Firefox/142.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:142.0) Gecko/142.0 Firefox/142.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:142.0) Gecko/142.0 Firefox/142.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:142.0) Gecko/142.0 Firefox/142.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:142.0) Gecko/142.0 Firefox/142.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:142.0) Gecko/142.0 Firefox/142.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:142.0) Gecko/142.0 Firefox/142.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:142.0) Gecko/142.0 Firefox/142.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:142.0) Gecko/142.0 Firefox/142.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:142.0) Gecko/142.0 Firefox/142.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:142.0) Gecko/142.0 Firefox/142.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:142.0) Gecko/142.0 Firefox/142.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:142.0) Gecko/142.0 Firefox/142.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:142.0) Gecko/142.0 Firefox/142.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0) Gecko/20100101 Firefox/143.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:143.0) Gecko/20100101 Firefox/143.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:143.0) Gecko/20100101 Firefox/143.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:143.0) Gecko/143.0 Firefox/143.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:143.0) Gecko/143.0 Firefox/143.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:143.0) Gecko/143.0 Firefox/143.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:143.0) Gecko/143.0 Firefox/143.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:143.0) Gecko/143.0 Firefox/143.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:143.0) Gecko/143.0 Firefox/143.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:143.0) Gecko/143.0 Firefox/143.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:143.0) Gecko/143.0 Firefox/143.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:143.0) Gecko/143.0 Firefox/143.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:143.0) Gecko/143.0 Firefox/143.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:143.0) Gecko/143.0 Firefox/143.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:143.0) Gecko/143.0 Firefox/143.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:143.0) Gecko/143.0 Firefox/143.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:143.0) Gecko/143.0 Firefox/143.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:144.0) Gecko/20100101 Firefox/144.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:144.0) Gecko/20100101 Firefox/144.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:144.0) Gecko/20100101 Firefox/144.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:144.0) Gecko/144.0 Firefox/144.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:144.0) Gecko/144.0 Firefox/144.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:144.0) Gecko/144.0 Firefox/144.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:144.0) Gecko/144.0 Firefox/144.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:144.0) Gecko/144.0 Firefox/144.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:144.0) Gecko/144.0 Firefox/144.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:144.0) Gecko/144.0 Firefox/144.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:144.0) Gecko/144.0 Firefox/144.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:144.0) Gecko/144.0 Firefox/144.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:144.0) Gecko/144.0 Firefox/144.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:144.0) Gecko/144.0 Firefox/144.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:144.0) Gecko/144.0 Firefox/144.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:144.0) Gecko/144.0 Firefox/144.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:144.0) Gecko/144.0 Firefox/144.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:145.0) Gecko/20100101 Firefox/145.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:145.0) Gecko/20100101 Firefox/145.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:145.0) Gecko/20100101 Firefox/145.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:145.0) Gecko/145.0 Firefox/145.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:145.0) Gecko/145.0 Firefox/145.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:145.0) Gecko/145.0 Firefox/145.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:145.0) Gecko/145.0 Firefox/145.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:145.0) Gecko/145.0 Firefox/145.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:145.0) Gecko/145.0 Firefox/145.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:145.0) Gecko/145.0 Firefox/145.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:145.0) Gecko/145.0 Firefox/145.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:145.0) Gecko/145.0 Firefox/145.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:145.0) Gecko/145.0 Firefox/145.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:145.0) Gecko/145.0 Firefox/145.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:145.0) Gecko/145.0 Firefox/145.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:145.0) Gecko/145.0 Firefox/145.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:145.0) Gecko/145.0 Firefox/145.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:146.0) Gecko/20100101 Firefox/146.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:146.0) Gecko/20100101 Firefox/146.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:146.0) Gecko/20100101 Firefox/146.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:146.0) Gecko/146.0 Firefox/146.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:146.0) Gecko/146.0 Firefox/146.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:146.0) Gecko/146.0 Firefox/146.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:146.0) Gecko/146.0 Firefox/146.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:146.0) Gecko/146.0 Firefox/146.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:146.0) Gecko/146.0 Firefox/146.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:146.0) Gecko/146.0 Firefox/146.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:146.0) Gecko/146.0 Firefox/146.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:146.0) Gecko/146.0 Firefox/146.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:146.0) Gecko/146.0 Firefox/146.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:146.0) Gecko/146.0 Firefox/146.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:146.0) Gecko/146.0 Firefox/146.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:146.0) Gecko/146.0 Firefox/146.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:146.0) Gecko/146.0 Firefox/146.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:147.0) Gecko/20100101 Firefox/147.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:147.0) Gecko/20100101 Firefox/147.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:147.0) Gecko/147.0 Firefox/147.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:147.0) Gecko/147.0 Firefox/147.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:147.0) Gecko/147.0 Firefox/147.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:147.0) Gecko/147.0 Firefox/147.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:147.0) Gecko/147.0 Firefox/147.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:147.0) Gecko/147.0 Firefox/147.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:147.0) Gecko/147.0 Firefox/147.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:147.0) Gecko/147.0 Firefox/147.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:147.0) Gecko/147.0 Firefox/147.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:147.0) Gecko/147.0 Firefox/147.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:147.0) Gecko/147.0 Firefox/147.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:147.0) Gecko/147.0 Firefox/147.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:147.0) Gecko/147.0 Firefox/147.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:147.0) Gecko/147.0 Firefox/147.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:148.0) Gecko/20100101 Firefox/148.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:148.0) Gecko/148.0 Firefox/148.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:148.0) Gecko/148.0 Firefox/148.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:148.0) Gecko/148.0 Firefox/148.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:148.0) Gecko/148.0 Firefox/148.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:148.0) Gecko/148.0 Firefox/148.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:148.0) Gecko/148.0 Firefox/148.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:148.0) Gecko/148.0 Firefox/148.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:148.0) Gecko/148.0 Firefox/148.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:148.0) Gecko/148.0 Firefox/148.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:148.0) Gecko/148.0 Firefox/148.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:148.0) Gecko/148.0 Firefox/148.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:148.0) Gecko/148.0 Firefox/148.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:148.0) Gecko/148.0 Firefox/148.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:148.0) Gecko/148.0 Firefox/148.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:149.0) Gecko/149.0 Firefox/149.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:149.0) Gecko/149.0 Firefox/149.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:149.0) Gecko/149.0 Firefox/149.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:149.0) Gecko/149.0 Firefox/149.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:149.0) Gecko/149.0 Firefox/149.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:149.0) Gecko/149.0 Firefox/149.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:149.0) Gecko/149.0 Firefox/149.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:149.0) Gecko/149.0 Firefox/149.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:149.0) Gecko/149.0 Firefox/149.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:149.0) Gecko/149.0 Firefox/149.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:149.0) Gecko/149.0 Firefox/149.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:149.0) Gecko/149.0 Firefox/149.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:149.0) Gecko/149.0 Firefox/149.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:149.0) Gecko/149.0 Firefox/149.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:150.0) Gecko/150.0 Firefox/150.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:150.0) Gecko/150.0 Firefox/150.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:150.0) Gecko/150.0 Firefox/150.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:150.0) Gecko/150.0 Firefox/150.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:150.0) Gecko/150.0 Firefox/150.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:150.0) Gecko/150.0 Firefox/150.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:150.0) Gecko/150.0 Firefox/150.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:150.0) Gecko/150.0 Firefox/150.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:150.0) Gecko/150.0 Firefox/150.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:150.0) Gecko/150.0 Firefox/150.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:150.0) Gecko/150.0 Firefox/150.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:150.0) Gecko/150.0 Firefox/150.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:150.0) Gecko/150.0 Firefox/150.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:150.0) Gecko/150.0 Firefox/150.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:151.0) Gecko/20100101 Firefox/151.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:151.0) Gecko/20100101 Firefox/151.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:151.0) Gecko/20100101 Firefox/151.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:151.0) Gecko/151.0 Firefox/151.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:151.0) Gecko/151.0 Firefox/151.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:151.0) Gecko/151.0 Firefox/151.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:151.0) Gecko/151.0 Firefox/151.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:151.0) Gecko/151.0 Firefox/151.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:151.0) Gecko/151.0 Firefox/151.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:151.0) Gecko/151.0 Firefox/151.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:151.0) Gecko/151.0 Firefox/151.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:151.0) Gecko/151.0 Firefox/151.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:151.0) Gecko/151.0 Firefox/151.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:151.0) Gecko/151.0 Firefox/151.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:151.0) Gecko/151.0 Firefox/151.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:151.0) Gecko/151.0 Firefox/151.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:151.0) Gecko/151.0 Firefox/151.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:152.0) Gecko/20100101 Firefox/152.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:152.0) Gecko/20100101 Firefox/152.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:152.0) Gecko/20100101 Firefox/152.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:152.0) Gecko/152.0 Firefox/152.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:152.0) Gecko/152.0 Firefox/152.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:152.0) Gecko/152.0 Firefox/152.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:152.0) Gecko/152.0 Firefox/152.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:152.0) Gecko/152.0 Firefox/152.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:152.0) Gecko/152.0 Firefox/152.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:152.0) Gecko/152.0 Firefox/152.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:152.0) Gecko/152.0 Firefox/152.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:152.0) Gecko/152.0 Firefox/152.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:152.0) Gecko/152.0 Firefox/152.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:152.0) Gecko/152.0 Firefox/152.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:152.0) Gecko/152.0 Firefox/152.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:152.0) Gecko/152.0 Firefox/152.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:152.0) Gecko/152.0 Firefox/152.0',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:153.0) Gecko/20100101 Firefox/153.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:153.0) Gecko/20100101 Firefox/153.0',
    'Mozilla/5.0 (X11; Linux x86_64; rv:153.0) Gecko/20100101 Firefox/153.0',
    'Mozilla/5.0 (Android 10; Mobile; rv:153.0) Gecko/153.0 Firefox/153.0',
    'Mozilla/5.0 (Android 10; Tablet; rv:153.0) Gecko/153.0 Firefox/153.0',
    'Mozilla/5.0 (Android 11; Mobile; rv:153.0) Gecko/153.0 Firefox/153.0',
    'Mozilla/5.0 (Android 11; Tablet; rv:153.0) Gecko/153.0 Firefox/153.0',
    'Mozilla/5.0 (Android 12; Mobile; rv:153.0) Gecko/153.0 Firefox/153.0',
    'Mozilla/5.0 (Android 12; Tablet; rv:153.0) Gecko/153.0 Firefox/153.0',
    'Mozilla/5.0 (Android 13; Mobile; rv:153.0) Gecko/153.0 Firefox/153.0',
    'Mozilla/5.0 (Android 13; Tablet; rv:153.0) Gecko/153.0 Firefox/153.0',
    'Mozilla/5.0 (Android 14; Mobile; rv:153.0) Gecko/153.0 Firefox/153.0',
    'Mozilla/5.0 (Android 14; Tablet; rv:153.0) Gecko/153.0 Firefox/153.0',
    'Mozilla/5.0 (Android 15; Mobile; rv:153.0) Gecko/153.0 Firefox/153.0',
    'Mozilla/5.0 (Android 15; Tablet; rv:153.0) Gecko/153.0 Firefox/153.0',
    'Mozilla/5.0 (Android 16; Mobile; rv:153.0) Gecko/153.0 Firefox/153.0',
    'Mozilla/5.0 (Android 16; Tablet; rv:153.0) Gecko/153.0 Firefox/153.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 16_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 16_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.2 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 16_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.2 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 16_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.2 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 16_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 16_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.4 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 16_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.4 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 16_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.4 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 17_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 17_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 17_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 17_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.3 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 17_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.3 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 17_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.3 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 17_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 17_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 18_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 18_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.1 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 18_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.1 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 18_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.1 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.2 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 18_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.2 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 18_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.2 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 18_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 18_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.4 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 18_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.4 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 18_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.4 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.6 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 18_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.6 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 18_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.6 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 26_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 26_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.1 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 26_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.1 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 26_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.1 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.2 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 26_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.2 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 26_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.2 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.3 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 26_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.3 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 26_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.3 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.4 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 26_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.4 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 26_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.4 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.5 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 26_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.5 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 26_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.5 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6 Safari/605.1.15',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 26_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6 Mobile/15E148 Safari/604.1',
    'Mozilla/5.0 (iPad; CPU OS 26_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6 Mobile/15E148 Safari/604.1',
]


# --------------------------------------------------------------------
# Carregamento e classificação de User‑Agents
# --------------------------------------------------------------------
def classificar_ua(ua: str) -> str:
    """Retorna 'chromium', 'firefox' ou 'webkit' de acordo com o UA."""
    low = ua.lower()
    if "firefox" in low and "gecko" in low and "chrome" not in low:
        return "firefox"
    if "safari" in low and "chrome" not in low and "android" not in low:
        return "webkit"
    if any(dev in low for dev in ["iphone", "ipad", "ipod"]):
        return "webkit"
    return "chromium"

def load_useragents() -> Dict[str, List[str]]:
    """Classifica UAs embutidos por motor. Se existir useragents.txt, ele tem prioridade."""
    pools = {"chromium": [], "firefox": [], "webkit": []}
    sources = list(EMBEDDED_USER_AGENTS)

    # Arquivo externo opcional (sobrescreve embutido se existir e tiver conteúdo)
    if UA_FILE.exists():
        try:
            file_uas = [l.strip() for l in UA_FILE.read_text(encoding="utf-8").splitlines() if l.strip()]
            if file_uas:
                sources = file_uas
                log.info("UAs carregados de arquivo externo: %s (%d)", UA_FILE, len(file_uas))
        except Exception as e:
            log.warning("Falha ao ler %s: %s — usando lista embutida", UA_FILE, e)

    for ua in sources:
        pools[classificar_ua(ua)].append(ua)

    if not pools["chromium"]:
        pools["chromium"].append(
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36"
        )
    if not pools["firefox"]:
        pools["firefox"].append(
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0"
        )
    if not pools["webkit"]:
        pools["webkit"].append(
            "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/605.1.15"
        )
    return pools

# --------------------------------------------------------------------
# Dispositivos Playwright associados a cada motor
# --------------------------------------------------------------------
def get_device_for_engine(playwright, motor: str, is_mobile: bool, ua: str):
    """Retorna um device name apropriado para o motor e tipo de dispositivo."""
    devices = playwright.devices
    if is_mobile:
        if motor == "chromium":
            candidates = [d for d in devices if "Galaxy" in d or "Pixel" in d or "Nexus" in d]
            if candidates:
                return random.choice(candidates)
            return "Galaxy S20"
        elif motor == "firefox":
            return "Galaxy S9+ Firefox" if "Galaxy S9+ Firefox" in devices else "Galaxy S20"
        elif motor == "webkit":
            if "iPhone 12" in devices:
                return "iPhone 12"
            return "Desktop Safari"
    else:
        if motor == "chromium":
            return "Desktop Chrome"
        elif motor == "firefox":
            return "Desktop Firefox"
        elif motor == "webkit":
            return "Desktop Safari"
    return "Desktop Chrome"

# --------------------------------------------------------------------
# Timezone preciso
# --------------------------------------------------------------------
def get_timezone(lat, lon):
    """Retorna o timezone para as coordenadas usando timezonefinder, ou fallback."""
    if tf:
        tz = tf.timezone_at(lat=lat, lng=lon)
        if tz:
            return tz
    # fallback baseado em latitude
    if lat < -15:
        return "America/Sao_Paulo"
    elif lat < -4:
        return "America/Cuiaba"
    else:
        return "America/Fortaleza"

# --------------------------------------------------------------------
# Funções auxiliares
# --------------------------------------------------------------------
def same_host(url: str, target_host: str) -> bool:
    try:
        host = (urlparse(url).hostname or "").lower()
        base = target_host.lstrip("www.")
        return host == target_host or host.endswith("." + base) or host.lstrip("www.") == base
    except:
        return False

def filter_page_links(links, target_host):
    blocked_ext = {".jpg", ".jpeg", ".png", ".webp", ".gif", ".svg",
                   ".pdf", ".zip", ".rar", ".mp4", ".mp3", ".css", ".js",
                   ".woff", ".woff2", ".ttf"}
    out = []
    for link in links:
        lower = link.lower().split("?", 1)[0]
        if not same_host(link, target_host):
            continue
        if "/wp-content/" in lower:
            continue
        if any(lower.endswith(ext) for ext in blocked_ext):
            continue
        out.append(link)
    return sorted(set(out))

async def load_site_links(site_url, target_host, cache_file):
    if cache_file and cache_file.exists():
        try:
            data = json.loads(cache_file.read_text(encoding="utf-8"))
            links = data.get("links", [])
            links = filter_page_links(links, target_host)
            if links:
                log.info("✅ Cache carregado: %d links", len(links))
                return links
        except Exception as e:
            log.warning("Cache inválido: %s", e)

    log.info("🔄 Descobrindo sitemaps e percorrendo XMLs recursivamente ...")
    todos_links = {site_url}
    visitados = set()

    try:
        import certifi
        ssl_context = ssl.create_default_context(cafile=certifi.where())
    except ImportError:
        ssl_context = ssl.create_default_context()

    ssl_context.check_hostname = False
    ssl_context.verify_mode = ssl.CERT_NONE

    def local_name(tag):
        """Remove namespace XML: {namespace}sitemapindex -> sitemapindex."""
        if not isinstance(tag, str):
            return ""
        return tag.rsplit("}", 1)[-1].lower()

    def extract_locs(root):
        """
        Extrai todos os <loc> independentemente do namespace XML.
        Isso cobre sitemapindex/urlset padrão, WordPress, Yoast, Rank Math etc.
        """
        locs = []
        for elem in root.iter():
            if local_name(elem.tag) == "loc":
                value = (elem.text or "").strip()
                if value:
                    locs.append(value)
        return locs

    async def fetch_sitemap(url, session, sem):
        async with sem:
            if url in visitados:
                return []

            visitados.add(url)

            body = None
            content_type = ""

            for attempt in range(1, 8):
                try:
                    async with session.get(
                        url,
                        timeout=aiohttp.ClientTimeout(total=120),
                        ssl=ssl_context,
                        allow_redirects=True,
                    ) as resp:
                        if resp.status != 200:
                            log.debug("Sitemap HTTP %s: %s", resp.status, url)
                            return []

                        body = await resp.read()
                        content_type = (resp.headers.get("Content-Type") or "").lower()
                        break

                except Exception as e:
                    if attempt == 7:
                        log.debug("Falha definitiva sitemap %s: %s", url, e)
                        return []
                    await asyncio.sleep(attempt * 5 + random.uniform(2, 8))

            if not body:
                return []

            # Suporte a sitemap.xml.gz / sitemap_index.xml.gz.
            try:
                is_gzip = (
                    urlparse(url).path.lower().endswith(".gz")
                    or body[:2] == b"\x1f\x8b"
                    or "gzip" in content_type
                )
                if is_gzip:
                    import gzip
                    body = gzip.decompress(body)
            except Exception as e:
                log.debug("Falha ao descompactar sitemap %s: %s", url, e)
                return []

            try:
                root = ET.fromstring(body)
            except Exception as e:
                log.debug("Falha parse XML %s: %s", url, e)
                return []

            root_type = local_name(root.tag)
            locs = extract_locs(root)

            nested_sitemaps = []

            if root_type == "sitemapindex":
                # Todo <loc> deste documento aponta para outro sitemap.
                for child in locs:
                    if (
                        child.startswith(("http://", "https://"))
                        and same_host(child, target_host)
                    ):
                        nested_sitemaps.append(child)

                log.debug(
                    "Sitemap index %s -> %d XML(s) filho(s)",
                    url,
                    len(nested_sitemaps),
                )
                return nested_sitemaps

            if root_type == "urlset":
                # Sitemap final: <loc> aponta para páginas do site.
                for link in locs:
                    if (
                        link.startswith(("http://", "https://"))
                        and same_host(link, target_host)
                    ):
                        todos_links.add(link)

                log.debug(
                    "URL sitemap %s -> %d URL(s)",
                    url,
                    len(locs),
                )
                return []

            # Fallback para XMLs não padronizados.
            # XMLs encontrados dentro deles voltam para a fila;
            # URLs normais entram em todos_links.
            for value in locs:
                if not (
                    value.startswith(("http://", "https://"))
                    and same_host(value, target_host)
                ):
                    continue

                path = urlparse(value).path.lower()
                if path.endswith((".xml", ".xml.gz")):
                    nested_sitemaps.append(value)
                else:
                    todos_links.add(value)

            return nested_sitemaps

    if EMBEDDED_USER_AGENTS:
        headers = {"User-Agent": random.choice(EMBEDDED_USER_AGENTS)}
    else:
        headers = {
            "User-Agent": (
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                "AppleWebKit/537.36 (KHTML, like Gecko) "
                "Chrome/121.0.0.0 Safari/537.36"
            )
        }

    connector = aiohttp.TCPConnector(ssl=ssl_context, limit=8)

    async with aiohttp.ClientSession(headers=headers, connector=connector) as session:
        sem = asyncio.Semaphore(3)

        # Seeds iniciais. Depois daqui a descoberta é recursiva:
        # qualquer XML encontrado dentro de outro XML entra automaticamente na fila.
        common_sitemaps = [
            "sitemap_index.xml",
            "sitemap-index.xml",
            "sitemap.xml",
            "wp-sitemap.xml",
            "post-sitemap.xml",
            "page-sitemap.xml",
            "product-sitemap.xml",
            "category-sitemap.xml",
            "post_tag-sitemap.xml",
            "author-sitemap.xml",
            "product_cat-sitemap.xml",
            "product_tag-sitemap.xml",
            "news-sitemap.xml",
            "video-sitemap.xml",
            "image-sitemap.xml",
            "sitemap-news.xml",
            "sitemap-video.xml",
            "sitemap-image.xml",
            "sitemap-posts.xml",
            "sitemap-pages.xml",
            "sitemap-products.xml",
            "sitemap-categories.xml",
            "sitemap1.xml",
            "sitemap2.xml",
            "sitemap3.xml",
            "sitemap.xml.gz",
            "sitemap_index.xml.gz",
            "sitemap-index.xml.gz",
            "sitemap/sitemap.xml",
            "sitemaps/sitemap.xml",
            "sitemap/index.xml",
            "sitemaps/index.xml",
            "sitemap/sitemap_index.xml",
            "sitemaps/sitemap_index.xml",
        ]

        queue = deque(f"{site_url}{path}" for path in common_sitemaps)

        # robots.txt pode declarar um ou vários sitemaps customizados.
        try:
            robots_url = f"{site_url}robots.txt"
            async with session.get(
                robots_url,
                timeout=aiohttp.ClientTimeout(total=30),
                ssl=ssl_context,
                allow_redirects=True,
            ) as robots_resp:
                if robots_resp.status == 200:
                    robots_text = await robots_resp.text(errors="replace")
                    for line in robots_text.splitlines():
                        if line.strip().lower().startswith("sitemap:"):
                            declared = line.split(":", 1)[1].strip()
                            if (
                                declared.startswith(("http://", "https://"))
                                and same_host(declared, target_host)
                            ):
                                queue.appendleft(declared)
        except Exception as e:
            log.debug("robots.txt não forneceu sitemap: %s", e)

        tasks = set()

        # Fila recursiva/BFS:
        # sitemap.xml -> post-sitemap.xml -> outro-index.xml -> ...
        # Não há limite artificial de profundidade; visitados evita loop.
        while queue or tasks:
            while queue and len(tasks) < 6:
                url = queue.popleft()
                if url not in visitados:
                    tasks.add(
                        asyncio.create_task(fetch_sitemap(url, session, sem))
                    )

            if not tasks:
                break

            done, pending = await asyncio.wait(
                tasks,
                return_when=asyncio.FIRST_COMPLETED,
            )
            tasks = pending

            for task in done:
                try:
                    novos_xml = await task
                    for child in novos_xml or []:
                        if child not in visitados:
                            queue.append(child)
                except Exception as e:
                    log.debug("Task de sitemap falhou: %s", e)

    links_validos = filter_page_links(list(todos_links), target_host)
    log.info(
        "🎉 Sitemap concluído: %d XML(s) percorrido(s), %d links válidos",
        len(visitados),
        len(links_validos),
    )

    if cache_file:
        try:
            cache_file.write_text(
                json.dumps(
                    {
                        "timestamp": datetime.now().isoformat(),
                        "links": links_validos,
                    },
                    ensure_ascii=False,
                    indent=2,
                ),
                encoding="utf-8",
            )
        except Exception as e:
            log.warning("Erro ao salvar cache: %s", e)

    return links_validos

def choose_journey(keywords):
    """
    Decide o caminho do visitante:
    - Sem keywords: sempre site de referência (TikTok, X, etc.)
    - Com keywords: ~60% referrer popular, ~40% motor de busca
    Retorna (tipo, url_referrer, keyword)
    """
    keywords = [k for k in (keywords or []) if k]
    # Sem palavras-chave → só jornada por referrer
    if not keywords or random.random() < 0.6:
        referrer = random.choice(REFERRER_SITES)
        return "referrer", referrer, None

    names = list(SEARCH_SOURCES)
    weights = [SEARCH_SOURCES[n]["weight"] for n in names]
    name = random.choices(names, weights=weights, k=1)[0]
    keyword = random.choice(keywords)
    search_url = SEARCH_SOURCES[name]["base"] + quote_plus(keyword)
    return "search", search_url, keyword

# --------------------------------------------------------------------
# Rede / anti-travamento
# --------------------------------------------------------------------
async def is_online() -> bool:
    """Checagem leve de conectividade (não depende do Playwright)."""
    timeout = aiohttp.ClientTimeout(total=6)
    try:
        async with aiohttp.ClientSession(timeout=timeout) as session:
            async with session.get("https://www.google.com/generate_204") as resp:
                return resp.status in (204, 200)
    except Exception:
        pass
    try:
        async with aiohttp.ClientSession(timeout=timeout) as session:
            async with session.get("https://1.1.1.1", ssl=False) as resp:
                return True
    except Exception:
        return False


async def wait_until_online(poll_s: float = NETWORK_POLL_S):
    """Pausa o bot enquanto não houver internet (ex.: modem reiniciando)."""
    if await is_online():
        return
    log.warning("⚠️  Sem internet — pausando até a conexão voltar...")
    while not await is_online():
        await asyncio.sleep(poll_s)
    log.info("✅ Internet restabelecida — retomando")
    await asyncio.sleep(3)  # estabiliza DNS/rota após o modem


async def safe_close_page(page: Optional[Page]):
    if not page:
        return
    try:
        await asyncio.wait_for(page.close(), timeout=CLOSE_TIMEOUT_S)
    except Exception:
        try:
            await page.close()
        except Exception:
            pass


async def safe_close_context(context: Optional[BrowserContext]):
    if not context:
        return
    try:
        await asyncio.wait_for(context.close(), timeout=CLOSE_TIMEOUT_S)
    except Exception:
        try:
            await context.close()
        except Exception:
            pass


async def safe_goto(page: Page, url: str, timeout_ms: int = GOTO_TIMEOUT_MS, referer: Optional[str] = None):
    """page.goto com timeout curto e Referer opcional; não engole o erro — quem chama decide."""
    kw = {"wait_until": "domcontentloaded", "timeout": timeout_ms}
    if referer and str(referer).startswith("http"):
        kw["referer"] = referer
    return await page.goto(url, **kw)


# --------------------------------------------------------------------
# Movimentos humanos (nativos do Playwright)
# --------------------------------------------------------------------
async def human_movements(page: Page, is_mobile: bool, duration: float = 5.0):
    try:
        vp = page.viewport_size or {"width": 1280, "height": 720}
        w, h = vp["width"], vp["height"]
        end_time = asyncio.get_running_loop().time() + duration

        while asyncio.get_running_loop().time() < end_time:
            if is_mobile:
                if random.random() < 0.4:
                    await page.touchscreen.tap(random.randint(30, w-30), random.randint(100, h-100))
                await page.mouse.wheel(0, random.randint(200, 500))
                await asyncio.sleep(random.uniform(0.5, 2.0))
            else:
                await page.mouse.wheel(0, random.randint(250, 600))
                await asyncio.sleep(random.uniform(0.8, 2.5))
                if random.random() < 0.2:
                    await page.mouse.wheel(0, -random.randint(200, 400))
                    await asyncio.sleep(0.5)
                # movimento Bézier via page.mouse.move (eventos reais)
                start_x, start_y = random.randint(100, w-100), random.randint(100, h-100)
                end_x, end_y = random.randint(100, w-100), random.randint(100, h-100)
                steps = 20
                for i in range(steps+1):
                    t = i/steps
                    x = start_x + (end_x - start_x) * t + (random.random()-0.5)*30
                    y = start_y + (end_y - start_y) * t + (random.random()-0.5)*30
                    await page.mouse.move(x, y)
                    await asyncio.sleep(0.03)
                await asyncio.sleep(0.5)
    except:
        pass

async def check_blocked(page):
    try:
        content = (await page.content()).lower()
        if any(w in content for w in ["captcha", "recaptcha", "blocked", "acesso negado", "access denied"]):
            return True
        if len(content) < 500:
            return True
        if "challenge-platform" in content or "__cf_chl" in content:
            return True
    except Exception:
        pass
    return False


async def click_random_page_link(page: Page, is_mobile: bool = False) -> bool:
    """
    Na página de referência/busca, escolhe um link interno aleatório e clica.
    Assim o referer final pode ser uma URL interna do site (não só a home).
    """
    try:
        links = await page.eval_on_selector_all(
            "a[href]",
            """els => els
                .map(el => ({href: el.href, text: (el.innerText || '').trim()}))
                .filter(l =>
                    l.href &&
                    l.href.startsWith('http') &&
                    !l.href.includes('#') &&
                    !l.href.toLowerCase().startsWith('javascript:') &&
                    l.href !== window.location.href &&
                    (l.href.startsWith(window.location.origin) ||
                     l.href.includes(window.location.hostname.replace(/^www\\./, '')))
                )
            """,
        )
        if not links:
            # fallback: qualquer link http da página
            links = await page.eval_on_selector_all(
                "a[href]",
                """els => els
                    .map(el => ({href: el.href, text: (el.innerText || '').trim()}))
                    .filter(l =>
                        l.href &&
                        l.href.startsWith('http') &&
                        !l.href.includes('#') &&
                        !l.href.toLowerCase().startsWith('javascript:')
                    )
                """,
            )
        if not links:
            return False

        escolhido = random.choice(links[:40] if len(links) > 40 else links)
        log.info("  🔗 Referrer → link interno: %s", (escolhido.get("href") or "")[:90])

        el = await page.query_selector(f'a[href="{escolhido["href"]}"]')
        if not el:
            # href relativo / normalizado
            await page.goto(escolhido["href"], wait_until="domcontentloaded", timeout=25000)
            await asyncio.sleep(random.uniform(1.0, 2.5))
            return True

        await el.scroll_into_view_if_needed()
        await asyncio.sleep(random.uniform(0.3, 1.0))
        if not is_mobile:
            try:
                await el.hover(timeout=2000)
                await asyncio.sleep(random.uniform(0.2, 0.6))
            except Exception:
                pass
        await el.click(timeout=5000)
        await page.wait_for_load_state("domcontentloaded", timeout=25000)
        await asyncio.sleep(random.uniform(1.0, 3.0))
        return True
    except Exception as e:
        log.debug("click_random_page_link: %s", e)
        return False


# --------------------------------------------------------------------
# Defesas de fingerprint (apenas Chromium)
# --------------------------------------------------------------------
async def inject_fingerprint_defenses(page: Page, motor: str, is_mobile: bool):
    """Aplica pequenas defesas para reduzir detecção. Para Firefox/WebKit, não altera."""
    if motor == "chromium":
        # Pares realistas (vendor, renderer)
        vendor_renderer_pairs = [
            ("Intel Inc.", "ANGLE (Intel, Intel(R) UHD Graphics Direct3D11 vs_5_0)"),
            ("NVIDIA Corporation", "ANGLE (NVIDIA, NVIDIA GeForce GTX 1650 Direct3D11 vs_5_0)"),
            ("AMD", "ANGLE (AMD Radeon RX 580 Direct3D11 vs_5_0)"),
            ("Qualcomm", "Adreno (TM) 640"),
            ("Qualcomm", "Adreno (TM) 650"),
            ("ARM", "Mali-G78"),
            ("ARM", "Mali-G77"),
            ("Imagination Technologies", "PowerVR Rogue GE8320"),
        ]
        if is_mobile:
            pairs = [p for p in vendor_renderer_pairs if p[0] in ("Qualcomm", "ARM", "Imagination Technologies")]
        else:
            pairs = [p for p in vendor_renderer_pairs if p[0] in ("Intel Inc.", "NVIDIA Corporation", "AMD")]
        if not pairs:
            pairs = vendor_renderer_pairs
        vendor, renderer = random.choice(pairs)

        canvas_seed = secrets.token_hex(16)
        script = f"""
(() => {{
    const seed = '{canvas_seed}';
    const getOffset = (x, y, idx) => {{
        const h = (seed.charCodeAt((x*31 + y*17 + idx) % seed.length) % 5) - 2;
        return h;
    }};
    const origGetImageData = CanvasRenderingContext2D.prototype.getImageData;
    CanvasRenderingContext2D.prototype.getImageData = function(x, y, w, h) {{
        const imgData = origGetImageData.call(this, x, y, w, h);
        for (let i = 0; i < imgData.data.length; i += 4) {{
            const px = x + (Math.floor(i/4) % w);
            const py = y + Math.floor(Math.floor(i/4) / w);
            const off = getOffset(px, py, i);
            imgData.data[i] = Math.min(255, Math.max(0, imgData.data[i] + off));
        }}
        return imgData;
    }};

    const origGetParam = WebGLRenderingContext.prototype.getParameter;
    WebGLRenderingContext.prototype.getParameter = function(param) {{
        if (param === 37445) return '{vendor}';
        if (param === 37446) return '{renderer}';
        return origGetParam.call(this, param);
    }};
    try {{
        const origGetParam2 = WebGL2RenderingContext.prototype.getParameter;
        WebGL2RenderingContext.prototype.getParameter = function(param) {{
            if (param === 37445) return '{vendor}';
            if (param === 37446) return '{renderer}';
            return origGetParam2.call(this, param);
        }};
    }} catch(e) {{}}
}})();
"""
        await page.add_init_script(script)

# --------------------------------------------------------------------
# Jornada completa de um visitante
# --------------------------------------------------------------------
async def visit(
    p,
    browsers: Dict[str, Browser],
    idx: int,
    site_url: str,
    cycle: int,
    target_host: str,
    results_file: Path,
    ua_pools: Dict[str, List[str]],
    keywords: List[str],
) -> "VisitResult":
    started = asyncio.get_running_loop().time()
    journey_type, referrer_url, keyword = choose_journey(keywords)

    # Escolhe motor e UA apenas entre engines disponíveis em browsers/ua_pools
    available = [m for m in ("chromium", "firefox", "webkit") if m in browsers and ua_pools.get(m)]
    if not available:
        available = [m for m in browsers.keys() if ua_pools.get(m)] or list(browsers.keys())
    if not available:
        raise RuntimeError("Nenhum browser disponível para a visita")

    weights_map = {"chromium": 70, "firefox": 15, "webkit": 15}
    weights = [weights_map.get(m, 10) for m in available]
    motor = random.choices(available, weights=weights, k=1)[0]
    pool = ua_pools.get(motor) or ua_pools.get("chromium") or next(iter(ua_pools.values()))
    chosen_ua = random.choice(pool)

    # Determina se é mobile baseado no UA
    is_mobile = any(kw in chosen_ua.lower() for kw in ["mobile", "android", "iphone", "ipad", "ipod"])

    # Device apropriado
    device_name = get_device_for_engine(p, motor, is_mobile, chosen_ua)
    dev = p.devices.get(device_name)
    if not dev:
        dev = p.devices.get("Desktop Chrome")
        is_mobile = False

    # Geolocalização e timezone
    lat = round(random.uniform(-33.5, 5.0), 6)
    lon = round(random.uniform(-73.5, -34.8), 6)
    geo = {"latitude": lat, "longitude": lon, "accuracy": random.randint(10, 50)}
    tz = get_timezone(lat, lon)

    browser = browsers[motor]
    context = await browser.new_context(
        viewport=dev.get("viewport", {"width": 1280, "height": 720}),
        user_agent=chosen_ua,
        device_scale_factor=dev.get("device_scale_factor", 1.0),
        is_mobile=is_mobile,
        has_touch=dev.get("has_touch", is_mobile),
        locale=LOCALE,
        timezone_id=tz,
        geolocation=geo,
        permissions=["geolocation"],
        ignore_https_errors=True,
        bypass_csp=True,
    )

    # Stealth (silencioso se falhar)
    try:
        stealth = Stealth()
        await stealth.apply_stealth_async(context)
    except:
        pass

    page = None
    result = VisitResult(cycle=cycle, visitor=idx, source=journey_type,
                         persona="mobile" if is_mobile else "desktop",
                         url=site_url, status="?", blocked=False, ga_hits=0,
                         elapsed_s=0, error="", state_profile="organic")
    try:
        page = await context.new_page()

        # Monitor GA hits
        ga_hits = []
        def on_req(request):
            url = request.url
            if any(t in url for t in ("google-analytics.com/g/collect",
                                       "google-analytics.com/collect",
                                       "googletagmanager.com/gtag/js")):
                ga_hits.append(url)
        page.on("request", on_req)

        # Aplica defesas de fingerprint se necessário
        await inject_fingerprint_defenses(page, motor, is_mobile)

        # 1. Visita o referrer (site popular ou busca)
        ref_header = None
        if journey_type == "referrer":
            try:
                await safe_goto(page, referrer_url, timeout_ms=GOTO_TIMEOUT_MS)
                await human_movements(page, is_mobile, duration=random.uniform(2, 5))
                await click_random_page_link(page, is_mobile)
                await asyncio.sleep(random.uniform(1.0, 3.0))
                if page.url and page.url.startswith("http"):
                    ref_header = page.url
                else:
                    ref_header = referrer_url
            except Exception:
                ref_header = referrer_url
            resp = await safe_goto(
                page, site_url, timeout_ms=GOTO_TIMEOUT_MS, referer=ref_header
            )
        else:  # search
            try:
                await safe_goto(page, referrer_url, timeout_ms=GOTO_TIMEOUT_MS)
                await human_movements(page, is_mobile, duration=random.uniform(3, 7))
                await click_random_page_link(page, is_mobile)
                await asyncio.sleep(random.uniform(1.0, 2.5))
                if page.url and page.url.startswith("http"):
                    ref_header = page.url
            except Exception:
                pass
            resp = await safe_goto(
                page, site_url, timeout_ms=GOTO_TIMEOUT_MS, referer=ref_header
            )

        status = str(resp.status if resp else "?")
        blocked = status in {"401", "403", "406", "409", "423", "429", "503"}

        # Interage no site alvo (cap para não estourar VISIT_MAX)
        dwell = random.uniform(config["dwell_min"], config["dwell_max"])
        await human_movements(page, is_mobile, duration=min(dwell, 25.0))

        if not blocked:
            blocked = await check_blocked(page)

        result.status = status
        result.blocked = blocked
        result.ga_hits = len(ga_hits)

        log.info(
            "[VIS %3d] %-20s | Motor: %s | UA: %s | Jornada: %s | Status: %s | Bloqueado: %s",
            idx,
            device_name,
            motor,
            chosen_ua[:60],
            journey_type,
            status,
            blocked,
        )

    except Exception as e:
        result.error = f"{type(e).__name__}: {str(e)[:160]}"
        result.blocked = True
        log.warning("[VIS %3d] ❌ Falhou: %s", idx, result.error)
    finally:
        # Sempre fecha com timeout — evita janela órfã quando a rede cai
        await safe_close_page(page)
        await safe_close_context(context)

    result.elapsed_s = asyncio.get_running_loop().time() - started
    return result


async def visit_with_timeout(*args, **kwargs) -> "VisitResult":
    """Garante que nenhuma visita trave o ciclo além de VISIT_MAX_SECONDS."""
    try:
        return await asyncio.wait_for(visit(*args, **kwargs), timeout=VISIT_MAX_SECONDS)
    except asyncio.TimeoutError:
        idx = args[2] if len(args) > 2 else kwargs.get("idx", "?")
        cycle = args[4] if len(args) > 4 else kwargs.get("cycle", 0)
        site_url = args[3] if len(args) > 3 else kwargs.get("site_url", "")
        log.warning(
            "[VIS %s] ⏱️ TIMEOUT global (%ds) — forçando fim da visita",
            idx,
            VISIT_MAX_SECONDS,
        )
        return VisitResult(
            cycle=cycle,
            visitor=int(idx) if str(idx).isdigit() else 0,
            source="timeout",
            persona="?",
            url=site_url,
            status="TIMEOUT",
            blocked=True,
            ga_hits=0,
            elapsed_s=float(VISIT_MAX_SECONDS),
            error=f"VISIT_TIMEOUT>{VISIT_MAX_SECONDS}s",
            state_profile="timeout",
        )

# --------------------------------------------------------------------
# Estrutura de resultado
# --------------------------------------------------------------------
@dataclass
class VisitResult:
    cycle: int
    visitor: int
    source: str
    persona: str
    url: str
    status: str
    blocked: bool
    ga_hits: int
    elapsed_s: float
    error: str
    state_profile: str

def append_csv(results_file, rows):
    if not results_file:
        return
    new_file = not results_file.exists()
    with results_file.open("a", encoding="utf-8", newline="") as f:
        writer = csv.writer(f)
        if new_file:
            writer.writerow(["cycle", "visitor", "source", "persona", "state_profile",
                             "url", "status", "blocked", "ga_hits", "elapsed_s", "error"])
        for r in rows:
            writer.writerow([r.cycle, r.visitor, r.source, r.persona, r.state_profile,
                             r.url, r.status, int(r.blocked), r.ga_hits,
                             f"{r.elapsed_s:.2f}", r.error])

# --------------------------------------------------------------------
# Configuração interativa
# --------------------------------------------------------------------
def wait_for_key_x(timeout: float) -> bool:
    if sys.platform == "win32":
        import msvcrt
        start = time.time()
        while time.time() - start < timeout:
            if msvcrt.kbhit():
                ch = msvcrt.getch().decode("utf-8", errors="ignore").lower()
                if ch == "x":
                    return True
            time.sleep(0.1)
        return False
    else:
        import select, termios, tty
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        try:
            tty.setraw(fd)
            start = time.time()
            while time.time() - start < timeout:
                r, _, _ = select.select([sys.stdin], [], [], 0.2)
                if r:
                    ch = sys.stdin.read(1).lower()
                    if ch == "x":
                        return True
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
        return False

def load_or_ask_config():
    if CONFIG_FILE.exists():
        try:
            cfg = json.loads(CONFIG_FILE.read_text(encoding="utf-8"))
            # keywords opcional; só site_url é obrigatório
            if cfg.get("site_url"):
                cfg.setdefault("keywords", [])
                if isinstance(cfg["keywords"], str):
                    cfg["keywords"] = [k.strip() for k in cfg["keywords"].split(",") if k.strip()]
                print("\n🔁 Configuração encontrada. Aguardando 10 s... (X = reconfigurar)")
                if wait_for_key_x(10):
                    return ask_config()
                print("   Iniciando com config existente.\n")
                return cfg
        except Exception:
            pass
    return ask_config()


def ask_config():
    print("\n" + "=" * 60)
    print("  CONFIGURAÇÃO DO BOT DE TRÁFEGO")
    print("=" * 60)
    while True:
        raw = input("\nURL do site (ex: https://exemplo.com.br): ").strip()
        if not raw:
            continue
        if not raw.startswith(("http://", "https://")):
            raw = "https://" + raw
        parsed = urlparse(raw)
        if not parsed.hostname:
            print("  URL inválida.")
            continue
        site_url = raw.rstrip("/") + "/"
        break

    kw = input(
        "Palavras de busca (opcional, separadas por vírgula; Enter = só referrers): "
    ).strip()
    keywords = [k.strip() for k in kw.split(",") if k.strip()] if kw else []

    d = DEFAULT_CONFIG
    min_v = int(input(f"Visitantes mín./ciclo [{d['min_visitors']}]: ") or d["min_visitors"])
    max_v = int(input(f"Visitantes máx./ciclo [{d['max_visitors']}]: ") or d["max_visitors"])
    dw_min = float(input(f"Permanência mín. (s) [{d['dwell_min']}]: ") or d["dwell_min"])
    dw_max = float(input(f"Permanência máx. (s) [{d['dwell_max']}]: ") or d["dwell_max"])
    r_min = float(input(f"Descanso mín. (s) [{d['rest_min']}]: ") or d["rest_min"])
    r_max = float(input(f"Descanso máx. (s) [{d['rest_max']}]: ") or d["rest_max"])
    headless = input(f"Headless? (s/n) [{'s' if d['headless'] else 'n'}]: ").strip().lower()
    headless = headless != "n"
    cfg = {
        "site_url": site_url,
        "keywords": keywords,
        "min_visitors": min_v,
        "max_visitors": max_v,
        "dwell_min": dw_min,
        "dwell_max": dw_max,
        "rest_min": r_min,
        "rest_max": r_max,
        "headless": headless,
    }
    CONFIG_FILE.write_text(json.dumps(cfg, ensure_ascii=False, indent=2), encoding="utf-8")
    print("\n✅ Configuração salva em config.txt")
    if not keywords:
        print("   Keywords vazias → jornadas só via sites de referência (sem busca).")
    return cfg

# --------------------------------------------------------------------
# Main
# --------------------------------------------------------------------
async def main():
    global config

    config = load_or_ask_config()

    # Logging antes de qualquer log.info
    stamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    results_file = BASE_DIR / f"trafego_{stamp}.csv"
    logging.basicConfig(
        level=logging.INFO,
        format="%(asctime)s | %(levelname)s | %(message)s",
        handlers=[
            logging.FileHandler(BASE_DIR / f"trafego_{stamp}.log", encoding="utf-8"),
            logging.StreamHandler(),
        ],
        force=True,
    )

    ua_pools = load_useragents()
    log.info(
        "UAs carregados: Chromium=%d, Firefox=%d, WebKit=%d",
        len(ua_pools["chromium"]),
        len(ua_pools["firefox"]),
        len(ua_pools["webkit"]),
    )
    log.info("=== BOT DE TRÁFEGO HUMANO INICIADO ===")
    log.info("Site: %s", config["site_url"])
    log.info("Keywords: %s", config["keywords"])

    target_host = (urlparse(config["site_url"]).hostname or "").lower()
    if not target_host:
        raise SystemExit("site_url sem hostname válido")

    cache_file = BASE_DIR / f"links_cache_{target_host.replace('.', '_')}.json"
    links = await load_site_links(config["site_url"], target_host, cache_file)
    if not links:
        log.warning("Nenhuma URL encontrada; usando apenas a home.")
        links = [config["site_url"]]

    total_sources = Counter()
    total_blocked = 0
    total_visits = 0
    cycle = 0

    async with async_playwright() as p:
        # Devices vêm de p.devices dentro de get_device_for_engine / visit
        # (não há listas MOBILE_DEVICE_NAMES neste script)

        # Lança navegadores só para motores que têm UA e que o Playwright suporte
        browsers = {}
        launch_errors = []

        if ua_pools.get("chromium"):
            try:
                browsers["chromium"] = await p.chromium.launch(
                    headless=config["headless"],
                    args=[
                        "--disable-blink-features=AutomationControlled",
                        "--no-sandbox",
                        "--disable-setuid-sandbox",
                        "--disable-dev-shm-usage",
                        "--disable-gpu",
                    ],
                )
            except Exception as e:
                launch_errors.append(("chromium", e))

        if ua_pools.get("firefox"):
            try:
                browsers["firefox"] = await p.firefox.launch(headless=config["headless"])
            except Exception as e:
                launch_errors.append(("firefox", e))

        if ua_pools.get("webkit"):
            try:
                browsers["webkit"] = await p.webkit.launch(headless=config["headless"])
            except Exception as e:
                launch_errors.append(("webkit", e))

        # Se firefox/webkit falharam por executable missing → instala e tenta de novo
        missing_exes = [
            name
            for name, err in launch_errors
            if "Executable doesn't exist" in str(err) or "playwright install" in str(err).lower()
        ]
        if missing_exes:
            log.warning(
                "Browsers sem binário: %s — instalando agora...",
                ", ".join(missing_exes),
            )
            try:
                await asyncio.to_thread(
                    subprocess.check_call,
                    [sys.executable, "-m", "playwright", "install", *missing_exes],
                )
                for name in missing_exes:
                    try:
                        launcher = getattr(p, name)
                        browsers[name] = await launcher.launch(headless=config["headless"])
                        log.info("Browser %s instalado e iniciado.", name)
                    except Exception as e2:
                        log.warning("Ainda falhou %s após install: %s", name, e2)
            except Exception as e:
                log.warning("playwright install falhou: %s", e)

        for item in launch_errors:
            if isinstance(item, tuple):
                name, err = item
                if name not in browsers:
                    log.warning("Falha ao lançar browser: %s: %s", name, err)
            else:
                log.warning("Falha ao lançar browser: %s", item)

        if not browsers:
            raise SystemExit(
                "Nenhum browser Playwright iniciou. Rode: python -m playwright install"
            )

        log.info("Browsers ativos: %s", ", ".join(browsers.keys()))

        # Restringe pools de UA aos motores que realmente subiram
        ua_pools = {k: v for k, v in ua_pools.items() if k in browsers and v}
        if not ua_pools:
            raise SystemExit("Nenhum pool de UA compatível com browsers ativos")

        try:
            while True:
                cycle += 1
                base_visitors = random.randint(config["min_visitors"], config["max_visitors"])
                variation = random.uniform(0.75, 1.25)
                num_visitors = max(1, int(base_visitors * variation))
                num_visitors = min(num_visitors, max(1, len(links)))

                if len(links) >= num_visitors:
                    chosen_links = random.sample(links, num_visitors)
                else:
                    chosen_links = random.choices(links, k=num_visitors)
                random.shuffle(chosen_links)

                # Se o modem reiniciou / sem rede: pausa o ciclo até voltar
                await wait_until_online()

                log.info("════ CICLO %d INICIADO (%d visitantes) ════", cycle, num_visitors)

                tasks = []
                for i in range(num_visitors):
                    await asyncio.sleep(random.uniform(0.2, 0.8))
                    tasks.append(
                        asyncio.create_task(
                            visit_with_timeout(
                                p,
                                browsers,
                                i + 1,
                                chosen_links[i],
                                cycle,
                                target_host,
                                results_file,
                                ua_pools,
                                config["keywords"],
                            )
                        )
                    )

                # Barreira do ciclo: no pior caso ~VISIT_MAX_SECONDS (+ margem)
                try:
                    results = await asyncio.wait_for(
                        asyncio.gather(*tasks, return_exceptions=True),
                        timeout=VISIT_MAX_SECONDS + 30,
                    )
                except asyncio.TimeoutError:
                    log.error(
                        "⏱️ CICLO %d estourou o limite global — cancelando pendentes",
                        cycle,
                    )
                    results = []
                    for t in tasks:
                        if t.done():
                            try:
                                results.append(t.result())
                            except Exception as e:
                                results.append(e)
                        else:
                            t.cancel()
                            try:
                                await t
                            except Exception:
                                pass
                            results.append(
                                VisitResult(
                                    cycle=cycle,
                                    visitor=0,
                                    source="timeout",
                                    persona="?",
                                    url="",
                                    status="CYCLE_TIMEOUT",
                                    blocked=True,
                                    ga_hits=0,
                                    elapsed_s=float(VISIT_MAX_SECONDS),
                                    error="CYCLE_GATHER_TIMEOUT",
                                    state_profile="timeout",
                                )
                            )

                visit_results = []
                for r in results:
                    if isinstance(r, VisitResult):
                        visit_results.append(r)
                    elif isinstance(r, Exception):
                        log.error("Exceção em visita: %s", r)

                if visit_results:
                    append_csv(results_file, visit_results)
                    cycle_src = Counter(r.source for r in visit_results)
                    cycle_blocked = sum(1 for r in visit_results if r.blocked)
                    total_sources.update(cycle_src)
                    total_blocked += cycle_blocked
                    total_visits += len(visit_results)
                    log.info(
                        "Resumo ciclo %d: sources=%s bloqueios=%d/%d",
                        cycle,
                        dict(cycle_src),
                        cycle_blocked,
                        len(visit_results),
                    )

                if random.random() < 0.10:
                    descanso = random.uniform(120, 300)
                else:
                    descanso = random.uniform(config["rest_min"], config["rest_max"])
                log.info(
                    "════ CICLO %d CONCLUÍDO | Próximo em %.1fs | Total visits=%d bloqueados=%d ════",
                    cycle,
                    descanso,
                    total_visits,
                    total_blocked,
                )
                await asyncio.sleep(descanso)

        except asyncio.CancelledError:
            raise
        finally:
            for b in browsers.values():
                try:
                    await b.close()
                except Exception:
                    pass
            log.info(
                "=== FINAL === cycles=%d visits=%d blocked=%d sources=%s",
                cycle,
                total_visits,
                total_blocked,
                dict(total_sources),
            )
            if results_file:
                log.info("Resultados: %s", results_file)

if __name__ == "__main__":
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print("\n=== BOT INTERROMPIDO PELO USUÁRIO ===")
    except Exception as e:
        logging.getLogger("trafego").error("Erro fatal: %s", e, exc_info=True)
    finally:
        logging.getLogger("trafego").info("=== BOT FINALIZADO ===")