cheatmoggle

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

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==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();
    }
})();