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>
| # |
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 |