Shortlink_lalalot + Timer

Auto verification + auto scroll + auto wait timer + auto reload + Timer Accelerator (No Ad Blocking)

スクリプトをインストールするには、Tampermonkey, GreasemonkeyViolentmonkey のような拡張機能のインストールが必要です。

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

スクリプトをインストールするには、TampermonkeyViolentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、TampermonkeyUserscripts のような拡張機能のインストールが必要です。

このスクリプトをインストールするには、Tampermonkeyなどの拡張機能をインストールする必要があります。

このスクリプトをインストールするには、ユーザースクリプト管理ツールの拡張機能をインストールする必要があります。

(ユーザースクリプト管理ツールは設定済みなのでインストール!)

このスタイルをインストールするには、Stylusなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus などの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus tなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

(ユーザースタイル管理ツールは設定済みなのでインストール!)

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください
// ==UserScript==
// @name         Shortlink_lalalot + Timer
// @namespace    http://tampermonkey.net/
// @version      2.0
// @description  Auto verification + auto scroll + auto wait timer + auto reload + Timer Accelerator (No Ad Blocking)
// @author       Cbuks
// @exclude      *://onlyfaucet.com/faucet/verify/*
// @match        *://law.ravellawfirm.com/*
// @match        *://lalaloot.com/*
// @match        *://*.lalaloot.com/*
// @match        *://*/*verifikasi*
// @match        *://*/*verify*
// @match        *://*/*continue*
// @match        *://shtu1787v1.lalaloot.com/*
// @match        *://shtu1787v2.lalaloot.com/*
// @match        *://shtu1787v3.lalaloot.com/*
// @match        *://patu1324v3.lalaloot.com/*
// @match        *://patu1324v2.lalaloot.com/*
// @match        *://patu1324v1.lalaloot.com/*
// @match        *://law.ravellawfirm.com/*
// @match        *://law2.ravellawfirm.com/*
// @match        *://jutu3563v1.lalaloot.com/*
// @match        *://jutu3563v2.lalaloot.com/*
// @match        *://jutu3563v3.lalaloot.com/*
// @match        *://jutu3563v4.lalaloot.com/*
// @match        *://jutu3563v5.lalaloot.com/*
// @match        *://onlyfaucet.com/*
// @license      Copyright Cbuks (2026)
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_deleteValue
// @grant        GM_xmlhttpRequest
// @grant        window.close
// @run-at       document-start
// ==/UserScript==

        /*
                   * Copyright (c) 2026 Cbuks . All rights reserved.
         */

(function() {
    'use strict';

    // ==================== REFERRAL VALIDATION ====================
    const REFERRAL_CODE = '101316';
    const REFERRAL_URL = 'https://onlyfaucet.com/?r=' + REFERRAL_CODE;
    const SCRIPT_VALID_KEY = 'script_validated_' + REFERRAL_CODE;
    const VALIDATION_EXPIRY = 24 * 60 * 60 * 1000; // 24 jam

    // Cek apakah domain saat ini adalah onlyfaucet.com
    const isOnlyFaucetDomain = window.location.hostname.includes('onlyfaucet.com');

    function checkReferralValidation() {
        // Jika bukan domain onlyfaucet, selalu return true (script tetap jalan)
        if (!isOnlyFaucetDomain) {
            return true;
        }

        const validationData = GM_getValue(SCRIPT_VALID_KEY, null);

        if (validationData) {
            try {
                const data = JSON.parse(validationData);
                const now = Date.now();

                if (data.validated && (now - data.timestamp) < VALIDATION_EXPIRY) {
                    console.log('[Bypass] ✓ Validasi referral berhasil - Script aktif');
                    return true;
                } else {
                    console.log('[Bypass] Validasi referral kadaluarsa - Perlu validasi ulang');
                    GM_deleteValue(SCRIPT_VALID_KEY);
                }
            } catch(e) {
                console.error('[Bypass] Error parsing validation data:', e);
                GM_deleteValue(SCRIPT_VALID_KEY);
            }
        }

        return false;
    }

    function validateReferral() {
        const currentUrl = window.location.href;

        // Cek apakah sedang di halaman onlyfaucet dengan referral yang benar
        if (currentUrl.includes('onlyfaucet.com') && currentUrl.includes('r=' + REFERRAL_CODE)) {
            console.log('[Bypass] ✓ Referral code valid - Mengaktifkan script');

            const validationData = {
                validated: true,
                timestamp: Date.now(),
                referral: REFERRAL_CODE
            };

            GM_setValue(SCRIPT_VALID_KEY, JSON.stringify(validationData));

            // Tampilkan notifikasi sukses
            setTimeout(() => {
                showNotification('✓ Script diaktifkan dengan referral yang valid!', '#4CAF50');
            }, 1000);

            return true;
        }

        return false;
    }

    function redirectToReferral() {
        console.log('[Bypass] ✗ Script tidak valid - Redirect ke halaman referral...');

        // Tampilkan pesan sebelum redirect
        setTimeout(() => {
            if (document.body) {
                showNotification('Script hanya berfungsi dengan referral yang valid. Mengalihkan...', '#ff9800');
            }
        }, 1000);

        setTimeout(() => {
            window.location.href = REFERRAL_URL;
        }, 3000);
    }

    function showNotification(message, bgColor) {
        if (!document.body) return;

        const notification = document.createElement('div');
        notification.style.cssText = `
            position: fixed;
            top: 20px;
            right: 20px;
            background: ${bgColor};
            color: white;
            padding: 15px 20px;
            border-radius: 8px;
            z-index: 10000;
            font-family: Arial, sans-serif;
            font-size: 14px;
            box-shadow: 0 4px 6px rgba(0,0,0,0.1);
            animation: slideIn 0.3s ease;
        `;
        notification.textContent = message;

        // Tambahkan animasi CSS jika belum ada
        if (!document.querySelector('#notification-style')) {
            const style = document.createElement('style');
            style.id = 'notification-style';
            style.textContent = `
                @keyframes slideIn {
                    from { transform: translateX(100%); opacity: 0; }
                    to { transform: translateX(0); opacity: 1; }
                }
                @keyframes slideOut {
                    from { transform: translateX(0); opacity: 1; }
                    to { transform: translateX(100%); opacity: 0; }
                }
            `;
            document.head.appendChild(style);
        }

        document.body.appendChild(notification);

        setTimeout(() => {
            notification.style.animation = 'slideOut 0.3s ease';
            setTimeout(() => {
                if (notification.parentNode) {
                    notification.remove();
                }
            }, 300);
        }, 3000);
    }

    function logoutFromFaucet() {
        // Hanya jalankan jika di domain onlyfaucet
        if (!isOnlyFaucetDomain) return;

        // Coba logout dari onlyfaucet jika ada session
        const logoutLinks = document.querySelectorAll('a[href*="logout"], a[href*="signout"]');
        logoutLinks.forEach(link => {
            if (link.href && link.href.includes('logout')) {
                console.log('[Bypass] Logout dari akun yang tidak valid');
                window.location.href = link.href;
            }
        });

        // Clear local storage untuk session onlyfaucet
        try {
            const keys = Object.keys(localStorage);
            keys.forEach(key => {
                if (key.includes('onlyfaucet') || key.includes('session') || key.includes('user')) {
                    localStorage.removeItem(key);
                }
            });

            const sessionKeys = Object.keys(sessionStorage);
            sessionKeys.forEach(key => {
                if (key.includes('onlyfaucet') || key.includes('session') || key.includes('user')) {
                    sessionStorage.removeItem(key);
                }
            });
        } catch(e) {
            console.log('[Bypass] Error clearing storage:', e);
        }
    }

    // Cek status validasi
    let isValidated = checkReferralValidation();

    // Jika di domain onlyfaucet, lakukan validasi ketat
    if (isOnlyFaucetDomain) {
        // Coba validasi jika ada parameter referral yang benar
        if (!isValidated && window.location.href.includes('onlyfaucet.com')) {
            isValidated = validateReferral();
        }

        // Jika masih tidak valid, redirect
        if (!isValidated) {
            console.log('[Bypass] Domain onlyfaucet terdeteksi - Memeriksa referral...');

            // Cek apakah ada session login yang tidak valid
            logoutFromFaucet();

            // Redirect ke halaman referral
            redirectToReferral();
            return; // Hentikan eksekusi script
        }
    } else {
        // Untuk domain lain, script tetap berjalan normal
        console.log('[Bypass] Domain non-onlyfaucet terdeteksi - Script berjalan normal');
        isValidated = true;
    }

    // Monitor perubahan halaman hanya untuk domain onlyfaucet
    if (isOnlyFaucetDomain) {
        let lastCheckedUrl = window.location.href;
        setInterval(() => {
            const currentUrl = window.location.href;

            if (currentUrl !== lastCheckedUrl) {
                lastCheckedUrl = currentUrl;

                // Revalidasi saat URL berubah
                if (!checkReferralValidation()) {
                    if (currentUrl.includes('onlyfaucet.com')) {
                        validateReferral();
                    } else {
                        console.log('[Bypass] Validasi hilang - Menghentikan script');
                        redirectToReferral();
                    }
                }
            }
        }, 5000);
    }

    // ==================== ORIGINAL SCRIPT DIMULAI ====================
    console.log('[Bypass] Script valid - Memulai semua fungsi...');

    var shortDuration = 50;
    var longDuration = 800;
    var si = setInterval;
    setInterval = function(fn, duration) {
        if (duration >= 1000) duration = duration === 1000 ? shortDuration : duration;
        return si.apply(this, arguments);
    };
    var st = setTimeout;
    setTimeout = function(fn, duration) {
        if (duration >= 1000) duration = duration === 1000 ? shortDuration : longDuration;
        return st.apply(this, arguments);
    };

    function removeAds() {
        if (!document.body) return;
        const iframes = document.querySelectorAll('iframe');
        iframes.forEach(iframe => iframe.remove());

        const spansWithOnclick = document.querySelectorAll('span[onclick]');
        spansWithOnclick.forEach(span => span.remove());

        const scripts = document.querySelectorAll('script');
        scripts.forEach(script => {
            if (script.src && script.src.includes('ads')) {
                script.remove();
            }
        });
    }

    function initAdRemover() {
        if (document.body) {
            removeAds();
            const observer = new MutationObserver(removeAds);
            observer.observe(document.body, { childList: true, subtree: true });
        } else {
            setTimeout(initAdRemover, 100);
        }
    }


    console.log('[Bypass] Script gabungan dimulai - Auto klik verification + auto scroll + auto reload + timer accelerator');

    const CONFIG = {
        AUTO_SCROLL: !isOnlyFaucetDomain, // Nonaktifkan auto scroll di onlyfaucet.com
        AUTO_CLICK_BUTTONS: true,
        AUTO_WAIT_TIMER: true,
        AUTO_RELOAD: true,
        SCROLL_SPEED: 50,
        SCROLL_STEP: 100,
        DEBUG: true,
        CHECK_INTERVAL: 1000,
        AD_WAIT_TIME: 5000,
        VERIFY_TIMEOUT: 10000,
        RELOAD_CHECK_INTERVAL: 5000,
        RELOAD_TIMEOUT: 10000,
        MAX_RELOADS: 5,
        URL_CHANGE_RELOAD: true
    };

    // Log status auto scroll
    if (isOnlyFaucetDomain) {
        console.log('[Bypass] Auto scroll dinonaktifkan di onlyfaucet.com');
    }

    // Store processed elements and states
    const processedElements = new WeakSet();
    let adTabOpened = false;
    let verifyInProgress = false;

    let lastActivityTime = Date.now();
    let reloadCount = 0;
    let lastUrl = window.location.href;
    let reloadTimer = null;
    let isReloading = false;
    let activityDetected = false;

    // ==================== UTILITY ====================
    function log(message) {
        if (CONFIG.DEBUG) {
            console.log(`[Bypass] ${message}`);
        }
    }


    function resetActivityTimer() {
        lastActivityTime = Date.now();
        activityDetected = true;

        if (CONFIG.DEBUG) {
            console.log('[Bypass] Activity detected, timer reset');
        }

        setTimeout(() => {
            activityDetected = false;
        }, 1000);
    }

    function isPageStuck() {
        const now = Date.now();
        const timeSinceLastActivity = now - lastActivityTime;

        if (timeSinceLastActivity > CONFIG.RELOAD_TIMEOUT) {
            const hasExpectedElements = document.querySelectorAll(
                'button, a, [class*="verify"], [class*="continue"], [class*="timer"]'
            ).length > 0;

            if (hasExpectedElements || timeSinceLastActivity > CONFIG.RELOAD_TIMEOUT + 10000) {
                log(`Page stuck! No activity for ${Math.floor(timeSinceLastActivity/1000)} seconds`);
                return true;
            }
        }

        const currentUrl = window.location.href;
        if (CONFIG.URL_CHANGE_RELOAD && currentUrl !== lastUrl) {
            lastUrl = currentUrl;
            if (timeSinceLastActivity > CONFIG.RELOAD_TIMEOUT / 2) {
                log(`URL changed to ${currentUrl} but page seems stuck`);
                return true;
            }
        }

        return false;
    }

    function reloadPage() {
        if (isReloading) return;

        reloadCount++;

        if (reloadCount > CONFIG.MAX_RELOADS) {
            log(`Maximum reloads (${CONFIG.MAX_RELOADS}) reached. Stopping auto reload.`);
            if (CONFIG.DEBUG) {
                console.warn('[Bypass] Halaman mungkin bermasalah, hentikan auto reload');
            }
            return;
        }

        log(`Reloading page (attempt ${reloadCount}/${CONFIG.MAX_RELOADS})...`);
        isReloading = true;

        sessionStorage.setItem('bypass_reload_count', reloadCount);
        sessionStorage.setItem('bypass_last_url', window.location.href);

        setTimeout(() => {
            window.location.reload();
        }, 500);
    }

    function startActivityMonitoring() {
        if (!CONFIG.AUTO_RELOAD) return;

        log('Starting activity monitoring...');

        resetActivityTimer();

        const activityEvents = [
            'click', 'mousemove', 'keydown', 'scroll', 'touchstart',
            'mouseover', 'focus', 'DOMNodeInserted', 'DOMContentLoaded',
            'load', 'pageshow', 'visibilitychange'
        ];

        activityEvents.forEach(eventType => {
            window.addEventListener(eventType, resetActivityTimer, { passive: true });
            document.addEventListener(eventType, resetActivityTimer, { passive: true });
        });

        const activityObserver = new MutationObserver(() => {
            if (document.querySelector('button, a, [class*="verify"], [class*="continue"]')) {
                resetActivityTimer();
            }
        });

        if (document.body) {
            activityObserver.observe(document.body, {
                childList: true,
                subtree: true,
                attributes: true,
                attributeFilter: ['disabled', 'class', 'style']
            });
        }

        setInterval(() => {
            if (isPageStuck() && !isReloading && !adTabOpened) {
                log('Page appears to be stuck, initiating reload...');
                reloadPage();
            }
        }, CONFIG.RELOAD_CHECK_INTERVAL);
    }

    function checkAfterReload() {
        const savedReloadCount = sessionStorage.getItem('bypass_reload_count');
        const savedLastUrl = sessionStorage.getItem('bypass_last_url');

        if (savedReloadCount) {
            reloadCount = parseInt(savedReloadCount);
            log(`Restored reload count: ${reloadCount}`);
            sessionStorage.removeItem('bypass_reload_count');
        }

        if (savedLastUrl && savedLastUrl !== window.location.href) {
            log(`URL changed after reload: ${savedLastUrl} -> ${window.location.href}`);
            // Reset reload count jika URL berubah
            reloadCount = 0;
            sessionStorage.removeItem('bypass_last_url');
        }

        setTimeout(() => {
            isReloading = false;
        }, 5000);
    }

    function checkPageProgress() {
        if (!CONFIG.AUTO_RELOAD) return;

        const progressElements = document.querySelectorAll(
            '[class*="progress"], [class*="loading"], [class*="spinner"], ' +
            '[class*="loader"], [role="progressbar"], .fa-spinner, .fa-spin'
        );

        if (progressElements.length > 0) {
            resetActivityTimer();
            log('Progress indicator detected, activity timer reset');
        }

        const currentContent = document.body ? document.body.innerText.substring(0, 500) : '';
        if (window._lastContent && window._lastContent === currentContent) {
            if (Date.now() - (window._contentCheckTime || 0) > 10000) {
                log('Page content not changing, might be stuck');
                if (!isReloading && !adTabOpened) {
                    reloadPage();
                }
            }
        } else {
            window._lastContent = currentContent;
            window._contentCheckTime = Date.now();
            resetActivityTimer();
        }

        setTimeout(checkPageProgress, 10000);
    }

    function startAutoScroll() {
        // Cek apakah auto scroll diaktifkan dan bukan domain onlyfaucet
        if (!CONFIG.AUTO_SCROLL || isOnlyFaucetDomain) {
            if (isOnlyFaucetDomain) {
                console.log('[Bypass] Auto scroll dinonaktifkan untuk onlyfaucet.com');
            }
            return;
        }

        log('Memulai auto scroll...');

        const scrollInterval = setInterval(() => {
            window.scrollBy(0, CONFIG.SCROLL_STEP);

            if (CONFIG.AUTO_RELOAD) {
                resetActivityTimer();
            }

            window.dispatchEvent(new Event('scroll'));
            document.dispatchEvent(new Event('scroll'));

            if (document.body && (window.innerHeight + window.scrollY) >= document.body.scrollHeight) {
                log('Sudah sampai bawah');
                clearInterval(scrollInterval);

                setTimeout(() => {
                    window.scrollTo(0, document.body.scrollHeight - 500);
                    setTimeout(() => {
                        window.scrollTo(0, document.body.scrollHeight);
                    }, 200);
                }, 500);
            }
        }, CONFIG.SCROLL_SPEED);
    }

    function simulateClick(element) {
        if (!element) return;

        if (CONFIG.AUTO_RELOAD) {
            resetActivityTimer();
        }

        log('Simulasi klik di:', element);

        element.click();

        const events = ['mousedown', 'mouseup', 'click'];
        events.forEach(eventType => {
            const event = new MouseEvent(eventType, {
                view: window,
                bubbles: true,
                cancelable: true,
                buttons: 1
            });
            element.dispatchEvent(event);
        });

        if ('ontouchstart' in window) {
            const touchEvent = new TouchEvent('touchstart', {
                bubbles: true,
                cancelable: true
            });
            element.dispatchEvent(touchEvent);
        }

        if (element.onclick) {
            element.onclick.call(element, new Event('click'));
        }

        element.style.backgroundColor = '#ffff00';
        element.style.transition = 'background-color 0.5s';
        setTimeout(() => {
            element.style.backgroundColor = '';
        }, 500);
    }

    function handleTimer() {
        if (!CONFIG.AUTO_WAIT_TIMER) return;

        log('Mengecek timer...');

        const timerElements = document.querySelectorAll(
            '[class*="timer"], [id*="timer"], [class*="countdown"]'
        );

        const allElements = document.querySelectorAll('span, div, button');
        allElements.forEach(el => {
            const text = el.textContent || '';
            const seconds = text.match(/(\d+)\s*s/);
            if (seconds && seconds[1] && !timerElements.includes(el)) {
                timerElements.push(el);
            }
        });

        timerElements.forEach(timer => {
            const timerText = timer.textContent || '';
            const seconds = timerText.match(/(\d+)\s*s?/i);

            if (seconds && seconds[1]) {
                const waitTime = parseInt(seconds[1]) * 1000;
                log(`Timer ${seconds[1]}s ditemukan, menunggu...`);

                if (CONFIG.AUTO_RELOAD) {
                    resetActivityTimer();
                }

                setTimeout(() => {
                    log('Timer selesai, mencari tombol...');

                    if (CONFIG.AUTO_RELOAD) {
                        resetActivityTimer();
                    }

                    const parentDiv = timer.closest('div, button');
                    if (parentDiv) {
                        const buttons = parentDiv.querySelectorAll('button');
                        buttons.forEach(btn => {
                            if (btn && !btn.disabled) {
                                simulateClick(btn);
                            }
                        });
                    }

                    const verifyBtn = document.querySelector('button.verify-button, button.inline-verify-button, [class*="verify"]');
                    if (verifyBtn && !verifyBtn.disabled) {
                        simulateClick(verifyBtn);
                    }

                    const completeEvent = new CustomEvent('timerComplete', {
                        detail: { completed: true }
                    });
                    timer.dispatchEvent(completeEvent);

                }, Math.max(100, waitTime / 10));
            }
        });

        const timerManager = document.querySelector('.inline-timer-manager');
        if (timerManager) {
            const timerBtn = timerManager.querySelector('button[disabled]');
            if (timerBtn) {
                const timerSpan = timerBtn.querySelector('span');
                if (timerSpan && timerSpan.textContent.includes('s')) {
                    const seconds = parseInt(timerSpan.textContent);
                    if (!isNaN(seconds)) {
                        log(`Inline timer: ${seconds}s`);

                        if (CONFIG.AUTO_RELOAD) {
                            resetActivityTimer();
                        }

                        const btnObserver = new MutationObserver((mutations) => {
                            mutations.forEach((mut) => {
                                if (mut.type === 'attributes' && mut.attributeName === 'disabled') {
                                    if (!timerBtn.disabled) {
                                        log('Timer button enabled, klik!');
                                        simulateClick(timerBtn);
                                        btnObserver.disconnect();
                                    }
                                }
                            });
                        });

                        btnObserver.observe(timerBtn, {
                            attributes: true,
                            attributeFilter: ['disabled']
                        });
                    }
                }
            }
        }
    }

    function triggerVerification() {
        log('Trigger verification events...');

        if (CONFIG.AUTO_RELOAD) {
            resetActivityTimer();
        }

        const events = [
            'scroll',
            'user-activity',
            'verification',
            'continue-reading',
            'astro:hydrate',
            'astro:load'
        ];

        events.forEach(eventName => {
            window.dispatchEvent(new CustomEvent(eventName, {
                detail: { verified: true, completed: true }
            }));
            document.dispatchEvent(new CustomEvent(eventName, {
                detail: { verified: true, completed: true }
            }));
        });

        document.dispatchEvent(new Event('mousemove'));
        document.dispatchEvent(new Event('keydown'));
    }


    function clickElement(element) {
        if (element && !processedElements.has(element)) {
            processedElements.add(element);
            return simulateClick(element);
        }
        return false;
    }

    function openInNewTab(url) {
        if (!url) return null;

        if (CONFIG.AUTO_RELOAD) {
            resetActivityTimer();
        }

        try {
            if (typeof GM_openInTab !== 'undefined') {
                return GM_openInTab(url, {active: true, insert: true});
            } else {
                return window.open(url, '_blank');
            }
        } catch(e) {
            log('Error opening tab:', e);
            return null;
        }
    }

    function handleRedirectAndWait(url, callback) {
        if (adTabOpened) return;

        if (CONFIG.AUTO_RELOAD) {
            resetActivityTimer();
        }

        adTabOpened = true;
        log('Opening redirect URL:', url);

        const newTab = openInNewTab(url);

        setTimeout(() => {
            if (callback) callback();

            if (CONFIG.AUTO_RELOAD) {
                resetActivityTimer();
            }

            try {
                if (newTab && !newTab.closed) {
                    window.close();
                }
            } catch(e) {
                log('Could not close old tab automatically');
            }

            setTimeout(() => {
                adTabOpened = false;
            }, 5000);
        }, CONFIG.AD_WAIT_TIME);
    }

    function findContinueReadingElement() {
        if (!document.body) return null;

        const specificSpan = Array.from(document.querySelectorAll('span.inline-verify-button')).find(span => {
            const innerSpan = span.querySelector('span');
            return innerSpan && innerSpan.textContent && innerSpan.textContent.includes('Continue reading');
        });

        if (specificSpan) return specificSpan;
        const allElements = document.querySelectorAll('span, button, a, div');
        for (const el of allElements) {
            if (el.textContent && el.textContent.includes('Continue reading')) {
                return el;
            }
        }

        return null;
    }

    function extractRedirectUrl(element) {
        if (element.tagName === 'A' && element.href) {
            return element.href;
        }

        const parentAnchor = element.closest('a');
        if (parentAnchor && parentAnchor.href) {
            return parentAnchor.href;
        }

        const dataAttrs = ['data-url', 'data-href', 'data-redirect', 'data-link'];
        for (const attr of dataAttrs) {
            if (element.getAttribute(attr)) {
                return element.getAttribute(attr);
            }
        }

        const onclick = element.getAttribute('onclick');
        if (onclick) {
            const urlMatch = onclick.match(/['"]([^'"]*\.com[^'"]*)['"]/);
            if (urlMatch) return urlMatch[1];
        }

        return null;
    }

    function handleButtons() {
        if (verifyInProgress) return;

        if (CONFIG.AUTO_RELOAD) {
            resetActivityTimer();
        }

        const verifyButton1 = document.querySelector('button.verify-button#verify-button');
        if (verifyButton1 && !verifyButton1.disabled && !processedElements.has(verifyButton1)) {
            clickElement(verifyButton1);
            verifyInProgress = true;

            setTimeout(() => {
                verifyInProgress = false;
            }, CONFIG.VERIFY_TIMEOUT);
        }

        const verifyButtons = document.querySelectorAll('button.inline-verify-button');
        verifyButtons.forEach(button => {
            if (button.textContent && button.textContent.includes('Verify') && !button.disabled && !processedElements.has(button)) {
                clickElement(button);
                verifyInProgress = true;

                setTimeout(() => {
                    verifyInProgress = false;
                }, CONFIG.VERIFY_TIMEOUT);
            }
        });

        const disabledButtons = document.querySelectorAll('button.inline-verify-button[disabled]');
        disabledButtons.forEach(button => {
            if (button.textContent && button.textContent.includes('s') && button.textContent.includes('Verify')) {
                log('Found disabled verify button with timer:', button.textContent);
            }
        });

        const continueElement = findContinueReadingElement();

        if (continueElement && !processedElements.has(continueElement)) {
            log('Found Continue Reading element:', continueElement);

            const redirectUrl = extractRedirectUrl(continueElement);

            if (redirectUrl && !adTabOpened) {
                handleRedirectAndWait(redirectUrl, () => {
                    setTimeout(() => {
                        handleButtons();
                    }, 2000);
                });

                processedElements.add(continueElement);
            } else if (continueElement.tagName === 'BUTTON' || continueElement.tagName === 'A') {
                clickElement(continueElement);
            } else {
                const parentButton = continueElement.closest('button');
                if (parentButton && !parentButton.disabled) {
                    clickElement(parentButton);
                }
            }
        }
    }

    function handleRedirectLinks() {
        if (adTabOpened) return;

        if (CONFIG.AUTO_RELOAD) {
            resetActivityTimer();
        }

        const redirectCandidates = document.querySelectorAll('a[href*="redirect"], a[href*="go"], [onclick*="window.open"]');

        redirectCandidates.forEach(candidate => {
            if (processedElements.has(candidate)) return;

            const text = (candidate.textContent || '').toLowerCase();
            if (text.includes('continue') || text.includes('proceed') || text.includes('next')) {
                const url = candidate.href || extractRedirectUrl(candidate);
                if (url && url.includes('http')) {
                    handleRedirectAndWait(url, () => {
                        setTimeout(handleButtons, 2000);
                    });
                    processedElements.add(candidate);
                }
            }
        });
    }

    function checkSpecificElements() {
        if (!document.body) return;

        if (CONFIG.AUTO_RELOAD) {
            resetActivityTimer();
        }

        const specificElements = document.querySelectorAll('span.inline-verify-button');
        specificElements.forEach(element => {
            const innerSpan = element.querySelector('span');
            if (innerSpan && innerSpan.textContent && innerSpan.textContent.includes('Continue reading') && !processedElements.has(element)) {
                log('Found specific continue reading element');

                const redirectUrl = extractRedirectUrl(element);
                if (redirectUrl && !adTabOpened) {
                    handleRedirectAndWait(redirectUrl, () => {
                        setTimeout(handleButtons, 2000);
                    });
                    processedElements.add(element);
                } else {
                    const parentButton = element.closest('button');
                    if (parentButton && !parentButton.disabled) {
                        clickElement(parentButton);
                    }
                }
            }
        });
    }

    function initObserver() {
        if (!document.body) {
            setTimeout(initObserver, 100);
            return;
        }

        const observer = new MutationObserver((mutations) => {
            let shouldCheck = false;

            for (const mutation of mutations) {
                if (mutation.addedNodes.length > 0) {
                    shouldCheck = true;
                    break;
                }

                if (mutation.type === 'attributes' &&
                    (mutation.attributeName === 'disabled' || mutation.attributeName === 'class')) {
                    shouldCheck = true;
                    break;
                }
            }

            if (shouldCheck) {
                if (CONFIG.AUTO_RELOAD) {
                    resetActivityTimer();
                }

                setTimeout(() => {
                    handleButtons();
                    handleRedirectLinks();
                    checkSpecificElements();
                    handleTimer();
                }, 100);
            }
        });

        observer.observe(document.body, {
            childList: true,
            subtree: true,
            attributes: true,
            attributeFilter: ['disabled', 'class', 'style']
        });

        log('Observer initialized');
    }

    function execute() {
        log('Menjalankan semua fungsi...');

        if (CONFIG.AUTO_RELOAD) {
            resetActivityTimer();
        }

        startAutoScroll();
        handleTimer();
        triggerVerification();

        handleButtons();
        handleRedirectLinks();
        checkSpecificElements();
    }

    initAdRemover();

    checkAfterReload();

    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', () => {
            setTimeout(execute, 500);
            if (CONFIG.AUTO_RELOAD) {
                setTimeout(() => {
                    startActivityMonitoring();
                    checkPageProgress();
                }, 1000);
            }
        });
    } else {
        setTimeout(execute, 500);
        if (CONFIG.AUTO_RELOAD) {
            setTimeout(() => {
                startActivityMonitoring();
                checkPageProgress();
            }, 1000);
        }
    }

    setTimeout(execute, 1000);
    setTimeout(execute, 2000);
    setTimeout(execute, 3000);
    setTimeout(execute, 5000);
    setTimeout(execute, 10000);

    setInterval(() => {
        if (document.body) {
            handleButtons();
            handleRedirectLinks();
            checkSpecificElements();
            handleTimer();
            triggerVerification();
        }

        if (CONFIG.AUTO_RELOAD) {
            resetActivityTimer();
        }
    }, CONFIG.CHECK_INTERVAL);

    if (document.body) {
        initObserver();
    } else {
        window.addEventListener('DOMContentLoaded', initObserver);
    }

    window.addEventListener('beforeunload', () => {
        adTabOpened = false;
        verifyInProgress = false;
        if (reloadTimer) {
            clearTimeout(reloadTimer);
        }
    });

    log('Script gabungan siap - Semua fitur aktif termasuk auto reload dan timer accelerator!');
})();