Showing source for: https://tools.hoop.fi/account
Duration: 0.437047s
Server: nginx

<!doctype html>
<html lang="fi" data-coreui-theme="light">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta name="robots" content="noindex, nofollow, noarchive">
        <meta name="turbo-visit-control" content="disable">
                    <meta name="author" content="Hoop">
                            <meta name="description" content="Company-aware tools for collaborative brand development.">
                            <meta name="keywords" content="Hoop,Tools,Brändi">
                <title>Käyttäjätili · Hoop Tools</title>
                <link
    href="https://tools.hoop.fi/themes/hoop-coreui/assets/css/icons.css"
    rel="stylesheet">
<link
    href="https://tools.hoop.fi/themes/hoop-coreui/assets/css/theme.css?v=1.9.17"
    rel="stylesheet">
            <script id="browser-logger-active">
(function() {
    const ENDPOINT = 'https://tools.hoop.fi/_boost/browser-logs';
    const logQueue = [];
    let flushTimeout = null;
    const captureTypes = ["error","warning","info","log","debug","table"];

    console.log('🔍 Browser logger active (MCP server detected). Posting to: ' + ENDPOINT);

    // Store original console methods
    const originalConsole = {
        log: console.log,
        debug: console.debug,
        info: console.info,
        error: console.error,
        warn: console.warn,
        table: console.table
    };

    // Walk own enumerable keys so JSON.stringify cannot auto-invoke a proxy fake toJSON (e.g. Livewire's `$wire`) and fire a real request.
    function toSafeValue(value, seen) {
        if (value === null || typeof value !== 'object') {
            return value;
        }
        if (value instanceof Error) {
            return { name: value.name, message: value.message, stack: value.stack };
        }
        // Date has no own enumerable keys, so the walk below would collapse it to {}.
        if (value instanceof Date) {
            return value.toISOString();
        }
        if (seen.has(value)) {
            return '[Circular]';
        }
        seen.add(value);
        if (Array.isArray(value)) {
            return value.map((item) => toSafeValue(item, seen));
        }
        const plain = {};
        for (const key of Object.keys(value)) {
            if (key === 'toJSON') continue;
            try {
                plain[key] = toSafeValue(value[key], seen);
            } catch (e) {
                plain[key] = '[Unreadable]';
            }
        }
        return plain;
    }

    // Helper to safely stringify values
    function safeStringify(obj) {
        return JSON.stringify(toSafeValue(obj, new WeakSet()));
    }

    // Normalize log type for consistency (e.g., 'warn' to 'warning')
    function normalizeType(type) {
        return type === 'warn' ? 'warning' : type;
    }

    // Determine if a log type should be captured based on configured levels
    function shouldCapture(type) {
        return captureTypes.includes(normalizeType(type));
    }

    // Batch and send logs
    function flushLogs() {
        if (logQueue.length === 0) return;

        const batch = logQueue.splice(0, logQueue.length);

        fetch(ENDPOINT, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'X-Requested-With': 'XMLHttpRequest'
            },
            body: JSON.stringify({ logs: batch })
        }).catch(err => {
            // Silently fail to avoid infinite loops
            originalConsole.error('Failed to send logs:', err);
        });
    }

    // Debounced flush (100ms)
    function scheduleFlush() {
        if (flushTimeout) clearTimeout(flushTimeout);
        flushTimeout = setTimeout(flushLogs, 100);
    }

    // Intercept console methods
    ['log', 'debug', 'info', 'error', 'warn', 'table'].forEach(method => {
        console[method] = function(...args) {
            // Call original method
            originalConsole[method].apply(console, args);

            // Capture log data
            try {
                if (!shouldCapture(method)) {
                    return;
                }

                logQueue.push({
                    type: method,
                    timestamp: new Date().toISOString(),
                    data: args.map(arg => {
                        try {
                            return typeof arg === 'object' ? JSON.parse(safeStringify(arg)) : arg;
                        } catch (e) {
                            return String(arg);
                        }
                    }),
                    url: window.location.href,
                    userAgent: navigator.userAgent
                });

                scheduleFlush();
            } catch (e) {
                // Fail silently
            }
        };
    });

    // Global error handlers for uncaught errors
    const originalOnError = window.onerror;
    window.onerror = function boostErrorHandler(errorMsg, url, lineNumber, colNumber, error) {
        try {
            if (shouldCapture('error')) {
                logQueue.push({
                    type: 'uncaught_error',
                    timestamp: new Date().toISOString(),
                    data: [{
                        message: errorMsg,
                        filename: url,
                        lineno: lineNumber,
                        colno: colNumber,
                        error: error ? {
                            name: error.name,
                            message: error.message,
                            stack: error.stack
                        } : null
                    }],
                    url: window.location.href,
                    userAgent: navigator.userAgent
                });

                scheduleFlush();
            }

        } catch (e) {
            // Fail silently
        }

        // Call original handler if it exists
        if (originalOnError && typeof originalOnError === 'function') {
            return originalOnError(errorMsg, url, lineNumber, colNumber, error);
        }

        // Let the error continue to propagate
        return false;
    }
    window.addEventListener('error', (event) => {
        try {
            if (!shouldCapture('error')) {
                return false;
            }

            logQueue.push({
                type: 'window_error',
                timestamp: new Date().toISOString(),
                data: [{
                    message: event.message,
                    filename: event.filename,
                    lineno: event.lineno,
                    colno: event.colno,
                    error: event.error ? {
                        name: event.error.name,
                        message: event.error.message,
                        stack: event.error.stack
                    } : null
                }],
                url: window.location.href,
                userAgent: navigator.userAgent
            });

            scheduleFlush();
        } catch (e) {
            // Fail silently
        }

        // Let the error continue to propagate
        return false;
    });
    window.addEventListener('unhandledrejection', (event) => {
        try {
            if (!shouldCapture('error')) {
                return false;
            }

            logQueue.push({
                type: 'error',
                timestamp: new Date().toISOString(),
                data: [{
                    message: 'Unhandled Promise Rejection',
                    reason: toSafeValue(event.reason, new WeakSet())
                }],
                url: window.location.href,
                userAgent: navigator.userAgent
            });

            scheduleFlush();
        } catch (e) {
            // Fail silently
        }

        // Let the rejection continue to propagate
        return false;
    });

    // Flush on page unload
    window.addEventListener('beforeunload', () => {
        if (logQueue.length > 0) {
            navigator.sendBeacon(ENDPOINT, JSON.stringify({ logs: logQueue }));
        }
    });
})();
</script>
</head>
    <body
        class="bg-body-tertiary page-user-account layout-platform"
        data-platform-access-recovery-url="https://tools.hoop.fi/platform/entry"
        data-platform-account-url="https://tools.hoop.fi/account"
        data-platform-access-changed-message="Käyttöoikeutesi ovat muuttuneet. Sinut siirrettiin käytettävissä olevaan näkymään."
        data-platform-session-expired-message="Istuntosi on vanhentunut. Kirjaudu uudelleen sisään.">
                    <div class="d-flex flex-column min-vh-100">
                
<header class="header platform-header sticky-top border-bottom bg-body">
    <div class="container-fluid px-3 px-lg-4">
                    <a class="header-brand fw-semibold text-decoration-none" href="https://tools.hoop.fi/account">
                                    Hoop Tools
                            </a>
        
                    <a class="btn btn-sm btn-primary ms-auto" href="https://tools.hoop.fi/account">
                <i class="cil-account-logout me-1" aria-hidden="true"></i>
                Kirjaudu sisään
            </a>
            </div>
</header>                <div
    id="platform-runtime-alerts"
    class="container-fluid px-3 px-lg-4 pt-3"
    aria-live="polite"
    aria-atomic="true"></div>                
                <main id="platform-content" class="platform-main flex-grow-1 py-4" role="main">
                        <div class="container-fluid px-3 px-lg-4">
        <div class="d-flex justify-content-center py-4 py-lg-5">
            <div class="platform-auth">
                    <div class="collapse show login-collapse">
        <form method="post" data-request="onLogin" data-request-flash>
            <input type="hidden" name="redirect" value="https://tools.hoop.fi/platform/entry">

            <div class="text-center pb-3">
                <h1 class="h2 mb-2">Kirjaudu sisään</h1>
                <p class="text-body-secondary mb-0">Käytä käyttäjätiliäsi.</p>
            </div>

                            <div class="form-floating my-3">
                    <input
                        name="email"
                        type="email"
                        class="form-control"
                        id="platformLoginEmail"
                        placeholder="[email protected]"
                        autocomplete="email"
                        oninput="document.getElementById('platformRecoverEmail').value = this.value">
                    <label for="platformLoginEmail">Sähköpostiosoite</label>
                </div>
            
            <div class="form-floating my-3">
                <input
                    name="password"
                    type="password"
                    class="form-control"
                    id="platformLoginPassword"
                    placeholder="Salasana"
                    autocomplete="current-password">
                <label for="platformLoginPassword">Salasana</label>
            </div>

            <button class="btn btn-primary w-100" data-attach-loading type="submit">Kirjaudu sisään</button>

                            <div class="form-check mt-3">
                    <input name="remember" type="checkbox" class="form-check-input" id="platformLoginRemember" checked>
                    <label class="form-check-label" for="platformLoginRemember">Muista minut</label>
                </div>
                    </form>

                    <p class="text-center mt-4 mb-0">
                <a href="javascript:;" data-coreui-toggle="collapse" data-coreui-target=".login-collapse">Palauta salasana</a>
            </p>
            </div>

    <div class="collapse login-collapse">
        <form method="post" data-request="onRecoverPassword" data-request-flash>
            <input type="hidden" name="redirect" value="true">

            <div class="text-center pb-3">
                <h1 class="h2 mb-2">Palauta salasana</h1>
                <p class="text-body-secondary mb-0">Anna käyttäjätilisi sähköpostiosoite.</p>
            </div>

            <div class="form-floating my-3">
                <input
                    name="email"
                    type="email"
                    class="form-control"
                    id="platformRecoverEmail"
                    placeholder="[email protected]"
                    autocomplete="email">
                <label for="platformRecoverEmail">Sähköpostiosoite</label>
            </div>

            <button class="btn btn-primary w-100" data-attach-loading type="submit">Lähetä palautusviesti</button>
        </form>

        <p class="text-center mt-4 mb-0">
            <a href="javascript:;" data-coreui-toggle="collapse" data-coreui-target=".login-collapse">Takaisin kirjautumiseen</a>
        </p>
    </div>

            </div>
        </div>
    </div>
                </main>

                <footer class="platform-footer border-top bg-body py-3 mt-auto">
    <div class="container-fluid px-4">
        <a
            class="platform-footer-brand small text-body-secondary text-decoration-none"
            href="https://tools.hoop.fi"
            target="_blank"
            rel="noopener noreferrer">
                            <span>Palvelun moottorina</span>
                <span class="fw-semibold">Hoop Tools</span>
                    </a>
    </div>
</footer>            </div>
        
        <script src="/modules/system/assets/js/framework-bundle.js"></script>
<link rel="stylesheet" property="stylesheet" href="/modules/system/assets/css/framework-extras.css">
<script src="https://tools.hoop.fi/themes/hoop-coreui/assets/js/coreui.bundle.min.js"></script>
<script src="https://tools.hoop.fi/themes/hoop-coreui/assets/js/platform-access.js"></script>
<script src="https://tools.hoop.fi/themes/hoop-coreui/assets/js/tooltips.js?v=1.9.16"></script>
<script src="https://tools.hoop.fi/themes/hoop-coreui/assets/js/platform-stepper.js?v=1.9.9"></script>
<script src="https://tools.hoop.fi/themes/hoop-coreui/assets/js/platform-journey-sortable.js?v=1.9.11"></script>
<script src="https://tools.hoop.fi/themes/hoop-coreui/assets/js/platform-selection-limit.js?v=1.1.4"></script>
<script src="https://tools.hoop.fi/themes/hoop-coreui/assets/js/platform-action-channel-prefill.js?v=1.0.1"></script>
<script src="https://tools.hoop.fi/themes/hoop-coreui/assets/js/platform-rich-text-editor.js?v=1.0.0"></script>
<script src="https://tools.hoop.fi/themes/hoop-coreui/assets/js/platform-journey-autosave.js?v=1.0.0"></script>    </body>
</html>

Latest requests

# Url Url Source Date
1 https://tools.hoop.fi/account 2026-10-18 06:50:05
2 https://www.thebolditalic.com/?gi=… 2026-10-18 06:50:05
3 https://www.texarkanatwins.com/%25… 2026-10-18 06:50:05
4 https://www.thebolditalic.com/?gi=… 2026-10-18 06:50:04
5 https://www.texarkanatwins.com/%25… 2026-10-18 06:50:04
6 https://www.texarkanatwins.com/%25… 2026-10-18 06:50:04
7 https://www.thebolditalic.com/?gi=… 2026-10-18 06:50:03
8 https://www.texarkanatwins.com/%25… 2026-10-18 06:50:03
9 https://www.texarkanatwins.com/%25… 2026-10-18 06:50:02
10 https://www.thebolditalic.com/?gi=… 2026-10-18 06:50:02
11 https://www.texarkanatwins.com/%25… 2026-10-18 06:50:02
12 https://www.texarkanatwins.com/%25… 2026-10-18 06:50:01
13 https://www.thebolditalic.com/?gi=… 2026-10-18 06:50:01
14 https://www.texarkanatwins.com/%25… 2026-10-18 06:50:00
15 https://www.texarkanatwins.com/%25… 2026-10-18 06:50:00
16 https://tendoncare5.b-cdn.net/rese… 2026-10-18 06:50:00
17 https://www.texarkanatwins.com/%25… 2026-10-18 06:50:00
18 https://www.texarkanatwins.com/%25… 2026-10-18 06:49:59
19 https://www.texarkanatwins.com/%25… 2026-10-18 06:49:59
20 https://www.thebolditalic.com/?gi=… 2026-10-18 06:49:58