cheatmoggle

premium omoggle script (fixed opponent score, color picker, language selector, FREE badge, control bar hidden by default, +/- buttons, resizable panel)

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

You will need to install an extension such as Tampermonkey to install this script.

Tendrás que instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Tendrás que instalar una extensión como Tampermonkey antes de poder instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name         cheatmoggle
// @namespace    https://omoggle.com/
// @version      13.6.2
// @description  premium omoggle script (fixed opponent score, color picker, language selector, FREE badge, control bar hidden by default, +/- buttons, resizable panel)
// @match        https://omoggle.com/*
// @match        https://*.omoggle.com/*
// @grant        unsafeWindow
// @run-at       document-start
// ==/UserScript==

(function () {
    'use strict';

    const _window = (typeof unsafeWindow !== 'undefined') ? unsafeWindow : window;

    // ==================== LANGUAGE TRANSLATIONS ====================
    // English simplified (short, clear labels)
    const LANGUAGES = {
        en: {
            name: 'English',
            systemStatus: 'Home',
            masterSwitch: 'Master',
            powerStatus: 'Power',
            active: 'ON',
            inactive: 'OFF',
            matchType: 'Mode',
            hookStatus: 'Hook',
            pending: 'PENDING',
            hooked: 'HOOKED',
            unbanClearCookies: 'Unban / Clear Cookies',
            verificationBypass: 'Verification Bypass',
            scoreControl: 'Score',
            mode: 'Mode',
            range: 'Range',
            fixed: 'Fixed',
            scoreMin: 'Min (1-10)',
            scoreMax: 'Max (1-10)',
            resultSettings: 'Final',
            type: 'Type',
            staticScore: 'Static',
            dynamic: 'Dynamic',
            target: 'Target (1-10)',
            lowerBound: 'Lower (1-10)',
            upperBound: 'Upper (1-10)',
            matchmaking: 'Auto',
            autoQueue: 'Auto Queue',
            requestDelayMs: 'Delay (ms)',
            autoFindNewMatch: 'Auto Find New',
            spoofCycling: 'Cycling',
            autoCycleCamera: 'Auto Cycle Cam',
            cameraIntervalSec: 'Cam Int (s)',
            autoCycleAudio: 'Auto Cycle Audio',
            audioIntervalSec: 'Audio Int (s)',
            convenience: 'Utils',
            autoDismissPopups: 'Auto Dismiss',
            autoClearCookiesOnBan: 'Auto Clear on Ban',
            virtualCamera: 'Camera',
            activateSpoof: 'Activate',
            flipHorizontal: 'Flip H',
            loopVideo: 'Loop',
            playbackSpeed: 'Speed',
            source: 'Src',
            video: 'Video',
            image: 'Image',
            selectVideo: 'Select video...',
            selectImage: 'Select image...',
            textOverlay: 'Text',
            enableText: 'Enable',
            content: 'Text',
            color: 'Color',
            size: 'Size',
            audioSpoof: 'Audio',
            activateAudioSpoof: 'Activate',
            selectAudio: 'Select audio...',
            loop: 'Loop',
            speed: 'Speed',
            volume: 'Volume',
            bass: 'Bass',
            treble: 'Treble',
            warmth: 'Warmth',
            status: 'Status',
            inactiveStatus: 'Inactive',
            activeStatus: 'Active',
            overlayEffects: 'Overlays',
            banOverlay: 'Ban',
            loadingOverlay: 'Loading',
            noneOverlay: 'None',
            developer: 'Dev',
            consoleLogs: 'Console Logs',
            hotkeys: 'Hotkeys',
            openPanel: 'Open Panel',
            streamProof: 'Stream',
            panicKey: 'Panic Key',
            mobileTripleTap: 'Mobile: Triple-tap',
            showControlBar: 'Show Control Bar',
            hideAllNow: 'Hide All',
            iframeModeObs: 'Iframe (OBS)',
            hidesGui: 'Hide GUI from capture',
            branding: 'Brand',
            displayBadge: 'Show Badge',
            visibility: 'Opacity',
            appearance: 'Theme',
            customization: 'Custom',
            accentColor: 'Accent',
            language: 'Language',
            credits: 'Credits',
            developers: 'Devs'
        },
        ru: {
            name: 'Русский',
            systemStatus: 'Состояние системы',
            masterSwitch: 'Главный выключатель',
            powerStatus: 'Статус питания',
            active: 'АКТИВЕН',
            inactive: 'НЕАКТИВЕН',
            matchType: 'Тип матча',
            hookStatus: 'Статус хука',
            pending: 'ОЖИДАНИЕ',
            hooked: 'ПОДКЛЮЧЕН',
            unbanClearCookies: 'Разбан / Очистить куки',
            verificationBypass: 'Обход верификации',
            scoreControl: 'Управление счетом',
            mode: 'Режим',
            range: 'Диапазон',
            fixed: 'Фикс',
            scoreMin: 'Мин (1-10)',
            scoreMax: 'Макс (1-10)',
            resultSettings: 'Настройки результата',
            type: 'Тип',
            staticScore: 'Статика',
            dynamic: 'Динамика',
            target: 'Цель (1-10)',
            lowerBound: 'Нижняя граница (1-10)',
            upperBound: 'Верхняя граница (1-10)',
            matchmaking: 'Поиск матча',
            autoQueue: 'Автоочередь',
            requestDelayMs: 'Задержка запроса (мс)',
            autoFindNewMatch: 'Авто поиск нового матча',
            spoofCycling: 'Цикл подмены',
            autoCycleCamera: 'Автоцикл камеры',
            cameraIntervalSec: 'Интервал камеры (с)',
            autoCycleAudio: 'Автоцикл аудио',
            audioIntervalSec: 'Интервал аудио (с)',
            convenience: 'Удобство',
            autoDismissPopups: 'Авто закрытие окон',
            autoClearCookiesOnBan: 'Очищать куки при бане',
            virtualCamera: 'Виртуальная камера',
            activateSpoof: 'Активировать подмену',
            flipHorizontal: 'Отражение по горизонтали',
            loopVideo: 'Повтор видео',
            playbackSpeed: 'Скорость воспроизведения',
            source: 'Источник',
            video: 'Видео',
            image: 'Изображение',
            selectVideo: 'Выбрать видео...',
            selectImage: 'Выбрать изображение...',
            textOverlay: 'Текст поверх',
            enableText: 'Включить текст',
            content: 'Содержание',
            color: 'Цвет',
            size: 'Размер',
            audioSpoof: 'Подмена аудио',
            activateAudioSpoof: 'Активировать подмену аудио',
            selectAudio: 'Выбрать аудио...',
            loop: 'Повтор',
            speed: 'Скорость',
            volume: 'Громкость',
            bass: 'Бас (дБ)',
            treble: 'ВЧ (дБ)',
            warmth: 'Теплота (дБ)',
            status: 'Статус',
            inactiveStatus: 'Неактивен',
            activeStatus: 'Активен',
            overlayEffects: 'Эффекты наложения',
            banOverlay: 'Наложение бана',
            loadingOverlay: 'Наложение загрузки',
            noneOverlay: 'Нет',
            developer: 'Разработчик',
            consoleLogs: 'Логи консоли',
            hotkeys: 'Горячие клавиши',
            openPanel: 'Открыть панель',
            streamProof: 'Режим стрима',
            panicKey: 'Клавиша паники',
            mobileTripleTap: 'Мобильный: тройное нажатие',
            showControlBar: 'Показать панель управления',
            hideAllNow: 'Скрыть всё сейчас',
            iframeModeObs: 'Режим Iframe (OBS)',
            hidesGui: 'Скрывает GUI от захвата экрана',
            branding: 'Брендинг',
            displayBadge: 'Показывать значок',
            visibility: 'Видимость',
            appearance: 'Внешний вид',
            customization: 'Настройка',
            accentColor: 'Акцентный цвет',
            language: 'Язык',
            credits: 'Разработчики',
            developers: 'Разработчики'
        },
        uk: {
            name: 'Українська',
            systemStatus: 'Стан системи',
            masterSwitch: 'Головний вимикач',
            powerStatus: 'Стан живлення',
            active: 'АКТИВНИЙ',
            inactive: 'ВИМКНЕНО',
            matchType: 'Тип матчу',
            hookStatus: 'Стан хука',
            pending: 'ОЧІКУЄ',
            hooked: 'ПІДКЛЮЧЕНО',
            unbanClearCookies: 'Розбан / Очистити cookie',
            verificationBypass: 'Обхід верифікації',
            scoreControl: 'Керування рахунком',
            mode: 'Режим',
            range: 'Діапазон',
            fixed: 'Фіксований',
            scoreMin: 'Мін (1-10)',
            scoreMax: 'Макс (1-10)',
            resultSettings: 'Налаштування результату',
            type: 'Тип',
            staticScore: 'Статичний',
            dynamic: 'Динамічний',
            target: 'Ціль (1-10)',
            lowerBound: 'Нижня межа (1-10)',
            upperBound: 'Верхня межа (1-10)',
            matchmaking: 'Пошук матчу',
            autoQueue: 'Авточерга',
            requestDelayMs: 'Затримка запиту (мс)',
            autoFindNewMatch: 'Авто пошук нового матчу',
            spoofCycling: 'Цикл підміни',
            autoCycleCamera: 'Автоцикл камери',
            cameraIntervalSec: 'Інтервал камери (с)',
            autoCycleAudio: 'Автоцикл аудіо',
            audioIntervalSec: 'Інтервал аудіо (с)',
            convenience: 'Зручність',
            autoDismissPopups: 'Авто закриття спливаючих вікон',
            autoClearCookiesOnBan: 'Очищати cookie при бану',
            virtualCamera: 'Віртуальна камера',
            activateSpoof: 'Активувати підміну',
            flipHorizontal: 'Віддзеркалити горизонтально',
            loopVideo: 'Повторювати відео',
            playbackSpeed: 'Швидкість відтворення',
            source: 'Джерело',
            video: 'Відео',
            image: 'Зображення',
            selectVideo: 'Вибрати відео...',
            selectImage: 'Вибрати зображення...',
            textOverlay: 'Текст поверх',
            enableText: 'Увімкнути текст',
            content: 'Вміст',
            color: 'Колір',
            size: 'Розмір',
            audioSpoof: 'Підміна аудіо',
            activateAudioSpoof: 'Активувати підміну аудіо',
            selectAudio: 'Вибрати аудіо...',
            loop: 'Повтор',
            speed: 'Швидкість',
            volume: 'Гучність',
            bass: 'Бас (дБ)',
            treble: 'Високі частоти (дБ)',
            warmth: 'Теплота (дБ)',
            status: 'Статус',
            inactiveStatus: 'Неактивний',
            activeStatus: 'Активний',
            overlayEffects: 'Ефекти накладання',
            banOverlay: 'Накладання бану',
            loadingOverlay: 'Накладання завантаження',
            noneOverlay: 'Немає',
            developer: 'Розробник',
            consoleLogs: 'Логи консолі',
            hotkeys: 'Гарячі клавіші',
            openPanel: 'Відкрити панель',
            streamProof: 'Режим трансляції',
            panicKey: 'Клавіша паніки',
            mobileTripleTap: 'Мобільний: потрійне натискання',
            showControlBar: 'Показати панель керування',
            hideAllNow: 'Приховати все зараз',
            iframeModeObs: 'Режим Iframe (OBS)',
            hidesGui: 'Ховає GUI від захоплення екрана',
            branding: 'Брендинг',
            displayBadge: 'Показувати значок',
            visibility: 'Видимість',
            appearance: 'Зовнішній вигляд',
            customization: 'Налаштування',
            accentColor: 'Акцентний колір',
            language: 'Мова',
            credits: 'Розробники',
            developers: 'Розробники'
        },
        pt: {
            name: 'Português',
            systemStatus: 'Estado do sistema',
            masterSwitch: 'Interruptor principal',
            powerStatus: 'Estado da alimentação',
            active: 'ATIVO',
            inactive: 'INATIVO',
            matchType: 'Tipo de partida',
            hookStatus: 'Estado do hook',
            pending: 'PENDENTE',
            hooked: 'LIGADO',
            unbanClearCookies: 'Desbanir / Limpar cookies',
            verificationBypass: 'Bypass de verificação',
            scoreControl: 'Controlo de pontuação',
            mode: 'Modo',
            range: 'Intervalo',
            fixed: 'Fixo',
            scoreMin: 'Mín (1-10)',
            scoreMax: 'Máx (1-10)',
            resultSettings: 'Definições de resultado',
            type: 'Tipo',
            staticScore: 'Estático',
            dynamic: 'Dinâmico',
            target: 'Alvo (1-10)',
            lowerBound: 'Limite inferior (1-10)',
            upperBound: 'Limite superior (1-10)',
            matchmaking: 'Matchmaking',
            autoQueue: 'Fila automática',
            requestDelayMs: 'Atraso do pedido (ms)',
            autoFindNewMatch: 'Encontrar nova partida auto',
            spoofCycling: 'Ciclo de spoof',
            autoCycleCamera: 'Ciclo automático da câmara',
            cameraIntervalSec: 'Intervalo da câmara (s)',
            autoCycleAudio: 'Ciclo automático do áudio',
            audioIntervalSec: 'Intervalo do áudio (s)',
            convenience: 'Conveniência',
            autoDismissPopups: 'Fechar popups automaticamente',
            autoClearCookiesOnBan: 'Limpar cookies ao ser banido',
            virtualCamera: 'Câmara virtual',
            activateSpoof: 'Ativar spoof',
            flipHorizontal: 'Inverter horizontalmente',
            loopVideo: 'Repetir vídeo',
            playbackSpeed: 'Velocidade de reprodução',
            source: 'Fonte',
            video: 'Vídeo',
            image: 'Imagem',
            selectVideo: 'Selecionar vídeo...',
            selectImage: 'Selecionar imagem...',
            textOverlay: 'Sobreposição de texto',
            enableText: 'Ativar texto',
            content: 'Conteúdo',
            color: 'Cor',
            size: 'Tamanho',
            audioSpoof: 'Spoof de áudio',
            activateAudioSpoof: 'Ativar spoof de áudio',
            selectAudio: 'Selecionar áudio...',
            loop: 'Repetir',
            speed: 'Velocidade',
            volume: 'Volume',
            bass: 'Graves (dB)',
            treble: 'Agudos (dB)',
            warmth: 'Calor (dB)',
            status: 'Estado',
            inactiveStatus: 'Inativo',
            activeStatus: 'Ativo',
            overlayEffects: 'Efeitos de sobreposição',
            banOverlay: 'Sobreposição de ban',
            loadingOverlay: 'Sobreposição de carregamento',
            noneOverlay: 'Nenhum',
            developer: 'Programador',
            consoleLogs: 'Registos da consola',
            hotkeys: 'Teclas de atalho',
            openPanel: 'Abrir painel',
            streamProof: 'Modo de transmissão',
            panicKey: 'Tecla de pânico',
            mobileTripleTap: 'Móvel: toque triplo',
            showControlBar: 'Mostrar barra de controlo',
            hideAllNow: 'Ocultar tudo agora',
            iframeModeObs: 'Modo Iframe (OBS)',
            hidesGui: 'Esconde a GUI da captura de ecrã',
            branding: 'Marca',
            displayBadge: 'Mostrar emblema',
            visibility: 'Visibilidade',
            appearance: 'Aparência',
            customization: 'Personalização',
            accentColor: 'Cor de destaque',
            language: 'Idioma',
            credits: 'Créditos',
            developers: 'Programadores'
        },
        fr: {
            name: 'Français',
            systemStatus: 'État du système',
            masterSwitch: 'Interrupteur principal',
            powerStatus: 'État de l\'alimentation',
            active: 'ACTIF',
            inactive: 'INACTIF',
            matchType: 'Type de match',
            hookStatus: 'État du hook',
            pending: 'EN ATTENTE',
            hooked: 'ACCROCHÉ',
            unbanClearCookies: 'Déban / Effacer les cookies',
            verificationBypass: 'Contournement de vérification',
            scoreControl: 'Contrôle du score',
            mode: 'Mode',
            range: 'Plage',
            fixed: 'Fixe',
            scoreMin: 'Min (1-10)',
            scoreMax: 'Max (1-10)',
            resultSettings: 'Paramètres de résultat',
            type: 'Type',
            staticScore: 'Statique',
            dynamic: 'Dynamique',
            target: 'Cible (1-10)',
            lowerBound: 'Limite inférieure (1-10)',
            upperBound: 'Limite supérieure (1-10)',
            matchmaking: 'Matchmaking',
            autoQueue: 'File d\'attente auto',
            requestDelayMs: 'Délai de requête (ms)',
            autoFindNewMatch: 'Trouver un nouveau match auto',
            spoofCycling: 'Cycle de spoof',
            autoCycleCamera: 'Cycle automatique de la caméra',
            cameraIntervalSec: 'Intervalle caméra (s)',
            autoCycleAudio: 'Cycle automatique de l\'audio',
            audioIntervalSec: 'Intervalle audio (s)',
            convenience: 'Confort',
            autoDismissPopups: 'Fermer les popups automatiquement',
            autoClearCookiesOnBan: 'Effacer les cookies en cas de bannissement',
            virtualCamera: 'Caméra virtuelle',
            activateSpoof: 'Activer le spoof',
            flipHorizontal: 'Retourner horizontalement',
            loopVideo: 'Boucle vidéo',
            playbackSpeed: 'Vitesse de lecture',
            source: 'Source',
            video: 'Vidéo',
            image: 'Image',
            selectVideo: 'Sélectionner une vidéo...',
            selectImage: 'Sélectionner une image...',
            textOverlay: 'Superposition de texte',
            enableText: 'Activer le texte',
            content: 'Contenu',
            color: 'Couleur',
            size: 'Taille',
            audioSpoof: 'Spoof audio',
            activateAudioSpoof: 'Activer le spoof audio',
            selectAudio: 'Sélectionner un fichier audio...',
            loop: 'Boucle',
            speed: 'Vitesse',
            volume: 'Volume',
            bass: 'Basses (dB)',
            treble: 'Aigus (dB)',
            warmth: 'Chaleur (dB)',
            status: 'Statut',
            inactiveStatus: 'Inactif',
            activeStatus: 'Actif',
            overlayEffects: 'Effets de superposition',
            banOverlay: 'Superposition de bannissement',
            loadingOverlay: 'Superposition de chargement',
            noneOverlay: 'Aucun',
            developer: 'Développeur',
            consoleLogs: 'Journaux de la console',
            hotkeys: 'Raccourcis',
            openPanel: 'Ouvrir le panneau',
            streamProof: 'Mode stream',
            panicKey: 'Touche panique',
            mobileTripleTap: 'Mobile : triple tapotement',
            showControlBar: 'Afficher la barre de contrôle',
            hideAllNow: 'Tout masquer maintenant',
            iframeModeObs: 'Mode Iframe (OBS)',
            hidesGui: 'Masque l\'interface de capture d\'écran',
            branding: 'Marque',
            displayBadge: 'Afficher le badge',
            visibility: 'Visibilité',
            appearance: 'Apparence',
            customization: 'Personnalisation',
            accentColor: 'Couleur d\'accent',
            language: 'Langue',
            credits: 'Crédits',
            developers: 'Développeurs'
        },
        bg: {
            name: 'Български',
            systemStatus: 'Състояние на системата',
            masterSwitch: 'Главен ключ',
            powerStatus: 'Състояние на захранването',
            active: 'АКТИВЕН',
            inactive: 'ИЗКЛЮЧЕН',
            matchType: 'Тип мач',
            hookStatus: 'Състояние на hook',
            pending: 'ИЗЧАКВА',
            hooked: 'ВКЛЮЧЕН',
            unbanClearCookies: 'Разбан / Изчистване на бисквитки',
            verificationBypass: 'Заобикаляне на проверката',
            scoreControl: 'Контрол на резултата',
            mode: 'Режим',
            range: 'Диапазон',
            fixed: 'Фиксиран',
            scoreMin: 'Мин (1-10)',
            scoreMax: 'Макс (1-10)',
            resultSettings: 'Настройки на резултата',
            type: 'Тип',
            staticScore: 'Статичен',
            dynamic: 'Динамичен',
            target: 'Цел (1-10)',
            lowerBound: 'Долна граница (1-10)',
            upperBound: 'Горна граница (1-10)',
            matchmaking: 'Търсене на мач',
            autoQueue: 'Автоопашка',
            requestDelayMs: 'Забавяне на заявка (мс)',
            autoFindNewMatch: 'Автоматично намиране на нов мач',
            spoofCycling: 'Цикъл на подмяна',
            autoCycleCamera: 'Автоматичен цикъл на камерата',
            cameraIntervalSec: 'Интервал на камерата (с)',
            autoCycleAudio: 'Автоматичен цикъл на аудио',
            audioIntervalSec: 'Интервал на аудио (с)',
            convenience: 'Удобство',
            autoDismissPopups: 'Автоматично затваряне на изскачащи прозорци',
            autoClearCookiesOnBan: 'Изчистване на бисквитки при бан',
            virtualCamera: 'Виртуална камера',
            activateSpoof: 'Активиране на подмяна',
            flipHorizontal: 'Хоризонтално обръщане',
            loopVideo: 'Повторение на видео',
            playbackSpeed: 'Скорост на възпроизвеждане',
            source: 'Източник',
            video: 'Видео',
            image: 'Изображение',
            selectVideo: 'Избор на видео...',
            selectImage: 'Избор на изображение...',
            textOverlay: 'Текст отгоре',
            enableText: 'Включване на текст',
            content: 'Съдържание',
            color: 'Цвят',
            size: 'Размер',
            audioSpoof: 'Подмяна на аудио',
            activateAudioSpoof: 'Активиране на подмяна на аудио',
            selectAudio: 'Избор на аудио...',
            loop: 'Повторение',
            speed: 'Скорост',
            volume: 'Сила на звука',
            bass: 'Бас (dB)',
            treble: 'Високи честоти (dB)',
            warmth: 'Топлина (dB)',
            status: 'Състояние',
            inactiveStatus: 'Неактивен',
            activeStatus: 'Активен',
            overlayEffects: 'Ефекти на наслагване',
            banOverlay: 'Наслагване при бан',
            loadingOverlay: 'Наслагване при зареждане',
            noneOverlay: 'Няма',
            developer: 'Разработчик',
            consoleLogs: 'Конзолни логи',
            hotkeys: 'Бързи клавиши',
            openPanel: 'Отваряне на панела',
            streamProof: 'Режим на стриймване',
            panicKey: 'Клавиш за паника',
            mobileTripleTap: 'Мобилен: тройно натискане',
            showControlBar: 'Показване на контролния панел',
            hideAllNow: 'Скрий всичко сега',
            iframeModeObs: 'Iframe режим (OBS)',
            hidesGui: 'Скрива GUI от екранен запис',
            branding: 'Брандиране',
            displayBadge: 'Показване на значка',
            visibility: 'Видимост',
            appearance: 'Външен вид',
            customization: 'Персонализация',
            accentColor: 'Акцентен цвят',
            language: 'Език',
            credits: 'Кредити',
            developers: 'Разработчици'
        },
        de: {
            name: 'Deutsch',
            systemStatus: 'Systemstatus',
            masterSwitch: 'Hauptschalter',
            powerStatus: 'Energiestatus',
            active: 'AKTIV',
            inactive: 'INAKTIV',
            matchType: 'Spieltyp',
            hookStatus: 'Hook-Status',
            pending: 'AUSSTEHEND',
            hooked: 'GEHOOKT',
            unbanClearCookies: 'Entbannen / Cookies löschen',
            verificationBypass: 'Verifikations-Bypass',
            scoreControl: 'Punktzahl-Kontrolle',
            mode: 'Modus',
            range: 'Bereich',
            fixed: 'Fest',
            scoreMin: 'Min (1-10)',
            scoreMax: 'Max (1-10)',
            resultSettings: 'Ergebniseinstellungen',
            type: 'Typ',
            staticScore: 'Statisch',
            dynamic: 'Dynamisch',
            target: 'Ziel (1-10)',
            lowerBound: 'Untergrenze (1-10)',
            upperBound: 'Obergrenze (1-10)',
            matchmaking: 'Matchmaking',
            autoQueue: 'Auto-Warteschlange',
            requestDelayMs: 'Anfrageverzögerung (ms)',
            autoFindNewMatch: 'Auto neues Spiel finden',
            spoofCycling: 'Spoof-Zyklus',
            autoCycleCamera: 'Auto Kamera wechseln',
            cameraIntervalSec: 'Kamera-Intervall (s)',
            autoCycleAudio: 'Auto Audio wechseln',
            audioIntervalSec: 'Audio-Intervall (s)',
            convenience: 'Komfort',
            autoDismissPopups: 'Popups automatisch schließen',
            autoClearCookiesOnBan: 'Cookies bei Bann löschen',
            virtualCamera: 'Virtuelle Kamera',
            activateSpoof: 'Spoof aktivieren',
            flipHorizontal: 'Horizontal spiegeln',
            loopVideo: 'Video wiederholen',
            playbackSpeed: 'Wiedergabegeschwindigkeit',
            source: 'Quelle',
            video: 'Video',
            image: 'Bild',
            selectVideo: 'Video auswählen...',
            selectImage: 'Bild auswählen...',
            textOverlay: 'Textüberlagerung',
            enableText: 'Text aktivieren',
            content: 'Inhalt',
            color: 'Farbe',
            size: 'Größe',
            audioSpoof: 'Audio-Spoof',
            activateAudioSpoof: 'Audio-Spoof aktivieren',
            selectAudio: 'Audio auswählen...',
            loop: 'Wiederholen',
            speed: 'Geschwindigkeit',
            volume: 'Lautstärke',
            bass: 'Bass (dB)',
            treble: 'Höhen (dB)',
            warmth: 'Wärme (dB)',
            status: 'Status',
            inactiveStatus: 'Inaktiv',
            activeStatus: 'Aktiv',
            overlayEffects: 'Überlagerungseffekte',
            banOverlay: 'Bann-Overlay',
            loadingOverlay: 'Lade-Overlay',
            noneOverlay: 'Keins',
            developer: 'Entwickler',
            consoleLogs: 'Konsolenlogs',
            hotkeys: 'Tastenkürzel',
            openPanel: 'Panel öffnen',
            streamProof: 'Stream-Modus',
            panicKey: 'Panik-Taste',
            mobileTripleTap: 'Mobil: dreifaches Antippen',
            showControlBar: 'Steuerleiste anzeigen',
            hideAllNow: 'Alles ausblenden',
            iframeModeObs: 'Iframe-Modus (OBS)',
            hidesGui: 'Verbirgt GUI vor Bildschirmaufnahme',
            branding: 'Branding',
            displayBadge: 'Abzeichen anzeigen',
            visibility: 'Sichtbarkeit',
            appearance: 'Erscheinungsbild',
            customization: 'Anpassung',
            accentColor: 'Akzentfarbe',
            language: 'Sprache',
            credits: 'Credits',
            developers: 'Entwickler'
        },
        es: {
            name: 'Español',
            systemStatus: 'Estado del sistema',
            masterSwitch: 'Interruptor maestro',
            powerStatus: 'Estado de energía',
            active: 'ACTIVO',
            inactive: 'INACTIVO',
            matchType: 'Tipo de partida',
            hookStatus: 'Estado del hook',
            pending: 'PENDIENTE',
            hooked: 'ENLAZADO',
            unbanClearCookies: 'Desbanear / Limpiar cookies',
            verificationBypass: 'Bypass verificación',
            scoreControl: 'Control de puntuación',
            mode: 'Modo',
            range: 'Rango',
            fixed: 'Fijo',
            scoreMin: 'Mín (1-10)',
            scoreMax: 'Máx (1-10)',
            resultSettings: 'Ajustes de resultado',
            type: 'Tipo',
            staticScore: 'Estático',
            dynamic: 'Dinámico',
            target: 'Objetivo (1-10)',
            lowerBound: 'Límite inferior (1-10)',
            upperBound: 'Límite superior (1-10)',
            matchmaking: 'Emparejamiento',
            autoQueue: 'Cola automática',
            requestDelayMs: 'Retardo de solicitud (ms)',
            autoFindNewMatch: 'Buscar nueva partida auto',
            spoofCycling: 'Ciclo de spoofing',
            autoCycleCamera: 'Ciclo automático cámara',
            cameraIntervalSec: 'Intervalo cámara (s)',
            autoCycleAudio: 'Ciclo automático audio',
            audioIntervalSec: 'Intervalo audio (s)',
            convenience: 'Conveniencia',
            autoDismissPopups: 'Cerrar ventanas auto',
            autoClearCookiesOnBan: 'Limpiar cookies al ser baneado',
            virtualCamera: 'Cámara virtual',
            activateSpoof: 'Activar spoof',
            flipHorizontal: 'Voltear horizontal',
            loopVideo: 'Repetir video',
            playbackSpeed: 'Velocidad reproducción',
            source: 'Fuente',
            video: 'Video',
            image: 'Imagen',
            selectVideo: 'Seleccionar video...',
            selectImage: 'Seleccionar imagen...',
            textOverlay: 'Superposición texto',
            enableText: 'Activar texto',
            content: 'Contenido',
            color: 'Color',
            size: 'Tamaño',
            audioSpoof: 'Spoof de audio',
            activateAudioSpoof: 'Activar spoof audio',
            selectAudio: 'Seleccionar audio...',
            loop: 'Repetir',
            speed: 'Velocidad',
            volume: 'Volumen',
            bass: 'Graves (dB)',
            treble: 'Agudos (dB)',
            warmth: 'Calidez (dB)',
            status: 'Estado',
            inactiveStatus: 'Inactivo',
            activeStatus: 'Activo',
            overlayEffects: 'Efectos superpuestos',
            banOverlay: 'Superposición baneo',
            loadingOverlay: 'Superposición carga',
            noneOverlay: 'Ninguno',
            developer: 'Desarrollador',
            consoleLogs: 'Registros consola',
            hotkeys: 'Teclas rápidas',
            openPanel: 'Abrir panel',
            streamProof: 'Modo stream',
            panicKey: 'Tecla pánico',
            mobileTripleTap: 'Móvil: triple toque botón',
            showControlBar: 'Mostrar barra control',
            hideAllNow: 'Ocultar todo ahora',
            iframeModeObs: 'Modo Iframe (OBS)',
            hidesGui: 'Oculta la GUI de captura pantalla',
            branding: 'Marca',
            displayBadge: 'Mostrar insignia',
            visibility: 'Visibilidad',
            appearance: 'Apariencia',
            customization: 'Personalización',
            accentColor: 'Color acento',
            language: 'Idioma',
            credits: 'Créditos',
            developers: 'Desarrolladores'
        },
        it: {
            name: 'Italiano',
            systemStatus: 'Stato sistema',
            masterSwitch: 'Interruttore principale',
            powerStatus: 'Stato alimentazione',
            active: 'ATTIVO',
            inactive: 'INATTIVO',
            matchType: 'Tipo partita',
            hookStatus: 'Stato hook',
            pending: 'IN ATTESA',
            hooked: 'AGGANCIATO',
            unbanClearCookies: 'Sblocca / Cancella cookie',
            verificationBypass: 'Bypass verifica',
            scoreControl: 'Controllo punteggio',
            mode: 'Modalità',
            range: 'Intervallo',
            fixed: 'Fisso',
            scoreMin: 'Min (1-10)',
            scoreMax: 'Max (1-10)',
            resultSettings: 'Impostazioni risultato',
            type: 'Tipo',
            staticScore: 'Statico',
            dynamic: 'Dinamico',
            target: 'Obiettivo (1-10)',
            lowerBound: 'Limite inferiore (1-10)',
            upperBound: 'Limite superiore (1-10)',
            matchmaking: 'Matchmaking',
            autoQueue: 'Coda automatica',
            requestDelayMs: 'Ritardo richiesta (ms)',
            autoFindNewMatch: 'Trova nuova partita auto',
            spoofCycling: 'Ciclo spoof',
            autoCycleCamera: 'Ciclo automatico fotocamera',
            cameraIntervalSec: 'Intervallo fotocamera (s)',
            autoCycleAudio: 'Ciclo automatico audio',
            audioIntervalSec: 'Intervallo audio (s)',
            convenience: 'Comodità',
            autoDismissPopups: 'Chiudi popup automaticamente',
            autoClearCookiesOnBan: 'Cancella cookie al ban',
            virtualCamera: 'Fotocamera virtuale',
            activateSpoof: 'Attiva spoof',
            flipHorizontal: 'Capovolgi orizzontale',
            loopVideo: 'Ripeti video',
            playbackSpeed: 'Velocità riproduzione',
            source: 'Sorgente',
            video: 'Video',
            image: 'Immagine',
            selectVideo: 'Seleziona video...',
            selectImage: 'Seleziona immagine...',
            textOverlay: 'Sovrapposizione testo',
            enableText: 'Attiva testo',
            content: 'Contenuto',
            color: 'Colore',
            size: 'Dimensione',
            audioSpoof: 'Spoof audio',
            activateAudioSpoof: 'Attiva spoof audio',
            selectAudio: 'Seleziona audio...',
            loop: 'Ripeti',
            speed: 'Velocità',
            volume: 'Volume',
            bass: 'Bassi (dB)',
            treble: 'Acuti (dB)',
            warmth: 'Calore (dB)',
            status: 'Stato',
            inactiveStatus: 'Inattivo',
            activeStatus: 'Attivo',
            overlayEffects: 'Effetti sovrapposizione',
            banOverlay: 'Sovrapposizione ban',
            loadingOverlay: 'Sovrapposizione caricamento',
            noneOverlay: 'Nessuno',
            developer: 'Sviluppatore',
            consoleLogs: 'Log console',
            hotkeys: 'Scorciatoie',
            openPanel: 'Apri pannello',
            streamProof: 'Prova streaming',
            panicKey: 'Tasto panico',
            mobileTripleTap: 'Mobile: triplo tocco pulsante',
            showControlBar: 'Mostra barra controllo',
            hideAllNow: 'Nascondi tutto ora',
            iframeModeObs: 'Modalità Iframe (OBS)',
            hidesGui: 'Nasconde GUI dalla cattura schermo',
            branding: 'Marchio',
            displayBadge: 'Mostra badge',
            visibility: 'Visibilità',
            appearance: 'Aspetto',
            customization: 'Personalizzazione',
            accentColor: 'Colore accento',
            language: 'Lingua',
            credits: 'Crediti',
            developers: 'Sviluppatori'
        }
    };

    let currentLang = 'en';

    const DEFAULT_CONFIG = {
        enabled: true,
        scoreEnabled: true,
        scoreMode: 'range',
        fixedScore: 94000,
        scoreRangeMin: 85000,
        scoreRangeMax: 95000,
        resultEnabled: true,
        myFinalScore: "94000",
        finalScoreMode: 'fixed',
        finalScoreRangeMin: 85000,
        finalScoreRangeMax: 97000,
        holdBtnSize: 54,
        debug: true,
        wmAlpha: 20,
        wmFontSize: 9,
        wmPaddingH: 14,
        wmPaddingV: 6,
        wmBorder: true,
        wmBg: true,
        theme: 'midnight',
        queueDelay: 1000,
        autoCamInterval: 5,
        autoAudioInterval: 5,
        showControlBar: false,          // hidden by default
        autoQueue: false,
        accentColor: '#6366f1',
        language: 'en',
        panelWidth: 300,                // saved panel size
        panelHeight: null               // auto
    };

    function loadConfig() {
        try {
            const saved = localStorage.getItem('cheatmoggle _config');
            if (saved) return { ...DEFAULT_CONFIG, ...JSON.parse(saved) };
        } catch (e) {}
        return { ...DEFAULT_CONFIG };
    }

    function saveConfig() {
        try {
            localStorage.setItem('cheatmoggle _config', JSON.stringify(CONFIG));
        } catch (e) {}
    }

    const CONFIG = loadConfig();
    currentLang = CONFIG.language || 'en';

    const THEMES = {
        amoled: { name: 'AMOLED', primary: '#000000', primaryRgb: '0,0,0', secondary: '#171717', accent: '#ffffff', accentRgb: '255,255,255', success: '#22c55e', warning: '#eab308', danger: '#ef4444', bgDark: '#000000', bgCard: '#0a0a0a', bgElevated: '#141414', border: 'rgba(255,255,255,0.15)', text: '#ffffff', textMuted: '#a1a1aa' },
        neon: { name: 'Neon', primary: '#00ff88', primaryRgb: '0,255,136', secondary: '#00cc6a', accent: '#7dffb3', accentRgb: '125,255,179', success: '#00ff88', warning: '#ffcc00', danger: '#ff4444', bgDark: '#0a0f0c', bgCard: '#0d1a12', bgElevated: '#132218', border: 'rgba(0,255,136,0.15)', text: '#e0ffe8', textMuted: '#7da88a' },
        matrix: { name: 'Matrix', primary: '#00ff00', primaryRgb: '0,255,0', secondary: '#00cc00', accent: '#66ff66', accentRgb: '102,255,102', success: '#00ff00', warning: '#ccff00', danger: '#ff3333', bgDark: '#000800', bgCard: '#001a00', bgElevated: '#002200', border: 'rgba(0,255,0,0.12)', text: '#ccffcc', textMuted: '#669966' },
        toxic: { name: 'Toxic', primary: '#39ff14', primaryRgb: '57,255,20', secondary: '#7fff00', accent: '#adff2f', accentRgb: '173,255,47', success: '#39ff14', warning: '#ffff00', danger: '#ff6347', bgDark: '#080a05', bgCard: '#101408', bgElevated: '#181f0c', border: 'rgba(57,255,20,0.12)', text: '#e8ffe0', textMuted: '#8faa7d' },
        midnight: { name: 'Midnight', primary: '#6366f1', primaryRgb: '99,102,241', secondary: '#8b5cf6', accent: '#22d3ee', accentRgb: '34,211,238', success: '#10b981', warning: '#f59e0b', danger: '#ef4444', bgDark: '#0a0a0f', bgCard: '#12121a', bgElevated: '#1a1a24', border: 'rgba(255,255,255,0.08)', text: '#e4e4e7', textMuted: '#71717a' },
        crimson: { name: 'Crimson', primary: '#dc2626', primaryRgb: '220,38,38', secondary: '#f43f5e', accent: '#fb7185', accentRgb: '251,113,133', success: '#10b981', warning: '#f59e0b', danger: '#ef4444', bgDark: '#0f0505', bgCard: '#1a0a0a', bgElevated: '#241010', border: 'rgba(255,100,100,0.1)', text: '#fecaca', textMuted: '#a8a29e' },
        ocean: { name: 'Ocean', primary: '#0ea5e9', primaryRgb: '14,165,233', secondary: '#38bdf8', accent: '#7dd3fc', accentRgb: '125,211,252', success: '#14b8a6', warning: '#fbbf24', danger: '#f87171', bgDark: '#042f42', bgCard: '#0a3d55', bgElevated: '#0f4c68', border: 'rgba(56,189,248,0.15)', text: '#e0f2fe', textMuted: '#7ca8c0' },
        sunset: { name: 'Sunset', primary: '#f97316', primaryRgb: '249,115,22', secondary: '#fb923c', accent: '#fbbf24', accentRgb: '251,191,36', success: '#22c55e', warning: '#eab308', danger: '#ef4444', bgDark: '#3b0d11', bgCard: '#4f151b', bgElevated: '#641e26', border: 'rgba(251,146,60,0.15)', text: '#ffedd5', textMuted: '#c49a7a' },
        lavender: { name: 'Lavender', primary: '#a855f7', primaryRgb: '168,85,247', secondary: '#c084fc', accent: '#d8b4fe', accentRgb: '216,180,254', success: '#34d399', warning: '#facc15', danger: '#fb7185', bgDark: '#1e0a33', bgCard: '#2a1245', bgElevated: '#361b58', border: 'rgba(192,132,252,0.15)', text: '#f3e8ff', textMuted: '#b89ad4' },
        forest: { name: 'Forest', primary: '#16a34a', primaryRgb: '22,163,74', secondary: '#22c55e', accent: '#86efac', accentRgb: '134,239,172', success: '#16a34a', warning: '#ca8a04', danger: '#dc2626', bgDark: '#052e12', bgCard: '#0a3d1a', bgElevated: '#0f4d23', border: 'rgba(34,197,94,0.12)', text: '#dcfce7', textMuted: '#7aad8c' },
        gold: { name: 'Gold', primary: '#f59e0b', primaryRgb: '245,158,11', secondary: '#fbbf24', accent: '#fde68a', accentRgb: '253,230,138', success: '#10b981', warning: '#f59e0b', danger: '#ef4444', bgDark: '#2b1d04', bgCard: '#3d2a08', bgElevated: '#4f370c', border: 'rgba(251,191,36,0.15)', text: '#fef9c3', textMuted: '#c9ab5e' },
        ice: { name: 'Ice', primary: '#67e8f9', primaryRgb: '103,232,249', secondary: '#22d3ee', accent: '#cffafe', accentRgb: '207,250,254', success: '#34d399', warning: '#fbbf24', danger: '#fb7185', bgDark: '#083344', bgCard: '#0c425a', bgElevated: '#115270', border: 'rgba(103,232,249,0.15)', text: '#cffafe', textMuted: '#7fc4d6' },
        bloodorange: { name: 'Blood Orange', primary: '#ea580c', primaryRgb: '234,88,12', secondary: '#f97316', accent: '#fdba74', accentRgb: '253,186,116', success: '#22c55e', warning: '#eab308', danger: '#ef4444', bgDark: '#1f0a02', bgCard: '#2e1006', bgElevated: '#3d170a', border: 'rgba(234,88,12,0.15)', text: '#ffedd5', textMuted: '#bf8a60' },
        cyberpunk: { name: 'Cyberpunk', primary: '#ff00ff', primaryRgb: '255,0,255', secondary: '#00ffff', accent: '#ff66ff', accentRgb: '255,102,255', success: '#00ff88', warning: '#ffff00', danger: '#ff3333', bgDark: '#0a0014', bgCard: '#14001f', bgElevated: '#1e002e', border: 'rgba(255,0,255,0.15)', text: '#f0e6ff', textMuted: '#b380d4' },
        rose: { name: 'Rose', primary: '#e11d48', primaryRgb: '225,29,72', secondary: '#fb7185', accent: '#fda4af', accentRgb: '253,164,175', success: '#10b981', warning: '#f59e0b', danger: '#ef4444', bgDark: '#1a040a', bgCard: '#2a0812', bgElevated: '#3a0c1a', border: 'rgba(251,113,133,0.12)', text: '#fce7f3', textMuted: '#c48a9a' },
        mint: { name: 'Mint', primary: '#14b8a6', primaryRgb: '20,184,166', secondary: '#2dd4bf', accent: '#5eead4', accentRgb: '94,234,212', success: '#14b8a6', warning: '#eab308', danger: '#ef4444', bgDark: '#022c22', bgCard: '#053d32', bgElevated: '#084f42', border: 'rgba(45,212,191,0.15)', text: '#ccfbf1', textMuted: '#7ab8a8' },
        sky: { name: 'Sky', primary: '#3b82f6', primaryRgb: '59,130,246', secondary: '#60a5fa', accent: '#93c5fd', accentRgb: '147,197,253', success: '#22c55e', warning: '#eab308', danger: '#ef4444', bgDark: '#0a1e3d', bgCard: '#0f2850', bgElevated: '#153364', border: 'rgba(96,165,250,0.15)', text: '#dbeafe', textMuted: '#809ec8' },
        coral: { name: 'Coral', primary: '#f43f5e', primaryRgb: '244,63,94', secondary: '#fb7185', accent: '#fda4af', accentRgb: '253,164,175', success: '#22c55e', warning: '#eab308', danger: '#dc2626', bgDark: '#1f0a0f', bgCard: '#2e0f16', bgElevated: '#3d151e', border: 'rgba(251,113,133,0.12)', text: '#ffe4e6', textMuted: '#cf8a94' },
        slate: { name: 'Slate', primary: '#6366f1', primaryRgb: '99,102,241', secondary: '#818cf8', accent: '#a5b4fc', accentRgb: '165,180,252', success: '#34d399', warning: '#fbbf24', danger: '#f87171', bgDark: '#0c0f15', bgCard: '#141a24', bgElevated: '#1c2433', border: 'rgba(129,140,248,0.1)', text: '#e2e8f0', textMuted: '#7c8594' },
        auburn: { name: 'Auburn', primary: '#b45309', primaryRgb: '180,83,9', secondary: '#d97706', accent: '#f59e0b', accentRgb: '245,158,11', success: '#22c55e', warning: '#eab308', danger: '#dc2626', bgDark: '#140a02', bgCard: '#1f1004', bgElevated: '#2a1607', border: 'rgba(217,119,6,0.15)', text: '#fef3c7', textMuted: '#b8934a' },
        violet: { name: 'Violet', primary: '#7c3aed', primaryRgb: '124,58,237', secondary: '#a78bfa', accent: '#c4b5fd', accentRgb: '196,181,253', success: '#34d399', warning: '#fbbf24', danger: '#f87171', bgDark: '#120526', bgCard: '#1a0a33', bgElevated: '#241042', border: 'rgba(167,139,250,0.12)', text: '#ede9fe', textMuted: '#a898c9' },
        emerald: { name: 'Emerald', primary: '#059669', primaryRgb: '5,150,105', secondary: '#10b981', accent: '#6ee7b7', accentRgb: '110,231,183', success: '#059669', warning: '#d97706', danger: '#dc2626', bgDark: '#022015', bgCard: '#053321', bgElevated: '#08462e', border: 'rgba(16,185,129,0.12)', text: '#d1fae5', textMuted: '#70ad90' },
        peach: { name: 'Peach', primary: '#fb923c', primaryRgb: '251,146,60', secondary: '#fdba74', accent: '#fed7aa', accentRgb: '254,215,170', success: '#22c55e', warning: '#eab308', danger: '#ef4444', bgDark: '#1f0f06', bgCard: '#2e180b', bgElevated: '#3d2211', border: 'rgba(253,186,116,0.15)', text: '#fff7ed', textMuted: '#cfab80' },
        slateblue: { name: 'Slate Blue', primary: '#4f46e5', primaryRgb: '79,70,229', secondary: '#818cf8', accent: '#a5b4fc', accentRgb: '165,180,252', success: '#22c55e', warning: '#eab308', danger: '#ef4444', bgDark: '#0b0b1a', bgCard: '#111128', bgElevated: '#181838', border: 'rgba(129,140,248,0.1)', text: '#e0e7ff', textMuted: '#7c82b8' },
        cherry: { name: 'Cherry', primary: '#be123c', primaryRgb: '190,18,60', secondary: '#e11d48', accent: '#fb7185', accentRgb: '251,113,133', success: '#22c55e', warning: '#eab308', danger: '#dc2626', bgDark: '#14030a', bgCard: '#1f0610', bgElevated: '#2a0917', border: 'rgba(225,29,72,0.12)', text: '#fce7f3', textMuted: '#bd8098' },
        amber: { name: 'Amber', primary: '#d97706', primaryRgb: '217,119,6', secondary: '#f59e0b', accent: '#fbbf24', accentRgb: '251,191,36', success: '#22c55e', warning: '#d97706', danger: '#dc2626', bgDark: '#1a0f02', bgCard: '#261705', bgElevated: '#331f08', border: 'rgba(245,158,11,0.15)', text: '#fef3c7', textMuted: '#c9a052' }
    };

    let playerMapping = null;
    let _isRanked = window.location.pathname.startsWith('/ranked');
    let _matchStartTime = null;
    let _finalScoreAppliedThisMatch = false;

    const _origPushState = history.pushState;
    history.pushState = function(...args) {
        _origPushState.apply(this, args);
        _isRanked = window.location.pathname.startsWith('/ranked');
    };
    window.addEventListener('popstate', () => {
        _isRanked = window.location.pathname.startsWith('/ranked');
    });

    function tryDecode(data) {
        try {
            const bytes = data instanceof ArrayBuffer ? new Uint8Array(data) : data;
            if (!(bytes instanceof Uint8Array)) return null;
            const text = new TextDecoder().decode(bytes);

            const m = text.match(/\{[^}]+\}/);
            if (m) try { return { json: JSON.parse(m[0]), bytes, fullText: text }; } catch(e) {}

            try { return { json: JSON.parse(text), bytes, fullText: text }; } catch(e) {}

            let depth = 0, start = -1;
            for (let i = 0; i < text.length; i++) {
                if (text[i] === '{') { if (start === -1) start = i; depth++; }
                else if (text[i] === '}') { depth--; if (depth === 0 && start !== -1) try { return { json: JSON.parse(text.substring(start, i + 1)), bytes, fullText: text }; } catch(e) { start = -1; } }
            }
        } catch (e) {}
        return null;
    }

    function rewriteBytes(originalBytes, oldJSON, newJSON) {
        const originalText = new TextDecoder().decode(originalBytes);
        const newText = originalText.replace(JSON.stringify(oldJSON), JSON.stringify(newJSON));
        return new TextEncoder().encode(newText);
    }

    const _origDcSend = RTCDataChannel.prototype.send;

    function _hookDataChannel(dc) {
        if (dc.__cmHooked) return;
        const origSend = _origDcSend.bind(dc);
        dc.send = function(data) {
            if (data instanceof ArrayBuffer || data instanceof Uint8Array) {
                const size = data instanceof ArrayBuffer ? data.byteLength : data.length;
                try {
                    const str = new TextDecoder().decode(data instanceof Uint8Array ? data : new Uint8Array(data));
                    const clean = str.replace(/[^\x20-\x7E]/g, '');
                    if ((clean.includes('score') || clean.includes('elo') || clean.includes('overall') || clean.includes('SCAN_STATE') || /\d+\.\d+/.test(clean)) && (!_lastDcLogTime || Date.now() - _lastDcLogTime > 2000)) {
                        _lastDcLogTime = Date.now();
                        log(`[DC SEND bin ${size}B] ${clean.substring(0, 200)}`);
                    }
                } catch(e) {
                    log(`[DC SEND bin ${size}B] (undecodable)`);
                }
            } else if (typeof data === 'string') {
                if (data.includes('score') || data.includes('elo') || data.includes('q')) {
                    log('[DC SEND text] ' + data.substring(0, 300));
                }
            }
            const parsed = tryDecode(data);
            if (parsed?.json) {
                const { json, bytes, fullText } = parsed;

                const hasP = typeof json.p !== 'undefined';
                const hasQ = typeof json.q !== 'undefined';
                const hasScore = typeof json.score !== 'undefined';
                const hasS = typeof json.s !== 'undefined';
                const keys = Object.keys(json);
                const isScoreFrame = hasQ || hasScore || hasS || keys.some(k => k.includes('score') || k.includes('elo'));

                if (isScoreFrame || json.type === 'SCAN_STATE') {
                    log('[DC SEND] keys=' + keys.join(',') + ' q=' + json.q + ' score=' + json.score + ' s=' + json.s + ' type=' + json.type + ' overall=' + (json.payload?.overall ?? '?'));
                }

                const isNormalFrame = hasP && hasQ && json.m === undefined && !json.type;
                const isRankedFrame = hasP && hasQ && json.m !== undefined;

                if (isRankedFrame && !_isRanked) {
                    _isRanked = true;
                    log('Locked: RANKED mode (m field detected in frame)');
                }

                if (isNormalFrame || isRankedFrame) {
                    if (json.p <= 2 && _matchStartTime === null) {
                        _matchStartTime = Date.now();
                        _finalScoreAppliedThisMatch = false;
                        log(`Match started - tracking time from now`);
                    }

                    if (!playerMapping && json.q > 0) {
                        playerMapping = { myKey: 'q' };
                        log(`q confirmed as your score [${isRankedFrame ? 'RANKED' : 'NORMAL'} frame]`);
                    }
                    if (json.q > 0) {
                        if (!CONFIG.scoreEnabled) return origSend.call(this, data);

                        const modified = { ...json };
                        let newScore;

                        const matchElapsed = _matchStartTime ? (Date.now() - _matchStartTime) / 1000 : 0;
                        const shouldUseFinalScore = CONFIG.resultEnabled && matchElapsed >= 14;

                        if (shouldUseFinalScore) {
                            newScore = _getFinalTarget();
                            if (!_finalScoreAppliedThisMatch) {
                                _finalScoreAppliedThisMatch = true;
                                log(`[FINAL SCORE] Match at ${matchElapsed.toFixed(1)}s - switching to final score: ${newScore} (${newScore/10000})`);
                            }
                        } else if (CONFIG.scoreMode === 'fixed') {
                            newScore = CONFIG.fixedScore;
                            log(`[FIXED MODE] Using fixed score: ${newScore} (${newScore/10000})`);
                        } else {
                            if (_dynamicCap === null) {
                                _dynamicCap = Math.round((CONFIG.scoreRangeMin + CONFIG.scoreRangeMax) / 2000) * 1000;
                            }
                            if (Math.random() < 0.5) _dynamicCap += 1000;
                            else _dynamicCap -= 1000;
                            _dynamicCap = Math.max(CONFIG.scoreRangeMin, Math.min(CONFIG.scoreRangeMax, _dynamicCap));
                            newScore = _dynamicCap;
                        }

                        modified.q = newScore;
                        if (json.m !== undefined) modified.m = json.m;
                        if (json.type !== undefined) modified.type = json.type;

                        log(`[${isRankedFrame ? 'RANKED' : 'NORMAL'}] frame=${json.p} q: ${json.q}→${modified.q} (${(json.q/10000).toFixed(2)}→${(modified.q/10000).toFixed(2)})`);
                        _lastSpoofedScore = _getTargetScore();
                        spoofPanel();
                        return origSend.call(this, rewriteBytes(bytes, json, modified));
                    }
                }

                // SCAN_STATE spoofing removed to prevent opponent overall score from being overwritten

                if (hasScore && CONFIG.scoreEnabled) {
                    const modified = { ...json };
                    const target = _getTargetScore();
                    modified.score = target;
                    _lastSpoofedScore = target;
                    log(`[SCORE type] score: ${json.score}→${modified.score}`);
                    spoofPanel();
                    return origSend.call(this, rewriteBytes(bytes, json, modified));
                }
            }
            return origSend.call(this, data);
        };
        dc.__cmHooked = true;
    }

    RTCDataChannel.prototype.send = function(data) {
        if (!this.__cmHooked) _hookDataChannel(this);
        return this.send(data);
    };

    const _origCreateDC = RTCPeerConnection.prototype.createDataChannel;
    if (_origCreateDC) {
        RTCPeerConnection.prototype.createDataChannel = function(label, options) {
            const dc = _origCreateDC.call(this, label, options);
            _hookDataChannel(dc);
            return dc;
        };
    }

    const _origOndcDesc = Object.getOwnPropertyDescriptor(RTCPeerConnection.prototype, 'ondatachannel');
    if (_origOndcDesc && _origOndcDesc.set) {
        Object.defineProperty(RTCPeerConnection.prototype, 'ondatachannel', {
            set(fn) {
                _origOndcDesc.set.call(this, function(event) {
                    _hookDataChannel(event.channel);
                    return fn.call(this, event);
                });
            },
            get: _origOndcDesc.get
        });
    }

    const _origAddEL = RTCPeerConnection.prototype.addEventListener;
    if (_origAddEL) {
        RTCPeerConnection.prototype.addEventListener = function(type, listener, options) {
            if (type === 'datachannel') {
                const wrapped = function(event) {
                    _hookDataChannel(event.channel);
                    return listener.call(this, event);
                };
                return _origAddEL.call(this, type, wrapped, options);
            }
            return _origAddEL.call(this, type, listener, options);
        };
    }

    const _wsProtoSendCandidates = [WebSocket.prototype];
    if (_window.WebSocket && _window.WebSocket.prototype !== WebSocket.prototype) {
        _wsProtoSendCandidates.push(_window.WebSocket.prototype);
    }
    const _origWsSend = WebSocket.prototype.send;
    for (const proto of _wsProtoSendCandidates) {
        const orig = proto.send;
        proto.send = function(data) { return _wsSendHook.call(this, data, orig); };
    }
    function _wsSendHook(data, origSend) {
        try {
            if (typeof data === 'string') {
                log('[WS OUT] ' + data.substring(0, 300));
                try {
                    const parsed = JSON.parse(data);
                    if (parsed.type === 'score_update' && parsed.payload && typeof parsed.payload.score === 'number') {
                        const origScore = parsed.payload.score;
                        let boosted;
                        if (CONFIG.scoreMode === 'fixed') {
                            boosted = CONFIG.fixedScore / 10000;
                        } else {
                            if (_dynamicCap === null) {
                                _dynamicCap = Math.round((CONFIG.scoreRangeMin + CONFIG.scoreRangeMax) / 2000) * 1000;
                            }
                            if (Math.random() < 0.5) _dynamicCap += 1000;
                            else _dynamicCap -= 1000;
                            _dynamicCap = Math.max(CONFIG.scoreRangeMin, Math.min(CONFIG.scoreRangeMax, _dynamicCap));
                            boosted = _dynamicCap / 10000;
                        }
                        parsed.payload.score = boosted;
                        log(`[WS SCORE] ${origScore.toFixed(4)} → ${boosted.toFixed(4)}`);
                        return origSend.call(this, JSON.stringify(parsed));
                    }
                } catch(e) {}
            } else if (data instanceof ArrayBuffer || data instanceof Uint8Array) {
                const str = new TextDecoder().decode(data instanceof Uint8Array ? data : new Uint8Array(data));
                const clean = str.replace(/[^\x20-\x7E]/g, '');
                if (clean.includes('score') || clean.includes('p1_') || clean.includes('p2_')) {
                    log('[WS OUT bin] contains score/p1/p2: ' + clean.substring(0, 200));
                }
                if (clean.includes('score_update')) {
                    try {
                        const jsonStart = clean.indexOf('{');
                        const jsonEnd = clean.lastIndexOf('}') + 1;
                        const jsonStr = clean.substring(jsonStart, jsonEnd);
                        const parsed = JSON.parse(jsonStr);
                        if (parsed.type === 'score_update' && parsed.payload && typeof parsed.payload.score === 'number') {
                            const origScore = parsed.payload.score;
                            let boosted;
                            if (CONFIG.scoreMode === 'fixed') {
                                boosted = CONFIG.fixedScore / 10000;
                            } else {
                                if (_dynamicCap === null) {
                                    _dynamicCap = Math.round((CONFIG.scoreRangeMin + CONFIG.scoreRangeMax) / 2000) * 1000;
                                }
                                if (Math.random() < 0.5) _dynamicCap += 1000;
                                else _dynamicCap -= 1000;
                                _dynamicCap = Math.max(CONFIG.scoreRangeMin, Math.min(CONFIG.scoreRangeMax, _dynamicCap));
                                boosted = _dynamicCap / 10000;
                            }
                            parsed.payload.score = boosted;
                            log(`[WS SCORE bin] ${origScore.toFixed(4)} → ${boosted.toFixed(4)}`);
                            return origSend.call(this, JSON.stringify(parsed));
                        }
                    } catch(e) {}
                }
            }
        } catch(e) {}
        return origSend.call(this, data);
    }

    const origAddEventListener = RTCPeerConnection.prototype.addEventListener;
    if (origAddEventListener) {
        RTCPeerConnection.prototype.addEventListener = function(type, listener, options) {
            if (type === 'datachannel') {
                const wrapped = function(event) {
                    _hookDataChannel(event.channel);
                    return listener.call(this, event);
                };
                return origAddEventListener.call(this, type, wrapped, options);
            }
            return origAddEventListener.call(this, type, listener, options);
        };
    }

    const origOnMessageDesc = Object.getOwnPropertyDescriptor(RTCDataChannel.prototype, 'onmessage');
    if (origOnMessageDesc) {
        Object.defineProperty(RTCDataChannel.prototype, 'onmessage', {
            set(fn) {
                origOnMessageDesc.set.call(this, function(event) {
                    const parsed = tryDecode(event.data);
                    if (parsed?.json) {
                        const { json } = parsed;
                        if (typeof json.p !== 'undefined' && typeof json.q !== 'undefined' && !json.type && json.q > 0) {
                            log(`OPP frame=${json.p} score=${(json.q/10000).toFixed(2)}`);
                        }
                    }
                    return fn.call(this, event);
                });
            },
            get: origOnMessageDesc.get,
            configurable: true
        });
    }

    const originalAEL = RTCDataChannel.prototype.addEventListener;
    RTCDataChannel.prototype.addEventListener = function (type, listener, options) {
        if (type !== 'message' || typeof listener !== 'function')
            return originalAEL.call(this, type, listener, options);

        const wrapped = function (event) {
            const parsed = tryDecode(event.data);
            if (parsed?.json) {
                const { json } = parsed;
                if (typeof json.p !== 'undefined' && typeof json.q !== 'undefined' && !json.type && json.q > 0) {
                    log(`OPP (AEL) frame=${json.p} score=${(json.q/10000).toFixed(2)}`);
                }
            }
            return listener.call(this, event);
        };
        return originalAEL.call(this, type, wrapped, options);
    };

    let _lkRoomHooked = false;
    function _hookLiveKitRoom(room) {
        if (_lkRoomHooked) return;
        try {
            const part = room.localParticipant;
            if (!part || typeof part.publishData !== 'function') return;
            const origPublish = part.publishData;
            part.publishData = function(data, kind) {
                if (data instanceof Uint8Array || data instanceof ArrayBuffer) {
                    const str = new TextDecoder().decode(data instanceof Uint8Array ? data : new Uint8Array(data));
                    const clean = str.replace(/[^\x20-\x7E]/g, '');
                    if (clean.includes('score') || clean.includes('q') || /\d+\.\d+/.test(clean)) {
                        log(`[LK publishData] ${clean.substring(0, 300)}`);
                    }
                } else if (typeof data === 'string') {
                    if (data.includes('score') || data.includes('q')) {
                        log(`[LK publishData str] ${data.substring(0, 300)}`);
                    }
                }
                return origPublish.call(this, data, kind);
            };
            _lkRoomHooked = true;
            log('[LK] publishData hooked on room');
        } catch(e) {}
    }
    const _origETAEL = EventTarget.prototype.addEventListener;
    EventTarget.prototype.addEventListener = function(type, fn, opts) {
        try {
            const t = this;
            if (t && typeof t.connect === 'function' && t.localParticipant) {
                setTimeout(() => _hookLiveKitRoom(t), 0);
            } else if (t && typeof t.connect === 'function') {
                const orig = t.connect;
                if (!orig.__cmHooked) {
                    t.connect = function(...args) {
                        setTimeout(() => _hookLiveKitRoom(t), 100);
                        return orig.apply(this, args);
                    };
                    t.connect.__cmHooked = true;
                }
            }
        } catch(e) {}
        return _origETAEL.call(this, type, fn, opts);
    };

    const FINALIZE_SCORE_FIELDS = [
        'selfScore', 'player1Score', 'player2Score',
        'hostScore', 'actualScore', 'verifiedScore',
        'serverScore', 'realFinalScore', 'clientScore',
        'adjustedScore', 'opponentScore'
    ];

    const origFetch = _window.fetch;
    _window.fetch = async function(url, options) {
        const urlStr = typeof url === 'string' ? url : (url?.url || '');

        if (urlStr.includes('/api/match/finalize') || urlStr.includes('/api/ranked/finalize')) {
            if (options?.body && CONFIG.resultEnabled) {
                try {
                    const body = JSON.parse(options.body);
                    log('FINALIZE (original):', JSON.stringify(body).substring(0, 500));

                    const finalTarget = _getFinalTarget();
                    const finalFloat = finalTarget / 10000;

                    let patched = false;

                    const scoreObj = body.u || body.i;
                    if (scoreObj && scoreObj.e !== undefined) {
                        const realE = parseInt(scoreObj.e) || 0;
                        scoreObj.e = String(finalTarget);
                        if (body.i) _isRanked = true;
                        log(`[LEGACY] score.e: ${realE} → ${scoreObj.e}`);
                        patched = true;
                    }

                    for (const field of FINALIZE_SCORE_FIELDS) {
                        if (field in body && body[field] !== undefined) {
                            if (field === 'opponentScore' || field === 'rivalScore') continue;
                            const old = body[field];
                            if (typeof old === 'number') {
                                body[field] = old > 100 ? finalTarget : finalFloat;
                                log(`[FLAT] ${field}: ${old} → ${body[field]}`);
                                patched = true;
                            } else if (typeof old === 'string') {
                                body[field] = String(old > '100' ? finalTarget : finalFloat);
                                log(`[FLAT STR] ${field}: ${old} → ${body[field]}`);
                                patched = true;
                            }
                        }
                    }

                    if (body.settlement?.scores && Array.isArray(body.settlement.scores)) {
                        const s = body.settlement.scores;
                        const myIdx = s[0] >= s[1] ? 0 : 1;
                        const old = s[myIdx];
                        s[myIdx] = old > 100 ? finalTarget : finalFloat;
                        log(`[SETTLEMENT] scores[${myIdx}]: ${old} → ${s[myIdx]}`);
                        patched = true;
                    }
                    if (body.hud?.scores && Array.isArray(body.hud.scores)) {
                        const s = body.hud.scores;
                        const myIdx = s[0] >= s[1] ? 0 : 1;
                        const old = s[myIdx];
                        s[myIdx] = old > 100 ? finalTarget : finalFloat;
                        log(`[HUD] scores[${myIdx}]: ${old} → ${s[myIdx]}`);
                        patched = true;
                    }

                    if (!patched) {
                        log('[FINALIZE] No known score fields found in body — sending as-is');
                    }

                    options = { ...options, body: JSON.stringify(body) };
                    log('FINALIZE REQUEST (modified):', JSON.stringify(body));
                } catch(e) {
                    log('Could not parse finalize body:', e);
                }
            }

            const response = await origFetch.call(this, url, options);
            const clone = response.clone();
            clone.json().then(data => {
                log('FINALIZE RESPONSE:', JSON.stringify(data));
                if (response.ok) {
                    _lockedFinalTarget = null;
                    _finalApplied = false;
                    _lastSpoofedScore = null;
                    _matchStartTime = null;
                    _finalScoreAppliedThisMatch = false;
                }
            }).catch(() => {});
            return response;
        }

        const BOOSTED_STATS = { is_pro: true };

        if (urlStr.includes('supabase.co/rest/v1/profiles')) {
            const response = await origFetch.call(this, url, options);
            const clone = response.clone();
            try {
                const data = await clone.json();
                if (Array.isArray(data) && data.length > 0) {
                    const modified = data.map(profile => ({ ...profile, ...BOOSTED_STATS }));
                    const newHeaders = new Headers(response.headers);
                    newHeaders.set('content-type', 'application/json');
                    return new Response(JSON.stringify(modified), {
                        status: response.status,
                        statusText: response.statusText,
                        headers: newHeaders
                    });
                }
            } catch(e) {}
            return response;
        }

        if (urlStr.includes('/api/profiles/public/')) {
            const response = await origFetch.call(this, url, options);
            const clone = response.clone();
            try {
                const data = await clone.json();
                if (data && data.profile) {
                    const modified = {
                        ...data,
                        profile: { ...data.profile, is_pro: true }
                    };
                    return new Response(JSON.stringify(modified), {
                        status: response.status,
                        statusText: response.statusText,
                        headers: response.headers
                    });
                }
            } catch(e) {}
            return response;
        }

        if (urlStr.includes('/api/profile/ranked-stats')) {
            const response = await origFetch.call(this, url, options);
            return response;
        }

        if (urlStr.includes('/api/profile/world-rank')) {
            const response = await origFetch.call(this, url, options);
            return response;
        }

        if (urlStr.includes('/api/profile/lobby-summary')) {
            const response = await origFetch.call(this, url, options);
            const clone = response.clone();
            try {
                const data = await clone.json();
                if (data && typeof data === 'object') {
                    const modified = { ...data, is_pro: true };
                    return new Response(JSON.stringify(modified), {
                        status: response.status,
                        statusText: response.statusText,
                        headers: response.headers
                    });
                }
            } catch(e) {}
            return response;
        }

        if (urlStr === '/api/profile' || urlStr.endsWith('/api/profile')) {
            const response = await origFetch.call(this, url, options);
            const clone = response.clone();
            try {
                const data = await clone.json();
                if (data && data.profile) {
                    const modified = {
                        ...data,
                        profile: { ...data.profile, is_pro: true }
                    };
                    return new Response(JSON.stringify(modified), {
                        status: response.status,
                        statusText: response.statusText,
                        headers: response.headers
                    });
                }
            } catch(e) {}
            return response;
        }

        return origFetch.call(this, url, options);
    };

    let _lockedFinalTarget = null;
    let _lastFinalMode = null;
    let _finalApplied = false;

    function _getFinalTarget() {
        if (_lockedFinalTarget === null || _lastFinalMode !== CONFIG.finalScoreMode) {
            _finalApplied = false;
            _lastFinalMode = CONFIG.finalScoreMode;
            if (CONFIG.finalScoreMode === 'range') {
                _lockedFinalTarget = Math.round(CONFIG.finalScoreRangeMin + Math.random() * (CONFIG.finalScoreRangeMax - CONFIG.finalScoreRangeMin));
            } else {
                _lockedFinalTarget = parseInt(CONFIG.myFinalScore);
            }
            log(`_getFinalTarget locked: ${_lockedFinalTarget} (${CONFIG.finalScoreMode})`);
        }
        if (CONFIG.finalScoreMode === 'fixed') {
            return parseInt(CONFIG.myFinalScore);
        }
        return _lockedFinalTarget;
    }

    const _STORE_NAMES = ['T', 'default', 'store', 'Zustand', 'useStore', 'Store'];

    function _isZustandStore(val) {
        if (!val || typeof val.getState !== 'function') return false;
        try {
            const s = val.getState();
            if (!s || typeof s !== 'object') return false;
            return typeof s.setMyScore === 'function' ||
                   typeof s.setFinalPayloads === 'function' ||
                   typeof s.setActiveMatchId === 'function' ||
                   typeof s.myScore !== 'undefined' ||
                   typeof s.myScoreRaw !== 'undefined' ||
                   typeof s.applyFinalScores === 'function';
        } catch(e) { return false; }
    }

    function _findStoreInMod(mod) {
        if (!mod || typeof mod !== 'object') return null;
        for (const name of _STORE_NAMES) {
            try {
                const val = mod[name];
                if (_isZustandStore(val)) return val;
            } catch(e) {}
        }
        for (const val of Object.values(mod)) {
            if (_isZustandStore(val)) return val;
        }
        return null;
    }

    function patchZustandStore() {
        try {
            const wpChunk = _window.webpackChunk_N_E || _window.webpackChunknextjs_app || _window.webpackChunk;
            if (!wpChunk) return false;
            let req;
            try {
                req = wpChunk.push([[Symbol()], {}, e => e]);
            } catch(e) { return false; }
            if (typeof req !== 'function') return false;

            let store = null;
            const knownIds = [16225, 74952, 41746, 61107, 28344, 50231, 89540, 41747, 28343, 50230];
            for (const id of knownIds) {
                try {
                    const mod = req(id);
                    const found = _findStoreInMod(mod);
                    if (found) { store = found; log(`Zustand store found in module ${id}`); break; }
                } catch(e) {}
            }

            if (!store && req.m) {
                for (const id of Object.keys(req.m)) {
                    try {
                        const mod = req(id);
                        const found = _findStoreInMod(mod);
                        if (found) { store = found; log(`Zustand store found via scan module ${id}`); break; }
                    } catch(e) {}
                }
            }

            if (!store) return false;
            return patchStore(store);
        } catch(e) {
            log('patchZustandStore error:', e);
            return false;
        }
    }

    function _toScore(num) {
        if (typeof num === 'number') {
            if (num > 100) return num / 10000;
            return num;
        }
        return parseFloat(num) || 0;
    }

    function _getTargetScore() {
        if (CONFIG.scoreMode === 'fixed') {
            return Math.min(CONFIG.fixedScore / 10000, 10);
        } else {
            if (_dynamicCap === null) {
                _dynamicCap = Math.round((CONFIG.scoreRangeMin + CONFIG.scoreRangeMax) / 2000) * 1000;
            }
            if (Math.random() < 0.5) _dynamicCap += 1000;
            else _dynamicCap -= 1000;
            _dynamicCap = Math.max(CONFIG.scoreRangeMin, Math.min(CONFIG.scoreRangeMax, _dynamicCap));
            return _dynamicCap / 10000;
        }
    }

    function patchStore(store) {
        try {
            if (store.__cmSetStatePatched) return true;
            const origSetState = store.setState.bind(store);
            store.setState = function(partial) {
                if (!CONFIG.scoreEnabled) return origSetState(partial);
                let mod = partial;
                if (typeof partial === 'function') {
                    mod = partial(store.getState());
                }
                if (mod && typeof mod === 'object' && ('myScore' in mod || 'myScoreRaw' in mod)) {
                    const target = _getTargetScore();
                    mod = { ...mod };
                    if ('myScore' in mod) {
                        mod.myScore = target;
                    }
                    if ('myScoreRaw' in mod) {
                        mod.myScoreRaw = target;
                    }
                    // DO NOT modify opponentScore or opponentScoreRaw - leave them real
                    _lastSpoofedScore = target;
                    spoofPanel();
                    return origSetState(mod);
                }
                return origSetState(partial);
            };
            store.__cmSetStatePatched = true;
            log('patchStore: setState intercepted for myScore only (opponent score unchanged)');
            return true;
        } catch(e) {
            log('patchStore error:', e);
            return false;
        }
    }

    let patchAttempts = 0;
    const patchPoll = setInterval(() => {
        patchAttempts++;
        if (patchZustandStore()) {
            clearInterval(patchPoll);
            log(`Zustand store patched after ${patchAttempts} attempts`);
        } else if (patchAttempts % 50 === 0) {
            log(`Still looking for Zustand store... (attempt ${patchAttempts})`);
        }
    }, 200);

    const TIER_MAP = [
        { name: 'Adam',     emoji: '🍎', hexColor: '#ef4444', textShadow: '0 0 12px rgba(239,68,68,0.95)',    min: 9.7 },
        { name: 'Slayer',   emoji: '☠️', hexColor: '#f472b6', textShadow: '0 0 12px rgba(244,114,182,0.9)',   min: 9.5 },
        { name: 'Chad',     emoji: '👑', hexColor: '#fb923c', textShadow: '0 0 10px rgba(251,146,60,0.8)',    min: 8.9 },
        { name: 'Chadlite', emoji: '⚜️', hexColor: '#facc15', textShadow: '0 0 8px rgba(250,204,21,0.8)',     min: 8.3 },
        { name: 'HTN',      emoji: '🌟', hexColor: '#a3e635', textShadow: '0 0 8px rgba(163,230,53,0.8)',     min: 7.0 },
        { name: 'MTN',      emoji: '⭐', hexColor: '#86efac', textShadow: '0 0 6px rgba(134,239,172,0.7)',    min: 5.6 },
        { name: 'LTN',      emoji: '🌙', hexColor: '#34d399', textShadow: '0 0 6px rgba(52,211,153,0.6)',     min: 3.1 },
        { name: 'Sub3',     emoji: '🦀', hexColor: '#b45309', textShadow: '0 0 6px rgba(180,83,9,0.7)',       min: 0.1 },
    ];

    let _lastSpoofedScore = null;
    let _lastLogTime = 0;
    let _lastDcLogTime = 0;
    let _dynamicCap = null;
    let _scoreFluctuationInterval = null;

    function startScoreFluctuation() {
        if (_scoreFluctuationInterval) return;
        _scoreFluctuationInterval = setInterval(() => {
            if (!CONFIG.scoreEnabled || CONFIG.scoreMode !== 'range') return;
            if (_dynamicCap === null) {
                _dynamicCap = Math.round((CONFIG.scoreRangeMin + CONFIG.scoreRangeMax) / 2000) * 1000;
            }
            if (Math.random() < 0.5) {
                _dynamicCap += 1000;
            } else {
                _dynamicCap -= 1000;
            }
            _dynamicCap = Math.max(CONFIG.scoreRangeMin, Math.min(CONFIG.scoreRangeMax, _dynamicCap));
            spoofPanel();
        }, 1500);
    }

    function stopScoreFluctuation() {
        if (_scoreFluctuationInterval) {
            clearInterval(_scoreFluctuationInterval);
            _scoreFluctuationInterval = null;
        }
    }

    startScoreFluctuation();

    function getTierForScore(score) {
        for (const tier of TIER_MAP) {
            if (score >= tier.min) return tier;
        }
        return TIER_MAP[TIER_MAP.length - 1];
    }

    function spoofPanel() {
        if (_lastSpoofedScore === null) return;
        const displayScore = _lastSpoofedScore;
        const tier = getTierForScore(displayScore);


        const myPanel = document.querySelector('.glass-panel.absolute.top-5') ||
            document.querySelector('.glass-panel.absolute.top-8') ||
            document.querySelector('[class*="glass-panel"][class*="absolute"][class*="left"]') ||
            document.querySelector('[class*="glass-panel"][class*="absolute"][class*="top"]') ||
            document.querySelector('[class*="ranked"][class*="score"]') ||
            document.querySelector('[class*="player-score"]') ||
            document.querySelector('[class*="my-score"]') ||
            (() => {
                const allPanels = document.querySelectorAll('[class*="glass"], [class*="panel"], [class*="score-card"]');
                for (const p of allPanels) {
                    const spans = p.querySelectorAll('span.font-mono');
                    for (const s of spans) {
                        if (/^\d+\.?\d*$/.test(s.textContent.trim())) return p;
                    }
                }
                return null;
            })();
        if (!myPanel) return;

        const allMono = myPanel.querySelectorAll('span.font-mono');
        let scoreSpan = null;
        for (const s of allMono) {
            if (/^\d+\.?\d*$/.test(s.textContent.trim())) {
                scoreSpan = s;
                break;
            }
        }
        if (!scoreSpan) return;

        if (scoreSpan.textContent.trim() !== displayScore.toFixed(1)) {
            scoreSpan.textContent = displayScore.toFixed(1);
        }

        const tierSpan = scoreSpan.nextElementSibling;
        if (tierSpan) {
            const want = `${tier.emoji} ${tier.name}`;
            if (tierSpan.textContent !== want) tierSpan.textContent = want;
            if (tierSpan.style.color !== tier.hexColor) tierSpan.style.color = tier.hexColor;
            if (tierSpan.style.textShadow !== tier.textShadow) tierSpan.style.textShadow = tier.textShadow;
        }

        const allSpans = myPanel.querySelectorAll('span');
        for (const span of allSpans) {
            if (span === scoreSpan) continue;
            const t = span.textContent.trim();
            const tierNames = ['Adam','Slayer','Chad','Chadlite','HTN','MTN','LTN','Sub3'];
            if (tierNames.some(n => t.includes(n)) && !t.includes(tier.name)) {
                span.textContent = `${tier.emoji} ${tier.name}`;
                span.style.color = tier.hexColor;
                span.style.textShadow = tier.textShadow;
            }
            if (span.style.color && span.style.color !== tier.hexColor) {
                const tierColors = ['#f472b6','#fb923c','#facc15','#a3e635','#86efac','#34d399','#b45309'];
                if (tierColors.includes(span.style.color)) {
                    span.style.color = tier.hexColor;
                    span.style.textShadow = tier.textShadow;
                }
            }
        }
    }

    const _bodyObserver = new MutationObserver(() => { try { spoofPanel(); } catch(e) {} });
    _bodyObserver.observe(document.documentElement || document.body, { childList: true, subtree: true });

    setInterval(() => { try { spoofPanel(); } catch(e) {} }, 100);

    const OriginalWebSocket = _window.WebSocket;
    _window.WebSocket = function(...args) {
        const ws = new OriginalWebSocket(...args);
        ws.addEventListener('message', function(event) {
            if (typeof event.data === 'string') {
                if (event.data.includes('FINAL_SCORES') || event.data.includes('elo') || event.data.includes('score')) {
                    log('WS TEXT:', event.data);
                }
                return;
            }
            const buf = event.data instanceof ArrayBuffer ? event.data : null;
            if (!buf) return;
            const bytes = new Uint8Array(buf);
            const size = bytes.length;
            const text = new TextDecoder('utf-8', { fatal: false }).decode(bytes);
            const strings = text.match(/[\x20-\x7E]{4,}/g) || [];
            if (size === 108 || size > 50) {
                log(`WS RECV binary [${size} bytes] strings:`, strings);
                strings.forEach(s => {
                    if (/\d\.\d/.test(s) || s.includes('score') || s.includes('win') || s.includes('elo')) {
                        log('   Possible score string:', s);
                    }
                });
            }
        });
        return ws;
    };
    Object.setPrototypeOf(_window.WebSocket, OriginalWebSocket);
    _window.WebSocket.prototype = OriginalWebSocket.prototype;
    ['CONNECTING','OPEN','CLOSING','CLOSED'].forEach(k => {
        try {
            Object.defineProperty(_window.WebSocket, k, {
                value: OriginalWebSocket[k],
                writable: false,
                configurable: true
            });
        } catch(e) {}
    });

    log('v13.6.2 cheatmoggle loaded - opponent score fix + color picker + language selector + FREE badge + hidden control bar + resizable panel');

    const _trueOriginalGetUserMedia = navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);

    let _camSpoofActive = false;
    let _camStream = null;

    navigator.mediaDevices.getUserMedia = async function(constraints) {
        if (_camSpoofActive && _camStream && constraints && (constraints.video || constraints.video === true)) {
            log('[CAM SPOOF] Intercepting getUserMedia - returning spoofed stream');
            setTimeout(() => {
                const scannerVid = document.querySelector('video.scanner-video');
                if (scannerVid) scannerVid.srcObject = _camStream;
                if (window._mogPCs) {
                    const fakeTrack = _camStream.getVideoTracks()[0];
                    for (const pc of window._mogPCs) {
                        try {
                            pc.getSenders().forEach(sender => {
                                if (sender.track?.kind === 'video') {
                                    sender.replaceTrack(fakeTrack).catch(() => {});
                                }
                            });
                        } catch(e) {}
                    }
                }
            }, 100);

            if (constraints.audio) {
                try {
                    const realAudio = await _trueOriginalGetUserMedia({ audio: constraints.audio });
                    return new MediaStream([
                        ..._camStream.getVideoTracks(),
                        ...realAudio.getAudioTracks()
                    ]);
                } catch(e) {
                    return _camStream;
                }
            }
            return _camStream;
        }
        const stream = await _trueOriginalGetUserMedia(constraints);
        stream.getVideoTracks().forEach(t => {
            t.addEventListener('ended', () => log('VIDEO TRACK ENDED:', t.label));
            t.addEventListener('mute',  () => log('VIDEO TRACK MUTED:', t.label));
        });
        return stream;
    };

    const _OrigRTCPC = window.RTCPeerConnection;
    window.RTCPeerConnection = function(...args) {
        const pc = new _OrigRTCPC(...args);
        const _origAddTrack = pc.addTrack.bind(pc);
        pc.addTrack = function(track, ...streams) {
            return _origAddTrack(track, ...streams);
        };
        return pc;
    };
    Object.setPrototypeOf(window.RTCPeerConnection, _OrigRTCPC);
    window.RTCPeerConnection.prototype = _OrigRTCPC.prototype;

    function applyAccentColor(color) {
        document.documentElement.style.setProperty('--cm-primary', color);
        const rgb = hexToRgb(color);
        if (rgb) document.documentElement.style.setProperty('--cm-primary-rgb', `${rgb.r},${rgb.g},${rgb.b}`);
        CONFIG.accentColor = color;
        saveConfig();
    }

    function hexToRgb(hex) {
        const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
        return result ? { r: parseInt(result[1],16), g: parseInt(result[2],16), b: parseInt(result[3],16) } : null;
    }

    function applyLanguage(lang) {
        const t = LANGUAGES[lang] || LANGUAGES.en;
        // Update elements with data-i18n
        document.querySelectorAll('[data-i18n]').forEach(el => {
            const key = el.getAttribute('data-i18n');
            if (t[key] !== undefined) {
                if (el.tagName === 'INPUT' && el.type === 'text' && el.placeholder !== undefined) {
                    el.placeholder = t[key];
                } else if (el.tagName === 'BUTTON' && el.classList.contains('cm-cb-label')) {
                    // skip, handled separately
                } else {
                    el.textContent = t[key];
                }
            }
        });
        // Update dynamic text nodes not covered by data-i18n
        const statusPill = document.getElementById('cm-status-pill');
        const modePill = document.getElementById('cm-mode-pill');
        const enabledVal = document.getElementById('cm-enabled-val');
        const modeVal = document.getElementById('cm-mode-val');
        const clearCookiesBtn = document.getElementById('cm-clearcookies-btn');
        const verifBypassBtn = document.getElementById('cm-verifbypass-btn');
        if (statusPill) statusPill.textContent = CONFIG.enabled ? t.active : t.inactive;
        if (modePill) modePill.textContent = _isRanked ? 'RANKED' : 'NORMAL';
        if (enabledVal) enabledVal.textContent = CONFIG.enabled ? t.active : t.inactive;
        if (modeVal) modeVal.textContent = _isRanked ? 'RANKED' : 'NORMAL';
        if (clearCookiesBtn) clearCookiesBtn.textContent = t.unbanClearCookies;
        if (verifBypassBtn) verifBypassBtn.textContent = t.verificationBypass;
        // Update mode buttons
        document.querySelectorAll('[data-smode]').forEach(btn => {
            if (btn.dataset.smode === 'range') btn.textContent = t.range;
            if (btn.dataset.smode === 'fixed') btn.textContent = t.fixed;
        });
        document.querySelectorAll('[data-fmode]').forEach(btn => {
            if (btn.dataset.fmode === 'fixed') btn.textContent = t.staticScore;
            if (btn.dataset.fmode === 'range') btn.textContent = t.dynamic;
        });
        document.querySelectorAll('[data-src]').forEach(btn => {
            if (btn.dataset.src === 'video') btn.textContent = t.video;
            if (btn.dataset.src === 'image') btn.textContent = t.image;
        });
        const panicNowBtn = document.getElementById('cm-panic-now');
        if (panicNowBtn) panicNowBtn.textContent = t.hideAllNow;
        // Control bar labels
        const cbLabels = document.querySelectorAll('#cm-controlbar .cm-cb-label');
        if (cbLabels.length >= 3) {
            cbLabels[0].textContent = t.active;
            cbLabels[1].textContent = t.video;
            cbLabels[2].textContent = t.audioSpoof;
        }
        // Hook status badge uses hooked string
        const hookBadge = document.getElementById('cm-zustand-val');
        if (hookBadge && hookBadge.textContent === 'HOOKED') {
            hookBadge.textContent = t.hooked;
        } else if (hookBadge && hookBadge.textContent === 'PENDING') {
            hookBadge.textContent = t.pending;
        }
    }

    function buildMenu() {
        if (document.getElementById('cm-root')) return;

        function applyTheme(themeName) {
            const theme = THEMES[themeName] || THEMES.midnight;
            CONFIG.theme = themeName;
            document.documentElement.style.setProperty('--cm-primary', theme.primary);
            document.documentElement.style.setProperty('--cm-primary-rgb', theme.primaryRgb);
            document.documentElement.style.setProperty('--cm-secondary', theme.secondary);
            document.documentElement.style.setProperty('--cm-accent', theme.accent);
            document.documentElement.style.setProperty('--cm-accent-rgb', theme.accentRgb);
            document.documentElement.style.setProperty('--cm-success', theme.success);
            document.documentElement.style.setProperty('--cm-warning', theme.warning);
            document.documentElement.style.setProperty('--cm-danger', theme.danger);
            document.documentElement.style.setProperty('--cm-bg-dark', theme.bgDark);
            document.documentElement.style.setProperty('--cm-bg-card', theme.bgCard);
            document.documentElement.style.setProperty('--cm-bg-elevated', theme.bgElevated);
            document.documentElement.style.setProperty('--cm-border', theme.border);
            document.documentElement.style.setProperty('--cm-text', theme.text);
            document.documentElement.style.setProperty('--cm-text-muted', theme.textMuted);
            saveConfig();
        }

        const style = document.createElement('style');
        style.textContent = `
            @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&family=Space+Grotesk:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600;700&display=swap');

            :root {
                --cm-primary: #6366f1;
                --cm-primary-rgb: 99,102,241;
                --cm-secondary: #8b5cf6;
                --cm-accent: #22d3ee;
                --cm-accent-rgb: 34,211,238;
                --cm-success: #10b981;
                --cm-warning: #f59e0b;
                --cm-danger: #ef4444;
                --cm-bg-dark: #0a0a0f;
                --cm-bg-card: #12121a;
                --cm-bg-elevated: #1a1a24;
                --cm-border: rgba(255,255,255,0.08);
                --cm-text: #e4e4e7;
                --cm-text-muted: #71717a;
                --cm-glow: 0 0 30px rgba(var(--cm-primary-rgb),0.3);
            }

            #cm-toggle-btn {
                position: fixed;
                top: 16px;
                right: 16px;
                z-index: 999999;
                width: 42px;
                height: 42px;
                border-radius: 50%;
                background: radial-gradient(circle at 30% 25%, rgba(var(--cm-primary-rgb),0.35), rgba(0,0,0,0.92) 72%);
                border: 2px solid var(--cm-primary);
                padding: 0;
                overflow: visible;
                cursor: grab;
                display: flex;
                align-items: center;
                justify-content: center;
                box-shadow: 0 0 0 1px rgba(var(--cm-primary-rgb),0.35), 0 0 18px rgba(var(--cm-primary-rgb),0.55), 0 6px 20px rgba(0,0,0,0.5);
                transition: transform 0.22s cubic-bezier(0.34,1.56,0.64,1), box-shadow 0.22s ease, border-color 0.22s ease;
                user-select: none;
                touch-action: none;
            }
            /* pulsating themed rings */
            #cm-toggle-btn::before,
            #cm-toggle-btn::after {
                content: '';
                position: absolute;
                inset: -2px;
                border-radius: 50%;
                border: 2px solid var(--cm-primary);
                pointer-events: none;
                will-change: transform, opacity;
            }
            #cm-toggle-btn::before { animation: cmPulseRing 2.1s cubic-bezier(0.2,0.6,0.3,1) infinite; }
            #cm-toggle-btn::after  { animation: cmPulseRing 2.1s cubic-bezier(0.2,0.6,0.3,1) infinite 1.05s; }
            @keyframes cmPulseRing {
                0%   { transform: scale(1);    opacity: 0.85; }
                70%  { transform: scale(1.95); opacity: 0; }
                100% { transform: scale(1.95); opacity: 0; }
            }
            #cm-toggle-btn img {
                width: 100% !important;
                height: 100% !important;
                border-radius: 50% !important;
                object-fit: cover;
                position: relative;
                z-index: 2;
                box-shadow: inset 0 0 0 1px rgba(0,0,0,0.45);
            }
            #cm-toggle-btn:active { cursor: grabbing; }
            #cm-toggle-btn:hover {
                transform: scale(1.12);
                border-color: var(--cm-accent);
                box-shadow: 0 0 0 1px rgba(var(--cm-accent-rgb),0.6), 0 0 30px rgba(var(--cm-primary-rgb),0.85), 0 10px 26px rgba(0,0,0,0.6);
            }
            #cm-toggle-btn.dragging { cursor: grabbing; transition: none; }
            #cm-toggle-btn svg {
                width: 24px;
                height: 24px;
                fill: white;
                filter: drop-shadow(0 1px 2px rgba(0,0,0,0.3));
            }

            #cm-root {
                position: fixed;
                top: 70px;
                right: 16px;
                z-index: 999998;
                min-width: 220px;
                min-height: 200px;
                background: var(--cm-bg-dark);
                border-radius: 12px;
                font-family: 'Inter', -apple-system, sans-serif;
                color: var(--cm-text);
                border: 1px solid var(--cm-border);
                box-shadow: 0 0 40px rgba(var(--cm-primary-rgb),0.1), 0 15px 30px rgba(0,0,0,0.4);
                display: none;
                opacity: 0;
                overflow: auto;
                transition: opacity 0.2s ease, transform 0.2s ease;
                transform: translateY(-10px) scale(0.98);
                resize: both;
            }
            #cm-root.visible {
                display: flex;
                flex-direction: column;
                opacity: 1;
                transform: translateY(0) scale(1);
            }
            #cm-root.dragging { transition: none; user-select: none; }
            /* Custom resize handle (optional, but adds visibility) */
            #cm-root::-webkit-resizer {
                background: linear-gradient(135deg, var(--cm-text-muted), var(--cm-text));
                border-radius: 0 0 8px 0;
                width: 12px;
                height: 12px;
            }

            .cm-header {
                padding: 8px 10px 6px;
                background: linear-gradient(180deg, rgba(var(--cm-primary-rgb),0.08) 0%, transparent 100%);
                border-bottom: 1px solid var(--cm-border);
                cursor: grab;
                user-select: none;
                flex-shrink: 0;
            }
            .cm-header:active { cursor: grabbing; }

            .cm-title-row {
                display: flex;
                align-items: center;
                justify-content: space-between;
                margin-bottom: 6px;
            }
            .cm-logo { display: flex; align-items: center; gap: 6px; }
            .cm-logo-icon {
                width: 24px; height: 24px;
                border-radius: 6px;
                background: linear-gradient(135deg, var(--cm-primary), var(--cm-secondary));
                display: flex; align-items: center; justify-content: center;
                box-shadow: 0 2px 8px rgba(var(--cm-primary-rgb),0.3);
            }
            .cm-logo-icon svg { width: 14px; height: 14px; fill: white; }
            .cm-title {
                font-family: 'Space Grotesk', sans-serif;
                font-size: 13px; font-weight: 700; letter-spacing: -0.02em;
                background: linear-gradient(135deg, #fff 0%, var(--cm-accent) 100%);
                -webkit-background-clip: text; -webkit-text-fill-color: transparent;
            }
            .cm-free-badge {
                background: linear-gradient(135deg, #10b981, #059669);
                color: white;
                font-size: 8px;
                font-weight: 700;
                padding: 2px 6px;
                border-radius: 12px;
                margin-left: 8px;
                letter-spacing: 0.5px;
                box-shadow: 0 0 6px rgba(16,185,129,0.5);
                text-transform: uppercase;
            }
            .cm-version {
                font-size: 8px; font-weight: 600; color: var(--cm-text-muted);
                background: var(--cm-bg-elevated); padding: 1px 4px; border-radius: 3px; margin-left: 4px;
            }
            .cm-status-row { display: flex; align-items: center; gap: 4px; }
            .cm-pill {
                padding: 2px 5px; border-radius: 4px;
                font-size: 8px; font-weight: 700;
                text-transform: uppercase; letter-spacing: 0.04em;
            }
            .cm-pill.active {
                background: rgba(16,185,129,0.2); color: var(--cm-success);
                border: 1px solid rgba(16,185,129,0.3);
            }
            .cm-pill.mode {
                background: rgba(var(--cm-primary-rgb),0.2); color: var(--cm-primary);
                border: 1px solid rgba(var(--cm-primary-rgb),0.3);
            }

            .cm-discord-link {
                display: flex; align-items: center; gap: 6px;
                padding: 6px 10px;
                background: linear-gradient(135deg, #5865F2 0%, #7289da 100%);
                border-radius: 8px; font-size: 10px; font-weight: 600;
                color: white; text-decoration: none; transition: all 0.2s ease; margin-left: auto;
            }
            .cm-discord-link:hover { transform: translateY(-1px); box-shadow: 0 4px 12px rgba(88,101,242,0.4); }
            .cm-discord-link svg { width: 14px; height: 14px; fill: currentColor; }

            .cm-tabs {
                display: flex; gap: 2px;
                background: var(--cm-bg-card); padding: 2px; border-radius: 6px;
            }
            .cm-tab {
                flex: 1; padding: 5px 4px; border-radius: 4px;
                font-size: 9px; font-weight: 600; text-align: center;
                cursor: pointer; transition: all 0.15s ease;
                color: var(--cm-text-muted); background: transparent; border: none; white-space: nowrap;
            }
            .cm-tab:hover { color: var(--cm-text); background: rgba(255,255,255,0.03); }
            .cm-tab.active {
                background: var(--cm-bg-elevated); color: white;
                box-shadow: 0 1px 4px rgba(0,0,0,0.2);
            }

            .cm-body { padding: 8px; overflow-y: auto; flex: 1; }
            .cm-body::-webkit-scrollbar { width: 4px; }
            .cm-body::-webkit-scrollbar-track { background: transparent; }
            .cm-body::-webkit-scrollbar-thumb { background: rgba(var(--cm-primary-rgb),0.3); border-radius: 2px; }

            .cm-panel { display: none; }
            .cm-panel.active { display: block; animation: cmFadeIn 0.2s ease; }
            @keyframes cmFadeIn { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: translateY(0); } }

            .cm-section { margin-bottom: 8px; }
            .cm-section:last-child { margin-bottom: 0; }
            .cm-section-title {
                font-size: 8px; font-weight: 700;
                text-transform: uppercase; letter-spacing: 0.1em;
                color: var(--cm-text-muted); margin-bottom: 4px;
                display: flex; align-items: center; gap: 4px; justify-content: space-between;
            }
            .cm-section-title > span { display: flex; align-items: center; gap: 4px; }
            .cm-section-title > span::after {
                content: ''; width: 20px; height: 1px;
                background: linear-gradient(90deg, var(--cm-border), transparent);
            }
            .cm-section-toggle { transform: scale(0.7); }
            .cm-section-disabled { opacity: 0.4; pointer-events: none; }
            .cm-divider { height: 1px; background: var(--cm-border); margin: 10px 0; }

            .cm-card {
                background: var(--cm-bg-card); border-radius: 8px;
                padding: 6px; border: 1px solid var(--cm-border);
            }

            .cm-live-score {
                text-align: center; padding: 8px 6px;
                background: linear-gradient(135deg, rgba(var(--cm-primary-rgb),0.08), rgba(var(--cm-accent-rgb),0.05));
                border-radius: 8px;
            }
            .cm-score-value {
                font-family: 'JetBrains Mono', monospace;
                font-size: 24px; font-weight: 800; letter-spacing: -0.02em; line-height: 1; margin-bottom: 2px;
            }
            .cm-score-tier { font-size: 9px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; }

            .cm-row {
                display: flex; align-items: center; justify-content: space-between;
                padding: 4px 0; border-bottom: 1px solid var(--cm-border);
            }
            .cm-row:last-child { border-bottom: none; }
            .cm-label { font-size: 10px; font-weight: 500; color: var(--cm-text); }
            .cm-value { font-family: 'JetBrains Mono', monospace; font-size: 9px; font-weight: 600; color: var(--cm-text); }

            .cm-number-control {
                display: flex;
                align-items: center;
                gap: 4px;
            }
            .cm-number-btn {
                background: var(--cm-bg-elevated);
                border: 1px solid var(--cm-border);
                border-radius: 4px;
                width: 22px;
                height: 22px;
                font-size: 12px;
                font-weight: 700;
                cursor: pointer;
                transition: all 0.1s ease;
                color: var(--cm-text);
            }
            .cm-number-btn:hover {
                background: rgba(var(--cm-primary-rgb),0.2);
                border-color: rgba(var(--cm-primary-rgb),0.5);
            }
            .cm-number-input {
                width: 60px;
                text-align: center;
                background: var(--cm-bg-elevated);
                border: 1px solid var(--cm-border);
                border-radius: 4px;
                padding: 4px 0;
                font-family: 'JetBrains Mono', monospace;
                font-size: 11px;
                color: var(--cm-text);
            }

            .cm-slider-row { display: flex; flex-direction: column; gap: 2px; padding: 4px 0; border-bottom: 1px solid var(--cm-border); }
            .cm-slider-row:last-child { border-bottom: none; }
            .cm-slider-header { display: flex; justify-content: space-between; align-items: center; }
            .cm-slider-label { font-size: 9px; font-weight: 500; }
            .cm-slider-value {
                font-family: 'JetBrains Mono', monospace; font-size: 9px; font-weight: 600; color: var(--cm-text);
                background: var(--cm-bg-elevated); border: 1px solid var(--cm-border); padding: 1px 4px; border-radius: 3px;
            }
            .cm-slider-track {
                position: relative; height: 4px;
                background: var(--cm-bg-elevated); border-radius: 2px; overflow: hidden; border: 1px solid var(--cm-border);
            }
            .cm-slider-fill {
                position: absolute; top: 0; left: 0; height: 100%;
                background: var(--cm-text-muted); border-radius: 2px; transition: width 0.1s ease; opacity: 0.4;
            }
            .cm-slider {
                position: absolute; top: 0; left: 0; width: 100%; height: 100%;
                -webkit-appearance: none; background: transparent; cursor: pointer; margin: 0;
            }
            .cm-slider::-webkit-slider-thumb {
                -webkit-appearance: none; width: 14px; height: 14px; border-radius: 50%;
                background: var(--cm-text); cursor: pointer;
                box-shadow: 0 2px 6px rgba(0,0,0,0.4); transition: transform 0.15s ease, box-shadow 0.15s ease;
            }
            .cm-slider::-webkit-slider-thumb:hover { transform: scale(1.15); box-shadow: 0 2px 10px rgba(0,0,0,0.5); }

            .cm-toggle { position: relative; width: 32px; height: 18px; cursor: pointer; }
            .cm-toggle input { opacity: 0; width: 0; height: 0; }
            .cm-toggle-track {
                position: absolute; inset: 0; border-radius: 11px;
                background: var(--cm-bg-elevated); border: 1px solid var(--cm-border); transition: all 0.25s ease;
            }
            .cm-toggle input:checked + .cm-toggle-track { background: var(--cm-text); border-color: var(--cm-text); }
            .cm-toggle-thumb {
                position: absolute; top: 2px; left: 2px; width: 14px; height: 14px; border-radius: 50%;
                background: var(--cm-text); box-shadow: 0 1px 3px rgba(0,0,0,0.3);
                transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
            }
            .cm-toggle input:checked ~ .cm-toggle-thumb { left: 16px; background: var(--cm-bg-dark); }

            .cm-btn-group { display: flex; gap: 3px; background: var(--cm-bg-elevated); padding: 2px; border-radius: 6px; }
            .cm-btn-opt {
                padding: 6px 10px; border-radius: 6px; font-size: 10px; font-weight: 700;
                text-transform: uppercase; letter-spacing: 0.03em; cursor: pointer; transition: all 0.15s ease;
                background: transparent; color: var(--cm-text-muted); border: none;
            }
            .cm-btn-opt:hover { color: var(--cm-text); }
            .cm-btn-opt.active { background: var(--cm-text); color: var(--cm-bg-dark); box-shadow: 0 2px 6px rgba(0,0,0,0.3); }

            .cm-preview {
                margin-top: 12px; padding: 16px;
                background: linear-gradient(135deg, rgba(var(--cm-primary-rgb),0.08), rgba(var(--cm-accent-rgb),0.05));
                border-radius: 10px; text-align: center; border: 1px solid rgba(var(--cm-primary-rgb),0.15);
            }
            .cm-preview-score { font-family: 'JetBrains Mono', monospace; font-size: 32px; font-weight: 800; }
            .cm-preview-tier { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; margin-top: 4px; }

            .cm-file-picker {
                display: flex; align-items: center; gap: 8px; padding: 8px;
                background: var(--cm-bg-elevated); border: 1px dashed var(--cm-border);
                border-radius: 6px; cursor: pointer; transition: all 0.15s ease;
            }
            .cm-file-picker:hover { border-color: var(--cm-text); background: rgba(var(--cm-accent-rgb),0.05); }
            .cm-file-icon {
                width: 28px; height: 28px; border-radius: 6px;
                background: var(--cm-bg-card); display: flex; align-items: center; justify-content: center;
            }
            .cm-file-icon svg { width: 14px; height: 14px; fill: var(--cm-text-muted); }
            .cm-file-name { font-size: 10px; color: var(--cm-text-muted); flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
            .cm-file-name.selected { color: var(--cm-success); }

            .cm-preset-section { margin-top: 6px; padding-top: 6px; border-top: 1px solid var(--cm-border); }
            .cm-preset-label { font-size: 8px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: var(--cm-text-muted); display: block; margin-bottom: 4px; }
            .cm-preset-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 4px; }
            .cm-preset-btn {
                padding: 4px 6px; font-size: 8px; font-weight: 500;
                border: 1px solid var(--cm-border); border-radius: 4px;
                background: var(--cm-bg-elevated); color: var(--cm-text); cursor: pointer; transition: all 0.15s ease; text-align: center;
            }
            .cm-preset-btn:hover { background: var(--cm-text); color: var(--cm-bg-dark); border-color: var(--cm-text); }
            .cm-preset-btn.active { background: var(--cm-text); color: var(--cm-bg-dark); border-color: var(--cm-text); }

            .cm-color-row { display: flex; align-items: center; gap: 10px; }
            .cm-color-input { width: 32px; height: 32px; border-radius: 8px; border: none; cursor: pointer; padding: 0; background: none; }

            .cm-input {
                background: var(--cm-bg-elevated); border: 1px solid var(--cm-border);
                border-radius: 6px; padding: 6px 10px;
                font-family: 'JetBrains Mono', monospace; font-size: 11px; color: var(--cm-text);
                outline: none; transition: all 0.2s ease;
            }
            .cm-input:focus { border-color: var(--cm-primary); box-shadow: 0 0 0 2px rgba(var(--cm-primary-rgb),0.2); }
            .cm-score-input {
                -moz-appearance: textfield;
            }
            .cm-score-input::-webkit-outer-spin-button,
            .cm-score-input::-webkit-inner-spin-button {
                -webkit-appearance: none;
                margin: 0;
            }
            .cm-select {
                background: var(--cm-bg-elevated); border: 1px solid var(--cm-border);
                border-radius: 6px; padding: 6px 10px;
                font-family: 'JetBrains Mono', monospace; font-size: 11px; color: var(--cm-text);
                outline: none; cursor: pointer; transition: all 0.2s ease;
            }
            .cm-select:focus { border-color: var(--cm-primary); box-shadow: 0 0 0 2px rgba(var(--cm-primary-rgb),0.2); }
            .cm-select option { background: var(--cm-bg-dark); color: var(--cm-text); }
            .cm-btn-small {
                background: linear-gradient(135deg, var(--cm-primary), var(--cm-secondary));
                border: none; border-radius: 4px; padding: 4px 10px;
                font-family: 'Inter', sans-serif; font-size: 10px; font-weight: 600;
                color: white; cursor: pointer; transition: all 0.2s ease;
            }
            .cm-btn-small:hover { transform: scale(1.02); filter: brightness(1.1); }

            .cm-shapes { display: flex; gap: 4px; }
            .cm-shape-btn {
                width: 32px; height: 32px; border-radius: 8px;
                border: 1px solid var(--cm-border); background: var(--cm-bg-elevated);
                cursor: pointer; font-size: 14px; display: flex; align-items: center; justify-content: center; transition: all 0.15s ease;
            }
            .cm-shape-btn:hover { background: rgba(var(--cm-primary-rgb),0.15); }
            .cm-shape-btn.active { background: linear-gradient(135deg, var(--cm-primary), var(--cm-secondary)); border-color: transparent; }

            .cm-theme-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 4px; margin-top: 4px; }
            .cm-theme-btn {
                padding: 6px 4px; border-radius: 6px; border: 1px solid var(--cm-border);
                background: var(--cm-bg-elevated); cursor: pointer; transition: all 0.15s ease; text-align: center;
            }
            .cm-theme-btn:hover { border-color: rgba(var(--cm-primary-rgb),0.4); }
            .cm-theme-btn.active { border-color: var(--cm-text); box-shadow: 0 0 8px rgba(var(--cm-primary-rgb),0.2); }
            .cm-theme-preview { width: 16px; height: 16px; border-radius: 4px; margin: 0 auto 3px; }
            .cm-theme-name { font-size: 8px; font-weight: 600; color: var(--cm-text); }

            .cm-panic-btn {
                width: 100%; padding: 6px 10px; font-size: 9px; font-weight: 600;
                border: 1px solid var(--cm-danger); border-radius: 4px;
                background: rgba(239,68,68,0.1); color: var(--cm-danger); cursor: pointer; transition: all 0.15s ease;
            }
            .cm-panic-btn:hover { background: var(--cm-danger); color: white; }

            #cm-root.stream-hidden,
            #cm-toggle-btn.stream-hidden { display: none !important; opacity: 0 !important; pointer-events: none !important; }

            #cm-watermark {
                position: fixed; bottom: 16px; right: 16px; z-index: 999990;
                padding: 6px 12px; border-radius: 8px;
                background: rgba(var(--cm-primary-rgb),0.1); backdrop-filter: blur(8px);
                border: 1px solid rgba(var(--cm-primary-rgb),0.2);
                font-family: 'JetBrains Mono', monospace; font-size: 9px; font-weight: 600;
                color: rgba(255,255,255,0.35); letter-spacing: 0.05em; cursor: grab; user-select: none;
            }

            .cm-toggle-track, .cm-toggle-thumb, .cm-btn-opt, .cm-tab, .cm-card, .cm-section,
            .cm-file-picker, .cm-theme-btn, .cm-panic-btn, .cm-input, .cm-slider-fill {
                transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1) !important;
            }
            .cm-card:hover { transform: translateY(-1px); box-shadow: 0 4px 12px rgba(0,0,0,0.15); }
            .cm-btn-opt:active, .cm-tab:active { transform: scale(0.96); }
            .cm-toggle input:checked ~ .cm-toggle-thumb { transform: translateX(0); }
            #cm-root { transition: opacity 0.3s ease, transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), visibility 0.3s ease; }
            #cm-root:not(.visible) { opacity: 0; transform: translateX(20px) scale(0.95); visibility: hidden; pointer-events: none; }
            #cm-root.visible { opacity: 1; transform: translateX(0) scale(1); visibility: visible; }

            #cm-disclaimer {
                position: fixed; bottom: 16px; left: 16px; z-index: 999999;
                padding: 10px 14px; border-radius: 8px;
                background: rgba(234, 179, 8, 0.15); backdrop-filter: blur(10px);
                border: 1px solid rgba(234, 179, 8, 0.4);
                font-family: 'Inter', -apple-system, sans-serif; font-size: 11px; font-weight: 500;
                color: #eab308; display: flex; align-items: center; gap: 10px;
                animation: cm-slide-in 0.4s cubic-bezier(0.4, 0, 0.2, 1);
            }
            #cm-disclaimer.hiding {
                animation: cm-slide-out 0.3s cubic-bezier(0.4, 0, 0.2, 1) forwards;
            }
            @keyframes cm-slide-in {
                from { opacity: 0; transform: translateY(20px); }
                to { opacity: 1; transform: translateY(0); }
            }
            @keyframes cm-slide-out {
                from { opacity: 1; transform: translateY(0); }
                to { opacity: 0; transform: translateY(20px); }
            }
            #cm-disclaimer-close {
                background: none; border: none; color: #eab308; cursor: pointer;
                padding: 2px; display: flex; align-items: center; justify-content: center;
                border-radius: 4px; transition: all 0.2s ease;
            }
            #cm-disclaimer-close:hover { background: rgba(234, 179, 8, 0.2); }
            #cm-disclaimer-close svg { width: 14px; height: 14px; }

            /* ============================================================
               ENHANCED UI LAYER — visual polish & animations
               ============================================================ */

            @keyframes cmGlowPulse {
                0%,100% { box-shadow: 0 0 0 0 rgba(var(--cm-primary-rgb),0.45); }
                50%     { box-shadow: 0 0 10px 2px rgba(var(--cm-primary-rgb),0.0); }
            }
            @keyframes cmSheen {
                0%   { background-position: -150% 0; }
                100% { background-position: 250% 0; }
            }
            @keyframes cmBorderFlow {
                0%   { background-position: 0% 50%; }
                100% { background-position: 200% 50%; }
            }
            @keyframes cmRise {
                from { opacity: 0; transform: translateY(8px); }
                to   { opacity: 1; transform: translateY(0); }
            }
            @keyframes cmScorePulse {
                0%,100% { transform: scale(1); text-shadow: 0 0 14px rgba(var(--cm-primary-rgb),0.35); }
                50%     { transform: scale(1.04); text-shadow: 0 0 22px rgba(var(--cm-primary-rgb),0.6); }
            }
            @keyframes cmSpin { to { transform: rotate(360deg); } }

            /* ---- Panel shell: glassy + animated gradient top accent ---- */
            #cm-root {
                background:
                    linear-gradient(180deg, rgba(var(--cm-primary-rgb),0.05), transparent 140px),
                    rgba(10,8,10,0.82) !important;
                backdrop-filter: blur(18px) saturate(135%);
                -webkit-backdrop-filter: blur(18px) saturate(135%);
                border: 1px solid var(--cm-border) !important;
                border-radius: 16px !important;
                box-shadow:
                    0 0 0 1px rgba(255,255,255,0.03),
                    0 0 50px rgba(var(--cm-primary-rgb),0.14),
                    0 24px 60px rgba(0,0,0,0.55) !important;
            }
            #cm-root::before {
                content: '';
                position: absolute;
                top: 0; left: 0; right: 0;
                height: 2px;
                border-radius: 16px 16px 0 0;
                background: linear-gradient(90deg,
                    transparent, var(--cm-primary), var(--cm-accent), var(--cm-primary), transparent);
                background-size: 200% 100%;
                animation: cmBorderFlow 4s linear infinite;
                opacity: 0.9;
                pointer-events: none;
                z-index: 5;
            }

            /* ---- Header: subtle moving sheen ---- */
            .cm-header {
                position: relative;
                padding: 12px 12px 10px !important;
                overflow: hidden;
                background:
                    linear-gradient(180deg, rgba(var(--cm-primary-rgb),0.10) 0%, transparent 100%) !important;
            }
            .cm-header::after {
                content: '';
                position: absolute; inset: 0;
                background: linear-gradient(115deg, transparent 35%, rgba(255,255,255,0.06) 50%, transparent 65%);
                background-size: 250% 100%;
                animation: cmSheen 6s ease-in-out infinite;
                pointer-events: none;
            }
            .cm-title {
                background: linear-gradient(135deg, #fff 0%, var(--cm-accent) 50%, var(--cm-primary) 100%) !important;
                background-size: 200% auto !important;
                -webkit-background-clip: text !important;
                background-clip: text !important;
                -webkit-text-fill-color: transparent !important;
                animation: cmBorderFlow 5s linear infinite;
                font-size: 14px !important;
            }
            .cm-logo-icon { animation: cmGlowPulse 2.6s ease-in-out infinite; }

            /* ---- Status pill: live glow ---- */
            .cm-pill.active {
                position: relative;
                animation: cmGlowPulse 2s ease-in-out infinite;
            }
            .cm-pill { transition: all 0.25s ease; }

            /* ---- Tabs: animated hover + active ---- */
            .cm-tabs { gap: 3px !important; border-radius: 9px !important; padding: 3px !important; }
            .cm-tab {
                position: relative; overflow: hidden; border-radius: 7px !important;
                transition: color 0.2s ease, background 0.2s ease, transform 0.12s ease;
            }
            .cm-tab.active {
                background: linear-gradient(135deg, rgba(var(--cm-primary-rgb),0.22), rgba(var(--cm-accent-rgb),0.12)) !important;
                color: #fff !important;
                box-shadow: 0 0 0 1px rgba(var(--cm-primary-rgb),0.3), 0 2px 8px rgba(var(--cm-primary-rgb),0.18) !important;
            }
            .cm-tab.active::after {
                content: '';
                position: absolute; bottom: 2px; left: 50%; transform: translateX(-50%);
                width: 16px; height: 2px; border-radius: 2px;
                background: var(--cm-primary);
                box-shadow: 0 0 6px var(--cm-primary);
            }
            .cm-tab:hover { transform: translateY(-1px); }

            /* ---- Panels stagger rows on enter ---- */
            .cm-panel.active .cm-section { animation: cmRise 0.35s ease both; }
            .cm-panel.active .cm-section:nth-child(2) { animation-delay: 0.05s; }
            .cm-panel.active .cm-section:nth-child(3) { animation-delay: 0.10s; }
            .cm-panel.active .cm-section:nth-child(4) { animation-delay: 0.15s; }
            .cm-panel.active .cm-section:nth-child(5) { animation-delay: 0.20s; }

            /* ---- Cards: gradient + glow lift ---- */
            .cm-card {
                background: linear-gradient(160deg, var(--cm-bg-card), var(--cm-bg-dark)) !important;
                border: 1px solid var(--cm-border) !important;
                border-radius: 10px !important;
                padding: 8px !important;
                position: relative;
            }
            .cm-card:hover {
                transform: translateY(-2px);
                border-color: rgba(var(--cm-primary-rgb),0.35) !important;
                box-shadow: 0 8px 22px rgba(0,0,0,0.4), 0 0 0 1px rgba(var(--cm-primary-rgb),0.15) !important;
            }

            .cm-section-title { font-size: 9px !important; }

            /* ---- Rows: hover highlight ---- */
            .cm-row { transition: background 0.2s ease, padding 0.2s ease; border-radius: 6px; }
            .cm-row:hover { background: rgba(var(--cm-primary-rgb),0.05); }

            /* ---- Toggles: glow when on ---- */
            .cm-toggle input:checked + .cm-toggle-track {
                background: linear-gradient(135deg, var(--cm-primary), var(--cm-secondary)) !important;
                border-color: transparent !important;
                box-shadow: 0 0 10px rgba(var(--cm-primary-rgb),0.5);
            }
            .cm-toggle input:checked ~ .cm-toggle-thumb {
                background: #fff !important;
                box-shadow: 0 0 8px rgba(var(--cm-primary-rgb),0.6), 0 1px 3px rgba(0,0,0,0.4);
            }
            .cm-toggle:hover .cm-toggle-thumb { transform: scale(1.08); }

            /* ---- Sliders: themed fill + glowing thumb ---- */
            .cm-slider-fill {
                background: linear-gradient(90deg, var(--cm-secondary), var(--cm-primary)) !important;
                opacity: 1 !important;
                box-shadow: 0 0 8px rgba(var(--cm-primary-rgb),0.5);
            }
            .cm-slider::-webkit-slider-thumb {
                background: #fff !important;
                box-shadow: 0 0 0 3px rgba(var(--cm-primary-rgb),0.25), 0 2px 6px rgba(0,0,0,0.5) !important;
            }
            .cm-slider::-webkit-slider-thumb:hover {
                box-shadow: 0 0 0 5px rgba(var(--cm-primary-rgb),0.35), 0 2px 10px rgba(0,0,0,0.6) !important;
            }
            .cm-slider-value {
                background: rgba(var(--cm-primary-rgb),0.12) !important;
                border-color: rgba(var(--cm-primary-rgb),0.3) !important;
                color: var(--cm-text) !important;
            }

            /* ---- Segmented buttons: gradient active ---- */
            .cm-btn-group { border-radius: 8px !important; }
            .cm-btn-opt { border-radius: 6px !important; }
            .cm-btn-opt.active {
                background: linear-gradient(135deg, var(--cm-primary), var(--cm-secondary)) !important;
                color: #fff !important;
                box-shadow: 0 2px 10px rgba(var(--cm-primary-rgb),0.4) !important;
            }

            /* ---- Live / preview score: breathing animation ---- */
            .cm-live-score, .cm-preview {
                border: 1px solid rgba(var(--cm-primary-rgb),0.2) !important;
                border-radius: 12px !important;
            }
            .cm-score-value, .cm-preview-score { animation: cmScorePulse 3s ease-in-out infinite; }

            /* ---- File pickers ---- */
            .cm-file-picker { border-radius: 8px !important; }
            .cm-file-picker:hover {
                border-color: var(--cm-primary) !important;
                box-shadow: 0 0 0 2px rgba(var(--cm-primary-rgb),0.12);
            }

            /* ---- Theme swatches ---- */
            .cm-theme-btn { border-radius: 8px !important; }
            .cm-theme-btn:hover { transform: translateY(-2px) scale(1.03); }
            .cm-theme-btn.active { box-shadow: 0 0 0 1px var(--cm-primary), 0 0 12px rgba(var(--cm-primary-rgb),0.35) !important; }
            .cm-theme-preview { box-shadow: 0 2px 6px rgba(0,0,0,0.4); }

            /* ---- Small / panic buttons ---- */
            .cm-btn-small { border-radius: 6px !important; box-shadow: 0 2px 8px rgba(var(--cm-primary-rgb),0.3); }
            .cm-btn-small:active { transform: scale(0.96); }
            .cm-panic-btn { border-radius: 6px !important; transition: all 0.2s ease; }
            .cm-panic-btn:hover { box-shadow: 0 0 14px rgba(239,68,68,0.5); }

            /* ---- Inputs ---- */
            .cm-input, .cm-select { border-radius: 8px !important; }

            /* ---- Discord link shine ---- */
            .cm-discord-link { position: relative; overflow: hidden; }
            .cm-discord-link::after {
                content: ''; position: absolute; inset: 0;
                background: linear-gradient(115deg, transparent 40%, rgba(255,255,255,0.25) 50%, transparent 60%);
                background-size: 250% 100%;
                animation: cmSheen 4.5s ease-in-out infinite;
            }

            /* ---- Scrollbar ---- */
            .cm-body::-webkit-scrollbar-thumb {
                background: linear-gradient(var(--cm-secondary), var(--cm-primary)) !important;
                border-radius: 3px !important;
            }

            /* ---- Hook status spinner when pending ---- */
            #cm-zustand-val[data-pending="1"]::before {
                content: '';
                display: inline-block; width: 7px; height: 7px;
                margin-right: 5px; vertical-align: middle;
                border: 1.5px solid var(--cm-warning);
                border-top-color: transparent; border-radius: 50%;
                animation: cmSpin 0.8s linear infinite;
            }

            /* ============================================================
               TOP-CENTER QUICK CONTROL BAR
               ============================================================ */
            #cm-controlbar {
                position: fixed;
                top: 14px;
                left: 50%;
                transform: translateX(-50%) translateY(-4px);
                z-index: 999999;
                display: flex;
                align-items: center;
                gap: 6px;
                padding: 7px 9px;
                border-radius: 14px;
                background: rgba(10,8,14,0.78);
                backdrop-filter: blur(16px) saturate(140%);
                -webkit-backdrop-filter: blur(16px) saturate(140%);
                border: 1px solid rgba(var(--cm-primary-rgb),0.28);
                box-shadow:
                    0 0 0 1px rgba(255,255,255,0.03),
                    0 0 26px rgba(var(--cm-primary-rgb),0.12),
                    0 12px 30px rgba(0,0,0,0.5);
                font-family: 'Inter', -apple-system, sans-serif;
                opacity: 0;
                pointer-events: none;
                cursor: grab;
                transition: opacity 0.35s ease, transform 0.35s cubic-bezier(0.34,1.56,0.64,1);
            }
            #cm-controlbar.cm-cb-show { opacity: 1; transform: translateX(-50%) translateY(0); pointer-events: auto; }
            #cm-controlbar.cm-cb-hidden { display: none !important; }
            #cm-controlbar.cm-cb-dragging { cursor: grabbing; transition: opacity 0.35s ease; }
            #cm-controlbar::before {
                content: '';
                position: absolute; inset: 0;
                border-radius: 14px;
                padding: 1px;
                background: linear-gradient(90deg, transparent, rgba(var(--cm-primary-rgb),0.5), transparent);
                background-size: 200% 100%;
                animation: cmBorderFlow 4s linear infinite;
                -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
                -webkit-mask-composite: xor;
                mask-composite: exclude;
                pointer-events: none;
            }
            .cm-cb-item {
                display: flex;
                align-items: center;
                gap: 6px;
                padding: 5px 9px 5px 6px;
                border-radius: 10px;
                background: rgba(255,255,255,0.03);
                border: 1px solid rgba(255,255,255,0.06);
                cursor: pointer;
                user-select: none;
                transition: background 0.2s ease, border-color 0.2s ease, transform 0.12s ease, box-shadow 0.2s ease;
            }
            .cm-cb-item:hover { transform: translateY(-1px); background: rgba(255,255,255,0.06); }
            .cm-cb-item:active { transform: translateY(0) scale(0.97); }
            .cm-cb-key {
                display: inline-flex;
                align-items: center;
                justify-content: center;
                min-width: 22px;
                height: 22px;
                padding: 0 5px;
                border-radius: 7px;
                font-size: 11px;
                font-weight: 800;
                color: var(--cm-text);
                background: linear-gradient(180deg, rgba(var(--cm-primary-rgb),0.18), rgba(var(--cm-primary-rgb),0.06));
                border: 1px solid rgba(var(--cm-primary-rgb),0.4);
                box-shadow: 0 1px 0 rgba(0,0,0,0.4), inset 0 1px 0 rgba(255,255,255,0.08);
                text-shadow: 0 0 6px rgba(var(--cm-primary-rgb),0.4);
            }
            .cm-cb-label {
                font-size: 11px;
                font-weight: 600;
                letter-spacing: 0.2px;
                color: rgba(235,235,245,0.72);
                white-space: nowrap;
            }
            .cm-cb-dot {
                width: 7px; height: 7px; border-radius: 50%;
                background: #4b4b55;
                box-shadow: 0 0 0 2px rgba(255,255,255,0.04);
                transition: background 0.25s ease, box-shadow 0.25s ease;
            }
            .cm-cb-item.cm-on { border-color: rgba(var(--cm-primary-rgb),0.55); background: rgba(var(--cm-primary-rgb),0.10); }
            .cm-cb-item.cm-on .cm-cb-label { color: var(--cm-text); }
            .cm-cb-item.cm-on .cm-cb-dot {
                background: var(--cm-primary);
                box-shadow: 0 0 8px rgba(var(--cm-primary-rgb),0.8), 0 0 0 2px rgba(var(--cm-primary-rgb),0.18);
            }
            .cm-cb-item.cm-flash { animation: cmCbFlash 0.45s ease; }
            @keyframes cmCbFlash {
                0%   { box-shadow: 0 0 0 0 rgba(var(--cm-primary-rgb),0.55); }
                40%  { box-shadow: 0 0 0 5px rgba(var(--cm-primary-rgb),0.0); }
                100% { box-shadow: 0 0 0 0 rgba(var(--cm-primary-rgb),0.0); }
            }
            .cm-cb-sep { width: 1px; height: 20px; background: rgba(255,255,255,0.08); margin: 0 1px; }
            #cm-controlbar.stream-hidden { display: none !important; }

            @media (prefers-reduced-motion: reduce) {
                #cm-toggle-btn::before, #cm-toggle-btn::after,
                .cm-header::after, .cm-discord-link::after, .cm-title,
                #cm-root::before, .cm-logo-icon, .cm-pill.active,
                .cm-score-value, .cm-preview-score,
                #cm-controlbar::before, .cm-cb-item.cm-flash { animation: none !important; }
            }
        `;
        document.head.appendChild(style);

        applyTheme(CONFIG.theme || 'midnight');
        applyAccentColor(CONFIG.accentColor || '#6366f1');

        const btn = document.createElement('button');
        btn.id = 'cm-toggle-btn';
        btn.innerHTML = `<img src="https://cdn.discordapp.com/icons/1508543746214465648/44b1c062230c1103016d7928805df398.webp?size=1024" style="width:26px;height:26px;border-radius:4px;object-fit:cover;">`;
        document.body.appendChild(btn);

        // Top-center quick control bar
        const controlBar = document.createElement('div');
        controlBar.id = 'cm-controlbar';
        controlBar.innerHTML = `
            <div class="cm-cb-item" data-cb="master" title="Toggle Master Switch (M)">
                <span class="cm-cb-key">M</span>
                <span class="cm-cb-label" data-i18n="active">Master</span>
                <span class="cm-cb-dot"></span>
            </div>
            <div class="cm-cb-sep"></div>
            <div class="cm-cb-item" data-cb="camera" title="Toggle Camera Spoof (C)">
                <span class="cm-cb-key">C</span>
                <span class="cm-cb-label" data-i18n="video">Camera</span>
                <span class="cm-cb-dot"></span>
            </div>
            <div class="cm-cb-sep"></div>
            <div class="cm-cb-item" data-cb="audio" title="Toggle Audio Spoof (A)">
                <span class="cm-cb-key">A</span>
                <span class="cm-cb-label" data-i18n="audioSpoof">Audio</span>
                <span class="cm-cb-dot"></span>
            </div>
        `;
        document.body.appendChild(controlBar);
        // Control bar hidden by default
        if (CONFIG.showControlBar) controlBar.classList.add('cm-cb-show');
        else controlBar.classList.add('cm-cb-hidden');

        const root = document.createElement('div');
        root.id = 'cm-root';
        // restore saved size if any
        if (CONFIG.panelWidth) root.style.width = CONFIG.panelWidth + 'px';
        if (CONFIG.panelHeight) root.style.height = CONFIG.panelHeight + 'px';
        root.addEventListener('resize', () => {
            // save new size when user stops resizing (debounced)
            clearTimeout(root._resizeTimer);
            root._resizeTimer = setTimeout(() => {
                CONFIG.panelWidth = root.offsetWidth;
                CONFIG.panelHeight = root.offsetHeight;
                saveConfig();
            }, 300);
        });

        root.innerHTML = `
            <div class="cm-header">
                <div class="cm-title-row">
                    <div class="cm-logo">
                        <div class="cm-logo-icon">
                            <img src="https://cdn.discordapp.com/icons/1508543746214465648/44b1c062230c1103016d7928805df398.webp?size=1024" style="width:24px;height:24px;border-radius:6px;object-fit:cover;display:block;">
                        </div>
                        <div>
                            <span class="cm-title">cheatmoggle</span>
                            <span class="cm-free-badge">FREE</span>
                            <span class="cm-version">v13.6.2</span>
                        </div>
                    </div>
                    <a href="https://discord.gg/f8GwCMHhD9" target="_blank" class="cm-discord-link">
                        <svg viewBox="0 0 24 24"><path d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028 14.09 14.09 0 0 0 1.226-1.994.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z"/></svg>
                        Join Discord
                    </a>
                </div>
                <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;">
                    <div class="cm-status-row">
                        <span class="cm-pill active" id="cm-status-pill" data-i18n="active">ON</span>
                        <span class="cm-pill mode" id="cm-mode-pill" data-i18n="matchType">NORMAL</span>
                    </div>
                </div>
                <div class="cm-tabs">
                    <button class="cm-tab active" data-tab="home" data-i18n="systemStatus">Home</button>
                    <button class="cm-tab" data-tab="score" data-i18n="scoreControl">Score</button>
                    <button class="cm-tab" data-tab="automation" data-i18n="matchmaking">Auto</button>
                    <button class="cm-tab" data-tab="camera" data-i18n="virtualCamera">Camera</button>
                    <button class="cm-tab" data-tab="settings" data-i18n="appearance">Settings</button>
                    <button class="cm-tab" data-tab="credits" data-i18n="credits">Credits</button>
                </div>
            </div>

            <div class="cm-body">
                <!-- HOME PANEL -->
                <div class="cm-panel active" data-panel="home">
                    <div class="cm-section">
                        <div class="cm-section-title" data-i18n="systemStatus">System Status</div>
                        <div class="cm-card">
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="masterSwitch">Master Switch</span>
                                <label class="cm-toggle">
                                    <input type="checkbox" id="cm-enable-toggle" checked>
                                    <div class="cm-toggle-track"></div>
                                    <div class="cm-toggle-thumb"></div>
                                </label>
                            </div>
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="powerStatus">Power Status</span>
                                <span class="cm-value" id="cm-enabled-val" style="color: var(--cm-success)">ACTIVE</span>
                            </div>
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="matchType">Match Type</span>
                                <span class="cm-value" id="cm-mode-val">NORMAL</span>
                            </div>
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="hookStatus">Hook Status</span>
                                <span class="cm-value" id="cm-zustand-val" data-pending="1" style="color: var(--cm-warning)">PENDING</span>
                            </div>
                            <div class="cm-row" style="border-bottom:none;padding-top:6px;display:flex;gap:6px;">
                                <button class="cm-panic-btn" id="cm-clearcookies-btn" style="margin:0;flex:1;" data-i18n="unbanClearCookies">Unban / Clear Cookies</button>
                                <button class="cm-panic-btn" id="cm-verifbypass-btn" style="margin:0;flex:1;background:var(--cm-accent);color:#fff;" data-i18n="verificationBypass">Verification Bypass</button>
                            </div>
                        </div>
                    </div>
                </div>

                <!-- SCORE PANEL -->
                <div class="cm-panel" data-panel="score">
                    <div class="cm-section">
                        <div class="cm-section-title">
                            <span data-i18n="scoreControl">Score Control</span>
                            <label class="cm-toggle cm-section-toggle">
                                <input type="checkbox" id="cm-score-enabled" checked>
                                <div class="cm-toggle-track"></div>
                                <div class="cm-toggle-thumb"></div>
                            </label>
                        </div>
                        <div class="cm-card" id="cm-score-content">
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="mode">Mode</span>
                                <div class="cm-btn-group">
                                    <button class="cm-btn-opt active" data-smode="range" data-i18n="range">Range</button>
                                    <button class="cm-btn-opt" data-smode="fixed" data-i18n="fixed">Fixed</button>
                                </div>
                            </div>
                            <div id="cm-score-fixed" style="display:none;">
                                <div class="cm-slider-row">
                                    <div class="cm-slider-header">
                                        <span class="cm-slider-label" data-i18n="target">Target (1-10)</span>
                                        <div class="cm-number-control">
                                            <button class="cm-number-btn" data-dec="cm-fixed-score">-</button>
                                            <input type="number" class="cm-number-input cm-score-input" id="cm-fixed-score" min="1" max="10" step="0.1" value="9.4">
                                            <button class="cm-number-btn" data-inc="cm-fixed-score">+</button>
                                        </div>
                                    </div>
                                </div>
                            </div>
                            <div id="cm-score-range">
                                <div class="cm-slider-row">
                                    <div class="cm-slider-header">
                                        <span class="cm-slider-label" data-i18n="scoreMin">Min (1-10)</span>
                                        <div class="cm-number-control">
                                            <button class="cm-number-btn" data-dec="cm-score-min">-</button>
                                            <input type="number" class="cm-number-input cm-score-input" id="cm-score-min" min="1" max="10" step="0.1" value="8.5">
                                            <button class="cm-number-btn" data-inc="cm-score-min">+</button>
                                        </div>
                                    </div>
                                </div>
                                <div class="cm-slider-row">
                                    <div class="cm-slider-header">
                                        <span class="cm-slider-label" data-i18n="scoreMax">Max (1-10)</span>
                                        <div class="cm-number-control">
                                            <button class="cm-number-btn" data-dec="cm-score-max">-</button>
                                            <input type="number" class="cm-number-input cm-score-input" id="cm-score-max" min="1" max="10" step="0.1" value="9.5">
                                            <button class="cm-number-btn" data-inc="cm-score-max">+</button>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>

                    <div class="cm-section">
                        <div class="cm-section-title">
                            <span data-i18n="resultSettings">Result Settings</span>
                            <label class="cm-toggle cm-section-toggle">
                                <input type="checkbox" id="cm-result-enabled" checked>
                                <div class="cm-toggle-track"></div>
                                <div class="cm-toggle-thumb"></div>
                            </label>
                        </div>
                        <div class="cm-card" id="cm-result-content">
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="type">Type</span>
                                <div class="cm-btn-group">
                                    <button class="cm-btn-opt active" data-fmode="fixed" data-i18n="staticScore">Static</button>
                                    <button class="cm-btn-opt" data-fmode="range" data-i18n="dynamic">Dynamic</button>
                                </div>
                            </div>
                            <div id="cm-final-fixed">
                                <div class="cm-slider-row">
                                    <div class="cm-slider-header">
                                        <span class="cm-slider-label" data-i18n="target">Target (1-10)</span>
                                        <div class="cm-number-control">
                                            <button class="cm-number-btn" data-dec="cm-final-score">-</button>
                                            <input type="number" class="cm-number-input cm-score-input" id="cm-final-score" min="1" max="10" step="0.1" value="9.4">
                                            <button class="cm-number-btn" data-inc="cm-final-score">+</button>
                                        </div>
                                    </div>
                                </div>
                            </div>
                            <div id="cm-final-range" style="display:none;">
                                <div class="cm-slider-row">
                                    <div class="cm-slider-header">
                                        <span class="cm-slider-label" data-i18n="lowerBound">Lower Bound (1-10)</span>
                                        <div class="cm-number-control">
                                            <button class="cm-number-btn" data-dec="cm-final-range-min">-</button>
                                            <input type="number" class="cm-number-input cm-score-input" id="cm-final-range-min" min="1" max="10" step="0.1" value="8.5">
                                            <button class="cm-number-btn" data-inc="cm-final-range-min">+</button>
                                        </div>
                                    </div>
                                </div>
                                <div class="cm-slider-row">
                                    <div class="cm-slider-header">
                                        <span class="cm-slider-label" data-i18n="upperBound">Upper Bound (1-10)</span>
                                        <div class="cm-number-control">
                                            <button class="cm-number-btn" data-dec="cm-final-range-max">-</button>
                                            <input type="number" class="cm-number-input cm-score-input" id="cm-final-range-max" min="1" max="10" step="0.1" value="9.7">
                                            <button class="cm-number-btn" data-inc="cm-final-range-max">+</button>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div class="cm-preview">
                            <div class="cm-preview-score" id="cm-score-preview-num" style="color:#f472b6">9.6</div>
                            <div class="cm-preview-tier" id="cm-score-preview-tier" style="color:#f472b6">Slayer</div>
                        </div>
                    </div>
                </div>

                <!-- AUTOMATION PANEL -->
                <div class="cm-panel" data-panel="automation">
                    <div class="cm-section">
                        <div class="cm-section-title" data-i18n="matchmaking">Matchmaking</div>
                        <div class="cm-card">
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="autoQueue">Auto Queue</span>
                                <label class="cm-toggle">
                                    <input type="checkbox" id="cm-autoqueuetoggle">
                                    <div class="cm-toggle-track"></div>
                                    <div class="cm-toggle-thumb"></div>
                                </label>
                            </div>
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="requestDelayMs">Request Delay (ms)</span>
                                <input type="number" class="cm-input" id="cm-queue-delay" min="100" max="60000" step="100" value="1000" style="width:80px;">
                            </div>
                            <div class="cm-row" style="border-bottom:none;">
                                <span class="cm-label" data-i18n="autoFindNewMatch">Auto Find New Match</span>
                                <label class="cm-toggle">
                                    <input type="checkbox" id="cm-autofindnew-toggle" checked>
                                    <div class="cm-toggle-track"></div>
                                    <div class="cm-toggle-thumb"></div>
                                </label>
                            </div>
                        </div>
                    </div>

                    <div class="cm-section">
                        <div class="cm-section-title" data-i18n="spoofCycling">Spoof Cycling</div>
                        <div class="cm-card">
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="autoCycleCamera">Auto Cycle Camera</span>
                                <label class="cm-toggle">
                                    <input type="checkbox" id="cm-autocam-toggle">
                                    <div class="cm-toggle-track"></div>
                                    <div class="cm-toggle-thumb"></div>
                                </label>
                            </div>
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="cameraIntervalSec">Camera Interval (s)</span>
                                <input type="number" class="cm-input" id="cm-autocam-interval" min="1" max="600" step="1" value="5" style="width:80px;">
                            </div>
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="autoCycleAudio">Auto Cycle Audio</span>
                                <label class="cm-toggle">
                                    <input type="checkbox" id="cm-autoaudio-toggle">
                                    <div class="cm-toggle-track"></div>
                                    <div class="cm-toggle-thumb"></div>
                                </label>
                            </div>
                            <div class="cm-row" style="border-bottom:none;">
                                <span class="cm-label" data-i18n="audioIntervalSec">Audio Interval (s)</span>
                                <input type="number" class="cm-input" id="cm-autoaudio-interval" min="1" max="600" step="1" value="5" style="width:80px;">
                            </div>
                        </div>
                    </div>

                    <div class="cm-section">
                        <div class="cm-section-title" data-i18n="convenience">Convenience</div>
                        <div class="cm-card">
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="autoDismissPopups">Auto Dismiss Popups</span>
                                <label class="cm-toggle">
                                    <input type="checkbox" id="cm-autodismiss-toggle">
                                    <div class="cm-toggle-track"></div>
                                    <div class="cm-toggle-thumb"></div>
                                </label>
                            </div>
                            <div class="cm-row" style="border-bottom:none;">
                                <span class="cm-label" data-i18n="autoClearCookiesOnBan">Auto Clear Cookies on Ban</span>
                                <label class="cm-toggle">
                                    <input type="checkbox" id="cm-autounban-toggle">
                                    <div class="cm-toggle-track"></div>
                                    <div class="cm-toggle-thumb"></div>
                                </label>
                            </div>
                        </div>
                    </div>
                </div>

                <!-- CAMERA PANEL -->
                <div class="cm-panel" data-panel="camera">
                    <div class="cm-section">
                        <div class="cm-section-title" data-i18n="virtualCamera">Virtual Camera</div>
                        <div class="cm-card">
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="activateSpoof">Activate Spoof</span>
                                <label class="cm-toggle">
                                    <input type="checkbox" id="cm-camspoof-toggle">
                                    <div class="cm-toggle-track"></div>
                                    <div class="cm-toggle-thumb"></div>
                                </label>
                            </div>
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="flipHorizontal">Flip Horizontal</span>
                                <label class="cm-toggle">
                                    <input type="checkbox" id="cm-cammirror-toggle">
                                    <div class="cm-toggle-track"></div>
                                    <div class="cm-toggle-thumb"></div>
                                </label>
                            </div>
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="loopVideo">Loop Video</span>
                                <label class="cm-toggle">
                                    <input type="checkbox" id="cm-camloop-toggle" checked>
                                    <div class="cm-toggle-track"></div>
                                    <div class="cm-toggle-thumb"></div>
                                </label>
                            </div>
                            <div class="cm-slider-row">
                                <div class="cm-slider-header">
                                    <span class="cm-slider-label" data-i18n="playbackSpeed">Playback Speed</span>
                                    <span class="cm-slider-value" id="cm-camspeed-val">1.0x</span>
                                </div>
                                <div class="cm-slider-track">
                                    <div class="cm-slider-fill" id="cm-camspeed-fill" style="width:25%"></div>
                                    <input type="range" class="cm-slider" id="cm-camspeed" min="0.25" max="4.0" step="0.25" value="1.0">
                                </div>
                            </div>
                        </div>
                    </div>
                    <div class="cm-section">
                        <div class="cm-section-title" data-i18n="source">Source</div>
                        <div class="cm-card">
                            <div class="cm-btn-group" style="margin-bottom:6px;">
                                <button class="cm-btn-opt active" data-src="video" data-i18n="video">Video</button>
                                <button class="cm-btn-opt" data-src="image" data-i18n="image">Image</button>
                            </div>
                            <div class="cm-file-picker" id="cm-video-picker">
                                <div class="cm-file-icon"><svg viewBox="0 0 24 24"><path d="M14 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V8l-6-6zm-1 7V3.5L18.5 9H13z"/></svg></div>
                                <span class="cm-file-name" id="cm-video-name" data-i18n="selectVideo">Select video file...</span>
                            </div>
                            <div class="cm-file-picker" id="cm-image-picker" style="display:none;">
                                <div class="cm-file-icon"><svg viewBox="0 0 24 24"><path d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"/></svg></div>
                                <span class="cm-file-name" id="cm-image-name" data-i18n="selectImage">Select image file...</span>
                            </div>
                        </div>
                    </div>
                    <div class="cm-section">
                        <div class="cm-section-title" data-i18n="textOverlay">Text Overlay</div>
                        <div class="cm-card">
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="enableText">Enable Text</span>
                                <label class="cm-toggle">
                                    <input type="checkbox" id="cm-camtext-toggle">
                                    <div class="cm-toggle-track"></div>
                                    <div class="cm-toggle-thumb"></div>
                                </label>
                            </div>
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="content">Content</span>
                                <input type="text" class="cm-input" id="cm-camtext-content" value="Your Text Here" style="width:100px;">
                            </div>
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="color">Color</span>
                                <input type="color" class="cm-color-input" id="cm-camtext-color" value="#ffffff">
                            </div>
                            <div class="cm-slider-row">
                                <div class="cm-slider-header">
                                    <span class="cm-slider-label" data-i18n="size">Size</span>
                                    <span class="cm-slider-value" id="cm-camtext-size-val">24px</span>
                                </div>
                                <div class="cm-slider-track">
                                    <div class="cm-slider-fill" id="cm-camtext-size-fill" style="width:50%"></div>
                                    <input type="range" class="cm-slider" id="cm-camtext-size" min="8" max="72" step="1" value="24">
                                </div>
                            </div>
                        </div>
                    </div>
                    <div class="cm-section">
                        <div class="cm-section-title" data-i18n="audioSpoof">Audio Spoof</div>
                        <div class="cm-card">
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="activateAudioSpoof">Activate Audio Spoof</span>
                                <label class="cm-toggle">
                                    <input type="checkbox" id="cm-audiospoof-toggle">
                                    <div class="cm-toggle-track"></div>
                                    <div class="cm-toggle-thumb"></div>
                                </label>
                            </div>
                            <div class="cm-file-picker" id="cm-audio-picker">
                                <div class="cm-file-icon"><svg viewBox="0 0 24 24"><path d="M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z"/></svg></div>
                                <span class="cm-file-name" id="cm-audio-name" data-i18n="selectAudio">Select audio file...</span>
                            </div>
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="loop">Loop</span>
                                <label class="cm-toggle">
                                    <input type="checkbox" id="cm-audioloop-toggle" checked>
                                    <div class="cm-toggle-track"></div>
                                    <div class="cm-toggle-thumb"></div>
                                </label>
                            </div>
                            <div class="cm-slider-row">
                                <div class="cm-slider-header"><span class="cm-slider-label" data-i18n="speed">Speed</span><span class="cm-slider-value" id="cm-audiospeed-val">1.0x</span></div>
                                <div class="cm-slider-track"><div class="cm-slider-fill" style="width:25%"></div><input type="range" class="cm-slider" id="cm-audiospeed" min="0.25" max="3.0" step="0.05" value="1.0"></div>
                            </div>
                            <div class="cm-slider-row">
                                <div class="cm-slider-header"><span class="cm-slider-label" data-i18n="volume">Volume</span><span class="cm-slider-value" id="cm-audiovolume-val">100%</span></div>
                                <div class="cm-slider-track"><div class="cm-slider-fill" style="width:100%"></div><input type="range" class="cm-slider" id="cm-audiovolume" min="0" max="100" step="1" value="100"></div>
                            </div>
                            <div class="cm-slider-row">
                                <div class="cm-slider-header"><span class="cm-slider-label" data-i18n="bass">Bass (dB)</span><span class="cm-slider-value" id="cm-audiobass-val">0 dB</span></div>
                                <div class="cm-slider-track"><div class="cm-slider-fill" style="width:50%"></div><input type="range" class="cm-slider" id="cm-audiobass" min="-12" max="12" step="1" value="0"></div>
                            </div>
                            <div class="cm-slider-row">
                                <div class="cm-slider-header"><span class="cm-slider-label" data-i18n="treble">Treble (dB)</span><span class="cm-slider-value" id="cm-audiotreble-val">0 dB</span></div>
                                <div class="cm-slider-track"><div class="cm-slider-fill" style="width:50%"></div><input type="range" class="cm-slider" id="cm-audiotreble" min="-12" max="12" step="1" value="0"></div>
                            </div>
                            <div class="cm-slider-row">
                                <div class="cm-slider-header"><span class="cm-slider-label" data-i18n="warmth">Warmth (dB)</span><span class="cm-slider-value" id="cm-audiowarmth-val">0 dB</span></div>
                                <div class="cm-slider-track"><div class="cm-slider-fill" style="width:50%"></div><input type="range" class="cm-slider" id="cm-audiowarmth" min="-12" max="12" step="1" value="0"></div>
                            </div>
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="status">Status</span>
                                <span class="cm-value" id="cm-audio-status">Inactive</span>
                            </div>
                        </div>
                    </div>
                    <div class="cm-section" id="cm-overlay-section" style="display:block;">
                        <div class="cm-section-title" data-i18n="overlayEffects">Overlay Effects</div>
                        <div class="cm-card">
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="banOverlay">Ban Overlay</span>
                                <label class="cm-toggle">
                                    <input type="checkbox" id="cm-ban-overlay-toggle">
                                    <div class="cm-toggle-track"></div>
                                    <div class="cm-toggle-thumb"></div>
                                </label>
                            </div>
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="loadingOverlay">Loading Overlay</span>
                                <label class="cm-toggle">
                                    <input type="checkbox" id="cm-loading-overlay-toggle">
                                    <div class="cm-toggle-track"></div>
                                    <div class="cm-toggle-thumb"></div>
                                </label>
                            </div>
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="status">Active</span>
                                <span class="cm-value" id="cm-overlay-status">None</span>
                            </div>
                        </div>
                    </div>
                </div>

                <!-- SETTINGS PANEL -->
                <div class="cm-panel" data-panel="settings">
                    <div class="cm-section">
                        <div class="cm-section-title" data-i18n="developer">Developer</div>
                        <div class="cm-card">
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="consoleLogs">Console Logs</span>
                                <label class="cm-toggle">
                                    <input type="checkbox" id="cm-debug-toggle" checked>
                                    <div class="cm-toggle-track"></div>
                                    <div class="cm-toggle-thumb"></div>
                                </label>
                            </div>
                        </div>
                    </div>
                    <div class="cm-section">
                        <div class="cm-section-title" data-i18n="hotkeys">Hotkeys</div>
                        <div class="cm-card">
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="openPanel">Open Panel</span>
                                <input type="text" class="cm-input" id="cm-menukey" value="h" style="width:50px;">
                            </div>
                        </div>
                    </div>
                    <div class="cm-section">
                        <div class="cm-section-title" data-i18n="streamProof">Stream Proof</div>
                        <div class="cm-card">
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="panicKey">Panic Key</span>
                                <input type="text" class="cm-input" id="cm-panic-key" value="p" style="width:50px;">
                            </div>
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="mobileTripleTap">Mobile: Triple-tap button</span>
                                <span class="cm-value" style="font-size:8px;color:var(--cm-text-muted);">to hide/show</span>
                            </div>
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="showControlBar">Show Control Bar</span>
                                <label class="cm-toggle">
                                    <input type="checkbox" id="cm-show-cb-toggle" ${CONFIG.showControlBar ? 'checked' : ''}>
                                    <div class="cm-toggle-track"></div>
                                    <div class="cm-toggle-thumb"></div>
                                </label>
                            </div>
                            <div class="cm-row">
                                <button class="cm-panic-btn" id="cm-panic-now" data-i18n="hideAllNow">Hide All Now</button>
                            </div>
                            <div class="cm-row" style="margin-top:6px;border-top:1px solid var(--cm-border);padding-top:6px;">
                                <span class="cm-label" data-i18n="iframeModeObs">Iframe Mode (OBS)</span>
                                <label class="cm-toggle">
                                    <input type="checkbox" id="cm-iframe-mode">
                                    <div class="cm-toggle-track"></div>
                                    <div class="cm-toggle-thumb"></div>
                                </label>
                            </div>
                            <div class="cm-row">
                                <span class="cm-label" style="font-size:8px;color:var(--cm-text-muted);" data-i18n="hidesGui">Hides GUI from screen capture</span>
                            </div>
                        </div>
                    </div>
                    <div class="cm-section">
                        <div class="cm-section-title" data-i18n="branding">Branding</div>
                        <div class="cm-card">
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="displayBadge">Display Badge</span>
                                <label class="cm-toggle">
                                    <input type="checkbox" id="cm-wm-show" checked>
                                    <div class="cm-toggle-track"></div>
                                    <div class="cm-toggle-thumb"></div>
                                </label>
                            </div>
                            <div class="cm-slider-row">
                                <div class="cm-slider-header">
                                    <span class="cm-slider-label" data-i18n="visibility">Visibility</span>
                                    <span class="cm-slider-value" id="cm-wm-alpha-val">20%</span>
                                </div>
                                <div class="cm-slider-track">
                                    <div class="cm-slider-fill" id="cm-wm-alpha-fill" style="width:20%"></div>
                                    <input type="range" class="cm-slider" id="cm-wm-alpha" min="0" max="100" step="5" value="20">
                                </div>
                            </div>
                        </div>
                    </div>
                    <div class="cm-section">
                        <div class="cm-section-title" data-i18n="appearance">Appearance</div>
                        <div class="cm-card">
                            <div class="cm-theme-grid" id="cm-theme-grid"></div>
                        </div>
                    </div>
                    <div class="cm-section">
                        <div class="cm-section-title" data-i18n="customization">Customization</div>
                        <div class="cm-card">
                            <div class="cm-row">
                                <span class="cm-label" data-i18n="accentColor">Accent Color</span>
                                <input type="color" id="cm-accent-color" value="${CONFIG.accentColor || '#6366f1'}" style="width:50px;height:30px;">
                            </div>
                            <div class="cm-row" style="margin-top:6px;">
                                <span class="cm-label" data-i18n="language">Language</span>
                                <select id="cm-language-select" class="cm-select">
                                    ${Object.entries(LANGUAGES).map(([code, lang]) => `<option value="${code}" ${code === currentLang ? 'selected' : ''}>${lang.name}</option>`).join('')}
                                </select>
                            </div>
                        </div>
                    </div>
                </div>

                <!-- CREDITS PANEL -->
                <div class="cm-panel" data-panel="credits">
                    <div class="cm-section">
                        <div class="cm-section-title" data-i18n="credits">Credits</div>
                        <div class="cm-card">
                            <div class="cm-row"><span class="cm-label" data-i18n="developers">Developers</span></div>
                            <div class="cm-row"><span class="cm-value">c6 / cosmic</span></div>
                            <div class="cm-row"><span class="cm-value">david</span></div>
                            <div class="cm-row"><span class="cm-value">a5f3</span></div>
                            <div class="cm-row"><span class="cm-value">zzemie</span></div>
                            <div class="cm-row"><span class="cm-value">4rx67</span></div>
                        </div>
                    </div>
                </div>
            </div>
        `;
        document.body.appendChild(root);

        // Language selector
        const langSelect = document.getElementById('cm-language-select');
        if (langSelect) {
            langSelect.addEventListener('change', (e) => {
                CONFIG.language = e.target.value;
                saveConfig();
                currentLang = CONFIG.language;
                applyLanguage(currentLang);
            });
        }
        applyLanguage(currentLang);

        // Color picker
        const accentPicker = document.getElementById('cm-accent-color');
        if (accentPicker) {
            accentPicker.addEventListener('input', (e) => applyAccentColor(e.target.value));
        }

        // Create hidden file inputs
        const videoFileInput = document.createElement('input');
        videoFileInput.type = 'file';
        videoFileInput.accept = 'video/mp4,video/webm,video/quicktime';
        videoFileInput.style.display = 'none';
        videoFileInput.id = 'cm-video-input';
        document.body.appendChild(videoFileInput);
        const imageFileInput = document.createElement('input');
        imageFileInput.type = 'file';
        imageFileInput.accept = 'image/jpeg,image/png,image/gif,image/webp';
        imageFileInput.style.display = 'none';
        imageFileInput.id = 'cm-image-input';
        document.body.appendChild(imageFileInput);
        const audioFileInput = document.createElement('input');
        audioFileInput.type = 'file';
        audioFileInput.accept = 'audio/mpeg,audio/wav,audio/ogg,audio/mp4';
        audioFileInput.style.display = 'none';
        audioFileInput.id = 'cm-audio-input';
        document.body.appendChild(audioFileInput);

        // Build theme grid
        const themeGrid = document.getElementById('cm-theme-grid');
        Object.entries(THEMES).forEach(([key, theme]) => {
            const tbtn = document.createElement('button');
            tbtn.className = 'cm-theme-btn' + (key === (CONFIG.theme || 'midnight') ? ' active' : '');
            tbtn.dataset.theme = key;
            tbtn.innerHTML = `<div class="cm-theme-preview" style="background: linear-gradient(135deg, ${theme.primary}, ${theme.secondary})"></div><div class="cm-theme-name">${theme.name}</div>`;
            tbtn.addEventListener('click', function() {
                themeGrid.querySelectorAll('.cm-theme-btn').forEach(b => b.classList.remove('active'));
                this.classList.add('active');
                applyTheme(key);
                applyAccentColor(CONFIG.accentColor);
            });
            themeGrid.appendChild(tbtn);
        });

        // ========== HANDLERS FOR +/- BUTTONS (Number Controls) ==========
        function setupNumberControls() {
            document.querySelectorAll('.cm-number-btn[data-dec]').forEach(btn => {
                btn.addEventListener('click', () => {
                    const inputId = btn.getAttribute('data-dec');
                    const input = document.getElementById(inputId);
                    if (input) {
                        let val = parseFloat(input.value);
                        if (isNaN(val)) val = input.min ? parseFloat(input.min) : 1;
                        let step = parseFloat(input.step) || 0.1;
                        val = Math.max(parseFloat(input.min) || 1, val - step);
                        input.value = val.toFixed(step < 1 ? 1 : 0);
                        input.dispatchEvent(new Event('input', { bubbles: true }));
                    }
                });
            });
            document.querySelectorAll('.cm-number-btn[data-inc]').forEach(btn => {
                btn.addEventListener('click', () => {
                    const inputId = btn.getAttribute('data-inc');
                    const input = document.getElementById(inputId);
                    if (input) {
                        let val = parseFloat(input.value);
                        if (isNaN(val)) val = input.min ? parseFloat(input.min) : 1;
                        let step = parseFloat(input.step) || 0.1;
                        val = Math.min(parseFloat(input.max) || 10, val + step);
                        input.value = val.toFixed(step < 1 ? 1 : 0);
                        input.dispatchEvent(new Event('input', { bubbles: true }));
                    }
                });
            });
        }
        setupNumberControls();

        // Toggle menu
        let _btnDragged = false;
        function _toggleMenu() {
            if (_btnDragged) { _btnDragged = false; return; }
            root.classList.toggle('visible');
        }
        btn.addEventListener('click', _toggleMenu);

        // Toggle button drag
        let _btnDragging = false, _btnDragOffX = 0, _btnDragOffY = 0, _btnStartX = 0, _btnStartY = 0;
        btn.addEventListener('mousedown', function(e) {
            _btnDragging = true; _btnDragged = false;
            _btnStartX = e.clientX; _btnStartY = e.clientY;
            const rect = btn.getBoundingClientRect();
            _btnDragOffX = e.clientX - rect.left; _btnDragOffY = e.clientY - rect.top;
            btn.classList.add('dragging'); e.preventDefault();
        });
        document.addEventListener('mousemove', function(e) {
            if (!_btnDragging) return;
            if (Math.abs(e.clientX - _btnStartX) > 5 || Math.abs(e.clientY - _btnStartY) > 5) _btnDragged = true;
            btn.style.left = (e.clientX - _btnDragOffX) + 'px';
            btn.style.top = (e.clientY - _btnDragOffY) + 'px';
            btn.style.right = 'auto';
        });
        document.addEventListener('mouseup', function() {
            if (_btnDragging) { _btnDragging = false; btn.classList.remove('dragging'); }
        });

        btn.addEventListener('touchstart', function(e) {
            const touch = e.touches[0];
            _btnDragging = true; _btnDragged = false;
            _btnStartX = touch.clientX; _btnStartY = touch.clientY;
            const rect = btn.getBoundingClientRect();
            _btnDragOffX = touch.clientX - rect.left; _btnDragOffY = touch.clientY - rect.top;
            btn.classList.add('dragging');
        }, { passive: true });
        document.addEventListener('touchmove', function(e) {
            if (!_btnDragging) return;
            const touch = e.touches[0];
            if (Math.abs(touch.clientX - _btnStartX) > 5 || Math.abs(touch.clientY - _btnStartY) > 5) _btnDragged = true;
            btn.style.left = (touch.clientX - _btnDragOffX) + 'px';
            btn.style.top = (touch.clientY - _btnDragOffY) + 'px';
            btn.style.right = 'auto';
        }, { passive: true });
        document.addEventListener('touchend', function() {
            if (_btnDragging) { _btnDragging = false; btn.classList.remove('dragging'); }
        });

        let _menuKey = 'KeyH';
        let _panicKey = 'KeyP';
        let _streamHidden = false;

        function toggleStreamProof() {
            _streamHidden = !_streamHidden;
            root.classList.toggle('stream-hidden', _streamHidden);
            btn.classList.toggle('stream-hidden', _streamHidden);
            controlBar.classList.toggle('stream-hidden', _streamHidden);
            log('[STREAM PROOF] ' + (_streamHidden ? 'Hidden' : 'Visible'));
        }

        document.addEventListener('keydown', function(e) {
            if (e.code === _menuKey && !e.target.matches('input[type="text"], input[type="search"], textarea')) {
                _toggleMenu();
            }
            if (e.code === _panicKey && !e.target.matches('input[type="text"], input[type="search"], textarea')) {
                toggleStreamProof();
            }
        });

        // ===== Quick control bar (top-center) wiring =====
        const _cbMap = {
            master: 'cm-enable-toggle',
            camera: 'cm-camspoof-toggle',
            audio:  'cm-audiospoof-toggle'
        };
        function _cbItem(name) { return controlBar.querySelector('.cm-cb-item[data-cb="' + name + '"]'); }
        function _cbSyncState() {
            Object.keys(_cbMap).forEach(function(name) {
                const cbx = document.getElementById(_cbMap[name]);
                const item = _cbItem(name);
                if (cbx && item) item.classList.toggle('cm-on', cbx.checked);
            });
        }
        function _cbFlash(name) {
            const item = _cbItem(name);
            if (!item) return;
            item.classList.remove('cm-flash');
            void item.offsetWidth;
            item.classList.add('cm-flash');
        }
        function _cbToggle(name) {
            const cbx = document.getElementById(_cbMap[name]);
            if (!cbx) return;
            cbx.checked = !cbx.checked;
            cbx.dispatchEvent(new Event('change', { bubbles: true }));
            _cbSyncState();
            _cbFlash(name);
        }
        controlBar.querySelectorAll('.cm-cb-item').forEach(function(item) {
            item.addEventListener('click', function() { _cbToggle(item.getAttribute('data-cb')); });
        });
        // Keep bar in sync when toggled from inside the menu
        Object.keys(_cbMap).forEach(function(name) {
            const cbx = document.getElementById(_cbMap[name]);
            if (cbx) cbx.addEventListener('change', _cbSyncState);
        });
        _cbSyncState();

        // Keyboard shortcuts: M = master, C = camera spoof, A = audio spoof
        document.addEventListener('keydown', function(e) {
            if (e.ctrlKey || e.metaKey || e.altKey) return;
            if (e.target.matches('input, textarea, select, [contenteditable="true"]')) return;
            const k = e.key.toLowerCase();
            if (k === 'm') { _cbToggle('master'); }
            else if (k === 'c') { _cbToggle('camera'); }
            else if (k === 'a') { _cbToggle('audio'); }
        });

        // ===== Control bar drag =====
        let _cbDragging = false, _cbOffX = 0, _cbOffY = 0;
        function _cbStartDrag(clientX, clientY, target) {
            if (target.closest('.cm-cb-item')) return false;
            _cbDragging = true;
            controlBar.classList.add('cm-cb-dragging');
            const rect = controlBar.getBoundingClientRect();
            // switch from translateX centering to absolute left positioning
            controlBar.style.left = rect.left + 'px';
            controlBar.style.top = rect.top + 'px';
            controlBar.style.transform = 'none';
            _cbOffX = clientX - rect.left;
            _cbOffY = clientY - rect.top;
            return true;
        }
        function _cbMoveDrag(clientX, clientY) {
            if (!_cbDragging) return;
            controlBar.style.left = (clientX - _cbOffX) + 'px';
            controlBar.style.top = (clientY - _cbOffY) + 'px';
        }
        function _cbEndDrag() {
            if (_cbDragging) { _cbDragging = false; controlBar.classList.remove('cm-cb-dragging'); }
        }
        controlBar.addEventListener('mousedown', function(e) {
            if (_cbStartDrag(e.clientX, e.clientY, e.target)) e.preventDefault();
        });
        document.addEventListener('mousemove', function(e) { _cbMoveDrag(e.clientX, e.clientY); });
        document.addEventListener('mouseup', _cbEndDrag);
        controlBar.addEventListener('touchstart', function(e) {
            const t = e.touches[0];
            _cbStartDrag(t.clientX, t.clientY, e.target);
        }, { passive: true });
        document.addEventListener('touchmove', function(e) {
            if (!_cbDragging) return;
            const t = e.touches[0];
            _cbMoveDrag(t.clientX, t.clientY);
        }, { passive: true });
        document.addEventListener('touchend', _cbEndDrag);

        // Menu drag
        let _menuDragging = false, _menuDragOffX = 0, _menuDragOffY = 0;
        const _menuHeader = root.querySelector('.cm-header');
        _menuHeader.addEventListener('mousedown', function(e) {
            if (e.target.matches('input, button, label, .cm-tab, a')) return;
            _menuDragging = true; root.classList.add('dragging');
            const rect = root.getBoundingClientRect();
            _menuDragOffX = e.clientX - rect.left; _menuDragOffY = e.clientY - rect.top;
            e.preventDefault();
        });
        document.addEventListener('mousemove', function(e) {
            if (!_menuDragging) return;
            root.style.left = (e.clientX - _menuDragOffX) + 'px';
            root.style.top = (e.clientY - _menuDragOffY) + 'px';
            root.style.right = 'auto';
        });
        document.addEventListener('mouseup', function() {
            if (_menuDragging) { _menuDragging = false; root.classList.remove('dragging'); }
        });
        _menuHeader.addEventListener('touchstart', function(e) {
            if (e.target.matches('input, button, label, .cm-tab, a')) return;
            const touch = e.touches[0];
            _menuDragging = true; root.classList.add('dragging');
            const rect = root.getBoundingClientRect();
            _menuDragOffX = touch.clientX - rect.left; _menuDragOffY = touch.clientY - rect.top;
        }, { passive: true });
        document.addEventListener('touchmove', function(e) {
            if (!_menuDragging) return;
            const touch = e.touches[0];
            root.style.left = (touch.clientX - _menuDragOffX) + 'px';
            root.style.top = (touch.clientY - _menuDragOffY) + 'px';
            root.style.right = 'auto';
        }, { passive: true });
        document.addEventListener('touchend', function() {
            if (_menuDragging) { _menuDragging = false; root.classList.remove('dragging'); }
        });

        // Tab switching
        root.querySelectorAll('.cm-tab').forEach(tab => {
            tab.addEventListener('click', function() {
                root.querySelectorAll('.cm-tab').forEach(t => t.classList.remove('active'));
                root.querySelectorAll('.cm-panel').forEach(p => p.classList.remove('active'));
                this.classList.add('active');
                root.querySelector(`[data-panel="${this.dataset.tab}"]`).classList.add('active');
            });
        });

        function updateSliderFill(slider, fill, min, max) {
            const pct = ((slider.value - min) / (max - min)) * 100;
            fill.style.width = pct + '%';
        }

        // Enable toggle
        document.getElementById('cm-enable-toggle').addEventListener('change', function() {
            CONFIG.enabled = this.checked;
            document.getElementById('cm-enabled-val').textContent = this.checked ? LANGUAGES[currentLang].active : LANGUAGES[currentLang].inactive;
            document.getElementById('cm-enabled-val').style.color = this.checked ? 'var(--cm-success)' : 'var(--cm-danger)';
            document.getElementById('cm-status-pill').textContent = this.checked ? LANGUAGES[currentLang].active : LANGUAGES[currentLang].inactive;
            document.getElementById('cm-status-pill').classList.toggle('active', this.checked);
        });

        document.getElementById('cm-score-enabled').addEventListener('change', function() {
            CONFIG.scoreEnabled = this.checked;
            document.getElementById('cm-score-content').classList.toggle('cm-section-disabled', !this.checked);
            saveConfig();
        });
        document.getElementById('cm-result-enabled').addEventListener('change', function() {
            CONFIG.resultEnabled = this.checked;
            document.getElementById('cm-result-content').classList.toggle('cm-section-disabled', !this.checked);
            saveConfig();
        });

        // Auto Queue
        let _autoQueueInterval = null;
        let _connectingStart = null;
        function _clearCookies() {
            const saved = localStorage.getItem('cheatmoggle _config');
            document.cookie.split(';').forEach(c => {
                const name = c.split('=')[0].trim();
                document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
            });
            localStorage.clear();
            if (saved) localStorage.setItem('cheatmoggle _config', saved);
        }

        document.getElementById('cm-clearcookies-btn').addEventListener('click', function() {
            _clearCookies();
            this.textContent = 'Cleared! Reloading...';
            setTimeout(() => location.reload(), 500);
        });

        function _queueTick() {
            try {
                const _txt = b => b.textContent.replace(/\s+/g, ' ').trim();
                const _up = b => _txt(b).toUpperCase();

                // Suspended check
                if (document.body.textContent.includes('Ranked Arena is temporarily suspended for this account')) {
                    if (document.getElementById('cm-autounban-toggle')?.checked) {
                        _clearCookies();
                        setTimeout(() => location.reload(), 300);
                    }
                    document.getElementById('cm-autoqueuetoggle').checked = false;
                    clearInterval(_autoQueueInterval);
                    _autoQueueInterval = null;
                    _connectingStart = null;
                    return;
                }

                // Connecting timeout check
                const btns = Array.from(document.querySelectorAll('button, [role="button"], [onclick]'));
                const connecting = btns.find(b => /connecting/i.test(_txt(b))) || document.querySelector('[class*="connecting"], [class*="loading"]');
                if (connecting) {
                    if (_connectingStart === null) _connectingStart = Date.now();
                    else if (Date.now() - _connectingStart > 17000) {
                        const backBtn = btns.find(b => /leave|cancel|disconnect|return/i.test(_txt(b)));
                        if (backBtn) backBtn.click();
                        _connectingStart = null;
                    }
                    return;
                } else {
                    _connectingStart = null;
                }

                // ARENA — find button by aria-label
                const arenaEl = document.querySelector('button[aria-label="Find an Arena match"]');
                if (arenaEl) {
                    log(`[AUTOQ] clicking ARENA button`);
                    arenaEl.click();
                    return;
                }

                // Find new match button (after match ends)
                if (document.getElementById('cm-autofindnew-toggle')?.checked) {
                    const findNewBtn = btns.find(b => {
                        const t = _up(b);
                        return t.includes('FIND NEW') && t.includes('MATCH');
                    });
                    if (findNewBtn) {
                        log(`[AUTOQ] clicking find new match: "${_txt(findNewBtn).substring(0, 60)}"`);
                        findNewBtn.click();
                        return;
                    }
                }
            } catch(e) {
                log('[AUTOQ] tick error:', e);
            }
        }
        function _startAutoQueue() {
            _connectingStart = null;
            if (_autoQueueInterval) clearInterval(_autoQueueInterval);
            const delay = Math.max(100, parseInt(CONFIG.queueDelay) || 1000);
            _autoQueueInterval = setInterval(_queueTick, delay);
        }
        document.getElementById('cm-autoqueuetoggle').addEventListener('change', function() {
            CONFIG.autoQueue = this.checked;
            saveConfig();
            if (this.checked) {
                _startAutoQueue();
            } else {
                if (_autoQueueInterval) {
                    clearInterval(_autoQueueInterval);
                    _autoQueueInterval = null;
                }
                _connectingStart = null;
            }
        });

        // Request delay (ms)
        const queueDelayInput = document.getElementById('cm-queue-delay');
        queueDelayInput.value = CONFIG.queueDelay;
        queueDelayInput.addEventListener('input', function() {
            let v = parseInt(this.value);
            if (isNaN(v)) v = 1000;
            v = Math.max(100, Math.min(60000, v));
            CONFIG.queueDelay = v;
            saveConfig();
            if (_autoQueueInterval) _startAutoQueue();
        });

        // ===== Auto cycle spoofing =====
        let _autoCamInterval = null, _autoAudioInterval = null;
        function _toggleCheckbox(id) {
            const cbx = document.getElementById(id);
            if (!cbx) return;
            cbx.checked = !cbx.checked;
            cbx.dispatchEvent(new Event('change', { bubbles: true }));
        }
        const autoCamIntervalInput = document.getElementById('cm-autocam-interval');
        autoCamIntervalInput.value = CONFIG.autoCamInterval;
        const autoAudioIntervalInput = document.getElementById('cm-autoaudio-interval');
        autoAudioIntervalInput.value = CONFIG.autoAudioInterval;

        function _startAutoCam() {
            if (_autoCamInterval) clearInterval(_autoCamInterval);
            const secs = Math.max(1, parseInt(CONFIG.autoCamInterval) || 5);
            _autoCamInterval = setInterval(() => _toggleCheckbox('cm-camspoof-toggle'), secs * 1000);
        }
        function _startAutoAudio() {
            if (_autoAudioInterval) clearInterval(_autoAudioInterval);
            const secs = Math.max(1, parseInt(CONFIG.autoAudioInterval) || 5);
            _autoAudioInterval = setInterval(() => _toggleCheckbox('cm-audiospoof-toggle'), secs * 1000);
        }
        document.getElementById('cm-autocam-toggle').addEventListener('change', function() {
            if (this.checked) _startAutoCam();
            else if (_autoCamInterval) { clearInterval(_autoCamInterval); _autoCamInterval = null; }
        });
        document.getElementById('cm-autoaudio-toggle').addEventListener('change', function() {
            if (this.checked) _startAutoAudio();
            else if (_autoAudioInterval) { clearInterval(_autoAudioInterval); _autoAudioInterval = null; }
        });
        autoCamIntervalInput.addEventListener('input', function() {
            let v = parseInt(this.value); if (isNaN(v)) v = 5;
            v = Math.max(1, Math.min(600, v));
            CONFIG.autoCamInterval = v; saveConfig();
            if (_autoCamInterval) _startAutoCam();
        });
        autoAudioIntervalInput.addEventListener('input', function() {
            let v = parseInt(this.value); if (isNaN(v)) v = 5;
            v = Math.max(1, Math.min(600, v));
            CONFIG.autoAudioInterval = v; saveConfig();
            if (_autoAudioInterval) _startAutoAudio();
        });

        // ===== Auto dismiss popups =====
        let _autoDismissInterval = null;
        document.getElementById('cm-autodismiss-toggle').addEventListener('change', function() {
            if (this.checked) {
                _autoDismissInterval = setInterval(() => {
                    const btn = Array.from(document.querySelectorAll('button')).find(b => {
                        const t = b.textContent.trim();
                        return t === 'OK' || t === 'Okay' || t === 'Got it' || t === 'Continue' || t === 'Close' || t === 'Dismiss';
                    });
                    if (btn) btn.click();
                }, 1500);
            } else if (_autoDismissInterval) {
                clearInterval(_autoDismissInterval); _autoDismissInterval = null;
            }
        });

        function setScoreModeUI(mode) {
            CONFIG.scoreMode = mode;
            document.querySelectorAll('[data-smode]').forEach(b => b.classList.toggle('active', b.dataset.smode === mode));
            document.getElementById('cm-score-fixed').style.display = mode === 'fixed' ? 'block' : 'none';
            document.getElementById('cm-score-range').style.display = mode === 'range' ? 'block' : 'none';
            _dynamicCap = null;
            saveConfig();
        }
        document.querySelectorAll('[data-smode]').forEach(b => {
            b.addEventListener('click', function() { setScoreModeUI(this.dataset.smode); });
        });

        const fixedScoreInput = document.getElementById('cm-fixed-score');
        fixedScoreInput.addEventListener('input', function() {
            let val = parseFloat(this.value);
            if (isNaN(val)) val = 1;
            val = Math.max(1, Math.min(10, val));
            CONFIG.fixedScore = Math.round(val * 10000);
            saveConfig();
        });

        const scoreMinInput = document.getElementById('cm-score-min');
        scoreMinInput.addEventListener('input', function() {
            let val = parseFloat(this.value);
            if (isNaN(val)) val = 1;
            val = Math.max(1, Math.min(10, val));
            CONFIG.scoreRangeMin = Math.round(val * 10000);
            _dynamicCap = null; saveConfig();
        });
        const scoreMaxInput = document.getElementById('cm-score-max');
        scoreMaxInput.addEventListener('input', function() {
            let val = parseFloat(this.value);
            if (isNaN(val)) val = 1;
            val = Math.max(1, Math.min(10, val));
            CONFIG.scoreRangeMax = Math.round(val * 10000);
            _dynamicCap = null; saveConfig();
        });

        const finalInput = document.getElementById('cm-final-score');
        finalInput.addEventListener('input', function() {
            let val = parseFloat(this.value);
            if (isNaN(val)) val = 1;
            val = Math.max(1, Math.min(10, val));
            CONFIG.myFinalScore = String(Math.round(val * 10000));
            updateScorePreview(); saveConfig();
        });

        function setFinalModeUI(mode) {
            CONFIG.finalScoreMode = mode;
            document.querySelectorAll('[data-fmode]').forEach(b => b.classList.toggle('active', b.dataset.fmode === mode));
            document.getElementById('cm-final-fixed').style.display = mode === 'fixed' ? 'block' : 'none';
            document.getElementById('cm-final-range').style.display = mode === 'range' ? 'block' : 'none';
            updateScorePreview(); saveConfig();
        }
        document.querySelectorAll('[data-fmode]').forEach(b => {
            b.addEventListener('click', function() { setFinalModeUI(this.dataset.fmode); });
        });

        const finalMinInput = document.getElementById('cm-final-range-min');
        finalMinInput.addEventListener('input', function() {
            let val = parseFloat(this.value);
            if (isNaN(val)) val = 1;
            val = Math.max(1, Math.min(10, val));
            CONFIG.finalScoreRangeMin = Math.round(val * 10000);
            updateScorePreview(); saveConfig();
        });
        const finalMaxInput = document.getElementById('cm-final-range-max');
        finalMaxInput.addEventListener('input', function() {
            let val = parseFloat(this.value);
            if (isNaN(val)) val = 1;
            val = Math.max(1, Math.min(10, val));
            CONFIG.finalScoreRangeMax = Math.round(val * 10000);
            updateScorePreview(); saveConfig();
        });

        function updateScorePreview() {
            let score;
            if (CONFIG.finalScoreMode === 'range') {
                score = Math.round(CONFIG.finalScoreRangeMin + Math.random() * (CONFIG.finalScoreRangeMax - CONFIG.finalScoreRangeMin)) / 10000;
            } else {
                score = parseInt(CONFIG.myFinalScore) / 10000;
            }
            const tier = getTierForScore(score);
            const numEl = document.getElementById('cm-score-preview-num');
            const tierEl = document.getElementById('cm-score-preview-tier');
            numEl.textContent = score.toFixed(1);
            numEl.style.color = tier.hexColor;
            numEl.style.textShadow = tier.textShadow;
            tierEl.textContent = `${tier.emoji} ${tier.name}`;
            tierEl.style.color = tier.hexColor;
        }
        updateScorePreview();
        setInterval(() => { if (CONFIG.finalScoreMode === 'range') updateScorePreview(); }, 2000);

        function restoreUIFromConfig() {
            document.getElementById('cm-score-enabled').checked = CONFIG.scoreEnabled;
            document.getElementById('cm-score-content').classList.toggle('cm-section-disabled', !CONFIG.scoreEnabled);
            document.getElementById('cm-result-enabled').checked = CONFIG.resultEnabled;
            document.getElementById('cm-result-content').classList.toggle('cm-section-disabled', !CONFIG.resultEnabled);
            setScoreModeUI(CONFIG.scoreMode);
            document.getElementById('cm-fixed-score').value = (CONFIG.fixedScore / 10000).toFixed(1);
            document.getElementById('cm-score-min').value = (CONFIG.scoreRangeMin / 10000).toFixed(1);
            document.getElementById('cm-score-max').value = (CONFIG.scoreRangeMax / 10000).toFixed(1);
            setFinalModeUI(CONFIG.finalScoreMode);
            document.getElementById('cm-final-score').value = (parseInt(CONFIG.myFinalScore) / 10000).toFixed(1);
            document.getElementById('cm-final-range-min').value = (CONFIG.finalScoreRangeMin / 10000).toFixed(1);
            document.getElementById('cm-final-range-max').value = (CONFIG.finalScoreRangeMax / 10000).toFixed(1);
            const cbToggle = document.getElementById('cm-show-cb-toggle');
            if (cbToggle) {
                cbToggle.checked = CONFIG.showControlBar !== false;
                controlBar.classList.toggle('cm-cb-hidden', !CONFIG.showControlBar);
            }
            const aqToggle = document.getElementById('cm-autoqueuetoggle');
            if (aqToggle) {
                aqToggle.checked = CONFIG.autoQueue === true;
                if (aqToggle.checked) _startAutoQueue();
            }
            if (CONFIG.theme && THEMES[CONFIG.theme]) applyTheme(CONFIG.theme);
            if (CONFIG.accentColor) applyAccentColor(CONFIG.accentColor);
        }
        restoreUIFromConfig();

        // Menu keybind
        const menuKeyInput = document.getElementById('cm-menukey');
        let _menuKeyListening = false;
        menuKeyInput.addEventListener('focus', function() {
            _menuKeyListening = true; this.value = 'press';
            this.style.borderColor = 'var(--cm-primary)';
        });
        menuKeyInput.addEventListener('keydown', function(e) {
            if (!_menuKeyListening) return;
            e.preventDefault();
            _menuKey = e.code;
            this.value = e.key === ' ' ? 'Space' : e.key;
            this.style.borderColor = 'var(--cm-success)';
            _menuKeyListening = false; this.blur();
        });

        // Panic keybind
        const panicKeyInput = document.getElementById('cm-panic-key');
        let _panicKeyListening = false;
        panicKeyInput.addEventListener('focus', function() {
            _panicKeyListening = true; this.value = 'press';
            this.style.borderColor = 'var(--cm-primary)';
        });
        panicKeyInput.addEventListener('keydown', function(e) {
            if (!_panicKeyListening) return;
            e.preventDefault();
            _panicKey = e.code;
            this.value = e.key === ' ' ? 'Space' : e.key;
            this.style.borderColor = 'var(--cm-success)';
            _panicKeyListening = false; this.blur();
        });

        document.getElementById('cm-panic-now').addEventListener('click', toggleStreamProof);

        document.getElementById('cm-show-cb-toggle').addEventListener('change', function() {
            CONFIG.showControlBar = this.checked;
            controlBar.classList.toggle('cm-cb-hidden', !this.checked);
            saveConfig();
        });

        // Mobile triple-tap
        let _tripleTapCount = 0, _tripleTapTimer = null;
        btn.addEventListener('touchend', function(e) {
            if (_btnDragged) return;
            _tripleTapCount++;
            if (_tripleTapCount === 1) {
                _tripleTapTimer = setTimeout(() => { _tripleTapCount = 0; }, 500);
            }
            if (_tripleTapCount === 3) {
                clearTimeout(_tripleTapTimer); _tripleTapCount = 0;
                toggleStreamProof(); e.preventDefault();
            }
        });

        // Iframe mode
        let _iframeMode = false, _iframeWrapper = null;

        function enableIframeMode() {
            if (_iframeWrapper) return;
            _iframeWrapper = document.createElement('div');
            _iframeWrapper.id = 'cm-iframe-wrapper';
            _iframeWrapper.style.cssText = 'position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:999996;';
            const iframe = document.createElement('iframe');
            iframe.id = 'cm-stream-iframe';
            iframe.style.cssText = 'position:fixed;top:0;left:0;width:100%;height:100%;border:none;background:transparent;pointer-events:none;';
            iframe.setAttribute('allowtransparency', 'true');
            _iframeWrapper.appendChild(iframe);
            document.body.appendChild(_iframeWrapper);
            setTimeout(() => {
                try {
                    const iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
                    iframeDoc.open();
                    iframeDoc.write('<!DOCTYPE html><html><head><style>body{margin:0;background:transparent;overflow:hidden;}</style></head><body></body></html>');
                    iframeDoc.close();
                    const styles = document.createElement('style');
                    styles.textContent = Array.from(document.styleSheets).map(sheet => {
                        try { return Array.from(sheet.cssRules).map(r => r.cssText).join('\n'); } catch(e) { return ''; }
                    }).join('\n');
                    iframeDoc.head.appendChild(styles);
                    btn.style.pointerEvents = 'auto';
                    root.style.pointerEvents = 'auto';
                    iframeDoc.body.appendChild(btn);
                    iframeDoc.body.appendChild(root);
                    iframe.style.pointerEvents = 'auto';
                    iframeDoc.addEventListener('keydown', function(e) {
                        if (e.code === _menuKey) _toggleMenu();
                        if (e.code === _panicKey) toggleStreamProof();
                    });
                    log('[IFRAME MODE] Enabled');
                } catch(err) {
                    log('[IFRAME MODE] Error:', err);
                    disableIframeMode();
                }
            }, 100);
        }

        function disableIframeMode() {
            if (!_iframeWrapper) return;
            try {
                const iframe = document.getElementById('cm-stream-iframe');
                if (iframe) {
                    const iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
                    if (iframeDoc.body.contains(btn)) document.body.appendChild(btn);
                    if (iframeDoc.body.contains(root)) document.body.appendChild(root);
                }
            } catch(e) {}
            btn.style.position = ''; btn.style.top = ''; btn.style.left = ''; btn.style.right = '';
            root.style.position = ''; root.style.top = ''; root.style.left = ''; root.style.right = '';
            _iframeWrapper.remove(); _iframeWrapper = null;
            log('[IFRAME MODE] Disabled');
        }

        document.getElementById('cm-iframe-mode').addEventListener('change', function() {
            _iframeMode = this.checked;
            if (_iframeMode) enableIframeMode(); else disableIframeMode();
        });

        document.getElementById('cm-debug-toggle').addEventListener('change', function() {
            CONFIG.debug = this.checked;
        });

        // Watermark
        const _wm = document.createElement('div');
        _wm.id = 'cm-watermark';
        _wm.textContent = 'by cheatmoggle v13.6.2';
        document.body.appendChild(_wm);

        // Disclaimer popup
        const _disclaimer = document.createElement('div');
        _disclaimer.id = 'cm-disclaimer';
        _disclaimer.innerHTML = `
            <span>⚠️ This script only works for ranked mode</span>
            <button id="cm-disclaimer-close">
                <svg viewBox="0 0 24 24" fill="currentColor"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
            </button>
        `;
        document.body.appendChild(_disclaimer);
        document.getElementById('cm-disclaimer-close').addEventListener('click', function() {
            _disclaimer.classList.add('hiding');
            setTimeout(() => _disclaimer.remove(), 300);
        });

        function applyWmStyle() { _wm.style.opacity = CONFIG.wmAlpha / 100; }
        applyWmStyle();

        document.getElementById('cm-wm-show').addEventListener('change', function() {
            _wm.style.display = this.checked ? 'block' : 'none';
        });
        const wmAlphaSlider = document.getElementById('cm-wm-alpha');
        const wmAlphaFill = document.getElementById('cm-wm-alpha-fill');
        wmAlphaSlider.addEventListener('input', function() {
            CONFIG.wmAlpha = parseInt(this.value);
            document.getElementById('cm-wm-alpha-val').textContent = this.value + '%';
            updateSliderFill(this, wmAlphaFill, 0, 100);
            applyWmStyle();
        });

        // Watermark drag
        let _wmDragging = false, _wmDragOffX = 0, _wmDragOffY = 0;
        _wm.addEventListener('mousedown', function(e) {
            _wmDragging = true;
            _wmDragOffX = e.clientX - _wm.getBoundingClientRect().left;
            _wmDragOffY = e.clientY - _wm.getBoundingClientRect().top;
            _wm.style.cursor = 'grabbing'; e.preventDefault();
        });
        document.addEventListener('mousemove', function(e) {
            if (!_wmDragging) return;
            _wm.style.left = (e.clientX - _wmDragOffX) + 'px';
            _wm.style.top = (e.clientY - _wmDragOffY) + 'px';
            _wm.style.bottom = 'auto'; _wm.style.right = 'auto';
        });
        document.addEventListener('mouseup', function() {
            if (_wmDragging) { _wmDragging = false; _wm.style.cursor = 'grab'; }
        });

        // Live status updater
        setInterval(() => {
            try {
                const _modePill = document.getElementById('cm-mode-pill');
                const _modeVal = document.getElementById('cm-mode-val');
                if (_modePill) _modePill.textContent = _isRanked ? 'RANKED' : 'NORMAL';
                if (_modeVal) _modeVal.textContent = _isRanked ? 'RANKED' : 'NORMAL';
                if (_lastSpoofedScore !== null) {
                    const tier = getTierForScore(_lastSpoofedScore);
                    const liveScore = document.getElementById('cm-live-score');
                    const liveTier = document.getElementById('cm-live-tier');
                    if (liveScore) {
                        liveScore.textContent = _lastSpoofedScore.toFixed(2);
                        liveScore.style.color = tier.hexColor;
                        liveScore.style.textShadow = tier.textShadow;
                    }
                    if (liveTier) {
                        liveTier.textContent = `${tier.emoji} ${tier.name}`;
                        liveTier.style.color = tier.hexColor;
                    }
                }
            } catch(e) {}
        }, 200);

        // ==================== CAMERA SPOOF LOGIC ====================
        let _camSrcType = 'video';
        let _camVideoFile = null;
        let _camImageFile = null;
        let _camMirror = false;
        let _camLoop = true;
        let _camSpeed = 1.0;
        let _camVideoEl = null;
        let _camCanvasEl = null;
        let _origAddTrack = null;
        let _camSrcObjPatch = null;
        let _camDrawRAF = null;
        let _camImageEl = null;
        let _camVideoUrl = null;
        let _camImageUrl = null;

        // Camera text overlay settings
        let _camTextEnabled = false;
        let _camTextContent = 'Your Text Here';
        let _camTextColor = '#ffffff';
        let _camTextSize = 24;

        window._mogPCs = window._mogPCs || [];
        const _OrigPC2 = window.RTCPeerConnection;
        window.RTCPeerConnection = function(...args) {
            const pc = new _OrigPC2(...args);
            window._mogPCs.push(pc);
            pc.addEventListener('connectionstatechange', () => {
                if (pc.connectionState === 'closed') {
                    const idx = window._mogPCs.indexOf(pc);
                    if (idx > -1) window._mogPCs.splice(idx, 1);
                }
            });
            return pc;
        };
        Object.setPrototypeOf(window.RTCPeerConnection, _OrigPC2);
        window.RTCPeerConnection.prototype = _OrigPC2.prototype;

        // File history storage - disabled (removed URL and history)
        // No history arrays, no addToHistory, no updateHistorySelect

        // Source selection
        document.querySelectorAll('[data-src]').forEach(b => {
            b.addEventListener('click', function() {
                _camSrcType = this.dataset.src;
                document.querySelectorAll('[data-src]').forEach(x => x.classList.toggle('active', x.dataset.src === _camSrcType));
                const videoPicker = document.getElementById('cm-video-picker');
                const imagePicker = document.getElementById('cm-image-picker');
                if (videoPicker) videoPicker.style.display = _camSrcType === 'video' ? 'flex' : 'none';
                if (imagePicker) imagePicker.style.display = _camSrcType === 'image' ? 'flex' : 'none';
                if (_camSpoofActive) {
                    stopCamSpoof();
                    startCamSpoof();
                }
            });
        });

        // File picker handlers
        videoFileInput.addEventListener('change', function(e) {
            if (this.files.length) {
                _camVideoFile = this.files[0];
                _camVideoUrl = null;
                document.getElementById('cm-video-name').textContent = this.files[0].name;
                document.getElementById('cm-video-name').classList.add('selected');
                if (_camSpoofActive) {
                    stopCamSpoof();
                    startCamSpoof();
                }
            }
        });

        imageFileInput.addEventListener('change', function(e) {
            if (this.files.length) {
                _camImageFile = this.files[0];
                _camImageUrl = null;
                document.getElementById('cm-image-name').textContent = this.files[0].name;
                document.getElementById('cm-image-name').classList.add('selected');
                if (_camSpoofActive) {
                    stopCamSpoof();
                    startCamSpoof();
                }
            }
        });

        audioFileInput.addEventListener('change', function(e) {
            if (this.files.length) {
                _audioFile = this.files[0];
                _audioUrl = null;
                document.getElementById('cm-audio-name').textContent = this.files[0].name;
                document.getElementById('cm-audio-name').classList.add('selected');
                if (_audioSpoofActive) {
                    stopAudioSpoof();
                    startAudioSpoof();
                }
            }
        });

        document.getElementById('cm-video-picker').addEventListener('click', () => videoFileInput.click());
        document.getElementById('cm-image-picker').addEventListener('click', () => imageFileInput.click());
        document.getElementById('cm-audio-picker').addEventListener('click', () => audioFileInput.click());

        document.getElementById('cm-camloop-toggle').addEventListener('change', function() {
            _camLoop = this.checked;
            if (_camVideoEl) _camVideoEl.loop = _camLoop;
        });
        const camSpeedSlider = document.getElementById('cm-camspeed');
        const camSpeedFill = document.getElementById('cm-camspeed-fill');
        camSpeedSlider.addEventListener('input', function() {
            _camSpeed = parseFloat(this.value);
            document.getElementById('cm-camspeed-val').textContent = _camSpeed.toFixed(2) + 'x';
            updateSliderFill(this, camSpeedFill, 0.25, 3.0);
            if (_camVideoEl) _camVideoEl.playbackRate = _camSpeed;
        });
        document.getElementById('cm-cammirror-toggle').addEventListener('change', function() { _camMirror = this.checked; });

        // Camera text overlay handlers
        document.getElementById('cm-camtext-toggle').addEventListener('change', function() {
            _camTextEnabled = this.checked;
            if (_camTextEnabled && !_camSpoofActive) {
                startRealCamWithText();
            } else if (!_camTextEnabled && !_camSpoofActive) {
                stopRealCamText();
            }
        });
        document.getElementById('cm-camtext-content').addEventListener('input', function() {
            _camTextContent = this.value;
        });
        document.getElementById('cm-camtext-color').addEventListener('input', function() {
            _camTextColor = this.value;
        });
        const camTextSizeSlider = document.getElementById('cm-camtext-size');
        const camTextSizeFill = document.getElementById('cm-camtext-size-fill');
        camTextSizeSlider.addEventListener('input', function() {
            _camTextSize = parseInt(this.value);
            document.getElementById('cm-camtext-size-val').textContent = _camTextSize + 'px';
            updateSliderFill(this, camTextSizeFill, 12, 72);
        });

        // Real cam + text overlay (no spoof needed)
        let _realCamStream = null;
        let _realCamCanvas = null;
        let _realCamVideoEl = null;
        let _realCamRAF = null;

        function startRealCamWithText() {
            if (_realCamRAF) stopRealCamText();
            _trueOriginalGetUserMedia({ video: true }).then(stream => {
                _realCamStream = stream;
                _realCamVideoEl = document.createElement('video');
                _realCamVideoEl.srcObject = stream;
                _realCamVideoEl.muted = true;
                _realCamVideoEl.playsInline = true;
                _realCamVideoEl.play().catch(() => {});

                _realCamCanvas = document.createElement('canvas');
                _realCamCanvas.width = 640;
                _realCamCanvas.height = 480;
                const ctx = _realCamCanvas.getContext('2d');

                function drawLoop() {
                    if (!_camTextEnabled || _camSpoofActive) { _realCamRAF = null; return; }
                    ctx.clearRect(0, 0, 640, 480);
                    if (_realCamVideoEl.readyState >= 2) {
                        ctx.drawImage(_realCamVideoEl, 0, 0, 640, 480);
                    }
                    if (_camTextContent) {
                        ctx.save();
                        ctx.font = 'bold ' + _camTextSize + 'px Arial, sans-serif';
                        ctx.textAlign = 'center';
                        ctx.textBaseline = 'bottom';
                        ctx.fillStyle = 'rgba(0,0,0,0.6)';
                        ctx.fillText(_camTextContent, 322, 472);
                        ctx.fillStyle = _camTextColor;
                        ctx.shadowColor = 'rgba(0,0,0,0.9)';
                        ctx.shadowBlur = 8;
                        ctx.shadowOffsetX = 2;
                        ctx.shadowOffsetY = 2;
                        ctx.fillText(_camTextContent, 320, 470);
                        ctx.restore();
                    }
                    _realCamRAF = requestAnimationFrame(drawLoop);
                }
                drawLoop();

                const canvasStream = _realCamCanvas.captureStream(30);
                const fakeTrack = canvasStream.getVideoTracks()[0];
                if (fakeTrack && window._mogPCs) {
                    for (const pc of window._mogPCs) {
                        try {
                            pc.getSenders().forEach(sender => {
                                if (sender.track?.kind === 'video') sender.replaceTrack(fakeTrack).catch(() => {});
                            });
                        } catch(e) {}
                    }
                }
                const scannerVid = document.querySelector('video.scanner-video');
                if (scannerVid) scannerVid.srcObject = canvasStream;
                log('[CAM TEXT] Real cam text overlay started');
            }).catch(e => log('[CAM TEXT] Error getting real cam:', e));
        }

        function stopRealCamText() {
            if (_realCamRAF) { cancelAnimationFrame(_realCamRAF); _realCamRAF = null; }
            if (_realCamVideoEl) { _realCamVideoEl.srcObject = null; _realCamVideoEl = null; }
            if (_realCamStream) { _realCamStream.getTracks().forEach(t => t.stop()); _realCamStream = null; }
            _realCamCanvas = null;
            _trueOriginalGetUserMedia({ video: true }).then(stream => {
                const scannerVid = document.querySelector('video.scanner-video');
                if (scannerVid) scannerVid.srcObject = stream;
                if (window._mogPCs) {
                    for (const pc of window._mogPCs) {
                        try {
                            pc.getSenders().forEach(sender => {
                                if (sender.track?.kind === 'video') sender.replaceTrack(stream.getVideoTracks()[0]).catch(() => {});
                            });
                        } catch(e) {}
                    }
                }
            }).catch(() => {});
            log('[CAM TEXT] Real cam text overlay stopped');
        }

        function buildFakeStream() {
            if (_camDrawRAF) cancelAnimationFrame(_camDrawRAF);
            if (_camVideoEl) { _camVideoEl.pause(); _camVideoEl.src = ''; }
            _camCanvasEl = document.createElement('canvas');
            _camCanvasEl.width = 640; _camCanvasEl.height = 480;
            const ctx = _camCanvasEl.getContext('2d');

            function drawLoop() {
                if (!_camSpoofActive) { _camDrawRAF = null; return; }
                ctx.fillStyle = '#000';
                ctx.fillRect(0, 0, 640, 480);
                ctx.save();
                if (_camMirror) { ctx.translate(640, 0); ctx.scale(-1, 1); }
                if (_camSrcType === 'video' && _camVideoEl && _camVideoEl.readyState >= 2) {
                    ctx.drawImage(_camVideoEl, 0, 0, 640, 480);
                } else if (_camSrcType === 'image' && _camImageEl && _camImageEl.complete && _camImageEl.naturalWidth > 0) {
                    ctx.drawImage(_camImageEl, 0, 0, 640, 480);
                }
                ctx.restore();
                ctx.shadowBlur = 0;
                ctx.shadowOffsetX = 0;
                ctx.shadowOffsetY = 0;
                if (_camTextEnabled && _camTextContent) {
                    ctx.save();
                    ctx.font = 'bold ' + _camTextSize + 'px Arial, sans-serif';
                    ctx.fillStyle = 'rgba(0,0,0,0.6)';
                    ctx.textAlign = 'center';
                    ctx.textBaseline = 'bottom';
                    ctx.fillText(_camTextContent, 322, 472);
                    ctx.fillStyle = _camTextColor;
                    ctx.shadowColor = 'rgba(0,0,0,0.9)';
                    ctx.shadowBlur = 8;
                    ctx.shadowOffsetX = 2;
                    ctx.shadowOffsetY = 2;
                    ctx.fillText(_camTextContent, 320, 470);
                    ctx.restore();
                }
                _camDrawRAF = requestAnimationFrame(drawLoop);
            }

            if (_camSrcType === 'video' && (_camVideoFile || _camVideoUrl)) {
                _camVideoEl = document.createElement('video');
                _camVideoEl.src = _camVideoFile ? URL.createObjectURL(_camVideoFile) : _camVideoUrl;
                _camVideoEl.loop = _camLoop;
                _camVideoEl.muted = true;
                _camVideoEl.playsInline = true;
                _camVideoEl.crossOrigin = 'anonymous';
                _camVideoEl.playbackRate = _camSpeed;
                _camVideoEl.play().catch(() => {});
                drawLoop();
            } else if (_camSrcType === 'image' && (_camImageFile || _camImageUrl)) {
                _camImageEl = new Image();
                if (_camImageUrl && !_camImageUrl.startsWith('blob:')) _camImageEl.crossOrigin = 'anonymous';
                _camImageEl.src = _camImageFile ? URL.createObjectURL(_camImageFile) : _camImageUrl;
                _camImageEl.onload = () => { if (!_camDrawRAF) drawLoop(); };
                drawLoop();
            } else {
                log('[CAM] No source selected');
                return null;
            }

            return _camCanvasEl.captureStream(30);
        }

        function startCamSpoof() {
            const fakeStream = buildFakeStream();
            if (!fakeStream) return;
            _camStream = fakeStream;

            const _srcObjDesc = Object.getOwnPropertyDescriptor(HTMLMediaElement.prototype, 'srcObject');
            if (!_camSrcObjPatch) {
                _camSrcObjPatch = function(stream) {
                    if (this.classList?.contains('scanner-video') && stream && _camSpoofActive && _camStream) {
                        _srcObjDesc.set.call(this, _camStream); return;
                    }
                    _srcObjDesc.set.call(this, stream);
                };
                Object.defineProperty(HTMLMediaElement.prototype, 'srcObject', {
                    get() { return _srcObjDesc.get.call(this); },
                    set: _camSrcObjPatch,
                    configurable: true
                });
            }

            const scannerVid = document.querySelector('video.scanner-video');
            if (scannerVid) scannerVid.srcObject = _camStream;

            if (!_origAddTrack) {
                _origAddTrack = RTCPeerConnection.prototype.addTrack;
                RTCPeerConnection.prototype.addTrack = function(track, ...streams) {
                    if (track.kind === 'video' && _camSpoofActive && _camStream) {
                        const fakeTrack = _camStream.getVideoTracks()[0];
                        if (fakeTrack) return _origAddTrack.call(this, fakeTrack, ...streams);
                    }
                    return _origAddTrack.call(this, track, ...streams);
                };
            }

            try {
                const fakeTrack = _camStream.getVideoTracks()[0];
                if (fakeTrack && window._mogPCs) {
                    for (const pc of window._mogPCs) {
                        pc.getSenders().forEach(sender => {
                            if (sender.track?.kind === 'video') sender.replaceTrack(fakeTrack).catch(() => {});
                        });
                    }
                }
            } catch(e) {}
        }

        function stopCamSpoof() {
            if (_camDrawRAF) { cancelAnimationFrame(_camDrawRAF); _camDrawRAF = null; }
            if (_camVideoEl) { _camVideoEl.pause(); _camVideoEl.src = ''; _camVideoEl = null; }
            if (_camImageEl) _camImageEl = null;
            if (_camStream) { _camStream.getTracks().forEach(t => t.stop()); _camStream = null; }
            _trueOriginalGetUserMedia({ video: true }).then(realStream => {
                const realTrack = realStream.getVideoTracks()[0];
                const scannerVid = document.querySelector('video.scanner-video');
                if (scannerVid) scannerVid.srcObject = realStream;
                if (realTrack && window._mogPCs) {
                    for (const pc of window._mogPCs) {
                        pc.getSenders().forEach(sender => {
                            if (sender.track?.kind === 'video') sender.replaceTrack(realTrack).catch(() => {});
                        });
                    }
                }
            }).catch(() => {});
        }

        document.getElementById('cm-camspoof-toggle').addEventListener('change', function() {
            _camSpoofActive = this.checked;
            if (_camSpoofActive) startCamSpoof(); else stopCamSpoof();
        });

        // ==================== AUDIO SPOOF ====================
        let _audioSpoofActive = false;
        let _audioFile = null;
        let _audioUrl = null;
        let _audioEl = null;
        let _audioLoop = true;
        let _audioSpeed = 1.0;
        let _audioVolume = 1.0;
        let _audioStream = null;
        let _audioContext = null;
        let _audioSource = null;
        let _audioDestination = null;
        let _audioBassFilter = null;
        let _audioTrebleFilter = null;
        let _audioWarmthFilter = null;
        let _audioBass = 0;
        let _audioTreble = 0;
        let _audioWarmth = 0;

        document.getElementById('cm-audioloop-toggle').addEventListener('change', function() {
            _audioLoop = this.checked;
            if (_audioEl) _audioEl.loop = _audioLoop;
        });

        const audioSpeedSlider = document.getElementById('cm-audiospeed');
        const audioSpeedFill = document.getElementById('cm-audiospeed-fill');
        audioSpeedSlider.addEventListener('input', function() {
            _audioSpeed = parseFloat(this.value);
            document.getElementById('cm-audiospeed-val').textContent = _audioSpeed.toFixed(2) + 'x';
            updateSliderFill(this, audioSpeedFill, 0.25, 3.0);
            if (_audioEl) _audioEl.playbackRate = _audioSpeed;
        });

        const audioVolumeSlider = document.getElementById('cm-audiovolume');
        const audioVolumeFill = document.getElementById('cm-audiovolume-fill');
        audioVolumeSlider.addEventListener('input', function() {
            _audioVolume = parseInt(this.value) / 100;
            document.getElementById('cm-audiovolume-val').textContent = this.value + '%';
            updateSliderFill(this, audioVolumeFill, 0, 100);
            if (_audioEl) _audioEl.volume = _audioVolume;
        });

        const audioBassSlider = document.getElementById('cm-audiobass');
        const audioBassFill = document.getElementById('cm-audiobass-fill');
        audioBassSlider.addEventListener('input', function() {
            _audioBass = parseInt(this.value);
            document.getElementById('cm-audiobass-val').textContent = _audioBass + ' dB';
            updateSliderFill(this, audioBassFill, -12, 12);
            if (_audioBassFilter) _audioBassFilter.gain.value = _audioBass;
        });

        const audioTrebleSlider = document.getElementById('cm-audiotreble');
        const audioTrebleFill = document.getElementById('cm-audiotreble-fill');
        audioTrebleSlider.addEventListener('input', function() {
            _audioTreble = parseInt(this.value);
            document.getElementById('cm-audiotreble-val').textContent = _audioTreble + ' dB';
            updateSliderFill(this, audioTrebleFill, -12, 12);
            if (_audioTrebleFilter) _audioTrebleFilter.gain.value = _audioTreble;
        });

        const audioWarmthSlider = document.getElementById('cm-audiowarmth');
        const audioWarmthFill = document.getElementById('cm-audiowarmth-fill');
        audioWarmthSlider.addEventListener('input', function() {
            _audioWarmth = parseInt(this.value);
            document.getElementById('cm-audiowarmth-val').textContent = _audioWarmth + ' dB';
            updateSliderFill(this, audioWarmthFill, -12, 12);
            if (_audioWarmthFilter) _audioWarmthFilter.gain.value = _audioWarmth;
        });

        function startAudioSpoof() {
            if (!_audioFile && !_audioUrl) {
                document.getElementById('cm-audio-status').textContent = 'No file selected';
                document.getElementById('cm-audio-status').style.color = 'var(--cm-warning)';
                return;
            }

            try {
                _audioEl = document.createElement('audio');
                _audioEl.src = _audioFile ? URL.createObjectURL(_audioFile) : _audioUrl;
                _audioEl.crossOrigin = 'anonymous';
                _audioEl.loop = _audioLoop;
                _audioEl.playbackRate = _audioSpeed;
                _audioEl.volume = _audioVolume;

                _audioContext = new (window.AudioContext || window.webkitAudioContext)();
                _audioSource = _audioContext.createMediaElementSource(_audioEl);

                _audioBassFilter = _audioContext.createBiquadFilter();
                _audioBassFilter.type = 'lowshelf';
                _audioBassFilter.frequency.value = 150;
                _audioBassFilter.gain.value = _audioBass;

                _audioTrebleFilter = _audioContext.createBiquadFilter();
                _audioTrebleFilter.type = 'highshelf';
                _audioTrebleFilter.frequency.value = 4000;
                _audioTrebleFilter.gain.value = _audioTreble;

                _audioWarmthFilter = _audioContext.createBiquadFilter();
                _audioWarmthFilter.type = 'peaking';
                _audioWarmthFilter.frequency.value = 500;
                _audioWarmthFilter.Q.value = 1;
                _audioWarmthFilter.gain.value = _audioWarmth;

                _audioDestination = _audioContext.createMediaStreamDestination();

                _audioSource.connect(_audioBassFilter);
                _audioBassFilter.connect(_audioWarmthFilter);
                _audioWarmthFilter.connect(_audioTrebleFilter);
                _audioTrebleFilter.connect(_audioDestination);
                _audioTrebleFilter.connect(_audioContext.destination);

                _audioStream = _audioDestination.stream;

                _audioEl.play().catch(e => log('[AUDIO SPOOF] Play error:', e));

                document.getElementById('cm-audio-status').textContent = 'Active';
                document.getElementById('cm-audio-status').style.color = 'var(--cm-success)';
                log('[AUDIO SPOOF] Started');
            } catch(e) {
                log('[AUDIO SPOOF] Error:', e);
                document.getElementById('cm-audio-status').textContent = 'Error';
                document.getElementById('cm-audio-status').style.color = 'var(--cm-danger)';
            }
        }

        function stopAudioSpoof() {
            if (_audioEl) {
                _audioEl.pause();
                _audioEl.src = '';
                _audioEl = null;
            }
            if (_audioContext) {
                _audioContext.close().catch(() => {});
                _audioContext = null;
            }
            _audioSource = null;
            _audioDestination = null;
            _audioBassFilter = null;
            _audioTrebleFilter = null;
            _audioWarmthFilter = null;
            _audioStream = null;
            document.getElementById('cm-audio-status').textContent = 'Inactive';
            document.getElementById('cm-audio-status').style.color = 'var(--cm-text-muted)';
            log('[AUDIO SPOOF] Stopped');
        }

        document.getElementById('cm-audiospoof-toggle').addEventListener('change', function() {
            _audioSpoofActive = this.checked;
            if (_audioSpoofActive) startAudioSpoof(); else stopAudioSpoof();
        });

        // Patch getUserMedia to inject spoofed audio
        const _origGetUserMediaForAudio = navigator.mediaDevices.getUserMedia;
        navigator.mediaDevices.getUserMedia = async function(constraints) {
            if (_audioSpoofActive && _audioStream && constraints && constraints.audio) {
                log('[AUDIO SPOOF] Intercepting getUserMedia - injecting spoofed audio');
                const realStream = await _trueOriginalGetUserMedia(constraints);
                if (constraints.video) {
                    const combinedTracks = [
                        ...realStream.getVideoTracks(),
                        ..._audioStream.getAudioTracks()
                    ];
                    return new MediaStream(combinedTracks);
                } else {
                    return _audioStream;
                }
            }
            return _origGetUserMediaForAudio.call(navigator.mediaDevices, constraints);
        };

        // Cam spoof enforcer
        setInterval(() => {
            if (!_camSpoofActive) return;

            if (!_camStream || (_camStream.getVideoTracks()[0] && _camStream.getVideoTracks()[0].readyState === 'ended')) {
                log('[CAM SPOOF] Stream dead, rebuilding...');
                const fakeStream = buildFakeStream();
                if (fakeStream) _camStream = fakeStream;
            }

            if (!_camStream) return;

            const scannerVid = document.querySelector('video.scanner-video');
            if (scannerVid && scannerVid.srcObject !== _camStream) {
                log('[CAM SPOOF] Re-applying spoof to scanner-video');
                scannerVid.srcObject = _camStream;
            }
            const fakeTrack = _camStream.getVideoTracks()[0];
            if (fakeTrack && window._mogPCs) {
                for (const pc of window._mogPCs) {
                    try {
                        pc.getSenders().forEach(sender => {
                            if (sender.track?.kind === 'video' && sender.track !== fakeTrack) {
                                sender.replaceTrack(fakeTrack).catch(() => {});
                            }
                        });
                    } catch(e) {}
                }
            }
        }, 500);

        // VS text detector - re-apply cam spoof on new match
        const vsDetector = new MutationObserver((mutations) => {
            if (!_camSpoofActive) return;
            for (const m of mutations) {
                for (const node of m.addedNodes) {
                    if (node.nodeType !== 1) continue;
                    const text = node.textContent?.trim();
                    if (text === 'VS' || node.innerText?.trim() === 'VS') {
                        log('[CAM SPOOF] VS detected, re-applying cam spoof');
                        if (!_camStream || (_camStream.getVideoTracks()[0] && _camStream.getVideoTracks()[0].readyState === 'ended')) {
                            const fakeStream = buildFakeStream();
                            if (fakeStream) _camStream = fakeStream;
                        }
                        if (_camStream) {
                            const sv = document.querySelector('video.scanner-video');
                            if (sv) sv.srcObject = _camStream;
                            const fakeTrack = _camStream.getVideoTracks()[0];
                            if (fakeTrack && window._mogPCs) {
                                for (const pc of window._mogPCs) {
                                    try {
                                        pc.getSenders().forEach(sender => {
                                            if (sender.track?.kind === 'video') sender.replaceTrack(fakeTrack).catch(() => {});
                                        });
                                    } catch(e) {}
                                }
                            }
                        }
                        return;
                    }
                }
            }
        });
        vsDetector.observe(document.body, { childList: true, subtree: true });

        // ==================== VERIFICATION BYPASS ====================
        const VERIF_VIDEO_URL = 'https://cdn.frostedbrowser.cfd/cheatmoggle-assets/verification-omoggle.mov';
        let _verifBypassActive = false;
        let _verifBypassFlipTimer = null;

        document.getElementById('cm-verifbypass-btn').addEventListener('click', function() {
            _verifBypassActive = !_verifBypassActive;
            this.style.background = _verifBypassActive ? 'var(--cm-success)' : 'var(--cm-accent)';
            this.textContent = _verifBypassActive ? 'Bypass Active' : LANGUAGES[currentLang].verificationBypass;
            if (_verifBypassActive) {
                startVerifBypass();
            } else {
                stopVerifBypass();
            }
        });

        function startVerifBypass() {
            _camVideoUrl = VERIF_VIDEO_URL;
            _camVideoFile = null;
            _camImageFile = null;
            _camSrcType = 'video';
            _camMirror = false;
            _camLoop = true;
            _camSpeed = 1.0;

            if (_camDrawRAF) { cancelAnimationFrame(_camDrawRAF); _camDrawRAF = null; }
            if (_camVideoEl) { _camVideoEl.pause(); _camVideoEl.src = ''; }
            if (_camStream) { _camStream.getTracks().forEach(t => t.stop()); _camStream = null; }

            _camSpoofActive = true;
            const camToggle = document.getElementById('cm-camspoof-toggle');
            if (camToggle) camToggle.checked = true;

            startCamSpoof();

            log('[VERIF BYPASS] Started with virtual cam');

            _verifBypassFlipTimer = setInterval(() => {
                if (!_verifBypassActive) { clearInterval(_verifBypassFlipTimer); return; }
                _camMirror = !_camMirror;
                if (_camVideoEl) {
                    _camVideoEl.currentTime = 0;
                    _camVideoEl.play().catch(() => {});
                }
                log('[VERIF BYPASS] Flipped:', _camMirror);
            }, 3000);
        }

        function stopVerifBypass() {
            if (_verifBypassFlipTimer) { clearInterval(_verifBypassFlipTimer); _verifBypassFlipTimer = null; }
            _camMirror = false;
            log('[VERIF BYPASS] Stopped');
        }

        // ==================== OVERLAY IMAGES ====================
        const OVERLAY_URLS = {
            ban:     'https://raw.githubusercontent.com/sevkabevka/sevkabevka.github.io/main/ChatGPT%20Image%2023%20%D0%BC%D0%B0%D1%8F%202026%20%D0%B3.,%2019_13_02.png',
            loading: 'https://raw.githubusercontent.com/sevkabevka/sevkabevka.github.io/main/ChatGPT%20Image%2023%20%D0%BC%D0%B0%D1%8F%202026%20%D0%B3.,%2017_59_13_Nero_AI_Image_Upscaler_Photo_Face.png'
        };

        let _overlayActive = null;
        let _overlayImg = { ban: null, loading: null };
        let _overlayCanvas = null, _overlayStream = null, _overlayRAF = null;

        ['ban', 'loading'].forEach(key => {
            const img = new Image();
            img.crossOrigin = 'anonymous';
            img.src = OVERLAY_URLS[key];
            img.onload = () => { _overlayImg[key] = img; };
        });

        function _pushTrackToAll(stream) {
            const track = stream ? stream.getVideoTracks()[0] : null;
            if (!track) return;
            const scannerVid = document.querySelector('video.scanner-video');
            if (scannerVid) scannerVid.srcObject = stream;
            if (window._mogPCs) {
                for (const pc of window._mogPCs) {
                    try {
                        pc.getSenders().forEach(sender => {
                            if (sender.track?.kind === 'video') sender.replaceTrack(track).catch(() => {});
                        });
                    } catch(e) {}
                }
            }
        }

        function startOverlay(key) {
            if (_overlayRAF) { cancelAnimationFrame(_overlayRAF); _overlayRAF = null; }
            if (_overlayStream) { _overlayStream.getTracks().forEach(t => t.stop()); _overlayStream = null; }
            _overlayCanvas = null; _overlayActive = null;
            const img = _overlayImg[key];
            if (!img) {
                const statusSpan = document.getElementById('cm-overlay-status');
                if (statusSpan) statusSpan.textContent = 'Loading...';
                return;
            }
            _overlayActive = key;
            _overlayCanvas = document.createElement('canvas');
            _overlayCanvas.width = 640; _overlayCanvas.height = 480;
            const ctx = _overlayCanvas.getContext('2d');
            function drawOverlay() {
                if (!_overlayActive) return;
                ctx.save(); ctx.translate(640, 0); ctx.scale(-1, 1);
                ctx.drawImage(img, 0, 0, 640, 480);
                ctx.restore();
                _overlayRAF = requestAnimationFrame(drawOverlay);
            }
            drawOverlay();
            _overlayStream = _overlayCanvas.captureStream(30);
            _pushTrackToAll(_overlayStream);
            const statusSpan = document.getElementById('cm-overlay-status');
            if (statusSpan) {
                statusSpan.textContent = key.toUpperCase();
                statusSpan.style.color = key === 'ban' ? 'var(--cm-danger)' : 'var(--cm-accent)';
            }
        }

        function stopOverlay() {
            if (_overlayRAF) { cancelAnimationFrame(_overlayRAF); _overlayRAF = null; }
            if (_overlayStream) { _overlayStream.getTracks().forEach(t => t.stop()); _overlayStream = null; }
            _overlayActive = null; _overlayCanvas = null;
            if (_camSpoofActive && _camStream) {
                _pushTrackToAll(_camStream);
            } else {
                _trueOriginalGetUserMedia({ video: true }).then(realStream => { _pushTrackToAll(realStream); }).catch(() => {});
            }
            const statusSpan = document.getElementById('cm-overlay-status');
            if (statusSpan) {
                statusSpan.textContent = 'None';
                statusSpan.style.color = 'var(--cm-text-muted)';
            }
        }

        document.getElementById('cm-ban-overlay-toggle')?.addEventListener('change', function() {
            const loadingToggle = document.getElementById('cm-loading-overlay-toggle');
            if (loadingToggle) loadingToggle.checked = false;
            if (this.checked) startOverlay('ban'); else stopOverlay();
        });
        document.getElementById('cm-loading-overlay-toggle')?.addEventListener('change', function() {
            const banToggle = document.getElementById('cm-ban-overlay-toggle');
            if (banToggle) banToggle.checked = false;
            if (this.checked) startOverlay('loading'); else stopOverlay();
        });
    }

    // ── ZUSTAND STATUS BADGE ──────────────────────────────────────────────
    const _zustandInterval = setInterval(() => {
        const badge = document.getElementById('cm-zustand-val');
        if (!badge) return;
        try {
            const wpChunk = _window.webpackChunk_N_E || _window.webpackChunknextjs_app || _window.webpackChunk;
            if (!wpChunk) return;
            let req;
            try { req = wpChunk.push([[Symbol()], {}, e => e]); } catch(e) { return; }
            if (typeof req !== 'function') return;

            let store = null;
            for (const id of [16225, 74952, 41746, 61107, 28344, 50231, 89540]) {
                try {
                    const mod = req(id);
                    const found = _findStoreInMod(mod);
                    if (found) { store = found; break; }
                } catch(e) {}
            }

            if (store && store.__cmSetStatePatched) {
                badge.textContent = LANGUAGES[currentLang]?.hooked || 'HOOKED';
                badge.style.color = 'var(--cm-success)';
                badge.removeAttribute('data-pending');
                clearInterval(_zustandInterval);
            }
        } catch(e) {}
    }, 500);

    function log(...args) {
        if (CONFIG.debug) console.log('[cheatmoggle]', ...args);
    }

    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', buildMenu);
    } else {
        buildMenu();
    }
})();