{"id":850,"date":"2026-08-02T11:57:00","date_gmt":"2026-08-02T11:57:00","guid":{"rendered":"https:\/\/freewebtools.co.in\/?page_id=850"},"modified":"2026-08-02T12:19:22","modified_gmt":"2026-08-02T12:19:22","slug":"gaming-tools","status":"publish","type":"page","link":"https:\/\/freewebtools.co.in\/index.php\/gaming-tools\/","title":{"rendered":"Game Log Analyzer"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div id=\"game-log-analyzer-app\" class=\"gla-wrapper gla-dark\">\n    <!-- COMPREHENSIVE REFINED MODERN STYLING (SaaS Grade UI\/UX) -->\n    <style>\n        #game-log-analyzer-app.gla-wrapper {\n            --gla-bg: #090d16;\n            --gla-surface: #111827;\n            --gla-surface-hover: #1f2937;\n            --gla-surface-active: #374151;\n            --gla-border: #374151;\n            --gla-border-focus: #3b82f6;\n            --gla-text: #f9fafb;\n            --gla-text-muted: #9ca3af;\n            --gla-primary: #3b82f6;\n            --gla-primary-hover: #2563eb;\n            --gla-primary-glow: rgba(59, 130, 246, 0.25);\n            --gla-danger: #ef4444;\n            --gla-danger-bg: rgba(239, 68, 68, 0.12);\n            --gla-warning: #f59e0b;\n            --gla-warning-bg: rgba(245, 158, 11, 0.12);\n            --gla-info: #06b6d4;\n            --gla-info-bg: rgba(6, 182, 212, 0.12);\n            --gla-success: #10b981;\n            --gla-success-bg: rgba(16, 185, 129, 0.12);\n            --gla-font: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n            --gla-radius: 12px;\n            --gla-transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n\n            font-family: var(--gla-font);\n            background-color: var(--gla-bg);\n            color: var(--gla-text);\n            padding: 28px;\n            border-radius: var(--gla-radius);\n            box-sizing: border-box;\n            width: 100%;\n            max-width: 1280px;\n            margin: 0 auto;\n            box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.3), 0 8px 10px -6px rgba(0, 0, 0, 0.3);\n            border: 1px solid var(--gla-border);\n            transition: var(--gla-transition);\n        }\n\n        #game-log-analyzer-app.gla-wrapper.gla-light {\n            --gla-bg: #f8fafc;\n            --gla-surface: #ffffff;\n            --gla-surface-hover: #f1f5f9;\n            --gla-surface-active: #e2e8f0;\n            --gla-border: #cbd5e1;\n            --gla-border-focus: #2563eb;\n            --gla-text: #0f172a;\n            --gla-text-muted: #64748b;\n            --gla-primary: #2563eb;\n            --gla-primary-hover: #1d4ed8;\n            --gla-primary-glow: rgba(37, 99, 235, 0.2);\n            --gla-danger: #dc2626;\n            --gla-danger-bg: rgba(220, 38, 38, 0.08);\n            --gla-warning: #d97706;\n            --gla-warning-bg: rgba(217, 119, 6, 0.08);\n            --gla-info: #0891b2;\n            --gla-info-bg: rgba(8, 145, 178, 0.08);\n            --gla-success: #059669;\n            --gla-success-bg: rgba(5, 150, 105, 0.08);\n            box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.08), 0 4px 6px -4px rgba(0, 0, 0, 0.08);\n        }\n\n        #game-log-analyzer-app * {\n            box-sizing: border-box;\n        }\n\n        \/* Modern Hero Header *\/\n        .gla-header {\n            display: flex;\n            justify-content: space-between;\n            align-items: flex-start;\n            margin-bottom: 24px;\n            border-bottom: 1px solid var(--gla-border);\n            padding-bottom: 20px;\n            gap: 16px;\n        }\n\n        .gla-header-content {\n            display: flex;\n            flex-direction: column;\n            gap: 6px;\n        }\n\n        .gla-title {\n            font-size: 1.75rem;\n            font-weight: 800;\n            margin: 0;\n            color: var(--gla-text);\n            letter-spacing: -0.025em;\n            display: flex;\n            align-items: center;\n            gap: 10px;\n        }\n\n        .gla-title span.icon {\n            font-size: 1.5rem;\n        }\n\n        .gla-subtitle {\n            font-size: 0.95rem;\n            color: var(--gla-text-muted);\n            margin: 0;\n            font-weight: 400;\n        }\n\n        .gla-theme-btn {\n            background: var(--gla-surface);\n            border: 1px solid var(--gla-border);\n            color: var(--gla-text);\n            padding: 9px 16px;\n            border-radius: 8px;\n            cursor: pointer;\n            font-weight: 600;\n            font-size: 0.85rem;\n            display: inline-flex;\n            align-items: center;\n            gap: 8px;\n            transition: var(--gla-transition);\n            box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n            white-space: nowrap;\n        }\n\n        .gla-theme-btn:hover {\n            background: var(--gla-surface-hover);\n            border-color: var(--gla-border-focus);\n            transform: translateY(-1px);\n        }\n\n        \/* Modern Input Grid *\/\n        .gla-input-grid {\n            display: grid;\n            grid-template-columns: 1fr 1fr;\n            gap: 20px;\n            margin-bottom: 24px;\n        }\n\n        @media (max-width: 768px) {\n            .gla-input-grid {\n                grid-template-columns: 1fr;\n            }\n        }\n\n        .gla-dropzone {\n            border: 2px dashed var(--gla-border);\n            background: var(--gla-surface);\n            padding: 32px 20px;\n            text-align: center;\n            border-radius: var(--gla-radius);\n            cursor: pointer;\n            transition: var(--gla-transition);\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            justify-content: center;\n            position: relative;\n            outline: none;\n        }\n\n        .gla-dropzone:hover, .gla-dropzone:focus-visible {\n            border-color: var(--gla-primary);\n            background: var(--gla-surface-hover);\n        }\n\n        .gla-dropzone.dragover {\n            border-color: var(--gla-primary);\n            background: var(--gla-surface-hover);\n            box-shadow: 0 0 0 4px var(--gla-primary-glow);\n        }\n\n        .gla-dropzone-icon {\n            font-size: 2.5rem;\n            margin-bottom: 12px;\n            filter: drop-shadow(0 2px 4px rgba(0,0,0,0.1));\n        }\n\n        .gla-dropzone-text {\n            font-size: 0.95rem;\n            color: var(--gla-text-muted);\n            margin: 0 0 16px 0;\n            font-weight: 500;\n        }\n\n        .gla-file-input {\n            display: none;\n        }\n\n        .gla-btn {\n            background: var(--gla-primary);\n            color: #ffffff;\n            border: none;\n            padding: 10px 20px;\n            border-radius: 8px;\n            font-weight: 600;\n            font-size: 0.9rem;\n            cursor: pointer;\n            transition: var(--gla-transition);\n            display: inline-flex;\n            align-items: center;\n            justify-content: center;\n            gap: 8px;\n            box-shadow: 0 4px 6px -1px var(--gla-primary-glow);\n            white-space: nowrap;\n        }\n\n        .gla-btn:hover {\n            background: var(--gla-primary-hover);\n            transform: translateY(-1px);\n            box-shadow: 0 6px 8px -1px var(--gla-primary-glow);\n        }\n\n        .gla-btn:active {\n            transform: translateY(0);\n        }\n\n        .gla-textarea-container {\n            background: var(--gla-surface);\n            border: 1px solid var(--gla-border);\n            border-radius: var(--gla-radius);\n            padding: 20px;\n            display: flex;\n            flex-direction: column;\n            box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.05);\n            transition: var(--gla-transition);\n        }\n\n        .gla-textarea-container:focus-within {\n            border-color: var(--gla-border-focus);\n            box-shadow: 0 0 0 3px var(--gla-primary-glow);\n        }\n\n        .gla-textarea-label {\n            font-size: 0.9rem;\n            font-weight: 600;\n            margin-bottom: 10px;\n            color: var(--gla-text);\n            display: flex;\n            align-items: center;\n            gap: 6px;\n        }\n\n        .gla-textarea {\n            width: 100%;\n            height: 110px;\n            background: var(--gla-bg);\n            color: var(--gla-text);\n            border: 1px solid var(--gla-border);\n            border-radius: 8px;\n            padding: 12px;\n            font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n            font-size: 0.85rem;\n            resize: vertical;\n            margin-bottom: 14px;\n            transition: var(--gla-transition);\n        }\n\n        .gla-textarea:focus {\n            outline: none;\n            border-color: var(--gla-primary);\n        }\n\n        \/* Modern Metric Cards Grid *\/\n        .gla-metrics-grid {\n            display: grid;\n            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n            gap: 16px;\n            margin-bottom: 24px;\n        }\n\n        .gla-metric-card {\n            background: var(--gla-surface);\n            border: 1px solid var(--gla-border);\n            border-radius: var(--gla-radius);\n            padding: 18px 20px;\n            position: relative;\n            overflow: hidden;\n            box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.05);\n            transition: var(--gla-transition);\n        }\n\n        .gla-metric-card:hover {\n            transform: translateY(-2px);\n            border-color: var(--gla-border-focus);\n            box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);\n        }\n\n        .gla-metric-value {\n            font-size: 2rem;\n            font-weight: 800;\n            margin-bottom: 6px;\n            letter-spacing: -0.025em;\n            line-height: 1;\n        }\n\n        .gla-metric-label {\n            font-size: 0.8rem;\n            color: var(--gla-text-muted);\n            text-transform: uppercase;\n            letter-spacing: 0.05em;\n            font-weight: 600;\n        }\n\n        \/* Filter & Search Toolbar *\/\n        .gla-toolbar {\n            background: var(--gla-surface);\n            border: 1px solid var(--gla-border);\n            border-radius: var(--gla-radius);\n            padding: 18px 20px;\n            margin-bottom: 24px;\n            display: flex;\n            flex-wrap: wrap;\n            gap: 16px;\n            align-items: center;\n            justify-content: space-between;\n            box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.05);\n        }\n\n        .gla-search-input {\n            flex: 1;\n            min-width: 260px;\n            background: var(--gla-bg);\n            border: 1px solid var(--gla-border);\n            color: var(--gla-text);\n            padding: 10px 14px;\n            border-radius: 8px;\n            font-size: 0.9rem;\n            transition: var(--gla-transition);\n        }\n\n        .gla-search-input:focus {\n            outline: none;\n            border-color: var(--gla-primary);\n            box-shadow: 0 0 0 3px var(--gla-primary-glow);\n        }\n\n        .gla-filter-group {\n            display: flex;\n            gap: 8px;\n            flex-wrap: wrap;\n        }\n\n        .gla-filter-btn {\n            background: var(--gla-surface-hover);\n            border: 1px solid var(--gla-border);\n            color: var(--gla-text);\n            padding: 8px 14px;\n            border-radius: 8px;\n            font-size: 0.85rem;\n            cursor: pointer;\n            font-weight: 600;\n            transition: var(--gla-transition);\n        }\n\n        .gla-filter-btn:hover {\n            background: var(--gla-surface-active);\n            border-color: var(--gla-border-focus);\n        }\n\n        .gla-filter-btn.active {\n            background: var(--gla-primary);\n            border-color: var(--gla-primary);\n            color: #ffffff;\n            box-shadow: 0 2px 4px 0 var(--gla-primary-glow);\n        }\n\n        \/* Log Terminal Table Container *\/\n        .gla-terminal-container {\n            background: var(--gla-surface);\n            border: 1px solid var(--gla-border);\n            border-radius: var(--gla-radius);\n            overflow: hidden;\n            max-height: 520px;\n            overflow-y: auto;\n            margin-bottom: 24px;\n            box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.05);\n        }\n\n        .gla-log-table {\n            width: 100%;\n            border-collapse: collapse;\n            font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n            font-size: 0.85rem;\n            text-align: left;\n        }\n\n        .gla-log-table th, .gla-log-table td {\n            padding: 12px 16px;\n            border-bottom: 1px solid var(--gla-border);\n        }\n\n        .gla-log-table th {\n            background: var(--gla-surface-hover);\n            color: var(--gla-text);\n            font-weight: 600;\n            position: sticky;\n            top: 0;\n            z-index: 10;\n            backdrop-filter: blur(8px);\n        }\n\n        .gla-log-table tr {\n            transition: background 0.15s ease;\n        }\n\n        .gla-log-table tr:hover {\n            background: var(--gla-surface-hover);\n        }\n\n        .gla-log-table tr:last-child td {\n            border-bottom: none;\n        }\n\n        .gla-badge {\n            display: inline-flex;\n            align-items: center;\n            justify-content: center;\n            padding: 4px 8px;\n            border-radius: 6px;\n            font-size: 0.75rem;\n            font-weight: 700;\n            text-transform: uppercase;\n            letter-spacing: 0.05em;\n            font-family: var(--gla-font);\n        }\n\n        .gla-badge-error { background: var(--gla-danger-bg); color: var(--gla-danger); border: 1px solid rgba(239, 68, 68, 0.3); }\n        .gla-badge-warning { background: var(--gla-warning-bg); color: var(--gla-warning); border: 1px solid rgba(245, 158, 11, 0.3); }\n        .gla-badge-info { background: var(--gla-info-bg); color: var(--gla-info); border: 1px solid rgba(6, 182, 212, 0.3); }\n\n        \/* Export & Action Toolbar *\/\n        .gla-export-toolbar {\n            background: var(--gla-surface);\n            border: 1px solid var(--gla-border);\n            border-radius: var(--gla-radius);\n            padding: 18px 20px;\n            display: flex;\n            flex-wrap: wrap;\n            gap: 16px;\n            align-items: center;\n            justify-content: space-between;\n            margin-bottom: 20px;\n            box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.05);\n        }\n\n        .gla-tool-group {\n            display: flex;\n            gap: 10px;\n            flex-wrap: wrap;\n            align-items: center;\n        }\n\n        .gla-btn-secondary, .gla-btn-export {\n            background: var(--gla-surface-hover);\n            color: var(--gla-text);\n            border: 1px solid var(--gla-border);\n            font-size: 0.85rem;\n            padding: 9px 16px;\n            border-radius: 8px;\n            cursor: pointer;\n            font-weight: 600;\n            display: inline-flex;\n            align-items: center;\n            gap: 8px;\n            transition: var(--gla-transition);\n        }\n\n        .gla-btn-secondary:hover, .gla-btn-export:hover {\n            border-color: var(--gla-border-focus);\n            background: var(--gla-surface-active);\n            color: var(--gla-text);\n            transform: translateY(-1px);\n        }\n\n        \/* Status Bar *\/\n        .gla-statusbar {\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            font-size: 0.85rem;\n            color: var(--gla-text-muted);\n            background: var(--gla-surface);\n            padding: 12px 18px;\n            border: 1px solid var(--gla-border);\n            border-radius: var(--gla-radius);\n            margin-bottom: 20px;\n            box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n        }\n\n        \/* QA Footer *\/\n        .gla-footer-qa {\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            margin-top: 20px;\n            padding-top: 16px;\n            border-top: 1px solid var(--gla-border);\n            font-size: 0.8rem;\n            color: var(--gla-text-muted);\n            flex-wrap: wrap;\n            gap: 10px;\n        }\n\n        .gla-badge-offline {\n            display: inline-flex;\n            align-items: center;\n            gap: 6px;\n            background: var(--gla-success-bg);\n            color: var(--gla-success);\n            padding: 6px 12px;\n            border-radius: 6px;\n            font-size: 0.75rem;\n            font-weight: 700;\n            border: 1px solid rgba(16, 185, 129, 0.3);\n        }\n\n        \/* Accessibility focus states *\/\n        #game-log-analyzer-app button:focus-visible,\n        #game-log-analyzer-app input:focus-visible,\n        #game-log-analyzer-app textarea:focus-visible {\n            outline: 2px solid var(--gla-border-focus);\n            outline-offset: 2px;\n        }\n\n        @media print {\n            body * { visibility: hidden; }\n            #game-log-analyzer-app, #game-log-analyzer-app * { visibility: visible; }\n            #game-log-analyzer-app {\n                position: absolute; left: 0; top: 0; width: 100%;\n                background: #ffffff !important; color: #000000 !important;\n                box-shadow: none !important; border: none !important;\n            }\n            .gla-dropzone, .gla-toolbar, .gla-export-toolbar, .gla-textarea-container, .gla-theme-btn {\n                display: none !important;\n            }\n        }\n    <\/style>\n\n    <!-- HEADER & THEME TOGGLE -->\n    <div class=\"gla-header\">\n        <div class=\"gla-header-content\">\n            <h2 class=\"gla-title\"><span class=\"icon\">\u26a1<\/span> Game Log Analyzer Pro<\/h2>\n            <p class=\"gla-subtitle\">Parse, filter, inspect engine error stacks, and export game debugging diagnostics securely client-side.<\/p>\n        <\/div>\n        <button id=\"gla-theme-toggle\" class=\"gla-theme-btn\" aria-label=\"Toggle theme\">\n            <span>\ud83c\udf13<\/span> Toggle Theme\n        <\/button>\n    <\/div>\n\n    <!-- INPUT GRID -->\n    <div class=\"gla-input-grid\">\n        <div id=\"gla-dropzone\" class=\"gla-dropzone\" tabindex=\"0\" role=\"button\" aria-label=\"Log file dropzone\">\n            <div class=\"gla-dropzone-icon\">\ud83d\udcc4<\/div>\n            <p class=\"gla-dropzone-text\">Drag &#038; Drop log file (.log, .txt) here or browse<\/p>\n            <button type=\"button\" class=\"gla-btn\" id=\"gla-browse-btn\">\n                <span>\ud83d\udcc1<\/span> Browse Log File\n            <\/button>\n            <input type=\"file\" id=\"gla-file-input\" class=\"gla-file-input\" accept=\".log,.txt\">\n        <\/div>\n\n        <div class=\"gla-textarea-container\">\n            <label class=\"gla-textarea-label\" for=\"gla-raw-input\">\n                <span>\u270f\ufe0f<\/span> Or Paste Log Text Directly:\n            <\/label>\n            <textarea id=\"gla-raw-input\" class=\"gla-textarea\" placeholder=\"Paste raw game engine logs here...\"><\/textarea>\n            <button id=\"gla-parse-text-btn\" class=\"gla-btn\" style=\"align-self: flex-end;\">\n                <span>\ud83d\udd0d<\/span> Analyze Log Text\n            <\/button>\n        <\/div>\n    <\/div>\n\n    <!-- METRICS SUMMARY CARDS -->\n    <div class=\"gla-metrics-grid\">\n        <div class=\"gla-metric-card\">\n            <div id=\"gla-metric-total\" class=\"gla-metric-value\" style=\"color: var(--gla-primary);\">0<\/div>\n            <div class=\"gla-metric-label\">Total Entries<\/div>\n        <\/div>\n        <div class=\"gla-metric-card\">\n            <div id=\"gla-metric-errors\" class=\"gla-metric-value\" style=\"color: var(--gla-danger);\">0<\/div>\n            <div class=\"gla-metric-label\">Errors \/ Fatals<\/div>\n        <\/div>\n        <div class=\"gla-metric-card\">\n            <div id=\"gla-metric-warnings\" class=\"gla-metric-value\" style=\"color: var(--gla-warning);\">0<\/div>\n            <div class=\"gla-metric-label\">Warnings<\/div>\n        <\/div>\n        <div class=\"gla-metric-card\">\n            <div id=\"gla-metric-infos\" class=\"gla-metric-value\" style=\"color: var(--gla-info);\">0<\/div>\n            <div class=\"gla-metric-label\">Info \/ Standard<\/div>\n        <\/div>\n    <\/div>\n\n    <!-- FILTER & SEARCH TOOLBAR -->\n    <div class=\"gla-toolbar\">\n        <input type=\"text\" id=\"gla-search-input\" class=\"gla-search-input\" placeholder=\"Search log messages, stack traces, or timestamps...\">\n        <div class=\"gla-filter-group\" role=\"group\" aria-label=\"Log severity filter options\">\n            <button class=\"gla-filter-btn active\" data-filter=\"ALL\">All<\/button>\n            <button class=\"gla-filter-btn\" data-filter=\"ERROR\">Errors<\/button>\n            <button class=\"gla-filter-btn\" data-filter=\"WARNING\">Warnings<\/button>\n            <button class=\"gla-filter-btn\" data-filter=\"INFO\">Info<\/button>\n        <\/div>\n    <\/div>\n\n    <!-- LOG TERMINAL TABLE -->\n    <div class=\"gla-terminal-container\">\n        <table class=\"gla-log-table\">\n            <thead>\n                <tr>\n                    <th style=\"width: 110px;\">Level<\/th>\n                    <th style=\"width: 170px;\">Timestamp \/ Line<\/th>\n                    <th>Message &#038; Trace Details<\/th>\n                <\/tr>\n            <\/thead>\n            <tbody id=\"gla-log-tbody\">\n                <tr>\n                    <td colspan=\"3\" style=\"text-align: center; color: var(--gla-text-muted); padding: 40px;\">No log data parsed yet. Load a log file or paste text above.<\/td>\n                <\/tr>\n            <\/tbody>\n        <\/table>\n    <\/div>\n\n    <!-- EXPORT & REPORT TOOLBAR -->\n    <div class=\"gla-export-toolbar\">\n        <div class=\"gla-tool-group\">\n            <button id=\"gla-extract-errors-btn\" class=\"gla-btn gla-btn-secondary\">\n                <span>\ud83d\udee1\ufe0f<\/span> Isolate Errors Only\n            <\/button>\n        <\/div>\n        <div class=\"gla-tool-group\">\n            <button id=\"gla-export-txt\" class=\"gla-btn gla-btn-export\">\n                <span>\ud83d\udce5<\/span> Export TXT\n            <\/button>\n            <button id=\"gla-export-csv\" class=\"gla-btn gla-btn-export\">\n                <span>\ud83d\udcca<\/span> Export CSV\n            <\/button>\n            <button id=\"gla-print-report\" class=\"gla-btn gla-btn-export\">\n                <span>\ud83d\udda8\ufe0f<\/span> Print Report\n            <\/button>\n        <\/div>\n    <\/div>\n\n    <!-- STATUS BAR -->\n    <div class=\"gla-statusbar\">\n        <span id=\"gla-status-text\">Ready for log input (Offline Mode Active)<\/span>\n        <span id=\"gla-log-stats\">Parsed Entries: 0<\/span>\n    <\/div>\n\n    <!-- QA FOOTER -->\n    <div class=\"gla-footer-qa\">\n        <span class=\"gla-badge-offline\">\u26a1 100% Client-Side \/ Offline Ready<\/span>\n        <span>Game Log Analyzer Pro v1.0.0 \u2014 Production Hardened<\/span>\n    <\/div>\n\n    <!-- COMBINED PRESERVED JAVASCRIPT LOGIC -->\n    <script>\n        (function() {\n            const app = document.getElementById('game-log-analyzer-app');\n            const themeToggleBtn = document.getElementById('gla-theme-toggle');\n            const dropzone = document.getElementById('gla-dropzone');\n            const fileInput = document.getElementById('gla-file-input');\n            const browseBtn = document.getElementById('gla-browse-btn');\n            const rawInput = document.getElementById('gla-raw-input');\n            const parseTextBtn = document.getElementById('gla-parse-text-btn');\n            const statusText = document.getElementById('gla-status-text');\n            const logStats = document.getElementById('gla-log-stats');\n            const searchInput = document.getElementById('gla-search-input');\n            const filterBtns = document.querySelectorAll('.gla-filter-btn');\n            const logTbody = document.getElementById('gla-log-tbody');\n            const metricTotal = document.getElementById('gla-metric-total');\n            const metricErrors = document.getElementById('gla-metric-errors');\n            const metricWarnings = document.getElementById('gla-metric-warnings');\n            const metricInfos = document.getElementById('gla-metric-infos');\n            const exportTxtBtn = document.getElementById('gla-export-txt');\n            const exportCsvBtn = document.getElementById('gla-export-csv');\n            const printReportBtn = document.getElementById('gla-print-report');\n            const extractErrorsBtn = document.getElementById('gla-extract-errors-btn');\n\n            let rawLogContent = \"\";\n            let parsedLogEntries = [];\n            let currentFilter = 'ALL';\n            let searchQuery = '';\n\n            \/\/ Theme Toggle\n            themeToggleBtn.addEventListener('click', () => {\n                app.classList.toggle('gla-dark');\n                app.classList.toggle('gla-light');\n            });\n\n            \/\/ Browse & Drop Events\n            browseBtn.addEventListener('click', (e) => { e.stopPropagation(); fileInput.click(); });\n            dropzone.addEventListener('click', () => { fileInput.click(); });\n\n            ['dragenter', 'dragover'].forEach(eventName => {\n                dropzone.addEventListener(eventName, (e) => { e.preventDefault(); e.stopPropagation(); dropzone.classList.add('dragover'); }, false);\n            });\n            ['dragleave', 'drop'].forEach(eventName => {\n                dropzone.addEventListener(eventName, (e) => { e.preventDefault(); e.stopPropagation(); dropzone.classList.remove('dragover'); }, false);\n            });\n\n            dropzone.addEventListener('drop', (e) => {\n                const files = e.dataTransfer.files;\n                if (files.length > 0) loadLogFile(files[0]);\n            });\n\n            fileInput.addEventListener('change', (e) => {\n                if (e.target.files.length > 0) loadLogFile(e.target.files[0]);\n            });\n\n            dropzone.addEventListener('keydown', (e) => {\n                if (e.key === 'Enter' || e.key === ' ') {\n                    e.preventDefault();\n                    fileInput.click();\n                }\n            });\n\n            function loadLogFile(file) {\n                const reader = new FileReader();\n                reader.onload = (event) => {\n                    rawLogContent = event.target.result;\n                    rawInput.value = rawLogContent;\n                    statusText.textContent = `Loaded file: ${file.name} (${Math.round(file.size \/ 1024)} KB)`;\n                    processLogs(rawLogContent);\n                };\n                reader.onerror = () => {\n                    statusText.textContent = 'Error reading log file.';\n                };\n                reader.readAsText(file);\n            }\n\n            parseTextBtn.addEventListener('click', () => {\n                const text = rawInput.value.trim();\n                if (!text) {\n                    alert('Please paste or load log content first.');\n                    return;\n                }\n                rawLogContent = text;\n                statusText.textContent = 'Analyzing pasted text log...';\n                processLogs(rawLogContent);\n            });\n\n            function processLogs(rawText) {\n                const lines = rawText.split(\/\\r?\\n\/);\n                parsedLogEntries = [];\n\n                lines.forEach((line, index) => {\n                    if (!line.trim()) return;\n\n                    let level = 'INFO';\n                    const upper = line.toUpperCase();\n                    if (upper.includes('FATAL') || upper.includes('CRITICAL') || upper.includes('ERROR') || upper.includes('EXCEPTION') || upper.includes('FAILED')) {\n                        level = 'ERROR';\n                    } else if (upper.includes('WARN') || upper.includes('WARNING')) {\n                        level = 'WARNING';\n                    } else if (upper.includes('DEBUG') || upper.includes('VERBOSE')) {\n                        level = 'INFO';\n                    }\n\n                    const timeMatch = line.match(\/\\[?(\\d{2}:\\d{2}:\\d{2}|\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}:\\d{2})\\]?\/);\n                    const timestamp = timeMatch ? timeMatch[1] : `Line ${index + 1}`;\n\n                    parsedLogEntries.push({\n                        id: index,\n                        level: level,\n                        timestamp: timestamp,\n                        message: line\n                    });\n                });\n\n                updateMetrics();\n                renderLogTable();\n                statusText.textContent = 'Analysis complete.';\n                logStats.textContent = `Parsed Entries: ${parsedLogEntries.length}`;\n            }\n\n            function updateMetrics() {\n                const total = parsedLogEntries.length;\n                const errors = parsedLogEntries.filter(e => e.level === 'ERROR').length;\n                const warnings = parsedLogEntries.filter(e => e.level === 'WARNING').length;\n                const infos = total - errors - warnings;\n\n                metricTotal.textContent = total;\n                metricErrors.textContent = errors;\n                metricWarnings.textContent = warnings;\n                metricInfos.textContent = infos;\n            }\n\n            function renderLogTable() {\n                const filtered = parsedLogEntries.filter(entry => {\n                    const matchesFilter = (currentFilter === 'ALL' || entry.level === currentFilter);\n                    const matchesSearch = entry.message.toLowerCase().includes(searchQuery.toLowerCase());\n                    return matchesFilter && matchesSearch;\n                });\n\n                if (filtered.length === 0) {\n                    logTbody.innerHTML = `<tr><td colspan=\"3\" style=\"text-align: center; color: var(--gla-text-muted); padding: 40px;\">No matching log entries found.<\/td><\/tr>`;\n                    return;\n                }\n\n                let html = '';\n                filtered.forEach(entry => {\n                    let badgeClass = 'gla-badge-info';\n                    if (entry.level === 'ERROR') badgeClass = 'gla-badge-error';\n                    if (entry.level === 'WARNING') badgeClass = 'gla-badge-warning';\n\n                    html += `\n                        <tr>\n                            <td><span class=\"gla-badge ${badgeClass}\">${entry.level}<\/span><\/td>\n                            <td style=\"color: var(--gla-text-muted);\">${entry.timestamp}<\/td>\n                            <td style=\"word-break: break-all;\">${escapeHtml(entry.message)}<\/td>\n                        <\/tr>\n                    `;\n                });\n                logTbody.innerHTML = html;\n            }\n\n            function escapeHtml(text) {\n                return text.replace(\/&\/g, \"&amp;\").replace(\/<\/g, \"&lt;\").replace(\/>\/g, \"&gt;\");\n            }\n\n            searchInput.addEventListener('input', (e) => {\n                searchQuery = e.target.value;\n                renderLogTable();\n            });\n\n            filterBtns.forEach(btn => {\n                btn.addEventListener('click', () => {\n                    filterBtns.forEach(b => b.classList.remove('active'));\n                    btn.classList.add('active');\n                    currentFilter = btn.getAttribute('data-filter');\n                    renderLogTable();\n                });\n            });\n\n            function getTableLogData() {\n                const rows = document.querySelectorAll('#gla-log-tbody tr');\n                const data = [];\n                rows.forEach(row => {\n                    if (row.cells.length < 3) return;\n                    const level = row.cells[0].textContent.trim();\n                    const timestamp = row.cells[1].textContent.trim();\n                    const message = row.cells[2].textContent.trim();\n                    data.push({ level, timestamp, message });\n                });\n                return data;\n            }\n\n            function downloadFile(content, filename, contentType) {\n                const blob = new Blob([content], { type: contentType });\n                const url = URL.createObjectURL(blob);\n                const a = document.createElement('a');\n                a.href = url;\n                a.download = filename;\n                document.body.appendChild(a);\n                a.click();\n                document.body.removeChild(a);\n                URL.revokeObjectURL(url);\n            }\n\n            exportTxtBtn.addEventListener('click', () => {\n                const data = getTableLogData();\n                if (data.length === 0 || (data.length === 1 && data[0].message.includes('No matching'))) {\n                    alert('No log data available to export.');\n                    return;\n                }\n                let txt = \"=== GAME LOG ANALYZER REPORT ===\\nGenerated: \" + new Date().toLocaleString() + \"\\n\\n\";\n                data.forEach((item) => {\n                    txt += `[${item.level}] (${item.timestamp}) ${item.message}\\n`;\n                });\n                downloadFile(txt, 'game_log_report.txt', 'text\/plain');\n                statusText.textContent = 'TXT log report exported successfully.';\n            });\n\n            exportCsvBtn.addEventListener('click', () => {\n                const data = getTableLogData();\n                if (data.length === 0 || (data.length === 1 && data[0].message.includes('No matching'))) {\n                    alert('No log data available to export.');\n                    return;\n                }\n                let csv = \"SeverityLevel,TimestampOrLine,MessageDetails\\n\";\n                data.forEach(item => {\n                    const cleanMsg = `\"${item.message.replace(\/\"\/g, '\"\"')}\"`;\n                    csv += `\"${item.level}\",\"${item.timestamp}\",${cleanMsg}\\n`;\n                });\n                downloadFile(csv, 'game_log_breakdown.csv', 'text\/csv');\n                statusText.textContent = 'CSV log breakdown exported successfully.';\n            });\n\n            extractErrorsBtn.addEventListener('click', () => {\n                const errorFilterBtn = document.querySelector('.gla-filter-btn[data-filter=\"ERROR\"]');\n                if (errorFilterBtn) {\n                    errorFilterBtn.click();\n                    statusText.textContent = 'Filtered view updated to isolate critical exceptions and errors.';\n                }\n            });\n\n            printReportBtn.addEventListener('click', () => {\n                window.print();\n                statusText.textContent = 'Print diagnostics dialog triggered.';\n            });\n\n            window.addEventListener('error', (event) => {\n                if (event.filename && event.filename.includes('game-log-analyzer')) {\n                    console.warn(\"Caught handled component warning:\", event.message);\n                }\n            });\n        })();\n    <\/script>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u26a1 Game Log Analyzer Pro Parse, filter, inspect engine error stacks, and export game debugging diagnostics securely client-side. \ud83c\udf13 Toggle Theme \ud83d\udcc4 Drag &#038; Drop log file (.log, .txt) here or browse \ud83d\udcc1 Browse Log File \u270f\ufe0f Or Paste Log Text Directly: \ud83d\udd0d Analyze Log Text 0 Total Entries 0 Errors \/ Fatals 0 Warnings [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-850","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/pages\/850","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/comments?post=850"}],"version-history":[{"count":6,"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/pages\/850\/revisions"}],"predecessor-version":[{"id":859,"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/pages\/850\/revisions\/859"}],"wp:attachment":[{"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/media?parent=850"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}