Greasy Fork

Greasy Fork is available in English.

Smart AD blocker for: Yandex, Mail.ru, Dzen.ru, VK, OK

Smart AD blocker with dynamic blocking protection, for: Yandex, Mail.ru, Dzen.ru, VK, OK

当前为 2025-02-04 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Smart AD blocker for: Yandex, Mail.ru, Dzen.ru, VK, OK
// @name:ru         Умный блокировщик рекламы для: Yandex, Mail.ru, Dzen.ru, VK, OK
// @namespace    http://tampermonkey.net/
// @version      2025-02-04_03-29
// @description  Smart AD blocker with dynamic blocking protection, for: Yandex, Mail.ru, Dzen.ru, VK, OK
// @description:ru  Умный блокировщик рекламы при динамической защите от блокировки, для: Yandex, Mail.ru, Dzen.ru, VK, OK
// @author       Igor Lebedev
// @license        GPL-3.0-or-later
// @match        http://*.mail.ru/*
// @match        https://*.mail.ru/*
// @match        https://sportmail.ru/*
// @match        https://*.ya.ru/*
// @match        https://*.yandex.ru/*
// @match        https://*.dzen.ru/*
// @match        https://*.ok.ru/*
// @match        https://*.vk.com/*
// @match        https://vkvideo.ru/*
// @require        https://openuserjs.org/src/libs/sizzle/GM_config.js
// @grant          GM_getValue
// @grant          GM_setValue
// @grant          GM_registerMenuCommand
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// ==/UserScript==

/* global GM_config */

(() => {
    'use strict'

    GM_config.init({
        id: 'sc_config',
        title: GM_info.script.name + ' Настройки',
        fields: {
            DEBUG_MODE: {
                label: 'Debug mode',
                type: 'checkbox',
                default: false,
                title: 'Log debug messages to the console'
            },
            MAILRU_ON: {
                label: 'mail.ru: Главная страница',
                type: 'checkbox',
                default: true,
                title: 'Включить для mail.ru'
            },
            MAILRU_email_ON: {
                label: 'mail.ru: Почта (e.mail.ru)',
                type: 'checkbox',
                default: true,
                title: 'Включить для Облака cloud.mail.ru'
            },
            MAILRU_cloud_ON: {
                label: 'mail.ru: Облако (cloud.mail.ru)',
                type: 'checkbox',
                default: true,
                title: 'Включить для Облака cloud.mail.ru'
            },
            MAILRU_doc_ON: {
                label: 'mail.ru: Документы (doc.mail.ru)',
                type: 'checkbox',
                default: true,
                title: 'Включить для Документы doc.mail.ru'
            },
            MAILRU_news_ON: {
                label: 'mail.ru: Новости (news.mail.ru)',
                type: 'checkbox',
                default: true,
                title: 'Включить для Новости news.mail.ru'
            },
            MAILRU_vfokuse_ON: {
                label: 'mail.ru: ВФокусе (vfokuse.mail.ru)',
                type: 'checkbox',
                default: true,
                title: 'Включить для ВФокусе vfokuse.mail.ru'
            },
            MAILRU_finance_ON: {
                label: 'mail.ru: Финансы (finance.mail.ru)',
                type: 'checkbox',
                default: true,
                title: 'Включить для Финансы finance.mail.ru'
            },
            MAILRU_auto_ON: {
                label: 'mail.ru: Автомобили (auto.mail.ru)',
                type: 'checkbox',
                default: true,
                title: 'Включить для Автомобили auto.mail.ru'
            },
            SPORTMAILRU_ON: {
                label: 'sportmail.ru',
                type: 'checkbox',
                default: true,
                title: 'Включить для sportmail.ru'
            },
            YANDEX_ON: {
                label: 'Яндекс (ya.ru и yandex.ru)',
                type: 'checkbox',
                default: true,
                title: 'Включить для Яндекс (ya.ru и yandex.ru)'
            },
            YANDEX_email_ON: {
                label: 'Яндекс-почта (mail.yandex.ru)',
                type: 'checkbox',
                default: true,
                title: 'Включить для Яндекс-почты (mail.yandex.ru)'
            },
            YANDEX_disk_ON: {
                label: 'Яндекс-диск (disk.yandex.ru)',
                type: 'checkbox',
                default: true,
                title: 'Включить для Яндекс-диске (disk.yandex.ru)'
            },
            YANDEX_maps_ON: {
                label: 'Яндекс-карты (yandex.ru/maps)',
                type: 'checkbox',
                default: true,
                title: 'Включить для Яндекс-картинки (yandex.ru/maps)'
            },
            YANDEX_images_ON: {
                label: 'Яндекс-карты (yandex.ru/images)',
                type: 'checkbox',
                default: true,
                title: 'Включить для Яндекс-картинок (yandex.ru/images)'
            },
            YANDEX_video_ON: {
                label: 'Яндекс-видео (yandex.ru/video)',
                type: 'checkbox',
                default: true,
                title: 'Включить для Яндекс-видео (yandex.ru/video)'
            },
            YANDEX_games_collection_ON: {
                label: 'Яндекс-игры: коллекция (yandex.ru/games)',
                type: 'checkbox',
                default: true,
                title: 'Включить для коллекции Яндекс-игр (yandex.ru/games)'
            },
            YANDEX_games_app_ON: {
                label: 'Яндекс-игры: игра (yandex.ru/games/app)',
                type: 'checkbox',
                default: true,
                title: 'Включить для Яндекс-игры (yandex.ru/games/app)'
            },
            YANDEX_игры_app_AD_правый_ВКЛ: {
                label: 'Яндекс-игры: игра (yandex.ru/games/app): Правый рекламный блок',
                type: 'checkbox',
                default: true,
                title: 'Включить для Яндекс-игры: игра (yandex.ru/games/app): Правый рекламный блок'
            },
            YANDEX_игры_app_AD_центральный_ВКЛ: {
                label: 'Яндекс-игры: игра (yandex.ru/games/app): Центральный рекламный блок',
                type: 'checkbox',
                default: true,
                title: 'Включить для Яндекс-игры: игра (yandex.ru/games/app): Центральный рекламный блок'
            },
            YANDEX_игры_app_AD_нижний_ряд_других_игр_ВКЛ: {
                label: 'Яндекс-игры: игра (yandex.ru/games/app): Нижний ряд других игр',
                type: 'checkbox',
                default: true,
                title: 'Включить для Яндекс-игры: игра (yandex.ru/games/app): Нижний ряд других игр'
            },
            YANDEX_health_ON: {
                label: 'Яндекс-здоровье (yandex.ru/health)',
                type: 'checkbox',
                default: true,
                title: 'Включить для Яндекс-здоровье (yandex.ru/health)'
            },
            DZEN_ON: {
                label: 'Яндекс-Дзен (dzen.ru)',
                type: 'checkbox',
                default: true,
                title: 'Включить для Яндекс-Дзен (dzen.ru)'
            },
            DZEN_video_ON: {
                label: 'Яндекс-Дзен-Видео (dzen.ru/video)',
                type: 'checkbox',
                default: true,
                title: 'Включить для Яндекс-Дзен-Видео (dzen.ru/video)'
            },
            DZEN_shorts_ON: {
                label: 'Яндекс-Дзен: Коротие видео (dzen.ru/shorts)',
                type: 'checkbox',
                default: true,
                title: 'Включить для Яндекс-Дзен: Короткие видео (dzen.ru/shorts)'
            },
            DZEN_pogoda_ON: {
                label: 'Яндекс-Дзен: Погода (dzen.ru/pogoda)',
                type: 'checkbox',
                default: true,
                title: 'Включить для Яндекс-Дзен: Погода (dzen.ru/pogoda)'
            },
            DZEN_pogoda_maps_ON: {
                label: 'Яндекс-Дзен: Погода на карте (dzen.ru/pogoda/maps)',
                type: 'checkbox',
                default: true,
                title: 'Включить для Яндекс-Дзен: Погода на карте (dzen.ru/pogoda/maps)'
            },
            DZEN_pogoda_details_ON: {
                label: 'Яндекс-Дзен: Погода подробно (dzen.ru/pogoda/details)',
                type: 'checkbox',
                default: true,
                title: 'Включить для Яндекс-Дзен: Погода подробно (dzen.ru/pogoda/details)'
            },
            DZEN_pogoda_month_ON: {
                label: 'Яндекс-Дзен: Погода на месяц (dzen.ru/pogoda/month)',
                type: 'checkbox',
                default: true,
                title: 'Включить для Яндекс-Дзен: Погода на месяц (dzen.ru/pogoda/month)'
            },
            DZEN_articles_ON: {
                label: 'Яндекс-Дзен: Статьи (dzen.ru/articles)',
                type: 'checkbox',
                default: true,
                title: 'Включить для Яндекс-Дзен: Статьи (dzen.ru/articles)'
            },
            VK_ON: {
                label: 'Вконтакте',
                type: 'checkbox',
                default: true,
                title: 'Включить для Вконтакте (vk.com)'
            },
            VK_VIDEO_ON: {
                label: 'Вконтакте видео',
                type: 'checkbox',
                default: true,
                title: 'Включить для Вконтакте (vkvideo.ru)'
            },
            OK_ON: {
                label: 'Одноклассники',
                type: 'checkbox',
                default: true,
                title: 'Включить для Одноклассники (ok.ru)'
            },
        },
        events: {
            init: onInit
        }
    })

    GM_registerMenuCommand('Настройки', () => {
        GM_config.open()
    })

    class Debugger {
        constructor (name, enabled) {
            this.debug = {}
            if (!window.console) {
                return () => { }
            }
            Object.getOwnPropertyNames(window.console).forEach(key => {
                if (typeof window.console[key] === 'function') {
                    if (enabled) {
                        this.debug[key] = window.console[key].bind(window.console, name + ': ')
                    } else {
                        this.debug[key] = () => { }
                    }
                }
            })
            return this.debug
        }
    }

    var DEBUG

    let MAILRU_ON = true
    let MAILRU_email_ON = true
    let MAILRU_cloud_ON = true
    let MAILRU_doc_ON = true
    let MAILRU_news_ON = true
    let MAILRU_vfokuse_ON = true
    let MAILRU_finance_ON = true
    let MAILRU_auto_ON = true
    let SPORTMAILRU_ON = true
    let YANDEX_ON = true
    let YANDEX_email_ON = true
    let YANDEX_disk_ON = true
    let YANDEX_maps_ON = true
    let YANDEX_images_ON = true
    let YANDEX_video_ON = true
    let YANDEX_games_collection_ON = true
    let YANDEX_games_app_ON = true
    let YANDEX_игры_app_AD_правый_ВКЛ = true
    let YANDEX_игры_app_AD_центральный_ВКЛ = true
    let YANDEX_игры_app_AD_нижний_ряд_других_игр_ВКЛ = true
    let YANDEX_health_ON = true
    let DZEN_ON = true
    let DZEN_video_ON = true
    let DZEN_shorts_ON = true
    let DZEN_pogoda_ON = true
    let DZEN_pogoda_maps_ON = true
    let DZEN_pogoda_details_ON = true
    let DZEN_pogoda_month_ON = true
    let DZEN_articles_ON = true
    let VK_ON = true
    let VK_VIDEO_ON = true
    let OK_ON = true
    let FirstOpen = false

    function onInit() {
        DEBUG = new Debugger(GM_info.script.name, GM_config.get('DEBUG_MODE'))

        MAILRU_ON = GM_config.get('MAILRU_ON')
        MAILRU_email_ON = GM_config.get('MAILRU_email_ON')
        MAILRU_cloud_ON = GM_config.get('MAILRU_cloud_ON')
        MAILRU_doc_ON = GM_config.get('MAILRU_doc_ON')
        MAILRU_news_ON = GM_config.get('MAILRU_news_ON')
        MAILRU_vfokuse_ON = GM_config.get('MAILRU_vfokuse_ON')
        MAILRU_finance_ON = GM_config.get('MAILRU_finance_ON')
        MAILRU_auto_ON = GM_config.get('MAILRU_auto_ON')
        SPORTMAILRU_ON = GM_config.get('SPORTMAILRU_ON')
        YANDEX_ON = GM_config.get('YANDEX_ON')
        YANDEX_email_ON = GM_config.get('YANDEX_email_ON')
        YANDEX_disk_ON = GM_config.get('YANDEX_disk_ON')
        YANDEX_maps_ON = GM_config.get('YANDEX_maps_ON')
        YANDEX_images_ON = GM_config.get('YANDEX_images_ON')
        YANDEX_video_ON = GM_config.get('YANDEX_video_ON')
        YANDEX_games_collection_ON = GM_config.get('YANDEX_games_collection_ON')
        YANDEX_games_app_ON = GM_config.get('YANDEX_games_app_ON')
        YANDEX_игры_app_AD_правый_ВКЛ = GM_config.get('YANDEX_игры_app_AD_правый_ВКЛ')
        YANDEX_игры_app_AD_центральный_ВКЛ = GM_config.get('YANDEX_игры_app_AD_центральный_ВКЛ')
        YANDEX_игры_app_AD_нижний_ряд_других_игр_ВКЛ = GM_config.get('YANDEX_игры_app_AD_нижний_ряд_других_игр_ВКЛ')
        YANDEX_health_ON = GM_config.get('YANDEX_health_ON')
        DZEN_ON = GM_config.get('DZEN_ON')
        DZEN_video_ON = GM_config.get('DZEN_video_ON')
        DZEN_shorts_ON = GM_config.get('DZEN_shorts_ON')
        DZEN_pogoda_ON = GM_config.get('DZEN_pogoda_ON')
        DZEN_pogoda_maps_ON = GM_config.get('DZEN_pogoda_maps_ON')
        DZEN_pogoda_details_ON = GM_config.get('DZEN_pogoda_details_ON')
        DZEN_pogoda_month_ON = GM_config.get('DZEN_pogoda_month_ON')
        DZEN_articles_ON = GM_config.get('DZEN_articles_ON')
        VK_ON = GM_config.get('VK_ON')
        VK_VIDEO_ON = GM_config.get('VK_VIDEO_ON')
        OK_ON = GM_config.get('OK_ON')

        // сюада надо бы поместить все функции, но пока под вопросом
        if (!FirstOpen) {
            FirstOpen = true
            handleUrlChange()
        }
    }

    // получаем текущий адрес страницы
    let currentURL = window.location.href
    const config = {
        SettingsOnOff: true,
        isRunningAsExtension: false,
        nodes: {
            mail_ru_email_GeneralBlock: 'div.application-mail__layout.application-mail__layout_main',
            mail_ru_suggestions: 'div.themes-widget.themes-widget_full',
            mail_ru_banner_top_parent: 'div[slot="main-column"]',
            mail_ru_banner_top_parent_bannerClassList: ['span', 'article', 'p', 'section'], // все возможные типы нод, используемые в качестве контекнера рекламного баннера
            ya_ru_banner_under_search: 'div.banner.i-mini-bem', // все возможные типы нод, используемые в качестве контекнера рекламного баннера
            // ya_ru_search_suggestions: 'div.Modal.Modal_visible.Modal_hasAnimation.Distribution-SplashScreenModal.Distribution-SplashScreenModal_outerCross.SplashscreenDefault', // все возможные типы нод, используемые в качестве контекнера рекламного баннера
            ya_ru_search_suggestions: 'div.Modal.Modal_visible.Modal_hasAnimation', // классы, используемые в качестве контекнера рекламного баннера


        }
    };
    let intervalId
    const observer_config = { childList: true, subtree: true } // общи конфиг обсервера
    // Массив для хранения ссылок на обсерверы
    const observers = []
    // счётчики
    let count_001 = 0, count_002 = 0

    // Функция для обработки изменений URL
    function handleUrlChange() {
        // console.log('URL changed to:', window.location.href);
        // if (MAILRU_ON && currentURL.startsWith('https://e.mail.ru/')) {
        if (MAILRU_email_ON && currentURL.startsWith('https://e.mail.ru/')) {

            // удаление верхнего рекламного блока
            let fact_Remove_AD_Top_3column = false // факт удаления верхнего рекламного блока в интерфейсе с тремя столбцами где содержимое письма в 3-м столбце
            function Remove_AD_Top(node) {

                document.querySelectorAll('div.react-async').forEach(node2 => {node2?.remove()})
            }

            function Remove_AD_НадСпискомПисем () {

                // Find the div with the class "ReactVirtualized__Grid__innerScrollContainer"
                const container = document.querySelector('.ReactVirtualized__Grid__innerScrollContainer');

                // Find all div elements with a style of "top: 0px;" inside the container
                const targetDivs = Array.from(container.querySelectorAll('div')).filter(div => {
                    // return window.getComputedStyle(div).getPropertyValue('top') === '0px' && parseFloat(window.getComputedStyle(div).getPropertyValue('height')) > 0;
                    return window.getComputedStyle(div).getPropertyValue('top') === '0px' ;
                });

                // Get the first three elements from the targetDivs array
                const firstThreeDivs = targetDivs.slice(0, 3);

                // Set the display property to "none" for each of the first three target divs
                firstThreeDivs.forEach(div => {
                    div.style.display = 'none';
                });


            }

            // удаление правых рекламных блоков
            function Remove_AD_Right(node) {
                // Функция для проверки наличия CSS-свойства --right-column-width
                const noads_button = document.querySelector('div.noads-button')
                if(noads_button) {
                    noads_button.remove()

                    function hasRightColumnWidth(element) {
                        const style = window.getComputedStyle(element);
                        return style.getPropertyValue('--right-column-width') !== '';
                    }

                    // Получаем все элементы на странице
                    const allElements = document.querySelectorAll('*');

                    // Фильтруем элементы, у которых есть свойство --right-column-width
                    const elementsWithRightColumnWidth = Array.from(allElements).filter(hasRightColumnWidth);

                    // Переопределяем свойство --right-column-width на 0px для найденных элементов
                    elementsWithRightColumnWidth.forEach(element => {
                        element.style.setProperty('--right-column-width', '0px');
                    })
                }
            }
            //             // Функция для поиска и удаления всех элементов, имя класса которых содержит banner__content-wrapper
            //             function removeElementsByClassContaining(className) {
            //                 const elements = document.querySelectorAll('a');

            //                 elements.forEach(element => {
            //                     if (element.classList.contains(className)) {
            //                         element.remove();
            //                     }
            //                 });
            //             }
            // установка наблюдения за изменением блока-родителя
            const observer = new MutationObserver((mutationsList, observer) => {
                let FactMutationChildList = false
                for (let mutation of mutationsList) {
                    if (mutation.type === 'childList') {
                        FactMutationChildList = true
                        mutation.addedNodes.forEach(node => {
                            // Remove_AD_Top(node)

                            // Remove_AD_Right(node)
                        })
                    }
                }
                if (FactMutationChildList) {
                    Remove_AD_Top()
                    Remove_AD_НадСпискомПисем()
                    Remove_AD_Right()
                }
            })
            observer.observe(document, observer_config) // удаление при изменении блока-родителя
            observers.push(observer)
            // удаление при загрузке
            Remove_AD_Top()
            Remove_AD_НадСпискомПисем ()
            Remove_AD_Right()



            function checkFor_GeneralBlock() {
                const targetNode = document.querySelector(config.nodes.mail_ru_email_GeneralBlock) // 'div.application-mail__layout.application-mail__layout_main

                if (targetNode) {
                    clearInterval(interval_GeneralBlock)
                    checkAndRemoveMailruSuggestions(null)
                    mail_ru_checkAndRemoveTopBlock()

                    // Настраиваем наблюдение за изменениями в документе
                    const observer = new MutationObserver((mutationsList, observer) => {
                        for (let mutation of mutationsList) {
                            if (mutation.type === 'childList') {

                                mutation.removedNodes.forEach(node => {
                                    if (node.nodeType === Node.ELEMENT_NODE && node.matches('div.portal-menu-element.portal-menu-element_select.portal-menu-element_expanded.portal-menu-element_not-touch.portal-menu-element_pony-mode')) {

                                    }
                                });
                                mutation.addedNodes.forEach(node => {
                                    if (node.nodeType === Node.ELEMENT_NODE && node.nodeName === 'A') {
                                        checkAndRemoveMailruSuggestions(mutation)
                                        mail_ru_checkAndRemoveTopBlock()
                                    }
                                });

                            }
                        }
                    });
                    observer.observe(targetNode, observer_config);
                    observers.push(observer)
                }
            }
            // Функция для проверки наличия и удаления блока рекламного банера Майлру в нижнем левом углу
            function checkAndRemoveMailruSuggestions(mutation) {
                const targetNode = document.querySelector(config.nodes.mail_ru_suggestions)
                if (targetNode) {
                    // clearInterval(interval_MailruSuggestions); // Останавливаем интервал, так как элемент уже найден
                    targetNode.remove()
                }
            }
            const interval_GeneralBlock = setInterval(checkFor_GeneralBlock, 200)

            }
        // почта на мобильном устройстве
        else if (MAILRU_email_ON && currentURL.startsWith('https://touch.mail.ru/messages/')) {
            // верхний узкий баннер
            document.querySelector('div.mailru-visibility-check')?.parentNode?.remove()
            const observer = new MutationObserver((mutationsList, observer) => {
                for (let mutation of mutationsList) {
                    if (mutation.type === 'childList') {
                        mutation.addedNodes.forEach(node => {
                            if (node.nodeName === 'DIV') {
                                document.querySelector('div.mailru-visibility-check')?.parentNode?.remove()
                            }
                        })
                    }
                }
            });
            observer.observe(document.body, observer_config)
            observers.push(observer)
        }
        else if (MAILRU_cloud_ON && currentURL.startsWith('https://cloud.mail.ru/attaches/')) {
            // нижний узкий баннер
            document.querySelector('div[class^="ReactViewer__attachesinfo"]')?.remove()
            // правая панель
            document.querySelector('div[class^="ReactViewer__attachesSidebar"]')?.remove()
            const observer = new MutationObserver((mutationsList, observer) => {
                for (let mutation of mutationsList) {
                    if (mutation.type === 'childList') {
                        mutation.addedNodes.forEach(node => {
                            if (node.nodeName === 'DIV') {
                                // нижний узкий баннер
                                document.querySelector('div[class^="ReactViewer__attachesinfo"]')?.remove()
                                // правая панель
                                document.querySelector('div[class^="ReactViewer__attachesSidebar"]')?.remove()
                            }
                        });
                    }
                }
            });
            observer.observe(document.body, observer_config)
            observers.push(observer)
        }
        else if (MAILRU_auto_ON && currentURL.startsWith('https://auto.mail.ru/') ) {
            // удаление всей рекламы, но не очень аккуратно

            // Функция для проверки, что элемент имеет только один класс
            function hasSingleClass(element, className) {
                return element.classList.length === 1 && element.classList.contains(className);
            }

            // Функция для поиска и удаления всех подходящих div элементов
            function removeDivsWithSingleClassAndId() {
                const divs = document.querySelectorAll('div');

                divs.forEach(div => {
                    if (hasSingleClass(div, 'mailru-visibility-check') && div.id.startsWith('mailru')) {
                        div.remove();
                    }
                });
            }
            // Вызов функции для удаления div элементов
            removeDivsWithSingleClassAndId();

            const observer = new MutationObserver((mutationsList, observer) => {
                for (let mutation of mutationsList) {
                    if (mutation.type === 'childList') {
                        mutation.addedNodes.forEach(node => {
                            if (node.nodeName === 'DIV') {
                                removeDivsWithSingleClassAndId();
                            }
                        });
                    }
                }
            });
            observer.observe(document.body, observer_config)
            observers.push(observer)


        }

        else if ((MAILRU_cloud_ON && currentURL.startsWith('https://cloud.mail.ru/home/')) ||
                 (MAILRU_doc_ON && currentURL.startsWith('https://doc.mail.ru/'))
                )
        {
            // верхний узкий баннер
            document.querySelector('div[class^="Worm__root--"]')?.remove()
        }
        else if ((SPORTMAILRU_ON && currentURL.startsWith('https://sportmail.ru/')) ||
                 (MAILRU_news_ON && currentURL.startsWith('https://news.mail.ru/')) ||
                 (MAILRU_vfokuse_ON && currentURL.startsWith('https://vfokuse.mail.ru/')) ||
                 (MAILRU_finance_ON && currentURL.startsWith('https://finance.mail.ru/'))
                )
        {
            // нижний узкий баннер
            function AD_remove_node(node_test, mutation_test) {
                if (currentURL.startsWith('https://finance.mail.ru/')) {
                    // поиск блока с рекламой, занимающего верхнее пространство страницы
                    function findParentWithProperties(targetNode) {
                        function checkParent(node, level) {
                            if (level > 4) {
                                return null;
                            }

                            const parent = node.parentElement;
                            if (!parent) {
                                return null;
                            }

                            const style = parent.style.minHeight;
                            const dataHideOrder = parent.getAttribute('data-hideorder');
                            const dataSize = parent.getAttribute('data-size');

                            if (style && dataHideOrder !== null && dataSize !== null) {
                                return parent;
                            }

                            return checkParent(parent, level + 1);
                        }

                        return checkParent(targetNode, 1);
                    }

                    const targetNode = document.querySelector('div.mailru-visibility-check')
                    if (targetNode) {
                        const parentWithProperties = findParentWithProperties(targetNode);

                        if (parentWithProperties) {
                            parentWithProperties.remove()
                        } else {
                            targetNode.remove()
                        }
                    }
                }
                else {
                    document.querySelector('div.mailru-visibility-check')?.remove()
                }
            }
            const observer = new MutationObserver((mutationsList, observer) => {
                for (let mutation of mutationsList) {
                    if (mutation.type === 'childList') {
                        mutation.addedNodes.forEach(node => {
                            if (node.nodeName === 'DIV') {
                                AD_remove_node(node, mutation)
                            }
                        });
                    }
                }
            });
            observer.observe(document.body, observer_config)
            observers.push(observer)
            AD_remove_node()
        }
        else if (MAILRU_ON && currentURL.startsWith('https://mail.ru/')) {
            mail_ru_checkAndRemoveTopBlock()

            const observer = new MutationObserver((mutationsList, observer) => {
                for (let mutation of mutationsList) {
                    if (mutation.type === 'childList') {
                        // console.log('Новые узлы добавлены:', mutation.addedNodes);
                        // для всех возможных типов нод-контейнеров баннера
                        config.nodes.mail_ru_banner_top_parent_bannerClassList.forEach(item => {
                            // mail_ru_checkAndRemoveTopBlock()
                            mutation.addedNodes.forEach(node => {
                                if (node.nodeName === item.toUpperCase()) {
                                    // mail_ru_checkAndRemoveTopBlock_classList(node,mutation)
                                }
                                // признак добавления верхнего рекламного блока
                                if (node.nodeType === 1 && node.tagName === 'DIV' && parseInt(getComputedStyle(node).height) === 90) {
                                    mail_ru_checkAndRemoveTopBlock()
                                }

                            });
                        });
                        // document.querySelectorAll('article.zenad-card-rtb').forEach(node => {
                        //                         document.querySelectorAll('article.zenad-card-rtb[data-testid="card-rtb"]').forEach(node => {
                        document.querySelectorAll('article.zenad-card-rtb[aria-label="Карточка рекламы"]').forEach((node, index, array) => {
                            // if (index > 0 && index < array.length - 1 ) {
                            // node?.remove()
                            node.style.display = 'none'
                            // }
                            // Если удалить сразу все ноды - возникают глюки. Удаляем первые ноды, оставляя последующие невидимыми
                            if (array.length > 10 && index < 5) {
                                node?.remove()
                            }
                        })
                    }
                }
            });
            observer.observe(document.querySelector(config.nodes.mail_ru_banner_top_parent), observer_config)
            observers.push(observer)
            // }
            // }
            // const interval_AD_remove = setInterval(AD_remove, 500)

        }
        else if (YANDEX_ON && (currentURL.startsWith('https://ya.ru/search') || currentURL.startsWith('https://yandex.ru/search'))) {
            function AD_remove_node(node, mutation_test) {
                // баннер внизу справа "Сделать Яндекс основным поисковиком?"
                let targetNode
                targetNode = document.querySelector(config.nodes.ya_ru_search_suggestions) // 'div.Modal.Modal_visible.Modal_hasAnimation.Distribution-SplashScreenModal.Distribution-SplashScreenModal_outerCross.SplashscreenDefault'
                targetNode?.remove()
                targetNode = document.querySelector('div.Distribution-Popup')
                targetNode?.remove()
                // вверху слева кнопка "Установите Яндекс Браузер"
                targetNode = document.querySelector('div.DistrNav') || document.querySelector('div.HeaderDesktopActions-Distribution')
                targetNode?.remove()
            }
            const observer = new MutationObserver((mutationsList, observer) => {
                for (let mutation of mutationsList) {
                    if (mutation.type === 'childList') {
                        mutation.addedNodes.forEach(node => {
                            if (node.nodeName === 'DIV') {
                                AD_remove_node(node, mutation)
                            }
                        });

                    }
                }
            });
            observer.observe(document.body, observer_config)
            observers.push(observer)
            AD_remove_node()


        }
        // настроить обсервер
        else if (YANDEX_images_ON && (currentURL.startsWith('https://ya.ru/images/') || currentURL.startsWith('https://yandex.ru/images/'))) {
            // Добавление кнопки "Реклама"
            // const EspeciallyForYou = CreateEspeciallyForYou()
            // let EspeciallyForYou_fact = false
            const AdvDetails = {
                Details: CreateEspeciallyForYou(),
                Details_fact: false,
                countBanners: 0,
            }
            let ADRight_fact = false // факт вывода рекоамного блока справа внутри "Реклама"

            // блок справа
            function AD_remove_node(node, mutation_test) {
                let targetNode
                let targetNodes

                // баннер "Сделать поиск Яндекса основным?"
                targetNode = document.querySelector(config.nodes.ya_ru_search_suggestions) || document.querySelector('div#distr-pcode-container') // 'div.Modal.Modal_visible.Modal_hasAnimation.Distribution-SplashScreenModal.Distribution-SplashScreenModal_outerCross.SplashscreenDefault'
                // Modal Modal_visible Modal_hasAnimation Distribution-SplashScreenModal SplashscreenTopButton SplashscreenTopButton_layout_system_top_dark_close-button
                if (targetNode) {
                    // if (EspeciallyForYou_fact === false) {
                    if (AdvDetails.Details_fact === false) {
                        targetNode.style.marginTop = '0.3rem'
                        // EspeciallyForYou?.appendChild(targetNode)
                        AdvDetails.Details.appendChild(targetNode)
                        AdvDetails.countBanners++
                    }
                    else {
                        targetNode?.remove()
                    }
                }
                // баннер справа
                targetNode = document.querySelector('div.ImagesViewer-SidebarAdv')
                targetNode?.parentNode.remove()
                targetNode = document.querySelector('div#ImagesViewer-SidebarAdv')
                targetNode?.parentNode.parentNode.parentNode.remove()
                // баннер вверху
                targetNode = document.querySelector('div.AdvMastHead')
                targetNode?.remove()
                // реклама среди картинок
                document.querySelectorAll('div.JustifierRowLayout-Incut').forEach(node => {node?.remove()})
                document.querySelectorAll('div.AdvRsyaCrossPage').forEach(node => {node?.remove()})
                document.querySelectorAll('div[aria-label="Рекламный баннер"]').forEach(node => {node?.remove()})
                // if (node) observer.disconnect()
                // при нажатии на какую-либо картинку открывается модальное окно
                const targetNodeModal = document.querySelector('div.Modal.Modal_visible.Modal_theme_normal.ImagesViewer-Modal.ImagesViewer')
                if (targetNodeModal) {
                    // в модальном окне удаление рекламы справа
                    targetNodes = targetNodeModal.querySelectorAll('div[id^="ImagesViewer-"]')
                    targetNodes.forEach(node => {
                        // Поиск главного родительского блока, содержащего рекламу
                        const node_parentNode = findParentWithClassEndingInCard(node)
                        if (!ADRight_fact) {
                            node.style.marginTop = '0.3rem'
                            // EspeciallyForYou?.appendChild(node)
                            AdvDetails.Details.appendChild(node)
                            AdvDetails.countBanners++
                            ADRight_fact = true
                        }
                        node_parentNode?.remove()

                    });

                    // добавление "Реклама" под блок-ссылку на источник изображения
                    if (AdvDetails.countBanners > 0) {
                        // if (EspeciallyForYou_fact === false) {
                        if (AdvDetails.Details_fact === false) {

                            const div_imageSource = targetNodeModal.querySelector('div.ImagesViewer-LayoutSideblock')
                            if (div_imageSource) {
                                // EspeciallyForYou.querySelector('summary').textContent += ' (' + AdvDetails.countBanners + ')'
                                // div_imageSource.appendChild(EspeciallyForYou)
                                // AdvDetails.Details.querySelector('summary').textContent = messageSpecialOffer('Реклама') + ' (' + AdvDetails.countBanners + ')'
                                AdvDetails.Details.querySelector('summary').textContent = messageSpecialOffer('Реклама') + ` (${AdvDetails.countBanners})`
                                div_imageSource.appendChild(AdvDetails.Details)
                                // EspeciallyForYou_fact = true
                                AdvDetails.Details_fact = true

                            }
                        }
                    }

                    // Поиск главного родительского блока, содержащего рекламу
                    function findParentWithClassEndingInCard(node) {
                        let currentNode = node

                        // Проверяем каждого родителя, пока не найдем нужный элемент или не дойдем до корня документа
                        while (currentNode && currentNode !== document.body) {
                            // Проверяем, есть ли у текущего элемента класс, оканчивающийся на "-Card"
                            if (currentNode.classList && Array.from(currentNode.classList).some(className => className.endsWith('-Card'))) {
                                return currentNode;
                            }
                            // Переходим к следующему родителю
                            currentNode = currentNode.parentNode
                        }

                        // Если нужный элемент не найден, возвращаем null
                        return null;
                    }
                }
                // else {
                //     // сброс флага вывода блока "Реклама" при закрытии модального окна
                //     EspeciallyForYou_fact = false
                // }
            }
            const observer = new MutationObserver((mutationsList, observer) => {
                for (let mutation of mutationsList) {
                    if (mutation.type === 'childList') {
                        mutation.addedNodes.forEach(node => {
                            // if (node.nodeName === 'DIV') {
                            if (node.className !== 'details_EspeciallyForYou') {
                                AD_remove_node(node, mutation)
                            }

                        });
                        mutation.removedNodes.forEach(node => {
                            if (node.nodeName === 'DIV') {
                                const targetNodeModal = document.querySelector('div.Modal.Modal_visible.Modal_theme_normal.ImagesViewer-Modal.ImagesViewer')
                                // модальное окно изображения было закрыто или ещё не открылось
                                if (!targetNodeModal) {
                                    // EspeciallyForYou_fact = false
                                    AdvDetails.Details_fact = false

                                    ADRight_fact = false
                                    // Очистка <details>
                                    // Выбираем все дочерние элементы <details>, кроме <summary>
                                    // const childNodes = EspeciallyForYou.querySelectorAll('details > *:not(summary)')
                                    const childNodes = AdvDetails.Details.querySelectorAll('details > *:not(summary)')

                                    // Удаляем каждый из выбранных элементов
                                    childNodes.forEach(node => {
                                        // EspeciallyForYou.removeChild(node)
                                        AdvDetails.Details.removeChild(node)
                                    });
                                    // AdvDetails.countBanners = 0
                                    AdvDetails.Details.querySelector('summary').textContent = messageSpecialOffer('Реклама')
                                }
                            }
                        });
                    }
                }
            });
            observer.observe(document.body, observer_config)
            observers.push(observer)
            AD_remove_node()

        }
        // сделать пропуск видеозаставки
        else if (YANDEX_video_ON && (currentURL.startsWith('https://ya.ru/video/') || currentURL.startsWith('https://yandex.ru/video/'))) {
            // баннер сверху
            function AD_remove_node(node, mutation_test) {
                const targetNodes = document.querySelectorAll('div[role="button"]')
                targetNodes?.forEach(node => {
                    node.remove()
                });
            }
            const observer = new MutationObserver((mutationsList, observer) => {
                for (let mutation of mutationsList) {
                    if (mutation.type === 'childList') {
                        mutation.addedNodes.forEach(node => {
                            if (node.nodeName === 'DIV') {
                                const targetNodes = document.querySelectorAll('div[role="button"]')
                                targetNodes?.forEach(node => {
                                    node.remove()
                                });
                            }
                        });

                    }
                }
            });
            observer.observe(document.body, observer_config)
            observers.push(observer)
            AD_remove_node()
            yandex_dzen_questionYandexGeneralSearch()

        }
        else if (YANDEX_ON && currentURL.startsWith('https://ya.ru/')) {
            // если это мбильное устройство
            if (isMobileDevice()) {
                document.querySelector('div.dialog__wrapper')?.remove()
            }
            else {
                // Добавление кнопки "Реклама"
                // const EspeciallyForYou = CreateEspeciallyForYou()
                const AdvDetails = {
                    Details: CreateEspeciallyForYou(),
                    Details_fact: false,
                    countBanners: 0,
                }
                // const EspeciallyForYou_Content = EspeciallyForYou.querySelector('div.shimmer')
                // simple-popup dist-overlay__popup simple-popup_direction_center simple-popup_theme_modal simple-popup_autoclosable_yes simple-popup_overlay_yes simple-popup_has-close_yes simple-popup_delay-close_yes simple-popup_overlay-color_default simple-popup_shown_true simple-popup_delay-close-shown_yes
                // simple-popup__content

                // Удаление без наблюдения
                // перенос всей рекламы в специальный фрейм "Специально для Вас..."
                // const headline__personal = document.querySelector('div.headline__personal')
                let targetNode
                // курсы валют и нефти (сделать опциональным)
                targetNode = document.querySelector('section.informers3__stocks')
                // targetNode?.remove()
                if (targetNode) {
                    targetNode.style.marginTop = '0.3rem'
                    // EspeciallyForYou?.appendChild(targetNode)
                    AdvDetails.Details.appendChild(targetNode)
                    AdvDetails.countBanners++
                }

                targetNode = document.querySelector(config.nodes.ya_ru_banner_under_search)
                // targetNode?.remove()
                if (targetNode) {
                    AdvDetails.Details?.appendChild(targetNode)
                    AdvDetails.countBanners++
                }

                // модальное окно посредине в начале "Сделайте Яндекс главной страницей"
                targetNode = document.querySelector('div.simple-popup') ||
                    document.querySelector('div.dist-overlay__popup') ||
                    document.querySelector('div.simple-popup_direction_center') ||
                    document.querySelector('div.simple-popup_theme_modal') ||
                    document.querySelector('div.simple-popup_autoclosable_yes') ||
                    document.querySelector('div.simple-popup_overlay_yes') ||
                    document.querySelector('div.simple-popup_has-close_yes') ||
                    document.querySelector('div.simple-popup_delay-close_yes') ||
                    document.querySelector('div.simple-popup_overlay-color_default') ||
                    document.querySelector('div.simple-popup_shown_true') ||
                    document.querySelector('div.simple-popup_delay-close-shown_yes')
                if (targetNode) {
                    targetNode.style.marginTop = '0.3rem'
                    AdvDetails.Details.appendChild(targetNode)
                    AdvDetails.countBanners++
                    targetNode.remove()
                }


                const dist_stripe = document.querySelector("div.dist-stripe")
                // dist_stripe?.parentNode.remove()
                if (targetNode) {
                    AdvDetails.Details.appendChild(targetNode)
                    AdvDetails.countBanners++
                }

                const mainElement = document.querySelector('main.body__wrapper');
                if (mainElement) {
                    const targetNode = mainElement.querySelector('div[data-hydration-id] > div.dist-stripe');
                    if (targetNode) {
                        AdvDetails.Details.appendChild(targetNode.parentNode)
                        AdvDetails.countBanners++
                    }
                }

                // Добавление EspeciallyForYou под блок поля поиска
                if (AdvDetails.countBanners > 0) {
                    const ForEspeciallyForYou_Container = document.querySelector('div.body__content')
                    if (ForEspeciallyForYou_Container && AdvDetails.Details.parentNode !== ForEspeciallyForYou_Container) {
                        AdvDetails.Details.querySelector('summary').textContent = messageSpecialOffer('Реклама') + ' (' + AdvDetails.countBanners + ')'
                        ForEspeciallyForYou_Container.appendChild(AdvDetails.Details)
                    }
                }
                // Удаление с наблюдением
                function AD_remove_node(node, mutation_test) {
                    // Кнопка "Установить Яндекс.браузер"
                    let targetNode = document.querySelector('div.link-bro')
                    if (targetNode && targetNode.parentNode !== AdvDetails.Details) {
                        if (AdvDetails.Details.querySelector('div.link-bro')) {
                            targetNode?.remove()
                            // AdvDetails.countBanners--
                        }
                        else {
                            targetNode.style.position = 'unset'
                            targetNode.style.marginTop = '0.3rem'
                            const targetNodeA = targetNode.querySelector('a')
                            if (targetNodeA) targetNodeA.style.marginBottom = 0
                            AdvDetails.Details.appendChild(targetNode)
                            AdvDetails.countBanners++
                            AdvDetails.Details.querySelector('summary').textContent = messageSpecialOffer('Реклама') + ' (' + AdvDetails.countBanners + ')'
                        }
                    }

                    // модальное окно посредине в начале "Сделайте Яндекс главной страницей"
                    targetNode = document.querySelector('div.simple-popup') ||
                        document.querySelector('div.dist-overlay__popup') ||
                        document.querySelector('div.simple-popup_direction_center') ||
                        document.querySelector('div.simple-popup_theme_modal') ||
                        document.querySelector('div.simple-popup_autoclosable_yes') ||
                        document.querySelector('div.simple-popup_overlay_yes') ||
                        document.querySelector('div.simple-popup_has-close_yes') ||
                        document.querySelector('div.simple-popup_delay-close_yes') ||
                        document.querySelector('div.simple-popup_overlay-color_default') ||
                        document.querySelector('div.simple-popup_shown_true') ||
                        document.querySelector('div.simple-popup_delay-close-shown_yes')
                    if (targetNode) {
                        targetNode.style.marginTop = '0.3rem'
                        AdvDetails.Details.appendChild(targetNode)
                        AdvDetails.countBanners++
                        AdvDetails.Details.querySelector('summary').textContent = messageSpecialOffer('Реклама') + ' (' + AdvDetails.countBanners + ')'
                    }

                }
                function AD_remove() {
                    const targetNode = document.querySelector('div.search3__inner') // более точный блок для наблюдения изменений
                    if (targetNode) {
                        clearInterval(interval_AD_remove)
                        AD_remove_node()
                        const observer = new MutationObserver((mutationsList, observer) => {
                            for (let mutation of mutationsList) {
                                if (mutation.type === 'childList') {
                                    mutation.addedNodes.forEach(node => {
                                        if (node.nodeName === 'DIV') {
                                            AD_remove_node(node, mutation)
                                        }
                                    });
                                }
                            }
                        });
                        observer.observe(targetNode, observer_config)
                        observers.push(observer)
                    }
                }

                AD_remove()
                const interval_AD_remove = setInterval(AD_remove, 500)

                }
        }
        // каталог игр
        else if (YANDEX_games_collection_ON && currentURL.startsWith('https://yandex.ru/games/') && !currentURL.startsWith('https://yandex.ru/games/app/')) {
            // реклама в каталоге игр
            function AD_remove_node(node, mutation_test) {
                const nodeDiv = node.querySelector('div')
                // Проверяем, является ли элемент div и не содержит ли он указанные классы
                if (nodeDiv &&
                    !nodeDiv.classList.contains('feed_block_suggested') &&
                    !nodeDiv.classList.contains('feed_block_categorized')) {
                    node.remove()
                }
            }
            function AD_remove() {
                const targetNodes = document.querySelectorAll('div.page__page.main-page > div#feeds > div.adaptive-width')
                targetNodes?.forEach(node => {
                    AD_remove_node(node)
                });
                document.querySelectorAll('div[data-testid="feed-grid-banner"]')?.forEach(node => {
                    node.remove()
                });
            }
            const interval_AD_remove = setInterval(AD_remove, 500);

            const observer = new MutationObserver((mutationsList, observer) => {
                clearInterval(interval_AD_remove) // отключение проверки по интервалу
                for (let mutation of mutationsList) {
                    if (mutation.type === 'childList') {
                        mutation.addedNodes.forEach(node => {
                            if (node.nodeName === 'DIV') {
                                if (node.className === 'adaptive-width') {
                                    AD_remove_node(node, mutation)
                                }
                            }
                            else if (node.nodeName === 'LI' && node.matches('li.grid-list__game-item_adv')) {
                                // document.querySelectorAll('div[data-testid="feed-grid-banner"]')?.forEach(node => {
                                //     node.remove()
                                // });
                                node.remove()
                            }
                        });

                    }
                }
            });
            // observer.observe(document.querySelector('div.page__right'), observer_config)
            observer.observe(document.body, observer_config)

            observers.push(observer)
        }
        // на странице игры
        // Изменено: 2025-02-03 20:47, Автор:
        else if (YANDEX_games_app_ON && currentURL.startsWith('https://yandex.ru/games/app/')) {

            function Удаление_рекламы(node, mutation_test) {
                // до включения обсервера
                if (!node) {
                    // центральный баннер: использвется в играх для наград - заменить на отключение только изображения внутри
                    if (YANDEX_игры_app_AD_центральный_ВКЛ) {
                        const Реклама_в_центральном_баннере = document.querySelector('div.prowo__inner')
                        if (Реклама_в_центральном_баннере)
                            Реклама_в_центральном_баннере.style.display = 'none'
                        // центральный баннер: кнопка закрытия
                        const Вложенная_нода = document.querySelector('span[data-testid="YandexFullscreenRender-Button"]')
                        if (Вложенная_нода) {
                            // stop
                            // Вложенная_нода.click() // вызывает глюк запуска игры
                            Центральный_баннер__Наблюдение_за_изменяемым_родителем(Вложенная_нода)

                        }
                    }
                    // правый блок рекламы
                    if (YANDEX_игры_app_AD_правый_ВКЛ) {
                        // устарело. Пока оставлено.
                        // const targetStackDivs = document.querySelectorAll('div.stack > div')
                        // targetStackDivs?.forEach(node => {
                        //     // Проверяем, заканчивается ли класс на __desktop-disable-ad-button-wrapper
                        //     node.classList.forEach(className => {
                        //         if (className.endsWith('__desktop-disable-ad-button-wrapper')) {
                        //             node.parentNode.remove();
                        //         }
                        //     });
                        // });
                        const Правый_блок = document.querySelector('div[class*="desktop-wrapper"]') || document.querySelector('div.sticky-banner-container' || document.querySelector('div[class*="desktop-wrapper_with-disable]'))
                        if (Правый_блок)
                            Правый_блок.style.display = 'none'
                        // кнопка "Отключить рекламу"
                        const кнопка_ОтключитьРекламу = document.querySelector('button[data-testid="DisableAd-Button"]')
                        if (кнопка_ОтключитьРекламу)
                            кнопка_ОтключитьРекламу.parentNode.parentNode.style.display = 'none'
                    }
                    // ротационный баннер
                    const targetNode_RotateBanner = document.querySelector('div.rotate-banner')
                    if (targetNode_RotateBanner)
                        targetNode_RotateBanner.style.display = 'none'

                    // нижний ряд других игр
                    if (YANDEX_игры_app_AD_нижний_ряд_других_игр_ВКЛ)
                        document.querySelector('div.play-similar-games > span.close-button')?.click()

                }
                // после включения обсервера
                else {
                    if (node.nodeName === 'DIV') {
                        // правый блок рекламы
                        if (YANDEX_игры_app_AD_правый_ВКЛ &&
                            (node.matches('div[class*="desktop-wrapper"]') || node.matches('div[class*="sticky-banner-container"]') || node.matches('div[class*="desktop-wrapper_with-disable]'))
                           ) {
                            node.style.display = 'none'
                            // кнопка "Отключить рекламу"
                            const кнопка_ОтключитьРекламу = document.querySelector('button[data-testid="DisableAd-Button"]')
                            if (кнопка_ОтключитьРекламу)
                                кнопка_ОтключитьРекламу.parentNode.parentNode.style.display = 'none'
                        }
                        // нижний ряд других игр
                        else if (YANDEX_игры_app_AD_нижний_ряд_других_игр_ВКЛ && node.matches('div.play-similar-games')) {
                            node.querySelector('div.play-similar-games__all-games-tile > span.close-button')?.click() // клик по кнопке закрытия
                            node?.remove()
                        }
                        // центральный баннер
                        // else if (node.matches('div.play-modal_with-blur')) {
                        //     node.parentNode.style.display = 'none'
                        //     // node?.remove()
                        // }
                        else if (YANDEX_игры_app_AD_центральный_ВКЛ && node.matches('div.prowo__inner')) {
                            node.style.display = 'none'
                        }
                        else if (YANDEX_игры_app_AD_центральный_ВКЛ && node.matches('span[data-testid="YandexFullscreenRender-Button"]')) {
                            Центральный_баннер__Наблюдение_за_изменяемым_родителем(node)
                        }
                        // Проверяем вложенные элементы
                        else {
                            let Вложенная_нода
                            // центральный баннер
                            if (YANDEX_игры_app_AD_центральный_ВКЛ) {
                                Вложенная_нода = node.querySelector('div.prowo__inner')
                                if (Вложенная_нода) {
                                    Вложенная_нода.style.display = 'none'
                                }
                                // кнопка закрытия
                                Вложенная_нода = node.querySelector('span[data-testid="YandexFullscreenRender-Button"]')
                                if (Вложенная_нода) {
                                    // stop
                                    // Вложенная_нода.click() // вызывает глюк запуска игры
                                    Центральный_баннер__Наблюдение_за_изменяемым_родителем(Вложенная_нода)

                                }
                            }
                        }


                    }

                }

                function Центральный_баннер__Наблюдение_за_изменяемым_родителем(Вложенная_нода) {
                    const Наблюдаемый_родитель = Вложенная_нода.closest('.play-modal, .play-modal_yandex');
                    if (Наблюдаемый_родитель) {
                        if (Наблюдаемый_родитель.classList.contains('play-yandex-modal_visible') ||
                            Наблюдаемый_родитель.classList.contains('play-modal_visible')) {
                            Вложенная_нода.click()
                        }
                        // Создаем наблюдатель за изменениями
                        const observer = new MutationObserver((mutations) => {
                            // Проверяем наличие нужных классов после изменения
                            if (Наблюдаемый_родитель.classList.contains('play-yandex-modal_visible') ||
                                Наблюдаемый_родитель.classList.contains('play-modal_visible')) {
                                // Наблюдатель не отключаем так как рекламный блок вновь появляется на экране с теми же изменениями
                                // observer.disconnect()
                                Вложенная_нода.click() // клик по кнопке закрытия
                            }
                        });

                        // Настраиваем и запускаем наблюдение за изменениями класса
                        observer.observe(Наблюдаемый_родитель, {
                            attributes: true,
                            attributeFilter: ['class']
                        });

                    }

                }
            }


            const observer = new MutationObserver((mutationsList, observer) => {
                for (let mutation of mutationsList) {
                    if (mutation.type === 'childList') {
                        mutation.addedNodes.forEach(node => {
                            Удаление_рекламы(node)
                        });

                    }
                }
            });
            // observer.observe(document.getElementById('mount'), observer_config)
            observer.observe(document.body, observer_config)
            observers.push(observer)
            Удаление_рекламы()

        }
        // Яндекс: почтовый ящик
        // Изменено: 2025-01-28 20:01, Автор:
        else if (YANDEX_email_ON && currentURL.startsWith('https://mail.yandex.ru/')) {
            function Удаление_рекламы(node, mutation_test) {
                // до включения обсервера
                if (!node) {
                    // реклама справа от списка писем
                    document.querySelector('.js-scroller-right')?.remove()
                    // реклама над списком писем
                    document.getElementById('js-messages-direct')?.remove()
                    if (currentURL.startsWith('https://mail.yandex.ru/lite/')) {
                        // реклама над списком писем
                        document.querySelector('div[class*="direct-stripe"]')?.remove()
                    }
                }
                // после включения обсервера
                else {
                    // Проверяем добавленный элемент
                    if (node.matches('div.js-scroller-right') || node.id === 'js-messages-direct') {
                        node.remove()
                    }
                    // Проверяем вложенные элементы
                    else {
                        let Вложенный_элемент
                        // реклама справа от списка писем
                        Вложенный_элемент = node.querySelector('div.js-scroller-right')
                        if (Вложенный_элемент) {
                            Вложенный_элемент.remove()
                        }
                        // реклама над списком писем
                        Вложенный_элемент = node.querySelector('#js-messages-direct')
                        if (Вложенный_элемент) {
                            Вложенный_элемент.remove()
                        }
                    }
                    if (currentURL.startsWith('https://mail.yandex.ru/lite/')) {
                        // реклама над списком писем
                        // Функция для проверки, принадлежит ли элемент классу, содержащему фрагмент 'direct-stripe'
                        function hasDirectStripeClass(node) {
                            if (node && node.classList) {
                                return Array.from(node.classList).some(className => className.includes('direct-stripe'));
                            }
                            return false;
                        }
                        if (hasDirectStripeClass(node)) {
                            node.remove()
                        }
                        else {
                            node.querySelector('div[class*="direct-stripe"]')?.remove()
                        }
                    }
                }
            }

            Удаление_рекламы()
            const интервал__Удаление_рекламы = setInterval(Удаление_рекламы, 500)

            const callback = function (mutationsList, observer) {
                clearInterval(интервал__Удаление_рекламы) // На смену приходит обсервер
                for (const mutation of mutationsList) {
                    // Проверяем, были ли добавлены новые узлы
                    if (mutation.type === 'childList') {
                        mutation.addedNodes.forEach(node => {
                            if (node.nodeType === Node.ELEMENT_NODE) {
                                Удаление_рекламы(node)
                            }
                        })
                    }
                }
            }

            const observer = new MutationObserver(callback)
            observers.push(observer)

            // Начинаем наблюдение за изменениями в DOM
            observer.observe(document.body, {
                childList: true, // Отслеживать добавление/удаление дочерних элементов
                subtree: true,   // Отслеживать изменения во всем поддереве
            })
        }
        // Яндекс: диск
        // Изменено: 2025-01-29 22:01, Автор:
        else if (YANDEX_disk_ON && currentURL.startsWith('https://disk.yandex.ru/')) {
            // реклама внизу слева

            function Удаление_рекламы(node, mutation_test) {
                // до включения обсервера
                if (!node) {
                    // реклама вверху
                    document.querySelector('div.top-direct-line')?.remove()
                }
                // после включения обсервера
                else {
                    // Проверяем добавленный элемент
                    // реклама вверху
                    if (node.matches('div.top-direct-line')) {
                        node.remove()
                    }
                    // Проверяем вложенные элементы
                    else {
                        let Вложенный_элемент
                        // реклама вверху
                        Вложенный_элемент = node.querySelector('div.top-direct-line')
                        if (Вложенный_элемент) {
                            Вложенный_элемент.remove()
                        }
                    }

                }
            }

            Удаление_рекламы()
            const интервал__Удаление_рекламы = setInterval(Удаление_рекламы, 500)

            const callback = function (mutationsList, observer) {
                clearInterval(интервал__Удаление_рекламы) // На смену приходит обсервер
                for (const mutation of mutationsList) {
                    // Проверяем, были ли добавлены новые узлы
                    if (mutation.type === 'childList') {
                        mutation.addedNodes.forEach(node => {
                            if (node.nodeType === Node.ELEMENT_NODE) {
                                Удаление_рекламы(node)
                            }
                        })
                    }
                }
            }

            const observer = new MutationObserver(callback)
            observers.push(observer)

            // Начинаем наблюдение за изменениями в DOM
            observer.observe(document.body, {
                childList: true, // Отслеживать добавление/удаление дочерних элементов
                subtree: true,   // Отслеживать изменения во всем поддереве
            })
        }
        // Яндекс: карты
        else if (YANDEX_maps_ON && currentURL.startsWith('https://yandex.ru/maps/')) {
            // реклама справа
            function AD_remove_first() {
                // реклама справа
                const RightBlockFromImages = document.querySelector('div[data-chunk="promo"]')
                if (RightBlockFromImages) RightBlockFromImages.parentNode.parentNode.parentNode.remove()
                // реклама слева
                const LeftBlock = document.querySelector('div.banner-view')
                if (LeftBlock) LeftBlock.parentNode.parentNode.parentNode.remove()
                // маленькая рекламная кнопка сверху
                const TopBlock = document.querySelector('div.map-controls__additional-button')
                if (TopBlock) TopBlock.parentNode.remove()
                const LeftBlockFromPlaces = document.querySelector('div.banner-view')
                if (LeftBlockFromPlaces) LeftBlockFromPlaces.parentNode.remove()
            }
            // требует донастройки
            function AD_remove() {
                // const targetNode = document.querySelector('div._has-banner') // более глобальный блок
                const targetNode = document.querySelector('div.banner-view') // более точный блок
                if (targetNode) {
                    clearInterval(interval_AD_remove)
                    AD_remove_first()
                    const observer = new MutationObserver((mutationsList, observer) => {
                        for (let mutation of mutationsList) {
                            if (mutation.type === 'childList') {
                                mutation.addedNodes.forEach(node => {
                                    if (node.nodeName === 'DIV') {
                                        AD_remove_first()
                                    }
                                });
                            }
                        }
                    });
                    observer.observe(targetNode, observer_config)
                    observers.push(observer)
                }
            }
            const interval_AD_remove = setInterval(AD_remove, 500);
        }
        // https://yandex.ru/health
        // брать за образец в случае рекламы внутри наблюдаемой ноды
        else if (YANDEX_health_ON && currentURL.startsWith('https://yandex.ru/health')) {

            function AD_remove_node(node, mutation_test) {
                let targetNode
                let targetNodes

                // баннер сверху
                // реклама по всем направлениям
                targetNodes = document.querySelectorAll('div.advert_type_horizontal')
                targetNodes.forEach(node => {
                    node.remove()
                })
                targetNodes = document.querySelectorAll('span.advert_type_horizontal')
                targetNodes.forEach(node => {
                    node.remove()
                })

                // правый стобец
                targetNode = document.querySelector('div.row__col.layout__right')
                targetNode?.remove()

            }
            // Удаление с наблюдением
            function AD_remove() {
                AD_remove_node()
                const observer = new MutationObserver((mutationsList, observer) => {
                    for (let mutation of mutationsList) {
                        if (mutation.type === 'childList') {
                            mutation.addedNodes.forEach(node => {
                                if (node.nodeName === 'DIV') {
                                    AD_remove_node(node, mutation)
                                }
                            });
                        }
                    }
                });
                observer.observe(document.body, observer_config)
                observers.push(observer)
            }
            AD_remove()
        }

        // Яндекс.погода: карта
        else if (DZEN_pogoda_maps_ON && currentURL.startsWith('https://dzen.ru/pogoda/maps/')) {
            // внизу справа "Сделать поиск Яндекса основным?"
            yandex_dzen_questionYandexGeneralSearch()

            // реклама слева
            const targetNode_leftColumn = document.querySelector('div.weather-maps__ad.weather-maps__ad_visible_yes.map-left-pane__ad')
            if (targetNode_leftColumn) {
                targetNode_leftColumn.remove()
            }

        }
        // Яндекс.погода: сводка
        else if (DZEN_pogoda_details_ON && (currentURL.startsWith('https://dzen.ru/pogoda/?via=hl') || currentURL.startsWith('https://dzen.ru/pogoda/details') || currentURL.startsWith('https://dzen.ru/pogoda/?'))) {

            // реклама справа
            const targetNode_rightColumn = document.querySelector('div#content_right.content__right')
            if (targetNode_rightColumn) {
                targetNode_rightColumn.remove()
            }

            // реклама в теле страницы
            // первый блок
            const DivsTopAD = document.querySelector('div.adv_pos_index-details_top');
            if (DivsTopAD) {
                DivsTopAD.parentNode.remove()
            }
            // последующие блоки
            // Выбираем все div
            const allDivs = document.querySelectorAll('article.card.card_without-card-decoration');
            allDivs.forEach(div => {
                div.remove();
            });
            const observer = new MutationObserver((mutationsList, observer) => {
                for (let mutation of mutationsList) {
                    if (mutation.type === 'childList') {
                        // console.log('Новые узлы добавлены:', mutation.addedNodes);
                        mutation.addedNodes.forEach(node => {
                            if (node.nodeName === 'STYLE') {
                                const allDivs = document.querySelectorAll('article.card.card_without-card-decoration');
                                allDivs.forEach(div => {
                                    div.remove();
                                });
                            }
                        });

                    }
                }
            });
            observer.observe(document.body, observer_config)
            observers.push(observer)

            yandex_dzen_questionYandexGeneralSearch()

        }
        // Яндекс.погода: на месяц
        else if (DZEN_pogoda_month_ON && currentURL.startsWith('https://dzen.ru/pogoda/month')) {

            // реклама справа страницы
            let targetNode_rightColumn
            targetNode_rightColumn = document.querySelector('section.content__section.content__section_type_adv')
            if (targetNode_rightColumn) {
                targetNode_rightColumn.remove()
            }
            targetNode_rightColumn = document.querySelector('div.climate-calendar-container__adv-wide')
            if (targetNode_rightColumn) {
                targetNode_rightColumn.remove()
            }
        }
        // Дзен.Статьи
        // брать за образец в случае рекламы внутри наблюдаемой ноды
        else if (DZEN_articles_ON && currentURL.startsWith('https://dzen.ru/a/')) {
            let targetNode_observer
            function AD_remove_node(node, mutation_test) {
                // верхний баннер
                targetNode_observer.querySelector('div#top-banner')?.remove()
                const targetNodes = targetNode_observer.querySelectorAll('aside:not(.navigation-sidebar__container-TO)') ||
                      targetNode_observer.querySelectorAll('ya-recommendation-widget')
                targetNodes.forEach(node => {
                    node?.remove()
                })
                // рекламные блоки справа
                // 'div.article-right-ad-block__sticky' 'div.article-right-ad-block__main' 'div.article-right-ad-block__ad-content-wrapper'
                targetNode_observer.querySelectorAll('div[class^="article-right-ad-block__"]').forEach(node => {
                    node?.remove()
                })
                // рекламные блоки снизу статьи
                if (node) {
                    targetNode_observer.querySelectorAll('div[class^="ad-split-embed"][id]').forEach(node => {
                        // ad-split-embed__container
                        node?.remove()
                    })
                }
            }
            function AD_remove() {
                document.querySelectorAll('div.content--article-item__sideColumn-3P').forEach(node => {node.remove()})
                targetNode_observer = document.querySelector('div#page-root') // более точный блок для наблюдения изменений
                if (targetNode_observer) {
                    clearInterval(interval_AD_remove)
                    AD_remove_node()
                    const observer = new MutationObserver((mutationsList, observer) => {
                        for (let mutation of mutationsList) {
                            if (mutation.type === 'childList') {
                                mutation.addedNodes.forEach(node => {
                                    if (node.nodeName === 'DIV') {
                                        AD_remove_node(node, mutation)
                                    }
                                });
                            }
                        }
                    });
                    observer.observe(targetNode_observer, observer_config)
                    observers.push(observer)
                }
            }
            const interval_AD_remove = setInterval(AD_remove, 500)

            }
        // Дзен.Видео
        // брать за образец в случае рекламы внутри наблюдаемой ноды
        else if (DZEN_video_ON && currentURL.startsWith('https://dzen.ru/video/')) {
            function AD_remove_node(node, mutation_test) {
                // document.querySelectorAll('div[class^="video-card-ad"]').forEach(node => {
                document.querySelectorAll('div.video-card-ads').forEach(node => {
                    node?.remove()
                })
            }
            const observer = new MutationObserver((mutationsList, observer) => {
                for (let mutation of mutationsList) {
                    if (mutation.type === 'childList') {
                        mutation.addedNodes.forEach(node => {
                            if (node.nodeName === 'DIV') {
                                AD_remove_node(node, mutation)
                            }
                        });
                    }
                }
            });
            observer.observe(document.body, observer_config)
            observers.push(observer)
            AD_remove_node()

            // Удаление видеорекламы
            if (currentURL.startsWith('https://dzen.ru/video/watch/')) {
                function ADvideo_remove() {
                    // Находим ноду <yaplayertag>
                    const yaplayertag = document.querySelector('yaplayertag')
                    if (yaplayertag) {
                        // Проверяем непосредственные потомки yaplayertag
                        const children = yaplayertag.children
                        if (children.length > 2) { // дочерние элементы заполняются на странице не сразу - ждём заполнения
                            clearInterval(interval_ADvideo_remove)
                            // Создаем массив для хранения div, которые нужно удалить
                            const divsToRemove = [];

                            for (let i = 0; i < children.length; i++) {
                                const child = children[i];
                                if (child.tagName === 'DIV' && !child.querySelector('video')) {
                                    divsToRemove.push(child);
                                }
                            }

                            // Удаляем все найденные div
                            divsToRemove.forEach(div => yaplayertag.removeChild(div))
                        }
                    }
                }
                const interval_ADvideo_remove = setInterval(ADvideo_remove, 500)
                }
        }
        // Дзен.Shorts
        // брать за образец в случае рекламы внутри наблюдаемой ноды
        else if (DZEN_shorts_ON && currentURL.startsWith('https://dzen.ru/shorts/')) {
            function AD_remove_node(node, mutation_test) {
                // банерок вверху справа
                // возможно, для более точноо поиска: auto-slide-ad__ ; более общий правый блок: short-viewer-layout__
                if (!node) { // первый вызов без обсервера
                    // document.querySelectorAll('div[class^="short-viewer-layout__rightSidebarWrapper"]').forEach(node => {
                    //     node?.remove()
                    // })
                    // возникает в единственном экземпляре
                    document.querySelector('div[class^="short-viewer-layout__rightSidebarWrapper"]')?.remove()
                }
                else { // вызов из обсервера
                    if (node.tagName === 'DIV') {
                        const classList = node.classList;
                        // for (let i = 0; i < classList.length; i++) {
                        //     if (classList[i].startsWith('short-viewer-layout__rightSidebarWrapper')) {
                        //         node?.remove()
                        //         break
                        //     }
                        // }
                        if (classList.contains('auto-slide-ad__container-1D')) {
                            node?.remove()
                            return true
                        }
                    }
                }
                // предложение скачат приложение по QR-коду
                document.querySelector('div.Modal')?.remove()

                return false
            }
            const observer = new MutationObserver((mutationsList, observer) => {
                for (let mutation of mutationsList) {
                    if (mutation.type === 'childList') {
                        mutation.addedNodes.forEach(node => {
                            if (node.nodeName === 'DIV') {
                                // при срабатывании удаления рекламы отключаетяс наблюдение, так как реклама бльше не появляется
                                // не отключаем наблюдение, так как появляются разные предлагалки. Красивые предлагалки по теме конкретного видео справа от видео не удаляю - такой и должна быть умная реклама
                                // if (AD_remove_node(node, mutation)) observer.disconnect()
                                AD_remove_node(node, mutation)
                            }
                        });
                    }
                }
            });
            observer.observe(document.body, observer_config)
            observers.push(observer)
            AD_remove_node()
        }

        // Дзен: общее
        // брать за образец в случае хаотичной рекламы
        else if (DZEN_ON && (currentURL.startsWith('https://dzen.ru/') || currentURL.startsWith('https://m.dzen.ru/'))) {
            if (isMobileDevice()) {
                // верхний баннер
                document.querySelectorAll('div[class*="dzen-mobile--dzen-mobile__hasBanner"]').forEach(node => {node?.remove()})
                // const observer = new MutationObserver((mutationsList, observer) => {
                //     for (let mutation of mutationsList) {
                //         if (mutation.type === 'childList') {
                //             mutation.addedNodes.forEach(node => {
                //                 if (node.nodeName === 'DIV') {
                //                     document.querySelectorAll('div[class*="dzen-mobile--dzen-mobile__hasBanner"]').forEach(node => {node?.remove()})
                //                 }
                //             })
                //         }
                //     }
                // })
                // observer.observe(document.body, observer_config)
                // observers.push(observer)
            }
            else {
                // Добавление кнопки "Реклама"
                const EspeciallyForYou = CreateEspeciallyForYou()
                let targetNode_observer


                function AD_remove_node(node, mutation_test) {
                    let targetNode
                    let targetNodes
                    // курсы валют и нефти (сделать опциональным)
                    targetNode = document.querySelector('div.header-widgets__rates-ii')
                    if (targetNode && targetNode.parentNode !== EspeciallyForYou) {
                        if (EspeciallyForYou.querySelector('div.header-widgets__rates-ii')) {
                            targetNode?.remove()
                        }
                        else {
                            targetNode.style.position = 'unset'
                            targetNode.style.marginTop = '0.3rem'
                            const targetNodeA = targetNode.querySelector('a')
                            if (targetNodeA) targetNodeA.style.marginBottom = 0
                            EspeciallyForYou?.appendChild(targetNode)
                        }
                    }

                    // Кнопка "Установить Яндекс.браузер" под поиском
                    // targetNode = document.querySelector('div#ya-dist-link_bro')
                    // if (targetNode && targetNode.parentNode !== EspeciallyForYou) {
                    //     if (EspeciallyForYou.querySelector('div#ya-dist-link_bro')) {
                    //         // targetNode?.remove()
                    //     }
                    //     else {
                    //         targetNode.style.position = 'unset'
                    //         targetNode.style.marginTop = '0.3rem'
                    //         const targetNodeA = targetNode.querySelector('a')
                    //         if (targetNodeA) targetNodeA.style.marginBottom = 0
                    //         EspeciallyForYou?.appendChild(targetNode)
                    //     }
                    // }

                    // Кнопка "Установить Яндекс.браузер" внизу справа
                    targetNode = document.querySelector('div#ya-dist-teaser')
                    if (targetNode) targetNode?.remove()
                    // баннер сверху
                    targetNodes = document.querySelectorAll('div[data-testid="ad-banner"]')
                    if (targetNodes.length > 0) {
                        const targetNodes_EspeciallyForYou = EspeciallyForYou.querySelectorAll('div[data-testid="ad-banner"]')
                        if (targetNodes_EspeciallyForYou.length > 0) {
                            targetNodes.forEach(node => {
                                if (node.parentNode !== EspeciallyForYou) {
                                    node.remove()
                                }
                            })
                        }
                        else {
                            targetNodes.forEach(node => {
                                node.style.marginTop = '0.3rem'
                                EspeciallyForYou?.appendChild(node)
                            })
                        }
                    }
                    // реклама в видеоблоках
                    document.querySelectorAll('div.zenad-card-rtb__ad').forEach(node => {node?.remove()})
                    // Модальное окно "Яндекс станет основным поиском"
                    document.querySelector('div#ya-dist-splashscreen')?.remove()
                    // Слева вверху "Сделать поиск Яндекса основным?"
                    document.querySelector('div#ya-dist-popup')?.remove()
                    // Добавление EspeciallyForYou под блок поля поиска
                    const ForEspeciallyForYou_Container = document.querySelector('div#banner-view') || document.querySelector('div#LayoutTopMicroRoot')
                    if (ForEspeciallyForYou_Container && EspeciallyForYou.parentNode !== ForEspeciallyForYou_Container) {
                        ForEspeciallyForYou_Container.appendChild(EspeciallyForYou)
                    }

                }

                //
                // Удаление с наблюдением
                function AD_remove() {
                    targetNode_observer = document.querySelector('div#banner-view') || document.querySelector('div#LayoutTopMicroRoot') // более точный блок для наблюдения изменений
                    document.querySelectorAll('div.content--article-item__sideColumn-3P').forEach(node => {node?.remove()})
                    if (targetNode_observer) {
                        clearInterval(interval_AD_remove)
                        AD_remove_node()
                        const observer = new MutationObserver((mutationsList, observer) => {
                            for (let mutation of mutationsList) {
                                if (mutation.type === 'childList') {
                                    mutation.addedNodes.forEach(node => {
                                        if (node.nodeName === 'DIV') {
                                            AD_remove_node(node, mutation)
                                        }
                                    });
                                }
                            }
                        });
                        observer.observe(targetNode_observer, observer_config)
                        observers.push(observer)
                    }
                }
                const interval_AD_remove = setInterval(AD_remove, 500)

                }


            // Изменено: 2025-01-30 20:53, Автор:
            let Блок_коллекции_статей_и_видео = document.querySelector('#LayoutContentMicroRoot')
            if (Блок_коллекции_статей_и_видео)
                наблюдатель__Коллекция_видео__установка(Блок_коллекции_статей_и_видео)

            function Удаление_рекламы(node, mutation_test) {
                // до включения обсервера
                if (!node) {
                    // Реклама в видеоблоках
                    if (Блок_коллекции_статей_и_видео)
                        Блок_коллекции_статей_и_видео.querySelectorAll('div[class*="dzen-desktop--card-rtb__"]').forEach(node => {node?.remove()})
                    else // на всякий случай, но этого не будет
                        document.querySelectorAll('div[class*="dzen-desktop--card-rtb__"]').forEach(node => {node?.remove()})
                }
                // после включения обсервера
                else {
                    // Реклама в видеоблоках
                    // Проверяем добавленный элемент
                    if (node.matches('div[class*="dzen-desktop--card-rtb__"]')) {
                        node.remove()
                    }
                    // Проверяем вложенные элементы
                    else {
                        node.querySelectorAll('div[class*="dzen-desktop--card-rtb__"]').forEach(node => {node?.remove()})
                    }

                }
            }


            function наблюдатель__Коллекция_видео__установка(целевой_элемент) {
                const callback = function (mutationsList, observer) {
                    for (const mutation of mutationsList) {
                        // Проверяем, были ли добавлены новые узлы
                        if (mutation.type === 'childList') {
                            mutation.addedNodes.forEach(node => {
                                if (node.nodeType === Node.ELEMENT_NODE) {
                                    Удаление_рекламы(node)
                                }
                            })
                        }
                    }
                }

                const наблюдатель__Коллекция_видео = new MutationObserver(callback)
                const config = {
                    childList: true, // Отслеживать добавление/удаление дочерних элементов
                    subtree: true,   // Отслеживать изменения во всем поддереве
                }
                наблюдатель__Коллекция_видео.observe(целевой_элемент, config)
                observers.push(наблюдатель__Коллекция_видео)
                Удаление_рекламы()

            }

            const наблюдатель__Появление_на_странице_нод_для_наблюдения = new MutationObserver((mutations) => {
                mutations.forEach((mutation) => {
                    if (mutation.type === 'childList') {
                        mutation.addedNodes.forEach(node => {
                            if (node.nodeType === Node.ELEMENT_NODE) {
                                // Блок коллекции_видео
                                // Проверяем добавленный элемент
                                let целевой_элемент // переменная для всех наблюдаемых нод
                                if (!Блок_коллекции_статей_и_видео) {
                                    if (node.matches('#LayoutContentMicroRoot')) {
                                        Блок_коллекции_статей_и_видео = node
                                        наблюдатель__Коллекция_видео__установка(Блок_коллекции_статей_и_видео)
                                    }
                                    // Проверяем вложенные элементы
                                    else {
                                        целевой_элемент = node.querySelector('#LayoutContentMicroRoot')
                                        if (целевой_элемент) {
                                            Блок_коллекции_статей_и_видео = целевой_элемент
                                            наблюдатель__Коллекция_видео__установка(Блок_коллекции_статей_и_видео)
                                        }
                                    }
                                }
                                if (Блок_коллекции_статей_и_видео) {
                                    наблюдатель__Появление_на_странице_нод_для_наблюдения.disconnect() // сразу прекращаем наблюдение так как других целевых нод пока нет
                                }
                            }
                        })
                    }
                });
            });

            const config = {
                childList: true, // Отслеживать добавление/удаление дочерних элементов
                subtree: true,   // Отслеживать изменения во всем поддереве
            }
            наблюдатель__Появление_на_странице_нод_для_наблюдения.observe(document.body, config)
            observers.push(наблюдатель__Появление_на_странице_нод_для_наблюдения)



        }
        // vk.com
        else if (VK_ON && currentURL.startsWith('https://vk.com/')) {
            // реклама слева

            function AD_remove() {
                const targetNode_leftColumn = document.querySelector('div#ads_left')
                if (targetNode_leftColumn) {
                    clearInterval(interval_AD_remove)
                    targetNode_leftColumn.remove()
                }

            }
            const interval_AD_remove = setInterval(AD_remove, 500);


            // реклама в теле страницы
            const spans = document.querySelectorAll('span.PostHeaderSubtitle__item');
            for (let span of spans) {
                if (span.textContent === 'Реклама в сообществе') {
                    span.parentNode.parentNode.parentNode.parentNode.parentNode.remove();
                }
            }

            const observer = new MutationObserver((mutationsList, observer) => {
                for (let mutation of mutationsList) {
                    if (mutation.type === 'childList') {
                        // console.log('Новые узлы добавлены:', mutation.addedNodes);
                        mutation.addedNodes.forEach(node => {
                            if (node.nodeName === 'DIV') {

                                if (node.classList.contains('page_block') &&
                                    node.classList.contains('no_posts')) {

                                    const spans = document.querySelectorAll('span.PostHeaderSubtitle__item');
                                    // if (spans.length > 0) { // на время тестирования
                                    spans.forEach(span => {
                                        if (span.textContent === 'Реклама в сообществе') {
                                            span.parentNode.parentNode.parentNode.parentNode.parentNode.remove();
                                        }
                                    });
                                    // }


                                }


                            }
                        });

                    }
                }
            });
            observer.observe(document.querySelector('div#public'), observer_config)
            observers.push(observer)
        }
        // vkvideo.ru
        else if (VK_VIDEO_ON && currentURL.startsWith('https://vkvideo.ru/video-')) {
            // реклама слева

            function Video_AD_remove() {
                const videoplayer_ads_actions = document.querySelector('div.videoplayer_ads_actions')
                if (videoplayer_ads_actions)
                    videoplayer_ads_actions.style.display = 'none'
                document.querySelector('div.rb-adman-ad-actions')?.remove()
                document.querySelector('div.videoplayer_ads_media_el')?.remove()
                document.querySelector('div.videoplayer_ads')?.remove()
            }
            const interval_AD_remove = setInterval(Video_AD_remove, 500);

            const observer = new MutationObserver((mutationsList, observer) => {
                clearInterval(interval_AD_remove)
                for (let mutation of mutationsList) {
                    if (mutation.type === 'childList') {
                        // console.log('Новые узлы добавлены:', mutation.addedNodes);
                        mutation.addedNodes.forEach(node => {
                            if (node.nodeName === 'DIV') {
                                if (node.classList.contains('videoplayer_ads_actions') ) {
                                    node.style.display = 'none'
                                    node.remove()
                                }
                                else if (node.classList.contains('rb-adman-ad-actions')  ||
                                         node.classList.contains('videoplayer_ads_media_el') ||
                                         node.classList.contains('videoplayer_ads')
                                        ) {
                                    node.remove()
                                }
                                else if (node.classList.contains('videoplayer_status_icon')
                                        ) {

                                    const videoplayer_ads_actions = document.querySelector('div.videoplayer_ads_actions')
                                    if (videoplayer_ads_actions)
                                        videoplayer_ads_actions.style.display = 'none'
                                    document.querySelector('div.rb-adman-ad-actions')?.remove()
                                    document.querySelector('div.videoplayer_ads_media_el')?.remove()
                                    document.querySelector('div.videoplayer_ads')?.remove()

                                }
                            }
                        });
                    }
                }
            });
            observer.observe(document.getElementById('react_rootVideo_page'), observer_config)
            observers.push(observer)
        }

        // ok.ru
        else if (currentURL.startsWith('https://ok.ru/') && OK_ON) {
            // реклама справа
            function AD_remove() {
                const targetNode_rightColumn = document.querySelector('div#rightColumn')
                if (targetNode_rightColumn) {
                    clearInterval(interval_AD_remove)
                    targetNode_rightColumn.remove()
                }
            }
            const interval_AD_remove = setInterval(AD_remove, 500);
            // реклама слева
            function AD_Left_remove() {
                const targetNode_LeftColumn = document.querySelector('div#hook_Block_StickyBannerContainer')
                if (targetNode_LeftColumn) {
                    clearInterval(interval_AD_Left_remove)
                    targetNode_LeftColumn.remove()
                }
            }
            const interval_AD_Left_remove = setInterval(AD_Left_remove, 500);
        }

    }

    // Добавлекние раскрывающегося блока "Реклама"
    function CreateEspeciallyForYou() {
        // Создание стилей с помощью JavaScript
        const style = document.createElement("style")
        style.textContent = `
                details {
                    // display: none;
                    font-family: Arial, sans-serif;
                    font-size: 18px;
                    color: #333;
                    position: relative;
                    padding: 10px;
                    border: 1px solid #ccc;
                    border-radius: 5px;
                    background-color: #fff;
                    max-height: 50vh;
                    overflow-y: auto;
                }
                summary {
                    cursor: pointer;
                    outline: none;
                    position: relative;
                    z-index: 1;
                    color: #df4a0f; /* Изменение цвета текста на красный */
                }
                .shimmer {
                    position: absolute;
                    top: 0;
                    left: 0;
                    width: 100%;
                    height: 100%;
                    background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.5) 50%, rgba(255, 255, 255, 0) 100%);
                    animation: shimmer 60s linear infinite;
                    pointer-events: none;
                }
                @keyframes shimmer {
                    0% {
                        transform: translateX(-100%);
                    }
                    100% {
                        transform: translateX(100%);
                    }
                }
            `;
        document.head.appendChild(style);

        // Создание элемента details
        const details = document.createElement("details");
        // Добавляем класс my-details-class к элементу <details>
        details.classList.add('details_EspeciallyForYou');

        const summary = document.createElement("summary");
        summary.textContent = messageSpecialOffer('Реклама')

        const shimmer = document.createElement("div");
        shimmer.className = "shimmer";

        // const content = document.createElement("p");
        // content.textContent = "Содержимое деталей...";

        details.appendChild(summary);
        details.appendChild(shimmer);
        // details.appendChild(content);

        // document.body.appendChild(details);
        return details
    }

    // Возврат строк в зависимости от языка
    function messageSpecialOffer(idMsg) {
        // Определение языка браузера
        const browserLanguage = navigator.language || navigator.userLanguage
        let messageSpecialOffer

        switch (idMsg) {
            case "Реклама":
                messageSpecialOffer = 'Реклама'
                switch (browserLanguage) {
                    case "uken":
                        messageSpecialOffer = 'Реклама'
                        break;
                    default:
                        messageSpecialOffer = 'Реклама'
                }
                return messageSpecialOffer
        }
    }
    // https://mail.ru/
    // Функция для проверки наличия и удаления верхнего рекламного блока
    function mail_ru_checkAndRemoveTopBlock() {
        let targetNode
        targetNode = document.querySelector(config.nodes.mail_ru_banner_top_parent);
        if (targetNode) {
            // тип ноды меняется через каждые несколько секунд
            let targetNode_banner

            targetNode_banner = targetNode.querySelector('div.tgb-wrapper')

            if (targetNode_banner) {
                targetNode_banner.remove()
            }
        }
        const targetNodes = document.querySelectorAll('div.letter-list-item-adv')
        targetNodes.forEach(node => {
            node.remove();
        });


        // Поиск элемент с текстом "Реклама" внутри всех #shadow-root и определение блоков до #shadow-root

        // Функция для поиска элемента по текстовому содержимому внутри shadow DOM
        function findElementByTextInShadow(shadowRoot, tag, text) {
            const elements = shadowRoot.querySelectorAll(tag);
            for (let i = 0; i < elements.length; i++) {
                if (elements[i].textContent === text) {
                    return elements[i];
                }
            }
            return null;
        }

        // Новый способ
        // Получаем все элементы <div> на странице
        const divElements = document.querySelectorAll('div');

        // Проходимся по каждому элементу и проверяем его высоту и содержимое
        divElements.forEach((element) => {
            const height = parseInt(getComputedStyle(element).height);
            const content = element.innerText.trim();

            // Проверяем, является ли элемент <div> с высотой 0px и без содержимого
            if (height === 0 && content === '') {
                // Находим предшествующий элемент <div> с высотой 90px
                const previousDiv = element.previousElementSibling;
                if (previousDiv && previousDiv.tagName === 'DIV' && parseInt(getComputedStyle(previousDiv).height) === 90) {
                    // Проверяем, содержит ли предшествующий элемент <div> с высотой 90px элемент <div> с текстом "0+", "6+", "12+" или "16+"
                    const innerDivs = previousDiv.querySelectorAll('div');
                    let hasText = false;
                    innerDivs.forEach((innerDiv) => {
                        const innerDivText = innerDiv.innerText.trim();
                        if (innerDivText === '0+' || innerDivText === '6+' || innerDivText === '12+' || innerDivText === '16+') {
                            hasText = true;
                        }
                    });
                    if (hasText) {
                        previousDiv.style.display = 'none'
                    }
                }
            }
        });

        // Трети способ: внутри div slot="main-column" найти на верхнем уровне все непустые ноды, расположенные между div со свойством data-bem и div, принадлежащим классу class="tabs__container"
        // Функция для поиска всех непустых нод на верхнем уровне между двумя элементами
        function findNodesBetweenElements(container, startSelector, endSelector) {
            const startElement = container.querySelector(startSelector);
            const endElement = container.querySelector(endSelector);

            if (!startElement || !endElement) {
                console.error('Start or end element not found.');
                return [];
            }

            const nodes = [];
            let currentNode = startElement.nextSibling;

            while (currentNode && currentNode !== endElement) {
                if (currentNode.nodeType === Node.ELEMENT_NODE && currentNode.textContent.trim() !== '') {
                    nodes.push(currentNode);
                }
                currentNode = currentNode.nextSibling;
            }

            return nodes;
        }

        // Находим контейнер с атрибутом slot="main-column"
        const mainColumn = document.querySelector('div[slot="main-column"]');

        if (mainColumn) {
            // Находим все непустые ноды на верхнем уровне между div с data-bem и div с классом tabs__container
            const nodes = findNodesBetweenElements(mainColumn, 'div[data-bem]', 'div.tabs__container');

            // Выводим найденные ноды в консоль
            nodes.forEach(node => {
                console.log(node);
            });
        } else {
            console.error('Container with slot="main-column" not found.');
        }


    }

    function mail_ru_checkAndRemove_РекламаInSpan(node_test, mutation_test) {
        if (node_test && node_test.nodeName === 'DIV') {
            const DivBlockclassList = Array.from(node_test.classList);
            if (DivBlockclassList.some(className => className === 'mailru-dzen-themes') //||
                // DivBlockclassList.some(className => className === 'feed__row') &&
                // DivBlockclassList.some(className => className === '_is-mailru-morda')
               ) {
                // document.querySelectorAll('article.card-wrapper').forEach(node => {
                //     node?.remove()
                // })
                document.querySelectorAll('article.zenad-card-rtb').forEach(node => {
                    node?.remove()
                })
                document.querySelectorAll('div.zenad-card-rtb__ad').forEach(node => {
                    node?.remove()
                })
            }
        }
        // if (node_test && node_test.nodeName === 'IMG') {
        //     const DivBlockclassList = Array.from(node_test.classList);
        //     if (DivBlockclassList.some(className => className === 'zen-ui-zen-image-cover__image')
        //        ) {
        //         document.querySelectorAll('article.card-wrapper').forEach(node => {
        //             node?.remove()
        //         })
        //         document.querySelectorAll('div.zenad-card-rtb__ad').forEach(node => {
        //             node?.remove()
        //         })
        //     }
        // }


    }
    // Поиск элемент с текстом "Реклама" внутри всех #shadow-root и определение блоков до #shadow-root
    function mail_ru_checkAndRemove_РекламаВShadow() {

        //         // Функция для поиска элемента по текстовому содержимому внутри shadow DOM
        //         function findElementByTextInShadow(shadowRoot, tag, text) {
        //             const elements = shadowRoot.querySelectorAll(tag);
        //             for (let i = 0; i < elements.length; i++) {
        //                 if (elements[i].textContent === text) {
        //                     return elements[i];
        //                 }
        //             }
        //             return null;
        //         }

        //         // Найти все shadow host'ы на странице
        //         const shadowHosts = document.querySelectorAll('*');

        //         shadowHosts.forEach(shadowHost => {
        //             const shadowRoot = shadowHost.shadowRoot;

        //             if (shadowRoot) {
        //                 // Найти элемент с текстом "Реклама" внутри shadow root
        //                 const рекламаElement = findElementByTextInShadow(shadowRoot, 'span', 'Реклама');

        //                 if (рекламаElement) {
        //                     // Подняться по родительским нодам вплоть до shadow-root
        //                     let currentNode = рекламаElement;
        //                     while (currentNode && currentNode.parentNode !== shadowRoot) {
        //                         currentNode = currentNode.parentNode;
        //                     }

        //                     // Теперь currentNode указывает на элемент, непосредственно следующий за shadow-root
        //                     console.log(currentNode);
        //                 } else {
        //                     console.log('Элемент с текстом "Реклама" не найден внутри shadow root');
        //                 }
        //             } else {
        //                 console.log('Shadow root не найден');
        //             }
        //         });





        //*************


        //         function findParentNodeAboveShadowRoot() {
        //             const adSpan = document.querySelector('span:contains("Реклама")');

        //             if (adSpan) {
        //                 let currentNode = adSpan.parentNode;
        //                 while (currentNode && currentNode.id !== 'shadow-root') {
        //                     currentNode = currentNode.parentNode;
        //                 }

        //                 if (currentNode && currentNode.parentNode) {
        //                     return currentNode.parentNode;
        //                 }
        //             }

        //             return null;
        //         }

        //         const parentNode = findParentNodeAboveShadowRoot();

        //         if (parentNode) {
        //             console.log('Parent node above shadow-root:', parentNode);
        //         } else {
        //             console.log('Could not find the specified node.');
        //         }

        //*****************


        function findParentNodeAboveShadowRoot() {

            // Find all elements with a closed shadow root
            const shadowRoots = Array.from(document.querySelectorAll('*')).filter(el => el.shadowRoot && el.shadowRoot.mode === 'closed');

            // Iterate through the shadow roots and change their mode to 'open'
            shadowRoots.forEach(el => {
                el.shadowRoot.mode = 'open';
            });

            // Find all span elements
            const spans = document.querySelectorAll('span');

            // Iterate through the spans and find the one with the text "Реклама"
            for (let i = 0; i < spans.length; i++) {
                if (spans[i].textContent === 'Реклама') {
                    let currentNode = spans[i].parentNode;

                    // Traverse up the DOM until the shadow root is found
                    while (currentNode && currentNode.id !== 'shadow-root') {
                        currentNode = currentNode.parentNode;
                    }

                    // Return the parent of the shadow root
                    if (currentNode && currentNode.parentNode) {
                        return currentNode.parentNode;
                    }
                }
            }

            return null; // Return null if the node is not found
        }

        const parentNode = findParentNodeAboveShadowRoot();

        if (parentNode) {
            console.log('Parent node above shadow-root:', parentNode);
        } else {
            console.log('Could not find the specified node.');
        }








    }

    function mail_ru_checkAndRemoveTopBlock_classList(Node,mutation_test) {
        const classList = Array.from(Node.classList);
        if (classList.length === 3 &&
            classList.some(className => className.length === 7) &&
            classList.some(className => className.length === 7) &&
            classList.some(className => className.length >= 7 )) { // замечены варианты 15 и 17 длиной
            Node.remove();
            // Node.style.display = 'none';

        }
    }

    // внизу справа "Сделать поиск Яндекса основным?"
    function yandex_dzen_questionYandexGeneralSearch() {
        // <div class="nvBl_ nvBl_g9JqZb38zCZXEw nvBl_g9Z8ZofTxz9QBra_"><div id="dhbz" class="qb5a868df"><div class="ta805822e bacc75f5 fce2ef19d j2b3be76f o2301de0b"><div class="w6845527">
        // Выбираем все div
        const allDivs = document.querySelectorAll('div');

        // Фильтруем div, чтобы оставить только те, у которых ровно три класса
        const divsWithThreeClasses = Array.from(allDivs).filter(div => {
            const classes = div.classList;
            return classes.length === 3;
        });


        divsWithThreeClasses.forEach(div => {
            const DivChild = div.querySelector('div');
            function checkDivHasAnyId(div) {
                if (!div) {
                    // console.log('Div not found.');
                    return false;
                }

                if (!div.id) {
                    // console.log('Div does not have an id.');
                    return false;
                }

                // console.log('Div has an id.');
                // Проверяем, что div имеет ровно один класс
                if (div.classList.length !== 1) {
                    // console.log('Div does not have exactly one class.');
                    return false;
                }

                // есть вложенный div, принадлежащий пяти классам
                const DivChild2 = div.querySelector('div');
                if (!DivChild2) {
                    return false;

                }
                // Проверяем, что div принадлежит ровно 5-ти классам
                if (DivChild2.classList.length !== 5) {
                    // console.log('Div does not have exactly 5 classes.');
                    return false;
                }

                return true;
            }

            const result = checkDivHasAnyId(DivChild);
            if (result) div.remove()

        });

        // Новый способ
        // Получаем все элементы <div> на странице
        const divElements = document.querySelectorAll('div');
        // Проходимся по каждому элементу и проверяем его содержимое
        divElements.forEach((element) => {
            if (element.innerText.includes('Сделать поиск Яндекса основным')) {
                // Используем closest() для поиска родителя с указанным z-index
                const parentElement = divElement.closest('[style*="z-index"]');
                // Проверяем, найден ли родитель и его z-index
                if (parentElement && parseInt(getComputedStyle(parentElement).zIndex) > 100) {
                    parentElement.remove()
                }
            }
        });

    }

    // определение мобильное устройство или ПК
    function isMobileDevice() {
        return (typeof window.orientation !== "undefined") || (navigator.userAgent.indexOf('IEMobile') !== -1);
    }

    // поиск вложенной ноды, содержащей shadowRoot (не работает на 'closed')
    function findShadowRoot(node, shadowRoot_mode = 'closed') {
        // Проверяем, есть ли у текущей ноды shadowRoot
        if (node.shadowRoot && node.shadowRoot.mode === shadowRoot_mode) {
            console.log('Найдена нода с закрытым shadowRoot:', node);
            return node;
        }

        // Рекурсивно обходим дочерние элементы
        for (let child of node.children) {
            let result = findShadowRoot(child);
            if (result) {
                return result;
            }
        }

        return null;
    }

    // // Обработка события hashchange (не срабатывает)
    // window.addEventListener('hashchange', handleUrlChange);

    // // Обработка события popstate (не срабатывает)
    // window.addEventListener('popstate', handleUrlChange);
    // Function to handle URL changes
    function handleUrlChange2(newUrl) {
        if (currentURL !== newUrl) {
            // console.log('URL changed from', currentUrl, 'to', newUrl);
            currentURL = newUrl;
            // You can add your custom logic here
            // handleUrlChange()
            onInit()
        }
    }


    // Override pushState and replaceState to track URL changes
    const originalPushState = history.pushState;
    const originalReplaceState = history.replaceState;

    history.pushState = function() {
        originalPushState.apply(history, arguments);
        handleUrlChange2(window.location.href);
    };

    history.replaceState = function() {
        originalReplaceState.apply(history, arguments);
        handleUrlChange2(window.location.href);
    };


    // Проверка изменений в URL при загрузке страницы
    // handleUrlChange(); // перенесено в Init



})();