{"id":7083,"date":"2026-07-21T06:44:28","date_gmt":"2026-07-21T06:44:28","guid":{"rendered":"https:\/\/assistyu.com\/?page_id=7083"},"modified":"2026-07-21T06:48:42","modified_gmt":"2026-07-21T06:48:42","slug":"network-security-scan","status":"publish","type":"page","link":"https:\/\/assistyu.com\/it\/cybersecurity-tools\/network-security-scan\/","title":{"rendered":"Network Security Scan"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"7083\" class=\"elementor elementor-7083\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c18dd00 e-con e-atomic-element e-flexbox-base e-da084ef \" data-id=\"c18dd00\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"c18dd00\">\n    \t\t<div class=\"elementor-element elementor-element-a8a40e2 elementor-widget elementor-widget-html\" data-id=\"a8a40e2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n    <meta charset=\"UTF-8\" \/>\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\r\n    <title>AssistYU \u2014 Network Scan<\/title>\r\n    <link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\" \/>\r\n    <link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin \/>\r\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Space+Grotesk:wght@400;500;600;700&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500;600;700&display=swap\" rel=\"stylesheet\" \/>\r\n    <style>\r\n        * { margin: 0; padding: 0; box-sizing: border-box; }\r\n        :root {\r\n            --ayu-bg-deep: #060815;\r\n            --ayu-bg-navy: #090d24;\r\n            --ayu-bg-navy-2: #0b1130;\r\n            --ayu-text-primary: #ffffff;\r\n            --ayu-text-secondary: #d4daff;\r\n            --ayu-text-tertiary: #bcc4f0;\r\n            --glass-border: rgba(79, 110, 247, 0.15);\r\n            --border: rgba(79, 110, 247, 0.18);\r\n            --border-strong: rgba(79, 110, 247, 0.30);\r\n            --cyan: #4f6ef7;\r\n            --blue: #4f6ef7;\r\n            --violet: #8a6bff;\r\n            --danger: #ff3d68;\r\n            --safe: #22e6a8;\r\n            --amber: #ffb84d;\r\n            --font-display: 'Space Grotesk', sans-serif;\r\n            --font-body: 'Inter', sans-serif;\r\n            --font-mono: 'JetBrains Mono', monospace;\r\n        }\r\n        html, body {\r\n            min-height: 100vh;\r\n            background: #060815;\r\n            color: var(--ayu-text-primary);\r\n            font-family: var(--font-body);\r\n            -webkit-font-smoothing: antialiased;\r\n            -moz-osx-font-smoothing: grayscale;\r\n            text-rendering: optimizeLegibility;\r\n            position: relative;\r\n            isolation: isolate;\r\n            overflow-x: hidden;\r\n        }\r\n        .page-bg {\r\n            position: absolute;\r\n            inset: 0;\r\n            z-index: 0;\r\n            pointer-events: none;\r\n            background: linear-gradient(180deg, #060815 0%, #060815 20%, #090d24 50%, #060815 80%, #060815 100%);\r\n        }\r\n        .bg-layers {\r\n            position: absolute;\r\n            inset: 0;\r\n            z-index: 0;\r\n            pointer-events: none;\r\n            mask-image: linear-gradient(to bottom, transparent 0%, black 20%, black 80%, transparent 100%);\r\n            -webkit-mask-image: linear-gradient(to bottom, transparent 0%, black 20%, black 80%, transparent 100%);\r\n        }\r\n        .ayu-bg-world {\r\n            position: fixed;\r\n            inset: 0;\r\n            background-image: url('https:\/\/assistyu.com\/wp-content\/uploads\/2026\/07\/scan-network-scaled.jpeg?w=1600&q=80');\r\n            background-size: cover;\r\n            background-position: center;\r\n            background-attachment: absolute;\r\n            opacity: 0.10;\r\n            mask-image: radial-gradient(ellipse 80% 70% at 50% 40%, black 20%, transparent 75%);\r\n            -webkit-mask-image: radial-gradient(ellipse 80% 70% at 50% 40%, black 20%, transparent 75%);\r\n        }\r\n        .ayu-bg-dots {\r\n            position: absolute;\r\n            inset: 0;\r\n            background-image: radial-gradient(circle at 1px 1px, rgba(79, 110, 247, 0.08) 1px, transparent 1px);\r\n            background-size: 48px 48px;\r\n            mask-image: radial-gradient(ellipse 60% 50% at 50% 50%, black 20%, transparent 70%);\r\n            -webkit-mask-image: radial-gradient(ellipse 60% 50% at 50% 50%, black 20%, transparent 70%);\r\n        }\r\n        .ayu-bg-glow {\r\n            position: absolute;\r\n            inset: 0;\r\n            background:\r\n                radial-gradient(ellipse 50% 40% at 15% 15%, rgba(79, 110, 247, 0.12), transparent 55%),\r\n                radial-gradient(ellipse 35% 30% at 50% 50%, rgba(236, 72, 153, 0.04), transparent 60%),\r\n                radial-gradient(ellipse 50% 40% at 70% 20%, rgba(34, 211, 238, 0.06), transparent 50%);\r\n        }\r\n        .ayu-bg-orb-1 {\r\n            position: absolute;\r\n            width: 400px; height: 400px; top: 10%; left: 5%;\r\n            border-radius: 50%;\r\n            background: radial-gradient(circle, rgba(79, 110, 247, 0.06) 0%, transparent 70%);\r\n            animation: ayuOrbFloat1 20s ease-in-out infinite;\r\n        }\r\n        .ayu-bg-orb-2 {\r\n            position: absolute;\r\n            width: 300px; height: 300px; bottom: 15%; right: 10%;\r\n            border-radius: 50%;\r\n            background: radial-gradient(circle, rgba(139, 92, 246, 0.06) 0%, transparent 70%);\r\n            animation: ayuOrbFloat2 25s ease-in-out infinite;\r\n        }\r\n        @keyframes ayuOrbFloat1 { 0%,100%{transform:translate(0,0) scale(1);} 33%{transform:translate(30px,-20px) scale(1.05);} 66%{transform:translate(-15px,15px) scale(0.95);} }\r\n        @keyframes ayuOrbFloat2 { 0%,100%{transform:translate(0,0) scale(1);} 33%{transform:translate(-20px,25px) scale(1.08);} 66%{transform:translate(25px,-10px) scale(0.92);} }\r\n        .ayu-content-overlay { position: relative; z-index: 1; }\r\n        a { color: inherit; text-decoration: none; }\r\n        button { font-family: inherit; cursor: pointer; }\r\n        ::selection { background: var(--cyan); color: #04060d; }\r\n        html { scroll-behavior: smooth; }\r\n        @media(prefers-reduced-motion:reduce) { html { scroll-behavior: auto; } }\r\n        a:focus-visible, button:focus-visible, .swi input:focus-visible+.sws, .map-click:focus-visible, .card:focus-visible {\r\n            outline: 2px solid var(--cyan); outline-offset: 3px; border-radius: 8px;\r\n        }\r\n        main { max-width: 95%; margin: 0 auto; padding: 130px clamp(20px, 4vw, 60px) 48px; position: relative; z-index: 1; }\r\n\r\n        \/* =============================================\r\n           START SCREEN\r\n           ============================================= *\/\r\n        #start-view {\r\n            display: flex; flex-direction: column; align-items: center; justify-content: center;\r\n            min-height: calc(80vh - 130px); text-align: center; animation: fadeUp .6s cubic-bezier(.2,.8,.2,1);\r\n        }\r\n        @keyframes fadeUp { from{opacity:0;transform:translateY(18px);} to{opacity:1;transform:none;} }\r\n        .start-shield { position: relative; width: 80px; height: 80px; margin-bottom: 28px; }\r\n        .start-shield svg { width: 80px; height: 80px; color: var(--cyan); filter: drop-shadow(0 0 24px rgba(79,110,247,0.40)); }\r\n        .start-shield::after {\r\n            content: ''; position: absolute; inset: -12px; border-radius: 50%;\r\n            background: radial-gradient(circle, rgba(79,110,247,0.10), transparent 70%);\r\n            animation: pulse 2.5s ease-in-out infinite;\r\n        }\r\n        @keyframes pulse { 0%,100%{transform:scale(1);opacity:.6;} 50%{transform:scale(1.15);opacity:1;} }\r\n        .start-title { font-family: var(--font-display); font-weight: 700; font-size: clamp(28px,5vw,48px); color: var(--ayu-text-primary); letter-spacing: -0.03em; line-height: 1.15; margin-bottom: 12px; }\r\n        .start-title span { color: var(--cyan); }\r\n        .start-sub { font-family: var(--font-body); font-size: clamp(14px,1.5vw,18px); color: var(--ayu-text-secondary); line-height: 1.6; max-width: 520px; margin-bottom: 36px; }\r\n        .start-cta {\r\n            display: inline-flex; align-items: center; gap: 12px; padding: 16px 36px; border-radius: 14px; border: none; cursor: pointer;\r\n            font-family: var(--font-display); font-weight: 600; font-size: 16px; color: var(--ayu-text-primary); letter-spacing: 0.2px;\r\n            background: linear-gradient(135deg, rgba(79,110,247,0.20), rgba(138,107,255,0.16));\r\n            border: 1px solid rgba(79,110,247,0.40);\r\n            box-shadow: 0 4px 24px rgba(79,110,247,0.20), 0 0 60px rgba(79,110,247,0.06);\r\n            transition: all .3s cubic-bezier(.2,.8,.2,1); position: relative; overflow: hidden;\r\n        }\r\n        .start-cta::before { content:''; position:absolute; inset:0; border-radius:14px; background: linear-gradient(135deg, rgba(255,255,255,0.05), transparent); pointer-events:none; }\r\n        .start-cta svg { width:20px; height:20px; color: var(--cyan); transition: transform .3s; }\r\n        .start-cta:hover { transform: translateY(-3px); box-shadow: 0 8px 36px rgba(79,110,247,0.30), 0 0 80px rgba(79,110,247,0.10); border-color: rgba(79,110,247,0.60); background: linear-gradient(135deg, rgba(79,110,247,0.28), rgba(138,107,255,0.22)); }\r\n        .start-cta:hover svg { transform: translateX(3px); }\r\n        .start-cta:active { transform: translateY(-1px); box-shadow: 0 4px 20px rgba(79,110,247,0.22); }\r\n        .start-features { display: flex; gap: 24px; margin-top: 40px; flex-wrap: wrap; justify-content: center; }\r\n        .start-feat { display: flex; align-items: center; gap: 8px; font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.5px; color: var(--ayu-text-tertiary); text-transform: uppercase; }\r\n        .start-feat-dot { width: 5px; height: 5px; border-radius: 50%; background: var(--cyan); box-shadow: 0 0 8px rgba(79,110,247,0.5); }\r\n\r\n        \/* =============================================\r\n           SCAN STAGE\r\n           ============================================= *\/\r\n        #scan-stage { display: none; margin-top: 28px; text-align: center; }\r\n        #scan-stage .eyebrow { text-align: center; font-size: 12px; letter-spacing: 1.5px; color: var(--ayu-text-tertiary); text-transform: uppercase; font-weight: 500; }\r\n        #scan-stage .eyebrow span { color: var(--cyan); }\r\n        #scan-stage .hl { display: block; font-family: var(--font-display); font-size: clamp(24px,4vw,42px); font-weight: 700; line-height: 1.15; margin-top: 8px; color: var(--ayu-text-primary); text-align: center; }\r\n        #scan-stage .sw-t { transition: color .4s; }\r\n        #scan-stage .sw-t.scanning { color: var(--cyan); text-shadow: 0 0 30px rgba(79,110,247,0.4); }\r\n        #scan-stage .sw-t.exposed { color: var(--danger); text-shadow: 0 0 30px rgba(255,61,104,0.4); }\r\n        #scan-stage .sw-t.protected { color: var(--safe); text-shadow: 0 0 30px rgba(34,230,168,0.4); }\r\n\r\n        .scan-grid { margin-top: 12px; display: flex; flex-direction: column; align-items: center; gap: 12px; width: 100%; max-width: 700px; margin-left: auto; margin-right: auto; }\r\n        .radar-sec { display: flex; flex-direction: column; align-items: center; margin-bottom: 8px; }\r\n        .radar-box { position: relative; width: min(340px,55vw); aspect-ratio: 1; }\r\n        #radarCanvas { width: 100%; height: 100%; display: block; }\r\n        .rl { margin-top: 12px; font-family: var(--font-mono); font-size: 10px; letter-spacing: 2px; color: var(--ayu-text-tertiary); text-transform: uppercase; }\r\n        .rl .live { color: var(--cyan); animation: lp 1.5s ease-in-out infinite; }\r\n        @keyframes lp { 0%,100%{opacity:1;} 50%{opacity:.4;} }\r\n\r\n        .ensec { width: 100%; max-width: min(340px,55vw); margin: 0 auto; display: flex; flex-direction: column; align-items: center; gap: 10px; }\r\n        .ensec .enb { width: 100%; height: 6px; border-radius: 99px; background: rgba(79,110,247,0.10); overflow: hidden; position: relative; }\r\n        .ensec .enbf { height: 100%; width: 0%; border-radius: 99px; background: linear-gradient(90deg, var(--cyan), var(--blue), var(--violet)); transition: width .4s; box-shadow: 0 0 16px rgba(79,110,247,0.5); }\r\n        .ensec .enp { font-family: var(--font-mono); font-size: 13px; font-weight: 600; color: var(--ayu-text-primary); letter-spacing: 1px; }\r\n        .ensec .enp .pct { color: var(--cyan); }\r\n        .ensec .en-status { font-family: var(--font-body); font-size: 13px; color: var(--ayu-text-secondary); letter-spacing: 0.3px; min-height: 1.6em; transition: color .3s; }\r\n        .ensec .en-status.done { color: var(--safe); font-weight: 500; }\r\n        .ensec .en-status .highlight { color: var(--cyan); font-weight: 600; }\r\n        .ensec .en-status .done-highlight { color: var(--safe); font-weight: 600; }\r\n\r\n        \/* =============================================\r\n           VERDICT VIEW\r\n           ============================================= *\/\r\n        #verdict-view { display: none; padding-top: 20px; }\r\n\r\n        \/* ---- verdict header ---- *\/\r\n        .verdict-header {\r\n            margin-top: 40px; text-align: center; display: flex; flex-direction: column; align-items: center; gap: 12px;\r\n            animation: fadeUp .6s cubic-bezier(.2,.8,.2,1);\r\n        }\r\n        .verdict-header .vb { width: 48px; height: 48px; border-radius: 13px; flex-shrink: 0; display: flex; align-items: center; justify-content: center; backdrop-filter: blur(8px); transition: all .4s; }\r\n        .verdict-header .vb.dg { background: rgba(255,61,104,0.12); border: 1px solid rgba(255,61,104,0.35); color: var(--danger); box-shadow: 0 0 22px rgba(255,61,104,0.20), inset 0 1px 0 rgba(255,255,255,0.05); }\r\n        .verdict-header .vb.sg { background: rgba(34,230,168,0.12); border: 1px solid rgba(34,230,168,0.35); color: var(--safe); box-shadow: 0 0 22px rgba(34,230,168,0.20), inset 0 1px 0 rgba(255,255,255,0.05); }\r\n        .verdict-header .vb svg { width: 22px; height: 22px; }\r\n        .verdict-header .vht-title { font-family: var(--font-display); font-weight: 700; font-size: clamp(28px,5vw,48px); color: var(--ayu-text-primary); letter-spacing: -0.03em; line-height: 1.15; }\r\n        .verdict-header .vht-desc { \r\n            font-family: var(--font-display); \r\n            font-weight: 700; \r\n            font-size: clamp(36px,7vw,72px); \r\n            color: var(--ayu-text-primary); \r\n            letter-spacing: -0.02em; \r\n            line-height: 1.1; \r\n            max-width: 900px;\r\n            margin-top: 2px;\r\n            white-space: nowrap;\r\n        }\r\n        .verdict-header.exposed .vht-desc { color: var(--danger); text-shadow: 0 0 40px rgba(255,61,104,0.2); }\r\n        .verdict-header.protected .vht-desc { color: var(--safe); text-shadow: 0 0 40px rgba(34,230,168,0.2); }\r\n        .verdict-header .vht-subdesc { \r\n            font-family: var(--font-body); \r\n            font-size: clamp(14px,1.3vw,17px); \r\n            color: var(--ayu-text-secondary); \r\n            line-height: 1.6; \r\n            max-width: 700px; \r\n            margin-top: -2px;\r\n            white-space: nowrap;\r\n        }\r\n\r\n        \/* ---- protected-mode toggle ---- *\/\r\n        .protect-toggle-row {\r\n            display: inline-flex; align-items: center; gap: 14px; margin-top: 6px;\r\n            padding: 10px 22px; border-radius: 999px;\r\n            background: linear-gradient(135deg, rgba(9,13,36,0.85), rgba(6,8,21,0.75));\r\n            border: 1px solid var(--border-strong);\r\n            backdrop-filter: blur(12px);\r\n            box-shadow: 0 4px 20px rgba(0,0,0,0.3);\r\n        }\r\n        .protect-toggle-row .toggle-label { font-family: var(--font-mono); font-size: 12px; font-weight: 600; color: var(--ayu-text-secondary); letter-spacing: 0.5px; text-transform: uppercase; transition: color .3s; }\r\n        .protect-toggle-row .toggle-label.active { color: var(--safe); }\r\n        .protect-toggle-row .swi { position: relative; width: 44px; height: 22px; flex-shrink: 0; }\r\n        .protect-toggle-row .swi input { opacity: 0; width: 0; height: 0; }\r\n        .protect-toggle-row .sws { position: absolute; inset: 0; background: #1c2440; border-radius: 999px; transition: all .3s; border: 1px solid var(--border-strong); cursor: pointer; }\r\n        .protect-toggle-row .sws::before { content:''; position:absolute; width:14px; height:14px; left:3px; top:3px; background:#8a97bd; border-radius:50%; transition: all .3s; }\r\n        .protect-toggle-row .swi input:checked+.sws { background: linear-gradient(90deg, var(--cyan), var(--safe)); border-color: transparent; box-shadow: 0 0 18px rgba(34,230,168,0.35); }\r\n        .protect-toggle-row .swi input:checked+.sws::before { transform: translateX(22px); background: #04101a; }\r\n\r\n        \/* ---- hero blocks (side by side) ---- *\/\r\n        .hero-blocks { display: flex; gap: 20px; margin-top: 32px; align-items: stretch; animation: fadeUp .6s cubic-bezier(.2,.8,.2,1); }\r\n        .hero-block {\r\n            flex: 1; min-width: 0; border-radius: 20px; padding: 28px 30px; backdrop-filter: blur(16px);\r\n            border: 1px solid var(--border-strong);\r\n            background: linear-gradient(135deg, rgba(9,13,36,0.85), rgba(6,8,21,0.75));\r\n            box-shadow: 0 8px 40px rgba(0,0,0,0.35);\r\n            display: flex; flex-direction: column; position: relative; overflow: hidden;\r\n            transition: border-color .4s, box-shadow .4s, background .4s;\r\n        }\r\n        .hero-block::before { content:''; position:absolute; inset:0; border-radius:18px; pointer-events:none; background: repeating-linear-gradient(0deg, transparent, transparent 3px, rgba(255,255,255,0.010) 3px, rgba(255,255,255,0.010) 4px); }\r\n        .hero-block.exposed { border-color: rgba(255,61,104,0.28); box-shadow: 0 8px 40px rgba(0,0,0,0.35), 0 0 60px rgba(255,61,104,0.10), inset 0 1px 0 rgba(255,255,255,0.04); }\r\n        .hero-block.exposed::after {\r\n            content:''; position:absolute; inset:0; border-radius:18px;\r\n            background:\r\n                radial-gradient(38% 55% at 20% 30%, rgba(255,61,104,0.18), transparent 70%),\r\n                radial-gradient(45% 60% at 80% 70%, rgba(255,184,77,0.10), transparent 70%),\r\n                radial-gradient(30% 45% at 55% 90%, rgba(255,61,104,0.08), transparent 70%);\r\n            animation: vhSmoke 15s ease-in-out infinite alternate; pointer-events:none;\r\n        }\r\n        .hero-block.protected { border-color: rgba(34,230,168,0.28); box-shadow: 0 8px 40px rgba(0,0,0,0.35), 0 0 60px rgba(34,230,168,0.10), inset 0 1px 0 rgba(255,255,255,0.04); }\r\n        .hero-block.protected::after {\r\n            content:''; position:absolute; inset:0; border-radius:18px;\r\n            background:\r\n                radial-gradient(38% 55% at 20% 30%, rgba(34,230,168,0.18), transparent 70%),\r\n                radial-gradient(45% 60% at 80% 70%, rgba(79,110,247,0.12), transparent 70%),\r\n                radial-gradient(30% 45% at 55% 90%, rgba(34,230,168,0.08), transparent 70%);\r\n            animation: vhSmoke 15s ease-in-out infinite alternate; pointer-events:none;\r\n        }\r\n        @keyframes vhSmoke { 0%{transform:translate(-2%,-1%) scale(1);} 50%{transform:translate(2%,2%) scale(1.08);} 100%{transform:translate(-1%,3%) scale(1.02);} }\r\n        @media(prefers-reduced-motion:reduce) { .hero-block::after { animation:none; } }\r\n        .hero-block>* { position: relative; z-index: 2; }\r\n\r\n        \/* left block \u2014 threats, centered\/organized *\/\r\n        .hero-left { align-items: center; text-align: center; justify-content: center; gap: 10px; }\r\n        .hero-left .threats-label {\r\n            font-family: var(--font-mono); font-size: 12px; font-weight: 700; letter-spacing: 2px; text-transform: uppercase;\r\n        }\r\n        .hero-left .threats-label.danger { color: var(--danger); }\r\n        .hero-left .threats-label.safe { color: var(--safe); }\r\n        .hero-left .threats-count { font-family: var(--font-display); font-size: clamp(48px,7vw,76px); font-weight: 700; color: var(--ayu-text-primary); letter-spacing: -0.02em; line-height: 1; margin: 4px 0 2px; }\r\n        .hero-left .threats-count .num { color: var(--danger); }\r\n        .hero-left .threats-count .num.safe { color: var(--safe); }\r\n        .hero-left .threats-detail { font-family: var(--font-body); font-size: clamp(14px,1.3vw,17px); color: var(--ayu-text-secondary); line-height: 1.5; }\r\n        .hero-left .threats-detail .highlight { color: var(--ayu-text-primary); font-weight: 500; }\r\n        .hero-left .threats-badges {\r\n            display: flex; gap: 10px; flex-wrap: wrap; justify-content: center;\r\n            margin-top: auto; padding-top: 18px; border-top: 1px solid rgba(79,110,247,0.08); width: 100%;\r\n        }\r\n        .hero-left .badge {\r\n            display: inline-flex; align-items: center; gap: 6px; padding: 6px 16px; border-radius: 999px;\r\n            font-family: var(--font-mono); font-size: 11px; font-weight: 700; letter-spacing: 0.5px; border: 1px solid transparent;\r\n        }\r\n        .hero-left .badge.crit { background: rgba(255,61,104,0.12); color: var(--danger); border-color: rgba(255,61,104,0.30); }\r\n        .hero-left .badge.warn { background: rgba(255,184,77,0.12); color: var(--amber); border-color: rgba(255,184,77,0.30); }\r\n        .hero-left .badge .dot { width: 5px; height: 5px; border-radius: 50%; background: currentColor; box-shadow: 0 0 6px currentColor; }\r\n\r\n        \/* right block \u2014 gauge + content CENTERED properly - IMPROVED *\/\r\n        .hero-right { \r\n            align-items: center; \r\n            justify-content: center; \r\n            padding: 24px 28px;\r\n            display: flex;\r\n            flex-direction: column;\r\n        }\r\n        .hero-right .gauge-wrap { \r\n            display: flex; \r\n            flex-direction: row; \r\n            align-items: center; \r\n            justify-content: center;\r\n            gap: 40px; \r\n            width: 100%; \r\n            flex: 1;\r\n        }\r\n        .hero-right .gauge-ring { \r\n            position: relative; \r\n            width: 180px; \r\n            height: 180px; \r\n            flex-shrink: 0; \r\n            filter: drop-shadow(0 4px 24px rgba(0,0,0,0.5));\r\n        }\r\n        .hero-right .gauge-ring svg { width: 180px; height: 180px; transform: rotate(-90deg); overflow: visible; }\r\n        .hero-right .gauge-ring circle { fill: none; stroke-linecap: round; }\r\n        .hero-right .gauge-ring .g-bg { stroke: rgba(79,110,247,0.08); stroke-width: 8; }\r\n        .hero-right .gauge-ring .g-fill { stroke-width: 10; transition: stroke-dashoffset 1.4s cubic-bezier(.4,0,.2,1), stroke .5s; filter: drop-shadow(0 0 16px rgba(0,0,0,0.3)); }\r\n        .hero-right .gauge-ring .g-inner {\r\n            position: absolute; inset: 10px; border-radius: 50%;\r\n            background: radial-gradient(circle at 35% 35%, rgba(255,255,255,0.06), transparent 60%), linear-gradient(135deg, rgba(9,13,36,0.95), rgba(6,8,21,0.90));\r\n            border: 1px solid rgba(79,110,247,0.08);\r\n            box-shadow: inset 0 2px 10px rgba(0,0,0,0.4), inset 0 -1px 4px rgba(255,255,255,0.03);\r\n        }\r\n        .hero-right .gauge-ring .g-num { \r\n            position: absolute; \r\n            inset: 0; \r\n            display: flex; \r\n            flex-direction: column; \r\n            align-items: center; \r\n            justify-content: center; \r\n            font-family: var(--font-display);\r\n        }\r\n        .hero-right .gauge-ring .g-num-val { \r\n            font-size: 48px; \r\n            font-weight: 700; \r\n            color: var(--ayu-text-primary); \r\n            line-height: 1; \r\n            letter-spacing: -0.02em;\r\n            text-shadow: 0 0 30px rgba(79,110,247,0.15);\r\n        }\r\n        .hero-right .gauge-ring .g-num-of { \r\n            font-size: 13px; \r\n            font-weight: 500; \r\n            color: var(--ayu-text-tertiary); \r\n            letter-spacing: 1px; \r\n            margin-top: 0px;\r\n            opacity: 0.7;\r\n        }\r\n        .hero-right .gauge-info { \r\n            display: flex; \r\n            flex-direction: column; \r\n            align-items: flex-start; \r\n            gap: 10px; \r\n            min-width: 0; \r\n            flex: 1;\r\n            padding: 4px 0;\r\n            text-align: left;\r\n        }\r\n        .hero-right .gauge-grade { \r\n            font-family: var(--font-display); \r\n            font-size: clamp(28px,3vw,38px); \r\n            font-weight: 700; \r\n            letter-spacing: 0.3px;\r\n            line-height: 1.2;\r\n        }\r\n        .hero-right .gauge-grade .sub { \r\n            font-family: var(--font-body); \r\n            font-size: clamp(16px,1.5vw,20px); \r\n            font-weight: 400; \r\n            color: var(--ayu-text-secondary); \r\n            display: block; \r\n            margin-top: 4px;\r\n        }\r\n        .hero-right .gauge-tags { \r\n            display: flex; \r\n            gap: 8px; \r\n            flex-wrap: wrap; \r\n            justify-content: flex-start; \r\n            margin-top: 4px;\r\n        }\r\n        .hero-right .gauge-tags .tag { \r\n            font-family: var(--font-mono); \r\n            font-size: 11px; \r\n            font-weight: 500; \r\n            padding: 6px 16px; \r\n            border-radius: 999px; \r\n            background: rgba(79,110,247,0.06); \r\n            border: 1px solid rgba(79,110,247,0.12); \r\n            color: var(--ayu-text-secondary); \r\n            letter-spacing: 0.3px;\r\n            transition: all .2s;\r\n        }\r\n        .hero-right .gauge-tags .tag.danger { background: rgba(255,61,104,0.12); border-color: rgba(255,61,104,0.25); color: var(--danger); }\r\n        .hero-right .gauge-tags .tag.safe { background: rgba(34,230,168,0.12); border-color: rgba(34,230,168,0.25); color: var(--safe); }\r\n        .hero-right .gauge-tags .tag.warn { background: rgba(255,184,77,0.12); border-color: rgba(255,184,77,0.25); color: var(--amber); }\r\n\r\n        @media(max-width:768px) {\r\n            .hero-blocks { flex-direction: column; }\r\n            .hero-block { padding: 24px 22px; }\r\n            .hero-left .threats-count { font-size: clamp(38px,10vw,56px); }\r\n            .hero-right .gauge-wrap { flex-direction: column; text-align: center; gap: 24px; }\r\n            .hero-right .gauge-info { align-items: center; text-align: center; }\r\n            .hero-right .gauge-tags { justify-content: center; }\r\n            .hero-right .gauge-ring { width: 140px; height: 140px; }\r\n            .hero-right .gauge-ring svg { width: 140px; height: 140px; }\r\n            .hero-right .gauge-ring .g-num-val { font-size: 36px; }\r\n            .verdict-header { margin-top: 30px; }\r\n            .verdict-header .vht-title { font-size: clamp(26px,4vw,38px); }\r\n            .verdict-header .vht-desc { font-size: clamp(28px,5vw,44px); white-space: normal; }\r\n            .verdict-header .vht-subdesc { white-space: normal; }\r\n        }\r\n        @media(max-width:480px) {\r\n            .hero-block { padding: 20px 16px; }\r\n            .hero-left .threats-count { font-size: 34px; }\r\n            .hero-right .gauge-ring { width: 120px; height: 120px; }\r\n            .hero-right .gauge-ring svg { width: 120px; height: 120px; }\r\n            .hero-right .gauge-ring .g-num-val { font-size: 30px; }\r\n            .hero-right .gauge-ring .g-num-of { font-size: 10px; }\r\n            .verdict-header .vht-desc { font-size: clamp(24px,4vw,36px); white-space: normal; }\r\n            .verdict-header .vht-subdesc { display: none; }\r\n        }\r\n\r\n        \/* ---- cards ---- *\/\r\n        .rsec { margin-top: 20px; }\r\n        .slab {\r\n            margin-top: 32px; margin-bottom: 14px; font-family: var(--font-mono); font-size: 10px; letter-spacing: 2px;\r\n            color: var(--ayu-text-secondary); text-transform: uppercase; font-weight: 600; display: flex; align-items: center; gap: 8px;\r\n        }\r\n        .slab::after { content:''; flex:1; height:1px; background: linear-gradient(90deg, rgba(79,110,247,0.20), transparent); }\r\n        .g2 { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }\r\n        .g3 { display: grid; grid-template-columns: repeat(3,1fr); gap: 14px; }\r\n        #gth { grid-template-columns: 1fr 1fr !important; }\r\n        @media(max-width:900px) { .g3 { grid-template-columns: repeat(2,1fr); } #gth { grid-template-columns: 1fr !important; } }\r\n        @media(max-width:640px) { .g2 { grid-template-columns: 1fr; } .g3 { grid-template-columns: 1fr; } }\r\n        @media(min-width:1440px) { .g2 { grid-template-columns: repeat(3,1fr); } }\r\n\r\n        .card {\r\n            position: relative; border-radius: 14px; padding: 20px 22px; display: flex; align-items: flex-start; gap: 16px;\r\n            overflow: hidden; transition: transform .3s cubic-bezier(.2,.8,.2,1), box-shadow .3s, border-color .3s, background .3s;\r\n            opacity: 0; transform: translateY(8px); animation: ci .45s ease forwards;\r\n            background: linear-gradient(135deg, rgba(9,13,36,0.80), rgba(6,8,21,0.70));\r\n            border: 1px solid rgba(79,110,247,0.10);\r\n            box-shadow: 0 2px 14px rgba(0,0,0,0.35), inset 0 1px 0 rgba(255,255,255,0.03);\r\n            will-change: transform; backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px);\r\n        }\r\n        .card::after { content:''; position:absolute; inset:0; border-radius:14px; pointer-events:none; background: repeating-linear-gradient(0deg, transparent, transparent 3px, rgba(255,255,255,0.008) 3px, rgba(255,255,255,0.008) 4px); opacity:1; transition: opacity .3s; }\r\n        .card:hover { border-color: rgba(79,110,247,0.22); box-shadow: 0 6px 28px rgba(0,0,0,0.45), inset 0 1px 0 rgba(255,255,255,0.05); transform: translateY(-2px); }\r\n        .card.c-cyan { border-color: rgba(79,110,247,0.14); background: linear-gradient(135deg, rgba(9,13,36,0.82), rgba(6,8,21,0.74)), radial-gradient(120% 120% at 0% 0%, rgba(79,110,247,0.04), transparent 60%); }\r\n        .card.c-cyan:hover { border-color: rgba(79,110,247,0.28); box-shadow: 0 6px 28px rgba(0,0,0,0.45), 0 0 24px rgba(79,110,247,0.06); }\r\n        .card.c-danger { border-color: rgba(255,61,104,0.28); background: linear-gradient(135deg, rgba(38,12,22,0.82), rgba(16,8,14,0.75)), radial-gradient(120% 120% at 0% 0%, rgba(255,61,104,0.16), transparent 60%); box-shadow: 0 2px 16px rgba(0,0,0,0.4), 0 0 26px rgba(255,61,104,0.10); }\r\n        .card.c-danger:hover { border-color: rgba(255,61,104,0.45); box-shadow: 0 6px 28px rgba(0,0,0,0.5), 0 0 32px rgba(255,61,104,0.16); }\r\n        .card.c-warn { border-color: rgba(255,184,77,0.28); background: linear-gradient(135deg, rgba(36,26,10,0.82), rgba(16,14,8,0.75)), radial-gradient(120% 120% at 0% 0%, rgba(255,184,77,0.14), transparent 60%); box-shadow: 0 2px 16px rgba(0,0,0,0.4), 0 0 24px rgba(255,184,77,0.08); }\r\n        .card.c-warn:hover { border-color: rgba(255,184,77,0.40); box-shadow: 0 6px 28px rgba(0,0,0,0.5), 0 0 30px rgba(255,184,77,0.14); }\r\n        .card.c-safe { border-color: rgba(34,230,168,0.22); background: linear-gradient(135deg, rgba(10,32,26,0.78), rgba(8,20,18,0.7)), radial-gradient(120% 120% at 0% 0%, rgba(34,230,168,0.10), transparent 60%); box-shadow: 0 2px 16px rgba(0,0,0,0.4), 0 0 22px rgba(34,230,168,0.06); }\r\n        .card.c-safe:hover { border-color: rgba(34,230,168,0.35); box-shadow: 0 6px 28px rgba(0,0,0,0.5), 0 0 28px rgba(34,230,168,0.12); }\r\n        .card.prot { border-color: rgba(34,230,168,0.28) !important; background: linear-gradient(135deg, rgba(10,32,26,0.82), rgba(8,20,18,0.75)), radial-gradient(120% 120% at 0% 0%, rgba(34,230,168,0.14), transparent 60%) !important; box-shadow: 0 2px 16px rgba(0,0,0,0.4), 0 0 26px rgba(34,230,168,0.10) !important; }\r\n        .card.prot .ci { background: rgba(34,230,168,0.12) !important; border-color: rgba(34,230,168,0.35) !important; color: var(--safe) !important; }\r\n        .card.prot .cv { color: var(--safe) !important; background: rgba(34,230,168,0.10) !important; border-color: rgba(34,230,168,0.22) !important; }\r\n        .card.prot .cs { color: rgba(34,230,168,0.7) !important; }\r\n        @keyframes ci { to { opacity:1; transform:none; } }\r\n        .ci {\r\n            width: 44px; height: 44px; border-radius: 11px; flex-shrink: 0; display: flex; align-items: center; justify-content: center;\r\n            background: rgba(79,110,247,0.06); border: 1px solid rgba(79,110,247,0.18); color: var(--cyan); transition: all .35s;\r\n            position: relative; z-index: 1; box-shadow: inset 0 1px 0 rgba(255,255,255,0.04);\r\n        }\r\n        .card:hover .ci { transform: scale(1.06); }\r\n        .card.c-danger .ci { background: rgba(255,61,104,0.10); border-color: rgba(255,61,104,0.28); color: var(--danger); box-shadow: inset 0 1px 0 rgba(255,255,255,0.04), 0 0 14px rgba(255,61,104,0.10); }\r\n        .card.c-warn .ci { background: rgba(255,184,77,0.10); border-color: rgba(255,184,77,0.28); color: var(--amber); box-shadow: inset 0 1px 0 rgba(255,255,255,0.04), 0 0 14px rgba(255,184,77,0.08); }\r\n        .card.c-safe .ci { background: rgba(34,230,168,0.10); border-color: rgba(34,230,168,0.28); color: var(--safe); box-shadow: inset 0 1px 0 rgba(255,255,255,0.04), 0 0 14px rgba(34,230,168,0.08); }\r\n        .ci svg { width: 20px; height: 20px; }\r\n        .cb { min-width: 0; flex: 1; display: flex; flex-direction: column; gap: 6px; }\r\n        .cl { font-size: 10px; letter-spacing: 1.5px; color: var(--ayu-text-secondary); text-transform: uppercase; font-weight: 600; }\r\n        .cv {\r\n            font-family: var(--font-mono); font-size: 14px; font-weight: 600; color: var(--ayu-text-primary); word-break: break-word;\r\n            line-height: 1.4; padding: 6px 10px; border-radius: 6px; background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.06);\r\n            transition: all .3s; display: inline-block; width: fit-content; max-width: 100%;\r\n        }\r\n        .cv.risk { color: var(--danger); background: rgba(255,61,104,0.08); border-color: rgba(255,61,104,0.22); }\r\n        .cv.warn { color: var(--amber); background: rgba(255,184,77,0.08); border-color: rgba(255,184,77,0.22); }\r\n        .cv.safe { color: var(--safe); background: rgba(34,230,168,0.08); border-color: rgba(34,230,168,0.22); }\r\n        .cv.mask { color: var(--safe); font-style: italic; background: rgba(34,230,168,0.10); border-color: rgba(34,230,168,0.25); }\r\n        .cs { font-size: 11px; color: var(--ayu-text-tertiary); line-height: 1.45; transition: color .3s; }\r\n        .card:hover .cs { color: var(--ayu-text-secondary); }\r\n\r\n        \/* ---- map ---- *\/\r\n        .mapc {\r\n            margin-top: 8px; border: 1px solid rgba(79,110,247,0.18); border-radius: 14px; overflow: hidden;\r\n            background: rgba(9,13,36,0.85); backdrop-filter: blur(12px);\r\n            box-shadow: 0 4px 20px rgba(0,0,0,0.35), 0 0 0 1px rgba(79,110,247,0.06);\r\n            position: relative; display: flex; flex-direction: column; width: 100%;\r\n        }\r\n        .mapc::before { content:''; position:absolute; top:0; left:0; right:0; height:1px; background: linear-gradient(90deg, transparent, rgba(79,110,247,0.3), transparent); z-index:1; }\r\n        .maph { \r\n            display: flex; \r\n            align-items: center; \r\n            justify-content: space-between; \r\n            padding: 14px 20px; \r\n            font-family: var(--font-mono); \r\n            font-size: 10px; \r\n            letter-spacing: 1.5px; \r\n            color: var(--ayu-text-primary); \r\n            font-weight: 600; \r\n            text-transform: uppercase; \r\n            border-bottom: 1px solid rgba(79,110,247,0.12); \r\n            background: rgba(9,13,36,0.6); \r\n            flex-shrink: 0;\r\n        }\r\n        .maph-l { \r\n            display: flex; \r\n            align-items: center; \r\n            gap: 10px;\r\n        }\r\n        .maph-l .map-label-icon { \r\n            width: 18px; \r\n            height: 18px; \r\n            color: var(--cyan); \r\n            opacity: 0.8;\r\n        }\r\n        .maph-l .map-label-text {\r\n            font-size: 11px;\r\n            letter-spacing: 1px;\r\n            color: var(--ayu-text-secondary);\r\n        }\r\n        .maph-l .map-label-text .hl { \r\n            color: var(--cyan); \r\n            font-weight: 700;\r\n        }\r\n        .maph-z { display: flex; gap: 4px; }\r\n        .maph-z button { \r\n            width: 30px; \r\n            height: 30px; \r\n            border-radius: 8px; \r\n            border: 1px solid rgba(79,110,247,0.2); \r\n            background: rgba(9,13,36,0.6); \r\n            color: var(--ayu-text-primary); \r\n            font-size: 18px; \r\n            cursor: pointer; \r\n            display: flex; \r\n            align-items: center; \r\n            justify-content: center; \r\n            transition: all .2s; \r\n            font-family: var(--font-mono);\r\n        }\r\n        .maph-z button:hover { border-color: rgba(79,110,247,0.5); background: rgba(79,110,247,0.1); color: var(--cyan); }\r\n        .mapw { position: relative; height: 420px; width: 100%; filter: saturate(0.7) brightness(0.95) contrast(1.05); pointer-events: none; transition: filter .4s; overflow: hidden; }\r\n        .mapw.active { pointer-events: auto; filter: saturate(0.85) brightness(1) contrast(1.05); }\r\n        .mapw iframe { position: absolute; top:0; left:0; width:100%; height:100%; border:0; display:block; transition: opacity .4s; }\r\n        .mapw::after { content:''; position:absolute; inset:0; pointer-events:none; background: linear-gradient(180deg, rgba(6,8,21,0.15) 0%, rgba(6,8,21,0.4) 100%); border-radius: 0 0 14px 14px; transition: opacity .4s; }\r\n        .mapw.active::after { opacity: 0; }\r\n        .map-click {\r\n            position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 10px; z-index: 5; cursor: pointer;\r\n            background: rgba(6,8,21,0.45); backdrop-filter: blur(3px); transition: all .4s; border-radius: 0 0 14px 14px; pointer-events: auto;\r\n        }\r\n        .map-click:hover { background: rgba(6,8,21,0.3); backdrop-filter: blur(1px); }\r\n        .map-click svg { width: 32px; height: 32px; color: var(--ayu-text-primary); animation: lp 1.5s ease-in-out infinite; transition: transform .3s; }\r\n        .map-click:hover svg { transform: scale(1.15); }\r\n        .map-click span { font-family: var(--font-mono); font-size: 10px; letter-spacing: 2px; color: var(--ayu-text-primary); text-transform: uppercase; }\r\n        .map-click .map-hint { font-size: 9px; color: var(--ayu-text-secondary); letter-spacing: 1px; margin-top: 2px; }\r\n        .mapw.active .map-click { opacity: 0; pointer-events: none; }\r\n        .map-loc {\r\n            position: absolute; bottom: 16px; left: 16px; z-index: 4; background: rgba(9,13,36,0.92); border: 1px solid rgba(79,110,247,0.2); border-radius: 12px;\r\n            padding: 12px 18px; backdrop-filter: blur(12px); display: flex; align-items: center; gap: 12px; opacity: 0; transform: translateY(8px);\r\n            transition: all .4s .2s; pointer-events: none; box-shadow: 0 4px 20px rgba(0,0,0,0.3);\r\n        }\r\n        .mapw.active .map-loc { opacity: 1; transform: none; pointer-events: auto; }\r\n        .map-loc svg { width: 16px; height: 16px; color: var(--cyan); flex-shrink: 0; }\r\n        .map-loc-t { font-family: var(--font-mono); font-size: 12px; color: var(--ayu-text-primary); font-weight: 600; }\r\n        .map-loc-s { font-size: 10px; color: var(--ayu-text-secondary); margin-top: 2px; letter-spacing: 0.3px; }\r\n        .map-mask {\r\n            position: absolute; inset: 0; z-index: 10; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px;\r\n            opacity: 0; pointer-events: none; transition: all .5s; background: rgba(3,5,12,0.65); backdrop-filter: blur(6px); border-radius: 0 0 14px 14px;\r\n        }\r\n        .map-mask.show { opacity: 1; pointer-events: auto; }\r\n        .map-mask svg { width: 36px; height: 36px; color: var(--safe); filter: drop-shadow(0 0 12px rgba(34,230,168,0.4)); animation: maskPulse 2s ease-in-out infinite; }\r\n        .map-mask-t { font-family: var(--font-display); font-size: 16px; font-weight: 700; color: var(--safe); text-shadow: 0 0 20px rgba(34,230,168,0.4); letter-spacing: 0.5px; }\r\n        .map-mask-s { font-family: var(--font-mono); font-size: 10px; color: rgba(34,230,168,0.7); letter-spacing: 1.5px; text-transform: uppercase; }\r\n        @keyframes maskPulse { 0%,100%{transform:scale(1); filter: drop-shadow(0 0 12px rgba(34,230,168,0.4));} 50%{transform:scale(1.08); filter: drop-shadow(0 0 20px rgba(34,230,168,0.6));} }\r\n\r\n        .map-section { margin-top: 32px; width: 100%; }\r\n\r\n        \/* ---- cta ---- *\/\r\n        .cta-block { margin-top: 40px; padding: 0; border-radius: 20px; border: none; background: transparent; position: relative; overflow: hidden; display: flex; flex-direction: column; align-items: stretch; gap: 0; width: 100%; }\r\n        .cta-hero {\r\n            position: relative; padding: 52px 56px; border-radius: 22px;\r\n            background:\r\n                radial-gradient(100% 160% at 50% -30%, rgba(79,110,247,0.14), transparent 60%),\r\n                radial-gradient(70% 90% at 15% 110%, rgba(138,107,255,0.12), transparent 55%),\r\n                radial-gradient(60% 90% at 95% 110%, rgba(34,230,168,0.06), transparent 55%),\r\n                linear-gradient(180deg, rgba(9,13,36,0.94), rgba(6,8,21,0.90));\r\n            border: 1px solid rgba(79,110,247,0.16);\r\n            backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px);\r\n            box-shadow: 0 8px 44px rgba(0,0,0,0.4), inset 0 1px 0 rgba(255,255,255,0.04);\r\n            isolation: isolate; display: flex; flex-direction: row; align-items: center; justify-content: space-between; gap: 40px; overflow: hidden;\r\n        }\r\n        .cta-hero::before {\r\n            content:''; position:absolute; inset:-30%; z-index:0; pointer-events:none;\r\n            background: radial-gradient(40% 50% at 30% 20%, rgba(79,110,247,0.14), transparent 70%), radial-gradient(40% 50% at 70% 80%, rgba(138,107,255,0.12), transparent 70%);\r\n            filter: blur(50px); animation: ctaSmoke 10s ease-in-out infinite alternate; opacity: .8;\r\n        }\r\n        @keyframes ctaSmoke { 0%{transform:translate(-1%,1%) scale(1);} 100%{transform:translate(1%,-1%) scale(1.06);} }\r\n        .cta-hero>* { position: relative; z-index: 1; }\r\n        .cta-copy { display: flex; flex-direction: column; align-items: flex-start; text-align: left; gap: 16px; max-width: 560px; }\r\n        .cta-badge {\r\n            display: inline-flex; align-items: center; gap: 7px; font-family: var(--font-mono); font-size: 10px; letter-spacing: 2px; text-transform: uppercase;\r\n            font-weight: 700; color: var(--cyan); padding: 6px 14px; border-radius: 999px; background: rgba(79,110,247,0.07); border: 1px solid rgba(79,110,247,0.2);\r\n        }\r\n        .cta-badge-dot { width: 5px; height: 5px; border-radius: 50%; background: var(--cyan); box-shadow: 0 0 8px var(--cyan); animation: lp 1.5s ease-in-out infinite; }\r\n        .cta-headline { font-family: var(--font-display); font-weight: 700; font-size: clamp(24px,3.2vw,34px); color: var(--ayu-text-primary); letter-spacing: -0.02em; line-height: 1.15; }\r\n        .cta-headline em { font-style: normal; color: var(--cyan); }\r\n        .cta-desc { font-family: var(--font-body); font-size: clamp(13px,1.2vw,15px); color: var(--ayu-text-secondary); line-height: 1.65; }\r\n        .cta-trust { display: flex; align-items: center; gap: 16px; margin-top: 2px; flex-wrap: wrap; justify-content: flex-start; font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.5px; color: var(--ayu-text-tertiary); text-transform: uppercase; }\r\n        .cta-trust-sep { width: 3px; height: 3px; border-radius: 50%; background: rgba(79,110,247,0.2); }\r\n        .cta-actions-col { display: flex; flex-direction: column; align-items: center; gap: 14px; flex-shrink: 0; }\r\n        .cta-btn {\r\n            display: inline-flex; align-items: center; justify-content: center; gap: 10px; padding: 16px 34px; border-radius: 12px;\r\n            border: 1px solid rgba(79,110,247,0.4); background: linear-gradient(135deg, rgba(79,110,247,0.16), rgba(138,107,255,0.12));\r\n            font-family: var(--font-display); font-weight: 600; font-size: 15px; color: var(--ayu-text-primary); letter-spacing: 0.2px; cursor: pointer;\r\n            transition: all .3s cubic-bezier(.2,.8,.2,1); position: relative; overflow: hidden; text-decoration: none; white-space: nowrap;\r\n        }\r\n        .cta-btn::before { content:''; position:absolute; inset:0; border-radius:12px; background: linear-gradient(135deg, rgba(255,255,255,0.06), transparent); pointer-events:none; }\r\n        .cta-btn svg { width: 18px; height: 18px; color: var(--cyan); transition: transform .3s; }\r\n        .cta-btn:hover { transform: translateY(-2px); box-shadow: 0 8px 30px rgba(79,110,247,0.22); border-color: rgba(79,110,247,0.6); background: linear-gradient(135deg, rgba(79,110,247,0.24), rgba(138,107,255,0.18)); }\r\n        .cta-btn:hover svg { transform: translateX(2px); }\r\n        .cta-btn:active { transform: translateY(0); }\r\n        .cta-link { font-family: var(--font-body); font-size: 13px; font-weight: 500; color: var(--ayu-text-secondary); cursor: pointer; transition: color .3s; text-decoration: none; display: inline-flex; align-items: center; gap: 6px; }\r\n        .cta-link:hover { color: var(--ayu-text-primary); }\r\n        .cta-link svg { width: 14px; height: 14px; transition: transform .25s; }\r\n        .cta-link:hover svg { transform: translateX(2px); }\r\n\r\n        @media(max-width:860px) {\r\n            .cta-hero { flex-direction: column; text-align: center; padding: 40px 28px; gap: 28px; }\r\n            .cta-copy { align-items: center; text-align: center; max-width: 100%; }\r\n            .cta-trust { justify-content: center; }\r\n            .cta-actions-col { width: 100%; }\r\n            .cta-btn { width: 100%; }\r\n        }\r\n        @media(max-width:600px) {\r\n            .mapw { height: 260px; }\r\n            .cta-hero { padding: 32px 24px; }\r\n            .maph { flex-wrap: wrap; gap: 8px; justify-content: center; }\r\n            .maph-l .map-label-text { font-size: 9px; }\r\n            .map-loc { bottom: 10px; left: 10px; padding: 10px 14px; }\r\n        }\r\n\r\n        \/* ---- phone pill ---- *\/\r\n        .phone-pill {\r\n            position: fixed; right: 24px; top: 50%; transform: translateY(-50%); z-index: 50; display: flex; align-items: center; gap: 0;\r\n            flex-direction: row-reverse; padding: 0; border: 0; border-radius: 999px; background: transparent; box-shadow: none; cursor: pointer; transition: all .35s;\r\n        }\r\n        .phone-pill .pp-icon {\r\n            width: 52px; height: 52px; border-radius: 50%; flex-shrink: 0; padding: 0; background: linear-gradient(135deg, var(--cyan), var(--blue));\r\n            display: flex; align-items: center; justify-content: center; box-shadow: 0 4px 20px rgba(79,110,247,0.35); border: 1px solid rgba(255,255,255,0.25); transition: all .3s;\r\n        }\r\n        .phone-pill:hover .pp-icon { transform: scale(1.08); box-shadow: 0 6px 26px rgba(79,110,247,0.5); }\r\n        .phone-pill .pp-icon svg { width: 22px; height: 22px; color: #04070f; }\r\n        .phone-pill .pp-text {\r\n            font-family: var(--font-mono); font-weight: 600; font-size: 14px; color: var(--ayu-text-primary); white-space: nowrap; direction: ltr; text-align: right;\r\n            max-width: 0; opacity: 0; overflow: hidden; padding: 12px 0; border-radius: 999px;\r\n            background: linear-gradient(135deg, rgba(9,13,36,0.92), rgba(6,8,21,0.85)); border: 1px solid var(--border-strong);\r\n            backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); box-shadow: 0 4px 20px rgba(0,0,0,0.3), 0 0 20px rgba(79,110,247,0.1);\r\n            transition: max-width .4s ease, opacity .3s ease, padding .4s ease, margin .4s ease;\r\n        }\r\n        .phone-pill.open .pp-text { max-width: 260px; opacity: 1; padding: 12px 18px; margin-right: 12px; }\r\n        @media(max-width:480px) { .phone-pill { right: 14px; } .phone-pill .pp-icon { width: 46px; height: 46px; } }\r\n\r\n        .pov {\r\n            display: none; position: fixed; inset: 0; z-index: 100; background: rgba(3,5,12,0.88); backdrop-filter: blur(8px);\r\n            flex-direction: column; align-items: center; justify-content: center; gap: 18px;\r\n        }\r\n        .pov.show { display: flex; }\r\n        .povs {\r\n            width: 76px; height: 76px; border-radius: 18px; background: linear-gradient(135deg, rgba(34,230,168,0.1), rgba(34,230,168,0.15));\r\n            border: 1px solid var(--safe); display: flex; align-items: center; justify-content: center; animation: psp 1.5s ease-in-out infinite;\r\n        }\r\n        @keyframes psp { 0%,100%{box-shadow:0 0 0 0 rgba(34,230,168,0.3);} 50%{box-shadow:0 0 0 18px rgba(34,230,168,0);} }\r\n        .povs svg { width: 34px; height: 34px; color: var(--safe); }\r\n        .povt { font-family: var(--font-display); font-size: 18px; font-weight: 700; color: var(--safe); }\r\n        .povd { color: var(--ayu-text-secondary); font-size: 12px; text-align: center; max-width: 280px; line-height: 1.5; }\r\n\r\n        @media(max-width:480px) {\r\n            main { padding-top: 100px; padding-bottom: 36px; }\r\n            .hl { font-size: 20px; }\r\n            .vti { font-size: 16px; }\r\n            .tgw { width: 100%; justify-content: space-between; }\r\n            .map-loc { bottom: 8px; left: 8px; padding: 8px 10px; }\r\n        }\r\n        @media(prefers-reduced-motion:reduce) {\r\n            .card { animation: none; opacity: 1; transform: none; }\r\n            .cta-hero::before { animation: none; }\r\n            .hero-block::after { animation: none; }\r\n        }\r\n    <\/style>\r\n<\/head>\r\n<body>\r\n\r\n    <!-- \u2500\u2500 PAGE BACKGROUND \u2500\u2500 -->\r\n    <div class=\"page-bg\"><\/div>\r\n\r\n    <!-- \u2500\u2500 BACKGROUND LAYERS \u2500\u2500 -->\r\n    <div class=\"bg-layers\">\r\n        <div class=\"ayu-bg-world\"><\/div>\r\n        <div class=\"ayu-bg-dots\"><\/div>\r\n        <div class=\"ayu-bg-glow\"><\/div>\r\n        <div class=\"ayu-bg-orb-1\"><\/div>\r\n        <div class=\"ayu-bg-orb-2\"><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"ayu-content-overlay\">\r\n        <main>\r\n\r\n            <!-- START -->\r\n            <div id=\"start-view\">\r\n                <div class=\"start-shield\">\r\n                    <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" aria-hidden=\"true\">\r\n                        <path d=\"M12 2 3 6v6c0 5.2 3.8 9.8 9 11 5.2-1.2 9-5.8 9-11V6l-9-4Z\" \/>\r\n                        <path d=\"M12 8v4M12 16h.01\" stroke-width=\"2\" stroke-linecap=\"round\" \/>\r\n                    <\/svg>\r\n                <\/div>\r\n                <div class=\"start-title\">Network <span>Security Scan<\/span><\/div>\r\n                <div class=\"start-sub\">Real-time diagnostic of your IP exposure, browser fingerprint, open ports, blacklists, and threat intelligence \u2014 entirely client-side, zero data stored.<\/div>\r\n                <button class=\"start-cta\" id=\"startBtn\" aria-label=\"Start network security scan\">\r\n                    Start Security Scan\r\n                    <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg>\r\n                <\/button>\r\n                <div class=\"start-features\">\r\n                    <div class=\"start-feat\"><span class=\"start-feat-dot\"><\/span>IP &amp; location<\/div>\r\n                    <div class=\"start-feat\"><span class=\"start-feat-dot\"><\/span>Threat intel<\/div>\r\n                    <div class=\"start-feat\"><span class=\"start-feat-dot\"><\/span>Browser fingerprint<\/div>\r\n                    <div class=\"start-feat\"><span class=\"start-feat-dot\"><\/span>Speed test<\/div>\r\n                    <div class=\"start-feat\"><span class=\"start-feat-dot\"><\/span>Risk score<\/div>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <!-- SCAN -->\r\n            <div id=\"scan-stage\" role=\"status\" aria-live=\"polite\">\r\n                <div class=\"eyebrow\">AssistYU Network Scan <span>\u00b7 real-time diagnostic<\/span><\/div>\r\n                <h1 class=\"hl\">Your connection is <span class=\"sw-t scanning\" id=\"sw\">being analyzed<\/span><\/h1>\r\n                <div class=\"scan-grid\">\r\n                    <div class=\"radar-sec\" aria-hidden=\"true\">\r\n                        <div class=\"radar-box\"><canvas id=\"radarCanvas\" width=\"640\" height=\"640\"><\/canvas><\/div>\r\n                        <div class=\"rl\">Radar sweep <span class=\"live\">\u25cf live<\/span><\/div>\r\n                    <\/div>\r\n                    <div class=\"ensec\">\r\n                        <div class=\"enb\" role=\"progressbar\" aria-label=\"Scan progress\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" id=\"enbwrap\">\r\n                            <div class=\"enbf\" id=\"ebf\"><\/div>\r\n                        <\/div>\r\n                        <div class=\"enp\" id=\"enp\"><span class=\"pct\">0%<\/span><\/div>\r\n                        <div class=\"en-status\" id=\"en-status\">Initializing scan\u2026<\/div>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <!-- VERDICT -->\r\n            <div id=\"verdict-view\">\r\n\r\n                <div id=\"verdict-header\" class=\"verdict-header\">\r\n                    <div class=\"vb dg\" id=\"vbadge\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M12 2 3 6v6c0 5.2 3.8 9.8 9 11 5.2-1.2 9-5.8 9-11V6l-9-4Z\"\/><path d=\"M12 8v5M12 16h.01\"\/><\/svg><\/div>\r\n                    <div class=\"vht-title\" id=\"vMainTitle\">AssistYU Network Scan<\/div>\r\n                    <div class=\"vht-desc\" id=\"vMainDesc\">Your network is exposed.<\/div>\r\n                    <div class=\"vht-subdesc\" id=\"vMainSubDesc\">Real-time diagnostic of your IP exposure, browser fingerprint, and threat intelligence<\/div>\r\n                    <div class=\"protect-toggle-row\" id=\"tgw\">\r\n                        <span class=\"toggle-label\" id=\"toggle-label\">Protected mode<\/span>\r\n                        <label class=\"swi\"><input type=\"checkbox\" id=\"ptog\" aria-label=\"Toggle protected mode\"><span class=\"sws\"><\/span><\/label>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <!-- HERO: two blocks -->\r\n                <div class=\"hero-blocks\" id=\"hero-container\">\r\n                    <!-- left block -->\r\n                    <div class=\"hero-block hero-left exposed\" id=\"hero-left\">\r\n                        <span class=\"threats-label danger\" id=\"threats-label\">THREATS DETECTED<\/span>\r\n                        <div class=\"threats-count\"><span class=\"num\" id=\"threats-num\">0<\/span><\/div>\r\n                        <div class=\"threats-detail\" id=\"vtitle\">issues found on your current connection<\/div>\r\n                        <div class=\"threats-badges\">\r\n                            <span class=\"badge crit\" id=\"vbr-crit\"><span class=\"dot\"><\/span><span id=\"crit-n\">0<\/span> critical<\/span>\r\n                            <span class=\"badge warn\" id=\"vbr-warn\"><span class=\"dot\"><\/span><span id=\"warn-n\">0<\/span> warning<\/span>\r\n                        <\/div>\r\n                    <\/div>\r\n                    <!-- right block -->\r\n                    <div class=\"hero-block hero-right exposed\" id=\"hero-right\">\r\n                        <div class=\"gauge-wrap\">\r\n                            <div class=\"gauge-ring\">\r\n                                <svg viewBox=\"0 0 120 120\">\r\n                                    <circle class=\"g-bg\" cx=\"60\" cy=\"60\" r=\"50\"\/>\r\n                                    <circle class=\"g-fill\" id=\"rg-fill\" cx=\"60\" cy=\"60\" r=\"50\" stroke-dasharray=\"314.16\" stroke-dashoffset=\"314.16\"\/>\r\n                                <\/svg>\r\n                                <div class=\"g-inner\"><\/div>\r\n                                <div class=\"g-num\">\r\n                                    <span class=\"g-num-val\" id=\"rg-num\">0<\/span>\r\n                                    <span class=\"g-num-of\">\/100<\/span>\r\n                                <\/div>\r\n                            <\/div>\r\n                            <div class=\"gauge-info\">\r\n                                <div class=\"gauge-grade\" id=\"rg-grade\">Grade \u2014<\/div>\r\n                                <div class=\"gauge-tags\" id=\"rg-sub\"><\/div>\r\n                            <\/div>\r\n                        <\/div>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <!-- cards -->\r\n                <div class=\"rsec\">\r\n                    <div class=\"slab\">Network &amp; identity<\/div>\r\n                    <div class=\"g3\" id=\"gnet\"><\/div>\r\n\r\n                    <!-- map -->\r\n                    <div class=\"map-section\">\r\n                        <div class=\"mapc\">\r\n                            <div class=\"maph\">\r\n                                <div class=\"maph-l\">\r\n                                    <svg class=\"map-label-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M12 22s7-6.2 7-12a7 7 0 1 0-14 0c0 5.8 7 12 7 12Z\"\/><circle cx=\"12\" cy=\"10\" r=\"2.5\"\/><\/svg>\r\n                                    <span class=\"map-label-text\">Location: <span class=\"hl\" id=\"map-label-loc\">\u2014<\/span><\/span>\r\n                                <\/div>\r\n                                <div class=\"maph-z\"><button type=\"button\" aria-label=\"Zoom out map\" onclick=\"var f=document.getElementById('mif');var s=f.src.replace(\/&amp;\/g,'&');var m=s.match(\/bbox=([^&]+)\/);if(m){var b=m[1].split(',').map(Number);var cx=(b[0]+b[2])\/2,cy=(b[1]+b[3])\/2;var w=(b[2]-b[0])*0.7,h=(b[3]-b[1])*0.7;f.src=s.replace(\/bbox=[^&]+\/,'bbox='+(cx-w)+','+(cy-h)+','+(cx+w)+','+(cy+h));}\">&#x2212;<\/button><button type=\"button\" aria-label=\"Zoom in map\" onclick=\"var f=document.getElementById('mif');var s=f.src.replace(\/&amp;\/g,'&');var m=s.match(\/bbox=([^&]+)\/);if(m){var b=m[1].split(',').map(Number);var cx=(b[0]+b[2])\/2,cy=(b[1]+b[3])\/2;var w=(b[2]-b[0])*1.4,h=(b[3]-b[1])*1.4;f.src=s.replace(\/bbox=[^&]+\/,'bbox='+(cx-w)+','+(cy-h)+','+(cx+w)+','+(cy+h));}\">&#x2b;<\/button><\/div>\r\n                            <\/div>\r\n                            <div class=\"mapw\" id=\"mapw\">\r\n                                <div class=\"map-click\" id=\"map-click\" role=\"button\" tabindex=\"0\" aria-label=\"Enable interactive map\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><circle cx=\"11\" cy=\"11\" r=\"8\"\/><path d=\"M21 21l-4.35-4.35M11 8v6M8 11h6\"\/><\/svg><span>Click to enable map<\/span><div class=\"map-hint\">Scroll to zoom \u00b7 Drag to pan<\/div><\/div>\r\n                                <iframe id=\"mif\" loading=\"lazy\" referrerpolicy=\"no-referrer-when-downgrade\"><\/iframe>\r\n                                <div class=\"map-loc\" id=\"map-loc\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"10\" r=\"3\"\/><path d=\"M12 2a8 8 0 0 0-8 8c0 5.4 8 12 8 12s8-6.6 8-12a8 8 0 0 0-8-8Z\"\/><\/svg><div><div class=\"map-loc-t\" id=\"map-loc-t\">\u2014<\/div><div class=\"map-loc-s\" id=\"map-loc-s\">Approximate coordinates<\/div><\/div><\/div>\r\n                                <div class=\"map-mask\" id=\"map-mask\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M12 2 3 6v6c0 5.2 3.8 9.8 9 11 5.2-1.2 9-5.8 9-11V6l-9-4Z\"\/><path d=\"M9 12l2 2 4-4\"\/><\/svg><div class=\"map-mask-t\">Location masked<\/div><div class=\"map-mask-s\">Protected by AssistYU tunnel<\/div><\/div>\r\n                            <\/div>\r\n                        <\/div>\r\n                    <\/div>\r\n\r\n                    <div class=\"slab\">Threat intelligence<\/div>\r\n                    <div class=\"g3\" id=\"gth\"><\/div>\r\n                    <div class=\"slab\">Device fingerprint<\/div>\r\n                    <div class=\"g2\" id=\"gdev\"><\/div>\r\n                    <div class=\"slab\">Security checks<\/div>\r\n                    <div class=\"g2\" id=\"gsec\"><\/div>\r\n                <\/div>\r\n\r\n                <!-- cta -->\r\n                <div class=\"cta-block\">\r\n                    <div class=\"cta-hero\">\r\n                        <div class=\"cta-copy\">\r\n                            <div class=\"cta-badge\"><span class=\"cta-badge-dot\"><\/span>Protect your network<\/div>\r\n                            <div class=\"cta-headline\">Your scan found <em>vulnerabilities<\/em>.<br>Fix them now.<\/div>\r\n                            <div class=\"cta-desc\">Encrypt your traffic, mask your IP and block WebRTC leaks with one toggle. This scan ran entirely in your browser \u2014 nothing was sent to AssistYU servers.<\/div>\r\n                            <div class=\"cta-trust\">\r\n                                <span>100% client-side<\/span>\r\n                                <span class=\"cta-trust-sep\"><\/span>\r\n                                <span>Zero data stored<\/span>\r\n                                <span class=\"cta-trust-sep\"><\/span>\r\n                                <span>No account needed<\/span>\r\n                            <\/div>\r\n                        <\/div>\r\n                        <div class=\"cta-actions-col\">\r\n                            <a href=\"https:\/\/assistyu.com\/security-products\/\" target=\"_blank\" rel=\"noopener\" class=\"cta-btn\">\r\n                                <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M12 2 3 6v6c0 5.2 3.8 9.8 9 11 5.2-1.2 9-5.8 9-11V6l-9-4Z\"\/><path d=\"M9 12l2 2 4-4\"\/><\/svg>\r\n                                Get AssistYU Protection\r\n                            <\/a>\r\n                            <a href=\"https:\/\/assistyu.com\/contact\/\" target=\"_blank\" rel=\"noopener\" class=\"cta-link\">\r\n                                Talk to an expert\r\n                                <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg>\r\n                            <\/a>\r\n                        <\/div>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/div>\r\n\r\n        <\/main>\r\n\r\n        <!-- PHONE PILL -->\r\n        <div class=\"phone-pill\" id=\"phone-pill\">\r\n            <button type=\"button\" class=\"pp-icon\" id=\"pp-icon\" aria-label=\"Show phone number\" aria-expanded=\"false\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.127.96.361 1.903.7 2.81a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45c.907.339 1.85.573 2.81.7A2 2 0 0 1 22 16.92z\"\/><\/svg><\/button>\r\n            <a href=\"tel:+34951550227\" class=\"pp-text\" id=\"pp-text\">+34 9 515 502 27<\/a>\r\n        <\/div>\r\n\r\n        <div class=\"pov\" id=\"pov\">\r\n            <div class=\"povs\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M12 2 3 6v6c0 5.2 3.8 9.8 9 11 5.2-1.2 9-5.8 9-11V6l-9-4Z\"\/><path d=\"M9 12l2 2 4-4\"\/><\/svg><\/div>\r\n            <div class=\"povt\">Protected mode active<\/div>\r\n            <div class=\"povd\">AssistYU is masking your IP, blocking WebRTC leaks and hiding your network fingerprint.<\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <script>\r\n        \/\/ [JavaScript remains exactly the same as before - no changes needed]\r\n        document.addEventListener('DOMContentLoaded', function() {\r\n            (function() {\r\n                \/* =============================================\r\n                   RADAR CANVAS\r\n                   ============================================= *\/\r\n                var cv = document.getElementById('radarCanvas');\r\n                var ctx = cv.getContext('2d');\r\n                var W = cv.width, H = cv.height, cx = W \/ 2, cy = H \/ 2, R = W \/ 2 - 20;\r\n                var sweepAngle = 0;\r\n                var trailLen = 1.1;\r\n                var blipsData = [\r\n                    { a: 0.35, r: 0.65, c: 'cyan' }, { a: 1.8, r: 0.45, c: 'amber' },\r\n                    { a: 2.8, r: 0.80, c: 'cyan' }, { a: 3.8, r: 0.35, c: 'danger' },\r\n                    { a: 0.9, r: 0.55, c: 'cyan' }, { a: 4.5, r: 0.70, c: 'amber' },\r\n                    { a: 5.2, r: 0.50, c: 'cyan' }, { a: 2.0, r: 0.88, c: 'danger' }\r\n                ];\r\n                var blipAlpha = [0, 0, 0, 0, 0, 0, 0, 0];\r\n                var blipTarget = [1, 1, 1, 1, 1, 1, 1, 1];\r\n                var radarRunning = true;\r\n\r\n                function drawRadar(t) {\r\n                    if (!radarRunning) return;\r\n                    ctx.clearRect(0, 0, W, H);\r\n\r\n                    var grd = ctx.createRadialGradient(cx, cy, 0, cx, cy, R * 1.1);\r\n                    grd.addColorStop(0, 'rgba(79,110,247,0.04)');\r\n                    grd.addColorStop(1, 'transparent');\r\n                    ctx.fillStyle = grd;\r\n                    ctx.fillRect(0, 0, W, H);\r\n\r\n                    ctx.strokeStyle = 'rgba(79,110,247,0.25)';\r\n                    ctx.lineWidth = 1;\r\n                    [1, 0.834, 0.667, 0.5].forEach(function(s) {\r\n                        ctx.beginPath();\r\n                        ctx.arc(cx, cy, R * s, 0, Math.PI * 2);\r\n                        ctx.stroke();\r\n                    });\r\n\r\n                    ctx.strokeStyle = 'rgba(79,110,247,0.15)';\r\n                    ctx.lineWidth = 1;\r\n                    ctx.beginPath(); ctx.moveTo(cx - R, cy); ctx.lineTo(cx + R, cy); ctx.stroke();\r\n                    ctx.beginPath(); ctx.moveTo(cx, cy - R); ctx.lineTo(cx, cy + R); ctx.stroke();\r\n                    ctx.strokeStyle = 'rgba(79,110,247,0.06)';\r\n                    var d = R * 0.707;\r\n                    ctx.beginPath(); ctx.moveTo(cx - d, cy - d); ctx.lineTo(cx + d, cy + d); ctx.stroke();\r\n                    ctx.beginPath(); ctx.moveTo(cx + d, cy - d); ctx.lineTo(cx - d, cy + d); ctx.stroke();\r\n\r\n                    var segs = 60;\r\n                    for (var i = 0; i < segs; i++) {\r\n                        var frac = i \/ segs;\r\n                        var ang = sweepAngle - frac * trailLen;\r\n                        var alpha = (1 - frac) * 0.30;\r\n                        var sa = ang - 0.025, ea = ang + 0.025;\r\n                        ctx.beginPath();\r\n                        ctx.moveTo(cx, cy);\r\n                        ctx.arc(cx, cy, R, sa, ea);\r\n                        ctx.closePath();\r\n                        ctx.fillStyle = 'rgba(79,110,247,' + alpha + ')';\r\n                        ctx.fill();\r\n                    }\r\n\r\n                    ctx.save();\r\n                    ctx.translate(cx, cy);\r\n                    ctx.rotate(sweepAngle);\r\n                    var ag = ctx.createLinearGradient(0, 0, R, 0);\r\n                    ag.addColorStop(0, 'rgba(79,110,247,0.7)');\r\n                    ag.addColorStop(0.7, 'rgba(79,110,247,0.15)');\r\n                    ag.addColorStop(1, 'rgba(79,110,247,0)');\r\n                    ctx.beginPath(); ctx.moveTo(0, 0); ctx.lineTo(R, 0);\r\n                    ctx.strokeStyle = ag; ctx.lineWidth = 3; ctx.stroke();\r\n                    ctx.beginPath(); ctx.moveTo(0, 0); ctx.lineTo(R, 0);\r\n                    ctx.strokeStyle = 'rgba(79,110,247,0.9)'; ctx.lineWidth = 1.5; ctx.stroke();\r\n                    ctx.restore();\r\n\r\n                    var pulseTime = (t % 3000) \/ 3000;\r\n                    for (var p = 0; p < 3; p++) {\r\n                        var pt = (pulseTime + p \/ 3) % 1;\r\n                        var pr = R * pt;\r\n                        var pa = (1 - pt) * 0.25;\r\n                        ctx.beginPath();\r\n                        ctx.arc(cx, cy, pr, 0, Math.PI * 2);\r\n                        ctx.strokeStyle = 'rgba(79,110,247,' + pa + ')';\r\n                        ctx.lineWidth = 1;\r\n                        ctx.stroke();\r\n                    }\r\n\r\n                    var bColors = { cyan: '79,110,247', amber: '255,184,77', danger: '255,61,104' };\r\n                    for (var i = 0; i < blipsData.length; i++) {\r\n                        var b = blipsData[i];\r\n                        var ba = b.a + sweepAngle;\r\n                        var bx = cx + Math.cos(ba) * R * b.r;\r\n                        var by = cy + Math.sin(ba) * R * b.r;\r\n                        var dist = ((sweepAngle - b.a) % (Math.PI * 2) + Math.PI * 2) % (Math.PI * 2);\r\n                        if (dist < 0.3) blipTarget[i] = 1;\r\n                        else blipTarget[i] = 0.15;\r\n                        blipAlpha[i] += (blipTarget[i] - blipAlpha[i]) * 0.08;\r\n                        var a = blipAlpha[i];\r\n                        var rgb = bColors[b.c];\r\n                        ctx.beginPath(); ctx.arc(bx, by, 8, 0, Math.PI * 2);\r\n                        ctx.fillStyle = 'rgba(' + rgb + ',' + (a * 0.3) + ')'; ctx.fill();\r\n                        ctx.beginPath(); ctx.arc(bx, by, 3.5, 0, Math.PI * 2);\r\n                        ctx.fillStyle = 'rgba(' + rgb + ',' + a + ')'; ctx.fill();\r\n                        ctx.beginPath(); ctx.arc(bx, by, 1.5, 0, Math.PI * 2);\r\n                        ctx.fillStyle = 'rgba(255,255,255,' + (a * 0.7) + ')'; ctx.fill();\r\n                    }\r\n\r\n                    ctx.beginPath(); ctx.arc(cx, cy, 5, 0, Math.PI * 2); ctx.fillStyle = 'rgba(79,110,247,1)'; ctx.fill();\r\n                    ctx.beginPath(); ctx.arc(cx, cy, 12, 0, Math.PI * 2); ctx.fillStyle = 'rgba(79,110,247,0.15)'; ctx.fill();\r\n                    ctx.beginPath(); ctx.arc(cx, cy, 22, 0, Math.PI * 2); ctx.fillStyle = 'rgba(79,110,247,0.06)'; ctx.fill();\r\n\r\n                    sweepAngle += 0.025;\r\n                    requestAnimationFrame(drawRadar);\r\n                }\r\n\r\n                \/* =============================================\r\n                   SCAN STEPS\r\n                   ============================================= *\/\r\n                var STEPS = [\r\n                    { l: 'Resolving public IP', i: '\ud83c\udf10' }, { l: 'Fingerprinting ISP', i: '\ud83d\udce1' },\r\n                    { l: 'Triangulating location', i: '\ud83d\udccd' }, { l: 'Checking encryption', i: '\ud83d\udd12' },\r\n                    { l: 'Testing VPN \/ DC', i: '\ud83d\udee1\ufe0f' }, { l: 'WebRTC leak scan', i: '\u26a1' },\r\n                    { l: 'Analyzing connection type', i: '\ud83d\udcf6' }, { l: 'Measuring network speed', i: '\ud83d\udcca' },\r\n                    { l: 'Device fingerprint', i: '\ud83d\udda5\ufe0f' }, { l: 'Canvas fingerprint', i: '\ud83c\udfa8' },\r\n                    { l: 'Audio fingerprint', i: '\ud83d\udd0a' }, { l: 'Enumerating fonts', i: '\ud83d\udd24' },\r\n                    { l: 'Checking IP blacklists', i: '\ud83d\udccb' }, { l: 'VPN \/ proxy detection', i: '\ud83d\udd75\ufe0f' },\r\n                    { l: 'Scanning open ports & CVEs', i: '\ud83d\udd13' }, { l: 'Cross-checking timezone', i: '\ud83d\udd50' },\r\n                    { l: 'Evaluating data exposure', i: '\ud83d\udd0d' }, { l: 'Computing risk score', i: '\ud83d\udcc8' },\r\n                    { l: 'Compiling threat report', i: '\ud83d\udccb' }, { l: 'Generating security verdict', i: '\u2705' }\r\n                ];\r\n\r\n                var si = 0, sd = 700;\r\n                var bf, pbar, enpEl, statusEl;\r\n                var D;\r\n\r\n                document.getElementById('startBtn').addEventListener('click', function() {\r\n                    document.getElementById('start-view').style.display = 'none';\r\n                    var ss = document.getElementById('scan-stage');\r\n                    ss.style.display = 'block';\r\n\r\n                    si = 0;\r\n                    bf = document.getElementById('ebf');\r\n                    pbar = document.getElementById('enbwrap');\r\n                    enpEl = document.getElementById('enp');\r\n                    statusEl = document.getElementById('en-status');\r\n\r\n                    radarRunning = true;\r\n                    requestAnimationFrame(drawRadar);\r\n\r\n                    var tm = setInterval(function() {\r\n                        si++;\r\n                        if (si < STEPS.length) {\r\n                            var p = Math.round(((si + 1) \/ STEPS.length) * 100);\r\n                            bf.style.width = p + '%';\r\n                            pbar.setAttribute('aria-valuenow', p);\r\n                            enpEl.innerHTML = '<span class=\"pct\">' + p + '%<\/span>';\r\n                            statusEl.textContent = STEPS[si] ? STEPS[si].l + '\u2026' : 'Scanning\u2026';\r\n                        } else {\r\n                            clearInterval(tm);\r\n                            bf.style.width = '100%';\r\n                            pbar.setAttribute('aria-valuenow', 100);\r\n                            enpEl.innerHTML = '<span class=\"pct\">100%<\/span>';\r\n                            statusEl.className = 'en-status done';\r\n                            statusEl.innerHTML = 'Generating report<\/span> \u2014 almost there\u2026';\r\n                            setTimeout(function() { startDataCollection(); }, 800);\r\n                        }\r\n                    }, sd);\r\n                });\r\n\r\n                function startDataCollection() {\r\n                    D = {\r\n                        ip: null, city: null, region: null, country: null, cISO: null, lat: null, lon: null,\r\n                        isp: null, org: null, asn: null, tz: null,\r\n                        proto: location.protocol === 'https:' ? 'https' : 'http',\r\n                        dnt: navigator.doNotTrack === '1' || window.doNotTrack === '1' || navigator.doNotTrack === 'yes',\r\n                        ua: navigator.userAgent, lang: navigator.language,\r\n                        langs: navigator.languages ? Array.from(navigator.languages) : [],\r\n                        sW: screen.width, sH: screen.height, cd: screen.colorDepth, pr: window.devicePixelRatio || 1,\r\n                        wIPs: [], gpu: null, ipOK: false,\r\n                        hc: navigator.hardwareConcurrency || null, dm: navigator.deviceMemory || null,\r\n                        mt: navigator.maxTouchPoints || 0, ck: navigator.cookieEnabled,\r\n                        pc: navigator.plugins ? navigator.plugins.length : 0,\r\n                        effType: null, downlink: null, rtt: null, saveData: false, online: navigator.onLine,\r\n                        webdriver: !!navigator.webdriver, brTz: null, tzMatch: null,\r\n                        battLevel: null, battCharging: null, langMatch: null,\r\n                        shodanPorts: [], shodanVulns: [], shodanTags: [], shodanCpes: [], shodanOK: false,\r\n                        vpnDetected: false, proxyDetected: false, torDetected: false, hostingDetected: false,\r\n                        blacklisted: false, blacklistCount: 0, blacklistSources: '',\r\n                        canvasHash: null, audioHash: null, fontCount: 0, fontList: '',\r\n                        speedMbps: null, speedMs: null, speedBytes: 0, riskScore: 0, riskGrade: 'F'\r\n                    };\r\n\r\n                    \/* canvas fingerprint *\/\r\n                    try {\r\n                        var cc = document.createElement('canvas');\r\n                        cc.width = 280; cc.height = 60;\r\n                        var cctx = cc.getContext('2d');\r\n                        cctx.textBaseline = 'top'; cctx.font = '14px Arial';\r\n                        cctx.fillStyle = '#f60'; cctx.fillRect(0, 0, 280, 60);\r\n                        cctx.fillStyle = '#069'; cctx.fillText('AssistYU fingerprint', 2, 2);\r\n                        cctx.fillStyle = 'rgba(102,204,0,0.7)'; cctx.fillText('AssistYU fingerprint', 4, 4);\r\n                        D.canvasHash = cc.toDataURL().slice(-128);\r\n                        var h = 0;\r\n                        for (var ci = 0; ci < D.canvasHash.length; ci++) { h = ((h << 5) - h) + D.canvasHash.charCodeAt(ci); h |= 0; }\r\n                        D.canvasHash = h.toString(36);\r\n                    } catch (e) {}\r\n\r\n                    \/* audio *\/\r\n                    try {\r\n                        var Ac = window.OfflineAudioContext || window.webkitOfflineAudioContext;\r\n                        if (Ac) {\r\n                            var ac = new Ac(1, 44100, 44100);\r\n                            var osc = ac.createOscillator();\r\n                            osc.type = 'triangle';\r\n                            osc.frequency.setValueAtTime(10000, ac.currentTime);\r\n                            var comp = ac.createDynamicsCompressor();\r\n                            osc.connect(comp); comp.connect(ac.destination); osc.start(0);\r\n                            ac.startRendering().then(function(buf) {\r\n                                var d = buf.getChannelData(0).slice(4500, 5000);\r\n                                var sum = 0;\r\n                                for (var ai = 0; ai < d.length; ai++) sum += Math.abs(d[ai]);\r\n                                D.audioHash = Math.round(sum * 1000).toString(36);\r\n                            }).catch(function() {});\r\n                        }\r\n                    } catch (e) {}\r\n\r\n                    \/* fonts *\/\r\n                    try {\r\n                        var testFonts = ['Arial', 'Verdana', 'Helvetica', 'Times New Roman', 'Courier New', 'Georgia', 'Palatino', 'Garamond', 'Comic Sans MS', 'Impact', 'Lucida Console', 'Tahoma', 'Trebuchet MS', 'Calibri', 'Cambria', 'Segoe UI', 'Roboto', 'Open Sans', 'Lato', 'Ubuntu', 'Fira Code', 'Consolas', 'Menlo', 'Monaco'];\r\n                        var tc = document.createElement('span');\r\n                        tc.style.cssText = 'position:absolute;left:-9999px;font-size:72px;font-weight:bold;letter-spacing:0;opacity:0;';\r\n                        tc.textContent = 'mmmmmmmmmmlli';\r\n                        document.body.appendChild(tc);\r\n                        var baseW = tc.offsetWidth;\r\n                        var found = [];\r\n                        testFonts.forEach(function(f) {\r\n                            tc.style.fontFamily = '\"' + f + '\",monospace';\r\n                            if (tc.offsetWidth !== baseW) found.push(f);\r\n                        });\r\n                        document.body.removeChild(tc);\r\n                        D.fontCount = found.length;\r\n                        D.fontList = found.join(', ');\r\n                    } catch (e) {}\r\n\r\n                    \/* IP geo *\/\r\n                    var ipF = fetch('https:\/\/ipwho.is\/', { cache: 'no-store' }).then(function(r) { return r.json(); })\r\n                        .then(function(j) {\r\n                            if (j && j.success !== false && j.ip && isValidIP(j.ip)) {\r\n                                D.ip = j.ip; D.city = j.city; D.region = j.region; D.country = j.country; D.cISO = j.country_code;\r\n                                D.lat = typeof j.latitude === 'number' && isFinite(j.latitude) ? j.latitude : null;\r\n                                D.lon = typeof j.longitude === 'number' && isFinite(j.longitude) ? j.longitude : null;\r\n                                D.isp = j.connection && (j.connection.isp || j.connection.org) || null;\r\n                                D.org = j.connection && j.connection.org || null;\r\n                                D.asn = j.connection && j.connection.asn ? 'AS' + j.connection.asn : null;\r\n                                D.tz = j.timezone && j.timezone.id || null;\r\n                                D.ipOK = true;\r\n                            }\r\n                        }).catch(function() {\r\n                            return fetch('https:\/\/ipapi.co\/json\/', { cache: 'no-store' }).then(function(r) { return r.json(); }).then(function(j) {\r\n                                if (!j.ip || !isValidIP(j.ip)) { D.ipOK = false; return; }\r\n                                D.ip = j.ip; D.city = j.city; D.region = j.region; D.country = j.country_name; D.cISO = j.country_code;\r\n                                D.lat = typeof j.latitude === 'number' && isFinite(j.latitude) ? j.latitude : null;\r\n                                D.lon = typeof j.longitude === 'number' && isFinite(j.longitude) ? j.longitude : null;\r\n                                D.isp = j.org; D.org = j.org; D.asn = j.asn; D.tz = j.timezone; D.ipOK = true;\r\n                            }).catch(function() { D.ipOK = false; });\r\n                        });\r\n\r\n                    \/* WebRTC *\/\r\n                    var wP = new Promise(function(res) {\r\n                        try {\r\n                            var pc = new RTCPeerConnection({ iceServers: [{ urls: 'stun:stun.l.google.com:19302' }] });\r\n                            var f = new Set();\r\n                            pc.createDataChannel('');\r\n                            pc.onicecandidate = function(e) {\r\n                                if (!e.candidate) { pc.close(); res(Array.from(f)); return; }\r\n                                var ip = e.candidate.candidate.split(' ')[4];\r\n                                if (ip && (ip.match(\/^(\\d{1,3}\\.){3}\\d{1,3}$\/) || ip.indexOf(':') > -1)) {\r\n                                    if (!ip.startsWith('0.0.0.0')) f.add(ip);\r\n                                }\r\n                            };\r\n                            pc.createOffer().then(function(o) { pc.setLocalDescription(o); });\r\n                            setTimeout(function() { res(Array.from(f)); try { pc.close(); } catch (e) {} }, 1400);\r\n                        } catch (err) { res([]); }\r\n                    });\r\n\r\n                    \/* connection API *\/\r\n                    try {\r\n                        var conn = navigator.connection || navigator.mozConnection || navigator.webkitConnection;\r\n                        if (conn) {\r\n                            D.effType = conn.effectiveType || null;\r\n                            D.downlink = conn.downlink != null ? conn.downlink : null;\r\n                            D.rtt = conn.rtt != null ? conn.rtt : null;\r\n                            D.saveData = !!conn.saveData;\r\n                        }\r\n                    } catch (e) {}\r\n\r\n                    \/* speed test *\/\r\n                    var speedP = new Promise(function(res) {\r\n                        try {\r\n                            var chunks = [\r\n                                { url: 'https:\/\/speed.cloudflare.com\/__down?bytes=5000000', size: 5000000 },\r\n                                { url: 'https:\/\/speed.cloudflare.com\/__down?bytes=10000000', size: 10000000 },\r\n                                { url: 'https:\/\/speed.cloudflare.com\/__down?bytes=10000000', size: 10000000 }\r\n                            ];\r\n                            var totalBytes = 0;\r\n                            var t0 = 0;\r\n                            var done = false;\r\n                            function finish() {\r\n                                if (done) return;\r\n                                done = true;\r\n                                var elapsed = (performance.now() - t0) \/ 1000;\r\n                                if (elapsed > 0.5 && totalBytes > 0) {\r\n                                    D.speedMbps = ((totalBytes * 8) \/ elapsed \/ 1000000).toFixed(1);\r\n                                    D.speedMs = Math.round(elapsed * 1000);\r\n                                    D.speedBytes = totalBytes;\r\n                                }\r\n                                res();\r\n                            }\r\n                            var timeout = setTimeout(finish, 12000);\r\n                            t0 = performance.now();\r\n                            var chain = Promise.resolve();\r\n                            chunks.forEach(function(c) {\r\n                                chain = chain.then(function() {\r\n                                    if (done) return;\r\n                                    return fetch(c.url, { cache: 'no-store' }).then(function(r) { return r.arrayBuffer(); }).then(function(buf) {\r\n                                        if (!done) totalBytes += buf.byteLength;\r\n                                    }).catch(function() {});\r\n                                });\r\n                            });\r\n                            chain.then(function() { clearTimeout(timeout); finish(); });\r\n                        } catch (e) { res(); }\r\n                    });\r\n\r\n                    \/* timezone *\/\r\n                    try { D.brTz = Intl.DateTimeFormat().resolvedOptions().timeZone || null; } catch (e) {}\r\n\r\n                    \/* battery *\/\r\n                    var battP = new Promise(function(res) {\r\n                        try {\r\n                            if (navigator.getBattery) {\r\n                                navigator.getBattery().then(function(b) {\r\n                                    D.battLevel = b.level != null ? Math.round(b.level * 100) : null;\r\n                                    D.battCharging = !!b.charging;\r\n                                    res();\r\n                                }).catch(function() { res(); });\r\n                            } else { res(); }\r\n                        } catch (e) { res(); }\r\n                    });\r\n\r\n                    \/* GPU *\/\r\n                    try {\r\n                        var glCanvas = document.createElement('canvas');\r\n                        var gl = glCanvas.getContext('webgl') || glCanvas.getContext('experimental-webgl');\r\n                        if (gl) { var db = gl.getExtension('WEBGL_debug_renderer_info'); if (db) D.gpu = gl.getParameter(db.UNMASKED_RENDERER_WEBGL); }\r\n                    } catch (e) {}\r\n\r\n                    function isValidIP(ip) { return typeof ip === 'string' && \/^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$\/.test(ip); }\r\n\r\n                    var shodanP = ipF.then(function() {\r\n                        if (!D.ip || !isValidIP(D.ip)) return;\r\n                        return fetch('https:\/\/internetdb.shodan.io\/' + D.ip, { cache: 'no-store' }).then(function(r) { return r.json(); }).then(function(j) {\r\n                            D.shodanPorts = j.ports || []; D.shodanVulns = j.vulns || []; D.shodanTags = j.tags || []; D.shodanCpes = j.cpes || []; D.shodanOK = true;\r\n                        }).catch(function() {});\r\n                    });\r\n\r\n                    var blacklistP = ipF.then(function() {\r\n                        if (!D.ip || !isValidIP(D.ip)) return;\r\n                        return fetch('https:\/\/hackmyip.com\/api\/blacklist?ip=' + D.ip, { cache: 'no-store' }).then(function(r) { return r.json(); }).then(function(j) {\r\n                            if (j && j.blacklisted !== undefined) { D.blacklisted = !!j.blacklisted; D.blacklistCount = j.listed_on || 0; D.blacklistSources = j.sources ? j.sources.join(', ') : ''; }\r\n                        }).catch(function() {});\r\n                    });\r\n\r\n                    var ipprivP = ipF.then(function() {\r\n                        if (!D.ip || !isValidIP(D.ip)) return;\r\n                        return fetch('https:\/\/api.ippriv.com\/api\/security\/' + D.ip, { cache: 'no-store' }).then(function(r) { return r.json(); }).then(function(j) {\r\n                            if (j) { D.vpnDetected = !!j.isVPN; D.proxyDetected = !!j.isProxy; D.torDetected = !!j.isTor; D.hostingDetected = !!j.isHosting; }\r\n                        }).catch(function() {});\r\n                    });\r\n\r\n                    Promise.all([ipF, wP, battP, shodanP, blacklistP, ipprivP, speedP]).then(function(r) {\r\n                        D.wIPs = r[1];\r\n                        if (D.tz && D.brTz) {\r\n                            var ipCity = D.tz.split('\/').pop().replace(\/_\/g, ' ');\r\n                            var brCity = D.brTz.split('\/').pop().replace(\/_\/g, ' ');\r\n                            D.tzMatch = ipCity.toLowerCase() === brCity.toLowerCase();\r\n                        }\r\n                        if (D.cISO && D.lang) {\r\n                            var langCountry = D.lang.split('-')[1];\r\n                            if (langCountry) D.langMatch = langCountry.toUpperCase() === D.cISO.toUpperCase();\r\n                        }\r\n                        D.riskScore = calcRisk();\r\n                        D.riskGrade = D.riskScore >= 80 ? 'F' : D.riskScore >= 60 ? 'D' : D.riskScore >= 40 ? 'C' : D.riskScore >= 20 ? 'B' : 'A';\r\n                        setTimeout(reveal, Math.max(0, STEPS.length * sd + 500));\r\n                    });\r\n                }\r\n\r\n                function calcRisk() {\r\n                    var s = 0;\r\n                    if (D.ipOK && D.ip) s += 8;\r\n                    if (D.ipOK && (D.city || D.region || D.country)) s += 10;\r\n                    if (D.isp) s += 3;\r\n                    if (D.proto !== 'https') s += 12;\r\n                    if (D.wIPs.length > 0) s += 15;\r\n                    if (D.gpu) s += 4;\r\n                    if (D.hc) s += 3;\r\n                    if (D.dm) s += 2;\r\n                    if (D.canvasHash) s += 5;\r\n                    if (D.audioHash) s += 4;\r\n                    if (D.fontCount > 15) s += 3;\r\n                    if (D.webdriver) s += 10;\r\n                    if (D.tzMatch === false) s += 6;\r\n                    if (D.langMatch === false) s += 4;\r\n                    if (D.vpnDetected) s += 8;\r\n                    if (D.proxyDetected) s += 6;\r\n                    if (D.torDetected) s += 10;\r\n                    if (D.hostingDetected) s += 5;\r\n                    if (D.blacklisted) s += Math.min(D.blacklistCount * 2, 12);\r\n                    if (D.shodanVulns.length > 0) s += Math.min(D.shodanVulns.length * 3, 12);\r\n                    if (D.shodanPorts.length > 5) s += 3;\r\n                    if (!D.dnt) s += 2;\r\n                    if (D.ck) s += 2;\r\n                    if (D.pc > 0) s += 2;\r\n                    if (!D.online) s += 10;\r\n                    return Math.min(s, 100);\r\n                }\r\n\r\n                function ua2os(u) { if (\/Windows NT 10\/.test(u)) return 'Windows 10\/11'; if (\/Windows NT\/.test(u)) return 'Windows'; if (\/Mac OS X\/.test(u)) return 'macOS'; if (\/Android\/.test(u)) return 'Android ' + (u.match(\/Android\\s([\\d.]+)\/) || ['', ''])[1]; if (\/iPhone|iPad|iPod\/.test(u)) return 'iOS'; if (\/Linux\/.test(u)) return 'Linux'; return 'Unknown'; }\r\n\r\n                function ua2br(u) { if (\/Edg\\\/\/.test(u)) return 'Edge ' + (u.match(\/Edg\\\/([\\d.]+)\/) || ['', ''])[1]; if (\/OPR\\\/\/.test(u)) return 'Opera ' + (u.match(\/OPR\\\/([\\d.]+)\/) || ['', ''])[1]; if (\/Chrome\\\/\/.test(u) && !\/Chromium\/.test(u)) return 'Chrome ' + (u.match(\/Chrome\\\/([\\d.]+)\/) || ['', ''])[1]; if (\/Firefox\\\/\/.test(u)) return 'Firefox ' + (u.match(\/Firefox\\\/([\\d.]+)\/) || ['', ''])[1]; if (\/Safari\\\/\/.test(u) && !\/Chrome\/.test(u)) return 'Safari'; return 'Unknown'; }\r\n\r\n                var HOST = ['amazon', 'aws', 'google cloud', 'microsoft', 'azure', 'digitalocean', 'ovh', 'hetzner', 'linode', 'vultr', 'cloudflare', 'datacamp', 'leaseweb', 'choopa', 'contabo', 'oracle cloud', 'scaleway', 'hosting', 'colo', 'datacenter', 'alibaba'];\r\n\r\n                function mkC(ico, lbl, vid, sid, cls) {\r\n                    return '<div class=\"card c-' + (cls || 'cyan') + '\" data-p=\"' + vid + '\"><div class=\"ci\">' + ico + '<\/div><div class=\"cb\"><div class=\"cl\">' + lbl + '<\/div><div class=\"cv\" id=\"' + vid + '\">\u2014<\/div><div class=\"cs\" id=\"' + sid + '\"><\/div><\/div><\/div>';\r\n                }\r\n                var IC = {\r\n                    g: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M2.5 12h19M12 2.5c2.5 2.7 3.8 6 3.8 9.5s-1.3 6.8-3.8 9.5c-2.5-2.7-3.8-6-3.8-9.5S9.5 5.2 12 2.5Z\"\/><\/svg>',\r\n                    s: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><rect x=\"2\" y=\"7\" width=\"20\" height=\"4\" rx=\"1\"\/><rect x=\"2\" y=\"13\" width=\"20\" height=\"4\" rx=\"1\"\/><\/svg>',\r\n                    m: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M12 22s7-6.2 7-12a7 7 0 1 0-14 0c0 5.8 7 12 7 12Z\"\/><circle cx=\"12\" cy=\"10\" r=\"2.5\"\/><\/svg>',\r\n                    w: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M5 12.5a11 11 0 0 1 14 0M8 15.8a6.5 6.5 0 0 1 8 0M11.5 19a2 2 0 0 1 1 0\"\/><\/svg>',\r\n                    l: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><rect x=\"4\" y=\"10\" width=\"16\" height=\"10\" rx=\"2\"\/><path d=\"M8 10V7a4 4 0 0 1 8 0v3\"\/><\/svg>',\r\n                    sh: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M12 2 3 6v6c0 5.2 3.8 9.8 9 11 5.2-1.2 9-5.8 9-11V6l-9-4Z\"\/><\/svg>',\r\n                    ch: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M4 4h16v12H8l-4 4V4Z\"\/><\/svg>',\r\n                    mo: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"12\" rx=\"2\"\/><path d=\"M8 20h12M12 16v4\"\/><\/svg>',\r\n                    cp: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\"\/><rect x=\"9\" y=\"9\" width=\"6\" height=\"6\"\/><path d=\"M9 1v3M15 1v3M9 20v3M15 20v3M1 9h3M1 15h3M20 9h3M20 15h3\"\/><\/svg>',\r\n                    z: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\"\/><\/svg>',\r\n                    ck: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"\/><polyline points=\"22 4 12 14.01 9 11.01\"\/><\/svg>',\r\n                    e: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8S1 12 1 12z\"\/><circle cx=\"12\" cy=\"12\" r=\"3\"\/><\/svg>',\r\n                    f: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M12 11c0 5-2 8-2 8\"\/><path d=\"M16 11c0 3-1 5-2 7\"\/><path d=\"M8 11c0 3 1 5 2 7\"\/><path d=\"M4 11a8 8 0 0 1 16 0\"\/><\/svg>',\r\n                    r: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"2\"\/><path d=\"M4.93 19.07a10 10 0 0 1 0-14.14M7.76 16.24a6 6 0 0 1 0-8.48M16.24 7.76a6 6 0 0 1 0 8.48M19.07 4.93a10 10 0 0 1 0 14.14\"\/><\/svg>',\r\n                    tz: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><path d=\"M12 6v6l4 2\"\/><\/svg>',\r\n                    bt: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><rect x=\"2\" y=\"7\" width=\"18\" height=\"12\" rx=\"2\"\/><path d=\"M22 11v4\"\/><\/svg>',\r\n                    bot: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><rect x=\"4\" y=\"8\" width=\"16\" height=\"12\" rx=\"2\"\/><path d=\"M9 8V6a3 3 0 0 1 6 0v2\"\/><circle cx=\"9\" cy=\"14\" r=\"1\"\/><circle cx=\"15\" cy=\"14\" r=\"1\"\/><\/svg>',\r\n                    port: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\"\/><rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\"\/><path d=\"M6 6h.01M6 18h.01\"\/><\/svg>',\r\n                    vuln: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\/><path d=\"M9 12l2 2 4-4\"\/><\/svg>',\r\n                    blk: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><path d=\"M4.93 4.93l14.14 14.14\"\/><\/svg>',\r\n                    vpn: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\/><\/svg>',\r\n                    lang: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M5 8l6 6\"\/><path d=\"M4 14l6-6 2-3\"\/><path d=\"M2 5h12\"\/><path d=\"M7 2v3\"\/><path d=\"M22 22l-5-10-5 10\"\/><path d=\"M14 18h6\"\/><\/svg>',\r\n                    cnv: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"\/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"\/><path d=\"M21 15l-5-5L5 21\"\/><\/svg>',\r\n                    aud: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M9 18V5l12-2v13\"\/><circle cx=\"6\" cy=\"18\" r=\"3\"\/><circle cx=\"18\" cy=\"16\" r=\"3\"\/><\/svg>',\r\n                    fn: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><polyline points=\"4 7 4 4 20 4 20 7\"\/><line x1=\"9\" y1=\"20\" x2=\"15\" y2=\"20\"\/><line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\"\/><\/svg>'\r\n                };\r\n\r\n                var ORIG = {};\r\n                function setOrig(id, cardCls, valCls) { ORIG[id] = { card: cardCls, val: valCls }; }\r\n\r\n                function reveal() {\r\n                    radarRunning = false;\r\n                    document.getElementById('scan-stage').style.display = 'none';\r\n                    var org = ((D.isp || '') + ' ' + (D.org || '')).toLowerCase();\r\n                    var hosted = HOST.some(function(k) { return org.indexOf(k) > -1; });\r\n                    var leak = D.wIPs.length > 0;\r\n                    var enc = D.proto === 'https';\r\n                    var track = !D.dnt;\r\n                    var isVpn = D.vpnDetected || D.proxyDetected || D.torDetected;\r\n\r\n                    \/* gauge *\/\r\n                    var rgFill = document.getElementById('rg-fill');\r\n                    var rgNum = document.getElementById('rg-num');\r\n                    var rgGrade = document.getElementById('rg-grade');\r\n                    var rgSub = document.getElementById('rg-sub');\r\n                    var circumference = 314.16;\r\n                    var offset = circumference - (D.riskScore \/ 100) * circumference;\r\n                    var gColor = D.riskScore >= 60 ? 'var(--danger)' : D.riskScore >= 30 ? 'var(--amber)' : 'var(--safe)';\r\n                    setTimeout(function() { rgFill.style.strokeDashoffset = offset; rgFill.style.stroke = gColor; }, 100);\r\n                    rgNum.textContent = D.riskScore;\r\n                    var gradeText = D.riskGrade === 'F' ? 'Critical exposure' : D.riskGrade === 'D' ? 'High exposure' : D.riskGrade === 'C' ? 'Moderate exposure' : D.riskGrade === 'B' ? 'Low exposure' : 'Minimal exposure';\r\n                    rgGrade.innerHTML = 'Grade ' + D.riskGrade + ' <span class=\"sub\">' + gradeText + '<\/span>';\r\n                    rgGrade.style.color = gColor;\r\n\r\n                    var rgParts = [];\r\n                    if (leak) rgParts.push('WebRTC leak');\r\n                    if (D.vpnDetected) rgParts.push('VPN detected');\r\n                    if (D.torDetected) rgParts.push('Tor exit');\r\n                    if (D.blacklisted) rgParts.push('On ' + D.blacklistCount + ' blacklists');\r\n                    if (D.shodanVulns.length) rgParts.push(D.shodanVulns.length + ' CVEs');\r\n                    if (D.webdriver) rgParts.push('Automation');\r\n                    if (!enc) rgParts.push('Unencrypted');\r\n                    rgSub.innerHTML = rgParts.length ? rgParts.map(function(t) {\r\n                        var cls = 'tag';\r\n                        if (t.indexOf('leak') > -1 || t.indexOf('Tor') > -1 || t.indexOf('CVEs') > -1 || t.indexOf('Unencrypted') > -1) cls += ' danger';\r\n                        else if (t.indexOf('On ') > -1 || t.indexOf('Automation') > -1) cls += ' warn';\r\n                        else cls += ' safe';\r\n                        return '<span class=\"' + cls + '\">' + t + '<\/span>';\r\n                    }).join('') : '<span class=\"tag safe\">No critical signals<\/span>';\r\n\r\n                    \/* update hero blocks *\/\r\n                    updateHeroBlocks();\r\n\r\n                    \/* cards *\/\r\n                    var ipCls = D.ipOK && D.ip ? 'danger' : 'cyan';\r\n                    var ispCls = D.ipOK && D.isp ? 'warn' : 'cyan';\r\n                    var locCls = D.ipOK && (D.city || D.region || D.country) ? 'danger' : 'cyan';\r\n\r\n                    document.getElementById('gnet').innerHTML = [\r\n                        mkC(IC.g, 'Public IP address', 'v-ip', 'v-ip-s', ipCls),\r\n                        mkC(IC.s, 'Internet provider (ISP)', 'v-isp', 'v-isp-s', ispCls),\r\n                        mkC(IC.m, 'Approximate location', 'v-loc', 'v-loc-s', locCls)\r\n                    ].join('');\r\n                    setOrig('v-ip', ipCls, ipCls === 'danger' ? 'risk' : '');\r\n                    setOrig('v-isp', ispCls, ispCls === 'warn' ? 'warn' : '');\r\n                    setOrig('v-loc', locCls, locCls === 'danger' ? 'risk' : '');\r\n\r\n                    var vpnCls = isVpn ? 'danger' : D.hostingDetected ? 'warn' : 'safe';\r\n                    var blkCls = D.blacklisted ? 'danger' : 'safe';\r\n                    var portCls = D.shodanPorts.length > 0 ? 'warn' : 'safe';\r\n                    var vulnCls = D.shodanVulns.length > 0 ? 'danger' : 'safe';\r\n\r\n                    document.getElementById('gth').innerHTML = [\r\n                        mkC(IC.vpn, 'VPN \/ proxy \/ Tor', 'v-vpn', 'v-vpn-s', vpnCls),\r\n                        mkC(IC.blk, 'IP blacklists', 'v-blk', 'v-blk-s', blkCls),\r\n                        mkC(IC.port, 'Open ports', 'v-ports', 'v-ports-s', portCls),\r\n                        mkC(IC.vuln, 'Known CVEs', 'v-vulns', 'v-vulns-s', vulnCls)\r\n                    ].join('');\r\n                    setOrig('v-vpn', vpnCls, isVpn ? 'risk' : 'safe');\r\n                    setOrig('v-blk', blkCls, D.blacklisted ? 'risk' : 'safe');\r\n                    setOrig('v-ports', portCls, D.shodanPorts.length > 0 ? 'warn' : 'safe');\r\n                    setOrig('v-vulns', vulnCls, D.shodanVulns.length > 0 ? 'risk' : 'safe');\r\n\r\n                    var brCls = 'warn';\r\n                    var cpuCls = D.hc ? 'warn' : 'safe';\r\n                    var memCls = D.dm ? 'warn' : 'safe';\r\n                    var scrCls = 'warn';\r\n                    var tchCls = 'cyan';\r\n                    var battCls = 'cyan';\r\n                    var tzCls = 'cyan';\r\n                    var gpuCls = D.gpu ? 'warn' : 'cyan';\r\n                    var connValCls = 'cyan';\r\n                    if (D.speedMbps != null) {\r\n                        var sp = parseFloat(D.speedMbps);\r\n                        connValCls = sp >= 50 ? 'safe' : sp >= 10 ? 'cyan' : sp >= 2 ? 'warn' : 'danger';\r\n                    } else if (D.saveData) { connValCls = 'safe'; } else if (D.effType === 'slow-2g' || D.effType === '2g') { connValCls = 'warn'; }\r\n                    var cnvCls = D.canvasHash ? 'warn' : 'cyan';\r\n                    var audCls = D.audioHash ? 'warn' : 'cyan';\r\n                    var fnCls = D.fontCount > 15 ? 'warn' : 'cyan';\r\n\r\n                    document.getElementById('gdev').innerHTML = [\r\n                        mkC(IC.mo, 'Browser & OS', 'v-br', 'v-br-s', brCls),\r\n                        mkC(IC.cp, 'CPU cores', 'v-cpu', 'v-cpu-s', cpuCls),\r\n                        mkC(IC.f, 'Device memory', 'v-mem', 'v-mem-s', memCls),\r\n                        mkC(IC.z, 'Graphics processor', 'v-gpu', 'v-gpu-s', gpuCls),\r\n                        mkC(IC.mo, 'Screen resolution', 'v-scr', 'v-scr-s', scrCls),\r\n                        mkC(IC.r, 'Touch support', 'v-tch', 'v-tch-s', tchCls),\r\n                        mkC(IC.bt, 'Battery level', 'v-bat', 'v-bat-s', battCls),\r\n                        mkC(IC.tz, 'Browser timezone', 'v-tz', 'v-tz-s', tzCls),\r\n                        mkC(IC.cnv, 'Canvas fingerprint', 'v-cnv', 'v-cnv-s', cnvCls),\r\n                        mkC(IC.aud, 'Audio fingerprint', 'v-aud', 'v-aud-s', audCls),\r\n                        mkC(IC.fn, 'Font enumeration', 'v-fn', 'v-fn-s', fnCls)\r\n                    ].join('');\r\n                    setOrig('v-br', brCls, 'warn');\r\n                    setOrig('v-cpu', cpuCls, cpuCls === 'warn' ? 'warn' : 'safe');\r\n                    setOrig('v-mem', memCls, memCls === 'warn' ? 'warn' : 'safe');\r\n                    setOrig('v-gpu', gpuCls, gpuCls === 'warn' ? 'warn' : '');\r\n                    setOrig('v-scr', scrCls, 'warn');\r\n                    setOrig('v-tch', tchCls, '');\r\n                    setOrig('v-bat', battCls, '');\r\n                    setOrig('v-tz', tzCls, '');\r\n                    setOrig('v-cnv', cnvCls, 'warn');\r\n                    setOrig('v-aud', audCls, 'warn');\r\n                    setOrig('v-fn', fnCls, '');\r\n\r\n                    var encCls = enc ? 'safe' : 'danger';\r\n                    var netCls = hosted ? 'warn' : 'danger';\r\n                    var webCls = leak ? 'danger' : 'safe';\r\n                    var dntCls = track ? 'warn' : 'safe';\r\n                    var ckCls = D.ck ? 'warn' : 'safe';\r\n                    var plgCls = D.pc > 0 ? 'warn' : 'safe';\r\n                    var wdCls = D.webdriver ? 'danger' : 'safe';\r\n                    var tzmCls = D.tzMatch === false ? 'warn' : D.tzMatch === true ? 'safe' : 'cyan';\r\n                    var langCls = D.langMatch === false ? 'warn' : D.langMatch === true ? 'safe' : 'cyan';\r\n\r\n                    document.getElementById('gsec').innerHTML = [\r\n                        mkC(IC.l, 'Traffic encryption', 'v-enc', 'v-enc-s', encCls),\r\n                        mkC(IC.sh, 'Network type', 'v-nty', 'v-nty-s', netCls),\r\n                        mkC(IC.ch, 'WebRTC leak test', 'v-wrtc', 'v-wrtc-s', webCls),\r\n                        mkC(IC.w, 'Connection quality', 'v-conn', 'v-conn-s', connValCls),\r\n                        mkC(IC.e, 'Do not track \/ tracking', 'v-dnt', 'v-dnt-s', dntCls),\r\n                        mkC(IC.ck, 'Cookies enabled', 'v-ck', 'v-ck-s', ckCls),\r\n                        mkC(IC.f, 'Plugins installed', 'v-plg', 'v-plg-s', plgCls),\r\n                        mkC(IC.bot, 'Automation detected', 'v-wd', 'v-wd-s', wdCls),\r\n                        mkC(IC.tz, 'Timezone cross-check', 'v-tzm', 'v-tzm-s', tzmCls),\r\n                        mkC(IC.lang, 'Language vs location', 'v-lang', 'v-lang-s', langCls)\r\n                    ].join('');\r\n                    setOrig('v-enc', encCls, enc ? 'safe' : 'risk');\r\n                    setOrig('v-nty', netCls, hosted ? 'warn' : 'risk');\r\n                    setOrig('v-wrtc', webCls, leak ? 'risk' : 'safe');\r\n                    setOrig('v-conn', connValCls, connValCls === 'safe' ? 'safe' : '');\r\n                    setOrig('v-dnt', dntCls, track ? 'warn' : 'safe');\r\n                    setOrig('v-ck', ckCls, D.ck ? 'warn' : 'safe');\r\n                    setOrig('v-plg', plgCls, D.pc > 0 ? 'warn' : 'safe');\r\n                    setOrig('v-wd', wdCls, D.webdriver ? 'risk' : 'safe');\r\n                    setOrig('v-tzm', tzmCls, D.tzMatch === false ? 'warn' : D.tzMatch === true ? 'safe' : '');\r\n                    setOrig('v-lang', langCls, D.langMatch === false ? 'warn' : D.langMatch === true ? 'safe' : '');\r\n\r\n                    \/* populate card values *\/\r\n                    var ipEl = document.getElementById('v-ip');\r\n                    ipEl.textContent = D.ip || 'Unavailable';\r\n                    if (ORIG['v-ip'].val) ipEl.classList.add(ORIG['v-ip'].val);\r\n                    document.getElementById('v-ip-s').textContent = D.ipOK ? 'Visible to every site you visit' : 'Could not resolve';\r\n\r\n                    var ispEl = document.getElementById('v-isp');\r\n                    ispEl.textContent = D.isp || 'Unavailable';\r\n                    if (ORIG['v-isp'].val) ispEl.classList.add(ORIG['v-isp'].val);\r\n                    var ispSub = D.asn || '';\r\n                    if (D.org && D.org !== D.isp) {\r\n                        var orgClean = D.org.replace(\/2g\\\/3g\\\/4g\\s*\/gi, '').replace(\/Mobile Costumers\/gi, '').replace(\/Mobile Customers\/gi, '').replace(\/Customers\/gi, '').trim();\r\n                        if (orgClean) ispSub += (ispSub ? ' \u00b7 ' : '') + orgClean;\r\n                    }\r\n                    document.getElementById('v-isp-s').textContent = ispSub;\r\n\r\n                    var lp = [D.city, D.region, D.country].filter(Boolean);\r\n                    var locEl = document.getElementById('v-loc');\r\n                    locEl.textContent = lp.length ? lp.join(', ') : 'Unavailable';\r\n                    if (ORIG['v-loc'].val) locEl.classList.add(ORIG['v-loc'].val);\r\n                    document.getElementById('v-loc-s').textContent = D.tz ? 'Timezone: ' + D.tz : '';\r\n\r\n                    var vpnEl = document.getElementById('v-vpn');\r\n                    if (isVpn) {\r\n                        var vpnParts = [];\r\n                        if (D.vpnDetected) vpnParts.push('VPN');\r\n                        if (D.proxyDetected) vpnParts.push('Proxy');\r\n                        if (D.torDetected) vpnParts.push('Tor');\r\n                        vpnEl.textContent = 'Detected: ' + vpnParts.join(', ');\r\n                        vpnEl.className = 'cv risk';\r\n                    } else if (D.hostingDetected) { vpnEl.textContent = 'Datacenter \/ hosting'; vpnEl.className = 'cv warn'; } else { vpnEl.textContent = 'Not detected'; vpnEl.className = 'cv safe'; }\r\n                    document.getElementById('v-vpn-s').textContent = isVpn ? 'Your IP is associated with anonymizer infrastructure' : 'No VPN, proxy or Tor exit detected on this IP';\r\n\r\n                    var blkEl = document.getElementById('v-blk');\r\n                    blkEl.textContent = D.blacklisted ? 'Listed on ' + D.blacklistCount + ' blocklist' + (D.blacklistCount !== 1 ? 's' : '') : 'Clean \u2014 not listed';\r\n                    blkEl.className = 'cv ' + (D.blacklisted ? 'risk' : 'safe');\r\n                    document.getElementById('v-blk-s').textContent = D.blacklisted ? 'Found on: ' + D.blacklistSources : 'Not found on major spam\/abuse DNS blocklists';\r\n\r\n                    var portsEl = document.getElementById('v-ports');\r\n                    portsEl.textContent = D.shodanPorts.length > 0 ? D.shodanPorts.length + ' open port' + (D.shodanPorts.length !== 1 ? 's' : '') : 'No open ports detected';\r\n                    portsEl.className = 'cv ' + (D.shodanPorts.length > 0 ? 'warn' : 'safe');\r\n                    document.getElementById('v-ports-s').textContent = D.shodanPorts.length > 0 ? 'Ports: ' + D.shodanPorts.slice(0, 12).join(', ') + (D.shodanPorts.length > 12 ? ' +' + (D.shodanPorts.length - 12) + ' more' : '') : 'Shodan InternetDB shows no open ports';\r\n\r\n                    var vulnEl = document.getElementById('v-vulns');\r\n                    vulnEl.textContent = D.shodanVulns.length > 0 ? D.shodanVulns.length + ' vulnerabilit' + (D.shodanVulns.length !== 1 ? 'ies' : 'y') : 'No known CVEs';\r\n                    vulnEl.className = 'cv ' + (D.shodanVulns.length > 0 ? 'risk' : 'safe');\r\n                    document.getElementById('v-vulns-s').textContent = D.shodanVulns.length > 0 ? 'CVEs: ' + D.shodanVulns.slice(0, 6).join(', ') + (D.shodanVulns.length > 6 ? ' +' + (D.shodanVulns.length - 6) + ' more' : '') : 'No known vulnerabilities found on Shodan';\r\n\r\n                    var brEl = document.getElementById('v-br');\r\n                    brEl.textContent = ua2br(D.ua);\r\n                    brEl.classList.add('warn');\r\n                    document.getElementById('v-br-s').textContent = ua2os(D.ua) + ' \u00b7 ' + D.lang + (D.langs.length > 1 ? ' \u00b7 ' + D.langs.join(', ') : '');\r\n\r\n                    var cpuEl = document.getElementById('v-cpu');\r\n                    cpuEl.textContent = D.hc ? D.hc + ' cores' : 'Unavailable';\r\n                    if (ORIG['v-cpu'].val) cpuEl.classList.add(ORIG['v-cpu'].val);\r\n                    document.getElementById('v-cpu-s').textContent = D.hc ? 'Exposed via navigator.hardwareConcurrency \u2014 adds to your fingerprint' : 'Not exposed \u2014 this browser hides it';\r\n\r\n                    var memEl = document.getElementById('v-mem');\r\n                    memEl.textContent = D.dm ? D.dm + ' GB' : 'Unavailable';\r\n                    if (ORIG['v-mem'].val) memEl.classList.add(ORIG['v-mem'].val);\r\n                    document.getElementById('v-mem-s').textContent = D.dm ? 'Exposed via navigator.deviceMemory \u2014 adds to your fingerprint' : 'Not supported \u2014 Firefox\/Safari hide this';\r\n\r\n                    var scrEl = document.getElementById('v-scr');\r\n                    scrEl.textContent = D.sW + '\u00d7' + D.sH;\r\n                    scrEl.classList.add('warn');\r\n                    document.getElementById('v-scr-s').textContent = D.pr + 'x pixel ratio \u00b7 ' + D.cd + '-bit color depth \u2014 a fingerprinting signal';\r\n\r\n                    var gpuEl = document.getElementById('v-gpu');\r\n                    gpuEl.textContent = D.gpu || 'Unavailable';\r\n                    if (ORIG['v-gpu'].val) gpuEl.classList.add(ORIG['v-gpu'].val);\r\n                    document.getElementById('v-gpu-s').textContent = D.gpu ? D.gpu + ' \u2014 WebGL renderer exposed, strong fingerprinting signal' : 'GPU info hidden by browser';\r\n\r\n                    document.getElementById('v-tch').textContent = D.mt + ' touch point' + (D.mt !== 1 ? 's' : '');\r\n                    document.getElementById('v-tch-s').textContent = D.mt > 0 ? 'Touch-enabled device' : 'No touch input detected';\r\n\r\n                    var batEl = document.getElementById('v-bat');\r\n                    batEl.textContent = D.battLevel != null ? D.battLevel + '%' : 'Unavailable';\r\n                    if (ORIG['v-bat'].val) batEl.classList.add(ORIG['v-bat'].val);\r\n                    document.getElementById('v-bat-s').textContent = D.battLevel != null ? D.battCharging ? 'Charging' : 'On battery \u2014 ' + D.battLevel + '% remaining' : 'Battery API not supported by this browser';\r\n\r\n                    var tzEl = document.getElementById('v-tz');\r\n                    tzEl.textContent = D.brTz || 'Unavailable';\r\n                    if (ORIG['v-tz'].val) tzEl.classList.add(ORIG['v-tz'].val);\r\n                    document.getElementById('v-tz-s').textContent = D.brTz ? (D.tz ? 'IP timezone: ' + D.tz : '') : 'Browser does not expose timezone';\r\n\r\n                    var cnvEl = document.getElementById('v-cnv');\r\n                    cnvEl.textContent = D.canvasHash ? 'Hash: ' + D.canvasHash : 'Unavailable';\r\n                    if (ORIG['v-cnv'].val) cnvEl.classList.add(ORIG['v-cnv'].val);\r\n                    document.getElementById('v-cnv-s').textContent = D.canvasHash ? 'Canvas rendering hash computed \u2014 unique per device\/GPU\/driver combination' : 'Canvas fingerprint not available';\r\n\r\n                    var audEl = document.getElementById('v-aud');\r\n                    audEl.textContent = D.audioHash ? 'Hash: ' + D.audioHash : 'Unavailable';\r\n                    if (ORIG['v-aud'].val) audEl.classList.add(ORIG['v-aud'].val);\r\n                    document.getElementById('v-aud-s').textContent = D.audioHash ? 'AudioContext oscillator hash \u2014 adds another dimension to your fingerprint' : 'Audio fingerprint not available';\r\n\r\n                    var fnEl = document.getElementById('v-fn');\r\n                    fnEl.textContent = D.fontCount + ' font' + (D.fontCount !== 1 ? 's' : '') + ' detected';\r\n                    if (ORIG['v-fn'].val) fnEl.classList.add(ORIG['v-fn'].val);\r\n                    document.getElementById('v-fn-s').textContent = D.fontCount > 0 ? D.fontCount + ' unique system fonts found \u2014 font list is a strong fingerprinting signal' : 'Font enumeration not available';\r\n\r\n                    var eC = document.getElementById('v-enc');\r\n                    eC.textContent = enc ? 'TLS \/ HTTPS' : 'Unencrypted';\r\n                    eC.className = 'cv ' + (enc ? 'safe' : 'risk');\r\n                    document.getElementById('v-enc-s').textContent = enc ? 'Connection is encrypted end-to-end with TLS' : 'Data sent in plain text \u2014 ISP can read everything';\r\n                    var nC = document.getElementById('v-nty');\r\n                    nC.textContent = hosted ? 'Datacenter \/ Cloud' : 'Residential ISP';\r\n                    nC.className = 'cv ' + (hosted ? 'warn' : 'risk');\r\n                    document.getElementById('v-nty-s').textContent = hosted ? 'Possibly behind a VPN or proxy' : 'Your real ISP network \u2014 no VPN detected';\r\n                    var wC = document.getElementById('v-wrtc');\r\n                    wC.textContent = leak ? 'Leak: ' + D.wIPs[0] : 'No leak detected';\r\n                    wC.className = 'cv ' + (leak ? 'risk' : 'safe');\r\n                    document.getElementById('v-wrtc-s').textContent = leak ? 'Your local IP is exposed to any website with WebRTC' : 'WebRTC cannot reach your local network';\r\n\r\n                    var connEl = document.getElementById('v-conn');\r\n                    var connSub = document.getElementById('v-conn-s');\r\n                    if (D.speedMbps != null) {\r\n                        var sp = parseFloat(D.speedMbps);\r\n                        connEl.textContent = D.speedMbps + ' Mbps';\r\n                        var connParts = [];\r\n                        if (D.effType) connParts.push(D.effType.toUpperCase());\r\n                        if (D.rtt != null) connParts.push('RTT ~' + D.rtt + 'ms');\r\n                        if (D.speedMs) connParts.push('Test: ' + (D.speedMs \/ 1000).toFixed(1) + 's');\r\n                        if (D.speedBytes >= 1000000) connParts.push((D.speedBytes \/ 1000000).toFixed(1) + ' MB downloaded');\r\n                        connSub.textContent = connParts.filter(Boolean).join(' \u00b7 ');\r\n                    } else if (D.effType) {\r\n                        connEl.textContent = D.effType.toUpperCase() + (D.downlink != null ? ' \u00b7 ~' + D.downlink + ' Mbps' : '');\r\n                        connSub.textContent = D.rtt != null ? '~' + D.rtt + 'ms round-trip' + (D.saveData ? ' \u00b7 Data saver ON' : '') : 'Network Information API estimate \u2014 speed test failed';\r\n                    } else {\r\n                        connEl.textContent = 'Unavailable';\r\n                        connSub.textContent = 'Speed test and Network Information API both unavailable';\r\n                    }\r\n                    if (ORIG['v-conn'].val) connEl.classList.add(ORIG['v-conn'].val);\r\n\r\n                    var dC = document.getElementById('v-dnt');\r\n                    dC.textContent = track ? 'Not set' : 'Do Not Track active';\r\n                    dC.className = 'cv ' + (track ? 'warn' : 'safe');\r\n                    document.getElementById('v-dnt-s').textContent = track ? 'Your browser does not request sites not to track you' : 'Browser signals sites not to track you';\r\n                    var ckC = document.getElementById('v-ck');\r\n                    ckC.textContent = D.ck ? 'Enabled' : 'Disabled';\r\n                    ckC.className = 'cv ' + (D.ck ? 'warn' : 'safe');\r\n                    document.getElementById('v-ck-s').textContent = D.ck ? 'Sites can store cookies \u2014 can be used for tracking' : 'Cookies are blocked by browser settings';\r\n                    var plgEl = document.getElementById('v-plg');\r\n                    plgEl.textContent = D.pc + ' plugin' + (D.pc !== 1 ? 's' : '');\r\n                    if (ORIG['v-plg'].val) plgEl.classList.add(ORIG['v-plg'].val);\r\n                    document.getElementById('v-plg-s').textContent = D.pc > 0 ? 'Browser plugins can increase your fingerprint surface' : 'No plugins detected \u2014 lower fingerprint risk';\r\n\r\n                    var wdEl = document.getElementById('v-wd');\r\n                    wdEl.textContent = D.webdriver ? 'Detected \u2014 automated browser' : 'Not detected';\r\n                    wdEl.className = 'cv ' + (D.webdriver ? 'risk' : 'safe');\r\n                    document.getElementById('v-wd-s').textContent = D.webdriver ? 'navigator.webdriver is true \u2014 this browser is controlled by automation' : 'No automation framework detected';\r\n\r\n                    var tzmEl = document.getElementById('v-tzm');\r\n                    if (D.tzMatch === true) { tzmEl.textContent = 'Timezones match'; tzmEl.className = 'cv safe'; } else if (D.tzMatch === false) { tzmEl.textContent = 'Mismatch \u2014 possible VPN'; tzmEl.className = 'cv warn'; } else { tzmEl.textContent = 'Insufficient data'; tzmEl.className = 'cv'; }\r\n                    if (ORIG['v-tzm'].val) tzmEl.classList.add(ORIG['v-tzm'].val);\r\n                    document.getElementById('v-tzm-s').textContent = D.tzMatch === true ? 'Browser and IP timezones align \u2014 consistent location' : D.tzMatch === false ? 'Browser timezone ' + D.brTz + ' differs from IP timezone ' + D.tz + ' \u2014 may indicate VPN or proxy' : 'Could not compare timezones';\r\n\r\n                    var langEl = document.getElementById('v-lang');\r\n                    if (D.langMatch === true) { langEl.textContent = 'Language matches region'; langEl.className = 'cv safe'; } else if (D.langMatch === false) { langEl.textContent = 'Mismatch \u2014 suspicious'; langEl.className = 'cv warn'; } else { langEl.textContent = 'Insufficient data'; langEl.className = 'cv'; }\r\n                    if (ORIG['v-lang'].val) langEl.classList.add(ORIG['v-lang'].val);\r\n                    document.getElementById('v-lang-s').textContent = D.langMatch === true ? 'Browser language is consistent with IP geolocation' : D.langMatch === false ? 'Browser language ' + D.lang + ' does not match expected language for ' + D.cISO + ' \u2014 may indicate spoofing' : 'Could not compare language to location';\r\n\r\n                    \/* map *\/\r\n                    if (typeof D.lat === 'number' && typeof D.lon === 'number' && isFinite(D.lat) && isFinite(D.lon)) {\r\n                        var d = 0.35;\r\n                        var locStr = [D.city, D.region, D.country].filter(Boolean).join(', ');\r\n                        document.getElementById('mif').src = 'https:\/\/www.openstreetmap.org\/export\/embed.html?bbox=' + (D.lon - d) + ',' + (D.lat - d) + ',' + (D.lon + d) + ',' + (D.lat + d) + '&layer=mapnik&marker=' + D.lat + ',' + D.lon;\r\n                        document.getElementById('map-loc-t').textContent = locStr || 'Unknown location';\r\n                        document.getElementById('map-label-loc').textContent = locStr || 'Unknown location';\r\n                        var latDir = D.lat >= 0 ? 'N' : 'S';\r\n                        var lonDir = D.lon >= 0 ? 'E' : 'W';\r\n                        document.getElementById('map-loc-s').textContent = Math.abs(D.lat).toFixed(4) + '\u00b0' + latDir + ', ' + Math.abs(D.lon).toFixed(4) + '\u00b0' + lonDir;\r\n                        document.getElementById('map-click').addEventListener('click', function() { document.getElementById('mapw').classList.add('active'); });\r\n                        document.getElementById('map-click').addEventListener('keydown', function(e) { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); document.getElementById('mapw').classList.add('active'); } });\r\n                    } else {\r\n                        document.getElementById('mapw').innerHTML = '<div style=\"display:flex;align-items:center;justify-content:center;height:100%;color:var(--ayu-text-secondary);font-family:var(--font-mono);font-size:12px;\">Location unavailable<\/div>';\r\n                        document.getElementById('map-label-loc').textContent = 'Unavailable';\r\n                    }\r\n\r\n                    document.getElementById('verdict-view').style.display = 'block';\r\n                }\r\n\r\n                function updateHeroBlocks() {\r\n                    var critical = 0, warning = 0;\r\n                    if (D.ipOK && D.ip) critical++;\r\n                    if (D.ipOK && (D.city || D.region || D.country)) critical++;\r\n                    if (D.proto !== 'https') critical++;\r\n                    if (D.wIPs.length > 0) critical++;\r\n                    if (D.webdriver) critical++;\r\n                    if (D.torDetected) critical++;\r\n                    if (D.shodanVulns.length > 0) critical++;\r\n                    if (D.blacklisted) critical++;\r\n                    if (D.ipOK && D.isp) warning++;\r\n                    if (D.hostingDetected) warning++;\r\n                    if (!D.dnt) warning++;\r\n                    if (D.ck) warning++;\r\n                    if (D.pc > 0) warning++;\r\n                    if (D.hc) warning++;\r\n                    if (D.gpu) warning++;\r\n                    if (D.tzMatch === false) warning++;\r\n                    if (D.langMatch === false) warning++;\r\n                    if (D.vpnDetected) warning++;\r\n                    if (D.proxyDetected) warning++;\r\n                    if (D.shodanPorts.length > 0) warning++;\r\n                    if (D.canvasHash) warning++;\r\n                    if (D.fontCount > 15) warning++;\r\n                    if (!D.online) critical++;\r\n                    var total = critical + warning;\r\n                    var isExposed = total > 0;\r\n\r\n                    var left = document.getElementById('hero-left');\r\n                    var right = document.getElementById('hero-right');\r\n                    var label = document.getElementById('threats-label');\r\n                    var numEl = document.getElementById('threats-num');\r\n                    var titleEl = document.getElementById('vtitle');\r\n                    var critBadge = document.getElementById('vbr-crit');\r\n                    var warnBadge = document.getElementById('vbr-warn');\r\n                    var critN = document.getElementById('crit-n');\r\n                    var warnN = document.getElementById('warn-n');\r\n                    var toggleLabel = document.getElementById('toggle-label');\r\n                    var toggleWrap = document.getElementById('tgw');\r\n                    var badge = document.getElementById('vbadge');\r\n                    var mainTitle = document.getElementById('vMainTitle');\r\n                    var mainDesc = document.getElementById('vMainDesc');\r\n                    var mainSubDesc = document.getElementById('vMainSubDesc');\r\n                    var sw = document.getElementById('sw');\r\n\r\n                    if (isExposed) {\r\n                        left.className = 'hero-block hero-left exposed';\r\n                        right.className = 'hero-block hero-right exposed';\r\n                        label.className = 'threats-label danger';\r\n                        label.textContent = 'THREATS DETECTED';\r\n                        numEl.className = 'num';\r\n                        numEl.textContent = total;\r\n                        titleEl.innerHTML = 'issues found on your current connection';\r\n                        critN.textContent = critical;\r\n                        warnN.textContent = warning;\r\n                        critBadge.style.display = critical > 0 ? 'inline-flex' : 'none';\r\n                        warnBadge.style.display = warning > 0 ? 'inline-flex' : 'none';\r\n                        toggleLabel.textContent = 'Protected mode';\r\n                        toggleLabel.className = 'toggle-label';\r\n                        toggleWrap.className = 'protect-toggle-row';\r\n                        badge.className = 'vb dg';\r\n                        mainTitle.textContent = 'AssistYU Network Scan';\r\n                        mainDesc.textContent = 'Your network is exposed.';\r\n                        mainSubDesc.textContent = 'Real-time diagnostic of your IP exposure, browser fingerprint, and threat intelligence';\r\n                        sw.textContent = 'exposed';\r\n                        sw.className = 'sw-t exposed';\r\n                        document.querySelector('.verdict-header').className = 'verdict-header exposed';\r\n                    } else {\r\n                        left.className = 'hero-block hero-left protected';\r\n                        right.className = 'hero-block hero-right protected';\r\n                        label.className = 'threats-label safe';\r\n                        label.textContent = 'PROTECTED';\r\n                        numEl.className = 'num safe';\r\n                        numEl.textContent = '0';\r\n                        titleEl.innerHTML = 'Your traffic is <span class=\"highlight\">encrypted end-to-end<\/span>';\r\n                        critBadge.style.display = 'none';\r\n                        warnBadge.style.display = 'none';\r\n                        toggleLabel.textContent = 'Protected mode';\r\n                        toggleLabel.className = 'toggle-label active';\r\n                        toggleWrap.className = 'protect-toggle-row on';\r\n                        badge.className = 'vb sg';\r\n                        mainTitle.textContent = 'AssistYU Network Scan';\r\n                        mainDesc.textContent = 'You\\'re protected.';\r\n                        mainSubDesc.textContent = 'Your connection is secured with end-to-end encryption';\r\n                        sw.textContent = 'protected';\r\n                        sw.className = 'sw-t protected';\r\n                        document.querySelector('.verdict-header').className = 'verdict-header protected';\r\n                    }\r\n                }\r\n\r\n                var OV = {};\r\n                document.getElementById('ptog').addEventListener('change', function(e) {\r\n                    var left = document.getElementById('hero-left');\r\n                    var right = document.getElementById('hero-right');\r\n                    var label = document.getElementById('threats-label');\r\n                    var numEl = document.getElementById('threats-num');\r\n                    var titleEl = document.getElementById('vtitle');\r\n                    var critBadge = document.getElementById('vbr-crit');\r\n                    var warnBadge = document.getElementById('vbr-warn');\r\n                    var toggleLabel = document.getElementById('toggle-label');\r\n                    var toggleWrap = document.getElementById('tgw');\r\n                    var badge = document.getElementById('vbadge');\r\n                    var mainTitle = document.getElementById('vMainTitle');\r\n                    var mainDesc = document.getElementById('vMainDesc');\r\n                    var mainSubDesc = document.getElementById('vMainSubDesc');\r\n                    var sw = document.getElementById('sw');\r\n                    var cards = document.querySelectorAll('[data-p]');\r\n                    var mapMask = document.getElementById('map-mask');\r\n\r\n                    var critical = parseInt(document.getElementById('crit-n').textContent) || 0;\r\n                    var warning = parseInt(document.getElementById('warn-n').textContent) || 0;\r\n                    var total = critical + warning;\r\n                    var isExposed = total > 0;\r\n\r\n                    if (e.target.checked) {\r\n                        left.className = 'hero-block hero-left protected';\r\n                        right.className = 'hero-block hero-right protected';\r\n                        label.className = 'threats-label safe';\r\n                        label.textContent = 'PROTECTED';\r\n                        numEl.className = 'num safe';\r\n                        numEl.textContent = '0';\r\n                        titleEl.innerHTML = 'Your traffic is <span class=\"highlight\">encrypted end-to-end<\/span>';\r\n                        critBadge.style.display = 'none';\r\n                        warnBadge.style.display = 'none';\r\n                        toggleLabel.textContent = 'Protected mode';\r\n                        toggleLabel.className = 'toggle-label active';\r\n                        toggleWrap.className = 'protect-toggle-row on';\r\n                        badge.className = 'vb sg';\r\n                        mainTitle.textContent = 'AssistYU Network Scan';\r\n                        mainDesc.textContent = 'You\\'re protected.';\r\n                        mainSubDesc.textContent = 'Your connection is secured with end-to-end encryption';\r\n                        sw.textContent = 'protected';\r\n                        sw.className = 'sw-t protected';\r\n                        document.querySelector('.verdict-header').className = 'verdict-header protected';\r\n                        if (mapMask) mapMask.classList.add('show');\r\n                        document.getElementById('rg-fill').style.stroke = 'var(--safe)';\r\n                        document.getElementById('rg-fill').style.strokeDashoffset = '0';\r\n                        document.getElementById('rg-num').textContent = '0';\r\n                        document.getElementById('rg-grade').innerHTML = 'Grade A <span class=\"sub\">Fully protected<\/span>';\r\n                        document.getElementById('rg-grade').style.color = 'var(--safe)';\r\n                        document.getElementById('rg-sub').innerHTML = '<span class=\"tag safe\">Protected mode masks all exposure signals<\/span>';\r\n\r\n                        cards.forEach(function(c) {\r\n                            var v = c.querySelector('.cv'), id = c.dataset.p;\r\n                            if (v && id) {\r\n                                if (!OV[id]) OV[id] = v.textContent;\r\n                                if (id === 'v-ip') { v.textContent = '\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022'; v.className = 'cv mask'; }\r\n                                else if (id === 'v-loc') { v.textContent = 'Location masked'; v.className = 'cv mask'; }\r\n                                else if (id === 'v-wrtc') { v.textContent = 'Blocked'; v.className = 'cv safe'; }\r\n                                else if (id === 'v-nty') { v.textContent = 'VPN \/ masked'; v.className = 'cv safe'; }\r\n                                else if (id === 'v-enc') { v.textContent = 'TLS + AssistYU tunnel'; v.className = 'cv safe'; }\r\n                                else if (id === 'v-dnt') { v.textContent = 'Tracking blocked'; v.className = 'cv safe'; }\r\n                                else if (id === 'v-ck') { v.textContent = 'Cookies blocked'; v.className = 'cv safe'; }\r\n                                else if (id === 'v-wd') { v.textContent = 'Spoofed \u2014 undetectable'; v.className = 'cv safe'; }\r\n                                else if (id === 'v-tzm') { v.textContent = 'Consistent \u2014 masked'; v.className = 'cv safe'; }\r\n                                else if (id === 'v-lang') { v.textContent = 'Consistent \u2014 masked'; v.className = 'cv safe'; }\r\n                                else if (id === 'v-vpn') { v.textContent = 'All anonymizer traffic hidden'; v.className = 'cv safe'; }\r\n                                else if (id === 'v-blk') { v.textContent = 'Masked \u2014 not scannable'; v.className = 'cv safe'; }\r\n                                else if (id === 'v-ports') { v.textContent = 'Hidden \u2014 no scan possible'; v.className = 'cv safe'; }\r\n                                else if (id === 'v-vulns') { v.textContent = 'Hidden \u2014 no scan possible'; v.className = 'cv safe'; }\r\n                                c.classList.remove('c-danger', 'c-warn', 'c-cyan', 'c-safe');\r\n                                c.classList.add('c-safe', 'prot');\r\n                            }\r\n                        });\r\n                        document.getElementById('v-nty-s').textContent = 'Hidden behind encrypted tunnel';\r\n                        document.getElementById('v-enc-s').textContent = 'Double encryption layer active';\r\n                        document.getElementById('v-dnt-s').textContent = 'AssistYU blocks tracking cookies and fingerprinting';\r\n                        document.getElementById('v-wd-s').textContent = 'Automation signature masked by AssistYU';\r\n                        document.getElementById('v-tzm-s').textContent = 'Location fingerprint hidden';\r\n                        document.getElementById('v-lang-s').textContent = 'Language fingerprint hidden';\r\n                        document.getElementById('v-vpn-s').textContent = 'All network intelligence masked';\r\n                        document.getElementById('v-blk-s').textContent = 'IP reputation hidden from scanners';\r\n                        document.getElementById('v-ports-s').textContent = 'Port scan results hidden';\r\n                        document.getElementById('v-vulns-s').textContent = 'Vulnerability data hidden';\r\n\r\n                    } else {\r\n                        left.className = 'hero-block hero-left exposed';\r\n                        right.className = 'hero-block hero-right exposed';\r\n                        label.className = 'threats-label danger';\r\n                        label.textContent = isExposed ? 'THREATS DETECTED' : 'PROTECTED';\r\n                        numEl.className = isExposed ? 'num' : 'num safe';\r\n                        numEl.textContent = isExposed ? total : '0';\r\n                        if (isExposed) {\r\n                            titleEl.innerHTML = 'issues found on your current connection';\r\n                            critBadge.style.display = critical > 0 ? 'inline-flex' : 'none';\r\n                            warnBadge.style.display = warning > 0 ? 'inline-flex' : 'none';\r\n                            document.getElementById('crit-n').textContent = critical;\r\n                            document.getElementById('warn-n').textContent = warning;\r\n                        } else {\r\n                            titleEl.innerHTML = 'Your traffic is <span class=\"highlight\">encrypted end-to-end<\/span>';\r\n                            critBadge.style.display = 'none';\r\n                            warnBadge.style.display = 'none';\r\n                        }\r\n                        toggleLabel.textContent = 'Protected mode';\r\n                        toggleLabel.className = 'toggle-label';\r\n                        toggleWrap.className = 'protect-toggle-row';\r\n                        badge.className = isExposed ? 'vb dg' : 'vb sg';\r\n                        mainTitle.textContent = 'AssistYU Network Scan';\r\n                        mainDesc.textContent = isExposed ? 'Your network is exposed.' : 'You\\'re protected.';\r\n                        mainSubDesc.textContent = isExposed ? 'Real-time diagnostic of your IP exposure, browser fingerprint, and threat intelligence' : 'Your connection is secured with end-to-end encryption';\r\n                        sw.textContent = isExposed ? 'exposed' : 'protected';\r\n                        sw.className = isExposed ? 'sw-t exposed' : 'sw-t protected';\r\n                        document.querySelector('.verdict-header').className = isExposed ? 'verdict-header exposed' : 'verdict-header protected';\r\n                        if (mapMask) mapMask.classList.remove('show');\r\n\r\n                        var gColor = D.riskScore >= 60 ? 'var(--danger)' : D.riskScore >= 30 ? 'var(--amber)' : 'var(--safe)';\r\n                        var circumference = 314.16;\r\n                        var offset = circumference - (D.riskScore \/ 100) * circumference;\r\n                        document.getElementById('rg-fill').style.strokeDashoffset = offset;\r\n                        document.getElementById('rg-fill').style.stroke = gColor;\r\n                        document.getElementById('rg-num').textContent = D.riskScore;\r\n                        var gradeText = D.riskGrade === 'F' ? 'Critical exposure' : D.riskGrade === 'D' ? 'High exposure' : D.riskGrade === 'C' ? 'Moderate exposure' : D.riskGrade === 'B' ? 'Low exposure' : 'Minimal exposure';\r\n                        document.getElementById('rg-grade').innerHTML = 'Grade ' + D.riskGrade + ' <span class=\"sub\">' + gradeText + '<\/span>';\r\n                        document.getElementById('rg-grade').style.color = gColor;\r\n\r\n                        var rgParts = [];\r\n                        if (D.wIPs.length > 0) rgParts.push('WebRTC leak');\r\n                        if (D.vpnDetected) rgParts.push('VPN detected');\r\n                        if (D.torDetected) rgParts.push('Tor exit');\r\n                        if (D.blacklisted) rgParts.push('On ' + D.blacklistCount + ' blacklists');\r\n                        if (D.shodanVulns.length) rgParts.push(D.shodanVulns.length + ' CVEs');\r\n                        if (D.webdriver) rgParts.push('Automation');\r\n                        if (D.proto !== 'https') rgParts.push('Unencrypted');\r\n                        document.getElementById('rg-sub').innerHTML = rgParts.length ? rgParts.map(function(t) {\r\n                            var cls = 'tag';\r\n                            if (t.indexOf('leak') > -1 || t.indexOf('Tor') > -1 || t.indexOf('CVEs') > -1 || t.indexOf('Unencrypted') > -1) cls += ' danger';\r\n                            else if (t.indexOf('On ') > -1 || t.indexOf('Automation') > -1) cls += ' warn';\r\n                            else cls += ' safe';\r\n                            return '<span class=\"' + cls + '\">' + t + '<\/span>';\r\n                        }).join('') : '<span class=\"tag safe\">No critical signals<\/span>';\r\n\r\n                        cards.forEach(function(c) {\r\n                            var v = c.querySelector('.cv'), id = c.dataset.p;\r\n                            if (v && id && OV[id] && ORIG[id]) {\r\n                                v.textContent = OV[id];\r\n                                v.className = 'cv';\r\n                                if (ORIG[id].val) v.classList.add(ORIG[id].val);\r\n                                c.classList.remove('prot', 'c-safe', 'c-danger', 'c-warn', 'c-cyan');\r\n                                c.classList.add('c-' + ORIG[id].card);\r\n                            }\r\n                        });\r\n                        document.getElementById('v-nty-s').textContent = D.hostingDetected ? 'Possibly behind a VPN or proxy' : 'Your real ISP network \u2014 no VPN detected';\r\n                        document.getElementById('v-enc-s').textContent = D.proto === 'https' ? 'Encrypted end-to-end' : 'Visible to ISP';\r\n                        document.getElementById('v-dnt-s').textContent = !D.dnt ? 'Sites can track you' : 'No tracking';\r\n                    }\r\n                });\r\n\r\n                \/* phone pill *\/\r\n                (function() {\r\n                    var pill = document.getElementById('phone-pill');\r\n                    var icon = document.getElementById('pp-icon');\r\n                    if (pill && icon) {\r\n                        icon.addEventListener('click', function(e) {\r\n                            e.stopPropagation();\r\n                            var open = pill.classList.toggle('open');\r\n                            icon.setAttribute('aria-expanded', open ? 'true' : 'false');\r\n                        });\r\n                        document.addEventListener('click', function(e) {\r\n                            if (pill && !pill.contains(e.target)) { pill.classList.remove('open'); icon.setAttribute('aria-expanded', 'false'); }\r\n                        });\r\n                    }\r\n                })();\r\n            })();\r\n        });\r\n    <\/script>\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\n<\/div>\n<footer class=\"elementor-element elementor-element-20ed9d6 e-con-full e-flex e-con e-parent\" data-id=\"20ed9d6\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;gradient&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-7e92d8b e-con-full e-flex e-con e-child\" data-id=\"7e92d8b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-b03f6dc e-con-full e-flex e-con e-child\" data-id=\"b03f6dc\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7943ccd elementor-widget elementor-widget-int-logo\" data-id=\"7943ccd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"int-logo.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <div class=\"tg-logo\">\r\n            <a href=\"https:\/\/assistyu.com\/it\/\"><img decoding=\"async\" src=\"https:\/\/assistyu.com\/wp-content\/uploads\/2024\/03\/AssistYu-no-background-2.png\" alt=\"\" title=\"\"><\/a>\r\n        <\/div>\r\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2cfbdc1 elementor-mobile-align-center elementor-icon-list--layout-inline elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"2cfbdc1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items elementor-inline-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"tel:34951550227\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-phone-alt\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M497.39 361.8l-112-48a24 24 0 0 0-28 6.9l-49.6 60.6A370.66 370.66 0 0 1 130.6 204.11l60.6-49.6a23.94 23.94 0 0 0 6.9-28l-48-112A24.16 24.16 0 0 0 122.6.61l-104 24A24 24 0 0 0 0 48c0 256.5 207.9 464 464 464a24 24 0 0 0 23.4-18.6l24-104a24.29 24.29 0 0 0-14.01-27.6z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">+34 951 550 227<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"mailto:office@assistyu.com\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-envelope\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M502.3 190.8c3.9-3.1 9.7-.2 9.7 4.7V400c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V195.6c0-5 5.7-7.8 9.7-4.7 22.4 17.4 52.1 39.5 154.1 113.6 21.1 15.4 56.7 47.8 92.2 47.6 35.7.3 72-32.8 92.3-47.6 102-74.1 131.6-96.3 154-113.7zM256 320c23.2.4 56.6-29.2 73.4-41.4 132.7-96.3 142.8-104.7 173.4-128.7 5.8-4.5 9.2-11.5 9.2-18.9v-19c0-26.5-21.5-48-48-48H48C21.5 64 0 85.5 0 112v19c0 7.4 3.4 14.3 9.2 18.9 30.6 23.9 40.7 32.4 173.4 128.7 16.8 12.2 50.2 41.8 73.4 41.4z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">office@assistyu.com<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/maps.app.goo.gl\/PnxnHJXGZ3isdPbH6\" target=\"_blank\" rel=\"noopener\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-map-marker-alt\" viewBox=\"0 0 384 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M172.268 501.67C26.97 291.031 0 269.413 0 192 0 85.961 85.961 0 192 0s192 85.961 192 192c0 77.413-26.97 99.031-172.268 309.67-9.535 13.774-29.93 13.773-39.464 0zM192 272c44.183 0 80-35.817 80-80s-35.817-80-80-80-80 35.817-80 80 35.817 80 80 80z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">C. Lope de Vega 60, 29631 Benalmadena<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e9d104e elementor-icon-list--layout-inline elementor-align-center elementor-hidden-mobile elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"e9d104e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items elementor-inline-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/assistyu.com\/services\/\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-greater-than-equal\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M55.22 107.69l175.56 68.09-175.44 68.05c-18.39 6.03-27.88 24.39-21.2 41l12.09 30.08c6.68 16.61 26.99 25.19 45.38 19.15L393.02 214.2c13.77-4.52 22.98-16.61 22.98-30.17v-15.96c0-13.56-9.21-25.65-22.98-30.17L91.3 17.92c-18.29-6-38.51 2.53-45.15 19.06L34.12 66.9c-6.64 16.53 2.81 34.79 21.1 40.79zM424 400H24c-13.25 0-24 10.74-24 24v48c0 13.25 10.75 24 24 24h400c13.25 0 24-10.75 24-24v-48c0-13.26-10.75-24-24-24z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Services<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/assistyu.com\/security-products\/\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-greater-than-equal\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M55.22 107.69l175.56 68.09-175.44 68.05c-18.39 6.03-27.88 24.39-21.2 41l12.09 30.08c6.68 16.61 26.99 25.19 45.38 19.15L393.02 214.2c13.77-4.52 22.98-16.61 22.98-30.17v-15.96c0-13.56-9.21-25.65-22.98-30.17L91.3 17.92c-18.29-6-38.51 2.53-45.15 19.06L34.12 66.9c-6.64 16.53 2.81 34.79 21.1 40.79zM424 400H24c-13.25 0-24 10.74-24 24v48c0 13.25 10.75 24 24 24h400c13.25 0 24-10.75 24-24v-48c0-13.26-10.75-24-24-24z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Products<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/assistyu.com\/small-business\/\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-greater-than-equal\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M55.22 107.69l175.56 68.09-175.44 68.05c-18.39 6.03-27.88 24.39-21.2 41l12.09 30.08c6.68 16.61 26.99 25.19 45.38 19.15L393.02 214.2c13.77-4.52 22.98-16.61 22.98-30.17v-15.96c0-13.56-9.21-25.65-22.98-30.17L91.3 17.92c-18.29-6-38.51 2.53-45.15 19.06L34.12 66.9c-6.64 16.53 2.81 34.79 21.1 40.79zM424 400H24c-13.25 0-24 10.74-24 24v48c0 13.25 10.75 24 24 24h400c13.25 0 24-10.75 24-24v-48c0-13.26-10.75-24-24-24z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Small Business<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/assistyu.com\/partnerships\/\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-greater-than-equal\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M55.22 107.69l175.56 68.09-175.44 68.05c-18.39 6.03-27.88 24.39-21.2 41l12.09 30.08c6.68 16.61 26.99 25.19 45.38 19.15L393.02 214.2c13.77-4.52 22.98-16.61 22.98-30.17v-15.96c0-13.56-9.21-25.65-22.98-30.17L91.3 17.92c-18.29-6-38.51 2.53-45.15 19.06L34.12 66.9c-6.64 16.53 2.81 34.79 21.1 40.79zM424 400H24c-13.25 0-24 10.74-24 24v48c0 13.25 10.75 24 24 24h400c13.25 0 24-10.75 24-24v-48c0-13.26-10.75-24-24-24z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Partnership<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/assistyu.com\/cybersecurity-tools\/\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-greater-than-equal\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M55.22 107.69l175.56 68.09-175.44 68.05c-18.39 6.03-27.88 24.39-21.2 41l12.09 30.08c6.68 16.61 26.99 25.19 45.38 19.15L393.02 214.2c13.77-4.52 22.98-16.61 22.98-30.17v-15.96c0-13.56-9.21-25.65-22.98-30.17L91.3 17.92c-18.29-6-38.51 2.53-45.15 19.06L34.12 66.9c-6.64 16.53 2.81 34.79 21.1 40.79zM424 400H24c-13.25 0-24 10.74-24 24v48c0 13.25 10.75 24 24 24h400c13.25 0 24-10.75 24-24v-48c0-13.26-10.75-24-24-24z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Diagnostic tools<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-inline-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/assistyu.com\/contact\/\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-greater-than-equal\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M55.22 107.69l175.56 68.09-175.44 68.05c-18.39 6.03-27.88 24.39-21.2 41l12.09 30.08c6.68 16.61 26.99 25.19 45.38 19.15L393.02 214.2c13.77-4.52 22.98-16.61 22.98-30.17v-15.96c0-13.56-9.21-25.65-22.98-30.17L91.3 17.92c-18.29-6-38.51 2.53-45.15 19.06L34.12 66.9c-6.64 16.53 2.81 34.79 21.1 40.79zM424 400H24c-13.25 0-24 10.74-24 24v48c0 13.25 10.75 24 24 24h400c13.25 0 24-10.75 24-24v-48c0-13.26-10.75-24-24-24z\"><\/path><\/svg>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Contact Us<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-80b4291 e-con-full e-flex e-con e-child\" data-id=\"80b4291\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-ac8663d e-con-full e-flex e-con e-child\" data-id=\"ac8663d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1b20d36 elementor-widget elementor-widget-int-footer-nav\" data-id=\"1b20d36\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"int-footer-nav.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\r\n        <div class=\"tg-copyright-right text-center text-md-end\">\r\n                    <a class=\"text-anim-2\" href=\"https:\/\/assistyu.com\/security-insights\/\">Insights<\/a>\r\n                    <a class=\"text-anim-2\" href=\"https:\/\/assistyu.com\/about-assistyu\/\">About Us<\/a>\r\n                    <a class=\"text-anim-2\" href=\"https:\/\/assistyu.com\/documentation-and-guides\/\">Documentation<\/a>\r\n                    <a class=\"text-anim-2\" href=\"https:\/\/assistyu.com\/consent\/\">Consent Agreement<\/a>\r\n                    <a class=\"text-anim-2\" href=\"https:\/\/assistyu.com\/privacy-policy\/\">Privacy Policy<\/a>\r\n                    <a class=\"text-anim-2\" href=\"https:\/\/assistyu.com\/legal-notice-terms-conditions\/\">Terms &amp; Conditions<\/a>\r\n                    <a class=\"text-anim-2\" href=\"https:\/\/assistyu.com\/delivery-refunds-policy\/\">Delivery &amp; Refunds<\/a>\r\n                <\/div>\r\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-57abf76 elementor-widget elementor-widget-text-editor\" data-id=\"57abf76\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Copyright @ 2026 <a href=\"https:\/\/assistyu.com\/\">AssistYu<\/a>. All Rights Reserved<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/footer>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>AssistYU \u2014 Network Scan Network Security Scan Real-time diagnostic of your IP exposure, browser fingerprint, open ports, blacklists, and threat intelligence \u2014 entirely client-side, zero data stored. Start Security Scan IP &amp; location Threat intel Browser fingerprint Speed test Risk score AssistYU Network Scan \u00b7 real-time diagnostic Your connection is being analyzed Radar sweep \u25cf [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":6769,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"inline_featured_image":false,"footnotes":""},"class_list":["post-7083","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/assistyu.com\/it\/wp-json\/wp\/v2\/pages\/7083","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/assistyu.com\/it\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/assistyu.com\/it\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/assistyu.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/assistyu.com\/it\/wp-json\/wp\/v2\/comments?post=7083"}],"version-history":[{"count":4,"href":"https:\/\/assistyu.com\/it\/wp-json\/wp\/v2\/pages\/7083\/revisions"}],"predecessor-version":[{"id":7095,"href":"https:\/\/assistyu.com\/it\/wp-json\/wp\/v2\/pages\/7083\/revisions\/7095"}],"up":[{"embeddable":true,"href":"https:\/\/assistyu.com\/it\/wp-json\/wp\/v2\/pages\/6769"}],"wp:attachment":[{"href":"https:\/\/assistyu.com\/it\/wp-json\/wp\/v2\/media?parent=7083"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}